]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/commitdiff
Merge branch 'akpm' (second patchbomb from Andrew Morton)
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 8 Aug 2014 22:57:47 +0000 (15:57 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 8 Aug 2014 22:57:47 +0000 (15:57 -0700)
Merge more incoming from Andrew Morton:
 "Two new syscalls:

     memfd_create in "shm: add memfd_create() syscall"
     kexec_file_load in "kexec: implementation of new syscall kexec_file_load"

  And:

   - Most (all?) of the rest of MM

   - Lots of the usual misc bits

   - fs/autofs4

   - drivers/rtc

   - fs/nilfs

   - procfs

   - fork.c, exec.c

   - more in lib/

   - rapidio

   - Janitorial work in filesystems: fs/ufs, fs/reiserfs, fs/adfs,
     fs/cramfs, fs/romfs, fs/qnx6.

   - initrd/initramfs work

   - "file sealing" and the memfd_create() syscall, in tmpfs

   - add pci_zalloc_consistent, use it in lots of places

   - MAINTAINERS maintenance

   - kexec feature work"

* emailed patches from Andrew Morton <akpm@linux-foundation.org: (193 commits)
  MAINTAINERS: update nomadik patterns
  MAINTAINERS: update usb/gadget patterns
  MAINTAINERS: update DMA BUFFER SHARING patterns
  kexec: verify the signature of signed PE bzImage
  kexec: support kexec/kdump on EFI systems
  kexec: support for kexec on panic using new system call
  kexec-bzImage64: support for loading bzImage using 64bit entry
  kexec: load and relocate purgatory at kernel load time
  purgatory: core purgatory functionality
  purgatory/sha256: provide implementation of sha256 in purgaotory context
  kexec: implementation of new syscall kexec_file_load
  kexec: new syscall kexec_file_load() declaration
  kexec: make kexec_segment user buffer pointer a union
  resource: provide new functions to walk through resources
  kexec: use common function for kimage_normal_alloc() and kimage_crash_alloc()
  kexec: move segment verification code in a separate function
  kexec: rename unusebale_pages to unusable_pages
  kernel: build bin2c based on config option CONFIG_BUILD_BIN2C
  bin2c: move bin2c in scripts/basic
  shm: wait for pins to be released when sealing
  ...

1765 files changed:
Documentation/ABI/testing/sysfs-class-leds-gt683r [new file with mode: 0644]
Documentation/ABI/testing/sysfs-driver-pciback [new file with mode: 0644]
Documentation/ABI/testing/sysfs-driver-tegra-fuse [new file with mode: 0644]
Documentation/DocBook/drm.tmpl
Documentation/arm/CCN.txt [new file with mode: 0644]
Documentation/arm/Marvell/README
Documentation/arm/Samsung/Overview.txt
Documentation/arm/Samsung/clksrc-change-registers.awk
Documentation/arm64/booting.txt
Documentation/devicetree/bindings/arm/adapteva.txt [new file with mode: 0644]
Documentation/devicetree/bindings/arm/arm-boards
Documentation/devicetree/bindings/arm/armada-380-mpcore-soc-ctrl.txt [new file with mode: 0644]
Documentation/devicetree/bindings/arm/atmel-pmc.txt
Documentation/devicetree/bindings/arm/bcm/brcm,bcm11351-cpu-method [new file with mode: 0644]
Documentation/devicetree/bindings/arm/brcm-brcmstb.txt [new file with mode: 0644]
Documentation/devicetree/bindings/arm/ccn.txt [new file with mode: 0644]
Documentation/devicetree/bindings/arm/cpu-enable-method/marvell,berlin-smp [new file with mode: 0644]
Documentation/devicetree/bindings/arm/cpus.txt
Documentation/devicetree/bindings/arm/gic-v3.txt [new file with mode: 0644]
Documentation/devicetree/bindings/arm/gic.txt
Documentation/devicetree/bindings/arm/hisilicon/hisilicon.txt
Documentation/devicetree/bindings/arm/marvell,berlin.txt
Documentation/devicetree/bindings/arm/mediatek.txt [new file with mode: 0644]
Documentation/devicetree/bindings/arm/omap/omap.txt
Documentation/devicetree/bindings/arm/omap/prcm.txt [new file with mode: 0644]
Documentation/devicetree/bindings/arm/samsung/pmu.txt
Documentation/devicetree/bindings/arm/spear-misc.txt [new file with mode: 0644]
Documentation/devicetree/bindings/arm/tegra.txt
Documentation/devicetree/bindings/arm/xilinx.txt
Documentation/devicetree/bindings/clock/arm-integrator.txt
Documentation/devicetree/bindings/clock/clk-s5pv210-audss.txt [new file with mode: 0644]
Documentation/devicetree/bindings/clock/imx1-clock.txt [new file with mode: 0644]
Documentation/devicetree/bindings/clock/imx21-clock.txt [new file with mode: 0644]
Documentation/devicetree/bindings/clock/imx27-clock.txt
Documentation/devicetree/bindings/clock/imx6q-clock.txt
Documentation/devicetree/bindings/clock/mvebu-cpu-clock.txt
Documentation/devicetree/bindings/clock/samsung,s5pv210-clock.txt [new file with mode: 0644]
Documentation/devicetree/bindings/drm/armada/marvell,dove-lcd.txt [new file with mode: 0644]
Documentation/devicetree/bindings/drm/i2c/tda998x.txt
Documentation/devicetree/bindings/drm/msm/gpu.txt [new file with mode: 0644]
Documentation/devicetree/bindings/drm/msm/hdmi.txt [new file with mode: 0644]
Documentation/devicetree/bindings/drm/msm/mdp.txt [new file with mode: 0644]
Documentation/devicetree/bindings/fuse/nvidia,tegra20-fuse.txt [new file with mode: 0644]
Documentation/devicetree/bindings/gpu/nvidia,gk20a.txt [new file with mode: 0644]
Documentation/devicetree/bindings/gpu/st,stih4xx.txt [new file with mode: 0644]
Documentation/devicetree/bindings/leds/pca963x.txt
Documentation/devicetree/bindings/leds/tca6507.txt
Documentation/devicetree/bindings/mfd/arizona.txt
Documentation/devicetree/bindings/mfd/as3722.txt
Documentation/devicetree/bindings/mfd/s2mps11.txt
Documentation/devicetree/bindings/mfd/sun6i-prcm.txt
Documentation/devicetree/bindings/misc/nvidia,tegra20-apbmisc.txt [new file with mode: 0644]
Documentation/devicetree/bindings/panel/auo,b133htn01.txt [new file with mode: 0644]
Documentation/devicetree/bindings/panel/foxlink,fl500wvr00-a0t.txt [new file with mode: 0644]
Documentation/devicetree/bindings/panel/innolux,n116bge.txt [new file with mode: 0644]
Documentation/devicetree/bindings/panel/innolux,n156bge-l21.txt [new file with mode: 0644]
Documentation/devicetree/bindings/pci/nvidia,tegra20-pcie.txt
Documentation/devicetree/bindings/pci/spear13xx-pcie.txt [new file with mode: 0644]
Documentation/devicetree/bindings/phy/samsung-phy.txt
Documentation/devicetree/bindings/phy/st-spear-miphy.txt [new file with mode: 0644]
Documentation/devicetree/bindings/pinctrl/allwinner,sunxi-pinctrl.txt
Documentation/devicetree/bindings/pinctrl/nvidia,tegra124-xusb-padctl.txt [new file with mode: 0644]
Documentation/devicetree/bindings/pinctrl/qcom,apq8064-pinctrl.txt
Documentation/devicetree/bindings/pinctrl/qcom,ipq8064-pinctrl.txt
Documentation/devicetree/bindings/pinctrl/qcom,msm8960-pinctrl.txt [new file with mode: 0644]
Documentation/devicetree/bindings/pinctrl/qcom,msm8974-pinctrl.txt
Documentation/devicetree/bindings/pinctrl/renesas,pfc-pinctrl.txt
Documentation/devicetree/bindings/pinctrl/rockchip,pinctrl.txt
Documentation/devicetree/bindings/pinctrl/samsung-pinctrl.txt
Documentation/devicetree/bindings/regulator/s5m8767-regulator.txt
Documentation/devicetree/bindings/serial/cdns,uart.txt [new file with mode: 0644]
Documentation/devicetree/bindings/spi/spi-samsung.txt
Documentation/devicetree/bindings/vendor-prefixes.txt
Documentation/devicetree/bindings/video/exynos_dsim.txt
Documentation/devicetree/bindings/video/exynos_mixer.txt
Documentation/devicetree/bindings/video/samsung-fimd.txt
Documentation/kernel-parameters.txt
Documentation/powerpc/00-INDEX
Documentation/powerpc/kvm_440.txt [deleted file]
Documentation/virtual/kvm/api.txt
MAINTAINERS
arch/arm/Kconfig
arch/arm/Kconfig.debug
arch/arm/Makefile
arch/arm/boot/dts/Makefile
arch/arm/boot/dts/aks-cdu.dts
arch/arm/boot/dts/am335x-evmsk.dts
arch/arm/boot/dts/am335x-pepper.dts [new file with mode: 0644]
arch/arm/boot/dts/am33xx.dtsi
arch/arm/boot/dts/am4372.dtsi
arch/arm/boot/dts/am437x-gp-evm.dts
arch/arm/boot/dts/am437x-sk-evm.dts [new file with mode: 0644]
arch/arm/boot/dts/am43x-epos-evm.dts
arch/arm/boot/dts/animeo_ip.dts
arch/arm/boot/dts/armada-375-db.dts
arch/arm/boot/dts/armada-375.dtsi
arch/arm/boot/dts/armada-38x.dtsi
arch/arm/boot/dts/armada-xp-lenovo-ix4-300d.dts [new file with mode: 0644]
arch/arm/boot/dts/armada-xp-mv78230.dtsi
arch/arm/boot/dts/armada-xp-mv78260.dtsi
arch/arm/boot/dts/armada-xp-mv78460.dtsi
arch/arm/boot/dts/armada-xp.dtsi
arch/arm/boot/dts/at91-ariag25.dts
arch/arm/boot/dts/at91-cosino.dtsi
arch/arm/boot/dts/at91-foxg20.dts
arch/arm/boot/dts/at91-qil_a9260.dts
arch/arm/boot/dts/at91-sama5d3_xplained.dts
arch/arm/boot/dts/at91rm9200.dtsi
arch/arm/boot/dts/at91rm9200ek.dts
arch/arm/boot/dts/at91sam9260.dtsi
arch/arm/boot/dts/at91sam9261.dtsi
arch/arm/boot/dts/at91sam9261ek.dts
arch/arm/boot/dts/at91sam9263.dtsi
arch/arm/boot/dts/at91sam9263ek.dts
arch/arm/boot/dts/at91sam9g20.dtsi
arch/arm/boot/dts/at91sam9g20ek_common.dtsi
arch/arm/boot/dts/at91sam9g45.dtsi
arch/arm/boot/dts/at91sam9m10g45ek.dts
arch/arm/boot/dts/at91sam9n12.dtsi
arch/arm/boot/dts/at91sam9n12ek.dts
arch/arm/boot/dts/at91sam9rl.dtsi
arch/arm/boot/dts/at91sam9rlek.dts
arch/arm/boot/dts/at91sam9x5.dtsi
arch/arm/boot/dts/at91sam9x5cm.dtsi
arch/arm/boot/dts/bcm11351.dtsi
arch/arm/boot/dts/bcm21664.dtsi
arch/arm/boot/dts/bcm7445-bcm97445svmb.dts [new file with mode: 0644]
arch/arm/boot/dts/bcm7445.dtsi [new file with mode: 0644]
arch/arm/boot/dts/berlin2.dtsi
arch/arm/boot/dts/berlin2q-marvell-dmp.dts
arch/arm/boot/dts/berlin2q.dtsi
arch/arm/boot/dts/cros-ec-keyboard.dtsi [new file with mode: 0644]
arch/arm/boot/dts/dove-cubox-es.dts [new file with mode: 0644]
arch/arm/boot/dts/dove-cubox.dts
arch/arm/boot/dts/dove.dtsi
arch/arm/boot/dts/dra7-evm.dts
arch/arm/boot/dts/dra7.dtsi
arch/arm/boot/dts/dra7xx-clocks.dtsi
arch/arm/boot/dts/emev2.dtsi
arch/arm/boot/dts/ethernut5.dts
arch/arm/boot/dts/evk-pro3.dts
arch/arm/boot/dts/exynos3250.dtsi
arch/arm/boot/dts/exynos4.dtsi
arch/arm/boot/dts/exynos4210.dtsi
arch/arm/boot/dts/exynos4412-odroid-common.dtsi [new file with mode: 0644]
arch/arm/boot/dts/exynos4412-odroidu3.dts [new file with mode: 0644]
arch/arm/boot/dts/exynos4412-odroidx.dts
arch/arm/boot/dts/exynos4412-odroidx2.dts [new file with mode: 0644]
arch/arm/boot/dts/exynos4412.dtsi
arch/arm/boot/dts/exynos4x12.dtsi
arch/arm/boot/dts/exynos5.dtsi
arch/arm/boot/dts/exynos5250-cros-common.dtsi
arch/arm/boot/dts/exynos5250-smdk5250.dts
arch/arm/boot/dts/exynos5250-snow.dts
arch/arm/boot/dts/exynos5260.dtsi
arch/arm/boot/dts/exynos5410.dtsi
arch/arm/boot/dts/exynos5420-peach-pit.dts
arch/arm/boot/dts/exynos5420.dtsi
arch/arm/boot/dts/exynos5800-peach-pi.dts
arch/arm/boot/dts/ge863-pro3.dtsi
arch/arm/boot/dts/hi3620.dtsi
arch/arm/boot/dts/hisi-x5hd2-dkb.dts [new file with mode: 0644]
arch/arm/boot/dts/hisi-x5hd2.dtsi [new file with mode: 0644]
arch/arm/boot/dts/imx25-eukrea-mbimxsd25-baseboard-cmo-qvga.dts [new file with mode: 0644]
arch/arm/boot/dts/imx25-eukrea-mbimxsd25-baseboard-dvi-svga.dts [new file with mode: 0644]
arch/arm/boot/dts/imx25-eukrea-mbimxsd25-baseboard-dvi-vga.dts [new file with mode: 0644]
arch/arm/boot/dts/imx25-eukrea-mbimxsd25-baseboard.dts
arch/arm/boot/dts/imx25-pdk.dts
arch/arm/boot/dts/imx25.dtsi
arch/arm/boot/dts/imx27-eukrea-cpuimx27.dtsi [new file with mode: 0644]
arch/arm/boot/dts/imx27-eukrea-mbimxsd27-baseboard.dts [new file with mode: 0644]
arch/arm/boot/dts/imx27-pdk.dts
arch/arm/boot/dts/imx27-phytec-phycore-rdk.dts
arch/arm/boot/dts/imx27-phytec-phycore-som.dtsi
arch/arm/boot/dts/imx27-pinfunc.h
arch/arm/boot/dts/imx27.dtsi
arch/arm/boot/dts/imx28-cfa10036.dts
arch/arm/boot/dts/imx28-m28.dtsi [new file with mode: 0644]
arch/arm/boot/dts/imx28-m28evk.dts
arch/arm/boot/dts/imx35-eukrea-mbimxsd35-baseboard.dts
arch/arm/boot/dts/imx35.dtsi
arch/arm/boot/dts/imx50.dtsi
arch/arm/boot/dts/imx51-babbage.dts
arch/arm/boot/dts/imx51-eukrea-mbimxsd51-baseboard.dts
arch/arm/boot/dts/imx51.dtsi
arch/arm/boot/dts/imx53-m53.dtsi [new file with mode: 0644]
arch/arm/boot/dts/imx53-m53evk.dts
arch/arm/boot/dts/imx53-mba53.dts
arch/arm/boot/dts/imx53-qsb-common.dtsi
arch/arm/boot/dts/imx53-tx53.dtsi
arch/arm/boot/dts/imx53-voipac-bsb.dts
arch/arm/boot/dts/imx53.dtsi
arch/arm/boot/dts/imx6dl-aristainetos_4.dts [new file with mode: 0644]
arch/arm/boot/dts/imx6dl-aristainetos_7.dts [new file with mode: 0644]
arch/arm/boot/dts/imx6dl-gw51xx.dts
arch/arm/boot/dts/imx6dl-gw52xx.dts
arch/arm/boot/dts/imx6dl-gw53xx.dts
arch/arm/boot/dts/imx6dl-gw54xx.dts
arch/arm/boot/dts/imx6dl-rex-basic.dts [new file with mode: 0644]
arch/arm/boot/dts/imx6dl-riotboard.dts
arch/arm/boot/dts/imx6dl-tx6dl-comtft.dts [new file with mode: 0644]
arch/arm/boot/dts/imx6dl-tx6u-801x.dts [new file with mode: 0644]
arch/arm/boot/dts/imx6dl-tx6u-811x.dts [new file with mode: 0644]
arch/arm/boot/dts/imx6dl-wandboard-revb1.dts [new file with mode: 0644]
arch/arm/boot/dts/imx6dl-wandboard.dts
arch/arm/boot/dts/imx6dl.dtsi
arch/arm/boot/dts/imx6q-cubox-i.dts
arch/arm/boot/dts/imx6q-dmo-edmqmx6.dts
arch/arm/boot/dts/imx6q-gw51xx.dts
arch/arm/boot/dts/imx6q-gw52xx.dts
arch/arm/boot/dts/imx6q-gw53xx.dts
arch/arm/boot/dts/imx6q-gw5400-a.dts
arch/arm/boot/dts/imx6q-gw54xx.dts
arch/arm/boot/dts/imx6q-rex-pro.dts [new file with mode: 0644]
arch/arm/boot/dts/imx6q-tx6q-1010-comtft.dts [new file with mode: 0644]
arch/arm/boot/dts/imx6q-tx6q-1010.dts [new file with mode: 0644]
arch/arm/boot/dts/imx6q-tx6q-1020-comtft.dts [new file with mode: 0644]
arch/arm/boot/dts/imx6q-tx6q-1020.dts [new file with mode: 0644]
arch/arm/boot/dts/imx6q-tx6q-1110.dts [new file with mode: 0644]
arch/arm/boot/dts/imx6q-udoo.dts
arch/arm/boot/dts/imx6q-wandboard-revb1.dts [new file with mode: 0644]
arch/arm/boot/dts/imx6q-wandboard.dts
arch/arm/boot/dts/imx6q.dtsi
arch/arm/boot/dts/imx6qdl-aristainetos.dtsi [new file with mode: 0644]
arch/arm/boot/dts/imx6qdl-gw52xx.dtsi
arch/arm/boot/dts/imx6qdl-gw53xx.dtsi
arch/arm/boot/dts/imx6qdl-gw54xx.dtsi
arch/arm/boot/dts/imx6qdl-nitrogen6x.dtsi
arch/arm/boot/dts/imx6qdl-phytec-pfla02.dtsi
arch/arm/boot/dts/imx6qdl-rex.dtsi [new file with mode: 0644]
arch/arm/boot/dts/imx6qdl-sabrelite.dtsi
arch/arm/boot/dts/imx6qdl-sabresd.dtsi
arch/arm/boot/dts/imx6qdl-tx6.dtsi [new file with mode: 0644]
arch/arm/boot/dts/imx6qdl-wandboard-revb1.dtsi [new file with mode: 0644]
arch/arm/boot/dts/imx6qdl-wandboard-revc1.dtsi [new file with mode: 0644]
arch/arm/boot/dts/imx6qdl-wandboard.dtsi
arch/arm/boot/dts/imx6qdl.dtsi
arch/arm/boot/dts/imx6sl-evk.dts
arch/arm/boot/dts/imx6sl.dtsi
arch/arm/boot/dts/imx6sx-pinfunc.h [new file with mode: 0644]
arch/arm/boot/dts/imx6sx-sdb.dts [new file with mode: 0644]
arch/arm/boot/dts/imx6sx.dtsi [new file with mode: 0644]
arch/arm/boot/dts/integratorap.dts
arch/arm/boot/dts/k2e-clocks.dtsi
arch/arm/boot/dts/k2hk-clocks.dtsi
arch/arm/boot/dts/k2hk-evm.dts
arch/arm/boot/dts/k2l-clocks.dtsi
arch/arm/boot/dts/keystone-clocks.dtsi
arch/arm/boot/dts/keystone.dtsi
arch/arm/boot/dts/kirkwood-d2net.dts [new file with mode: 0644]
arch/arm/boot/dts/kirkwood-net2big.dts [new file with mode: 0644]
arch/arm/boot/dts/kirkwood-net5big.dts [new file with mode: 0644]
arch/arm/boot/dts/kirkwood-netxbig.dtsi [new file with mode: 0644]
arch/arm/boot/dts/kizbox.dts
arch/arm/boot/dts/mpa1600.dts
arch/arm/boot/dts/mt6589-aquaris5.dts [new file with mode: 0644]
arch/arm/boot/dts/mt6589.dtsi [new file with mode: 0644]
arch/arm/boot/dts/omap2420.dtsi
arch/arm/boot/dts/omap2430.dtsi
arch/arm/boot/dts/omap3.dtsi
arch/arm/boot/dts/omap4.dtsi
arch/arm/boot/dts/omap5-uevm.dts
arch/arm/boot/dts/omap5.dtsi
arch/arm/boot/dts/pm9g45.dts
arch/arm/boot/dts/r7s72100-genmai.dts
arch/arm/boot/dts/r7s72100.dtsi
arch/arm/boot/dts/r8a73a4-ape6evm-reference.dts
arch/arm/boot/dts/r8a73a4.dtsi
arch/arm/boot/dts/r8a7740-armadillo800eva-reference.dts
arch/arm/boot/dts/r8a7740.dtsi
arch/arm/boot/dts/r8a7778-bockw-reference.dts
arch/arm/boot/dts/r8a7778.dtsi
arch/arm/boot/dts/r8a7779-marzen-reference.dts [deleted file]
arch/arm/boot/dts/r8a7779-marzen.dts
arch/arm/boot/dts/r8a7779.dtsi
arch/arm/boot/dts/r8a7790-lager.dts
arch/arm/boot/dts/r8a7790.dtsi
arch/arm/boot/dts/r8a7791-henninger.dts
arch/arm/boot/dts/r8a7791-koelsch.dts
arch/arm/boot/dts/r8a7791.dtsi
arch/arm/boot/dts/rk3066a-bqcurie2.dts
arch/arm/boot/dts/rk3066a-clocks.dtsi [deleted file]
arch/arm/boot/dts/rk3066a.dtsi
arch/arm/boot/dts/rk3188-clocks.dtsi [deleted file]
arch/arm/boot/dts/rk3188-radxarock.dts
arch/arm/boot/dts/rk3188.dtsi
arch/arm/boot/dts/rk3288-evb-act8846.dts [new file with mode: 0644]
arch/arm/boot/dts/rk3288-evb-rk808.dts [new file with mode: 0644]
arch/arm/boot/dts/rk3288-evb.dtsi [new file with mode: 0644]
arch/arm/boot/dts/rk3288.dtsi [new file with mode: 0644]
arch/arm/boot/dts/rk3xxx.dtsi
arch/arm/boot/dts/s5pv210-aquila.dts [new file with mode: 0644]
arch/arm/boot/dts/s5pv210-goni.dts [new file with mode: 0644]
arch/arm/boot/dts/s5pv210-pinctrl.dtsi [new file with mode: 0644]
arch/arm/boot/dts/s5pv210-smdkc110.dts [new file with mode: 0644]
arch/arm/boot/dts/s5pv210-smdkv210.dts [new file with mode: 0644]
arch/arm/boot/dts/s5pv210-torbreck.dts [new file with mode: 0644]
arch/arm/boot/dts/s5pv210.dtsi [new file with mode: 0644]
arch/arm/boot/dts/sama5d3.dtsi
arch/arm/boot/dts/sama5d3xcm.dtsi
arch/arm/boot/dts/sama5d3xmb.dtsi
arch/arm/boot/dts/sh73a0-kzm9g-reference.dts
arch/arm/boot/dts/sh73a0.dtsi
arch/arm/boot/dts/socfpga.dtsi
arch/arm/boot/dts/spear1310-evb.dts
arch/arm/boot/dts/spear1310.dtsi
arch/arm/boot/dts/spear1340-evb.dts
arch/arm/boot/dts/spear1340.dtsi
arch/arm/boot/dts/spear13xx.dtsi
arch/arm/boot/dts/ste-dbx5x0.dtsi
arch/arm/boot/dts/ste-href-stuib.dtsi
arch/arm/boot/dts/ste-href-tvk1281618.dtsi
arch/arm/boot/dts/ste-hrefv60plus.dtsi
arch/arm/boot/dts/ste-snowball.dts
arch/arm/boot/dts/sun4i-a10-a1000.dts
arch/arm/boot/dts/sun4i-a10-ba10-tvbox.dts [new file with mode: 0644]
arch/arm/boot/dts/sun4i-a10-cubieboard.dts
arch/arm/boot/dts/sun4i-a10-hackberry.dts
arch/arm/boot/dts/sun4i-a10-inet97fv2.dts
arch/arm/boot/dts/sun4i-a10-mini-xplus.dts
arch/arm/boot/dts/sun4i-a10-olinuxino-lime.dts
arch/arm/boot/dts/sun4i-a10-pcduino.dts
arch/arm/boot/dts/sun4i-a10.dtsi
arch/arm/boot/dts/sun5i-a10s.dtsi
arch/arm/boot/dts/sun5i-a13.dtsi
arch/arm/boot/dts/sun6i-a31-hummingbird.dts [new file with mode: 0644]
arch/arm/boot/dts/sun6i-a31.dtsi
arch/arm/boot/dts/sun7i-a20-cubieboard2.dts
arch/arm/boot/dts/sun7i-a20-cubietruck.dts
arch/arm/boot/dts/sun7i-a20-i12-tvbox.dts
arch/arm/boot/dts/sun7i-a20-olinuxino-micro.dts
arch/arm/boot/dts/sun7i-a20-pcduino3.dts [new file with mode: 0644]
arch/arm/boot/dts/sun7i-a20.dtsi
arch/arm/boot/dts/sun8i-a23-ippo-q8h-v5.dts [new file with mode: 0644]
arch/arm/boot/dts/sun8i-a23.dtsi [new file with mode: 0644]
arch/arm/boot/dts/tegra114-roth.dts
arch/arm/boot/dts/tegra114.dtsi
arch/arm/boot/dts/tegra124-jetson-tk1.dts
arch/arm/boot/dts/tegra124-venice2.dts
arch/arm/boot/dts/tegra124.dtsi
arch/arm/boot/dts/tegra20-harmony.dts
arch/arm/boot/dts/tegra20-medcom-wide.dts
arch/arm/boot/dts/tegra20-paz00.dts
arch/arm/boot/dts/tegra20-plutux.dts
arch/arm/boot/dts/tegra20-tamonten.dtsi
arch/arm/boot/dts/tegra20-tec.dts
arch/arm/boot/dts/tegra20-trimslice.dts
arch/arm/boot/dts/tegra20.dtsi
arch/arm/boot/dts/tegra30-apalis-eval.dts [new file with mode: 0644]
arch/arm/boot/dts/tegra30-apalis.dtsi [new file with mode: 0644]
arch/arm/boot/dts/tegra30-beaver.dts
arch/arm/boot/dts/tegra30-cardhu.dtsi
arch/arm/boot/dts/tegra30.dtsi
arch/arm/boot/dts/tny_a9260_common.dtsi
arch/arm/boot/dts/tny_a9263.dts
arch/arm/boot/dts/usb_a9260_common.dtsi
arch/arm/boot/dts/usb_a9263.dts
arch/arm/boot/dts/versatile-ab.dts
arch/arm/boot/dts/versatile-pb.dts
arch/arm/boot/dts/vf610.dtsi
arch/arm/boot/dts/zynq-7000.dtsi
arch/arm/boot/dts/zynq-parallella.dts [new file with mode: 0644]
arch/arm/boot/dts/zynq-zc702.dts
arch/arm/common/timer-sp.c
arch/arm/configs/armadillo800eva_defconfig
arch/arm/configs/bcm_defconfig
arch/arm/configs/exynos_defconfig
arch/arm/configs/genmai_defconfig [deleted file]
arch/arm/configs/hi3xxx_defconfig
arch/arm/configs/imx_v4_v5_defconfig
arch/arm/configs/imx_v6_v7_defconfig
arch/arm/configs/kirkwood_defconfig [deleted file]
arch/arm/configs/multi_v5_defconfig
arch/arm/configs/multi_v7_defconfig
arch/arm/configs/mvebu_v5_defconfig
arch/arm/configs/mvebu_v7_defconfig
arch/arm/configs/mxs_defconfig
arch/arm/configs/omap1_defconfig
arch/arm/configs/omap2plus_defconfig
arch/arm/configs/s5p64x0_defconfig [deleted file]
arch/arm/configs/s5pc100_defconfig [deleted file]
arch/arm/configs/shmobile_defconfig
arch/arm/configs/socfpga_defconfig
arch/arm/configs/spear13xx_defconfig
arch/arm/configs/tegra_defconfig
arch/arm/include/asm/gpio.h
arch/arm/include/asm/kvm_asm.h
arch/arm/include/asm/kvm_emulate.h
arch/arm/include/asm/kvm_host.h
arch/arm/include/asm/kvm_mmu.h
arch/arm/include/debug/clps711x.S [new file with mode: 0644]
arch/arm/include/debug/s5pv210.S [new file with mode: 0644]
arch/arm/kernel/asm-offsets.c
arch/arm/kernel/hyp-stub.S
arch/arm/kvm/Kconfig
arch/arm/kvm/Makefile
arch/arm/kvm/arm.c
arch/arm/kvm/coproc.c
arch/arm/kvm/guest.c
arch/arm/kvm/init.S
arch/arm/kvm/interrupts.S
arch/arm/kvm/interrupts_head.S
arch/arm/kvm/mmu.c
arch/arm/lib/delay.c
arch/arm/mach-at91/Kconfig
arch/arm/mach-at91/at91rm9200.c
arch/arm/mach-at91/at91sam9260.c
arch/arm/mach-at91/at91sam9263.c
arch/arm/mach-at91/at91sam9263_devices.c
arch/arm/mach-at91/at91sam9g45.c
arch/arm/mach-at91/at91sam9g45_devices.c
arch/arm/mach-at91/at91sam9rl.c
arch/arm/mach-at91/at91sam9rl_devices.c
arch/arm/mach-at91/board-sam9263ek.c
arch/arm/mach-at91/board-sam9m10g45ek.c
arch/arm/mach-at91/board.h
arch/arm/mach-at91/leds.c
arch/arm/mach-bcm/Kconfig
arch/arm/mach-bcm/Makefile
arch/arm/mach-bcm/brcmstb.c [new file with mode: 0644]
arch/arm/mach-bcm/brcmstb.h [new file with mode: 0644]
arch/arm/mach-bcm/headsmp-brcmstb.S [new file with mode: 0644]
arch/arm/mach-bcm/kona_smp.c [new file with mode: 0644]
arch/arm/mach-bcm/platsmp-brcmstb.c [new file with mode: 0644]
arch/arm/mach-berlin/Kconfig
arch/arm/mach-berlin/Makefile
arch/arm/mach-berlin/headsmp.S [new file with mode: 0644]
arch/arm/mach-berlin/platsmp.c [new file with mode: 0644]
arch/arm/mach-clps711x/board-autcpu12.c
arch/arm/mach-clps711x/board-cdb89712.c
arch/arm/mach-clps711x/board-clep7312.c
arch/arm/mach-clps711x/board-edb7211.c
arch/arm/mach-clps711x/board-p720t.c
arch/arm/mach-clps711x/common.c
arch/arm/mach-clps711x/common.h
arch/arm/mach-clps711x/devices.c
arch/arm/mach-clps711x/include/mach/debug-macro.S [deleted file]
arch/arm/mach-clps711x/include/mach/hardware.h
arch/arm/mach-exynos/common.h
arch/arm/mach-exynos/exynos.c
arch/arm/mach-exynos/headsmp.S
arch/arm/mach-exynos/hotplug.c
arch/arm/mach-exynos/include/mach/map.h
arch/arm/mach-exynos/include/mach/memory.h
arch/arm/mach-exynos/mcpm-exynos.c
arch/arm/mach-exynos/platsmp.c
arch/arm/mach-exynos/pm.c
arch/arm/mach-exynos/pm_domains.c
arch/arm/mach-exynos/pmu.c
arch/arm/mach-exynos/regs-pmu.h
arch/arm/mach-exynos/regs-sys.h [new file with mode: 0644]
arch/arm/mach-hisi/Kconfig
arch/arm/mach-hisi/Makefile
arch/arm/mach-hisi/core.h
arch/arm/mach-hisi/headsmp.S [new file with mode: 0644]
arch/arm/mach-hisi/hisilicon.c
arch/arm/mach-hisi/hotplug.c
arch/arm/mach-hisi/platsmp.c
arch/arm/mach-imx/Kconfig
arch/arm/mach-imx/Makefile
arch/arm/mach-imx/clk-imx1.c
arch/arm/mach-imx/clk-imx21.c
arch/arm/mach-imx/clk-imx25.c
arch/arm/mach-imx/clk-imx27.c
arch/arm/mach-imx/clk-imx31.c
arch/arm/mach-imx/clk-imx35.c
arch/arm/mach-imx/clk-imx51-imx53.c
arch/arm/mach-imx/clk-imx6q.c
arch/arm/mach-imx/clk-imx6sl.c
arch/arm/mach-imx/clk-imx6sx.c
arch/arm/mach-imx/clk-vf610.c
arch/arm/mach-imx/clk.c
arch/arm/mach-imx/clk.h
arch/arm/mach-imx/common.h
arch/arm/mach-imx/cpu-imx5.c
arch/arm/mach-imx/cpu.c
arch/arm/mach-imx/cpuidle-imx6q.c
arch/arm/mach-imx/crm-regs-imx5.h [deleted file]
arch/arm/mach-imx/devices-imx51.h [deleted file]
arch/arm/mach-imx/devices/Kconfig
arch/arm/mach-imx/devices/Makefile
arch/arm/mach-imx/devices/devices-common.h
arch/arm/mach-imx/devices/platform-fec.c
arch/arm/mach-imx/devices/platform-fsl-usb2-udc.c
arch/arm/mach-imx/devices/platform-imx-i2c.c
arch/arm/mach-imx/devices/platform-imx-keypad.c
arch/arm/mach-imx/devices/platform-imx-ssi.c
arch/arm/mach-imx/devices/platform-imx-uart.c
arch/arm/mach-imx/devices/platform-imx2-wdt.c
arch/arm/mach-imx/devices/platform-imx_udc.c [deleted file]
arch/arm/mach-imx/devices/platform-mx1-camera.c [deleted file]
arch/arm/mach-imx/devices/platform-mxc-ehci.c
arch/arm/mach-imx/devices/platform-mxc_nand.c
arch/arm/mach-imx/devices/platform-mxc_rnga.c
arch/arm/mach-imx/devices/platform-pata_imx.c
arch/arm/mach-imx/devices/platform-sdhci-esdhc-imx.c
arch/arm/mach-imx/devices/platform-spi_imx.c
arch/arm/mach-imx/ehci-imx25.c
arch/arm/mach-imx/ehci-imx27.c
arch/arm/mach-imx/ehci-imx31.c
arch/arm/mach-imx/ehci-imx35.c
arch/arm/mach-imx/ehci-imx5.c [deleted file]
arch/arm/mach-imx/ehci.h [new file with mode: 0644]
arch/arm/mach-imx/gpc.c
arch/arm/mach-imx/hardware.h
arch/arm/mach-imx/imx25-dt.c
arch/arm/mach-imx/imx27-dt.c
arch/arm/mach-imx/imx31-dt.c
arch/arm/mach-imx/imx35-dt.c
arch/arm/mach-imx/imx51-dt.c [deleted file]
arch/arm/mach-imx/iomux-mx51.h [deleted file]
arch/arm/mach-imx/mach-armadillo5x0.c
arch/arm/mach-imx/mach-cpuimx27.c
arch/arm/mach-imx/mach-cpuimx35.c
arch/arm/mach-imx/mach-eukrea_cpuimx25.c
arch/arm/mach-imx/mach-imx27_visstrim_m10.c
arch/arm/mach-imx/mach-imx27ipcam.c [deleted file]
arch/arm/mach-imx/mach-imx27lite.c [deleted file]
arch/arm/mach-imx/mach-imx50.c
arch/arm/mach-imx/mach-imx51.c [new file with mode: 0644]
arch/arm/mach-imx/mach-imx53.c
arch/arm/mach-imx/mach-imx6q.c
arch/arm/mach-imx/mach-imx6sl.c
arch/arm/mach-imx/mach-imx6sx.c
arch/arm/mach-imx/mach-mx25_3ds.c
arch/arm/mach-imx/mach-mx27_3ds.c
arch/arm/mach-imx/mach-mx31_3ds.c
arch/arm/mach-imx/mach-mx31lilly.c
arch/arm/mach-imx/mach-mx31lite.c
arch/arm/mach-imx/mach-mx31moboard.c
arch/arm/mach-imx/mach-mx35_3ds.c
arch/arm/mach-imx/mach-pca100.c
arch/arm/mach-imx/mach-pcm037.c
arch/arm/mach-imx/mach-pcm038.c
arch/arm/mach-imx/mach-pcm043.c
arch/arm/mach-imx/mach-vf610.c
arch/arm/mach-imx/mach-vpr200.c
arch/arm/mach-imx/mm-imx5.c [deleted file]
arch/arm/mach-imx/mx1-camera-fiq-ksym.c [deleted file]
arch/arm/mach-imx/mx1-camera-fiq.S [deleted file]
arch/arm/mach-imx/mx31moboard-devboard.c
arch/arm/mach-imx/mx31moboard-marxbot.c
arch/arm/mach-imx/mx31moboard-smartbot.c
arch/arm/mach-imx/mx51.h [deleted file]
arch/arm/mach-imx/mx53.h [deleted file]
arch/arm/mach-imx/mxc.h
arch/arm/mach-imx/pm-imx5.c
arch/arm/mach-imx/pm-imx6.c
arch/arm/mach-imx/system.c
arch/arm/mach-imx/time.c
arch/arm/mach-imx/tzic.c
arch/arm/mach-integrator/Kconfig
arch/arm/mach-integrator/include/mach/memory.h [deleted file]
arch/arm/mach-integrator/integrator_ap.c
arch/arm/mach-integrator/integrator_cp.c
arch/arm/mach-kirkwood/Kconfig [deleted file]
arch/arm/mach-kirkwood/Makefile [deleted file]
arch/arm/mach-kirkwood/Makefile.boot [deleted file]
arch/arm/mach-kirkwood/board-dt.c [deleted file]
arch/arm/mach-kirkwood/common.c [deleted file]
arch/arm/mach-kirkwood/common.h [deleted file]
arch/arm/mach-kirkwood/d2net_v2-setup.c [deleted file]
arch/arm/mach-kirkwood/include/mach/bridge-regs.h [deleted file]
arch/arm/mach-kirkwood/include/mach/entry-macro.S [deleted file]
arch/arm/mach-kirkwood/include/mach/hardware.h [deleted file]
arch/arm/mach-kirkwood/include/mach/irqs.h [deleted file]
arch/arm/mach-kirkwood/include/mach/kirkwood.h [deleted file]
arch/arm/mach-kirkwood/include/mach/uncompress.h [deleted file]
arch/arm/mach-kirkwood/irq.c [deleted file]
arch/arm/mach-kirkwood/lacie_v2-common.c [deleted file]
arch/arm/mach-kirkwood/lacie_v2-common.h [deleted file]
arch/arm/mach-kirkwood/mpp.c [deleted file]
arch/arm/mach-kirkwood/mpp.h [deleted file]
arch/arm/mach-kirkwood/netxbig_v2-setup.c [deleted file]
arch/arm/mach-kirkwood/openrd-setup.c [deleted file]
arch/arm/mach-kirkwood/pcie.c [deleted file]
arch/arm/mach-kirkwood/pm.c [deleted file]
arch/arm/mach-kirkwood/pm.h [deleted file]
arch/arm/mach-kirkwood/rd88f6192-nas-setup.c [deleted file]
arch/arm/mach-kirkwood/rd88f6281-setup.c [deleted file]
arch/arm/mach-kirkwood/t5325-setup.c [deleted file]
arch/arm/mach-kirkwood/ts219-setup.c [deleted file]
arch/arm/mach-kirkwood/ts41x-setup.c [deleted file]
arch/arm/mach-kirkwood/tsx1x-common.c [deleted file]
arch/arm/mach-kirkwood/tsx1x-common.h [deleted file]
arch/arm/mach-mediatek/Kconfig [new file with mode: 0644]
arch/arm/mach-mediatek/Makefile [new file with mode: 0644]
arch/arm/mach-mediatek/mediatek.c [new file with mode: 0644]
arch/arm/mach-mmp/include/mach/mfp-pxa910.h
arch/arm/mach-mvebu/Kconfig
arch/arm/mach-mvebu/Makefile
arch/arm/mach-mvebu/armada-370-xp.h
arch/arm/mach-mvebu/board-v7.c
arch/arm/mach-mvebu/board.h
arch/arm/mach-mvebu/common.h
arch/arm/mach-mvebu/cpu-reset.c
arch/arm/mach-mvebu/headsmp-a9.S
arch/arm/mach-mvebu/hotplug.c [deleted file]
arch/arm/mach-mvebu/kirkwood.c
arch/arm/mach-mvebu/mvebu-soc-id.c
arch/arm/mach-mvebu/netxbig.c [new file with mode: 0644]
arch/arm/mach-mvebu/platsmp-a9.c
arch/arm/mach-mvebu/platsmp.c
arch/arm/mach-mvebu/pmsu.c
arch/arm/mach-mvebu/pmsu.h
arch/arm/mach-mvebu/pmsu_ll.S
arch/arm/mach-mvebu/system-controller.c
arch/arm/mach-omap1/ocpi.c
arch/arm/mach-omap2/Makefile
arch/arm/mach-omap2/cclock2420_data.c [deleted file]
arch/arm/mach-omap2/cclock2430_data.c [deleted file]
arch/arm/mach-omap2/clkt2xxx_osc.c [deleted file]
arch/arm/mach-omap2/clkt2xxx_sys.c [deleted file]
arch/arm/mach-omap2/clkt_dpll.c
arch/arm/mach-omap2/clkt_iclk.c
arch/arm/mach-omap2/clock.c
arch/arm/mach-omap2/clock.h
arch/arm/mach-omap2/clock2xxx.h
arch/arm/mach-omap2/cm-regbits-24xx.h
arch/arm/mach-omap2/cm2_7xx.h
arch/arm/mach-omap2/control.c
arch/arm/mach-omap2/control.h
arch/arm/mach-omap2/ctrl_module_core_44xx.h [deleted file]
arch/arm/mach-omap2/ctrl_module_pad_core_44xx.h [deleted file]
arch/arm/mach-omap2/ctrl_module_pad_wkup_44xx.h [deleted file]
arch/arm/mach-omap2/devices.c
arch/arm/mach-omap2/dma.c
arch/arm/mach-omap2/dpll3xxx.c
arch/arm/mach-omap2/dpll44xx.c
arch/arm/mach-omap2/gpmc-nand.c
arch/arm/mach-omap2/io.c
arch/arm/mach-omap2/omap_hwmod_2420_data.c
arch/arm/mach-omap2/omap_hwmod_2430_data.c
arch/arm/mach-omap2/omap_hwmod_2xxx_3xxx_interconnect_data.c
arch/arm/mach-omap2/omap_hwmod_2xxx_3xxx_ipblock_data.c
arch/arm/mach-omap2/omap_hwmod_33xx_43xx_interconnect_data.c
arch/arm/mach-omap2/omap_hwmod_43xx_data.c
arch/arm/mach-omap2/omap_hwmod_44xx_data.c
arch/arm/mach-omap2/omap_hwmod_7xx_data.c
arch/arm/mach-omap2/omap_hwmod_common_data.h
arch/arm/mach-omap2/omap_hwmod_common_ipblock_data.c [new file with mode: 0644]
arch/arm/mach-omap2/pm24xx.c
arch/arm/mach-omap2/pm34xx.c
arch/arm/mach-omap2/prcm43xx.h
arch/arm/mach-omap2/prm2xxx.c
arch/arm/mach-omap2/prm2xxx.h
arch/arm/mach-omap2/prm3xxx.c
arch/arm/mach-omap2/prm3xxx.h
arch/arm/mach-omap2/prm7xx.h
arch/arm/mach-omap2/prm_common.c
arch/arm/mach-omap2/usb-tusb6010.c
arch/arm/mach-pxa/corgi.c
arch/arm/mach-pxa/generic.c
arch/arm/mach-pxa/include/mach/hardware.h
arch/arm/mach-pxa/pxa25x.c
arch/arm/mach-pxa/pxa27x.c
arch/arm/mach-pxa/pxa3xx.c
arch/arm/mach-pxa/sleep.S
arch/arm/mach-realview/core.c
arch/arm/mach-rockchip/Kconfig
arch/arm/mach-rockchip/Makefile
arch/arm/mach-rockchip/platsmp.c
arch/arm/mach-rockchip/rockchip.c
arch/arm/mach-s3c24xx/common.c
arch/arm/mach-s3c24xx/iotiming-s3c2412.c
arch/arm/mach-s3c24xx/mach-h1940.c
arch/arm/mach-s3c24xx/mach-jive.c
arch/arm/mach-s3c24xx/mach-smdk2413.c
arch/arm/mach-s3c24xx/mach-smdk2416.c
arch/arm/mach-s3c24xx/mach-smdk2443.c
arch/arm/mach-s3c24xx/mach-vstms.c
arch/arm/mach-s3c24xx/s3c2410.c
arch/arm/mach-s3c24xx/s3c2412.c
arch/arm/mach-s3c24xx/s3c2442.c
arch/arm/mach-s3c24xx/s3c244x.c
arch/arm/mach-s3c64xx/mach-anw6410.c
arch/arm/mach-s3c64xx/mach-crag6410.c
arch/arm/mach-s3c64xx/mach-hmt.c
arch/arm/mach-s3c64xx/mach-ncp.c
arch/arm/mach-s3c64xx/mach-smartq.c
arch/arm/mach-s3c64xx/mach-smdk6400.c
arch/arm/mach-s3c64xx/mach-smdk6410.c
arch/arm/mach-s3c64xx/s3c6400.c
arch/arm/mach-s3c64xx/s3c6410.c
arch/arm/mach-s5p64x0/Kconfig [deleted file]
arch/arm/mach-s5p64x0/Makefile [deleted file]
arch/arm/mach-s5p64x0/Makefile.boot [deleted file]
arch/arm/mach-s5p64x0/clock-s5p6440.c [deleted file]
arch/arm/mach-s5p64x0/clock-s5p6450.c [deleted file]
arch/arm/mach-s5p64x0/clock.c [deleted file]
arch/arm/mach-s5p64x0/clock.h [deleted file]
arch/arm/mach-s5p64x0/common.c [deleted file]
arch/arm/mach-s5p64x0/common.h [deleted file]
arch/arm/mach-s5p64x0/dev-audio.c [deleted file]
arch/arm/mach-s5p64x0/dma.c [deleted file]
arch/arm/mach-s5p64x0/i2c.h [deleted file]
arch/arm/mach-s5p64x0/include/mach/debug-macro.S [deleted file]
arch/arm/mach-s5p64x0/include/mach/dma.h [deleted file]
arch/arm/mach-s5p64x0/include/mach/gpio.h [deleted file]
arch/arm/mach-s5p64x0/include/mach/hardware.h [deleted file]
arch/arm/mach-s5p64x0/include/mach/irqs.h [deleted file]
arch/arm/mach-s5p64x0/include/mach/map.h [deleted file]
arch/arm/mach-s5p64x0/include/mach/pm-core.h [deleted file]
arch/arm/mach-s5p64x0/include/mach/regs-clock.h [deleted file]
arch/arm/mach-s5p64x0/include/mach/regs-gpio.h [deleted file]
arch/arm/mach-s5p64x0/include/mach/regs-irq.h [deleted file]
arch/arm/mach-s5p64x0/irq-pm.c [deleted file]
arch/arm/mach-s5p64x0/mach-smdk6440.c [deleted file]
arch/arm/mach-s5p64x0/mach-smdk6450.c [deleted file]
arch/arm/mach-s5p64x0/pm.c [deleted file]
arch/arm/mach-s5p64x0/setup-fb-24bpp.c [deleted file]
arch/arm/mach-s5p64x0/setup-i2c0.c [deleted file]
arch/arm/mach-s5p64x0/setup-i2c1.c [deleted file]
arch/arm/mach-s5p64x0/setup-sdhci-gpio.c [deleted file]
arch/arm/mach-s5p64x0/setup-spi.c [deleted file]
arch/arm/mach-s5pc100/Kconfig [deleted file]
arch/arm/mach-s5pc100/Makefile [deleted file]
arch/arm/mach-s5pc100/Makefile.boot [deleted file]
arch/arm/mach-s5pc100/clock.c [deleted file]
arch/arm/mach-s5pc100/common.c [deleted file]
arch/arm/mach-s5pc100/common.h [deleted file]
arch/arm/mach-s5pc100/dev-audio.c [deleted file]
arch/arm/mach-s5pc100/dma.c [deleted file]
arch/arm/mach-s5pc100/include/mach/debug-macro.S [deleted file]
arch/arm/mach-s5pc100/include/mach/dma.h [deleted file]
arch/arm/mach-s5pc100/include/mach/entry-macro.S [deleted file]
arch/arm/mach-s5pc100/include/mach/gpio.h [deleted file]
arch/arm/mach-s5pc100/include/mach/hardware.h [deleted file]
arch/arm/mach-s5pc100/include/mach/irqs.h [deleted file]
arch/arm/mach-s5pc100/include/mach/map.h [deleted file]
arch/arm/mach-s5pc100/include/mach/regs-clock.h [deleted file]
arch/arm/mach-s5pc100/include/mach/regs-gpio.h [deleted file]
arch/arm/mach-s5pc100/include/mach/regs-irq.h [deleted file]
arch/arm/mach-s5pc100/mach-smdkc100.c [deleted file]
arch/arm/mach-s5pc100/setup-fb-24bpp.c [deleted file]
arch/arm/mach-s5pc100/setup-i2c0.c [deleted file]
arch/arm/mach-s5pc100/setup-i2c1.c [deleted file]
arch/arm/mach-s5pc100/setup-ide.c [deleted file]
arch/arm/mach-s5pc100/setup-keypad.c [deleted file]
arch/arm/mach-s5pc100/setup-sdhci-gpio.c [deleted file]
arch/arm/mach-s5pc100/setup-spi.c [deleted file]
arch/arm/mach-s5pv210/Kconfig
arch/arm/mach-s5pv210/Makefile
arch/arm/mach-s5pv210/Makefile.boot [deleted file]
arch/arm/mach-s5pv210/clock.c [deleted file]
arch/arm/mach-s5pv210/common.c [deleted file]
arch/arm/mach-s5pv210/common.h
arch/arm/mach-s5pv210/dev-audio.c [deleted file]
arch/arm/mach-s5pv210/dma.c [deleted file]
arch/arm/mach-s5pv210/include/mach/debug-macro.S [deleted file]
arch/arm/mach-s5pv210/include/mach/dma.h [deleted file]
arch/arm/mach-s5pv210/include/mach/gpio.h [deleted file]
arch/arm/mach-s5pv210/include/mach/hardware.h [deleted file]
arch/arm/mach-s5pv210/include/mach/irqs.h [deleted file]
arch/arm/mach-s5pv210/include/mach/map.h [deleted file]
arch/arm/mach-s5pv210/include/mach/memory.h [deleted file]
arch/arm/mach-s5pv210/include/mach/pm-core.h [deleted file]
arch/arm/mach-s5pv210/include/mach/regs-clock.h
arch/arm/mach-s5pv210/include/mach/regs-gpio.h [deleted file]
arch/arm/mach-s5pv210/include/mach/regs-irq.h [deleted file]
arch/arm/mach-s5pv210/mach-aquila.c [deleted file]
arch/arm/mach-s5pv210/mach-goni.c [deleted file]
arch/arm/mach-s5pv210/mach-smdkc110.c [deleted file]
arch/arm/mach-s5pv210/mach-smdkv210.c [deleted file]
arch/arm/mach-s5pv210/mach-torbreck.c [deleted file]
arch/arm/mach-s5pv210/pm.c
arch/arm/mach-s5pv210/s5pv210.c [new file with mode: 0644]
arch/arm/mach-s5pv210/setup-fb-24bpp.c [deleted file]
arch/arm/mach-s5pv210/setup-fimc.c [deleted file]
arch/arm/mach-s5pv210/setup-i2c0.c [deleted file]
arch/arm/mach-s5pv210/setup-i2c1.c [deleted file]
arch/arm/mach-s5pv210/setup-i2c2.c [deleted file]
arch/arm/mach-s5pv210/setup-ide.c [deleted file]
arch/arm/mach-s5pv210/setup-keypad.c [deleted file]
arch/arm/mach-s5pv210/setup-sdhci-gpio.c [deleted file]
arch/arm/mach-s5pv210/setup-spi.c [deleted file]
arch/arm/mach-s5pv210/setup-usb-phy.c [deleted file]
arch/arm/mach-s5pv210/sleep.S [new file with mode: 0644]
arch/arm/mach-shmobile/Kconfig
arch/arm/mach-shmobile/Makefile
arch/arm/mach-shmobile/Makefile.boot
arch/arm/mach-shmobile/board-ape6evm-reference.c
arch/arm/mach-shmobile/board-ape6evm.c
arch/arm/mach-shmobile/board-armadillo800eva-reference.c
arch/arm/mach-shmobile/board-armadillo800eva.c
arch/arm/mach-shmobile/board-bockw-reference.c
arch/arm/mach-shmobile/board-bockw.c
arch/arm/mach-shmobile/board-genmai-reference.c
arch/arm/mach-shmobile/board-genmai.c
arch/arm/mach-shmobile/board-koelsch-reference.c
arch/arm/mach-shmobile/board-koelsch.c
arch/arm/mach-shmobile/board-kzm9g-reference.c
arch/arm/mach-shmobile/board-kzm9g.c
arch/arm/mach-shmobile/board-lager-reference.c
arch/arm/mach-shmobile/board-lager.c
arch/arm/mach-shmobile/board-mackerel.c
arch/arm/mach-shmobile/board-marzen-reference.c
arch/arm/mach-shmobile/board-marzen.c
arch/arm/mach-shmobile/clock-r7s72100.c
arch/arm/mach-shmobile/clock-r8a73a4.c
arch/arm/mach-shmobile/clock-r8a7740.c
arch/arm/mach-shmobile/clock-r8a7778.c
arch/arm/mach-shmobile/clock-r8a7779.c
arch/arm/mach-shmobile/clock-r8a7790.c
arch/arm/mach-shmobile/clock-r8a7791.c
arch/arm/mach-shmobile/clock-sh7372.c
arch/arm/mach-shmobile/clock-sh73a0.c
arch/arm/mach-shmobile/clock.c
arch/arm/mach-shmobile/clock.h [new file with mode: 0644]
arch/arm/mach-shmobile/common.h [new file with mode: 0644]
arch/arm/mach-shmobile/console.c
arch/arm/mach-shmobile/cpufreq.c [new file with mode: 0644]
arch/arm/mach-shmobile/dma-register.h [new file with mode: 0644]
arch/arm/mach-shmobile/headsmp.S
arch/arm/mach-shmobile/include/mach/clock.h [deleted file]
arch/arm/mach-shmobile/include/mach/common.h [deleted file]
arch/arm/mach-shmobile/include/mach/dma-register.h [deleted file]
arch/arm/mach-shmobile/include/mach/intc.h [deleted file]
arch/arm/mach-shmobile/include/mach/irqs.h
arch/arm/mach-shmobile/include/mach/pm-rcar.h [deleted file]
arch/arm/mach-shmobile/include/mach/pm-rmobile.h [deleted file]
arch/arm/mach-shmobile/include/mach/r7s72100.h [deleted file]
arch/arm/mach-shmobile/include/mach/r8a73a4.h [deleted file]
arch/arm/mach-shmobile/include/mach/r8a7740.h [deleted file]
arch/arm/mach-shmobile/include/mach/r8a7778.h [deleted file]
arch/arm/mach-shmobile/include/mach/r8a7779.h [deleted file]
arch/arm/mach-shmobile/include/mach/r8a7790.h [deleted file]
arch/arm/mach-shmobile/include/mach/r8a7791.h [deleted file]
arch/arm/mach-shmobile/include/mach/rcar-gen2.h [deleted file]
arch/arm/mach-shmobile/include/mach/sh7372.h [deleted file]
arch/arm/mach-shmobile/include/mach/sh73a0.h [deleted file]
arch/arm/mach-shmobile/intc-sh7372.c
arch/arm/mach-shmobile/intc-sh73a0.c
arch/arm/mach-shmobile/intc.h [new file with mode: 0644]
arch/arm/mach-shmobile/irqs.h [new file with mode: 0644]
arch/arm/mach-shmobile/platsmp-apmu.c
arch/arm/mach-shmobile/platsmp-scu.c
arch/arm/mach-shmobile/platsmp.c
arch/arm/mach-shmobile/pm-r8a7740.c
arch/arm/mach-shmobile/pm-r8a7779.c
arch/arm/mach-shmobile/pm-r8a7790.c
arch/arm/mach-shmobile/pm-r8a7791.c [new file with mode: 0644]
arch/arm/mach-shmobile/pm-rcar.c
arch/arm/mach-shmobile/pm-rcar.h [new file with mode: 0644]
arch/arm/mach-shmobile/pm-rmobile.c
arch/arm/mach-shmobile/pm-rmobile.h [new file with mode: 0644]
arch/arm/mach-shmobile/pm-sh7372.c
arch/arm/mach-shmobile/pm-sh73a0.c
arch/arm/mach-shmobile/r7s72100.h [new file with mode: 0644]
arch/arm/mach-shmobile/r8a73a4.h [new file with mode: 0644]
arch/arm/mach-shmobile/r8a7740.h [new file with mode: 0644]
arch/arm/mach-shmobile/r8a7778.h [new file with mode: 0644]
arch/arm/mach-shmobile/r8a7779.h [new file with mode: 0644]
arch/arm/mach-shmobile/r8a7790.h [new file with mode: 0644]
arch/arm/mach-shmobile/r8a7791.h [new file with mode: 0644]
arch/arm/mach-shmobile/rcar-gen2.h [new file with mode: 0644]
arch/arm/mach-shmobile/setup-emev2.c
arch/arm/mach-shmobile/setup-r7s72100.c
arch/arm/mach-shmobile/setup-r8a73a4.c
arch/arm/mach-shmobile/setup-r8a7740.c
arch/arm/mach-shmobile/setup-r8a7778.c
arch/arm/mach-shmobile/setup-r8a7779.c
arch/arm/mach-shmobile/setup-r8a7790.c
arch/arm/mach-shmobile/setup-r8a7791.c
arch/arm/mach-shmobile/setup-rcar-gen2.c
arch/arm/mach-shmobile/setup-sh7372.c
arch/arm/mach-shmobile/setup-sh73a0.c
arch/arm/mach-shmobile/sh7372.h [new file with mode: 0644]
arch/arm/mach-shmobile/sh73a0.h [new file with mode: 0644]
arch/arm/mach-shmobile/smp-emev2.c
arch/arm/mach-shmobile/smp-r8a7779.c
arch/arm/mach-shmobile/smp-r8a7790.c
arch/arm/mach-shmobile/smp-r8a7791.c
arch/arm/mach-shmobile/smp-sh73a0.c
arch/arm/mach-shmobile/timer.c
arch/arm/mach-spear/Kconfig
arch/arm/mach-spear/include/mach/spear.h
arch/arm/mach-spear/spear1310.c
arch/arm/mach-spear/spear1340.c
arch/arm/mach-spear/spear13xx.c
arch/arm/mach-sti/platsmp.c
arch/arm/mach-sunxi/Kconfig
arch/arm/mach-sunxi/sunxi.c
arch/arm/mach-tegra/Makefile
arch/arm/mach-tegra/apbio.c [deleted file]
arch/arm/mach-tegra/apbio.h [deleted file]
arch/arm/mach-tegra/board-paz00.c
arch/arm/mach-tegra/board.h
arch/arm/mach-tegra/cpuidle-tegra114.c
arch/arm/mach-tegra/cpuidle-tegra20.c
arch/arm/mach-tegra/cpuidle-tegra30.c
arch/arm/mach-tegra/cpuidle.c
arch/arm/mach-tegra/flowctrl.c
arch/arm/mach-tegra/fuse.c [deleted file]
arch/arm/mach-tegra/fuse.h [deleted file]
arch/arm/mach-tegra/hotplug.c
arch/arm/mach-tegra/io.c
arch/arm/mach-tegra/irq.c
arch/arm/mach-tegra/platsmp.c
arch/arm/mach-tegra/pm-tegra20.c
arch/arm/mach-tegra/pm-tegra30.c
arch/arm/mach-tegra/pm.c
arch/arm/mach-tegra/pm.h
arch/arm/mach-tegra/pmc.c [deleted file]
arch/arm/mach-tegra/pmc.h [deleted file]
arch/arm/mach-tegra/powergate.c [deleted file]
arch/arm/mach-tegra/reset-handler.S
arch/arm/mach-tegra/reset.c
arch/arm/mach-tegra/sleep-tegra30.S
arch/arm/mach-tegra/sleep.h
arch/arm/mach-tegra/tegra.c
arch/arm/mach-tegra/tegra114_speedo.c [deleted file]
arch/arm/mach-tegra/tegra20_speedo.c [deleted file]
arch/arm/mach-tegra/tegra30_speedo.c [deleted file]
arch/arm/mach-ux500/board-mop500-regulators.c
arch/arm/mach-ux500/cache-l2x0.c
arch/arm/mach-ux500/cpu-db8500.c
arch/arm/mach-ux500/cpu.c
arch/arm/mach-ux500/timer.c
arch/arm/mach-versatile/core.c
arch/arm/mach-versatile/versatile_dt.c
arch/arm/mach-vexpress/Kconfig
arch/arm/mach-vexpress/ct-ca9x4.c
arch/arm/mach-vt8500/vt8500.c
arch/arm/mm/Kconfig
arch/arm/plat-omap/dma.c
arch/arm/plat-samsung/Kconfig
arch/arm/plat-samsung/Makefile
arch/arm/plat-samsung/adc.c
arch/arm/plat-samsung/clock-clksrc.c [deleted file]
arch/arm/plat-samsung/clock.c [deleted file]
arch/arm/plat-samsung/cpu.c
arch/arm/plat-samsung/devs.c
arch/arm/plat-samsung/include/plat/camport.h [deleted file]
arch/arm/plat-samsung/include/plat/clock-clksrc.h [deleted file]
arch/arm/plat-samsung/include/plat/clock.h [deleted file]
arch/arm/plat-samsung/include/plat/cpu-freq-core.h
arch/arm/plat-samsung/include/plat/cpu.h
arch/arm/plat-samsung/include/plat/devs.h
arch/arm/plat-samsung/include/plat/fb-core.h
arch/arm/plat-samsung/include/plat/fb.h
arch/arm/plat-samsung/include/plat/fimc-core.h [deleted file]
arch/arm/plat-samsung/include/plat/gpio-cfg.h
arch/arm/plat-samsung/include/plat/gpio-core.h
arch/arm/plat-samsung/include/plat/hdmi.h [deleted file]
arch/arm/plat-samsung/include/plat/irqs.h [deleted file]
arch/arm/plat-samsung/include/plat/map-s5p.h
arch/arm/plat-samsung/include/plat/mfc.h [deleted file]
arch/arm/plat-samsung/include/plat/pll.h [deleted file]
arch/arm/plat-samsung/include/plat/s5p-clock.h [deleted file]
arch/arm/plat-samsung/include/plat/sdhci.h
arch/arm/plat-samsung/include/plat/tv-core.h [deleted file]
arch/arm/plat-samsung/init.c
arch/arm/plat-samsung/pm-gpio.c
arch/arm/plat-samsung/s5p-clock.c [deleted file]
arch/arm/plat-samsung/s5p-dev-mfc.c
arch/arm/plat-samsung/s5p-dev-uart.c [deleted file]
arch/arm/plat-samsung/s5p-irq-eint.c [deleted file]
arch/arm/plat-samsung/s5p-irq-gpioint.c [deleted file]
arch/arm/plat-samsung/s5p-irq-pm.c [deleted file]
arch/arm/plat-samsung/s5p-irq.c [deleted file]
arch/arm/plat-samsung/s5p-pm.c [deleted file]
arch/arm/plat-samsung/s5p-sleep.S [deleted file]
arch/arm/plat-versatile/Kconfig
arch/arm/plat-versatile/Makefile
arch/arm/plat-versatile/clcd.c [deleted file]
arch/arm/plat-versatile/include/plat/clcd.h [deleted file]
arch/arm/xen/enlighten.c
arch/arm/xen/grant-table.c
arch/arm64/include/asm/debug-monitors.h
arch/arm64/include/asm/kvm_arm.h
arch/arm64/include/asm/kvm_asm.h
arch/arm64/include/asm/kvm_coproc.h
arch/arm64/include/asm/kvm_emulate.h
arch/arm64/include/asm/kvm_host.h
arch/arm64/include/asm/kvm_mmu.h
arch/arm64/include/asm/virt.h
arch/arm64/kernel/asm-offsets.c
arch/arm64/kernel/debug-monitors.c
arch/arm64/kvm/Makefile
arch/arm64/kvm/guest.c
arch/arm64/kvm/handle_exit.c
arch/arm64/kvm/hyp.S
arch/arm64/kvm/sys_regs.c
arch/arm64/kvm/vgic-v2-switch.S [new file with mode: 0644]
arch/arm64/kvm/vgic-v3-switch.S [new file with mode: 0644]
arch/avr32/boards/atngw100/mrmt.c
arch/avr32/boards/favr-32/setup.c
arch/avr32/boards/merisc/setup.c
arch/avr32/configs/atngw100_mrmt_defconfig
arch/avr32/configs/atstk1002_defconfig
arch/avr32/configs/atstk1003_defconfig
arch/avr32/configs/atstk1004_defconfig
arch/avr32/configs/atstk1006_defconfig
arch/avr32/configs/favr-32_defconfig
arch/avr32/configs/merisc_defconfig
arch/avr32/mach-at32ap/at32ap700x.c
arch/ia64/kvm/Kconfig
arch/ia64/kvm/kvm-ia64.c
arch/mips/kvm/mips.c
arch/powerpc/Kconfig.debug
arch/powerpc/configs/ppc44x_defconfig
arch/powerpc/include/asm/asm-compat.h
arch/powerpc/include/asm/cache.h
arch/powerpc/include/asm/hvcall.h
arch/powerpc/include/asm/kvm_44x.h [deleted file]
arch/powerpc/include/asm/kvm_asm.h
arch/powerpc/include/asm/kvm_book3s.h
arch/powerpc/include/asm/kvm_book3s_64.h
arch/powerpc/include/asm/kvm_booke.h
arch/powerpc/include/asm/kvm_host.h
arch/powerpc/include/asm/kvm_ppc.h
arch/powerpc/include/asm/mmu-book3e.h
arch/powerpc/include/asm/ppc-opcode.h
arch/powerpc/include/asm/reg.h
arch/powerpc/include/asm/time.h
arch/powerpc/include/uapi/asm/kvm.h
arch/powerpc/kernel/asm-offsets.c
arch/powerpc/kvm/44x.c [deleted file]
arch/powerpc/kvm/44x_emulate.c [deleted file]
arch/powerpc/kvm/44x_tlb.c [deleted file]
arch/powerpc/kvm/44x_tlb.h [deleted file]
arch/powerpc/kvm/Kconfig
arch/powerpc/kvm/Makefile
arch/powerpc/kvm/book3s.c
arch/powerpc/kvm/book3s_32_mmu.c
arch/powerpc/kvm/book3s_32_mmu_host.c
arch/powerpc/kvm/book3s_64_mmu_host.c
arch/powerpc/kvm/book3s_64_mmu_hv.c
arch/powerpc/kvm/book3s_emulate.c
arch/powerpc/kvm/book3s_hv.c
arch/powerpc/kvm/book3s_hv_builtin.c
arch/powerpc/kvm/book3s_hv_ras.c
arch/powerpc/kvm/book3s_hv_rm_mmu.c
arch/powerpc/kvm/book3s_hv_rm_xics.c
arch/powerpc/kvm/book3s_hv_rmhandlers.S
arch/powerpc/kvm/book3s_paired_singles.c
arch/powerpc/kvm/book3s_pr.c
arch/powerpc/kvm/book3s_pr_papr.c
arch/powerpc/kvm/book3s_xics.c
arch/powerpc/kvm/book3s_xics.h
arch/powerpc/kvm/booke.c
arch/powerpc/kvm/booke.h
arch/powerpc/kvm/booke_emulate.c
arch/powerpc/kvm/booke_interrupts.S
arch/powerpc/kvm/bookehv_interrupts.S
arch/powerpc/kvm/e500_emulate.c
arch/powerpc/kvm/e500_mmu_host.c
arch/powerpc/kvm/e500mc.c
arch/powerpc/kvm/emulate.c
arch/powerpc/kvm/emulate_loadstore.c [new file with mode: 0644]
arch/powerpc/kvm/mpic.c
arch/powerpc/kvm/powerpc.c
arch/powerpc/kvm/timing.c
arch/powerpc/kvm/timing.h
arch/s390/kvm/Kconfig
arch/s390/kvm/interrupt.c
arch/s390/kvm/kvm-s390.c
arch/x86/kvm/Kconfig
arch/x86/kvm/irq.c
arch/x86/kvm/lapic.c
arch/x86/kvm/vmx.c
arch/x86/kvm/x86.c
arch/x86/xen/enlighten.c
arch/x86/xen/grant-table.c
arch/x86/xen/p2m.c
drivers/amba/tegra-ahb.c
drivers/bus/Kconfig
drivers/bus/Makefile
drivers/bus/arm-cci.c
drivers/bus/arm-ccn.c [new file with mode: 0644]
drivers/bus/imx-weim.c
drivers/char/agp/frontend.c
drivers/clk/mvebu/clk-cpu.c
drivers/clk/samsung/Makefile
drivers/clk/samsung/clk-s5pv210-audss.c [new file with mode: 0644]
drivers/clk/samsung/clk-s5pv210.c [new file with mode: 0644]
drivers/clk/tegra/clk-periph-gate.c
drivers/clk/tegra/clk-tegra30.c
drivers/clk/tegra/clk.c
drivers/clk/versatile/Makefile
drivers/clk/versatile/clk-integrator.c [deleted file]
drivers/clk/versatile/clk-versatile.c [new file with mode: 0644]
drivers/clocksource/tegra20_timer.c
drivers/cpufreq/s3c2410-cpufreq.c
drivers/cpufreq/s3c2412-cpufreq.c
drivers/cpufreq/s3c2440-cpufreq.c
drivers/cpufreq/s3c24xx-cpufreq.c
drivers/cpufreq/s5pv210-cpufreq.c
drivers/cpuidle/Kconfig.arm
drivers/cpuidle/Makefile
drivers/cpuidle/cpuidle-armada-370-xp.c [deleted file]
drivers/cpuidle/cpuidle-big_little.c
drivers/cpuidle/cpuidle-mvebu-v7.c [new file with mode: 0644]
drivers/gpio/Kconfig
drivers/gpio/Makefile
drivers/gpio/gpio-crystalcove.c [new file with mode: 0644]
drivers/gpio/gpio-samsung.c
drivers/gpu/drm/Kconfig
drivers/gpu/drm/Makefile
drivers/gpu/drm/armada/armada_510.c
drivers/gpu/drm/armada/armada_crtc.c
drivers/gpu/drm/armada/armada_crtc.h
drivers/gpu/drm/armada/armada_drm.h
drivers/gpu/drm/armada/armada_drv.c
drivers/gpu/drm/armada/armada_fbdev.c
drivers/gpu/drm/armada/armada_output.c
drivers/gpu/drm/ast/ast_drv.h
drivers/gpu/drm/ast/ast_fb.c
drivers/gpu/drm/ast/ast_mode.c
drivers/gpu/drm/bochs/bochs_drv.c
drivers/gpu/drm/bochs/bochs_fbdev.c
drivers/gpu/drm/bochs/bochs_kms.c
drivers/gpu/drm/bochs/bochs_mm.c
drivers/gpu/drm/bridge/ptn3460.c
drivers/gpu/drm/cirrus/cirrus_drv.c
drivers/gpu/drm/cirrus/cirrus_drv.h
drivers/gpu/drm/cirrus/cirrus_fbdev.c
drivers/gpu/drm/cirrus/cirrus_mode.c
drivers/gpu/drm/drm_buffer.c
drivers/gpu/drm/drm_bufs.c
drivers/gpu/drm/drm_context.c
drivers/gpu/drm/drm_crtc.c
drivers/gpu/drm/drm_crtc_helper.c
drivers/gpu/drm/drm_debugfs.c
drivers/gpu/drm/drm_dp_mst_topology.c [new file with mode: 0644]
drivers/gpu/drm/drm_drv.c
drivers/gpu/drm/drm_edid.c
drivers/gpu/drm/drm_fb_cma_helper.c
drivers/gpu/drm/drm_fb_helper.c
drivers/gpu/drm/drm_fops.c
drivers/gpu/drm/drm_gem.c
drivers/gpu/drm/drm_gem_cma_helper.c
drivers/gpu/drm/drm_info.c
drivers/gpu/drm/drm_ioctl.c
drivers/gpu/drm/drm_legacy.h [new file with mode: 0644]
drivers/gpu/drm/drm_lock.c
drivers/gpu/drm/drm_mipi_dsi.c
drivers/gpu/drm/drm_of.c [new file with mode: 0644]
drivers/gpu/drm/drm_plane_helper.c
drivers/gpu/drm/drm_probe_helper.c
drivers/gpu/drm/drm_rect.c
drivers/gpu/drm/drm_stub.c [deleted file]
drivers/gpu/drm/drm_sysfs.c
drivers/gpu/drm/exynos/Kconfig
drivers/gpu/drm/exynos/exynos_dp_core.c
drivers/gpu/drm/exynos/exynos_dp_core.h
drivers/gpu/drm/exynos/exynos_drm_connector.c
drivers/gpu/drm/exynos/exynos_drm_crtc.c
drivers/gpu/drm/exynos/exynos_drm_crtc.h
drivers/gpu/drm/exynos/exynos_drm_dpi.c
drivers/gpu/drm/exynos/exynos_drm_drv.c
drivers/gpu/drm/exynos/exynos_drm_drv.h
drivers/gpu/drm/exynos/exynos_drm_dsi.c
drivers/gpu/drm/exynos/exynos_drm_fbdev.c
drivers/gpu/drm/exynos/exynos_drm_fimc.c
drivers/gpu/drm/exynos/exynos_drm_fimd.c
drivers/gpu/drm/exynos/exynos_drm_g2d.c
drivers/gpu/drm/exynos/exynos_drm_gem.c
drivers/gpu/drm/exynos/exynos_drm_ipp.c
drivers/gpu/drm/exynos/exynos_drm_ipp.h
drivers/gpu/drm/exynos/exynos_drm_rotator.c
drivers/gpu/drm/exynos/exynos_drm_vidi.c
drivers/gpu/drm/exynos/exynos_hdmi.c
drivers/gpu/drm/exynos/exynos_mixer.c
drivers/gpu/drm/gma500/cdv_intel_crt.c
drivers/gpu/drm/gma500/cdv_intel_dp.c
drivers/gpu/drm/gma500/cdv_intel_hdmi.c
drivers/gpu/drm/gma500/cdv_intel_lvds.c
drivers/gpu/drm/gma500/framebuffer.c
drivers/gpu/drm/gma500/gtt.c
drivers/gpu/drm/gma500/mdfld_dsi_output.c
drivers/gpu/drm/gma500/oaktrail_hdmi.c
drivers/gpu/drm/gma500/oaktrail_lvds.c
drivers/gpu/drm/gma500/psb_intel_lvds.c
drivers/gpu/drm/gma500/psb_intel_sdvo.c
drivers/gpu/drm/i2c/tda998x_drv.c
drivers/gpu/drm/i915/Kconfig
drivers/gpu/drm/i915/Makefile
drivers/gpu/drm/i915/i915_cmd_parser.c
drivers/gpu/drm/i915/i915_debugfs.c
drivers/gpu/drm/i915/i915_dma.c
drivers/gpu/drm/i915/i915_drv.c
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_gem.c
drivers/gpu/drm/i915/i915_gem_context.c
drivers/gpu/drm/i915/i915_gem_execbuffer.c
drivers/gpu/drm/i915/i915_gem_gtt.c
drivers/gpu/drm/i915/i915_gem_gtt.h
drivers/gpu/drm/i915/i915_gem_render_state.c
drivers/gpu/drm/i915/i915_gem_stolen.c
drivers/gpu/drm/i915/i915_gem_userptr.c
drivers/gpu/drm/i915/i915_gpu_error.c
drivers/gpu/drm/i915/i915_irq.c
drivers/gpu/drm/i915/i915_params.c
drivers/gpu/drm/i915/i915_reg.h
drivers/gpu/drm/i915/i915_sysfs.c
drivers/gpu/drm/i915/intel_bios.c
drivers/gpu/drm/i915/intel_crt.c
drivers/gpu/drm/i915/intel_ddi.c
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/i915/intel_dp.c
drivers/gpu/drm/i915/intel_dp_mst.c [new file with mode: 0644]
drivers/gpu/drm/i915/intel_drv.h
drivers/gpu/drm/i915/intel_dsi.c
drivers/gpu/drm/i915/intel_dsi.h
drivers/gpu/drm/i915/intel_dsi_cmd.c
drivers/gpu/drm/i915/intel_dsi_cmd.h
drivers/gpu/drm/i915/intel_dsi_panel_vbt.c
drivers/gpu/drm/i915/intel_dsi_pll.c
drivers/gpu/drm/i915/intel_dvo.c
drivers/gpu/drm/i915/intel_fbdev.c
drivers/gpu/drm/i915/intel_hdmi.c
drivers/gpu/drm/i915/intel_i2c.c
drivers/gpu/drm/i915/intel_lvds.c
drivers/gpu/drm/i915/intel_opregion.c
drivers/gpu/drm/i915/intel_overlay.c
drivers/gpu/drm/i915/intel_panel.c
drivers/gpu/drm/i915/intel_pm.c
drivers/gpu/drm/i915/intel_renderstate.h
drivers/gpu/drm/i915/intel_renderstate_gen6.c
drivers/gpu/drm/i915/intel_renderstate_gen7.c
drivers/gpu/drm/i915/intel_renderstate_gen8.c
drivers/gpu/drm/i915/intel_ringbuffer.c
drivers/gpu/drm/i915/intel_ringbuffer.h
drivers/gpu/drm/i915/intel_sdvo.c
drivers/gpu/drm/i915/intel_sprite.c
drivers/gpu/drm/i915/intel_tv.c
drivers/gpu/drm/i915/intel_uncore.c
drivers/gpu/drm/mgag200/mgag200_drv.h
drivers/gpu/drm/mgag200/mgag200_fb.c
drivers/gpu/drm/mgag200/mgag200_mode.c
drivers/gpu/drm/msm/Kconfig
drivers/gpu/drm/msm/adreno/a2xx.xml.h
drivers/gpu/drm/msm/adreno/a3xx.xml.h
drivers/gpu/drm/msm/adreno/a3xx_gpu.c
drivers/gpu/drm/msm/adreno/a3xx_gpu.h
drivers/gpu/drm/msm/adreno/adreno_common.xml.h
drivers/gpu/drm/msm/adreno/adreno_gpu.c
drivers/gpu/drm/msm/adreno/adreno_pm4.xml.h
drivers/gpu/drm/msm/dsi/dsi.xml.h
drivers/gpu/drm/msm/dsi/mmss_cc.xml.h
drivers/gpu/drm/msm/dsi/sfpb.xml.h
drivers/gpu/drm/msm/hdmi/hdmi.c
drivers/gpu/drm/msm/hdmi/hdmi.h
drivers/gpu/drm/msm/hdmi/hdmi.xml.h
drivers/gpu/drm/msm/hdmi/hdmi_connector.c
drivers/gpu/drm/msm/hdmi/hdmi_phy_8960.c
drivers/gpu/drm/msm/hdmi/qfprom.xml.h
drivers/gpu/drm/msm/mdp/mdp4/mdp4.xml.h
drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c
drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.h
drivers/gpu/drm/msm/mdp/mdp5/mdp5.xml.h
drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c
drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.h
drivers/gpu/drm/msm/mdp/mdp_common.xml.h
drivers/gpu/drm/msm/msm_drv.c
drivers/gpu/drm/msm/msm_fbdev.c
drivers/gpu/drm/msm/msm_gem.c
drivers/gpu/drm/msm/msm_gpu.c
drivers/gpu/drm/msm/msm_iommu.c
drivers/gpu/drm/msm/msm_mmu.h
drivers/gpu/drm/nouveau/nouveau_bo.c
drivers/gpu/drm/nouveau/nouveau_connector.c
drivers/gpu/drm/nouveau/nouveau_fbcon.c
drivers/gpu/drm/nouveau/nouveau_gem.c
drivers/gpu/drm/nouveau/nouveau_ttm.c
drivers/gpu/drm/omapdrm/omap_connector.c
drivers/gpu/drm/omapdrm/omap_dmm_tiler.c
drivers/gpu/drm/omapdrm/omap_drv.h
drivers/gpu/drm/omapdrm/omap_fbdev.c
drivers/gpu/drm/omapdrm/omap_gem.c
drivers/gpu/drm/omapdrm/omap_plane.c
drivers/gpu/drm/panel/Kconfig
drivers/gpu/drm/panel/panel-ld9040.c
drivers/gpu/drm/panel/panel-s6e8aa0.c
drivers/gpu/drm/panel/panel-simple.c
drivers/gpu/drm/qxl/qxl_display.c
drivers/gpu/drm/qxl/qxl_fb.c
drivers/gpu/drm/qxl/qxl_object.h
drivers/gpu/drm/radeon/Makefile
drivers/gpu/drm/radeon/atombios_encoders.c
drivers/gpu/drm/radeon/ci_dpm.c
drivers/gpu/drm/radeon/ci_smc.c
drivers/gpu/drm/radeon/cik.c
drivers/gpu/drm/radeon/cik_sdma.c
drivers/gpu/drm/radeon/dce6_afmt.c
drivers/gpu/drm/radeon/evergreen.c
drivers/gpu/drm/radeon/evergreen_hdmi.c
drivers/gpu/drm/radeon/ni.c
drivers/gpu/drm/radeon/ni_dma.c
drivers/gpu/drm/radeon/r100.c
drivers/gpu/drm/radeon/r300.c
drivers/gpu/drm/radeon/r600.c
drivers/gpu/drm/radeon/r600_cs.c
drivers/gpu/drm/radeon/radeon.h
drivers/gpu/drm/radeon/radeon_asic.c
drivers/gpu/drm/radeon/radeon_asic.h
drivers/gpu/drm/radeon/radeon_atombios.c
drivers/gpu/drm/radeon/radeon_benchmark.c
drivers/gpu/drm/radeon/radeon_connectors.c
drivers/gpu/drm/radeon/radeon_cs.c
drivers/gpu/drm/radeon/radeon_device.c
drivers/gpu/drm/radeon/radeon_display.c
drivers/gpu/drm/radeon/radeon_drv.c
drivers/gpu/drm/radeon/radeon_encoders.c
drivers/gpu/drm/radeon/radeon_fb.c
drivers/gpu/drm/radeon/radeon_gart.c
drivers/gpu/drm/radeon/radeon_gem.c
drivers/gpu/drm/radeon/radeon_ib.c [new file with mode: 0644]
drivers/gpu/drm/radeon/radeon_kms.c
drivers/gpu/drm/radeon/radeon_mode.h
drivers/gpu/drm/radeon/radeon_object.c
drivers/gpu/drm/radeon/radeon_object.h
drivers/gpu/drm/radeon/radeon_pm.c
drivers/gpu/drm/radeon/radeon_prime.c
drivers/gpu/drm/radeon/radeon_ring.c
drivers/gpu/drm/radeon/radeon_sa.c
drivers/gpu/drm/radeon/radeon_test.c
drivers/gpu/drm/radeon/radeon_trace.h
drivers/gpu/drm/radeon/radeon_ttm.c
drivers/gpu/drm/radeon/radeon_ucode.c [new file with mode: 0644]
drivers/gpu/drm/radeon/radeon_ucode.h
drivers/gpu/drm/radeon/radeon_uvd.c
drivers/gpu/drm/radeon/radeon_vce.c
drivers/gpu/drm/radeon/radeon_vm.c
drivers/gpu/drm/radeon/rs400.c
drivers/gpu/drm/radeon/rs600.c
drivers/gpu/drm/radeon/rv770.c
drivers/gpu/drm/radeon/si.c
drivers/gpu/drm/radeon/si_dma.c
drivers/gpu/drm/radeon/si_dpm.c
drivers/gpu/drm/radeon/si_dpm.h
drivers/gpu/drm/radeon/si_smc.c
drivers/gpu/drm/radeon/sislands_smc.h
drivers/gpu/drm/rcar-du/rcar_du_drv.c
drivers/gpu/drm/rcar-du/rcar_du_kms.c
drivers/gpu/drm/rcar-du/rcar_du_lvdscon.c
drivers/gpu/drm/rcar-du/rcar_du_vgacon.c
drivers/gpu/drm/shmobile/shmob_drm_crtc.c
drivers/gpu/drm/shmobile/shmob_drm_drv.c
drivers/gpu/drm/sti/Kconfig [new file with mode: 0644]
drivers/gpu/drm/sti/Makefile [new file with mode: 0644]
drivers/gpu/drm/sti/NOTES [new file with mode: 0644]
drivers/gpu/drm/sti/sti_compositor.c [new file with mode: 0644]
drivers/gpu/drm/sti/sti_compositor.h [new file with mode: 0644]
drivers/gpu/drm/sti/sti_drm_crtc.c [new file with mode: 0644]
drivers/gpu/drm/sti/sti_drm_crtc.h [new file with mode: 0644]
drivers/gpu/drm/sti/sti_drm_drv.c [new file with mode: 0644]
drivers/gpu/drm/sti/sti_drm_drv.h [new file with mode: 0644]
drivers/gpu/drm/sti/sti_drm_plane.c [new file with mode: 0644]
drivers/gpu/drm/sti/sti_drm_plane.h [new file with mode: 0644]
drivers/gpu/drm/sti/sti_gdp.c [new file with mode: 0644]
drivers/gpu/drm/sti/sti_gdp.h [new file with mode: 0644]
drivers/gpu/drm/sti/sti_hda.c [new file with mode: 0644]
drivers/gpu/drm/sti/sti_hdmi.c [new file with mode: 0644]
drivers/gpu/drm/sti/sti_hdmi.h [new file with mode: 0644]
drivers/gpu/drm/sti/sti_hdmi_tx3g0c55phy.c [new file with mode: 0644]
drivers/gpu/drm/sti/sti_hdmi_tx3g0c55phy.h [new file with mode: 0644]
drivers/gpu/drm/sti/sti_hdmi_tx3g4c28phy.c [new file with mode: 0644]
drivers/gpu/drm/sti/sti_hdmi_tx3g4c28phy.h [new file with mode: 0644]
drivers/gpu/drm/sti/sti_layer.c [new file with mode: 0644]
drivers/gpu/drm/sti/sti_layer.h [new file with mode: 0644]
drivers/gpu/drm/sti/sti_mixer.c [new file with mode: 0644]
drivers/gpu/drm/sti/sti_mixer.h [new file with mode: 0644]
drivers/gpu/drm/sti/sti_tvout.c [new file with mode: 0644]
drivers/gpu/drm/sti/sti_vid.c [new file with mode: 0644]
drivers/gpu/drm/sti/sti_vid.h [new file with mode: 0644]
drivers/gpu/drm/sti/sti_vtac.c [new file with mode: 0644]
drivers/gpu/drm/sti/sti_vtg.c [new file with mode: 0644]
drivers/gpu/drm/sti/sti_vtg.h [new file with mode: 0644]
drivers/gpu/drm/tegra/dc.c
drivers/gpu/drm/tegra/dc.h
drivers/gpu/drm/tegra/dpaux.c
drivers/gpu/drm/tegra/drm.c
drivers/gpu/drm/tegra/drm.h
drivers/gpu/drm/tegra/dsi.c
drivers/gpu/drm/tegra/fb.c
drivers/gpu/drm/tegra/gem.c
drivers/gpu/drm/tegra/gem.h
drivers/gpu/drm/tegra/gr2d.c
drivers/gpu/drm/tegra/gr3d.c
drivers/gpu/drm/tegra/hdmi.c
drivers/gpu/drm/tegra/output.c
drivers/gpu/drm/tegra/sor.c
drivers/gpu/drm/tilcdc/tilcdc_drv.c
drivers/gpu/drm/tilcdc/tilcdc_drv.h
drivers/gpu/drm/tilcdc/tilcdc_panel.c
drivers/gpu/drm/tilcdc/tilcdc_slave.c
drivers/gpu/drm/tilcdc/tilcdc_tfp410.c
drivers/gpu/drm/ttm/ttm_bo.c
drivers/gpu/drm/ttm/ttm_bo_manager.c
drivers/gpu/drm/ttm/ttm_bo_util.c
drivers/gpu/drm/ttm/ttm_module.c
drivers/gpu/drm/ttm/ttm_page_alloc.c
drivers/gpu/drm/ttm/ttm_page_alloc_dma.c
drivers/gpu/drm/udl/udl_connector.c
drivers/gpu/drm/udl/udl_fb.c
drivers/gpu/drm/udl/udl_gem.c
drivers/gpu/drm/udl/udl_main.c
drivers/gpu/drm/udl/udl_modeset.c
drivers/gpu/drm/vmwgfx/Makefile
drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf_res.c [new file with mode: 0644]
drivers/gpu/drm/vmwgfx/vmwgfx_context.c
drivers/gpu/drm/vmwgfx/vmwgfx_dmabuf.c
drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c
drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c
drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
drivers/gpu/drm/vmwgfx/vmwgfx_shader.c
drivers/gpu/host1x/job.c
drivers/gpu/vga/vgaarb.c
drivers/hid/Kconfig
drivers/hid/Makefile
drivers/hid/hid-core.c
drivers/hid/hid-gt683r.c [new file with mode: 0644]
drivers/hid/hid-ids.h
drivers/hid/usbhid/hid-quirks.c
drivers/i2c/busses/i2c-cros-ec-tunnel.c
drivers/input/keyboard/cros_ec_keyb.c
drivers/input/keyboard/lm8323.c
drivers/iommu/tegra-smmu.c
drivers/irqchip/Kconfig
drivers/irqchip/irq-versatile-fpga.c
drivers/leds/Kconfig
drivers/leds/Makefile
drivers/leds/led-class.c
drivers/leds/led-core.c
drivers/leds/leds-atmel-pwm.c [deleted file]
drivers/leds/leds-ipaq-micro.c [new file with mode: 0644]
drivers/leds/leds-lm3530.c
drivers/leds/leds-lm3533.c
drivers/leds/leds-lm355x.c
drivers/leds/leds-lm3642.c
drivers/leds/leds-lp55xx-common.c
drivers/leds/leds-max8997.c
drivers/leds/leds-netxbig.c
drivers/leds/leds-ns2.c
drivers/leds/leds-pca963x.c
drivers/leds/leds-ss4200.c
drivers/leds/leds-wm831x-status.c
drivers/macintosh/via-pmu-backlight.c
drivers/mailbox/Kconfig
drivers/mailbox/Makefile
drivers/mailbox/mailbox-omap1.c [deleted file]
drivers/mailbox/mailbox-omap2.c [deleted file]
drivers/mailbox/omap-mailbox.c
drivers/mailbox/omap-mbox.h [deleted file]
drivers/mfd/88pm805.c
drivers/mfd/88pm860x-core.c
drivers/mfd/88pm860x-i2c.c
drivers/mfd/Kconfig
drivers/mfd/Makefile
drivers/mfd/aat2870-core.c
drivers/mfd/ab3100-core.c
drivers/mfd/ab8500-core.c
drivers/mfd/ab8500-debugfs.c
drivers/mfd/arizona-core.c
drivers/mfd/arizona-i2c.c
drivers/mfd/arizona-irq.c
drivers/mfd/arizona-spi.c
drivers/mfd/arizona.h
drivers/mfd/asic3.c
drivers/mfd/cros_ec.c
drivers/mfd/cros_ec_i2c.c
drivers/mfd/cros_ec_spi.c
drivers/mfd/da9063-core.c
drivers/mfd/da9063-i2c.c
drivers/mfd/dm355evm_msp.c
drivers/mfd/ezx-pcap.c
drivers/mfd/htc-i2cpld.c
drivers/mfd/intel_soc_pmic_core.c [new file with mode: 0644]
drivers/mfd/intel_soc_pmic_core.h [new file with mode: 0644]
drivers/mfd/intel_soc_pmic_crc.c [new file with mode: 0644]
drivers/mfd/ipaq-micro.c
drivers/mfd/kempld-core.c
drivers/mfd/lp8788-irq.c
drivers/mfd/max77686-irq.c [deleted file]
drivers/mfd/max77686.c
drivers/mfd/max8925-core.c
drivers/mfd/max8925-i2c.c
drivers/mfd/mc13xxx-core.c
drivers/mfd/mc13xxx.h
drivers/mfd/mcp-core.c
drivers/mfd/omap-usb-host.c
drivers/mfd/pcf50633-core.c
drivers/mfd/pm8921-core.c
drivers/mfd/rtsx_pcr.c
drivers/mfd/sec-core.c
drivers/mfd/sec-irq.c
drivers/mfd/si476x-cmd.c
drivers/mfd/stmpe-i2c.c
drivers/mfd/stmpe.c
drivers/mfd/stmpe.h
drivers/mfd/sun6i-prcm.c
drivers/mfd/tc3589x.c
drivers/mfd/tc6387xb.c
drivers/mfd/tps6105x.c
drivers/mfd/tps65910.c
drivers/mfd/tps65912-spi.c
drivers/mfd/twl4030-irq.c
drivers/mfd/twl6030-irq.c
drivers/mfd/twl6040.c
drivers/mfd/wm5102-tables.c
drivers/mfd/wm5110-tables.c
drivers/mfd/wm8350-i2c.c
drivers/mfd/wm8350-irq.c
drivers/mfd/wm8994-regmap.c
drivers/mfd/wm8997-tables.c
drivers/misc/Kconfig
drivers/misc/Makefile
drivers/misc/atmel_pwm.c [deleted file]
drivers/misc/fuse/Makefile [new file with mode: 0644]
drivers/mmc/host/rtsx_pci_sdmmc.c
drivers/mtd/onenand/Kconfig
drivers/mtd/onenand/samsung.c
drivers/pci/host/Kconfig
drivers/pci/host/Makefile
drivers/pci/host/pci-tegra.c
drivers/pci/host/pcie-spear13xx.c [new file with mode: 0644]
drivers/phy/Kconfig
drivers/phy/Makefile
drivers/phy/phy-s5pv210-usb2.c [new file with mode: 0644]
drivers/phy/phy-samsung-usb2.c
drivers/phy/phy-samsung-usb2.h
drivers/phy/phy-spear1310-miphy.c [new file with mode: 0644]
drivers/phy/phy-spear1340-miphy.c [new file with mode: 0644]
drivers/pinctrl/Kconfig
drivers/pinctrl/Makefile
drivers/pinctrl/core.c
drivers/pinctrl/nomadik/Kconfig [new file with mode: 0644]
drivers/pinctrl/nomadik/Makefile [new file with mode: 0644]
drivers/pinctrl/nomadik/pinctrl-ab8500.c [new file with mode: 0644]
drivers/pinctrl/nomadik/pinctrl-ab8505.c [new file with mode: 0644]
drivers/pinctrl/nomadik/pinctrl-ab8540.c [new file with mode: 0644]
drivers/pinctrl/nomadik/pinctrl-ab9540.c [new file with mode: 0644]
drivers/pinctrl/nomadik/pinctrl-abx500.c [new file with mode: 0644]
drivers/pinctrl/nomadik/pinctrl-abx500.h [new file with mode: 0644]
drivers/pinctrl/nomadik/pinctrl-nomadik-db8500.c [new file with mode: 0644]
drivers/pinctrl/nomadik/pinctrl-nomadik-db8540.c [new file with mode: 0644]
drivers/pinctrl/nomadik/pinctrl-nomadik-stn8815.c [new file with mode: 0644]
drivers/pinctrl/nomadik/pinctrl-nomadik.c [new file with mode: 0644]
drivers/pinctrl/nomadik/pinctrl-nomadik.h [new file with mode: 0644]
drivers/pinctrl/pinctrl-ab8500.c [deleted file]
drivers/pinctrl/pinctrl-ab8505.c [deleted file]
drivers/pinctrl/pinctrl-ab8540.c [deleted file]
drivers/pinctrl/pinctrl-ab9540.c [deleted file]
drivers/pinctrl/pinctrl-abx500.c [deleted file]
drivers/pinctrl/pinctrl-abx500.h [deleted file]
drivers/pinctrl/pinctrl-adi2.c
drivers/pinctrl/pinctrl-apq8064.c [deleted file]
drivers/pinctrl/pinctrl-as3722.c
drivers/pinctrl/pinctrl-at91.c
drivers/pinctrl/pinctrl-baytrail.c
drivers/pinctrl/pinctrl-bcm281xx.c
drivers/pinctrl/pinctrl-bcm2835.c
drivers/pinctrl/pinctrl-coh901.c
drivers/pinctrl/pinctrl-exynos.c [deleted file]
drivers/pinctrl/pinctrl-exynos.h [deleted file]
drivers/pinctrl/pinctrl-exynos5440.c [deleted file]
drivers/pinctrl/pinctrl-imx.c
drivers/pinctrl/pinctrl-imx1-core.c
drivers/pinctrl/pinctrl-imx1.c [new file with mode: 0644]
drivers/pinctrl/pinctrl-imx27.c
drivers/pinctrl/pinctrl-ipq8064.c [deleted file]
drivers/pinctrl/pinctrl-msm.c [deleted file]
drivers/pinctrl/pinctrl-msm.h [deleted file]
drivers/pinctrl/pinctrl-msm8x74.c [deleted file]
drivers/pinctrl/pinctrl-nomadik-db8500.c [deleted file]
drivers/pinctrl/pinctrl-nomadik-db8540.c [deleted file]
drivers/pinctrl/pinctrl-nomadik-stn8815.c [deleted file]
drivers/pinctrl/pinctrl-nomadik.c [deleted file]
drivers/pinctrl/pinctrl-nomadik.h [deleted file]
drivers/pinctrl/pinctrl-rockchip.c
drivers/pinctrl/pinctrl-s3c24xx.c [deleted file]
drivers/pinctrl/pinctrl-s3c64xx.c [deleted file]
drivers/pinctrl/pinctrl-samsung.c [deleted file]
drivers/pinctrl/pinctrl-samsung.h [deleted file]
drivers/pinctrl/pinctrl-single.c
drivers/pinctrl/pinctrl-st.c
drivers/pinctrl/pinctrl-tb10x.c
drivers/pinctrl/pinctrl-tegra-xusb.c [new file with mode: 0644]
drivers/pinctrl/pinctrl-tegra.c
drivers/pinctrl/pinctrl-tz1090-pdc.c
drivers/pinctrl/pinctrl-tz1090.c
drivers/pinctrl/pinctrl-u300.c
drivers/pinctrl/pinmux.c
drivers/pinctrl/qcom/Kconfig [new file with mode: 0644]
drivers/pinctrl/qcom/Makefile [new file with mode: 0644]
drivers/pinctrl/qcom/pinctrl-apq8064.c [new file with mode: 0644]
drivers/pinctrl/qcom/pinctrl-ipq8064.c [new file with mode: 0644]
drivers/pinctrl/qcom/pinctrl-msm.c [new file with mode: 0644]
drivers/pinctrl/qcom/pinctrl-msm.h [new file with mode: 0644]
drivers/pinctrl/qcom/pinctrl-msm8960.c [new file with mode: 0644]
drivers/pinctrl/qcom/pinctrl-msm8x74.c [new file with mode: 0644]
drivers/pinctrl/samsung/Kconfig [new file with mode: 0644]
drivers/pinctrl/samsung/Makefile [new file with mode: 0644]
drivers/pinctrl/samsung/pinctrl-exynos.c [new file with mode: 0644]
drivers/pinctrl/samsung/pinctrl-exynos.h [new file with mode: 0644]
drivers/pinctrl/samsung/pinctrl-exynos5440.c [new file with mode: 0644]
drivers/pinctrl/samsung/pinctrl-s3c24xx.c [new file with mode: 0644]
drivers/pinctrl/samsung/pinctrl-s3c64xx.c [new file with mode: 0644]
drivers/pinctrl/samsung/pinctrl-samsung.c [new file with mode: 0644]
drivers/pinctrl/samsung/pinctrl-samsung.h [new file with mode: 0644]
drivers/pinctrl/sh-pfc/gpio.c
drivers/pinctrl/sh-pfc/pfc-r8a7791.c
drivers/pinctrl/sh-pfc/pfc-sh73a0.c
drivers/pinctrl/sh-pfc/pinctrl.c
drivers/pinctrl/sirf/pinctrl-sirf.c
drivers/pinctrl/spear/Kconfig
drivers/pinctrl/spear/pinctrl-plgpio.c
drivers/pinctrl/spear/pinctrl-spear.c
drivers/pinctrl/sunxi/Kconfig
drivers/pinctrl/sunxi/Makefile
drivers/pinctrl/sunxi/pinctrl-sun4i-a10.c
drivers/pinctrl/sunxi/pinctrl-sun5i-a10s.c
drivers/pinctrl/sunxi/pinctrl-sun5i-a13.c
drivers/pinctrl/sunxi/pinctrl-sun6i-a31-r.c
drivers/pinctrl/sunxi/pinctrl-sun6i-a31.c
drivers/pinctrl/sunxi/pinctrl-sun7i-a20.c
drivers/pinctrl/sunxi/pinctrl-sun8i-a23-r.c [new file with mode: 0644]
drivers/pinctrl/sunxi/pinctrl-sun8i-a23.c [new file with mode: 0644]
drivers/pinctrl/sunxi/pinctrl-sunxi.c
drivers/pinctrl/sunxi/pinctrl-sunxi.h
drivers/pinctrl/vt8500/pinctrl-wmt.c
drivers/platform/x86/samsung-q10.c
drivers/power/reset/Kconfig
drivers/power/reset/Makefile
drivers/power/reset/hisi-reboot.c [new file with mode: 0644]
drivers/pwm/Kconfig
drivers/regulator/s2mps11.c
drivers/rtc/rtc-da9063.c
drivers/rtc/rtc-max77686.c
drivers/soc/Makefile
drivers/soc/tegra/Makefile [new file with mode: 0644]
drivers/soc/tegra/common.c [new file with mode: 0644]
drivers/soc/tegra/fuse/Makefile [new file with mode: 0644]
drivers/soc/tegra/fuse/fuse-tegra.c [new file with mode: 0644]
drivers/soc/tegra/fuse/fuse-tegra20.c [new file with mode: 0644]
drivers/soc/tegra/fuse/fuse-tegra30.c [new file with mode: 0644]
drivers/soc/tegra/fuse/fuse.h [new file with mode: 0644]
drivers/soc/tegra/fuse/speedo-tegra114.c [new file with mode: 0644]
drivers/soc/tegra/fuse/speedo-tegra124.c [new file with mode: 0644]
drivers/soc/tegra/fuse/speedo-tegra20.c [new file with mode: 0644]
drivers/soc/tegra/fuse/speedo-tegra30.c [new file with mode: 0644]
drivers/soc/tegra/fuse/tegra-apbmisc.c [new file with mode: 0644]
drivers/soc/tegra/pmc.c [new file with mode: 0644]
drivers/spi/spi-s3c64xx.c
drivers/staging/imx-drm/imx-drm-core.c
drivers/tty/serial/samsung.c
drivers/video/backlight/Kconfig
drivers/video/backlight/Makefile
drivers/video/backlight/aat2870_bl.c
drivers/video/backlight/ams369fg06.c
drivers/video/backlight/atmel-pwm-bl.c [deleted file]
drivers/video/backlight/backlight.c
drivers/video/backlight/bd6107.c
drivers/video/backlight/gpio_backlight.c
drivers/video/backlight/ipaq_micro_bl.c [new file with mode: 0644]
drivers/video/backlight/jornada720_lcd.c
drivers/video/backlight/ld9040.c
drivers/video/backlight/lp855x_bl.c
drivers/video/backlight/lp8788_bl.c
drivers/video/backlight/lv5207lp.c
drivers/video/backlight/pandora_bl.c
drivers/video/backlight/pwm_bl.c
drivers/video/backlight/s6e63m0.c
drivers/video/backlight/tps65217_bl.c
drivers/video/fbdev/Kconfig
drivers/video/fbdev/Makefile
drivers/video/fbdev/amba-clcd-versatile.c [new file with mode: 0644]
drivers/video/fbdev/aty/aty128fb.c
drivers/video/fbdev/aty/atyfb_base.c
drivers/video/fbdev/aty/radeon_backlight.c
drivers/video/fbdev/exynos/s6e8ax0.c
drivers/video/fbdev/nvidia/nv_backlight.c
drivers/video/fbdev/riva/fbdev.c
drivers/video/fbdev/s3c-fb.c
drivers/xen/events/events_base.c
drivers/xen/events/events_fifo.c
drivers/xen/grant-table.c
drivers/xen/xen-pciback/xenbus.c
include/drm/drmP.h
include/drm/drm_crtc.h
include/drm/drm_dp_mst_helper.h [new file with mode: 0644]
include/drm/drm_fb_helper.h
include/drm/drm_mipi_dsi.h
include/drm/drm_of.h [new file with mode: 0644]
include/drm/drm_panel.h
include/drm/drm_rect.h
include/drm/ttm/ttm_bo_driver.h
include/dt-bindings/clock/imx1-clock.h [new file with mode: 0644]
include/dt-bindings/clock/imx21-clock.h [new file with mode: 0644]
include/dt-bindings/clock/imx27-clock.h [new file with mode: 0644]
include/dt-bindings/clock/imx6qdl-clock.h [new file with mode: 0644]
include/dt-bindings/clock/r8a7790-clock.h
include/dt-bindings/clock/r8a7791-clock.h
include/dt-bindings/clock/s5pv210-audss.h [new file with mode: 0644]
include/dt-bindings/clock/s5pv210.h [new file with mode: 0644]
include/dt-bindings/clock/vf610-clock.h
include/dt-bindings/mfd/as3722.h
include/dt-bindings/pinctrl/pinctrl-tegra-xusb.h [new file with mode: 0644]
include/kvm/arm_arch_timer.h
include/kvm/arm_vgic.h
include/linux/atmel-pwm-bl.h [deleted file]
include/linux/atmel_pwm.h [deleted file]
include/linux/host1x.h
include/linux/kvm_host.h
include/linux/leds.h
include/linux/mfd/abx500/ab8500.h
include/linux/mfd/arizona/core.h
include/linux/mfd/arizona/registers.h
include/linux/mfd/cros_ec.h
include/linux/mfd/da9063/core.h
include/linux/mfd/da9063/registers.h
include/linux/mfd/intel_soc_pmic.h [new file with mode: 0644]
include/linux/mfd/max77686-private.h
include/linux/mfd/max77686.h
include/linux/mfd/mc13783.h
include/linux/mfd/mc13xxx.h
include/linux/mfd/rtsx_pci.h
include/linux/mfd/samsung/core.h
include/linux/mfd/samsung/irq.h
include/linux/mfd/samsung/s2mpu02.h [new file with mode: 0644]
include/linux/mfd/tps65910.h
include/linux/mvebu-pmsu.h [new file with mode: 0644]
include/linux/omap-dma.h
include/linux/pinctrl/pinmux.h
include/linux/platform_data/camera-mx1.h [deleted file]
include/linux/platform_data/usb-ehci-mxc.h
include/linux/platform_data/usb-imx_udc.h [deleted file]
include/linux/platform_data/video-clcd-versatile.h [new file with mode: 0644]
include/linux/tegra-ahb.h [deleted file]
include/linux/tegra-cpuidle.h [deleted file]
include/linux/tegra-powergate.h [deleted file]
include/linux/tegra-soc.h [deleted file]
include/soc/tegra/ahb.h [new file with mode: 0644]
include/soc/tegra/common.h [new file with mode: 0644]
include/soc/tegra/cpuidle.h [new file with mode: 0644]
include/soc/tegra/fuse.h [new file with mode: 0644]
include/soc/tegra/pm.h [new file with mode: 0644]
include/soc/tegra/pmc.h [new file with mode: 0644]
include/trace/events/kvm.h
include/uapi/drm/drm.h
include/uapi/drm/drm_mode.h
include/uapi/drm/radeon_drm.h
include/uapi/drm/tegra_drm.h
include/uapi/linux/kvm.h
include/video/samsung_fimd.h
include/xen/grant_table.h
init/calibrate.c
sound/soc/codecs/arizona.c
sound/soc/samsung/goni_wm8994.c
virt/kvm/Kconfig
virt/kvm/arm/vgic-v2.c [new file with mode: 0644]
virt/kvm/arm/vgic-v3.c [new file with mode: 0644]
virt/kvm/arm/vgic.c
virt/kvm/eventfd.c
virt/kvm/irq_comm.c
virt/kvm/irqchip.c
virt/kvm/kvm_main.c

diff --git a/Documentation/ABI/testing/sysfs-class-leds-gt683r b/Documentation/ABI/testing/sysfs-class-leds-gt683r
new file mode 100644 (file)
index 0000000..e4fae60
--- /dev/null
@@ -0,0 +1,16 @@
+What:          /sys/class/leds/<led>/gt683r/mode
+Date:          Jun 2014
+KernelVersion: 3.17
+Contact:       Janne Kanniainen <janne.kanniainen@gmail.com>
+Description:
+               Set the mode of LEDs. You should notice that changing the mode
+               of one LED will update the mode of its two sibling devices as
+               well.
+
+               0 - normal
+               1 - audio
+               2 - breathing
+
+               Normal: LEDs are fully on when enabled
+               Audio:  LEDs brightness depends on sound level
+               Breathing: LEDs brightness varies at human breathing rate
\ No newline at end of file
diff --git a/Documentation/ABI/testing/sysfs-driver-pciback b/Documentation/ABI/testing/sysfs-driver-pciback
new file mode 100644 (file)
index 0000000..6a733bf
--- /dev/null
@@ -0,0 +1,13 @@
+What:           /sys/bus/pci/drivers/pciback/quirks
+Date:           Oct 2011
+KernelVersion:  3.1
+Contact:        xen-devel@lists.xenproject.org
+Description:
+                If the permissive attribute is set, then writing a string in
+                the format of DDDD:BB:DD.F-REG:SIZE:MASK will allow the guest
+                to write and read from the PCI device. That is Domain:Bus:
+                Device.Function-Register:Size:Mask (Domain is optional).
+                For example:
+                #echo 00:19.0-E0:2:FF > /sys/bus/pci/drivers/pciback/quirks
+                will allow the guest to read and write to the configuration
+                register 0x0E.
diff --git a/Documentation/ABI/testing/sysfs-driver-tegra-fuse b/Documentation/ABI/testing/sysfs-driver-tegra-fuse
new file mode 100644 (file)
index 0000000..69f5af6
--- /dev/null
@@ -0,0 +1,11 @@
+What:          /sys/devices/*/<our-device>/fuse
+Date:          February 2014
+Contact:       Peter De Schrijver <pdeschrijver@nvidia.com>
+Description:   read-only access to the efuses on Tegra20, Tegra30, Tegra114
+               and Tegra124 SoC's from NVIDIA. The efuses contain write once
+               data programmed at the factory. The data is layed out in 32bit
+               words in LSB first format. Each bit represents a single value
+               as decoded from the fuse registers. Bits order/assignment
+               exactly matches the HW registers, including any unused bits.
+Users:         any user space application which wants to read the efuses on
+               Tegra SoC's
index 7df3134ebc0e1d4b88985132eda82f26b267f4f3..1d3756d3176ce58656999f8103a98e6256f9b2a5 100644 (file)
@@ -1610,7 +1610,7 @@ int max_width, max_height;</synopsis>
           The connector is then registered with a call to
           <function>drm_connector_init</function> with a pointer to the connector
           functions and a connector type, and exposed through sysfs with a call to
-          <function>drm_sysfs_connector_add</function>.
+          <function>drm_connector_register</function>.
         </para>
         <para>
           Supported connector types are
@@ -1768,7 +1768,7 @@ int max_width, max_height;</synopsis>
        (<function>drm_encoder_cleanup</function>) and connectors
        (<function>drm_connector_cleanup</function>). Furthermore, connectors
        that have been added to sysfs must be removed by a call to
-       <function>drm_sysfs_connector_remove</function> before calling
+       <function>drm_connector_unregister</function> before calling
        <function>drm_connector_cleanup</function>.
       </para>
       <para>
@@ -1813,7 +1813,7 @@ void intel_crt_init(struct drm_device *dev)
        drm_encoder_helper_add(&intel_output->enc, &intel_crt_helper_funcs);
        drm_connector_helper_add(connector, &intel_crt_connector_helper_funcs);
 
-       drm_sysfs_connector_add(connector);
+       drm_connector_register(connector);
 }]]></programlisting>
       <para>
         In the example above (taken from the i915 driver), a CRTC, connector and
@@ -2336,6 +2336,12 @@ void intel_crt_init(struct drm_device *dev)
 !Pdrivers/gpu/drm/drm_dp_helper.c dp helpers
 !Iinclude/drm/drm_dp_helper.h
 !Edrivers/gpu/drm/drm_dp_helper.c
+    </sect2>
+    <sect2>
+      <title>Display Port MST Helper Functions Reference</title>
+!Pdrivers/gpu/drm/drm_dp_mst_topology.c dp mst helper
+!Iinclude/drm/drm_dp_mst_helper.h
+!Edrivers/gpu/drm/drm_dp_mst_topology.c
     </sect2>
     <sect2>
       <title>EDID Helper Functions Reference</title>
@@ -2502,7 +2508,7 @@ void intel_crt_init(struct drm_device *dev)
        <td valign="top" >Description/Restrictions</td>
        </tr>
        <tr>
-       <td rowspan="20" valign="top" >DRM</td>
+       <td rowspan="21" valign="top" >DRM</td>
        <td rowspan="2" valign="top" >Generic</td>
        <td valign="top" >“EDID”</td>
        <td valign="top" >BLOB | IMMUTABLE</td>
@@ -2633,7 +2639,7 @@ void intel_crt_init(struct drm_device *dev)
        <td valign="top" >TBD</td>
        </tr>
        <tr>
-       <td rowspan="2" valign="top" >Optional</td>
+       <td rowspan="3" valign="top" >Optional</td>
        <td valign="top" >“scaling mode”</td>
        <td valign="top" >ENUM</td>
        <td valign="top" >{ "None", "Full", "Center", "Full aspect" }</td>
@@ -2641,6 +2647,15 @@ void intel_crt_init(struct drm_device *dev)
        <td valign="top" >TBD</td>
        </tr>
        <tr>
+       <td valign="top" >"aspect ratio"</td>
+       <td valign="top" >ENUM</td>
+       <td valign="top" >{ "None", "4:3", "16:9" }</td>
+       <td valign="top" >Connector</td>
+       <td valign="top" >DRM property to set aspect ratio from user space app.
+               This enum is made generic to allow addition of custom aspect
+               ratios.</td>
+       </tr>
+       <tr>
        <td valign="top" >“dirty”</td>
        <td valign="top" >ENUM | IMMUTABLE</td>
        <td valign="top" >{ "Off", "On", "Annotate" }</td>
@@ -2649,7 +2664,7 @@ void intel_crt_init(struct drm_device *dev)
        </tr>
        <tr>
        <td rowspan="21" valign="top" >i915</td>
-       <td rowspan="3" valign="top" >Generic</td>
+       <td rowspan="2" valign="top" >Generic</td>
        <td valign="top" >"Broadcast RGB"</td>
        <td valign="top" >ENUM</td>
        <td valign="top" >{ "Automatic", "Full", "Limited 16:235" }</td>
@@ -2664,10 +2679,11 @@ void intel_crt_init(struct drm_device *dev)
        <td valign="top" >TBD</td>
        </tr>
        <tr>
-       <td valign="top" >Standard name as in DRM</td>
-       <td valign="top" >Standard type as in DRM</td>
-       <td valign="top" >Standard value as in DRM</td>
-       <td valign="top" >Standard Object as in DRM</td>
+       <td rowspan="1" valign="top" >Plane</td>
+       <td valign="top" >“rotation”</td>
+       <td valign="top" >BITMASK</td>
+       <td valign="top" >{ 0, "rotate-0" }, { 2, "rotate-180" }</td>
+       <td valign="top" >Plane</td>
        <td valign="top" >TBD</td>
        </tr>
        <tr>
@@ -2799,8 +2815,8 @@ void intel_crt_init(struct drm_device *dev)
        <td valign="top" >TBD</td>
        </tr>
        <tr>
-       <td rowspan="3" valign="top" >CDV gma-500</td>
-       <td rowspan="3" valign="top" >Generic</td>
+       <td rowspan="2" valign="top" >CDV gma-500</td>
+       <td rowspan="2" valign="top" >Generic</td>
        <td valign="top" >"Broadcast RGB"</td>
        <td valign="top" >ENUM</td>
        <td valign="top" >{ “Full”, “Limited 16:235” }</td>
@@ -2815,15 +2831,8 @@ void intel_crt_init(struct drm_device *dev)
        <td valign="top" >TBD</td>
        </tr>
        <tr>
-       <td valign="top" >Standard name as in DRM</td>
-       <td valign="top" >Standard type as in DRM</td>
-       <td valign="top" >Standard value as in DRM</td>
-       <td valign="top" >Standard Object as in DRM</td>
-       <td valign="top" >TBD</td>
-       </tr>
-       <tr>
-       <td rowspan="20" valign="top" >Poulsbo</td>
-       <td rowspan="2" valign="top" >Generic</td>
+       <td rowspan="19" valign="top" >Poulsbo</td>
+       <td rowspan="1" valign="top" >Generic</td>
        <td valign="top" >“backlight”</td>
        <td valign="top" >RANGE</td>
        <td valign="top" >Min=0, Max=100</td>
@@ -2831,13 +2840,6 @@ void intel_crt_init(struct drm_device *dev)
        <td valign="top" >TBD</td>
        </tr>
        <tr>
-       <td valign="top" >Standard name as in DRM</td>
-       <td valign="top" >Standard type as in DRM</td>
-       <td valign="top" >Standard value as in DRM</td>
-       <td valign="top" >Standard Object as in DRM</td>
-       <td valign="top" >TBD</td>
-       </tr>
-       <tr>
        <td rowspan="17" valign="top" >SDVO-TV</td>
        <td valign="top" >“mode”</td>
        <td valign="top" >ENUM</td>
@@ -3064,7 +3066,7 @@ void intel_crt_init(struct drm_device *dev)
        <td valign="top" >TBD</td>
        </tr>
        <tr>
-       <td rowspan="3" valign="top" >i2c/ch7006_drv</td>
+       <td rowspan="2" valign="top" >i2c/ch7006_drv</td>
        <td valign="top" >Generic</td>
        <td valign="top" >“scale”</td>
        <td valign="top" >RANGE</td>
@@ -3073,14 +3075,7 @@ void intel_crt_init(struct drm_device *dev)
        <td valign="top" >TBD</td>
        </tr>
        <tr>
-       <td rowspan="2" valign="top" >TV</td>
-       <td valign="top" >Standard names as in DRM</td>
-       <td valign="top" >Standard types as in DRM</td>
-       <td valign="top" >Standard Values as in DRM</td>
-       <td valign="top" >Standard object as in DRM</td>
-       <td valign="top" >TBD</td>
-       </tr>
-       <tr>
+       <td rowspan="1" valign="top" >TV</td>
        <td valign="top" >“mode”</td>
        <td valign="top" >ENUM</td>
        <td valign="top" >{ "PAL", "PAL-M","PAL-N"}, ”PAL-Nc"
@@ -3089,7 +3084,7 @@ void intel_crt_init(struct drm_device *dev)
        <td valign="top" >TBD</td>
        </tr>
        <tr>
-       <td rowspan="16" valign="top" >nouveau</td>
+       <td rowspan="15" valign="top" >nouveau</td>
        <td rowspan="6" valign="top" >NV10 Overlay</td>
        <td valign="top" >"colorkey"</td>
        <td valign="top" >RANGE</td>
@@ -3198,14 +3193,6 @@ void intel_crt_init(struct drm_device *dev)
        <td valign="top" >TBD</td>
        </tr>
        <tr>
-       <td valign="top" >Generic</td>
-       <td valign="top" >Standard name as in DRM</td>
-       <td valign="top" >Standard type as in DRM</td>
-       <td valign="top" >Standard value as in DRM</td>
-       <td valign="top" >Standard Object as in DRM</td>
-       <td valign="top" >TBD</td>
-       </tr>
-       <tr>
        <td rowspan="2" valign="top" >omap</td>
        <td rowspan="2" valign="top" >Generic</td>
        <td valign="top" >“rotation”</td>
@@ -3236,7 +3223,7 @@ void intel_crt_init(struct drm_device *dev)
        <td valign="top" >TBD</td>
        </tr>
        <tr>
-       <td rowspan="10" valign="top" >radeon</td>
+       <td rowspan="9" valign="top" >radeon</td>
        <td valign="top" >DVI-I</td>
        <td valign="top" >“coherent”</td>
        <td valign="top" >RANGE</td>
@@ -3308,14 +3295,6 @@ void intel_crt_init(struct drm_device *dev)
        <td valign="top" >TBD</td>
        </tr>
        <tr>
-       <td valign="top" >Generic</td>
-       <td valign="top" >Standard name as in DRM</td>
-       <td valign="top" >Standard type as in DRM</td>
-       <td valign="top" >Standard value as in DRM</td>
-       <td valign="top" >Standard Object as in DRM</td>
-       <td valign="top" >TBD</td>
-       </tr>
-       <tr>
        <td rowspan="3" valign="top" >rcar-du</td>
        <td rowspan="3" valign="top" >Generic</td>
        <td valign="top" >"alpha"</td>
diff --git a/Documentation/arm/CCN.txt b/Documentation/arm/CCN.txt
new file mode 100644 (file)
index 0000000..0632b3a
--- /dev/null
@@ -0,0 +1,52 @@
+ARM Cache Coherent Network
+==========================
+
+CCN-504 is a ring-bus interconnect consisting of 11 crosspoints
+(XPs), with each crosspoint supporting up to two device ports,
+so nodes (devices) 0 and 1 are connected to crosspoint 0,
+nodes 2 and 3 to crosspoint 1 etc.
+
+PMU (perf) driver
+-----------------
+
+The CCN driver registers a perf PMU driver, which provides
+description of available events and configuration options
+in sysfs, see /sys/bus/event_source/devices/ccn*.
+
+The "format" directory describes format of the config, config1
+and config2 fields of the perf_event_attr structure. The "events"
+directory provides configuration templates for all documented
+events, that can be used with perf tool. For example "xp_valid_flit"
+is an equivalent of "type=0x8,event=0x4". Other parameters must be
+explicitly specified. For events originating from device, "node"
+defines its index. All crosspoint events require "xp" (index),
+"port" (device port number) and "vc" (virtual channel ID) and
+"dir" (direction). Watchpoints (special "event" value 0xfe) also
+require comparator values ("cmp_l" and "cmp_h") and "mask", being
+index of the comparator mask.
+
+Masks are defined separately from the event description
+(due to limited number of the config values) in the "cmp_mask"
+directory, with first 8 configurable by user and additional
+4 hardcoded for the most frequent use cases.
+
+Cycle counter is described by a "type" value 0xff and does
+not require any other settings.
+
+Example of perf tool use:
+
+/ # perf list | grep ccn
+  ccn/cycles/                                        [Kernel PMU event]
+<...>
+  ccn/xp_valid_flit/                                 [Kernel PMU event]
+<...>
+
+/ # perf stat -C 0 -e ccn/cycles/,ccn/xp_valid_flit,xp=1,port=0,vc=1,dir=1/ \
+                                                                       sleep 1
+
+The driver does not support sampling, therefore "perf record" will
+not work. Also notice that only single cpu is being selected
+("-C 0") - this is because perf framework does not support
+"non-CPU related" counters (yet?) so system-wide session ("-a")
+would try (and in most cases fail) to set up the same event
+per each CPU.
index 2cce5401e323ff0bc88ed98557babbd2a963234e..4dc66c173e10914ce0dddb7d77d4e9abb3541f78 100644 (file)
@@ -53,8 +53,8 @@ Kirkwood family
                 Functional Spec: http://www.marvell.com/embedded-processors/kirkwood/assets/FS_88F6180_9x_6281_OpenSource.pdf
   Homepage: http://www.marvell.com/embedded-processors/kirkwood/
   Core: Feroceon ARMv5 compatible
-  Linux kernel mach directory: arch/arm/mach-kirkwood
-  Linux kernel plat directory: arch/arm/plat-orion
+  Linux kernel mach directory: arch/arm/mach-mvebu
+  Linux kernel plat directory: none
 
 Discovery family
 ----------------
@@ -83,7 +83,9 @@ EBU Armada family
         88F6710
         88F6707
         88F6W11
-    Product Brief: http://www.marvell.com/embedded-processors/armada-300/assets/Marvell_ARMADA_370_SoC.pdf
+    Product Brief:   http://www.marvell.com/embedded-processors/armada-300/assets/Marvell_ARMADA_370_SoC.pdf
+    Hardware Spec:   http://www.marvell.com/embedded-processors/armada-300/assets/ARMADA370-datasheet.pdf
+    Functional Spec: http://www.marvell.com/embedded-processors/armada-300/assets/ARMADA370-FunctionalSpec-datasheet.pdf
 
   Armada 375 Flavors:
        88F6720
@@ -100,8 +102,7 @@ EBU Armada family
         MV78460
     NOTE: not to be confused with the non-SMP 78xx0 SoCs
     Product Brief: http://www.marvell.com/embedded-processors/armada-xp/assets/Marvell-ArmadaXP-SoC-product%20brief.pdf
-
-  No public datasheet available.
+    Functional Spec: http://www.marvell.com/embedded-processors/armada-xp/assets/ARMADA-XP-Functional-SpecDatasheet.pdf
 
   Core: Sheeva ARMv7 compatible
 
@@ -135,7 +136,9 @@ Dove family (application processor)
                 Functional Spec : http://www.marvell.com/application-processors/armada-500/assets/Armada-510-Functional-Spec.pdf
   Homepage: http://www.marvell.com/application-processors/armada-500/
   Core: ARMv7 compatible
-  Directory: arch/arm/mach-dove
+
+  Directory: arch/arm/mach-mvebu (DT enabled platforms)
+             arch/arm/mach-dove (non-DT enabled platforms)
 
 PXA 2xx/3xx/93x/95x family
 --------------------------
@@ -253,10 +256,10 @@ Berlin family (Digital Entertainment)
 Long-term plans
 ---------------
 
- * Unify the mach-dove/, mach-mv78xx0/, mach-orion5x/ and
-   mach-kirkwood/ into the mach-mvebu/ to support all SoCs from the
-   Marvell EBU (Engineering Business Unit) in a single mach-<foo>
-   directory. The plat-orion/ would therefore disappear.
+ * Unify the mach-dove/, mach-mv78xx0/, mach-orion5x/ into the
+   mach-mvebu/ to support all SoCs from the Marvell EBU (Engineering
+   Business Unit) in a single mach-<foo> directory. The plat-orion/
+   would therefore disappear.
 
  * Unify the mach-mmp/ and mach-pxa/ into the same mach-pxa
    directory. The plat-pxa/ would therefore disappear.
index 658abb258cefab1e8d5a1e9f0003b904a69e8b7b..8f7309bad4600982b928618d43059f359c64c9a8 100644 (file)
@@ -13,8 +13,6 @@ Introduction
 
   - S3C24XX: See Documentation/arm/Samsung-S3C24XX/Overview.txt for full list
   - S3C64XX: S3C6400 and S3C6410
-  - S5P6440
-  - S5PC100
   - S5PC110 / S5PV210
 
 
@@ -34,8 +32,6 @@ Configuration
   A number of configurations are supplied, as there is no current way of
   unifying all the SoCs into one kernel.
 
-  s5p6440_defconfig - S5P6440 specific default configuration
-  s5pc100_defconfig - S5PC100 specific default configuration
   s5pc110_defconfig - S5PC110 specific default configuration
   s5pv210_defconfig - S5PV210 specific default configuration
 
@@ -67,13 +63,6 @@ Layout changes
   where to simplify the include and dependency issues involved with having
   so many different platform directories.
 
-  It was decided to remove plat-s5pc1xx as some of the support was already
-  in plat-s5p or plat-samsung, with the S5PC110 support added with S5PV210
-  the only user was the S5PC100. The S5PC100 specific items where moved to
-  arch/arm/mach-s5pc100.
-
-
-
 
 Port Contributors
 -----------------
index 0c50220851fbd3ea718eb0964825083ba8a42ffa..d9174fabe37e618f30559d00f69b2e322be0d59a 100755 (executable)
@@ -68,7 +68,6 @@ BEGIN {
 
     while (getline line < ARGV[1] > 0) {
        if (line ~ /\#define.*_MASK/ &&
-           !(line ~ /S5PC100_EPLL_MASK/) &&
            !(line ~ /USB_SIG_MASK/)) {
            splitdefine(line, fields)
            name = fields[0]
index 85af34d55cee69f34c7a360bde50693b741eae14..f3c05b5f9f08df8bf3cfe669615c29767ff2f4b5 100644 (file)
@@ -168,6 +168,14 @@ Before jumping into the kernel, the following conditions must be met:
   the kernel image will be entered must be initialised by software at a
   higher exception level to prevent execution in an UNKNOWN state.
 
+  For systems with a GICv3 interrupt controller:
+  - If EL3 is present:
+    ICC_SRE_EL3.Enable (bit 3) must be initialiased to 0b1.
+    ICC_SRE_EL3.SRE (bit 0) must be initialised to 0b1.
+  - If the kernel is entered at EL1:
+    ICC.SRE_EL2.Enable (bit 3) must be initialised to 0b1
+    ICC_SRE_EL2.SRE (bit 0) must be initialised to 0b1.
+
 The requirements described above for CPU mode, caches, MMUs, architected
 timers, coherency and system registers apply to all CPUs.  All CPUs must
 enter the kernel in the same exception level.
diff --git a/Documentation/devicetree/bindings/arm/adapteva.txt b/Documentation/devicetree/bindings/arm/adapteva.txt
new file mode 100644 (file)
index 0000000..1d8af9e
--- /dev/null
@@ -0,0 +1,7 @@
+Adapteva Platforms Device Tree Bindings
+---------------------------------------
+
+Parallella board
+
+Required root node properties:
+    - compatible = "adapteva,parallella";
index 3509707f932085a8380576ee4c6b63a453dab1a7..c554ed3d44fb7c77f8ae19c441a57f5d05853ef8 100644 (file)
@@ -86,3 +86,9 @@ Interrupt controllers:
        compatible = "arm,versatile-sic";
        interrupt-controller;
        #interrupt-cells = <1>;
+
+Required nodes:
+
+- core-module: the root node to the Versatile platforms must have
+  a core-module with regs and the compatible strings
+  "arm,core-module-versatile", "syscon"
diff --git a/Documentation/devicetree/bindings/arm/armada-380-mpcore-soc-ctrl.txt b/Documentation/devicetree/bindings/arm/armada-380-mpcore-soc-ctrl.txt
new file mode 100644 (file)
index 0000000..8781073
--- /dev/null
@@ -0,0 +1,14 @@
+Marvell Armada 38x CA9 MPcore SoC Controller
+============================================
+
+Required properties:
+
+- compatible: Should be "marvell,armada-380-mpcore-soc-ctrl".
+
+- reg: should be the register base and length as documented in the
+  datasheet for the CA9 MPcore SoC Control registers
+
+mpcore-soc-ctrl@20d20 {
+       compatible = "marvell,armada-380-mpcore-soc-ctrl";
+       reg = <0x20d20 0x6c>;
+};
index 389bed5056e8ec8e6bdcf5806b60b9db3a2c4150..795cc78543fef174df669bf1830ecf03bdb6bb9a 100644 (file)
@@ -1,7 +1,10 @@
 * Power Management Controller (PMC)
 
 Required properties:
-- compatible: Should be "atmel,at91rm9200-pmc"
+- compatible: Should be "atmel,<chip>-pmc".
+       <chip> can be: at91rm9200, at91sam9260, at91sam9g45, at91sam9n12,
+       at91sam9x5, sama5d3
+
 - reg: Should contain PMC registers location and length
 
 Examples:
diff --git a/Documentation/devicetree/bindings/arm/bcm/brcm,bcm11351-cpu-method b/Documentation/devicetree/bindings/arm/bcm/brcm,bcm11351-cpu-method
new file mode 100644 (file)
index 0000000..8240c02
--- /dev/null
@@ -0,0 +1,36 @@
+Broadcom Kona Family CPU Enable Method
+--------------------------------------
+This binding defines the enable method used for starting secondary
+CPUs in the following Broadcom SoCs:
+  BCM11130, BCM11140, BCM11351, BCM28145, BCM28155, BCM21664
+
+The enable method is specified by defining the following required
+properties in the "cpus" device tree node:
+  - enable-method = "brcm,bcm11351-cpu-method";
+  - secondary-boot-reg = <...>;
+
+The secondary-boot-reg property is a u32 value that specifies the
+physical address of the register used to request the ROM holding pen
+code release a secondary CPU.  The value written to the register is
+formed by encoding the target CPU id into the low bits of the
+physical start address it should jump to.
+
+Example:
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+               enable-method = "brcm,bcm11351-cpu-method";
+               secondary-boot-reg = <0x3500417c>;
+
+               cpu0: cpu@0 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a9";
+                       reg = <0>;
+               };
+
+               cpu1: cpu@1 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a9";
+                       reg = <1>;
+               };
+       };
diff --git a/Documentation/devicetree/bindings/arm/brcm-brcmstb.txt b/Documentation/devicetree/bindings/arm/brcm-brcmstb.txt
new file mode 100644 (file)
index 0000000..3c436cc
--- /dev/null
@@ -0,0 +1,95 @@
+ARM Broadcom STB platforms Device Tree Bindings
+-----------------------------------------------
+Boards with Broadcom Brahma15 ARM-based BCMxxxx (generally BCM7xxx variants)
+SoC shall have the following DT organization:
+
+Required root node properties:
+    - compatible: "brcm,bcm<chip_id>", "brcm,brcmstb"
+
+example:
+/ {
+    #address-cells = <2>;
+    #size-cells = <2>;
+    model = "Broadcom STB (bcm7445)";
+    compatible = "brcm,bcm7445", "brcm,brcmstb";
+
+Further, syscon nodes that map platform-specific registers used for general
+system control is required:
+
+    - compatible: "brcm,bcm<chip_id>-sun-top-ctrl", "syscon"
+    - compatible: "brcm,bcm<chip_id>-hif-cpubiuctrl", "syscon"
+    - compatible: "brcm,bcm<chip_id>-hif-continuation", "syscon"
+
+example:
+    rdb {
+        #address-cells = <1>;
+        #size-cells = <1>;
+        compatible = "simple-bus";
+        ranges = <0 0x00 0xf0000000 0x1000000>;
+
+        sun_top_ctrl: syscon@404000 {
+            compatible = "brcm,bcm7445-sun-top-ctrl", "syscon";
+            reg = <0x404000 0x51c>;
+        };
+
+        hif_cpubiuctrl: syscon@3e2400 {
+            compatible = "brcm,bcm7445-hif-cpubiuctrl", "syscon";
+            reg = <0x3e2400 0x5b4>;
+        };
+
+        hif_continuation: syscon@452000 {
+            compatible = "brcm,bcm7445-hif-continuation", "syscon";
+            reg = <0x452000 0x100>;
+        };
+    };
+
+Lastly, nodes that allow for support of SMP initialization and reboot are
+required:
+
+smpboot
+-------
+Required properties:
+
+    - compatible
+        The string "brcm,brcmstb-smpboot".
+
+    - syscon-cpu
+        A phandle / integer array property which lets the BSP know the location
+        of certain CPU power-on registers.
+
+        The layout of the property is as follows:
+            o a phandle to the "hif_cpubiuctrl" syscon node
+            o offset to the base CPU power zone register
+            o offset to the base CPU reset register
+
+    - syscon-cont
+        A phandle pointing to the syscon node which describes the CPU boot
+        continuation registers.
+            o a phandle to the "hif_continuation" syscon node
+
+example:
+    smpboot {
+        compatible = "brcm,brcmstb-smpboot";
+        syscon-cpu = <&hif_cpubiuctrl 0x88 0x178>;
+        syscon-cont = <&hif_continuation>;
+    };
+
+reboot
+-------
+Required properties
+
+    - compatible
+        The string property "brcm,brcmstb-reboot".
+
+    - syscon
+        A phandle / integer array that points to the syscon node which describes
+        the general system reset registers.
+            o a phandle to "sun_top_ctrl"
+            o offset to the "reset source enable" register
+            o offset to the "software master reset" register
+
+example:
+    reboot {
+        compatible = "brcm,brcmstb-reboot";
+        syscon = <&sun_top_ctrl 0x304 0x308>;
+    };
diff --git a/Documentation/devicetree/bindings/arm/ccn.txt b/Documentation/devicetree/bindings/arm/ccn.txt
new file mode 100644 (file)
index 0000000..b100d38
--- /dev/null
@@ -0,0 +1,21 @@
+* ARM CCN (Cache Coherent Network)
+
+Required properties:
+
+- compatible: (standard compatible string) should be one of:
+       "arm,ccn-504"
+       "arm,ccn-508"
+
+- reg: (standard registers property) physical address and size
+       (16MB) of the configuration registers block
+
+- interrupts: (standard interrupt property) single interrupt
+       generated by the control block
+
+Example:
+
+       ccn@0x2000000000 {
+               compatible = "arm,ccn-504";
+               reg = <0x20 0x00000000 0 0x1000000>;
+               interrupts = <0 181 4>;
+       };
diff --git a/Documentation/devicetree/bindings/arm/cpu-enable-method/marvell,berlin-smp b/Documentation/devicetree/bindings/arm/cpu-enable-method/marvell,berlin-smp
new file mode 100644 (file)
index 0000000..cd236b7
--- /dev/null
@@ -0,0 +1,41 @@
+========================================================
+Secondary CPU enable-method "marvell,berlin-smp" binding
+========================================================
+
+This document describes the "marvell,berlin-smp" method for enabling secondary
+CPUs. To apply to all CPUs, a single "marvell,berlin-smp" enable method should
+be defined in the "cpus" node.
+
+Enable method name:    "marvell,berlin-smp"
+Compatible machines:   "marvell,berlin2" and "marvell,berlin2q"
+Compatible CPUs:       "marvell,pj4b" and "arm,cortex-a9"
+Related properties:    (none)
+
+Note:
+This enable method needs valid nodes compatible with "arm,cortex-a9-scu" and
+"marvell,berlin-cpu-ctrl"[1].
+
+Example:
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+               enable-method = "marvell,berlin-smp";
+
+               cpu@0 {
+                       compatible = "marvell,pj4b";
+                       device_type = "cpu";
+                       next-level-cache = <&l2>;
+                       reg = <0>;
+               };
+
+               cpu@1 {
+                       compatible = "marvell,pj4b";
+                       device_type = "cpu";
+                       next-level-cache = <&l2>;
+                       reg = <1>;
+               };
+       };
+
+--
+[1] arm/marvell,berlin.txt
index 1fe72a0778cd9725ab34ada1b0b27b068f9024e1..298e2f6b33c63a3ce1241b71dce1c2d65164c1b3 100644 (file)
@@ -152,7 +152,9 @@ nodes to be present and contain the properties described below.
                            "arm,cortex-a7"
                            "arm,cortex-a8"
                            "arm,cortex-a9"
+                           "arm,cortex-a12"
                            "arm,cortex-a15"
+                           "arm,cortex-a17"
                            "arm,cortex-a53"
                            "arm,cortex-a57"
                            "arm,cortex-m0"
@@ -163,6 +165,7 @@ nodes to be present and contain the properties described below.
                            "arm,cortex-r4"
                            "arm,cortex-r5"
                            "arm,cortex-r7"
+                           "brcm,brahma-b15"
                            "faraday,fa526"
                            "intel,sa110"
                            "intel,sa1100"
@@ -184,6 +187,7 @@ nodes to be present and contain the properties described below.
                          can be one of:
                            "allwinner,sun6i-a31"
                            "arm,psci"
+                           "brcm,brahma-b15"
                            "marvell,armada-375-smp"
                            "marvell,armada-380-smp"
                            "marvell,armada-xp-smp"
diff --git a/Documentation/devicetree/bindings/arm/gic-v3.txt b/Documentation/devicetree/bindings/arm/gic-v3.txt
new file mode 100644 (file)
index 0000000..33cd05e
--- /dev/null
@@ -0,0 +1,79 @@
+* ARM Generic Interrupt Controller, version 3
+
+AArch64 SMP cores are often associated with a GICv3, providing Private
+Peripheral Interrupts (PPI), Shared Peripheral Interrupts (SPI),
+Software Generated Interrupts (SGI), and Locality-specific Peripheral
+Interrupts (LPI).
+
+Main node required properties:
+
+- compatible : should at least contain  "arm,gic-v3".
+- interrupt-controller : Identifies the node as an interrupt controller
+- #interrupt-cells : Specifies the number of cells needed to encode an
+  interrupt source. Must be a single cell with a value of at least 3.
+
+  The 1st cell is the interrupt type; 0 for SPI interrupts, 1 for PPI
+  interrupts. Other values are reserved for future use.
+
+  The 2nd cell contains the interrupt number for the interrupt type.
+  SPI interrupts are in the range [0-987]. PPI interrupts are in the
+  range [0-15].
+
+  The 3rd cell is the flags, encoded as follows:
+       bits[3:0] trigger type and level flags.
+               1 = edge triggered
+               4 = level triggered
+
+  Cells 4 and beyond are reserved for future use. When the 1st cell
+  has a value of 0 or 1, cells 4 and beyond act as padding, and may be
+  ignored. It is recommended that padding cells have a value of 0.
+
+- reg : Specifies base physical address(s) and size of the GIC
+  registers, in the following order:
+  - GIC Distributor interface (GICD)
+  - GIC Redistributors (GICR), one range per redistributor region
+  - GIC CPU interface (GICC)
+  - GIC Hypervisor interface (GICH)
+  - GIC Virtual CPU interface (GICV)
+
+  GICC, GICH and GICV are optional.
+
+- interrupts : Interrupt source of the VGIC maintenance interrupt.
+
+Optional
+
+- redistributor-stride : If using padding pages, specifies the stride
+  of consecutive redistributors. Must be a multiple of 64kB.
+
+- #redistributor-regions: The number of independent contiguous regions
+  occupied by the redistributors. Required if more than one such
+  region is present.
+
+Examples:
+
+       gic: interrupt-controller@2cf00000 {
+               compatible = "arm,gic-v3";
+               #interrupt-cells = <3>;
+               interrupt-controller;
+               reg = <0x0 0x2f000000 0 0x10000>,       // GICD
+                     <0x0 0x2f100000 0 0x200000>,      // GICR
+                     <0x0 0x2c000000 0 0x2000>,        // GICC
+                     <0x0 0x2c010000 0 0x2000>,        // GICH
+                     <0x0 0x2c020000 0 0x2000>;        // GICV
+               interrupts = <1 9 4>;
+       };
+
+       gic: interrupt-controller@2c010000 {
+               compatible = "arm,gic-v3";
+               #interrupt-cells = <3>;
+               interrupt-controller;
+               redistributor-stride = <0x0 0x40000>;   // 256kB stride
+               #redistributor-regions = <2>;
+               reg = <0x0 0x2c010000 0 0x10000>,       // GICD
+                     <0x0 0x2d000000 0 0x800000>,      // GICR 1: CPUs 0-31
+                     <0x0 0x2e000000 0 0x800000>;      // GICR 2: CPUs 32-63
+                     <0x0 0x2c040000 0 0x2000>,        // GICC
+                     <0x0 0x2c060000 0 0x2000>,        // GICH
+                     <0x0 0x2c080000 0 0x2000>;        // GICV
+               interrupts = <1 9 4>;
+       };
index 5573c08d3180b301a80990930c0da6259deff94f..c7d2fa15667826ac5d30455e89dc213085735759 100644 (file)
@@ -16,6 +16,7 @@ Main node required properties:
        "arm,cortex-a9-gic"
        "arm,cortex-a7-gic"
        "arm,arm11mp-gic"
+       "brcm,brahma-b15-gic"
 - interrupt-controller : Identifies the node as an interrupt controller
 - #interrupt-cells : Specifies the number of cells needed to encode an
   interrupt source.  The type shall be a <u32> and the value shall be 3.
index df0a452b8526de02bc935f235123acb7ae87b54c..934f00025cc4cad127340b485f3eaeb411964802 100644 (file)
@@ -31,6 +31,17 @@ Example:
                reboot-offset = <0x4>;
        };
 
+-----------------------------------------------------------------------
+Hisilicon CPU controller
+
+Required properties:
+- compatible : "hisilicon,cpuctrl"
+- reg : Register address and size
+
+The clock registers and power registers of secondary cores are defined
+in CPU controller, especially in HIX5HD2 SoC.
+
+-----------------------------------------------------------------------
 PCTRL: Peripheral misc control register
 
 Required Properties:
index 94013a9a8769a714a544403029cd23a21e2bf402..904de5781f44d9dd10efae916101e1fac7835274 100644 (file)
@@ -24,6 +24,22 @@ SoC and board used. Currently known SoC compatibles are:
        ...
 }
 
+* Marvell Berlin CPU control bindings
+
+CPU control register allows various operations on CPUs, like resetting them
+independently.
+
+Required properties:
+- compatible: should be "marvell,berlin-cpu-ctrl"
+- reg: address and length of the register set
+
+Example:
+
+cpu-ctrl@f7dd0000 {
+       compatible = "marvell,berlin-cpu-ctrl";
+       reg = <0xf7dd0000 0x10000>;
+};
+
 * Marvell Berlin2 chip control binding
 
 Marvell Berlin SoCs have a chip control register set providing several
diff --git a/Documentation/devicetree/bindings/arm/mediatek.txt b/Documentation/devicetree/bindings/arm/mediatek.txt
new file mode 100644 (file)
index 0000000..d6ac71f
--- /dev/null
@@ -0,0 +1,8 @@
+Mediatek MT6589 Platforms Device Tree Bindings
+
+Boards with a SoC of the Mediatek MT6589 shall have the following property:
+
+Required root node property:
+
+compatible: must contain "mediatek,mt6589"
+
index d22b216f5d230f57812f98034580c603b4a6e30d..0edc90305dfe07b262d7f493de3b964f7635c06d 100644 (file)
@@ -129,6 +129,9 @@ Boards:
 - AM437x GP EVM
   compatible = "ti,am437x-gp-evm", "ti,am4372", "ti,am43"
 
+- AM437x SK EVM: AM437x StarterKit Evaluation Module
+  compatible = "ti,am437x-sk-evm", "ti,am4372", "ti,am43"
+
 - DRA742 EVM:  Software Development Board for DRA742
   compatible = "ti,dra7-evm", "ti,dra742", "ti,dra74", "ti,dra7"
 
diff --git a/Documentation/devicetree/bindings/arm/omap/prcm.txt b/Documentation/devicetree/bindings/arm/omap/prcm.txt
new file mode 100644 (file)
index 0000000..79074da
--- /dev/null
@@ -0,0 +1,65 @@
+OMAP PRCM bindings
+
+Power Reset and Clock Manager lists the device clocks and clockdomains under
+a DT hierarchy. Each TI SoC can have multiple PRCM entities listed for it,
+each describing one module and the clock hierarchy under it. see [1] for
+documentation about the individual clock/clockdomain nodes.
+
+[1] Documentation/devicetree/bindings/clock/ti/*
+
+Required properties:
+- compatible:  Must be one of:
+               "ti,am3-prcm"
+               "ti,am3-scrm"
+               "ti,am4-prcm"
+               "ti,am4-scrm"
+               "ti,omap2-prcm"
+               "ti,omap2-scrm"
+               "ti,omap3-prm"
+               "ti,omap3-cm"
+               "ti,omap3-scrm"
+               "ti,omap4-cm1"
+               "ti,omap4-prm"
+               "ti,omap4-cm2"
+               "ti,omap4-scrm"
+               "ti,omap5-prm"
+               "ti,omap5-cm-core-aon"
+               "ti,omap5-scrm"
+               "ti,omap5-cm-core"
+               "ti,dra7-prm"
+               "ti,dra7-cm-core-aon"
+               "ti,dra7-cm-core"
+- reg:         Contains PRCM module register address range
+               (base address and length)
+- clocks:      clocks for this module
+- clockdomains:        clockdomains for this module
+
+Example:
+
+cm: cm@48004000 {
+       compatible = "ti,omap3-cm";
+       reg = <0x48004000 0x4000>;
+
+       cm_clocks: clocks {
+               #address-cells = <1>;
+               #size-cells = <0>;
+       };
+
+       cm_clockdomains: clockdomains {
+       };
+}
+
+&cm_clocks {
+       omap2_32k_fck: omap_32k_fck {
+               #clock-cells = <0>;
+               compatible = "fixed-clock";
+               clock-frequency = <32768>;
+       };
+};
+
+&cm_clockdomains {
+       core_l3_clkdm: core_l3_clkdm {
+               compatible = "ti,clockdomain";
+               clocks = <&sdrc_ick>;
+       };
+};
index f9865e77e0b026fb4f8636f3a8c5286add9995d0..1e1979b229ffc793fb5633166363cd6e2a54a8ee 100644 (file)
@@ -7,6 +7,8 @@ Properties:
                   - "samsung,exynos4212-pmu" - for Exynos4212 SoC,
                   - "samsung,exynos4412-pmu" - for Exynos4412 SoC,
                   - "samsung,exynos5250-pmu" - for Exynos5250 SoC,
+                  - "samsung,exynos5260-pmu" - for Exynos5260 SoC.
+                  - "samsung,exynos5410-pmu" - for Exynos5410 SoC,
                   - "samsung,exynos5420-pmu" - for Exynos5420 SoC.
                second value must be always "syscon".
 
diff --git a/Documentation/devicetree/bindings/arm/spear-misc.txt b/Documentation/devicetree/bindings/arm/spear-misc.txt
new file mode 100644 (file)
index 0000000..cf64982
--- /dev/null
@@ -0,0 +1,9 @@
+SPEAr Misc configuration
+===========================
+SPEAr SOCs have some miscellaneous registers which are used to configure
+few properties of different peripheral controllers.
+
+misc node required properties:
+
+- compatible Should be "st,spear1340-misc", "syscon".
+- reg: Address range of misc space upto 8K
index 558ed4b4ef391faffe47afe815012f43ff13080b..73278c6d2dc3fe40d23dcfc7060ef4005eca9bfa 100644 (file)
@@ -30,6 +30,8 @@ board-specific compatible values:
   nvidia,seaboard
   nvidia,ventana
   nvidia,whistler
+  toradex,apalis_t30
+  toradex,apalis_t30-eval
   toradex,colibri_t20-512
   toradex,iris
 
index 6f1ed830b4f780838263d5f459f085d0734c8799..1f799535788859516c04adb9dea821f55a0aaa83 100644 (file)
@@ -1,7 +1,7 @@
-Xilinx Zynq EP107 Emulation Platform board
+Xilinx Zynq Platforms Device Tree Bindings
 
-This board is an emulation platform for the Zynq product which is
-based on an ARM Cortex A9 processor.
+Boards with Zynq-7000 SOC based on an ARM Cortex A9 processor
+shall have the following properties.
 
 Required root node properties:
-    - compatible = "xlnx,zynq-ep107";
+    - compatible = "xlnx,zynq-7000";
index 652914b17b9557cb8a6e9721e15b6ace744b5791..ecc69520bceaa11542e8b7905dc3a52e1dc754a5 100644 (file)
@@ -1,4 +1,4 @@
-Clock bindings for ARM Integrator Core Module clocks
+Clock bindings for ARM Integrator and Versatile Core Module clocks
 
 Auxilary Oscillator Clock
 
@@ -12,7 +12,7 @@ parent node.
 
 
 Required properties:
-- compatible: must be "arm,integrator-cm-auxosc"
+- compatible: must be "arm,integrator-cm-auxosc" or "arm,versatile-cm-auxosc"
 - #clock-cells: must be <0>
 
 Optional properties:
diff --git a/Documentation/devicetree/bindings/clock/clk-s5pv210-audss.txt b/Documentation/devicetree/bindings/clock/clk-s5pv210-audss.txt
new file mode 100644 (file)
index 0000000..4fc869b
--- /dev/null
@@ -0,0 +1,53 @@
+* Samsung Audio Subsystem Clock Controller
+
+The Samsung Audio Subsystem clock controller generates and supplies clocks
+to Audio Subsystem block available in the S5PV210 and compatible SoCs.
+
+Required Properties:
+
+- compatible: should be "samsung,s5pv210-audss-clock".
+- reg: physical base address and length of the controller's register set.
+
+- #clock-cells: should be 1.
+
+- clocks:
+  - hclk: AHB bus clock of the Audio Subsystem.
+  - xxti: Optional fixed rate PLL reference clock, parent of mout_audss. If
+    not specified (i.e. xusbxti is used for PLL reference), it is fixed to
+    a clock named "xxti".
+  - fout_epll: Input PLL to the AudioSS block, parent of mout_audss.
+  - iiscdclk0: Optional external i2s clock, parent of mout_i2s. If not
+    specified, it is fixed to a clock named "iiscdclk0".
+  - sclk_audio0: Audio bus clock, parent of mout_i2s.
+
+- clock-names: Aliases for the above clocks. They should be "hclk",
+  "xxti", "fout_epll", "iiscdclk0", and "sclk_audio0" respectively.
+
+All available clocks are defined as preprocessor macros in
+dt-bindings/clock/s5pv210-audss-clk.h header and can be used in device
+tree sources.
+
+Example: Clock controller node.
+
+       clk_audss: clock-controller@c0900000 {
+               compatible = "samsung,s5pv210-audss-clock";
+               reg = <0xc0900000 0x1000>;
+               #clock-cells = <1>;
+               clock-names = "hclk", "xxti",
+                               "fout_epll", "sclk_audio0";
+               clocks = <&clocks DOUT_HCLKP>, <&xxti>,
+                               <&clocks FOUT_EPLL>, <&clocks SCLK_AUDIO0>;
+       };
+
+Example: I2S controller node that consumes the clock generated by the clock
+        controller. Refer to the standard clock bindings for information
+         about 'clocks' and 'clock-names' property.
+
+       i2s0: i2s@03830000 {
+               /* ... */
+               clock-names = "iis", "i2s_opclk0",
+                               "i2s_opclk1";
+               clocks = <&clk_audss CLK_I2S>, <&clk_audss CLK_I2S>,
+                               <&clk_audss CLK_DOUT_AUD_BUS>;
+               /* ... */
+       };
diff --git a/Documentation/devicetree/bindings/clock/imx1-clock.txt b/Documentation/devicetree/bindings/clock/imx1-clock.txt
new file mode 100644 (file)
index 0000000..b7adf4e
--- /dev/null
@@ -0,0 +1,26 @@
+* Clock bindings for Freescale i.MX1 CPUs
+
+Required properties:
+- compatible: Should be "fsl,imx1-ccm".
+- reg: Address and length of the register set.
+- #clock-cells: Should be <1>.
+
+The clock consumer should specify the desired clock by having the clock
+ID in its "clocks" phandle cell. See include/dt-bindings/clock/imx1-clock.h
+for the full list of i.MX1 clock IDs.
+
+Examples:
+       clks: ccm@0021b000 {
+               #clock-cells = <1>;
+               compatible = "fsl,imx1-ccm";
+               reg = <0x0021b000 0x1000>;
+       };
+
+       pwm: pwm@00208000 {
+               #pwm-cells = <2>;
+               compatible = "fsl,imx1-pwm";
+               reg = <0x00208000 0x1000>;
+               interrupts = <34>;
+               clocks = <&clks IMX1_CLK_DUMMY>, <&clks IMX1_CLK_PER1>;
+               clock-names = "ipg", "per";
+       };
diff --git a/Documentation/devicetree/bindings/clock/imx21-clock.txt b/Documentation/devicetree/bindings/clock/imx21-clock.txt
new file mode 100644 (file)
index 0000000..c3b0db4
--- /dev/null
@@ -0,0 +1,28 @@
+* Clock bindings for Freescale i.MX21
+
+Required properties:
+- compatible  : Should be "fsl,imx21-ccm".
+- reg         : Address and length of the register set.
+- interrupts  : Should contain CCM interrupt.
+- #clock-cells: Should be <1>.
+
+The clock consumer should specify the desired clock by having the clock
+ID in its "clocks" phandle cell. See include/dt-bindings/clock/imx21-clock.h
+for the full list of i.MX21 clock IDs.
+
+Examples:
+       clks: ccm@10027000{
+               compatible = "fsl,imx21-ccm";
+               reg = <0x10027000 0x800>;
+               #clock-cells = <1>;
+       };
+
+       uart1: serial@1000a000 {
+               compatible = "fsl,imx21-uart";
+               reg = <0x1000a000 0x1000>;
+               interrupts = <20>;
+               clocks = <&clks IMX21_CLK_UART1_IPG_GATE>,
+                        <&clks IMX21_CLK_PER1>;
+               clock-names = "ipg", "per";
+               status = "disabled";
+       };
index 6bc9fd2c6631435f74267f7c8b97e54d55eeeda1..cc05de9ec393574c740f77d1b74ed6694fcb9b80 100644 (file)
@@ -7,117 +7,22 @@ Required properties:
 - #clock-cells: Should be <1>
 
 The clock consumer should specify the desired clock by having the clock
-ID in its "clocks" phandle cell.  The following is a full list of i.MX27
-clocks and IDs.
-
-       Clock               ID
-       -----------------------
-       dummy                0
-       ckih                 1
-       ckil                 2
-       mpll                 3
-       spll                 4
-       mpll_main2           5
-       ahb                  6
-       ipg                  7
-       nfc_div              8
-       per1_div             9
-       per2_div             10
-       per3_div             11
-       per4_div             12
-       vpu_sel              13
-       vpu_div              14
-       usb_div              15
-       cpu_sel              16
-       clko_sel             17
-       cpu_div              18
-       clko_div             19
-       ssi1_sel             20
-       ssi2_sel             21
-       ssi1_div             22
-       ssi2_div             23
-       clko_en              24
-       ssi2_ipg_gate        25
-       ssi1_ipg_gate        26
-       slcdc_ipg_gate       27
-       sdhc3_ipg_gate       28
-       sdhc2_ipg_gate       29
-       sdhc1_ipg_gate       30
-       scc_ipg_gate         31
-       sahara_ipg_gate      32
-       rtc_ipg_gate         33
-       pwm_ipg_gate         34
-       owire_ipg_gate       35
-       lcdc_ipg_gate        36
-       kpp_ipg_gate         37
-       iim_ipg_gate         38
-       i2c2_ipg_gate        39
-       i2c1_ipg_gate        40
-       gpt6_ipg_gate        41
-       gpt5_ipg_gate        42
-       gpt4_ipg_gate        43
-       gpt3_ipg_gate        44
-       gpt2_ipg_gate        45
-       gpt1_ipg_gate        46
-       gpio_ipg_gate        47
-       fec_ipg_gate         48
-       emma_ipg_gate        49
-       dma_ipg_gate         50
-       cspi3_ipg_gate       51
-       cspi2_ipg_gate       52
-       cspi1_ipg_gate       53
-       nfc_baud_gate        54
-       ssi2_baud_gate       55
-       ssi1_baud_gate       56
-       vpu_baud_gate        57
-       per4_gate            58
-       per3_gate            59
-       per2_gate            60
-       per1_gate            61
-       usb_ahb_gate         62
-       slcdc_ahb_gate       63
-       sahara_ahb_gate      64
-       lcdc_ahb_gate        65
-       vpu_ahb_gate         66
-       fec_ahb_gate         67
-       emma_ahb_gate        68
-       emi_ahb_gate         69
-       dma_ahb_gate         70
-       csi_ahb_gate         71
-       brom_ahb_gate        72
-       ata_ahb_gate         73
-       wdog_ipg_gate        74
-       usb_ipg_gate         75
-       uart6_ipg_gate       76
-       uart5_ipg_gate       77
-       uart4_ipg_gate       78
-       uart3_ipg_gate       79
-       uart2_ipg_gate       80
-       uart1_ipg_gate       81
-       ckih_div1p5          82
-       fpm                  83
-       mpll_osc_sel         84
-       mpll_sel             85
-       spll_gate            86
-       mshc_div             87
-       rtic_ipg_gate        88
-       mshc_ipg_gate        89
-       rtic_ahb_gate        90
-       mshc_baud_gate       91
+ID in its "clocks" phandle cell. See include/dt-bindings/clock/imx27-clock.h
+for the full list of i.MX27 clock IDs.
 
 Examples:
+       clks: ccm@10027000{
+               compatible = "fsl,imx27-ccm";
+               reg = <0x10027000 0x1000>;
+               #clock-cells = <1>;
+       };
 
-clks: ccm@10027000{
-       compatible = "fsl,imx27-ccm";
-       reg = <0x10027000 0x1000>;
-       #clock-cells = <1>;
-};
-
-uart1: serial@1000a000 {
-       compatible = "fsl,imx27-uart", "fsl,imx21-uart";
-       reg = <0x1000a000 0x1000>;
-       interrupts = <20>;
-       clocks = <&clks 81>, <&clks 61>;
-       clock-names = "ipg", "per";
-       status = "disabled";
-};
+       uart1: serial@1000a000 {
+               compatible = "fsl,imx27-uart", "fsl,imx21-uart";
+               reg = <0x1000a000 0x1000>;
+               interrupts = <20>;
+               clocks = <&clks IMX27_CLK_UART1_IPG_GATE>,
+                        <&clks IMX27_CLK_PER1_GATE>;
+               clock-names = "ipg", "per";
+               status = "disabled";
+       };
index 90ec91fe5ce03a317437f49eb7b376c5f2140bba..9252912a5b0ea890668df648e092ca10c1da2164 100644 (file)
@@ -7,223 +7,13 @@ Required properties:
 - #clock-cells: Should be <1>
 
 The clock consumer should specify the desired clock by having the clock
-ID in its "clocks" phandle cell.  The following is a full list of i.MX6Q
-clocks and IDs.
-
-       Clock                   ID
-       ---------------------------
-       dummy                   0
-       ckil                    1
-       ckih                    2
-       osc                     3
-       pll2_pfd0_352m          4
-       pll2_pfd1_594m          5
-       pll2_pfd2_396m          6
-       pll3_pfd0_720m          7
-       pll3_pfd1_540m          8
-       pll3_pfd2_508m          9
-       pll3_pfd3_454m          10
-       pll2_198m               11
-       pll3_120m               12
-       pll3_80m                13
-       pll3_60m                14
-       twd                     15
-       step                    16
-       pll1_sw                 17
-       periph_pre              18
-       periph2_pre             19
-       periph_clk2_sel         20
-       periph2_clk2_sel        21
-       axi_sel                 22
-       esai_sel                23
-       asrc_sel                24
-       spdif_sel               25
-       gpu2d_axi               26
-       gpu3d_axi               27
-       gpu2d_core_sel          28
-       gpu3d_core_sel          29
-       gpu3d_shader_sel        30
-       ipu1_sel                31
-       ipu2_sel                32
-       ldb_di0_sel             33
-       ldb_di1_sel             34
-       ipu1_di0_pre_sel        35
-       ipu1_di1_pre_sel        36
-       ipu2_di0_pre_sel        37
-       ipu2_di1_pre_sel        38
-       ipu1_di0_sel            39
-       ipu1_di1_sel            40
-       ipu2_di0_sel            41
-       ipu2_di1_sel            42
-       hsi_tx_sel              43
-       pcie_axi_sel            44
-       ssi1_sel                45
-       ssi2_sel                46
-       ssi3_sel                47
-       usdhc1_sel              48
-       usdhc2_sel              49
-       usdhc3_sel              50
-       usdhc4_sel              51
-       enfc_sel                52
-       emi_sel                 53
-       emi_slow_sel            54
-       vdo_axi_sel             55
-       vpu_axi_sel             56
-       cko1_sel                57
-       periph                  58
-       periph2                 59
-       periph_clk2             60
-       periph2_clk2            61
-       ipg                     62
-       ipg_per                 63
-       esai_pred               64
-       esai_podf               65
-       asrc_pred               66
-       asrc_podf               67
-       spdif_pred              68
-       spdif_podf              69
-       can_root                70
-       ecspi_root              71
-       gpu2d_core_podf         72
-       gpu3d_core_podf         73
-       gpu3d_shader            74
-       ipu1_podf               75
-       ipu2_podf               76
-       ldb_di0_podf            77
-       ldb_di1_podf            78
-       ipu1_di0_pre            79
-       ipu1_di1_pre            80
-       ipu2_di0_pre            81
-       ipu2_di1_pre            82
-       hsi_tx_podf             83
-       ssi1_pred               84
-       ssi1_podf               85
-       ssi2_pred               86
-       ssi2_podf               87
-       ssi3_pred               88
-       ssi3_podf               89
-       uart_serial_podf        90
-       usdhc1_podf             91
-       usdhc2_podf             92
-       usdhc3_podf             93
-       usdhc4_podf             94
-       enfc_pred               95
-       enfc_podf               96
-       emi_podf                97
-       emi_slow_podf           98
-       vpu_axi_podf            99
-       cko1_podf               100
-       axi                     101
-       mmdc_ch0_axi_podf       102
-       mmdc_ch1_axi_podf       103
-       arm                     104
-       ahb                     105
-       apbh_dma                106
-       asrc                    107
-       can1_ipg                108
-       can1_serial             109
-       can2_ipg                110
-       can2_serial             111
-       ecspi1                  112
-       ecspi2                  113
-       ecspi3                  114
-       ecspi4                  115
-       ecspi5                  116
-       enet                    117
-       esai                    118
-       gpt_ipg                 119
-       gpt_ipg_per             120
-       gpu2d_core              121
-       gpu3d_core              122
-       hdmi_iahb               123
-       hdmi_isfr               124
-       i2c1                    125
-       i2c2                    126
-       i2c3                    127
-       iim                     128
-       enfc                    129
-       ipu1                    130
-       ipu1_di0                131
-       ipu1_di1                132
-       ipu2                    133
-       ipu2_di0                134
-       ldb_di0                 135
-       ldb_di1                 136
-       ipu2_di1                137
-       hsi_tx                  138
-       mlb                     139
-       mmdc_ch0_axi            140
-       mmdc_ch1_axi            141
-       ocram                   142
-       openvg_axi              143
-       pcie_axi                144
-       pwm1                    145
-       pwm2                    146
-       pwm3                    147
-       pwm4                    148
-       per1_bch                149
-       gpmi_bch_apb            150
-       gpmi_bch                151
-       gpmi_io                 152
-       gpmi_apb                153
-       sata                    154
-       sdma                    155
-       spba                    156
-       ssi1                    157
-       ssi2                    158
-       ssi3                    159
-       uart_ipg                160
-       uart_serial             161
-       usboh3                  162
-       usdhc1                  163
-       usdhc2                  164
-       usdhc3                  165
-       usdhc4                  166
-       vdo_axi                 167
-       vpu_axi                 168
-       cko1                    169
-       pll1_sys                170
-       pll2_bus                171
-       pll3_usb_otg            172
-       pll4_audio              173
-       pll5_video              174
-       pll8_mlb                175
-       pll7_usb_host           176
-       pll6_enet               177
-       ssi1_ipg                178
-       ssi2_ipg                179
-       ssi3_ipg                180
-       rom                     181
-       usbphy1                 182
-       usbphy2                 183
-       ldb_di0_div_3_5         184
-       ldb_di1_div_3_5         185
-       sata_ref                186
-       sata_ref_100m           187
-       pcie_ref                188
-       pcie_ref_125m           189
-       enet_ref                190
-       usbphy1_gate            191
-       usbphy2_gate            192
-       pll4_post_div           193
-       pll5_post_div           194
-       pll5_video_div          195
-       eim_slow                196
-       spdif                   197
-       cko2_sel                198
-       cko2_podf               199
-       cko2                    200
-       cko                     201
-       vdoa                    202
-       pll4_audio_div          203
-       lvds1_sel               204
-       lvds2_sel               205
-       lvds1_gate              206
-       lvds2_gate              207
-       esai_ahb                208
+ID in its "clocks" phandle cell.  See include/dt-bindings/clock/imx6qdl-clock.h
+for the full list of i.MX6 Quad and DualLite clock IDs.
 
 Examples:
 
+#include <dt-bindings/clock/imx6qdl-clock.h>
+
 clks: ccm@020c4000 {
        compatible = "fsl,imx6q-ccm";
        reg = <0x020c4000 0x4000>;
@@ -235,7 +25,7 @@ uart1: serial@02020000 {
        compatible = "fsl,imx6q-uart", "fsl,imx21-uart";
        reg = <0x02020000 0x4000>;
        interrupts = <0 26 0x04>;
-       clocks = <&clks 160>, <&clks 161>;
+       clocks = <&clks IMX6QDL_CLK_UART_IPG>, <&clks IMX6QDL_CLK_UART_SERIAL>;
        clock-names = "ipg", "per";
        status = "disabled";
 };
index feb830130714ad3710afb529105ab70e0e228c90..99c214660bdc7d13b3bedb19df003625b242563a 100644 (file)
@@ -3,14 +3,15 @@ Device Tree Clock bindings for cpu clock of Marvell EBU platforms
 Required properties:
 - compatible : shall be one of the following:
        "marvell,armada-xp-cpu-clock" - cpu clocks for Armada XP
-- reg : Address and length of the clock complex register set
+- reg : Address and length of the clock complex register set, followed
+        by address and length of the PMU DFS registers
 - #clock-cells : should be set to 1.
 - clocks : shall be the input parent clock phandle for the clock.
 
 cpuclk: clock-complex@d0018700 {
        #clock-cells = <1>;
        compatible = "marvell,armada-xp-cpu-clock";
-       reg = <0xd0018700 0xA0>;
+       reg = <0xd0018700 0xA0>, <0x1c054 0x10>;
        clocks = <&coreclk 1>;
 }
 
diff --git a/Documentation/devicetree/bindings/clock/samsung,s5pv210-clock.txt b/Documentation/devicetree/bindings/clock/samsung,s5pv210-clock.txt
new file mode 100644 (file)
index 0000000..effd940
--- /dev/null
@@ -0,0 +1,78 @@
+* Samsung S5P6442/S5PC110/S5PV210 Clock Controller
+
+Samsung S5P6442, S5PC110 and S5PV210 SoCs contain integrated clock
+controller, which generates and supplies clock to various controllers
+within the SoC.
+
+Required Properties:
+
+- compatible: should be one of following:
+       - "samsung,s5pv210-clock" : for clock controller of Samsung
+         S5PC110/S5PV210 SoCs,
+       - "samsung,s5p6442-clock" : for clock controller of Samsung
+         S5P6442 SoC.
+
+- reg: physical base address of the controller and length of memory mapped
+  region.
+
+- #clock-cells: should be 1.
+
+All available clocks are defined as preprocessor macros in
+dt-bindings/clock/s5pv210.h header and can be used in device tree sources.
+
+External clocks:
+
+There are several clocks that are generated outside the SoC. It is expected
+that they are defined using standard clock bindings with following
+clock-output-names:
+ - "xxti": external crystal oscillator connected to XXTI and XXTO pins of
+the SoC,
+ - "xusbxti": external crystal oscillator connected to XUSBXTI and XUSBXTO
+pins of the SoC,
+
+A subset of above clocks available on given board shall be specified in
+board device tree, including the system base clock, as selected by XOM[0]
+pin of the SoC. Refer to generic fixed rate clock bindings
+documentation[1] for more information how to specify these clocks.
+
+[1] Documentation/devicetree/bindings/clock/fixed-clock.txt
+
+Example: Clock controller node:
+
+       clock: clock-controller@7e00f000 {
+               compatible = "samsung,s5pv210-clock";
+               reg = <0x7e00f000 0x1000>;
+               #clock-cells = <1>;
+       };
+
+Example: Required external clocks:
+
+       xxti: clock-xxti {
+               compatible = "fixed-clock";
+               clock-output-names = "xxti";
+               clock-frequency = <24000000>;
+               #clock-cells = <0>;
+       };
+
+       xusbxti: clock-xusbxti {
+               compatible = "fixed-clock";
+               clock-output-names = "xusbxti";
+               clock-frequency = <24000000>;
+               #clock-cells = <0>;
+       };
+
+Example: UART controller node that consumes the clock generated by the clock
+  controller (refer to the standard clock bindings for information about
+  "clocks" and "clock-names" properties):
+
+       uart0: serial@e2900000 {
+               compatible = "samsung,s5pv210-uart";
+               reg = <0xe2900000 0x400>;
+               interrupt-parent = <&vic1>;
+               interrupts = <10>;
+               clock-names = "uart", "clk_uart_baud0",
+                               "clk_uart_baud1";
+               clocks = <&clocks UART0>, <&clocks UART0>,
+                               <&clocks SCLK_UART0>;
+               status = "disabled";
+       };
diff --git a/Documentation/devicetree/bindings/drm/armada/marvell,dove-lcd.txt b/Documentation/devicetree/bindings/drm/armada/marvell,dove-lcd.txt
new file mode 100644 (file)
index 0000000..46525ea
--- /dev/null
@@ -0,0 +1,30 @@
+Device Tree bindings for Armada DRM CRTC driver
+
+Required properties:
+ - compatible: value should be "marvell,dove-lcd".
+ - reg: base address and size of the LCD controller
+ - interrupts: single interrupt number for the LCD controller
+ - port: video output port with endpoints, as described by graph.txt
+
+Optional properties:
+
+ - clocks: as described by clock-bindings.txt
+ - clock-names: as described by clock-bindings.txt
+       "axiclk" - axi bus clock for pixel clock
+       "plldivider" - pll divider clock for pixel clock
+       "ext_ref_clk0" - external clock 0 for pixel clock
+       "ext_ref_clk1" - external clock 1 for pixel clock
+
+Note: all clocks are optional but at least one must be specified.
+Further clocks may be added in the future according to requirements of
+different SoCs.
+
+Example:
+
+       lcd0: lcd-controller@820000 {
+               compatible = "marvell,dove-lcd";
+               reg = <0x820000 0x1000>;
+               interrupts = <47>;
+               clocks = <&si5351 0>;
+               clock-names = "ext_ref_clk_1";
+       };
index d7df01c5bb3ab8945938b2e47cf9e3a8ea94b97e..e9e4bce40760e2d742160956943930b72c01b656 100644 (file)
@@ -3,6 +3,8 @@ Device-Tree bindings for the NXP TDA998x HDMI transmitter
 Required properties;
   - compatible: must be "nxp,tda998x"
 
+  - reg: I2C address
+
 Optional properties:
   - interrupts: interrupt number and trigger type
        default: polling
diff --git a/Documentation/devicetree/bindings/drm/msm/gpu.txt b/Documentation/devicetree/bindings/drm/msm/gpu.txt
new file mode 100644 (file)
index 0000000..67d0a58
--- /dev/null
@@ -0,0 +1,52 @@
+Qualcomm adreno/snapdragon GPU
+
+Required properties:
+- compatible: "qcom,adreno-3xx"
+- reg: Physical base address and length of the controller's registers.
+- interrupts: The interrupt signal from the gpu.
+- clocks: device clocks
+  See ../clocks/clock-bindings.txt for details.
+- clock-names: the following clocks are required:
+  * "core_clk"
+  * "iface_clk"
+  * "mem_iface_clk"
+- qcom,chipid: gpu chip-id.  Note this may become optional for future
+  devices if we can reliably read the chipid from hw
+- qcom,gpu-pwrlevels: list of operating points
+  - compatible: "qcom,gpu-pwrlevels"
+  - for each qcom,gpu-pwrlevel:
+    - qcom,gpu-freq: requested gpu clock speed
+    - NOTE: downstream android driver defines additional parameters to
+      configure memory bandwidth scaling per OPP.
+
+Example:
+
+/ {
+       ...
+
+       gpu: qcom,kgsl-3d0@4300000 {
+               compatible = "qcom,adreno-3xx";
+               reg = <0x04300000 0x20000>;
+               reg-names = "kgsl_3d0_reg_memory";
+               interrupts = <GIC_SPI 80 0>;
+               interrupt-names = "kgsl_3d0_irq";
+               clock-names =
+                   "core_clk",
+                   "iface_clk",
+                   "mem_iface_clk";
+               clocks =
+                   <&mmcc GFX3D_CLK>,
+                   <&mmcc GFX3D_AHB_CLK>,
+                   <&mmcc MMSS_IMEM_AHB_CLK>;
+               qcom,chipid = <0x03020100>;
+               qcom,gpu-pwrlevels {
+                       compatible = "qcom,gpu-pwrlevels";
+                       qcom,gpu-pwrlevel@0 {
+                               qcom,gpu-freq = <450000000>;
+                       };
+                       qcom,gpu-pwrlevel@1 {
+                               qcom,gpu-freq = <27000000>;
+                       };
+               };
+       };
+};
diff --git a/Documentation/devicetree/bindings/drm/msm/hdmi.txt b/Documentation/devicetree/bindings/drm/msm/hdmi.txt
new file mode 100644 (file)
index 0000000..aca917f
--- /dev/null
@@ -0,0 +1,46 @@
+Qualcomm adreno/snapdragon hdmi output
+
+Required properties:
+- compatible: one of the following
+   * "qcom,hdmi-tx-8660"
+   * "qcom,hdmi-tx-8960"
+- reg: Physical base address and length of the controller's registers
+- reg-names: "core_physical"
+- interrupts: The interrupt signal from the hdmi block.
+- clocks: device clocks
+  See ../clocks/clock-bindings.txt for details.
+- qcom,hdmi-tx-ddc-clk-gpio: ddc clk pin
+- qcom,hdmi-tx-ddc-data-gpio: ddc data pin
+- qcom,hdmi-tx-hpd-gpio: hpd pin
+- core-vdda-supply: phandle to supply regulator
+- hdmi-mux-supply: phandle to mux regulator
+
+Optional properties:
+- qcom,hdmi-tx-mux-en-gpio: hdmi mux enable pin
+- qcom,hdmi-tx-mux-sel-gpio: hdmi mux select pin
+
+Example:
+
+/ {
+       ...
+
+       hdmi: qcom,hdmi-tx-8960@4a00000 {
+               compatible = "qcom,hdmi-tx-8960";
+               reg-names = "core_physical";
+               reg = <0x04a00000 0x1000>;
+               interrupts = <GIC_SPI 79 0>;
+               clock-names =
+                   "core_clk",
+                   "master_iface_clk",
+                   "slave_iface_clk";
+               clocks =
+                   <&mmcc HDMI_APP_CLK>,
+                   <&mmcc HDMI_M_AHB_CLK>,
+                   <&mmcc HDMI_S_AHB_CLK>;
+               qcom,hdmi-tx-ddc-clk = <&msmgpio 70 GPIO_ACTIVE_HIGH>;
+               qcom,hdmi-tx-ddc-data = <&msmgpio 71 GPIO_ACTIVE_HIGH>;
+               qcom,hdmi-tx-hpd = <&msmgpio 72 GPIO_ACTIVE_HIGH>;
+               core-vdda-supply = <&pm8921_hdmi_mvs>;
+               hdmi-mux-supply = <&ext_3p3v>;
+       };
+};
diff --git a/Documentation/devicetree/bindings/drm/msm/mdp.txt b/Documentation/devicetree/bindings/drm/msm/mdp.txt
new file mode 100644 (file)
index 0000000..1a0598e
--- /dev/null
@@ -0,0 +1,48 @@
+Qualcomm adreno/snapdragon display controller
+
+Required properties:
+- compatible:
+  * "qcom,mdp" - mdp4
+- reg: Physical base address and length of the controller's registers.
+- interrupts: The interrupt signal from the display controller.
+- connectors: array of phandles for output device(s)
+- clocks: device clocks
+  See ../clocks/clock-bindings.txt for details.
+- clock-names: the following clocks are required:
+  * "core_clk"
+  * "iface_clk"
+  * "lut_clk"
+  * "src_clk"
+  * "hdmi_clk"
+  * "mpd_clk"
+
+Optional properties:
+- gpus: phandle for gpu device
+
+Example:
+
+/ {
+       ...
+
+       mdp: qcom,mdp@5100000 {
+               compatible = "qcom,mdp";
+               reg = <0x05100000 0xf0000>;
+               interrupts = <GIC_SPI 75 0>;
+               connectors = <&hdmi>;
+               gpus = <&gpu>;
+               clock-names =
+                   "core_clk",
+                   "iface_clk",
+                   "lut_clk",
+                   "src_clk",
+                   "hdmi_clk",
+                   "mdp_clk";
+               clocks =
+                   <&mmcc MDP_SRC>,
+                   <&mmcc MDP_AHB_CLK>,
+                   <&mmcc MDP_LUT_CLK>,
+                   <&mmcc TV_SRC>,
+                   <&mmcc HDMI_TV_CLK>,
+                   <&mmcc MDP_TV_CLK>;
+       };
+};
diff --git a/Documentation/devicetree/bindings/fuse/nvidia,tegra20-fuse.txt b/Documentation/devicetree/bindings/fuse/nvidia,tegra20-fuse.txt
new file mode 100644 (file)
index 0000000..d8c98c7
--- /dev/null
@@ -0,0 +1,40 @@
+NVIDIA Tegra20/Tegra30/Tegr114/Tegra124 fuse block.
+
+Required properties:
+- compatible : should be:
+       "nvidia,tegra20-efuse"
+       "nvidia,tegra30-efuse"
+       "nvidia,tegra114-efuse"
+       "nvidia,tegra124-efuse"
+  Details:
+  nvidia,tegra20-efuse: Tegra20 requires using APB DMA to read the fuse data
+       due to a hardware bug. Tegra20 also lacks certain information which is
+       available in later generations such as fab code, lot code, wafer id,..
+  nvidia,tegra30-efuse, nvidia,tegra114-efuse and nvidia,tegra124-efuse:
+       The differences between these SoCs are the size of the efuse array,
+       the location of the spare (OEM programmable) bits and the location of
+       the speedo data.
+- reg: Should contain 1 entry: the entry gives the physical address and length
+       of the fuse registers.
+- clocks: Must contain an entry for each entry in clock-names.
+  See ../clocks/clock-bindings.txt for details.
+- clock-names: Must include the following entries:
+  - fuse
+- resets: Must contain an entry for each entry in reset-names.
+  See ../reset/reset.txt for details.
+- reset-names: Must include the following entries:
+ - fuse
+
+Example:
+
+       fuse@7000f800 {
+               compatible = "nvidia,tegra20-efuse";
+               reg = <0x7000F800 0x400>,
+                     <0x70000000 0x400>;
+               clocks = <&tegra_car TEGRA20_CLK_FUSE>;
+               clock-names = "fuse";
+               resets = <&tegra_car 39>;
+               reset-names = "fuse";
+       };
+
+
diff --git a/Documentation/devicetree/bindings/gpu/nvidia,gk20a.txt b/Documentation/devicetree/bindings/gpu/nvidia,gk20a.txt
new file mode 100644 (file)
index 0000000..23bfe8e
--- /dev/null
@@ -0,0 +1,43 @@
+NVIDIA GK20A Graphics Processing Unit
+
+Required properties:
+- compatible: "nvidia,<chip>-<gpu>"
+  Currently recognized values:
+  - nvidia,tegra124-gk20a
+- reg: Physical base address and length of the controller's registers.
+  Must contain two entries:
+  - first entry for bar0
+  - second entry for bar1
+- interrupts: Must contain an entry for each entry in interrupt-names.
+  See ../interrupt-controller/interrupts.txt for details.
+- interrupt-names: Must include the following entries:
+  - stall
+  - nonstall
+- vdd-supply: regulator for supply voltage.
+- clocks: Must contain an entry for each entry in clock-names.
+  See ../clocks/clock-bindings.txt for details.
+- clock-names: Must include the following entries:
+  - gpu
+  - pwr
+- resets: Must contain an entry for each entry in reset-names.
+  See ../reset/reset.txt for details.
+- reset-names: Must include the following entries:
+  - gpu
+
+Example:
+
+       gpu@0,57000000 {
+               compatible = "nvidia,gk20a";
+               reg = <0x0 0x57000000 0x0 0x01000000>,
+                     <0x0 0x58000000 0x0 0x01000000>;
+               interrupts = <GIC_SPI 157 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 158 IRQ_TYPE_LEVEL_HIGH>;
+               interrupt-names = "stall", "nonstall";
+               vdd-supply = <&vdd_gpu>;
+               clocks = <&tegra_car TEGRA124_CLK_GPU>,
+                        <&tegra_car TEGRA124_CLK_PLL_P_OUT5>;
+               clock-names = "gpu", "pwr";
+               resets = <&tegra_car 184>;
+               reset-names = "gpu";
+               status = "disabled";
+       };
diff --git a/Documentation/devicetree/bindings/gpu/st,stih4xx.txt b/Documentation/devicetree/bindings/gpu/st,stih4xx.txt
new file mode 100644 (file)
index 0000000..2d150c3
--- /dev/null
@@ -0,0 +1,189 @@
+STMicroelectronics stih4xx platforms
+
+- sti-vtg: video timing generator
+  Required properties:
+  - compatible: "st,vtg"
+  - reg: Physical base address of the IP registers and length of memory mapped region.
+  Optional properties:
+  - interrupts : VTG interrupt number to the CPU.
+  - st,slave: phandle on a slave vtg
+
+- sti-vtac: video timing advanced inter dye communication Rx and TX
+  Required properties:
+  - compatible: "st,vtac-main" or "st,vtac-aux"
+  - reg: Physical base address of the IP registers and length of memory mapped region.
+  - clocks: from common clock binding: handle hardware IP needed clocks, the
+    number of clocks may depend of the SoC type.
+    See ../clocks/clock-bindings.txt for details.
+  - clock-names: names of the clocks listed in clocks property in the same
+    order.
+
+- sti-display-subsystem: Master device for DRM sub-components
+  This device must be the parent of all the sub-components and is responsible
+  of bind them.
+  Required properties:
+  - compatible: "st,sti-display-subsystem"
+  - ranges: to allow probing of subdevices
+
+- sti-compositor: frame compositor engine
+  must be a child of sti-display-subsystem
+  Required properties:
+  - compatible: "st,stih<chip>-compositor"
+  - reg: Physical base address of the IP registers and length of memory mapped region.
+  - clocks: from common clock binding: handle hardware IP needed clocks, the
+    number of clocks may depend of the SoC type.
+    See ../clocks/clock-bindings.txt for details.
+  - clock-names: names of the clocks listed in clocks property in the same
+    order.
+  - resets: resets to be used by the device
+    See ../reset/reset.txt for details.
+  - reset-names: names of the resets listed in resets property in the same
+    order.
+  - st,vtg: phandle(s) on vtg device (main and aux) nodes.
+
+- sti-tvout: video out hardware block
+  must be a child of sti-display-subsystem
+  Required properties:
+  - compatible: "st,stih<chip>-tvout"
+  - reg: Physical base address of the IP registers and length of memory mapped region.
+  - reg-names: names of the mapped memory regions listed in regs property in
+    the same order.
+  - resets: resets to be used by the device
+    See ../reset/reset.txt for details.
+  - reset-names: names of the resets listed in resets property in the same
+    order.
+  - ranges: to allow probing of subdevices
+
+- sti-hdmi: hdmi output block
+  must be a child of sti-tvout
+  Required properties:
+  - compatible: "st,stih<chip>-hdmi";
+  - reg: Physical base address of the IP registers and length of memory mapped region.
+  - reg-names: names of the mapped memory regions listed in regs property in
+    the same order.
+  - interrupts : HDMI interrupt number to the CPU.
+  - interrupt-names: name of the interrupts listed in interrupts property in
+    the same order
+  - clocks: from common clock binding: handle hardware IP needed clocks, the
+    number of clocks may depend of the SoC type.
+  - clock-names: names of the clocks listed in clocks property in the same
+    order.
+  - hdmi,hpd-gpio: gpio id to detect if an hdmi cable is plugged or not.
+
+sti-hda:
+  Required properties:
+  must be a child of sti-tvout
+  - compatible: "st,stih<chip>-hda"
+  - reg: Physical base address of the IP registers and length of memory mapped region.
+  - reg-names: names of the mapped memory regions listed in regs property in
+    the same order.
+  - clocks: from common clock binding: handle hardware IP needed clocks, the
+    number of clocks may depend of the SoC type.
+    See ../clocks/clock-bindings.txt for details.
+  - clock-names: names of the clocks listed in clocks property in the same
+    order.
+
+Example:
+
+/ {
+       ...
+
+       vtg_main_slave: sti-vtg-main-slave@fe85A800 {
+               compatible      = "st,vtg";
+               reg             = <0xfe85A800 0x300>;
+               interrupts      = <GIC_SPI 175 IRQ_TYPE_NONE>;
+       };
+
+       vtg_main: sti-vtg-main-master@fd348000 {
+               compatible      = "st,vtg";
+               reg             = <0xfd348000 0x400>;
+               st,slave        = <&vtg_main_slave>;
+       };
+
+       vtg_aux_slave: sti-vtg-aux-slave@fd348400 {
+               compatible      = "st,vtg";
+               reg             = <0xfe858200 0x300>;
+               interrupts      = <GIC_SPI 176 IRQ_TYPE_NONE>;
+       };
+
+       vtg_aux: sti-vtg-aux-master@fd348400 {
+               compatible      = "st,vtg";
+               reg             = <0xfd348400 0x400>;
+               st,slave        = <&vtg_aux_slave>;
+       };
+
+
+       sti-vtac-rx-main@fee82800 {
+               compatible      = "st,vtac-main";
+               reg             = <0xfee82800 0x200>;
+               clock-names     = "vtac";
+               clocks          = <&clk_m_a2_div0 CLK_M_VTAC_MAIN_PHY>;
+       };
+
+       sti-vtac-rx-aux@fee82a00 {
+               compatible      = "st,vtac-aux";
+               reg             = <0xfee82a00 0x200>;
+               clock-names     = "vtac";
+               clocks          = <&clk_m_a2_div0 CLK_M_VTAC_AUX_PHY>;
+       };
+
+       sti-vtac-tx-main@fd349000 {
+               compatible      = "st,vtac-main";
+               reg             = <0xfd349000 0x200>, <0xfd320000 0x10000>;
+               clock-names     = "vtac";
+               clocks           = <&clk_s_a1_hs CLK_S_VTAC_TX_PHY>;
+       };
+
+       sti-vtac-tx-aux@fd349200 {
+               compatible      = "st,vtac-aux";
+               reg             = <0xfd349200 0x200>, <0xfd320000 0x10000>;
+               clock-names     = "vtac";
+               clocks          = <&clk_s_a1_hs CLK_S_VTAC_TX_PHY>;
+       };
+
+       sti-display-subsystem {
+               compatible = "st,sti-display-subsystem";
+               ranges;
+
+               sti-compositor@fd340000 {
+                       compatible      = "st,stih416-compositor";
+                       reg             = <0xfd340000 0x1000>;
+                       clock-names     = "compo_main", "compo_aux",
+                                         "pix_main", "pix_aux";
+                       clocks          = <&clk_m_a2_div1 CLK_M_COMPO_MAIN>, <&clk_m_a2_div1 CLK_M_COMPO_AUX>,
+                                         <&clockgen_c_vcc CLK_S_PIX_MAIN>, <&clockgen_c_vcc CLK_S_PIX_AUX>;
+                       reset-names     = "compo-main", "compo-aux";
+                       resets          = <&softreset STIH416_COMPO_M_SOFTRESET>, <&softreset STIH416_COMPO_A_SOFTRESET>;
+                       st,vtg          = <&vtg_main>, <&vtg_aux>;
+               };
+
+               sti-tvout@fe000000 {
+                       compatible      = "st,stih416-tvout";
+                       reg             = <0xfe000000 0x1000>, <0xfe85a000 0x400>, <0xfe830000 0x10000>;
+                       reg-names       = "tvout-reg", "hda-reg", "syscfg";
+                       reset-names     = "tvout";
+                       resets          = <&softreset STIH416_HDTVOUT_SOFTRESET>;
+                       ranges;
+
+                       sti-hdmi@fe85c000 {
+                               compatible      = "st,stih416-hdmi";
+                               reg             = <0xfe85c000 0x1000>, <0xfe830000 0x10000>;
+                               reg-names       = "hdmi-reg", "syscfg";
+                               interrupts      = <GIC_SPI 173 IRQ_TYPE_NONE>;
+                               interrupt-names = "irq";
+                               clock-names     = "pix", "tmds", "phy", "audio";
+                               clocks          = <&clockgen_c_vcc CLK_S_PIX_HDMI>, <&clockgen_c_vcc CLK_S_TMDS_HDMI>, <&clockgen_c_vcc CLK_S_HDMI_REJECT_PLL>, <&clockgen_b1 CLK_S_PCM_0>;
+                               hdmi,hpd-gpio   = <&PIO2 5>;
+                       };
+
+                       sti-hda@fe85a000 {
+                               compatible      = "st,stih416-hda";
+                               reg             = <0xfe85a000 0x400>, <0xfe83085c 0x4>;
+                               reg-names       = "hda-reg", "video-dacs-ctrl";
+                               clock-names     = "pix", "hddac";
+                               clocks          = <&clockgen_c_vcc CLK_S_PIX_HD>, <&clockgen_c_vcc CLK_S_HDDAC>;
+                       };
+               };
+       };
+       ...
+};
index aece3eac1b634829c20afdeddbe1c8db74bb7b08..dafbe9931c2baa992adab30bcb5c9a50373709bd 100644 (file)
@@ -1,18 +1,19 @@
 LEDs connected to pca9632, pca9633 or pca9634
 
 Required properties:
-- compatible : should be : "nxp,pca9632", "nxp,pca9633" or "nxp,pca9634"
+- compatible : should be : "nxp,pca9632", "nxp,pca9633", "nxp,pca9634" or "nxp,pca9635"
 
 Optional properties:
-- nxp,totem-pole : use totem pole (push-pull) instead of default open-drain
+- nxp,totem-pole : use totem pole (push-pull) instead of open-drain (pca9632 defaults
+  to open-drain, newer chips to totem pole)
 - nxp,hw-blink : use hardware blinking instead of software blinking
 
 Each led is represented as a sub-node of the nxp,pca963x device.
 
 LED sub-node properties:
 - label : (optional) see Documentation/devicetree/bindings/leds/common.txt
-- reg : number of LED line (could be from 0 to 3  in pca9632 or pca9633
-               or 0 to 7 in pca9634)
+- reg : number of LED line (could be from 0 to 3 in pca9632 or pca9633,
+               0 to 7 in pca9634, or 0 to 15 in pca9635)
 - linux,default-trigger : (optional)
    see Documentation/devicetree/bindings/leds/common.txt
 
index d7221b84987cd684169bee2765a050cba3511c75..bad9102796f3299fb0e96100bca982cc76b79831 100644 (file)
@@ -8,7 +8,7 @@ Required properties:
 
 Optional properties:
 - gpio-controller: allows lines to be used as output-only GPIOs.
-- #gpio-cells: if present, must be 0.
+- #gpio-cells: if present, must not be 0.
 
 Each led is represented as a sub-node of the ti,tca6507 device.
 
index 36a0c3d8c726a42a976867bb6a2e3a6df62e0d08..5c7e7230984a5c064da0ef8613ded1caf78f2bb9 100644 (file)
@@ -42,6 +42,16 @@ Optional properties:
     the chip default will be used.  If present exactly five values must
     be specified.
 
+  - DCVDD-supply, MICVDD-supply : Power supplies, only need to be specified if
+    they are being externally supplied. As covered in
+    Documentation/devicetree/bindings/regulator/regulator.txt
+
+Optional subnodes:
+  - ldo1 : Initial data for the LDO1 regulator, as covered in
+    Documentation/devicetree/bindings/regulator/regulator.txt
+  - micvdd : Initial data for the MICVDD regulator, as covered in
+    Documentation/devicetree/bindings/regulator/regulator.txt
+
 Example:
 
 codec: wm5102@1a {
index 8edcb9bd873b016315fa1f7b2471e060ccfe82f7..4f64b2a73169646fae8bafb57dad29dc791a6167 100644 (file)
@@ -13,6 +13,14 @@ Required properties:
   The second cell is the flags, encoded as the trigger masks from binding document
        interrupts.txt, using dt-bindings/irq.
 
+Optional properties:
+--------------------
+- ams,enable-internal-int-pullup: Boolean property, to enable internal pullup on
+       interrupt pin. Missing this will disable internal pullup on INT pin.
+- ams,enable-internal-i2c-pullup: Boolean property, to enable internal pullup on
+       i2c scl/sda pins. Missing this will disable internal pullup on i2c
+       scl/sda lines.
+
 Optional submodule and their properties:
 =======================================
 
index d81ba30c0d8bd628bad8f11e3471f0b9146386b3..ba2d7f0f9c5f77f81eb1692108018cbac3ad9299 100644 (file)
@@ -1,5 +1,5 @@
 
-* Samsung S2MPS11 and S2MPS14 Voltage and Current Regulator
+* Samsung S2MPS11, S2MPS14 and S2MPU02 Voltage and Current Regulator
 
 The Samsung S2MPS11 is a multi-function device which includes voltage and
 current regulators, RTC, charger controller and other sub-blocks. It is
@@ -7,7 +7,8 @@ interfaced to the host controller using an I2C interface. Each sub-block is
 addressed by the host system using different I2C slave addresses.
 
 Required properties:
-- compatible: Should be "samsung,s2mps11-pmic" or "samsung,s2mps14-pmic".
+- compatible: Should be "samsung,s2mps11-pmic" or "samsung,s2mps14-pmic"
+              or "samsung,s2mpu02-pmic".
 - reg: Specifies the I2C slave address of the pmic block. It should be 0x66.
 
 Optional properties:
@@ -81,11 +82,13 @@ as per the datasheet of s2mps11.
                  - valid values for n are:
                        - S2MPS11: 1 to 38
                        - S2MPS14: 1 to 25
-                 - Example: LDO1, LD02, LDO28
+                       - S2MPU02: 1 to 28
+                 - Example: LDO1, LDO2, LDO28
        - BUCKn
                  - valid values for n are:
                        - S2MPS11: 1 to 10
                        - S2MPS14: 1 to 5
+                       - S2MPU02: 1 to 7
                  - Example: BUCK1, BUCK2, BUCK9
 
 Example:
@@ -96,7 +99,7 @@ Example:
 
                s2m_osc: clocks {
                        compatible = "samsung,s2mps11-clk";
-                       #clock-cells = 1;
+                       #clock-cells = <1>;
                        clock-output-names = "xx", "yy", "zz";
                };
 
index 1f5a31fef9078f58d1613bc0bda3082ffde73af8..03c5a551da55589632c73f10edbfccb8b83621cb 100644 (file)
@@ -4,7 +4,7 @@ PRCM is an MFD device exposing several Power Management related devices
 (like clks and reset controllers).
 
 Required properties:
- - compatible: "allwinner,sun6i-a31-prcm"
+ - compatible: "allwinner,sun6i-a31-prcm" or "allwinner,sun8i-a23-prcm"
  - reg: The PRCM registers range
 
 The prcm node may contain several subdevices definitions:
diff --git a/Documentation/devicetree/bindings/misc/nvidia,tegra20-apbmisc.txt b/Documentation/devicetree/bindings/misc/nvidia,tegra20-apbmisc.txt
new file mode 100644 (file)
index 0000000..b97b8be
--- /dev/null
@@ -0,0 +1,13 @@
+NVIDIA Tegra20/Tegra30/Tegr114/Tegra124 apbmisc block
+
+Required properties:
+- compatible : should be:
+       "nvidia,tegra20-apbmisc"
+       "nvidia,tegra30-apbmisc"
+       "nvidia,tegra114-apbmisc"
+       "nvidia,tegra124-apbmisc"
+- reg: Should contain 2 entries: the first entry gives the physical address
+       and length of the registers which contain revision and debug features.
+       The second entry gives the physical address and length of the
+       registers indicating the strapping options.
+
diff --git a/Documentation/devicetree/bindings/panel/auo,b133htn01.txt b/Documentation/devicetree/bindings/panel/auo,b133htn01.txt
new file mode 100644 (file)
index 0000000..302226b
--- /dev/null
@@ -0,0 +1,7 @@
+AU Optronics Corporation 13.3" FHD (1920x1080) color TFT-LCD panel
+
+Required properties:
+- compatible: should be "auo,b133htn01"
+
+This binding is compatible with the simple-panel binding, which is specified
+in simple-panel.txt in this directory.
diff --git a/Documentation/devicetree/bindings/panel/foxlink,fl500wvr00-a0t.txt b/Documentation/devicetree/bindings/panel/foxlink,fl500wvr00-a0t.txt
new file mode 100644 (file)
index 0000000..b47f9d8
--- /dev/null
@@ -0,0 +1,7 @@
+Foxlink Group 5" WVGA TFT LCD panel
+
+Required properties:
+- compatible: should be "foxlink,fl500wvr00-a0t"
+
+This binding is compatible with the simple-panel binding, which is specified
+in simple-panel.txt in this directory.
diff --git a/Documentation/devicetree/bindings/panel/innolux,n116bge.txt b/Documentation/devicetree/bindings/panel/innolux,n116bge.txt
new file mode 100644 (file)
index 0000000..081bb93
--- /dev/null
@@ -0,0 +1,7 @@
+Innolux Corporation 11.6" WXGA (1366x768) TFT LCD panel
+
+Required properties:
+- compatible: should be "innolux,n116bge"
+
+This binding is compatible with the simple-panel binding, which is specified
+in simple-panel.txt in this directory.
diff --git a/Documentation/devicetree/bindings/panel/innolux,n156bge-l21.txt b/Documentation/devicetree/bindings/panel/innolux,n156bge-l21.txt
new file mode 100644 (file)
index 0000000..7825844
--- /dev/null
@@ -0,0 +1,7 @@
+InnoLux 15.6" WXGA TFT LCD panel
+
+Required properties:
+- compatible: should be "innolux,n156bge-l21"
+
+This binding is compatible with the simple-panel binding, which is specified
+in simple-panel.txt in this directory.
index c300391e8d3e3eac79b29d1ed231bf7ce7260a94..0823362548dc04c03416a83e001ef19677dbba62 100644 (file)
@@ -14,9 +14,6 @@ Required properties:
 - interrupt-names: Must include the following entries:
   "intr": The Tegra interrupt that is asserted for controller interrupts
   "msi": The Tegra interrupt that is asserted when an MSI is received
-- pex-clk-supply: Supply voltage for internal reference clock
-- vdd-supply: Power supply for controller (1.05V)
-- avdd-supply: Power supply for controller (1.05V) (not required for Tegra20)
 - bus-range: Range of bus numbers associated with this controller
 - #address-cells: Address representation for root ports (must be 3)
   - cell 0 specifies the bus and device numbers of the root port:
@@ -60,6 +57,33 @@ Required properties:
   - afi
   - pcie_x
 
+Power supplies for Tegra20:
+- avdd-pex-supply: Power supply for analog PCIe logic. Must supply 1.05 V.
+- vdd-pex-supply: Power supply for digital PCIe I/O. Must supply 1.05 V.
+- avdd-pex-pll-supply: Power supply for dedicated (internal) PCIe PLL. Must
+  supply 1.05 V.
+- avdd-plle-supply: Power supply for PLLE, which is shared with SATA. Must
+  supply 1.05 V.
+- vddio-pex-clk-supply: Power supply for PCIe clock. Must supply 3.3 V.
+
+Power supplies for Tegra30:
+- Required:
+  - avdd-pex-pll-supply: Power supply for dedicated (internal) PCIe PLL. Must
+    supply 1.05 V.
+  - avdd-plle-supply: Power supply for PLLE, which is shared with SATA. Must
+    supply 1.05 V.
+  - vddio-pex-ctl-supply: Power supply for PCIe control I/O partition. Must
+    supply 1.8 V.
+  - hvdd-pex-supply: High-voltage supply for PCIe I/O and PCIe output clocks.
+    Must supply 3.3 V.
+- Optional:
+  - If lanes 0 to 3 are used:
+    - avdd-pexa-supply: Power supply for analog PCIe logic. Must supply 1.05 V.
+    - vdd-pexa-supply: Power supply for digital PCIe I/O. Must supply 1.05 V.
+  - If lanes 4 or 5 are used:
+    - avdd-pexb-supply: Power supply for analog PCIe logic. Must supply 1.05 V.
+    - vdd-pexb-supply: Power supply for digital PCIe I/O. Must supply 1.05 V.
+
 Root ports are defined as subnodes of the PCIe controller node.
 
 Required properties:
diff --git a/Documentation/devicetree/bindings/pci/spear13xx-pcie.txt b/Documentation/devicetree/bindings/pci/spear13xx-pcie.txt
new file mode 100644 (file)
index 0000000..49ea76d
--- /dev/null
@@ -0,0 +1,14 @@
+SPEAr13XX PCIe DT detail:
+================================
+
+SPEAr13XX uses synopsis designware PCIe controller and ST MiPHY as phy
+controller.
+
+Required properties:
+- compatible : should be "st,spear1340-pcie", "snps,dw-pcie".
+- phys             : phandle to phy node associated with pcie controller
+- phy-names        : must be "pcie-phy"
+- All other definitions as per generic PCI bindings
+
+ Optional properties:
+- st,pcie-is-gen1 indicates that forced gen1 initialization is needed.
index 6099a5c94283ec14c7926773fdd90638502571ca..7a6feea2a48b90a36d928cca664ac2cd893e4213 100644 (file)
@@ -30,6 +30,7 @@ Required properties:
        - "samsung,exynos4210-usb2-phy"
        - "samsung,exynos4x12-usb2-phy"
        - "samsung,exynos5250-usb2-phy"
+       - "samsung,s5pv210-usb2-phy"
 - reg : a list of registers used by phy driver
        - first and obligatory is the location of phy modules registers
 - samsung,sysreg-phandle - handle to syscon used to control the system registers
diff --git a/Documentation/devicetree/bindings/phy/st-spear-miphy.txt b/Documentation/devicetree/bindings/phy/st-spear-miphy.txt
new file mode 100644 (file)
index 0000000..2a6bfdc
--- /dev/null
@@ -0,0 +1,15 @@
+ST SPEAr miphy DT details
+=========================
+
+ST Microelectronics SPEAr miphy is a phy controller supporting PCIe and SATA.
+
+Required properties:
+- compatible : should be "st,spear1310-miphy" or "st,spear1340-miphy"
+- reg : offset and length of the PHY register set.
+- misc: phandle for the syscon node to access misc registers
+- #phy-cells : from the generic PHY bindings, must be 1.
+       - cell[1]: 0 if phy used for SATA, 1 for PCIe.
+
+Optional properties:
+- phy-id: Instance id of the phy. Only required when there are multiple phys
+  present on a implementation.
index d8d065608ec0a7de0aae5d5f8f094a9d5ed1cb40..93ce12eb422a6877de66d4a2ab29dd86f003ecb8 100644 (file)
@@ -13,6 +13,8 @@ Required properties:
   "allwinner,sun6i-a31-pinctrl"
   "allwinner,sun6i-a31-r-pinctrl"
   "allwinner,sun7i-a20-pinctrl"
+  "allwinner,sun8i-a23-pinctrl"
+  "allwinner,sun8i-a23-r-pinctrl"
 - reg: Should contain the register physical address and length for the
   pin controller.
 
diff --git a/Documentation/devicetree/bindings/pinctrl/nvidia,tegra124-xusb-padctl.txt b/Documentation/devicetree/bindings/pinctrl/nvidia,tegra124-xusb-padctl.txt
new file mode 100644 (file)
index 0000000..2f9c0bd
--- /dev/null
@@ -0,0 +1,127 @@
+Device tree binding for NVIDIA Tegra XUSB pad controller
+========================================================
+
+The Tegra XUSB pad controller manages a set of lanes, each of which can be
+assigned to one out of a set of different pads. Some of these pads have an
+associated PHY that must be powered up before the pad can be used.
+
+This document defines the device-specific binding for the XUSB pad controller.
+
+Refer to pinctrl-bindings.txt in this directory for generic information about
+pin controller device tree bindings and ../phy/phy-bindings.txt for details on
+how to describe and reference PHYs in device trees.
+
+Required properties:
+--------------------
+- compatible: should be "nvidia,tegra124-xusb-padctl"
+- reg: Physical base address and length of the controller's registers.
+- resets: Must contain an entry for each entry in reset-names.
+  See ../reset/reset.txt for details.
+- reset-names: Must include the following entries:
+  - padctl
+- #phy-cells: Should be 1. The specifier is the index of the PHY to reference.
+  See <dt-bindings/pinctrl/pinctrl-tegra-xusb.h> for the list of valid values.
+
+Lane muxing:
+------------
+
+Child nodes contain the pinmux configurations following the conventions from
+the pinctrl-bindings.txt document. Typically a single, static configuration is
+given and applied at boot time.
+
+Each subnode describes groups of lanes along with parameters and pads that
+they should be assigned to. The name of these subnodes is not important. All
+subnodes should be parsed solely based on their content.
+
+Each subnode only applies the parameters that are explicitly listed. In other
+words, if a subnode that lists a function but no pin configuration parameters
+implies no information about any pin configuration parameters. Similarly, a
+subnode that describes only an IDDQ parameter implies no information about
+what function the pins are assigned to. For this reason even seemingly boolean
+values are actually tristates in this binding: unspecified, off or on.
+Unspecified is represented as an absent property, and off/on are represented
+as integer values 0 and 1.
+
+Required properties:
+- nvidia,lanes: An array of strings. Each string is the name of a lane.
+
+Optional properties:
+- nvidia,function: A string that is the name of the function (pad) that the
+  pin or group should be assigned to. Valid values for function names are
+  listed below.
+- nvidia,iddq: Enables IDDQ mode of the lane. (0: no, 1: yes)
+
+Note that not all of these properties are valid for all lanes. Lanes can be
+divided into three groups:
+
+  - otg-0, otg-1, otg-2:
+
+    Valid functions for this group are: "snps", "xusb", "uart", "rsvd".
+
+    The nvidia,iddq property does not apply to this group.
+
+  - ulpi-0, hsic-0, hsic-1:
+
+    Valid functions for this group are: "snps", "xusb".
+
+    The nvidia,iddq property does not apply to this group.
+
+  - pcie-0, pcie-1, pcie-2, pcie-3, pcie-4, sata-0:
+
+    Valid functions for this group are: "pcie", "usb3", "sata", "rsvd".
+
+
+Example:
+========
+
+SoC file extract:
+-----------------
+
+       padctl@0,7009f000 {
+               compatible = "nvidia,tegra124-xusb-padctl";
+               reg = <0x0 0x7009f000 0x0 0x1000>;
+               resets = <&tegra_car 142>;
+               reset-names = "padctl";
+
+               #phy-cells = <1>;
+       };
+
+Board file extract:
+-------------------
+
+       pcie-controller@0,01003000 {
+               ...
+
+               phys = <&padctl 0>;
+               phy-names = "pcie";
+
+               ...
+       };
+
+       ...
+
+       padctl: padctl@0,7009f000 {
+               pinctrl-0 = <&padctl_default>;
+               pinctrl-names = "default";
+
+               padctl_default: pinmux {
+                       usb3 {
+                               nvidia,lanes = "pcie-0", "pcie-1";
+                               nvidia,function = "usb3";
+                               nvidia,iddq = <0>;
+                       };
+
+                       pcie {
+                               nvidia,lanes = "pcie-2", "pcie-3",
+                                              "pcie-4";
+                               nvidia,function = "pcie";
+                               nvidia,iddq = <0>;
+                       };
+
+                       sata {
+                               nvidia,lanes = "sata-0";
+                               nvidia,function = "sata";
+                               nvidia,iddq = <0>;
+                       };
+               };
+       };
index 7181f925acaaa8c82a16fb22393d0c70ae193089..0211c6d8a5229e17866eb90f751a015ffaf609a0 100644 (file)
@@ -46,7 +46,7 @@ Valid values for pins are:
   gpio0-gpio89
 
 Valid values for function are:
-  cam_mclk, codec_mic_i2s, codec_spkr_i2s, gsbi1, gsbi2, gsbi3, gsbi4,
+  cam_mclk, codec_mic_i2s, codec_spkr_i2s, gpio, gsbi1, gsbi2, gsbi3, gsbi4,
   gsbi4_cam_i2c, gsbi5, gsbi5_spi_cs1, gsbi5_spi_cs2, gsbi5_spi_cs3, gsbi6,
   gsbi6_spi_cs1, gsbi6_spi_cs2, gsbi6_spi_cs3, gsbi7, gsbi7_spi_cs1,
   gsbi7_spi_cs2, gsbi7_spi_cs3, gsbi_cam_i2c, hdmi, mi2s, riva_bt, riva_fm,
index e0d35a40981be7deafba5d6da370be4b6c68d685..e33e4dcdce79bdfb51e17b4ab1bbb5602db569b0 100644 (file)
@@ -51,7 +51,7 @@ Valid values for qcom,pins are:
 
 
 Valid values for function are:
-  mdio, mi2s, pdm, ssbi, spmi, audio_pcm, gsbi1, gsbi2, gsbi4, gsbi5,
+  mdio, mi2s, pdm, ssbi, spmi, audio_pcm, gpio, gsbi1, gsbi2, gsbi4, gsbi5,
   gsbi5_spi_cs1, gsbi5_spi_cs2, gsbi5_spi_cs3, gsbi6, gsbi7, nss_spi, sdc1,
   spdif, nand, tsif1, tsif2, usb_fs_n, usb_fs, usb2_hsic, rgmii2, sata,
   pcie1_rst, pcie1_prsnt, pcie1_pwren_n, pcie1_pwren, pcie1_pwrflt,
diff --git a/Documentation/devicetree/bindings/pinctrl/qcom,msm8960-pinctrl.txt b/Documentation/devicetree/bindings/pinctrl/qcom,msm8960-pinctrl.txt
new file mode 100644 (file)
index 0000000..93b7de9
--- /dev/null
@@ -0,0 +1,181 @@
+Qualcomm MSM8960 TLMM block
+
+This binding describes the Top Level Mode Multiplexer block found in the
+MSM8960 platform.
+
+- compatible:
+       Usage: required
+       Value type: <string>
+       Definition: must be "qcom,msm8960-pinctrl"
+
+- reg:
+       Usage: required
+       Value type: <prop-encoded-array>
+       Definition: the base address and size of the TLMM register space.
+
+- interrupts:
+       Usage: required
+       Value type: <prop-encoded-array>
+       Definition: should specify the TLMM summary IRQ.
+
+- interrupt-controller:
+       Usage: required
+       Value type: <none>
+       Definition: identifies this node as an interrupt controller
+
+- #interrupt-cells:
+       Usage: required
+       Value type: <u32>
+       Definition: must be 2. Specifying the pin number and flags, as defined
+                   in <dt-bindings/interrupt-controller/irq.h>
+
+- gpio-controller:
+       Usage: required
+       Value type: <none>
+       Definition: identifies this node as a gpio controller
+
+- #gpio-cells:
+       Usage: required
+       Value type: <u32>
+       Definition: must be 2. Specifying the pin number and flags, as defined
+                   in <dt-bindings/gpio/gpio.h>
+
+Please refer to ../gpio/gpio.txt and ../interrupt-controller/interrupts.txt for
+a general description of GPIO and interrupt bindings.
+
+Please refer to pinctrl-bindings.txt in this directory for details of the
+common pinctrl bindings used by client devices, including the meaning of the
+phrase "pin configuration node".
+
+The pin configuration nodes act as a container for an abitrary number of
+subnodes. Each of these subnodes represents some desired configuration for a
+pin, a group, or a list of pins or groups. This configuration can include the
+mux function to select on those pin(s)/group(s), and various pin configuration
+parameters, such as pull-up, drive strength, etc.
+
+
+PIN CONFIGURATION NODES:
+
+The name of each subnode is not important; all subnodes should be enumerated
+and processed purely based on their content.
+
+Each subnode only affects those parameters that are explicitly listed. In
+other words, a subnode that lists a mux function but no pin configuration
+parameters implies no information about any pin configuration parameters.
+Similarly, a pin subnode that describes a pullup parameter implies no
+information about e.g. the mux function.
+
+
+The following generic properties as defined in pinctrl-bindings.txt are valid
+to specify in a pin configuration subnode:
+
+- pins:
+       Usage: required
+       Value type: <string-array>
+       Definition: List of gpio pins affected by the properties specified in
+                   this subnode.  Valid pins are:
+                   gpio0-gpio151,
+                   sdc1_clk,
+                   sdc1_cmd,
+                   sdc1_data
+                   sdc3_clk,
+                   sdc3_cmd,
+                   sdc3_data
+
+- function:
+       Usage: required
+       Value type: <string>
+       Definition: Specify the alternative function to be configured for the
+                   specified pins. Functions are only valid for gpio pins.
+                   Valid values are:
+                   audio_pcm, bt, cam_mclk0, cam_mclk1, cam_mclk2,
+                   codec_mic_i2s, codec_spkr_i2s, ext_gps, fm, gps_blanking,
+                   gps_pps_in, gps_pps_out, gp_clk_0a, gp_clk_0b, gp_clk_1a,
+                   gp_clk_1b, gp_clk_2a, gp_clk_2b, gp_mn, gp_pdm_0a,
+                   gp_pdm_0b, gp_pdm_1a, gp_pdm_1b, gp_pdm_2a, gp_pdm_2b, gpio,
+                   gsbi1, gsbi1_spi_cs1_n, gsbi1_spi_cs2a_n, gsbi1_spi_cs2b_n,
+                   gsbi1_spi_cs3_n, gsbi2, gsbi2_spi_cs1_n, gsbi2_spi_cs2_n,
+                   gsbi2_spi_cs3_n, gsbi3, gsbi4, gsbi4_3d_cam_i2c_l,
+                   gsbi4_3d_cam_i2c_r, gsbi5, gsbi5_3d_cam_i2c_l,
+                   gsbi5_3d_cam_i2c_r, gsbi6, gsbi7, gsbi8, gsbi9, gsbi10,
+                   gsbi11, gsbi11_spi_cs1a_n, gsbi11_spi_cs1b_n,
+                   gsbi11_spi_cs2a_n, gsbi11_spi_cs2b_n, gsbi11_spi_cs3_n,
+                   gsbi12, hdmi_cec, hdmi_ddc_clock, hdmi_ddc_data,
+                   hdmi_hot_plug_detect, hsic, mdp_vsync, mi2s, mic_i2s,
+                   pmb_clk, pmb_ext_ctrl, ps_hold, rpm_wdog, sdc2, sdc4, sdc5,
+                   slimbus1, slimbus2, spkr_i2s, ssbi1, ssbi2, ssbi_ext_gps,
+                   ssbi_pmic2, ssbi_qpa1, ssbi_ts, tsif1, tsif2, ts_eoc,
+                   usb_fs1, usb_fs1_oe, usb_fs1_oe_n, usb_fs2, usb_fs2_oe,
+                   usb_fs2_oe_n, vfe_camif_timer1_a, vfe_camif_timer1_b,
+                   vfe_camif_timer2, vfe_camif_timer3_a, vfe_camif_timer3_b,
+                   vfe_camif_timer4_a, vfe_camif_timer4_b, vfe_camif_timer4_c,
+                   vfe_camif_timer5_a, vfe_camif_timer5_b, vfe_camif_timer6_a,
+                   vfe_camif_timer6_b, vfe_camif_timer6_c, vfe_camif_timer7_a,
+                   vfe_camif_timer7_b, vfe_camif_timer7_c, wlan
+
+- bias-disable:
+       Usage: optional
+       Value type: <none>
+       Definition: The specified pins should be configued as no pull.
+
+- bias-pull-down:
+       Usage: optional
+       Value type: <none>
+       Definition: The specified pins should be configued as pull down.
+
+- bias-pull-up:
+       Usage: optional
+       Value type: <none>
+       Definition: The specified pins should be configued as pull up.
+
+- output-high:
+       Usage: optional
+       Value type: <none>
+       Definition: The specified pins are configured in output mode, driven
+                   high.
+                   Not valid for sdc pins.
+
+- output-low:
+       Usage: optional
+       Value type: <none>
+       Definition: The specified pins are configured in output mode, driven
+                   low.
+                   Not valid for sdc pins.
+
+- drive-strength:
+       Usage: optional
+       Value type: <u32>
+       Definition: Selects the drive strength for the specified pins, in mA.
+                   Valid values are: 2, 4, 6, 8, 10, 12, 14 and 16
+
+Example:
+
+       msmgpio: pinctrl@800000 {
+               compatible = "qcom,msm8960-pinctrl";
+               reg = <0x800000 0x4000>;
+
+               gpio-controller;
+               #gpio-cells = <2>;
+               interrupt-controller;
+               #interrupt-cells = <2>;
+               interrupts = <0 16 0x4>;
+
+               gsbi8_uart: gsbi8-uart {
+                       mux {
+                               pins = "gpio34", "gpio35";
+                               function = "gsbi8";
+                       };
+
+                       tx {
+                               pins = "gpio34";
+                               drive-strength = <4>;
+                               bias-disable;
+                       };
+
+                       rx {
+                               pins = "gpio35";
+                               drive-strength = <2>;
+                               bias-pull-up;
+                       };
+               };
+       };
index 73262b575dfc2481b8cf1925a7652dc9020f656d..d2ea80dc43ebca126558ed3f97d8a395f1b63c7c 100644 (file)
@@ -70,7 +70,7 @@ Valid values for function are:
   cam_mckl0, cam_mclk1, cam_mclk2, cam_mclk3, mdp_vsync, hdmi_cec, hdmi_ddc,
   hdmi_hpd, edp_hpd, gp_pdm0, gp_pdm1, gp_pdm2, gp_pdm3, gp0_clk, gp1_clk,
   gp_mn, tsif1, tsif2, hsic, grfc, audio_ref_clk, qua_mi2s, pri_mi2s, spkr_mi2s,
-  ter_mi2s, sec_mi2s, bt, fm, wlan, slimbus
+  ter_mi2s, sec_mi2s, bt, fm, wlan, slimbus, gpio
 
   (Note that this is not yet the complete list of functions)
 
index 35d2e1f186f0c99ebdab2a66e3c35ce43f4cccc3..daef6fad6a5fb94007a4a0af2d0e4eceb13a47d9 100644 (file)
@@ -15,6 +15,7 @@ Required Properties:
     - "renesas,pfc-r8a7778": for R8A7778 (R-Mobile M1) compatible pin-controller.
     - "renesas,pfc-r8a7779": for R8A7779 (R-Car H1) compatible pin-controller.
     - "renesas,pfc-r8a7790": for R8A7790 (R-Car H2) compatible pin-controller.
+    - "renesas,pfc-r8a7791": for R8A7791 (R-Car M2) compatible pin-controller.
     - "renesas,pfc-sh7372": for SH7372 (SH-Mobile AP4) compatible pin-controller.
     - "renesas,pfc-sh73a0": for SH73A0 (SH-Mobile AG5) compatible pin-controller.
 
index cefef741a40b4e795eee20ae6375a86083427c6d..4658b69d4f4dd3a5876e5967e35edbed6d486eb7 100644 (file)
@@ -21,6 +21,7 @@ defined as gpio sub-nodes of the pinmux controller.
 Required properties for iomux controller:
   - compatible: one of "rockchip,rk2928-pinctrl", "rockchip,rk3066a-pinctrl"
                       "rockchip,rk3066b-pinctrl", "rockchip,rk3188-pinctrl"
+                      "rockchip,rk3288-pinctrl"
   - rockchip,grf: phandle referencing a syscon providing the
         "general register files"
 
@@ -36,7 +37,7 @@ Deprecated properties for iomux controller:
         Use rockchip,grf and rockchip,pmu described above instead.
 
 Required properties for gpio sub nodes:
-  - compatible: "rockchip,gpio-bank", "rockchip,rk3188-gpio-bank0"
+  - compatible: "rockchip,gpio-bank"
   - reg: register of the gpio bank (different than the iomux registerset)
   - interrupts: base interrupt of the gpio bank in the interrupt controller
   - clocks: clock that drives this bank
@@ -50,6 +51,7 @@ Required properties for gpio sub nodes:
     bindings/interrupt-controller/interrupts.txt
 
 Deprecated properties for gpio sub nodes:
+  - compatible: "rockchip,rk3188-gpio-bank0"
   - reg: second element: separate pull register for rk3188 bank0, use
         rockchip,pmu described above instead
 
index 2b32783ba8210dda7fd78b231c512a9e672d694a..e82aaf4925176758437552d0becae0aa530387b7 100644 (file)
@@ -44,7 +44,11 @@ Required Properties:
 - Pin mux/config groups as child nodes: The pin mux (selecting pin function
   mode) and pin config (pull up/down, driver strength) settings are represented
   as child nodes of the pin-controller node. There should be atleast one
-  child node and there is no limit on the count of these child nodes.
+  child node and there is no limit on the count of these child nodes. It is
+  also possible for a child node to consist of several further child nodes
+  to allow grouping multiple pinctrl groups into one. The format of second
+  level child nodes is exactly the same as for first level ones and is
+  described below.
 
   The child node should contain a list of pin(s) on which a particular pin
   function selection or pin configuration (or both) have to applied. This
@@ -71,6 +75,7 @@ Required Properties:
   "samsung,pins" property of the child node. The following pin configuration
   properties are supported.
 
+  - samsung,pin-val: Initial value of pin output buffer.
   - samsung,pin-pud: Pull up/down configuration.
   - samsung,pin-drv: Drive strength configuration.
   - samsung,pin-pud-pdn: Pull up/down configuration in power down mode.
@@ -249,6 +254,23 @@ Example 1: A pin-controller node with pin groups.
                        samsung,pin-pud = <3>;
                        samsung,pin-drv = <0>;
                };
+
+               sd4_bus8: sd4-bus-width8 {
+                       part-1 {
+                               samsung,pins = "gpk0-3", "gpk0-4",
+                                               "gpk0-5", "gpk0-6";
+                               samsung,pin-function = <3>;
+                               samsung,pin-pud = <3>;
+                               samsung,pin-drv = <3>;
+                       };
+                       part-2 {
+                               samsung,pins = "gpk1-3", "gpk1-4",
+                                               "gpk1-5", "gpk1-6";
+                               samsung,pin-function = <4>;
+                               samsung,pin-pud = <4>;
+                               samsung,pin-drv = <3>;
+                       };
+               };
        };
 
 Example 2: A pin-controller node with external wakeup interrupt controller node.
index d290988ed975fee4883ff6a49a0e5d79ae82feee..20191315e444e94594e03da0965b1d8904be312a 100644 (file)
@@ -86,7 +86,7 @@ as per the datasheet of s5m8767.
 
        - LDOn
                  - valid values for n are 1 to 28
-                 - Example: LDO1, LD02, LDO28
+                 - Example: LDO1, LDO2, LDO28
        - BUCKn
                  - valid values for n are 1 to 9.
                  - Example: BUCK1, BUCK2, BUCK9
diff --git a/Documentation/devicetree/bindings/serial/cdns,uart.txt b/Documentation/devicetree/bindings/serial/cdns,uart.txt
new file mode 100644 (file)
index 0000000..a3eb154
--- /dev/null
@@ -0,0 +1,20 @@
+Binding for Cadence UART Controller
+
+Required properties:
+- compatible : should be "cdns,uart-r1p8", or "xlnx,xuartps"
+- reg: Should contain UART controller registers location and length.
+- interrupts: Should contain UART controller interrupts.
+- clocks: Must contain phandles to the UART clocks
+  See ../clocks/clock-bindings.txt for details.
+- clock-names: Tuple to identify input clocks, must contain "uart_clk" and "pclk"
+  See ../clocks/clock-bindings.txt for details.
+
+
+Example:
+       uart@e0000000 {
+               compatible = "cdns,uart-r1p8";
+               clocks = <&clkc 23>, <&clkc 40>;
+               clock-names = "uart_clk", "pclk";
+               reg = <0xE0000000 0x1000>;
+               interrupts = <0 27 4>;
+       };
index 792efbaedc54ced63a949793d1189aa252d2b8ac..1e8a8578148fe39c1c6c8abfc48d72f59cc50762 100644 (file)
@@ -8,7 +8,6 @@ Required SoC Specific Properties:
 - compatible: should be one of the following.
     - samsung,s3c2443-spi: for s3c2443, s3c2416 and s3c2450 platforms
     - samsung,s3c6410-spi: for s3c6410 platforms
-    - samsung,s5p6440-spi: for s5p6440 and s5p6450 platforms
     - samsung,s5pv210-spi: for s5pv210 and s5pc110 platforms
     - samsung,exynos4210-spi: for exynos4 and exynos5 platforms
 
index d415b38ec8ca2f928d6b5b815b0da7230940cc1e..3dc9188ce02313b198bea97a1b38e0de809199d9 100644 (file)
@@ -6,6 +6,7 @@ using them to avoid name-space collisions.
 abilis Abilis Systems
 active-semi    Active-Semi International Inc
 ad     Avionic Design GmbH
+adapteva       Adapteva, Inc.
 adi    Analog Devices, Inc.
 aeroflexgaisler        Aeroflex Gaisler AB
 ak     Asahi Kasei Corp.
@@ -72,6 +73,7 @@ karo  Ka-Ro electronics GmbH
 keymile        Keymile GmbH
 lacie  LaCie
 lantiq Lantiq Semiconductor
+lenovo Lenovo Group Ltd.
 lg     LG Corporation
 linux  Linux-specific binding
 lsi    LSI Corp. (LSI Logic)
@@ -124,6 +126,7 @@ sii Seiko Instruments, Inc.
 sirf   SiRF Technology, Inc.
 smsc   Standard Microsystems Corporation
 snps   Synopsys, Inc.
+solidrun       SolidRun
 spansion       Spansion Inc.
 st     STMicroelectronics
 ste    ST-Ericsson
index 33b5730d07bac80403041f2482d06b5d17767ebc..31036c667d541a8057111915afc5b6c7eb0d6e9f 100644 (file)
@@ -1,7 +1,9 @@
 Exynos MIPI DSI Master
 
 Required properties:
-  - compatible: "samsung,exynos4210-mipi-dsi"
+  - compatible: value should be one of the following
+               "samsung,exynos4210-mipi-dsi" /* for Exynos4 SoCs */
+               "samsung,exynos5410-mipi-dsi" /* for Exynos5410/5420/5440 SoCs */
   - reg: physical base address and length of the registers set for the device
   - interrupts: should contain DSI interrupt
   - clocks: list of clock specifiers, must contain an entry for each required
index 7bfde9c9d658d780e82452d52d3fa5cfa3e36919..08b394b1edbfff3e3857108ebe70c1b7f5c356d1 100644 (file)
@@ -4,8 +4,9 @@ Required properties:
 - compatible: value should be one of the following:
        1) "samsung,exynos5-mixer" <DEPRECATED>
        2) "samsung,exynos4210-mixer"
-       3) "samsung,exynos5250-mixer"
-       4) "samsung,exynos5420-mixer"
+       3) "samsung,exynos4212-mixer"
+       4) "samsung,exynos5250-mixer"
+       5) "samsung,exynos5420-mixer"
 
 - reg: physical base address of the mixer and length of memory mapped
        region.
index 2dad41b689af7a41b02cab8b3498395523b4a5fb..ecc899b9817b23718a2e321ed58bc6a28209a750 100644 (file)
@@ -8,8 +8,6 @@ Required properties:
 - compatible: value should be one of the following
                "samsung,s3c2443-fimd"; /* for S3C24XX SoCs */
                "samsung,s3c6400-fimd"; /* for S3C64XX SoCs */
-               "samsung,s5p6440-fimd"; /* for S5P64X0 SoCs */
-               "samsung,s5pc100-fimd"; /* for S5PC100 SoC  */
                "samsung,s5pv210-fimd"; /* for S5PV210 SoC */
                "samsung,exynos4210-fimd"; /* for Exynos4 SoCs */
                "samsung,exynos5250-fimd"; /* for Exynos5 SoCs */
@@ -44,6 +42,34 @@ Optional Properties:
 - display-timings: timing settings for FIMD, as described in document [1].
                Can be used in case timings cannot be provided otherwise
                or to override timings provided by the panel.
+- samsung,sysreg: handle to syscon used to control the system registers
+- i80-if-timings: timing configuration for lcd i80 interface support.
+  - cs-setup: clock cycles for the active period of address signal is enabled
+              until chip select is enabled.
+              If not specified, the default value(0) will be used.
+  - wr-setup: clock cycles for the active period of CS signal is enabled until
+              write signal is enabled.
+              If not specified, the default value(0) will be used.
+  - wr-active: clock cycles for the active period of CS is enabled.
+               If not specified, the default value(1) will be used.
+  - wr-hold: clock cycles for the active period of CS is disabled until write
+             signal is disabled.
+             If not specified, the default value(0) will be used.
+
+  The parameters are defined as:
+
+    VCLK(internal)  __|??????|_____|??????|_____|??????|_____|??????|_____|??
+                      :            :            :            :            :
+    Address Output  --:<XXXXXXXXXXX:XXXXXXXXXXXX:XXXXXXXXXXXX:XXXXXXXXXXXX:XX
+                      | cs-setup+1 |            :            :            :
+                      |<---------->|            :            :            :
+    Chip Select     ???????????????|____________:____________:____________|??
+                                   | wr-setup+1 |            | wr-hold+1  |
+                                   |<---------->|            |<---------->|
+    Write Enable    ????????????????????????????|____________|???????????????
+                                                | wr-active+1|
+                                                |<---------->|
+    Video Data      ----------------------------<XXXXXXXXXXXXXXXXXXXXXXXXX>--
 
 The device node can contain 'port' child nodes according to the bindings defined
 in [2]. The following are properties specific to those nodes:
index 664fd887cc37afcfa4096ff7ccbb450962bc6466..a8eb6afce6a412a80ce576911bc17b20294891d6 100644 (file)
@@ -3745,6 +3745,10 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
                        Disables the ticketlock slowpath using Xen PV
                        optimizations.
 
+       xen_nopv        [X86]
+                       Disables the PV optimizations forcing the HVM guest to
+                       run as generic HVM guest with no PV drivers.
+
        xirc2ps_cs=     [NET,PCMCIA]
                        Format:
                        <irq>,<irq_mask>,<io>,<full_duplex>,<do_sound>,<lockup_hack>[,<irq2>[,<irq3>[,<irq4>]]]
index 6db73df0427848fcd1083445c004e2724205854a..a68784d0a1ee1a99c432d1dd984c1f9bf9ae7406 100644 (file)
@@ -17,8 +17,6 @@ firmware-assisted-dump.txt
        - Documentation on the firmware assisted dump mechanism "fadump".
 hvcs.txt
        - IBM "Hypervisor Virtual Console Server" Installation Guide
-kvm_440.txt
-       - Various notes on the implementation of KVM for PowerPC 440.
 mpc52xx.txt
        - Linux 2.6.x on MPC52xx family
 pmu-ebb.txt
diff --git a/Documentation/powerpc/kvm_440.txt b/Documentation/powerpc/kvm_440.txt
deleted file mode 100644 (file)
index c02a003..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-Hollis Blanchard <hollisb@us.ibm.com>
-15 Apr 2008
-
-Various notes on the implementation of KVM for PowerPC 440:
-
-To enforce isolation, host userspace, guest kernel, and guest userspace all
-run at user privilege level. Only the host kernel runs in supervisor mode.
-Executing privileged instructions in the guest traps into KVM (in the host
-kernel), where we decode and emulate them. Through this technique, unmodified
-440 Linux kernels can be run (slowly) as guests. Future performance work will
-focus on reducing the overhead and frequency of these traps.
-
-The usual code flow is started from userspace invoking an "run" ioctl, which
-causes KVM to switch into guest context. We use IVPR to hijack the host
-interrupt vectors while running the guest, which allows us to direct all
-interrupts to kvmppc_handle_interrupt(). At this point, we could either
-- handle the interrupt completely (e.g. emulate "mtspr SPRG0"), or
-- let the host interrupt handler run (e.g. when the decrementer fires), or
-- return to host userspace (e.g. when the guest performs device MMIO)
-
-Address spaces: We take advantage of the fact that Linux doesn't use the AS=1
-address space (in host or guest), which gives us virtual address space to use
-for guest mappings. While the guest is running, the host kernel remains mapped
-in AS=0, but the guest can only use AS=1 mappings.
-
-TLB entries: The TLB entries covering the host linear mapping remain
-present while running the guest. This reduces the overhead of lightweight
-exits, which are handled by KVM running in the host kernel. We keep three
-copies of the TLB:
- - guest TLB: contents of the TLB as the guest sees it
- - shadow TLB: the TLB that is actually in hardware while guest is running
- - host TLB: to restore TLB state when context switching guest -> host
-When a TLB miss occurs because a mapping was not present in the shadow TLB,
-but was present in the guest TLB, KVM handles the fault without invoking the
-guest. Large guest pages are backed by multiple 4KB shadow pages through this
-mechanism.
-
-IO: MMIO and DCR accesses are emulated by userspace. We use virtio for network
-and block IO, so those drivers must be enabled in the guest. It's possible
-that some qemu device emulation (e.g. e1000 or rtl8139) may also work with
-little effort.
index 68cda1fc3d523810f55e2de960e72bce4808bf0f..beae3fde075ee50bd790e3c8acebbaa93d0e9fc7 100644 (file)
@@ -148,9 +148,9 @@ of banks, as set via the KVM_X86_SETUP_MCE ioctl.
 
 4.4 KVM_CHECK_EXTENSION
 
-Capability: basic
+Capability: basic, KVM_CAP_CHECK_EXTENSION_VM for vm ioctl
 Architectures: all
-Type: system ioctl
+Type: system ioctl, vm ioctl
 Parameters: extension identifier (KVM_CAP_*)
 Returns: 0 if unsupported; 1 (or some other positive integer) if supported
 
@@ -160,6 +160,9 @@ receives an integer that describes the extension availability.
 Generally 0 means no and 1 means yes, but some extensions may report
 additional information in the integer return value.
 
+Based on their initialization different VMs may have different capabilities.
+It is thus encouraged to use the vm ioctl to query for capabilities (available
+with KVM_CAP_CHECK_EXTENSION_VM on the vm fd)
 
 4.5 KVM_GET_VCPU_MMAP_SIZE
 
@@ -1892,7 +1895,8 @@ registers, find a list below:
   PPC   | KVM_REG_PPC_PID               | 64
   PPC   | KVM_REG_PPC_ACOP              | 64
   PPC   | KVM_REG_PPC_VRSAVE            | 32
-  PPC   | KVM_REG_PPC_LPCR              | 64
+  PPC   | KVM_REG_PPC_LPCR              | 32
+  PPC   | KVM_REG_PPC_LPCR_64           | 64
   PPC   | KVM_REG_PPC_PPR               | 64
   PPC   | KVM_REG_PPC_ARCH_COMPAT       | 32
   PPC   | KVM_REG_PPC_DABRX             | 32
@@ -2677,8 +2681,8 @@ The 'data' member contains, in its first 'len' bytes, the value as it would
 appear if the VCPU performed a load or store of the appropriate width directly
 to the byte array.
 
-NOTE: For KVM_EXIT_IO, KVM_EXIT_MMIO, KVM_EXIT_OSI, KVM_EXIT_DCR,
-      KVM_EXIT_PAPR and KVM_EXIT_EPR the corresponding
+NOTE: For KVM_EXIT_IO, KVM_EXIT_MMIO, KVM_EXIT_OSI, KVM_EXIT_PAPR and
+      KVM_EXIT_EPR the corresponding
 operations are complete (and guest state is consistent) only after userspace
 has re-entered the kernel with KVM_RUN.  The kernel side will first finish
 incomplete operations and then check for pending signals.  Userspace
@@ -2749,7 +2753,7 @@ Principles of Operation Book in the Chapter for Dynamic Address Translation
                        __u8  is_write;
                } dcr;
 
-powerpc specific.
+Deprecated - was used for 440 KVM.
 
                /* KVM_EXIT_OSI */
                struct {
@@ -2931,8 +2935,8 @@ The fields in each entry are defined as follows:
          this function/index combination
 
 
-6. Capabilities that can be enabled
------------------------------------
+6. Capabilities that can be enabled on vCPUs
+--------------------------------------------
 
 There are certain capabilities that change the behavior of the virtual CPU or
 the virtual machine when enabled. To enable them, please see section 4.37.
@@ -3091,3 +3095,43 @@ Parameters: none
 
 This capability enables the in-kernel irqchip for s390. Please refer to
 "4.24 KVM_CREATE_IRQCHIP" for details.
+
+7. Capabilities that can be enabled on VMs
+------------------------------------------
+
+There are certain capabilities that change the behavior of the virtual
+machine when enabled. To enable them, please see section 4.37. Below
+you can find a list of capabilities and what their effect on the VM
+is when enabling them.
+
+The following information is provided along with the description:
+
+  Architectures: which instruction set architectures provide this ioctl.
+      x86 includes both i386 and x86_64.
+
+  Parameters: what parameters are accepted by the capability.
+
+  Returns: the return value.  General error numbers (EBADF, ENOMEM, EINVAL)
+      are not detailed, but errors with specific meanings are.
+
+
+7.1 KVM_CAP_PPC_ENABLE_HCALL
+
+Architectures: ppc
+Parameters: args[0] is the sPAPR hcall number
+           args[1] is 0 to disable, 1 to enable in-kernel handling
+
+This capability controls whether individual sPAPR hypercalls (hcalls)
+get handled by the kernel or not.  Enabling or disabling in-kernel
+handling of an hcall is effective across the VM.  On creation, an
+initial set of hcalls are enabled for in-kernel handling, which
+consists of those hcalls for which in-kernel handlers were implemented
+before this capability was implemented.  If disabled, the kernel will
+not to attempt to handle the hcall, but will always exit to userspace
+to handle it.  Note that it may not make sense to enable some and
+disable others of a group of related hcalls, but KVM does not prevent
+userspace from doing that.
+
+If the hcall number specified is not one that has an in-kernel
+implementation, the KVM_ENABLE_CAP ioctl will fail with an EINVAL
+error.
index 101445b1a92bae13915f3565f72281aea7d20bcc..30873e781dfa9584d22c002ef0f41aa5e571cb75 100644 (file)
@@ -985,6 +985,14 @@ F: arch/arm/mach-pxa/hx4700.c
 F:     arch/arm/mach-pxa/include/mach/hx4700.h
 F:     sound/soc/pxa/hx4700.c
 
+ARM/HISILICON SOC SUPPORT
+M:     Wei Xu <xuwei5@hisilicon.com>
+L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
+W:     http://www.hisilicon.com
+S:     Supported
+T:     git git://github.com/hisilicon/linux-hisi.git
+F:     arch/arm/mach-hisi/
+
 ARM/HP JORNADA 7XX MACHINE SUPPORT
 M:     Kristoffer Ericson <kristoffer.ericson@gmail.com>
 W:     www.jlime.com
@@ -1116,14 +1124,13 @@ L:      linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 S:     Maintained
 F:     arch/arm/mach-berlin/
 
-ARM/Marvell Dove/Kirkwood/MV78xx0/Orion SOC support
+ARM/Marvell Dove/MV78xx0/Orion SOC support
 M:     Jason Cooper <jason@lakedaemon.net>
 M:     Andrew Lunn <andrew@lunn.ch>
 M:     Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
 L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 S:     Maintained
 F:     arch/arm/mach-dove/
-F:     arch/arm/mach-kirkwood/
 F:     arch/arm/mach-mv78xx0/
 F:     arch/arm/mach-orion5x/
 F:     arch/arm/plat-orion/
@@ -1376,6 +1383,7 @@ F:        drivers/pinctrl/pinctrl-st.c
 F:     drivers/media/rc/st_rc.c
 F:     drivers/i2c/busses/i2c-st.c
 F:     drivers/tty/serial/st-asc.c
+F:     drivers/mmc/host/sdhci-st.c
 
 ARM/TECHNOLOGIC SYSTEMS TS7250 MACHINE SUPPORT
 M:     Lennert Buytenhek <kernel@wantstofly.org>
@@ -2005,6 +2013,14 @@ F:       arch/arm/mach-bcm/bcm_5301x.c
 F:     arch/arm/boot/dts/bcm5301x.dtsi
 F:     arch/arm/boot/dts/bcm470*
 
+BROADCOM BCM7XXX ARM ARCHITECTURE
+M:     Marc Carino <marc.ceeeee@gmail.com>
+M:     Brian Norris <computersforpeace@gmail.com>
+L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
+S:     Maintained
+F:     arch/arm/mach-bcm/*brcmstb*
+F:     arch/arm/boot/dts/bcm7*.dts*
+
 BROADCOM TG3 GIGABIT ETHERNET DRIVER
 M:     Prashant Sreedharan <prashant@broadcom.com>
 M:     Michael Chan <mchan@broadcom.com>
@@ -6014,8 +6030,7 @@ F:        include/media/mt9v032.h
 MULTIFUNCTION DEVICES (MFD)
 M:     Samuel Ortiz <sameo@linux.intel.com>
 M:     Lee Jones <lee.jones@linaro.org>
-T:     git git://git.kernel.org/pub/scm/linux/kernel/git/sameo/mfd-next.git
-T:     git git://git.kernel.org/pub/scm/linux/kernel/git/sameo/mfd-fixes.git
+T:     git git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd.git
 S:     Supported
 F:     drivers/mfd/
 F:     include/linux/mfd/
@@ -6864,6 +6879,12 @@ S:       Maintained
 F:     Documentation/devicetree/bindings/pci/host-generic-pci.txt
 F:     drivers/pci/host/pci-host-generic.c
 
+PCIE DRIVER FOR ST SPEAR13XX
+M:     Mohit Kumar <mohit.kumar@st.com>
+L:     linux-pci@vger.kernel.org
+S:     Maintained
+F:     drivers/pci/host/*spear*
+
 PCMCIA SUBSYSTEM
 P:     Linux PCMCIA Team
 L:     linux-pcmcia@lists.infradead.org
@@ -10043,6 +10064,13 @@ S:     Supported
 F:     arch/x86/pci/*xen*
 F:     drivers/pci/*xen*
 
+XEN BLOCK SUBSYSTEM
+M:     Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
+L:     xen-devel@lists.xenproject.org (moderated for non-subscribers)
+S:     Supported
+F:     drivers/block/xen-blkback/*
+F:     drivers/block/xen*
+
 XEN SWIOTLB SUBSYSTEM
 M:     Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
 L:     xen-devel@lists.xenproject.org (moderated for non-subscribers)
index cacc8d5355b34750daf223651248a3eb60fbb427..c49a775937db39912411a33be3d63a5d31eacfba 100644 (file)
@@ -240,13 +240,6 @@ config ARM_PATCH_PHYS_VIRT
          this feature (eg, building a kernel for a single machine) and
          you need to shrink the kernel to the minimal size.
 
-config NEED_MACH_GPIO_H
-       bool
-       help
-         Select this when mach/gpio.h is required to provide special
-         definitions for this platform. The need for mach/gpio.h should
-         be avoided when possible.
-
 config NEED_MACH_IO_H
        bool
        help
@@ -335,7 +328,6 @@ config ARCH_INTEGRATOR
        select HAVE_TCM
        select ICST
        select MULTI_IRQ_HANDLER
-       select NEED_MACH_MEMORY_H
        select PLAT_VERSATILE
        select SPARSE_IRQ
        select USE_OF
@@ -355,7 +347,6 @@ config ARCH_REALVIEW
        select ICST
        select NEED_MACH_MEMORY_H
        select PLAT_VERSATILE
-       select PLAT_VERSATILE_CLCD
        help
          This enables support for ARM Ltd RealView boards.
 
@@ -370,7 +361,6 @@ config ARCH_VERSATILE
        select HAVE_MACH_CLKDEV
        select ICST
        select PLAT_VERSATILE
-       select PLAT_VERSATILE_CLCD
        select PLAT_VERSATILE_CLOCK
        select VERSATILE_FPGA_IRQ
        help
@@ -542,21 +532,6 @@ config ARCH_DOVE
        help
          Support for the Marvell Dove SoC 88AP510
 
-config ARCH_KIRKWOOD
-       bool "Marvell Kirkwood"
-       select ARCH_REQUIRE_GPIOLIB
-       select CPU_FEROCEON
-       select GENERIC_CLOCKEVENTS
-       select MVEBU_MBUS
-       select PCI
-       select PCI_QUIRKS
-       select PINCTRL
-       select PINCTRL_KIRKWOOD
-       select PLAT_ORION_LEGACY
-       help
-         Support for the following Marvell Kirkwood series SoCs:
-         88F6180, 88F6192 and 88F6281.
-
 config ARCH_MV78XX0
        bool "Marvell MV78xx0"
        select ARCH_REQUIRE_GPIOLIB
@@ -773,61 +748,6 @@ config ARCH_S3C64XX
        help
          Samsung S3C64XX series based systems
 
-config ARCH_S5P64X0
-       bool "Samsung S5P6440 S5P6450"
-       select ATAGS
-       select CLKDEV_LOOKUP
-       select CLKSRC_SAMSUNG_PWM
-       select CPU_V6
-       select GENERIC_CLOCKEVENTS
-       select GPIO_SAMSUNG
-       select HAVE_S3C2410_I2C if I2C
-       select HAVE_S3C2410_WATCHDOG if WATCHDOG
-       select HAVE_S3C_RTC if RTC_CLASS
-       select NEED_MACH_GPIO_H
-       select SAMSUNG_ATAGS
-       select SAMSUNG_WDT_RESET
-       help
-         Samsung S5P64X0 CPU based systems, such as the Samsung SMDK6440,
-         SMDK6450.
-
-config ARCH_S5PC100
-       bool "Samsung S5PC100"
-       select ARCH_REQUIRE_GPIOLIB
-       select ATAGS
-       select CLKDEV_LOOKUP
-       select CLKSRC_SAMSUNG_PWM
-       select CPU_V7
-       select GENERIC_CLOCKEVENTS
-       select GPIO_SAMSUNG
-       select HAVE_S3C2410_I2C if I2C
-       select HAVE_S3C2410_WATCHDOG if WATCHDOG
-       select HAVE_S3C_RTC if RTC_CLASS
-       select NEED_MACH_GPIO_H
-       select SAMSUNG_ATAGS
-       select SAMSUNG_WDT_RESET
-       help
-         Samsung S5PC100 series based systems
-
-config ARCH_S5PV210
-       bool "Samsung S5PV210/S5PC110"
-       select ARCH_HAS_HOLES_MEMORYMODEL
-       select ARCH_SPARSEMEM_ENABLE
-       select ATAGS
-       select CLKDEV_LOOKUP
-       select CLKSRC_SAMSUNG_PWM
-       select CPU_V7
-       select GENERIC_CLOCKEVENTS
-       select GPIO_SAMSUNG
-       select HAVE_S3C2410_I2C if I2C
-       select HAVE_S3C2410_WATCHDOG if WATCHDOG
-       select HAVE_S3C_RTC if RTC_CLASS
-       select NEED_MACH_GPIO_H
-       select NEED_MACH_MEMORY_H
-       select SAMSUNG_ATAGS
-       help
-         Samsung S5PV210/S5PC110 series based systems
-
 config ARCH_DAVINCI
        bool "TI DaVinci"
        select ARCH_HAS_HOLES_MEMORYMODEL
@@ -966,8 +886,6 @@ source "arch/arm/mach-ixp4xx/Kconfig"
 
 source "arch/arm/mach-keystone/Kconfig"
 
-source "arch/arm/mach-kirkwood/Kconfig"
-
 source "arch/arm/mach-ks8695/Kconfig"
 
 source "arch/arm/mach-msm/Kconfig"
@@ -978,6 +896,8 @@ source "arch/arm/mach-mv78xx0/Kconfig"
 
 source "arch/arm/mach-imx/Kconfig"
 
+source "arch/arm/mach-mediatek/Kconfig"
+
 source "arch/arm/mach-mxs/Kconfig"
 
 source "arch/arm/mach-netx/Kconfig"
@@ -1019,10 +939,6 @@ source "arch/arm/mach-s3c24xx/Kconfig"
 
 source "arch/arm/mach-s3c64xx/Kconfig"
 
-source "arch/arm/mach-s5p64x0/Kconfig"
-
-source "arch/arm/mach-s5pc100/Kconfig"
-
 source "arch/arm/mach-s5pv210/Kconfig"
 
 source "arch/arm/mach-exynos/Kconfig"
@@ -1569,10 +1485,12 @@ config ARM_PSCI
 config ARCH_NR_GPIO
        int
        default 1024 if ARCH_SHMOBILE || ARCH_TEGRA
-       default 512 if ARCH_EXYNOS || ARCH_KEYSTONE || SOC_OMAP5 || SOC_DRA7XX || ARCH_S3C24XX || ARCH_S3C64XX
+       default 512 if ARCH_EXYNOS || ARCH_KEYSTONE || SOC_OMAP5 || \
+               SOC_DRA7XX || ARCH_S3C24XX || ARCH_S3C64XX || ARCH_S5PV210
        default 416 if ARCH_SUNXI
        default 392 if ARCH_U8500
        default 352 if ARCH_VT8500
+       default 288 if ARCH_ROCKCHIP
        default 264 if MACH_H4700
        default 0
        help
@@ -1584,7 +1502,7 @@ source kernel/Kconfig.preempt
 
 config HZ_FIXED
        int
-       default 200 if ARCH_EBSA110 || ARCH_S3C24XX || ARCH_S5P64X0 || \
+       default 200 if ARCH_EBSA110 || ARCH_S3C24XX || \
                ARCH_S5PV210 || ARCH_EXYNOS4
        default AT91_TIMER_HZ if ARCH_AT91
        default SHMOBILE_TIMER_HZ if ARCH_SHMOBILE_LEGACY
@@ -2211,7 +2129,6 @@ menu "Power management options"
 source "kernel/power/Kconfig"
 
 config ARCH_SUSPEND_POSSIBLE
-       depends on !ARCH_S5PC100
        depends on CPU_ARM920T || CPU_ARM926T || CPU_FEROCEON || CPU_SA1100 || \
                CPU_V6 || CPU_V6K || CPU_V7 || CPU_V7M || CPU_XSC3 || CPU_XSCALE || CPU_MOHAWK
        def_bool y
index 8f90595069a1cafb8af4c5e7db96a160cfc0b671..b11ad54f8d17fa6bfcdc388cbba397814d349bed 100644 (file)
@@ -223,6 +223,14 @@ choice
                  Say Y here if you want kernel low-level debugging support
                  on HI3716 UART.
 
+       config DEBUG_HIX5HD2_UART
+               bool "Hisilicon Hix5hd2 Debug UART"
+               depends on ARCH_HIX5HD2
+               select DEBUG_UART_PL01X
+               help
+                 Say Y here if you want kernel low-level debugging support
+                 on Hix5hd2 UART.
+
        config DEBUG_HIGHBANK_UART
                bool "Kernel low-level debugging messages via Highbank UART"
                depends on ARCH_HIGHBANK
@@ -582,7 +590,7 @@ choice
                  on Rockchip based platforms.
 
        config DEBUG_RK3X_UART0
-               bool "Kernel low-level debugging messages via Rockchip RK3X UART0"
+               bool "Kernel low-level debugging messages via Rockchip RK30/RK31 UART0"
                depends on ARCH_ROCKCHIP
                select DEBUG_UART_8250
                help
@@ -590,7 +598,7 @@ choice
                  on Rockchip based platforms.
 
        config DEBUG_RK3X_UART1
-               bool "Kernel low-level debugging messages via Rockchip RK3X UART1"
+               bool "Kernel low-level debugging messages via Rockchip RK30/RK31 UART1"
                depends on ARCH_ROCKCHIP
                select DEBUG_UART_8250
                help
@@ -598,7 +606,7 @@ choice
                  on Rockchip based platforms.
 
        config DEBUG_RK3X_UART2
-               bool "Kernel low-level debugging messages via Rockchip RK3X UART2"
+               bool "Kernel low-level debugging messages via Rockchip RK30/RK31 UART2"
                depends on ARCH_ROCKCHIP
                select DEBUG_UART_8250
                help
@@ -606,64 +614,64 @@ choice
                  on Rockchip based platforms.
 
        config DEBUG_RK3X_UART3
-               bool "Kernel low-level debugging messages via Rockchip RK3X UART3"
+               bool "Kernel low-level debugging messages via Rockchip RK30/RK31 UART3"
                depends on ARCH_ROCKCHIP
                select DEBUG_UART_8250
                help
                  Say Y here if you want kernel low-level debugging support
                  on Rockchip based platforms.
 
+       config DEBUG_RK32_UART2
+               bool "Kernel low-level debugging messages via Rockchip RK32 UART2"
+               depends on ARCH_ROCKCHIP
+               select DEBUG_UART_8250
+               help
+                 Say Y here if you want kernel low-level debugging support
+                 on Rockchip RK32xx based platforms.
+
        config DEBUG_S3C_UART0
                depends on PLAT_SAMSUNG
                select DEBUG_EXYNOS_UART if ARCH_EXYNOS
                select DEBUG_S3C24XX_UART if ARCH_S3C24XX
-               bool "Use S3C UART 0 for low-level debug"
+               select DEBUG_S5PV210_UART if ARCH_S5PV210
+               bool "Use Samsung S3C UART 0 for low-level debug"
                help
                  Say Y here if you want the debug print routines to direct
                  their output to UART 0. The port must have been initialised
                  by the boot-loader before use.
 
-                 The uncompressor code port configuration is now handled
-                 by CONFIG_S3C_LOWLEVEL_UART_PORT.
-
        config DEBUG_S3C_UART1
                depends on PLAT_SAMSUNG
                select DEBUG_EXYNOS_UART if ARCH_EXYNOS
                select DEBUG_S3C24XX_UART if ARCH_S3C24XX
-               bool "Use S3C UART 1 for low-level debug"
+               select DEBUG_S5PV210_UART if ARCH_S5PV210
+               bool "Use Samsung S3C UART 1 for low-level debug"
                help
                  Say Y here if you want the debug print routines to direct
                  their output to UART 1. The port must have been initialised
                  by the boot-loader before use.
 
-                 The uncompressor code port configuration is now handled
-                 by CONFIG_S3C_LOWLEVEL_UART_PORT.
-
        config DEBUG_S3C_UART2
                depends on PLAT_SAMSUNG
                select DEBUG_EXYNOS_UART if ARCH_EXYNOS
                select DEBUG_S3C24XX_UART if ARCH_S3C24XX
-               bool "Use S3C UART 2 for low-level debug"
+               select DEBUG_S5PV210_UART if ARCH_S5PV210
+               bool "Use Samsung S3C UART 2 for low-level debug"
                help
                  Say Y here if you want the debug print routines to direct
                  their output to UART 2. The port must have been initialised
                  by the boot-loader before use.
 
-                 The uncompressor code port configuration is now handled
-                 by CONFIG_S3C_LOWLEVEL_UART_PORT.
-
        config DEBUG_S3C_UART3
-               depends on PLAT_SAMSUNG && ARCH_EXYNOS
-               select DEBUG_EXYNOS_UART
-               bool "Use S3C UART 3 for low-level debug"
+               depends on PLAT_SAMSUNG && (ARCH_EXYNOS || ARCH_S5PV210)
+               select DEBUG_EXYNOS_UART if ARCH_EXYNOS
+               select DEBUG_S5PV210_UART if ARCH_S5PV210
+               bool "Use Samsung S3C UART 3 for low-level debug"
                help
                  Say Y here if you want the debug print routines to direct
                  their output to UART 3. The port must have been initialised
                  by the boot-loader before use.
 
-                 The uncompressor code port configuration is now handled
-                 by CONFIG_S3C_LOWLEVEL_UART_PORT.
-
        config DEBUG_S3C2410_UART0
                depends on ARCH_S3C24XX
                select DEBUG_S3C2410_UART
@@ -715,6 +723,14 @@ choice
                  Say Y here if you want kernel low-level debugging support
                  on Allwinner A1X based platforms on the UART1.
 
+       config DEBUG_SUNXI_R_UART
+               bool "Kernel low-level debugging messages via sunXi R_UART"
+               depends on MACH_SUN6I || MACH_SUN8I
+               select DEBUG_UART_8250
+               help
+                 Say Y here if you want kernel low-level debugging support
+                 on Allwinner A31/A23 based platforms on the R_UART.
+
        config TEGRA_DEBUG_UART_AUTO_ODMDATA
                bool "Kernel low-level debugging messages via Tegra UART via ODMDATA"
                depends on ARCH_TEGRA
@@ -949,6 +965,9 @@ config DEBUG_S3C2410_UART
 config DEBUG_S3C24XX_UART
        bool
 
+config DEBUG_S5PV210_UART
+       bool
+
 config DEBUG_OMAP2PLUS_UART
        bool
        depends on ARCH_OMAP2PLUS
@@ -991,6 +1010,7 @@ config DEBUG_STI_UART
 config DEBUG_LL_INCLUDE
        string
        default "debug/8250.S" if DEBUG_LL_UART_8250 || DEBUG_UART_8250
+       default "debug/clps711x.S" if DEBUG_CLPS711X_UART1 || DEBUG_CLPS711X_UART2
        default "debug/pl01x.S" if DEBUG_LL_UART_PL01X || DEBUG_UART_PL01X
        default "debug/exynos.S" if DEBUG_EXYNOS_UART
        default "debug/efm32.S" if DEBUG_LL_UART_EFM32
@@ -1009,6 +1029,7 @@ config DEBUG_LL_INCLUDE
        default "debug/msm.S" if DEBUG_MSM_UART || DEBUG_QCOM_UARTDM
        default "debug/omap2plus.S" if DEBUG_OMAP2PLUS_UART
        default "debug/s3c24xx.S" if DEBUG_S3C24XX_UART
+       default "debug/s5pv210.S" if DEBUG_S5PV210_UART
        default "debug/sirf.S" if DEBUG_SIRFPRIMA2_UART1 || DEBUG_SIRFMARCO_UART1
        default "debug/sti.S" if DEBUG_STI_UART
        default "debug/tegra.S" if DEBUG_TEGRA_UART
@@ -1033,7 +1054,7 @@ config DEBUG_UART_8250
        def_bool ARCH_DOVE || ARCH_EBSA110 || \
                (FOOTBRIDGE && !DEBUG_DC21285_PORT) || \
                ARCH_GEMINI || ARCH_IOP13XX || ARCH_IOP32X || \
-               ARCH_IOP33X || ARCH_IXP4XX || ARCH_KIRKWOOD || \
+               ARCH_IOP33X || ARCH_IXP4XX || \
                ARCH_LPC32XX || ARCH_MV78XX0 || ARCH_ORION5X || ARCH_RPC
 
 config DEBUG_UART_PHYS
@@ -1043,6 +1064,7 @@ config DEBUG_UART_PHYS
        default 0x01c28400 if DEBUG_SUNXI_UART1
        default 0x01d0c000 if DEBUG_DAVINCI_DA8XX_UART1
        default 0x01d0d000 if DEBUG_DAVINCI_DA8XX_UART2
+       default 0x01f02800 if DEBUG_SUNXI_R_UART
        default 0x02530c00 if DEBUG_KEYSTONE_UART0
        default 0x02531000 if DEBUG_KEYSTONE_UART1
        default 0x03010fe0 if ARCH_RPC
@@ -1089,13 +1111,14 @@ config DEBUG_UART_PHYS
        default 0xe0000000 if ARCH_SPEAR13XX
        default 0xf0000be0 if ARCH_EBSA110
        default 0xf1012000 if DEBUG_MVEBU_UART_ALTERNATE
-       default 0xf1012000 if ARCH_DOVE || ARCH_KIRKWOOD || ARCH_MV78XX0 || \
+       default 0xf1012000 if ARCH_DOVE || ARCH_MV78XX0 || \
                                ARCH_ORION5X
        default 0xf7fc9000 if DEBUG_BERLIN_UART
-       default 0xf8b00000 if DEBUG_HI3716_UART
+       default 0xf8b00000 if DEBUG_HIX5HD2_UART
        default 0xf991e000 if DEBUG_QCOM_UARTDM
        default 0xfcb00000 if DEBUG_HI3620_UART
        default 0xfe800000 if ARCH_IOP32X
+       default 0xff690000 if DEBUG_RK32_UART2
        default 0xffc02000 if DEBUG_SOCFPGA_UART
        default 0xffd82340 if ARCH_IOP13XX
        default 0xfff36000 if DEBUG_HIGHBANK_UART
@@ -1118,6 +1141,7 @@ config DEBUG_UART_VIRT
        default 0xf1600000 if ARCH_INTEGRATOR
        default 0xf1c28000 if DEBUG_SUNXI_UART0
        default 0xf1c28400 if DEBUG_SUNXI_UART1
+       default 0xf1f02800 if DEBUG_SUNXI_R_UART
        default 0xf2100000 if DEBUG_PXA_UART1
        default 0xf4090000 if ARCH_LPC32XX
        default 0xf4200000 if ARCH_GEMINI
@@ -1144,7 +1168,7 @@ config DEBUG_UART_VIRT
        default 0xfe230000 if DEBUG_PICOXCELL_UART
        default 0xfe300000 if DEBUG_BCM_KONA_UART
        default 0xfe800000 if ARCH_IOP32X
-       default 0xfeb00000 if DEBUG_HI3620_UART || DEBUG_HI3716_UART
+       default 0xfeb00000 if DEBUG_HI3620_UART || DEBUG_HIX5HD2_UART
        default 0xfeb24000 if DEBUG_RK3X_UART0
        default 0xfeb26000 if DEBUG_RK3X_UART1
        default 0xfeb30c00 if DEBUG_KEYSTONE_UART0
@@ -1152,9 +1176,9 @@ config DEBUG_UART_VIRT
        default 0xfec02000 if DEBUG_SOCFPGA_UART
        default 0xfec12000 if DEBUG_MVEBU_UART || DEBUG_MVEBU_UART_ALTERNATE
        default 0xfec20000 if DEBUG_DAVINCI_DMx_UART0
+       default 0xfec90000 if DEBUG_RK32_UART2
        default 0xfed0c000 if DEBUG_DAVINCI_DA8XX_UART1
        default 0xfed0d000 if DEBUG_DAVINCI_DA8XX_UART2
-       default 0xfed12000 if ARCH_KIRKWOOD
        default 0xfed60000 if DEBUG_RK29_UART0
        default 0xfed64000 if DEBUG_RK29_UART1 || DEBUG_RK3X_UART2
        default 0xfed68000 if DEBUG_RK29_UART2 || DEBUG_RK3X_UART3
@@ -1186,7 +1210,7 @@ config DEBUG_UART_8250_WORD
                ARCH_KEYSTONE || \
                DEBUG_DAVINCI_DMx_UART0 || DEBUG_DAVINCI_DA8XX_UART1 || \
                DEBUG_DAVINCI_DA8XX_UART2 || \
-               DEBUG_BCM_KONA_UART
+               DEBUG_BCM_KONA_UART || DEBUG_RK32_UART2
 
 config DEBUG_UART_8250_FLOW_CONTROL
        bool "Enable flow control for 8250 UART"
index 718913dfe81597ae74e1cc1dfe163d9ff1c1ae70..0ce9d0f71f2a318c240e60ab019d155dc94e6925 100644 (file)
@@ -159,14 +159,13 @@ machine-$(CONFIG_ARCH_EP93XX)             += ep93xx
 machine-$(CONFIG_ARCH_EXYNOS)          += exynos
 machine-$(CONFIG_ARCH_GEMINI)          += gemini
 machine-$(CONFIG_ARCH_HIGHBANK)                += highbank
-machine-$(CONFIG_ARCH_HI3xxx)          += hisi
+machine-$(CONFIG_ARCH_HISI)            += hisi
 machine-$(CONFIG_ARCH_INTEGRATOR)      += integrator
 machine-$(CONFIG_ARCH_IOP13XX)         += iop13xx
 machine-$(CONFIG_ARCH_IOP32X)          += iop32x
 machine-$(CONFIG_ARCH_IOP33X)          += iop33x
 machine-$(CONFIG_ARCH_IXP4XX)          += ixp4xx
 machine-$(CONFIG_ARCH_KEYSTONE)                += keystone
-machine-$(CONFIG_ARCH_KIRKWOOD)                += kirkwood
 machine-$(CONFIG_ARCH_KS8695)          += ks8695
 machine-$(CONFIG_ARCH_LPC32XX)         += lpc32xx
 machine-$(CONFIG_ARCH_MMP)             += mmp
@@ -175,6 +174,7 @@ machine-$(CONFIG_ARCH_MSM)          += msm
 machine-$(CONFIG_ARCH_MV78XX0)         += mv78xx0
 machine-$(CONFIG_ARCH_MVEBU)           += mvebu
 machine-$(CONFIG_ARCH_MXC)             += imx
+machine-$(CONFIG_ARCH_MEDIATEK)                += mediatek
 machine-$(CONFIG_ARCH_MXS)             += mxs
 machine-$(CONFIG_ARCH_NETX)            += netx
 machine-$(CONFIG_ARCH_NOMADIK)         += nomadik
@@ -190,8 +190,6 @@ machine-$(CONFIG_ARCH_ROCKCHIP)             += rockchip
 machine-$(CONFIG_ARCH_RPC)             += rpc
 machine-$(CONFIG_ARCH_S3C24XX)         += s3c24xx
 machine-$(CONFIG_ARCH_S3C64XX)         += s3c64xx
-machine-$(CONFIG_ARCH_S5P64X0)         += s5p64x0
-machine-$(CONFIG_ARCH_S5PC100)         += s5pc100
 machine-$(CONFIG_ARCH_S5PV210)         += s5pv210
 machine-$(CONFIG_ARCH_SA1100)          += sa1100
 machine-$(CONFIG_ARCH_SHMOBILE)        += shmobile
@@ -215,11 +213,11 @@ machine-$(CONFIG_PLAT_SPEAR)              += spear
 plat-$(CONFIG_ARCH_EXYNOS)     += samsung
 plat-$(CONFIG_ARCH_OMAP)       += omap
 plat-$(CONFIG_ARCH_S3C64XX)    += samsung
+plat-$(CONFIG_ARCH_S5PV210)    += samsung
 plat-$(CONFIG_PLAT_IOP)                += iop
 plat-$(CONFIG_PLAT_ORION)      += orion
 plat-$(CONFIG_PLAT_PXA)                += pxa
 plat-$(CONFIG_PLAT_S3C24XX)    += samsung
-plat-$(CONFIG_PLAT_S5P)                += samsung
 plat-$(CONFIG_PLAT_VERSATILE)  += versatile
 
 ifeq ($(CONFIG_ARCH_EBSA110),y)
@@ -243,7 +241,7 @@ MACHINE  :=
 endif
 
 machdirs := $(patsubst %,arch/arm/mach-%/,$(machine-y))
-platdirs := $(patsubst %,arch/arm/plat-%/,$(plat-y))
+platdirs := $(patsubst %,arch/arm/plat-%/,$(sort $(plat-y)))
 
 ifneq ($(CONFIG_ARCH_MULTIPLATFORM),y)
 ifeq ($(KBUILD_SRC),)
index adb5ed9e269e196a55c380002d266062fd06c3b7..b8c5cd3ddeb9c0f10e18cff41f8b0aaf33396765 100644 (file)
@@ -59,6 +59,8 @@ dtb-$(CONFIG_ARCH_BERLIN) += \
        berlin2-sony-nsz-gs7.dtb        \
        berlin2cd-google-chromecast.dtb \
        berlin2q-marvell-dmp.dtb
+dtb-$(CONFIG_ARCH_BRCMSTB) += \
+       bcm7445-bcm97445svmb.dtb
 dtb-$(CONFIG_ARCH_DAVINCI) += da850-enbw-cmc.dtb \
        da850-evm.dtb
 dtb-$(CONFIG_ARCH_EFM32) += efm32gg-dk3750.dtb
@@ -66,7 +68,9 @@ dtb-$(CONFIG_ARCH_EXYNOS) += exynos4210-origen.dtb \
        exynos4210-smdkv310.dtb \
        exynos4210-trats.dtb \
        exynos4210-universal_c210.dtb \
+       exynos4412-odroidu3.dtb \
        exynos4412-odroidx.dtb \
+       exynos4412-odroidx2.dtb \
        exynos4412-origen.dtb \
        exynos4412-smdk4412.dtb \
        exynos4412-tiny4412.dtb \
@@ -83,6 +87,7 @@ dtb-$(CONFIG_ARCH_EXYNOS) += exynos4210-origen.dtb \
        exynos5440-ssdk5440.dtb \
        exynos5800-peach-pi.dtb
 dtb-$(CONFIG_ARCH_HI3xxx) += hi3620-hi4511.dtb
+dtb-$(CONFIG_ARCH_HIX5HD2) += hisi-x5hd2-dkb.dtb
 dtb-$(CONFIG_ARCH_HIGHBANK) += highbank.dtb \
        ecx-2000.dtb
 dtb-$(CONFIG_ARCH_INTEGRATOR) += integratorap.dtb \
@@ -90,9 +95,9 @@ dtb-$(CONFIG_ARCH_INTEGRATOR) += integratorap.dtb \
 dtb-$(CONFIG_ARCH_KEYSTONE) += k2hk-evm.dtb \
        k2l-evm.dtb \
        k2e-evm.dtb
-kirkwood := \
-       kirkwood-b3.dtb \
+dtb-$(CONFIG_MACH_KIRKWOOD) += kirkwood-b3.dtb \
        kirkwood-cloudbox.dtb \
+       kirkwood-d2net.dtb \
        kirkwood-db-88f6281.dtb \
        kirkwood-db-88f6282.dtb \
        kirkwood-dns320.dtb \
@@ -123,6 +128,8 @@ kirkwood := \
        kirkwood-lsxhl.dtb \
        kirkwood-mplcec4.dtb \
        kirkwood-mv88f6281gtw-ge.dtb \
+       kirkwood-net2big.dtb \
+       kirkwood-net5big.dtb \
        kirkwood-netgear_readynas_duo_v2.dtb \
        kirkwood-netgear_readynas_nv+_v2.dtb \
        kirkwood-ns2.dtb \
@@ -150,17 +157,19 @@ kirkwood := \
        kirkwood-ts219-6282.dtb \
        kirkwood-ts419-6281.dtb \
        kirkwood-ts419-6282.dtb
-dtb-$(CONFIG_ARCH_KIRKWOOD) += $(kirkwood)
-dtb-$(CONFIG_MACH_KIRKWOOD) += $(kirkwood)
 dtb-$(CONFIG_ARCH_LPC32XX) += ea3250.dtb phy3250.dtb
 dtb-$(CONFIG_ARCH_MARCO) += marco-evb.dtb
 dtb-$(CONFIG_ARCH_MOXART) += moxart-uc7112lx.dtb
 dtb-$(CONFIG_ARCH_MXC) += \
        imx25-eukrea-mbimxsd25-baseboard.dtb \
+       imx25-eukrea-mbimxsd25-baseboard-cmo-qvga.dtb \
+       imx25-eukrea-mbimxsd25-baseboard-dvi-svga.dtb \
+       imx25-eukrea-mbimxsd25-baseboard-dvi-vga.dtb \
        imx25-karo-tx25.dtb \
        imx25-pdk.dtb \
        imx27-apf27.dtb \
        imx27-apf27dev.dtb \
+       imx27-eukrea-mbimxsd27-baseboard.dtb \
        imx27-pdk.dtb \
        imx27-phytec-phycore-rdk.dtb \
        imx27-phytec-phycard-s-rdk.dtb \
@@ -182,6 +191,8 @@ dtb-$(CONFIG_ARCH_MXC) += \
        imx53-tx53-x03x.dtb \
        imx53-tx53-x13x.dtb \
        imx53-voipac-bsb.dtb \
+       imx6dl-aristainetos_4.dtb \
+       imx6dl-aristainetos_7.dtb \
        imx6dl-cubox-i.dtb \
        imx6dl-dfi-fs700-m60.dtb \
        imx6dl-gw51xx.dtb \
@@ -191,11 +202,16 @@ dtb-$(CONFIG_ARCH_MXC) += \
        imx6dl-hummingboard.dtb \
        imx6dl-nitrogen6x.dtb \
        imx6dl-phytec-pbab01.dtb \
+       imx6dl-rex-basic.dtb \
        imx6dl-riotboard.dtb \
        imx6dl-sabreauto.dtb \
        imx6dl-sabrelite.dtb \
        imx6dl-sabresd.dtb \
+       imx6dl-tx6dl-comtft.dtb \
+       imx6dl-tx6u-801x.dtb \
+       imx6dl-tx6u-811x.dtb \
        imx6dl-wandboard.dtb \
+       imx6dl-wandboard-revb1.dtb \
        imx6q-arm2.dtb \
        imx6q-cm-fx6.dtb \
        imx6q-cubox-i.dtb \
@@ -209,13 +225,21 @@ dtb-$(CONFIG_ARCH_MXC) += \
        imx6q-gw54xx.dtb \
        imx6q-nitrogen6x.dtb \
        imx6q-phytec-pbab01.dtb \
+       imx6q-rex-pro.dtb \
        imx6q-sabreauto.dtb \
        imx6q-sabrelite.dtb \
        imx6q-sabresd.dtb \
        imx6q-sbc6x.dtb \
        imx6q-udoo.dtb \
        imx6q-wandboard.dtb \
+       imx6q-wandboard-revb1.dtb \
+       imx6q-tx6q-1010.dtb \
+       imx6q-tx6q-1010-comtft.dtb \
+       imx6q-tx6q-1020.dtb \
+       imx6q-tx6q-1020-comtft.dtb \
+       imx6q-tx6q-1110.dtb \
        imx6sl-evk.dtb \
+       imx6sx-sdb.dtb \
        vf610-colibri.dtb \
        vf610-cosmic.dtb \
        vf610-twr.dtb
@@ -291,7 +315,8 @@ dtb-$(CONFIG_SOC_AM33XX) += am335x-base0033.dtb \
        am335x-boneblack.dtb \
        am335x-evm.dtb \
        am335x-evmsk.dtb \
-       am335x-nano.dtb
+       am335x-nano.dtb \
+       am335x-pepper.dtb
 dtb-$(CONFIG_ARCH_OMAP4) += omap4-duovero-parlor.dtb \
        omap4-panda.dtb \
        omap4-panda-a4.dtb \
@@ -301,6 +326,7 @@ dtb-$(CONFIG_ARCH_OMAP4) += omap4-duovero-parlor.dtb \
        omap4-var-dvk-om44.dtb \
        omap4-var-stk-om44.dtb
 dtb-$(CONFIG_SOC_AM43XX) += am43x-epos-evm.dtb \
+       am437x-sk-evm.dtb \
        am437x-gp-evm.dtb
 dtb-$(CONFIG_SOC_OMAP5) += omap5-cm-t54.dtb \
        omap5-sbc-t54.dtb \
@@ -318,16 +344,25 @@ dtb-$(CONFIG_ARCH_QCOM) += \
        qcom-apq8084-mtp.dtb \
        qcom-msm8660-surf.dtb \
        qcom-msm8960-cdp.dtb
+dtb-$(CONFIG_ARCH_ROCKCHIP) += \
+       rk3066a-bqcurie2.dtb \
+       rk3188-radxarock.dtb \
+       rk3288-evb-act8846.dtb \
+       rk3288-evb-rk808.dtb
 dtb-$(CONFIG_ARCH_S3C24XX) += s3c2416-smdk2416.dtb
 dtb-$(CONFIG_ARCH_S3C64XX) += s3c6410-mini6410.dtb \
        s3c6410-smdk6410.dtb
+dtb-$(CONFIG_ARCH_S5PV210) += s5pv210-aquila.dtb \
+       s5pv210-goni.dtb \
+       s5pv210-smdkc110.dtb \
+       s5pv210-smdkv210.dtb \
+       s5pv210-torbreck.dtb
 dtb-$(CONFIG_ARCH_SHMOBILE_LEGACY) += r7s72100-genmai.dtb \
        r8a7740-armadillo800eva.dtb \
        r8a7778-bockw.dtb \
        r8a7778-bockw-reference.dtb \
        r8a7740-armadillo800eva-reference.dtb \
        r8a7779-marzen.dtb \
-       r8a7779-marzen-reference.dtb \
        r8a7791-koelsch.dtb \
        r8a7790-lager.dtb \
        sh73a0-kzm9g.dtb \
@@ -339,7 +374,8 @@ dtb-$(CONFIG_ARCH_SHMOBILE_MULTI) += emev2-kzm9d.dtb \
        r7s72100-genmai.dtb \
        r8a7791-henninger.dtb \
        r8a7791-koelsch.dtb \
-       r8a7790-lager.dtb
+       r8a7790-lager.dtb \
+       r8a7779-marzen.dtb
 dtb-$(CONFIG_ARCH_SOCFPGA) += socfpga_arria5_socdk.dtb \
        socfpga_cyclone5_socdk.dtb \
        socfpga_cyclone5_sockit.dtb \
@@ -360,6 +396,7 @@ dtb-$(CONFIG_ARCH_STI)+= stih407-b2120.dtb \
        stih416-b2020e.dtb
 dtb-$(CONFIG_MACH_SUN4I) += \
        sun4i-a10-a1000.dtb \
+       sun4i-a10-ba10-tvbox.dtb \
        sun4i-a10-cubieboard.dtb \
        sun4i-a10-mini-xplus.dtb \
        sun4i-a10-hackberry.dtb \
@@ -374,12 +411,16 @@ dtb-$(CONFIG_MACH_SUN5I) += \
 dtb-$(CONFIG_MACH_SUN6I) += \
        sun6i-a31-app4-evb1.dtb \
        sun6i-a31-colombus.dtb \
+       sun6i-a31-hummingbird.dtb \
        sun6i-a31-m9.dtb
 dtb-$(CONFIG_MACH_SUN7I) += \
        sun7i-a20-cubieboard2.dtb \
        sun7i-a20-cubietruck.dtb \
        sun7i-a20-i12-tvbox.dtb \
-       sun7i-a20-olinuxino-micro.dtb
+       sun7i-a20-olinuxino-micro.dtb \
+       sun7i-a20-pcduino3.dtb
+dtb-$(CONFIG_MACH_SUN8I) += \
+       sun8i-a23-ippo-q8h-v5.dtb
 dtb-$(CONFIG_ARCH_TEGRA) += tegra20-harmony.dtb \
        tegra20-iris-512.dtb \
        tegra20-medcom-wide.dtb \
@@ -390,6 +431,7 @@ dtb-$(CONFIG_ARCH_TEGRA) += tegra20-harmony.dtb \
        tegra20-trimslice.dtb \
        tegra20-ventana.dtb \
        tegra20-whistler.dtb \
+       tegra30-apalis-eval.dtb \
        tegra30-beaver.dtb \
        tegra30-cardhu-a02.dtb \
        tegra30-cardhu-a04.dtb \
@@ -419,7 +461,9 @@ dtb-$(CONFIG_ARCH_VT8500) += vt8500-bv07.dtb \
        wm8650-mid.dtb \
        wm8750-apc8750.dtb \
        wm8850-w70v2.dtb
-dtb-$(CONFIG_ARCH_ZYNQ) += zynq-zc702.dtb \
+dtb-$(CONFIG_ARCH_ZYNQ) += \
+       zynq-parallella.dtb \
+       zynq-zc702.dtb \
        zynq-zc706.dtb \
        zynq-zed.dtb
 dtb-$(CONFIG_MACH_ARMADA_370) += \
@@ -437,11 +481,13 @@ dtb-$(CONFIG_MACH_ARMADA_XP) += \
        armada-xp-axpwifiap.dtb \
        armada-xp-db.dtb \
        armada-xp-gp.dtb \
-       armada-xp-netgear-rn2120.dtb \
+       armada-xp-lenovo-ix4-300d.dtb \
        armada-xp-matrix.dtb \
+       armada-xp-netgear-rn2120.dtb \
        armada-xp-openblocks-ax3-4.dtb
 dtb-$(CONFIG_MACH_DOVE) += dove-cm-a510.dtb \
        dove-cubox.dtb \
+       dove-cubox-es.dtb \
        dove-d2plug.dtb \
        dove-d3plug.dtb \
        dove-dove-db.dtb
index 54cb5cf8604aaeb2a164155ea40a651a47690e8c..d9c50fbb49d26415bed4c0aeaab5aa3a2dac3347 100644 (file)
                bootargs = "console=ttyS0,115200 ubi.mtd=4 root=ubi0:rootfs rootfstype=ubifs";
        };
 
+       clocks {
+               slow_xtal {
+                       clock-frequency = <32768>;
+               };
+       };
+
        ahb {
                apb {
                        usart0: serial@fffb0000 {
index 80a3b215e7d63c1b669c7d6fc2ad6777609e5ede..df5fee6b6b4bcf7ac58d33fc1d25b58cb07890a8 100644 (file)
                        "Headphone Jack",       "HPLOUT",
                        "Headphone Jack",       "HPROUT";
        };
+
+       panel {
+               compatible = "ti,tilcdc,panel";
+               pinctrl-names = "default", "sleep";
+               pinctrl-0 = <&lcd_pins_default>;
+               pinctrl-1 = <&lcd_pins_sleep>;
+               status = "okay";
+               panel-info {
+                       ac-bias           = <255>;
+                       ac-bias-intrpt    = <0>;
+                       dma-burst-sz      = <16>;
+                       bpp               = <32>;
+                       fdd               = <0x80>;
+                       sync-edge         = <0>;
+                       sync-ctrl         = <1>;
+                       raster-order      = <0>;
+                       fifo-th           = <0>;
+               };
+               display-timings {
+                       480x272 {
+                               hactive         = <480>;
+                               vactive         = <272>;
+                               hback-porch     = <43>;
+                               hfront-porch    = <8>;
+                               hsync-len       = <4>;
+                               vback-porch     = <12>;
+                               vfront-porch    = <4>;
+                               vsync-len       = <10>;
+                               clock-frequency = <9000000>;
+                               hsync-active    = <0>;
+                               vsync-active    = <0>;
+                       };
+               };
+       };
 };
 
 &am33xx_pinmux {
        pinctrl-names = "default";
        pinctrl-0 = <&gpio_keys_s0 &clkout2_pin>;
 
+       lcd_pins_default: lcd_pins_default {
+               pinctrl-single,pins = <
+                       0x20 (PIN_OUTPUT | MUX_MODE1)   /* gpmc_ad8.lcd_data23 */
+                       0x24 (PIN_OUTPUT | MUX_MODE1)   /* gpmc_ad9.lcd_data22 */
+                       0x28 (PIN_OUTPUT | MUX_MODE1)   /* gpmc_ad10.lcd_data21 */
+                       0x2c (PIN_OUTPUT | MUX_MODE1)   /* gpmc_ad11.lcd_data20 */
+                       0x30 (PIN_OUTPUT | MUX_MODE1)   /* gpmc_ad12.lcd_data19 */
+                       0x34 (PIN_OUTPUT | MUX_MODE1)   /* gpmc_ad13.lcd_data18 */
+                       0x38 (PIN_OUTPUT | MUX_MODE1)   /* gpmc_ad14.lcd_data17 */
+                       0x3c (PIN_OUTPUT | MUX_MODE1)   /* gpmc_ad15.lcd_data16 */
+                       0xa0 (PIN_OUTPUT | MUX_MODE0)   /* lcd_data0.lcd_data0 */
+                       0xa4 (PIN_OUTPUT | MUX_MODE0)   /* lcd_data1.lcd_data1 */
+                       0xa8 (PIN_OUTPUT | MUX_MODE0)   /* lcd_data2.lcd_data2 */
+                       0xac (PIN_OUTPUT | MUX_MODE0)   /* lcd_data3.lcd_data3 */
+                       0xb0 (PIN_OUTPUT | MUX_MODE0)   /* lcd_data4.lcd_data4 */
+                       0xb4 (PIN_OUTPUT | MUX_MODE0)   /* lcd_data5.lcd_data5 */
+                       0xb8 (PIN_OUTPUT | MUX_MODE0)   /* lcd_data6.lcd_data6 */
+                       0xbc (PIN_OUTPUT | MUX_MODE0)   /* lcd_data7.lcd_data7 */
+                       0xc0 (PIN_OUTPUT | MUX_MODE0)   /* lcd_data8.lcd_data8 */
+                       0xc4 (PIN_OUTPUT | MUX_MODE0)   /* lcd_data9.lcd_data9 */
+                       0xc8 (PIN_OUTPUT | MUX_MODE0)   /* lcd_data10.lcd_data10 */
+                       0xcc (PIN_OUTPUT | MUX_MODE0)   /* lcd_data11.lcd_data11 */
+                       0xd0 (PIN_OUTPUT | MUX_MODE0)   /* lcd_data12.lcd_data12 */
+                       0xd4 (PIN_OUTPUT | MUX_MODE0)   /* lcd_data13.lcd_data13 */
+                       0xd8 (PIN_OUTPUT | MUX_MODE0)   /* lcd_data14.lcd_data14 */
+                       0xdc (PIN_OUTPUT | MUX_MODE0)   /* lcd_data15.lcd_data15 */
+                       0xe0 (PIN_OUTPUT | MUX_MODE0)   /* lcd_vsync.lcd_vsync */
+                       0xe4 (PIN_OUTPUT | MUX_MODE0)   /* lcd_hsync.lcd_hsync */
+                       0xe8 (PIN_OUTPUT | MUX_MODE0)   /* lcd_pclk.lcd_pclk */
+                       0xec (PIN_OUTPUT | MUX_MODE0)   /* lcd_ac_bias_en.lcd_ac_bias_en */
+               >;
+       };
+
+       lcd_pins_sleep: lcd_pins_sleep {
+               pinctrl-single,pins = <
+                       0x20 (PIN_INPUT_PULLDOWN | MUX_MODE7)   /* gpmc_ad8.lcd_data23 */
+                       0x24 (PIN_INPUT_PULLDOWN | MUX_MODE7)   /* gpmc_ad9.lcd_data22 */
+                       0x28 (PIN_INPUT_PULLDOWN | MUX_MODE7)   /* gpmc_ad10.lcd_data21 */
+                       0x2c (PIN_INPUT_PULLDOWN | MUX_MODE7)   /* gpmc_ad11.lcd_data20 */
+                       0x30 (PIN_INPUT_PULLDOWN | MUX_MODE7)   /* gpmc_ad12.lcd_data19 */
+                       0x34 (PIN_INPUT_PULLDOWN | MUX_MODE7)   /* gpmc_ad13.lcd_data18 */
+                       0x38 (PIN_INPUT_PULLDOWN | MUX_MODE7)   /* gpmc_ad14.lcd_data17 */
+                       0x3c (PIN_INPUT_PULLDOWN | MUX_MODE7)   /* gpmc_ad15.lcd_data16 */
+                       0xa0 (PULL_DISABLE | MUX_MODE7) /* lcd_data0.lcd_data0 */
+                       0xa4 (PULL_DISABLE | MUX_MODE7) /* lcd_data1.lcd_data1 */
+                       0xa8 (PULL_DISABLE | MUX_MODE7) /* lcd_data2.lcd_data2 */
+                       0xac (PULL_DISABLE | MUX_MODE7) /* lcd_data3.lcd_data3 */
+                       0xb0 (PULL_DISABLE | MUX_MODE7) /* lcd_data4.lcd_data4 */
+                       0xb4 (PULL_DISABLE | MUX_MODE7) /* lcd_data5.lcd_data5 */
+                       0xb8 (PULL_DISABLE | MUX_MODE7) /* lcd_data6.lcd_data6 */
+                       0xbc (PULL_DISABLE | MUX_MODE7) /* lcd_data7.lcd_data7 */
+                       0xc0 (PULL_DISABLE | MUX_MODE7) /* lcd_data8.lcd_data8 */
+                       0xc4 (PULL_DISABLE | MUX_MODE7) /* lcd_data9.lcd_data9 */
+                       0xc8 (PULL_DISABLE | MUX_MODE7) /* lcd_data10.lcd_data10 */
+                       0xcc (PULL_DISABLE | MUX_MODE7) /* lcd_data11.lcd_data11 */
+                       0xd0 (PULL_DISABLE | MUX_MODE7) /* lcd_data12.lcd_data12 */
+                       0xd4 (PULL_DISABLE | MUX_MODE7) /* lcd_data13.lcd_data13 */
+                       0xd8 (PULL_DISABLE | MUX_MODE7) /* lcd_data14.lcd_data14 */
+                       0xdc (PULL_DISABLE | MUX_MODE7) /* lcd_data15.lcd_data15 */
+                       0xe0 (PIN_INPUT_PULLDOWN | MUX_MODE7)   /* lcd_vsync.lcd_vsync */
+                       0xe4 (PIN_INPUT_PULLDOWN | MUX_MODE7)   /* lcd_hsync.lcd_hsync */
+                       0xe8 (PIN_INPUT_PULLDOWN | MUX_MODE7)   /* lcd_pclk.lcd_pclk */
+                       0xec (PIN_INPUT_PULLDOWN | MUX_MODE7)   /* lcd_ac_bias_en.lcd_ac_bias_en */
+               >;
+       };
+
+
        user_leds_s0: user_leds_s0 {
                pinctrl-single,pins = <
                        0x10 (PIN_OUTPUT_PULLDOWN | MUX_MODE7)  /* gpmc_ad4.gpio1_4 */
                ti,wire-config = <0x00 0x11 0x22 0x33>;
        };
 };
+
+&lcdc {
+      status = "okay";
+};
diff --git a/arch/arm/boot/dts/am335x-pepper.dts b/arch/arm/boot/dts/am335x-pepper.dts
new file mode 100644 (file)
index 0000000..0d35ab6
--- /dev/null
@@ -0,0 +1,653 @@
+/*
+ * Copyright (C) 2014 Gumstix, Inc. - https://www.gumstix.com/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+/dts-v1/;
+
+#include <dt-bindings/input/input.h>
+#include "am33xx.dtsi"
+
+/ {
+       model = "Gumstix Pepper";
+       compatible = "gumstix,am335x-pepper", "ti,am33xx";
+
+       cpus {
+               cpu@0 {
+                       cpu0-supply = <&dcdc3_reg>;
+               };
+       };
+
+       memory {
+               device_type = "memory";
+               reg = <0x80000000 0x20000000>; /* 512 MB */
+       };
+
+       buttons: user_buttons {
+               compatible = "gpio-keys";
+       };
+
+       leds: user_leds {
+               compatible = "gpio-leds";
+       };
+
+       panel: lcd_panel {
+               compatible = "ti,tilcdc,panel";
+       };
+
+       sound: sound_iface {
+               compatible = "ti,da830-evm-audio";
+       };
+
+       vbat: fixedregulator@0 {
+               compatible = "regulator-fixed";
+       };
+
+       v3v3c_reg: fixedregulator@1 {
+               compatible = "regulator-fixed";
+       };
+
+       vdd5_reg: fixedregulator@2 {
+               compatible = "regulator-fixed";
+       };
+};
+
+/* I2C Busses */
+&i2c0 {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&i2c0_pins>;
+
+       clock-frequency = <400000>;
+
+       tps: tps@24 {
+               reg = <0x24>;
+       };
+
+       eeprom: eeprom@50 {
+               compatible = "at,24c256";
+               reg = <0x50>;
+       };
+
+       audio_codec: tlv320aic3106@1b {
+               compatible = "ti,tlv320aic3106";
+               reg = <0x1b>;
+       };
+
+       accel: lis331dlh@1d {
+               compatible = "st,lis3lv02d";
+               reg = <0x1d>;
+       };
+};
+
+&i2c1 {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&i2c1_pins>;
+       clock-frequency = <400000>;
+};
+
+&am33xx_pinmux {
+       i2c0_pins: pinmux_i2c0 {
+               pinctrl-single,pins = <
+                       0x188 (PIN_INPUT_PULLUP | MUX_MODE0)    /* i2c0_sda.i2c0_sda */
+                       0x18c (PIN_INPUT_PULLUP | MUX_MODE0)    /* i2c0_scl.i2c0_scl */
+               >;
+       };
+       i2c1_pins: pinmux_i2c1 {
+               pinctrl-single,pins = <
+                       0x10C (PIN_INPUT_PULLUP | MUX_MODE3)    /* mii1_crs,i2c1_sda */
+                       0x110 (PIN_INPUT_PULLUP | MUX_MODE3)    /* mii1_rxerr,i2c1_scl */
+               >;
+       };
+};
+
+/* Accelerometer */
+&accel {
+       pinctrl-names = "default";
+       pinctrl-0 = <&accel_pins>;
+
+       Vdd-supply = <&ldo3_reg>;
+       Vdd_IO-supply = <&ldo3_reg>;
+       st,irq1-click;
+       st,wakeup-x-lo;
+       st,wakeup-x-hi;
+       st,wakeup-y-lo;
+       st,wakeup-y-hi;
+       st,wakeup-z-lo;
+       st,wakeup-z-hi;
+       st,min-limit-x = <92>;
+       st,max-limit-x = <14>;
+       st,min-limit-y = <14>;
+       st,max-limit-y = <92>;
+       st,min-limit-z = <92>;
+       st,max-limit-z = <14>;
+};
+
+&am33xx_pinmux {
+       accel_pins: pinmux_accel {
+               pinctrl-single,pins = <
+                       0x98 (PIN_INPUT | MUX_MODE7)   /* gpmc_wen.gpio2_4 */
+               >;
+       };
+};
+
+/* Audio */
+&audio_codec {
+       status = "okay";
+
+       gpio-reset = <&gpio1 16 GPIO_ACTIVE_LOW>;
+       AVDD-supply = <&ldo3_reg>;
+       IOVDD-supply = <&ldo3_reg>;
+       DRVDD-supply = <&ldo3_reg>;
+       DVDD-supply = <&dcdc1_reg>;
+};
+
+&sound {
+       ti,model = "AM335x-EVM";
+       ti,audio-codec = <&audio_codec>;
+       ti,mcasp-controller = <&mcasp0>;
+       ti,codec-clock-rate = <12000000>;
+       ti,audio-routing =
+               "Headphone Jack",       "HPLOUT",
+               "Headphone Jack",       "HPROUT",
+               "LINE1L",               "Line In";
+};
+
+&mcasp0 {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&audio_pins>;
+
+       op-mode = <0>;  /* MCASP_ISS_MODE */
+       tdm-slots = <2>;
+       serial-dir = <
+               1 2 0 0
+               0 0 0 0
+               0 0 0 0
+               0 0 0 0
+       >;
+       tx-num-evt = <1>;
+       rx-num-evt = <1>;
+};
+
+&am33xx_pinmux {
+       audio_pins: pinmux_audio {
+               pinctrl-single,pins = <
+                       0x1AC (PIN_INPUT_PULLDOWN | MUX_MODE0)  /* mcasp0_ahcklx.mcasp0_ahclkx */
+                       0x194 (PIN_INPUT_PULLDOWN | MUX_MODE0)  /* mcasp0_fsx.mcasp0_fsx */
+                       0x190 (PIN_INPUT_PULLDOWN | MUX_MODE0)  /* mcasp0_aclkx.mcasp0_aclkx */
+                       0x198 (PIN_INPUT_PULLDOWN | MUX_MODE0)  /* mcasp0_axr0.mcasp0_axr0 */
+                       0x1A8 (PIN_INPUT_PULLDOWN | MUX_MODE0)  /* mcasp0_axr1.mcasp0_axr1 */
+                       0x40 (PIN_OUTPUT | MUX_MODE7)   /* gpmc_a0.gpio1_16 */
+               >;
+       };
+};
+
+/* Display: 24-bit LCD Screen */
+&panel {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&lcd_pins>;
+       panel-info {
+               ac-bias = <255>;
+               ac-bias-intrpt = <0>;
+               dma-burst-sz = <16>;
+               bpp = <32>;
+               fdd = <0x80>;
+               sync-edge = <0>;
+               sync-ctrl = <1>;
+               raster-order = <0>;
+               fifo-th = <0>;
+       };
+       display-timings {
+               native-mode = <&timing0>;
+               timing0: 480x272 {
+                       clock-frequency = <18400000>;
+                       hactive = <480>;
+                       vactive = <272>;
+                       hfront-porch = <8>;
+                       hback-porch = <4>;
+                       hsync-len = <41>;
+                       vfront-porch = <4>;
+                       vback-porch = <2>;
+                       vsync-len = <10>;
+                       hsync-active = <1>;
+                       vsync-active = <1>;
+               };
+       };
+};
+
+&lcdc {
+       status = "okay";
+};
+
+&am33xx_pinmux {
+       lcd_pins: pinmux_lcd {
+               pinctrl-single,pins = <
+                       0xa0 (PIN_OUTPUT | MUX_MODE0)   /* lcd_data0.lcd_data0 */
+                       0xa4 (PIN_OUTPUT | MUX_MODE0)   /* lcd_data1.lcd_data1 */
+                       0xa8 (PIN_OUTPUT | MUX_MODE0)   /* lcd_data2.lcd_data2 */
+                       0xac (PIN_OUTPUT | MUX_MODE0)   /* lcd_data3.lcd_data3 */
+                       0xb0 (PIN_OUTPUT | MUX_MODE0)   /* lcd_data4.lcd_data4 */
+                       0xb4 (PIN_OUTPUT | MUX_MODE0)   /* lcd_data5.lcd_data5 */
+                       0xb8 (PIN_OUTPUT | MUX_MODE0)   /* lcd_data6.lcd_data6 */
+                       0xbc (PIN_OUTPUT | MUX_MODE0)   /* lcd_data7.lcd_data7 */
+                       0xc0 (PIN_OUTPUT | MUX_MODE0)   /* lcd_data8.lcd_data8 */
+                       0xc4 (PIN_OUTPUT | MUX_MODE0)   /* lcd_data9.lcd_data9 */
+                       0xc8 (PIN_OUTPUT | MUX_MODE0)   /* lcd_data10.lcd_data10 */
+                       0xcc (PIN_OUTPUT | MUX_MODE0)   /* lcd_data11.lcd_data11 */
+                       0xd0 (PIN_OUTPUT | MUX_MODE0)   /* lcd_data12.lcd_data12 */
+                       0xd4 (PIN_OUTPUT | MUX_MODE0)   /* lcd_data13.lcd_data13 */
+                       0xd8 (PIN_OUTPUT | MUX_MODE0)   /* lcd_data14.lcd_data14 */
+                       0xdc (PIN_OUTPUT | MUX_MODE0)   /* lcd_data15.lcd_data15 */
+                       0x20 (PIN_OUTPUT | MUX_MODE1)   /* gpmc_ad8.lcd_data16 */
+                       0x24 (PIN_OUTPUT | MUX_MODE1)   /* gpmc_ad9.lcd_data17 */
+                       0x28 (PIN_OUTPUT | MUX_MODE1)   /* gpmc_ad10.lcd_data18 */
+                       0x2c (PIN_OUTPUT | MUX_MODE1)   /* gpmc_ad11.lcd_data19 */
+                       0x30 (PIN_OUTPUT | MUX_MODE1)   /* gpmc_ad12.lcd_data20 */
+                       0x34 (PIN_OUTPUT | MUX_MODE1)   /* gpmc_ad13.lcd_data21 */
+                       0x38 (PIN_OUTPUT | MUX_MODE1)   /* gpmc_ad14.lcd_data22 */
+                       0x3c (PIN_OUTPUT | MUX_MODE1)   /* gpmc_ad15.lcd_data23 */
+                       0xe0 (PIN_OUTPUT | MUX_MODE0)   /* lcd_vsync.lcd_vsync */
+                       0xe4 (PIN_OUTPUT | MUX_MODE0)   /* lcd_hsync.lcd_hsync */
+                       0xe8 (PIN_OUTPUT | MUX_MODE0)   /* lcd_pclk.lcd_pclk */
+                       0xec (PIN_OUTPUT | MUX_MODE0)   /* lcd_ac_bias_en.lcd_ac_bias_en */
+                       /* Display Enable */
+                       0x6c (PIN_OUTPUT_PULLUP | MUX_MODE7)    /* gpmc_a11.gpio1_27 */
+               >;
+       };
+};
+
+/* Ethernet */
+&cpsw_emac0 {
+       status = "okay";
+       phy_id = <&davinci_mdio>, <0>;
+       phy-mode = "rgmii";
+};
+
+&cpsw_emac1 {
+       status = "okay";
+       phy_id = <&davinci_mdio>, <1>;
+       phy-mode = "rgmii";
+};
+
+&davinci_mdio {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&mdio_pins>;
+};
+
+&mac {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&ethernet_pins>;
+};
+
+
+&am33xx_pinmux {
+       ethernet_pins: pinmux_ethernet {
+               pinctrl-single,pins = <
+                       0x114 (PIN_OUTPUT_PULLDOWN | MUX_MODE2) /* mii1_txen.rgmii1_tctl */
+                       0x118 (PIN_INPUT_PULLUP | MUX_MODE2)    /* mii1_rxdv.rgmii1_rctl */
+                       0x11c (PIN_OUTPUT_PULLDOWN | MUX_MODE2) /* mii1_txd3.rgmii1_td3 */
+                       0x120 (PIN_OUTPUT_PULLDOWN | MUX_MODE2) /* mii1_txd2.rgmii1_td2 */
+                       0x124 (PIN_OUTPUT_PULLDOWN | MUX_MODE2) /* mii1_txd1.rgmii1_td1 */
+                       0x128 (PIN_OUTPUT_PULLDOWN | MUX_MODE2) /* mii1_txd0.rgmii1_td0 */
+                       0x12c (PIN_INPUT_PULLUP | MUX_MODE2)    /* mii1_txclk.rgmii1_tclk */
+                       0x130 (PIN_INPUT_PULLUP | MUX_MODE2)    /* mii1_rxclk.rgmii1_rclk */
+                       0x134 (PIN_INPUT_PULLUP | MUX_MODE2)    /* mii1_rxd3.rgmii1_rxd3 */
+                       0x138 (PIN_INPUT_PULLUP | MUX_MODE2)    /* mii1_rxd2.rgmii1_rxd2 */
+                       0x13c (PIN_INPUT_PULLUP | MUX_MODE2)    /* mii1_rxd1.rgmii1_rxd1 */
+                       0x140 (PIN_INPUT_PULLUP | MUX_MODE2)    /* mii1_rxd0.rgmii1_rxd0 */
+                       /* ethernet interrupt */
+                       0x144 (PIN_INPUT_PULLUP | MUX_MODE7)    /* rmii2_refclk.gpio0_29 */
+                       /* ethernet PHY nReset */
+                       0x108 (PIN_OUTPUT_PULLUP | MUX_MODE7)   /* mii1_col.gpio3_0 */
+               >;
+       };
+
+       mdio_pins: pinmux_mdio {
+               pinctrl-single,pins = <
+                       0x148 (PIN_INPUT_PULLUP | SLEWCTRL_FAST | MUX_MODE0)    /* mdio_data.mdio_data */
+                       0x14c (PIN_OUTPUT_PULLUP | MUX_MODE0)                   /* mdio_clk.mdio_clk */
+               >;
+       };
+};
+
+/* MMC */
+&mmc1 {
+       /* Bootable SD card slot */
+       status = "okay";
+       vmmc-supply = <&ldo3_reg>;
+       bus-width = <4>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&sd_pins>;
+       cd-gpios = <&gpio0 6 GPIO_ACTIVE_LOW>;
+};
+
+&mmc2 {
+       /* eMMC (not populated) on MMC #2 */
+       status = "disabled";
+       pinctrl-names = "default";
+       pinctrl-0 = <&emmc_pins>;
+       vmmc-supply = <&ldo3_reg>;
+       bus-width = <8>;
+       ti,non-removable;
+};
+
+&edma {
+       /* Map eDMA MMC2 Events from Crossbar */
+       ti,edma-xbar-event-map = /bits/ 16 <1 12
+                                            2 13>;
+};
+
+
+&mmc3 {
+       /* Wifi & Bluetooth on MMC #3 */
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&wireless_pins>;
+       vmmmc-supply = <&v3v3c_reg>;
+       bus-width = <4>;
+       ti,non-removable;
+       dmas = <&edma 12
+               &edma 13>;
+       dma-names = "tx", "rx";
+};
+
+
+&am33xx_pinmux {
+       sd_pins: pinmux_sd_card {
+               pinctrl-single,pins = <
+                       0xf0 (PIN_INPUT_PULLUP | MUX_MODE0)     /* mmc0_dat0.mmc0_dat0 */
+                       0xf4 (PIN_INPUT_PULLUP | MUX_MODE0)     /* mmc0_dat1.mmc0_dat1 */
+                       0xf8 (PIN_INPUT_PULLUP | MUX_MODE0)     /* mmc0_dat2.mmc0_dat2 */
+                       0xfc (PIN_INPUT_PULLUP | MUX_MODE0)     /* mmc0_dat3.mmc0_dat3 */
+                       0x100 (PIN_INPUT_PULLUP | MUX_MODE0)    /* mmc0_clk.mmc0_clk */
+                       0x104 (PIN_INPUT_PULLUP | MUX_MODE0)    /* mmc0_cmd.mmc0_cmd */
+                       0x160 (PIN_INPUT | MUX_MODE7)           /* spi0_cs1.gpio0_6 */
+               >;
+       };
+       emmc_pins: pinmux_emmc {
+               pinctrl-single,pins = <
+                       0x80 (PIN_INPUT_PULLUP | MUX_MODE2)     /* gpmc_csn1.mmc1_clk */
+                       0x84 (PIN_INPUT_PULLUP | MUX_MODE2)     /* gpmc_csn2.mmc1_cmd */
+                       0x00 (PIN_INPUT_PULLUP | MUX_MODE1)     /* gpmc_ad0.mmc1_dat0 */
+                       0x04 (PIN_INPUT_PULLUP | MUX_MODE1)     /* gpmc_ad1.mmc1_dat1 */
+                       0x08 (PIN_INPUT_PULLUP | MUX_MODE1)     /* gpmc_ad2.mmc1_dat2 */
+                       0x0c (PIN_INPUT_PULLUP | MUX_MODE1)     /* gpmc_ad3.mmc1_dat3 */
+                       0x10 (PIN_INPUT_PULLUP | MUX_MODE1)     /* gpmc_ad4.mmc1_dat4 */
+                       0x14 (PIN_INPUT_PULLUP | MUX_MODE1)     /* gpmc_ad5.mmc1_dat5 */
+                       0x18 (PIN_INPUT_PULLUP | MUX_MODE1)     /* gpmc_ad6.mmc1_dat6 */
+                       0x1c (PIN_INPUT_PULLUP | MUX_MODE1)     /* gpmc_ad7.mmc1_dat7 */
+                       /* EMMC nReset */
+                       0x74 (PIN_OUTPUT_PULLUP | MUX_MODE7)    /* gpmc_wpn.gpio0_31 */
+               >;
+       };
+       wireless_pins: pinmux_wireless {
+               pinctrl-single,pins = <
+                       0x44 (PIN_INPUT_PULLUP | MUX_MODE3)     /* gpmc_a1.mmc2_dat0 */
+                       0x48 (PIN_INPUT_PULLUP | MUX_MODE3)     /* gpmc_a2.mmc2_dat1 */
+                       0x4c (PIN_INPUT_PULLUP | MUX_MODE3)     /* gpmc_a3.mmc2_dat2 */
+                       0x78 (PIN_INPUT_PULLUP | MUX_MODE3)     /* gpmc_ben1.mmc2_dat3 */
+                       0x88 (PIN_INPUT_PULLUP | MUX_MODE3)     /* gpmc_csn3.mmc2_cmd */
+                       0x8c (PIN_INPUT_PULLUP | MUX_MODE3)     /* gpmc_clk.mmc1_clk */
+                       /* WLAN nReset */
+                       0x60 (PIN_OUTPUT_PULLUP | MUX_MODE7)    /* gpmc_a8.gpio1_24 */
+                       /* WLAN nPower down */
+                       0x70 (PIN_OUTPUT_PULLUP | MUX_MODE7)    /* gpmc_wait0.gpio0_30 */
+                       /* 32kHz Clock */
+                       0x1b4 (PIN_OUTPUT_PULLDOWN | MUX_MODE3) /* xdma_event_intr1.clkout2 */
+               >;
+       };
+};
+
+/* Power */
+&vbat {
+       regulator-name = "vbat";
+       regulator-min-microvolt = <5000000>;
+       regulator-max-microvolt = <5000000>;
+};
+
+&v3v3c_reg {
+       regulator-name = "v3v3c_reg";
+       regulator-min-microvolt = <3300000>;
+       regulator-max-microvolt = <3300000>;
+       vin-supply = <&vbat>;
+};
+
+&vdd5_reg {
+       regulator-name = "vdd5_reg";
+       regulator-min-microvolt = <5000000>;
+       regulator-max-microvolt = <5000000>;
+       vin-supply = <&vbat>;
+};
+
+/include/ "tps65217.dtsi"
+
+&tps {
+       backlight {
+               isel = <1>; /* ISET1 */
+               fdim = <200>; /* TPS65217_BL_FDIM_200HZ */
+               default-brightness = <80>;
+       };
+
+       regulators {
+               dcdc1_reg: regulator@0 {
+                       /* VDD_1V8 system supply */
+               };
+
+               dcdc2_reg: regulator@1 {
+                       /* VDD_CORE voltage limits 0.95V - 1.26V with +/-4% tolerance */
+                       regulator-name = "vdd_core";
+                       regulator-min-microvolt = <925000>;
+                       regulator-max-microvolt = <1325000>;
+                       regulator-boot-on;
+               };
+
+               dcdc3_reg: regulator@2 {
+                       /* VDD_MPU voltage limits 0.95V - 1.1V with +/-4% tolerance */
+                       regulator-name = "vdd_mpu";
+                       regulator-min-microvolt = <925000>;
+                       regulator-max-microvolt = <1150000>;
+                       regulator-boot-on;
+               };
+
+               ldo1_reg: regulator@3 {
+                       /* VRTC 1.8V always-on supply */
+                       regulator-always-on;
+               };
+
+               ldo2_reg: regulator@4 {
+                       /* 3.3V rail */
+               };
+
+               ldo3_reg: regulator@5 {
+                       /* VDD_3V3A 3.3V rail */
+                       regulator-min-microvolt = <3300000>;
+                       regulator-max-microvolt = <3300000>;
+               };
+
+               ldo4_reg: regulator@6 {
+                       /* VDD_3V3B 3.3V rail */
+               };
+       };
+};
+
+/* SPI Busses */
+&spi0 {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&spi0_pins>;
+};
+
+&am33xx_pinmux {
+       spi0_pins: pinmux_spi0 {
+               pinctrl-single,pins = <
+                       0x150 (PIN_INPUT_PULLUP | MUX_MODE0) /* spi0_sclk.spi0_sclk */
+                       0x15C (PIN_INPUT_PULLUP | MUX_MODE0) /* spi0_cs0.spi0_cs0 */
+                       0x154 (PIN_INPUT_PULLUP | MUX_MODE0) /* spi0_d0.spi0_d0 */
+                       0x158 (PIN_INPUT_PULLUP | MUX_MODE0) /* spi0_d1.spi0_d1 */
+               >;
+       };
+};
+
+/* Touch Screen */
+&tscadc {
+       status = "okay";
+       tsc {
+               ti,wires = <4>;
+               ti,x-plate-resistance = <200>;
+               ti,coordinate-readouts = <5>;
+               ti,wire-config = <0x00 0x11 0x22 0x33>;
+       };
+
+       adc {
+               ti,adc-channels = <4 5 6 7>;
+       };
+};
+
+/* UARTs */
+&uart0 {
+       /* Serial Console */
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart0_pins>;
+};
+
+&uart1 {
+       /* Broken out to J6 header */
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart1_pins>;
+};
+
+&am33xx_pinmux {
+       uart0_pins: pinmux_uart0 {
+               pinctrl-single,pins = <
+                       0x170 (PIN_INPUT_PULLUP | MUX_MODE0)    /* uart0_rxd.uart0_rxd */
+                       0x174 (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* uart0_txd.uart0_txd */
+               >;
+       };
+       uart1_pins: pinmux_uart1 {
+               pinctrl-single,pins = <
+                       0x178 (PIN_INPUT_PULLUP | MUX_MODE0)    /* uart1_ctsn.uart1_ctsn */
+                       0x17C (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* uart1_rtsn.uart1_rtsn */
+                       0x180 (PIN_INPUT_PULLUP | MUX_MODE0)    /* uart1_rxd.uart1_rxd */
+                       0x184 (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* uart1_txd.uart1_txd */
+               >;
+       };
+};
+
+/* USB */
+&usb {
+       status = "okay";
+
+       pinctrl-names = "default";
+       pinctrl-0 = <&usb_pins>;
+};
+
+&usb_ctrl_mod {
+       status = "okay";
+};
+
+&usb0_phy {
+       status = "okay";
+};
+
+&usb1_phy {
+       status = "okay";
+};
+
+&usb0 {
+       status = "okay";
+        dr_mode = "host";
+};
+
+&usb1 {
+       status = "okay";
+        dr_mode = "host";
+};
+
+&cppi41dma {
+       status = "okay";
+};
+
+&am33xx_pinmux {
+       usb_pins: pinmux_usb {
+               pinctrl-single,pins = <
+                       /* USB0 Over-Current (active low) */
+                       0x64 (PIN_INPUT | MUX_MODE7)    /* gpmc_a9.gpio1_25 */
+                       /* USB1 Over-Current (active low) */
+                       0x68 (PIN_INPUT | MUX_MODE7)    /* gpmc_a10.gpio1_26 */
+               >;
+       };
+};
+
+/* User IO */
+&leds {
+       pinctrl-names = "default";
+       pinctrl-0 = <&user_leds_pins>;
+
+       led@0 {
+               label = "pepper:user0:blue";
+               gpios = <&gpio1 20 GPIO_ACTIVE_HIGH>;
+               linux,default-trigger = "none";
+               default-state = "off";
+       };
+
+       led@1 {
+               label = "pepper:user1:red";
+               gpios = <&gpio1 21 GPIO_ACTIVE_HIGH>;
+               linux,default-trigger = "none";
+               default-state = "off";
+       };
+};
+
+&buttons {
+       pinctrl-names = "default";
+       pinctrl-0 = <&user_buttons_pins>;
+       #address-cells = <1>;
+       #size-cells = <0>;
+
+       button@0 {
+               label = "home";
+               linux,code = <KEY_HOME>;
+               gpios = <&gpio1 22 GPIO_ACTIVE_LOW>;
+               gpio-key,wakeup;
+       };
+
+       button@1 {
+               label = "menu";
+               linux,code = <KEY_MENU>;
+               gpios = <&gpio1 23 GPIO_ACTIVE_LOW>;
+               gpio-key,wakeup;
+       };
+
+       buttons@2 {
+               label = "power";
+               linux,code = <KEY_POWER>;
+               gpios = <&gpio0 7 GPIO_ACTIVE_LOW>;
+               gpio-key,wakeup;
+       };
+};
+
+&am33xx_pinmux {
+       user_leds_pins: pinmux_user_leds {
+               pinctrl-single,pins = <
+                       0x50 (PIN_OUTPUT | MUX_MODE7)   /* gpmc_a4.gpio1_20 */
+                       0x54 (PIN_OUTPUT | MUX_MODE7)   /* gpmc_a5.gpio1_21 */
+               >;
+       };
+
+       user_buttons_pins: pinmux_user_buttons {
+               pinctrl-single,pins = <
+                       0x58 (PIN_INPUT_PULLUP | MUX_MODE7)     /* gpmc_a6.gpio1_22 */
+                       0x5C (PIN_INPUT_PULLUP | MUX_MODE7)     /* gpmc_a7.gpio1_21 */
+                       0x164 (PIN_INPUT_PULLUP | MUX_MODE7)    /* gpmc_a8.gpio0_7 */
+               >;
+       };
+};
index 4a4e02d0ce9e408b16b3c1bb57222fad963a2766..3a0a161342bafb7299b08ca9a80391f0edb47382 100644 (file)
                        status = "disabled";
                };
 
+               mailbox: mailbox@480C8000 {
+                       compatible = "ti,omap4-mailbox";
+                       reg = <0x480C8000 0x200>;
+                       interrupts = <77>;
+                       ti,hwmods = "mailbox";
+                       ti,mbox-num-users = <4>;
+                       ti,mbox-num-fifos = <8>;
+               };
+
                timer1: timer@44e31000 {
                        compatible = "ti,am335x-timer-1ms";
                        reg = <0x44e31000 0x400>;
index 49fa596222547d646c79a031b260097cf9a8bf8e..9b3d2ba82f13a1b6aaf725c0e529255310726052 100644 (file)
@@ -30,7 +30,7 @@
        cpus {
                #address-cells = <1>;
                #size-cells = <0>;
-               cpu@0 {
+               cpu: cpu@0 {
                        compatible = "arm,cortex-a9";
                        device_type = "cpu";
                        reg = <0>;
                        ti,hwmods = "mailbox";
                        ti,mbox-num-users = <4>;
                        ti,mbox-num-fifos = <8>;
-                       ti,mbox-names = "wkup_m3";
-                       ti,mbox-data = <0 0 0 0>;
-                       status = "disabled";
                };
 
                timer1: timer@44e31000 {
                        ti,hwmods = "counter_32k";
                };
 
-               rtc@44e3e000 {
+               rtc: rtc@44e3e000 {
                        compatible = "ti,am4372-rtc","ti,da830-rtc";
                        reg = <0x44e3e000 0x1000>;
                        interrupts = <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH
                        status = "disabled";
                };
 
-               wdt@44e35000 {
+               wdt: wdt@44e35000 {
                        compatible = "ti,am4372-wdt","ti,omap3-wdt";
                        reg = <0x44e35000 0x1000>;
                        interrupts = <GIC_SPI 91 IRQ_TYPE_LEVEL_HIGH>;
                        #size-cells = <1>;
                        ranges;
 
-                       dispc@4832a400 {
+                       dispc: dispc@4832a400 {
                                compatible = "ti,omap3-dispc";
                                reg = <0x4832a400 0x400>;
                                interrupts = <GIC_SPI 127 IRQ_TYPE_LEVEL_HIGH>;
index 003766c47bbfe094d3b68d2d4169a2119ba4cf9b..f0422c2a746862095cab8a5a1d794a2cdfbd63be 100644 (file)
 };
 
 &i2c0 {
-        status = "okay";
-        pinctrl-names = "default";
-        pinctrl-0 = <&i2c0_pins>;
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&i2c0_pins>;
+       clock-frequency = <400000>;
+
+       tps65218: tps65218@24 {
+               reg = <0x24>;
+               compatible = "ti,tps65218";
+               interrupts = <GIC_SPI 7 IRQ_TYPE_NONE>; /* NMIn */
+               interrupt-parent = <&gic>;
+               interrupt-controller;
+               #interrupt-cells = <2>;
+
+               dcdc1: regulator-dcdc1 {
+                       compatible = "ti,tps65218-dcdc1";
+                       regulator-name = "vdd_core";
+                       regulator-min-microvolt = <912000>;
+                       regulator-max-microvolt = <1144000>;
+                       regulator-boot-on;
+                       regulator-always-on;
+               };
+
+               dcdc2: regulator-dcdc2 {
+                       compatible = "ti,tps65218-dcdc2";
+                       regulator-name = "vdd_mpu";
+                       regulator-min-microvolt = <912000>;
+                       regulator-max-microvolt = <1378000>;
+                       regulator-boot-on;
+                       regulator-always-on;
+               };
+
+               dcdc3: regulator-dcdc3 {
+                       compatible = "ti,tps65218-dcdc3";
+                       regulator-name = "vdcdc3";
+                       regulator-min-microvolt = <1350000>;
+                       regulator-max-microvolt = <1350000>;
+                       regulator-boot-on;
+                       regulator-always-on;
+               };
+               dcdc5: regulator-dcdc5 {
+                       compatible = "ti,tps65218-dcdc5";
+                       regulator-name = "v1_0bat";
+                       regulator-min-microvolt = <1000000>;
+                       regulator-max-microvolt = <1000000>;
+               };
+
+               dcdc6: regulator-dcdc6 {
+                       compatible = "ti,tps65218-dcdc6";
+                       regulator-name = "v1_8bat";
+                       regulator-min-microvolt = <1800000>;
+                       regulator-max-microvolt = <1800000>;
+               };
+
+               ldo1: regulator-ldo1 {
+                       compatible = "ti,tps65218-ldo1";
+                       regulator-min-microvolt = <1800000>;
+                       regulator-max-microvolt = <1800000>;
+                       regulator-boot-on;
+                       regulator-always-on;
+               };
+       };
 };
 
 &i2c1 {
-        status = "okay";
-        pinctrl-names = "default";
-        pinctrl-0 = <&i2c1_pins>;
-
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&i2c1_pins>;
        pixcir_ts@5c {
                compatible = "pixcir,pixcir_tangoc";
                pinctrl-names = "default";
diff --git a/arch/arm/boot/dts/am437x-sk-evm.dts b/arch/arm/boot/dts/am437x-sk-evm.dts
new file mode 100644 (file)
index 0000000..859ff3d
--- /dev/null
@@ -0,0 +1,613 @@
+/*
+ * Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+/* AM437x SK EVM */
+
+/dts-v1/;
+
+#include "am4372.dtsi"
+#include <dt-bindings/pinctrl/am43xx.h>
+#include <dt-bindings/pwm/pwm.h>
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+
+/ {
+       model = "TI AM437x SK EVM";
+       compatible = "ti,am437x-sk-evm","ti,am4372","ti,am43";
+
+       aliases {
+               display0 = &lcd0;
+       };
+
+       backlight {
+               compatible = "pwm-backlight";
+               pwms = <&ecap0 0 50000 PWM_POLARITY_INVERTED>;
+               brightness-levels = <0 51 53 56 62 75 101 152 255>;
+               default-brightness-level = <8>;
+       };
+
+       sound {
+               compatible = "ti,da830-evm-audio";
+               ti,model = "AM437x-SK-EVM";
+               ti,audio-codec = <&tlv320aic3106>;
+               ti,mcasp-controller = <&mcasp1>;
+               ti,codec-clock-rate = <24000000>;
+               ti,audio-routing =
+                       "Headphone Jack",       "HPLOUT",
+                       "Headphone Jack",       "HPROUT";
+       };
+
+       matrix_keypad: matrix_keypad@0 {
+               compatible = "gpio-matrix-keypad";
+
+               pinctrl-names = "default";
+               pinctrl-0 = <&matrix_keypad_pins>;
+
+               debounce-delay-ms = <5>;
+               col-scan-delay-us = <1500>;
+
+               row-gpios = <&gpio5 5 GPIO_ACTIVE_HIGH          /* Bank5, pin5 */
+                               &gpio5 6 GPIO_ACTIVE_HIGH>;     /* Bank5, pin6 */
+
+               col-gpios = <&gpio5 13 GPIO_ACTIVE_HIGH         /* Bank5, pin13 */
+                               &gpio5 4 GPIO_ACTIVE_HIGH>;     /* Bank5, pin4 */
+
+               linux,keymap = <
+                               MATRIX_KEY(0, 0, KEY_DOWN)
+                               MATRIX_KEY(0, 1, KEY_RIGHT)
+                               MATRIX_KEY(1, 0, KEY_LEFT)
+                               MATRIX_KEY(1, 1, KEY_UP)
+                       >;
+       };
+
+       leds {
+               compatible = "gpio-leds";
+
+               pinctrl-names = "default";
+               pinctrl-0 = <&leds_pins>;
+
+               led@0 {
+                       label = "am437x-sk:red:heartbeat";
+                       gpios = <&gpio5 0 GPIO_ACTIVE_HIGH>;    /* Bank 5, pin 0 */
+                       linux,default-trigger = "heartbeat";
+                       default-state = "off";
+               };
+
+               led@1 {
+                       label = "am437x-sk:green:mmc1";
+                       gpios = <&gpio5 1 GPIO_ACTIVE_HIGH>;    /* Bank 5, pin 1 */
+                       linux,default-trigger = "mmc0";
+                       default-state = "off";
+               };
+
+               led@2 {
+                       label = "am437x-sk:blue:cpu0";
+                       gpios = <&gpio5 2 GPIO_ACTIVE_HIGH>;    /* Bank 5, pin 2 */
+                       linux,default-trigger = "cpu0";
+                       default-state = "off";
+               };
+
+               led@3 {
+                       label = "am437x-sk:blue:usr3";
+                       gpios = <&gpio5 3 GPIO_ACTIVE_HIGH>;    /* Bank 5, pin 3 */
+                       default-state = "off";
+               };
+       };
+
+       lcd0: display {
+               compatible = "osddisplays,osd057T0559-34ts", "panel-dpi";
+               label = "lcd";
+
+               pinctrl-names = "default";
+               pinctrl-0 = <&lcd_pins>;
+
+               enable-gpios = <&gpio1 7 GPIO_ACTIVE_HIGH>;
+
+               panel-timing {
+                       clock-frequency = <9000000>;
+                       hactive = <480>;
+                       vactive = <272>;
+                       hfront-porch = <8>;
+                       hback-porch = <43>;
+                       hsync-len = <4>;
+                       vback-porch = <12>;
+                       vfront-porch = <4>;
+                       vsync-len = <10>;
+                       hsync-active = <0>;
+                       vsync-active = <0>;
+                       de-active = <1>;
+                       pixelclk-active = <1>;
+               };
+
+               port {
+                       lcd_in: endpoint {
+                               remote-endpoint = <&dpi_out>;
+                       };
+               };
+       };
+};
+
+&am43xx_pinmux {
+       matrix_keypad_pins: matrix_keypad_pins {
+               pinctrl-single,pins = <
+                       0x24c (PIN_OUTPUT | MUX_MODE7)  /* gpio5_13.gpio5_13 */
+                       0x250 (PIN_OUTPUT | MUX_MODE7)  /* spi4_sclk.gpio5_4 */
+                       0x254 (PIN_INPUT | MUX_MODE7)   /* spi4_d0.gpio5_5 */
+                       0x258 (PIN_INPUT | MUX_MODE7)   /* spi4_d1.gpio5_5 */
+               >;
+       };
+
+       leds_pins: leds_pins {
+               pinctrl-single,pins = <
+                       0x228 (PIN_OUTPUT | MUX_MODE7)  /* uart3_rxd.gpio5_2 */
+                       0x22c (PIN_OUTPUT | MUX_MODE7)  /* uart3_txd.gpio5_3 */
+                       0x230 (PIN_OUTPUT | MUX_MODE7)  /* uart3_ctsn.gpio5_0 */
+                       0x234 (PIN_OUTPUT | MUX_MODE7)  /* uart3_rtsn.gpio5_1 */
+               >;
+       };
+
+       i2c0_pins: i2c0_pins {
+               pinctrl-single,pins = <
+                       0x188 (PIN_INPUT_PULLUP | SLEWCTRL_FAST | MUX_MODE0)  /* i2c0_sda.i2c0_sda */
+                       0x18c (PIN_INPUT_PULLUP | SLEWCTRL_FAST | MUX_MODE0)  /* i2c0_scl.i2c0_scl */
+               >;
+       };
+
+       i2c1_pins: i2c1_pins {
+               pinctrl-single,pins = <
+                       0x15c (PIN_INPUT_PULLUP | SLEWCTRL_FAST | MUX_MODE2)  /* spi0_cs0.i2c1_scl */
+                       0x158 (PIN_INPUT_PULLUP | SLEWCTRL_FAST | MUX_MODE2)  /* spi0_d1.i2c1_sda  */
+               >;
+       };
+
+       mmc1_pins: pinmux_mmc1_pins {
+               pinctrl-single,pins = <
+                       0x160 (PIN_INPUT | MUX_MODE7) /* spi0_cs1.gpio0_6 */
+               >;
+       };
+
+       ecap0_pins: backlight_pins {
+               pinctrl-single,pins = <
+                       0x164 (PIN_OUTPUT | MUX_MODE0) /* eCAP0_in_PWM0_out.eCAP0_in_PWM0_out */
+               >;
+       };
+
+       edt_ft5306_ts_pins: edt_ft5306_ts_pins {
+               pinctrl-single,pins = <
+                       0x74 (PIN_INPUT | MUX_MODE7)    /* gpmc_wpn.gpio0_31 */
+                       0x78 (PIN_OUTPUT | MUX_MODE7)   /* gpmc_be1n.gpio1_28 */
+               >;
+       };
+
+       cpsw_default: cpsw_default {
+               pinctrl-single,pins = <
+                       /* Slave 1 */
+                       0x12c (PIN_OUTPUT_PULLDOWN | MUX_MODE2) /* mii1_txclk.rmii1_tclk */
+                       0x114 (PIN_OUTPUT_PULLDOWN | MUX_MODE2) /* mii1_txen.rgmii1_tctl */
+                       0x128 (PIN_OUTPUT_PULLDOWN | MUX_MODE2) /* mii1_txd0.rgmii1_td0 */
+                       0x124 (PIN_OUTPUT_PULLDOWN | MUX_MODE2) /* mii1_txd1.rgmii1_td1 */
+                       0x120 (PIN_OUTPUT_PULLDOWN | MUX_MODE2) /* mii1_txd0.rgmii1_td2 */
+                       0x11c (PIN_OUTPUT_PULLDOWN | MUX_MODE2) /* mii1_txd1.rgmii1_td3 */
+                       0x130 (PIN_INPUT_PULLDOWN | MUX_MODE2)  /* mii1_rxclk.rmii1_rclk */
+                       0x118 (PIN_INPUT_PULLDOWN | MUX_MODE2)  /* mii1_rxdv.rgmii1_rctl */
+                       0x140 (PIN_INPUT_PULLDOWN | MUX_MODE2)  /* mii1_rxd0.rgmii1_rd0 */
+                       0x13c (PIN_INPUT_PULLDOWN | MUX_MODE2)  /* mii1_rxd1.rgmii1_rd1 */
+                       0x138 (PIN_INPUT_PULLDOWN | MUX_MODE2)  /* mii1_rxd0.rgmii1_rd2 */
+                       0x134 (PIN_INPUT_PULLDOWN | MUX_MODE2)  /* mii1_rxd1.rgmii1_rd3 */
+
+                       /* Slave 2 */
+                       0x58 (PIN_OUTPUT_PULLDOWN | MUX_MODE2)  /* gpmc_a6.rgmii2_tclk */
+                       0x40 (PIN_OUTPUT_PULLDOWN | MUX_MODE2)  /* gpmc_a0.rgmii2_tctl */
+                       0x54 (PIN_OUTPUT_PULLDOWN | MUX_MODE2)  /* gpmc_a5.rgmii2_td0 */
+                       0x50 (PIN_OUTPUT_PULLDOWN | MUX_MODE2)  /* gpmc_a4.rgmii2_td1 */
+                       0x4c (PIN_OUTPUT_PULLDOWN | MUX_MODE2)  /* gpmc_a3.rgmii2_td2 */
+                       0x48 (PIN_OUTPUT_PULLDOWN | MUX_MODE2)  /* gpmc_a2.rgmii2_td3 */
+                       0x5c (PIN_INPUT_PULLDOWN | MUX_MODE2)   /* gpmc_a7.rgmii2_rclk */
+                       0x44 (PIN_INPUT_PULLDOWN | MUX_MODE2)   /* gpmc_a1.rgmii2_rtcl */
+                       0x6c (PIN_INPUT_PULLDOWN | MUX_MODE2)   /* gpmc_a11.rgmii2_rd0 */
+                       0x68 (PIN_INPUT_PULLDOWN | MUX_MODE2)   /* gpmc_a10.rgmii2_rd1 */
+                       0x64 (PIN_INPUT_PULLDOWN | MUX_MODE2)   /* gpmc_a9.rgmii2_rd2 */
+                       0x60 (PIN_INPUT_PULLDOWN | MUX_MODE2)   /* gpmc_a8.rgmii2_rd3 */
+               >;
+       };
+
+       cpsw_sleep: cpsw_sleep {
+               pinctrl-single,pins = <
+                       /* Slave 1 reset value */
+                       0x12c (PIN_INPUT_PULLDOWN | MUX_MODE7)
+                       0x114 (PIN_INPUT_PULLDOWN | MUX_MODE7)
+                       0x128 (PIN_INPUT_PULLDOWN | MUX_MODE7)
+                       0x124 (PIN_INPUT_PULLDOWN | MUX_MODE7)
+                       0x120 (PIN_INPUT_PULLDOWN | MUX_MODE7)
+                       0x11c (PIN_INPUT_PULLDOWN | MUX_MODE7)
+                       0x130 (PIN_INPUT_PULLDOWN | MUX_MODE7)
+                       0x118 (PIN_INPUT_PULLDOWN | MUX_MODE7)
+                       0x140 (PIN_INPUT_PULLDOWN | MUX_MODE7)
+                       0x13c (PIN_INPUT_PULLDOWN | MUX_MODE7)
+                       0x138 (PIN_INPUT_PULLDOWN | MUX_MODE7)
+                       0x134 (PIN_INPUT_PULLDOWN | MUX_MODE7)
+
+                       /* Slave 2 reset value */
+                       0x58 (PIN_INPUT_PULLDOWN | MUX_MODE7)
+                       0x40 (PIN_INPUT_PULLDOWN | MUX_MODE7)
+                       0x54 (PIN_INPUT_PULLDOWN | MUX_MODE7)
+                       0x50 (PIN_INPUT_PULLDOWN | MUX_MODE7)
+                       0x4c (PIN_INPUT_PULLDOWN | MUX_MODE7)
+                       0x48 (PIN_INPUT_PULLDOWN | MUX_MODE7)
+                       0x5c (PIN_INPUT_PULLDOWN | MUX_MODE7)
+                       0x44 (PIN_INPUT_PULLDOWN | MUX_MODE7)
+                       0x6c (PIN_INPUT_PULLDOWN | MUX_MODE7)
+                       0x68 (PIN_INPUT_PULLDOWN | MUX_MODE7)
+                       0x64 (PIN_INPUT_PULLDOWN | MUX_MODE7)
+                       0x60 (PIN_INPUT_PULLDOWN | MUX_MODE7)
+               >;
+       };
+
+       davinci_mdio_default: davinci_mdio_default {
+               pinctrl-single,pins = <
+                       /* MDIO */
+                       0x148 (PIN_INPUT_PULLUP | SLEWCTRL_FAST | MUX_MODE0)    /* mdio_data.mdio_data */
+                       0x14c (PIN_OUTPUT_PULLUP | MUX_MODE0)                   /* mdio_clk.mdio_clk */
+               >;
+       };
+
+       davinci_mdio_sleep: davinci_mdio_sleep {
+               pinctrl-single,pins = <
+                       /* MDIO reset value */
+                       0x148 (PIN_INPUT_PULLDOWN | MUX_MODE7)
+                       0x14c (PIN_INPUT_PULLDOWN | MUX_MODE7)
+               >;
+       };
+
+       dss_pins: dss_pins {
+               pinctrl-single,pins = <
+                       0x020 (PIN_OUTPUT_PULLUP | MUX_MODE1)   /* gpmc ad 8 -> DSS DATA 23 */
+                       0x024 (PIN_OUTPUT_PULLUP | MUX_MODE1)
+                       0x028 (PIN_OUTPUT_PULLUP | MUX_MODE1)
+                       0x02c (PIN_OUTPUT_PULLUP | MUX_MODE1)
+                       0x030 (PIN_OUTPUT_PULLUP | MUX_MODE1)
+                       0x034 (PIN_OUTPUT_PULLUP | MUX_MODE1)
+                       0x038 (PIN_OUTPUT_PULLUP | MUX_MODE1)
+                       0x03c (PIN_OUTPUT_PULLUP | MUX_MODE1)   /* gpmc ad 15 -> DSS DATA 16 */
+                       0x0a0 (PIN_OUTPUT_PULLUP | MUX_MODE0)   /* DSS DATA 0 */
+                       0x0a4 (PIN_OUTPUT_PULLUP | MUX_MODE0)
+                       0x0a8 (PIN_OUTPUT_PULLUP | MUX_MODE0)
+                       0x0ac (PIN_OUTPUT_PULLUP | MUX_MODE0)
+                       0x0b0 (PIN_OUTPUT_PULLUP | MUX_MODE0)
+                       0x0b4 (PIN_OUTPUT_PULLUP | MUX_MODE0)
+                       0x0b8 (PIN_OUTPUT_PULLUP | MUX_MODE0)
+                       0x0bc (PIN_OUTPUT_PULLUP | MUX_MODE0)
+                       0x0c0 (PIN_OUTPUT_PULLUP | MUX_MODE0)
+                       0x0c4 (PIN_OUTPUT_PULLUP | MUX_MODE0)
+                       0x0c8 (PIN_OUTPUT_PULLUP | MUX_MODE0)
+                       0x0cc (PIN_OUTPUT_PULLUP | MUX_MODE0)
+                       0x0d0 (PIN_OUTPUT_PULLUP | MUX_MODE0)
+                       0x0d4 (PIN_OUTPUT_PULLUP | MUX_MODE0)
+                       0x0d8 (PIN_OUTPUT_PULLUP | MUX_MODE0)
+                       0x0dc (PIN_OUTPUT_PULLUP | MUX_MODE0)   /* DSS DATA 15 */
+                       0x0e0 (PIN_OUTPUT_PULLUP | MUX_MODE0)   /* DSS VSYNC */
+                       0x0e4 (PIN_OUTPUT_PULLUP | MUX_MODE0)   /* DSS HSYNC */
+                       0x0e8 (PIN_OUTPUT_PULLUP | MUX_MODE0)   /* DSS PCLK */
+                       0x0ec (PIN_OUTPUT_PULLUP | MUX_MODE0)   /* DSS AC BIAS EN */
+
+               >;
+       };
+
+       qspi_pins: qspi_pins {
+               pinctrl-single,pins = <
+                       0x7c (PIN_OUTPUT_PULLUP | MUX_MODE3)    /* gpmc_csn0.qspi_csn */
+                       0x88 (PIN_OUTPUT | MUX_MODE2)           /* gpmc_csn3.qspi_clk */
+                       0x90 (PIN_INPUT_PULLUP | MUX_MODE3)     /* gpmc_advn_ale.qspi_d0 */
+                       0x94 (PIN_INPUT_PULLUP | MUX_MODE3)     /* gpmc_oen_ren.qspi_d1 */
+                       0x98 (PIN_INPUT_PULLUP | MUX_MODE3)     /* gpmc_wen.qspi_d2 */
+                       0x9c (PIN_INPUT_PULLUP | MUX_MODE3)     /* gpmc_be0n_cle.qspi_d3 */
+               >;
+       };
+
+       mcasp1_pins: mcasp1_pins {
+               pinctrl-single,pins = <
+                       0x10c (PIN_INPUT_PULLDOWN | MUX_MODE4)  /* mii1_crs.mcasp1_aclkx */
+                       0x110 (PIN_INPUT_PULLDOWN | MUX_MODE4)  /* mii1_rxerr.mcasp1_fsx */
+                       0x108 (PIN_OUTPUT_PULLDOWN | MUX_MODE4) /* mii1_col.mcasp1_axr2 */
+                       0x144 (PIN_INPUT_PULLDOWN | MUX_MODE4)  /* rmii1_ref_clk.mcasp1_axr3 */
+               >;
+       };
+
+       lcd_pins: lcd_pins {
+               pinctrl-single,pins = <
+                       /* GPIO 5_8 to select LCD / HDMI */
+                       0x238 (PIN_OUTPUT_PULLUP | MUX_MODE7)
+               >;
+       };
+};
+
+&i2c0 {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&i2c0_pins>;
+       clock-frequency = <400000>;
+
+       tps@24 {
+               compatible = "ti,tps65218";
+               reg = <0x24>;
+               interrupt-parent = <&gic>;
+               interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>;
+               interrupt-controller;
+               #interrupt-cells = <2>;
+
+               dcdc1: regulator-dcdc1 {
+                       compatible = "ti,tps65218-dcdc1";
+                       /* VDD_CORE limits min of OPP50 and max of OPP100 */
+                       regulator-name = "vdd_core";
+                       regulator-min-microvolt = <912000>;
+                       regulator-max-microvolt = <1144000>;
+                       regulator-boot-on;
+                       regulator-always-on;
+               };
+
+               dcdc2: regulator-dcdc2 {
+                       compatible = "ti,tps65218-dcdc2";
+                       /* VDD_MPU limits min of OPP50 and max of OPP_NITRO */
+                       regulator-name = "vdd_mpu";
+                       regulator-min-microvolt = <912000>;
+                       regulator-max-microvolt = <1378000>;
+                       regulator-boot-on;
+                       regulator-always-on;
+               };
+
+               dcdc3: regulator-dcdc3 {
+                       compatible = "ti,tps65218-dcdc3";
+                       regulator-name = "vdds_ddr";
+                       regulator-min-microvolt = <1350000>;
+                       regulator-max-microvolt = <1350000>;
+                       regulator-boot-on;
+                       regulator-always-on;
+               };
+
+               dcdc4: regulator-dcdc4 {
+                       compatible = "ti,tps65218-dcdc4";
+                       regulator-name = "v3_3d";
+                       regulator-min-microvolt = <3300000>;
+                       regulator-max-microvolt = <3300000>;
+                       regulator-boot-on;
+                       regulator-always-on;
+               };
+
+               ldo1: regulator-ldo1 {
+                       compatible = "ti,tps65218-ldo1";
+                       regulator-name = "v1_8d";
+                       regulator-min-microvolt = <1800000>;
+                       regulator-max-microvolt = <1800000>;
+                       regulator-boot-on;
+                       regulator-always-on;
+               };
+
+       };
+
+       at24@50 {
+               compatible = "at24,24c256";
+               pagesize = <64>;
+               reg = <0x50>;
+       };
+};
+
+&i2c1 {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&i2c1_pins>;
+       clock-frequency = <400000>;
+
+       edt-ft5306@38 {
+               status = "okay";
+               compatible = "edt,edt-ft5306", "edt,edt-ft5x06";
+               pinctrl-names = "default";
+               pinctrl-0 = <&edt_ft5306_ts_pins>;
+
+               reg = <0x38>;
+               interrupt-parent = <&gpio0>;
+               interrupts = <31 0>;
+
+               wake-gpios = <&gpio1 28 GPIO_ACTIVE_HIGH>;
+
+               touchscreen-size-x = <480>;
+               touchscreen-size-y = <272>;
+       };
+
+       tlv320aic3106: tlv320aic3106@1b {
+               compatible = "ti,tlv320aic3106";
+               reg = <0x1b>;
+               status = "okay";
+
+               /* Regulators */
+               AVDD-supply = <&dcdc4>;
+               IOVDD-supply = <&dcdc4>;
+               DRVDD-supply = <&dcdc4>;
+               DVDD-supply = <&ldo1>;
+       };
+
+       lis331dlh@18 {
+               compatible = "st,lis331dlh";
+               reg = <0x18>;
+               status = "okay";
+
+               Vdd-supply = <&dcdc4>;
+               Vdd_IO-supply = <&dcdc4>;
+               interrupts-extended = <&gpio1 6 0>, <&gpio2 1 0>;
+       };
+};
+
+&epwmss0 {
+       status = "okay";
+};
+
+&ecap0 {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&ecap0_pins>;
+};
+
+&gpio0 {
+       status = "okay";
+};
+
+&gpio1 {
+       status = "okay";
+};
+
+&gpio5 {
+       status = "okay";
+};
+
+&mmc1 {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&mmc1_pins>;
+
+       vmmc-supply = <&dcdc4>;
+       bus-width = <4>;
+       cd-gpios = <&gpio0 6 GPIO_ACTIVE_HIGH>;
+};
+
+&usb2_phy1 {
+       status = "okay";
+};
+
+&usb1 {
+       dr_mode = "peripheral";
+       status = "okay";
+};
+
+&usb2_phy2 {
+       status = "okay";
+};
+
+&usb2 {
+       dr_mode = "host";
+       status = "okay";
+};
+
+&qspi {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&qspi_pins>;
+
+       spi-max-frequency = <48000000>;
+       m25p80@0 {
+               compatible = "mx66l51235l";
+               spi-max-frequency = <48000000>;
+               reg = <0>;
+               spi-cpol;
+               spi-cpha;
+               spi-tx-bus-width = <1>;
+               spi-rx-bus-width = <4>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+
+               /* MTD partition table.
+                * The ROM checks the first 512KiB
+                * for a valid file to boot(XIP).
+                */
+               partition@0 {
+                       label = "QSPI.U_BOOT";
+                       reg = <0x00000000 0x000080000>;
+               };
+               partition@1 {
+                       label = "QSPI.U_BOOT.backup";
+                       reg = <0x00080000 0x00080000>;
+               };
+               partition@2 {
+                       label = "QSPI.U-BOOT-SPL_OS";
+                       reg = <0x00100000 0x00010000>;
+               };
+               partition@3 {
+                       label = "QSPI.U_BOOT_ENV";
+                       reg = <0x00110000 0x00010000>;
+               };
+               partition@4 {
+                       label = "QSPI.U-BOOT-ENV.backup";
+                       reg = <0x00120000 0x00010000>;
+               };
+               partition@5 {
+                       label = "QSPI.KERNEL";
+                       reg = <0x00130000 0x0800000>;
+               };
+               partition@6 {
+                       label = "QSPI.FILESYSTEM";
+                       reg = <0x00930000 0x36D0000>;
+               };
+       };
+};
+
+&mac {
+       pinctrl-names = "default", "sleep";
+       pinctrl-0 = <&cpsw_default>;
+       pinctrl-1 = <&cpsw_sleep>;
+       dual_emac = <1>;
+       status = "okay";
+};
+
+&davinci_mdio {
+       pinctrl-names = "default", "sleep";
+       pinctrl-0 = <&davinci_mdio_default>;
+       pinctrl-1 = <&davinci_mdio_sleep>;
+       status = "okay";
+};
+
+&cpsw_emac0 {
+       phy_id = <&davinci_mdio>, <4>;
+       phy-mode = "rgmii";
+       dual_emac_res_vlan = <1>;
+};
+
+&cpsw_emac1 {
+       phy_id = <&davinci_mdio>, <5>;
+       phy-mode = "rgmii";
+       dual_emac_res_vlan = <2>;
+};
+
+&elm {
+       status = "okay";
+};
+
+&mcasp1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&mcasp1_pins>;
+
+       status = "okay";
+
+       op-mode = <0>;
+       tdm-slots = <2>;
+       serial-dir = <
+               0 0 1 2
+       >;
+
+       tx-num-evt = <1>;
+       rx-num-evt = <1>;
+};
+
+&dss {
+       status = "okay";
+
+       pinctrl-names = "default";
+       pinctrl-0 = <&dss_pins>;
+
+       port {
+               dpi_out: endpoint@0 {
+                       remote-endpoint = <&lcd_in>;
+                       data-lines = <24>;
+               };
+       };
+};
+
+&rtc {
+       status = "okay";
+};
+
+&wdt {
+       status = "okay";
+};
index 90098f98a5c8fd7c0d94cf92c1e81b3930809e9c..f1ee749575128271e82b4b9c06e2ee4caad432da 100644 (file)
        status = "okay";
        pinctrl-names = "default";
        pinctrl-0 = <&i2c0_pins>;
+       clock-frequency = <400000>;
+
+       tps65218: tps65218@24 {
+               reg = <0x24>;
+               compatible = "ti,tps65218";
+               interrupts = <GIC_SPI 7 IRQ_TYPE_NONE>; /* NMIn */
+               interrupt-parent = <&gic>;
+               interrupt-controller;
+               #interrupt-cells = <2>;
+
+               dcdc1: regulator-dcdc1 {
+                       compatible = "ti,tps65218-dcdc1";
+                       regulator-name = "vdd_core";
+                       regulator-min-microvolt = <912000>;
+                       regulator-max-microvolt = <1144000>;
+                       regulator-boot-on;
+                       regulator-always-on;
+               };
+
+               dcdc2: regulator-dcdc2 {
+                       compatible = "ti,tps65218-dcdc2";
+                       regulator-name = "vdd_mpu";
+                       regulator-min-microvolt = <912000>;
+                       regulator-max-microvolt = <1378000>;
+                       regulator-boot-on;
+                       regulator-always-on;
+               };
+
+               dcdc3: regulator-dcdc3 {
+                       compatible = "ti,tps65218-dcdc3";
+                       regulator-name = "vdcdc3";
+                       regulator-min-microvolt = <1350000>;
+                       regulator-max-microvolt = <1350000>;
+                       regulator-boot-on;
+                       regulator-always-on;
+               };
+
+               dcdc5: regulator-dcdc5 {
+                       compatible = "ti,tps65218-dcdc5";
+                       regulator-name = "v1_0bat";
+                       regulator-min-microvolt = <1000000>;
+                       regulator-max-microvolt = <1000000>;
+               };
+
+               dcdc6: regulator-dcdc6 {
+                       compatible = "ti,tps65218-dcdc6";
+                       regulator-name = "v1_8bat";
+                       regulator-min-microvolt = <1800000>;
+                       regulator-max-microvolt = <1800000>;
+               };
+
+               ldo1: regulator-ldo1 {
+                       compatible = "ti,tps65218-ldo1";
+                       regulator-min-microvolt = <1800000>;
+                       regulator-max-microvolt = <1800000>;
+                       regulator-boot-on;
+                       regulator-always-on;
+               };
+       };
 
        at24@50 {
                compatible = "at24,24c256";
index 3c4f6d983cbd4c32175373ad8a3d0740098f8149..4e0ad3b827962831fe7d3e0d5a325d33b420381f 100644 (file)
                        compatible = "atmel,osc", "fixed-clock";
                        clock-frequency = <18432000>;
                };
+
+               slow_xtal {
+                       clock-frequency = <32768>;
+               };
+
+               main_xtal {
+                       clock-frequency = <18432000>;
+               };
        };
 
        ahb {
index 1e2919d43d78b2ce81405a46eb7e6e0a8c22280d..929ae00b406361b28a9d32b139d96a5e36ceb435 100644 (file)
                                cd-gpios = <&gpio1 12 GPIO_ACTIVE_HIGH>;
                                wp-gpios = <&gpio1 13 GPIO_ACTIVE_HIGH>;
                        };
+
+                       mdio {
+                               phy0: ethernet-phy@0 {
+                                       reg = <0>;
+                               };
+
+                               phy3: ethernet-phy@3 {
+                                       reg = <3>;
+                               };
+                       };
+
+                       ethernet@f0000 {
+                               status = "okay";
+
+                               eth0@c4000 {
+                                       status = "okay";
+                                       phy = <&phy0>;
+                                       phy-mode = "rgmii-id";
+                               };
+
+                               eth1@c5000 {
+                                       status = "okay";
+                                       phy = <&phy3>;
+                                       phy-mode = "gmii";
+                               };
+                       };
                };
 
                pcie-controller {
index fb92551a1e71586e4fc9aadf834c21e9b85e6679..c1e49e7bf0fa6505515cc0e5bf571263943285d3 100644 (file)
@@ -25,6 +25,8 @@
                gpio0 = &gpio0;
                gpio1 = &gpio1;
                gpio2 = &gpio2;
+               ethernet0 = &eth0;
+               ethernet1 = &eth1;
        };
 
        clocks {
                                      <0xc100 0x100>;
                        };
 
+                       mdio {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               compatible = "marvell,orion-mdio";
+                               reg = <0xc0054 0x4>;
+                               clocks = <&gateclk 19>;
+                       };
+
+                       /* Network controller */
+                       ethernet@f0000 {
+                               compatible = "marvell,armada-375-pp2";
+                               reg = <0xf0000 0xa000>, /* Packet Processor regs */
+                                     <0xc0000 0x3060>, /* LMS regs */
+                                     <0xc4000 0x100>,  /* eth0 regs */
+                                     <0xc5000 0x100>;  /* eth1 regs */
+                               clocks = <&gateclk 3>, <&gateclk 19>;
+                               clock-names = "pp_clk", "gop_clk";
+                               status = "disabled";
+
+                               eth0: eth0@c4000 {
+                                       interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>;
+                                       port-id = <0>;
+                                       status = "disabled";
+                               };
+
+                               eth1: eth1@c5000 {
+                                       interrupts = <GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>;
+                                       port-id = <1>;
+                                       status = "disabled";
+                               };
+                       };
+
                        spi0: spi@10600 {
                                compatible = "marvell,orion-spi";
                                reg = <0x10600 0x50>;
index 689fa1a467289578ccb0344b7c7550be1e48d709..242d0ecc99f33e178fdef408820b8623880fb3bf 100644 (file)
                                reg = <0x20800 0x10>;
                        };
 
+                       mpcore-soc-ctrl@20d20 {
+                               compatible = "marvell,armada-380-mpcore-soc-ctrl";
+                               reg = <0x20d20 0x6c>;
+                       };
+
                        coherency-fabric@21010 {
                                compatible = "marvell,armada-380-coherency-fabric";
                                reg = <0x21010 0x1c>;
diff --git a/arch/arm/boot/dts/armada-xp-lenovo-ix4-300d.dts b/arch/arm/boot/dts/armada-xp-lenovo-ix4-300d.dts
new file mode 100644 (file)
index 0000000..469cf71
--- /dev/null
@@ -0,0 +1,284 @@
+/*
+ * Device Tree file for Lenovo Iomega ix4-300d
+ *
+ * Copyright (C) 2014, Benoit Masson <yahoo@perenite.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+/dts-v1/;
+
+#include <dt-bindings/input/input.h>
+#include <dt-bindings/gpio/gpio.h>
+#include "armada-xp-mv78230.dtsi"
+
+/ {
+       model = "Lenovo Iomega ix4-300d";
+       compatible = "lenovo,ix4-300d", "marvell,armadaxp-mv78230",
+                    "marvell,armadaxp", "marvell,armada-370-xp";
+
+       chosen {
+               bootargs = "console=ttyS0,115200 earlyprintk";
+               stdout-path = "/soc/internal-regs/serial@12000";
+       };
+
+       memory {
+               device_type = "memory";
+               reg = <0 0x00000000 0 0x20000000>; /* 512MB */
+       };
+
+       soc {
+               ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xd0000000 0x100000
+                       MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000>;
+
+               pcie-controller {
+                       status = "okay";
+
+                       /* Quad port sata: Marvell 88SX7042 */
+                       pcie@1,0 {
+                               /* Port 0, Lane 0 */
+                               status = "okay";
+                       };
+
+                       /* USB 3.0 xHCI controller: NEC D720200F1 */
+                       pcie@5,0 {
+                               /* Port 1, Lane 0 */
+                               status = "okay";
+                       };
+               };
+
+               internal-regs {
+                       pinctrl {
+                               poweroff_pin: poweroff-pin {
+                                       marvell,pins = "mpp24";
+                                       marvell,function = "gpio";
+                               };
+
+                               power_button_pin: power-button-pin {
+                                       marvell,pins = "mpp44";
+                                       marvell,function = "gpio";
+                               };
+
+                               reset_button_pin: reset-button-pin {
+                                       marvell,pins = "mpp45";
+                                       marvell,function = "gpio";
+                               };
+                               select_button_pin: select-button-pin {
+                                       marvell,pins = "mpp41";
+                                       marvell,function = "gpio";
+                               };
+
+                               scroll_button_pin: scroll-button-pin {
+                                       marvell,pins = "mpp42";
+                                       marvell,function = "gpio";
+                               };
+
+                               hdd_led_pin: hdd-led-pin {
+                                       marvell,pins = "mpp26";
+                                       marvell,function = "gpio";
+                               };
+                       };
+
+                       serial@12000 {
+                               status = "okay";
+                       };
+
+                       mdio {
+                               phy0: ethernet-phy@0 { /* Marvell 88E1318 */
+                                       reg = <0>;
+                               };
+
+                               phy1: ethernet-phy@1 { /* Marvell 88E1318 */
+                                       reg = <1>;
+                               };
+                       };
+
+                       ethernet@70000 {
+                               status = "okay";
+                               phy = <&phy0>;
+                               phy-mode = "rgmii-id";
+                       };
+
+                       ethernet@74000 {
+                               status = "okay";
+                               phy = <&phy1>;
+                               phy-mode = "rgmii-id";
+                       };
+
+                       usb@50000 {
+                               status = "okay";
+                       };
+
+                       usb@51000 {
+                               status = "okay";
+                       };
+
+                       i2c@11000 {
+                               clock-frequency = <400000>;
+                               status = "okay";
+
+                               adt7473@2e {
+                                       compatible = "adi,adt7473";
+                                       reg = <0x2e>;
+                               };
+
+                               pcf8563@51 {
+                                       compatible = "nxp,pcf8563";
+                                       reg = <0x51>;
+                               };
+
+                       };
+
+                       nand@d0000 {
+                               status = "okay";
+                               num-cs = <1>;
+                               marvell,nand-keep-config;
+                               marvell,nand-enable-arbiter;
+                               nand-on-flash-bbt;
+
+                               partition@0 {
+                                       label = "u-boot";
+                                       reg = <0x0000000 0xe0000>;
+                                       read-only;
+                               };
+
+                               partition@e0000 {
+                                       label = "u-boot-env";
+                                       reg = <0xe0000 0x20000>;
+                                       read-only;
+                               };
+
+                               partition@100000 {
+                                       label = "u-boot-env2";
+                                       reg = <0x100000 0x20000>;
+                                       read-only;
+                               };
+
+                               partition@120000 {
+                                       label = "zImage";
+                                       reg = <0x120000 0x400000>;
+                               };
+
+                               partition@520000 {
+                                       label = "initrd";
+                                       reg = <0x520000 0x400000>;
+                               };
+
+                               partition@xE00000 {
+                                       label = "boot";
+                                       reg = <0xE00000 0x3F200000>;
+                               };
+
+                               partition@flash {
+                                       label = "flash";
+                                       reg = <0x0 0x40000000>;
+                               };
+                       };
+               };
+       };
+
+       gpio-keys {
+               compatible = "gpio-keys";
+               pinctrl-0 = <&power_button_pin &reset_button_pin
+                       &select_button_pin &scroll_button_pin>;
+               pinctrl-names = "default";
+
+               power-button {
+                       label = "Power Button";
+                       linux,code = <KEY_POWER>;
+                       gpios = <&gpio1 12 GPIO_ACTIVE_HIGH>;
+               };
+
+               reset-button {
+                       label = "Reset Button";
+                       linux,code = <KEY_RESTART>;
+                       gpios = <&gpio1 13 GPIO_ACTIVE_LOW>;
+               };
+
+               select-button {
+                       label = "Select Button";
+                       linux,code = <BTN_SELECT>;
+                       gpios = <&gpio1 9 GPIO_ACTIVE_LOW>;
+               };
+
+               scroll-button {
+                       label = "Scroll Button";
+                       linux,code = <KEY_SCROLLDOWN>;
+                       gpios = <&gpio1 10 GPIO_ACTIVE_LOW>;
+               };
+       };
+
+       spi3 {
+               compatible = "spi-gpio";
+               status = "okay";
+               gpio-sck = <&gpio0 25 GPIO_ACTIVE_LOW>;
+               gpio-mosi = <&gpio1 15 GPIO_ACTIVE_LOW>; /*gpio 47*/
+               cs-gpios = <&gpio0 27 GPIO_ACTIVE_LOW>;
+               num-chipselects = <1>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               gpio_spi: gpio_spi@0 {
+                       compatible = "fairchild,74hc595";
+                       gpio-controller;
+                       #gpio-cells = <2>;
+                       reg = <0>;
+                       registers-number = <2>;
+                       spi-max-frequency = <100000>;
+               };
+       };
+
+       gpio-leds {
+               compatible = "gpio-leds";
+               pinctrl-0 = <&hdd_led_pin>;
+               pinctrl-names = "default";
+
+               hdd-led {
+                       label = "ix4-300d:hdd:blue";
+                       gpios = <&gpio0 26 GPIO_ACTIVE_HIGH>;
+                       default-state = "off";
+               };
+
+               power-led {
+                       label = "ix4-300d:power:white";
+                       gpios = <&gpio_spi 1 GPIO_ACTIVE_LOW>;
+                       /* init blinking while booting */
+                       linux,default-trigger = "timer";
+                       default-state = "on";
+               };
+
+               sysfail-led {
+                       label = "ix4-300d:sysfail:red";
+                       gpios = <&gpio_spi 2 GPIO_ACTIVE_HIGH>;
+                       default-state = "off";
+               };
+
+               sys-led {
+                       label = "ix4-300d:sys:blue";
+                       gpios = <&gpio_spi 3 GPIO_ACTIVE_HIGH>;
+                       default-state = "off";
+               };
+
+               hddfail-led {
+                       label = "ix4-300d:hddfail:red";
+                       gpios = <&gpio_spi 4 GPIO_ACTIVE_HIGH>;
+                       default-state = "off";
+               };
+
+       };
+
+       /*
+        * Warning: you need both eth1 & 0 PHY initialized (i.e having
+        * them up does the tweak) for poweroff to shutdown otherwise it
+        * reboots
+        */
+       gpio-poweroff {
+               compatible = "gpio-poweroff";
+               pinctrl-0 = <&poweroff_pin>;
+               pinctrl-names = "default";
+               gpios = <&gpio0 24 GPIO_ACTIVE_HIGH>;
+       };
+};
index 1257ff1ed278e68a33793eb9cf0c40be08e0b169..2592e1c13560039c0a1396b63026934b12bb305c 100644 (file)
@@ -34,6 +34,7 @@
                        compatible = "marvell,sheeva-v7";
                        reg = <0>;
                        clocks = <&cpuclk 0>;
+                       clock-latency = <1000000>;
                };
 
                cpu@1 {
@@ -41,6 +42,7 @@
                        compatible = "marvell,sheeva-v7";
                        reg = <1>;
                        clocks = <&cpuclk 1>;
+                       clock-latency = <1000000>;
                };
        };
 
index 3396b25b39e179cb1a444435adfa28c87385e8ed..480e237a870fa42c86dca6ab7dd5585d6345956a 100644 (file)
@@ -36,6 +36,7 @@
                        compatible = "marvell,sheeva-v7";
                        reg = <0>;
                        clocks = <&cpuclk 0>;
+                       clock-latency = <1000000>;
                };
 
                cpu@1 {
@@ -43,6 +44,7 @@
                        compatible = "marvell,sheeva-v7";
                        reg = <1>;
                        clocks = <&cpuclk 1>;
+                       clock-latency = <1000000>;
                };
        };
 
index 6da84bf40aaf48849d308453755c1eca3605396b..2c7b1fef470350714a9f9c5df7b25f42708019de 100644 (file)
@@ -37,6 +37,7 @@
                        compatible = "marvell,sheeva-v7";
                        reg = <0>;
                        clocks = <&cpuclk 0>;
+                       clock-latency = <1000000>;
                };
 
                cpu@1 {
@@ -44,6 +45,7 @@
                        compatible = "marvell,sheeva-v7";
                        reg = <1>;
                        clocks = <&cpuclk 1>;
+                       clock-latency = <1000000>;
                };
 
                cpu@2 {
@@ -51,6 +53,7 @@
                        compatible = "marvell,sheeva-v7";
                        reg = <2>;
                        clocks = <&cpuclk 2>;
+                       clock-latency = <1000000>;
                };
 
                cpu@3 {
@@ -58,6 +61,7 @@
                        compatible = "marvell,sheeva-v7";
                        reg = <3>;
                        clocks = <&cpuclk 3>;
+                       clock-latency = <1000000>;
                };
        };
 
index 5902e8359c9165c33cc265b0a304df33acb640b5..bff9f6c18db1358dd7d70aa9b9de0e40c054da20 100644 (file)
@@ -99,7 +99,7 @@
                        cpuclk: clock-complex@18700 {
                                #clock-cells = <1>;
                                compatible = "marvell,armada-xp-cpu-clock";
-                               reg = <0x18700 0xA0>;
+                               reg = <0x18700 0xA0>, <0x1c054 0x10>;
                                clocks = <&coreclk 1>;
                        };
 
index 55ab6180e350d10e9c4f816095eba4910a37cbce..e9ced30159a728d608c75b4a5098a6b08e7bb12c 100644 (file)
                        compatible = "atmel,osc", "fixed-clock";
                        clock-frequency = <12000000>;
                };
+
+               slow_xtal {
+                       clock-frequency = <32768>;
+               };
+
+               main_xtal {
+                       clock-frequency = <12000000>;
+               };
        };
 
        ahb {
index df4b7869569587991abcf5bde8be1e495f632213..b6ea3f4a7206025f144f3bb8f6e69328f4996779 100644 (file)
                        compatible = "atmel,osc", "fixed-clock";
                        clock-frequency = <12000000>;
                };
+
+               slow_xtal {
+                       clock-frequency = <32768>;
+               };
+
+               main_xtal {
+                       clock-frequency = <12000000>;
+               };
        };
 
        ahb {
index cbe9673439970a3f883fb58cce44a0cb46551ab6..f89598af4c2b1ef24b1812b15fca28de2c5b4382 100644 (file)
                        compatible = "atmel,osc", "fixed-clock";
                        clock-frequency = <18432000>;
                };
+
+               slow_xtal {
+                       clock-frequency = <32768>;
+               };
+
+               main_xtal {
+                       clock-frequency = <18432000>;
+               };
        };
 
        ahb {
index 5576ae8786c058b891e6fca015cce18d2efea6b9..a9aef53ab764202df553a058b73cd77a84c55dff 100644 (file)
                        compatible = "atmel,osc", "fixed-clock";
                        clock-frequency = <12000000>;
                };
+
+               slow_xtal {
+                       clock-frequency = <32768>;
+               };
+
+               main_xtal {
+                       clock-frequency = <12000000>;
+               };
        };
 
        ahb {
index 5b8e40400becbd57fb2ca3e03d3b411dfb7e6dd7..fec1fca2ad66c80ad3ce949d82741b235790c1ed 100644 (file)
                reg = <0x20000000 0x10000000>;
        };
 
-       slow_xtal {
-               clock-frequency = <32768>;
-       };
+       clocks {
+               slow_xtal {
+                       clock-frequency = <32768>;
+               };
 
-       main_xtal {
-               clock-frequency = <12000000>;
+               main_xtal {
+                       clock-frequency = <12000000>;
+               };
        };
 
        ahb {
index c61b16fba79babaa5c6e2a4dd4fb51b09e27d379..65ccf564b9a5636eabb7af6cf2697d5c28dccd74 100644 (file)
@@ -14,6 +14,7 @@
 #include <dt-bindings/pinctrl/at91.h>
 #include <dt-bindings/interrupt-controller/irq.h>
 #include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/clock/at91.h>
 
 / {
        model = "Atmel AT91RM9200 family SoC";
                reg = <0x20000000 0x04000000>;
        };
 
+       clocks {
+               slow_xtal: slow_xtal {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <0>;
+               };
+
+               main_xtal: main_xtal {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <0>;
+               };
+       };
+
        ahb {
                compatible = "simple-bus";
                #address-cells = <1>;
                        pmc: pmc@fffffc00 {
                                compatible = "atmel,at91rm9200-pmc";
                                reg = <0xfffffc00 0x100>;
+                               interrupts = <1 IRQ_TYPE_LEVEL_HIGH 7>;
+                               interrupt-controller;
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               #interrupt-cells = <1>;
+
+                               main_osc: main_osc {
+                                       compatible = "atmel,at91rm9200-clk-main-osc";
+                                       #clock-cells = <0>;
+                                       interrupts-extended = <&pmc AT91_PMC_MOSCS>;
+                                       clocks = <&main_xtal>;
+                               };
+
+                               main: mainck {
+                                       compatible = "atmel,at91rm9200-clk-main";
+                                       #clock-cells = <0>;
+                                       clocks = <&main_osc>;
+                               };
+
+                               plla: pllack {
+                                       compatible = "atmel,at91rm9200-clk-pll";
+                                       #clock-cells = <0>;
+                                       interrupts-extended = <&pmc AT91_PMC_LOCKA>;
+                                       clocks = <&main>;
+                                       reg = <0>;
+                                       atmel,clk-input-range = <1000000 32000000>;
+                                       #atmel,pll-clk-output-range-cells = <3>;
+                                       atmel,pll-clk-output-ranges = <80000000 160000000 0>,
+                                                               <150000000 180000000 2>;
+                               };
+
+                               pllb: pllbck {
+                                       compatible = "atmel,at91rm9200-clk-pll";
+                                       #clock-cells = <0>;
+                                       interrupts-extended = <&pmc AT91_PMC_LOCKB>;
+                                       clocks = <&main>;
+                                       reg = <1>;
+                                       atmel,clk-input-range = <1000000 32000000>;
+                                       #atmel,pll-clk-output-range-cells = <3>;
+                                       atmel,pll-clk-output-ranges = <80000000 160000000 0>,
+                                                               <150000000 180000000 2>;
+                               };
+
+                               mck: masterck {
+                                       compatible = "atmel,at91rm9200-clk-master";
+                                       #clock-cells = <0>;
+                                       interrupts-extended = <&pmc AT91_PMC_MCKRDY>;
+                                       clocks = <&slow_xtal>, <&main>, <&plla>, <&pllb>;
+                                       atmel,clk-output-range = <0 80000000>;
+                                       atmel,clk-divisors = <1 2 3 4>;
+                               };
+
+                               usb: usbck {
+                                       compatible = "atmel,at91rm9200-clk-usb";
+                                       #clock-cells = <0>;
+                                       atmel,clk-divisors = <1 2>;
+                                       clocks = <&pllb>;
+                               };
+
+                               prog: progck {
+                                       compatible = "atmel,at91rm9200-clk-programmable";
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                                       interrupt-parent = <&pmc>;
+                                       clocks = <&slow_xtal>, <&main>, <&plla>, <&pllb>;
+
+                                       prog0: prog0 {
+                                               #clock-cells = <0>;
+                                               reg = <0>;
+                                               interrupts = <AT91_PMC_PCKRDY(0)>;
+                                       };
+
+                                       prog1: prog1 {
+                                               #clock-cells = <0>;
+                                               reg = <1>;
+                                               interrupts = <AT91_PMC_PCKRDY(1)>;
+                                       };
+
+                                       prog2: prog2 {
+                                               #clock-cells = <0>;
+                                               reg = <2>;
+                                               interrupts = <AT91_PMC_PCKRDY(2)>;
+                                       };
+
+                                       prog3: prog3 {
+                                               #clock-cells = <0>;
+                                               reg = <3>;
+                                               interrupts = <AT91_PMC_PCKRDY(3)>;
+                                       };
+                               };
+
+                               systemck {
+                                       compatible = "atmel,at91rm9200-clk-system";
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+
+                                       udpck: udpck {
+                                               #clock-cells = <0>;
+                                               reg = <2>;
+                                               clocks = <&usb>;
+                                       };
+
+                                       uhpck: uhpck {
+                                               #clock-cells = <0>;
+                                               reg = <4>;
+                                               clocks = <&usb>;
+                                       };
+
+                                       pck0: pck0 {
+                                               #clock-cells = <0>;
+                                               reg = <8>;
+                                               clocks = <&prog0>;
+                                       };
+
+                                       pck1: pck1 {
+                                               #clock-cells = <0>;
+                                               reg = <9>;
+                                               clocks = <&prog1>;
+                                       };
+
+                                       pck2: pck2 {
+                                               #clock-cells = <0>;
+                                               reg = <10>;
+                                               clocks = <&prog2>;
+                                       };
+
+                                       pck3: pck3 {
+                                               #clock-cells = <0>;
+                                               reg = <11>;
+                                               clocks = <&prog3>;
+                                       };
+                               };
+
+                               periphck {
+                                       compatible = "atmel,at91rm9200-clk-peripheral";
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                                       clocks = <&mck>;
+
+                                       pioA_clk: pioA_clk {
+                                               #clock-cells = <0>;
+                                               reg = <2>;
+                                       };
+
+                                       pioB_clk: pioB_clk {
+                                               #clock-cells = <0>;
+                                               reg = <3>;
+                                       };
+
+                                       pioC_clk: pioC_clk {
+                                               #clock-cells = <0>;
+                                               reg = <4>;
+                                       };
+
+                                       pioD_clk: pioD_clk {
+                                               #clock-cells = <0>;
+                                               reg = <5>;
+                                       };
+
+                                       usart0_clk: usart0_clk {
+                                               #clock-cells = <0>;
+                                               reg = <6>;
+                                       };
+
+                                       usart1_clk: usart1_clk {
+                                               #clock-cells = <0>;
+                                               reg = <7>;
+                                       };
+
+                                       usart2_clk: usart2_clk {
+                                               #clock-cells = <0>;
+                                               reg = <8>;
+                                       };
+
+                                       usart3_clk: usart3_clk {
+                                               #clock-cells = <0>;
+                                               reg = <9>;
+                                       };
+
+                                       mci0_clk: mci0_clk {
+                                               #clock-cells = <0>;
+                                               reg = <10>;
+                                       };
+
+                                       udc_clk: udc_clk {
+                                               #clock-cells = <0>;
+                                               reg = <11>;
+                                       };
+
+                                       twi0_clk: twi0_clk {
+                                               reg = <12>;
+                                               #clock-cells = <0>;
+                                       };
+
+                                       spi0_clk: spi0_clk {
+                                               #clock-cells = <0>;
+                                               reg = <13>;
+                                       };
+
+                                       ssc0_clk: ssc0_clk {
+                                               #clock-cells = <0>;
+                                               reg = <14>;
+                                       };
+
+                                       ssc1_clk: ssc1_clk {
+                                               #clock-cells = <0>;
+                                               reg = <15>;
+                                       };
+
+                                       ssc2_clk: ssc2_clk {
+                                               #clock-cells = <0>;
+                                               reg = <16>;
+                                       };
+
+                                       tc0_clk: tc0_clk {
+                                               #clock-cells = <0>;
+                                               reg = <17>;
+                                       };
+
+                                       tc1_clk: tc1_clk {
+                                               #clock-cells = <0>;
+                                               reg = <18>;
+                                       };
+
+                                       tc2_clk: tc2_clk {
+                                               #clock-cells = <0>;
+                                               reg = <19>;
+                                       };
+
+                                       tc3_clk: tc3_clk {
+                                               #clock-cells = <0>;
+                                               reg = <20>;
+                                       };
+
+                                       tc4_clk: tc4_clk {
+                                               #clock-cells = <0>;
+                                               reg = <21>;
+                                       };
+
+                                       tc5_clk: tc5_clk {
+                                               #clock-cells = <0>;
+                                               reg = <22>;
+                                       };
+
+                                       ohci_clk: ohci_clk {
+                                               #clock-cells = <0>;
+                                               reg = <23>;
+                                       };
+
+                                       macb0_clk: macb0_clk {
+                                               #clock-cells = <0>;
+                                               reg = <24>;
+                                       };
+                               };
                        };
 
                        st: timer@fffffd00 {
                                interrupts = <17 IRQ_TYPE_LEVEL_HIGH 0
                                              18 IRQ_TYPE_LEVEL_HIGH 0
                                              19 IRQ_TYPE_LEVEL_HIGH 0>;
+                               clocks = <&tc0_clk>, <&tc1_clk>, <&tc2_clk>;
+                               clock-names = "t0_clk", "t1_clk", "t2_clk";
                        };
 
                        tcb1: timer@fffa4000 {
                                interrupts = <20 IRQ_TYPE_LEVEL_HIGH 0
                                              21 IRQ_TYPE_LEVEL_HIGH 0
                                              22 IRQ_TYPE_LEVEL_HIGH 0>;
+                               clocks = <&tc3_clk>, <&tc4_clk>, <&tc5_clk>;
+                               clock-names = "t0_clk", "t1_clk", "t2_clk";
                        };
 
                        i2c0: i2c@fffb8000 {
                                interrupts = <12 IRQ_TYPE_LEVEL_HIGH 6>;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_twi>;
+                               clocks = <&twi0_clk>;
                                #address-cells = <1>;
                                #size-cells = <0>;
                                status = "disabled";
                                compatible = "atmel,hsmci";
                                reg = <0xfffb4000 0x4000>;
                                interrupts = <10 IRQ_TYPE_LEVEL_HIGH 0>;
+                               clocks = <&mci0_clk>;
+                               clock-names = "mci_clk";
                                #address-cells = <1>;
                                #size-cells = <0>;
                                pinctrl-names = "default";
                                interrupts = <14 IRQ_TYPE_LEVEL_HIGH 5>;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_ssc0_tx &pinctrl_ssc0_rx>;
+                               clocks = <&ssc0_clk>;
+                               clock-names = "pclk";
                                status = "disable";
                        };
 
                                interrupts = <15 IRQ_TYPE_LEVEL_HIGH 5>;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_ssc1_tx &pinctrl_ssc1_rx>;
+                               clocks = <&ssc1_clk>;
+                               clock-names = "pclk";
                                status = "disable";
                        };
 
                                interrupts = <16 IRQ_TYPE_LEVEL_HIGH 5>;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_ssc2_tx &pinctrl_ssc2_rx>;
+                               clocks = <&ssc2_clk>;
+                               clock-names = "pclk";
                                status = "disable";
                        };
 
                                phy-mode = "rmii";
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_macb_rmii>;
+                               clocks = <&macb0_clk>;
+                               clock-names = "ether_clk";
                                status = "disabled";
                        };
 
                                        gpio-controller;
                                        interrupt-controller;
                                        #interrupt-cells = <2>;
+                                       clocks = <&pioA_clk>;
                                };
 
                                pioB: gpio@fffff600 {
                                        gpio-controller;
                                        interrupt-controller;
                                        #interrupt-cells = <2>;
+                                       clocks = <&pioB_clk>;
                                };
 
                                pioC: gpio@fffff800 {
                                        gpio-controller;
                                        interrupt-controller;
                                        #interrupt-cells = <2>;
+                                       clocks = <&pioC_clk>;
                                };
 
                                pioD: gpio@fffffa00 {
                                        gpio-controller;
                                        interrupt-controller;
                                        #interrupt-cells = <2>;
+                                       clocks = <&pioD_clk>;
                                };
                        };
 
                                interrupts = <1 IRQ_TYPE_LEVEL_HIGH 7>;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_dbgu>;
+                               clocks = <&mck>;
+                               clock-names = "usart";
                                status = "disabled";
                        };
 
                                atmel,use-dma-tx;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_uart0>;
+                               clocks = <&usart0_clk>;
+                               clock-names = "usart";
                                status = "disabled";
                        };
 
                                atmel,use-dma-tx;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_uart1>;
+                               clocks = <&usart1_clk>;
+                               clock-names = "usart";
                                status = "disabled";
                        };
 
                                atmel,use-dma-tx;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_uart2>;
+                               clocks = <&usart2_clk>;
+                               clock-names = "usart";
                                status = "disabled";
                        };
 
                                atmel,use-dma-tx;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_uart3>;
+                               clocks = <&usart3_clk>;
+                               clock-names = "usart";
                                status = "disabled";
                        };
 
                                compatible = "atmel,at91rm9200-udc";
                                reg = <0xfffb0000 0x4000>;
                                interrupts = <11 IRQ_TYPE_LEVEL_HIGH 2>;
+                               clocks = <&udc_clk>, <&udpck>;
+                               clock-names = "pclk", "hclk";
                                status = "disabled";
                        };
 
                                interrupts = <13 IRQ_TYPE_LEVEL_HIGH 3>;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_spi0>;
+                               clocks = <&spi0_clk>;
+                               clock-names = "spi_clk";
                                status = "disabled";
                        };
                };
                        compatible = "atmel,at91rm9200-ohci", "usb-ohci";
                        reg = <0x00300000 0x100000>;
                        interrupts = <23 IRQ_TYPE_LEVEL_HIGH 2>;
+                       clocks = <&usb>, <&ohci_clk>, <&ohci_clk>, <&uhpck>;
+                       clock-names = "usb_clk", "ohci_clk", "hclk", "uhpck";
                        status = "disabled";
                };
        };
index df6b0aa0e4ddd6388110a655c14b1ad889eb6bf0..43eb779dd6f6f5c077ade770b838fadda2171c38 100644 (file)
                        compatible = "atmel,osc", "fixed-clock";
                        clock-frequency = <18432000>;
                };
+
+               slow_xtal {
+                       clock-frequency = <32768>;
+               };
+
+               main_xtal {
+                       clock-frequency = <18432000>;
+               };
        };
 
        ahb {
index c0e0eae16a279f65dfc979d5d10735ca5b097c38..cb100b03a362fc8e3667dfa4b3f0de8418296ba1 100644 (file)
@@ -12,6 +12,7 @@
 #include <dt-bindings/pinctrl/at91.h>
 #include <dt-bindings/interrupt-controller/irq.h>
 #include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/clock/at91.h>
 
 / {
        model = "Atmel AT91SAM9260 family SoC";
                reg = <0x20000000 0x04000000>;
        };
 
+       clocks {
+               slow_xtal: slow_xtal {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <0>;
+               };
+
+               main_xtal: main_xtal {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <0>;
+               };
+
+               adc_op_clk: adc_op_clk{
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <5000000>;
+               };
+       };
+
        ahb {
                compatible = "simple-bus";
                #address-cells = <1>;
                        };
 
                        pmc: pmc@fffffc00 {
-                               compatible = "atmel,at91rm9200-pmc";
+                               compatible = "atmel,at91sam9260-pmc";
                                reg = <0xfffffc00 0x100>;
+                               interrupts = <1 IRQ_TYPE_LEVEL_HIGH 7>;
+                               interrupt-controller;
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               #interrupt-cells = <1>;
+
+                               main_osc: main_osc {
+                                       compatible = "atmel,at91rm9200-clk-main-osc";
+                                       #clock-cells = <0>;
+                                       interrupts-extended = <&pmc AT91_PMC_MOSCS>;
+                                       clocks = <&main_xtal>;
+                               };
+
+                               main: mainck {
+                                       compatible = "atmel,at91rm9200-clk-main";
+                                       #clock-cells = <0>;
+                                       clocks = <&main_osc>;
+                               };
+
+                               slow_rc_osc: slow_rc_osc {
+                                       compatible = "fixed-clock";
+                                       #clock-cells = <0>;
+                                       clock-frequency = <32768>;
+                                       clock-accuracy = <50000000>;
+                               };
+
+                               clk32k: slck {
+                                       compatible = "atmel,at91sam9260-clk-slow";
+                                       #clock-cells = <0>;
+                                       clocks = <&slow_rc_osc>, <&slow_xtal>;
+                               };
+
+                               plla: pllack {
+                                       compatible = "atmel,at91rm9200-clk-pll";
+                                       #clock-cells = <0>;
+                                       interrupts-extended = <&pmc AT91_PMC_LOCKA>;
+                                       clocks = <&main>;
+                                       reg = <0>;
+                                       atmel,clk-input-range = <1000000 32000000>;
+                                       #atmel,pll-clk-output-range-cells = <4>;
+                                       atmel,pll-clk-output-ranges = <80000000 160000000 0 1>,
+                                                               <150000000 240000000 2 1>;
+                               };
+
+                               pllb: pllbck {
+                                       compatible = "atmel,at91rm9200-clk-pll";
+                                       #clock-cells = <0>;
+                                       interrupts-extended = <&pmc AT91_PMC_LOCKB>;
+                                       clocks = <&main>;
+                                       reg = <1>;
+                                       atmel,clk-input-range = <1000000 5000000>;
+                                       #atmel,pll-clk-output-range-cells = <4>;
+                                       atmel,pll-clk-output-ranges = <70000000 130000000 1 1>;
+                               };
+
+                               mck: masterck {
+                                       compatible = "atmel,at91rm9200-clk-master";
+                                       #clock-cells = <0>;
+                                       interrupts-extended = <&pmc AT91_PMC_MCKRDY>;
+                                       clocks = <&clk32k>, <&main>, <&plla>, <&pllb>;
+                                       atmel,clk-output-range = <0 105000000>;
+                                       atmel,clk-divisors = <1 2 4 0>;
+                               };
+
+                               usb: usbck {
+                                       compatible = "atmel,at91rm9200-clk-usb";
+                                       #clock-cells = <0>;
+                                       atmel,clk-divisors = <1 2 4 0>;
+                                       clocks = <&pllb>;
+                               };
+
+                               prog: progck {
+                                       compatible = "atmel,at91rm9200-clk-programmable";
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                                       interrupt-parent = <&pmc>;
+                                       clocks = <&clk32k>, <&main>, <&plla>, <&pllb>;
+
+                                       prog0: prog0 {
+                                               #clock-cells = <0>;
+                                               reg = <0>;
+                                               interrupts = <AT91_PMC_PCKRDY(0)>;
+                                       };
+
+                                       prog1: prog1 {
+                                               #clock-cells = <0>;
+                                               reg = <1>;
+                                               interrupts = <AT91_PMC_PCKRDY(1)>;
+                                       };
+                               };
+
+                               systemck {
+                                       compatible = "atmel,at91rm9200-clk-system";
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+
+                                       uhpck: uhpck {
+                                               #clock-cells = <0>;
+                                               reg = <6>;
+                                               clocks = <&usb>;
+                                       };
+
+                                       udpck: udpck {
+                                               #clock-cells = <0>;
+                                               reg = <7>;
+                                               clocks = <&usb>;
+                                       };
+
+                                       pck0: pck0 {
+                                               #clock-cells = <0>;
+                                               reg = <8>;
+                                               clocks = <&prog0>;
+                                       };
+
+                                       pck1: pck1 {
+                                               #clock-cells = <0>;
+                                               reg = <9>;
+                                               clocks = <&prog1>;
+                                       };
+                               };
+
+                               periphck {
+                                       compatible = "atmel,at91rm9200-clk-peripheral";
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                                       clocks = <&mck>;
+
+                                       pioA_clk: pioA_clk {
+                                               #clock-cells = <0>;
+                                               reg = <2>;
+                                       };
+
+                                       pioB_clk: pioB_clk {
+                                               #clock-cells = <0>;
+                                               reg = <3>;
+                                       };
+
+                                       pioC_clk: pioC_clk {
+                                               #clock-cells = <0>;
+                                               reg = <4>;
+                                       };
+
+                                       adc_clk: adc_clk {
+                                               #clock-cells = <0>;
+                                               reg = <5>;
+                                       };
+
+                                       usart0_clk: usart0_clk {
+                                               #clock-cells = <0>;
+                                               reg = <6>;
+                                       };
+
+                                       usart1_clk: usart1_clk {
+                                               #clock-cells = <0>;
+                                               reg = <7>;
+                                       };
+
+                                       usart2_clk: usart2_clk {
+                                               #clock-cells = <0>;
+                                               reg = <8>;
+                                       };
+
+                                       mci0_clk: mci0_clk {
+                                               #clock-cells = <0>;
+                                               reg = <9>;
+                                       };
+
+                                       udc_clk: udc_clk {
+                                               #clock-cells = <0>;
+                                               reg = <10>;
+                                       };
+
+                                       twi0_clk: twi0_clk {
+                                               reg = <11>;
+                                               #clock-cells = <0>;
+                                       };
+
+                                       spi0_clk: spi0_clk {
+                                               #clock-cells = <0>;
+                                               reg = <12>;
+                                       };
+
+                                       spi1_clk: spi1_clk {
+                                               #clock-cells = <0>;
+                                               reg = <13>;
+                                       };
+
+                                       ssc0_clk: ssc0_clk {
+                                               #clock-cells = <0>;
+                                               reg = <14>;
+                                       };
+
+                                       tc0_clk: tc0_clk {
+                                               #clock-cells = <0>;
+                                               reg = <17>;
+                                       };
+
+                                       tc1_clk: tc1_clk {
+                                               #clock-cells = <0>;
+                                               reg = <18>;
+                                       };
+
+                                       tc2_clk: tc2_clk {
+                                               #clock-cells = <0>;
+                                               reg = <19>;
+                                       };
+
+                                       ohci_clk: ohci_clk {
+                                               #clock-cells = <0>;
+                                               reg = <20>;
+                                       };
+
+                                       macb0_clk: macb0_clk {
+                                               #clock-cells = <0>;
+                                               reg = <21>;
+                                       };
+
+                                       isi_clk: isi_clk {
+                                               #clock-cells = <0>;
+                                               reg = <22>;
+                                       };
+
+                                       usart3_clk: usart3_clk {
+                                               #clock-cells = <0>;
+                                               reg = <23>;
+                                       };
+
+                                       uart0_clk: uart0_clk {
+                                               #clock-cells = <0>;
+                                               reg = <24>;
+                                       };
+
+                                       uart1_clk: uart1_clk {
+                                               #clock-cells = <0>;
+                                               reg = <25>;
+                                       };
+
+                                       tc3_clk: tc3_clk {
+                                               #clock-cells = <0>;
+                                               reg = <26>;
+                                       };
+
+                                       tc4_clk: tc4_clk {
+                                               #clock-cells = <0>;
+                                               reg = <27>;
+                                       };
+
+                                       tc5_clk: tc5_clk {
+                                               #clock-cells = <0>;
+                                               reg = <28>;
+                                       };
+                               };
                        };
 
                        rstc@fffffd00 {
                                compatible = "atmel,at91sam9260-pit";
                                reg = <0xfffffd30 0xf>;
                                interrupts = <1 IRQ_TYPE_LEVEL_HIGH 7>;
+                               clocks = <&mck>;
                        };
 
                        tcb0: timer@fffa0000 {
                                interrupts = <17 IRQ_TYPE_LEVEL_HIGH 0
                                              18 IRQ_TYPE_LEVEL_HIGH 0
                                              19 IRQ_TYPE_LEVEL_HIGH 0>;
+                               clocks = <&tc0_clk>, <&tc1_clk>, <&tc2_clk>;
+                               clock-names = "t0_clk", "t1_clk", "t2_clk";
                        };
 
                        tcb1: timer@fffdc000 {
                                interrupts = <26 IRQ_TYPE_LEVEL_HIGH 0
                                              27 IRQ_TYPE_LEVEL_HIGH 0
                                              28 IRQ_TYPE_LEVEL_HIGH 0>;
+                               clocks = <&tc3_clk>, <&tc4_clk>, <&tc5_clk>;
+                               clock-names = "t0_clk", "t1_clk", "t2_clk";
                        };
 
                        pinctrl@fffff400 {
                                        gpio-controller;
                                        interrupt-controller;
                                        #interrupt-cells = <2>;
+                                       clocks = <&pioA_clk>;
                                };
 
                                pioB: gpio@fffff600 {
                                        gpio-controller;
                                        interrupt-controller;
                                        #interrupt-cells = <2>;
+                                       clocks = <&pioB_clk>;
                                };
 
                                pioC: gpio@fffff800 {
                                        gpio-controller;
                                        interrupt-controller;
                                        #interrupt-cells = <2>;
+                                       clocks = <&pioC_clk>;
                                };
                        };
 
                                interrupts = <1 IRQ_TYPE_LEVEL_HIGH 7>;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_dbgu>;
+                               clocks = <&mck>;
+                               clock-names = "usart";
                                status = "disabled";
                        };
 
                                atmel,use-dma-tx;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_usart0>;
+                               clocks = <&usart0_clk>;
+                               clock-names = "usart";
                                status = "disabled";
                        };
 
                                atmel,use-dma-tx;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_usart1>;
+                               clocks = <&usart1_clk>;
+                               clock-names = "usart";
                                status = "disabled";
                        };
 
                                atmel,use-dma-tx;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_usart2>;
+                               clocks = <&usart2_clk>;
+                               clock-names = "usart";
                                status = "disabled";
                        };
 
                                atmel,use-dma-tx;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_usart3>;
+                               clocks = <&usart3_clk>;
+                               clock-names = "usart";
                                status = "disabled";
                        };
 
                                atmel,use-dma-tx;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_uart0>;
+                               clocks = <&uart0_clk>;
+                               clock-names = "usart";
                                status = "disabled";
                        };
 
                                atmel,use-dma-tx;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_uart1>;
+                               clocks = <&uart1_clk>;
+                               clock-names = "usart";
                                status = "disabled";
                        };
 
                                interrupts = <21 IRQ_TYPE_LEVEL_HIGH 3>;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_macb_rmii>;
+                               clocks = <&macb0_clk>, <&macb0_clk>;
+                               clock-names = "hclk", "pclk";
                                status = "disabled";
                        };
 
                                compatible = "atmel,at91rm9200-udc";
                                reg = <0xfffa4000 0x4000>;
                                interrupts = <10 IRQ_TYPE_LEVEL_HIGH 2>;
+                               clocks = <&udc_clk>, <&udpck>;
+                               clock-names = "pclk", "hclk";
                                status = "disabled";
                        };
 
                                interrupts = <11 IRQ_TYPE_LEVEL_HIGH 6>;
                                #address-cells = <1>;
                                #size-cells = <0>;
+                               clocks = <&twi0_clk>;
                                status = "disabled";
                        };
 
                                #address-cells = <1>;
                                #size-cells = <0>;
                                pinctrl-names = "default";
+                               clocks = <&mci0_clk>;
+                               clock-names = "mci_clk";
                                status = "disabled";
                        };
 
                                interrupts = <14 IRQ_TYPE_LEVEL_HIGH 5>;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_ssc0_tx &pinctrl_ssc0_rx>;
+                               clocks = <&ssc0_clk>;
+                               clock-names = "pclk";
                                status = "disabled";
                        };
 
                                interrupts = <12 IRQ_TYPE_LEVEL_HIGH 3>;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_spi0>;
+                               clocks = <&spi0_clk>;
+                               clock-names = "spi_clk";
                                status = "disabled";
                        };
 
                                interrupts = <13 IRQ_TYPE_LEVEL_HIGH 3>;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_spi1>;
+                               clocks = <&spi1_clk>;
+                               clock-names = "spi_clk";
                                status = "disabled";
                        };
 
                                compatible = "atmel,at91sam9260-adc";
                                reg = <0xfffe0000 0x100>;
                                interrupts = <5 IRQ_TYPE_LEVEL_HIGH 0>;
+                               clocks = <&adc_clk>, <&adc_op_clk>;
+                               clock-names = "adc_clk", "adc_op_clk";
                                atmel,adc-use-external-triggers;
                                atmel,adc-channels-used = <0xf>;
                                atmel,adc-vref = <3300>;
                        compatible = "atmel,at91rm9200-ohci", "usb-ohci";
                        reg = <0x00500000 0x100000>;
                        interrupts = <20 IRQ_TYPE_LEVEL_HIGH 2>;
+                       clocks = <&usb>, <&ohci_clk>, <&ohci_clk>, <&uhpck>;
+                       clock-names = "usb_clk", "ohci_clk", "hclk", "uhpck";
                        status = "disabled";
                };
        };
index 04927db1d6bf1f8ba8053b9365bdb6404297c101..a81aab4281a7f57afab0e8858b98bcd1abf766ac 100644 (file)
                reg = <0x20000000 0x08000000>;
        };
 
-       main_xtal: main_xtal {
-               compatible = "fixed-clock";
-               #clock-cells = <0>;
-               clock-frequency = <0>;
-       };
+       clocks {
+               main_xtal: main_xtal {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <0>;
+               };
 
-       slow_xtal: slow_xtal {
-               compatible = "fixed-clock";
-               #clock-cells = <0>;
-               clock-frequency = <0>;
+               slow_xtal: slow_xtal {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <0>;
+               };
        };
 
        ahb {
index aa35a7aec9a87017446f6653b01178267209250a..f4a765729c7aad3e36a82feb7229fa77e2461781 100644 (file)
                reg = <0x20000000 0x4000000>;
        };
 
-       slow_xtal {
-               clock-frequency = <32768>;
-       };
-
-       main_xtal {
-               clock-frequency = <18432000>;
-       };
-
        clocks {
                #address-cells = <1>;
                #size-cells = <1>;
                        compatible = "atmel,osc", "fixed-clock";
                        clock-frequency = <18432000>;
                };
+
+               slow_xtal {
+                       clock-frequency = <32768>;
+               };
+
+               main_xtal {
+                       clock-frequency = <18432000>;
+               };
        };
 
        ahb {
index fece8665fb63ad89232a821c4da307475bbc4f88..bb23c2d33cf8edacd928da1e2650027886d60d6e 100644 (file)
@@ -10,6 +10,7 @@
 #include <dt-bindings/pinctrl/at91.h>
 #include <dt-bindings/interrupt-controller/irq.h>
 #include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/clock/at91.h>
 
 / {
        model = "Atmel AT91SAM9263 family SoC";
@@ -32,6 +33,7 @@
                ssc1 = &ssc1;
                pwm0 = &pwm0;
        };
+
        cpus {
                #address-cells = <0>;
                #size-cells = <0>;
                reg = <0x20000000 0x08000000>;
        };
 
+       clocks {
+               main_xtal: main_xtal {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <0>;
+               };
+
+               slow_xtal: slow_xtal {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <0>;
+               };
+       };
+
        ahb {
                compatible = "simple-bus";
                #address-cells = <1>;
                        pmc: pmc@fffffc00 {
                                compatible = "atmel,at91rm9200-pmc";
                                reg = <0xfffffc00 0x100>;
+                               interrupts = <1 IRQ_TYPE_LEVEL_HIGH 7>;
+                               interrupt-controller;
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               #interrupt-cells = <1>;
+
+                               main_osc: main_osc {
+                                       compatible = "atmel,at91rm9200-clk-main-osc";
+                                       #clock-cells = <0>;
+                                       interrupts-extended = <&pmc AT91_PMC_MOSCS>;
+                                       clocks = <&main_xtal>;
+                               };
+
+                               main: mainck {
+                                       compatible = "atmel,at91rm9200-clk-main";
+                                       #clock-cells = <0>;
+                                       clocks = <&main_osc>;
+                               };
+
+                               plla: pllack {
+                                       compatible = "atmel,at91rm9200-clk-pll";
+                                       #clock-cells = <0>;
+                                       interrupts-extended = <&pmc AT91_PMC_LOCKA>;
+                                       clocks = <&main>;
+                                       reg = <0>;
+                                       atmel,clk-input-range = <1000000 32000000>;
+                                       #atmel,pll-clk-output-range-cells = <4>;
+                                       atmel,pll-clk-output-ranges = <80000000 200000000 0 1>,
+                                                               <190000000 240000000 2 1>;
+                               };
+
+                               pllb: pllbck {
+                                       compatible = "atmel,at91rm9200-clk-pll";
+                                       #clock-cells = <0>;
+                                       interrupts-extended = <&pmc AT91_PMC_LOCKB>;
+                                       clocks = <&main>;
+                                       reg = <1>;
+                                       atmel,clk-input-range = <1000000 5000000>;
+                                       #atmel,pll-clk-output-range-cells = <4>;
+                                       atmel,pll-clk-output-ranges = <70000000 130000000 1 1>;
+                               };
+
+                               mck: masterck {
+                                       compatible = "atmel,at91rm9200-clk-master";
+                                       #clock-cells = <0>;
+                                       interrupts-extended = <&pmc AT91_PMC_MCKRDY>;
+                                       clocks = <&slow_xtal>, <&main>, <&plla>, <&pllb>;
+                                       atmel,clk-output-range = <0 120000000>;
+                                       atmel,clk-divisors = <1 2 4 0>;
+                               };
+
+                               usb: usbck {
+                                       compatible = "atmel,at91rm9200-clk-usb";
+                                       #clock-cells = <0>;
+                                       atmel,clk-divisors = <1 2 4 0>;
+                                       clocks = <&pllb>;
+                               };
+
+                               prog: progck {
+                                       compatible = "atmel,at91rm9200-clk-programmable";
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                                       interrupt-parent = <&pmc>;
+                                       clocks = <&slow_xtal>, <&main>, <&plla>, <&pllb>;
+
+                                       prog0: prog0 {
+                                               #clock-cells = <0>;
+                                               reg = <0>;
+                                               interrupts = <AT91_PMC_PCKRDY(0)>;
+                                       };
+
+                                       prog1: prog1 {
+                                               #clock-cells = <0>;
+                                               reg = <1>;
+                                               interrupts = <AT91_PMC_PCKRDY(1)>;
+                                       };
+
+                                       prog2: prog2 {
+                                               #clock-cells = <0>;
+                                               reg = <2>;
+                                               interrupts = <AT91_PMC_PCKRDY(2)>;
+                                       };
+
+                                       prog3: prog3 {
+                                               #clock-cells = <0>;
+                                               reg = <3>;
+                                               interrupts = <AT91_PMC_PCKRDY(3)>;
+                                       };
+                               };
+
+                               systemck {
+                                       compatible = "atmel,at91rm9200-clk-system";
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+
+                                       uhpck: uhpck {
+                                               #clock-cells = <0>;
+                                               reg = <6>;
+                                               clocks = <&usb>;
+                                       };
+
+                                       udpck: udpck {
+                                               #clock-cells = <0>;
+                                               reg = <7>;
+                                               clocks = <&usb>;
+                                       };
+
+                                       pck0: pck0 {
+                                               #clock-cells = <0>;
+                                               reg = <8>;
+                                               clocks = <&prog0>;
+                                       };
+
+                                       pck1: pck1 {
+                                               #clock-cells = <0>;
+                                               reg = <9>;
+                                               clocks = <&prog1>;
+                                       };
+
+                                       pck2: pck2 {
+                                               #clock-cells = <0>;
+                                               reg = <10>;
+                                               clocks = <&prog2>;
+                                       };
+
+                                       pck3: pck3 {
+                                               #clock-cells = <0>;
+                                               reg = <11>;
+                                               clocks = <&prog3>;
+                                       };
+                               };
+
+                               periphck {
+                                       compatible = "atmel,at91rm9200-clk-peripheral";
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                                       clocks = <&mck>;
+
+                                       pioA_clk: pioA_clk {
+                                               #clock-cells = <0>;
+                                               reg = <2>;
+                                       };
+
+                                       pioB_clk: pioB_clk {
+                                               #clock-cells = <0>;
+                                               reg = <3>;
+                                       };
+
+                                       pioCDE_clk: pioCDE_clk {
+                                               #clock-cells = <0>;
+                                               reg = <4>;
+                                       };
+
+                                       usart0_clk: usart0_clk {
+                                               #clock-cells = <0>;
+                                               reg = <7>;
+                                       };
+
+                                       usart1_clk: usart1_clk {
+                                               #clock-cells = <0>;
+                                               reg = <8>;
+                                       };
+
+                                       usart2_clk: usart2_clk {
+                                               #clock-cells = <0>;
+                                               reg = <9>;
+                                       };
+
+                                       mci0_clk: mci0_clk {
+                                               #clock-cells = <0>;
+                                               reg = <10>;
+                                       };
+
+                                       mci1_clk: mci1_clk {
+                                               #clock-cells = <0>;
+                                               reg = <11>;
+                                       };
+
+                                       can_clk: can_clk {
+                                               #clock-cells = <0>;
+                                               reg = <12>;
+                                       };
+
+                                       twi0_clk: twi0_clk {
+                                               #clock-cells = <0>;
+                                               reg = <13>;
+                                       };
+
+                                       spi0_clk: spi0_clk {
+                                               #clock-cells = <0>;
+                                               reg = <14>;
+                                       };
+
+                                       spi1_clk: spi1_clk {
+                                               #clock-cells = <0>;
+                                               reg = <15>;
+                                       };
+
+                                       ssc0_clk: ssc0_clk {
+                                               #clock-cells = <0>;
+                                               reg = <16>;
+                                       };
+
+                                       ssc1_clk: ssc1_clk {
+                                               #clock-cells = <0>;
+                                               reg = <17>;
+                                       };
+
+                                       ac91_clk: ac97_clk {
+                                               #clock-cells = <0>;
+                                               reg = <18>;
+                                       };
+
+                                       tcb_clk: tcb_clk {
+                                               #clock-cells = <0>;
+                                               reg = <19>;
+                                       };
+
+                                       pwm_clk: pwm_clk {
+                                               #clock-cells = <0>;
+                                               reg = <20>;
+                                       };
+
+                                       macb0_clk: macb0_clk {
+                                               #clock-cells = <0>;
+                                               reg = <21>;
+                                       };
+
+                                       g2de_clk: g2de_clk {
+                                               #clock-cells = <0>;
+                                               reg = <23>;
+                                       };
+
+                                       udc_clk: udc_clk {
+                                               #clock-cells = <0>;
+                                               reg = <24>;
+                                       };
+
+                                       isi_clk: isi_clk {
+                                               #clock-cells = <0>;
+                                               reg = <25>;
+                                       };
+
+                                       lcd_clk: lcd_clk {
+                                               #clock-cells = <0>;
+                                               reg = <26>;
+                                       };
+
+                                       dma_clk: dma_clk {
+                                               #clock-cells = <0>;
+                                               reg = <27>;
+                                       };
+
+                                       ohci_clk: ohci_clk {
+                                               #clock-cells = <0>;
+                                               reg = <29>;
+                                       };
+                               };
                        };
 
                        ramc: ramc@ffffe200 {
                                compatible = "atmel,at91sam9260-pit";
                                reg = <0xfffffd30 0xf>;
                                interrupts = <1 IRQ_TYPE_LEVEL_HIGH 7>;
+                               clocks = <&mck>;
                        };
 
                        tcb0: timer@fff7c000 {
                                compatible = "atmel,at91rm9200-tcb";
                                reg = <0xfff7c000 0x100>;
                                interrupts = <19 IRQ_TYPE_LEVEL_HIGH 0>;
+                               clocks = <&tcb_clk>;
+                               clock-names = "t0_clk";
                        };
 
                        rstc@fffffd00 {
                                        gpio-controller;
                                        interrupt-controller;
                                        #interrupt-cells = <2>;
+                                       clocks = <&pioA_clk>;
                                };
 
                                pioB: gpio@fffff400 {
                                        gpio-controller;
                                        interrupt-controller;
                                        #interrupt-cells = <2>;
+                                       clocks = <&pioB_clk>;
                                };
 
                                pioC: gpio@fffff600 {
                                        gpio-controller;
                                        interrupt-controller;
                                        #interrupt-cells = <2>;
+                                       clocks = <&pioCDE_clk>;
                                };
 
                                pioD: gpio@fffff800 {
                                        gpio-controller;
                                        interrupt-controller;
                                        #interrupt-cells = <2>;
+                                       clocks = <&pioCDE_clk>;
                                };
 
                                pioE: gpio@fffffa00 {
                                        gpio-controller;
                                        interrupt-controller;
                                        #interrupt-cells = <2>;
+                                       clocks = <&pioCDE_clk>;
                                };
                        };
 
                                interrupts = <1 IRQ_TYPE_LEVEL_HIGH 7>;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_dbgu>;
+                               clocks = <&mck>;
+                               clock-names = "usart";
                                status = "disabled";
                        };
 
                                atmel,use-dma-tx;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_usart0>;
+                               clocks = <&usart0_clk>;
+                               clock-names = "usart";
                                status = "disabled";
                        };
 
                                atmel,use-dma-tx;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_usart1>;
+                               clocks = <&usart1_clk>;
+                               clock-names = "usart";
                                status = "disabled";
                        };
 
                                atmel,use-dma-tx;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_usart2>;
+                               clocks = <&usart2_clk>;
+                               clock-names = "usart";
                                status = "disabled";
                        };
 
                                interrupts = <16 IRQ_TYPE_LEVEL_HIGH 5>;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_ssc0_tx &pinctrl_ssc0_rx>;
+                               clocks = <&ssc0_clk>;
+                               clock-names = "pclk";
                                status = "disabled";
                        };
 
                                interrupts = <17 IRQ_TYPE_LEVEL_HIGH 5>;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_ssc1_tx &pinctrl_ssc1_rx>;
+                               clocks = <&ssc1_clk>;
+                               clock-names = "pclk";
                                status = "disabled";
                        };
 
                                interrupts = <21 IRQ_TYPE_LEVEL_HIGH 3>;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_macb_rmii>;
+                               clocks = <&macb0_clk>, <&macb0_clk>;
+                               clock-names = "hclk", "pclk";
                                status = "disabled";
                        };
 
                                compatible = "atmel,at91rm9200-udc";
                                reg = <0xfff78000 0x4000>;
                                interrupts = <24 IRQ_TYPE_LEVEL_HIGH 2>;
+                               clocks = <&udc_clk>, <&udpck>;
+                               clock-names = "pclk", "hclk";
                                status = "disabled";
                        };
 
                                interrupts = <13 IRQ_TYPE_LEVEL_HIGH 6>;
                                #address-cells = <1>;
                                #size-cells = <0>;
+                               clocks = <&twi0_clk>;
                                status = "disabled";
                        };
 
                                interrupts = <10 IRQ_TYPE_LEVEL_HIGH 0>;
                                #address-cells = <1>;
                                #size-cells = <0>;
+                               clocks = <&mci0_clk>;
+                               clock-names = "mci_clk";
                                status = "disabled";
                        };
 
                                interrupts = <11 IRQ_TYPE_LEVEL_HIGH 0>;
                                #address-cells = <1>;
                                #size-cells = <0>;
+                               clocks = <&mci1_clk>;
+                               clock-names = "mci_clk";
                                status = "disabled";
                        };
 
                                interrupts = <14 IRQ_TYPE_LEVEL_HIGH 3>;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_spi0>;
+                               clocks = <&spi0_clk>;
+                               clock-names = "spi_clk";
                                status = "disabled";
                        };
 
                                interrupts = <15 IRQ_TYPE_LEVEL_HIGH 3>;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_spi1>;
+                               clocks = <&spi1_clk>;
+                               clock-names = "spi_clk";
                                status = "disabled";
                        };
 
                                reg = <0xfffb8000 0x300>;
                                interrupts = <20 IRQ_TYPE_LEVEL_HIGH 4>;
                                #pwm-cells = <3>;
+                               clocks = <&pwm_clk>;
+                               clock-names = "pwm_clk";
                                status = "disabled";
                        };
                };
                        compatible = "atmel,at91rm9200-ohci", "usb-ohci";
                        reg = <0x00a00000 0x100000>;
                        interrupts = <29 IRQ_TYPE_LEVEL_HIGH 2>;
+                       clocks = <&usb>, <&ohci_clk>, <&ohci_clk>, <&uhpck>;
+                       clock-names = "usb_clk", "ohci_clk", "hclk", "uhpck";
                        status = "disabled";
                };
        };
index 15009c9f229328957221a7b536de9ce3c0e8e630..5cf93eecd8f1a7623b5ccefca6ed5a5fd940a5b2 100644 (file)
                        compatible = "atmel,osc", "fixed-clock";
                        clock-frequency = <16367660>;
                };
+
+               slow_xtal {
+                       clock-frequency = <32768>;
+               };
+
+               main_xtal {
+                       clock-frequency = <16367660>;
+               };
        };
 
        ahb {
index b8e79466014f05df2e90222f2074e9f41e3dde9e..31f7652612fc8f2f1e284b74eb6f9bef7e8e7986 100644 (file)
                        adc0: adc@fffe0000 {
                                atmel,adc-startup-time = <40>;
                        };
+
+                       pmc: pmc@fffffc00 {
+                               plla: pllack {
+                                       atmel,clk-input-range = <2000000 32000000>;
+                                       atmel,pll-clk-output-ranges = <745000000 800000000 0 0>,
+                                                               <695000000 750000000 1 0>,
+                                                               <645000000 700000000 2 0>,
+                                                               <595000000 650000000 3 0>,
+                                                               <545000000 600000000 0 1>,
+                                                               <495000000 550000000 1 1>,
+                                                               <445000000 500000000 2 1>,
+                                                               <400000000 450000000 3 1>;
+                               };
+
+                               pllb: pllbck {
+                                       atmel,clk-input-range = <2000000 32000000>;
+                                       atmel,pll-clk-output-ranges = <30000000 100000000 0 0>;
+                               };
+
+                               mck: masterck {
+                                       atmel,clk-output-range = <0 133000000>;
+                                       atmel,clk-divisors = <1 2 4 6>;
+                               };
+                       };
                };
        };
 };
index cb2c010e08e21fd5bd5b871aa3d3e496ffc0005e..d2919108e92d656dea8e7b4e353221a822fdb70b 100644 (file)
                        compatible = "atmel,osc", "fixed-clock";
                        clock-frequency = <18432000>;
                };
+
+               slow_xtal {
+                       clock-frequency = <32768>;
+               };
+
+               main_xtal {
+                       clock-frequency = <18432000>;
+               };
        };
 
        ahb {
index ace6bf197b708dd79e29054773d50c5f1a3fd864..932a669156af81674a4d2ffc12f3b6e729d4b731 100644 (file)
@@ -14,6 +14,7 @@
 #include <dt-bindings/pinctrl/at91.h>
 #include <dt-bindings/interrupt-controller/irq.h>
 #include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/clock/at91.h>
 
 / {
        model = "Atmel AT91SAM9G45 family SoC";
                reg = <0x70000000 0x10000000>;
        };
 
+       clocks {
+               slow_xtal: slow_xtal {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <0>;
+               };
+
+               main_xtal: main_xtal {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <0>;
+               };
+
+               adc_op_clk: adc_op_clk{
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <300000>;
+               };
+       };
+
        ahb {
                compatible = "simple-bus";
                #address-cells = <1>;
                                compatible = "atmel,at91sam9g45-ddramc";
                                reg = <0xffffe400 0x200
                                       0xffffe600 0x200>;
+                               clocks = <&ddrck>;
+                               clock-names = "ddrck";
                        };
 
                        pmc: pmc@fffffc00 {
-                               compatible = "atmel,at91rm9200-pmc";
+                               compatible = "atmel,at91sam9g45-pmc";
                                reg = <0xfffffc00 0x100>;
+                               interrupts = <1 IRQ_TYPE_LEVEL_HIGH 7>;
+                               interrupt-controller;
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               #interrupt-cells = <1>;
+
+                               main_osc: main_osc {
+                                       compatible = "atmel,at91rm9200-clk-main-osc";
+                                       #clock-cells = <0>;
+                                       interrupts-extended = <&pmc AT91_PMC_MOSCS>;
+                                       clocks = <&main_xtal>;
+                               };
+
+                               main: mainck {
+                                       compatible = "atmel,at91rm9200-clk-main";
+                                       #clock-cells = <0>;
+                                       clocks = <&main_osc>;
+                               };
+
+                               plla: pllack {
+                                       compatible = "atmel,at91rm9200-clk-pll";
+                                       #clock-cells = <0>;
+                                       interrupts-extended = <&pmc AT91_PMC_LOCKA>;
+                                       clocks = <&main>;
+                                       reg = <0>;
+                                       atmel,clk-input-range = <2000000 32000000>;
+                                       #atmel,pll-clk-output-range-cells = <4>;
+                                       atmel,pll-clk-output-ranges = <745000000 800000000 0 0
+                                                                      695000000 750000000 1 0
+                                                                      645000000 700000000 2 0
+                                                                      595000000 650000000 3 0
+                                                                      545000000 600000000 0 1
+                                                                      495000000 555000000 1 1
+                                                                      445000000 500000000 2 1
+                                                                      400000000 450000000 3 1>;
+                               };
+
+                               plladiv: plladivck {
+                                       compatible = "atmel,at91sam9x5-clk-plldiv";
+                                       #clock-cells = <0>;
+                                       clocks = <&plla>;
+                               };
+
+                               utmi: utmick {
+                                       compatible = "atmel,at91sam9x5-clk-utmi";
+                                       #clock-cells = <0>;
+                                       interrupts-extended = <&pmc AT91_PMC_LOCKU>;
+                                       clocks = <&main>;
+                               };
+
+                               mck: masterck {
+                                       compatible = "atmel,at91rm9200-clk-master";
+                                       #clock-cells = <0>;
+                                       interrupts-extended = <&pmc AT91_PMC_MCKRDY>;
+                                       clocks = <&slow_xtal>, <&main>, <&plladiv>, <&utmi>;
+                                       atmel,clk-output-range = <0 133333333>;
+                                       atmel,clk-divisors = <1 2 4 3>;
+                               };
+
+                               usb: usbck {
+                                       compatible = "atmel,at91sam9x5-clk-usb";
+                                       #clock-cells = <0>;
+                                       clocks = <&plladiv>, <&utmi>;
+                               };
+
+                               prog: progck {
+                                       compatible = "atmel,at91sam9g45-clk-programmable";
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                                       interrupt-parent = <&pmc>;
+                                       clocks = <&slow_xtal>, <&main>, <&plladiv>, <&utmi>, <&mck>;
+
+                                       prog0: prog0 {
+                                               #clock-cells = <0>;
+                                               reg = <0>;
+                                               interrupts = <AT91_PMC_PCKRDY(0)>;
+                                       };
+
+                                       prog1: prog1 {
+                                               #clock-cells = <0>;
+                                               reg = <1>;
+                                               interrupts = <AT91_PMC_PCKRDY(1)>;
+                                       };
+                               };
+
+                               systemck {
+                                       compatible = "atmel,at91rm9200-clk-system";
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+
+                                       ddrck: ddrck {
+                                               #clock-cells = <0>;
+                                               reg = <2>;
+                                               clocks = <&mck>;
+                                       };
+
+                                       uhpck: uhpck {
+                                               #clock-cells = <0>;
+                                               reg = <6>;
+                                               clocks = <&usb>;
+                                       };
+
+                                       pck0: pck0 {
+                                               #clock-cells = <0>;
+                                               reg = <8>;
+                                               clocks = <&prog0>;
+                                       };
+
+                                       pck1: pck1 {
+                                               #clock-cells = <0>;
+                                               reg = <9>;
+                                               clocks = <&prog1>;
+                                       };
+                               };
+
+                               periphck {
+                                       compatible = "atmel,at91rm9200-clk-peripheral";
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                                       clocks = <&mck>;
+
+                                       pioA_clk: pioA_clk {
+                                               #clock-cells = <0>;
+                                               reg = <2>;
+                                       };
+
+                                       pioB_clk: pioB_clk {
+                                               #clock-cells = <0>;
+                                               reg = <3>;
+                                       };
+
+                                       pioC_clk: pioC_clk {
+                                               #clock-cells = <0>;
+                                               reg = <4>;
+                                       };
+
+                                       pioDE_clk: pioDE_clk {
+                                               #clock-cells = <0>;
+                                               reg = <5>;
+                                       };
+
+                                       trng_clk: trng_clk {
+                                               #clock-cells = <0>;
+                                               reg = <6>;
+                                       };
+
+                                       usart0_clk: usart0_clk {
+                                               #clock-cells = <0>;
+                                               reg = <7>;
+                                       };
+
+                                       usart1_clk: usart1_clk {
+                                               #clock-cells = <0>;
+                                               reg = <8>;
+                                       };
+
+                                       usart2_clk: usart2_clk {
+                                               #clock-cells = <0>;
+                                               reg = <9>;
+                                       };
+
+                                       usart3_clk: usart3_clk {
+                                               #clock-cells = <0>;
+                                               reg = <10>;
+                                       };
+
+                                       mci0_clk: mci0_clk {
+                                               #clock-cells = <0>;
+                                               reg = <11>;
+                                       };
+
+                                       twi0_clk: twi0_clk {
+                                               #clock-cells = <0>;
+                                               reg = <12>;
+                                       };
+
+                                       twi1_clk: twi1_clk {
+                                               #clock-cells = <0>;
+                                               reg = <13>;
+                                       };
+
+                                       spi0_clk: spi0_clk {
+                                               #clock-cells = <0>;
+                                               reg = <14>;
+                                       };
+
+                                       spi1_clk: spi1_clk {
+                                               #clock-cells = <0>;
+                                               reg = <15>;
+                                       };
+
+                                       ssc0_clk: ssc0_clk {
+                                               #clock-cells = <0>;
+                                               reg = <16>;
+                                       };
+
+                                       ssc1_clk: ssc1_clk {
+                                               #clock-cells = <0>;
+                                               reg = <17>;
+                                       };
+
+                                       tcb0_clk: tcb0_clk {
+                                               #clock-cells = <0>;
+                                               reg = <18>;
+                                       };
+
+                                       pwm_clk: pwm_clk {
+                                               #clock-cells = <0>;
+                                               reg = <19>;
+                                       };
+
+                                       adc_clk: adc_clk {
+                                               #clock-cells = <0>;
+                                               reg = <20>;
+                                       };
+
+                                       dma0_clk: dma0_clk {
+                                               #clock-cells = <0>;
+                                               reg = <21>;
+                                       };
+
+                                       uhphs_clk: uhphs_clk {
+                                               #clock-cells = <0>;
+                                               reg = <22>;
+                                       };
+
+                                       lcd_clk: lcd_clk {
+                                               #clock-cells = <0>;
+                                               reg = <23>;
+                                       };
+
+                                       ac97_clk: ac97_clk {
+                                               #clock-cells = <0>;
+                                               reg = <24>;
+                                       };
+
+                                       macb0_clk: macb0_clk {
+                                               #clock-cells = <0>;
+                                               reg = <25>;
+                                       };
+
+                                       isi_clk: isi_clk {
+                                               #clock-cells = <0>;
+                                               reg = <26>;
+                                       };
+
+                                       udphs_clk: udphs_clk {
+                                               #clock-cells = <0>;
+                                               reg = <27>;
+                                       };
+
+                                       aestdessha_clk: aestdessha_clk {
+                                               #clock-cells = <0>;
+                                               reg = <28>;
+                                       };
+
+                                       mci1_clk: mci1_clk {
+                                               #clock-cells = <0>;
+                                               reg = <29>;
+                                       };
+
+                                       vdec_clk: vdec_clk {
+                                               #clock-cells = <0>;
+                                               reg = <30>;
+                                       };
+                               };
                        };
 
                        rstc@fffffd00 {
                                compatible = "atmel,at91sam9260-pit";
                                reg = <0xfffffd30 0xf>;
                                interrupts = <1 IRQ_TYPE_LEVEL_HIGH 7>;
+                               clocks = <&mck>;
                        };
 
 
                                compatible = "atmel,at91rm9200-tcb";
                                reg = <0xfff7c000 0x100>;
                                interrupts = <18 IRQ_TYPE_LEVEL_HIGH 0>;
+                               clocks = <&tcb0_clk>, <&tcb0_clk>, <&tcb0_clk>;
+                               clock-names = "t0_clk", "t1_clk", "t2_clk";
                        };
 
                        tcb1: timer@fffd4000 {
                                compatible = "atmel,at91rm9200-tcb";
                                reg = <0xfffd4000 0x100>;
                                interrupts = <18 IRQ_TYPE_LEVEL_HIGH 0>;
+                               clocks = <&tcb0_clk>, <&tcb0_clk>, <&tcb0_clk>;
+                               clock-names = "t0_clk", "t1_clk", "t2_clk";
                        };
 
                        dma: dma-controller@ffffec00 {
                                reg = <0xffffec00 0x200>;
                                interrupts = <21 IRQ_TYPE_LEVEL_HIGH 0>;
                                #dma-cells = <2>;
+                               clocks = <&dma0_clk>;
+                               clock-names = "dma_clk";
                        };
 
                        pinctrl@fffff200 {
                                        gpio-controller;
                                        interrupt-controller;
                                        #interrupt-cells = <2>;
+                                       clocks = <&pioA_clk>;
                                };
 
                                pioB: gpio@fffff400 {
                                        gpio-controller;
                                        interrupt-controller;
                                        #interrupt-cells = <2>;
+                                       clocks = <&pioB_clk>;
                                };
 
                                pioC: gpio@fffff600 {
                                        gpio-controller;
                                        interrupt-controller;
                                        #interrupt-cells = <2>;
+                                       clocks = <&pioC_clk>;
                                };
 
                                pioD: gpio@fffff800 {
                                        gpio-controller;
                                        interrupt-controller;
                                        #interrupt-cells = <2>;
+                                       clocks = <&pioDE_clk>;
                                };
 
                                pioE: gpio@fffffa00 {
                                        gpio-controller;
                                        interrupt-controller;
                                        #interrupt-cells = <2>;
+                                       clocks = <&pioDE_clk>;
                                };
                        };
 
                                interrupts = <1 IRQ_TYPE_LEVEL_HIGH 7>;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_dbgu>;
+                               clocks = <&mck>;
+                               clock-names = "usart";
                                status = "disabled";
                        };
 
                                atmel,use-dma-tx;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_usart0>;
+                               clocks = <&usart0_clk>;
+                               clock-names = "usart";
                                status = "disabled";
                        };
 
                                atmel,use-dma-tx;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_usart1>;
+                               clocks = <&usart1_clk>;
+                               clock-names = "usart";
                                status = "disabled";
                        };
 
                                atmel,use-dma-tx;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_usart2>;
+                               clocks = <&usart2_clk>;
+                               clock-names = "usart";
                                status = "disabled";
                        };
 
                                atmel,use-dma-tx;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_usart3>;
+                               clocks = <&usart3_clk>;
+                               clock-names = "usart";
                                status = "disabled";
                        };
 
                                interrupts = <25 IRQ_TYPE_LEVEL_HIGH 3>;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_macb_rmii>;
+                               clocks = <&macb0_clk>, <&macb0_clk>;
+                               clock-names = "hclk", "pclk";
                                status = "disabled";
                        };
 
                                pinctrl-0 = <&pinctrl_i2c0>;
                                #address-cells = <1>;
                                #size-cells = <0>;
+                               clocks = <&twi0_clk>;
                                status = "disabled";
                        };
 
                                pinctrl-0 = <&pinctrl_i2c1>;
                                #address-cells = <1>;
                                #size-cells = <0>;
+                               clocks = <&twi1_clk>;
                                status = "disabled";
                        };
 
                                interrupts = <16 IRQ_TYPE_LEVEL_HIGH 5>;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_ssc0_tx &pinctrl_ssc0_rx>;
+                               clocks = <&ssc0_clk>;
+                               clock-names = "pclk";
                                status = "disabled";
                        };
 
                                interrupts = <17 IRQ_TYPE_LEVEL_HIGH 5>;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_ssc1_tx &pinctrl_ssc1_rx>;
+                               clocks = <&ssc1_clk>;
+                               clock-names = "pclk";
                                status = "disabled";
                        };
 
                                compatible = "atmel,at91sam9g45-adc";
                                reg = <0xfffb0000 0x100>;
                                interrupts = <20 IRQ_TYPE_LEVEL_HIGH 0>;
+                               clocks = <&adc_clk>, <&adc_op_clk>;
+                               clock-names = "adc_clk", "adc_op_clk";
                                atmel,adc-channels-used = <0xff>;
                                atmel,adc-vref = <3300>;
                                atmel,adc-startup-time = <40>;
                                reg = <0xfffb8000 0x300>;
                                interrupts = <19 IRQ_TYPE_LEVEL_HIGH 4>;
                                #pwm-cells = <3>;
+                               clocks = <&pwm_clk>;
                                status = "disabled";
                        };
 
                                dma-names = "rxtx";
                                #address-cells = <1>;
                                #size-cells = <0>;
+                               clocks = <&mci0_clk>;
+                               clock-names = "mci_clk";
                                status = "disabled";
                        };
 
                                dma-names = "rxtx";
                                #address-cells = <1>;
                                #size-cells = <0>;
+                               clocks = <&mci1_clk>;
+                               clock-names = "mci_clk";
                                status = "disabled";
                        };
 
                                interrupts = <14 4 3>;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_spi0>;
+                               clocks = <&spi0_clk>;
+                               clock-names = "spi_clk";
                                status = "disabled";
                        };
 
                                interrupts = <15 4 3>;
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_spi1>;
+                               clocks = <&spi1_clk>;
+                               clock-names = "spi_clk";
                                status = "disabled";
                        };
 
                                reg = <0x00600000 0x80000
                                       0xfff78000 0x400>;
                                interrupts = <27 IRQ_TYPE_LEVEL_HIGH 0>;
+                               clocks = <&udphs_clk>, <&utmi>;
+                               clock-names = "pclk", "hclk";
                                status = "disabled";
 
                                ep0 {
                        interrupts = <23 IRQ_TYPE_LEVEL_HIGH 3>;
                        pinctrl-names = "default";
                        pinctrl-0 = <&pinctrl_fb>;
+                       clocks = <&lcd_clk>, <&lcd_clk>;
+                       clock-names = "hclk", "lcdc_clk";
                        status = "disabled";
                };
 
                        compatible = "atmel,at91rm9200-ohci", "usb-ohci";
                        reg = <0x00700000 0x100000>;
                        interrupts = <22 IRQ_TYPE_LEVEL_HIGH 2>;
+                       //TODO
+                       clocks = <&usb>, <&uhphs_clk>, <&uhphs_clk>, <&uhpck>;
+                       clock-names = "usb_clk", "ohci_clk", "hclk", "uhpck";
                        status = "disabled";
                };
 
                        compatible = "atmel,at91sam9g45-ehci", "usb-ehci";
                        reg = <0x00800000 0x100000>;
                        interrupts = <22 IRQ_TYPE_LEVEL_HIGH 2>;
+                       //TODO
+                       clocks = <&usb>, <&uhphs_clk>, <&uhphs_clk>, <&uhpck>;
+                       clock-names = "usb_clk", "ehci_clk", "hclk", "uhpck";
                        status = "disabled";
                };
        };
index 9f5b0a6749955755b75ece053be16d6c563be051..96ccc7de4f0a1be42f05168c2fd4d1ffa7616842 100644 (file)
                        compatible = "atmel,osc", "fixed-clock";
                        clock-frequency = <12000000>;
                };
+
+               slow_xtal {
+                     clock-frequency = <32768>;
+               };
+
+               main_xtal {
+                     clock-frequency = <12000000>;
+               };
        };
 
        ahb {
index b84bac5bada400369450033f419e271224b96e19..2bfac310dbece7093c49b1c1ced69b0676d9e320 100644 (file)
                reg = <0x20000000 0x10000000>;
        };
 
-       slow_xtal: slow_xtal {
-               compatible = "fixed-clock";
-               #clock-cells = <0>;
-               clock-frequency = <0>;
-       };
+       clocks {
+               slow_xtal: slow_xtal {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <0>;
+               };
 
-       main_xtal: main_xtal {
-               compatible = "fixed-clock";
-               #clock-cells = <0>;
-               clock-frequency = <0>;
+               main_xtal: main_xtal {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <0>;
+               };
        };
 
        ahb {
index 64bbe46e4f90aeb16d3c0c2d26e116595df0dee2..83d723711ae1c07efd4a663780d5b6baa2cb12f6 100644 (file)
                reg = <0x20000000 0x8000000>;
        };
 
-       slow_xtal {
-               clock-frequency = <32768>;
-       };
-
-       main_xtal {
-               clock-frequency = <16000000>;
-       };
-
        clocks {
                #address-cells = <1>;
                #size-cells = <1>;
                        compatible = "atmel,osc", "fixed-clock";
                        clock-frequency = <16000000>;
                };
+
+               slow_xtal {
+                       clock-frequency = <32768>;
+               };
+
+               main_xtal {
+                       clock-frequency = <16000000>;
+               };
        };
 
        ahb {
@@ -56,6 +56,8 @@
                                wm8904: codec@1a {
                                        compatible = "wm8904";
                                        reg = <0x1a>;
+                                       clocks = <&pck0>;
+                                       clock-names = "mclk";
                                };
 
                                qt1070: keyboard@1b {
index 1da183155eeeedad507d95703aebba3f5668c7ae..ab56c8b81dfa25686524e0405583e6aa90a4210d 100644 (file)
                reg = <0x20000000 0x04000000>;
        };
 
-       slow_xtal: slow_xtal {
-               compatible = "fixed-clock";
-               #clock-cells = <0>;
-               clock-frequency = <0>;
-       };
+       clocks {
+               slow_xtal: slow_xtal {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <0>;
+               };
 
-       main_xtal: main_xtal {
-               compatible = "fixed-clock";
-               #clock-cells = <0>;
-               clock-frequency = <0>;
-       };
+               main_xtal: main_xtal {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <0>;
+               };
 
-       clocks {
                adc_op_clk: adc_op_clk{
                        compatible = "fixed-clock";
                        #clock-cells = <0>;
@@ -95,6 +95,7 @@
                              <0xffffe800 0x200>;
                        atmel,nand-addr-offset = <21>;
                        atmel,nand-cmd-offset = <22>;
+                       atmel,nand-has-dma;
                        pinctrl-names = "default";
                        pinctrl-0 = <&pinctrl_nand>;
                        gpios = <&pioD 17 GPIO_ACTIVE_HIGH>,
                                };
                        };
 
+                       dma0: dma-controller@ffffe600 {
+                               compatible = "atmel,at91sam9rl-dma";
+                               reg = <0xffffe600 0x200>;
+                               interrupts = <21 IRQ_TYPE_LEVEL_HIGH 0>;
+                               #dma-cells = <2>;
+                               clocks = <&dma0_clk>;
+                               clock-names = "dma_clk";
+                       };
+
                        ramc0: ramc@ffffea00 {
                                compatible = "atmel,at91sam9260-sdramc";
                                reg = <0xffffea00 0x200>;
index d4a010e40fe3e2803e9e3e4fdd171ffa35e98cb1..9be5b540eebf5a6d8f70d377931082a649a2605b 100644 (file)
                reg = <0x20000000 0x4000000>;
        };
 
-
-       slow_xtal {
-               clock-frequency = <32768>;
-       };
-
-       main_xtal {
-               clock-frequency = <12000000>;
-       };
-
        clocks {
                #address-cells = <1>;
                #size-cells = <1>;
                        compatible = "atmel,osc", "fixed-clock";
                        clock-frequency = <12000000>;
                };
+
+               slow_xtal {
+                       clock-frequency = <32768>;
+               };
+
+               main_xtal {
+                       clock-frequency = <12000000>;
+               };
        };
 
        ahb {
index 2c0d6ea3ab412325252d4515d8c5b6af3e23425f..e1a5c70b885c87fabfa0569757a71db73dbf36cf 100644 (file)
                reg = <0x20000000 0x10000000>;
        };
 
-       slow_xtal: slow_xtal {
-               compatible = "fixed-clock";
-               #clock-cells = <0>;
-               clock-frequency = <0>;
-       };
+       clocks {
+               slow_xtal: slow_xtal {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <0>;
+               };
 
-       main_xtal: main_xtal {
-               compatible = "fixed-clock";
-               #clock-cells = <0>;
-               clock-frequency = <0>;
-       };
+               main_xtal: main_xtal {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <0>;
+               };
 
-       adc_op_clk: adc_op_clk{
-               compatible = "fixed-clock";
-               #clock-cells = <0>;
-               clock-frequency = <5000000>;
+               adc_op_clk: adc_op_clk{
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <5000000>;
+               };
        };
 
        ahb {
index 8413e21192ebe973f9eeba5647b7f6a91b85ab31..229d6c24a9c408c37d5dcb46b279d457768b173d 100644 (file)
                };
        };
 
-       slow_xtal {
-               clock-frequency = <32768>;
-       };
+       clocks {
+               slow_xtal {
+                       clock-frequency = <32768>;
+               };
 
-       main_xtal {
-               clock-frequency = <12000000>;
+               main_xtal {
+                       clock-frequency = <12000000>;
+               };
        };
 
        ahb {
index 6b05ae6d476f8ebbdba03d8b41e2b3e798dd547e..2ddaa513661150f48e41349c757c893af7fbc8e5 100644 (file)
                bootargs = "console=ttyS0,115200n8";
        };
 
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+               enable-method = "brcm,bcm11351-cpu-method";
+               secondary-boot-reg = <0x3500417c>;
+
+               cpu0: cpu@0 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a9";
+                       reg = <0>;
+               };
+
+               cpu1: cpu@1 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a9";
+                       reg = <1>;
+               };
+       };
+
        gic: interrupt-controller@3ff00100 {
                compatible = "arm,cortex-a9-gic";
                #interrupt-cells = <3>;
index 8b366822bb43bc99656953d80e0a7e671b890671..2016b72a8fb78e47610bc759d614a924d113e606 100644 (file)
                bootargs = "console=ttyS0,115200n8";
        };
 
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+               enable-method = "brcm,bcm11351-cpu-method";
+               secondary-boot-reg = <0x35004178>;
+
+               cpu0: cpu@0 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a9";
+                       reg = <0>;
+               };
+
+               cpu1: cpu@1 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a9";
+                       reg = <1>;
+               };
+       };
+
        gic: interrupt-controller@3ff00100 {
                compatible = "arm,cortex-a9-gic";
                #interrupt-cells = <3>;
diff --git a/arch/arm/boot/dts/bcm7445-bcm97445svmb.dts b/arch/arm/boot/dts/bcm7445-bcm97445svmb.dts
new file mode 100644 (file)
index 0000000..9eec2ac
--- /dev/null
@@ -0,0 +1,14 @@
+/dts-v1/;
+#include "bcm7445.dtsi"
+
+/ {
+       model = "Broadcom STB (bcm7445), SVMB reference board";
+       compatible = "brcm,bcm7445", "brcm,brcmstb";
+
+       memory {
+               device_type = "memory";
+               reg = <0x00 0x00000000 0x00 0x40000000>,
+                     <0x00 0x40000000 0x00 0x40000000>,
+                     <0x00 0x80000000 0x00 0x40000000>;
+       };
+};
diff --git a/arch/arm/boot/dts/bcm7445.dtsi b/arch/arm/boot/dts/bcm7445.dtsi
new file mode 100644 (file)
index 0000000..0ca0f4e
--- /dev/null
@@ -0,0 +1,111 @@
+#include <dt-bindings/interrupt-controller/arm-gic.h>
+
+#include "skeleton.dtsi"
+
+/ {
+       #address-cells = <2>;
+       #size-cells = <2>;
+       model = "Broadcom STB (bcm7445)";
+       compatible = "brcm,bcm7445", "brcm,brcmstb";
+       interrupt-parent = <&gic>;
+
+       chosen {
+               bootargs = "console=ttyS0,115200 earlyprintk";
+       };
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               cpu@0 {
+                       compatible = "brcm,brahma-b15";
+                       device_type = "cpu";
+                       enable-method = "brcm,brahma-b15";
+                       reg = <0>;
+               };
+
+               cpu@1 {
+                       compatible = "brcm,brahma-b15";
+                       device_type = "cpu";
+                       enable-method = "brcm,brahma-b15";
+                       reg = <1>;
+               };
+
+               cpu@2 {
+                       compatible = "brcm,brahma-b15";
+                       device_type = "cpu";
+                       enable-method = "brcm,brahma-b15";
+                       reg = <2>;
+               };
+
+               cpu@3 {
+                       compatible = "brcm,brahma-b15";
+                       device_type = "cpu";
+                       enable-method = "brcm,brahma-b15";
+                       reg = <3>;
+               };
+       };
+
+       gic: interrupt-controller@ffd00000 {
+               compatible = "brcm,brahma-b15-gic", "arm,cortex-a15-gic";
+               reg = <0x00 0xffd01000 0x00 0x1000>,
+                     <0x00 0xffd02000 0x00 0x2000>,
+                     <0x00 0xffd04000 0x00 0x2000>,
+                     <0x00 0xffd06000 0x00 0x2000>;
+               interrupt-controller;
+               #interrupt-cells = <3>;
+       };
+
+       timer {
+               compatible = "arm,armv7-timer";
+               interrupts = <GIC_PPI 13 (GIC_CPU_MASK_RAW(15) | IRQ_TYPE_LEVEL_LOW)>,
+                            <GIC_PPI 14 (GIC_CPU_MASK_RAW(15) | IRQ_TYPE_LEVEL_LOW)>,
+                            <GIC_PPI 11 (GIC_CPU_MASK_RAW(15) | IRQ_TYPE_LEVEL_LOW)>,
+                            <GIC_PPI 10 (GIC_CPU_MASK_RAW(15) | IRQ_TYPE_LEVEL_LOW)>;
+       };
+
+       rdb {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "simple-bus";
+               ranges = <0 0x00 0xf0000000 0x1000000>;
+
+               serial@40ab00 {
+                       compatible = "ns16550a";
+                       reg = <0x40ab00 0x20>;
+                       reg-shift = <2>;
+                       reg-io-width = <4>;
+                       interrupts = <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>;
+                       clock-frequency = <0x4d3f640>;
+               };
+
+               sun_top_ctrl: syscon@404000 {
+                       compatible = "brcm,bcm7445-sun-top-ctrl",
+                                    "syscon";
+                       reg = <0x404000 0x51c>;
+               };
+
+               hif_cpubiuctrl: syscon@3e2400 {
+                       compatible = "brcm,bcm7445-hif-cpubiuctrl",
+                                    "syscon";
+                       reg = <0x3e2400 0x5b4>;
+               };
+
+               hif_continuation: syscon@452000 {
+                       compatible = "brcm,bcm7445-hif-continuation",
+                                    "syscon";
+                       reg = <0x452000 0x100>;
+               };
+       };
+
+       smpboot {
+               compatible = "brcm,brcmstb-smpboot";
+               syscon-cpu = <&hif_cpubiuctrl 0x88 0x178>;
+               syscon-cont = <&hif_continuation>;
+       };
+
+       reboot {
+               compatible = "brcm,brcmstb-reboot";
+               syscon = <&sun_top_ctrl 0x304 0x308>;
+       };
+};
index 2477dac4d643ec7659bb4b9746349c0b6a64cec7..9d7c810ebd0b469a842611020d4ddc5858c288d4 100644 (file)
@@ -22,6 +22,7 @@
        cpus {
                #address-cells = <1>;
                #size-cells = <0>;
+               enable-method = "marvell,berlin-smp";
 
                cpu@0 {
                        compatible = "marvell,pj4b";
                        clocks = <&chip CLKID_TWD>;
                };
 
+               cpu-ctrl@dd0000 {
+                       compatible = "marvell,berlin-cpu-ctrl";
+                       reg = <0xdd0000 0x10000>;
+               };
+
                apb@e80000 {
                        compatible = "simple-bus";
                        #address-cells = <1>;
index 995150f93795adcaee544ef48eaf9c403bc8817d..a357ce02a64e8cc78a1e0ba61457329f27605bd6 100644 (file)
        status = "okay";
 };
 
+&i2c0 {
+       status = "okay";
+};
+
+&i2c2 {
+       status = "okay";
+};
+
 &uart0 {
        status = "okay";
 };
index 635a16a64cb4693aa536a3bce865ec386b77e0db..400c40fceccc7118722ff021e7711a6e9f9564dd 100644 (file)
@@ -18,6 +18,7 @@
        cpus {
                #address-cells = <1>;
                #size-cells = <0>;
+               enable-method = "marvell,berlin-smp";
 
                cpu@0 {
                        compatible = "arm,cortex-a9";
@@ -90,6 +91,8 @@
                        compatible = "arm,pl310-cache";
                        reg = <0xac0000 0x1000>;
                        cache-level = <2>;
+                       arm,data-latency = <2 2 2>;
+                       arm,tag-latency = <2 2 2>;
                };
 
                scu: snoop-control-unit@ad0000 {
                        #interrupt-cells = <3>;
                };
 
+               cpu-ctrl@dd0000 {
+                       compatible = "marvell,berlin-cpu-ctrl";
+                       reg = <0xdd0000 0x10000>;
+               };
+
                apb@e80000 {
                        compatible = "simple-bus";
                        #address-cells = <1>;
                                };
                        };
 
+                       i2c0: i2c@1400 {
+                               compatible = "snps,designware-i2c";
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               reg = <0x1400 0x100>;
+                               interrupt-parent = <&aic>;
+                               interrupts = <4>;
+                               clocks = <&chip CLKID_CFG>;
+                               pinctrl-0 = <&twsi0_pmux>;
+                               pinctrl-names = "default";
+                               status = "disabled";
+                       };
+
+                       i2c1: i2c@1800 {
+                               compatible = "snps,designware-i2c";
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               reg = <0x1800 0x100>;
+                               interrupt-parent = <&aic>;
+                               interrupts = <5>;
+                               clocks = <&chip CLKID_CFG>;
+                               pinctrl-0 = <&twsi1_pmux>;
+                               pinctrl-names = "default";
+                               status = "disabled";
+                       };
+
                        timer0: timer@2c00 {
                                compatible = "snps,dw-apb-timer";
                                reg = <0x2c00 0x14>;
                        reg = <0xea0000 0x400>, <0xdd0170 0x10>;
                        clocks = <&refclk>;
                        clock-names = "refclk";
+
+                       twsi0_pmux: twsi0-pmux {
+                               groups = "G6";
+                               function = "twsi0";
+                       };
+
+                       twsi1_pmux: twsi1-pmux {
+                               groups = "G7";
+                               function = "twsi1";
+                       };
                };
 
                apb@fc0000 {
                        ranges = <0 0xfc0000 0x10000>;
                        interrupt-parent = <&sic>;
 
+                       i2c2: i2c@7000 {
+                               compatible = "snps,designware-i2c";
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               reg = <0x7000 0x100>;
+                               interrupt-parent = <&sic>;
+                               interrupts = <6>;
+                               clocks = <&refclk>;
+                               pinctrl-0 = <&twsi2_pmux>;
+                               pinctrl-names = "default";
+                               status = "disabled";
+                       };
+
+                       i2c3: i2c@8000 {
+                               compatible = "snps,designware-i2c";
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               reg = <0x8000 0x100>;
+                               interrupt-parent = <&sic>;
+                               interrupts = <7>;
+                               clocks = <&refclk>;
+                               pinctrl-0 = <&twsi3_pmux>;
+                               pinctrl-names = "default";
+                               status = "disabled";
+                       };
+
                        uart0: uart@9000 {
                                compatible = "snps,dw-apb-uart";
                                reg = <0x9000 0x100>;
                                        groups = "GSM14";
                                        function = "uart1";
                                };
+
+                               twsi2_pmux: twsi2-pmux {
+                                       groups = "GSM13";
+                                       function = "twsi2";
+                               };
+
+                               twsi3_pmux: twsi3-pmux {
+                                       groups = "GSM14";
+                                       function = "twsi3";
+                               };
                        };
 
                        sic: interrupt-controller@e000 {
diff --git a/arch/arm/boot/dts/cros-ec-keyboard.dtsi b/arch/arm/boot/dts/cros-ec-keyboard.dtsi
new file mode 100644 (file)
index 0000000..9c7fb0a
--- /dev/null
@@ -0,0 +1,105 @@
+/*
+ * Keyboard dts fragment for devices that use cros-ec-keyboard
+ *
+ * Copyright (c) 2014 Google, Inc
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+*/
+
+#include <dt-bindings/input/input.h>
+
+&cros_ec {
+       keyboard-controller {
+               compatible = "google,cros-ec-keyb";
+               keypad,num-rows = <8>;
+               keypad,num-columns = <13>;
+               google,needs-ghost-filter;
+
+               linux,keymap = <
+                       MATRIX_KEY(0x00, 0x01, KEY_LEFTMETA)
+                       MATRIX_KEY(0x00, 0x02, KEY_F1)
+                       MATRIX_KEY(0x00, 0x03, KEY_B)
+                       MATRIX_KEY(0x00, 0x04, KEY_F10)
+                       MATRIX_KEY(0x00, 0x06, KEY_N)
+                       MATRIX_KEY(0x00, 0x08, KEY_EQUAL)
+                       MATRIX_KEY(0x00, 0x0a, KEY_RIGHTALT)
+
+                       MATRIX_KEY(0x01, 0x01, KEY_ESC)
+                       MATRIX_KEY(0x01, 0x02, KEY_F4)
+                       MATRIX_KEY(0x01, 0x03, KEY_G)
+                       MATRIX_KEY(0x01, 0x04, KEY_F7)
+                       MATRIX_KEY(0x01, 0x06, KEY_H)
+                       MATRIX_KEY(0x01, 0x08, KEY_APOSTROPHE)
+                       MATRIX_KEY(0x01, 0x09, KEY_F9)
+                       MATRIX_KEY(0x01, 0x0b, KEY_BACKSPACE)
+
+                       MATRIX_KEY(0x02, 0x00, KEY_LEFTCTRL)
+                       MATRIX_KEY(0x02, 0x01, KEY_TAB)
+                       MATRIX_KEY(0x02, 0x02, KEY_F3)
+                       MATRIX_KEY(0x02, 0x03, KEY_T)
+                       MATRIX_KEY(0x02, 0x04, KEY_F6)
+                       MATRIX_KEY(0x02, 0x05, KEY_RIGHTBRACE)
+                       MATRIX_KEY(0x02, 0x06, KEY_Y)
+                       MATRIX_KEY(0x02, 0x07, KEY_102ND)
+                       MATRIX_KEY(0x02, 0x08, KEY_LEFTBRACE)
+                       MATRIX_KEY(0x02, 0x09, KEY_F8)
+
+                       MATRIX_KEY(0x03, 0x01, KEY_GRAVE)
+                       MATRIX_KEY(0x03, 0x02, KEY_F2)
+                       MATRIX_KEY(0x03, 0x03, KEY_5)
+                       MATRIX_KEY(0x03, 0x04, KEY_F5)
+                       MATRIX_KEY(0x03, 0x06, KEY_6)
+                       MATRIX_KEY(0x03, 0x08, KEY_MINUS)
+                       MATRIX_KEY(0x03, 0x0b, KEY_BACKSLASH)
+
+                       MATRIX_KEY(0x04, 0x00, KEY_RIGHTCTRL)
+                       MATRIX_KEY(0x04, 0x01, KEY_A)
+                       MATRIX_KEY(0x04, 0x02, KEY_D)
+                       MATRIX_KEY(0x04, 0x03, KEY_F)
+                       MATRIX_KEY(0x04, 0x04, KEY_S)
+                       MATRIX_KEY(0x04, 0x05, KEY_K)
+                       MATRIX_KEY(0x04, 0x06, KEY_J)
+                       MATRIX_KEY(0x04, 0x08, KEY_SEMICOLON)
+                       MATRIX_KEY(0x04, 0x09, KEY_L)
+                       MATRIX_KEY(0x04, 0x0a, KEY_BACKSLASH)
+                       MATRIX_KEY(0x04, 0x0b, KEY_ENTER)
+
+                       MATRIX_KEY(0x05, 0x01, KEY_Z)
+                       MATRIX_KEY(0x05, 0x02, KEY_C)
+                       MATRIX_KEY(0x05, 0x03, KEY_V)
+                       MATRIX_KEY(0x05, 0x04, KEY_X)
+                       MATRIX_KEY(0x05, 0x05, KEY_COMMA)
+                       MATRIX_KEY(0x05, 0x06, KEY_M)
+                       MATRIX_KEY(0x05, 0x07, KEY_LEFTSHIFT)
+                       MATRIX_KEY(0x05, 0x08, KEY_SLASH)
+                       MATRIX_KEY(0x05, 0x09, KEY_DOT)
+                       MATRIX_KEY(0x05, 0x0b, KEY_SPACE)
+
+                       MATRIX_KEY(0x06, 0x01, KEY_1)
+                       MATRIX_KEY(0x06, 0x02, KEY_3)
+                       MATRIX_KEY(0x06, 0x03, KEY_4)
+                       MATRIX_KEY(0x06, 0x04, KEY_2)
+                       MATRIX_KEY(0x06, 0x05, KEY_8)
+                       MATRIX_KEY(0x06, 0x06, KEY_7)
+                       MATRIX_KEY(0x06, 0x08, KEY_0)
+                       MATRIX_KEY(0x06, 0x09, KEY_9)
+                       MATRIX_KEY(0x06, 0x0a, KEY_LEFTALT)
+                       MATRIX_KEY(0x06, 0x0b, KEY_DOWN)
+                       MATRIX_KEY(0x06, 0x0c, KEY_RIGHT)
+
+                       MATRIX_KEY(0x07, 0x01, KEY_Q)
+                       MATRIX_KEY(0x07, 0x02, KEY_E)
+                       MATRIX_KEY(0x07, 0x03, KEY_R)
+                       MATRIX_KEY(0x07, 0x04, KEY_W)
+                       MATRIX_KEY(0x07, 0x05, KEY_I)
+                       MATRIX_KEY(0x07, 0x06, KEY_U)
+                       MATRIX_KEY(0x07, 0x07, KEY_RIGHTSHIFT)
+                       MATRIX_KEY(0x07, 0x08, KEY_P)
+                       MATRIX_KEY(0x07, 0x09, KEY_O)
+                       MATRIX_KEY(0x07, 0x0b, KEY_UP)
+                       MATRIX_KEY(0x07, 0x0c, KEY_LEFT)
+               >;
+       };
+};
diff --git a/arch/arm/boot/dts/dove-cubox-es.dts b/arch/arm/boot/dts/dove-cubox-es.dts
new file mode 100644 (file)
index 0000000..e28ef05
--- /dev/null
@@ -0,0 +1,12 @@
+#include "dove-cubox.dts"
+
+/ {
+       model = "SolidRun CuBox (Engineering Sample)";
+       compatible = "solidrun,cubox-es", "solidrun,cubox", "marvell,dove";
+};
+
+&sdio0 {
+       /* sdio0 card detect is connected to wrong pin on CuBox ES */
+       cd-gpios = <&gpio0 12 1>;
+       pinctrl-0 = <&pmx_sdio0 &pmx_gpio_12>;
+};
index 7a70f4ca502a1665fa21cb31360d2869cbd3617c..aae7efc09b0bd1ecd66e72193c6aefe107008b9e 100644 (file)
 
 &sdio0 {
        status = "okay";
-       /* sdio0 card detect is connected to wrong pin on CuBox */
-       cd-gpios = <&gpio0 12 1>;
-       pinctrl-0 = <&pmx_sdio0 &pmx_gpio_12>;
 };
 
 &spi0 {
index 3b891dd209933551b82a36aa04c6213214fb672c..a5441d5482a63a0a9203f3333b96c87ec1912b11 100644 (file)
                                reg = <0xe8400 0x0c>;
                                ngpios = <8>;
                        };
+
+                       lcd1: lcd-controller@810000 {
+                               compatible = "marvell,dove-lcd";
+                               reg = <0x810000 0x1000>;
+                               interrupts = <46>;
+                               status = "disabled";
+                       };
+
+                       lcd0: lcd-controller@820000 {
+                               compatible = "marvell,dove-lcd";
+                               reg = <0x820000 0x1000>;
+                               interrupts = <47>;
+                               status = "disabled";
+                       };
                };
        };
 };
index 83089540e324b6fee667245e68e998ea6ad4e126..50f8022905a1f36e415f93f8638055993d5f4b5d 100644 (file)
                };
        };
 };
+
+&usb2_phy1 {
+       phy-supply = <&ldousb_reg>;
+};
+
+&usb2_phy2 {
+       phy-supply = <&ldousb_reg>;
+};
index 80127638b379437af61720c557a337d9c5c88b9f..97f603c4483d6a46032f06f7961d801091d1b3a4 100644 (file)
@@ -12,6 +12,9 @@
 
 #include "skeleton.dtsi"
 
+#define MAX_SOURCES 400
+#define DIRECT_IRQ(irq) (MAX_SOURCES + irq)
+
 / {
        #address-cells = <1>;
        #size-cells = <1>;
@@ -45,6 +48,7 @@
                compatible = "arm,cortex-a15-gic";
                interrupt-controller;
                #interrupt-cells = <3>;
+               arm,routable-irqs = <192>;
                reg = <0x48211000 0x1000>,
                      <0x48212000 0x1000>,
                      <0x48214000 0x2000>,
@@ -79,8 +83,8 @@
                ti,hwmods = "l3_main_1", "l3_main_2";
                reg = <0x44000000 0x1000000>,
                      <0x45000000 0x1000>;
-               interrupts = <GIC_SPI 9 IRQ_TYPE_LEVEL_HIGH>,
-                            <GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>;
+               interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI DIRECT_IRQ(10) IRQ_TYPE_LEVEL_HIGH>;
 
                prm: prm@4ae06000 {
                        compatible = "ti,dra7-prm";
                        };
                };
 
+               axi@0 {
+                       compatible = "simple-bus";
+                       #size-cells = <1>;
+                       #address-cells = <1>;
+                       ranges = <0x51000000 0x51000000 0x3000
+                                 0x0        0x20000000 0x10000000>;
+                       pcie@51000000 {
+                               compatible = "ti,dra7-pcie";
+                               reg = <0x51000000 0x2000>, <0x51002000 0x14c>, <0x1000 0x2000>;
+                               reg-names = "rc_dbics", "ti_conf", "config";
+                               interrupts = <0 232 0x4>, <0 233 0x4>;
+                               #address-cells = <3>;
+                               #size-cells = <2>;
+                               device_type = "pci";
+                               ranges = <0x81000000 0 0          0x03000 0 0x00010000
+                                         0x82000000 0 0x20013000 0x13000 0 0xffed000>;
+                               #interrupt-cells = <1>;
+                               num-lanes = <1>;
+                               ti,hwmods = "pcie1";
+                               phys = <&pcie1_phy>;
+                               phy-names = "pcie-phy0";
+                               interrupt-map-mask = <0 0 0 7>;
+                               interrupt-map = <0 0 0 1 &pcie1_intc 1>,
+                                               <0 0 0 2 &pcie1_intc 2>,
+                                               <0 0 0 3 &pcie1_intc 3>,
+                                               <0 0 0 4 &pcie1_intc 4>;
+                               pcie1_intc: interrupt-controller {
+                                       interrupt-controller;
+                                       #address-cells = <0>;
+                                       #interrupt-cells = <1>;
+                               };
+                       };
+               };
+
+               axi@1 {
+                       compatible = "simple-bus";
+                       #size-cells = <1>;
+                       #address-cells = <1>;
+                       ranges = <0x51800000 0x51800000 0x3000
+                                 0x0        0x30000000 0x10000000>;
+                       status = "disabled";
+                       pcie@51000000 {
+                               compatible = "ti,dra7-pcie";
+                               reg = <0x51800000 0x2000>, <0x51802000 0x14c>, <0x1000 0x2000>;
+                               reg-names = "rc_dbics", "ti_conf", "config";
+                               interrupts = <0 355 0x4>, <0 356 0x4>;
+                               #address-cells = <3>;
+                               #size-cells = <2>;
+                               device_type = "pci";
+                               ranges = <0x81000000 0 0          0x03000 0 0x00010000
+                                         0x82000000 0 0x30013000 0x13000 0 0xffed000>;
+                               #interrupt-cells = <1>;
+                               num-lanes = <1>;
+                               ti,hwmods = "pcie2";
+                               phys = <&pcie2_phy>;
+                               phy-names = "pcie-phy0";
+                               interrupt-map-mask = <0 0 0 7>;
+                               interrupt-map = <0 0 0 1 &pcie2_intc 1>,
+                                               <0 0 0 2 &pcie2_intc 2>,
+                                               <0 0 0 3 &pcie2_intc 3>,
+                                               <0 0 0 4 &pcie2_intc 4>;
+                               pcie2_intc: interrupt-controller {
+                                       interrupt-controller;
+                                       #address-cells = <0>;
+                                       #interrupt-cells = <1>;
+                               };
+                       };
+               };
+
                cm_core_aon: cm_core_aon@4a005000 {
                        compatible = "ti,dra7-cm-core-aon";
                        reg = <0x4a005000 0x2000>;
                sdma: dma-controller@4a056000 {
                        compatible = "ti,omap4430-sdma";
                        reg = <0x4a056000 0x1000>;
-                       interrupts = <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>,
-                                    <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>,
-                                    <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>,
-                                    <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 9 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>;
                        #dma-cells = <1>;
                        #dma-channels = <32>;
                        #dma-requests = <127>;
                gpio1: gpio@4ae10000 {
                        compatible = "ti,omap4-gpio";
                        reg = <0x4ae10000 0x200>;
-                       interrupts = <GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "gpio1";
                        gpio-controller;
                        #gpio-cells = <2>;
                gpio2: gpio@48055000 {
                        compatible = "ti,omap4-gpio";
                        reg = <0x48055000 0x200>;
-                       interrupts = <GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "gpio2";
                        gpio-controller;
                        #gpio-cells = <2>;
                gpio3: gpio@48057000 {
                        compatible = "ti,omap4-gpio";
                        reg = <0x48057000 0x200>;
-                       interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "gpio3";
                        gpio-controller;
                        #gpio-cells = <2>;
                gpio4: gpio@48059000 {
                        compatible = "ti,omap4-gpio";
                        reg = <0x48059000 0x200>;
-                       interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "gpio4";
                        gpio-controller;
                        #gpio-cells = <2>;
                gpio5: gpio@4805b000 {
                        compatible = "ti,omap4-gpio";
                        reg = <0x4805b000 0x200>;
-                       interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "gpio5";
                        gpio-controller;
                        #gpio-cells = <2>;
                gpio6: gpio@4805d000 {
                        compatible = "ti,omap4-gpio";
                        reg = <0x4805d000 0x200>;
-                       interrupts = <GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "gpio6";
                        gpio-controller;
                        #gpio-cells = <2>;
                gpio7: gpio@48051000 {
                        compatible = "ti,omap4-gpio";
                        reg = <0x48051000 0x200>;
-                       interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "gpio7";
                        gpio-controller;
                        #gpio-cells = <2>;
                gpio8: gpio@48053000 {
                        compatible = "ti,omap4-gpio";
                        reg = <0x48053000 0x200>;
-                       interrupts = <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 116 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "gpio8";
                        gpio-controller;
                        #gpio-cells = <2>;
                uart1: serial@4806a000 {
                        compatible = "ti,omap4-uart";
                        reg = <0x4806a000 0x100>;
-                       interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "uart1";
                        clock-frequency = <48000000>;
                        status = "disabled";
                uart2: serial@4806c000 {
                        compatible = "ti,omap4-uart";
                        reg = <0x4806c000 0x100>;
-                       interrupts = <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "uart2";
                        clock-frequency = <48000000>;
                        status = "disabled";
                uart3: serial@48020000 {
                        compatible = "ti,omap4-uart";
                        reg = <0x48020000 0x100>;
-                       interrupts = <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 69 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "uart3";
                        clock-frequency = <48000000>;
                        status = "disabled";
                uart4: serial@4806e000 {
                        compatible = "ti,omap4-uart";
                        reg = <0x4806e000 0x100>;
-                       interrupts = <GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 65 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "uart4";
                        clock-frequency = <48000000>;
                         status = "disabled";
                uart5: serial@48066000 {
                        compatible = "ti,omap4-uart";
                        reg = <0x48066000 0x100>;
-                       interrupts = <GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 100 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "uart5";
                        clock-frequency = <48000000>;
                        status = "disabled";
                uart6: serial@48068000 {
                        compatible = "ti,omap4-uart";
                        reg = <0x48068000 0x100>;
-                       interrupts = <GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 101 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "uart6";
                        clock-frequency = <48000000>;
                        status = "disabled";
                uart7: serial@48420000 {
                        compatible = "ti,omap4-uart";
                        reg = <0x48420000 0x100>;
+                       interrupts = <GIC_SPI 218 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "uart7";
                        clock-frequency = <48000000>;
                        status = "disabled";
                uart8: serial@48422000 {
                        compatible = "ti,omap4-uart";
                        reg = <0x48422000 0x100>;
+                       interrupts = <GIC_SPI 219 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "uart8";
                        clock-frequency = <48000000>;
                        status = "disabled";
                uart9: serial@48424000 {
                        compatible = "ti,omap4-uart";
                        reg = <0x48424000 0x100>;
+                       interrupts = <GIC_SPI 220 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "uart9";
                        clock-frequency = <48000000>;
                        status = "disabled";
                uart10: serial@4ae2b000 {
                        compatible = "ti,omap4-uart";
                        reg = <0x4ae2b000 0x100>;
+                       interrupts = <GIC_SPI 221 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "uart10";
                        clock-frequency = <48000000>;
                        status = "disabled";
                };
 
+               mailbox1: mailbox@4a0f4000 {
+                       compatible = "ti,omap4-mailbox";
+                       reg = <0x4a0f4000 0x200>;
+                       ti,hwmods = "mailbox1";
+                       ti,mbox-num-users = <3>;
+                       ti,mbox-num-fifos = <8>;
+                       status = "disabled";
+               };
+
+               mailbox2: mailbox@4883a000 {
+                       compatible = "ti,omap4-mailbox";
+                       reg = <0x4883a000 0x200>;
+                       ti,hwmods = "mailbox2";
+                       ti,mbox-num-users = <4>;
+                       ti,mbox-num-fifos = <12>;
+                       status = "disabled";
+               };
+
+               mailbox3: mailbox@4883c000 {
+                       compatible = "ti,omap4-mailbox";
+                       reg = <0x4883c000 0x200>;
+                       ti,hwmods = "mailbox3";
+                       ti,mbox-num-users = <4>;
+                       ti,mbox-num-fifos = <12>;
+                       status = "disabled";
+               };
+
+               mailbox4: mailbox@4883e000 {
+                       compatible = "ti,omap4-mailbox";
+                       reg = <0x4883e000 0x200>;
+                       ti,hwmods = "mailbox4";
+                       ti,mbox-num-users = <4>;
+                       ti,mbox-num-fifos = <12>;
+                       status = "disabled";
+               };
+
+               mailbox5: mailbox@48840000 {
+                       compatible = "ti,omap4-mailbox";
+                       reg = <0x48840000 0x200>;
+                       ti,hwmods = "mailbox5";
+                       ti,mbox-num-users = <4>;
+                       ti,mbox-num-fifos = <12>;
+                       status = "disabled";
+               };
+
+               mailbox6: mailbox@48842000 {
+                       compatible = "ti,omap4-mailbox";
+                       reg = <0x48842000 0x200>;
+                       ti,hwmods = "mailbox6";
+                       ti,mbox-num-users = <4>;
+                       ti,mbox-num-fifos = <12>;
+                       status = "disabled";
+               };
+
+               mailbox7: mailbox@48844000 {
+                       compatible = "ti,omap4-mailbox";
+                       reg = <0x48844000 0x200>;
+                       ti,hwmods = "mailbox7";
+                       ti,mbox-num-users = <4>;
+                       ti,mbox-num-fifos = <12>;
+                       status = "disabled";
+               };
+
+               mailbox8: mailbox@48846000 {
+                       compatible = "ti,omap4-mailbox";
+                       reg = <0x48846000 0x200>;
+                       ti,hwmods = "mailbox8";
+                       ti,mbox-num-users = <4>;
+                       ti,mbox-num-fifos = <12>;
+                       status = "disabled";
+               };
+
+               mailbox9: mailbox@4885e000 {
+                       compatible = "ti,omap4-mailbox";
+                       reg = <0x4885e000 0x200>;
+                       ti,hwmods = "mailbox9";
+                       ti,mbox-num-users = <4>;
+                       ti,mbox-num-fifos = <12>;
+                       status = "disabled";
+               };
+
+               mailbox10: mailbox@48860000 {
+                       compatible = "ti,omap4-mailbox";
+                       reg = <0x48860000 0x200>;
+                       ti,hwmods = "mailbox10";
+                       ti,mbox-num-users = <4>;
+                       ti,mbox-num-fifos = <12>;
+                       status = "disabled";
+               };
+
+               mailbox11: mailbox@48862000 {
+                       compatible = "ti,omap4-mailbox";
+                       reg = <0x48862000 0x200>;
+                       ti,hwmods = "mailbox11";
+                       ti,mbox-num-users = <4>;
+                       ti,mbox-num-fifos = <12>;
+                       status = "disabled";
+               };
+
+               mailbox12: mailbox@48864000 {
+                       compatible = "ti,omap4-mailbox";
+                       reg = <0x48864000 0x200>;
+                       ti,hwmods = "mailbox12";
+                       ti,mbox-num-users = <4>;
+                       ti,mbox-num-fifos = <12>;
+                       status = "disabled";
+               };
+
+               mailbox13: mailbox@48802000 {
+                       compatible = "ti,omap4-mailbox";
+                       reg = <0x48802000 0x200>;
+                       ti,hwmods = "mailbox13";
+                       ti,mbox-num-users = <4>;
+                       ti,mbox-num-fifos = <12>;
+                       status = "disabled";
+               };
+
                timer1: timer@4ae18000 {
                        compatible = "ti,omap5430-timer";
                        reg = <0x4ae18000 0x80>;
-                       interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "timer1";
                        ti,timer-alwon;
                };
                timer2: timer@48032000 {
                        compatible = "ti,omap5430-timer";
                        reg = <0x48032000 0x80>;
-                       interrupts = <GIC_SPI 38 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "timer2";
                };
 
                timer3: timer@48034000 {
                        compatible = "ti,omap5430-timer";
                        reg = <0x48034000 0x80>;
-                       interrupts = <GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "timer3";
                };
 
                timer4: timer@48036000 {
                        compatible = "ti,omap5430-timer";
                        reg = <0x48036000 0x80>;
-                       interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "timer4";
                };
 
                timer5: timer@48820000 {
                        compatible = "ti,omap5430-timer";
                        reg = <0x48820000 0x80>;
-                       interrupts = <GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "timer5";
                        ti,timer-dsp;
                };
                timer6: timer@48822000 {
                        compatible = "ti,omap5430-timer";
                        reg = <0x48822000 0x80>;
-                       interrupts = <GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "timer6";
                        ti,timer-dsp;
                        ti,timer-pwm;
                timer7: timer@48824000 {
                        compatible = "ti,omap5430-timer";
                        reg = <0x48824000 0x80>;
-                       interrupts = <GIC_SPI 43 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 38 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "timer7";
                        ti,timer-dsp;
                };
                timer8: timer@48826000 {
                        compatible = "ti,omap5430-timer";
                        reg = <0x48826000 0x80>;
-                       interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "timer8";
                        ti,timer-dsp;
                        ti,timer-pwm;
                timer9: timer@4803e000 {
                        compatible = "ti,omap5430-timer";
                        reg = <0x4803e000 0x80>;
-                       interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "timer9";
                };
 
                timer10: timer@48086000 {
                        compatible = "ti,omap5430-timer";
                        reg = <0x48086000 0x80>;
-                       interrupts = <GIC_SPI 46 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "timer10";
                };
 
                timer11: timer@48088000 {
                        compatible = "ti,omap5430-timer";
                        reg = <0x48088000 0x80>;
-                       interrupts = <GIC_SPI 47 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "timer11";
                        ti,timer-pwm;
                };
                timer13: timer@48828000 {
                        compatible = "ti,omap5430-timer";
                        reg = <0x48828000 0x80>;
+                       interrupts = <GIC_SPI 339 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "timer13";
                        status = "disabled";
                };
                timer14: timer@4882a000 {
                        compatible = "ti,omap5430-timer";
                        reg = <0x4882a000 0x80>;
+                       interrupts = <GIC_SPI 340 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "timer14";
                        status = "disabled";
                };
                timer15: timer@4882c000 {
                        compatible = "ti,omap5430-timer";
                        reg = <0x4882c000 0x80>;
+                       interrupts = <GIC_SPI 341 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "timer15";
                        status = "disabled";
                };
                timer16: timer@4882e000 {
                        compatible = "ti,omap5430-timer";
                        reg = <0x4882e000 0x80>;
+                       interrupts = <GIC_SPI 342 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "timer16";
                        status = "disabled";
                };
                wdt2: wdt@4ae14000 {
                        compatible = "ti,omap4-wdt";
                        reg = <0x4ae14000 0x80>;
-                       interrupts = <GIC_SPI 80 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "wd_timer2";
                };
 
                dmm@4e000000 {
                        compatible = "ti,omap5-dmm";
                        reg = <0x4e000000 0x800>;
-                       interrupts = <0 113 0x4>;
+                       interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "dmm";
                };
 
                i2c1: i2c@48070000 {
                        compatible = "ti,omap4-i2c";
                        reg = <0x48070000 0x100>;
-                       interrupts = <GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 51 IRQ_TYPE_LEVEL_HIGH>;
                        #address-cells = <1>;
                        #size-cells = <0>;
                        ti,hwmods = "i2c1";
                i2c2: i2c@48072000 {
                        compatible = "ti,omap4-i2c";
                        reg = <0x48072000 0x100>;
-                       interrupts = <GIC_SPI 57 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 52 IRQ_TYPE_LEVEL_HIGH>;
                        #address-cells = <1>;
                        #size-cells = <0>;
                        ti,hwmods = "i2c2";
                i2c3: i2c@48060000 {
                        compatible = "ti,omap4-i2c";
                        reg = <0x48060000 0x100>;
-                       interrupts = <GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>;
                        #address-cells = <1>;
                        #size-cells = <0>;
                        ti,hwmods = "i2c3";
                i2c4: i2c@4807a000 {
                        compatible = "ti,omap4-i2c";
                        reg = <0x4807a000 0x100>;
-                       interrupts = <GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 57 IRQ_TYPE_LEVEL_HIGH>;
                        #address-cells = <1>;
                        #size-cells = <0>;
                        ti,hwmods = "i2c4";
                i2c5: i2c@4807c000 {
                        compatible = "ti,omap4-i2c";
                        reg = <0x4807c000 0x100>;
-                       interrupts = <GIC_SPI 60 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>;
                        #address-cells = <1>;
                        #size-cells = <0>;
                        ti,hwmods = "i2c5";
                mmc1: mmc@4809c000 {
                        compatible = "ti,omap4-hsmmc";
                        reg = <0x4809c000 0x400>;
-                       interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "mmc1";
                        ti,dual-volt;
                        ti,needs-special-reset;
                mmc2: mmc@480b4000 {
                        compatible = "ti,omap4-hsmmc";
                        reg = <0x480b4000 0x400>;
-                       interrupts = <GIC_SPI 86 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 81 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "mmc2";
                        ti,needs-special-reset;
                        dmas = <&sdma 47>, <&sdma 48>;
                mmc3: mmc@480ad000 {
                        compatible = "ti,omap4-hsmmc";
                        reg = <0x480ad000 0x400>;
-                       interrupts = <GIC_SPI 94 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "mmc3";
                        ti,needs-special-reset;
                        dmas = <&sdma 77>, <&sdma 78>;
                mmc4: mmc@480d1000 {
                        compatible = "ti,omap4-hsmmc";
                        reg = <0x480d1000 0x400>;
-                       interrupts = <GIC_SPI 96 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 91 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "mmc4";
                        ti,needs-special-reset;
                        dmas = <&sdma 57>, <&sdma 58>;
                mcspi1: spi@48098000 {
                        compatible = "ti,omap4-mcspi";
                        reg = <0x48098000 0x200>;
-                       interrupts = <GIC_SPI 65 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 60 IRQ_TYPE_LEVEL_HIGH>;
                        #address-cells = <1>;
                        #size-cells = <0>;
                        ti,hwmods = "mcspi1";
                mcspi2: spi@4809a000 {
                        compatible = "ti,omap4-mcspi";
                        reg = <0x4809a000 0x200>;
-                       interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>;
                        #address-cells = <1>;
                        #size-cells = <0>;
                        ti,hwmods = "mcspi2";
                mcspi3: spi@480b8000 {
                        compatible = "ti,omap4-mcspi";
                        reg = <0x480b8000 0x200>;
-                       interrupts = <GIC_SPI 91 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 86 IRQ_TYPE_LEVEL_HIGH>;
                        #address-cells = <1>;
                        #size-cells = <0>;
                        ti,hwmods = "mcspi3";
                mcspi4: spi@480ba000 {
                        compatible = "ti,omap4-mcspi";
                        reg = <0x480ba000 0x200>;
-                       interrupts = <GIC_SPI 48 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 43 IRQ_TYPE_LEVEL_HIGH>;
                        #address-cells = <1>;
                        #size-cells = <0>;
                        ti,hwmods = "mcspi4";
                        clocks = <&qspi_gfclk_div>;
                        clock-names = "fck";
                        num-cs = <4>;
+                       interrupts = <GIC_SPI 343 IRQ_TYPE_LEVEL_HIGH>;
                        status = "disabled";
                };
 
                                clock-names = "sysclk";
                                #phy-cells = <0>;
                        };
+
+                       pcie1_phy: pciephy@4a094000 {
+                               compatible = "ti,phy-pipe3-pcie";
+                               reg = <0x4a094000 0x80>, /* phy_rx */
+                                     <0x4a094400 0x64>; /* phy_tx */
+                               reg-names = "phy_rx", "phy_tx";
+                               ctrl-module = <&omap_control_pcie1phy>;
+                               clocks = <&dpll_pcie_ref_ck>,
+                                        <&dpll_pcie_ref_m2ldo_ck>,
+                                        <&optfclk_pciephy1_32khz>,
+                                        <&optfclk_pciephy1_clk>,
+                                        <&optfclk_pciephy1_div_clk>,
+                                        <&optfclk_pciephy_div>;
+                               clock-names = "dpll_ref", "dpll_ref_m2",
+                                             "wkupclk", "refclk",
+                                             "div-clk", "phy-div";
+                               #phy-cells = <0>;
+                               id = <1>;
+                               ti,hwmods = "pcie1-phy";
+                       };
+
+                       pcie2_phy: pciephy@4a095000 {
+                               compatible = "ti,phy-pipe3-pcie";
+                               reg = <0x4a095000 0x80>, /* phy_rx */
+                                     <0x4a095400 0x64>; /* phy_tx */
+                               reg-names = "phy_rx", "phy_tx";
+                               ctrl-module = <&omap_control_pcie2phy>;
+                               clocks = <&dpll_pcie_ref_ck>,
+                                        <&dpll_pcie_ref_m2ldo_ck>,
+                                        <&optfclk_pciephy2_32khz>,
+                                        <&optfclk_pciephy2_clk>,
+                                        <&optfclk_pciephy2_div_clk>,
+                                        <&optfclk_pciephy_div>;
+                               clock-names = "dpll_ref", "dpll_ref_m2",
+                                             "wkupclk", "refclk",
+                                             "div-clk", "phy-div";
+                               #phy-cells = <0>;
+                               ti,hwmods = "pcie2-phy";
+                               id = <2>;
+                               status = "disabled";
+                       };
                };
 
                sata: sata@4a141100 {
                        compatible = "snps,dwc-ahci";
                        reg = <0x4a140000 0x1100>, <0x4a141100 0x7>;
-                       interrupts = <GIC_SPI 54 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 49 IRQ_TYPE_LEVEL_HIGH>;
                        phys = <&sata_phy>;
                        phy-names = "sata-phy";
                        clocks = <&sata_ref_clk>;
                        ti,hwmods = "sata";
                };
 
+               omap_control_pcie1phy: control-phy@0x4a003c40 {
+                       compatible = "ti,control-phy-pcie";
+                       reg = <0x4a003c40 0x4>, <0x4a003c14 0x4>, <0x4a003c34 0x4>;
+                       reg-names = "power", "control_sma", "pcie_pcs";
+                       clocks = <&sys_clkin1>;
+                       clock-names = "sysclk";
+               };
+
+               omap_control_pcie2phy: control-pcie@0x4a003c44 {
+                       compatible = "ti,control-phy-pcie";
+                       reg = <0x4a003c44 0x4>, <0x4a003c14 0x4>, <0x4a003c34 0x4>;
+                       reg-names = "power", "control_sma", "pcie_pcs";
+                       clocks = <&sys_clkin1>;
+                       clock-names = "sysclk";
+                       status = "disabled";
+               };
+
                omap_control_usb2phy1: control-phy@4a002300 {
                        compatible = "ti,control-phy-usb2";
                        reg = <0x4a002300 0x4>;
                        compatible = "ti,dwc3";
                        ti,hwmods = "usb_otg_ss1";
                        reg = <0x48880000 0x10000>;
-                       interrupts = <0 77 4>;
+                       interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>;
                        #address-cells = <1>;
                        #size-cells = <1>;
                        utmi-mode = <2>;
                        usb1: usb@48890000 {
                                compatible = "snps,dwc3";
                                reg = <0x48890000 0x17000>;
-                               interrupts = <0 76 4>;
+                               interrupts = <GIC_SPI 71 IRQ_TYPE_LEVEL_HIGH>;
                                phys = <&usb2_phy1>, <&usb3_phy1>;
                                phy-names = "usb2-phy", "usb3-phy";
                                tx-fifo-resize;
                        compatible = "ti,dwc3";
                        ti,hwmods = "usb_otg_ss2";
                        reg = <0x488c0000 0x10000>;
-                       interrupts = <0 92 4>;
+                       interrupts = <GIC_SPI 87 IRQ_TYPE_LEVEL_HIGH>;
                        #address-cells = <1>;
                        #size-cells = <1>;
                        utmi-mode = <2>;
                        usb2: usb@488d0000 {
                                compatible = "snps,dwc3";
                                reg = <0x488d0000 0x17000>;
-                               interrupts = <0 78 4>;
+                               interrupts = <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>;
                                phys = <&usb2_phy2>;
                                phy-names = "usb2-phy";
                                tx-fifo-resize;
                        compatible = "ti,dwc3";
                        ti,hwmods = "usb_otg_ss3";
                        reg = <0x48900000 0x10000>;
-               /*      interrupts = <0 TBD 4>; */
+                       interrupts = <GIC_SPI 344 IRQ_TYPE_LEVEL_HIGH>;
                        #address-cells = <1>;
                        #size-cells = <1>;
                        utmi-mode = <2>;
                        usb3: usb@48910000 {
                                compatible = "snps,dwc3";
                                reg = <0x48910000 0x17000>;
-               /*              interrupts = <0 93 4>; */
+                               interrupts = <GIC_SPI 88 IRQ_TYPE_LEVEL_HIGH>;
                                tx-fifo-resize;
                                maximum-speed = "high-speed";
                                dr_mode = "otg";
                        compatible = "ti,dwc3";
                        ti,hwmods = "usb_otg_ss4";
                        reg = <0x48940000 0x10000>;
-               /*      interrupts = <0 TBD 4>; */
+                       interrupts = <GIC_SPI 346 IRQ_TYPE_LEVEL_HIGH>;
                        #address-cells = <1>;
                        #size-cells = <1>;
                        utmi-mode = <2>;
                        usb4: usb@48950000 {
                                compatible = "snps,dwc3";
                                reg = <0x48950000 0x17000>;
-               /*              interrupts = <0 TBD 4>; */
+                               interrupts = <GIC_SPI 345 IRQ_TYPE_LEVEL_HIGH>;
                                tx-fifo-resize;
                                maximum-speed = "high-speed";
                                dr_mode = "otg";
                elm: elm@48078000 {
                        compatible = "ti,am3352-elm";
                        reg = <0x48078000 0xfc0>;      /* device IO registers */
-                       interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 1 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "elm";
                        status = "disabled";
                };
                        compatible = "ti,am3352-gpmc";
                        ti,hwmods = "gpmc";
                        reg = <0x50000000 0x37c>;      /* device IO registers */
-                       interrupts = <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>;
                        gpmc,num-cs = <8>;
                        gpmc,num-waitpins = <2>;
                        #address-cells = <2>;
                        clock-names = "fck";
                        status = "disabled";
                };
+
+               crossbar_mpu: crossbar@4a020000 {
+                       compatible = "ti,irq-crossbar";
+                       reg = <0x4a002a48 0x130>;
+                       ti,max-irqs = <160>;
+                       ti,max-crossbar-sources = <MAX_SOURCES>;
+                       ti,reg-size = <2>;
+                       ti,irqs-reserved = <0 1 2 3 5 6 131 132>;
+                       ti,irqs-skip = <10 133 139 140>;
+                       ti,irqs-safe-map = <0>;
+               };
        };
 };
 
index dc7a292fe9397d43c68c987886218a199750eccd..2c05b3f017fa22ec4370c02e80fc390a65ed8772 100644 (file)
 
        apll_pcie_in_clk_mux: apll_pcie_in_clk_mux@4ae06118 {
                compatible = "ti,mux-clock";
-               clocks = <&dpll_pcie_ref_ck>, <&pciesref_acs_clk_ck>;
+               clocks = <&dpll_pcie_ref_m2ldo_ck>, <&pciesref_acs_clk_ck>;
                #clock-cells = <0>;
                reg = <0x021c 0x4>;
                ti,bit-shift = <7>;
                reg = <0x021c>, <0x0220>;
        };
 
+       optfclk_pciephy1_32khz: optfclk_pciephy1_32khz@4a0093b0 {
+               compatible = "ti,gate-clock";
+               clocks = <&sys_32k_ck>;
+               #clock-cells = <0>;
+               reg = <0x13b0>;
+               ti,bit-shift = <8>;
+       };
+
+       optfclk_pciephy2_32khz: optfclk_pciephy2_32khz@4a0093b8 {
+               compatible = "ti,gate-clock";
+               clocks = <&sys_32k_ck>;
+               #clock-cells = <0>;
+               reg = <0x13b8>;
+               ti,bit-shift = <8>;
+       };
+
        optfclk_pciephy_div: optfclk_pciephy_div@4a00821c {
                compatible = "ti,divider-clock";
                clocks = <&apll_pcie_ck>;
                #clock-cells = <0>;
                reg = <0x021c>;
+               ti,dividers = <2>, <1>;
                ti,bit-shift = <8>;
                ti,max-div = <2>;
        };
 
-       optfclk_pciephy_clk: optfclk_pciephy_clk@4a0093b0 {
+       optfclk_pciephy1_clk: optfclk_pciephy1_clk@4a0093b0 {
                compatible = "ti,gate-clock";
                clocks = <&apll_pcie_ck>;
                #clock-cells = <0>;
                ti,bit-shift = <9>;
        };
 
-       optfclk_pciephy_div_clk: optfclk_pciephy_div_clk@4a0093b0 {
+       optfclk_pciephy2_clk: optfclk_pciephy2_clk@4a0093b8 {
+               compatible = "ti,gate-clock";
+               clocks = <&apll_pcie_ck>;
+               #clock-cells = <0>;
+               reg = <0x13b8>;
+               ti,bit-shift = <9>;
+       };
+
+       optfclk_pciephy1_div_clk: optfclk_pciephy1_div_clk@4a0093b0 {
                compatible = "ti,gate-clock";
                clocks = <&optfclk_pciephy_div>;
                #clock-cells = <0>;
                ti,bit-shift = <10>;
        };
 
+       optfclk_pciephy2_div_clk: optfclk_pciephy2_div_clk@4a0093b8 {
+               compatible = "ti,gate-clock";
+               clocks = <&optfclk_pciephy_div>;
+               #clock-cells = <0>;
+               reg = <0x13b8>;
+               ti,bit-shift = <10>;
+       };
+
        apll_pcie_clkvcoldo: apll_pcie_clkvcoldo {
                #clock-cells = <0>;
                compatible = "fixed-factor-clock";
index e37985fa10e2b6aca96f047f788f9674ddf0bf9f..00eeed3721b63bfeb0bad99169557f660a03f1cc 100644 (file)
                        device_type = "cpu";
                        compatible = "arm,cortex-a9";
                        reg = <0>;
+                       clock-frequency = <533000000>;
                };
                cpu@1 {
                        device_type = "cpu";
                        compatible = "arm,cortex-a9";
                        reg = <1>;
+                       clock-frequency = <533000000>;
                };
        };
 
index 143b6d25bc80e9229dca3e63d5d419ce32c6c80a..8f941c2db7c654e864dd0c2420d0786e95d4fd7f 100644 (file)
                reg = <0x20000000 0x08000000>;
        };
 
+       clocks {
+               slow_xtal {
+                       clock-frequency = <32768>;
+               };
+
+               main_xtal {
+                       clock-frequency = <18432000>;
+               };
+       };
+
        ahb {
                apb {
                        dbgu: serial@fffff200 {
index 4d829685fdfb1d026df02a0a16b308f189b970bb..f72969efe6d79ad857392d30794c427d424d4d38 100644 (file)
        model = "Telit EVK-PRO3 for Telit GE863-PRO3";
        compatible = "telit,evk-pro3", "atmel,at91sam9260", "atmel,at91sam9";
 
+       clocks {
+               slow_xtal {
+                       clock-frequency = <32768>;
+               };
+       };
+
        ahb {
                apb {
                        macb0: ethernet@fffc4000 {
index 94d59983fc2d8d6e0dfd0310c31bb69c86c0a13d..1d52de6370d58a65022b0bc59bf2f07516066308 100644 (file)
                        status = "disabled";
                };
 
+               tmu: tmu@100C0000 {
+                       compatible = "samsung,exynos3250-tmu";
+                       reg = <0x100C0000 0x100>;
+                       interrupts = <0 216 0>;
+                       clocks = <&cmu CLK_TMU_APBIF>;
+                       clock-names = "tmu_apbif";
+                       status = "disabled";
+               };
+
                gic: interrupt-controller@10481000 {
                        compatible = "arm,cortex-a15-gic";
                        #interrupt-cells = <3>;
 
                        wakeup-interrupt-controller {
                                compatible = "samsung,exynos4210-wakeup-eint";
-                               interrupt-parent = <&gic>;
                                interrupts = <0 48 0>;
                        };
                };
                        compatible = "arm,amba-bus";
                        #address-cells = <1>;
                        #size-cells = <1>;
-                       interrupt-parent = <&gic>;
                        ranges;
 
                        pdma0: pdma@12680000 {
                        interrupts = <0 109 0>;
                        clocks = <&cmu CLK_UART0>, <&cmu CLK_SCLK_UART0>;
                        clock-names = "uart", "clk_uart_baud0";
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&uart0_data &uart0_fctl>;
                        status = "disabled";
                };
 
                        interrupts = <0 110 0>;
                        clocks = <&cmu CLK_UART1>, <&cmu CLK_SCLK_UART1>;
                        clock-names = "uart", "clk_uart_baud0";
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&uart1_data>;
                        status = "disabled";
                };
 
                        status = "disabled";
                };
 
+               i2s2: i2s@13970000 {
+                       compatible = "samsung,s3c6410-i2s";
+                       reg = <0x13970000 0x100>;
+                       interrupts = <0 126 0>;
+                       clocks = <&cmu CLK_I2S>, <&cmu CLK_SCLK_I2S>;
+                       clock-names = "iis", "i2s_opclk0";
+                       dmas = <&pdma0 14>, <&pdma0 13>;
+                       dma-names = "tx", "rx";
+                       pinctrl-0 = <&i2s2_bus>;
+                       pinctrl-names = "default";
+                       status = "disabled";
+               };
+
                pwm: pwm@139D0000 {
                        compatible = "samsung,exynos4210-pwm";
                        reg = <0x139D0000 0x1000>;
index 93bcc1fe8a4e7f61623cbdda24adf552079aa5b6..e0278ecbc816a10291c65a1540e696aecbea9248 100644 (file)
                reg = <0x10440000 0x1000>;
        };
 
+       pmu {
+               compatible = "arm,cortex-a9-pmu";
+               interrupt-parent = <&combiner>;
+               interrupts = <2 2>, <3 2>;
+       };
+
        sys_reg: syscon@10010000 {
                compatible = "samsung,exynos4-sysreg", "syscon";
                reg = <0x10010000 0x400>;
                clocks = <&clock CLK_USB_HOST>;
                clock-names = "usbhost";
                status = "disabled";
+               #address-cells = <1>;
+               #size-cells = <0>;
+               port@0 {
+                   reg = <0>;
+                   phys = <&exynos_usbphy 1>;
+                   status = "disabled";
+               };
+               port@1 {
+                   reg = <1>;
+                   phys = <&exynos_usbphy 2>;
+                   status = "disabled";
+               };
+               port@2 {
+                   reg = <2>;
+                   phys = <&exynos_usbphy 3>;
+                   status = "disabled";
+               };
        };
 
        ohci@12590000 {
                clocks = <&clock CLK_USB_HOST>;
                clock-names = "usbhost";
                status = "disabled";
+               #address-cells = <1>;
+               #size-cells = <0>;
+               port@0 {
+                   reg = <0>;
+                   phys = <&exynos_usbphy 1>;
+                   status = "disabled";
+               };
        };
 
        i2s1: i2s@13960000 {
                clocks = <&clock CLK_SCLK_FIMD0>, <&clock CLK_FIMD0>;
                clock-names = "sclk_fimd", "fimd";
                samsung,power-domain = <&pd_lcd0>;
+               samsung,sysreg = <&sys_reg>;
                status = "disabled";
        };
 };
index 97ea7a9b1f62cb0e582824441a203e1c5c699834..807bb5bf91fc84db70430ba17b7f507b6ca11a76 100644 (file)
                #clock-cells = <1>;
        };
 
-       pmu {
-               compatible = "arm,cortex-a9-pmu";
-               interrupt-parent = <&combiner>;
-               interrupts = <2 2>, <3 2>;
-       };
-
        pinctrl_0: pinctrl@11400000 {
                compatible = "samsung,exynos4210-pinctrl";
                reg = <0x11400000 0x1000>;
diff --git a/arch/arm/boot/dts/exynos4412-odroid-common.dtsi b/arch/arm/boot/dts/exynos4412-odroid-common.dtsi
new file mode 100644 (file)
index 0000000..6d6d23c
--- /dev/null
@@ -0,0 +1,371 @@
+/*
+ * Common definition for Hardkernel's Exynos4412 based ODROID-X/X2/U2/U3 boards
+ * device tree source
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+*/
+
+#include <dt-bindings/input/input.h>
+#include "exynos4412.dtsi"
+
+/ {
+       firmware@0204F000 {
+               compatible = "samsung,secure-firmware";
+               reg = <0x0204F000 0x1000>;
+       };
+
+       gpio_keys {
+               compatible = "gpio-keys";
+               pinctrl-names = "default";
+               pinctrl-0 = <&gpio_power_key>;
+
+               power_key {
+                       interrupt-parent = <&gpx1>;
+                       interrupts = <3 0>;
+                       gpios = <&gpx1 3 1>;
+                       linux,code = <KEY_POWER>;
+                       label = "power key";
+                       debounce-interval = <10>;
+                       gpio-key,wakeup;
+               };
+       };
+
+       i2s0: i2s@03830000 {
+               pinctrl-0 = <&i2s0_bus>;
+               pinctrl-names = "default";
+               status = "okay";
+               clocks = <&clock_audss EXYNOS_I2S_BUS>,
+                        <&clock_audss EXYNOS_DOUT_AUD_BUS>;
+               clock-names = "iis", "i2s_opclk0";
+       };
+
+       sound: sound {
+               compatible = "samsung,odroidx2-audio";
+               samsung,i2s-controller = <&i2s0>;
+               samsung,audio-codec = <&max98090>;
+       };
+
+       mmc@12550000 {
+               pinctrl-0 = <&sd4_clk &sd4_cmd &sd4_bus4 &sd4_bus8>;
+               pinctrl-names = "default";
+               vmmc-supply = <&ldo20_reg &buck8_reg>;
+               status = "okay";
+
+               num-slots = <1>;
+               supports-highspeed;
+               broken-cd;
+               card-detect-delay = <200>;
+               samsung,dw-mshc-ciu-div = <3>;
+               samsung,dw-mshc-sdr-timing = <2 3>;
+               samsung,dw-mshc-ddr-timing = <1 2>;
+
+               slot@0 {
+                       reg = <0>;
+                       bus-width = <8>;
+               };
+       };
+
+       watchdog@10060000 {
+               status = "okay";
+       };
+
+       rtc@10070000 {
+               status = "okay";
+       };
+
+       g2d@10800000 {
+               status = "okay";
+       };
+
+       camera {
+               status = "okay";
+               pinctrl-names = "default";
+               pinctrl-0 = <>;
+
+               fimc_0: fimc@11800000 {
+                       status = "okay";
+               };
+
+               fimc_1: fimc@11810000 {
+                       status = "okay";
+               };
+
+               fimc_2: fimc@11820000 {
+                       status = "okay";
+               };
+
+               fimc_3: fimc@11830000 {
+                       status = "okay";
+               };
+       };
+
+       sdhci@12530000 {
+               bus-width = <4>;
+               pinctrl-0 = <&sd2_clk &sd2_cmd &sd2_cd &sd2_bus4>;
+               pinctrl-names = "default";
+               vmmc-supply = <&ldo4_reg &ldo21_reg>;
+               cd-gpios = <&gpk2 2 0>;
+               cd-inverted;
+               status = "okay";
+       };
+
+       serial@13800000 {
+               status = "okay";
+       };
+
+       serial@13810000 {
+               status = "okay";
+       };
+
+       fixed-rate-clocks {
+               xxti {
+                       compatible = "samsung,clock-xxti";
+                       clock-frequency = <0>;
+               };
+
+               xusbxti {
+                       compatible = "samsung,clock-xusbxti";
+                       clock-frequency = <24000000>;
+               };
+       };
+
+       i2c@13860000 {
+               pinctrl-0 = <&i2c0_bus>;
+               pinctrl-names = "default";
+               status = "okay";
+
+               usb3503: usb3503@08 {
+                       compatible = "smsc,usb3503";
+                       reg = <0x08>;
+
+                       intn-gpios = <&gpx3 0 0>;
+                       connect-gpios = <&gpx3 4 0>;
+                       reset-gpios = <&gpx3 5 0>;
+                       initial-mode = <1>;
+               };
+
+               max77686: pmic@09 {
+                       compatible = "maxim,max77686";
+                       reg = <0x09>;
+                       #clock-cells = <1>;
+
+                       voltage-regulators {
+                               ldo1_reg: LDO1 {
+                                       regulator-name = "VDD_ALIVE_1.0V";
+                                       regulator-min-microvolt = <1000000>;
+                                       regulator-max-microvolt = <1000000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo2_reg: LDO2 {
+                                       regulator-name = "VDDQ_M1_2_1.8V";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo3_reg: LDO3 {
+                                       regulator-name = "VDDQ_EXT_1.8V";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo4_reg: LDO4 {
+                                       regulator-name = "VDDQ_MMC2_2.8V";
+                                       regulator-min-microvolt = <2800000>;
+                                       regulator-max-microvolt = <2800000>;
+                                       regulator-always-on;
+                                       regulator-boot-on;
+                               };
+
+                               ldo5_reg: LDO5 {
+                                       regulator-name = "VDDQ_MMC1_3_1.8V";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                                       regulator-always-on;
+                                       regulator-boot-on;
+                               };
+
+                               ldo6_reg: LDO6 {
+                                       regulator-name = "VDD10_MPLL_1.0V";
+                                       regulator-min-microvolt = <1000000>;
+                                       regulator-max-microvolt = <1000000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo7_reg: LDO7 {
+                                       regulator-name = "VDD10_XPLL_1.0V";
+                                       regulator-min-microvolt = <1000000>;
+                                       regulator-max-microvolt = <1000000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo11_reg: LDO11 {
+                                       regulator-name = "VDD18_ABB1_1.8V";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo12_reg: LDO12 {
+                                       regulator-name = "VDD33_USB_3.3V";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                                       regulator-always-on;
+                                       regulator-boot-on;
+                               };
+
+                               ldo13_reg: LDO13 {
+                                       regulator-name = "VDDQ_C2C_W_1.8V";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                                       regulator-always-on;
+                                       regulator-boot-on;
+                               };
+
+                               ldo14_reg: LDO14 {
+                                       regulator-name = "VDD18_ABB0_2_1.8V";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                                       regulator-always-on;
+                                       regulator-boot-on;
+                               };
+
+                               ldo15_reg: LDO15 {
+                                       regulator-name = "VDD10_HSIC_1.0V";
+                                       regulator-min-microvolt = <1000000>;
+                                       regulator-max-microvolt = <1000000>;
+                                       regulator-always-on;
+                                       regulator-boot-on;
+                               };
+
+                               ldo16_reg: LDO16 {
+                                       regulator-name = "VDD18_HSIC_1.8V";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                                       regulator-always-on;
+                                       regulator-boot-on;
+                               };
+
+                               ldo20_reg: LDO20 {
+                                       regulator-name = "LDO20_1.8V";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                                       regulator-boot-on;
+                               };
+
+                               ldo21_reg: LDO21 {
+                                       regulator-name = "LDO21_3.3V";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                                       regulator-always-on;
+                                       regulator-boot-on;
+                               };
+
+                               ldo25_reg: LDO25 {
+                                       regulator-name = "VDDQ_LCD_1.8V";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                                       regulator-always-on;
+                                       regulator-boot-on;
+                               };
+
+                               buck1_reg: BUCK1 {
+                                       regulator-name = "vdd_mif";
+                                       regulator-min-microvolt = <1000000>;
+                                       regulator-max-microvolt = <1000000>;
+                                       regulator-always-on;
+                                       regulator-boot-on;
+                               };
+
+                               buck2_reg: BUCK2 {
+                                       regulator-name = "vdd_arm";
+                                       regulator-min-microvolt = <900000>;
+                                       regulator-max-microvolt = <1350000>;
+                                       regulator-always-on;
+                                       regulator-boot-on;
+                               };
+
+                               buck3_reg: BUCK3 {
+                                       regulator-name = "vdd_int";
+                                       regulator-min-microvolt = <1000000>;
+                                       regulator-max-microvolt = <1000000>;
+                                       regulator-always-on;
+                                       regulator-boot-on;
+                               };
+
+                               buck4_reg: BUCK4 {
+                                       regulator-name = "vdd_g3d";
+                                       regulator-min-microvolt = <900000>;
+                                       regulator-max-microvolt = <1100000>;
+                                       regulator-microvolt-offset = <50000>;
+                               };
+
+                               buck5_reg: BUCK5 {
+                                       regulator-name = "VDDQ_CKEM1_2_1.2V";
+                                       regulator-min-microvolt = <1200000>;
+                                       regulator-max-microvolt = <1200000>;
+                                       regulator-always-on;
+                                       regulator-boot-on;
+                               };
+
+                               buck6_reg: BUCK6 {
+                                       regulator-name = "BUCK6_1.35V";
+                                       regulator-min-microvolt = <1350000>;
+                                       regulator-max-microvolt = <1350000>;
+                                       regulator-always-on;
+                                       regulator-boot-on;
+                               };
+
+                               buck7_reg: BUCK7 {
+                                       regulator-name = "BUCK7_2.0V";
+                                       regulator-min-microvolt = <2000000>;
+                                       regulator-max-microvolt = <2000000>;
+                                       regulator-always-on;
+                               };
+
+                               buck8_reg: BUCK8 {
+                                       regulator-name = "BUCK8_2.8V";
+                                       regulator-min-microvolt = <2800000>;
+                                       regulator-max-microvolt = <2800000>;
+                               };
+                       };
+               };
+       };
+
+       i2c@13870000 {
+               pinctrl-names = "default";
+               pinctrl-0 = <&i2c1_bus>;
+               status = "okay";
+               max98090: max98090@10 {
+                       compatible = "maxim,max98090";
+                       reg = <0x10>;
+                       interrupt-parent = <&gpx0>;
+                       interrupts = <0 0>;
+               };
+       };
+
+       exynos-usbphy@125B0000 {
+               status = "okay";
+       };
+
+       hsotg@12480000 {
+               status = "okay";
+               vusb_d-supply = <&ldo15_reg>;
+               vusb_a-supply = <&ldo12_reg>;
+       };
+
+       ehci: ehci@12580000 {
+               status = "okay";
+       };
+};
+
+&pinctrl_1 {
+       gpio_power_key: power_key {
+               samsung,pins = "gpx1-3";
+               samsung,pin-pud = <0>;
+       };
+};
diff --git a/arch/arm/boot/dts/exynos4412-odroidu3.dts b/arch/arm/boot/dts/exynos4412-odroidu3.dts
new file mode 100644 (file)
index 0000000..c8a64be
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * Hardkernel's Exynos4412 based ODROID-U3 board device tree source
+ *
+ * Copyright (c) 2014 Marek Szyprowski <m.szyprowski@samsung.com>
+ *
+ * Device tree source file for Hardkernel's ODROID-U3 board which is based
+ * on Samsung's Exynos4412 SoC.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+*/
+
+/dts-v1/;
+#include "exynos4412-odroid-common.dtsi"
+
+/ {
+       model = "Hardkernel ODROID-U3 board based on Exynos4412";
+       compatible = "hardkernel,odroid-u3", "samsung,exynos4412", "samsung,exynos4";
+
+       memory {
+               reg = <0x40000000 0x7FF00000>;
+       };
+
+       leds {
+               compatible = "gpio-leds";
+               led1 {
+                       label = "led1:heart";
+                       gpios = <&gpc1 0 1>;
+                       default-state = "on";
+                       linux,default-trigger = "heartbeat";
+               };
+       };
+};
+
+&usb3503 {
+       clock-names = "refclk";
+       clocks = <&pmu_system_controller 0>;
+       refclk-frequency = <24000000>;
+};
+
+&ehci {
+       port@1 {
+               status = "okay";
+       };
+       port@2 {
+               status = "okay";
+       };
+};
+
+&sound {
+       compatible = "samsung,odroidu3-audio";
+       samsung,model = "Odroid-U3";
+       samsung,audio-routing =
+               "Headphone Jack", "HPL",
+               "Headphone Jack", "HPR",
+               "Headphone Jack", "MICBIAS",
+               "IN1", "Headphone Jack",
+               "Speakers", "SPKL",
+               "Speakers", "SPKR";
+};
index 31db28a4bb33e86f18233fa8336a3a0cee28ca87..cb1cfe7239c44373a764cf14a739738807325961 100644 (file)
@@ -3,8 +3,8 @@
  *
  * Copyright (c) 2012 Dongjin Kim <tobetter@gmail.com>
  *
- * Device tree source file for Hardkernel's ODROID-X board which is based on
- * Samsung's Exynos4412 SoC.
+ * Device tree source file for Hardkernel's ODROID-X board which is based
+ * on Samsung's Exynos4412 SoC.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
 */
 
 /dts-v1/;
-#include "exynos4412.dtsi"
+#include "exynos4412-odroid-common.dtsi"
 
 / {
        model = "Hardkernel ODROID-X board based on Exynos4412";
        compatible = "hardkernel,odroid-x", "samsung,exynos4412", "samsung,exynos4";
 
        memory {
-               reg = <0x40000000 0x40000000>;
+               reg = <0x40000000 0x3FF00000>;
        };
 
        leds {
                };
        };
 
-       mmc@12550000 {
-               pinctrl-0 = <&sd4_clk &sd4_cmd &sd4_bus4 &sd4_bus8>;
-               pinctrl-names = "default";
-               vmmc-supply = <&ldo20_reg &buck8_reg>;
+       serial@13820000 {
                status = "okay";
+       };
 
-               num-slots = <1>;
-               supports-highspeed;
-               broken-cd;
-               card-detect-delay = <200>;
-               samsung,dw-mshc-ciu-div = <3>;
-               samsung,dw-mshc-sdr-timing = <2 3>;
-               samsung,dw-mshc-ddr-timing = <1 2>;
+       serial@13830000 {
+               status = "okay";
+       };
 
-               slot@0 {
-                       reg = <0>;
-                       bus-width = <8>;
+       gpio_keys {
+               pinctrl-0 = <&gpio_power_key &gpio_home_key>;
+
+               home_key {
+                       interrupt-parent = <&gpx2>;
+                       interrupts = <2 0>;
+                       gpios = <&gpx2 2 0>;
+                       linux,code = <KEY_HOME>;
+                       label = "home key";
+                       debounce-interval = <10>;
+                       gpio-key,wakeup;
                };
        };
 
                regulator-max-microvolt = <3300000>;
                gpio = <&gpa1 1 1>;
                enable-active-high;
-               regulator-boot-on;
-       };
-
-       rtc@10070000 {
-               status = "okay";
-       };
-
-       sdhci@12530000 {
-               bus-width = <4>;
-               pinctrl-0 = <&sd2_clk &sd2_cmd &sd2_cd &sd2_bus4>;
-               pinctrl-names = "default";
-               vmmc-supply = <&ldo4_reg &ldo21_reg>;
-               status = "okay";
-       };
-
-       serial@13800000 {
-               status = "okay";
-       };
-
-       serial@13810000 {
-               status = "okay";
-       };
-
-       serial@13820000 {
-               status = "okay";
+               regulator-always-on;
        };
+};
 
-       serial@13830000 {
+&ehci {
+       port@1 {
                status = "okay";
        };
+};
 
-       fixed-rate-clocks {
-               xxti {
-                       compatible = "samsung,clock-xxti";
-                       clock-frequency = <0>;
-               };
-
-               xusbxti {
-                       compatible = "samsung,clock-xusbxti";
-                       clock-frequency = <24000000>;
-               };
-       };
-
-       i2c@13860000 {
-               pinctrl-0 = <&i2c0_bus>;
-               pinctrl-names = "default";
-               status = "okay";
-
-               max77686: pmic@09 {
-                       compatible = "maxim,max77686";
-                       reg = <0x09>;
-                       #clock-cells = <1>;
-
-                       voltage-regulators {
-                               ldo1_reg: LDO1 {
-                                       regulator-name = "VDD_ALIVE_1.0V";
-                                       regulator-min-microvolt = <1000000>;
-                                       regulator-max-microvolt = <1000000>;
-                                       regulator-always-on;
-                               };
-
-                               ldo2_reg: LDO2 {
-                                       regulator-name = "VDDQ_M1_2_1.8V";
-                                       regulator-min-microvolt = <1800000>;
-                                       regulator-max-microvolt = <1800000>;
-                                       regulator-always-on;
-                               };
-
-                               ldo3_reg: LDO3 {
-                                       regulator-name = "VDDQ_EXT_1.8V";
-                                       regulator-min-microvolt = <1800000>;
-                                       regulator-max-microvolt = <1800000>;
-                                       regulator-always-on;
-                               };
-
-                               ldo4_reg: LDO4 {
-                                       regulator-name = "VDDQ_MMC2_2.8V";
-                                       regulator-min-microvolt = <2800000>;
-                                       regulator-max-microvolt = <2800000>;
-                                       regulator-always-on;
-                                       regulator-boot-on;
-                               };
-
-                               ldo5_reg: LDO5 {
-                                       regulator-name = "VDDQ_MMC1_3_1.8V";
-                                       regulator-min-microvolt = <1800000>;
-                                       regulator-max-microvolt = <1800000>;
-                                       regulator-always-on;
-                                       regulator-boot-on;
-                               };
-
-                               ldo6_reg: LDO6 {
-                                       regulator-name = "VDD10_MPLL_1.0V";
-                                       regulator-min-microvolt = <1000000>;
-                                       regulator-max-microvolt = <1000000>;
-                                       regulator-always-on;
-                               };
-
-                               ldo7_reg: LDO7 {
-                                       regulator-name = "VDD10_XPLL_1.0V";
-                                       regulator-min-microvolt = <1000000>;
-                                       regulator-max-microvolt = <1000000>;
-                                       regulator-always-on;
-                               };
-
-                               ldo11_reg: LDO11 {
-                                       regulator-name = "VDD18_ABB1_1.8V";
-                                       regulator-min-microvolt = <1800000>;
-                                       regulator-max-microvolt = <1800000>;
-                                       regulator-always-on;
-                               };
-
-                               ldo12_reg: LDO12 {
-                                       regulator-name = "VDD33_USB_3.3V";
-                                       regulator-min-microvolt = <3300000>;
-                                       regulator-max-microvolt = <3300000>;
-                                       regulator-always-on;
-                                       regulator-boot-on;
-                               };
-
-                               ldo13_reg: LDO13 {
-                                       regulator-name = "VDDQ_C2C_W_1.8V";
-                                       regulator-min-microvolt = <1800000>;
-                                       regulator-max-microvolt = <1800000>;
-                                       regulator-always-on;
-                                       regulator-boot-on;
-                               };
-
-                               ldo14_reg: LDO14 {
-                                       regulator-name = "VDD18_ABB0_2_1.8V";
-                                       regulator-min-microvolt = <1800000>;
-                                       regulator-max-microvolt = <1800000>;
-                                       regulator-always-on;
-                                       regulator-boot-on;
-                               };
-
-                               ldo15_reg: LDO15 {
-                                       regulator-name = "VDD10_HSIC_1.0V";
-                                       regulator-min-microvolt = <1000000>;
-                                       regulator-max-microvolt = <1000000>;
-                                       regulator-always-on;
-                                       regulator-boot-on;
-                               };
-
-                               ldo16_reg: LDO16 {
-                                       regulator-name = "VDD18_HSIC_1.8V";
-                                       regulator-min-microvolt = <1800000>;
-                                       regulator-max-microvolt = <1800000>;
-                                       regulator-always-on;
-                                       regulator-boot-on;
-                               };
-
-                               ldo20_reg: LDO20 {
-                                       regulator-name = "LDO20_1.8V";
-                                       regulator-min-microvolt = <1800000>;
-                                       regulator-max-microvolt = <1800000>;
-                                       regulator-boot-on;
-                               };
-
-                               ldo21_reg: LDO21 {
-                                       regulator-name = "LDO21_3.3V";
-                                       regulator-min-microvolt = <3300000>;
-                                       regulator-max-microvolt = <3300000>;
-                                       regulator-always-on;
-                                       regulator-boot-on;
-                               };
-
-                               ldo25_reg: LDO25 {
-                                       regulator-name = "VDDQ_LCD_1.8V";
-                                       regulator-min-microvolt = <1800000>;
-                                       regulator-max-microvolt = <1800000>;
-                                       regulator-always-on;
-                                       regulator-boot-on;
-                               };
-
-                               buck1_reg: BUCK1 {
-                                       regulator-name = "vdd_mif";
-                                       regulator-min-microvolt = <1000000>;
-                                       regulator-max-microvolt = <1000000>;
-                                       regulator-always-on;
-                                       regulator-boot-on;
-                               };
-
-                               buck2_reg: BUCK2 {
-                                       regulator-name = "vdd_arm";
-                                       regulator-min-microvolt = <900000>;
-                                       regulator-max-microvolt = <1350000>;
-                                       regulator-always-on;
-                                       regulator-boot-on;
-                               };
-
-                               buck3_reg: BUCK3 {
-                                       regulator-name = "vdd_int";
-                                       regulator-min-microvolt = <1000000>;
-                                       regulator-max-microvolt = <1000000>;
-                                       regulator-always-on;
-                                       regulator-boot-on;
-                               };
-
-                               buck4_reg: BUCK4 {
-                                       regulator-name = "vdd_g3d";
-                                       regulator-min-microvolt = <900000>;
-                                       regulator-max-microvolt = <1100000>;
-                                       regulator-microvolt-offset = <50000>;
-                               };
-
-                               buck5_reg: BUCK5 {
-                                       regulator-name = "VDDQ_CKEM1_2_1.2V";
-                                       regulator-min-microvolt = <1200000>;
-                                       regulator-max-microvolt = <1200000>;
-                                       regulator-always-on;
-                                       regulator-boot-on;
-                               };
-
-                               buck6_reg: BUCK6 {
-                                       regulator-name = "BUCK6_1.35V";
-                                       regulator-min-microvolt = <1350000>;
-                                       regulator-max-microvolt = <1350000>;
-                                       regulator-always-on;
-                                       regulator-boot-on;
-                               };
-
-                               buck7_reg: BUCK7 {
-                                       regulator-name = "BUCK7_2.0V";
-                                       regulator-min-microvolt = <2000000>;
-                                       regulator-max-microvolt = <2000000>;
-                                       regulator-always-on;
-                               };
-
-                               buck8_reg: BUCK8 {
-                                       regulator-name = "BUCK8_2.8V";
-                                       regulator-min-microvolt = <2800000>;
-                                       regulator-max-microvolt = <2800000>;
-                                       regulator-always-on;
-                               };
-                       };
-               };
+&pinctrl_1 {
+       gpio_home_key: home_key {
+               samsung,pins = "gpx2-2";
+               samsung,pin-pud = <0>;
        };
 };
diff --git a/arch/arm/boot/dts/exynos4412-odroidx2.dts b/arch/arm/boot/dts/exynos4412-odroidx2.dts
new file mode 100644 (file)
index 0000000..96b43f4
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Hardkernel's Exynos4412 based ODROID-X2 board device tree source
+ *
+ * Copyright (c) 2012 Dongjin Kim <tobetter@gmail.com>
+ *
+ * Device tree source file for Hardkernel's ODROID-X2 board which is based
+ * on Samsung's Exynos4412 SoC.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+*/
+
+#include "exynos4412-odroidx.dts"
+
+/ {
+       model = "Hardkernel ODROID-X2 board based on Exynos4412";
+       compatible = "hardkernel,odroid-x2", "samsung,exynos4412", "samsung,exynos4";
+
+       memory {
+               reg = <0x40000000 0x7FF00000>;
+       };
+};
+
+&sound {
+       samsung,model = "Odroid-X2";
+       samsung,audio-routing =
+               "Headphone Jack", "HPL",
+               "Headphone Jack", "HPR",
+               "IN1", "Mic Jack",
+               "Mic Jack", "MICBIAS";
+};
index c42a3e196cd5db7fdac7dd843e15c1f884b0e0ce..d8bc059e172ff1562ea4525cedc2ad14948a4bad 100644 (file)
                samsung,combiner-nr = <20>;
        };
 
+       pmu {
+               interrupts = <2 2>, <3 2>, <18 2>, <19 2>;
+       };
+
        gic: interrupt-controller@10490000 {
                cpu-offset = <0x4000>;
        };
index de1f9c77b589af5e9084ffd1fdac7b96c6c67c39..861bb919f6d391ea44f097565eb0d36781d1a20a 100644 (file)
                mshc0 = &mshc_0;
        };
 
-       pmu {
-               compatible = "arm,cortex-a9-pmu";
-               interrupt-parent = <&combiner>;
-               interrupts = <2 2>, <3 2>, <18 2>, <19 2>;
-       };
-
        sysram@02020000 {
                compatible = "mmio-sram";
                reg = <0x02020000 0x40000>;
index ff2d2cb0f79e083f94649ac3e91025f1c5ceb89b..a0cc0b6f8f96d52c24729dd1432327e4935f389b 100644 (file)
@@ -94,6 +94,7 @@
                reg = <0x14400000 0x40000>;
                interrupt-names = "fifo", "vsync", "lcd_sys";
                interrupts = <18 4>, <18 5>, <18 6>;
+               samsung,sysreg = <&sysreg_system_controller>;
                status = "disabled";
        };
 
index 89ac90f59e2efbd1419daa401abb6b5703ca1ac0..e603e9c70142ffe00e6156b1436db293bcd30325 100644 (file)
                i2c2_bus: i2c2-bus {
                        samsung,pin-pud = <0>;
                };
-
-               max77686_irq: max77686-irq {
-                       samsung,pins = "gpx3-2";
-                       samsung,pin-function = <0>;
-                       samsung,pin-pud = <0>;
-                       samsung,pin-drv = <0>;
-               };
        };
 
        i2c@12C60000 {
                status = "okay";
                samsung,i2c-sda-delay = <100>;
                samsung,i2c-max-bus-freq = <378000>;
-
-               max77686@09 {
-                       compatible = "maxim,max77686";
-                       interrupt-parent = <&gpx3>;
-                       interrupts = <2 0>;
-                       pinctrl-names = "default";
-                       pinctrl-0 = <&max77686_irq>;
-                       wakeup-source;
-                       reg = <0x09>;
-                       #clock-cells = <1>;
-
-                       voltage-regulators {
-                               ldo1_reg: LDO1 {
-                                       regulator-name = "P1.0V_LDO_OUT1";
-                                       regulator-min-microvolt = <1000000>;
-                                       regulator-max-microvolt = <1000000>;
-                                       regulator-always-on;
-                               };
-
-                               ldo2_reg: LDO2 {
-                                       regulator-name = "P1.8V_LDO_OUT2";
-                                       regulator-min-microvolt = <1800000>;
-                                       regulator-max-microvolt = <1800000>;
-                                       regulator-always-on;
-                               };
-
-                               ldo3_reg: LDO3 {
-                                       regulator-name = "P1.8V_LDO_OUT3";
-                                       regulator-min-microvolt = <1800000>;
-                                       regulator-max-microvolt = <1800000>;
-                                       regulator-always-on;
-                               };
-
-                               ldo7_reg: LDO7 {
-                                       regulator-name = "P1.1V_LDO_OUT7";
-                                       regulator-min-microvolt = <1100000>;
-                                       regulator-max-microvolt = <1100000>;
-                                       regulator-always-on;
-                               };
-
-                               ldo8_reg: LDO8 {
-                                       regulator-name = "P1.0V_LDO_OUT8";
-                                       regulator-min-microvolt = <1000000>;
-                                       regulator-max-microvolt = <1000000>;
-                                       regulator-always-on;
-                               };
-
-                               ldo10_reg: LDO10 {
-                                       regulator-name = "P1.8V_LDO_OUT10";
-                                       regulator-min-microvolt = <1800000>;
-                                       regulator-max-microvolt = <1800000>;
-                                       regulator-always-on;
-                               };
-
-                               ldo12_reg: LDO12 {
-                                       regulator-name = "P3.0V_LDO_OUT12";
-                                       regulator-min-microvolt = <3000000>;
-                                       regulator-max-microvolt = <3000000>;
-                                       regulator-always-on;
-                               };
-
-                               ldo14_reg: LDO14 {
-                                       regulator-name = "P1.8V_LDO_OUT14";
-                                       regulator-min-microvolt = <1800000>;
-                                       regulator-max-microvolt = <1800000>;
-                                       regulator-always-on;
-                               };
-
-                               ldo15_reg: LDO15 {
-                                       regulator-name = "P1.0V_LDO_OUT15";
-                                       regulator-min-microvolt = <1000000>;
-                                       regulator-max-microvolt = <1000000>;
-                                       regulator-always-on;
-                               };
-
-                               ldo16_reg: LDO16 {
-                                       regulator-name = "P1.8V_LDO_OUT16";
-                                       regulator-min-microvolt = <1800000>;
-                                       regulator-max-microvolt = <1800000>;
-                                       regulator-always-on;
-                               };
-
-                               buck1_reg: BUCK1 {
-                                       regulator-name = "vdd_mif";
-                                       regulator-min-microvolt = <950000>;
-                                       regulator-max-microvolt = <1300000>;
-                                       regulator-always-on;
-                                       regulator-boot-on;
-                               };
-
-                               buck2_reg: BUCK2 {
-                                       regulator-name = "vdd_arm";
-                                       regulator-min-microvolt = <850000>;
-                                       regulator-max-microvolt = <1350000>;
-                                       regulator-always-on;
-                                       regulator-boot-on;
-                               };
-
-                               buck3_reg: BUCK3 {
-                                       regulator-name = "vdd_int";
-                                       regulator-min-microvolt = <900000>;
-                                       regulator-max-microvolt = <1200000>;
-                                       regulator-always-on;
-                                       regulator-boot-on;
-                               };
-
-                               buck4_reg: BUCK4 {
-                                       regulator-name = "vdd_g3d";
-                                       regulator-min-microvolt = <850000>;
-                                       regulator-max-microvolt = <1300000>;
-                                       regulator-always-on;
-                                       regulator-boot-on;
-                               };
-
-                               buck5_reg: BUCK5 {
-                                       regulator-name = "P1.8V_BUCK_OUT5";
-                                       regulator-min-microvolt = <1800000>;
-                                       regulator-max-microvolt = <1800000>;
-                                       regulator-always-on;
-                                       regulator-boot-on;
-                               };
-
-                               buck6_reg: BUCK6 {
-                                       regulator-name = "P1.35V_BUCK_OUT6";
-                                       regulator-min-microvolt = <1350000>;
-                                       regulator-max-microvolt = <1350000>;
-                                       regulator-always-on;
-                               };
-
-                               buck7_reg: BUCK7 {
-                                       regulator-name = "P2.0V_BUCK_OUT7";
-                                       regulator-min-microvolt = <2000000>;
-                                       regulator-max-microvolt = <2000000>;
-                                       regulator-always-on;
-                               };
-
-                               buck8_reg: BUCK8 {
-                                       regulator-name = "P2.85V_BUCK_OUT8";
-                                       regulator-min-microvolt = <2850000>;
-                                       regulator-max-microvolt = <2850000>;
-                                       regulator-always-on;
-                               };
-                       };
-               };
        };
 
        i2c@12C70000 {
                status = "okay";
                samsung,i2c-sda-delay = <100>;
                samsung,i2c-max-bus-freq = <378000>;
-
-               trackpad {
-                       reg = <0x67>;
-                       compatible = "cypress,cyapa";
-                       interrupts = <2 0>;
-                       interrupt-parent = <&gpx1>;
-                       wakeup-source;
-               };
        };
 
        i2c@12C80000 {
index 0c6433ae63ac1a1697e219e67024f29f112507b5..b4b35adae565e0fe22eaf933ecd79e9203224293 100644 (file)
@@ -44,6 +44,8 @@
                max77686@09 {
                        compatible = "maxim,max77686";
                        reg = <0x09>;
+                       interrupt-parent = <&gpx3>;
+                       interrupts = <2 0>;
 
                        voltage-regulators {
                                ldo1_reg: LDO1 {
index 079fdf9e3f1870076a8e6123ff9d140ce46e2617..f2b8c411654110cf56a8a03ba21768be0621d3d2 100644 (file)
                                sbs,poll-retry-count = <1>;
                        };
 
-                       ec: embedded-controller {
+                       cros_ec: embedded-controller {
                                compatible = "google,cros-ec-i2c";
                                reg = <0x1e>;
                                interrupts = <6 0>;
                                pinctrl-names = "default";
                                pinctrl-0 = <&ec_irq>;
                                wakeup-source;
-
-                               keyboard-controller {
-                                       compatible = "google,cros-ec-keyb";
-                                       keypad,num-rows = <8>;
-                                       keypad,num-columns = <13>;
-                                       google,needs-ghost-filter;
-                                       linux,keymap = <0x0001007d      /* L_META */
-                                                       0x0002003b      /* F1 */
-                                                       0x00030030      /* B */
-                                                       0x00040044      /* F10 */
-                                                       0x00060031      /* N */
-                                                       0x0008000d      /* = */
-                                                       0x000a0064      /* R_ALT */
-
-                                                       0x01010001      /* ESC */
-                                                       0x0102003e      /* F4 */
-                                                       0x01030022      /* G */
-                                                       0x01040041      /* F7 */
-                                                       0x01060023      /* H */
-                                                       0x01080028      /* ' */
-                                                       0x01090043      /* F9 */
-                                                       0x010b000e      /* BKSPACE */
-
-                                                       0x0200001d      /* L_CTRL */
-                                                       0x0201000f      /* TAB */
-                                                       0x0202003d      /* F3 */
-                                                       0x02030014      /* T */
-                                                       0x02040040      /* F6 */
-                                                       0x0205001b      /* ] */
-                                                       0x02060015      /* Y */
-                                                       0x02070056      /* 102ND */
-                                                       0x0208001a      /* [ */
-                                                       0x02090042      /* F8 */
-
-                                                       0x03010029      /* GRAVE */
-                                                       0x0302003c      /* F2 */
-                                                       0x03030006      /* 5 */
-                                                       0x0304003f      /* F5 */
-                                                       0x03060007      /* 6 */
-                                                       0x0308000c      /* - */
-                                                       0x030b002b      /* \ */
-
-                                                       0x04000061      /* R_CTRL */
-                                                       0x0401001e      /* A */
-                                                       0x04020020      /* D */
-                                                       0x04030021      /* F */
-                                                       0x0404001f      /* S */
-                                                       0x04050025      /* K */
-                                                       0x04060024      /* J */
-                                                       0x04080027      /* ; */
-                                                       0x04090026      /* L */
-                                                       0x040a002b      /* \ */
-                                                       0x040b001c      /* ENTER */
-
-                                                       0x0501002c      /* Z */
-                                                       0x0502002e      /* C */
-                                                       0x0503002f      /* V */
-                                                       0x0504002d      /* X */
-                                                       0x05050033      /* , */
-                                                       0x05060032      /* M */
-                                                       0x0507002a      /* L_SHIFT */
-                                                       0x05080035      /* / */
-                                                       0x05090034      /* . */
-                                                       0x050B0039      /* SPACE */
-
-                                                       0x06010002      /* 1 */
-                                                       0x06020004      /* 3 */
-                                                       0x06030005      /* 4 */
-                                                       0x06040003      /* 2 */
-                                                       0x06050009      /* 8 */
-                                                       0x06060008      /* 7 */
-                                                       0x0608000b      /* 0 */
-                                                       0x0609000a      /* 9 */
-                                                       0x060a0038      /* L_ALT */
-                                                       0x060b006c      /* DOWN */
-                                                       0x060c006a      /* RIGHT */
-
-                                                       0x07010010      /* Q */
-                                                       0x07020012      /* E */
-                                                       0x07030013      /* R */
-                                                       0x07040011      /* W */
-                                                       0x07050017      /* I */
-                                                       0x07060016      /* U */
-                                                       0x07070036      /* R_SHIFT */
-                                                       0x07080019      /* P */
-                                                       0x07090018      /* O */
-                                                       0x070b0067      /* UP */
-                                                       0x070c0069>;    /* LEFT */
-                               };
                        };
 
                        power-regulator {
        sound {
                compatible = "google,snow-audio-max98095";
 
+               samsung,model = "Snow-I2S-MAX98095";
                samsung,i2s-controller = <&i2s0>;
                samsung,audio-codec = <&max98095>;
        };
                };
        };
 };
+
+&i2c_0 {
+       max77686@09 {
+               compatible = "maxim,max77686";
+               interrupt-parent = <&gpx3>;
+               interrupts = <2 0>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&max77686_irq>;
+               wakeup-source;
+               reg = <0x09>;
+               #clock-cells = <1>;
+
+               voltage-regulators {
+                       ldo1_reg: LDO1 {
+                               regulator-name = "P1.0V_LDO_OUT1";
+                               regulator-min-microvolt = <1000000>;
+                               regulator-max-microvolt = <1000000>;
+                               regulator-always-on;
+                       };
+
+                       ldo2_reg: LDO2 {
+                               regulator-name = "P1.8V_LDO_OUT2";
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <1800000>;
+                               regulator-always-on;
+                       };
+
+                       ldo3_reg: LDO3 {
+                               regulator-name = "P1.8V_LDO_OUT3";
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <1800000>;
+                               regulator-always-on;
+                       };
+
+                       ldo7_reg: LDO7 {
+                               regulator-name = "P1.1V_LDO_OUT7";
+                               regulator-min-microvolt = <1100000>;
+                               regulator-max-microvolt = <1100000>;
+                               regulator-always-on;
+                       };
+
+                       ldo8_reg: LDO8 {
+                               regulator-name = "P1.0V_LDO_OUT8";
+                               regulator-min-microvolt = <1000000>;
+                               regulator-max-microvolt = <1000000>;
+                               regulator-always-on;
+                       };
+
+                       ldo10_reg: LDO10 {
+                               regulator-name = "P1.8V_LDO_OUT10";
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <1800000>;
+                               regulator-always-on;
+                       };
+
+                       ldo12_reg: LDO12 {
+                               regulator-name = "P3.0V_LDO_OUT12";
+                               regulator-min-microvolt = <3000000>;
+                               regulator-max-microvolt = <3000000>;
+                               regulator-always-on;
+                       };
+
+                       ldo14_reg: LDO14 {
+                               regulator-name = "P1.8V_LDO_OUT14";
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <1800000>;
+                               regulator-always-on;
+                       };
+
+                       ldo15_reg: LDO15 {
+                               regulator-name = "P1.0V_LDO_OUT15";
+                               regulator-min-microvolt = <1000000>;
+                               regulator-max-microvolt = <1000000>;
+                               regulator-always-on;
+                       };
+
+                       ldo16_reg: LDO16 {
+                               regulator-name = "P1.8V_LDO_OUT16";
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <1800000>;
+                               regulator-always-on;
+                       };
+
+                       buck1_reg: BUCK1 {
+                               regulator-name = "vdd_mif";
+                               regulator-min-microvolt = <950000>;
+                               regulator-max-microvolt = <1300000>;
+                               regulator-always-on;
+                               regulator-boot-on;
+                       };
+
+                       buck2_reg: BUCK2 {
+                               regulator-name = "vdd_arm";
+                               regulator-min-microvolt = <850000>;
+                               regulator-max-microvolt = <1350000>;
+                               regulator-always-on;
+                               regulator-boot-on;
+                       };
+
+                       buck3_reg: BUCK3 {
+                               regulator-name = "vdd_int";
+                               regulator-min-microvolt = <900000>;
+                               regulator-max-microvolt = <1200000>;
+                               regulator-always-on;
+                               regulator-boot-on;
+                       };
+
+                       buck4_reg: BUCK4 {
+                               regulator-name = "vdd_g3d";
+                               regulator-min-microvolt = <850000>;
+                               regulator-max-microvolt = <1300000>;
+                               regulator-always-on;
+                               regulator-boot-on;
+                       };
+
+                       buck5_reg: BUCK5 {
+                               regulator-name = "P1.8V_BUCK_OUT5";
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <1800000>;
+                               regulator-always-on;
+                               regulator-boot-on;
+                       };
+
+                       buck6_reg: BUCK6 {
+                               regulator-name = "P1.35V_BUCK_OUT6";
+                               regulator-min-microvolt = <1350000>;
+                               regulator-max-microvolt = <1350000>;
+                               regulator-always-on;
+                       };
+
+                       buck7_reg: BUCK7 {
+                               regulator-name = "P2.0V_BUCK_OUT7";
+                               regulator-min-microvolt = <2000000>;
+                               regulator-max-microvolt = <2000000>;
+                               regulator-always-on;
+                       };
+
+                       buck8_reg: BUCK8 {
+                               regulator-name = "P2.85V_BUCK_OUT8";
+                               regulator-min-microvolt = <2850000>;
+                               regulator-max-microvolt = <2850000>;
+                               regulator-always-on;
+                       };
+               };
+       };
+};
+
+&i2c_1 {
+       trackpad {
+               reg = <0x67>;
+               compatible = "cypress,cyapa";
+               interrupts = <2 0>;
+               interrupt-parent = <&gpx1>;
+               wakeup-source;
+       };
+};
+
+&pinctrl_0 {
+       max77686_irq: max77686-irq {
+               samsung,pins = "gpx3-2";
+               samsung,pin-function = <0>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+};
+
+#include "cros-ec-keyboard.dtsi"
index 4539a0ae714dd621fdbba8b4da8407a94bb368f2..36da38e29000d0e077a1651d7586e979ea2ffb07 100644 (file)
                        interrupts = <0 243 0>;
                };
 
+               pmu_system_controller: system-controller@10D50000 {
+                       compatible = "samsung,exynos5260-pmu", "syscon";
+                       reg = <0x10D50000 0x10000>;
+               };
+
                uart0: serial@12C00000 {
                        compatible = "samsung,exynos4210-uart";
                        reg = <0x12C00000 0x100>;
index 52070e54589ac6c9ff8c52adc47686399b24b8a1..731eefd23fa999aef4479d705ffc499d297a2680 100644 (file)
                        device_type = "cpu";
                        compatible = "arm,cortex-a15";
                        reg = <0x0>;
+                       clock-frequency = <1600000000>;
                };
 
                CPU1: cpu@1 {
                        device_type = "cpu";
                        compatible = "arm,cortex-a15";
                        reg = <0x1>;
+                       clock-frequency = <1600000000>;
                };
 
                CPU2: cpu@2 {
                        device_type = "cpu";
                        compatible = "arm,cortex-a15";
                        reg = <0x2>;
+                       clock-frequency = <1600000000>;
                };
 
                CPU3: cpu@3 {
                        device_type = "cpu";
                        compatible = "arm,cortex-a15";
                        reg = <0x3>;
+                       clock-frequency = <1600000000>;
                };
        };
 
                        reg = <0x10000000 0x100>;
                };
 
+               pmu_system_controller: system-controller@10040000 {
+                       compatible = "samsung,exynos5410-pmu", "syscon";
+                       reg = <0x10040000 0x5000>;
+               };
+
                mct: mct@101C0000 {
                        compatible = "samsung,exynos4210-mct";
                        reg = <0x101C0000 0xB00>;
index 1c5b8f9f4a36345829d992344fbf4d686b067917..228a6b1e0aa10378f604c7f08feb0cf6c9ad4919 100644 (file)
                "google,pit", "google,peach","samsung,exynos5420",
                "samsung,exynos5";
 
-       memory {
-               reg = <0x20000000 0x80000000>;
+       aliases {
+               /* Assign 20 so we don't get confused w/ builtin ones */
+               i2c20 = "/spi@12d40000/cros-ec@0/i2c-tunnel";
+       };
+
+       backlight {
+               compatible = "pwm-backlight";
+               pwms = <&pwm 0 1000000 0>;
+               brightness-levels = <0 100 500 1000 1500 2000 2500 2800>;
+               default-brightness-level = <7>;
+               pinctrl-0 = <&pwm0_out>;
+               pinctrl-names = "default";
        };
 
        fixed-rate-clocks {
                };
        };
 
-       backlight {
-               compatible = "pwm-backlight";
-               pwms = <&pwm 0 1000000 0>;
-               brightness-levels = <0 100 500 1000 1500 2000 2500 2800>;
-               default-brightness-level = <7>;
-               pinctrl-0 = <&pwm0_out>;
-               pinctrl-names = "default";
+       memory {
+               reg = <0x20000000 0x80000000>;
        };
 
        sound {
                compatible = "google,snow-audio-max98090";
 
+               samsung,model = "Peach-Pit-I2S-MAX98090";
                samsung,i2s-controller = <&i2s0>;
                samsung,audio-codec = <&max98090>;
        };
                pinctrl-0 = <&usb301_vbus_en>;
                enable-active-high;
        };
-};
 
-&pinctrl_0 {
-       max98090_irq: max98090-irq {
-               samsung,pins = "gpx0-2";
-               samsung,pin-function = <0>;
-               samsung,pin-pud = <0>;
-               samsung,pin-drv = <0>;
+       vbat: fixed-regulator {
+               compatible = "regulator-fixed";
+               regulator-name = "vbat-supply";
+               regulator-boot-on;
+               regulator-always-on;
        };
+};
 
-       tpm_irq: tpm-irq {
-               samsung,pins = "gpx1-0";
-               samsung,pin-function = <0>;
-               samsung,pin-pud = <0>;
-               samsung,pin-drv = <0>;
-       };
+&dp {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&dp_hpd_gpio>;
+       samsung,color-space = <0>;
+       samsung,dynamic-range = <0>;
+       samsung,ycbcr-coeff = <0>;
+       samsung,color-depth = <1>;
+       samsung,link-rate = <0x06>;
+       samsung,lane-count = <2>;
+       samsung,hpd-gpio = <&gpx2 6 0>;
 
-       power_key_irq: power-key-irq {
-               samsung,pins = "gpx1-2";
-               samsung,pin-function = <0>;
-               samsung,pin-pud = <0>;
-               samsung,pin-drv = <0>;
-       };
+       display-timings {
+               native-mode = <&timing1>;
 
-       hdmi_hpd_irq: hdmi-hpd-irq {
-               samsung,pins = "gpx3-7";
-               samsung,pin-function = <0>;
-               samsung,pin-pud = <1>;
-               samsung,pin-drv = <0>;
+               timing1: timing@1 {
+                       clock-frequency = <70589280>;
+                       hactive = <1366>;
+                       vactive = <768>;
+                       hfront-porch = <40>;
+                       hback-porch = <40>;
+                       hsync-len = <32>;
+                       vback-porch = <10>;
+                       vfront-porch = <12>;
+                       vsync-len = <6>;
+               };
        };
+};
 
-       dp_hpd_gpio: dp_hpd_gpio {
-               samsung,pins = "gpx2-6";
-               samsung,pin-function = <0>;
-               samsung,pin-pud = <3>;
-               samsung,pin-drv = <0>;
-       };
+&fimd {
+       status = "okay";
+       samsung,invert-vclk;
 };
 
-&pinctrl_3 {
-       usb300_vbus_en: usb300-vbus-en {
-               samsung,pins = "gph0-0";
-               samsung,pin-function = <1>;
-               samsung,pin-pud = <0>;
-               samsung,pin-drv = <0>;
+&hdmi {
+       status = "okay";
+       hpd-gpio = <&gpx3 7 GPIO_ACTIVE_HIGH>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&hdmi_hpd_irq>;
+       ddc = <&i2c_2>;
+};
+
+&hsi2c_7 {
+       status = "okay";
+
+       max98090: codec@10 {
+               compatible = "maxim,max98090";
+               reg = <0x10>;
+               interrupts = <2 0>;
+               interrupt-parent = <&gpx0>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&max98090_irq>;
        };
+};
 
-       usb301_vbus_en: usb301-vbus-en {
-               samsung,pins = "gph0-1";
-               samsung,pin-function = <1>;
-               samsung,pin-pud = <0>;
-               samsung,pin-drv = <0>;
+&hsi2c_9 {
+       status = "okay";
+       clock-frequency = <400000>;
+
+       tpm@20 {
+               compatible = "infineon,slb9645tt";
+               reg = <0x20>;
+
+               /* Unused irq; but still need to configure the pins */
+               pinctrl-names = "default";
+               pinctrl-0 = <&tpm_irq>;
        };
 };
 
-&rtc {
+&i2c_2 {
        status = "okay";
+       samsung,i2c-sda-delay = <100>;
+       samsung,i2c-max-bus-freq = <66000>;
+       samsung,i2c-slave-addr = <0x50>;
 };
 
-&uart_3 {
+&i2s0 {
        status = "okay";
 };
 
        };
 };
 
-&hsi2c_7 {
-       status = "okay";
 
-       max98090: codec@10 {
-               compatible = "maxim,max98090";
-               reg = <0x10>;
-               interrupts = <2 0>;
-               interrupt-parent = <&gpx0>;
-               pinctrl-names = "default";
-               pinctrl-0 = <&max98090_irq>;
+&pinctrl_0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&mask_tpm_reset>;
+
+       max98090_irq: max98090-irq {
+               samsung,pins = "gpx0-2";
+               samsung,pin-function = <0>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       /* We need GPX0_6 to be low at sleep time; just keep it low always */
+       mask_tpm_reset: mask-tpm-reset {
+               samsung,pins = "gpx0-6";
+               samsung,pin-function = <1>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+               samsung,pin-val = <0>;
+       };
+
+       tpm_irq: tpm-irq {
+               samsung,pins = "gpx1-0";
+               samsung,pin-function = <0>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       power_key_irq: power-key-irq {
+               samsung,pins = "gpx1-2";
+               samsung,pin-function = <0>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       ec_irq: ec-irq {
+               samsung,pins = "gpx1-5";
+               samsung,pin-function = <0>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       tps65090_irq: tps65090-irq {
+               samsung,pins = "gpx2-5";
+               samsung,pin-function = <0>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       dp_hpd_gpio: dp_hpd_gpio {
+               samsung,pins = "gpx2-6";
+               samsung,pin-function = <0>;
+               samsung,pin-pud = <3>;
+               samsung,pin-drv = <0>;
+       };
+
+       hdmi_hpd_irq: hdmi-hpd-irq {
+               samsung,pins = "gpx3-7";
+               samsung,pin-function = <0>;
+               samsung,pin-pud = <1>;
+               samsung,pin-drv = <0>;
        };
 };
 
-&hsi2c_9 {
-       status = "okay";
-       clock-frequency = <400000>;
+&pinctrl_3 {
+       /* Drive SPI lines at x2 for better integrity */
+       spi2-bus {
+               samsung,pin-drv = <2>;
+       };
 
-       tpm@20 {
-               compatible = "infineon,slb9645tt";
-               reg = <0x20>;
+       /* Drive SPI chip select at x2 for better integrity */
+       ec_spi_cs: ec-spi-cs {
+               samsung,pins = "gpb1-2";
+               samsung,pin-function = <1>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <2>;
+       };
 
-               /* Unused irq; but still need to configure the pins */
-               pinctrl-names = "default";
-               pinctrl-0 = <&tpm_irq>;
+       usb300_vbus_en: usb300-vbus-en {
+               samsung,pins = "gph0-0";
+               samsung,pin-function = <1>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       usb301_vbus_en: usb301-vbus-en {
+               samsung,pins = "gph0-1";
+               samsung,pin-function = <1>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
        };
 };
 
-&i2c_2 {
+&rtc {
        status = "okay";
-       samsung,i2c-sda-delay = <100>;
-       samsung,i2c-max-bus-freq = <66000>;
-       samsung,i2c-slave-addr = <0x50>;
 };
 
-&hdmi {
+&spi_2 {
+       status = "okay";
+       num-cs = <1>;
+       samsung,spi-src-clk = <0>;
+       cs-gpios = <&gpb1 2 0>;
+
+       cros_ec: cros-ec@0 {
+               compatible = "google,cros-ec-spi";
+               interrupt-parent = <&gpx1>;
+               interrupts = <5 0>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&ec_spi_cs &ec_irq>;
+               reg = <0>;
+               spi-max-frequency = <3125000>;
+
+               controller-data {
+                       samsung,spi-feedback-delay = <1>;
+               };
+
+               i2c-tunnel {
+                       compatible = "google,cros-ec-i2c-tunnel";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       google,remote-bus = <0>;
+
+                       battery: sbs-battery@b {
+                               compatible = "sbs,sbs-battery";
+                               reg = <0xb>;
+                               sbs,poll-retry-count = <1>;
+                               sbs,i2c-retry-count = <2>;
+                       };
+
+                       power-regulator@48 {
+                               compatible = "ti,tps65090";
+                               reg = <0x48>;
+
+                               /*
+                                * Config irq to disable internal pulls
+                                * even though we run in polling mode.
+                                */
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&tps65090_irq>;
+
+                               vsys1-supply = <&vbat>;
+                               vsys2-supply = <&vbat>;
+                               vsys3-supply = <&vbat>;
+                               infet1-supply = <&vbat>;
+                               infet2-supply = <&vbat>;
+                               infet3-supply = <&vbat>;
+                               infet4-supply = <&vbat>;
+                               infet5-supply = <&vbat>;
+                               infet6-supply = <&vbat>;
+                               infet7-supply = <&vbat>;
+                               vsys-l1-supply = <&vbat>;
+                               vsys-l2-supply = <&vbat>;
+
+                               regulators {
+                                       tps65090_dcdc1: dcdc1 {
+                                               ti,enable-ext-control;
+                                       };
+                                       tps65090_dcdc2: dcdc2 {
+                                               ti,enable-ext-control;
+                                       };
+                                       tps65090_dcdc3: dcdc3 {
+                                               ti,enable-ext-control;
+                                       };
+                                       tps65090_fet1: fet1 {
+                                               regulator-name = "vcd_led";
+                                       };
+                                       tps65090_fet2: fet2 {
+                                               regulator-name = "video_mid";
+                                               regulator-always-on;
+                                       };
+                                       tps65090_fet3: fet3 {
+                                               regulator-name = "wwan_r";
+                                               regulator-always-on;
+                                       };
+                                       tps65090_fet4: fet4 {
+                                               regulator-name = "sdcard";
+                                               regulator-always-on;
+                                       };
+                                       tps65090_fet5: fet5 {
+                                               regulator-name = "camout";
+                                       };
+                                       tps65090_fet6: fet6 {
+                                               regulator-name = "lcd_vdd";
+                                       };
+                                       tps65090_fet7: fet7 {
+                                               regulator-name = "video_mid_1a";
+                                               regulator-always-on;
+                                       };
+                                       tps65090_ldo1: ldo1 {
+                                       };
+                                       tps65090_ldo2: ldo2 {
+                                       };
+                               };
+
+                               charger {
+                                       compatible = "ti,tps65090-charger";
+                               };
+                       };
+               };
+       };
+};
+
+&uart_3 {
        status = "okay";
-       hpd-gpio = <&gpx3 7 GPIO_ACTIVE_HIGH>;
-       pinctrl-names = "default";
-       pinctrl-0 = <&hdmi_hpd_irq>;
-       ddc = <&i2c_2>;
 };
 
 &usbdrd_phy0 {
        timeout-sec = <32>;
 };
 
-&i2s0 {
-       status = "okay";
-};
-
-&fimd {
-       status = "okay";
-       samsung,invert-vclk;
-};
-
-&dp {
-       status = "okay";
-       pinctrl-names = "default";
-       pinctrl-0 = <&dp_hpd_gpio>;
-       samsung,color-space = <0>;
-       samsung,dynamic-range = <0>;
-       samsung,ycbcr-coeff = <0>;
-       samsung,color-depth = <1>;
-       samsung,link-rate = <0x06>;
-       samsung,lane-count = <2>;
-       samsung,hpd-gpio = <&gpx2 6 0>;
-
-       display-timings {
-               native-mode = <&timing1>;
-
-               timing1: timing@1 {
-                       clock-frequency = <70589280>;
-                       hactive = <1366>;
-                       vactive = <768>;
-                       hfront-porch = <40>;
-                       hback-porch = <40>;
-                       hsync-len = <32>;
-                       vback-porch = <10>;
-                       vfront-porch = <12>;
-                       vsync-len = <6>;
-               };
-       };
-};
+#include "cros-ec-keyboard.dtsi"
index a40a5c2b5a4ff1a776a74e3fe24be0284140b8b9..95ec37dff3e85fca734a36061072d6ef07444224 100644 (file)
                clock-names = "oscclk", "pclk0", "clk0";
        };
 
-       disp_pd: power-domain@100440C0 {
-               compatible = "samsung,exynos4210-pd";
-               reg = <0x100440C0 0x20>;
-       };
-
        msc_pd: power-domain@10044120 {
                compatible = "samsung,exynos4210-pd";
                reg = <0x10044120 0x20>;
                phy-names = "dp";
        };
 
-       fimd: fimd@14400000 {
+       mipi_phy: video-phy@10040714 {
+               compatible = "samsung,s5pv210-mipi-video-phy";
+               reg = <0x10040714 12>;
+               #phy-cells = <1>;
+       };
+
+       dsi@14500000 {
+               compatible = "samsung,exynos5410-mipi-dsi";
+               reg = <0x14500000 0x10000>;
+               interrupts = <0 82 0>;
                samsung,power-domain = <&disp_pd>;
+               phys = <&mipi_phy 1>;
+               phy-names = "dsim";
+               clocks = <&clock CLK_DSIM1>, <&clock CLK_SCLK_MIPI1>;
+               clock-names = "bus_clk", "pll_clk";
+               #address-cells = <1>;
+               #size-cells = <0>;
+               status = "disabled";
+       };
+
+       fimd: fimd@14400000 {
                clocks = <&clock CLK_SCLK_FIMD1>, <&clock CLK_FIMD1>;
                clock-names = "sclk_fimd", "fimd";
        };
index f3af2079a06358a57695786ea61667fe7b4c9a4d..f3ee48bbe05f57d0a308f626dca96b5668b177c2 100644 (file)
                "google,pi", "google,peach", "samsung,exynos5800",
                "samsung,exynos5";
 
-       memory {
-               reg = <0x20000000 0x80000000>;
+       aliases {
+               /* Assign 20 so we don't get confused w/ builtin ones */
+               i2c20 = "/spi@12d40000/cros-ec@0/i2c-tunnel";
+       };
+
+       backlight {
+               compatible = "pwm-backlight";
+               pwms = <&pwm 0 1000000 0>;
+               brightness-levels = <0 100 500 1000 1500 2000 2500 2800>;
+               default-brightness-level = <7>;
+               pinctrl-0 = <&pwm0_out>;
+               pinctrl-names = "default";
        };
 
        fixed-rate-clocks {
                };
        };
 
-       backlight {
-               compatible = "pwm-backlight";
-               pwms = <&pwm 0 1000000 0>;
-               brightness-levels = <0 100 500 1000 1500 2000 2500 2800>;
-               default-brightness-level = <7>;
-               pinctrl-0 = <&pwm0_out>;
-               pinctrl-names = "default";
+       memory {
+               reg = <0x20000000 0x80000000>;
+       };
+
+       sound {
+               compatible = "google,snow-audio-max98091";
+
+               samsung,model = "Peach-Pi-I2S-MAX98091";
+               samsung,i2s-controller = <&i2s0>;
+               samsung,audio-codec = <&max98091>;
        };
 
        usb300_vbus_reg: regulator-usb300 {
                pinctrl-0 = <&usb301_vbus_en>;
                enable-active-high;
        };
-};
 
-&pinctrl_0 {
-       tpm_irq: tpm-irq {
-               samsung,pins = "gpx1-0";
-               samsung,pin-function = <0>;
-               samsung,pin-pud = <0>;
-               samsung,pin-drv = <0>;
+       vbat: fixed-regulator {
+               compatible = "regulator-fixed";
+               regulator-name = "vbat-supply";
+               regulator-boot-on;
+               regulator-always-on;
        };
+};
 
-       power_key_irq: power-key-irq {
-               samsung,pins = "gpx1-2";
-               samsung,pin-function = <0>;
-               samsung,pin-pud = <0>;
-               samsung,pin-drv = <0>;
-       };
+&dp {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&dp_hpd_gpio>;
+       samsung,color-space = <0>;
+       samsung,dynamic-range = <0>;
+       samsung,ycbcr-coeff = <0>;
+       samsung,color-depth = <1>;
+       samsung,link-rate = <0x0a>;
+       samsung,lane-count = <2>;
+       samsung,hpd-gpio = <&gpx2 6 0>;
 
-       dp_hpd_gpio: dp_hpd_gpio {
-               samsung,pins = "gpx2-6";
-               samsung,pin-function = <0>;
-               samsung,pin-pud = <3>;
-               samsung,pin-drv = <0>;
-       };
+       display-timings {
+               native-mode = <&timing1>;
 
-       hdmi_hpd_irq: hdmi-hpd-irq {
-               samsung,pins = "gpx3-7";
-               samsung,pin-function = <0>;
-               samsung,pin-pud = <1>;
-               samsung,pin-drv = <0>;
+               timing1: timing@1 {
+                       clock-frequency = <150660000>;
+                       hactive = <1920>;
+                       vactive = <1080>;
+                       hfront-porch = <60>;
+                       hback-porch = <172>;
+                       hsync-len = <80>;
+                       vback-porch = <25>;
+                       vfront-porch = <10>;
+                       vsync-len = <10>;
+               };
        };
 };
 
-&pinctrl_3 {
-       usb300_vbus_en: usb300-vbus-en {
-               samsung,pins = "gph0-0";
-               samsung,pin-function = <1>;
-               samsung,pin-pud = <0>;
-               samsung,pin-drv = <0>;
+&fimd {
+       status = "okay";
+       samsung,invert-vclk;
+};
+
+&hdmi {
+       status = "okay";
+       hpd-gpio = <&gpx3 7 GPIO_ACTIVE_HIGH>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&hdmi_hpd_irq>;
+       ddc = <&i2c_2>;
+};
+
+&hsi2c_7 {
+       status = "okay";
+
+       max98091: codec@10 {
+               compatible = "maxim,max98091";
+               reg = <0x10>;
+               interrupts = <2 0>;
+               interrupt-parent = <&gpx0>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&max98091_irq>;
        };
+};
 
-       usb301_vbus_en: usb301-vbus-en {
-               samsung,pins = "gph0-1";
-               samsung,pin-function = <1>;
-               samsung,pin-pud = <0>;
-               samsung,pin-drv = <0>;
+&hsi2c_9 {
+       status = "okay";
+       clock-frequency = <400000>;
+
+       tpm@20 {
+               compatible = "infineon,slb9645tt";
+               reg = <0x20>;
+
+               /* Unused irq; but still need to configure the pins */
+               pinctrl-names = "default";
+               pinctrl-0 = <&tpm_irq>;
        };
 };
 
-&rtc {
+&i2c_2 {
        status = "okay";
+       samsung,i2c-sda-delay = <100>;
+       samsung,i2c-max-bus-freq = <66000>;
+       samsung,i2c-slave-addr = <0x50>;
 };
 
-&uart_3 {
+&i2s0 {
        status = "okay";
 };
 
        };
 };
 
-&dp {
-       status = "okay";
+
+&pinctrl_0 {
        pinctrl-names = "default";
-       pinctrl-0 = <&dp_hpd_gpio>;
-       samsung,color-space = <0>;
-       samsung,dynamic-range = <0>;
-       samsung,ycbcr-coeff = <0>;
-       samsung,color-depth = <1>;
-       samsung,link-rate = <0x0a>;
-       samsung,lane-count = <2>;
-       samsung,hpd-gpio = <&gpx2 6 0>;
+       pinctrl-0 = <&mask_tpm_reset>;
 
-       display-timings {
-               native-mode = <&timing1>;
+       max98091_irq: max98091-irq {
+               samsung,pins = "gpx0-2";
+               samsung,pin-function = <0>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
 
-               timing1: timing@1 {
-                       clock-frequency = <150660000>;
-                       hactive = <1920>;
-                       vactive = <1080>;
-                       hfront-porch = <60>;
-                       hback-porch = <172>;
-                       hsync-len = <80>;
-                       vback-porch = <25>;
-                       vfront-porch = <10>;
-                       vsync-len = <10>;
-               };
+       /* We need GPX0_6 to be low at sleep time; just keep it low always */
+       mask_tpm_reset: mask-tpm-reset {
+               samsung,pins = "gpx0-6";
+               samsung,pin-function = <1>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+               samsung,pin-val = <0>;
        };
-};
 
-&fimd {
-       status = "okay";
-       samsung,invert-vclk;
+       tpm_irq: tpm-irq {
+               samsung,pins = "gpx1-0";
+               samsung,pin-function = <0>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       power_key_irq: power-key-irq {
+               samsung,pins = "gpx1-2";
+               samsung,pin-function = <0>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       ec_irq: ec-irq {
+               samsung,pins = "gpx1-5";
+               samsung,pin-function = <0>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       tps65090_irq: tps65090-irq {
+               samsung,pins = "gpx2-5";
+               samsung,pin-function = <0>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       dp_hpd_gpio: dp_hpd_gpio {
+               samsung,pins = "gpx2-6";
+               samsung,pin-function = <0>;
+               samsung,pin-pud = <3>;
+               samsung,pin-drv = <0>;
+       };
+
+       hdmi_hpd_irq: hdmi-hpd-irq {
+               samsung,pins = "gpx3-7";
+               samsung,pin-function = <0>;
+               samsung,pin-pud = <1>;
+               samsung,pin-drv = <0>;
+       };
 };
 
-&hsi2c_9 {
-       status = "okay";
-       clock-frequency = <400000>;
+&pinctrl_3 {
+       /* Drive SPI lines at x2 for better integrity */
+       spi2-bus {
+               samsung,pin-drv = <2>;
+       };
 
-       tpm@20 {
-               compatible = "infineon,slb9645tt";
-               reg = <0x20>;
-               /* Unused irq; but still need to configure the pins */
-               pinctrl-names = "default";
-               pinctrl-0 = <&tpm_irq>;
+       /* Drive SPI chip select at x2 for better integrity */
+       ec_spi_cs: ec-spi-cs {
+               samsung,pins = "gpb1-2";
+               samsung,pin-function = <1>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <2>;
+       };
+
+       usb300_vbus_en: usb300-vbus-en {
+               samsung,pins = "gph0-0";
+               samsung,pin-function = <1>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       usb301_vbus_en: usb301-vbus-en {
+               samsung,pins = "gph0-1";
+               samsung,pin-function = <1>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
        };
 };
 
-&i2c_2 {
+&rtc {
        status = "okay";
-       samsung,i2c-sda-delay = <100>;
-       samsung,i2c-max-bus-freq = <66000>;
-       samsung,i2c-slave-addr = <0x50>;
 };
 
-&hdmi {
+&spi_2 {
+       status = "okay";
+       num-cs = <1>;
+       samsung,spi-src-clk = <0>;
+       cs-gpios = <&gpb1 2 0>;
+
+       cros_ec: cros-ec@0 {
+               compatible = "google,cros-ec-spi";
+               interrupt-parent = <&gpx1>;
+               interrupts = <5 0>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&ec_spi_cs &ec_irq>;
+               reg = <0>;
+               spi-max-frequency = <3125000>;
+
+               controller-data {
+                       samsung,spi-feedback-delay = <1>;
+               };
+
+               i2c-tunnel {
+                       compatible = "google,cros-ec-i2c-tunnel";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       google,remote-bus = <0>;
+
+                       battery: sbs-battery@b {
+                               compatible = "sbs,sbs-battery";
+                               reg = <0xb>;
+                               sbs,poll-retry-count = <1>;
+                               sbs,i2c-retry-count = <2>;
+                       };
+
+                       power-regulator@48 {
+                               compatible = "ti,tps65090";
+                               reg = <0x48>;
+
+                               /*
+                                * Config irq to disable internal pulls
+                                * even though we run in polling mode.
+                                */
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&tps65090_irq>;
+
+                               vsys1-supply = <&vbat>;
+                               vsys2-supply = <&vbat>;
+                               vsys3-supply = <&vbat>;
+                               infet1-supply = <&vbat>;
+                               infet2-supply = <&vbat>;
+                               infet3-supply = <&vbat>;
+                               infet4-supply = <&vbat>;
+                               infet5-supply = <&vbat>;
+                               infet6-supply = <&vbat>;
+                               infet7-supply = <&vbat>;
+                               vsys-l1-supply = <&vbat>;
+                               vsys-l2-supply = <&vbat>;
+
+                               regulators {
+                                       tps65090_dcdc1: dcdc1 {
+                                               ti,enable-ext-control;
+                                       };
+                                       tps65090_dcdc2: dcdc2 {
+                                               ti,enable-ext-control;
+                                       };
+                                       tps65090_dcdc3: dcdc3 {
+                                               ti,enable-ext-control;
+                                       };
+                                       tps65090_fet1: fet1 {
+                                               regulator-name = "vcd_led";
+                                       };
+                                       tps65090_fet2: fet2 {
+                                               regulator-name = "video_mid";
+                                               regulator-always-on;
+                                       };
+                                       tps65090_fet3: fet3 {
+                                               regulator-name = "wwan_r";
+                                               regulator-always-on;
+                                       };
+                                       tps65090_fet4: fet4 {
+                                               regulator-name = "sdcard";
+                                               regulator-always-on;
+                                       };
+                                       tps65090_fet5: fet5 {
+                                               regulator-name = "camout";
+                                       };
+                                       tps65090_fet6: fet6 {
+                                               regulator-name = "lcd_vdd";
+                                       };
+                                       tps65090_fet7: fet7 {
+                                               regulator-name = "video_mid_1a";
+                                               regulator-always-on;
+                                       };
+                                       tps65090_ldo1: ldo1 {
+                                       };
+                                       tps65090_ldo2: ldo2 {
+                                       };
+                               };
+
+                               charger {
+                                       compatible = "ti,tps65090-charger";
+                               };
+                       };
+               };
+       };
+};
+
+&uart_3 {
        status = "okay";
-       hpd-gpio = <&gpx3 7 GPIO_ACTIVE_HIGH>;
-       pinctrl-names = "default";
-       pinctrl-0 = <&hdmi_hpd_irq>;
-       ddc = <&i2c_2>;
 };
 
 &usbdrd_phy0 {
 &watchdog {
        timeout-sec = <32>;
 };
+
+#include "cros-ec-keyboard.dtsi"
index 230099bb31c8686e3d2cb7037fe5c9850561d969..0d0e62489d9379587b0a7aea6a4c12982601da4a 100644 (file)
                        compatible = "atmel,osc", "fixed-clock";
                        clock-frequency = <6000000>;
                };
+
+               main_xtal {
+                       clock-frequency = <6000000>;
+               };
        };
 
        ahb {
index 83a5b8685bd961818bfa8c9d6bea6bc3bff4ff24..6cbb62e5c6a9eb0c98042aaec8495e72c4e28640 100644 (file)
@@ -33,6 +33,7 @@
        cpus {
                #address-cells = <1>;
                #size-cells = <0>;
+               enable-method = "hisilicon,hi3620-smp";
 
                cpu@0 {
                        device_type = "cpu";
diff --git a/arch/arm/boot/dts/hisi-x5hd2-dkb.dts b/arch/arm/boot/dts/hisi-x5hd2-dkb.dts
new file mode 100644 (file)
index 0000000..05b44c2
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2013-2014 Linaro Ltd.
+ * Copyright (c) 2013-2014 Hisilicon Limited.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  publishhed by the Free Software Foundation.
+ */
+
+/dts-v1/;
+#include "hisi-x5hd2.dtsi"
+
+/ {
+       model = "Hisilicon HIX5HD2 Development Board";
+       compatible = "hisilicon,hix5hd2";
+
+       chosen {
+               bootargs = "console=ttyAMA0,115200 earlyprintk";
+       };
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+               enable-method = "hisilicon,hix5hd2-smp";
+
+               cpu@0 {
+                       compatible = "arm,cortex-a9";
+                       device_type = "cpu";
+                       reg = <0>;
+                       next-level-cache = <&l2>;
+               };
+
+               cpu@1 {
+                       compatible = "arm,cortex-a9";
+                       device_type = "cpu";
+                       reg = <1>;
+                       next-level-cache = <&l2>;
+               };
+       };
+
+       memory {
+               device_type = "memory";
+               reg = <0x00000000 0x80000000>;
+       };
+};
+
+&timer0 {
+       status = "okay";
+};
+
+&uart0 {
+       status = "okay";
+};
diff --git a/arch/arm/boot/dts/hisi-x5hd2.dtsi b/arch/arm/boot/dts/hisi-x5hd2.dtsi
new file mode 100644 (file)
index 0000000..f85ba29
--- /dev/null
@@ -0,0 +1,170 @@
+/*
+ * Copyright (c) 2013-2014 Linaro Ltd.
+ * Copyright (c) 2013-2014 Hisilicon Limited.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * publishhed by the Free Software Foundation.
+ */
+
+#include "skeleton.dtsi"
+#include <dt-bindings/clock/hix5hd2-clock.h>
+
+/ {
+       aliases {
+               serial0 = &uart0;
+       };
+
+       gic: interrupt-controller@f8a01000 {
+               compatible = "arm,cortex-a9-gic";
+               #interrupt-cells = <3>;
+               #address-cells = <0>;
+               interrupt-controller;
+               /* gic dist base, gic cpu base */
+               reg = <0xf8a01000 0x1000>, <0xf8a00100 0x100>;
+       };
+
+       soc {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "simple-bus";
+               interrupt-parent = <&gic>;
+               ranges = <0 0xf8000000 0x8000000>;
+
+               amba {
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       compatible = "arm,amba-bus";
+                       ranges;
+
+                       timer0: timer@00002000 {
+                               compatible = "arm,sp804", "arm,primecell";
+                               reg = <0x00002000 0x1000>;
+                               /* timer00 & timer01 */
+                               interrupts = <0 24 4>;
+                               clocks = <&clock HIX5HD2_FIXED_24M>;
+                               status = "disabled";
+                       };
+
+                       timer1: timer@00a29000 {
+                               /*
+                                * Only used in NORMAL state, not available ins
+                                * SLOW or DOZE state.
+                                * The rate is fixed in 24MHz.
+                                */
+                               compatible = "arm,sp804", "arm,primecell";
+                               reg = <0x00a29000 0x1000>;
+                               /* timer10 & timer11 */
+                               interrupts = <0 25 4>;
+                               clocks = <&clock HIX5HD2_FIXED_24M>;
+                               status = "disabled";
+                       };
+
+                       timer2: timer@00a2a000 {
+                               compatible = "arm,sp804", "arm,primecell";
+                               reg = <0x00a2a000 0x1000>;
+                               /* timer20 & timer21 */
+                               interrupts = <0 26 4>;
+                               clocks = <&clock HIX5HD2_FIXED_24M>;
+                               status = "disabled";
+                       };
+
+                       timer3: timer@00a2b000 {
+                               compatible = "arm,sp804", "arm,primecell";
+                               reg = <0x00a2b000 0x1000>;
+                               /* timer30 & timer31 */
+                               interrupts = <0 27 4>;
+                               clocks = <&clock HIX5HD2_FIXED_24M>;
+                               status = "disabled";
+                       };
+
+                       timer4: timer@00a81000 {
+                               compatible = "arm,sp804", "arm,primecell";
+                               reg = <0x00a81000 0x1000>;
+                               /* timer30 & timer31 */
+                               interrupts = <0 28 4>;
+                               clocks = <&clock HIX5HD2_FIXED_24M>;
+                               status = "disabled";
+                       };
+
+                       uart0: uart@00b00000 {
+                               compatible = "arm,pl011", "arm,primecell";
+                               reg = <0x00b00000 0x1000>;
+                               interrupts = <0 49 4>;
+                               clocks = <&clock HIX5HD2_FIXED_83M>;
+                               clock-names = "apb_pclk";
+                               status = "disabled";
+                       };
+
+                       uart1: uart@00006000 {
+                               compatible = "arm,pl011", "arm,primecell";
+                               reg = <0x00006000 0x1000>;
+                               interrupts = <0 50 4>;
+                               clocks = <&clock HIX5HD2_FIXED_83M>;
+                               clock-names = "apb_pclk";
+                               status = "disabled";
+                       };
+
+                       uart2: uart@00b02000 {
+                               compatible = "arm,pl011", "arm,primecell";
+                               reg = <0x00b02000 0x1000>;
+                               interrupts = <0 51 4>;
+                               clocks = <&clock HIX5HD2_FIXED_83M>;
+                               clock-names = "apb_pclk";
+                               status = "disabled";
+                       };
+
+                       uart3: uart@00b03000 {
+                               compatible = "arm,pl011", "arm,primecell";
+                               reg = <0x00b03000 0x1000>;
+                               interrupts = <0 52 4>;
+                               clocks = <&clock HIX5HD2_FIXED_83M>;
+                               clock-names = "apb_pclk";
+                               status = "disabled";
+                       };
+
+                       uart4: uart@00b04000 {
+                               compatible = "arm,pl011", "arm,primecell";
+                               reg = <0xb04000 0x1000>;
+                               interrupts = <0 53 4>;
+                               clocks = <&clock HIX5HD2_FIXED_83M>;
+                               clock-names = "apb_pclk";
+                               status = "disabled";
+                       };
+               };
+
+               local_timer@00a00600 {
+                       compatible = "arm,cortex-a9-twd-timer";
+                       reg = <0x00a00600 0x20>;
+                       interrupts = <1 13 0xf01>;
+               };
+
+               l2: l2-cache {
+                       compatible = "arm,pl310-cache";
+                       reg = <0x00a10000 0x100000>;
+                       interrupts = <0 15 4>;
+                       cache-unified;
+                       cache-level = <2>;
+               };
+
+               sysctrl: system-controller@00000000 {
+                       compatible = "hisilicon,sysctrl";
+                       reg = <0x00000000 0x1000>;
+                       reboot-offset = <0x4>;
+               };
+
+               cpuctrl@00a22000 {
+                       compatible = "hisilicon,cpuctrl";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       reg = <0x00a22000 0x2000>;
+                       ranges = <0 0x00a22000 0x2000>;
+
+                       clock: clock@0 {
+                               compatible = "hisilicon,hix5hd2-clock";
+                               reg = <0 0x2000>;
+                               #clock-cells = <1>;
+                       };
+               };
+       };
+};
diff --git a/arch/arm/boot/dts/imx25-eukrea-mbimxsd25-baseboard-cmo-qvga.dts b/arch/arm/boot/dts/imx25-eukrea-mbimxsd25-baseboard-cmo-qvga.dts
new file mode 100644 (file)
index 0000000..68d0834
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2013 Eukréa Electromatique <denis@eukrea.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include "imx25-eukrea-mbimxsd25-baseboard.dts"
+
+/ {
+       model = "Eukrea MBIMXSD25 with the CMO-QVGA Display";
+       compatible = "eukrea,mbimxsd25-baseboard-cmo-qvga", "eukrea,mbimxsd25-baseboard", "eukrea,cpuimx25", "fsl,imx25";
+
+       cmo_qvga: display {
+               model = "CMO-QVGA";
+               bits-per-pixel = <16>;
+               fsl,pcr = <0xcad08b80>;
+               bus-width = <18>;
+               native-mode = <&qvga_timings>;
+               display-timings {
+                       qvga_timings: 320x240 {
+                               clock-frequency = <6500000>;
+                               hactive = <320>;
+                               vactive = <240>;
+                               hback-porch = <30>;
+                               hfront-porch = <38>;
+                               vback-porch = <20>;
+                               vfront-porch = <3>;
+                               hsync-len = <15>;
+                               vsync-len = <4>;
+                       };
+               };
+       };
+
+       regulators {
+               compatible = "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               reg_lcd_3v3: regulator@0 {
+                       compatible = "regulator-fixed";
+                       reg = <0>;
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&pinctrl_reg_lcd_3v3>;
+                       regulator-name = "lcd-3v3";
+                       regulator-min-microvolt = <3300000>;
+                       regulator-max-microvolt = <3300000>;
+                       gpio = <&gpio1 26 GPIO_ACTIVE_HIGH>;
+                       enable-active-high;
+               };
+       };
+};
+
+&iomuxc {
+       imx25-eukrea-mbimxsd25-baseboard-cmo-qvga {
+               pinctrl_reg_lcd_3v3: reg_lcd_3v3 {
+                       fsl,pins = <MX25_PAD_PWM__GPIO_1_26 0x80000000>;
+               };
+       };
+};
+
+&lcdc {
+       display = <&cmo_qvga>;
+       fsl,lpccr = <0x00a903ff>;
+       lcd-supply = <&reg_lcd_3v3>;
+       status = "okay";
+};
diff --git a/arch/arm/boot/dts/imx25-eukrea-mbimxsd25-baseboard-dvi-svga.dts b/arch/arm/boot/dts/imx25-eukrea-mbimxsd25-baseboard-dvi-svga.dts
new file mode 100644 (file)
index 0000000..8eee2f6
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2013 Eukréa Electromatique <denis@eukrea.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include "imx25-eukrea-mbimxsd25-baseboard.dts"
+
+/ {
+       model = "Eukrea MBIMXSD25 with the DVI-SVGA Display";
+       compatible = "eukrea,mbimxsd25-baseboard-dvi-svga", "eukrea,mbimxsd25-baseboard", "eukrea,cpuimx25", "fsl,imx25";
+
+       dvi_svga: display {
+               model = "DVI-SVGA";
+               bits-per-pixel = <16>;
+               fsl,pcr = <0xfa208b80>;
+               bus-width = <18>;
+               native-mode = <&dvi_svga_timings>;
+               display-timings {
+                       dvi_svga_timings: 800x600 {
+                               clock-frequency = <40000000>;
+                               hactive = <800>;
+                               vactive = <600>;
+                               hback-porch = <75>;
+                               hfront-porch = <75>;
+                               vback-porch = <7>;
+                               vfront-porch = <75>;
+                               hsync-len = <7>;
+                               vsync-len = <7>;
+                       };
+               };
+       };
+};
+
+&lcdc {
+       display = <&dvi_svga>;
+       status = "okay";
+};
diff --git a/arch/arm/boot/dts/imx25-eukrea-mbimxsd25-baseboard-dvi-vga.dts b/arch/arm/boot/dts/imx25-eukrea-mbimxsd25-baseboard-dvi-vga.dts
new file mode 100644 (file)
index 0000000..447da62
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2013 Eukréa Electromatique <denis@eukrea.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include "imx25-eukrea-mbimxsd25-baseboard.dts"
+
+/ {
+       model = "Eukrea MBIMXSD25 with the DVI-VGA Display";
+       compatible = "eukrea,mbimxsd25-baseboard-dvi-vga", "eukrea,mbimxsd25-baseboard", "eukrea,cpuimx25", "fsl,imx25";
+
+       dvi_vga: display {
+               model = "DVI-VGA";
+               bits-per-pixel = <16>;
+               fsl,pcr = <0xfa208b80>;
+               bus-width = <18>;
+               native-mode = <&dvi_vga_timings>;
+               display-timings {
+                       dvi_vga_timings: 640x480 {
+                               clock-frequency = <31250000>;
+                               hactive = <640>;
+                               vactive = <480>;
+                               hback-porch = <100>;
+                               hfront-porch = <100>;
+                               vback-porch = <7>;
+                               vfront-porch = <100>;
+                               hsync-len = <7>;
+                               vsync-len = <7>;
+                       };
+               };
+       };
+};
+
+&lcdc {
+       display = <&dvi_vga>;
+       status = "okay";
+};
index ad12da38fc922874823828e3369b64b7d1ad9474..ed1d0b4578ef99402f22941b818451ac366518cf 100644 (file)
 
 &ssi1 {
        codec-handle = <&tlv320aic23>;
-       fsl,mode = "i2s-slave";
        status = "okay";
 };
 
index c608942b8a3b65605ac8156fb9e9fe511b5c2792..9c21b15837627fcf2a98032183d77e2a8be153db 100644 (file)
 
 &ssi1 {
        codec-handle = <&codec>;
-       fsl,mode = "i2s-slave";
        status = "okay";
 };
 
        dr_mode = "host";
        status = "okay";
 };
+
+&usbotg {
+       phy_type = "utmi";
+       dr_mode = "otg";
+       external-vbus-divider;
+       status = "okay";
+};
index bb74d9582b7e2e0627acf7f3a9adb75bc299f9f5..c1740396b2c95ef8f0860ae5c4ce5c829a22ecab 100644 (file)
                        gpt4: timer@53f84000 {
                                compatible = "fsl,imx25-gpt", "fsl,imx31-gpt";
                                reg = <0x53f84000 0x4000>;
-                               clocks = <&clks 9>, <&clks 45>;
+                               clocks = <&clks 95>, <&clks 47>;
                                clock-names = "ipg", "per";
                                interrupts = <1>;
                        };
                        gpt3: timer@53f88000 {
                                compatible = "fsl,imx25-gpt", "fsl,imx31-gpt";
                                reg = <0x53f88000 0x4000>;
-                               clocks = <&clks 9>, <&clks 47>;
+                               clocks = <&clks 94>, <&clks 47>;
                                clock-names = "ipg", "per";
                                interrupts = <29>;
                        };
                        gpt2: timer@53f8c000 {
                                compatible = "fsl,imx25-gpt", "fsl,imx31-gpt";
                                reg = <0x53f8c000 0x4000>;
-                               clocks = <&clks 9>, <&clks 47>;
+                               clocks = <&clks 93>, <&clks 47>;
                                clock-names = "ipg", "per";
                                interrupts = <53>;
                        };
                        gpt1: timer@53f90000 {
                                compatible = "fsl,imx25-gpt", "fsl,imx31-gpt";
                                reg = <0x53f90000 0x4000>;
-                               clocks = <&clks 9>, <&clks 47>;
+                               clocks = <&clks 92>, <&clks 47>;
                                clock-names = "ipg", "per";
                                interrupts = <54>;
                        };
diff --git a/arch/arm/boot/dts/imx27-eukrea-cpuimx27.dtsi b/arch/arm/boot/dts/imx27-eukrea-cpuimx27.dtsi
new file mode 100644 (file)
index 0000000..e224263
--- /dev/null
@@ -0,0 +1,296 @@
+/*
+ * Copyright (C) 2014 Alexander Shiyan <shc_work@mail.ru>
+ *
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/dts-v1/;
+#include "imx27.dtsi"
+
+/ {
+       model = "Eukrea CPUIMX27";
+       compatible = "eukrea,cpuimx27", "fsl,imx27";
+
+       memory {
+               reg = <0xa0000000 0x04000000>;
+       };
+
+       clocks {
+               #address-cells = <1>;
+               #size-cells = <0>;
+               compatible = "simple-bus";
+
+               clk14745600: clock@0 {
+                       #clock-cells = <0>;
+                       compatible = "fixed-clock";
+                       clock-frequency = <14745600>;
+                       reg = <0>;
+               };
+       };
+};
+
+&fec {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_fec>;
+       status = "okay";
+};
+
+&i2c1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c1>;
+       status = "okay";
+
+       pcf8563@51 {
+               compatible = "nxp,pcf8563";
+               reg = <0x51>;
+       };
+};
+
+&nfc {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_nfc>;
+       nand-bus-width = <8>;
+       nand-ecc-mode = "hw";
+       nand-on-flash-bbt;
+       status = "okay";
+};
+
+&owire {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_owire>;
+       status = "okay";
+};
+
+&sdhci2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_sdhc2>;
+       bus-width = <4>;
+       non-removable;
+       status = "okay";
+};
+
+&uart4 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart4>;
+       fsl,uart-has-rtscts;
+       status = "okay";
+};
+
+&usbh2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usbh2>;
+       dr_mode = "host";
+       phy_type = "ulpi";
+       disable-over-current;
+       status = "okay";
+};
+
+&usbotg {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usbotg>;
+       dr_mode = "otg";
+       phy_type = "ulpi";
+       disable-over-current;
+       status = "okay";
+};
+
+&weim {
+       status = "okay";
+
+       nor: nor@0,0 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "cfi-flash";
+               reg = <0 0x00000000 0x04000000>;
+               bank-width = <2>;
+               linux,mtd-name = "physmap-flash.0";
+               fsl,weim-cs-timing = <0x00008f03 0xa0330d01 0x002208c0>;
+       };
+
+       uart8250@3,200000 {
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_uart8250_1>;
+               compatible = "ns8250";
+               clocks = <&clk14745600>;
+               fsl,weim-cs-timing = <0x0000d603 0x0d1d0d01 0x00d20000>;
+               interrupts = <&gpio2 23 IRQ_TYPE_LEVEL_LOW>;
+               reg = <3 0x200000 0x1000>;
+               reg-shift = <1>;
+               reg-io-width = <1>;
+               no-loopback-test;
+       };
+
+       uart8250@3,400000 {
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_uart8250_2>;
+               compatible = "ns8250";
+               clocks = <&clk14745600>;
+               fsl,weim-cs-timing = <0x0000d603 0x0d1d0d01 0x00d20000>;
+               interrupts = <&gpio2 22 IRQ_TYPE_LEVEL_LOW>;
+               reg = <3 0x400000 0x1000>;
+               reg-shift = <1>;
+               reg-io-width = <1>;
+               no-loopback-test;
+       };
+
+       uart8250@3,800000 {
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_uart8250_3>;
+               compatible = "ns8250";
+               clocks = <&clk14745600>;
+               fsl,weim-cs-timing = <0x0000d603 0x0d1d0d01 0x00d20000>;
+               interrupts = <&gpio2 27 IRQ_TYPE_LEVEL_LOW>;
+               reg = <3 0x800000 0x1000>;
+               reg-shift = <1>;
+               reg-io-width = <1>;
+               no-loopback-test;
+       };
+
+       uart8250@3,1000000 {
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_uart8250_4>;
+               compatible = "ns8250";
+               clocks = <&clk14745600>;
+               fsl,weim-cs-timing = <0x0000d603 0x0d1d0d01 0x00d20000>;
+               interrupts = <&gpio2 30 IRQ_TYPE_LEVEL_LOW>;
+               reg = <3 0x1000000 0x1000>;
+               reg-shift = <1>;
+               reg-io-width = <1>;
+               no-loopback-test;
+       };
+};
+
+&iomuxc {
+       imx27-eukrea-cpuimx27 {
+               pinctrl_fec: fecgrp {
+                       fsl,pins = <
+                               MX27_PAD_SD3_CMD__FEC_TXD0              0x0
+                               MX27_PAD_SD3_CLK__FEC_TXD1              0x0
+                               MX27_PAD_ATA_DATA0__FEC_TXD2            0x0
+                               MX27_PAD_ATA_DATA1__FEC_TXD3            0x0
+                               MX27_PAD_ATA_DATA2__FEC_RX_ER           0x0
+                               MX27_PAD_ATA_DATA3__FEC_RXD1            0x0
+                               MX27_PAD_ATA_DATA4__FEC_RXD2            0x0
+                               MX27_PAD_ATA_DATA5__FEC_RXD3            0x0
+                               MX27_PAD_ATA_DATA6__FEC_MDIO            0x0
+                               MX27_PAD_ATA_DATA7__FEC_MDC             0x0
+                               MX27_PAD_ATA_DATA8__FEC_CRS             0x0
+                               MX27_PAD_ATA_DATA9__FEC_TX_CLK          0x0
+                               MX27_PAD_ATA_DATA10__FEC_RXD0           0x0
+                               MX27_PAD_ATA_DATA11__FEC_RX_DV          0x0
+                               MX27_PAD_ATA_DATA12__FEC_RX_CLK         0x0
+                               MX27_PAD_ATA_DATA13__FEC_COL            0x0
+                               MX27_PAD_ATA_DATA14__FEC_TX_ER          0x0
+                               MX27_PAD_ATA_DATA15__FEC_TX_EN          0x0
+                       >;
+               };
+
+               pinctrl_i2c1: i2c1grp {
+                       fsl,pins = <
+                               MX27_PAD_I2C_DATA__I2C_DATA             0x0
+                               MX27_PAD_I2C_CLK__I2C_CLK               0x0
+                       >;
+               };
+
+               pinctrl_nfc: nfcgrp {
+                       fsl,pins = <
+                               MX27_PAD_NFRB__NFRB                     0x0
+                               MX27_PAD_NFCLE__NFCLE                   0x0
+                               MX27_PAD_NFWP_B__NFWP_B                 0x0
+                               MX27_PAD_NFCE_B__NFCE_B                 0x0
+                               MX27_PAD_NFALE__NFALE                   0x0
+                               MX27_PAD_NFRE_B__NFRE_B                 0x0
+                               MX27_PAD_NFWE_B__NFWE_B                 0x0
+                       >;
+               };
+
+               pinctrl_owire: owiregrp {
+                       fsl,pins = <
+                               MX27_PAD_RTCK__OWIRE                    0x0
+                       >;
+               };
+
+               pinctrl_sdhc2: sdhc2grp {
+                       fsl,pins = <
+                               MX27_PAD_SD2_CLK__SD2_CLK               0x0
+                               MX27_PAD_SD2_CMD__SD2_CMD               0x0
+                               MX27_PAD_SD2_D0__SD2_D0                 0x0
+                               MX27_PAD_SD2_D1__SD2_D1                 0x0
+                               MX27_PAD_SD2_D2__SD2_D2                 0x0
+                               MX27_PAD_SD2_D3__SD2_D3                 0x0
+                       >;
+               };
+
+               pinctrl_uart4: uart4grp {
+                       fsl,pins = <
+                               MX27_PAD_USBH1_TXDM__UART4_TXD          0x0
+                               MX27_PAD_USBH1_RXDP__UART4_RXD          0x0
+                               MX27_PAD_USBH1_TXDP__UART4_CTS          0x0
+                               MX27_PAD_USBH1_FS__UART4_RTS            0x0
+                       >;
+               };
+
+               pinctrl_uart8250_1: uart82501grp {
+                       fsl,pins = <
+                               MX27_PAD_USB_PWR__GPIO2_23              0x0
+                       >;
+               };
+
+               pinctrl_uart8250_2: uart82502grp {
+                       fsl,pins = <
+                               MX27_PAD_USBH1_SUSP__GPIO2_22           0x0
+                       >;
+               };
+
+               pinctrl_uart8250_3: uart82503grp {
+                       fsl,pins = <
+                               MX27_PAD_USBH1_OE_B__GPIO2_27           0x0
+                       >;
+               };
+
+               pinctrl_uart8250_4: uart82504grp {
+                       fsl,pins = <
+                               MX27_PAD_USBH1_RXDM__GPIO2_30           0x0
+                       >;
+               };
+
+               pinctrl_usbh2: usbh2grp {
+                       fsl,pins = <
+                               MX27_PAD_USBH2_CLK__USBH2_CLK           0x0
+                               MX27_PAD_USBH2_DIR__USBH2_DIR           0x0
+                               MX27_PAD_USBH2_NXT__USBH2_NXT           0x0
+                               MX27_PAD_USBH2_STP__USBH2_STP           0x0
+                               MX27_PAD_CSPI2_SCLK__USBH2_DATA0        0x0
+                               MX27_PAD_CSPI2_MOSI__USBH2_DATA1        0x0
+                               MX27_PAD_CSPI2_MISO__USBH2_DATA2        0x0
+                               MX27_PAD_CSPI2_SS1__USBH2_DATA3         0x0
+                               MX27_PAD_CSPI2_SS2__USBH2_DATA4         0x0
+                               MX27_PAD_CSPI1_SS2__USBH2_DATA5         0x0
+                               MX27_PAD_CSPI2_SS0__USBH2_DATA6         0x0
+                               MX27_PAD_USBH2_DATA7__USBH2_DATA7       0x0
+                       >;
+               };
+
+               pinctrl_usbotg: usbotggrp {
+                       fsl,pins = <
+                               MX27_PAD_USBOTG_CLK__USBOTG_CLK         0x0
+                               MX27_PAD_USBOTG_DIR__USBOTG_DIR         0x0
+                               MX27_PAD_USBOTG_NXT__USBOTG_NXT         0x0
+                               MX27_PAD_USBOTG_STP__USBOTG_STP         0x0
+                               MX27_PAD_USBOTG_DATA0__USBOTG_DATA0     0x0
+                               MX27_PAD_USBOTG_DATA1__USBOTG_DATA1     0x0
+                               MX27_PAD_USBOTG_DATA2__USBOTG_DATA2     0x0
+                               MX27_PAD_USBOTG_DATA3__USBOTG_DATA3     0x0
+                               MX27_PAD_USBOTG_DATA4__USBOTG_DATA4     0x0
+                               MX27_PAD_USBOTG_DATA5__USBOTG_DATA5     0x0
+                               MX27_PAD_USBOTG_DATA6__USBOTG_DATA6     0x0
+                               MX27_PAD_USBOTG_DATA7__USBOTG_DATA7     0x0
+                       >;
+               };
+       };
+};
diff --git a/arch/arm/boot/dts/imx27-eukrea-mbimxsd27-baseboard.dts b/arch/arm/boot/dts/imx27-eukrea-mbimxsd27-baseboard.dts
new file mode 100644 (file)
index 0000000..2ab65fc
--- /dev/null
@@ -0,0 +1,273 @@
+/*
+ * Copyright (C) 2014 Alexander Shiyan <shc_work@mail.ru>
+ *
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+#include "imx27-eukrea-cpuimx27.dtsi"
+
+/ {
+       model = "Eukrea MBIMXSD27";
+       compatible = "eukrea,mbimxsd27-baseboard", "eukrea,cpuimx27", "fsl,imx27";
+
+       display0: CMO-QVGA {
+               model = "CMO-QVGA";
+               native-mode = <&timing0>;
+               bits-per-pixel = <16>;
+               fsl,pcr = <0xfad08b80>;
+
+               display-timings {
+                       timing0: 320x240 {
+                               clock-frequency = <6500000>;
+                               hactive = <320>;
+                               vactive = <240>;
+                               hback-porch = <20>;
+                               hsync-len = <30>;
+                               hfront-porch = <38>;
+                               vback-porch = <4>;
+                               vsync-len = <3>;
+                               vfront-porch = <15>;
+                       };
+               };
+       };
+
+       backlight {
+               compatible = "gpio-backlight";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_backlight>;
+               gpios = <&gpio5 5 GPIO_ACTIVE_HIGH>;
+       };
+
+       leds {
+               compatible = "gpio-leds";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_gpioleds>;
+
+               led1 {
+                       label = "system::live";
+                       gpios = <&gpio6 16 GPIO_ACTIVE_LOW>;
+                       linux,default-trigger = "heartbeat";
+               };
+
+               led2 {
+                       label = "system::user";
+                       gpios = <&gpio6 19 GPIO_ACTIVE_LOW>;
+               };
+       };
+
+       regulators {
+               #address-cells = <1>;
+               #size-cells = <0>;
+               compatible = "simple-bus";
+
+               reg_lcd: regulator@0 {
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&pinctrl_lcdreg>;
+                       compatible = "regulator-fixed";
+                       reg = <0>;
+                       regulator-name = "LCD";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       gpio = <&gpio1 25 GPIO_ACTIVE_HIGH>;
+                       enable-active-high;
+               };
+       };
+};
+
+&cspi1 {
+       pinctrl-0 = <&pinctrl_cspi1>;
+       fsl,spi-num-chipselects = <1>;
+       cs-gpios = <&gpio4 28 GPIO_ACTIVE_LOW>;
+       status = "okay";
+
+       ads7846 {
+               compatible = "ti,ads7846";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_touch>;
+               reg = <0>;
+               interrupts = <&gpio4 25 IRQ_TYPE_LEVEL_LOW>;
+               spi-cpol;
+               spi-max-frequency = <1500000>;
+               ti,keep-vref-on;
+       };
+};
+
+&fb {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_imxfb>;
+       display = <&display0>;
+       lcd-supply = <&reg_lcd>;
+       fsl,dmacr = <0x00040060>;
+       fsl,lscr1 = <0x00120300>;
+       fsl,lpccr = <0x00a903ff>;
+       status = "okay";
+};
+
+&i2c1 {
+       codec: codec@1a {
+               compatible = "ti,tlv320aic23";
+               reg = <0x1a>;
+       };
+};
+
+&kpp {
+       linux,keymap = <
+               MATRIX_KEY(0, 0, KEY_UP)
+               MATRIX_KEY(0, 1, KEY_DOWN)
+               MATRIX_KEY(1, 0, KEY_RIGHT)
+               MATRIX_KEY(1, 1, KEY_LEFT)
+       >;
+       status = "okay";
+};
+
+&sdhci1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_sdhc1>;
+       bus-width = <4>;
+       status = "okay";
+};
+
+&ssi1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_ssi1>;
+       codec-handle = <&codec>;
+       status = "okay";
+};
+
+&uart1 {
+       fsl,uart-has-rtscts;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart1>;
+       status = "okay";
+};
+
+&uart2 {
+       fsl,uart-has-rtscts;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart2>;
+       status = "okay";
+};
+
+&uart3 {
+       fsl,uart-has-rtscts;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart3>;
+       status = "okay";
+};
+
+&iomuxc {
+       imx27-eukrea-cpuimx27-baseboard {
+               pinctrl_cspi1: cspi1grp {
+                       fsl,pins = <
+                               MX27_PAD_CSPI1_MISO__CSPI1_MISO 0x0
+                               MX27_PAD_CSPI1_MOSI__CSPI1_MOSI 0x0
+                               MX27_PAD_CSPI1_SCLK__CSPI1_SCLK 0x0
+                               MX27_PAD_CSPI1_SS0__GPIO4_28    0x0 /* CS0 */
+                       >;
+               };
+
+               pinctrl_backlight: backlightgrp {
+                       fsl,pins = <
+                               MX27_PAD_PWMO__GPIO5_5          0x0
+                       >;
+               };
+
+               pinctrl_gpioleds: gpioledsgrp {
+                       fsl,pins = <
+                               MX27_PAD_PC_PWRON__GPIO6_16     0x0
+                               MX27_PAD_PC_CD2_B__GPIO6_19     0x0
+                       >;
+               };
+
+               pinctrl_imxfb: imxfbgrp {
+                       fsl,pins = <
+                               MX27_PAD_LD0__LD0               0x0
+                               MX27_PAD_LD1__LD1               0x0
+                               MX27_PAD_LD2__LD2               0x0
+                               MX27_PAD_LD3__LD3               0x0
+                               MX27_PAD_LD4__LD4               0x0
+                               MX27_PAD_LD5__LD5               0x0
+                               MX27_PAD_LD6__LD6               0x0
+                               MX27_PAD_LD7__LD7               0x0
+                               MX27_PAD_LD8__LD8               0x0
+                               MX27_PAD_LD9__LD9               0x0
+                               MX27_PAD_LD10__LD10             0x0
+                               MX27_PAD_LD11__LD11             0x0
+                               MX27_PAD_LD12__LD12             0x0
+                               MX27_PAD_LD13__LD13             0x0
+                               MX27_PAD_LD14__LD14             0x0
+                               MX27_PAD_LD15__LD15             0x0
+                               MX27_PAD_LD16__LD16             0x0
+                               MX27_PAD_LD17__LD17             0x0
+                               MX27_PAD_CONTRAST__CONTRAST     0x0
+                               MX27_PAD_OE_ACD__OE_ACD         0x0
+                               MX27_PAD_HSYNC__HSYNC           0x0
+                               MX27_PAD_VSYNC__VSYNC           0x0
+                       >;
+               };
+
+               pinctrl_lcdreg: lcdreggrp {
+                       fsl,pins = <
+                               MX27_PAD_CLS__GPIO1_25          0x0
+                       >;
+               };
+
+               pinctrl_sdhc1: sdhc1grp {
+                       fsl,pins = <
+                               MX27_PAD_SD1_CLK__SD1_CLK       0x0
+                               MX27_PAD_SD1_CMD__SD1_CMD       0x0
+                               MX27_PAD_SD1_D0__SD1_D0         0x0
+                               MX27_PAD_SD1_D1__SD1_D1         0x0
+                               MX27_PAD_SD1_D2__SD1_D2         0x0
+                               MX27_PAD_SD1_D3__SD1_D3         0x0
+                       >;
+               };
+
+               pinctrl_ssi1: ssi1grp {
+                       fsl,pins = <
+                               MX27_PAD_SSI4_CLK__SSI4_CLK     0x0
+                               MX27_PAD_SSI4_FS__SSI4_FS       0x0
+                               MX27_PAD_SSI4_RXDAT__SSI4_RXDAT 0x1
+                               MX27_PAD_SSI4_TXDAT__SSI4_TXDAT 0x1
+                       >;
+               };
+
+               pinctrl_touch: touchgrp {
+                       fsl,pins = <
+                               MX27_PAD_CSPI1_RDY__GPIO4_25    0x0 /* IRQ */
+                       >;
+               };
+
+               pinctrl_uart1: uart1grp {
+                       fsl,pins = <
+                               MX27_PAD_UART1_TXD__UART1_TXD   0x0
+                               MX27_PAD_UART1_RXD__UART1_RXD   0x0
+                               MX27_PAD_UART1_CTS__UART1_CTS   0x0
+                               MX27_PAD_UART1_RTS__UART1_RTS   0x0
+                       >;
+               };
+
+               pinctrl_uart2: uart2grp {
+                       fsl,pins = <
+                               MX27_PAD_UART2_TXD__UART2_TXD   0x0
+                               MX27_PAD_UART2_RXD__UART2_RXD   0x0
+                               MX27_PAD_UART2_CTS__UART2_CTS   0x0
+                               MX27_PAD_UART2_RTS__UART2_RTS   0x0
+                       >;
+               };
+
+               pinctrl_uart3: uart3grp {
+                       fsl,pins = <
+                               MX27_PAD_UART3_TXD__UART3_TXD   0x0
+                               MX27_PAD_UART3_RXD__UART3_RXD   0x0
+                               MX27_PAD_UART3_CTS__UART3_CTS   0x0
+                               MX27_PAD_UART3_RTS__UART3_RTS   0x0
+                       >;
+               };
+       };
+};
index 4c317716b510ab4db06a183bbf7567745be9d5c8..49450dbbcab8ca7057321f3f87665a8209240346 100644 (file)
@@ -28,7 +28,7 @@
                usbphy0: usbphy@0 {
                        compatible = "usb-nop-xceiv";
                        reg = <0>;
-                       clocks = <&clks 0>;
+                       clocks = <&clks IMX27_CLK_DUMMY>;
                        clock-names = "main_clk";
                };
        };
index fe02bc7a24fd0df59fe14264ab0228d3a11f9661..538568b0de263eb979509f6a17d77eb38906d831 100644 (file)
@@ -61,7 +61,7 @@
                        compatible = "usb-nop-xceiv";
                        reg = <2>;
                        vcc-supply = <&reg_5v0>;
-                       clocks = <&clks 0>;
+                       clocks = <&clks IMX27_CLK_DUMMY>;
                        clock-names = "main_clk";
                };
        };
index 31e9f7049f73351f325c3e58b1fb6e4e116763df..b4e955e3be8d26deae9a68364b2952b7fccd8f71 100644 (file)
@@ -51,7 +51,7 @@
                        compatible = "usb-nop-xceiv";
                        reg = <0>;
                        vcc-supply = <&sw3_reg>;
-                       clocks = <&clks 0>;
+                       clocks = <&clks IMX27_CLK_DUMMY>;
                        clock-names = "main_clk";
                };
        };
 &ssi1 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_ssi1>;
-       fsl,mode = "i2s-slave";
        status = "okay";
 };
 
index f5387b4de577ba1b0c73cb85ebeaa6177d685504..597bb5f74dcc5ecccaa664274f672d8608297dac 100644 (file)
 #define MX27_PAD_CONTRAST__GPIO1_30                        0x1e 0x032
 #define MX27_PAD_OE_ACD__OE_ACD                            0x1f 0x004
 #define MX27_PAD_OE_ACD__GPIO1_31                          0x1f 0x032
-#define MX27_PAD_UNUSED0__UNUSED0                          0x20 0x004
-#define MX27_PAD_UNUSED0__GPIO2_0                          0x20 0x032
-#define MX27_PAD_UNUSED1__UNUSED1                          0x21 0x004
-#define MX27_PAD_UNUSED1__GPIO2_1                          0x21 0x032
-#define MX27_PAD_UNUSED2__UNUSED2                          0x22 0x004
-#define MX27_PAD_UNUSED2__GPIO2_2                          0x22 0x032
-#define MX27_PAD_UNUSED3__UNUSED3                          0x23 0x004
-#define MX27_PAD_UNUSED3__GPIO2_3                          0x23 0x032
 #define MX27_PAD_SD2_D0__SD2_D0                            0x24 0x004
 #define MX27_PAD_SD2_D0__MSHC_DATA0                        0x24 0x005
 #define MX27_PAD_SD2_D0__GPIO2_4                           0x24 0x032
 #define MX27_PAD_USBH1_RXDP__USBH1_RXDP                    0x3f 0x004
 #define MX27_PAD_USBH1_RXDP__UART4_RXD                     0x3f 0x001
 #define MX27_PAD_USBH1_RXDP__GPIO2_31                      0x3f 0x032
-#define MX27_PAD_UNUSED4__UNUSED4                          0x40 0x004
-#define MX27_PAD_UNUSED4__GPIO3_0                          0x40 0x032
-#define MX27_PAD_UNUSED5__UNUSED5                          0x41 0x004
-#define MX27_PAD_UNUSED5__GPIO3_1                          0x41 0x032
-#define MX27_PAD_UNUSED6__UNUSED6                          0x42 0x004
-#define MX27_PAD_UNUSED6__GPIO3_2                          0x42 0x032
-#define MX27_PAD_UNUSED7__UNUSED7                          0x43 0x004
-#define MX27_PAD_UNUSED7__GPIO3_3                          0x43 0x032
-#define MX27_PAD_UNUSED8__UNUSED8                          0x44 0x004
-#define MX27_PAD_UNUSED8__GPIO3_4                          0x44 0x032
 #define MX27_PAD_I2C2_SDA__I2C2_SDA                        0x45 0x004
 #define MX27_PAD_I2C2_SDA__GPIO3_5                         0x45 0x032
 #define MX27_PAD_I2C2_SCL__I2C2_SCL                        0x46 0x004
 #define MX27_PAD_USBOTG_CLK__GPIO5_24                      0x98 0x032
 #define MX27_PAD_USBOTG_DATA7__USBOTG_DATA7                0x99 0x004
 #define MX27_PAD_USBOTG_DATA7__GPIO5_25                    0x99 0x032
-#define MX27_PAD_UNUSED9__UNUSED9                          0x9a 0x004
-#define MX27_PAD_UNUSED9__GPIO5_26                         0x9a 0x032
-#define MX27_PAD_UNUSED10__UNUSED10                        0x9b 0x004
-#define MX27_PAD_UNUSED10__GPIO5_27                        0x9b 0x032
-#define MX27_PAD_UNUSED11__UNUSED11                        0x9c 0x004
-#define MX27_PAD_UNUSED11__GPIO5_28                        0x9c 0x032
-#define MX27_PAD_UNUSED12__UNUSED12                        0x9d 0x004
-#define MX27_PAD_UNUSED12__GPIO5_29                        0x9d 0x032
-#define MX27_PAD_UNUSED13__UNUSED13                        0x9e 0x004
-#define MX27_PAD_UNUSED13__GPIO5_30                        0x9e 0x032
-#define MX27_PAD_UNUSED14__UNUSED14                        0x9f 0x004
-#define MX27_PAD_UNUSED14__GPIO5_31                        0x9f 0x032
 #define MX27_PAD_NFRB__NFRB                                0xa0 0x000
 #define MX27_PAD_NFRB__ETMTRACEPKT3                        0xa0 0x005
 #define MX27_PAD_NFRB__GPIO6_0                             0xa0 0x032
 #define MX27_PAD_ATA_DATA15__ETMTRACEPKT4                  0xb7 0x005
 #define MX27_PAD_ATA_DATA15__FEC_TX_EN                     0xb7 0x006
 #define MX27_PAD_ATA_DATA15__GPIO6_23                      0xb7 0x032
-#define MX27_PAD_UNUSED15__UNUSED15                        0xb8 0x004
-#define MX27_PAD_UNUSED15__GPIO6_24                        0xb8 0x032
-#define MX27_PAD_UNUSED16__UNUSED16                        0xb9 0x004
-#define MX27_PAD_UNUSED16__GPIO6_25                        0xb9 0x032
-#define MX27_PAD_UNUSED17__UNUSED17                        0xba 0x004
-#define MX27_PAD_UNUSED17__GPIO6_26                        0xba 0x032
-#define MX27_PAD_UNUSED18__UNUSED18                        0xbb 0x004
-#define MX27_PAD_UNUSED18__GPIO6_27                        0xbb 0x032
-#define MX27_PAD_UNUSED19__UNUSED19                        0xbc 0x004
-#define MX27_PAD_UNUSED19__GPIO6_28                        0xbc 0x032
-#define MX27_PAD_UNUSED20__UNUSED20                        0xbd 0x004
-#define MX27_PAD_UNUSED20__GPIO6_29                        0xbd 0x032
-#define MX27_PAD_UNUSED21__UNUSED21                        0xbe 0x004
-#define MX27_PAD_UNUSED21__GPIO6_30                        0xbe 0x032
-#define MX27_PAD_UNUSED22__UNUSED22                        0xbf 0x004
-#define MX27_PAD_UNUSED22__GPIO6_31                        0xbf 0x032
 
 #endif /* __DTS_IMX27_PINFUNC_H */
index a75555c39533d71edd6828dd475ae8d73df81511..107d713e1cbecdbf63a18f9f99eafe74cee67e0e 100644 (file)
 
 #include "skeleton.dtsi"
 #include "imx27-pinfunc.h"
+
+#include <dt-bindings/clock/imx27-clock.h>
+#include <dt-bindings/gpio/gpio.h>
 #include <dt-bindings/input/input.h>
 #include <dt-bindings/interrupt-controller/irq.h>
-#include <dt-bindings/gpio/gpio.h>
 
 / {
        aliases {
@@ -68,7 +70,7 @@
                                399000 1450000
                        >;
                        clock-latency = <62500>;
-                       clocks = <&clks 18>;
+                       clocks = <&clks IMX27_CLK_CPU_DIV>;
                        voltage-tolerance = <5>;
                };
        };
@@ -91,7 +93,8 @@
                                compatible = "fsl,imx27-dma";
                                reg = <0x10001000 0x1000>;
                                interrupts = <32>;
-                               clocks = <&clks 50>, <&clks 70>;
+                               clocks = <&clks IMX27_CLK_DMA_IPG_GATE>,
+                                        <&clks IMX27_CLK_DMA_AHB_GATE>;
                                clock-names = "ipg", "ahb";
                                #dma-cells = <1>;
                                #dma-channels = <16>;
                                compatible = "fsl,imx27-wdt", "fsl,imx21-wdt";
                                reg = <0x10002000 0x1000>;
                                interrupts = <27>;
-                               clocks = <&clks 74>;
+                               clocks = <&clks IMX27_CLK_WDOG_IPG_GATE>;
                        };
 
                        gpt1: timer@10003000 {
                                compatible = "fsl,imx27-gpt", "fsl,imx1-gpt";
                                reg = <0x10003000 0x1000>;
                                interrupts = <26>;
-                               clocks = <&clks 46>, <&clks 61>;
+                               clocks = <&clks IMX27_CLK_GPT1_IPG_GATE>,
+                                        <&clks IMX27_CLK_PER1_GATE>;
                                clock-names = "ipg", "per";
                        };
 
                                compatible = "fsl,imx27-gpt", "fsl,imx1-gpt";
                                reg = <0x10004000 0x1000>;
                                interrupts = <25>;
-                               clocks = <&clks 45>, <&clks 61>;
+                               clocks = <&clks IMX27_CLK_GPT2_IPG_GATE>,
+                                        <&clks IMX27_CLK_PER1_GATE>;
                                clock-names = "ipg", "per";
                        };
 
                                compatible = "fsl,imx27-gpt", "fsl,imx1-gpt";
                                reg = <0x10005000 0x1000>;
                                interrupts = <24>;
-                               clocks = <&clks 44>, <&clks 61>;
+                               clocks = <&clks IMX27_CLK_GPT3_IPG_GATE>,
+                                        <&clks IMX27_CLK_PER1_GATE>;
                                clock-names = "ipg", "per";
                        };
 
                                compatible = "fsl,imx27-pwm";
                                reg = <0x10006000 0x1000>;
                                interrupts = <23>;
-                               clocks = <&clks 34>, <&clks 61>;
+                               clocks = <&clks IMX27_CLK_PWM_IPG_GATE>,
+                                        <&clks IMX27_CLK_PER1_GATE>;
                                clock-names = "ipg", "per";
                        };
 
                                compatible = "fsl,imx27-kpp", "fsl,imx21-kpp";
                                reg = <0x10008000 0x1000>;
                                interrupts = <21>;
-                               clocks = <&clks 37>;
+                               clocks = <&clks IMX27_CLK_KPP_IPG_GATE>;
                                status = "disabled";
                        };
 
                        owire: owire@10009000 {
                                compatible = "fsl,imx27-owire", "fsl,imx21-owire";
                                reg = <0x10009000 0x1000>;
-                               clocks = <&clks 35>;
+                               clocks = <&clks IMX27_CLK_OWIRE_IPG_GATE>;
                                status = "disabled";
                        };
 
                                compatible = "fsl,imx27-uart", "fsl,imx21-uart";
                                reg = <0x1000a000 0x1000>;
                                interrupts = <20>;
-                               clocks = <&clks 81>, <&clks 61>;
+                               clocks = <&clks IMX27_CLK_UART1_IPG_GATE>,
+                                        <&clks IMX27_CLK_PER1_GATE>;
                                clock-names = "ipg", "per";
                                status = "disabled";
                        };
                                compatible = "fsl,imx27-uart", "fsl,imx21-uart";
                                reg = <0x1000b000 0x1000>;
                                interrupts = <19>;
-                               clocks = <&clks 80>, <&clks 61>;
+                               clocks = <&clks IMX27_CLK_UART2_IPG_GATE>,
+                                        <&clks IMX27_CLK_PER1_GATE>;
                                clock-names = "ipg", "per";
                                status = "disabled";
                        };
                                compatible = "fsl,imx27-uart", "fsl,imx21-uart";
                                reg = <0x1000c000 0x1000>;
                                interrupts = <18>;
-                               clocks = <&clks 79>, <&clks 61>;
+                               clocks = <&clks IMX27_CLK_UART3_IPG_GATE>,
+                                        <&clks IMX27_CLK_PER1_GATE>;
                                clock-names = "ipg", "per";
                                status = "disabled";
                        };
                                compatible = "fsl,imx27-uart", "fsl,imx21-uart";
                                reg = <0x1000d000 0x1000>;
                                interrupts = <17>;
-                               clocks = <&clks 78>, <&clks 61>;
+                               clocks = <&clks IMX27_CLK_UART4_IPG_GATE>,
+                                        <&clks IMX27_CLK_PER1_GATE>;
                                clock-names = "ipg", "per";
                                status = "disabled";
                        };
                                compatible = "fsl,imx27-cspi";
                                reg = <0x1000e000 0x1000>;
                                interrupts = <16>;
-                               clocks = <&clks 53>, <&clks 60>;
+                               clocks = <&clks IMX27_CLK_CSPI1_IPG_GATE>,
+                                        <&clks IMX27_CLK_PER2_GATE>;
                                clock-names = "ipg", "per";
                                status = "disabled";
                        };
                                compatible = "fsl,imx27-cspi";
                                reg = <0x1000f000 0x1000>;
                                interrupts = <15>;
-                               clocks = <&clks 52>, <&clks 60>;
+                               clocks = <&clks IMX27_CLK_CSPI2_IPG_GATE>,
+                                        <&clks IMX27_CLK_PER2_GATE>;
                                clock-names = "ipg", "per";
                                status = "disabled";
                        };
                                compatible = "fsl,imx27-ssi", "fsl,imx21-ssi";
                                reg = <0x10010000 0x1000>;
                                interrupts = <14>;
-                               clocks = <&clks 26>;
+                               clocks = <&clks IMX27_CLK_SSI1_IPG_GATE>;
                                dmas = <&dma 12>, <&dma 13>, <&dma 14>, <&dma 15>;
                                dma-names = "rx0", "tx0", "rx1", "tx1";
                                fsl,fifo-depth = <8>;
                                compatible = "fsl,imx27-ssi", "fsl,imx21-ssi";
                                reg = <0x10011000 0x1000>;
                                interrupts = <13>;
-                               clocks = <&clks 25>;
+                               clocks = <&clks IMX27_CLK_SSI2_IPG_GATE>;
                                dmas = <&dma 8>, <&dma 9>, <&dma 10>, <&dma 11>;
                                dma-names = "rx0", "tx0", "rx1", "tx1";
                                fsl,fifo-depth = <8>;
                                compatible = "fsl,imx27-i2c", "fsl,imx21-i2c";
                                reg = <0x10012000 0x1000>;
                                interrupts = <12>;
-                               clocks = <&clks 40>;
+                               clocks = <&clks IMX27_CLK_I2C1_IPG_GATE>;
                                status = "disabled";
                        };
 
                                compatible = "fsl,imx27-mmc", "fsl,imx21-mmc";
                                reg = <0x10013000 0x1000>;
                                interrupts = <11>;
-                               clocks = <&clks 30>, <&clks 60>;
+                               clocks = <&clks IMX27_CLK_SDHC1_IPG_GATE>,
+                                        <&clks IMX27_CLK_PER2_GATE>;
                                clock-names = "ipg", "per";
                                dmas = <&dma 7>;
                                dma-names = "rx-tx";
                                compatible = "fsl,imx27-mmc", "fsl,imx21-mmc";
                                reg = <0x10014000 0x1000>;
                                interrupts = <10>;
-                               clocks = <&clks 29>, <&clks 60>;
+                               clocks = <&clks IMX27_CLK_SDHC2_IPG_GATE>,
+                                        <&clks IMX27_CLK_PER2_GATE>;
                                clock-names = "ipg", "per";
                                dmas = <&dma 6>;
                                dma-names = "rx-tx";
                                gpio1: gpio@10015000 {
                                        compatible = "fsl,imx27-gpio", "fsl,imx21-gpio";
                                        reg = <0x10015000 0x100>;
+                                       clocks = <&clks IMX27_CLK_GPIO_IPG_GATE>;
                                        interrupts = <8>;
                                        gpio-controller;
                                        #gpio-cells = <2>;
                                gpio2: gpio@10015100 {
                                        compatible = "fsl,imx27-gpio", "fsl,imx21-gpio";
                                        reg = <0x10015100 0x100>;
+                                       clocks = <&clks IMX27_CLK_GPIO_IPG_GATE>;
                                        interrupts = <8>;
                                        gpio-controller;
                                        #gpio-cells = <2>;
                                gpio3: gpio@10015200 {
                                        compatible = "fsl,imx27-gpio", "fsl,imx21-gpio";
                                        reg = <0x10015200 0x100>;
+                                       clocks = <&clks IMX27_CLK_GPIO_IPG_GATE>;
                                        interrupts = <8>;
                                        gpio-controller;
                                        #gpio-cells = <2>;
                                gpio4: gpio@10015300 {
                                        compatible = "fsl,imx27-gpio", "fsl,imx21-gpio";
                                        reg = <0x10015300 0x100>;
+                                       clocks = <&clks IMX27_CLK_GPIO_IPG_GATE>;
                                        interrupts = <8>;
                                        gpio-controller;
                                        #gpio-cells = <2>;
                                gpio5: gpio@10015400 {
                                        compatible = "fsl,imx27-gpio", "fsl,imx21-gpio";
                                        reg = <0x10015400 0x100>;
+                                       clocks = <&clks IMX27_CLK_GPIO_IPG_GATE>;
                                        interrupts = <8>;
                                        gpio-controller;
                                        #gpio-cells = <2>;
                                gpio6: gpio@10015500 {
                                        compatible = "fsl,imx27-gpio", "fsl,imx21-gpio";
                                        reg = <0x10015500 0x100>;
+                                       clocks = <&clks IMX27_CLK_GPIO_IPG_GATE>;
                                        interrupts = <8>;
                                        gpio-controller;
                                        #gpio-cells = <2>;
                        audmux: audmux@10016000 {
                                compatible = "fsl,imx27-audmux", "fsl,imx21-audmux";
                                reg = <0x10016000 0x1000>;
-                               clocks = <&clks 0>;
+                               clocks = <&clks IMX27_CLK_DUMMY>;
                                clock-names = "audmux";
                                status = "disabled";
                        };
                                compatible = "fsl,imx27-cspi";
                                reg = <0x10017000 0x1000>;
                                interrupts = <6>;
-                               clocks = <&clks 51>, <&clks 60>;
+                               clocks = <&clks IMX27_CLK_CSPI3_IPG_GATE>,
+                                        <&clks IMX27_CLK_PER2_GATE>;
                                clock-names = "ipg", "per";
                                status = "disabled";
                        };
                                compatible = "fsl,imx27-gpt", "fsl,imx1-gpt";
                                reg = <0x10019000 0x1000>;
                                interrupts = <4>;
-                               clocks = <&clks 43>, <&clks 61>;
+                               clocks = <&clks IMX27_CLK_GPT4_IPG_GATE>,
+                                        <&clks IMX27_CLK_PER1_GATE>;
                                clock-names = "ipg", "per";
                        };
 
                                compatible = "fsl,imx27-gpt", "fsl,imx1-gpt";
                                reg = <0x1001a000 0x1000>;
                                interrupts = <3>;
-                               clocks = <&clks 42>, <&clks 61>;
+                               clocks = <&clks IMX27_CLK_GPT5_IPG_GATE>,
+                                        <&clks IMX27_CLK_PER1_GATE>;
                                clock-names = "ipg", "per";
                        };
 
                                compatible = "fsl,imx27-uart", "fsl,imx21-uart";
                                reg = <0x1001b000 0x1000>;
                                interrupts = <49>;
-                               clocks = <&clks 77>, <&clks 61>;
+                               clocks = <&clks IMX27_CLK_UART5_IPG_GATE>,
+                                        <&clks IMX27_CLK_PER1_GATE>;
                                clock-names = "ipg", "per";
                                status = "disabled";
                        };
                                compatible = "fsl,imx27-uart", "fsl,imx21-uart";
                                reg = <0x1001c000 0x1000>;
                                interrupts = <48>;
-                               clocks = <&clks 78>, <&clks 61>;
+                               clocks = <&clks IMX27_CLK_UART6_IPG_GATE>,
+                                        <&clks IMX27_CLK_PER1_GATE>;
                                clock-names = "ipg", "per";
                                status = "disabled";
                        };
                                compatible = "fsl,imx27-i2c", "fsl,imx21-i2c";
                                reg = <0x1001d000 0x1000>;
                                interrupts = <1>;
-                               clocks = <&clks 39>;
+                               clocks = <&clks IMX27_CLK_I2C2_IPG_GATE>;
                                status = "disabled";
                        };
 
                                compatible = "fsl,imx27-mmc", "fsl,imx21-mmc";
                                reg = <0x1001e000 0x1000>;
                                interrupts = <9>;
-                               clocks = <&clks 28>, <&clks 60>;
+                               clocks = <&clks IMX27_CLK_SDHC3_IPG_GATE>,
+                                        <&clks IMX27_CLK_PER2_GATE>;
                                clock-names = "ipg", "per";
                                dmas = <&dma 36>;
                                dma-names = "rx-tx";
                                compatible = "fsl,imx27-gpt", "fsl,imx1-gpt";
                                reg = <0x1001f000 0x1000>;
                                interrupts = <2>;
-                               clocks = <&clks 41>, <&clks 61>;
+                               clocks = <&clks IMX27_CLK_GPT6_IPG_GATE>,
+                                        <&clks IMX27_CLK_PER1_GATE>;
                                clock-names = "ipg", "per";
                        };
                };
                                compatible = "fsl,imx27-fb", "fsl,imx21-fb";
                                interrupts = <61>;
                                reg = <0x10021000 0x1000>;
-                               clocks = <&clks 36>, <&clks 65>, <&clks 59>;
+                               clocks = <&clks IMX27_CLK_LCDC_IPG_GATE>,
+                                        <&clks IMX27_CLK_LCDC_AHB_GATE>,
+                                        <&clks IMX27_CLK_PER3_GATE>;
                                clock-names = "ipg", "ahb", "per";
                                status = "disabled";
                        };
                                compatible = "fsl,imx27-vpu";
                                reg = <0x10023000 0x0200>;
                                interrupts = <53>;
-                               clocks = <&clks 57>, <&clks 66>;
+                               clocks = <&clks IMX27_CLK_VPU_BAUD_GATE>,
+                                        <&clks IMX27_CLK_VPU_AHB_GATE>;
                                clock-names = "per", "ahb";
                                iram = <&iram>;
                        };
                                compatible = "fsl,imx27-usb";
                                reg = <0x10024000 0x200>;
                                interrupts = <56>;
-                               clocks = <&clks 75>;
+                               clocks = <&clks IMX27_CLK_USB_IPG_GATE>;
                                fsl,usbmisc = <&usbmisc 0>;
                                status = "disabled";
                        };
                                compatible = "fsl,imx27-usb";
                                reg = <0x10024200 0x200>;
                                interrupts = <54>;
-                               clocks = <&clks 75>;
+                               clocks = <&clks IMX27_CLK_USB_IPG_GATE>;
                                fsl,usbmisc = <&usbmisc 1>;
                                status = "disabled";
                        };
                                compatible = "fsl,imx27-usb";
                                reg = <0x10024400 0x200>;
                                interrupts = <55>;
-                               clocks = <&clks 75>;
+                               clocks = <&clks IMX27_CLK_USB_IPG_GATE>;
                                fsl,usbmisc = <&usbmisc 2>;
                                status = "disabled";
                        };
                                #index-cells = <1>;
                                compatible = "fsl,imx27-usbmisc";
                                reg = <0x10024600 0x200>;
-                               clocks = <&clks 62>;
+                               clocks = <&clks IMX27_CLK_USB_AHB_GATE>;
                        };
 
                        sahara2: sahara@10025000 {
                                compatible = "fsl,imx27-sahara";
                                reg = <0x10025000 0x1000>;
                                interrupts = <59>;
-                               clocks = <&clks 32>, <&clks 64>;
+                               clocks = <&clks IMX27_CLK_SAHARA_IPG_GATE>,
+                                        <&clks IMX27_CLK_SAHARA_AHB_GATE>;
                                clock-names = "ipg", "ahb";
                        };
 
                                compatible = "fsl,imx27-iim";
                                reg = <0x10028000 0x1000>;
                                interrupts = <62>;
-                               clocks = <&clks 38>;
+                               clocks = <&clks IMX27_CLK_IIM_IPG_GATE>;
                        };
 
                        fec: ethernet@1002b000 {
                                compatible = "fsl,imx27-fec";
                                reg = <0x1002b000 0x4000>;
                                interrupts = <50>;
-                               clocks = <&clks 48>, <&clks 67>;
+                               clocks = <&clks IMX27_CLK_FEC_IPG_GATE>,
+                                        <&clks IMX27_CLK_FEC_AHB_GATE>;
                                clock-names = "ipg", "ahb";
                                status = "disabled";
                        };
                        compatible = "fsl,imx27-nand";
                        reg = <0xd8000000 0x1000>;
                        interrupts = <29>;
-                       clocks = <&clks 54>;
+                       clocks = <&clks IMX27_CLK_NFC_BAUD_GATE>;
                        status = "disabled";
                };
 
                        #size-cells = <1>;
                        compatible = "fsl,imx27-weim";
                        reg = <0xd8002000 0x1000>;
-                       clocks = <&clks 0>;
+                       clocks = <&clks IMX27_CLK_EMI_AHB_GATE>;
                        ranges = <
                                0 0 0xc0000000 0x08000000
                                1 0 0xc8000000 0x08000000
index ae7c3390e65a5ddc6210c4d256b406719e624d14..b04b6b8850a71de972c5b3ce0fa6f11454740b9d 100644 (file)
                                        fsl,pull-up = <MXS_PULL_DISABLE>;
                                };
 
+                               mmc_pwr_cfa10036: mmc_pwr_cfa10036@0 {
+                                       reg = <0>;
+                                       fsl,pinmux-ids = <
+                                               0x31c3 /*
+                                               MX28_PAD_PWM3__GPIO_3_28 */
+                                       >;
+                                       fsl,drive-strength = <0>;
+                                       fsl,voltage = <1>;
+                                       fsl,pull-up = <0>;
+                               };
+
                        };
 
                        ssp0: ssp@80010000 {
@@ -60,6 +71,7 @@
                                pinctrl-names = "default";
                                pinctrl-0 = <&mmc0_4bit_pins_a
                                        &mmc0_cd_cfg &mmc0_sck_cfg>;
+                               vmmc-supply = <&reg_vddio_sd0>;
                                bus-width = <4>;
                                status = "okay";
                        };
                        default-state = "on";
                };
        };
+
+       reg_vddio_sd0: vddio-sd0 {
+               compatible = "regulator-fixed";
+               pinctrl-names = "default";
+               pinctrl-0 = <&mmc_pwr_cfa10036>;
+               regulator-name = "vddio-sd0";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               gpio = <&gpio3 28 0>;
+       };
 };
diff --git a/arch/arm/boot/dts/imx28-m28.dtsi b/arch/arm/boot/dts/imx28-m28.dtsi
new file mode 100644 (file)
index 0000000..759cc56
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2014 Marek Vasut <marex@denx.de>
+ *
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+#include "imx28.dtsi"
+
+/ {
+       model = "DENX M28";
+       compatible = "denx,m28", "fsl,imx28";
+
+       memory {
+               reg = <0x40000000 0x08000000>;
+       };
+
+       apb@80000000 {
+               apbh@80000000 {
+                       gpmi-nand@8000c000 {
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&gpmi_pins_a &gpmi_status_cfg>;
+                               status = "okay";
+
+                               partition@0 {
+                                       label = "bootloader";
+                                       reg = <0x00000000 0x00300000>;
+                                       read-only;
+                               };
+
+                               partition@1 {
+                                       label = "environment";
+                                       reg = <0x00300000 0x00080000>;
+                               };
+
+                               partition@2 {
+                                       label = "redundant-environment";
+                                       reg = <0x00380000 0x00080000>;
+                               };
+
+                               partition@3 {
+                                       label = "kernel";
+                                       reg = <0x00400000 0x00400000>;
+                               };
+
+                               partition@4 {
+                                       label = "filesystem";
+                                       reg = <0x00800000 0x0f800000>;
+                               };
+                       };
+               };
+
+               apbx@80040000 {
+                       i2c0: i2c@80058000 {
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&i2c0_pins_a>;
+                               status = "okay";
+
+                               rtc: rtc@68 {
+                                       compatible = "stm,m41t62";
+                                       reg = <0x68>;
+                               };
+                       };
+               };
+       };
+
+       regulators {
+               compatible = "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               reg_3p3v: regulator@0 {
+                       compatible = "regulator-fixed";
+                       reg = <0>;
+                       regulator-name = "3P3V";
+                       regulator-min-microvolt = <3300000>;
+                       regulator-max-microvolt = <3300000>;
+                       regulator-always-on;
+               };
+       };
+};
index f0ad7b9b9d9a1617eeb64d2d42a1dae872642f32..b3c09ae3b92850ffe5a2c73259f06ca48d93bffc 100644 (file)
  */
 
 /dts-v1/;
-#include "imx28.dtsi"
+#include "imx28-m28.dtsi"
 
 / {
        model = "DENX M28EVK";
        compatible = "denx,m28evk", "fsl,imx28";
 
-       memory {
-               reg = <0x40000000 0x08000000>;
-       };
-
        apb@80000000 {
                apbh@80000000 {
-                       gpmi-nand@8000c000 {
-                               #address-cells = <1>;
-                               #size-cells = <1>;
-                               pinctrl-names = "default";
-                               pinctrl-0 = <&gpmi_pins_a &gpmi_status_cfg>;
-                               status = "okay";
-
-                               partition@0 {
-                                       label = "bootloader";
-                                       reg = <0x00000000 0x00300000>;
-                                       read-only;
-                               };
-
-                               partition@1 {
-                                       label = "environment";
-                                       reg = <0x00300000 0x00080000>;
-                               };
-
-                               partition@2 {
-                                       label = "redundant-environment";
-                                       reg = <0x00380000 0x00080000>;
-                               };
-
-                               partition@3 {
-                                       label = "kernel";
-                                       reg = <0x00400000 0x00400000>;
-                               };
-
-                               partition@4 {
-                                       label = "filesystem";
-                                       reg = <0x00800000 0x0f800000>;
-                               };
-                       };
-
                        ssp0: ssp@80010000 {
                                compatible = "fsl,imx28-mmc";
                                pinctrl-names = "default";
                        };
 
                        i2c0: i2c@80058000 {
-                               pinctrl-names = "default";
-                               pinctrl-0 = <&i2c0_pins_a>;
-                               status = "okay";
-
                                sgtl5000: codec@0a {
                                        compatible = "fsl,sgtl5000";
                                        reg = <0x0a>;
                                        reg = <0x51>;
                                        pagesize = <32>;
                                };
-
-                               rtc: rtc@68 {
-                                       compatible = "stm,m41t62";
-                                       reg = <0x68>;
-                               };
                        };
 
                        lradc@80050000 {
        };
 
        regulators {
-               compatible = "simple-bus";
-               #address-cells = <1>;
-               #size-cells = <0>;
-
-               reg_3p3v: regulator@0 {
-                       compatible = "regulator-fixed";
-                       reg = <0>;
-                       regulator-name = "3P3V";
-                       regulator-min-microvolt = <3300000>;
-                       regulator-max-microvolt = <3300000>;
-                       regulator-always-on;
-               };
-
                reg_vddio_sd0: regulator@1 {
                        compatible = "regulator-fixed";
                        reg = <1>;
index f04ae91eea8908b541ae170998982ec6c24bc570..75b036700d314cefa0040e88b92bc54e2f595a22 100644 (file)
 
 &ssi1 {
        codec-handle = <&tlv320aic23>;
-       fsl,mode = "i2s-slave";
        status = "okay";
 };
 
index 4759abb4943615d393c3b7404731141ac19392f0..442e216ca9d96ef5b8b81fc85bd3a45f723c35e0 100644 (file)
                                #clock-cells = <1>;
                        };
 
+                       gpt: timer@53f90000 {
+                               compatible = "fsl,imx35-gpt", "fsl,imx31-gpt";
+                               reg = <0x53f90000 0x4000>;
+                               interrupts = <29>;
+                               clocks = <&clks 9>, <&clks 50>;
+                               clock-names = "ipg", "per";
+                       };
+
                        gpio3: gpio@53fa4000 {
                                compatible = "fsl,imx35-gpio", "fsl,imx31-gpio";
                                reg = <0x53fa4000 0x4000>;
index 6a201cf54366345b3f966d91f251dda73016e50d..c0e0f60ab6b22b4f5c80c77594eb908ca547298d 100644 (file)
                                        reg = <0x50014000 0x4000>;
                                        interrupts = <30>;
                                        clocks = <&clks IMX5_CLK_SSI2_IPG_GATE>;
+                                       dmas = <&sdma 24 1 0>,
+                                              <&sdma 25 1 0>;
+                                       dma-names = "rx", "tx";
                                        fsl,fifo-depth = <15>;
-                                       fsl,ssi-dma-events = <25 24 23 22>; /* TX0 RX0 TX1 RX1 */
                                        status = "disabled";
                                };
 
                                reg = <0x63fcc000 0x4000>;
                                interrupts = <29>;
                                clocks = <&clks IMX5_CLK_SSI1_IPG_GATE>;
+                               dmas = <&sdma 28 0 0>,
+                                      <&sdma 29 0 0>;
+                               dma-names = "rx", "tx";
                                fsl,fifo-depth = <15>;
-                               fsl,ssi-dma-events = <29 28 27 26>; /* TX0 RX0 TX1 RX1 */
                                status = "disabled";
                        };
 
index 181d77fa2fa68df10d46282a41415bf711462773..56569cecaa7852795ab94f6046321f13bddd837e 100644 (file)
                reg = <0>;
                interrupt-parent = <&gpio1>;
                interrupts = <8 IRQ_TYPE_LEVEL_HIGH>;
+               fsl,mc13xxx-uses-rtc;
 
                regulators {
                        sw1_reg: sw1 {
 };
 
 &ssi2 {
-       fsl,mode = "i2s-slave";
        status = "okay";
 };
 
index 31cfb7f2b02ec141d11c3a762f26ffdb1dae1e27..34599c547459a2d00756cb42bc05cca3f2fa2798 100644 (file)
 
 &ssi2 {
        codec-handle = <&tlv320aic23>;
-       fsl,mode = "i2s-slave";
        status = "okay";
 };
 
index bebbf3ba0d5e37acac9b12e11fbefc732110bff6..17c05a6fa77688930e730f40d35a5e777325f1b9 100644 (file)
                                               <&sdma 25 1 0>;
                                        dma-names = "rx", "tx";
                                        fsl,fifo-depth = <15>;
-                                       fsl,ssi-dma-events = <25 24 23 22>; /* TX0 RX0 TX1 RX1 */
                                        status = "disabled";
                                };
 
                                       <&sdma 29 0 0>;
                                dma-names = "rx", "tx";
                                fsl,fifo-depth = <15>;
-                               fsl,ssi-dma-events = <29 28 27 26>; /* TX0 RX0 TX1 RX1 */
                                status = "disabled";
                        };
 
                                       <&sdma 47 0 0>;
                                dma-names = "rx", "tx";
                                fsl,fifo-depth = <15>;
-                               fsl,ssi-dma-events = <47 46 37 35>; /* TX0 RX0 TX1 RX1 */
                                status = "disabled";
                        };
 
diff --git a/arch/arm/boot/dts/imx53-m53.dtsi b/arch/arm/boot/dts/imx53-m53.dtsi
new file mode 100644 (file)
index 0000000..87a7fc7
--- /dev/null
@@ -0,0 +1,140 @@
+/*
+ * Copyright (C) 2014 Marek Vasut <marex@denx.de>
+ *
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+#include "imx53.dtsi"
+
+/ {
+       model = "DENX M53";
+       compatible = "denx,imx53-m53", "fsl,imx53";
+
+       memory {
+               reg = <0x70000000 0x20000000>,
+                     <0xb0000000 0x20000000>;
+       };
+
+       regulators {
+               compatible = "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               reg_3p2v: regulator@0 {
+                       compatible = "regulator-fixed";
+                       reg = <0>;
+                       regulator-name = "3P2V";
+                       regulator-min-microvolt = <3200000>;
+                       regulator-max-microvolt = <3200000>;
+                       regulator-always-on;
+               };
+
+               reg_backlight: regulator@1 {
+                       compatible = "regulator-fixed";
+                       reg = <1>;
+                       regulator-name = "lcd-supply";
+                       regulator-min-microvolt = <3200000>;
+                       regulator-max-microvolt = <3200000>;
+                       regulator-always-on;
+               };
+       };
+};
+
+&i2c2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c2>;
+       clock-frequency = <400000>;
+       status = "okay";
+
+       stmpe610@41 {
+               compatible = "st,stmpe610";
+               #address-cells = <1>;
+               #size-cells = <0>;
+               reg = <0x41>;
+               id = <0>;
+               blocks = <0x5>;
+               interrupts = <6 0x0>;
+               interrupt-parent = <&gpio7>;
+               irq-trigger = <0x1>;
+
+               stmpe_touchscreen {
+                       compatible = "st,stmpe-ts";
+                       reg = <0>;
+                       st,sample-time = <4>;
+                       st,mod-12b = <1>;
+                       st,ref-sel = <0>;
+                       st,adc-freq = <1>;
+                       st,ave-ctrl = <3>;
+                       st,touch-det-delay = <3>;
+                       st,settling = <4>;
+                       st,fraction-z = <7>;
+                       st,i-drive = <1>;
+               };
+       };
+
+       eeprom: eeprom@50 {
+               compatible = "atmel,24c128";
+               reg = <0x50>;
+               pagesize = <32>;
+       };
+
+       rtc: rtc@68 {
+               compatible = "stm,m41t62";
+               reg = <0x68>;
+       };
+};
+
+&iomuxc {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_hog>;
+
+       imx53-m53evk {
+               pinctrl_hog: hoggrp {
+                       fsl,pins = <
+                               MX53_PAD_GPIO_0__CCM_SSI_EXT1_CLK       0x80000000
+                               MX53_PAD_EIM_EB3__GPIO2_31              0x80000000
+                               MX53_PAD_PATA_DA_0__GPIO7_6             0x80000000
+                       >;
+               };
+
+               pinctrl_i2c2: i2c2grp {
+                       fsl,pins = <
+                               MX53_PAD_EIM_D16__I2C2_SDA              0xc0000000
+                               MX53_PAD_EIM_EB2__I2C2_SCL              0xc0000000
+                       >;
+               };
+
+               pinctrl_nand: nandgrp {
+                       fsl,pins = <
+                               MX53_PAD_NANDF_WE_B__EMI_NANDF_WE_B     0x4
+                               MX53_PAD_NANDF_RE_B__EMI_NANDF_RE_B     0x4
+                               MX53_PAD_NANDF_CLE__EMI_NANDF_CLE       0x4
+                               MX53_PAD_NANDF_ALE__EMI_NANDF_ALE       0x4
+                               MX53_PAD_NANDF_WP_B__EMI_NANDF_WP_B     0xe0
+                               MX53_PAD_NANDF_RB0__EMI_NANDF_RB_0      0xe0
+                               MX53_PAD_NANDF_CS0__EMI_NANDF_CS_0      0x4
+                               MX53_PAD_PATA_DATA0__EMI_NANDF_D_0      0xa4
+                               MX53_PAD_PATA_DATA1__EMI_NANDF_D_1      0xa4
+                               MX53_PAD_PATA_DATA2__EMI_NANDF_D_2      0xa4
+                               MX53_PAD_PATA_DATA3__EMI_NANDF_D_3      0xa4
+                               MX53_PAD_PATA_DATA4__EMI_NANDF_D_4      0xa4
+                               MX53_PAD_PATA_DATA5__EMI_NANDF_D_5      0xa4
+                               MX53_PAD_PATA_DATA6__EMI_NANDF_D_6      0xa4
+                               MX53_PAD_PATA_DATA7__EMI_NANDF_D_7      0xa4
+                       >;
+               };
+       };
+};
+
+&nfc {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_nand>;
+       nand-bus-width = <8>;
+       nand-ecc-mode = "hw";
+       status = "okay";
+};
index c4956b0ffb3561c35151373628237769c84c474d..d0e0f57eb432e9822b005e986c105fc7949e028b 100644 (file)
  */
 
 /dts-v1/;
-#include "imx53.dtsi"
+#include "imx53-m53.dtsi"
 
 / {
        model = "DENX M53EVK";
        compatible = "denx,imx53-m53evk", "fsl,imx53";
 
-       memory {
-               reg = <0x70000000 0x20000000>,
-                     <0xb0000000 0x20000000>;
-       };
-
        display1: display@di1 {
                compatible = "fsl,imx-parallel-display";
                interface-pix-fmt = "bgr666";
                #address-cells = <1>;
                #size-cells = <0>;
 
-               reg_3p2v: regulator@0 {
-                       compatible = "regulator-fixed";
-                       reg = <0>;
-                       regulator-name = "3P2V";
-                       regulator-min-microvolt = <3200000>;
-                       regulator-max-microvolt = <3200000>;
-                       regulator-always-on;
-               };
-
-
-               reg_backlight: regulator@1 {
-                       compatible = "regulator-fixed";
-                       reg = <1>;
-                       regulator-name = "lcd-supply";
-                       regulator-min-microvolt = <3200000>;
-                       regulator-max-microvolt = <3200000>;
-                       regulator-always-on;
-               };
-
                reg_usbh1_vbus: regulator@3 {
                        compatible = "regulator-fixed";
                        reg = <3>;
        };
 };
 
-&i2c2 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&pinctrl_i2c2>;
-       clock-frequency = <400000>;
-       status = "okay";
-
-       stmpe610@41 {
-               compatible = "st,stmpe610";
-               #address-cells = <1>;
-               #size-cells = <0>;
-               reg = <0x41>;
-               id = <0>;
-               blocks = <0x5>;
-               interrupts = <6 0x0>;
-               interrupt-parent = <&gpio7>;
-               irq-trigger = <0x1>;
-
-               stmpe_touchscreen {
-                       compatible = "st,stmpe-ts";
-                       reg = <0>;
-                       st,sample-time = <4>;
-                       st,mod-12b = <1>;
-                       st,ref-sel = <0>;
-                       st,adc-freq = <1>;
-                       st,ave-ctrl = <3>;
-                       st,touch-det-delay = <3>;
-                       st,settling = <4>;
-                       st,fraction-z = <7>;
-                       st,i-drive = <1>;
-               };
-       };
-
-       eeprom: eeprom@50 {
-               compatible = "atmel,24c128";
-               reg = <0x50>;
-               pagesize = <32>;
-       };
-
-       rtc: rtc@68 {
-               compatible = "stm,m41t62";
-               reg = <0x68>;
-       };
-};
-
 &i2c3 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_i2c3>;
        pinctrl-0 = <&pinctrl_hog>;
 
        imx53-m53evk {
-               pinctrl_hog: hoggrp {
+               pinctrl_usb: usbgrp {
                        fsl,pins = <
-                               MX53_PAD_GPIO_0__CCM_SSI_EXT1_CLK       0x80000000
-                               MX53_PAD_EIM_EB3__GPIO2_31              0x80000000
-                               MX53_PAD_PATA_DA_0__GPIO7_6             0x80000000
                                MX53_PAD_GPIO_2__GPIO1_2                0x80000000
                                MX53_PAD_GPIO_3__USBOH3_USBH1_OC        0x80000000
                        >;
                        >;
                };
 
-               pinctrl_i2c2: i2c2grp {
-                       fsl,pins = <
-                               MX53_PAD_EIM_D16__I2C2_SDA              0xc0000000
-                               MX53_PAD_EIM_EB2__I2C2_SCL              0xc0000000
-                       >;
-               };
-
                pinctrl_i2c3: i2c3grp {
                        fsl,pins = <
                                MX53_PAD_GPIO_6__I2C3_SDA               0xc0000000
                        >;
                };
 
-               pinctrl_nand: nandgrp {
-                       fsl,pins = <
-                               MX53_PAD_NANDF_WE_B__EMI_NANDF_WE_B     0x4
-                               MX53_PAD_NANDF_RE_B__EMI_NANDF_RE_B     0x4
-                               MX53_PAD_NANDF_CLE__EMI_NANDF_CLE       0x4
-                               MX53_PAD_NANDF_ALE__EMI_NANDF_ALE       0x4
-                               MX53_PAD_NANDF_WP_B__EMI_NANDF_WP_B     0xe0
-                               MX53_PAD_NANDF_RB0__EMI_NANDF_RB_0      0xe0
-                               MX53_PAD_NANDF_CS0__EMI_NANDF_CS_0      0x4
-                               MX53_PAD_PATA_DATA0__EMI_NANDF_D_0      0xa4
-                               MX53_PAD_PATA_DATA1__EMI_NANDF_D_1      0xa4
-                               MX53_PAD_PATA_DATA2__EMI_NANDF_D_2      0xa4
-                               MX53_PAD_PATA_DATA3__EMI_NANDF_D_3      0xa4
-                               MX53_PAD_PATA_DATA4__EMI_NANDF_D_4      0xa4
-                               MX53_PAD_PATA_DATA5__EMI_NANDF_D_5      0xa4
-                               MX53_PAD_PATA_DATA6__EMI_NANDF_D_6      0xa4
-                               MX53_PAD_PATA_DATA7__EMI_NANDF_D_7      0xa4
-                       >;
-               };
-
                pinctrl_pwm1: pwm1grp {
                        fsl,pins = <
                                MX53_PAD_DISP0_DAT8__PWM1_PWMO          0x5
        remote-endpoint = <&display1_in>;
 };
 
-&nfc {
-       pinctrl-names = "default";
-       pinctrl-0 = <&pinctrl_nand>;
-       nand-bus-width = <8>;
-       nand-ecc-mode = "hw";
-       status = "okay";
-};
-
 &pwm1 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_pwm1>;
 };
 
 &ssi2 {
-       fsl,mode = "i2s-slave";
        status = "okay";
 };
 
 };
 
 &usbh1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usb>;
        vbus-supply = <&reg_usbh1_vbus>;
        phy_type = "utmi";
        status = "okay";
index 3e3f17aa93a15e1335cd9fab5ab71bb0b38b47b0..2e44d2aba14e08081075769ac1f59325a4db4d00 100644 (file)
 };
 
 &ssi2 {
-       fsl,mode = "i2s-slave";
        status = "okay";
 };
 
index fd8c60dde7de7078fab6dfa41cb3d3083533d9b2..181ae5ebf23f64396c8a0b24aa01ef7121c73c87 100644 (file)
 };
 
 &ssi2 {
-       fsl,mode = "i2s-slave";
        status = "okay";
 };
 
index e348796ba68957bcfba56d1ab75f5a73374e71c4..704bd72cbfec823da4145ead1fd6e7dc719d094b 100644 (file)
 };
 
 &ssi1 {
-       fsl,mode = "i2s-slave";
        codec-handle = <&sgtl5000>;
        status = "okay";
 };
index 7f6711a486151dad8fa9a7406422eec17164f55e..c17d3ad6dba50213c18a9076ca15c261d6740e77 100644 (file)
 };
 
 &ssi2 {
-       fsl,mode = "i2s-slave";
        status = "okay";
 };
index 6456a0084388cf78b54c217249a7aaab2e323714..64fa27b36be0c957b7e8b39610eac563c730b99b 100644 (file)
                        clocks = <&clks IMX5_CLK_SATA_GATE>,
                                 <&clks IMX5_CLK_SATA_REF>,
                                 <&clks IMX5_CLK_AHB>;
-                       clock-names = "sata_gate", "sata_ref", "ahb";
+                       clock-names = "sata", "sata_ref", "ahb";
                        status = "disabled";
                };
 
                                               <&sdma 25 1 0>;
                                        dma-names = "rx", "tx";
                                        fsl,fifo-depth = <15>;
-                                       fsl,ssi-dma-events = <25 24 23 22>; /* TX0 RX0 TX1 RX1 */
                                        status = "disabled";
                                };
 
                                };
                        };
 
+                       aipstz1: bridge@53f00000 {
+                               compatible = "fsl,imx53-aipstz";
+                               reg = <0x53f00000 0x60>;
+                       };
+
                        usbphy0: usbphy@0 {
                                compatible = "usb-nop-xceiv";
                                clocks = <&clks IMX5_CLK_USB_PHY1_GATE>;
                        reg = <0x60000000 0x10000000>;
                        ranges;
 
+                       aipstz2: bridge@63f00000 {
+                               compatible = "fsl,imx53-aipstz";
+                               reg = <0x63f00000 0x60>;
+                       };
+
                        iim: iim@63f98000 {
                                compatible = "fsl,imx53-iim", "fsl,imx27-iim";
                                reg = <0x63f98000 0x4000>;
                                       <&sdma 29 0 0>;
                                dma-names = "rx", "tx";
                                fsl,fifo-depth = <15>;
-                               fsl,ssi-dma-events = <29 28 27 26>; /* TX0 RX0 TX1 RX1 */
                                status = "disabled";
                        };
 
                                       <&sdma 47 0 0>;
                                dma-names = "rx", "tx";
                                fsl,fifo-depth = <15>;
-                               fsl,ssi-dma-events = <47 46 45 44>; /* TX0 RX0 TX1 RX1 */
                                status = "disabled";
                        };
 
diff --git a/arch/arm/boot/dts/imx6dl-aristainetos_4.dts b/arch/arm/boot/dts/imx6dl-aristainetos_4.dts
new file mode 100644 (file)
index 0000000..9cd06e5
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+ * support fot the imx6 based aristainetos board
+ *
+ * Copyright (C) 2014 Heiko Schocher <hs@denx.de>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+/dts-v1/;
+#include "imx6dl.dtsi"
+#include "imx6qdl-aristainetos.dtsi"
+
+/ {
+       model = "aristainetos i.MX6 Dual Lite Board 4";
+       compatible = "fsl,imx6dl";
+
+       backlight {
+               compatible = "pwm-backlight";
+               pwms = <&pwm1 0 5000000>;
+               brightness-levels = <0 4 8 16 32 64 128 255>;
+               default-brightness-level = <7>;
+               enable-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_backlight>;
+               status = "okay";
+       };
+
+       memory {
+               reg = <0x10000000 0x40000000>;
+       };
+
+       soc {
+               display0: display@di0 {
+                       compatible = "fsl,imx-parallel-display";
+                       interface-pix-fmt = "rgb24";
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&pinctrl_ipu_disp>;
+                       status = "okay";
+
+                       display-timings {
+                               480x800p60 {
+                                       native-mode;
+                                       clock-frequency = <30000000>;
+                                       hactive = <480>;
+                                       vactive = <800>;
+                                       hfront-porch = <59>;
+                                       hback-porch = <10>;
+                                       hsync-len = <10>;
+                                       vback-porch = <15>;
+                                       vfront-porch = <15>;
+                                       vsync-len = <15>;
+                                       hsync-active = <1>;
+                                       vsync-active = <1>;
+                               };
+                       };
+
+                       port {
+                               display0_in: endpoint {
+                                       remote-endpoint = <&ipu1_di0_disp0>;
+                               };
+                       };
+               };
+       };
+};
+
+&ecspi2 {
+       fsl,spi-num-chipselects = <1>;
+       cs-gpios = <&gpio3 24 GPIO_ACTIVE_HIGH>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_ecspi2>;
+       status = "okay";
+};
+
+&i2c2 {
+       clock-frequency = <100000>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c2>;
+       status = "okay";
+};
+
+&ipu1_di0_disp0 {
+       remote-endpoint = <&display0_in>;
+};
diff --git a/arch/arm/boot/dts/imx6dl-aristainetos_7.dts b/arch/arm/boot/dts/imx6dl-aristainetos_7.dts
new file mode 100644 (file)
index 0000000..b413e24
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ * support fot the imx6 based aristainetos board
+ *
+ * Copyright (C) 2014 Heiko Schocher <hs@denx.de>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+/dts-v1/;
+#include "imx6dl.dtsi"
+#include "imx6qdl-aristainetos.dtsi"
+
+/ {
+       model = "aristainetos i.MX6 Dual Lite Board 7";
+       compatible = "fsl,imx6dl";
+
+       memory {
+               reg = <0x10000000 0x40000000>;
+       };
+
+       soc {
+               display0: display@di0 {
+                       compatible = "fsl,imx-parallel-display";
+                       interface-pix-fmt = "rgb24";
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&pinctrl_ipu_disp>;
+                       status = "okay";
+
+                       display-timings {
+                               800x480p60 {
+                                       native-mode;
+                                       clock-frequency = <33246000>;
+                                       hactive = <800>;
+                                       vactive = <480>;
+                                       hfront-porch = <88>;
+                                       hback-porch = <88>;
+                                       hsync-len = <80>;
+                                       vback-porch = <10>;
+                                       vfront-porch = <10>;
+                                       vsync-len = <25>;
+                                       vsync-active = <1>;
+                               };
+                       };
+
+                       port {
+                               display0_in: endpoint {
+                                       remote-endpoint = <&ipu1_di0_disp0>;
+                               };
+                       };
+               };
+       };
+
+       backlight {
+               compatible = "pwm-backlight";
+               pwms = <&pwm3 0 3000>;
+               brightness-levels = <0 4 8 16 32 64 128 255>;
+               default-brightness-level = <6>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_backlight>;
+       };
+};
+
+&i2c2 {
+       clock-frequency = <100000>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c2>;
+       status = "okay";
+};
+
+&ipu1_di0_disp0 {
+       remote-endpoint = <&display0_in>;
+};
index 4bd055f4c93041a8cfddae33b4727368b0a0d1d4..b2bd022fc6be418a04f1e5ddc1ff60ea9da034f6 100644 (file)
@@ -14,6 +14,6 @@
 #include "imx6qdl-gw51xx.dtsi"
 
 / {
-       model = "Gateworks Ventana i.MX6 DualLite GW51XX";
+       model = "Gateworks Ventana i.MX6 DualLite/Solo GW51XX";
        compatible = "gw,imx6dl-gw51xx", "gw,ventana", "fsl,imx6dl";
 };
index c9136058f15e35a2cc8bc97755b9e4a3153e89a0..a2e0b73fdd4a78440aac51149d9b251fc04707af 100644 (file)
@@ -14,6 +14,6 @@
 #include "imx6qdl-gw52xx.dtsi"
 
 / {
-       model = "Gateworks Ventana i.MX6 DualLite GW52XX";
+       model = "Gateworks Ventana i.MX6 DualLite/Solo GW52XX";
        compatible = "gw,imx6dl-gw52xx", "gw,ventana", "fsl,imx6dl";
 };
index 61818a14fde67ff87f5670ca1e7d65c1e7979f08..6844b708d2f89ec09b6da02f0965fad905ed0b3d 100644 (file)
@@ -14,6 +14,6 @@
 #include "imx6qdl-gw53xx.dtsi"
 
 / {
-       model = "Gateworks Ventana i.MX6 DualLite GW53XX";
+       model = "Gateworks Ventana i.MX6 DualLite/Solo GW53XX";
        compatible = "gw,imx6dl-gw53xx", "gw,ventana", "fsl,imx6dl";
 };
index ab38b6770a06000676cd1b97d5ca432216b446d5..be915412f852ea5af34121808ecc22b04c592b4e 100644 (file)
@@ -14,6 +14,6 @@
 #include "imx6qdl-gw54xx.dtsi"
 
 / {
-       model = "Gateworks Ventana i.MX6 DualLite GW54XX";
+       model = "Gateworks Ventana i.MX6 DualLite/Solo GW54XX";
        compatible = "gw,imx6dl-gw54xx", "gw,ventana", "fsl,imx6dl";
 };
diff --git a/arch/arm/boot/dts/imx6dl-rex-basic.dts b/arch/arm/boot/dts/imx6dl-rex-basic.dts
new file mode 100644 (file)
index 0000000..b13845c
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2014 FEDEVEL, Inc.
+ *
+ * Author: Robert Nelson <robertcnelson@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+/dts-v1/;
+#include "imx6dl.dtsi"
+#include "imx6qdl-rex.dtsi"
+
+/ {
+       model = "Rex Basic i.MX6 Dual Lite Board";
+       compatible = "rex,imx6dl-rex-basic", "fsl,imx6dl";
+
+       memory {
+               reg = <0x10000000 0x20000000>;
+       };
+};
+
+&ecspi3 {
+       flash: m25p80@0 {
+               compatible = "sst,sst25vf016b";
+               spi-max-frequency = <20000000>;
+               reg = <0>;
+       };
+};
index 909fafc0b650f4debd18f9f92e7725424ac3efe4..43cb3fd76be764cdceb08efd949f47866ebe03e9 100644 (file)
 };
 
 &ssi1 {
-       fsl,mode = "i2s-slave";
        status = "okay";
 };
 
        imx6-riotboard {
                pinctrl_audmux: audmuxgrp {
                        fsl,pins = <
-                               MX6QDL_PAD_CSI0_DAT7__AUD3_RXD          0x8000000
-                               MX6QDL_PAD_CSI0_DAT4__AUD3_TXC          0x8000000
-                               MX6QDL_PAD_CSI0_DAT5__AUD3_TXD          0x8000000
-                               MX6QDL_PAD_CSI0_DAT6__AUD3_TXFS         0x8000000
+                               MX6QDL_PAD_CSI0_DAT7__AUD3_RXD          0x130b0
+                               MX6QDL_PAD_CSI0_DAT4__AUD3_TXC          0x130b0
+                               MX6QDL_PAD_CSI0_DAT5__AUD3_TXD          0x110b0
+                               MX6QDL_PAD_CSI0_DAT6__AUD3_TXFS         0x130b0
                                MX6QDL_PAD_GPIO_0__CCM_CLKO1            0x130b0         /* CAM_MCLK */
                        >;
                };
                        fsl,pins = <
                                MX6QDL_PAD_ENET_MDIO__ENET_MDIO         0x1b0b0
                                MX6QDL_PAD_ENET_MDC__ENET_MDC           0x1b0b0
-                               MX6QDL_PAD_RGMII_TXC__RGMII_TXC         0x80000000
+                               MX6QDL_PAD_RGMII_TXC__RGMII_TXC         0x1b0b0
                                MX6QDL_PAD_RGMII_TD0__RGMII_TD0         0x1b0b0
                                MX6QDL_PAD_RGMII_TD1__RGMII_TD1         0x1b0b0
                                MX6QDL_PAD_RGMII_TD2__RGMII_TD2         0x1b0b0
                                MX6QDL_PAD_RGMII_RD2__RGMII_RD2         0x1b0b0         /* AR8035 pin strapping: MODE#1: pull up */
                                MX6QDL_PAD_RGMII_RD3__RGMII_RD3         0x1b0b0         /* AR8035 pin strapping: MODE#3: pull up */
                                MX6QDL_PAD_RGMII_RX_CTL__RGMII_RX_CTL   0x130b0         /* AR8035 pin strapping: MODE#0: pull down */
-                               MX6QDL_PAD_GPIO_16__ENET_REF_CLK        0xc0000000      /* GPIO16 -> AR8035 25MHz */
+                               MX6QDL_PAD_GPIO_16__ENET_REF_CLK        0x4001b0a8      /* GPIO16 -> AR8035 25MHz */
                                MX6QDL_PAD_EIM_D31__GPIO3_IO31          0x130b0         /* RGMII_nRST */
-                               MX6QDL_PAD_ENET_TX_EN__GPIO1_IO28       0x80000000      /* AR8035 interrupt */
+                               MX6QDL_PAD_ENET_TX_EN__GPIO1_IO28       0x180b0         /* AR8035 interrupt */
                                MX6QDL_PAD_GPIO_6__ENET_IRQ             0x000b1
                        >;
                };
 
                pinctrl_led: ledgrp {
                        fsl,pins = <
-                               MX6QDL_PAD_EIM_A25__GPIO5_IO02          0x80000000      /* user led0 */
-                               MX6QDL_PAD_EIM_D28__GPIO3_IO28          0x80000000      /* user led1 */
+                               MX6QDL_PAD_EIM_A25__GPIO5_IO02          0x1b0b1 /* user led0 */
+                               MX6QDL_PAD_EIM_D28__GPIO3_IO28          0x1b0b1 /* user led1 */
                        >;
                };
 
                pinctrl_usbotg: usbotggrp {
                        fsl,pins = <
                                MX6QDL_PAD_ENET_RX_ER__USB_OTG_ID       0x17059
-                               MX6QDL_PAD_EIM_D22__GPIO3_IO22          0x80000000      /* MX6QDL_PAD_EIM_D22__USB_OTG_PWR */
-                               MX6QDL_PAD_EIM_D21__USB_OTG_OC          0x80000000
+                               MX6QDL_PAD_EIM_D22__GPIO3_IO22          0x000b0 /* MX6QDL_PAD_EIM_D22__USB_OTG_PWR */
+                               MX6QDL_PAD_EIM_D21__USB_OTG_OC          0x1b0b0
                        >;
                };
 
                                MX6QDL_PAD_SD2_DAT1__SD2_DATA1          0x17059
                                MX6QDL_PAD_SD2_DAT2__SD2_DATA2          0x17059
                                MX6QDL_PAD_SD2_DAT3__SD2_DATA3          0x17059
-                               MX6QDL_PAD_GPIO_4__GPIO1_IO04           0x80000000      /* SD2 CD */
-                               MX6QDL_PAD_GPIO_2__GPIO1_IO02           0x80000000      /* SD2 WP */
+                               MX6QDL_PAD_GPIO_4__GPIO1_IO04           0x1b0b0 /* SD2 CD */
+                               MX6QDL_PAD_GPIO_2__GPIO1_IO02           0x1f0b0 /* SD2 WP */
                        >;
                };
 
                                MX6QDL_PAD_SD3_DAT1__SD3_DATA1          0x17059
                                MX6QDL_PAD_SD3_DAT2__SD3_DATA2          0x17059
                                MX6QDL_PAD_SD3_DAT3__SD3_DATA3          0x17059
-                               MX6QDL_PAD_SD3_DAT5__GPIO7_IO00         0x80000000      /* SD3 CD */
-                               MX6QDL_PAD_SD3_DAT4__GPIO7_IO01         0x80000000      /* SD3 WP */
+                               MX6QDL_PAD_SD3_DAT5__GPIO7_IO00         0x1b0b0 /* SD3 CD */
+                               MX6QDL_PAD_SD3_DAT4__GPIO7_IO01         0x1f0b0 /* SD3 WP */
                        >;
                };
 
                                MX6QDL_PAD_SD4_DAT1__SD4_DATA1          0x17059
                                MX6QDL_PAD_SD4_DAT2__SD4_DATA2          0x17059
                                MX6QDL_PAD_SD4_DAT3__SD4_DATA3          0x17059
-                               MX6QDL_PAD_NANDF_ALE__GPIO6_IO08        0x80000000      /* SD4 RST (eMMC) */
+                               MX6QDL_PAD_NANDF_ALE__GPIO6_IO08        0x17059 /* SD4 RST (eMMC) */
                        >;
                };
        };
diff --git a/arch/arm/boot/dts/imx6dl-tx6dl-comtft.dts b/arch/arm/boot/dts/imx6dl-tx6dl-comtft.dts
new file mode 100644 (file)
index 0000000..913bb9a
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2014 Lothar Waßmann <LW@KARO-electronics.de>
+ *
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/dts-v1/;
+#include "imx6dl.dtsi"
+#include "imx6qdl-tx6.dtsi"
+
+/ {
+       model = "Ka-Ro electronics TX6DL Module on CoMpact TFT";
+       compatible = "karo,imx6dl-tx6dl", "fsl,imx6dl";
+
+       aliases {
+               display = &display;
+       };
+
+       backlight: backlight {
+               compatible = "pwm-backlight";
+               pwms = <&pwm2 0 500000 0>;
+               power-supply = <&reg_3v3>;
+               /*
+                * a poor man's way to create a 1:1 relationship between
+                * the PWM value and the actual duty cycle
+                */
+               brightness-levels = < 0  1  2  3  4  5  6  7  8  9
+                                    10 11 12 13 14 15 16 17 18 19
+                                    20 21 22 23 24 25 26 27 28 29
+                                    30 31 32 33 34 35 36 37 38 39
+                                    40 41 42 43 44 45 46 47 48 49
+                                    50 51 52 53 54 55 56 57 58 59
+                                    60 61 62 63 64 65 66 67 68 69
+                                    70 71 72 73 74 75 76 77 78 79
+                                    80 81 82 83 84 85 86 87 88 89
+                                    90 91 92 93 94 95 96 97 98 99
+                                   100>;
+               default-brightness-level = <50>;
+       };
+
+       display: display@di0 {
+               compatible = "fsl,imx-parallel-display";
+               interface-pix-fmt = "rgb24";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_disp0_1>;
+               status = "okay";
+
+               port {
+                       display0_in: endpoint {
+                               remote-endpoint = <&ipu1_di0_disp0>;
+                       };
+               };
+
+               display-timings {
+                       native-mode = <&ET070001DM6>;
+
+                       ET070001DM6: CoMTFT { /* same as ET0700 but with inverted pixel clock */
+                               clock-frequency = <33264000>;
+                               hactive = <800>;
+                               vactive = <480>;
+                               hback-porch = <88>;
+                               hsync-len = <128>;
+                               hfront-porch = <40>;
+                               vback-porch = <33>;
+                               vsync-len = <2>;
+                               vfront-porch = <10>;
+                               hsync-active = <0>;
+                               vsync-active = <0>;
+                               de-active = <1>;
+                               pixelclk-active = <1>;
+                       };
+               };
+        };
+};
+
+&can1 {
+       status = "disabled";
+};
+
+&can2 {
+       xceiver-supply = <&reg_3v3>;
+};
+
+&ipu1_di0_disp0 {
+       remote-endpoint = <&display0_in>;
+};
+
+&kpp {
+       status = "disabled";
+};
+
+&reg_can_xcvr {
+       status = "disabled";
+};
+
+&touchscreen {
+       status = "disabled";
+};
diff --git a/arch/arm/boot/dts/imx6dl-tx6u-801x.dts b/arch/arm/boot/dts/imx6dl-tx6u-801x.dts
new file mode 100644 (file)
index 0000000..5fe465c
--- /dev/null
@@ -0,0 +1,177 @@
+/*
+ * Copyright 2014 Lothar Waßmann <LW@KARO-electronics.de>
+ *
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/dts-v1/;
+#include "imx6dl.dtsi"
+#include "imx6qdl-tx6.dtsi"
+
+/ {
+       model = "Ka-Ro electronics TX6U-801x Module";
+       compatible = "karo,imx6dl-tx6dl", "fsl,imx6dl";
+
+       aliases {
+               display = &display;
+       };
+
+       backlight: backlight {
+               compatible = "pwm-backlight";
+               pwms = <&pwm2 0 500000 PWM_POLARITY_INVERTED>;
+               power-supply = <&reg_3v3>;
+               /*
+                * a poor man's way to create a 1:1 relationship between
+                * the PWM value and the actual duty cycle
+                */
+               brightness-levels = < 0  1  2  3  4  5  6  7  8  9
+                                    10 11 12 13 14 15 16 17 18 19
+                                    20 21 22 23 24 25 26 27 28 29
+                                    30 31 32 33 34 35 36 37 38 39
+                                    40 41 42 43 44 45 46 47 48 49
+                                    50 51 52 53 54 55 56 57 58 59
+                                    60 61 62 63 64 65 66 67 68 69
+                                    70 71 72 73 74 75 76 77 78 79
+                                    80 81 82 83 84 85 86 87 88 89
+                                    90 91 92 93 94 95 96 97 98 99
+                                   100>;
+               default-brightness-level = <50>;
+       };
+
+       display: display@di0 {
+               compatible = "fsl,imx-parallel-display";
+               interface-pix-fmt = "rgb24";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_disp0_1>;
+               status = "okay";
+
+               port {
+                       display0_in: endpoint {
+                               remote-endpoint = <&ipu1_di0_disp0>;
+                       };
+               };
+
+               display-timings {
+                       VGA {
+                               clock-frequency = <25200000>;
+                               hactive = <640>;
+                               vactive = <480>;
+                               hback-porch = <48>;
+                               hsync-len = <96>;
+                               hfront-porch = <16>;
+                               vback-porch = <31>;
+                               vsync-len = <2>;
+                               vfront-porch = <12>;
+                               hsync-active = <0>;
+                               vsync-active = <0>;
+                               de-active = <1>;
+                               pixelclk-active = <0>;
+                       };
+
+                       ETV570 {
+                               clock-frequency = <25200000>;
+                               hactive = <640>;
+                               vactive = <480>;
+                               hback-porch = <114>;
+                               hsync-len = <30>;
+                               hfront-porch = <16>;
+                               vback-porch = <32>;
+                               vsync-len = <3>;
+                               vfront-porch = <10>;
+                               hsync-active = <0>;
+                               vsync-active = <0>;
+                               de-active = <1>;
+                               pixelclk-active = <0>;
+                       };
+
+                       ET0350 {
+                               clock-frequency = <6413760>;
+                               hactive = <320>;
+                               vactive = <240>;
+                               hback-porch = <34>;
+                               hsync-len = <34>;
+                               hfront-porch = <20>;
+                               vback-porch = <15>;
+                               vsync-len = <3>;
+                               vfront-porch = <4>;
+                               hsync-active = <0>;
+                               vsync-active = <0>;
+                               de-active = <1>;
+                               pixelclk-active = <0>;
+                       };
+
+                       ET0430 {
+                               clock-frequency = <9009000>;
+                               hactive = <480>;
+                               vactive = <272>;
+                               hback-porch = <2>;
+                               hsync-len = <41>;
+                               hfront-porch = <2>;
+                               vback-porch = <2>;
+                               vsync-len = <10>;
+                               vfront-porch = <2>;
+                               hsync-active = <0>;
+                               vsync-active = <0>;
+                               de-active = <1>;
+                               pixelclk-active = <1>;
+                       };
+
+                       ET0500 {
+                               clock-frequency = <33264000>;
+                               hactive = <800>;
+                               vactive = <480>;
+                               hback-porch = <88>;
+                               hsync-len = <128>;
+                               hfront-porch = <40>;
+                               vback-porch = <33>;
+                               vsync-len = <2>;
+                               vfront-porch = <10>;
+                               hsync-active = <0>;
+                               vsync-active = <0>;
+                               de-active = <1>;
+                               pixelclk-active = <0>;
+                       };
+
+                       ET0700 { /* same as ET0500 */
+                               clock-frequency = <33264000>;
+                               hactive = <800>;
+                               vactive = <480>;
+                               hback-porch = <88>;
+                               hsync-len = <128>;
+                               hfront-porch = <40>;
+                               vback-porch = <33>;
+                               vsync-len = <2>;
+                               vfront-porch = <10>;
+                               hsync-active = <0>;
+                               vsync-active = <0>;
+                               de-active = <1>;
+                               pixelclk-active = <0>;
+                       };
+
+                       ETQ570 {
+                               clock-frequency = <6596040>;
+                               hactive = <320>;
+                               vactive = <240>;
+                               hback-porch = <38>;
+                               hsync-len = <30>;
+                               hfront-porch = <30>;
+                               vback-porch = <16>;
+                               vsync-len = <3>;
+                               vfront-porch = <4>;
+                               hsync-active = <0>;
+                               vsync-active = <0>;
+                               de-active = <1>;
+                               pixelclk-active = <0>;
+                       };
+               };
+        };
+};
+
+&ipu1_di0_disp0 {
+       remote-endpoint = <&display0_in>;
+};
diff --git a/arch/arm/boot/dts/imx6dl-tx6u-811x.dts b/arch/arm/boot/dts/imx6dl-tx6u-811x.dts
new file mode 100644 (file)
index 0000000..c275eec
--- /dev/null
@@ -0,0 +1,150 @@
+/*
+ * Copyright 2014 Lothar Waßmann <LW@KARO-electronics.de>
+ *
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/dts-v1/;
+#include "imx6dl.dtsi"
+#include "imx6qdl-tx6.dtsi"
+
+/ {
+       model = "Ka-Ro electronics TX6U-811x Module";
+       compatible = "karo,imx6dl-tx6dl", "fsl,imx6dl";
+
+       aliases {
+               display = &lvds0;
+               lvds0 = &lvds0;
+               lvds1 = &lvds1;
+       };
+
+       backlight0: backlight0 {
+               compatible = "pwm-backlight";
+               pwms = <&pwm2 0 500000 0>;
+               power-supply = <&reg_lcd0_pwr>;
+               /*
+                * a poor man's way to create a 1:1 relationship between
+                * the PWM value and the actual duty cycle
+                */
+               brightness-levels = < 0  1  2  3  4  5  6  7  8  9
+                                    10 11 12 13 14 15 16 17 18 19
+                                    20 21 22 23 24 25 26 27 28 29
+                                    30 31 32 33 34 35 36 37 38 39
+                                    40 41 42 43 44 45 46 47 48 49
+                                    50 51 52 53 54 55 56 57 58 59
+                                    60 61 62 63 64 65 66 67 68 69
+                                    70 71 72 73 74 75 76 77 78 79
+                                    80 81 82 83 84 85 86 87 88 89
+                                    90 91 92 93 94 95 96 97 98 99
+                                   100>;
+               default-brightness-level = <50>;
+       };
+
+       backlight1: backlight1 {
+               compatible = "pwm-backlight";
+               pwms = <&pwm1 0 500000 0>;
+               power-supply = <&reg_lcd1_pwr>;
+               /*
+                * a poor man's way to create a 1:1 relationship between
+                * the PWM value and the actual duty cycle
+                */
+               brightness-levels = < 0  1  2  3  4  5  6  7  8  9
+                                    10 11 12 13 14 15 16 17 18 19
+                                    20 21 22 23 24 25 26 27 28 29
+                                    30 31 32 33 34 35 36 37 38 39
+                                    40 41 42 43 44 45 46 47 48 49
+                                    50 51 52 53 54 55 56 57 58 59
+                                    60 61 62 63 64 65 66 67 68 69
+                                    70 71 72 73 74 75 76 77 78 79
+                                    80 81 82 83 84 85 86 87 88 89
+                                    90 91 92 93 94 95 96 97 98 99
+                                   100>;
+               default-brightness-level = <50>;
+       };
+};
+
+&i2c3 {
+       polytouch2: eeti@04 {
+               compatible = "eeti,egalax_ts";
+               reg = <0x04>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_eeti>;
+               interrupt-parent = <&gpio3>;
+               interrupts = <22 0>;
+               wakeup-gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
+               linux,wakeup;
+       };
+};
+
+&iomuxc {
+       imx6dl-tx6u-811x {
+               pinctrl_eeti: eetigrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_EIM_D22__GPIO3_IO22 0x1b0b1 /* Interrupt */
+                       >;
+               };
+       };
+};
+
+&kpp {
+       status = "disabled"; /* pad conflict with backlight1 PWM */
+};
+
+&ldb {
+       status = "okay";
+
+       lvds0: lvds-channel@0 {
+               fsl,data-mapping = "spwg";
+               fsl,data-width = <18>;
+               status = "okay";
+
+               display-timings {
+                       native-mode = <&lvds_timing0>;
+                       lvds_timing0: hsd100pxn1 {
+                               clock-frequency = <65000000>;
+                               hactive = <1024>;
+                               vactive = <768>;
+                               hback-porch = <220>;
+                               hfront-porch = <40>;
+                               vback-porch = <21>;
+                               vfront-porch = <7>;
+                               hsync-len = <60>;
+                               vsync-len = <10>;
+                               de-active = <1>;
+                               pixelclk-active = <1>;
+                       };
+               };
+       };
+
+       lvds1: lvds-channel@1 {
+               fsl,data-mapping = "spwg";
+               fsl,data-width = <18>;
+               status = "disabled";
+
+               display-timings {
+                       native-mode = <&lvds_timing1>;
+                       lvds_timing1: hsd100pxn1 {
+                               clock-frequency = <65000000>;
+                               hactive = <1024>;
+                               vactive = <768>;
+                               hback-porch = <220>;
+                               hfront-porch = <40>;
+                               vback-porch = <21>;
+                               vfront-porch = <7>;
+                               hsync-len = <60>;
+                               vsync-len = <10>;
+                               de-active = <1>;
+                               pixelclk-active = <1>;
+                       };
+               };
+       };
+};
+
+&pwm1 {
+       status = "okay";
+};
diff --git a/arch/arm/boot/dts/imx6dl-wandboard-revb1.dts b/arch/arm/boot/dts/imx6dl-wandboard-revb1.dts
new file mode 100644 (file)
index 0000000..f607d4f
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2013 Freescale Semiconductor, Inc.
+ *
+ * Author: Fabio Estevam <fabio.estevam@freescale.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+/dts-v1/;
+#include "imx6dl.dtsi"
+#include "imx6qdl-wandboard-revb1.dtsi"
+
+/ {
+       model = "Wandboard i.MX6 Dual Lite Board";
+       compatible = "wand,imx6dl-wandboard", "fsl,imx6dl";
+
+       memory {
+               reg = <0x10000000 0x40000000>;
+       };
+};
index e672891c1626757cd751888a9b97b78066558947..bbb6167230972661a6dc58347a68760dce85ef8c 100644 (file)
@@ -10,7 +10,7 @@
  */
 /dts-v1/;
 #include "imx6dl.dtsi"
-#include "imx6qdl-wandboard.dtsi"
+#include "imx6qdl-wandboard-revc1.dtsi"
 
 / {
        model = "Wandboard i.MX6 Dual Lite Board";
index 0a9c49d69d418c4ea46320e33f055b94d4ec2c54..b453e0e28aeec5d537e4b4da0f664f36d946bb70 100644 (file)
                                396000  1175000
                        >;
                        clock-latency = <61036>; /* two CLK32 periods */
-                       clocks = <&clks 104>, <&clks 6>, <&clks 16>,
-                                <&clks 17>, <&clks 170>;
+                       clocks = <&clks IMX6QDL_CLK_ARM>,
+                                <&clks IMX6QDL_CLK_PLL2_PFD2_396M>,
+                                <&clks IMX6QDL_CLK_STEP>,
+                                <&clks IMX6QDL_CLK_PLL1_SW>,
+                                <&clks IMX6QDL_CLK_PLL1_SYS>;
                        clock-names = "arm", "pll2_pfd2_396m", "step",
                                      "pll1_sw", "pll1_sys";
                        arm-supply = <&reg_arm>;
@@ -56,7 +59,7 @@
                ocram: sram@00900000 {
                        compatible = "mmio-sram";
                        reg = <0x00900000 0x20000>;
-                       clocks = <&clks 142>;
+                       clocks = <&clks IMX6QDL_CLK_OCRAM>;
                };
 
                aips1: aips-bus@02000000 {
@@ -87,7 +90,7 @@
                                compatible = "fsl,imx6q-i2c", "fsl,imx21-i2c";
                                reg = <0x021f8000 0x4000>;
                                interrupts = <0 35 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clks 116>;
+                               clocks = <&clks IMX6DL_CLK_I2C4>;
                                status = "disabled";
                        };
                };
 };
 
 &ldb {
-       clocks = <&clks 33>, <&clks 34>,
-                <&clks 39>, <&clks 40>,
-                <&clks 135>, <&clks 136>;
+       clocks = <&clks IMX6QDL_CLK_LDB_DI0_SEL>, <&clks IMX6QDL_CLK_LDB_DI1_SEL>,
+                <&clks IMX6QDL_CLK_IPU1_DI0_SEL>, <&clks IMX6QDL_CLK_IPU1_DI1_SEL>,
+                <&clks IMX6QDL_CLK_LDB_DI0>, <&clks IMX6QDL_CLK_LDB_DI1>;
        clock-names = "di0_pll", "di1_pll",
                      "di0_sel", "di1_sel",
                      "di0", "di1";
index bc5f31e3e892f2617927bd28ac3e2c133a7e0a4a..9efd8b0c8011fea501c0033e3da5dd5cfed3e849 100644 (file)
@@ -13,4 +13,8 @@
 
 &sata {
        status = "okay";
+       fsl,transmit-level-mV = <1104>;
+       fsl,transmit-boost-mdB = <0>;
+       fsl,transmit-atten-16ths = <9>;
+       fsl,no-spread-spectrum;
 };
index e0302636aff5164d52ffbf6f7d4f710c43929ed8..8c1cb53464a0f6bb7e96cd7a412c0a2e2eea8489 100644 (file)
        };
 };
 
+&can1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_can1>;
+       status = "okay";
+};
+
 &ecspi5 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_ecspi5>;
        status = "okay";
 };
 
+&i2c1 {
+       clock-frequency = <100000>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c1>;
+       status = "okay";
+};
+
 &i2c2 {
        clock-frequency = <100000>;
        pinctrl-names = "default";
        };
 };
 
+&i2c3 {
+       clock-frequency = <100000>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c3>;
+       status = "okay";
+};
+
 &iomuxc {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_hog>;
                        >;
                };
 
+               pinctrl_can1: can1grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_KEY_ROW2__FLEXCAN1_RX        0x1b0b0
+                               MX6QDL_PAD_GPIO_7__FLEXCAN1_TX          0x1b0b0
+                       >;
+               };
+
                pinctrl_ecspi5: ecspi5rp-1 {
                        fsl,pins = <
                                MX6QDL_PAD_SD1_DAT0__ECSPI5_MISO        0x80000000
                        >;
                };
 
+               pinctrl_i2c1: i2c1grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_EIM_D21__I2C1_SCL            0x4001b8b1
+                               MX6QDL_PAD_EIM_D28__I2C1_SDA            0x4001b8b1
+                       >;
+               };
+
                pinctrl_i2c2: i2c2grp {
                        fsl,pins = <
                                MX6QDL_PAD_EIM_EB2__I2C2_SCL            0x4001b8b1
                        >;
                };
 
+               pinctrl_i2c3: i2c3grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_EIM_D17__I2C3_SCL            0x4001b8b1
+                               MX6QDL_PAD_GPIO_6__I2C3_SDA             0x4001b8b1
+                       >;
+               };
+
+               pinctrl_pcie: pciegrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_KEY_COL1__GPIO4_IO08         0x100b1
+                       >;
+               };
+
                pinctrl_pfuze: pfuze100grp1 {
                        fsl,pins = <
                                MX6QDL_PAD_EIM_D20__GPIO3_IO20          0x80000000
        };
 };
 
+&pcie {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_pcie>;
+       reset-gpio = <&gpio4 8 0>;
+       status = "okay";
+};
+
 &sata {
        status = "okay";
 };
index 0e1406e58eff1d73a3601d09858147fecbb1b9e0..8e8bcd8fe0fb1c11dc63c5b58760ab1768919510 100644 (file)
@@ -14,6 +14,6 @@
 #include "imx6qdl-gw51xx.dtsi"
 
 / {
-       model = "Gateworks Ventana i.MX6 Quad GW51XX";
+       model = "Gateworks Ventana i.MX6 Dual/Quad GW51XX";
        compatible = "gw,imx6q-gw51xx", "gw,ventana", "fsl,imx6q";
 };
index 5f71ddbc7f05ac6d503a45cd1d2ba02508d7d6ae..a12c47e5ee059fbf45216ee6a9e65ce06f2f97b0 100644 (file)
@@ -14,7 +14,7 @@
 #include "imx6qdl-gw52xx.dtsi"
 
 / {
-       model = "Gateworks Ventana i.MX6 Quad GW52XX";
+       model = "Gateworks Ventana i.MX6 Dual/Quad GW52XX";
        compatible = "gw,imx6q-gw52xx", "gw,ventana", "fsl,imx6q";
 };
 
index 360c316b47402d440ba94cb404598401c07173ae..d76aaa83dad070ade4861a599dee1168da69c5cf 100644 (file)
@@ -14,7 +14,7 @@
 #include "imx6qdl-gw53xx.dtsi"
 
 / {
-       model = "Gateworks Ventana i.MX6 Quad GW53XX";
+       model = "Gateworks Ventana i.MX6 Dual/Quad GW53XX";
        compatible = "gw,imx6q-gw53xx", "gw,ventana", "fsl,imx6q";
 };
 
index 3689eaa58826eecebce2ec4dd4adda99b12d2fc2..22e6f8e657d2389f97b2c12bc14181d34d34819e 100644 (file)
        };
 
        sound {
-               compatible = "fsl,imx6q-sabrelite-sgtl5000",
+               compatible = "fsl,imx6q-ventana-sgtl5000",
                             "fsl,imx-audio-sgtl5000";
-               model = "imx6q-sabrelite-sgtl5000";
+               model = "sgtl5000-audio";
                ssi-controller = <&ssi1>;
                audio-codec = <&codec>;
                audio-routing =
 };
 
 &ssi1 {
-       fsl,mode = "i2s-slave";
        status = "okay";
 };
 
index ab518d66a75eadf842a9c5ece60abf4fd2c9acdf..6e8f53e92a2d24d49d4d1fb15788a4237fe08890 100644 (file)
@@ -14,7 +14,7 @@
 #include "imx6qdl-gw54xx.dtsi"
 
 / {
-       model = "Gateworks Ventana i.MX6 Quad GW54XX";
+       model = "Gateworks Ventana i.MX6 Dual/Quad GW54XX";
        compatible = "gw,imx6q-gw54xx", "gw,ventana", "fsl,imx6q";
 };
 
diff --git a/arch/arm/boot/dts/imx6q-rex-pro.dts b/arch/arm/boot/dts/imx6q-rex-pro.dts
new file mode 100644 (file)
index 0000000..3c2852b
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2014 FEDEVEL, Inc.
+ *
+ * Author: Robert Nelson <robertcnelson@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+/dts-v1/;
+#include "imx6q.dtsi"
+#include "imx6qdl-rex.dtsi"
+
+/ {
+       model = "Rex Pro i.MX6 Quad Board";
+       compatible = "rex,imx6q-rex-pro", "fsl,imx6q";
+
+       memory {
+               reg = <0x10000000 0x80000000>;
+       };
+};
+
+&ecspi3 {
+       flash: m25p80@0 {
+               compatible = "sst,sst25vf032b";
+               spi-max-frequency = <20000000>;
+               reg = <0>;
+       };
+};
+
+&sata {
+       status = "okay";
+};
diff --git a/arch/arm/boot/dts/imx6q-tx6q-1010-comtft.dts b/arch/arm/boot/dts/imx6q-tx6q-1010-comtft.dts
new file mode 100644 (file)
index 0000000..b18fae1
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2014 Lothar Waßmann <LW@KARO-electronics.de>
+ *
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/dts-v1/;
+#include "imx6q.dtsi"
+#include "imx6qdl-tx6.dtsi"
+
+/ {
+       model = "Ka-Ro electronics TX6Q-1010 Module on CoMpact TFT";
+       compatible = "karo,imx6q-tx6q", "fsl,imx6q";
+
+       aliases {
+               display = &display;
+       };
+
+       backlight: backlight {
+               compatible = "pwm-backlight";
+               pwms = <&pwm2 0 500000 0>;
+               power-supply = <&reg_3v3>;
+               /*
+                * a poor man's way to create a 1:1 relationship between
+                * the PWM value and the actual duty cycle
+                */
+               brightness-levels = < 0  1  2  3  4  5  6  7  8  9
+                                    10 11 12 13 14 15 16 17 18 19
+                                    20 21 22 23 24 25 26 27 28 29
+                                    30 31 32 33 34 35 36 37 38 39
+                                    40 41 42 43 44 45 46 47 48 49
+                                    50 51 52 53 54 55 56 57 58 59
+                                    60 61 62 63 64 65 66 67 68 69
+                                    70 71 72 73 74 75 76 77 78 79
+                                    80 81 82 83 84 85 86 87 88 89
+                                    90 91 92 93 94 95 96 97 98 99
+                                   100>;
+               default-brightness-level = <50>;
+       };
+
+       display: display@di0 {
+               compatible = "fsl,imx-parallel-display";
+               interface-pix-fmt = "rgb24";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_disp0_1>;
+               status = "okay";
+
+               port {
+                       display0_in: endpoint {
+                               remote-endpoint = <&ipu1_di0_disp0>;
+                       };
+               };
+
+               display-timings {
+                       native-mode = <&ET070001DM6>;
+
+                       ET070001DM6: CoMTFT { /* same as ET0700 but with inverted pixel clock */
+                               clock-frequency = <33264000>;
+                               hactive = <800>;
+                               vactive = <480>;
+                               hback-porch = <88>;
+                               hsync-len = <128>;
+                               hfront-porch = <40>;
+                               vback-porch = <33>;
+                               vsync-len = <2>;
+                               vfront-porch = <10>;
+                               hsync-active = <0>;
+                               vsync-active = <0>;
+                               de-active = <1>;
+                               pixelclk-active = <1>;
+                       };
+               };
+        };
+};
+
+&can1 {
+       status = "disabled";
+};
+
+&can2 {
+       xceiver-supply = <&reg_3v3>;
+};
+
+&ipu1_di0_disp0 {
+       remote-endpoint = <&display0_in>;
+};
+
+&kpp {
+       status = "disabled";
+};
+
+&reg_can_xcvr {
+       status = "disabled";
+};
+
+&touchscreen {
+       status = "disabled";
+};
diff --git a/arch/arm/boot/dts/imx6q-tx6q-1010.dts b/arch/arm/boot/dts/imx6q-tx6q-1010.dts
new file mode 100644 (file)
index 0000000..b58ec9c
--- /dev/null
@@ -0,0 +1,177 @@
+/*
+ * Copyright 2014 Lothar Waßmann <LW@KARO-electronics.de>
+ *
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/dts-v1/;
+#include "imx6q.dtsi"
+#include "imx6qdl-tx6.dtsi"
+
+/ {
+       model = "Ka-Ro electronics TX6Q-1010 Module";
+       compatible = "karo,imx6q-tx6q", "fsl,imx6q";
+
+       aliases {
+               display = &display;
+       };
+
+       backlight: backlight {
+               compatible = "pwm-backlight";
+               pwms = <&pwm2 0 500000 PWM_POLARITY_INVERTED>;
+               power-supply = <&reg_3v3>;
+               /*
+                * a poor man's way to create a 1:1 relationship between
+                * the PWM value and the actual duty cycle
+                */
+               brightness-levels = < 0  1  2  3  4  5  6  7  8  9
+                                    10 11 12 13 14 15 16 17 18 19
+                                    20 21 22 23 24 25 26 27 28 29
+                                    30 31 32 33 34 35 36 37 38 39
+                                    40 41 42 43 44 45 46 47 48 49
+                                    50 51 52 53 54 55 56 57 58 59
+                                    60 61 62 63 64 65 66 67 68 69
+                                    70 71 72 73 74 75 76 77 78 79
+                                    80 81 82 83 84 85 86 87 88 89
+                                    90 91 92 93 94 95 96 97 98 99
+                                   100>;
+               default-brightness-level = <50>;
+       };
+
+       display: display@di0 {
+               compatible = "fsl,imx-parallel-display";
+               interface-pix-fmt = "rgb24";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_disp0_1>;
+               status = "okay";
+
+               port {
+                       display0_in: endpoint {
+                               remote-endpoint = <&ipu1_di0_disp0>;
+                       };
+               };
+
+               display-timings {
+                       VGA {
+                               clock-frequency = <25200000>;
+                               hactive = <640>;
+                               vactive = <480>;
+                               hback-porch = <48>;
+                               hsync-len = <96>;
+                               hfront-porch = <16>;
+                               vback-porch = <31>;
+                               vsync-len = <2>;
+                               vfront-porch = <12>;
+                               hsync-active = <0>;
+                               vsync-active = <0>;
+                               de-active = <1>;
+                               pixelclk-active = <0>;
+                       };
+
+                       ETV570 {
+                               clock-frequency = <25200000>;
+                               hactive = <640>;
+                               vactive = <480>;
+                               hback-porch = <114>;
+                               hsync-len = <30>;
+                               hfront-porch = <16>;
+                               vback-porch = <32>;
+                               vsync-len = <3>;
+                               vfront-porch = <10>;
+                               hsync-active = <0>;
+                               vsync-active = <0>;
+                               de-active = <1>;
+                               pixelclk-active = <0>;
+                       };
+
+                       ET0350 {
+                               clock-frequency = <6413760>;
+                               hactive = <320>;
+                               vactive = <240>;
+                               hback-porch = <34>;
+                               hsync-len = <34>;
+                               hfront-porch = <20>;
+                               vback-porch = <15>;
+                               vsync-len = <3>;
+                               vfront-porch = <4>;
+                               hsync-active = <0>;
+                               vsync-active = <0>;
+                               de-active = <1>;
+                               pixelclk-active = <0>;
+                       };
+
+                       ET0430 {
+                               clock-frequency = <9009000>;
+                               hactive = <480>;
+                               vactive = <272>;
+                               hback-porch = <2>;
+                               hsync-len = <41>;
+                               hfront-porch = <2>;
+                               vback-porch = <2>;
+                               vsync-len = <10>;
+                               vfront-porch = <2>;
+                               hsync-active = <0>;
+                               vsync-active = <0>;
+                               de-active = <1>;
+                               pixelclk-active = <1>;
+                       };
+
+                       ET0500 {
+                               clock-frequency = <33264000>;
+                               hactive = <800>;
+                               vactive = <480>;
+                               hback-porch = <88>;
+                               hsync-len = <128>;
+                               hfront-porch = <40>;
+                               vback-porch = <33>;
+                               vsync-len = <2>;
+                               vfront-porch = <10>;
+                               hsync-active = <0>;
+                               vsync-active = <0>;
+                               de-active = <1>;
+                               pixelclk-active = <0>;
+                       };
+
+                       ET0700 { /* same as ET0500 */
+                               clock-frequency = <33264000>;
+                               hactive = <800>;
+                               vactive = <480>;
+                               hback-porch = <88>;
+                               hsync-len = <128>;
+                               hfront-porch = <40>;
+                               vback-porch = <33>;
+                               vsync-len = <2>;
+                               vfront-porch = <10>;
+                               hsync-active = <0>;
+                               vsync-active = <0>;
+                               de-active = <1>;
+                               pixelclk-active = <0>;
+                       };
+
+                       ETQ570 {
+                               clock-frequency = <6596040>;
+                               hactive = <320>;
+                               vactive = <240>;
+                               hback-porch = <38>;
+                               hsync-len = <30>;
+                               hfront-porch = <30>;
+                               vback-porch = <16>;
+                               vsync-len = <3>;
+                               vfront-porch = <4>;
+                               hsync-active = <0>;
+                               vsync-active = <0>;
+                               de-active = <1>;
+                               pixelclk-active = <0>;
+                       };
+               };
+        };
+};
+
+&ipu1_di0_disp0 {
+       remote-endpoint = <&display0_in>;
+};
diff --git a/arch/arm/boot/dts/imx6q-tx6q-1020-comtft.dts b/arch/arm/boot/dts/imx6q-tx6q-1020-comtft.dts
new file mode 100644 (file)
index 0000000..0bb9a9d
--- /dev/null
@@ -0,0 +1,136 @@
+/*
+ * Copyright 2014 Lothar Waßmann <LW@KARO-electronics.de>
+ *
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/dts-v1/;
+#include "imx6q.dtsi"
+#include "imx6qdl-tx6.dtsi"
+
+/ {
+       model = "Ka-Ro electronics TX6Q-1020 Module on CoMpact TFT";
+       compatible = "karo,imx6q-tx6q", "fsl,imx6q";
+
+       aliases {
+               display = &display;
+       };
+
+       backlight: backlight {
+               compatible = "pwm-backlight";
+               pwms = <&pwm2 0 500000 0>;
+               power-supply = <&reg_3v3>;
+               /*
+                * a poor man's way to create a 1:1 relationship between
+                * the PWM value and the actual duty cycle
+                */
+               brightness-levels = < 0  1  2  3  4  5  6  7  8  9
+                                    10 11 12 13 14 15 16 17 18 19
+                                    20 21 22 23 24 25 26 27 28 29
+                                    30 31 32 33 34 35 36 37 38 39
+                                    40 41 42 43 44 45 46 47 48 49
+                                    50 51 52 53 54 55 56 57 58 59
+                                    60 61 62 63 64 65 66 67 68 69
+                                    70 71 72 73 74 75 76 77 78 79
+                                    80 81 82 83 84 85 86 87 88 89
+                                    90 91 92 93 94 95 96 97 98 99
+                                   100>;
+               default-brightness-level = <50>;
+       };
+
+       display: display@di0 {
+               compatible = "fsl,imx-parallel-display";
+               interface-pix-fmt = "rgb24";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_disp0_1>;
+               status = "okay";
+
+               port {
+                       display0_in: endpoint {
+                               remote-endpoint = <&ipu1_di0_disp0>;
+                       };
+               };
+
+               display-timings {
+                       native-mode = <&ET070001DM6>;
+
+                       ET070001DM6: CoMTFT { /* same as ET0700 but with inverted pixel clock */
+                               clock-frequency = <33264000>;
+                               hactive = <800>;
+                               vactive = <480>;
+                               hback-porch = <88>;
+                               hsync-len = <128>;
+                               hfront-porch = <40>;
+                               vback-porch = <33>;
+                               vsync-len = <2>;
+                               vfront-porch = <10>;
+                               hsync-active = <0>;
+                               vsync-active = <0>;
+                               de-active = <1>;
+                               pixelclk-active = <1>;
+                       };
+               };
+        };
+};
+
+&can1 {
+       status = "disabled";
+};
+
+&can2 {
+       xceiver-supply = <&reg_3v3>;
+};
+
+&ds1339 {
+       status = "disabled";
+};
+
+&gpmi {
+       status = "disabled";
+};
+
+&iomuxc {
+       imx6qdl-tx6 {
+               pinctrl_usdhc4: usdhc4grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_SD4_CMD__SD4_CMD             0x070b1
+                               MX6QDL_PAD_SD4_CLK__SD4_CLK             0x070b1
+                               MX6QDL_PAD_SD4_DAT0__SD4_DATA0          0x070b1
+                               MX6QDL_PAD_SD4_DAT1__SD4_DATA1          0x070b1
+                               MX6QDL_PAD_SD4_DAT2__SD4_DATA2          0x070b1
+                               MX6QDL_PAD_SD4_DAT3__SD4_DATA3          0x070b1
+                               MX6QDL_PAD_NANDF_ALE__SD4_RESET         0x0b0b1
+                       >;
+               };
+       };
+};
+
+&ipu1_di0_disp0 {
+       remote-endpoint = <&display0_in>;
+};
+
+&kpp {
+       status = "disabled";
+};
+
+&reg_can_xcvr {
+       status = "disabled";
+};
+
+&touchscreen {
+       status = "disabled";
+};
+
+&usdhc4 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc4>;
+       bus-width = <4>;
+       no-1-8-v;
+       fsl,wp-controller;
+       status = "okay";
+};
diff --git a/arch/arm/boot/dts/imx6q-tx6q-1020.dts b/arch/arm/boot/dts/imx6q-tx6q-1020.dts
new file mode 100644 (file)
index 0000000..b96d80a
--- /dev/null
@@ -0,0 +1,210 @@
+/*
+ * Copyright 2014 Lothar Waßmann <LW@KARO-electronics.de>
+ *
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/dts-v1/;
+#include "imx6q.dtsi"
+#include "imx6qdl-tx6.dtsi"
+
+/ {
+       model = "Ka-Ro electronics TX6Q-1020 Module";
+       compatible = "karo,imx6q-tx6q", "fsl,imx6q";
+
+       aliases {
+               display = &display;
+       };
+
+       backlight: backlight {
+               compatible = "pwm-backlight";
+               pwms = <&pwm2 0 500000 PWM_POLARITY_INVERTED>;
+               power-supply = <&reg_3v3>;
+               /*
+                * a poor man's way to create a 1:1 relationship between
+                * the PWM value and the actual duty cycle
+                */
+               brightness-levels = < 0  1  2  3  4  5  6  7  8  9
+                                    10 11 12 13 14 15 16 17 18 19
+                                    20 21 22 23 24 25 26 27 28 29
+                                    30 31 32 33 34 35 36 37 38 39
+                                    40 41 42 43 44 45 46 47 48 49
+                                    50 51 52 53 54 55 56 57 58 59
+                                    60 61 62 63 64 65 66 67 68 69
+                                    70 71 72 73 74 75 76 77 78 79
+                                    80 81 82 83 84 85 86 87 88 89
+                                    90 91 92 93 94 95 96 97 98 99
+                                   100>;
+               default-brightness-level = <50>;
+       };
+
+       display: display@di0 {
+               compatible = "fsl,imx-parallel-display";
+               interface-pix-fmt = "rgb24";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_disp0_1>;
+               status = "okay";
+
+               port {
+                       display0_in: endpoint {
+                               remote-endpoint = <&ipu1_di0_disp0>;
+                       };
+               };
+
+               display-timings {
+                       VGA {
+                               clock-frequency = <25200000>;
+                               hactive = <640>;
+                               vactive = <480>;
+                               hback-porch = <48>;
+                               hsync-len = <96>;
+                               hfront-porch = <16>;
+                               vback-porch = <31>;
+                               vsync-len = <2>;
+                               vfront-porch = <12>;
+                               hsync-active = <0>;
+                               vsync-active = <0>;
+                               de-active = <1>;
+                               pixelclk-active = <0>;
+                       };
+
+                       ETV570 {
+                               clock-frequency = <25200000>;
+                               hactive = <640>;
+                               vactive = <480>;
+                               hback-porch = <114>;
+                               hsync-len = <30>;
+                               hfront-porch = <16>;
+                               vback-porch = <32>;
+                               vsync-len = <3>;
+                               vfront-porch = <10>;
+                               hsync-active = <0>;
+                               vsync-active = <0>;
+                               de-active = <1>;
+                               pixelclk-active = <0>;
+                       };
+
+                       ET0350 {
+                               clock-frequency = <6413760>;
+                               hactive = <320>;
+                               vactive = <240>;
+                               hback-porch = <34>;
+                               hsync-len = <34>;
+                               hfront-porch = <20>;
+                               vback-porch = <15>;
+                               vsync-len = <3>;
+                               vfront-porch = <4>;
+                               hsync-active = <0>;
+                               vsync-active = <0>;
+                               de-active = <1>;
+                               pixelclk-active = <0>;
+                       };
+
+                       ET0430 {
+                               clock-frequency = <9009000>;
+                               hactive = <480>;
+                               vactive = <272>;
+                               hback-porch = <2>;
+                               hsync-len = <41>;
+                               hfront-porch = <2>;
+                               vback-porch = <2>;
+                               vsync-len = <10>;
+                               vfront-porch = <2>;
+                               hsync-active = <0>;
+                               vsync-active = <0>;
+                               de-active = <1>;
+                               pixelclk-active = <1>;
+                       };
+
+                       ET0500 {
+                               clock-frequency = <33264000>;
+                               hactive = <800>;
+                               vactive = <480>;
+                               hback-porch = <88>;
+                               hsync-len = <128>;
+                               hfront-porch = <40>;
+                               vback-porch = <33>;
+                               vsync-len = <2>;
+                               vfront-porch = <10>;
+                               hsync-active = <0>;
+                               vsync-active = <0>;
+                               de-active = <1>;
+                               pixelclk-active = <0>;
+                       };
+
+                       ET0700 { /* same as ET0500 */
+                               clock-frequency = <33264000>;
+                               hactive = <800>;
+                               vactive = <480>;
+                               hback-porch = <88>;
+                               hsync-len = <128>;
+                               hfront-porch = <40>;
+                               vback-porch = <33>;
+                               vsync-len = <2>;
+                               vfront-porch = <10>;
+                               hsync-active = <0>;
+                               vsync-active = <0>;
+                               de-active = <1>;
+                               pixelclk-active = <0>;
+                       };
+
+                       ETQ570 {
+                               clock-frequency = <6596040>;
+                               hactive = <320>;
+                               vactive = <240>;
+                               hback-porch = <38>;
+                               hsync-len = <30>;
+                               hfront-porch = <30>;
+                               vback-porch = <16>;
+                               vsync-len = <3>;
+                               vfront-porch = <4>;
+                               hsync-active = <0>;
+                               vsync-active = <0>;
+                               de-active = <1>;
+                               pixelclk-active = <0>;
+                       };
+               };
+        };
+};
+
+&ds1339 {
+       status = "disabled";
+};
+
+&gpmi {
+       status = "disabled";
+};
+
+&iomuxc {
+       imx6qdl-tx6 {
+               pinctrl_usdhc4: usdhc4grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_SD4_CMD__SD4_CMD             0x070b1
+                               MX6QDL_PAD_SD4_CLK__SD4_CLK             0x070b1
+                               MX6QDL_PAD_SD4_DAT0__SD4_DATA0          0x070b1
+                               MX6QDL_PAD_SD4_DAT1__SD4_DATA1          0x070b1
+                               MX6QDL_PAD_SD4_DAT2__SD4_DATA2          0x070b1
+                               MX6QDL_PAD_SD4_DAT3__SD4_DATA3          0x070b1
+                               MX6QDL_PAD_NANDF_ALE__SD4_RESET         0x0b0b1
+                       >;
+               };
+       };
+};
+
+&ipu1_di0_disp0 {
+       remote-endpoint = <&display0_in>;
+};
+
+&usdhc4 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc4>;
+       bus-width = <4>;
+       no-1-8-v;
+       fsl,wp-controller;
+       status = "okay";
+};
diff --git a/arch/arm/boot/dts/imx6q-tx6q-1110.dts b/arch/arm/boot/dts/imx6q-tx6q-1110.dts
new file mode 100644 (file)
index 0000000..88aa1e4
--- /dev/null
@@ -0,0 +1,154 @@
+/*
+ * Copyright 2014 Lothar Waßmann <LW@KARO-electronics.de>
+ *
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/dts-v1/;
+#include "imx6q.dtsi"
+#include "imx6qdl-tx6.dtsi"
+
+/ {
+       model = "Ka-Ro electronics TX6Q-1110 Module";
+       compatible = "karo,imx6q-tx6q", "fsl,imx6q";
+
+       aliases {
+               display = &lvds0;
+               lvds0 = &lvds0;
+               lvds1 = &lvds1;
+       };
+
+       backlight0: backlight0 {
+               compatible = "pwm-backlight";
+               pwms = <&pwm2 0 500000 0>;
+               power-supply = <&reg_lcd0_pwr>;
+               /*
+                * a poor man's way to create a 1:1 relationship between
+                * the PWM value and the actual duty cycle
+                */
+               brightness-levels = < 0  1  2  3  4  5  6  7  8  9
+                                    10 11 12 13 14 15 16 17 18 19
+                                    20 21 22 23 24 25 26 27 28 29
+                                    30 31 32 33 34 35 36 37 38 39
+                                    40 41 42 43 44 45 46 47 48 49
+                                    50 51 52 53 54 55 56 57 58 59
+                                    60 61 62 63 64 65 66 67 68 69
+                                    70 71 72 73 74 75 76 77 78 79
+                                    80 81 82 83 84 85 86 87 88 89
+                                    90 91 92 93 94 95 96 97 98 99
+                                   100>;
+               default-brightness-level = <50>;
+       };
+
+       backlight1: backlight1 {
+               compatible = "pwm-backlight";
+               pwms = <&pwm1 0 500000 0>;
+               power-supply = <&reg_lcd1_pwr>;
+               /*
+                * a poor man's way to create a 1:1 relationship between
+                * the PWM value and the actual duty cycle
+                */
+               brightness-levels = < 0  1  2  3  4  5  6  7  8  9
+                                    10 11 12 13 14 15 16 17 18 19
+                                    20 21 22 23 24 25 26 27 28 29
+                                    30 31 32 33 34 35 36 37 38 39
+                                    40 41 42 43 44 45 46 47 48 49
+                                    50 51 52 53 54 55 56 57 58 59
+                                    60 61 62 63 64 65 66 67 68 69
+                                    70 71 72 73 74 75 76 77 78 79
+                                    80 81 82 83 84 85 86 87 88 89
+                                    90 91 92 93 94 95 96 97 98 99
+                                   100>;
+               default-brightness-level = <50>;
+       };
+};
+
+&i2c3 {
+       polytouch1: eeti@04 {
+               compatible = "eeti,egalax_ts";
+               reg = <0x04>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_eeti>;
+               interrupt-parent = <&gpio3>;
+               interrupts = <22 0>;
+               wakeup-gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
+               linux,wakeup;
+       };
+};
+
+&iomuxc {
+       imx6q-tx6q-1110 {
+               pinctrl_eeti: eetigrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_EIM_D22__GPIO3_IO22 0x1b0b1 /* Interrupt */
+                       >;
+               };
+       };
+};
+
+&kpp {
+       status = "disabled"; /* pad conflict with backlight1 PWM */
+};
+
+&ldb {
+       status = "okay";
+
+       lvds0: lvds-channel@0 {
+               fsl,data-mapping = "spwg";
+               fsl,data-width = <18>;
+               status = "okay";
+
+               display-timings {
+                       native-mode = <&lvds_timing0>;
+                       lvds_timing0: hsd100pxn1 {
+                               clock-frequency = <65000000>;
+                               hactive = <1024>;
+                               vactive = <768>;
+                               hback-porch = <220>;
+                               hfront-porch = <40>;
+                               vback-porch = <21>;
+                               vfront-porch = <7>;
+                               hsync-len = <60>;
+                               vsync-len = <10>;
+                               de-active = <1>;
+                               pixelclk-active = <1>;
+                       };
+               };
+       };
+
+       lvds1: lvds-channel@1 {
+               fsl,data-mapping = "spwg";
+               fsl,data-width = <18>;
+               status = "disabled";
+
+               display-timings {
+                       native-mode = <&lvds_timing1>;
+                       lvds_timing1: hsd100pxn1 {
+                               clock-frequency = <65000000>;
+                               hactive = <1024>;
+                               vactive = <768>;
+                               hback-porch = <220>;
+                               hfront-porch = <40>;
+                               vback-porch = <21>;
+                               vfront-porch = <7>;
+                               hsync-len = <60>;
+                               vsync-len = <10>;
+                               de-active = <1>;
+                               pixelclk-active = <1>;
+                       };
+               };
+       };
+};
+
+&pwm1 {
+       status = "okay";
+};
+
+&sata {
+       status = "okay";
+};
index 6c561060bf5cac65e9484b5c46a4439c6d910793..e3bff2ac00db28f25f239bd9b2922ebfc9bd8e02 100644 (file)
        memory {
                reg = <0x10000000 0x40000000>;
        };
+
+       regulators {
+               compatible = "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               reg_usb_h1_vbus: regulator@0 {
+                       compatible = "regulator-fixed";
+                       reg = <0>;
+                       regulator-name = "usb_h1_vbus";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       enable-active-high;
+                       startup-delay-us = <2>; /* USB2415 requires a POR of 1 us minimum */
+                       gpio = <&gpio7 12 0>;
+               };
+       };
 };
 
 &fec {
                        >;
                };
 
+               pinctrl_usbh: usbhgrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_GPIO_17__GPIO7_IO12 0x80000000
+                               MX6QDL_PAD_NANDF_CS2__CCM_CLKO2 0x130b0
+                       >;
+               };
+
                pinctrl_usdhc3: usdhc3grp {
                        fsl,pins = <
                                MX6QDL_PAD_SD3_CMD__SD3_CMD             0x17059
        status = "okay";
 };
 
+&usbh1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usbh>;
+       vbus-supply = <&reg_usb_h1_vbus>;
+       clocks = <&clks 201>;
+       status = "okay";
+};
+
 &usdhc3 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_usdhc3>;
diff --git a/arch/arm/boot/dts/imx6q-wandboard-revb1.dts b/arch/arm/boot/dts/imx6q-wandboard-revb1.dts
new file mode 100644 (file)
index 0000000..20bf3c2
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2013 Freescale Semiconductor, Inc.
+ *
+ * Author: Fabio Estevam <fabio.estevam@freescale.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+/dts-v1/;
+#include "imx6q.dtsi"
+#include "imx6qdl-wandboard-revb1.dtsi"
+
+/ {
+       model = "Wandboard i.MX6 Quad Board";
+       compatible = "wand,imx6q-wandboard", "fsl,imx6q";
+
+       memory {
+               reg = <0x10000000 0x80000000>;
+       };
+};
+
+&sata {
+       status = "okay";
+};
index 36be17f207b14c95396c5b2bb3b7e7a35c113744..4a8a6ee13e9f52f4765920d0de11dd09b601bc41 100644 (file)
@@ -10,7 +10,7 @@
  */
 /dts-v1/;
 #include "imx6q.dtsi"
-#include "imx6qdl-wandboard.dtsi"
+#include "imx6qdl-wandboard-revc1.dtsi"
 
 / {
        model = "Wandboard i.MX6 Quad Board";
index addd3f881ce2b6358cbfce34822e3273af714a63..e9f3646d1760618cb04027329754c53194068a8c 100644 (file)
                                396000  1175000
                        >;
                        clock-latency = <61036>; /* two CLK32 periods */
-                       clocks = <&clks 104>, <&clks 6>, <&clks 16>,
-                                <&clks 17>, <&clks 170>;
+                       clocks = <&clks IMX6QDL_CLK_ARM>,
+                                <&clks IMX6QDL_CLK_PLL2_PFD2_396M>,
+                                <&clks IMX6QDL_CLK_STEP>,
+                                <&clks IMX6QDL_CLK_PLL1_SW>,
+                                <&clks IMX6QDL_CLK_PLL1_SYS>;
                        clock-names = "arm", "pll2_pfd2_396m", "step",
                                      "pll1_sw", "pll1_sys";
                        arm-supply = <&reg_arm>;
@@ -78,7 +81,7 @@
                ocram: sram@00900000 {
                        compatible = "mmio-sram";
                        reg = <0x00900000 0x40000>;
-                       clocks = <&clks 142>;
+                       clocks = <&clks IMX6QDL_CLK_OCRAM>;
                };
 
                aips-bus@02000000 { /* AIPS1 */
@@ -89,7 +92,8 @@
                                        compatible = "fsl,imx6q-ecspi", "fsl,imx51-ecspi";
                                        reg = <0x02018000 0x4000>;
                                        interrupts = <0 35 IRQ_TYPE_LEVEL_HIGH>;
-                                       clocks = <&clks 116>, <&clks 116>;
+                                       clocks = <&clks IMX6Q_CLK_ECSPI5>,
+                                                <&clks IMX6Q_CLK_ECSPI5>;
                                        clock-names = "ipg", "per";
                                        status = "disabled";
                                };
                        compatible = "fsl,imx6q-ahci";
                        reg = <0x02200000 0x4000>;
                        interrupts = <0 39 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks =  <&clks 154>, <&clks 187>, <&clks 105>;
+                       clocks = <&clks IMX6QDL_CLK_SATA>,
+                                <&clks IMX6QDL_CLK_SATA_REF_100M>,
+                                <&clks IMX6QDL_CLK_AHB>;
                        clock-names = "sata", "sata_ref", "ahb";
                        status = "disabled";
                };
                        reg = <0x02800000 0x400000>;
                        interrupts = <0 8 IRQ_TYPE_LEVEL_HIGH>,
                                     <0 7 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&clks 133>, <&clks 134>, <&clks 137>;
+                       clocks = <&clks IMX6QDL_CLK_IPU2>,
+                                <&clks IMX6QDL_CLK_IPU2_DI0>,
+                                <&clks IMX6QDL_CLK_IPU2_DI1>;
                        clock-names = "bus", "di0", "di1";
                        resets = <&src 4>;
 
+                       ipu2_csi0: port@0 {
+                               reg = <0>;
+                       };
+
+                       ipu2_csi1: port@1 {
+                               reg = <1>;
+                       };
+
                        ipu2_di0: port@2 {
                                #address-cells = <1>;
                                #size-cells = <0>;
 };
 
 &ldb {
-       clocks = <&clks 33>, <&clks 34>,
-                <&clks 39>, <&clks 40>, <&clks 41>, <&clks 42>,
-                <&clks 135>, <&clks 136>;
+       clocks = <&clks IMX6QDL_CLK_LDB_DI0_SEL>, <&clks IMX6QDL_CLK_LDB_DI1_SEL>,
+                <&clks IMX6QDL_CLK_IPU1_DI0_SEL>, <&clks IMX6QDL_CLK_IPU1_DI1_SEL>,
+                <&clks IMX6QDL_CLK_IPU2_DI0_SEL>, <&clks IMX6QDL_CLK_IPU2_DI1_SEL>,
+                <&clks IMX6QDL_CLK_LDB_DI0>, <&clks IMX6QDL_CLK_LDB_DI1>;
        clock-names = "di0_pll", "di1_pll",
                      "di0_sel", "di1_sel", "di2_sel", "di3_sel",
                      "di0", "di1";
diff --git a/arch/arm/boot/dts/imx6qdl-aristainetos.dtsi b/arch/arm/boot/dts/imx6qdl-aristainetos.dtsi
new file mode 100644 (file)
index 0000000..e6d9195
--- /dev/null
@@ -0,0 +1,418 @@
+/*
+ * support fot the imx6 based aristainetos board
+ *
+ * Copyright (C) 2014 Heiko Schocher <hs@denx.de>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include <dt-bindings/gpio/gpio.h>
+
+/ {
+       regulators {
+               compatible = "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               reg_2p5v: regulator@0 {
+                       compatible = "regulator-fixed";
+                       regulator-name = "2P5V";
+                       regulator-min-microvolt = <2500000>;
+                       regulator-max-microvolt = <2500000>;
+                       regulator-always-on;
+               };
+
+               reg_3p3v: regulator@1 {
+                       compatible = "regulator-fixed";
+                       regulator-name = "3P3V";
+                       regulator-min-microvolt = <3300000>;
+                       regulator-max-microvolt = <3300000>;
+                       regulator-always-on;
+               };
+
+               reg_usbh1_vbus: regulator@2 {
+                       compatible = "regulator-fixed";
+                       enable-active-high;
+                       gpio = <&gpio3 31 GPIO_ACTIVE_HIGH>;
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&pinctrl_aristainetos_usbh1_vbus>;
+                       regulator-name = "usb_h1_vbus";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+               };
+
+               reg_usbotg_vbus: regulator@3 {
+                       compatible = "regulator-fixed";
+                       enable-active-high;
+                       gpio = <&gpio4 15 GPIO_ACTIVE_HIGH>;
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&pinctrl_aristainetos_usbotg_vbus>;
+                       regulator-name = "usb_otg_vbus";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+               };
+       };
+};
+
+&audmux {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_audmux>;
+       status = "okay";
+};
+
+&can1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_flexcan1>;
+       status = "okay";
+};
+
+&can2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_flexcan2>;
+       status = "okay";
+};
+
+&i2c1 {
+       clock-frequency = <100000>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c1>;
+       status = "okay";
+
+       tmp103: tmp103@71 {
+               compatible = "ti,tmp103";
+               reg = <0x71>;
+       };
+};
+
+&i2c3 {
+       clock-frequency = <100000>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c3>;
+       status = "okay";
+
+       rtc@68 {
+               compatible = "dallas,m41t00";
+               reg = <0x68>;
+       };
+};
+
+&ecspi4 {
+       fsl,spi-num-chipselects = <1>;
+       cs-gpios = <&gpio3 20 0>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_ecspi4>;
+       status = "okay";
+
+       flash: m25p80@0 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "micron,n25q128a11";
+               spi-max-frequency = <20000000>;
+               reg = <0>;
+       };
+};
+
+&fec {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_enet>;
+       phy-mode = "rmii";
+       phy-reset-gpios = <&gpio3 29 GPIO_ACTIVE_HIGH>;
+       status = "okay";
+};
+
+&gpmi {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_gpmi_nand>;
+       status = "okay";
+};
+
+&pcie {
+       status = "okay";
+};
+
+&uart2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart2>;
+       status = "okay";
+};
+
+
+&uart4 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart4>;
+       fsl,uart-has-rtscts;
+       status = "okay";
+};
+
+&uart5 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart5>;
+       fsl,uart-has-rtscts;
+       status = "okay";
+};
+
+&usbh1 {
+       vbus-supply = <&reg_usbh1_vbus>;
+       dr_mode = "host";
+       status = "okay";
+};
+
+&usbotg {
+       vbus-supply = <&reg_usbotg_vbus>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usbotg>;
+       disable-over-current;
+       dr_mode = "host";
+       status = "okay";
+};
+
+&usdhc1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc1>;
+       vmmc-supply = <&reg_3p3v>;
+       cd-gpios = <&gpio4 7 GPIO_ACTIVE_HIGH>;
+       status = "okay";
+};
+
+&usdhc2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc2>;
+       vmmc-supply = <&reg_3p3v>;
+       cd-gpios = <&gpio4 8 GPIO_ACTIVE_HIGH>;
+       status = "okay";
+};
+
+&iomuxc {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_hog &pinctrl_gpio>;
+
+       imx6qdl-aristainetos {
+               pinctrl_aristainetos_usbh1_vbus: aristainetos-usbh1-vbus {
+                       fsl,pins = <MX6QDL_PAD_EIM_D31__GPIO3_IO31 0x130b0>;
+               };
+
+               pinctrl_aristainetos_usbotg_vbus: aristainetos-usbotg-vbus {
+                       fsl,pins = <MX6QDL_PAD_KEY_ROW4__GPIO4_IO15 0x130b0>;
+               };
+
+               pinctrl_audmux: audmuxgrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_CSI0_DAT7__AUD3_RXD  0x1b0b0
+                               MX6QDL_PAD_CSI0_DAT4__AUD3_TXC  0x1b0b0
+                               MX6QDL_PAD_CSI0_DAT5__AUD3_TXD  0x1b0b0
+                               MX6QDL_PAD_CSI0_DAT6__AUD3_TXFS 0x1b0b0
+                       >;
+               };
+
+               pinctrl_backlight: backlightgrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_GPIO_9__PWM1_OUT     0x1b0b0
+                               MX6QDL_PAD_SD4_DAT1__PWM3_OUT   0x1b0b0
+                               MX6QDL_PAD_GPIO_2__GPIO1_IO02   0x1b0b0
+                       >;
+               };
+
+               pinctrl_ecspi2: ecspi2grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_EIM_OE__ECSPI2_MISO 0x100b1
+                               MX6QDL_PAD_EIM_CS0__ECSPI2_SCLK 0x100b1
+                               MX6QDL_PAD_EIM_CS1__ECSPI2_MOSI 0x100b1
+                               MX6QDL_PAD_EIM_D24__GPIO3_IO24  0x100b1
+                       >;
+               };
+
+               pinctrl_ecspi4: ecspi4grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_EIM_D21__ECSPI4_SCLK 0x100b1
+                               MX6QDL_PAD_EIM_D22__ECSPI4_MISO 0x100b1
+                               MX6QDL_PAD_EIM_D28__ECSPI4_MOSI 0x100b1
+                               MX6QDL_PAD_EIM_D20__GPIO3_IO20  0x100b1
+                               MX6QDL_PAD_SD4_DAT7__GPIO2_IO15 0x1b0b0 /* WP pin */
+                       >;
+               };
+
+               pinctrl_enet: enetgrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_GPIO_16__ENET_REF_CLK 0x4001b0a8
+                               MX6QDL_PAD_ENET_MDIO__ENET_MDIO  0x1b0b0
+                               MX6QDL_PAD_ENET_MDC__ENET_MDC    0x1b0b0
+                               MX6QDL_PAD_ENET_TXD0__ENET_TX_DATA0 0x1b0b0
+                               MX6QDL_PAD_ENET_TXD1__ENET_TX_DATA1 0x1b0b0
+                               MX6QDL_PAD_ENET_TX_EN__ENET_TX_EN   0x1b0b0
+                               MX6QDL_PAD_ENET_RX_ER__ENET_RX_ER   0x1b0b0
+                               MX6QDL_PAD_ENET_RXD0__ENET_RX_DATA0 0x1b0b0
+                               MX6QDL_PAD_ENET_RXD1__ENET_RX_DATA1 0x1b0b0
+                               MX6QDL_PAD_ENET_CRS_DV__ENET_RX_EN  0x1b0b0
+                       >;
+               };
+
+               pinctrl_flexcan1: flexcan1grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_KEY_ROW2__FLEXCAN1_RX        0x1b0b0
+                               MX6QDL_PAD_KEY_COL2__FLEXCAN1_TX        0x1b0b0
+                       >;
+               };
+
+               pinctrl_flexcan2: flexcan2grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_SD3_DAT0__FLEXCAN2_TX        0x1b0b0
+                               MX6QDL_PAD_SD3_DAT1__FLEXCAN2_RX        0x1b0b0
+                               >;
+               };
+
+               pinctrl_gpio: gpiogrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_SD4_DAT2__GPIO2_IO10 0x1b0b0
+                               MX6QDL_PAD_SD4_DAT3__GPIO2_IO11 0x1b0b0
+                               MX6QDL_PAD_SD4_DAT4__GPIO2_IO12 0x1b0b0
+                               MX6QDL_PAD_SD4_DAT5__GPIO2_IO13 0x1b0b0
+                               MX6QDL_PAD_GPIO_3__GPIO1_IO03   0x1b0b0
+                               MX6QDL_PAD_GPIO_4__GPIO1_IO04   0x1b0b0
+                               MX6QDL_PAD_GPIO_5__GPIO1_IO05   0x1b0b0
+                               MX6QDL_PAD_GPIO_6__GPIO1_IO06   0x1b0b0
+                               MX6QDL_PAD_GPIO_7__GPIO1_IO07   0x1b0b0
+                               MX6QDL_PAD_GPIO_8__GPIO1_IO08   0x1b0b0
+                               MX6QDL_PAD_KEY_COL0__GPIO4_IO06 0x1b0b0
+                       >;
+               };
+
+               pinctrl_gpmi_nand: gpminandgrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_NANDF_CLE__NAND_CLE     0xb0b1
+                               MX6QDL_PAD_NANDF_ALE__NAND_ALE     0xb0b1
+                               MX6QDL_PAD_NANDF_WP_B__NAND_WP_B   0xb0b1
+                               MX6QDL_PAD_NANDF_RB0__NAND_READY_B 0xb000
+                               MX6QDL_PAD_NANDF_CS0__NAND_CE0_B   0xb0b1
+                               MX6QDL_PAD_NANDF_CS1__NAND_CE1_B   0xb0b1
+                               MX6QDL_PAD_SD4_CMD__NAND_RE_B      0xb0b1
+                               MX6QDL_PAD_SD4_CLK__NAND_WE_B      0xb0b1
+                               MX6QDL_PAD_NANDF_D0__NAND_DATA00   0xb0b1
+                               MX6QDL_PAD_NANDF_D1__NAND_DATA01   0xb0b1
+                               MX6QDL_PAD_NANDF_D2__NAND_DATA02   0xb0b1
+                               MX6QDL_PAD_NANDF_D3__NAND_DATA03   0xb0b1
+                               MX6QDL_PAD_NANDF_D4__NAND_DATA04   0xb0b1
+                               MX6QDL_PAD_NANDF_D5__NAND_DATA05   0xb0b1
+                               MX6QDL_PAD_NANDF_D6__NAND_DATA06   0xb0b1
+                               MX6QDL_PAD_NANDF_D7__NAND_DATA07   0xb0b1
+                               MX6QDL_PAD_SD4_DAT0__NAND_DQS      0x00b1
+                       >;
+               };
+
+               pinctrl_hog: hoggrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_EIM_D29__GPIO3_IO29   0x10
+                       >;
+               };
+
+               pinctrl_i2c1: i2c1grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_CSI0_DAT8__I2C1_SDA 0x4001b8b1
+                               MX6QDL_PAD_CSI0_DAT9__I2C1_SCL 0x4001b8b1
+                       >;
+               };
+
+               pinctrl_i2c2: i2c2grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_KEY_COL3__I2C2_SCL 0x4001b8b1
+                               MX6QDL_PAD_KEY_ROW3__I2C2_SDA 0x4001b8b1
+                       >;
+               };
+
+               pinctrl_i2c3: i2c3grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_EIM_D17__I2C3_SCL 0x4001b8b1
+                               MX6QDL_PAD_EIM_D18__I2C3_SDA 0x4001b8b1
+                       >;
+               };
+
+               pinctrl_ipu_disp: ipudisp1grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_DI0_DISP_CLK__IPU1_DI0_DISP_CLK      0x10
+                               MX6QDL_PAD_DI0_PIN15__IPU1_DI0_PIN15            0x10
+                               MX6QDL_PAD_DI0_PIN2__IPU1_DI0_PIN02             0x10
+                               MX6QDL_PAD_DI0_PIN3__IPU1_DI0_PIN03             0x10
+                               MX6QDL_PAD_DI0_PIN4__GPIO4_IO20                 0x20000
+                               MX6QDL_PAD_DISP0_DAT0__IPU1_DISP0_DATA00        0x10
+                               MX6QDL_PAD_DISP0_DAT1__IPU1_DISP0_DATA01        0x10
+                               MX6QDL_PAD_DISP0_DAT2__IPU1_DISP0_DATA02        0x10
+                               MX6QDL_PAD_DISP0_DAT3__IPU1_DISP0_DATA03        0x10
+                               MX6QDL_PAD_DISP0_DAT4__IPU1_DISP0_DATA04        0x10
+                               MX6QDL_PAD_DISP0_DAT5__IPU1_DISP0_DATA05        0x10
+                               MX6QDL_PAD_DISP0_DAT6__IPU1_DISP0_DATA06        0x10
+                               MX6QDL_PAD_DISP0_DAT7__IPU1_DISP0_DATA07        0x10
+                               MX6QDL_PAD_DISP0_DAT8__IPU1_DISP0_DATA08        0x10
+                               MX6QDL_PAD_DISP0_DAT9__IPU1_DISP0_DATA09        0x10
+                               MX6QDL_PAD_DISP0_DAT10__IPU1_DISP0_DATA10       0x10
+                               MX6QDL_PAD_DISP0_DAT11__IPU1_DISP0_DATA11       0x10
+                               MX6QDL_PAD_DISP0_DAT12__IPU1_DISP0_DATA12       0x10
+                               MX6QDL_PAD_DISP0_DAT13__IPU1_DISP0_DATA13       0x10
+                               MX6QDL_PAD_DISP0_DAT14__IPU1_DISP0_DATA14       0x10
+                               MX6QDL_PAD_DISP0_DAT15__IPU1_DISP0_DATA15       0x10
+                               MX6QDL_PAD_DISP0_DAT16__IPU1_DISP0_DATA16       0x10
+                               MX6QDL_PAD_DISP0_DAT17__IPU1_DISP0_DATA17       0x10
+                               MX6QDL_PAD_DISP0_DAT18__IPU1_DISP0_DATA18       0x10
+                               MX6QDL_PAD_DISP0_DAT19__IPU1_DISP0_DATA19       0x10
+                               MX6QDL_PAD_DISP0_DAT20__IPU1_DISP0_DATA20       0x10
+                               MX6QDL_PAD_DISP0_DAT21__IPU1_DISP0_DATA21       0x10
+                               MX6QDL_PAD_DISP0_DAT22__IPU1_DISP0_DATA22       0x10
+                               MX6QDL_PAD_DISP0_DAT23__IPU1_DISP0_DATA23       0x10
+                               >;
+               };
+
+               pinctrl_uart2: uart2grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_EIM_D26__UART2_TX_DATA 0x1b0b1
+                               MX6QDL_PAD_EIM_D27__UART2_RX_DATA 0x1b0b1
+                       >;
+               };
+
+               pinctrl_uart4: uart4grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_CSI0_DAT12__UART4_TX_DATA 0x1b0b1
+                               MX6QDL_PAD_CSI0_DAT13__UART4_RX_DATA 0x1b0b1
+                               MX6QDL_PAD_CSI0_DAT16__UART4_RTS_B 0x1b0b1
+                               MX6QDL_PAD_CSI0_DAT17__UART4_CTS_B 0x1b0b1
+                       >;
+               };
+
+               pinctrl_uart5: uart5grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_CSI0_DAT14__UART5_TX_DATA 0x1b0b1
+                               MX6QDL_PAD_CSI0_DAT15__UART5_RX_DATA 0x1b0b1
+                       >;
+               };
+
+               pinctrl_usbotg: usbotggrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_GPIO_1__USB_OTG_ID 0x17059
+                       >;
+               };
+
+               pinctrl_usdhc1: usdhc1grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_SD1_CMD__SD1_CMD    0x17059
+                               MX6QDL_PAD_SD1_CLK__SD1_CLK    0x10059
+                               MX6QDL_PAD_SD1_DAT0__SD1_DATA0 0x17059
+                               MX6QDL_PAD_SD1_DAT1__SD1_DATA1 0x17059
+                               MX6QDL_PAD_SD1_DAT2__SD1_DATA2 0x17059
+                               MX6QDL_PAD_SD1_DAT3__SD1_DATA3 0x17059
+                               MX6QDL_PAD_KEY_ROW0__GPIO4_IO07 0x1b0b0
+                       >;
+               };
+
+               pinctrl_usdhc2: usdhc2grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_SD2_CMD__SD2_CMD    0x17059
+                               MX6QDL_PAD_SD2_CLK__SD2_CLK    0x10059
+                               MX6QDL_PAD_SD2_DAT0__SD2_DATA0 0x17059
+                               MX6QDL_PAD_SD2_DAT1__SD2_DATA1 0x17059
+                               MX6QDL_PAD_SD2_DAT2__SD2_DATA2 0x17059
+                               MX6QDL_PAD_SD2_DAT3__SD2_DATA3 0x17059
+                               MX6QDL_PAD_KEY_COL1__GPIO4_IO08 0x1b0b0
+                       >;
+               };
+       };
+};
index 744c8a2d81f6b715972fdd0ab77d35597c6d4d95..234e7b7552323b3461783c14d2cb820dba95207e 100644 (file)
        };
 
        sound {
-               compatible = "fsl,imx6q-sabrelite-sgtl5000",
+               compatible = "fsl,imx6q-ventana-sgtl5000",
                             "fsl,imx-audio-sgtl5000";
-               model = "imx6q-sabrelite-sgtl5000";
+               model = "sgtl5000-audio";
                ssi-controller = <&ssi1>;
                audio-codec = <&codec>;
                audio-routing =
 };
 
 &ssi1 {
-       fsl,mode = "i2s-slave";
        status = "okay";
 };
 
index adf150c1be90bd365b3060aaee71929d4b05007b..143f84f7812c93ff6f6ee87a5d3e9001254d613f 100644 (file)
        };
 
        sound {
-               compatible = "fsl,imx6q-sabrelite-sgtl5000",
+               compatible = "fsl,imx6q-ventana-sgtl5000",
                             "fsl,imx-audio-sgtl5000";
-               model = "imx6q-sabrelite-sgtl5000";
+               model = "sgtl5000-audio";
                ssi-controller = <&ssi1>;
                audio-codec = <&codec>;
                audio-routing =
 };
 
 &ssi1 {
-       fsl,mode = "i2s-slave";
        status = "okay";
 };
 
index 698d3063b29563691147510bb2dc9c2965999c1a..16e7ad3d98ad36b2d83808bdb2b2feb6b78c0a70 100644 (file)
        };
 
        sound {
-               compatible = "fsl,imx6q-sabrelite-sgtl5000",
+               compatible = "fsl,imx6q-ventana-sgtl5000",
                             "fsl,imx-audio-sgtl5000";
-               model = "imx6q-sabrelite-sgtl5000";
+               model = "sgtl5000-audio";
                ssi-controller = <&ssi1>;
                audio-codec = <&codec>;
                audio-routing =
 };
 
 &ssi1 {
-       fsl,mode = "i2s-slave";
        status = "okay";
 };
 
 &ssi2 {
-       fsl,mode = "i2s-slave";
        status = "okay";
 };
 
index 4c4b17596c8b77329200c4c207ee68b13fc8de77..42ff525ebe13bf4c1e4e5a7db0aba7f0d3ff0722 100644 (file)
 };
 
 &ssi1 {
-       fsl,mode = "i2s-slave";
        status = "okay";
 };
 
index faa3494a69d4e314443ce6cbd9e58790f6b39cb1..2694aa84e18748b532a491b25f50fef0a2fc4a6d 100644 (file)
        pinctrl-0 = <&pinctrl_enet>;
        phy-mode = "rgmii";
        phy-reset-gpios = <&gpio3 23 GPIO_ACTIVE_LOW>;
+       phy-supply = <&vdd_eth_io_reg>;
        status = "disabled";
 };
 
diff --git a/arch/arm/boot/dts/imx6qdl-rex.dtsi b/arch/arm/boot/dts/imx6qdl-rex.dtsi
new file mode 100644 (file)
index 0000000..df7bcf8
--- /dev/null
@@ -0,0 +1,357 @@
+/*
+ * Copyright 2014 FEDEVEL, Inc.
+ *
+ * Author: Robert Nelson <robertcnelson@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+
+/ {
+       chosen {
+               stdout-path = &uart1;
+       };
+
+       regulators {
+               compatible = "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               reg_3p3v: regulator@0 {
+                       compatible = "regulator-fixed";
+                       reg = <0>;
+                       regulator-name = "3P3V";
+                       regulator-min-microvolt = <3300000>;
+                       regulator-max-microvolt = <3300000>;
+                       regulator-always-on;
+               };
+
+               reg_usbh1_vbus: regulator@1 {
+                       compatible = "regulator-fixed";
+                       reg = <1>;
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&pinctrl_usbh1>;
+                       regulator-name = "usbh1_vbus";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       gpio = <&gpio3 31 GPIO_ACTIVE_HIGH>;
+                       enable-active-high;
+               };
+
+               reg_usb_otg_vbus: regulator@2 {
+                       compatible = "regulator-fixed";
+                       reg = <2>;
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&pinctrl_usbotg>;
+                       regulator-name = "usb_otg_vbus";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       gpio = <&gpio3 22 GPIO_ACTIVE_HIGH>;
+                       enable-active-high;
+               };
+       };
+
+       leds {
+               compatible = "gpio-leds";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_led>;
+
+               led0: usr {
+                       label = "usr";
+                       gpios = <&gpio1 2 GPIO_ACTIVE_LOW>;
+                       default-state = "off";
+                       linux,default-trigger = "heartbeat";
+               };
+       };
+
+       sound {
+               compatible = "fsl,imx6-rex-sgtl5000",
+                            "fsl,imx-audio-sgtl5000";
+               model = "imx6-rex-sgtl5000";
+               ssi-controller = <&ssi1>;
+               audio-codec = <&codec>;
+               audio-routing =
+                       "MIC_IN", "Mic Jack",
+                       "Mic Jack", "Mic Bias",
+                       "Headphone Jack", "HP_OUT";
+               mux-int-port = <1>;
+               mux-ext-port = <3>;
+       };
+};
+
+&audmux {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_audmux>;
+       status = "okay";
+};
+
+&ecspi2 {
+       fsl,spi-num-chipselects = <1>;
+       cs-gpios = <&gpio5 12 GPIO_ACTIVE_LOW>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_ecspi2>;
+       status = "okay";
+};
+
+&ecspi3 {
+       fsl,spi-num-chipselects = <1>;
+       cs-gpios = <&gpio4 26 GPIO_ACTIVE_LOW>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_ecspi3>;
+       status = "okay";
+};
+
+&fec {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_enet>;
+       phy-mode = "rgmii";
+       phy-reset-gpios = <&gpio1 25 GPIO_ACTIVE_LOW>;
+       status = "okay";
+};
+
+&hdmi {
+       ddc-i2c-bus = <&i2c2>;
+       status = "okay";
+};
+
+&i2c1 {
+       clock-frequency = <100000>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c1>;
+       status = "okay";
+
+       codec: sgtl5000@0a {
+               compatible = "fsl,sgtl5000";
+               reg = <0x0a>;
+               clocks = <&clks 201>;
+               VDDA-supply = <&reg_3p3v>;
+               VDDIO-supply = <&reg_3p3v>;
+       };
+};
+
+&i2c2 {
+       clock-frequency = <100000>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c2>;
+       status = "okay";
+
+       eeprom@57 {
+               compatible = "at,24c02";
+               reg = <0x57>;
+       };
+};
+
+&i2c3 {
+       clock-frequency = <100000>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c3>;
+       status = "okay";
+};
+
+&iomuxc {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_hog>;
+
+       imx6qdl-rex {
+               pinctrl_hog: hoggrp {
+                       fsl,pins = <
+                               /* SGTL5000 sys_mclk */
+                               MX6QDL_PAD_GPIO_0__CCM_CLKO1            0x030b0
+                       >;
+               };
+
+               pinctrl_audmux: audmuxgrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_CSI0_DAT7__AUD3_RXD          0x130b0
+                               MX6QDL_PAD_CSI0_DAT4__AUD3_TXC          0x130b0
+                               MX6QDL_PAD_CSI0_DAT5__AUD3_TXD          0x110b0
+                               MX6QDL_PAD_CSI0_DAT6__AUD3_TXFS         0x130b0
+                       >;
+               };
+
+               pinctrl_ecspi2: ecspi2grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_DISP0_DAT2__ECSPI3_MISO      0x100b1
+                               MX6QDL_PAD_DISP0_DAT1__ECSPI3_MOSI      0x100b1
+                               MX6QDL_PAD_DISP0_DAT0__ECSPI3_SCLK      0x100b1
+                               /* CS */
+                               MX6QDL_PAD_DISP0_DAT5__GPIO4_IO26       0x000b1
+                       >;
+               };
+
+               pinctrl_ecspi3: ecspi3grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_DISP0_DAT17__ECSPI2_MISO     0x100b1
+                               MX6QDL_PAD_DISP0_DAT16__ECSPI2_MOSI     0x100b1
+                               MX6QDL_PAD_DISP0_DAT19__ECSPI2_SCLK     0x100b1
+                               /* CS */
+                               MX6QDL_PAD_DISP0_DAT18__GPIO5_IO12      0x000b1
+                       >;
+               };
+
+               pinctrl_enet: enetgrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_ENET_MDIO__ENET_MDIO         0x1b0b0
+                               MX6QDL_PAD_ENET_MDC__ENET_MDC           0x1b0b0
+                               MX6QDL_PAD_RGMII_TXC__RGMII_TXC         0x1b0b0
+                               MX6QDL_PAD_RGMII_TD0__RGMII_TD0         0x1b0b0
+                               MX6QDL_PAD_RGMII_TD1__RGMII_TD1         0x1b0b0
+                               MX6QDL_PAD_RGMII_TD2__RGMII_TD2         0x1b0b0
+                               MX6QDL_PAD_RGMII_TD3__RGMII_TD3         0x1b0b0
+                               MX6QDL_PAD_RGMII_TX_CTL__RGMII_TX_CTL   0x1b0b0
+                               MX6QDL_PAD_ENET_REF_CLK__ENET_TX_CLK    0x1b0b0
+                               MX6QDL_PAD_RGMII_RXC__RGMII_RXC         0x1b0b0
+                               MX6QDL_PAD_RGMII_RD0__RGMII_RD0         0x1b0b0
+                               MX6QDL_PAD_RGMII_RD1__RGMII_RD1         0x1b0b0
+                               MX6QDL_PAD_RGMII_RD2__RGMII_RD2         0x1b0b0
+                               MX6QDL_PAD_RGMII_RD3__RGMII_RD3         0x1b0b0
+                               MX6QDL_PAD_RGMII_RX_CTL__RGMII_RX_CTL   0x1b0b0
+                               MX6QDL_PAD_GPIO_16__ENET_REF_CLK        0x4001b0a8
+                               /* Phy reset */
+                               MX6QDL_PAD_ENET_CRS_DV__GPIO1_IO25      0x000b0
+                       >;
+               };
+
+               pinctrl_i2c1: i2c1grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_CSI0_DAT8__I2C1_SDA          0x4001b8b1
+                               MX6QDL_PAD_CSI0_DAT9__I2C1_SCL          0x4001b8b1
+                       >;
+               };
+
+               pinctrl_i2c2: i2c2grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_KEY_COL3__I2C2_SCL           0x4001b8b1
+                               MX6QDL_PAD_KEY_ROW3__I2C2_SDA           0x4001b8b1
+                       >;
+               };
+
+               pinctrl_i2c3: i2c3grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_EIM_D17__I2C3_SCL            0x4001b8b1
+                               MX6QDL_PAD_EIM_D18__I2C3_SDA            0x4001b8b1
+                       >;
+               };
+
+               pinctrl_led: ledgrp {
+                       fsl,pins = <
+                               /* user led */
+                               MX6QDL_PAD_GPIO_2__GPIO1_IO02           0x80000000
+                       >;
+               };
+
+               pinctrl_uart1: uart1grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_CSI0_DAT10__UART1_TX_DATA    0x1b0b1
+                               MX6QDL_PAD_CSI0_DAT11__UART1_RX_DATA    0x1b0b1
+                       >;
+               };
+
+               pinctrl_uart2: uart2grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_SD4_DAT7__UART2_TX_DATA      0x1b0b1
+                               MX6QDL_PAD_SD4_DAT4__UART2_RX_DATA      0x1b0b1
+                       >;
+               };
+
+               pinctrl_usbh1: usbh1grp {
+                       fsl,pins = <
+                               /* power enable, high active */
+                               MX6QDL_PAD_EIM_D31__GPIO3_IO31          0x10b0
+                       >;
+               };
+
+               pinctrl_usbotg: usbotggrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_GPIO_1__USB_OTG_ID           0x17059
+                               MX6QDL_PAD_EIM_D21__USB_OTG_OC          0x1b0b0
+                               /* power enable, high active */
+                               MX6QDL_PAD_EIM_D22__GPIO3_IO22          0x10b0
+                       >;
+               };
+
+               pinctrl_usdhc2: usdhc2grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_SD2_CMD__SD2_CMD             0x17059
+                               MX6QDL_PAD_SD2_CLK__SD2_CLK             0x10059
+                               MX6QDL_PAD_SD2_DAT0__SD2_DATA0          0x17059
+                               MX6QDL_PAD_SD2_DAT1__SD2_DATA1          0x17059
+                               MX6QDL_PAD_SD2_DAT2__SD2_DATA2          0x17059
+                               MX6QDL_PAD_SD2_DAT3__SD2_DATA3          0x17059
+                               /* CD */
+                               MX6QDL_PAD_NANDF_D2__GPIO2_IO02         0x1b0b0
+                               /* WP */
+                               MX6QDL_PAD_NANDF_D3__GPIO2_IO03         0x1f0b0
+                       >;
+               };
+
+               pinctrl_usdhc3: usdhc3grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_SD3_CMD__SD3_CMD             0x17059
+                               MX6QDL_PAD_SD3_CLK__SD3_CLK             0x10059
+                               MX6QDL_PAD_SD3_DAT0__SD3_DATA0          0x17059
+                               MX6QDL_PAD_SD3_DAT1__SD3_DATA1          0x17059
+                               MX6QDL_PAD_SD3_DAT2__SD3_DATA2          0x17059
+                               MX6QDL_PAD_SD3_DAT3__SD3_DATA3          0x17059
+                               /* CD */
+                               MX6QDL_PAD_NANDF_D0__GPIO2_IO00         0x1b0b0
+                               /* WP */
+                               MX6QDL_PAD_NANDF_D1__GPIO2_IO01         0x1f0b0
+                       >;
+               };
+       };
+};
+
+&ssi1 {
+       fsl,mode = "i2s-slave";
+       status = "okay";
+};
+
+&uart1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart1>;
+       status = "okay";
+};
+
+&uart2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart2>;
+       status = "okay";
+};
+
+&usbh1 {
+       vbus-supply = <&reg_usbh1_vbus>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usbh1>;
+       status = "okay";
+};
+
+&usbotg {
+       vbus-supply = <&reg_usb_otg_vbus>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usbotg>;
+       status = "okay";
+};
+
+&usdhc2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc2>;
+       bus-width = <4>;
+       cd-gpios = <&gpio2 2 GPIO_ACTIVE_LOW>;
+       wp-gpios = <&gpio2 3 GPIO_ACTIVE_LOW>;
+       status = "okay";
+};
+
+&usdhc3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc3>;
+       bus-width = <4>;
+       cd-gpios = <&gpio2 0 GPIO_ACTIVE_LOW>;
+       wp-gpios = <&gpio2 1 GPIO_ACTIVE_LOW>;
+       status = "okay";
+};
index 6df6127bf83520252371d5b99d52296921b51c5b..0a36129152e0ced29635fe958e38aa2af6cc31b9 100644 (file)
 };
 
 &ssi1 {
-       fsl,mode = "i2s-slave";
        status = "okay";
 };
 
index 40ea36534643c84d7761c01a340df6fbef70e105..ec43dde7852522b6cdcaa901fe3a453c9a0f1ac7 100644 (file)
                                MX6QDL_PAD_KEY_COL1__ECSPI1_MISO        0x100b1
                                MX6QDL_PAD_KEY_ROW0__ECSPI1_MOSI        0x100b1
                                MX6QDL_PAD_KEY_COL0__ECSPI1_SCLK        0x100b1
+                               MX6QDL_PAD_KEY_ROW1__GPIO4_IO09         0x1b0b0
                        >;
                };
 
 };
 
 &ssi2 {
-       fsl,mode = "i2s-slave";
        status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/imx6qdl-tx6.dtsi b/arch/arm/boot/dts/imx6qdl-tx6.dtsi
new file mode 100644 (file)
index 0000000..f02b80b
--- /dev/null
@@ -0,0 +1,696 @@
+/*
+ * Copyright 2014 Lothar Waßmann <LW@KARO-electronics.de>
+ *
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+#include <dt-bindings/pwm/pwm.h>
+
+/ {
+       aliases {
+               can0 = &can2;
+               can1 = &can1;
+               ethernet0 = &fec;
+               lcdif_23bit_pins_a = &pinctrl_disp0_1;
+               lcdif_24bit_pins_a = &pinctrl_disp0_2;
+               pwm0 = &pwm1;
+               pwm1 = &pwm2;
+               reg_can_xcvr = &reg_can_xcvr;
+               stk5led = &user_led;
+               usbotg = &usbotg;
+               sdhc0 = &usdhc1;
+               sdhc1 = &usdhc2;
+       };
+
+       memory {
+               reg = <0 0>; /* will be filled by U-Boot */
+       };
+
+       clocks {
+               #address-cells = <1>;
+               #size-cells = <0>;
+               mclk: clock@0 {
+                       compatible = "fixed-clock";
+                       reg = <0>;
+                       #clock-cells = <0>;
+                       clock-frequency = <27000000>;
+               };
+       };
+
+       gpio-keys {
+               compatible = "gpio-keys";
+
+               power {
+                       label = "Power Button";
+                       gpios = <&gpio5 2 GPIO_ACTIVE_HIGH>;
+                       linux,code = <KEY_POWER>;
+                       gpio-key,wakeup;
+               };
+       };
+
+       leds {
+               compatible = "gpio-leds";
+
+               user_led: user {
+                       label = "Heartbeat";
+                       gpios = <&gpio2 20 GPIO_ACTIVE_HIGH>;
+                       linux,default-trigger = "heartbeat";
+               };
+       };
+
+       regulators {
+               compatible = "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               reg_3v3_etn: regulator@0 {
+                       compatible = "regulator-fixed";
+                       reg = <0>;
+                       regulator-name = "3V3_ETN";
+                       regulator-min-microvolt = <3300000>;
+                       regulator-max-microvolt = <3300000>;
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&pinctrl_etnphy_power>;
+                       gpio = <&gpio3 20 GPIO_ACTIVE_HIGH>;
+                       enable-active-high;
+               };
+
+               reg_2v5: regulator@1 {
+                       compatible = "regulator-fixed";
+                       reg = <1>;
+                       regulator-name = "2V5";
+                       regulator-min-microvolt = <2500000>;
+                       regulator-max-microvolt = <2500000>;
+                       regulator-always-on;
+               };
+
+               reg_3v3: regulator@2 {
+                       compatible = "regulator-fixed";
+                       reg = <2>;
+                       regulator-name = "3V3";
+                       regulator-min-microvolt = <3300000>;
+                       regulator-max-microvolt = <3300000>;
+                       regulator-always-on;
+               };
+
+               reg_can_xcvr: regulator@3 {
+                       compatible = "regulator-fixed";
+                       reg = <3>;
+                       regulator-name = "CAN XCVR";
+                       regulator-min-microvolt = <3300000>;
+                       regulator-max-microvolt = <3300000>;
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&pinctrl_flexcan_xcvr>;
+                       gpio = <&gpio4 21 GPIO_ACTIVE_HIGH>;
+                       enable-active-low;
+               };
+
+               reg_lcd0_pwr: regulator@4 {
+                       compatible = "regulator-fixed";
+                       reg = <4>;
+                       regulator-name = "LCD0 POWER";
+                       regulator-min-microvolt = <3300000>;
+                       regulator-max-microvolt = <3300000>;
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&pinctrl_lcd0_pwr>;
+                       gpio = <&gpio3 29 GPIO_ACTIVE_HIGH>;
+                       enable-active-high;
+                       regulator-boot-on;
+                       regulator-always-on;
+               };
+
+               reg_lcd1_pwr: regulator@5 {
+                       compatible = "regulator-fixed";
+                       reg = <5>;
+                       regulator-name = "LCD1 POWER";
+                       regulator-min-microvolt = <3300000>;
+                       regulator-max-microvolt = <3300000>;
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&pinctrl_lcd1_pwr>;
+                       gpio = <&gpio2 31 GPIO_ACTIVE_HIGH>;
+                       enable-active-high;
+                       regulator-boot-on;
+                       regulator-always-on;
+               };
+
+               reg_usbh1_vbus: regulator@6 {
+                       compatible = "regulator-fixed";
+                       reg = <6>;
+                       regulator-name = "usbh1_vbus";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&pinctrl_usbh1_vbus>;
+                       gpio = <&gpio3 31 GPIO_ACTIVE_HIGH>;
+                       enable-active-high;
+               };
+
+               reg_usbotg_vbus: regulator@7 {
+                       compatible = "regulator-fixed";
+                       reg = <7>;
+                       regulator-name = "usbotg_vbus";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&pinctrl_usbotg_vbus>;
+                       gpio = <&gpio1 7 GPIO_ACTIVE_HIGH>;
+                       enable-active-high;
+               };
+       };
+
+       sound {
+               compatible = "karo,imx6qdl-tx6qdl-sgtl5000",
+                            "fsl,imx-audio-sgtl5000";
+               model = "sgtl5000-audio";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_audmux>;
+               ssi-controller = <&ssi1>;
+               audio-codec = <&sgtl5000>;
+               audio-routing =
+                       "MIC_IN", "Mic Jack",
+                       "Mic Jack", "Mic Bias",
+                       "Headphone Jack", "HP_OUT";
+               mux-int-port = <1>;
+               mux-ext-port = <5>;
+       };
+};
+
+&audmux {
+       status = "okay";
+};
+
+&can1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_flexcan1>;
+       xceiver-supply = <&reg_can_xcvr>;
+       status = "okay";
+};
+
+&can2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_flexcan2>;
+       xceiver-supply = <&reg_can_xcvr>;
+       status = "okay";
+};
+
+&ecspi1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_ecspi1>;
+       fsl,spi-num-chipselects = <2>;
+       cs-gpios = <
+               &gpio2 30 GPIO_ACTIVE_HIGH
+               &gpio3 19 GPIO_ACTIVE_HIGH
+       >;
+       status = "okay";
+
+       spidev0: spi@0 {
+               compatible = "spidev";
+               reg = <0>;
+               spi-max-frequency = <54000000>;
+       };
+
+       spidev1: spi@1 {
+               compatible = "spidev";
+               reg = <1>;
+               spi-max-frequency = <54000000>;
+       };
+};
+
+&fec {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_enet>;
+       phy-mode = "rmii";
+       phy-reset-gpios = <&gpio7 6 GPIO_ACTIVE_HIGH>;
+       phy-supply = <&reg_3v3_etn>;
+       status = "okay";
+};
+
+&gpmi {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_gpmi_nand>;
+       nand-on-flash-bbt;
+       fsl,no-blockmark-swap;
+       status = "okay";
+};
+
+&i2c1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c1>;
+       clock-frequency = <400000>;
+       status = "okay";
+
+       ds1339: rtc@68 {
+               compatible = "dallas,ds1339";
+               reg = <0x68>;
+       };
+};
+
+&i2c3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c3>;
+       clock-frequency = <400000>;
+       status = "okay";
+
+       sgtl5000: sgtl5000@0a {
+               compatible = "fsl,sgtl5000";
+               reg = <0x0a>;
+               VDDA-supply = <&reg_2v5>;
+               VDDIO-supply = <&reg_3v3>;
+               clocks = <&mclk>;
+       };
+
+       polytouch: edt-ft5x06@38 {
+               compatible = "edt,edt-ft5x06";
+               reg = <0x38>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_edt_ft5x06>;
+               interrupt-parent = <&gpio6>;
+               interrupts = <15 0>;
+               reset-gpios = <&gpio2 22 GPIO_ACTIVE_LOW>;
+               wake-gpios = <&gpio2 21 GPIO_ACTIVE_HIGH>;
+               linux,wakeup;
+       };
+
+       touchscreen: tsc2007@48 {
+               compatible = "ti,tsc2007";
+               reg = <0x48>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_tsc2007>;
+               interrupt-parent = <&gpio3>;
+               interrupts = <26 0>;
+               gpios = <&gpio3 26 GPIO_ACTIVE_LOW>;
+               ti,x-plate-ohms = <660>;
+               linux,wakeup;
+       };
+};
+
+&iomuxc {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_hog>;
+
+       imx6qdl-tx6 {
+               pinctrl_hog: hoggrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_EIM_A18__GPIO2_IO20          0x1b0b1 /* LED */
+                               MX6QDL_PAD_SD3_DAT2__GPIO7_IO06         0x1b0b1 /* ETN PHY RESET */
+                               MX6QDL_PAD_SD3_DAT4__GPIO7_IO01         0x1b0b1 /* ETN PHY INT */
+                               MX6QDL_PAD_EIM_A25__GPIO5_IO02          0x1b0b1 /* PWR BTN */
+                       >;
+               };
+
+               pinctrl_audmux: audmuxgrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_KEY_ROW1__AUD5_RXD           0x130b0 /* SSI1_RXD */
+                               MX6QDL_PAD_KEY_ROW0__AUD5_TXD           0x110b0 /* SSI1_TXD */
+                               MX6QDL_PAD_KEY_COL0__AUD5_TXC           0x130b0 /* SSI1_CLK */
+                               MX6QDL_PAD_KEY_COL1__AUD5_TXFS          0x130b0 /* SSI1_FS */
+                       >;
+               };
+
+               pinctrl_disp0_1: disp0grp-1 {
+                       fsl,pins = <
+                               MX6QDL_PAD_DI0_DISP_CLK__IPU1_DI0_DISP_CLK 0x10
+                               MX6QDL_PAD_DI0_PIN15__IPU1_DI0_PIN15       0x10
+                               MX6QDL_PAD_DI0_PIN2__IPU1_DI0_PIN02        0x10
+                               MX6QDL_PAD_DI0_PIN3__IPU1_DI0_PIN03        0x10
+                               /* PAD DISP0_DAT0 is used for the Flexcan transceiver control */
+                               MX6QDL_PAD_DISP0_DAT1__IPU1_DISP0_DATA01   0x10
+                               MX6QDL_PAD_DISP0_DAT2__IPU1_DISP0_DATA02   0x10
+                               MX6QDL_PAD_DISP0_DAT3__IPU1_DISP0_DATA03   0x10
+                               MX6QDL_PAD_DISP0_DAT4__IPU1_DISP0_DATA04   0x10
+                               MX6QDL_PAD_DISP0_DAT5__IPU1_DISP0_DATA05   0x10
+                               MX6QDL_PAD_DISP0_DAT6__IPU1_DISP0_DATA06   0x10
+                               MX6QDL_PAD_DISP0_DAT7__IPU1_DISP0_DATA07   0x10
+                               MX6QDL_PAD_DISP0_DAT8__IPU1_DISP0_DATA08   0x10
+                               MX6QDL_PAD_DISP0_DAT9__IPU1_DISP0_DATA09   0x10
+                               MX6QDL_PAD_DISP0_DAT10__IPU1_DISP0_DATA10  0x10
+                               MX6QDL_PAD_DISP0_DAT11__IPU1_DISP0_DATA11  0x10
+                               MX6QDL_PAD_DISP0_DAT12__IPU1_DISP0_DATA12  0x10
+                               MX6QDL_PAD_DISP0_DAT13__IPU1_DISP0_DATA13  0x10
+                               MX6QDL_PAD_DISP0_DAT14__IPU1_DISP0_DATA14  0x10
+                               MX6QDL_PAD_DISP0_DAT15__IPU1_DISP0_DATA15  0x10
+                               MX6QDL_PAD_DISP0_DAT16__IPU1_DISP0_DATA16  0x10
+                               MX6QDL_PAD_DISP0_DAT17__IPU1_DISP0_DATA17  0x10
+                               MX6QDL_PAD_DISP0_DAT18__IPU1_DISP0_DATA18  0x10
+                               MX6QDL_PAD_DISP0_DAT19__IPU1_DISP0_DATA19  0x10
+                               MX6QDL_PAD_DISP0_DAT20__IPU1_DISP0_DATA20  0x10
+                               MX6QDL_PAD_DISP0_DAT21__IPU1_DISP0_DATA21  0x10
+                               MX6QDL_PAD_DISP0_DAT22__IPU1_DISP0_DATA22  0x10
+                               MX6QDL_PAD_DISP0_DAT23__IPU1_DISP0_DATA23  0x10
+                       >;
+               };
+
+               pinctrl_disp0_2: disp0grp-2 {
+                       fsl,pins = <
+                               MX6QDL_PAD_DI0_DISP_CLK__IPU1_DI0_DISP_CLK 0x10
+                               MX6QDL_PAD_DI0_PIN15__IPU1_DI0_PIN15       0x10
+                               MX6QDL_PAD_DI0_PIN2__IPU1_DI0_PIN02        0x10
+                               MX6QDL_PAD_DI0_PIN3__IPU1_DI0_PIN03        0x10
+                               MX6QDL_PAD_DISP0_DAT0__IPU1_DISP0_DATA00   0x10
+                               MX6QDL_PAD_DISP0_DAT1__IPU1_DISP0_DATA01   0x10
+                               MX6QDL_PAD_DISP0_DAT2__IPU1_DISP0_DATA02   0x10
+                               MX6QDL_PAD_DISP0_DAT3__IPU1_DISP0_DATA03   0x10
+                               MX6QDL_PAD_DISP0_DAT4__IPU1_DISP0_DATA04   0x10
+                               MX6QDL_PAD_DISP0_DAT5__IPU1_DISP0_DATA05   0x10
+                               MX6QDL_PAD_DISP0_DAT6__IPU1_DISP0_DATA06   0x10
+                               MX6QDL_PAD_DISP0_DAT7__IPU1_DISP0_DATA07   0x10
+                               MX6QDL_PAD_DISP0_DAT8__IPU1_DISP0_DATA08   0x10
+                               MX6QDL_PAD_DISP0_DAT9__IPU1_DISP0_DATA09   0x10
+                               MX6QDL_PAD_DISP0_DAT10__IPU1_DISP0_DATA10  0x10
+                               MX6QDL_PAD_DISP0_DAT11__IPU1_DISP0_DATA11  0x10
+                               MX6QDL_PAD_DISP0_DAT12__IPU1_DISP0_DATA12  0x10
+                               MX6QDL_PAD_DISP0_DAT13__IPU1_DISP0_DATA13  0x10
+                               MX6QDL_PAD_DISP0_DAT14__IPU1_DISP0_DATA14  0x10
+                               MX6QDL_PAD_DISP0_DAT15__IPU1_DISP0_DATA15  0x10
+                               MX6QDL_PAD_DISP0_DAT16__IPU1_DISP0_DATA16  0x10
+                               MX6QDL_PAD_DISP0_DAT17__IPU1_DISP0_DATA17  0x10
+                               MX6QDL_PAD_DISP0_DAT18__IPU1_DISP0_DATA18  0x10
+                               MX6QDL_PAD_DISP0_DAT19__IPU1_DISP0_DATA19  0x10
+                               MX6QDL_PAD_DISP0_DAT20__IPU1_DISP0_DATA20  0x10
+                               MX6QDL_PAD_DISP0_DAT21__IPU1_DISP0_DATA21  0x10
+                               MX6QDL_PAD_DISP0_DAT22__IPU1_DISP0_DATA22  0x10
+                               MX6QDL_PAD_DISP0_DAT23__IPU1_DISP0_DATA23  0x10
+                       >;
+               };
+
+               pinctrl_ecspi1: ecspi1grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_EIM_D18__ECSPI1_MOSI         0x0b0b0
+                               MX6QDL_PAD_EIM_D17__ECSPI1_MISO         0x0b0b0
+                               MX6QDL_PAD_EIM_D16__ECSPI1_SCLK         0x0b0b0
+                               MX6QDL_PAD_GPIO_19__ECSPI1_RDY          0x0b0b0
+                               MX6QDL_PAD_EIM_EB2__GPIO2_IO30          0x0b0b0 /* SPI CS0 */
+                               MX6QDL_PAD_EIM_D19__GPIO3_IO19          0x0b0b0 /* SPI CS1 */
+                       >;
+               };
+
+               pinctrl_edt_ft5x06: edt-ft5x06grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_NANDF_CS2__GPIO6_IO15        0x1b0b0 /* Interrupt */
+                               MX6QDL_PAD_EIM_A16__GPIO2_IO22          0x1b0b0 /* Reset */
+                               MX6QDL_PAD_EIM_A17__GPIO2_IO21          0x1b0b0 /* Wake */
+                       >;
+               };
+
+               pinctrl_enet: enetgrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_ENET_MDC__ENET_MDC           0x1b0b0
+                               MX6QDL_PAD_ENET_MDIO__ENET_MDIO         0x1b0b0
+                               MX6QDL_PAD_ENET_RXD0__ENET_RX_DATA0     0x1b0b0
+                               MX6QDL_PAD_ENET_RXD1__ENET_RX_DATA1     0x1b0b0
+                               MX6QDL_PAD_ENET_RX_ER__ENET_RX_ER       0x1b0b0
+                               MX6QDL_PAD_ENET_TX_EN__ENET_TX_EN       0x1b0b0
+                               MX6QDL_PAD_ENET_TXD0__ENET_TX_DATA0     0x1b0b0
+                               MX6QDL_PAD_ENET_TXD1__ENET_TX_DATA1     0x1b0b0
+                               MX6QDL_PAD_ENET_CRS_DV__ENET_RX_EN      0x1b0b0
+                       >;
+               };
+
+               pinctrl_etnphy_power: etnphy-pwrgrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_EIM_D20__GPIO3_IO20          0x1b0b1 /* ETN PHY POWER */
+                       >;
+               };
+
+               pinctrl_flexcan1: flexcan1grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_GPIO_7__FLEXCAN1_TX          0x1b0b0
+                               MX6QDL_PAD_GPIO_8__FLEXCAN1_RX          0x1b0b0
+                       >;
+               };
+
+               pinctrl_flexcan2: flexcan2grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_KEY_COL4__FLEXCAN2_TX        0x1b0b0
+                               MX6QDL_PAD_KEY_ROW4__FLEXCAN2_RX        0x1b0b0
+                       >;
+               };
+
+               pinctrl_flexcan_xcvr: flexcan-xcvrgrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_DISP0_DAT0__GPIO4_IO21       0x1b0b0 /* Flexcan XCVR enable */
+                       >;
+               };
+
+               pinctrl_gpmi_nand: gpminandgrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_NANDF_CLE__NAND_CLE          0x0b0b1
+                               MX6QDL_PAD_NANDF_ALE__NAND_ALE          0x0b0b1
+                               MX6QDL_PAD_NANDF_WP_B__NAND_WP_B        0x0b0b1
+                               MX6QDL_PAD_NANDF_RB0__NAND_READY_B      0x0b000
+                               MX6QDL_PAD_NANDF_CS0__NAND_CE0_B        0x0b0b1
+                               MX6QDL_PAD_SD4_CMD__NAND_RE_B           0x0b0b1
+                               MX6QDL_PAD_SD4_CLK__NAND_WE_B           0x0b0b1
+                               MX6QDL_PAD_NANDF_D0__NAND_DATA00        0x0b0b1
+                               MX6QDL_PAD_NANDF_D1__NAND_DATA01        0x0b0b1
+                               MX6QDL_PAD_NANDF_D2__NAND_DATA02        0x0b0b1
+                               MX6QDL_PAD_NANDF_D3__NAND_DATA03        0x0b0b1
+                               MX6QDL_PAD_NANDF_D4__NAND_DATA04        0x0b0b1
+                               MX6QDL_PAD_NANDF_D5__NAND_DATA05        0x0b0b1
+                               MX6QDL_PAD_NANDF_D6__NAND_DATA06        0x0b0b1
+                               MX6QDL_PAD_NANDF_D7__NAND_DATA07        0x0b0b1
+                       >;
+               };
+
+               pinctrl_i2c1: i2c1grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_EIM_D21__I2C1_SCL            0x4001b8b1
+                               MX6QDL_PAD_EIM_D28__I2C1_SDA            0x4001b8b1
+                       >;
+               };
+
+               pinctrl_i2c3: i2c3grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_GPIO_3__I2C3_SCL             0x4001b8b1
+                               MX6QDL_PAD_GPIO_6__I2C3_SDA             0x4001b8b1
+                       >;
+               };
+
+               pinctrl_kpp: kppgrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_GPIO_9__KEY_COL6             0x1b0b1
+                               MX6QDL_PAD_GPIO_4__KEY_COL7             0x1b0b1
+                               MX6QDL_PAD_KEY_COL2__KEY_COL2           0x1b0b1
+                               MX6QDL_PAD_KEY_COL3__KEY_COL3           0x1b0b1
+                               MX6QDL_PAD_GPIO_2__KEY_ROW6             0x1b0b1
+                               MX6QDL_PAD_GPIO_5__KEY_ROW7             0x1b0b1
+                               MX6QDL_PAD_KEY_ROW2__KEY_ROW2           0x1b0b1
+                               MX6QDL_PAD_KEY_ROW3__KEY_ROW3           0x1b0b1
+                       >;
+               };
+
+               pinctrl_lcd0_pwr: lcd0-pwrgrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_EIM_D29__GPIO3_IO29          0x1b0b1 /* LCD Reset */
+                       >;
+               };
+
+               pinctrl_lcd1_pwr: lcd1-pwrgrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_EIM_EB3__GPIO2_IO31          0x1b0b1 /* LCD Power Enable */
+                       >;
+               };
+
+               pinctrl_pwm1: pwm1grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_GPIO_9__PWM1_OUT             0x1b0b1
+                       >;
+               };
+
+               pinctrl_pwm2: pwm2grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_GPIO_1__PWM2_OUT             0x1b0b1
+                       >;
+               };
+
+               pinctrl_tsc2007: tsc2007grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_EIM_D26__GPIO3_IO26          0x1b0b0 /* Interrupt */
+                       >;
+               };
+
+               pinctrl_uart1: uart1grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_SD3_DAT7__UART1_TX_DATA      0x1b0b1
+                               MX6QDL_PAD_SD3_DAT6__UART1_RX_DATA      0x1b0b1
+                       >;
+               };
+
+               pinctrl_uart1_rtscts: uart1_rtsctsgrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_SD3_DAT1__UART1_RTS_B        0x1b0b1
+                               MX6QDL_PAD_SD3_DAT0__UART1_CTS_B        0x1b0b1
+                       >;
+               };
+
+               pinctrl_uart2: uart2grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_SD4_DAT7__UART2_TX_DATA      0x1b0b1
+                               MX6QDL_PAD_SD4_DAT4__UART2_RX_DATA      0x1b0b1
+                       >;
+               };
+
+               pinctrl_uart2_rtscts: uart2_rtsctsgrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_SD4_DAT5__UART2_RTS_B        0x1b0b1
+                               MX6QDL_PAD_SD4_DAT6__UART2_CTS_B        0x1b0b1
+                       >;
+               };
+
+               pinctrl_uart3: uart3grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_EIM_D24__UART3_TX_DATA       0x1b0b1
+                               MX6QDL_PAD_EIM_D25__UART3_RX_DATA       0x1b0b1
+                       >;
+               };
+
+               pinctrl_uart3_rtscts: uart3_rtsctsgrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_SD3_DAT3__UART3_CTS_B        0x1b0b1
+                               MX6QDL_PAD_SD3_RST__UART3_RTS_B         0x1b0b1
+                       >;
+               };
+
+               pinctrl_usbh1_vbus: usbh1-vbusgrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_EIM_D31__GPIO3_IO31          0x1b0b0 /* USBH1_VBUSEN */
+                       >;
+               };
+
+               pinctrl_usbotg: usbotggrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_EIM_D23__GPIO3_IO23          0x17059
+                       >;
+               };
+
+               pinctrl_usbotg_vbus: usbotg-vbusgrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_GPIO_7__GPIO1_IO07           0x1b0b0 /* USBOTG_VBUSEN */
+                       >;
+               };
+
+               pinctrl_usdhc1: usdhc1grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_SD1_CMD__SD1_CMD             0x070b1
+                               MX6QDL_PAD_SD1_CLK__SD1_CLK             0x070b1
+                               MX6QDL_PAD_SD1_DAT0__SD1_DATA0          0x070b1
+                               MX6QDL_PAD_SD1_DAT1__SD1_DATA1          0x070b1
+                               MX6QDL_PAD_SD1_DAT2__SD1_DATA2          0x070b1
+                               MX6QDL_PAD_SD1_DAT3__SD1_DATA3          0x070b1
+                               MX6QDL_PAD_SD3_CMD__GPIO7_IO02          0x170b0 /* SD1 CD */
+                       >;
+               };
+
+               pinctrl_usdhc2: usdhc2grp {
+                       fsl,pins = <
+                               MX6QDL_PAD_SD2_CMD__SD2_CMD             0x070b1
+                               MX6QDL_PAD_SD2_CLK__SD2_CLK             0x070b1
+                               MX6QDL_PAD_SD2_DAT0__SD2_DATA0          0x070b1
+                               MX6QDL_PAD_SD2_DAT1__SD2_DATA1          0x070b1
+                               MX6QDL_PAD_SD2_DAT2__SD2_DATA2          0x070b1
+                               MX6QDL_PAD_SD2_DAT3__SD2_DATA3          0x070b1
+                               MX6QDL_PAD_SD3_CLK__GPIO7_IO03          0x170b0 /* SD2 CD */
+                       >;
+               };
+       };
+};
+
+&kpp {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_kpp>;
+       /* sample keymap */
+       /* row/col 0,1 are mapped to KPP row/col 6,7 */
+       linux,keymap = <
+               MATRIX_KEY(6, 6, KEY_POWER) /* 0x06060074 */
+               MATRIX_KEY(6, 7, KEY_KP0) /* 0x06070052 */
+               MATRIX_KEY(6, 2, KEY_KP1) /* 0x0602004f */
+               MATRIX_KEY(6, 3, KEY_KP2) /* 0x06030050 */
+               MATRIX_KEY(7, 6, KEY_KP3) /* 0x07060051 */
+               MATRIX_KEY(7, 7, KEY_KP4) /* 0x0707004b */
+               MATRIX_KEY(7, 2, KEY_KP5) /* 0x0702004c */
+               MATRIX_KEY(7, 3, KEY_KP6) /* 0x0703004d */
+               MATRIX_KEY(2, 6, KEY_KP7) /* 0x02060047 */
+               MATRIX_KEY(2, 7, KEY_KP8) /* 0x02070048 */
+               MATRIX_KEY(2, 2, KEY_KP9) /* 0x02020049 */
+       >;
+       status = "okay";
+};
+
+&pwm1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_pwm1>;
+       #pwm-cells = <3>;
+       status = "disabled";
+};
+
+&pwm2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_pwm2>;
+       #pwm-cells = <3>;
+       status = "okay";
+};
+
+&ssi1 {
+       status = "okay";
+};
+
+&uart1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart1>;
+       status = "okay";
+};
+
+&uart2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart2 &pinctrl_uart2_rtscts>;
+       status = "okay";
+};
+
+&uart3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart3 &pinctrl_uart3_rtscts>;
+       status = "okay";
+};
+
+&usbh1 {
+       vbus-supply = <&reg_usbh1_vbus>;
+       dr_mode = "host";
+       disable-over-current;
+       status = "okay";
+};
+
+&usbotg {
+       vbus-supply = <&reg_usbotg_vbus>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usbotg>;
+       dr_mode = "peripheral";
+       disable-over-current;
+       status = "okay";
+};
+
+&usdhc1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc1>;
+       bus-width = <4>;
+       no-1-8-v;
+       cd-gpios = <&gpio7 2 0>;
+       fsl,wp-controller;
+       status = "okay";
+};
+
+&usdhc2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc2>;
+       bus-width = <4>;
+       no-1-8-v;
+       cd-gpios = <&gpio7 3 0>;
+       fsl,wp-controller;
+       status = "okay";
+};
diff --git a/arch/arm/boot/dts/imx6qdl-wandboard-revb1.dtsi b/arch/arm/boot/dts/imx6qdl-wandboard-revb1.dtsi
new file mode 100644 (file)
index 0000000..ef7fa62
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2013 Freescale Semiconductor, Inc.
+ *
+ * Author: Fabio Estevam <fabio.estevam@freescale.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include "imx6qdl-wandboard.dtsi"
+
+&iomuxc {
+       pinctrl-0 = <&pinctrl_hog>;
+
+       imx6qdl-wandboard {
+               pinctrl_hog: hoggrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_GPIO_0__CCM_CLKO1            0x130b0         /* GPIO_0_CLKO */
+                               MX6QDL_PAD_GPIO_2__GPIO1_IO02           0x80000000      /* uSDHC1 CD */
+                               MX6QDL_PAD_EIM_DA9__GPIO3_IO09          0x80000000      /* uSDHC3 CD */
+                               MX6QDL_PAD_EIM_EB1__GPIO2_IO29          0x0f0b0         /* WL_REF_ON */
+                               MX6QDL_PAD_EIM_A25__GPIO5_IO02          0x0f0b0         /* WL_RST_N */
+                               MX6QDL_PAD_ENET_RXD1__GPIO1_IO26        0x000b0         /* WL_REG_ON */
+                               MX6QDL_PAD_ENET_TXD1__GPIO1_IO29        0x80000000      /* WL_HOST_WAKE */
+                               MX6QDL_PAD_ENET_TXD0__GPIO1_IO30        0x80000000      /* WL_WAKE */
+                               MX6QDL_PAD_EIM_D29__GPIO3_IO29          0x80000000      /* RGMII_nRST */
+                               MX6QDL_PAD_EIM_DA13__GPIO3_IO13         0x80000000      /* BT_ON */
+                               MX6QDL_PAD_EIM_DA14__GPIO3_IO14         0x80000000      /* BT_WAKE */
+                               MX6QDL_PAD_EIM_DA15__GPIO3_IO15         0x80000000      /* BT_HOST_WAKE */                              
+                       >;
+               };
+       };
+};
+
+&usdhc2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc2>;
+       non-removable;
+       status = "okay";
+};
diff --git a/arch/arm/boot/dts/imx6qdl-wandboard-revc1.dtsi b/arch/arm/boot/dts/imx6qdl-wandboard-revc1.dtsi
new file mode 100644 (file)
index 0000000..8d893a7
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2013 Freescale Semiconductor, Inc.
+ *
+ * Author: Fabio Estevam <fabio.estevam@freescale.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include "imx6qdl-wandboard.dtsi"
+
+&iomuxc {
+       pinctrl-0 = <&pinctrl_hog>;
+
+       imx6qdl-wandboard {
+               pinctrl_hog: hoggrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_GPIO_0__CCM_CLKO1            0x130b0         /* GPIO_0_CLKO */
+                               MX6QDL_PAD_GPIO_2__GPIO1_IO02           0x80000000      /* uSDHC1 CD */
+                               MX6QDL_PAD_EIM_DA9__GPIO3_IO09          0x80000000      /* uSDHC3 CD */
+                               MX6QDL_PAD_CSI0_DAT14__GPIO6_IO00       0x0f0b0         /* WIFI_ON (reset, active low) */
+                               MX6QDL_PAD_ENET_RXD1__GPIO1_IO26        0x000b0         /* WL_REG_ON (unused) */
+                               MX6QDL_PAD_ENET_TXD1__GPIO1_IO29        0x80000000      /* WL_HOST_WAKE, input */
+                               MX6QDL_PAD_CSI0_DAT13__GPIO5_IO31       0x0f0b0         /* GPIO5_IO31 (Wifi Power Enable) */
+                               MX6QDL_PAD_ENET_TXD0__GPIO1_IO30        0x80000000      /* WL_WAKE (unused) */
+                               MX6QDL_PAD_CSI0_VSYNC__GPIO5_IO21       0x80000000      /* BT_ON */
+                               MX6QDL_PAD_CSI0_DAT12__GPIO5_IO30       0x80000000      /* BT_WAKE */
+                               MX6QDL_PAD_CSI0_DATA_EN__GPIO5_IO20     0x80000000      /* BT_HOST_WAKE */
+                               MX6QDL_PAD_EIM_D29__GPIO3_IO29          0x80000000      /* RGMII_nRST */
+                       >;
+               };
+       };
+};
+
+&usdhc2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc2>;
+       status = "okay";
+};
index 5c6f10c43f65644bb4ab1367843fbf46918b90a9..5fb091675582e25b84026f5447d0be604f9266ac 100644 (file)
 
 &iomuxc {
        pinctrl-names = "default";
-       pinctrl-0 = <&pinctrl_hog>;
 
        imx6qdl-wandboard {
-               pinctrl_hog: hoggrp {
-                       fsl,pins = <
-                               MX6QDL_PAD_GPIO_0__CCM_CLKO1     0x130b0
-                               MX6QDL_PAD_GPIO_2__GPIO1_IO02    0x80000000
-                               MX6QDL_PAD_EIM_DA9__GPIO3_IO09   0x80000000
-                               MX6QDL_PAD_EIM_EB1__GPIO2_IO29   0x80000000 /* WL_REF_ON */
-                               MX6QDL_PAD_EIM_A25__GPIO5_IO02   0x80000000 /* WL_RST_N */
-                               MX6QDL_PAD_ENET_RXD1__GPIO1_IO26 0x80000000 /* WL_REG_ON */
-                               MX6QDL_PAD_ENET_TXD1__GPIO1_IO29 0x80000000 /* WL_HOST_WAKE */
-                               MX6QDL_PAD_ENET_TXD0__GPIO1_IO30 0x80000000 /* WL_WAKE */
-                               MX6QDL_PAD_EIM_D29__GPIO3_IO29   0x80000000
-                       >;
-               };
 
                pinctrl_audmux: audmuxgrp {
                        fsl,pins = <
 };
 
 &ssi1 {
-       fsl,mode = "i2s-slave";
        status = "okay";
 };
 
        status = "okay";
 };
 
-&usdhc2 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&pinctrl_usdhc2>;
-       non-removable;
-       status = "okay";
-};
-
 &usdhc3 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_usdhc3>;
index ce0599134a699dd338b6f42adef8378e94a7d6e1..c701af9580067d287cc0bffbc0afe074c8ddab7d 100644 (file)
@@ -10,6 +10,7 @@
  * http://www.gnu.org/copyleft/gpl.html
  */
 
+#include <dt-bindings/clock/imx6qdl-clock.h>
 #include <dt-bindings/interrupt-controller/arm-gic.h>
 
 #include "skeleton.dtsi"
@@ -94,7 +95,7 @@
                        interrupt-names = "gpmi0", "gpmi1", "gpmi2", "gpmi3";
                        #dma-cells = <1>;
                        dma-channels = <4>;
-                       clocks = <&clks 106>;
+                       clocks = <&clks IMX6QDL_CLK_APBH_DMA>;
                };
 
                gpmi: gpmi-nand@00112000 {
                        reg-names = "gpmi-nand", "bch";
                        interrupts = <0 15 IRQ_TYPE_LEVEL_HIGH>;
                        interrupt-names = "bch";
-                       clocks = <&clks 152>, <&clks 153>, <&clks 151>,
-                                <&clks 150>, <&clks 149>;
+                       clocks = <&clks IMX6QDL_CLK_GPMI_IO>,
+                                <&clks IMX6QDL_CLK_GPMI_APB>,
+                                <&clks IMX6QDL_CLK_GPMI_BCH>,
+                                <&clks IMX6QDL_CLK_GPMI_BCH_APB>,
+                                <&clks IMX6QDL_CLK_PER1_BCH>;
                        clock-names = "gpmi_io", "gpmi_apb", "gpmi_bch",
                                      "gpmi_bch_apb", "per1_bch";
                        dmas = <&dma_apbh 0>;
                        compatible = "arm,cortex-a9-twd-timer";
                        reg = <0x00a00600 0x20>;
                        interrupts = <1 13 0xf01>;
-                       clocks = <&clks 15>;
+                       clocks = <&clks IMX6QDL_CLK_TWD>;
                };
 
                L2: l2-cache@00a02000 {
                                        <0 0 0 2 &intc GIC_SPI 122 IRQ_TYPE_LEVEL_HIGH>,
                                        <0 0 0 3 &intc GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>,
                                        <0 0 0 4 &intc GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&clks 144>, <&clks 206>, <&clks 189>;
+                       clocks = <&clks IMX6QDL_CLK_PCIE_AXI>,
+                                <&clks IMX6QDL_CLK_LVDS1_GATE>,
+                                <&clks IMX6QDL_CLK_PCIE_REF_125M>;
                        clock-names = "pcie", "pcie_bus", "pcie_phy";
                        status = "disabled";
                };
                                        dmas = <&sdma 14 18 0>,
                                               <&sdma 15 18 0>;
                                        dma-names = "rx", "tx";
-                                       clocks = <&clks 197>, <&clks 3>,
-                                                <&clks 197>, <&clks 107>,
-                                                <&clks 0>,   <&clks 118>,
-                                                <&clks 0>,  <&clks 139>,
-                                                <&clks 0>;
+                                       clocks = <&clks IMX6QDL_CLK_SPDIF>, <&clks IMX6QDL_CLK_OSC>,
+                                                <&clks IMX6QDL_CLK_SPDIF>, <&clks IMX6QDL_CLK_DUMMY>,
+                                                <&clks IMX6QDL_CLK_DUMMY>, <&clks IMX6QDL_CLK_DUMMY>,
+                                                <&clks IMX6QDL_CLK_DUMMY>, <&clks IMX6QDL_CLK_DUMMY>,
+                                                <&clks IMX6QDL_CLK_DUMMY>;
                                        clock-names = "core",  "rxtx0",
                                                      "rxtx1", "rxtx2",
                                                      "rxtx3", "rxtx4",
                                        compatible = "fsl,imx6q-ecspi", "fsl,imx51-ecspi";
                                        reg = <0x02008000 0x4000>;
                                        interrupts = <0 31 IRQ_TYPE_LEVEL_HIGH>;
-                                       clocks = <&clks 112>, <&clks 112>;
+                                       clocks = <&clks IMX6QDL_CLK_ECSPI1>,
+                                                <&clks IMX6QDL_CLK_ECSPI1>;
                                        clock-names = "ipg", "per";
                                        dmas = <&sdma 3 7 1>, <&sdma 4 7 2>;
                                        dma-names = "rx", "tx";
                                        compatible = "fsl,imx6q-ecspi", "fsl,imx51-ecspi";
                                        reg = <0x0200c000 0x4000>;
                                        interrupts = <0 32 IRQ_TYPE_LEVEL_HIGH>;
-                                       clocks = <&clks 113>, <&clks 113>;
+                                       clocks = <&clks IMX6QDL_CLK_ECSPI2>,
+                                                <&clks IMX6QDL_CLK_ECSPI2>;
                                        clock-names = "ipg", "per";
                                        dmas = <&sdma 5 7 1>, <&sdma 6 7 2>;
                                        dma-names = "rx", "tx";
                                        compatible = "fsl,imx6q-ecspi", "fsl,imx51-ecspi";
                                        reg = <0x02010000 0x4000>;
                                        interrupts = <0 33 IRQ_TYPE_LEVEL_HIGH>;
-                                       clocks = <&clks 114>, <&clks 114>;
+                                       clocks = <&clks IMX6QDL_CLK_ECSPI3>,
+                                                <&clks IMX6QDL_CLK_ECSPI3>;
                                        clock-names = "ipg", "per";
                                        dmas = <&sdma 7 7 1>, <&sdma 8 7 2>;
                                        dma-names = "rx", "tx";
                                        compatible = "fsl,imx6q-ecspi", "fsl,imx51-ecspi";
                                        reg = <0x02014000 0x4000>;
                                        interrupts = <0 34 IRQ_TYPE_LEVEL_HIGH>;
-                                       clocks = <&clks 115>, <&clks 115>;
+                                       clocks = <&clks IMX6QDL_CLK_ECSPI4>,
+                                                <&clks IMX6QDL_CLK_ECSPI4>;
                                        clock-names = "ipg", "per";
                                        dmas = <&sdma 9 7 1>, <&sdma 10 7 2>;
                                        dma-names = "rx", "tx";
                                        compatible = "fsl,imx6q-uart", "fsl,imx21-uart";
                                        reg = <0x02020000 0x4000>;
                                        interrupts = <0 26 IRQ_TYPE_LEVEL_HIGH>;
-                                       clocks = <&clks 160>, <&clks 161>;
+                                       clocks = <&clks IMX6QDL_CLK_UART_IPG>,
+                                                <&clks IMX6QDL_CLK_UART_SERIAL>;
                                        clock-names = "ipg", "per";
                                        dmas = <&sdma 25 4 0>, <&sdma 26 4 0>;
                                        dma-names = "rx", "tx";
 
                                ssi1: ssi@02028000 {
                                        compatible = "fsl,imx6q-ssi",
-                                                       "fsl,imx51-ssi",
-                                                       "fsl,imx21-ssi";
+                                                       "fsl,imx51-ssi";
                                        reg = <0x02028000 0x4000>;
                                        interrupts = <0 46 IRQ_TYPE_LEVEL_HIGH>;
-                                       clocks = <&clks 178>;
+                                       clocks = <&clks IMX6QDL_CLK_SSI1_IPG>;
                                        dmas = <&sdma 37 1 0>,
                                               <&sdma 38 1 0>;
                                        dma-names = "rx", "tx";
                                        fsl,fifo-depth = <15>;
-                                       fsl,ssi-dma-events = <38 37>;
                                        status = "disabled";
                                };
 
                                ssi2: ssi@0202c000 {
                                        compatible = "fsl,imx6q-ssi",
-                                                       "fsl,imx51-ssi",
-                                                       "fsl,imx21-ssi";
+                                                       "fsl,imx51-ssi";
                                        reg = <0x0202c000 0x4000>;
                                        interrupts = <0 47 IRQ_TYPE_LEVEL_HIGH>;
-                                       clocks = <&clks 179>;
+                                       clocks = <&clks IMX6QDL_CLK_SSI2_IPG>;
                                        dmas = <&sdma 41 1 0>,
                                               <&sdma 42 1 0>;
                                        dma-names = "rx", "tx";
                                        fsl,fifo-depth = <15>;
-                                       fsl,ssi-dma-events = <42 41>;
                                        status = "disabled";
                                };
 
                                ssi3: ssi@02030000 {
                                        compatible = "fsl,imx6q-ssi",
-                                                       "fsl,imx51-ssi",
-                                                       "fsl,imx21-ssi";
+                                                       "fsl,imx51-ssi";
                                        reg = <0x02030000 0x4000>;
                                        interrupts = <0 48 IRQ_TYPE_LEVEL_HIGH>;
-                                       clocks = <&clks 180>;
+                                       clocks = <&clks IMX6QDL_CLK_SSI3_IPG>;
                                        dmas = <&sdma 45 1 0>,
                                               <&sdma 46 1 0>;
                                        dma-names = "rx", "tx";
                                        fsl,fifo-depth = <15>;
-                                       fsl,ssi-dma-events = <46 45>;
                                        status = "disabled";
                                };
 
                                compatible = "fsl,imx6q-pwm", "fsl,imx27-pwm";
                                reg = <0x02080000 0x4000>;
                                interrupts = <0 83 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clks 62>, <&clks 145>;
+                               clocks = <&clks IMX6QDL_CLK_IPG>,
+                                        <&clks IMX6QDL_CLK_PWM1>;
                                clock-names = "ipg", "per";
                        };
 
                                compatible = "fsl,imx6q-pwm", "fsl,imx27-pwm";
                                reg = <0x02084000 0x4000>;
                                interrupts = <0 84 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clks 62>, <&clks 146>;
+                               clocks = <&clks IMX6QDL_CLK_IPG>,
+                                        <&clks IMX6QDL_CLK_PWM2>;
                                clock-names = "ipg", "per";
                        };
 
                                compatible = "fsl,imx6q-pwm", "fsl,imx27-pwm";
                                reg = <0x02088000 0x4000>;
                                interrupts = <0 85 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clks 62>, <&clks 147>;
+                               clocks = <&clks IMX6QDL_CLK_IPG>,
+                                        <&clks IMX6QDL_CLK_PWM3>;
                                clock-names = "ipg", "per";
                        };
 
                                compatible = "fsl,imx6q-pwm", "fsl,imx27-pwm";
                                reg = <0x0208c000 0x4000>;
                                interrupts = <0 86 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clks 62>, <&clks 148>;
+                               clocks = <&clks IMX6QDL_CLK_IPG>,
+                                        <&clks IMX6QDL_CLK_PWM4>;
                                clock-names = "ipg", "per";
                        };
 
                                compatible = "fsl,imx6q-flexcan";
                                reg = <0x02090000 0x4000>;
                                interrupts = <0 110 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clks 108>, <&clks 109>;
+                               clocks = <&clks IMX6QDL_CLK_CAN1_IPG>,
+                                        <&clks IMX6QDL_CLK_CAN1_SERIAL>;
                                clock-names = "ipg", "per";
                                status = "disabled";
                        };
                                compatible = "fsl,imx6q-flexcan";
                                reg = <0x02094000 0x4000>;
                                interrupts = <0 111 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clks 110>, <&clks 111>;
+                               clocks = <&clks IMX6QDL_CLK_CAN2_IPG>,
+                                        <&clks IMX6QDL_CLK_CAN2_SERIAL>;
                                clock-names = "ipg", "per";
                                status = "disabled";
                        };
                                compatible = "fsl,imx6q-gpt", "fsl,imx31-gpt";
                                reg = <0x02098000 0x4000>;
                                interrupts = <0 55 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clks 119>, <&clks 120>;
+                               clocks = <&clks IMX6QDL_CLK_GPT_IPG>,
+                                        <&clks IMX6QDL_CLK_GPT_IPG_PER>;
                                clock-names = "ipg", "per";
                        };
 
                        };
 
                        kpp: kpp@020b8000 {
+                               compatible = "fsl,imx6q-kpp", "fsl,imx21-kpp";
                                reg = <0x020b8000 0x4000>;
                                interrupts = <0 82 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6QDL_CLK_IPG>;
+                               status = "disabled";
                        };
 
                        wdog1: wdog@020bc000 {
                                compatible = "fsl,imx6q-wdt", "fsl,imx21-wdt";
                                reg = <0x020bc000 0x4000>;
                                interrupts = <0 80 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clks 0>;
+                               clocks = <&clks IMX6QDL_CLK_DUMMY>;
                        };
 
                        wdog2: wdog@020c0000 {
                                compatible = "fsl,imx6q-wdt", "fsl,imx21-wdt";
                                reg = <0x020c0000 0x4000>;
                                interrupts = <0 81 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clks 0>;
+                               clocks = <&clks IMX6QDL_CLK_DUMMY>;
                                status = "disabled";
                        };
 
                                interrupts = <0 49 IRQ_TYPE_LEVEL_HIGH>;
                                fsl,tempmon = <&anatop>;
                                fsl,tempmon-data = <&ocotp>;
-                               clocks = <&clks 172>;
+                               clocks = <&clks IMX6QDL_CLK_PLL3_USB_OTG>;
                        };
 
                        usbphy1: usbphy@020c9000 {
                                compatible = "fsl,imx6q-usbphy", "fsl,imx23-usbphy";
                                reg = <0x020c9000 0x1000>;
                                interrupts = <0 44 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clks 182>;
+                               clocks = <&clks IMX6QDL_CLK_USBPHY1>;
                                fsl,anatop = <&anatop>;
                        };
 
                                compatible = "fsl,imx6q-usbphy", "fsl,imx23-usbphy";
                                reg = <0x020ca000 0x1000>;
                                interrupts = <0 45 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clks 183>;
+                               clocks = <&clks IMX6QDL_CLK_USBPHY2>;
                                fsl,anatop = <&anatop>;
                        };
 
                                reg = <0x00120000 0x9000>;
                                interrupts = <0 115 0x04>;
                                gpr = <&gpr>;
-                               clocks = <&clks 123>, <&clks 124>;
+                               clocks = <&clks IMX6QDL_CLK_HDMI_IAHB>,
+                                        <&clks IMX6QDL_CLK_HDMI_ISFR>;
                                clock-names = "iahb", "isfr";
                                status = "disabled";
 
                                compatible = "fsl,imx6q-sdma", "fsl,imx35-sdma";
                                reg = <0x020ec000 0x4000>;
                                interrupts = <0 2 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clks 155>, <&clks 155>;
+                               clocks = <&clks IMX6QDL_CLK_SDMA>,
+                                        <&clks IMX6QDL_CLK_SDMA>;
                                clock-names = "ipg", "ahb";
                                #dma-cells = <3>;
                                fsl,sdma-ram-script-name = "imx/sdma/sdma-imx6q.bin";
                                compatible = "fsl,imx6q-usb", "fsl,imx27-usb";
                                reg = <0x02184000 0x200>;
                                interrupts = <0 43 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clks 162>;
+                               clocks = <&clks IMX6QDL_CLK_USBOH3>;
                                fsl,usbphy = <&usbphy1>;
                                fsl,usbmisc = <&usbmisc 0>;
                                status = "disabled";
                                compatible = "fsl,imx6q-usb", "fsl,imx27-usb";
                                reg = <0x02184200 0x200>;
                                interrupts = <0 40 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clks 162>;
+                               clocks = <&clks IMX6QDL_CLK_USBOH3>;
                                fsl,usbphy = <&usbphy2>;
                                fsl,usbmisc = <&usbmisc 1>;
                                status = "disabled";
                                compatible = "fsl,imx6q-usb", "fsl,imx27-usb";
                                reg = <0x02184400 0x200>;
                                interrupts = <0 41 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clks 162>;
+                               clocks = <&clks IMX6QDL_CLK_USBOH3>;
                                fsl,usbmisc = <&usbmisc 2>;
                                status = "disabled";
                        };
                                compatible = "fsl,imx6q-usb", "fsl,imx27-usb";
                                reg = <0x02184600 0x200>;
                                interrupts = <0 42 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clks 162>;
+                               clocks = <&clks IMX6QDL_CLK_USBOH3>;
                                fsl,usbmisc = <&usbmisc 3>;
                                status = "disabled";
                        };
                                #index-cells = <1>;
                                compatible = "fsl,imx6q-usbmisc";
                                reg = <0x02184800 0x200>;
-                               clocks = <&clks 162>;
+                               clocks = <&clks IMX6QDL_CLK_USBOH3>;
                        };
 
                        fec: ethernet@02188000 {
                                interrupts-extended =
                                        <&intc 0 118 IRQ_TYPE_LEVEL_HIGH>,
                                        <&intc 0 119 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clks 117>, <&clks 117>, <&clks 190>;
+                               clocks = <&clks IMX6QDL_CLK_ENET>,
+                                        <&clks IMX6QDL_CLK_ENET>,
+                                        <&clks IMX6QDL_CLK_ENET_REF>;
                                clock-names = "ipg", "ahb", "ptp";
                                status = "disabled";
                        };
                                compatible = "fsl,imx6q-usdhc";
                                reg = <0x02190000 0x4000>;
                                interrupts = <0 22 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clks 163>, <&clks 163>, <&clks 163>;
+                               clocks = <&clks IMX6QDL_CLK_USDHC1>,
+                                        <&clks IMX6QDL_CLK_USDHC1>,
+                                        <&clks IMX6QDL_CLK_USDHC1>;
                                clock-names = "ipg", "ahb", "per";
                                bus-width = <4>;
                                status = "disabled";
                                compatible = "fsl,imx6q-usdhc";
                                reg = <0x02194000 0x4000>;
                                interrupts = <0 23 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clks 164>, <&clks 164>, <&clks 164>;
+                               clocks = <&clks IMX6QDL_CLK_USDHC2>,
+                                        <&clks IMX6QDL_CLK_USDHC2>,
+                                        <&clks IMX6QDL_CLK_USDHC2>;
                                clock-names = "ipg", "ahb", "per";
                                bus-width = <4>;
                                status = "disabled";
                                compatible = "fsl,imx6q-usdhc";
                                reg = <0x02198000 0x4000>;
                                interrupts = <0 24 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clks 165>, <&clks 165>, <&clks 165>;
+                               clocks = <&clks IMX6QDL_CLK_USDHC3>,
+                                        <&clks IMX6QDL_CLK_USDHC3>,
+                                        <&clks IMX6QDL_CLK_USDHC3>;
                                clock-names = "ipg", "ahb", "per";
                                bus-width = <4>;
                                status = "disabled";
                                compatible = "fsl,imx6q-usdhc";
                                reg = <0x0219c000 0x4000>;
                                interrupts = <0 25 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clks 166>, <&clks 166>, <&clks 166>;
+                               clocks = <&clks IMX6QDL_CLK_USDHC4>,
+                                        <&clks IMX6QDL_CLK_USDHC4>,
+                                        <&clks IMX6QDL_CLK_USDHC4>;
                                clock-names = "ipg", "ahb", "per";
                                bus-width = <4>;
                                status = "disabled";
                                compatible = "fsl,imx6q-i2c", "fsl,imx21-i2c";
                                reg = <0x021a0000 0x4000>;
                                interrupts = <0 36 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clks 125>;
+                               clocks = <&clks IMX6QDL_CLK_I2C1>;
                                status = "disabled";
                        };
 
                                compatible = "fsl,imx6q-i2c", "fsl,imx21-i2c";
                                reg = <0x021a4000 0x4000>;
                                interrupts = <0 37 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clks 126>;
+                               clocks = <&clks IMX6QDL_CLK_I2C2>;
                                status = "disabled";
                        };
 
                                compatible = "fsl,imx6q-i2c", "fsl,imx21-i2c";
                                reg = <0x021a8000 0x4000>;
                                interrupts = <0 38 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clks 127>;
+                               clocks = <&clks IMX6QDL_CLK_I2C3>;
                                status = "disabled";
                        };
 
                                compatible = "fsl,imx6q-weim";
                                reg = <0x021b8000 0x4000>;
                                interrupts = <0 14 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clks 196>;
+                               clocks = <&clks IMX6QDL_CLK_EIM_SLOW>;
                        };
 
                        ocotp: ocotp@021bc000 {
                                compatible = "fsl,imx6q-uart", "fsl,imx21-uart";
                                reg = <0x021e8000 0x4000>;
                                interrupts = <0 27 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clks 160>, <&clks 161>;
+                               clocks = <&clks IMX6QDL_CLK_UART_IPG>,
+                                        <&clks IMX6QDL_CLK_UART_SERIAL>;
                                clock-names = "ipg", "per";
                                dmas = <&sdma 27 4 0>, <&sdma 28 4 0>;
                                dma-names = "rx", "tx";
                                compatible = "fsl,imx6q-uart", "fsl,imx21-uart";
                                reg = <0x021ec000 0x4000>;
                                interrupts = <0 28 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clks 160>, <&clks 161>;
+                               clocks = <&clks IMX6QDL_CLK_UART_IPG>,
+                                        <&clks IMX6QDL_CLK_UART_SERIAL>;
                                clock-names = "ipg", "per";
                                dmas = <&sdma 29 4 0>, <&sdma 30 4 0>;
                                dma-names = "rx", "tx";
                                compatible = "fsl,imx6q-uart", "fsl,imx21-uart";
                                reg = <0x021f0000 0x4000>;
                                interrupts = <0 29 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clks 160>, <&clks 161>;
+                               clocks = <&clks IMX6QDL_CLK_UART_IPG>,
+                                        <&clks IMX6QDL_CLK_UART_SERIAL>;
                                clock-names = "ipg", "per";
                                dmas = <&sdma 31 4 0>, <&sdma 32 4 0>;
                                dma-names = "rx", "tx";
                                compatible = "fsl,imx6q-uart", "fsl,imx21-uart";
                                reg = <0x021f4000 0x4000>;
                                interrupts = <0 30 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clks 160>, <&clks 161>;
+                               clocks = <&clks IMX6QDL_CLK_UART_IPG>,
+                                        <&clks IMX6QDL_CLK_UART_SERIAL>;
                                clock-names = "ipg", "per";
                                dmas = <&sdma 33 4 0>, <&sdma 34 4 0>;
                                dma-names = "rx", "tx";
                        reg = <0x02400000 0x400000>;
                        interrupts = <0 6 IRQ_TYPE_LEVEL_HIGH>,
                                     <0 5 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&clks 130>, <&clks 131>, <&clks 132>;
+                       clocks = <&clks IMX6QDL_CLK_IPU1>,
+                                <&clks IMX6QDL_CLK_IPU1_DI0>,
+                                <&clks IMX6QDL_CLK_IPU1_DI1>;
                        clock-names = "bus", "di0", "di1";
                        resets = <&src 2>;
 
+                       ipu1_csi0: port@0 {
+                               reg = <0>;
+                       };
+
+                       ipu1_csi1: port@1 {
+                               reg = <1>;
+                       };
+
                        ipu1_di0: port@2 {
                                #address-cells = <1>;
                                #size-cells = <0>;
index a8d9a93fab85fd5031eb8c164fc676823392e0b2..3f9e041c0252178c005b75387de9c20a58d58426 100644 (file)
 };
 
 &fec {
-       pinctrl-names = "default";
+       pinctrl-names = "default", "sleep";
        pinctrl-0 = <&pinctrl_fec>;
+       pinctrl-1 = <&pinctrl_fec_sleep>;
        phy-mode = "rmii";
        status = "okay";
 };
                        >;
                };
 
+               pinctrl_fec_sleep: fecgrp-sleep {
+                       fsl,pins = <
+                               MX6SL_PAD_FEC_MDC__GPIO4_IO23      0x3080
+                               MX6SL_PAD_FEC_CRS_DV__GPIO4_IO25   0x3080
+                               MX6SL_PAD_FEC_RXD0__GPIO4_IO17     0x3080
+                               MX6SL_PAD_FEC_RXD1__GPIO4_IO18     0x3080
+                               MX6SL_PAD_FEC_TX_EN__GPIO4_IO22    0x3080
+                               MX6SL_PAD_FEC_TXD0__GPIO4_IO24     0x3080
+                               MX6SL_PAD_FEC_TXD1__GPIO4_IO16     0x3080
+                               MX6SL_PAD_FEC_REF_CLK__GPIO4_IO26  0x3080
+                       >;
+               };
+
                pinctrl_i2c1: i2c1grp {
                        fsl,pins = <
                                MX6SL_PAD_I2C1_SCL__I2C1_SCL    0x4001b8b1
 };
 
 &ssi2 {
-       fsl,mode = "i2s-slave";
        status = "okay";
 };
 
index 57d4abe03a94f55180e6c6bf01f5919657fd9408..c75800ca8b355fbdf2da2d3ee62e346078948811 100644 (file)
 
                                ssi1: ssi@02028000 {
                                        compatible = "fsl,imx6sl-ssi",
-                                                       "fsl,imx51-ssi",
-                                                       "fsl,imx21-ssi";
+                                                       "fsl,imx51-ssi";
                                        reg = <0x02028000 0x4000>;
                                        interrupts = <0 46 IRQ_TYPE_LEVEL_HIGH>;
                                        clocks = <&clks IMX6SL_CLK_SSI1>;
 
                                ssi2: ssi@0202c000 {
                                        compatible = "fsl,imx6sl-ssi",
-                                                       "fsl,imx51-ssi",
-                                                       "fsl,imx21-ssi";
+                                                       "fsl,imx51-ssi";
                                        reg = <0x0202c000 0x4000>;
                                        interrupts = <0 47 IRQ_TYPE_LEVEL_HIGH>;
                                        clocks = <&clks IMX6SL_CLK_SSI2>;
 
                                ssi3: ssi@02030000 {
                                        compatible = "fsl,imx6sl-ssi",
-                                                       "fsl,imx51-ssi",
-                                                       "fsl,imx21-ssi";
+                                                       "fsl,imx51-ssi";
                                        reg = <0x02030000 0x4000>;
                                        interrupts = <0 48 IRQ_TYPE_LEVEL_HIGH>;
                                        clocks = <&clks IMX6SL_CLK_SSI3>;
                                reg = <0x020b8000 0x4000>;
                                interrupts = <0 82 IRQ_TYPE_LEVEL_HIGH>;
                                clocks = <&clks IMX6SL_CLK_DUMMY>;
+                               status = "disabled";
                        };
 
                        wdog1: wdog@020bc000 {
                        };
 
                        sdma: sdma@020ec000 {
-                               compatible = "fsl,imx6sl-sdma", "fsl,imx35-sdma";
+                               compatible = "fsl,imx6sl-sdma", "fsl,imx6q-sdma";
                                reg = <0x020ec000 0x4000>;
                                interrupts = <0 2 IRQ_TYPE_LEVEL_HIGH>;
                                clocks = <&clks IMX6SL_CLK_SDMA>,
diff --git a/arch/arm/boot/dts/imx6sx-pinfunc.h b/arch/arm/boot/dts/imx6sx-pinfunc.h
new file mode 100644 (file)
index 0000000..3e0b816
--- /dev/null
@@ -0,0 +1,1544 @@
+/*
+ * Copyright 2014 Freescale Semiconductor, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#ifndef __DTS_IMX6SX_PINFUNC_H
+#define __DTS_IMX6SX_PINFUNC_H
+
+/*
+ * The pin function ID is a tuple of
+ * <mux_reg conf_reg input_reg mux_mode input_val>
+ */
+#define MX6SX_PAD_GPIO1_IO00__I2C1_SCL                            0x0014 0x035C 0x07A8 0x0 0x1
+#define MX6SX_PAD_GPIO1_IO00__USDHC1_VSELECT                      0x0014 0x035C 0x0000 0x1 0x0
+#define MX6SX_PAD_GPIO1_IO00__SPDIF_LOCK                          0x0014 0x035C 0x0000 0x2 0x0
+#define MX6SX_PAD_GPIO1_IO00__CCM_WAIT                            0x0014 0x035C 0x0000 0x3 0x0
+#define MX6SX_PAD_GPIO1_IO00__WDOG1_WDOG_ANY                      0x0014 0x035C 0x0000 0x4 0x0
+#define MX6SX_PAD_GPIO1_IO00__GPIO1_IO_0                          0x0014 0x035C 0x0000 0x5 0x0
+#define MX6SX_PAD_GPIO1_IO00__SNVS_HP_WRAPPER_VIO_5               0x0014 0x035C 0x0000 0x6 0x0
+#define MX6SX_PAD_GPIO1_IO00__PHY_DTB_1                           0x0014 0x035C 0x0000 0x7 0x0
+#define MX6SX_PAD_GPIO1_IO01__I2C1_SDA                            0x0018 0x0360 0x07AC 0x0 0x1
+#define MX6SX_PAD_GPIO1_IO01__USDHC1_RESET_B                      0x0018 0x0360 0x0000 0x1 0x0
+#define MX6SX_PAD_GPIO1_IO01__SPDIF_SR_CLK                        0x0018 0x0360 0x0000 0x2 0x0
+#define MX6SX_PAD_GPIO1_IO01__CCM_STOP                            0x0018 0x0360 0x0000 0x3 0x0
+#define MX6SX_PAD_GPIO1_IO01__WDOG3_WDOG_B                        0x0018 0x0360 0x0000 0x4 0x0
+#define MX6SX_PAD_GPIO1_IO01__GPIO1_IO_1                          0x0018 0x0360 0x0000 0x5 0x0
+#define MX6SX_PAD_GPIO1_IO01__SNVS_HP_WRAPPER_VIO_5_CTL           0x0018 0x0360 0x0000 0x6 0x0
+#define MX6SX_PAD_GPIO1_IO01__PHY_DTB_0                           0x0018 0x0360 0x0000 0x7 0x0
+#define MX6SX_PAD_GPIO1_IO02__I2C2_SCL                            0x001C 0x0364 0x07B0 0x0 0x1
+#define MX6SX_PAD_GPIO1_IO02__USDHC1_CD_B                         0x001C 0x0364 0x0864 0x1 0x1
+#define MX6SX_PAD_GPIO1_IO02__CSI2_MCLK                           0x001C 0x0364 0x0000 0x2 0x0
+#define MX6SX_PAD_GPIO1_IO02__CCM_DI0_EXT_CLK                     0x001C 0x0364 0x0000 0x3 0x0
+#define MX6SX_PAD_GPIO1_IO02__WDOG1_WDOG_B                        0x001C 0x0364 0x0000 0x4 0x0
+#define MX6SX_PAD_GPIO1_IO02__GPIO1_IO_2                          0x001C 0x0364 0x0000 0x5 0x0
+#define MX6SX_PAD_GPIO1_IO02__CCM_REF_EN_B                        0x001C 0x0364 0x0000 0x6 0x0
+#define MX6SX_PAD_GPIO1_IO02__PHY_TDI                             0x001C 0x0364 0x0000 0x7 0x0
+#define MX6SX_PAD_GPIO1_IO03__I2C2_SDA                            0x0020 0x0368 0x07B4 0x0 0x1
+#define MX6SX_PAD_GPIO1_IO03__USDHC1_WP                           0x0020 0x0368 0x0868 0x1 0x1
+#define MX6SX_PAD_GPIO1_IO03__ENET1_REF_CLK_25M                   0x0020 0x0368 0x0000 0x2 0x0
+#define MX6SX_PAD_GPIO1_IO03__CCM_DI1_EXT_CLK                     0x0020 0x0368 0x0000 0x3 0x0
+#define MX6SX_PAD_GPIO1_IO03__WDOG2_WDOG_B                        0x0020 0x0368 0x0000 0x4 0x0
+#define MX6SX_PAD_GPIO1_IO03__GPIO1_IO_3                          0x0020 0x0368 0x0000 0x5 0x0
+#define MX6SX_PAD_GPIO1_IO03__CCM_PLL3_BYP                        0x0020 0x0368 0x0000 0x6 0x0
+#define MX6SX_PAD_GPIO1_IO03__PHY_TCK                             0x0020 0x0368 0x0000 0x7 0x0
+#define MX6SX_PAD_GPIO1_IO04__UART1_RX                            0x0024 0x036C 0x0830 0x0 0x0
+#define MX6SX_PAD_GPIO1_IO04__UART1_TX                            0x0024 0x036C 0x0000 0x0 0x0
+#define MX6SX_PAD_GPIO1_IO04__USDHC2_RESET_B                      0x0024 0x036C 0x0000 0x1 0x0
+#define MX6SX_PAD_GPIO1_IO04__ENET1_MDC                           0x0024 0x036C 0x0000 0x2 0x0
+#define MX6SX_PAD_GPIO1_IO04__OSC32K_32K_OUT                      0x0024 0x036C 0x0000 0x3 0x0
+#define MX6SX_PAD_GPIO1_IO04__ENET2_REF_CLK2                      0x0024 0x036C 0x076C 0x4 0x0
+#define MX6SX_PAD_GPIO1_IO04__GPIO1_IO_4                          0x0024 0x036C 0x0000 0x5 0x0
+#define MX6SX_PAD_GPIO1_IO04__CCM_PLL2_BYP                        0x0024 0x036C 0x0000 0x6 0x0
+#define MX6SX_PAD_GPIO1_IO04__PHY_TMS                             0x0024 0x036C 0x0000 0x7 0x0
+#define MX6SX_PAD_GPIO1_IO05__UART1_RX                            0x0028 0x0370 0x0830 0x0 0x1
+#define MX6SX_PAD_GPIO1_IO05__UART1_TX                            0x0028 0x0370 0x0000 0x0 0x0
+#define MX6SX_PAD_GPIO1_IO05__USDHC2_VSELECT                      0x0028 0x0370 0x0000 0x1 0x0
+#define MX6SX_PAD_GPIO1_IO05__ENET1_MDIO                          0x0028 0x0370 0x0764 0x2 0x0
+#define MX6SX_PAD_GPIO1_IO05__ASRC_ASRC_EXT_CLK                   0x0028 0x0370 0x0000 0x3 0x0
+#define MX6SX_PAD_GPIO1_IO05__ENET1_REF_CLK1                      0x0028 0x0370 0x0760 0x4 0x0
+#define MX6SX_PAD_GPIO1_IO05__GPIO1_IO_5                          0x0028 0x0370 0x0000 0x5 0x0
+#define MX6SX_PAD_GPIO1_IO05__SRC_TESTER_ACK                      0x0028 0x0370 0x0000 0x6 0x0
+#define MX6SX_PAD_GPIO1_IO05__PHY_TDO                             0x0028 0x0370 0x0000 0x7 0x0
+#define MX6SX_PAD_GPIO1_IO06__UART2_RX                            0x002C 0x0374 0x0838 0x0 0x0
+#define MX6SX_PAD_GPIO1_IO06__UART2_TX                            0x002C 0x0374 0x0000 0x0 0x0
+#define MX6SX_PAD_GPIO1_IO06__USDHC2_CD_B                         0x002C 0x0374 0x086C 0x1 0x1
+#define MX6SX_PAD_GPIO1_IO06__ENET2_MDC                           0x002C 0x0374 0x0000 0x2 0x0
+#define MX6SX_PAD_GPIO1_IO06__CSI1_MCLK                           0x002C 0x0374 0x0000 0x3 0x0
+#define MX6SX_PAD_GPIO1_IO06__UART1_RTS_B                         0x002C 0x0374 0x082C 0x4 0x0
+#define MX6SX_PAD_GPIO1_IO06__GPIO1_IO_6                          0x002C 0x0374 0x0000 0x5 0x0
+#define MX6SX_PAD_GPIO1_IO06__SRC_ANY_PU_RESET                    0x002C 0x0374 0x0000 0x6 0x0
+#define MX6SX_PAD_GPIO1_IO06__OCOTP_CTRL_WRAPPER_FUSE_LATCHED     0x002C 0x0374 0x0000 0x7 0x0
+#define MX6SX_PAD_GPIO1_IO07__UART2_RX                            0x0030 0x0378 0x0838 0x0 0x1
+#define MX6SX_PAD_GPIO1_IO07__UART2_TX                            0x0030 0x0378 0x0000 0x0 0x0
+#define MX6SX_PAD_GPIO1_IO07__USDHC2_WP                           0x0030 0x0378 0x0870 0x1 0x1
+#define MX6SX_PAD_GPIO1_IO07__ENET2_MDIO                          0x0030 0x0378 0x0770 0x2 0x0
+#define MX6SX_PAD_GPIO1_IO07__AUDMUX_MCLK                         0x0030 0x0378 0x0000 0x3 0x0
+#define MX6SX_PAD_GPIO1_IO07__UART1_CTS_B                         0x0030 0x0378 0x082C 0x4 0x1
+#define MX6SX_PAD_GPIO1_IO07__GPIO1_IO_7                          0x0030 0x0378 0x0000 0x5 0x0
+#define MX6SX_PAD_GPIO1_IO07__SRC_EARLY_RESET                     0x0030 0x0378 0x0000 0x6 0x0
+#define MX6SX_PAD_GPIO1_IO07__DCIC2_OUT                           0x0030 0x0378 0x0000 0x7 0x0
+#define MX6SX_PAD_GPIO1_IO07__VDEC_DEBUG_44                       0x0030 0x0378 0x0000 0x8 0x0
+#define MX6SX_PAD_GPIO1_IO08__USB_OTG1_OC                         0x0034 0x037C 0x0860 0x0 0x0
+#define MX6SX_PAD_GPIO1_IO08__WDOG1_WDOG_B                        0x0034 0x037C 0x0000 0x1 0x0
+#define MX6SX_PAD_GPIO1_IO08__SDMA_EXT_EVENT_0                    0x0034 0x037C 0x081C 0x2 0x0
+#define MX6SX_PAD_GPIO1_IO08__CCM_PMIC_RDY                        0x0034 0x037C 0x069C 0x3 0x1
+#define MX6SX_PAD_GPIO1_IO08__UART2_RTS_B                         0x0034 0x037C 0x0834 0x4 0x0
+#define MX6SX_PAD_GPIO1_IO08__GPIO1_IO_8                          0x0034 0x037C 0x0000 0x5 0x0
+#define MX6SX_PAD_GPIO1_IO08__SRC_SYSTEM_RESET                    0x0034 0x037C 0x0000 0x6 0x0
+#define MX6SX_PAD_GPIO1_IO08__DCIC1_OUT                           0x0034 0x037C 0x0000 0x7 0x0
+#define MX6SX_PAD_GPIO1_IO08__VDEC_DEBUG_43                       0x0034 0x037C 0x0000 0x8 0x0
+#define MX6SX_PAD_GPIO1_IO09__USB_OTG1_PWR                        0x0038 0x0380 0x0000 0x0 0x0
+#define MX6SX_PAD_GPIO1_IO09__WDOG2_WDOG_B                        0x0038 0x0380 0x0000 0x1 0x0
+#define MX6SX_PAD_GPIO1_IO09__SDMA_EXT_EVENT_1                    0x0038 0x0380 0x0820 0x2 0x0
+#define MX6SX_PAD_GPIO1_IO09__CCM_OUT0                            0x0038 0x0380 0x0000 0x3 0x0
+#define MX6SX_PAD_GPIO1_IO09__UART2_CTS_B                         0x0038 0x0380 0x0834 0x4 0x1
+#define MX6SX_PAD_GPIO1_IO09__GPIO1_IO_9                          0x0038 0x0380 0x0000 0x5 0x0
+#define MX6SX_PAD_GPIO1_IO09__SRC_INT_BOOT                        0x0038 0x0380 0x0000 0x6 0x0
+#define MX6SX_PAD_GPIO1_IO09__OBSERVE_MUX_OUT_4                   0x0038 0x0380 0x0000 0x7 0x0
+#define MX6SX_PAD_GPIO1_IO09__VDEC_DEBUG_42                       0x0038 0x0380 0x0000 0x8 0x0
+#define MX6SX_PAD_GPIO1_IO10__ANATOP_OTG1_ID                      0x003C 0x0384 0x0624 0x0 0x0
+#define MX6SX_PAD_GPIO1_IO10__SPDIF_EXT_CLK                       0x003C 0x0384 0x0828 0x1 0x0
+#define MX6SX_PAD_GPIO1_IO10__PWM1_OUT                            0x003C 0x0384 0x0000 0x2 0x0
+#define MX6SX_PAD_GPIO1_IO10__CCM_OUT1                            0x003C 0x0384 0x0000 0x3 0x0
+#define MX6SX_PAD_GPIO1_IO10__CSI1_FIELD                          0x003C 0x0384 0x070C 0x4 0x1
+#define MX6SX_PAD_GPIO1_IO10__GPIO1_IO_10                         0x003C 0x0384 0x0000 0x5 0x0
+#define MX6SX_PAD_GPIO1_IO10__CSU_CSU_INT_DEB                     0x003C 0x0384 0x0000 0x6 0x0
+#define MX6SX_PAD_GPIO1_IO10__OBSERVE_MUX_OUT_3                   0x003C 0x0384 0x0000 0x7 0x0
+#define MX6SX_PAD_GPIO1_IO10__VDEC_DEBUG_41                       0x003C 0x0384 0x0000 0x8 0x0
+#define MX6SX_PAD_GPIO1_IO11__USB_OTG2_OC                         0x0040 0x0388 0x085C 0x0 0x0
+#define MX6SX_PAD_GPIO1_IO11__SPDIF_IN                            0x0040 0x0388 0x0824 0x1 0x2
+#define MX6SX_PAD_GPIO1_IO11__PWM2_OUT                            0x0040 0x0388 0x0000 0x2 0x0
+#define MX6SX_PAD_GPIO1_IO11__CCM_CLKO1                           0x0040 0x0388 0x0000 0x3 0x0
+#define MX6SX_PAD_GPIO1_IO11__MLB_DATA                            0x0040 0x0388 0x07EC 0x4 0x0
+#define MX6SX_PAD_GPIO1_IO11__GPIO1_IO_11                         0x0040 0x0388 0x0000 0x5 0x0
+#define MX6SX_PAD_GPIO1_IO11__CSU_CSU_ALARM_AUT_0                 0x0040 0x0388 0x0000 0x6 0x0
+#define MX6SX_PAD_GPIO1_IO11__OBSERVE_MUX_OUT_2                   0x0040 0x0388 0x0000 0x7 0x0
+#define MX6SX_PAD_GPIO1_IO11__VDEC_DEBUG_40                       0x0040 0x0388 0x0000 0x8 0x0
+#define MX6SX_PAD_GPIO1_IO12__USB_OTG2_PWR                        0x0044 0x038C 0x0000 0x0 0x0
+#define MX6SX_PAD_GPIO1_IO12__SPDIF_OUT                           0x0044 0x038C 0x0000 0x1 0x0
+#define MX6SX_PAD_GPIO1_IO12__PWM3_OUT                            0x0044 0x038C 0x0000 0x2 0x0
+#define MX6SX_PAD_GPIO1_IO12__CCM_CLKO2                           0x0044 0x038C 0x0000 0x3 0x0
+#define MX6SX_PAD_GPIO1_IO12__MLB_CLK                             0x0044 0x038C 0x07E8 0x4 0x0
+#define MX6SX_PAD_GPIO1_IO12__GPIO1_IO_12                         0x0044 0x038C 0x0000 0x5 0x0
+#define MX6SX_PAD_GPIO1_IO12__CSU_CSU_ALARM_AUT_1                 0x0044 0x038C 0x0000 0x6 0x0
+#define MX6SX_PAD_GPIO1_IO12__OBSERVE_MUX_OUT_1                   0x0044 0x038C 0x0000 0x7 0x0
+#define MX6SX_PAD_GPIO1_IO12__VDEC_DEBUG_39                       0x0044 0x038C 0x0000 0x8 0x0
+#define MX6SX_PAD_GPIO1_IO13__WDOG1_WDOG_ANY                      0x0048 0x0390 0x0000 0x0 0x0
+#define MX6SX_PAD_GPIO1_IO13__ANATOP_OTG2_ID                      0x0048 0x0390 0x0628 0x1 0x0
+#define MX6SX_PAD_GPIO1_IO13__PWM4_OUT                            0x0048 0x0390 0x0000 0x2 0x0
+#define MX6SX_PAD_GPIO1_IO13__CCM_OUT2                            0x0048 0x0390 0x0000 0x3 0x0
+#define MX6SX_PAD_GPIO1_IO13__MLB_SIG                             0x0048 0x0390 0x07F0 0x4 0x0
+#define MX6SX_PAD_GPIO1_IO13__GPIO1_IO_13                         0x0048 0x0390 0x0000 0x5 0x0
+#define MX6SX_PAD_GPIO1_IO13__CSU_CSU_ALARM_AUT_2                 0x0048 0x0390 0x0000 0x6 0x0
+#define MX6SX_PAD_GPIO1_IO13__OBSERVE_MUX_OUT_0                   0x0048 0x0390 0x0000 0x7 0x0
+#define MX6SX_PAD_GPIO1_IO13__VDEC_DEBUG_38                       0x0048 0x0390 0x0000 0x8 0x0
+#define MX6SX_PAD_CSI_DATA00__CSI1_DATA_2                         0x004C 0x0394 0x06A8 0x0 0x0
+#define MX6SX_PAD_CSI_DATA00__ESAI_TX_CLK                         0x004C 0x0394 0x078C 0x1 0x1
+#define MX6SX_PAD_CSI_DATA00__AUDMUX_AUD6_TXC                     0x004C 0x0394 0x0684 0x2 0x1
+#define MX6SX_PAD_CSI_DATA00__I2C1_SCL                            0x004C 0x0394 0x07A8 0x3 0x0
+#define MX6SX_PAD_CSI_DATA00__UART6_RI_B                          0x004C 0x0394 0x0000 0x4 0x0
+#define MX6SX_PAD_CSI_DATA00__GPIO1_IO_14                         0x004C 0x0394 0x0000 0x5 0x0
+#define MX6SX_PAD_CSI_DATA00__WEIM_DATA_23                        0x004C 0x0394 0x0000 0x6 0x0
+#define MX6SX_PAD_CSI_DATA00__SAI1_TX_BCLK                        0x004C 0x0394 0x0800 0x7 0x0
+#define MX6SX_PAD_CSI_DATA00__VADC_DATA_4                         0x004C 0x0394 0x0000 0x8 0x0
+#define MX6SX_PAD_CSI_DATA00__MMDC_DEBUG_37                       0x004C 0x0394 0x0000 0x9 0x0
+#define MX6SX_PAD_CSI_DATA01__CSI1_DATA_3                         0x0050 0x0398 0x06AC 0x0 0x0
+#define MX6SX_PAD_CSI_DATA01__ESAI_TX_FS                          0x0050 0x0398 0x077C 0x1 0x1
+#define MX6SX_PAD_CSI_DATA01__AUDMUX_AUD6_TXFS                    0x0050 0x0398 0x0688 0x2 0x1
+#define MX6SX_PAD_CSI_DATA01__I2C1_SDA                            0x0050 0x0398 0x07AC 0x3 0x0
+#define MX6SX_PAD_CSI_DATA01__UART6_DSR_B                         0x0050 0x0398 0x0000 0x4 0x0
+#define MX6SX_PAD_CSI_DATA01__GPIO1_IO_15                         0x0050 0x0398 0x0000 0x5 0x0
+#define MX6SX_PAD_CSI_DATA01__WEIM_DATA_22                        0x0050 0x0398 0x0000 0x6 0x0
+#define MX6SX_PAD_CSI_DATA01__SAI1_TX_SYNC                        0x0050 0x0398 0x0804 0x7 0x0
+#define MX6SX_PAD_CSI_DATA01__VADC_DATA_5                         0x0050 0x0398 0x0000 0x8 0x0
+#define MX6SX_PAD_CSI_DATA01__MMDC_DEBUG_38                       0x0050 0x0398 0x0000 0x9 0x0
+#define MX6SX_PAD_CSI_DATA02__CSI1_DATA_4                         0x0054 0x039C 0x06B0 0x0 0x0
+#define MX6SX_PAD_CSI_DATA02__ESAI_RX_CLK                         0x0054 0x039C 0x0788 0x1 0x1
+#define MX6SX_PAD_CSI_DATA02__AUDMUX_AUD6_RXC                     0x0054 0x039C 0x067C 0x2 0x1
+#define MX6SX_PAD_CSI_DATA02__KPP_COL_5                           0x0054 0x039C 0x07C8 0x3 0x0
+#define MX6SX_PAD_CSI_DATA02__UART6_DTR_B                         0x0054 0x039C 0x0000 0x4 0x0
+#define MX6SX_PAD_CSI_DATA02__GPIO1_IO_16                         0x0054 0x039C 0x0000 0x5 0x0
+#define MX6SX_PAD_CSI_DATA02__WEIM_DATA_21                        0x0054 0x039C 0x0000 0x6 0x0
+#define MX6SX_PAD_CSI_DATA02__SAI1_RX_BCLK                        0x0054 0x039C 0x07F4 0x7 0x0
+#define MX6SX_PAD_CSI_DATA02__VADC_DATA_6                         0x0054 0x039C 0x0000 0x8 0x0
+#define MX6SX_PAD_CSI_DATA02__MMDC_DEBUG_39                       0x0054 0x039C 0x0000 0x9 0x0
+#define MX6SX_PAD_CSI_DATA03__CSI1_DATA_5                         0x0058 0x03A0 0x06B4 0x0 0x0
+#define MX6SX_PAD_CSI_DATA03__ESAI_RX_FS                          0x0058 0x03A0 0x0778 0x1 0x1
+#define MX6SX_PAD_CSI_DATA03__AUDMUX_AUD6_RXFS                    0x0058 0x03A0 0x0680 0x2 0x1
+#define MX6SX_PAD_CSI_DATA03__KPP_ROW_5                           0x0058 0x03A0 0x07D4 0x3 0x0
+#define MX6SX_PAD_CSI_DATA03__UART6_DCD_B                         0x0058 0x03A0 0x0000 0x4 0x0
+#define MX6SX_PAD_CSI_DATA03__GPIO1_IO_17                         0x0058 0x03A0 0x0000 0x5 0x0
+#define MX6SX_PAD_CSI_DATA03__WEIM_DATA_20                        0x0058 0x03A0 0x0000 0x6 0x0
+#define MX6SX_PAD_CSI_DATA03__SAI1_RX_SYNC                        0x0058 0x03A0 0x07FC 0x7 0x0
+#define MX6SX_PAD_CSI_DATA03__VADC_DATA_7                         0x0058 0x03A0 0x0000 0x8 0x0
+#define MX6SX_PAD_CSI_DATA03__MMDC_DEBUG_40                       0x0058 0x03A0 0x0000 0x9 0x0
+#define MX6SX_PAD_CSI_DATA04__CSI1_DATA_6                         0x005C 0x03A4 0x06B8 0x0 0x0
+#define MX6SX_PAD_CSI_DATA04__ESAI_TX1                            0x005C 0x03A4 0x0794 0x1 0x1
+#define MX6SX_PAD_CSI_DATA04__SPDIF_OUT                           0x005C 0x03A4 0x0000 0x2 0x0
+#define MX6SX_PAD_CSI_DATA04__KPP_COL_6                           0x005C 0x03A4 0x07CC 0x3 0x0
+#define MX6SX_PAD_CSI_DATA04__UART6_RX                            0x005C 0x03A4 0x0858 0x4 0x0
+#define MX6SX_PAD_CSI_DATA04__UART6_TX                            0x005C 0x03A4 0x0000 0x4 0x0
+#define MX6SX_PAD_CSI_DATA04__GPIO1_IO_18                         0x005C 0x03A4 0x0000 0x5 0x0
+#define MX6SX_PAD_CSI_DATA04__WEIM_DATA_19                        0x005C 0x03A4 0x0000 0x6 0x0
+#define MX6SX_PAD_CSI_DATA04__PWM5_OUT                            0x005C 0x03A4 0x0000 0x7 0x0
+#define MX6SX_PAD_CSI_DATA04__VADC_DATA_8                         0x005C 0x03A4 0x0000 0x8 0x0
+#define MX6SX_PAD_CSI_DATA04__MMDC_DEBUG_41                       0x005C 0x03A4 0x0000 0x9 0x0
+#define MX6SX_PAD_CSI_DATA05__CSI1_DATA_7                         0x0060 0x03A8 0x06BC 0x0 0x0
+#define MX6SX_PAD_CSI_DATA05__ESAI_TX4_RX1                        0x0060 0x03A8 0x07A0 0x1 0x1
+#define MX6SX_PAD_CSI_DATA05__SPDIF_IN                            0x0060 0x03A8 0x0824 0x2 0x1
+#define MX6SX_PAD_CSI_DATA05__KPP_ROW_6                           0x0060 0x03A8 0x07D8 0x3 0x0
+#define MX6SX_PAD_CSI_DATA05__UART6_RX                            0x0060 0x03A8 0x0858 0x4 0x1
+#define MX6SX_PAD_CSI_DATA05__UART6_TX                            0x0060 0x03A8 0x0000 0x4 0x0
+#define MX6SX_PAD_CSI_DATA05__GPIO1_IO_19                         0x0060 0x03A8 0x0000 0x5 0x0
+#define MX6SX_PAD_CSI_DATA05__WEIM_DATA_18                        0x0060 0x03A8 0x0000 0x6 0x0
+#define MX6SX_PAD_CSI_DATA05__PWM6_OUT                            0x0060 0x03A8 0x0000 0x7 0x0
+#define MX6SX_PAD_CSI_DATA05__VADC_DATA_9                         0x0060 0x03A8 0x0000 0x8 0x0
+#define MX6SX_PAD_CSI_DATA05__MMDC_DEBUG_42                       0x0060 0x03A8 0x0000 0x9 0x0
+#define MX6SX_PAD_CSI_DATA06__CSI1_DATA_8                         0x0064 0x03AC 0x06C0 0x0 0x0
+#define MX6SX_PAD_CSI_DATA06__ESAI_TX2_RX3                        0x0064 0x03AC 0x0798 0x1 0x1
+#define MX6SX_PAD_CSI_DATA06__I2C4_SCL                            0x0064 0x03AC 0x07C0 0x2 0x2
+#define MX6SX_PAD_CSI_DATA06__KPP_COL_7                           0x0064 0x03AC 0x07D0 0x3 0x0
+#define MX6SX_PAD_CSI_DATA06__UART6_RTS_B                         0x0064 0x03AC 0x0854 0x4 0x0
+#define MX6SX_PAD_CSI_DATA06__GPIO1_IO_20                         0x0064 0x03AC 0x0000 0x5 0x0
+#define MX6SX_PAD_CSI_DATA06__WEIM_DATA_17                        0x0064 0x03AC 0x0000 0x6 0x0
+#define MX6SX_PAD_CSI_DATA06__DCIC2_OUT                           0x0064 0x03AC 0x0000 0x7 0x0
+#define MX6SX_PAD_CSI_DATA06__VADC_DATA_10                        0x0064 0x03AC 0x0000 0x8 0x0
+#define MX6SX_PAD_CSI_DATA06__MMDC_DEBUG_43                       0x0064 0x03AC 0x0000 0x9 0x0
+#define MX6SX_PAD_CSI_DATA07__CSI1_DATA_9                         0x0068 0x03B0 0x06C4 0x0 0x0
+#define MX6SX_PAD_CSI_DATA07__ESAI_TX3_RX2                        0x0068 0x03B0 0x079C 0x1 0x1
+#define MX6SX_PAD_CSI_DATA07__I2C4_SDA                            0x0068 0x03B0 0x07C4 0x2 0x2
+#define MX6SX_PAD_CSI_DATA07__KPP_ROW_7                           0x0068 0x03B0 0x07DC 0x3 0x0
+#define MX6SX_PAD_CSI_DATA07__UART6_CTS_B                         0x0068 0x03B0 0x0854 0x4 0x1
+#define MX6SX_PAD_CSI_DATA07__GPIO1_IO_21                         0x0068 0x03B0 0x0000 0x5 0x0
+#define MX6SX_PAD_CSI_DATA07__WEIM_DATA_16                        0x0068 0x03B0 0x0000 0x6 0x0
+#define MX6SX_PAD_CSI_DATA07__DCIC1_OUT                           0x0068 0x03B0 0x0000 0x7 0x0
+#define MX6SX_PAD_CSI_DATA07__VADC_DATA_11                        0x0068 0x03B0 0x0000 0x8 0x0
+#define MX6SX_PAD_CSI_DATA07__MMDC_DEBUG_44                       0x0068 0x03B0 0x0000 0x9 0x0
+#define MX6SX_PAD_CSI_HSYNC__CSI1_HSYNC                           0x006C 0x03B4 0x0700 0x0 0x0
+#define MX6SX_PAD_CSI_HSYNC__ESAI_TX0                             0x006C 0x03B4 0x0790 0x1 0x1
+#define MX6SX_PAD_CSI_HSYNC__AUDMUX_AUD6_TXD                      0x006C 0x03B4 0x0678 0x2 0x1
+#define MX6SX_PAD_CSI_HSYNC__UART4_RTS_B                          0x006C 0x03B4 0x0844 0x3 0x2
+#define MX6SX_PAD_CSI_HSYNC__MQS_LEFT                             0x006C 0x03B4 0x0000 0x4 0x0
+#define MX6SX_PAD_CSI_HSYNC__GPIO1_IO_22                          0x006C 0x03B4 0x0000 0x5 0x0
+#define MX6SX_PAD_CSI_HSYNC__WEIM_DATA_25                         0x006C 0x03B4 0x0000 0x6 0x0
+#define MX6SX_PAD_CSI_HSYNC__SAI1_TX_DATA_0                       0x006C 0x03B4 0x0000 0x7 0x0
+#define MX6SX_PAD_CSI_HSYNC__VADC_DATA_2                          0x006C 0x03B4 0x0000 0x8 0x0
+#define MX6SX_PAD_CSI_HSYNC__MMDC_DEBUG_35                        0x006C 0x03B4 0x0000 0x9 0x0
+#define MX6SX_PAD_CSI_MCLK__CSI1_MCLK                             0x0070 0x03B8 0x0000 0x0 0x0
+#define MX6SX_PAD_CSI_MCLK__ESAI_TX_HF_CLK                        0x0070 0x03B8 0x0784 0x1 0x1
+#define MX6SX_PAD_CSI_MCLK__OSC32K_32K_OUT                        0x0070 0x03B8 0x0000 0x2 0x0
+#define MX6SX_PAD_CSI_MCLK__UART4_RX                              0x0070 0x03B8 0x0848 0x3 0x2
+#define MX6SX_PAD_CSI_MCLK__UART4_TX                              0x0070 0x03B8 0x0000 0x3 0x0
+#define MX6SX_PAD_CSI_MCLK__ANATOP_32K_OUT                        0x0070 0x03B8 0x0000 0x4 0x0
+#define MX6SX_PAD_CSI_MCLK__GPIO1_IO_23                           0x0070 0x03B8 0x0000 0x5 0x0
+#define MX6SX_PAD_CSI_MCLK__WEIM_DATA_26                          0x0070 0x03B8 0x0000 0x6 0x0
+#define MX6SX_PAD_CSI_MCLK__CSI1_FIELD                            0x0070 0x03B8 0x070C 0x7 0x0
+#define MX6SX_PAD_CSI_MCLK__VADC_DATA_1                           0x0070 0x03B8 0x0000 0x8 0x0
+#define MX6SX_PAD_CSI_MCLK__MMDC_DEBUG_34                         0x0070 0x03B8 0x0000 0x9 0x0
+#define MX6SX_PAD_CSI_PIXCLK__CSI1_PIXCLK                         0x0074 0x03BC 0x0704 0x0 0x0
+#define MX6SX_PAD_CSI_PIXCLK__ESAI_RX_HF_CLK                      0x0074 0x03BC 0x0780 0x1 0x1
+#define MX6SX_PAD_CSI_PIXCLK__AUDMUX_MCLK                         0x0074 0x03BC 0x0000 0x2 0x0
+#define MX6SX_PAD_CSI_PIXCLK__UART4_RX                            0x0074 0x03BC 0x0848 0x3 0x3
+#define MX6SX_PAD_CSI_PIXCLK__UART4_TX                            0x0074 0x03BC 0x0000 0x3 0x0
+#define MX6SX_PAD_CSI_PIXCLK__ANATOP_24M_OUT                      0x0074 0x03BC 0x0000 0x4 0x0
+#define MX6SX_PAD_CSI_PIXCLK__GPIO1_IO_24                         0x0074 0x03BC 0x0000 0x5 0x0
+#define MX6SX_PAD_CSI_PIXCLK__WEIM_DATA_27                        0x0074 0x03BC 0x0000 0x6 0x0
+#define MX6SX_PAD_CSI_PIXCLK__ESAI_TX_HF_CLK                      0x0074 0x03BC 0x0784 0x7 0x2
+#define MX6SX_PAD_CSI_PIXCLK__VADC_CLK                            0x0074 0x03BC 0x0000 0x8 0x0
+#define MX6SX_PAD_CSI_PIXCLK__MMDC_DEBUG_33                       0x0074 0x03BC 0x0000 0x9 0x0
+#define MX6SX_PAD_CSI_VSYNC__CSI1_VSYNC                           0x0078 0x03C0 0x0708 0x0 0x0
+#define MX6SX_PAD_CSI_VSYNC__ESAI_TX5_RX0                         0x0078 0x03C0 0x07A4 0x1 0x1
+#define MX6SX_PAD_CSI_VSYNC__AUDMUX_AUD6_RXD                      0x0078 0x03C0 0x0674 0x2 0x1
+#define MX6SX_PAD_CSI_VSYNC__UART4_CTS_B                          0x0078 0x03C0 0x0844 0x3 0x3
+#define MX6SX_PAD_CSI_VSYNC__MQS_RIGHT                            0x0078 0x03C0 0x0000 0x4 0x0
+#define MX6SX_PAD_CSI_VSYNC__GPIO1_IO_25                          0x0078 0x03C0 0x0000 0x5 0x0
+#define MX6SX_PAD_CSI_VSYNC__WEIM_DATA_24                         0x0078 0x03C0 0x0000 0x6 0x0
+#define MX6SX_PAD_CSI_VSYNC__SAI1_RX_DATA_0                       0x0078 0x03C0 0x07F8 0x7 0x0
+#define MX6SX_PAD_CSI_VSYNC__VADC_DATA_3                          0x0078 0x03C0 0x0000 0x8 0x0
+#define MX6SX_PAD_CSI_VSYNC__MMDC_DEBUG_36                        0x0078 0x03C0 0x0000 0x9 0x0
+#define MX6SX_PAD_ENET1_COL__ENET1_COL                            0x007C 0x03C4 0x0000 0x0 0x0
+#define MX6SX_PAD_ENET1_COL__ENET2_MDC                            0x007C 0x03C4 0x0000 0x1 0x0
+#define MX6SX_PAD_ENET1_COL__AUDMUX_AUD4_TXC                      0x007C 0x03C4 0x0654 0x2 0x1
+#define MX6SX_PAD_ENET1_COL__UART1_RI_B                           0x007C 0x03C4 0x0000 0x3 0x0
+#define MX6SX_PAD_ENET1_COL__SPDIF_EXT_CLK                        0x007C 0x03C4 0x0828 0x4 0x1
+#define MX6SX_PAD_ENET1_COL__GPIO2_IO_0                           0x007C 0x03C4 0x0000 0x5 0x0
+#define MX6SX_PAD_ENET1_COL__CSI2_DATA_23                         0x007C 0x03C4 0x0000 0x6 0x0
+#define MX6SX_PAD_ENET1_COL__LCDIF2_DATA_16                       0x007C 0x03C4 0x0000 0x7 0x0
+#define MX6SX_PAD_ENET1_COL__VDEC_DEBUG_37                        0x007C 0x03C4 0x0000 0x8 0x0
+#define MX6SX_PAD_ENET1_COL__PCIE_CTRL_DEBUG_31                   0x007C 0x03C4 0x0000 0x9 0x0
+#define MX6SX_PAD_ENET1_CRS__ENET1_CRS                            0x0080 0x03C8 0x0000 0x0 0x0
+#define MX6SX_PAD_ENET1_CRS__ENET2_MDIO                           0x0080 0x03C8 0x0770 0x1 0x1
+#define MX6SX_PAD_ENET1_CRS__AUDMUX_AUD4_TXD                      0x0080 0x03C8 0x0648 0x2 0x1
+#define MX6SX_PAD_ENET1_CRS__UART1_DCD_B                          0x0080 0x03C8 0x0000 0x3 0x0
+#define MX6SX_PAD_ENET1_CRS__SPDIF_LOCK                           0x0080 0x03C8 0x0000 0x4 0x0
+#define MX6SX_PAD_ENET1_CRS__GPIO2_IO_1                           0x0080 0x03C8 0x0000 0x5 0x0
+#define MX6SX_PAD_ENET1_CRS__CSI2_DATA_22                         0x0080 0x03C8 0x0000 0x6 0x0
+#define MX6SX_PAD_ENET1_CRS__LCDIF2_DATA_17                       0x0080 0x03C8 0x0000 0x7 0x0
+#define MX6SX_PAD_ENET1_CRS__VDEC_DEBUG_36                        0x0080 0x03C8 0x0000 0x8 0x0
+#define MX6SX_PAD_ENET1_CRS__PCIE_CTRL_DEBUG_30                   0x0080 0x03C8 0x0000 0x9 0x0
+#define MX6SX_PAD_ENET1_MDC__ENET1_MDC                            0x0084 0x03CC 0x0000 0x0 0x0
+#define MX6SX_PAD_ENET1_MDC__ENET2_MDC                            0x0084 0x03CC 0x0000 0x1 0x0
+#define MX6SX_PAD_ENET1_MDC__AUDMUX_AUD3_RXFS                     0x0084 0x03CC 0x0638 0x2 0x1
+#define MX6SX_PAD_ENET1_MDC__ANATOP_24M_OUT                       0x0084 0x03CC 0x0000 0x3 0x0
+#define MX6SX_PAD_ENET1_MDC__EPIT2_OUT                            0x0084 0x03CC 0x0000 0x4 0x0
+#define MX6SX_PAD_ENET1_MDC__GPIO2_IO_2                           0x0084 0x03CC 0x0000 0x5 0x0
+#define MX6SX_PAD_ENET1_MDC__USB_OTG1_PWR                         0x0084 0x03CC 0x0000 0x6 0x0
+#define MX6SX_PAD_ENET1_MDC__PWM7_OUT                             0x0084 0x03CC 0x0000 0x7 0x0
+#define MX6SX_PAD_ENET1_MDIO__ENET1_MDIO                          0x0088 0x03D0 0x0764 0x0 0x1
+#define MX6SX_PAD_ENET1_MDIO__ENET2_MDIO                          0x0088 0x03D0 0x0770 0x1 0x2
+#define MX6SX_PAD_ENET1_MDIO__AUDMUX_MCLK                         0x0088 0x03D0 0x0000 0x2 0x0
+#define MX6SX_PAD_ENET1_MDIO__OSC32K_32K_OUT                      0x0088 0x03D0 0x0000 0x3 0x0
+#define MX6SX_PAD_ENET1_MDIO__EPIT1_OUT                           0x0088 0x03D0 0x0000 0x4 0x0
+#define MX6SX_PAD_ENET1_MDIO__GPIO2_IO_3                          0x0088 0x03D0 0x0000 0x5 0x0
+#define MX6SX_PAD_ENET1_MDIO__USB_OTG1_OC                         0x0088 0x03D0 0x0860 0x6 0x1
+#define MX6SX_PAD_ENET1_MDIO__PWM8_OUT                            0x0088 0x03D0 0x0000 0x7 0x0
+#define MX6SX_PAD_ENET1_RX_CLK__ENET1_RX_CLK                      0x008C 0x03D4 0x0768 0x0 0x0
+#define MX6SX_PAD_ENET1_RX_CLK__ENET1_REF_CLK_25M                 0x008C 0x03D4 0x0000 0x1 0x0
+#define MX6SX_PAD_ENET1_RX_CLK__AUDMUX_AUD4_TXFS                  0x008C 0x03D4 0x0658 0x2 0x1
+#define MX6SX_PAD_ENET1_RX_CLK__UART1_DSR_B                       0x008C 0x03D4 0x0000 0x3 0x0
+#define MX6SX_PAD_ENET1_RX_CLK__SPDIF_OUT                         0x008C 0x03D4 0x0000 0x4 0x0
+#define MX6SX_PAD_ENET1_RX_CLK__GPIO2_IO_4                        0x008C 0x03D4 0x0000 0x5 0x0
+#define MX6SX_PAD_ENET1_RX_CLK__CSI2_DATA_21                      0x008C 0x03D4 0x0000 0x6 0x0
+#define MX6SX_PAD_ENET1_RX_CLK__LCDIF2_DATA_18                    0x008C 0x03D4 0x0000 0x7 0x0
+#define MX6SX_PAD_ENET1_RX_CLK__VDEC_DEBUG_35                     0x008C 0x03D4 0x0000 0x8 0x0
+#define MX6SX_PAD_ENET1_RX_CLK__PCIE_CTRL_DEBUG_29                0x008C 0x03D4 0x0000 0x9 0x0
+#define MX6SX_PAD_ENET1_TX_CLK__ENET1_TX_CLK                      0x0090 0x03D8 0x0000 0x0 0x0
+#define MX6SX_PAD_ENET1_TX_CLK__ENET1_REF_CLK1                    0x0090 0x03D8 0x0760 0x1 0x1
+#define MX6SX_PAD_ENET1_TX_CLK__AUDMUX_AUD4_RXD                   0x0090 0x03D8 0x0644 0x2 0x1
+#define MX6SX_PAD_ENET1_TX_CLK__UART1_DTR_B                       0x0090 0x03D8 0x0000 0x3 0x0
+#define MX6SX_PAD_ENET1_TX_CLK__SPDIF_SR_CLK                      0x0090 0x03D8 0x0000 0x4 0x0
+#define MX6SX_PAD_ENET1_TX_CLK__GPIO2_IO_5                        0x0090 0x03D8 0x0000 0x5 0x0
+#define MX6SX_PAD_ENET1_TX_CLK__CSI2_DATA_20                      0x0090 0x03D8 0x0000 0x6 0x0
+#define MX6SX_PAD_ENET1_TX_CLK__LCDIF2_DATA_19                    0x0090 0x03D8 0x0000 0x7 0x0
+#define MX6SX_PAD_ENET1_TX_CLK__VDEC_DEBUG_34                     0x0090 0x03D8 0x0000 0x8 0x0
+#define MX6SX_PAD_ENET1_TX_CLK__PCIE_CTRL_DEBUG_28                0x0090 0x03D8 0x0000 0x9 0x0
+#define MX6SX_PAD_ENET2_COL__ENET2_COL                            0x0094 0x03DC 0x0000 0x0 0x0
+#define MX6SX_PAD_ENET2_COL__ENET1_MDC                            0x0094 0x03DC 0x0000 0x1 0x0
+#define MX6SX_PAD_ENET2_COL__AUDMUX_AUD4_RXC                      0x0094 0x03DC 0x064C 0x2 0x1
+#define MX6SX_PAD_ENET2_COL__UART1_RX                             0x0094 0x03DC 0x0830 0x3 0x2
+#define MX6SX_PAD_ENET2_COL__UART1_TX                             0x0094 0x03DC 0x0000 0x3 0x0
+#define MX6SX_PAD_ENET2_COL__SPDIF_IN                             0x0094 0x03DC 0x0824 0x4 0x3
+#define MX6SX_PAD_ENET2_COL__GPIO2_IO_6                           0x0094 0x03DC 0x0000 0x5 0x0
+#define MX6SX_PAD_ENET2_COL__ANATOP_OTG1_ID                       0x0094 0x03DC 0x0624 0x6 0x1
+#define MX6SX_PAD_ENET2_COL__LCDIF2_DATA_20                       0x0094 0x03DC 0x0000 0x7 0x0
+#define MX6SX_PAD_ENET2_COL__VDEC_DEBUG_33                        0x0094 0x03DC 0x0000 0x8 0x0
+#define MX6SX_PAD_ENET2_COL__PCIE_CTRL_DEBUG_27                   0x0094 0x03DC 0x0000 0x9 0x0
+#define MX6SX_PAD_ENET2_CRS__ENET2_CRS                            0x0098 0x03E0 0x0000 0x0 0x0
+#define MX6SX_PAD_ENET2_CRS__ENET1_MDIO                           0x0098 0x03E0 0x0764 0x1 0x2
+#define MX6SX_PAD_ENET2_CRS__AUDMUX_AUD4_RXFS                     0x0098 0x03E0 0x0650 0x2 0x1
+#define MX6SX_PAD_ENET2_CRS__UART1_RX                             0x0098 0x03E0 0x0830 0x3 0x3
+#define MX6SX_PAD_ENET2_CRS__UART1_TX                             0x0098 0x03E0 0x0000 0x3 0x0
+#define MX6SX_PAD_ENET2_CRS__MLB_SIG                              0x0098 0x03E0 0x07F0 0x4 0x1
+#define MX6SX_PAD_ENET2_CRS__GPIO2_IO_7                           0x0098 0x03E0 0x0000 0x5 0x0
+#define MX6SX_PAD_ENET2_CRS__ANATOP_OTG2_ID                       0x0098 0x03E0 0x0628 0x6 0x1
+#define MX6SX_PAD_ENET2_CRS__LCDIF2_DATA_21                       0x0098 0x03E0 0x0000 0x7 0x0
+#define MX6SX_PAD_ENET2_CRS__VDEC_DEBUG_32                        0x0098 0x03E0 0x0000 0x8 0x0
+#define MX6SX_PAD_ENET2_CRS__PCIE_CTRL_DEBUG_26                   0x0098 0x03E0 0x0000 0x9 0x0
+#define MX6SX_PAD_ENET2_RX_CLK__ENET2_RX_CLK                      0x009C 0x03E4 0x0774 0x0 0x0
+#define MX6SX_PAD_ENET2_RX_CLK__ENET2_REF_CLK_25M                 0x009C 0x03E4 0x0000 0x1 0x0
+#define MX6SX_PAD_ENET2_RX_CLK__I2C3_SCL                          0x009C 0x03E4 0x07B8 0x2 0x1
+#define MX6SX_PAD_ENET2_RX_CLK__UART1_RTS_B                       0x009C 0x03E4 0x082C 0x3 0x2
+#define MX6SX_PAD_ENET2_RX_CLK__MLB_DATA                          0x009C 0x03E4 0x07EC 0x4 0x1
+#define MX6SX_PAD_ENET2_RX_CLK__GPIO2_IO_8                        0x009C 0x03E4 0x0000 0x5 0x0
+#define MX6SX_PAD_ENET2_RX_CLK__USB_OTG2_OC                       0x009C 0x03E4 0x085C 0x6 0x1
+#define MX6SX_PAD_ENET2_RX_CLK__LCDIF2_DATA_22                    0x009C 0x03E4 0x0000 0x7 0x0
+#define MX6SX_PAD_ENET2_RX_CLK__VDEC_DEBUG_31                     0x009C 0x03E4 0x0000 0x8 0x0
+#define MX6SX_PAD_ENET2_RX_CLK__PCIE_CTRL_DEBUG_25                0x009C 0x03E4 0x0000 0x9 0x0
+#define MX6SX_PAD_ENET2_TX_CLK__ENET2_TX_CLK                      0x00A0 0x03E8 0x0000 0x0 0x0
+#define MX6SX_PAD_ENET2_TX_CLK__ENET2_REF_CLK2                    0x00A0 0x03E8 0x076C 0x1 0x1
+#define MX6SX_PAD_ENET2_TX_CLK__I2C3_SDA                          0x00A0 0x03E8 0x07BC 0x2 0x1
+#define MX6SX_PAD_ENET2_TX_CLK__UART1_CTS_B                       0x00A0 0x03E8 0x082C 0x3 0x3
+#define MX6SX_PAD_ENET2_TX_CLK__MLB_CLK                           0x00A0 0x03E8 0x07E8 0x4 0x1
+#define MX6SX_PAD_ENET2_TX_CLK__GPIO2_IO_9                        0x00A0 0x03E8 0x0000 0x5 0x0
+#define MX6SX_PAD_ENET2_TX_CLK__USB_OTG2_PWR                      0x00A0 0x03E8 0x0000 0x6 0x0
+#define MX6SX_PAD_ENET2_TX_CLK__LCDIF2_DATA_23                    0x00A0 0x03E8 0x0000 0x7 0x0
+#define MX6SX_PAD_ENET2_TX_CLK__VDEC_DEBUG_30                     0x00A0 0x03E8 0x0000 0x8 0x0
+#define MX6SX_PAD_ENET2_TX_CLK__PCIE_CTRL_DEBUG_24                0x00A0 0x03E8 0x0000 0x9 0x0
+#define MX6SX_PAD_KEY_COL0__KPP_COL_0                             0x00A4 0x03EC 0x0000 0x0 0x0
+#define MX6SX_PAD_KEY_COL0__USDHC3_CD_B                           0x00A4 0x03EC 0x0000 0x1 0x0
+#define MX6SX_PAD_KEY_COL0__UART6_RTS_B                           0x00A4 0x03EC 0x0854 0x2 0x2
+#define MX6SX_PAD_KEY_COL0__ECSPI1_SCLK                           0x00A4 0x03EC 0x0710 0x3 0x0
+#define MX6SX_PAD_KEY_COL0__AUDMUX_AUD5_TXC                       0x00A4 0x03EC 0x066C 0x4 0x0
+#define MX6SX_PAD_KEY_COL0__GPIO2_IO_10                           0x00A4 0x03EC 0x0000 0x5 0x0
+#define MX6SX_PAD_KEY_COL0__SDMA_EXT_EVENT_1                      0x00A4 0x03EC 0x0820 0x6 0x1
+#define MX6SX_PAD_KEY_COL0__SAI2_TX_BCLK                          0x00A4 0x03EC 0x0814 0x7 0x0
+#define MX6SX_PAD_KEY_COL0__VADC_DATA_0                           0x00A4 0x03EC 0x0000 0x8 0x0
+#define MX6SX_PAD_KEY_COL1__KPP_COL_1                             0x00A8 0x03F0 0x0000 0x0 0x0
+#define MX6SX_PAD_KEY_COL1__USDHC3_RESET_B                        0x00A8 0x03F0 0x0000 0x1 0x0
+#define MX6SX_PAD_KEY_COL1__UART6_RX                              0x00A8 0x03F0 0x0858 0x2 0x2
+#define MX6SX_PAD_KEY_COL1__UART6_TX                              0x00A8 0x03F0 0x0000 0x2 0x0
+#define MX6SX_PAD_KEY_COL1__ECSPI1_MISO                           0x00A8 0x03F0 0x0714 0x3 0x0
+#define MX6SX_PAD_KEY_COL1__AUDMUX_AUD5_TXFS                      0x00A8 0x03F0 0x0670 0x4 0x0
+#define MX6SX_PAD_KEY_COL1__GPIO2_IO_11                           0x00A8 0x03F0 0x0000 0x5 0x0
+#define MX6SX_PAD_KEY_COL1__USDHC3_RESET                          0x00A8 0x03F0 0x0000 0x6 0x0
+#define MX6SX_PAD_KEY_COL1__SAI2_TX_SYNC                          0x00A8 0x03F0 0x0818 0x7 0x0
+#define MX6SX_PAD_KEY_COL2__KPP_COL_2                             0x00AC 0x03F4 0x0000 0x0 0x0
+#define MX6SX_PAD_KEY_COL2__USDHC4_CD_B                           0x00AC 0x03F4 0x0874 0x1 0x1
+#define MX6SX_PAD_KEY_COL2__UART5_RTS_B                           0x00AC 0x03F4 0x084C 0x2 0x2
+#define MX6SX_PAD_KEY_COL2__CAN1_TX                               0x00AC 0x03F4 0x0000 0x3 0x0
+#define MX6SX_PAD_KEY_COL2__CANFD_TX1                             0x00AC 0x03F4 0x0000 0x4 0x0
+#define MX6SX_PAD_KEY_COL2__GPIO2_IO_12                           0x00AC 0x03F4 0x0000 0x5 0x0
+#define MX6SX_PAD_KEY_COL2__WEIM_DATA_30                          0x00AC 0x03F4 0x0000 0x6 0x0
+#define MX6SX_PAD_KEY_COL2__ECSPI1_RDY                            0x00AC 0x03F4 0x0000 0x7 0x0
+#define MX6SX_PAD_KEY_COL3__KPP_COL_3                             0x00B0 0x03F8 0x0000 0x0 0x0
+#define MX6SX_PAD_KEY_COL3__USDHC4_LCTL                           0x00B0 0x03F8 0x0000 0x1 0x0
+#define MX6SX_PAD_KEY_COL3__UART5_RX                              0x00B0 0x03F8 0x0850 0x2 0x2
+#define MX6SX_PAD_KEY_COL3__UART5_TX                              0x00B0 0x03F8 0x0000 0x2 0x0
+#define MX6SX_PAD_KEY_COL3__CAN2_TX                               0x00B0 0x03F8 0x0000 0x3 0x0
+#define MX6SX_PAD_KEY_COL3__CANFD_TX2                             0x00B0 0x03F8 0x0000 0x4 0x0
+#define MX6SX_PAD_KEY_COL3__GPIO2_IO_13                           0x00B0 0x03F8 0x0000 0x5 0x0
+#define MX6SX_PAD_KEY_COL3__WEIM_DATA_28                          0x00B0 0x03F8 0x0000 0x6 0x0
+#define MX6SX_PAD_KEY_COL3__ECSPI1_SS2                            0x00B0 0x03F8 0x0000 0x7 0x0
+#define MX6SX_PAD_KEY_COL4__KPP_COL_4                             0x00B4 0x03FC 0x0000 0x0 0x0
+#define MX6SX_PAD_KEY_COL4__ENET2_MDC                             0x00B4 0x03FC 0x0000 0x1 0x0
+#define MX6SX_PAD_KEY_COL4__I2C3_SCL                              0x00B4 0x03FC 0x07B8 0x2 0x2
+#define MX6SX_PAD_KEY_COL4__USDHC2_LCTL                           0x00B4 0x03FC 0x0000 0x3 0x0
+#define MX6SX_PAD_KEY_COL4__AUDMUX_AUD5_RXC                       0x00B4 0x03FC 0x0664 0x4 0x0
+#define MX6SX_PAD_KEY_COL4__GPIO2_IO_14                           0x00B4 0x03FC 0x0000 0x5 0x0
+#define MX6SX_PAD_KEY_COL4__WEIM_CRE                              0x00B4 0x03FC 0x0000 0x6 0x0
+#define MX6SX_PAD_KEY_COL4__SAI2_RX_BCLK                          0x00B4 0x03FC 0x0808 0x7 0x0
+#define MX6SX_PAD_KEY_ROW0__KPP_ROW_0                             0x00B8 0x0400 0x0000 0x0 0x0
+#define MX6SX_PAD_KEY_ROW0__USDHC3_WP                             0x00B8 0x0400 0x0000 0x1 0x0
+#define MX6SX_PAD_KEY_ROW0__UART6_CTS_B                           0x00B8 0x0400 0x0854 0x2 0x3
+#define MX6SX_PAD_KEY_ROW0__ECSPI1_MOSI                           0x00B8 0x0400 0x0718 0x3 0x0
+#define MX6SX_PAD_KEY_ROW0__AUDMUX_AUD5_TXD                       0x00B8 0x0400 0x0660 0x4 0x0
+#define MX6SX_PAD_KEY_ROW0__GPIO2_IO_15                           0x00B8 0x0400 0x0000 0x5 0x0
+#define MX6SX_PAD_KEY_ROW0__SDMA_EXT_EVENT_0                      0x00B8 0x0400 0x081C 0x6 0x1
+#define MX6SX_PAD_KEY_ROW0__SAI2_TX_DATA_0                        0x00B8 0x0400 0x0000 0x7 0x0
+#define MX6SX_PAD_KEY_ROW0__GPU_IDLE                              0x00B8 0x0400 0x0000 0x8 0x0
+#define MX6SX_PAD_KEY_ROW1__KPP_ROW_1                             0x00BC 0x0404 0x0000 0x0 0x0
+#define MX6SX_PAD_KEY_ROW1__USDHC4_VSELECT                        0x00BC 0x0404 0x0000 0x1 0x0
+#define MX6SX_PAD_KEY_ROW1__UART6_RX                              0x00BC 0x0404 0x0858 0x2 0x3
+#define MX6SX_PAD_KEY_ROW1__UART6_TX                              0x00BC 0x0404 0x0000 0x2 0x0
+#define MX6SX_PAD_KEY_ROW1__ECSPI1_SS0                            0x00BC 0x0404 0x071C 0x3 0x0
+#define MX6SX_PAD_KEY_ROW1__AUDMUX_AUD5_RXD                       0x00BC 0x0404 0x065C 0x4 0x0
+#define MX6SX_PAD_KEY_ROW1__GPIO2_IO_16                           0x00BC 0x0404 0x0000 0x5 0x0
+#define MX6SX_PAD_KEY_ROW1__WEIM_DATA_31                          0x00BC 0x0404 0x0000 0x6 0x0
+#define MX6SX_PAD_KEY_ROW1__SAI2_RX_DATA_0                        0x00BC 0x0404 0x080C 0x7 0x0
+#define MX6SX_PAD_KEY_ROW1__M4_NMI                                0x00BC 0x0404 0x0000 0x8 0x0
+#define MX6SX_PAD_KEY_ROW2__KPP_ROW_2                             0x00C0 0x0408 0x0000 0x0 0x0
+#define MX6SX_PAD_KEY_ROW2__USDHC4_WP                             0x00C0 0x0408 0x0878 0x1 0x1
+#define MX6SX_PAD_KEY_ROW2__UART5_CTS_B                           0x00C0 0x0408 0x084C 0x2 0x3
+#define MX6SX_PAD_KEY_ROW2__CAN1_RX                               0x00C0 0x0408 0x068C 0x3 0x1
+#define MX6SX_PAD_KEY_ROW2__CANFD_RX1                             0x00C0 0x0408 0x0694 0x4 0x1
+#define MX6SX_PAD_KEY_ROW2__GPIO2_IO_17                           0x00C0 0x0408 0x0000 0x5 0x0
+#define MX6SX_PAD_KEY_ROW2__WEIM_DATA_29                          0x00C0 0x0408 0x0000 0x6 0x0
+#define MX6SX_PAD_KEY_ROW2__ECSPI1_SS3                            0x00C0 0x0408 0x0000 0x7 0x0
+#define MX6SX_PAD_KEY_ROW3__KPP_ROW_3                             0x00C4 0x040C 0x0000 0x0 0x0
+#define MX6SX_PAD_KEY_ROW3__USDHC3_LCTL                           0x00C4 0x040C 0x0000 0x1 0x0
+#define MX6SX_PAD_KEY_ROW3__UART5_RX                              0x00C4 0x040C 0x0850 0x2 0x3
+#define MX6SX_PAD_KEY_ROW3__UART5_TX                              0x00C4 0x040C 0x0000 0x2 0x0
+#define MX6SX_PAD_KEY_ROW3__CAN2_RX                               0x00C4 0x040C 0x0690 0x3 0x1
+#define MX6SX_PAD_KEY_ROW3__CANFD_RX2                             0x00C4 0x040C 0x0698 0x4 0x1
+#define MX6SX_PAD_KEY_ROW3__GPIO2_IO_18                           0x00C4 0x040C 0x0000 0x5 0x0
+#define MX6SX_PAD_KEY_ROW3__WEIM_DTACK_B                          0x00C4 0x040C 0x0000 0x6 0x0
+#define MX6SX_PAD_KEY_ROW3__ECSPI1_SS1                            0x00C4 0x040C 0x0000 0x7 0x0
+#define MX6SX_PAD_KEY_ROW4__KPP_ROW_4                             0x00C8 0x0410 0x0000 0x0 0x0
+#define MX6SX_PAD_KEY_ROW4__ENET2_MDIO                            0x00C8 0x0410 0x0770 0x1 0x3
+#define MX6SX_PAD_KEY_ROW4__I2C3_SDA                              0x00C8 0x0410 0x07BC 0x2 0x2
+#define MX6SX_PAD_KEY_ROW4__USDHC1_LCTL                           0x00C8 0x0410 0x0000 0x3 0x0
+#define MX6SX_PAD_KEY_ROW4__AUDMUX_AUD5_RXFS                      0x00C8 0x0410 0x0668 0x4 0x0
+#define MX6SX_PAD_KEY_ROW4__GPIO2_IO_19                           0x00C8 0x0410 0x0000 0x5 0x0
+#define MX6SX_PAD_KEY_ROW4__WEIM_ACLK_FREERUN                     0x00C8 0x0410 0x0000 0x6 0x0
+#define MX6SX_PAD_KEY_ROW4__SAI2_RX_SYNC                          0x00C8 0x0410 0x0810 0x7 0x0
+#define MX6SX_PAD_LCD1_CLK__LCDIF1_CLK                            0x00CC 0x0414 0x0000 0x0 0x0
+#define MX6SX_PAD_LCD1_CLK__LCDIF1_WR_RWN                         0x00CC 0x0414 0x0000 0x1 0x0
+#define MX6SX_PAD_LCD1_CLK__AUDMUX_AUD3_RXC                       0x00CC 0x0414 0x0634 0x2 0x1
+#define MX6SX_PAD_LCD1_CLK__ENET1_1588_EVENT2_IN                  0x00CC 0x0414 0x0000 0x3 0x0
+#define MX6SX_PAD_LCD1_CLK__CSI1_DATA_16                          0x00CC 0x0414 0x06DC 0x4 0x0
+#define MX6SX_PAD_LCD1_CLK__GPIO3_IO_0                            0x00CC 0x0414 0x0000 0x5 0x0
+#define MX6SX_PAD_LCD1_CLK__USDHC1_WP                             0x00CC 0x0414 0x0868 0x6 0x0
+#define MX6SX_PAD_LCD1_CLK__SIM_M_HADDR_16                        0x00CC 0x0414 0x0000 0x7 0x0
+#define MX6SX_PAD_LCD1_CLK__VADC_TEST_0                           0x00CC 0x0414 0x0000 0x8 0x0
+#define MX6SX_PAD_LCD1_CLK__MMDC_DEBUG_0                          0x00CC 0x0414 0x0000 0x9 0x0
+#define MX6SX_PAD_LCD1_DATA00__LCDIF1_DATA_0                      0x00D0 0x0418 0x0000 0x0 0x0
+#define MX6SX_PAD_LCD1_DATA00__WEIM_CS1_B                         0x00D0 0x0418 0x0000 0x1 0x0
+#define MX6SX_PAD_LCD1_DATA00__M4_TRACE_0                         0x00D0 0x0418 0x0000 0x2 0x0
+#define MX6SX_PAD_LCD1_DATA00__KITTEN_TRACE_0                     0x00D0 0x0418 0x0000 0x3 0x0
+#define MX6SX_PAD_LCD1_DATA00__CSI1_DATA_20                       0x00D0 0x0418 0x06EC 0x4 0x0
+#define MX6SX_PAD_LCD1_DATA00__GPIO3_IO_1                         0x00D0 0x0418 0x0000 0x5 0x0
+#define MX6SX_PAD_LCD1_DATA00__SRC_BT_CFG_0                       0x00D0 0x0418 0x0000 0x6 0x0
+#define MX6SX_PAD_LCD1_DATA00__SIM_M_HADDR_21                     0x00D0 0x0418 0x0000 0x7 0x0
+#define MX6SX_PAD_LCD1_DATA00__VADC_TEST_5                        0x00D0 0x0418 0x0000 0x8 0x0
+#define MX6SX_PAD_LCD1_DATA00__MMDC_DEBUG_5                       0x00D0 0x0418 0x0000 0x9 0x0
+#define MX6SX_PAD_LCD1_DATA01__LCDIF1_DATA_1                      0x00D4 0x041C 0x0000 0x0 0x0
+#define MX6SX_PAD_LCD1_DATA01__WEIM_CS2_B                         0x00D4 0x041C 0x0000 0x1 0x0
+#define MX6SX_PAD_LCD1_DATA01__M4_TRACE_1                         0x00D4 0x041C 0x0000 0x2 0x0
+#define MX6SX_PAD_LCD1_DATA01__KITTEN_TRACE_1                     0x00D4 0x041C 0x0000 0x3 0x0
+#define MX6SX_PAD_LCD1_DATA01__CSI1_DATA_21                       0x00D4 0x041C 0x06F0 0x4 0x0
+#define MX6SX_PAD_LCD1_DATA01__GPIO3_IO_2                         0x00D4 0x041C 0x0000 0x5 0x0
+#define MX6SX_PAD_LCD1_DATA01__SRC_BT_CFG_1                       0x00D4 0x041C 0x0000 0x6 0x0
+#define MX6SX_PAD_LCD1_DATA01__SIM_M_HADDR_22                     0x00D4 0x041C 0x0000 0x7 0x0
+#define MX6SX_PAD_LCD1_DATA01__VADC_TEST_6                        0x00D4 0x041C 0x0000 0x8 0x0
+#define MX6SX_PAD_LCD1_DATA01__MMDC_DEBUG_6                       0x00D4 0x041C 0x0000 0x9 0x0
+#define MX6SX_PAD_LCD1_DATA02__LCDIF1_DATA_2                      0x00D8 0x0420 0x0000 0x0 0x0
+#define MX6SX_PAD_LCD1_DATA02__WEIM_CS3_B                         0x00D8 0x0420 0x0000 0x1 0x0
+#define MX6SX_PAD_LCD1_DATA02__M4_TRACE_2                         0x00D8 0x0420 0x0000 0x2 0x0
+#define MX6SX_PAD_LCD1_DATA02__KITTEN_TRACE_2                     0x00D8 0x0420 0x0000 0x3 0x0
+#define MX6SX_PAD_LCD1_DATA02__CSI1_DATA_22                       0x00D8 0x0420 0x06F4 0x4 0x0
+#define MX6SX_PAD_LCD1_DATA02__GPIO3_IO_3                         0x00D8 0x0420 0x0000 0x5 0x0
+#define MX6SX_PAD_LCD1_DATA02__SRC_BT_CFG_2                       0x00D8 0x0420 0x0000 0x6 0x0
+#define MX6SX_PAD_LCD1_DATA02__SIM_M_HADDR_23                     0x00D8 0x0420 0x0000 0x7 0x0
+#define MX6SX_PAD_LCD1_DATA02__VADC_TEST_7                        0x00D8 0x0420 0x0000 0x8 0x0
+#define MX6SX_PAD_LCD1_DATA02__MMDC_DEBUG_7                       0x00D8 0x0420 0x0000 0x9 0x0
+#define MX6SX_PAD_LCD1_DATA03__LCDIF1_DATA_3                      0x00DC 0x0424 0x0000 0x0 0x0
+#define MX6SX_PAD_LCD1_DATA03__WEIM_ADDR_24                       0x00DC 0x0424 0x0000 0x1 0x0
+#define MX6SX_PAD_LCD1_DATA03__M4_TRACE_3                         0x00DC 0x0424 0x0000 0x2 0x0
+#define MX6SX_PAD_LCD1_DATA03__KITTEN_TRACE_3                     0x00DC 0x0424 0x0000 0x3 0x0
+#define MX6SX_PAD_LCD1_DATA03__CSI1_DATA_23                       0x00DC 0x0424 0x06F8 0x4 0x0
+#define MX6SX_PAD_LCD1_DATA03__GPIO3_IO_4                         0x00DC 0x0424 0x0000 0x5 0x0
+#define MX6SX_PAD_LCD1_DATA03__SRC_BT_CFG_3                       0x00DC 0x0424 0x0000 0x6 0x0
+#define MX6SX_PAD_LCD1_DATA03__SIM_M_HADDR_24                     0x00DC 0x0424 0x0000 0x7 0x0
+#define MX6SX_PAD_LCD1_DATA03__VADC_TEST_8                        0x00DC 0x0424 0x0000 0x8 0x0
+#define MX6SX_PAD_LCD1_DATA03__MMDC_DEBUG_8                       0x00DC 0x0424 0x0000 0x9 0x0
+#define MX6SX_PAD_LCD1_DATA04__LCDIF1_DATA_4                      0x00E0 0x0428 0x0000 0x0 0x0
+#define MX6SX_PAD_LCD1_DATA04__WEIM_ADDR_25                       0x00E0 0x0428 0x0000 0x1 0x0
+#define MX6SX_PAD_LCD1_DATA04__KITTEN_TRACE_4                     0x00E0 0x0428 0x0000 0x3 0x0
+#define MX6SX_PAD_LCD1_DATA04__CSI1_VSYNC                         0x00E0 0x0428 0x0708 0x4 0x1
+#define MX6SX_PAD_LCD1_DATA04__GPIO3_IO_5                         0x00E0 0x0428 0x0000 0x5 0x0
+#define MX6SX_PAD_LCD1_DATA04__SRC_BT_CFG_4                       0x00E0 0x0428 0x0000 0x6 0x0
+#define MX6SX_PAD_LCD1_DATA04__SIM_M_HADDR_25                     0x00E0 0x0428 0x0000 0x7 0x0
+#define MX6SX_PAD_LCD1_DATA04__VADC_TEST_9                        0x00E0 0x0428 0x0000 0x8 0x0
+#define MX6SX_PAD_LCD1_DATA04__MMDC_DEBUG_9                       0x00E0 0x0428 0x0000 0x9 0x0
+#define MX6SX_PAD_LCD1_DATA05__LCDIF1_DATA_5                      0x00E4 0x042C 0x0000 0x0 0x0
+#define MX6SX_PAD_LCD1_DATA05__WEIM_ADDR_26                       0x00E4 0x042C 0x0000 0x1 0x0
+#define MX6SX_PAD_LCD1_DATA05__KITTEN_TRACE_5                     0x00E4 0x042C 0x0000 0x3 0x0
+#define MX6SX_PAD_LCD1_DATA05__CSI1_HSYNC                         0x00E4 0x042C 0x0700 0x4 0x1
+#define MX6SX_PAD_LCD1_DATA05__GPIO3_IO_6                         0x00E4 0x042C 0x0000 0x5 0x0
+#define MX6SX_PAD_LCD1_DATA05__SRC_BT_CFG_5                       0x00E4 0x042C 0x0000 0x6 0x0
+#define MX6SX_PAD_LCD1_DATA05__SIM_M_HADDR_26                     0x00E4 0x042C 0x0000 0x7 0x0
+#define MX6SX_PAD_LCD1_DATA05__VADC_TEST_10                       0x00E4 0x042C 0x0000 0x8 0x0
+#define MX6SX_PAD_LCD1_DATA05__MMDC_DEBUG_10                      0x00E4 0x042C 0x0000 0x9 0x0
+#define MX6SX_PAD_LCD1_DATA06__LCDIF1_DATA_6                      0x00E8 0x0430 0x0000 0x0 0x0
+#define MX6SX_PAD_LCD1_DATA06__WEIM_EB_B_2                        0x00E8 0x0430 0x0000 0x1 0x0
+#define MX6SX_PAD_LCD1_DATA06__KITTEN_TRACE_6                     0x00E8 0x0430 0x0000 0x3 0x0
+#define MX6SX_PAD_LCD1_DATA06__CSI1_PIXCLK                        0x00E8 0x0430 0x0704 0x4 0x1
+#define MX6SX_PAD_LCD1_DATA06__GPIO3_IO_7                         0x00E8 0x0430 0x0000 0x5 0x0
+#define MX6SX_PAD_LCD1_DATA06__SRC_BT_CFG_6                       0x00E8 0x0430 0x0000 0x6 0x0
+#define MX6SX_PAD_LCD1_DATA06__SIM_M_HADDR_27                     0x00E8 0x0430 0x0000 0x7 0x0
+#define MX6SX_PAD_LCD1_DATA06__VADC_TEST_11                       0x00E8 0x0430 0x0000 0x8 0x0
+#define MX6SX_PAD_LCD1_DATA06__MMDC_DEBUG_11                      0x00E8 0x0430 0x0000 0x9 0x0
+#define MX6SX_PAD_LCD1_DATA07__LCDIF1_DATA_7                      0x00EC 0x0434 0x0000 0x0 0x0
+#define MX6SX_PAD_LCD1_DATA07__WEIM_EB_B_3                        0x00EC 0x0434 0x0000 0x1 0x0
+#define MX6SX_PAD_LCD1_DATA07__KITTEN_TRACE_7                     0x00EC 0x0434 0x0000 0x3 0x0
+#define MX6SX_PAD_LCD1_DATA07__CSI1_MCLK                          0x00EC 0x0434 0x0000 0x4 0x0
+#define MX6SX_PAD_LCD1_DATA07__GPIO3_IO_8                         0x00EC 0x0434 0x0000 0x5 0x0
+#define MX6SX_PAD_LCD1_DATA07__SRC_BT_CFG_7                       0x00EC 0x0434 0x0000 0x6 0x0
+#define MX6SX_PAD_LCD1_DATA07__SIM_M_HADDR_28                     0x00EC 0x0434 0x0000 0x7 0x0
+#define MX6SX_PAD_LCD1_DATA07__VADC_TEST_12                       0x00EC 0x0434 0x0000 0x8 0x0
+#define MX6SX_PAD_LCD1_DATA07__MMDC_DEBUG_12                      0x00EC 0x0434 0x0000 0x9 0x0
+#define MX6SX_PAD_LCD1_DATA08__LCDIF1_DATA_8                      0x00F0 0x0438 0x0000 0x0 0x0
+#define MX6SX_PAD_LCD1_DATA08__WEIM_AD_8                          0x00F0 0x0438 0x0000 0x1 0x0
+#define MX6SX_PAD_LCD1_DATA08__KITTEN_TRACE_8                     0x00F0 0x0438 0x0000 0x3 0x0
+#define MX6SX_PAD_LCD1_DATA08__CSI1_DATA_9                        0x00F0 0x0438 0x06C4 0x4 0x1
+#define MX6SX_PAD_LCD1_DATA08__GPIO3_IO_9                         0x00F0 0x0438 0x0000 0x5 0x0
+#define MX6SX_PAD_LCD1_DATA08__SRC_BT_CFG_8                       0x00F0 0x0438 0x0000 0x6 0x0
+#define MX6SX_PAD_LCD1_DATA08__SIM_M_HADDR_29                     0x00F0 0x0438 0x0000 0x7 0x0
+#define MX6SX_PAD_LCD1_DATA08__VADC_TEST_13                       0x00F0 0x0438 0x0000 0x8 0x0
+#define MX6SX_PAD_LCD1_DATA08__MMDC_DEBUG_13                      0x00F0 0x0438 0x0000 0x9 0x0
+#define MX6SX_PAD_LCD1_DATA09__LCDIF1_DATA_9                      0x00F4 0x043C 0x0000 0x0 0x0
+#define MX6SX_PAD_LCD1_DATA09__WEIM_AD_9                          0x00F4 0x043C 0x0000 0x1 0x0
+#define MX6SX_PAD_LCD1_DATA09__KITTEN_TRACE_9                     0x00F4 0x043C 0x0000 0x3 0x0
+#define MX6SX_PAD_LCD1_DATA09__CSI1_DATA_8                        0x00F4 0x043C 0x06C0 0x4 0x1
+#define MX6SX_PAD_LCD1_DATA09__GPIO3_IO_10                        0x00F4 0x043C 0x0000 0x5 0x0
+#define MX6SX_PAD_LCD1_DATA09__SRC_BT_CFG_9                       0x00F4 0x043C 0x0000 0x6 0x0
+#define MX6SX_PAD_LCD1_DATA09__SIM_M_HADDR_30                     0x00F4 0x043C 0x0000 0x7 0x0
+#define MX6SX_PAD_LCD1_DATA09__VADC_TEST_14                       0x00F4 0x043C 0x0000 0x8 0x0
+#define MX6SX_PAD_LCD1_DATA09__MMDC_DEBUG_14                      0x00F4 0x043C 0x0000 0x9 0x0
+#define MX6SX_PAD_LCD1_DATA10__LCDIF1_DATA_10                     0x00F8 0x0440 0x0000 0x0 0x0
+#define MX6SX_PAD_LCD1_DATA10__WEIM_AD_10                         0x00F8 0x0440 0x0000 0x1 0x0
+#define MX6SX_PAD_LCD1_DATA10__KITTEN_TRACE_10                    0x00F8 0x0440 0x0000 0x3 0x0
+#define MX6SX_PAD_LCD1_DATA10__CSI1_DATA_7                        0x00F8 0x0440 0x06BC 0x4 0x1
+#define MX6SX_PAD_LCD1_DATA10__GPIO3_IO_11                        0x00F8 0x0440 0x0000 0x5 0x0
+#define MX6SX_PAD_LCD1_DATA10__SRC_BT_CFG_10                      0x00F8 0x0440 0x0000 0x6 0x0
+#define MX6SX_PAD_LCD1_DATA10__SIM_M_HADDR_31                     0x00F8 0x0440 0x0000 0x7 0x0
+#define MX6SX_PAD_LCD1_DATA10__VADC_TEST_15                       0x00F8 0x0440 0x0000 0x8 0x0
+#define MX6SX_PAD_LCD1_DATA10__MMDC_DEBUG_15                      0x00F8 0x0440 0x0000 0x9 0x0
+#define MX6SX_PAD_LCD1_DATA11__LCDIF1_DATA_11                     0x00FC 0x0444 0x0000 0x0 0x0
+#define MX6SX_PAD_LCD1_DATA11__WEIM_AD_11                         0x00FC 0x0444 0x0000 0x1 0x0
+#define MX6SX_PAD_LCD1_DATA11__KITTEN_TRACE_11                    0x00FC 0x0444 0x0000 0x3 0x0
+#define MX6SX_PAD_LCD1_DATA11__CSI1_DATA_6                        0x00FC 0x0444 0x06B8 0x4 0x1
+#define MX6SX_PAD_LCD1_DATA11__GPIO3_IO_12                        0x00FC 0x0444 0x0000 0x5 0x0
+#define MX6SX_PAD_LCD1_DATA11__SRC_BT_CFG_11                      0x00FC 0x0444 0x0000 0x6 0x0
+#define MX6SX_PAD_LCD1_DATA11__SIM_M_HBURST_0                     0x00FC 0x0444 0x0000 0x7 0x0
+#define MX6SX_PAD_LCD1_DATA11__VADC_TEST_16                       0x00FC 0x0444 0x0000 0x8 0x0
+#define MX6SX_PAD_LCD1_DATA11__MMDC_DEBUG_16                      0x00FC 0x0444 0x0000 0x9 0x0
+#define MX6SX_PAD_LCD1_DATA12__LCDIF1_DATA_12                     0x0100 0x0448 0x0000 0x0 0x0
+#define MX6SX_PAD_LCD1_DATA12__WEIM_AD_12                         0x0100 0x0448 0x0000 0x1 0x0
+#define MX6SX_PAD_LCD1_DATA12__KITTEN_TRACE_12                    0x0100 0x0448 0x0000 0x3 0x0
+#define MX6SX_PAD_LCD1_DATA12__CSI1_DATA_5                        0x0100 0x0448 0x06B4 0x4 0x1
+#define MX6SX_PAD_LCD1_DATA12__GPIO3_IO_13                        0x0100 0x0448 0x0000 0x5 0x0
+#define MX6SX_PAD_LCD1_DATA12__SRC_BT_CFG_12                      0x0100 0x0448 0x0000 0x6 0x0
+#define MX6SX_PAD_LCD1_DATA12__SIM_M_HBURST_1                     0x0100 0x0448 0x0000 0x7 0x0
+#define MX6SX_PAD_LCD1_DATA12__VADC_TEST_17                       0x0100 0x0448 0x0000 0x8 0x0
+#define MX6SX_PAD_LCD1_DATA12__MMDC_DEBUG_17                      0x0100 0x0448 0x0000 0x9 0x0
+#define MX6SX_PAD_LCD1_DATA13__LCDIF1_DATA_13                     0x0104 0x044C 0x0000 0x0 0x0
+#define MX6SX_PAD_LCD1_DATA13__WEIM_AD_13                         0x0104 0x044C 0x0000 0x1 0x0
+#define MX6SX_PAD_LCD1_DATA13__KITTEN_TRACE_13                    0x0104 0x044C 0x0000 0x3 0x0
+#define MX6SX_PAD_LCD1_DATA13__CSI1_DATA_4                        0x0104 0x044C 0x06B0 0x4 0x1
+#define MX6SX_PAD_LCD1_DATA13__GPIO3_IO_14                        0x0104 0x044C 0x0000 0x5 0x0
+#define MX6SX_PAD_LCD1_DATA13__SRC_BT_CFG_13                      0x0104 0x044C 0x0000 0x6 0x0
+#define MX6SX_PAD_LCD1_DATA13__SIM_M_HBURST_2                     0x0104 0x044C 0x0000 0x7 0x0
+#define MX6SX_PAD_LCD1_DATA13__VADC_TEST_18                       0x0104 0x044C 0x0000 0x8 0x0
+#define MX6SX_PAD_LCD1_DATA13__MMDC_DEBUG_18                      0x0104 0x044C 0x0000 0x9 0x0
+#define MX6SX_PAD_LCD1_DATA14__LCDIF1_DATA_14                     0x0108 0x0450 0x0000 0x0 0x0
+#define MX6SX_PAD_LCD1_DATA14__WEIM_AD_14                         0x0108 0x0450 0x0000 0x1 0x0
+#define MX6SX_PAD_LCD1_DATA14__KITTEN_TRACE_14                    0x0108 0x0450 0x0000 0x3 0x0
+#define MX6SX_PAD_LCD1_DATA14__CSI1_DATA_3                        0x0108 0x0450 0x06AC 0x4 0x1
+#define MX6SX_PAD_LCD1_DATA14__GPIO3_IO_15                        0x0108 0x0450 0x0000 0x5 0x0
+#define MX6SX_PAD_LCD1_DATA14__SRC_BT_CFG_14                      0x0108 0x0450 0x0000 0x6 0x0
+#define MX6SX_PAD_LCD1_DATA14__SIM_M_HMASTLOCK                    0x0108 0x0450 0x0000 0x7 0x0
+#define MX6SX_PAD_LCD1_DATA14__VADC_TEST_19                       0x0108 0x0450 0x0000 0x8 0x0
+#define MX6SX_PAD_LCD1_DATA14__MMDC_DEBUG_19                      0x0108 0x0450 0x0000 0x9 0x0
+#define MX6SX_PAD_LCD1_DATA15__LCDIF1_DATA_15                     0x010C 0x0454 0x0000 0x0 0x0
+#define MX6SX_PAD_LCD1_DATA15__WEIM_AD_15                         0x010C 0x0454 0x0000 0x1 0x0
+#define MX6SX_PAD_LCD1_DATA15__KITTEN_TRACE_15                    0x010C 0x0454 0x0000 0x3 0x0
+#define MX6SX_PAD_LCD1_DATA15__CSI1_DATA_2                        0x010C 0x0454 0x06A8 0x4 0x1
+#define MX6SX_PAD_LCD1_DATA15__GPIO3_IO_16                        0x010C 0x0454 0x0000 0x5 0x0
+#define MX6SX_PAD_LCD1_DATA15__SRC_BT_CFG_15                      0x010C 0x0454 0x0000 0x6 0x0
+#define MX6SX_PAD_LCD1_DATA15__SIM_M_HPROT_0                      0x010C 0x0454 0x0000 0x7 0x0
+#define MX6SX_PAD_LCD1_DATA15__VDEC_DEBUG_0                       0x010C 0x0454 0x0000 0x8 0x0
+#define MX6SX_PAD_LCD1_DATA15__MMDC_DEBUG_20                      0x010C 0x0454 0x0000 0x9 0x0
+#define MX6SX_PAD_LCD1_DATA16__LCDIF1_DATA_16                     0x0110 0x0458 0x0000 0x0 0x0
+#define MX6SX_PAD_LCD1_DATA16__WEIM_ADDR_16                       0x0110 0x0458 0x0000 0x1 0x0
+#define MX6SX_PAD_LCD1_DATA16__M4_TRACE_CLK                       0x0110 0x0458 0x0000 0x2 0x0
+#define MX6SX_PAD_LCD1_DATA16__KITTEN_TRACE_CLK                   0x0110 0x0458 0x0000 0x3 0x0
+#define MX6SX_PAD_LCD1_DATA16__CSI1_DATA_1                        0x0110 0x0458 0x06A4 0x4 0x0
+#define MX6SX_PAD_LCD1_DATA16__GPIO3_IO_17                        0x0110 0x0458 0x0000 0x5 0x0
+#define MX6SX_PAD_LCD1_DATA16__SRC_BT_CFG_24                      0x0110 0x0458 0x0000 0x6 0x0
+#define MX6SX_PAD_LCD1_DATA16__SIM_M_HPROT_1                      0x0110 0x0458 0x0000 0x7 0x0
+#define MX6SX_PAD_LCD1_DATA16__VDEC_DEBUG_1                       0x0110 0x0458 0x0000 0x8 0x0
+#define MX6SX_PAD_LCD1_DATA16__MMDC_DEBUG_21                      0x0110 0x0458 0x0000 0x9 0x0
+#define MX6SX_PAD_LCD1_DATA17__LCDIF1_DATA_17                     0x0114 0x045C 0x0000 0x0 0x0
+#define MX6SX_PAD_LCD1_DATA17__WEIM_ADDR_17                       0x0114 0x045C 0x0000 0x1 0x0
+#define MX6SX_PAD_LCD1_DATA17__KITTEN_TRACE_CTL                   0x0114 0x045C 0x0000 0x3 0x0
+#define MX6SX_PAD_LCD1_DATA17__CSI1_DATA_0                        0x0114 0x045C 0x06A0 0x4 0x0
+#define MX6SX_PAD_LCD1_DATA17__GPIO3_IO_18                        0x0114 0x045C 0x0000 0x5 0x0
+#define MX6SX_PAD_LCD1_DATA17__SRC_BT_CFG_25                      0x0114 0x045C 0x0000 0x6 0x0
+#define MX6SX_PAD_LCD1_DATA17__SIM_M_HPROT_2                      0x0114 0x045C 0x0000 0x7 0x0
+#define MX6SX_PAD_LCD1_DATA17__VDEC_DEBUG_2                       0x0114 0x045C 0x0000 0x8 0x0
+#define MX6SX_PAD_LCD1_DATA17__MMDC_DEBUG_22                      0x0114 0x045C 0x0000 0x9 0x0
+#define MX6SX_PAD_LCD1_DATA18__LCDIF1_DATA_18                     0x0118 0x0460 0x0000 0x0 0x0
+#define MX6SX_PAD_LCD1_DATA18__WEIM_ADDR_18                       0x0118 0x0460 0x0000 0x1 0x0
+#define MX6SX_PAD_LCD1_DATA18__M4_EVENTO                          0x0118 0x0460 0x0000 0x2 0x0
+#define MX6SX_PAD_LCD1_DATA18__KITTEN_EVENTO                      0x0118 0x0460 0x0000 0x3 0x0
+#define MX6SX_PAD_LCD1_DATA18__CSI1_DATA_15                       0x0118 0x0460 0x06D8 0x4 0x0
+#define MX6SX_PAD_LCD1_DATA18__GPIO3_IO_19                        0x0118 0x0460 0x0000 0x5 0x0
+#define MX6SX_PAD_LCD1_DATA18__SRC_BT_CFG_26                      0x0118 0x0460 0x0000 0x6 0x0
+#define MX6SX_PAD_LCD1_DATA18__SIM_M_HPROT_3                      0x0118 0x0460 0x0000 0x7 0x0
+#define MX6SX_PAD_LCD1_DATA18__VDEC_DEBUG_3                       0x0118 0x0460 0x0000 0x8 0x0
+#define MX6SX_PAD_LCD1_DATA18__MMDC_DEBUG_23                      0x0118 0x0460 0x0000 0x9 0x0
+#define MX6SX_PAD_LCD1_DATA19__LCDIF1_DATA_19                     0x011C 0x0464 0x0000 0x0 0x0
+#define MX6SX_PAD_LCD1_DATA19__WEIM_ADDR_19                       0x011C 0x0464 0x0000 0x1 0x0
+#define MX6SX_PAD_LCD1_DATA19__M4_TRACE_SWO                       0x011C 0x0464 0x0000 0x2 0x0
+#define MX6SX_PAD_LCD1_DATA19__CSI1_DATA_14                       0x011C 0x0464 0x06D4 0x4 0x0
+#define MX6SX_PAD_LCD1_DATA19__GPIO3_IO_20                        0x011C 0x0464 0x0000 0x5 0x0
+#define MX6SX_PAD_LCD1_DATA19__SRC_BT_CFG_27                      0x011C 0x0464 0x0000 0x6 0x0
+#define MX6SX_PAD_LCD1_DATA19__SIM_M_HREADYOUT                    0x011C 0x0464 0x0000 0x7 0x0
+#define MX6SX_PAD_LCD1_DATA19__VDEC_DEBUG_4                       0x011C 0x0464 0x0000 0x8 0x0
+#define MX6SX_PAD_LCD1_DATA19__MMDC_DEBUG_24                      0x011C 0x0464 0x0000 0x9 0x0
+#define MX6SX_PAD_LCD1_DATA20__LCDIF1_DATA_20                     0x0120 0x0468 0x0000 0x0 0x0
+#define MX6SX_PAD_LCD1_DATA20__WEIM_ADDR_20                       0x0120 0x0468 0x0000 0x1 0x0
+#define MX6SX_PAD_LCD1_DATA20__PWM8_OUT                           0x0120 0x0468 0x0000 0x2 0x0
+#define MX6SX_PAD_LCD1_DATA20__ENET1_1588_EVENT2_OUT              0x0120 0x0468 0x0000 0x3 0x0
+#define MX6SX_PAD_LCD1_DATA20__CSI1_DATA_13                       0x0120 0x0468 0x06D0 0x4 0x0
+#define MX6SX_PAD_LCD1_DATA20__GPIO3_IO_21                        0x0120 0x0468 0x0000 0x5 0x0
+#define MX6SX_PAD_LCD1_DATA20__SRC_BT_CFG_28                      0x0120 0x0468 0x0000 0x6 0x0
+#define MX6SX_PAD_LCD1_DATA20__SIM_M_HRESP                        0x0120 0x0468 0x0000 0x7 0x0
+#define MX6SX_PAD_LCD1_DATA20__VDEC_DEBUG_5                       0x0120 0x0468 0x0000 0x8 0x0
+#define MX6SX_PAD_LCD1_DATA20__MMDC_DEBUG_25                      0x0120 0x0468 0x0000 0x9 0x0
+#define MX6SX_PAD_LCD1_DATA21__LCDIF1_DATA_21                     0x0124 0x046C 0x0000 0x0 0x0
+#define MX6SX_PAD_LCD1_DATA21__WEIM_ADDR_21                       0x0124 0x046C 0x0000 0x1 0x0
+#define MX6SX_PAD_LCD1_DATA21__PWM7_OUT                           0x0124 0x046C 0x0000 0x2 0x0
+#define MX6SX_PAD_LCD1_DATA21__ENET1_1588_EVENT3_OUT              0x0124 0x046C 0x0000 0x3 0x0
+#define MX6SX_PAD_LCD1_DATA21__CSI1_DATA_12                       0x0124 0x046C 0x06CC 0x4 0x0
+#define MX6SX_PAD_LCD1_DATA21__GPIO3_IO_22                        0x0124 0x046C 0x0000 0x5 0x0
+#define MX6SX_PAD_LCD1_DATA21__SRC_BT_CFG_29                      0x0124 0x046C 0x0000 0x6 0x0
+#define MX6SX_PAD_LCD1_DATA21__SIM_M_HSIZE_0                      0x0124 0x046C 0x0000 0x7 0x0
+#define MX6SX_PAD_LCD1_DATA21__VDEC_DEBUG_6                       0x0124 0x046C 0x0000 0x8 0x0
+#define MX6SX_PAD_LCD1_DATA21__MMDC_DEBUG_26                      0x0124 0x046C 0x0000 0x9 0x0
+#define MX6SX_PAD_LCD1_DATA22__LCDIF1_DATA_22                     0x0128 0x0470 0x0000 0x0 0x0
+#define MX6SX_PAD_LCD1_DATA22__WEIM_ADDR_22                       0x0128 0x0470 0x0000 0x1 0x0
+#define MX6SX_PAD_LCD1_DATA22__PWM6_OUT                           0x0128 0x0470 0x0000 0x2 0x0
+#define MX6SX_PAD_LCD1_DATA22__ENET2_1588_EVENT2_OUT              0x0128 0x0470 0x0000 0x3 0x0
+#define MX6SX_PAD_LCD1_DATA22__CSI1_DATA_11                       0x0128 0x0470 0x06C8 0x4 0x0
+#define MX6SX_PAD_LCD1_DATA22__GPIO3_IO_23                        0x0128 0x0470 0x0000 0x5 0x0
+#define MX6SX_PAD_LCD1_DATA22__SRC_BT_CFG_30                      0x0128 0x0470 0x0000 0x6 0x0
+#define MX6SX_PAD_LCD1_DATA22__SIM_M_HSIZE_1                      0x0128 0x0470 0x0000 0x7 0x0
+#define MX6SX_PAD_LCD1_DATA22__VDEC_DEBUG_7                       0x0128 0x0470 0x0000 0x8 0x0
+#define MX6SX_PAD_LCD1_DATA22__MMDC_DEBUG_27                      0x0128 0x0470 0x0000 0x9 0x0
+#define MX6SX_PAD_LCD1_DATA23__LCDIF1_DATA_23                     0x012C 0x0474 0x0000 0x0 0x0
+#define MX6SX_PAD_LCD1_DATA23__WEIM_ADDR_23                       0x012C 0x0474 0x0000 0x1 0x0
+#define MX6SX_PAD_LCD1_DATA23__PWM5_OUT                           0x012C 0x0474 0x0000 0x2 0x0
+#define MX6SX_PAD_LCD1_DATA23__ENET2_1588_EVENT3_OUT              0x012C 0x0474 0x0000 0x3 0x0
+#define MX6SX_PAD_LCD1_DATA23__CSI1_DATA_10                       0x012C 0x0474 0x06FC 0x4 0x0
+#define MX6SX_PAD_LCD1_DATA23__GPIO3_IO_24                        0x012C 0x0474 0x0000 0x5 0x0
+#define MX6SX_PAD_LCD1_DATA23__SRC_BT_CFG_31                      0x012C 0x0474 0x0000 0x6 0x0
+#define MX6SX_PAD_LCD1_DATA23__SIM_M_HSIZE_2                      0x012C 0x0474 0x0000 0x7 0x0
+#define MX6SX_PAD_LCD1_DATA23__VDEC_DEBUG_8                       0x012C 0x0474 0x0000 0x8 0x0
+#define MX6SX_PAD_LCD1_DATA23__MMDC_DEBUG_28                      0x012C 0x0474 0x0000 0x9 0x0
+#define MX6SX_PAD_LCD1_ENABLE__LCDIF1_ENABLE                      0x0130 0x0478 0x0000 0x0 0x0
+#define MX6SX_PAD_LCD1_ENABLE__LCDIF1_RD_E                        0x0130 0x0478 0x0000 0x1 0x0
+#define MX6SX_PAD_LCD1_ENABLE__AUDMUX_AUD3_TXC                    0x0130 0x0478 0x063C 0x2 0x1
+#define MX6SX_PAD_LCD1_ENABLE__ENET1_1588_EVENT3_IN               0x0130 0x0478 0x0000 0x3 0x0
+#define MX6SX_PAD_LCD1_ENABLE__CSI1_DATA_17                       0x0130 0x0478 0x06E0 0x4 0x0
+#define MX6SX_PAD_LCD1_ENABLE__GPIO3_IO_25                        0x0130 0x0478 0x0000 0x5 0x0
+#define MX6SX_PAD_LCD1_ENABLE__USDHC1_CD_B                        0x0130 0x0478 0x0864 0x6 0x0
+#define MX6SX_PAD_LCD1_ENABLE__SIM_M_HADDR_17                     0x0130 0x0478 0x0000 0x7 0x0
+#define MX6SX_PAD_LCD1_ENABLE__VADC_TEST_1                        0x0130 0x0478 0x0000 0x8 0x0
+#define MX6SX_PAD_LCD1_ENABLE__MMDC_DEBUG_1                       0x0130 0x0478 0x0000 0x9 0x0
+#define MX6SX_PAD_LCD1_HSYNC__LCDIF1_HSYNC                        0x0134 0x047C 0x07E0 0x0 0x0
+#define MX6SX_PAD_LCD1_HSYNC__LCDIF1_RS                           0x0134 0x047C 0x0000 0x1 0x0
+#define MX6SX_PAD_LCD1_HSYNC__AUDMUX_AUD3_TXD                     0x0134 0x047C 0x0630 0x2 0x1
+#define MX6SX_PAD_LCD1_HSYNC__ENET2_1588_EVENT2_IN                0x0134 0x047C 0x0000 0x3 0x0
+#define MX6SX_PAD_LCD1_HSYNC__CSI1_DATA_18                        0x0134 0x047C 0x06E4 0x4 0x0
+#define MX6SX_PAD_LCD1_HSYNC__GPIO3_IO_26                         0x0134 0x047C 0x0000 0x5 0x0
+#define MX6SX_PAD_LCD1_HSYNC__USDHC2_WP                           0x0134 0x047C 0x0870 0x6 0x0
+#define MX6SX_PAD_LCD1_HSYNC__SIM_M_HADDR_18                      0x0134 0x047C 0x0000 0x7 0x0
+#define MX6SX_PAD_LCD1_HSYNC__VADC_TEST_2                         0x0134 0x047C 0x0000 0x8 0x0
+#define MX6SX_PAD_LCD1_HSYNC__MMDC_DEBUG_2                        0x0134 0x047C 0x0000 0x9 0x0
+#define MX6SX_PAD_LCD1_RESET__LCDIF1_RESET                        0x0138 0x0480 0x0000 0x0 0x0
+#define MX6SX_PAD_LCD1_RESET__LCDIF1_CS                           0x0138 0x0480 0x0000 0x1 0x0
+#define MX6SX_PAD_LCD1_RESET__AUDMUX_AUD3_RXD                     0x0138 0x0480 0x062C 0x2 0x1
+#define MX6SX_PAD_LCD1_RESET__KITTEN_EVENTI                       0x0138 0x0480 0x0000 0x3 0x0
+#define MX6SX_PAD_LCD1_RESET__M4_EVENTI                           0x0138 0x0480 0x0000 0x4 0x0
+#define MX6SX_PAD_LCD1_RESET__GPIO3_IO_27                         0x0138 0x0480 0x0000 0x5 0x0
+#define MX6SX_PAD_LCD1_RESET__CCM_PMIC_RDY                        0x0138 0x0480 0x069C 0x6 0x0
+#define MX6SX_PAD_LCD1_RESET__SIM_M_HADDR_20                      0x0138 0x0480 0x0000 0x7 0x0
+#define MX6SX_PAD_LCD1_RESET__VADC_TEST_4                         0x0138 0x0480 0x0000 0x8 0x0
+#define MX6SX_PAD_LCD1_RESET__MMDC_DEBUG_4                        0x0138 0x0480 0x0000 0x9 0x0
+#define MX6SX_PAD_LCD1_VSYNC__LCDIF1_VSYNC                        0x013C 0x0484 0x0000 0x0 0x0
+#define MX6SX_PAD_LCD1_VSYNC__LCDIF1_BUSY                         0x013C 0x0484 0x07E0 0x1 0x1
+#define MX6SX_PAD_LCD1_VSYNC__AUDMUX_AUD3_TXFS                    0x013C 0x0484 0x0640 0x2 0x1
+#define MX6SX_PAD_LCD1_VSYNC__ENET2_1588_EVENT3_IN                0x013C 0x0484 0x0000 0x3 0x0
+#define MX6SX_PAD_LCD1_VSYNC__CSI1_DATA_19                        0x013C 0x0484 0x06E8 0x4 0x0
+#define MX6SX_PAD_LCD1_VSYNC__GPIO3_IO_28                         0x013C 0x0484 0x0000 0x5 0x0
+#define MX6SX_PAD_LCD1_VSYNC__USDHC2_CD_B                         0x013C 0x0484 0x086C 0x6 0x0
+#define MX6SX_PAD_LCD1_VSYNC__SIM_M_HADDR_19                      0x013C 0x0484 0x0000 0x7 0x0
+#define MX6SX_PAD_LCD1_VSYNC__VADC_TEST_3                         0x013C 0x0484 0x0000 0x8 0x0
+#define MX6SX_PAD_LCD1_VSYNC__MMDC_DEBUG_3                        0x013C 0x0484 0x0000 0x9 0x0
+#define MX6SX_PAD_NAND_ALE__RAWNAND_ALE                           0x0140 0x0488 0x0000 0x0 0x0
+#define MX6SX_PAD_NAND_ALE__I2C3_SDA                              0x0140 0x0488 0x07BC 0x1 0x0
+#define MX6SX_PAD_NAND_ALE__QSPI2_A_SS0_B                         0x0140 0x0488 0x0000 0x2 0x0
+#define MX6SX_PAD_NAND_ALE__ECSPI2_SS0                            0x0140 0x0488 0x072C 0x3 0x0
+#define MX6SX_PAD_NAND_ALE__ESAI_TX3_RX2                          0x0140 0x0488 0x079C 0x4 0x0
+#define MX6SX_PAD_NAND_ALE__GPIO4_IO_0                            0x0140 0x0488 0x0000 0x5 0x0
+#define MX6SX_PAD_NAND_ALE__WEIM_CS0_B                            0x0140 0x0488 0x0000 0x6 0x0
+#define MX6SX_PAD_NAND_ALE__TPSMP_HDATA_0                         0x0140 0x0488 0x0000 0x7 0x0
+#define MX6SX_PAD_NAND_ALE__ANATOP_USBPHY1_TSTI_TX_EN             0x0140 0x0488 0x0000 0x8 0x0
+#define MX6SX_PAD_NAND_ALE__SDMA_DEBUG_PC_12                      0x0140 0x0488 0x0000 0x9 0x0
+#define MX6SX_PAD_NAND_CE0_B__RAWNAND_CE0_B                       0x0144 0x048C 0x0000 0x0 0x0
+#define MX6SX_PAD_NAND_CE0_B__USDHC2_VSELECT                      0x0144 0x048C 0x0000 0x1 0x0
+#define MX6SX_PAD_NAND_CE0_B__QSPI2_A_DATA_2                      0x0144 0x048C 0x0000 0x2 0x0
+#define MX6SX_PAD_NAND_CE0_B__AUDMUX_AUD4_TXC                     0x0144 0x048C 0x0654 0x3 0x0
+#define MX6SX_PAD_NAND_CE0_B__ESAI_TX_CLK                         0x0144 0x048C 0x078C 0x4 0x0
+#define MX6SX_PAD_NAND_CE0_B__GPIO4_IO_1                          0x0144 0x048C 0x0000 0x5 0x0
+#define MX6SX_PAD_NAND_CE0_B__WEIM_LBA_B                          0x0144 0x048C 0x0000 0x6 0x0
+#define MX6SX_PAD_NAND_CE0_B__TPSMP_HDATA_3                       0x0144 0x048C 0x0000 0x7 0x0
+#define MX6SX_PAD_NAND_CE0_B__ANATOP_USBPHY1_TSTI_TX_HIZ          0x0144 0x048C 0x0000 0x8 0x0
+#define MX6SX_PAD_NAND_CE0_B__SDMA_DEBUG_PC_9                     0x0144 0x048C 0x0000 0x9 0x0
+#define MX6SX_PAD_NAND_CE1_B__RAWNAND_CE1_B                       0x0148 0x0490 0x0000 0x0 0x0
+#define MX6SX_PAD_NAND_CE1_B__USDHC3_RESET_B                      0x0148 0x0490 0x0000 0x1 0x0
+#define MX6SX_PAD_NAND_CE1_B__QSPI2_A_DATA_3                      0x0148 0x0490 0x0000 0x2 0x0
+#define MX6SX_PAD_NAND_CE1_B__AUDMUX_AUD4_TXD                     0x0148 0x0490 0x0648 0x3 0x0
+#define MX6SX_PAD_NAND_CE1_B__ESAI_TX0                            0x0148 0x0490 0x0790 0x4 0x0
+#define MX6SX_PAD_NAND_CE1_B__GPIO4_IO_2                          0x0148 0x0490 0x0000 0x5 0x0
+#define MX6SX_PAD_NAND_CE1_B__WEIM_OE                             0x0148 0x0490 0x0000 0x6 0x0
+#define MX6SX_PAD_NAND_CE1_B__TPSMP_HDATA_4                       0x0148 0x0490 0x0000 0x7 0x0
+#define MX6SX_PAD_NAND_CE1_B__ANATOP_USBPHY1_TSTI_TX_LS_MODE      0x0148 0x0490 0x0000 0x8 0x0
+#define MX6SX_PAD_NAND_CE1_B__SDMA_DEBUG_PC_8                     0x0148 0x0490 0x0000 0x9 0x0
+#define MX6SX_PAD_NAND_CLE__RAWNAND_CLE                           0x014C 0x0494 0x0000 0x0 0x0
+#define MX6SX_PAD_NAND_CLE__I2C3_SCL                              0x014C 0x0494 0x07B8 0x1 0x0
+#define MX6SX_PAD_NAND_CLE__QSPI2_A_SCLK                          0x014C 0x0494 0x0000 0x2 0x0
+#define MX6SX_PAD_NAND_CLE__ECSPI2_SCLK                           0x014C 0x0494 0x0720 0x3 0x0
+#define MX6SX_PAD_NAND_CLE__ESAI_TX2_RX3                          0x014C 0x0494 0x0798 0x4 0x0
+#define MX6SX_PAD_NAND_CLE__GPIO4_IO_3                            0x014C 0x0494 0x0000 0x5 0x0
+#define MX6SX_PAD_NAND_CLE__WEIM_BCLK                             0x014C 0x0494 0x0000 0x6 0x0
+#define MX6SX_PAD_NAND_CLE__TPSMP_CLK                             0x014C 0x0494 0x0000 0x7 0x0
+#define MX6SX_PAD_NAND_CLE__ANATOP_USBPHY1_TSTI_TX_DP             0x014C 0x0494 0x0000 0x8 0x0
+#define MX6SX_PAD_NAND_CLE__SDMA_DEBUG_PC_13                      0x014C 0x0494 0x0000 0x9 0x0
+#define MX6SX_PAD_NAND_DATA00__RAWNAND_DATA00                     0x0150 0x0498 0x0000 0x0 0x0
+#define MX6SX_PAD_NAND_DATA00__USDHC1_DATA4                       0x0150 0x0498 0x0000 0x1 0x0
+#define MX6SX_PAD_NAND_DATA00__QSPI2_B_DATA_1                     0x0150 0x0498 0x0000 0x2 0x0
+#define MX6SX_PAD_NAND_DATA00__ECSPI5_MISO                        0x0150 0x0498 0x0754 0x3 0x0
+#define MX6SX_PAD_NAND_DATA00__ESAI_RX_CLK                        0x0150 0x0498 0x0788 0x4 0x0
+#define MX6SX_PAD_NAND_DATA00__GPIO4_IO_4                         0x0150 0x0498 0x0000 0x5 0x0
+#define MX6SX_PAD_NAND_DATA00__WEIM_AD_0                          0x0150 0x0498 0x0000 0x6 0x0
+#define MX6SX_PAD_NAND_DATA00__TPSMP_HDATA_7                      0x0150 0x0498 0x0000 0x7 0x0
+#define MX6SX_PAD_NAND_DATA00__ANATOP_USBPHY1_TSTO_RX_DISCON_DET  0x0150 0x0498 0x0000 0x8 0x0
+#define MX6SX_PAD_NAND_DATA00__SDMA_DEBUG_EVT_CHN_LINES_5         0x0150 0x0498 0x0000 0x9 0x0
+#define MX6SX_PAD_NAND_DATA01__RAWNAND_DATA01                     0x0154 0x049C 0x0000 0x0 0x0
+#define MX6SX_PAD_NAND_DATA01__USDHC1_DATA5                       0x0154 0x049C 0x0000 0x1 0x0
+#define MX6SX_PAD_NAND_DATA01__QSPI2_B_DATA_0                     0x0154 0x049C 0x0000 0x2 0x0
+#define MX6SX_PAD_NAND_DATA01__ECSPI5_MOSI                        0x0154 0x049C 0x0758 0x3 0x0
+#define MX6SX_PAD_NAND_DATA01__ESAI_RX_FS                         0x0154 0x049C 0x0778 0x4 0x0
+#define MX6SX_PAD_NAND_DATA01__GPIO4_IO_5                         0x0154 0x049C 0x0000 0x5 0x0
+#define MX6SX_PAD_NAND_DATA01__WEIM_AD_1                          0x0154 0x049C 0x0000 0x6 0x0
+#define MX6SX_PAD_NAND_DATA01__TPSMP_HDATA_8                      0x0154 0x049C 0x0000 0x7 0x0
+#define MX6SX_PAD_NAND_DATA01__ANATOP_USBPHY1_TSTO_RX_HS_RXD      0x0154 0x049C 0x0000 0x8 0x0
+#define MX6SX_PAD_NAND_DATA01__SDMA_DEBUG_EVT_CHN_LINES_4         0x0154 0x049C 0x0000 0x9 0x0
+#define MX6SX_PAD_NAND_DATA02__RAWNAND_DATA02                     0x0158 0x04A0 0x0000 0x0 0x0
+#define MX6SX_PAD_NAND_DATA02__USDHC1_DATA6                       0x0158 0x04A0 0x0000 0x1 0x0
+#define MX6SX_PAD_NAND_DATA02__QSPI2_B_SCLK                       0x0158 0x04A0 0x0000 0x2 0x0
+#define MX6SX_PAD_NAND_DATA02__ECSPI5_SCLK                        0x0158 0x04A0 0x0750 0x3 0x0
+#define MX6SX_PAD_NAND_DATA02__ESAI_TX_HF_CLK                     0x0158 0x04A0 0x0784 0x4 0x0
+#define MX6SX_PAD_NAND_DATA02__GPIO4_IO_6                         0x0158 0x04A0 0x0000 0x5 0x0
+#define MX6SX_PAD_NAND_DATA02__WEIM_AD_2                          0x0158 0x04A0 0x0000 0x6 0x0
+#define MX6SX_PAD_NAND_DATA02__TPSMP_HDATA_9                      0x0158 0x04A0 0x0000 0x7 0x0
+#define MX6SX_PAD_NAND_DATA02__ANATOP_USBPHY2_TSTO_PLL_CLK20DIV   0x0158 0x04A0 0x0000 0x8 0x0
+#define MX6SX_PAD_NAND_DATA02__SDMA_DEBUG_EVT_CHN_LINES_3         0x0158 0x04A0 0x0000 0x9 0x0
+#define MX6SX_PAD_NAND_DATA03__RAWNAND_DATA03                     0x015C 0x04A4 0x0000 0x0 0x0
+#define MX6SX_PAD_NAND_DATA03__USDHC1_DATA7                       0x015C 0x04A4 0x0000 0x1 0x0
+#define MX6SX_PAD_NAND_DATA03__QSPI2_B_SS0_B                      0x015C 0x04A4 0x0000 0x2 0x0
+#define MX6SX_PAD_NAND_DATA03__ECSPI5_SS0                         0x015C 0x04A4 0x075C 0x3 0x0
+#define MX6SX_PAD_NAND_DATA03__ESAI_RX_HF_CLK                     0x015C 0x04A4 0x0780 0x4 0x0
+#define MX6SX_PAD_NAND_DATA03__GPIO4_IO_7                         0x015C 0x04A4 0x0000 0x5 0x0
+#define MX6SX_PAD_NAND_DATA03__WEIM_AD_3                          0x015C 0x04A4 0x0000 0x6 0x0
+#define MX6SX_PAD_NAND_DATA03__TPSMP_HDATA_10                     0x015C 0x04A4 0x0000 0x7 0x0
+#define MX6SX_PAD_NAND_DATA03__ANATOP_USBPHY1_TSTO_RX_SQUELCH     0x015C 0x04A4 0x0000 0x8 0x0
+#define MX6SX_PAD_NAND_DATA03__SDMA_DEBUG_EVT_CHN_LINES_6         0x015C 0x04A4 0x0000 0x9 0x0
+#define MX6SX_PAD_NAND_DATA04__RAWNAND_DATA04                     0x0160 0x04A8 0x0000 0x0 0x0
+#define MX6SX_PAD_NAND_DATA04__USDHC2_DATA4                       0x0160 0x04A8 0x0000 0x1 0x0
+#define MX6SX_PAD_NAND_DATA04__QSPI2_B_SS1_B                      0x0160 0x04A8 0x0000 0x2 0x0
+#define MX6SX_PAD_NAND_DATA04__UART3_RTS_B                        0x0160 0x04A8 0x083C 0x3 0x0
+#define MX6SX_PAD_NAND_DATA04__AUDMUX_AUD4_RXFS                   0x0160 0x04A8 0x0650 0x4 0x0
+#define MX6SX_PAD_NAND_DATA04__GPIO4_IO_8                         0x0160 0x04A8 0x0000 0x5 0x0
+#define MX6SX_PAD_NAND_DATA04__WEIM_AD_4                          0x0160 0x04A8 0x0000 0x6 0x0
+#define MX6SX_PAD_NAND_DATA04__TPSMP_HDATA_11                     0x0160 0x04A8 0x0000 0x7 0x0
+#define MX6SX_PAD_NAND_DATA04__ANATOP_USBPHY2_TSTO_RX_SQUELCH     0x0160 0x04A8 0x0000 0x8 0x0
+#define MX6SX_PAD_NAND_DATA04__SDMA_DEBUG_CORE_STATE_0            0x0160 0x04A8 0x0000 0x9 0x0
+#define MX6SX_PAD_NAND_DATA05__RAWNAND_DATA05                     0x0164 0x04AC 0x0000 0x0 0x0
+#define MX6SX_PAD_NAND_DATA05__USDHC2_DATA5                       0x0164 0x04AC 0x0000 0x1 0x0
+#define MX6SX_PAD_NAND_DATA05__QSPI2_B_DQS                        0x0164 0x04AC 0x0000 0x2 0x0
+#define MX6SX_PAD_NAND_DATA05__UART3_CTS_B                        0x0164 0x04AC 0x083C 0x3 0x1
+#define MX6SX_PAD_NAND_DATA05__AUDMUX_AUD4_RXC                    0x0164 0x04AC 0x064C 0x4 0x0
+#define MX6SX_PAD_NAND_DATA05__GPIO4_IO_9                         0x0164 0x04AC 0x0000 0x5 0x0
+#define MX6SX_PAD_NAND_DATA05__WEIM_AD_5                          0x0164 0x04AC 0x0000 0x6 0x0
+#define MX6SX_PAD_NAND_DATA05__TPSMP_HDATA_12                     0x0164 0x04AC 0x0000 0x7 0x0
+#define MX6SX_PAD_NAND_DATA05__ANATOP_USBPHY2_TSTO_RX_DISCON_DET  0x0164 0x04AC 0x0000 0x8 0x0
+#define MX6SX_PAD_NAND_DATA05__SDMA_DEBUG_CORE_STATE_1            0x0164 0x04AC 0x0000 0x9 0x0
+#define MX6SX_PAD_NAND_DATA06__RAWNAND_DATA06                     0x0168 0x04B0 0x0000 0x0 0x0
+#define MX6SX_PAD_NAND_DATA06__USDHC2_DATA6                       0x0168 0x04B0 0x0000 0x1 0x0
+#define MX6SX_PAD_NAND_DATA06__QSPI2_A_SS1_B                      0x0168 0x04B0 0x0000 0x2 0x0
+#define MX6SX_PAD_NAND_DATA06__UART3_RX                           0x0168 0x04B0 0x0840 0x3 0x0
+#define MX6SX_PAD_NAND_DATA06__UART3_TX                           0x0168 0x04B0 0x0000 0x3 0x0
+#define MX6SX_PAD_NAND_DATA06__PWM3_OUT                           0x0168 0x04B0 0x0000 0x4 0x0
+#define MX6SX_PAD_NAND_DATA06__GPIO4_IO_10                        0x0168 0x04B0 0x0000 0x5 0x0
+#define MX6SX_PAD_NAND_DATA06__WEIM_AD_6                          0x0168 0x04B0 0x0000 0x6 0x0
+#define MX6SX_PAD_NAND_DATA06__TPSMP_HDATA_13                     0x0168 0x04B0 0x0000 0x7 0x0
+#define MX6SX_PAD_NAND_DATA06__ANATOP_USBPHY2_TSTO_RX_FS_RXD      0x0168 0x04B0 0x0000 0x8 0x0
+#define MX6SX_PAD_NAND_DATA06__SDMA_DEBUG_CORE_STATE_2            0x0168 0x04B0 0x0000 0x9 0x0
+#define MX6SX_PAD_NAND_DATA07__RAWNAND_DATA07                     0x016C 0x04B4 0x0000 0x0 0x0
+#define MX6SX_PAD_NAND_DATA07__USDHC2_DATA7                       0x016C 0x04B4 0x0000 0x1 0x0
+#define MX6SX_PAD_NAND_DATA07__QSPI2_A_DQS                        0x016C 0x04B4 0x0000 0x2 0x0
+#define MX6SX_PAD_NAND_DATA07__UART3_RX                           0x016C 0x04B4 0x0840 0x3 0x1
+#define MX6SX_PAD_NAND_DATA07__UART3_TX                           0x016C 0x04B4 0x0000 0x3 0x0
+#define MX6SX_PAD_NAND_DATA07__PWM4_OUT                           0x016C 0x04B4 0x0000 0x4 0x0
+#define MX6SX_PAD_NAND_DATA07__GPIO4_IO_11                        0x016C 0x04B4 0x0000 0x5 0x0
+#define MX6SX_PAD_NAND_DATA07__WEIM_AD_7                          0x016C 0x04B4 0x0000 0x6 0x0
+#define MX6SX_PAD_NAND_DATA07__TPSMP_HDATA_14                     0x016C 0x04B4 0x0000 0x7 0x0
+#define MX6SX_PAD_NAND_DATA07__ANATOP_USBPHY1_TSTO_RX_FS_RXD      0x016C 0x04B4 0x0000 0x8 0x0
+#define MX6SX_PAD_NAND_DATA07__SDMA_DEBUG_CORE_STATE_3            0x016C 0x04B4 0x0000 0x9 0x0
+#define MX6SX_PAD_NAND_RE_B__RAWNAND_RE_B                         0x0170 0x04B8 0x0000 0x0 0x0
+#define MX6SX_PAD_NAND_RE_B__USDHC2_RESET_B                       0x0170 0x04B8 0x0000 0x1 0x0
+#define MX6SX_PAD_NAND_RE_B__QSPI2_B_DATA_3                       0x0170 0x04B8 0x0000 0x2 0x0
+#define MX6SX_PAD_NAND_RE_B__AUDMUX_AUD4_TXFS                     0x0170 0x04B8 0x0658 0x3 0x0
+#define MX6SX_PAD_NAND_RE_B__ESAI_TX_FS                           0x0170 0x04B8 0x077C 0x4 0x0
+#define MX6SX_PAD_NAND_RE_B__GPIO4_IO_12                          0x0170 0x04B8 0x0000 0x5 0x0
+#define MX6SX_PAD_NAND_RE_B__WEIM_RW                              0x0170 0x04B8 0x0000 0x6 0x0
+#define MX6SX_PAD_NAND_RE_B__TPSMP_HDATA_5                        0x0170 0x04B8 0x0000 0x7 0x0
+#define MX6SX_PAD_NAND_RE_B__ANATOP_USBPHY2_TSTO_RX_HS_RXD        0x0170 0x04B8 0x0000 0x8 0x0
+#define MX6SX_PAD_NAND_RE_B__SDMA_DEBUG_PC_7                      0x0170 0x04B8 0x0000 0x9 0x0
+#define MX6SX_PAD_NAND_READY_B__RAWNAND_READY_B                   0x0174 0x04BC 0x0000 0x0 0x0
+#define MX6SX_PAD_NAND_READY_B__USDHC1_VSELECT                    0x0174 0x04BC 0x0000 0x1 0x0
+#define MX6SX_PAD_NAND_READY_B__QSPI2_A_DATA_1                    0x0174 0x04BC 0x0000 0x2 0x0
+#define MX6SX_PAD_NAND_READY_B__ECSPI2_MISO                       0x0174 0x04BC 0x0724 0x3 0x0
+#define MX6SX_PAD_NAND_READY_B__ESAI_TX1                          0x0174 0x04BC 0x0794 0x4 0x0
+#define MX6SX_PAD_NAND_READY_B__GPIO4_IO_13                       0x0174 0x04BC 0x0000 0x5 0x0
+#define MX6SX_PAD_NAND_READY_B__WEIM_EB_B_1                       0x0174 0x04BC 0x0000 0x6 0x0
+#define MX6SX_PAD_NAND_READY_B__TPSMP_HDATA_2                     0x0174 0x04BC 0x0000 0x7 0x0
+#define MX6SX_PAD_NAND_READY_B__ANATOP_USBPHY1_TSTI_TX_DN         0x0174 0x04BC 0x0000 0x8 0x0
+#define MX6SX_PAD_NAND_READY_B__SDMA_DEBUG_PC_10                  0x0174 0x04BC 0x0000 0x9 0x0
+#define MX6SX_PAD_NAND_WE_B__RAWNAND_WE_B                         0x0178 0x04C0 0x0000 0x0 0x0
+#define MX6SX_PAD_NAND_WE_B__USDHC4_VSELECT                       0x0178 0x04C0 0x0000 0x1 0x0
+#define MX6SX_PAD_NAND_WE_B__QSPI2_B_DATA_2                       0x0178 0x04C0 0x0000 0x2 0x0
+#define MX6SX_PAD_NAND_WE_B__AUDMUX_AUD4_RXD                      0x0178 0x04C0 0x0644 0x3 0x0
+#define MX6SX_PAD_NAND_WE_B__ESAI_TX5_RX0                         0x0178 0x04C0 0x07A4 0x4 0x0
+#define MX6SX_PAD_NAND_WE_B__GPIO4_IO_14                          0x0178 0x04C0 0x0000 0x5 0x0
+#define MX6SX_PAD_NAND_WE_B__WEIM_WAIT                            0x0178 0x04C0 0x0000 0x6 0x0
+#define MX6SX_PAD_NAND_WE_B__TPSMP_HDATA_6                        0x0178 0x04C0 0x0000 0x7 0x0
+#define MX6SX_PAD_NAND_WE_B__ANATOP_USBPHY1_TSTO_PLL_CLK20DIV     0x0178 0x04C0 0x0000 0x8 0x0
+#define MX6SX_PAD_NAND_WE_B__SDMA_DEBUG_PC_6                      0x0178 0x04C0 0x0000 0x9 0x0
+#define MX6SX_PAD_NAND_WP_B__RAWNAND_WP_B                         0x017C 0x04C4 0x0000 0x0 0x0
+#define MX6SX_PAD_NAND_WP_B__USDHC1_RESET_B                       0x017C 0x04C4 0x0000 0x1 0x0
+#define MX6SX_PAD_NAND_WP_B__QSPI2_A_DATA_0                       0x017C 0x04C4 0x0000 0x2 0x0
+#define MX6SX_PAD_NAND_WP_B__ECSPI2_MOSI                          0x017C 0x04C4 0x0728 0x3 0x0
+#define MX6SX_PAD_NAND_WP_B__ESAI_TX4_RX1                         0x017C 0x04C4 0x07A0 0x4 0x0
+#define MX6SX_PAD_NAND_WP_B__GPIO4_IO_15                          0x017C 0x04C4 0x0000 0x5 0x0
+#define MX6SX_PAD_NAND_WP_B__WEIM_EB_B_0                          0x017C 0x04C4 0x0000 0x6 0x0
+#define MX6SX_PAD_NAND_WP_B__TPSMP_HDATA_1                        0x017C 0x04C4 0x0000 0x7 0x0
+#define MX6SX_PAD_NAND_WP_B__ANATOP_USBPHY1_TSTI_TX_HS_MODE       0x017C 0x04C4 0x0000 0x8 0x0
+#define MX6SX_PAD_NAND_WP_B__SDMA_DEBUG_PC_11                     0x017C 0x04C4 0x0000 0x9 0x0
+#define MX6SX_PAD_QSPI1A_DATA0__QSPI1_A_DATA_0                    0x0180 0x04C8 0x0000 0x0 0x0
+#define MX6SX_PAD_QSPI1A_DATA0__USB_OTG2_OC                       0x0180 0x04C8 0x085C 0x1 0x2
+#define MX6SX_PAD_QSPI1A_DATA0__ECSPI1_MOSI                       0x0180 0x04C8 0x0718 0x2 0x1
+#define MX6SX_PAD_QSPI1A_DATA0__ESAI_TX4_RX1                      0x0180 0x04C8 0x07A0 0x3 0x2
+#define MX6SX_PAD_QSPI1A_DATA0__CSI1_DATA_14                      0x0180 0x04C8 0x06D4 0x4 0x1
+#define MX6SX_PAD_QSPI1A_DATA0__GPIO4_IO_16                       0x0180 0x04C8 0x0000 0x5 0x0
+#define MX6SX_PAD_QSPI1A_DATA0__WEIM_DATA_6                       0x0180 0x04C8 0x0000 0x6 0x0
+#define MX6SX_PAD_QSPI1A_DATA0__SIM_M_HADDR_3                     0x0180 0x04C8 0x0000 0x7 0x0
+#define MX6SX_PAD_QSPI1A_DATA0__SDMA_DEBUG_BUS_DEVICE_3           0x0180 0x04C8 0x0000 0x9 0x0
+#define MX6SX_PAD_QSPI1A_DATA1__QSPI1_A_DATA_1                    0x0184 0x04CC 0x0000 0x0 0x0
+#define MX6SX_PAD_QSPI1A_DATA1__ANATOP_OTG1_ID                    0x0184 0x04CC 0x0624 0x1 0x2
+#define MX6SX_PAD_QSPI1A_DATA1__ECSPI1_MISO                       0x0184 0x04CC 0x0714 0x2 0x1
+#define MX6SX_PAD_QSPI1A_DATA1__ESAI_TX1                          0x0184 0x04CC 0x0794 0x3 0x2
+#define MX6SX_PAD_QSPI1A_DATA1__CSI1_DATA_13                      0x0184 0x04CC 0x06D0 0x4 0x1
+#define MX6SX_PAD_QSPI1A_DATA1__GPIO4_IO_17                       0x0184 0x04CC 0x0000 0x5 0x0
+#define MX6SX_PAD_QSPI1A_DATA1__WEIM_DATA_5                       0x0184 0x04CC 0x0000 0x6 0x0
+#define MX6SX_PAD_QSPI1A_DATA1__SIM_M_HADDR_4                     0x0184 0x04CC 0x0000 0x7 0x0
+#define MX6SX_PAD_QSPI1A_DATA1__SDMA_DEBUG_PC_0                   0x0184 0x04CC 0x0000 0x9 0x0
+#define MX6SX_PAD_QSPI1A_DATA2__QSPI1_A_DATA_2                    0x0188 0x04D0 0x0000 0x0 0x0
+#define MX6SX_PAD_QSPI1A_DATA2__USB_OTG1_PWR                      0x0188 0x04D0 0x0000 0x1 0x0
+#define MX6SX_PAD_QSPI1A_DATA2__ECSPI5_SS1                        0x0188 0x04D0 0x0000 0x2 0x0
+#define MX6SX_PAD_QSPI1A_DATA2__ESAI_TX_CLK                       0x0188 0x04D0 0x078C 0x3 0x2
+#define MX6SX_PAD_QSPI1A_DATA2__CSI1_DATA_12                      0x0188 0x04D0 0x06CC 0x4 0x1
+#define MX6SX_PAD_QSPI1A_DATA2__GPIO4_IO_18                       0x0188 0x04D0 0x0000 0x5 0x0
+#define MX6SX_PAD_QSPI1A_DATA2__WEIM_DATA_4                       0x0188 0x04D0 0x0000 0x6 0x0
+#define MX6SX_PAD_QSPI1A_DATA2__SIM_M_HADDR_6                     0x0188 0x04D0 0x0000 0x7 0x0
+#define MX6SX_PAD_QSPI1A_DATA2__SDMA_DEBUG_PC_1                   0x0188 0x04D0 0x0000 0x9 0x0
+#define MX6SX_PAD_QSPI1A_DATA3__QSPI1_A_DATA_3                    0x018C 0x04D4 0x0000 0x0 0x0
+#define MX6SX_PAD_QSPI1A_DATA3__USB_OTG1_OC                       0x018C 0x04D4 0x0860 0x1 0x2
+#define MX6SX_PAD_QSPI1A_DATA3__ECSPI5_SS2                        0x018C 0x04D4 0x0000 0x2 0x0
+#define MX6SX_PAD_QSPI1A_DATA3__ESAI_TX0                          0x018C 0x04D4 0x0790 0x3 0x2
+#define MX6SX_PAD_QSPI1A_DATA3__CSI1_DATA_11                      0x018C 0x04D4 0x06C8 0x4 0x1
+#define MX6SX_PAD_QSPI1A_DATA3__GPIO4_IO_19                       0x018C 0x04D4 0x0000 0x5 0x0
+#define MX6SX_PAD_QSPI1A_DATA3__WEIM_DATA_3                       0x018C 0x04D4 0x0000 0x6 0x0
+#define MX6SX_PAD_QSPI1A_DATA3__SIM_M_HADDR_7                     0x018C 0x04D4 0x0000 0x7 0x0
+#define MX6SX_PAD_QSPI1A_DATA3__SDMA_DEBUG_PC_2                   0x018C 0x04D4 0x0000 0x9 0x0
+#define MX6SX_PAD_QSPI1A_DQS__QSPI1_A_DQS                         0x0190 0x04D8 0x0000 0x0 0x0
+#define MX6SX_PAD_QSPI1A_DQS__CAN2_TX                             0x0190 0x04D8 0x0000 0x1 0x0
+#define MX6SX_PAD_QSPI1A_DQS__CANFD_TX2                           0x0190 0x04D8 0x0000 0x2 0x0
+#define MX6SX_PAD_QSPI1A_DQS__ECSPI5_MOSI                         0x0190 0x04D8 0x0758 0x3 0x1
+#define MX6SX_PAD_QSPI1A_DQS__CSI1_DATA_15                        0x0190 0x04D8 0x06D8 0x4 0x1
+#define MX6SX_PAD_QSPI1A_DQS__GPIO4_IO_20                         0x0190 0x04D8 0x0000 0x5 0x0
+#define MX6SX_PAD_QSPI1A_DQS__WEIM_DATA_7                         0x0190 0x04D8 0x0000 0x6 0x0
+#define MX6SX_PAD_QSPI1A_DQS__SIM_M_HADDR_13                      0x0190 0x04D8 0x0000 0x7 0x0
+#define MX6SX_PAD_QSPI1A_DQS__SDMA_DEBUG_BUS_DEVICE_4             0x0190 0x04D8 0x0000 0x9 0x0
+#define MX6SX_PAD_QSPI1A_SCLK__QSPI1_A_SCLK                       0x0194 0x04DC 0x0000 0x0 0x0
+#define MX6SX_PAD_QSPI1A_SCLK__ANATOP_OTG2_ID                     0x0194 0x04DC 0x0628 0x1 0x2
+#define MX6SX_PAD_QSPI1A_SCLK__ECSPI1_SCLK                        0x0194 0x04DC 0x0710 0x2 0x1
+#define MX6SX_PAD_QSPI1A_SCLK__ESAI_TX2_RX3                       0x0194 0x04DC 0x0798 0x3 0x2
+#define MX6SX_PAD_QSPI1A_SCLK__CSI1_DATA_1                        0x0194 0x04DC 0x06A4 0x4 0x1
+#define MX6SX_PAD_QSPI1A_SCLK__GPIO4_IO_21                        0x0194 0x04DC 0x0000 0x5 0x0
+#define MX6SX_PAD_QSPI1A_SCLK__WEIM_DATA_0                        0x0194 0x04DC 0x0000 0x6 0x0
+#define MX6SX_PAD_QSPI1A_SCLK__SIM_M_HADDR_0                      0x0194 0x04DC 0x0000 0x7 0x0
+#define MX6SX_PAD_QSPI1A_SCLK__SDMA_DEBUG_PC_5                    0x0194 0x04DC 0x0000 0x9 0x0
+#define MX6SX_PAD_QSPI1A_SS0_B__QSPI1_A_SS0_B                     0x0198 0x04E0 0x0000 0x0 0x0
+#define MX6SX_PAD_QSPI1A_SS0_B__USB_OTG2_PWR                      0x0198 0x04E0 0x0000 0x1 0x0
+#define MX6SX_PAD_QSPI1A_SS0_B__ECSPI1_SS0                        0x0198 0x04E0 0x071C 0x2 0x1
+#define MX6SX_PAD_QSPI1A_SS0_B__ESAI_TX3_RX2                      0x0198 0x04E0 0x079C 0x3 0x2
+#define MX6SX_PAD_QSPI1A_SS0_B__CSI1_DATA_0                       0x0198 0x04E0 0x06A0 0x4 0x1
+#define MX6SX_PAD_QSPI1A_SS0_B__GPIO4_IO_22                       0x0198 0x04E0 0x0000 0x5 0x0
+#define MX6SX_PAD_QSPI1A_SS0_B__WEIM_DATA_1                       0x0198 0x04E0 0x0000 0x6 0x0
+#define MX6SX_PAD_QSPI1A_SS0_B__SIM_M_HADDR_1                     0x0198 0x04E0 0x0000 0x7 0x0
+#define MX6SX_PAD_QSPI1A_SS0_B__SDMA_DEBUG_PC_4                   0x0198 0x04E0 0x0000 0x9 0x0
+#define MX6SX_PAD_QSPI1A_SS1_B__QSPI1_A_SS1_B                     0x019C 0x04E4 0x0000 0x0 0x0
+#define MX6SX_PAD_QSPI1A_SS1_B__CAN1_RX                           0x019C 0x04E4 0x068C 0x1 0x2
+#define MX6SX_PAD_QSPI1A_SS1_B__CANFD_RX1                         0x019C 0x04E4 0x0694 0x2 0x2
+#define MX6SX_PAD_QSPI1A_SS1_B__ECSPI5_MISO                       0x019C 0x04E4 0x0754 0x3 0x1
+#define MX6SX_PAD_QSPI1A_SS1_B__CSI1_DATA_10                      0x019C 0x04E4 0x06FC 0x4 0x1
+#define MX6SX_PAD_QSPI1A_SS1_B__GPIO4_IO_23                       0x019C 0x04E4 0x0000 0x5 0x0
+#define MX6SX_PAD_QSPI1A_SS1_B__WEIM_DATA_2                       0x019C 0x04E4 0x0000 0x6 0x0
+#define MX6SX_PAD_QSPI1A_SS1_B__SIM_M_HADDR_12                    0x019C 0x04E4 0x0000 0x7 0x0
+#define MX6SX_PAD_QSPI1A_SS1_B__SDMA_DEBUG_PC_3                   0x019C 0x04E4 0x0000 0x9 0x0
+#define MX6SX_PAD_QSPI1B_DATA0__QSPI1_B_DATA_0                    0x01A0 0x04E8 0x0000 0x0 0x0
+#define MX6SX_PAD_QSPI1B_DATA0__UART3_CTS_B                       0x01A0 0x04E8 0x083C 0x1 0x4
+#define MX6SX_PAD_QSPI1B_DATA0__ECSPI3_MOSI                       0x01A0 0x04E8 0x0738 0x2 0x1
+#define MX6SX_PAD_QSPI1B_DATA0__ESAI_RX_FS                        0x01A0 0x04E8 0x0778 0x3 0x2
+#define MX6SX_PAD_QSPI1B_DATA0__CSI1_DATA_22                      0x01A0 0x04E8 0x06F4 0x4 0x1
+#define MX6SX_PAD_QSPI1B_DATA0__GPIO4_IO_24                       0x01A0 0x04E8 0x0000 0x5 0x0
+#define MX6SX_PAD_QSPI1B_DATA0__WEIM_DATA_14                      0x01A0 0x04E8 0x0000 0x6 0x0
+#define MX6SX_PAD_QSPI1B_DATA0__SIM_M_HADDR_9                     0x01A0 0x04E8 0x0000 0x7 0x0
+#define MX6SX_PAD_QSPI1B_DATA1__QSPI1_B_DATA_1                    0x01A4 0x04EC 0x0000 0x0 0x0
+#define MX6SX_PAD_QSPI1B_DATA1__UART3_RTS_B                       0x01A4 0x04EC 0x083C 0x1 0x5
+#define MX6SX_PAD_QSPI1B_DATA1__ECSPI3_MISO                       0x01A4 0x04EC 0x0734 0x2 0x1
+#define MX6SX_PAD_QSPI1B_DATA1__ESAI_RX_CLK                       0x01A4 0x04EC 0x0788 0x3 0x2
+#define MX6SX_PAD_QSPI1B_DATA1__CSI1_DATA_21                      0x01A4 0x04EC 0x06F0 0x4 0x1
+#define MX6SX_PAD_QSPI1B_DATA1__GPIO4_IO_25                       0x01A4 0x04EC 0x0000 0x5 0x0
+#define MX6SX_PAD_QSPI1B_DATA1__WEIM_DATA_13                      0x01A4 0x04EC 0x0000 0x6 0x0
+#define MX6SX_PAD_QSPI1B_DATA1__SIM_M_HADDR_8                     0x01A4 0x04EC 0x0000 0x7 0x0
+#define MX6SX_PAD_QSPI1B_DATA2__QSPI1_B_DATA_2                    0x01A8 0x04F0 0x0000 0x0 0x0
+#define MX6SX_PAD_QSPI1B_DATA2__I2C2_SDA                          0x01A8 0x04F0 0x07B4 0x1 0x2
+#define MX6SX_PAD_QSPI1B_DATA2__ECSPI5_RDY                        0x01A8 0x04F0 0x0000 0x2 0x0
+#define MX6SX_PAD_QSPI1B_DATA2__ESAI_TX5_RX0                      0x01A8 0x04F0 0x07A4 0x3 0x2
+#define MX6SX_PAD_QSPI1B_DATA2__CSI1_DATA_20                      0x01A8 0x04F0 0x06EC 0x4 0x1
+#define MX6SX_PAD_QSPI1B_DATA2__GPIO4_IO_26                       0x01A8 0x04F0 0x0000 0x5 0x0
+#define MX6SX_PAD_QSPI1B_DATA2__WEIM_DATA_12                      0x01A8 0x04F0 0x0000 0x6 0x0
+#define MX6SX_PAD_QSPI1B_DATA2__SIM_M_HADDR_5                     0x01A8 0x04F0 0x0000 0x7 0x0
+#define MX6SX_PAD_QSPI1B_DATA3__QSPI1_B_DATA_3                    0x01AC 0x04F4 0x0000 0x0 0x0
+#define MX6SX_PAD_QSPI1B_DATA3__I2C2_SCL                          0x01AC 0x04F4 0x07B0 0x1 0x2
+#define MX6SX_PAD_QSPI1B_DATA3__ECSPI5_SS3                        0x01AC 0x04F4 0x0000 0x2 0x0
+#define MX6SX_PAD_QSPI1B_DATA3__ESAI_TX_FS                        0x01AC 0x04F4 0x077C 0x3 0x2
+#define MX6SX_PAD_QSPI1B_DATA3__CSI1_DATA_19                      0x01AC 0x04F4 0x06E8 0x4 0x1
+#define MX6SX_PAD_QSPI1B_DATA3__GPIO4_IO_27                       0x01AC 0x04F4 0x0000 0x5 0x0
+#define MX6SX_PAD_QSPI1B_DATA3__WEIM_DATA_11                      0x01AC 0x04F4 0x0000 0x6 0x0
+#define MX6SX_PAD_QSPI1B_DATA3__SIM_M_HADDR_2                     0x01AC 0x04F4 0x0000 0x7 0x0
+#define MX6SX_PAD_QSPI1B_DQS__QSPI1_B_DQS                         0x01B0 0x04F8 0x0000 0x0 0x0
+#define MX6SX_PAD_QSPI1B_DQS__CAN1_TX                             0x01B0 0x04F8 0x0000 0x1 0x0
+#define MX6SX_PAD_QSPI1B_DQS__CANFD_TX1                           0x01B0 0x04F8 0x0000 0x2 0x0
+#define MX6SX_PAD_QSPI1B_DQS__ECSPI5_SS0                          0x01B0 0x04F8 0x075C 0x3 0x1
+#define MX6SX_PAD_QSPI1B_DQS__CSI1_DATA_23                        0x01B0 0x04F8 0x06F8 0x4 0x1
+#define MX6SX_PAD_QSPI1B_DQS__GPIO4_IO_28                         0x01B0 0x04F8 0x0000 0x5 0x0
+#define MX6SX_PAD_QSPI1B_DQS__WEIM_DATA_15                        0x01B0 0x04F8 0x0000 0x6 0x0
+#define MX6SX_PAD_QSPI1B_DQS__SIM_M_HADDR_15                      0x01B0 0x04F8 0x0000 0x7 0x0
+#define MX6SX_PAD_QSPI1B_SCLK__QSPI1_B_SCLK                       0x01B4 0x04FC 0x0000 0x0 0x0
+#define MX6SX_PAD_QSPI1B_SCLK__UART3_RX                           0x01B4 0x04FC 0x0840 0x1 0x4
+#define MX6SX_PAD_QSPI1B_SCLK__UART3_TX                           0x01B4 0x04FC 0x0000 0x0 0x0
+#define MX6SX_PAD_QSPI1B_SCLK__ECSPI3_SCLK                        0x01B4 0x04FC 0x0730 0x2 0x1
+#define MX6SX_PAD_QSPI1B_SCLK__ESAI_RX_HF_CLK                     0x01B4 0x04FC 0x0780 0x3 0x2
+#define MX6SX_PAD_QSPI1B_SCLK__CSI1_DATA_16                       0x01B4 0x04FC 0x06DC 0x4 0x1
+#define MX6SX_PAD_QSPI1B_SCLK__GPIO4_IO_29                        0x01B4 0x04FC 0x0000 0x5 0x0
+#define MX6SX_PAD_QSPI1B_SCLK__WEIM_DATA_8                        0x01B4 0x04FC 0x0000 0x6 0x0
+#define MX6SX_PAD_QSPI1B_SCLK__SIM_M_HADDR_11                     0x01B4 0x04FC 0x0000 0x7 0x0
+#define MX6SX_PAD_QSPI1B_SS0_B__QSPI1_B_SS0_B                     0x01B8 0x0500 0x0000 0x0 0x0
+#define MX6SX_PAD_QSPI1B_SS0_B__UART3_RX                          0x01B8 0x0500 0x0840 0x1 0x5
+#define MX6SX_PAD_QSPI1B_SS0_B__UART3_TX                          0x01B8 0x0500 0x0000 0x1 0x0
+#define MX6SX_PAD_QSPI1B_SS0_B__ECSPI3_SS0                        0x01B8 0x0500 0x073C 0x2 0x1
+#define MX6SX_PAD_QSPI1B_SS0_B__ESAI_TX_HF_CLK                    0x01B8 0x0500 0x0784 0x3 0x3
+#define MX6SX_PAD_QSPI1B_SS0_B__CSI1_DATA_17                      0x01B8 0x0500 0x06E0 0x4 0x1
+#define MX6SX_PAD_QSPI1B_SS0_B__GPIO4_IO_30                       0x01B8 0x0500 0x0000 0x5 0x0
+#define MX6SX_PAD_QSPI1B_SS0_B__WEIM_DATA_9                       0x01B8 0x0500 0x0000 0x6 0x0
+#define MX6SX_PAD_QSPI1B_SS0_B__SIM_M_HADDR_10                    0x01B8 0x0500 0x0000 0x7 0x0
+#define MX6SX_PAD_QSPI1B_SS1_B__QSPI1_B_SS1_B                     0x01BC 0x0504 0x0000 0x0 0x0
+#define MX6SX_PAD_QSPI1B_SS1_B__CAN2_RX                           0x01BC 0x0504 0x0690 0x1 0x2
+#define MX6SX_PAD_QSPI1B_SS1_B__CANFD_RX2                         0x01BC 0x0504 0x0698 0x2 0x2
+#define MX6SX_PAD_QSPI1B_SS1_B__ECSPI5_SCLK                       0x01BC 0x0504 0x0750 0x3 0x1
+#define MX6SX_PAD_QSPI1B_SS1_B__CSI1_DATA_18                      0x01BC 0x0504 0x06E4 0x4 0x1
+#define MX6SX_PAD_QSPI1B_SS1_B__GPIO4_IO_31                       0x01BC 0x0504 0x0000 0x5 0x0
+#define MX6SX_PAD_QSPI1B_SS1_B__WEIM_DATA_10                      0x01BC 0x0504 0x0000 0x6 0x0
+#define MX6SX_PAD_QSPI1B_SS1_B__SIM_M_HADDR_14                    0x01BC 0x0504 0x0000 0x7 0x0
+#define MX6SX_PAD_RGMII1_RD0__ENET1_RX_DATA_0                     0x01C0 0x0508 0x0000 0x0 0x0
+#define MX6SX_PAD_RGMII1_RD0__GPIO5_IO_0                          0x01C0 0x0508 0x0000 0x5 0x0
+#define MX6SX_PAD_RGMII1_RD0__CSI2_DATA_10                        0x01C0 0x0508 0x0000 0x6 0x0
+#define MX6SX_PAD_RGMII1_RD0__ANATOP_TESTI_0                      0x01C0 0x0508 0x0000 0x7 0x0
+#define MX6SX_PAD_RGMII1_RD0__RAWNAND_TESTER_TRIGGER              0x01C0 0x0508 0x0000 0x8 0x0
+#define MX6SX_PAD_RGMII1_RD0__PCIE_CTRL_DEBUG_0                   0x01C0 0x0508 0x0000 0x9 0x0
+#define MX6SX_PAD_RGMII1_RD1__ENET1_RX_DATA_1                     0x01C4 0x050C 0x0000 0x0 0x0
+#define MX6SX_PAD_RGMII1_RD1__GPIO5_IO_1                          0x01C4 0x050C 0x0000 0x5 0x0
+#define MX6SX_PAD_RGMII1_RD1__CSI2_DATA_11                        0x01C4 0x050C 0x0000 0x6 0x0
+#define MX6SX_PAD_RGMII1_RD1__ANATOP_TESTI_1                      0x01C4 0x050C 0x0000 0x7 0x0
+#define MX6SX_PAD_RGMII1_RD1__USDHC1_TESTER_TRIGGER               0x01C4 0x050C 0x0000 0x8 0x0
+#define MX6SX_PAD_RGMII1_RD1__PCIE_CTRL_DEBUG_1                   0x01C4 0x050C 0x0000 0x9 0x0
+#define MX6SX_PAD_RGMII1_RD2__ENET1_RX_DATA_2                     0x01C8 0x0510 0x0000 0x0 0x0
+#define MX6SX_PAD_RGMII1_RD2__GPIO5_IO_2                          0x01C8 0x0510 0x0000 0x5 0x0
+#define MX6SX_PAD_RGMII1_RD2__CSI2_DATA_12                        0x01C8 0x0510 0x0000 0x6 0x0
+#define MX6SX_PAD_RGMII1_RD2__ANATOP_TESTI_2                      0x01C8 0x0510 0x0000 0x7 0x0
+#define MX6SX_PAD_RGMII1_RD2__USDHC2_TESTER_TRIGGER               0x01C8 0x0510 0x0000 0x8 0x0
+#define MX6SX_PAD_RGMII1_RD2__PCIE_CTRL_DEBUG_2                   0x01C8 0x0510 0x0000 0x9 0x0
+#define MX6SX_PAD_RGMII1_RD3__ENET1_RX_DATA_3                     0x01CC 0x0514 0x0000 0x0 0x0
+#define MX6SX_PAD_RGMII1_RD3__GPIO5_IO_3                          0x01CC 0x0514 0x0000 0x5 0x0
+#define MX6SX_PAD_RGMII1_RD3__CSI2_DATA_13                        0x01CC 0x0514 0x0000 0x6 0x0
+#define MX6SX_PAD_RGMII1_RD3__ANATOP_TESTI_3                      0x01CC 0x0514 0x0000 0x7 0x0
+#define MX6SX_PAD_RGMII1_RD3__USDHC3_TESTER_TRIGGER               0x01CC 0x0514 0x0000 0x8 0x0
+#define MX6SX_PAD_RGMII1_RD3__PCIE_CTRL_DEBUG_3                   0x01CC 0x0514 0x0000 0x9 0x0
+#define MX6SX_PAD_RGMII1_RX_CTL__ENET1_RX_EN                      0x01D0 0x0518 0x0000 0x0 0x0
+#define MX6SX_PAD_RGMII1_RX_CTL__GPIO5_IO_4                       0x01D0 0x0518 0x0000 0x5 0x0
+#define MX6SX_PAD_RGMII1_RX_CTL__CSI2_DATA_14                     0x01D0 0x0518 0x0000 0x6 0x0
+#define MX6SX_PAD_RGMII1_RX_CTL__ANATOP_TESTO_0                   0x01D0 0x0518 0x0000 0x7 0x0
+#define MX6SX_PAD_RGMII1_RX_CTL__USDHC4_TESTER_TRIGGER            0x01D0 0x0518 0x0000 0x8 0x0
+#define MX6SX_PAD_RGMII1_RX_CTL__PCIE_CTRL_DEBUG_4                0x01D0 0x0518 0x0000 0x9 0x0
+#define MX6SX_PAD_RGMII1_RXC__ENET1_RX_CLK                        0x01D4 0x051C 0x0768 0x0 0x1
+#define MX6SX_PAD_RGMII1_RXC__ENET1_RX_ER                         0x01D4 0x051C 0x0000 0x1 0x0
+#define MX6SX_PAD_RGMII1_RXC__GPIO5_IO_5                          0x01D4 0x051C 0x0000 0x5 0x0
+#define MX6SX_PAD_RGMII1_RXC__CSI2_DATA_15                        0x01D4 0x051C 0x0000 0x6 0x0
+#define MX6SX_PAD_RGMII1_RXC__ANATOP_TESTO_1                      0x01D4 0x051C 0x0000 0x7 0x0
+#define MX6SX_PAD_RGMII1_RXC__ECSPI1_TESTER_TRIGGER               0x01D4 0x051C 0x0000 0x8 0x0
+#define MX6SX_PAD_RGMII1_RXC__PCIE_CTRL_DEBUG_5                   0x01D4 0x051C 0x0000 0x9 0x0
+#define MX6SX_PAD_RGMII1_TD0__ENET1_TX_DATA_0                     0x01D8 0x0520 0x0000 0x0 0x0
+#define MX6SX_PAD_RGMII1_TD0__SAI2_RX_SYNC                        0x01D8 0x0520 0x0810 0x2 0x1
+#define MX6SX_PAD_RGMII1_TD0__GPIO5_IO_6                          0x01D8 0x0520 0x0000 0x5 0x0
+#define MX6SX_PAD_RGMII1_TD0__CSI2_DATA_16                        0x01D8 0x0520 0x0000 0x6 0x0
+#define MX6SX_PAD_RGMII1_TD0__ANATOP_TESTO_2                      0x01D8 0x0520 0x0000 0x7 0x0
+#define MX6SX_PAD_RGMII1_TD0__ECSPI2_TESTER_TRIGGER               0x01D8 0x0520 0x0000 0x8 0x0
+#define MX6SX_PAD_RGMII1_TD0__PCIE_CTRL_DEBUG_6                   0x01D8 0x0520 0x0000 0x9 0x0
+#define MX6SX_PAD_RGMII1_TD1__ENET1_TX_DATA_1                     0x01DC 0x0524 0x0000 0x0 0x0
+#define MX6SX_PAD_RGMII1_TD1__SAI2_RX_BCLK                        0x01DC 0x0524 0x0808 0x2 0x1
+#define MX6SX_PAD_RGMII1_TD1__GPIO5_IO_7                          0x01DC 0x0524 0x0000 0x5 0x0
+#define MX6SX_PAD_RGMII1_TD1__CSI2_DATA_17                        0x01DC 0x0524 0x0000 0x6 0x0
+#define MX6SX_PAD_RGMII1_TD1__ANATOP_TESTO_3                      0x01DC 0x0524 0x0000 0x7 0x0
+#define MX6SX_PAD_RGMII1_TD1__ECSPI3_TESTER_TRIGGER               0x01DC 0x0524 0x0000 0x8 0x0
+#define MX6SX_PAD_RGMII1_TD1__PCIE_CTRL_DEBUG_7                   0x01DC 0x0524 0x0000 0x9 0x0
+#define MX6SX_PAD_RGMII1_TD2__ENET1_TX_DATA_2                     0x01E0 0x0528 0x0000 0x0 0x0
+#define MX6SX_PAD_RGMII1_TD2__SAI2_TX_SYNC                        0x01E0 0x0528 0x0818 0x2 0x1
+#define MX6SX_PAD_RGMII1_TD2__GPIO5_IO_8                          0x01E0 0x0528 0x0000 0x5 0x0
+#define MX6SX_PAD_RGMII1_TD2__CSI2_DATA_18                        0x01E0 0x0528 0x0000 0x6 0x0
+#define MX6SX_PAD_RGMII1_TD2__ANATOP_TESTO_4                      0x01E0 0x0528 0x0000 0x7 0x0
+#define MX6SX_PAD_RGMII1_TD2__ECSPI4_TESTER_TRIGGER               0x01E0 0x0528 0x0000 0x8 0x0
+#define MX6SX_PAD_RGMII1_TD2__PCIE_CTRL_DEBUG_8                   0x01E0 0x0528 0x0000 0x9 0x0
+#define MX6SX_PAD_RGMII1_TD3__ENET1_TX_DATA_3                     0x01E4 0x052C 0x0000 0x0 0x0
+#define MX6SX_PAD_RGMII1_TD3__SAI2_TX_BCLK                        0x01E4 0x052C 0x0814 0x2 0x1
+#define MX6SX_PAD_RGMII1_TD3__GPIO5_IO_9                          0x01E4 0x052C 0x0000 0x5 0x0
+#define MX6SX_PAD_RGMII1_TD3__CSI2_DATA_19                        0x01E4 0x052C 0x0000 0x6 0x0
+#define MX6SX_PAD_RGMII1_TD3__ANATOP_TESTO_5                      0x01E4 0x052C 0x0000 0x7 0x0
+#define MX6SX_PAD_RGMII1_TD3__ECSPI5_TESTER_TRIGGER               0x01E4 0x052C 0x0000 0x8 0x0
+#define MX6SX_PAD_RGMII1_TD3__PCIE_CTRL_DEBUG_9                   0x01E4 0x052C 0x0000 0x9 0x0
+#define MX6SX_PAD_RGMII1_TX_CTL__ENET1_TX_EN                      0x01E8 0x0530 0x0000 0x0 0x0
+#define MX6SX_PAD_RGMII1_TX_CTL__SAI2_RX_DATA_0                   0x01E8 0x0530 0x080C 0x2 0x1
+#define MX6SX_PAD_RGMII1_TX_CTL__GPIO5_IO_10                      0x01E8 0x0530 0x0000 0x5 0x0
+#define MX6SX_PAD_RGMII1_TX_CTL__CSI2_DATA_0                      0x01E8 0x0530 0x0000 0x6 0x0
+#define MX6SX_PAD_RGMII1_TX_CTL__ANATOP_TESTO_6                   0x01E8 0x0530 0x0000 0x7 0x0
+#define MX6SX_PAD_RGMII1_TX_CTL__QSPI1_TESTER_TRIGGER             0x01E8 0x0530 0x0000 0x8 0x0
+#define MX6SX_PAD_RGMII1_TX_CTL__PCIE_CTRL_DEBUG_10               0x01E8 0x0530 0x0000 0x9 0x0
+#define MX6SX_PAD_RGMII1_TXC__ENET1_RGMII_TXC                     0x01EC 0x0534 0x0000 0x0 0x0
+#define MX6SX_PAD_RGMII1_TXC__ENET1_TX_ER                         0x01EC 0x0534 0x0000 0x1 0x0
+#define MX6SX_PAD_RGMII1_TXC__SAI2_TX_DATA_0                      0x01EC 0x0534 0x0000 0x2 0x0
+#define MX6SX_PAD_RGMII1_TXC__GPIO5_IO_11                         0x01EC 0x0534 0x0000 0x5 0x0
+#define MX6SX_PAD_RGMII1_TXC__CSI2_DATA_1                         0x01EC 0x0534 0x0000 0x6 0x0
+#define MX6SX_PAD_RGMII1_TXC__ANATOP_TESTO_7                      0x01EC 0x0534 0x0000 0x7 0x0
+#define MX6SX_PAD_RGMII1_TXC__QSPI2_TESTER_TRIGGER                0x01EC 0x0534 0x0000 0x8 0x0
+#define MX6SX_PAD_RGMII1_TXC__PCIE_CTRL_DEBUG_11                  0x01EC 0x0534 0x0000 0x9 0x0
+#define MX6SX_PAD_RGMII2_RD0__ENET2_RX_DATA_0                     0x01F0 0x0538 0x0000 0x0 0x0
+#define MX6SX_PAD_RGMII2_RD0__PWM4_OUT                            0x01F0 0x0538 0x0000 0x2 0x0
+#define MX6SX_PAD_RGMII2_RD0__GPIO5_IO_12                         0x01F0 0x0538 0x0000 0x5 0x0
+#define MX6SX_PAD_RGMII2_RD0__CSI2_DATA_2                         0x01F0 0x0538 0x0000 0x6 0x0
+#define MX6SX_PAD_RGMII2_RD0__ANATOP_TESTO_8                      0x01F0 0x0538 0x0000 0x7 0x0
+#define MX6SX_PAD_RGMII2_RD0__VDEC_DEBUG_18                       0x01F0 0x0538 0x0000 0x8 0x0
+#define MX6SX_PAD_RGMII2_RD0__PCIE_CTRL_DEBUG_12                  0x01F0 0x0538 0x0000 0x9 0x0
+#define MX6SX_PAD_RGMII2_RD1__ENET2_RX_DATA_1                     0x01F4 0x053C 0x0000 0x0 0x0
+#define MX6SX_PAD_RGMII2_RD1__PWM3_OUT                            0x01F4 0x053C 0x0000 0x2 0x0
+#define MX6SX_PAD_RGMII2_RD1__GPIO5_IO_13                         0x01F4 0x053C 0x0000 0x5 0x0
+#define MX6SX_PAD_RGMII2_RD1__CSI2_DATA_3                         0x01F4 0x053C 0x0000 0x6 0x0
+#define MX6SX_PAD_RGMII2_RD1__ANATOP_TESTO_9                      0x01F4 0x053C 0x0000 0x7 0x0
+#define MX6SX_PAD_RGMII2_RD1__VDEC_DEBUG_19                       0x01F4 0x053C 0x0000 0x8 0x0
+#define MX6SX_PAD_RGMII2_RD1__PCIE_CTRL_DEBUG_13                  0x01F4 0x053C 0x0000 0x9 0x0
+#define MX6SX_PAD_RGMII2_RD2__ENET2_RX_DATA_2                     0x01F8 0x0540 0x0000 0x0 0x0
+#define MX6SX_PAD_RGMII2_RD2__PWM2_OUT                            0x01F8 0x0540 0x0000 0x2 0x0
+#define MX6SX_PAD_RGMII2_RD2__GPIO5_IO_14                         0x01F8 0x0540 0x0000 0x5 0x0
+#define MX6SX_PAD_RGMII2_RD2__CSI2_DATA_4                         0x01F8 0x0540 0x0000 0x6 0x0
+#define MX6SX_PAD_RGMII2_RD2__ANATOP_TESTO_10                     0x01F8 0x0540 0x0000 0x7 0x0
+#define MX6SX_PAD_RGMII2_RD2__VDEC_DEBUG_20                       0x01F8 0x0540 0x0000 0x8 0x0
+#define MX6SX_PAD_RGMII2_RD2__PCIE_CTRL_DEBUG_14                  0x01F8 0x0540 0x0000 0x9 0x0
+#define MX6SX_PAD_RGMII2_RD3__ENET2_RX_DATA_3                     0x01FC 0x0544 0x0000 0x0 0x0
+#define MX6SX_PAD_RGMII2_RD3__PWM1_OUT                            0x01FC 0x0544 0x0000 0x2 0x0
+#define MX6SX_PAD_RGMII2_RD3__GPIO5_IO_15                         0x01FC 0x0544 0x0000 0x5 0x0
+#define MX6SX_PAD_RGMII2_RD3__CSI2_DATA_5                         0x01FC 0x0544 0x0000 0x6 0x0
+#define MX6SX_PAD_RGMII2_RD3__ANATOP_TESTO_11                     0x01FC 0x0544 0x0000 0x7 0x0
+#define MX6SX_PAD_RGMII2_RD3__VDEC_DEBUG_21                       0x01FC 0x0544 0x0000 0x8 0x0
+#define MX6SX_PAD_RGMII2_RD3__PCIE_CTRL_DEBUG_15                  0x01FC 0x0544 0x0000 0x9 0x0
+#define MX6SX_PAD_RGMII2_RX_CTL__ENET2_RX_EN                      0x0200 0x0548 0x0000 0x0 0x0
+#define MX6SX_PAD_RGMII2_RX_CTL__GPIO5_IO_16                      0x0200 0x0548 0x0000 0x5 0x0
+#define MX6SX_PAD_RGMII2_RX_CTL__CSI2_DATA_6                      0x0200 0x0548 0x0000 0x6 0x0
+#define MX6SX_PAD_RGMII2_RX_CTL__ANATOP_TESTO_12                  0x0200 0x0548 0x0000 0x7 0x0
+#define MX6SX_PAD_RGMII2_RX_CTL__VDEC_DEBUG_22                    0x0200 0x0548 0x0000 0x8 0x0
+#define MX6SX_PAD_RGMII2_RX_CTL__PCIE_CTRL_DEBUG_16               0x0200 0x0548 0x0000 0x9 0x0
+#define MX6SX_PAD_RGMII2_RXC__ENET2_RX_CLK                        0x0204 0x054C 0x0774 0x0 0x1
+#define MX6SX_PAD_RGMII2_RXC__ENET2_RX_ER                         0x0204 0x054C 0x0000 0x1 0x0
+#define MX6SX_PAD_RGMII2_RXC__GPIO5_IO_17                         0x0204 0x054C 0x0000 0x5 0x0
+#define MX6SX_PAD_RGMII2_RXC__CSI2_DATA_7                         0x0204 0x054C 0x0000 0x6 0x0
+#define MX6SX_PAD_RGMII2_RXC__ANATOP_TESTO_13                     0x0204 0x054C 0x0000 0x7 0x0
+#define MX6SX_PAD_RGMII2_RXC__VDEC_DEBUG_23                       0x0204 0x054C 0x0000 0x8 0x0
+#define MX6SX_PAD_RGMII2_RXC__PCIE_CTRL_DEBUG_17                  0x0204 0x054C 0x0000 0x9 0x0
+#define MX6SX_PAD_RGMII2_TD0__ENET2_TX_DATA_0                     0x0208 0x0550 0x0000 0x0 0x0
+#define MX6SX_PAD_RGMII2_TD0__SAI1_RX_SYNC                        0x0208 0x0550 0x07FC 0x2 0x1
+#define MX6SX_PAD_RGMII2_TD0__PWM8_OUT                            0x0208 0x0550 0x0000 0x3 0x0
+#define MX6SX_PAD_RGMII2_TD0__GPIO5_IO_18                         0x0208 0x0550 0x0000 0x5 0x0
+#define MX6SX_PAD_RGMII2_TD0__CSI2_DATA_8                         0x0208 0x0550 0x0000 0x6 0x0
+#define MX6SX_PAD_RGMII2_TD0__ANATOP_TESTO_14                     0x0208 0x0550 0x0000 0x7 0x0
+#define MX6SX_PAD_RGMII2_TD0__VDEC_DEBUG_24                       0x0208 0x0550 0x0000 0x8 0x0
+#define MX6SX_PAD_RGMII2_TD0__PCIE_CTRL_DEBUG_18                  0x0208 0x0550 0x0000 0x9 0x0
+#define MX6SX_PAD_RGMII2_TD1__ENET2_TX_DATA_1                     0x020C 0x0554 0x0000 0x0 0x0
+#define MX6SX_PAD_RGMII2_TD1__SAI1_RX_BCLK                        0x020C 0x0554 0x07F4 0x2 0x1
+#define MX6SX_PAD_RGMII2_TD1__PWM7_OUT                            0x020C 0x0554 0x0000 0x3 0x0
+#define MX6SX_PAD_RGMII2_TD1__GPIO5_IO_19                         0x020C 0x0554 0x0000 0x5 0x0
+#define MX6SX_PAD_RGMII2_TD1__CSI2_DATA_9                         0x020C 0x0554 0x0000 0x6 0x0
+#define MX6SX_PAD_RGMII2_TD1__ANATOP_TESTO_15                     0x020C 0x0554 0x0000 0x7 0x0
+#define MX6SX_PAD_RGMII2_TD1__VDEC_DEBUG_25                       0x020C 0x0554 0x0000 0x8 0x0
+#define MX6SX_PAD_RGMII2_TD1__PCIE_CTRL_DEBUG_19                  0x020C 0x0554 0x0000 0x9 0x0
+#define MX6SX_PAD_RGMII2_TD2__ENET2_TX_DATA_2                     0x0210 0x0558 0x0000 0x0 0x0
+#define MX6SX_PAD_RGMII2_TD2__SAI1_TX_SYNC                        0x0210 0x0558 0x0804 0x2 0x1
+#define MX6SX_PAD_RGMII2_TD2__PWM6_OUT                            0x0210 0x0558 0x0000 0x3 0x0
+#define MX6SX_PAD_RGMII2_TD2__GPIO5_IO_20                         0x0210 0x0558 0x0000 0x5 0x0
+#define MX6SX_PAD_RGMII2_TD2__CSI2_VSYNC                          0x0210 0x0558 0x0000 0x6 0x0
+#define MX6SX_PAD_RGMII2_TD2__SJC_FAIL                            0x0210 0x0558 0x0000 0x7 0x0
+#define MX6SX_PAD_RGMII2_TD2__VDEC_DEBUG_26                       0x0210 0x0558 0x0000 0x8 0x0
+#define MX6SX_PAD_RGMII2_TD2__PCIE_CTRL_DEBUG_20                  0x0210 0x0558 0x0000 0x9 0x0
+#define MX6SX_PAD_RGMII2_TD3__ENET2_TX_DATA_3                     0x0214 0x055C 0x0000 0x0 0x0
+#define MX6SX_PAD_RGMII2_TD3__SAI1_TX_BCLK                        0x0214 0x055C 0x0800 0x2 0x1
+#define MX6SX_PAD_RGMII2_TD3__PWM5_OUT                            0x0214 0x055C 0x0000 0x3 0x0
+#define MX6SX_PAD_RGMII2_TD3__GPIO5_IO_21                         0x0214 0x055C 0x0000 0x5 0x0
+#define MX6SX_PAD_RGMII2_TD3__CSI2_HSYNC                          0x0214 0x055C 0x0000 0x6 0x0
+#define MX6SX_PAD_RGMII2_TD3__SJC_JTAG_ACT                        0x0214 0x055C 0x0000 0x7 0x0
+#define MX6SX_PAD_RGMII2_TD3__VDEC_DEBUG_27                       0x0214 0x055C 0x0000 0x8 0x0
+#define MX6SX_PAD_RGMII2_TD3__PCIE_CTRL_DEBUG_21                  0x0214 0x055C 0x0000 0x9 0x0
+#define MX6SX_PAD_RGMII2_TX_CTL__ENET2_TX_EN                      0x0218 0x0560 0x0000 0x0 0x0
+#define MX6SX_PAD_RGMII2_TX_CTL__SAI1_RX_DATA_0                   0x0218 0x0560 0x07F8 0x2 0x1
+#define MX6SX_PAD_RGMII2_TX_CTL__GPIO5_IO_22                      0x0218 0x0560 0x0000 0x5 0x0
+#define MX6SX_PAD_RGMII2_TX_CTL__CSI2_FIELD                       0x0218 0x0560 0x0000 0x6 0x0
+#define MX6SX_PAD_RGMII2_TX_CTL__SJC_DE_B                         0x0218 0x0560 0x0000 0x7 0x0
+#define MX6SX_PAD_RGMII2_TX_CTL__VDEC_DEBUG_28                    0x0218 0x0560 0x0000 0x8 0x0
+#define MX6SX_PAD_RGMII2_TX_CTL__PCIE_CTRL_DEBUG_22               0x0218 0x0560 0x0000 0x9 0x0
+#define MX6SX_PAD_RGMII2_TXC__ENET2_RGMII_TXC                     0x021C 0x0564 0x0000 0x0 0x0
+#define MX6SX_PAD_RGMII2_TXC__ENET2_TX_ER                         0x021C 0x0564 0x0000 0x1 0x0
+#define MX6SX_PAD_RGMII2_TXC__SAI1_TX_DATA_0                      0x021C 0x0564 0x0000 0x2 0x0
+#define MX6SX_PAD_RGMII2_TXC__GPIO5_IO_23                         0x021C 0x0564 0x0000 0x5 0x0
+#define MX6SX_PAD_RGMII2_TXC__CSI2_PIXCLK                         0x021C 0x0564 0x0000 0x6 0x0
+#define MX6SX_PAD_RGMII2_TXC__SJC_DONE                            0x021C 0x0564 0x0000 0x7 0x0
+#define MX6SX_PAD_RGMII2_TXC__VDEC_DEBUG_29                       0x021C 0x0564 0x0000 0x8 0x0
+#define MX6SX_PAD_RGMII2_TXC__PCIE_CTRL_DEBUG_23                  0x021C 0x0564 0x0000 0x9 0x0
+#define MX6SX_PAD_SD1_CLK__USDHC1_CLK                             0x0220 0x0568 0x0000 0x0 0x0
+#define MX6SX_PAD_SD1_CLK__AUDMUX_AUD5_RXFS                       0x0220 0x0568 0x0668 0x1 0x1
+#define MX6SX_PAD_SD1_CLK__WDOG2_WDOG_B                           0x0220 0x0568 0x0000 0x2 0x0
+#define MX6SX_PAD_SD1_CLK__GPT_CLK                                0x0220 0x0568 0x0000 0x3 0x0
+#define MX6SX_PAD_SD1_CLK__WDOG2_WDOG_RST_B_DEB                   0x0220 0x0568 0x0000 0x4 0x0
+#define MX6SX_PAD_SD1_CLK__GPIO6_IO_0                             0x0220 0x0568 0x0000 0x5 0x0
+#define MX6SX_PAD_SD1_CLK__ENET2_1588_EVENT1_OUT                  0x0220 0x0568 0x0000 0x6 0x0
+#define MX6SX_PAD_SD1_CLK__CCM_OUT1                               0x0220 0x0568 0x0000 0x7 0x0
+#define MX6SX_PAD_SD1_CLK__VADC_ADC_PROC_CLK                      0x0220 0x0568 0x0000 0x8 0x0
+#define MX6SX_PAD_SD1_CLK__MMDC_DEBUG_45                          0x0220 0x0568 0x0000 0x9 0x0
+#define MX6SX_PAD_SD1_CMD__USDHC1_CMD                             0x0224 0x056C 0x0000 0x0 0x0
+#define MX6SX_PAD_SD1_CMD__AUDMUX_AUD5_RXC                        0x0224 0x056C 0x0664 0x1 0x1
+#define MX6SX_PAD_SD1_CMD__WDOG1_WDOG_B                           0x0224 0x056C 0x0000 0x2 0x0
+#define MX6SX_PAD_SD1_CMD__GPT_COMPARE1                           0x0224 0x056C 0x0000 0x3 0x0
+#define MX6SX_PAD_SD1_CMD__WDOG1_WDOG_RST_B_DEB                   0x0224 0x056C 0x0000 0x4 0x0
+#define MX6SX_PAD_SD1_CMD__GPIO6_IO_1                             0x0224 0x056C 0x0000 0x5 0x0
+#define MX6SX_PAD_SD1_CMD__ENET2_1588_EVENT1_IN                   0x0224 0x056C 0x0000 0x6 0x0
+#define MX6SX_PAD_SD1_CMD__CCM_CLKO1                              0x0224 0x056C 0x0000 0x7 0x0
+#define MX6SX_PAD_SD1_CMD__VADC_EXT_SYSCLK                        0x0224 0x056C 0x0000 0x8 0x0
+#define MX6SX_PAD_SD1_CMD__MMDC_DEBUG_46                          0x0224 0x056C 0x0000 0x9 0x0
+#define MX6SX_PAD_SD1_DATA0__USDHC1_DATA0                         0x0228 0x0570 0x0000 0x0 0x0
+#define MX6SX_PAD_SD1_DATA0__AUDMUX_AUD5_RXD                      0x0228 0x0570 0x065C 0x1 0x1
+#define MX6SX_PAD_SD1_DATA0__CAAM_WRAPPER_RNG_OSC_OBS             0x0228 0x0570 0x0000 0x2 0x0
+#define MX6SX_PAD_SD1_DATA0__GPT_CAPTURE1                         0x0228 0x0570 0x0000 0x3 0x0
+#define MX6SX_PAD_SD1_DATA0__UART2_RX                             0x0228 0x0570 0x0838 0x4 0x2
+#define MX6SX_PAD_SD1_DATA0__UART2_TX                             0x0228 0x0570 0x0000 0x4 0x0
+#define MX6SX_PAD_SD1_DATA0__GPIO6_IO_2                           0x0228 0x0570 0x0000 0x5 0x0
+#define MX6SX_PAD_SD1_DATA0__ENET1_1588_EVENT1_IN                 0x0228 0x0570 0x0000 0x6 0x0
+#define MX6SX_PAD_SD1_DATA0__CCM_OUT2                             0x0228 0x0570 0x0000 0x7 0x0
+#define MX6SX_PAD_SD1_DATA0__VADC_CLAMP_UP                        0x0228 0x0570 0x0000 0x8 0x0
+#define MX6SX_PAD_SD1_DATA0__MMDC_DEBUG_48                        0x0228 0x0570 0x0000 0x9 0x0
+#define MX6SX_PAD_SD1_DATA1__USDHC1_DATA1                         0x022C 0x0574 0x0000 0x0 0x0
+#define MX6SX_PAD_SD1_DATA1__AUDMUX_AUD5_TXC                      0x022C 0x0574 0x066C 0x1 0x1
+#define MX6SX_PAD_SD1_DATA1__PWM4_OUT                             0x022C 0x0574 0x0000 0x2 0x0
+#define MX6SX_PAD_SD1_DATA1__GPT_CAPTURE2                         0x022C 0x0574 0x0000 0x3 0x0
+#define MX6SX_PAD_SD1_DATA1__UART2_RX                             0x022C 0x0574 0x0838 0x4 0x3
+#define MX6SX_PAD_SD1_DATA1__UART2_TX                             0x022C 0x0574 0x0000 0x4 0x0
+#define MX6SX_PAD_SD1_DATA1__GPIO6_IO_3                           0x022C 0x0574 0x0000 0x5 0x0
+#define MX6SX_PAD_SD1_DATA1__ENET1_1588_EVENT1_OUT                0x022C 0x0574 0x0000 0x6 0x0
+#define MX6SX_PAD_SD1_DATA1__CCM_CLKO2                            0x022C 0x0574 0x0000 0x7 0x0
+#define MX6SX_PAD_SD1_DATA1__VADC_CLAMP_DOWN                      0x022C 0x0574 0x0000 0x8 0x0
+#define MX6SX_PAD_SD1_DATA1__MMDC_DEBUG_47                        0x022C 0x0574 0x0000 0x9 0x0
+#define MX6SX_PAD_SD1_DATA2__USDHC1_DATA2                         0x0230 0x0578 0x0000 0x0 0x0
+#define MX6SX_PAD_SD1_DATA2__AUDMUX_AUD5_TXFS                     0x0230 0x0578 0x0670 0x1 0x1
+#define MX6SX_PAD_SD1_DATA2__PWM3_OUT                             0x0230 0x0578 0x0000 0x2 0x0
+#define MX6SX_PAD_SD1_DATA2__GPT_COMPARE2                         0x0230 0x0578 0x0000 0x3 0x0
+#define MX6SX_PAD_SD1_DATA2__UART2_CTS_B                          0x0230 0x0578 0x0834 0x4 0x2
+#define MX6SX_PAD_SD1_DATA2__GPIO6_IO_4                           0x0230 0x0578 0x0000 0x5 0x0
+#define MX6SX_PAD_SD1_DATA2__ECSPI4_RDY                           0x0230 0x0578 0x0000 0x6 0x0
+#define MX6SX_PAD_SD1_DATA2__CCM_OUT0                             0x0230 0x0578 0x0000 0x7 0x0
+#define MX6SX_PAD_SD1_DATA2__VADC_EXT_PD_N                        0x0230 0x0578 0x0000 0x8 0x0
+#define MX6SX_PAD_SD1_DATA3__USDHC1_DATA3                         0x0234 0x057C 0x0000 0x0 0x0
+#define MX6SX_PAD_SD1_DATA3__AUDMUX_AUD5_TXD                      0x0234 0x057C 0x0660 0x1 0x1
+#define MX6SX_PAD_SD1_DATA3__AUDMUX_AUD5_RXD                      0x0234 0x057C 0x065C 0x2 0x2
+#define MX6SX_PAD_SD1_DATA3__GPT_COMPARE3                         0x0234 0x057C 0x0000 0x3 0x0
+#define MX6SX_PAD_SD1_DATA3__UART2_RTS_B                          0x0234 0x057C 0x0834 0x4 0x3
+#define MX6SX_PAD_SD1_DATA3__GPIO6_IO_5                           0x0234 0x057C 0x0000 0x5 0x0
+#define MX6SX_PAD_SD1_DATA3__ECSPI4_SS1                           0x0234 0x057C 0x0000 0x6 0x0
+#define MX6SX_PAD_SD1_DATA3__CCM_PMIC_RDY                         0x0234 0x057C 0x069C 0x7 0x2
+#define MX6SX_PAD_SD1_DATA3__VADC_RST_N                           0x0234 0x057C 0x0000 0x8 0x0
+#define MX6SX_PAD_SD2_CLK__USDHC2_CLK                             0x0238 0x0580 0x0000 0x0 0x0
+#define MX6SX_PAD_SD2_CLK__AUDMUX_AUD6_RXFS                       0x0238 0x0580 0x0680 0x1 0x2
+#define MX6SX_PAD_SD2_CLK__KPP_COL_5                              0x0238 0x0580 0x07C8 0x2 0x1
+#define MX6SX_PAD_SD2_CLK__ECSPI4_SCLK                            0x0238 0x0580 0x0740 0x3 0x1
+#define MX6SX_PAD_SD2_CLK__MLB_SIG                                0x0238 0x0580 0x07F0 0x4 0x2
+#define MX6SX_PAD_SD2_CLK__GPIO6_IO_6                             0x0238 0x0580 0x0000 0x5 0x0
+#define MX6SX_PAD_SD2_CLK__MQS_RIGHT                              0x0238 0x0580 0x0000 0x6 0x0
+#define MX6SX_PAD_SD2_CLK__WDOG1_WDOG_ANY                         0x0238 0x0580 0x0000 0x7 0x0
+#define MX6SX_PAD_SD2_CLK__VADC_CLAMP_CURRENT_5                   0x0238 0x0580 0x0000 0x8 0x0
+#define MX6SX_PAD_SD2_CLK__MMDC_DEBUG_29                          0x0238 0x0580 0x0000 0x9 0x0
+#define MX6SX_PAD_SD2_CMD__USDHC2_CMD                             0x023C 0x0584 0x0000 0x0 0x0
+#define MX6SX_PAD_SD2_CMD__AUDMUX_AUD6_RXC                        0x023C 0x0584 0x067C 0x1 0x2
+#define MX6SX_PAD_SD2_CMD__KPP_ROW_5                              0x023C 0x0584 0x07D4 0x2 0x1
+#define MX6SX_PAD_SD2_CMD__ECSPI4_MOSI                            0x023C 0x0584 0x0748 0x3 0x1
+#define MX6SX_PAD_SD2_CMD__MLB_CLK                                0x023C 0x0584 0x07E8 0x4 0x2
+#define MX6SX_PAD_SD2_CMD__GPIO6_IO_7                             0x023C 0x0584 0x0000 0x5 0x0
+#define MX6SX_PAD_SD2_CMD__MQS_LEFT                               0x023C 0x0584 0x0000 0x6 0x0
+#define MX6SX_PAD_SD2_CMD__WDOG3_WDOG_B                           0x023C 0x0584 0x0000 0x7 0x0
+#define MX6SX_PAD_SD2_CMD__VADC_CLAMP_CURRENT_4                   0x023C 0x0584 0x0000 0x8 0x0
+#define MX6SX_PAD_SD2_CMD__MMDC_DEBUG_30                          0x023C 0x0584 0x0000 0x9 0x0
+#define MX6SX_PAD_SD2_DATA0__USDHC2_DATA0                         0x0240 0x0588 0x0000 0x0 0x0
+#define MX6SX_PAD_SD2_DATA0__AUDMUX_AUD6_RXD                      0x0240 0x0588 0x0674 0x1 0x2
+#define MX6SX_PAD_SD2_DATA0__KPP_ROW_7                            0x0240 0x0588 0x07DC 0x2 0x1
+#define MX6SX_PAD_SD2_DATA0__PWM1_OUT                             0x0240 0x0588 0x0000 0x3 0x0
+#define MX6SX_PAD_SD2_DATA0__I2C4_SDA                             0x0240 0x0588 0x07C4 0x4 0x3
+#define MX6SX_PAD_SD2_DATA0__GPIO6_IO_8                           0x0240 0x0588 0x0000 0x5 0x0
+#define MX6SX_PAD_SD2_DATA0__ECSPI4_SS3                           0x0240 0x0588 0x0000 0x6 0x0
+#define MX6SX_PAD_SD2_DATA0__UART4_RX                             0x0240 0x0588 0x0848 0x7 0x4
+#define MX6SX_PAD_SD2_DATA0__UART4_TX                             0x0240 0x0588 0x0000 0x7 0x0
+#define MX6SX_PAD_SD2_DATA0__VADC_CLAMP_CURRENT_0                 0x0240 0x0588 0x0000 0x8 0x0
+#define MX6SX_PAD_SD2_DATA0__MMDC_DEBUG_50                        0x0240 0x0588 0x0000 0x9 0x0
+#define MX6SX_PAD_SD2_DATA1__USDHC2_DATA1                         0x0244 0x058C 0x0000 0x0 0x0
+#define MX6SX_PAD_SD2_DATA1__AUDMUX_AUD6_TXC                      0x0244 0x058C 0x0684 0x1 0x2
+#define MX6SX_PAD_SD2_DATA1__KPP_COL_7                            0x0244 0x058C 0x07D0 0x2 0x1
+#define MX6SX_PAD_SD2_DATA1__PWM2_OUT                             0x0244 0x058C 0x0000 0x3 0x0
+#define MX6SX_PAD_SD2_DATA1__I2C4_SCL                             0x0244 0x058C 0x07C0 0x4 0x3
+#define MX6SX_PAD_SD2_DATA1__GPIO6_IO_9                           0x0244 0x058C 0x0000 0x5 0x0
+#define MX6SX_PAD_SD2_DATA1__ECSPI4_SS2                           0x0244 0x058C 0x0000 0x6 0x0
+#define MX6SX_PAD_SD2_DATA1__UART4_RX                             0x0244 0x058C 0x0848 0x7 0x5
+#define MX6SX_PAD_SD2_DATA1__UART4_TX                             0x0244 0x058C 0x0000 0x7 0x0
+#define MX6SX_PAD_SD2_DATA1__VADC_CLAMP_CURRENT_1                 0x0244 0x058C 0x0000 0x8 0x0
+#define MX6SX_PAD_SD2_DATA1__MMDC_DEBUG_49                        0x0244 0x058C 0x0000 0x9 0x0
+#define MX6SX_PAD_SD2_DATA2__USDHC2_DATA2                         0x0248 0x0590 0x0000 0x0 0x0
+#define MX6SX_PAD_SD2_DATA2__AUDMUX_AUD6_TXFS                     0x0248 0x0590 0x0688 0x1 0x2
+#define MX6SX_PAD_SD2_DATA2__KPP_ROW_6                            0x0248 0x0590 0x07D8 0x2 0x1
+#define MX6SX_PAD_SD2_DATA2__ECSPI4_SS0                           0x0248 0x0590 0x074C 0x3 0x1
+#define MX6SX_PAD_SD2_DATA2__SDMA_EXT_EVENT_0                     0x0248 0x0590 0x081C 0x4 0x2
+#define MX6SX_PAD_SD2_DATA2__GPIO6_IO_10                          0x0248 0x0590 0x0000 0x5 0x0
+#define MX6SX_PAD_SD2_DATA2__SPDIF_OUT                            0x0248 0x0590 0x0000 0x6 0x0
+#define MX6SX_PAD_SD2_DATA2__UART6_RX                             0x0248 0x0590 0x0858 0x7 0x4
+#define MX6SX_PAD_SD2_DATA2__UART6_TX                             0x0248 0x0590 0x0000 0x7 0x0
+#define MX6SX_PAD_SD2_DATA2__VADC_CLAMP_CURRENT_2                 0x0248 0x0590 0x0000 0x8 0x0
+#define MX6SX_PAD_SD2_DATA2__MMDC_DEBUG_32                        0x0248 0x0590 0x0000 0x9 0x0
+#define MX6SX_PAD_SD2_DATA3__USDHC2_DATA3                         0x024C 0x0594 0x0000 0x0 0x0
+#define MX6SX_PAD_SD2_DATA3__AUDMUX_AUD6_TXD                      0x024C 0x0594 0x0678 0x1 0x2
+#define MX6SX_PAD_SD2_DATA3__KPP_COL_6                            0x024C 0x0594 0x07CC 0x2 0x1
+#define MX6SX_PAD_SD2_DATA3__ECSPI4_MISO                          0x024C 0x0594 0x0744 0x3 0x1
+#define MX6SX_PAD_SD2_DATA3__MLB_DATA                             0x024C 0x0594 0x07EC 0x4 0x2
+#define MX6SX_PAD_SD2_DATA3__GPIO6_IO_11                          0x024C 0x0594 0x0000 0x5 0x0
+#define MX6SX_PAD_SD2_DATA3__SPDIF_IN                             0x024C 0x0594 0x0824 0x6 0x4
+#define MX6SX_PAD_SD2_DATA3__UART6_RX                             0x024C 0x0594 0x0858 0x7 0x5
+#define MX6SX_PAD_SD2_DATA3__UART6_TX                             0x024C 0x0594 0x0000 0x7 0x0
+#define MX6SX_PAD_SD2_DATA3__VADC_CLAMP_CURRENT_3                 0x024C 0x0594 0x0000 0x8 0x0
+#define MX6SX_PAD_SD2_DATA3__MMDC_DEBUG_31                        0x024C 0x0594 0x0000 0x9 0x0
+#define MX6SX_PAD_SD3_CLK__USDHC3_CLK                             0x0250 0x0598 0x0000 0x0 0x0
+#define MX6SX_PAD_SD3_CLK__UART4_CTS_B                            0x0250 0x0598 0x0844 0x1 0x0
+#define MX6SX_PAD_SD3_CLK__ECSPI4_SCLK                            0x0250 0x0598 0x0740 0x2 0x0
+#define MX6SX_PAD_SD3_CLK__AUDMUX_AUD6_RXFS                       0x0250 0x0598 0x0680 0x3 0x0
+#define MX6SX_PAD_SD3_CLK__LCDIF2_VSYNC                           0x0250 0x0598 0x0000 0x4 0x0
+#define MX6SX_PAD_SD3_CLK__GPIO7_IO_0                             0x0250 0x0598 0x0000 0x5 0x0
+#define MX6SX_PAD_SD3_CLK__LCDIF2_BUSY                            0x0250 0x0598 0x07E4 0x6 0x0
+#define MX6SX_PAD_SD3_CLK__TPSMP_HDATA_29                         0x0250 0x0598 0x0000 0x7 0x0
+#define MX6SX_PAD_SD3_CLK__SDMA_DEBUG_EVENT_CHANNEL_5             0x0250 0x0598 0x0000 0x9 0x0
+#define MX6SX_PAD_SD3_CMD__USDHC3_CMD                             0x0254 0x059C 0x0000 0x0 0x0
+#define MX6SX_PAD_SD3_CMD__UART4_RX                               0x0254 0x059C 0x0848 0x1 0x0
+#define MX6SX_PAD_SD3_CMD__UART4_TX                               0x0254 0x059C 0x0000 0x1 0x0
+#define MX6SX_PAD_SD3_CMD__ECSPI4_MOSI                            0x0254 0x059C 0x0748 0x2 0x0
+#define MX6SX_PAD_SD3_CMD__AUDMUX_AUD6_RXC                        0x0254 0x059C 0x067C 0x3 0x0
+#define MX6SX_PAD_SD3_CMD__LCDIF2_HSYNC                           0x0254 0x059C 0x07E4 0x4 0x1
+#define MX6SX_PAD_SD3_CMD__GPIO7_IO_1                             0x0254 0x059C 0x0000 0x5 0x0
+#define MX6SX_PAD_SD3_CMD__LCDIF2_RS                              0x0254 0x059C 0x0000 0x6 0x0
+#define MX6SX_PAD_SD3_CMD__TPSMP_HDATA_28                         0x0254 0x059C 0x0000 0x7 0x0
+#define MX6SX_PAD_SD3_CMD__SDMA_DEBUG_EVENT_CHANNEL_4             0x0254 0x059C 0x0000 0x9 0x0
+#define MX6SX_PAD_SD3_DATA0__USDHC3_DATA0                         0x0258 0x05A0 0x0000 0x0 0x0
+#define MX6SX_PAD_SD3_DATA0__I2C4_SCL                             0x0258 0x05A0 0x07C0 0x1 0x0
+#define MX6SX_PAD_SD3_DATA0__ECSPI2_SS1                           0x0258 0x05A0 0x0000 0x2 0x0
+#define MX6SX_PAD_SD3_DATA0__AUDMUX_AUD6_RXD                      0x0258 0x05A0 0x0674 0x3 0x0
+#define MX6SX_PAD_SD3_DATA0__LCDIF2_DATA_1                        0x0258 0x05A0 0x0000 0x4 0x0
+#define MX6SX_PAD_SD3_DATA0__GPIO7_IO_2                           0x0258 0x05A0 0x0000 0x5 0x0
+#define MX6SX_PAD_SD3_DATA0__DCIC1_OUT                            0x0258 0x05A0 0x0000 0x6 0x0
+#define MX6SX_PAD_SD3_DATA0__TPSMP_HDATA_30                       0x0258 0x05A0 0x0000 0x7 0x0
+#define MX6SX_PAD_SD3_DATA0__GPU_DEBUG_0                          0x0258 0x05A0 0x0000 0x8 0x0
+#define MX6SX_PAD_SD3_DATA0__SDMA_DEBUG_EVT_CHN_LINES_0           0x0258 0x05A0 0x0000 0x9 0x0
+#define MX6SX_PAD_SD3_DATA1__USDHC3_DATA1                         0x025C 0x05A4 0x0000 0x0 0x0
+#define MX6SX_PAD_SD3_DATA1__I2C4_SDA                             0x025C 0x05A4 0x07C4 0x1 0x0
+#define MX6SX_PAD_SD3_DATA1__ECSPI2_SS2                           0x025C 0x05A4 0x0000 0x2 0x0
+#define MX6SX_PAD_SD3_DATA1__AUDMUX_AUD6_TXC                      0x025C 0x05A4 0x0684 0x3 0x0
+#define MX6SX_PAD_SD3_DATA1__LCDIF2_DATA_0                        0x025C 0x05A4 0x0000 0x4 0x0
+#define MX6SX_PAD_SD3_DATA1__GPIO7_IO_3                           0x025C 0x05A4 0x0000 0x5 0x0
+#define MX6SX_PAD_SD3_DATA1__DCIC2_OUT                            0x025C 0x05A4 0x0000 0x6 0x0
+#define MX6SX_PAD_SD3_DATA1__TPSMP_HDATA_31                       0x025C 0x05A4 0x0000 0x7 0x0
+#define MX6SX_PAD_SD3_DATA1__GPU_DEBUG_1                          0x025C 0x05A4 0x0000 0x8 0x0
+#define MX6SX_PAD_SD3_DATA1__SDMA_DEBUG_EVT_CHN_LINES_1           0x025C 0x05A4 0x0000 0x9 0x0
+#define MX6SX_PAD_SD3_DATA2__USDHC3_DATA2                         0x0260 0x05A8 0x0000 0x0 0x0
+#define MX6SX_PAD_SD3_DATA2__UART4_RTS_B                          0x0260 0x05A8 0x0844 0x1 0x1
+#define MX6SX_PAD_SD3_DATA2__ECSPI4_SS0                           0x0260 0x05A8 0x074C 0x2 0x0
+#define MX6SX_PAD_SD3_DATA2__AUDMUX_AUD6_TXFS                     0x0260 0x05A8 0x0688 0x3 0x0
+#define MX6SX_PAD_SD3_DATA2__LCDIF2_CLK                           0x0260 0x05A8 0x0000 0x4 0x0
+#define MX6SX_PAD_SD3_DATA2__GPIO7_IO_4                           0x0260 0x05A8 0x0000 0x5 0x0
+#define MX6SX_PAD_SD3_DATA2__LCDIF2_WR_RWN                        0x0260 0x05A8 0x0000 0x6 0x0
+#define MX6SX_PAD_SD3_DATA2__TPSMP_HDATA_26                       0x0260 0x05A8 0x0000 0x7 0x0
+#define MX6SX_PAD_SD3_DATA2__GPU_DEBUG_2                          0x0260 0x05A8 0x0000 0x8 0x0
+#define MX6SX_PAD_SD3_DATA2__SDMA_DEBUG_EVENT_CHANNEL_2           0x0260 0x05A8 0x0000 0x9 0x0
+#define MX6SX_PAD_SD3_DATA3__USDHC3_DATA3                         0x0264 0x05AC 0x0000 0x0 0x0
+#define MX6SX_PAD_SD3_DATA3__UART4_RX                             0x0264 0x05AC 0x0848 0x1 0x1
+#define MX6SX_PAD_SD3_DATA3__UART4_TX                             0x0264 0x05AC 0x0000 0x1 0x0
+#define MX6SX_PAD_SD3_DATA3__ECSPI4_MISO                          0x0264 0x05AC 0x0744 0x2 0x0
+#define MX6SX_PAD_SD3_DATA3__AUDMUX_AUD6_TXD                      0x0264 0x05AC 0x0678 0x3 0x0
+#define MX6SX_PAD_SD3_DATA3__LCDIF2_ENABLE                        0x0264 0x05AC 0x0000 0x4 0x0
+#define MX6SX_PAD_SD3_DATA3__GPIO7_IO_5                           0x0264 0x05AC 0x0000 0x5 0x0
+#define MX6SX_PAD_SD3_DATA3__LCDIF2_RD_E                          0x0264 0x05AC 0x0000 0x6 0x0
+#define MX6SX_PAD_SD3_DATA3__TPSMP_HDATA_27                       0x0264 0x05AC 0x0000 0x7 0x0
+#define MX6SX_PAD_SD3_DATA3__GPU_DEBUG_3                          0x0264 0x05AC 0x0000 0x8 0x0
+#define MX6SX_PAD_SD3_DATA3__SDMA_DEBUG_EVENT_CHANNEL_3           0x0264 0x05AC 0x0000 0x9 0x0
+#define MX6SX_PAD_SD3_DATA4__USDHC3_DATA4                         0x0268 0x05B0 0x0000 0x0 0x0
+#define MX6SX_PAD_SD3_DATA4__CAN2_RX                              0x0268 0x05B0 0x0690 0x1 0x0
+#define MX6SX_PAD_SD3_DATA4__CANFD_RX2                            0x0268 0x05B0 0x0698 0x2 0x0
+#define MX6SX_PAD_SD3_DATA4__UART3_RX                             0x0268 0x05B0 0x0840 0x3 0x2
+#define MX6SX_PAD_SD3_DATA4__UART3_TX                             0x0268 0x05B0 0x0000 0x3 0x0
+#define MX6SX_PAD_SD3_DATA4__LCDIF2_DATA_3                        0x0268 0x05B0 0x0000 0x4 0x0
+#define MX6SX_PAD_SD3_DATA4__GPIO7_IO_6                           0x0268 0x05B0 0x0000 0x5 0x0
+#define MX6SX_PAD_SD3_DATA4__ENET2_1588_EVENT0_IN                 0x0268 0x05B0 0x0000 0x6 0x0
+#define MX6SX_PAD_SD3_DATA4__TPSMP_HTRANS_1                       0x0268 0x05B0 0x0000 0x7 0x0
+#define MX6SX_PAD_SD3_DATA4__GPU_DEBUG_4                          0x0268 0x05B0 0x0000 0x8 0x0
+#define MX6SX_PAD_SD3_DATA4__SDMA_DEBUG_BUS_DEVICE_0              0x0268 0x05B0 0x0000 0x9 0x0
+#define MX6SX_PAD_SD3_DATA5__USDHC3_DATA5                         0x026C 0x05B4 0x0000 0x0 0x0
+#define MX6SX_PAD_SD3_DATA5__CAN1_TX                              0x026C 0x05B4 0x0000 0x1 0x0
+#define MX6SX_PAD_SD3_DATA5__CANFD_TX1                            0x026C 0x05B4 0x0000 0x2 0x0
+#define MX6SX_PAD_SD3_DATA5__UART3_RX                             0x026C 0x05B4 0x0840 0x3 0x3
+#define MX6SX_PAD_SD3_DATA5__UART3_TX                             0x026C 0x05B4 0x0000 0x3 0x0
+#define MX6SX_PAD_SD3_DATA5__LCDIF2_DATA_2                        0x026C 0x05B4 0x0000 0x4 0x0
+#define MX6SX_PAD_SD3_DATA5__GPIO7_IO_7                           0x026C 0x05B4 0x0000 0x5 0x0
+#define MX6SX_PAD_SD3_DATA5__ENET2_1588_EVENT0_OUT                0x026C 0x05B4 0x0000 0x6 0x0
+#define MX6SX_PAD_SD3_DATA5__SIM_M_HWRITE                         0x026C 0x05B4 0x0000 0x7 0x0
+#define MX6SX_PAD_SD3_DATA5__GPU_DEBUG_5                          0x026C 0x05B4 0x0000 0x8 0x0
+#define MX6SX_PAD_SD3_DATA5__SDMA_DEBUG_BUS_DEVICE_1              0x026C 0x05B4 0x0000 0x9 0x0
+#define MX6SX_PAD_SD3_DATA6__USDHC3_DATA6                         0x0270 0x05B8 0x0000 0x0 0x0
+#define MX6SX_PAD_SD3_DATA6__CAN2_TX                              0x0270 0x05B8 0x0000 0x1 0x0
+#define MX6SX_PAD_SD3_DATA6__CANFD_TX2                            0x0270 0x05B8 0x0000 0x2 0x0
+#define MX6SX_PAD_SD3_DATA6__UART3_RTS_B                          0x0270 0x05B8 0x083C 0x3 0x2
+#define MX6SX_PAD_SD3_DATA6__LCDIF2_DATA_4                        0x0270 0x05B8 0x0000 0x4 0x0
+#define MX6SX_PAD_SD3_DATA6__GPIO7_IO_8                           0x0270 0x05B8 0x0000 0x5 0x0
+#define MX6SX_PAD_SD3_DATA6__ENET1_1588_EVENT0_OUT                0x0270 0x05B8 0x0000 0x6 0x0
+#define MX6SX_PAD_SD3_DATA6__TPSMP_HTRANS_0                       0x0270 0x05B8 0x0000 0x7 0x0
+#define MX6SX_PAD_SD3_DATA6__GPU_DEBUG_7                          0x0270 0x05B8 0x0000 0x8 0x0
+#define MX6SX_PAD_SD3_DATA6__SDMA_DEBUG_EVT_CHN_LINES_7           0x0270 0x05B8 0x0000 0x9 0x0
+#define MX6SX_PAD_SD3_DATA7__USDHC3_DATA7                         0x0274 0x05BC 0x0000 0x0 0x0
+#define MX6SX_PAD_SD3_DATA7__CAN1_RX                              0x0274 0x05BC 0x068C 0x1 0x0
+#define MX6SX_PAD_SD3_DATA7__CANFD_RX1                            0x0274 0x05BC 0x0694 0x2 0x0
+#define MX6SX_PAD_SD3_DATA7__UART3_CTS_B                          0x0274 0x05BC 0x083C 0x3 0x3
+#define MX6SX_PAD_SD3_DATA7__LCDIF2_DATA_5                        0x0274 0x05BC 0x0000 0x4 0x0
+#define MX6SX_PAD_SD3_DATA7__GPIO7_IO_9                           0x0274 0x05BC 0x0000 0x5 0x0
+#define MX6SX_PAD_SD3_DATA7__ENET1_1588_EVENT0_IN                 0x0274 0x05BC 0x0000 0x6 0x0
+#define MX6SX_PAD_SD3_DATA7__TPSMP_HDATA_DIR                      0x0274 0x05BC 0x0000 0x7 0x0
+#define MX6SX_PAD_SD3_DATA7__GPU_DEBUG_6                          0x0274 0x05BC 0x0000 0x8 0x0
+#define MX6SX_PAD_SD3_DATA7__SDMA_DEBUG_EVT_CHN_LINES_2           0x0274 0x05BC 0x0000 0x9 0x0
+#define MX6SX_PAD_SD4_CLK__USDHC4_CLK                             0x0278 0x05C0 0x0000 0x0 0x0
+#define MX6SX_PAD_SD4_CLK__RAWNAND_DATA15                         0x0278 0x05C0 0x0000 0x1 0x0
+#define MX6SX_PAD_SD4_CLK__ECSPI2_MISO                            0x0278 0x05C0 0x0724 0x2 0x1
+#define MX6SX_PAD_SD4_CLK__AUDMUX_AUD3_RXFS                       0x0278 0x05C0 0x0638 0x3 0x0
+#define MX6SX_PAD_SD4_CLK__LCDIF2_DATA_13                         0x0278 0x05C0 0x0000 0x4 0x0
+#define MX6SX_PAD_SD4_CLK__GPIO6_IO_12                            0x0278 0x05C0 0x0000 0x5 0x0
+#define MX6SX_PAD_SD4_CLK__ECSPI3_SS2                             0x0278 0x05C0 0x0000 0x6 0x0
+#define MX6SX_PAD_SD4_CLK__TPSMP_HDATA_20                         0x0278 0x05C0 0x0000 0x7 0x0
+#define MX6SX_PAD_SD4_CLK__VDEC_DEBUG_12                          0x0278 0x05C0 0x0000 0x8 0x0
+#define MX6SX_PAD_SD4_CLK__SDMA_DEBUG_EVENT_CHANNEL_SEL           0x0278 0x05C0 0x0000 0x9 0x0
+#define MX6SX_PAD_SD4_CMD__USDHC4_CMD                             0x027C 0x05C4 0x0000 0x0 0x0
+#define MX6SX_PAD_SD4_CMD__RAWNAND_DATA14                         0x027C 0x05C4 0x0000 0x1 0x0
+#define MX6SX_PAD_SD4_CMD__ECSPI2_MOSI                            0x027C 0x05C4 0x0728 0x2 0x1
+#define MX6SX_PAD_SD4_CMD__AUDMUX_AUD3_RXC                        0x027C 0x05C4 0x0634 0x3 0x0
+#define MX6SX_PAD_SD4_CMD__LCDIF2_DATA_14                         0x027C 0x05C4 0x0000 0x4 0x0
+#define MX6SX_PAD_SD4_CMD__GPIO6_IO_13                            0x027C 0x05C4 0x0000 0x5 0x0
+#define MX6SX_PAD_SD4_CMD__ECSPI3_SS1                             0x027C 0x05C4 0x0000 0x6 0x0
+#define MX6SX_PAD_SD4_CMD__TPSMP_HDATA_19                         0x027C 0x05C4 0x0000 0x7 0x0
+#define MX6SX_PAD_SD4_CMD__VDEC_DEBUG_11                          0x027C 0x05C4 0x0000 0x8 0x0
+#define MX6SX_PAD_SD4_CMD__SDMA_DEBUG_CORE_RUN                    0x027C 0x05C4 0x0000 0x9 0x0
+#define MX6SX_PAD_SD4_DATA0__USDHC4_DATA0                         0x0280 0x05C8 0x0000 0x0 0x0
+#define MX6SX_PAD_SD4_DATA0__RAWNAND_DATA10                       0x0280 0x05C8 0x0000 0x1 0x0
+#define MX6SX_PAD_SD4_DATA0__ECSPI2_SS0                           0x0280 0x05C8 0x072C 0x2 0x1
+#define MX6SX_PAD_SD4_DATA0__AUDMUX_AUD3_RXD                      0x0280 0x05C8 0x062C 0x3 0x0
+#define MX6SX_PAD_SD4_DATA0__LCDIF2_DATA_12                       0x0280 0x05C8 0x0000 0x4 0x0
+#define MX6SX_PAD_SD4_DATA0__GPIO6_IO_14                          0x0280 0x05C8 0x0000 0x5 0x0
+#define MX6SX_PAD_SD4_DATA0__ECSPI3_SS3                           0x0280 0x05C8 0x0000 0x6 0x0
+#define MX6SX_PAD_SD4_DATA0__TPSMP_HDATA_21                       0x0280 0x05C8 0x0000 0x7 0x0
+#define MX6SX_PAD_SD4_DATA0__VDEC_DEBUG_13                        0x0280 0x05C8 0x0000 0x8 0x0
+#define MX6SX_PAD_SD4_DATA0__SDMA_DEBUG_MODE                      0x0280 0x05C8 0x0000 0x9 0x0
+#define MX6SX_PAD_SD4_DATA1__USDHC4_DATA1                         0x0284 0x05CC 0x0000 0x0 0x0
+#define MX6SX_PAD_SD4_DATA1__RAWNAND_DATA11                       0x0284 0x05CC 0x0000 0x1 0x0
+#define MX6SX_PAD_SD4_DATA1__ECSPI2_SCLK                          0x0284 0x05CC 0x0720 0x2 0x1
+#define MX6SX_PAD_SD4_DATA1__AUDMUX_AUD3_TXC                      0x0284 0x05CC 0x063C 0x3 0x0
+#define MX6SX_PAD_SD4_DATA1__LCDIF2_DATA_11                       0x0284 0x05CC 0x0000 0x4 0x0
+#define MX6SX_PAD_SD4_DATA1__GPIO6_IO_15                          0x0284 0x05CC 0x0000 0x5 0x0
+#define MX6SX_PAD_SD4_DATA1__ECSPI3_RDY                           0x0284 0x05CC 0x0000 0x6 0x0
+#define MX6SX_PAD_SD4_DATA1__TPSMP_HDATA_22                       0x0284 0x05CC 0x0000 0x7 0x0
+#define MX6SX_PAD_SD4_DATA1__VDEC_DEBUG_14                        0x0284 0x05CC 0x0000 0x8 0x0
+#define MX6SX_PAD_SD4_DATA1__SDMA_DEBUG_BUS_ERROR                 0x0284 0x05CC 0x0000 0x9 0x0
+#define MX6SX_PAD_SD4_DATA2__USDHC4_DATA2                         0x0288 0x05D0 0x0000 0x0 0x0
+#define MX6SX_PAD_SD4_DATA2__RAWNAND_DATA12                       0x0288 0x05D0 0x0000 0x1 0x0
+#define MX6SX_PAD_SD4_DATA2__I2C2_SDA                             0x0288 0x05D0 0x07B4 0x2 0x0
+#define MX6SX_PAD_SD4_DATA2__AUDMUX_AUD3_TXFS                     0x0288 0x05D0 0x0640 0x3 0x0
+#define MX6SX_PAD_SD4_DATA2__LCDIF2_DATA_10                       0x0288 0x05D0 0x0000 0x4 0x0
+#define MX6SX_PAD_SD4_DATA2__GPIO6_IO_16                          0x0288 0x05D0 0x0000 0x5 0x0
+#define MX6SX_PAD_SD4_DATA2__ECSPI2_SS3                           0x0288 0x05D0 0x0000 0x6 0x0
+#define MX6SX_PAD_SD4_DATA2__TPSMP_HDATA_23                       0x0288 0x05D0 0x0000 0x7 0x0
+#define MX6SX_PAD_SD4_DATA2__VDEC_DEBUG_15                        0x0288 0x05D0 0x0000 0x8 0x0
+#define MX6SX_PAD_SD4_DATA2__SDMA_DEBUG_BUS_RWB                   0x0288 0x05D0 0x0000 0x9 0x0
+#define MX6SX_PAD_SD4_DATA3__USDHC4_DATA3                         0x028C 0x05D4 0x0000 0x0 0x0
+#define MX6SX_PAD_SD4_DATA3__RAWNAND_DATA13                       0x028C 0x05D4 0x0000 0x1 0x0
+#define MX6SX_PAD_SD4_DATA3__I2C2_SCL                             0x028C 0x05D4 0x07B0 0x2 0x0
+#define MX6SX_PAD_SD4_DATA3__AUDMUX_AUD3_TXD                      0x028C 0x05D4 0x0630 0x3 0x0
+#define MX6SX_PAD_SD4_DATA3__LCDIF2_DATA_9                        0x028C 0x05D4 0x0000 0x4 0x0
+#define MX6SX_PAD_SD4_DATA3__GPIO6_IO_17                          0x028C 0x05D4 0x0000 0x5 0x0
+#define MX6SX_PAD_SD4_DATA3__ECSPI2_RDY                           0x028C 0x05D4 0x0000 0x6 0x0
+#define MX6SX_PAD_SD4_DATA3__TPSMP_HDATA_24                       0x028C 0x05D4 0x0000 0x7 0x0
+#define MX6SX_PAD_SD4_DATA3__VDEC_DEBUG_16                        0x028C 0x05D4 0x0000 0x8 0x0
+#define MX6SX_PAD_SD4_DATA3__SDMA_DEBUG_MATCHED_DMBUS             0x028C 0x05D4 0x0000 0x9 0x0
+#define MX6SX_PAD_SD4_DATA4__USDHC4_DATA4                         0x0290 0x05D8 0x0000 0x0 0x0
+#define MX6SX_PAD_SD4_DATA4__RAWNAND_DATA09                       0x0290 0x05D8 0x0000 0x1 0x0
+#define MX6SX_PAD_SD4_DATA4__UART5_RX                             0x0290 0x05D8 0x0850 0x2 0x0
+#define MX6SX_PAD_SD4_DATA4__UART5_TX                             0x0290 0x05D8 0x0000 0x2 0x0
+#define MX6SX_PAD_SD4_DATA4__ECSPI3_SCLK                          0x0290 0x05D8 0x0730 0x3 0x0
+#define MX6SX_PAD_SD4_DATA4__LCDIF2_DATA_8                        0x0290 0x05D8 0x0000 0x4 0x0
+#define MX6SX_PAD_SD4_DATA4__GPIO6_IO_18                          0x0290 0x05D8 0x0000 0x5 0x0
+#define MX6SX_PAD_SD4_DATA4__SPDIF_OUT                            0x0290 0x05D8 0x0000 0x6 0x0
+#define MX6SX_PAD_SD4_DATA4__TPSMP_HDATA_16                       0x0290 0x05D8 0x0000 0x7 0x0
+#define MX6SX_PAD_SD4_DATA4__USB_OTG_HOST_MODE                    0x0290 0x05D8 0x0000 0x8 0x0
+#define MX6SX_PAD_SD4_DATA4__SDMA_DEBUG_RTBUFFER_WRITE            0x0290 0x05D8 0x0000 0x9 0x0
+#define MX6SX_PAD_SD4_DATA5__USDHC4_DATA5                         0x0294 0x05DC 0x0000 0x0 0x0
+#define MX6SX_PAD_SD4_DATA5__RAWNAND_CE2_B                        0x0294 0x05DC 0x0000 0x1 0x0
+#define MX6SX_PAD_SD4_DATA5__UART5_RX                             0x0294 0x05DC 0x0850 0x2 0x1
+#define MX6SX_PAD_SD4_DATA5__UART5_TX                             0x0294 0x05DC 0x0000 0x2 0x0
+#define MX6SX_PAD_SD4_DATA5__ECSPI3_MOSI                          0x0294 0x05DC 0x0738 0x3 0x0
+#define MX6SX_PAD_SD4_DATA5__LCDIF2_DATA_7                        0x0294 0x05DC 0x0000 0x4 0x0
+#define MX6SX_PAD_SD4_DATA5__GPIO6_IO_19                          0x0294 0x05DC 0x0000 0x5 0x0
+#define MX6SX_PAD_SD4_DATA5__SPDIF_IN                             0x0294 0x05DC 0x0824 0x6 0x0
+#define MX6SX_PAD_SD4_DATA5__TPSMP_HDATA_17                       0x0294 0x05DC 0x0000 0x7 0x0
+#define MX6SX_PAD_SD4_DATA5__VDEC_DEBUG_9                         0x0294 0x05DC 0x0000 0x8 0x0
+#define MX6SX_PAD_SD4_DATA5__SDMA_DEBUG_EVENT_CHANNEL_0           0x0294 0x05DC 0x0000 0x9 0x0
+#define MX6SX_PAD_SD4_DATA6__USDHC4_DATA6                         0x0298 0x05E0 0x0000 0x0 0x0
+#define MX6SX_PAD_SD4_DATA6__RAWNAND_CE3_B                        0x0298 0x05E0 0x0000 0x1 0x0
+#define MX6SX_PAD_SD4_DATA6__UART5_RTS_B                          0x0298 0x05E0 0x084C 0x2 0x0
+#define MX6SX_PAD_SD4_DATA6__ECSPI3_MISO                          0x0298 0x05E0 0x0734 0x3 0x0
+#define MX6SX_PAD_SD4_DATA6__LCDIF2_DATA_6                        0x0298 0x05E0 0x0000 0x4 0x0
+#define MX6SX_PAD_SD4_DATA6__GPIO6_IO_20                          0x0298 0x05E0 0x0000 0x5 0x0
+#define MX6SX_PAD_SD4_DATA6__USDHC4_WP                            0x0298 0x05E0 0x0878 0x6 0x0
+#define MX6SX_PAD_SD4_DATA6__TPSMP_HDATA_18                       0x0298 0x05E0 0x0000 0x7 0x0
+#define MX6SX_PAD_SD4_DATA6__VDEC_DEBUG_10                        0x0298 0x05E0 0x0000 0x8 0x0
+#define MX6SX_PAD_SD4_DATA6__SDMA_DEBUG_EVENT_CHANNEL_1           0x0298 0x05E0 0x0000 0x9 0x0
+#define MX6SX_PAD_SD4_DATA7__USDHC4_DATA7                         0x029C 0x05E4 0x0000 0x0 0x0
+#define MX6SX_PAD_SD4_DATA7__RAWNAND_DATA08                       0x029C 0x05E4 0x0000 0x1 0x0
+#define MX6SX_PAD_SD4_DATA7__UART5_CTS_B                          0x029C 0x05E4 0x084C 0x2 0x1
+#define MX6SX_PAD_SD4_DATA7__ECSPI3_SS0                           0x029C 0x05E4 0x073C 0x3 0x0
+#define MX6SX_PAD_SD4_DATA7__LCDIF2_DATA_15                       0x029C 0x05E4 0x0000 0x4 0x0
+#define MX6SX_PAD_SD4_DATA7__GPIO6_IO_21                          0x029C 0x05E4 0x0000 0x5 0x0
+#define MX6SX_PAD_SD4_DATA7__USDHC4_CD_B                          0x029C 0x05E4 0x0874 0x6 0x0
+#define MX6SX_PAD_SD4_DATA7__TPSMP_HDATA_15                       0x029C 0x05E4 0x0000 0x7 0x0
+#define MX6SX_PAD_SD4_DATA7__USB_OTG_PWR_WAKE                     0x029C 0x05E4 0x0000 0x8 0x0
+#define MX6SX_PAD_SD4_DATA7__SDMA_DEBUG_YIELD                     0x029C 0x05E4 0x0000 0x9 0x0
+#define MX6SX_PAD_SD4_RESET_B__USDHC4_RESET_B                     0x02A0 0x05E8 0x0000 0x0 0x0
+#define MX6SX_PAD_SD4_RESET_B__RAWNAND_DQS                        0x02A0 0x05E8 0x0000 0x1 0x0
+#define MX6SX_PAD_SD4_RESET_B__USDHC4_RESET                       0x02A0 0x05E8 0x0000 0x2 0x0
+#define MX6SX_PAD_SD4_RESET_B__AUDMUX_MCLK                        0x02A0 0x05E8 0x0000 0x3 0x0
+#define MX6SX_PAD_SD4_RESET_B__LCDIF2_RESET                       0x02A0 0x05E8 0x0000 0x4 0x0
+#define MX6SX_PAD_SD4_RESET_B__GPIO6_IO_22                        0x02A0 0x05E8 0x0000 0x5 0x0
+#define MX6SX_PAD_SD4_RESET_B__LCDIF2_CS                          0x02A0 0x05E8 0x0000 0x6 0x0
+#define MX6SX_PAD_SD4_RESET_B__TPSMP_HDATA_25                     0x02A0 0x05E8 0x0000 0x7 0x0
+#define MX6SX_PAD_SD4_RESET_B__VDEC_DEBUG_17                      0x02A0 0x05E8 0x0000 0x8 0x0
+#define MX6SX_PAD_SD4_RESET_B__SDMA_DEBUG_BUS_DEVICE_2            0x02A0 0x05E8 0x0000 0x9 0x0
+#define MX6SX_PAD_USB_H_DATA__USB_H_DATA                          0x02A4 0x05EC 0x0000 0x0 0x0
+#define MX6SX_PAD_USB_H_DATA__PWM2_OUT                            0x02A4 0x05EC 0x0000 0x1 0x0
+#define MX6SX_PAD_USB_H_DATA__ANATOP_24M_OUT                      0x02A4 0x05EC 0x0000 0x2 0x0
+#define MX6SX_PAD_USB_H_DATA__I2C4_SDA                            0x02A4 0x05EC 0x07C4 0x3 0x1
+#define MX6SX_PAD_USB_H_DATA__WDOG3_WDOG_B                        0x02A4 0x05EC 0x0000 0x4 0x0
+#define MX6SX_PAD_USB_H_DATA__GPIO7_IO_10                         0x02A4 0x05EC 0x0000 0x5 0x0
+#define MX6SX_PAD_USB_H_STROBE__USB_H_STROBE                      0x02A8 0x05F0 0x0000 0x0 0x0
+#define MX6SX_PAD_USB_H_STROBE__PWM1_OUT                          0x02A8 0x05F0 0x0000 0x1 0x0
+#define MX6SX_PAD_USB_H_STROBE__ANATOP_32K_OUT                    0x02A8 0x05F0 0x0000 0x2 0x0
+#define MX6SX_PAD_USB_H_STROBE__I2C4_SCL                          0x02A8 0x05F0 0x07C0 0x3 0x1
+#define MX6SX_PAD_USB_H_STROBE__WDOG3_WDOG_RST_B_DEB              0x02A8 0x05F0 0x0000 0x4 0x0
+#define MX6SX_PAD_USB_H_STROBE__GPIO7_IO_11                       0x02A8 0x05F0 0x0000 0x5 0x0
+
+#endif /* __DTS_IMX6SX_PINFUNC_H */
diff --git a/arch/arm/boot/dts/imx6sx-sdb.dts b/arch/arm/boot/dts/imx6sx-sdb.dts
new file mode 100644 (file)
index 0000000..a3980d9
--- /dev/null
@@ -0,0 +1,479 @@
+/*
+ * Copyright (C) 2014 Freescale Semiconductor, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+/dts-v1/;
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+#include "imx6sx.dtsi"
+
+/ {
+       model = "Freescale i.MX6 SoloX SDB Board";
+       compatible = "fsl,imx6sx-sdb", "fsl,imx6sx";
+
+       chosen {
+               stdout-path = &uart1;
+       };
+
+       memory {
+               reg = <0x80000000 0x40000000>;
+       };
+
+       gpio-keys {
+               compatible = "gpio-keys";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_gpio_keys>;
+
+               volume-up {
+                       label = "Volume Up";
+                       gpios = <&gpio1 18 GPIO_ACTIVE_LOW>;
+                       linux,code = <KEY_VOLUMEUP>;
+               };
+
+               volume-down {
+                       label = "Volume Down";
+                       gpios = <&gpio1 19 GPIO_ACTIVE_LOW>;
+                       linux,code = <KEY_VOLUMEDOWN>;
+               };
+       };
+
+       regulators {
+               compatible = "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               vcc_sd3: regulator@0 {
+                       compatible = "regulator-fixed";
+                       reg = <0>;
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&pinctrl_vcc_sd3>;
+                       regulator-name = "VCC_SD3";
+                       regulator-min-microvolt = <3000000>;
+                       regulator-max-microvolt = <3000000>;
+                       gpio = <&gpio2 11 GPIO_ACTIVE_HIGH>;
+                       enable-active-high;
+               };
+
+               reg_usb_otg1_vbus: regulator@1 {
+                       compatible = "regulator-fixed";
+                       reg = <1>;
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&pinctrl_usb_otg1>;
+                       regulator-name = "usb_otg1_vbus";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       gpio = <&gpio1 9 GPIO_ACTIVE_HIGH>;
+                       enable-active-high;
+               };
+
+               reg_usb_otg2_vbus: regulator@2 {
+                       compatible = "regulator-fixed";
+                       reg = <2>;
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&pinctrl_usb_otg2>;
+                       regulator-name = "usb_otg2_vbus";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       gpio = <&gpio1 12 GPIO_ACTIVE_HIGH>;
+                       enable-active-high;
+               };
+
+               reg_psu_5v: regulator@3 {
+                       compatible = "regulator-fixed";
+                       reg = <3>;
+                       regulator-name = "PSU-5V0";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+               };
+       };
+
+       sound {
+               compatible = "fsl,imx6sx-sdb-wm8962", "fsl,imx-audio-wm8962";
+               model = "wm8962-audio";
+               ssi-controller = <&ssi2>;
+               audio-codec = <&codec>;
+               audio-routing =
+                       "Headphone Jack", "HPOUTL",
+                       "Headphone Jack", "HPOUTR",
+                       "Ext Spk", "SPKOUTL",
+                       "Ext Spk", "SPKOUTR",
+                       "AMIC", "MICBIAS",
+                       "IN3R", "AMIC";
+               mux-int-port = <2>;
+               mux-ext-port = <6>;
+       };
+};
+
+&audmux {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_audmux>;
+       status = "okay";
+};
+
+&fec1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_enet1>;
+       phy-mode = "rgmii";
+       status = "okay";
+};
+
+&i2c1 {
+        clock-frequency = <100000>;
+        pinctrl-names = "default";
+        pinctrl-0 = <&pinctrl_i2c1>;
+        status = "okay";
+
+       pmic: pfuze100@08 {
+               compatible = "fsl,pfuze100";
+               reg = <0x08>;
+
+               regulators {
+                       sw1a_reg: sw1ab {
+                               regulator-min-microvolt = <300000>;
+                               regulator-max-microvolt = <1875000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                               regulator-ramp-delay = <6250>;
+                       };
+
+                       sw1c_reg: sw1c {
+                               regulator-min-microvolt = <300000>;
+                               regulator-max-microvolt = <1875000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                               regulator-ramp-delay = <6250>;
+                       };
+
+                       sw2_reg: sw2 {
+                               regulator-min-microvolt = <800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       sw3a_reg: sw3a {
+                               regulator-min-microvolt = <400000>;
+                               regulator-max-microvolt = <1975000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       sw3b_reg: sw3b {
+                               regulator-min-microvolt = <400000>;
+                               regulator-max-microvolt = <1975000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       sw4_reg: sw4 {
+                               regulator-min-microvolt = <800000>;
+                               regulator-max-microvolt = <3300000>;
+                       };
+
+                       swbst_reg: swbst {
+                               regulator-min-microvolt = <5000000>;
+                               regulator-max-microvolt = <5150000>;
+                       };
+
+                       snvs_reg: vsnvs {
+                               regulator-min-microvolt = <1000000>;
+                               regulator-max-microvolt = <3000000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       vref_reg: vrefddr {
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       vgen1_reg: vgen1 {
+                               regulator-min-microvolt = <800000>;
+                               regulator-max-microvolt = <1550000>;
+                               regulator-always-on;
+                       };
+
+                       vgen2_reg: vgen2 {
+                               regulator-min-microvolt = <800000>;
+                               regulator-max-microvolt = <1550000>;
+                       };
+
+                       vgen3_reg: vgen3 {
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-always-on;
+                       };
+
+                       vgen4_reg: vgen4 {
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-always-on;
+                       };
+
+                       vgen5_reg: vgen5 {
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-always-on;
+                       };
+
+                       vgen6_reg: vgen6 {
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-always-on;
+                       };
+               };
+       };
+};
+
+&i2c4 {
+        clock-frequency = <100000>;
+        pinctrl-names = "default";
+        pinctrl-0 = <&pinctrl_i2c4>;
+        status = "okay";
+
+       codec: wm8962@1a {
+               compatible = "wlf,wm8962";
+               reg = <0x1a>;
+               clocks = <&clks IMX6SX_CLK_AUDIO>;
+               DCVDD-supply = <&vgen4_reg>;
+               DBVDD-supply = <&vgen4_reg>;
+               AVDD-supply = <&vgen4_reg>;
+               CPVDD-supply = <&vgen4_reg>;
+               MICVDD-supply = <&vgen3_reg>;
+               PLLVDD-supply = <&vgen4_reg>;
+               SPKVDD1-supply = <&reg_psu_5v>;
+               SPKVDD2-supply = <&reg_psu_5v>;
+       };
+};
+
+&ssi2 {
+       status = "okay";
+};
+
+&uart1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart1>;
+       status = "okay";
+};
+
+&uart5 { /* for bluetooth */
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart5>;
+       fsl,uart-has-rtscts;
+       status = "okay";
+};
+
+&usbotg1 {
+       vbus-supply = <&reg_usb_otg1_vbus>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usb_otg1_id>;
+       status = "okay";
+};
+
+&usbotg2 {
+       vbus-supply = <&reg_usb_otg2_vbus>;
+       dr_mode = "host";
+       status = "okay";
+};
+
+&usdhc2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc2>;
+       non-removable;
+       no-1-8-v;
+       keep-power-in-suspend;
+       enable-sdio-wakeup;
+       status = "okay";
+};
+
+&usdhc3 {
+       pinctrl-names = "default", "state_100mhz", "state_200mhz";
+       pinctrl-0 = <&pinctrl_usdhc3>;
+       pinctrl-1 = <&pinctrl_usdhc3_100mhz>;
+       pinctrl-2 = <&pinctrl_usdhc3_200mhz>;
+       bus-width = <8>;
+       cd-gpios = <&gpio2 10 GPIO_ACTIVE_HIGH>;
+       wp-gpios = <&gpio2 15 GPIO_ACTIVE_HIGH>;
+       keep-power-in-suspend;
+       enable-sdio-wakeup;
+       vmmc-supply = <&vcc_sd3>;
+       status = "okay";
+};
+
+&usdhc4 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc4>;
+       cd-gpios = <&gpio6 21 GPIO_ACTIVE_HIGH>;
+       wp-gpios = <&gpio6 20 GPIO_ACTIVE_HIGH>;
+       status = "okay";
+};
+
+&iomuxc {
+       imx6x-sdb {
+               pinctrl_audmux: audmuxgrp {
+                       fsl,pins = <
+                               MX6SX_PAD_CSI_DATA00__AUDMUX_AUD6_TXC   0x130b0
+                               MX6SX_PAD_CSI_DATA01__AUDMUX_AUD6_TXFS  0x130b0
+                               MX6SX_PAD_CSI_HSYNC__AUDMUX_AUD6_TXD    0x120b0
+                               MX6SX_PAD_CSI_VSYNC__AUDMUX_AUD6_RXD    0x130b0
+                               MX6SX_PAD_CSI_PIXCLK__AUDMUX_MCLK       0x130b0
+                       >;
+               };
+
+               pinctrl_enet1: enet1grp {
+                       fsl,pins = <
+                               MX6SX_PAD_ENET1_MDIO__ENET1_MDIO        0xa0b1
+                               MX6SX_PAD_ENET1_MDC__ENET1_MDC          0xa0b1
+                               MX6SX_PAD_RGMII1_TXC__ENET1_RGMII_TXC   0xa0b1
+                               MX6SX_PAD_RGMII1_TD0__ENET1_TX_DATA_0   0xa0b1
+                               MX6SX_PAD_RGMII1_TD1__ENET1_TX_DATA_1   0xa0b1
+                               MX6SX_PAD_RGMII1_TD2__ENET1_TX_DATA_2   0xa0b1
+                               MX6SX_PAD_RGMII1_TD3__ENET1_TX_DATA_3   0xa0b1
+                               MX6SX_PAD_RGMII1_TX_CTL__ENET1_TX_EN    0xa0b1
+                               MX6SX_PAD_RGMII1_RXC__ENET1_RX_CLK      0x3081
+                               MX6SX_PAD_RGMII1_RD0__ENET1_RX_DATA_0   0x3081
+                               MX6SX_PAD_RGMII1_RD1__ENET1_RX_DATA_1   0x3081
+                               MX6SX_PAD_RGMII1_RD2__ENET1_RX_DATA_2   0x3081
+                               MX6SX_PAD_RGMII1_RD3__ENET1_RX_DATA_3   0x3081
+                               MX6SX_PAD_RGMII1_RX_CTL__ENET1_RX_EN    0x3081
+                       >;
+               };
+
+               pinctrl_gpio_keys: gpio_keysgrp {
+                       fsl,pins = <
+                               MX6SX_PAD_CSI_DATA04__GPIO1_IO_18 0x17059
+                               MX6SX_PAD_CSI_DATA05__GPIO1_IO_19 0x17059
+                       >;
+               };
+
+               pinctrl_i2c1: i2c1grp {
+                       fsl,pins = <
+                               MX6SX_PAD_GPIO1_IO01__I2C1_SDA          0x4001b8b1
+                               MX6SX_PAD_GPIO1_IO00__I2C1_SCL          0x4001b8b1
+                       >;
+               };
+
+               pinctrl_i2c4: i2c4grp {
+                       fsl,pins = <
+                               MX6SX_PAD_CSI_DATA07__I2C4_SDA          0x4001b8b1
+                               MX6SX_PAD_CSI_DATA06__I2C4_SCL          0x4001b8b1
+                       >;
+               };
+
+               pinctrl_vcc_sd3: vccsd3grp {
+                       fsl,pins = <
+                               MX6SX_PAD_KEY_COL1__GPIO2_IO_11         0x17059
+                       >;
+               };
+
+               pinctrl_uart1: uart1grp {
+                       fsl,pins = <
+                               MX6SX_PAD_GPIO1_IO04__UART1_TX          0x1b0b1
+                               MX6SX_PAD_GPIO1_IO05__UART1_RX          0x1b0b1
+                       >;
+               };
+
+               pinctrl_uart5: uart5grp {
+                       fsl,pins = <
+                               MX6SX_PAD_KEY_ROW3__UART5_RX            0x1b0b1
+                               MX6SX_PAD_KEY_COL3__UART5_TX            0x1b0b1
+                               MX6SX_PAD_KEY_ROW2__UART5_CTS_B         0x1b0b1
+                               MX6SX_PAD_KEY_COL2__UART5_RTS_B         0x1b0b1
+                       >;
+               };
+
+               pinctrl_usb_otg1: usbotg1grp {
+                       fsl,pins = <
+                               MX6SX_PAD_GPIO1_IO09__GPIO1_IO_9        0x10b0
+                       >;
+               };
+
+               pinctrl_usb_otg1_id: usbotg1idgrp {
+                       fsl,pins = <
+                               MX6SX_PAD_GPIO1_IO10__ANATOP_OTG1_ID    0x17059
+                       >;
+               };
+
+               pinctrl_usb_otg2: usbot2ggrp {
+                       fsl,pins = <
+                               MX6SX_PAD_GPIO1_IO12__GPIO1_IO_12       0x10b0
+                       >;
+               };
+
+               pinctrl_usdhc2: usdhc2grp {
+                       fsl,pins = <
+                               MX6SX_PAD_SD2_CMD__USDHC2_CMD           0x17059
+                               MX6SX_PAD_SD2_CLK__USDHC2_CLK           0x10059
+                               MX6SX_PAD_SD2_DATA0__USDHC2_DATA0       0x17059
+                               MX6SX_PAD_SD2_DATA1__USDHC2_DATA1       0x17059
+                               MX6SX_PAD_SD2_DATA2__USDHC2_DATA2       0x17059
+                               MX6SX_PAD_SD2_DATA3__USDHC2_DATA3       0x17059
+                       >;
+               };
+
+               pinctrl_usdhc3: usdhc3grp {
+                       fsl,pins = <
+                               MX6SX_PAD_SD3_CMD__USDHC3_CMD           0x17059
+                               MX6SX_PAD_SD3_CLK__USDHC3_CLK           0x10059
+                               MX6SX_PAD_SD3_DATA0__USDHC3_DATA0       0x17059
+                               MX6SX_PAD_SD3_DATA1__USDHC3_DATA1       0x17059
+                               MX6SX_PAD_SD3_DATA2__USDHC3_DATA2       0x17059
+                               MX6SX_PAD_SD3_DATA3__USDHC3_DATA3       0x17059
+                               MX6SX_PAD_SD3_DATA4__USDHC3_DATA4       0x17059
+                               MX6SX_PAD_SD3_DATA5__USDHC3_DATA5       0x17059
+                               MX6SX_PAD_SD3_DATA6__USDHC3_DATA6       0x17059
+                               MX6SX_PAD_SD3_DATA7__USDHC3_DATA7       0x17059
+                               MX6SX_PAD_KEY_COL0__GPIO2_IO_10         0x17059 /* CD */
+                               MX6SX_PAD_KEY_ROW0__GPIO2_IO_15         0x17059 /* WP */
+                       >;
+               };
+
+               pinctrl_usdhc3_100mhz: usdhc3grp-100mhz {
+                       fsl,pins = <
+                               MX6SX_PAD_SD3_CMD__USDHC3_CMD           0x170b9
+                               MX6SX_PAD_SD3_CLK__USDHC3_CLK           0x100b9
+                               MX6SX_PAD_SD3_DATA0__USDHC3_DATA0       0x170b9
+                               MX6SX_PAD_SD3_DATA1__USDHC3_DATA1       0x170b9
+                               MX6SX_PAD_SD3_DATA2__USDHC3_DATA2       0x170b9
+                               MX6SX_PAD_SD3_DATA3__USDHC3_DATA3       0x170b9
+                               MX6SX_PAD_SD3_DATA4__USDHC3_DATA4       0x170b9
+                               MX6SX_PAD_SD3_DATA5__USDHC3_DATA5       0x170b9
+                               MX6SX_PAD_SD3_DATA6__USDHC3_DATA6       0x170b9
+                               MX6SX_PAD_SD3_DATA7__USDHC3_DATA7       0x170b9
+                       >;
+               };
+
+               pinctrl_usdhc3_200mhz: usdhc3grp-200mhz {
+                       fsl,pins = <
+                               MX6SX_PAD_SD3_CMD__USDHC3_CMD           0x170f9
+                               MX6SX_PAD_SD3_CLK__USDHC3_CLK           0x100f9
+                               MX6SX_PAD_SD3_DATA0__USDHC3_DATA0       0x170f9
+                               MX6SX_PAD_SD3_DATA1__USDHC3_DATA1       0x170f9
+                               MX6SX_PAD_SD3_DATA2__USDHC3_DATA2       0x170f9
+                               MX6SX_PAD_SD3_DATA3__USDHC3_DATA3       0x170f9
+                               MX6SX_PAD_SD3_DATA4__USDHC3_DATA4       0x170f9
+                               MX6SX_PAD_SD3_DATA5__USDHC3_DATA5       0x170f9
+                               MX6SX_PAD_SD3_DATA6__USDHC3_DATA6       0x170f9
+                               MX6SX_PAD_SD3_DATA7__USDHC3_DATA7       0x170f9
+                       >;
+               };
+
+               pinctrl_usdhc4: usdhc4grp {
+                       fsl,pins = <
+                               MX6SX_PAD_SD4_CMD__USDHC4_CMD           0x17059
+                               MX6SX_PAD_SD4_CLK__USDHC4_CLK           0x10059
+                               MX6SX_PAD_SD4_DATA0__USDHC4_DATA0       0x17059
+                               MX6SX_PAD_SD4_DATA1__USDHC4_DATA1       0x17059
+                               MX6SX_PAD_SD4_DATA2__USDHC4_DATA2       0x17059
+                               MX6SX_PAD_SD4_DATA3__USDHC4_DATA3       0x17059
+                               MX6SX_PAD_SD4_DATA7__GPIO6_IO_21        0x17059 /* CD */
+                               MX6SX_PAD_SD4_DATA6__GPIO6_IO_20        0x17059 /* WP */
+                       >;
+               };
+       };
+};
diff --git a/arch/arm/boot/dts/imx6sx.dtsi b/arch/arm/boot/dts/imx6sx.dtsi
new file mode 100644 (file)
index 0000000..f4b9da6
--- /dev/null
@@ -0,0 +1,1208 @@
+/*
+ * Copyright 2014 Freescale Semiconductor, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <dt-bindings/clock/imx6sx-clock.h>
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/interrupt-controller/arm-gic.h>
+#include "imx6sx-pinfunc.h"
+#include "skeleton.dtsi"
+
+/ {
+       aliases {
+               can0 = &flexcan1;
+               can1 = &flexcan2;
+               ethernet0 = &fec1;
+               ethernet1 = &fec2;
+               gpio0 = &gpio1;
+               gpio1 = &gpio2;
+               gpio2 = &gpio3;
+               gpio3 = &gpio4;
+               gpio4 = &gpio5;
+               gpio5 = &gpio6;
+               gpio6 = &gpio7;
+               i2c0 = &i2c1;
+               i2c1 = &i2c2;
+               i2c2 = &i2c3;
+               i2c3 = &i2c4;
+               mmc0 = &usdhc1;
+               mmc1 = &usdhc2;
+               mmc2 = &usdhc3;
+               mmc3 = &usdhc4;
+               serial0 = &uart1;
+               serial1 = &uart2;
+               serial2 = &uart3;
+               serial3 = &uart4;
+               serial4 = &uart5;
+               serial5 = &uart6;
+               spi0 = &ecspi1;
+               spi1 = &ecspi2;
+               spi2 = &ecspi3;
+               spi3 = &ecspi4;
+               spi4 = &ecspi5;
+               usbphy0 = &usbphy1;
+               usbphy1 = &usbphy2;
+       };
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               cpu0: cpu@0 {
+                       compatible = "arm,cortex-a9";
+                       device_type = "cpu";
+                       reg = <0>;
+                       next-level-cache = <&L2>;
+                       operating-points = <
+                               /* kHz    uV */
+                               996000  1250000
+                               792000  1175000
+                               396000  1075000
+                       >;
+                       fsl,soc-operating-points = <
+                               /* ARM kHz  SOC uV */
+                               996000      1175000
+                               792000      1175000
+                               396000      1175000
+                       >;
+                       clock-latency = <61036>; /* two CLK32 periods */
+                       clocks = <&clks IMX6SX_CLK_ARM>,
+                                <&clks IMX6SX_CLK_PLL2_PFD2>,
+                                <&clks IMX6SX_CLK_STEP>,
+                                <&clks IMX6SX_CLK_PLL1_SW>,
+                                <&clks IMX6SX_CLK_PLL1_SYS>;
+                       clock-names = "arm", "pll2_pfd2_396m", "step",
+                                     "pll1_sw", "pll1_sys";
+                       arm-supply = <&reg_arm>;
+                       soc-supply = <&reg_soc>;
+               };
+       };
+
+       intc: interrupt-controller@00a01000 {
+               compatible = "arm,cortex-a9-gic";
+               #interrupt-cells = <3>;
+               interrupt-controller;
+               reg = <0x00a01000 0x1000>,
+                     <0x00a00100 0x100>;
+       };
+
+       clocks {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               ckil: clock@0 {
+                       compatible = "fixed-clock";
+                       reg = <0>;
+                       #clock-cells = <0>;
+                       clock-frequency = <32768>;
+                       clock-output-names = "ckil";
+               };
+
+               osc: clock@1 {
+                       compatible = "fixed-clock";
+                       reg = <1>;
+                       #clock-cells = <0>;
+                       clock-frequency = <24000000>;
+                       clock-output-names = "osc";
+               };
+
+               ipp_di0: clock@2 {
+                       compatible = "fixed-clock";
+                       reg = <2>;
+                       #clock-cells = <0>;
+                       clock-frequency = <0>;
+                       clock-output-names = "ipp_di0";
+               };
+
+               ipp_di1: clock@3 {
+                       compatible = "fixed-clock";
+                       reg = <3>;
+                       #clock-cells = <0>;
+                       clock-frequency = <0>;
+                       clock-output-names = "ipp_di1";
+               };
+       };
+
+       soc {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "simple-bus";
+               interrupt-parent = <&intc>;
+               ranges;
+
+               pmu {
+                       compatible = "arm,cortex-a9-pmu";
+                       interrupts = <GIC_SPI 94 IRQ_TYPE_LEVEL_HIGH>;
+               };
+
+               ocram: sram@00900000 {
+                       compatible = "mmio-sram";
+                       reg = <0x00900000 0x20000>;
+                       clocks = <&clks IMX6SX_CLK_OCRAM>;
+               };
+
+               L2: l2-cache@00a02000 {
+                       compatible = "arm,pl310-cache";
+                       reg = <0x00a02000 0x1000>;
+                       interrupts = <GIC_SPI 92 IRQ_TYPE_LEVEL_HIGH>;
+                       cache-unified;
+                       cache-level = <2>;
+                       arm,tag-latency = <4 2 3>;
+                       arm,data-latency = <4 2 3>;
+               };
+
+               dma_apbh: dma-apbh@01804000 {
+                       compatible = "fsl,imx6sx-dma-apbh", "fsl,imx28-dma-apbh";
+                       reg = <0x01804000 0x2000>;
+                       interrupts = <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-names = "gpmi0", "gpmi1", "gpmi2", "gpmi3";
+                       #dma-cells = <1>;
+                       dma-channels = <4>;
+                       clocks = <&clks IMX6SX_CLK_APBH_DMA>;
+               };
+
+               gpmi: gpmi-nand@01806000{
+                       compatible = "fsl,imx6sx-gpmi-nand";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       reg = <0x01806000 0x2000>, <0x01808000 0x4000>;
+                       reg-names = "gpmi-nand", "bch";
+                       interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-names = "bch";
+                       clocks = <&clks IMX6SX_CLK_GPMI_IO>,
+                                <&clks IMX6SX_CLK_GPMI_APB>,
+                                <&clks IMX6SX_CLK_GPMI_BCH>,
+                                <&clks IMX6SX_CLK_GPMI_BCH_APB>,
+                                <&clks IMX6SX_CLK_PER1_BCH>;
+                       clock-names = "gpmi_io", "gpmi_apb", "gpmi_bch",
+                                     "gpmi_bch_apb", "per1_bch";
+                       dmas = <&dma_apbh 0>;
+                       dma-names = "rx-tx";
+                       status = "disabled";
+               };
+
+               aips1: aips-bus@02000000 {
+                       compatible = "fsl,aips-bus", "simple-bus";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       reg = <0x02000000 0x100000>;
+                       ranges;
+
+                       spba-bus@02000000 {
+                               compatible = "fsl,spba-bus", "simple-bus";
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               reg = <0x02000000 0x40000>;
+                               ranges;
+
+                               spdif: spdif@02004000 {
+                                       compatible = "fsl,imx6sx-spdif", "fsl,imx35-spdif";
+                                       reg = <0x02004000 0x4000>;
+                                       interrupts = <GIC_SPI 52 IRQ_TYPE_LEVEL_HIGH>;
+                                       dmas = <&sdma 14 18 0>,
+                                              <&sdma 15 18 0>;
+                                       dma-names = "rx", "tx";
+                                       clocks = <&clks IMX6SX_CLK_SPDIF>,
+                                                <&clks IMX6SX_CLK_OSC>,
+                                                <&clks IMX6SX_CLK_SPDIF>,
+                                                <&clks 0>, <&clks 0>, <&clks 0>,
+                                                <&clks IMX6SX_CLK_IPG>,
+                                                <&clks 0>, <&clks 0>,
+                                                <&clks IMX6SX_CLK_SPBA>;
+                                       clock-names = "core", "rxtx0",
+                                                     "rxtx1", "rxtx2",
+                                                     "rxtx3", "rxtx4",
+                                                     "rxtx5", "rxtx6",
+                                                     "rxtx7", "dma";
+                                       status = "disabled";
+                               };
+
+                               ecspi1: ecspi@02008000 {
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                                       compatible = "fsl,imx6sx-ecspi", "fsl,imx51-ecspi";
+                                       reg = <0x02008000 0x4000>;
+                                       interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;
+                                       clocks = <&clks IMX6SX_CLK_ECSPI1>,
+                                                <&clks IMX6SX_CLK_ECSPI1>;
+                                       clock-names = "ipg", "per";
+                                       status = "disabled";
+                               };
+
+                               ecspi2: ecspi@0200c000 {
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                                       compatible = "fsl,imx6sx-ecspi", "fsl,imx51-ecspi";
+                                       reg = <0x0200c000 0x4000>;
+                                       interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
+                                       clocks = <&clks IMX6SX_CLK_ECSPI2>,
+                                                <&clks IMX6SX_CLK_ECSPI2>;
+                                       clock-names = "ipg", "per";
+                                       status = "disabled";
+                               };
+
+                               ecspi3: ecspi@02010000 {
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                                       compatible = "fsl,imx6sx-ecspi", "fsl,imx51-ecspi";
+                                       reg = <0x02010000 0x4000>;
+                                       interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>;
+                                       clocks = <&clks IMX6SX_CLK_ECSPI3>,
+                                                <&clks IMX6SX_CLK_ECSPI3>;
+                                       clock-names = "ipg", "per";
+                                       status = "disabled";
+                               };
+
+                               ecspi4: ecspi@02014000 {
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                                       compatible = "fsl,imx6sx-ecspi", "fsl,imx51-ecspi";
+                                       reg = <0x02014000 0x4000>;
+                                       interrupts = <GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>;
+                                       clocks = <&clks IMX6SX_CLK_ECSPI4>,
+                                                <&clks IMX6SX_CLK_ECSPI4>;
+                                       clock-names = "ipg", "per";
+                                       status = "disabled";
+                               };
+
+                               uart1: serial@02020000 {
+                                       compatible = "fsl,imx6sx-uart", "fsl,imx21-uart";
+                                       reg = <0x02020000 0x4000>;
+                                       interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>;
+                                       clocks = <&clks IMX6SX_CLK_UART_IPG>,
+                                                <&clks IMX6SX_CLK_UART_SERIAL>;
+                                       clock-names = "ipg", "per";
+                                       dmas = <&sdma 25 4 0>, <&sdma 26 4 0>;
+                                       dma-names = "rx", "tx";
+                                       status = "disabled";
+                               };
+
+                               esai: esai@02024000 {
+                                       reg = <0x02024000 0x4000>;
+                                       interrupts = <GIC_SPI 51 IRQ_TYPE_LEVEL_HIGH>;
+                                       clocks = <&clks IMX6SX_CLK_ESAI_IPG>,
+                                                <&clks IMX6SX_CLK_ESAI_MEM>,
+                                                <&clks IMX6SX_CLK_ESAI_EXTAL>,
+                                                <&clks IMX6SX_CLK_ESAI_IPG>,
+                                                <&clks IMX6SX_CLK_SPBA>;
+                                       clock-names = "core", "mem", "extal",
+                                                     "fsys", "dma";
+                                       status = "disabled";
+                               };
+
+                               ssi1: ssi@02028000 {
+                                       compatible = "fsl,imx6sx-ssi", "fsl,imx51-ssi";
+                                       reg = <0x02028000 0x4000>;
+                                       interrupts = <GIC_SPI 46 IRQ_TYPE_LEVEL_HIGH>;
+                                       clocks = <&clks IMX6SX_CLK_SSI1_IPG>,
+                                                <&clks IMX6SX_CLK_SSI1>;
+                                       clock-names = "ipg", "baud";
+                                       dmas = <&sdma 37 1 0>, <&sdma 38 1 0>;
+                                       dma-names = "rx", "tx";
+                                       fsl,fifo-depth = <15>;
+                                       status = "disabled";
+                               };
+
+                               ssi2: ssi@0202c000 {
+                                       compatible = "fsl,imx6sx-ssi", "fsl,imx51-ssi";
+                                       reg = <0x0202c000 0x4000>;
+                                       interrupts = <GIC_SPI 47 IRQ_TYPE_LEVEL_HIGH>;
+                                       clocks = <&clks IMX6SX_CLK_SSI2_IPG>,
+                                                <&clks IMX6SX_CLK_SSI2>;
+                                       clock-names = "ipg", "baud";
+                                       dmas = <&sdma 41 1 0>, <&sdma 42 1 0>;
+                                       dma-names = "rx", "tx";
+                                       fsl,fifo-depth = <15>;
+                                       status = "disabled";
+                               };
+
+                               ssi3: ssi@02030000 {
+                                       compatible = "fsl,imx6sx-ssi", "fsl,imx51-ssi";
+                                       reg = <0x02030000 0x4000>;
+                                       interrupts = <GIC_SPI 48 IRQ_TYPE_LEVEL_HIGH>;
+                                       clocks = <&clks IMX6SX_CLK_SSI3_IPG>,
+                                                <&clks IMX6SX_CLK_SSI3>;
+                                       clock-names = "ipg", "baud";
+                                       dmas = <&sdma 45 1 0>, <&sdma 46 1 0>;
+                                       dma-names = "rx", "tx";
+                                       fsl,fifo-depth = <15>;
+                                       status = "disabled";
+                               };
+
+                               asrc: asrc@02034000 {
+                                       reg = <0x02034000 0x4000>;
+                                       interrupts = <GIC_SPI 50 IRQ_TYPE_LEVEL_HIGH>;
+                                       clocks = <&clks IMX6SX_CLK_ASRC_MEM>,
+                                                <&clks IMX6SX_CLK_ASRC_IPG>,
+                                                <&clks IMX6SX_CLK_SPDIF>,
+                                                <&clks IMX6SX_CLK_SPBA>;
+                                       clock-names = "mem", "ipg", "asrck", "dma";
+                                       dmas = <&sdma 17 20 1>, <&sdma 18 20 1>,
+                                              <&sdma 19 20 1>, <&sdma 20 20 1>,
+                                              <&sdma 21 20 1>, <&sdma 22 20 1>;
+                                       dma-names = "rxa", "rxb", "rxc",
+                                                   "txa", "txb", "txc";
+                                       status = "okay";
+                               };
+                       };
+
+                       pwm1: pwm@02080000 {
+                               compatible = "fsl,imx6sx-pwm", "fsl,imx27-pwm";
+                               reg = <0x02080000 0x4000>;
+                               interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_PWM1>,
+                                        <&clks IMX6SX_CLK_PWM1>;
+                               clock-names = "ipg", "per";
+                               #pwm-cells = <2>;
+                       };
+
+                       pwm2: pwm@02084000 {
+                               compatible = "fsl,imx6sx-pwm", "fsl,imx27-pwm";
+                               reg = <0x02084000 0x4000>;
+                               interrupts = <GIC_SPI 84 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_PWM2>,
+                                        <&clks IMX6SX_CLK_PWM2>;
+                               clock-names = "ipg", "per";
+                               #pwm-cells = <2>;
+                       };
+
+                       pwm3: pwm@02088000 {
+                               compatible = "fsl,imx6sx-pwm", "fsl,imx27-pwm";
+                               reg = <0x02088000 0x4000>;
+                               interrupts = <GIC_SPI 85 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_PWM3>,
+                                        <&clks IMX6SX_CLK_PWM3>;
+                               clock-names = "ipg", "per";
+                               #pwm-cells = <2>;
+                       };
+
+                       pwm4: pwm@0208c000 {
+                               compatible = "fsl,imx6sx-pwm", "fsl,imx27-pwm";
+                               reg = <0x0208c000 0x4000>;
+                               interrupts = <GIC_SPI 86 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_PWM4>,
+                                        <&clks IMX6SX_CLK_PWM4>;
+                               clock-names = "ipg", "per";
+                               #pwm-cells = <2>;
+                       };
+
+                       flexcan1: can@02090000 {
+                               compatible = "fsl,imx6sx-flexcan", "fsl,imx6q-flexcan";
+                               reg = <0x02090000 0x4000>;
+                               interrupts = <GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_CAN1_IPG>,
+                                        <&clks IMX6SX_CLK_CAN1_SERIAL>;
+                               clock-names = "ipg", "per";
+                               status = "disabled";
+                       };
+
+                       flexcan2: can@02094000 {
+                               compatible = "fsl,imx6sx-flexcan", "fsl,imx6q-flexcan";
+                               reg = <0x02094000 0x4000>;
+                               interrupts = <GIC_SPI 111 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_CAN2_IPG>,
+                                        <&clks IMX6SX_CLK_CAN2_SERIAL>;
+                               clock-names = "ipg", "per";
+                               status = "disabled";
+                       };
+
+                       gpt: gpt@02098000 {
+                               compatible = "fsl,imx6sx-gpt", "fsl,imx31-gpt";
+                               reg = <0x02098000 0x4000>;
+                               interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_GPT_BUS>,
+                                        <&clks IMX6SX_CLK_GPT_SERIAL>;
+                               clock-names = "ipg", "per";
+                       };
+
+                       gpio1: gpio@0209c000 {
+                               compatible = "fsl,imx6sx-gpio", "fsl,imx35-gpio";
+                               reg = <0x0209c000 0x4000>;
+                               interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>,
+                                            <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;
+                               gpio-controller;
+                               #gpio-cells = <2>;
+                               interrupt-controller;
+                               #interrupt-cells = <2>;
+                       };
+
+                       gpio2: gpio@020a0000 {
+                               compatible = "fsl,imx6sx-gpio", "fsl,imx35-gpio";
+                               reg = <0x020a0000 0x4000>;
+                               interrupts = <GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>,
+                                            <GIC_SPI 69 IRQ_TYPE_LEVEL_HIGH>;
+                               gpio-controller;
+                               #gpio-cells = <2>;
+                               interrupt-controller;
+                               #interrupt-cells = <2>;
+                       };
+
+                       gpio3: gpio@020a4000 {
+                               compatible = "fsl,imx6sx-gpio", "fsl,imx35-gpio";
+                               reg = <0x020a4000 0x4000>;
+                               interrupts = <GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH>,
+                                            <GIC_SPI 71 IRQ_TYPE_LEVEL_HIGH>;
+                               gpio-controller;
+                               #gpio-cells = <2>;
+                               interrupt-controller;
+                               #interrupt-cells = <2>;
+                       };
+
+                       gpio4: gpio@020a8000 {
+                               compatible = "fsl,imx6sx-gpio", "fsl,imx35-gpio";
+                               reg = <0x020a8000 0x4000>;
+                               interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>,
+                                            <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>;
+                               gpio-controller;
+                               #gpio-cells = <2>;
+                               interrupt-controller;
+                               #interrupt-cells = <2>;
+                       };
+
+                       gpio5: gpio@020ac000 {
+                               compatible = "fsl,imx6sx-gpio", "fsl,imx35-gpio";
+                               reg = <0x020ac000 0x4000>;
+                               interrupts = <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>,
+                                            <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>;
+                               gpio-controller;
+                               #gpio-cells = <2>;
+                               interrupt-controller;
+                               #interrupt-cells = <2>;
+                       };
+
+                       gpio6: gpio@020b0000 {
+                               compatible = "fsl,imx6sx-gpio", "fsl,imx35-gpio";
+                               reg = <0x020b0000 0x4000>;
+                               interrupts = <GIC_SPI 76 IRQ_TYPE_LEVEL_HIGH>,
+                                            <GIC_SPI 77 IRQ_TYPE_LEVEL_HIGH>;
+                               gpio-controller;
+                               #gpio-cells = <2>;
+                               interrupt-controller;
+                               #interrupt-cells = <2>;
+                       };
+
+                       gpio7: gpio@020b4000 {
+                               compatible = "fsl,imx6sx-gpio", "fsl,imx35-gpio";
+                               reg = <0x020b4000 0x4000>;
+                               interrupts = <GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>,
+                                            <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH>;
+                               gpio-controller;
+                               #gpio-cells = <2>;
+                               interrupt-controller;
+                               #interrupt-cells = <2>;
+                       };
+
+                       kpp: kpp@020b8000 {
+                               compatible = "fsl,imx6sx-kpp", "fsl,imx21-kpp";
+                               reg = <0x020b8000 0x4000>;
+                               interrupts = <GIC_SPI 82 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_DUMMY>;
+                               status = "disabled";
+                       };
+
+                       wdog1: wdog@020bc000 {
+                               compatible = "fsl,imx6sx-wdt", "fsl,imx21-wdt";
+                               reg = <0x020bc000 0x4000>;
+                               interrupts = <GIC_SPI 80 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_DUMMY>;
+                       };
+
+                       wdog2: wdog@020c0000 {
+                               compatible = "fsl,imx6sx-wdt", "fsl,imx21-wdt";
+                               reg = <0x020c0000 0x4000>;
+                               interrupts = <GIC_SPI 81 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_DUMMY>;
+                               status = "disabled";
+                       };
+
+                       clks: ccm@020c4000 {
+                               compatible = "fsl,imx6sx-ccm";
+                               reg = <0x020c4000 0x4000>;
+                               interrupts = <GIC_SPI 87 IRQ_TYPE_LEVEL_HIGH>,
+                                            <GIC_SPI 88 IRQ_TYPE_LEVEL_HIGH>;
+                               #clock-cells = <1>;
+                               clocks = <&ckil>, <&osc>, <&ipp_di0>, <&ipp_di1>;
+                               clock-names = "ckil", "osc", "ipp_di0", "ipp_di1";
+                       };
+
+                       anatop: anatop@020c8000 {
+                               compatible = "fsl,imx6sx-anatop", "fsl,imx6q-anatop",
+                                            "syscon", "simple-bus";
+                               reg = <0x020c8000 0x1000>;
+                               interrupts = <GIC_SPI 49 IRQ_TYPE_LEVEL_HIGH>,
+                                            <GIC_SPI 54 IRQ_TYPE_LEVEL_HIGH>,
+                                            <GIC_SPI 127 IRQ_TYPE_LEVEL_HIGH>;
+
+                               regulator-1p1@110 {
+                                       compatible = "fsl,anatop-regulator";
+                                       regulator-name = "vdd1p1";
+                                       regulator-min-microvolt = <800000>;
+                                       regulator-max-microvolt = <1375000>;
+                                       regulator-always-on;
+                                       anatop-reg-offset = <0x110>;
+                                       anatop-vol-bit-shift = <8>;
+                                       anatop-vol-bit-width = <5>;
+                                       anatop-min-bit-val = <4>;
+                                       anatop-min-voltage = <800000>;
+                                       anatop-max-voltage = <1375000>;
+                               };
+
+                               regulator-3p0@120 {
+                                       compatible = "fsl,anatop-regulator";
+                                       regulator-name = "vdd3p0";
+                                       regulator-min-microvolt = <2800000>;
+                                       regulator-max-microvolt = <3150000>;
+                                       regulator-always-on;
+                                       anatop-reg-offset = <0x120>;
+                                       anatop-vol-bit-shift = <8>;
+                                       anatop-vol-bit-width = <5>;
+                                       anatop-min-bit-val = <0>;
+                                       anatop-min-voltage = <2625000>;
+                                       anatop-max-voltage = <3400000>;
+                               };
+
+                               regulator-2p5@130 {
+                                       compatible = "fsl,anatop-regulator";
+                                       regulator-name = "vdd2p5";
+                                       regulator-min-microvolt = <2100000>;
+                                       regulator-max-microvolt = <2875000>;
+                                       regulator-always-on;
+                                       anatop-reg-offset = <0x130>;
+                                       anatop-vol-bit-shift = <8>;
+                                       anatop-vol-bit-width = <5>;
+                                       anatop-min-bit-val = <0>;
+                                       anatop-min-voltage = <2100000>;
+                                       anatop-max-voltage = <2875000>;
+                               };
+
+                               reg_arm: regulator-vddcore@140 {
+                                       compatible = "fsl,anatop-regulator";
+                                       regulator-name = "vddarm";
+                                       regulator-min-microvolt = <725000>;
+                                       regulator-max-microvolt = <1450000>;
+                                       regulator-always-on;
+                                       anatop-reg-offset = <0x140>;
+                                       anatop-vol-bit-shift = <0>;
+                                       anatop-vol-bit-width = <5>;
+                                       anatop-delay-reg-offset = <0x170>;
+                                       anatop-delay-bit-shift = <24>;
+                                       anatop-delay-bit-width = <2>;
+                                       anatop-min-bit-val = <1>;
+                                       anatop-min-voltage = <725000>;
+                                       anatop-max-voltage = <1450000>;
+                               };
+
+                               reg_pcie: regulator-vddpcie@140 {
+                                       compatible = "fsl,anatop-regulator";
+                                       regulator-name = "vddpcie";
+                                       regulator-min-microvolt = <725000>;
+                                       regulator-max-microvolt = <1450000>;
+                                       anatop-reg-offset = <0x140>;
+                                       anatop-vol-bit-shift = <9>;
+                                       anatop-vol-bit-width = <5>;
+                                       anatop-delay-reg-offset = <0x170>;
+                                       anatop-delay-bit-shift = <26>;
+                                       anatop-delay-bit-width = <2>;
+                                       anatop-min-bit-val = <1>;
+                                       anatop-min-voltage = <725000>;
+                                       anatop-max-voltage = <1450000>;
+                               };
+
+                               reg_soc: regulator-vddsoc@140 {
+                                       compatible = "fsl,anatop-regulator";
+                                       regulator-name = "vddsoc";
+                                       regulator-min-microvolt = <725000>;
+                                       regulator-max-microvolt = <1450000>;
+                                       regulator-always-on;
+                                       anatop-reg-offset = <0x140>;
+                                       anatop-vol-bit-shift = <18>;
+                                       anatop-vol-bit-width = <5>;
+                                       anatop-delay-reg-offset = <0x170>;
+                                       anatop-delay-bit-shift = <28>;
+                                       anatop-delay-bit-width = <2>;
+                                       anatop-min-bit-val = <1>;
+                                       anatop-min-voltage = <725000>;
+                                       anatop-max-voltage = <1450000>;
+                               };
+                       };
+
+                       tempmon: tempmon {
+                               compatible = "fsl,imx6sx-tempmon", "fsl,imx6q-tempmon";
+                               interrupts = <GIC_SPI 49 IRQ_TYPE_LEVEL_HIGH>;
+                               fsl,tempmon = <&anatop>;
+                               fsl,tempmon-data = <&ocotp>;
+                               clocks = <&clks IMX6SX_CLK_PLL3_USB_OTG>;
+                       };
+
+                       usbphy1: usbphy@020c9000 {
+                               compatible = "fsl,imx6sx-usbphy", "fsl,imx23-usbphy";
+                               reg = <0x020c9000 0x1000>;
+                               interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_USBPHY1>;
+                               fsl,anatop = <&anatop>;
+                       };
+
+                       usbphy2: usbphy@020ca000 {
+                               compatible = "fsl,imx6sx-usbphy", "fsl,imx23-usbphy";
+                               reg = <0x020ca000 0x1000>;
+                               interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_USBPHY2>;
+                               fsl,anatop = <&anatop>;
+                       };
+
+                       snvs: snvs@020cc000 {
+                               compatible = "fsl,sec-v4.0-mon", "simple-bus";
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               ranges = <0 0x020cc000 0x4000>;
+
+                               snvs-rtc-lp@34 {
+                                       compatible = "fsl,sec-v4.0-mon-rtc-lp";
+                                       reg = <0x34 0x58>;
+                                       interrupts = <GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>;
+                               };
+                       };
+
+                       epit1: epit@020d0000 {
+                               reg = <0x020d0000 0x4000>;
+                               interrupts = <GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>;
+                       };
+
+                       epit2: epit@020d4000 {
+                               reg = <0x020d4000 0x4000>;
+                               interrupts = <GIC_SPI 57 IRQ_TYPE_LEVEL_HIGH>;
+                       };
+
+                       src: src@020d8000 {
+                               compatible = "fsl,imx6sx-src", "fsl,imx51-src";
+                               reg = <0x020d8000 0x4000>;
+                               interrupts = <GIC_SPI 91 IRQ_TYPE_LEVEL_HIGH>,
+                                            <GIC_SPI 96 IRQ_TYPE_LEVEL_HIGH>;
+                               #reset-cells = <1>;
+                       };
+
+                       gpc: gpc@020dc000 {
+                               compatible = "fsl,imx6sx-gpc", "fsl,imx6q-gpc";
+                               reg = <0x020dc000 0x4000>;
+                               interrupts = <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>;
+                       };
+
+                       iomuxc: iomuxc@020e0000 {
+                               compatible = "fsl,imx6sx-iomuxc";
+                               reg = <0x020e0000 0x4000>;
+                       };
+
+                       gpr: iomuxc-gpr@020e4000 {
+                               compatible = "fsl,imx6sx-iomuxc-gpr",
+                                            "fsl,imx6q-iomuxc-gpr", "syscon";
+                               reg = <0x020e4000 0x4000>;
+                       };
+
+                       sdma: sdma@020ec000 {
+                               compatible = "fsl,imx6sx-sdma", "fsl,imx6q-sdma";
+                               reg = <0x020ec000 0x4000>;
+                               interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_SDMA>,
+                                        <&clks IMX6SX_CLK_SDMA>;
+                               clock-names = "ipg", "ahb";
+                               #dma-cells = <3>;
+                               /* imx6sx reuses imx6q sdma firmware */
+                               fsl,sdma-ram-script-name = "imx/sdma/sdma-imx6q.bin";
+                       };
+               };
+
+               aips2: aips-bus@02100000 {
+                       compatible = "fsl,aips-bus", "simple-bus";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       reg = <0x02100000 0x100000>;
+                       ranges;
+
+                       usbotg1: usb@02184000 {
+                               compatible = "fsl,imx6sx-usb", "fsl,imx27-usb";
+                               reg = <0x02184000 0x200>;
+                               interrupts = <GIC_SPI 43 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_USBOH3>;
+                               fsl,usbphy = <&usbphy1>;
+                               fsl,usbmisc = <&usbmisc 0>;
+                               fsl,anatop = <&anatop>;
+                               status = "disabled";
+                       };
+
+                       usbotg2: usb@02184200 {
+                               compatible = "fsl,imx6sx-usb", "fsl,imx27-usb";
+                               reg = <0x02184200 0x200>;
+                               interrupts = <GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_USBOH3>;
+                               fsl,usbphy = <&usbphy2>;
+                               fsl,usbmisc = <&usbmisc 1>;
+                               status = "disabled";
+                       };
+
+                       usbh: usb@02184400 {
+                               compatible = "fsl,imx6sx-usb", "fsl,imx27-usb";
+                               reg = <0x02184400 0x200>;
+                               interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_USBOH3>;
+                               fsl,usbmisc = <&usbmisc 2>;
+                               phy_type = "hsic";
+                               fsl,anatop = <&anatop>;
+                               status = "disabled";
+                       };
+
+                       usbmisc: usbmisc@02184800 {
+                               #index-cells = <1>;
+                               compatible = "fsl,imx6sx-usbmisc", "fsl,imx6q-usbmisc";
+                               reg = <0x02184800 0x200>;
+                               clocks = <&clks IMX6SX_CLK_USBOH3>;
+                       };
+
+                       fec1: ethernet@02188000 {
+                               compatible = "fsl,imx6sx-fec", "fsl,imx6q-fec";
+                               reg = <0x02188000 0x4000>;
+                               interrupts = <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>,
+                                            <GIC_SPI 119 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_ENET>,
+                                        <&clks IMX6SX_CLK_ENET_AHB>,
+                                        <&clks IMX6SX_CLK_ENET_PTP>,
+                                        <&clks IMX6SX_CLK_ENET_REF>,
+                                        <&clks IMX6SX_CLK_ENET_PTP>;
+                               clock-names = "ipg", "ahb", "ptp",
+                                             "enet_clk_ref", "enet_out";
+                               status = "disabled";
+                        };
+
+                       mlb: mlb@0218c000 {
+                               reg = <0x0218c000 0x4000>;
+                               interrupts = <GIC_SPI 53 IRQ_TYPE_LEVEL_HIGH>,
+                                            <GIC_SPI 117 IRQ_TYPE_LEVEL_HIGH>,
+                                            <GIC_SPI 126 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_MLB>;
+                               status = "disabled";
+                       };
+
+                       usdhc1: usdhc@02190000 {
+                               compatible = "fsl,imx6sx-usdhc", "fsl,imx6sl-usdhc";
+                               reg = <0x02190000 0x4000>;
+                               interrupts = <GIC_SPI 22 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_USDHC1>,
+                                        <&clks IMX6SX_CLK_USDHC1>,
+                                        <&clks IMX6SX_CLK_USDHC1>;
+                               clock-names = "ipg", "ahb", "per";
+                               bus-width = <4>;
+                               status = "disabled";
+                       };
+
+                       usdhc2: usdhc@02194000 {
+                               compatible = "fsl,imx6sx-usdhc", "fsl,imx6sl-usdhc";
+                               reg = <0x02194000 0x4000>;
+                               interrupts = <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_USDHC2>,
+                                        <&clks IMX6SX_CLK_USDHC2>,
+                                        <&clks IMX6SX_CLK_USDHC2>;
+                               clock-names = "ipg", "ahb", "per";
+                               bus-width = <4>;
+                               status = "disabled";
+                       };
+
+                       usdhc3: usdhc@02198000 {
+                               compatible = "fsl,imx6sx-usdhc", "fsl,imx6sl-usdhc";
+                               reg = <0x02198000 0x4000>;
+                               interrupts = <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_USDHC3>,
+                                        <&clks IMX6SX_CLK_USDHC3>,
+                                        <&clks IMX6SX_CLK_USDHC3>;
+                               clock-names = "ipg", "ahb", "per";
+                               bus-width = <4>;
+                               status = "disabled";
+                       };
+
+                       usdhc4: usdhc@0219c000 {
+                               compatible = "fsl,imx6sx-usdhc", "fsl,imx6sl-usdhc";
+                               reg = <0x0219c000 0x4000>;
+                               interrupts = <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_USDHC4>,
+                                        <&clks IMX6SX_CLK_USDHC4>,
+                                        <&clks IMX6SX_CLK_USDHC4>;
+                               clock-names = "ipg", "ahb", "per";
+                               bus-width = <4>;
+                               status = "disabled";
+                       };
+
+                       i2c1: i2c@021a0000 {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               compatible = "fsl,imx6sx-i2c", "fsl,imx21-i2c";
+                               reg = <0x021a0000 0x4000>;
+                               interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_I2C1>;
+                               status = "disabled";
+                       };
+
+                       i2c2: i2c@021a4000 {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               compatible = "fsl,imx6sx-i2c", "fsl,imx21-i2c";
+                               reg = <0x021a4000 0x4000>;
+                               interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_I2C2>;
+                               status = "disabled";
+                       };
+
+                       i2c3: i2c@021a8000 {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               compatible = "fsl,imx6sx-i2c", "fsl,imx21-i2c";
+                               reg = <0x021a8000 0x4000>;
+                               interrupts = <GIC_SPI 38 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_I2C3>;
+                               status = "disabled";
+                       };
+
+                       mmdc: mmdc@021b0000 {
+                               compatible = "fsl,imx6sx-mmdc", "fsl,imx6q-mmdc";
+                               reg = <0x021b0000 0x4000>;
+                       };
+
+                       fec2: ethernet@021b4000 {
+                               compatible = "fsl,imx6sx-fec";
+                               reg = <0x021b4000 0x4000>;
+                               interrupts = <GIC_SPI 102 IRQ_TYPE_LEVEL_HIGH>,
+                                            <GIC_SPI 103 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_ENET>,
+                                        <&clks IMX6SX_CLK_ENET_AHB>,
+                                        <&clks IMX6SX_CLK_ENET_PTP>,
+                                        <&clks IMX6SX_CLK_ENET2_REF_125M>,
+                                        <&clks IMX6SX_CLK_ENET_PTP>;
+                               clock-names = "ipg", "ahb", "ptp",
+                                             "enet_clk_ref", "enet_out";
+                               status = "disabled";
+                       };
+
+                       weim: weim@021b8000 {
+                               compatible = "fsl,imx6sx-weim", "fsl,imx6q-weim";
+                               reg = <0x021b8000 0x4000>;
+                               interrupts = <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_EIM_SLOW>;
+                       };
+
+                       ocotp: ocotp@021bc000 {
+                               compatible = "fsl,imx6sx-ocotp", "syscon";
+                               reg = <0x021bc000 0x4000>;
+                               clocks = <&clks IMX6SX_CLK_OCOTP>;
+                       };
+
+                       sai1: sai@021d4000 {
+                               compatible = "fsl,imx6sx-sai";
+                               reg = <0x021d4000 0x4000>;
+                               interrupts = <GIC_SPI 97 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_SAI1_IPG>,
+                                        <&clks IMX6SX_CLK_SAI1>,
+                                        <&clks 0>, <&clks 0>;
+                               clock-names = "bus", "mclk1", "mclk2", "mclk3";
+                               dma-names = "rx", "tx";
+                               dmas = <&sdma 31 23 0>, <&sdma 32 23 0>;
+                               dma-source = <&gpr 0 15 0 16>;
+                               status = "disabled";
+                       };
+
+                       audmux: audmux@021d8000 {
+                               compatible = "fsl,imx6sx-audmux", "fsl,imx31-audmux";
+                               reg = <0x021d8000 0x4000>;
+                               status = "disabled";
+                       };
+
+                       sai2: sai@021dc000 {
+                               compatible = "fsl,imx6sx-sai";
+                               reg = <0x021dc000 0x4000>;
+                               interrupts = <GIC_SPI 98 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_SAI2_IPG>,
+                                        <&clks IMX6SX_CLK_SAI2>,
+                                        <&clks 0>, <&clks 0>;
+                               clock-names = "bus", "mclk1", "mclk2", "mclk3";
+                               dma-names = "rx", "tx";
+                               dmas = <&sdma 33 23 0>, <&sdma 34 23 0>;
+                               dma-source = <&gpr 0 17 0 18>;
+                               status = "disabled";
+                       };
+
+                       qspi1: qspi@021e0000 {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               compatible = "fsl,imx6sx-qspi";
+                               reg = <0x021e0000 0x4000>, <0x60000000 0x10000000>;
+                               reg-names = "QuadSPI", "QuadSPI-memory";
+                               interrupts = <GIC_SPI 107 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_QSPI1>,
+                                        <&clks IMX6SX_CLK_QSPI1>;
+                               clock-names = "qspi_en", "qspi";
+                               status = "disabled";
+                       };
+
+                       qspi2: qspi@021e4000 {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               compatible = "fsl,imx6sx-qspi";
+                               reg = <0x021e4000 0x4000>, <0x70000000 0x10000000>;
+                               reg-names = "QuadSPI", "QuadSPI-memory";
+                               interrupts = <GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_QSPI2>,
+                                        <&clks IMX6SX_CLK_QSPI2>;
+                               clock-names = "qspi_en", "qspi";
+                               status = "disabled";
+                       };
+
+                       uart2: serial@021e8000 {
+                               compatible = "fsl,imx6sx-uart", "fsl,imx21-uart";
+                               reg = <0x021e8000 0x4000>;
+                               interrupts = <GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_UART_IPG>,
+                                        <&clks IMX6SX_CLK_UART_SERIAL>;
+                               clock-names = "ipg", "per";
+                               dmas = <&sdma 27 4 0>, <&sdma 28 4 0>;
+                               dma-names = "rx", "tx";
+                               status = "disabled";
+                       };
+
+                       uart3: serial@021ec000 {
+                               compatible = "fsl,imx6sx-uart", "fsl,imx21-uart";
+                               reg = <0x021ec000 0x4000>;
+                               interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_UART_IPG>,
+                                        <&clks IMX6SX_CLK_UART_SERIAL>;
+                               clock-names = "ipg", "per";
+                               dmas = <&sdma 29 4 0>, <&sdma 30 4 0>;
+                               dma-names = "rx", "tx";
+                               status = "disabled";
+                       };
+
+                       uart4: serial@021f0000 {
+                               compatible = "fsl,imx6sx-uart", "fsl,imx21-uart";
+                               reg = <0x021f0000 0x4000>;
+                               interrupts = <GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_UART_IPG>,
+                                        <&clks IMX6SX_CLK_UART_SERIAL>;
+                               clock-names = "ipg", "per";
+                               dmas = <&sdma 31 4 0>, <&sdma 32 4 0>;
+                               dma-names = "rx", "tx";
+                               status = "disabled";
+                       };
+
+                       uart5: serial@021f4000 {
+                               compatible = "fsl,imx6sx-uart", "fsl,imx21-uart";
+                               reg = <0x021f4000 0x4000>;
+                               interrupts = <GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_UART_IPG>,
+                                        <&clks IMX6SX_CLK_UART_SERIAL>;
+                               clock-names = "ipg", "per";
+                               dmas = <&sdma 33 4 0>, <&sdma 34 4 0>;
+                               dma-names = "rx", "tx";
+                               status = "disabled";
+                       };
+
+                       i2c4: i2c@021f8000 {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               compatible = "fsl,imx6sx-i2c", "fsl,imx21-i2c";
+                               reg = <0x021f8000 0x4000>;
+                               interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_I2C4>;
+                               status = "disabled";
+                       };
+               };
+
+               aips3: aips-bus@02200000 {
+                       compatible = "fsl,aips-bus", "simple-bus";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       reg = <0x02200000 0x100000>;
+                       ranges;
+
+                       spba-bus@02200000 {
+                               compatible = "fsl,spba-bus", "simple-bus";
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               reg = <0x02240000 0x40000>;
+                               ranges;
+
+                               csi1: csi@02214000 {
+                                       reg = <0x02214000 0x4000>;
+                                       interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>;
+                                       clocks = <&clks IMX6SX_CLK_DISPLAY_AXI>,
+                                                <&clks IMX6SX_CLK_CSI>,
+                                                <&clks IMX6SX_CLK_DCIC1>;
+                                       clock-names = "disp-axi", "csi_mclk", "dcic";
+                                       status = "disabled";
+                               };
+
+                               pxp: pxp@02218000 {
+                                       reg = <0x02218000 0x4000>;
+                                       interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>;
+                                       clocks = <&clks IMX6SX_CLK_PXP_AXI>,
+                                                <&clks IMX6SX_CLK_DISPLAY_AXI>;
+                                       clock-names = "pxp-axi", "disp-axi";
+                                       status = "disabled";
+                               };
+
+                               csi2: csi@0221c000 {
+                                       reg = <0x0221c000 0x4000>;
+                                       interrupts = <GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>;
+                                       clocks = <&clks IMX6SX_CLK_DISPLAY_AXI>,
+                                                <&clks IMX6SX_CLK_CSI>,
+                                                <&clks IMX6SX_CLK_DCIC2>;
+                                       clock-names = "disp-axi", "csi_mclk", "dcic";
+                                       status = "disabled";
+                               };
+
+                               lcdif1: lcdif@02220000 {
+                                       reg = <0x02220000 0x4000>;
+                                       interrupts = <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>;
+                                       clocks = <&clks IMX6SX_CLK_LCDIF1_PIX>,
+                                                <&clks IMX6SX_CLK_LCDIF_APB>,
+                                                <&clks IMX6SX_CLK_DISPLAY_AXI>;
+                                       clock-names = "pix", "axi", "disp_axi";
+                                       status = "disabled";
+                               };
+
+                               lcdif2: lcdif@02224000 {
+                                       reg = <0x02224000 0x4000>;
+                                       interrupts = <GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>;
+                                       clocks = <&clks IMX6SX_CLK_LCDIF2_PIX>,
+                                                <&clks IMX6SX_CLK_LCDIF_APB>,
+                                                <&clks IMX6SX_CLK_DISPLAY_AXI>;
+                                       clock-names = "pix", "axi", "disp_axi";
+                                       status = "disabled";
+                               };
+
+                               vadc: vadc@02228000 {
+                                       reg = <0x02228000 0x4000>, <0x0222c000 0x4000>;
+                                       reg-names = "vadc-vafe", "vadc-vdec";
+                                       clocks = <&clks IMX6SX_CLK_VADC>,
+                                                <&clks IMX6SX_CLK_CSI>;
+                                       clock-names = "vadc", "csi";
+                                       status = "disabled";
+                               };
+                       };
+
+                       adc1: adc@02280000 {
+                               compatible = "fsl,imx6sx-adc", "fsl,vf610-adc";
+                               reg = <0x02280000 0x4000>;
+                               interrupts = <GIC_SPI 100 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_IPG>;
+                               clock-names = "adc";
+                               status = "disabled";
+                        };
+
+                       adc2: adc@02284000 {
+                               compatible = "fsl,imx6sx-adc", "fsl,vf610-adc";
+                               reg = <0x02284000 0x4000>;
+                               interrupts = <GIC_SPI 101 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_IPG>;
+                               clock-names = "adc";
+                               status = "disabled";
+                        };
+
+                       wdog3: wdog@02288000 {
+                               compatible = "fsl,imx6sx-wdt", "fsl,imx21-wdt";
+                               reg = <0x02288000 0x4000>;
+                               interrupts = <GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_DUMMY>;
+                               status = "disabled";
+                       };
+
+                       ecspi5: ecspi@0228c000 {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               compatible = "fsl,imx6sx-ecspi", "fsl,imx51-ecspi";
+                               reg = <0x0228c000 0x4000>;
+                               interrupts = <GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_ECSPI5>,
+                                        <&clks IMX6SX_CLK_ECSPI5>;
+                               clock-names = "ipg", "per";
+                               status = "disabled";
+                       };
+
+                       uart6: serial@022a0000 {
+                               compatible = "fsl,imx6sx-uart", "fsl,imx21-uart";
+                               reg = <0x022a0000 0x4000>;
+                               interrupts = <GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_UART_IPG>,
+                                        <&clks IMX6SX_CLK_UART_SERIAL>;
+                               clock-names = "ipg", "per";
+                               dmas = <&sdma 0 4 0>, <&sdma 47 4 0>;
+                               dma-names = "rx", "tx";
+                               status = "disabled";
+                       };
+
+                       pwm5: pwm@022a4000 {
+                               compatible = "fsl,imx6sx-pwm", "fsl,imx27-pwm";
+                               reg = <0x022a4000 0x4000>;
+                               interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_PWM5>,
+                                        <&clks IMX6SX_CLK_PWM5>;
+                               clock-names = "ipg", "per";
+                               #pwm-cells = <2>;
+                       };
+
+                       pwm6: pwm@022a8000 {
+                               compatible = "fsl,imx6sx-pwm", "fsl,imx27-pwm";
+                               reg = <0x022a8000 0x4000>;
+                               interrupts = <GIC_SPI 84 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_PWM6>,
+                                        <&clks IMX6SX_CLK_PWM6>;
+                               clock-names = "ipg", "per";
+                               #pwm-cells = <2>;
+                       };
+
+                       pwm7: pwm@022ac000 {
+                               compatible = "fsl,imx6sx-pwm", "fsl,imx27-pwm";
+                               reg = <0x022ac000 0x4000>;
+                               interrupts = <GIC_SPI 85 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_PWM7>,
+                                        <&clks IMX6SX_CLK_PWM7>;
+                               clock-names = "ipg", "per";
+                               #pwm-cells = <2>;
+                       };
+
+                       pwm8: pwm@0022b0000 {
+                               compatible = "fsl,imx6sx-pwm", "fsl,imx27-pwm";
+                               reg = <0x0022b0000 0x4000>;
+                               interrupts = <GIC_SPI 86 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6SX_CLK_PWM8>,
+                                        <&clks IMX6SX_CLK_PWM8>;
+                               clock-names = "ipg", "per";
+                               #pwm-cells = <2>;
+                       };
+               };
+
+               pcie: pcie@0x08000000 {
+                       compatible = "fsl,imx6sx-pcie", "snps,dw-pcie";
+                       reg = <0x08ffc000 0x4000>; /* DBI */
+                       #address-cells = <3>;
+                       #size-cells = <2>;
+                       device_type = "pci";
+                                 /* configuration space */
+                       ranges = <0x00000800 0 0x08f00000 0x08f00000 0 0x00080000
+                                 /* downstream I/O */
+                                 0x81000000 0 0          0x08f80000 0 0x00010000
+                                 /* non-prefetchable memory */
+                                 0x82000000 0 0x08000000 0x08000000 0 0x00f00000>;
+                       num-lanes = <1>;
+                       interrupts = <GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&clks IMX6SX_CLK_PCIE_REF_125M>,
+                                <&clks IMX6SX_CLK_PCIE_AXI>,
+                                <&clks IMX6SX_CLK_LVDS1_OUT>,
+                                <&clks IMX6SX_CLK_DISPLAY_AXI>;
+                       clock-names = "pcie_ref_125m", "pcie_axi",
+                                     "lvds_gate", "display_axi";
+                       status = "disabled";
+               };
+       };
+};
index b10e6351da53f229a93488b34b832ea928531875..cf06e32ee108a221c330c8ff521e0a82d8b78e4d 100644 (file)
@@ -8,6 +8,7 @@
 / {
        model = "ARM Integrator/AP";
        compatible = "arm,integrator-ap";
+       dma-ranges = <0x80000000 0x0 0x80000000>;
 
        aliases {
                arm,timer-primary = &timer2;
index 90774d604bc13f8fc04977112f7c1bc5ff6a676f..598afe91c6763b368f2dd53f807a12e780b1a41e 100644 (file)
@@ -22,7 +22,7 @@ clocks {
                #clock-cells = <0>;
                compatible = "ti,keystone,pll-clock";
                clocks = <&refclkpass>;
-               clock-output-names = "pa-pll-clk";
+               clock-output-names = "papllclk";
                reg = <0x02620358 4>;
                reg-names = "control";
        };
index 96e65365afe302c10b63ef08157e9cee590645ba..d5adee3c006758076c4c6a8f693022893b29f4da 100644 (file)
@@ -31,7 +31,7 @@ clocks {
                #clock-cells = <0>;
                compatible = "ti,keystone,pll-clock";
                clocks = <&refclkpass>;
-               clock-output-names = "pa-pll-clk";
+               clock-output-names = "papllclk";
                reg = <0x02620358 4>;
                reg-names = "control";
        };
index 1f90cbf27fd7f73e9cff64ece88f1136b8071fbd..3223cc152a85be670c14f14d8879ac5092837489 100644 (file)
                };
        };
 };
+
+&mdio {
+       ethphy0: ethernet-phy@0 {
+               compatible = "marvell,88E1111", "ethernet-phy-ieee802.3-c22";
+               reg = <0>;
+       };
+
+       ethphy1: ethernet-phy@1 {
+               compatible = "marvell,88E1111", "ethernet-phy-ieee802.3-c22";
+               reg = <1>;
+       };
+};
index f584b80200f86f627d47b632a57886a9df2ae903..eb1e3e29f073856d76a1e47130bdd3639726d648 100644 (file)
@@ -31,7 +31,7 @@ clocks {
                #clock-cells = <0>;
                compatible = "ti,keystone,pll-clock";
                clocks = <&refclksys>;
-               clock-output-names = "pa-pll-clk";
+               clock-output-names = "papllclk";
                reg = <0x02620358 4>;
                reg-names = "control";
        };
index 93f82c7010ab384fcf5ed5afa98e2acaa379bfac..0c334b25781e7466bc321bc3aaa0d7c0c906b510 100644 (file)
@@ -215,7 +215,7 @@ clocks {
        clkpa: clkpa {
                #clock-cells = <0>;
                compatible = "ti,keystone,psc-clock";
-               clocks = <&chipclk16>;
+               clocks = <&paclk13>;
                clock-output-names = "pa";
                reg = <0x0235001c 0xb00>, <0x02350008 0x400>;
                reg-names = "control", "domain";
index c1414cb81fd4ac8e2a58a513e5e0b5fe08a6aeb9..9e31fe7d31f8ed4401c0069074e83b1dd75f1e1b 100644 (file)
                        ranges = <0 0 0x30000000 0x10000000
                                  1 0 0x21000A00 0x00000100>;
                };
+
+               mdio: mdio@02090300 {
+                       compatible      = "ti,keystone_mdio", "ti,davinci_mdio";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg             = <0x02090300 0x100>;
+                       status = "disabled";
+                       clocks = <&clkpa>;
+                       clock-names = "fck";
+                       bus_freq        = <2500000>;
+               };
        };
 };
diff --git a/arch/arm/boot/dts/kirkwood-d2net.dts b/arch/arm/boot/dts/kirkwood-d2net.dts
new file mode 100644 (file)
index 0000000..6b78560
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * Device Tree file for d2 Network v2
+ *
+ * Copyright (C) 2014 Simon Guinot <simon.guinot@sequanux.org>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2.  This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+*/
+
+/dts-v1/;
+
+#include "kirkwood-netxbig.dtsi"
+
+/ {
+       model = "LaCie d2 Network v2";
+       compatible = "lacie,d2net_v2", "lacie,netxbig", "marvell,kirkwood-88f6281", "marvell,kirkwood";
+
+       memory {
+               device_type = "memory";
+               reg = <0x00000000 0x10000000>;
+       };
+
+       ns2-leds {
+               compatible = "lacie,ns2-leds";
+
+               blue-sata {
+                       label = "d2net_v2:blue:sata";
+                       slow-gpio = <&gpio0 29 GPIO_ACTIVE_HIGH>;
+                       cmd-gpio = <&gpio0 30 GPIO_ACTIVE_HIGH>;
+               };
+       };
+
+       gpio-leds {
+               compatible = "gpio-leds";
+
+               red-fail {
+                       label = "d2net_v2:red:fail";
+                       gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>;
+               };
+       };
+};
diff --git a/arch/arm/boot/dts/kirkwood-net2big.dts b/arch/arm/boot/dts/kirkwood-net2big.dts
new file mode 100644 (file)
index 0000000..53dc37a
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * Device Tree file for LaCie 2Big Network v2
+ *
+ * Copyright (C) 2014
+ *
+ * Andrew Lunn <andrew@lunn.ch>
+ *
+ * Based on netxbig_v2-setup.c,
+ * Copyright (C) 2010 Simon Guinot <sguinot@lacie.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2.  This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+*/
+
+/dts-v1/;
+
+#include "kirkwood.dtsi"
+#include "kirkwood-6281.dtsi"
+#include "kirkwood-netxbig.dtsi"
+
+/ {
+       model = "LaCie 2Big Network v2";
+       compatible = "lacie,net2big_v2", "lacie,netxbig", "marvell,kirkwood-88f6281", "marvell,kirkwood";
+
+       memory {
+               device_type = "memory";
+               reg = <0x00000000 0x10000000>;
+       };
+};
+
+&regulators {
+       regulator@2 {
+               compatible = "regulator-fixed";
+               reg = <2>;
+               regulator-name = "hdd1power";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               enable-active-high;
+               regulator-always-on;
+               regulator-boot-on;
+               gpio = <&gpio0 17 GPIO_ACTIVE_HIGH>;
+       };
+
+       clocks {
+              g762_clk: g762-oscillator {
+                        compatible = "fixed-clock";
+                        #clock-cells = <0>;
+                        clock-frequency = <32768>;
+              };
+       };
+};
+
+&i2c0 {
+       g762@3e {
+               compatible = "gmt,g762";
+               reg = <0x3e>;
+               clocks = <&g762_clk>;
+       };
+};
diff --git a/arch/arm/boot/dts/kirkwood-net5big.dts b/arch/arm/boot/dts/kirkwood-net5big.dts
new file mode 100644 (file)
index 0000000..36155b7
--- /dev/null
@@ -0,0 +1,111 @@
+/*
+ * Device Tree file for LaCie 5Big Network v2
+ *
+ * Copyright (C) 2014
+ *
+ * Andrew Lunn <andrew@lunn.ch>
+ *
+ * Based on netxbig_v2-setup.c,
+ * Copyright (C) 2010 Simon Guinot <sguinot@lacie.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2.  This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+*/
+
+/dts-v1/;
+
+#include "kirkwood.dtsi"
+#include "kirkwood-6281.dtsi"
+#include "kirkwood-netxbig.dtsi"
+
+/ {
+       model = "LaCie 5Big Network v2";
+       compatible = "lacie,net5big_v2", "lacie,netxbig", "marvell,kirkwood-88f6281", "marvell,kirkwood";
+
+       memory {
+               device_type = "memory";
+               reg = <0x00000000 0x20000000>;
+       };
+
+};
+
+&regulators {
+       regulator@2 {
+               compatible = "regulator-fixed";
+               reg = <2>;
+               regulator-name = "hdd1power";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               enable-active-high;
+               regulator-always-on;
+               regulator-boot-on;
+               gpio = <&gpio0 17 GPIO_ACTIVE_HIGH>;
+       };
+
+       regulator@3 {
+               compatible = "regulator-fixed";
+               reg = <3>;
+               regulator-name = "hdd2power";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               enable-active-high;
+               regulator-always-on;
+               regulator-boot-on;
+               gpio = <&gpio1 9 GPIO_ACTIVE_HIGH>;
+       };
+
+       regulator@4 {
+               compatible = "regulator-fixed";
+               reg = <4>;
+               regulator-name = "hdd3power";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               enable-active-high;
+               regulator-always-on;
+               regulator-boot-on;
+               gpio = <&gpio1 10 GPIO_ACTIVE_HIGH>;
+       };
+
+       regulator@5 {
+               compatible = "regulator-fixed";
+               reg = <5>;
+               regulator-name = "hdd4power";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               enable-active-high;
+               regulator-always-on;
+               regulator-boot-on;
+               gpio = <&gpio1 11 GPIO_ACTIVE_HIGH>;
+       };
+
+       clocks {
+              g762_clk: g762-oscillator {
+                        compatible = "fixed-clock";
+                        #clock-cells = <0>;
+                        clock-frequency = <32768>;
+              };
+       };
+};
+
+&mdio {
+       ethphy1: ethernet-phy@1 {
+               reg = <0>;
+       };
+};
+
+&eth1 {
+       status = "okay";
+       ethernet1-port@0 {
+               phy-handle = <&ethphy1>;
+       };
+};
+
+
+&i2c0 {
+       g762@3e {
+               compatible = "gmt,g762";
+               reg = <0x3e>;
+               clocks = <&g762_clk>;
+       };
+};
diff --git a/arch/arm/boot/dts/kirkwood-netxbig.dtsi b/arch/arm/boot/dts/kirkwood-netxbig.dtsi
new file mode 100644 (file)
index 0000000..b0cfb7c
--- /dev/null
@@ -0,0 +1,154 @@
+/*
+ * Device Tree common file for LaCie 2Big and 5Big Network v2
+ *
+ * Copyright (C) 2014
+ *
+ * Andrew Lunn <andrew@lunn.ch>
+ *
+ * Based on netxbig_v2-setup.c,
+ * Copyright (C) 2010 Simon Guinot <sguinot@lacie.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2.  This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+*/
+
+#include "kirkwood.dtsi"
+#include "kirkwood-6281.dtsi"
+
+/ {
+       chosen {
+               bootargs = "console=ttyS0,115200n8";
+               stdout-path = &uart0;
+       };
+
+       ocp@f1000000 {
+               serial@12000 {
+                       status = "okay";
+               };
+
+               spi@10600 {
+                       status = "okay";
+
+                       flash@0 {
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               compatible = "mxicy,mx25l4005a";
+                               reg = <0>;
+                               spi-max-frequency = <20000000>;
+                               mode = <0>;
+
+                               partition@0 {
+                                       reg = <0x0 0x80000>;
+                                       label = "u-boot";
+                               };
+                       };
+               };
+
+               sata@80000 {
+                       status = "okay";
+                       nr-ports = <2>;
+               };
+
+       };
+
+       gpio-keys {
+               compatible = "gpio-keys";
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               /*
+                * button@1 and button@2 represent a three position rocker
+                * switch. Thus the conventional KEY_POWER does not fit
+                */
+               button@1 {
+                       label = "Back power switch (on|auto)";
+                       linux,code = <KEY_ESC>;
+                       linux,input-type = <5>;
+                       gpios = <&gpio0 13 GPIO_ACTIVE_LOW>;
+               };
+               button@2 {
+                       label = "Back power switch (auto|off)";
+                       linux,code = <KEY_1>;
+                       linux,input-type = <5>;
+                       gpios = <&gpio0 15 GPIO_ACTIVE_LOW>;
+               };
+               button@3 {
+                       label = "Function button";
+                       linux,code = <KEY_OPTION>;
+                       gpios = <&gpio1 2 GPIO_ACTIVE_LOW>;
+               };
+
+       };
+
+       gpio-poweroff {
+               compatible = "gpio-poweroff";
+               gpios = <&gpio0 7 GPIO_ACTIVE_HIGH>;
+       };
+
+       regulators: regulators {
+               status = "okay";
+               compatible = "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <0>;
+               pinctrl-names = "default";
+
+               regulator@1 {
+                       compatible = "regulator-fixed";
+                       reg = <1>;
+                       regulator-name = "hdd0power";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       enable-active-high;
+                       regulator-always-on;
+                       regulator-boot-on;
+                       gpio = <&gpio0 16 GPIO_ACTIVE_HIGH>;
+               };
+       };
+};
+
+&mdio {
+       status = "okay";
+
+       ethphy0: ethernet-phy@0 {
+               reg = <8>;
+       };
+
+       ethphy1: ethernet-phy@1 {
+               reg = <0>;
+       };
+};
+
+&eth0 {
+       status = "okay";
+       ethernet0-port@0 {
+               phy-handle = <&ethphy0>;
+       };
+};
+
+&pinctrl {
+       pinctrl-names = "default";
+
+       pmx_button_function: pmx-button-function {
+               marvell,pins = "mpp34";
+               marvell,function = "gpio";
+       };
+       pmx_button_power_off: pmx-button-power-off {
+               marvell,pins = "mpp15";
+               marvell,function = "gpio";
+       };
+       pmx_button_power_on: pmx-button-power-on {
+               marvell,pins = "mpp13";
+               marvell,function = "gpio";
+       };
+};
+
+&i2c0 {
+       status = "okay";
+
+       eeprom@50 {
+               compatible = "atmel,24c04";
+               pagesize = <16>;
+               reg = <0x50>;
+       };
+};
index 928f6eef2d592cc6b0fe0318c275cd3c98e75583..e83e4f9310b87346c617010276ec0e75c5279322 100644 (file)
                        compatible = "atmel,osc", "fixed-clock";
                        clock-frequency = <18432000>;
                };
+
+               main_xtal {
+                       clock-frequency = <18432000>;
+               };
        };
 
        ahb {
index ccf9ea242f72977f56f15cc658d555c063b85150..f0f5e10989282e6c49d5e5fefd5b3082bc26e0f8 100644 (file)
                        compatible = "atmel,osc", "fixed-clock";
                        clock-frequency = <18432000>;
                };
+
+               slow_xtal {
+                       clock-frequency = <32768>;
+               };
+
+               main_xtal {
+                       clock-frequency = <18432000>;
+               };
        };
 
        ahb {
diff --git a/arch/arm/boot/dts/mt6589-aquaris5.dts b/arch/arm/boot/dts/mt6589-aquaris5.dts
new file mode 100644 (file)
index 0000000..443b446
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2014 MundoReader S.L.
+ * Author: Matthias Brugger <matthias.bgg@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+/dts-v1/;
+#include "mt6589.dtsi"
+
+/ {
+       model = "bq Aquaris5";
+
+       memory {
+               reg = <0x80000000 0x40000000>;
+       };
+};
diff --git a/arch/arm/boot/dts/mt6589.dtsi b/arch/arm/boot/dts/mt6589.dtsi
new file mode 100644 (file)
index 0000000..d0297a0
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2014 MundoReader S.L.
+ * Author: Matthias Brugger <matthias.bgg@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <dt-bindings/interrupt-controller/irq.h>
+#include <dt-bindings/interrupt-controller/arm-gic.h>
+#include "skeleton.dtsi"
+
+/ {
+       compatible = "mediatek,mt6589";
+       interrupt-parent = <&gic>;
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               cpu@0 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a7";
+                       reg = <0x0>;
+               };
+               cpu@1 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a7";
+                       reg = <0x1>;
+               };
+               cpu@2 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a7";
+                       reg = <0x2>;
+               };
+               cpu@3 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a7";
+                       reg = <0x3>;
+               };
+
+       };
+
+       clocks {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "simple-bus";
+               ranges;
+
+               system_clk: dummy13m {
+                       compatible = "fixed-clock";
+                       clock-frequency = <13000000>;
+                       #clock-cells = <0>;
+               };
+
+               rtc_clk: dummy32k {
+                       compatible = "fixed-clock";
+                       clock-frequency = <32000>;
+                       #clock-cells = <0>;
+               };
+       };
+
+       soc {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "simple-bus";
+               ranges;
+
+               timer: timer@10008000 {
+                       compatible = "mediatek,mt6577-timer";
+                       reg = <0x10008000 0x80>;
+                       interrupts = <GIC_SPI 113 IRQ_TYPE_EDGE_RISING>;
+                       clocks = <&system_clk>, <&rtc_clk>;
+                       clock-names = "system-clk", "rtc-clk";
+               };
+
+               gic: interrupt-controller@10212000 {
+                       compatible = "arm,cortex-a15-gic";
+                       interrupt-controller;
+                       #interrupt-cells = <3>;
+                       reg = <0x10211000 0x1000>,
+                             <0x10212000 0x1000>,
+                             <0x10214000 0x2000>,
+                             <0x10216000 0x2000>;
+               };
+       };
+};
index e83b0468080cb7c918e307166b38a57ab576f35a..9be3c126637854cf1cc1b06ea7343eabc4f28d6e 100644 (file)
                        interrupts = <26>, <34>;
                        interrupt-names = "dsp", "iva";
                        ti,hwmods = "mailbox";
+                       ti,mbox-num-users = <4>;
+                       ti,mbox-num-fifos = <6>;
                };
 
                timer1: timer@48028000 {
 &i2c2 {
        compatible = "ti,omap2420-i2c";
 };
+
+/include/ "omap24xx-clocks.dtsi"
+/include/ "omap2420-clocks.dtsi"
index c4e8013801ee031b78c13657b660304da4a5c54f..1a00f15d90963e8a5c2f4304eaa369b86e99891b 100644 (file)
                        reg = <0x48094000 0x200>;
                        interrupts = <26>;
                        ti,hwmods = "mailbox";
+                       ti,mbox-num-users = <4>;
+                       ti,mbox-num-fifos = <6>;
                };
 
                timer1: timer@49018000 {
 &i2c2 {
        compatible = "ti,omap2430-i2c";
 };
+
+/include/ "omap24xx-clocks.dtsi"
+/include/ "omap2430-clocks.dtsi"
index b2891a9a69751a3a359b768104fcfc6fa538d46c..575a49bf968d8c4be70abafa0009d1a7c3563661 100644 (file)
                        ti,hwmods = "mailbox";
                        reg = <0x48094000 0x200>;
                        interrupts = <26>;
+                       ti,mbox-num-users = <2>;
+                       ti,mbox-num-fifos = <2>;
                };
 
                mcspi1: spi@48098000 {
index 7e26d222bfe30903ed2cacd1f867b753137faf57..69408b53200d5aa88a603962452190ea43e02858 100644 (file)
                        };
                };
 
+               mailbox: mailbox@4a0f4000 {
+                       compatible = "ti,omap4-mailbox";
+                       reg = <0x4a0f4000 0x200>;
+                       interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>;
+                       ti,hwmods = "mailbox";
+                       ti,mbox-num-users = <3>;
+                       ti,mbox-num-fifos = <8>;
+               };
+
                timer1: timer@4a318000 {
                        compatible = "ti,omap3430-timer";
                        reg = <0x4a318000 0x80>;
index 1e1b05768cec6be180957d2d38ea80a1e0ebb43d..159720d6c9569aa6b13c65ee3674ca64d335a21e 100644 (file)
                        };
                };
        };
+
+       sound: sound {
+               compatible = "ti,abe-twl6040";
+               ti,model = "omap5-uevm";
+
+               ti,mclk-freq = <19200000>;
+
+               ti,mcpdm = <&mcpdm>;
+
+               ti,twl6040 = <&twl6040>;
+
+               /* Audio routing */
+               ti,audio-routing =
+                       "Headset Stereophone", "HSOL",
+                       "Headset Stereophone", "HSOR",
+                       "Line Out", "AUXL",
+                       "Line Out", "AUXR",
+                       "HSMIC", "Headset Mic",
+                       "Headset Mic", "Headset Mic Bias",
+                       "AFML", "Line In",
+                       "AFMR", "Line In";
+       };
 };
 
 &omap5_pmx_core {
        pinctrl-names = "default";
        pinctrl-0 = <
-                       &twl6040_pins
-                       &mcpdm_pins
-                       &mcbsp1_pins
-                       &mcbsp2_pins
                        &usbhost_pins
                        &led_gpio_pins
        >;
                        ti,wakeup;
                };
 
+               clk32kgaudio: palmas_clk32k@1 {
+                       compatible = "ti,palmas-clk32kgaudio";
+                       #clock-cells = <0>;
+               };
+
                palmas_pmic {
                        compatible = "ti,palmas-pmic";
                        interrupt-parent = <&palmas>;
                        };
                };
        };
+
+       twl6040: twl@4b {
+               compatible = "ti,twl6040";
+               reg = <0x4b>;
+
+               pinctrl-names = "default";
+               pinctrl-0 = <&twl6040_pins>;
+
+               interrupts = <GIC_SPI 119 IRQ_TYPE_NONE>; /* IRQ_SYS_2N cascaded to gic */
+               interrupt-parent = <&gic>;
+               ti,audpwron-gpio = <&gpio5 13 0>;  /* gpio line 141 */
+
+               vio-supply = <&smps7_reg>;
+               v2v1-supply = <&smps9_reg>;
+               enable-active-high;
+
+               clocks = <&clk32kgaudio>;
+               clock-names = "clk32k";
+       };
 };
 
 &i2c5 {
        };
 };
 
-&mcbsp3 {
-       status = "disabled";
+&mcpdm {
+       pinctrl-names = "default";
+       pinctrl-0 = <&mcpdm_pins>;
+       status = "okay";
+};
+
+&mcbsp1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&mcbsp1_pins>;
+       status = "okay";
+};
+
+&mcbsp2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&mcbsp2_pins>;
+       status = "okay";
 };
 
 &usbhshost {
index a4ed549888660c811d843779b388151dff0c2058..fc8df1739f393657e9040e67e486e08a47e04648 100644 (file)
                        reg = <0x4a0f4000 0x200>;
                        interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "mailbox";
+                       ti,mbox-num-users = <3>;
+                       ti,mbox-num-fifos = <8>;
                };
 
                timer1: timer@4ae18000 {
                                dma-names = "audio_tx";
                        };
                };
+
+               abb_mpu: regulator-abb-mpu {
+                       compatible = "ti,abb-v2";
+                       regulator-name = "abb_mpu";
+                       #address-cells = <0>;
+                       #size-cells = <0>;
+                       clocks = <&sys_clkin>;
+                       ti,settling-time = <50>;
+                       ti,clock-cycles = <16>;
+
+                       reg = <0x4ae07cdc 0x8>, <0x4ae06014 0x4>,
+                             <0x4a0021c4 0x8>, <0x4ae0c318 0x4>;
+                       reg-names = "base-address", "int-address",
+                                   "efuse-address", "ldo-address";
+                       ti,tranxdone-status-mask = <0x80>;
+                       /* LDOVBBMPU_MUX_CTRL */
+                       ti,ldovbb-override-mask = <0x400>;
+                       /* LDOVBBMPU_VSET_OUT */
+                       ti,ldovbb-vset-mask = <0x1F>;
+
+                       /*
+                        * NOTE: only FBB mode used but actual vset will
+                        * determine final biasing
+                        */
+                       ti,abb_info = <
+                       /*uV            ABB     efuse   rbb_m fbb_m     vset_m*/
+                       1060000         0       0x0     0 0x02000000 0x01F00000
+                       1250000         0       0x4     0 0x02000000 0x01F00000
+                       >;
+               };
+
+               abb_mm: regulator-abb-mm {
+                       compatible = "ti,abb-v2";
+                       regulator-name = "abb_mm";
+                       #address-cells = <0>;
+                       #size-cells = <0>;
+                       clocks = <&sys_clkin>;
+                       ti,settling-time = <50>;
+                       ti,clock-cycles = <16>;
+
+                       reg = <0x4ae07ce4 0x8>, <0x4ae06010 0x4>,
+                             <0x4a0021a4 0x8>, <0x4ae0c314 0x4>;
+                       reg-names = "base-address", "int-address",
+                                   "efuse-address", "ldo-address";
+                       ti,tranxdone-status-mask = <0x80000000>;
+                       /* LDOVBBMM_MUX_CTRL */
+                       ti,ldovbb-override-mask = <0x400>;
+                       /* LDOVBBMM_VSET_OUT */
+                       ti,ldovbb-vset-mask = <0x1F>;
+
+                       /*
+                        * NOTE: only FBB mode used but actual vset will
+                        * determine final biasing
+                        */
+                       ti,abb_info = <
+                       /*uV            ABB     efuse   rbb_m fbb_m     vset_m*/
+                       1025000         0       0x0     0 0x02000000 0x01F00000
+                       1120000         0       0x4     0 0x02000000 0x01F00000
+                       >;
+               };
        };
 };
 
index 33ffabe9c4c86e293d9d00c63977e411cffb729b..66afcff67fde75965fc9c86b0a0e38b2bd84a0a6 100644 (file)
                        compatible = "atmel,osc", "fixed-clock";
                        clock-frequency = <12000000>;
                };
+
+               slow_xtal {
+                     clock-frequency = <32768>;
+               };
+
+               main_xtal {
+                     clock-frequency = <12000000>;
+               };
        };
 
        ahb {
index 56849b55e1c22e162e11851d29497b57571a623a..20705467f4c9a0e63f85cdc465aeaf151e3592d0 100644 (file)
 &scif2 {
        status = "okay";
 };
+
+&spi4 {
+       status = "okay";
+
+       codec: codec@0 {
+               compatible = "wlf,wm8978";
+               reg = <0>;
+               spi-max-frequency = <5000000>;
+       };
+};
index f50fbc8f3bd9584a5d8a74fb9fb55c4bfe01225b..bdee225411895f75b7e8477527496ff696074cf3 100644 (file)
                        device_type = "cpu";
                        compatible = "arm,cortex-a9";
                        reg = <0>;
+                       clock-frequency = <400000000>;
                };
        };
 
index 70b1fff8f4a3592a69bf889455504fa1d553adde..a860f32bca27fd8d089bb93f202b9b196dbcf6ac 100644 (file)
        model = "APE6EVM";
        compatible = "renesas,ape6evm-reference", "renesas,r8a73a4";
 
+       aliases {
+               serial0 = &scifa0;
+       };
+
        chosen {
                bootargs = "console=ttySC0,115200 ignore_loglevel rw";
        };
@@ -90,9 +94,6 @@
 };
 
 &pfc {
-       pinctrl-0 = <&scifa0_pins>;
-       pinctrl-names = "default";
-
        scifa0_pins: serial0 {
                renesas,groups = "scifa0_data";
                renesas,function = "scifa0";
        status = "okay";
 };
 
+&scifa0 {
+       pinctrl-0 = <&scifa0_pins>;
+       pinctrl-names = "default";
+
+       status = "okay";
+};
+
 &sdhi0 {
        vmmc-supply = <&vcc_sdhi0>;
        bus-width = <4>;
index 82c5ac825386e4d5720d738cab456c2eba3078be..d8ec5058c3519a42c446d0dd8f69d7da11a40718 100644 (file)
                status = "disabled";
        };
 
+       scifa0: serial@e6c40000 {
+               compatible = "renesas,scifa-r8a73a4", "renesas,scifa";
+               reg = <0 0xe6c40000 0 0x100>;
+               interrupts = <0 144 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+       };
+
+       scifa1: serial@e6c50000 {
+               compatible = "renesas,scifa-r8a73a4", "renesas,scifa";
+               reg = <0 0xe6c50000 0 0x100>;
+               interrupts = <0 145 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+       };
+
+       scifb2: serial@e6c20000 {
+               compatible = "renesas,scifb-r8a73a4", "renesas,scifb";
+               reg = <0 0xe6c20000 0 0x100>;
+               interrupts = <0 148 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+       };
+
+       scifb3: serial@e6c30000 {
+               compatible = "renesas,scifb-r8a73a4", "renesas,scifb";
+               reg = <0 0xe6c30000 0 0x100>;
+               interrupts = <0 149 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+       };
+
+       scifb4: serial@e6ce0000 {
+               compatible = "renesas,scifb-r8a73a4", "renesas,scifb";
+               reg = <0 0xe6ce0000 0 0x100>;
+               interrupts = <0 150 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+       };
+
+       scifb5: serial@e6cf0000 {
+               compatible = "renesas,scifb-r8a73a4", "renesas,scifb";
+               reg = <0 0xe6cf0000 0 0x100>;
+               interrupts = <0 151 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+       };
+
        mmcif0: mmc@ee200000 {
                compatible = "renesas,sh-mmcif";
                reg = <0 0xee200000 0 0x80>;
index 486007d7ffe4ee2463560655819146e84708416d..ee9e7d5c97a9a96c2ec8b67c347c00712ae0e1db 100644 (file)
        model = "armadillo 800 eva reference";
        compatible = "renesas,armadillo800eva-reference", "renesas,r8a7740";
 
+       aliases {
+               serial1 = &scifa1;
+       };
+
        chosen {
-               bootargs = "console=tty0 console=ttySC1,115200 earlyprintk=sh-sci.1,115200 ignore_loglevel root=/dev/nfs ip=dhcp rw";
+               bootargs = "console=tty0 console=ttySC1,115200 ignore_loglevel root=/dev/nfs ip=dhcp rw";
        };
 
        memory {
 
        leds {
                compatible = "gpio-leds";
-               led1 {
+               led3 {
                        gpios = <&pfc 102 GPIO_ACTIVE_HIGH>;
+                       label = "LED3";
                };
-               led2 {
+               led4 {
                        gpios = <&pfc 111 GPIO_ACTIVE_HIGH>;
+                       label = "LED4";
                };
-               led3 {
+               led5 {
                        gpios = <&pfc 110 GPIO_ACTIVE_HIGH>;
+                       label = "LED5";
                };
-               led4 {
+               led6 {
                        gpios = <&pfc 177 GPIO_ACTIVE_HIGH>;
+                       label = "LED6";
                };
        };
 
 };
 
 &pfc {
-       pinctrl-0 = <&scifa1_pins>;
-       pinctrl-names = "default";
-
        ether_pins: ether {
                renesas,groups = "gether_mii", "gether_int";
                renesas,function = "gether";
        status = "okay";
 };
 
+&scifa1 {
+       pinctrl-0 = <&scifa1_pins>;
+       pinctrl-names = "default";
+
+       status = "okay";
+};
+
 &sdhi0 {
        pinctrl-0 = <&sdhi0_pins>;
        pinctrl-names = "default";
index 55d29f4d2ed6829b2c1de815dd11a2125945c29c..bda18fb3d9e5cad7fa61bb5419eea0db07a59785 100644 (file)
                status = "disabled";
        };
 
+       scifa0: serial@e6c40000 {
+               compatible = "renesas,scifa-r8a7740", "renesas,scifa";
+               reg = <0xe6c40000 0x100>;
+               interrupts = <0 100 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+       };
+
+       scifa1: serial@e6c50000 {
+               compatible = "renesas,scifa-r8a7740", "renesas,scifa";
+               reg = <0xe6c50000 0x100>;
+               interrupts = <0 101 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+       };
+
+       scifa2: serial@e6c60000 {
+               compatible = "renesas,scifa-r8a7740", "renesas,scifa";
+               reg = <0xe6c60000 0x100>;
+               interrupts = <0 102 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+       };
+
+       scifa3: serial@e6c70000 {
+               compatible = "renesas,scifa-r8a7740", "renesas,scifa";
+               reg = <0xe6c70000 0x100>;
+               interrupts = <0 103 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+       };
+
+       scifa4: serial@e6c80000 {
+               compatible = "renesas,scifa-r8a7740", "renesas,scifa";
+               reg = <0xe6c80000 0x100>;
+               interrupts = <0 104 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+       };
+
+       scifa5: serial@e6cb0000 {
+               compatible = "renesas,scifa-r8a7740", "renesas,scifa";
+               reg = <0xe6cb0000 0x100>;
+               interrupts = <0 105 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+       };
+
+       scifa6: serial@e6cc0000 {
+               compatible = "renesas,scifa-r8a7740", "renesas,scifa";
+               reg = <0xe6cc0000 0x100>;
+               interrupts = <0 106 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+       };
+
+       scifa7: serial@e6cd0000 {
+               compatible = "renesas,scifa-r8a7740", "renesas,scifa";
+               reg = <0xe6cd0000 0x100>;
+               interrupts = <0 107 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+       };
+
+       scifb8: serial@e6c30000 {
+               compatible = "renesas,scifb-r8a7740", "renesas,scifb";
+               reg = <0xe6c30000 0x100>;
+               interrupts = <0 108 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+       };
+
        pfc: pfc@e6050000 {
                compatible = "renesas,pfc-r8a7740";
                reg = <0xe6050000 0x8000>,
index f76f6ec01e194c669ef0bcc055e78b20d602086a..3342c74c5de890b1aa845a8a32835bd1dd9fd7a9 100644 (file)
        model = "bockw";
        compatible = "renesas,bockw-reference", "renesas,r8a7778";
 
+       aliases {
+               serial0 = &scif0;
+       };
+
        chosen {
                bootargs = "console=ttySC0,115200 ignore_loglevel root=/dev/nfs ip=dhcp rw";
        };
@@ -70,9 +74,6 @@
 };
 
 &pfc {
-       pinctrl-0 = <&scif0_pins>;
-       pinctrl-names = "default";
-
        scif0_pins: serial0 {
                renesas,groups = "scif0_data_a", "scif0_ctrl";
                renesas,function = "scif0";
                };
        };
 };
+
+&scif0 {
+       pinctrl-0 = <&scif0_pins>;
+       pinctrl-names = "default";
+
+       status = "okay";
+};
index 3af0a2187493101f142a2739bbec15172b0449b9..ecfdf4b01b5a6efd93da66181688be009ae7f808 100644 (file)
                status = "disabled";
        };
 
+       scif0: serial@ffe40000 {
+               compatible = "renesas,scif-r8a7778", "renesas,scif";
+               reg = <0xffe40000 0x100>;
+               interrupts = <0 70 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+       };
+
+       scif1: serial@ffe41000 {
+               compatible = "renesas,scif-r8a7778", "renesas,scif";
+               reg = <0xffe41000 0x100>;
+               interrupts = <0 71 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+       };
+
+       scif2: serial@ffe42000 {
+               compatible = "renesas,scif-r8a7778", "renesas,scif";
+               reg = <0xffe42000 0x100>;
+               interrupts = <0 72 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+       };
+
+       scif3: serial@ffe43000 {
+               compatible = "renesas,scif-r8a7778", "renesas,scif";
+               reg = <0xffe43000 0x100>;
+               interrupts = <0 73 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+       };
+
+       scif4: serial@ffe44000 {
+               compatible = "renesas,scif-r8a7778", "renesas,scif";
+               reg = <0xffe44000 0x100>;
+               interrupts = <0 74 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+       };
+
+       scif5: serial@ffe45000 {
+               compatible = "renesas,scif-r8a7778", "renesas,scif";
+               reg = <0xffe45000 0x100>;
+               interrupts = <0 75 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+       };
+
        mmcif: mmc@ffe4e000 {
                compatible = "renesas,sh-mmcif";
                reg = <0xffe4e000 0x100>;
diff --git a/arch/arm/boot/dts/r8a7779-marzen-reference.dts b/arch/arm/boot/dts/r8a7779-marzen-reference.dts
deleted file mode 100644 (file)
index b27c637..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Reference Device Tree Source for the Marzen board
- *
- * Copyright (C) 2013 Renesas Solutions Corp.
- * Copyright (C) 2013 Simon Horman
- *
- * This file is licensed under the terms of the GNU General Public License
- * version 2.  This program is licensed "as is" without any warranty of any
- * kind, whether express or implied.
- */
-
-/dts-v1/;
-#include "r8a7779.dtsi"
-#include <dt-bindings/gpio/gpio.h>
-#include <dt-bindings/interrupt-controller/irq.h>
-
-/ {
-       model = "marzen";
-       compatible = "renesas,marzen-reference", "renesas,r8a7779";
-
-       chosen {
-               bootargs = "console=ttySC2,115200 earlyprintk=sh-sci.2,115200 ignore_loglevel root=/dev/nfs ip=on rw";
-       };
-
-       memory {
-               device_type = "memory";
-               reg = <0x60000000 0x40000000>;
-       };
-
-       fixedregulator3v3: fixedregulator@0 {
-               compatible = "regulator-fixed";
-               regulator-name = "fixed-3.3V";
-               regulator-min-microvolt = <3300000>;
-               regulator-max-microvolt = <3300000>;
-               regulator-boot-on;
-               regulator-always-on;
-       };
-
-       lan0@18000000 {
-               compatible = "smsc,lan9220", "smsc,lan9115";
-               reg = <0x18000000 0x100>;
-               pinctrl-0 = <&lan0_pins>;
-               pinctrl-names = "default";
-
-               phy-mode = "mii";
-               interrupt-parent = <&irqpin0>;
-               interrupts = <1 IRQ_TYPE_EDGE_FALLING>;
-               smsc,irq-push-pull;
-               reg-io-width = <4>;
-               vddvario-supply = <&fixedregulator3v3>;
-               vdd33a-supply = <&fixedregulator3v3>;
-       };
-
-       leds {
-               compatible = "gpio-leds";
-               led2 {
-                       gpios = <&gpio4 29 GPIO_ACTIVE_HIGH>;
-               };
-               led3 {
-                       gpios = <&gpio4 30 GPIO_ACTIVE_HIGH>;
-               };
-               led4 {
-                       gpios = <&gpio4 31 GPIO_ACTIVE_HIGH>;
-               };
-       };
-};
-
-&irqpin0 {
-       status = "okay";
-};
-
-&pfc {
-       pinctrl-0 = <&scif2_pins &scif4_pins>;
-       pinctrl-names = "default";
-
-       lan0_pins: lan0 {
-               intc {
-                       renesas,groups = "intc_irq1_b";
-                       renesas,function = "intc";
-               };
-               lbsc {
-                       renesas,groups = "lbsc_ex_cs0";
-                       renesas,function = "lbsc";
-               };
-       };
-
-       scif2_pins: serial2 {
-               renesas,groups = "scif2_data_c";
-               renesas,function = "scif2";
-       };
-
-       scif4_pins: serial4 {
-               renesas,groups = "scif4_data";
-               renesas,function = "scif4";
-       };
-
-       sdhi0_pins: sd0 {
-               renesas,groups = "sdhi0_data4", "sdhi0_ctrl", "sdhi0_cd";
-               renesas,function = "sdhi0";
-       };
-
-       hspi0_pins: hspi0 {
-               renesas,groups = "hspi0";
-               renesas,function = "hspi0";
-       };
-};
-
-&sdhi0 {
-       pinctrl-0 = <&sdhi0_pins>;
-       pinctrl-names = "default";
-
-       vmmc-supply = <&fixedregulator3v3>;
-       bus-width = <4>;
-       status = "okay";
-};
-
-&hspi0 {
-       pinctrl-0 = <&hspi0_pins>;
-       pinctrl-names = "default";
-       status = "okay";
-};
index a7af2c2371f2581b6e9f8e1e43a064eef46bc60e..5745555df9433fb4573aebba1f8ec3578b6f45d1 100644 (file)
 
 /dts-v1/;
 #include "r8a7779.dtsi"
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/interrupt-controller/irq.h>
 
 / {
        model = "marzen";
        compatible = "renesas,marzen", "renesas,r8a7779";
 
+       aliases {
+               serial2 = &scif2;
+               serial4 = &scif4;
+       };
+
        chosen {
-               bootargs = "console=ttySC2,115200 earlyprintk=sh-sci.2,115200 ignore_loglevel root=/dev/nfs ip=on";
+               bootargs = "console=ttySC2,115200 ignore_loglevel root=/dev/nfs ip=on";
        };
 
        memory {
                device_type = "memory";
                reg = <0x60000000 0x40000000>;
        };
+
+       fixedregulator3v3: fixedregulator@0 {
+               compatible = "regulator-fixed";
+               regulator-name = "fixed-3.3V";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               regulator-boot-on;
+               regulator-always-on;
+       };
+
+       lan0@18000000 {
+               compatible = "smsc,lan9220", "smsc,lan9115";
+               reg = <0x18000000 0x100>;
+               pinctrl-0 = <&lan0_pins>;
+               pinctrl-names = "default";
+
+               phy-mode = "mii";
+               interrupt-parent = <&irqpin0>;
+               interrupts = <1 IRQ_TYPE_EDGE_FALLING>;
+               smsc,irq-push-pull;
+               reg-io-width = <4>;
+               vddvario-supply = <&fixedregulator3v3>;
+               vdd33a-supply = <&fixedregulator3v3>;
+       };
+
+       leds {
+               compatible = "gpio-leds";
+               led2 {
+                       gpios = <&gpio4 29 GPIO_ACTIVE_HIGH>;
+               };
+               led3 {
+                       gpios = <&gpio4 30 GPIO_ACTIVE_HIGH>;
+               };
+               led4 {
+                       gpios = <&gpio4 31 GPIO_ACTIVE_HIGH>;
+               };
+       };
+};
+
+&irqpin0 {
+       status = "okay";
+};
+
+&extal_clk {
+       clock-frequency = <31250000>;
+};
+
+&pfc {
+       lan0_pins: lan0 {
+               intc {
+                       renesas,groups = "intc_irq1_b";
+                       renesas,function = "intc";
+               };
+               lbsc {
+                       renesas,groups = "lbsc_ex_cs0";
+                       renesas,function = "lbsc";
+               };
+       };
+
+       scif2_pins: serial2 {
+               renesas,groups = "scif2_data_c";
+               renesas,function = "scif2";
+       };
+
+       scif4_pins: serial4 {
+               renesas,groups = "scif4_data";
+               renesas,function = "scif4";
+       };
+
+       sdhi0_pins: sd0 {
+               renesas,groups = "sdhi0_data4", "sdhi0_ctrl", "sdhi0_cd";
+               renesas,function = "sdhi0";
+       };
+
+       hspi0_pins: hspi0 {
+               renesas,groups = "hspi0";
+               renesas,function = "hspi0";
+       };
+};
+
+&scif2 {
+       pinctrl-0 = <&scif2_pins>;
+       pinctrl-names = "default";
+
+       status = "okay";
+};
+
+&scif4 {
+       pinctrl-0 = <&scif4_pins>;
+       pinctrl-names = "default";
+
+       status = "okay";
+};
+
+&sdhi0 {
+       pinctrl-0 = <&sdhi0_pins>;
+       pinctrl-names = "default";
+
+       vmmc-supply = <&fixedregulator3v3>;
+       bus-width = <4>;
+       status = "okay";
+};
+
+&hspi0 {
+       pinctrl-0 = <&hspi0_pins>;
+       pinctrl-names = "default";
+       status = "okay";
 };
index b517c8e6b42094c5637a1aae27a4eec4a0f83b82..58d0d952d60e511b235fae39ab5afce807434592 100644 (file)
@@ -11,6 +11,7 @@
 
 /include/ "skeleton.dtsi"
 
+#include <dt-bindings/clock/r8a7779-clock.h>
 #include <dt-bindings/interrupt-controller/irq.h>
 
 / {
                        device_type = "cpu";
                        compatible = "arm,cortex-a9";
                        reg = <0>;
+                       clock-frequency = <1000000000>;
                };
                cpu@1 {
                        device_type = "cpu";
                        compatible = "arm,cortex-a9";
                        reg = <1>;
+                       clock-frequency = <1000000000>;
                };
                cpu@2 {
                        device_type = "cpu";
                        compatible = "arm,cortex-a9";
                        reg = <2>;
+                       clock-frequency = <1000000000>;
                };
                cpu@3 {
                        device_type = "cpu";
                        compatible = "arm,cortex-a9";
                        reg = <3>;
+                       clock-frequency = <1000000000>;
                };
        };
 
                spi2 = &hspi2;
        };
 
-        gic: interrupt-controller@f0001000 {
-                compatible = "arm,cortex-a9-gic";
-                #interrupt-cells = <3>;
-                interrupt-controller;
-                reg = <0xf0001000 0x1000>,
-                      <0xf0000100 0x100>;
-        };
+       gic: interrupt-controller@f0001000 {
+               compatible = "arm,cortex-a9-gic";
+               #interrupt-cells = <3>;
+               interrupt-controller;
+               reg = <0xf0001000 0x1000>,
+                     <0xf0000100 0x100>;
+       };
 
        gpio0: gpio@ffc40000 {
                compatible = "renesas,gpio-r8a7779", "renesas,gpio-rcar";
                compatible = "renesas,i2c-r8a7779";
                reg = <0xffc70000 0x1000>;
                interrupts = <0 79 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&mstp0_clks R8A7779_CLK_I2C0>;
                status = "disabled";
        };
 
                compatible = "renesas,i2c-r8a7779";
                reg = <0xffc71000 0x1000>;
                interrupts = <0 82 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&mstp0_clks R8A7779_CLK_I2C1>;
                status = "disabled";
        };
 
                compatible = "renesas,i2c-r8a7779";
                reg = <0xffc72000 0x1000>;
                interrupts = <0 80 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&mstp0_clks R8A7779_CLK_I2C2>;
                status = "disabled";
        };
 
                compatible = "renesas,i2c-r8a7779";
                reg = <0xffc73000 0x1000>;
                interrupts = <0 81 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&mstp0_clks R8A7779_CLK_I2C3>;
+               status = "disabled";
+       };
+
+       scif0: serial@ffe40000 {
+               compatible = "renesas,scif-r8a7779", "renesas,scif";
+               reg = <0xffe40000 0x100>;
+               interrupt-parent = <&gic>;
+               interrupts = <0 88 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&cpg_clocks R8A7779_CLK_P>;
+               clock-names = "sci_ick";
+               status = "disabled";
+       };
+
+       scif1: serial@ffe41000 {
+               compatible = "renesas,scif-r8a7779", "renesas,scif";
+               reg = <0xffe41000 0x100>;
+               interrupt-parent = <&gic>;
+               interrupts = <0 89 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&cpg_clocks R8A7779_CLK_P>;
+               clock-names = "sci_ick";
+               status = "disabled";
+       };
+
+       scif2: serial@ffe42000 {
+               compatible = "renesas,scif-r8a7779", "renesas,scif";
+               reg = <0xffe42000 0x100>;
+               interrupt-parent = <&gic>;
+               interrupts = <0 90 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&cpg_clocks R8A7779_CLK_P>;
+               clock-names = "sci_ick";
+               status = "disabled";
+       };
+
+       scif3: serial@ffe43000 {
+               compatible = "renesas,scif-r8a7779", "renesas,scif";
+               reg = <0xffe43000 0x100>;
+               interrupt-parent = <&gic>;
+               interrupts = <0 91 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&cpg_clocks R8A7779_CLK_P>;
+               clock-names = "sci_ick";
+               status = "disabled";
+       };
+
+       scif4: serial@ffe44000 {
+               compatible = "renesas,scif-r8a7779", "renesas,scif";
+               reg = <0xffe44000 0x100>;
+               interrupt-parent = <&gic>;
+               interrupts = <0 92 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&cpg_clocks R8A7779_CLK_P>;
+               clock-names = "sci_ick";
+               status = "disabled";
+       };
+
+       scif5: serial@ffe45000 {
+               compatible = "renesas,scif-r8a7779", "renesas,scif";
+               reg = <0xffe45000 0x100>;
+               interrupt-parent = <&gic>;
+               interrupts = <0 93 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&cpg_clocks R8A7779_CLK_P>;
+               clock-names = "sci_ick";
                status = "disabled";
        };
 
                compatible = "renesas,rcar-sata";
                reg = <0xfc600000 0x2000>;
                interrupts = <0 100 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&mstp1_clks R8A7779_CLK_SATA>;
        };
 
        sdhi0: sd@ffe4c000 {
                compatible = "renesas,sdhi-r8a7779";
                reg = <0xffe4c000 0x100>;
                interrupts = <0 104 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&mstp3_clks R8A7779_CLK_SDHI0>;
                cap-sd-highspeed;
                cap-sdio-irq;
                status = "disabled";
                compatible = "renesas,sdhi-r8a7779";
                reg = <0xffe4d000 0x100>;
                interrupts = <0 105 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&mstp3_clks R8A7779_CLK_SDHI1>;
                cap-sd-highspeed;
                cap-sdio-irq;
                status = "disabled";
                compatible = "renesas,sdhi-r8a7779";
                reg = <0xffe4e000 0x100>;
                interrupts = <0 107 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&mstp3_clks R8A7779_CLK_SDHI2>;
                cap-sd-highspeed;
                cap-sdio-irq;
                status = "disabled";
                compatible = "renesas,sdhi-r8a7779";
                reg = <0xffe4f000 0x100>;
                interrupts = <0 106 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&mstp3_clks R8A7779_CLK_SDHI3>;
                cap-sd-highspeed;
                cap-sdio-irq;
                status = "disabled";
                interrupts = <0 73 IRQ_TYPE_LEVEL_HIGH>;
                #address-cells = <1>;
                #size-cells = <0>;
+               clocks = <&mstp0_clks R8A7779_CLK_HSPI>;
                status = "disabled";
        };
 
                interrupts = <0 74 IRQ_TYPE_LEVEL_HIGH>;
                #address-cells = <1>;
                #size-cells = <0>;
+               clocks = <&mstp0_clks R8A7779_CLK_HSPI>;
                status = "disabled";
        };
 
                interrupts = <0 75 IRQ_TYPE_LEVEL_HIGH>;
                #address-cells = <1>;
                #size-cells = <0>;
+               clocks = <&mstp0_clks R8A7779_CLK_HSPI>;
                status = "disabled";
        };
+
+       clocks {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges;
+
+               /* External root clock */
+               extal_clk: extal_clk {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       /* This value must be overriden by the board. */
+                       clock-frequency = <0>;
+                       clock-output-names = "extal";
+               };
+
+               /* Special CPG clocks */
+               cpg_clocks: clocks@ffc80000 {
+                       compatible = "renesas,r8a7779-cpg-clocks";
+                       reg = <0xffc80000 0x30>;
+                       clocks = <&extal_clk>;
+                       #clock-cells = <1>;
+                       clock-output-names = "plla", "z", "zs", "s",
+                                            "s1", "p", "b", "out";
+               };
+
+               /* Fixed factor clocks */
+               i_clk: i_clk {
+                       compatible = "fixed-factor-clock";
+                       clocks = <&cpg_clocks R8A7779_CLK_PLLA>;
+                       #clock-cells = <0>;
+                       clock-div = <2>;
+                       clock-mult = <1>;
+                       clock-output-names = "i";
+               };
+               s3_clk: s3_clk {
+                       compatible = "fixed-factor-clock";
+                       clocks = <&cpg_clocks R8A7779_CLK_PLLA>;
+                       #clock-cells = <0>;
+                       clock-div = <8>;
+                       clock-mult = <1>;
+                       clock-output-names = "s3";
+               };
+               s4_clk: s4_clk {
+                       compatible = "fixed-factor-clock";
+                       clocks = <&cpg_clocks R8A7779_CLK_PLLA>;
+                       #clock-cells = <0>;
+                       clock-div = <16>;
+                       clock-mult = <1>;
+                       clock-output-names = "s4";
+               };
+               g_clk: g_clk {
+                       compatible = "fixed-factor-clock";
+                       clocks = <&cpg_clocks R8A7779_CLK_PLLA>;
+                       #clock-cells = <0>;
+                       clock-div = <24>;
+                       clock-mult = <1>;
+                       clock-output-names = "g";
+               };
+
+               /* Gate clocks */
+               mstp0_clks: clocks@ffc80030 {
+                       compatible = "renesas,r8a7779-mstp-clocks",
+                                    "renesas,cpg-mstp-clocks";
+                       reg = <0xffc80030 4>;
+                       clocks = <&cpg_clocks R8A7779_CLK_S>,
+                                <&cpg_clocks R8A7779_CLK_P>,
+                                <&cpg_clocks R8A7779_CLK_P>,
+                                <&cpg_clocks R8A7779_CLK_P>,
+                                <&cpg_clocks R8A7779_CLK_S>,
+                                <&cpg_clocks R8A7779_CLK_S>,
+                                <&cpg_clocks R8A7779_CLK_S1>,
+                                <&cpg_clocks R8A7779_CLK_S1>,
+                                <&cpg_clocks R8A7779_CLK_S1>,
+                                <&cpg_clocks R8A7779_CLK_S1>,
+                                <&cpg_clocks R8A7779_CLK_S1>,
+                                <&cpg_clocks R8A7779_CLK_S1>,
+                                <&cpg_clocks R8A7779_CLK_P>,
+                                <&cpg_clocks R8A7779_CLK_P>,
+                                <&cpg_clocks R8A7779_CLK_P>,
+                                <&cpg_clocks R8A7779_CLK_P>;
+                       #clock-cells = <1>;
+                       renesas,clock-indices = <
+                               R8A7779_CLK_HSPI R8A7779_CLK_TMU2
+                               R8A7779_CLK_TMU1 R8A7779_CLK_TMU0
+                               R8A7779_CLK_HSCIF1 R8A7779_CLK_HSCIF0
+                               R8A7779_CLK_SCIF5 R8A7779_CLK_SCIF4
+                               R8A7779_CLK_SCIF3 R8A7779_CLK_SCIF2
+                               R8A7779_CLK_SCIF1 R8A7779_CLK_SCIF0
+                               R8A7779_CLK_I2C3 R8A7779_CLK_I2C2
+                               R8A7779_CLK_I2C1 R8A7779_CLK_I2C0
+                       >;
+                       clock-output-names =
+                               "hspi", "tmu2", "tmu1", "tmu0", "hscif1",
+                               "hscif0", "scif5", "scif4", "scif3", "scif2",
+                               "scif1", "scif0", "i2c3", "i2c2", "i2c1",
+                               "i2c0";
+               };
+               mstp1_clks: clocks@ffc80034 {
+                       compatible = "renesas,r8a7779-mstp-clocks",
+                                    "renesas,cpg-mstp-clocks";
+                       reg = <0xffc80034 4>, <0xffc80044 4>;
+                       clocks = <&cpg_clocks R8A7779_CLK_P>,
+                                <&cpg_clocks R8A7779_CLK_P>,
+                                <&cpg_clocks R8A7779_CLK_S>,
+                                <&cpg_clocks R8A7779_CLK_S>,
+                                <&cpg_clocks R8A7779_CLK_S>,
+                                <&cpg_clocks R8A7779_CLK_S>,
+                                <&cpg_clocks R8A7779_CLK_P>,
+                                <&cpg_clocks R8A7779_CLK_P>,
+                                <&cpg_clocks R8A7779_CLK_P>,
+                                <&cpg_clocks R8A7779_CLK_S>;
+                       #clock-cells = <1>;
+                       renesas,clock-indices = <
+                               R8A7779_CLK_USB01 R8A7779_CLK_USB2
+                               R8A7779_CLK_DU R8A7779_CLK_VIN2
+                               R8A7779_CLK_VIN1 R8A7779_CLK_VIN0
+                               R8A7779_CLK_ETHER R8A7779_CLK_SATA
+                               R8A7779_CLK_PCIE R8A7779_CLK_VIN3
+                       >;
+                       clock-output-names =
+                               "usb01", "usb2",
+                               "du", "vin2",
+                               "vin1", "vin0",
+                               "ether", "sata",
+                               "pcie", "vin3";
+               };
+               mstp3_clks: clocks@ffc8003c {
+                       compatible = "renesas,r8a7779-mstp-clocks",
+                                    "renesas,cpg-mstp-clocks";
+                       reg = <0xffc8003c 4>;
+                       clocks = <&s4_clk>, <&s4_clk>, <&s4_clk>, <&s4_clk>,
+                                <&s4_clk>, <&s4_clk>;
+                       #clock-cells = <1>;
+                       renesas,clock-indices = <
+                               R8A7779_CLK_SDHI3 R8A7779_CLK_SDHI2
+                               R8A7779_CLK_SDHI1 R8A7779_CLK_SDHI0
+                               R8A7779_CLK_MMC1 R8A7779_CLK_MMC0
+                       >;
+                       clock-output-names =
+                               "sdhi3", "sdhi2", "sdhi1", "sdhi0",
+                               "mmc1", "mmc0";
+               };
+       };
 };
index dd2fe46073f2298ba68431625697e669c1ee5ddb..856b4236b67470a6a484116f71cad2ccf58ebb98 100644 (file)
 
        memory@40000000 {
                device_type = "memory";
-               reg = <0 0x40000000 0 0x80000000>;
+               reg = <0 0x40000000 0 0x40000000>;
        };
 
        memory@180000000 {
                device_type = "memory";
-               reg = <1 0x80000000 0 0x80000000>;
+               reg = <1 0x40000000 0 0xc0000000>;
        };
 
        lbsc {
                                 "msiof1_tx";
                renesas,function = "msiof1";
        };
+
+       iic1_pins: iic1 {
+               renesas,groups = "iic1";
+               renesas,function = "iic1";
+       };
+
+       iic2_pins: iic2 {
+               renesas,groups = "iic2";
+               renesas,function = "iic2";
+       };
+
+       iic3_pins: iic3 {
+               renesas,groups = "iic3";
+               renesas,function = "iic3";
+       };
+
+       usb0_pins: usb0 {
+               renesas,groups = "usb0";
+               renesas,function = "usb0";
+       };
+
+       usb1_pins: usb1 {
+               renesas,groups = "usb1";
+               renesas,function = "usb1";
+       };
+
+       usb2_pins: usb2 {
+               renesas,groups = "usb2";
+               renesas,function = "usb2";
+       };
 };
 
 &ether {
        cd-gpios = <&gpio3 22 GPIO_ACTIVE_LOW>;
        status = "okay";
 };
+
+&cpu0 {
+       cpu0-supply = <&vdd_dvfs>;
+};
+
+&iic0  {
+       status = "ok";
+};
+
+&iic1  {
+       status = "ok";
+       pinctrl-0 = <&iic1_pins>;
+       pinctrl-names = "default";
+};
+
+&iic2  {
+       status = "ok";
+       pinctrl-0 = <&iic2_pins>;
+       pinctrl-names = "default";
+};
+
+&iic3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&iic3_pins>;
+       status = "okay";
+
+       vdd_dvfs: regulator@68 {
+               compatible = "diasemi,da9210";
+               reg = <0x68>;
+
+               regulator-min-microvolt = <1000000>;
+               regulator-max-microvolt = <1000000>;
+               regulator-boot-on;
+               regulator-always-on;
+       };
+};
+
+&pci0 {
+       status = "okay";
+       pinctrl-0 = <&usb0_pins>;
+       pinctrl-names = "default";
+};
+
+&pci1 {
+       status = "okay";
+       pinctrl-0 = <&usb1_pins>;
+       pinctrl-names = "default";
+};
+
+&pci2 {
+       status = "okay";
+       pinctrl-0 = <&usb2_pins>;
+       pinctrl-names = "default";
+};
index 7ff29601f962a01747ca02115d63497e04b48d73..d9ddecbb859c122e022204d60f5dc350694fd5ff 100644 (file)
                        compatible = "arm,cortex-a15";
                        reg = <0>;
                        clock-frequency = <1300000000>;
+                       voltage-tolerance = <1>; /* 1% */
+                       clocks = <&cpg_clocks R8A7790_CLK_Z>;
+                       clock-latency = <300000>; /* 300 us */
+
+                       /* kHz - uV - OPPs unknown yet */
+                       operating-points = <1400000 1000000>,
+                                          <1225000 1000000>,
+                                          <1050000 1000000>,
+                                          < 875000 1000000>,
+                                          < 700000 1000000>,
+                                          < 350000 1000000>;
                };
 
                cpu1: cpu@1 {
                        clock-output-names = "extal";
                };
 
+               /* External PCIe clock - can be overridden by the board */
+               pcie_bus_clk: pcie_bus_clk {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <100000000>;
+                       clock-output-names = "pcie_bus";
+                       status = "disabled";
+               };
+
                /*
                 * The external audio clocks are configured as 0 Hz fixed frequency clocks by
                 * default. Boards that provide audio clocks should override them.
                        reg = <0 0xe615013c 0 4>, <0 0xe6150048 0 4>;
                        clocks = <&hp_clk>, <&cp_clk>, <&mmc1_clk>, <&sd3_clk>,
                                 <&sd2_clk>, <&cpg_clocks R8A7790_CLK_SD1>, <&cpg_clocks R8A7790_CLK_SD0>, <&mmc0_clk>,
-                                <&hp_clk>, <&hp_clk>, <&rclk_clk>;
+                                <&hp_clk>, <&mp_clk>, <&hp_clk>, <&mp_clk>, <&rclk_clk>;
                        #clock-cells = <1>;
                        renesas,clock-indices = <
                                R8A7790_CLK_IIC2 R8A7790_CLK_TPU0 R8A7790_CLK_MMCIF1 R8A7790_CLK_SDHI3
                                R8A7790_CLK_SDHI2 R8A7790_CLK_SDHI1 R8A7790_CLK_SDHI0 R8A7790_CLK_MMCIF0
-                               R8A7790_CLK_IIC0 R8A7790_CLK_IIC1 R8A7790_CLK_CMT1
+                               R8A7790_CLK_IIC0 R8A7790_CLK_PCIEC R8A7790_CLK_IIC1 R8A7790_CLK_SSUSB R8A7790_CLK_CMT1
                        >;
                        clock-output-names =
                                "iic2", "tpu0", "mmcif1", "sdhi3",
                                "sdhi2", "sdhi1", "sdhi0", "mmcif0",
-                               "iic0", "iic1", "cmt1";
+                               "iic0", "pciec", "iic1", "ssusb", "cmt1";
                };
                mstp5_clks: mstp5_clks@e6150144 {
                        compatible = "renesas,r8a7790-mstp-clocks", "renesas,cpg-mstp-clocks";
                                "rcan1", "rcan0", "qspi_mod", "iic3",
                                "i2c3", "i2c2", "i2c1", "i2c0";
                };
+               mstp10_clks: mstp10_clks@e6150998 {
+                       compatible = "renesas,r8a7790-mstp-clocks", "renesas,cpg-mstp-clocks";
+                       reg = <0 0xe6150998 0 4>, <0 0xe61509a8 0 4>;
+                       clocks = <&p_clk>,
+                               <&p_clk>, <&p_clk>, <&p_clk>, <&p_clk>, <&p_clk>,
+                               <&p_clk>, <&p_clk>, <&p_clk>, <&p_clk>, <&p_clk>,
+                               <&p_clk>,
+                               <&mstp10_clks R8A7790_CLK_SCU_ALL>, <&mstp10_clks R8A7790_CLK_SCU_ALL>,
+                               <&mstp10_clks R8A7790_CLK_SCU_ALL>, <&mstp10_clks R8A7790_CLK_SCU_ALL>,
+                               <&mstp10_clks R8A7790_CLK_SCU_ALL>, <&mstp10_clks R8A7790_CLK_SCU_ALL>,
+                               <&mstp10_clks R8A7790_CLK_SCU_ALL>, <&mstp10_clks R8A7790_CLK_SCU_ALL>,
+                               <&mstp10_clks R8A7790_CLK_SCU_ALL>, <&mstp10_clks R8A7790_CLK_SCU_ALL>,
+                               <&mstp10_clks R8A7790_CLK_SCU_ALL>, <&mstp10_clks R8A7790_CLK_SCU_ALL>;
+
+                       #clock-cells = <1>;
+                       clock-indices = <
+                               R8A7790_CLK_SSI_ALL
+                               R8A7790_CLK_SSI9 R8A7790_CLK_SSI8 R8A7790_CLK_SSI7 R8A7790_CLK_SSI6 R8A7790_CLK_SSI5
+                               R8A7790_CLK_SSI4 R8A7790_CLK_SSI3 R8A7790_CLK_SSI2 R8A7790_CLK_SSI1 R8A7790_CLK_SSI0
+                               R8A7790_CLK_SCU_ALL
+                               R8A7790_CLK_SCU_DVC1 R8A7790_CLK_SCU_DVC0
+                               R8A7790_CLK_SCU_SRC9 R8A7790_CLK_SCU_SRC8 R8A7790_CLK_SCU_SRC7 R8A7790_CLK_SCU_SRC6 R8A7790_CLK_SCU_SRC5
+                               R8A7790_CLK_SCU_SRC4 R8A7790_CLK_SCU_SRC3 R8A7790_CLK_SCU_SRC2 R8A7790_CLK_SCU_SRC1 R8A7790_CLK_SCU_SRC0
+                       >;
+                       clock-output-names =
+                               "ssi-all",
+                               "ssi9", "ssi8", "ssi7", "ssi6", "ssi5",
+                               "ssi4", "ssi3", "ssi2", "ssi1", "ssi0",
+                               "scu-all",
+                               "scu-dvc1", "scu-dvc0",
+                               "scu-src9", "scu-src8", "scu-src7", "scu-src6", "scu-src5",
+                               "scu-src4", "scu-src3", "scu-src2", "scu-src1", "scu-src0";
+               };
        };
 
        qspi: spi@e6b10000 {
                #size-cells = <0>;
                status = "disabled";
        };
+
+       pci0: pci@ee090000 {
+               compatible = "renesas,pci-r8a7790";
+               device_type = "pci";
+               clocks = <&mstp7_clks R8A7790_CLK_EHCI>;
+               reg = <0 0xee090000 0 0xc00>,
+                     <0 0xee080000 0 0x1100>;
+               interrupts = <0 108 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+
+               bus-range = <0 0>;
+               #address-cells = <3>;
+               #size-cells = <2>;
+               #interrupt-cells = <1>;
+               ranges = <0x02000000 0 0xee080000 0 0xee080000 0 0x00010000>;
+               interrupt-map-mask = <0xff00 0 0 0x7>;
+               interrupt-map = <0x0000 0 0 1 &gic 0 108 IRQ_TYPE_LEVEL_HIGH
+                                0x0800 0 0 1 &gic 0 108 IRQ_TYPE_LEVEL_HIGH
+                                0x1000 0 0 2 &gic 0 108 IRQ_TYPE_LEVEL_HIGH>;
+       };
+
+       pci1: pci@ee0b0000 {
+               compatible = "renesas,pci-r8a7790";
+               device_type = "pci";
+               clocks = <&mstp7_clks R8A7790_CLK_EHCI>;
+               reg = <0 0xee0b0000 0 0xc00>,
+                     <0 0xee0a0000 0 0x1100>;
+               interrupts = <0 112 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+
+               bus-range = <1 1>;
+               #address-cells = <3>;
+               #size-cells = <2>;
+               #interrupt-cells = <1>;
+               ranges = <0x02000000 0 0xee0a0000 0 0xee0a0000 0 0x00010000>;
+               interrupt-map-mask = <0xff00 0 0 0x7>;
+               interrupt-map = <0x0000 0 0 1 &gic 0 112 IRQ_TYPE_LEVEL_HIGH
+                                0x0800 0 0 1 &gic 0 112 IRQ_TYPE_LEVEL_HIGH
+                                0x1000 0 0 2 &gic 0 112 IRQ_TYPE_LEVEL_HIGH>;
+       };
+
+       pci2: pci@ee0d0000 {
+               compatible = "renesas,pci-r8a7790";
+               device_type = "pci";
+               clocks = <&mstp7_clks R8A7790_CLK_EHCI>;
+               reg = <0 0xee0d0000 0 0xc00>,
+                     <0 0xee0c0000 0 0x1100>;
+               interrupts = <0 113 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+
+               bus-range = <2 2>;
+               #address-cells = <3>;
+               #size-cells = <2>;
+               #interrupt-cells = <1>;
+               ranges = <0x02000000 0 0xee0c0000 0 0xee0c0000 0 0x00010000>;
+               interrupt-map-mask = <0xff00 0 0 0x7>;
+               interrupt-map = <0x0000 0 0 1 &gic 0 113 IRQ_TYPE_LEVEL_HIGH
+                                0x0800 0 0 1 &gic 0 113 IRQ_TYPE_LEVEL_HIGH
+                                0x1000 0 0 2 &gic 0 113 IRQ_TYPE_LEVEL_HIGH>;
+       };
+
+       pciec: pcie@fe000000 {
+               compatible = "renesas,pcie-r8a7790";
+               reg = <0 0xfe000000 0 0x80000>;
+               #address-cells = <3>;
+               #size-cells = <2>;
+               bus-range = <0x00 0xff>;
+               device_type = "pci";
+               ranges = <0x01000000 0 0x00000000 0 0xfe100000 0 0x00100000
+                         0x02000000 0 0xfe200000 0 0xfe200000 0 0x00200000
+                         0x02000000 0 0x30000000 0 0x30000000 0 0x08000000
+                         0x42000000 0 0x38000000 0 0x38000000 0 0x08000000>;
+               /* Map all possible DDR as inbound ranges */
+               dma-ranges = <0x42000000 0 0x40000000 0 0x40000000 0 0x80000000
+                             0x43000000 1 0x80000000 1 0x80000000 0 0x80000000>;
+               interrupts = <0 116 IRQ_TYPE_LEVEL_HIGH>,
+                            <0 117 IRQ_TYPE_LEVEL_HIGH>,
+                            <0 118 IRQ_TYPE_LEVEL_HIGH>;
+               #interrupt-cells = <1>;
+               interrupt-map-mask = <0 0 0 0>;
+               interrupt-map = <0 0 0 0 &gic 0 116 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&mstp3_clks R8A7790_CLK_PCIEC>, <&pcie_bus_clk>;
+               clock-names = "pcie", "pcie_bus";
+               status = "disabled";
+       };
+
+       rcar_sound: rcar_sound@0xec500000 {
+               #sound-dai-cells = <1>;
+               compatible =  "renesas,rcar_sound-r8a7790", "renesas,rcar_sound-gen2", "renesas,rcar_sound";
+               interrupt-parent = <&gic>;
+               reg =   <0 0xec500000 0 0x1000>, /* SCU */
+                       <0 0xec5a0000 0 0x100>,  /* ADG */
+                       <0 0xec540000 0 0x1000>, /* SSIU */
+                       <0 0xec541000 0 0x1280>; /* SSI */
+               clocks = <&mstp10_clks R8A7790_CLK_SSI_ALL>,
+                       <&mstp10_clks R8A7790_CLK_SSI9>, <&mstp10_clks R8A7790_CLK_SSI8>,
+                       <&mstp10_clks R8A7790_CLK_SSI7>, <&mstp10_clks R8A7790_CLK_SSI6>,
+                       <&mstp10_clks R8A7790_CLK_SSI5>, <&mstp10_clks R8A7790_CLK_SSI4>,
+                       <&mstp10_clks R8A7790_CLK_SSI3>, <&mstp10_clks R8A7790_CLK_SSI2>,
+                       <&mstp10_clks R8A7790_CLK_SSI1>, <&mstp10_clks R8A7790_CLK_SSI0>,
+                       <&mstp10_clks R8A7790_CLK_SCU_SRC9>, <&mstp10_clks R8A7790_CLK_SCU_SRC8>,
+                       <&mstp10_clks R8A7790_CLK_SCU_SRC7>, <&mstp10_clks R8A7790_CLK_SCU_SRC6>,
+                       <&mstp10_clks R8A7790_CLK_SCU_SRC5>, <&mstp10_clks R8A7790_CLK_SCU_SRC4>,
+                       <&mstp10_clks R8A7790_CLK_SCU_SRC3>, <&mstp10_clks R8A7790_CLK_SCU_SRC2>,
+                       <&mstp10_clks R8A7790_CLK_SCU_SRC1>, <&mstp10_clks R8A7790_CLK_SCU_SRC0>,
+                       <&mstp10_clks R8A7790_CLK_SCU_DVC0>, <&mstp10_clks R8A7790_CLK_SCU_DVC1>,
+                       <&audio_clk_a>, <&audio_clk_b>, <&audio_clk_c>, <&m2_clk>;
+               clock-names = "ssi-all",
+                               "ssi.9", "ssi.8", "ssi.7", "ssi.6", "ssi.5",
+                               "ssi.4", "ssi.3", "ssi.2", "ssi.1", "ssi.0",
+                               "src.9", "src.8", "src.7", "src.6", "src.5",
+                               "src.4", "src.3", "src.2", "src.1", "src.0",
+                               "dvc.0", "dvc.1",
+                               "clk_a", "clk_b", "clk_c", "clk_i";
+
+               status = "disabled";
+
+               rcar_sound,dvc {
+                       dvc0: dvc@0 { };
+                       dvc1: dvc@1 { };
+               };
+
+               rcar_sound,src {
+                       src0: src@0 { };
+                       src1: src@1 { };
+                       src2: src@2 { };
+                       src3: src@3 { };
+                       src4: src@4 { };
+                       src5: src@5 { };
+                       src6: src@6 { };
+                       src7: src@7 { };
+                       src8: src@8 { };
+                       src9: src@9 { };
+               };
+
+               rcar_sound,ssi {
+                       ssi0: ssi@0 { interrupts = <0 370 IRQ_TYPE_LEVEL_HIGH>; };
+                       ssi1: ssi@1 { interrupts = <0 371 IRQ_TYPE_LEVEL_HIGH>; };
+                       ssi2: ssi@2 { interrupts = <0 372 IRQ_TYPE_LEVEL_HIGH>; };
+                       ssi3: ssi@3 { interrupts = <0 373 IRQ_TYPE_LEVEL_HIGH>; };
+                       ssi4: ssi@4 { interrupts = <0 374 IRQ_TYPE_LEVEL_HIGH>; };
+                       ssi5: ssi@5 { interrupts = <0 375 IRQ_TYPE_LEVEL_HIGH>; };
+                       ssi6: ssi@6 { interrupts = <0 376 IRQ_TYPE_LEVEL_HIGH>; };
+                       ssi7: ssi@7 { interrupts = <0 377 IRQ_TYPE_LEVEL_HIGH>; };
+                       ssi8: ssi@8 { interrupts = <0 378 IRQ_TYPE_LEVEL_HIGH>; };
+                       ssi9: ssi@9 { interrupts = <0 379 IRQ_TYPE_LEVEL_HIGH>; };
+               };
+       };
 };
index cc6d992e8db219e3502b2265f01d1d6a0620a608..3a2ef0a2a137f8d49754c28b2bb95ba9bb2fb225 100644 (file)
                renesas,function = "sdhi2";
        };
 
+       i2c2_pins: i2c2 {
+               renesas,groups = "i2c2";
+               renesas,function = "i2c2";
+       };
+
        qspi_pins: spi0 {
                renesas,groups = "qspi_ctrl", "qspi_data4";
                renesas,function = "qspi";
                                 "msiof0_tx";
                renesas,function = "msiof0";
        };
+
+       usb0_pins: usb0 {
+               renesas,groups = "usb0";
+               renesas,function = "usb0";
+       };
+
+       usb1_pins: usb1 {
+               renesas,groups = "usb1";
+               renesas,function = "usb1";
+       };
 };
 
 &scif0 {
 };
 
 &sata0 {
-       status = "okay";
+       status = "okay";
 };
 
 &sdhi0 {
        status = "okay";
 };
 
+&i2c2 {
+       pinctrl-0 = <&i2c2_pins>;
+       pinctrl-names = "default";
+
+       status = "okay";
+       clock-frequency = <400000>;
+};
+
 &qspi {
        pinctrl-0 = <&qspi_pins>;
        pinctrl-names = "default";
                spi-cpha;
        };
 };
+
+&pci0 {
+       status = "okay";
+       pinctrl-0 = <&usb0_pins>;
+       pinctrl-names = "default";
+};
+
+&pci1 {
+       status = "okay";
+       pinctrl-0 = <&usb1_pins>;
+       pinctrl-names = "default";
+};
+
+&pcie_bus_clk {
+       status = "okay";
+};
+
+&pciec {
+       status = "okay";
+};
index 05d44f9b202f5d5199c2f576298c76cd8774dfde..23486c081a69891096cd08c157d8dfc7fd94384b 100644 (file)
        clock-frequency = <20000000>;
 };
 
-&i2c2 {
-       pinctrl-0 = <&i2c2_pins>;
-       pinctrl-names = "default";
-
-       status = "okay";
-       clock-frequency = <400000>;
-
-       eeprom@50 {
-               compatible = "renesas,24c02";
-               reg = <0x50>;
-               pagesize = <16>;
-       };
-};
-
-&i2c6 {
-       status = "okay";
-       clock-frequency = <100000>;
-};
-
 &pfc {
        pinctrl-0 = <&du_pins>;
        pinctrl-names = "default";
                                 "msiof0_tx";
                renesas,function = "msiof0";
        };
+
+       i2c6_pins: i2c6 {
+               renesas,groups = "i2c6";
+               renesas,function = "i2c6";
+       };
+
+       usb0_pins: usb0 {
+               renesas,groups = "usb0";
+               renesas,function = "usb0";
+       };
+
+       usb1_pins: usb1 {
+               renesas,groups = "usb1";
+               renesas,function = "usb1";
+       };
 };
 
 &ether {
                spi-cpha;
        };
 };
+
+&i2c2 {
+       pinctrl-0 = <&i2c2_pins>;
+       pinctrl-names = "default";
+
+       status = "okay";
+       clock-frequency = <400000>;
+
+       eeprom@50 {
+               compatible = "renesas,24c02";
+               reg = <0x50>;
+               pagesize = <16>;
+       };
+};
+
+&i2c6 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&i2c6_pins>;
+       status = "okay";
+       clock-frequency = <100000>;
+
+       vdd_dvfs: regulator@68 {
+               compatible = "diasemi,da9210";
+               reg = <0x68>;
+
+               regulator-min-microvolt = <1000000>;
+               regulator-max-microvolt = <1000000>;
+               regulator-boot-on;
+               regulator-always-on;
+       };
+};
+
+&pci0 {
+       status = "okay";
+       pinctrl-0 = <&usb0_pins>;
+       pinctrl-names = "default";
+};
+
+&pci1 {
+       status = "okay";
+       pinctrl-0 = <&usb1_pins>;
+       pinctrl-names = "default";
+};
+
+&pcie_bus_clk {
+       status = "okay";
+};
+
+&pciec {
+       status = "okay";
+};
+
+&cpu0 {
+       cpu0-supply = <&vdd_dvfs>;
+};
index 79f68acfd5d46c9dd9bced05190dbb9173c5500b..0d82a4b3c650cf197c107a88a7d962378cf94e16 100644 (file)
                        compatible = "arm,cortex-a15";
                        reg = <0>;
                        clock-frequency = <1500000000>;
+                       voltage-tolerance = <1>; /* 1% */
+                       clocks = <&cpg_clocks R8A7791_CLK_Z>;
+                       clock-latency = <300000>; /* 300 us */
+
+                       /* kHz - uV - OPPs unknown yet */
+                       operating-points = <1500000 1000000>,
+                                          <1312500 1000000>,
+                                          <1125000 1000000>,
+                                          < 937500 1000000>,
+                                          < 750000 1000000>,
+                                          < 375000 1000000>;
                };
 
                cpu1: cpu@1 {
                        clock-output-names = "extal";
                };
 
+               /*
+                * The external audio clocks are configured as 0 Hz fixed frequency clocks by
+                * default. Boards that provide audio clocks should override them.
+                */
+               audio_clk_a: audio_clk_a {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <0>;
+                       clock-output-names = "audio_clk_a";
+               };
+               audio_clk_b: audio_clk_b {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <0>;
+                       clock-output-names = "audio_clk_b";
+               };
+               audio_clk_c: audio_clk_c {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <0>;
+                       clock-output-names = "audio_clk_c";
+               };
+
+               /* External PCIe clock - can be overridden by the board */
+               pcie_bus_clk: pcie_bus_clk {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <100000000>;
+                       clock-output-names = "pcie_bus";
+                       status = "disabled";
+               };
+
                /* Special CPG clocks */
                cpg_clocks: cpg_clocks@e6150000 {
                        compatible = "renesas,r8a7791-cpg-clocks",
                        compatible = "renesas,r8a7791-mstp-clocks", "renesas,cpg-mstp-clocks";
                        reg = <0 0xe6150138 0 4>, <0 0xe6150040 0 4>;
                        clocks = <&mp_clk>, <&mp_clk>, <&mp_clk>, <&mp_clk>, <&mp_clk>,
-                                <&mp_clk>, <&mp_clk>, <&mp_clk>;
+                                <&mp_clk>, <&mp_clk>, <&mp_clk>,
+                                <&zs_clk>, <&zs_clk>;
                        #clock-cells = <1>;
                        renesas,clock-indices = <
                                R8A7791_CLK_SCIFA2 R8A7791_CLK_SCIFA1 R8A7791_CLK_SCIFA0
                                R8A7791_CLK_MSIOF2 R8A7791_CLK_SCIFB0 R8A7791_CLK_SCIFB1
                                R8A7791_CLK_MSIOF1 R8A7791_CLK_SCIFB2
+                               R8A7791_CLK_SYS_DMAC1 R8A7791_CLK_SYS_DMAC0
                        >;
                        clock-output-names =
                                "scifa2", "scifa1", "scifa0", "msiof2", "scifb0",
-                               "scifb1", "msiof1", "scifb2";
+                               "scifb1", "msiof1", "scifb2",
+                               "sys-dmac1", "sys-dmac0";
                };
                mstp3_clks: mstp3_clks@e615013c {
                        compatible = "renesas,r8a7791-mstp-clocks", "renesas,cpg-mstp-clocks";
                        reg = <0 0xe615013c 0 4>, <0 0xe6150048 0 4>;
                        clocks = <&cp_clk>, <&sd2_clk>, <&sd1_clk>, <&cpg_clocks R8A7791_CLK_SD0>,
-                                <&mmc0_clk>, <&hp_clk>, <&hp_clk>, <&rclk_clk>;
+                                <&mmc0_clk>, <&hp_clk>, <&mp_clk>, <&hp_clk>, <&mp_clk>, <&rclk_clk>;
                        #clock-cells = <1>;
                        renesas,clock-indices = <
                                R8A7791_CLK_TPU0 R8A7791_CLK_SDHI2 R8A7791_CLK_SDHI1 R8A7791_CLK_SDHI0
-                               R8A7791_CLK_MMCIF0 R8A7791_CLK_IIC0 R8A7791_CLK_IIC1 R8A7791_CLK_CMT1
+                               R8A7791_CLK_MMCIF0 R8A7791_CLK_IIC0 R8A7791_CLK_PCIEC R8A7791_CLK_IIC1
+                               R8A7791_CLK_SSUSB R8A7791_CLK_CMT1
                        >;
                        clock-output-names =
                                "tpu0", "sdhi2", "sdhi1", "sdhi0",
-                               "mmcif0", "i2c7", "i2c8", "cmt1";
+                               "mmcif0", "i2c7", "pciec", "i2c8", "ssusb", "cmt1";
                };
                mstp5_clks: mstp5_clks@e6150144 {
                        compatible = "renesas,r8a7791-mstp-clocks", "renesas,cpg-mstp-clocks";
                                "rcan1", "rcan0", "qspi_mod", "i2c5", "i2c6", "i2c4", "i2c3", "i2c2",
                                "i2c1", "i2c0";
                };
+               mstp10_clks: mstp10_clks@e6150998 {
+                       compatible = "renesas,r8a7791-mstp-clocks", "renesas,cpg-mstp-clocks";
+                       reg = <0 0xe6150998 0 4>, <0 0xe61509a8 0 4>;
+                       clocks = <&p_clk>,
+                               <&p_clk>, <&p_clk>, <&p_clk>, <&p_clk>, <&p_clk>,
+                               <&p_clk>, <&p_clk>, <&p_clk>, <&p_clk>, <&p_clk>,
+                               <&p_clk>,
+                               <&mstp10_clks R8A7791_CLK_SCU_ALL>, <&mstp10_clks R8A7791_CLK_SCU_ALL>,
+                               <&mstp10_clks R8A7791_CLK_SCU_ALL>, <&mstp10_clks R8A7791_CLK_SCU_ALL>,
+                               <&mstp10_clks R8A7791_CLK_SCU_ALL>, <&mstp10_clks R8A7791_CLK_SCU_ALL>,
+                               <&mstp10_clks R8A7791_CLK_SCU_ALL>, <&mstp10_clks R8A7791_CLK_SCU_ALL>,
+                               <&mstp10_clks R8A7791_CLK_SCU_ALL>, <&mstp10_clks R8A7791_CLK_SCU_ALL>,
+                               <&mstp10_clks R8A7791_CLK_SCU_ALL>, <&mstp10_clks R8A7791_CLK_SCU_ALL>;
+
+                       #clock-cells = <1>;
+                       clock-indices = <
+                               R8A7791_CLK_SSI_ALL
+                               R8A7791_CLK_SSI9 R8A7791_CLK_SSI8 R8A7791_CLK_SSI7 R8A7791_CLK_SSI6 R8A7791_CLK_SSI5
+                               R8A7791_CLK_SSI4 R8A7791_CLK_SSI3 R8A7791_CLK_SSI2 R8A7791_CLK_SSI1 R8A7791_CLK_SSI0
+                               R8A7791_CLK_SCU_ALL
+                               R8A7791_CLK_SCU_DVC1 R8A7791_CLK_SCU_DVC0
+                               R8A7791_CLK_SCU_SRC9 R8A7791_CLK_SCU_SRC8 R8A7791_CLK_SCU_SRC7 R8A7791_CLK_SCU_SRC6 R8A7791_CLK_SCU_SRC5
+                               R8A7791_CLK_SCU_SRC4 R8A7791_CLK_SCU_SRC3 R8A7791_CLK_SCU_SRC2 R8A7791_CLK_SCU_SRC1 R8A7791_CLK_SCU_SRC0
+                       >;
+                       clock-output-names =
+                               "ssi-all",
+                               "ssi9", "ssi8", "ssi7", "ssi6", "ssi5",
+                               "ssi4", "ssi3", "ssi2", "ssi1", "ssi0",
+                               "scu-all",
+                               "scu-dvc1", "scu-dvc0",
+                               "scu-src9", "scu-src8", "scu-src7", "scu-src6", "scu-src5",
+                               "scu-src4", "scu-src3", "scu-src2", "scu-src1", "scu-src0";
+               };
                mstp11_clks: mstp11_clks@e615099c {
                        compatible = "renesas,r8a7791-mstp-clocks", "renesas,cpg-mstp-clocks";
                        reg = <0 0xe615099c 0 4>, <0 0xe61509ac 0 4>;
                #size-cells = <0>;
                status = "disabled";
        };
+
+       pci0: pci@ee090000 {
+               compatible = "renesas,pci-r8a7791";
+               device_type = "pci";
+               clocks = <&mstp7_clks R8A7791_CLK_EHCI>;
+               reg = <0 0xee090000 0 0xc00>,
+                     <0 0xee080000 0 0x1100>;
+               interrupts = <0 108 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+
+               bus-range = <0 0>;
+               #address-cells = <3>;
+               #size-cells = <2>;
+               #interrupt-cells = <1>;
+               ranges = <0x02000000 0 0xee080000 0 0xee080000 0 0x00010000>;
+               interrupt-map-mask = <0xff00 0 0 0x7>;
+               interrupt-map = <0x0000 0 0 1 &gic 0 108 IRQ_TYPE_LEVEL_HIGH
+                                0x0800 0 0 1 &gic 0 108 IRQ_TYPE_LEVEL_HIGH
+                                0x1000 0 0 2 &gic 0 108 IRQ_TYPE_LEVEL_HIGH>;
+       };
+
+       pci1: pci@ee0d0000 {
+               compatible = "renesas,pci-r8a7791";
+               device_type = "pci";
+               clocks = <&mstp7_clks R8A7791_CLK_EHCI>;
+               reg = <0 0xee0d0000 0 0xc00>,
+                     <0 0xee0c0000 0 0x1100>;
+               interrupts = <0 113 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+
+               bus-range = <1 1>;
+               #address-cells = <3>;
+               #size-cells = <2>;
+               #interrupt-cells = <1>;
+               ranges = <0x02000000 0 0xee0c0000 0 0xee0c0000 0 0x00010000>;
+               interrupt-map-mask = <0xff00 0 0 0x7>;
+               interrupt-map = <0x0000 0 0 1 &gic 0 113 IRQ_TYPE_LEVEL_HIGH
+                                0x0800 0 0 1 &gic 0 113 IRQ_TYPE_LEVEL_HIGH
+                                0x1000 0 0 2 &gic 0 113 IRQ_TYPE_LEVEL_HIGH>;
+       };
+
+       pciec: pcie@fe000000 {
+               compatible = "renesas,pcie-r8a7791";
+               reg = <0 0xfe000000 0 0x80000>;
+               #address-cells = <3>;
+               #size-cells = <2>;
+               bus-range = <0x00 0xff>;
+               device_type = "pci";
+               ranges = <0x01000000 0 0x00000000 0 0xfe100000 0 0x00100000
+                         0x02000000 0 0xfe200000 0 0xfe200000 0 0x00200000
+                         0x02000000 0 0x30000000 0 0x30000000 0 0x08000000
+                         0x42000000 0 0x38000000 0 0x38000000 0 0x08000000>;
+               /* Map all possible DDR as inbound ranges */
+               dma-ranges = <0x42000000 0 0x40000000 0 0x40000000 0 0x80000000
+                             0x43000000 2 0x00000000 2 0x00000000 1 0x00000000>;
+               interrupts = <0 116 IRQ_TYPE_LEVEL_HIGH>,
+                            <0 117 IRQ_TYPE_LEVEL_HIGH>,
+                            <0 118 IRQ_TYPE_LEVEL_HIGH>;
+               #interrupt-cells = <1>;
+               interrupt-map-mask = <0 0 0 0>;
+               interrupt-map = <0 0 0 0 &gic 0 116 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&mstp3_clks R8A7791_CLK_PCIEC>, <&pcie_bus_clk>;
+               clock-names = "pcie", "pcie_bus";
+               status = "disabled";
+       };
+
+       rcar_sound: rcar_sound@0xec500000 {
+               #sound-dai-cells = <1>;
+               compatible =  "renesas,rcar_sound-r8a7791", "renesas,rcar_sound-gen2", "renesas,rcar_sound";
+               interrupt-parent = <&gic>;
+               reg =   <0 0xec500000 0 0x1000>, /* SCU */
+                       <0 0xec5a0000 0 0x100>,  /* ADG */
+                       <0 0xec540000 0 0x1000>, /* SSIU */
+                       <0 0xec541000 0 0x1280>; /* SSI */
+               clocks = <&mstp10_clks R8A7791_CLK_SSI_ALL>,
+                       <&mstp10_clks R8A7791_CLK_SSI9>, <&mstp10_clks R8A7791_CLK_SSI8>,
+                       <&mstp10_clks R8A7791_CLK_SSI7>, <&mstp10_clks R8A7791_CLK_SSI6>,
+                       <&mstp10_clks R8A7791_CLK_SSI5>, <&mstp10_clks R8A7791_CLK_SSI4>,
+                       <&mstp10_clks R8A7791_CLK_SSI3>, <&mstp10_clks R8A7791_CLK_SSI2>,
+                       <&mstp10_clks R8A7791_CLK_SSI1>, <&mstp10_clks R8A7791_CLK_SSI0>,
+                       <&mstp10_clks R8A7791_CLK_SCU_SRC9>, <&mstp10_clks R8A7791_CLK_SCU_SRC8>,
+                       <&mstp10_clks R8A7791_CLK_SCU_SRC7>, <&mstp10_clks R8A7791_CLK_SCU_SRC6>,
+                       <&mstp10_clks R8A7791_CLK_SCU_SRC5>, <&mstp10_clks R8A7791_CLK_SCU_SRC4>,
+                       <&mstp10_clks R8A7791_CLK_SCU_SRC3>, <&mstp10_clks R8A7791_CLK_SCU_SRC2>,
+                       <&mstp10_clks R8A7791_CLK_SCU_SRC1>, <&mstp10_clks R8A7791_CLK_SCU_SRC0>,
+                       <&mstp10_clks R8A7791_CLK_SCU_DVC0>, <&mstp10_clks R8A7791_CLK_SCU_DVC1>,
+                       <&audio_clk_a>, <&audio_clk_b>, <&audio_clk_c>, <&m2_clk>;
+               clock-names = "ssi-all",
+                               "ssi.9", "ssi.8", "ssi.7", "ssi.6", "ssi.5",
+                               "ssi.4", "ssi.3", "ssi.2", "ssi.1", "ssi.0",
+                               "src.9", "src.8", "src.7", "src.6", "src.5",
+                               "src.4", "src.3", "src.2", "src.1", "src.0",
+                               "dvc.0", "dvc.1",
+                               "clk_a", "clk_b", "clk_c", "clk_i";
+
+               status = "disabled";
+
+               rcar_sound,dvc {
+                       dvc0: dvc@0 { };
+                       dvc1: dvc@1 { };
+               };
+
+               rcar_sound,src {
+                       src0: src@0 { };
+                       src1: src@1 { };
+                       src2: src@2 { };
+                       src3: src@3 { };
+                       src4: src@4 { };
+                       src5: src@5 { };
+                       src6: src@6 { };
+                       src7: src@7 { };
+                       src8: src@8 { };
+                       src9: src@9 { };
+               };
+
+               rcar_sound,ssi {
+                       ssi0: ssi@0 { interrupts = <0 370 IRQ_TYPE_LEVEL_HIGH>; };
+                       ssi1: ssi@1 { interrupts = <0 371 IRQ_TYPE_LEVEL_HIGH>; };
+                       ssi2: ssi@2 { interrupts = <0 372 IRQ_TYPE_LEVEL_HIGH>; };
+                       ssi3: ssi@3 { interrupts = <0 373 IRQ_TYPE_LEVEL_HIGH>; };
+                       ssi4: ssi@4 { interrupts = <0 374 IRQ_TYPE_LEVEL_HIGH>; };
+                       ssi5: ssi@5 { interrupts = <0 375 IRQ_TYPE_LEVEL_HIGH>; };
+                       ssi6: ssi@6 { interrupts = <0 376 IRQ_TYPE_LEVEL_HIGH>; };
+                       ssi7: ssi@7 { interrupts = <0 377 IRQ_TYPE_LEVEL_HIGH>; };
+                       ssi8: ssi@8 { interrupts = <0 378 IRQ_TYPE_LEVEL_HIGH>; };
+                       ssi9: ssi@9 { interrupts = <0 379 IRQ_TYPE_LEVEL_HIGH>; };
+               };
+       };
 };
index afb327322a4a6d40538f30cdfca33aa3b25b39e3..042f821d9e4d8bdbe0ab48722293278a86a44496 100644 (file)
                reg = <0x60000000 0x40000000>;
        };
 
-       soc {
-               uart0: serial@10124000 {
-                       status = "okay";
-               };
+       vcc_sd0: fixed-regulator {
+               compatible = "regulator-fixed";
+               regulator-name = "sdmmc-supply";
+               regulator-min-microvolt = <3000000>;
+               regulator-max-microvolt = <3000000>;
+               gpio = <&gpio3 7 GPIO_ACTIVE_LOW>;
+               startup-delay-us = <100000>;
+               vin-supply = <&vcc_io>;
+       };
 
-               uart1: serial@10126000 {
-                       status = "okay";
+       gpio-keys {
+               compatible = "gpio-keys";
+               #address-cells = <1>;
+               #size-cells = <0>;
+               autorepeat;
+
+               button@0 {
+                       gpios = <&gpio6 2 GPIO_ACTIVE_LOW>; /* GPIO6_A2 */
+                       linux,code = <116>;
+                       label = "GPIO Key Power";
+                       linux,input-type = <1>;
+                       gpio-key,wakeup = <1>;
+                       debounce-interval = <100>;
                };
-
-               uart2: serial@20064000 {
-                       pinctrl-names = "default";
-                       pinctrl-0 = <&uart2_xfer>;
-                       status = "okay";
+               button@1 {
+                       gpios = <&gpio4 21 GPIO_ACTIVE_LOW>; /* GPIO4_C5 */
+                       linux,code = <104>;
+                       label = "GPIO Key Vol-";
+                       linux,input-type = <1>;
+                       gpio-key,wakeup = <0>;
+                       debounce-interval = <100>;
                };
+               /* VOL+ comes somehow thru the ADC */
+       };
+};
 
-               uart3: serial@20068000 {
-                       status = "okay";
-               };
+&i2c1 {
+       status = "okay";
+       clock-frequency = <400000>;
 
-               vcc_sd0: fixed-regulator {
-                       compatible = "regulator-fixed";
-                       regulator-name = "sdmmc-supply";
-                       regulator-min-microvolt = <3000000>;
-                       regulator-max-microvolt = <3000000>;
-                       gpio = <&gpio3 7 GPIO_ACTIVE_LOW>;
-                       startup-delay-us = <100000>;
-               };
+       tps: tps@2d {
+               reg = <0x2d>;
 
-               dwmmc@10214000 { /* sdmmc */
-                       num-slots = <1>;
-                       status = "okay";
+               interrupt-parent = <&gpio6>;
+               interrupts = <6 IRQ_TYPE_LEVEL_LOW>;
 
-                       pinctrl-names = "default";
-                       pinctrl-0 = <&sd0_clk &sd0_cmd &sd0_cd &sd0_bus4>;
-                       vmmc-supply = <&vcc_sd0>;
+               vcc5-supply = <&vcc_io>;
+               vcc6-supply = <&vcc_io>;
 
-                       slot@0 {
-                               reg = <0>;
-                               bus-width = <4>;
-                               disable-wp;
+               regulators {
+                       vcc_rtc: regulator@0 {
+                               regulator-name = "vcc_rtc";
+                               regulator-always-on;
                        };
-               };
 
-               dwmmc@10218000 { /* wifi */
-                       num-slots = <1>;
-                       status = "okay";
-                       non-removable;
+                       vcc_io: regulator@1 {
+                               regulator-name = "vcc_io";
+                               regulator-always-on;
+                       };
 
-                       pinctrl-names = "default";
-                       pinctrl-0 = <&sd1_clk &sd1_cmd &sd1_bus4>;
+                       vdd_arm: regulator@2 {
+                               regulator-name = "vdd_arm";
+                               regulator-min-microvolt = <600000>;
+                               regulator-max-microvolt = <1500000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
 
-                       slot@0 {
-                               reg = <0>;
-                               bus-width = <4>;
-                               disable-wp;
+                       vcc_ddr: regulator@3 {
+                               regulator-name = "vcc_ddr";
+                               regulator-min-microvolt = <600000>;
+                               regulator-max-microvolt = <1500000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       vcc18_cif: regulator@5 {
+                               regulator-name = "vcc18_cif";
+                               regulator-always-on;
+                       };
+
+                       vdd_11: regulator@6 {
+                               regulator-name = "vdd_11";
+                               regulator-always-on;
+                       };
+
+                       vcc_25: regulator@7 {
+                               regulator-name = "vcc_25";
+                               regulator-always-on;
+                       };
+
+                       vcc_18: regulator@8 {
+                               regulator-name = "vcc_18";
+                               regulator-always-on;
+                       };
+
+                       vcc25_hdmi: regulator@9 {
+                               regulator-name = "vcc25_hdmi";
+                               regulator-always-on;
+                       };
+
+                       vcca_33: regulator@10 {
+                               regulator-name = "vcca_33";
+                               regulator-always-on;
                        };
-               };
 
-               gpio-keys {
-                       compatible = "gpio-keys";
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       autorepeat;
-
-                       button@0 {
-                               gpios = <&gpio6 2 GPIO_ACTIVE_LOW>; /* GPIO6_A2 */
-                               linux,code = <116>;
-                               label = "GPIO Key Power";
-                               linux,input-type = <1>;
-                               gpio-key,wakeup = <1>;
-                               debounce-interval = <100>;
+                       vcc_tp: regulator@11 {
+                               regulator-name = "vcc_tp";
+                               regulator-always-on;
                        };
-                       button@1 {
-                               gpios = <&gpio4 21 GPIO_ACTIVE_LOW>; /* GPIO4_C5 */
-                               linux,code = <104>;
-                               label = "GPIO Key Vol-";
-                               linux,input-type = <1>;
-                               gpio-key,wakeup = <0>;
-                               debounce-interval = <100>;
+
+                       vcc28_cif: regulator@12 {
+                               regulator-name = "vcc28_cif";
+                               regulator-always-on;
                        };
-                       /* VOL+ comes somehow thru the ADC */
                };
        };
 };
+
+/* must be included after &tps gets defined */
+#include "tps65910.dtsi"
+
+&mmc0 { /* sdmmc */
+       num-slots = <1>;
+       status = "okay";
+       vmmc-supply = <&vcc_sd0>;
+
+       slot@0 {
+               reg = <0>;
+               bus-width = <4>;
+               disable-wp;
+       };
+};
+
+&mmc1 { /* wifi */
+       num-slots = <1>;
+       status = "okay";
+       non-removable;
+
+       pinctrl-names = "default";
+       pinctrl-0 = <&sd1_clk &sd1_cmd &sd1_bus4>;
+
+       slot@0 {
+               reg = <0>;
+               bus-width = <4>;
+               disable-wp;
+       };
+};
+
+&uart0 {
+       status = "okay";
+};
+
+&uart1 {
+       status = "okay";
+};
+
+&uart2 {
+       status = "okay";
+};
+
+&uart3 {
+       status = "okay";
+};
+
+&wdt {
+       status = "okay";
+};
diff --git a/arch/arm/boot/dts/rk3066a-clocks.dtsi b/arch/arm/boot/dts/rk3066a-clocks.dtsi
deleted file mode 100644 (file)
index 6e307fc..0000000
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- * Copyright (c) 2013 MundoReader S.L.
- * Author: Heiko Stuebner <heiko@sntech.de>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- */
-
-/ {
-       clocks {
-               #address-cells = <1>;
-               #size-cells = <1>;
-               ranges;
-
-               /*
-                * This is a dummy clock, to be used as placeholder on
-                * other mux clocks when a specific parent clock is not
-                * yet implemented. It should be dropped when the driver
-                * is complete.
-                */
-               dummy: dummy {
-                       compatible = "fixed-clock";
-                       clock-frequency = <0>;
-                       #clock-cells = <0>;
-               };
-
-               xin24m: xin24m {
-                       compatible = "fixed-clock";
-                       clock-frequency = <24000000>;
-                       #clock-cells = <0>;
-               };
-
-               dummy48m: dummy48m {
-                       compatible = "fixed-clock";
-                       clock-frequency = <48000000>;
-                       #clock-cells = <0>;
-               };
-
-               dummy150m: dummy150m {
-                       compatible = "fixed-clock";
-                       clock-frequency = <150000000>;
-                       #clock-cells = <0>;
-               };
-
-               clk_gates0: gate-clk@200000d0 {
-                       compatible = "rockchip,rk2928-gate-clk";
-                       reg = <0x200000d0 0x4>;
-                       clocks = <&dummy>, <&dummy>,
-                                <&dummy>, <&dummy>,
-                                <&dummy>, <&dummy>,
-                                <&dummy>, <&dummy>,
-                                <&dummy>, <&dummy>,
-                                <&dummy>, <&dummy>,
-                                <&dummy>, <&dummy>,
-                                <&dummy>, <&dummy>;
-
-                       clock-output-names =
-                               "gate_core_periph", "gate_cpu_gpll",
-                               "gate_ddrphy", "gate_aclk_cpu",
-                               "gate_hclk_cpu", "gate_pclk_cpu",
-                               "gate_atclk_cpu", "gate_i2s0",
-                               "gate_i2s0_frac", "gate_i2s1",
-                               "gate_i2s1_frac", "gate_i2s2",
-                               "gate_i2s2_frac", "gate_spdif",
-                               "gate_spdif_frac", "gate_testclk";
-
-                       #clock-cells = <1>;
-               };
-
-               clk_gates1: gate-clk@200000d4 {
-                       compatible = "rockchip,rk2928-gate-clk";
-                       reg = <0x200000d4 0x4>;
-                       clocks = <&xin24m>, <&xin24m>,
-                                <&xin24m>, <&dummy>,
-                                <&dummy>, <&xin24m>,
-                                <&xin24m>, <&dummy>,
-                                <&xin24m>, <&dummy>,
-                                <&xin24m>, <&dummy>,
-                                <&xin24m>, <&dummy>,
-                                <&xin24m>, <&dummy>;
-
-                       clock-output-names =
-                               "gate_timer0", "gate_timer1",
-                               "gate_timer2", "gate_jtag",
-                               "gate_aclk_lcdc1_src", "gate_otgphy0",
-                               "gate_otgphy1", "gate_ddr_gpll",
-                               "gate_uart0", "gate_frac_uart0",
-                               "gate_uart1", "gate_frac_uart1",
-                               "gate_uart2", "gate_frac_uart2",
-                               "gate_uart3", "gate_frac_uart3";
-
-                       #clock-cells = <1>;
-               };
-
-               clk_gates2: gate-clk@200000d8 {
-                       compatible = "rockchip,rk2928-gate-clk";
-                       reg = <0x200000d8 0x4>;
-                       clocks = <&clk_gates2 1>, <&dummy>,
-                                <&dummy>, <&dummy>,
-                                <&dummy>, <&dummy>,
-                                <&clk_gates2 3>, <&dummy>,
-                                <&dummy>, <&dummy>,
-                                <&dummy>, <&dummy48m>,
-                                <&dummy>, <&dummy48m>,
-                                <&dummy>, <&dummy>;
-
-                       clock-output-names =
-                               "gate_periph_src", "gate_aclk_periph",
-                               "gate_hclk_periph", "gate_pclk_periph",
-                               "gate_smc", "gate_mac",
-                               "gate_hsadc", "gate_hsadc_frac",
-                               "gate_saradc", "gate_spi0",
-                               "gate_spi1", "gate_mmc0",
-                               "gate_mac_lbtest", "gate_mmc1",
-                               "gate_emmc", "gate_tsadc";
-
-                       #clock-cells = <1>;
-               };
-
-               clk_gates3: gate-clk@200000dc {
-                       compatible = "rockchip,rk2928-gate-clk";
-                       reg = <0x200000dc 0x4>;
-                       clocks = <&dummy>, <&dummy>,
-                                <&dummy>, <&dummy>,
-                                <&dummy>, <&dummy>,
-                                <&dummy>, <&dummy>,
-                                <&dummy>, <&dummy>,
-                                <&dummy>, <&dummy>,
-                                <&dummy>, <&dummy>,
-                                <&dummy>, <&dummy>;
-
-                       clock-output-names =
-                               "gate_aclk_lcdc0_src", "gate_dclk_lcdc0",
-                               "gate_dclk_lcdc1", "gate_pclkin_cif0",
-                               "gate_pclkin_cif1", "reserved",
-                               "reserved", "gate_cif0_out",
-                               "gate_cif1_out", "gate_aclk_vepu",
-                               "gate_hclk_vepu", "gate_aclk_vdpu",
-                               "gate_hclk_vdpu", "gate_gpu_src",
-                               "reserved", "gate_xin27m";
-
-                       #clock-cells = <1>;
-               };
-
-               clk_gates4: gate-clk@200000e0 {
-                       compatible = "rockchip,rk2928-gate-clk";
-                       reg = <0x200000e0 0x4>;
-                       clocks = <&clk_gates2 2>, <&clk_gates2 3>,
-                                <&clk_gates2 1>, <&clk_gates2 1>,
-                                <&clk_gates2 1>, <&clk_gates2 2>,
-                                <&clk_gates2 2>, <&clk_gates2 2>,
-                                <&clk_gates0 4>, <&clk_gates0 4>,
-                                <&clk_gates0 3>, <&clk_gates0 3>,
-                                <&clk_gates0 3>, <&clk_gates2 3>,
-                                <&clk_gates0 4>;
-
-                       clock-output-names =
-                               "gate_hclk_peri_axi_matrix", "gate_pclk_peri_axi_matrix",
-                               "gate_aclk_cpu_peri", "gate_aclk_peri_axi_matrix",
-                               "gate_aclk_pei_niu", "gate_hclk_usb_peri",
-                               "gate_hclk_peri_ahb_arbi", "gate_hclk_emem_peri",
-                               "gate_hclk_cpubus", "gate_hclk_ahb2apb",
-                               "gate_aclk_strc_sys", "gate_aclk_l2mem_con",
-                               "gate_aclk_intmem", "gate_pclk_tsadc",
-                               "gate_hclk_hdmi";
-
-                       #clock-cells = <1>;
-               };
-
-               clk_gates5: gate-clk@200000e4 {
-                       compatible = "rockchip,rk2928-gate-clk";
-                       reg = <0x200000e4 0x4>;
-                       clocks = <&clk_gates0 3>, <&clk_gates2 1>,
-                                <&clk_gates0 5>, <&clk_gates0 5>,
-                                <&clk_gates0 5>, <&clk_gates0 5>,
-                                <&clk_gates0 4>, <&clk_gates0 5>,
-                                <&clk_gates2 1>, <&clk_gates2 2>,
-                                <&clk_gates2 2>, <&clk_gates2 2>,
-                                <&clk_gates2 2>, <&clk_gates4 5>,
-                                <&clk_gates4 5>, <&dummy>;
-
-                       clock-output-names =
-                               "gate_aclk_dmac1", "gate_aclk_dmac2",
-                               "gate_pclk_efuse", "gate_pclk_tzpc",
-                               "gate_pclk_grf", "gate_pclk_pmu",
-                               "gate_hclk_rom", "gate_pclk_ddrupctl",
-                               "gate_aclk_smc", "gate_hclk_nandc",
-                               "gate_hclk_mmc0", "gate_hclk_mmc1",
-                               "gate_hclk_emmc", "gate_hclk_otg0",
-                               "gate_hclk_otg1", "gate_aclk_gpu";
-
-                       #clock-cells = <1>;
-               };
-
-               clk_gates6: gate-clk@200000e8 {
-                       compatible = "rockchip,rk2928-gate-clk";
-                       reg = <0x200000e8 0x4>;
-                       clocks = <&clk_gates3 0>, <&clk_gates0 4>,
-                                <&clk_gates0 4>, <&clk_gates1 4>,
-                                <&clk_gates0 4>, <&clk_gates3 0>,
-                                <&clk_gates0 4>, <&clk_gates1 4>,
-                                <&clk_gates3 0>, <&clk_gates0 4>,
-                                <&clk_gates0 4>, <&clk_gates1 4>,
-                                <&clk_gates0 4>, <&clk_gates3 0>,
-                                <&dummy>, <&dummy>;
-
-                       clock-output-names =
-                               "gate_aclk_lcdc0", "gate_hclk_lcdc0",
-                               "gate_hclk_lcdc1", "gate_aclk_lcdc1",
-                               "gate_hclk_cif0", "gate_aclk_cif0",
-                               "gate_hclk_cif1", "gate_aclk_cif1",
-                               "gate_aclk_ipp", "gate_hclk_ipp",
-                               "gate_hclk_rga", "gate_aclk_rga",
-                               "gate_hclk_vio_bus", "gate_aclk_vio0",
-                               "gate_aclk_vcodec", "gate_shclk_vio_h2h";
-
-                       #clock-cells = <1>;
-               };
-
-               clk_gates7: gate-clk@200000ec {
-                       compatible = "rockchip,rk2928-gate-clk";
-                       reg = <0x200000ec 0x4>;
-                       clocks = <&clk_gates2 2>, <&clk_gates0 4>,
-                                <&clk_gates0 4>, <&clk_gates0 4>,
-                                <&clk_gates0 4>, <&clk_gates2 2>,
-                                <&clk_gates2 2>, <&clk_gates0 5>,
-                                <&clk_gates0 5>, <&clk_gates0 5>,
-                                <&clk_gates0 5>, <&clk_gates2 3>,
-                                <&clk_gates2 3>, <&clk_gates2 3>,
-                                <&clk_gates2 3>, <&clk_gates2 3>;
-
-                       clock-output-names =
-                               "gate_hclk_emac", "gate_hclk_spdif",
-                               "gate_hclk_i2s0_2ch", "gate_hclk_i2s1_2ch",
-                               "gate_hclk_i2s_8ch", "gate_hclk_hsadc",
-                               "gate_hclk_pidf", "gate_pclk_timer0",
-                               "gate_pclk_timer1", "gate_pclk_timer2",
-                               "gate_pclk_pwm01", "gate_pclk_pwm23",
-                               "gate_pclk_spi0", "gate_pclk_spi1",
-                               "gate_pclk_saradc", "gate_pclk_wdt";
-
-                       #clock-cells = <1>;
-               };
-
-               clk_gates8: gate-clk@200000f0 {
-                       compatible = "rockchip,rk2928-gate-clk";
-                       reg = <0x200000f0 0x4>;
-                       clocks = <&clk_gates0 5>, <&clk_gates0 5>,
-                                <&clk_gates2 3>, <&clk_gates2 3>,
-                                <&clk_gates0 5>, <&clk_gates0 5>,
-                                <&clk_gates2 3>, <&clk_gates2 3>,
-                                <&clk_gates2 3>, <&clk_gates0 5>,
-                                <&clk_gates0 5>, <&clk_gates0 5>,
-                                <&clk_gates2 3>, <&clk_gates2 3>,
-                                <&dummy>, <&clk_gates0 5>;
-
-                       clock-output-names =
-                               "gate_pclk_uart0", "gate_pclk_uart1",
-                               "gate_pclk_uart2", "gate_pclk_uart3",
-                               "gate_pclk_i2c0", "gate_pclk_i2c1",
-                               "gate_pclk_i2c2", "gate_pclk_i2c3",
-                               "gate_pclk_i2c4", "gate_pclk_gpio0",
-                               "gate_pclk_gpio1", "gate_pclk_gpio2",
-                               "gate_pclk_gpio3", "gate_pclk_gpio4",
-                               "reserved", "gate_pclk_gpio6";
-
-                       #clock-cells = <1>;
-               };
-
-               clk_gates9: gate-clk@200000f4 {
-                       compatible = "rockchip,rk2928-gate-clk";
-                       reg = <0x200000f4 0x4>;
-                       clocks = <&dummy>, <&clk_gates0 5>,
-                                <&dummy>, <&dummy>,
-                                <&dummy>, <&clk_gates1 4>,
-                                <&clk_gates0 5>, <&dummy>,
-                                <&dummy>, <&dummy>,
-                                <&dummy>;
-
-                       clock-output-names =
-                               "gate_clk_core_dbg", "gate_pclk_dbg",
-                               "gate_clk_trace", "gate_atclk",
-                               "gate_clk_l2c", "gate_aclk_vio1",
-                               "gate_pclk_publ", "gate_aclk_intmem0",
-                               "gate_aclk_intmem1", "gate_aclk_intmem2",
-                               "gate_aclk_intmem3";
-
-                       #clock-cells = <1>;
-               };
-       };
-
-};
index 4387cfd420baff8aa1a42bd20a2e6c5b29b820af..879a818fba51797062b4f5e7cbca58dc14b4a863 100644 (file)
@@ -15,8 +15,8 @@
 
 #include <dt-bindings/gpio/gpio.h>
 #include <dt-bindings/pinctrl/rockchip.h>
+#include <dt-bindings/clock/rk3066a-cru.h>
 #include "rk3xxx.dtsi"
-#include "rk3066a-clocks.dtsi"
 
 / {
        compatible = "rockchip,rk3066a";
                };
        };
 
-       soc {
-               timer@20038000 {
-                       compatible = "snps,dw-apb-timer-osc";
-                       reg = <0x20038000 0x100>;
-                       interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&clk_gates1 0>, <&clk_gates7 7>;
-                       clock-names = "timer", "pclk";
+       sram: sram@10080000 {
+               compatible = "mmio-sram";
+               reg = <0x10080000 0x10000>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges = <0 0x10080000 0x10000>;
+
+               smp-sram@0 {
+                       compatible = "rockchip,rk3066-smp-sram";
+                       reg = <0x0 0x50>;
                };
+       };
+
+       cru: clock-controller@20000000 {
+               compatible = "rockchip,rk3066a-cru";
+               reg = <0x20000000 0x1000>;
+               rockchip,grf = <&grf>;
 
-               timer@2003a000 {
-                       compatible = "snps,dw-apb-timer-osc";
-                       reg = <0x2003a000 0x100>;
-                       interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&clk_gates1 1>, <&clk_gates7 8>;
-                       clock-names = "timer", "pclk";
+               #clock-cells = <1>;
+               #reset-cells = <1>;
+       };
+
+       timer@2000e000 {
+               compatible = "snps,dw-apb-timer-osc";
+               reg = <0x2000e000 0x100>;
+               interrupts = <GIC_SPI 46 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&cru SCLK_TIMER2>, <&cru PCLK_TIMER2>;
+               clock-names = "timer", "pclk";
+       };
+
+       timer@20038000 {
+               compatible = "snps,dw-apb-timer-osc";
+               reg = <0x20038000 0x100>;
+               interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&cru SCLK_TIMER0>, <&cru PCLK_TIMER0>;
+               clock-names = "timer", "pclk";
+       };
+
+       timer@2003a000 {
+               compatible = "snps,dw-apb-timer-osc";
+               reg = <0x2003a000 0x100>;
+               interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&cru SCLK_TIMER1>, <&cru PCLK_TIMER1>;
+               clock-names = "timer", "pclk";
+       };
+
+       pinctrl: pinctrl {
+               compatible = "rockchip,rk3066a-pinctrl";
+               rockchip,grf = <&grf>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges;
+
+               gpio0: gpio0@20034000 {
+                       compatible = "rockchip,gpio-bank";
+                       reg = <0x20034000 0x100>;
+                       interrupts = <GIC_SPI 54 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cru PCLK_GPIO0>;
+
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
                };
 
-               timer@2000e000 {
-                       compatible = "snps,dw-apb-timer-osc";
-                       reg = <0x2000e000 0x100>;
-                       interrupts = <GIC_SPI 46 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&clk_gates1 2>, <&clk_gates7 9>;
-                       clock-names = "timer", "pclk";
+               gpio1: gpio1@2003c000 {
+                       compatible = "rockchip,gpio-bank";
+                       reg = <0x2003c000 0x100>;
+                       interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cru PCLK_GPIO1>;
+
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
                };
 
-               sram: sram@10080000 {
-                       compatible = "mmio-sram";
-                       reg = <0x10080000 0x10000>;
-                       #address-cells = <1>;
-                       #size-cells = <1>;
-                       ranges = <0 0x10080000 0x10000>;
+               gpio2: gpio2@2003e000 {
+                       compatible = "rockchip,gpio-bank";
+                       reg = <0x2003e000 0x100>;
+                       interrupts = <GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cru PCLK_GPIO2>;
 
-                       smp-sram@0 {
-                               compatible = "rockchip,rk3066-smp-sram";
-                               reg = <0x0 0x50>;
-                       };
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
+
+               gpio3: gpio3@20080000 {
+                       compatible = "rockchip,gpio-bank";
+                       reg = <0x20080000 0x100>;
+                       interrupts = <GIC_SPI 57 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cru PCLK_GPIO3>;
+
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
                };
 
-               pinctrl@20008000 {
-                       compatible = "rockchip,rk3066a-pinctrl";
-                       rockchip,grf = <&grf>;
-                       #address-cells = <1>;
-                       #size-cells = <1>;
-                       ranges;
+               gpio4: gpio4@20084000 {
+                       compatible = "rockchip,gpio-bank";
+                       reg = <0x20084000 0x100>;
+                       interrupts = <GIC_SPI 58 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cru PCLK_GPIO4>;
 
-                       gpio0: gpio0@20034000 {
-                               compatible = "rockchip,gpio-bank";
-                               reg = <0x20034000 0x100>;
-                               interrupts = <GIC_SPI 54 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clk_gates8 9>;
+                       gpio-controller;
+                       #gpio-cells = <2>;
 
-                               gpio-controller;
-                               #gpio-cells = <2>;
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
 
-                               interrupt-controller;
-                               #interrupt-cells = <2>;
+               gpio6: gpio6@2000a000 {
+                       compatible = "rockchip,gpio-bank";
+                       reg = <0x2000a000 0x100>;
+                       interrupts = <GIC_SPI 60 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cru PCLK_GPIO6>;
+
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
+
+               pcfg_pull_default: pcfg_pull_default {
+                       bias-pull-pin-default;
+               };
+
+               pcfg_pull_none: pcfg_pull_none {
+                       bias-disable;
+               };
+
+               i2c0 {
+                       i2c0_xfer: i2c0-xfer {
+                               rockchip,pins = <RK_GPIO2 28 RK_FUNC_1 &pcfg_pull_none>,
+                                               <RK_GPIO2 29 RK_FUNC_1 &pcfg_pull_none>;
                        };
+               };
 
-                       gpio1: gpio1@2003c000 {
-                               compatible = "rockchip,gpio-bank";
-                               reg = <0x2003c000 0x100>;
-                               interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clk_gates8 10>;
+               i2c1 {
+                       i2c1_xfer: i2c1-xfer {
+                               rockchip,pins = <RK_GPIO2 30 RK_FUNC_1 &pcfg_pull_none>,
+                                               <RK_GPIO2 31 RK_FUNC_1 &pcfg_pull_none>;
+                       };
+               };
 
-                               gpio-controller;
-                               #gpio-cells = <2>;
+               i2c2 {
+                       i2c2_xfer: i2c2-xfer {
+                               rockchip,pins = <RK_GPIO3 0 RK_FUNC_1 &pcfg_pull_none>,
+                                               <RK_GPIO3 1 RK_FUNC_1 &pcfg_pull_none>;
+                       };
+               };
 
-                               interrupt-controller;
-                               #interrupt-cells = <2>;
+               i2c3 {
+                       i2c3_xfer: i2c3-xfer {
+                               rockchip,pins = <RK_GPIO3 2 RK_FUNC_2 &pcfg_pull_none>,
+                                               <RK_GPIO3 3 RK_FUNC_2 &pcfg_pull_none>;
                        };
+               };
 
-                       gpio2: gpio2@2003e000 {
-                               compatible = "rockchip,gpio-bank";
-                               reg = <0x2003e000 0x100>;
-                               interrupts = <GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clk_gates8 11>;
+               i2c4 {
+                       i2c4_xfer: i2c4-xfer {
+                               rockchip,pins = <RK_GPIO3 4 RK_FUNC_1 &pcfg_pull_none>,
+                                               <RK_GPIO3 5 RK_FUNC_1 &pcfg_pull_none>;
+                       };
+               };
 
-                               gpio-controller;
-                               #gpio-cells = <2>;
+               pwm0 {
+                       pwm0_out: pwm0-out {
+                               rockchip,pins = <RK_GPIO0 3 RK_FUNC_1 &pcfg_pull_none>;
+                       };
+               };
 
-                               interrupt-controller;
-                               #interrupt-cells = <2>;
+               pwm1 {
+                       pwm1_out: pwm1-out {
+                               rockchip,pins = <RK_GPIO0 4 RK_FUNC_1 &pcfg_pull_none>;
                        };
+               };
 
-                       gpio3: gpio3@20080000 {
-                               compatible = "rockchip,gpio-bank";
-                               reg = <0x20080000 0x100>;
-                               interrupts = <GIC_SPI 57 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clk_gates8 12>;
+               pwm2 {
+                       pwm2_out: pwm2-out {
+                               rockchip,pins = <RK_GPIO0 30 RK_FUNC_1 &pcfg_pull_none>;
+                       };
+               };
 
-                               gpio-controller;
-                               #gpio-cells = <2>;
+               pwm3 {
+                       pwm3_out: pwm3-out {
+                               rockchip,pins = <RK_GPIO0 31 RK_FUNC_1 &pcfg_pull_none>;
+                       };
+               };
 
-                               interrupt-controller;
-                               #interrupt-cells = <2>;
+               uart0 {
+                       uart0_xfer: uart0-xfer {
+                               rockchip,pins = <RK_GPIO1 0 RK_FUNC_1 &pcfg_pull_default>,
+                                               <RK_GPIO1 1 RK_FUNC_1 &pcfg_pull_default>;
                        };
 
-                       gpio4: gpio4@20084000 {
-                               compatible = "rockchip,gpio-bank";
-                               reg = <0x20084000 0x100>;
-                               interrupts = <GIC_SPI 58 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clk_gates8 13>;
+                       uart0_cts: uart0-cts {
+                               rockchip,pins = <RK_GPIO1 2 RK_FUNC_1 &pcfg_pull_default>;
+                       };
 
-                               gpio-controller;
-                               #gpio-cells = <2>;
+                       uart0_rts: uart0-rts {
+                               rockchip,pins = <RK_GPIO1 3 RK_FUNC_1 &pcfg_pull_default>;
+                       };
+               };
+
+               uart1 {
+                       uart1_xfer: uart1-xfer {
+                               rockchip,pins = <RK_GPIO1 4 RK_FUNC_1 &pcfg_pull_default>,
+                                               <RK_GPIO1 5 RK_FUNC_1 &pcfg_pull_default>;
+                       };
 
-                               interrupt-controller;
-                               #interrupt-cells = <2>;
+                       uart1_cts: uart1-cts {
+                               rockchip,pins = <RK_GPIO1 6 RK_FUNC_1 &pcfg_pull_default>;
                        };
 
-                       gpio6: gpio6@2000a000 {
-                               compatible = "rockchip,gpio-bank";
-                               reg = <0x2000a000 0x100>;
-                               interrupts = <GIC_SPI 60 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clk_gates8 15>;
+                       uart1_rts: uart1-rts {
+                               rockchip,pins = <RK_GPIO1 7 RK_FUNC_1 &pcfg_pull_default>;
+                       };
+               };
 
-                               gpio-controller;
-                               #gpio-cells = <2>;
+               uart2 {
+                       uart2_xfer: uart2-xfer {
+                               rockchip,pins = <RK_GPIO1 8 RK_FUNC_1 &pcfg_pull_default>,
+                                               <RK_GPIO1 9 RK_FUNC_1 &pcfg_pull_default>;
+                       };
+                       /* no rts / cts for uart2 */
+               };
 
-                               interrupt-controller;
-                               #interrupt-cells = <2>;
+               uart3 {
+                       uart3_xfer: uart3-xfer {
+                               rockchip,pins = <RK_GPIO3 27 RK_FUNC_1 &pcfg_pull_default>,
+                                               <RK_GPIO3 28 RK_FUNC_1 &pcfg_pull_default>;
                        };
 
-                       pcfg_pull_default: pcfg_pull_default {
-                               bias-pull-pin-default;
+                       uart3_cts: uart3-cts {
+                               rockchip,pins = <RK_GPIO3 29 RK_FUNC_1 &pcfg_pull_default>;
                        };
 
-                       pcfg_pull_none: pcfg_pull_none {
-                               bias-disable;
+                       uart3_rts: uart3-rts {
+                               rockchip,pins = <RK_GPIO3 30 RK_FUNC_1 &pcfg_pull_default>;
                        };
+               };
 
-                       uart0 {
-                               uart0_xfer: uart0-xfer {
-                                       rockchip,pins = <RK_GPIO1 0 RK_FUNC_1 &pcfg_pull_default>,
-                                                       <RK_GPIO1 1 RK_FUNC_1 &pcfg_pull_default>;
-                               };
+               sd0 {
+                       sd0_clk: sd0-clk {
+                               rockchip,pins = <RK_GPIO3 8 RK_FUNC_1 &pcfg_pull_default>;
+                       };
 
-                               uart0_cts: uart0-cts {
-                                       rockchip,pins = <RK_GPIO1 2 RK_FUNC_1 &pcfg_pull_default>;
-                               };
+                       sd0_cmd: sd0-cmd {
+                               rockchip,pins = <RK_GPIO3 9 RK_FUNC_1 &pcfg_pull_default>;
+                       };
 
-                               uart0_rts: uart0-rts {
-                                       rockchip,pins = <RK_GPIO1 3 RK_FUNC_1 &pcfg_pull_default>;
-                               };
+                       sd0_cd: sd0-cd {
+                               rockchip,pins = <RK_GPIO3 14 RK_FUNC_1 &pcfg_pull_default>;
                        };
 
-                       uart1 {
-                               uart1_xfer: uart1-xfer {
-                                       rockchip,pins = <RK_GPIO1 4 RK_FUNC_1 &pcfg_pull_default>,
-                                                       <RK_GPIO1 5 RK_FUNC_1 &pcfg_pull_default>;
-                               };
+                       sd0_wp: sd0-wp {
+                               rockchip,pins = <RK_GPIO3 15 RK_FUNC_1 &pcfg_pull_default>;
+                       };
 
-                               uart1_cts: uart1-cts {
-                                       rockchip,pins = <RK_GPIO1 6 RK_FUNC_1 &pcfg_pull_default>;
-                               };
+                       sd0_bus1: sd0-bus-width1 {
+                               rockchip,pins = <RK_GPIO3 10 RK_FUNC_1 &pcfg_pull_default>;
+                       };
 
-                               uart1_rts: uart1-rts {
-                                       rockchip,pins = <RK_GPIO1 7 RK_FUNC_1 &pcfg_pull_default>;
-                               };
+                       sd0_bus4: sd0-bus-width4 {
+                               rockchip,pins = <RK_GPIO3 10 RK_FUNC_1 &pcfg_pull_default>,
+                                               <RK_GPIO3 11 RK_FUNC_1 &pcfg_pull_default>,
+                                               <RK_GPIO3 12 RK_FUNC_1 &pcfg_pull_default>,
+                                               <RK_GPIO3 13 RK_FUNC_1 &pcfg_pull_default>;
                        };
+               };
 
-                       uart2 {
-                               uart2_xfer: uart2-xfer {
-                                       rockchip,pins = <RK_GPIO1 8 RK_FUNC_1 &pcfg_pull_default>,
-                                                       <RK_GPIO1 9 RK_FUNC_1 &pcfg_pull_default>;
-                               };
-                               /* no rts / cts for uart2 */
+               sd1 {
+                       sd1_clk: sd1-clk {
+                               rockchip,pins = <RK_GPIO3 21 RK_FUNC_1 &pcfg_pull_default>;
                        };
 
-                       uart3 {
-                               uart3_xfer: uart3-xfer {
-                                       rockchip,pins = <RK_GPIO3 27 RK_FUNC_1 &pcfg_pull_default>,
-                                                       <RK_GPIO3 28 RK_FUNC_1 &pcfg_pull_default>;
-                               };
+                       sd1_cmd: sd1-cmd {
+                               rockchip,pins = <RK_GPIO3 16 RK_FUNC_1 &pcfg_pull_default>;
+                       };
 
-                               uart3_cts: uart3-cts {
-                                       rockchip,pins = <RK_GPIO3 29 RK_FUNC_1 &pcfg_pull_default>;
-                               };
+                       sd1_cd: sd1-cd {
+                               rockchip,pins = <RK_GPIO3 22 RK_FUNC_1 &pcfg_pull_default>;
+                       };
 
-                               uart3_rts: uart3-rts {
-                                       rockchip,pins = <RK_GPIO3 30 RK_FUNC_1 &pcfg_pull_default>;
-                               };
+                       sd1_wp: sd1-wp {
+                               rockchip,pins = <RK_GPIO3 23 RK_FUNC_1 &pcfg_pull_default>;
                        };
 
-                       sd0 {
-                               sd0_clk: sd0-clk {
-                                       rockchip,pins = <RK_GPIO3 8 RK_FUNC_1 &pcfg_pull_default>;
-                               };
-
-                               sd0_cmd: sd0-cmd {
-                                       rockchip,pins = <RK_GPIO3 9 RK_FUNC_1 &pcfg_pull_default>;
-                               };
-
-                               sd0_cd: sd0-cd {
-                                       rockchip,pins = <RK_GPIO3 14 RK_FUNC_1 &pcfg_pull_default>;
-                               };
-
-                               sd0_wp: sd0-wp {
-                                       rockchip,pins = <RK_GPIO3 15 RK_FUNC_1 &pcfg_pull_default>;
-                               };
-
-                               sd0_bus1: sd0-bus-width1 {
-                                       rockchip,pins = <RK_GPIO3 10 RK_FUNC_1 &pcfg_pull_default>;
-                               };
-
-                               sd0_bus4: sd0-bus-width4 {
-                                       rockchip,pins = <RK_GPIO3 10 RK_FUNC_1 &pcfg_pull_default>,
-                                                       <RK_GPIO3 11 RK_FUNC_1 &pcfg_pull_default>,
-                                                       <RK_GPIO3 12 RK_FUNC_1 &pcfg_pull_default>,
-                                                       <RK_GPIO3 13 RK_FUNC_1 &pcfg_pull_default>;
-                               };
+                       sd1_bus1: sd1-bus-width1 {
+                               rockchip,pins = <RK_GPIO3 17 RK_FUNC_1 &pcfg_pull_default>;
                        };
 
-                       sd1 {
-                               sd1_clk: sd1-clk {
-                                       rockchip,pins = <RK_GPIO3 21 RK_FUNC_1 &pcfg_pull_default>;
-                               };
-
-                               sd1_cmd: sd1-cmd {
-                                       rockchip,pins = <RK_GPIO3 16 RK_FUNC_1 &pcfg_pull_default>;
-                               };
-
-                               sd1_cd: sd1-cd {
-                                       rockchip,pins = <RK_GPIO3 22 RK_FUNC_1 &pcfg_pull_default>;
-                               };
-
-                               sd1_wp: sd1-wp {
-                                       rockchip,pins = <RK_GPIO3 23 RK_FUNC_1 &pcfg_pull_default>;
-                               };
-
-                               sd1_bus1: sd1-bus-width1 {
-                                       rockchip,pins = <RK_GPIO3 17 RK_FUNC_1 &pcfg_pull_default>;
-                               };
-
-                               sd1_bus4: sd1-bus-width4 {
-                                       rockchip,pins = <RK_GPIO3 17 RK_FUNC_1 &pcfg_pull_default>,
-                                                       <RK_GPIO3 18 RK_FUNC_1 &pcfg_pull_default>,
-                                                       <RK_GPIO3 19 RK_FUNC_1 &pcfg_pull_default>,
-                                                       <RK_GPIO3 20 RK_FUNC_1 &pcfg_pull_default>;
-                               };
+                       sd1_bus4: sd1-bus-width4 {
+                               rockchip,pins = <RK_GPIO3 17 RK_FUNC_1 &pcfg_pull_default>,
+                                               <RK_GPIO3 18 RK_FUNC_1 &pcfg_pull_default>,
+                                               <RK_GPIO3 19 RK_FUNC_1 &pcfg_pull_default>,
+                                               <RK_GPIO3 20 RK_FUNC_1 &pcfg_pull_default>;
                        };
                };
        };
 };
+
+&i2c0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&i2c0_xfer>;
+};
+
+&i2c1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&i2c1_xfer>;
+};
+
+&i2c2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&i2c2_xfer>;
+};
+
+&i2c3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&i2c3_xfer>;
+};
+
+&i2c4 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&i2c4_xfer>;
+};
+
+&mmc0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&sd0_clk &sd0_cmd &sd0_cd &sd0_bus4>;
+};
+
+&mmc1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&sd1_clk &sd1_cmd &sd1_cd &sd1_bus4>;
+};
+
+&pwm0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pwm0_out>;
+};
+
+&pwm1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pwm1_out>;
+};
+
+&pwm2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pwm2_out>;
+};
+
+&pwm3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pwm3_out>;
+};
+
+&uart0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart0_xfer>;
+};
+
+&uart1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart1_xfer>;
+};
+
+&uart2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart2_xfer>;
+};
+
+&uart3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart3_xfer>;
+};
+
+&wdt {
+       compatible = "rockchip,rk3066-wdt", "snps,dw-wdt";
+};
diff --git a/arch/arm/boot/dts/rk3188-clocks.dtsi b/arch/arm/boot/dts/rk3188-clocks.dtsi
deleted file mode 100644 (file)
index b1b92dc..0000000
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
- * Copyright (c) 2013 MundoReader S.L.
- * Author: Heiko Stuebner <heiko@sntech.de>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- */
-
-/ {
-       clocks {
-               #address-cells = <1>;
-               #size-cells = <1>;
-               ranges;
-
-               /*
-                * This is a dummy clock, to be used as placeholder on
-                * other mux clocks when a specific parent clock is not
-                * yet implemented. It should be dropped when the driver
-                * is complete.
-                */
-               dummy: dummy {
-                       compatible = "fixed-clock";
-                       clock-frequency = <0>;
-                       #clock-cells = <0>;
-               };
-
-               xin24m: xin24m {
-                       compatible = "fixed-clock";
-                       clock-frequency = <24000000>;
-                       #clock-cells = <0>;
-               };
-
-               dummy48m: dummy48m {
-                       compatible = "fixed-clock";
-                       clock-frequency = <48000000>;
-                       #clock-cells = <0>;
-               };
-
-               dummy150m: dummy150m {
-                       compatible = "fixed-clock";
-                       clock-frequency = <150000000>;
-                       #clock-cells = <0>;
-               };
-
-               clk_gates0: gate-clk@200000d0 {
-                       compatible = "rockchip,rk2928-gate-clk";
-                       reg = <0x200000d0 0x4>;
-                       clocks = <&dummy150m>, <&dummy>,
-                                <&dummy>, <&dummy>,
-                                <&dummy>, <&dummy>,
-                                <&dummy>, <&dummy>,
-                                <&dummy>, <&dummy>,
-                                <&dummy>, <&dummy>,
-                                <&dummy>, <&dummy>,
-                                <&dummy>, <&dummy>;
-
-                       clock-output-names =
-                               "gate_core_periph", "gate_cpu_gpll",
-                               "gate_ddrphy", "gate_aclk_cpu",
-                               "gate_hclk_cpu", "gate_pclk_cpu",
-                               "gate_atclk_cpu", "gate_aclk_core",
-                               "reserved", "gate_i2s0",
-                               "gate_i2s0_frac", "reserved",
-                               "reserved", "gate_spdif",
-                               "gate_spdif_frac", "gate_testclk";
-
-                       #clock-cells = <1>;
-               };
-
-               clk_gates1: gate-clk@200000d4 {
-                       compatible = "rockchip,rk2928-gate-clk";
-                       reg = <0x200000d4 0x4>;
-                       clocks = <&xin24m>, <&xin24m>,
-                                <&xin24m>, <&dummy>,
-                                <&dummy>, <&xin24m>,
-                                <&xin24m>, <&dummy>,
-                                <&xin24m>, <&dummy>,
-                                <&xin24m>, <&dummy>,
-                                <&xin24m>, <&dummy>,
-                                <&xin24m>, <&dummy>;
-
-                       clock-output-names =
-                               "gate_timer0", "gate_timer1",
-                               "gate_timer3", "gate_jtag",
-                               "gate_aclk_lcdc1_src", "gate_otgphy0",
-                               "gate_otgphy1", "gate_ddr_gpll",
-                               "gate_uart0", "gate_frac_uart0",
-                               "gate_uart1", "gate_frac_uart1",
-                               "gate_uart2", "gate_frac_uart2",
-                               "gate_uart3", "gate_frac_uart3";
-
-                       #clock-cells = <1>;
-               };
-
-               clk_gates2: gate-clk@200000d8 {
-                       compatible = "rockchip,rk2928-gate-clk";
-                       reg = <0x200000d8 0x4>;
-                       clocks = <&clk_gates2 1>, <&dummy>,
-                                <&dummy>, <&dummy>,
-                                <&dummy>, <&dummy>,
-                                <&clk_gates2 3>, <&dummy>,
-                                <&dummy>, <&dummy>,
-                                <&dummy>, <&dummy48m>,
-                                <&dummy>, <&dummy48m>,
-                                <&dummy>, <&dummy>;
-
-                       clock-output-names =
-                               "gate_periph_src", "gate_aclk_periph",
-                               "gate_hclk_periph", "gate_pclk_periph",
-                               "gate_smc", "gate_mac",
-                               "gate_hsadc", "gate_hsadc_frac",
-                               "gate_saradc", "gate_spi0",
-                               "gate_spi1", "gate_mmc0",
-                               "gate_mac_lbtest", "gate_mmc1",
-                               "gate_emmc", "reserved";
-
-                       #clock-cells = <1>;
-               };
-
-               clk_gates3: gate-clk@200000dc {
-                       compatible = "rockchip,rk2928-gate-clk";
-                       reg = <0x200000dc 0x4>;
-                       clocks = <&dummy>, <&dummy>,
-                                <&dummy>, <&dummy>,
-                                <&xin24m>, <&xin24m>,
-                                <&dummy>, <&dummy>,
-                                <&xin24m>, <&dummy>,
-                                <&dummy>, <&dummy>,
-                                <&dummy>, <&dummy>,
-                                <&xin24m>, <&dummy>;
-
-                       clock-output-names =
-                               "gate_aclk_lcdc0_src", "gate_dclk_lcdc0",
-                               "gate_dclk_lcdc1", "gate_pclkin_cif0",
-                               "gate_timer2", "gate_timer4",
-                               "gate_hsicphy", "gate_cif0_out",
-                               "gate_timer5", "gate_aclk_vepu",
-                               "gate_hclk_vepu", "gate_aclk_vdpu",
-                               "gate_hclk_vdpu", "reserved",
-                               "gate_timer6", "gate_aclk_gpu_src";
-
-                       #clock-cells = <1>;
-               };
-
-               clk_gates4: gate-clk@200000e0 {
-                       compatible = "rockchip,rk2928-gate-clk";
-                       reg = <0x200000e0 0x4>;
-                       clocks = <&clk_gates2 2>, <&clk_gates2 3>,
-                                <&clk_gates2 1>, <&clk_gates2 1>,
-                                <&clk_gates2 1>, <&clk_gates2 2>,
-                                <&clk_gates2 2>, <&clk_gates2 2>,
-                                <&clk_gates0 4>, <&clk_gates0 4>,
-                                <&clk_gates0 3>, <&dummy>,
-                                <&clk_gates0 3>, <&dummy>,
-                                <&dummy>, <&dummy>;
-
-                       clock-output-names =
-                               "gate_hclk_peri_axi_matrix", "gate_pclk_peri_axi_matrix",
-                               "gate_aclk_cpu_peri", "gate_aclk_peri_axi_matrix",
-                               "gate_aclk_pei_niu", "gate_hclk_usb_peri",
-                               "gate_hclk_peri_ahb_arbi", "gate_hclk_emem_peri",
-                               "gate_hclk_cpubus", "gate_hclk_ahb2apb",
-                               "gate_aclk_strc_sys", "reserved",
-                               "gate_aclk_intmem", "reserved",
-                               "gate_hclk_imem1", "gate_hclk_imem0";
-
-                       #clock-cells = <1>;
-               };
-
-               clk_gates5: gate-clk@200000e4 {
-                       compatible = "rockchip,rk2928-gate-clk";
-                       reg = <0x200000e4 0x4>;
-                       clocks = <&clk_gates0 3>, <&clk_gates2 1>,
-                                <&clk_gates0 5>, <&clk_gates0 5>,
-                                <&clk_gates0 5>, <&clk_gates0 5>,
-                                <&clk_gates0 4>, <&clk_gates0 5>,
-                                <&clk_gates2 1>, <&clk_gates2 2>,
-                                <&clk_gates2 2>, <&clk_gates2 2>,
-                                <&clk_gates2 2>, <&clk_gates4 5>;
-
-                       clock-output-names =
-                               "gate_aclk_dmac1", "gate_aclk_dmac2",
-                               "gate_pclk_efuse", "gate_pclk_tzpc",
-                               "gate_pclk_grf", "gate_pclk_pmu",
-                               "gate_hclk_rom", "gate_pclk_ddrupctl",
-                               "gate_aclk_smc", "gate_hclk_nandc",
-                               "gate_hclk_mmc0", "gate_hclk_mmc1",
-                               "gate_hclk_emmc", "gate_hclk_otg0";
-
-                       #clock-cells = <1>;
-               };
-
-               clk_gates6: gate-clk@200000e8 {
-                       compatible = "rockchip,rk2928-gate-clk";
-                       reg = <0x200000e8 0x4>;
-                       clocks = <&clk_gates3 0>, <&clk_gates0 4>,
-                                <&clk_gates0 4>, <&clk_gates1 4>,
-                                <&clk_gates0 4>, <&clk_gates3 0>,
-                                <&dummy>, <&dummy>,
-                                <&clk_gates3 0>, <&clk_gates0 4>,
-                                <&clk_gates0 4>, <&clk_gates1 4>,
-                                <&clk_gates0 4>, <&clk_gates3 0>;
-
-                       clock-output-names =
-                               "gate_aclk_lcdc0", "gate_hclk_lcdc0",
-                               "gate_hclk_lcdc1", "gate_aclk_lcdc1",
-                               "gate_hclk_cif0", "gate_aclk_cif0",
-                               "reserved", "reserved",
-                               "gate_aclk_ipp", "gate_hclk_ipp",
-                               "gate_hclk_rga", "gate_aclk_rga",
-                               "gate_hclk_vio_bus", "gate_aclk_vio0";
-
-                       #clock-cells = <1>;
-               };
-
-               clk_gates7: gate-clk@200000ec {
-                       compatible = "rockchip,rk2928-gate-clk";
-                       reg = <0x200000ec 0x4>;
-                       clocks = <&clk_gates2 2>, <&clk_gates0 4>,
-                                <&clk_gates0 4>, <&dummy>,
-                                <&dummy>, <&clk_gates2 2>,
-                                <&clk_gates2 2>, <&clk_gates0 5>,
-                                <&dummy>, <&clk_gates0 5>,
-                                <&clk_gates0 5>, <&clk_gates2 3>,
-                                <&clk_gates2 3>, <&clk_gates2 3>,
-                                <&clk_gates2 3>, <&clk_gates2 3>;
-
-                       clock-output-names =
-                               "gate_hclk_emac", "gate_hclk_spdif",
-                               "gate_hclk_i2s0_2ch", "gate_hclk_otg1",
-                               "gate_hclk_hsic", "gate_hclk_hsadc",
-                               "gate_hclk_pidf", "gate_pclk_timer0",
-                               "reserved", "gate_pclk_timer2",
-                               "gate_pclk_pwm01", "gate_pclk_pwm23",
-                               "gate_pclk_spi0", "gate_pclk_spi1",
-                               "gate_pclk_saradc", "gate_pclk_wdt";
-
-                       #clock-cells = <1>;
-               };
-
-               clk_gates8: gate-clk@200000f0 {
-                       compatible = "rockchip,rk2928-gate-clk";
-                       reg = <0x200000f0 0x4>;
-                       clocks = <&clk_gates0 5>, <&clk_gates0 5>,
-                                <&clk_gates2 3>, <&clk_gates2 3>,
-                                <&clk_gates0 5>, <&clk_gates0 5>,
-                                <&clk_gates2 3>, <&clk_gates2 3>,
-                                <&clk_gates2 3>, <&clk_gates0 5>,
-                                <&clk_gates0 5>, <&clk_gates0 5>,
-                                <&clk_gates2 3>, <&dummy>;
-
-                       clock-output-names =
-                               "gate_pclk_uart0", "gate_pclk_uart1",
-                               "gate_pclk_uart2", "gate_pclk_uart3",
-                               "gate_pclk_i2c0", "gate_pclk_i2c1",
-                               "gate_pclk_i2c2", "gate_pclk_i2c3",
-                               "gate_pclk_i2c4", "gate_pclk_gpio0",
-                               "gate_pclk_gpio1", "gate_pclk_gpio2",
-                               "gate_pclk_gpio3", "gate_aclk_gps";
-
-                       #clock-cells = <1>;
-               };
-
-               clk_gates9: gate-clk@200000f4 {
-                       compatible = "rockchip,rk2928-gate-clk";
-                       reg = <0x200000f4 0x4>;
-                       clocks = <&dummy>, <&dummy>,
-                                <&dummy>, <&dummy>,
-                                <&dummy>, <&dummy>,
-                                <&dummy>, <&dummy>;
-
-                       clock-output-names =
-                               "gate_clk_core_dbg", "gate_pclk_dbg",
-                               "gate_clk_trace", "gate_atclk",
-                               "gate_clk_l2c", "gate_aclk_vio1",
-                               "gate_pclk_publ", "gate_aclk_gpu";
-
-                       #clock-cells = <1>;
-               };
-       };
-
-};
index a5eee55079cb7e622dfd6368cefff3b6329439a4..171b610db709f9e4f94355c31d54d858d89a84c2 100644 (file)
                reg = <0x60000000 0x80000000>;
        };
 
-       soc {
-               uart0: serial@10124000 {
-                       status = "okay";
+       gpio-keys {
+               compatible = "gpio-keys";
+               #address-cells = <1>;
+               #size-cells = <0>;
+               autorepeat;
+
+               button@0 {
+                       gpios = <&gpio0 4 GPIO_ACTIVE_LOW>;
+                       linux,code = <116>;
+                       label = "GPIO Key Power";
+                       linux,input-type = <1>;
+                       gpio-key,wakeup = <1>;
+                       debounce-interval = <100>;
                };
+       };
 
-               uart1: serial@10126000 {
-                       status = "okay";
+       gpio-leds {
+               compatible = "gpio-leds";
+
+               green {
+                       gpios = <&gpio0 12 GPIO_ACTIVE_LOW>;
+                       default-state = "off";
                };
 
-               uart2: serial@20064000 {
-                       pinctrl-names = "default";
-                       pinctrl-0 = <&uart2_xfer>;
-                       status = "okay";
+               yellow {
+                       gpios = <&gpio0 14 GPIO_ACTIVE_LOW>;
+                       default-state = "off";
                };
 
-               uart3: serial@20068000 {
-                       status = "okay";
+               sleep {
+                       gpios = <&gpio0 15 0>;
+                       default-state = "off";
                };
+       };
 
-               gpio-keys {
-                       compatible = "gpio-keys";
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       autorepeat;
-
-                       button@0 {
-                               gpios = <&gpio0 4 GPIO_ACTIVE_LOW>;
-                               linux,code = <116>;
-                               label = "GPIO Key Power";
-                               linux,input-type = <1>;
-                               gpio-key,wakeup = <1>;
-                               debounce-interval = <100>;
+       ir_recv: gpio-ir-receiver {
+               compatible = "gpio-ir-receiver";
+               gpios = <&gpio0 10 1>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&ir_recv_pin>;
+       };
+
+       vcc_sd0: sdmmc-regulator {
+               compatible = "regulator-fixed";
+               regulator-name = "sdmmc-supply";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               gpio = <&gpio3 1 GPIO_ACTIVE_LOW>;
+               startup-delay-us = <100000>;
+               vin-supply = <&vcc_io>;
+       };
+};
+
+&i2c1 {
+       status = "okay";
+       clock-frequency = <400000>;
+
+       act8846: act8846@5a {
+               compatible = "active-semi,act8846";
+               reg = <0x5a>;
+               status = "okay";
+
+               pinctrl-names = "default";
+               pinctrl-0 = <&act8846_dvs0_ctl>;
+
+               regulators {
+                       vcc_ddr: REG1 {
+                               regulator-name = "VCC_DDR";
+                               regulator-min-microvolt = <1200000>;
+                               regulator-max-microvolt = <1200000>;
+                               regulator-always-on;
+                       };
+
+                       vdd_log: REG2 {
+                               regulator-name = "VDD_LOG";
+                               regulator-min-microvolt = <1000000>;
+                               regulator-max-microvolt = <1000000>;
+                               regulator-always-on;
+                       };
+
+                       vdd_arm: REG3 {
+                               regulator-name = "VDD_ARM";
+                               regulator-min-microvolt = <875000>;
+                               regulator-max-microvolt = <1300000>;
+                               regulator-always-on;
+                       };
+
+                       vcc_io: REG4 {
+                               regulator-name = "VCC_IO";
+                               regulator-min-microvolt = <3300000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-always-on;
+                       };
+
+                       vdd_10: REG5 {
+                               regulator-name = "VDD_10";
+                               regulator-min-microvolt = <1000000>;
+                               regulator-max-microvolt = <1000000>;
+                               regulator-always-on;
+                       };
+
+                       vdd_hdmi: REG6 {
+                               regulator-name = "VDD_HDMI";
+                               regulator-min-microvolt = <2500000>;
+                               regulator-max-microvolt = <2500000>;
+                               regulator-always-on;
+                       };
+
+                       vcc18: REG7 {
+                               regulator-name = "VCC_18";
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <1800000>;
+                               regulator-always-on;
                        };
-               };
 
-               gpio-leds {
-                       compatible = "gpio-leds";
+                       vcca_33: REG8 {
+                               regulator-name = "VCCA_33";
+                               regulator-min-microvolt = <3300000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-always-on;
+                       };
+
+                       vcc_rmii: REG9 {
+                               regulator-name = "VCC_RMII";
+                               regulator-min-microvolt = <3300000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-always-on;
+                       };
 
-                       green {
-                               gpios = <&gpio0 12 GPIO_ACTIVE_LOW>;
-                               default-state = "off";
+                       vccio_wl: REG10 {
+                               regulator-name = "VCCIO_WL";
+                               regulator-min-microvolt = <3300000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-always-on;
                        };
 
-                       yellow {
-                               gpios = <&gpio0 14 GPIO_ACTIVE_LOW>;
-                               default-state = "off";
+                       vcc_18: REG11 {
+                               regulator-name = "VCC18_IO";
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <1800000>;
+                               regulator-always-on;
                        };
 
-                       sleep {
-                               gpios = <&gpio0 15 0>;
-                               default-state = "off";
+                       vcc28: REG12 {
+                               regulator-name = "VCC_28";
+                               regulator-min-microvolt = <2800000>;
+                               regulator-max-microvolt = <2800000>;
+                               regulator-always-on;
                        };
                };
+       };
+};
+
+&mmc0 {
+       num-slots = <1>;
+       status = "okay";
+       vmmc-supply = <&vcc_sd0>;
 
+       slot@0 {
+               reg = <0>;
+               bus-width = <4>;
+               disable-wp;
        };
 };
+
+&pinctrl {
+       pcfg_output_low: pcfg-output-low {
+               output-low;
+       };
+
+       act8846 {
+               act8846_dvs0_ctl: act8846-dvs0-ctl {
+                       rockchip,pins = <RK_GPIO3 27 RK_FUNC_GPIO &pcfg_output_low>;
+               };
+       };
+
+       ir-receiver {
+               ir_recv_pin: ir-recv-pin {
+                       rockchip,pins = <RK_GPIO0 10 RK_FUNC_GPIO &pcfg_pull_none>;
+               };
+       };
+};
+
+&uart0 {
+       status = "okay";
+};
+
+&uart1 {
+       status = "okay";
+};
+
+&uart2 {
+       status = "okay";
+};
+
+&uart3 {
+       status = "okay";
+};
+
+&wdt {
+       status = "okay";
+};
index 238c996d4a7f0d9ac98013bd5741665fb9db5fb3..ee801a9c6b74144e4a8153908a5e1ad07365bfef 100644 (file)
@@ -15,8 +15,8 @@
 
 #include <dt-bindings/gpio/gpio.h>
 #include <dt-bindings/pinctrl/rockchip.h>
+#include <dt-bindings/clock/rk3188-cru.h>
 #include "rk3xxx.dtsi"
-#include "rk3188-clocks.dtsi"
 
 / {
        compatible = "rockchip,rk3188";
                };
        };
 
-       soc {
-               global-timer@1013c200 {
-                       interrupts = <GIC_PPI 11 0xf04>;
+       sram: sram@10080000 {
+               compatible = "mmio-sram";
+               reg = <0x10080000 0x8000>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges = <0 0x10080000 0x8000>;
+
+               smp-sram@0 {
+                       compatible = "rockchip,rk3066-smp-sram";
+                       reg = <0x0 0x50>;
                };
+       };
+
+       cru: clock-controller@20000000 {
+               compatible = "rockchip,rk3188-cru";
+               reg = <0x20000000 0x1000>;
+               rockchip,grf = <&grf>;
+
+               #clock-cells = <1>;
+               #reset-cells = <1>;
+       };
+
+       pinctrl: pinctrl {
+               compatible = "rockchip,rk3188-pinctrl";
+               rockchip,grf = <&grf>;
+               rockchip,pmu = <&pmu>;
+
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges;
+
+               gpio0: gpio0@0x2000a000 {
+                       compatible = "rockchip,rk3188-gpio-bank0";
+                       reg = <0x2000a000 0x100>;
+                       interrupts = <GIC_SPI 54 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cru PCLK_GPIO0>;
+
+                       gpio-controller;
+                       #gpio-cells = <2>;
 
-               local-timer@1013c600 {
-                       interrupts = <GIC_PPI 13 0xf04>;
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
                };
 
-               sram: sram@10080000 {
-                       compatible = "mmio-sram";
-                       reg = <0x10080000 0x8000>;
-                       #address-cells = <1>;
-                       #size-cells = <1>;
-                       ranges = <0 0x10080000 0x8000>;
+               gpio1: gpio1@0x2003c000 {
+                       compatible = "rockchip,gpio-bank";
+                       reg = <0x2003c000 0x100>;
+                       interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cru PCLK_GPIO1>;
 
-                       smp-sram@0 {
-                               compatible = "rockchip,rk3066-smp-sram";
-                               reg = <0x0 0x50>;
-                       };
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
                };
 
-               pinctrl@20008000 {
-                       compatible = "rockchip,rk3188-pinctrl";
-                       rockchip,grf = <&grf>;
-                       rockchip,pmu = <&pmu>;
+               gpio2: gpio2@2003e000 {
+                       compatible = "rockchip,gpio-bank";
+                       reg = <0x2003e000 0x100>;
+                       interrupts = <GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cru PCLK_GPIO2>;
 
-                       #address-cells = <1>;
-                       #size-cells = <1>;
-                       ranges;
+                       gpio-controller;
+                       #gpio-cells = <2>;
 
-                       gpio0: gpio0@0x2000a000 {
-                               compatible = "rockchip,rk3188-gpio-bank0";
-                               reg = <0x2000a000 0x100>;
-                               interrupts = <GIC_SPI 54 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clk_gates8 9>;
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
 
-                               gpio-controller;
-                               #gpio-cells = <2>;
+               gpio3: gpio3@20080000 {
+                       compatible = "rockchip,gpio-bank";
+                       reg = <0x20080000 0x100>;
+                       interrupts = <GIC_SPI 57 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cru PCLK_GPIO3>;
 
-                               interrupt-controller;
-                               #interrupt-cells = <2>;
-                       };
+                       gpio-controller;
+                       #gpio-cells = <2>;
 
-                       gpio1: gpio1@0x2003c000 {
-                               compatible = "rockchip,gpio-bank";
-                               reg = <0x2003c000 0x100>;
-                               interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clk_gates8 10>;
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
 
-                               gpio-controller;
-                               #gpio-cells = <2>;
+               pcfg_pull_up: pcfg_pull_up {
+                       bias-pull-up;
+               };
 
-                               interrupt-controller;
-                               #interrupt-cells = <2>;
-                       };
+               pcfg_pull_down: pcfg_pull_down {
+                       bias-pull-down;
+               };
 
-                       gpio2: gpio2@2003e000 {
-                               compatible = "rockchip,gpio-bank";
-                               reg = <0x2003e000 0x100>;
-                               interrupts = <GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clk_gates8 11>;
+               pcfg_pull_none: pcfg_pull_none {
+                       bias-disable;
+               };
+
+               i2c0 {
+                       i2c0_xfer: i2c0-xfer {
+                               rockchip,pins = <RK_GPIO1 24 RK_FUNC_1 &pcfg_pull_none>,
+                                               <RK_GPIO1 25 RK_FUNC_1 &pcfg_pull_none>;
+                       };
+               };
 
-                               gpio-controller;
-                               #gpio-cells = <2>;
+               i2c1 {
+                       i2c1_xfer: i2c1-xfer {
+                               rockchip,pins = <RK_GPIO1 26 RK_FUNC_1 &pcfg_pull_none>,
+                                               <RK_GPIO1 27 RK_FUNC_1 &pcfg_pull_none>;
+                       };
+               };
 
-                               interrupt-controller;
-                               #interrupt-cells = <2>;
+               i2c2 {
+                       i2c2_xfer: i2c2-xfer {
+                               rockchip,pins = <RK_GPIO1 28 RK_FUNC_1 &pcfg_pull_none>,
+                                               <RK_GPIO1 29 RK_FUNC_1 &pcfg_pull_none>;
                        };
+               };
 
-                       gpio3: gpio3@20080000 {
-                               compatible = "rockchip,gpio-bank";
-                               reg = <0x20080000 0x100>;
-                               interrupts = <GIC_SPI 57 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clk_gates8 12>;
+               i2c3 {
+                       i2c3_xfer: i2c3-xfer {
+                               rockchip,pins = <RK_GPIO3 14 RK_FUNC_2 &pcfg_pull_none>,
+                                               <RK_GPIO3 15 RK_FUNC_2 &pcfg_pull_none>;
+                       };
+               };
 
-                               gpio-controller;
-                               #gpio-cells = <2>;
+               i2c4 {
+                       i2c4_xfer: i2c4-xfer {
+                               rockchip,pins = <RK_GPIO1 30 RK_FUNC_1 &pcfg_pull_none>,
+                                               <RK_GPIO1 31 RK_FUNC_1 &pcfg_pull_none>;
+                       };
+               };
 
-                               interrupt-controller;
-                               #interrupt-cells = <2>;
+               pwm0 {
+                       pwm0_out: pwm0-out {
+                               rockchip,pins = <RK_GPIO3 27 RK_FUNC_1 &pcfg_pull_none>;
                        };
+               };
 
-                       pcfg_pull_up: pcfg_pull_up {
-                               bias-pull-up;
+               pwm1 {
+                       pwm1_out: pwm1-out {
+                               rockchip,pins = <RK_GPIO3 28 RK_FUNC_1 &pcfg_pull_none>;
                        };
+               };
 
-                       pcfg_pull_down: pcfg_pull_down {
-                               bias-pull-down;
+               pwm2 {
+                       pwm2_out: pwm2-out {
+                               rockchip,pins = <RK_GPIO3 29 RK_FUNC_1 &pcfg_pull_none>;
                        };
+               };
 
-                       pcfg_pull_none: pcfg_pull_none {
-                               bias-disable;
+               pwm3 {
+                       pwm3_out: pwm3-out {
+                               rockchip,pins = <RK_GPIO3 30 RK_FUNC_1 &pcfg_pull_none>;
                        };
+               };
 
-                       uart0 {
-                               uart0_xfer: uart0-xfer {
-                                       rockchip,pins = <RK_GPIO1 0 RK_FUNC_1 &pcfg_pull_up>,
-                                                       <RK_GPIO1 1 RK_FUNC_1 &pcfg_pull_none>;
-                               };
+               uart0 {
+                       uart0_xfer: uart0-xfer {
+                               rockchip,pins = <RK_GPIO1 0 RK_FUNC_1 &pcfg_pull_up>,
+                                               <RK_GPIO1 1 RK_FUNC_1 &pcfg_pull_none>;
+                       };
 
-                               uart0_cts: uart0-cts {
-                                       rockchip,pins = <RK_GPIO1 2 RK_FUNC_1 &pcfg_pull_none>;
-                               };
+                       uart0_cts: uart0-cts {
+                               rockchip,pins = <RK_GPIO1 2 RK_FUNC_1 &pcfg_pull_none>;
+                       };
 
-                               uart0_rts: uart0-rts {
-                                       rockchip,pins = <RK_GPIO1 3 RK_FUNC_1 &pcfg_pull_none>;
-                               };
+                       uart0_rts: uart0-rts {
+                               rockchip,pins = <RK_GPIO1 3 RK_FUNC_1 &pcfg_pull_none>;
                        };
+               };
 
-                       uart1 {
-                               uart1_xfer: uart1-xfer {
-                                       rockchip,pins = <RK_GPIO1 4 RK_FUNC_1 &pcfg_pull_up>,
-                                                       <RK_GPIO1 5 RK_FUNC_1 &pcfg_pull_none>;
-                               };
+               uart1 {
+                       uart1_xfer: uart1-xfer {
+                               rockchip,pins = <RK_GPIO1 4 RK_FUNC_1 &pcfg_pull_up>,
+                                               <RK_GPIO1 5 RK_FUNC_1 &pcfg_pull_none>;
+                       };
 
-                               uart1_cts: uart1-cts {
-                                       rockchip,pins = <RK_GPIO1 6 RK_FUNC_1 &pcfg_pull_none>;
-                               };
+                       uart1_cts: uart1-cts {
+                               rockchip,pins = <RK_GPIO1 6 RK_FUNC_1 &pcfg_pull_none>;
+                       };
 
-                               uart1_rts: uart1-rts {
-                                       rockchip,pins = <RK_GPIO1 7 RK_FUNC_1 &pcfg_pull_none>;
-                               };
+                       uart1_rts: uart1-rts {
+                               rockchip,pins = <RK_GPIO1 7 RK_FUNC_1 &pcfg_pull_none>;
                        };
+               };
 
-                       uart2 {
-                               uart2_xfer: uart2-xfer {
-                                       rockchip,pins = <RK_GPIO1 8 RK_FUNC_1 &pcfg_pull_up>,
-                                                       <RK_GPIO1 9 RK_FUNC_1 &pcfg_pull_none>;
-                               };
-                               /* no rts / cts for uart2 */
+               uart2 {
+                       uart2_xfer: uart2-xfer {
+                               rockchip,pins = <RK_GPIO1 8 RK_FUNC_1 &pcfg_pull_up>,
+                                               <RK_GPIO1 9 RK_FUNC_1 &pcfg_pull_none>;
                        };
+                       /* no rts / cts for uart2 */
+               };
 
-                       uart3 {
-                               uart3_xfer: uart3-xfer {
-                                       rockchip,pins = <RK_GPIO1 10 RK_FUNC_1 &pcfg_pull_up>,
-                                                       <RK_GPIO1 11 RK_FUNC_1 &pcfg_pull_none>;
-                               };
+               uart3 {
+                       uart3_xfer: uart3-xfer {
+                               rockchip,pins = <RK_GPIO1 10 RK_FUNC_1 &pcfg_pull_up>,
+                                               <RK_GPIO1 11 RK_FUNC_1 &pcfg_pull_none>;
+                       };
 
-                               uart3_cts: uart3-cts {
-                                       rockchip,pins = <RK_GPIO1 12 RK_FUNC_1 &pcfg_pull_none>;
-                               };
+                       uart3_cts: uart3-cts {
+                               rockchip,pins = <RK_GPIO1 12 RK_FUNC_1 &pcfg_pull_none>;
+                       };
 
-                               uart3_rts: uart3-rts {
-                                       rockchip,pins = <RK_GPIO1 13 RK_FUNC_1 &pcfg_pull_none>;
-                               };
+                       uart3_rts: uart3-rts {
+                               rockchip,pins = <RK_GPIO1 13 RK_FUNC_1 &pcfg_pull_none>;
                        };
+               };
 
-                       sd0 {
-                               sd0_clk: sd0-clk {
-                                       rockchip,pins = <RK_GPIO3 2 RK_FUNC_1 &pcfg_pull_none>;
-                               };
+               sd0 {
+                       sd0_clk: sd0-clk {
+                               rockchip,pins = <RK_GPIO3 2 RK_FUNC_1 &pcfg_pull_none>;
+                       };
 
-                               sd0_cmd: sd0-cmd {
-                                       rockchip,pins = <RK_GPIO3 3 RK_FUNC_1 &pcfg_pull_none>;
-                               };
+                       sd0_cmd: sd0-cmd {
+                               rockchip,pins = <RK_GPIO3 3 RK_FUNC_1 &pcfg_pull_none>;
+                       };
 
-                               sd0_cd: sd0-cd {
-                                       rockchip,pins = <RK_GPIO3 8 RK_FUNC_1 &pcfg_pull_none>;
-                               };
+                       sd0_cd: sd0-cd {
+                               rockchip,pins = <RK_GPIO3 8 RK_FUNC_1 &pcfg_pull_none>;
+                       };
 
-                               sd0_wp: sd0-wp {
-                                       rockchip,pins = <RK_GPIO3 9 RK_FUNC_1 &pcfg_pull_none>;
-                               };
+                       sd0_wp: sd0-wp {
+                               rockchip,pins = <RK_GPIO3 9 RK_FUNC_1 &pcfg_pull_none>;
+                       };
 
-                               sd0_pwr: sd0-pwr {
-                                       rockchip,pins = <RK_GPIO3 1 RK_FUNC_1 &pcfg_pull_none>;
-                               };
+                       sd0_pwr: sd0-pwr {
+                               rockchip,pins = <RK_GPIO3 1 RK_FUNC_1 &pcfg_pull_none>;
+                       };
 
-                               sd0_bus1: sd0-bus-width1 {
-                                       rockchip,pins = <RK_GPIO3 4 RK_FUNC_1 &pcfg_pull_none>;
-                               };
+                       sd0_bus1: sd0-bus-width1 {
+                               rockchip,pins = <RK_GPIO3 4 RK_FUNC_1 &pcfg_pull_none>;
+                       };
 
-                               sd0_bus4: sd0-bus-width4 {
-                                       rockchip,pins = <RK_GPIO3 4 RK_FUNC_1 &pcfg_pull_none>,
-                                                       <RK_GPIO3 5 RK_FUNC_1 &pcfg_pull_none>,
-                                                       <RK_GPIO3 6 RK_FUNC_1 &pcfg_pull_none>,
-                                                       <RK_GPIO3 7 RK_FUNC_1 &pcfg_pull_none>;
-                               };
+                       sd0_bus4: sd0-bus-width4 {
+                               rockchip,pins = <RK_GPIO3 4 RK_FUNC_1 &pcfg_pull_none>,
+                                               <RK_GPIO3 5 RK_FUNC_1 &pcfg_pull_none>,
+                                               <RK_GPIO3 6 RK_FUNC_1 &pcfg_pull_none>,
+                                               <RK_GPIO3 7 RK_FUNC_1 &pcfg_pull_none>;
                        };
+               };
 
-                       sd1 {
-                               sd1_clk: sd1-clk {
-                                       rockchip,pins = <RK_GPIO3 21 RK_FUNC_1 &pcfg_pull_none>;
-                               };
+               sd1 {
+                       sd1_clk: sd1-clk {
+                               rockchip,pins = <RK_GPIO3 21 RK_FUNC_1 &pcfg_pull_none>;
+                       };
 
-                               sd1_cmd: sd1-cmd {
-                                       rockchip,pins = <RK_GPIO3 16 RK_FUNC_1 &pcfg_pull_none>;
-                               };
+                       sd1_cmd: sd1-cmd {
+                               rockchip,pins = <RK_GPIO3 16 RK_FUNC_1 &pcfg_pull_none>;
+                       };
 
-                               sd1_cd: sd1-cd {
-                                       rockchip,pins = <RK_GPIO3 22 RK_FUNC_1 &pcfg_pull_none>;
-                               };
+                       sd1_cd: sd1-cd {
+                               rockchip,pins = <RK_GPIO3 22 RK_FUNC_1 &pcfg_pull_none>;
+                       };
 
-                               sd1_wp: sd1-wp {
-                                       rockchip,pins = <RK_GPIO3 23 RK_FUNC_1 &pcfg_pull_none>;
-                               };
+                       sd1_wp: sd1-wp {
+                               rockchip,pins = <RK_GPIO3 23 RK_FUNC_1 &pcfg_pull_none>;
+                       };
 
-                               sd1_bus1: sd1-bus-width1 {
-                                       rockchip,pins = <RK_GPIO3 17 RK_FUNC_1 &pcfg_pull_none>;
-                               };
+                       sd1_bus1: sd1-bus-width1 {
+                               rockchip,pins = <RK_GPIO3 17 RK_FUNC_1 &pcfg_pull_none>;
+                       };
 
-                               sd1_bus4: sd1-bus-width4 {
-                                       rockchip,pins = <RK_GPIO3 17 RK_FUNC_1 &pcfg_pull_none>,
-                                                       <RK_GPIO3 18 RK_FUNC_1 &pcfg_pull_none>,
-                                                       <RK_GPIO3 19 RK_FUNC_1 &pcfg_pull_none>,
-                                                       <RK_GPIO3 20 RK_FUNC_1 &pcfg_pull_none>;
-                               };
+                       sd1_bus4: sd1-bus-width4 {
+                               rockchip,pins = <RK_GPIO3 17 RK_FUNC_1 &pcfg_pull_none>,
+                                               <RK_GPIO3 18 RK_FUNC_1 &pcfg_pull_none>,
+                                               <RK_GPIO3 19 RK_FUNC_1 &pcfg_pull_none>,
+                                               <RK_GPIO3 20 RK_FUNC_1 &pcfg_pull_none>;
                        };
                };
        };
 };
+
+&global_timer {
+       interrupts = <GIC_PPI 11 0xf04>;
+};
+
+&local_timer {
+       interrupts = <GIC_PPI 13 0xf04>;
+};
+
+&i2c0 {
+       compatible = "rockchip,rk3188-i2c";
+       pinctrl-names = "default";
+       pinctrl-0 = <&i2c0_xfer>;
+};
+
+&i2c1 {
+       compatible = "rockchip,rk3188-i2c";
+       pinctrl-names = "default";
+       pinctrl-0 = <&i2c1_xfer>;
+};
+
+&i2c2 {
+       compatible = "rockchip,rk3188-i2c";
+       pinctrl-names = "default";
+       pinctrl-0 = <&i2c2_xfer>;
+};
+
+&i2c3 {
+       compatible = "rockchip,rk3188-i2c";
+       pinctrl-names = "default";
+       pinctrl-0 = <&i2c3_xfer>;
+};
+
+&i2c4 {
+       compatible = "rockchip,rk3188-i2c";
+       pinctrl-names = "default";
+       pinctrl-0 = <&i2c4_xfer>;
+};
+
+&pwm0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pwm0_out>;
+};
+
+&pwm1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pwm1_out>;
+};
+
+&pwm2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pwm2_out>;
+};
+
+&pwm3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pwm3_out>;
+};
+
+&uart0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart0_xfer>;
+};
+
+&uart1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart1_xfer>;
+};
+
+&uart2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart2_xfer>;
+};
+
+&uart3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart3_xfer>;
+};
+
+&wdt {
+       compatible = "rockchip,rk3188-wdt", "snps,dw-wdt";
+};
diff --git a/arch/arm/boot/dts/rk3288-evb-act8846.dts b/arch/arm/boot/dts/rk3288-evb-act8846.dts
new file mode 100644 (file)
index 0000000..7d59ff4
--- /dev/null
@@ -0,0 +1,134 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+/dts-v1/;
+#include "rk3288-evb.dtsi"
+
+/ {
+       compatible = "rockchip,rk3288-evb-act8846", "rockchip,rk3288";
+};
+
+&i2c0 {
+       hym8563@51 {
+               compatible = "haoyu,hym8563";
+               reg = <0x51>;
+
+               interrupt-parent = <&gpio0>;
+               interrupts = <4 IRQ_TYPE_EDGE_FALLING>;
+
+               pinctrl-names = "default";
+               pinctrl-0 = <&hym8563_int>;
+
+               #clock-cells = <0>;
+               clock-output-names = "xin32k";
+       };
+
+       act8846: act8846@5a {
+               compatible = "active-semi,act8846";
+               reg = <0x5a>;
+               status = "okay";
+
+               regulators {
+                       vcc_ddr: REG1 {
+                               regulator-name = "VCC_DDR";
+                               regulator-min-microvolt = <1200000>;
+                               regulator-max-microvolt = <1200000>;
+                               regulator-always-on;
+                       };
+
+                       vcc_io: REG2 {
+                               regulator-name = "VCC_IO";
+                               regulator-min-microvolt = <3300000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-always-on;
+                       };
+
+                       vdd_log: REG3 {
+                               regulator-name = "VDD_LOG";
+                               regulator-min-microvolt = <1000000>;
+                               regulator-max-microvolt = <1000000>;
+                               regulator-always-on;
+                       };
+
+                       vcc_20: REG4 {
+                               regulator-name = "VCC_20";
+                               regulator-min-microvolt = <2000000>;
+                               regulator-max-microvolt = <2000000>;
+                               regulator-always-on;
+                       };
+
+                       vccio_sd: REG5 {
+                               regulator-name = "VCCIO_SD";
+                               regulator-min-microvolt = <3300000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-always-on;
+                       };
+
+                       vdd10_lcd: REG6 {
+                               regulator-name = "VDD10_LCD";
+                               regulator-min-microvolt = <1000000>;
+                               regulator-max-microvolt = <1000000>;
+                               regulator-always-on;
+                       };
+
+                       vcca_codec: REG7 {
+                               regulator-name = "VCCA_CODEC";
+                               regulator-min-microvolt = <3300000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-always-on;
+                       };
+
+                       vcca_tp: REG8 {
+                               regulator-name = "VCCA_TP";
+                               regulator-min-microvolt = <3300000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-always-on;
+                       };
+
+                       vccio_pmu: REG9 {
+                               regulator-name = "VCCIO_PMU";
+                               regulator-min-microvolt = <3300000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-always-on;
+                       };
+
+                       vdd_10: REG10 {
+                               regulator-name = "VDD_10";
+                               regulator-min-microvolt = <1000000>;
+                               regulator-max-microvolt = <1000000>;
+                               regulator-always-on;
+                       };
+
+                       vcc_18: REG11 {
+                               regulator-name = "VCC_18";
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <1800000>;
+                               regulator-always-on;
+                       };
+
+                       vcc18_lcd: REG12 {
+                               regulator-name = "VCC18_LCD";
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <1800000>;
+                               regulator-always-on;
+                       };
+               };
+       };
+};
+
+&pinctrl {
+       hym8563 {
+               hym8563_int: hym8563-int {
+                       rockchip,pins = <RK_GPIO0 4 RK_FUNC_GPIO &pcfg_pull_up>;
+               };
+       };
+};
diff --git a/arch/arm/boot/dts/rk3288-evb-rk808.dts b/arch/arm/boot/dts/rk3288-evb-rk808.dts
new file mode 100644 (file)
index 0000000..9a88b6c
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+/dts-v1/;
+#include "rk3288-evb.dtsi"
+
+/ {
+       compatible = "rockchip,rk3288-evb-rk808", "rockchip,rk3288";
+};
diff --git a/arch/arm/boot/dts/rk3288-evb.dtsi b/arch/arm/boot/dts/rk3288-evb.dtsi
new file mode 100644 (file)
index 0000000..4f57209
--- /dev/null
@@ -0,0 +1,96 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include "rk3288.dtsi"
+
+/ {
+       memory {
+               reg = <0x0 0x80000000>;
+       };
+
+       gpio-keys {
+               compatible = "gpio-keys";
+               #address-cells = <1>;
+               #size-cells = <0>;
+               autorepeat;
+
+               pinctrl-names = "default";
+               pinctrl-0 = <&pwrbtn>;
+
+               button@0 {
+                       gpios = <&gpio0 5 GPIO_ACTIVE_LOW>;
+                       linux,code = <116>;
+                       label = "GPIO Key Power";
+                       linux,input-type = <1>;
+                       gpio-key,wakeup = <1>;
+                       debounce-interval = <100>;
+               };
+       };
+
+       /* This turns on USB vbus for both host0 (ehci) and host1 (dwc2) */
+       vcc_host: vcc-host-regulator {
+               compatible = "regulator-fixed";
+               enable-active-high;
+               gpio = <&gpio0 14 GPIO_ACTIVE_HIGH>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&host_vbus_drv>;
+               regulator-name = "vcc_host";
+               regulator-always-on;
+               regulator-boot-on;
+       };
+};
+
+&i2c0 {
+       status = "okay";
+};
+
+&wdt {
+       status = "okay";
+};
+
+&uart0 {
+       status = "okay";
+};
+
+&uart1 {
+       status = "okay";
+};
+
+&uart2 {
+       status = "okay";
+};
+
+&uart3 {
+       status = "okay";
+};
+
+&uart4 {
+       status = "okay";
+};
+
+&pinctrl {
+       buttons {
+               pwrbtn: pwrbtn {
+                       rockchip,pins = <0 5 RK_FUNC_GPIO &pcfg_pull_up>;
+               };
+       };
+
+       usb {
+               host_vbus_drv: host-vbus-drv {
+                       rockchip,pins = <0 14 RK_FUNC_GPIO &pcfg_pull_none>;
+               };
+       };
+};
+
+&usb_host0_ehci {
+       status = "okay";
+};
diff --git a/arch/arm/boot/dts/rk3288.dtsi b/arch/arm/boot/dts/rk3288.dtsi
new file mode 100644 (file)
index 0000000..e7cb008
--- /dev/null
@@ -0,0 +1,595 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/interrupt-controller/irq.h>
+#include <dt-bindings/interrupt-controller/arm-gic.h>
+#include <dt-bindings/pinctrl/rockchip.h>
+#include <dt-bindings/clock/rk3288-cru.h>
+#include "skeleton.dtsi"
+
+/ {
+       compatible = "rockchip,rk3288";
+
+       interrupt-parent = <&gic>;
+
+       aliases {
+               i2c0 = &i2c0;
+               i2c1 = &i2c1;
+               i2c2 = &i2c2;
+               i2c3 = &i2c3;
+               i2c4 = &i2c4;
+               i2c5 = &i2c5;
+               serial0 = &uart0;
+               serial1 = &uart1;
+               serial2 = &uart2;
+               serial3 = &uart3;
+               serial4 = &uart4;
+       };
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               cpu@500 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a12";
+                       reg = <0x500>;
+               };
+               cpu@501 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a12";
+                       reg = <0x501>;
+               };
+               cpu@502 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a12";
+                       reg = <0x502>;
+               };
+               cpu@503 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a12";
+                       reg = <0x503>;
+               };
+       };
+
+       xin24m: oscillator {
+               compatible = "fixed-clock";
+               clock-frequency = <24000000>;
+               clock-output-names = "xin24m";
+               #clock-cells = <0>;
+       };
+
+       timer {
+               compatible = "arm,armv7-timer";
+               interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>,
+                            <GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>,
+                            <GIC_PPI 11 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>,
+                            <GIC_PPI 10 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>;
+               clock-frequency = <24000000>;
+       };
+
+       i2c1: i2c@ff140000 {
+               compatible = "rockchip,rk3288-i2c";
+               reg = <0xff140000 0x1000>;
+               interrupts = <GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+               clock-names = "i2c";
+               clocks = <&cru PCLK_I2C1>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&i2c1_xfer>;
+               status = "disabled";
+       };
+
+       i2c3: i2c@ff150000 {
+               compatible = "rockchip,rk3288-i2c";
+               reg = <0xff150000 0x1000>;
+               interrupts = <GIC_SPI 63 IRQ_TYPE_LEVEL_HIGH>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+               clock-names = "i2c";
+               clocks = <&cru PCLK_I2C3>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&i2c3_xfer>;
+               status = "disabled";
+       };
+
+       i2c4: i2c@ff160000 {
+               compatible = "rockchip,rk3288-i2c";
+               reg = <0xff160000 0x1000>;
+               interrupts = <GIC_SPI 64 IRQ_TYPE_LEVEL_HIGH>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+               clock-names = "i2c";
+               clocks = <&cru PCLK_I2C4>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&i2c4_xfer>;
+               status = "disabled";
+       };
+
+       i2c5: i2c@ff170000 {
+               compatible = "rockchip,rk3288-i2c";
+               reg = <0xff170000 0x1000>;
+               interrupts = <GIC_SPI 65 IRQ_TYPE_LEVEL_HIGH>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+               clock-names = "i2c";
+               clocks = <&cru PCLK_I2C5>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&i2c5_xfer>;
+               status = "disabled";
+       };
+
+       uart0: serial@ff180000 {
+               compatible = "rockchip,rk3288-uart", "snps,dw-apb-uart";
+               reg = <0xff180000 0x100>;
+               interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>;
+               reg-shift = <2>;
+               reg-io-width = <4>;
+               clocks = <&cru SCLK_UART0>, <&cru PCLK_UART0>;
+               clock-names = "baudclk", "apb_pclk";
+               pinctrl-names = "default";
+               pinctrl-0 = <&uart0_xfer>;
+               status = "disabled";
+       };
+
+       uart1: serial@ff190000 {
+               compatible = "rockchip,rk3288-uart", "snps,dw-apb-uart";
+               reg = <0xff190000 0x100>;
+               interrupts = <GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>;
+               reg-shift = <2>;
+               reg-io-width = <4>;
+               clocks = <&cru SCLK_UART1>, <&cru PCLK_UART1>;
+               clock-names = "baudclk", "apb_pclk";
+               pinctrl-names = "default";
+               pinctrl-0 = <&uart1_xfer>;
+               status = "disabled";
+       };
+
+       uart2: serial@ff690000 {
+               compatible = "rockchip,rk3288-uart", "snps,dw-apb-uart";
+               reg = <0xff690000 0x100>;
+               interrupts = <GIC_SPI 57 IRQ_TYPE_LEVEL_HIGH>;
+               reg-shift = <2>;
+               reg-io-width = <4>;
+               clocks = <&cru SCLK_UART2>, <&cru PCLK_UART2>;
+               clock-names = "baudclk", "apb_pclk";
+               pinctrl-names = "default";
+               pinctrl-0 = <&uart2_xfer>;
+               status = "disabled";
+       };
+
+       uart3: serial@ff1b0000 {
+               compatible = "rockchip,rk3288-uart", "snps,dw-apb-uart";
+               reg = <0xff1b0000 0x100>;
+               interrupts = <GIC_SPI 58 IRQ_TYPE_LEVEL_HIGH>;
+               reg-shift = <2>;
+               reg-io-width = <4>;
+               clocks = <&cru SCLK_UART3>, <&cru PCLK_UART3>;
+               clock-names = "baudclk", "apb_pclk";
+               pinctrl-names = "default";
+               pinctrl-0 = <&uart3_xfer>;
+               status = "disabled";
+       };
+
+       uart4: serial@ff1c0000 {
+               compatible = "rockchip,rk3288-uart", "snps,dw-apb-uart";
+               reg = <0xff1c0000 0x100>;
+               interrupts = <GIC_SPI 59 IRQ_TYPE_LEVEL_HIGH>;
+               reg-shift = <2>;
+               reg-io-width = <4>;
+               clocks = <&cru SCLK_UART4>, <&cru PCLK_UART4>;
+               clock-names = "baudclk", "apb_pclk";
+               pinctrl-names = "default";
+               pinctrl-0 = <&uart4_xfer>;
+               status = "disabled";
+       };
+
+       i2c0: i2c@ff650000 {
+               compatible = "rockchip,rk3288-i2c";
+               reg = <0xff650000 0x1000>;
+               interrupts = <GIC_SPI 60 IRQ_TYPE_LEVEL_HIGH>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+               clock-names = "i2c";
+               clocks = <&cru PCLK_I2C0>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&i2c0_xfer>;
+               status = "disabled";
+       };
+
+       i2c2: i2c@ff660000 {
+               compatible = "rockchip,rk3288-i2c";
+               reg = <0xff660000 0x1000>;
+               interrupts = <GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+               clock-names = "i2c";
+               clocks = <&cru PCLK_I2C2>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&i2c2_xfer>;
+               status = "disabled";
+       };
+
+       pmu: power-management@ff730000 {
+               compatible = "rockchip,rk3288-pmu", "syscon";
+               reg = <0xff730000 0x100>;
+       };
+
+       sgrf: syscon@ff740000 {
+               compatible = "rockchip,rk3288-sgrf", "syscon";
+               reg = <0xff740000 0x1000>;
+       };
+
+       cru: clock-controller@ff760000 {
+               compatible = "rockchip,rk3288-cru";
+               reg = <0xff760000 0x1000>;
+               rockchip,grf = <&grf>;
+               #clock-cells = <1>;
+               #reset-cells = <1>;
+       };
+
+       grf: syscon@ff770000 {
+               compatible = "rockchip,rk3288-grf", "syscon";
+               reg = <0xff770000 0x1000>;
+       };
+
+       wdt: watchdog@ff800000 {
+               compatible = "rockchip,rk3288-wdt", "snps,dw-wdt";
+               reg = <0xff800000 0x100>;
+               interrupts = <GIC_SPI 111 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+       };
+
+       usb_host0_ehci: usb@ff500000 {
+               compatible = "generic-ehci";
+               reg = <0xff500000 0x100>;
+               interrupts = <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&cru HCLK_USBHOST0>;
+               clock-names = "usbhost";
+               status = "disabled";
+       };
+
+       /* NOTE: ohci@ff520000 doesn't actually work on hardware */
+
+       usb_hsic: usb@ff5c0000 {
+               compatible = "generic-ehci";
+               reg = <0xff5c0000 0x100>;
+               interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&cru HCLK_HSIC>;
+               clock-names = "usbhost";
+               status = "disabled";
+       };
+
+       gic: interrupt-controller@ffc01000 {
+               compatible = "arm,gic-400";
+               interrupt-controller;
+               #interrupt-cells = <3>;
+               #address-cells = <0>;
+
+               reg = <0xffc01000 0x1000>,
+                     <0xffc02000 0x1000>,
+                     <0xffc04000 0x2000>,
+                     <0xffc06000 0x2000>;
+               interrupts = <GIC_PPI 9 0xf04>;
+       };
+
+       pinctrl: pinctrl {
+               compatible = "rockchip,rk3288-pinctrl";
+               rockchip,grf = <&grf>;
+               rockchip,pmu = <&pmu>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges;
+
+               gpio0: gpio0@ff750000 {
+                       compatible = "rockchip,gpio-bank";
+                       reg =   <0xff750000 0x100>;
+                       interrupts = <GIC_SPI 81 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cru PCLK_GPIO0>;
+
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
+
+               gpio1: gpio1@ff780000 {
+                       compatible = "rockchip,gpio-bank";
+                       reg = <0xff780000 0x100>;
+                       interrupts = <GIC_SPI 82 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cru PCLK_GPIO1>;
+
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
+
+               gpio2: gpio2@ff790000 {
+                       compatible = "rockchip,gpio-bank";
+                       reg = <0xff790000 0x100>;
+                       interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cru PCLK_GPIO2>;
+
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
+
+               gpio3: gpio3@ff7a0000 {
+                       compatible = "rockchip,gpio-bank";
+                       reg = <0xff7a0000 0x100>;
+                       interrupts = <GIC_SPI 84 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cru PCLK_GPIO3>;
+
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
+
+               gpio4: gpio4@ff7b0000 {
+                       compatible = "rockchip,gpio-bank";
+                       reg = <0xff7b0000 0x100>;
+                       interrupts = <GIC_SPI 85 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cru PCLK_GPIO4>;
+
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
+
+               gpio5: gpio5@ff7c0000 {
+                       compatible = "rockchip,gpio-bank";
+                       reg = <0xff7c0000 0x100>;
+                       interrupts = <GIC_SPI 86 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cru PCLK_GPIO5>;
+
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
+
+               gpio6: gpio6@ff7d0000 {
+                       compatible = "rockchip,gpio-bank";
+                       reg = <0xff7d0000 0x100>;
+                       interrupts = <GIC_SPI 87 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cru PCLK_GPIO6>;
+
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
+
+               gpio7: gpio7@ff7e0000 {
+                       compatible = "rockchip,gpio-bank";
+                       reg = <0xff7e0000 0x100>;
+                       interrupts = <GIC_SPI 88 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cru PCLK_GPIO7>;
+
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
+
+               gpio8: gpio8@ff7f0000 {
+                       compatible = "rockchip,gpio-bank";
+                       reg = <0xff7f0000 0x100>;
+                       interrupts = <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cru PCLK_GPIO8>;
+
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
+
+               pcfg_pull_up: pcfg-pull-up {
+                       bias-pull-up;
+               };
+
+               pcfg_pull_down: pcfg-pull-down {
+                       bias-pull-down;
+               };
+
+               pcfg_pull_none: pcfg-pull-none {
+                       bias-disable;
+               };
+
+               i2c0 {
+                       i2c0_xfer: i2c0-xfer {
+                               rockchip,pins = <0 15 RK_FUNC_1 &pcfg_pull_none>,
+                                               <0 16 RK_FUNC_1 &pcfg_pull_none>;
+                       };
+               };
+
+               i2c1 {
+                       i2c1_xfer: i2c1-xfer {
+                               rockchip,pins = <8 4 RK_FUNC_1 &pcfg_pull_none>,
+                                               <8 5 RK_FUNC_1 &pcfg_pull_none>;
+                       };
+               };
+
+               i2c2 {
+                       i2c2_xfer: i2c2-xfer {
+                               rockchip,pins = <6 9 RK_FUNC_1 &pcfg_pull_none>,
+                                               <6 10 RK_FUNC_1 &pcfg_pull_none>;
+                       };
+               };
+
+               i2c3 {
+                       i2c3_xfer: i2c3-xfer {
+                               rockchip,pins = <2 16 RK_FUNC_1 &pcfg_pull_none>,
+                                               <2 17 RK_FUNC_1 &pcfg_pull_none>;
+                       };
+               };
+
+               i2c4 {
+                       i2c4_xfer: i2c4-xfer {
+                               rockchip,pins = <7 17 RK_FUNC_1 &pcfg_pull_none>,
+                                               <7 18 RK_FUNC_1 &pcfg_pull_none>;
+                       };
+               };
+
+               i2c5 {
+                       i2c5_xfer: i2c5-xfer {
+                               rockchip,pins = <7 19 RK_FUNC_1 &pcfg_pull_none>,
+                                               <7 20 RK_FUNC_1 &pcfg_pull_none>;
+                       };
+               };
+
+               sdmmc {
+                       sdmmc_clk: sdmmc-clk {
+                               rockchip,pins = <6 20 RK_FUNC_1 &pcfg_pull_none>;
+                       };
+
+                       sdmmc_cmd: sdmmc-cmd {
+                               rockchip,pins = <6 21 RK_FUNC_1 &pcfg_pull_up>;
+                       };
+
+                       sdmmc_cd: sdmcc-cd {
+                               rockchip,pins = <6 22 RK_FUNC_1 &pcfg_pull_up>;
+                       };
+
+                       sdmmc_bus1: sdmmc-bus1 {
+                               rockchip,pins = <6 16 RK_FUNC_1 &pcfg_pull_up>;
+                       };
+
+                       sdmmc_bus4: sdmmc-bus4 {
+                               rockchip,pins = <6 16 RK_FUNC_1 &pcfg_pull_up>,
+                                               <6 17 RK_FUNC_1 &pcfg_pull_up>,
+                                               <6 18 RK_FUNC_1 &pcfg_pull_up>,
+                                               <6 19 RK_FUNC_1 &pcfg_pull_up>;
+                       };
+               };
+
+               emmc {
+                       emmc_clk: emmc-clk {
+                               rockchip,pins = <3 18 RK_FUNC_2 &pcfg_pull_none>;
+                       };
+
+                       emmc_cmd: emmc-cmd {
+                               rockchip,pins = <3 16 RK_FUNC_2 &pcfg_pull_up>;
+                       };
+
+                       emmc_pwr: emmc-pwr {
+                               rockchip,pins = <3 9 RK_FUNC_2 &pcfg_pull_up>;
+                       };
+
+                       emmc_bus1: emmc-bus1 {
+                               rockchip,pins = <3 0 RK_FUNC_2 &pcfg_pull_up>;
+                       };
+
+                       emmc_bus4: emmc-bus4 {
+                               rockchip,pins = <3 0 RK_FUNC_2 &pcfg_pull_up>,
+                                               <3 1 RK_FUNC_2 &pcfg_pull_up>,
+                                               <3 2 RK_FUNC_2 &pcfg_pull_up>,
+                                               <3 3 RK_FUNC_2 &pcfg_pull_up>;
+                       };
+
+                       emmc_bus8: emmc-bus8 {
+                               rockchip,pins = <3 0 RK_FUNC_2 &pcfg_pull_up>,
+                                               <3 1 RK_FUNC_2 &pcfg_pull_up>,
+                                               <3 2 RK_FUNC_2 &pcfg_pull_up>,
+                                               <3 3 RK_FUNC_2 &pcfg_pull_up>,
+                                               <3 4 RK_FUNC_2 &pcfg_pull_up>,
+                                               <3 5 RK_FUNC_2 &pcfg_pull_up>,
+                                               <3 6 RK_FUNC_2 &pcfg_pull_up>,
+                                               <3 7 RK_FUNC_2 &pcfg_pull_up>;
+                       };
+               };
+
+               uart0 {
+                       uart0_xfer: uart0-xfer {
+                               rockchip,pins = <4 16 RK_FUNC_1 &pcfg_pull_up>,
+                                               <4 17 RK_FUNC_1 &pcfg_pull_none>;
+                       };
+
+                       uart0_cts: uart0-cts {
+                               rockchip,pins = <4 18 RK_FUNC_1 &pcfg_pull_none>;
+                       };
+
+                       uart0_rts: uart0-rts {
+                               rockchip,pins = <4 19 RK_FUNC_1 &pcfg_pull_none>;
+                       };
+               };
+
+               uart1 {
+                       uart1_xfer: uart1-xfer {
+                               rockchip,pins = <5 8 RK_FUNC_1 &pcfg_pull_up>,
+                                               <5 9 RK_FUNC_1 &pcfg_pull_none>;
+                       };
+
+                       uart1_cts: uart1-cts {
+                               rockchip,pins = <5 10 RK_FUNC_1 &pcfg_pull_none>;
+                       };
+
+                       uart1_rts: uart1-rts {
+                               rockchip,pins = <5 11 RK_FUNC_1 &pcfg_pull_none>;
+                       };
+               };
+
+               uart2 {
+                       uart2_xfer: uart2-xfer {
+                               rockchip,pins = <7 22 RK_FUNC_1 &pcfg_pull_up>,
+                                               <7 23 RK_FUNC_1 &pcfg_pull_none>;
+                       };
+                       /* no rts / cts for uart2 */
+               };
+
+               uart3 {
+                       uart3_xfer: uart3-xfer {
+                               rockchip,pins = <7 7 RK_FUNC_1 &pcfg_pull_up>,
+                                               <7 8 RK_FUNC_1 &pcfg_pull_none>;
+                       };
+
+                       uart3_cts: uart3-cts {
+                               rockchip,pins = <7 9 RK_FUNC_1 &pcfg_pull_none>;
+                       };
+
+                       uart3_rts: uart3-rts {
+                               rockchip,pins = <7 10 RK_FUNC_1 &pcfg_pull_none>;
+                       };
+               };
+
+               uart4 {
+                       uart4_xfer: uart4-xfer {
+                               rockchip,pins = <5 12 3 &pcfg_pull_up>,
+                                               <5 13 3 &pcfg_pull_none>;
+                       };
+
+                       uart4_cts: uart4-cts {
+                               rockchip,pins = <5 14 3 &pcfg_pull_none>;
+                       };
+
+                       uart4_rts: uart4-rts {
+                               rockchip,pins = <5 15 3 &pcfg_pull_none>;
+                       };
+               };
+       };
+};
index 2adf1cc9e85df4478c5ed329911dd613356d97f9..8caf85d839019ab1ed47690cf9bb4597de71b2f2 100644 (file)
 / {
        interrupt-parent = <&gic>;
 
-       soc {
+       aliases {
+               i2c0 = &i2c0;
+               i2c1 = &i2c1;
+               i2c2 = &i2c2;
+               i2c3 = &i2c3;
+               i2c4 = &i2c4;
+       };
+
+       xin24m: oscillator {
+               compatible = "fixed-clock";
+               clock-frequency = <24000000>;
+               #clock-cells = <0>;
+               clock-output-names = "xin24m";
+       };
+
+       L2: l2-cache-controller@10138000 {
+               compatible = "arm,pl310-cache";
+               reg = <0x10138000 0x1000>;
+               cache-unified;
+               cache-level = <2>;
+       };
+
+       scu@1013c000 {
+               compatible = "arm,cortex-a9-scu";
+               reg = <0x1013c000 0x100>;
+       };
+
+       global_timer: global-timer@1013c200 {
+               compatible = "arm,cortex-a9-global-timer";
+               reg = <0x1013c200 0x20>;
+               interrupts = <GIC_PPI 11 0x304>;
+               clocks = <&cru CORE_PERI>;
+       };
+
+       local_timer: local-timer@1013c600 {
+               compatible = "arm,cortex-a9-twd-timer";
+               reg = <0x1013c600 0x20>;
+               interrupts = <GIC_PPI 13 0x304>;
+               clocks = <&cru CORE_PERI>;
+       };
+
+       gic: interrupt-controller@1013d000 {
+               compatible = "arm,cortex-a9-gic";
+               interrupt-controller;
+               #interrupt-cells = <3>;
+               reg = <0x1013d000 0x1000>,
+                     <0x1013c100 0x0100>;
+       };
+
+       uart0: serial@10124000 {
+               compatible = "snps,dw-apb-uart";
+               reg = <0x10124000 0x400>;
+               interrupts = <GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>;
+               reg-shift = <2>;
+               reg-io-width = <1>;
+               clock-names = "baudclk", "apb_pclk";
+               clocks = <&cru SCLK_UART0>, <&cru PCLK_UART0>;
+               status = "disabled";
+       };
+
+       uart1: serial@10126000 {
+               compatible = "snps,dw-apb-uart";
+               reg = <0x10126000 0x400>;
+               interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>;
+               reg-shift = <2>;
+               reg-io-width = <1>;
+               clock-names = "baudclk", "apb_pclk";
+               clocks = <&cru SCLK_UART1>, <&cru PCLK_UART1>;
+               status = "disabled";
+       };
+
+       mmc0: dwmmc@10214000 {
+               compatible = "rockchip,rk2928-dw-mshc";
+               reg = <0x10214000 0x1000>;
+               interrupts = <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>;
                #address-cells = <1>;
-               #size-cells = <1>;
-               compatible = "simple-bus";
-               ranges;
-
-               scu@1013c000 {
-                       compatible = "arm,cortex-a9-scu";
-                       reg = <0x1013c000 0x100>;
-               };
-
-               pmu: pmu@20004000 {
-                       compatible = "rockchip,rk3066-pmu", "syscon";
-                       reg = <0x20004000 0x100>;
-               };
-
-               grf: grf@20008000 {
-                       compatible = "syscon";
-                       reg = <0x20008000 0x200>;
-               };
-
-               gic: interrupt-controller@1013d000 {
-                       compatible = "arm,cortex-a9-gic";
-                       interrupt-controller;
-                       #interrupt-cells = <3>;
-                       reg = <0x1013d000 0x1000>,
-                             <0x1013c100 0x0100>;
-               };
-
-               L2: l2-cache-controller@10138000 {
-                       compatible = "arm,pl310-cache";
-                       reg = <0x10138000 0x1000>;
-                       cache-unified;
-                       cache-level = <2>;
-               };
-
-               global-timer@1013c200 {
-                       compatible = "arm,cortex-a9-global-timer";
-                       reg = <0x1013c200 0x20>;
-                       interrupts = <GIC_PPI 11 0x304>;
-                       clocks = <&dummy150m>;
-               };
-
-               local-timer@1013c600 {
-                       compatible = "arm,cortex-a9-twd-timer";
-                       reg = <0x1013c600 0x20>;
-                       interrupts = <GIC_PPI 13 0x304>;
-                       clocks = <&dummy150m>;
-               };
-
-               uart0: serial@10124000 {
-                       compatible = "snps,dw-apb-uart";
-                       reg = <0x10124000 0x400>;
-                       interrupts = <GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>;
-                       reg-shift = <2>;
-                       reg-io-width = <1>;
-                       clocks = <&clk_gates1 8>;
-                       status = "disabled";
-               };
-
-               uart1: serial@10126000 {
-                       compatible = "snps,dw-apb-uart";
-                       reg = <0x10126000 0x400>;
-                       interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>;
-                       reg-shift = <2>;
-                       reg-io-width = <1>;
-                       clocks = <&clk_gates1 10>;
-                       status = "disabled";
-               };
-
-               uart2: serial@20064000 {
-                       compatible = "snps,dw-apb-uart";
-                       reg = <0x20064000 0x400>;
-                       interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
-                       reg-shift = <2>;
-                       reg-io-width = <1>;
-                       clocks = <&clk_gates1 12>;
-                       status = "disabled";
-               };
-
-               uart3: serial@20068000 {
-                       compatible = "snps,dw-apb-uart";
-                       reg = <0x20068000 0x400>;
-                       interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>;
-                       reg-shift = <2>;
-                       reg-io-width = <1>;
-                       clocks = <&clk_gates1 14>;
-                       status = "disabled";
-               };
-
-               dwmmc@10214000 {
-                       compatible = "rockchip,rk2928-dw-mshc";
-                       reg = <0x10214000 0x1000>;
-                       interrupts = <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>;
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-
-                       clocks = <&clk_gates5 10>, <&clk_gates2 11>;
-                       clock-names = "biu", "ciu";
-
-                       status = "disabled";
-               };
-
-               dwmmc@10218000 {
-                       compatible = "rockchip,rk2928-dw-mshc";
-                       reg = <0x10218000 0x1000>;
-                       interrupts = <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>;
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-
-                       clocks = <&clk_gates5 11>, <&clk_gates2 13>;
-                       clock-names = "biu", "ciu";
-
-                       status = "disabled";
-               };
+               #size-cells = <0>;
+
+               clocks = <&cru HCLK_SDMMC>, <&cru SCLK_SDMMC>;
+               clock-names = "biu", "ciu";
+
+               status = "disabled";
+       };
+
+       mmc1: dwmmc@10218000 {
+               compatible = "rockchip,rk2928-dw-mshc";
+               reg = <0x10218000 0x1000>;
+               interrupts = <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               clocks = <&cru HCLK_SDIO>, <&cru SCLK_SDIO>;
+               clock-names = "biu", "ciu";
+
+               status = "disabled";
+       };
+
+       pmu: pmu@20004000 {
+               compatible = "rockchip,rk3066-pmu", "syscon";
+               reg = <0x20004000 0x100>;
+       };
+
+       grf: grf@20008000 {
+               compatible = "syscon";
+               reg = <0x20008000 0x200>;
+       };
+
+       i2c0: i2c@2002d000 {
+               compatible = "rockchip,rk3066-i2c";
+               reg = <0x2002d000 0x1000>;
+               interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               rockchip,grf = <&grf>;
+               rockchip,bus-index = <0>;
+
+               clock-names = "i2c";
+               clocks = <&cru PCLK_I2C0>;
+
+               status = "disabled";
+       };
+
+       i2c1: i2c@2002f000 {
+               compatible = "rockchip,rk3066-i2c";
+               reg = <0x2002f000 0x1000>;
+               interrupts = <GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               rockchip,grf = <&grf>;
+
+               clocks = <&cru PCLK_I2C1>;
+               clock-names = "i2c";
+
+               status = "disabled";
+       };
+
+       pwm0: pwm@20030000 {
+               compatible = "rockchip,rk2928-pwm";
+               reg = <0x20030000 0x10>;
+               #pwm-cells = <2>;
+               clocks = <&cru PCLK_PWM01>;
+               status = "disabled";
+       };
+
+       pwm1: pwm@20030010 {
+               compatible = "rockchip,rk2928-pwm";
+               reg = <0x20030010 0x10>;
+               #pwm-cells = <2>;
+               clocks = <&cru PCLK_PWM01>;
+               status = "disabled";
+       };
+
+       wdt: watchdog@2004c000 {
+               compatible = "snps,dw-wdt";
+               reg = <0x2004c000 0x100>;
+               clocks = <&cru PCLK_WDT>;
+               interrupts = <GIC_SPI 51 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+       };
+
+       pwm2: pwm@20050020 {
+               compatible = "rockchip,rk2928-pwm";
+               reg = <0x20050020 0x10>;
+               #pwm-cells = <2>;
+               clocks = <&cru PCLK_PWM23>;
+               status = "disabled";
+       };
+
+       pwm3: pwm@20050030 {
+               compatible = "rockchip,rk2928-pwm";
+               reg = <0x20050030 0x10>;
+               #pwm-cells = <2>;
+               clocks = <&cru PCLK_PWM23>;
+               status = "disabled";
+       };
+
+       i2c2: i2c@20056000 {
+               compatible = "rockchip,rk3066-i2c";
+               reg = <0x20056000 0x1000>;
+               interrupts = <GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               rockchip,grf = <&grf>;
+
+               clocks = <&cru PCLK_I2C2>;
+               clock-names = "i2c";
+
+               status = "disabled";
+       };
+
+       i2c3: i2c@2005a000 {
+               compatible = "rockchip,rk3066-i2c";
+               reg = <0x2005a000 0x1000>;
+               interrupts = <GIC_SPI 43 IRQ_TYPE_LEVEL_HIGH>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               rockchip,grf = <&grf>;
+
+               clocks = <&cru PCLK_I2C3>;
+               clock-names = "i2c";
+
+               status = "disabled";
+       };
+
+       i2c4: i2c@2005e000 {
+               compatible = "rockchip,rk3066-i2c";
+               reg = <0x2005e000 0x1000>;
+               interrupts = <GIC_SPI 52 IRQ_TYPE_LEVEL_HIGH>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               rockchip,grf = <&grf>;
+
+               clocks = <&cru PCLK_I2C4>;
+               clock-names = "i2c";
+
+               status = "disabled";
+       };
+
+       uart2: serial@20064000 {
+               compatible = "snps,dw-apb-uart";
+               reg = <0x20064000 0x400>;
+               interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
+               reg-shift = <2>;
+               reg-io-width = <1>;
+               clock-names = "baudclk", "apb_pclk";
+               clocks = <&cru SCLK_UART2>, <&cru PCLK_UART2>;
+               status = "disabled";
+       };
+
+       uart3: serial@20068000 {
+               compatible = "snps,dw-apb-uart";
+               reg = <0x20068000 0x400>;
+               interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>;
+               reg-shift = <2>;
+               reg-io-width = <1>;
+               clock-names = "baudclk", "apb_pclk";
+               clocks = <&cru SCLK_UART3>, <&cru PCLK_UART3>;
+               status = "disabled";
        };
 };
diff --git a/arch/arm/boot/dts/s5pv210-aquila.dts b/arch/arm/boot/dts/s5pv210-aquila.dts
new file mode 100644 (file)
index 0000000..aa31b84
--- /dev/null
@@ -0,0 +1,392 @@
+/*
+ * Samsung's S5PV210 SoC device tree source
+ *
+ * Copyright (c) 2013-2014 Samsung Electronics, Co. Ltd.
+ *
+ * Mateusz Krawczuk <m.krawczuk@partner.samsung.com>
+ * Tomasz Figa <t.figa@samsung.com>
+ *
+ * Board device tree source for Samsung Aquila board.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+/dts-v1/;
+#include <dt-bindings/input/input.h>
+#include "s5pv210.dtsi"
+
+/ {
+       model = "Samsung Aquila based on S5PC110";
+       compatible = "samsung,aquila", "samsung,s5pv210";
+
+       aliases {
+               i2c3 = &i2c_pmic;
+       };
+
+       chosen {
+               bootargs = "console=ttySAC2,115200n8 root=/dev/mmcblk1p5 rw rootwait ignore_loglevel earlyprintk";
+       };
+
+       memory {
+               device_type = "memory";
+               reg = <0x30000000 0x05000000
+                       0x40000000 0x18000000>;
+       };
+
+       regulators {
+               compatible = "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               vtf_reg: fixed-regulator@0 {
+                       compatible = "regulator-fixed";
+                       reg = <0>;
+                       regulator-name = "V_TF_2.8V";
+                       regulator-min-microvolt = <2800000>;
+                       regulator-max-microvolt = <2800000>;
+                       gpios = <&mp05 4 0>;
+                       enable-active-high;
+               };
+
+               pda_reg: fixed-regulator@1 {
+                       compatible = "regulator-fixed";
+                       regulator-name = "VCC_1.8V_PDA";
+                       regulator-min-microvolt = <1800000>;
+                       regulator-max-microvolt = <1800000>;
+                       reg = <1>;
+               };
+
+               bat_reg: fixed-regulator@2 {
+                       compatible = "regulator-fixed";
+                       regulator-name = "V_BAT";
+                       regulator-min-microvolt = <3700000>;
+                       regulator-max-microvolt = <3700000>;
+                       reg = <2>;
+               };
+       };
+
+       i2c_pmic: i2c-pmic {
+               compatible = "i2c-gpio";
+               gpios = <&gpj4 0 0>, /* sda */
+                       <&gpj4 3 0>; /* scl */
+               i2c-gpio,delay-us = <2>;        /* ~100 kHz */
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               pmic@66 {
+                       compatible = "national,lp3974";
+                       reg = <0x66>;
+
+                       max8998,pmic-buck1-default-dvs-idx = <0>;
+                       max8998,pmic-buck1-dvs-gpios = <&gph0 3 0>,
+                                                       <&gph0 4 0>;
+                       max8998,pmic-buck1-dvs-voltage = <1200000>, <1200000>,
+                                                       <1200000>, <1200000>;
+
+                       max8998,pmic-buck2-default-dvs-idx = <0>;
+                       max8998,pmic-buck2-dvs-gpio = <&gph0 5 0>;
+                       max8998,pmic-buck2-dvs-voltage = <1200000>, <1200000>;
+
+                       regulators {
+                               ldo2_reg: LDO2 {
+                                       regulator-name = "VALIVE_1.1V";
+                                       regulator-min-microvolt = <1100000>;
+                                       regulator-max-microvolt = <1100000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo3_reg: LDO3 {
+                                       regulator-name = "VUSB+MIPI_1.1V";
+                                       regulator-min-microvolt = <1100000>;
+                                       regulator-max-microvolt = <1100000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo4_reg: LDO4 {
+                                       regulator-name = "VADC_3.3V";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                               };
+
+                               ldo5_reg: LDO5 {
+                                       regulator-name = "VTF_2.8V";
+                                       regulator-min-microvolt = <2800000>;
+                                       regulator-max-microvolt = <2800000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo6_reg: LDO6 {
+                                       regulator-name = "VCC_3.3V";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo7_reg: LDO7 {
+                                       regulator-name = "VCC_3.0V";
+                                       regulator-min-microvolt = <3000000>;
+                                       regulator-max-microvolt = <3000000>;
+                                       regulator-always-on;
+                                       regulator-boot-on;
+                               };
+
+                               ldo8_reg: LDO8 {
+                                       regulator-name = "VUSB+VDAC_3.3V";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo9_reg: LDO9 {
+                                       regulator-name = "VCC+VCAM_2.8V";
+                                       regulator-min-microvolt = <2800000>;
+                                       regulator-max-microvolt = <2800000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo10_reg: LDO10 {
+                                       regulator-name = "VPLL_1.1V";
+                                       regulator-min-microvolt = <1100000>;
+                                       regulator-max-microvolt = <1100000>;
+                                       regulator-always-on;
+                                       regulator-boot-on;
+                               };
+
+                               ldo11_reg: LDO11 {
+                                       regulator-name = "CAM_IO_2.8V";
+                                       regulator-min-microvolt = <2800000>;
+                                       regulator-max-microvolt = <2800000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo12_reg: LDO12 {
+                                       regulator-name = "CAM_ISP_1.2V";
+                                       regulator-min-microvolt = <1200000>;
+                                       regulator-max-microvolt = <1200000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo13_reg: LDO13 {
+                                       regulator-name = "CAM_A_2.8V";
+                                       regulator-min-microvolt = <2800000>;
+                                       regulator-max-microvolt = <2800000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo14_reg: LDO14 {
+                                       regulator-name = "CAM_CIF_1.8V";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo15_reg: LDO15 {
+                                       regulator-name = "CAM_AF_3.3V";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo16_reg: LDO16 {
+                                       regulator-name = "VMIPI_1.8V";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo17_reg: LDO17 {
+                                       regulator-name = "CAM_8M_1.8V";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                                       regulator-always-on;
+                               };
+
+                               buck1_reg: BUCK1 {
+                                       regulator-name = "VARM_1.2V";
+                                       regulator-min-microvolt = <1200000>;
+                                       regulator-max-microvolt = <1200000>;
+                                       regulator-always-on;
+                               };
+
+                               buck2_reg: BUCK2 {
+                                       regulator-name = "VINT_1.2V";
+                                       regulator-min-microvolt = <1200000>;
+                                       regulator-max-microvolt = <1200000>;
+                                       regulator-always-on;
+                               };
+
+                               buck3_reg: BUCK3 {
+                                       regulator-name = "VCC_1.8V";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                                       regulator-always-on;
+                               };
+
+                               buck4_reg: BUCK4 {
+                                       regulator-name = "CAM_CORE_1.2V";
+                                       regulator-min-microvolt = <1200000>;
+                                       regulator-max-microvolt = <1200000>;
+                                       regulator-always-on;
+                               };
+
+                               vichg_reg: ENVICHG {
+                                       regulator-name = "VICHG";
+                               };
+
+                               safeout1_reg: ESAFEOUT1 {
+                                       regulator-name = "SAFEOUT1";
+                                       regulator-always-on;
+                               };
+
+                               safeout2_reg: ESAFEOUT2 {
+                                       regulator-name = "SAFEOUT2";
+                                       regulator-boot-on;
+                               };
+                       };
+               };
+
+       };
+
+       gpio-keys {
+               compatible = "gpio-keys";
+
+               power-key {
+                       gpios = <&gph2 6 1>;
+                       linux,code = <KEY_POWER>;
+                       label = "power";
+                       debounce-interval = <1>;
+                       gpio-key,wakeup;
+               };
+       };
+};
+
+&xusbxti {
+       clock-frequency = <24000000>;
+};
+
+&keypad {
+       linux,input-no-autorepeat;
+       linux,input-wakeup;
+       samsung,keypad-num-rows = <3>;
+       samsung,keypad-num-columns = <3>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&keypad_row0>, <&keypad_row1>, <&keypad_row2>,
+                       <&keypad_col0>, <&keypad_col1>, <&keypad_col2>;
+       status = "okay";
+
+       key_1 {
+               keypad,row = <0>;
+               keypad,column = <1>;
+               linux,code = <KEY_CONNECT>;
+       };
+
+       key_2 {
+               keypad,row = <0>;
+               keypad,column = <2>;
+               linux,code = <KEY_BACK>;
+       };
+
+       key_3 {
+               keypad,row = <1>;
+               keypad,column = <1>;
+               linux,code = <KEY_CAMERA_FOCUS>;
+       };
+
+       key_4 {
+               keypad,row = <1>;
+               keypad,column = <2>;
+               linux,code = <KEY_VOLUMEUP>;
+       };
+
+       key_5 {
+               keypad,row = <2>;
+               keypad,column = <1>;
+               linux,code = <KEY_CAMERA>;
+       };
+
+       key_6 {
+               keypad,row = <2>;
+               keypad,column = <2>;
+               linux,code = <KEY_VOLUMEDOWN>;
+       };
+};
+
+&uart0 {
+       status = "okay";
+};
+
+&uart1 {
+       status = "okay";
+};
+
+&uart2 {
+       status = "okay";
+};
+
+&uart3 {
+       status = "okay";
+};
+
+&sdhci0 {
+       bus-width = <4>;
+       non-removable;
+       status = "okay";
+       vmmc-supply = <&ldo5_reg>;
+       pinctrl-0 = <&sd0_clk &sd0_cmd &sd0_bus4>;
+       pinctrl-names = "default";
+};
+
+&sdhci2 {
+       bus-width = <4>;
+       cd-gpios = <&gph3 4 1>;
+       vmmc-supply = <&vtf_reg>;
+       cd-inverted;
+       pinctrl-0 = <&sd2_clk &sd2_cmd &sd2_bus4 &t_flash_detect>;
+       pinctrl-names = "default";
+       status = "okay";
+};
+
+&onenand {
+       status = "okay";
+};
+
+&hsotg {
+       vusb_a-supply = <&ldo3_reg>;
+       vusb_d-supply = <&ldo8_reg>;
+       status = "okay";
+};
+
+&usbphy {
+       status = "okay";
+};
+
+&fimd {
+       pinctrl-0 = <&lcd_clk &lcd_data24 &pwm1_out>;
+       pinctrl-names = "default";
+       status = "okay";
+
+       display-timings {
+               native-mode = <&timing0>;
+               timing0: timing {
+                       clock-frequency = <0>;
+                       hactive = <800>;
+                       vactive = <480>;
+                       hfront-porch = <16>;
+                       hback-porch = <16>;
+                       hsync-len = <2>;
+                       vback-porch = <3>;
+                       vfront-porch = <28>;
+                       vsync-len = <1>;
+               };
+       };
+};
+
+&pinctrl0 {
+       t_flash_detect: t-flash-detect {
+               samsung,pins = "gph3-4";
+               samsung,pin-function = <0>;
+               samsung,pin-pud = <0>;
+       };
+};
diff --git a/arch/arm/boot/dts/s5pv210-goni.dts b/arch/arm/boot/dts/s5pv210-goni.dts
new file mode 100644 (file)
index 0000000..6387c77
--- /dev/null
@@ -0,0 +1,449 @@
+/*
+ * Samsung's S5PV210 SoC device tree source
+ *
+ * Copyright (c) 2013-2014 Samsung Electronics, Co. Ltd.
+ *
+ * Mateusz Krawczuk <m.krawczuk@partner.samsung.com>
+ * Tomasz Figa <t.figa@samsung.com>
+ *
+ * Board device tree source for Samsung Goni board.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+/dts-v1/;
+#include <dt-bindings/input/input.h>
+#include "s5pv210.dtsi"
+
+/ {
+       model = "Samsung Goni based on S5PC110";
+       compatible = "samsung,goni", "samsung,s5pv210";
+
+       aliases {
+               i2c3 = &i2c_pmic;
+       };
+
+       chosen {
+               bootargs = "console=ttySAC0,115200n8 root=/dev/mmcblk0p5 rw rootwait ignore_loglevel earlyprintk";
+       };
+
+       memory {
+               device_type = "memory";
+               reg = <0x30000000 0x05000000
+                       0x40000000 0x10000000
+                       0x50000000 0x08000000>;
+       };
+
+       regulators {
+               compatible = "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               vtf_reg: fixed-regulator@0 {
+                       compatible = "regulator-fixed";
+                       regulator-name = "V_TF_2.8V";
+                       regulator-min-microvolt = <2800000>;
+                       regulator-max-microvolt = <2800000>;
+                       reg = <0>;
+                       gpios = <&mp05 4 0>;
+                       enable-active-high;
+               };
+
+               pda_reg: fixed-regulator@1 {
+                       compatible = "regulator-fixed";
+                       regulator-name = "VCC_1.8V_PDA";
+                       regulator-min-microvolt = <1800000>;
+                       regulator-max-microvolt = <1800000>;
+                       reg = <1>;
+               };
+
+               bat_reg: fixed-regulator@2 {
+                       compatible = "regulator-fixed";
+                       regulator-name = "V_BAT";
+                       regulator-min-microvolt = <3700000>;
+                       regulator-max-microvolt = <3700000>;
+                       reg = <2>;
+               };
+
+               tsp_reg: fixed-regulator@3 {
+                       compatible = "regulator-fixed";
+                       regulator-name = "TSP_VDD";
+                       regulator-min-microvolt = <2800000>;
+                       regulator-max-microvolt = <2800000>;
+                       reg = <3>;
+                       gpios = <&gpj1 3 0>;
+                       enable-active-high;
+               };
+       };
+
+       i2c_pmic: i2c-pmic {
+               compatible = "i2c-gpio";
+               gpios = <&gpj4 0 0>, /* sda */
+                       <&gpj4 3 0>; /* scl */
+               i2c-gpio,delay-us = <2>;        /* ~100 kHz */
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               pmic@66 {
+                       compatible = "national,lp3974";
+                       reg = <0x66>;
+
+                       max8998,pmic-buck1-default-dvs-idx = <0>;
+                       max8998,pmic-buck1-dvs-gpios = <&gph0 3 0>,
+                                                       <&gph0 4 0>;
+                       max8998,pmic-buck1-dvs-voltage = <1200000>, <1200000>,
+                                                       <1200000>, <1200000>;
+
+                       max8998,pmic-buck2-default-dvs-idx = <0>;
+                       max8998,pmic-buck2-dvs-gpio = <&gph0 5 0>;
+                       max8998,pmic-buck2-dvs-voltage = <1200000>, <1200000>;
+
+                       regulators {
+                               ldo2_reg: LDO2 {
+                                       regulator-name = "VALIVE_1.1V";
+                                       regulator-min-microvolt = <1100000>;
+                                       regulator-max-microvolt = <1100000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo3_reg: LDO3 {
+                                       regulator-name = "VUSB+MIPI_1.1V";
+                                       regulator-min-microvolt = <1100000>;
+                                       regulator-max-microvolt = <1100000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo4_reg: LDO4 {
+                                       regulator-name = "VADC_3.3V";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                               };
+
+                               ldo5_reg: LDO5 {
+                                       regulator-name = "VTF_2.8V";
+                                       regulator-min-microvolt = <2800000>;
+                                       regulator-max-microvolt = <2800000>;
+                               };
+
+                               ldo6_reg: LDO6 {
+                                       regulator-name = "VCC_3.3V";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                               };
+
+                               ldo7_reg: LDO7 {
+                                       regulator-name = "VLCD_1.8V";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo8_reg: LDO8 {
+                                       regulator-name = "VUSB+VDAC_3.3V";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                               };
+
+                               ldo9_reg: LDO9 {
+                                       regulator-name = "VCC+VCAM_2.8V";
+                                       regulator-min-microvolt = <2800000>;
+                                       regulator-max-microvolt = <2800000>;
+                               };
+
+                               ldo10_reg: LDO10 {
+                                       regulator-name = "VPLL_1.1V";
+                                       regulator-min-microvolt = <1100000>;
+                                       regulator-max-microvolt = <1100000>;
+                                       regulator-boot-on;
+                               };
+
+                               ldo11_reg: LDO11 {
+                                       regulator-name = "CAM_IO_2.8V";
+                                       regulator-min-microvolt = <2800000>;
+                                       regulator-max-microvolt = <2800000>;
+                               };
+
+                               ldo12_reg: LDO12 {
+                                       regulator-name = "CAM_ISP_1.2V";
+                                       regulator-min-microvolt = <1200000>;
+                                       regulator-max-microvolt = <1200000>;
+                               };
+
+                               ldo13_reg: LDO13 {
+                                       regulator-name = "CAM_A_2.8V";
+                                       regulator-min-microvolt = <2800000>;
+                                       regulator-max-microvolt = <2800000>;
+                               };
+
+                               ldo14_reg: LDO14 {
+                                       regulator-name = "CAM_CIF_1.8V";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                               };
+
+                               ldo15_reg: LDO15 {
+                                       regulator-name = "CAM_AF_3.3V";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                               };
+
+                               ldo16_reg: LDO16 {
+                                       regulator-name = "VMIPI_1.8V";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                               };
+
+                               ldo17_reg: LDO17 {
+                                       regulator-name = "CAM_8M_1.8V";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                                       regulator-always-on;
+                               };
+
+                               buck1_reg: BUCK1 {
+                                       regulator-name = "VARM_1.2V";
+                                       regulator-min-microvolt = <1200000>;
+                                       regulator-max-microvolt = <1200000>;
+                               };
+
+                               buck2_reg: BUCK2 {
+                                       regulator-name = "VINT_1.2V";
+                                       regulator-min-microvolt = <1200000>;
+                                       regulator-max-microvolt = <1200000>;
+                               };
+
+                               buck3_reg: BUCK3 {
+                                       regulator-name = "VCC_1.8V";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                                       regulator-always-on;
+                               };
+
+                               buck4_reg: BUCK4 {
+                                       regulator-name = "CAM_CORE_1.2V";
+                                       regulator-min-microvolt = <1200000>;
+                                       regulator-max-microvolt = <1200000>;
+                                       regulator-always-on;
+                               };
+                       };
+               };
+       };
+
+       gpio-keys {
+               compatible = "gpio-keys";
+
+               power-key {
+                       gpios = <&gph2 6 1>;
+                       linux,code = <KEY_POWER>;
+                       label = "power";
+                       debounce-interval = <1>;
+                       gpio-key,wakeup;
+               };
+       };
+};
+
+&xusbxti {
+       clock-frequency = <24000000>;
+};
+
+&keypad {
+       linux,input-no-autorepeat;
+       linux,input-wakeup;
+       samsung,keypad-num-rows = <3>;
+       samsung,keypad-num-columns = <3>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&keypad_row0>, <&keypad_row1>, <&keypad_row2>,
+                       <&keypad_col0>, <&keypad_col1>, <&keypad_col2>;
+       status = "okay";
+
+       key_1 {
+               keypad,row = <0>;
+               keypad,column = <1>;
+               linux,code = <KEY_CONNECT>;
+       };
+
+       key_2 {
+               keypad,row = <0>;
+               keypad,column = <2>;
+               linux,code = <KEY_BACK>;
+       };
+
+       key_3 {
+               keypad,row = <1>;
+               keypad,column = <1>;
+               linux,code = <KEY_CAMERA_FOCUS>;
+       };
+
+       key_4 {
+               keypad,row = <1>;
+               keypad,column = <2>;
+               linux,code = <KEY_VOLUMEUP>;
+       };
+
+       key_5 {
+               keypad,row = <2>;
+               keypad,column = <1>;
+               linux,code = <KEY_CAMERA>;
+       };
+
+       key_6 {
+               keypad,row = <2>;
+               keypad,column = <2>;
+               linux,code = <KEY_VOLUMEDOWN>;
+       };
+};
+
+&uart0 {
+       status = "okay";
+};
+
+&uart1 {
+       status = "okay";
+};
+
+&uart2 {
+       status = "okay";
+};
+
+&uart3 {
+       status = "okay";
+};
+
+&sdhci0 {
+       bus-width = <4>;
+       non-removable;
+       vmmc-supply = <&ldo5_reg>;
+       pinctrl-0 = <&sd0_clk &sd0_cmd &sd0_cd &sd0_bus1 &sd0_bus4>;
+       pinctrl-names = "default";
+       status = "okay";
+};
+
+&sdhci2 {
+       bus-width = <4>;
+       cd-gpios = <&gph3 4 1>;
+       vmmc-supply = <&vtf_reg>;
+       cd-inverted;
+       pinctrl-0 = <&sd2_clk &sd2_cmd &sd2_bus4>;
+       pinctrl-names = "default";
+       status = "okay";
+};
+
+&hsotg {
+       vusb_a-supply = <&ldo3_reg>;
+       vusb_d-supply = <&ldo8_reg>;
+       status = "okay";
+};
+
+&usbphy {
+       status = "okay";
+};
+
+&i2c2 {
+       samsung,i2c-sda-delay = <100>;
+       samsung,i2c-max-bus-freq = <400000>;
+       samsung,i2c-slave-addr = <0x10>;
+       status = "okay";
+
+       tsp@4a {
+               compatible = "atmel,maxtouch";
+               reg = <0x4a>;
+               interrupt-parent = <&gpj0>;
+               interrupts = <5 2>;
+
+               atmel,x-line = <17>;
+               atmel,y-line = <11>;
+               atmel,x-size = <800>;
+               atmel,y-size = <480>;
+               atmel,burst-length = <0x21>;
+               atmel,threshold = <0x28>;
+               atmel,orientation = <1>;
+
+               vdd-supply = <&tsp_reg>;
+       };
+};
+
+&i2c0 {
+       samsung,i2c-sda-delay = <100>;
+       samsung,i2c-max-bus-freq = <100000>;
+       samsung,i2c-slave-addr = <0x10>;
+       status = "okay";
+
+       noon010pc30: sensor@30 {
+               compatible = "siliconfile,noon010pc30";
+               reg = <0x30>;
+               vddio-supply = <&ldo11_reg>;
+               vdda-supply = <&ldo13_reg>;
+               vdd_core-supply = <&ldo14_reg>;
+
+               clock-frequency = <16000000>;
+               clocks = <&clock_cam 0>;
+               clock-names = "mclk";
+               nreset-gpios = <&gpb 2 0>;
+               nstby-gpios = <&gpb 0 0>;
+
+               port {
+                       noon010pc30_ep: endpoint {
+                               remote-endpoint = <&fimc0_ep>;
+                               bus-width = <8>;
+                               hsync-active = <0>;
+                               vsync-active = <1>;
+                               pclk-sample = <1>;
+                       };
+               };
+       };
+};
+
+&camera {
+       pinctrl-0 = <&cam_port_a_io &cam_port_a_clk_active>;
+       pinctrl-1 = <&cam_port_a_io &cam_port_a_clk_idle>;
+       pinctrl-names = "default", "idle";
+
+       parallel-ports {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               /* camera A input */
+               port@1 {
+                       reg = <1>;
+                       fimc0_ep: endpoint {
+                               remote-endpoint = <&noon010pc30_ep>;
+                               bus-width = <8>;
+                               hsync-active = <1>;
+                               vsync-active = <1>;
+                               pclk-sample = <0>;
+                       };
+               };
+       };
+};
+
+&fimd {
+       pinctrl-0 = <&lcd_clk &lcd_data24>;
+       pinctrl-names = "default";
+       status = "okay";
+
+       display-timings {
+               native-mode = <&timing0>;
+               timing0: timing {
+                       /* 480x800@55Hz */
+                       clock-frequency = <23439570>;
+                       hactive = <480>;
+                       hfront-porch = <16>;
+                       hback-porch = <16>;
+                       hsync-len = <2>;
+                       vactive = <800>;
+                       vback-porch = <2>;
+                       vfront-porch = <28>;
+                       vsync-len = <1>;
+                       hsync-active = <0>;
+                       vsync-active = <0>;
+                       de-active = <0>;
+                       pixelclk-active = <0>;
+               };
+       };
+};
+
+&onenand {
+       status = "okay";
+};
diff --git a/arch/arm/boot/dts/s5pv210-pinctrl.dtsi b/arch/arm/boot/dts/s5pv210-pinctrl.dtsi
new file mode 100644 (file)
index 0000000..8c71408
--- /dev/null
@@ -0,0 +1,839 @@
+/*
+ * Samsung's S5PV210 SoC device tree source
+ *
+ * Copyright (c) 2013-2014 Samsung Electronics, Co. Ltd.
+ *
+ * Mateusz Krawczuk <m.krawczuk@partner.samsung.com>
+ * Tomasz Figa <t.figa@samsung.com>
+ *
+ * Samsung's S5PV210 SoC device nodes are listed in this file. S5PV210
+ * based board files can include this file and provide values for board specfic
+ * bindings.
+ *
+ * Note: This file does not include device nodes for all the controllers in
+ * S5PV210 SoC. As device tree coverage for S5PV210 increases, additional
+ * nodes can be added to this file.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+&pinctrl0 {
+       gpa0: gpa0 {
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               interrupt-controller;
+               #interrupt-cells = <2>;
+       };
+
+       gpa1: gpa1 {
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               interrupt-controller;
+               #interrupt-cells = <2>;
+       };
+
+       gpb: gpb {
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               interrupt-controller;
+               #interrupt-cells = <2>;
+       };
+
+       gpc0: gpc0 {
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               interrupt-controller;
+               #interrupt-cells = <2>;
+       };
+
+       gpc1: gpc1 {
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               interrupt-controller;
+               #interrupt-cells = <2>;
+       };
+
+       gpd0: gpd0 {
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               interrupt-controller;
+               #interrupt-cells = <2>;
+       };
+
+       gpd1: gpd1 {
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               interrupt-controller;
+               #interrupt-cells = <2>;
+       };
+
+       gpe0: gpe0 {
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               interrupt-controller;
+               #interrupt-cells = <2>;
+       };
+
+       gpe1: gpe1 {
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               interrupt-controller;
+               #interrupt-cells = <2>;
+       };
+
+       gpf0: gpf0 {
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               interrupt-controller;
+               #interrupt-cells = <2>;
+       };
+
+       gpf1: gpf1 {
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               interrupt-controller;
+               #interrupt-cells = <2>;
+       };
+
+       gpf2: gpf2 {
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               interrupt-controller;
+               #interrupt-cells = <2>;
+       };
+
+       gpf3: gpf3 {
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               interrupt-controller;
+               #interrupt-cells = <2>;
+       };
+
+       gpg0: gpg0 {
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               interrupt-controller;
+               #interrupt-cells = <2>;
+       };
+
+       gpg1: gpg1 {
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               interrupt-controller;
+               #interrupt-cells = <2>;
+       };
+
+       gpg2: gpg2 {
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               interrupt-controller;
+               #interrupt-cells = <2>;
+       };
+
+       gpg3: gpg3 {
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               interrupt-controller;
+               #interrupt-cells = <2>;
+       };
+
+       gpj0: gpj0 {
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               interrupt-controller;
+               #interrupt-cells = <2>;
+       };
+
+       gpj1: gpj1 {
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               interrupt-controller;
+               #interrupt-cells = <2>;
+       };
+
+       gpj2: gpj2 {
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               interrupt-controller;
+               #interrupt-cells = <2>;
+       };
+
+       gpj3: gpj3 {
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               interrupt-controller;
+               #interrupt-cells = <2>;
+       };
+
+       gpj4: gpj4 {
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               interrupt-controller;
+               #interrupt-cells = <2>;
+       };
+
+       gpgi: gpgi {
+               gpio-controller;
+               #gpio-cells = <2>;
+       };
+
+       mp01: mp01 {
+               gpio-controller;
+               #gpio-cells = <2>;
+       };
+
+       mp02: mp02 {
+               gpio-controller;
+               #gpio-cells = <2>;
+       };
+
+       mp03: mp03 {
+               gpio-controller;
+               #gpio-cells = <2>;
+       };
+
+       mp04: mp04 {
+               gpio-controller;
+               #gpio-cells = <2>;
+       };
+
+       mp05: mp05 {
+               gpio-controller;
+               #gpio-cells = <2>;
+       };
+
+       mp06: mp06 {
+               gpio-controller;
+               #gpio-cells = <2>;
+       };
+
+       mp07: mp07 {
+               gpio-controller;
+               #gpio-cells = <2>;
+       };
+
+       gph0: gph0 {
+               gpio-controller;
+               interrupt-controller;
+               interrupt-parent = <&vic0>;
+               interrupts = <0>, <1>, <2>, <3>,
+                               <4>, <5>, <6>, <7>;
+               #gpio-cells = <2>;
+               #interrupt-cells = <2>;
+       };
+
+       gph1: gph1 {
+               gpio-controller;
+               interrupt-controller;
+               interrupt-parent = <&vic0>;
+               interrupts = <8>, <9>, <10>, <11>,
+                               <12>, <13>, <14>, <15>;
+               #gpio-cells = <2>;
+               #interrupt-cells = <2>;
+       };
+
+       gph2: gph2 {
+               gpio-controller;
+               #gpio-cells = <2>;
+               #interrupt-cells = <2>;
+       };
+
+       gph3: gph3 {
+               gpio-controller;
+               #gpio-cells = <2>;
+               #interrupt-cells = <2>;
+       };
+
+       uart0_data: uart0-data {
+               samsung,pins = "gpa0-0", "gpa0-1";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       uart0_fctl: uart0-fctl {
+               samsung,pins = "gpa0-2", "gpa0-3";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       uart1_data: uart1-data {
+               samsung,pins = "gpa0-4", "gpa0-5";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       uart1_fctl: uart1-fctl {
+               samsung,pins = "gpa0-6", "gpa0-7";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       uart2_data: uart2-data {
+               samsung,pins = "gpa1-0", "gpa1-1";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       uart2_fctl: uart2-fctl {
+               samsung,pins = "gpa1-2", "gpa1-3";
+               samsung,pin-function = <3>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       uart3_data: uart3-data {
+               samsung,pins = "gpa1-2", "gpa1-3";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       uart_audio: uart-audio {
+               samsung,pins = "gpa1-2", "gpa1-3";
+               samsung,pin-function = <4>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       spi0_bus: spi0-bus {
+               samsung,pins = "gpb-0", "gpb-2", "gpb-3";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <2>;
+               samsung,pin-drv = <0>;
+       };
+
+       spi1_bus: spi1-bus {
+               samsung,pins = "gpb-4", "gpb-6", "gpb-7";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <2>;
+               samsung,pin-drv = <0>;
+       };
+
+       i2s0_bus: i2s0-bus {
+               samsung,pins = "gpi-0", "gpi-1", "gpi-2", "gpi-3",
+                               "gpi-4", "gpi-5", "gpi-6";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       i2s1_bus: i2s1-bus {
+               samsung,pins = "gpc0-0", "gpc0-1", "gpc0-2", "gpc0-3",
+                               "gpc0-4";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       i2s2_bus: i2s2-bus {
+               samsung,pins = "gpc1-0", "gpc1-1", "gpc1-2", "gpc1-3",
+                               "gpc1-4";
+               samsung,pin-function = <4>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       pcm1_bus: pcm1-bus {
+               samsung,pins = "gpc0-0", "gpc0-1", "gpc0-2", "gpc0-3",
+                               "gpc0-4";
+               samsung,pin-function = <3>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       ac97_bus: ac97-bus {
+               samsung,pins = "gpc0-0", "gpc0-1", "gpc0-2", "gpc0-3",
+                               "gpc0-4";
+               samsung,pin-function = <4>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       i2s2_bus: i2s2-bus {
+               samsung,pins = "gpc1-0", "gpc1-1", "gpc1-2", "gpc1-3",
+                               "gpc1-4";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       pcm2_bus: pcm2-bus {
+               samsung,pins = "gpc1-0", "gpc1-1", "gpc1-2", "gpc1-3",
+                               "gpc1-4";
+               samsung,pin-function = <3>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       spdif_bus: spdif-bus {
+               samsung,pins = "gpc1-0", "gpc1-1";
+               samsung,pin-function = <4>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       spi2_bus: spi2-bus {
+               samsung,pins = "gpc1-1", "gpc1-2", "gpc1-3", "gpc1-4";
+               samsung,pin-function = <5>;
+               samsung,pin-pud = <2>;
+               samsung,pin-drv = <0>;
+       };
+
+       i2c0_bus: i2c0-bus {
+               samsung,pins = "gpd1-0", "gpd1-1";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <2>;
+               samsung,pin-drv = <0>;
+       };
+
+       i2c1_bus: i2c1-bus {
+               samsung,pins = "gpd1-2", "gpd1-3";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <2>;
+               samsung,pin-drv = <0>;
+       };
+
+       i2c2_bus: i2c2-bus {
+               samsung,pins = "gpd1-4", "gpd1-5";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <2>;
+               samsung,pin-drv = <0>;
+       };
+
+       pwm0_out: pwm0-out {
+               samsung,pins = "gpd0-0";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       pwm1_out: pwm1-out {
+               samsung,pins = "gpd0-1";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       pwm2_out: pwm2-out {
+               samsung,pins = "gpd0-2";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       pwm3_out: pwm3-out {
+               samsung,pins = "gpd0-3";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       keypad_row0: keypad-row-0 {
+               samsung,pins = "gph3-0";
+               samsung,pin-function = <3>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       keypad_row1: keypad-row-1 {
+               samsung,pins = "gph3-1";
+               samsung,pin-function = <3>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       keypad_row2: keypad-row-2 {
+               samsung,pins = "gph3-2";
+               samsung,pin-function = <3>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       keypad_row3: keypad-row-3 {
+               samsung,pins = "gph3-3";
+               samsung,pin-function = <3>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       keypad_row4: keypad-row-4 {
+               samsung,pins = "gph3-4";
+               samsung,pin-function = <3>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       keypad_row5: keypad-row-5 {
+               samsung,pins = "gph3-5";
+               samsung,pin-function = <3>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       keypad_row6: keypad-row-6 {
+               samsung,pins = "gph3-6";
+               samsung,pin-function = <3>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       keypad_row7: keypad-row-7 {
+               samsung,pins = "gph3-7";
+               samsung,pin-function = <3>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       keypad_col0: keypad-col-0 {
+               samsung,pins = "gph2-0";
+               samsung,pin-function = <3>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       keypad_col1: keypad-col-1 {
+               samsung,pins = "gph2-1";
+               samsung,pin-function = <3>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       keypad_col2: keypad-col-2 {
+               samsung,pins = "gph2-2";
+               samsung,pin-function = <3>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       keypad_col3: keypad-col-3 {
+               samsung,pins = "gph2-3";
+               samsung,pin-function = <3>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       keypad_col4: keypad-col-4 {
+               samsung,pins = "gph2-4";
+               samsung,pin-function = <3>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       keypad_col5: keypad-col-5 {
+               samsung,pins = "gph2-5";
+               samsung,pin-function = <3>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       keypad_col6: keypad-col-6 {
+               samsung,pins = "gph2-6";
+               samsung,pin-function = <3>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       keypad_col7: keypad-col-7 {
+               samsung,pins = "gph2-7";
+               samsung,pin-function = <3>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       sd0_clk: sd0-clk {
+               samsung,pins = "gpg0-0";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <3>;
+       };
+
+       sd0_cmd: sd0-cmd {
+               samsung,pins = "gpg0-1";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <3>;
+       };
+
+       sd0_cd: sd0-cd {
+               samsung,pins = "gpg0-2";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <2>;
+               samsung,pin-drv = <3>;
+       };
+
+       sd0_bus1: sd0-bus-width1 {
+               samsung,pins = "gpg0-3";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <2>;
+               samsung,pin-drv = <3>;
+       };
+
+       sd0_bus4: sd0-bus-width4 {
+               samsung,pins = "gpg0-3", "gpg0-4", "gpg0-5", "gpg0-6";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <2>;
+               samsung,pin-drv = <3>;
+       };
+
+       sd0_bus8: sd0-bus-width8 {
+               samsung,pins = "gpg1-3", "gpg1-4", "gpg1-5", "gpg1-6";
+               samsung,pin-function = <3>;
+               samsung,pin-pud = <2>;
+               samsung,pin-drv = <3>;
+       };
+
+       sd1_clk: sd1-clk {
+               samsung,pins = "gpg1-0";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <3>;
+       };
+
+       sd1_cmd: sd1-cmd {
+               samsung,pins = "gpg1-1";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <3>;
+       };
+
+       sd1_cd: sd1-cd {
+               samsung,pins = "gpg1-2";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <2>;
+               samsung,pin-drv = <3>;
+       };
+
+       sd1_bus1: sd1-bus-width1 {
+               samsung,pins = "gpg1-3";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <2>;
+               samsung,pin-drv = <3>;
+       };
+
+       sd1_bus4: sd1-bus-width4 {
+               samsung,pins = "gpg1-3", "gpg1-4", "gpg1-5", "gpg1-6";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <2>;
+               samsung,pin-drv = <3>;
+       };
+
+       sd2_clk: sd2-clk {
+               samsung,pins = "gpg2-0";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <3>;
+       };
+
+       sd2_cmd: sd2-cmd {
+               samsung,pins = "gpg2-1";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <3>;
+       };
+
+       sd2_cd: sd2-cd {
+               samsung,pins = "gpg2-2";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <2>;
+               samsung,pin-drv = <3>;
+       };
+
+       sd2_bus1: sd2-bus-width1 {
+               samsung,pins = "gpg2-3";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <2>;
+               samsung,pin-drv = <3>;
+       };
+
+       sd2_bus4: sd2-bus-width4 {
+               samsung,pins = "gpg2-3", "gpg2-4", "gpg2-5", "gpg2-6";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <2>;
+               samsung,pin-drv = <3>;
+       };
+
+       sd2_bus8: sd2-bus-width8 {
+               samsung,pins = "gpg3-3", "gpg3-4", "gpg3-5", "gpg3-6";
+               samsung,pin-function = <3>;
+               samsung,pin-pud = <2>;
+               samsung,pin-drv = <3>;
+       };
+
+       sd3_clk: sd3-clk {
+               samsung,pins = "gpg3-0";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <3>;
+       };
+
+       sd3_cmd: sd3-cmd {
+               samsung,pins = "gpg3-1";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <3>;
+       };
+
+       sd3_cd: sd3-cd {
+               samsung,pins = "gpg3-2";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <2>;
+               samsung,pin-drv = <3>;
+       };
+
+       sd3_bus1: sd3-bus-width1 {
+               samsung,pins = "gpg3-3";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <2>;
+               samsung,pin-drv = <3>;
+       };
+
+       sd3_bus4: sd3-bus-width4 {
+               samsung,pins = "gpg3-3", "gpg3-4", "gpg3-5", "gpg3-6";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <2>;
+               samsung,pin-drv = <3>;
+       };
+
+       eint0: ext-int0 {
+               samsung,pins = "gph0-0";
+               samsung,pin-function = <0xf>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       eint8: ext-int8 {
+               samsung,pins = "gph1-0";
+               samsung,pin-function = <0xf>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       eint15: ext-int15 {
+               samsung,pins = "gph1-7";
+               samsung,pin-function = <0xf>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       eint16: ext-int16 {
+               samsung,pins = "gph2-0";
+               samsung,pin-function = <0xf>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       eint31: ext-int31 {
+               samsung,pins = "gph3-7";
+               samsung,pin-function = <0xf>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       cam_port_a_io: cam-port-a-io {
+               samsung,pins = "gpe0-0", "gpe0-1", "gpe0-2", "gpe0-3",
+                               "gpe0-4", "gpe0-5", "gpe0-6", "gpe0-7",
+                               "gpe1-0", "gpe1-1", "gpe1-2", "gpe1-4";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       cam_port_a_clk_active: cam-port-a-clk-active {
+               samsung,pins = "gpe1-3";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <3>;
+       };
+
+       cam_port_a_clk_idle: cam-port-a-clk-idle {
+               samsung,pins = "gpe1-3";
+               samsung,pin-function = <0>;
+               samsung,pin-pud = <1>;
+               samsung,pin-drv = <0>;
+       };
+
+       cam_port_b_io: cam-port-b-io {
+               samsung,pins = "gpj0-0", "gpj0-1", "gpj0-2", "gpj0-3",
+                               "gpj0-4", "gpj0-5", "gpj0-6", "gpj0-7",
+                               "gpj1-0", "gpj1-1", "gpj1-2", "gpj1-4";
+               samsung,pin-function = <3>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       cam_port_b_clk_active: cam-port-b-clk-active {
+               samsung,pins = "gpj1-3";
+               samsung,pin-function = <3>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <3>;
+       };
+
+       cam_port_b_clk_idle: cam-port-b-clk-idle {
+               samsung,pins = "gpj1-3";
+               samsung,pin-function = <0>;
+               samsung,pin-pud = <1>;
+               samsung,pin-drv = <0>;
+       };
+
+               lcd_ctrl: lcd-ctrl {
+               samsung,pins = "gpd0-0", "gpd0-1";
+               samsung,pin-function = <3>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       lcd_sync: lcd-sync {
+               samsung,pins = "gpf0-0", "gpf0-1";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       lcd_clk: lcd-clk {
+               samsung,pins = "gpf0-0", "gpf0-1", "gpf0-2", "gpf0-3";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+
+       lcd_data24: lcd-data-width24 {
+               samsung,pins =  "gpf0-4", "gpf0-5", "gpf0-6", "gpf0-7",
+                               "gpf1-0", "gpf1-1", "gpf1-2", "gpf1-3",
+                               "gpf1-4", "gpf1-5", "gpf1-6", "gpf1-7",
+                               "gpf2-0", "gpf2-1", "gpf2-2", "gpf2-3",
+                               "gpf2-4", "gpf2-5", "gpf2-6", "gpf2-7",
+                               "gpf3-0", "gpf3-1", "gpf3-2", "gpf3-3";
+               samsung,pin-function = <2>;
+               samsung,pin-pud = <0>;
+               samsung,pin-drv = <0>;
+       };
+};
diff --git a/arch/arm/boot/dts/s5pv210-smdkc110.dts b/arch/arm/boot/dts/s5pv210-smdkc110.dts
new file mode 100644 (file)
index 0000000..1eedab7
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+ * Samsung's S5PV210 SoC device tree source
+ *
+ * Copyright (c) 2013-2014 Samsung Electronics, Co. Ltd.
+ *
+ * Mateusz Krawczuk <m.krawczuk@partner.samsung.com>
+ * Tomasz Figa <t.figa@samsung.com>
+ *
+ * Board device tree source for YIC System SMDC110 board.
+ *
+ * NOTE: This file is completely based on original board file for mach-smdkc110
+ * available in Linux 3.15 and intends to provide equivalent level of hardware
+ * support. Due to lack of hardware, _no_ testing has been performed.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+/dts-v1/;
+#include <dt-bindings/input/input.h>
+#include "s5pv210.dtsi"
+
+/ {
+       model = "YIC System SMDKC110 based on S5PC110";
+       compatible = "yic,smdkc110", "samsung,s5pv210";
+
+       chosen {
+               bootargs = "console=ttySAC0,115200n8 root=/dev/mmcblk0p1 rw rootwait ignore_loglevel earlyprintk";
+       };
+
+       memory {
+               device_type = "memory";
+               reg = <0x20000000 0x20000000>;
+       };
+};
+
+&xusbxti {
+       clock-frequency = <24000000>;
+};
+
+&uart0 {
+       status = "okay";
+};
+
+&uart1 {
+       status = "okay";
+};
+
+&uart2 {
+       status = "okay";
+};
+
+&uart3 {
+       status = "okay";
+};
+
+&rtc {
+       status = "okay";
+};
+
+&i2c0 {
+       status = "okay";
+
+       audio-codec@1b {
+               compatible = "wlf,wm8580";
+               reg = <0x1b>;
+       };
+
+       eeprom@50 {
+               compatible = "atmel,24c08";
+               reg = <0x50>;
+       };
+};
+
+&i2s0 {
+       status = "okay";
+};
diff --git a/arch/arm/boot/dts/s5pv210-smdkv210.dts b/arch/arm/boot/dts/s5pv210-smdkv210.dts
new file mode 100644 (file)
index 0000000..cb85218
--- /dev/null
@@ -0,0 +1,238 @@
+/*
+ * Samsung's S5PV210 SoC device tree source
+ *
+ * Copyright (c) 2013-2014 Samsung Electronics, Co. Ltd.
+ *
+ * Mateusz Krawczuk <m.krawczuk@partner.samsung.com>
+ * Tomasz Figa <t.figa@samsung.com>
+ *
+ * Board device tree source for YIC System SMDV210 board.
+ *
+ * NOTE: This file is completely based on original board file for mach-smdkv210
+ * available in Linux 3.15 and intends to provide equivalent level of hardware
+ * support. Due to lack of hardware, _no_ testing has been performed.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+/dts-v1/;
+#include <dt-bindings/input/input.h>
+#include "s5pv210.dtsi"
+
+/ {
+       model = "YIC System SMDKV210 based on S5PV210";
+       compatible = "yic,smdkv210", "samsung,s5pv210";
+
+       chosen {
+               bootargs = "console=ttySAC0,115200n8 root=/dev/mmcblk0p1 rw rootwait ignore_loglevel earlyprintk";
+       };
+
+       memory {
+               device_type = "memory";
+               reg = <0x20000000 0x40000000>;
+       };
+
+       ethernet@18000000 {
+               compatible = "davicom,dm9000";
+               reg = <0xA8000000 0x2 0xA8000002 0x2>;
+               interrupt-parent = <&gph1>;
+               interrupts = <1 4>;
+               local-mac-address = [00 00 de ad be ef];
+               davicom,no-eeprom;
+       };
+
+       backlight {
+               compatible = "pwm-backlight";
+               pwms = <&pwm 3 5000000 0>;
+               brightness-levels = <0 4 8 16 32 64 128 255>;
+               default-brightness-level = <6>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pwm3_out>;
+       };
+};
+
+&xusbxti {
+       clock-frequency = <24000000>;
+};
+
+&keypad {
+       linux,input-no-autorepeat;
+       linux,input-wakeup;
+       samsung,keypad-num-rows = <8>;
+       samsung,keypad-num-columns = <8>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&keypad_row0>, <&keypad_row1>, <&keypad_row2>,
+                       <&keypad_row3>, <&keypad_row4>, <&keypad_row5>,
+                       <&keypad_row6>, <&keypad_row7>,
+                       <&keypad_col0>, <&keypad_col1>, <&keypad_col2>,
+                       <&keypad_col3>, <&keypad_col4>, <&keypad_col5>,
+                       <&keypad_col6>, <&keypad_col7>;
+       status = "okay";
+
+       key_1 {
+               keypad,row = <0>;
+               keypad,column = <3>;
+               linux,code = <KEY_1>;
+       };
+
+       key_2 {
+               keypad,row = <0>;
+               keypad,column = <4>;
+               linux,code = <KEY_2>;
+       };
+
+       key_3 {
+               keypad,row = <0>;
+               keypad,column = <5>;
+               linux,code = <KEY_3>;
+       };
+
+       key_4 {
+               keypad,row = <0>;
+               keypad,column = <6>;
+               linux,code = <KEY_4>;
+       };
+
+       key_5 {
+               keypad,row = <0
+               >;
+               keypad,column = <7>;
+               linux,code = <KEY_5>;
+       };
+
+       key_6 {
+               keypad,row = <1>;
+               keypad,column = <3>;
+               linux,code = <KEY_A>;
+       };
+       key_7 {
+               keypad,row = <1>;
+               keypad,column = <4>;
+               linux,code = <KEY_B>;
+       };
+
+       key_8 {
+               keypad,row = <1>;
+               keypad,column = <5>;
+               linux,code = <KEY_C>;
+       };
+
+       key_9 {
+               keypad,row = <1>;
+               keypad,column = <6>;
+               linux,code = <KEY_D>;
+       };
+
+       key_10 {
+               keypad,row = <1>;
+               keypad,column = <7>;
+               linux,code = <KEY_E>;
+       };
+};
+
+&uart0 {
+       status = "okay";
+};
+
+&uart1 {
+       status = "okay";
+};
+
+&uart2 {
+       status = "okay";
+};
+
+&uart3 {
+       status = "okay";
+};
+
+&rtc {
+       status = "okay";
+};
+
+&sdhci0 {
+       bus-width = <4>;
+       pinctrl-0 = <&sd0_clk &sd0_cmd &sd0_cd &sd0_bus1 &sd0_bus4>;
+       pinctrl-names = "default";
+       status = "okay";
+};
+
+&sdhci1 {
+       bus-width = <4>;
+       pinctrl-0 = <&sd1_clk &sd1_cmd &sd1_cd &sd1_bus1 &sd1_bus4>;
+       pinctrl-names = "default";
+       status = "okay";
+};
+
+&sdhci2 {
+       bus-width = <4>;
+       pinctrl-0 = <&sd2_clk &sd2_cmd &sd2_cd &sd2_bus1 &sd2_bus4>;
+       pinctrl-names = "default";
+       status = "okay";
+};
+
+&sdhci3 {
+       bus-width = <4>;
+       pinctrl-0 = <&sd3_clk &sd3_cmd &sd3_cd &sd3_bus1 &sd3_bus4>;
+       pinctrl-names = "default";
+       status = "okay";
+};
+
+&hsotg {
+       status = "okay";
+};
+
+&usbphy {
+       status = "okay";
+};
+
+&fimd {
+       pinctrl-0 = <&lcd_clk &lcd_data24>;
+       pinctrl-names = "default";
+       status = "okay";
+
+       display-timings {
+               native-mode = <&timing0>;
+
+               timing0: timing@0 {
+                       /* 800x480@60Hz */
+                       clock-frequency = <24373920>;
+                       hactive = <800>;
+                       vactive = <480>;
+                       hfront-porch = <8>;
+                       hback-porch = <13>;
+                       hsync-len = <3>;
+                       vback-porch = <7>;
+                       vfront-porch = <5>;
+                       vsync-len = <1>;
+                       hsync-active = <0>;
+                       vsync-active = <0>;
+                       de-active = <1>;
+                       pixelclk-active = <1>;
+               };
+       };
+};
+
+&pwm {
+       samsung,pwm-outputs = <3>;
+};
+
+&i2c0 {
+       status = "okay";
+
+       audio-codec@1b {
+               compatible = "wlf,wm8580";
+               reg = <0x1b>;
+       };
+
+       eeprom@50 {
+               compatible = "atmel,24c08";
+               reg = <0x50>;
+       };
+};
+
+&i2s0 {
+       status = "okay";
+};
diff --git a/arch/arm/boot/dts/s5pv210-torbreck.dts b/arch/arm/boot/dts/s5pv210-torbreck.dts
new file mode 100644 (file)
index 0000000..622599f
--- /dev/null
@@ -0,0 +1,92 @@
+/*
+ * Samsung's S5PV210 SoC device tree source
+ *
+ * Copyright (c) 2013-2014 Samsung Electronics, Co. Ltd.
+ *
+ * Mateusz Krawczuk <m.krawczuk@partner.samsung.com>
+ * Tomasz Figa <t.figa@samsung.com>
+ *
+ * Board device tree source for Torbreck board.
+ *
+ * NOTE: This file is completely based on original board file for mach-torbreck
+ * available in Linux 3.15 and intends to provide equivalent level of hardware
+ * support. Due to lack of hardware, _no_ testing has been performed.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+/dts-v1/;
+#include <dt-bindings/input/input.h>
+#include "s5pv210.dtsi"
+
+/ {
+       model = "aESOP Torbreck based on S5PV210";
+       compatible = "aesop,torbreck", "samsung,s5pv210";
+
+       chosen {
+               bootargs = "console=ttySAC0,115200n8 root=/dev/mmcblk0p1 rw rootwait ignore_loglevel earlyprintk";
+       };
+
+       memory {
+               device_type = "memory";
+               reg = <0x20000000 0x20000000>;
+       };
+};
+
+&xusbxti {
+       clock-frequency = <24000000>;
+};
+
+&uart0 {
+       status = "okay";
+};
+
+&uart1 {
+       status = "okay";
+};
+
+&uart2 {
+       status = "okay";
+};
+
+&uart3 {
+       status = "okay";
+};
+
+&rtc {
+       status = "okay";
+};
+
+&sdhci0 {
+       bus-width = <4>;
+       pinctrl-0 = <&sd0_clk &sd0_cmd &sd0_cd &sd0_bus1 &sd0_bus4>;
+       pinctrl-names = "default";
+       status = "okay";
+};
+
+&sdhci1 {
+       bus-width = <4>;
+       pinctrl-0 = <&sd1_clk &sd1_cmd &sd1_cd &sd1_bus1 &sd1_bus4>;
+       pinctrl-names = "default";
+       status = "okay";
+};
+
+&sdhci2 {
+       bus-width = <4>;
+       pinctrl-0 = <&sd2_clk &sd2_cmd &sd2_bus1 &sd2_bus4>;
+       pinctrl-names = "default";
+       status = "okay";
+};
+
+&sdhci3 {
+       bus-width = <4>;
+       pinctrl-0 = <&sd3_clk &sd3_cmd &sd3_cd &sd3_bus1 &sd3_bus4>;
+       pinctrl-names = "default";
+       status = "okay";
+};
+
+&i2s0 {
+       status = "okay";
+};
diff --git a/arch/arm/boot/dts/s5pv210.dtsi b/arch/arm/boot/dts/s5pv210.dtsi
new file mode 100644 (file)
index 0000000..8344a0e
--- /dev/null
@@ -0,0 +1,633 @@
+/*
+ * Samsung's S5PV210 SoC device tree source
+ *
+ * Copyright (c) 2013-2014 Samsung Electronics, Co. Ltd.
+ *
+ * Mateusz Krawczuk <m.krawczuk@partner.samsung.com>
+ * Tomasz Figa <t.figa@samsung.com>
+ *
+ * Samsung's S5PV210 SoC device nodes are listed in this file. S5PV210
+ * based board files can include this file and provide values for board specfic
+ * bindings.
+ *
+ * Note: This file does not include device nodes for all the controllers in
+ * S5PV210 SoC. As device tree coverage for S5PV210 increases, additional
+ * nodes can be added to this file.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+*/
+
+#include "skeleton.dtsi"
+#include <dt-bindings/clock/s5pv210.h>
+#include <dt-bindings/clock/s5pv210-audss.h>
+
+/ {
+       aliases {
+               csis0 = &csis0;
+               fimc0 = &fimc0;
+               fimc1 = &fimc1;
+               fimc2 = &fimc2;
+               i2c0 = &i2c0;
+               i2c1 = &i2c1;
+               i2c2 = &i2c2;
+               i2s0 = &i2s0;
+               i2s1 = &i2s1;
+               i2s2 = &i2s2;
+               pinctrl0 = &pinctrl0;
+               spi0 = &spi0;
+               spi1 = &spi1;
+       };
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               cpu@0 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a8";
+                       reg = <0>;
+               };
+       };
+
+       soc {
+               compatible = "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges;
+
+               external-clocks {
+                       compatible = "simple-bus";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       xxti: oscillator@0 {
+                               compatible = "fixed-clock";
+                               reg = <0>;
+                               clock-frequency = <0>;
+                               clock-output-names = "xxti";
+                               #clock-cells = <0>;
+                       };
+
+                       xusbxti: oscillator@1 {
+                               compatible = "fixed-clock";
+                               reg = <1>;
+                               clock-frequency = <0>;
+                               clock-output-names = "xusbxti";
+                               #clock-cells = <0>;
+                       };
+               };
+
+               onenand: onenand@b0000000 {
+                       compatible = "samsung,s5pv210-onenand";
+                       reg = <0xb0600000 0x2000>,
+                               <0xb0000000 0x20000>,
+                               <0xb0040000 0x20000>;
+                       interrupt-parent = <&vic1>;
+                       interrupts = <31>;
+                       clocks = <&clocks CLK_NANDXL>, <&clocks DOUT_FLASH>;
+                       clock-names = "bus", "onenand";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       status = "disabled";
+               };
+
+               chipid@e0000000 {
+                       compatible = "samsung,s5pv210-chipid";
+                       reg = <0xe0000000 0x1000>;
+               };
+
+               clocks: clock-controller@e0100000 {
+                       compatible = "samsung,s5pv210-clock", "simple-bus";
+                       reg = <0xe0100000 0x10000>;
+                       clock-names = "xxti", "xusbxti";
+                       clocks = <&xxti>, <&xusbxti>;
+                       #clock-cells = <1>;
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges;
+
+                       pmu_syscon: syscon@e0108000 {
+                               compatible = "samsung-s5pv210-pmu", "syscon";
+                               reg = <0xe0108000 0x8000>;
+                       };
+               };
+
+               pinctrl0: pinctrl@e0200000 {
+                       compatible = "samsung,s5pv210-pinctrl";
+                       reg = <0xe0200000 0x1000>;
+                       interrupt-parent = <&vic0>;
+                       interrupts = <30>;
+
+                       wakeup-interrupt-controller {
+                               compatible = "samsung,exynos4210-wakeup-eint";
+                               interrupts = <16>;
+                               interrupt-parent = <&vic0>;
+                       };
+               };
+
+               amba {
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       compatible = "arm,amba-bus";
+                       ranges;
+
+                       pdma0: dma@e0900000 {
+                               compatible = "arm,pl330", "arm,primecell";
+                               reg = <0xe0900000 0x1000>;
+                               interrupt-parent = <&vic0>;
+                               interrupts = <19>;
+                               clocks = <&clocks CLK_PDMA0>;
+                               clock-names = "apb_pclk";
+                               #dma-cells = <1>;
+                               #dma-channels = <8>;
+                               #dma-requests = <32>;
+                       };
+
+                       pdma1: dma@e0a00000 {
+                               compatible = "arm,pl330", "arm,primecell";
+                               reg = <0xe0a00000 0x1000>;
+                               interrupt-parent = <&vic0>;
+                               interrupts = <20>;
+                               clocks = <&clocks CLK_PDMA1>;
+                               clock-names = "apb_pclk";
+                               #dma-cells = <1>;
+                               #dma-channels = <8>;
+                               #dma-requests = <32>;
+                       };
+               };
+
+               spi0: spi@e1300000 {
+                       compatible = "samsung,s5pv210-spi";
+                       reg = <0xe1300000 0x1000>;
+                       interrupt-parent = <&vic1>;
+                       interrupts = <15>;
+                       dmas = <&pdma0 7>, <&pdma0 6>;
+                       dma-names = "tx", "rx";
+                       clocks = <&clocks SCLK_SPI0>, <&clocks CLK_SPI0>;
+                       clock-names = "spi", "spi_busclk0";
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&spi0_bus>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       status = "disabled";
+               };
+
+               spi1: spi@e1400000 {
+                       compatible = "samsung,s5pv210-spi";
+                       reg = <0xe1400000 0x1000>;
+                       interrupt-parent = <&vic1>;
+                       interrupts = <16>;
+                       dmas = <&pdma1 7>, <&pdma1 6>;
+                       dma-names = "tx", "rx";
+                       clocks = <&clocks SCLK_SPI1>, <&clocks CLK_SPI1>;
+                       clock-names = "spi", "spi_busclk0";
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&spi1_bus>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       status = "disabled";
+               };
+
+               keypad: keypad@e1600000 {
+                       compatible = "samsung,s5pv210-keypad";
+                       reg = <0xe1600000 0x1000>;
+                       interrupt-parent = <&vic2>;
+                       interrupts = <25>;
+                       clocks = <&clocks CLK_KEYIF>;
+                       clock-names = "keypad";
+                       status = "disabled";
+               };
+
+               i2c0: i2c@e1800000 {
+                       compatible = "samsung,s3c2440-i2c";
+                       reg = <0xe1800000 0x1000>;
+                       interrupt-parent = <&vic1>;
+                       interrupts = <14>;
+                       clocks = <&clocks CLK_I2C0>;
+                       clock-names = "i2c";
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&i2c0_bus>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       status = "disabled";
+               };
+
+               i2c2: i2c@e1a00000 {
+                       compatible = "samsung,s3c2440-i2c";
+                       reg = <0xe1a00000 0x1000>;
+                       interrupt-parent = <&vic1>;
+                       interrupts = <19>;
+                       clocks = <&clocks CLK_I2C2>;
+                       clock-names = "i2c";
+                       pinctrl-0 = <&i2c2_bus>;
+                       pinctrl-names = "default";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       status = "disabled";
+               };
+
+               audio-subsystem {
+                       compatible = "samsung,s5pv210-audss", "simple-bus";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges;
+
+                       clk_audss: clock-controller@eee10000 {
+                               compatible = "samsung,s5pv210-audss-clock";
+                               reg = <0xeee10000 0x1000>;
+                               clock-names = "hclk", "xxti",
+                                               "fout_epll",
+                                               "sclk_audio0";
+                               clocks = <&clocks DOUT_HCLKP>, <&xxti>,
+                                               <&clocks FOUT_EPLL>,
+                                               <&clocks SCLK_AUDIO0>;
+                               #clock-cells = <1>;
+                       };
+
+                       i2s0: i2s@eee30000 {
+                               compatible = "samsung,s5pv210-i2s";
+                               reg = <0xeee30000 0x1000>;
+                               interrupt-parent = <&vic2>;
+                               interrupts = <16>;
+                               dma-names = "rx", "tx", "tx-sec";
+                               dmas = <&pdma1 9>, <&pdma1 10>, <&pdma1 11>;
+                               clock-names = "iis",
+                                               "i2s_opclk0",
+                                               "i2s_opclk1";
+                               clocks = <&clk_audss CLK_I2S>,
+                                               <&clk_audss CLK_I2S>,
+                                               <&clk_audss CLK_DOUT_AUD_BUS>;
+                               samsung,idma-addr = <0xc0010000>;
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&i2s0_bus>;
+                               #sound-dai-cells = <0>;
+                               status = "disabled";
+                       };
+               };
+
+               i2s1: i2s@e2100000 {
+                       compatible = "samsung,s3c6410-i2s";
+                       reg = <0xe2100000 0x1000>;
+                       interrupt-parent = <&vic2>;
+                       interrupts = <17>;
+                       dma-names = "rx", "tx";
+                       dmas = <&pdma1 12>, <&pdma1 13>;
+                       clock-names = "iis", "i2s_opclk0";
+                       clocks = <&clocks CLK_I2S1>, <&clocks SCLK_AUDIO1>;
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&i2s1_bus>;
+                       #sound-dai-cells = <0>;
+                       status = "disabled";
+               };
+
+               i2s2: i2s@e2a00000 {
+                       compatible = "samsung,s3c6410-i2s";
+                       reg = <0xe2a00000 0x1000>;
+                       interrupt-parent = <&vic2>;
+                       interrupts = <18>;
+                       dma-names = "rx", "tx";
+                       dmas = <&pdma1 14>, <&pdma1 15>;
+                       clock-names = "iis", "i2s_opclk0";
+                       clocks = <&clocks CLK_I2S2>, <&clocks SCLK_AUDIO2>;
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&i2s2_bus>;
+                       #sound-dai-cells = <0>;
+                       status = "disabled";
+               };
+
+               pwm: pwm@e2500000 {
+                       compatible = "samsung,s5pc100-pwm";
+                       reg = <0xe2500000 0x1000>;
+                       interrupt-parent = <&vic0>;
+                       interrupts = <21>, <22>, <23>, <24>, <25>;
+                       clock-names = "timers";
+                       clocks = <&clocks CLK_PWM>;
+                       #pwm-cells = <3>;
+               };
+
+               watchdog: watchdog@e2700000 {
+                       compatible = "samsung,s3c2410-wdt";
+                       reg = <0xe2700000 0x1000>;
+                       interrupt-parent = <&vic0>;
+                       interrupts = <26>;
+                       clock-names = "watchdog";
+                       clocks = <&clocks CLK_WDT>;
+               };
+
+               rtc: rtc@e2800000 {
+                       compatible = "samsung,s3c6410-rtc";
+                       reg = <0xe2800000 0x100>;
+                       interrupt-parent = <&vic0>;
+                       interrupts = <28>, <29>;
+                       clocks = <&clocks CLK_RTC>;
+                       clock-names = "rtc";
+                       status = "disabled";
+               };
+
+               uart0: serial@e2900000 {
+                       compatible = "samsung,s5pv210-uart";
+                       reg = <0xe2900000 0x400>;
+                       interrupt-parent = <&vic1>;
+                       interrupts = <10>;
+                       clock-names = "uart", "clk_uart_baud0",
+                                       "clk_uart_baud1";
+                       clocks = <&clocks CLK_UART0>, <&clocks CLK_UART0>,
+                                       <&clocks SCLK_UART0>;
+                       status = "disabled";
+               };
+
+               uart1: serial@e2900400 {
+                       compatible = "samsung,s5pv210-uart";
+                       reg = <0xe2900400 0x400>;
+                       interrupt-parent = <&vic1>;
+                       interrupts = <11>;
+                       clock-names = "uart", "clk_uart_baud0",
+                                       "clk_uart_baud1";
+                       clocks = <&clocks CLK_UART1>, <&clocks CLK_UART1>,
+                                       <&clocks SCLK_UART1>;
+                       status = "disabled";
+               };
+
+               uart2: serial@e2900800 {
+                       compatible = "samsung,s5pv210-uart";
+                       reg = <0xe2900800 0x400>;
+                       interrupt-parent = <&vic1>;
+                       interrupts = <12>;
+                       clock-names = "uart", "clk_uart_baud0",
+                                       "clk_uart_baud1";
+                       clocks = <&clocks CLK_UART2>, <&clocks CLK_UART2>,
+                                       <&clocks SCLK_UART2>;
+                       status = "disabled";
+               };
+
+               uart3: serial@e2900c00 {
+                       compatible = "samsung,s5pv210-uart";
+                       reg = <0xe2900c00 0x400>;
+                       interrupt-parent = <&vic1>;
+                       interrupts = <13>;
+                       clock-names = "uart", "clk_uart_baud0",
+                                       "clk_uart_baud1";
+                       clocks = <&clocks CLK_UART3>, <&clocks CLK_UART3>,
+                                       <&clocks SCLK_UART3>;
+                       status = "disabled";
+               };
+
+               sdhci0: sdhci@eb000000 {
+                       compatible = "samsung,s3c6410-sdhci";
+                       reg = <0xeb000000 0x100000>;
+                       interrupt-parent = <&vic1>;
+                       interrupts = <26>;
+                       clock-names = "hsmmc", "mmc_busclk.0", "mmc_busclk.2";
+                       clocks = <&clocks CLK_HSMMC0>, <&clocks CLK_HSMMC0>,
+                                       <&clocks SCLK_MMC0>;
+                       status = "disabled";
+               };
+
+               sdhci1: sdhci@eb100000 {
+                       compatible = "samsung,s3c6410-sdhci";
+                       reg = <0xeb100000 0x100000>;
+                       interrupt-parent = <&vic1>;
+                       interrupts = <27>;
+                       clock-names = "hsmmc", "mmc_busclk.0", "mmc_busclk.2";
+                       clocks = <&clocks CLK_HSMMC1>, <&clocks CLK_HSMMC1>,
+                                       <&clocks SCLK_MMC1>;
+                       status = "disabled";
+               };
+
+               sdhci2: sdhci@eb200000 {
+                       compatible = "samsung,s3c6410-sdhci";
+                       reg = <0xeb200000 0x100000>;
+                       interrupt-parent = <&vic1>;
+                       interrupts = <28>;
+                       clock-names = "hsmmc", "mmc_busclk.0", "mmc_busclk.2";
+                       clocks = <&clocks CLK_HSMMC2>, <&clocks CLK_HSMMC2>,
+                                       <&clocks SCLK_MMC2>;
+                       status = "disabled";
+               };
+
+               sdhci3: sdhci@eb300000 {
+                       compatible = "samsung,s3c6410-sdhci";
+                       reg = <0xeb300000 0x100000>;
+                       interrupt-parent = <&vic3>;
+                       interrupts = <2>;
+                       clock-names = "hsmmc", "mmc_busclk.0", "mmc_busclk.3";
+                       clocks = <&clocks CLK_HSMMC3>, <&clocks CLK_HSMMC3>,
+                                       <&clocks SCLK_MMC3>;
+                       status = "disabled";
+               };
+
+               hsotg: hsotg@ec000000 {
+                       compatible = "samsung,s3c6400-hsotg";
+                       reg = <0xec000000 0x20000>;
+                       interrupt-parent = <&vic1>;
+                       interrupts = <24>;
+                       clocks = <&clocks CLK_USB_OTG>;
+                       clock-names = "otg";
+                       phy-names = "usb2-phy";
+                       phys = <&usbphy 0>;
+                       status = "disabled";
+               };
+
+               usbphy: usbphy@ec100000 {
+                       compatible = "samsung,s5pv210-usb2-phy";
+                       reg = <0xec100000 0x100>;
+                       samsung,pmureg-phandle = <&pmu_syscon>;
+                       clocks = <&clocks CLK_USB_OTG>, <&xusbxti>;
+                       clock-names = "phy", "ref";
+                       #phy-cells = <1>;
+                       status = "disabled";
+               };
+
+               ehci: ehci@ec200000 {
+                       compatible = "samsung,exynos4210-ehci";
+                       reg = <0xec200000 0x100>;
+                       interrupts = <23>;
+                       interrupt-parent = <&vic1>;
+                       clocks = <&clocks CLK_USB_HOST>;
+                       clock-names = "usbhost";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       status = "disabled";
+
+                       port@0 {
+                               reg = <0>;
+                               phys = <&usbphy 1>;
+                       };
+               };
+
+               ohci: ohci@ec300000 {
+                       compatible = "samsung,exynos4210-ohci";
+                       reg = <0xec300000 0x100>;
+                       interrupts = <23>;
+                       clocks = <&clocks CLK_USB_HOST>;
+                       clock-names = "usbhost";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       status = "disabled";
+
+                       port@0 {
+                               reg = <0>;
+                               phys = <&usbphy 1>;
+                       };
+               };
+
+               mfc: codec@f1700000 {
+                       compatible = "samsung,mfc-v5";
+                       reg = <0xf1700000 0x10000>;
+                       interrupt-parent = <&vic2>;
+                       interrupts = <14>;
+                       clocks = <&clocks DOUT_MFC>, <&clocks CLK_MFC>;
+                       clock-names = "sclk_mfc", "mfc";
+               };
+
+               vic0: interrupt-controller@f2000000 {
+                       compatible = "arm,pl192-vic";
+                       interrupt-controller;
+                       reg = <0xf2000000 0x1000>;
+                       #interrupt-cells = <1>;
+               };
+
+               vic1: interrupt-controller@f2100000 {
+                       compatible = "arm,pl192-vic";
+                       interrupt-controller;
+                       reg = <0xf2100000 0x1000>;
+                       #interrupt-cells = <1>;
+               };
+
+               vic2: interrupt-controller@f2200000 {
+                       compatible = "arm,pl192-vic";
+                       interrupt-controller;
+                       reg = <0xf2200000 0x1000>;
+                       #interrupt-cells = <1>;
+               };
+
+               vic3: interrupt-controller@f2300000 {
+                       compatible = "arm,pl192-vic";
+                       interrupt-controller;
+                       reg = <0xf2300000 0x1000>;
+                       #interrupt-cells = <1>;
+               };
+
+               fimd: fimd@f8000000 {
+                       compatible = "samsung,exynos4210-fimd";
+                       interrupt-parent = <&vic2>;
+                       reg = <0xf8000000 0x20000>;
+                       interrupt-names = "fifo", "vsync", "lcd_sys";
+                       interrupts = <0>, <1>, <2>;
+                       clocks = <&clocks SCLK_FIMD>, <&clocks CLK_FIMD>;
+                       clock-names = "sclk_fimd", "fimd";
+                       status = "disabled";
+               };
+
+               g2d: g2d@fa000000 {
+                       compatible = "samsung,s5pv210-g2d";
+                       reg = <0xfa000000 0x1000>;
+                       interrupt-parent = <&vic2>;
+                       interrupts = <9>;
+                       clocks = <&clocks DOUT_G2D>, <&clocks CLK_G2D>;
+                       clock-names = "sclk_fimg2d", "fimg2d";
+               };
+
+               mdma1: mdma@fa200000 {
+                       compatible = "arm,pl330", "arm,primecell";
+                       reg = <0xfa200000 0x1000>;
+                       interrupt-parent = <&vic0>;
+                       interrupts = <18>;
+                       clocks = <&clocks CLK_MDMA>;
+                       clock-names = "apb_pclk";
+                       #dma-cells = <1>;
+                       #dma-channels = <8>;
+                       #dma-requests = <1>;
+               };
+
+               i2c1: i2c@fab00000 {
+                       compatible = "samsung,s3c2440-i2c";
+                       reg = <0xfab00000 0x1000>;
+                       interrupt-parent = <&vic2>;
+                       interrupts = <13>;
+                       clocks = <&clocks CLK_I2C1>;
+                       clock-names = "i2c";
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&i2c1_bus>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       status = "disabled";
+               };
+
+               camera: camera {
+                       compatible = "samsung,fimc", "simple-bus";
+                       pinctrl-names = "default";
+                       pinctrl-0 = <>;
+                       clocks = <&clocks SCLK_CAM0>, <&clocks SCLK_CAM1>;
+                       clock-names = "sclk_cam0", "sclk_cam1";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges;
+
+                       clock_cam: clock-controller {
+                               #clock-cells = <1>;
+                       };
+
+                       csis0: csis@fa600000 {
+                               compatible = "samsung,s5pv210-csis";
+                               reg = <0xfa600000 0x4000>;
+                               interrupt-parent = <&vic2>;
+                               interrupts = <29>;
+                               clocks = <&clocks CLK_CSIS>,
+                                               <&clocks SCLK_CSIS>;
+                               clock-names = "clk_csis",
+                                               "sclk_csis";
+                               bus-width = <4>;
+                               status = "disabled";
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                       };
+
+                       fimc0: fimc@fb200000 {
+                               compatible = "samsung,s5pv210-fimc";
+                               reg = <0xfb200000 0x1000>;
+                               interrupts = <5>;
+                               interrupt-parent = <&vic2>;
+                               clocks = <&clocks CLK_FIMC0>,
+                                               <&clocks SCLK_FIMC0>;
+                               clock-names = "fimc",
+                                               "sclk_fimc";
+                               samsung,pix-limits = <4224 8192 1920 4224>;
+                               samsung,mainscaler-ext;
+                               samsung,cam-if;
+                       };
+
+                       fimc1: fimc@fb300000 {
+                               compatible = "samsung,s5pv210-fimc";
+                               reg = <0xfb300000 0x1000>;
+                               interrupt-parent = <&vic2>;
+                               interrupts = <6>;
+                               clocks = <&clocks CLK_FIMC1>,
+                                               <&clocks SCLK_FIMC1>;
+                               clock-names = "fimc",
+                                               "sclk_fimc";
+                               samsung,pix-limits = <4224 8192 1920 4224>;
+                               samsung,mainscaler-ext;
+                               samsung,cam-if;
+                       };
+
+                       fimc2: fimc@fb400000 {
+                               compatible = "samsung,s5pv210-fimc";
+                               reg = <0xfb400000 0x1000>;
+                               interrupt-parent = <&vic2>;
+                               interrupts = <7>;
+                               clocks = <&clocks CLK_FIMC2>,
+                                               <&clocks SCLK_FIMC2>;
+                               clock-names = "fimc",
+                                               "sclk_fimc";
+                               samsung,pix-limits = <4224 8192 1920 4224>;
+                               samsung,mainscaler-ext;
+                               samsung,lcd-wb;
+                       };
+               };
+       };
+};
+
+#include "s5pv210-pinctrl.dtsi"
index e0b15a6e8897fe84860a04d26d5d581b3f3161cf..45013b867c8d2c414a93469c475c99446a3b0e71 100644 (file)
                reg = <0x20000000 0x8000000>;
        };
 
-       slow_xtal: slow_xtal {
-               compatible = "fixed-clock";
-               #clock-cells = <0>;
-               clock-frequency = <0>;
-       };
+       clocks {
+               slow_xtal: slow_xtal {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <0>;
+               };
 
-       main_xtal: main_xtal {
-               compatible = "fixed-clock";
-               #clock-cells = <0>;
-               clock-frequency = <0>;
-       };
+               main_xtal: main_xtal {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <0>;
+               };
 
-       clocks {
                adc_op_clk: adc_op_clk{
                        compatible = "fixed-clock";
                        #clock-cells = <0>;
index b0b1331c1974cf1a3c70a708cda0044e887ced54..f7d8583eef821938c876d4a4dbbeb26be6f7aa3a 100644 (file)
                reg = <0x20000000 0x20000000>;
        };
 
-       slow_xtal {
-               clock-frequency = <32768>;
-       };
+       clocks {
+               slow_xtal {
+                       clock-frequency = <32768>;
+               };
 
-       main_xtal {
-               clock-frequency = <12000000>;
+               main_xtal {
+                       clock-frequency = <12000000>;
+               };
        };
 
        ahb {
index 306eef0f97ef21fc51a0410d2e2a6d59186986b8..b8c6f20e780c995aa98a5c4061f8031d24f05798 100644 (file)
@@ -45,6 +45,8 @@
                                wm8904: wm8904@1a {
                                        compatible = "wm8904";
                                        reg = <0x1a>;
+                                       clocks = <&pck0>;
+                                       clock-names = "mclk";
                                };
                        };
 
index a99171c8a78222f97497b4d1de6f3897e2e5fca1..18662aec2ec48fb246818744216bda44f760a935 100644 (file)
        model = "KZM-A9-GT";
        compatible = "renesas,kzm9g-reference", "renesas,sh73a0";
 
+       aliases {
+               serial4 = &scifa4;
+       };
+
        cpus {
                cpu@0 {
                        cpu0-supply = <&vdd_dvfs>;
@@ -35,7 +39,7 @@
        };
 
        chosen {
-               bootargs = "console=tty0 console=ttySC4,115200 root=/dev/nfs ip=dhcp ignore_loglevel earlyprintk=sh-sci.4,115200 rw";
+               bootargs = "console=tty0 console=ttySC4,115200 root=/dev/nfs ip=dhcp ignore_loglevel rw";
        };
 
        memory {
 };
 
 &pfc {
-       pinctrl-0 = <&scifa4_pins>;
-       pinctrl-names = "default";
-
        i2c3_pins: i2c3 {
                renesas,groups = "i2c3_1";
                renesas,function = "i2c3";
        };
 };
 
+&scifa4 {
+       pinctrl-0 = <&scifa4_pins>;
+       pinctrl-names = "default";
+
+       status = "okay";
+};
+
 &sdhi0 {
        pinctrl-0 = <&sdhi0_pins>;
        pinctrl-names = "default";
index 5ecf552e1c009faf2317793e2b52ab6f24fc5655..910b79079d5a26d2740296df0a2ebae264962794 100644 (file)
                status = "disabled";
        };
 
+       scifa0: serial@e6c40000 {
+               compatible = "renesas,scifa-sh73a0", "renesas,scifa";
+               reg = <0xe6c40000 0x100>;
+               interrupt-parent = <&gic>;
+               interrupts = <0 72 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+       };
+
+       scifa1: serial@e6c50000 {
+               compatible = "renesas,scifa-sh73a0", "renesas,scifa";
+               reg = <0xe6c50000 0x100>;
+               interrupt-parent = <&gic>;
+               interrupts = <0 73 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+       };
+
+       scifa2: serial@e6c60000 {
+               compatible = "renesas,scifa-sh73a0", "renesas,scifa";
+               reg = <0xe6c60000 0x100>;
+               interrupt-parent = <&gic>;
+               interrupts = <0 74 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+       };
+
+       scifa3: serial@e6c70000 {
+               compatible = "renesas,scifa-sh73a0", "renesas,scifa";
+               reg = <0xe6c70000 0x100>;
+               interrupt-parent = <&gic>;
+               interrupts = <0 75 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+       };
+
+       scifa4: serial@e6c80000 {
+               compatible = "renesas,scifa-sh73a0", "renesas,scifa";
+               reg = <0xe6c80000 0x100>;
+               interrupt-parent = <&gic>;
+               interrupts = <0 78 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+       };
+
+       scifa5: serial@e6cb0000 {
+               compatible = "renesas,scifa-sh73a0", "renesas,scifa";
+               reg = <0xe6cb0000 0x100>;
+               interrupt-parent = <&gic>;
+               interrupts = <0 79 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+       };
+
+       scifa6: serial@e6cc0000 {
+               compatible = "renesas,scifa-sh73a0", "renesas,scifa";
+               reg = <0xe6cc0000 0x100>;
+               interrupt-parent = <&gic>;
+               interrupts = <0 156 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+       };
+
+       scifa7: serial@e6cd0000 {
+               compatible = "renesas,scifa-sh73a0", "renesas,scifa";
+               reg = <0xe6cd0000 0x100>;
+               interrupt-parent = <&gic>;
+               interrupts = <0 143 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+       };
+
+       scifb8: serial@e6c30000 {
+               compatible = "renesas,scifb-sh73a0", "renesas,scifb";
+               reg = <0xe6c30000 0x100>;
+               interrupt-parent = <&gic>;
+               interrupts = <0 80 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+       };
+
        pfc: pfc@e6050000 {
                compatible = "renesas,pfc-sh73a0";
                reg = <0xe6050000 0x8000>,
index 70fdd20648118d27807447b4213ff3fc9962e791..4d77ad690ed54d93bb863ded9f8b088b47f9ae9f 100644 (file)
                };
 
                rst: rstmgr@ffd05000 {
+                       #reset-cells = <1>;
                        compatible = "altr,rst-mgr";
                        reg = <0xffd05000 0x1000>;
                };
index b56a801e42a206451535684d6314a09063d6351c..d42c84b1df8d02aa4199ac01e68ee547458576d1 100644 (file)
                        status = "okay";
                };
 
+               miphy@eb800000 {
+                       status = "okay";
+               };
+
                cf@b2800000 {
                        status = "okay";
                };
index 122ae94076c8a7785e2bf1e92c97dfee77bbc674..fa5f2bb5f106fd29aafddb40be9e821feab4ce86 100644 (file)
                        #gpio-cells = <2>;
                };
 
-               ahci@b1000000 {
+               miphy0: miphy@eb800000 {
+                       compatible = "st,spear1310-miphy";
+                       reg = <0xeb800000 0x4000>;
+                       misc = <&misc>;
+                       phy-id = <0>;
+                       #phy-cells = <1>;
+                       status = "disabled";
+               };
+
+               miphy1: miphy@eb804000 {
+                       compatible = "st,spear1310-miphy";
+                       reg = <0xeb804000 0x4000>;
+                       misc = <&misc>;
+                       phy-id = <1>;
+                       #phy-cells = <1>;
+                       status = "disabled";
+               };
+
+               miphy2: miphy@eb808000 {
+                       compatible = "st,spear1310-miphy";
+                       reg = <0xeb808000 0x4000>;
+                       misc = <&misc>;
+                       phy-id = <2>;
+                       #phy-cells = <1>;
+                       status = "disabled";
+               };
+
+               ahci0: ahci@b1000000 {
                        compatible = "snps,spear-ahci";
                        reg = <0xb1000000 0x10000>;
                        interrupts = <0 68 0x4>;
+                       phys = <&miphy0 0>;
+                       phy-names = "sata-phy";
                        status = "disabled";
                };
 
-               ahci@b1800000 {
+               ahci1: ahci@b1800000 {
                        compatible = "snps,spear-ahci";
                        reg = <0xb1800000 0x10000>;
                        interrupts = <0 69 0x4>;
+                       phys = <&miphy1 0>;
+                       phy-names = "sata-phy";
                        status = "disabled";
                };
 
-               ahci@b4000000 {
+               ahci2: ahci@b4000000 {
                        compatible = "snps,spear-ahci";
                        reg = <0xb4000000 0x10000>;
                        interrupts = <0 70 0x4>;
+                       phys = <&miphy2 0>;
+                       phy-names = "sata-phy";
+                       status = "disabled";
+               };
+
+               pcie0: pcie@b1000000 {
+                       compatible = "st,spear1340-pcie", "snps,dw-pcie";
+                       reg = <0xb1000000 0x4000>;
+                       interrupts = <0 68 0x4>;
+                       interrupt-map-mask = <0 0 0 0>;
+                       interrupt-map = <0x0 0 &gic 0 68 0x4>;
+                       num-lanes = <1>;
+                       phys = <&miphy0 1>;
+                       phy-names = "pcie-phy";
+                       #address-cells = <3>;
+                       #size-cells = <2>;
+                       device_type = "pci";
+                       ranges = <0x00000800 0 0x80000000 0x80000000 0 0x00020000   /* configuration space */
+                               0x81000000 0 0   0x80020000 0 0x00010000   /* downstream I/O */
+                               0x82000000 0 0x80030000 0xc0030000 0 0x0ffd0000>; /* non-prefetchable memory */
+                       status = "disabled";
+               };
+
+               pcie1: pcie@b1800000 {
+                       compatible = "st,spear1340-pcie", "snps,dw-pcie";
+                       reg = <0xb1800000 0x4000>;
+                       interrupts = <0 69 0x4>;
+                       interrupt-map-mask = <0 0 0 0>;
+                       interrupt-map = <0x0 0 &gic 0 69 0x4>;
+                       num-lanes = <1>;
+                       phys = <&miphy1 1>;
+                       phy-names = "pcie-phy";
+                       #address-cells = <3>;
+                       #size-cells = <2>;
+                       device_type = "pci";
+                       ranges = <0x00000800 0 0x90000000 0x90000000 0 0x00020000   /* configuration space */
+                               0x81000000 0 0  0x90020000 0 0x00010000   /* downstream I/O */
+                               0x82000000 0 0x90030000 0x90030000 0 0x0ffd0000>; /* non-prefetchable memory */
+                       status = "disabled";
+               };
+
+               pcie2: pcie@b4000000 {
+                       compatible = "st,spear1340-pcie", "snps,dw-pcie";
+                       reg = <0xb4000000 0x4000>;
+                       interrupts = <0 70 0x4>;
+                       interrupt-map-mask = <0 0 0 0>;
+                       interrupt-map = <0x0 0 &gic 0 70 0x4>;
+                       num-lanes = <1>;
+                       phys = <&miphy2 1>;
+                       phy-names = "pcie-phy";
+                       #address-cells = <3>;
+                       #size-cells = <2>;
+                       device_type = "pci";
+                       ranges = <0x00000800 0 0xc0000000 0xc0000000 0 0x00020000   /* configuration space */
+                               0x81000000 0 0   0xc0020000 0 0x00010000   /* downstream I/O */
+                               0x82000000 0 0xc0030000 0xc0030000 0 0x0ffd0000>; /* non-prefetchable memory */
                        status = "disabled";
                };
 
index d6c30ae0a8d75edc1fee019b1892d341401818fd..b23e05ed1d60226d36f3649b3e1a12ee2928c4bd 100644 (file)
                        status = "okay";
                };
 
+               miphy@eb800000 {
+                       status = "okay";
+               };
+
                dma@ea800000 {
                        status = "okay";
                };
index 54d128d35681a660d2625344a54f06a10ee0bf0b..e71df0f2cb52d579bcfef4d114cba5d6e5acddfb 100644 (file)
                        status = "disabled";
                };
 
-               ahci@b1000000 {
+               miphy0: miphy@eb800000 {
+                       compatible = "st,spear1340-miphy";
+                       reg = <0xeb800000 0x4000>;
+                       misc = <&misc>;
+                       #phy-cells = <1>;
+                       status = "disabled";
+               };
+
+               ahci0: ahci@b1000000 {
                        compatible = "snps,spear-ahci";
                        reg = <0xb1000000 0x10000>;
                        interrupts = <0 72 0x4>;
+                       phys = <&miphy0 0>;
+                       phy-names = "sata-phy";
+                       status = "disabled";
+               };
+
+               pcie0: pcie@b1000000 {
+                       compatible = "st,spear1340-pcie", "snps,dw-pcie";
+                       reg = <0xb1000000 0x4000>;
+                       interrupts = <0 68 0x4>;
+                       interrupt-map-mask = <0 0 0 0>;
+                       interrupt-map = <0x0 0 &gic 0 68 0x4>;
+                       num-lanes = <1>;
+                       phys = <&miphy0 1>;
+                       phy-names = "pcie-phy";
+                       #address-cells = <3>;
+                       #size-cells = <2>;
+                       device_type = "pci";
+                       ranges = <0x00000800 0 0x80000000 0x80000000 0 0x00020000   /* configuration space */
+                               0x81000000 0 0   0x80020000 0 0x00010000   /* downstream I/O */
+                               0x82000000 0 0x80030000 0xc0030000 0 0x0ffd0000>; /* non-prefetchable memory */
                        status = "disabled";
                };
 
index 4382547df58a70554abf0ca641175bc5cda2bc04..a6eb5436d26d45f62f336b86fb0be8f06ea560bd 100644 (file)
@@ -83,8 +83,8 @@
                #size-cells = <1>;
                compatible = "simple-bus";
                ranges = <0x50000000 0x50000000 0x10000000
-                         0xb0000000 0xb0000000 0x10000000
-                         0xd0000000 0xd0000000 0x02000000
+                         0x80000000 0x80000000 0x20000000
+                         0xb0000000 0xb0000000 0x22000000
                          0xd8000000 0xd8000000 0x01000000
                          0xe0000000 0xe0000000 0x10000000>;
 
                                  0xd8000000 0xd8000000 0x01000000
                                  0xe0000000 0xe0000000 0x10000000>;
 
+                       misc: syscon@e0700000 {
+                               compatible = "st,spear1340-misc", "syscon";
+                               reg = <0xe0700000 0x1000>;
+                       };
+
                        gpio0: gpio@e0600000 {
                                compatible = "arm,pl061", "arm,primecell";
                                reg = <0xe0600000 0x1000>;
index e41eedca3ce3c562a27fff268f09c43429cbc10f..9d2323020d340b4138dc5b5895d95ace4e8a7211 100644 (file)
                        reg = <0x80119000 0x1000>;
                        interrupts = <0 59 IRQ_TYPE_LEVEL_HIGH>;
 
+                       dmas = <&dma 41 0 0x2>, /* Logical - DevToMem */
+                              <&dma 41 0 0x0>; /* Logical - MemToDev */
+                       dma-names = "rx", "tx";
+
                        clocks = <&prcc_kclk 2 5>, <&prcc_pclk 2 7>;
                        clock-names = "sdi", "apb_pclk";
 
                        reg = <0x80008000 0x1000>;
                        interrupts = <0 100 IRQ_TYPE_LEVEL_HIGH>;
 
+                       dmas = <&dma 43 0 0x2>, /* Logical - DevToMem */
+                              <&dma 43 0 0x0>; /* Logical - MemToDev */
+                       dma-names = "rx", "tx";
+
                        clocks = <&prcc_kclk 3 7>, <&prcc_pclk 3 7>;
                        clock-names = "sdi", "apb_pclk";
 
                        interrupts = <0 62 IRQ_TYPE_LEVEL_HIGH>;
                        v-ape-supply = <&db8500_vape_reg>;
 
+                       /* This DMA channel only exist on DB8500 v1 */
                        dmas = <&dma 30 0 0x10>; /* Logical - MemToDev - HighPrio */
                        dma-names = "tx";
 
                        interrupts = <0 62 IRQ_TYPE_LEVEL_HIGH>;
                        v-ape-supply = <&db8500_vape_reg>;
 
+                       /* This DMA channel only exist on DB8500 v2 */
                        dmas = <&dma 30 0 0x12>; /* Logical - DevToMem - HighPrio */
                        dma-names = "rx";
 
index 1c3574435ea81fe6f275aff7244c6fd828cd99d0..84d7c5d883f26bb5c8a181a6b9bc32d42ac23cc3 100644 (file)
@@ -42,6 +42,8 @@
                                interrupts = <26 IRQ_TYPE_EDGE_FALLING>;
                                interrupt-parent = <&gpio6>;
                                interrupt-controller;
+                               vcc-supply = <&db8500_vsmps2_reg>;
+                               vio-supply = <&db8500_vsmps2_reg>;
 
                                wakeup-source;
                                st,autosleep-timeout = <1024>;
index c40565320978e78f71c7d798476ba2b9b4a62689..18b65d1b14f2e9197d7ccdfb31d63f84ab4fe75b 100644 (file)
                                };
                        };
                };
+               /* Sensors mounted on this board variant */
+               i2c@80128000 {
+                       lsm303dlh@18 {
+                               /* Accelerometer */
+                               compatible = "st,lsm303dlh-accel";
+                               st,drdy-int-pin = <1>;
+                               reg = <0x18>;
+                               vdd-supply = <&ab8500_ldo_aux1_reg>;
+                               vddio-supply = <&db8500_vsmps2_reg>;
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&accel_tvk_mode>;
+                       };
+                       lsm303dlm@1e {
+                               /* Magnetometer */
+                               compatible = "st,lsm303dlm-magn";
+                               reg = <0x1e>;
+                               vdd-supply = <&ab8500_ldo_aux1_reg>;
+                               vddio-supply = <&db8500_vsmps2_reg>;
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&magneto_tvk_mode>;
+                       };
+                       l3g4200d@68 {
+                               /* Gyroscope */
+                               compatible = "st,l3g4200d-gyro";
+                               st,drdy-int-pin = <2>;
+                               reg = <0x68>;
+                               vdd-supply = <&ab8500_ldo_aux1_reg>;
+                               vddio-supply = <&db8500_vsmps2_reg>;
+                       };
+                       lsp001wm@5c {
+                               /* Barometer/pressure sensor */
+                               compatible = "st,lps001wp-press";
+                               reg = <0x5c>;
+                               vdd-supply = <&ab8500_ldo_aux1_reg>;
+                               vddio-supply = <&db8500_vsmps2_reg>;
+                       };
+               };
                pinctrl {
                        /* Pull up this GPIO pin */
                        tc35893 {
                                        };
                                };
                        };
+                       accelerometer {
+                               accel_tvk_mode: accel_tvk {
+                                       /* Accelerometer interrupt lines 1 & 2 */
+                                       tvk_cfg {
+                                               ste,pins = "GPIO82_C1", "GPIO83_D3";
+                                               ste,config = <&gpio_in_pu>;
+                                       };
+                               };
+                       };
+                       magnetometer {
+                               magneto_tvk_mode: magneto_tvk {
+                                       /* Magnetometer uses GPIO 31 and 32, pull these up/down respectively */
+                                       tvk_cfg1 {
+                                               ste,pins = "GPIO31_V3";
+                                               ste,config = <&gpio_in_pu>;
+                                       };
+                                       tvk_cfg2 {
+                                               ste,pins = "GPIO32_V2";
+                                               ste,config = <&gpio_in_pd>;
+                                       };
+                               };
+                       };
                };
        };
 };
index c2341061b943290bbd5c897158a4a8c6bdd441cc..bcc1f0c37f49c42b40dc197c6e5ffb9b1b29b0da 100644 (file)
@@ -35,8 +35,6 @@
                         */
                        pinctrl-names = "default";
                        pinctrl-0 = <&ipgpio_hrefv60_mode>,
-                                 <&accel_hrefv60_mode>,
-                                 <&magneto_hrefv60_mode>,
                                  <&etm_hrefv60_mode>,
                                  <&nahj_hrefv60_mode>,
                                  <&nfc_hrefv60_mode>,
                                        };
                                };
                        };
-                       accelerometer {
-                               accel_hrefv60_mode: accel_hrefv60 {
-                                       /* Accelerometer interrupt lines 1 & 2 */
-                                       hrefv60_cfg1 {
-                                               ste,pins = "GPIO82_C1", "GPIO83_D3";
-                                               ste,config = <&gpio_in_pu>;
-                                       };
-                               };
-                       };
-                       magnetometer {
-                               magneto_hrefv60_mode: magneto_hrefv60 {
-                                       /* Magnetometer uses GPIO 31 and 32, pull these up/down respectively */
-                                       hrefv60_cfg1 {
-                                               ste,pins = "GPIO31_V3";
-                                               ste,config = <&gpio_in_pu>;
-                                       };
-                                       hrefv60_cfg2 {
-                                               ste,pins = "GPIO32_V2";
-                                               ste,config = <&gpio_in_pd>;
-                                       };
-                               };
-                       };
                        etm {
                                /*
                                 * Drive D19-D23 for the ETM PTM trace interface low,
index 474ef83229cd9b368a9604205d9e8c8a42c68972..4a2000c620ad7a6a77f3b7aec18efc9a79e3a94e 100644 (file)
                        pinctrl-names = "default","sleep";
                        pinctrl-0 = <&i2c2_default_mode>;
                        pinctrl-1 = <&i2c2_sleep_mode>;
+                       lsm303dlh@18 {
+                               /* Accelerometer */
+                               compatible = "st,lsm303dlh-accel";
+                               st,drdy-int-pin = <1>;
+                               reg = <0x18>;
+                               vdd-supply = <&ab8500_ldo_aux1_reg>;
+                               vddio-supply = <&db8500_vsmps2_reg>;
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&accel_snowball_mode>;
+                       };
+                       lsm303dlm@1e {
+                               /* Magnetometer */
+                               compatible = "st,lsm303dlm-magn";
+                               reg = <0x1e>;
+                               vdd-supply = <&ab8500_ldo_aux1_reg>;
+                               vddio-supply = <&db8500_vsmps2_reg>;
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&magneto_snowball_mode>;
+                       };
+                       l3g4200d@68 {
+                               /* Gyroscope */
+                               compatible = "st,l3g4200d-gyro";
+                               st,drdy-int-pin = <2>;
+                               reg = <0x68>;
+                               vdd-supply = <&ab8500_ldo_aux1_reg>;
+                               vddio-supply = <&db8500_vsmps2_reg>;
+                       };
+                       lsp001wm@5c {
+                               /* Barometer/pressure sensor */
+                               compatible = "st,lps001wp-press";
+                               reg = <0x5c>;
+                               vdd-supply = <&ab8500_ldo_aux1_reg>;
+                               vddio-supply = <&db8500_vsmps2_reg>;
+                       };
                };
 
                i2c@80110000 {
                         * can be moved over to being controlled by respective device.
                         */
                        pinctrl-names = "default";
-                       pinctrl-0 = <&accel_snowball_mode>,
-                                 <&magneto_snowball_mode>,
-                                 <&gbf_snowball_mode>,
+                       pinctrl-0 = <&gbf_snowball_mode>,
                                  <&wlan_snowball_mode>;
 
                        ethernet {
index 0b97c071dd56b974897fcd2e445aeb1b23bac879..9e99ade35e37b3e2117bd1b3fd9ef304875cdfc2 100644 (file)
                        };
                };
 
+               ir0: ir@01c21800 {
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&ir0_pins_a>;
+                       status = "okay";
+               };
+
                uart0: serial@01c28000 {
                        pinctrl-names = "default";
                        pinctrl-0 = <&uart0_pins_a>;
                        pinctrl-names = "default";
                        pinctrl-0 = <&i2c0_pins_a>;
                        status = "okay";
+
+                       axp209: pmic@34 {
+                               compatible = "x-powers,axp209";
+                               reg = <0x34>;
+                               interrupts = <0>;
+
+                               interrupt-controller;
+                               #interrupt-cells = <1>;
+                       };
                };
        };
 
diff --git a/arch/arm/boot/dts/sun4i-a10-ba10-tvbox.dts b/arch/arm/boot/dts/sun4i-a10-ba10-tvbox.dts
new file mode 100644 (file)
index 0000000..1763cc7
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2014 Hans de Goede <hdegoede@redhat.com>
+ *
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/dts-v1/;
+/include/ "sun4i-a10.dtsi"
+/include/ "sunxi-common-regulators.dtsi"
+
+/ {
+       model = "BA10 tvbox";
+       compatible = "allwinner,ba10-tvbox", "allwinner,sun4i-a10";
+
+       soc@01c00000 {
+               emac: ethernet@01c0b000 {
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&emac_pins_a>;
+                       phy = <&phy1>;
+                       status = "okay";
+               };
+
+               mdio@01c0b080 {
+                       status = "okay";
+
+                       phy1: ethernet-phy@1 {
+                               reg = <1>;
+                       };
+               };
+
+               mmc0: mmc@01c0f000 {
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&mmc0_pins_a>, <&mmc0_cd_pin_reference_design>;
+                       vmmc-supply = <&reg_vcc3v3>;
+                       bus-width = <4>;
+                       cd-gpios = <&pio 7 1 0>; /* PH1 */
+                       cd-inverted;
+                       status = "okay";
+               };
+
+               usbphy: phy@01c13400 {
+                       usb1_vbus-supply = <&reg_usb1_vbus>;
+                       usb2_vbus-supply = <&reg_usb2_vbus>;
+                       status = "okay";
+               };
+
+               ehci0: usb@01c14000 {
+                       status = "okay";
+               };
+
+               ohci0: usb@01c14400 {
+                       status = "okay";
+               };
+
+               ehci1: usb@01c1c000 {
+                       status = "okay";
+               };
+
+               ohci1: usb@01c1c400 {
+                       status = "okay";
+               };
+
+               pinctrl@01c20800 {
+                       usb2_vbus_pin_a: usb2_vbus_pin@0 {
+                               allwinner,pins = "PH12";
+                       };
+               };
+
+               ir0: ir@01c21800 {
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&ir0_pins_a>;
+                       status = "okay";
+               };
+
+               uart0: serial@01c28000 {
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&uart0_pins_a>;
+                       status = "okay";
+               };
+
+               i2c0: i2c@01c2ac00 {
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&i2c0_pins_a>;
+                       status = "okay";
+
+                       axp209: pmic@34 {
+                               compatible = "x-powers,axp209";
+                               reg = <0x34>;
+                               interrupts = <0>;
+
+                               interrupt-controller;
+                               #interrupt-cells = <1>;
+                       };
+               };
+       };
+
+       reg_usb1_vbus: usb1-vbus {
+               status = "okay";
+       };
+
+       reg_usb2_vbus: usb2-vbus {
+               gpio = <&pio 7 12 0>;
+               status = "okay";
+       };
+};
index c200eacc66e8ba06f4d578b569b0d1063fa59b0f..3ce56bfbc0b5f6ee46b685112648b5c9af7c8fbf 100644 (file)
                        };
                };
 
+               ir0: ir@01c21800 {
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&ir0_pins_a>;
+                       status = "okay";
+               };
+
                uart0: serial@01c28000 {
                        pinctrl-names = "default";
                        pinctrl-0 = <&uart0_pins_a>;
                        pinctrl-names = "default";
                        pinctrl-0 = <&i2c0_pins_a>;
                        status = "okay";
+
+                       axp209: pmic@34 {
+                               compatible = "x-powers,axp209";
+                               reg = <0x34>;
+                               interrupts = <0>;
+
+                               interrupt-controller;
+                               #interrupt-cells = <1>;
+                       };
                };
 
                i2c1: i2c@01c2b000 {
index 547fadcb984b98e8296f2865ccd2c1a8f52df01c..891ea446abae9480f189b2d95fb31608ca5aa3f9 100644 (file)
                        };
                };
 
+               ir0: ir@01c21800 {
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&ir0_pins_a>;
+                       status = "okay";
+               };
+
                uart0: serial@01c28000 {
                        pinctrl-names = "default";
                        pinctrl-0 = <&uart0_pins_a>;
                        status = "okay";
                };
+
+               i2c0: i2c@01c2ac00 {
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&i2c0_pins_a>;
+                       status = "okay";
+
+                       axp209: pmic@34 {
+                               compatible = "x-powers,axp209";
+                               reg = <0x34>;
+                               interrupts = <0>;
+
+                               interrupt-controller;
+                               #interrupt-cells = <1>;
+                       };
+               };
        };
 
        reg_emac_3v3: emac-3v3 {
index f13723e18b86964a1e486bdcea013cce0942691a..6b0c37812ade80ef457fe38b56d114be02659c28 100644 (file)
                        status = "okay";
                };
 
-               i2c0: i2c@01c2ac00 {
-                       pinctrl-names = "default";
-                       pinctrl-0 = <&i2c0_pins_a>;
-                       status = "okay";
-               };
-
                usbphy: phy@01c13400 {
                        usb1_vbus-supply = <&reg_usb1_vbus>;
                        usb2_vbus-supply = <&reg_usb2_vbus>;
                ohci1: usb@01c1c400 {
                        status = "okay";
                };
+
+               i2c0: i2c@01c2ac00 {
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&i2c0_pins_a>;
+                       status = "okay";
+
+                       axp209: pmic@34 {
+                               compatible = "x-powers,axp209";
+                               reg = <0x34>;
+                               interrupts = <0>;
+
+                               interrupt-controller;
+                               #interrupt-cells = <1>;
+                       };
+               };
        };
 
        reg_usb1_vbus: usb1-vbus {
index c01cea50cf0c7f175ec594ad31b645dbbd240256..b9ecce60f2e7e68d77621ec9a99a4b2ddbedd07a 100644 (file)
                        status = "okay";
                };
 
+               pinctrl@01c20800 {
+                       ir0_pins_a: ir0@0 {
+                               /* The ir receiver is not always populated */
+                               allwinner,pull = <1>;
+                       };
+               };
+
+               ir0: ir@01c21800 {
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&ir0_pins_a>;
+                       status = "okay";
+               };
+
                uart0: serial@01c28000 {
                        pinctrl-names = "default";
                        pinctrl-0 = <&uart0_pins_a>;
                        status = "okay";
                };
+
+               i2c0: i2c@01c2ac00 {
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&i2c0_pins_a>;
+                       status = "okay";
+
+                       axp209: pmic@34 {
+                               compatible = "x-powers,axp209";
+                               reg = <0x34>;
+                               interrupts = <0>;
+
+                               interrupt-controller;
+                               #interrupt-cells = <1>;
+                       };
+               };
        };
 
        reg_usb1_vbus: usb1-vbus {
index d46a7dbecef5b241f09755ab77a9707f6a76a30a..d046d568f5a1f1f55b93a387e205838e9499aee2 100644 (file)
                        pinctrl-0 = <&uart0_pins_a>;
                        status = "okay";
                };
+
+               i2c0: i2c@01c2ac00 {
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&i2c0_pins_a>;
+                       status = "okay";
+
+                       axp209: pmic@34 {
+                               compatible = "x-powers,axp209";
+                               reg = <0x34>;
+                               interrupts = <0>;
+
+                               interrupt-controller;
+                               #interrupt-cells = <1>;
+                       };
+               };
        };
 
        leds {
index fb03bccb78d2b5f085b75478d942980e46ddcee4..6675bcd7860e8eea367ca0fd9975e3ff2aea95b9 100644 (file)
                        pinctrl-names = "default";
                        pinctrl-0 = <&i2c0_pins_a>;
                        status = "okay";
+
+                       axp209: pmic@34 {
+                               compatible = "x-powers,axp209";
+                               reg = <0x34>;
+                               interrupts = <0>;
+
+                               interrupt-controller;
+                               #interrupt-cells = <1>;
+                       };
                };
        };
 
index d96e179490ce8a154a3653b69a585f9ded5cd835..459cb63777641ed594b3ca85c8d738dae969a2ce 100644 (file)
                        clocks = <&apb0_gates 5>;
                        gpio-controller;
                        interrupt-controller;
-                       #address-cells = <1>;
+                       #interrupt-cells = <2>;
                        #size-cells = <0>;
                        #gpio-cells = <3>;
 
                                allwinner,drive = <0>;
                                allwinner,pull = <1>;
                        };
+
+                       ir0_pins_a: ir0@0 {
+                               allwinner,pins = "PB3","PB4";
+                               allwinner,function = "ir0";
+                               allwinner,drive = <0>;
+                               allwinner,pull = <0>;
+                       };
+
+                       ir1_pins_a: ir1@0 {
+                               allwinner,pins = "PB22","PB23";
+                               allwinner,function = "ir1";
+                               allwinner,drive = <0>;
+                               allwinner,pull = <0>;
+                       };
                };
 
                timer@01c20c00 {
                        status = "disabled";
                };
 
+               ir0: ir@01c21800 {
+                       compatible = "allwinner,sun4i-a10-ir";
+                       clocks = <&apb0_gates 6>, <&ir0_clk>;
+                       clock-names = "apb", "ir";
+                       interrupts = <5>;
+                       reg = <0x01c21800 0x40>;
+                       status = "disabled";
+               };
+
+               ir1: ir@01c21c00 {
+                       compatible = "allwinner,sun4i-a10-ir";
+                       clocks = <&apb0_gates 7>, <&ir1_clk>;
+                       clock-names = "apb", "ir";
+                       interrupts = <6>;
+                       reg = <0x01c21c00 0x40>;
+                       status = "disabled";
+               };
+
                sid: eeprom@01c23800 {
                        compatible = "allwinner,sun4i-a10-sid";
                        reg = <0x01c23800 0x10>;
index b64f705d90080888024ff1d977e0ca57eafd3915..24b0ad3a7c07f53a2af4bb1e22c3ba4f20e3d03d 100644 (file)
                        clocks = <&apb0_gates 5>;
                        gpio-controller;
                        interrupt-controller;
-                       #address-cells = <1>;
+                       #interrupt-cells = <2>;
                        #size-cells = <0>;
                        #gpio-cells = <3>;
 
index 3b2a94c40f6e3f7ee7666c534149715f7d7e8b7d..bf86e65dd167bf2aad4131c1060d57698fedfc77 100644 (file)
                        clocks = <&apb0_gates 5>;
                        gpio-controller;
                        interrupt-controller;
-                       #address-cells = <1>;
+                       #interrupt-cells = <2>;
                        #size-cells = <0>;
                        #gpio-cells = <3>;
 
diff --git a/arch/arm/boot/dts/sun6i-a31-hummingbird.dts b/arch/arm/boot/dts/sun6i-a31-hummingbird.dts
new file mode 100644 (file)
index 0000000..f142065
--- /dev/null
@@ -0,0 +1,119 @@
+/*
+ * Copyright 2014 Maxime Ripard
+ *
+ * Maxime Ripard <maxime.ripard@free-electrons.com>
+ *
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/dts-v1/;
+/include/ "sun6i-a31.dtsi"
+/include/ "sunxi-common-regulators.dtsi"
+
+/ {
+       model = "Merrii A31 Hummingbird";
+       compatible = "merrii,a31-hummingbird", "allwinner,sun6i-a31";
+
+       chosen {
+               bootargs = "earlyprintk console=ttyS0,115200";
+       };
+
+       soc@01c00000 {
+               mmc0: mmc@01c0f000 {
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&mmc0_pins_a>, <&mmc0_cd_pin_hummingbird>;
+                       vmmc-supply = <&reg_vcc3v0>;
+                       bus-width = <4>;
+                       cd-gpios = <&pio 0 8 0>; /* PA8 */
+                       cd-inverted;
+                       status = "okay";
+               };
+
+               usbphy: phy@01c19400 {
+                       usb1_vbus-supply = <&reg_usb1_vbus>;
+                       status = "okay";
+               };
+
+               ehci0: usb@01c1a000 {
+                       status = "okay";
+               };
+
+               ohci0: usb@01c1a400 {
+                       status = "okay";
+               };
+
+               pio: pinctrl@01c20800 {
+                       mmc0_pins_a: mmc0@0 {
+                               /* external pull-ups missing for some pins */
+                               allwinner,pull = <1>;
+                       };
+
+                       mmc0_cd_pin_hummingbird: mmc0_cd_pin@0 {
+                               allwinner,pins = "PA8";
+                               allwinner,function = "gpio_in";
+                               allwinner,drive = <0>;
+                               allwinner,pull = <1>;
+                       };
+
+                       usb1_vbus_pin_a: usb1_vbus_pin@0 {
+                               allwinner,pins = "PH24";
+                               allwinner,function = "gpio_out";
+                               allwinner,drive = <0>;
+                               allwinner,pull = <0>;
+                       };
+               };
+
+               uart0: serial@01c28000 {
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&uart0_pins_a>;
+                       status = "okay";
+               };
+
+               i2c0: i2c@01c2ac00 {
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&i2c0_pins_a>;
+                       /* pull-ups and devices require AXP221 DLDO3 */
+                       status = "failed";
+               };
+
+               i2c1: i2c@01c2b000 {
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&i2c1_pins_a>;
+                       status = "okay";
+               };
+
+               i2c2: i2c@01c2b400 {
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&i2c2_pins_a>;
+                       status = "okay";
+
+                       pcf8563: rtc@51 {
+                               compatible = "nxp,pcf8563";
+                               reg = <0x51>;
+                       };
+               };
+
+               gmac: ethernet@01c30000 {
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&gmac_pins_rgmii_a>;
+                       phy = <&phy1>;
+                       phy-mode = "rgmii";
+                       status = "okay";
+
+                       phy1: ethernet-phy@1 {
+                               reg = <1>;
+                       };
+               };
+       };
+
+       reg_usb1_vbus: usb1-vbus {
+               pinctrl-0 = <&usb1_vbus_pin_a>;
+               gpio = <&pio 7 24 0>; /* PH24 */
+               status = "okay";
+       };
+};
index a9dfa12eb73502d521f679d62c6af9b9fb62d7f9..44b07e512c2448cbc24821668dc43ceaf6915638 100644 (file)
@@ -23,6 +23,7 @@
                serial3 = &uart3;
                serial4 = &uart4;
                serial5 = &uart5;
+               ethernet0 = &gmac;
        };
 
 
                                             "usb_ohci0", "usb_ohci1",
                                             "usb_ohci2";
                };
+
+               /*
+                * The following two are dummy clocks, placeholders used in the gmac_tx
+                * clock. The gmac driver will choose one parent depending on the PHY
+                * interface mode, using clk_set_rate auto-reparenting.
+                * The actual TX clock rate is not controlled by the gmac_tx clock.
+                */
+               mii_phy_tx_clk: clk@1 {
+                       #clock-cells = <0>;
+                       compatible = "fixed-clock";
+                       clock-frequency = <25000000>;
+                       clock-output-names = "mii_phy_tx";
+               };
+
+               gmac_int_tx_clk: clk@2 {
+                       #clock-cells = <0>;
+                       compatible = "fixed-clock";
+                       clock-frequency = <125000000>;
+                       clock-output-names = "gmac_int_tx";
+               };
+
+               gmac_tx_clk: clk@01c200d0 {
+                       #clock-cells = <0>;
+                       compatible = "allwinner,sun7i-a20-gmac-clk";
+                       reg = <0x01c200d0 0x4>;
+                       clocks = <&mii_phy_tx_clk>, <&gmac_int_tx_clk>;
+                       clock-output-names = "gmac_tx";
+               };
        };
 
        soc@01c00000 {
                        clocks = <&apb1_gates 5>;
                        gpio-controller;
                        interrupt-controller;
-                       #address-cells = <1>;
+                       #interrupt-cells = <2>;
                        #size-cells = <0>;
                        #gpio-cells = <3>;
 
                                allwinner,drive = <2>;
                                allwinner,pull = <0>;
                        };
+
+                       gmac_pins_mii_a: gmac_mii@0 {
+                               allwinner,pins = "PA0", "PA1", "PA2", "PA3",
+                                               "PA8", "PA9", "PA11",
+                                               "PA12", "PA13", "PA14", "PA19",
+                                               "PA20", "PA21", "PA22", "PA23",
+                                               "PA24", "PA26", "PA27";
+                               allwinner,function = "gmac";
+                               allwinner,drive = <0>;
+                               allwinner,pull = <0>;
+                       };
+
+                       gmac_pins_gmii_a: gmac_gmii@0 {
+                               allwinner,pins = "PA0", "PA1", "PA2", "PA3",
+                                               "PA4", "PA5", "PA6", "PA7",
+                                               "PA8", "PA9", "PA10", "PA11",
+                                               "PA12", "PA13", "PA14", "PA15",
+                                               "PA16", "PA17", "PA18", "PA19",
+                                               "PA20", "PA21", "PA22", "PA23",
+                                               "PA24", "PA25", "PA26", "PA27";
+                               allwinner,function = "gmac";
+                               /*
+                                * data lines in GMII mode run at 125MHz and
+                                * might need a higher signal drive strength
+                                */
+                               allwinner,drive = <2>;
+                               allwinner,pull = <0>;
+                       };
+
+                       gmac_pins_rgmii_a: gmac_rgmii@0 {
+                               allwinner,pins = "PA0", "PA1", "PA2", "PA3",
+                                               "PA9", "PA10", "PA11",
+                                               "PA12", "PA13", "PA14", "PA19",
+                                               "PA20", "PA25", "PA26", "PA27";
+                               allwinner,function = "gmac";
+                               /*
+                                * data lines in RGMII mode use DDR mode
+                                * and need a higher signal drive strength
+                                */
+                               allwinner,drive = <3>;
+                               allwinner,pull = <0>;
+                       };
                };
 
                ahb1_rst: reset@01c202c0 {
                        status = "disabled";
                };
 
+               gmac: ethernet@01c30000 {
+                       compatible = "allwinner,sun7i-a20-gmac";
+                       reg = <0x01c30000 0x1054>;
+                       interrupts = <0 82 4>;
+                       interrupt-names = "macirq";
+                       clocks = <&ahb1_gates 17>, <&gmac_tx_clk>;
+                       clock-names = "stmmaceth", "allwinner_gmac_tx";
+                       resets = <&ahb1_rst 17>;
+                       reset-names = "stmmaceth";
+                       snps,pbl = <2>;
+                       snps,fixed-burst;
+                       snps,force_sf_dma_mode;
+                       status = "disabled";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+               };
+
                timer@01c60000 {
                        compatible = "allwinner,sun6i-a31-hstimer", "allwinner,sun7i-a20-hstimer";
                        reg = <0x01c60000 0x1000>;
                        resets = <&apb0_rst 0>;
                        gpio-controller;
                        interrupt-controller;
-                       #address-cells = <1>;
+                       #interrupt-cells = <2>;
                        #size-cells = <0>;
                        #gpio-cells = <3>;
                };
index a5ad945197e833487c0ce09bdc94bbaf84850730..53680983461a1a7d3206678c9950d5007224992d 100644 (file)
                        };
                };
 
+               ir0: ir@01c21800 {
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&ir0_pins_a>;
+                       status = "okay";
+               };
+
                uart0: serial@01c28000 {
                        pinctrl-names = "default";
                        pinctrl-0 = <&uart0_pins_a>;
                        pinctrl-names = "default";
                        pinctrl-0 = <&i2c0_pins_a>;
                        status = "okay";
+
+                       axp209: pmic@34 {
+                               compatible = "x-powers,axp209";
+                               reg = <0x34>;
+                               interrupt-parent = <&nmi_intc>;
+                               interrupts = <0 8>;
+
+                               interrupt-controller;
+                               #interrupt-cells = <1>;
+                       };
                };
 
                i2c1: i2c@01c2b000 {
index b87fea90148918f308565daf9a2b988c88267bfc..a6c1a3c717bcaf94d2115f9e147059da01c7a984 100644 (file)
                        status = "okay";
                };
 
+               ir0: ir@01c21800 {
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&ir0_pins_a>;
+                       status = "okay";
+               };
+
                uart0: serial@01c28000 {
                        pinctrl-names = "default";
                        pinctrl-0 = <&uart0_pins_a>;
                        pinctrl-names = "default";
                        pinctrl-0 = <&i2c0_pins_a>;
                        status = "okay";
+
+                       axp209: pmic@34 {
+                               compatible = "x-powers,axp209";
+                               reg = <0x34>;
+                               interrupt-parent = <&nmi_intc>;
+                               interrupts = <0 8>;
+
+                               interrupt-controller;
+                               #interrupt-cells = <1>;
+                       };
                };
 
                i2c1: i2c@01c2b000 {
index b77308e901994c3120160ec2d90702704081b3db..6a67712d417acdb8dcea56c545875c3dccb54776 100644 (file)
                        };
                };
 
+               ir0: ir@01c21800 {
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&ir0_pins_a>;
+                       status = "okay";
+               };
+
                uart0: serial@01c28000 {
                        pinctrl-names = "default";
                        pinctrl-0 = <&uart0_pins_a>;
                        status = "okay";
                };
 
+               i2c0: i2c@01c2ac00 {
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&i2c0_pins_a>;
+                       status = "okay";
+
+                       axp209: pmic@34 {
+                               compatible = "x-powers,axp209";
+                               reg = <0x34>;
+                               interrupt-parent = <&nmi_intc>;
+                               interrupts = <0 8>;
+
+                               interrupt-controller;
+                               #interrupt-cells = <1>;
+                       };
+               };
+
                gmac: ethernet@01c50000 {
                        pinctrl-names = "default";
                        pinctrl-0 = <&gmac_pins_mii_a>;
index b759630bc9a99d9461d8bb171274881dca59c016..9d669cdf031d1aa1ea78c2d8a7c23b713dff3f98 100644 (file)
                        pinctrl-names = "default";
                        pinctrl-0 = <&i2c0_pins_a>;
                        status = "okay";
+
+                       axp209: pmic@34 {
+                               compatible = "x-powers,axp209";
+                               reg = <0x34>;
+                               interrupt-parent = <&nmi_intc>;
+                               interrupts = <0 8>;
+
+                               interrupt-controller;
+                               #interrupt-cells = <1>;
+                       };
                };
 
                i2c1: i2c@01c2b000 {
diff --git a/arch/arm/boot/dts/sun7i-a20-pcduino3.dts b/arch/arm/boot/dts/sun7i-a20-pcduino3.dts
new file mode 100644 (file)
index 0000000..046dfc0
--- /dev/null
@@ -0,0 +1,173 @@
+/*
+ * Copyright 2014 Zoltan HERPAI
+ * Zoltan HERPAI <wigyori@uid0.hu>
+ *
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/dts-v1/;
+/include/ "sun7i-a20.dtsi"
+/include/ "sunxi-common-regulators.dtsi"
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+
+/ {
+       model = "LinkSprite pcDuino3";
+       compatible = "linksprite,pcduino3", "allwinner,sun7i-a20";
+
+       soc@01c00000 {
+               mmc0: mmc@01c0f000 {
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&mmc0_pins_a>, <&mmc0_cd_pin_reference_design>;
+                       vmmc-supply = <&reg_vcc3v3>;
+                       bus-width = <4>;
+                       cd-gpios = <&pio 7 1 0>; /* PH1 */
+                       cd-inverted;
+                       status = "okay";
+               };
+
+               usbphy: phy@01c13400 {
+                       usb1_vbus-supply = <&reg_usb1_vbus>;
+                       usb2_vbus-supply = <&reg_usb2_vbus>;
+                       status = "okay";
+               };
+
+               ehci0: usb@01c14000 {
+                       status = "okay";
+               };
+
+               ohci0: usb@01c14400 {
+                       status = "okay";
+               };
+
+               ahci: sata@01c18000 {
+                       target-supply = <&reg_ahci_5v>;
+                       status = "okay";
+               };
+
+               ehci1: usb@01c1c000 {
+                       status = "okay";
+               };
+
+               ohci1: usb@01c1c400 {
+                       status = "okay";
+               };
+
+               pinctrl@01c20800 {
+                       ahci_pwr_pin_a: ahci_pwr_pin@0 {
+                               allwinner,pins = "PH2";
+                       };
+
+                       led_pins_pcduino3: led_pins@0 {
+                               allwinner,pins = "PH15", "PH16";
+                               allwinner,function = "gpio_out";
+                               allwinner,drive = <0>;
+                               allwinner,pull = <0>;
+                       };
+
+                       key_pins_pcduino3: key_pins@0 {
+                               allwinner,pins = "PH17", "PH18", "PH19";
+                               allwinner,function = "gpio_in";
+                               allwinner,drive = <0>;
+                               allwinner,pull = <0>;
+                       };
+               };
+
+               ir0: ir@01c21800 {
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&ir0_pins_a>;
+                       status = "okay";
+               };
+
+               uart0: serial@01c28000 {
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&uart0_pins_a>;
+                       status = "okay";
+               };
+
+               i2c0: i2c@01c2ac00 {
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&i2c0_pins_a>;
+                       status = "okay";
+
+                       axp209: pmic@34 {
+                               compatible = "x-powers,axp209";
+                               reg = <0x34>;
+                               interrupt-parent = <&nmi_intc>;
+                               interrupts = <0 8>;
+
+                               interrupt-controller;
+                               #interrupt-cells = <1>;
+                       };
+               };
+
+               gmac: ethernet@01c50000 {
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&gmac_pins_mii_a>;
+                       phy = <&phy1>;
+                       phy-mode = "mii";
+                       status = "okay";
+
+                       phy1: ethernet-phy@1 {
+                               reg = <1>;
+                       };
+               };
+       };
+
+       leds {
+               compatible = "gpio-leds";
+               pinctrl-names = "default";
+               pinctrl-0 = <&led_pins_pcduino3>;
+
+               tx {
+                       label = "pcduino3:green:tx";
+                       gpios = <&pio 7 15 GPIO_ACTIVE_LOW>;
+               };
+
+               rx {
+                       label = "pcduino3:green:rx";
+                       gpios = <&pio 7 16 GPIO_ACTIVE_LOW>;
+               };
+       };
+
+       gpio_keys {
+               compatible = "gpio-keys";
+               pinctrl-names = "default";
+               pinctrl-0 = <&key_pins_pcduino3>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+               button@0 {
+                       label = "Key Back";
+                       linux,code = <KEY_BACK>;
+                       gpios = <&pio 7 17 GPIO_ACTIVE_LOW>;
+               };
+               button@1 {
+                       label = "Key Home";
+                       linux,code = <KEY_HOME>;
+                       gpios = <&pio 7 18 GPIO_ACTIVE_LOW>;
+               };
+               button@2 {
+                       label = "Key Menu";
+                       linux,code = <KEY_MENU>;
+                       gpios = <&pio 7 19 GPIO_ACTIVE_LOW>;
+               };
+       };
+
+       reg_usb1_vbus: usb1-vbus {
+               status = "okay";
+       };
+
+       reg_usb2_vbus: usb2-vbus {
+               status = "okay";
+       };
+
+       reg_ahci_5v: ahci-5v {
+               gpio = <&pio 7 2 0>;
+               status = "okay";
+       };
+};
index 01e94664232abc2ce1059f032f1bb719d46da48c..4011628c738101b0004b6bb9da7f4c0ee3fa1e70 100644 (file)
                        clocks = <&apb0_gates 5>;
                        gpio-controller;
                        interrupt-controller;
-                       #address-cells = <1>;
+                       #interrupt-cells = <2>;
                        #size-cells = <0>;
                        #gpio-cells = <3>;
 
                                allwinner,drive = <2>;
                                allwinner,pull = <0>;
                        };
+
+                       ir0_pins_a: ir0@0 {
+                                   allwinner,pins = "PB3","PB4";
+                                   allwinner,function = "ir0";
+                                   allwinner,drive = <0>;
+                                   allwinner,pull = <0>;
+                       };
+
+                       ir1_pins_a: ir1@0 {
+                                   allwinner,pins = "PB22","PB23";
+                                   allwinner,function = "ir1";
+                                   allwinner,drive = <0>;
+                                   allwinner,pull = <0>;
+                       };
                };
 
                timer@01c20c00 {
                        status = "disabled";
                };
 
+               ir0: ir@01c21800 {
+                       compatible = "allwinner,sun4i-a10-ir";
+                       clocks = <&apb0_gates 6>, <&ir0_clk>;
+                       clock-names = "apb", "ir";
+                       interrupts = <0 5 4>;
+                       reg = <0x01c21800 0x40>;
+                       status = "disabled";
+               };
+
+               ir1: ir@01c21c00 {
+                       compatible = "allwinner,sun4i-a10-ir";
+                       clocks = <&apb0_gates 7>, <&ir1_clk>;
+                       clock-names = "apb", "ir";
+                       interrupts = <0 6 4>;
+                       reg = <0x01c21c00 0x40>;
+                       status = "disabled";
+               };
+
                sid: eeprom@01c23800 {
                        compatible = "allwinner,sun7i-a20-sid";
                        reg = <0x01c23800 0x200>;
diff --git a/arch/arm/boot/dts/sun8i-a23-ippo-q8h-v5.dts b/arch/arm/boot/dts/sun8i-a23-ippo-q8h-v5.dts
new file mode 100644 (file)
index 0000000..34002e3
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2014 Chen-Yu Tsai
+ *
+ * Chen-Yu Tsai <wens@csie.org>
+ *
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/dts-v1/;
+/include/ "sun8i-a23.dtsi"
+
+/ {
+       model = "Ippo Q8H Dual Core Tablet (v5)";
+       compatible = "ippo,q8h-v5", "allwinner,sun8i-a23";
+
+       chosen {
+               bootargs = "earlyprintk console=ttyS0,115200";
+       };
+
+       soc@01c00000 {
+               r_uart: serial@01f02800 {
+                       status = "okay";
+               };
+       };
+};
diff --git a/arch/arm/boot/dts/sun8i-a23.dtsi b/arch/arm/boot/dts/sun8i-a23.dtsi
new file mode 100644 (file)
index 0000000..54ac078
--- /dev/null
@@ -0,0 +1,343 @@
+/*
+ * Copyright 2014 Chen-Yu Tsai
+ *
+ * Chen-Yu Tsai <wens@csie.org>
+ *
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/include/ "skeleton.dtsi"
+
+/ {
+       interrupt-parent = <&gic>;
+
+       aliases {
+               serial0 = &uart0;
+               serial1 = &uart1;
+               serial2 = &uart2;
+               serial3 = &uart3;
+               serial4 = &uart4;
+               serial5 = &r_uart;
+       };
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               cpu@0 {
+                       compatible = "arm,cortex-a7";
+                       device_type = "cpu";
+                       reg = <0>;
+               };
+
+               cpu@1 {
+                       compatible = "arm,cortex-a7";
+                       device_type = "cpu";
+                       reg = <1>;
+               };
+       };
+
+       memory {
+               reg = <0x40000000 0x40000000>;
+       };
+
+       clocks {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges;
+
+               osc24M: osc24M_clk {
+                       #clock-cells = <0>;
+                       compatible = "fixed-clock";
+                       clock-frequency = <24000000>;
+                       clock-output-names = "osc24M";
+               };
+
+               osc32k: osc32k_clk {
+                       #clock-cells = <0>;
+                       compatible = "fixed-clock";
+                       clock-frequency = <32768>;
+                       clock-output-names = "osc32k";
+               };
+
+               pll1: clk@01c20000 {
+                       #clock-cells = <0>;
+                       compatible = "allwinner,sun8i-a23-pll1-clk";
+                       reg = <0x01c20000 0x4>;
+                       clocks = <&osc24M>;
+                       clock-output-names = "pll1";
+               };
+
+               /* dummy clock until actually implemented */
+               pll6: pll6_clk {
+                       #clock-cells = <0>;
+                       compatible = "fixed-clock";
+                       clock-frequency = <600000000>;
+                       clock-output-names = "pll6";
+               };
+
+               cpu: cpu_clk@01c20050 {
+                       #clock-cells = <0>;
+                       compatible = "allwinner,sun4i-a10-cpu-clk";
+                       reg = <0x01c20050 0x4>;
+
+                       /*
+                        * PLL1 is listed twice here.
+                        * While it looks suspicious, it's actually documented
+                        * that way both in the datasheet and in the code from
+                        * Allwinner.
+                        */
+                       clocks = <&osc32k>, <&osc24M>, <&pll1>, <&pll1>;
+                       clock-output-names = "cpu";
+               };
+
+               axi: axi_clk@01c20050 {
+                       #clock-cells = <0>;
+                       compatible = "allwinner,sun8i-a23-axi-clk";
+                       reg = <0x01c20050 0x4>;
+                       clocks = <&cpu>;
+                       clock-output-names = "axi";
+               };
+
+               ahb1_mux: ahb1_mux_clk@01c20054 {
+                       #clock-cells = <0>;
+                       compatible = "allwinner,sun6i-a31-ahb1-mux-clk";
+                       reg = <0x01c20054 0x4>;
+                       clocks = <&osc32k>, <&osc24M>, <&axi>, <&pll6>;
+                       clock-output-names = "ahb1_mux";
+               };
+
+               ahb1: ahb1_clk@01c20054 {
+                       #clock-cells = <0>;
+                       compatible = "allwinner,sun4i-a10-ahb-clk";
+                       reg = <0x01c20054 0x4>;
+                       clocks = <&ahb1_mux>;
+                       clock-output-names = "ahb1";
+               };
+
+               apb1: apb1_clk@01c20054 {
+                       #clock-cells = <0>;
+                       compatible = "allwinner,sun4i-a10-apb0-clk";
+                       reg = <0x01c20054 0x4>;
+                       clocks = <&ahb1>;
+                       clock-output-names = "apb1";
+               };
+
+               ahb1_gates: clk@01c20060 {
+                       #clock-cells = <1>;
+                       compatible = "allwinner,sun8i-a23-ahb1-gates-clk";
+                       reg = <0x01c20060 0x8>;
+                       clocks = <&ahb1>;
+                       clock-output-names = "ahb1_mipidsi", "ahb1_dma",
+                                       "ahb1_mmc0", "ahb1_mmc1", "ahb1_mmc2",
+                                       "ahb1_nand", "ahb1_sdram",
+                                       "ahb1_hstimer", "ahb1_spi0",
+                                       "ahb1_spi1", "ahb1_otg", "ahb1_ehci",
+                                       "ahb1_ohci", "ahb1_ve", "ahb1_lcd",
+                                       "ahb1_csi", "ahb1_be",  "ahb1_fe",
+                                       "ahb1_gpu", "ahb1_spinlock",
+                                       "ahb1_drc";
+               };
+
+               apb1_gates: clk@01c20068 {
+                       #clock-cells = <1>;
+                       compatible = "allwinner,sun8i-a23-apb1-gates-clk";
+                       reg = <0x01c20068 0x4>;
+                       clocks = <&apb1>;
+                       clock-output-names = "apb1_codec", "apb1_pio",
+                                       "apb1_daudio0", "apb1_daudio1";
+               };
+
+               apb2_mux: apb2_mux_clk@01c20058 {
+                       #clock-cells = <0>;
+                       compatible = "allwinner,sun4i-a10-apb1-mux-clk";
+                       reg = <0x01c20058 0x4>;
+                       clocks = <&osc32k>, <&osc24M>, <&pll6>, <&pll6>;
+                       clock-output-names = "apb2_mux";
+               };
+
+               apb2: apb2_clk@01c20058 {
+                       #clock-cells = <0>;
+                       compatible = "allwinner,sun6i-a31-apb2-div-clk";
+                       reg = <0x01c20058 0x4>;
+                       clocks = <&apb2_mux>;
+                       clock-output-names = "apb2";
+               };
+
+               apb2_gates: clk@01c2006c {
+                       #clock-cells = <1>;
+                       compatible = "allwinner,sun8i-a23-apb2-gates-clk";
+                       reg = <0x01c2006c 0x4>;
+                       clocks = <&apb2>;
+                       clock-output-names = "apb2_i2c0", "apb2_i2c1",
+                                       "apb2_i2c2", "apb2_uart0",
+                                       "apb2_uart1", "apb2_uart2",
+                                       "apb2_uart3", "apb2_uart4";
+               };
+       };
+
+       soc@01c00000 {
+               compatible = "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges;
+
+               ahb1_rst: reset@01c202c0 {
+                       #reset-cells = <1>;
+                       compatible = "allwinner,sun6i-a31-clock-reset";
+                       reg = <0x01c202c0 0xc>;
+               };
+
+               apb1_rst: reset@01c202d0 {
+                       #reset-cells = <1>;
+                       compatible = "allwinner,sun6i-a31-clock-reset";
+                       reg = <0x01c202d0 0x4>;
+               };
+
+               apb2_rst: reset@01c202d8 {
+                       #reset-cells = <1>;
+                       compatible = "allwinner,sun6i-a31-clock-reset";
+                       reg = <0x01c202d8 0x4>;
+               };
+
+               timer@01c20c00 {
+                       compatible = "allwinner,sun4i-a10-timer";
+                       reg = <0x01c20c00 0xa0>;
+                       interrupts = <0 18 4>,
+                                    <0 19 4>;
+                       clocks = <&osc24M>;
+               };
+
+               wdt0: watchdog@01c20ca0 {
+                       compatible = "allwinner,sun6i-a31-wdt";
+                       reg = <0x01c20ca0 0x20>;
+                       interrupts = <0 25 4>;
+               };
+
+               uart0: serial@01c28000 {
+                       compatible = "snps,dw-apb-uart";
+                       reg = <0x01c28000 0x400>;
+                       interrupts = <0 0 4>;
+                       reg-shift = <2>;
+                       reg-io-width = <4>;
+                       clocks = <&apb2_gates 16>;
+                       resets = <&apb2_rst 16>;
+                       status = "disabled";
+               };
+
+               uart1: serial@01c28400 {
+                       compatible = "snps,dw-apb-uart";
+                       reg = <0x01c28400 0x400>;
+                       interrupts = <0 1 4>;
+                       reg-shift = <2>;
+                       reg-io-width = <4>;
+                       clocks = <&apb2_gates 17>;
+                       resets = <&apb2_rst 17>;
+                       status = "disabled";
+               };
+
+               uart2: serial@01c28800 {
+                       compatible = "snps,dw-apb-uart";
+                       reg = <0x01c28800 0x400>;
+                       interrupts = <0 2 4>;
+                       reg-shift = <2>;
+                       reg-io-width = <4>;
+                       clocks = <&apb2_gates 18>;
+                       resets = <&apb2_rst 18>;
+                       status = "disabled";
+               };
+
+               uart3: serial@01c28c00 {
+                       compatible = "snps,dw-apb-uart";
+                       reg = <0x01c28c00 0x400>;
+                       interrupts = <0 3 4>;
+                       reg-shift = <2>;
+                       reg-io-width = <4>;
+                       clocks = <&apb2_gates 19>;
+                       resets = <&apb2_rst 19>;
+                       status = "disabled";
+               };
+
+               uart4: serial@01c29000 {
+                       compatible = "snps,dw-apb-uart";
+                       reg = <0x01c29000 0x400>;
+                       interrupts = <0 4 4>;
+                       reg-shift = <2>;
+                       reg-io-width = <4>;
+                       clocks = <&apb2_gates 20>;
+                       resets = <&apb2_rst 20>;
+                       status = "disabled";
+               };
+
+               gic: interrupt-controller@01c81000 {
+                       compatible = "arm,cortex-a7-gic", "arm,cortex-a15-gic";
+                       reg = <0x01c81000 0x1000>,
+                             <0x01c82000 0x1000>,
+                             <0x01c84000 0x2000>,
+                             <0x01c86000 0x2000>;
+                       interrupt-controller;
+                       #interrupt-cells = <3>;
+                       interrupts = <1 9 0xf04>;
+               };
+
+               prcm@01f01400 {
+                       compatible = "allwinner,sun8i-a23-prcm";
+                       reg = <0x01f01400 0x200>;
+
+                       ar100: ar100_clk {
+                               compatible = "fixed-factor-clock";
+                               #clock-cells = <0>;
+                               clock-div = <1>;
+                               clock-mult = <1>;
+                               clocks = <&osc24M>;
+                               clock-output-names = "ar100";
+                       };
+
+                       ahb0: ahb0_clk {
+                               compatible = "fixed-factor-clock";
+                               #clock-cells = <0>;
+                               clock-div = <1>;
+                               clock-mult = <1>;
+                               clocks = <&ar100>;
+                               clock-output-names = "ahb0";
+                       };
+
+                       apb0: apb0_clk {
+                               compatible = "allwinner,sun8i-a23-apb0-clk";
+                               #clock-cells = <0>;
+                               clocks = <&ahb0>;
+                               clock-output-names = "apb0";
+                       };
+
+                       apb0_gates: apb0_gates_clk {
+                               compatible = "allwinner,sun8i-a23-apb0-gates-clk";
+                               #clock-cells = <1>;
+                               clocks = <&apb0>;
+                               clock-output-names = "apb0_pio", "apb0_timer",
+                                               "apb0_rsb", "apb0_uart",
+                                               "apb0_i2c";
+                       };
+
+                       apb0_rst: apb0_rst {
+                               compatible = "allwinner,sun6i-a31-clock-reset";
+                               #reset-cells = <1>;
+                       };
+               };
+
+               r_uart: serial@01f02800 {
+                       compatible = "snps,dw-apb-uart";
+                       reg = <0x01f02800 0x400>;
+                       interrupts = <0 38 4>;
+                       reg-shift = <2>;
+                       reg-io-width = <4>;
+                       clocks = <&apb0_gates 4>;
+                       resets = <&apb0_rst 4>;
+                       status = "disabled";
+               };
+       };
+};
index 0b0e8e07d9658126b504058e5f82525e2071e812..c7c6825f11fbb1b902b6f230eb62d8d8f88077a6 100644 (file)
                reg = <0x80000000 0x79600000>;
        };
 
+       host1x@50000000 {
+               dsi@54300000 {
+                       status = "okay";
+
+                       vdd-supply = <&vdd_1v2_ap>;
+
+                       panel@0 {
+                               compatible = "lg,lh500wx1-sd03";
+                               reg = <0>;
+
+                               power-supply = <&vdd_lcd>;
+                               backlight = <&backlight>;
+                       };
+               };
+       };
+
        pinmux@70000868 {
                pinctrl-names = "default";
                pinctrl-0 = <&state_default>;
                                nvidia,function = "sdmmc1";
                                nvidia,pull = <TEGRA_PIN_PULL_NONE>;
                                nvidia,tristate = <TEGRA_PIN_DISABLE>;
-                               nvidia,enable-input = <TEGRA_PIN_DISABLE>;
+                               nvidia,enable-input = <TEGRA_PIN_ENABLE>;
                        };
                        sdmmc1_cmd_pz1 {
                                nvidia,pins = "sdmmc1_cmd_pz1",
                                nvidia,function = "sdmmc3";
                                nvidia,pull = <TEGRA_PIN_PULL_NONE>;
                                nvidia,tristate = <TEGRA_PIN_DISABLE>;
-                               nvidia,enable-input = <TEGRA_PIN_DISABLE>;
+                               nvidia,enable-input = <TEGRA_PIN_ENABLE>;
                        };
                        sdmmc3_cmd_pa7 {
                                nvidia,pins = "sdmmc3_cmd_pa7",
                                nvidia,function = "sdmmc4";
                                nvidia,pull = <TEGRA_PIN_PULL_NONE>;
                                nvidia,tristate = <TEGRA_PIN_DISABLE>;
-                               nvidia,enable-input = <TEGRA_PIN_DISABLE>;
+                               nvidia,enable-input = <TEGRA_PIN_ENABLE>;
                        };
                        sdmmc4_cmd_pt7 {
                                nvidia,pins = "sdmmc4_cmd_pt7",
                                nvidia,pins = "drive_sdio1";
                                nvidia,high-speed-mode = <TEGRA_PIN_ENABLE>;
                                nvidia,schmitt = <TEGRA_PIN_DISABLE>;
-                               nvidia,low-power-mode = <TEGRA_PIN_LP_DRIVE_DIV_1>;
                                nvidia,pull-down-strength = <36>;
                                nvidia,pull-up-strength = <20>;
                                nvidia,slew-rate-rising = <TEGRA_PIN_SLEW_RATE_SLOW>;
                                nvidia,pins = "drive_sdio3";
                                nvidia,high-speed-mode = <TEGRA_PIN_ENABLE>;
                                nvidia,schmitt = <TEGRA_PIN_DISABLE>;
-                               nvidia,low-power-mode = <TEGRA_PIN_LP_DRIVE_DIV_1>;
                                nvidia,pull-down-strength = <36>;
                                nvidia,pull-up-strength = <20>;
                                nvidia,slew-rate-rising = <TEGRA_PIN_SLEW_RATE_FASTEST>;
                                nvidia,pins = "drive_gma";
                                nvidia,high-speed-mode = <TEGRA_PIN_ENABLE>;
                                nvidia,schmitt = <TEGRA_PIN_DISABLE>;
-                               nvidia,low-power-mode = <TEGRA_PIN_LP_DRIVE_DIV_1>;
                                nvidia,pull-down-strength = <2>;
                                nvidia,pull-up-strength = <2>;
                                nvidia,slew-rate-rising = <TEGRA_PIN_SLEW_RATE_FASTEST>;
                                nvidia,slew-rate-falling = <TEGRA_PIN_SLEW_RATE_FASTEST>;
-                               nvidia,drive-type = <1>;
                        };
                };
        };
                                                regulator-name = "vdd-1v8";
                                                regulator-min-microvolt = <1800000>;
                                                regulator-max-microvolt = <1800000>;
-                                               regulator-always-on;
                                                regulator-boot-on;
                                        };
 
                                                regulator-name = "vdd-2v8-display";
                                                regulator-min-microvolt = <2800000>;
                                                regulator-max-microvolt = <2800000>;
+                                               regulator-always-on;
                                                regulator-boot-on;
                                        };
 
-                                       ldo3 {
+                                       vdd_1v2_ap: ldo3 {
                                                regulator-name = "avdd-1v2";
                                                regulator-min-microvolt = <1200000>;
                                                regulator-max-microvolt = <1200000>;
                        regulator-boot-on;
                };
 
-               regulator@1 {
+               vdd_lcd: regulator@1 {
                        compatible = "regulator-fixed";
                        reg = <1>;
                        regulator-name = "vdd_lcd_1v8";
index 7da20ca633ddf3cf8619b02dba6f01f2abf5ea3a..80b8eddb4105089743347b20dfb921c613af96ae 100644 (file)
                interrupt-controller;
        };
 
+       apbmisc@70000800 {
+               compatible = "nvidia,tegra114-apbmisc", "nvidia,tegra20-apbmisc";
+               reg = <0x70000800 0x64   /* Chip revision */
+                      0x70000008 0x04>; /* Strapping options */
+       };
+
        pinmux: pinmux@70000868 {
                compatible = "nvidia,tegra114-pinmux";
                reg = <0x70000868 0x148         /* Pad control registers */
                clock-names = "pclk", "clk32k_in";
        };
 
+       fuse@7000f800 {
+               compatible = "nvidia,tegra114-efuse";
+               reg = <0x7000f800 0x400>;
+               clocks = <&tegra_car TEGRA114_CLK_FUSE>;
+               clock-names = "fuse";
+               resets = <&tegra_car 39>;
+               reset-names = "fuse";
+       };
+
        iommu@70019010 {
                compatible = "nvidia,tegra114-smmu", "nvidia,tegra30-smmu";
                reg = <0x70019010 0x02c
index e31fb61a81d33ba9ee553dedf951199dd3223e26..624b0fba2d0a0f27861fa4c2a97694c23a7e3088 100644 (file)
                                        regulator-max-microamp = <3500000>;
                                        regulator-always-on;
                                        regulator-boot-on;
-                                       ams,external-control = <2>;
+                                       ams,ext-control = <2>;
                                };
 
                                sd1 {
                                        regulator-max-microamp = <2500000>;
                                        regulator-always-on;
                                        regulator-boot-on;
-                                       ams,external-control = <1>;
+                                       ams,ext-control = <1>;
                                };
 
                                vdd_1v35_lp0: sd2 {
                                        regulator-max-microvolt = <1050000>;
                                        regulator-boot-on;
                                        regulator-always-on;
-                                       ams,external-control = <1>;
+                                       ams,ext-control = <1>;
                                };
 
                                ldo1 {
                nvidia,sys-clock-req-active-high;
        };
 
+       padctl@0,7009f000 {
+               pinctrl-0 = <&padctl_default>;
+               pinctrl-names = "default";
+
+               padctl_default: pinmux {
+                       usb3 {
+                               nvidia,lanes = "pcie-0", "pcie-1";
+                               nvidia,function = "usb3";
+                               nvidia,iddq = <0>;
+                       };
+
+                       pcie {
+                               nvidia,lanes = "pcie-2", "pcie-3",
+                                              "pcie-4";
+                               nvidia,function = "pcie";
+                               nvidia,iddq = <0>;
+                       };
+
+                       sata {
+                               nvidia,lanes = "sata-0";
+                               nvidia,function = "sata";
+                               nvidia,iddq = <0>;
+                       };
+               };
+       };
+
        /* SD card */
        sdhci@0,700b0400 {
                status = "okay";
        sdhci@0,700b0600 {
                status = "okay";
                bus-width = <8>;
+               non-removable;
        };
 
        ahub@0,70300000 {
index f0bb8424402572f01077abf1e023a18f630d2fb5..70ad91d1a20be3760bd33c4a864ae835e87b644f 100644 (file)
                                        regulator-max-microamp = <3500000>;
                                        regulator-always-on;
                                        regulator-boot-on;
-                                       ams,external-control = <2>;
+                                       ams,ext-control = <2>;
                                };
 
                                sd1 {
                                        regulator-max-microamp = <2500000>;
                                        regulator-always-on;
                                        regulator-boot-on;
-                                       ams,external-control = <1>;
+                                       ams,ext-control = <1>;
                                };
 
                                vdd_1v35_lp0: sd2 {
                                        regulator-max-microvolt = <1050000>;
                                        regulator-boot-on;
                                        regulator-always-on;
-                                       ams,external-control = <1>;
+                                       ams,ext-control = <1>;
                                };
 
                                ldo1 {
        spi@0,7000d400 {
                status = "okay";
 
-               cros-ec@0 {
+               cros_ec: cros-ec@0 {
                        compatible = "google,cros-ec-spi";
                        spi-max-frequency = <4000000>;
                        interrupt-parent = <&gpio>;
 
                        google,cros-ec-spi-msg-delay = <2000>;
 
-                       cros-ec-keyb {
-                               compatible = "google,cros-ec-keyb";
-                               keypad,num-rows = <8>;
-                               keypad,num-columns = <13>;
-                               google,needs-ghost-filter;
-
-                               linux,keymap = <
-                                       MATRIX_KEY(0x00, 0x01, KEY_LEFTMETA)
-                                       MATRIX_KEY(0x00, 0x02, KEY_F1)
-                                       MATRIX_KEY(0x00, 0x03, KEY_B)
-                                       MATRIX_KEY(0x00, 0x04, KEY_F10)
-                                       MATRIX_KEY(0x00, 0x06, KEY_N)
-                                       MATRIX_KEY(0x00, 0x08, KEY_EQUAL)
-                                       MATRIX_KEY(0x00, 0x0a, KEY_RIGHTALT)
-
-                                       MATRIX_KEY(0x01, 0x01, KEY_ESC)
-                                       MATRIX_KEY(0x01, 0x02, KEY_F4)
-                                       MATRIX_KEY(0x01, 0x03, KEY_G)
-                                       MATRIX_KEY(0x01, 0x04, KEY_F7)
-                                       MATRIX_KEY(0x01, 0x06, KEY_H)
-                                       MATRIX_KEY(0x01, 0x08, KEY_APOSTROPHE)
-                                       MATRIX_KEY(0x01, 0x09, KEY_F9)
-                                       MATRIX_KEY(0x01, 0x0b, KEY_BACKSPACE)
-
-                                       MATRIX_KEY(0x02, 0x00, KEY_LEFTCTRL)
-                                       MATRIX_KEY(0x02, 0x01, KEY_TAB)
-                                       MATRIX_KEY(0x02, 0x02, KEY_F3)
-                                       MATRIX_KEY(0x02, 0x03, KEY_T)
-                                       MATRIX_KEY(0x02, 0x04, KEY_F6)
-                                       MATRIX_KEY(0x02, 0x05, KEY_RIGHTBRACE)
-                                       MATRIX_KEY(0x02, 0x06, KEY_Y)
-                                       MATRIX_KEY(0x02, 0x07, KEY_102ND)
-                                       MATRIX_KEY(0x02, 0x08, KEY_LEFTBRACE)
-                                       MATRIX_KEY(0x02, 0x09, KEY_F8)
-
-                                       MATRIX_KEY(0x03, 0x01, KEY_GRAVE)
-                                       MATRIX_KEY(0x03, 0x02, KEY_F2)
-                                       MATRIX_KEY(0x03, 0x03, KEY_5)
-                                       MATRIX_KEY(0x03, 0x04, KEY_F5)
-                                       MATRIX_KEY(0x03, 0x06, KEY_6)
-                                       MATRIX_KEY(0x03, 0x08, KEY_MINUS)
-                                       MATRIX_KEY(0x03, 0x0b, KEY_BACKSLASH)
-
-                                       MATRIX_KEY(0x04, 0x00, KEY_RIGHTCTRL)
-                                       MATRIX_KEY(0x04, 0x01, KEY_A)
-                                       MATRIX_KEY(0x04, 0x02, KEY_D)
-                                       MATRIX_KEY(0x04, 0x03, KEY_F)
-                                       MATRIX_KEY(0x04, 0x04, KEY_S)
-                                       MATRIX_KEY(0x04, 0x05, KEY_K)
-                                       MATRIX_KEY(0x04, 0x06, KEY_J)
-                                       MATRIX_KEY(0x04, 0x08, KEY_SEMICOLON)
-                                       MATRIX_KEY(0x04, 0x09, KEY_L)
-                                       MATRIX_KEY(0x04, 0x0a, KEY_BACKSLASH)
-                                       MATRIX_KEY(0x04, 0x0b, KEY_ENTER)
-
-                                       MATRIX_KEY(0x05, 0x01, KEY_Z)
-                                       MATRIX_KEY(0x05, 0x02, KEY_C)
-                                       MATRIX_KEY(0x05, 0x03, KEY_V)
-                                       MATRIX_KEY(0x05, 0x04, KEY_X)
-                                       MATRIX_KEY(0x05, 0x05, KEY_COMMA)
-                                       MATRIX_KEY(0x05, 0x06, KEY_M)
-                                       MATRIX_KEY(0x05, 0x07, KEY_LEFTSHIFT)
-                                       MATRIX_KEY(0x05, 0x08, KEY_SLASH)
-                                       MATRIX_KEY(0x05, 0x09, KEY_DOT)
-                                       MATRIX_KEY(0x05, 0x0b, KEY_SPACE)
-
-                                       MATRIX_KEY(0x06, 0x01, KEY_1)
-                                       MATRIX_KEY(0x06, 0x02, KEY_3)
-                                       MATRIX_KEY(0x06, 0x03, KEY_4)
-                                       MATRIX_KEY(0x06, 0x04, KEY_2)
-                                       MATRIX_KEY(0x06, 0x05, KEY_8)
-                                       MATRIX_KEY(0x06, 0x06, KEY_7)
-                                       MATRIX_KEY(0x06, 0x08, KEY_0)
-                                       MATRIX_KEY(0x06, 0x09, KEY_9)
-                                       MATRIX_KEY(0x06, 0x0a, KEY_LEFTALT)
-                                       MATRIX_KEY(0x06, 0x0b, KEY_DOWN)
-                                       MATRIX_KEY(0x06, 0x0c, KEY_RIGHT)
-
-                                       MATRIX_KEY(0x07, 0x01, KEY_Q)
-                                       MATRIX_KEY(0x07, 0x02, KEY_E)
-                                       MATRIX_KEY(0x07, 0x03, KEY_R)
-                                       MATRIX_KEY(0x07, 0x04, KEY_W)
-                                       MATRIX_KEY(0x07, 0x05, KEY_I)
-                                       MATRIX_KEY(0x07, 0x06, KEY_U)
-                                       MATRIX_KEY(0x07, 0x07, KEY_RIGHTSHIFT)
-                                       MATRIX_KEY(0x07, 0x08, KEY_P)
-                                       MATRIX_KEY(0x07, 0x09, KEY_O)
-                                       MATRIX_KEY(0x07, 0x0b, KEY_UP)
-                                       MATRIX_KEY(0x07, 0x0c, KEY_LEFT)
-                               >;
+                       i2c-tunnel {
+                               compatible = "google,cros-ec-i2c-tunnel";
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               google,remote-bus = <0>;
+
+                               charger: bq24735@9 {
+                                       compatible = "ti,bq24735";
+                                       reg = <0x9>;
+                                       interrupt-parent = <&gpio>;
+                                       interrupts = <TEGRA_GPIO(J, 0)
+                                                       GPIO_ACTIVE_HIGH>;
+                                       ti,ac-detect-gpios = <&gpio
+                                                       TEGRA_GPIO(J, 0)
+                                                       GPIO_ACTIVE_HIGH>;
+                               };
+
+                               battery: sbs-battery@b {
+                                       compatible = "sbs,sbs-battery";
+                                       reg = <0xb>;
+                                       sbs,i2c-retry-count = <2>;
+                                       sbs,poll-retry-count = <1>;
+                               };
                        };
                };
        };
                nvidia,sys-clock-req-active-high;
        };
 
+       hda@0,70030000 {
+               status = "okay";
+       };
+
        sdhci@0,700b0400 {
                cd-gpios = <&gpio TEGRA_GPIO(V, 2) GPIO_ACTIVE_HIGH>;
                power-gpios = <&gpio TEGRA_GPIO(R, 0) GPIO_ACTIVE_HIGH>;
                clock-names = "pll_a", "pll_a_out0", "mclk";
        };
 };
+
+#include "cros-ec-keyboard.dtsi"
index aa8753a7c211df372a0d17dcfd50bbab8f35730c..03916efd6fa98748f6d183cfda94280cf6ceeedb 100644 (file)
@@ -1,6 +1,7 @@
 #include <dt-bindings/clock/tegra124-car.h>
 #include <dt-bindings/gpio/tegra-gpio.h>
 #include <dt-bindings/pinctrl/pinctrl-tegra.h>
+#include <dt-bindings/pinctrl/pinctrl-tegra-xusb.h>
 #include <dt-bindings/interrupt-controller/arm-gic.h>
 
 #include "skeleton.dtsi"
                        (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>;
        };
 
+       gpu@0,57000000 {
+               compatible = "nvidia,gk20a";
+               reg = <0x0 0x57000000 0x0 0x01000000>,
+                     <0x0 0x58000000 0x0 0x01000000>;
+               interrupts = <GIC_SPI 157 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 158 IRQ_TYPE_LEVEL_HIGH>;
+               interrupt-names = "stall", "nonstall";
+               clocks = <&tegra_car TEGRA124_CLK_GPU>,
+                        <&tegra_car TEGRA124_CLK_PLL_P_OUT5>;
+               clock-names = "gpu", "pwr";
+               resets = <&tegra_car 184>;
+               reset-names = "gpu";
+               status = "disabled";
+       };
+
        timer@0,60005000 {
                compatible = "nvidia,tegra124-timer", "nvidia,tegra20-timer";
                reg = <0x0 0x60005000 0x0 0x400>;
                #dma-cells = <1>;
        };
 
+       apbmisc@0,70000800 {
+               compatible = "nvidia,tegra124-apbmisc", "nvidia,tegra20-apbmisc";
+               reg = <0x0 0x70000800 0x0 0x64>,   /* Chip revision */
+                     <0x0 0x7000E864 0x0 0x04>;   /* Strapping options */
+       };
+
        pinmux: pinmux@0,70000868 {
                compatible = "nvidia,tegra124-pinmux";
                reg = <0x0 0x70000868 0x0 0x164>, /* Pad control registers */
                clock-names = "pclk", "clk32k_in";
        };
 
+       fuse@0,7000f800 {
+               compatible = "nvidia,tegra124-efuse";
+               reg = <0x0 0x7000f800 0x0 0x400>;
+               clocks = <&tegra_car TEGRA124_CLK_FUSE>;
+               clock-names = "fuse";
+               resets = <&tegra_car 39>;
+               reset-names = "fuse";
+       };
+
+       hda@0,70030000 {
+               compatible = "nvidia,tegra124-hda", "nvidia,tegra30-hda";
+               reg = <0x0 0x70030000 0x0 0x10000>;
+               interrupts = <GIC_SPI 81 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&tegra_car TEGRA124_CLK_HDA>,
+                        <&tegra_car TEGRA124_CLK_HDA2HDMI>,
+                        <&tegra_car TEGRA124_CLK_HDA2CODEC_2X>;
+               clock-names = "hda", "hda2hdmi", "hdacodec_2x";
+               resets = <&tegra_car 125>, /* hda */
+                        <&tegra_car 128>, /* hda2hdmi */
+                        <&tegra_car 111>; /* hda2codec_2x */
+               reset-names = "hda", "hda2hdmi", "hdacodec_2x";
+               status = "disabled";
+       };
+
+       padctl: padctl@0,7009f000 {
+               compatible = "nvidia,tegra124-xusb-padctl";
+               reg = <0x0 0x7009f000 0x0 0x1000>;
+               resets = <&tegra_car 142>;
+               reset-names = "padctl";
+
+               #phy-cells = <1>;
+       };
+
        sdhci@0,700b0000 {
                compatible = "nvidia,tegra124-sdhci";
                reg = <0x0 0x700b0000 0x0 0x200>;
index f45aad688d9b5296239795860231de5d3340eab1..a37279af687c6a436ba5308c6139a5c3c8be9014 100644 (file)
        };
 
        pcie-controller@80003000 {
-               pex-clk-supply = <&pci_clk_reg>;
-               vdd-supply = <&pci_vdd_reg>;
                status = "okay";
 
+               avdd-pex-supply = <&pci_vdd_reg>;
+               vdd-pex-supply = <&pci_vdd_reg>;
+               avdd-pex-pll-supply = <&pci_vdd_reg>;
+               avdd-plle-supply = <&pci_vdd_reg>;
+               vddio-pex-clk-supply = <&pci_clk_reg>;
+
                pci@1,0 {
                        status = "okay";
                };
index 6d3a4cbc36cc358ecdac0313283078e0d1fd4545..1b7c56b33acae6f2c6c4b1da3154d6c92aebb96a 100644 (file)
                status = "okay";
        };
 
+       host1x@50000000 {
+               dc@54200000 {
+                       rgb {
+                               status = "okay";
+                               nvidia,panel = <&panel>;
+                       };
+               };
+       };
+
        i2c@7000c000 {
                wm8903: wm8903@1a {
                        compatible = "wlf,wm8903";
@@ -30,7 +39,7 @@
                };
        };
 
-       backlight {
+       backlight: backlight {
                compatible = "pwm-backlight";
                pwms = <&pwm 0 5000000>;
 
                default-brightness-level = <6>;
        };
 
+       panel: panel {
+               compatible = "innolux,n156bge-l21", "simple-panel";
+
+               power-supply =  <&vdd_1v8_reg>, <&vdd_3v3_reg>;
+               enable-gpios = <&gpio TEGRA_GPIO(B, 2) GPIO_ACTIVE_HIGH>;
+
+               backlight = <&backlight>;
+       };
+
        sound {
                compatible = "ad,tegra-audio-wm8903-medcom-wide",
                             "nvidia,tegra-audio-wm8903";
                         <&tegra_car TEGRA20_CLK_CDEV1>;
                clock-names = "pll_a", "pll_a_out0", "mclk";
        };
+
+       regulators {
+               vcc_24v_reg: regulator@100 {
+                       compatible = "regulator-fixed";
+                       reg = <100>;
+                       regulator-name = "vcc_24v";
+                       regulator-min-microvolt = <24000000>;
+                       regulator-max-microvolt = <24000000>;
+                       regulator-always-on;
+               };
+
+               vdd_5v0_reg: regulator@101 {
+                       compatible = "regulator-fixed";
+                       reg = <101>;
+                       regulator-name = "vdd_5v0";
+                       vin-supply = <&vcc_24v_reg>;
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       regulator-always-on;
+               };
+
+               vdd_3v3_reg: regulator@102 {
+                       compatible = "regulator-fixed";
+                       reg = <102>;
+                       regulator-name = "vdd_3v3";
+                       vin-supply = <&vcc_24v_reg>;
+                       regulator-min-microvolt = <3300000>;
+                       regulator-max-microvolt = <3300000>;
+                       regulator-always-on;
+               };
+
+               vdd_1v8_reg: regulator@103 {
+                       compatible = "regulator-fixed";
+                       reg = <103>;
+                       regulator-name = "vdd_1v8";
+                       vin-supply = <&vdd_3v3_reg>;
+                       regulator-min-microvolt = <1800000>;
+                       regulator-max-microvolt = <1800000>;
+                       regulator-always-on;
+               };
+       };
 };
index 9a39a8001f7845fb75572e97a7a8554399af9d81..d4438e30de456c70047457f6ee974ac31a6f686f 100644 (file)
                request-gpios = <&gpio TEGRA_GPIO(V, 2) GPIO_ACTIVE_HIGH>;
                slave-addr = <138>;
                clocks = <&tegra_car TEGRA20_CLK_I2C3>,
-                        <&tegra_car TEGRA20_CLK_PLL_P_OUT3>;
+                        <&tegra_car TEGRA20_CLK_PLL_P_OUT3>;
                clock-names = "div-clk", "fast-clk";
                resets = <&tegra_car 67>;
                reset-names = "i2c";
                        GPIO_ACTIVE_HIGH>;
 
                clocks = <&tegra_car TEGRA20_CLK_PLL_A>,
-                        <&tegra_car TEGRA20_CLK_PLL_A_OUT0>,
-                        <&tegra_car TEGRA20_CLK_CDEV1>;
+                        <&tegra_car TEGRA20_CLK_PLL_A_OUT0>,
+                        <&tegra_car TEGRA20_CLK_CDEV1>;
                clock-names = "pll_a", "pll_a_out0", "mclk";
        };
 };
index 29051a2ae0aed6194c77e1a5e323fd88484e3b57..a10b415bbdee1e2f8391290dc355bb9405cf9774 100644 (file)
                         <&tegra_car TEGRA20_CLK_CDEV1>;
                clock-names = "pll_a", "pll_a_out0", "mclk";
        };
+
+       regulators {
+               vcc_24v_reg: regulator@100 {
+                       compatible = "regulator-fixed";
+                       reg = <100>;
+                       regulator-name = "vcc_24v";
+                       regulator-min-microvolt = <24000000>;
+                       regulator-max-microvolt = <24000000>;
+                       regulator-always-on;
+               };
+
+               vdd_5v0_reg: regulator@101 {
+                       compatible = "regulator-fixed";
+                       reg = <101>;
+                       regulator-name = "vdd_5v0";
+                       vin-supply = <&vcc_24v_reg>;
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       regulator-always-on;
+               };
+
+               vdd_3v3_reg: regulator@102 {
+                       compatible = "regulator-fixed";
+                       reg = <102>;
+                       regulator-name = "vdd_3v3";
+                       vin-supply = <&vcc_24v_reg>;
+                       regulator-min-microvolt = <3300000>;
+                       regulator-max-microvolt = <3300000>;
+                       regulator-always-on;
+               };
+
+               vdd_1v8_reg: regulator@103 {
+                       compatible = "regulator-fixed";
+                       reg = <103>;
+                       regulator-name = "vdd_1v8";
+                       vin-supply = <&vdd_3v3_reg>;
+                       regulator-min-microvolt = <1800000>;
+                       regulator-max-microvolt = <1800000>;
+                       regulator-always-on;
+               };
+       };
 };
index a1b0d965757f49a757b9dd4b88e4b427b236a8a9..80e7d386ce3452e3776e70771233eea336a81e98 100644 (file)
                        #gpio-cells = <2>;
                        gpio-controller;
 
+                       /* vdd_5v0_reg must be provided by the base board */
                        sys-supply = <&vdd_5v0_reg>;
                        vin-sm0-supply = <&sys_reg>;
                        vin-sm1-supply = <&sys_reg>;
        };
 
        pcie-controller@80003000 {
-               pex-clk-supply = <&pci_clk_reg>;
-               vdd-supply = <&pci_vdd_reg>;
+               avdd-pex-supply = <&pci_vdd_reg>;
+               vdd-pex-supply = <&pci_vdd_reg>;
+               avdd-pex-pll-supply = <&pci_vdd_reg>;
+               avdd-plle-supply = <&pci_vdd_reg>;
+               vddio-pex-clk-supply = <&pci_clk_reg>;
        };
 
        usb@c5008000 {
                #address-cells = <1>;
                #size-cells = <0>;
 
-               vdd_5v0_reg: regulator@0 {
-                       compatible = "regulator-fixed";
-                       reg = <0>;
-                       regulator-name = "vdd_5v0";
-                       regulator-min-microvolt = <5000000>;
-                       regulator-max-microvolt = <5000000>;
-                       regulator-always-on;
-               };
-
                pci_vdd_reg: regulator@1 {
                        compatible = "regulator-fixed";
                        reg = <1>;
index 890562c667fbee28b6713e0f5f74314ad98e8470..c12d8bead2eea89beccb58be81cdad22336d2b08 100644 (file)
                         <&tegra_car TEGRA20_CLK_CDEV1>;
                clock-names = "pll_a", "pll_a_out0", "mclk";
        };
+
+       regulators {
+               vcc_24v_reg: regulator@100 {
+                       compatible = "regulator-fixed";
+                       reg = <100>;
+                       regulator-name = "vcc_24v";
+                       regulator-min-microvolt = <24000000>;
+                       regulator-max-microvolt = <24000000>;
+                       regulator-always-on;
+               };
+
+               vdd_5v0_reg: regulator@101 {
+                       compatible = "regulator-fixed";
+                       reg = <101>;
+                       regulator-name = "vdd_5v0";
+                       vin-supply = <&vcc_24v_reg>;
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       regulator-always-on;
+               };
+
+               vdd_3v3_reg: regulator@102 {
+                       compatible = "regulator-fixed";
+                       reg = <102>;
+                       regulator-name = "vdd_3v3";
+                       vin-supply = <&vcc_24v_reg>;
+                       regulator-min-microvolt = <3300000>;
+                       regulator-max-microvolt = <3300000>;
+                       regulator-always-on;
+               };
+
+               vdd_1v8_reg: regulator@103 {
+                       compatible = "regulator-fixed";
+                       reg = <103>;
+                       regulator-name = "vdd_1v8";
+                       vin-supply = <&vdd_3v3_reg>;
+                       regulator-min-microvolt = <1800000>;
+                       regulator-max-microvolt = <1800000>;
+                       regulator-always-on;
+               };
+       };
 };
index 216fa6d50c65439f86d6049a089ee0396c68ec09..5ad87979ab13ff68527f3b6c8a1ba9bb51e2bda5 100644 (file)
 
        pcie-controller@80003000 {
                status = "okay";
-               pex-clk-supply = <&pci_clk_reg>;
-               vdd-supply = <&pci_vdd_reg>;
+
+               avdd-pex-supply = <&pci_vdd_reg>;
+               vdd-pex-supply = <&pci_vdd_reg>;
+               avdd-pex-pll-supply = <&pci_vdd_reg>;
+               avdd-plle-supply = <&pci_vdd_reg>;
+               vddio-pex-clk-supply = <&pci_clk_reg>;
 
                pci@1,0 {
                        status = "okay";
index 935df8906f251300bb71f4829bfa9c4b5e421fa0..1908f6937e53246c1d2f0225a7b658ce1452f3d5 100644 (file)
                interrupt-controller;
        };
 
+       apbmisc@70000800 {
+               compatible = "nvidia,tegra20-apbmisc";
+               reg = <0x70000800 0x64   /* Chip revision */
+                      0x70000008 0x04>; /* Strapping options */
+       };
+
        pinmux: pinmux@70000014 {
                compatible = "nvidia,tegra20-pinmux";
                reg = <0x70000014 0x10   /* Tri-state registers */
                #size-cells = <0>;
        };
 
+       fuse@7000f800 {
+               compatible = "nvidia,tegra20-efuse";
+               reg = <0x7000F800 0x400>;
+               clocks = <&tegra_car TEGRA20_CLK_FUSE>;
+               clock-names = "fuse";
+               resets = <&tegra_car 39>;
+               reset-names = "fuse";
+       };
+
        pcie-controller@80003000 {
                compatible = "nvidia,tegra20-pcie";
                device_type = "pci";
diff --git a/arch/arm/boot/dts/tegra30-apalis-eval.dts b/arch/arm/boot/dts/tegra30-apalis-eval.dts
new file mode 100644 (file)
index 0000000..45d40f0
--- /dev/null
@@ -0,0 +1,260 @@
+/dts-v1/;
+
+#include <dt-bindings/input/input.h>
+#include "tegra30-apalis.dtsi"
+
+/ {
+       model = "Toradex Apalis T30 on Apalis Evaluation Board";
+       compatible = "toradex,apalis_t30-eval", "toradex,apalis_t30", "nvidia,tegra30";
+
+       aliases {
+               rtc0 = "/i2c@7000c000/rtc@68";
+               rtc1 = "/i2c@7000d000/tps65911@2d";
+               rtc2 = "/rtc@7000e000";
+       };
+
+       pcie-controller@00003000 {
+               status = "okay";
+
+               pci@1,0 {
+                       status = "okay";
+               };
+
+               pci@2,0 {
+                       status = "okay";
+               };
+
+               pci@3,0 {
+                       status = "okay";
+               };
+       };
+
+       host1x@50000000 {
+               dc@54200000 {
+                       rgb {
+                               status = "okay";
+                               nvidia,panel = <&panel>;
+                       };
+               };
+               hdmi@54280000 {
+                       status = "okay";
+               };
+       };
+
+       serial@70006000 {
+               status = "okay";
+       };
+
+       serial@70006040 {
+               compatible = "nvidia,tegra30-hsuart";
+               status = "okay";
+       };
+
+       serial@70006200 {
+               compatible = "nvidia,tegra30-hsuart";
+               status = "okay";
+       };
+
+       serial@70006300 {
+               compatible = "nvidia,tegra30-hsuart";
+               status = "okay";
+       };
+
+       pwm@7000a000 {
+               status = "okay";
+       };
+
+       /*
+        * GEN1_I2C: I2C1_SDA/SCL on MXM3 pin 209/211 (e.g. RTC on carrier
+        * board)
+        */
+       i2c@7000c000 {
+               status = "okay";
+               clock-frequency = <100000>;
+
+               pcie-switch@58 {
+                       compatible = "plx,pex8605";
+                       reg = <0x58>;
+               };
+
+               /* M41T0M6 real time clock on carrier board */
+               rtc@68 {
+                       compatible = "st,m41t00";
+                       reg = <0x68>;
+               };
+       };
+
+       /* GEN2_I2C: unused */
+
+       /*
+        * CAM_I2C: I2C3_SDA/SCL on MXM3 pin 201/203 (e.g. camera sensor on
+        * carrier board)
+        */
+       cami2c: i2c@7000c500 {
+               status = "okay";
+               clock-frequency = <400000>;
+       };
+
+       /* DDC: I2C2_SDA/SCL on MXM3 pin 205/207 (e.g. display EDID) */
+       hdmiddc: i2c@7000c700 {
+               status = "okay";
+       };
+
+       /* SPI1: Apalis SPI1 */
+       spi@7000d400 {
+               status = "okay";
+               spi-max-frequency = <25000000>;
+               spidev0: spidev@1 {
+                       compatible = "spidev";
+                       reg = <1>;
+                       spi-max-frequency = <25000000>;
+               };
+       };
+
+       /* SPI5: Apalis SPI2 */
+       spi@7000dc00 {
+               status = "okay";
+               spi-max-frequency = <25000000>;
+               spidev1: spidev@2 {
+                       compatible = "spidev";
+                       reg = <2>;
+                       spi-max-frequency = <25000000>;
+               };
+       };
+
+       sd1: sdhci@78000000 {
+               status = "okay";
+               bus-width = <4>;
+               /* SD1_CD# */
+               cd-gpios = <&gpio TEGRA_GPIO(CC, 5) GPIO_ACTIVE_LOW>;
+               no-1-8-v;
+       };
+
+       mmc1: sdhci@78000400 {
+               status = "okay";
+               bus-width = <8>;
+               /* MMC1_CD# */
+               cd-gpios = <&gpio TEGRA_GPIO(V, 3) GPIO_ACTIVE_LOW>;
+               no-1-8-v;
+       };
+
+       /* EHCI instance 0: USB1_DP/N -> USBO1_DP/N */
+       usb@7d000000 {
+               status = "okay";
+       };
+
+       usb-phy@7d000000 {
+               status = "okay";
+               vbus-supply = <&usbo1_vbus_reg>;
+       };
+
+       /* EHCI instance 1: USB2_DP/N -> USBH2_DP/N */
+       usb@7d004000 {
+               status = "okay";
+       };
+
+       usb-phy@7d004000 {
+               status = "okay";
+               vbus-supply = <&usbh_vbus_reg>;
+       };
+
+       /* EHCI instance 2: USB3_DP/N -> USBH3_DP/N */
+       usb@7d008000 {
+               status = "okay";
+       };
+
+       usb-phy@7d008000 {
+               status = "okay";
+               vbus-supply = <&usbh_vbus_reg>;
+       };
+
+       backlight: backlight {
+               compatible = "pwm-backlight";
+
+               /* PWM0 */
+               pwms = <&pwm 0 5000000>;
+               brightness-levels = <255 231 223 207 191 159 127 0>;
+               default-brightness-level = <6>;
+               /* BKL1_ON */
+               enable-gpios = <&gpio TEGRA_GPIO(V, 2) GPIO_ACTIVE_HIGH>;
+       };
+
+       gpio-keys {
+               compatible = "gpio-keys";
+
+               power {
+                       label = "Power";
+                       gpios = <&gpio TEGRA_GPIO(V, 1) GPIO_ACTIVE_LOW>;
+                       linux,code = <KEY_POWER>;
+                       debounce-interval = <10>;
+                       gpio-key,wakeup;
+               };
+       };
+
+       panel: panel {
+               /*
+                * edt,et057090dhu: EDT 5.7" LCD TFT
+                * edt,et070080dh6: EDT 7.0" LCD TFT
+                */
+               compatible = "edt,et057090dhu", "simple-panel";
+
+               backlight = <&backlight>;
+       };
+
+       pwmleds {
+               compatible = "pwm-leds";
+
+               pwm1 {
+                       label = "PWM1";
+                       pwms = <&pwm 3 19600>;
+                       max-brightness = <255>;
+               };
+
+               pwm2 {
+                       label = "PWM2";
+                       pwms = <&pwm 2 19600>;
+                       max-brightness = <255>;
+               };
+
+               pwm3 {
+                       label = "PWM3";
+                       pwms = <&pwm 1 19600>;
+                       max-brightness = <255>;
+               };
+       };
+
+       regulators {
+               sys_5v0_reg: regulator@1 {
+                       compatible = "regulator-fixed";
+                       reg = <1>;
+                       regulator-name = "5v0";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       regulator-always-on;
+               };
+
+               /* USBO1_EN */
+               usbo1_vbus_reg: regulator@2 {
+                       compatible = "regulator-fixed";
+                       reg = <2>;
+                       regulator-name = "usbo1_vbus";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       gpio = <&gpio TEGRA_GPIO(T, 5) GPIO_ACTIVE_HIGH>;
+                       enable-active-high;
+                       vin-supply = <&sys_5v0_reg>;
+               };
+
+               /* USBH_EN */
+               usbh_vbus_reg: regulator@3 {
+                       compatible = "regulator-fixed";
+                       reg = <3>;
+                       regulator-name = "usbh_vbus";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       gpio = <&gpio TEGRA_GPIO(DD, 1) GPIO_ACTIVE_HIGH>;
+                       enable-active-high;
+                       vin-supply = <&sys_5v0_reg>;
+               };
+       };
+};
diff --git a/arch/arm/boot/dts/tegra30-apalis.dtsi b/arch/arm/boot/dts/tegra30-apalis.dtsi
new file mode 100644 (file)
index 0000000..8adaa78
--- /dev/null
@@ -0,0 +1,678 @@
+#include "tegra30.dtsi"
+
+/*
+ * Toradex Apalis T30 Device Tree
+ * Compatible for Revisions 1GB: V1.0A; 2GB: V1.0B, V1.0C
+ */
+/ {
+       model = "Toradex Apalis T30";
+       compatible = "toradex,apalis_t30", "nvidia,tegra30";
+
+       pcie-controller@00003000 {
+               avdd-pexa-supply = <&vdd2_reg>;
+               vdd-pexa-supply = <&vdd2_reg>;
+               avdd-pexb-supply = <&vdd2_reg>;
+               vdd-pexb-supply = <&vdd2_reg>;
+               avdd-pex-pll-supply = <&vdd2_reg>;
+               avdd-plle-supply = <&ldo6_reg>;
+               vddio-pex-ctl-supply = <&sys_3v3_reg>;
+               hvdd-pex-supply = <&sys_3v3_reg>;
+
+               pci@1,0 {
+                       nvidia,num-lanes = <4>;
+               };
+
+               pci@2,0 {
+                       nvidia,num-lanes = <1>;
+               };
+
+               pci@3,0 {
+                       nvidia,num-lanes = <1>;
+               };
+       };
+
+       host1x@50000000 {
+               hdmi@54280000 {
+                       vdd-supply = <&sys_3v3_reg>;
+                       pll-supply = <&vio_reg>;
+
+                       nvidia,hpd-gpio =
+                               <&gpio TEGRA_GPIO(N, 7) GPIO_ACTIVE_HIGH>;
+                       nvidia,ddc-i2c-bus = <&hdmiddc>;
+               };
+       };
+
+       pinmux@70000868 {
+               pinctrl-names = "default";
+               pinctrl-0 = <&state_default>;
+
+               state_default: pinmux {
+                       /* Apalis BKL1_ON */
+                       pv2 {
+                               nvidia,pins = "pv2";
+                               nvidia,function = "rsvd4";
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                       };
+
+                       /* Apalis BKL1_PWM */
+                       uart3_rts_n_pc0 {
+                               nvidia,pins =   "uart3_rts_n_pc0";
+                               nvidia,function = "pwm0";
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                       };
+                       /* BKL1_PWM_EN#, disable TPS65911 PMIC PWM backlight */
+                       uart3_cts_n_pa1 {
+                               nvidia,pins =   "uart3_cts_n_pa1";
+                               nvidia,function = "rsvd1";
+                               nvidia,pull = <TEGRA_PIN_PULL_UP>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                       };
+
+                       /* Apalis CAN1 on SPI6 */
+                       spi2_cs0_n_px3 {
+                               nvidia,pins =   "spi2_cs0_n_px3",
+                                               "spi2_miso_px1",
+                                               "spi2_mosi_px0",
+                                               "spi2_sck_px2";
+                               nvidia,function = "spi6";
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                       };
+                       /* CAN_INT1 */
+                       spi2_cs1_n_pw2 {
+                               nvidia,pins = "spi2_cs1_n_pw2";
+                               nvidia,function = "spi3";
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                               nvidia,enable-input = <TEGRA_PIN_ENABLE>;
+                       };
+
+                       /* Apalis CAN2 on SPI4 */
+                       gmi_a16_pj7 {
+                               nvidia,pins =   "gmi_a16_pj7",
+                                               "gmi_a17_pb0",
+                                               "gmi_a18_pb1",
+                                               "gmi_a19_pk7";
+                               nvidia,function = "spi4";
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                       };
+                       /* CAN_INT2 */
+                       spi2_cs2_n_pw3 {
+                               nvidia,pins = "spi2_cs2_n_pw3";
+                               nvidia,function = "spi3";
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                               nvidia,enable-input = <TEGRA_PIN_ENABLE>;
+                       };
+
+                       /* Apalis I2C3 */
+                       cam_i2c_scl_pbb1 {
+                               nvidia,pins = "cam_i2c_scl_pbb1",
+                                             "cam_i2c_sda_pbb2";
+                               nvidia,function = "i2c3";
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                               nvidia,enable-input = <TEGRA_PIN_ENABLE>;
+                               nvidia,lock = <TEGRA_PIN_DISABLE>;
+                               nvidia,open-drain = <TEGRA_PIN_ENABLE>;
+                       };
+
+                       /* Apalis MMC1 */
+                       sdmmc3_clk_pa6 {
+                               nvidia,pins =   "sdmmc3_clk_pa6",
+                                               "sdmmc3_cmd_pa7";
+                               nvidia,function = "sdmmc3";
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                       };
+                       sdmmc3_dat0_pb7 {
+                               nvidia,pins =   "sdmmc3_dat0_pb7",
+                                               "sdmmc3_dat1_pb6",
+                                               "sdmmc3_dat2_pb5",
+                                               "sdmmc3_dat3_pb4",
+                                               "sdmmc3_dat4_pd1",
+                                               "sdmmc3_dat5_pd0",
+                                               "sdmmc3_dat6_pd3",
+                                               "sdmmc3_dat7_pd4";
+                               nvidia,function = "sdmmc3";
+                               nvidia,pull = <TEGRA_PIN_PULL_UP>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                       };
+                       /* Apalis MMC1_CD# */
+                       pv3 {
+                               nvidia,pins = "pv3";
+                               nvidia,function = "rsvd2";
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                               nvidia,enable-input = <TEGRA_PIN_ENABLE>;
+                       };
+
+                       /* Apalis PWM1 */
+                       gpio_pu6 {
+                               nvidia,pins =   "gpio_pu6";
+                               nvidia,function = "pwm3";
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                       };
+
+                       /* Apalis PWM2 */
+                       gpio_pu5 {
+                               nvidia,pins =   "gpio_pu5";
+                               nvidia,function = "pwm2";
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                       };
+
+                       /* Apalis PWM3 */
+                       gpio_pu4 {
+                               nvidia,pins =   "gpio_pu4";
+                               nvidia,function = "pwm1";
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                       };
+
+                       /* Apalis PWM4 */
+                       gpio_pu3 {
+                               nvidia,pins =   "gpio_pu3";
+                               nvidia,function = "pwm0";
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                       };
+
+                       /* Apalis RESET_MOCI# */
+                       gmi_rst_n_pi4 {
+                               nvidia,pins = "gmi_rst_n_pi4";
+                               nvidia,function = "gmi";
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                       };
+
+                       /* Apalis SD1 */
+                       sdmmc1_clk_pz0 {
+                               nvidia,pins = "sdmmc1_clk_pz0";
+                               nvidia,function = "sdmmc1";
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                       };
+                       sdmmc1_cmd_pz1 {
+                               nvidia,pins =   "sdmmc1_cmd_pz1",
+                                               "sdmmc1_dat0_py7",
+                                               "sdmmc1_dat1_py6",
+                                               "sdmmc1_dat2_py5",
+                                               "sdmmc1_dat3_py4";
+                               nvidia,function = "sdmmc1";
+                               nvidia,pull = <TEGRA_PIN_PULL_UP>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                       };
+                       /* Apalis SD1_CD# */
+                       clk2_req_pcc5 {
+                               nvidia,pins = "clk2_req_pcc5";
+                               nvidia,function = "rsvd2";
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                               nvidia,enable-input = <TEGRA_PIN_ENABLE>;
+                       };
+
+                       /* Apalis SPI1 */
+                       spi1_sck_px5 {
+                               nvidia,pins =   "spi1_sck_px5",
+                                               "spi1_mosi_px4",
+                                               "spi1_miso_px7",
+                                               "spi1_cs0_n_px6";
+                               nvidia,function = "spi1";
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                       };
+
+                       /* Apalis SPI2 */
+                       lcd_sck_pz4 {
+                               nvidia,pins =   "lcd_sck_pz4",
+                                               "lcd_sdout_pn5",
+                                               "lcd_sdin_pz2",
+                                               "lcd_cs0_n_pn4";
+                               nvidia,function = "spi5";
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                       };
+
+                       /* Apalis UART1 */
+                       ulpi_data0 {
+                               nvidia,pins =   "ulpi_data0_po1",
+                                               "ulpi_data1_po2",
+                                               "ulpi_data2_po3",
+                                               "ulpi_data3_po4",
+                                               "ulpi_data4_po5",
+                                               "ulpi_data5_po6",
+                                               "ulpi_data6_po7",
+                                               "ulpi_data7_po0";
+                               nvidia,function = "uarta";
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                       };
+
+                       /* Apalis UART2 */
+                       ulpi_clk_py0 {
+                               nvidia,pins =   "ulpi_clk_py0",
+                                               "ulpi_dir_py1",
+                                               "ulpi_nxt_py2",
+                                               "ulpi_stp_py3";
+                               nvidia,function = "uartd";
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                       };
+
+                       /* Apalis UART3 */
+                       uart2_rxd_pc3 {
+                               nvidia,pins =   "uart2_rxd_pc3",
+                                               "uart2_txd_pc2";
+                               nvidia,function = "uartb";
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                       };
+
+                       /* Apalis UART4 */
+                       uart3_rxd_pw7 {
+                               nvidia,pins =   "uart3_rxd_pw7",
+                                               "uart3_txd_pw6";
+                               nvidia,function = "uartc";
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                       };
+
+                       /* Apalis USBO1_EN */
+                       gen2_i2c_scl_pt5 {
+                               nvidia,pins = "gen2_i2c_scl_pt5";
+                               nvidia,function = "rsvd4";
+                               nvidia,open-drain = <TEGRA_PIN_DISABLE>;
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                       };
+
+                       /* Apalis USBO1_OC# */
+                       gen2_i2c_sda_pt6 {
+                               nvidia,pins = "gen2_i2c_sda_pt6";
+                               nvidia,function = "rsvd4";
+                               nvidia,open-drain = <TEGRA_PIN_DISABLE>;
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                               nvidia,enable-input = <TEGRA_PIN_ENABLE>;
+                       };
+
+                       /* Apalis WAKE1_MICO */
+                       pv1 {
+                               nvidia,pins = "pv1";
+                               nvidia,function = "rsvd1";
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                               nvidia,enable-input = <TEGRA_PIN_ENABLE>;
+                       };
+
+                       /* eMMC (On-module) */
+                       sdmmc4_clk_pcc4 {
+                               nvidia,pins =   "sdmmc4_clk_pcc4",
+                                               "sdmmc4_rst_n_pcc3";
+                               nvidia,function = "sdmmc4";
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                       };
+                       sdmmc4_dat0_paa0 {
+                               nvidia,pins =   "sdmmc4_dat0_paa0",
+                                               "sdmmc4_dat1_paa1",
+                                               "sdmmc4_dat2_paa2",
+                                               "sdmmc4_dat3_paa3",
+                                               "sdmmc4_dat4_paa4",
+                                               "sdmmc4_dat5_paa5",
+                                               "sdmmc4_dat6_paa6",
+                                               "sdmmc4_dat7_paa7";
+                               nvidia,function = "sdmmc4";
+                               nvidia,pull = <TEGRA_PIN_PULL_UP>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                       };
+
+                       /* LVDS Transceiver Configuration */
+                       pbb0 {
+                               nvidia,pins =   "pbb0",
+                                               "pbb7",
+                                               "pcc1",
+                                               "pcc2";
+                               nvidia,function = "rsvd2";
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                               nvidia,enable-input = <TEGRA_PIN_DISABLE>;
+                               nvidia,lock = <TEGRA_PIN_DISABLE>;
+                       };
+                       pbb3 {
+                               nvidia,pins =   "pbb3",
+                                               "pbb4",
+                                               "pbb5",
+                                               "pbb6";
+                               nvidia,function = "displayb";
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                               nvidia,enable-input = <TEGRA_PIN_DISABLE>;
+                               nvidia,lock = <TEGRA_PIN_DISABLE>;
+                       };
+
+                       /* Power I2C (On-module) */
+                       pwr_i2c_scl_pz6 {
+                               nvidia,pins = "pwr_i2c_scl_pz6",
+                                             "pwr_i2c_sda_pz7";
+                               nvidia,function = "i2cpwr";
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                               nvidia,enable-input = <TEGRA_PIN_ENABLE>;
+                               nvidia,lock = <TEGRA_PIN_DISABLE>;
+                               nvidia,open-drain = <TEGRA_PIN_ENABLE>;
+                       };
+
+                       /*
+                        * THERMD_ALERT#, unlatched I2C address pin of LM95245
+                        * temperature sensor therefore requires disabling for
+                        * now
+                        */
+                       lcd_dc1_pd2 {
+                               nvidia,pins = "lcd_dc1_pd2";
+                               nvidia,function = "rsvd3";
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                               nvidia,enable-input = <TEGRA_PIN_ENABLE>;
+                       };
+
+                       /* TOUCH_PEN_INT# */
+                       pv0 {
+                               nvidia,pins = "pv0";
+                               nvidia,function = "rsvd1";
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                               nvidia,enable-input = <TEGRA_PIN_ENABLE>;
+                       };
+               };
+       };
+
+       hdmiddc: i2c@7000c700 {
+               clock-frequency = <100000>;
+       };
+
+       /*
+        * PWR_I2C: power I2C to audio codec, PMIC, temperature sensor and
+        * touch screen controller
+        */
+       i2c@7000d000 {
+               status = "okay";
+               clock-frequency = <100000>;
+
+               pmic: tps65911@2d {
+                       compatible = "ti,tps65911";
+                       reg = <0x2d>;
+
+                       interrupts = <GIC_SPI 86 IRQ_TYPE_LEVEL_HIGH>;
+                       #interrupt-cells = <2>;
+                       interrupt-controller;
+
+                       ti,system-power-controller;
+
+                       #gpio-cells = <2>;
+                       gpio-controller;
+
+                       vcc1-supply = <&sys_3v3_reg>;
+                       vcc2-supply = <&sys_3v3_reg>;
+                       vcc3-supply = <&vio_reg>;
+                       vcc4-supply = <&sys_3v3_reg>;
+                       vcc5-supply = <&sys_3v3_reg>;
+                       vcc6-supply = <&vio_reg>;
+                       vcc7-supply = <&sys_5v0_reg>;
+                       vccio-supply = <&sys_3v3_reg>;
+
+                       regulators {
+                               /* SW1: +V1.35_VDDIO_DDR */
+                               vdd1_reg: vdd1 {
+                                       regulator-name = "vddio_ddr_1v35";
+                                       regulator-min-microvolt = <1350000>;
+                                       regulator-max-microvolt = <1350000>;
+                                       regulator-always-on;
+                               };
+
+                               /* SW2: +V1.05 */
+                               vdd2_reg: vdd2 {
+                                       regulator-name =
+                                               "vdd_pexa,vdd_pexb,vdd_sata";
+                                       regulator-min-microvolt = <1050000>;
+                                       regulator-max-microvolt = <1050000>;
+                               };
+
+                               /* SW CTRL: +V1.0_VDD_CPU */
+                               vddctrl_reg: vddctrl {
+                                       regulator-name = "vdd_cpu,vdd_sys";
+                                       regulator-min-microvolt = <1150000>;
+                                       regulator-max-microvolt = <1150000>;
+                                       regulator-always-on;
+                               };
+
+                               /* SWIO: +V1.8 */
+                               vio_reg: vio {
+                                       regulator-name = "vdd_1v8_gen";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                                       regulator-always-on;
+                               };
+
+                               /* LDO1: unused */
+
+                               /*
+                                * EN_+V3.3 switching via FET:
+                                * +V3.3_AUDIO_AVDD_S, +V3.3 and +V1.8_VDD_LAN
+                                * see also v3_3 fixed supply
+                                */
+                               ldo2_reg: ldo2 {
+                                       regulator-name = "en_3v3";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                                       regulator-always-on;
+                               };
+
+                               /* +V1.2_CSI */
+                               ldo3_reg: ldo3 {
+                                       regulator-name =
+                                               "avdd_dsi_csi,pwrdet_mipi";
+                                       regulator-min-microvolt = <1200000>;
+                                       regulator-max-microvolt = <1200000>;
+                               };
+
+                               /* +V1.2_VDD_RTC */
+                               ldo4_reg: ldo4 {
+                                       regulator-name = "vdd_rtc";
+                                       regulator-min-microvolt = <1200000>;
+                                       regulator-max-microvolt = <1200000>;
+                                       regulator-always-on;
+                               };
+
+                               /*
+                                * +V2.8_AVDD_VDAC:
+                                * only required for analog RGB
+                                */
+                               ldo5_reg: ldo5 {
+                                       regulator-name = "avdd_vdac";
+                                       regulator-min-microvolt = <2800000>;
+                                       regulator-max-microvolt = <2800000>;
+                                       regulator-always-on;
+                               };
+
+                               /*
+                                * +V1.05_AVDD_PLLE: avdd_plle should be 1.05V
+                                * but LDO6 can't set voltage in 50mV
+                                * granularity
+                                */
+                               ldo6_reg: ldo6 {
+                                       regulator-name = "avdd_plle";
+                                       regulator-min-microvolt = <1100000>;
+                                       regulator-max-microvolt = <1100000>;
+                               };
+
+                               /* +V1.2_AVDD_PLL */
+                               ldo7_reg: ldo7 {
+                                       regulator-name = "avdd_pll";
+                                       regulator-min-microvolt = <1200000>;
+                                       regulator-max-microvolt = <1200000>;
+                                       regulator-always-on;
+                               };
+
+                               /* +V1.0_VDD_DDR_HS */
+                               ldo8_reg: ldo8 {
+                                       regulator-name = "vdd_ddr_hs";
+                                       regulator-min-microvolt = <1000000>;
+                                       regulator-max-microvolt = <1000000>;
+                                       regulator-always-on;
+                               };
+                       };
+               };
+
+               /* STMPE811 touch screen controller */
+               stmpe811@41 {
+                       compatible = "st,stmpe811";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <0x41>;
+                       interrupts = <TEGRA_GPIO(V, 0) IRQ_TYPE_LEVEL_LOW>;
+                       interrupt-parent = <&gpio>;
+                       interrupt-controller;
+                       id = <0>;
+                       blocks = <0x5>;
+                       irq-trigger = <0x1>;
+
+                       stmpe_touchscreen {
+                               compatible = "st,stmpe-ts";
+                               reg = <0>;
+                               /* 3.25 MHz ADC clock speed */
+                               st,adc-freq = <1>;
+                               /* 8 sample average control */
+                               st,ave-ctrl = <3>;
+                               /* 7 length fractional part in z */
+                               st,fraction-z = <7>;
+                               /*
+                                * 50 mA typical 80 mA max touchscreen drivers
+                                * current limit value
+                                */
+                               st,i-drive = <1>;
+                               /* 12-bit ADC */
+                               st,mod-12b = <1>;
+                               /* internal ADC reference */
+                               st,ref-sel = <0>;
+                               /* ADC converstion time: 80 clocks */
+                               st,sample-time = <4>;
+                               /* 1 ms panel driver settling time */
+                               st,settling = <3>;
+                               /* 5 ms touch detect interrupt delay */
+                               st,touch-det-delay = <5>;
+                       };
+               };
+
+               /*
+                * LM95245 temperature sensor
+                * Note: OVERT_N directly connected to PMIC PWRDN
+                */
+               temp-sensor@4c {
+                       compatible = "national,lm95245";
+                       reg = <0x4c>;
+               };
+
+               /* SW: +V1.2_VDD_CORE */
+               tps62362@60 {
+                       compatible = "ti,tps62362";
+                       reg = <0x60>;
+
+                       regulator-name = "tps62362-vout";
+                       regulator-min-microvolt = <900000>;
+                       regulator-max-microvolt = <1400000>;
+                       regulator-boot-on;
+                       regulator-always-on;
+                       ti,vsel0-state-low;
+                       /* VSEL1: EN_CORE_DVFS_N low for DVFS */
+                       ti,vsel1-state-low;
+               };
+       };
+
+       /* SPI4: CAN2 */
+       spi@7000da00 {
+               status = "okay";
+               spi-max-frequency = <10000000>;
+
+               can@1 {
+                       compatible = "microchip,mcp2515";
+                       reg = <1>;
+                       clocks = <&clk16m>;
+                       interrupt-parent = <&gpio>;
+                       interrupts = <TEGRA_GPIO(W, 3) GPIO_ACTIVE_LOW>;
+                       spi-max-frequency = <10000000>;
+               };
+       };
+
+       /* SPI6: CAN1 */
+       spi@7000de00 {
+               status = "okay";
+               spi-max-frequency = <10000000>;
+
+               can@0 {
+                       compatible = "microchip,mcp2515";
+                       reg = <0>;
+                       clocks = <&clk16m>;
+                       interrupt-parent = <&gpio>;
+                       interrupts = <TEGRA_GPIO(W, 2) GPIO_ACTIVE_LOW>;
+                       spi-max-frequency = <10000000>;
+               };
+       };
+
+       pmc@7000e400 {
+               nvidia,invert-interrupt;
+               nvidia,suspend-mode = <1>;
+               nvidia,cpu-pwr-good-time = <5000>;
+               nvidia,cpu-pwr-off-time = <5000>;
+               nvidia,core-pwr-good-time = <3845 3845>;
+               nvidia,core-pwr-off-time = <0>;
+               nvidia,core-power-req-active-high;
+               nvidia,sys-clock-req-active-high;
+       };
+
+       sdhci@78000600 {
+               status = "okay";
+               bus-width = <8>;
+               non-removable;
+       };
+
+       clocks {
+               compatible = "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               clk32k_in: clk@0 {
+                       compatible = "fixed-clock";
+                       reg=<0>;
+                       #clock-cells = <0>;
+                       clock-frequency = <32768>;
+               };
+               clk16m: clk@1 {
+                       compatible = "fixed-clock";
+                       reg=<1>;
+                       #clock-cells = <0>;
+                       clock-frequency = <16000000>;
+                       clock-output-names = "clk16m";
+               };
+       };
+
+       regulators {
+               compatible = "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               sys_3v3_reg: regulator@100 {
+                       compatible = "regulator-fixed";
+                       reg = <100>;
+                       regulator-name = "3v3";
+                       regulator-min-microvolt = <3300000>;
+                       regulator-max-microvolt = <3300000>;
+                       regulator-always-on;
+               };
+       };
+};
index 3189791a92897654701118ed2733432dceba57dd..cee8f2246fdb2467fbde27bae612a0752d7f6da2 100644 (file)
 
        pcie-controller@00003000 {
                status = "okay";
-               pex-clk-supply = <&sys_3v3_pexs_reg>;
-               vdd-supply = <&ldo1_reg>;
-               avdd-supply = <&ldo2_reg>;
+
+               avdd-pexa-supply = <&ldo1_reg>;
+               vdd-pexa-supply = <&ldo1_reg>;
+               avdd-pexb-supply = <&ldo1_reg>;
+               vdd-pexb-supply = <&ldo1_reg>;
+               avdd-pex-pll-supply = <&ldo1_reg>;
+               avdd-plle-supply = <&ldo1_reg>;
+               vddio-pex-ctl-supply = <&sys_3v3_reg>;
+               hvdd-pex-supply = <&sys_3v3_pexs_reg>;
 
                pci@1,0 {
                        status = "okay";
index 0cf0848a82d88964ddd0ed72fca19aa5c6cb135a..20637954624425795453cc78699e674276de5430 100644 (file)
 
        pcie-controller@00003000 {
                status = "okay";
-               pex-clk-supply = <&pex_hvdd_3v3_reg>;
-               vdd-supply = <&ldo1_reg>;
-               avdd-supply = <&ldo2_reg>;
+
+               /* AVDD_PEXA and VDD_PEXA inputs are grounded on Cardhu. */
+               avdd-pexb-supply = <&ldo1_reg>;
+               vdd-pexb-supply = <&ldo1_reg>;
+               avdd-pex-pll-supply = <&ldo1_reg>;
+               hvdd-pex-supply = <&pex_hvdd_3v3_reg>;
+               vddio-pex-ctl-supply = <&sys_3v3_reg>;
+               avdd-plle-supply = <&ldo2_reg>;
 
                pci@1,0 {
                        nvidia,num-lanes = <4>;
index 54805ce5efe094dbf28921d4f52374ff57bdf2c4..6b35c29278d7623530e3945a12bc1fbb62a8e470 100644 (file)
                interrupt-controller;
        };
 
+       apbmisc@70000800 {
+               compatible = "nvidia,tegra30-apbmisc", "nvidia,tegra20-apbmisc";
+               reg = <0x70000800 0x64   /* Chip revision */
+                      0x70000008 0x04>; /* Strapping options */
+       };
+
        pinmux: pinmux@70000868 {
                compatible = "nvidia,tegra30-pinmux";
                reg = <0x70000868 0xd4    /* Pad control registers */
                nvidia,ahb = <&ahb>;
        };
 
+       fuse@7000f800 {
+               compatible = "nvidia,tegra30-efuse";
+               reg = <0x7000f800 0x400>;
+               clocks = <&tegra_car TEGRA30_CLK_FUSE>;
+               clock-names = "fuse";
+               resets = <&tegra_car 39>;
+               reset-names = "fuse";
+       };
+
        ahub@70080000 {
                compatible = "nvidia,tegra30-ahub";
                reg = <0x70080000 0x200
index 0e6d3de2e09ed5056adbac96aaedab9f00bb5b85..ce7138c3af1bd852035eb2c00b7daf1e85b7ca85 100644 (file)
                        compatible = "atmel,osc", "fixed-clock";
                        clock-frequency = <12000000>;
                };
+
+               slow_xtal {
+                       clock-frequency = <32768>;
+               };
+
+               main_xtal {
+                       clock-frequency = <12000000>;
+               };
        };
 
        ahb {
index 0751a6a979a8e9575d85a67999497ae65dc7e4f4..3043296345b767525a6e7388ceb1b1cb43d4c862 100644 (file)
                        compatible = "atmel,osc", "fixed-clock";
                        clock-frequency = <12000000>;
                };
+
+               slow_xtal {
+                       clock-frequency = <32768>;
+               };
+
+               main_xtal {
+                       clock-frequency = <12000000>;
+               };
        };
 
        ahb {
index 285977682cf3f43b0aea162939637f95ed627d69..12edafefd44a3dfb17a5aae66a3fdeb3b8788679 100644 (file)
                        compatible = "atmel,osc", "fixed-clock";
                        clock-frequency = <12000000>;
                };
+
+               slow_xtal {
+                       clock-frequency = <32768>;
+               };
+
+               main_xtal {
+                       clock-frequency = <12000000>;
+               };
        };
 
        ahb {
index 290e60383baf4f6a23862996b8c5ecb38d33a2b0..68c0de36c339f7662b7545e072a60762b82627db 100644 (file)
                        compatible = "atmel,osc", "fixed-clock";
                        clock-frequency = <12000000>;
                };
+
+               slow_xtal {
+                       clock-frequency = <32768>;
+               };
+
+               main_xtal {
+                       clock-frequency = <12000000>;
+               };
        };
 
        ahb {
index e01e5a081def6fd6d47619461ae7da851ed4af29..36c771a2d765de67cb5ccf80c1fcd629db96fd71 100644 (file)
                reg = <0x0 0x08000000>;
        };
 
+       xtal24mhz: xtal24mhz@24M {
+               #clock-cells = <0>;
+               compatible = "fixed-clock";
+               clock-frequency = <24000000>;
+       };
+
+       core-module@10000000 {
+               compatible = "arm,core-module-versatile", "syscon";
+               reg = <0x10000000 0x200>;
+
+               /* OSC1 on AB, OSC4 on PB */
+               osc1: cm_aux_osc@24M {
+                       #clock-cells = <0>;
+                       compatible = "arm,versatile-cm-auxosc";
+                       clocks = <&xtal24mhz>;
+               };
+
+               /* The timer clock is the 24 MHz oscillator divided to 1MHz */
+               timclk: timclk@1M {
+                       #clock-cells = <0>;
+                       compatible = "fixed-factor-clock";
+                       clock-div = <24>;
+                       clock-mult = <1>;
+                       clocks = <&xtal24mhz>;
+               };
+
+               pclk: pclk@24M {
+                       #clock-cells = <0>;
+                       compatible = "fixed-factor-clock";
+                       clock-div = <1>;
+                       clock-mult = <1>;
+                       clocks = <&xtal24mhz>;
+               };
+       };
+
        flash@34000000 {
                compatible = "arm,versatile-flash";
                reg = <0x34000000 0x4000000>;
@@ -59,6 +94,8 @@
                        interrupt-controller;
                        #interrupt-cells = <1>;
                        reg = <0x10140000 0x1000>;
+                       clear-mask = <0xffffffff>;
+                       valid-mask = <0xffffffff>;
                };
 
                sic: intc@10003000 {
                        reg = <0x10003000 0x1000>;
                        interrupt-parent = <&vic>;
                        interrupts = <31>; /* Cascaded to vic */
+                       clear-mask = <0xffffffff>;
+                       valid-mask = <0xffc203f8>;
                };
 
                dma@10130000 {
                        compatible = "arm,pl081", "arm,primecell";
                        reg = <0x10130000 0x1000>;
                        interrupts = <17>;
+                       clocks = <&pclk>;
+                       clock-names = "apb_pclk";
                };
 
                uart0: uart@101f1000 {
                        compatible = "arm,pl011", "arm,primecell";
                        reg = <0x101f1000 0x1000>;
                        interrupts = <12>;
+                       clocks = <&xtal24mhz>, <&pclk>;
+                       clock-names = "uartclk", "apb_pclk";
                };
 
                uart1: uart@101f2000 {
                        compatible = "arm,pl011", "arm,primecell";
                        reg = <0x101f2000 0x1000>;
                        interrupts = <13>;
+                       clocks = <&xtal24mhz>, <&pclk>;
+                       clock-names = "uartclk", "apb_pclk";
                };
 
                uart2: uart@101f3000 {
                        compatible = "arm,pl011", "arm,primecell";
                        reg = <0x101f3000 0x1000>;
                        interrupts = <14>;
+                       clocks = <&xtal24mhz>, <&pclk>;
+                       clock-names = "uartclk", "apb_pclk";
                };
 
                smc@10100000 {
                        compatible = "arm,primecell";
                        reg = <0x10100000 0x1000>;
+                       clocks = <&pclk>;
+                       clock-names = "apb_pclk";
                };
 
                mpmc@10110000 {
                        compatible = "arm,primecell";
                        reg = <0x10110000 0x1000>;
+                       clocks = <&pclk>;
+                       clock-names = "apb_pclk";
                };
 
                display@10120000 {
                        compatible = "arm,pl110", "arm,primecell";
                        reg = <0x10120000 0x1000>;
                        interrupts = <16>;
+                       clocks = <&osc1>, <&pclk>;
+                       clock-names = "clcd", "apb_pclk";
                };
 
                sctl@101e0000 {
                        compatible = "arm,primecell";
                        reg = <0x101e0000 0x1000>;
+                       clocks = <&pclk>;
+                       clock-names = "apb_pclk";
                };
 
                watchdog@101e1000 {
                        compatible = "arm,primecell";
                        reg = <0x101e1000 0x1000>;
                        interrupts = <0>;
+                       clocks = <&pclk>;
+                       clock-names = "apb_pclk";
                };
 
                timer@101e2000 {
                        compatible = "arm,sp804", "arm,primecell";
                        reg = <0x101e2000 0x1000>;
                        interrupts = <4>;
+                       clocks = <&timclk>, <&timclk>, <&pclk>;
+                       clock-names = "timer0", "timer1", "apb_pclk";
                };
 
                timer@101e3000 {
                        compatible = "arm,sp804", "arm,primecell";
                        reg = <0x101e3000 0x1000>;
                        interrupts = <5>;
+                       clocks = <&timclk>, <&timclk>, <&pclk>;
+                       clock-names = "timer0", "timer1", "apb_pclk";
                };
 
                gpio0: gpio@101e4000 {
                        #gpio-cells = <2>;
                        interrupt-controller;
                        #interrupt-cells = <2>;
+                       clocks = <&pclk>;
+                       clock-names = "apb_pclk";
                };
 
                gpio1: gpio@101e5000 {
                        #gpio-cells = <2>;
                        interrupt-controller;
                        #interrupt-cells = <2>;
+                       clocks = <&pclk>;
+                       clock-names = "apb_pclk";
                };
 
                rtc@101e8000 {
                        compatible = "arm,pl030", "arm,primecell";
                        reg = <0x101e8000 0x1000>;
                        interrupts = <10>;
+                       clocks = <&pclk>;
+                       clock-names = "apb_pclk";
                };
 
                sci@101f0000 {
                        compatible = "arm,primecell";
                        reg = <0x101f0000 0x1000>;
                        interrupts = <15>;
+                       clocks = <&pclk>;
+                       clock-names = "apb_pclk";
                };
 
                ssp@101f4000 {
                        compatible = "arm,pl022", "arm,primecell";
                        reg = <0x101f4000 0x1000>;
                        interrupts = <11>;
+                       clocks = <&xtal24mhz>, <&pclk>;
+                       clock-names = "SSPCLK", "apb_pclk";
                };
 
                fpga {
                                compatible = "arm,primecell";
                                reg = <0x4000 0x1000>;
                                interrupts = <24>;
+                               clocks = <&pclk>;
+                               clock-names = "apb_pclk";
                        };
                        mmc@5000 {
-                               compatible = "arm,primecell";
+                               compatible = "arm,pl180", "arm,primecell";
                                reg = < 0x5000 0x1000>;
                                interrupts-extended = <&vic 22 &sic 2>;
+                               clocks = <&xtal24mhz>, <&pclk>;
+                               clock-names = "mclk", "apb_pclk";
                        };
                        kmi@6000 {
                                compatible = "arm,pl050", "arm,primecell";
                                reg = <0x6000 0x1000>;
                                interrupt-parent = <&sic>;
                                interrupts = <3>;
+                               clocks = <&xtal24mhz>, <&pclk>;
+                               clock-names = "KMIREFCLK", "apb_pclk";
                        };
                        kmi@7000 {
                                compatible = "arm,pl050", "arm,primecell";
                                reg = <0x7000 0x1000>;
                                interrupt-parent = <&sic>;
                                interrupts = <4>;
+                               clocks = <&xtal24mhz>, <&pclk>;
+                               clock-names = "KMIREFCLK", "apb_pclk";
                        };
                };
        };
index 65f6577113235749c3635dc30d321fa3c775b1c0..d025048119d3078ee1730531071a3e3ca5189d37 100644 (file)
@@ -13,6 +13,8 @@
                        #gpio-cells = <2>;
                        interrupt-controller;
                        #interrupt-cells = <2>;
+                       clocks = <&pclk>;
+                       clock-names = "apb_pclk";
                };
 
                gpio3: gpio@101e7000 {
@@ -23,6 +25,8 @@
                        #gpio-cells = <2>;
                        interrupt-controller;
                        #interrupt-cells = <2>;
+                       clocks = <&pclk>;
+                       clock-names = "apb_pclk";
                };
 
                fpga {
                                reg = <0x9000 0x1000>;
                                interrupt-parent = <&sic>;
                                interrupts = <6>;
+                               clocks = <&xtal24mhz>, <&pclk>;
+                               clock-names = "uartclk", "apb_pclk";
                        };
                        sci@a000 {
                                compatible = "arm,primecell";
                                reg = <0xa000 0x1000>;
                                interrupt-parent = <&sic>;
                                interrupts = <5>;
+                               clocks = <&xtal24mhz>;
+                               clock-names = "apb_pclk";
                        };
                        mmc@b000 {
-                               compatible = "arm,primecell";
+                               compatible = "arm,pl180", "arm,primecell";
                                reg = <0xb000 0x1000>;
                                interrupts-extended = <&vic 23 &sic 2>;
+                               clocks = <&xtal24mhz>, <&pclk>;
+                               clock-names = "mclk", "apb_pclk";
                        };
                };
        };
index 6cc314e7b8fb7064af09b3d7d24d6f7ebbba714e..583dd363c9dc4e3c78a5f0c4a16bf20450998249 100644 (file)
@@ -14,6 +14,8 @@
 
 / {
        aliases {
+               can0 = &can0;
+               can1 = &can1;
                serial0 = &uart0;
                serial1 = &uart1;
                serial2 = &uart2;
                                        <&clks VF610_CLK_DMAMUX1>;
                        };
 
+                       can0: flexcan@40020000 {
+                               compatible = "fsl,vf610-flexcan";
+                               reg = <0x40020000 0x4000>;
+                               interrupts = <0 58 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks VF610_CLK_FLEXCAN0>,
+                                        <&clks VF610_CLK_FLEXCAN0>;
+                               clock-names = "ipg", "per";
+                               status = "disabled";
+                       };
+
                        uart0: serial@40027000 {
                                compatible = "fsl,vf610-lpuart";
                                reg = <0x40027000 0x1000>;
 
                        esdhc1: esdhc@400b2000 {
                                compatible = "fsl,imx53-esdhc";
-                               reg = <0x400b2000 0x4000>;
+                               reg = <0x400b2000 0x1000>;
                                interrupts = <0 28 0x04>;
                                clocks = <&clks VF610_CLK_IPG_BUS>,
                                        <&clks VF610_CLK_PLATFORM_BUS>,
                                clock-names = "ipg", "ahb", "ptp";
                                status = "disabled";
                        };
+
+                       can1: flexcan@400d4000 {
+                               compatible = "fsl,vf610-flexcan";
+                               reg = <0x400d4000 0x4000>;
+                               interrupts = <0 59 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks VF610_CLK_FLEXCAN1>,
+                                        <&clks VF610_CLK_FLEXCAN1>;
+                               clock-names = "ipg", "per";
+                               status = "disabled";
+                       };
+
                };
        };
 };
index 760bbc463c5b18afbfb60a7b3510d70f52e27547..6cc83d4c6c76100ebdc2863a28ae69d89f96fef9 100644 (file)
                interrupt-parent = <&intc>;
                ranges;
 
+               adc@f8007100 {
+                       compatible = "xlnx,zynq-xadc-1.00.a";
+                       reg = <0xf8007100 0x20>;
+                       interrupts = <0 7 4>;
+                       interrupt-parent = <&intc>;
+                       clocks = <&clkc 12>;
+               };
+
+               can0: can@e0008000 {
+                       compatible = "xlnx,zynq-can-1.0";
+                       status = "disabled";
+                       clocks = <&clkc 19>, <&clkc 36>;
+                       clock-names = "can_clk", "pclk";
+                       reg = <0xe0008000 0x1000>;
+                       interrupts = <0 28 4>;
+                       interrupt-parent = <&intc>;
+                       tx-fifo-depth = <0x40>;
+                       rx-fifo-depth = <0x40>;
+               };
+
+               can1: can@e0009000 {
+                       compatible = "xlnx,zynq-can-1.0";
+                       status = "disabled";
+                       clocks = <&clkc 20>, <&clkc 37>;
+                       clock-names = "can_clk", "pclk";
+                       reg = <0xe0009000 0x1000>;
+                       interrupts = <0 51 4>;
+                       interrupt-parent = <&intc>;
+                       tx-fifo-depth = <0x40>;
+                       rx-fifo-depth = <0x40>;
+               };
+
+               gpio0: gpio@e000a000 {
+                       compatible = "xlnx,zynq-gpio-1.0";
+                       #gpio-cells = <2>;
+                       clocks = <&clkc 42>;
+                       gpio-controller;
+                       interrupt-parent = <&intc>;
+                       interrupts = <0 20 4>;
+                       reg = <0xe000a000 0x1000>;
+               };
+
                i2c0: i2c@e0004000 {
                        compatible = "cdns,i2c-r1p10";
                        status = "disabled";
                };
 
                uart0: serial@e0000000 {
-                       compatible = "xlnx,xuartps";
+                       compatible = "xlnx,xuartps", "cdns,uart-r1p8";
                        status = "disabled";
                        clocks = <&clkc 23>, <&clkc 40>;
-                       clock-names = "ref_clk", "aper_clk";
+                       clock-names = "uart_clk", "pclk";
                        reg = <0xE0000000 0x1000>;
                        interrupts = <0 27 4>;
                };
 
                uart1: serial@e0001000 {
-                       compatible = "xlnx,xuartps";
+                       compatible = "xlnx,xuartps", "cdns,uart-r1p8";
                        status = "disabled";
                        clocks = <&clkc 24>, <&clkc 41>;
-                       clock-names = "ref_clk", "aper_clk";
+                       clock-names = "uart_clk", "pclk";
                        reg = <0xE0001000 0x1000>;
                        interrupts = <0 50 4>;
                };
 
+               spi0: spi@e0006000 {
+                       compatible = "xlnx,zynq-spi-r1p6";
+                       reg = <0xe0006000 0x1000>;
+                       status = "disabled";
+                       interrupt-parent = <&intc>;
+                       interrupts = <0 26 4>;
+                       clocks = <&clkc 25>, <&clkc 34>;
+                       clock-names = "ref_clk", "pclk";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+               };
+
+               spi1: spi@e0007000 {
+                       compatible = "xlnx,zynq-spi-r1p6";
+                       reg = <0xe0007000 0x1000>;
+                       status = "disabled";
+                       interrupt-parent = <&intc>;
+                       interrupts = <0 49 4>;
+                       clocks = <&clkc 26>, <&clkc 35>;
+                       clock-names = "ref_clk", "pclk";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+               };
+
                gem0: ethernet@e000b000 {
                        compatible = "cdns,gem";
                        reg = <0xe000b000 0x4000>;
                        };
                };
 
+               dmac_s: dmac@f8003000 {
+                       compatible = "arm,pl330", "arm,primecell";
+                       reg = <0xf8003000 0x1000>;
+                       interrupt-parent = <&intc>;
+                       interrupts = <0 13 4>,
+                                    <0 14 4>, <0 15 4>,
+                                    <0 16 4>, <0 17 4>,
+                                    <0 40 4>, <0 41 4>,
+                                    <0 42 4>, <0 43 4>;
+                       #dma-cells = <1>;
+                       #dma-channels = <8>;
+                       #dma-requests = <4>;
+                       clocks = <&clkc 27>;
+                       clock-names = "apb_pclk";
+               };
+
                devcfg: devcfg@f8007000 {
                        compatible = "xlnx,zynq-devcfg-1.0";
                        reg = <0xf8007000 0x100>;
diff --git a/arch/arm/boot/dts/zynq-parallella.dts b/arch/arm/boot/dts/zynq-parallella.dts
new file mode 100644 (file)
index 0000000..41afd9d
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2014 SUSE LINUX Products GmbH
+ *
+ * Derived from zynq-zed.dts:
+ *
+ *  Copyright (C) 2011 Xilinx
+ *  Copyright (C) 2012 National Instruments Corp.
+ *  Copyright (C) 2013 Xilinx
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+/dts-v1/;
+/include/ "zynq-7000.dtsi"
+
+/ {
+       model = "Adapteva Parallella Board";
+       compatible = "adapteva,parallella", "xlnx,zynq-7000";
+
+       memory {
+               device_type = "memory";
+               reg = <0 0x40000000>;
+       };
+
+       chosen {
+               bootargs = "console=ttyPS0,115200 earlyprintk root=/dev/mmcblk0p2 rootfstype=ext4 rw rootwait";
+               linux,stdout-path = "/amba/serial@e0001000";
+       };
+};
+
+&gem0 {
+       status = "okay";
+       phy-mode = "rgmii-id";
+       phy-handle = <&ethernet_phy>;
+       #address-cells = <1>;
+       #size-cells = <0>;
+
+       ethernet_phy: ethernet-phy@0 {
+               /* Marvell 88E1318 */
+               compatible = "ethernet-phy-id0141.0e90",
+                            "ethernet-phy-ieee802.3-c22";
+               reg = <0>;
+               marvell,reg-init = <0x3 0x10 0xff00 0x1e>,
+                                  <0x3 0x11 0xfff0 0xa>;
+       };
+};
+
+&i2c0 {
+       status = "okay";
+};
+
+&sdhci1 {
+       status = "okay";
+};
+
+&uart1 {
+       status = "okay";
+};
index 5e09cee33d4230773f8687fd3e187f22e49d0b77..835c3089c61cb6d55e6fadc93795d224ec1bec00 100644 (file)
 
 };
 
+&can0 {
+       status = "okay";
+};
+
 &gem0 {
        status = "okay";
        phy-mode = "rgmii";
index fd6bff0c5b967a7503c8912c8ef2a52101e4c7eb..19211324772f387c4925984e58fe29b4682fed38 100644 (file)
@@ -233,13 +233,13 @@ static void __init sp804_of_init(struct device_node *np)
        if (IS_ERR(clk1))
                clk1 = NULL;
 
-       /* Get the 2nd clock if the timer has 2 timer clocks */
+       /* Get the 2nd clock if the timer has 3 timer clocks */
        if (of_count_phandle_with_args(np, "clocks", "#clock-cells") == 3) {
                clk2 = of_clk_get(np, 1);
                if (IS_ERR(clk2)) {
                        pr_err("sp804: %s clock not found: %d\n", np->name,
                                (int)PTR_ERR(clk2));
-                       goto err;
+                       clk2 = NULL;
                }
        } else
                clk2 = clk1;
index 065adddeee3ec4d77bcba307f3dd0972ed85d9e3..d9675c68a39925e1e496f8112601db3d84e7119e 100644 (file)
@@ -96,6 +96,7 @@ CONFIG_I2C_GPIO=y
 CONFIG_I2C_SH_MOBILE=y
 # CONFIG_HWMON is not set
 CONFIG_REGULATOR=y
+CONFIG_REGULATOR_GPIO=y
 CONFIG_MEDIA_SUPPORT=y
 CONFIG_VIDEO_DEV=y
 CONFIG_MEDIA_CAMERA_SUPPORT=y
@@ -127,6 +128,9 @@ CONFIG_USB_ETH=m
 CONFIG_MMC=y
 CONFIG_MMC_SDHI=y
 CONFIG_MMC_SH_MMCIF=y
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+CONFIG_LEDS_GPIO=y
 CONFIG_RTC_CLASS=y
 CONFIG_RTC_DRV_S35390A=y
 CONFIG_DMADEVICES=y
index 4bf72264b17511037f1fed6f922b87d5480d6b32..fbebcbce1e8c8bf46e3ab8e254ab109327160830 100644 (file)
@@ -27,6 +27,7 @@ CONFIG_PARTITION_ADVANCED=y
 CONFIG_ARCH_BCM=y
 CONFIG_ARCH_BCM_MOBILE=y
 CONFIG_ARM_THUMBEE=y
+CONFIG_SMP=y
 CONFIG_PREEMPT=y
 CONFIG_AEABI=y
 # CONFIG_COMPACTION is not set
index e07a227ec0dbb331bae2428427dc36fec444adec..fc7d1683bf67c0b980ae6450e613e7381f4201ca 100644 (file)
@@ -8,15 +8,17 @@ CONFIG_MODULE_UNLOAD=y
 # CONFIG_BLK_DEV_BSG is not set
 CONFIG_PARTITION_ADVANCED=y
 CONFIG_ARCH_EXYNOS=y
-CONFIG_S3C_LOWLEVEL_UART_PORT=3
-CONFIG_S3C24XX_PWM=y
-CONFIG_ARCH_EXYNOS5=y
-CONFIG_MACH_EXYNOS4_DT=y
+CONFIG_ARCH_EXYNOS3=y
+CONFIG_EXYNOS5420_MCPM=y
 CONFIG_SMP=y
+CONFIG_BIG_LITTLE=y
+CONFIG_BL_SWITCHER=y
+CONFIG_BL_SWITCHER_DUMMY_IF=y
 CONFIG_NR_CPUS=8
 CONFIG_PREEMPT=y
 CONFIG_AEABI=y
 CONFIG_HIGHMEM=y
+CONFIG_CMA=y
 CONFIG_ZBOOT_ROM_TEXT=0x0
 CONFIG_ZBOOT_ROM_BSS=0x0
 CONFIG_ARM_APPENDED_DTB=y
@@ -24,6 +26,7 @@ CONFIG_ARM_ATAG_DTB_COMPAT=y
 CONFIG_CMDLINE="root=/dev/ram0 rw ramdisk=8192 initrd=0x41000000,8M console=ttySAC1,115200 init=/linuxrc mem=256M"
 CONFIG_VFP=y
 CONFIG_NEON=y
+CONFIG_PM_RUNTIME=y
 CONFIG_NET=y
 CONFIG_PACKET=y
 CONFIG_UNIX=y
@@ -34,6 +37,8 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_DEVTMPFS=y
 CONFIG_DEVTMPFS_MOUNT=y
 CONFIG_PROC_DEVICETREE=y
+CONFIG_DMA_CMA=y
+CONFIG_CMA_SIZE_MBYTES=64
 CONFIG_BLK_DEV_LOOP=y
 CONFIG_BLK_DEV_CRYPTOLOOP=y
 CONFIG_BLK_DEV_RAM=y
@@ -66,11 +71,22 @@ CONFIG_I2C=y
 CONFIG_I2C_MUX=y
 CONFIG_I2C_ARB_GPIO_CHALLENGE=y
 CONFIG_I2C_EXYNOS5=y
+CONFIG_I2C_CROS_EC_TUNNEL=y
+CONFIG_SPI=y
+CONFIG_SPI_S3C64XX=y
 CONFIG_I2C_S3C2410=y
 CONFIG_DEBUG_GPIO=y
+CONFIG_POWER_SUPPLY=y
+CONFIG_CHARGER_TPS65090=y
 # CONFIG_HWMON is not set
+CONFIG_THERMAL=y
+CONFIG_EXYNOS_THERMAL=y
+CONFIG_EXYNOS_THERMAL_CORE=y
+CONFIG_WATCHDOG=y
+CONFIG_S3C2410_WATCHDOG=y
 CONFIG_MFD_CROS_EC=y
 CONFIG_MFD_CROS_EC_I2C=y
+CONFIG_MFD_CROS_EC_SPI=y
 CONFIG_MFD_MAX77686=y
 CONFIG_MFD_MAX8997=y
 CONFIG_MFD_SEC_CORE=y
@@ -80,6 +96,7 @@ CONFIG_REGULATOR_FIXED_VOLTAGE=y
 CONFIG_REGULATOR_GPIO=y
 CONFIG_REGULATOR_MAX8997=y
 CONFIG_REGULATOR_MAX77686=y
+CONFIG_REGULATOR_S2MPA01=y
 CONFIG_REGULATOR_S2MPS11=y
 CONFIG_REGULATOR_S5M8767=y
 CONFIG_REGULATOR_TPS65090=y
@@ -88,28 +105,50 @@ CONFIG_FB_MODE_HELPERS=y
 CONFIG_FB_SIMPLE=y
 CONFIG_EXYNOS_VIDEO=y
 CONFIG_EXYNOS_MIPI_DSI=y
-CONFIG_EXYNOS_DP=y
 CONFIG_FRAMEBUFFER_CONSOLE=y
 CONFIG_FONTS=y
 CONFIG_FONT_7x14=y
 CONFIG_LOGO=y
+CONFIG_SOUND=y
+CONFIG_SND=y
+CONFIG_SND_SOC=y
+CONFIG_SND_SOC_SAMSUNG=y
+CONFIG_SND_SOC_SNOW=y
 CONFIG_USB=y
+CONFIG_USB_XHCI_HCD=y
 CONFIG_USB_EHCI_HCD=y
 CONFIG_USB_EHCI_EXYNOS=y
+CONFIG_USB_OHCI_HCD=y
+CONFIG_USB_OHCI_EXYNOS=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_DWC3=y
-CONFIG_USB_PHY=y
-CONFIG_SAMSUNG_USB2PHY=y
-CONFIG_SAMSUNG_USB3PHY=y
+CONFIG_USB_HSIC_USB3503=y
 CONFIG_MMC=y
 CONFIG_MMC_SDHCI=y
 CONFIG_MMC_SDHCI_S3C=y
+CONFIG_MMC_SDHCI_S3C_DMA=y
 CONFIG_MMC_DW=y
 CONFIG_MMC_DW_IDMAC=y
 CONFIG_MMC_DW_EXYNOS=y
 CONFIG_RTC_CLASS=y
+CONFIG_RTC_DRV_MAX77686=y
+CONFIG_RTC_DRV_S5M=y
 CONFIG_RTC_DRV_S3C=y
+CONFIG_DMADEVICES=y
+CONFIG_PL330_DMA=y
 CONFIG_COMMON_CLK_MAX77686=y
+CONFIG_COMMON_CLK_S2MPS11=y
+CONFIG_EXYNOS_IOMMU=y
+CONFIG_IIO=y
+CONFIG_EXYNOS_ADC=y
+CONFIG_PWM=y
+CONFIG_PWM_SAMSUNG=y
+CONFIG_PHY_EXYNOS5250_SATA=y
+CONFIG_PHY_SAMSUNG_USB2=y
+CONFIG_PHY_EXYNOS4210_USB2=y
+CONFIG_PHY_EXYNOS4X12_USB2=y
+CONFIG_PHY_EXYNOS5250_USB2=y
+CONFIG_PHY_EXYNOS5_USBDRD=y
 CONFIG_EXT2_FS=y
 CONFIG_EXT3_FS=y
 CONFIG_EXT4_FS=y
@@ -123,6 +162,7 @@ CONFIG_NLS_CODEPAGE_437=y
 CONFIG_NLS_ASCII=y
 CONFIG_NLS_ISO8859_1=y
 CONFIG_PRINTK_TIME=y
+CONFIG_DEBUG_FS=y
 CONFIG_MAGIC_SYSRQ=y
 CONFIG_DEBUG_KERNEL=y
 CONFIG_DETECT_HUNG_TASK=y
diff --git a/arch/arm/configs/genmai_defconfig b/arch/arm/configs/genmai_defconfig
deleted file mode 100644 (file)
index d238faf..0000000
+++ /dev/null
@@ -1,122 +0,0 @@
-CONFIG_SYSVIPC=y
-CONFIG_NO_HZ=y
-CONFIG_IKCONFIG=y
-CONFIG_IKCONFIG_PROC=y
-CONFIG_LOG_BUF_SHIFT=16
-CONFIG_CC_OPTIMIZE_FOR_SIZE=y
-CONFIG_SYSCTL_SYSCALL=y
-CONFIG_EMBEDDED=y
-CONFIG_PERF_EVENTS=y
-CONFIG_SLAB=y
-# CONFIG_LBDAF is not set
-# CONFIG_BLK_DEV_BSG is not set
-# CONFIG_IOSCHED_DEADLINE is not set
-# CONFIG_IOSCHED_CFQ is not set
-CONFIG_ARCH_SHMOBILE_LEGACY=y
-CONFIG_ARCH_R7S72100=y
-CONFIG_MACH_GENMAI=y
-# CONFIG_SH_TIMER_CMT is not set
-# CONFIG_SH_TIMER_MTU2 is not set
-# CONFIG_SH_TIMER_TMU is not set
-# CONFIG_EM_TIMER_STI is not set
-CONFIG_ARM_ERRATA_430973=y
-CONFIG_ARM_ERRATA_458693=y
-CONFIG_ARM_ERRATA_460075=y
-CONFIG_ARM_ERRATA_743622=y
-CONFIG_ARM_ERRATA_754322=y
-CONFIG_AEABI=y
-# CONFIG_OABI_COMPAT is not set
-CONFIG_FORCE_MAX_ZONEORDER=13
-CONFIG_ZBOOT_ROM_TEXT=0x0
-CONFIG_ZBOOT_ROM_BSS=0x0
-CONFIG_ARM_APPENDED_DTB=y
-CONFIG_KEXEC=y
-CONFIG_AUTO_ZRELADDR=y
-CONFIG_VFP=y
-CONFIG_NEON=y
-# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
-CONFIG_PM_RUNTIME=y
-CONFIG_NET=y
-CONFIG_PACKET=y
-CONFIG_UNIX=y
-CONFIG_INET=y
-CONFIG_IP_PNP=y
-CONFIG_IP_PNP_DHCP=y
-# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-# CONFIG_INET_XFRM_MODE_BEET is not set
-# CONFIG_INET_LRO is not set
-# CONFIG_INET_DIAG is not set
-# CONFIG_IPV6 is not set
-# CONFIG_WIRELESS is not set
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-CONFIG_DEVTMPFS=y
-CONFIG_DEVTMPFS_MOUNT=y
-CONFIG_EEPROM_AT24=y
-CONFIG_NETDEVICES=y
-# CONFIG_NET_CORE is not set
-# CONFIG_NET_VENDOR_ARC is not set
-# CONFIG_NET_CADENCE is not set
-# CONFIG_NET_VENDOR_BROADCOM is not set
-# CONFIG_NET_VENDOR_CIRRUS is not set
-# CONFIG_NET_VENDOR_FARADAY is not set
-# CONFIG_NET_VENDOR_INTEL is not set
-# CONFIG_NET_VENDOR_MARVELL is not set
-# CONFIG_NET_VENDOR_MICREL is not set
-# CONFIG_NET_VENDOR_NATSEMI is not set
-CONFIG_SH_ETH=y
-# CONFIG_NET_VENDOR_SEEQ is not set
-# CONFIG_NET_VENDOR_SMSC is not set
-# CONFIG_NET_VENDOR_STMICRO is not set
-# CONFIG_NET_VENDOR_VIA is not set
-# CONFIG_NET_VENDOR_WIZNET is not set
-# CONFIG_WLAN is not set
-# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-CONFIG_INPUT_EVDEV=y
-# CONFIG_KEYBOARD_ATKBD is not set
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_SERIO is not set
-# CONFIG_LEGACY_PTYS is not set
-CONFIG_SERIAL_SH_SCI=y
-CONFIG_SERIAL_SH_SCI_NR_UARTS=10
-CONFIG_SERIAL_SH_SCI_CONSOLE=y
-# CONFIG_HW_RANDOM is not set
-CONFIG_I2C_CHARDEV=y
-CONFIG_I2C_RIIC=y
-CONFIG_SPI=y
-CONFIG_SPI_RSPI=y
-# CONFIG_HWMON is not set
-CONFIG_THERMAL=y
-CONFIG_RCAR_THERMAL=y
-CONFIG_REGULATOR=y
-CONFIG_REGULATOR_FIXED_VOLTAGE=y
-CONFIG_DRM=y
-CONFIG_DRM_RCAR_DU=y
-# CONFIG_USB_SUPPORT is not set
-CONFIG_MMC=y
-CONFIG_MMC_SDHI=y
-CONFIG_MMC_SH_MMCIF=y
-CONFIG_NEW_LEDS=y
-CONFIG_LEDS_CLASS=y
-CONFIG_RTC_CLASS=y
-CONFIG_DMADEVICES=y
-CONFIG_SH_DMAE=y
-# CONFIG_IOMMU_SUPPORT is not set
-# CONFIG_DNOTIFY is not set
-CONFIG_MSDOS_FS=y
-CONFIG_VFAT_FS=y
-CONFIG_TMPFS=y
-CONFIG_CONFIGFS_FS=y
-# CONFIG_MISC_FILESYSTEMS is not set
-CONFIG_NFS_FS=y
-CONFIG_NFS_V3_ACL=y
-CONFIG_NFS_V4=y
-CONFIG_NFS_V4_1=y
-CONFIG_ROOT_NFS=y
-CONFIG_NLS_CODEPAGE_437=y
-CONFIG_NLS_ISO8859_1=y
-# CONFIG_ENABLE_WARN_DEPRECATED is not set
-# CONFIG_ENABLE_MUST_CHECK is not set
-# CONFIG_ARM_UNWIND is not set
-# CONFIG_CRYPTO_ANSI_CPRNG is not set
-# CONFIG_CRYPTO_HW is not set
index f186bdfa236918aa8d27a4cec4229698af9d74c9..9630687e7d07e2d1628f5c86e9ab3cb28c8e85c6 100644 (file)
@@ -3,7 +3,9 @@ CONFIG_NO_HZ=y
 CONFIG_HIGH_RES_TIMERS=y
 CONFIG_BLK_DEV_INITRD=y
 CONFIG_RD_LZMA=y
+CONFIG_ARCH_HISI=y
 CONFIG_ARCH_HI3xxx=y
+CONFIG_ARCH_HIX5HD2=y
 CONFIG_SMP=y
 CONFIG_PREEMPT=y
 CONFIG_AEABI=y
index bada59d93b675310637efa063035c0d23ec6b066..63bde0efc0419b9e4981a369d5b3068d5b560932 100644 (file)
@@ -1,6 +1,7 @@
 # CONFIG_SWAP is not set
 CONFIG_SYSVIPC=y
 CONFIG_POSIX_MQUEUE=y
+CONFIG_FHANDLE=y
 CONFIG_NO_HZ=y
 CONFIG_HIGH_RES_TIMERS=y
 CONFIG_LOG_BUF_SHIFT=14
@@ -35,10 +36,8 @@ CONFIG_MACH_EUKREA_CPUIMX27_USESDHC2=y
 CONFIG_MACH_EUKREA_CPUIMX27_USEUART4=y
 CONFIG_MACH_MX27_3DS=y
 CONFIG_MACH_IMX27_VISSTRIM_M10=y
-CONFIG_MACH_IMX27LITE=y
 CONFIG_MACH_PCA100=y
 CONFIG_MACH_MXT_TD60=y
-CONFIG_MACH_IMX27IPCAM=y
 CONFIG_MACH_IMX27_DT=y
 CONFIG_PREEMPT=y
 CONFIG_AEABI=y
@@ -159,6 +158,8 @@ CONFIG_USB_CHIPIDEA=y
 CONFIG_USB_CHIPIDEA_UDC=y
 CONFIG_USB_CHIPIDEA_HOST=y
 CONFIG_NOP_USB_XCEIV=y
+CONFIG_USB_GADGET=y
+CONFIG_USB_ETH=m
 CONFIG_MMC=y
 CONFIG_MMC_SDHCI=y
 CONFIG_MMC_SDHCI_PLTFM=y
index 59b7e45142d80931c5e46882188c524530d4b22a..16cfec4385c8215796b9090b69fc7fd1b8fa98ba 100644 (file)
@@ -1,5 +1,6 @@
 CONFIG_KERNEL_LZO=y
 CONFIG_SYSVIPC=y
+CONFIG_FHANDLE=y
 CONFIG_NO_HZ=y
 CONFIG_HIGH_RES_TIMERS=y
 CONFIG_LOG_BUF_SHIFT=18
@@ -31,11 +32,12 @@ CONFIG_MACH_IMX35_DT=y
 CONFIG_MACH_PCM043=y
 CONFIG_MACH_MX35_3DS=y
 CONFIG_MACH_VPR200=y
-CONFIG_MACH_IMX51_DT=y
+CONFIG_SOC_IMX51=y
 CONFIG_SOC_IMX50=y
 CONFIG_SOC_IMX53=y
 CONFIG_SOC_IMX6Q=y
 CONFIG_SOC_IMX6SL=y
+CONFIG_SOC_IMX6SX=y
 CONFIG_SOC_VF610=y
 CONFIG_PCI=y
 CONFIG_PCI_IMX6=y
@@ -67,6 +69,8 @@ CONFIG_IP_PNP_DHCP=y
 # CONFIG_INET_LRO is not set
 CONFIG_IPV6=y
 CONFIG_NETFILTER=y
+CONFIG_CAN=y
+CONFIG_CAN_FLEXCAN=y
 CONFIG_CFG80211=y
 CONFIG_MAC80211=y
 CONFIG_RFKILL=y
@@ -160,6 +164,7 @@ CONFIG_SPI=y
 CONFIG_SPI_IMX=y
 CONFIG_GPIO_SYSFS=y
 CONFIG_GPIO_MC9S08DZ60=y
+CONFIG_GPIO_STMPE=y
 # CONFIG_HWMON is not set
 CONFIG_WATCHDOG=y
 CONFIG_IMX2_WDT=y
@@ -242,6 +247,7 @@ CONFIG_RTC_DRV_SNVS=y
 CONFIG_DMADEVICES=y
 CONFIG_IMX_SDMA=y
 CONFIG_MXS_DMA=y
+CONFIG_FSL_EDMA=y
 CONFIG_STAGING=y
 CONFIG_DRM_IMX=y
 CONFIG_DRM_IMX_FB_HELPER=y
@@ -288,6 +294,7 @@ CONFIG_NLS_ASCII=y
 CONFIG_NLS_ISO8859_1=y
 CONFIG_NLS_ISO8859_15=m
 CONFIG_NLS_UTF8=y
+CONFIG_PRINTK_TIME=y
 CONFIG_DEBUG_FS=y
 CONFIG_MAGIC_SYSRQ=y
 # CONFIG_SCHED_DEBUG is not set
diff --git a/arch/arm/configs/kirkwood_defconfig b/arch/arm/configs/kirkwood_defconfig
deleted file mode 100644 (file)
index b9e480c..0000000
+++ /dev/null
@@ -1,181 +0,0 @@
-CONFIG_SYSVIPC=y
-CONFIG_NO_HZ=y
-CONFIG_HIGH_RES_TIMERS=y
-CONFIG_LOG_BUF_SHIFT=19
-CONFIG_PROFILING=y
-CONFIG_OPROFILE=y
-CONFIG_KPROBES=y
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-# CONFIG_BLK_DEV_BSG is not set
-CONFIG_ARCH_KIRKWOOD=y
-CONFIG_MACH_D2NET_V2=y
-CONFIG_MACH_NET2BIG_V2=y
-CONFIG_MACH_NET5BIG_V2=y
-CONFIG_MACH_OPENRD_BASE=y
-CONFIG_MACH_OPENRD_CLIENT=y
-CONFIG_MACH_OPENRD_ULTIMATE=y
-CONFIG_MACH_RD88F6192_NAS=y
-CONFIG_MACH_RD88F6281=y
-CONFIG_MACH_T5325=y
-CONFIG_MACH_TS219=y
-CONFIG_MACH_TS41X=y
-CONFIG_ARCH_KIRKWOOD_DT=y
-CONFIG_MACH_MV88F6281GTW_GE_DT=y
-# CONFIG_CPU_FEROCEON_OLD_ID is not set
-CONFIG_PCI_MVEBU=y
-CONFIG_PREEMPT=y
-CONFIG_AEABI=y
-# CONFIG_OABI_COMPAT is not set
-CONFIG_HIGHMEM=y
-CONFIG_ZBOOT_ROM_TEXT=0x0
-CONFIG_ZBOOT_ROM_BSS=0x0
-CONFIG_CPU_FREQ=y
-CONFIG_CPU_FREQ_STAT_DETAILS=y
-CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
-CONFIG_CPU_IDLE=y
-CONFIG_NET=y
-CONFIG_PACKET=y
-CONFIG_UNIX=y
-CONFIG_INET=y
-CONFIG_IP_MULTICAST=y
-CONFIG_IP_PNP=y
-CONFIG_IP_PNP_DHCP=y
-CONFIG_IP_PNP_BOOTP=y
-# CONFIG_IPV6 is not set
-CONFIG_NET_PKTGEN=m
-CONFIG_CFG80211=y
-CONFIG_MAC80211=y
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-CONFIG_MTD=y
-CONFIG_MTD_CMDLINE_PARTS=y
-CONFIG_MTD_BLOCK=y
-CONFIG_MTD_CFI=y
-CONFIG_MTD_JEDECPROBE=y
-CONFIG_MTD_CFI_ADV_OPTIONS=y
-CONFIG_MTD_CFI_GEOMETRY=y
-# CONFIG_MTD_MAP_BANK_WIDTH_4 is not set
-CONFIG_MTD_CFI_INTELEXT=y
-CONFIG_MTD_CFI_STAA=y
-CONFIG_MTD_PHYSMAP=y
-CONFIG_MTD_M25P80=y
-CONFIG_MTD_NAND=y
-CONFIG_MTD_NAND_ORION=y
-CONFIG_MTD_SPI_NOR=y
-CONFIG_BLK_DEV_LOOP=y
-CONFIG_EEPROM_AT24=y
-# CONFIG_SCSI_PROC_FS is not set
-CONFIG_BLK_DEV_SD=y
-CONFIG_BLK_DEV_SR=m
-CONFIG_CHR_DEV_SG=m
-CONFIG_ATA=y
-CONFIG_SATA_AHCI=y
-CONFIG_SATA_MV=y
-CONFIG_NETDEVICES=y
-CONFIG_NET_DSA_MV88E6123_61_65=y
-CONFIG_MV643XX_ETH=y
-CONFIG_R8169=y
-CONFIG_MARVELL_PHY=y
-CONFIG_LIBERTAS=y
-CONFIG_LIBERTAS_SDIO=y
-CONFIG_INPUT_EVDEV=y
-CONFIG_KEYBOARD_GPIO=y
-# CONFIG_INPUT_MOUSE is not set
-CONFIG_LEGACY_PTY_COUNT=16
-# CONFIG_DEVKMEM is not set
-CONFIG_SERIAL_8250=y
-CONFIG_SERIAL_8250_CONSOLE=y
-CONFIG_SERIAL_8250_RUNTIME_UARTS=2
-CONFIG_SERIAL_OF_PLATFORM=y
-# CONFIG_HW_RANDOM is not set
-CONFIG_I2C=y
-# CONFIG_I2C_COMPAT is not set
-CONFIG_I2C_CHARDEV=y
-CONFIG_I2C_MV64XXX=y
-CONFIG_SPI=y
-CONFIG_SPI_ORION=y
-CONFIG_GPIO_SYSFS=y
-CONFIG_SENSORS_ADT7475=y
-CONFIG_SENSORS_LM63=y
-CONFIG_SENSORS_LM75=y
-CONFIG_SENSORS_LM85=y
-CONFIG_THERMAL=y
-CONFIG_WATCHDOG=y
-CONFIG_ORION_WATCHDOG=y
-CONFIG_HID_DRAGONRISE=y
-CONFIG_HID_GYRATION=y
-CONFIG_HID_TWINHAN=y
-CONFIG_HID_NTRIG=y
-CONFIG_HID_PANTHERLORD=y
-CONFIG_HID_PETALYNX=y
-CONFIG_HID_SAMSUNG=y
-CONFIG_HID_SONY=y
-CONFIG_HID_SUNPLUS=y
-CONFIG_HID_GREENASIA=y
-CONFIG_HID_SMARTJOYPLUS=y
-CONFIG_HID_TOPSEED=y
-CONFIG_HID_THRUSTMASTER=y
-CONFIG_HID_ZEROPLUS=y
-CONFIG_USB=y
-CONFIG_USB_XHCI_HCD=y
-CONFIG_USB_EHCI_HCD=y
-CONFIG_USB_EHCI_ROOT_HUB_TT=y
-CONFIG_USB_PRINTER=m
-CONFIG_USB_STORAGE=y
-CONFIG_USB_STORAGE_DATAFAB=y
-CONFIG_USB_STORAGE_FREECOM=y
-CONFIG_USB_STORAGE_SDDR09=y
-CONFIG_USB_STORAGE_SDDR55=y
-CONFIG_USB_STORAGE_JUMPSHOT=y
-CONFIG_MMC=y
-CONFIG_SDIO_UART=y
-CONFIG_MMC_MVSDIO=y
-CONFIG_NEW_LEDS=y
-CONFIG_LEDS_CLASS=y
-CONFIG_LEDS_GPIO=y
-CONFIG_LEDS_TRIGGERS=y
-CONFIG_LEDS_TRIGGER_TIMER=y
-CONFIG_LEDS_TRIGGER_HEARTBEAT=y
-CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
-CONFIG_RTC_CLASS=y
-CONFIG_RTC_DRV_RS5C372=y
-CONFIG_RTC_DRV_PCF8563=y
-CONFIG_RTC_DRV_S35390A=y
-CONFIG_RTC_DRV_MV=y
-CONFIG_DMADEVICES=y
-CONFIG_MV_XOR=y
-CONFIG_EXT2_FS=y
-CONFIG_EXT3_FS=y
-# CONFIG_EXT3_FS_XATTR is not set
-CONFIG_EXT4_FS=y
-CONFIG_ISO9660_FS=m
-CONFIG_JOLIET=y
-CONFIG_UDF_FS=m
-CONFIG_MSDOS_FS=y
-CONFIG_VFAT_FS=y
-CONFIG_TMPFS=y
-CONFIG_JFFS2_FS=y
-CONFIG_CRAMFS=y
-CONFIG_NFS_FS=y
-CONFIG_ROOT_NFS=y
-CONFIG_NLS_CODEPAGE_437=y
-CONFIG_NLS_CODEPAGE_850=y
-CONFIG_NLS_ISO8859_1=y
-CONFIG_NLS_ISO8859_2=y
-CONFIG_NLS_UTF8=y
-CONFIG_DEBUG_INFO=y
-CONFIG_DEBUG_FS=y
-CONFIG_MAGIC_SYSRQ=y
-CONFIG_DEBUG_KERNEL=y
-# CONFIG_SCHED_DEBUG is not set
-# CONFIG_DEBUG_PREEMPT is not set
-# CONFIG_FTRACE is not set
-CONFIG_DEBUG_USER=y
-CONFIG_DEBUG_LL=y
-CONFIG_CRYPTO_CBC=m
-CONFIG_CRYPTO_PCBC=m
-# CONFIG_CRYPTO_ANSI_CPRNG is not set
-CONFIG_CRYPTO_DEV_MV_CESA=y
-CONFIG_CRC_CCITT=y
-CONFIG_CRC16=y
-CONFIG_LIBCRC32C=y
index 5ebfa8bf85094b8ff5ded8b819a9d7f278304a22..018bef9fa7e8f26fc4cb241c954cd91b3e203a2a 100644 (file)
@@ -11,6 +11,7 @@ CONFIG_MODULE_UNLOAD=y
 # CONFIG_ARCH_MULTI_V7 is not set
 CONFIG_ARCH_MVEBU=y
 CONFIG_MACH_KIRKWOOD=y
+CONFIG_MACH_NETXBIG=y
 CONFIG_ARCH_MXC=y
 CONFIG_MACH_IMX25_DT=y
 CONFIG_MACH_IMX27_DT=y
@@ -94,6 +95,7 @@ CONFIG_POWER_RESET=y
 CONFIG_POWER_RESET_GPIO=y
 CONFIG_POWER_RESET_QNAP=y
 CONFIG_SENSORS_ADT7475=y
+CONFIG_SENSORS_G762=y
 CONFIG_SENSORS_LM63=y
 CONFIG_SENSORS_LM75=y
 CONFIG_SENSORS_LM85=y
index 5348364979985172d241a63b66b6c52237848d62..5fb95fb758d9a43ae6ef5ccfd25ee2ff304f5006 100644 (file)
@@ -19,15 +19,18 @@ CONFIG_MACH_DOVE=y
 CONFIG_ARCH_BCM=y
 CONFIG_ARCH_BCM_MOBILE=y
 CONFIG_ARCH_BCM_5301X=y
+CONFIG_ARCH_BRCMSTB=y
 CONFIG_ARCH_BERLIN=y
 CONFIG_MACH_BERLIN_BG2=y
 CONFIG_MACH_BERLIN_BG2CD=y
 CONFIG_MACH_BERLIN_BG2Q=y
 CONFIG_ARCH_HIGHBANK=y
+CONFIG_ARCH_HISI=y
 CONFIG_ARCH_HI3xxx=y
+CONFIG_ARCH_HIX5HD2=y
 CONFIG_ARCH_KEYSTONE=y
 CONFIG_ARCH_MXC=y
-CONFIG_MACH_IMX51_DT=y
+CONFIG_SOC_IMX51=y
 CONFIG_SOC_IMX53=y
 CONFIG_SOC_IMX6Q=y
 CONFIG_SOC_IMX6SL=y
@@ -66,7 +69,6 @@ CONFIG_ARCH_VEXPRESS=y
 CONFIG_ARCH_VEXPRESS_CA9X4=y
 CONFIG_ARCH_WM8850=y
 CONFIG_ARCH_ZYNQ=y
-CONFIG_NEON=y
 CONFIG_TRUSTED_FOUNDATIONS=y
 CONFIG_PCI=y
 CONFIG_PCI_MSI=y
@@ -83,6 +85,7 @@ CONFIG_CPU_FREQ=y
 CONFIG_CPU_FREQ_STAT_DETAILS=y
 CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
 CONFIG_CPU_IDLE=y
+CONFIG_NEON=y
 CONFIG_NET=y
 CONFIG_PACKET=y
 CONFIG_UNIX=y
@@ -127,6 +130,7 @@ CONFIG_BLK_DEV_SR=y
 CONFIG_SCSI_MULTI_LUN=y
 CONFIG_ATA=y
 CONFIG_SATA_AHCI_PLATFORM=y
+CONFIG_AHCI_ST=y
 CONFIG_AHCI_SUNXI=y
 CONFIG_SATA_HIGHBANK=y
 CONFIG_SATA_MV=y
@@ -134,6 +138,7 @@ CONFIG_NETDEVICES=y
 CONFIG_SUN4I_EMAC=y
 CONFIG_MACB=y
 CONFIG_NET_CALXEDA_XGMAC=y
+CONFIG_IGB=y
 CONFIG_MV643XX_ETH=y
 CONFIG_MVNETA=y
 CONFIG_KS8851=y
@@ -155,8 +160,11 @@ CONFIG_INPUT_EVDEV=y
 CONFIG_KEYBOARD_GPIO=y
 CONFIG_KEYBOARD_TEGRA=y
 CONFIG_KEYBOARD_SPEAR=y
+CONFIG_KEYBOARD_ST_KEYSCAN=y
 CONFIG_KEYBOARD_CROS_EC=y
 CONFIG_MOUSE_PS2_ELANTECH=y
+CONFIG_INPUT_TOUCHSCREEN=y
+CONFIG_TOUCHSCREEN_STMPE=y
 CONFIG_INPUT_MISC=y
 CONFIG_INPUT_MPU3050=y
 CONFIG_SERIO_AMBAKMI=y
@@ -195,6 +203,7 @@ CONFIG_I2C_EXYNOS5=y
 CONFIG_I2C_MV64XXX=y
 CONFIG_I2C_SIRF=y
 CONFIG_I2C_TEGRA=y
+CONFIG_I2C_ST=y
 CONFIG_SPI=y
 CONFIG_SPI_OMAP24XX=y
 CONFIG_SPI_ORION=y
@@ -222,8 +231,11 @@ CONFIG_POWER_RESET_AS3722=y
 CONFIG_POWER_RESET_GPIO=y
 CONFIG_POWER_RESET_SUN6I=y
 CONFIG_SENSORS_LM90=y
+CONFIG_SENSORS_LM95245=y
 CONFIG_THERMAL=y
 CONFIG_ARMADA_THERMAL=y
+CONFIG_ST_THERMAL_SYSCFG=y
+CONFIG_ST_THERMAL_MEMMAP=y
 CONFIG_WATCHDOG=y
 CONFIG_ORION_WATCHDOG=y
 CONFIG_SUNXI_WATCHDOG=y
@@ -233,6 +245,7 @@ CONFIG_MFD_CROS_EC=y
 CONFIG_MFD_CROS_EC_SPI=y
 CONFIG_MFD_MAX8907=y
 CONFIG_MFD_SEC_CORE=y
+CONFIG_MFD_STMPE=y
 CONFIG_MFD_PALMAS=y
 CONFIG_MFD_TPS65090=y
 CONFIG_MFD_TPS6586X=y
@@ -311,12 +324,16 @@ CONFIG_MMC_SDHCI_SPEAR=y
 CONFIG_MMC_SDHCI_S3C=y
 CONFIG_MMC_SDHCI_S3C_DMA=y
 CONFIG_MMC_SDHCI_BCM_KONA=y
+CONFIG_MMC_SDHCI_ST=y
 CONFIG_MMC_OMAP=y
 CONFIG_MMC_OMAP_HS=y
 CONFIG_MMC_MVSDIO=y
 CONFIG_MMC_SUNXI=y
 CONFIG_MMC_DW=y
 CONFIG_MMC_DW_EXYNOS=y
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+CONFIG_LEDS_PWM=y
 CONFIG_EDAC=y
 CONFIG_EDAC_MM_EDAC=y
 CONFIG_EDAC_HIGHBANK_MC=y
@@ -368,6 +385,8 @@ CONFIG_PWM=y
 CONFIG_PWM_TEGRA=y
 CONFIG_PWM_VT8500=y
 CONFIG_OMAP_USB2=y
+CONFIG_TI_PIPE3=y
+CONFIG_PHY_MIPHY365X=y
 CONFIG_PHY_SUN4I_USB=y
 CONFIG_EXT4_FS=y
 CONFIG_VFAT_FS=y
index 27c732fdf21eae1bfe04e8e19761dffd9996bdc6..22058e18dfaab66d28beb5593494451a628be5a7 100644 (file)
@@ -12,6 +12,7 @@ CONFIG_MODULE_UNLOAD=y
 # CONFIG_ARCH_MULTI_V7 is not set
 CONFIG_ARCH_MVEBU=y
 CONFIG_MACH_KIRKWOOD=y
+CONFIG_MACH_NETXBIG=y
 # CONFIG_CPU_FEROCEON_OLD_ID is not set
 CONFIG_PCI_MVEBU=y
 CONFIG_PREEMPT=y
@@ -19,6 +20,8 @@ CONFIG_AEABI=y
 CONFIG_HIGHMEM=y
 CONFIG_ZBOOT_ROM_TEXT=0x0
 CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_ARM_APPENDED_DTB=y
+CONFIG_ARM_ATAG_DTB_COMPAT=y
 CONFIG_CPU_FREQ=y
 CONFIG_CPU_FREQ_STAT_DETAILS=y
 CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
@@ -36,6 +39,8 @@ CONFIG_NET_PKTGEN=m
 CONFIG_CFG80211=y
 CONFIG_MAC80211=y
 CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
 CONFIG_MTD=y
 CONFIG_MTD_CMDLINE_PARTS=y
 CONFIG_MTD_BLOCK=y
@@ -89,6 +94,7 @@ CONFIG_POWER_RESET=y
 CONFIG_POWER_RESET_GPIO=y
 CONFIG_POWER_RESET_QNAP=y
 CONFIG_SENSORS_ADT7475=y
+CONFIG_SENSORS_G762=y
 CONFIG_SENSORS_LM63=y
 CONFIG_SENSORS_LM75=y
 CONFIG_SENSORS_LM85=y
index b0bfefa23902c01fc1faa6495677ff27a0e86877..fdfda1fa95212cfb9e594f06ceb49381502db78e 100644 (file)
@@ -29,6 +29,10 @@ CONFIG_ZBOOT_ROM_TEXT=0x0
 CONFIG_ZBOOT_ROM_BSS=0x0
 CONFIG_ARM_APPENDED_DTB=y
 CONFIG_ARM_ATAG_DTB_COMPAT=y
+CONFIG_CPU_IDLE=y
+CONFIG_ARM_MVEBU_V7_CPUIDLE=y
+CONFIG_CPU_FREQ=y
+CONFIG_CPUFREQ_GENERIC=y
 CONFIG_VFP=y
 CONFIG_NET=y
 CONFIG_INET=y
@@ -46,6 +50,7 @@ CONFIG_AHCI_MVEBU=y
 CONFIG_SATA_MV=y
 CONFIG_NETDEVICES=y
 CONFIG_MVNETA=y
+CONFIG_MVPP2=y
 CONFIG_MARVELL_PHY=y
 CONFIG_MWIFIEX=y
 CONFIG_MWIFIEX_SDIO=y
index a9f992335eb20dec371ea0c9f7c6ca2c50bb24f4..c7906c2fd645de229aeb12cde6c15cee7e0bb429 100644 (file)
@@ -1,4 +1,5 @@
 CONFIG_SYSVIPC=y
+CONFIG_FHANDLE=y
 CONFIG_NO_HZ=y
 CONFIG_HIGH_RES_TIMERS=y
 CONFIG_TASKSTATS=y
index ce541bb3c2dec937f0df52f75aa8fa36294aa254..115cda9f32606a0e3ca9afce28d2632e37f3d1f3 100644 (file)
@@ -26,8 +26,6 @@ CONFIG_ARCH_OMAP=y
 CONFIG_ARCH_OMAP1=y
 CONFIG_OMAP_RESET_CLOCKS=y
 # CONFIG_OMAP_MUX is not set
-CONFIG_MAILBOX=y
-CONFIG_OMAP1_MBOX=y
 CONFIG_OMAP_32K_TIMER=y
 CONFIG_OMAP_DM_TIMER=y
 CONFIG_ARCH_OMAP730=y
index 536a137863cba2e533b1cdf750958522c292929d..f650f00e8cee19f8d517753f542fb899cb99b94f 100644 (file)
@@ -180,6 +180,7 @@ CONFIG_TWL4030_WATCHDOG=y
 CONFIG_MFD_SYSCON=y
 CONFIG_MFD_PALMAS=y
 CONFIG_MFD_TPS65217=y
+CONFIG_MFD_TPS65218=y
 CONFIG_MFD_TPS65910=y
 CONFIG_TWL6040_CORE=y
 CONFIG_REGULATOR_FIXED_VOLTAGE=y
@@ -188,6 +189,7 @@ CONFIG_REGULATOR_TI_ABB=y
 CONFIG_REGULATOR_TPS65023=y
 CONFIG_REGULATOR_TPS6507X=y
 CONFIG_REGULATOR_TPS65217=y
+CONFIG_REGULATOR_TPS65218=y
 CONFIG_REGULATOR_TPS65910=y
 CONFIG_REGULATOR_TWL4030=y
 CONFIG_REGULATOR_PBIAS=y
diff --git a/arch/arm/configs/s5p64x0_defconfig b/arch/arm/configs/s5p64x0_defconfig
deleted file mode 100644 (file)
index ad6b61b..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-CONFIG_EXPERIMENTAL=y
-CONFIG_SYSFS_DEPRECATED_V2=y
-CONFIG_BLK_DEV_INITRD=y
-CONFIG_KALLSYMS_ALL=y
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-# CONFIG_BLK_DEV_BSG is not set
-CONFIG_ARCH_S5P64X0=y
-CONFIG_S3C_BOOT_ERROR_RESET=y
-CONFIG_S3C_LOWLEVEL_UART_PORT=1
-CONFIG_MACH_SMDK6440=y
-CONFIG_MACH_SMDK6450=y
-CONFIG_NO_HZ=y
-CONFIG_HIGH_RES_TIMERS=y
-CONFIG_CPU_32v6K=y
-CONFIG_AEABI=y
-CONFIG_CMDLINE="root=/dev/ram0 rw ramdisk=8192 initrd=0x20800000,8M console=ttySAC1,115200 init=/linuxrc"
-CONFIG_FPE_NWFPE=y
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-# CONFIG_PREVENT_FIRMWARE_BUILD is not set
-CONFIG_BLK_DEV_RAM=y
-CONFIG_BLK_DEV_RAM_SIZE=8192
-# CONFIG_MISC_DEVICES is not set
-CONFIG_SCSI=y
-CONFIG_BLK_DEV_SD=y
-CONFIG_CHR_DEV_SG=y
-CONFIG_INPUT_EVDEV=y
-CONFIG_INPUT_TOUCHSCREEN=y
-CONFIG_SERIAL_8250=y
-CONFIG_SERIAL_8250_NR_UARTS=3
-CONFIG_SERIAL_SAMSUNG=y
-CONFIG_SERIAL_SAMSUNG_CONSOLE=y
-CONFIG_HW_RANDOM=y
-# CONFIG_HWMON is not set
-CONFIG_DISPLAY_SUPPORT=y
-# CONFIG_VGA_CONSOLE is not set
-# CONFIG_HID_SUPPORT is not set
-# CONFIG_USB_SUPPORT is not set
-CONFIG_EXT2_FS=y
-CONFIG_EXT3_FS=y
-CONFIG_EXT3_FS_POSIX_ACL=y
-CONFIG_EXT3_FS_SECURITY=y
-CONFIG_INOTIFY=y
-CONFIG_MSDOS_FS=y
-CONFIG_VFAT_FS=y
-CONFIG_TMPFS=y
-CONFIG_TMPFS_POSIX_ACL=y
-CONFIG_CRAMFS=y
-CONFIG_ROMFS_FS=y
-CONFIG_NLS_CODEPAGE_437=y
-CONFIG_NLS_ASCII=y
-CONFIG_NLS_ISO8859_1=y
-CONFIG_MAGIC_SYSRQ=y
-CONFIG_DEBUG_KERNEL=y
-CONFIG_DEBUG_RT_MUTEXES=y
-CONFIG_DEBUG_SPINLOCK=y
-CONFIG_DEBUG_MUTEXES=y
-CONFIG_DEBUG_SPINLOCK_SLEEP=y
-CONFIG_DEBUG_INFO=y
-# CONFIG_RCU_CPU_STALL_DETECTOR is not set
-CONFIG_SYSCTL_SYSCALL_CHECK=y
-CONFIG_DEBUG_USER=y
-CONFIG_DEBUG_ERRORS=y
-CONFIG_DEBUG_LL=y
-CONFIG_DEBUG_S3C_UART=1
-CONFIG_CRYPTO=y
-# CONFIG_CRYPTO_ANSI_CPRNG is not set
-CONFIG_CRC_CCITT=y
diff --git a/arch/arm/configs/s5pc100_defconfig b/arch/arm/configs/s5pc100_defconfig
deleted file mode 100644 (file)
index 41bafc9..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-CONFIG_EXPERIMENTAL=y
-CONFIG_SYSFS_DEPRECATED_V2=y
-CONFIG_BLK_DEV_INITRD=y
-CONFIG_KALLSYMS_ALL=y
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-# CONFIG_BLK_DEV_BSG is not set
-CONFIG_ARCH_S5PC100=y
-CONFIG_MACH_SMDKC100=y
-CONFIG_AEABI=y
-CONFIG_CMDLINE="root=/dev/mtdblock2 rootfstype=cramfs init=/linuxrc console=ttySAC2,115200 mem=128M"
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-CONFIG_BLK_DEV_LOOP=y
-CONFIG_BLK_DEV_RAM=y
-CONFIG_BLK_DEV_RAM_SIZE=8192
-CONFIG_EEPROM_AT24=y
-CONFIG_SERIAL_8250=y
-CONFIG_SERIAL_SAMSUNG=y
-CONFIG_SERIAL_SAMSUNG_CONSOLE=y
-CONFIG_HW_RANDOM=y
-CONFIG_I2C=y
-CONFIG_I2C_CHARDEV=y
-# CONFIG_VGA_CONSOLE is not set
-CONFIG_MMC=y
-CONFIG_MMC_DEBUG=y
-CONFIG_MMC_UNSAFE_RESUME=y
-CONFIG_SDIO_UART=y
-CONFIG_MMC_SDHCI=y
-CONFIG_EXT2_FS=y
-CONFIG_EXT3_FS=y
-CONFIG_EXT3_FS_POSIX_ACL=y
-CONFIG_EXT3_FS_SECURITY=y
-CONFIG_INOTIFY=y
-CONFIG_TMPFS=y
-CONFIG_TMPFS_POSIX_ACL=y
-CONFIG_CRAMFS=y
-CONFIG_ROMFS_FS=y
-CONFIG_MAGIC_SYSRQ=y
-CONFIG_DEBUG_KERNEL=y
-CONFIG_DEBUG_RT_MUTEXES=y
-CONFIG_DEBUG_SPINLOCK=y
-CONFIG_DEBUG_MUTEXES=y
-CONFIG_DEBUG_SPINLOCK_SLEEP=y
-CONFIG_DEBUG_INFO=y
-# CONFIG_RCU_CPU_STALL_DETECTOR is not set
-CONFIG_SYSCTL_SYSCALL_CHECK=y
-CONFIG_DEBUG_USER=y
-CONFIG_DEBUG_ERRORS=y
-CONFIG_DEBUG_LL=y
index 6d6437cbbc523b11510a26a7e75330a6a129e7dc..3b136144cc833c7ec4aa11bc23075fbe3bbc08bf 100644 (file)
@@ -10,16 +10,20 @@ CONFIG_PERF_EVENTS=y
 CONFIG_SLAB=y
 CONFIG_ARCH_SHMOBILE_MULTI=y
 CONFIG_ARCH_EMEV2=y
+CONFIG_ARCH_R7S72100=y
+CONFIG_ARCH_R8A7779=y
 CONFIG_ARCH_R8A7790=y
 CONFIG_ARCH_R8A7791=y
 CONFIG_MACH_KOELSCH=y
 CONFIG_MACH_LAGER=y
+CONFIG_MACH_MARZEN=y
 # CONFIG_SWP_EMULATE is not set
 CONFIG_CPU_BPREDICT_DISABLE=y
 CONFIG_PL310_ERRATA_588369=y
 CONFIG_ARM_ERRATA_754322=y
 CONFIG_PCI=y
 CONFIG_PCI_RCAR_GEN2=y
+CONFIG_PCI_RCAR_GEN2_PCIE=y
 CONFIG_SMP=y
 CONFIG_SCHED_MC=y
 CONFIG_HAVE_ARM_ARCH_TIMER=y
@@ -33,6 +37,7 @@ CONFIG_KEXEC=y
 CONFIG_VFP=y
 CONFIG_NEON=y
 # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+CONFIG_PM_RUNTIME=y
 CONFIG_NET=y
 CONFIG_PACKET=y
 CONFIG_UNIX=y
@@ -82,6 +87,7 @@ CONFIG_I2C_RCAR=y
 CONFIG_SPI=y
 CONFIG_SPI_RSPI=y
 CONFIG_SPI_SH_MSIOF=y
+CONFIG_SPI_SH_HSPI=y
 CONFIG_GPIO_EM=y
 CONFIG_GPIO_RCAR=y
 # CONFIG_HWMON is not set
@@ -109,12 +115,14 @@ CONFIG_SND=y
 CONFIG_SND_SOC=y
 CONFIG_SND_SOC_RCAR=y
 CONFIG_USB=y
-CONFIG_USB_RCAR_GEN2_PHY=y
 CONFIG_USB_EHCI_HCD=y
 CONFIG_USB_OHCI_HCD=y
 CONFIG_USB_RENESAS_USBHS=y
+CONFIG_USB_RCAR_PHY=y
+CONFIG_USB_RCAR_GEN2_PHY=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_RENESAS_USBHS_UDC=y
+CONFIG_USB_ETH=y
 CONFIG_MMC=y
 CONFIG_MMC_SDHI=y
 CONFIG_MMC_SH_MMCIF=y
@@ -141,3 +149,16 @@ CONFIG_NLS_ISO8859_1=y
 # CONFIG_ENABLE_WARN_DEPRECATED is not set
 # CONFIG_ENABLE_MUST_CHECK is not set
 # CONFIG_ARM_UNWIND is not set
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_GOV_COMMON=y
+CONFIG_CPU_FREQ_STAT=y
+CONFIG_CPU_FREQ_STAT_DETAILS=y
+CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=y
+CONFIG_CPU_FREQ_GOV_USERSPACE=y
+CONFIG_CPU_FREQ_GOV_ONDEMAND=y
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
+CONFIG_CPU_THERMAL=y
+CONFIG_GENERIC_CPUFREQ_CPU0=y
+CONFIG_REGULATOR_DA9210=y
index e3a05e8801d8f318ccafba40660471f7c25aea88..d7a5855a5db89a550f967125f5e300c8a1152f54 100644 (file)
@@ -11,6 +11,7 @@ CONFIG_PROFILING=y
 CONFIG_OPROFILE=y
 CONFIG_MODULES=y
 CONFIG_MODULE_UNLOAD=y
+CONFIG_HOTPLUG=y
 # CONFIG_LBDAF is not set
 # CONFIG_BLK_DEV_BSG is not set
 # CONFIG_IOSCHED_DEADLINE is not set
@@ -40,6 +41,15 @@ CONFIG_IP_PNP=y
 CONFIG_IP_PNP_DHCP=y
 CONFIG_IP_PNP_BOOTP=y
 CONFIG_IP_PNP_RARP=y
+CONFIG_CAN=y
+CONFIG_CAN_RAW=y
+CONFIG_CAN_BCM=y
+CONFIG_CAN_GW=y
+CONFIG_CAN_DEV=y
+CONFIG_CAN_CALC_BITTIMING=y
+CONFIG_CAN_C_CAN=y
+CONFIG_CAN_C_CAN_PLATFORM=y
+CONFIG_CAN_DEBUG_DEVICES=y
 CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_DEVTMPFS=y
 CONFIG_PROC_DEVICETREE=y
@@ -55,6 +65,14 @@ CONFIG_STMMAC_ETH=y
 CONFIG_MICREL_PHY=y
 # CONFIG_STMMAC_PHY_ID_ZERO_WORKAROUND is not set
 CONFIG_INPUT_EVDEV=y
+CONFIG_DWMAC_SOCFPGA=y
+CONFIG_PPS=y
+CONFIG_NETWORK_PHY_TIMESTAMPING=y
+CONFIG_PTP_1588_CLOCK=y
+CONFIG_VLAN_8021Q=y
+CONFIG_VLAN_8021Q_GVRP=y
+CONFIG_GARP=y
+CONFIG_IPV6=y
 # CONFIG_SERIO_SERPORT is not set
 CONFIG_SERIO_AMBAKMI=y
 CONFIG_LEGACY_PTY_COUNT=16
@@ -63,7 +81,12 @@ CONFIG_SERIAL_8250_CONSOLE=y
 CONFIG_SERIAL_8250_NR_UARTS=2
 CONFIG_SERIAL_8250_RUNTIME_UARTS=2
 CONFIG_SERIAL_8250_DW=y
+CONFIG_GPIOLIB=y
+CONFIG_GPIO_SYSFS=y
+CONFIG_GPIO_DWAPB=y
 # CONFIG_RTC_HCTOSYS is not set
+CONFIG_WATCHDOG=y
+CONFIG_DW_WATCHDOG=y
 CONFIG_EXT2_FS=y
 CONFIG_EXT2_FS_XATTR=y
 CONFIG_EXT2_FS_POSIX_ACL=y
@@ -72,6 +95,7 @@ CONFIG_NFS_FS=y
 CONFIG_ROOT_NFS=y
 # CONFIG_DNOTIFY is not set
 # CONFIG_INOTIFY_USER is not set
+CONFIG_FHANDLE=y
 CONFIG_VFAT_FS=y
 CONFIG_NTFS_FS=y
 CONFIG_NTFS_RW=y
@@ -86,5 +110,16 @@ CONFIG_DEBUG_INFO=y
 CONFIG_ENABLE_DEFAULT_TRACERS=y
 CONFIG_DEBUG_USER=y
 CONFIG_XZ_DEC=y
+CONFIG_I2C=y
+CONFIG_I2C_DESIGNWARE_CORE=y
+CONFIG_I2C_DESIGNWARE_PLATFORM=y
+CONFIG_I2C_CHARDEV=y
 CONFIG_MMC=y
 CONFIG_MMC_DW=y
+CONFIG_PM=y
+CONFIG_SUSPEND=y
+CONFIG_MMC_UNSAFE_RESUME=y
+CONFIG_USB=y
+CONFIG_USB_DWC2=y
+CONFIG_USB_DWC2_HOST=y
+CONFIG_USB_DWC2_PLATFORM=y
index 82eaa552ed14ed66cdd3359feb204f363542fd93..d271b263f35d0cdd4c731033dddad8d20d15b743 100644 (file)
@@ -11,13 +11,24 @@ CONFIG_ARCH_SPEAR13XX=y
 CONFIG_MACH_SPEAR1310=y
 CONFIG_MACH_SPEAR1340=y
 # CONFIG_SWP_EMULATE is not set
+CONFIG_PCI=y
+CONFIG_PCI_MSI=y
+CONFIG_PCIE_SPEAR13XX=y
 CONFIG_SMP=y
 # CONFIG_SMP_ON_UP is not set
 # CONFIG_ARM_CPU_TOPOLOGY is not set
+CONFIG_AEABI=y
 CONFIG_ARM_APPENDED_DTB=y
 CONFIG_ARM_ATAG_DTB_COMPAT=y
+CONFIG_VFP=y
 CONFIG_BINFMT_MISC=y
 CONFIG_NET=y
+CONFIG_UNIX=y
+CONFIG_INET=y
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
+CONFIG_IP_PNP_BOOTP=y
+CONFIG_NET_IPIP=y
 CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_MTD=y
 CONFIG_MTD_OF_PARTS=y
@@ -27,6 +38,7 @@ CONFIG_MTD_NAND=y
 CONFIG_MTD_NAND_FSMC=y
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_SIZE=16384
+CONFIG_BLK_DEV_SD=y
 CONFIG_ATA=y
 # CONFIG_SATA_PMP is not set
 CONFIG_SATA_AHCI_PLATFORM=y
@@ -66,6 +78,7 @@ CONFIG_USB=y
 # CONFIG_USB_DEVICE_CLASS is not set
 CONFIG_USB_EHCI_HCD=y
 CONFIG_USB_OHCI_HCD=y
+CONFIG_USB_STORAGE=y
 CONFIG_MMC=y
 CONFIG_MMC_SDHCI=y
 CONFIG_MMC_SDHCI_SPEAR=y
@@ -79,11 +92,14 @@ CONFIG_EXT2_FS_SECURITY=y
 CONFIG_EXT3_FS=y
 CONFIG_EXT3_FS_SECURITY=y
 CONFIG_AUTOFS4_FS=m
+CONFIG_FUSE_FS=y
 CONFIG_MSDOS_FS=m
 CONFIG_VFAT_FS=m
 CONFIG_FAT_DEFAULT_IOCHARSET="ascii"
 CONFIG_TMPFS=y
 CONFIG_JFFS2_FS=y
+CONFIG_NFS_FS=y
+CONFIG_ROOT_NFS=y
 CONFIG_NLS_DEFAULT="utf8"
 CONFIG_NLS_CODEPAGE_437=y
 CONFIG_NLS_ASCII=m
index fb25e2982f64c848e712f397d85317bbb6f52699..285c433a9aaddc0a3c9840d84a070b37dd684a3a 100644 (file)
@@ -23,14 +23,11 @@ CONFIG_MODULE_FORCE_UNLOAD=y
 CONFIG_PARTITION_ADVANCED=y
 # CONFIG_IOSCHED_DEADLINE is not set
 # CONFIG_IOSCHED_CFQ is not set
-CONFIG_GPIO_PCA953X=y
 CONFIG_ARCH_TEGRA=y
 CONFIG_ARCH_TEGRA_2x_SOC=y
 CONFIG_ARCH_TEGRA_3x_SOC=y
 CONFIG_ARCH_TEGRA_114_SOC=y
 CONFIG_ARCH_TEGRA_124_SOC=y
-CONFIG_TEGRA_EMC_SCALING_ENABLE=y
-CONFIG_TRUSTED_FOUNDATIONS=y
 CONFIG_PCI=y
 CONFIG_PCI_MSI=y
 CONFIG_PCI_TEGRA=y
@@ -74,9 +71,6 @@ CONFIG_IPV6_MIP6=y
 CONFIG_IPV6_TUNNEL=y
 CONFIG_IPV6_MULTIPLE_TABLES=y
 CONFIG_CAN=y
-CONFIG_CAN_RAW=y
-CONFIG_CAN_BCM=y
-CONFIG_CAN_DEV=y
 CONFIG_CAN_MCP251X=y
 CONFIG_BT=y
 CONFIG_BT_RFCOMM=y
@@ -96,7 +90,6 @@ CONFIG_CMA_SIZE_MBYTES=64
 CONFIG_MTD=y
 CONFIG_MTD_M25P80=y
 CONFIG_MTD_SPI_NOR=y
-CONFIG_PROC_DEVICETREE=y
 CONFIG_BLK_DEV_LOOP=y
 CONFIG_AD525X_DPOT=y
 CONFIG_AD525X_DPOT_I2C=y
@@ -111,6 +104,7 @@ CONFIG_SCSI_MULTI_LUN=y
 # CONFIG_SCSI_LOWLEVEL is not set
 CONFIG_NETDEVICES=y
 CONFIG_DUMMY=y
+CONFIG_IGB=y
 CONFIG_R8169=y
 CONFIG_USB_PEGASUS=y
 CONFIG_USB_USBNET=y
@@ -125,6 +119,8 @@ CONFIG_KEYBOARD_GPIO=y
 CONFIG_KEYBOARD_TEGRA=y
 CONFIG_KEYBOARD_CROS_EC=y
 CONFIG_MOUSE_PS2_ELANTECH=y
+CONFIG_INPUT_TOUCHSCREEN=y
+CONFIG_TOUCHSCREEN_STMPE=y
 CONFIG_INPUT_MISC=y
 CONFIG_INPUT_MPU3050=y
 # CONFIG_LEGACY_PTYS is not set
@@ -135,6 +131,7 @@ CONFIG_SERIAL_TEGRA=y
 CONFIG_SERIAL_OF_PLATFORM=y
 # CONFIG_HW_RANDOM is not set
 # CONFIG_I2C_COMPAT is not set
+CONFIG_I2C_CHARDEV=y
 CONFIG_I2C_MUX_PCA954x=y
 CONFIG_I2C_MUX_PINCTRL=y
 CONFIG_I2C_TEGRA=y
@@ -144,6 +141,7 @@ CONFIG_SPI_TEGRA20_SFLASH=y
 CONFIG_SPI_TEGRA20_SLINK=y
 CONFIG_PINCTRL_AS3722=y
 CONFIG_PINCTRL_PALMAS=y
+CONFIG_GPIO_PCA953X=y
 CONFIG_GPIO_PCA953X_IRQ=y
 CONFIG_GPIO_PALMAS=y
 CONFIG_GPIO_TPS6586X=y
@@ -155,10 +153,12 @@ CONFIG_POWER_RESET=y
 CONFIG_POWER_RESET_AS3722=y
 CONFIG_POWER_RESET_GPIO=y
 CONFIG_SENSORS_LM90=y
+CONFIG_SENSORS_LM95245=y
 CONFIG_MFD_AS3722=y
 CONFIG_MFD_CROS_EC=y
 CONFIG_MFD_CROS_EC_SPI=y
 CONFIG_MFD_MAX8907=y
+CONFIG_MFD_STMPE=y
 CONFIG_MFD_PALMAS=y
 CONFIG_MFD_TPS65090=y
 CONFIG_MFD_TPS6586X=y
@@ -221,6 +221,7 @@ CONFIG_MMC_SDHCI_TEGRA=y
 CONFIG_NEW_LEDS=y
 CONFIG_LEDS_CLASS=y
 CONFIG_LEDS_GPIO=y
+CONFIG_LEDS_PWM=y
 CONFIG_LEDS_TRIGGERS=y
 CONFIG_LEDS_TRIGGER_TIMER=y
 CONFIG_LEDS_TRIGGER_ONESHOT=y
@@ -291,5 +292,4 @@ CONFIG_DEBUG_LL=y
 CONFIG_EARLY_PRINTK=y
 CONFIG_CRYPTO_TWOFISH=y
 # CONFIG_CRYPTO_ANSI_CPRNG is not set
-CONFIG_CRYPTO_DEV_TEGRA_AES=y
 CONFIG_CRC_CCITT=y
index 477e0206e016d1a5075692059fab1d83715ee315..504dcddebfcca8ec45d31b36fc4f9a6232999aa0 100644 (file)
@@ -5,12 +5,6 @@
 #define ARCH_NR_GPIOS CONFIG_ARCH_NR_GPIO
 #endif
 
-/* not all ARM platforms necessarily support this API ... */
-#ifdef CONFIG_NEED_MACH_GPIO_H
-#include <mach/gpio.h>
-#endif
-
-#ifndef __ARM_GPIOLIB_COMPLEX
 /* Note: this may rely upon the value of ARCH_NR_GPIOS set in mach/gpio.h */
 #include <asm-generic/gpio.h>
 
@@ -18,7 +12,6 @@
 #define gpio_get_value  __gpio_get_value
 #define gpio_set_value  __gpio_set_value
 #define gpio_cansleep   __gpio_cansleep
-#endif
 
 /*
  * Provide a default gpio_to_irq() which should satisfy every case.
index 53b3c4a50d5c16fcac649852b399392a11ed0692..3a67bec72d0cddd61d145a11afbddad5b9412a05 100644 (file)
 #define ARM_EXCEPTION_FIQ        6
 #define ARM_EXCEPTION_HVC        7
 
+/*
+ * The rr_lo_hi macro swaps a pair of registers depending on
+ * current endianness. It is used in conjunction with ldrd and strd
+ * instructions that load/store a 64-bit value from/to memory to/from
+ * a pair of registers which are used with the mrrc and mcrr instructions.
+ * If used with the ldrd/strd instructions, the a1 parameter is the first
+ * source/destination register and the a2 parameter is the second
+ * source/destination register. Note that the ldrd/strd instructions
+ * already swap the bytes within the words correctly according to the
+ * endianness setting, but the order of the registers need to be effectively
+ * swapped when used with the mrrc/mcrr instructions.
+ */
+#ifdef CONFIG_CPU_ENDIAN_BE8
+#define rr_lo_hi(a1, a2) a2, a1
+#else
+#define rr_lo_hi(a1, a2) a1, a2
+#endif
+
 #ifndef __ASSEMBLY__
 struct kvm;
 struct kvm_vcpu;
index 0fa90c962ac831329df43a156c5b0583732099ac..69b746955fca322185cea04301ecef8d2feaabe6 100644 (file)
@@ -185,9 +185,16 @@ static inline unsigned long vcpu_data_guest_to_host(struct kvm_vcpu *vcpu,
                default:
                        return be32_to_cpu(data);
                }
+       } else {
+               switch (len) {
+               case 1:
+                       return data & 0xff;
+               case 2:
+                       return le16_to_cpu(data & 0xffff);
+               default:
+                       return le32_to_cpu(data);
+               }
        }
-
-       return data;            /* Leave LE untouched */
 }
 
 static inline unsigned long vcpu_data_host_to_guest(struct kvm_vcpu *vcpu,
@@ -203,9 +210,16 @@ static inline unsigned long vcpu_data_host_to_guest(struct kvm_vcpu *vcpu,
                default:
                        return cpu_to_be32(data);
                }
+       } else {
+               switch (len) {
+               case 1:
+                       return data & 0xff;
+               case 2:
+                       return cpu_to_le16(data & 0xffff);
+               default:
+                       return cpu_to_le32(data);
+               }
        }
-
-       return data;            /* Leave LE untouched */
 }
 
 #endif /* __ARM_KVM_EMULATE_H__ */
index 193ceaf01bfd00078fd150e4b80e1edef2324f91..6dfb404f6c462008bcee3aee58a1bb6a129524b2 100644 (file)
@@ -225,10 +225,12 @@ static inline int kvm_arch_dev_ioctl_check_extension(long ext)
        return 0;
 }
 
+static inline void vgic_arch_setup(const struct vgic_params *vgic)
+{
+       BUG_ON(vgic->type != VGIC_V2);
+}
+
 int kvm_perf_init(void);
 int kvm_perf_teardown(void);
 
-u64 kvm_arm_timer_get_reg(struct kvm_vcpu *, u64 regid);
-int kvm_arm_timer_set_reg(struct kvm_vcpu *, u64 regid, u64 value);
-
 #endif /* __ARM_KVM_HOST_H__ */
index 5c7aa3c1519fc109a5469f1443cb292dcf94804c..5cc0b0f5f72fa269f3240741739b178d6d4fbc70 100644 (file)
@@ -127,6 +127,18 @@ static inline void kvm_set_s2pmd_writable(pmd_t *pmd)
        (__boundary - 1 < (end) - 1)? __boundary: (end);                \
 })
 
+static inline bool kvm_page_empty(void *ptr)
+{
+       struct page *ptr_page = virt_to_page(ptr);
+       return page_count(ptr_page) == 1;
+}
+
+
+#define kvm_pte_table_empty(ptep) kvm_page_empty(ptep)
+#define kvm_pmd_table_empty(pmdp) kvm_page_empty(pmdp)
+#define kvm_pud_table_empty(pudp) (0)
+
+
 struct kvm;
 
 #define kvm_flush_dcache_to_poc(a,l)   __cpuc_flush_dcache_area((a), (l))
diff --git a/arch/arm/include/debug/clps711x.S b/arch/arm/include/debug/clps711x.S
new file mode 100644 (file)
index 0000000..abe2254
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2014 Alexander Shiyan <shc_work@mail.ru>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#ifndef CONFIG_DEBUG_CLPS711X_UART2
+#define CLPS711X_UART_PADDR    (0x80000000 + 0x0000)
+#define CLPS711X_UART_VADDR    (0xfeff0000 + 0x0000)
+#else
+#define CLPS711X_UART_PADDR    (0x80000000 + 0x1000)
+#define CLPS711X_UART_VADDR    (0xfeff0000 + 0x1000)
+#endif
+
+#define SYSFLG         (0x0140)
+#define SYSFLG_UBUSY   (1 << 11)
+#define UARTDR         (0x0480)
+
+       .macro  addruart, rp, rv, tmp
+       ldr     \rv, =CLPS711X_UART_VADDR
+       ldr     \rp, =CLPS711X_UART_PADDR
+       .endm
+
+       .macro  waituart,rd,rx
+       .endm
+
+       .macro  senduart,rd,rx
+       str     \rd, [\rx, #UARTDR]
+       .endm
+
+       .macro  busyuart,rd,rx
+1001:  ldr     \rd, [\rx, #SYSFLG]
+       tst     \rd, #SYSFLG_UBUSY
+       bne     1001b
+       .endm
diff --git a/arch/arm/include/debug/s5pv210.S b/arch/arm/include/debug/s5pv210.S
new file mode 100644 (file)
index 0000000..4f1a73e
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
+ *             http://www.samsung.com
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+*/
+
+/* pull in the relevant register and map files. */
+
+#define S3C_ADDR_BASE   0xF6000000
+#define S3C_VA_UART    S3C_ADDR_BASE + 0x01000000
+#define S5PV210_PA_UART        0xe2900000
+
+       /* note, for the boot process to work we have to keep the UART
+        * virtual address aligned to an 1MiB boundary for the L1
+        * mapping the head code makes. We keep the UART virtual address
+        * aligned and add in the offset when we load the value here.
+        */
+
+       .macro addruart, rp, rv, tmp
+               ldr     \rp, =S5PV210_PA_UART
+               ldr     \rv, =S3C_VA_UART
+#if CONFIG_DEBUG_S3C_UART != 0
+               add     \rp, \rp, #(0x400 * CONFIG_DEBUG_S3C_UART)
+               add     \rv, \rv, #(0x400 * CONFIG_DEBUG_S3C_UART)
+#endif
+       .endm
+
+#define fifo_full fifo_full_s5pv210
+#define fifo_level fifo_level_s5pv210
+
+#include <debug/samsung.S>
index 85598b5d1efdd6343a81fc3b4fa073b174de723c..713e807621d2cf6a785660d40fec9367866eedcd 100644 (file)
@@ -182,13 +182,13 @@ int main(void)
   DEFINE(VCPU_HYP_PC,          offsetof(struct kvm_vcpu, arch.fault.hyp_pc));
 #ifdef CONFIG_KVM_ARM_VGIC
   DEFINE(VCPU_VGIC_CPU,                offsetof(struct kvm_vcpu, arch.vgic_cpu));
-  DEFINE(VGIC_CPU_HCR,         offsetof(struct vgic_cpu, vgic_hcr));
-  DEFINE(VGIC_CPU_VMCR,                offsetof(struct vgic_cpu, vgic_vmcr));
-  DEFINE(VGIC_CPU_MISR,                offsetof(struct vgic_cpu, vgic_misr));
-  DEFINE(VGIC_CPU_EISR,                offsetof(struct vgic_cpu, vgic_eisr));
-  DEFINE(VGIC_CPU_ELRSR,       offsetof(struct vgic_cpu, vgic_elrsr));
-  DEFINE(VGIC_CPU_APR,         offsetof(struct vgic_cpu, vgic_apr));
-  DEFINE(VGIC_CPU_LR,          offsetof(struct vgic_cpu, vgic_lr));
+  DEFINE(VGIC_V2_CPU_HCR,      offsetof(struct vgic_cpu, vgic_v2.vgic_hcr));
+  DEFINE(VGIC_V2_CPU_VMCR,     offsetof(struct vgic_cpu, vgic_v2.vgic_vmcr));
+  DEFINE(VGIC_V2_CPU_MISR,     offsetof(struct vgic_cpu, vgic_v2.vgic_misr));
+  DEFINE(VGIC_V2_CPU_EISR,     offsetof(struct vgic_cpu, vgic_v2.vgic_eisr));
+  DEFINE(VGIC_V2_CPU_ELRSR,    offsetof(struct vgic_cpu, vgic_v2.vgic_elrsr));
+  DEFINE(VGIC_V2_CPU_APR,      offsetof(struct vgic_cpu, vgic_v2.vgic_apr));
+  DEFINE(VGIC_V2_CPU_LR,       offsetof(struct vgic_cpu, vgic_v2.vgic_lr));
   DEFINE(VGIC_CPU_NR_LR,       offsetof(struct vgic_cpu, nr_lr));
 #ifdef CONFIG_KVM_ARM_TIMER
   DEFINE(VCPU_TIMER_CNTV_CTL,  offsetof(struct kvm_vcpu, arch.timer_cpu.cntv_ctl));
index 56ce6290c8318e4b56ac02c766180e2f6c72466c..2a55373f49bfb621987ad2a548271fe51d7923b5 100644 (file)
@@ -134,9 +134,7 @@ ENTRY(__hyp_stub_install_secondary)
        mcr     p15, 4, r7, c1, c1, 3   @ HSTR
 
 THUMB( orr     r7, #(1 << 30)  )       @ HSCTLR.TE
-#ifdef CONFIG_CPU_BIG_ENDIAN
-       orr     r7, #(1 << 9)           @ HSCTLR.EE
-#endif
+ARM_BE8(orr    r7, r7, #(1 << 25))     @ HSCTLR.EE
        mcr     p15, 4, r7, c1, c0, 0   @ HSCTLR
 
        mrc     p15, 4, r7, c1, c1, 1   @ HDCR
index 4be5bb150bdddea694fbf71bffa6dd8e9b855177..466bd299b1a8aad54949364d976d9c5430c2375e 100644 (file)
@@ -23,7 +23,7 @@ config KVM
        select HAVE_KVM_CPU_RELAX_INTERCEPT
        select KVM_MMIO
        select KVM_ARM_HOST
-       depends on ARM_VIRT_EXT && ARM_LPAE && !CPU_BIG_ENDIAN
+       depends on ARM_VIRT_EXT && ARM_LPAE
        ---help---
          Support hosting virtualized guest machines. You will also
          need to select one or more of the processor modules below.
index 789bca9e64a7fdeabe091df30db44daf8b4b1b40..f7057ed045b63bc0c42a240095f1a5927ad59de0 100644 (file)
@@ -21,4 +21,5 @@ obj-y += kvm-arm.o init.o interrupts.o
 obj-y += arm.o handle_exit.o guest.o mmu.o emulate.o reset.o
 obj-y += coproc.o coproc_a15.o coproc_a7.o mmio.o psci.o perf.o
 obj-$(CONFIG_KVM_ARM_VGIC) += $(KVM)/arm/vgic.o
+obj-$(CONFIG_KVM_ARM_VGIC) += $(KVM)/arm/vgic-v2.o
 obj-$(CONFIG_KVM_ARM_TIMER) += $(KVM)/arm/arch_timer.o
index 3c82b37c0f9edbe031718a67ac3c8426139f8862..a99e0cdf8ba2f3c1799b3a7c2013f8e024b8056e 100644 (file)
@@ -155,16 +155,6 @@ int kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf)
        return VM_FAULT_SIGBUS;
 }
 
-void kvm_arch_free_memslot(struct kvm *kvm, struct kvm_memory_slot *free,
-                          struct kvm_memory_slot *dont)
-{
-}
-
-int kvm_arch_create_memslot(struct kvm *kvm, struct kvm_memory_slot *slot,
-                           unsigned long npages)
-{
-       return 0;
-}
 
 /**
  * kvm_arch_destroy_vm - destroy the VM data structure
@@ -184,7 +174,7 @@ void kvm_arch_destroy_vm(struct kvm *kvm)
        }
 }
 
-int kvm_dev_ioctl_check_extension(long ext)
+int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
 {
        int r;
        switch (ext) {
@@ -225,33 +215,6 @@ long kvm_arch_dev_ioctl(struct file *filp,
        return -EINVAL;
 }
 
-void kvm_arch_memslots_updated(struct kvm *kvm)
-{
-}
-
-int kvm_arch_prepare_memory_region(struct kvm *kvm,
-                                  struct kvm_memory_slot *memslot,
-                                  struct kvm_userspace_memory_region *mem,
-                                  enum kvm_mr_change change)
-{
-       return 0;
-}
-
-void kvm_arch_commit_memory_region(struct kvm *kvm,
-                                  struct kvm_userspace_memory_region *mem,
-                                  const struct kvm_memory_slot *old,
-                                  enum kvm_mr_change change)
-{
-}
-
-void kvm_arch_flush_shadow_all(struct kvm *kvm)
-{
-}
-
-void kvm_arch_flush_shadow_memslot(struct kvm *kvm,
-                                  struct kvm_memory_slot *slot)
-{
-}
 
 struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm, unsigned int id)
 {
index c58a35116f6307781064761f919dcd2112e22c20..37a0fe1bb9bb3de3dbcb3139f4dc22b50f83063f 100644 (file)
@@ -44,6 +44,31 @@ static u32 cache_levels;
 /* CSSELR values; used to index KVM_REG_ARM_DEMUX_ID_CCSIDR */
 #define CSSELR_MAX 12
 
+/*
+ * kvm_vcpu_arch.cp15 holds cp15 registers as an array of u32, but some
+ * of cp15 registers can be viewed either as couple of two u32 registers
+ * or one u64 register. Current u64 register encoding is that least
+ * significant u32 word is followed by most significant u32 word.
+ */
+static inline void vcpu_cp15_reg64_set(struct kvm_vcpu *vcpu,
+                                      const struct coproc_reg *r,
+                                      u64 val)
+{
+       vcpu->arch.cp15[r->reg] = val & 0xffffffff;
+       vcpu->arch.cp15[r->reg + 1] = val >> 32;
+}
+
+static inline u64 vcpu_cp15_reg64_get(struct kvm_vcpu *vcpu,
+                                     const struct coproc_reg *r)
+{
+       u64 val;
+
+       val = vcpu->arch.cp15[r->reg + 1];
+       val = val << 32;
+       val = val | vcpu->arch.cp15[r->reg];
+       return val;
+}
+
 int kvm_handle_cp10_id(struct kvm_vcpu *vcpu, struct kvm_run *run)
 {
        kvm_inject_undefined(vcpu);
@@ -682,17 +707,23 @@ static struct coproc_reg invariant_cp15[] = {
        { CRn( 0), CRm( 0), Op1( 1), Op2( 7), is32, NULL, get_AIDR },
 };
 
+/*
+ * Reads a register value from a userspace address to a kernel
+ * variable. Make sure that register size matches sizeof(*__val).
+ */
 static int reg_from_user(void *val, const void __user *uaddr, u64 id)
 {
-       /* This Just Works because we are little endian. */
        if (copy_from_user(val, uaddr, KVM_REG_SIZE(id)) != 0)
                return -EFAULT;
        return 0;
 }
 
+/*
+ * Writes a register value to a userspace address from a kernel variable.
+ * Make sure that register size matches sizeof(*__val).
+ */
 static int reg_to_user(void __user *uaddr, const void *val, u64 id)
 {
-       /* This Just Works because we are little endian. */
        if (copy_to_user(uaddr, val, KVM_REG_SIZE(id)) != 0)
                return -EFAULT;
        return 0;
@@ -702,6 +733,7 @@ static int get_invariant_cp15(u64 id, void __user *uaddr)
 {
        struct coproc_params params;
        const struct coproc_reg *r;
+       int ret;
 
        if (!index_to_params(id, &params))
                return -ENOENT;
@@ -710,7 +742,15 @@ static int get_invariant_cp15(u64 id, void __user *uaddr)
        if (!r)
                return -ENOENT;
 
-       return reg_to_user(uaddr, &r->val, id);
+       ret = -ENOENT;
+       if (KVM_REG_SIZE(id) == 4) {
+               u32 val = r->val;
+
+               ret = reg_to_user(uaddr, &val, id);
+       } else if (KVM_REG_SIZE(id) == 8) {
+               ret = reg_to_user(uaddr, &r->val, id);
+       }
+       return ret;
 }
 
 static int set_invariant_cp15(u64 id, void __user *uaddr)
@@ -718,7 +758,7 @@ static int set_invariant_cp15(u64 id, void __user *uaddr)
        struct coproc_params params;
        const struct coproc_reg *r;
        int err;
-       u64 val = 0; /* Make sure high bits are 0 for 32-bit regs */
+       u64 val;
 
        if (!index_to_params(id, &params))
                return -ENOENT;
@@ -726,7 +766,16 @@ static int set_invariant_cp15(u64 id, void __user *uaddr)
        if (!r)
                return -ENOENT;
 
-       err = reg_from_user(&val, uaddr, id);
+       err = -ENOENT;
+       if (KVM_REG_SIZE(id) == 4) {
+               u32 val32;
+
+               err = reg_from_user(&val32, uaddr, id);
+               if (!err)
+                       val = val32;
+       } else if (KVM_REG_SIZE(id) == 8) {
+               err = reg_from_user(&val, uaddr, id);
+       }
        if (err)
                return err;
 
@@ -1004,6 +1053,7 @@ int kvm_arm_coproc_get_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg)
 {
        const struct coproc_reg *r;
        void __user *uaddr = (void __user *)(long)reg->addr;
+       int ret;
 
        if ((reg->id & KVM_REG_ARM_COPROC_MASK) == KVM_REG_ARM_DEMUX)
                return demux_c15_get(reg->id, uaddr);
@@ -1015,14 +1065,24 @@ int kvm_arm_coproc_get_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg)
        if (!r)
                return get_invariant_cp15(reg->id, uaddr);
 
-       /* Note: copies two regs if size is 64 bit. */
-       return reg_to_user(uaddr, &vcpu->arch.cp15[r->reg], reg->id);
+       ret = -ENOENT;
+       if (KVM_REG_SIZE(reg->id) == 8) {
+               u64 val;
+
+               val = vcpu_cp15_reg64_get(vcpu, r);
+               ret = reg_to_user(uaddr, &val, reg->id);
+       } else if (KVM_REG_SIZE(reg->id) == 4) {
+               ret = reg_to_user(uaddr, &vcpu->arch.cp15[r->reg], reg->id);
+       }
+
+       return ret;
 }
 
 int kvm_arm_coproc_set_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg)
 {
        const struct coproc_reg *r;
        void __user *uaddr = (void __user *)(long)reg->addr;
+       int ret;
 
        if ((reg->id & KVM_REG_ARM_COPROC_MASK) == KVM_REG_ARM_DEMUX)
                return demux_c15_set(reg->id, uaddr);
@@ -1034,8 +1094,18 @@ int kvm_arm_coproc_set_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg)
        if (!r)
                return set_invariant_cp15(reg->id, uaddr);
 
-       /* Note: copies two regs if size is 64 bit */
-       return reg_from_user(&vcpu->arch.cp15[r->reg], uaddr, reg->id);
+       ret = -ENOENT;
+       if (KVM_REG_SIZE(reg->id) == 8) {
+               u64 val;
+
+               ret = reg_from_user(&val, uaddr, reg->id);
+               if (!ret)
+                       vcpu_cp15_reg64_set(vcpu, r, val);
+       } else if (KVM_REG_SIZE(reg->id) == 4) {
+               ret = reg_from_user(&vcpu->arch.cp15[r->reg], uaddr, reg->id);
+       }
+
+       return ret;
 }
 
 static unsigned int num_demux_regs(void)
index 70bf49b8b2442ca5849cc544513a25ada24b6613..813e492586909e006ccdcb1f3dc752729cc322ef 100644 (file)
@@ -124,16 +124,6 @@ static bool is_timer_reg(u64 index)
        return false;
 }
 
-int kvm_arm_timer_set_reg(struct kvm_vcpu *vcpu, u64 regid, u64 value)
-{
-       return 0;
-}
-
-u64 kvm_arm_timer_get_reg(struct kvm_vcpu *vcpu, u64 regid)
-{
-       return 0;
-}
-
 #else
 
 #define NUM_TIMER_REGS 3
index b2d229f09c0777d3dedcf5e6cfc7fbe4ea19addc..991415d978b6020a958ac44a886103ee83aa764c 100644 (file)
@@ -72,7 +72,7 @@ __do_hyp_init:
        bne     phase2                  @ Yes, second stage init
 
        @ Set the HTTBR to point to the hypervisor PGD pointer passed
-       mcrr    p15, 4, r2, r3, c2
+       mcrr    p15, 4, rr_lo_hi(r2, r3), c2
 
        @ Set the HTCR and VTCR to the same shareability and cacheability
        @ settings as the non-secure TTBCR and with T0SZ == 0.
@@ -138,7 +138,7 @@ phase2:
        ret     r0
 
 target:        @ We're now in the trampoline code, switch page tables
-       mcrr    p15, 4, r2, r3, c2
+       mcrr    p15, 4, rr_lo_hi(r2, r3), c2
        isb
 
        @ Invalidate the old TLBs
index 0d68d4073068e8ad665840b8f51319e9b2bdbd89..01dcb0e752d9f04cbb1492378cc6382397c9c8e8 100644 (file)
@@ -52,7 +52,7 @@ ENTRY(__kvm_tlb_flush_vmid_ipa)
        dsb     ishst
        add     r0, r0, #KVM_VTTBR
        ldrd    r2, r3, [r0]
-       mcrr    p15, 6, r2, r3, c2      @ Write VTTBR
+       mcrr    p15, 6, rr_lo_hi(r2, r3), c2    @ Write VTTBR
        isb
        mcr     p15, 0, r0, c8, c3, 0   @ TLBIALLIS (rt ignored)
        dsb     ish
@@ -135,7 +135,7 @@ ENTRY(__kvm_vcpu_run)
        ldr     r1, [vcpu, #VCPU_KVM]
        add     r1, r1, #KVM_VTTBR
        ldrd    r2, r3, [r1]
-       mcrr    p15, 6, r2, r3, c2      @ Write VTTBR
+       mcrr    p15, 6, rr_lo_hi(r2, r3), c2    @ Write VTTBR
 
        @ We're all done, just restore the GPRs and go to the guest
        restore_guest_regs
@@ -199,8 +199,13 @@ after_vfp_restore:
 
        restore_host_regs
        clrex                           @ Clear exclusive monitor
+#ifndef CONFIG_CPU_ENDIAN_BE8
        mov     r0, r1                  @ Return the return code
        mov     r1, #0                  @ Clear upper bits in return value
+#else
+       @ r1 already has return code
+       mov     r0, #0                  @ Clear upper bits in return value
+#endif /* CONFIG_CPU_ENDIAN_BE8 */
        bx      lr                      @ return to IOCTL
 
 /********************************************************************
index 76af930255743724c0dd6cf26882968adcfbd959..98c8c5b9a87f392a0410a1ca51481e93172bad8f 100644 (file)
@@ -1,4 +1,5 @@
 #include <linux/irqchip/arm-gic.h>
+#include <asm/assembler.h>
 
 #define VCPU_USR_REG(_reg_nr)  (VCPU_USR_REGS + (_reg_nr * 4))
 #define VCPU_USR_SP            (VCPU_USR_REG(13))
@@ -420,15 +421,23 @@ vcpu      .req    r0              @ vcpu pointer always in r0
        ldr     r8, [r2, #GICH_ELRSR0]
        ldr     r9, [r2, #GICH_ELRSR1]
        ldr     r10, [r2, #GICH_APR]
-
-       str     r3, [r11, #VGIC_CPU_HCR]
-       str     r4, [r11, #VGIC_CPU_VMCR]
-       str     r5, [r11, #VGIC_CPU_MISR]
-       str     r6, [r11, #VGIC_CPU_EISR]
-       str     r7, [r11, #(VGIC_CPU_EISR + 4)]
-       str     r8, [r11, #VGIC_CPU_ELRSR]
-       str     r9, [r11, #(VGIC_CPU_ELRSR + 4)]
-       str     r10, [r11, #VGIC_CPU_APR]
+ARM_BE8(rev    r3, r3  )
+ARM_BE8(rev    r4, r4  )
+ARM_BE8(rev    r5, r5  )
+ARM_BE8(rev    r6, r6  )
+ARM_BE8(rev    r7, r7  )
+ARM_BE8(rev    r8, r8  )
+ARM_BE8(rev    r9, r9  )
+ARM_BE8(rev    r10, r10        )
+
+       str     r3, [r11, #VGIC_V2_CPU_HCR]
+       str     r4, [r11, #VGIC_V2_CPU_VMCR]
+       str     r5, [r11, #VGIC_V2_CPU_MISR]
+       str     r6, [r11, #VGIC_V2_CPU_EISR]
+       str     r7, [r11, #(VGIC_V2_CPU_EISR + 4)]
+       str     r8, [r11, #VGIC_V2_CPU_ELRSR]
+       str     r9, [r11, #(VGIC_V2_CPU_ELRSR + 4)]
+       str     r10, [r11, #VGIC_V2_CPU_APR]
 
        /* Clear GICH_HCR */
        mov     r5, #0
@@ -436,9 +445,10 @@ vcpu       .req    r0              @ vcpu pointer always in r0
 
        /* Save list registers */
        add     r2, r2, #GICH_LR0
-       add     r3, r11, #VGIC_CPU_LR
+       add     r3, r11, #VGIC_V2_CPU_LR
        ldr     r4, [r11, #VGIC_CPU_NR_LR]
 1:     ldr     r6, [r2], #4
+ARM_BE8(rev    r6, r6  )
        str     r6, [r3], #4
        subs    r4, r4, #1
        bne     1b
@@ -463,9 +473,12 @@ vcpu       .req    r0              @ vcpu pointer always in r0
        add     r11, vcpu, #VCPU_VGIC_CPU
 
        /* We only restore a minimal set of registers */
-       ldr     r3, [r11, #VGIC_CPU_HCR]
-       ldr     r4, [r11, #VGIC_CPU_VMCR]
-       ldr     r8, [r11, #VGIC_CPU_APR]
+       ldr     r3, [r11, #VGIC_V2_CPU_HCR]
+       ldr     r4, [r11, #VGIC_V2_CPU_VMCR]
+       ldr     r8, [r11, #VGIC_V2_CPU_APR]
+ARM_BE8(rev    r3, r3  )
+ARM_BE8(rev    r4, r4  )
+ARM_BE8(rev    r8, r8  )
 
        str     r3, [r2, #GICH_HCR]
        str     r4, [r2, #GICH_VMCR]
@@ -473,9 +486,10 @@ vcpu       .req    r0              @ vcpu pointer always in r0
 
        /* Restore list registers */
        add     r2, r2, #GICH_LR0
-       add     r3, r11, #VGIC_CPU_LR
+       add     r3, r11, #VGIC_V2_CPU_LR
        ldr     r4, [r11, #VGIC_CPU_NR_LR]
 1:     ldr     r6, [r3], #4
+ARM_BE8(rev    r6, r6  )
        str     r6, [r2], #4
        subs    r4, r4, #1
        bne     1b
@@ -506,7 +520,7 @@ vcpu        .req    r0              @ vcpu pointer always in r0
        mcr     p15, 0, r2, c14, c3, 1  @ CNTV_CTL
        isb
 
-       mrrc    p15, 3, r2, r3, c14     @ CNTV_CVAL
+       mrrc    p15, 3, rr_lo_hi(r2, r3), c14   @ CNTV_CVAL
        ldr     r4, =VCPU_TIMER_CNTV_CVAL
        add     r5, vcpu, r4
        strd    r2, r3, [r5]
@@ -546,12 +560,12 @@ vcpu      .req    r0              @ vcpu pointer always in r0
 
        ldr     r2, [r4, #KVM_TIMER_CNTVOFF]
        ldr     r3, [r4, #(KVM_TIMER_CNTVOFF + 4)]
-       mcrr    p15, 4, r2, r3, c14     @ CNTVOFF
+       mcrr    p15, 4, rr_lo_hi(r2, r3), c14   @ CNTVOFF
 
        ldr     r4, =VCPU_TIMER_CNTV_CVAL
        add     r5, vcpu, r4
        ldrd    r2, r3, [r5]
-       mcrr    p15, 3, r2, r3, c14     @ CNTV_CVAL
+       mcrr    p15, 3, rr_lo_hi(r2, r3), c14   @ CNTV_CVAL
        isb
 
        ldr     r2, [vcpu, #VCPU_TIMER_CNTV_CTL]
index 16f804938b8fea9fee56fa93991cf8c45cf141e5..16e7994bf3473d4c6ec7c32a8571299c02ab7808 100644 (file)
@@ -90,104 +90,115 @@ static void *mmu_memory_cache_alloc(struct kvm_mmu_memory_cache *mc)
        return p;
 }
 
-static bool page_empty(void *ptr)
+static void clear_pgd_entry(struct kvm *kvm, pgd_t *pgd, phys_addr_t addr)
 {
-       struct page *ptr_page = virt_to_page(ptr);
-       return page_count(ptr_page) == 1;
+       pud_t *pud_table __maybe_unused = pud_offset(pgd, 0);
+       pgd_clear(pgd);
+       kvm_tlb_flush_vmid_ipa(kvm, addr);
+       pud_free(NULL, pud_table);
+       put_page(virt_to_page(pgd));
 }
 
 static void clear_pud_entry(struct kvm *kvm, pud_t *pud, phys_addr_t addr)
 {
-       if (pud_huge(*pud)) {
-               pud_clear(pud);
-               kvm_tlb_flush_vmid_ipa(kvm, addr);
-       } else {
-               pmd_t *pmd_table = pmd_offset(pud, 0);
-               pud_clear(pud);
-               kvm_tlb_flush_vmid_ipa(kvm, addr);
-               pmd_free(NULL, pmd_table);
-       }
+       pmd_t *pmd_table = pmd_offset(pud, 0);
+       VM_BUG_ON(pud_huge(*pud));
+       pud_clear(pud);
+       kvm_tlb_flush_vmid_ipa(kvm, addr);
+       pmd_free(NULL, pmd_table);
        put_page(virt_to_page(pud));
 }
 
 static void clear_pmd_entry(struct kvm *kvm, pmd_t *pmd, phys_addr_t addr)
 {
-       if (kvm_pmd_huge(*pmd)) {
-               pmd_clear(pmd);
-               kvm_tlb_flush_vmid_ipa(kvm, addr);
-       } else {
-               pte_t *pte_table = pte_offset_kernel(pmd, 0);
-               pmd_clear(pmd);
-               kvm_tlb_flush_vmid_ipa(kvm, addr);
-               pte_free_kernel(NULL, pte_table);
-       }
+       pte_t *pte_table = pte_offset_kernel(pmd, 0);
+       VM_BUG_ON(kvm_pmd_huge(*pmd));
+       pmd_clear(pmd);
+       kvm_tlb_flush_vmid_ipa(kvm, addr);
+       pte_free_kernel(NULL, pte_table);
        put_page(virt_to_page(pmd));
 }
 
-static void clear_pte_entry(struct kvm *kvm, pte_t *pte, phys_addr_t addr)
+static void unmap_ptes(struct kvm *kvm, pmd_t *pmd,
+                      phys_addr_t addr, phys_addr_t end)
 {
-       if (pte_present(*pte)) {
-               kvm_set_pte(pte, __pte(0));
-               put_page(virt_to_page(pte));
-               kvm_tlb_flush_vmid_ipa(kvm, addr);
-       }
+       phys_addr_t start_addr = addr;
+       pte_t *pte, *start_pte;
+
+       start_pte = pte = pte_offset_kernel(pmd, addr);
+       do {
+               if (!pte_none(*pte)) {
+                       kvm_set_pte(pte, __pte(0));
+                       put_page(virt_to_page(pte));
+                       kvm_tlb_flush_vmid_ipa(kvm, addr);
+               }
+       } while (pte++, addr += PAGE_SIZE, addr != end);
+
+       if (kvm_pte_table_empty(start_pte))
+               clear_pmd_entry(kvm, pmd, start_addr);
 }
 
-static void unmap_range(struct kvm *kvm, pgd_t *pgdp,
-                       unsigned long long start, u64 size)
+static void unmap_pmds(struct kvm *kvm, pud_t *pud,
+                      phys_addr_t addr, phys_addr_t end)
 {
-       pgd_t *pgd;
-       pud_t *pud;
-       pmd_t *pmd;
-       pte_t *pte;
-       unsigned long long addr = start, end = start + size;
-       u64 next;
-
-       while (addr < end) {
-               pgd = pgdp + pgd_index(addr);
-               pud = pud_offset(pgd, addr);
-               pte = NULL;
-               if (pud_none(*pud)) {
-                       addr = kvm_pud_addr_end(addr, end);
-                       continue;
-               }
+       phys_addr_t next, start_addr = addr;
+       pmd_t *pmd, *start_pmd;
 
-               if (pud_huge(*pud)) {
-                       /*
-                        * If we are dealing with a huge pud, just clear it and
-                        * move on.
-                        */
-                       clear_pud_entry(kvm, pud, addr);
-                       addr = kvm_pud_addr_end(addr, end);
-                       continue;
+       start_pmd = pmd = pmd_offset(pud, addr);
+       do {
+               next = kvm_pmd_addr_end(addr, end);
+               if (!pmd_none(*pmd)) {
+                       if (kvm_pmd_huge(*pmd)) {
+                               pmd_clear(pmd);
+                               kvm_tlb_flush_vmid_ipa(kvm, addr);
+                               put_page(virt_to_page(pmd));
+                       } else {
+                               unmap_ptes(kvm, pmd, addr, next);
+                       }
                }
+       } while (pmd++, addr = next, addr != end);
 
-               pmd = pmd_offset(pud, addr);
-               if (pmd_none(*pmd)) {
-                       addr = kvm_pmd_addr_end(addr, end);
-                       continue;
-               }
+       if (kvm_pmd_table_empty(start_pmd))
+               clear_pud_entry(kvm, pud, start_addr);
+}
 
-               if (!kvm_pmd_huge(*pmd)) {
-                       pte = pte_offset_kernel(pmd, addr);
-                       clear_pte_entry(kvm, pte, addr);
-                       next = addr + PAGE_SIZE;
-               }
+static void unmap_puds(struct kvm *kvm, pgd_t *pgd,
+                      phys_addr_t addr, phys_addr_t end)
+{
+       phys_addr_t next, start_addr = addr;
+       pud_t *pud, *start_pud;
 
-               /*
-                * If the pmd entry is to be cleared, walk back up the ladder
-                */
-               if (kvm_pmd_huge(*pmd) || (pte && page_empty(pte))) {
-                       clear_pmd_entry(kvm, pmd, addr);
-                       next = kvm_pmd_addr_end(addr, end);
-                       if (page_empty(pmd) && !page_empty(pud)) {
-                               clear_pud_entry(kvm, pud, addr);
-                               next = kvm_pud_addr_end(addr, end);
+       start_pud = pud = pud_offset(pgd, addr);
+       do {
+               next = kvm_pud_addr_end(addr, end);
+               if (!pud_none(*pud)) {
+                       if (pud_huge(*pud)) {
+                               pud_clear(pud);
+                               kvm_tlb_flush_vmid_ipa(kvm, addr);
+                               put_page(virt_to_page(pud));
+                       } else {
+                               unmap_pmds(kvm, pud, addr, next);
                        }
                }
+       } while (pud++, addr = next, addr != end);
 
-               addr = next;
-       }
+       if (kvm_pud_table_empty(start_pud))
+               clear_pgd_entry(kvm, pgd, start_addr);
+}
+
+
+static void unmap_range(struct kvm *kvm, pgd_t *pgdp,
+                       phys_addr_t start, u64 size)
+{
+       pgd_t *pgd;
+       phys_addr_t addr = start, end = start + size;
+       phys_addr_t next;
+
+       pgd = pgdp + pgd_index(addr);
+       do {
+               next = kvm_pgd_addr_end(addr, end);
+               unmap_puds(kvm, pgd, addr, next);
+       } while (pgd++, addr = next, addr != end);
 }
 
 static void stage2_flush_ptes(struct kvm *kvm, pmd_t *pmd,
@@ -748,6 +759,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
        struct kvm_mmu_memory_cache *memcache = &vcpu->arch.mmu_page_cache;
        struct vm_area_struct *vma;
        pfn_t pfn;
+       pgprot_t mem_type = PAGE_S2;
 
        write_fault = kvm_is_write_fault(kvm_vcpu_get_hsr(vcpu));
        if (fault_status == FSC_PERM && !write_fault) {
@@ -798,6 +810,9 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
        if (is_error_pfn(pfn))
                return -EFAULT;
 
+       if (kvm_is_mmio_pfn(pfn))
+               mem_type = PAGE_S2_DEVICE;
+
        spin_lock(&kvm->mmu_lock);
        if (mmu_notifier_retry(kvm, mmu_seq))
                goto out_unlock;
@@ -805,7 +820,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
                hugetlb = transparent_hugepage_adjust(&pfn, &fault_ipa);
 
        if (hugetlb) {
-               pmd_t new_pmd = pfn_pmd(pfn, PAGE_S2);
+               pmd_t new_pmd = pfn_pmd(pfn, mem_type);
                new_pmd = pmd_mkhuge(new_pmd);
                if (writable) {
                        kvm_set_s2pmd_writable(&new_pmd);
@@ -814,13 +829,14 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
                coherent_cache_guest_page(vcpu, hva & PMD_MASK, PMD_SIZE);
                ret = stage2_set_pmd_huge(kvm, memcache, fault_ipa, &new_pmd);
        } else {
-               pte_t new_pte = pfn_pte(pfn, PAGE_S2);
+               pte_t new_pte = pfn_pte(pfn, mem_type);
                if (writable) {
                        kvm_set_s2pte_writable(&new_pte);
                        kvm_set_pfn_dirty(pfn);
                }
                coherent_cache_guest_page(vcpu, hva, PAGE_SIZE);
-               ret = stage2_set_pte(kvm, memcache, fault_ipa, &new_pte, false);
+               ret = stage2_set_pte(kvm, memcache, fault_ipa, &new_pte,
+                                    mem_type == PAGE_S2_DEVICE);
        }
 
 
@@ -1100,3 +1116,49 @@ out:
        free_hyp_pgds();
        return err;
 }
+
+void kvm_arch_commit_memory_region(struct kvm *kvm,
+                                  struct kvm_userspace_memory_region *mem,
+                                  const struct kvm_memory_slot *old,
+                                  enum kvm_mr_change change)
+{
+       gpa_t gpa = old->base_gfn << PAGE_SHIFT;
+       phys_addr_t size = old->npages << PAGE_SHIFT;
+       if (change == KVM_MR_DELETE || change == KVM_MR_MOVE) {
+               spin_lock(&kvm->mmu_lock);
+               unmap_stage2_range(kvm, gpa, size);
+               spin_unlock(&kvm->mmu_lock);
+       }
+}
+
+int kvm_arch_prepare_memory_region(struct kvm *kvm,
+                                  struct kvm_memory_slot *memslot,
+                                  struct kvm_userspace_memory_region *mem,
+                                  enum kvm_mr_change change)
+{
+       return 0;
+}
+
+void kvm_arch_free_memslot(struct kvm *kvm, struct kvm_memory_slot *free,
+                          struct kvm_memory_slot *dont)
+{
+}
+
+int kvm_arch_create_memslot(struct kvm *kvm, struct kvm_memory_slot *slot,
+                           unsigned long npages)
+{
+       return 0;
+}
+
+void kvm_arch_memslots_updated(struct kvm *kvm)
+{
+}
+
+void kvm_arch_flush_shadow_all(struct kvm *kvm)
+{
+}
+
+void kvm_arch_flush_shadow_memslot(struct kvm *kvm,
+                                  struct kvm_memory_slot *slot)
+{
+}
index 5306de35013397994ec6873f2a713af5d47867a4..312d43eb686a0254543258efdc3185c340bde82c 100644 (file)
@@ -19,6 +19,7 @@
  * Author: Will Deacon <will.deacon@arm.com>
  */
 
+#include <linux/clocksource.h>
 #include <linux/delay.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
@@ -36,6 +37,7 @@ struct arm_delay_ops arm_delay_ops = {
 
 static const struct delay_timer *delay_timer;
 static bool delay_calibrated;
+static u64 delay_res;
 
 int read_current_timer(unsigned long *timer_val)
 {
@@ -47,6 +49,11 @@ int read_current_timer(unsigned long *timer_val)
 }
 EXPORT_SYMBOL_GPL(read_current_timer);
 
+static inline u64 cyc_to_ns(u64 cyc, u32 mult, u32 shift)
+{
+       return (cyc * mult) >> shift;
+}
+
 static void __timer_delay(unsigned long cycles)
 {
        cycles_t start = get_cycles();
@@ -69,18 +76,24 @@ static void __timer_udelay(unsigned long usecs)
 
 void __init register_current_timer_delay(const struct delay_timer *timer)
 {
-       if (!delay_calibrated) {
-               pr_info("Switching to timer-based delay loop\n");
+       u32 new_mult, new_shift;
+       u64 res;
+
+       clocks_calc_mult_shift(&new_mult, &new_shift, timer->freq,
+                              NSEC_PER_SEC, 3600);
+       res = cyc_to_ns(1ULL, new_mult, new_shift);
+
+       if (!delay_calibrated && (!delay_res || (res < delay_res))) {
+               pr_info("Switching to timer-based delay loop, resolution %lluns\n", res);
                delay_timer                     = timer;
                lpj_fine                        = timer->freq / HZ;
+               delay_res                       = res;
 
                /* cpufreq may scale loops_per_jiffy, so keep a private copy */
                arm_delay_ops.ticks_per_jiffy   = lpj_fine;
                arm_delay_ops.delay             = __timer_delay;
                arm_delay_ops.const_udelay      = __timer_const_udelay;
                arm_delay_ops.udelay            = __timer_udelay;
-
-               delay_calibrated                = true;
        } else {
                pr_info("Ignoring duplicate/late registration of read_current_timer delay\n");
        }
@@ -91,3 +104,8 @@ unsigned long calibrate_delay_is_known(void)
        delay_calibrated = true;
        return lpj_fine;
 }
+
+void calibration_delay_done(void)
+{
+       delay_calibrated = true;
+}
index 45b55e0f0db62de039bebe152c3d503048b655e8..6cc6f7aebdaea65004409a84fa1a7913a67c1bbb 100644 (file)
@@ -113,14 +113,12 @@ config SOC_AT91RM9200
        select HAVE_AT91_DBGU0
        select MULTI_IRQ_HANDLER
        select SPARSE_IRQ
-       select AT91_USE_OLD_CLK
        select HAVE_AT91_USB_CLK
 
 config SOC_AT91SAM9260
        bool "AT91SAM9260, AT91SAM9XE or AT91SAM9G20"
        select HAVE_AT91_DBGU0
        select SOC_AT91SAM9
-       select AT91_USE_OLD_CLK
        select HAVE_AT91_USB_CLK
        help
          Select this if you are using one of Atmel's AT91SAM9260, AT91SAM9XE
@@ -140,7 +138,6 @@ config SOC_AT91SAM9263
        select HAVE_AT91_DBGU1
        select HAVE_FB_ATMEL
        select SOC_AT91SAM9
-       select AT91_USE_OLD_CLK
        select HAVE_AT91_USB_CLK
 
 config SOC_AT91SAM9RL
@@ -155,7 +152,6 @@ config SOC_AT91SAM9G45
        select HAVE_AT91_DBGU1
        select HAVE_FB_ATMEL
        select SOC_AT91SAM9
-       select AT91_USE_OLD_CLK
        select HAVE_AT91_UTMI
        select HAVE_AT91_USB_CLK
        help
index 787bb50a4dff442361b587a190283a659a059de6..038702ee8bc6f370a1aabc27cf1590fd34d19fae 100644 (file)
 #include "at91_aic.h"
 #include "soc.h"
 #include "generic.h"
-#include "clock.h"
 #include "sam9_smc.h"
 #include "pm.h"
 
+#if defined(CONFIG_OLD_CLK_AT91)
+#include "clock.h"
 /* --------------------------------------------------------------------
  *  Clocks
  * -------------------------------------------------------------------- */
@@ -277,6 +278,9 @@ static void __init at91rm9200_register_clocks(void)
        clk_register(&pck2);
        clk_register(&pck3);
 }
+#else
+#define at91rm9200_register_clocks NULL
+#endif
 
 /* --------------------------------------------------------------------
  *  GPIO
index c3d22be73b7cc99bc638192dce47f25ed0919821..3477ba94c4c5b8a8e80c99967a352c1c6ab3e477 100644 (file)
 #include "at91_rstc.h"
 #include "soc.h"
 #include "generic.h"
-#include "clock.h"
 #include "sam9_smc.h"
 #include "pm.h"
 
+#if defined(CONFIG_OLD_CLK_AT91)
+#include "clock.h"
 /* --------------------------------------------------------------------
  *  Clocks
  * -------------------------------------------------------------------- */
@@ -288,6 +289,9 @@ static void __init at91sam9260_register_clocks(void)
        clk_register(&pck0);
        clk_register(&pck1);
 }
+#else
+#define at91sam9260_register_clocks NULL
+#endif
 
 /* --------------------------------------------------------------------
  *  GPIO
index f30290572293273e94b9523ce0072f43cf607fc6..810fa5f15a51a0c7b4db7ca022185910e2d9e064 100644 (file)
 #include "at91_rstc.h"
 #include "soc.h"
 #include "generic.h"
-#include "clock.h"
 #include "sam9_smc.h"
 #include "pm.h"
 
+#if defined(CONFIG_OLD_CLK_AT91)
+#include "clock.h"
 /* --------------------------------------------------------------------
  *  Clocks
  * -------------------------------------------------------------------- */
@@ -199,6 +200,7 @@ static struct clk_lookup periph_clocks_lookups[] = {
        CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk),
        CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tcb_clk),
        CLKDEV_CON_DEV_ID(NULL, "i2c-at91sam9260.0", &twi_clk),
+       CLKDEV_CON_DEV_ID(NULL, "at91sam9rl-pwm", &pwm_clk),
        /* fake hclk clock */
        CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &ohci_clk),
        CLKDEV_CON_ID("pioA", &pioA_clk),
@@ -280,6 +282,9 @@ static void __init at91sam9263_register_clocks(void)
        clk_register(&pck2);
        clk_register(&pck3);
 }
+#else
+#define at91sam9263_register_clocks NULL
+#endif
 
 /* --------------------------------------------------------------------
  *  GPIO
index 309390d8e2f8cebe71c09d5876d4dc89a20724f5..cef0e2f57068ac92b84767df4d4153d72d9ab36a 100644 (file)
@@ -1131,9 +1131,7 @@ static void __init at91_add_device_watchdog(void) {}
  *  PWM
  * --------------------------------------------------------------------*/
 
-#if defined(CONFIG_ATMEL_PWM)
-static u32 pwm_mask;
-
+#if IS_ENABLED(CONFIG_PWM_ATMEL)
 static struct resource pwm_resources[] = {
        [0] = {
                .start  = AT91SAM9263_BASE_PWMC,
@@ -1148,11 +1146,8 @@ static struct resource pwm_resources[] = {
 };
 
 static struct platform_device at91sam9263_pwm0_device = {
-       .name   = "atmel_pwm",
+       .name   = "at91sam9rl-pwm",
        .id     = -1,
-       .dev    = {
-               .platform_data          = &pwm_mask,
-       },
        .resource       = pwm_resources,
        .num_resources  = ARRAY_SIZE(pwm_resources),
 };
@@ -1171,8 +1166,6 @@ void __init at91_add_device_pwm(u32 mask)
        if (mask & (1 << AT91_PWM3))
                at91_set_B_periph(AT91_PIN_PB29, 1);    /* enable PWM3 */
 
-       pwm_mask = mask;
-
        platform_device_register(&at91sam9263_pwm0_device);
 }
 #else
index 9d3d544ac19c95476c2a1cf513b6283100dba923..9d45496e4932689b5c2f4e14ac477280cbb149c0 100644 (file)
 #include "at91_aic.h"
 #include "soc.h"
 #include "generic.h"
-#include "clock.h"
 #include "sam9_smc.h"
 #include "pm.h"
 
+#if defined(CONFIG_OLD_CLK_AT91)
+#include "clock.h"
 /* --------------------------------------------------------------------
  *  Clocks
  * -------------------------------------------------------------------- */
@@ -251,6 +252,7 @@ static struct clk_lookup periph_clocks_lookups[] = {
        CLKDEV_CON_DEV_ID(NULL, "atmel_sha", &aestdessha_clk),
        CLKDEV_CON_DEV_ID(NULL, "atmel_tdes", &aestdessha_clk),
        CLKDEV_CON_DEV_ID(NULL, "atmel_aes", &aestdessha_clk),
+       CLKDEV_CON_DEV_ID(NULL, "at91sam9rl-pwm", &pwm_clk),
        /* more usart lookup table for DT entries */
        CLKDEV_CON_DEV_ID("usart", "ffffee00.serial", &mck),
        CLKDEV_CON_DEV_ID("usart", "fff8c000.serial", &usart0_clk),
@@ -331,6 +333,9 @@ static void __init at91sam9g45_register_clocks(void)
        clk_register(&pck0);
        clk_register(&pck1);
 }
+#else
+#define at91sam9g45_register_clocks NULL
+#endif
 
 /* --------------------------------------------------------------------
  *  GPIO
index 391ab6bb536afd34abe6fb6cbbc2a7cc7299b221..21ab782cc8e90340cfbb2967dbe346b2c6ae0bbb 100644 (file)
@@ -1334,9 +1334,7 @@ static void __init at91_add_device_watchdog(void) {}
  *  PWM
  * --------------------------------------------------------------------*/
 
-#if defined(CONFIG_ATMEL_PWM) || defined(CONFIG_ATMEL_PWM_MODULE)
-static u32 pwm_mask;
-
+#if IS_ENABLED(CONFIG_PWM_ATMEL)
 static struct resource pwm_resources[] = {
        [0] = {
                .start  = AT91SAM9G45_BASE_PWMC,
@@ -1351,11 +1349,8 @@ static struct resource pwm_resources[] = {
 };
 
 static struct platform_device at91sam9g45_pwm0_device = {
-       .name   = "atmel_pwm",
+       .name   = "at91sam9rl-pwm",
        .id     = -1,
-       .dev    = {
-               .platform_data          = &pwm_mask,
-       },
        .resource       = pwm_resources,
        .num_resources  = ARRAY_SIZE(pwm_resources),
 };
@@ -1374,8 +1369,6 @@ void __init at91_add_device_pwm(u32 mask)
        if (mask & (1 << AT91_PWM3))
                at91_set_B_periph(AT91_PIN_PD0, 1);     /* enable PWM3 */
 
-       pwm_mask = mask;
-
        platform_device_register(&at91sam9g45_pwm0_device);
 }
 #else
index a79960f57e6abff18647e9951a844ef6fb0ef3db..878d5015daab65973686666d0af41446ebc96caf 100644 (file)
@@ -200,6 +200,7 @@ static struct clk_lookup periph_clocks_lookups[] = {
        CLKDEV_CON_DEV_ID("pclk", "fffc4000.ssc", &ssc1_clk),
        CLKDEV_CON_DEV_ID(NULL, "i2c-at91sam9g20.0", &twi0_clk),
        CLKDEV_CON_DEV_ID(NULL, "i2c-at91sam9g20.1", &twi1_clk),
+       CLKDEV_CON_DEV_ID(NULL, "at91sam9rl-pwm", &pwm_clk),
        CLKDEV_CON_ID("pioA", &pioA_clk),
        CLKDEV_CON_ID("pioB", &pioB_clk),
        CLKDEV_CON_ID("pioC", &pioC_clk),
index 0b1d71a7d9bf5b0650de1fdd6c74f394f87cfdd3..37d1c9ed4562550a1ad2f4c0994f83458b4913b1 100644 (file)
@@ -799,9 +799,7 @@ static void __init at91_add_device_watchdog(void) {}
  *  PWM
  * --------------------------------------------------------------------*/
 
-#if defined(CONFIG_ATMEL_PWM)
-static u32 pwm_mask;
-
+#if IS_ENABLED(CONFIG_PWM_ATMEL)
 static struct resource pwm_resources[] = {
        [0] = {
                .start  = AT91SAM9RL_BASE_PWMC,
@@ -816,11 +814,8 @@ static struct resource pwm_resources[] = {
 };
 
 static struct platform_device at91sam9rl_pwm0_device = {
-       .name   = "atmel_pwm",
+       .name   = "at91sam9rl-pwm",
        .id     = -1,
-       .dev    = {
-               .platform_data          = &pwm_mask,
-       },
        .resource       = pwm_resources,
        .num_resources  = ARRAY_SIZE(pwm_resources),
 };
@@ -839,8 +834,6 @@ void __init at91_add_device_pwm(u32 mask)
        if (mask & (1 << AT91_PWM3))
                at91_set_B_periph(AT91_PIN_PD8, 1);     /* enable PWM3 */
 
-       pwm_mask = mask;
-
        platform_device_register(&at91sam9rl_pwm0_device);
 }
 #else
index cd2726ee5addc96c52fdf6f443aba0c6b425e080..fc446097f410846b7d0c8fe3d347863317d4b696 100644 (file)
@@ -32,6 +32,8 @@
 #include <linux/gpio_keys.h>
 #include <linux/input.h>
 #include <linux/leds.h>
+#include <linux/pwm.h>
+#include <linux/leds_pwm.h>
 
 #include <video/atmel_lcdc.h>
 
@@ -369,21 +371,47 @@ static struct gpio_led ek_leds[] = {
                .name                   = "ds3",
                .gpio                   = AT91_PIN_PB7,
                .default_trigger        = "heartbeat",
+       },
+#if !IS_ENABLED(CONFIG_LEDS_PWM)
+       {
+               .name                   = "ds1",
+               .gpio                   = AT91_PIN_PB8,
+               .active_low             = 1,
+               .default_trigger        = "none",
        }
+#endif
 };
 
 /*
  * PWM Leds
  */
-static struct gpio_led ek_pwm_led[] = {
-       /* For now only DS1 is PWM-driven (by pwm1) */
+static struct pwm_lookup pwm_lookup[] = {
+       PWM_LOOKUP("at91sam9rl-pwm", 1, "leds_pwm", "ds1",
+                  5000, PWM_POLARITY_INVERSED),
+};
+
+#if IS_ENABLED(CONFIG_LEDS_PWM)
+static struct led_pwm pwm_leds[] = {
        {
-               .name                   = "ds1",
-               .gpio                   = 1,    /* is PWM channel number */
-               .active_low             = 1,
-               .default_trigger        = "none",
-       }
+               .name = "ds1",
+               .max_brightness = 255,
+       },
+};
+
+static struct led_pwm_platform_data pwm_data = {
+       .num_leds       = ARRAY_SIZE(pwm_leds),
+       .leds           = pwm_leds,
+};
+
+static struct platform_device leds_pwm = {
+       .name   = "leds_pwm",
+       .id     = -1,
+       .dev    = {
+               .platform_data = &pwm_data,
+       },
 };
+#endif
+
 
 /*
  * CAN
@@ -403,6 +431,12 @@ static struct at91_can_data ek_can_data = {
        .transceiver_switch = sam9263ek_transceiver_switch,
 };
 
+static struct platform_device *devices[] __initdata = {
+#if IS_ENABLED(CONFIG_LEDS_PWM)
+       &leds_pwm,
+#endif
+};
+
 static void __init ek_board_init(void)
 {
        /* Serial */
@@ -437,9 +471,14 @@ static void __init ek_board_init(void)
        at91_add_device_ac97(&ek_ac97_data);
        /* LEDs */
        at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds));
-       at91_pwm_leds(ek_pwm_led, ARRAY_SIZE(ek_pwm_led));
+       pwm_add_table(pwm_lookup, ARRAY_SIZE(pwm_lookup));
+#if IS_ENABLED(CONFIG_LEDS_PWM)
+       at91_add_device_pwm(1 << AT91_PWM1);
+#endif
        /* CAN */
        at91_add_device_can(&ek_can_data);
+       /* Other platform devices */
+       platform_add_devices(devices, ARRAY_SIZE(devices));
 }
 
 MACHINE_START(AT91SAM9263EK, "Atmel AT91SAM9263-EK")
index 1ea61328f30dc19feddf682197f2d853174ee7fc..b227732b0c8343155a35d57e6ca9f8bcb530ed91 100644 (file)
@@ -26,6 +26,8 @@
 #include <linux/leds.h>
 #include <linux/atmel-mci.h>
 #include <linux/delay.h>
+#include <linux/pwm.h>
+#include <linux/leds_pwm.h>
 
 #include <linux/platform_data/at91_adc.h>
 
@@ -416,7 +418,7 @@ static struct gpio_led ek_leds[] = {
                .active_low             = 1,
                .default_trigger        = "nand-disk",
        },
-#if !(defined(CONFIG_LEDS_ATMEL_PWM) || defined(CONFIG_LEDS_ATMEL_PWM_MODULE))
+#if !IS_ENABLED(CONFIG_LEDS_PWM)
        {       /* "right" led, green, userled1, pwm1 */
                .name                   = "d7",
                .gpio                   = AT91_PIN_PD31,
@@ -430,22 +432,41 @@ static struct gpio_led ek_leds[] = {
 /*
  * PWM Leds
  */
-static struct gpio_led ek_pwm_led[] = {
-#if defined(CONFIG_LEDS_ATMEL_PWM) || defined(CONFIG_LEDS_ATMEL_PWM_MODULE)
+static struct pwm_lookup pwm_lookup[] = {
+       PWM_LOOKUP("at91sam9rl-pwm", 1, "leds_pwm", "d7",
+                  5000, PWM_POLARITY_INVERSED),
+};
+
+#if IS_ENABLED(CONFIG_LEDS_PWM)
+static struct led_pwm pwm_leds[] = {
        {       /* "right" led, green, userled1, pwm1 */
-               .name                   = "d7",
-               .gpio                   = 1,    /* is PWM channel number */
-               .active_low             = 1,
-               .default_trigger        = "none",
+               .name = "d7",
+               .max_brightness = 255,
        },
-#endif
 };
 
+static struct led_pwm_platform_data pwm_data = {
+       .num_leds       = ARRAY_SIZE(pwm_leds),
+       .leds           = pwm_leds,
+};
+
+static struct platform_device leds_pwm = {
+       .name   = "leds_pwm",
+       .id     = -1,
+       .dev    = {
+               .platform_data = &pwm_data,
+       },
+};
+#endif
+
 static struct platform_device *devices[] __initdata = {
 #if defined(CONFIG_SOC_CAMERA_OV2640) || \
        defined(CONFIG_SOC_CAMERA_OV2640_MODULE)
        &isi_ov2640,
 #endif
+#if IS_ENABLED(CONFIG_LEDS_PWM)
+       &leds_pwm,
+#endif
 };
 
 static void __init ek_board_init(void)
@@ -486,7 +507,10 @@ static void __init ek_board_init(void)
        at91_add_device_ac97(&ek_ac97_data);
        /* LEDs */
        at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds));
-       at91_pwm_leds(ek_pwm_led, ARRAY_SIZE(ek_pwm_led));
+       pwm_add_table(pwm_lookup, ARRAY_SIZE(pwm_lookup));
+#if IS_ENABLED(CONFIG_LEDS_PWM)
+       at91_add_device_pwm(1 << AT91_PWM1);
+#endif
        /* Other platform devices */
        platform_add_devices(devices, ARRAY_SIZE(devices));
 }
index 4e773b55bc2d4625fb41641a77895522d6a38d9b..836e9a537e0c38c92fdad017a28c94be0f4cb73e 100644 (file)
@@ -123,6 +123,5 @@ extern void __init at91_add_device_can(struct at91_can_data *data);
 
  /* LEDs */
 extern void __init at91_gpio_leds(struct gpio_led *leds, int nr);
-extern void __init at91_pwm_leds(struct gpio_led *leds, int nr);
 
 #endif
index 77c4d8fd03fd56c0ee04ad1b64212f56f83fe015..eb22e3357e879ec9d7ab80bd4faedd5420083414 100644 (file)
@@ -54,40 +54,3 @@ void __init at91_gpio_leds(struct gpio_led *leds, int nr)
 void __init at91_gpio_leds(struct gpio_led *leds, int nr) {}
 #endif
 
-
-/* ------------------------------------------------------------------------- */
-
-#if defined (CONFIG_LEDS_ATMEL_PWM)
-
-/*
- * PWM Leds
- */
-
-static struct gpio_led_platform_data pwm_led_data;
-
-static struct platform_device at91_pwm_leds_device = {
-       .name                   = "leds-atmel-pwm",
-       .id                     = -1,
-       .dev.platform_data      = &pwm_led_data,
-};
-
-void __init at91_pwm_leds(struct gpio_led *leds, int nr)
-{
-       int i;
-       u32 pwm_mask = 0;
-
-       if (!nr)
-               return;
-
-       for (i = 0; i < nr; i++)
-               pwm_mask |= (1 << leds[i].gpio);
-
-       pwm_led_data.leds = leds;
-       pwm_led_data.num_leds = nr;
-
-       at91_add_device_pwm(pwm_mask);
-       platform_device_register(&at91_pwm_leds_device);
-}
-#else
-void __init at91_pwm_leds(struct gpio_led *leds, int nr){}
-#endif
index 41c839167e87ef0f305aaeee50dae511873cb430..fc938005ad3997d8d0e9ab28e03f4d5b01772303 100644 (file)
@@ -9,7 +9,6 @@ config ARCH_BCM_MOBILE
        bool "Broadcom Mobile SoC Support" if ARCH_MULTI_V7
        select ARCH_REQUIRE_GPIOLIB
        select ARM_ERRATA_754322
-       select ARM_ERRATA_764369 if SMP
        select ARM_ERRATA_775420
        select ARM_GIC
        select GPIO_BCM_KONA
@@ -26,16 +25,18 @@ menu "Broadcom Mobile SoC Selection"
 config ARCH_BCM_281XX
        bool "Broadcom BCM281XX SoC family"
        default y
+       select HAVE_SMP
        help
-         Enable support for the the BCM281XX family, which includes
+         Enable support for the BCM281XX family, which includes
          BCM11130, BCM11140, BCM11351, BCM28145 and BCM28155
          variants.
 
 config ARCH_BCM_21664
        bool "Broadcom BCM21664 SoC family"
        default y
+       select HAVE_SMP
        help
-         Enable support for the the BCM21664 family, which includes
+         Enable support for the BCM21664 family, which includes
          BCM21663 and BCM21664 variants.
 
 config ARCH_BCM_MOBILE_L2_CACHE
@@ -49,6 +50,17 @@ config ARCH_BCM_MOBILE_SMC
        bool
        depends on ARCH_BCM_281XX || ARCH_BCM_21664
 
+config ARCH_BCM_MOBILE_SMP
+       bool "Broadcom mobile SoC SMP support"
+       depends on (ARCH_BCM_281XX || ARCH_BCM_21664) && SMP
+       default y
+       select HAVE_ARM_SCU
+       select ARM_ERRATA_764369
+       help
+         SMP support for the BCM281XX and BCM21664 SoC families.
+         Provided as an option so SMP support for SoCs of this type
+         can be disabled for an SMP-enabled kernel.
+
 endmenu
 
 endif
@@ -87,4 +99,20 @@ config ARCH_BCM_5301X
          different SoC or with the older BCM47XX and BCM53XX based
          network SoC using a MIPS CPU, they are supported by arch/mips/bcm47xx
 
+config ARCH_BRCMSTB
+       bool "Broadcom BCM7XXX based boards" if ARCH_MULTI_V7
+       depends on MMU
+       select ARM_GIC
+       select MIGHT_HAVE_PCI
+       select HAVE_SMP
+       select HAVE_ARM_ARCH_TIMER
+       select BRCMSTB_GISB_ARB
+       select BRCMSTB_L2_IRQ
+       help
+         Say Y if you intend to run the kernel on a Broadcom ARM-based STB
+         chipset.
+
+         This enables support for Broadcom ARM-based set-top box chipsets,
+         including the 7445 family of chips.
+
 endif
index 7312921149755ccca32e27a35ade8aba822ceb4a..67c492aabf4d5ebd3769ff01e304e9371acafafc 100644 (file)
@@ -16,6 +16,9 @@ obj-$(CONFIG_ARCH_BCM_281XX)  += board_bcm281xx.o
 # BCM21664
 obj-$(CONFIG_ARCH_BCM_21664)   += board_bcm21664.o
 
+# BCM281XX and BCM21664 SMP support
+obj-$(CONFIG_ARCH_BCM_MOBILE_SMP) += kona_smp.o
+
 # BCM281XX and BCM21664 L2 cache control
 obj-$(CONFIG_ARCH_BCM_MOBILE_L2_CACHE) += kona_l2_cache.o
 
@@ -30,3 +33,8 @@ obj-$(CONFIG_ARCH_BCM2835)    += board_bcm2835.o
 
 # BCM5301X
 obj-$(CONFIG_ARCH_BCM_5301X)   += bcm_5301x.o
+
+ifeq ($(CONFIG_ARCH_BRCMSTB),y)
+obj-y                          += brcmstb.o
+obj-$(CONFIG_SMP)              += headsmp-brcmstb.o platsmp-brcmstb.o
+endif
diff --git a/arch/arm/mach-bcm/brcmstb.c b/arch/arm/mach-bcm/brcmstb.c
new file mode 100644 (file)
index 0000000..60a5afa
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2013-2014 Broadcom Corporation
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation version 2.
+ *
+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
+ * kind, whether express or implied; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/init.h>
+#include <linux/of_platform.h>
+
+#include <asm/mach-types.h>
+#include <asm/mach/arch.h>
+
+static const char *brcmstb_match[] __initconst = {
+       "brcm,bcm7445",
+       "brcm,brcmstb",
+       NULL
+};
+
+DT_MACHINE_START(BRCMSTB, "Broadcom STB (Flattened Device Tree)")
+       .dt_compat      = brcmstb_match,
+MACHINE_END
diff --git a/arch/arm/mach-bcm/brcmstb.h b/arch/arm/mach-bcm/brcmstb.h
new file mode 100644 (file)
index 0000000..ec0c3d1
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2013-2014 Broadcom Corporation
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation version 2.
+ *
+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
+ * kind, whether express or implied; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef __BRCMSTB_H__
+#define __BRCMSTB_H__
+
+void brcmstb_secondary_startup(void);
+
+#endif /* __BRCMSTB_H__ */
diff --git a/arch/arm/mach-bcm/headsmp-brcmstb.S b/arch/arm/mach-bcm/headsmp-brcmstb.S
new file mode 100644 (file)
index 0000000..199c1ea
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * SMP boot code for secondary CPUs
+ * Based on arch/arm/mach-tegra/headsmp.S
+ *
+ * Copyright (C) 2010 NVIDIA, Inc.
+ * Copyright (C) 2013-2014 Broadcom Corporation
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation version 2.
+ *
+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
+ * kind, whether express or implied; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <asm/assembler.h>
+#include <linux/linkage.h>
+#include <linux/init.h>
+
+        .section ".text.head", "ax"
+
+ENTRY(brcmstb_secondary_startup)
+        /*
+         * Ensure CPU is in a sane state by disabling all IRQs and switching
+         * into SVC mode.
+         */
+        setmode        PSR_I_BIT | PSR_F_BIT | SVC_MODE, r0
+
+        bl      v7_invalidate_l1
+        b       secondary_startup
+ENDPROC(brcmstb_secondary_startup)
diff --git a/arch/arm/mach-bcm/kona_smp.c b/arch/arm/mach-bcm/kona_smp.c
new file mode 100644 (file)
index 0000000..66a0465
--- /dev/null
@@ -0,0 +1,202 @@
+/*
+ * Copyright (C) 2014 Broadcom Corporation
+ * Copyright 2014 Linaro Limited
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation version 2.
+ *
+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
+ * kind, whether express or implied; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/init.h>
+#include <linux/errno.h>
+#include <linux/io.h>
+#include <linux/of.h>
+#include <linux/sched.h>
+
+#include <asm/smp.h>
+#include <asm/smp_plat.h>
+#include <asm/smp_scu.h>
+
+/* Size of mapped Cortex A9 SCU address space */
+#define CORTEX_A9_SCU_SIZE     0x58
+
+#define SECONDARY_TIMEOUT_NS   NSEC_PER_MSEC   /* 1 msec (in nanoseconds) */
+#define BOOT_ADDR_CPUID_MASK   0x3
+
+/* Name of device node property defining secondary boot register location */
+#define OF_SECONDARY_BOOT      "secondary-boot-reg"
+
+/* I/O address of register used to coordinate secondary core startup */
+static u32     secondary_boot;
+
+/*
+ * Enable the Cortex A9 Snoop Control Unit
+ *
+ * By the time this is called we already know there are multiple
+ * cores present.  We assume we're running on a Cortex A9 processor,
+ * so any trouble getting the base address register or getting the
+ * SCU base is a problem.
+ *
+ * Return 0 if successful or an error code otherwise.
+ */
+static int __init scu_a9_enable(void)
+{
+       unsigned long config_base;
+       void __iomem *scu_base;
+
+       if (!scu_a9_has_base()) {
+               pr_err("no configuration base address register!\n");
+               return -ENXIO;
+       }
+
+       /* Config base address register value is zero for uniprocessor */
+       config_base = scu_a9_get_base();
+       if (!config_base) {
+               pr_err("hardware reports only one core\n");
+               return -ENOENT;
+       }
+
+       scu_base = ioremap((phys_addr_t)config_base, CORTEX_A9_SCU_SIZE);
+       if (!scu_base) {
+               pr_err("failed to remap config base (%lu/%u) for SCU\n",
+                       config_base, CORTEX_A9_SCU_SIZE);
+               return -ENOMEM;
+       }
+
+       scu_enable(scu_base);
+
+       iounmap(scu_base);      /* That's the last we'll need of this */
+
+       return 0;
+}
+
+static void __init bcm_smp_prepare_cpus(unsigned int max_cpus)
+{
+       static cpumask_t only_cpu_0 = { CPU_BITS_CPU0 };
+       struct device_node *node;
+       int ret;
+
+       BUG_ON(secondary_boot);         /* We're called only once */
+
+       /*
+        * This function is only called via smp_ops->smp_prepare_cpu().
+        * That only happens if a "/cpus" device tree node exists
+        * and has an "enable-method" property that selects the SMP
+        * operations defined herein.
+        */
+       node = of_find_node_by_path("/cpus");
+       BUG_ON(!node);
+
+       /*
+        * Our secondary enable method requires a "secondary-boot-reg"
+        * property to specify a register address used to request the
+        * ROM code boot a secondary code.  If we have any trouble
+        * getting this we fall back to uniprocessor mode.
+        */
+       if (of_property_read_u32(node, OF_SECONDARY_BOOT, &secondary_boot)) {
+               pr_err("%s: missing/invalid " OF_SECONDARY_BOOT " property\n",
+                       node->name);
+               ret = -ENOENT;          /* Arrange to disable SMP */
+               goto out;
+       }
+
+       /*
+        * Enable the SCU on Cortex A9 based SoCs.  If -ENOENT is
+        * returned, the SoC reported a uniprocessor configuration.
+        * We bail on any other error.
+        */
+       ret = scu_a9_enable();
+out:
+       of_node_put(node);
+       if (ret) {
+               /* Update the CPU present map to reflect uniprocessor mode */
+               BUG_ON(ret != -ENOENT);
+               pr_warn("disabling SMP\n");
+               init_cpu_present(&only_cpu_0);
+       }
+}
+
+/*
+ * The ROM code has the secondary cores looping, waiting for an event.
+ * When an event occurs each core examines the bottom two bits of the
+ * secondary boot register.  When a core finds those bits contain its
+ * own core id, it performs initialization, including computing its boot
+ * address by clearing the boot register value's bottom two bits.  The
+ * core signals that it is beginning its execution by writing its boot
+ * address back to the secondary boot register, and finally jumps to
+ * that address.
+ *
+ * So to start a core executing we need to:
+ * - Encode the (hardware) CPU id with the bottom bits of the secondary
+ *   start address.
+ * - Write that value into the secondary boot register.
+ * - Generate an event to wake up the secondary CPU(s).
+ * - Wait for the secondary boot register to be re-written, which
+ *   indicates the secondary core has started.
+ */
+static int bcm_boot_secondary(unsigned int cpu, struct task_struct *idle)
+{
+       void __iomem *boot_reg;
+       phys_addr_t boot_func;
+       u64 start_clock;
+       u32 cpu_id;
+       u32 boot_val;
+       bool timeout = false;
+
+       cpu_id = cpu_logical_map(cpu);
+       if (cpu_id & ~BOOT_ADDR_CPUID_MASK) {
+               pr_err("bad cpu id (%u > %u)\n", cpu_id, BOOT_ADDR_CPUID_MASK);
+               return -EINVAL;
+       }
+
+       if (!secondary_boot) {
+               pr_err("required secondary boot register not specified\n");
+               return -EINVAL;
+       }
+
+       boot_reg = ioremap_nocache((phys_addr_t)secondary_boot, sizeof(u32));
+       if (!boot_reg) {
+               pr_err("unable to map boot register for cpu %u\n", cpu_id);
+               return -ENOSYS;
+       }
+
+       /*
+        * Secondary cores will start in secondary_startup(),
+        * defined in "arch/arm/kernel/head.S"
+        */
+       boot_func = virt_to_phys(secondary_startup);
+       BUG_ON(boot_func & BOOT_ADDR_CPUID_MASK);
+       BUG_ON(boot_func > (phys_addr_t)U32_MAX);
+
+       /* The core to start is encoded in the low bits */
+       boot_val = (u32)boot_func | cpu_id;
+       writel_relaxed(boot_val, boot_reg);
+
+       sev();
+
+       /* The low bits will be cleared once the core has started */
+       start_clock = local_clock();
+       while (!timeout && readl_relaxed(boot_reg) == boot_val)
+               timeout = local_clock() - start_clock > SECONDARY_TIMEOUT_NS;
+
+       iounmap(boot_reg);
+
+       if (!timeout)
+               return 0;
+
+       pr_err("timeout waiting for cpu %u to start\n", cpu_id);
+
+       return -ENOSYS;
+}
+
+static struct smp_operations bcm_smp_ops __initdata = {
+       .smp_prepare_cpus       = bcm_smp_prepare_cpus,
+       .smp_boot_secondary     = bcm_boot_secondary,
+};
+CPU_METHOD_OF_DECLARE(bcm_smp_bcm281xx, "brcm,bcm11351-cpu-method",
+                       &bcm_smp_ops);
diff --git a/arch/arm/mach-bcm/platsmp-brcmstb.c b/arch/arm/mach-bcm/platsmp-brcmstb.c
new file mode 100644 (file)
index 0000000..af780e9
--- /dev/null
@@ -0,0 +1,363 @@
+/*
+ * Broadcom STB CPU SMP and hotplug support for ARM
+ *
+ * Copyright (C) 2013-2014 Broadcom Corporation
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation version 2.
+ *
+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
+ * kind, whether express or implied; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/delay.h>
+#include <linux/errno.h>
+#include <linux/init.h>
+#include <linux/io.h>
+#include <linux/of_address.h>
+#include <linux/of_platform.h>
+#include <linux/printk.h>
+#include <linux/regmap.h>
+#include <linux/smp.h>
+#include <linux/mfd/syscon.h>
+#include <linux/spinlock.h>
+
+#include <asm/cacheflush.h>
+#include <asm/cp15.h>
+#include <asm/mach-types.h>
+#include <asm/smp_plat.h>
+
+#include "brcmstb.h"
+
+enum {
+       ZONE_MAN_CLKEN_MASK             = BIT(0),
+       ZONE_MAN_RESET_CNTL_MASK        = BIT(1),
+       ZONE_MAN_MEM_PWR_MASK           = BIT(4),
+       ZONE_RESERVED_1_MASK            = BIT(5),
+       ZONE_MAN_ISO_CNTL_MASK          = BIT(6),
+       ZONE_MANUAL_CONTROL_MASK        = BIT(7),
+       ZONE_PWR_DN_REQ_MASK            = BIT(9),
+       ZONE_PWR_UP_REQ_MASK            = BIT(10),
+       ZONE_BLK_RST_ASSERT_MASK        = BIT(12),
+       ZONE_PWR_OFF_STATE_MASK         = BIT(25),
+       ZONE_PWR_ON_STATE_MASK          = BIT(26),
+       ZONE_DPG_PWR_STATE_MASK         = BIT(28),
+       ZONE_MEM_PWR_STATE_MASK         = BIT(29),
+       ZONE_RESET_STATE_MASK           = BIT(31),
+       CPU0_PWR_ZONE_CTRL_REG          = 1,
+       CPU_RESET_CONFIG_REG            = 2,
+};
+
+static void __iomem *cpubiuctrl_block;
+static void __iomem *hif_cont_block;
+static u32 cpu0_pwr_zone_ctrl_reg;
+static u32 cpu_rst_cfg_reg;
+static u32 hif_cont_reg;
+
+#ifdef CONFIG_HOTPLUG_CPU
+static DEFINE_PER_CPU_ALIGNED(int, per_cpu_sw_state);
+
+static int per_cpu_sw_state_rd(u32 cpu)
+{
+       sync_cache_r(SHIFT_PERCPU_PTR(&per_cpu_sw_state, per_cpu_offset(cpu)));
+       return per_cpu(per_cpu_sw_state, cpu);
+}
+
+static void per_cpu_sw_state_wr(u32 cpu, int val)
+{
+       per_cpu(per_cpu_sw_state, cpu) = val;
+       dmb();
+       sync_cache_w(SHIFT_PERCPU_PTR(&per_cpu_sw_state, per_cpu_offset(cpu)));
+       dsb_sev();
+}
+#else
+static inline void per_cpu_sw_state_wr(u32 cpu, int val) { }
+#endif
+
+static void __iomem *pwr_ctrl_get_base(u32 cpu)
+{
+       void __iomem *base = cpubiuctrl_block + cpu0_pwr_zone_ctrl_reg;
+       base += (cpu_logical_map(cpu) * 4);
+       return base;
+}
+
+static u32 pwr_ctrl_rd(u32 cpu)
+{
+       void __iomem *base = pwr_ctrl_get_base(cpu);
+       return readl_relaxed(base);
+}
+
+static void pwr_ctrl_wr(u32 cpu, u32 val)
+{
+       void __iomem *base = pwr_ctrl_get_base(cpu);
+       writel(val, base);
+}
+
+static void cpu_rst_cfg_set(u32 cpu, int set)
+{
+       u32 val;
+       val = readl_relaxed(cpubiuctrl_block + cpu_rst_cfg_reg);
+       if (set)
+               val |= BIT(cpu_logical_map(cpu));
+       else
+               val &= ~BIT(cpu_logical_map(cpu));
+       writel_relaxed(val, cpubiuctrl_block + cpu_rst_cfg_reg);
+}
+
+static void cpu_set_boot_addr(u32 cpu, unsigned long boot_addr)
+{
+       const int reg_ofs = cpu_logical_map(cpu) * 8;
+       writel_relaxed(0, hif_cont_block + hif_cont_reg + reg_ofs);
+       writel_relaxed(boot_addr, hif_cont_block + hif_cont_reg + 4 + reg_ofs);
+}
+
+static void brcmstb_cpu_boot(u32 cpu)
+{
+       pr_info("SMP: Booting CPU%d...\n", cpu);
+
+       /*
+        * set the reset vector to point to the secondary_startup
+        * routine
+        */
+       cpu_set_boot_addr(cpu, virt_to_phys(brcmstb_secondary_startup));
+
+       /* unhalt the cpu */
+       cpu_rst_cfg_set(cpu, 0);
+}
+
+static void brcmstb_cpu_power_on(u32 cpu)
+{
+       /*
+        * The secondary cores power was cut, so we must go through
+        * power-on initialization.
+        */
+       u32 tmp;
+
+       pr_info("SMP: Powering up CPU%d...\n", cpu);
+
+       /* Request zone power up */
+       pwr_ctrl_wr(cpu, ZONE_PWR_UP_REQ_MASK);
+
+       /* Wait for the power up FSM to complete */
+       do {
+               tmp = pwr_ctrl_rd(cpu);
+       } while (!(tmp & ZONE_PWR_ON_STATE_MASK));
+
+       per_cpu_sw_state_wr(cpu, 1);
+}
+
+static int brcmstb_cpu_get_power_state(u32 cpu)
+{
+       int tmp = pwr_ctrl_rd(cpu);
+       return (tmp & ZONE_RESET_STATE_MASK) ? 0 : 1;
+}
+
+#ifdef CONFIG_HOTPLUG_CPU
+
+static void brcmstb_cpu_die(u32 cpu)
+{
+       v7_exit_coherency_flush(all);
+
+       /* Prevent all interrupts from reaching this CPU. */
+       arch_local_irq_disable();
+
+       /*
+        * Final full barrier to ensure everything before this instruction has
+        * quiesced.
+        */
+       isb();
+       dsb();
+
+       per_cpu_sw_state_wr(cpu, 0);
+
+       /* Sit and wait to die */
+       wfi();
+
+       /* We should never get here... */
+       panic("Spurious interrupt on CPU %d received!\n", cpu);
+}
+
+static int brcmstb_cpu_kill(u32 cpu)
+{
+       u32 tmp;
+
+       pr_info("SMP: Powering down CPU%d...\n", cpu);
+
+       while (per_cpu_sw_state_rd(cpu))
+               ;
+
+       /* Program zone reset */
+       pwr_ctrl_wr(cpu, ZONE_RESET_STATE_MASK | ZONE_BLK_RST_ASSERT_MASK |
+                             ZONE_PWR_DN_REQ_MASK);
+
+       /* Verify zone reset */
+       tmp = pwr_ctrl_rd(cpu);
+       if (!(tmp & ZONE_RESET_STATE_MASK))
+               pr_err("%s: Zone reset bit for CPU %d not asserted!\n",
+                       __func__, cpu);
+
+       /* Wait for power down */
+       do {
+               tmp = pwr_ctrl_rd(cpu);
+       } while (!(tmp & ZONE_PWR_OFF_STATE_MASK));
+
+       /* Settle-time from Broadcom-internal DVT reference code */
+       udelay(7);
+
+       /* Assert reset on the CPU */
+       cpu_rst_cfg_set(cpu, 1);
+
+       return 1;
+}
+
+#endif /* CONFIG_HOTPLUG_CPU */
+
+static int __init setup_hifcpubiuctrl_regs(struct device_node *np)
+{
+       int rc = 0;
+       char *name;
+       struct device_node *syscon_np = NULL;
+
+       name = "syscon-cpu";
+
+       syscon_np = of_parse_phandle(np, name, 0);
+       if (!syscon_np) {
+               pr_err("can't find phandle %s\n", name);
+               rc = -EINVAL;
+               goto cleanup;
+       }
+
+       cpubiuctrl_block = of_iomap(syscon_np, 0);
+       if (!cpubiuctrl_block) {
+               pr_err("iomap failed for cpubiuctrl_block\n");
+               rc = -EINVAL;
+               goto cleanup;
+       }
+
+       rc = of_property_read_u32_index(np, name, CPU0_PWR_ZONE_CTRL_REG,
+                                       &cpu0_pwr_zone_ctrl_reg);
+       if (rc) {
+               pr_err("failed to read 1st entry from %s property (%d)\n", name,
+                       rc);
+               rc = -EINVAL;
+               goto cleanup;
+       }
+
+       rc = of_property_read_u32_index(np, name, CPU_RESET_CONFIG_REG,
+                                       &cpu_rst_cfg_reg);
+       if (rc) {
+               pr_err("failed to read 2nd entry from %s property (%d)\n", name,
+                       rc);
+               rc = -EINVAL;
+               goto cleanup;
+       }
+
+cleanup:
+       if (syscon_np)
+               of_node_put(syscon_np);
+
+       return rc;
+}
+
+static int __init setup_hifcont_regs(struct device_node *np)
+{
+       int rc = 0;
+       char *name;
+       struct device_node *syscon_np = NULL;
+
+       name = "syscon-cont";
+
+       syscon_np = of_parse_phandle(np, name, 0);
+       if (!syscon_np) {
+               pr_err("can't find phandle %s\n", name);
+               rc = -EINVAL;
+               goto cleanup;
+       }
+
+       hif_cont_block = of_iomap(syscon_np, 0);
+       if (!hif_cont_block) {
+               pr_err("iomap failed for hif_cont_block\n");
+               rc = -EINVAL;
+               goto cleanup;
+       }
+
+       /* offset is at top of hif_cont_block */
+       hif_cont_reg = 0;
+
+cleanup:
+       if (syscon_np)
+               of_node_put(syscon_np);
+
+       return rc;
+}
+
+static void __init brcmstb_cpu_ctrl_setup(unsigned int max_cpus)
+{
+       int rc;
+       struct device_node *np;
+       char *name;
+
+       name = "brcm,brcmstb-smpboot";
+       np = of_find_compatible_node(NULL, NULL, name);
+       if (!np) {
+               pr_err("can't find compatible node %s\n", name);
+               return;
+       }
+
+       rc = setup_hifcpubiuctrl_regs(np);
+       if (rc)
+               return;
+
+       rc = setup_hifcont_regs(np);
+       if (rc)
+               return;
+}
+
+static DEFINE_SPINLOCK(boot_lock);
+
+static void brcmstb_secondary_init(unsigned int cpu)
+{
+       /*
+        * Synchronise with the boot thread.
+        */
+       spin_lock(&boot_lock);
+       spin_unlock(&boot_lock);
+}
+
+static int brcmstb_boot_secondary(unsigned int cpu, struct task_struct *idle)
+{
+       /*
+        * set synchronisation state between this boot processor
+        * and the secondary one
+        */
+       spin_lock(&boot_lock);
+
+       /* Bring up power to the core if necessary */
+       if (brcmstb_cpu_get_power_state(cpu) == 0)
+               brcmstb_cpu_power_on(cpu);
+
+       brcmstb_cpu_boot(cpu);
+
+       /*
+        * now the secondary core is starting up let it run its
+        * calibrations, then wait for it to finish
+        */
+       spin_unlock(&boot_lock);
+
+       return 0;
+}
+
+static struct smp_operations brcmstb_smp_ops __initdata = {
+       .smp_prepare_cpus       = brcmstb_cpu_ctrl_setup,
+       .smp_secondary_init     = brcmstb_secondary_init,
+       .smp_boot_secondary     = brcmstb_boot_secondary,
+#ifdef CONFIG_HOTPLUG_CPU
+       .cpu_kill               = brcmstb_cpu_kill,
+       .cpu_die                = brcmstb_cpu_die,
+#endif
+};
+
+CPU_METHOD_OF_DECLARE(brcmstb_smp, "brcm,brahma-b15", &brcmstb_smp_ops);
index 2631cfc5ab0d5e21cc6c957a52ab7f0f0dfb60a8..24f85be71671080cc9234c7677eefd8c56682c20 100644 (file)
@@ -13,7 +13,9 @@ config MACH_BERLIN_BG2
        bool "Marvell Armada 1500 (BG2)"
        select CACHE_L2X0
        select CPU_PJ4B
+       select HAVE_ARM_SCU if SMP
        select HAVE_ARM_TWD if SMP
+       select HAVE_SMP
        select PINCTRL_BERLIN_BG2
 
 config MACH_BERLIN_BG2CD
@@ -25,6 +27,7 @@ config MACH_BERLIN_BG2CD
 config MACH_BERLIN_BG2Q
        bool "Marvell Armada 1500 Pro (BG2-Q)"
        select CACHE_L2X0
+       select HAVE_ARM_SCU if SMP
        select HAVE_ARM_TWD if SMP
        select PINCTRL_BERLIN_BG2Q
 
index ab69fe956f4929258135dfb08c440e64b2838cf9..c0719ecd189044a70d3d7585e05fcd6674c26ca9 100644 (file)
@@ -1 +1,2 @@
-obj-y += berlin.o
+obj-y                  += berlin.o
+obj-$(CONFIG_SMP)      += headsmp.o platsmp.o
diff --git a/arch/arm/mach-berlin/headsmp.S b/arch/arm/mach-berlin/headsmp.S
new file mode 100644 (file)
index 0000000..4a4c56a
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2014 Marvell Technology Group Ltd.
+ *
+ * Antoine Ténart <antoine.tenart@free-electrons.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/linkage.h>
+#include <linux/init.h>
+#include <asm/assembler.h>
+
+ENTRY(berlin_secondary_startup)
+ ARM_BE8(setend be)
+       bl      v7_invalidate_l1
+       b       secondary_startup
+ENDPROC(berlin_secondary_startup)
+
+/*
+ * If the following instruction is set in the reset exception vector, CPUs
+ * will fetch the value of the software reset address vector when being
+ * reset.
+ */
+.global boot_inst
+boot_inst:
+       ldr     pc, [pc, #140]
+
+       .align
diff --git a/arch/arm/mach-berlin/platsmp.c b/arch/arm/mach-berlin/platsmp.c
new file mode 100644 (file)
index 0000000..702e798
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2014 Marvell Technology Group Ltd.
+ *
+ * Antoine Ténart <antoine.tenart@free-electrons.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/io.h>
+#include <linux/delay.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+
+#include <asm/cacheflush.h>
+#include <asm/smp_plat.h>
+#include <asm/smp_scu.h>
+
+#define CPU_RESET              0x00
+
+#define RESET_VECT             0x00
+#define SW_RESET_ADDR          0x94
+
+extern void berlin_secondary_startup(void);
+extern u32 boot_inst;
+
+static void __iomem *cpu_ctrl;
+
+static inline void berlin_perform_reset_cpu(unsigned int cpu)
+{
+       u32 val;
+
+       val = readl(cpu_ctrl + CPU_RESET);
+       val |= BIT(cpu_logical_map(cpu));
+       writel(val, cpu_ctrl + CPU_RESET);
+}
+
+static int berlin_boot_secondary(unsigned int cpu, struct task_struct *idle)
+{
+       if (!cpu_ctrl)
+               return -EFAULT;
+
+       /*
+        * Reset the CPU, making it to execute the instruction in the reset
+        * exception vector.
+        */
+       berlin_perform_reset_cpu(cpu);
+
+       return 0;
+}
+
+static void __init berlin_smp_prepare_cpus(unsigned int max_cpus)
+{
+       struct device_node *np;
+       void __iomem *scu_base;
+       void __iomem *vectors_base;
+
+       np = of_find_compatible_node(NULL, NULL, "arm,cortex-a9-scu");
+       scu_base = of_iomap(np, 0);
+       of_node_put(np);
+       if (!scu_base)
+               return;
+
+       np = of_find_compatible_node(NULL, NULL, "marvell,berlin-cpu-ctrl");
+       cpu_ctrl = of_iomap(np, 0);
+       of_node_put(np);
+       if (!cpu_ctrl)
+               goto unmap_scu;
+
+       vectors_base = ioremap(CONFIG_VECTORS_BASE, SZ_32K);
+       if (!vectors_base)
+               goto unmap_scu;
+
+       scu_enable(scu_base);
+       flush_cache_all();
+
+       /*
+        * Write the first instruction the CPU will execute after being reset
+        * in the reset exception vector.
+        */
+       writel(boot_inst, vectors_base + RESET_VECT);
+
+       /*
+        * Write the secondary startup address into the SW reset address
+        * vector. This is used by boot_inst.
+        */
+       writel(virt_to_phys(berlin_secondary_startup), vectors_base + SW_RESET_ADDR);
+
+       iounmap(vectors_base);
+unmap_scu:
+       iounmap(scu_base);
+}
+
+static struct smp_operations berlin_smp_ops __initdata = {
+       .smp_prepare_cpus       = berlin_smp_prepare_cpus,
+       .smp_boot_secondary     = berlin_boot_secondary,
+};
+CPU_METHOD_OF_DECLARE(berlin_smp, "marvell,berlin-smp", &berlin_smp_ops);
index d62ca16d53942e9a69db041261d79e4be3217e6f..45abf6bd5f689f2d98b6f9f0a5fb8aafa5c763aa 100644 (file)
@@ -266,7 +266,6 @@ MACHINE_START(AUTCPU12, "autronix autcpu12")
        /* Maintainer: Thomas Gleixner */
        .atag_offset    = 0x20000,
        .map_io         = clps711x_map_io,
-       .init_early     = clps711x_init_early,
        .init_irq       = clps711x_init_irq,
        .init_time      = clps711x_timer_init,
        .init_machine   = autcpu12_init,
index e261a47f2aff276ac60cc8d6dd3daa627fbb2d45..1ec378c334e5ccdb3e37d1b2230e38227e17e5f0 100644 (file)
@@ -140,7 +140,6 @@ MACHINE_START(CDB89712, "Cirrus-CDB89712")
        /* Maintainer: Ray Lehtiniemi */
        .atag_offset    = 0x100,
        .map_io         = clps711x_map_io,
-       .init_early     = clps711x_init_early,
        .init_irq       = clps711x_init_irq,
        .init_time      = clps711x_timer_init,
        .init_machine   = cdb89712_init,
index 94a7add88a3f10a8a83bfc63f367194c3a0fce7d..f9ca22b646bf0bc45db39a3883e6a69f5ddca16d 100644 (file)
@@ -25,6 +25,7 @@
 #include <asm/mach/arch.h>
 
 #include "common.h"
+#include "devices.h"
 
 static void __init
 fixup_clep7312(struct tag *tags, char **cmdline)
@@ -37,8 +38,8 @@ MACHINE_START(CLEP7212, "Cirrus Logic 7212/7312")
        .atag_offset    = 0x0100,
        .fixup          = fixup_clep7312,
        .map_io         = clps711x_map_io,
-       .init_early     = clps711x_init_early,
        .init_irq       = clps711x_init_irq,
        .init_time      = clps711x_timer_init,
+       .init_machine   = clps711x_devices_init,
        .restart        = clps711x_restart,
 MACHINE_END
index 6144fb5cdc3643ece7fb50283bbb3175a53cd6f2..fdf54d40909a9ec371558db2c5b0b943b9531d9a 100644 (file)
@@ -148,11 +148,6 @@ fixup_edb7211(struct tag *tags, char **cmdline)
        memblock_add(0xc1000000, SZ_8M);
 }
 
-static void __init edb7211_init(void)
-{
-       clps711x_devices_init();
-}
-
 static void __init edb7211_init_late(void)
 {
        gpio_request_array(edb7211_gpios, ARRAY_SIZE(edb7211_gpios));
@@ -178,10 +173,9 @@ MACHINE_START(EDB7211, "CL-EDB7211 (EP7211 eval board)")
        .fixup          = fixup_edb7211,
        .reserve        = edb7211_reserve,
        .map_io         = clps711x_map_io,
-       .init_early     = clps711x_init_early,
        .init_irq       = clps711x_init_irq,
        .init_time      = clps711x_timer_init,
-       .init_machine   = edb7211_init,
+       .init_machine   = clps711x_devices_init,
        .init_late      = edb7211_init_late,
        .restart        = clps711x_restart,
 MACHINE_END
index 96bcc76c443791b2bd13a503f7bc35fa44b13709..e68dd629bda2aefa855e719a46c2211601f76216 100644 (file)
@@ -365,7 +365,6 @@ MACHINE_START(P720T, "ARM-Prospector720T")
        .atag_offset    = 0x100,
        .fixup          = fixup_p720t,
        .map_io         = clps711x_map_io,
-       .init_early     = clps711x_init_early,
        .init_irq       = clps711x_init_irq,
        .init_time      = clps711x_timer_init,
        .init_machine   = p720t_init,
index aee81fa46ccfc4454e5ed9d1082a853965100c97..2a6323b157824410fa6f6d165d7f81724c999f90 100644 (file)
@@ -193,15 +193,3 @@ void clps711x_restart(enum reboot_mode mode, const char *cmd)
 {
        soft_restart(0);
 }
-
-static void clps711x_idle(void)
-{
-       clps_writel(1, HALT);
-       asm("mov r0, r0");
-       asm("mov r0, r0");
-}
-
-void __init clps711x_init_early(void)
-{
-       arm_pm_idle = clps711x_idle;
-}
index 7489139d5d632f312e5ef13c41b357e761d70706..f8818996389840c3ae952b9b2743e83cd109f8f0 100644 (file)
@@ -13,7 +13,6 @@ extern void clps711x_map_io(void);
 extern void clps711x_init_irq(void);
 extern void clps711x_timer_init(void);
 extern void clps711x_restart(enum reboot_mode mode, const char *cmd);
-extern void clps711x_init_early(void);
 
 /* drivers/irqchip/irq-clps711x.c */
 void clps711x_intc_init(phys_addr_t, resource_size_t);
index 2001488a5ef24b4831889946309bcae16d684166..0c689d3a6710a28de506957727d95dde71a41c04 100644 (file)
 
 #include <mach/hardware.h>
 
+static const struct resource clps711x_cpuidle_res __initconst =
+       DEFINE_RES_MEM(CLPS711X_PHYS_BASE + HALT, SZ_128);
+
+static void __init clps711x_add_cpuidle(void)
+{
+       platform_device_register_simple("clps711x-cpuidle", PLATFORM_DEVID_NONE,
+                                       &clps711x_cpuidle_res, 1);
+}
+
 static const phys_addr_t clps711x_gpios[][2] __initconst = {
        { PADR, PADDR },
        { PBDR, PBDDR },
@@ -83,6 +92,7 @@ static void __init clps711x_add_uart(void)
 
 void __init clps711x_devices_init(void)
 {
+       clps711x_add_cpuidle();
        clps711x_add_gpio();
        clps711x_add_syscon();
        clps711x_add_uart();
diff --git a/arch/arm/mach-clps711x/include/mach/debug-macro.S b/arch/arm/mach-clps711x/include/mach/debug-macro.S
deleted file mode 100644 (file)
index cb3684f..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/* arch/arm/mach-clps711x/include/mach/debug-macro.S
- *
- * Debugging macro include header
- *
- *  Copyright (C) 1994-1999 Russell King
- *  Moved from linux/arch/arm/kernel/debug.S by Ben Dooks
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
-*/
-
-#include <mach/hardware.h>
-
-               .macro  addruart, rp, rv, tmp
-#ifndef CONFIG_DEBUG_CLPS711X_UART2
-               mov     \rp, #0x0000    @ UART1
-#else
-               mov     \rp, #0x1000    @ UART2
-#endif
-               orr     \rv, \rp, #CLPS711X_VIRT_BASE
-               orr     \rp, \rp, #CLPS711X_PHYS_BASE
-               .endm
-
-               .macro  senduart,rd,rx
-               str     \rd, [\rx, #0x0480]     @ UARTDR
-               .endm
-
-               .macro  waituart,rd,rx
-               .endm
-
-               .macro  busyuart,rd,rx
-1001:          ldr     \rd, [\rx, #0x0140]     @ SYSFLGx
-               tst     \rd, #1 << 11           @ UBUSYx
-               bne     1001b
-               .endm
-
index 5d6afda1c0e8251ccfca3a905b5886185c25da88..833129c9f798516af1d123711e648b64632760e6 100644 (file)
 
 #include <mach/clps711x.h>
 
-#define IO_ADDRESS(x)          (0xdc000000 + (((x) & 0x03ffffff) | \
-                               (((x) >> 2) & 0x3c000000)))
-
-#define CLPS711X_VIRT_BASE     IOMEM(IO_ADDRESS(CLPS711X_PHYS_BASE))
+#define CLPS711X_VIRT_BASE     IOMEM(0xfeff0000)
 
 #ifndef __ASSEMBLY__
 #define clps_readb(off)                readb(CLPS711X_VIRT_BASE + (off))
index 1ee91763fa7c5b1dd154bc932231cc6f36527b83..47b904b3b9732ecdfd728ddb763c9850fed6744e 100644 (file)
@@ -111,25 +111,14 @@ IS_SAMSUNG_CPU(exynos5800, EXYNOS5800_SOC_ID, EXYNOS5_SOC_MASK)
 #define soc_is_exynos5() (soc_is_exynos5250() || soc_is_exynos5410() || \
                          soc_is_exynos5420() || soc_is_exynos5800())
 
-void mct_init(void __iomem *base, int irq_g0, int irq_l0, int irq_l1);
-
-struct map_desc;
 extern void __iomem *sysram_ns_base_addr;
 extern void __iomem *sysram_base_addr;
-void exynos_init_io(void);
-void exynos_restart(enum reboot_mode mode, const char *cmd);
+extern void __iomem *pmu_base_addr;
 void exynos_sysram_init(void);
-void exynos_cpuidle_init(void);
-void exynos_cpufreq_init(void);
-void exynos_init_late(void);
 
 void exynos_firmware_init(void);
 
-#ifdef CONFIG_PINCTRL_EXYNOS
 extern u32 exynos_get_eint_wake_mask(void);
-#else
-static inline u32 exynos_get_eint_wake_mask(void) { return 0xffffffff; }
-#endif
 
 #ifdef CONFIG_PM_SLEEP
 extern void __init exynos_pm_init(void);
@@ -145,7 +134,7 @@ extern void exynos_cpu_die(unsigned int cpu);
 
 /* PMU(Power Management Unit) support */
 
-#define PMU_TABLE_END  NULL
+#define PMU_TABLE_END  (-1U)
 
 enum sys_powerdown {
        SYS_AFTR,
@@ -155,7 +144,7 @@ enum sys_powerdown {
 };
 
 struct exynos_pmu_conf {
-       void __iomem *reg;
+       unsigned int offset;
        unsigned int val[NUM_SYS_POWERDOWN];
 };
 
@@ -171,4 +160,14 @@ extern void exynos_enter_aftr(void);
 extern void s5p_init_cpu(void __iomem *cpuid_addr);
 extern unsigned int samsung_rev(void);
 
+static inline void pmu_raw_writel(u32 val, u32 offset)
+{
+       __raw_writel(val, pmu_base_addr + offset);
+}
+
+static inline u32 pmu_raw_readl(u32 offset)
+{
+       return __raw_readl(pmu_base_addr + offset);
+}
+
 #endif /* __ARCH_ARM_MACH_EXYNOS_COMMON_H */
index 66c9b9614f3cce2d9bcd5f75ff344a67f81caa8e..6a24e111d6e1819f8b259adc4d1a41306a627651 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/of_platform.h>
 #include <linux/platform_device.h>
 #include <linux/pm_domain.h>
+#include <linux/irqchip.h>
 
 #include <asm/cacheflush.h>
 #include <asm/hardware/cache-l2x0.h>
@@ -29,6 +30,9 @@
 #include "common.h"
 #include "mfc.h"
 #include "regs-pmu.h"
+#include "regs-sys.h"
+
+void __iomem *pmu_base_addr;
 
 static struct map_desc exynos4_iodesc[] __initdata = {
        {
@@ -56,11 +60,6 @@ static struct map_desc exynos4_iodesc[] __initdata = {
                .pfn            = __phys_to_pfn(EXYNOS4_PA_SYSTIMER),
                .length         = SZ_4K,
                .type           = MT_DEVICE,
-       }, {
-               .virtual        = (unsigned long)S5P_VA_PMU,
-               .pfn            = __phys_to_pfn(EXYNOS4_PA_PMU),
-               .length         = SZ_64K,
-               .type           = MT_DEVICE,
        }, {
                .virtual        = (unsigned long)S5P_VA_COMBINER_BASE,
                .pfn            = __phys_to_pfn(EXYNOS4_PA_COMBINER),
@@ -135,19 +134,14 @@ static struct map_desc exynos5_iodesc[] __initdata = {
                .pfn            = __phys_to_pfn(EXYNOS5_PA_CMU),
                .length         = 144 * SZ_1K,
                .type           = MT_DEVICE,
-       }, {
-               .virtual        = (unsigned long)S5P_VA_PMU,
-               .pfn            = __phys_to_pfn(EXYNOS5_PA_PMU),
-               .length         = SZ_64K,
-               .type           = MT_DEVICE,
        },
 };
 
-void exynos_restart(enum reboot_mode mode, const char *cmd)
+static void exynos_restart(enum reboot_mode mode, const char *cmd)
 {
        struct device_node *np;
        u32 val = 0x1;
-       void __iomem *addr = EXYNOS_SWRESET;
+       void __iomem *addr = pmu_base_addr + EXYNOS_SWRESET;
 
        if (of_machine_is_compatible("samsung,exynos5440")) {
                u32 status;
@@ -171,17 +165,6 @@ static struct platform_device exynos_cpuidle = {
        .id                = -1,
 };
 
-void __init exynos_cpuidle_init(void)
-{
-       if (soc_is_exynos4210() || soc_is_exynos5250())
-               platform_device_register(&exynos_cpuidle);
-}
-
-void __init exynos_cpufreq_init(void)
-{
-       platform_device_register_simple("exynos-cpufreq", -1, NULL, 0);
-}
-
 void __iomem *sysram_base_addr;
 void __iomem *sysram_ns_base_addr;
 
@@ -204,7 +187,7 @@ void __init exynos_sysram_init(void)
        }
 }
 
-void __init exynos_init_late(void)
+static void __init exynos_init_late(void)
 {
        if (of_machine_is_compatible("samsung,exynos5440"))
                /* to be supported later */
@@ -251,7 +234,7 @@ static void __init exynos_map_io(void)
                iotable_init(exynos5_iodesc, ARRAY_SIZE(exynos5_iodesc));
 }
 
-void __init exynos_init_io(void)
+static void __init exynos_init_io(void)
 {
        debug_ll_io_init();
 
@@ -263,6 +246,41 @@ void __init exynos_init_io(void)
        exynos_map_io();
 }
 
+static const struct of_device_id exynos_dt_pmu_match[] = {
+       { .compatible = "samsung,exynos3250-pmu" },
+       { .compatible = "samsung,exynos4210-pmu" },
+       { .compatible = "samsung,exynos4212-pmu" },
+       { .compatible = "samsung,exynos4412-pmu" },
+       { .compatible = "samsung,exynos5250-pmu" },
+       { .compatible = "samsung,exynos5260-pmu" },
+       { .compatible = "samsung,exynos5410-pmu" },
+       { .compatible = "samsung,exynos5420-pmu" },
+       { /*sentinel*/ },
+};
+
+static void exynos_map_pmu(void)
+{
+       struct device_node *np;
+
+       np = of_find_matching_node(NULL, exynos_dt_pmu_match);
+       if (np)
+               pmu_base_addr = of_iomap(np, 0);
+
+       if (!pmu_base_addr)
+               panic("failed to find exynos pmu register\n");
+}
+
+static void __init exynos_init_irq(void)
+{
+       irqchip_init();
+       /*
+        * Since platsmp.c needs pmu base address by the time
+        * DT is not unflatten so we can't use DT APIs before
+        * init_irq
+        */
+       exynos_map_pmu();
+}
+
 static void __init exynos_dt_machine_init(void)
 {
        struct device_node *i2c_np;
@@ -298,8 +316,11 @@ static void __init exynos_dt_machine_init(void)
        if (!IS_ENABLED(CONFIG_SMP))
                exynos_sysram_init();
 
-       exynos_cpuidle_init();
-       exynos_cpufreq_init();
+       if (of_machine_is_compatible("samsung,exynos4210") ||
+                       of_machine_is_compatible("samsung,exynos5250"))
+               platform_device_register(&exynos_cpuidle);
+
+       platform_device_register_simple("exynos-cpufreq", -1, NULL, 0);
 
        of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
 }
@@ -352,6 +373,7 @@ DT_MACHINE_START(EXYNOS_DT, "SAMSUNG EXYNOS (Flattened Device Tree)")
        .smp            = smp_ops(exynos_smp_ops),
        .map_io         = exynos_init_io,
        .init_early     = exynos_firmware_init,
+       .init_irq       = exynos_init_irq,
        .init_machine   = exynos_dt_machine_init,
        .init_late      = exynos_init_late,
        .dt_compat      = exynos_dt_compat,
index cdd9d91e99330487926b3518343bc9e6906753bf..b54f9701e421e2ea9695fc9bcb5f44920cac66b2 100644 (file)
@@ -1,5 +1,4 @@
 /*
- *  linux/arch/arm/mach-exynos4/headsmp.S
  *
  *  Cloned from linux/arch/arm/mach-realview/headsmp.S
  *
index 920a4baa53cd7f4eb290e75d1f0e5c62e4ca8cdd..4d86961a7957b497a29e5ab324aa39d93cc82721 100644 (file)
@@ -1,5 +1,4 @@
-/* linux arch/arm/mach-exynos4/hotplug.c
- *
+/*
  *  Cloned from linux/arch/arm/mach-realview/hotplug.c
  *
  *  Copyright (C) 2002 ARM Ltd.
index 548269a606340aad4bd275684b4b9d98fc5e7f68..f0b7e92bad6cf665bb42c292fbeed797527736ee 100644 (file)
@@ -1,5 +1,4 @@
-/* linux/arch/arm/mach-exynos/include/mach/map.h
- *
+/*
  * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
  *             http://www.samsung.com/
  *
@@ -28,9 +27,6 @@
 #define EXYNOS4_PA_SYSCON              0x10010000
 #define EXYNOS5_PA_SYSCON              0x10050100
 
-#define EXYNOS4_PA_PMU                 0x10020000
-#define EXYNOS5_PA_PMU                 0x10040000
-
 #define EXYNOS4_PA_CMU                 0x10030000
 #define EXYNOS5_PA_CMU                 0x10010000
 
index 2a4cdb7cb326a400060fd9c959042145dedb17c2..e19df1f18c0de129f50177c85833ae67d4aebf83 100644 (file)
@@ -1,5 +1,4 @@
-/* linux/arch/arm/mach-exynos4/include/mach/memory.h
- *
+/*
  * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
  *             http://www.samsung.com
  *
index a96b78f93f2b8e360dd48bd2b66de2b35dc013e0..b2f8b60cf0e9035c0b8eabb4ef6fae098c8bcbf7 100644 (file)
 #define EXYNOS5420_CPUS_PER_CLUSTER    4
 #define EXYNOS5420_NR_CLUSTERS         2
 
+#define EXYNOS5420_ENABLE_AUTOMATIC_CORE_DOWN  BIT(9)
+#define EXYNOS5420_USE_ARM_CORE_DOWN_STATE     BIT(29)
+#define EXYNOS5420_USE_L2_COMMON_UP_STATE      BIT(30)
+
 /*
  * The common v7_exit_coherency_flush API could not be used because of the
  * Erratum 799270 workaround. This macro is the same as the common one (in
@@ -51,7 +55,7 @@
        "dsb\n\t" \
        "ldmfd  sp!, {fp, ip}" \
        : \
-       : "Ir" (S5P_INFORM0) \
+       : "Ir" (pmu_base_addr + S5P_INFORM0) \
        : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", \
          "r9", "r10", "lr", "memory")
 
@@ -73,36 +77,9 @@ cpu_use_count[EXYNOS5420_CPUS_PER_CLUSTER][EXYNOS5420_NR_CLUSTERS];
 
 #define exynos_cluster_unused(cluster) !exynos_cluster_usecnt(cluster)
 
-static int exynos_cluster_power_control(unsigned int cluster, int enable)
-{
-       unsigned int tries = 100;
-       unsigned int val;
-
-       if (enable) {
-               exynos_cluster_power_up(cluster);
-               val = S5P_CORE_LOCAL_PWR_EN;
-       } else {
-               exynos_cluster_power_down(cluster);
-               val = 0;
-       }
-
-       /* Wait until cluster power control is applied */
-       while (tries--) {
-               if (exynos_cluster_power_state(cluster) == val)
-                       return 0;
-
-               cpu_relax();
-       }
-       pr_debug("timed out waiting for cluster %u to power %s\n", cluster,
-               enable ? "on" : "off");
-
-       return -ETIMEDOUT;
-}
-
 static int exynos_power_up(unsigned int cpu, unsigned int cluster)
 {
        unsigned int cpunr = cpu + (cluster * EXYNOS5420_CPUS_PER_CLUSTER);
-       int err = 0;
 
        pr_debug("%s: cpu %u cluster %u\n", __func__, cpu, cluster);
        if (cpu >= EXYNOS5420_CPUS_PER_CLUSTER ||
@@ -126,12 +103,9 @@ static int exynos_power_up(unsigned int cpu, unsigned int cluster)
                 * cores.
                 */
                if (was_cluster_down)
-                       err = exynos_cluster_power_control(cluster, 1);
+                       exynos_cluster_power_up(cluster);
 
-               if (!err)
-                       exynos_cpu_power_up(cpunr);
-               else
-                       exynos_cluster_power_control(cluster, 0);
+               exynos_cpu_power_up(cpunr);
        } else if (cpu_use_count[cpu][cluster] != 2) {
                /*
                 * The only possible values are:
@@ -147,7 +121,7 @@ static int exynos_power_up(unsigned int cpu, unsigned int cluster)
        arch_spin_unlock(&exynos_mcpm_lock);
        local_irq_enable();
 
-       return err;
+       return 0;
 }
 
 /*
@@ -178,9 +152,10 @@ static void exynos_power_down(void)
        if (cpu_use_count[cpu][cluster] == 0) {
                exynos_cpu_power_down(cpunr);
 
-               if (exynos_cluster_unused(cluster))
-                       /* TODO: Turn off the cluster here to save power. */
+               if (exynos_cluster_unused(cluster)) {
+                       exynos_cluster_power_down(cluster);
                        last_man = true;
+               }
        } else if (cpu_use_count[cpu][cluster] == 1) {
                /*
                 * A power_up request went ahead of us.
@@ -257,10 +232,46 @@ static int exynos_wait_for_powerdown(unsigned int cpu, unsigned int cluster)
        return -ETIMEDOUT; /* timeout */
 }
 
+static void exynos_powered_up(void)
+{
+       unsigned int mpidr, cpu, cluster;
+
+       mpidr = read_cpuid_mpidr();
+       cpu = MPIDR_AFFINITY_LEVEL(mpidr, 0);
+       cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1);
+
+       arch_spin_lock(&exynos_mcpm_lock);
+       if (cpu_use_count[cpu][cluster] == 0)
+               cpu_use_count[cpu][cluster] = 1;
+       arch_spin_unlock(&exynos_mcpm_lock);
+}
+
+static void exynos_suspend(u64 residency)
+{
+       unsigned int mpidr, cpunr;
+
+       exynos_power_down();
+
+       /*
+        * Execution reaches here only if cpu did not power down.
+        * Hence roll back the changes done in exynos_power_down function.
+        *
+        * CAUTION: "This function requires the stack data to be visible through
+        * power down and can only be executed on processors like A15 and A7
+        * that hit the cache with the C bit clear in the SCTLR register."
+       */
+       mpidr = read_cpuid_mpidr();
+       cpunr = exynos_pmu_cpunr(mpidr);
+
+       exynos_cpu_power_up(cpunr);
+}
+
 static const struct mcpm_platform_ops exynos_power_ops = {
        .power_up               = exynos_power_up,
        .power_down             = exynos_power_down,
        .wait_for_powerdown     = exynos_wait_for_powerdown,
+       .suspend                = exynos_suspend,
+       .powered_up             = exynos_powered_up,
 };
 
 static void __init exynos_mcpm_usage_count_init(void)
@@ -312,6 +323,7 @@ static int __init exynos_mcpm_init(void)
 {
        struct device_node *node;
        void __iomem *ns_sram_base_addr;
+       unsigned int value, i;
        int ret;
 
        node = of_find_matching_node(NULL, exynos_dt_mcpm_match);
@@ -338,7 +350,7 @@ static int __init exynos_mcpm_init(void)
         * To increase the stability of KFC reset we need to program
         * the PMU SPARE3 register
         */
-       __raw_writel(EXYNOS5420_SWRESET_KFC_SEL, S5P_PMU_SPARE3);
+       pmu_raw_writel(EXYNOS5420_SWRESET_KFC_SEL, S5P_PMU_SPARE3);
 
        exynos_mcpm_usage_count_init();
 
@@ -356,6 +368,26 @@ static int __init exynos_mcpm_init(void)
 
        pr_info("Exynos MCPM support installed\n");
 
+       /*
+        * On Exynos5420/5800 for the A15 and A7 clusters:
+        *
+        * EXYNOS5420_ENABLE_AUTOMATIC_CORE_DOWN ensures that all the cores
+        * in a cluster are turned off before turning off the cluster L2.
+        *
+        * EXYNOS5420_USE_ARM_CORE_DOWN_STATE ensures that a cores is powered
+        * off before waking it up.
+        *
+        * EXYNOS5420_USE_L2_COMMON_UP_STATE ensures that cluster L2 will be
+        * turned on before the first man is powered up.
+        */
+       for (i = 0; i < EXYNOS5420_NR_CLUSTERS; i++) {
+               value = pmu_raw_readl(EXYNOS_COMMON_OPTION(i));
+               value |= EXYNOS5420_ENABLE_AUTOMATIC_CORE_DOWN |
+                        EXYNOS5420_USE_ARM_CORE_DOWN_STATE    |
+                        EXYNOS5420_USE_L2_COMMON_UP_STATE;
+               pmu_raw_writel(value, EXYNOS_COMMON_OPTION(i));
+       }
+
        /*
         * U-Boot SPL is hardcoded to jump to the start of ns_sram_base_addr
         * as part of secondary_cpu_start().  Let's redirect it to the
index 70d1e65a51d8f580d3db73eabe9f29cf6ca49e06..a9f1cf759949c3a8bde14405ea47ce996f3e3408 100644 (file)
@@ -1,5 +1,4 @@
-/* linux/arch/arm/mach-exynos4/platsmp.c
- *
+ /*
  * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
  *             http://www.samsung.com
  *
 #include <asm/smp_scu.h>
 #include <asm/firmware.h>
 
+#include <mach/map.h>
+
 #include "common.h"
 #include "regs-pmu.h"
 
 extern void exynos4_secondary_startup(void);
 
+/**
+ * exynos_core_power_down : power down the specified cpu
+ * @cpu : the cpu to power down
+ *
+ * Power down the specified cpu. The sequence must be finished by a
+ * call to cpu_do_idle()
+ *
+ */
+void exynos_cpu_power_down(int cpu)
+{
+       pmu_raw_writel(0, EXYNOS_ARM_CORE_CONFIGURATION(cpu));
+}
+
+/**
+ * exynos_cpu_power_up : power up the specified cpu
+ * @cpu : the cpu to power up
+ *
+ * Power up the specified cpu
+ */
+void exynos_cpu_power_up(int cpu)
+{
+       pmu_raw_writel(S5P_CORE_LOCAL_PWR_EN,
+                       EXYNOS_ARM_CORE_CONFIGURATION(cpu));
+}
+
+/**
+ * exynos_cpu_power_state : returns the power state of the cpu
+ * @cpu : the cpu to retrieve the power state from
+ *
+ */
+int exynos_cpu_power_state(int cpu)
+{
+       return (pmu_raw_readl(EXYNOS_ARM_CORE_STATUS(cpu)) &
+                       S5P_CORE_LOCAL_PWR_EN);
+}
+
+/**
+ * exynos_cluster_power_down : power down the specified cluster
+ * @cluster : the cluster to power down
+ */
+void exynos_cluster_power_down(int cluster)
+{
+       pmu_raw_writel(0, EXYNOS_COMMON_CONFIGURATION(cluster));
+}
+
+/**
+ * exynos_cluster_power_up : power up the specified cluster
+ * @cluster : the cluster to power up
+ */
+void exynos_cluster_power_up(int cluster)
+{
+       pmu_raw_writel(S5P_CORE_LOCAL_PWR_EN,
+                       EXYNOS_COMMON_CONFIGURATION(cluster));
+}
+
+/**
+ * exynos_cluster_power_state : returns the power state of the cluster
+ * @cluster : the cluster to retrieve the power state from
+ *
+ */
+int exynos_cluster_power_state(int cluster)
+{
+       return (pmu_raw_readl(EXYNOS_COMMON_STATUS(cluster)) &
+               S5P_CORE_LOCAL_PWR_EN);
+}
+
 static inline void __iomem *cpu_boot_reg_base(void)
 {
        if (soc_is_exynos4210() && samsung_rev() == EXYNOS4210_REV_1_1)
-               return S5P_INFORM5;
+               return pmu_base_addr + S5P_INFORM5;
        return sysram_base_addr;
 }
 
index 67d383de614f308b2982873a6e23fc1a029c96ec..18646b7e226b2ba9bdf154e6ccee188b6cb7d211 100644 (file)
 #include <asm/suspend.h>
 
 #include <plat/pm-common.h>
-#include <plat/pll.h>
 #include <plat/regs-srom.h>
 
 #include <mach/map.h>
 
 #include "common.h"
 #include "regs-pmu.h"
+#include "regs-sys.h"
 
 /**
  * struct exynos_wkup_irq - Exynos GIC to PMU IRQ mapping
@@ -100,78 +100,16 @@ static int exynos_irq_set_wake(struct irq_data *data, unsigned int state)
        return -ENOENT;
 }
 
-/**
- * exynos_core_power_down : power down the specified cpu
- * @cpu : the cpu to power down
- *
- * Power down the specified cpu. The sequence must be finished by a
- * call to cpu_do_idle()
- *
- */
-void exynos_cpu_power_down(int cpu)
-{
-       __raw_writel(0, EXYNOS_ARM_CORE_CONFIGURATION(cpu));
-}
-
-/**
- * exynos_cpu_power_up : power up the specified cpu
- * @cpu : the cpu to power up
- *
- * Power up the specified cpu
- */
-void exynos_cpu_power_up(int cpu)
-{
-       __raw_writel(S5P_CORE_LOCAL_PWR_EN,
-                    EXYNOS_ARM_CORE_CONFIGURATION(cpu));
-}
-
-/**
- * exynos_cpu_power_state : returns the power state of the cpu
- * @cpu : the cpu to retrieve the power state from
- *
- */
-int exynos_cpu_power_state(int cpu)
-{
-       return (__raw_readl(EXYNOS_ARM_CORE_STATUS(cpu)) &
-                       S5P_CORE_LOCAL_PWR_EN);
-}
-
-/**
- * exynos_cluster_power_down : power down the specified cluster
- * @cluster : the cluster to power down
- */
-void exynos_cluster_power_down(int cluster)
-{
-       __raw_writel(0, EXYNOS_COMMON_CONFIGURATION(cluster));
-}
-
-/**
- * exynos_cluster_power_up : power up the specified cluster
- * @cluster : the cluster to power up
- */
-void exynos_cluster_power_up(int cluster)
-{
-       __raw_writel(S5P_CORE_LOCAL_PWR_EN,
-                    EXYNOS_COMMON_CONFIGURATION(cluster));
-}
-
-/**
- * exynos_cluster_power_state : returns the power state of the cluster
- * @cluster : the cluster to retrieve the power state from
- *
- */
-int exynos_cluster_power_state(int cluster)
-{
-       return (__raw_readl(EXYNOS_COMMON_STATUS(cluster)) &
-                       S5P_CORE_LOCAL_PWR_EN);
-}
-
 #define EXYNOS_BOOT_VECTOR_ADDR        (samsung_rev() == EXYNOS4210_REV_1_1 ? \
-                       S5P_INFORM7 : (samsung_rev() == EXYNOS4210_REV_1_0 ? \
-                       (sysram_base_addr + 0x24) : S5P_INFORM0))
+                       pmu_base_addr + S5P_INFORM7 : \
+                       (samsung_rev() == EXYNOS4210_REV_1_0 ? \
+                       (sysram_base_addr + 0x24) : \
+                       pmu_base_addr + S5P_INFORM0))
 #define EXYNOS_BOOT_VECTOR_FLAG        (samsung_rev() == EXYNOS4210_REV_1_1 ? \
-                       S5P_INFORM6 : (samsung_rev() == EXYNOS4210_REV_1_0 ? \
-                       (sysram_base_addr + 0x20) : S5P_INFORM1))
+                       pmu_base_addr + S5P_INFORM6 : \
+                       (samsung_rev() == EXYNOS4210_REV_1_0 ? \
+                       (sysram_base_addr + 0x20) : \
+                       pmu_base_addr + S5P_INFORM1))
 
 #define S5P_CHECK_AFTR  0xFCBA0D10
 #define S5P_CHECK_SLEEP 0x00000BAD
@@ -179,7 +117,7 @@ int exynos_cluster_power_state(int cluster)
 /* Ext-GIC nIRQ/nFIQ is the only wakeup source in AFTR */
 static void exynos_set_wakeupmask(long mask)
 {
-       __raw_writel(mask, S5P_WAKEUP_MASK);
+       pmu_raw_writel(mask, S5P_WAKEUP_MASK);
 }
 
 static void exynos_cpu_set_boot_vector(long flags)
@@ -256,27 +194,27 @@ static void exynos_pm_prepare(void)
        unsigned int tmp;
 
        /* Set wake-up mask registers */
-       __raw_writel(exynos_get_eint_wake_mask(), S5P_EINT_WAKEUP_MASK);
-       __raw_writel(exynos_irqwake_intmask & ~(1 << 31), S5P_WAKEUP_MASK);
+       pmu_raw_writel(exynos_get_eint_wake_mask(), S5P_EINT_WAKEUP_MASK);
+       pmu_raw_writel(exynos_irqwake_intmask & ~(1 << 31), S5P_WAKEUP_MASK);
 
        s3c_pm_do_save(exynos_core_save, ARRAY_SIZE(exynos_core_save));
 
        if (soc_is_exynos5250()) {
                s3c_pm_do_save(exynos5_sys_save, ARRAY_SIZE(exynos5_sys_save));
                /* Disable USE_RETENTION of JPEG_MEM_OPTION */
-               tmp = __raw_readl(EXYNOS5_JPEG_MEM_OPTION);
+               tmp = pmu_raw_readl(EXYNOS5_JPEG_MEM_OPTION);
                tmp &= ~EXYNOS5_OPTION_USE_RETENTION;
-               __raw_writel(tmp, EXYNOS5_JPEG_MEM_OPTION);
+               pmu_raw_writel(tmp, EXYNOS5_JPEG_MEM_OPTION);
        }
 
        /* Set value of power down register for sleep mode */
 
        exynos_sys_powerdown_conf(SYS_SLEEP);
-       __raw_writel(S5P_CHECK_SLEEP, S5P_INFORM1);
+       pmu_raw_writel(S5P_CHECK_SLEEP, S5P_INFORM1);
 
        /* ensure at least INFORM0 has the resume address */
 
-       __raw_writel(virt_to_phys(exynos_cpu_resume), S5P_INFORM0);
+       pmu_raw_writel(virt_to_phys(exynos_cpu_resume), S5P_INFORM0);
 }
 
 static void exynos_pm_central_suspend(void)
@@ -284,9 +222,9 @@ static void exynos_pm_central_suspend(void)
        unsigned long tmp;
 
        /* Setting Central Sequence Register for power down mode */
-       tmp = __raw_readl(S5P_CENTRAL_SEQ_CONFIGURATION);
+       tmp = pmu_raw_readl(S5P_CENTRAL_SEQ_CONFIGURATION);
        tmp &= ~S5P_CENTRAL_LOWPWR_CFG;
-       __raw_writel(tmp, S5P_CENTRAL_SEQ_CONFIGURATION);
+       pmu_raw_writel(tmp, S5P_CENTRAL_SEQ_CONFIGURATION);
 }
 
 static int exynos_pm_suspend(void)
@@ -298,7 +236,7 @@ static int exynos_pm_suspend(void)
        /* Setting SEQ_OPTION register */
 
        tmp = (S5P_USE_STANDBY_WFI0 | S5P_USE_STANDBY_WFE0);
-       __raw_writel(tmp, S5P_CENTRAL_SEQ_OPTION);
+       pmu_raw_writel(tmp, S5P_CENTRAL_SEQ_OPTION);
 
        if (read_cpuid_part() == ARM_CPU_PART_CORTEX_A9)
                exynos_cpu_save_register();
@@ -316,12 +254,12 @@ static int exynos_pm_central_resume(void)
         * S5P_CENTRAL_LOWPWR_CFG bit will not be set automatically
         * in this situation.
         */
-       tmp = __raw_readl(S5P_CENTRAL_SEQ_CONFIGURATION);
+       tmp = pmu_raw_readl(S5P_CENTRAL_SEQ_CONFIGURATION);
        if (!(tmp & S5P_CENTRAL_LOWPWR_CFG)) {
                tmp |= S5P_CENTRAL_LOWPWR_CFG;
-               __raw_writel(tmp, S5P_CENTRAL_SEQ_CONFIGURATION);
+               pmu_raw_writel(tmp, S5P_CENTRAL_SEQ_CONFIGURATION);
                /* clear the wakeup state register */
-               __raw_writel(0x0, S5P_WAKEUP_STAT);
+               pmu_raw_writel(0x0, S5P_WAKEUP_STAT);
                /* No need to perform below restore code */
                return -1;
        }
@@ -339,13 +277,13 @@ static void exynos_pm_resume(void)
 
        /* For release retention */
 
-       __raw_writel((1 << 28), S5P_PAD_RET_MAUDIO_OPTION);
-       __raw_writel((1 << 28), S5P_PAD_RET_GPIO_OPTION);
-       __raw_writel((1 << 28), S5P_PAD_RET_UART_OPTION);
-       __raw_writel((1 << 28), S5P_PAD_RET_MMCA_OPTION);
-       __raw_writel((1 << 28), S5P_PAD_RET_MMCB_OPTION);
-       __raw_writel((1 << 28), S5P_PAD_RET_EBIA_OPTION);
-       __raw_writel((1 << 28), S5P_PAD_RET_EBIB_OPTION);
+       pmu_raw_writel((1 << 28), S5P_PAD_RET_MAUDIO_OPTION);
+       pmu_raw_writel((1 << 28), S5P_PAD_RET_GPIO_OPTION);
+       pmu_raw_writel((1 << 28), S5P_PAD_RET_UART_OPTION);
+       pmu_raw_writel((1 << 28), S5P_PAD_RET_MMCA_OPTION);
+       pmu_raw_writel((1 << 28), S5P_PAD_RET_MMCB_OPTION);
+       pmu_raw_writel((1 << 28), S5P_PAD_RET_EBIA_OPTION);
+       pmu_raw_writel((1 << 28), S5P_PAD_RET_EBIB_OPTION);
 
        if (soc_is_exynos5250())
                s3c_pm_do_restore(exynos5_sys_save,
@@ -359,7 +297,7 @@ static void exynos_pm_resume(void)
 early_wakeup:
 
        /* Clear SLEEP mode set in INFORM1 */
-       __raw_writel(0x0, S5P_INFORM1);
+       pmu_raw_writel(0x0, S5P_INFORM1);
 
        return;
 }
@@ -403,7 +341,7 @@ static int exynos_suspend_enter(suspend_state_t state)
        s3c_pm_restore_uarts();
 
        S3C_PMDBG("%s: wakeup stat: %08x\n", __func__,
-                       __raw_readl(S5P_WAKEUP_STAT));
+                       pmu_raw_readl(S5P_WAKEUP_STAT));
 
        s3c_pm_check_restore();
 
@@ -473,9 +411,9 @@ void __init exynos_pm_init(void)
        gic_arch_extn.irq_set_wake = exynos_irq_set_wake;
 
        /* All wakeup disable */
-       tmp = __raw_readl(S5P_WAKEUP_MASK);
+       tmp = pmu_raw_readl(S5P_WAKEUP_MASK);
        tmp |= ((0xFF << 8) | (0x1F << 1));
-       __raw_writel(tmp, S5P_WAKEUP_MASK);
+       pmu_raw_writel(tmp, S5P_WAKEUP_MASK);
 
        register_syscore_ops(&exynos_pm_syscore_ops);
        suspend_set_ops(&exynos_suspend_ops);
index 797cb134bffff75233bb5817913dab0fcd426b79..fd76e1b5a471a4f3ffcfd3a2c4539a16b2d26f40 100644 (file)
@@ -23,8 +23,7 @@
 #include <linux/of_platform.h>
 #include <linux/sched.h>
 
-#include "regs-pmu.h"
-
+#define INT_LOCAL_PWR_EN       0x7
 #define MAX_CLK_PER_DOMAIN     4
 
 /*
@@ -63,13 +62,13 @@ static int exynos_pd_power(struct generic_pm_domain *domain, bool power_on)
                }
        }
 
-       pwr = power_on ? S5P_INT_LOCAL_PWR_EN : 0;
+       pwr = power_on ? INT_LOCAL_PWR_EN : 0;
        __raw_writel(pwr, base);
 
        /* Wait max 1ms */
        timeout = 10;
 
-       while ((__raw_readl(base + 0x4) & S5P_INT_LOCAL_PWR_EN) != pwr) {
+       while ((__raw_readl(base + 0x4) & INT_LOCAL_PWR_EN) != pwr) {
                if (!timeout) {
                        op = (power_on) ? "enable" : "disable";
                        pr_err("Power domain %s %s failed\n", domain->name, op);
@@ -231,7 +230,7 @@ static __init int exynos4_pm_init_power_domain(void)
 no_clk:
                platform_set_drvdata(pdev, pd);
 
-               on = __raw_readl(pd->base + 0x4) & S5P_INT_LOCAL_PWR_EN;
+               on = __raw_readl(pd->base + 0x4) & INT_LOCAL_PWR_EN;
 
                pm_genpd_init(&pd->pd, NULL, !on);
        }
index fb0deda3b3a406fc44d705c29f0440e11d61e366..ff9d23f0a7d99676e2aba9a8b553e6cc2df779e2 100644 (file)
@@ -11,7 +11,6 @@
 
 #include <linux/io.h>
 #include <linux/kernel.h>
-#include <linux/bug.h>
 
 #include "common.h"
 #include "regs-pmu.h"
@@ -19,7 +18,7 @@
 static const struct exynos_pmu_conf *exynos_pmu_config;
 
 static const struct exynos_pmu_conf exynos4210_pmu_config[] = {
-       /* { .reg = address, .val = { AFTR, LPA, SLEEP } */
+       /* { .offset = offset, .val = { AFTR, LPA, SLEEP } */
        { S5P_ARM_CORE0_LOWPWR,                 { 0x0, 0x0, 0x2 } },
        { S5P_DIS_IRQ_CORE0,                    { 0x0, 0x0, 0x0 } },
        { S5P_DIS_IRQ_CENTRAL0,                 { 0x0, 0x0, 0x0 } },
@@ -213,7 +212,7 @@ static const struct exynos_pmu_conf exynos4412_pmu_config[] = {
 };
 
 static const struct exynos_pmu_conf exynos5250_pmu_config[] = {
-       /* { .reg = address, .val = { AFTR, LPA, SLEEP } */
+       /* { .offset = offset, .val = { AFTR, LPA, SLEEP } */
        { EXYNOS5_ARM_CORE0_SYS_PWR_REG,                { 0x0, 0x0, 0x2} },
        { EXYNOS5_DIS_IRQ_ARM_CORE0_LOCAL_SYS_PWR_REG,  { 0x0, 0x0, 0x0} },
        { EXYNOS5_DIS_IRQ_ARM_CORE0_CENTRAL_SYS_PWR_REG,        { 0x0, 0x0, 0x0} },
@@ -316,7 +315,7 @@ static const struct exynos_pmu_conf exynos5250_pmu_config[] = {
        { PMU_TABLE_END,},
 };
 
-static void __iomem * const exynos5_list_both_cnt_feed[] = {
+static unsigned int const exynos5_list_both_cnt_feed[] = {
        EXYNOS5_ARM_CORE0_OPTION,
        EXYNOS5_ARM_CORE1_OPTION,
        EXYNOS5_ARM_COMMON_OPTION,
@@ -330,7 +329,7 @@ static void __iomem * const exynos5_list_both_cnt_feed[] = {
        EXYNOS5_TOP_PWR_SYSMEM_OPTION,
 };
 
-static void __iomem * const exynos5_list_diable_wfi_wfe[] = {
+static unsigned int const exynos5_list_diable_wfi_wfe[] = {
        EXYNOS5_ARM_CORE1_OPTION,
        EXYNOS5_FSYS_ARM_OPTION,
        EXYNOS5_ISP_ARM_OPTION,
@@ -345,27 +344,27 @@ static void exynos5_init_pmu(void)
         * Enable both SC_FEEDBACK and SC_COUNTER
         */
        for (i = 0 ; i < ARRAY_SIZE(exynos5_list_both_cnt_feed) ; i++) {
-               tmp = __raw_readl(exynos5_list_both_cnt_feed[i]);
+               tmp = pmu_raw_readl(exynos5_list_both_cnt_feed[i]);
                tmp |= (EXYNOS5_USE_SC_FEEDBACK |
                        EXYNOS5_USE_SC_COUNTER);
-               __raw_writel(tmp, exynos5_list_both_cnt_feed[i]);
+               pmu_raw_writel(tmp, exynos5_list_both_cnt_feed[i]);
        }
 
        /*
         * SKIP_DEACTIVATE_ACEACP_IN_PWDN_BITFIELD Enable
         */
-       tmp = __raw_readl(EXYNOS5_ARM_COMMON_OPTION);
+       tmp = pmu_raw_readl(EXYNOS5_ARM_COMMON_OPTION);
        tmp |= EXYNOS5_SKIP_DEACTIVATE_ACEACP_IN_PWDN;
-       __raw_writel(tmp, EXYNOS5_ARM_COMMON_OPTION);
+       pmu_raw_writel(tmp, EXYNOS5_ARM_COMMON_OPTION);
 
        /*
         * Disable WFI/WFE on XXX_OPTION
         */
        for (i = 0 ; i < ARRAY_SIZE(exynos5_list_diable_wfi_wfe) ; i++) {
-               tmp = __raw_readl(exynos5_list_diable_wfi_wfe[i]);
+               tmp = pmu_raw_readl(exynos5_list_diable_wfi_wfe[i]);
                tmp &= ~(EXYNOS5_OPTION_USE_STANDBYWFE |
                         EXYNOS5_OPTION_USE_STANDBYWFI);
-               __raw_writel(tmp, exynos5_list_diable_wfi_wfe[i]);
+               pmu_raw_writel(tmp, exynos5_list_diable_wfi_wfe[i]);
        }
 }
 
@@ -376,14 +375,14 @@ void exynos_sys_powerdown_conf(enum sys_powerdown mode)
        if (soc_is_exynos5250())
                exynos5_init_pmu();
 
-       for (i = 0; (exynos_pmu_config[i].reg != PMU_TABLE_END) ; i++)
-               __raw_writel(exynos_pmu_config[i].val[mode],
-                               exynos_pmu_config[i].reg);
+       for (i = 0; (exynos_pmu_config[i].offset != PMU_TABLE_END) ; i++)
+               pmu_raw_writel(exynos_pmu_config[i].val[mode],
+                               exynos_pmu_config[i].offset);
 
        if (soc_is_exynos4412()) {
-               for (i = 0; exynos4412_pmu_config[i].reg != PMU_TABLE_END ; i++)
-                       __raw_writel(exynos4412_pmu_config[i].val[mode],
-                               exynos4412_pmu_config[i].reg);
+               for (i = 0; exynos4412_pmu_config[i].offset != PMU_TABLE_END ; i++)
+                       pmu_raw_writel(exynos4412_pmu_config[i].val[mode],
+                                       exynos4412_pmu_config[i].offset);
        }
 }
 
@@ -404,13 +403,13 @@ static int __init exynos_pmu_init(void)
                 * When SYS_WDTRESET is set, watchdog timer reset request
                 * is ignored by power management unit.
                 */
-               value = __raw_readl(EXYNOS5_AUTO_WDTRESET_DISABLE);
+               value = pmu_raw_readl(EXYNOS5_AUTO_WDTRESET_DISABLE);
                value &= ~EXYNOS5_SYS_WDTRESET;
-               __raw_writel(value, EXYNOS5_AUTO_WDTRESET_DISABLE);
+               pmu_raw_writel(value, EXYNOS5_AUTO_WDTRESET_DISABLE);
 
-               value = __raw_readl(EXYNOS5_MASK_WDTRESET_REQUEST);
+               value = pmu_raw_readl(EXYNOS5_MASK_WDTRESET_REQUEST);
                value &= ~EXYNOS5_SYS_WDTRESET;
-               __raw_writel(value, EXYNOS5_MASK_WDTRESET_REQUEST);
+               pmu_raw_writel(value, EXYNOS5_MASK_WDTRESET_REQUEST);
 
                exynos_pmu_config = exynos5250_pmu_config;
                pr_info("EXYNOS5250 PMU Initialize\n");
index 1d13b08708f0055e49baa27e43ac24be6e355530..96a1569262b5233a9621f11b0a64c62bfdce2a57 100644 (file)
 #ifndef __ASM_ARCH_REGS_PMU_H
 #define __ASM_ARCH_REGS_PMU_H __FILE__
 
-#include <mach/map.h>
-
-#define S5P_PMUREG(x)                          (S5P_VA_PMU + (x))
-#define S5P_SYSREG(x)                          (S3C_VA_SYS + (x))
-
-#define S5P_CENTRAL_SEQ_CONFIGURATION          S5P_PMUREG(0x0200)
+#define S5P_CENTRAL_SEQ_CONFIGURATION          0x0200
 
 #define S5P_CENTRAL_LOWPWR_CFG                 (1 << 16)
 
-#define S5P_CENTRAL_SEQ_OPTION                 S5P_PMUREG(0x0208)
+#define S5P_CENTRAL_SEQ_OPTION                 0x0208
 
 #define S5P_USE_STANDBY_WFI0                   (1 << 16)
 #define S5P_USE_STANDBY_WFE0                   (1 << 24)
 
-#define EXYNOS_SWRESET                         S5P_PMUREG(0x0400)
-#define EXYNOS5440_SWRESET                     S5P_PMUREG(0x00C4)
+#define EXYNOS_SWRESET                         0x0400
+#define EXYNOS5440_SWRESET                     0x00C4
 
-#define S5P_WAKEUP_STAT                                S5P_PMUREG(0x0600)
-#define S5P_EINT_WAKEUP_MASK                   S5P_PMUREG(0x0604)
-#define S5P_WAKEUP_MASK                                S5P_PMUREG(0x0608)
+#define S5P_WAKEUP_STAT                                0x0600
+#define S5P_EINT_WAKEUP_MASK                   0x0604
+#define S5P_WAKEUP_MASK                                0x0608
 
-#define S5P_INFORM0                            S5P_PMUREG(0x0800)
-#define S5P_INFORM1                            S5P_PMUREG(0x0804)
-#define S5P_INFORM5                            S5P_PMUREG(0x0814)
-#define S5P_INFORM6                            S5P_PMUREG(0x0818)
-#define S5P_INFORM7                            S5P_PMUREG(0x081C)
-#define S5P_PMU_SPARE3                         S5P_PMUREG(0x090C)
+#define S5P_INFORM0                            0x0800
+#define S5P_INFORM1                            0x0804
+#define S5P_INFORM5                            0x0814
+#define S5P_INFORM6                            0x0818
+#define S5P_INFORM7                            0x081C
+#define S5P_PMU_SPARE3                         0x090C
 
-#define S5P_ARM_CORE0_LOWPWR                   S5P_PMUREG(0x1000)
-#define S5P_DIS_IRQ_CORE0                      S5P_PMUREG(0x1004)
-#define S5P_DIS_IRQ_CENTRAL0                   S5P_PMUREG(0x1008)
-#define S5P_ARM_CORE1_LOWPWR                   S5P_PMUREG(0x1010)
-#define S5P_DIS_IRQ_CORE1                      S5P_PMUREG(0x1014)
-#define S5P_DIS_IRQ_CENTRAL1                   S5P_PMUREG(0x1018)
-#define S5P_ARM_COMMON_LOWPWR                  S5P_PMUREG(0x1080)
-#define S5P_L2_0_LOWPWR                                S5P_PMUREG(0x10C0)
-#define S5P_L2_1_LOWPWR                                S5P_PMUREG(0x10C4)
-#define S5P_CMU_ACLKSTOP_LOWPWR                        S5P_PMUREG(0x1100)
-#define S5P_CMU_SCLKSTOP_LOWPWR                        S5P_PMUREG(0x1104)
-#define S5P_CMU_RESET_LOWPWR                   S5P_PMUREG(0x110C)
-#define S5P_APLL_SYSCLK_LOWPWR                 S5P_PMUREG(0x1120)
-#define S5P_MPLL_SYSCLK_LOWPWR                 S5P_PMUREG(0x1124)
-#define S5P_VPLL_SYSCLK_LOWPWR                 S5P_PMUREG(0x1128)
-#define S5P_EPLL_SYSCLK_LOWPWR                 S5P_PMUREG(0x112C)
-#define S5P_CMU_CLKSTOP_GPS_ALIVE_LOWPWR       S5P_PMUREG(0x1138)
-#define S5P_CMU_RESET_GPSALIVE_LOWPWR          S5P_PMUREG(0x113C)
-#define S5P_CMU_CLKSTOP_CAM_LOWPWR             S5P_PMUREG(0x1140)
-#define S5P_CMU_CLKSTOP_TV_LOWPWR              S5P_PMUREG(0x1144)
-#define S5P_CMU_CLKSTOP_MFC_LOWPWR             S5P_PMUREG(0x1148)
-#define S5P_CMU_CLKSTOP_G3D_LOWPWR             S5P_PMUREG(0x114C)
-#define S5P_CMU_CLKSTOP_LCD0_LOWPWR            S5P_PMUREG(0x1150)
-#define S5P_CMU_CLKSTOP_MAUDIO_LOWPWR          S5P_PMUREG(0x1158)
-#define S5P_CMU_CLKSTOP_GPS_LOWPWR             S5P_PMUREG(0x115C)
-#define S5P_CMU_RESET_CAM_LOWPWR               S5P_PMUREG(0x1160)
-#define S5P_CMU_RESET_TV_LOWPWR                        S5P_PMUREG(0x1164)
-#define S5P_CMU_RESET_MFC_LOWPWR               S5P_PMUREG(0x1168)
-#define S5P_CMU_RESET_G3D_LOWPWR               S5P_PMUREG(0x116C)
-#define S5P_CMU_RESET_LCD0_LOWPWR              S5P_PMUREG(0x1170)
-#define S5P_CMU_RESET_MAUDIO_LOWPWR            S5P_PMUREG(0x1178)
-#define S5P_CMU_RESET_GPS_LOWPWR               S5P_PMUREG(0x117C)
-#define S5P_TOP_BUS_LOWPWR                     S5P_PMUREG(0x1180)
-#define S5P_TOP_RETENTION_LOWPWR               S5P_PMUREG(0x1184)
-#define S5P_TOP_PWR_LOWPWR                     S5P_PMUREG(0x1188)
-#define S5P_LOGIC_RESET_LOWPWR                 S5P_PMUREG(0x11A0)
-#define S5P_ONENAND_MEM_LOWPWR                 S5P_PMUREG(0x11C0)
-#define S5P_G2D_ACP_MEM_LOWPWR                 S5P_PMUREG(0x11C8)
-#define S5P_USBOTG_MEM_LOWPWR                  S5P_PMUREG(0x11CC)
-#define S5P_HSMMC_MEM_LOWPWR                   S5P_PMUREG(0x11D0)
-#define S5P_CSSYS_MEM_LOWPWR                   S5P_PMUREG(0x11D4)
-#define S5P_SECSS_MEM_LOWPWR                   S5P_PMUREG(0x11D8)
-#define S5P_PAD_RETENTION_DRAM_LOWPWR          S5P_PMUREG(0x1200)
-#define S5P_PAD_RETENTION_MAUDIO_LOWPWR                S5P_PMUREG(0x1204)
-#define S5P_PAD_RETENTION_GPIO_LOWPWR          S5P_PMUREG(0x1220)
-#define S5P_PAD_RETENTION_UART_LOWPWR          S5P_PMUREG(0x1224)
-#define S5P_PAD_RETENTION_MMCA_LOWPWR          S5P_PMUREG(0x1228)
-#define S5P_PAD_RETENTION_MMCB_LOWPWR          S5P_PMUREG(0x122C)
-#define S5P_PAD_RETENTION_EBIA_LOWPWR          S5P_PMUREG(0x1230)
-#define S5P_PAD_RETENTION_EBIB_LOWPWR          S5P_PMUREG(0x1234)
-#define S5P_PAD_RETENTION_ISOLATION_LOWPWR     S5P_PMUREG(0x1240)
-#define S5P_PAD_RETENTION_ALV_SEL_LOWPWR       S5P_PMUREG(0x1260)
-#define S5P_XUSBXTI_LOWPWR                     S5P_PMUREG(0x1280)
-#define S5P_XXTI_LOWPWR                                S5P_PMUREG(0x1284)
-#define S5P_EXT_REGULATOR_LOWPWR               S5P_PMUREG(0x12C0)
-#define S5P_GPIO_MODE_LOWPWR                   S5P_PMUREG(0x1300)
-#define S5P_GPIO_MODE_MAUDIO_LOWPWR            S5P_PMUREG(0x1340)
-#define S5P_CAM_LOWPWR                         S5P_PMUREG(0x1380)
-#define S5P_TV_LOWPWR                          S5P_PMUREG(0x1384)
-#define S5P_MFC_LOWPWR                         S5P_PMUREG(0x1388)
-#define S5P_G3D_LOWPWR                         S5P_PMUREG(0x138C)
-#define S5P_LCD0_LOWPWR                                S5P_PMUREG(0x1390)
-#define S5P_MAUDIO_LOWPWR                      S5P_PMUREG(0x1398)
-#define S5P_GPS_LOWPWR                         S5P_PMUREG(0x139C)
-#define S5P_GPS_ALIVE_LOWPWR                   S5P_PMUREG(0x13A0)
+#define S5P_ARM_CORE0_LOWPWR                   0x1000
+#define S5P_DIS_IRQ_CORE0                      0x1004
+#define S5P_DIS_IRQ_CENTRAL0                   0x1008
+#define S5P_ARM_CORE1_LOWPWR                   0x1010
+#define S5P_DIS_IRQ_CORE1                      0x1014
+#define S5P_DIS_IRQ_CENTRAL1                   0x1018
+#define S5P_ARM_COMMON_LOWPWR                  0x1080
+#define S5P_L2_0_LOWPWR                                0x10C0
+#define S5P_L2_1_LOWPWR                                0x10C4
+#define S5P_CMU_ACLKSTOP_LOWPWR                        0x1100
+#define S5P_CMU_SCLKSTOP_LOWPWR                        0x1104
+#define S5P_CMU_RESET_LOWPWR                   0x110C
+#define S5P_APLL_SYSCLK_LOWPWR                 0x1120
+#define S5P_MPLL_SYSCLK_LOWPWR                 0x1124
+#define S5P_VPLL_SYSCLK_LOWPWR                 0x1128
+#define S5P_EPLL_SYSCLK_LOWPWR                 0x112C
+#define S5P_CMU_CLKSTOP_GPS_ALIVE_LOWPWR       0x1138
+#define S5P_CMU_RESET_GPSALIVE_LOWPWR          0x113C
+#define S5P_CMU_CLKSTOP_CAM_LOWPWR             0x1140
+#define S5P_CMU_CLKSTOP_TV_LOWPWR              0x1144
+#define S5P_CMU_CLKSTOP_MFC_LOWPWR             0x1148
+#define S5P_CMU_CLKSTOP_G3D_LOWPWR             0x114C
+#define S5P_CMU_CLKSTOP_LCD0_LOWPWR            0x1150
+#define S5P_CMU_CLKSTOP_MAUDIO_LOWPWR          0x1158
+#define S5P_CMU_CLKSTOP_GPS_LOWPWR             0x115C
+#define S5P_CMU_RESET_CAM_LOWPWR               0x1160
+#define S5P_CMU_RESET_TV_LOWPWR                        0x1164
+#define S5P_CMU_RESET_MFC_LOWPWR               0x1168
+#define S5P_CMU_RESET_G3D_LOWPWR               0x116C
+#define S5P_CMU_RESET_LCD0_LOWPWR              0x1170
+#define S5P_CMU_RESET_MAUDIO_LOWPWR            0x1178
+#define S5P_CMU_RESET_GPS_LOWPWR               0x117C
+#define S5P_TOP_BUS_LOWPWR                     0x1180
+#define S5P_TOP_RETENTION_LOWPWR               0x1184
+#define S5P_TOP_PWR_LOWPWR                     0x1188
+#define S5P_LOGIC_RESET_LOWPWR                 0x11A0
+#define S5P_ONENAND_MEM_LOWPWR                 0x11C0
+#define S5P_G2D_ACP_MEM_LOWPWR                 0x11C8
+#define S5P_USBOTG_MEM_LOWPWR                  0x11CC
+#define S5P_HSMMC_MEM_LOWPWR                   0x11D0
+#define S5P_CSSYS_MEM_LOWPWR                   0x11D4
+#define S5P_SECSS_MEM_LOWPWR                   0x11D8
+#define S5P_PAD_RETENTION_DRAM_LOWPWR          0x1200
+#define S5P_PAD_RETENTION_MAUDIO_LOWPWR                0x1204
+#define S5P_PAD_RETENTION_GPIO_LOWPWR          0x1220
+#define S5P_PAD_RETENTION_UART_LOWPWR          0x1224
+#define S5P_PAD_RETENTION_MMCA_LOWPWR          0x1228
+#define S5P_PAD_RETENTION_MMCB_LOWPWR          0x122C
+#define S5P_PAD_RETENTION_EBIA_LOWPWR          0x1230
+#define S5P_PAD_RETENTION_EBIB_LOWPWR          0x1234
+#define S5P_PAD_RETENTION_ISOLATION_LOWPWR     0x1240
+#define S5P_PAD_RETENTION_ALV_SEL_LOWPWR       0x1260
+#define S5P_XUSBXTI_LOWPWR                     0x1280
+#define S5P_XXTI_LOWPWR                                0x1284
+#define S5P_EXT_REGULATOR_LOWPWR               0x12C0
+#define S5P_GPIO_MODE_LOWPWR                   0x1300
+#define S5P_GPIO_MODE_MAUDIO_LOWPWR            0x1340
+#define S5P_CAM_LOWPWR                         0x1380
+#define S5P_TV_LOWPWR                          0x1384
+#define S5P_MFC_LOWPWR                         0x1388
+#define S5P_G3D_LOWPWR                         0x138C
+#define S5P_LCD0_LOWPWR                                0x1390
+#define S5P_MAUDIO_LOWPWR                      0x1398
+#define S5P_GPS_LOWPWR                         0x139C
+#define S5P_GPS_ALIVE_LOWPWR                   0x13A0
 
-#define EXYNOS_ARM_CORE0_CONFIGURATION         S5P_PMUREG(0x2000)
+#define EXYNOS_ARM_CORE0_CONFIGURATION         0x2000
 #define EXYNOS_ARM_CORE_CONFIGURATION(_nr)     \
                        (EXYNOS_ARM_CORE0_CONFIGURATION + (0x80 * (_nr)))
 #define EXYNOS_ARM_CORE_STATUS(_nr)            \
                        (EXYNOS_ARM_CORE_CONFIGURATION(_nr) + 0x4)
 
-#define EXYNOS_ARM_COMMON_CONFIGURATION                S5P_PMUREG(0x2500)
+#define EXYNOS_ARM_COMMON_CONFIGURATION                0x2500
 #define EXYNOS_COMMON_CONFIGURATION(_nr)       \
                        (EXYNOS_ARM_COMMON_CONFIGURATION + (0x80 * (_nr)))
 #define EXYNOS_COMMON_STATUS(_nr)              \
                        (EXYNOS_COMMON_CONFIGURATION(_nr) + 0x4)
+#define EXYNOS_COMMON_OPTION(_nr)              \
+                       (EXYNOS_COMMON_CONFIGURATION(_nr) + 0x8)
 
-#define S5P_PAD_RET_MAUDIO_OPTION              S5P_PMUREG(0x3028)
-#define S5P_PAD_RET_GPIO_OPTION                        S5P_PMUREG(0x3108)
-#define S5P_PAD_RET_UART_OPTION                        S5P_PMUREG(0x3128)
-#define S5P_PAD_RET_MMCA_OPTION                        S5P_PMUREG(0x3148)
-#define S5P_PAD_RET_MMCB_OPTION                        S5P_PMUREG(0x3168)
-#define S5P_PAD_RET_EBIA_OPTION                        S5P_PMUREG(0x3188)
-#define S5P_PAD_RET_EBIB_OPTION                        S5P_PMUREG(0x31A8)
+#define S5P_PAD_RET_MAUDIO_OPTION              0x3028
+#define S5P_PAD_RET_GPIO_OPTION                        0x3108
+#define S5P_PAD_RET_UART_OPTION                        0x3128
+#define S5P_PAD_RET_MMCA_OPTION                        0x3148
+#define S5P_PAD_RET_MMCB_OPTION                        0x3168
+#define S5P_PAD_RET_EBIA_OPTION                        0x3188
+#define S5P_PAD_RET_EBIB_OPTION                        0x31A8
 
 #define S5P_CORE_LOCAL_PWR_EN                  0x3
-#define S5P_INT_LOCAL_PWR_EN                   0x7
 
 /* Only for EXYNOS4210 */
-#define S5P_CMU_CLKSTOP_LCD1_LOWPWR    S5P_PMUREG(0x1154)
-#define S5P_CMU_RESET_LCD1_LOWPWR      S5P_PMUREG(0x1174)
-#define S5P_MODIMIF_MEM_LOWPWR         S5P_PMUREG(0x11C4)
-#define S5P_PCIE_MEM_LOWPWR            S5P_PMUREG(0x11E0)
-#define S5P_SATA_MEM_LOWPWR            S5P_PMUREG(0x11E4)
-#define S5P_LCD1_LOWPWR                        S5P_PMUREG(0x1394)
+#define S5P_CMU_CLKSTOP_LCD1_LOWPWR    0x1154
+#define S5P_CMU_RESET_LCD1_LOWPWR      0x1174
+#define S5P_MODIMIF_MEM_LOWPWR         0x11C4
+#define S5P_PCIE_MEM_LOWPWR            0x11E0
+#define S5P_SATA_MEM_LOWPWR            0x11E4
+#define S5P_LCD1_LOWPWR                        0x1394
 
 /* Only for EXYNOS4x12 */
-#define S5P_ISP_ARM_LOWPWR                     S5P_PMUREG(0x1050)
-#define S5P_DIS_IRQ_ISP_ARM_LOCAL_LOWPWR       S5P_PMUREG(0x1054)
-#define S5P_DIS_IRQ_ISP_ARM_CENTRAL_LOWPWR     S5P_PMUREG(0x1058)
-#define S5P_CMU_ACLKSTOP_COREBLK_LOWPWR                S5P_PMUREG(0x1110)
-#define S5P_CMU_SCLKSTOP_COREBLK_LOWPWR                S5P_PMUREG(0x1114)
-#define S5P_CMU_RESET_COREBLK_LOWPWR           S5P_PMUREG(0x111C)
-#define S5P_MPLLUSER_SYSCLK_LOWPWR             S5P_PMUREG(0x1130)
-#define S5P_CMU_CLKSTOP_ISP_LOWPWR             S5P_PMUREG(0x1154)
-#define S5P_CMU_RESET_ISP_LOWPWR               S5P_PMUREG(0x1174)
-#define S5P_TOP_BUS_COREBLK_LOWPWR             S5P_PMUREG(0x1190)
-#define S5P_TOP_RETENTION_COREBLK_LOWPWR       S5P_PMUREG(0x1194)
-#define S5P_TOP_PWR_COREBLK_LOWPWR             S5P_PMUREG(0x1198)
-#define S5P_OSCCLK_GATE_LOWPWR                 S5P_PMUREG(0x11A4)
-#define S5P_LOGIC_RESET_COREBLK_LOWPWR         S5P_PMUREG(0x11B0)
-#define S5P_OSCCLK_GATE_COREBLK_LOWPWR         S5P_PMUREG(0x11B4)
-#define S5P_HSI_MEM_LOWPWR                     S5P_PMUREG(0x11C4)
-#define S5P_ROTATOR_MEM_LOWPWR                 S5P_PMUREG(0x11DC)
-#define S5P_PAD_RETENTION_GPIO_COREBLK_LOWPWR  S5P_PMUREG(0x123C)
-#define S5P_PAD_ISOLATION_COREBLK_LOWPWR       S5P_PMUREG(0x1250)
-#define S5P_GPIO_MODE_COREBLK_LOWPWR           S5P_PMUREG(0x1320)
-#define S5P_TOP_ASB_RESET_LOWPWR               S5P_PMUREG(0x1344)
-#define S5P_TOP_ASB_ISOLATION_LOWPWR           S5P_PMUREG(0x1348)
-#define S5P_ISP_LOWPWR                         S5P_PMUREG(0x1394)
-#define S5P_DRAM_FREQ_DOWN_LOWPWR              S5P_PMUREG(0x13B0)
-#define S5P_DDRPHY_DLLOFF_LOWPWR               S5P_PMUREG(0x13B4)
-#define S5P_CMU_SYSCLK_ISP_LOWPWR              S5P_PMUREG(0x13B8)
-#define S5P_CMU_SYSCLK_GPS_LOWPWR              S5P_PMUREG(0x13BC)
-#define S5P_LPDDR_PHY_DLL_LOCK_LOWPWR          S5P_PMUREG(0x13C0)
+#define S5P_ISP_ARM_LOWPWR                     0x1050
+#define S5P_DIS_IRQ_ISP_ARM_LOCAL_LOWPWR       0x1054
+#define S5P_DIS_IRQ_ISP_ARM_CENTRAL_LOWPWR     0x1058
+#define S5P_CMU_ACLKSTOP_COREBLK_LOWPWR                0x1110
+#define S5P_CMU_SCLKSTOP_COREBLK_LOWPWR                0x1114
+#define S5P_CMU_RESET_COREBLK_LOWPWR           0x111C
+#define S5P_MPLLUSER_SYSCLK_LOWPWR             0x1130
+#define S5P_CMU_CLKSTOP_ISP_LOWPWR             0x1154
+#define S5P_CMU_RESET_ISP_LOWPWR               0x1174
+#define S5P_TOP_BUS_COREBLK_LOWPWR             0x1190
+#define S5P_TOP_RETENTION_COREBLK_LOWPWR       0x1194
+#define S5P_TOP_PWR_COREBLK_LOWPWR             0x1198
+#define S5P_OSCCLK_GATE_LOWPWR                 0x11A4
+#define S5P_LOGIC_RESET_COREBLK_LOWPWR         0x11B0
+#define S5P_OSCCLK_GATE_COREBLK_LOWPWR         0x11B4
+#define S5P_HSI_MEM_LOWPWR                     0x11C4
+#define S5P_ROTATOR_MEM_LOWPWR                 0x11DC
+#define S5P_PAD_RETENTION_GPIO_COREBLK_LOWPWR  0x123C
+#define S5P_PAD_ISOLATION_COREBLK_LOWPWR       0x1250
+#define S5P_GPIO_MODE_COREBLK_LOWPWR           0x1320
+#define S5P_TOP_ASB_RESET_LOWPWR               0x1344
+#define S5P_TOP_ASB_ISOLATION_LOWPWR           0x1348
+#define S5P_ISP_LOWPWR                         0x1394
+#define S5P_DRAM_FREQ_DOWN_LOWPWR              0x13B0
+#define S5P_DDRPHY_DLLOFF_LOWPWR               0x13B4
+#define S5P_CMU_SYSCLK_ISP_LOWPWR              0x13B8
+#define S5P_CMU_SYSCLK_GPS_LOWPWR              0x13BC
+#define S5P_LPDDR_PHY_DLL_LOCK_LOWPWR          0x13C0
 
-#define S5P_ARM_L2_0_OPTION                    S5P_PMUREG(0x2608)
-#define S5P_ARM_L2_1_OPTION                    S5P_PMUREG(0x2628)
-#define S5P_ONENAND_MEM_OPTION                 S5P_PMUREG(0x2E08)
-#define S5P_HSI_MEM_OPTION                     S5P_PMUREG(0x2E28)
-#define S5P_G2D_ACP_MEM_OPTION                 S5P_PMUREG(0x2E48)
-#define S5P_USBOTG_MEM_OPTION                  S5P_PMUREG(0x2E68)
-#define S5P_HSMMC_MEM_OPTION                   S5P_PMUREG(0x2E88)
-#define S5P_CSSYS_MEM_OPTION                   S5P_PMUREG(0x2EA8)
-#define S5P_SECSS_MEM_OPTION                   S5P_PMUREG(0x2EC8)
-#define S5P_ROTATOR_MEM_OPTION                 S5P_PMUREG(0x2F48)
+#define S5P_ARM_L2_0_OPTION                    0x2608
+#define S5P_ARM_L2_1_OPTION                    0x2628
+#define S5P_ONENAND_MEM_OPTION                 0x2E08
+#define S5P_HSI_MEM_OPTION                     0x2E28
+#define S5P_G2D_ACP_MEM_OPTION                 0x2E48
+#define S5P_USBOTG_MEM_OPTION                  0x2E68
+#define S5P_HSMMC_MEM_OPTION                   0x2E88
+#define S5P_CSSYS_MEM_OPTION                   0x2EA8
+#define S5P_SECSS_MEM_OPTION                   0x2EC8
+#define S5P_ROTATOR_MEM_OPTION                 0x2F48
 
 /* Only for EXYNOS4412 */
-#define S5P_ARM_CORE2_LOWPWR                   S5P_PMUREG(0x1020)
-#define S5P_DIS_IRQ_CORE2                      S5P_PMUREG(0x1024)
-#define S5P_DIS_IRQ_CENTRAL2                   S5P_PMUREG(0x1028)
-#define S5P_ARM_CORE3_LOWPWR                   S5P_PMUREG(0x1030)
-#define S5P_DIS_IRQ_CORE3                      S5P_PMUREG(0x1034)
-#define S5P_DIS_IRQ_CENTRAL3                   S5P_PMUREG(0x1038)
+#define S5P_ARM_CORE2_LOWPWR                   0x1020
+#define S5P_DIS_IRQ_CORE2                      0x1024
+#define S5P_DIS_IRQ_CENTRAL2                   0x1028
+#define S5P_ARM_CORE3_LOWPWR                   0x1030
+#define S5P_DIS_IRQ_CORE3                      0x1034
+#define S5P_DIS_IRQ_CENTRAL3                   0x1038
 
 /* For EXYNOS5 */
 
-#define EXYNOS5_SYS_I2C_CFG                                    S5P_SYSREG(0x0234)
-
-#define EXYNOS5_AUTO_WDTRESET_DISABLE                          S5P_PMUREG(0x0408)
-#define EXYNOS5_MASK_WDTRESET_REQUEST                          S5P_PMUREG(0x040C)
+#define EXYNOS5_AUTO_WDTRESET_DISABLE                          0x0408
+#define EXYNOS5_MASK_WDTRESET_REQUEST                          0x040C
 
 #define EXYNOS5_SYS_WDTRESET                                   (1 << 20)
 
-#define EXYNOS5_ARM_CORE0_SYS_PWR_REG                          S5P_PMUREG(0x1000)
-#define EXYNOS5_DIS_IRQ_ARM_CORE0_LOCAL_SYS_PWR_REG            S5P_PMUREG(0x1004)
-#define EXYNOS5_DIS_IRQ_ARM_CORE0_CENTRAL_SYS_PWR_REG          S5P_PMUREG(0x1008)
-#define EXYNOS5_ARM_CORE1_SYS_PWR_REG                          S5P_PMUREG(0x1010)
-#define EXYNOS5_DIS_IRQ_ARM_CORE1_LOCAL_SYS_PWR_REG            S5P_PMUREG(0x1014)
-#define EXYNOS5_DIS_IRQ_ARM_CORE1_CENTRAL_SYS_PWR_REG          S5P_PMUREG(0x1018)
-#define EXYNOS5_FSYS_ARM_SYS_PWR_REG                           S5P_PMUREG(0x1040)
-#define EXYNOS5_DIS_IRQ_FSYS_ARM_CENTRAL_SYS_PWR_REG           S5P_PMUREG(0x1048)
-#define EXYNOS5_ISP_ARM_SYS_PWR_REG                            S5P_PMUREG(0x1050)
-#define EXYNOS5_DIS_IRQ_ISP_ARM_LOCAL_SYS_PWR_REG              S5P_PMUREG(0x1054)
-#define EXYNOS5_DIS_IRQ_ISP_ARM_CENTRAL_SYS_PWR_REG            S5P_PMUREG(0x1058)
-#define EXYNOS5_ARM_COMMON_SYS_PWR_REG                         S5P_PMUREG(0x1080)
-#define EXYNOS5_ARM_L2_SYS_PWR_REG                             S5P_PMUREG(0x10C0)
-#define EXYNOS5_CMU_ACLKSTOP_SYS_PWR_REG                       S5P_PMUREG(0x1100)
-#define EXYNOS5_CMU_SCLKSTOP_SYS_PWR_REG                       S5P_PMUREG(0x1104)
-#define EXYNOS5_CMU_RESET_SYS_PWR_REG                          S5P_PMUREG(0x110C)
-#define EXYNOS5_CMU_ACLKSTOP_SYSMEM_SYS_PWR_REG                        S5P_PMUREG(0x1120)
-#define EXYNOS5_CMU_SCLKSTOP_SYSMEM_SYS_PWR_REG                        S5P_PMUREG(0x1124)
-#define EXYNOS5_CMU_RESET_SYSMEM_SYS_PWR_REG                   S5P_PMUREG(0x112C)
-#define EXYNOS5_DRAM_FREQ_DOWN_SYS_PWR_REG                     S5P_PMUREG(0x1130)
-#define EXYNOS5_DDRPHY_DLLOFF_SYS_PWR_REG                      S5P_PMUREG(0x1134)
-#define EXYNOS5_DDRPHY_DLLLOCK_SYS_PWR_REG                     S5P_PMUREG(0x1138)
-#define EXYNOS5_APLL_SYSCLK_SYS_PWR_REG                                S5P_PMUREG(0x1140)
-#define EXYNOS5_MPLL_SYSCLK_SYS_PWR_REG                                S5P_PMUREG(0x1144)
-#define EXYNOS5_VPLL_SYSCLK_SYS_PWR_REG                                S5P_PMUREG(0x1148)
-#define EXYNOS5_EPLL_SYSCLK_SYS_PWR_REG                                S5P_PMUREG(0x114C)
-#define EXYNOS5_BPLL_SYSCLK_SYS_PWR_REG                                S5P_PMUREG(0x1150)
-#define EXYNOS5_CPLL_SYSCLK_SYS_PWR_REG                                S5P_PMUREG(0x1154)
-#define EXYNOS5_MPLLUSER_SYSCLK_SYS_PWR_REG                    S5P_PMUREG(0x1164)
-#define EXYNOS5_BPLLUSER_SYSCLK_SYS_PWR_REG                    S5P_PMUREG(0x1170)
-#define EXYNOS5_TOP_BUS_SYS_PWR_REG                            S5P_PMUREG(0x1180)
-#define EXYNOS5_TOP_RETENTION_SYS_PWR_REG                      S5P_PMUREG(0x1184)
-#define EXYNOS5_TOP_PWR_SYS_PWR_REG                            S5P_PMUREG(0x1188)
-#define EXYNOS5_TOP_BUS_SYSMEM_SYS_PWR_REG                     S5P_PMUREG(0x1190)
-#define EXYNOS5_TOP_RETENTION_SYSMEM_SYS_PWR_REG               S5P_PMUREG(0x1194)
-#define EXYNOS5_TOP_PWR_SYSMEM_SYS_PWR_REG                     S5P_PMUREG(0x1198)
-#define EXYNOS5_LOGIC_RESET_SYS_PWR_REG                                S5P_PMUREG(0x11A0)
-#define EXYNOS5_OSCCLK_GATE_SYS_PWR_REG                                S5P_PMUREG(0x11A4)
-#define EXYNOS5_LOGIC_RESET_SYSMEM_SYS_PWR_REG                 S5P_PMUREG(0x11B0)
-#define EXYNOS5_OSCCLK_GATE_SYSMEM_SYS_PWR_REG                 S5P_PMUREG(0x11B4)
-#define EXYNOS5_USBOTG_MEM_SYS_PWR_REG                         S5P_PMUREG(0x11C0)
-#define EXYNOS5_G2D_MEM_SYS_PWR_REG                            S5P_PMUREG(0x11C8)
-#define EXYNOS5_USBDRD_MEM_SYS_PWR_REG                         S5P_PMUREG(0x11CC)
-#define EXYNOS5_SDMMC_MEM_SYS_PWR_REG                          S5P_PMUREG(0x11D0)
-#define EXYNOS5_CSSYS_MEM_SYS_PWR_REG                          S5P_PMUREG(0x11D4)
-#define EXYNOS5_SECSS_MEM_SYS_PWR_REG                          S5P_PMUREG(0x11D8)
-#define EXYNOS5_ROTATOR_MEM_SYS_PWR_REG                                S5P_PMUREG(0x11DC)
-#define EXYNOS5_INTRAM_MEM_SYS_PWR_REG                         S5P_PMUREG(0x11E0)
-#define EXYNOS5_INTROM_MEM_SYS_PWR_REG                         S5P_PMUREG(0x11E4)
-#define EXYNOS5_JPEG_MEM_SYS_PWR_REG                           S5P_PMUREG(0x11E8)
-#define EXYNOS5_HSI_MEM_SYS_PWR_REG                            S5P_PMUREG(0x11EC)
-#define EXYNOS5_MCUIOP_MEM_SYS_PWR_REG                         S5P_PMUREG(0x11F4)
-#define EXYNOS5_SATA_MEM_SYS_PWR_REG                           S5P_PMUREG(0x11FC)
-#define EXYNOS5_PAD_RETENTION_DRAM_SYS_PWR_REG                 S5P_PMUREG(0x1200)
-#define EXYNOS5_PAD_RETENTION_MAU_SYS_PWR_REG                  S5P_PMUREG(0x1204)
-#define EXYNOS5_PAD_RETENTION_EFNAND_SYS_PWR_REG               S5P_PMUREG(0x1208)
-#define EXYNOS5_PAD_RETENTION_GPIO_SYS_PWR_REG                 S5P_PMUREG(0x1220)
-#define EXYNOS5_PAD_RETENTION_UART_SYS_PWR_REG                 S5P_PMUREG(0x1224)
-#define EXYNOS5_PAD_RETENTION_MMCA_SYS_PWR_REG                 S5P_PMUREG(0x1228)
-#define EXYNOS5_PAD_RETENTION_MMCB_SYS_PWR_REG                 S5P_PMUREG(0x122C)
-#define EXYNOS5_PAD_RETENTION_EBIA_SYS_PWR_REG                 S5P_PMUREG(0x1230)
-#define EXYNOS5_PAD_RETENTION_EBIB_SYS_PWR_REG                 S5P_PMUREG(0x1234)
-#define EXYNOS5_PAD_RETENTION_SPI_SYS_PWR_REG                  S5P_PMUREG(0x1238)
-#define EXYNOS5_PAD_RETENTION_GPIO_SYSMEM_SYS_PWR_REG          S5P_PMUREG(0x123C)
-#define EXYNOS5_PAD_ISOLATION_SYS_PWR_REG                      S5P_PMUREG(0x1240)
-#define EXYNOS5_PAD_ISOLATION_SYSMEM_SYS_PWR_REG               S5P_PMUREG(0x1250)
-#define EXYNOS5_PAD_ALV_SEL_SYS_PWR_REG                                S5P_PMUREG(0x1260)
-#define EXYNOS5_XUSBXTI_SYS_PWR_REG                            S5P_PMUREG(0x1280)
-#define EXYNOS5_XXTI_SYS_PWR_REG                               S5P_PMUREG(0x1284)
-#define EXYNOS5_EXT_REGULATOR_SYS_PWR_REG                      S5P_PMUREG(0x12C0)
-#define EXYNOS5_GPIO_MODE_SYS_PWR_REG                          S5P_PMUREG(0x1300)
-#define EXYNOS5_GPIO_MODE_SYSMEM_SYS_PWR_REG                   S5P_PMUREG(0x1320)
-#define EXYNOS5_GPIO_MODE_MAU_SYS_PWR_REG                      S5P_PMUREG(0x1340)
-#define EXYNOS5_TOP_ASB_RESET_SYS_PWR_REG                      S5P_PMUREG(0x1344)
-#define EXYNOS5_TOP_ASB_ISOLATION_SYS_PWR_REG                  S5P_PMUREG(0x1348)
-#define EXYNOS5_GSCL_SYS_PWR_REG                               S5P_PMUREG(0x1400)
-#define EXYNOS5_ISP_SYS_PWR_REG                                        S5P_PMUREG(0x1404)
-#define EXYNOS5_MFC_SYS_PWR_REG                                        S5P_PMUREG(0x1408)
-#define EXYNOS5_G3D_SYS_PWR_REG                                        S5P_PMUREG(0x140C)
-#define EXYNOS5_DISP1_SYS_PWR_REG                              S5P_PMUREG(0x1414)
-#define EXYNOS5_MAU_SYS_PWR_REG                                        S5P_PMUREG(0x1418)
-#define EXYNOS5_CMU_CLKSTOP_GSCL_SYS_PWR_REG                   S5P_PMUREG(0x1480)
-#define EXYNOS5_CMU_CLKSTOP_ISP_SYS_PWR_REG                    S5P_PMUREG(0x1484)
-#define EXYNOS5_CMU_CLKSTOP_MFC_SYS_PWR_REG                    S5P_PMUREG(0x1488)
-#define EXYNOS5_CMU_CLKSTOP_G3D_SYS_PWR_REG                    S5P_PMUREG(0x148C)
-#define EXYNOS5_CMU_CLKSTOP_DISP1_SYS_PWR_REG                  S5P_PMUREG(0x1494)
-#define EXYNOS5_CMU_CLKSTOP_MAU_SYS_PWR_REG                    S5P_PMUREG(0x1498)
-#define EXYNOS5_CMU_SYSCLK_GSCL_SYS_PWR_REG                    S5P_PMUREG(0x14C0)
-#define EXYNOS5_CMU_SYSCLK_ISP_SYS_PWR_REG                     S5P_PMUREG(0x14C4)
-#define EXYNOS5_CMU_SYSCLK_MFC_SYS_PWR_REG                     S5P_PMUREG(0x14C8)
-#define EXYNOS5_CMU_SYSCLK_G3D_SYS_PWR_REG                     S5P_PMUREG(0x14CC)
-#define EXYNOS5_CMU_SYSCLK_DISP1_SYS_PWR_REG                   S5P_PMUREG(0x14D4)
-#define EXYNOS5_CMU_SYSCLK_MAU_SYS_PWR_REG                     S5P_PMUREG(0x14D8)
-#define EXYNOS5_CMU_RESET_GSCL_SYS_PWR_REG                     S5P_PMUREG(0x1580)
-#define EXYNOS5_CMU_RESET_ISP_SYS_PWR_REG                      S5P_PMUREG(0x1584)
-#define EXYNOS5_CMU_RESET_MFC_SYS_PWR_REG                      S5P_PMUREG(0x1588)
-#define EXYNOS5_CMU_RESET_G3D_SYS_PWR_REG                      S5P_PMUREG(0x158C)
-#define EXYNOS5_CMU_RESET_DISP1_SYS_PWR_REG                    S5P_PMUREG(0x1594)
-#define EXYNOS5_CMU_RESET_MAU_SYS_PWR_REG                      S5P_PMUREG(0x1598)
+#define EXYNOS5_ARM_CORE0_SYS_PWR_REG                          0x1000
+#define EXYNOS5_DIS_IRQ_ARM_CORE0_LOCAL_SYS_PWR_REG            0x1004
+#define EXYNOS5_DIS_IRQ_ARM_CORE0_CENTRAL_SYS_PWR_REG          0x1008
+#define EXYNOS5_ARM_CORE1_SYS_PWR_REG                          0x1010
+#define EXYNOS5_DIS_IRQ_ARM_CORE1_LOCAL_SYS_PWR_REG            0x1014
+#define EXYNOS5_DIS_IRQ_ARM_CORE1_CENTRAL_SYS_PWR_REG          0x1018
+#define EXYNOS5_FSYS_ARM_SYS_PWR_REG                           0x1040
+#define EXYNOS5_DIS_IRQ_FSYS_ARM_CENTRAL_SYS_PWR_REG           0x1048
+#define EXYNOS5_ISP_ARM_SYS_PWR_REG                            0x1050
+#define EXYNOS5_DIS_IRQ_ISP_ARM_LOCAL_SYS_PWR_REG              0x1054
+#define EXYNOS5_DIS_IRQ_ISP_ARM_CENTRAL_SYS_PWR_REG            0x1058
+#define EXYNOS5_ARM_COMMON_SYS_PWR_REG                         0x1080
+#define EXYNOS5_ARM_L2_SYS_PWR_REG                             0x10C0
+#define EXYNOS5_CMU_ACLKSTOP_SYS_PWR_REG                       0x1100
+#define EXYNOS5_CMU_SCLKSTOP_SYS_PWR_REG                       0x1104
+#define EXYNOS5_CMU_RESET_SYS_PWR_REG                          0x110C
+#define EXYNOS5_CMU_ACLKSTOP_SYSMEM_SYS_PWR_REG                        0x1120
+#define EXYNOS5_CMU_SCLKSTOP_SYSMEM_SYS_PWR_REG                        0x1124
+#define EXYNOS5_CMU_RESET_SYSMEM_SYS_PWR_REG                   0x112C
+#define EXYNOS5_DRAM_FREQ_DOWN_SYS_PWR_REG                     0x1130
+#define EXYNOS5_DDRPHY_DLLOFF_SYS_PWR_REG                      0x1134
+#define EXYNOS5_DDRPHY_DLLLOCK_SYS_PWR_REG                     0x1138
+#define EXYNOS5_APLL_SYSCLK_SYS_PWR_REG                                0x1140
+#define EXYNOS5_MPLL_SYSCLK_SYS_PWR_REG                                0x1144
+#define EXYNOS5_VPLL_SYSCLK_SYS_PWR_REG                                0x1148
+#define EXYNOS5_EPLL_SYSCLK_SYS_PWR_REG                                0x114C
+#define EXYNOS5_BPLL_SYSCLK_SYS_PWR_REG                                0x1150
+#define EXYNOS5_CPLL_SYSCLK_SYS_PWR_REG                                0x1154
+#define EXYNOS5_MPLLUSER_SYSCLK_SYS_PWR_REG                    0x1164
+#define EXYNOS5_BPLLUSER_SYSCLK_SYS_PWR_REG                    0x1170
+#define EXYNOS5_TOP_BUS_SYS_PWR_REG                            0x1180
+#define EXYNOS5_TOP_RETENTION_SYS_PWR_REG                      0x1184
+#define EXYNOS5_TOP_PWR_SYS_PWR_REG                            0x1188
+#define EXYNOS5_TOP_BUS_SYSMEM_SYS_PWR_REG                     0x1190
+#define EXYNOS5_TOP_RETENTION_SYSMEM_SYS_PWR_REG               0x1194
+#define EXYNOS5_TOP_PWR_SYSMEM_SYS_PWR_REG                     0x1198
+#define EXYNOS5_LOGIC_RESET_SYS_PWR_REG                                0x11A0
+#define EXYNOS5_OSCCLK_GATE_SYS_PWR_REG                                0x11A4
+#define EXYNOS5_LOGIC_RESET_SYSMEM_SYS_PWR_REG                 0x11B0
+#define EXYNOS5_OSCCLK_GATE_SYSMEM_SYS_PWR_REG                 0x11B4
+#define EXYNOS5_USBOTG_MEM_SYS_PWR_REG                         0x11C0
+#define EXYNOS5_G2D_MEM_SYS_PWR_REG                            0x11C8
+#define EXYNOS5_USBDRD_MEM_SYS_PWR_REG                         0x11CC
+#define EXYNOS5_SDMMC_MEM_SYS_PWR_REG                          0x11D0
+#define EXYNOS5_CSSYS_MEM_SYS_PWR_REG                          0x11D4
+#define EXYNOS5_SECSS_MEM_SYS_PWR_REG                          0x11D8
+#define EXYNOS5_ROTATOR_MEM_SYS_PWR_REG                                0x11DC
+#define EXYNOS5_INTRAM_MEM_SYS_PWR_REG                         0x11E0
+#define EXYNOS5_INTROM_MEM_SYS_PWR_REG                         0x11E4
+#define EXYNOS5_JPEG_MEM_SYS_PWR_REG                           0x11E8
+#define EXYNOS5_HSI_MEM_SYS_PWR_REG                            0x11EC
+#define EXYNOS5_MCUIOP_MEM_SYS_PWR_REG                         0x11F4
+#define EXYNOS5_SATA_MEM_SYS_PWR_REG                           0x11FC
+#define EXYNOS5_PAD_RETENTION_DRAM_SYS_PWR_REG                 0x1200
+#define EXYNOS5_PAD_RETENTION_MAU_SYS_PWR_REG                  0x1204
+#define EXYNOS5_PAD_RETENTION_EFNAND_SYS_PWR_REG               0x1208
+#define EXYNOS5_PAD_RETENTION_GPIO_SYS_PWR_REG                 0x1220
+#define EXYNOS5_PAD_RETENTION_UART_SYS_PWR_REG                 0x1224
+#define EXYNOS5_PAD_RETENTION_MMCA_SYS_PWR_REG                 0x1228
+#define EXYNOS5_PAD_RETENTION_MMCB_SYS_PWR_REG                 0x122C
+#define EXYNOS5_PAD_RETENTION_EBIA_SYS_PWR_REG                 0x1230
+#define EXYNOS5_PAD_RETENTION_EBIB_SYS_PWR_REG                 0x1234
+#define EXYNOS5_PAD_RETENTION_SPI_SYS_PWR_REG                  0x1238
+#define EXYNOS5_PAD_RETENTION_GPIO_SYSMEM_SYS_PWR_REG          0x123C
+#define EXYNOS5_PAD_ISOLATION_SYS_PWR_REG                      0x1240
+#define EXYNOS5_PAD_ISOLATION_SYSMEM_SYS_PWR_REG               0x1250
+#define EXYNOS5_PAD_ALV_SEL_SYS_PWR_REG                                0x1260
+#define EXYNOS5_XUSBXTI_SYS_PWR_REG                            0x1280
+#define EXYNOS5_XXTI_SYS_PWR_REG                               0x1284
+#define EXYNOS5_EXT_REGULATOR_SYS_PWR_REG                      0x12C0
+#define EXYNOS5_GPIO_MODE_SYS_PWR_REG                          0x1300
+#define EXYNOS5_GPIO_MODE_SYSMEM_SYS_PWR_REG                   0x1320
+#define EXYNOS5_GPIO_MODE_MAU_SYS_PWR_REG                      0x1340
+#define EXYNOS5_TOP_ASB_RESET_SYS_PWR_REG                      0x1344
+#define EXYNOS5_TOP_ASB_ISOLATION_SYS_PWR_REG                  0x1348
+#define EXYNOS5_GSCL_SYS_PWR_REG                               0x1400
+#define EXYNOS5_ISP_SYS_PWR_REG                                        0x1404
+#define EXYNOS5_MFC_SYS_PWR_REG                                        0x1408
+#define EXYNOS5_G3D_SYS_PWR_REG                                        0x140C
+#define EXYNOS5_DISP1_SYS_PWR_REG                              0x1414
+#define EXYNOS5_MAU_SYS_PWR_REG                                        0x1418
+#define EXYNOS5_CMU_CLKSTOP_GSCL_SYS_PWR_REG                   0x1480
+#define EXYNOS5_CMU_CLKSTOP_ISP_SYS_PWR_REG                    0x1484
+#define EXYNOS5_CMU_CLKSTOP_MFC_SYS_PWR_REG                    0x1488
+#define EXYNOS5_CMU_CLKSTOP_G3D_SYS_PWR_REG                    0x148C
+#define EXYNOS5_CMU_CLKSTOP_DISP1_SYS_PWR_REG                  0x1494
+#define EXYNOS5_CMU_CLKSTOP_MAU_SYS_PWR_REG                    0x1498
+#define EXYNOS5_CMU_SYSCLK_GSCL_SYS_PWR_REG                    0x14C0
+#define EXYNOS5_CMU_SYSCLK_ISP_SYS_PWR_REG                     0x14C4
+#define EXYNOS5_CMU_SYSCLK_MFC_SYS_PWR_REG                     0x14C8
+#define EXYNOS5_CMU_SYSCLK_G3D_SYS_PWR_REG                     0x14CC
+#define EXYNOS5_CMU_SYSCLK_DISP1_SYS_PWR_REG                   0x14D4
+#define EXYNOS5_CMU_SYSCLK_MAU_SYS_PWR_REG                     0x14D8
+#define EXYNOS5_CMU_RESET_GSCL_SYS_PWR_REG                     0x1580
+#define EXYNOS5_CMU_RESET_ISP_SYS_PWR_REG                      0x1584
+#define EXYNOS5_CMU_RESET_MFC_SYS_PWR_REG                      0x1588
+#define EXYNOS5_CMU_RESET_G3D_SYS_PWR_REG                      0x158C
+#define EXYNOS5_CMU_RESET_DISP1_SYS_PWR_REG                    0x1594
+#define EXYNOS5_CMU_RESET_MAU_SYS_PWR_REG                      0x1598
 
-#define EXYNOS5_ARM_CORE0_OPTION                               S5P_PMUREG(0x2008)
-#define EXYNOS5_ARM_CORE1_OPTION                               S5P_PMUREG(0x2088)
-#define EXYNOS5_FSYS_ARM_OPTION                                        S5P_PMUREG(0x2208)
-#define EXYNOS5_ISP_ARM_OPTION                                 S5P_PMUREG(0x2288)
-#define EXYNOS5_ARM_COMMON_OPTION                              S5P_PMUREG(0x2408)
-#define EXYNOS5_ARM_L2_OPTION                                  S5P_PMUREG(0x2608)
-#define EXYNOS5_TOP_PWR_OPTION                                 S5P_PMUREG(0x2C48)
-#define EXYNOS5_TOP_PWR_SYSMEM_OPTION                          S5P_PMUREG(0x2CC8)
-#define EXYNOS5_JPEG_MEM_OPTION                                        S5P_PMUREG(0x2F48)
-#define EXYNOS5_GSCL_OPTION                                    S5P_PMUREG(0x4008)
-#define EXYNOS5_ISP_OPTION                                     S5P_PMUREG(0x4028)
-#define EXYNOS5_MFC_OPTION                                     S5P_PMUREG(0x4048)
-#define EXYNOS5_G3D_OPTION                                     S5P_PMUREG(0x4068)
-#define EXYNOS5_DISP1_OPTION                                   S5P_PMUREG(0x40A8)
-#define EXYNOS5_MAU_OPTION                                     S5P_PMUREG(0x40C8)
+#define EXYNOS5_ARM_CORE0_OPTION                               0x2008
+#define EXYNOS5_ARM_CORE1_OPTION                               0x2088
+#define EXYNOS5_FSYS_ARM_OPTION                                        0x2208
+#define EXYNOS5_ISP_ARM_OPTION                                 0x2288
+#define EXYNOS5_ARM_COMMON_OPTION                              0x2408
+#define EXYNOS5_ARM_L2_OPTION                                  0x2608
+#define EXYNOS5_TOP_PWR_OPTION                                 0x2C48
+#define EXYNOS5_TOP_PWR_SYSMEM_OPTION                          0x2CC8
+#define EXYNOS5_JPEG_MEM_OPTION                                        0x2F48
+#define EXYNOS5_GSCL_OPTION                                    0x4008
+#define EXYNOS5_ISP_OPTION                                     0x4028
+#define EXYNOS5_MFC_OPTION                                     0x4048
+#define EXYNOS5_G3D_OPTION                                     0x4068
+#define EXYNOS5_DISP1_OPTION                                   0x40A8
+#define EXYNOS5_MAU_OPTION                                     0x40C8
 
 #define EXYNOS5_USE_SC_FEEDBACK                                        (1 << 1)
 #define EXYNOS5_USE_SC_COUNTER                                 (1 << 0)
 
 #define EXYNOS5420_SWRESET_KFC_SEL                             0x3
 
+#include <asm/cputype.h>
+#define MAX_CPUS_IN_CLUSTER    4
+
+static inline unsigned int exynos_pmu_cpunr(unsigned int mpidr)
+{
+       return ((MPIDR_AFFINITY_LEVEL(mpidr, 1) * MAX_CPUS_IN_CLUSTER)
+                + MPIDR_AFFINITY_LEVEL(mpidr, 0));
+}
+
 #endif /* __ASM_ARCH_REGS_PMU_H */
diff --git a/arch/arm/mach-exynos/regs-sys.h b/arch/arm/mach-exynos/regs-sys.h
new file mode 100644 (file)
index 0000000..84332b0
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ *             http://www.samsung.com
+ *
+ * EXYNOS - system register definition
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+*/
+
+#ifndef __ASM_ARCH_REGS_SYS_H
+#define __ASM_ARCH_REGS_SYS_H __FILE__
+
+#include <mach/map.h>
+
+#define S5P_SYSREG(x)                          (S3C_VA_SYS + (x))
+
+/* For EXYNOS5 */
+#define EXYNOS5_SYS_I2C_CFG                    S5P_SYSREG(0x0234)
+
+#endif /* __ASM_ARCH_REGS_SYS_H */
index feee4dbb0760bfb4c4fa604ac1392bad4ae88a72..984882943f777540d7f0938e754a325194c79b76 100644 (file)
@@ -1,12 +1,36 @@
-config ARCH_HI3xxx
-       bool "Hisilicon Hi36xx/Hi37xx family" if ARCH_MULTI_V7
+config ARCH_HISI
+       bool "Hisilicon SoC Support"
+       depends on ARCH_MULTIPLATFORM
        select ARM_AMBA
        select ARM_GIC
        select ARM_TIMER_SP804
+       select POWER_RESET
+       select POWER_RESET_HISI
+       select POWER_SUPPLY
+
+if ARCH_HISI
+
+menu "Hisilicon platform type"
+
+config ARCH_HI3xxx
+       bool "Hisilicon Hi36xx family" if ARCH_MULTI_V7
+       select CACHE_L2X0
+       select HAVE_ARM_SCU if SMP
+       select HAVE_ARM_TWD if SMP
+       select PINCTRL
+       select PINCTRL_SINGLE
+       help
+         Support for Hisilicon Hi36xx SoC family
+
+config ARCH_HIX5HD2
+       bool "Hisilicon X5HD2 family" if ARCH_MULTI_V7
        select CACHE_L2X0
        select HAVE_ARM_SCU if SMP
        select HAVE_ARM_TWD if SMP
        select PINCTRL
        select PINCTRL_SINGLE
        help
-         Support for Hisilicon Hi36xx/Hi37xx processor family
+         Support for Hisilicon HIX5HD2 SoC family
+endmenu
+
+endif
index 2ae1b59267c23373af3c5dacd0876eec3c7d8f99..ee2506b9cde3c3bd660cbf49b4f0f146b2130f81 100644 (file)
@@ -3,4 +3,4 @@
 #
 
 obj-y  += hisilicon.o
-obj-$(CONFIG_SMP)              += platsmp.o hotplug.o
+obj-$(CONFIG_SMP)              += platsmp.o hotplug.o headsmp.o
index af23ec204538754440e4c822bf4d7bd6337fa970..88b1f487d06581683ef420d9924d1f614904f147 100644 (file)
@@ -12,4 +12,9 @@ extern void hi3xxx_cpu_die(unsigned int cpu);
 extern int hi3xxx_cpu_kill(unsigned int cpu);
 extern void hi3xxx_set_cpu(int cpu, bool enable);
 
+extern void hix5hd2_secondary_startup(void);
+extern struct smp_operations hix5hd2_smp_ops;
+extern void hix5hd2_set_cpu(int cpu, bool enable);
+extern void hix5hd2_cpu_die(unsigned int cpu);
+
 #endif
diff --git a/arch/arm/mach-hisi/headsmp.S b/arch/arm/mach-hisi/headsmp.S
new file mode 100644 (file)
index 0000000..278889c
--- /dev/null
@@ -0,0 +1,16 @@
+/*
+ *  Copyright (c) 2014 Hisilicon Limited.
+ *  Copyright (c) 2014 Linaro Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+#include <linux/linkage.h>
+#include <linux/init.h>
+
+       __CPUINIT
+
+ENTRY(hix5hd2_secondary_startup)
+       bl      v7_invalidate_l1
+       b       secondary_startup
index 741faf3e710062457a5dc1f25b5e89dcb82c1f27..7cda6dda3cd000a2c89bab157ff83d03ad6d9bdb 100644 (file)
 #include <linux/clk-provider.h>
 #include <linux/clocksource.h>
 #include <linux/irqchip.h>
-#include <linux/of_address.h>
-#include <linux/of_platform.h>
-
-#include <asm/proc-fns.h>
 
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 
-#include "core.h"
-
 #define HI3620_SYSCTRL_PHYS_BASE               0xfc802000
 #define HI3620_SYSCTRL_VIRT_BASE               0xfe802000
 
@@ -51,32 +45,6 @@ static void __init hi3620_map_io(void)
        iotable_init(hi3620_io_desc, ARRAY_SIZE(hi3620_io_desc));
 }
 
-static void hi3xxx_restart(enum reboot_mode mode, const char *cmd)
-{
-       struct device_node *np;
-       void __iomem *base;
-       int offset;
-
-       np = of_find_compatible_node(NULL, NULL, "hisilicon,sysctrl");
-       if (!np) {
-               pr_err("failed to find hisilicon,sysctrl node\n");
-               return;
-       }
-       base = of_iomap(np, 0);
-       if (!base) {
-               pr_err("failed to map address in hisilicon,sysctrl node\n");
-               return;
-       }
-       if (of_property_read_u32(np, "reboot-offset", &offset) < 0) {
-               pr_err("failed to find reboot-offset property\n");
-               return;
-       }
-       writel_relaxed(0xdeadbeef, base + offset);
-
-       while (1)
-               cpu_do_idle();
-}
-
 static const char *hi3xxx_compat[] __initconst = {
        "hisilicon,hi3620-hi4511",
        NULL,
@@ -85,6 +53,13 @@ static const char *hi3xxx_compat[] __initconst = {
 DT_MACHINE_START(HI3620, "Hisilicon Hi3620 (Flattened Device Tree)")
        .map_io         = hi3620_map_io,
        .dt_compat      = hi3xxx_compat,
-       .smp            = smp_ops(hi3xxx_smp_ops),
-       .restart        = hi3xxx_restart,
+MACHINE_END
+
+static const char *hix5hd2_compat[] __initconst = {
+       "hisilicon,hix5hd2",
+       NULL,
+};
+
+DT_MACHINE_START(HIX5HD2_DT, "Hisilicon HIX5HD2 (Flattened Device Tree)")
+       .dt_compat      = hix5hd2_compat,
 MACHINE_END
index abd441b0c60425a9b196a10bbcb181d4ebbaa09e..84e6919f68c7316f3b866a0ba61087066eaa111d 100644 (file)
 #define CPU0_NEON_SRST_REQ_EN          (1 << 4)
 #define CPU0_SRST_REQ_EN               (1 << 0)
 
+#define HIX5HD2_PERI_CRG20             0x50
+#define CRG20_CPU1_RESET               (1 << 17)
+
+#define HIX5HD2_PERI_PMC0              0x1000
+#define PMC0_CPU1_WAIT_MTCOMS_ACK      (1 << 8)
+#define PMC0_CPU1_PMC_ENABLE           (1 << 7)
+#define PMC0_CPU1_POWERDOWN            (1 << 3)
+
 enum {
        HI3620_CTRL,
        ERROR_CTRL,
@@ -157,6 +165,50 @@ void hi3xxx_set_cpu(int cpu, bool enable)
                set_cpu_hi3620(cpu, enable);
 }
 
+static bool hix5hd2_hotplug_init(void)
+{
+       struct device_node *np;
+
+       np = of_find_compatible_node(NULL, NULL, "hisilicon,cpuctrl");
+       if (np) {
+               ctrl_base = of_iomap(np, 0);
+               return true;
+       }
+       return false;
+}
+
+void hix5hd2_set_cpu(int cpu, bool enable)
+{
+       u32 val = 0;
+
+       if (!ctrl_base)
+               if (!hix5hd2_hotplug_init())
+                       BUG();
+
+       if (enable) {
+               /* power on cpu1 */
+               val = readl_relaxed(ctrl_base + HIX5HD2_PERI_PMC0);
+               val &= ~(PMC0_CPU1_WAIT_MTCOMS_ACK | PMC0_CPU1_POWERDOWN);
+               val |= PMC0_CPU1_PMC_ENABLE;
+               writel_relaxed(val, ctrl_base + HIX5HD2_PERI_PMC0);
+               /* unreset */
+               val = readl_relaxed(ctrl_base + HIX5HD2_PERI_CRG20);
+               val &= ~CRG20_CPU1_RESET;
+               writel_relaxed(val, ctrl_base + HIX5HD2_PERI_CRG20);
+       } else {
+               /* power down cpu1 */
+               val = readl_relaxed(ctrl_base + HIX5HD2_PERI_PMC0);
+               val |= PMC0_CPU1_PMC_ENABLE | PMC0_CPU1_POWERDOWN;
+               val &= ~PMC0_CPU1_WAIT_MTCOMS_ACK;
+               writel_relaxed(val, ctrl_base + HIX5HD2_PERI_PMC0);
+
+               /* reset */
+               val = readl_relaxed(ctrl_base + HIX5HD2_PERI_CRG20);
+               val |= CRG20_CPU1_RESET;
+               writel_relaxed(val, ctrl_base + HIX5HD2_PERI_CRG20);
+       }
+}
+
 static inline void cpu_enter_lowpower(void)
 {
        unsigned int v;
@@ -199,4 +251,10 @@ int hi3xxx_cpu_kill(unsigned int cpu)
        hi3xxx_set_cpu(cpu, false);
        return 1;
 }
+
+void hix5hd2_cpu_die(unsigned int cpu)
+{
+       flush_cache_all();
+       hix5hd2_set_cpu(cpu, false);
+}
 #endif
index 471f1ee3be2b90d538b37b4185a9f481a600e64e..575dd8285f1fb67b6a7789f8fd27a1613692daf0 100644 (file)
@@ -17,6 +17,8 @@
 
 #include "core.h"
 
+#define HIX5HD2_BOOT_ADDRESS           0xffff0000
+
 static void __iomem *ctrl_base;
 
 void hi3xxx_set_cpu_jump(int cpu, void *jump_addr)
@@ -35,11 +37,9 @@ int hi3xxx_get_cpu_jump(int cpu)
        return readl_relaxed(ctrl_base + ((cpu - 1) << 2));
 }
 
-static void __init hi3xxx_smp_prepare_cpus(unsigned int max_cpus)
+static void __init hisi_enable_scu_a9(void)
 {
-       struct device_node *np = NULL;
        unsigned long base = 0;
-       u32 offset = 0;
        void __iomem *scu_base = NULL;
 
        if (scu_a9_has_base()) {
@@ -52,6 +52,14 @@ static void __init hi3xxx_smp_prepare_cpus(unsigned int max_cpus)
                scu_enable(scu_base);
                iounmap(scu_base);
        }
+}
+
+static void __init hi3xxx_smp_prepare_cpus(unsigned int max_cpus)
+{
+       struct device_node *np = NULL;
+       u32 offset = 0;
+
+       hisi_enable_scu_a9();
        if (!ctrl_base) {
                np = of_find_compatible_node(NULL, NULL, "hisilicon,sysctrl");
                if (!np) {
@@ -87,3 +95,42 @@ struct smp_operations hi3xxx_smp_ops __initdata = {
        .cpu_kill               = hi3xxx_cpu_kill,
 #endif
 };
+
+static void __init hix5hd2_smp_prepare_cpus(unsigned int max_cpus)
+{
+       hisi_enable_scu_a9();
+}
+
+void hix5hd2_set_scu_boot_addr(phys_addr_t start_addr, phys_addr_t jump_addr)
+{
+       void __iomem *virt;
+
+       virt = ioremap(start_addr, PAGE_SIZE);
+
+       writel_relaxed(0xe51ff004, virt);       /* ldr pc, [rc, #-4] */
+       writel_relaxed(jump_addr, virt + 4);    /* pc jump phy address */
+       iounmap(virt);
+}
+
+static int hix5hd2_boot_secondary(unsigned int cpu, struct task_struct *idle)
+{
+       phys_addr_t jumpaddr;
+
+       jumpaddr = virt_to_phys(hix5hd2_secondary_startup);
+       hix5hd2_set_scu_boot_addr(HIX5HD2_BOOT_ADDRESS, jumpaddr);
+       hix5hd2_set_cpu(cpu, true);
+       arch_send_wakeup_ipi_mask(cpumask_of(cpu));
+       return 0;
+}
+
+
+struct smp_operations hix5hd2_smp_ops __initdata = {
+       .smp_prepare_cpus       = hix5hd2_smp_prepare_cpus,
+       .smp_boot_secondary     = hix5hd2_boot_secondary,
+#ifdef CONFIG_HOTPLUG_CPU
+       .cpu_die                = hix5hd2_cpu_die,
+#endif
+};
+
+CPU_METHOD_OF_DECLARE(hi3xxx_smp, "hisilicon,hi3620-smp", &hi3xxx_smp_ops);
+CPU_METHOD_OF_DECLARE(hix5hd2_smp, "hisilicon,hix5hd2-smp", &hix5hd2_smp_ops);
index ab6bcfd2e220a82e9ebaf38709d91a30ac50d62d..9de84a215abd98adc78e9c480d19603da6e82637 100644 (file)
@@ -64,18 +64,8 @@ config IMX_HAVE_IOMUX_V1
 config ARCH_MXC_IOMUX_V3
        bool
 
-config ARCH_MX1
-       bool
-
-config ARCH_MX25
-       bool
-
-config MACH_MX27
-       bool
-
 config SOC_IMX1
        bool
-       select ARCH_MX1
        select CPU_ARM920T
        select IMX_HAVE_IOMUX_V1
        select MXC_AVIC
@@ -88,7 +78,6 @@ config SOC_IMX21
 
 config SOC_IMX25
        bool
-       select ARCH_MX25
        select ARCH_MXC_IOMUX_V3
        select CPU_ARM926T
        select MXC_AVIC
@@ -99,7 +88,6 @@ config SOC_IMX27
        select ARCH_HAS_OPP
        select CPU_ARM926T
        select IMX_HAVE_IOMUX_V1
-       select MACH_MX27
        select MXC_AVIC
        select PINCTRL_IMX27
 
@@ -118,18 +106,6 @@ config SOC_IMX35
        select PINCTRL_IMX35
        select SMP_ON_UP if SMP
 
-config SOC_IMX5
-       bool
-       select ARCH_HAS_OPP
-       select ARCH_MXC_IOMUX_V3
-       select MXC_TZIC
-
-config SOC_IMX51
-       bool
-       select HAVE_IMX_SRC
-       select PINCTRL_IMX51
-       select SOC_IMX5
-
 if ARCH_MULTI_V4T
 
 comment "MX1 platforms:"
@@ -365,15 +341,6 @@ config MACH_IMX27_VISSTRIM_M10
          This includes specific configurations for the board and its
          peripherals.
 
-config MACH_IMX27LITE
-       bool "LogicPD MX27 LITEKIT platform"
-       select IMX_HAVE_PLATFORM_IMX_SSI
-       select IMX_HAVE_PLATFORM_IMX_UART
-       select SOC_IMX27
-       help
-         Include support for MX27 LITEKIT platform. This includes specific
-         configurations for the board and its peripherals.
-
 config MACH_PCA100
        bool "Phytec phyCARD-s (pca100)"
        select IMX_HAVE_PLATFORM_FSL_USB2_UDC
@@ -405,15 +372,6 @@ config MACH_MXT_TD60
          Include support for i-MXT (aka td60) platform. This
          includes specific configurations for the module and its peripherals.
 
-config MACH_IMX27IPCAM
-       bool "IMX27 IPCAM platform"
-       select IMX_HAVE_PLATFORM_IMX2_WDT
-       select IMX_HAVE_PLATFORM_IMX_UART
-       select SOC_IMX27
-       help
-         Include support for IMX27 IPCAM platform. This includes specific
-         configurations for the board and its peripherals.
-
 config MACH_IMX27_DT
        bool "Support i.MX27 platforms from device tree"
        select SOC_IMX27
@@ -699,24 +657,29 @@ if ARCH_MULTI_V7
 
 comment "Device tree only"
 
+config SOC_IMX5
+       bool
+       select ARCH_HAS_OPP
+       select HAVE_IMX_SRC
+       select MXC_TZIC
+
 config SOC_IMX50
        bool "i.MX50 support"
-       select HAVE_IMX_SRC
        select PINCTRL_IMX50
        select SOC_IMX5
 
        help
          This enables support for Freescale i.MX50 processor.
 
-config MACH_IMX51_DT
+config SOC_IMX51
        bool "i.MX51 support"
-       select SOC_IMX51
+       select PINCTRL_IMX51
+       select SOC_IMX5
        help
          This enables support for Freescale i.MX51 processor
 
 config SOC_IMX53
        bool "i.MX53 support"
-       select HAVE_IMX_SRC
        select PINCTRL_IMX53
        select SOC_IMX5
 
@@ -733,8 +696,6 @@ config SOC_IMX6
        select HAVE_IMX_MMDC
        select HAVE_IMX_SRC
        select MFD_SYSCON
-       select PL310_ERRATA_588369 if CACHE_L2X0
-       select PL310_ERRATA_727915 if CACHE_L2X0
        select PL310_ERRATA_769419 if CACHE_L2X0
 
 config SOC_IMX6Q
@@ -770,8 +731,6 @@ config SOC_VF610
        select ARM_GIC
        select PINCTRL_VF610
        select VF_PIT_TIMER
-       select PL310_ERRATA_588369 if CACHE_L2X0
-       select PL310_ERRATA_727915 if CACHE_L2X0
        select PL310_ERRATA_769419 if CACHE_L2X0
 
        help
index bbe93bbfd0034ff2b3e01ee5653073a5c4878bba..ac88599ca0805a5cc7da4c79f308fe83963183c4 100644 (file)
@@ -12,7 +12,7 @@ obj-$(CONFIG_SOC_IMX31) += mm-imx3.o cpu-imx31.o clk-imx31.o iomux-imx31.o ehci-
 obj-$(CONFIG_SOC_IMX35) += mm-imx3.o cpu-imx35.o clk-imx35.o ehci-imx35.o pm-imx3.o
 
 imx5-pm-$(CONFIG_PM) += pm-imx5.o
-obj-$(CONFIG_SOC_IMX5) += cpu-imx5.o mm-imx5.o clk-imx51-imx53.o ehci-imx5.o $(imx5-pm-y)
+obj-$(CONFIG_SOC_IMX5) += cpu-imx5.o clk-imx51-imx53.o $(imx5-pm-y)
 
 obj-$(CONFIG_COMMON_CLK) += clk-pllv1.o clk-pllv2.o clk-pllv3.o clk-gate2.o \
                            clk-pfd.o clk-busy.o clk.o \
@@ -31,6 +31,8 @@ ifeq ($(CONFIG_CPU_IDLE),y)
 obj-$(CONFIG_SOC_IMX5) += cpuidle-imx5.o
 obj-$(CONFIG_SOC_IMX6Q) += cpuidle-imx6q.o
 obj-$(CONFIG_SOC_IMX6SL) += cpuidle-imx6sl.o
+# i.MX6SX reuses i.MX6Q cpuidle driver
+obj-$(CONFIG_SOC_IMX6SX) += cpuidle-imx6q.o
 endif
 
 ifdef CONFIG_SND_IMX_SOC
@@ -38,9 +40,6 @@ obj-y += ssi-fiq.o
 obj-y += ssi-fiq-ksym.o
 endif
 
-# Support for CMOS sensor interface
-obj-$(CONFIG_MX1_VIDEO) += mx1-camera-fiq.o mx1-camera-fiq-ksym.o
-
 # i.MX1 based machines
 obj-$(CONFIG_ARCH_MX1ADS) += mach-mx1ads.o
 obj-$(CONFIG_MACH_SCB9328) += mach-scb9328.o
@@ -60,13 +59,11 @@ obj-$(CONFIG_MACH_MX27ADS) += mach-mx27ads.o
 obj-$(CONFIG_MACH_PCM038) += mach-pcm038.o
 obj-$(CONFIG_MACH_PCM970_BASEBOARD) += pcm970-baseboard.o
 obj-$(CONFIG_MACH_MX27_3DS) += mach-mx27_3ds.o
-obj-$(CONFIG_MACH_IMX27LITE) += mach-imx27lite.o
 obj-$(CONFIG_MACH_IMX27_VISSTRIM_M10) += mach-imx27_visstrim_m10.o
 obj-$(CONFIG_MACH_CPUIMX27) += mach-cpuimx27.o
 obj-$(CONFIG_MACH_EUKREA_MBIMX27_BASEBOARD) += eukrea_mbimx27-baseboard.o
 obj-$(CONFIG_MACH_PCA100) += mach-pca100.o
 obj-$(CONFIG_MACH_MXT_TD60) += mach-mxt_td60.o
-obj-$(CONFIG_MACH_IMX27IPCAM) += mach-imx27ipcam.o
 obj-$(CONFIG_MACH_IMX27_DT) += imx27-dt.o
 
 # i.MX31 based machines
@@ -109,8 +106,8 @@ obj-$(CONFIG_SOC_IMX6) += suspend-imx6.o
 endif
 obj-$(CONFIG_SOC_IMX6) += pm-imx6.o
 
-obj-$(CONFIG_MACH_IMX51_DT) += imx51-dt.o
 obj-$(CONFIG_SOC_IMX50) += mach-imx50.o
+obj-$(CONFIG_SOC_IMX51) += mach-imx51.o
 obj-$(CONFIG_SOC_IMX53) += mach-imx53.o
 
 obj-$(CONFIG_SOC_VF610) += clk-vf610.o mach-vf610.o
index 7f739be3de2c940ab003eae5a03b854e7998fbe2..37c307a8d8962c1c6b80aab4e2650bfe2286d641 100644 (file)
  * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
-#include <linux/kernel.h>
-#include <linux/init.h>
 #include <linux/clk.h>
-#include <linux/io.h>
 #include <linux/clkdev.h>
+#include <linux/clk-provider.h>
 #include <linux/err.h>
+#include <linux/init.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <dt-bindings/clock/imx1-clock.h>
 
 #include "clk.h"
 #include "common.h"
 #include "hardware.h"
 
-/* CCM register addresses */
-#define IO_ADDR_CCM(off)       (MX1_IO_ADDRESS(MX1_CCM_BASE_ADDR + (off)))
-
-#define CCM_CSCR       IO_ADDR_CCM(0x0)
-#define CCM_MPCTL0     IO_ADDR_CCM(0x4)
-#define CCM_SPCTL0     IO_ADDR_CCM(0xc)
-#define CCM_PCDR       IO_ADDR_CCM(0x20)
-
-/* SCM register addresses */
-#define IO_ADDR_SCM(off)       (MX1_IO_ADDRESS(MX1_SCM_BASE_ADDR + (off)))
-
-#define SCM_GCCR       IO_ADDR_SCM(0xc)
-
 static const char *prem_sel_clks[] = { "clk32_premult", "clk16m", };
 static const char *clko_sel_clks[] = { "per1", "hclk", "clk48m", "clk16m",
                                       "prem", "fclk", };
 
-enum imx1_clks {
-       dummy, clk32, clk16m_ext, clk16m, clk32_premult, prem, mpll, mpll_gate,
-       spll, spll_gate, mcu, fclk, hclk, clk48m, per1, per2, per3, clko,
-       uart3_gate, ssi2_gate, brom_gate, dma_gate, csi_gate, mma_gate,
-       usbd_gate, clk_max
-};
+static struct clk *clk[IMX1_CLK_MAX];
+static struct clk_onecell_data clk_data;
 
-static struct clk *clk[clk_max];
+static void __iomem *ccm __initdata;
+#define CCM_CSCR       (ccm + 0x0000)
+#define CCM_MPCTL0     (ccm + 0x0004)
+#define CCM_SPCTL0     (ccm + 0x000c)
+#define CCM_PCDR       (ccm + 0x0020)
+#define SCM_GCCR       (ccm + 0x0810)
 
-int __init mx1_clocks_init(unsigned long fref)
+static void __init _mx1_clocks_init(unsigned long fref)
 {
-       int i;
+       clk[IMX1_CLK_DUMMY] = imx_clk_fixed("dummy", 0);
+       clk[IMX1_CLK_CLK32] = imx_obtain_fixed_clock("clk32", fref);
+       clk[IMX1_CLK_CLK16M_EXT] = imx_clk_fixed("clk16m_ext", 16000000);
+       clk[IMX1_CLK_CLK16M] = imx_clk_gate("clk16m", "clk16m_ext", CCM_CSCR, 17);
+       clk[IMX1_CLK_CLK32_PREMULT] = imx_clk_fixed_factor("clk32_premult", "clk32", 512, 1);
+       clk[IMX1_CLK_PREM] = imx_clk_mux("prem", CCM_CSCR, 16, 1, prem_sel_clks, ARRAY_SIZE(prem_sel_clks));
+       clk[IMX1_CLK_MPLL] = imx_clk_pllv1("mpll", "clk32_premult", CCM_MPCTL0);
+       clk[IMX1_CLK_MPLL_GATE] = imx_clk_gate("mpll_gate", "mpll", CCM_CSCR, 0);
+       clk[IMX1_CLK_SPLL] = imx_clk_pllv1("spll", "prem", CCM_SPCTL0);
+       clk[IMX1_CLK_SPLL_GATE] = imx_clk_gate("spll_gate", "spll", CCM_CSCR, 1);
+       clk[IMX1_CLK_MCU] = imx_clk_divider("mcu", "clk32_premult", CCM_CSCR, 15, 1);
+       clk[IMX1_CLK_FCLK] = imx_clk_divider("fclk", "mpll_gate", CCM_CSCR, 15, 1);
+       clk[IMX1_CLK_HCLK] = imx_clk_divider("hclk", "spll_gate", CCM_CSCR, 10, 4);
+       clk[IMX1_CLK_CLK48M] = imx_clk_divider("clk48m", "spll_gate", CCM_CSCR, 26, 3);
+       clk[IMX1_CLK_PER1] = imx_clk_divider("per1", "spll_gate", CCM_PCDR, 0, 4);
+       clk[IMX1_CLK_PER2] = imx_clk_divider("per2", "spll_gate", CCM_PCDR, 4, 4);
+       clk[IMX1_CLK_PER3] = imx_clk_divider("per3", "spll_gate", CCM_PCDR, 16, 7);
+       clk[IMX1_CLK_CLKO] = imx_clk_mux("clko", CCM_CSCR, 29, 3, clko_sel_clks, ARRAY_SIZE(clko_sel_clks));
+       clk[IMX1_CLK_UART3_GATE] = imx_clk_gate("uart3_gate", "hclk", SCM_GCCR, 6);
+       clk[IMX1_CLK_SSI2_GATE] = imx_clk_gate("ssi2_gate", "hclk", SCM_GCCR, 5);
+       clk[IMX1_CLK_BROM_GATE] = imx_clk_gate("brom_gate", "hclk", SCM_GCCR, 4);
+       clk[IMX1_CLK_DMA_GATE] = imx_clk_gate("dma_gate", "hclk", SCM_GCCR, 3);
+       clk[IMX1_CLK_CSI_GATE] = imx_clk_gate("csi_gate", "hclk", SCM_GCCR, 2);
+       clk[IMX1_CLK_MMA_GATE] = imx_clk_gate("mma_gate", "hclk", SCM_GCCR, 1);
+       clk[IMX1_CLK_USBD_GATE] = imx_clk_gate("usbd_gate", "clk48m", SCM_GCCR, 0);
+
+       imx_check_clocks(clk, ARRAY_SIZE(clk));
+}
 
-       clk[dummy] = imx_clk_fixed("dummy", 0);
-       clk[clk32] = imx_clk_fixed("clk32", fref);
-       clk[clk16m_ext] = imx_clk_fixed("clk16m_ext", 16000000);
-       clk[clk16m] = imx_clk_gate("clk16m", "clk16m_ext", CCM_CSCR, 17);
-       clk[clk32_premult] = imx_clk_fixed_factor("clk32_premult", "clk32", 512, 1);
-       clk[prem] = imx_clk_mux("prem", CCM_CSCR, 16, 1, prem_sel_clks,
-                       ARRAY_SIZE(prem_sel_clks));
-       clk[mpll] = imx_clk_pllv1("mpll", "clk32_premult", CCM_MPCTL0);
-       clk[mpll_gate] = imx_clk_gate("mpll_gate", "mpll", CCM_CSCR, 0);
-       clk[spll] = imx_clk_pllv1("spll", "prem", CCM_SPCTL0);
-       clk[spll_gate] = imx_clk_gate("spll_gate", "spll", CCM_CSCR, 1);
-       clk[mcu] = imx_clk_divider("mcu", "clk32_premult", CCM_CSCR, 15, 1);
-       clk[fclk] = imx_clk_divider("fclk", "mpll_gate", CCM_CSCR, 15, 1);
-       clk[hclk] = imx_clk_divider("hclk", "spll_gate", CCM_CSCR, 10, 4);
-       clk[clk48m] = imx_clk_divider("clk48m", "spll_gate", CCM_CSCR, 26, 3);
-       clk[per1] = imx_clk_divider("per1", "spll_gate", CCM_PCDR, 0, 4);
-       clk[per2] = imx_clk_divider("per2", "spll_gate", CCM_PCDR, 4, 4);
-       clk[per3] = imx_clk_divider("per3", "spll_gate", CCM_PCDR, 16, 7);
-       clk[clko] = imx_clk_mux("clko", CCM_CSCR, 29, 3, clko_sel_clks,
-                       ARRAY_SIZE(clko_sel_clks));
-       clk[uart3_gate] = imx_clk_gate("uart3_gate", "hclk", SCM_GCCR, 6);
-       clk[ssi2_gate] = imx_clk_gate("ssi2_gate", "hclk", SCM_GCCR, 5);
-       clk[brom_gate] = imx_clk_gate("brom_gate", "hclk", SCM_GCCR, 4);
-       clk[dma_gate] = imx_clk_gate("dma_gate", "hclk", SCM_GCCR, 3);
-       clk[csi_gate] = imx_clk_gate("csi_gate", "hclk", SCM_GCCR, 2);
-       clk[mma_gate] = imx_clk_gate("mma_gate", "hclk", SCM_GCCR, 1);
-       clk[usbd_gate] = imx_clk_gate("usbd_gate", "clk48m", SCM_GCCR, 0);
+int __init mx1_clocks_init(unsigned long fref)
+{
+       ccm = MX1_IO_ADDRESS(MX1_CCM_BASE_ADDR);
 
-       for (i = 0; i < ARRAY_SIZE(clk); i++)
-               if (IS_ERR(clk[i]))
-                       pr_err("imx1 clk %d: register failed with %ld\n",
-                               i, PTR_ERR(clk[i]));
+       _mx1_clocks_init(fref);
 
-       clk_register_clkdev(clk[dma_gate], "ahb", "imx1-dma");
-       clk_register_clkdev(clk[hclk], "ipg", "imx1-dma");
-       clk_register_clkdev(clk[per1], "per", "imx-gpt.0");
-       clk_register_clkdev(clk[hclk], "ipg", "imx-gpt.0");
-       clk_register_clkdev(clk[per1], "per", "imx1-uart.0");
-       clk_register_clkdev(clk[hclk], "ipg", "imx1-uart.0");
-       clk_register_clkdev(clk[per1], "per", "imx1-uart.1");
-       clk_register_clkdev(clk[hclk], "ipg", "imx1-uart.1");
-       clk_register_clkdev(clk[per1], "per", "imx1-uart.2");
-       clk_register_clkdev(clk[uart3_gate], "ipg", "imx1-uart.2");
-       clk_register_clkdev(clk[hclk], NULL, "imx1-i2c.0");
-       clk_register_clkdev(clk[per2], "per", "imx1-cspi.0");
-       clk_register_clkdev(clk[dummy], "ipg", "imx1-cspi.0");
-       clk_register_clkdev(clk[per2], "per", "imx1-cspi.1");
-       clk_register_clkdev(clk[dummy], "ipg", "imx1-cspi.1");
-       clk_register_clkdev(clk[per2], "per", "imx1-fb.0");
-       clk_register_clkdev(clk[dummy], "ipg", "imx1-fb.0");
-       clk_register_clkdev(clk[dummy], "ahb", "imx1-fb.0");
+       clk_register_clkdev(clk[IMX1_CLK_PER1], "per", "imx-gpt.0");
+       clk_register_clkdev(clk[IMX1_CLK_HCLK], "ipg", "imx-gpt.0");
+       clk_register_clkdev(clk[IMX1_CLK_DMA_GATE], "ahb", "imx1-dma");
+       clk_register_clkdev(clk[IMX1_CLK_HCLK], "ipg", "imx1-dma");
+       clk_register_clkdev(clk[IMX1_CLK_PER1], "per", "imx1-uart.0");
+       clk_register_clkdev(clk[IMX1_CLK_HCLK], "ipg", "imx1-uart.0");
+       clk_register_clkdev(clk[IMX1_CLK_PER1], "per", "imx1-uart.1");
+       clk_register_clkdev(clk[IMX1_CLK_HCLK], "ipg", "imx1-uart.1");
+       clk_register_clkdev(clk[IMX1_CLK_PER1], "per", "imx1-uart.2");
+       clk_register_clkdev(clk[IMX1_CLK_UART3_GATE], "ipg", "imx1-uart.2");
+       clk_register_clkdev(clk[IMX1_CLK_HCLK], NULL, "imx1-i2c.0");
+       clk_register_clkdev(clk[IMX1_CLK_PER2], "per", "imx1-cspi.0");
+       clk_register_clkdev(clk[IMX1_CLK_DUMMY], "ipg", "imx1-cspi.0");
+       clk_register_clkdev(clk[IMX1_CLK_PER2], "per", "imx1-cspi.1");
+       clk_register_clkdev(clk[IMX1_CLK_DUMMY], "ipg", "imx1-cspi.1");
+       clk_register_clkdev(clk[IMX1_CLK_PER2], "per", "imx1-fb.0");
+       clk_register_clkdev(clk[IMX1_CLK_DUMMY], "ipg", "imx1-fb.0");
+       clk_register_clkdev(clk[IMX1_CLK_DUMMY], "ahb", "imx1-fb.0");
 
        mxc_timer_init(MX1_IO_ADDRESS(MX1_TIM1_BASE_ADDR), MX1_TIM1_INT);
 
        return 0;
 }
+
+static void __init mx1_clocks_init_dt(struct device_node *np)
+{
+       ccm = of_iomap(np, 0);
+       BUG_ON(!ccm);
+
+       _mx1_clocks_init(32768);
+
+       clk_data.clks = clk;
+       clk_data.clk_num = ARRAY_SIZE(clk);
+       of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
+}
+CLK_OF_DECLARE(imx1_ccm, "fsl,imx1-ccm", mx1_clocks_init_dt);
index bdc2e4630a082b4a8c376884616ea1b1dafedf94..4b4c75339aa674ab0bc3c6acb8f0de97e49bd7a4 100644 (file)
  * modify it under the terms of the GNU General Public License
  * as published by the Free Software Foundation; either version 2
  * of the License, or (at your option) any later version.
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301, USA.
  */
 
 #include <linux/clk.h>
-#include <linux/clkdev.h>
 #include <linux/clk-provider.h>
-#include <linux/io.h>
-#include <linux/module.h>
-#include <linux/err.h>
+#include <linux/clkdev.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <dt-bindings/clock/imx21-clock.h>
 
 #include "clk.h"
 #include "common.h"
 #include "hardware.h"
 
-#define IO_ADDR_CCM(off)       (MX21_IO_ADDRESS(MX21_CCM_BASE_ADDR + (off)))
+static void __iomem *ccm __initdata;
 
 /* Register offsets */
-#define CCM_CSCR               IO_ADDR_CCM(0x0)
-#define CCM_MPCTL0             IO_ADDR_CCM(0x4)
-#define CCM_MPCTL1             IO_ADDR_CCM(0x8)
-#define CCM_SPCTL0             IO_ADDR_CCM(0xc)
-#define CCM_SPCTL1             IO_ADDR_CCM(0x10)
-#define CCM_OSC26MCTL          IO_ADDR_CCM(0x14)
-#define CCM_PCDR0              IO_ADDR_CCM(0x18)
-#define CCM_PCDR1              IO_ADDR_CCM(0x1c)
-#define CCM_PCCR0              IO_ADDR_CCM(0x20)
-#define CCM_PCCR1              IO_ADDR_CCM(0x24)
-#define CCM_CCSR               IO_ADDR_CCM(0x28)
-#define CCM_PMCTL              IO_ADDR_CCM(0x2c)
-#define CCM_PMCOUNT            IO_ADDR_CCM(0x30)
-#define CCM_WKGDCTL            IO_ADDR_CCM(0x34)
-
-static const char *mpll_sel_clks[] = { "fpm", "ckih", };
-static const char *spll_sel_clks[] = { "fpm", "ckih", };
-
-enum imx21_clks {
-       ckil, ckih, fpm, mpll_sel, spll_sel, mpll, spll, fclk, hclk, ipg, per1,
-       per2, per3, per4, uart1_ipg_gate, uart2_ipg_gate, uart3_ipg_gate,
-       uart4_ipg_gate, gpt1_ipg_gate, gpt2_ipg_gate, gpt3_ipg_gate,
-       pwm_ipg_gate, sdhc1_ipg_gate, sdhc2_ipg_gate, lcdc_ipg_gate,
-       lcdc_hclk_gate, cspi3_ipg_gate, cspi2_ipg_gate, cspi1_ipg_gate,
-       per4_gate, csi_hclk_gate, usb_div, usb_gate, usb_hclk_gate, ssi1_gate,
-       ssi2_gate, nfc_div, nfc_gate, dma_gate, dma_hclk_gate, brom_gate,
-       emma_gate, emma_hclk_gate, slcdc_gate, slcdc_hclk_gate, wdog_gate,
-       gpio_gate, i2c_gate, kpp_gate, owire_gate, rtc_gate, clk_max
-};
-
-static struct clk *clk[clk_max];
+#define CCM_CSCR       (ccm + 0x00)
+#define CCM_MPCTL0     (ccm + 0x04)
+#define CCM_SPCTL0     (ccm + 0x0c)
+#define CCM_PCDR0      (ccm + 0x18)
+#define CCM_PCDR1      (ccm + 0x1c)
+#define CCM_PCCR0      (ccm + 0x20)
+#define CCM_PCCR1      (ccm + 0x24)
+
+static const char *mpll_osc_sel_clks[] = { "ckih_gate", "ckih_div1p5", };
+static const char *mpll_sel_clks[] = { "fpm_gate", "mpll_osc_sel", };
+static const char *spll_sel_clks[] = { "fpm_gate", "mpll_osc_sel", };
+static const char *ssi_sel_clks[] = { "spll_gate", "mpll_gate", };
+
+static struct clk *clk[IMX21_CLK_MAX];
+static struct clk_onecell_data clk_data;
+
+static void __init _mx21_clocks_init(unsigned long lref, unsigned long href)
+{
+       BUG_ON(!ccm);
+
+       clk[IMX21_CLK_DUMMY] = imx_clk_fixed("dummy", 0);
+       clk[IMX21_CLK_CKIL] = imx_obtain_fixed_clock("ckil", lref);
+       clk[IMX21_CLK_CKIH] = imx_obtain_fixed_clock("ckih", href);
+       clk[IMX21_CLK_FPM] = imx_clk_fixed_factor("fpm", "ckil", 512, 1);
+       clk[IMX21_CLK_CKIH_DIV1P5] = imx_clk_fixed_factor("ckih_div1p5", "ckih_gate", 2, 3);
+
+       clk[IMX21_CLK_MPLL_GATE] = imx_clk_gate("mpll_gate", "mpll", CCM_CSCR, 0);
+       clk[IMX21_CLK_SPLL_GATE] = imx_clk_gate("spll_gate", "spll", CCM_CSCR, 1);
+       clk[IMX21_CLK_FPM_GATE] = imx_clk_gate("fpm_gate", "fpm", CCM_CSCR, 2);
+       clk[IMX21_CLK_CKIH_GATE] = imx_clk_gate_dis("ckih_gate", "ckih", CCM_CSCR, 3);
+       clk[IMX21_CLK_MPLL_OSC_SEL] = imx_clk_mux("mpll_osc_sel", CCM_CSCR, 4, 1, mpll_osc_sel_clks, ARRAY_SIZE(mpll_osc_sel_clks));
+       clk[IMX21_CLK_IPG] = imx_clk_divider("ipg", "hclk", CCM_CSCR, 9, 1);
+       clk[IMX21_CLK_HCLK] = imx_clk_divider("hclk", "fclk", CCM_CSCR, 10, 4);
+       clk[IMX21_CLK_MPLL_SEL] = imx_clk_mux("mpll_sel", CCM_CSCR, 16, 1, mpll_sel_clks, ARRAY_SIZE(mpll_sel_clks));
+       clk[IMX21_CLK_SPLL_SEL] = imx_clk_mux("spll_sel", CCM_CSCR, 17, 1, spll_sel_clks, ARRAY_SIZE(spll_sel_clks));
+       clk[IMX21_CLK_SSI1_SEL] = imx_clk_mux("ssi1_sel", CCM_CSCR, 19, 1, ssi_sel_clks, ARRAY_SIZE(ssi_sel_clks));
+       clk[IMX21_CLK_SSI2_SEL] = imx_clk_mux("ssi2_sel", CCM_CSCR, 20, 1, ssi_sel_clks, ARRAY_SIZE(ssi_sel_clks));
+       clk[IMX21_CLK_USB_DIV] = imx_clk_divider("usb_div", "spll_gate", CCM_CSCR, 26, 3);
+       clk[IMX21_CLK_FCLK] = imx_clk_divider("fclk", "mpll_gate", CCM_CSCR, 29, 3);
+
+       clk[IMX21_CLK_MPLL] = imx_clk_pllv1("mpll", "mpll_sel", CCM_MPCTL0);
+
+       clk[IMX21_CLK_SPLL] = imx_clk_pllv1("spll", "spll_sel", CCM_SPCTL0);
+
+       clk[IMX21_CLK_NFC_DIV] = imx_clk_divider("nfc_div", "fclk", CCM_PCDR0, 12, 4);
+       clk[IMX21_CLK_SSI1_DIV] = imx_clk_divider("ssi1_div", "ssi1_sel", CCM_PCDR0, 16, 6);
+       clk[IMX21_CLK_SSI2_DIV] = imx_clk_divider("ssi2_div", "ssi2_sel", CCM_PCDR0, 26, 6);
+
+       clk[IMX21_CLK_PER1] = imx_clk_divider("per1", "mpll_gate", CCM_PCDR1, 0, 6);
+       clk[IMX21_CLK_PER2] = imx_clk_divider("per2", "mpll_gate", CCM_PCDR1, 8, 6);
+       clk[IMX21_CLK_PER3] = imx_clk_divider("per3", "mpll_gate", CCM_PCDR1, 16, 6);
+       clk[IMX21_CLK_PER4] = imx_clk_divider("per4", "mpll_gate", CCM_PCDR1, 24, 6);
+
+       clk[IMX21_CLK_UART1_IPG_GATE] = imx_clk_gate("uart1_ipg_gate", "ipg", CCM_PCCR0, 0);
+       clk[IMX21_CLK_UART2_IPG_GATE] = imx_clk_gate("uart2_ipg_gate", "ipg", CCM_PCCR0, 1);
+       clk[IMX21_CLK_UART3_IPG_GATE] = imx_clk_gate("uart3_ipg_gate", "ipg", CCM_PCCR0, 2);
+       clk[IMX21_CLK_UART4_IPG_GATE] = imx_clk_gate("uart4_ipg_gate", "ipg", CCM_PCCR0, 3);
+       clk[IMX21_CLK_CSPI1_IPG_GATE] = imx_clk_gate("cspi1_ipg_gate", "ipg", CCM_PCCR0, 4);
+       clk[IMX21_CLK_CSPI2_IPG_GATE] = imx_clk_gate("cspi2_ipg_gate", "ipg", CCM_PCCR0, 5);
+       clk[IMX21_CLK_SSI1_GATE] = imx_clk_gate("ssi1_gate", "ipg", CCM_PCCR0, 6);
+       clk[IMX21_CLK_SSI2_GATE] = imx_clk_gate("ssi2_gate", "ipg", CCM_PCCR0, 7);
+       clk[IMX21_CLK_SDHC1_IPG_GATE] = imx_clk_gate("sdhc1_ipg_gate", "ipg", CCM_PCCR0, 9);
+       clk[IMX21_CLK_SDHC2_IPG_GATE] = imx_clk_gate("sdhc2_ipg_gate", "ipg", CCM_PCCR0, 10);
+       clk[IMX21_CLK_GPIO_GATE] = imx_clk_gate("gpio_gate", "ipg", CCM_PCCR0, 11);
+       clk[IMX21_CLK_I2C_GATE] = imx_clk_gate("i2c_gate", "ipg", CCM_PCCR0, 12);
+       clk[IMX21_CLK_DMA_GATE] = imx_clk_gate("dma_gate", "ipg", CCM_PCCR0, 13);
+       clk[IMX21_CLK_USB_GATE] = imx_clk_gate("usb_gate", "usb_div", CCM_PCCR0, 14);
+       clk[IMX21_CLK_EMMA_GATE] = imx_clk_gate("emma_gate", "ipg", CCM_PCCR0, 15);
+       clk[IMX21_CLK_SSI2_BAUD_GATE] = imx_clk_gate("ssi2_baud_gate", "ipg", CCM_PCCR0, 16);
+       clk[IMX21_CLK_SSI1_BAUD_GATE] = imx_clk_gate("ssi1_baud_gate", "ipg", CCM_PCCR0, 17);
+       clk[IMX21_CLK_LCDC_IPG_GATE] = imx_clk_gate("lcdc_ipg_gate", "ipg", CCM_PCCR0, 18);
+       clk[IMX21_CLK_NFC_GATE] = imx_clk_gate("nfc_gate", "nfc_div", CCM_PCCR0, 19);
+       clk[IMX21_CLK_SLCDC_HCLK_GATE] = imx_clk_gate("slcdc_hclk_gate", "hclk", CCM_PCCR0, 21);
+       clk[IMX21_CLK_PER4_GATE] = imx_clk_gate("per4_gate", "per4", CCM_PCCR0, 22);
+       clk[IMX21_CLK_BMI_GATE] = imx_clk_gate("bmi_gate", "hclk", CCM_PCCR0, 23);
+       clk[IMX21_CLK_USB_HCLK_GATE] = imx_clk_gate("usb_hclk_gate", "hclk", CCM_PCCR0, 24);
+       clk[IMX21_CLK_SLCDC_GATE] = imx_clk_gate("slcdc_gate", "hclk", CCM_PCCR0, 25);
+       clk[IMX21_CLK_LCDC_HCLK_GATE] = imx_clk_gate("lcdc_hclk_gate", "hclk", CCM_PCCR0, 26);
+       clk[IMX21_CLK_EMMA_HCLK_GATE] = imx_clk_gate("emma_hclk_gate", "hclk", CCM_PCCR0, 27);
+       clk[IMX21_CLK_BROM_GATE] = imx_clk_gate("brom_gate", "hclk", CCM_PCCR0, 28);
+       clk[IMX21_CLK_DMA_HCLK_GATE] = imx_clk_gate("dma_hclk_gate", "hclk", CCM_PCCR0, 30);
+       clk[IMX21_CLK_CSI_HCLK_GATE] = imx_clk_gate("csi_hclk_gate", "hclk", CCM_PCCR0, 31);
+
+       clk[IMX21_CLK_CSPI3_IPG_GATE] = imx_clk_gate("cspi3_ipg_gate", "ipg", CCM_PCCR1, 23);
+       clk[IMX21_CLK_WDOG_GATE] = imx_clk_gate("wdog_gate", "ipg", CCM_PCCR1, 24);
+       clk[IMX21_CLK_GPT1_IPG_GATE] = imx_clk_gate("gpt1_ipg_gate", "ipg", CCM_PCCR1, 25);
+       clk[IMX21_CLK_GPT2_IPG_GATE] = imx_clk_gate("gpt2_ipg_gate", "ipg", CCM_PCCR1, 26);
+       clk[IMX21_CLK_GPT3_IPG_GATE] = imx_clk_gate("gpt3_ipg_gate", "ipg", CCM_PCCR1, 27);
+       clk[IMX21_CLK_PWM_IPG_GATE] = imx_clk_gate("pwm_ipg_gate", "ipg", CCM_PCCR1, 28);
+       clk[IMX21_CLK_RTC_GATE] = imx_clk_gate("rtc_gate", "ipg", CCM_PCCR1, 29);
+       clk[IMX21_CLK_KPP_GATE] = imx_clk_gate("kpp_gate", "ipg", CCM_PCCR1, 30);
+       clk[IMX21_CLK_OWIRE_GATE] = imx_clk_gate("owire_gate", "ipg", CCM_PCCR1, 31);
+
+       imx_check_clocks(clk, ARRAY_SIZE(clk));
+}
 
-/*
- * must be called very early to get information about the
- * available clock rate when the timer framework starts
- */
 int __init mx21_clocks_init(unsigned long lref, unsigned long href)
 {
-       int i;
-
-       clk[ckil] = imx_clk_fixed("ckil", lref);
-       clk[ckih] = imx_clk_fixed("ckih", href);
-       clk[fpm] = imx_clk_fixed_factor("fpm", "ckil", 512, 1);
-       clk[mpll_sel] = imx_clk_mux("mpll_sel", CCM_CSCR, 16, 1, mpll_sel_clks,
-                       ARRAY_SIZE(mpll_sel_clks));
-       clk[spll_sel] = imx_clk_mux("spll_sel", CCM_CSCR, 17, 1, spll_sel_clks,
-                       ARRAY_SIZE(spll_sel_clks));
-       clk[mpll] = imx_clk_pllv1("mpll", "mpll_sel", CCM_MPCTL0);
-       clk[spll] = imx_clk_pllv1("spll", "spll_sel", CCM_SPCTL0);
-       clk[fclk] = imx_clk_divider("fclk", "mpll", CCM_CSCR, 29, 3);
-       clk[hclk] = imx_clk_divider("hclk", "fclk", CCM_CSCR, 10, 4);
-       clk[ipg] = imx_clk_divider("ipg", "hclk", CCM_CSCR, 9, 1);
-       clk[per1] = imx_clk_divider("per1", "mpll", CCM_PCDR1, 0, 6);
-       clk[per2] = imx_clk_divider("per2", "mpll", CCM_PCDR1, 8, 6);
-       clk[per3] = imx_clk_divider("per3", "mpll", CCM_PCDR1, 16, 6);
-       clk[per4] = imx_clk_divider("per4", "mpll", CCM_PCDR1, 24, 6);
-       clk[uart1_ipg_gate] = imx_clk_gate("uart1_ipg_gate", "ipg", CCM_PCCR0, 0);
-       clk[uart2_ipg_gate] = imx_clk_gate("uart2_ipg_gate", "ipg", CCM_PCCR0, 1);
-       clk[uart3_ipg_gate] = imx_clk_gate("uart3_ipg_gate", "ipg", CCM_PCCR0, 2);
-       clk[uart4_ipg_gate] = imx_clk_gate("uart4_ipg_gate", "ipg", CCM_PCCR0, 3);
-       clk[gpt1_ipg_gate] = imx_clk_gate("gpt1_ipg_gate", "ipg", CCM_PCCR1, 25);
-       clk[gpt2_ipg_gate] = imx_clk_gate("gpt2_ipg_gate", "ipg", CCM_PCCR1, 26);
-       clk[gpt3_ipg_gate] = imx_clk_gate("gpt3_ipg_gate", "ipg", CCM_PCCR1, 27);
-       clk[pwm_ipg_gate] = imx_clk_gate("pwm_ipg_gate", "ipg", CCM_PCCR1, 28);
-       clk[sdhc1_ipg_gate] = imx_clk_gate("sdhc1_ipg_gate", "ipg", CCM_PCCR0, 9);
-       clk[sdhc2_ipg_gate] = imx_clk_gate("sdhc2_ipg_gate", "ipg", CCM_PCCR0, 10);
-       clk[lcdc_ipg_gate] = imx_clk_gate("lcdc_ipg_gate", "ipg", CCM_PCCR0, 18);
-       clk[lcdc_hclk_gate] = imx_clk_gate("lcdc_hclk_gate", "hclk", CCM_PCCR0, 26);
-       clk[cspi3_ipg_gate] = imx_clk_gate("cspi3_ipg_gate", "ipg", CCM_PCCR1, 23);
-       clk[cspi2_ipg_gate] = imx_clk_gate("cspi2_ipg_gate", "ipg", CCM_PCCR0, 5);
-       clk[cspi1_ipg_gate] = imx_clk_gate("cspi1_ipg_gate", "ipg", CCM_PCCR0, 4);
-       clk[per4_gate] = imx_clk_gate("per4_gate", "per4", CCM_PCCR0, 22);
-       clk[csi_hclk_gate] = imx_clk_gate("csi_hclk_gate", "hclk", CCM_PCCR0, 31);
-       clk[usb_div] = imx_clk_divider("usb_div", "spll", CCM_CSCR, 26, 3);
-       clk[usb_gate] = imx_clk_gate("usb_gate", "usb_div", CCM_PCCR0, 14);
-       clk[usb_hclk_gate] = imx_clk_gate("usb_hclk_gate", "hclk", CCM_PCCR0, 24);
-       clk[ssi1_gate] = imx_clk_gate("ssi1_gate", "ipg", CCM_PCCR0, 6);
-       clk[ssi2_gate] = imx_clk_gate("ssi2_gate", "ipg", CCM_PCCR0, 7);
-       clk[nfc_div] = imx_clk_divider("nfc_div", "ipg", CCM_PCDR0, 12, 4);
-       clk[nfc_gate] = imx_clk_gate("nfc_gate", "nfc_div", CCM_PCCR0, 19);
-       clk[dma_gate] = imx_clk_gate("dma_gate", "ipg", CCM_PCCR0, 13);
-       clk[dma_hclk_gate] = imx_clk_gate("dma_hclk_gate", "hclk", CCM_PCCR0, 30);
-       clk[brom_gate] = imx_clk_gate("brom_gate", "hclk", CCM_PCCR0, 28);
-       clk[emma_gate] = imx_clk_gate("emma_gate", "ipg", CCM_PCCR0, 15);
-       clk[emma_hclk_gate] = imx_clk_gate("emma_hclk_gate", "hclk", CCM_PCCR0, 27);
-       clk[slcdc_gate] = imx_clk_gate("slcdc_gate", "ipg", CCM_PCCR0, 25);
-       clk[slcdc_hclk_gate] = imx_clk_gate("slcdc_hclk_gate", "hclk", CCM_PCCR0, 21);
-       clk[wdog_gate] = imx_clk_gate("wdog_gate", "ipg", CCM_PCCR1, 24);
-       clk[gpio_gate] = imx_clk_gate("gpio_gate", "ipg", CCM_PCCR0, 11);
-       clk[i2c_gate] = imx_clk_gate("i2c_gate", "ipg", CCM_PCCR0, 12);
-       clk[kpp_gate] = imx_clk_gate("kpp_gate", "ipg", CCM_PCCR1, 30);
-       clk[owire_gate] = imx_clk_gate("owire_gate", "ipg", CCM_PCCR1, 31);
-       clk[rtc_gate] = imx_clk_gate("rtc_gate", "ipg", CCM_PCCR1, 29);
-
-       for (i = 0; i < ARRAY_SIZE(clk); i++)
-               if (IS_ERR(clk[i]))
-                       pr_err("i.MX21 clk %d: register failed with %ld\n",
-                               i, PTR_ERR(clk[i]));
-
-       clk_register_clkdev(clk[per1], "per1", NULL);
-       clk_register_clkdev(clk[per2], "per2", NULL);
-       clk_register_clkdev(clk[per3], "per3", NULL);
-       clk_register_clkdev(clk[per4], "per4", NULL);
-       clk_register_clkdev(clk[per1], "per", "imx21-uart.0");
-       clk_register_clkdev(clk[uart1_ipg_gate], "ipg", "imx21-uart.0");
-       clk_register_clkdev(clk[per1], "per", "imx21-uart.1");
-       clk_register_clkdev(clk[uart2_ipg_gate], "ipg", "imx21-uart.1");
-       clk_register_clkdev(clk[per1], "per", "imx21-uart.2");
-       clk_register_clkdev(clk[uart3_ipg_gate], "ipg", "imx21-uart.2");
-       clk_register_clkdev(clk[per1], "per", "imx21-uart.3");
-       clk_register_clkdev(clk[uart4_ipg_gate], "ipg", "imx21-uart.3");
-       clk_register_clkdev(clk[gpt1_ipg_gate], "ipg", "imx-gpt.0");
-       clk_register_clkdev(clk[per1], "per", "imx-gpt.0");
-       clk_register_clkdev(clk[gpt2_ipg_gate], "ipg", "imx-gpt.1");
-       clk_register_clkdev(clk[per1], "per", "imx-gpt.1");
-       clk_register_clkdev(clk[gpt3_ipg_gate], "ipg", "imx-gpt.2");
-       clk_register_clkdev(clk[per1], "per", "imx-gpt.2");
-       clk_register_clkdev(clk[per2], "per", "imx21-cspi.0");
-       clk_register_clkdev(clk[cspi1_ipg_gate], "ipg", "imx21-cspi.0");
-       clk_register_clkdev(clk[per2], "per", "imx21-cspi.1");
-       clk_register_clkdev(clk[cspi2_ipg_gate], "ipg", "imx21-cspi.1");
-       clk_register_clkdev(clk[per2], "per", "imx21-cspi.2");
-       clk_register_clkdev(clk[cspi3_ipg_gate], "ipg", "imx21-cspi.2");
-       clk_register_clkdev(clk[per3], "per", "imx21-fb.0");
-       clk_register_clkdev(clk[lcdc_ipg_gate], "ipg", "imx21-fb.0");
-       clk_register_clkdev(clk[lcdc_hclk_gate], "ahb", "imx21-fb.0");
-       clk_register_clkdev(clk[usb_gate], "per", "imx21-hcd.0");
-       clk_register_clkdev(clk[usb_hclk_gate], "ahb", "imx21-hcd.0");
-       clk_register_clkdev(clk[nfc_gate], NULL, "imx21-nand.0");
-       clk_register_clkdev(clk[dma_hclk_gate], "ahb", "imx21-dma");
-       clk_register_clkdev(clk[dma_gate], "ipg", "imx21-dma");
-       clk_register_clkdev(clk[wdog_gate], NULL, "imx2-wdt.0");
-       clk_register_clkdev(clk[i2c_gate], NULL, "imx21-i2c.0");
-       clk_register_clkdev(clk[kpp_gate], NULL, "mxc-keypad");
-       clk_register_clkdev(clk[owire_gate], NULL, "mxc_w1.0");
-       clk_register_clkdev(clk[brom_gate], "brom", NULL);
-       clk_register_clkdev(clk[emma_gate], "emma", NULL);
-       clk_register_clkdev(clk[slcdc_gate], "slcdc", NULL);
-       clk_register_clkdev(clk[gpio_gate], "gpio", NULL);
-       clk_register_clkdev(clk[rtc_gate], "rtc", NULL);
-       clk_register_clkdev(clk[csi_hclk_gate], "csi", NULL);
-       clk_register_clkdev(clk[ssi1_gate], "ssi1", NULL);
-       clk_register_clkdev(clk[ssi2_gate], "ssi2", NULL);
-       clk_register_clkdev(clk[sdhc1_ipg_gate], "sdhc1", NULL);
-       clk_register_clkdev(clk[sdhc2_ipg_gate], "sdhc2", NULL);
+       ccm = ioremap(MX21_CCM_BASE_ADDR, SZ_2K);
+
+       _mx21_clocks_init(lref, href);
+
+       clk_register_clkdev(clk[IMX21_CLK_PER1], "per", "imx21-uart.0");
+       clk_register_clkdev(clk[IMX21_CLK_UART1_IPG_GATE], "ipg", "imx21-uart.0");
+       clk_register_clkdev(clk[IMX21_CLK_PER1], "per", "imx21-uart.1");
+       clk_register_clkdev(clk[IMX21_CLK_UART2_IPG_GATE], "ipg", "imx21-uart.1");
+       clk_register_clkdev(clk[IMX21_CLK_PER1], "per", "imx21-uart.2");
+       clk_register_clkdev(clk[IMX21_CLK_UART3_IPG_GATE], "ipg", "imx21-uart.2");
+       clk_register_clkdev(clk[IMX21_CLK_PER1], "per", "imx21-uart.3");
+       clk_register_clkdev(clk[IMX21_CLK_UART4_IPG_GATE], "ipg", "imx21-uart.3");
+       clk_register_clkdev(clk[IMX21_CLK_GPT1_IPG_GATE], "ipg", "imx-gpt.0");
+       clk_register_clkdev(clk[IMX21_CLK_PER1], "per", "imx-gpt.0");
+       clk_register_clkdev(clk[IMX21_CLK_PER2], "per", "imx21-cspi.0");
+       clk_register_clkdev(clk[IMX21_CLK_CSPI1_IPG_GATE], "ipg", "imx21-cspi.0");
+       clk_register_clkdev(clk[IMX21_CLK_PER2], "per", "imx21-cspi.1");
+       clk_register_clkdev(clk[IMX21_CLK_CSPI2_IPG_GATE], "ipg", "imx21-cspi.1");
+       clk_register_clkdev(clk[IMX21_CLK_PER2], "per", "imx21-cspi.2");
+       clk_register_clkdev(clk[IMX21_CLK_CSPI3_IPG_GATE], "ipg", "imx21-cspi.2");
+       clk_register_clkdev(clk[IMX21_CLK_PER3], "per", "imx21-fb.0");
+       clk_register_clkdev(clk[IMX21_CLK_LCDC_IPG_GATE], "ipg", "imx21-fb.0");
+       clk_register_clkdev(clk[IMX21_CLK_LCDC_HCLK_GATE], "ahb", "imx21-fb.0");
+       clk_register_clkdev(clk[IMX21_CLK_USB_GATE], "per", "imx21-hcd.0");
+       clk_register_clkdev(clk[IMX21_CLK_USB_HCLK_GATE], "ahb", "imx21-hcd.0");
+       clk_register_clkdev(clk[IMX21_CLK_NFC_GATE], NULL, "imx21-nand.0");
+       clk_register_clkdev(clk[IMX21_CLK_DMA_HCLK_GATE], "ahb", "imx21-dma");
+       clk_register_clkdev(clk[IMX21_CLK_DMA_GATE], "ipg", "imx21-dma");
+       clk_register_clkdev(clk[IMX21_CLK_WDOG_GATE], NULL, "imx2-wdt.0");
+       clk_register_clkdev(clk[IMX21_CLK_I2C_GATE], NULL, "imx21-i2c.0");
+       clk_register_clkdev(clk[IMX21_CLK_OWIRE_GATE], NULL, "mxc_w1.0");
 
        mxc_timer_init(MX21_IO_ADDRESS(MX21_GPT1_BASE_ADDR), MX21_INT_GPT1);
 
        return 0;
 }
+
+static void __init mx21_clocks_init_dt(struct device_node *np)
+{
+       ccm = of_iomap(np, 0);
+
+       _mx21_clocks_init(32768, 26000000);
+
+       clk_data.clks = clk;
+       clk_data.clk_num = ARRAY_SIZE(clk);
+       of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
+}
+CLK_OF_DECLARE(imx27_ccm, "fsl,imx21-ccm", mx21_clocks_init_dt);
index ae578c096ad82ebb3590e941f57d9ee45ca308bb..59c0c8558c6bf5d5212c5e88083a55f859f01287 100644 (file)
@@ -32,8 +32,6 @@
 #include "hardware.h"
 #include "mx25.h"
 
-#define CRM_BASE       MX25_IO_ADDRESS(MX25_CRM_BASE_ADDR)
-
 #define CCM_MPCTL      0x00
 #define CCM_UPCTL      0x04
 #define CCM_CCTL       0x08
@@ -56,7 +54,7 @@
 #define CCM_LTR3       0x4c
 #define CCM_MCR                0x64
 
-#define ccm(x) (CRM_BASE + (x))
+#define ccm(x) (ccm_base + (x))
 
 static struct clk_onecell_data clk_data;
 
@@ -91,9 +89,10 @@ enum mx25_clks {
 
 static struct clk *clk[clk_max];
 
-static int __init __mx25_clocks_init(unsigned long osc_rate)
+static int __init __mx25_clocks_init(unsigned long osc_rate,
+                                    void __iomem *ccm_base)
 {
-       int i;
+       BUG_ON(!ccm_base);
 
        clk[dummy] = imx_clk_fixed("dummy", 0);
        clk[osc] = imx_clk_fixed("osc", osc_rate);
@@ -224,19 +223,13 @@ static int __init __mx25_clocks_init(unsigned long osc_rate)
        /* CCM_CGCR2(19): reserved in datasheet, but used as wdt in FSL kernel */
        clk[wdt_ipg] = imx_clk_gate("wdt_ipg", "ipg", ccm(CCM_CGCR2), 19);
 
-       for (i = 0; i < ARRAY_SIZE(clk); i++)
-               if (IS_ERR(clk[i]))
-                       pr_err("i.MX25 clk %d: register failed with %ld\n",
-                               i, PTR_ERR(clk[i]));
+       imx_check_clocks(clk, ARRAY_SIZE(clk));
 
        clk_prepare_enable(clk[emi_ahb]);
 
        /* Clock source for gpt must be derived from AHB */
        clk_set_parent(clk[per5_sel], clk[ahb]);
 
-       clk_register_clkdev(clk[ipg], "ipg", "imx-gpt.0");
-       clk_register_clkdev(clk[gpt_ipg_per], "per", "imx-gpt.0");
-
        /*
         * Let's initially set up CLKO parent as ipg, since this configuration
         * is used on some imx25 board designs to clock the audio codec.
@@ -248,8 +241,14 @@ static int __init __mx25_clocks_init(unsigned long osc_rate)
 
 int __init mx25_clocks_init(void)
 {
-       __mx25_clocks_init(24000000);
+       void __iomem *ccm;
 
+       ccm = ioremap(MX25_CRM_BASE_ADDR, SZ_16K);
+
+       __mx25_clocks_init(24000000, ccm);
+
+       clk_register_clkdev(clk[gpt1_ipg], "ipg", "imx-gpt.0");
+       clk_register_clkdev(clk[gpt_ipg_per], "per", "imx-gpt.0");
        /* i.mx25 has the i.mx21 type uart */
        clk_register_clkdev(clk[uart1_ipg], "ipg", "imx21-uart.0");
        clk_register_clkdev(clk[uart_ipg_per], "per", "imx21-uart.0");
@@ -314,29 +313,27 @@ int __init mx25_clocks_init(void)
        return 0;
 }
 
-int __init mx25_clocks_init_dt(void)
+static void __init mx25_clocks_init_dt(struct device_node *np)
 {
-       struct device_node *np;
+       struct device_node *refnp;
        unsigned long osc_rate = 24000000;
+       void __iomem *ccm;
 
        /* retrieve the freqency of fixed clocks from device tree */
-       for_each_compatible_node(np, NULL, "fixed-clock") {
+       for_each_compatible_node(refnp, NULL, "fixed-clock") {
                u32 rate;
-               if (of_property_read_u32(np, "clock-frequency", &rate))
+               if (of_property_read_u32(refnp, "clock-frequency", &rate))
                        continue;
 
-               if (of_device_is_compatible(np, "fsl,imx-osc"))
+               if (of_device_is_compatible(refnp, "fsl,imx-osc"))
                        osc_rate = rate;
        }
 
-       np = of_find_compatible_node(NULL, NULL, "fsl,imx25-ccm");
+       ccm = of_iomap(np, 0);
+       __mx25_clocks_init(osc_rate, ccm);
+
        clk_data.clks = clk;
        clk_data.clk_num = ARRAY_SIZE(clk);
        of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
-
-       __mx25_clocks_init(osc_rate);
-
-       mxc_timer_init_dt(of_find_compatible_node(NULL, NULL, "fsl,imx25-gpt"));
-
-       return 0;
 }
+CLK_OF_DECLARE(imx25_ccm, "fsl,imx25-ccm", mx25_clocks_init_dt);
index 317a662626d6ca11c7848a59912c029905c40c93..ab6349ec23b9b87491222b0bdf24e4f977fee6a3 100644 (file)
@@ -1,61 +1,36 @@
 #include <linux/clk.h>
-#include <linux/io.h>
-#include <linux/module.h>
+#include <linux/clk-provider.h>
 #include <linux/clkdev.h>
 #include <linux/err.h>
-#include <linux/clk-provider.h>
 #include <linux/of.h>
+#include <linux/of_address.h>
+#include <dt-bindings/clock/imx27-clock.h>
 
 #include "clk.h"
 #include "common.h"
 #include "hardware.h"
 
-#define IO_ADDR_CCM(off)       (MX27_IO_ADDRESS(MX27_CCM_BASE_ADDR + (off)))
+static void __iomem *ccm __initdata;
 
 /* Register offsets */
-#define CCM_CSCR               IO_ADDR_CCM(0x0)
-#define CCM_MPCTL0             IO_ADDR_CCM(0x4)
-#define CCM_MPCTL1             IO_ADDR_CCM(0x8)
-#define CCM_SPCTL0             IO_ADDR_CCM(0xc)
-#define CCM_SPCTL1             IO_ADDR_CCM(0x10)
-#define CCM_OSC26MCTL          IO_ADDR_CCM(0x14)
-#define CCM_PCDR0              IO_ADDR_CCM(0x18)
-#define CCM_PCDR1              IO_ADDR_CCM(0x1c)
-#define CCM_PCCR0              IO_ADDR_CCM(0x20)
-#define CCM_PCCR1              IO_ADDR_CCM(0x24)
-#define CCM_CCSR               IO_ADDR_CCM(0x28)
-#define CCM_PMCTL              IO_ADDR_CCM(0x2c)
-#define CCM_PMCOUNT            IO_ADDR_CCM(0x30)
-#define CCM_WKGDCTL            IO_ADDR_CCM(0x34)
-
-#define CCM_CSCR_UPDATE_DIS    (1 << 31)
-#define CCM_CSCR_SSI2          (1 << 23)
-#define CCM_CSCR_SSI1          (1 << 22)
-#define CCM_CSCR_VPU           (1 << 21)
-#define CCM_CSCR_MSHC           (1 << 20)
-#define CCM_CSCR_SPLLRES        (1 << 19)
-#define CCM_CSCR_MPLLRES        (1 << 18)
-#define CCM_CSCR_SP             (1 << 17)
-#define CCM_CSCR_MCU            (1 << 16)
-#define CCM_CSCR_OSC26MDIV      (1 << 4)
-#define CCM_CSCR_OSC26M         (1 << 3)
-#define CCM_CSCR_FPM            (1 << 2)
-#define CCM_CSCR_SPEN           (1 << 1)
-#define CCM_CSCR_MPEN           (1 << 0)
-
-/* i.MX27 TO 2+ */
-#define CCM_CSCR_ARM_SRC        (1 << 15)
-
-#define CCM_SPCTL1_LF           (1 << 15)
-#define CCM_SPCTL1_BRMO         (1 << 6)
+#define CCM_CSCR               (ccm + 0x00)
+#define CCM_MPCTL0             (ccm + 0x04)
+#define CCM_MPCTL1             (ccm + 0x08)
+#define CCM_SPCTL0             (ccm + 0x0c)
+#define CCM_SPCTL1             (ccm + 0x10)
+#define CCM_PCDR0              (ccm + 0x18)
+#define CCM_PCDR1              (ccm + 0x1c)
+#define CCM_PCCR0              (ccm + 0x20)
+#define CCM_PCCR1              (ccm + 0x24)
+#define CCM_CCSR               (ccm + 0x28)
 
 static const char *vpu_sel_clks[] = { "spll", "mpll_main2", };
 static const char *cpu_sel_clks[] = { "mpll_main2", "mpll", };
 static const char *mpll_sel_clks[] = { "fpm", "mpll_osc_sel", };
-static const char *mpll_osc_sel_clks[] = { "ckih", "ckih_div1p5", };
+static const char *mpll_osc_sel_clks[] = { "ckih_gate", "ckih_div1p5", };
 static const char *clko_sel_clks[] = {
-       "ckil", "fpm", "ckih", "ckih",
-       "ckih", "mpll", "spll", "cpu_div",
+       "ckil", "fpm", "ckih_gate", "ckih_gate",
+       "ckih_gate", "mpll", "spll", "cpu_div",
        "ahb", "ipg", "per1_div", "per2_div",
        "per3_div", "per4_div", "ssi1_div", "ssi2_div",
        "nfc_div", "mshc_div", "vpu_div", "60m",
@@ -64,239 +39,220 @@ static const char *clko_sel_clks[] = {
 
 static const char *ssi_sel_clks[] = { "spll_gate", "mpll", };
 
-enum mx27_clks {
-       dummy, ckih, ckil, mpll, spll, mpll_main2, ahb, ipg, nfc_div, per1_div,
-       per2_div, per3_div, per4_div, vpu_sel, vpu_div, usb_div, cpu_sel,
-       clko_sel, cpu_div, clko_div, ssi1_sel, ssi2_sel, ssi1_div, ssi2_div,
-       clko_en, ssi2_ipg_gate, ssi1_ipg_gate, slcdc_ipg_gate, sdhc3_ipg_gate,
-       sdhc2_ipg_gate, sdhc1_ipg_gate, scc_ipg_gate, sahara_ipg_gate,
-       rtc_ipg_gate, pwm_ipg_gate, owire_ipg_gate, lcdc_ipg_gate,
-       kpp_ipg_gate, iim_ipg_gate, i2c2_ipg_gate, i2c1_ipg_gate,
-       gpt6_ipg_gate, gpt5_ipg_gate, gpt4_ipg_gate, gpt3_ipg_gate,
-       gpt2_ipg_gate, gpt1_ipg_gate, gpio_ipg_gate, fec_ipg_gate,
-       emma_ipg_gate, dma_ipg_gate, cspi3_ipg_gate, cspi2_ipg_gate,
-       cspi1_ipg_gate, nfc_baud_gate, ssi2_baud_gate, ssi1_baud_gate,
-       vpu_baud_gate, per4_gate, per3_gate, per2_gate, per1_gate,
-       usb_ahb_gate, slcdc_ahb_gate, sahara_ahb_gate, lcdc_ahb_gate,
-       vpu_ahb_gate, fec_ahb_gate, emma_ahb_gate, emi_ahb_gate, dma_ahb_gate,
-       csi_ahb_gate, brom_ahb_gate, ata_ahb_gate, wdog_ipg_gate, usb_ipg_gate,
-       uart6_ipg_gate, uart5_ipg_gate, uart4_ipg_gate, uart3_ipg_gate,
-       uart2_ipg_gate, uart1_ipg_gate, ckih_div1p5, fpm, mpll_osc_sel,
-       mpll_sel, spll_gate, mshc_div, rtic_ipg_gate, mshc_ipg_gate,
-       rtic_ahb_gate, mshc_baud_gate, clk_max
-};
-
-static struct clk *clk[clk_max];
+static struct clk *clk[IMX27_CLK_MAX];
 static struct clk_onecell_data clk_data;
 
-int __init mx27_clocks_init(unsigned long fref)
+static void __init _mx27_clocks_init(unsigned long fref)
 {
-       int i;
-       struct device_node *np;
-
-       clk[dummy] = imx_clk_fixed("dummy", 0);
-       clk[ckih] = imx_clk_fixed("ckih", fref);
-       clk[ckil] = imx_clk_fixed("ckil", 32768);
-       clk[fpm] = imx_clk_fixed_factor("fpm", "ckil", 1024, 1);
-       clk[ckih_div1p5] = imx_clk_fixed_factor("ckih_div1p5", "ckih", 2, 3);
+       BUG_ON(!ccm);
 
-       clk[mpll_osc_sel] = imx_clk_mux("mpll_osc_sel", CCM_CSCR, 4, 1,
-                       mpll_osc_sel_clks,
-                       ARRAY_SIZE(mpll_osc_sel_clks));
-       clk[mpll_sel] = imx_clk_mux("mpll_sel", CCM_CSCR, 16, 1, mpll_sel_clks,
-                       ARRAY_SIZE(mpll_sel_clks));
-       clk[mpll] = imx_clk_pllv1("mpll", "mpll_sel", CCM_MPCTL0);
-       clk[spll] = imx_clk_pllv1("spll", "ckih", CCM_SPCTL0);
-       clk[spll_gate] = imx_clk_gate("spll_gate", "spll", CCM_CSCR, 1);
-       clk[mpll_main2] = imx_clk_fixed_factor("mpll_main2", "mpll", 2, 3);
+       clk[IMX27_CLK_DUMMY] = imx_clk_fixed("dummy", 0);
+       clk[IMX27_CLK_CKIH] = imx_clk_fixed("ckih", fref);
+       clk[IMX27_CLK_CKIL] = imx_clk_fixed("ckil", 32768);
+       clk[IMX27_CLK_FPM] = imx_clk_fixed_factor("fpm", "ckil", 1024, 1);
+       clk[IMX27_CLK_CKIH_DIV1P5] = imx_clk_fixed_factor("ckih_div1p5", "ckih_gate", 2, 3);
+       clk[IMX27_CLK_CKIH_GATE] = imx_clk_gate_dis("ckih_gate", "ckih", CCM_CSCR, 3);
+       clk[IMX27_CLK_MPLL_OSC_SEL] = imx_clk_mux("mpll_osc_sel", CCM_CSCR, 4, 1, mpll_osc_sel_clks, ARRAY_SIZE(mpll_osc_sel_clks));
+       clk[IMX27_CLK_MPLL_SEL] = imx_clk_mux("mpll_sel", CCM_CSCR, 16, 1, mpll_sel_clks, ARRAY_SIZE(mpll_sel_clks));
+       clk[IMX27_CLK_MPLL] = imx_clk_pllv1("mpll", "mpll_sel", CCM_MPCTL0);
+       clk[IMX27_CLK_SPLL] = imx_clk_pllv1("spll", "ckih_gate", CCM_SPCTL0);
+       clk[IMX27_CLK_SPLL_GATE] = imx_clk_gate("spll_gate", "spll", CCM_CSCR, 1);
+       clk[IMX27_CLK_MPLL_MAIN2] = imx_clk_fixed_factor("mpll_main2", "mpll", 2, 3);
 
        if (mx27_revision() >= IMX_CHIP_REVISION_2_0) {
-               clk[ahb] = imx_clk_divider("ahb", "mpll_main2", CCM_CSCR, 8, 2);
-               clk[ipg] = imx_clk_fixed_factor("ipg", "ahb", 1, 2);
+               clk[IMX27_CLK_AHB] = imx_clk_divider("ahb", "mpll_main2", CCM_CSCR, 8, 2);
+               clk[IMX27_CLK_IPG] = imx_clk_fixed_factor("ipg", "ahb", 1, 2);
        } else {
-               clk[ahb] = imx_clk_divider("ahb", "mpll_main2", CCM_CSCR, 9, 4);
-               clk[ipg] = imx_clk_divider("ipg", "ahb", CCM_CSCR, 8, 1);
+               clk[IMX27_CLK_AHB] = imx_clk_divider("ahb", "mpll_main2", CCM_CSCR, 9, 4);
+               clk[IMX27_CLK_IPG] = imx_clk_divider("ipg", "ahb", CCM_CSCR, 8, 1);
        }
 
-       clk[mshc_div] = imx_clk_divider("mshc_div", "ahb", CCM_PCDR0, 0, 6);
-       clk[nfc_div] = imx_clk_divider("nfc_div", "ahb", CCM_PCDR0, 6, 4);
-       clk[per1_div] = imx_clk_divider("per1_div", "mpll_main2", CCM_PCDR1, 0, 6);
-       clk[per2_div] = imx_clk_divider("per2_div", "mpll_main2", CCM_PCDR1, 8, 6);
-       clk[per3_div] = imx_clk_divider("per3_div", "mpll_main2", CCM_PCDR1, 16, 6);
-       clk[per4_div] = imx_clk_divider("per4_div", "mpll_main2", CCM_PCDR1, 24, 6);
-       clk[vpu_sel] = imx_clk_mux("vpu_sel", CCM_CSCR, 21, 1, vpu_sel_clks, ARRAY_SIZE(vpu_sel_clks));
-       clk[vpu_div] = imx_clk_divider("vpu_div", "vpu_sel", CCM_PCDR0, 10, 6);
-       clk[usb_div] = imx_clk_divider("usb_div", "spll_gate", CCM_CSCR, 28, 3);
-       clk[cpu_sel] = imx_clk_mux("cpu_sel", CCM_CSCR, 15, 1, cpu_sel_clks, ARRAY_SIZE(cpu_sel_clks));
-       clk[clko_sel] = imx_clk_mux("clko_sel", CCM_CCSR, 0, 5, clko_sel_clks, ARRAY_SIZE(clko_sel_clks));
+       clk[IMX27_CLK_MSHC_DIV] = imx_clk_divider("mshc_div", "ahb", CCM_PCDR0, 0, 6);
+       clk[IMX27_CLK_NFC_DIV] = imx_clk_divider("nfc_div", "ahb", CCM_PCDR0, 6, 4);
+       clk[IMX27_CLK_PER1_DIV] = imx_clk_divider("per1_div", "mpll_main2", CCM_PCDR1, 0, 6);
+       clk[IMX27_CLK_PER2_DIV] = imx_clk_divider("per2_div", "mpll_main2", CCM_PCDR1, 8, 6);
+       clk[IMX27_CLK_PER3_DIV] = imx_clk_divider("per3_div", "mpll_main2", CCM_PCDR1, 16, 6);
+       clk[IMX27_CLK_PER4_DIV] = imx_clk_divider("per4_div", "mpll_main2", CCM_PCDR1, 24, 6);
+       clk[IMX27_CLK_VPU_SEL] = imx_clk_mux("vpu_sel", CCM_CSCR, 21, 1, vpu_sel_clks, ARRAY_SIZE(vpu_sel_clks));
+       clk[IMX27_CLK_VPU_DIV] = imx_clk_divider("vpu_div", "vpu_sel", CCM_PCDR0, 10, 6);
+       clk[IMX27_CLK_USB_DIV] = imx_clk_divider("usb_div", "spll_gate", CCM_CSCR, 28, 3);
+       clk[IMX27_CLK_CPU_SEL] = imx_clk_mux("cpu_sel", CCM_CSCR, 15, 1, cpu_sel_clks, ARRAY_SIZE(cpu_sel_clks));
+       clk[IMX27_CLK_CLKO_SEL] = imx_clk_mux("clko_sel", CCM_CCSR, 0, 5, clko_sel_clks, ARRAY_SIZE(clko_sel_clks));
+
        if (mx27_revision() >= IMX_CHIP_REVISION_2_0)
-               clk[cpu_div] = imx_clk_divider("cpu_div", "cpu_sel", CCM_CSCR, 12, 2);
+               clk[IMX27_CLK_CPU_DIV] = imx_clk_divider("cpu_div", "cpu_sel", CCM_CSCR, 12, 2);
        else
-               clk[cpu_div] = imx_clk_divider("cpu_div", "cpu_sel", CCM_CSCR, 13, 3);
-       clk[clko_div] = imx_clk_divider("clko_div", "clko_sel", CCM_PCDR0, 22, 3);
-       clk[ssi1_sel] = imx_clk_mux("ssi1_sel", CCM_CSCR, 22, 1, ssi_sel_clks, ARRAY_SIZE(ssi_sel_clks));
-       clk[ssi2_sel] = imx_clk_mux("ssi2_sel", CCM_CSCR, 23, 1, ssi_sel_clks, ARRAY_SIZE(ssi_sel_clks));
-       clk[ssi1_div] = imx_clk_divider("ssi1_div", "ssi1_sel", CCM_PCDR0, 16, 6);
-       clk[ssi2_div] = imx_clk_divider("ssi2_div", "ssi2_sel", CCM_PCDR0, 26, 6);
-       clk[clko_en] = imx_clk_gate("clko_en", "clko_div", CCM_PCCR0, 0);
-       clk[ssi2_ipg_gate] = imx_clk_gate("ssi2_ipg_gate", "ipg", CCM_PCCR0, 0);
-       clk[ssi1_ipg_gate] = imx_clk_gate("ssi1_ipg_gate", "ipg", CCM_PCCR0, 1);
-       clk[slcdc_ipg_gate] = imx_clk_gate("slcdc_ipg_gate", "ipg", CCM_PCCR0, 2);
-       clk[sdhc3_ipg_gate] = imx_clk_gate("sdhc3_ipg_gate", "ipg", CCM_PCCR0, 3);
-       clk[sdhc2_ipg_gate] = imx_clk_gate("sdhc2_ipg_gate", "ipg", CCM_PCCR0, 4);
-       clk[sdhc1_ipg_gate] = imx_clk_gate("sdhc1_ipg_gate", "ipg", CCM_PCCR0, 5);
-       clk[scc_ipg_gate] = imx_clk_gate("scc_ipg_gate", "ipg", CCM_PCCR0, 6);
-       clk[sahara_ipg_gate] = imx_clk_gate("sahara_ipg_gate", "ipg", CCM_PCCR0, 7);
-       clk[rtic_ipg_gate] = imx_clk_gate("rtic_ipg_gate", "ipg", CCM_PCCR0, 8);
-       clk[rtc_ipg_gate] = imx_clk_gate("rtc_ipg_gate", "ipg", CCM_PCCR0, 9);
-       clk[pwm_ipg_gate] = imx_clk_gate("pwm_ipg_gate", "ipg", CCM_PCCR0, 11);
-       clk[owire_ipg_gate] = imx_clk_gate("owire_ipg_gate", "ipg", CCM_PCCR0, 12);
-       clk[mshc_ipg_gate] = imx_clk_gate("mshc_ipg_gate", "ipg", CCM_PCCR0, 13);
-       clk[lcdc_ipg_gate] = imx_clk_gate("lcdc_ipg_gate", "ipg", CCM_PCCR0, 14);
-       clk[kpp_ipg_gate] = imx_clk_gate("kpp_ipg_gate", "ipg", CCM_PCCR0, 15);
-       clk[iim_ipg_gate] = imx_clk_gate("iim_ipg_gate", "ipg", CCM_PCCR0, 16);
-       clk[i2c2_ipg_gate] = imx_clk_gate("i2c2_ipg_gate", "ipg", CCM_PCCR0, 17);
-       clk[i2c1_ipg_gate] = imx_clk_gate("i2c1_ipg_gate", "ipg", CCM_PCCR0, 18);
-       clk[gpt6_ipg_gate] = imx_clk_gate("gpt6_ipg_gate", "ipg", CCM_PCCR0, 19);
-       clk[gpt5_ipg_gate] = imx_clk_gate("gpt5_ipg_gate", "ipg", CCM_PCCR0, 20);
-       clk[gpt4_ipg_gate] = imx_clk_gate("gpt4_ipg_gate", "ipg", CCM_PCCR0, 21);
-       clk[gpt3_ipg_gate] = imx_clk_gate("gpt3_ipg_gate", "ipg", CCM_PCCR0, 22);
-       clk[gpt2_ipg_gate] = imx_clk_gate("gpt2_ipg_gate", "ipg", CCM_PCCR0, 23);
-       clk[gpt1_ipg_gate] = imx_clk_gate("gpt1_ipg_gate", "ipg", CCM_PCCR0, 24);
-       clk[gpio_ipg_gate] = imx_clk_gate("gpio_ipg_gate", "ipg", CCM_PCCR0, 25);
-       clk[fec_ipg_gate] = imx_clk_gate("fec_ipg_gate", "ipg", CCM_PCCR0, 26);
-       clk[emma_ipg_gate] = imx_clk_gate("emma_ipg_gate", "ipg", CCM_PCCR0, 27);
-       clk[dma_ipg_gate] = imx_clk_gate("dma_ipg_gate", "ipg", CCM_PCCR0, 28);
-       clk[cspi3_ipg_gate] = imx_clk_gate("cspi3_ipg_gate", "ipg", CCM_PCCR0, 29);
-       clk[cspi2_ipg_gate] = imx_clk_gate("cspi2_ipg_gate", "ipg", CCM_PCCR0, 30);
-       clk[cspi1_ipg_gate] = imx_clk_gate("cspi1_ipg_gate", "ipg", CCM_PCCR0, 31);
-       clk[mshc_baud_gate] = imx_clk_gate("mshc_baud_gate", "mshc_div", CCM_PCCR1, 2);
-       clk[nfc_baud_gate] = imx_clk_gate("nfc_baud_gate", "nfc_div", CCM_PCCR1,  3);
-       clk[ssi2_baud_gate] = imx_clk_gate("ssi2_baud_gate", "ssi2_div", CCM_PCCR1,  4);
-       clk[ssi1_baud_gate] = imx_clk_gate("ssi1_baud_gate", "ssi1_div", CCM_PCCR1,  5);
-       clk[vpu_baud_gate] = imx_clk_gate("vpu_baud_gate", "vpu_div", CCM_PCCR1,  6);
-       clk[per4_gate] = imx_clk_gate("per4_gate", "per4_div", CCM_PCCR1,  7);
-       clk[per3_gate] = imx_clk_gate("per3_gate", "per3_div", CCM_PCCR1,  8);
-       clk[per2_gate] = imx_clk_gate("per2_gate", "per2_div", CCM_PCCR1,  9);
-       clk[per1_gate] = imx_clk_gate("per1_gate", "per1_div", CCM_PCCR1, 10);
-       clk[usb_ahb_gate] = imx_clk_gate("usb_ahb_gate", "ahb", CCM_PCCR1, 11);
-       clk[slcdc_ahb_gate] = imx_clk_gate("slcdc_ahb_gate", "ahb", CCM_PCCR1, 12);
-       clk[sahara_ahb_gate] = imx_clk_gate("sahara_ahb_gate", "ahb", CCM_PCCR1, 13);
-       clk[rtic_ahb_gate] = imx_clk_gate("rtic_ahb_gate", "ahb", CCM_PCCR1, 14);
-       clk[lcdc_ahb_gate] = imx_clk_gate("lcdc_ahb_gate", "ahb", CCM_PCCR1, 15);
-       clk[vpu_ahb_gate] = imx_clk_gate("vpu_ahb_gate", "ahb", CCM_PCCR1, 16);
-       clk[fec_ahb_gate] = imx_clk_gate("fec_ahb_gate", "ahb", CCM_PCCR1, 17);
-       clk[emma_ahb_gate] = imx_clk_gate("emma_ahb_gate", "ahb", CCM_PCCR1, 18);
-       clk[emi_ahb_gate] = imx_clk_gate("emi_ahb_gate", "ahb", CCM_PCCR1, 19);
-       clk[dma_ahb_gate] = imx_clk_gate("dma_ahb_gate", "ahb", CCM_PCCR1, 20);
-       clk[csi_ahb_gate] = imx_clk_gate("csi_ahb_gate", "ahb", CCM_PCCR1, 21);
-       clk[brom_ahb_gate] = imx_clk_gate("brom_ahb_gate", "ahb", CCM_PCCR1, 22);
-       clk[ata_ahb_gate] = imx_clk_gate("ata_ahb_gate", "ahb", CCM_PCCR1, 23);
-       clk[wdog_ipg_gate] = imx_clk_gate("wdog_ipg_gate", "ipg", CCM_PCCR1, 24);
-       clk[usb_ipg_gate] = imx_clk_gate("usb_ipg_gate", "ipg", CCM_PCCR1, 25);
-       clk[uart6_ipg_gate] = imx_clk_gate("uart6_ipg_gate", "ipg", CCM_PCCR1, 26);
-       clk[uart5_ipg_gate] = imx_clk_gate("uart5_ipg_gate", "ipg", CCM_PCCR1, 27);
-       clk[uart4_ipg_gate] = imx_clk_gate("uart4_ipg_gate", "ipg", CCM_PCCR1, 28);
-       clk[uart3_ipg_gate] = imx_clk_gate("uart3_ipg_gate", "ipg", CCM_PCCR1, 29);
-       clk[uart2_ipg_gate] = imx_clk_gate("uart2_ipg_gate", "ipg", CCM_PCCR1, 30);
-       clk[uart1_ipg_gate] = imx_clk_gate("uart1_ipg_gate", "ipg", CCM_PCCR1, 31);
+               clk[IMX27_CLK_CPU_DIV] = imx_clk_divider("cpu_div", "cpu_sel", CCM_CSCR, 13, 3);
 
-       for (i = 0; i < ARRAY_SIZE(clk); i++)
-               if (IS_ERR(clk[i]))
-                       pr_err("i.MX27 clk %d: register failed with %ld\n",
-                               i, PTR_ERR(clk[i]));
+       clk[IMX27_CLK_CLKO_DIV] = imx_clk_divider("clko_div", "clko_sel", CCM_PCDR0, 22, 3);
+       clk[IMX27_CLK_SSI1_SEL] = imx_clk_mux("ssi1_sel", CCM_CSCR, 22, 1, ssi_sel_clks, ARRAY_SIZE(ssi_sel_clks));
+       clk[IMX27_CLK_SSI2_SEL] = imx_clk_mux("ssi2_sel", CCM_CSCR, 23, 1, ssi_sel_clks, ARRAY_SIZE(ssi_sel_clks));
+       clk[IMX27_CLK_SSI1_DIV] = imx_clk_divider("ssi1_div", "ssi1_sel", CCM_PCDR0, 16, 6);
+       clk[IMX27_CLK_SSI2_DIV] = imx_clk_divider("ssi2_div", "ssi2_sel", CCM_PCDR0, 26, 6);
+       clk[IMX27_CLK_CLKO_EN] = imx_clk_gate("clko_en", "clko_div", CCM_PCCR0, 0);
+       clk[IMX27_CLK_SSI2_IPG_GATE] = imx_clk_gate("ssi2_ipg_gate", "ipg", CCM_PCCR0, 0);
+       clk[IMX27_CLK_SSI1_IPG_GATE] = imx_clk_gate("ssi1_ipg_gate", "ipg", CCM_PCCR0, 1);
+       clk[IMX27_CLK_SLCDC_IPG_GATE] = imx_clk_gate("slcdc_ipg_gate", "ipg", CCM_PCCR0, 2);
+       clk[IMX27_CLK_SDHC3_IPG_GATE] = imx_clk_gate("sdhc3_ipg_gate", "ipg", CCM_PCCR0, 3);
+       clk[IMX27_CLK_SDHC2_IPG_GATE] = imx_clk_gate("sdhc2_ipg_gate", "ipg", CCM_PCCR0, 4);
+       clk[IMX27_CLK_SDHC1_IPG_GATE] = imx_clk_gate("sdhc1_ipg_gate", "ipg", CCM_PCCR0, 5);
+       clk[IMX27_CLK_SCC_IPG_GATE] = imx_clk_gate("scc_ipg_gate", "ipg", CCM_PCCR0, 6);
+       clk[IMX27_CLK_SAHARA_IPG_GATE] = imx_clk_gate("sahara_ipg_gate", "ipg", CCM_PCCR0, 7);
+       clk[IMX27_CLK_RTIC_IPG_GATE] = imx_clk_gate("rtic_ipg_gate", "ipg", CCM_PCCR0, 8);
+       clk[IMX27_CLK_RTC_IPG_GATE] = imx_clk_gate("rtc_ipg_gate", "ipg", CCM_PCCR0, 9);
+       clk[IMX27_CLK_PWM_IPG_GATE] = imx_clk_gate("pwm_ipg_gate", "ipg", CCM_PCCR0, 11);
+       clk[IMX27_CLK_OWIRE_IPG_GATE] = imx_clk_gate("owire_ipg_gate", "ipg", CCM_PCCR0, 12);
+       clk[IMX27_CLK_MSHC_IPG_GATE] = imx_clk_gate("mshc_ipg_gate", "ipg", CCM_PCCR0, 13);
+       clk[IMX27_CLK_LCDC_IPG_GATE] = imx_clk_gate("lcdc_ipg_gate", "ipg", CCM_PCCR0, 14);
+       clk[IMX27_CLK_KPP_IPG_GATE] = imx_clk_gate("kpp_ipg_gate", "ipg", CCM_PCCR0, 15);
+       clk[IMX27_CLK_IIM_IPG_GATE] = imx_clk_gate("iim_ipg_gate", "ipg", CCM_PCCR0, 16);
+       clk[IMX27_CLK_I2C2_IPG_GATE] = imx_clk_gate("i2c2_ipg_gate", "ipg", CCM_PCCR0, 17);
+       clk[IMX27_CLK_I2C1_IPG_GATE] = imx_clk_gate("i2c1_ipg_gate", "ipg", CCM_PCCR0, 18);
+       clk[IMX27_CLK_GPT6_IPG_GATE] = imx_clk_gate("gpt6_ipg_gate", "ipg", CCM_PCCR0, 19);
+       clk[IMX27_CLK_GPT5_IPG_GATE] = imx_clk_gate("gpt5_ipg_gate", "ipg", CCM_PCCR0, 20);
+       clk[IMX27_CLK_GPT4_IPG_GATE] = imx_clk_gate("gpt4_ipg_gate", "ipg", CCM_PCCR0, 21);
+       clk[IMX27_CLK_GPT3_IPG_GATE] = imx_clk_gate("gpt3_ipg_gate", "ipg", CCM_PCCR0, 22);
+       clk[IMX27_CLK_GPT2_IPG_GATE] = imx_clk_gate("gpt2_ipg_gate", "ipg", CCM_PCCR0, 23);
+       clk[IMX27_CLK_GPT1_IPG_GATE] = imx_clk_gate("gpt1_ipg_gate", "ipg", CCM_PCCR0, 24);
+       clk[IMX27_CLK_GPIO_IPG_GATE] = imx_clk_gate("gpio_ipg_gate", "ipg", CCM_PCCR0, 25);
+       clk[IMX27_CLK_FEC_IPG_GATE] = imx_clk_gate("fec_ipg_gate", "ipg", CCM_PCCR0, 26);
+       clk[IMX27_CLK_EMMA_IPG_GATE] = imx_clk_gate("emma_ipg_gate", "ipg", CCM_PCCR0, 27);
+       clk[IMX27_CLK_DMA_IPG_GATE] = imx_clk_gate("dma_ipg_gate", "ipg", CCM_PCCR0, 28);
+       clk[IMX27_CLK_CSPI3_IPG_GATE] = imx_clk_gate("cspi3_ipg_gate", "ipg", CCM_PCCR0, 29);
+       clk[IMX27_CLK_CSPI2_IPG_GATE] = imx_clk_gate("cspi2_ipg_gate", "ipg", CCM_PCCR0, 30);
+       clk[IMX27_CLK_CSPI1_IPG_GATE] = imx_clk_gate("cspi1_ipg_gate", "ipg", CCM_PCCR0, 31);
+       clk[IMX27_CLK_MSHC_BAUD_GATE] = imx_clk_gate("mshc_baud_gate", "mshc_div", CCM_PCCR1, 2);
+       clk[IMX27_CLK_NFC_BAUD_GATE] = imx_clk_gate("nfc_baud_gate", "nfc_div", CCM_PCCR1,  3);
+       clk[IMX27_CLK_SSI2_BAUD_GATE] = imx_clk_gate("ssi2_baud_gate", "ssi2_div", CCM_PCCR1,  4);
+       clk[IMX27_CLK_SSI1_BAUD_GATE] = imx_clk_gate("ssi1_baud_gate", "ssi1_div", CCM_PCCR1,  5);
+       clk[IMX27_CLK_VPU_BAUD_GATE] = imx_clk_gate("vpu_baud_gate", "vpu_div", CCM_PCCR1,  6);
+       clk[IMX27_CLK_PER4_GATE] = imx_clk_gate("per4_gate", "per4_div", CCM_PCCR1,  7);
+       clk[IMX27_CLK_PER3_GATE] = imx_clk_gate("per3_gate", "per3_div", CCM_PCCR1,  8);
+       clk[IMX27_CLK_PER2_GATE] = imx_clk_gate("per2_gate", "per2_div", CCM_PCCR1,  9);
+       clk[IMX27_CLK_PER1_GATE] = imx_clk_gate("per1_gate", "per1_div", CCM_PCCR1, 10);
+       clk[IMX27_CLK_USB_AHB_GATE] = imx_clk_gate("usb_ahb_gate", "ahb", CCM_PCCR1, 11);
+       clk[IMX27_CLK_SLCDC_AHB_GATE] = imx_clk_gate("slcdc_ahb_gate", "ahb", CCM_PCCR1, 12);
+       clk[IMX27_CLK_SAHARA_AHB_GATE] = imx_clk_gate("sahara_ahb_gate", "ahb", CCM_PCCR1, 13);
+       clk[IMX27_CLK_RTIC_AHB_GATE] = imx_clk_gate("rtic_ahb_gate", "ahb", CCM_PCCR1, 14);
+       clk[IMX27_CLK_LCDC_AHB_GATE] = imx_clk_gate("lcdc_ahb_gate", "ahb", CCM_PCCR1, 15);
+       clk[IMX27_CLK_VPU_AHB_GATE] = imx_clk_gate("vpu_ahb_gate", "ahb", CCM_PCCR1, 16);
+       clk[IMX27_CLK_FEC_AHB_GATE] = imx_clk_gate("fec_ahb_gate", "ahb", CCM_PCCR1, 17);
+       clk[IMX27_CLK_EMMA_AHB_GATE] = imx_clk_gate("emma_ahb_gate", "ahb", CCM_PCCR1, 18);
+       clk[IMX27_CLK_EMI_AHB_GATE] = imx_clk_gate("emi_ahb_gate", "ahb", CCM_PCCR1, 19);
+       clk[IMX27_CLK_DMA_AHB_GATE] = imx_clk_gate("dma_ahb_gate", "ahb", CCM_PCCR1, 20);
+       clk[IMX27_CLK_CSI_AHB_GATE] = imx_clk_gate("csi_ahb_gate", "ahb", CCM_PCCR1, 21);
+       clk[IMX27_CLK_BROM_AHB_GATE] = imx_clk_gate("brom_ahb_gate", "ahb", CCM_PCCR1, 22);
+       clk[IMX27_CLK_ATA_AHB_GATE] = imx_clk_gate("ata_ahb_gate", "ahb", CCM_PCCR1, 23);
+       clk[IMX27_CLK_WDOG_IPG_GATE] = imx_clk_gate("wdog_ipg_gate", "ipg", CCM_PCCR1, 24);
+       clk[IMX27_CLK_USB_IPG_GATE] = imx_clk_gate("usb_ipg_gate", "ipg", CCM_PCCR1, 25);
+       clk[IMX27_CLK_UART6_IPG_GATE] = imx_clk_gate("uart6_ipg_gate", "ipg", CCM_PCCR1, 26);
+       clk[IMX27_CLK_UART5_IPG_GATE] = imx_clk_gate("uart5_ipg_gate", "ipg", CCM_PCCR1, 27);
+       clk[IMX27_CLK_UART4_IPG_GATE] = imx_clk_gate("uart4_ipg_gate", "ipg", CCM_PCCR1, 28);
+       clk[IMX27_CLK_UART3_IPG_GATE] = imx_clk_gate("uart3_ipg_gate", "ipg", CCM_PCCR1, 29);
+       clk[IMX27_CLK_UART2_IPG_GATE] = imx_clk_gate("uart2_ipg_gate", "ipg", CCM_PCCR1, 30);
+       clk[IMX27_CLK_UART1_IPG_GATE] = imx_clk_gate("uart1_ipg_gate", "ipg", CCM_PCCR1, 31);
 
-       np = of_find_compatible_node(NULL, NULL, "fsl,imx27-ccm");
-       if (np) {
-               clk_data.clks = clk;
-               clk_data.clk_num = ARRAY_SIZE(clk);
-               of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
-       }
+       imx_check_clocks(clk, ARRAY_SIZE(clk));
 
-       clk_register_clkdev(clk[uart1_ipg_gate], "ipg", "imx21-uart.0");
-       clk_register_clkdev(clk[per1_gate], "per", "imx21-uart.0");
-       clk_register_clkdev(clk[uart2_ipg_gate], "ipg", "imx21-uart.1");
-       clk_register_clkdev(clk[per1_gate], "per", "imx21-uart.1");
-       clk_register_clkdev(clk[uart3_ipg_gate], "ipg", "imx21-uart.2");
-       clk_register_clkdev(clk[per1_gate], "per", "imx21-uart.2");
-       clk_register_clkdev(clk[uart4_ipg_gate], "ipg", "imx21-uart.3");
-       clk_register_clkdev(clk[per1_gate], "per", "imx21-uart.3");
-       clk_register_clkdev(clk[uart5_ipg_gate], "ipg", "imx21-uart.4");
-       clk_register_clkdev(clk[per1_gate], "per", "imx21-uart.4");
-       clk_register_clkdev(clk[uart6_ipg_gate], "ipg", "imx21-uart.5");
-       clk_register_clkdev(clk[per1_gate], "per", "imx21-uart.5");
-       clk_register_clkdev(clk[gpt1_ipg_gate], "ipg", "imx-gpt.0");
-       clk_register_clkdev(clk[per1_gate], "per", "imx-gpt.0");
-       clk_register_clkdev(clk[per2_gate], "per", "imx21-mmc.0");
-       clk_register_clkdev(clk[sdhc1_ipg_gate], "ipg", "imx21-mmc.0");
-       clk_register_clkdev(clk[per2_gate], "per", "imx21-mmc.1");
-       clk_register_clkdev(clk[sdhc2_ipg_gate], "ipg", "imx21-mmc.1");
-       clk_register_clkdev(clk[per2_gate], "per", "imx21-mmc.2");
-       clk_register_clkdev(clk[sdhc2_ipg_gate], "ipg", "imx21-mmc.2");
-       clk_register_clkdev(clk[per2_gate], "per", "imx27-cspi.0");
-       clk_register_clkdev(clk[cspi1_ipg_gate], "ipg", "imx27-cspi.0");
-       clk_register_clkdev(clk[per2_gate], "per", "imx27-cspi.1");
-       clk_register_clkdev(clk[cspi2_ipg_gate], "ipg", "imx27-cspi.1");
-       clk_register_clkdev(clk[per2_gate], "per", "imx27-cspi.2");
-       clk_register_clkdev(clk[cspi3_ipg_gate], "ipg", "imx27-cspi.2");
-       clk_register_clkdev(clk[per3_gate], "per", "imx21-fb.0");
-       clk_register_clkdev(clk[lcdc_ipg_gate], "ipg", "imx21-fb.0");
-       clk_register_clkdev(clk[lcdc_ahb_gate], "ahb", "imx21-fb.0");
-       clk_register_clkdev(clk[csi_ahb_gate], "ahb", "imx27-camera.0");
-       clk_register_clkdev(clk[per4_gate], "per", "imx27-camera.0");
-       clk_register_clkdev(clk[usb_div], "per", "imx-udc-mx27");
-       clk_register_clkdev(clk[usb_ipg_gate], "ipg", "imx-udc-mx27");
-       clk_register_clkdev(clk[usb_ahb_gate], "ahb", "imx-udc-mx27");
-       clk_register_clkdev(clk[usb_div], "per", "mxc-ehci.0");
-       clk_register_clkdev(clk[usb_ipg_gate], "ipg", "mxc-ehci.0");
-       clk_register_clkdev(clk[usb_ahb_gate], "ahb", "mxc-ehci.0");
-       clk_register_clkdev(clk[usb_div], "per", "mxc-ehci.1");
-       clk_register_clkdev(clk[usb_ipg_gate], "ipg", "mxc-ehci.1");
-       clk_register_clkdev(clk[usb_ahb_gate], "ahb", "mxc-ehci.1");
-       clk_register_clkdev(clk[usb_div], "per", "mxc-ehci.2");
-       clk_register_clkdev(clk[usb_ipg_gate], "ipg", "mxc-ehci.2");
-       clk_register_clkdev(clk[usb_ahb_gate], "ahb", "mxc-ehci.2");
-       clk_register_clkdev(clk[ssi1_ipg_gate], NULL, "imx-ssi.0");
-       clk_register_clkdev(clk[ssi2_ipg_gate], NULL, "imx-ssi.1");
-       clk_register_clkdev(clk[nfc_baud_gate], NULL, "imx27-nand.0");
-       clk_register_clkdev(clk[vpu_baud_gate], "per", "coda-imx27.0");
-       clk_register_clkdev(clk[vpu_ahb_gate], "ahb", "coda-imx27.0");
-       clk_register_clkdev(clk[dma_ahb_gate], "ahb", "imx27-dma");
-       clk_register_clkdev(clk[dma_ipg_gate], "ipg", "imx27-dma");
-       clk_register_clkdev(clk[fec_ipg_gate], "ipg", "imx27-fec.0");
-       clk_register_clkdev(clk[fec_ahb_gate], "ahb", "imx27-fec.0");
-       clk_register_clkdev(clk[wdog_ipg_gate], NULL, "imx2-wdt.0");
-       clk_register_clkdev(clk[i2c1_ipg_gate], NULL, "imx21-i2c.0");
-       clk_register_clkdev(clk[i2c2_ipg_gate], NULL, "imx21-i2c.1");
-       clk_register_clkdev(clk[owire_ipg_gate], NULL, "mxc_w1.0");
-       clk_register_clkdev(clk[kpp_ipg_gate], NULL, "imx-keypad");
-       clk_register_clkdev(clk[emma_ahb_gate], "emma-ahb", "imx27-camera.0");
-       clk_register_clkdev(clk[emma_ipg_gate], "emma-ipg", "imx27-camera.0");
-       clk_register_clkdev(clk[emma_ahb_gate], "ahb", "m2m-emmaprp.0");
-       clk_register_clkdev(clk[emma_ipg_gate], "ipg", "m2m-emmaprp.0");
-       clk_register_clkdev(clk[cpu_div], NULL, "cpu0");
+       clk_register_clkdev(clk[IMX27_CLK_CPU_DIV], NULL, "cpu0");
 
-       mxc_timer_init(MX27_IO_ADDRESS(MX27_GPT1_BASE_ADDR), MX27_INT_GPT1);
-
-       clk_prepare_enable(clk[emi_ahb_gate]);
+       clk_prepare_enable(clk[IMX27_CLK_EMI_AHB_GATE]);
 
        imx_print_silicon_rev("i.MX27", mx27_revision());
+}
+
+int __init mx27_clocks_init(unsigned long fref)
+{
+       ccm = ioremap(MX27_CCM_BASE_ADDR, SZ_4K);
+
+       _mx27_clocks_init(fref);
+
+       clk_register_clkdev(clk[IMX27_CLK_UART1_IPG_GATE], "ipg", "imx21-uart.0");
+       clk_register_clkdev(clk[IMX27_CLK_PER1_GATE], "per", "imx21-uart.0");
+       clk_register_clkdev(clk[IMX27_CLK_UART2_IPG_GATE], "ipg", "imx21-uart.1");
+       clk_register_clkdev(clk[IMX27_CLK_PER1_GATE], "per", "imx21-uart.1");
+       clk_register_clkdev(clk[IMX27_CLK_UART3_IPG_GATE], "ipg", "imx21-uart.2");
+       clk_register_clkdev(clk[IMX27_CLK_PER1_GATE], "per", "imx21-uart.2");
+       clk_register_clkdev(clk[IMX27_CLK_UART4_IPG_GATE], "ipg", "imx21-uart.3");
+       clk_register_clkdev(clk[IMX27_CLK_PER1_GATE], "per", "imx21-uart.3");
+       clk_register_clkdev(clk[IMX27_CLK_UART5_IPG_GATE], "ipg", "imx21-uart.4");
+       clk_register_clkdev(clk[IMX27_CLK_PER1_GATE], "per", "imx21-uart.4");
+       clk_register_clkdev(clk[IMX27_CLK_UART6_IPG_GATE], "ipg", "imx21-uart.5");
+       clk_register_clkdev(clk[IMX27_CLK_PER1_GATE], "per", "imx21-uart.5");
+       clk_register_clkdev(clk[IMX27_CLK_GPT1_IPG_GATE], "ipg", "imx-gpt.0");
+       clk_register_clkdev(clk[IMX27_CLK_PER1_GATE], "per", "imx-gpt.0");
+       clk_register_clkdev(clk[IMX27_CLK_PER2_GATE], "per", "imx21-mmc.0");
+       clk_register_clkdev(clk[IMX27_CLK_SDHC1_IPG_GATE], "ipg", "imx21-mmc.0");
+       clk_register_clkdev(clk[IMX27_CLK_PER2_GATE], "per", "imx21-mmc.1");
+       clk_register_clkdev(clk[IMX27_CLK_SDHC2_IPG_GATE], "ipg", "imx21-mmc.1");
+       clk_register_clkdev(clk[IMX27_CLK_PER2_GATE], "per", "imx21-mmc.2");
+       clk_register_clkdev(clk[IMX27_CLK_SDHC2_IPG_GATE], "ipg", "imx21-mmc.2");
+       clk_register_clkdev(clk[IMX27_CLK_PER2_GATE], "per", "imx27-cspi.0");
+       clk_register_clkdev(clk[IMX27_CLK_CSPI1_IPG_GATE], "ipg", "imx27-cspi.0");
+       clk_register_clkdev(clk[IMX27_CLK_PER2_GATE], "per", "imx27-cspi.1");
+       clk_register_clkdev(clk[IMX27_CLK_CSPI2_IPG_GATE], "ipg", "imx27-cspi.1");
+       clk_register_clkdev(clk[IMX27_CLK_PER2_GATE], "per", "imx27-cspi.2");
+       clk_register_clkdev(clk[IMX27_CLK_CSPI3_IPG_GATE], "ipg", "imx27-cspi.2");
+       clk_register_clkdev(clk[IMX27_CLK_PER3_GATE], "per", "imx21-fb.0");
+       clk_register_clkdev(clk[IMX27_CLK_LCDC_IPG_GATE], "ipg", "imx21-fb.0");
+       clk_register_clkdev(clk[IMX27_CLK_LCDC_AHB_GATE], "ahb", "imx21-fb.0");
+       clk_register_clkdev(clk[IMX27_CLK_CSI_AHB_GATE], "ahb", "imx27-camera.0");
+       clk_register_clkdev(clk[IMX27_CLK_PER4_GATE], "per", "imx27-camera.0");
+       clk_register_clkdev(clk[IMX27_CLK_USB_DIV], "per", "imx-udc-mx27");
+       clk_register_clkdev(clk[IMX27_CLK_USB_IPG_GATE], "ipg", "imx-udc-mx27");
+       clk_register_clkdev(clk[IMX27_CLK_USB_AHB_GATE], "ahb", "imx-udc-mx27");
+       clk_register_clkdev(clk[IMX27_CLK_USB_DIV], "per", "mxc-ehci.0");
+       clk_register_clkdev(clk[IMX27_CLK_USB_IPG_GATE], "ipg", "mxc-ehci.0");
+       clk_register_clkdev(clk[IMX27_CLK_USB_AHB_GATE], "ahb", "mxc-ehci.0");
+       clk_register_clkdev(clk[IMX27_CLK_USB_DIV], "per", "mxc-ehci.1");
+       clk_register_clkdev(clk[IMX27_CLK_USB_IPG_GATE], "ipg", "mxc-ehci.1");
+       clk_register_clkdev(clk[IMX27_CLK_USB_AHB_GATE], "ahb", "mxc-ehci.1");
+       clk_register_clkdev(clk[IMX27_CLK_USB_DIV], "per", "mxc-ehci.2");
+       clk_register_clkdev(clk[IMX27_CLK_USB_IPG_GATE], "ipg", "mxc-ehci.2");
+       clk_register_clkdev(clk[IMX27_CLK_USB_AHB_GATE], "ahb", "mxc-ehci.2");
+       clk_register_clkdev(clk[IMX27_CLK_SSI1_IPG_GATE], NULL, "imx-ssi.0");
+       clk_register_clkdev(clk[IMX27_CLK_SSI2_IPG_GATE], NULL, "imx-ssi.1");
+       clk_register_clkdev(clk[IMX27_CLK_NFC_BAUD_GATE], NULL, "imx27-nand.0");
+       clk_register_clkdev(clk[IMX27_CLK_VPU_BAUD_GATE], "per", "coda-imx27.0");
+       clk_register_clkdev(clk[IMX27_CLK_VPU_AHB_GATE], "ahb", "coda-imx27.0");
+       clk_register_clkdev(clk[IMX27_CLK_DMA_AHB_GATE], "ahb", "imx27-dma");
+       clk_register_clkdev(clk[IMX27_CLK_DMA_IPG_GATE], "ipg", "imx27-dma");
+       clk_register_clkdev(clk[IMX27_CLK_FEC_IPG_GATE], "ipg", "imx27-fec.0");
+       clk_register_clkdev(clk[IMX27_CLK_FEC_AHB_GATE], "ahb", "imx27-fec.0");
+       clk_register_clkdev(clk[IMX27_CLK_WDOG_IPG_GATE], NULL, "imx2-wdt.0");
+       clk_register_clkdev(clk[IMX27_CLK_I2C1_IPG_GATE], NULL, "imx21-i2c.0");
+       clk_register_clkdev(clk[IMX27_CLK_I2C2_IPG_GATE], NULL, "imx21-i2c.1");
+       clk_register_clkdev(clk[IMX27_CLK_OWIRE_IPG_GATE], NULL, "mxc_w1.0");
+       clk_register_clkdev(clk[IMX27_CLK_KPP_IPG_GATE], NULL, "imx-keypad");
+       clk_register_clkdev(clk[IMX27_CLK_EMMA_AHB_GATE], "emma-ahb", "imx27-camera.0");
+       clk_register_clkdev(clk[IMX27_CLK_EMMA_IPG_GATE], "emma-ipg", "imx27-camera.0");
+       clk_register_clkdev(clk[IMX27_CLK_EMMA_AHB_GATE], "ahb", "m2m-emmaprp.0");
+       clk_register_clkdev(clk[IMX27_CLK_EMMA_IPG_GATE], "ipg", "m2m-emmaprp.0");
+
+       mxc_timer_init(MX27_IO_ADDRESS(MX27_GPT1_BASE_ADDR), MX27_INT_GPT1);
 
        return 0;
 }
 
-int __init mx27_clocks_init_dt(void)
+static void __init mx27_clocks_init_dt(struct device_node *np)
 {
-       struct device_node *np;
+       struct device_node *refnp;
        u32 fref = 26000000; /* default */
 
-       for_each_compatible_node(np, NULL, "fixed-clock") {
-               if (!of_device_is_compatible(np, "fsl,imx-osc26m"))
+       for_each_compatible_node(refnp, NULL, "fixed-clock") {
+               if (!of_device_is_compatible(refnp, "fsl,imx-osc26m"))
                        continue;
 
-               if (!of_property_read_u32(np, "clock-frequency", &fref))
+               if (!of_property_read_u32(refnp, "clock-frequency", &fref))
                        break;
        }
 
-       return mx27_clocks_init(fref);
+       ccm = of_iomap(np, 0);
+
+       _mx27_clocks_init(fref);
+
+       clk_data.clks = clk;
+       clk_data.clk_num = ARRAY_SIZE(clk);
+       of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
 }
+CLK_OF_DECLARE(imx27_ccm, "fsl,imx27-ccm", mx27_clocks_init_dt);
index 4a9de0835eb1d0a2616af36ce3d1c899533ef996..286ef422cebc9e3624036fdb4931b4bb36b5702e 100644 (file)
@@ -51,7 +51,6 @@ static struct clk_onecell_data clk_data;
 int __init mx31_clocks_init(unsigned long fref)
 {
        void __iomem *base = MX31_IO_ADDRESS(MX31_CCM_BASE_ADDR);
-       int i;
        struct device_node *np;
 
        clk[dummy] = imx_clk_fixed("dummy", 0);
@@ -114,10 +113,7 @@ int __init mx31_clocks_init(unsigned long fref)
        clk[rtic_gate] = imx_clk_gate2("rtic_gate", "ahb", base + MXC_CCM_CGR2, 10);
        clk[firi_gate] = imx_clk_gate2("firi_gate", "upll", base+MXC_CCM_CGR2, 12);
 
-       for (i = 0; i < ARRAY_SIZE(clk); i++)
-               if (IS_ERR(clk[i]))
-                       pr_err("imx31 clk %d: register failed with %ld\n",
-                               i, PTR_ERR(clk[i]));
+       imx_check_clocks(clk, ARRAY_SIZE(clk));
 
        np = of_find_compatible_node(NULL, NULL, "fsl,imx31-ccm");
 
index 71c86a2f856d5ddb5ffb9565afdbdb4b5ce3be6e..a0d2b57fd376e2d6781c618ca82093d90386c9e5 100644 (file)
@@ -75,7 +75,6 @@ int __init mx35_clocks_init(void)
        u32 pdr0, consumer_sel, hsp_sel;
        struct arm_ahb_div *aad;
        unsigned char *hsp_div;
-       u32 i;
 
        pdr0 = __raw_readl(base + MXC_CCM_PDR0);
        consumer_sel = (pdr0 >> 16) & 0xf;
@@ -200,10 +199,7 @@ int __init mx35_clocks_init(void)
        clk[iim_gate] = imx_clk_gate2("iim_gate", "ipg", base + MX35_CCM_CGR3,  2);
        clk[gpu2d_gate] = imx_clk_gate2("gpu2d_gate", "ahb", base + MX35_CCM_CGR3,  4);
 
-       for (i = 0; i < ARRAY_SIZE(clk); i++)
-               if (IS_ERR(clk[i]))
-                       pr_err("i.MX35 clk %d: register failed with %ld\n",
-                               i, PTR_ERR(clk[i]));
+       imx_check_clocks(clk, ARRAY_SIZE(clk));
 
        clk_register_clkdev(clk[pata_gate], NULL, "pata_imx");
        clk_register_clkdev(clk[can1_gate], NULL, "flexcan.0");
index 21d2b111c83d5e5c778445545e2879b60a33b667..72d65214223e3520c0c3f2b9987e62f8e5619531 100644 (file)
 #include <linux/of_irq.h>
 #include <dt-bindings/clock/imx5-clock.h>
 
-#include "crm-regs-imx5.h"
 #include "clk.h"
 #include "common.h"
 #include "hardware.h"
 
+#define MX51_DPLL1_BASE                0x83f80000
+#define MX51_DPLL2_BASE                0x83f84000
+#define MX51_DPLL3_BASE                0x83f88000
+
+#define MX53_DPLL1_BASE                0x63f80000
+#define MX53_DPLL2_BASE                0x63f84000
+#define MX53_DPLL3_BASE                0x63f88000
+#define MX53_DPLL4_BASE                0x63f8c000
+
+#define MXC_CCM_CCR            (ccm_base + 0x00)
+#define MXC_CCM_CCDR           (ccm_base + 0x04)
+#define MXC_CCM_CSR            (ccm_base + 0x08)
+#define MXC_CCM_CCSR           (ccm_base + 0x0c)
+#define MXC_CCM_CACRR          (ccm_base + 0x10)
+#define MXC_CCM_CBCDR          (ccm_base + 0x14)
+#define MXC_CCM_CBCMR          (ccm_base + 0x18)
+#define MXC_CCM_CSCMR1         (ccm_base + 0x1c)
+#define MXC_CCM_CSCMR2         (ccm_base + 0x20)
+#define MXC_CCM_CSCDR1         (ccm_base + 0x24)
+#define MXC_CCM_CS1CDR         (ccm_base + 0x28)
+#define MXC_CCM_CS2CDR         (ccm_base + 0x2c)
+#define MXC_CCM_CDCDR          (ccm_base + 0x30)
+#define MXC_CCM_CHSCDR         (ccm_base + 0x34)
+#define MXC_CCM_CSCDR2         (ccm_base + 0x38)
+#define MXC_CCM_CSCDR3         (ccm_base + 0x3c)
+#define MXC_CCM_CSCDR4         (ccm_base + 0x40)
+#define MXC_CCM_CWDR           (ccm_base + 0x44)
+#define MXC_CCM_CDHIPR         (ccm_base + 0x48)
+#define MXC_CCM_CDCR           (ccm_base + 0x4c)
+#define MXC_CCM_CTOR           (ccm_base + 0x50)
+#define MXC_CCM_CLPCR          (ccm_base + 0x54)
+#define MXC_CCM_CISR           (ccm_base + 0x58)
+#define MXC_CCM_CIMR           (ccm_base + 0x5c)
+#define MXC_CCM_CCOSR          (ccm_base + 0x60)
+#define MXC_CCM_CGPR           (ccm_base + 0x64)
+#define MXC_CCM_CCGR0          (ccm_base + 0x68)
+#define MXC_CCM_CCGR1          (ccm_base + 0x6c)
+#define MXC_CCM_CCGR2          (ccm_base + 0x70)
+#define MXC_CCM_CCGR3          (ccm_base + 0x74)
+#define MXC_CCM_CCGR4          (ccm_base + 0x78)
+#define MXC_CCM_CCGR5          (ccm_base + 0x7c)
+#define MXC_CCM_CCGR6          (ccm_base + 0x80)
+#define MXC_CCM_CCGR7          (ccm_base + 0x84)
+
 /* Low-power Audio Playback Mode clock */
 static const char *lp_apm_sel[] = { "osc", };
 
@@ -86,17 +129,15 @@ static const char *mx51_spdif1_com_sel[] = { "spdif1_podf", "ssi2_root_gate", };
 static struct clk *clk[IMX5_CLK_END];
 static struct clk_onecell_data clk_data;
 
-static void __init mx5_clocks_common_init(unsigned long rate_ckil,
-               unsigned long rate_osc, unsigned long rate_ckih1,
-               unsigned long rate_ckih2)
+static void __init mx5_clocks_common_init(void __iomem *ccm_base)
 {
-       int i;
+       imx5_pm_set_ccm_base(ccm_base);
 
        clk[IMX5_CLK_DUMMY]             = imx_clk_fixed("dummy", 0);
-       clk[IMX5_CLK_CKIL]              = imx_obtain_fixed_clock("ckil", rate_ckil);
-       clk[IMX5_CLK_OSC]               = imx_obtain_fixed_clock("osc", rate_osc);
-       clk[IMX5_CLK_CKIH1]             = imx_obtain_fixed_clock("ckih1", rate_ckih1);
-       clk[IMX5_CLK_CKIH2]             = imx_obtain_fixed_clock("ckih2", rate_ckih2);
+       clk[IMX5_CLK_CKIL]              = imx_obtain_fixed_clock("ckil", 0);
+       clk[IMX5_CLK_OSC]               = imx_obtain_fixed_clock("osc", 0);
+       clk[IMX5_CLK_CKIH1]             = imx_obtain_fixed_clock("ckih1", 0);
+       clk[IMX5_CLK_CKIH2]             = imx_obtain_fixed_clock("ckih2", 0);
 
        clk[IMX5_CLK_PERIPH_APM]        = imx_clk_mux("periph_apm", MXC_CCM_CBCMR, 12, 2,
                                                periph_apm_sel, ARRAY_SIZE(periph_apm_sel));
@@ -244,58 +285,8 @@ static void __init mx5_clocks_common_init(unsigned long rate_ckil,
        clk[IMX5_CLK_SAHARA_IPG_GATE]   = imx_clk_gate2("sahara_ipg_gate", "ipg", MXC_CCM_CCGR4, 14);
        clk[IMX5_CLK_SATA_REF]          = imx_clk_fixed_factor("sata_ref", "usb_phy1_gate", 1, 1);
 
-       for (i = 0; i < ARRAY_SIZE(clk); i++)
-               if (IS_ERR(clk[i]))
-                       pr_err("i.MX5 clk %d: register failed with %ld\n",
-                               i, PTR_ERR(clk[i]));
-
-       clk_register_clkdev(clk[IMX5_CLK_GPT_HF_GATE], "per", "imx-gpt.0");
-       clk_register_clkdev(clk[IMX5_CLK_GPT_IPG_GATE], "ipg", "imx-gpt.0");
-       clk_register_clkdev(clk[IMX5_CLK_UART1_PER_GATE], "per", "imx21-uart.0");
-       clk_register_clkdev(clk[IMX5_CLK_UART1_IPG_GATE], "ipg", "imx21-uart.0");
-       clk_register_clkdev(clk[IMX5_CLK_UART2_PER_GATE], "per", "imx21-uart.1");
-       clk_register_clkdev(clk[IMX5_CLK_UART2_IPG_GATE], "ipg", "imx21-uart.1");
-       clk_register_clkdev(clk[IMX5_CLK_UART3_PER_GATE], "per", "imx21-uart.2");
-       clk_register_clkdev(clk[IMX5_CLK_UART3_IPG_GATE], "ipg", "imx21-uart.2");
-       clk_register_clkdev(clk[IMX5_CLK_UART4_PER_GATE], "per", "imx21-uart.3");
-       clk_register_clkdev(clk[IMX5_CLK_UART4_IPG_GATE], "ipg", "imx21-uart.3");
-       clk_register_clkdev(clk[IMX5_CLK_UART5_PER_GATE], "per", "imx21-uart.4");
-       clk_register_clkdev(clk[IMX5_CLK_UART5_IPG_GATE], "ipg", "imx21-uart.4");
-       clk_register_clkdev(clk[IMX5_CLK_ECSPI1_PER_GATE], "per", "imx51-ecspi.0");
-       clk_register_clkdev(clk[IMX5_CLK_ECSPI1_IPG_GATE], "ipg", "imx51-ecspi.0");
-       clk_register_clkdev(clk[IMX5_CLK_ECSPI2_PER_GATE], "per", "imx51-ecspi.1");
-       clk_register_clkdev(clk[IMX5_CLK_ECSPI2_IPG_GATE], "ipg", "imx51-ecspi.1");
-       clk_register_clkdev(clk[IMX5_CLK_CSPI_IPG_GATE], NULL, "imx35-cspi.2");
-       clk_register_clkdev(clk[IMX5_CLK_I2C1_GATE], NULL, "imx21-i2c.0");
-       clk_register_clkdev(clk[IMX5_CLK_I2C2_GATE], NULL, "imx21-i2c.1");
-       clk_register_clkdev(clk[IMX5_CLK_USBOH3_PER_GATE], "per", "mxc-ehci.0");
-       clk_register_clkdev(clk[IMX5_CLK_USBOH3_GATE], "ipg", "mxc-ehci.0");
-       clk_register_clkdev(clk[IMX5_CLK_USBOH3_GATE], "ahb", "mxc-ehci.0");
-       clk_register_clkdev(clk[IMX5_CLK_USBOH3_PER_GATE], "per", "mxc-ehci.1");
-       clk_register_clkdev(clk[IMX5_CLK_USBOH3_GATE], "ipg", "mxc-ehci.1");
-       clk_register_clkdev(clk[IMX5_CLK_USBOH3_GATE], "ahb", "mxc-ehci.1");
-       clk_register_clkdev(clk[IMX5_CLK_USBOH3_PER_GATE], "per", "mxc-ehci.2");
-       clk_register_clkdev(clk[IMX5_CLK_USBOH3_GATE], "ipg", "mxc-ehci.2");
-       clk_register_clkdev(clk[IMX5_CLK_USBOH3_GATE], "ahb", "mxc-ehci.2");
-       clk_register_clkdev(clk[IMX5_CLK_USBOH3_PER_GATE], "per", "imx-udc-mx51");
-       clk_register_clkdev(clk[IMX5_CLK_USBOH3_GATE], "ipg", "imx-udc-mx51");
-       clk_register_clkdev(clk[IMX5_CLK_USBOH3_GATE], "ahb", "imx-udc-mx51");
-       clk_register_clkdev(clk[IMX5_CLK_NFC_GATE], NULL, "imx51-nand");
-       clk_register_clkdev(clk[IMX5_CLK_SSI1_IPG_GATE], NULL, "imx-ssi.0");
-       clk_register_clkdev(clk[IMX5_CLK_SSI2_IPG_GATE], NULL, "imx-ssi.1");
-       clk_register_clkdev(clk[IMX5_CLK_SSI3_IPG_GATE], NULL, "imx-ssi.2");
-       clk_register_clkdev(clk[IMX5_CLK_SDMA_GATE], NULL, "imx35-sdma");
        clk_register_clkdev(clk[IMX5_CLK_CPU_PODF], NULL, "cpu0");
-       clk_register_clkdev(clk[IMX5_CLK_IIM_GATE], "iim", NULL);
-       clk_register_clkdev(clk[IMX5_CLK_DUMMY], NULL, "imx2-wdt.0");
-       clk_register_clkdev(clk[IMX5_CLK_DUMMY], NULL, "imx2-wdt.1");
-       clk_register_clkdev(clk[IMX5_CLK_DUMMY], NULL, "imx-keypad");
-       clk_register_clkdev(clk[IMX5_CLK_IPU_DI1_GATE], "di1", "imx-tve.0");
        clk_register_clkdev(clk[IMX5_CLK_GPC_DVFS], "gpc_dvfs", NULL);
-       clk_register_clkdev(clk[IMX5_CLK_EPIT1_IPG_GATE], "ipg", "imx-epit.0");
-       clk_register_clkdev(clk[IMX5_CLK_EPIT1_HF_GATE], "per", "imx-epit.0");
-       clk_register_clkdev(clk[IMX5_CLK_EPIT2_IPG_GATE], "ipg", "imx-epit.1");
-       clk_register_clkdev(clk[IMX5_CLK_EPIT2_HF_GATE], "per", "imx-epit.1");
 
        /* Set SDHC parents to be PLL2 */
        clk_set_parent(clk[IMX5_CLK_ESDHC_A_SEL], clk[IMX5_CLK_PLL2_SW]);
@@ -322,12 +313,26 @@ static void __init mx5_clocks_common_init(unsigned long rate_ckil,
 
 static void __init mx50_clocks_init(struct device_node *np)
 {
+       void __iomem *ccm_base;
+       void __iomem *pll_base;
        unsigned long r;
-       int i;
 
-       clk[IMX5_CLK_PLL1_SW]           = imx_clk_pllv2("pll1_sw", "osc", MX53_DPLL1_BASE);
-       clk[IMX5_CLK_PLL2_SW]           = imx_clk_pllv2("pll2_sw", "osc", MX53_DPLL2_BASE);
-       clk[IMX5_CLK_PLL3_SW]           = imx_clk_pllv2("pll3_sw", "osc", MX53_DPLL3_BASE);
+       pll_base = ioremap(MX53_DPLL1_BASE, SZ_16K);
+       WARN_ON(!pll_base);
+       clk[IMX5_CLK_PLL1_SW]           = imx_clk_pllv2("pll1_sw", "osc", pll_base);
+
+       pll_base = ioremap(MX53_DPLL2_BASE, SZ_16K);
+       WARN_ON(!pll_base);
+       clk[IMX5_CLK_PLL2_SW]           = imx_clk_pllv2("pll2_sw", "osc", pll_base);
+
+       pll_base = ioremap(MX53_DPLL3_BASE, SZ_16K);
+       WARN_ON(!pll_base);
+       clk[IMX5_CLK_PLL3_SW]           = imx_clk_pllv2("pll3_sw", "osc", pll_base);
+
+       ccm_base = of_iomap(np, 0);
+       WARN_ON(!ccm_base);
+
+       mx5_clocks_common_init(ccm_base);
 
        clk[IMX5_CLK_LP_APM]            = imx_clk_mux("lp_apm", MXC_CCM_CCSR, 10, 1,
                                                lp_apm_sel, ARRAY_SIZE(lp_apm_sel));
@@ -349,17 +354,12 @@ static void __init mx50_clocks_init(struct device_node *np)
        clk[IMX5_CLK_CKO2_PODF]         = imx_clk_divider("cko2_podf", "cko2_sel", MXC_CCM_CCOSR, 21, 3);
        clk[IMX5_CLK_CKO2]              = imx_clk_gate2("cko2", "cko2_podf", MXC_CCM_CCOSR, 24);
 
-       for (i = 0; i < ARRAY_SIZE(clk); i++)
-               if (IS_ERR(clk[i]))
-                       pr_err("i.MX50 clk %d: register failed with %ld\n",
-                               i, PTR_ERR(clk[i]));
+       imx_check_clocks(clk, ARRAY_SIZE(clk));
 
        clk_data.clks = clk;
        clk_data.clk_num = ARRAY_SIZE(clk);
        of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
 
-       mx5_clocks_common_init(0, 0, 0, 0);
-
        /* set SDHC root clock to 200MHZ*/
        clk_set_rate(clk[IMX5_CLK_ESDHC_A_PODF], 200000000);
        clk_set_rate(clk[IMX5_CLK_ESDHC_B_PODF], 200000000);
@@ -370,21 +370,32 @@ static void __init mx50_clocks_init(struct device_node *np)
 
        r = clk_round_rate(clk[IMX5_CLK_USBOH3_PER_GATE], 54000000);
        clk_set_rate(clk[IMX5_CLK_USBOH3_PER_GATE], r);
-
-       mxc_timer_init_dt(of_find_compatible_node(NULL, NULL, "fsl,imx50-gpt"));
 }
 CLK_OF_DECLARE(imx50_ccm, "fsl,imx50-ccm", mx50_clocks_init);
 
-int __init mx51_clocks_init(unsigned long rate_ckil, unsigned long rate_osc,
-                       unsigned long rate_ckih1, unsigned long rate_ckih2)
+static void __init mx51_clocks_init(struct device_node *np)
 {
-       int i;
+       void __iomem *ccm_base;
+       void __iomem *pll_base;
        u32 val;
-       struct device_node *np;
 
-       clk[IMX5_CLK_PLL1_SW]           = imx_clk_pllv2("pll1_sw", "osc", MX51_DPLL1_BASE);
-       clk[IMX5_CLK_PLL2_SW]           = imx_clk_pllv2("pll2_sw", "osc", MX51_DPLL2_BASE);
-       clk[IMX5_CLK_PLL3_SW]           = imx_clk_pllv2("pll3_sw", "osc", MX51_DPLL3_BASE);
+       pll_base = ioremap(MX51_DPLL1_BASE, SZ_16K);
+       WARN_ON(!pll_base);
+       clk[IMX5_CLK_PLL1_SW]           = imx_clk_pllv2("pll1_sw", "osc", pll_base);
+
+       pll_base = ioremap(MX51_DPLL2_BASE, SZ_16K);
+       WARN_ON(!pll_base);
+       clk[IMX5_CLK_PLL2_SW]           = imx_clk_pllv2("pll2_sw", "osc", pll_base);
+
+       pll_base = ioremap(MX51_DPLL3_BASE, SZ_16K);
+       WARN_ON(!pll_base);
+       clk[IMX5_CLK_PLL3_SW]           = imx_clk_pllv2("pll3_sw", "osc", pll_base);
+
+       ccm_base = of_iomap(np, 0);
+       WARN_ON(!ccm_base);
+
+       mx5_clocks_common_init(ccm_base);
+
        clk[IMX5_CLK_LP_APM]            = imx_clk_mux("lp_apm", MXC_CCM_CCSR, 9, 1,
                                                lp_apm_sel, ARRAY_SIZE(lp_apm_sel));
        clk[IMX5_CLK_IPU_DI0_SEL]       = imx_clk_mux("ipu_di0_sel", MXC_CCM_CSCMR2, 26, 3,
@@ -417,35 +428,12 @@ int __init mx51_clocks_init(unsigned long rate_ckil, unsigned long rate_osc,
                                                mx51_spdif1_com_sel, ARRAY_SIZE(mx51_spdif1_com_sel));
        clk[IMX5_CLK_SPDIF1_GATE]       = imx_clk_gate2("spdif1_gate", "spdif1_com_sel", MXC_CCM_CCGR5, 28);
 
-       for (i = 0; i < ARRAY_SIZE(clk); i++)
-               if (IS_ERR(clk[i]))
-                       pr_err("i.MX51 clk %d: register failed with %ld\n",
-                               i, PTR_ERR(clk[i]));
+       imx_check_clocks(clk, ARRAY_SIZE(clk));
 
-       np = of_find_compatible_node(NULL, NULL, "fsl,imx51-ccm");
        clk_data.clks = clk;
        clk_data.clk_num = ARRAY_SIZE(clk);
        of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
 
-       mx5_clocks_common_init(rate_ckil, rate_osc, rate_ckih1, rate_ckih2);
-
-       clk_register_clkdev(clk[IMX5_CLK_HSI2C_GATE], NULL, "imx21-i2c.2");
-       clk_register_clkdev(clk[IMX5_CLK_MX51_MIPI], "mipi_hsp", NULL);
-       clk_register_clkdev(clk[IMX5_CLK_FEC_GATE], NULL, "imx27-fec.0");
-       clk_register_clkdev(clk[IMX5_CLK_USB_PHY_GATE], "phy", "mxc-ehci.0");
-       clk_register_clkdev(clk[IMX5_CLK_ESDHC1_IPG_GATE], "ipg", "sdhci-esdhc-imx51.0");
-       clk_register_clkdev(clk[IMX5_CLK_DUMMY], "ahb", "sdhci-esdhc-imx51.0");
-       clk_register_clkdev(clk[IMX5_CLK_ESDHC1_PER_GATE], "per", "sdhci-esdhc-imx51.0");
-       clk_register_clkdev(clk[IMX5_CLK_ESDHC2_IPG_GATE], "ipg", "sdhci-esdhc-imx51.1");
-       clk_register_clkdev(clk[IMX5_CLK_DUMMY], "ahb", "sdhci-esdhc-imx51.1");
-       clk_register_clkdev(clk[IMX5_CLK_ESDHC2_PER_GATE], "per", "sdhci-esdhc-imx51.1");
-       clk_register_clkdev(clk[IMX5_CLK_ESDHC3_IPG_GATE], "ipg", "sdhci-esdhc-imx51.2");
-       clk_register_clkdev(clk[IMX5_CLK_DUMMY], "ahb", "sdhci-esdhc-imx51.2");
-       clk_register_clkdev(clk[IMX5_CLK_ESDHC3_PER_GATE], "per", "sdhci-esdhc-imx51.2");
-       clk_register_clkdev(clk[IMX5_CLK_ESDHC4_IPG_GATE], "ipg", "sdhci-esdhc-imx51.3");
-       clk_register_clkdev(clk[IMX5_CLK_DUMMY], "ahb", "sdhci-esdhc-imx51.3");
-       clk_register_clkdev(clk[IMX5_CLK_ESDHC4_PER_GATE], "per", "sdhci-esdhc-imx51.3");
-
        /* set the usboh3 parent to pll2_sw */
        clk_set_parent(clk[IMX5_CLK_USBOH3_SEL], clk[IMX5_CLK_PLL2_SW]);
 
@@ -453,9 +441,6 @@ int __init mx51_clocks_init(unsigned long rate_ckil, unsigned long rate_osc,
        clk_set_rate(clk[IMX5_CLK_ESDHC_A_PODF], 166250000);
        clk_set_rate(clk[IMX5_CLK_ESDHC_B_PODF], 166250000);
 
-       /* System timer */
-       mxc_timer_init(MX51_IO_ADDRESS(MX51_GPT1_BASE_ADDR), MX51_INT_GPT);
-
        clk_prepare_enable(clk[IMX5_CLK_IIM_GATE]);
        imx_print_silicon_rev("i.MX51", mx51_revision());
        clk_disable_unprepare(clk[IMX5_CLK_IIM_GATE]);
@@ -474,25 +459,35 @@ int __init mx51_clocks_init(unsigned long rate_ckil, unsigned long rate_osc,
        val = readl(MXC_CCM_CLPCR);
        val |= 1 << 23;
        writel(val, MXC_CCM_CLPCR);
-
-       return 0;
-}
-
-static void __init mx51_clocks_init_dt(struct device_node *np)
-{
-       mx51_clocks_init(0, 0, 0, 0);
 }
-CLK_OF_DECLARE(imx51_ccm, "fsl,imx51-ccm", mx51_clocks_init_dt);
+CLK_OF_DECLARE(imx51_ccm, "fsl,imx51-ccm", mx51_clocks_init);
 
 static void __init mx53_clocks_init(struct device_node *np)
 {
-       int i;
+       void __iomem *ccm_base;
+       void __iomem *pll_base;
        unsigned long r;
 
-       clk[IMX5_CLK_PLL1_SW]           = imx_clk_pllv2("pll1_sw", "osc", MX53_DPLL1_BASE);
-       clk[IMX5_CLK_PLL2_SW]           = imx_clk_pllv2("pll2_sw", "osc", MX53_DPLL2_BASE);
-       clk[IMX5_CLK_PLL3_SW]           = imx_clk_pllv2("pll3_sw", "osc", MX53_DPLL3_BASE);
-       clk[IMX5_CLK_PLL4_SW]           = imx_clk_pllv2("pll4_sw", "osc", MX53_DPLL4_BASE);
+       pll_base = ioremap(MX53_DPLL1_BASE, SZ_16K);
+       WARN_ON(!pll_base);
+       clk[IMX5_CLK_PLL1_SW]           = imx_clk_pllv2("pll1_sw", "osc", pll_base);
+
+       pll_base = ioremap(MX53_DPLL2_BASE, SZ_16K);
+       WARN_ON(!pll_base);
+       clk[IMX5_CLK_PLL2_SW]           = imx_clk_pllv2("pll2_sw", "osc", pll_base);
+
+       pll_base = ioremap(MX53_DPLL3_BASE, SZ_16K);
+       WARN_ON(!pll_base);
+       clk[IMX5_CLK_PLL3_SW]           = imx_clk_pllv2("pll3_sw", "osc", pll_base);
+
+       pll_base = ioremap(MX53_DPLL4_BASE, SZ_16K);
+       WARN_ON(!pll_base);
+       clk[IMX5_CLK_PLL4_SW]           = imx_clk_pllv2("pll4_sw", "osc", pll_base);
+
+       ccm_base = of_iomap(np, 0);
+       WARN_ON(!ccm_base);
+
+       mx5_clocks_common_init(ccm_base);
 
        clk[IMX5_CLK_LP_APM]            = imx_clk_mux("lp_apm", MXC_CCM_CCSR, 10, 1,
                                                lp_apm_sel, ARRAY_SIZE(lp_apm_sel));
@@ -543,33 +538,12 @@ static void __init mx53_clocks_init(struct device_node *np)
        clk[IMX5_CLK_SPDIF_XTAL_SEL]    = imx_clk_mux("spdif_xtal_sel", MXC_CCM_CSCMR1, 2, 2,
                                                mx53_spdif_xtal_sel, ARRAY_SIZE(mx53_spdif_xtal_sel));
 
-       for (i = 0; i < ARRAY_SIZE(clk); i++)
-               if (IS_ERR(clk[i]))
-                       pr_err("i.MX53 clk %d: register failed with %ld\n",
-                               i, PTR_ERR(clk[i]));
+       imx_check_clocks(clk, ARRAY_SIZE(clk));
 
        clk_data.clks = clk;
        clk_data.clk_num = ARRAY_SIZE(clk);
        of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
 
-       mx5_clocks_common_init(0, 0, 0, 0);
-
-       clk_register_clkdev(clk[IMX5_CLK_I2C3_GATE], NULL, "imx21-i2c.2");
-       clk_register_clkdev(clk[IMX5_CLK_FEC_GATE], NULL, "imx25-fec.0");
-       clk_register_clkdev(clk[IMX5_CLK_USB_PHY1_GATE], "usb_phy1", "mxc-ehci.0");
-       clk_register_clkdev(clk[IMX5_CLK_ESDHC1_IPG_GATE], "ipg", "sdhci-esdhc-imx53.0");
-       clk_register_clkdev(clk[IMX5_CLK_DUMMY], "ahb", "sdhci-esdhc-imx53.0");
-       clk_register_clkdev(clk[IMX5_CLK_ESDHC1_PER_GATE], "per", "sdhci-esdhc-imx53.0");
-       clk_register_clkdev(clk[IMX5_CLK_ESDHC2_IPG_GATE], "ipg", "sdhci-esdhc-imx53.1");
-       clk_register_clkdev(clk[IMX5_CLK_DUMMY], "ahb", "sdhci-esdhc-imx53.1");
-       clk_register_clkdev(clk[IMX5_CLK_ESDHC2_PER_GATE], "per", "sdhci-esdhc-imx53.1");
-       clk_register_clkdev(clk[IMX5_CLK_ESDHC3_IPG_GATE], "ipg", "sdhci-esdhc-imx53.2");
-       clk_register_clkdev(clk[IMX5_CLK_DUMMY], "ahb", "sdhci-esdhc-imx53.2");
-       clk_register_clkdev(clk[IMX5_CLK_ESDHC3_PER_GATE], "per", "sdhci-esdhc-imx53.2");
-       clk_register_clkdev(clk[IMX5_CLK_ESDHC4_IPG_GATE], "ipg", "sdhci-esdhc-imx53.3");
-       clk_register_clkdev(clk[IMX5_CLK_DUMMY], "ahb", "sdhci-esdhc-imx53.3");
-       clk_register_clkdev(clk[IMX5_CLK_ESDHC4_PER_GATE], "per", "sdhci-esdhc-imx53.3");
-
        /* set SDHC root clock to 200MHZ*/
        clk_set_rate(clk[IMX5_CLK_ESDHC_A_PODF], 200000000);
        clk_set_rate(clk[IMX5_CLK_ESDHC_B_PODF], 200000000);
@@ -583,7 +557,5 @@ static void __init mx53_clocks_init(struct device_node *np)
 
        r = clk_round_rate(clk[IMX5_CLK_USBOH3_PER_GATE], 54000000);
        clk_set_rate(clk[IMX5_CLK_USBOH3_PER_GATE], r);
-
-       mxc_timer_init_dt(of_find_compatible_node(NULL, NULL, "fsl,imx53-gpt"));
 }
 CLK_OF_DECLARE(imx53_ccm, "fsl,imx53-ccm", mx53_clocks_init);
index 8556c787e59ca89de93f370bd90745b953dbeff9..6cceb7765c14a19f9426309376e13268e3f2091a 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/of.h>
 #include <linux/of_address.h>
 #include <linux/of_irq.h>
+#include <dt-bindings/clock/imx6qdl-clock.h>
 
 #include "clk.h"
 #include "common.h"
@@ -73,48 +74,13 @@ static const char *lvds_sels[] = {
        "pcie_ref_125m", "sata_ref_100m",
 };
 
-enum mx6q_clks {
-       dummy, ckil, ckih, osc, pll2_pfd0_352m, pll2_pfd1_594m, pll2_pfd2_396m,
-       pll3_pfd0_720m, pll3_pfd1_540m, pll3_pfd2_508m, pll3_pfd3_454m,
-       pll2_198m, pll3_120m, pll3_80m, pll3_60m, twd, step, pll1_sw,
-       periph_pre, periph2_pre, periph_clk2_sel, periph2_clk2_sel, axi_sel,
-       esai_sel, asrc_sel, spdif_sel, gpu2d_axi, gpu3d_axi, gpu2d_core_sel,
-       gpu3d_core_sel, gpu3d_shader_sel, ipu1_sel, ipu2_sel, ldb_di0_sel,
-       ldb_di1_sel, ipu1_di0_pre_sel, ipu1_di1_pre_sel, ipu2_di0_pre_sel,
-       ipu2_di1_pre_sel, ipu1_di0_sel, ipu1_di1_sel, ipu2_di0_sel,
-       ipu2_di1_sel, hsi_tx_sel, pcie_axi_sel, ssi1_sel, ssi2_sel, ssi3_sel,
-       usdhc1_sel, usdhc2_sel, usdhc3_sel, usdhc4_sel, enfc_sel, emi_sel,
-       emi_slow_sel, vdo_axi_sel, vpu_axi_sel, cko1_sel, periph, periph2,
-       periph_clk2, periph2_clk2, ipg, ipg_per, esai_pred, esai_podf,
-       asrc_pred, asrc_podf, spdif_pred, spdif_podf, can_root, ecspi_root,
-       gpu2d_core_podf, gpu3d_core_podf, gpu3d_shader, ipu1_podf, ipu2_podf,
-       ldb_di0_podf, ldb_di1_podf, ipu1_di0_pre, ipu1_di1_pre, ipu2_di0_pre,
-       ipu2_di1_pre, hsi_tx_podf, ssi1_pred, ssi1_podf, ssi2_pred, ssi2_podf,
-       ssi3_pred, ssi3_podf, uart_serial_podf, usdhc1_podf, usdhc2_podf,
-       usdhc3_podf, usdhc4_podf, enfc_pred, enfc_podf, emi_podf,
-       emi_slow_podf, vpu_axi_podf, cko1_podf, axi, mmdc_ch0_axi_podf,
-       mmdc_ch1_axi_podf, arm, ahb, apbh_dma, asrc, can1_ipg, can1_serial,
-       can2_ipg, can2_serial, ecspi1, ecspi2, ecspi3, ecspi4, ecspi5, enet,
-       esai, gpt_ipg, gpt_ipg_per, gpu2d_core, gpu3d_core, hdmi_iahb,
-       hdmi_isfr, i2c1, i2c2, i2c3, iim, enfc, ipu1, ipu1_di0, ipu1_di1, ipu2,
-       ipu2_di0, ldb_di0, ldb_di1, ipu2_di1, hsi_tx, mlb, mmdc_ch0_axi,
-       mmdc_ch1_axi, ocram, openvg_axi, pcie_axi, pwm1, pwm2, pwm3, pwm4, per1_bch,
-       gpmi_bch_apb, gpmi_bch, gpmi_io, gpmi_apb, sata, sdma, spba, ssi1,
-       ssi2, ssi3, uart_ipg, uart_serial, usboh3, usdhc1, usdhc2, usdhc3,
-       usdhc4, vdo_axi, vpu_axi, cko1, pll1_sys, pll2_bus, pll3_usb_otg,
-       pll4_audio, pll5_video, pll8_mlb, pll7_usb_host, pll6_enet, ssi1_ipg,
-       ssi2_ipg, ssi3_ipg, rom, usbphy1, usbphy2, ldb_di0_div_3_5, ldb_di1_div_3_5,
-       sata_ref, sata_ref_100m, pcie_ref, pcie_ref_125m, enet_ref, usbphy1_gate,
-       usbphy2_gate, pll4_post_div, pll5_post_div, pll5_video_div, eim_slow,
-       spdif, cko2_sel, cko2_podf, cko2, cko, vdoa, pll4_audio_div,
-       lvds1_sel, lvds2_sel, lvds1_gate, lvds2_gate, esai_ahb, clk_max
-};
-
-static struct clk *clk[clk_max];
+static struct clk *clk[IMX6QDL_CLK_END];
 static struct clk_onecell_data clk_data;
 
-static enum mx6q_clks const clks_init_on[] __initconst = {
-       mmdc_ch0_axi, rom, arm,
+static unsigned int const clks_init_on[] __initconst = {
+       IMX6QDL_CLK_MMDC_CH0_AXI,
+       IMX6QDL_CLK_ROM,
+       IMX6QDL_CLK_ARM,
 };
 
 static struct clk_div_table clk_enet_ref_table[] = {
@@ -149,10 +115,10 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
        int i;
        int ret;
 
-       clk[dummy] = imx_clk_fixed("dummy", 0);
-       clk[ckil] = imx_obtain_fixed_clock("ckil", 0);
-       clk[ckih] = imx_obtain_fixed_clock("ckih1", 0);
-       clk[osc] = imx_obtain_fixed_clock("osc", 0);
+       clk[IMX6QDL_CLK_DUMMY] = imx_clk_fixed("dummy", 0);
+       clk[IMX6QDL_CLK_CKIL] = imx_obtain_fixed_clock("ckil", 0);
+       clk[IMX6QDL_CLK_CKIH] = imx_obtain_fixed_clock("ckih1", 0);
+       clk[IMX6QDL_CLK_OSC] = imx_obtain_fixed_clock("osc", 0);
 
        np = of_find_compatible_node(NULL, NULL, "fsl,imx6q-anatop");
        base = of_iomap(np, 0);
@@ -166,14 +132,14 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
                video_div_table[2].div = 1;
        };
 
-       /*                   type                               name         parent_name  base     div_mask */
-       clk[pll1_sys]      = imx_clk_pllv3(IMX_PLLV3_SYS,       "pll1_sys",     "osc", base,        0x7f);
-       clk[pll2_bus]      = imx_clk_pllv3(IMX_PLLV3_GENERIC,   "pll2_bus",     "osc", base + 0x30, 0x1);
-       clk[pll3_usb_otg]  = imx_clk_pllv3(IMX_PLLV3_USB,       "pll3_usb_otg", "osc", base + 0x10, 0x3);
-       clk[pll4_audio]    = imx_clk_pllv3(IMX_PLLV3_AV,        "pll4_audio",   "osc", base + 0x70, 0x7f);
-       clk[pll5_video]    = imx_clk_pllv3(IMX_PLLV3_AV,        "pll5_video",   "osc", base + 0xa0, 0x7f);
-       clk[pll6_enet]     = imx_clk_pllv3(IMX_PLLV3_ENET,      "pll6_enet",    "osc", base + 0xe0, 0x3);
-       clk[pll7_usb_host] = imx_clk_pllv3(IMX_PLLV3_USB,       "pll7_usb_host","osc", base + 0x20, 0x3);
+       /*                                             type             name         parent_name  base     div_mask */
+       clk[IMX6QDL_CLK_PLL1_SYS]      = imx_clk_pllv3(IMX_PLLV3_SYS,   "pll1_sys",     "osc", base,        0x7f);
+       clk[IMX6QDL_CLK_PLL2_BUS]      = imx_clk_pllv3(IMX_PLLV3_GENERIC,       "pll2_bus",     "osc", base + 0x30, 0x1);
+       clk[IMX6QDL_CLK_PLL3_USB_OTG]  = imx_clk_pllv3(IMX_PLLV3_USB,   "pll3_usb_otg", "osc", base + 0x10, 0x3);
+       clk[IMX6QDL_CLK_PLL4_AUDIO]    = imx_clk_pllv3(IMX_PLLV3_AV,    "pll4_audio",   "osc", base + 0x70, 0x7f);
+       clk[IMX6QDL_CLK_PLL5_VIDEO]    = imx_clk_pllv3(IMX_PLLV3_AV,    "pll5_video",   "osc", base + 0xa0, 0x7f);
+       clk[IMX6QDL_CLK_PLL6_ENET]     = imx_clk_pllv3(IMX_PLLV3_ENET,  "pll6_enet",    "osc", base + 0xe0, 0x3);
+       clk[IMX6QDL_CLK_PLL7_USB_HOST] = imx_clk_pllv3(IMX_PLLV3_USB,   "pll7_usb_host","osc", base + 0x20, 0x3);
 
        /*
         * Bit 20 is the reserved and read-only bit, we do this only for:
@@ -181,28 +147,28 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
         * - Keep refcount when do usbphy clk_enable/disable, in that case,
         * the clk framework may need to enable/disable usbphy's parent
         */
-       clk[usbphy1] = imx_clk_gate("usbphy1", "pll3_usb_otg", base + 0x10, 20);
-       clk[usbphy2] = imx_clk_gate("usbphy2", "pll7_usb_host", base + 0x20, 20);
+       clk[IMX6QDL_CLK_USBPHY1] = imx_clk_gate("usbphy1", "pll3_usb_otg", base + 0x10, 20);
+       clk[IMX6QDL_CLK_USBPHY2] = imx_clk_gate("usbphy2", "pll7_usb_host", base + 0x20, 20);
 
        /*
         * usbphy*_gate needs to be on after system boots up, and software
         * never needs to control it anymore.
         */
-       clk[usbphy1_gate] = imx_clk_gate("usbphy1_gate", "dummy", base + 0x10, 6);
-       clk[usbphy2_gate] = imx_clk_gate("usbphy2_gate", "dummy", base + 0x20, 6);
+       clk[IMX6QDL_CLK_USBPHY1_GATE] = imx_clk_gate("usbphy1_gate", "dummy", base + 0x10, 6);
+       clk[IMX6QDL_CLK_USBPHY2_GATE] = imx_clk_gate("usbphy2_gate", "dummy", base + 0x20, 6);
 
-       clk[sata_ref] = imx_clk_fixed_factor("sata_ref", "pll6_enet", 1, 5);
-       clk[pcie_ref] = imx_clk_fixed_factor("pcie_ref", "pll6_enet", 1, 4);
+       clk[IMX6QDL_CLK_SATA_REF] = imx_clk_fixed_factor("sata_ref", "pll6_enet", 1, 5);
+       clk[IMX6QDL_CLK_PCIE_REF] = imx_clk_fixed_factor("pcie_ref", "pll6_enet", 1, 4);
 
-       clk[sata_ref_100m] = imx_clk_gate("sata_ref_100m", "sata_ref", base + 0xe0, 20);
-       clk[pcie_ref_125m] = imx_clk_gate("pcie_ref_125m", "pcie_ref", base + 0xe0, 19);
+       clk[IMX6QDL_CLK_SATA_REF_100M] = imx_clk_gate("sata_ref_100m", "sata_ref", base + 0xe0, 20);
+       clk[IMX6QDL_CLK_PCIE_REF_125M] = imx_clk_gate("pcie_ref_125m", "pcie_ref", base + 0xe0, 19);
 
-       clk[enet_ref] = clk_register_divider_table(NULL, "enet_ref", "pll6_enet", 0,
+       clk[IMX6QDL_CLK_ENET_REF] = clk_register_divider_table(NULL, "enet_ref", "pll6_enet", 0,
                        base + 0xe0, 0, 2, 0, clk_enet_ref_table,
                        &imx_ccm_lock);
 
-       clk[lvds1_sel] = imx_clk_mux("lvds1_sel", base + 0x160, 0, 5, lvds_sels, ARRAY_SIZE(lvds_sels));
-       clk[lvds2_sel] = imx_clk_mux("lvds2_sel", base + 0x160, 5, 5, lvds_sels, ARRAY_SIZE(lvds_sels));
+       clk[IMX6QDL_CLK_LVDS1_SEL] = imx_clk_mux("lvds1_sel", base + 0x160, 0, 5, lvds_sels, ARRAY_SIZE(lvds_sels));
+       clk[IMX6QDL_CLK_LVDS2_SEL] = imx_clk_mux("lvds2_sel", base + 0x160, 5, 5, lvds_sels, ARRAY_SIZE(lvds_sels));
 
        /*
         * lvds1_gate and lvds2_gate are pseudo-gates.  Both can be
@@ -210,29 +176,29 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
         * the "output_enable" bit as a gate, even though it's really just
         * enabling clock output.
         */
-       clk[lvds1_gate] = imx_clk_gate("lvds1_gate", "lvds1_sel", base + 0x160, 10);
-       clk[lvds2_gate] = imx_clk_gate("lvds2_gate", "lvds2_sel", base + 0x160, 11);
-
-       /*                                name              parent_name        reg       idx */
-       clk[pll2_pfd0_352m] = imx_clk_pfd("pll2_pfd0_352m", "pll2_bus",     base + 0x100, 0);
-       clk[pll2_pfd1_594m] = imx_clk_pfd("pll2_pfd1_594m", "pll2_bus",     base + 0x100, 1);
-       clk[pll2_pfd2_396m] = imx_clk_pfd("pll2_pfd2_396m", "pll2_bus",     base + 0x100, 2);
-       clk[pll3_pfd0_720m] = imx_clk_pfd("pll3_pfd0_720m", "pll3_usb_otg", base + 0xf0,  0);
-       clk[pll3_pfd1_540m] = imx_clk_pfd("pll3_pfd1_540m", "pll3_usb_otg", base + 0xf0,  1);
-       clk[pll3_pfd2_508m] = imx_clk_pfd("pll3_pfd2_508m", "pll3_usb_otg", base + 0xf0,  2);
-       clk[pll3_pfd3_454m] = imx_clk_pfd("pll3_pfd3_454m", "pll3_usb_otg", base + 0xf0,  3);
-
-       /*                                    name         parent_name     mult div */
-       clk[pll2_198m] = imx_clk_fixed_factor("pll2_198m", "pll2_pfd2_396m", 1, 2);
-       clk[pll3_120m] = imx_clk_fixed_factor("pll3_120m", "pll3_usb_otg",   1, 4);
-       clk[pll3_80m]  = imx_clk_fixed_factor("pll3_80m",  "pll3_usb_otg",   1, 6);
-       clk[pll3_60m]  = imx_clk_fixed_factor("pll3_60m",  "pll3_usb_otg",   1, 8);
-       clk[twd]       = imx_clk_fixed_factor("twd",       "arm",            1, 2);
-
-       clk[pll4_post_div] = clk_register_divider_table(NULL, "pll4_post_div", "pll4_audio", CLK_SET_RATE_PARENT, base + 0x70, 19, 2, 0, post_div_table, &imx_ccm_lock);
-       clk[pll4_audio_div] = clk_register_divider(NULL, "pll4_audio_div", "pll4_post_div", CLK_SET_RATE_PARENT, base + 0x170, 15, 1, 0, &imx_ccm_lock);
-       clk[pll5_post_div] = clk_register_divider_table(NULL, "pll5_post_div", "pll5_video", CLK_SET_RATE_PARENT, base + 0xa0, 19, 2, 0, post_div_table, &imx_ccm_lock);
-       clk[pll5_video_div] = clk_register_divider_table(NULL, "pll5_video_div", "pll5_post_div", CLK_SET_RATE_PARENT, base + 0x170, 30, 2, 0, video_div_table, &imx_ccm_lock);
+       clk[IMX6QDL_CLK_LVDS1_GATE] = imx_clk_gate("lvds1_gate", "lvds1_sel", base + 0x160, 10);
+       clk[IMX6QDL_CLK_LVDS2_GATE] = imx_clk_gate("lvds2_gate", "lvds2_sel", base + 0x160, 11);
+
+       /*                                            name              parent_name        reg       idx */
+       clk[IMX6QDL_CLK_PLL2_PFD0_352M] = imx_clk_pfd("pll2_pfd0_352m", "pll2_bus",     base + 0x100, 0);
+       clk[IMX6QDL_CLK_PLL2_PFD1_594M] = imx_clk_pfd("pll2_pfd1_594m", "pll2_bus",     base + 0x100, 1);
+       clk[IMX6QDL_CLK_PLL2_PFD2_396M] = imx_clk_pfd("pll2_pfd2_396m", "pll2_bus",     base + 0x100, 2);
+       clk[IMX6QDL_CLK_PLL3_PFD0_720M] = imx_clk_pfd("pll3_pfd0_720m", "pll3_usb_otg", base + 0xf0,  0);
+       clk[IMX6QDL_CLK_PLL3_PFD1_540M] = imx_clk_pfd("pll3_pfd1_540m", "pll3_usb_otg", base + 0xf0,  1);
+       clk[IMX6QDL_CLK_PLL3_PFD2_508M] = imx_clk_pfd("pll3_pfd2_508m", "pll3_usb_otg", base + 0xf0,  2);
+       clk[IMX6QDL_CLK_PLL3_PFD3_454M] = imx_clk_pfd("pll3_pfd3_454m", "pll3_usb_otg", base + 0xf0,  3);
+
+       /*                                                name         parent_name     mult div */
+       clk[IMX6QDL_CLK_PLL2_198M] = imx_clk_fixed_factor("pll2_198m", "pll2_pfd2_396m", 1, 2);
+       clk[IMX6QDL_CLK_PLL3_120M] = imx_clk_fixed_factor("pll3_120m", "pll3_usb_otg",   1, 4);
+       clk[IMX6QDL_CLK_PLL3_80M]  = imx_clk_fixed_factor("pll3_80m",  "pll3_usb_otg",   1, 6);
+       clk[IMX6QDL_CLK_PLL3_60M]  = imx_clk_fixed_factor("pll3_60m",  "pll3_usb_otg",   1, 8);
+       clk[IMX6QDL_CLK_TWD]       = imx_clk_fixed_factor("twd",       "arm",            1, 2);
+
+       clk[IMX6QDL_CLK_PLL4_POST_DIV] = clk_register_divider_table(NULL, "pll4_post_div", "pll4_audio", CLK_SET_RATE_PARENT, base + 0x70, 19, 2, 0, post_div_table, &imx_ccm_lock);
+       clk[IMX6QDL_CLK_PLL4_AUDIO_DIV] = clk_register_divider(NULL, "pll4_audio_div", "pll4_post_div", CLK_SET_RATE_PARENT, base + 0x170, 15, 1, 0, &imx_ccm_lock);
+       clk[IMX6QDL_CLK_PLL5_POST_DIV] = clk_register_divider_table(NULL, "pll5_post_div", "pll5_video", CLK_SET_RATE_PARENT, base + 0xa0, 19, 2, 0, post_div_table, &imx_ccm_lock);
+       clk[IMX6QDL_CLK_PLL5_VIDEO_DIV] = clk_register_divider_table(NULL, "pll5_video_div", "pll5_post_div", CLK_SET_RATE_PARENT, base + 0x170, 30, 2, 0, video_div_table, &imx_ccm_lock);
 
        np = ccm_node;
        base = of_iomap(np, 0);
@@ -240,262 +206,254 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
 
        imx6q_pm_set_ccm_base(base);
 
-       /*                                  name                reg       shift width parent_names     num_parents */
-       clk[step]             = imx_clk_mux("step",             base + 0xc,  8,  1, step_sels,         ARRAY_SIZE(step_sels));
-       clk[pll1_sw]          = imx_clk_mux("pll1_sw",          base + 0xc,  2,  1, pll1_sw_sels,      ARRAY_SIZE(pll1_sw_sels));
-       clk[periph_pre]       = imx_clk_mux("periph_pre",       base + 0x18, 18, 2, periph_pre_sels,   ARRAY_SIZE(periph_pre_sels));
-       clk[periph2_pre]      = imx_clk_mux("periph2_pre",      base + 0x18, 21, 2, periph_pre_sels,   ARRAY_SIZE(periph_pre_sels));
-       clk[periph_clk2_sel]  = imx_clk_mux("periph_clk2_sel",  base + 0x18, 12, 2, periph_clk2_sels,  ARRAY_SIZE(periph_clk2_sels));
-       clk[periph2_clk2_sel] = imx_clk_mux("periph2_clk2_sel", base + 0x18, 20, 1, periph2_clk2_sels, ARRAY_SIZE(periph2_clk2_sels));
-       clk[axi_sel]          = imx_clk_mux("axi_sel",          base + 0x14, 6,  2, axi_sels,          ARRAY_SIZE(axi_sels));
-       clk[esai_sel]         = imx_clk_mux("esai_sel",         base + 0x20, 19, 2, audio_sels,        ARRAY_SIZE(audio_sels));
-       clk[asrc_sel]         = imx_clk_mux("asrc_sel",         base + 0x30, 7,  2, audio_sels,        ARRAY_SIZE(audio_sels));
-       clk[spdif_sel]        = imx_clk_mux("spdif_sel",        base + 0x30, 20, 2, audio_sels,        ARRAY_SIZE(audio_sels));
-       clk[gpu2d_axi]        = imx_clk_mux("gpu2d_axi",        base + 0x18, 0,  1, gpu_axi_sels,      ARRAY_SIZE(gpu_axi_sels));
-       clk[gpu3d_axi]        = imx_clk_mux("gpu3d_axi",        base + 0x18, 1,  1, gpu_axi_sels,      ARRAY_SIZE(gpu_axi_sels));
-       clk[gpu2d_core_sel]   = imx_clk_mux("gpu2d_core_sel",   base + 0x18, 16, 2, gpu2d_core_sels,   ARRAY_SIZE(gpu2d_core_sels));
-       clk[gpu3d_core_sel]   = imx_clk_mux("gpu3d_core_sel",   base + 0x18, 4,  2, gpu3d_core_sels,   ARRAY_SIZE(gpu3d_core_sels));
-       clk[gpu3d_shader_sel] = imx_clk_mux("gpu3d_shader_sel", base + 0x18, 8,  2, gpu3d_shader_sels, ARRAY_SIZE(gpu3d_shader_sels));
-       clk[ipu1_sel]         = imx_clk_mux("ipu1_sel",         base + 0x3c, 9,  2, ipu_sels,          ARRAY_SIZE(ipu_sels));
-       clk[ipu2_sel]         = imx_clk_mux("ipu2_sel",         base + 0x3c, 14, 2, ipu_sels,          ARRAY_SIZE(ipu_sels));
-       clk[ldb_di0_sel]      = imx_clk_mux_flags("ldb_di0_sel", base + 0x2c, 9,  3, ldb_di_sels,      ARRAY_SIZE(ldb_di_sels), CLK_SET_RATE_PARENT);
-       clk[ldb_di1_sel]      = imx_clk_mux_flags("ldb_di1_sel", base + 0x2c, 12, 3, ldb_di_sels,      ARRAY_SIZE(ldb_di_sels), CLK_SET_RATE_PARENT);
-       clk[ipu1_di0_pre_sel] = imx_clk_mux_flags("ipu1_di0_pre_sel", base + 0x34, 6,  3, ipu_di_pre_sels,   ARRAY_SIZE(ipu_di_pre_sels), CLK_SET_RATE_PARENT);
-       clk[ipu1_di1_pre_sel] = imx_clk_mux_flags("ipu1_di1_pre_sel", base + 0x34, 15, 3, ipu_di_pre_sels,   ARRAY_SIZE(ipu_di_pre_sels), CLK_SET_RATE_PARENT);
-       clk[ipu2_di0_pre_sel] = imx_clk_mux_flags("ipu2_di0_pre_sel", base + 0x38, 6,  3, ipu_di_pre_sels,   ARRAY_SIZE(ipu_di_pre_sels), CLK_SET_RATE_PARENT);
-       clk[ipu2_di1_pre_sel] = imx_clk_mux_flags("ipu2_di1_pre_sel", base + 0x38, 15, 3, ipu_di_pre_sels,   ARRAY_SIZE(ipu_di_pre_sels), CLK_SET_RATE_PARENT);
-       clk[ipu1_di0_sel]     = imx_clk_mux_flags("ipu1_di0_sel",     base + 0x34, 0,  3, ipu1_di0_sels,     ARRAY_SIZE(ipu1_di0_sels), CLK_SET_RATE_PARENT);
-       clk[ipu1_di1_sel]     = imx_clk_mux_flags("ipu1_di1_sel",     base + 0x34, 9,  3, ipu1_di1_sels,     ARRAY_SIZE(ipu1_di1_sels), CLK_SET_RATE_PARENT);
-       clk[ipu2_di0_sel]     = imx_clk_mux_flags("ipu2_di0_sel",     base + 0x38, 0,  3, ipu2_di0_sels,     ARRAY_SIZE(ipu2_di0_sels), CLK_SET_RATE_PARENT);
-       clk[ipu2_di1_sel]     = imx_clk_mux_flags("ipu2_di1_sel",     base + 0x38, 9,  3, ipu2_di1_sels,     ARRAY_SIZE(ipu2_di1_sels), CLK_SET_RATE_PARENT);
-       clk[hsi_tx_sel]       = imx_clk_mux("hsi_tx_sel",       base + 0x30, 28, 1, hsi_tx_sels,       ARRAY_SIZE(hsi_tx_sels));
-       clk[pcie_axi_sel]     = imx_clk_mux("pcie_axi_sel",     base + 0x18, 10, 1, pcie_axi_sels,     ARRAY_SIZE(pcie_axi_sels));
-       clk[ssi1_sel]         = imx_clk_fixup_mux("ssi1_sel",   base + 0x1c, 10, 2, ssi_sels,          ARRAY_SIZE(ssi_sels),          imx_cscmr1_fixup);
-       clk[ssi2_sel]         = imx_clk_fixup_mux("ssi2_sel",   base + 0x1c, 12, 2, ssi_sels,          ARRAY_SIZE(ssi_sels),          imx_cscmr1_fixup);
-       clk[ssi3_sel]         = imx_clk_fixup_mux("ssi3_sel",   base + 0x1c, 14, 2, ssi_sels,          ARRAY_SIZE(ssi_sels),          imx_cscmr1_fixup);
-       clk[usdhc1_sel]       = imx_clk_fixup_mux("usdhc1_sel", base + 0x1c, 16, 1, usdhc_sels,        ARRAY_SIZE(usdhc_sels),        imx_cscmr1_fixup);
-       clk[usdhc2_sel]       = imx_clk_fixup_mux("usdhc2_sel", base + 0x1c, 17, 1, usdhc_sels,        ARRAY_SIZE(usdhc_sels),        imx_cscmr1_fixup);
-       clk[usdhc3_sel]       = imx_clk_fixup_mux("usdhc3_sel", base + 0x1c, 18, 1, usdhc_sels,        ARRAY_SIZE(usdhc_sels),        imx_cscmr1_fixup);
-       clk[usdhc4_sel]       = imx_clk_fixup_mux("usdhc4_sel", base + 0x1c, 19, 1, usdhc_sels,        ARRAY_SIZE(usdhc_sels),        imx_cscmr1_fixup);
-       clk[enfc_sel]         = imx_clk_mux("enfc_sel",         base + 0x2c, 16, 2, enfc_sels,         ARRAY_SIZE(enfc_sels));
-       clk[emi_sel]          = imx_clk_fixup_mux("emi_sel",      base + 0x1c, 27, 2, emi_sels,        ARRAY_SIZE(emi_sels),          imx_cscmr1_fixup);
-       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);
-       clk[vdo_axi_sel]      = imx_clk_mux("vdo_axi_sel",      base + 0x18, 11, 1, vdo_axi_sels,      ARRAY_SIZE(vdo_axi_sels));
-       clk[vpu_axi_sel]      = imx_clk_mux("vpu_axi_sel",      base + 0x18, 14, 2, vpu_axi_sels,      ARRAY_SIZE(vpu_axi_sels));
-       clk[cko1_sel]         = imx_clk_mux("cko1_sel",         base + 0x60, 0,  4, cko1_sels,         ARRAY_SIZE(cko1_sels));
-       clk[cko2_sel]         = imx_clk_mux("cko2_sel",         base + 0x60, 16, 5, cko2_sels,         ARRAY_SIZE(cko2_sels));
-       clk[cko]              = imx_clk_mux("cko",              base + 0x60, 8, 1,  cko_sels,          ARRAY_SIZE(cko_sels));
-
-       /*                              name         reg      shift width busy: reg, shift parent_names  num_parents */
-       clk[periph]  = imx_clk_busy_mux("periph",  base + 0x14, 25,  1,   base + 0x48, 5,  periph_sels,  ARRAY_SIZE(periph_sels));
-       clk[periph2] = imx_clk_busy_mux("periph2", base + 0x14, 26,  1,   base + 0x48, 3,  periph2_sels, ARRAY_SIZE(periph2_sels));
-
-       /*                                      name                parent_name          reg       shift width */
-       clk[periph_clk2]      = imx_clk_divider("periph_clk2",      "periph_clk2_sel",   base + 0x14, 27, 3);
-       clk[periph2_clk2]     = imx_clk_divider("periph2_clk2",     "periph2_clk2_sel",  base + 0x14, 0,  3);
-       clk[ipg]              = imx_clk_divider("ipg",              "ahb",               base + 0x14, 8,  2);
-       clk[ipg_per]          = imx_clk_fixup_divider("ipg_per",    "ipg",               base + 0x1c, 0,  6, imx_cscmr1_fixup);
-       clk[esai_pred]        = imx_clk_divider("esai_pred",        "esai_sel",          base + 0x28, 9,  3);
-       clk[esai_podf]        = imx_clk_divider("esai_podf",        "esai_pred",         base + 0x28, 25, 3);
-       clk[asrc_pred]        = imx_clk_divider("asrc_pred",        "asrc_sel",          base + 0x30, 12, 3);
-       clk[asrc_podf]        = imx_clk_divider("asrc_podf",        "asrc_pred",         base + 0x30, 9,  3);
-       clk[spdif_pred]       = imx_clk_divider("spdif_pred",       "spdif_sel",         base + 0x30, 25, 3);
-       clk[spdif_podf]       = imx_clk_divider("spdif_podf",       "spdif_pred",        base + 0x30, 22, 3);
-       clk[can_root]         = imx_clk_divider("can_root",         "pll3_60m",          base + 0x20, 2,  6);
-       clk[ecspi_root]       = imx_clk_divider("ecspi_root",       "pll3_60m",          base + 0x38, 19, 6);
-       clk[gpu2d_core_podf]  = imx_clk_divider("gpu2d_core_podf",  "gpu2d_core_sel",    base + 0x18, 23, 3);
-       clk[gpu3d_core_podf]  = imx_clk_divider("gpu3d_core_podf",  "gpu3d_core_sel",    base + 0x18, 26, 3);
-       clk[gpu3d_shader]     = imx_clk_divider("gpu3d_shader",     "gpu3d_shader_sel",  base + 0x18, 29, 3);
-       clk[ipu1_podf]        = imx_clk_divider("ipu1_podf",        "ipu1_sel",          base + 0x3c, 11, 3);
-       clk[ipu2_podf]        = imx_clk_divider("ipu2_podf",        "ipu2_sel",          base + 0x3c, 16, 3);
-       clk[ldb_di0_div_3_5]  = imx_clk_fixed_factor("ldb_di0_div_3_5", "ldb_di0_sel", 2, 7);
-       clk[ldb_di0_podf]     = imx_clk_divider_flags("ldb_di0_podf", "ldb_di0_div_3_5", base + 0x20, 10, 1, 0);
-       clk[ldb_di1_div_3_5]  = imx_clk_fixed_factor("ldb_di1_div_3_5", "ldb_di1_sel", 2, 7);
-       clk[ldb_di1_podf]     = imx_clk_divider_flags("ldb_di1_podf", "ldb_di1_div_3_5", base + 0x20, 11, 1, 0);
-       clk[ipu1_di0_pre]     = imx_clk_divider("ipu1_di0_pre",     "ipu1_di0_pre_sel",  base + 0x34, 3,  3);
-       clk[ipu1_di1_pre]     = imx_clk_divider("ipu1_di1_pre",     "ipu1_di1_pre_sel",  base + 0x34, 12, 3);
-       clk[ipu2_di0_pre]     = imx_clk_divider("ipu2_di0_pre",     "ipu2_di0_pre_sel",  base + 0x38, 3,  3);
-       clk[ipu2_di1_pre]     = imx_clk_divider("ipu2_di1_pre",     "ipu2_di1_pre_sel",  base + 0x38, 12, 3);
-       clk[hsi_tx_podf]      = imx_clk_divider("hsi_tx_podf",      "hsi_tx_sel",        base + 0x30, 29, 3);
-       clk[ssi1_pred]        = imx_clk_divider("ssi1_pred",        "ssi1_sel",          base + 0x28, 6,  3);
-       clk[ssi1_podf]        = imx_clk_divider("ssi1_podf",        "ssi1_pred",         base + 0x28, 0,  6);
-       clk[ssi2_pred]        = imx_clk_divider("ssi2_pred",        "ssi2_sel",          base + 0x2c, 6,  3);
-       clk[ssi2_podf]        = imx_clk_divider("ssi2_podf",        "ssi2_pred",         base + 0x2c, 0,  6);
-       clk[ssi3_pred]        = imx_clk_divider("ssi3_pred",        "ssi3_sel",          base + 0x28, 22, 3);
-       clk[ssi3_podf]        = imx_clk_divider("ssi3_podf",        "ssi3_pred",         base + 0x28, 16, 6);
-       clk[uart_serial_podf] = imx_clk_divider("uart_serial_podf", "pll3_80m",          base + 0x24, 0,  6);
-       clk[usdhc1_podf]      = imx_clk_divider("usdhc1_podf",      "usdhc1_sel",        base + 0x24, 11, 3);
-       clk[usdhc2_podf]      = imx_clk_divider("usdhc2_podf",      "usdhc2_sel",        base + 0x24, 16, 3);
-       clk[usdhc3_podf]      = imx_clk_divider("usdhc3_podf",      "usdhc3_sel",        base + 0x24, 19, 3);
-       clk[usdhc4_podf]      = imx_clk_divider("usdhc4_podf",      "usdhc4_sel",        base + 0x24, 22, 3);
-       clk[enfc_pred]        = imx_clk_divider("enfc_pred",        "enfc_sel",          base + 0x2c, 18, 3);
-       clk[enfc_podf]        = imx_clk_divider("enfc_podf",        "enfc_pred",         base + 0x2c, 21, 6);
-       clk[emi_podf]         = imx_clk_fixup_divider("emi_podf",   "emi_sel",           base + 0x1c, 20, 3, imx_cscmr1_fixup);
-       clk[emi_slow_podf]    = imx_clk_fixup_divider("emi_slow_podf", "emi_slow_sel",   base + 0x1c, 23, 3, imx_cscmr1_fixup);
-       clk[vpu_axi_podf]     = imx_clk_divider("vpu_axi_podf",     "vpu_axi_sel",       base + 0x24, 25, 3);
-       clk[cko1_podf]        = imx_clk_divider("cko1_podf",        "cko1_sel",          base + 0x60, 4,  3);
-       clk[cko2_podf]        = imx_clk_divider("cko2_podf",        "cko2_sel",          base + 0x60, 21, 3);
-
-       /*                                            name                 parent_name    reg        shift width busy: reg, shift */
-       clk[axi]               = imx_clk_busy_divider("axi",               "axi_sel",     base + 0x14, 16,  3,   base + 0x48, 0);
-       clk[mmdc_ch0_axi_podf] = imx_clk_busy_divider("mmdc_ch0_axi_podf", "periph",      base + 0x14, 19,  3,   base + 0x48, 4);
-       clk[mmdc_ch1_axi_podf] = imx_clk_busy_divider("mmdc_ch1_axi_podf", "periph2",     base + 0x14, 3,   3,   base + 0x48, 2);
-       clk[arm]               = imx_clk_busy_divider("arm",               "pll1_sw",     base + 0x10, 0,   3,   base + 0x48, 16);
-       clk[ahb]               = imx_clk_busy_divider("ahb",               "periph",      base + 0x14, 10,  3,   base + 0x48, 1);
-
-       /*                                name             parent_name          reg         shift */
-       clk[apbh_dma]     = imx_clk_gate2("apbh_dma",      "usdhc3",            base + 0x68, 4);
-       clk[asrc]         = imx_clk_gate2("asrc",          "asrc_podf",         base + 0x68, 6);
-       clk[can1_ipg]     = imx_clk_gate2("can1_ipg",      "ipg",               base + 0x68, 14);
-       clk[can1_serial]  = imx_clk_gate2("can1_serial",   "can_root",          base + 0x68, 16);
-       clk[can2_ipg]     = imx_clk_gate2("can2_ipg",      "ipg",               base + 0x68, 18);
-       clk[can2_serial]  = imx_clk_gate2("can2_serial",   "can_root",          base + 0x68, 20);
-       clk[ecspi1]       = imx_clk_gate2("ecspi1",        "ecspi_root",        base + 0x6c, 0);
-       clk[ecspi2]       = imx_clk_gate2("ecspi2",        "ecspi_root",        base + 0x6c, 2);
-       clk[ecspi3]       = imx_clk_gate2("ecspi3",        "ecspi_root",        base + 0x6c, 4);
-       clk[ecspi4]       = imx_clk_gate2("ecspi4",        "ecspi_root",        base + 0x6c, 6);
+       /*                                              name                reg       shift width parent_names     num_parents */
+       clk[IMX6QDL_CLK_STEP]             = imx_clk_mux("step",             base + 0xc,  8,  1, step_sels,         ARRAY_SIZE(step_sels));
+       clk[IMX6QDL_CLK_PLL1_SW]          = imx_clk_mux("pll1_sw",          base + 0xc,  2,  1, pll1_sw_sels,      ARRAY_SIZE(pll1_sw_sels));
+       clk[IMX6QDL_CLK_PERIPH_PRE]       = imx_clk_mux("periph_pre",       base + 0x18, 18, 2, periph_pre_sels,   ARRAY_SIZE(periph_pre_sels));
+       clk[IMX6QDL_CLK_PERIPH2_PRE]      = imx_clk_mux("periph2_pre",      base + 0x18, 21, 2, periph_pre_sels,   ARRAY_SIZE(periph_pre_sels));
+       clk[IMX6QDL_CLK_PERIPH_CLK2_SEL]  = imx_clk_mux("periph_clk2_sel",  base + 0x18, 12, 2, periph_clk2_sels,  ARRAY_SIZE(periph_clk2_sels));
+       clk[IMX6QDL_CLK_PERIPH2_CLK2_SEL] = imx_clk_mux("periph2_clk2_sel", base + 0x18, 20, 1, periph2_clk2_sels, ARRAY_SIZE(periph2_clk2_sels));
+       clk[IMX6QDL_CLK_AXI_SEL]          = imx_clk_mux("axi_sel",          base + 0x14, 6,  2, axi_sels,          ARRAY_SIZE(axi_sels));
+       clk[IMX6QDL_CLK_ESAI_SEL]         = imx_clk_mux("esai_sel",         base + 0x20, 19, 2, audio_sels,        ARRAY_SIZE(audio_sels));
+       clk[IMX6QDL_CLK_ASRC_SEL]         = imx_clk_mux("asrc_sel",         base + 0x30, 7,  2, audio_sels,        ARRAY_SIZE(audio_sels));
+       clk[IMX6QDL_CLK_SPDIF_SEL]        = imx_clk_mux("spdif_sel",        base + 0x30, 20, 2, audio_sels,        ARRAY_SIZE(audio_sels));
+       clk[IMX6QDL_CLK_GPU2D_AXI]        = imx_clk_mux("gpu2d_axi",        base + 0x18, 0,  1, gpu_axi_sels,      ARRAY_SIZE(gpu_axi_sels));
+       clk[IMX6QDL_CLK_GPU3D_AXI]        = imx_clk_mux("gpu3d_axi",        base + 0x18, 1,  1, gpu_axi_sels,      ARRAY_SIZE(gpu_axi_sels));
+       clk[IMX6QDL_CLK_GPU2D_CORE_SEL]   = imx_clk_mux("gpu2d_core_sel",   base + 0x18, 16, 2, gpu2d_core_sels,   ARRAY_SIZE(gpu2d_core_sels));
+       clk[IMX6QDL_CLK_GPU3D_CORE_SEL]   = imx_clk_mux("gpu3d_core_sel",   base + 0x18, 4,  2, gpu3d_core_sels,   ARRAY_SIZE(gpu3d_core_sels));
+       clk[IMX6QDL_CLK_GPU3D_SHADER_SEL] = imx_clk_mux("gpu3d_shader_sel", base + 0x18, 8,  2, gpu3d_shader_sels, ARRAY_SIZE(gpu3d_shader_sels));
+       clk[IMX6QDL_CLK_IPU1_SEL]         = imx_clk_mux("ipu1_sel",         base + 0x3c, 9,  2, ipu_sels,          ARRAY_SIZE(ipu_sels));
+       clk[IMX6QDL_CLK_IPU2_SEL]         = imx_clk_mux("ipu2_sel",         base + 0x3c, 14, 2, ipu_sels,          ARRAY_SIZE(ipu_sels));
+       clk[IMX6QDL_CLK_LDB_DI0_SEL]      = imx_clk_mux_flags("ldb_di0_sel", base + 0x2c, 9,  3, ldb_di_sels,      ARRAY_SIZE(ldb_di_sels), CLK_SET_RATE_PARENT);
+       clk[IMX6QDL_CLK_LDB_DI1_SEL]      = imx_clk_mux_flags("ldb_di1_sel", base + 0x2c, 12, 3, ldb_di_sels,      ARRAY_SIZE(ldb_di_sels), CLK_SET_RATE_PARENT);
+       clk[IMX6QDL_CLK_IPU1_DI0_PRE_SEL] = imx_clk_mux_flags("ipu1_di0_pre_sel", base + 0x34, 6,  3, ipu_di_pre_sels,   ARRAY_SIZE(ipu_di_pre_sels), CLK_SET_RATE_PARENT);
+       clk[IMX6QDL_CLK_IPU1_DI1_PRE_SEL] = imx_clk_mux_flags("ipu1_di1_pre_sel", base + 0x34, 15, 3, ipu_di_pre_sels,   ARRAY_SIZE(ipu_di_pre_sels), CLK_SET_RATE_PARENT);
+       clk[IMX6QDL_CLK_IPU2_DI0_PRE_SEL] = imx_clk_mux_flags("ipu2_di0_pre_sel", base + 0x38, 6,  3, ipu_di_pre_sels,   ARRAY_SIZE(ipu_di_pre_sels), CLK_SET_RATE_PARENT);
+       clk[IMX6QDL_CLK_IPU2_DI1_PRE_SEL] = imx_clk_mux_flags("ipu2_di1_pre_sel", base + 0x38, 15, 3, ipu_di_pre_sels,   ARRAY_SIZE(ipu_di_pre_sels), CLK_SET_RATE_PARENT);
+       clk[IMX6QDL_CLK_IPU1_DI0_SEL]     = imx_clk_mux_flags("ipu1_di0_sel",     base + 0x34, 0,  3, ipu1_di0_sels,     ARRAY_SIZE(ipu1_di0_sels), CLK_SET_RATE_PARENT);
+       clk[IMX6QDL_CLK_IPU1_DI1_SEL]     = imx_clk_mux_flags("ipu1_di1_sel",     base + 0x34, 9,  3, ipu1_di1_sels,     ARRAY_SIZE(ipu1_di1_sels), CLK_SET_RATE_PARENT);
+       clk[IMX6QDL_CLK_IPU2_DI0_SEL]     = imx_clk_mux_flags("ipu2_di0_sel",     base + 0x38, 0,  3, ipu2_di0_sels,     ARRAY_SIZE(ipu2_di0_sels), CLK_SET_RATE_PARENT);
+       clk[IMX6QDL_CLK_IPU2_DI1_SEL]     = imx_clk_mux_flags("ipu2_di1_sel",     base + 0x38, 9,  3, ipu2_di1_sels,     ARRAY_SIZE(ipu2_di1_sels), CLK_SET_RATE_PARENT);
+       clk[IMX6QDL_CLK_HSI_TX_SEL]       = imx_clk_mux("hsi_tx_sel",       base + 0x30, 28, 1, hsi_tx_sels,       ARRAY_SIZE(hsi_tx_sels));
+       clk[IMX6QDL_CLK_PCIE_AXI_SEL]     = imx_clk_mux("pcie_axi_sel",     base + 0x18, 10, 1, pcie_axi_sels,     ARRAY_SIZE(pcie_axi_sels));
+       clk[IMX6QDL_CLK_SSI1_SEL]         = imx_clk_fixup_mux("ssi1_sel",   base + 0x1c, 10, 2, ssi_sels,          ARRAY_SIZE(ssi_sels), imx_cscmr1_fixup);
+       clk[IMX6QDL_CLK_SSI2_SEL]         = imx_clk_fixup_mux("ssi2_sel",   base + 0x1c, 12, 2, ssi_sels,          ARRAY_SIZE(ssi_sels), imx_cscmr1_fixup);
+       clk[IMX6QDL_CLK_SSI3_SEL]         = imx_clk_fixup_mux("ssi3_sel",   base + 0x1c, 14, 2, ssi_sels,          ARRAY_SIZE(ssi_sels), imx_cscmr1_fixup);
+       clk[IMX6QDL_CLK_USDHC1_SEL]       = imx_clk_fixup_mux("usdhc1_sel", base + 0x1c, 16, 1, usdhc_sels,        ARRAY_SIZE(usdhc_sels), imx_cscmr1_fixup);
+       clk[IMX6QDL_CLK_USDHC2_SEL]       = imx_clk_fixup_mux("usdhc2_sel", base + 0x1c, 17, 1, usdhc_sels,        ARRAY_SIZE(usdhc_sels), imx_cscmr1_fixup);
+       clk[IMX6QDL_CLK_USDHC3_SEL]       = imx_clk_fixup_mux("usdhc3_sel", base + 0x1c, 18, 1, usdhc_sels,        ARRAY_SIZE(usdhc_sels), imx_cscmr1_fixup);
+       clk[IMX6QDL_CLK_USDHC4_SEL]       = imx_clk_fixup_mux("usdhc4_sel", base + 0x1c, 19, 1, usdhc_sels,        ARRAY_SIZE(usdhc_sels), imx_cscmr1_fixup);
+       clk[IMX6QDL_CLK_ENFC_SEL]         = imx_clk_mux("enfc_sel",         base + 0x2c, 16, 2, enfc_sels,         ARRAY_SIZE(enfc_sels));
+       clk[IMX6QDL_CLK_EMI_SEL]          = imx_clk_fixup_mux("emi_sel",      base + 0x1c, 27, 2, emi_sels,        ARRAY_SIZE(emi_sels), imx_cscmr1_fixup);
+       clk[IMX6QDL_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);
+       clk[IMX6QDL_CLK_VDO_AXI_SEL]      = imx_clk_mux("vdo_axi_sel",      base + 0x18, 11, 1, vdo_axi_sels,      ARRAY_SIZE(vdo_axi_sels));
+       clk[IMX6QDL_CLK_VPU_AXI_SEL]      = imx_clk_mux("vpu_axi_sel",      base + 0x18, 14, 2, vpu_axi_sels,      ARRAY_SIZE(vpu_axi_sels));
+       clk[IMX6QDL_CLK_CKO1_SEL]         = imx_clk_mux("cko1_sel",         base + 0x60, 0,  4, cko1_sels,         ARRAY_SIZE(cko1_sels));
+       clk[IMX6QDL_CLK_CKO2_SEL]         = imx_clk_mux("cko2_sel",         base + 0x60, 16, 5, cko2_sels,         ARRAY_SIZE(cko2_sels));
+       clk[IMX6QDL_CLK_CKO]              = imx_clk_mux("cko",              base + 0x60, 8, 1,  cko_sels,          ARRAY_SIZE(cko_sels));
+
+       /*                                          name         reg      shift width busy: reg, shift parent_names  num_parents */
+       clk[IMX6QDL_CLK_PERIPH]  = imx_clk_busy_mux("periph",  base + 0x14, 25,  1,   base + 0x48, 5,  periph_sels,  ARRAY_SIZE(periph_sels));
+       clk[IMX6QDL_CLK_PERIPH2] = imx_clk_busy_mux("periph2", base + 0x14, 26,  1,   base + 0x48, 3,  periph2_sels, ARRAY_SIZE(periph2_sels));
+
+       /*                                                  name                parent_name          reg       shift width */
+       clk[IMX6QDL_CLK_PERIPH_CLK2]      = imx_clk_divider("periph_clk2",      "periph_clk2_sel",   base + 0x14, 27, 3);
+       clk[IMX6QDL_CLK_PERIPH2_CLK2]     = imx_clk_divider("periph2_clk2",     "periph2_clk2_sel",  base + 0x14, 0,  3);
+       clk[IMX6QDL_CLK_IPG]              = imx_clk_divider("ipg",              "ahb",               base + 0x14, 8,  2);
+       clk[IMX6QDL_CLK_IPG_PER]          = imx_clk_fixup_divider("ipg_per",    "ipg",               base + 0x1c, 0,  6, imx_cscmr1_fixup);
+       clk[IMX6QDL_CLK_ESAI_PRED]        = imx_clk_divider("esai_pred",        "esai_sel",          base + 0x28, 9,  3);
+       clk[IMX6QDL_CLK_ESAI_PODF]        = imx_clk_divider("esai_podf",        "esai_pred",         base + 0x28, 25, 3);
+       clk[IMX6QDL_CLK_ASRC_PRED]        = imx_clk_divider("asrc_pred",        "asrc_sel",          base + 0x30, 12, 3);
+       clk[IMX6QDL_CLK_ASRC_PODF]        = imx_clk_divider("asrc_podf",        "asrc_pred",         base + 0x30, 9,  3);
+       clk[IMX6QDL_CLK_SPDIF_PRED]       = imx_clk_divider("spdif_pred",       "spdif_sel",         base + 0x30, 25, 3);
+       clk[IMX6QDL_CLK_SPDIF_PODF]       = imx_clk_divider("spdif_podf",       "spdif_pred",        base + 0x30, 22, 3);
+       clk[IMX6QDL_CLK_CAN_ROOT]         = imx_clk_divider("can_root",         "pll3_60m",          base + 0x20, 2,  6);
+       clk[IMX6QDL_CLK_ECSPI_ROOT]       = imx_clk_divider("ecspi_root",       "pll3_60m",          base + 0x38, 19, 6);
+       clk[IMX6QDL_CLK_GPU2D_CORE_PODF]  = imx_clk_divider("gpu2d_core_podf",  "gpu2d_core_sel",    base + 0x18, 23, 3);
+       clk[IMX6QDL_CLK_GPU3D_CORE_PODF]  = imx_clk_divider("gpu3d_core_podf",  "gpu3d_core_sel",    base + 0x18, 26, 3);
+       clk[IMX6QDL_CLK_GPU3D_SHADER]     = imx_clk_divider("gpu3d_shader",     "gpu3d_shader_sel",  base + 0x18, 29, 3);
+       clk[IMX6QDL_CLK_IPU1_PODF]        = imx_clk_divider("ipu1_podf",        "ipu1_sel",          base + 0x3c, 11, 3);
+       clk[IMX6QDL_CLK_IPU2_PODF]        = imx_clk_divider("ipu2_podf",        "ipu2_sel",          base + 0x3c, 16, 3);
+       clk[IMX6QDL_CLK_LDB_DI0_DIV_3_5]  = imx_clk_fixed_factor("ldb_di0_div_3_5", "ldb_di0_sel", 2, 7);
+       clk[IMX6QDL_CLK_LDB_DI0_PODF]     = imx_clk_divider_flags("ldb_di0_podf", "ldb_di0_div_3_5", base + 0x20, 10, 1, 0);
+       clk[IMX6QDL_CLK_LDB_DI1_DIV_3_5]  = imx_clk_fixed_factor("ldb_di1_div_3_5", "ldb_di1_sel", 2, 7);
+       clk[IMX6QDL_CLK_LDB_DI1_PODF]     = imx_clk_divider_flags("ldb_di1_podf", "ldb_di1_div_3_5", base + 0x20, 11, 1, 0);
+       clk[IMX6QDL_CLK_IPU1_DI0_PRE]     = imx_clk_divider("ipu1_di0_pre",     "ipu1_di0_pre_sel",  base + 0x34, 3,  3);
+       clk[IMX6QDL_CLK_IPU1_DI1_PRE]     = imx_clk_divider("ipu1_di1_pre",     "ipu1_di1_pre_sel",  base + 0x34, 12, 3);
+       clk[IMX6QDL_CLK_IPU2_DI0_PRE]     = imx_clk_divider("ipu2_di0_pre",     "ipu2_di0_pre_sel",  base + 0x38, 3,  3);
+       clk[IMX6QDL_CLK_IPU2_DI1_PRE]     = imx_clk_divider("ipu2_di1_pre",     "ipu2_di1_pre_sel",  base + 0x38, 12, 3);
+       clk[IMX6QDL_CLK_HSI_TX_PODF]      = imx_clk_divider("hsi_tx_podf",      "hsi_tx_sel",        base + 0x30, 29, 3);
+       clk[IMX6QDL_CLK_SSI1_PRED]        = imx_clk_divider("ssi1_pred",        "ssi1_sel",          base + 0x28, 6,  3);
+       clk[IMX6QDL_CLK_SSI1_PODF]        = imx_clk_divider("ssi1_podf",        "ssi1_pred",         base + 0x28, 0,  6);
+       clk[IMX6QDL_CLK_SSI2_PRED]        = imx_clk_divider("ssi2_pred",        "ssi2_sel",          base + 0x2c, 6,  3);
+       clk[IMX6QDL_CLK_SSI2_PODF]        = imx_clk_divider("ssi2_podf",        "ssi2_pred",         base + 0x2c, 0,  6);
+       clk[IMX6QDL_CLK_SSI3_PRED]        = imx_clk_divider("ssi3_pred",        "ssi3_sel",          base + 0x28, 22, 3);
+       clk[IMX6QDL_CLK_SSI3_PODF]        = imx_clk_divider("ssi3_podf",        "ssi3_pred",         base + 0x28, 16, 6);
+       clk[IMX6QDL_CLK_UART_SERIAL_PODF] = imx_clk_divider("uart_serial_podf", "pll3_80m",          base + 0x24, 0,  6);
+       clk[IMX6QDL_CLK_USDHC1_PODF]      = imx_clk_divider("usdhc1_podf",      "usdhc1_sel",        base + 0x24, 11, 3);
+       clk[IMX6QDL_CLK_USDHC2_PODF]      = imx_clk_divider("usdhc2_podf",      "usdhc2_sel",        base + 0x24, 16, 3);
+       clk[IMX6QDL_CLK_USDHC3_PODF]      = imx_clk_divider("usdhc3_podf",      "usdhc3_sel",        base + 0x24, 19, 3);
+       clk[IMX6QDL_CLK_USDHC4_PODF]      = imx_clk_divider("usdhc4_podf",      "usdhc4_sel",        base + 0x24, 22, 3);
+       clk[IMX6QDL_CLK_ENFC_PRED]        = imx_clk_divider("enfc_pred",        "enfc_sel",          base + 0x2c, 18, 3);
+       clk[IMX6QDL_CLK_ENFC_PODF]        = imx_clk_divider("enfc_podf",        "enfc_pred",         base + 0x2c, 21, 6);
+       clk[IMX6QDL_CLK_EMI_PODF]         = imx_clk_fixup_divider("emi_podf",   "emi_sel",           base + 0x1c, 20, 3, imx_cscmr1_fixup);
+       clk[IMX6QDL_CLK_EMI_SLOW_PODF]    = imx_clk_fixup_divider("emi_slow_podf", "emi_slow_sel",   base + 0x1c, 23, 3, imx_cscmr1_fixup);
+       clk[IMX6QDL_CLK_VPU_AXI_PODF]     = imx_clk_divider("vpu_axi_podf",     "vpu_axi_sel",       base + 0x24, 25, 3);
+       clk[IMX6QDL_CLK_CKO1_PODF]        = imx_clk_divider("cko1_podf",        "cko1_sel",          base + 0x60, 4,  3);
+       clk[IMX6QDL_CLK_CKO2_PODF]        = imx_clk_divider("cko2_podf",        "cko2_sel",          base + 0x60, 21, 3);
+
+       /*                                                        name                 parent_name    reg        shift width busy: reg, shift */
+       clk[IMX6QDL_CLK_AXI]               = imx_clk_busy_divider("axi",               "axi_sel",     base + 0x14, 16,  3,   base + 0x48, 0);
+       clk[IMX6QDL_CLK_MMDC_CH0_AXI_PODF] = imx_clk_busy_divider("mmdc_ch0_axi_podf", "periph",      base + 0x14, 19,  3,   base + 0x48, 4);
+       clk[IMX6QDL_CLK_MMDC_CH1_AXI_PODF] = imx_clk_busy_divider("mmdc_ch1_axi_podf", "periph2",     base + 0x14, 3,   3,   base + 0x48, 2);
+       clk[IMX6QDL_CLK_ARM]               = imx_clk_busy_divider("arm",               "pll1_sw",     base + 0x10, 0,   3,   base + 0x48, 16);
+       clk[IMX6QDL_CLK_AHB]               = imx_clk_busy_divider("ahb",               "periph",      base + 0x14, 10,  3,   base + 0x48, 1);
+
+       /*                                            name             parent_name          reg         shift */
+       clk[IMX6QDL_CLK_APBH_DMA]     = imx_clk_gate2("apbh_dma",      "usdhc3",            base + 0x68, 4);
+       clk[IMX6QDL_CLK_ASRC]         = imx_clk_gate2("asrc",          "asrc_podf",         base + 0x68, 6);
+       clk[IMX6QDL_CLK_CAN1_IPG]     = imx_clk_gate2("can1_ipg",      "ipg",               base + 0x68, 14);
+       clk[IMX6QDL_CLK_CAN1_SERIAL]  = imx_clk_gate2("can1_serial",   "can_root",          base + 0x68, 16);
+       clk[IMX6QDL_CLK_CAN2_IPG]     = imx_clk_gate2("can2_ipg",      "ipg",               base + 0x68, 18);
+       clk[IMX6QDL_CLK_CAN2_SERIAL]  = imx_clk_gate2("can2_serial",   "can_root",          base + 0x68, 20);
+       clk[IMX6QDL_CLK_ECSPI1]       = imx_clk_gate2("ecspi1",        "ecspi_root",        base + 0x6c, 0);
+       clk[IMX6QDL_CLK_ECSPI2]       = imx_clk_gate2("ecspi2",        "ecspi_root",        base + 0x6c, 2);
+       clk[IMX6QDL_CLK_ECSPI3]       = imx_clk_gate2("ecspi3",        "ecspi_root",        base + 0x6c, 4);
+       clk[IMX6QDL_CLK_ECSPI4]       = imx_clk_gate2("ecspi4",        "ecspi_root",        base + 0x6c, 6);
        if (cpu_is_imx6dl())
-               /* ecspi5 is replaced with i2c4 on imx6dl & imx6s */
-               clk[ecspi5] = imx_clk_gate2("i2c4",        "ipg_per",           base + 0x6c, 8);
+               clk[IMX6DL_CLK_I2C4]  = imx_clk_gate2("i2c4",          "ipg_per",           base + 0x6c, 8);
        else
-               clk[ecspi5] = imx_clk_gate2("ecspi5",      "ecspi_root",        base + 0x6c, 8);
-       clk[enet]         = imx_clk_gate2("enet",          "ipg",               base + 0x6c, 10);
-       clk[esai]         = imx_clk_gate2_shared("esai",   "esai_podf",         base + 0x6c, 16, &share_count_esai);
-       clk[esai_ahb]     = imx_clk_gate2_shared("esai_ahb", "ahb",             base + 0x6c, 16, &share_count_esai);
-       clk[gpt_ipg]      = imx_clk_gate2("gpt_ipg",       "ipg",               base + 0x6c, 20);
-       clk[gpt_ipg_per]  = imx_clk_gate2("gpt_ipg_per",   "ipg_per",           base + 0x6c, 22);
+               clk[IMX6Q_CLK_ECSPI5] = imx_clk_gate2("ecspi5",        "ecspi_root",        base + 0x6c, 8);
+       clk[IMX6QDL_CLK_ENET]         = imx_clk_gate2("enet",          "ipg",               base + 0x6c, 10);
+       clk[IMX6QDL_CLK_ESAI]         = imx_clk_gate2_shared("esai",   "esai_podf",         base + 0x6c, 16, &share_count_esai);
+       clk[IMX6QDL_CLK_ESAI_AHB]     = imx_clk_gate2_shared("esai_ahb", "ahb",             base + 0x6c, 16, &share_count_esai);
+       clk[IMX6QDL_CLK_GPT_IPG]      = imx_clk_gate2("gpt_ipg",       "ipg",               base + 0x6c, 20);
+       clk[IMX6QDL_CLK_GPT_IPG_PER]  = imx_clk_gate2("gpt_ipg_per",   "ipg_per",           base + 0x6c, 22);
        if (cpu_is_imx6dl())
                /*
                 * The multiplexer and divider of imx6q clock gpu3d_shader get
                 * redefined/reused as gpu2d_core_sel and gpu2d_core_podf on imx6dl.
                 */
-               clk[gpu2d_core] = imx_clk_gate2("gpu2d_core", "gpu3d_shader", base + 0x6c, 24);
+               clk[IMX6QDL_CLK_GPU2D_CORE] = imx_clk_gate2("gpu2d_core", "gpu3d_shader", base + 0x6c, 24);
        else
-               clk[gpu2d_core] = imx_clk_gate2("gpu2d_core", "gpu2d_core_podf", base + 0x6c, 24);
-       clk[gpu3d_core]   = imx_clk_gate2("gpu3d_core",    "gpu3d_core_podf",   base + 0x6c, 26);
-       clk[hdmi_iahb]    = imx_clk_gate2("hdmi_iahb",     "ahb",               base + 0x70, 0);
-       clk[hdmi_isfr]    = imx_clk_gate2("hdmi_isfr",     "pll3_pfd1_540m",    base + 0x70, 4);
-       clk[i2c1]         = imx_clk_gate2("i2c1",          "ipg_per",           base + 0x70, 6);
-       clk[i2c2]         = imx_clk_gate2("i2c2",          "ipg_per",           base + 0x70, 8);
-       clk[i2c3]         = imx_clk_gate2("i2c3",          "ipg_per",           base + 0x70, 10);
-       clk[iim]          = imx_clk_gate2("iim",           "ipg",               base + 0x70, 12);
-       clk[enfc]         = imx_clk_gate2("enfc",          "enfc_podf",         base + 0x70, 14);
-       clk[vdoa]         = imx_clk_gate2("vdoa",          "vdo_axi",           base + 0x70, 26);
-       clk[ipu1]         = imx_clk_gate2("ipu1",          "ipu1_podf",         base + 0x74, 0);
-       clk[ipu1_di0]     = imx_clk_gate2("ipu1_di0",      "ipu1_di0_sel",      base + 0x74, 2);
-       clk[ipu1_di1]     = imx_clk_gate2("ipu1_di1",      "ipu1_di1_sel",      base + 0x74, 4);
-       clk[ipu2]         = imx_clk_gate2("ipu2",          "ipu2_podf",         base + 0x74, 6);
-       clk[ipu2_di0]     = imx_clk_gate2("ipu2_di0",      "ipu2_di0_sel",      base + 0x74, 8);
-       clk[ldb_di0]      = imx_clk_gate2("ldb_di0",       "ldb_di0_podf",      base + 0x74, 12);
-       clk[ldb_di1]      = imx_clk_gate2("ldb_di1",       "ldb_di1_podf",      base + 0x74, 14);
-       clk[ipu2_di1]     = imx_clk_gate2("ipu2_di1",      "ipu2_di1_sel",      base + 0x74, 10);
-       clk[hsi_tx]       = imx_clk_gate2("hsi_tx",        "hsi_tx_podf",       base + 0x74, 16);
+               clk[IMX6QDL_CLK_GPU2D_CORE] = imx_clk_gate2("gpu2d_core", "gpu2d_core_podf", base + 0x6c, 24);
+       clk[IMX6QDL_CLK_GPU3D_CORE]   = imx_clk_gate2("gpu3d_core",    "gpu3d_core_podf",   base + 0x6c, 26);
+       clk[IMX6QDL_CLK_HDMI_IAHB]    = imx_clk_gate2("hdmi_iahb",     "ahb",               base + 0x70, 0);
+       clk[IMX6QDL_CLK_HDMI_ISFR]    = imx_clk_gate2("hdmi_isfr",     "pll3_pfd1_540m",    base + 0x70, 4);
+       clk[IMX6QDL_CLK_I2C1]         = imx_clk_gate2("i2c1",          "ipg_per",           base + 0x70, 6);
+       clk[IMX6QDL_CLK_I2C2]         = imx_clk_gate2("i2c2",          "ipg_per",           base + 0x70, 8);
+       clk[IMX6QDL_CLK_I2C3]         = imx_clk_gate2("i2c3",          "ipg_per",           base + 0x70, 10);
+       clk[IMX6QDL_CLK_IIM]          = imx_clk_gate2("iim",           "ipg",               base + 0x70, 12);
+       clk[IMX6QDL_CLK_ENFC]         = imx_clk_gate2("enfc",          "enfc_podf",         base + 0x70, 14);
+       clk[IMX6QDL_CLK_VDOA]         = imx_clk_gate2("vdoa",          "vdo_axi",           base + 0x70, 26);
+       clk[IMX6QDL_CLK_IPU1]         = imx_clk_gate2("ipu1",          "ipu1_podf",         base + 0x74, 0);
+       clk[IMX6QDL_CLK_IPU1_DI0]     = imx_clk_gate2("ipu1_di0",      "ipu1_di0_sel",      base + 0x74, 2);
+       clk[IMX6QDL_CLK_IPU1_DI1]     = imx_clk_gate2("ipu1_di1",      "ipu1_di1_sel",      base + 0x74, 4);
+       clk[IMX6QDL_CLK_IPU2]         = imx_clk_gate2("ipu2",          "ipu2_podf",         base + 0x74, 6);
+       clk[IMX6QDL_CLK_IPU2_DI0]     = imx_clk_gate2("ipu2_di0",      "ipu2_di0_sel",      base + 0x74, 8);
+       clk[IMX6QDL_CLK_LDB_DI0]      = imx_clk_gate2("ldb_di0",       "ldb_di0_podf",      base + 0x74, 12);
+       clk[IMX6QDL_CLK_LDB_DI1]      = imx_clk_gate2("ldb_di1",       "ldb_di1_podf",      base + 0x74, 14);
+       clk[IMX6QDL_CLK_IPU2_DI1]     = imx_clk_gate2("ipu2_di1",      "ipu2_di1_sel",      base + 0x74, 10);
+       clk[IMX6QDL_CLK_HSI_TX]       = imx_clk_gate2("hsi_tx",        "hsi_tx_podf",       base + 0x74, 16);
        if (cpu_is_imx6dl())
                /*
                 * The multiplexer and divider of the imx6q clock gpu2d get
                 * redefined/reused as mlb_sys_sel and mlb_sys_clk_podf on imx6dl.
                 */
-               clk[mlb] = imx_clk_gate2("mlb",            "gpu2d_core_podf",   base + 0x74, 18);
+               clk[IMX6QDL_CLK_MLB] = imx_clk_gate2("mlb",            "gpu2d_core_podf",   base + 0x74, 18);
        else
-               clk[mlb] = imx_clk_gate2("mlb",            "axi",               base + 0x74, 18);
-       clk[mmdc_ch0_axi] = imx_clk_gate2("mmdc_ch0_axi",  "mmdc_ch0_axi_podf", base + 0x74, 20);
-       clk[mmdc_ch1_axi] = imx_clk_gate2("mmdc_ch1_axi",  "mmdc_ch1_axi_podf", base + 0x74, 22);
-       clk[ocram]        = imx_clk_gate2("ocram",         "ahb",               base + 0x74, 28);
-       clk[openvg_axi]   = imx_clk_gate2("openvg_axi",    "axi",               base + 0x74, 30);
-       clk[pcie_axi]     = imx_clk_gate2("pcie_axi",      "pcie_axi_sel",      base + 0x78, 0);
-       clk[per1_bch]     = imx_clk_gate2("per1_bch",      "usdhc3",            base + 0x78, 12);
-       clk[pwm1]         = imx_clk_gate2("pwm1",          "ipg_per",           base + 0x78, 16);
-       clk[pwm2]         = imx_clk_gate2("pwm2",          "ipg_per",           base + 0x78, 18);
-       clk[pwm3]         = imx_clk_gate2("pwm3",          "ipg_per",           base + 0x78, 20);
-       clk[pwm4]         = imx_clk_gate2("pwm4",          "ipg_per",           base + 0x78, 22);
-       clk[gpmi_bch_apb] = imx_clk_gate2("gpmi_bch_apb",  "usdhc3",            base + 0x78, 24);
-       clk[gpmi_bch]     = imx_clk_gate2("gpmi_bch",      "usdhc4",            base + 0x78, 26);
-       clk[gpmi_io]      = imx_clk_gate2("gpmi_io",       "enfc",              base + 0x78, 28);
-       clk[gpmi_apb]     = imx_clk_gate2("gpmi_apb",      "usdhc3",            base + 0x78, 30);
-       clk[rom]          = imx_clk_gate2("rom",           "ahb",               base + 0x7c, 0);
-       clk[sata]         = imx_clk_gate2("sata",          "ipg",               base + 0x7c, 4);
-       clk[sdma]         = imx_clk_gate2("sdma",          "ahb",               base + 0x7c, 6);
-       clk[spba]         = imx_clk_gate2("spba",          "ipg",               base + 0x7c, 12);
-       clk[spdif]        = imx_clk_gate2("spdif",         "spdif_podf",        base + 0x7c, 14);
-       clk[ssi1_ipg]     = imx_clk_gate2("ssi1_ipg",      "ipg",               base + 0x7c, 18);
-       clk[ssi2_ipg]     = imx_clk_gate2("ssi2_ipg",      "ipg",               base + 0x7c, 20);
-       clk[ssi3_ipg]     = imx_clk_gate2("ssi3_ipg",      "ipg",               base + 0x7c, 22);
-       clk[uart_ipg]     = imx_clk_gate2("uart_ipg",      "ipg",               base + 0x7c, 24);
-       clk[uart_serial]  = imx_clk_gate2("uart_serial",   "uart_serial_podf",  base + 0x7c, 26);
-       clk[usboh3]       = imx_clk_gate2("usboh3",        "ipg",               base + 0x80, 0);
-       clk[usdhc1]       = imx_clk_gate2("usdhc1",        "usdhc1_podf",       base + 0x80, 2);
-       clk[usdhc2]       = imx_clk_gate2("usdhc2",        "usdhc2_podf",       base + 0x80, 4);
-       clk[usdhc3]       = imx_clk_gate2("usdhc3",        "usdhc3_podf",       base + 0x80, 6);
-       clk[usdhc4]       = imx_clk_gate2("usdhc4",        "usdhc4_podf",       base + 0x80, 8);
-       clk[eim_slow]     = imx_clk_gate2("eim_slow",      "emi_slow_podf",     base + 0x80, 10);
-       clk[vdo_axi]      = imx_clk_gate2("vdo_axi",       "vdo_axi_sel",       base + 0x80, 12);
-       clk[vpu_axi]      = imx_clk_gate2("vpu_axi",       "vpu_axi_podf",      base + 0x80, 14);
-       clk[cko1]         = imx_clk_gate("cko1",           "cko1_podf",         base + 0x60, 7);
-       clk[cko2]         = imx_clk_gate("cko2",           "cko2_podf",         base + 0x60, 24);
-
-       for (i = 0; i < ARRAY_SIZE(clk); i++)
-               if (IS_ERR(clk[i]))
-                       pr_err("i.MX6q clk %d: register failed with %ld\n",
-                               i, PTR_ERR(clk[i]));
+               clk[IMX6QDL_CLK_MLB] = imx_clk_gate2("mlb",            "axi",               base + 0x74, 18);
+       clk[IMX6QDL_CLK_MMDC_CH0_AXI] = imx_clk_gate2("mmdc_ch0_axi",  "mmdc_ch0_axi_podf", base + 0x74, 20);
+       clk[IMX6QDL_CLK_MMDC_CH1_AXI] = imx_clk_gate2("mmdc_ch1_axi",  "mmdc_ch1_axi_podf", base + 0x74, 22);
+       clk[IMX6QDL_CLK_OCRAM]        = imx_clk_gate2("ocram",         "ahb",               base + 0x74, 28);
+       clk[IMX6QDL_CLK_OPENVG_AXI]   = imx_clk_gate2("openvg_axi",    "axi",               base + 0x74, 30);
+       clk[IMX6QDL_CLK_PCIE_AXI]     = imx_clk_gate2("pcie_axi",      "pcie_axi_sel",      base + 0x78, 0);
+       clk[IMX6QDL_CLK_PER1_BCH]     = imx_clk_gate2("per1_bch",      "usdhc3",            base + 0x78, 12);
+       clk[IMX6QDL_CLK_PWM1]         = imx_clk_gate2("pwm1",          "ipg_per",           base + 0x78, 16);
+       clk[IMX6QDL_CLK_PWM2]         = imx_clk_gate2("pwm2",          "ipg_per",           base + 0x78, 18);
+       clk[IMX6QDL_CLK_PWM3]         = imx_clk_gate2("pwm3",          "ipg_per",           base + 0x78, 20);
+       clk[IMX6QDL_CLK_PWM4]         = imx_clk_gate2("pwm4",          "ipg_per",           base + 0x78, 22);
+       clk[IMX6QDL_CLK_GPMI_BCH_APB] = imx_clk_gate2("gpmi_bch_apb",  "usdhc3",            base + 0x78, 24);
+       clk[IMX6QDL_CLK_GPMI_BCH]     = imx_clk_gate2("gpmi_bch",      "usdhc4",            base + 0x78, 26);
+       clk[IMX6QDL_CLK_GPMI_IO]      = imx_clk_gate2("gpmi_io",       "enfc",              base + 0x78, 28);
+       clk[IMX6QDL_CLK_GPMI_APB]     = imx_clk_gate2("gpmi_apb",      "usdhc3",            base + 0x78, 30);
+       clk[IMX6QDL_CLK_ROM]          = imx_clk_gate2("rom",           "ahb",               base + 0x7c, 0);
+       clk[IMX6QDL_CLK_SATA]         = imx_clk_gate2("sata",          "ipg",               base + 0x7c, 4);
+       clk[IMX6QDL_CLK_SDMA]         = imx_clk_gate2("sdma",          "ahb",               base + 0x7c, 6);
+       clk[IMX6QDL_CLK_SPBA]         = imx_clk_gate2("spba",          "ipg",               base + 0x7c, 12);
+       clk[IMX6QDL_CLK_SPDIF]        = imx_clk_gate2("spdif",         "spdif_podf",        base + 0x7c, 14);
+       clk[IMX6QDL_CLK_SSI1_IPG]     = imx_clk_gate2("ssi1_ipg",      "ipg",               base + 0x7c, 18);
+       clk[IMX6QDL_CLK_SSI2_IPG]     = imx_clk_gate2("ssi2_ipg",      "ipg",               base + 0x7c, 20);
+       clk[IMX6QDL_CLK_SSI3_IPG]     = imx_clk_gate2("ssi3_ipg",      "ipg",               base + 0x7c, 22);
+       clk[IMX6QDL_CLK_UART_IPG]     = imx_clk_gate2("uart_ipg",      "ipg",               base + 0x7c, 24);
+       clk[IMX6QDL_CLK_UART_SERIAL]  = imx_clk_gate2("uart_serial",   "uart_serial_podf",  base + 0x7c, 26);
+       clk[IMX6QDL_CLK_USBOH3]       = imx_clk_gate2("usboh3",        "ipg",               base + 0x80, 0);
+       clk[IMX6QDL_CLK_USDHC1]       = imx_clk_gate2("usdhc1",        "usdhc1_podf",       base + 0x80, 2);
+       clk[IMX6QDL_CLK_USDHC2]       = imx_clk_gate2("usdhc2",        "usdhc2_podf",       base + 0x80, 4);
+       clk[IMX6QDL_CLK_USDHC3]       = imx_clk_gate2("usdhc3",        "usdhc3_podf",       base + 0x80, 6);
+       clk[IMX6QDL_CLK_USDHC4]       = imx_clk_gate2("usdhc4",        "usdhc4_podf",       base + 0x80, 8);
+       clk[IMX6QDL_CLK_EIM_SLOW]     = imx_clk_gate2("eim_slow",      "emi_slow_podf",     base + 0x80, 10);
+       clk[IMX6QDL_CLK_VDO_AXI]      = imx_clk_gate2("vdo_axi",       "vdo_axi_sel",       base + 0x80, 12);
+       clk[IMX6QDL_CLK_VPU_AXI]      = imx_clk_gate2("vpu_axi",       "vpu_axi_podf",      base + 0x80, 14);
+       clk[IMX6QDL_CLK_CKO1]         = imx_clk_gate("cko1",           "cko1_podf",         base + 0x60, 7);
+       clk[IMX6QDL_CLK_CKO2]         = imx_clk_gate("cko2",           "cko2_podf",         base + 0x60, 24);
+
+       imx_check_clocks(clk, ARRAY_SIZE(clk));
 
        clk_data.clks = clk;
        clk_data.clk_num = ARRAY_SIZE(clk);
        of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
 
-       clk_register_clkdev(clk[gpt_ipg], "ipg", "imx-gpt.0");
-       clk_register_clkdev(clk[gpt_ipg_per], "per", "imx-gpt.0");
-       clk_register_clkdev(clk[enet_ref], "enet_ref", NULL);
+       clk_register_clkdev(clk[IMX6QDL_CLK_ENET_REF], "enet_ref", NULL);
 
        if ((imx_get_soc_revision() != IMX_CHIP_REVISION_1_0) ||
            cpu_is_imx6dl()) {
-               clk_set_parent(clk[ldb_di0_sel], clk[pll5_video_div]);
-               clk_set_parent(clk[ldb_di1_sel], clk[pll5_video_div]);
+               clk_set_parent(clk[IMX6QDL_CLK_LDB_DI0_SEL], clk[IMX6QDL_CLK_PLL5_VIDEO_DIV]);
+               clk_set_parent(clk[IMX6QDL_CLK_LDB_DI1_SEL], clk[IMX6QDL_CLK_PLL5_VIDEO_DIV]);
        }
 
-       clk_set_parent(clk[ipu1_di0_pre_sel], clk[pll5_video_div]);
-       clk_set_parent(clk[ipu1_di1_pre_sel], clk[pll5_video_div]);
-       clk_set_parent(clk[ipu2_di0_pre_sel], clk[pll5_video_div]);
-       clk_set_parent(clk[ipu2_di1_pre_sel], clk[pll5_video_div]);
-       clk_set_parent(clk[ipu1_di0_sel], clk[ipu1_di0_pre]);
-       clk_set_parent(clk[ipu1_di1_sel], clk[ipu1_di1_pre]);
-       clk_set_parent(clk[ipu2_di0_sel], clk[ipu2_di0_pre]);
-       clk_set_parent(clk[ipu2_di1_sel], clk[ipu2_di1_pre]);
+       clk_set_parent(clk[IMX6QDL_CLK_IPU1_DI0_PRE_SEL], clk[IMX6QDL_CLK_PLL5_VIDEO_DIV]);
+       clk_set_parent(clk[IMX6QDL_CLK_IPU1_DI1_PRE_SEL], clk[IMX6QDL_CLK_PLL5_VIDEO_DIV]);
+       clk_set_parent(clk[IMX6QDL_CLK_IPU2_DI0_PRE_SEL], clk[IMX6QDL_CLK_PLL5_VIDEO_DIV]);
+       clk_set_parent(clk[IMX6QDL_CLK_IPU2_DI1_PRE_SEL], clk[IMX6QDL_CLK_PLL5_VIDEO_DIV]);
+       clk_set_parent(clk[IMX6QDL_CLK_IPU1_DI0_SEL], clk[IMX6QDL_CLK_IPU1_DI0_PRE]);
+       clk_set_parent(clk[IMX6QDL_CLK_IPU1_DI1_SEL], clk[IMX6QDL_CLK_IPU1_DI1_PRE]);
+       clk_set_parent(clk[IMX6QDL_CLK_IPU2_DI0_SEL], clk[IMX6QDL_CLK_IPU2_DI0_PRE]);
+       clk_set_parent(clk[IMX6QDL_CLK_IPU2_DI1_SEL], clk[IMX6QDL_CLK_IPU2_DI1_PRE]);
 
        /*
         * The gpmi needs 100MHz frequency in the EDO/Sync mode,
         * We can not get the 100MHz from the pll2_pfd0_352m.
         * So choose pll2_pfd2_396m as enfc_sel's parent.
         */
-       clk_set_parent(clk[enfc_sel], clk[pll2_pfd2_396m]);
+       clk_set_parent(clk[IMX6QDL_CLK_ENFC_SEL], clk[IMX6QDL_CLK_PLL2_PFD2_396M]);
 
        for (i = 0; i < ARRAY_SIZE(clks_init_on); i++)
                clk_prepare_enable(clk[clks_init_on[i]]);
 
        if (IS_ENABLED(CONFIG_USB_MXS_PHY)) {
-               clk_prepare_enable(clk[usbphy1_gate]);
-               clk_prepare_enable(clk[usbphy2_gate]);
+               clk_prepare_enable(clk[IMX6QDL_CLK_USBPHY1_GATE]);
+               clk_prepare_enable(clk[IMX6QDL_CLK_USBPHY2_GATE]);
        }
 
        /*
         * Let's initially set up CLKO with OSC24M, since this configuration
         * is widely used by imx6q board designs to clock audio codec.
         */
-       ret = clk_set_parent(clk[cko2_sel], clk[osc]);
+       ret = clk_set_parent(clk[IMX6QDL_CLK_CKO2_SEL], clk[IMX6QDL_CLK_OSC]);
        if (!ret)
-               ret = clk_set_parent(clk[cko], clk[cko2]);
+               ret = clk_set_parent(clk[IMX6QDL_CLK_CKO], clk[IMX6QDL_CLK_CKO2]);
        if (ret)
                pr_warn("failed to set up CLKO: %d\n", ret);
 
        /* Audio-related clocks configuration */
-       clk_set_parent(clk[spdif_sel], clk[pll3_pfd3_454m]);
+       clk_set_parent(clk[IMX6QDL_CLK_SPDIF_SEL], clk[IMX6QDL_CLK_PLL3_PFD3_454M]);
 
        /* All existing boards with PCIe use LVDS1 */
        if (IS_ENABLED(CONFIG_PCI_IMX6))
-               clk_set_parent(clk[lvds1_sel], clk[sata_ref_100m]);
+               clk_set_parent(clk[IMX6QDL_CLK_LVDS1_SEL], clk[IMX6QDL_CLK_SATA_REF_100M]);
 
        /* Set initial power mode */
        imx6q_set_lpm(WAIT_CLOCKED);
-
-       mxc_timer_init_dt(of_find_compatible_node(NULL, NULL, "fsl,imx6q-gpt"));
 }
 CLK_OF_DECLARE(imx6q, "fsl,imx6q-ccm", imx6q_clocks_init);
index 5408ca70c8d62ca01cc9d7dbf0fb331b51edec32..fef46faf692f042eae4f1d45a9ce86534a0e3810 100644 (file)
@@ -348,18 +348,12 @@ static void __init imx6sl_clocks_init(struct device_node *ccm_node)
        clks[IMX6SL_CLK_USDHC3]       = imx_clk_gate2("usdhc3",       "usdhc3_podf",       base + 0x80, 6);
        clks[IMX6SL_CLK_USDHC4]       = imx_clk_gate2("usdhc4",       "usdhc4_podf",       base + 0x80, 8);
 
-       for (i = 0; i < ARRAY_SIZE(clks); i++)
-               if (IS_ERR(clks[i]))
-                       pr_err("i.MX6SL clk %d: register failed with %ld\n",
-                               i, PTR_ERR(clks[i]));
+       imx_check_clocks(clks, ARRAY_SIZE(clks));
 
        clk_data.clks = clks;
        clk_data.clk_num = ARRAY_SIZE(clks);
        of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
 
-       clk_register_clkdev(clks[IMX6SL_CLK_GPT], "ipg", "imx-gpt.0");
-       clk_register_clkdev(clks[IMX6SL_CLK_GPT_SERIAL], "per", "imx-gpt.0");
-
        /* Ensure the AHB clk is at 132MHz. */
        ret = clk_set_rate(clks[IMX6SL_CLK_AHB], 132000000);
        if (ret)
@@ -383,8 +377,5 @@ static void __init imx6sl_clocks_init(struct device_node *ccm_node)
 
        /* Set initial power mode */
        imx6q_set_lpm(WAIT_CLOCKED);
-
-       np = of_find_compatible_node(NULL, NULL, "fsl,imx6sl-gpt");
-       mxc_timer_init_dt(np);
 }
 CLK_OF_DECLARE(imx6sl, "fsl,imx6sl-ccm", imx6sl_clocks_init);
index 72f8902235d193d4ee2c46696e69875dddec8741..ecde72bdfe888b72d401147a23f60f71d0d01652 100644 (file)
@@ -124,6 +124,9 @@ static struct clk_div_table video_div_table[] = {
 static u32 share_count_asrc;
 static u32 share_count_audio;
 static u32 share_count_esai;
+static u32 share_count_ssi1;
+static u32 share_count_ssi2;
+static u32 share_count_ssi3;
 
 static void __init imx6sx_clocks_init(struct device_node *ccm_node)
 {
@@ -409,12 +412,12 @@ static void __init imx6sx_clocks_init(struct device_node *ccm_node)
        clks[IMX6SX_CLK_SPBA]         = imx_clk_gate2("spba",          "ipg",               base + 0x7c, 12);
        clks[IMX6SX_CLK_AUDIO]        = imx_clk_gate2_shared("audio",  "audio_podf",        base + 0x7c, 14, &share_count_audio);
        clks[IMX6SX_CLK_SPDIF]        = imx_clk_gate2_shared("spdif",  "spdif_podf",        base + 0x7c, 14, &share_count_audio);
-       clks[IMX6SX_CLK_SSI1_IPG]     = imx_clk_gate2("ssi1_ipg",      "ipg",               base + 0x7c, 18);
-       clks[IMX6SX_CLK_SSI2_IPG]     = imx_clk_gate2("ssi2_ipg",      "ipg",               base + 0x7c, 20);
-       clks[IMX6SX_CLK_SSI3_IPG]     = imx_clk_gate2("ssi3_ipg",      "ipg",               base + 0x7c, 22);
-       clks[IMX6SX_CLK_SSI1]         = imx_clk_gate2("ssi1",          "ssi1_podf",         base + 0x7c, 18);
-       clks[IMX6SX_CLK_SSI2]         = imx_clk_gate2("ssi2",          "ssi2_podf",         base + 0x7c, 20);
-       clks[IMX6SX_CLK_SSI3]         = imx_clk_gate2("ssi3",          "ssi3_podf",         base + 0x7c, 22);
+       clks[IMX6SX_CLK_SSI1_IPG]     = imx_clk_gate2_shared("ssi1_ipg",      "ipg",        base + 0x7c, 18, &share_count_ssi1);
+       clks[IMX6SX_CLK_SSI2_IPG]     = imx_clk_gate2_shared("ssi2_ipg",      "ipg",        base + 0x7c, 20, &share_count_ssi2);
+       clks[IMX6SX_CLK_SSI3_IPG]     = imx_clk_gate2_shared("ssi3_ipg",      "ipg",        base + 0x7c, 22, &share_count_ssi3);
+       clks[IMX6SX_CLK_SSI1]         = imx_clk_gate2_shared("ssi1",          "ssi1_podf",  base + 0x7c, 18, &share_count_ssi1);
+       clks[IMX6SX_CLK_SSI2]         = imx_clk_gate2_shared("ssi2",          "ssi2_podf",  base + 0x7c, 20, &share_count_ssi2);
+       clks[IMX6SX_CLK_SSI3]         = imx_clk_gate2_shared("ssi3",          "ssi3_podf",  base + 0x7c, 22, &share_count_ssi3);
        clks[IMX6SX_CLK_UART_IPG]     = imx_clk_gate2("uart_ipg",      "ipg",               base + 0x7c, 24);
        clks[IMX6SX_CLK_UART_SERIAL]  = imx_clk_gate2("uart_serial",   "uart_podf",         base + 0x7c, 26);
        clks[IMX6SX_CLK_SAI1_IPG]     = imx_clk_gate2("sai1_ipg",      "ipg",               base + 0x7c, 28);
@@ -443,17 +446,12 @@ static void __init imx6sx_clocks_init(struct device_node *ccm_node)
        /* mask handshake of mmdc */
        writel_relaxed(BM_CCM_CCDR_MMDC_CH0_MASK, base + CCDR);
 
-       for (i = 0; i < ARRAY_SIZE(clks); i++)
-               if (IS_ERR(clks[i]))
-                       pr_err("i.MX6sx clk %d: register failed with %ld\n", i, PTR_ERR(clks[i]));
+       imx_check_clocks(clks, ARRAY_SIZE(clks));
 
        clk_data.clks = clks;
        clk_data.clk_num = ARRAY_SIZE(clks);
        of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
 
-       clk_register_clkdev(clks[IMX6SX_CLK_GPT_BUS], "ipg", "imx-gpt.0");
-       clk_register_clkdev(clks[IMX6SX_CLK_GPT_SERIAL], "per", "imx-gpt.0");
-
        for (i = 0; i < ARRAY_SIZE(clks_init_on); i++)
                clk_prepare_enable(clks[clks_init_on[i]]);
 
@@ -517,8 +515,5 @@ static void __init imx6sx_clocks_init(struct device_node *ccm_node)
 
        /* Set initial power mode */
        imx6q_set_lpm(WAIT_CLOCKED);
-
-       np = of_find_compatible_node(NULL, NULL, "fsl,imx6sx-gpt");
-       mxc_timer_init_dt(np);
 }
 CLK_OF_DECLARE(imx6sx, "fsl,imx6sx-ccm", imx6sx_clocks_init);
index 22dc3ee21fd494fe671a3048fc4925c4d9d95c80..f60d6d569ce3b004e268f7bff29926470a1cd34d 100644 (file)
@@ -295,14 +295,18 @@ static void __init vf610_clocks_init(struct device_node *ccm_node)
 
        clk[VF610_CLK_ASRC] = imx_clk_gate2("asrc", "ipg_bus", CCM_CCGR4, CCM_CCGRx_CGn(1));
 
-       clk[VF610_CLK_FLEXCAN0] = imx_clk_gate2("flexcan0", "ipg_bus", CCM_CCGR0, CCM_CCGRx_CGn(0));
-       clk[VF610_CLK_FLEXCAN1] = imx_clk_gate2("flexcan1", "ipg_bus", CCM_CCGR9, CCM_CCGRx_CGn(4));
+       clk[VF610_CLK_FLEXCAN0_EN] = imx_clk_gate("flexcan0_en", "ipg_bus", CCM_CSCDR2, 11);
+       clk[VF610_CLK_FLEXCAN0] = imx_clk_gate2("flexcan0", "flexcan0_en", CCM_CCGR0, CCM_CCGRx_CGn(0));
+       clk[VF610_CLK_FLEXCAN1_EN] = imx_clk_gate("flexcan1_en", "ipg_bus", CCM_CSCDR2, 12);
+       clk[VF610_CLK_FLEXCAN1] = imx_clk_gate2("flexcan1", "flexcan1_en", CCM_CCGR9, CCM_CCGRx_CGn(4));
 
        clk[VF610_CLK_DMAMUX0] = imx_clk_gate2("dmamux0", "platform_bus", CCM_CCGR0, CCM_CCGRx_CGn(4));
        clk[VF610_CLK_DMAMUX1] = imx_clk_gate2("dmamux1", "platform_bus", CCM_CCGR0, CCM_CCGRx_CGn(5));
        clk[VF610_CLK_DMAMUX2] = imx_clk_gate2("dmamux2", "platform_bus", CCM_CCGR6, CCM_CCGRx_CGn(1));
        clk[VF610_CLK_DMAMUX3] = imx_clk_gate2("dmamux3", "platform_bus", CCM_CCGR6, CCM_CCGRx_CGn(2));
 
+       imx_check_clocks(clk, ARRAY_SIZE(clk));
+
        clk_set_parent(clk[VF610_CLK_QSPI0_SEL], clk[VF610_CLK_PLL1_PFD4]);
        clk_set_rate(clk[VF610_CLK_QSPI0_X4_DIV], clk_get_rate(clk[VF610_CLK_QSPI0_SEL]) / 2);
        clk_set_rate(clk[VF610_CLK_QSPI0_X2_DIV], clk_get_rate(clk[VF610_CLK_QSPI0_X4_DIV]) / 2);
index edc35df7bed4a0da6d72dde245ca9257fc296805..df12b53071752955d533f20391d1a26a2a4dcd1e 100644 (file)
@@ -7,6 +7,16 @@
 
 DEFINE_SPINLOCK(imx_ccm_lock);
 
+void __init imx_check_clocks(struct clk *clks[], unsigned int count)
+{
+       unsigned i;
+
+       for (i = 0; i < count; i++)
+               if (IS_ERR(clks[i]))
+                       pr_err("i.MX clk %u: register failed with %ld\n",
+                              i, PTR_ERR(clks[i]));
+}
+
 static struct clk * __init imx_obtain_fixed_clock_from_dt(const char *name)
 {
        struct of_phandle_args phandle;
index e29f6ebe9f39d0047abce6e010b9e577a1db14bc..d5ba76fee1154ef70e1a47fa304d32db4aa916c0 100644 (file)
@@ -6,6 +6,8 @@
 
 extern spinlock_t imx_ccm_lock;
 
+void imx_check_clocks(struct clk *clks[], unsigned int count);
+
 extern void imx_cscmr1_fixup(u32 *val);
 
 struct clk *imx_clk_pllv1(const char *name, const char *parent,
@@ -95,6 +97,13 @@ static inline struct clk *imx_clk_gate(const char *name, const char *parent,
                        shift, 0, &imx_ccm_lock);
 }
 
+static inline struct clk *imx_clk_gate_dis(const char *name, const char *parent,
+               void __iomem *reg, u8 shift)
+{
+       return clk_register_gate(NULL, name, parent, CLK_SET_RATE_PARENT, reg,
+                       shift, CLK_GATE_SET_TO_DISABLE, &imx_ccm_lock);
+}
+
 static inline struct clk *imx_clk_mux(const char *name, void __iomem *reg,
                u8 shift, u8 width, const char **parents, int num_parents)
 {
index 9ab785ce13e86bcb7b9b37b7a6cb4b59b4799244..22ba8973bcb957a341c7c35f805e959b44137b96 100644 (file)
@@ -19,6 +19,7 @@ struct pt_regs;
 struct clk;
 struct device_node;
 enum mxc_cpu_pwr_mode;
+struct of_device_id;
 
 void mx1_map_io(void);
 void mx21_map_io(void);
@@ -26,48 +27,34 @@ void mx25_map_io(void);
 void mx27_map_io(void);
 void mx31_map_io(void);
 void mx35_map_io(void);
-void mx51_map_io(void);
-void mx53_map_io(void);
 void imx1_init_early(void);
 void imx21_init_early(void);
 void imx25_init_early(void);
 void imx27_init_early(void);
 void imx31_init_early(void);
 void imx35_init_early(void);
-void imx51_init_early(void);
-void imx53_init_early(void);
 void mxc_init_irq(void __iomem *);
-void tzic_init_irq(void __iomem *);
+void tzic_init_irq(void);
 void mx1_init_irq(void);
 void mx21_init_irq(void);
 void mx25_init_irq(void);
 void mx27_init_irq(void);
 void mx31_init_irq(void);
 void mx35_init_irq(void);
-void mx51_init_irq(void);
-void mx53_init_irq(void);
 void imx1_soc_init(void);
 void imx21_soc_init(void);
 void imx25_soc_init(void);
 void imx27_soc_init(void);
 void imx31_soc_init(void);
 void imx35_soc_init(void);
-void imx51_soc_init(void);
-void imx51_init_late(void);
-void imx53_init_late(void);
 void epit_timer_init(void __iomem *base, int irq);
 void mxc_timer_init(void __iomem *, int);
-void mxc_timer_init_dt(struct device_node *);
 int mx1_clocks_init(unsigned long fref);
 int mx21_clocks_init(unsigned long lref, unsigned long fref);
 int mx25_clocks_init(void);
 int mx27_clocks_init(unsigned long fref);
 int mx31_clocks_init(unsigned long fref);
 int mx35_clocks_init(void);
-int mx51_clocks_init(unsigned long ckil, unsigned long osc,
-                       unsigned long ckih1, unsigned long ckih2);
-int mx25_clocks_init_dt(void);
-int mx27_clocks_init_dt(void);
 int mx31_clocks_init_dt(void);
 struct platform_device *mxc_register_gpio(char *name, int id,
        resource_size_t iobase, resource_size_t iosize, int irq, int irq_high);
@@ -75,8 +62,10 @@ void mxc_set_cpu_type(unsigned int type);
 void mxc_restart(enum reboot_mode, const char *);
 void mxc_arch_reset_init(void __iomem *);
 void mxc_arch_reset_init_dt(void);
+int mx51_revision(void);
 int mx53_revision(void);
 void imx_set_aips(void __iomem *);
+void imx_aips_allow_unprivileged_access(const char *compat);
 int mxc_device_init(void);
 void imx_set_soc_revision(unsigned int rev);
 unsigned int imx_get_soc_revision(void);
@@ -117,7 +106,7 @@ static inline void imx_scu_standby_enable(void) {}
 #endif
 void imx_src_init(void);
 void imx_gpc_init(void);
-void imx_gpc_pre_suspend(void);
+void imx_gpc_pre_suspend(bool arm_power_off);
 void imx_gpc_post_resume(void);
 void imx_gpc_mask_all(void);
 void imx_gpc_restore_all(void);
@@ -127,7 +116,7 @@ void imx_anatop_init(void);
 void imx_anatop_pre_suspend(void);
 void imx_anatop_post_resume(void);
 int imx6q_set_lpm(enum mxc_cpu_pwr_mode mode);
-void imx6q_set_int_mem_clk_lpm(void);
+void imx6q_set_int_mem_clk_lpm(bool enable);
 void imx6sl_set_wait_clk(bool enter);
 
 void imx_cpu_die(unsigned int cpu);
@@ -144,12 +133,17 @@ static inline void imx6_suspend(void __iomem *ocram_vbase) {}
 void imx6q_pm_init(void);
 void imx6dl_pm_init(void);
 void imx6sl_pm_init(void);
+void imx6sx_pm_init(void);
 void imx6q_pm_set_ccm_base(void __iomem *base);
 
 #ifdef CONFIG_PM
-void imx5_pm_init(void);
+void imx51_pm_init(void);
+void imx53_pm_init(void);
+void imx5_pm_set_ccm_base(void __iomem *base);
 #else
-static inline void imx5_pm_init(void) {}
+static inline void imx51_pm_init(void) {}
+static inline void imx53_pm_init(void) {}
+static inline void imx5_pm_set_ccm_base(void __iomem *base) {}
 #endif
 
 #ifdef CONFIG_NEON
index c1c99a72c6a168a4256ddb73974efafd2ee4f6a8..3403bac94a31af62ffd3ea67589e3cb96d036d48 100644 (file)
@@ -16,6 +16,8 @@
 #include <linux/init.h>
 #include <linux/module.h>
 #include <linux/io.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
 
 #include "hardware.h"
 #include "common.h"
@@ -24,10 +26,26 @@ static int mx5_cpu_rev = -1;
 
 #define IIM_SREV 0x24
 
+static u32 imx5_read_srev_reg(const char *compat)
+{
+       void __iomem *iim_base;
+       struct device_node *np;
+       u32 srev;
+
+       np = of_find_compatible_node(NULL, NULL, compat);
+       iim_base = of_iomap(np, 0);
+       WARN_ON(!iim_base);
+
+       srev = readl(iim_base + IIM_SREV) & 0xff;
+
+       iounmap(iim_base);
+
+       return srev;
+}
+
 static int get_mx51_srev(void)
 {
-       void __iomem *iim_base = MX51_IO_ADDRESS(MX51_IIM_BASE_ADDR);
-       u32 rev = readl(iim_base + IIM_SREV) & 0xff;
+       u32 rev = imx5_read_srev_reg("fsl,imx51-iim");
 
        switch (rev) {
        case 0x0:
@@ -77,8 +95,7 @@ int __init mx51_neon_fixup(void)
 
 static int get_mx53_srev(void)
 {
-       void __iomem *iim_base = MX51_IO_ADDRESS(MX53_IIM_BASE_ADDR);
-       u32 rev = readl(iim_base + IIM_SREV) & 0xff;
+       u32 rev = imx5_read_srev_reg("fsl,imx53-iim");
 
        switch (rev) {
        case 0x0:
index bbe8ff1f0412ed2609c82408ef67fc8b16604a81..df42c14ff7497fb0c1dbd89153c88b46a86748cd 100644 (file)
@@ -2,6 +2,7 @@
 #include <linux/module.h>
 #include <linux/io.h>
 #include <linux/of.h>
+#include <linux/of_address.h>
 #include <linux/slab.h>
 #include <linux/sys_soc.h>
 
@@ -60,6 +61,18 @@ void __init imx_set_aips(void __iomem *base)
        __raw_writel(reg, base + 0x50);
 }
 
+void __init imx_aips_allow_unprivileged_access(
+               const char *compat)
+{
+       void __iomem *aips_base_addr;
+       struct device_node *np;
+
+       for_each_compatible_node(np, NULL, compat) {
+               aips_base_addr = of_iomap(np, 0);
+               imx_set_aips(aips_base_addr);
+       }
+}
+
 struct device * __init imx_soc_device_init(void)
 {
        struct soc_device_attribute *soc_dev_attr;
index 6bcae047904905696c3cb0fbe238f74b1e54100f..10844d3bb926bcb5edec39e719c02355360d79e4 100644 (file)
@@ -13,6 +13,7 @@
 
 #include "common.h"
 #include "cpuidle.h"
+#include "hardware.h"
 
 static atomic_t master = ATOMIC_INIT(0);
 static DEFINE_SPINLOCK(master_lock);
@@ -66,10 +67,11 @@ static struct cpuidle_driver imx6q_cpuidle_driver = {
 int __init imx6q_cpuidle_init(void)
 {
        /* Need to enable SCU standby for entering WAIT modes */
-       imx_scu_standby_enable();
+       if (!cpu_is_imx6sx())
+               imx_scu_standby_enable();
 
        /* Set INT_MEM_CLK_LPM bit to get a reliable WAIT mode support */
-       imx6q_set_int_mem_clk_lpm();
+       imx6q_set_int_mem_clk_lpm(true);
 
        return cpuidle_register(&imx6q_cpuidle_driver, NULL);
 }
diff --git a/arch/arm/mach-imx/crm-regs-imx5.h b/arch/arm/mach-imx/crm-regs-imx5.h
deleted file mode 100644 (file)
index 5e3f1f0..0000000
+++ /dev/null
@@ -1,600 +0,0 @@
-/*
- * Copyright 2008-2009 Freescale Semiconductor, Inc. All Rights Reserved.
- *
- * The code contained herein is licensed under the GNU General Public
- * License. You may obtain a copy of the GNU General Public License
- * Version 2 or later at the following locations:
- *
- * http://www.opensource.org/licenses/gpl-license.html
- * http://www.gnu.org/copyleft/gpl.html
- */
-#ifndef __ARCH_ARM_MACH_MX51_CRM_REGS_H__
-#define __ARCH_ARM_MACH_MX51_CRM_REGS_H__
-
-#define MX51_CCM_BASE          MX51_IO_ADDRESS(MX51_CCM_BASE_ADDR)
-#define MX51_DPLL1_BASE                MX51_IO_ADDRESS(MX51_PLL1_BASE_ADDR)
-#define MX51_DPLL2_BASE                MX51_IO_ADDRESS(MX51_PLL2_BASE_ADDR)
-#define MX51_DPLL3_BASE                MX51_IO_ADDRESS(MX51_PLL3_BASE_ADDR)
-#define MX51_CORTEXA8_BASE     MX51_IO_ADDRESS(MX51_ARM_BASE_ADDR)
-#define MX51_GPC_BASE          MX51_IO_ADDRESS(MX51_GPC_BASE_ADDR)
-
-/*MX53*/
-#define MX53_CCM_BASE          MX53_IO_ADDRESS(MX53_CCM_BASE_ADDR)
-#define MX53_DPLL1_BASE                MX53_IO_ADDRESS(MX53_PLL1_BASE_ADDR)
-#define MX53_DPLL2_BASE                MX53_IO_ADDRESS(MX53_PLL2_BASE_ADDR)
-#define MX53_DPLL3_BASE                MX53_IO_ADDRESS(MX53_PLL3_BASE_ADDR)
-#define MX53_DPLL4_BASE                MX53_IO_ADDRESS(MX53_PLL4_BASE_ADDR)
-
-/* PLL Register Offsets */
-#define MXC_PLL_DP_CTL                 0x00
-#define MXC_PLL_DP_CONFIG              0x04
-#define MXC_PLL_DP_OP                  0x08
-#define MXC_PLL_DP_MFD                 0x0C
-#define MXC_PLL_DP_MFN                 0x10
-#define MXC_PLL_DP_MFNMINUS            0x14
-#define MXC_PLL_DP_MFNPLUS             0x18
-#define MXC_PLL_DP_HFS_OP              0x1C
-#define MXC_PLL_DP_HFS_MFD             0x20
-#define MXC_PLL_DP_HFS_MFN             0x24
-#define MXC_PLL_DP_MFN_TOGC            0x28
-#define MXC_PLL_DP_DESTAT              0x2c
-
-/* PLL Register Bit definitions */
-#define MXC_PLL_DP_CTL_MUL_CTRL                0x2000
-#define MXC_PLL_DP_CTL_DPDCK0_2_EN     0x1000
-#define MXC_PLL_DP_CTL_DPDCK0_2_OFFSET 12
-#define MXC_PLL_DP_CTL_ADE             0x800
-#define MXC_PLL_DP_CTL_REF_CLK_DIV     0x400
-#define MXC_PLL_DP_CTL_REF_CLK_SEL_MASK        (3 << 8)
-#define MXC_PLL_DP_CTL_REF_CLK_SEL_OFFSET      8
-#define MXC_PLL_DP_CTL_HFSM            0x80
-#define MXC_PLL_DP_CTL_PRE             0x40
-#define MXC_PLL_DP_CTL_UPEN            0x20
-#define MXC_PLL_DP_CTL_RST             0x10
-#define MXC_PLL_DP_CTL_RCP             0x8
-#define MXC_PLL_DP_CTL_PLM             0x4
-#define MXC_PLL_DP_CTL_BRM0            0x2
-#define MXC_PLL_DP_CTL_LRF             0x1
-
-#define MXC_PLL_DP_CONFIG_BIST         0x8
-#define MXC_PLL_DP_CONFIG_SJC_CE       0x4
-#define MXC_PLL_DP_CONFIG_AREN         0x2
-#define MXC_PLL_DP_CONFIG_LDREQ                0x1
-
-#define MXC_PLL_DP_OP_MFI_OFFSET       4
-#define MXC_PLL_DP_OP_MFI_MASK         (0xF << 4)
-#define MXC_PLL_DP_OP_PDF_OFFSET       0
-#define MXC_PLL_DP_OP_PDF_MASK         0xF
-
-#define MXC_PLL_DP_MFD_OFFSET          0
-#define MXC_PLL_DP_MFD_MASK            0x07FFFFFF
-
-#define MXC_PLL_DP_MFN_OFFSET          0x0
-#define MXC_PLL_DP_MFN_MASK            0x07FFFFFF
-
-#define MXC_PLL_DP_MFN_TOGC_TOG_DIS    (1 << 17)
-#define MXC_PLL_DP_MFN_TOGC_TOG_EN     (1 << 16)
-#define MXC_PLL_DP_MFN_TOGC_CNT_OFFSET 0x0
-#define MXC_PLL_DP_MFN_TOGC_CNT_MASK   0xFFFF
-
-#define MXC_PLL_DP_DESTAT_TOG_SEL      (1 << 31)
-#define MXC_PLL_DP_DESTAT_MFN          0x07FFFFFF
-
-/* Register addresses of CCM*/
-#define MXC_CCM_CCR            (MX51_CCM_BASE + 0x00)
-#define MXC_CCM_CCDR           (MX51_CCM_BASE + 0x04)
-#define MXC_CCM_CSR            (MX51_CCM_BASE + 0x08)
-#define MXC_CCM_CCSR           (MX51_CCM_BASE + 0x0C)
-#define MXC_CCM_CACRR          (MX51_CCM_BASE + 0x10)
-#define MXC_CCM_CBCDR          (MX51_CCM_BASE + 0x14)
-#define MXC_CCM_CBCMR          (MX51_CCM_BASE + 0x18)
-#define MXC_CCM_CSCMR1         (MX51_CCM_BASE + 0x1C)
-#define MXC_CCM_CSCMR2         (MX51_CCM_BASE + 0x20)
-#define MXC_CCM_CSCDR1         (MX51_CCM_BASE + 0x24)
-#define MXC_CCM_CS1CDR         (MX51_CCM_BASE + 0x28)
-#define MXC_CCM_CS2CDR         (MX51_CCM_BASE + 0x2C)
-#define MXC_CCM_CDCDR          (MX51_CCM_BASE + 0x30)
-#define MXC_CCM_CHSCDR         (MX51_CCM_BASE + 0x34)
-#define MXC_CCM_CSCDR2         (MX51_CCM_BASE + 0x38)
-#define MXC_CCM_CSCDR3         (MX51_CCM_BASE + 0x3C)
-#define MXC_CCM_CSCDR4         (MX51_CCM_BASE + 0x40)
-#define MXC_CCM_CWDR           (MX51_CCM_BASE + 0x44)
-#define MXC_CCM_CDHIPR         (MX51_CCM_BASE + 0x48)
-#define MXC_CCM_CDCR           (MX51_CCM_BASE + 0x4C)
-#define MXC_CCM_CTOR           (MX51_CCM_BASE + 0x50)
-#define MXC_CCM_CLPCR          (MX51_CCM_BASE + 0x54)
-#define MXC_CCM_CISR           (MX51_CCM_BASE + 0x58)
-#define MXC_CCM_CIMR           (MX51_CCM_BASE + 0x5C)
-#define MXC_CCM_CCOSR          (MX51_CCM_BASE + 0x60)
-#define MXC_CCM_CGPR           (MX51_CCM_BASE + 0x64)
-#define MXC_CCM_CCGR0          (MX51_CCM_BASE + 0x68)
-#define MXC_CCM_CCGR1          (MX51_CCM_BASE + 0x6C)
-#define MXC_CCM_CCGR2          (MX51_CCM_BASE + 0x70)
-#define MXC_CCM_CCGR3          (MX51_CCM_BASE + 0x74)
-#define MXC_CCM_CCGR4          (MX51_CCM_BASE + 0x78)
-#define MXC_CCM_CCGR5          (MX51_CCM_BASE + 0x7C)
-#define MXC_CCM_CCGR6          (MX51_CCM_BASE + 0x80)
-#define MXC_CCM_CCGR7          (MX51_CCM_BASE + 0x84)
-
-#define MXC_CCM_CMEOR          (MX51_CCM_BASE + 0x84)
-
-/* Define the bits in register CCR */
-#define MXC_CCM_CCR_COSC_EN            (1 << 12)
-#define MXC_CCM_CCR_FPM_MULT_MASK      (1 << 11)
-#define MXC_CCM_CCR_CAMP2_EN           (1 << 10)
-#define MXC_CCM_CCR_CAMP1_EN           (1 << 9)
-#define MXC_CCM_CCR_FPM_EN             (1 << 8)
-#define MXC_CCM_CCR_OSCNT_OFFSET       (0)
-#define MXC_CCM_CCR_OSCNT_MASK (0xFF)
-
-/* Define the bits in register CCDR */
-#define MXC_CCM_CCDR_HSC_HS_MASK       (0x1 << 18)
-#define MXC_CCM_CCDR_IPU_HS_MASK       (0x1 << 17)
-#define MXC_CCM_CCDR_EMI_HS_MASK       (0x1 << 16)
-
-/* Define the bits in register CSR */
-#define MXC_CCM_CSR_COSR_READY (1 << 5)
-#define MXC_CCM_CSR_LVS_VALUE  (1 << 4)
-#define MXC_CCM_CSR_CAMP2_READY        (1 << 3)
-#define MXC_CCM_CSR_CAMP1_READY        (1 << 2)
-#define MXC_CCM_CSR_FPM_READY  (1 << 1)
-#define MXC_CCM_CSR_REF_EN_B   (1 << 0)
-
-/* Define the bits in register CCSR */
-#define MXC_CCM_CCSR_LP_APM_SEL                (0x1 << 9)
-#define MXC_CCM_CCSR_STEP_SEL_OFFSET   (7)
-#define MXC_CCM_CCSR_STEP_SEL_MASK     (0x3 << 7)
-#define MXC_CCM_CCSR_STEP_SEL_LP_APM      0
-#define MXC_CCM_CCSR_STEP_SEL_PLL1_BYPASS  1 /* Only when JTAG connected? */
-#define MXC_CCM_CCSR_STEP_SEL_PLL2_DIVIDED 2
-#define MXC_CCM_CCSR_STEP_SEL_PLL3_DIVIDED 3
-#define MXC_CCM_CCSR_PLL2_PODF_OFFSET  (5)
-#define MXC_CCM_CCSR_PLL2_PODF_MASK    (0x3 << 5)
-#define MXC_CCM_CCSR_PLL3_PODF_OFFSET  (3)
-#define MXC_CCM_CCSR_PLL3_PODF_MASK    (0x3 << 3)
-#define MXC_CCM_CCSR_PLL1_SW_CLK_SEL   (1 << 2) /* 0: pll1_main_clk,
-                                                   1: step_clk */
-#define MXC_CCM_CCSR_PLL2_SW_CLK_SEL   (1 << 1)
-#define MXC_CCM_CCSR_PLL3_SW_CLK_SEL   (1 << 0)
-
-/* Define the bits in register CACRR */
-#define MXC_CCM_CACRR_ARM_PODF_OFFSET  (0)
-#define MXC_CCM_CACRR_ARM_PODF_MASK    (0x7)
-
-/* Define the bits in register CBCDR */
-#define MXC_CCM_CBCDR_EMI_CLK_SEL              (0x1 << 26)
-#define MXC_CCM_CBCDR_PERIPH_CLK_SEL           (0x1 << 25)
-#define MXC_CCM_CBCDR_DDR_HF_SEL_OFFSET                (30)
-#define MXC_CCM_CBCDR_DDR_HF_SEL               (0x1 << 30)
-#define MXC_CCM_CBCDR_DDR_PODF_OFFSET          (27)
-#define MXC_CCM_CBCDR_DDR_PODF_MASK            (0x7 << 27)
-#define MXC_CCM_CBCDR_EMI_PODF_OFFSET          (22)
-#define MXC_CCM_CBCDR_EMI_PODF_MASK            (0x7 << 22)
-#define MXC_CCM_CBCDR_AXI_B_PODF_OFFSET                (19)
-#define MXC_CCM_CBCDR_AXI_B_PODF_MASK          (0x7 << 19)
-#define MXC_CCM_CBCDR_AXI_A_PODF_OFFSET                (16)
-#define MXC_CCM_CBCDR_AXI_A_PODF_MASK          (0x7 << 16)
-#define MXC_CCM_CBCDR_NFC_PODF_OFFSET          (13)
-#define MXC_CCM_CBCDR_NFC_PODF_MASK            (0x7 << 13)
-#define MXC_CCM_CBCDR_AHB_PODF_OFFSET          (10)
-#define MXC_CCM_CBCDR_AHB_PODF_MASK            (0x7 << 10)
-#define MXC_CCM_CBCDR_IPG_PODF_OFFSET          (8)
-#define MXC_CCM_CBCDR_IPG_PODF_MASK            (0x3 << 8)
-#define MXC_CCM_CBCDR_PERCLK_PRED1_OFFSET      (6)
-#define MXC_CCM_CBCDR_PERCLK_PRED1_MASK                (0x3 << 6)
-#define MXC_CCM_CBCDR_PERCLK_PRED2_OFFSET      (3)
-#define MXC_CCM_CBCDR_PERCLK_PRED2_MASK                (0x7 << 3)
-#define MXC_CCM_CBCDR_PERCLK_PODF_OFFSET       (0)
-#define MXC_CCM_CBCDR_PERCLK_PODF_MASK         (0x7)
-
-/* Define the bits in register CBCMR */
-#define MXC_CCM_CBCMR_VPU_AXI_CLK_SEL_OFFSET   (14)
-#define MXC_CCM_CBCMR_VPU_AXI_CLK_SEL_MASK     (0x3 << 14)
-#define MXC_CCM_CBCMR_PERIPH_CLK_SEL_OFFSET    (12)
-#define MXC_CCM_CBCMR_PERIPH_CLK_SEL_MASK      (0x3 << 12)
-#define MXC_CCM_CBCMR_DDR_CLK_SEL_OFFSET       (10)
-#define MXC_CCM_CBCMR_DDR_CLK_SEL_MASK         (0x3 << 10)
-#define MXC_CCM_CBCMR_ARM_AXI_CLK_SEL_OFFSET   (8)
-#define MXC_CCM_CBCMR_ARM_AXI_CLK_SEL_MASK     (0x3 << 8)
-#define MXC_CCM_CBCMR_IPU_HSP_CLK_SEL_OFFSET   (6)
-#define MXC_CCM_CBCMR_IPU_HSP_CLK_SEL_MASK     (0x3 << 6)
-#define MXC_CCM_CBCMR_GPU_CLK_SEL_OFFSET       (4)
-#define MXC_CCM_CBCMR_GPU_CLK_SEL_MASK         (0x3 << 4)
-#define MXC_CCM_CBCMR_GPU2D_CLK_SEL_OFFSET     (14)
-#define MXC_CCM_CBCMR_GPU2D_CLK_SEL_MASK       (0x3 << 14)
-#define MXC_CCM_CBCMR_PERCLK_LP_APM_CLK_SEL    (0x1 << 1)
-#define MXC_CCM_CBCMR_PERCLK_IPG_CLK_SEL       (0x1 << 0)
-
-/* Define the bits in register CSCMR1 */
-#define MXC_CCM_CSCMR1_SSI_EXT2_CLK_SEL_OFFSET         (30)
-#define MXC_CCM_CSCMR1_SSI_EXT2_CLK_SEL_MASK           (0x3 << 30)
-#define MXC_CCM_CSCMR1_SSI_EXT1_CLK_SEL_OFFSET         (28)
-#define MXC_CCM_CSCMR1_SSI_EXT1_CLK_SEL_MASK           (0x3 << 28)
-#define MXC_CCM_CSCMR1_USB_PHY_CLK_SEL_OFFSET          (26)
-#define MXC_CCM_CSCMR1_USB_PHY_CLK_SEL                 (0x1 << 26)
-#define MXC_CCM_CSCMR1_UART_CLK_SEL_OFFSET             (24)
-#define MXC_CCM_CSCMR1_UART_CLK_SEL_MASK               (0x3 << 24)
-#define MXC_CCM_CSCMR1_USBOH3_CLK_SEL_OFFSET           (22)
-#define MXC_CCM_CSCMR1_USBOH3_CLK_SEL_MASK             (0x3 << 22)
-#define MXC_CCM_CSCMR1_ESDHC1_MSHC1_CLK_SEL_OFFSET     (20)
-#define MXC_CCM_CSCMR1_ESDHC1_MSHC1_CLK_SEL_MASK       (0x3 << 20)
-#define MXC_CCM_CSCMR1_ESDHC3_CLK_SEL                  (0x1 << 19)
-#define MXC_CCM_CSCMR1_ESDHC2_MSHC2_MX53_CLK_SEL       (0x1 << 19)
-#define MXC_CCM_CSCMR1_ESDHC4_CLK_SEL                  (0x1 << 18)
-#define MXC_CCM_CSCMR1_ESDHC2_MSHC2_CLK_SEL_OFFSET     (16)
-#define MXC_CCM_CSCMR1_ESDHC2_MSHC2_CLK_SEL_MASK       (0x3 << 16)
-#define MXC_CCM_CSCMR1_ESDHC3_MX53_CLK_SEL_OFFSET      (16)
-#define MXC_CCM_CSCMR1_ESDHC3_MX53_CLK_SEL_MASK                (0x3 << 16)
-#define MXC_CCM_CSCMR1_SSI1_CLK_SEL_OFFSET             (14)
-#define MXC_CCM_CSCMR1_SSI1_CLK_SEL_MASK               (0x3 << 14)
-#define MXC_CCM_CSCMR1_SSI2_CLK_SEL_OFFSET             (12)
-#define MXC_CCM_CSCMR1_SSI2_CLK_SEL_MASK               (0x3 << 12)
-#define MXC_CCM_CSCMR1_SSI3_CLK_SEL                    (0x1 << 11)
-#define MXC_CCM_CSCMR1_VPU_RCLK_SEL                    (0x1 << 10)
-#define MXC_CCM_CSCMR1_SSI_APM_CLK_SEL_OFFSET          (8)
-#define MXC_CCM_CSCMR1_SSI_APM_CLK_SEL_MASK            (0x3 << 8)
-#define MXC_CCM_CSCMR1_TVE_CLK_SEL                     (0x1 << 7)
-#define MXC_CCM_CSCMR1_TVE_EXT_CLK_SEL                 (0x1 << 6)
-#define MXC_CCM_CSCMR1_CSPI_CLK_SEL_OFFSET             (4)
-#define MXC_CCM_CSCMR1_CSPI_CLK_SEL_MASK               (0x3 << 4)
-#define MXC_CCM_CSCMR1_SPDIF_CLK_SEL_OFFSET            (2)
-#define MXC_CCM_CSCMR1_SPDIF_CLK_SEL_MASK              (0x3 << 2)
-#define MXC_CCM_CSCMR1_SSI_EXT2_COM_CLK_SEL            (0x1 << 1)
-#define MXC_CCM_CSCMR1_SSI_EXT1_COM_CLK_SEL            (0x1)
-
-/* Define the bits in register CSCMR2 */
-#define MXC_CCM_CSCMR2_DI_CLK_SEL_OFFSET(n)            (26+n*3)
-#define MXC_CCM_CSCMR2_DI_CLK_SEL_MASK(n)              (0x7 << (26+n*3))
-#define MXC_CCM_CSCMR2_CSI_MCLK2_CLK_SEL_OFFSET                (24)
-#define MXC_CCM_CSCMR2_CSI_MCLK2_CLK_SEL_MASK          (0x3 << 24)
-#define MXC_CCM_CSCMR2_CSI_MCLK1_CLK_SEL_OFFSET                (22)
-#define MXC_CCM_CSCMR2_CSI_MCLK1_CLK_SEL_MASK          (0x3 << 22)
-#define MXC_CCM_CSCMR2_ESC_CLK_SEL_OFFSET              (20)
-#define MXC_CCM_CSCMR2_ESC_CLK_SEL_MASK                        (0x3 << 20)
-#define MXC_CCM_CSCMR2_HSC2_CLK_SEL_OFFSET             (18)
-#define MXC_CCM_CSCMR2_HSC2_CLK_SEL_MASK               (0x3 << 18)
-#define MXC_CCM_CSCMR2_HSC1_CLK_SEL_OFFSET             (16)
-#define MXC_CCM_CSCMR2_HSC1_CLK_SEL_MASK               (0x3 << 16)
-#define MXC_CCM_CSCMR2_HSI2C_CLK_SEL_OFFSET            (14)
-#define MXC_CCM_CSCMR2_HSI2C_CLK_SEL_MASK              (0x3 << 14)
-#define MXC_CCM_CSCMR2_FIRI_CLK_SEL_OFFSET             (12)
-#define MXC_CCM_CSCMR2_FIRI_CLK_SEL_MASK               (0x3 << 12)
-#define MXC_CCM_CSCMR2_SIM_CLK_SEL_OFFSET              (10)
-#define MXC_CCM_CSCMR2_SIM_CLK_SEL_MASK                        (0x3 << 10)
-#define MXC_CCM_CSCMR2_SLIMBUS_COM                     (0x1 << 9)
-#define MXC_CCM_CSCMR2_SLIMBUS_CLK_SEL_OFFSET          (6)
-#define MXC_CCM_CSCMR2_SLIMBUS_CLK_SEL_MASK            (0x7 << 6)
-#define MXC_CCM_CSCMR2_SPDIF1_COM                      (1 << 5)
-#define MXC_CCM_CSCMR2_SPDIF0_COM                      (1 << 4)
-#define MXC_CCM_CSCMR2_SPDIF1_CLK_SEL_OFFSET           (2)
-#define MXC_CCM_CSCMR2_SPDIF1_CLK_SEL_MASK             (0x3 << 2)
-#define MXC_CCM_CSCMR2_SPDIF0_CLK_SEL_OFFSET           (0)
-#define MXC_CCM_CSCMR2_SPDIF0_CLK_SEL_MASK             (0x3)
-
-/* Define the bits in register CSCDR1 */
-#define MXC_CCM_CSCDR1_ESDHC2_MSHC2_CLK_PRED_OFFSET    (22)
-#define MXC_CCM_CSCDR1_ESDHC2_MSHC2_CLK_PRED_MASK      (0x7 << 22)
-#define MXC_CCM_CSCDR1_ESDHC2_MSHC2_CLK_PODF_OFFSET    (19)
-#define MXC_CCM_CSCDR1_ESDHC2_MSHC2_CLK_PODF_MASK      (0x7 << 19)
-#define MXC_CCM_CSCDR1_ESDHC3_MX53_CLK_PRED_OFFSET     (22)
-#define MXC_CCM_CSCDR1_ESDHC3_MX53_CLK_PRED_MASK       (0x7 << 22)
-#define MXC_CCM_CSCDR1_ESDHC3_MX53_CLK_PODF_OFFSET     (19)
-#define MXC_CCM_CSCDR1_ESDHC3_MX53_CLK_PODF_MASK       (0x7 << 19)
-#define MXC_CCM_CSCDR1_ESDHC1_MSHC1_CLK_PRED_OFFSET    (16)
-#define MXC_CCM_CSCDR1_ESDHC1_MSHC1_CLK_PRED_MASK      (0x7 << 16)
-#define MXC_CCM_CSCDR1_PGC_CLK_PODF_OFFSET             (14)
-#define MXC_CCM_CSCDR1_PGC_CLK_PODF_MASK               (0x3 << 14)
-#define MXC_CCM_CSCDR1_ESDHC1_MSHC1_CLK_PODF_OFFSET    (11)
-#define MXC_CCM_CSCDR1_ESDHC1_MSHC1_CLK_PODF_MASK      (0x7 << 11)
-#define MXC_CCM_CSCDR1_USBOH3_CLK_PRED_OFFSET          (8)
-#define MXC_CCM_CSCDR1_USBOH3_CLK_PRED_MASK            (0x7 << 8)
-#define MXC_CCM_CSCDR1_USBOH3_CLK_PODF_OFFSET          (6)
-#define MXC_CCM_CSCDR1_USBOH3_CLK_PODF_MASK            (0x3 << 6)
-#define MXC_CCM_CSCDR1_UART_CLK_PRED_OFFSET            (3)
-#define MXC_CCM_CSCDR1_UART_CLK_PRED_MASK              (0x7 << 3)
-#define MXC_CCM_CSCDR1_UART_CLK_PODF_OFFSET            (0)
-#define MXC_CCM_CSCDR1_UART_CLK_PODF_MASK              (0x7)
-
-/* Define the bits in register CS1CDR and CS2CDR */
-#define MXC_CCM_CS1CDR_SSI_EXT1_CLK_PRED_OFFSET                (22)
-#define MXC_CCM_CS1CDR_SSI_EXT1_CLK_PRED_MASK          (0x7 << 22)
-#define MXC_CCM_CS1CDR_SSI_EXT1_CLK_PODF_OFFSET                (16)
-#define MXC_CCM_CS1CDR_SSI_EXT1_CLK_PODF_MASK          (0x3F << 16)
-#define MXC_CCM_CS1CDR_SSI1_CLK_PRED_OFFSET            (6)
-#define MXC_CCM_CS1CDR_SSI1_CLK_PRED_MASK              (0x7 << 6)
-#define MXC_CCM_CS1CDR_SSI1_CLK_PODF_OFFSET            (0)
-#define MXC_CCM_CS1CDR_SSI1_CLK_PODF_MASK              (0x3F)
-
-#define MXC_CCM_CS2CDR_SSI_EXT2_CLK_PRED_OFFSET                (22)
-#define MXC_CCM_CS2CDR_SSI_EXT2_CLK_PRED_MASK          (0x7 << 22)
-#define MXC_CCM_CS2CDR_SSI_EXT2_CLK_PODF_OFFSET                (16)
-#define MXC_CCM_CS2CDR_SSI_EXT2_CLK_PODF_MASK          (0x3F << 16)
-#define MXC_CCM_CS2CDR_SSI2_CLK_PRED_OFFSET            (6)
-#define MXC_CCM_CS2CDR_SSI2_CLK_PRED_MASK              (0x7 << 6)
-#define MXC_CCM_CS2CDR_SSI2_CLK_PODF_OFFSET            (0)
-#define MXC_CCM_CS2CDR_SSI2_CLK_PODF_MASK              (0x3F)
-
-/* Define the bits in register CDCDR */
-#define MXC_CCM_CDCDR_TVE_CLK_PRED_OFFSET              (28)
-#define MXC_CCM_CDCDR_TVE_CLK_PRED_MASK                        (0x7 << 28)
-#define MXC_CCM_CDCDR_SPDIF0_CLK_PRED_OFFSET           (25)
-#define MXC_CCM_CDCDR_SPDIF0_CLK_PRED_MASK             (0x7 << 25)
-#define MXC_CCM_CDCDR_SPDIF0_CLK_PODF_OFFSET           (19)
-#define MXC_CCM_CDCDR_SPDIF0_CLK_PODF_MASK             (0x3F << 19)
-#define MXC_CCM_CDCDR_SPDIF1_CLK_PRED_OFFSET           (16)
-#define MXC_CCM_CDCDR_SPDIF1_CLK_PRED_MASK             (0x7 << 16)
-#define MXC_CCM_CDCDR_SPDIF1_CLK_PODF_OFFSET           (9)
-#define MXC_CCM_CDCDR_SPDIF1_CLK_PODF_MASK             (0x3F << 9)
-#define MXC_CCM_CDCDR_DI_CLK_PRED_OFFSET               (6)
-#define MXC_CCM_CDCDR_DI_CLK_PRED_MASK                 (0x7 << 6)
-#define MXC_CCM_CDCDR_USB_PHY_PRED_OFFSET              (3)
-#define MXC_CCM_CDCDR_USB_PHY_PRED_MASK                        (0x7 << 3)
-#define MXC_CCM_CDCDR_USB_PHY_PODF_OFFSET              (0)
-#define MXC_CCM_CDCDR_USB_PHY_PODF_MASK                        (0x7)
-
-/* Define the bits in register CHSCCDR */
-#define MXC_CCM_CHSCCDR_ESC_CLK_PRED_OFFSET            (12)
-#define MXC_CCM_CHSCCDR_ESC_CLK_PRED_MASK              (0x7 << 12)
-#define MXC_CCM_CHSCCDR_ESC_CLK_PODF_OFFSET            (6)
-#define MXC_CCM_CHSCCDR_ESC_CLK_PODF_MASK              (0x3F << 6)
-#define MXC_CCM_CHSCCDR_HSC2_CLK_PODF_OFFSET           (3)
-#define MXC_CCM_CHSCCDR_HSC2_CLK_PODF_MASK             (0x7 << 3)
-#define MXC_CCM_CHSCCDR_HSC1_CLK_PODF_OFFSET           (0)
-#define MXC_CCM_CHSCCDR_HSC1_CLK_PODF_MASK             (0x7)
-
-/* Define the bits in register CSCDR2 */
-#define MXC_CCM_CSCDR2_CSPI_CLK_PRED_OFFSET            (25)
-#define MXC_CCM_CSCDR2_CSPI_CLK_PRED_MASK              (0x7 << 25)
-#define MXC_CCM_CSCDR2_CSPI_CLK_PODF_OFFSET            (19)
-#define MXC_CCM_CSCDR2_CSPI_CLK_PODF_MASK              (0x3F << 19)
-#define MXC_CCM_CSCDR2_SIM_CLK_PRED_OFFSET             (16)
-#define MXC_CCM_CSCDR2_SIM_CLK_PRED_MASK               (0x7 << 16)
-#define MXC_CCM_CSCDR2_SIM_CLK_PODF_OFFSET             (9)
-#define MXC_CCM_CSCDR2_SIM_CLK_PODF_MASK               (0x3F << 9)
-#define MXC_CCM_CSCDR2_SLIMBUS_CLK_PRED_OFFSET         (6)
-#define MXC_CCM_CSCDR2_SLIMBUS_PRED_MASK               (0x7 << 6)
-#define MXC_CCM_CSCDR2_SLIMBUS_PODF_OFFSET             (0)
-#define MXC_CCM_CSCDR2_SLIMBUS_PODF_MASK               (0x3F)
-
-/* Define the bits in register CSCDR3 */
-#define MXC_CCM_CSCDR3_HSI2C_CLK_PRED_OFFSET           (16)
-#define MXC_CCM_CSCDR3_HSI2C_CLK_PRED_MASK             (0x7 << 16)
-#define MXC_CCM_CSCDR3_HSI2C_CLK_PODF_OFFSET           (9)
-#define MXC_CCM_CSCDR3_HSI2C_CLK_PODF_MASK             (0x3F << 9)
-#define MXC_CCM_CSCDR3_FIRI_CLK_PRED_OFFSET            (6)
-#define MXC_CCM_CSCDR3_FIRI_CLK_PRED_MASK              (0x7 << 6)
-#define MXC_CCM_CSCDR3_FIRI_CLK_PODF_OFFSET            (0)
-#define MXC_CCM_CSCDR3_FIRI_CLK_PODF_MASK              (0x3F)
-
-/* Define the bits in register CSCDR4 */
-#define MXC_CCM_CSCDR4_CSI_MCLK2_CLK_PRED_OFFSET       (16)
-#define MXC_CCM_CSCDR4_CSI_MCLK2_CLK_PRED_MASK         (0x7 << 16)
-#define MXC_CCM_CSCDR4_CSI_MCLK2_CLK_PODF_OFFSET       (9)
-#define MXC_CCM_CSCDR4_CSI_MCLK2_CLK_PODF_MASK         (0x3F << 9)
-#define MXC_CCM_CSCDR4_CSI_MCLK1_CLK_PRED_OFFSET       (6)
-#define MXC_CCM_CSCDR4_CSI_MCLK1_CLK_PRED_MASK         (0x7 << 6)
-#define MXC_CCM_CSCDR4_CSI_MCLK1_CLK_PODF_OFFSET       (0)
-#define MXC_CCM_CSCDR4_CSI_MCLK1_CLK_PODF_MASK         (0x3F)
-
-/* Define the bits in register CDHIPR */
-#define MXC_CCM_CDHIPR_ARM_PODF_BUSY                   (1 << 16)
-#define MXC_CCM_CDHIPR_DDR_HF_CLK_SEL_BUSY             (1 << 8)
-#define MXC_CCM_CDHIPR_DDR_PODF_BUSY                   (1 << 7)
-#define MXC_CCM_CDHIPR_EMI_CLK_SEL_BUSY                        (1 << 6)
-#define MXC_CCM_CDHIPR_PERIPH_CLK_SEL_BUSY             (1 << 5)
-#define MXC_CCM_CDHIPR_NFC_IPG_INT_MEM_PODF_BUSY       (1 << 4)
-#define MXC_CCM_CDHIPR_AHB_PODF_BUSY                   (1 << 3)
-#define MXC_CCM_CDHIPR_EMI_PODF_BUSY                   (1 << 2)
-#define MXC_CCM_CDHIPR_AXI_B_PODF_BUSY                 (1 << 1)
-#define MXC_CCM_CDHIPR_AXI_A_PODF_BUSY                 (1 << 0)
-
-/* Define the bits in register CDCR */
-#define MXC_CCM_CDCR_ARM_FREQ_SHIFT_DIVIDER            (0x1 << 2)
-#define MXC_CCM_CDCR_PERIPH_CLK_DVFS_PODF_OFFSET       (0)
-#define MXC_CCM_CDCR_PERIPH_CLK_DVFS_PODF_MASK         (0x3)
-
-/* Define the bits in register CLPCR */
-#define MXC_CCM_CLPCR_BYPASS_HSC_LPM_HS                (0x1 << 23)
-#define MXC_CCM_CLPCR_BYPASS_SCC_LPM_HS                (0x1 << 22)
-#define MX51_CCM_CLPCR_BYPASS_MAX_LPM_HS               (0x1 << 21)
-#define MX53_CCM_CLPCR_BYPASS_MAX_LPM_HS               (0x1 << 25)
-#define MXC_CCM_CLPCR_BYPASS_SDMA_LPM_HS       (0x1 << 20)
-#define MXC_CCM_CLPCR_BYPASS_EMI_LPM_HS                (0x1 << 19)
-#define MXC_CCM_CLPCR_BYPASS_IPU_LPM_HS                (0x1 << 18)
-#define MXC_CCM_CLPCR_BYPASS_RTIC_LPM_HS       (0x1 << 17)
-#define MXC_CCM_CLPCR_BYPASS_RNGC_LPM_HS       (0x1 << 16)
-#define MXC_CCM_CLPCR_COSC_PWRDOWN             (0x1 << 11)
-#define MXC_CCM_CLPCR_STBY_COUNT_OFFSET                (9)
-#define MXC_CCM_CLPCR_STBY_COUNT_MASK          (0x3 << 9)
-#define MXC_CCM_CLPCR_VSTBY                    (0x1 << 8)
-#define MXC_CCM_CLPCR_DIS_REF_OSC              (0x1 << 7)
-#define MXC_CCM_CLPCR_SBYOS                    (0x1 << 6)
-#define MXC_CCM_CLPCR_ARM_CLK_DIS_ON_LPM       (0x1 << 5)
-#define MXC_CCM_CLPCR_LPSR_CLK_SEL_OFFSET      (3)
-#define MXC_CCM_CLPCR_LPSR_CLK_SEL_MASK                (0x3 << 3)
-#define MXC_CCM_CLPCR_LPM_OFFSET               (0)
-#define MXC_CCM_CLPCR_LPM_MASK                 (0x3)
-
-/* Define the bits in register CISR */
-#define MXC_CCM_CISR_ARM_PODF_LOADED                   (0x1 << 25)
-#define MXC_CCM_CISR_NFC_IPG_INT_MEM_PODF_LOADED       (0x1 << 21)
-#define MXC_CCM_CISR_AHB_PODF_LOADED                   (0x1 << 20)
-#define MXC_CCM_CISR_EMI_PODF_LOADED                   (0x1 << 19)
-#define MXC_CCM_CISR_AXI_B_PODF_LOADED                 (0x1 << 18)
-#define MXC_CCM_CISR_AXI_A_PODF_LOADED                 (0x1 << 17)
-#define MXC_CCM_CISR_DIVIDER_LOADED                    (0x1 << 16)
-#define MXC_CCM_CISR_COSC_READY                                (0x1 << 6)
-#define MXC_CCM_CISR_CKIH2_READY                       (0x1 << 5)
-#define MXC_CCM_CISR_CKIH_READY                                (0x1 << 4)
-#define MXC_CCM_CISR_FPM_READY                         (0x1 << 3)
-#define MXC_CCM_CISR_LRF_PLL3                          (0x1 << 2)
-#define MXC_CCM_CISR_LRF_PLL2                          (0x1 << 1)
-#define MXC_CCM_CISR_LRF_PLL1                          (0x1)
-
-/* Define the bits in register CIMR */
-#define MXC_CCM_CIMR_MASK_ARM_PODF_LOADED              (0x1 << 25)
-#define MXC_CCM_CIMR_MASK_NFC_IPG_INT_MEM_PODF_LOADED  (0x1 << 21)
-#define MXC_CCM_CIMR_MASK_EMI_PODF_LOADED              (0x1 << 20)
-#define MXC_CCM_CIMR_MASK_AXI_C_PODF_LOADED            (0x1 << 19)
-#define MXC_CCM_CIMR_MASK_AXI_B_PODF_LOADED            (0x1 << 18)
-#define MXC_CCM_CIMR_MASK_AXI_A_PODF_LOADED            (0x1 << 17)
-#define MXC_CCM_CIMR_MASK_DIVIDER_LOADED               (0x1 << 16)
-#define MXC_CCM_CIMR_MASK_COSC_READY                   (0x1 << 5)
-#define MXC_CCM_CIMR_MASK_CKIH_READY                   (0x1 << 4)
-#define MXC_CCM_CIMR_MASK_FPM_READY                    (0x1 << 3)
-#define MXC_CCM_CIMR_MASK_LRF_PLL3                     (0x1 << 2)
-#define MXC_CCM_CIMR_MASK_LRF_PLL2                     (0x1 << 1)
-#define MXC_CCM_CIMR_MASK_LRF_PLL1                     (0x1)
-
-/* Define the bits in register CCOSR */
-#define MXC_CCM_CCOSR_CKO2_EN_OFFSET                   (0x1 << 24)
-#define MXC_CCM_CCOSR_CKO2_DIV_OFFSET                  (21)
-#define MXC_CCM_CCOSR_CKO2_DIV_MASK                    (0x7 << 21)
-#define MXC_CCM_CCOSR_CKO2_SEL_OFFSET                  (16)
-#define MXC_CCM_CCOSR_CKO2_SEL_MASK                    (0x1F << 16)
-#define MXC_CCM_CCOSR_CKOL_EN                          (0x1 << 7)
-#define MXC_CCM_CCOSR_CKOL_DIV_OFFSET                  (4)
-#define MXC_CCM_CCOSR_CKOL_DIV_MASK                    (0x7 << 4)
-#define MXC_CCM_CCOSR_CKOL_SEL_OFFSET                  (0)
-#define MXC_CCM_CCOSR_CKOL_SEL_MASK                    (0xF)
-
-/* Define the bits in registers CGPR */
-#define MXC_CCM_CGPR_EFUSE_PROG_SUPPLY_GATE            (0x1 << 4)
-#define MXC_CCM_CGPR_FPM_SEL                           (0x1 << 3)
-#define MXC_CCM_CGPR_VL_L2BIST_CLKDIV_OFFSET           (0)
-#define MXC_CCM_CGPR_VL_L2BIST_CLKDIV_MASK             (0x7)
-
-/* Define the bits in registers CCGRx */
-#define MXC_CCM_CCGRx_CG_MASK                          0x3
-#define MXC_CCM_CCGRx_MOD_OFF                          0x0
-#define MXC_CCM_CCGRx_MOD_ON                           0x3
-#define MXC_CCM_CCGRx_MOD_IDLE                         0x1
-
-#define MXC_CCM_CCGRx_CG15_MASK                                (0x3 << 30)
-#define MXC_CCM_CCGRx_CG14_MASK                                (0x3 << 28)
-#define MXC_CCM_CCGRx_CG13_MASK                                (0x3 << 26)
-#define MXC_CCM_CCGRx_CG12_MASK                                (0x3 << 24)
-#define MXC_CCM_CCGRx_CG11_MASK                                (0x3 << 22)
-#define MXC_CCM_CCGRx_CG10_MASK                                (0x3 << 20)
-#define MXC_CCM_CCGRx_CG9_MASK                         (0x3 << 18)
-#define MXC_CCM_CCGRx_CG8_MASK                         (0x3 << 16)
-#define MXC_CCM_CCGRx_CG5_MASK                         (0x3 << 10)
-#define MXC_CCM_CCGRx_CG4_MASK                         (0x3 << 8)
-#define MXC_CCM_CCGRx_CG3_MASK                         (0x3 << 6)
-#define MXC_CCM_CCGRx_CG2_MASK                         (0x3 << 4)
-#define MXC_CCM_CCGRx_CG1_MASK                         (0x3 << 2)
-#define MXC_CCM_CCGRx_CG0_MASK                         (0x3 << 0)
-
-#define MXC_CCM_CCGRx_CG15_OFFSET                      30
-#define MXC_CCM_CCGRx_CG14_OFFSET                      28
-#define MXC_CCM_CCGRx_CG13_OFFSET                      26
-#define MXC_CCM_CCGRx_CG12_OFFSET                      24
-#define MXC_CCM_CCGRx_CG11_OFFSET                      22
-#define MXC_CCM_CCGRx_CG10_OFFSET                      20
-#define MXC_CCM_CCGRx_CG9_OFFSET                       18
-#define MXC_CCM_CCGRx_CG8_OFFSET                       16
-#define MXC_CCM_CCGRx_CG7_OFFSET                       14
-#define MXC_CCM_CCGRx_CG6_OFFSET                       12
-#define MXC_CCM_CCGRx_CG5_OFFSET                       10
-#define MXC_CCM_CCGRx_CG4_OFFSET                       8
-#define MXC_CCM_CCGRx_CG3_OFFSET                       6
-#define MXC_CCM_CCGRx_CG2_OFFSET                       4
-#define MXC_CCM_CCGRx_CG1_OFFSET                       2
-#define MXC_CCM_CCGRx_CG0_OFFSET                       0
-
-#define MXC_DPTC_LP_BASE       (MX51_GPC_BASE + 0x80)
-#define MXC_DPTC_GP_BASE       (MX51_GPC_BASE + 0x100)
-#define MXC_DVFS_CORE_BASE     (MX51_GPC_BASE + 0x180)
-#define MXC_DPTC_PER_BASE      (MX51_GPC_BASE + 0x1C0)
-#define MXC_PGC_IPU_BASE       (MX51_GPC_BASE + 0x220)
-#define MXC_PGC_VPU_BASE       (MX51_GPC_BASE + 0x240)
-#define MXC_PGC_GPU_BASE       (MX51_GPC_BASE + 0x260)
-#define MXC_SRPG_NEON_BASE     (MX51_GPC_BASE + 0x280)
-#define MXC_SRPG_ARM_BASE      (MX51_GPC_BASE + 0x2A0)
-#define MXC_SRPG_EMPGC0_BASE   (MX51_GPC_BASE + 0x2C0)
-#define MXC_SRPG_EMPGC1_BASE   (MX51_GPC_BASE + 0x2D0)
-#define MXC_SRPG_MEGAMIX_BASE  (MX51_GPC_BASE + 0x2E0)
-#define MXC_SRPG_EMI_BASE      (MX51_GPC_BASE + 0x300)
-
-/* CORTEXA8 platform */
-#define MXC_CORTEXA8_PLAT_PVID         (MX51_CORTEXA8_BASE + 0x0)
-#define MXC_CORTEXA8_PLAT_GPC          (MX51_CORTEXA8_BASE + 0x4)
-#define MXC_CORTEXA8_PLAT_PIC          (MX51_CORTEXA8_BASE + 0x8)
-#define MXC_CORTEXA8_PLAT_LPC          (MX51_CORTEXA8_BASE + 0xC)
-#define MXC_CORTEXA8_PLAT_NEON_LPC     (MX51_CORTEXA8_BASE + 0x10)
-#define MXC_CORTEXA8_PLAT_ICGC         (MX51_CORTEXA8_BASE + 0x14)
-#define MXC_CORTEXA8_PLAT_AMC          (MX51_CORTEXA8_BASE + 0x18)
-#define MXC_CORTEXA8_PLAT_NMC          (MX51_CORTEXA8_BASE + 0x20)
-#define MXC_CORTEXA8_PLAT_NMS          (MX51_CORTEXA8_BASE + 0x24)
-
-/* DVFS CORE */
-#define MXC_DVFSTHRS           (MXC_DVFS_CORE_BASE + 0x00)
-#define MXC_DVFSCOUN           (MXC_DVFS_CORE_BASE + 0x04)
-#define MXC_DVFSSIG1           (MXC_DVFS_CORE_BASE + 0x08)
-#define MXC_DVFSSIG0           (MXC_DVFS_CORE_BASE + 0x0C)
-#define MXC_DVFSGPC0           (MXC_DVFS_CORE_BASE + 0x10)
-#define MXC_DVFSGPC1           (MXC_DVFS_CORE_BASE + 0x14)
-#define MXC_DVFSGPBT           (MXC_DVFS_CORE_BASE + 0x18)
-#define MXC_DVFSEMAC           (MXC_DVFS_CORE_BASE + 0x1C)
-#define MXC_DVFSCNTR           (MXC_DVFS_CORE_BASE + 0x20)
-#define MXC_DVFSLTR0_0         (MXC_DVFS_CORE_BASE + 0x24)
-#define MXC_DVFSLTR0_1         (MXC_DVFS_CORE_BASE + 0x28)
-#define MXC_DVFSLTR1_0         (MXC_DVFS_CORE_BASE + 0x2C)
-#define MXC_DVFSLTR1_1         (MXC_DVFS_CORE_BASE + 0x30)
-#define MXC_DVFSPT0            (MXC_DVFS_CORE_BASE + 0x34)
-#define MXC_DVFSPT1            (MXC_DVFS_CORE_BASE + 0x38)
-#define MXC_DVFSPT2            (MXC_DVFS_CORE_BASE + 0x3C)
-#define MXC_DVFSPT3            (MXC_DVFS_CORE_BASE + 0x40)
-
-/* GPC */
-#define MXC_GPC_CNTR           (MX51_GPC_BASE + 0x0)
-#define MXC_GPC_PGR            (MX51_GPC_BASE + 0x4)
-#define MXC_GPC_VCR            (MX51_GPC_BASE + 0x8)
-#define MXC_GPC_ALL_PU         (MX51_GPC_BASE + 0xC)
-#define MXC_GPC_NEON           (MX51_GPC_BASE + 0x10)
-#define MXC_GPC_PGR_ARMPG_OFFSET       8
-#define MXC_GPC_PGR_ARMPG_MASK         (3 << 8)
-
-/* PGC */
-#define MXC_PGC_IPU_PGCR       (MXC_PGC_IPU_BASE + 0x0)
-#define MXC_PGC_IPU_PGSR       (MXC_PGC_IPU_BASE + 0xC)
-#define MXC_PGC_VPU_PGCR       (MXC_PGC_VPU_BASE + 0x0)
-#define MXC_PGC_VPU_PGSR       (MXC_PGC_VPU_BASE + 0xC)
-#define MXC_PGC_GPU_PGCR       (MXC_PGC_GPU_BASE + 0x0)
-#define MXC_PGC_GPU_PGSR       (MXC_PGC_GPU_BASE + 0xC)
-
-#define MXC_PGCR_PCR           1
-#define MXC_SRPGCR_PCR         1
-#define MXC_EMPGCR_PCR         1
-#define MXC_PGSR_PSR           1
-
-
-#define MXC_CORTEXA8_PLAT_LPC_DSM      (1 << 0)
-#define MXC_CORTEXA8_PLAT_LPC_DBG_DSM  (1 << 1)
-
-/* SRPG */
-#define MXC_SRPG_NEON_SRPGCR   (MXC_SRPG_NEON_BASE + 0x0)
-#define MXC_SRPG_NEON_PUPSCR   (MXC_SRPG_NEON_BASE + 0x4)
-#define MXC_SRPG_NEON_PDNSCR   (MXC_SRPG_NEON_BASE + 0x8)
-
-#define MXC_SRPG_ARM_SRPGCR    (MXC_SRPG_ARM_BASE + 0x0)
-#define MXC_SRPG_ARM_PUPSCR    (MXC_SRPG_ARM_BASE + 0x4)
-#define MXC_SRPG_ARM_PDNSCR    (MXC_SRPG_ARM_BASE + 0x8)
-
-#define MXC_SRPG_EMPGC0_SRPGCR (MXC_SRPG_EMPGC0_BASE + 0x0)
-#define MXC_SRPG_EMPGC0_PUPSCR (MXC_SRPG_EMPGC0_BASE + 0x4)
-#define MXC_SRPG_EMPGC0_PDNSCR (MXC_SRPG_EMPGC0_BASE + 0x8)
-
-#define MXC_SRPG_EMPGC1_SRPGCR (MXC_SRPG_EMPGC1_BASE + 0x0)
-#define MXC_SRPG_EMPGC1_PUPSCR (MXC_SRPG_EMPGC1_BASE + 0x4)
-#define MXC_SRPG_EMPGC1_PDNSCR (MXC_SRPG_EMPGC1_BASE + 0x8)
-
-#define MXC_SRPG_MEGAMIX_SRPGCR                (MXC_SRPG_MEGAMIX_BASE + 0x0)
-#define MXC_SRPG_MEGAMIX_PUPSCR                (MXC_SRPG_MEGAMIX_BASE + 0x4)
-#define MXC_SRPG_MEGAMIX_PDNSCR                (MXC_SRPG_MEGAMIX_BASE + 0x8)
-
-#define MXC_SRPGC_EMI_SRPGCR   (MXC_SRPGC_EMI_BASE + 0x0)
-#define MXC_SRPGC_EMI_PUPSCR   (MXC_SRPGC_EMI_BASE + 0x4)
-#define MXC_SRPGC_EMI_PDNSCR   (MXC_SRPGC_EMI_BASE + 0x8)
-
-#endif                         /* __ARCH_ARM_MACH_MX51_CRM_REGS_H__ */
diff --git a/arch/arm/mach-imx/devices-imx51.h b/arch/arm/mach-imx/devices-imx51.h
deleted file mode 100644 (file)
index 26389f3..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2010 Pengutronix
- * Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de>
- *
- * This program is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License version 2 as published by the
- * Free Software Foundation.
- */
-#include "devices/devices-common.h"
-
-extern const struct imx_fec_data imx51_fec_data;
-#define imx51_add_fec(pdata)   \
-       imx_add_fec(&imx51_fec_data, pdata)
-
-extern const struct imx_fsl_usb2_udc_data imx51_fsl_usb2_udc_data;
-#define imx51_add_fsl_usb2_udc(pdata)  \
-       imx_add_fsl_usb2_udc(&imx51_fsl_usb2_udc_data, pdata)
-
-extern const struct imx_imx_i2c_data imx51_imx_i2c_data[];
-#define imx51_add_imx_i2c(id, pdata)   \
-       imx_add_imx_i2c(&imx51_imx_i2c_data[id], pdata)
-#define imx51_add_hsi2c(pdata) \
-       imx51_add_imx_i2c(2, pdata)
-
-extern const struct imx_imx_ssi_data imx51_imx_ssi_data[];
-#define imx51_add_imx_ssi(id, pdata)   \
-       imx_add_imx_ssi(&imx51_imx_ssi_data[id], pdata)
-
-extern const struct imx_imx_uart_1irq_data imx51_imx_uart_data[];
-#define imx51_add_imx_uart(id, pdata)  \
-       imx_add_imx_uart_1irq(&imx51_imx_uart_data[id], pdata)
-
-extern const struct imx_mxc_ehci_data imx51_mxc_ehci_otg_data;
-#define imx51_add_mxc_ehci_otg(pdata)  \
-       imx_add_mxc_ehci(&imx51_mxc_ehci_otg_data, pdata)
-extern const struct imx_mxc_ehci_data imx51_mxc_ehci_hs_data[];
-#define imx51_add_mxc_ehci_hs(id, pdata)       \
-       imx_add_mxc_ehci(&imx51_mxc_ehci_hs_data[id - 1], pdata)
-
-extern const struct imx_mxc_nand_data imx51_mxc_nand_data;
-#define imx51_add_mxc_nand(pdata)      \
-       imx_add_mxc_nand(&imx51_mxc_nand_data, pdata)
-
-extern const struct imx_sdhci_esdhc_imx_data imx51_sdhci_esdhc_imx_data[];
-#define imx51_add_sdhci_esdhc_imx(id, pdata)   \
-       imx_add_sdhci_esdhc_imx(&imx51_sdhci_esdhc_imx_data[id], pdata)
-
-extern const struct imx_spi_imx_data imx51_cspi_data;
-#define imx51_add_cspi(pdata)  \
-       imx_add_spi_imx(&imx51_cspi_data, pdata)
-
-extern const struct imx_spi_imx_data imx51_ecspi_data[];
-#define imx51_add_ecspi(id, pdata)     \
-       imx_add_spi_imx(&imx51_ecspi_data[id], pdata)
-
-extern const struct imx_imx2_wdt_data imx51_imx2_wdt_data[];
-#define imx51_add_imx2_wdt(id) \
-       imx_add_imx2_wdt(&imx51_imx2_wdt_data[id])
-
-extern const struct imx_imx_keypad_data imx51_imx_keypad_data;
-#define imx51_add_imx_keypad(pdata)    \
-       imx_add_imx_keypad(&imx51_imx_keypad_data, pdata)
-
-extern const struct imx_pata_imx_data imx51_pata_imx_data;
-#define imx51_add_pata_imx() \
-       imx_add_pata_imx(&imx51_pata_imx_data)
index 2d260a5a307c752a264d8a9a4be75d98cb31b2ea..1d2cc1805f3e51d00f4f7db8d0e3f1cad318a0f0 100644 (file)
@@ -1,6 +1,6 @@
 config IMX_HAVE_PLATFORM_FEC
        bool
-       default y if ARCH_MX25 || SOC_IMX27 || SOC_IMX35 || SOC_IMX51 || SOC_IMX53
+       default y if SOC_IMX25 || SOC_IMX27 || SOC_IMX35
 
 config IMX_HAVE_PLATFORM_FLEXCAN
        bool
@@ -10,7 +10,6 @@ config IMX_HAVE_PLATFORM_FSL_USB2_UDC
 
 config IMX_HAVE_PLATFORM_GPIO_KEYS
        bool
-       default y if SOC_IMX51
 
 config IMX_HAVE_PLATFORM_IMX21_HCD
        bool
@@ -43,15 +42,9 @@ config IMX_HAVE_PLATFORM_IMX_SSI
 config IMX_HAVE_PLATFORM_IMX_UART
        bool
 
-config IMX_HAVE_PLATFORM_IMX_UDC
-       bool
-
 config IMX_HAVE_PLATFORM_IPU_CORE
        bool
 
-config IMX_HAVE_PLATFORM_MX1_CAMERA
-       bool
-
 config IMX_HAVE_PLATFORM_MX2_CAMERA
        bool
 
index 1cbc14cd80d1614e32c571ed87adda726cf14c18..8fdb12b4ca7ee12d12b9798e66d60c3dbac998fe 100644 (file)
@@ -16,9 +16,7 @@ obj-$(CONFIG_IMX_HAVE_PLATFORM_IMX_KEYPAD) += platform-imx-keypad.o
 obj-$(CONFIG_IMX_HAVE_PLATFORM_PATA_IMX) += platform-pata_imx.o
 obj-$(CONFIG_IMX_HAVE_PLATFORM_IMX_SSI) += platform-imx-ssi.o
 obj-$(CONFIG_IMX_HAVE_PLATFORM_IMX_UART) += platform-imx-uart.o
-obj-$(CONFIG_IMX_HAVE_PLATFORM_IMX_UDC) += platform-imx_udc.o
 obj-$(CONFIG_IMX_HAVE_PLATFORM_IPU_CORE) += platform-ipu-core.o
-obj-$(CONFIG_IMX_HAVE_PLATFORM_MX1_CAMERA) += platform-mx1-camera.o
 obj-$(CONFIG_IMX_HAVE_PLATFORM_MX2_CAMERA) += platform-mx2-camera.o
 obj-$(CONFIG_IMX_HAVE_PLATFORM_MXC_EHCI) += platform-mxc-ehci.o
 obj-$(CONFIG_IMX_HAVE_PLATFORM_MXC_MMC) += platform-mxc-mmc.o
index 61352a80bb59325e062915fbaef737322a8f1aed..67f7fb13050dbdec3d84cfe381943240a2e4e192 100644 (file)
@@ -176,22 +176,6 @@ struct platform_device *__init imx_add_imx_uart_1irq(
                const struct imx_imx_uart_1irq_data *data,
                const struct imxuart_platform_data *pdata);
 
-#include <linux/platform_data/usb-imx_udc.h>
-struct imx_imx_udc_data {
-       resource_size_t iobase;
-       resource_size_t iosize;
-       resource_size_t irq0;
-       resource_size_t irq1;
-       resource_size_t irq2;
-       resource_size_t irq3;
-       resource_size_t irq4;
-       resource_size_t irq5;
-       resource_size_t irq6;
-};
-struct platform_device *__init imx_add_imx_udc(
-               const struct imx_imx_udc_data *data,
-               const struct imxusb_platform_data *pdata);
-
 #include <linux/platform_data/video-mx3fb.h>
 #include <linux/platform_data/camera-mx3.h>
 struct imx_ipu_core_data {
@@ -208,16 +192,6 @@ struct platform_device *__init imx_add_mx3_sdc_fb(
                const struct imx_ipu_core_data *data,
                struct mx3fb_platform_data *pdata);
 
-#include <linux/platform_data/camera-mx1.h>
-struct imx_mx1_camera_data {
-       resource_size_t iobase;
-       resource_size_t iosize;
-       resource_size_t irq;
-};
-struct platform_device *__init imx_add_mx1_camera(
-               const struct imx_mx1_camera_data *data,
-               const struct mx1_camera_pdata *pdata);
-
 #include <linux/platform_data/camera-mx2.h>
 struct imx_mx2_camera_data {
        const char *devid;
index 63eba08f87b1a0941b9b003f330197dc2e331330..d86f9250b4ee87292ce8758a4538cd64a8b4ac92 100644 (file)
@@ -35,18 +35,6 @@ const struct imx_fec_data imx35_fec_data __initconst =
        imx_fec_data_entry_single(MX35, "imx27-fec");
 #endif
 
-#ifdef CONFIG_SOC_IMX51
-/* i.mx51 has the i.mx27 type fec */
-const struct imx_fec_data imx51_fec_data __initconst =
-       imx_fec_data_entry_single(MX51, "imx27-fec");
-#endif
-
-#ifdef CONFIG_SOC_IMX53
-/* i.mx53 has the i.mx25 type fec */
-const struct imx_fec_data imx53_fec_data __initconst =
-       imx_fec_data_entry_single(MX53, "imx25-fec");
-#endif
-
 struct platform_device *__init imx_add_fec(
                const struct imx_fec_data *data,
                const struct fec_platform_data *pdata)
index 3c06bd96e9cc5e094a183213b1bdfd957ceda1b4..23b0061347cba81f5fd8c63add9d8d57b7585d82 100644 (file)
@@ -38,11 +38,6 @@ const struct imx_fsl_usb2_udc_data imx35_fsl_usb2_udc_data __initconst =
        imx_fsl_usb2_udc_data_entry_single(MX35, "imx-udc-mx27");
 #endif /* ifdef CONFIG_SOC_IMX35 */
 
-#ifdef CONFIG_SOC_IMX51
-const struct imx_fsl_usb2_udc_data imx51_fsl_usb2_udc_data __initconst =
-       imx_fsl_usb2_udc_data_entry_single(MX51, "imx-udc-mx51");
-#endif
-
 struct platform_device *__init imx_add_fsl_usb2_udc(
                const struct imx_fsl_usb2_udc_data *data,
                const struct fsl_usb2_platform_data *pdata)
index 57d342e85c2fa5621f334c26d667beacb286f9a6..644ac26898823ac617c5892a5c41571af254cf00 100644 (file)
@@ -70,32 +70,6 @@ const struct imx_imx_i2c_data imx35_imx_i2c_data[] __initconst = {
 };
 #endif /* ifdef CONFIG_SOC_IMX35 */
 
-#ifdef CONFIG_SOC_IMX51
-const struct imx_imx_i2c_data imx51_imx_i2c_data[] __initconst = {
-#define imx51_imx_i2c_data_entry(_id, _hwid)                           \
-       imx_imx_i2c_data_entry(MX51, "imx21-i2c", _id, _hwid, SZ_4K)
-       imx51_imx_i2c_data_entry(0, 1),
-       imx51_imx_i2c_data_entry(1, 2),
-       {
-               .devid = "imx21-i2c",
-               .id = 2,
-               .iobase = MX51_HSI2C_DMA_BASE_ADDR,
-               .iosize = SZ_16K,
-               .irq = MX51_INT_HS_I2C,
-       },
-};
-#endif /* ifdef CONFIG_SOC_IMX51 */
-
-#ifdef CONFIG_SOC_IMX53
-const struct imx_imx_i2c_data imx53_imx_i2c_data[] __initconst = {
-#define imx53_imx_i2c_data_entry(_id, _hwid)                           \
-       imx_imx_i2c_data_entry(MX53, "imx21-i2c", _id, _hwid, SZ_4K)
-       imx53_imx_i2c_data_entry(0, 1),
-       imx53_imx_i2c_data_entry(1, 2),
-       imx53_imx_i2c_data_entry(2, 3),
-};
-#endif /* ifdef CONFIG_SOC_IMX53 */
-
 struct platform_device *__init imx_add_imx_i2c(
                const struct imx_imx_i2c_data *data,
                const struct imxi2c_platform_data *pdata)
index 8f22a4c98a4ce5957c262e719afb7ab3209f70f0..f42200b7aca96044b8d10dbedb10cfe680ab5a80 100644 (file)
@@ -41,16 +41,6 @@ const struct imx_imx_keypad_data imx35_imx_keypad_data __initconst =
        imx_imx_keypad_data_entry_single(MX35, SZ_16);
 #endif /* ifdef CONFIG_SOC_IMX35 */
 
-#ifdef CONFIG_SOC_IMX51
-const struct imx_imx_keypad_data imx51_imx_keypad_data __initconst =
-       imx_imx_keypad_data_entry_single(MX51, SZ_16);
-#endif /* ifdef CONFIG_SOC_IMX51 */
-
-#ifdef CONFIG_SOC_IMX53
-const struct imx_imx_keypad_data imx53_imx_keypad_data __initconst =
-       imx_imx_keypad_data_entry_single(MX53, SZ_16);
-#endif /* ifdef CONFIG_SOC_IMX53 */
-
 struct platform_device *__init imx_add_imx_keypad(
                const struct imx_imx_keypad_data *data,
                const struct matrix_keymap_data *pdata)
index bfcb8f3dfa8d712075876e84c3823d8a936aabb5..1c7c721ebff1ba04ef2f73e1025aace0758769c1 100644 (file)
@@ -66,26 +66,6 @@ const struct imx_imx_ssi_data imx35_imx_ssi_data[] __initconst = {
 };
 #endif /* ifdef CONFIG_SOC_IMX35 */
 
-#ifdef CONFIG_SOC_IMX51
-const struct imx_imx_ssi_data imx51_imx_ssi_data[] __initconst = {
-#define imx51_imx_ssi_data_entry(_id, _hwid)                           \
-       imx_imx_ssi_data_entry(MX51, _id, _hwid, SZ_16K)
-       imx51_imx_ssi_data_entry(0, 1),
-       imx51_imx_ssi_data_entry(1, 2),
-       imx51_imx_ssi_data_entry(2, 3),
-};
-#endif /* ifdef CONFIG_SOC_IMX51 */
-
-#ifdef CONFIG_SOC_IMX53
-const struct imx_imx_ssi_data imx53_imx_ssi_data[] __initconst = {
-#define imx53_imx_ssi_data_entry(_id, _hwid)                           \
-       imx_imx_ssi_data_entry(MX53, _id, _hwid, SZ_16K)
-       imx53_imx_ssi_data_entry(0, 1),
-       imx53_imx_ssi_data_entry(1, 2),
-       imx53_imx_ssi_data_entry(2, 3),
-};
-#endif /* ifdef CONFIG_SOC_IMX53 */
-
 struct platform_device *__init imx_add_imx_ssi(
                const struct imx_imx_ssi_data *data,
                const struct imx_ssi_platform_data *pdata)
index faac4aa6ca6d0dc3d109b40160ac4d310cac5750..8c01836bc1d4b03c8df84a28cda9cc433d9a825c 100644 (file)
@@ -94,28 +94,6 @@ const struct imx_imx_uart_1irq_data imx35_imx_uart_data[] __initconst = {
 };
 #endif /* ifdef CONFIG_SOC_IMX35 */
 
-#ifdef CONFIG_SOC_IMX51
-const struct imx_imx_uart_1irq_data imx51_imx_uart_data[] __initconst = {
-#define imx51_imx_uart_data_entry(_id, _hwid)                          \
-       imx_imx_uart_1irq_data_entry(MX51, _id, _hwid, SZ_4K)
-       imx51_imx_uart_data_entry(0, 1),
-       imx51_imx_uart_data_entry(1, 2),
-       imx51_imx_uart_data_entry(2, 3),
-};
-#endif /* ifdef CONFIG_SOC_IMX51 */
-
-#ifdef CONFIG_SOC_IMX53
-const struct imx_imx_uart_1irq_data imx53_imx_uart_data[] __initconst = {
-#define imx53_imx_uart_data_entry(_id, _hwid)                          \
-       imx_imx_uart_1irq_data_entry(MX53, _id, _hwid, SZ_4K)
-       imx53_imx_uart_data_entry(0, 1),
-       imx53_imx_uart_data_entry(1, 2),
-       imx53_imx_uart_data_entry(2, 3),
-       imx53_imx_uart_data_entry(3, 4),
-       imx53_imx_uart_data_entry(4, 5),
-};
-#endif /* ifdef CONFIG_SOC_IMX53 */
-
 struct platform_device *__init imx_add_imx_uart_3irq(
                const struct imx_imx_uart_3irq_data *data,
                const struct imxuart_platform_data *pdata)
index ec75d6413686d7f2004a83b96c16a4683bc630a1..54f63bc25ca4d1e7974668577324ef2b61285a07 100644 (file)
@@ -45,24 +45,6 @@ const struct imx_imx2_wdt_data imx35_imx2_wdt_data __initconst =
        imx_imx2_wdt_data_entry_single(MX35, 0, , SZ_16K);
 #endif /* ifdef CONFIG_SOC_IMX35 */
 
-#ifdef CONFIG_SOC_IMX51
-const struct imx_imx2_wdt_data imx51_imx2_wdt_data[] __initconst = {
-#define imx51_imx2_wdt_data_entry(_id, _hwid)                          \
-       imx_imx2_wdt_data_entry(MX51, _id, _hwid, SZ_16K)
-       imx51_imx2_wdt_data_entry(0, 1),
-       imx51_imx2_wdt_data_entry(1, 2),
-};
-#endif /* ifdef CONFIG_SOC_IMX51 */
-
-#ifdef CONFIG_SOC_IMX53
-const struct imx_imx2_wdt_data imx53_imx2_wdt_data[] __initconst = {
-#define imx53_imx2_wdt_data_entry(_id, _hwid)                          \
-       imx_imx2_wdt_data_entry(MX53, _id, _hwid, SZ_16K)
-       imx53_imx2_wdt_data_entry(0, 1),
-       imx53_imx2_wdt_data_entry(1, 2),
-};
-#endif /* ifdef CONFIG_SOC_IMX53 */
-
 struct platform_device *__init imx_add_imx2_wdt(
                const struct imx_imx2_wdt_data *data)
 {
diff --git a/arch/arm/mach-imx/devices/platform-imx_udc.c b/arch/arm/mach-imx/devices/platform-imx_udc.c
deleted file mode 100644 (file)
index 5ced7e4..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2010 Pengutronix
- * Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de>
- *
- * This program is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License version 2 as published by the
- * Free Software Foundation.
- */
-#include "../hardware.h"
-#include "devices-common.h"
-
-#define imx_imx_udc_data_entry_single(soc, _size)                      \
-       {                                                               \
-               .iobase = soc ## _USBD_BASE_ADDR,                       \
-               .iosize = _size,                                        \
-               .irq0 = soc ## _INT_USBD0,                              \
-               .irq1 = soc ## _INT_USBD1,                              \
-               .irq2 = soc ## _INT_USBD2,                              \
-               .irq3 = soc ## _INT_USBD3,                              \
-               .irq4 = soc ## _INT_USBD4,                              \
-               .irq5 = soc ## _INT_USBD5,                              \
-               .irq6 = soc ## _INT_USBD6,                              \
-       }
-
-#define imx_imx_udc_data_entry(soc, _size)                             \
-       [_id] = imx_imx_udc_data_entry_single(soc, _size)
-
-#ifdef CONFIG_SOC_IMX1
-const struct imx_imx_udc_data imx1_imx_udc_data __initconst =
-       imx_imx_udc_data_entry_single(MX1, SZ_4K);
-#endif /* ifdef CONFIG_SOC_IMX1 */
-
-struct platform_device *__init imx_add_imx_udc(
-               const struct imx_imx_udc_data *data,
-               const struct imxusb_platform_data *pdata)
-{
-       struct resource res[] = {
-               {
-                       .start = data->iobase,
-                       .end = data->iobase + data->iosize - 1,
-                       .flags = IORESOURCE_MEM,
-               }, {
-                       .start = data->irq0,
-                       .end = data->irq0,
-                       .flags = IORESOURCE_IRQ,
-               }, {
-                       .start = data->irq1,
-                       .end = data->irq1,
-                       .flags = IORESOURCE_IRQ,
-               }, {
-                       .start = data->irq2,
-                       .end = data->irq2,
-                       .flags = IORESOURCE_IRQ,
-               }, {
-                       .start = data->irq3,
-                       .end = data->irq3,
-                       .flags = IORESOURCE_IRQ,
-               }, {
-                       .start = data->irq4,
-                       .end = data->irq4,
-                       .flags = IORESOURCE_IRQ,
-               }, {
-                       .start = data->irq5,
-                       .end = data->irq5,
-                       .flags = IORESOURCE_IRQ,
-               }, {
-                       .start = data->irq6,
-                       .end = data->irq6,
-                       .flags = IORESOURCE_IRQ,
-               },
-       };
-
-       return imx_add_platform_device("imx_udc", 0,
-                       res, ARRAY_SIZE(res), pdata, sizeof(*pdata));
-}
diff --git a/arch/arm/mach-imx/devices/platform-mx1-camera.c b/arch/arm/mach-imx/devices/platform-mx1-camera.c
deleted file mode 100644 (file)
index 2c67881..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2010 Pengutronix
- * Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de>
- *
- * This program is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License version 2 as published by the
- * Free Software Foundation.
- */
-#include "../hardware.h"
-#include "devices-common.h"
-
-#define imx_mx1_camera_data_entry_single(soc, _size)                   \
-       {                                                               \
-               .iobase = soc ## _CSI ## _BASE_ADDR,                    \
-               .iosize = _size,                                        \
-               .irq = soc ## _INT_CSI,                                 \
-       }
-
-#ifdef CONFIG_SOC_IMX1
-const struct imx_mx1_camera_data imx1_mx1_camera_data __initconst =
-       imx_mx1_camera_data_entry_single(MX1, 10);
-#endif /* ifdef CONFIG_SOC_IMX1 */
-
-struct platform_device *__init imx_add_mx1_camera(
-               const struct imx_mx1_camera_data *data,
-               const struct mx1_camera_pdata *pdata)
-{
-       struct resource res[] = {
-               {
-                       .start = data->iobase,
-                       .end = data->iobase + data->iosize - 1,
-                       .flags = IORESOURCE_MEM,
-               }, {
-                       .start = data->irq,
-                       .end = data->irq,
-                       .flags = IORESOURCE_IRQ,
-               },
-       };
-       return imx_add_platform_device_dmamask("mx1-camera", 0,
-                       res, ARRAY_SIZE(res),
-                       pdata, sizeof(*pdata), DMA_BIT_MASK(32));
-}
index 5d4bbbfde641360d31815917c2a4c1e88d7fe64d..296353662ff025dac519c7cffbb112f601dc007f 100644 (file)
@@ -50,15 +50,6 @@ const struct imx_mxc_ehci_data imx35_mxc_ehci_hs_data __initconst =
        imx_mxc_ehci_data_entry_single(MX35, 1, HS);
 #endif /* ifdef CONFIG_SOC_IMX35 */
 
-#ifdef CONFIG_SOC_IMX51
-const struct imx_mxc_ehci_data imx51_mxc_ehci_otg_data __initconst =
-       imx_mxc_ehci_data_entry_single(MX51, 0, OTG);
-const struct imx_mxc_ehci_data imx51_mxc_ehci_hs_data[] __initconst = {
-       imx_mxc_ehci_data_entry_single(MX51, 1, HS1),
-       imx_mxc_ehci_data_entry_single(MX51, 2, HS2),
-};
-#endif /* ifdef CONFIG_SOC_IMX51 */
-
 struct platform_device *__init imx_add_mxc_ehci(
                const struct imx_mxc_ehci_data *data,
                const struct mxc_usbh_platform_data *pdata)
index 7af1c53e42b50c669ad090ad1a513a748a530f38..fa618a34f4625f6df8a5759116434fcd682eda18 100644 (file)
@@ -54,11 +54,6 @@ const struct imx_mxc_nand_data imx35_mxc_nand_data __initconst =
        imx_mxc_nand_data_entry_single(MX35, "imx25-nand", SZ_8K);
 #endif
 
-#ifdef CONFIG_SOC_IMX51
-const struct imx_mxc_nand_data imx51_mxc_nand_data __initconst =
-       imx_mxc_nandv3_data_entry_single(MX51, "imx51-nand", SZ_16K);
-#endif
-
 struct platform_device *__init imx_add_mxc_nand(
                const struct imx_mxc_nand_data *data,
                const struct mxc_nand_platform_data *pdata)
index c58404badb592080d6ff3702200c6bebb97cdc0f..851fbc8af7a9fd4bb20ec154deb6f1f79ca75e12 100644 (file)
@@ -48,9 +48,6 @@ static int __init imxXX_add_mxc_rnga(void)
 #endif /* if defined(CONFIG_SOC_IMX31) */
                ret = ERR_PTR(-ENODEV);
 
-       if (IS_ERR(ret))
-               return PTR_ERR(ret);
-
-       return 0;
+       return PTR_ERR_OR_ZERO(ret);
 }
 arch_initcall(imxXX_add_mxc_rnga);
index e4ec11c8ce5546e681f80d22900bc733249ded83..1c7f895a69d2328310b706c3e1845457ff902e7d 100644 (file)
@@ -28,16 +28,6 @@ const struct imx_pata_imx_data imx35_pata_imx_data __initconst =
        imx_pata_imx_data_entry_single(MX35, SZ_16K);
 #endif /* ifdef CONFIG_SOC_IMX35 */
 
-#ifdef CONFIG_SOC_IMX51
-const struct imx_pata_imx_data imx51_pata_imx_data __initconst =
-       imx_pata_imx_data_entry_single(MX51, SZ_16K);
-#endif /* ifdef CONFIG_SOC_IMX51 */
-
-#ifdef CONFIG_SOC_IMX53
-const struct imx_pata_imx_data imx53_pata_imx_data __initconst =
-       imx_pata_imx_data_entry_single(MX53, SZ_16K);
-#endif /* ifdef CONFIG_SOC_IMX53 */
-
 struct platform_device *__init imx_add_pata_imx(
                const struct imx_pata_imx_data *data)
 {
index e66a4e316311e613e2b67d3738a8ebd21e2618b5..fb8d4a2ad48c0629b3cfbbe7c2b76c6646c9b436 100644 (file)
@@ -43,30 +43,6 @@ imx35_sdhci_esdhc_imx_data[] __initconst = {
 };
 #endif /* ifdef CONFIG_SOC_IMX35 */
 
-#ifdef CONFIG_SOC_IMX51
-const struct imx_sdhci_esdhc_imx_data
-imx51_sdhci_esdhc_imx_data[] __initconst = {
-#define imx51_sdhci_esdhc_imx_data_entry(_id, _hwid)                   \
-       imx_sdhci_esdhc_imx_data_entry(MX51, "sdhci-esdhc-imx51", _id, _hwid)
-       imx51_sdhci_esdhc_imx_data_entry(0, 1),
-       imx51_sdhci_esdhc_imx_data_entry(1, 2),
-       imx51_sdhci_esdhc_imx_data_entry(2, 3),
-       imx51_sdhci_esdhc_imx_data_entry(3, 4),
-};
-#endif /* ifdef CONFIG_SOC_IMX51 */
-
-#ifdef CONFIG_SOC_IMX53
-const struct imx_sdhci_esdhc_imx_data
-imx53_sdhci_esdhc_imx_data[] __initconst = {
-#define imx53_sdhci_esdhc_imx_data_entry(_id, _hwid)                   \
-       imx_sdhci_esdhc_imx_data_entry(MX53, "sdhci-esdhc-imx53", _id, _hwid)
-       imx53_sdhci_esdhc_imx_data_entry(0, 1),
-       imx53_sdhci_esdhc_imx_data_entry(1, 2),
-       imx53_sdhci_esdhc_imx_data_entry(2, 3),
-       imx53_sdhci_esdhc_imx_data_entry(3, 4),
-};
-#endif /* ifdef CONFIG_SOC_IMX53 */
-
 static const struct esdhc_platform_data default_esdhc_pdata __initconst = {
        .wp_type = ESDHC_WP_NONE,
        .cd_type = ESDHC_CD_NONE,
index 8880bcb11e055329eb4fbab033d13df2ad8b6d77..aca825d74c48761dabcecc6f54467520036bc698 100644 (file)
@@ -79,33 +79,6 @@ const struct imx_spi_imx_data imx35_cspi_data[] __initconst = {
 };
 #endif /* ifdef CONFIG_SOC_IMX35 */
 
-#ifdef CONFIG_SOC_IMX51
-/* i.mx51 has the i.mx35 type cspi */
-const struct imx_spi_imx_data imx51_cspi_data __initconst =
-       imx_spi_imx_data_entry_single(MX51, CSPI, "imx35-cspi", 2, , SZ_4K);
-
-const struct imx_spi_imx_data imx51_ecspi_data[] __initconst = {
-#define imx51_ecspi_data_entry(_id, _hwid)                             \
-       imx_spi_imx_data_entry(MX51, ECSPI, "imx51-ecspi", _id, _hwid, SZ_4K)
-       imx51_ecspi_data_entry(0, 1),
-       imx51_ecspi_data_entry(1, 2),
-};
-#endif /* ifdef CONFIG_SOC_IMX51 */
-
-#ifdef CONFIG_SOC_IMX53
-/* i.mx53 has the i.mx35 type cspi */
-const struct imx_spi_imx_data imx53_cspi_data __initconst =
-       imx_spi_imx_data_entry_single(MX53, CSPI, "imx35-cspi", 2, , SZ_4K);
-
-/* i.mx53 has the i.mx51 type ecspi */
-const struct imx_spi_imx_data imx53_ecspi_data[] __initconst = {
-#define imx53_ecspi_data_entry(_id, _hwid)                             \
-       imx_spi_imx_data_entry(MX53, ECSPI, "imx51-ecspi", _id, _hwid, SZ_4K)
-       imx53_ecspi_data_entry(0, 1),
-       imx53_ecspi_data_entry(1, 2),
-};
-#endif /* ifdef CONFIG_SOC_IMX53 */
-
 struct platform_device *__init imx_add_spi_imx(
                const struct imx_spi_imx_data *data,
                const struct spi_imx_master *pdata)
index 134c190e3003186d19db0a909dfbaadbd45e45f3..42a5a3d14c5f32d3804a78b58e9c7730eea39206 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/io.h>
 #include <linux/platform_data/usb-ehci-mxc.h>
 
+#include "ehci.h"
 #include "hardware.h"
 
 #define USBCTRL_OTGBASE_OFFSET 0x600
index 448d9115539d391b7aa8f495a386e38d2f4e5066..c56974346c16cfbd54fe47b25735da38600a4220 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/io.h>
 #include <linux/platform_data/usb-ehci-mxc.h>
 
+#include "ehci.h"
 #include "hardware.h"
 
 #define USBCTRL_OTGBASE_OFFSET 0x600
index 05de4e1e39d7d74807bece3218b8e97402fbd5f6..bede21d9b98149903ecbff7fa4364b9272d43ace 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/io.h>
 #include <linux/platform_data/usb-ehci-mxc.h>
 
+#include "ehci.h"
 #include "hardware.h"
 
 #define USBCTRL_OTGBASE_OFFSET 0x600
index 554e7cccff53396c9e59c3086eb95b71441fde0d..f424a543755c6b9e6b15e229e1531ce1bd031795 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/io.h>
 #include <linux/platform_data/usb-ehci-mxc.h>
 
+#include "ehci.h"
 #include "hardware.h"
 
 #define USBCTRL_OTGBASE_OFFSET 0x600
diff --git a/arch/arm/mach-imx/ehci-imx5.c b/arch/arm/mach-imx/ehci-imx5.c
deleted file mode 100644 (file)
index e49710b..0000000
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright (c) 2009 Daniel Mack <daniel@caiaq.de>
- * Copyright (C) 2010 Freescale Semiconductor, Inc.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * for more details.
- */
-
-#include <linux/platform_device.h>
-#include <linux/io.h>
-#include <linux/platform_data/usb-ehci-mxc.h>
-
-#include "hardware.h"
-
-#define MXC_OTG_OFFSET                 0
-#define MXC_H1_OFFSET                  0x200
-#define MXC_H2_OFFSET                  0x400
-
-/* USB_CTRL */
-#define MXC_OTG_UCTRL_OWIE_BIT         (1 << 27)       /* OTG wakeup intr enable */
-#define MXC_OTG_UCTRL_OPM_BIT          (1 << 24)       /* OTG power mask */
-#define MXC_H1_UCTRL_H1UIE_BIT         (1 << 12)       /* Host1 ULPI interrupt enable */
-#define MXC_H1_UCTRL_H1WIE_BIT         (1 << 11)       /* HOST1 wakeup intr enable */
-#define MXC_H1_UCTRL_H1PM_BIT          (1 <<  8)       /* HOST1 power mask */
-
-/* USB_PHY_CTRL_FUNC */
-#define MXC_OTG_PHYCTRL_OC_POL_BIT     (1 << 9)        /* OTG Polarity of Overcurrent */
-#define MXC_OTG_PHYCTRL_OC_DIS_BIT     (1 << 8)        /* OTG Disable Overcurrent Event */
-#define MXC_H1_OC_POL_BIT              (1 << 6)        /* UH1 Polarity of Overcurrent */
-#define MXC_H1_OC_DIS_BIT              (1 << 5)        /* UH1 Disable Overcurrent Event */
-#define MXC_OTG_PHYCTRL_PWR_POL_BIT    (1 << 3)        /* OTG Power Pin Polarity */
-
-/* USBH2CTRL */
-#define MXC_H2_UCTRL_H2UIE_BIT         (1 << 8)
-#define MXC_H2_UCTRL_H2WIE_BIT         (1 << 7)
-#define MXC_H2_UCTRL_H2PM_BIT          (1 << 4)
-
-#define MXC_USBCMD_OFFSET              0x140
-
-/* USBCMD */
-#define MXC_UCMD_ITC_NO_THRESHOLD_MASK (~(0xff << 16)) /* Interrupt Threshold Control */
-
-int mx51_initialize_usb_hw(int port, unsigned int flags)
-{
-       unsigned int v;
-       void __iomem *usb_base;
-       void __iomem *usbotg_base;
-       void __iomem *usbother_base;
-       int ret = 0;
-
-       usb_base = ioremap(MX51_USB_OTG_BASE_ADDR, SZ_4K);
-       if (!usb_base) {
-               printk(KERN_ERR "%s(): ioremap failed\n", __func__);
-               return -ENOMEM;
-       }
-
-       switch (port) {
-       case 0: /* OTG port */
-               usbotg_base = usb_base + MXC_OTG_OFFSET;
-               break;
-       case 1: /* Host 1 port */
-               usbotg_base = usb_base + MXC_H1_OFFSET;
-               break;
-       case 2: /* Host 2 port */
-               usbotg_base = usb_base + MXC_H2_OFFSET;
-               break;
-       default:
-               printk(KERN_ERR"%s no such port %d\n", __func__, port);
-               ret = -ENOENT;
-               goto error;
-       }
-       usbother_base = usb_base + MX5_USBOTHER_REGS_OFFSET;
-
-       switch (port) {
-       case 0: /*OTG port */
-               if (flags & MXC_EHCI_INTERNAL_PHY) {
-                       v = __raw_readl(usbother_base + MXC_USB_PHY_CTR_FUNC_OFFSET);
-
-                       if (flags & MXC_EHCI_OC_PIN_ACTIVE_LOW)
-                               v |= MXC_OTG_PHYCTRL_OC_POL_BIT;
-                       else
-                               v &= ~MXC_OTG_PHYCTRL_OC_POL_BIT;
-                       if (flags & MXC_EHCI_POWER_PINS_ENABLED) {
-                               /* OC/USBPWR is used */
-                               v &= ~MXC_OTG_PHYCTRL_OC_DIS_BIT;
-                       } else {
-                               /* OC/USBPWR is not used */
-                               v |= MXC_OTG_PHYCTRL_OC_DIS_BIT;
-                       }
-                       if (flags & MXC_EHCI_PWR_PIN_ACTIVE_HIGH)
-                               v |= MXC_OTG_PHYCTRL_PWR_POL_BIT;
-                       else
-                               v &= ~MXC_OTG_PHYCTRL_PWR_POL_BIT;
-                       __raw_writel(v, usbother_base + MXC_USB_PHY_CTR_FUNC_OFFSET);
-
-                       v = __raw_readl(usbother_base + MXC_USBCTRL_OFFSET);
-                       if (flags & MXC_EHCI_WAKEUP_ENABLED)
-                               v |= MXC_OTG_UCTRL_OWIE_BIT;/* OTG wakeup enable */
-                       else
-                               v &= ~MXC_OTG_UCTRL_OWIE_BIT;/* OTG wakeup disable */
-                       if (flags & MXC_EHCI_POWER_PINS_ENABLED)
-                               v &= ~MXC_OTG_UCTRL_OPM_BIT;
-                       else
-                               v |= MXC_OTG_UCTRL_OPM_BIT;
-                       __raw_writel(v, usbother_base + MXC_USBCTRL_OFFSET);
-               }
-               break;
-       case 1: /* Host 1 */
-               /*Host ULPI */
-               v = __raw_readl(usbother_base + MXC_USBCTRL_OFFSET);
-               if (flags & MXC_EHCI_WAKEUP_ENABLED) {
-                       /* HOST1 wakeup/ULPI intr enable */
-                       v |= (MXC_H1_UCTRL_H1WIE_BIT | MXC_H1_UCTRL_H1UIE_BIT);
-               } else {
-                       /* HOST1 wakeup/ULPI intr disable */
-                       v &= ~(MXC_H1_UCTRL_H1WIE_BIT | MXC_H1_UCTRL_H1UIE_BIT);
-               }
-
-               if (flags & MXC_EHCI_POWER_PINS_ENABLED)
-                       v &= ~MXC_H1_UCTRL_H1PM_BIT; /* HOST1 power mask unused*/
-               else
-                       v |= MXC_H1_UCTRL_H1PM_BIT; /* HOST1 power mask used*/
-               __raw_writel(v, usbother_base + MXC_USBCTRL_OFFSET);
-
-               v = __raw_readl(usbother_base + MXC_USB_PHY_CTR_FUNC_OFFSET);
-               if (flags & MXC_EHCI_OC_PIN_ACTIVE_LOW)
-                       v |= MXC_H1_OC_POL_BIT;
-               else
-                       v &= ~MXC_H1_OC_POL_BIT;
-               if (flags & MXC_EHCI_POWER_PINS_ENABLED)
-                       v &= ~MXC_H1_OC_DIS_BIT; /* OC is used */
-               else
-                       v |= MXC_H1_OC_DIS_BIT; /* OC is not used */
-               __raw_writel(v, usbother_base + MXC_USB_PHY_CTR_FUNC_OFFSET);
-
-               v = __raw_readl(usbotg_base + MXC_USBCMD_OFFSET);
-               if (flags & MXC_EHCI_ITC_NO_THRESHOLD)
-                       /* Interrupt Threshold Control:Immediate (no threshold) */
-                       v &= MXC_UCMD_ITC_NO_THRESHOLD_MASK;
-               __raw_writel(v, usbotg_base + MXC_USBCMD_OFFSET);
-               break;
-       case 2: /* Host 2 ULPI */
-               v = __raw_readl(usbother_base + MXC_USBH2CTRL_OFFSET);
-               if (flags & MXC_EHCI_WAKEUP_ENABLED) {
-                       /* HOST1 wakeup/ULPI intr enable */
-                       v |= (MXC_H2_UCTRL_H2WIE_BIT | MXC_H2_UCTRL_H2UIE_BIT);
-               } else {
-                       /* HOST1 wakeup/ULPI intr disable */
-                       v &= ~(MXC_H2_UCTRL_H2WIE_BIT | MXC_H2_UCTRL_H2UIE_BIT);
-               }
-
-               if (flags & MXC_EHCI_POWER_PINS_ENABLED)
-                       v &= ~MXC_H2_UCTRL_H2PM_BIT; /* HOST2 power mask unused*/
-               else
-                       v |= MXC_H2_UCTRL_H2PM_BIT; /* HOST2 power mask used*/
-               __raw_writel(v, usbother_base + MXC_USBH2CTRL_OFFSET);
-               break;
-       }
-
-error:
-       iounmap(usb_base);
-       return ret;
-}
-
diff --git a/arch/arm/mach-imx/ehci.h b/arch/arm/mach-imx/ehci.h
new file mode 100644 (file)
index 0000000..0e06002
--- /dev/null
@@ -0,0 +1,43 @@
+#ifndef __MACH_IMX_EHCI_H
+#define __MACH_IMX_EHCI_H
+
+/* values for portsc field */
+#define MXC_EHCI_PHY_LOW_POWER_SUSPEND (1 << 23)
+#define MXC_EHCI_FORCE_FS              (1 << 24)
+#define MXC_EHCI_UTMI_8BIT             (0 << 28)
+#define MXC_EHCI_UTMI_16BIT            (1 << 28)
+#define MXC_EHCI_SERIAL                        (1 << 29)
+#define MXC_EHCI_MODE_UTMI             (0 << 30)
+#define MXC_EHCI_MODE_PHILIPS          (1 << 30)
+#define MXC_EHCI_MODE_ULPI             (2 << 30)
+#define MXC_EHCI_MODE_SERIAL           (3 << 30)
+
+/* values for flags field */
+#define MXC_EHCI_INTERFACE_DIFF_UNI    (0 << 0)
+#define MXC_EHCI_INTERFACE_DIFF_BI     (1 << 0)
+#define MXC_EHCI_INTERFACE_SINGLE_UNI  (2 << 0)
+#define MXC_EHCI_INTERFACE_SINGLE_BI   (3 << 0)
+#define MXC_EHCI_INTERFACE_MASK                (0xf)
+
+#define MXC_EHCI_POWER_PINS_ENABLED    (1 << 5)
+#define MXC_EHCI_PWR_PIN_ACTIVE_HIGH   (1 << 6)
+#define MXC_EHCI_OC_PIN_ACTIVE_LOW     (1 << 7)
+#define MXC_EHCI_TTL_ENABLED           (1 << 8)
+
+#define MXC_EHCI_INTERNAL_PHY          (1 << 9)
+#define MXC_EHCI_IPPUE_DOWN            (1 << 10)
+#define MXC_EHCI_IPPUE_UP              (1 << 11)
+#define MXC_EHCI_WAKEUP_ENABLED                (1 << 12)
+#define MXC_EHCI_ITC_NO_THRESHOLD      (1 << 13)
+
+#define MXC_USBCTRL_OFFSET             0
+#define MXC_USB_PHY_CTR_FUNC_OFFSET    0x8
+#define MXC_USB_PHY_CTR_FUNC2_OFFSET   0xc
+#define MXC_USBH2CTRL_OFFSET           0x14
+
+int mx25_initialize_usb_hw(int port, unsigned int flags);
+int mx31_initialize_usb_hw(int port, unsigned int flags);
+int mx35_initialize_usb_hw(int port, unsigned int flags);
+int mx27_initialize_usb_hw(int port, unsigned int flags);
+
+#endif /* __MACH_IMX_EHCI_H */
index 586e0171a65294200bb2d1a0c9115c73975fb2aa..82ea74e68482433bd32f58cfed7fb540008a61b0 100644 (file)
@@ -27,13 +27,14 @@ static void __iomem *gpc_base;
 static u32 gpc_wake_irqs[IMR_NUM];
 static u32 gpc_saved_imrs[IMR_NUM];
 
-void imx_gpc_pre_suspend(void)
+void imx_gpc_pre_suspend(bool arm_power_off)
 {
        void __iomem *reg_imr1 = gpc_base + GPC_IMR1;
        int i;
 
        /* Tell GPC to power off ARM core when suspend */
-       writel_relaxed(0x1, gpc_base + GPC_PGC_CPU_PDN);
+       if (arm_power_off)
+               writel_relaxed(0x1, gpc_base + GPC_PGC_CPU_PDN);
 
        for (i = 0; i < IMR_NUM; i++) {
                gpc_saved_imrs[i] = readl_relaxed(reg_imr1 + i * 4);
index abf43bb47eca16d05253cb757fc823e1cdfc5645..66b2b564c463ef59b27ef8145ae9f78d8c340083 100644 (file)
 
 #include "mxc.h"
 
-#include "mx51.h"
-#include "mx53.h"
 #include "mx3x.h"
 #include "mx31.h"
 #include "mx35.h"
index 42a65e06744363fd9fdfa12e976a0a89cddd5631..cf8032bae277071c3ab06e7be2ceba817e2416c1 100644 (file)
@@ -29,16 +29,10 @@ static const char * const imx25_dt_board_compat[] __initconst = {
        NULL
 };
 
-static void __init imx25_timer_init(void)
-{
-       mx25_clocks_init_dt();
-}
-
 DT_MACHINE_START(IMX25_DT, "Freescale i.MX25 (Device Tree Support)")
        .map_io         = mx25_map_io,
        .init_early     = imx25_init_early,
        .init_irq       = mx25_init_irq,
-       .init_time      = imx25_timer_init,
        .init_machine   = imx25_dt_init,
        .dt_compat      = imx25_dt_board_compat,
        .restart        = mxc_restart,
index 17bd4058133de3241b06c4d555ad7effafcf69d8..080e66c6a1d02722022f12a7991cf0b0b566f72e 100644 (file)
@@ -34,16 +34,10 @@ static const char * const imx27_dt_board_compat[] __initconst = {
        NULL
 };
 
-static void __init imx27_timer_init(void)
-{
-       mx27_clocks_init_dt();
-}
-
 DT_MACHINE_START(IMX27_DT, "Freescale i.MX27 (Device Tree Support)")
        .map_io         = mx27_map_io,
        .init_early     = imx27_init_early,
        .init_irq       = mx27_init_irq,
-       .init_time      = imx27_timer_init,
        .init_machine   = imx27_dt_init,
        .dt_compat      = imx27_dt_board_compat,
        .restart        = mxc_restart,
index 581f4d6c9b8a76c09b5c1fb14f76b53e5b9a341a..418dbc82adc41765c7da7473c5f4af4468fb1941 100644 (file)
@@ -25,7 +25,7 @@ static void __init imx31_dt_init(void)
        of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
 }
 
-static const char *imx31_dt_board_compat[] __initconst = {
+static const char * const imx31_dt_board_compat[] __initconst = {
        "fsl,imx31",
        NULL
 };
index a62854c59240325bbf88314502b91796a36e8b90..584fbe1055798fe1f525174f7d660c8393cc3e52 100644 (file)
@@ -34,7 +34,7 @@ static void __init imx35_irq_init(void)
        mx35_init_irq();
 }
 
-static const char *imx35_dt_board_compat[] __initconst = {
+static const char * const imx35_dt_board_compat[] __initconst = {
        "fsl,imx35",
        NULL
 };
diff --git a/arch/arm/mach-imx/imx51-dt.c b/arch/arm/mach-imx/imx51-dt.c
deleted file mode 100644 (file)
index b8cd968..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright 2011 Freescale Semiconductor, Inc. All Rights Reserved.
- * Copyright 2011 Linaro Ltd.
- *
- * The code contained herein is licensed under the GNU General Public
- * License. You may obtain a copy of the GNU General Public License
- * Version 2 or later at the following locations:
- *
- * http://www.opensource.org/licenses/gpl-license.html
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-#include <linux/irq.h>
-#include <linux/of_irq.h>
-#include <linux/of_platform.h>
-#include <asm/mach/arch.h>
-#include <asm/mach/time.h>
-
-#include "common.h"
-#include "mx51.h"
-
-static void __init imx51_dt_init(void)
-{
-       struct platform_device_info devinfo = { .name = "cpufreq-cpu0", };
-
-       mxc_arch_reset_init_dt();
-
-       of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
-       platform_device_register_full(&devinfo);
-}
-
-static const char *imx51_dt_board_compat[] __initconst = {
-       "fsl,imx51",
-       NULL
-};
-
-DT_MACHINE_START(IMX51_DT, "Freescale i.MX51 (Device Tree Support)")
-       .map_io         = mx51_map_io,
-       .init_early     = imx51_init_early,
-       .init_irq       = mx51_init_irq,
-       .init_machine   = imx51_dt_init,
-       .init_late      = imx51_init_late,
-       .dt_compat      = imx51_dt_board_compat,
-       .restart        = mxc_restart,
-MACHINE_END
diff --git a/arch/arm/mach-imx/iomux-mx51.h b/arch/arm/mach-imx/iomux-mx51.h
deleted file mode 100644 (file)
index 75bbcc4..0000000
+++ /dev/null
@@ -1,827 +0,0 @@
-/*
- * Copyright (C) 2009-2010 Amit Kucheria <amit.kucheria@canonical.com>
- * Copyright (C) 2010 Freescale Semiconductor, Inc.
- *
- * The code contained herein is licensed under the GNU General Public
- * License. You may obtain a copy of the GNU General Public License
- * Version 2 or later at the following locations:
- *
- * http://www.opensource.org/licenses/gpl-license.html
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-#ifndef __MACH_IOMUX_MX51_H__
-#define __MACH_IOMUX_MX51_H__
-
-#include "iomux-v3.h"
-#define __NA_  0x000
-
-
-/* Pad control groupings */
-#define MX51_UART_PAD_CTRL     (PAD_CTL_PKE | PAD_CTL_PUE | PAD_CTL_DSE_HIGH | \
-                               PAD_CTL_HYS | PAD_CTL_SRE_FAST)
-#define MX51_I2C_PAD_CTRL      (PAD_CTL_SRE_FAST | PAD_CTL_ODE | \
-                               PAD_CTL_DSE_HIGH | PAD_CTL_PUS_100K_UP | \
-                               PAD_CTL_HYS)
-#define MX51_ESDHC_PAD_CTRL    (PAD_CTL_SRE_FAST | PAD_CTL_ODE | \
-                               PAD_CTL_DSE_HIGH | PAD_CTL_PUS_100K_UP | \
-                               PAD_CTL_HYS)
-#define MX51_USBH1_PAD_CTRL    (PAD_CTL_PKE | PAD_CTL_SRE_FAST | \
-                               PAD_CTL_DSE_HIGH | PAD_CTL_PUS_100K_UP | \
-                               PAD_CTL_HYS | PAD_CTL_PUE)
-#define MX51_ECSPI_PAD_CTRL    (PAD_CTL_PKE | PAD_CTL_HYS | \
-                               PAD_CTL_DSE_HIGH | PAD_CTL_SRE_FAST)
-#define MX51_SDHCI_PAD_CTRL    (PAD_CTL_PKE | PAD_CTL_DSE_HIGH | \
-                               PAD_CTL_PUS_47K_UP | PAD_CTL_PUE | \
-                               PAD_CTL_SRE_FAST | PAD_CTL_DVS)
-#define MX51_GPIO_PAD_CTRL     (PAD_CTL_DSE_HIGH | PAD_CTL_PKE | PAD_CTL_SRE_FAST)
-
-#define MX51_PAD_CTRL_2                (PAD_CTL_PKE | PAD_CTL_HYS)
-#define MX51_PAD_CTRL_3                (PAD_CTL_PKE | PAD_CTL_PUS_100K_UP)
-#define MX51_PAD_CTRL_4                (PAD_CTL_PKE | PAD_CTL_DVS | PAD_CTL_HYS)
-#define MX51_PAD_CTRL_5                (PAD_CTL_DVS | PAD_CTL_DSE_HIGH)
-
-/*
- * The naming convention for the pad modes is MX51_PAD_<padname>__<padmode>
- * If <padname> or <padmode> refers to a GPIO, it is named GPIO<unit>_<num>
- * See also iomux-v3.h
- */
-
-/* Raw pin modes without pad control */
-/*                                                       PAD    MUX ALT INPSE PATH PADCTRL */
-
-/* The same pins as above but with the default pad control values applied */
-#define MX51_PAD_EIM_D16__AUD4_RXFS            IOMUX_PAD(0x3f0, 0x05c, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D16__AUD5_TXD             IOMUX_PAD(0x3f0, 0x05c, 7, 0x8d8, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D16__EIM_D16              IOMUX_PAD(0x3f0, 0x05c, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D16__GPIO2_0              IOMUX_PAD(0x3f0, 0x05c, 1, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_EIM_D16__I2C1_SDA             IOMUX_PAD(0x3f0, 0x05c, 0x14, 0x9b4, 0, MX51_I2C_PAD_CTRL)
-#define MX51_PAD_EIM_D16__UART2_CTS            IOMUX_PAD(0x3f0, 0x05c, 3, __NA_, 0, MX51_UART_PAD_CTRL)
-#define MX51_PAD_EIM_D16__USBH2_DATA0          IOMUX_PAD(0x3f0, 0x05c, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D17__AUD5_RXD             IOMUX_PAD(0x3f4, 0x060, 7, 0x8d4, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D17__EIM_D17              IOMUX_PAD(0x3f4, 0x060, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D17__GPIO2_1              IOMUX_PAD(0x3f4, 0x060, 1, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_EIM_D17__UART2_RXD            IOMUX_PAD(0x3f4, 0x060, 3, 0x9ec, 0, MX51_UART_PAD_CTRL)
-#define MX51_PAD_EIM_D17__UART3_CTS            IOMUX_PAD(0x3f4, 0x060, 4, __NA_, 0, MX51_UART_PAD_CTRL)
-#define MX51_PAD_EIM_D17__USBH2_DATA1          IOMUX_PAD(0x3f4, 0x060, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D18__AUD5_TXC             IOMUX_PAD(0x3f8, 0x064, 7, 0x8e4, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D18__EIM_D18              IOMUX_PAD(0x3f8, 0x064, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D18__GPIO2_2              IOMUX_PAD(0x3f8, 0x064, 1, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_EIM_D18__UART2_TXD            IOMUX_PAD(0x3f8, 0x064, 3, __NA_, 0, MX51_UART_PAD_CTRL)
-#define MX51_PAD_EIM_D18__UART3_RTS            IOMUX_PAD(0x3f8, 0x064, 4, 0x9f0, 1, MX51_UART_PAD_CTRL)
-#define MX51_PAD_EIM_D18__USBH2_DATA2          IOMUX_PAD(0x3f8, 0x064, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D19__AUD4_RXC             IOMUX_PAD(0x3fc, 0x068, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D19__AUD5_TXFS            IOMUX_PAD(0x3fc, 0x068, 7, 0x8e8, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D19__EIM_D19              IOMUX_PAD(0x3fc, 0x068, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D19__GPIO2_3              IOMUX_PAD(0x3fc, 0x068, 1, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_EIM_D19__I2C1_SCL             IOMUX_PAD(0x3fc, 0x068, 0x14, 0x9b0, 0, MX51_I2C_PAD_CTRL)
-#define MX51_PAD_EIM_D19__UART2_RTS            IOMUX_PAD(0x3fc, 0x068, 3, 0x9e8, 1, MX51_UART_PAD_CTRL)
-#define MX51_PAD_EIM_D19__USBH2_DATA3          IOMUX_PAD(0x3fc, 0x068, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D20__AUD4_TXD             IOMUX_PAD(0x400, 0x06c, 5, 0x8c8, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D20__EIM_D20              IOMUX_PAD(0x400, 0x06c, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D20__GPIO2_4              IOMUX_PAD(0x400, 0x06c, 1, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_EIM_D20__SRTC_ALARM_DEB       IOMUX_PAD(0x400, 0x06c, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D20__USBH2_DATA4          IOMUX_PAD(0x400, 0x06c, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D21__AUD4_RXD             IOMUX_PAD(0x404, 0x070, 5, 0x8c4, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D21__EIM_D21              IOMUX_PAD(0x404, 0x070, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D21__GPIO2_5              IOMUX_PAD(0x404, 0x070, 1, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_EIM_D21__SRTC_ALARM_DEB       IOMUX_PAD(0x404, 0x070, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D21__USBH2_DATA5          IOMUX_PAD(0x404, 0x070, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D22__AUD4_TXC             IOMUX_PAD(0x408, 0x074, 5, 0x8cc, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D22__EIM_D22              IOMUX_PAD(0x408, 0x074, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D22__GPIO2_6              IOMUX_PAD(0x408, 0x074, 1, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_EIM_D22__USBH2_DATA6          IOMUX_PAD(0x408, 0x074, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D23__AUD4_TXFS            IOMUX_PAD(0x40c, 0x078, 5, 0x8d0, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D23__EIM_D23              IOMUX_PAD(0x40c, 0x078, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D23__GPIO2_7              IOMUX_PAD(0x40c, 0x078, 1, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_EIM_D23__SPDIF_OUT1           IOMUX_PAD(0x40c, 0x078, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D23__USBH2_DATA7          IOMUX_PAD(0x40c, 0x078, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D24__AUD6_RXFS            IOMUX_PAD(0x410, 0x07c, 5, 0x8f8, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D24__EIM_D24              IOMUX_PAD(0x410, 0x07c, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D24__GPIO2_8              IOMUX_PAD(0x410, 0x07c, 1, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_EIM_D24__I2C2_SDA             IOMUX_PAD(0x410, 0x07c, 0x14, 0x9bc, 0, MX51_I2C_PAD_CTRL)
-#define MX51_PAD_EIM_D24__UART3_CTS            IOMUX_PAD(0x410, 0x07c, 3, __NA_, 0, MX51_UART_PAD_CTRL)
-#define MX51_PAD_EIM_D24__USBOTG_DATA0         IOMUX_PAD(0x410, 0x07c, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D25__EIM_D25              IOMUX_PAD(0x414, 0x080, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D25__KEY_COL6             IOMUX_PAD(0x414, 0x080, 1, 0x9c8, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D25__UART2_CTS            IOMUX_PAD(0x414, 0x080, 4, __NA_, 0, MX51_UART_PAD_CTRL)
-#define MX51_PAD_EIM_D25__UART3_RXD            IOMUX_PAD(0x414, 0x080, 3, 0x9f4, 0, MX51_UART_PAD_CTRL)
-#define MX51_PAD_EIM_D25__USBOTG_DATA1         IOMUX_PAD(0x414, 0x080, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D25__GPT_CMPOUT1          IOMUX_PAD(0x414, 0x080, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D26__EIM_D26              IOMUX_PAD(0x418, 0x084, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D26__KEY_COL7             IOMUX_PAD(0x418, 0x084, 1, 0x9cc, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D26__UART2_RTS            IOMUX_PAD(0x418, 0x084, 4, 0x9e8, 3, MX51_UART_PAD_CTRL)
-#define MX51_PAD_EIM_D26__UART3_TXD            IOMUX_PAD(0x418, 0x084, 3, __NA_, 0, MX51_UART_PAD_CTRL)
-#define MX51_PAD_EIM_D26__USBOTG_DATA2         IOMUX_PAD(0x418, 0x084, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D26__GPT_CMPOUT2          IOMUX_PAD(0x418, 0x084, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D27__AUD6_RXC             IOMUX_PAD(0x41c, 0x088, 5, 0x8f4, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D27__EIM_D27              IOMUX_PAD(0x41c, 0x088, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D27__GPIO2_9              IOMUX_PAD(0x41c, 0x088, 1, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_EIM_D27__I2C2_SCL             IOMUX_PAD(0x41c, 0x088, 0x14, 0x9b8, 0, MX51_I2C_PAD_CTRL)
-#define MX51_PAD_EIM_D27__UART3_RTS            IOMUX_PAD(0x41c, 0x088, 3, 0x9f0, 3, MX51_UART_PAD_CTRL)
-#define MX51_PAD_EIM_D27__USBOTG_DATA3         IOMUX_PAD(0x41c, 0x088, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D28__AUD6_TXD             IOMUX_PAD(0x420, 0x08c, 5, 0x8f0, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D28__EIM_D28              IOMUX_PAD(0x420, 0x08c, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D28__KEY_ROW4             IOMUX_PAD(0x420, 0x08c, 1, 0x9d0, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D28__USBOTG_DATA4         IOMUX_PAD(0x420, 0x08c, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D29__AUD6_RXD             IOMUX_PAD(0x424, 0x090, 5, 0x8ec, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D29__EIM_D29              IOMUX_PAD(0x424, 0x090, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D29__KEY_ROW5             IOMUX_PAD(0x424, 0x090, 1, 0x9d4, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D29__USBOTG_DATA5         IOMUX_PAD(0x424, 0x090, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D30__AUD6_TXC             IOMUX_PAD(0x428, 0x094, 5, 0x8fc, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D30__EIM_D30              IOMUX_PAD(0x428, 0x094, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D30__KEY_ROW6             IOMUX_PAD(0x428, 0x094, 1, 0x9d8, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D30__USBOTG_DATA6         IOMUX_PAD(0x428, 0x094, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D31__AUD6_TXFS            IOMUX_PAD(0x42c, 0x098, 5, 0x900, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D31__EIM_D31              IOMUX_PAD(0x42c, 0x098, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D31__KEY_ROW7             IOMUX_PAD(0x42c, 0x098, 1, 0x9dc, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_D31__USBOTG_DATA7         IOMUX_PAD(0x42c, 0x098, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_A16__EIM_A16              IOMUX_PAD(0x430, 0x09c, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_A16__GPIO2_10             IOMUX_PAD(0x430, 0x09c, 1, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_EIM_A16__OSC_FREQ_SEL0                IOMUX_PAD(0x430, 0x09c, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_A17__EIM_A17              IOMUX_PAD(0x434, 0x0a0, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_A17__GPIO2_11             IOMUX_PAD(0x434, 0x0a0, 1, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_EIM_A17__OSC_FREQ_SEL1                IOMUX_PAD(0x434, 0x0a0, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_A18__BOOT_LPB0            IOMUX_PAD(0x438, 0x0a4, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_A18__EIM_A18              IOMUX_PAD(0x438, 0x0a4, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_A18__GPIO2_12             IOMUX_PAD(0x438, 0x0a4, 1, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_EIM_A19__BOOT_LPB1            IOMUX_PAD(0x43c, 0x0a8, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_A19__EIM_A19              IOMUX_PAD(0x43c, 0x0a8, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_A19__GPIO2_13             IOMUX_PAD(0x43c, 0x0a8, 1, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_EIM_A20__BOOT_UART_SRC0       IOMUX_PAD(0x440, 0x0ac, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_A20__EIM_A20              IOMUX_PAD(0x440, 0x0ac, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_A20__GPIO2_14             IOMUX_PAD(0x440, 0x0ac, 1, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_EIM_A21__BOOT_UART_SRC1       IOMUX_PAD(0x444, 0x0b0, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_A21__EIM_A21              IOMUX_PAD(0x444, 0x0b0, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_A21__GPIO2_15             IOMUX_PAD(0x444, 0x0b0, 1, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_EIM_A22__EIM_A22              IOMUX_PAD(0x448, 0x0b4, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_A22__GPIO2_16             IOMUX_PAD(0x448, 0x0b4, 1, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_EIM_A23__BOOT_HPN_EN          IOMUX_PAD(0x44c, 0x0b8, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_A23__EIM_A23              IOMUX_PAD(0x44c, 0x0b8, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_A23__GPIO2_17             IOMUX_PAD(0x44c, 0x0b8, 1, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_EIM_A24__EIM_A24              IOMUX_PAD(0x450, 0x0bc, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_A24__GPIO2_18             IOMUX_PAD(0x450, 0x0bc, 1, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_EIM_A24__USBH2_CLK            IOMUX_PAD(0x450, 0x0bc, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_A25__DISP1_PIN4           IOMUX_PAD(0x454, 0x0c0, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_A25__EIM_A25              IOMUX_PAD(0x454, 0x0c0, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_A25__GPIO2_19             IOMUX_PAD(0x454, 0x0c0, 1, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_EIM_A25__USBH2_DIR            IOMUX_PAD(0x454, 0x0c0, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_A26__CSI1_DATA_EN         IOMUX_PAD(0x458, 0x0c4, 5, 0x9a0, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_A26__DISP2_EXT_CLK                IOMUX_PAD(0x458, 0x0c4, 6, 0x908, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_A26__EIM_A26              IOMUX_PAD(0x458, 0x0c4, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_A26__GPIO2_20             IOMUX_PAD(0x458, 0x0c4, 1, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_EIM_A26__USBH2_STP            IOMUX_PAD(0x458, 0x0c4, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_A27__CSI2_DATA_EN         IOMUX_PAD(0x45c, 0x0c8, 5, 0x99c, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_A27__DISP1_PIN1           IOMUX_PAD(0x45c, 0x0c8, 6, 0x9a4, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_A27__EIM_A27              IOMUX_PAD(0x45c, 0x0c8, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_A27__GPIO2_21             IOMUX_PAD(0x45c, 0x0c8, 1, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_EIM_A27__USBH2_NXT            IOMUX_PAD(0x45c, 0x0c8, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_EB0__EIM_EB0              IOMUX_PAD(0x460, 0x0cc, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_EB1__EIM_EB1              IOMUX_PAD(0x464, 0x0d0, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_EB2__AUD5_RXFS            IOMUX_PAD(0x468, 0x0d4, 6, 0x8e0, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_EB2__CSI1_D2              IOMUX_PAD(0x468, 0x0d4, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_EB2__EIM_EB2              IOMUX_PAD(0x468, 0x0d4, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_EB2__FEC_MDIO             (IOMUX_PAD(0x468, 0x0d4, 3, 0x954, 0, 0) | \
-               MUX_PAD_CTRL(PAD_CTL_PUS_22K_UP | PAD_CTL_PKE | PAD_CTL_SRE_FAST | \
-               PAD_CTL_DSE_HIGH | PAD_CTL_PUE | PAD_CTL_HYS))
-#define MX51_PAD_EIM_EB2__GPIO2_22             IOMUX_PAD(0x468, 0x0d4, 1, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_EIM_EB2__GPT_CMPOUT1          IOMUX_PAD(0x468, 0x0d4, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_EB3__AUD5_RXC             IOMUX_PAD(0x46c, 0x0d8, 6, 0x8dc, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_EB3__CSI1_D3              IOMUX_PAD(0x46c, 0x0d8, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_EB3__EIM_EB3              IOMUX_PAD(0x46c, 0x0d8, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_EB3__FEC_RDATA1           IOMUX_PAD(0x46c, 0x0d8, 3, 0x95c, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_EB3__GPIO2_23             IOMUX_PAD(0x46c, 0x0d8, 1, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_EIM_EB3__GPT_CMPOUT2          IOMUX_PAD(0x46c, 0x0d8, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_OE__EIM_OE                        IOMUX_PAD(0x470, 0x0dc, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_OE__GPIO2_24              IOMUX_PAD(0x470, 0x0dc, 1, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_EIM_CS0__EIM_CS0              IOMUX_PAD(0x474, 0x0e0, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_CS0__GPIO2_25             IOMUX_PAD(0x474, 0x0e0, 1, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_EIM_CS1__EIM_CS1              IOMUX_PAD(0x478, 0x0e4, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_CS1__GPIO2_26             IOMUX_PAD(0x478, 0x0e4, 1, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_EIM_CS2__AUD5_TXD             IOMUX_PAD(0x47c, 0x0e8, 6, 0x8d8, 1, NO_PAD_CTRL)
-#define MX51_PAD_EIM_CS2__CSI1_D4              IOMUX_PAD(0x47c, 0x0e8, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_CS2__EIM_CS2              IOMUX_PAD(0x47c, 0x0e8, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_CS2__FEC_RDATA2           IOMUX_PAD(0x47c, 0x0e8, 3, 0x960, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_CS2__GPIO2_27             IOMUX_PAD(0x47c, 0x0e8, 1, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_EIM_CS2__USBOTG_STP           IOMUX_PAD(0x47c, 0x0e8, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_CS3__AUD5_RXD             IOMUX_PAD(0x480, 0x0ec, 6, 0x8d4, 1, NO_PAD_CTRL)
-#define MX51_PAD_EIM_CS3__CSI1_D5              IOMUX_PAD(0x480, 0x0ec, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_CS3__EIM_CS3              IOMUX_PAD(0x480, 0x0ec, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_CS3__FEC_RDATA3           IOMUX_PAD(0x480, 0x0ec, 3, 0x964, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_CS3__GPIO2_28             IOMUX_PAD(0x480, 0x0ec, 1, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_EIM_CS3__USBOTG_NXT           IOMUX_PAD(0x480, 0x0ec, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_CS4__AUD5_TXC             IOMUX_PAD(0x484, 0x0f0, 6, 0x8e4, 1, NO_PAD_CTRL)
-#define MX51_PAD_EIM_CS4__CSI1_D6              IOMUX_PAD(0x484, 0x0f0, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_CS4__EIM_CS4              IOMUX_PAD(0x484, 0x0f0, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_CS4__FEC_RX_ER            IOMUX_PAD(0x484, 0x0f0, 3, 0x970, 0, MX51_PAD_CTRL_2)
-#define MX51_PAD_EIM_CS4__GPIO2_29             IOMUX_PAD(0x484, 0x0f0, 1, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_EIM_CS4__USBOTG_CLK           IOMUX_PAD(0x484, 0x0f0, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_CS5__AUD5_TXFS            IOMUX_PAD(0x488, 0x0f4, 6, 0x8e8, 1, NO_PAD_CTRL)
-#define MX51_PAD_EIM_CS5__CSI1_D7              IOMUX_PAD(0x488, 0x0f4, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_CS5__DISP1_EXT_CLK                IOMUX_PAD(0x488, 0x0f4, 4, 0x904, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_CS5__EIM_CS5              IOMUX_PAD(0x488, 0x0f4, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_CS5__FEC_CRS              IOMUX_PAD(0x488, 0x0f4, 3, 0x950, 0, MX51_PAD_CTRL_2)
-#define MX51_PAD_EIM_CS5__GPIO2_30             IOMUX_PAD(0x488, 0x0f4, 1, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_EIM_CS5__USBOTG_DIR           IOMUX_PAD(0x488, 0x0f4, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_DTACK__EIM_DTACK          IOMUX_PAD(0x48c, 0x0f8, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_DTACK__GPIO2_31           IOMUX_PAD(0x48c, 0x0f8, 1, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_EIM_LBA__EIM_LBA              IOMUX_PAD(0x494, 0x0fc, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_LBA__GPIO3_1              IOMUX_PAD(0x494, 0x0fc, 1, 0x978, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_EIM_CRE__EIM_CRE              IOMUX_PAD(0x4a0, 0x100, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_CRE__GPIO3_2              IOMUX_PAD(0x4a0, 0x100, 1, 0x97c, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_DRAM_CS1__DRAM_CS1            IOMUX_PAD(0x4d0, 0x104, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DRAM_CS1__CCM_CLKO            IOMUX_PAD(0x4d0, 0x104, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_WE_B__GPIO3_3           IOMUX_PAD(0x4e4, 0x108, 3, 0x980, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_NANDF_WE_B__NANDF_WE_B                IOMUX_PAD(0x4e4, 0x108, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_WE_B__PATA_DIOW         IOMUX_PAD(0x4e4, 0x108, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_WE_B__SD3_DATA0         IOMUX_PAD(0x4e4, 0x108, 2, 0x93c, 0, MX51_SDHCI_PAD_CTRL)
-#define MX51_PAD_NANDF_RE_B__GPIO3_4           IOMUX_PAD(0x4e8, 0x10c, 3, 0x984, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_NANDF_RE_B__NANDF_RE_B                IOMUX_PAD(0x4e8, 0x10c, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_RE_B__PATA_DIOR         IOMUX_PAD(0x4e8, 0x10c, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_RE_B__SD3_DATA1         IOMUX_PAD(0x4e8, 0x10c, 2, 0x940, 0, MX51_SDHCI_PAD_CTRL)
-#define MX51_PAD_NANDF_ALE__GPIO3_5            IOMUX_PAD(0x4ec, 0x110, 3, 0x988, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_NANDF_ALE__NANDF_ALE          IOMUX_PAD(0x4ec, 0x110, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_ALE__PATA_BUFFER_EN     IOMUX_PAD(0x4ec, 0x110, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_CLE__GPIO3_6            IOMUX_PAD(0x4f0, 0x114, 3, 0x98c, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_NANDF_CLE__NANDF_CLE          IOMUX_PAD(0x4f0, 0x114, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_CLE__PATA_RESET_B       IOMUX_PAD(0x4f0, 0x114, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_WP_B__GPIO3_7           IOMUX_PAD(0x4f4, 0x118, 3, 0x990, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_NANDF_WP_B__NANDF_WP_B                IOMUX_PAD(0x4f4, 0x118, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_WP_B__PATA_DMACK                IOMUX_PAD(0x4f4, 0x118, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_WP_B__SD3_DATA2         IOMUX_PAD(0x4f4, 0x118, 2, 0x944, 0, MX51_SDHCI_PAD_CTRL)
-#define MX51_PAD_NANDF_RB0__ECSPI2_SS1         IOMUX_PAD(0x4f8, 0x11c, 5, 0x930, 0, MX51_ECSPI_PAD_CTRL)
-#define MX51_PAD_NANDF_RB0__GPIO3_8            IOMUX_PAD(0x4f8, 0x11c, 3, 0x994, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_NANDF_RB0__NANDF_RB0          IOMUX_PAD(0x4f8, 0x11c, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_RB0__PATA_DMARQ         IOMUX_PAD(0x4f8, 0x11c, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_RB0__SD3_DATA3          IOMUX_PAD(0x4f8, 0x11c, 2, 0x948, 0, MX51_SDHCI_PAD_CTRL)
-#define MX51_PAD_NANDF_RB1__CSPI_MOSI          IOMUX_PAD(0x4fc, 0x120, 6, 0x91c, 0, MX51_ECSPI_PAD_CTRL)
-#define MX51_PAD_NANDF_RB1__ECSPI2_RDY         IOMUX_PAD(0x4fc, 0x120, 2, __NA_, 0, MX51_ECSPI_PAD_CTRL)
-#define MX51_PAD_NANDF_RB1__GPIO3_9            IOMUX_PAD(0x4fc, 0x120, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_NANDF_RB1__NANDF_RB1          IOMUX_PAD(0x4fc, 0x120, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_RB1__PATA_IORDY         IOMUX_PAD(0x4fc, 0x120, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_RB1__GPT_CMPOUT2                IOMUX_PAD(0x4fc, 0x120, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_RB1__SD4_CMD            IOMUX_PAD(0x4fc, 0x120, 0x15, __NA_, 0, MX51_SDHCI_PAD_CTRL)
-#define MX51_PAD_NANDF_RB2__DISP2_WAIT         IOMUX_PAD(0x500, 0x124, 5, 0x9a8, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_RB2__ECSPI2_SCLK                IOMUX_PAD(0x500, 0x124, 2, __NA_, 0, MX51_ECSPI_PAD_CTRL)
-#define MX51_PAD_NANDF_RB2__FEC_COL            IOMUX_PAD(0x500, 0x124, 1, 0x94c, 0, MX51_PAD_CTRL_2)
-#define MX51_PAD_NANDF_RB2__GPIO3_10           IOMUX_PAD(0x500, 0x124, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_NANDF_RB2__NANDF_RB2          IOMUX_PAD(0x500, 0x124, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_RB2__GPT_CMPOUT3                IOMUX_PAD(0x500, 0x124, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_RB2__USBH3_H3_DP                IOMUX_PAD(0x500, 0x124, 0x17, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_RB2__USBH3_NXT          IOMUX_PAD(0x500, 0x124, 6, 0xa20, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_RB3__DISP1_WAIT         IOMUX_PAD(0x504, 0x128, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_RB3__ECSPI2_MISO                IOMUX_PAD(0x504, 0x128, 2, __NA_, 0, MX51_ECSPI_PAD_CTRL)
-#define MX51_PAD_NANDF_RB3__FEC_RX_CLK         IOMUX_PAD(0x504, 0x128, 1, 0x968, 0, MX51_PAD_CTRL_2)
-#define MX51_PAD_NANDF_RB3__GPIO3_11           IOMUX_PAD(0x504, 0x128, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_NANDF_RB3__NANDF_RB3          IOMUX_PAD(0x504, 0x128, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_RB3__USBH3_CLK          IOMUX_PAD(0x504, 0x128, 6, 0x9f8, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_RB3__USBH3_H3_DM                IOMUX_PAD(0x504, 0x128, 0x17, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_GPIO_NAND__GPIO_NAND          IOMUX_PAD(0x514, 0x12c, 0, 0x998, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_GPIO_NAND__PATA_INTRQ         IOMUX_PAD(0x514, 0x12c, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_CS0__GPIO3_16           IOMUX_PAD(0x518, 0x130, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_NANDF_CS0__NANDF_CS0          IOMUX_PAD(0x518, 0x130, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_CS1__GPIO3_17           IOMUX_PAD(0x51c, 0x134, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_NANDF_CS1__NANDF_CS1          IOMUX_PAD(0x51c, 0x134, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_CS2__CSPI_SCLK          IOMUX_PAD(0x520, 0x138, 6, 0x914, 0, MX51_ECSPI_PAD_CTRL)
-#define MX51_PAD_NANDF_CS2__FEC_TX_ER          IOMUX_PAD(0x520, 0x138, 2, __NA_, 0, MX51_PAD_CTRL_5)
-#define MX51_PAD_NANDF_CS2__GPIO3_18           IOMUX_PAD(0x520, 0x138, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_NANDF_CS2__NANDF_CS2          IOMUX_PAD(0x520, 0x138, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_CS2__PATA_CS_0          IOMUX_PAD(0x520, 0x138, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_CS2__SD4_CLK            IOMUX_PAD(0x520, 0x138, 5, __NA_, 0, MX51_SDHCI_PAD_CTRL | PAD_CTL_HYS)
-#define MX51_PAD_NANDF_CS2__USBH3_H1_DP                IOMUX_PAD(0x520, 0x138, 0x17, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_CS3__FEC_MDC            IOMUX_PAD(0x524, 0x13c, 2, __NA_, 0, MX51_PAD_CTRL_5)
-#define MX51_PAD_NANDF_CS3__GPIO3_19           IOMUX_PAD(0x524, 0x13c, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_NANDF_CS3__NANDF_CS3          IOMUX_PAD(0x524, 0x13c, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_CS3__PATA_CS_1          IOMUX_PAD(0x524, 0x13c, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_CS3__SD4_DAT0           IOMUX_PAD(0x524, 0x13c, 5, __NA_, 0, MX51_SDHCI_PAD_CTRL)
-#define MX51_PAD_NANDF_CS3__USBH3_H1_DM                IOMUX_PAD(0x524, 0x13c, 0x17, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_CS4__FEC_TDATA1         IOMUX_PAD(0x528, 0x140, 2, __NA_, 0, MX51_PAD_CTRL_5)
-#define MX51_PAD_NANDF_CS4__GPIO3_20           IOMUX_PAD(0x528, 0x140, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_NANDF_CS4__NANDF_CS4          IOMUX_PAD(0x528, 0x140, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_CS4__PATA_DA_0          IOMUX_PAD(0x528, 0x140, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_CS4__SD4_DAT1           IOMUX_PAD(0x528, 0x140, 5, __NA_, 0, MX51_SDHCI_PAD_CTRL)
-#define MX51_PAD_NANDF_CS4__USBH3_STP          IOMUX_PAD(0x528, 0x140, 7, 0xa24, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_CS5__FEC_TDATA2         IOMUX_PAD(0x52c, 0x144, 2, __NA_, 0, MX51_PAD_CTRL_5)
-#define MX51_PAD_NANDF_CS5__GPIO3_21           IOMUX_PAD(0x52c, 0x144, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_NANDF_CS5__NANDF_CS5          IOMUX_PAD(0x52c, 0x144, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_CS5__PATA_DA_1          IOMUX_PAD(0x52c, 0x144, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_CS5__SD4_DAT2           IOMUX_PAD(0x52c, 0x144, 5, __NA_, 0, MX51_SDHCI_PAD_CTRL)
-#define MX51_PAD_NANDF_CS5__USBH3_DIR          IOMUX_PAD(0x52c, 0x144, 7, 0xa1c, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_CS6__CSPI_SS3           IOMUX_PAD(0x530, 0x148, 7, 0x928, 0, MX51_ECSPI_PAD_CTRL)
-#define MX51_PAD_NANDF_CS6__FEC_TDATA3         IOMUX_PAD(0x530, 0x148, 2, __NA_, 0, MX51_PAD_CTRL_5)
-#define MX51_PAD_NANDF_CS6__GPIO3_22           IOMUX_PAD(0x530, 0x148, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_NANDF_CS6__NANDF_CS6          IOMUX_PAD(0x530, 0x148, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_CS6__PATA_DA_2          IOMUX_PAD(0x530, 0x148, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_CS6__SD4_DAT3           IOMUX_PAD(0x530, 0x148, 5, __NA_, 0, MX51_SDHCI_PAD_CTRL)
-#define MX51_PAD_NANDF_CS7__FEC_TX_EN          IOMUX_PAD(0x534, 0x14c, 1, __NA_, 0, MX51_PAD_CTRL_5)
-#define MX51_PAD_NANDF_CS7__GPIO3_23           IOMUX_PAD(0x534, 0x14c, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_NANDF_CS7__NANDF_CS7          IOMUX_PAD(0x534, 0x14c, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_CS7__SD3_CLK            IOMUX_PAD(0x534, 0x14c, 5, __NA_, 0, MX51_SDHCI_PAD_CTRL | PAD_CTL_HYS)
-#define MX51_PAD_NANDF_RDY_INT__ECSPI2_SS0     IOMUX_PAD(0x538, 0x150, 2, __NA_, 0, MX51_ECSPI_PAD_CTRL)
-#define MX51_PAD_NANDF_RDY_INT__FEC_TX_CLK     IOMUX_PAD(0x538, 0x150, 1, 0x974, 0, MX51_PAD_CTRL_4)
-#define MX51_PAD_NANDF_RDY_INT__GPIO3_24       IOMUX_PAD(0x538, 0x150, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_NANDF_RDY_INT__NANDF_RDY_INT  IOMUX_PAD(0x538, 0x150, 0, 0x938, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_RDY_INT__SD3_CMD                IOMUX_PAD(0x538, 0x150, 0x15, __NA_, 0, MX51_SDHCI_PAD_CTRL)
-#define MX51_PAD_NANDF_D15__ECSPI2_MOSI                IOMUX_PAD(0x53c, 0x154, 2, __NA_, 0, MX51_ECSPI_PAD_CTRL)
-#define MX51_PAD_NANDF_D15__GPIO3_25           IOMUX_PAD(0x53c, 0x154, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_NANDF_D15__NANDF_D15          IOMUX_PAD(0x53c, 0x154, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D15__PATA_DATA15                IOMUX_PAD(0x53c, 0x154, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D15__SD3_DAT7           IOMUX_PAD(0x53c, 0x154, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D14__ECSPI2_SS3         IOMUX_PAD(0x540, 0x158, 2, 0x934, 0, MX51_ECSPI_PAD_CTRL)
-#define MX51_PAD_NANDF_D14__GPIO3_26           IOMUX_PAD(0x540, 0x158, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_NANDF_D14__NANDF_D14          IOMUX_PAD(0x540, 0x158, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D14__PATA_DATA14                IOMUX_PAD(0x540, 0x158, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D14__SD3_DAT6           IOMUX_PAD(0x540, 0x158, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D13__ECSPI2_SS2         IOMUX_PAD(0x544, 0x15c, 2, __NA_, 0, MX51_ECSPI_PAD_CTRL)
-#define MX51_PAD_NANDF_D13__GPIO3_27           IOMUX_PAD(0x544, 0x15c, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_NANDF_D13__NANDF_D13          IOMUX_PAD(0x544, 0x15c, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D13__PATA_DATA13                IOMUX_PAD(0x544, 0x15c, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D13__SD3_DAT5           IOMUX_PAD(0x544, 0x15c, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D12__ECSPI2_SS1         IOMUX_PAD(0x548, 0x160, 2, 0x930, 1, MX51_ECSPI_PAD_CTRL)
-#define MX51_PAD_NANDF_D12__GPIO3_28           IOMUX_PAD(0x548, 0x160, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_NANDF_D12__NANDF_D12          IOMUX_PAD(0x548, 0x160, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D12__PATA_DATA12                IOMUX_PAD(0x548, 0x160, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D12__SD3_DAT4           IOMUX_PAD(0x548, 0x160, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D11__FEC_RX_DV          IOMUX_PAD(0x54c, 0x164, 2, 0x96c, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D11__GPIO3_29           IOMUX_PAD(0x54c, 0x164, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_NANDF_D11__NANDF_D11          IOMUX_PAD(0x54c, 0x164, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D11__PATA_DATA11                IOMUX_PAD(0x54c, 0x164, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D11__SD3_DATA3          IOMUX_PAD(0x54c, 0x164, 5, 0x948, 1, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D10__GPIO3_30           IOMUX_PAD(0x550, 0x168, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_NANDF_D10__NANDF_D10          IOMUX_PAD(0x550, 0x168, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D10__PATA_DATA10                IOMUX_PAD(0x550, 0x168, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D10__SD3_DATA2          IOMUX_PAD(0x550, 0x168, 5, 0x944, 1, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D9__FEC_RDATA0          IOMUX_PAD(0x554, 0x16c, 0x12, 0x958, 0, MX51_PAD_CTRL_4)
-#define MX51_PAD_NANDF_D9__GPIO3_31            IOMUX_PAD(0x554, 0x16c, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_NANDF_D9__NANDF_D9            IOMUX_PAD(0x554, 0x16c, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D9__PATA_DATA9          IOMUX_PAD(0x554, 0x16c, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D9__SD3_DATA1           IOMUX_PAD(0x554, 0x16c, 5, 0x940, 1, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D8__FEC_TDATA0          IOMUX_PAD(0x558, 0x170, 2, __NA_, 0, MX51_PAD_CTRL_5)
-#define MX51_PAD_NANDF_D8__GPIO4_0             IOMUX_PAD(0x558, 0x170, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_NANDF_D8__NANDF_D8            IOMUX_PAD(0x558, 0x170, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D8__PATA_DATA8          IOMUX_PAD(0x558, 0x170, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D8__SD3_DATA0           IOMUX_PAD(0x558, 0x170, 5, 0x93c, 1, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D7__GPIO4_1             IOMUX_PAD(0x55c, 0x174, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_NANDF_D7__NANDF_D7            IOMUX_PAD(0x55c, 0x174, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D7__PATA_DATA7          IOMUX_PAD(0x55c, 0x174, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D7__USBH3_DATA0         IOMUX_PAD(0x55c, 0x174, 5, 0x9fc, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D6__GPIO4_2             IOMUX_PAD(0x560, 0x178, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_NANDF_D6__NANDF_D6            IOMUX_PAD(0x560, 0x178, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D6__PATA_DATA6          IOMUX_PAD(0x560, 0x178, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D6__SD4_LCTL            IOMUX_PAD(0x560, 0x178, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D6__USBH3_DATA1         IOMUX_PAD(0x560, 0x178, 5, 0xa00, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D5__GPIO4_3             IOMUX_PAD(0x564, 0x17c, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_NANDF_D5__NANDF_D5            IOMUX_PAD(0x564, 0x17c, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D5__PATA_DATA5          IOMUX_PAD(0x564, 0x17c, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D5__SD4_WP              IOMUX_PAD(0x564, 0x17c, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D5__USBH3_DATA2         IOMUX_PAD(0x564, 0x17c, 5, 0xa04, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D4__GPIO4_4             IOMUX_PAD(0x568, 0x180, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_NANDF_D4__NANDF_D4            IOMUX_PAD(0x568, 0x180, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D4__PATA_DATA4          IOMUX_PAD(0x568, 0x180, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D4__SD4_CD              IOMUX_PAD(0x568, 0x180, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D4__USBH3_DATA3         IOMUX_PAD(0x568, 0x180, 5, 0xa08, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D3__GPIO4_5             IOMUX_PAD(0x56c, 0x184, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_NANDF_D3__NANDF_D3            IOMUX_PAD(0x56c, 0x184, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D3__PATA_DATA3          IOMUX_PAD(0x56c, 0x184, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D3__SD4_DAT4            IOMUX_PAD(0x56c, 0x184, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D3__USBH3_DATA4         IOMUX_PAD(0x56c, 0x184, 5, 0xa0c, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D2__GPIO4_6             IOMUX_PAD(0x570, 0x188, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_NANDF_D2__NANDF_D2            IOMUX_PAD(0x570, 0x188, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D2__PATA_DATA2          IOMUX_PAD(0x570, 0x188, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D2__SD4_DAT5            IOMUX_PAD(0x570, 0x188, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D2__USBH3_DATA5         IOMUX_PAD(0x570, 0x188, 5, 0xa10, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D1__GPIO4_7             IOMUX_PAD(0x574, 0x18c, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_NANDF_D1__NANDF_D1            IOMUX_PAD(0x574, 0x18c, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D1__PATA_DATA1          IOMUX_PAD(0x574, 0x18c, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D1__SD4_DAT6            IOMUX_PAD(0x574, 0x18c, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D1__USBH3_DATA6         IOMUX_PAD(0x574, 0x18c, 5, 0xa14, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D0__GPIO4_8             IOMUX_PAD(0x578, 0x190, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_NANDF_D0__NANDF_D0            IOMUX_PAD(0x578, 0x190, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D0__PATA_DATA0          IOMUX_PAD(0x578, 0x190, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D0__SD4_DAT7            IOMUX_PAD(0x578, 0x190, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_NANDF_D0__USBH3_DATA7         IOMUX_PAD(0x578, 0x190, 5, 0xa18, 0, NO_PAD_CTRL)
-#define MX51_PAD_CSI1_D8__CSI1_D8              IOMUX_PAD(0x57c, 0x194, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_CSI1_D8__GPIO3_12             IOMUX_PAD(0x57c, 0x194, 3, 0x998, 1, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_CSI1_D9__CSI1_D9              IOMUX_PAD(0x580, 0x198, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_CSI1_D9__GPIO3_13             IOMUX_PAD(0x580, 0x198, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_CSI1_D10__CSI1_D10            IOMUX_PAD(0x584, 0x19c, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_CSI1_D11__CSI1_D11            IOMUX_PAD(0x588, 0x1a0, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_CSI1_D12__CSI1_D12            IOMUX_PAD(0x58c, 0x1a4, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_CSI1_D13__CSI1_D13            IOMUX_PAD(0x590, 0x1a8, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_CSI1_D14__CSI1_D14            IOMUX_PAD(0x594, 0x1ac, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_CSI1_D15__CSI1_D15            IOMUX_PAD(0x598, 0x1b0, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_CSI1_D16__CSI1_D16            IOMUX_PAD(0x59c, 0x1b4, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_CSI1_D17__CSI1_D17            IOMUX_PAD(0x5a0, 0x1b8, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_CSI1_D18__CSI1_D18            IOMUX_PAD(0x5a4, 0x1bc, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_CSI1_D19__CSI1_D19            IOMUX_PAD(0x5a8, 0x1c0, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_CSI1_VSYNC__CSI1_VSYNC                IOMUX_PAD(0x5ac, 0x1c4, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_CSI1_VSYNC__GPIO3_14          IOMUX_PAD(0x5ac, 0x1c4, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_CSI1_HSYNC__CSI1_HSYNC                IOMUX_PAD(0x5b0, 0x1c8, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_CSI1_HSYNC__GPIO3_15          IOMUX_PAD(0x5b0, 0x1c8, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_CSI1_PIXCLK__CSI1_PIXCLK      IOMUX_PAD(0x5b4, __NA_, 0, 0x000, 0, NO_PAD_CTRL)
-#define MX51_PAD_CSI1_MCLK__CSI1_MCLK          IOMUX_PAD(0x5b8, __NA_, 0, 0x000, 0, NO_PAD_CTRL)
-#define MX51_PAD_CSI2_D12__CSI2_D12            IOMUX_PAD(0x5bc, 0x1cc, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_CSI2_D12__GPIO4_9             IOMUX_PAD(0x5bc, 0x1cc, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_CSI2_D13__CSI2_D13            IOMUX_PAD(0x5c0, 0x1d0, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_CSI2_D13__GPIO4_10            IOMUX_PAD(0x5c0, 0x1d0, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_CSI2_D14__CSI2_D14            IOMUX_PAD(0x5c4, 0x1d4, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_CSI2_D15__CSI2_D15            IOMUX_PAD(0x5c8, 0x1d8, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_CSI2_D16__CSI2_D16            IOMUX_PAD(0x5cc, 0x1dc, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_CSI2_D17__CSI2_D17            IOMUX_PAD(0x5d0, 0x1e0, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_CSI2_D18__CSI2_D18            IOMUX_PAD(0x5d4, 0x1e4, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_CSI2_D18__GPIO4_11            IOMUX_PAD(0x5d4, 0x1e4, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_CSI2_D19__CSI2_D19            IOMUX_PAD(0x5d8, 0x1e8, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_CSI2_D19__GPIO4_12            IOMUX_PAD(0x5d8, 0x1e8, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_CSI2_VSYNC__CSI2_VSYNC                IOMUX_PAD(0x5dc, 0x1ec, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_CSI2_VSYNC__GPIO4_13          IOMUX_PAD(0x5dc, 0x1ec, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_CSI2_HSYNC__CSI2_HSYNC                IOMUX_PAD(0x5e0, 0x1f0, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_CSI2_HSYNC__GPIO4_14          IOMUX_PAD(0x5e0, 0x1f0, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_CSI2_PIXCLK__CSI2_PIXCLK      IOMUX_PAD(0x5e4, 0x1f4, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_CSI2_PIXCLK__GPIO4_15         IOMUX_PAD(0x5e4, 0x1f4, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_I2C1_CLK__GPIO4_16            IOMUX_PAD(0x5e8, 0x1f8, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_I2C1_CLK__I2C1_CLK            IOMUX_PAD(0x5e8, 0x1f8, 0x10, __NA_, 0, MX51_I2C_PAD_CTRL)
-#define MX51_PAD_I2C1_DAT__GPIO4_17            IOMUX_PAD(0x5ec, 0x1fc, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_I2C1_DAT__I2C1_DAT            IOMUX_PAD(0x5ec, 0x1fc, 0x10, __NA_, 0, MX51_I2C_PAD_CTRL)
-#define MX51_PAD_AUD3_BB_TXD__AUD3_TXD         IOMUX_PAD(0x5f0, 0x200, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_AUD3_BB_TXD__GPIO4_18         IOMUX_PAD(0x5f0, 0x200, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_AUD3_BB_RXD__AUD3_RXD         IOMUX_PAD(0x5f4, 0x204, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_AUD3_BB_RXD__GPIO4_19         IOMUX_PAD(0x5f4, 0x204, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_AUD3_BB_RXD__UART3_RXD                IOMUX_PAD(0x5f4, 0x204, 1, 0x9f4, 2, MX51_UART_PAD_CTRL)
-#define MX51_PAD_AUD3_BB_CK__AUD3_TXC          IOMUX_PAD(0x5f8, 0x208, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_AUD3_BB_CK__GPIO4_20          IOMUX_PAD(0x5f8, 0x208, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_AUD3_BB_FS__AUD3_TXFS         IOMUX_PAD(0x5fc, 0x20c, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_AUD3_BB_FS__GPIO4_21          IOMUX_PAD(0x5fc, 0x20c, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_AUD3_BB_FS__UART3_TXD         IOMUX_PAD(0x5fc, 0x20c, 1, __NA_, 0, MX51_UART_PAD_CTRL)
-#define MX51_PAD_CSPI1_MOSI__ECSPI1_MOSI       IOMUX_PAD(0x600, 0x210, 0, __NA_, 0, MX51_ECSPI_PAD_CTRL)
-#define MX51_PAD_CSPI1_MOSI__GPIO4_22          IOMUX_PAD(0x600, 0x210, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_CSPI1_MOSI__I2C1_SDA          IOMUX_PAD(0x600, 0x210, 0x11, 0x9b4, 1, MX51_I2C_PAD_CTRL)
-#define MX51_PAD_CSPI1_MISO__AUD4_RXD          IOMUX_PAD(0x604, 0x214, 1, 0x8c4, 1, NO_PAD_CTRL)
-#define MX51_PAD_CSPI1_MISO__ECSPI1_MISO       IOMUX_PAD(0x604, 0x214, 0, __NA_, 0, MX51_ECSPI_PAD_CTRL)
-#define MX51_PAD_CSPI1_MISO__GPIO4_23          IOMUX_PAD(0x604, 0x214, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_CSPI1_SS0__AUD4_TXC           IOMUX_PAD(0x608, 0x218, 1, 0x8cc, 1, NO_PAD_CTRL)
-#define MX51_PAD_CSPI1_SS0__ECSPI1_SS0         IOMUX_PAD(0x608, 0x218, 0, __NA_, 0, MX51_ECSPI_PAD_CTRL)
-#define MX51_PAD_CSPI1_SS0__GPIO4_24           IOMUX_PAD(0x608, 0x218, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_CSPI1_SS1__AUD4_TXD           IOMUX_PAD(0x60c, 0x21c, 1, 0x8c8, 1, NO_PAD_CTRL)
-#define MX51_PAD_CSPI1_SS1__ECSPI1_SS1         IOMUX_PAD(0x60c, 0x21c, 0, __NA_, 0, MX51_ECSPI_PAD_CTRL)
-#define MX51_PAD_CSPI1_SS1__GPIO4_25           IOMUX_PAD(0x60c, 0x21c, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_CSPI1_RDY__AUD4_TXFS          IOMUX_PAD(0x610, 0x220, 1, 0x8d0, 1, NO_PAD_CTRL)
-#define MX51_PAD_CSPI1_RDY__ECSPI1_RDY         IOMUX_PAD(0x610, 0x220, 0, __NA_, 0, MX51_ECSPI_PAD_CTRL)
-#define MX51_PAD_CSPI1_RDY__GPIO4_26           IOMUX_PAD(0x610, 0x220, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_CSPI1_SCLK__ECSPI1_SCLK       IOMUX_PAD(0x614, 0x224, 0, __NA_, 0, MX51_ECSPI_PAD_CTRL)
-#define MX51_PAD_CSPI1_SCLK__GPIO4_27          IOMUX_PAD(0x614, 0x224, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_CSPI1_SCLK__I2C1_SCL          IOMUX_PAD(0x614, 0x224, 0x11, 0x9b0, 1, MX51_I2C_PAD_CTRL)
-#define MX51_PAD_UART1_RXD__GPIO4_28           IOMUX_PAD(0x618, 0x228, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_UART1_RXD__UART1_RXD          IOMUX_PAD(0x618, 0x228, 0, 0x9e4, 0, MX51_UART_PAD_CTRL)
-#define MX51_PAD_UART1_TXD__GPIO4_29           IOMUX_PAD(0x61c, 0x22c, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_UART1_TXD__PWM2_PWMO          IOMUX_PAD(0x61c, 0x22c, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_UART1_TXD__UART1_TXD          IOMUX_PAD(0x61c, 0x22c, 0, __NA_, 0, MX51_UART_PAD_CTRL)
-#define MX51_PAD_UART1_RTS__GPIO4_30           IOMUX_PAD(0x620, 0x230, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_UART1_RTS__UART1_RTS          IOMUX_PAD(0x620, 0x230, 0, 0x9e0, 0, MX51_UART_PAD_CTRL)
-#define MX51_PAD_UART1_CTS__GPIO4_31           IOMUX_PAD(0x624, 0x234, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_UART1_CTS__UART1_CTS          IOMUX_PAD(0x624, 0x234, 0, __NA_, 0, MX51_UART_PAD_CTRL)
-#define MX51_PAD_UART2_RXD__FIRI_TXD           IOMUX_PAD(0x628, 0x238, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_UART2_RXD__GPIO1_20           IOMUX_PAD(0x628, 0x238, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_UART2_RXD__UART2_RXD          IOMUX_PAD(0x628, 0x238, 0, 0x9ec, 2, MX51_UART_PAD_CTRL)
-#define MX51_PAD_UART2_TXD__FIRI_RXD           IOMUX_PAD(0x62c, 0x23c, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_UART2_TXD__GPIO1_21           IOMUX_PAD(0x62c, 0x23c, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_UART2_TXD__UART2_TXD          IOMUX_PAD(0x62c, 0x23c, 0, __NA_, 0, MX51_UART_PAD_CTRL)
-#define MX51_PAD_UART3_RXD__CSI1_D0            IOMUX_PAD(0x630, 0x240, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_UART3_RXD__GPIO1_22           IOMUX_PAD(0x630, 0x240, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_UART3_RXD__UART1_DTR          IOMUX_PAD(0x630, 0x240, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_UART3_RXD__UART3_RXD          IOMUX_PAD(0x630, 0x240, 1, 0x9f4, 4, MX51_UART_PAD_CTRL)
-#define MX51_PAD_UART3_TXD__CSI1_D1            IOMUX_PAD(0x634, 0x244, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_UART3_TXD__GPIO1_23           IOMUX_PAD(0x634, 0x244, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_UART3_TXD__UART1_DSR          IOMUX_PAD(0x634, 0x244, 0, __NA_, 0, MX51_UART_PAD_CTRL)
-#define MX51_PAD_UART3_TXD__UART3_TXD          IOMUX_PAD(0x634, 0x244, 1, __NA_, 0, MX51_UART_PAD_CTRL)
-#define MX51_PAD_OWIRE_LINE__GPIO1_24          IOMUX_PAD(0x638, 0x248, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_OWIRE_LINE__OWIRE_LINE                IOMUX_PAD(0x638, 0x248, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_OWIRE_LINE__SPDIF_OUT         IOMUX_PAD(0x638, 0x248, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_KEY_ROW0__KEY_ROW0            IOMUX_PAD(0x63c, 0x24c, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_KEY_ROW1__KEY_ROW1            IOMUX_PAD(0x640, 0x250, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_KEY_ROW2__KEY_ROW2            IOMUX_PAD(0x644, 0x254, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_KEY_ROW3__KEY_ROW3            IOMUX_PAD(0x648, 0x258, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_KEY_COL0__KEY_COL0            IOMUX_PAD(0x64c, 0x25c, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_KEY_COL0__PLL1_BYP            IOMUX_PAD(0x64c, 0x25c, 7, 0x90c, 0, NO_PAD_CTRL)
-#define MX51_PAD_KEY_COL1__KEY_COL1            IOMUX_PAD(0x650, 0x260, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_KEY_COL1__PLL2_BYP            IOMUX_PAD(0x650, 0x260, 7, 0x910, 0, NO_PAD_CTRL)
-#define MX51_PAD_KEY_COL2__KEY_COL2            IOMUX_PAD(0x654, 0x264, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_KEY_COL2__PLL3_BYP            IOMUX_PAD(0x654, 0x264, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_KEY_COL3__KEY_COL3            IOMUX_PAD(0x658, 0x268, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_KEY_COL4__I2C2_SCL            IOMUX_PAD(0x65c, 0x26c, 0x13, 0x9b8, 1, MX51_I2C_PAD_CTRL)
-#define MX51_PAD_KEY_COL4__KEY_COL4            IOMUX_PAD(0x65c, 0x26c, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_KEY_COL4__SPDIF_OUT1          IOMUX_PAD(0x65c, 0x26c, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_KEY_COL4__UART1_RI            IOMUX_PAD(0x65c, 0x26c, 1, __NA_, 0, MX51_UART_PAD_CTRL)
-#define MX51_PAD_KEY_COL4__UART3_RTS           IOMUX_PAD(0x65c, 0x26c, 2, 0x9f0, 4, MX51_UART_PAD_CTRL)
-#define MX51_PAD_KEY_COL5__I2C2_SDA            IOMUX_PAD(0x660, 0x270, 0x13, 0x9bc, 1, MX51_I2C_PAD_CTRL)
-#define MX51_PAD_KEY_COL5__KEY_COL5            IOMUX_PAD(0x660, 0x270, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_KEY_COL5__UART1_DCD           IOMUX_PAD(0x660, 0x270, 1, __NA_, 0, MX51_UART_PAD_CTRL)
-#define MX51_PAD_KEY_COL5__UART3_CTS           IOMUX_PAD(0x660, 0x270, 2, __NA_, 0, MX51_UART_PAD_CTRL)
-#define MX51_PAD_USBH1_CLK__CSPI_SCLK          IOMUX_PAD(0x678, 0x278, 1, 0x914, 1, MX51_ECSPI_PAD_CTRL)
-#define MX51_PAD_USBH1_CLK__GPIO1_25           IOMUX_PAD(0x678, 0x278, 2, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_USBH1_CLK__I2C2_SCL           IOMUX_PAD(0x678, 0x278, 0x15, 0x9b8, 2, MX51_I2C_PAD_CTRL)
-#define MX51_PAD_USBH1_CLK__USBH1_CLK          IOMUX_PAD(0x678, 0x278, 0, __NA_, 0, MX51_USBH1_PAD_CTRL)
-#define MX51_PAD_USBH1_DIR__CSPI_MOSI          IOMUX_PAD(0x67c, 0x27c, 1, 0x91c, 1, MX51_ECSPI_PAD_CTRL)
-#define MX51_PAD_USBH1_DIR__GPIO1_26           IOMUX_PAD(0x67c, 0x27c, 2, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_USBH1_DIR__I2C2_SDA           IOMUX_PAD(0x67c, 0x27c, 0x15, 0x9bc, 2, MX51_I2C_PAD_CTRL)
-#define MX51_PAD_USBH1_DIR__USBH1_DIR          IOMUX_PAD(0x67c, 0x27c, 0, __NA_, 0, MX51_USBH1_PAD_CTRL)
-#define MX51_PAD_USBH1_STP__CSPI_RDY           IOMUX_PAD(0x680, 0x280, 1, __NA_, 0, MX51_ECSPI_PAD_CTRL)
-#define MX51_PAD_USBH1_STP__GPIO1_27           IOMUX_PAD(0x680, 0x280, 2, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_USBH1_STP__UART3_RXD          IOMUX_PAD(0x680, 0x280, 5, 0x9f4, 6, MX51_UART_PAD_CTRL)
-#define MX51_PAD_USBH1_STP__USBH1_STP          IOMUX_PAD(0x680, 0x280, 0, __NA_, 0, MX51_USBH1_PAD_CTRL)
-#define MX51_PAD_USBH1_NXT__CSPI_MISO          IOMUX_PAD(0x684, 0x284, 1, 0x918, 0, MX51_ECSPI_PAD_CTRL)
-#define MX51_PAD_USBH1_NXT__GPIO1_28           IOMUX_PAD(0x684, 0x284, 2, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_USBH1_NXT__UART3_TXD          IOMUX_PAD(0x684, 0x284, 5, __NA_, 0, MX51_UART_PAD_CTRL)
-#define MX51_PAD_USBH1_NXT__USBH1_NXT          IOMUX_PAD(0x684, 0x284, 0, __NA_, 0, MX51_USBH1_PAD_CTRL)
-#define MX51_PAD_USBH1_DATA0__GPIO1_11         IOMUX_PAD(0x688, 0x288, 2, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_USBH1_DATA0__UART2_CTS                IOMUX_PAD(0x688, 0x288, 1, __NA_, 0, MX51_UART_PAD_CTRL)
-#define MX51_PAD_USBH1_DATA0__USBH1_DATA0      IOMUX_PAD(0x688, 0x288, 0, __NA_, 0, MX51_USBH1_PAD_CTRL)
-#define MX51_PAD_USBH1_DATA1__GPIO1_12         IOMUX_PAD(0x68c, 0x28c, 2, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_USBH1_DATA1__UART2_RXD                IOMUX_PAD(0x68c, 0x28c, 1, 0x9ec, 4, MX51_UART_PAD_CTRL)
-#define MX51_PAD_USBH1_DATA1__USBH1_DATA1      IOMUX_PAD(0x68c, 0x28c, 0, __NA_, 0, MX51_USBH1_PAD_CTRL)
-#define MX51_PAD_USBH1_DATA2__GPIO1_13         IOMUX_PAD(0x690, 0x290, 2, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_USBH1_DATA2__UART2_TXD                IOMUX_PAD(0x690, 0x290, 1, __NA_, 0, MX51_UART_PAD_CTRL)
-#define MX51_PAD_USBH1_DATA2__USBH1_DATA2      IOMUX_PAD(0x690, 0x290, 0, __NA_, 0, MX51_USBH1_PAD_CTRL)
-#define MX51_PAD_USBH1_DATA3__GPIO1_14         IOMUX_PAD(0x694, 0x294, 2, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_USBH1_DATA3__UART2_RTS                IOMUX_PAD(0x694, 0x294, 1, 0x9e8, 5, MX51_UART_PAD_CTRL)
-#define MX51_PAD_USBH1_DATA3__USBH1_DATA3      IOMUX_PAD(0x694, 0x294, 0, __NA_, 0, MX51_USBH1_PAD_CTRL)
-#define MX51_PAD_USBH1_DATA4__CSPI_SS0         IOMUX_PAD(0x698, 0x298, 1, __NA_, 0, MX51_ECSPI_PAD_CTRL)
-#define MX51_PAD_USBH1_DATA4__GPIO1_15         IOMUX_PAD(0x698, 0x298, 2, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_USBH1_DATA4__USBH1_DATA4      IOMUX_PAD(0x698, 0x298, 0, __NA_, 0, MX51_USBH1_PAD_CTRL)
-#define MX51_PAD_USBH1_DATA5__CSPI_SS1         IOMUX_PAD(0x69c, 0x29c, 1, 0x920, 0, MX51_ECSPI_PAD_CTRL)
-#define MX51_PAD_USBH1_DATA5__GPIO1_16         IOMUX_PAD(0x69c, 0x29c, 2, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_USBH1_DATA5__USBH1_DATA5      IOMUX_PAD(0x69c, 0x29c, 0, __NA_, 0, MX51_USBH1_PAD_CTRL)
-#define MX51_PAD_USBH1_DATA6__CSPI_SS3         IOMUX_PAD(0x6a0, 0x2a0, 1, 0x928, 1, MX51_ECSPI_PAD_CTRL)
-#define MX51_PAD_USBH1_DATA6__GPIO1_17         IOMUX_PAD(0x6a0, 0x2a0, 2, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_USBH1_DATA6__USBH1_DATA6      IOMUX_PAD(0x6a0, 0x2a0, 0, __NA_, 0, MX51_USBH1_PAD_CTRL)
-#define MX51_PAD_USBH1_DATA7__ECSPI1_SS3       IOMUX_PAD(0x6a4, 0x2a4, 1, __NA_, 0, MX51_ECSPI_PAD_CTRL)
-#define MX51_PAD_USBH1_DATA7__ECSPI2_SS3       IOMUX_PAD(0x6a4, 0x2a4, 5, 0x934, 1, MX51_ECSPI_PAD_CTRL)
-#define MX51_PAD_USBH1_DATA7__GPIO1_18         IOMUX_PAD(0x6a4, 0x2a4, 2, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_USBH1_DATA7__USBH1_DATA7      IOMUX_PAD(0x6a4, 0x2a4, 0, __NA_, 0, MX51_USBH1_PAD_CTRL)
-#define MX51_PAD_DI1_PIN11__DI1_PIN11          IOMUX_PAD(0x6a8, 0x2a8, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DI1_PIN11__ECSPI1_SS2         IOMUX_PAD(0x6a8, 0x2a8, 7, __NA_, 0, MX51_ECSPI_PAD_CTRL)
-#define MX51_PAD_DI1_PIN11__GPIO3_0            IOMUX_PAD(0x6a8, 0x2a8, 4, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_DI1_PIN12__DI1_PIN12          IOMUX_PAD(0x6ac, 0x2ac, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DI1_PIN12__GPIO3_1            IOMUX_PAD(0x6ac, 0x2ac, 4, 0x978, 1, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_DI1_PIN13__DI1_PIN13          IOMUX_PAD(0x6b0, 0x2b0, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DI1_PIN13__GPIO3_2            IOMUX_PAD(0x6b0, 0x2b0, 4, 0x97c, 1, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_DI1_D0_CS__DI1_D0_CS          IOMUX_PAD(0x6b4, 0x2b4, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DI1_D0_CS__GPIO3_3            IOMUX_PAD(0x6b4, 0x2b4, 4, 0x980, 1, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_DI1_D1_CS__DI1_D1_CS          IOMUX_PAD(0x6b8, 0x2b8, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DI1_D1_CS__DISP1_PIN14                IOMUX_PAD(0x6b8, 0x2b8, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DI1_D1_CS__DISP1_PIN5         IOMUX_PAD(0x6b8, 0x2b8, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DI1_D1_CS__GPIO3_4            IOMUX_PAD(0x6b8, 0x2b8, 4, 0x984, 1, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_DISPB2_SER_DIN__DISP1_PIN1    IOMUX_PAD(0x6bc, 0x2bc, 2, 0x9a4, 1, NO_PAD_CTRL)
-#define MX51_PAD_DISPB2_SER_DIN__DISPB2_SER_DIN        IOMUX_PAD(0x6bc, 0x2bc, 0, 0x9c4, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISPB2_SER_DIN__GPIO3_5       IOMUX_PAD(0x6bc, 0x2bc, 4, 0x988, 1, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_DISPB2_SER_DIO__DISP1_PIN6    IOMUX_PAD(0x6c0, 0x2c0, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISPB2_SER_DIO__DISPB2_SER_DIO        IOMUX_PAD(0x6c0, 0x2c0, 0, 0x9c4, 1, NO_PAD_CTRL)
-#define MX51_PAD_DISPB2_SER_DIO__GPIO3_6       IOMUX_PAD(0x6c0, 0x2c0, 4, 0x98c, 1, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_DISPB2_SER_CLK__DISP1_PIN17   IOMUX_PAD(0x6c4, 0x2c4, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISPB2_SER_CLK__DISP1_PIN7    IOMUX_PAD(0x6c4, 0x2c4, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISPB2_SER_CLK__DISPB2_SER_CLK        IOMUX_PAD(0x6c4, 0x2c4, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISPB2_SER_CLK__GPIO3_7       IOMUX_PAD(0x6c4, 0x2c4, 4, 0x990, 1, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_DISPB2_SER_RS__DISP1_EXT_CLK  IOMUX_PAD(0x6c8, 0x2c8, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISPB2_SER_RS__DISP1_PIN16    IOMUX_PAD(0x6c8, 0x2c8, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISPB2_SER_RS__DISP1_PIN8     IOMUX_PAD(0x6c8, 0x2c8, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISPB2_SER_RS__DISPB2_SER_RS  IOMUX_PAD(0x6c8, 0x2c8, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISPB2_SER_RS__DISPB2_SER_RS  IOMUX_PAD(0x6c8, 0x2c8, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISPB2_SER_RS__GPIO3_8                IOMUX_PAD(0x6c8, 0x2c8, 4, 0x994, 1, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT0__DISP1_DAT0                IOMUX_PAD(0x6cc, 0x2cc, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT1__DISP1_DAT1                IOMUX_PAD(0x6d0, 0x2d0, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT2__DISP1_DAT2                IOMUX_PAD(0x6d4, 0x2d4, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT3__DISP1_DAT3                IOMUX_PAD(0x6d8, 0x2d8, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT4__DISP1_DAT4                IOMUX_PAD(0x6dc, 0x2dc, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT5__DISP1_DAT5                IOMUX_PAD(0x6e0, 0x2e0, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT6__BOOT_USB_SRC      IOMUX_PAD(0x6e4, 0x2e4, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT6__DISP1_DAT6                IOMUX_PAD(0x6e4, 0x2e4, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT7__BOOT_EEPROM_CFG   IOMUX_PAD(0x6e8, 0x2e8, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT7__DISP1_DAT7                IOMUX_PAD(0x6e8, 0x2e8, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT8__BOOT_SRC0         IOMUX_PAD(0x6ec, 0x2ec, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT8__DISP1_DAT8                IOMUX_PAD(0x6ec, 0x2ec, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT9__BOOT_SRC1         IOMUX_PAD(0x6f0, 0x2f0, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT9__DISP1_DAT9                IOMUX_PAD(0x6f0, 0x2f0, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT10__BOOT_SPARE_SIZE  IOMUX_PAD(0x6f4, 0x2f4, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT10__DISP1_DAT10      IOMUX_PAD(0x6f4, 0x2f4, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT11__BOOT_LPB_FREQ2   IOMUX_PAD(0x6f8, 0x2f8, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT11__DISP1_DAT11      IOMUX_PAD(0x6f8, 0x2f8, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT12__BOOT_MLC_SEL     IOMUX_PAD(0x6fc, 0x2fc, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT12__DISP1_DAT12      IOMUX_PAD(0x6fc, 0x2fc, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT13__BOOT_MEM_CTL0    IOMUX_PAD(0x700, 0x300, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT13__DISP1_DAT13      IOMUX_PAD(0x700, 0x300, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT14__BOOT_MEM_CTL1    IOMUX_PAD(0x704, 0x304, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT14__DISP1_DAT14      IOMUX_PAD(0x704, 0x304, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT15__BOOT_BUS_WIDTH   IOMUX_PAD(0x708, 0x308, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT15__DISP1_DAT15      IOMUX_PAD(0x708, 0x308, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT16__BOOT_PAGE_SIZE0  IOMUX_PAD(0x70c, 0x30c, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT16__DISP1_DAT16      IOMUX_PAD(0x70c, 0x30c, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT17__BOOT_PAGE_SIZE1  IOMUX_PAD(0x710, 0x310, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT17__DISP1_DAT17      IOMUX_PAD(0x710, 0x310, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT18__BOOT_WEIM_MUXED0 IOMUX_PAD(0x714, 0x314, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT18__DISP1_DAT18      IOMUX_PAD(0x714, 0x314, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT18__DISP2_PIN11      IOMUX_PAD(0x714, 0x314, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT18__DISP2_PIN5       IOMUX_PAD(0x714, 0x314, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT19__BOOT_WEIM_MUXED1 IOMUX_PAD(0x718, 0x318, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT19__DISP1_DAT19      IOMUX_PAD(0x718, 0x318, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT19__DISP2_PIN12      IOMUX_PAD(0x718, 0x318, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT19__DISP2_PIN6       IOMUX_PAD(0x718, 0x318, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT20__BOOT_MEM_TYPE0   IOMUX_PAD(0x71c, 0x31c, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT20__DISP1_DAT20      IOMUX_PAD(0x71c, 0x31c, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT20__DISP2_PIN13      IOMUX_PAD(0x71c, 0x31c, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT20__DISP2_PIN7       IOMUX_PAD(0x71c, 0x31c, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT21__BOOT_MEM_TYPE1   IOMUX_PAD(0x720, 0x320, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT21__DISP1_DAT21      IOMUX_PAD(0x720, 0x320, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT21__DISP2_PIN14      IOMUX_PAD(0x720, 0x320, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT21__DISP2_PIN8       IOMUX_PAD(0x720, 0x320, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT22__BOOT_LPB_FREQ0   IOMUX_PAD(0x724, 0x324, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT22__DISP1_DAT22      IOMUX_PAD(0x724, 0x324, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT22__DISP2_D0_CS      IOMUX_PAD(0x724, 0x324, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT22__DISP2_DAT16      IOMUX_PAD(0x724, 0x324, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT23__BOOT_LPB_FREQ1   IOMUX_PAD(0x728, 0x328, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT23__DISP1_DAT23      IOMUX_PAD(0x728, 0x328, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT23__DISP2_D1_CS      IOMUX_PAD(0x728, 0x328, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT23__DISP2_DAT17      IOMUX_PAD(0x728, 0x328, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP1_DAT23__DISP2_SER_CS     IOMUX_PAD(0x728, 0x328, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DI1_PIN3__DI1_PIN3            IOMUX_PAD(0x72c, 0x32c, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DI1_DISP_CLK__DI1_DISP_CLK    IOMUX_PAD(0x730, __NA_, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DI1_PIN2__DI1_PIN2            IOMUX_PAD(0x734, 0x330, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DI1_PIN15__DI1_PIN15          IOMUX_PAD(0x738, __NA_, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DI_GP2__DISP1_SER_CLK         IOMUX_PAD(0x740, 0x338, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DI_GP2__DISP2_WAIT            IOMUX_PAD(0x740, 0x338, 2, 0x9a8, 1, NO_PAD_CTRL)
-#define MX51_PAD_DI_GP3__CSI1_DATA_EN          IOMUX_PAD(0x744, 0x33c, 3, 0x9a0, 1, NO_PAD_CTRL)
-#define MX51_PAD_DI_GP3__DISP1_SER_DIO         IOMUX_PAD(0x744, 0x33c, 0, 0x9c0, 0, NO_PAD_CTRL)
-#define MX51_PAD_DI_GP3__FEC_TX_ER             IOMUX_PAD(0x744, 0x33c, 2, __NA_, 0, MX51_PAD_CTRL_5)
-#define MX51_PAD_DI2_PIN4__CSI2_DATA_EN                IOMUX_PAD(0x748, 0x340, 3, 0x99c, 1, NO_PAD_CTRL)
-#define MX51_PAD_DI2_PIN4__DI2_PIN4            IOMUX_PAD(0x748, 0x340, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DI2_PIN4__FEC_CRS             IOMUX_PAD(0x748, 0x340, 2, 0x950, 1, NO_PAD_CTRL)
-#define MX51_PAD_DI2_PIN2__DI2_PIN2            IOMUX_PAD(0x74c, 0x344, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DI2_PIN2__FEC_MDC             IOMUX_PAD(0x74c, 0x344, 2, __NA_, 0, MX51_PAD_CTRL_5)
-#define MX51_PAD_DI2_PIN3__DI2_PIN3            IOMUX_PAD(0x750, 0x348, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DI2_PIN3__FEC_MDIO            IOMUX_PAD(0x750, 0x348, 2, 0x954, 1, NO_PAD_CTRL)
-#define MX51_PAD_DI2_DISP_CLK__DI2_DISP_CLK    IOMUX_PAD(0x754, 0x34c, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DI2_DISP_CLK__FEC_RDATA1      IOMUX_PAD(0x754, 0x34c, 2, 0x95c, 1, NO_PAD_CTRL)
-#define MX51_PAD_DI_GP4__DI2_PIN15             IOMUX_PAD(0x758, 0x350, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DI_GP4__DISP1_SER_DIN         IOMUX_PAD(0x758, 0x350, 0, 0x9c0, 1, NO_PAD_CTRL)
-#define MX51_PAD_DI_GP4__DISP2_PIN1            IOMUX_PAD(0x758, 0x350, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DI_GP4__FEC_RDATA2            IOMUX_PAD(0x758, 0x350, 2, 0x960, 1, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT0__DISP2_DAT0                IOMUX_PAD(0x75c, 0x354, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT0__FEC_RDATA3                IOMUX_PAD(0x75c, 0x354, 2, 0x964, 1, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT0__KEY_COL6          IOMUX_PAD(0x75c, 0x354, 4, 0x9c8, 1, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT0__UART3_RXD         IOMUX_PAD(0x75c, 0x354, 5, 0x9f4, 8, MX51_UART_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT0__USBH3_CLK         IOMUX_PAD(0x75c, 0x354, 3, 0x9f8, 1, MX51_UART_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT1__DISP2_DAT1                IOMUX_PAD(0x760, 0x358, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT1__FEC_RX_ER         IOMUX_PAD(0x760, 0x358, 2, 0x970, 1, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT1__KEY_COL7          IOMUX_PAD(0x760, 0x358, 4, 0x9cc, 1, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT1__UART3_TXD         IOMUX_PAD(0x760, 0x358, 5, __NA_, 0, MX51_UART_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT1__USBH3_DIR         IOMUX_PAD(0x760, 0x358, 3, 0xa1c, 1, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT2__DISP2_DAT2                IOMUX_PAD(0x764, 0x35c, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT3__DISP2_DAT3                IOMUX_PAD(0x768, 0x360, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT4__DISP2_DAT4                IOMUX_PAD(0x76c, 0x364, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT5__DISP2_DAT5                IOMUX_PAD(0x770, 0x368, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT6__DISP2_DAT6                IOMUX_PAD(0x774, 0x36c, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT6__FEC_TDATA1                IOMUX_PAD(0x774, 0x36c, 2, __NA_, 0, MX51_PAD_CTRL_5)
-#define MX51_PAD_DISP2_DAT6__GPIO1_19          IOMUX_PAD(0x774, 0x36c, 5, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT6__KEY_ROW4          IOMUX_PAD(0x774, 0x36c, 4, 0x9d0, 1, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT6__USBH3_STP         IOMUX_PAD(0x774, 0x36c, 3, 0xa24, 1, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT7__DISP2_DAT7                IOMUX_PAD(0x778, 0x370, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT7__FEC_TDATA2                IOMUX_PAD(0x778, 0x370, 2, __NA_, 0, MX51_PAD_CTRL_5)
-#define MX51_PAD_DISP2_DAT7__GPIO1_29          IOMUX_PAD(0x778, 0x370, 5, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT7__KEY_ROW5          IOMUX_PAD(0x778, 0x370, 4, 0x9d4, 1, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT7__USBH3_NXT         IOMUX_PAD(0x778, 0x370, 3, 0xa20, 1, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT8__DISP2_DAT8                IOMUX_PAD(0x77c, 0x374, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT8__FEC_TDATA3                IOMUX_PAD(0x77c, 0x374, 2, __NA_, 0, MX51_PAD_CTRL_5)
-#define MX51_PAD_DISP2_DAT8__GPIO1_30          IOMUX_PAD(0x77c, 0x374, 5, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT8__KEY_ROW6          IOMUX_PAD(0x77c, 0x374, 4, 0x9d8, 1, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT8__USBH3_DATA0       IOMUX_PAD(0x77c, 0x374, 3, 0x9fc, 1, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT9__AUD6_RXC          IOMUX_PAD(0x780, 0x378, 4, 0x8f4, 1, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT9__DISP2_DAT9                IOMUX_PAD(0x780, 0x378, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT9__FEC_TX_EN         IOMUX_PAD(0x780, 0x378, 2, __NA_, 0, MX51_PAD_CTRL_5)
-#define MX51_PAD_DISP2_DAT9__GPIO1_31          IOMUX_PAD(0x780, 0x378, 5, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT9__USBH3_DATA1       IOMUX_PAD(0x780, 0x378, 3, 0xa00, 1, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT10__DISP2_DAT10      IOMUX_PAD(0x784, 0x37c, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT10__DISP2_SER_CS     IOMUX_PAD(0x784, 0x37c, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT10__FEC_COL          IOMUX_PAD(0x784, 0x37c, 2, 0x94c, 1, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT10__KEY_ROW7         IOMUX_PAD(0x784, 0x37c, 4, 0x9dc, 1, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT10__USBH3_DATA2      IOMUX_PAD(0x784, 0x37c, 3, 0xa04, 1, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT11__AUD6_TXD         IOMUX_PAD(0x788, 0x380, 4, 0x8f0, 1, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT11__DISP2_DAT11      IOMUX_PAD(0x788, 0x380, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT11__FEC_RX_CLK       IOMUX_PAD(0x788, 0x380, 2, 0x968, 1, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT11__GPIO1_10         IOMUX_PAD(0x788, 0x380, 7, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT11__USBH3_DATA3      IOMUX_PAD(0x788, 0x380, 3, 0xa08, 1, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT12__AUD6_RXD         IOMUX_PAD(0x78c, 0x384, 4, 0x8ec, 1, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT12__DISP2_DAT12      IOMUX_PAD(0x78c, 0x384, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT12__FEC_RX_DV                IOMUX_PAD(0x78c, 0x384, 2, 0x96c, 1, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT12__USBH3_DATA4      IOMUX_PAD(0x78c, 0x384, 3, 0xa0c, 1, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT13__AUD6_TXC         IOMUX_PAD(0x790, 0x388, 4, 0x8fc, 1, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT13__DISP2_DAT13      IOMUX_PAD(0x790, 0x388, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT13__FEC_TX_CLK       IOMUX_PAD(0x790, 0x388, 2, 0x974, 1, MX51_PAD_CTRL_4)
-#define MX51_PAD_DISP2_DAT13__USBH3_DATA5      IOMUX_PAD(0x790, 0x388, 3, 0xa10, 1, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT14__AUD6_TXFS                IOMUX_PAD(0x794, 0x38c, 4, 0x900, 1, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT14__DISP2_DAT14      IOMUX_PAD(0x794, 0x38c, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT14__FEC_RDATA0       IOMUX_PAD(0x794, 0x38c, 2, 0x958, 1, MX51_PAD_CTRL_4)
-#define MX51_PAD_DISP2_DAT14__USBH3_DATA6      IOMUX_PAD(0x794, 0x38c, 3, 0xa14, 1, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT15__AUD6_RXFS                IOMUX_PAD(0x798, 0x390, 4, 0x8f8, 1, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT15__DISP1_SER_CS     IOMUX_PAD(0x798, 0x390, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT15__DISP2_DAT15      IOMUX_PAD(0x798, 0x390, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_DISP2_DAT15__FEC_TDATA0       IOMUX_PAD(0x798, 0x390, 2, __NA_, 0, MX51_PAD_CTRL_5)
-#define MX51_PAD_DISP2_DAT15__USBH3_DATA7      IOMUX_PAD(0x798, 0x390, 3, 0xa18, 1, NO_PAD_CTRL)
-#define MX51_PAD_SD1_CMD__AUD5_RXFS            IOMUX_PAD(0x79c, 0x394, 1, 0x8e0, 1, NO_PAD_CTRL)
-#define MX51_PAD_SD1_CMD__CSPI_MOSI            IOMUX_PAD(0x79c, 0x394, 2, 0x91c, 2, NO_PAD_CTRL)
-#define MX51_PAD_SD1_CMD__SD1_CMD              IOMUX_PAD(0x79c, 0x394, 0x10, __NA_, 0, MX51_SDHCI_PAD_CTRL)
-#define MX51_PAD_SD1_CLK__AUD5_RXC             IOMUX_PAD(0x7a0, 0x398, 1, 0x8dc, 1, NO_PAD_CTRL)
-#define MX51_PAD_SD1_CLK__CSPI_SCLK            IOMUX_PAD(0x7a0, 0x398, 2, 0x914, 2, NO_PAD_CTRL)
-#define MX51_PAD_SD1_CLK__SD1_CLK              IOMUX_PAD(0x7a0, 0x398, 0x10, __NA_, 0, MX51_SDHCI_PAD_CTRL | PAD_CTL_HYS)
-#define MX51_PAD_SD1_DATA0__AUD5_TXD           IOMUX_PAD(0x7a4, 0x39c, 1, 0x8d8, 2, NO_PAD_CTRL)
-#define MX51_PAD_SD1_DATA0__CSPI_MISO          IOMUX_PAD(0x7a4, 0x39c, 2, 0x918, 1, MX51_ECSPI_PAD_CTRL)
-#define MX51_PAD_SD1_DATA0__SD1_DATA0          IOMUX_PAD(0x7a4, 0x39c, 0x10, __NA_, 0, MX51_SDHCI_PAD_CTRL)
-#define MX51_PAD_EIM_DA0__EIM_DA0              IOMUX_PAD(__NA_, 0x01c, 0, 0x000, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_DA1__EIM_DA1              IOMUX_PAD(__NA_, 0x020, 0, 0x000, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_DA2__EIM_DA2              IOMUX_PAD(__NA_, 0x024, 0, 0x000, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_DA3__EIM_DA3              IOMUX_PAD(__NA_, 0x028, 0, 0x000, 0, NO_PAD_CTRL)
-#define MX51_PAD_SD1_DATA1__AUD5_RXD           IOMUX_PAD(0x7a8, 0x3a0, 1, 0x8d4, 2, NO_PAD_CTRL)
-#define MX51_PAD_SD1_DATA1__SD1_DATA1          IOMUX_PAD(0x7a8, 0x3a0, 0x10, __NA_, 0, MX51_SDHCI_PAD_CTRL)
-#define MX51_PAD_EIM_DA4__EIM_DA4              IOMUX_PAD(__NA_, 0x02c, 0, 0x000, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_DA5__EIM_DA5              IOMUX_PAD(__NA_, 0x030, 0, 0x000, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_DA6__EIM_DA6              IOMUX_PAD(__NA_, 0x034, 0, 0x000, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_DA7__EIM_DA7              IOMUX_PAD(__NA_, 0x038, 0, 0x000, 0, NO_PAD_CTRL)
-#define MX51_PAD_SD1_DATA2__AUD5_TXC           IOMUX_PAD(0x7ac, 0x3a4, 1, 0x8e4, 2, NO_PAD_CTRL)
-#define MX51_PAD_SD1_DATA2__SD1_DATA2          IOMUX_PAD(0x7ac, 0x3a4, 0x10, __NA_, 0, MX51_SDHCI_PAD_CTRL)
-#define MX51_PAD_EIM_DA10__EIM_DA10            IOMUX_PAD(__NA_, 0x044, 0, 0x000, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_DA11__EIM_DA11            IOMUX_PAD(__NA_, 0x048, 0, 0x000, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_DA8__EIM_DA8              IOMUX_PAD(__NA_, 0x03c, 0, 0x000, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_DA9__EIM_DA9              IOMUX_PAD(__NA_, 0x040, 0, 0x000, 0, NO_PAD_CTRL)
-#define MX51_PAD_SD1_DATA3__AUD5_TXFS          IOMUX_PAD(0x7b0, 0x3a8, 1, 0x8e8, 2, NO_PAD_CTRL)
-#define MX51_PAD_SD1_DATA3__CSPI_SS1           IOMUX_PAD(0x7b0, 0x3a8, 2, 0x920, 1, MX51_ECSPI_PAD_CTRL)
-#define MX51_PAD_SD1_DATA3__SD1_DATA3          IOMUX_PAD(0x7b0, 0x3a8, 0x10, __NA_, 0, MX51_SDHCI_PAD_CTRL)
-#define MX51_PAD_GPIO1_0__CSPI_SS2             IOMUX_PAD(0x7b4, 0x3ac, 2, 0x924, 0, MX51_ECSPI_PAD_CTRL)
-#define MX51_PAD_GPIO1_0__GPIO1_0              IOMUX_PAD(0x7b4, 0x3ac, 1, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_GPIO1_0__SD1_CD               IOMUX_PAD(0x7b4, 0x3ac, 0, __NA_, 0, MX51_ESDHC_PAD_CTRL)
-#define MX51_PAD_GPIO1_1__CSPI_MISO            IOMUX_PAD(0x7b8, 0x3b0, 2, 0x918, 2, MX51_ECSPI_PAD_CTRL)
-#define MX51_PAD_GPIO1_1__GPIO1_1              IOMUX_PAD(0x7b8, 0x3b0, 1, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_GPIO1_1__SD1_WP               IOMUX_PAD(0x7b8, 0x3b0, 0, __NA_, 0, MX51_ESDHC_PAD_CTRL)
-#define MX51_PAD_EIM_DA12__EIM_DA12            IOMUX_PAD(__NA_, 0x04c, 0, 0x000, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_DA13__EIM_DA13            IOMUX_PAD(__NA_, 0x050, 0, 0x000, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_DA14__EIM_DA14            IOMUX_PAD(__NA_, 0x054, 0, 0x000, 0, NO_PAD_CTRL)
-#define MX51_PAD_EIM_DA15__EIM_DA15            IOMUX_PAD(__NA_, 0x058, 0, 0x000, 0, NO_PAD_CTRL)
-#define MX51_PAD_SD2_CMD__CSPI_MOSI            IOMUX_PAD(0x7bc, 0x3b4, 2, 0x91c, 3, MX51_ECSPI_PAD_CTRL)
-#define MX51_PAD_SD2_CMD__I2C1_SCL             IOMUX_PAD(0x7bc, 0x3b4, 0x11, 0x9b0, 2, MX51_I2C_PAD_CTRL)
-#define MX51_PAD_SD2_CMD__SD2_CMD              IOMUX_PAD(0x7bc, 0x3b4, 0x10, __NA_, 0, MX51_SDHCI_PAD_CTRL)
-#define MX51_PAD_SD2_CLK__CSPI_SCLK            IOMUX_PAD(0x7c0, 0x3b8, 2, 0x914, 3, MX51_ECSPI_PAD_CTRL)
-#define MX51_PAD_SD2_CLK__I2C1_SDA             IOMUX_PAD(0x7c0, 0x3b8, 0x11, 0x9b4, 2, MX51_I2C_PAD_CTRL)
-#define MX51_PAD_SD2_CLK__SD2_CLK              IOMUX_PAD(0x7c0, 0x3b8, 0x10, __NA_, 0, MX51_SDHCI_PAD_CTRL | PAD_CTL_HYS)
-#define MX51_PAD_SD2_DATA0__CSPI_MISO          IOMUX_PAD(0x7c4, 0x3bc, 2, 0x918, 3, MX51_ECSPI_PAD_CTRL)
-#define MX51_PAD_SD2_DATA0__SD1_DAT4           IOMUX_PAD(0x7c4, 0x3bc, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_SD2_DATA0__SD2_DATA0          IOMUX_PAD(0x7c4, 0x3bc, 0x10, __NA_, 0, MX51_SDHCI_PAD_CTRL)
-#define MX51_PAD_SD2_DATA1__SD1_DAT5           IOMUX_PAD(0x7c8, 0x3c0, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_SD2_DATA1__SD2_DATA1          IOMUX_PAD(0x7c8, 0x3c0, 0x10, __NA_, 0, MX51_SDHCI_PAD_CTRL)
-#define MX51_PAD_SD2_DATA1__USBH3_H2_DP                IOMUX_PAD(0x7c8, 0x3c0, 0x12, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_SD2_DATA2__SD1_DAT6           IOMUX_PAD(0x7cc, 0x3c4, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_SD2_DATA2__SD2_DATA2          IOMUX_PAD(0x7cc, 0x3c4, 0x10, __NA_, 0, MX51_SDHCI_PAD_CTRL)
-#define MX51_PAD_SD2_DATA2__USBH3_H2_DM                IOMUX_PAD(0x7cc, 0x3c4, 0x12, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_SD2_DATA3__CSPI_SS2           IOMUX_PAD(0x7d0, 0x3c8, 2, 0x924, 1, MX51_ECSPI_PAD_CTRL)
-#define MX51_PAD_SD2_DATA3__SD1_DAT7           IOMUX_PAD(0x7d0, 0x3c8, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_SD2_DATA3__SD2_DATA3          IOMUX_PAD(0x7d0, 0x3c8, 0x10, __NA_, 0, MX51_SDHCI_PAD_CTRL)
-#define MX51_PAD_GPIO1_2__CCM_OUT_2            IOMUX_PAD(0x7d4, 0x3cc, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_GPIO1_2__GPIO1_2              IOMUX_PAD(0x7d4, 0x3cc, 0, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_GPIO1_2__I2C2_SCL             IOMUX_PAD(0x7d4, 0x3cc, 0x12, 0x9b8, 3, MX51_I2C_PAD_CTRL)
-#define MX51_PAD_GPIO1_2__PLL1_BYP             IOMUX_PAD(0x7d4, 0x3cc, 7, 0x90c, 1, NO_PAD_CTRL)
-#define MX51_PAD_GPIO1_2__PWM1_PWMO            IOMUX_PAD(0x7d4, 0x3cc, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_GPIO1_3__GPIO1_3              IOMUX_PAD(0x7d8, 0x3d0, 0, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_GPIO1_3__I2C2_SDA             IOMUX_PAD(0x7d8, 0x3d0, 0x12, 0x9bc, 3, MX51_I2C_PAD_CTRL)
-#define MX51_PAD_GPIO1_3__CCM_CLKO2            IOMUX_PAD(0x7d8, 0x3d0, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_GPIO1_3__GPT_CLKIN            IOMUX_PAD(0x7d8, 0x3d0, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_GPIO1_3__PLL2_BYP             IOMUX_PAD(0x7d8, 0x3d0, 7, 0x910, 1, NO_PAD_CTRL)
-#define MX51_PAD_GPIO1_3__PWM2_PWMO            IOMUX_PAD(0x7d8, 0x3d0, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_PMIC_INT_REQ__PMIC_INT_REQ    IOMUX_PAD(0x7fc, 0x3d4, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_PMIC_INT_REQ__PMIC_PMU_IRQ_B  IOMUX_PAD(0x7fc, 0x3d4, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_GPIO1_4__DISP2_EXT_CLK                IOMUX_PAD(0x804, 0x3d8, 4, 0x908, 1, NO_PAD_CTRL)
-#define MX51_PAD_GPIO1_4__EIM_RDY              IOMUX_PAD(0x804, 0x3d8, 3, 0x938, 1, NO_PAD_CTRL)
-#define MX51_PAD_GPIO1_4__GPIO1_4              IOMUX_PAD(0x804, 0x3d8, 0, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_GPIO1_4__WDOG1_WDOG_B         IOMUX_PAD(0x804, 0x3d8, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_GPIO1_4__GPT_CAPIN1           IOMUX_PAD(0x804, 0x3d8, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_GPIO1_5__CSI2_MCLK            IOMUX_PAD(0x808, 0x3dc, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_GPIO1_5__DISP2_PIN16          IOMUX_PAD(0x808, 0x3dc, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_GPIO1_5__GPIO1_5              IOMUX_PAD(0x808, 0x3dc, 0, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_GPIO1_5__WDOG2_WDOG_B         IOMUX_PAD(0x808, 0x3dc, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_GPIO1_5__CCM_CLKO             IOMUX_PAD(0x808, 0x3dc, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_GPIO1_6__DISP2_PIN17          IOMUX_PAD(0x80c, 0x3e0, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_GPIO1_6__GPIO1_6              IOMUX_PAD(0x80c, 0x3e0, 0, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_GPIO1_6__REF_EN_B             IOMUX_PAD(0x80c, 0x3e0, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_GPIO1_6__GPT_CAPIN2           IOMUX_PAD(0x80c, 0x3e0, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_GPIO1_7__CCM_OUT_0            IOMUX_PAD(0x810, 0x3e4, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_GPIO1_7__GPIO1_7              IOMUX_PAD(0x810, 0x3e4, 0, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_GPIO1_7__SD2_WP               IOMUX_PAD(0x810, 0x3e4, 6, __NA_, 0, MX51_ESDHC_PAD_CTRL)
-#define MX51_PAD_GPIO1_7__SPDIF_OUT1           IOMUX_PAD(0x810, 0x3e4, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_GPIO1_8__CSI2_DATA_EN         IOMUX_PAD(0x814, 0x3e8, 2, 0x99c, 2, NO_PAD_CTRL)
-#define MX51_PAD_GPIO1_8__GPIO1_8              IOMUX_PAD(0x814, 0x3e8, 0, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_GPIO1_8__SD2_CD               IOMUX_PAD(0x814, 0x3e8, 6, __NA_, 0, MX51_ESDHC_PAD_CTRL)
-#define MX51_PAD_GPIO1_8__USBH3_PWR            IOMUX_PAD(0x814, 0x3e8, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_GPIO1_8__CCM_CLKO2            IOMUX_PAD(0x814, 0x3e8, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_GPIO1_9__CCM_OUT_1            IOMUX_PAD(0x818, 0x3ec, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_GPIO1_9__DISP2_D1_CS          IOMUX_PAD(0x818, 0x3ec, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_GPIO1_9__DISP2_SER_CS         IOMUX_PAD(0x818, 0x3ec, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_GPIO1_9__GPIO1_9              IOMUX_PAD(0x818, 0x3ec, 0, __NA_, 0, MX51_GPIO_PAD_CTRL)
-#define MX51_PAD_GPIO1_9__SD2_LCTL             IOMUX_PAD(0x818, 0x3ec, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_GPIO1_9__USBH3_OC             IOMUX_PAD(0x818, 0x3ec, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX51_PAD_GPIO1_9__CCM_CLKO             IOMUX_PAD(0x818, 0x3ec, 4, __NA_, 0, NO_PAD_CTRL)
-
-#endif /* __MACH_IOMUX_MX51_H__ */
index 39406b7e3228daf9b1e68c18ec3f29f1c1ad1474..a7e9bd26a5521991e324aee0e9571c4c9d82774d 100644 (file)
@@ -50,6 +50,7 @@
 #include "common.h"
 #include "devices-imx31.h"
 #include "crmregs-imx3.h"
+#include "ehci.h"
 #include "hardware.h"
 #include "iomux-mx3.h"
 #include "ulpi.h"
index 75b7b6aa2720609b41e0665d0ac2df3d4040b06b..e6d4b992957161b6ef01d7a8797d6905de09db10 100644 (file)
@@ -36,6 +36,7 @@
 
 #include "common.h"
 #include "devices-imx27.h"
+#include "ehci.h"
 #include "eukrea-baseboards.h"
 #include "hardware.h"
 #include "iomux-mx27.h"
index 1ffa27169045b0fc2ddbfa094a6a29d003670bc9..62a6e02f476318593171c38fe5c5c5b80fab1bec 100644 (file)
@@ -39,6 +39,7 @@
 
 #include "common.h"
 #include "devices-imx35.h"
+#include "ehci.h"
 #include "eukrea-baseboards.h"
 #include "hardware.h"
 #include "iomux-mx35.h"
index e978dda1434cc2269efcfed4b4f36c3084ec5b6f..b2ee6e009fe44aef0bf3bfdb9a9c1cb7c7f71ecf 100644 (file)
@@ -35,6 +35,7 @@
 
 #include "common.h"
 #include "devices-imx25.h"
+#include "ehci.h"
 #include "eukrea-baseboards.h"
 #include "hardware.h"
 #include "iomux-mx25.h"
index b61bd8ed556830cf3bcb6e708ede8c57fe8529df..ede2bdbb5dd50f78b43675cbd136fdcbc9422abf 100644 (file)
@@ -43,6 +43,7 @@
 
 #include "common.h"
 #include "devices-imx27.h"
+#include "ehci.h"
 #include "hardware.h"
 #include "iomux-mx27.h"
 
diff --git a/arch/arm/mach-imx/mach-imx27ipcam.c b/arch/arm/mach-imx/mach-imx27ipcam.c
deleted file mode 100644 (file)
index bb3ca04..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2011 Freescale Semiconductor, Inc. All Rights Reserved.
- *
- * Author: Fabio Estevam <fabio.estevam@freescale.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- */
-
-#include <asm/mach-types.h>
-#include <asm/mach/arch.h>
-#include <asm/mach/time.h>
-
-#include "hardware.h"
-#include "common.h"
-#include "devices-imx27.h"
-#include "iomux-mx27.h"
-
-static const int mx27ipcam_pins[] __initconst = {
-       /* UART1 */
-       PE12_PF_UART1_TXD,
-       PE13_PF_UART1_RXD,
-       /* FEC */
-       PD0_AIN_FEC_TXD0,
-       PD1_AIN_FEC_TXD1,
-       PD2_AIN_FEC_TXD2,
-       PD3_AIN_FEC_TXD3,
-       PD4_AOUT_FEC_RX_ER,
-       PD5_AOUT_FEC_RXD1,
-       PD6_AOUT_FEC_RXD2,
-       PD7_AOUT_FEC_RXD3,
-       PD8_AF_FEC_MDIO,
-       PD9_AIN_FEC_MDC,
-       PD10_AOUT_FEC_CRS,
-       PD11_AOUT_FEC_TX_CLK,
-       PD12_AOUT_FEC_RXD0,
-       PD13_AOUT_FEC_RX_DV,
-       PD14_AOUT_FEC_RX_CLK,
-       PD15_AOUT_FEC_COL,
-       PD16_AIN_FEC_TX_ER,
-       PF23_AIN_FEC_TX_EN,
-};
-
-static void __init mx27ipcam_init(void)
-{
-       imx27_soc_init();
-
-       mxc_gpio_setup_multiple_pins(mx27ipcam_pins, ARRAY_SIZE(mx27ipcam_pins),
-               "mx27ipcam");
-
-       imx27_add_imx_uart0(NULL);
-       imx27_add_fec(NULL);
-       imx27_add_imx2_wdt();
-}
-
-static void __init mx27ipcam_timer_init(void)
-{
-       mx27_clocks_init(25000000);
-}
-
-MACHINE_START(IMX27IPCAM, "Freescale IMX27IPCAM")
-       /* maintainer: Freescale Semiconductor, Inc. */
-       .atag_offset = 0x100,
-       .map_io = mx27_map_io,
-       .init_early = imx27_init_early,
-       .init_irq = mx27_init_irq,
-       .init_time      = mx27ipcam_timer_init,
-       .init_machine = mx27ipcam_init,
-       .restart        = mxc_restart,
-MACHINE_END
diff --git a/arch/arm/mach-imx/mach-imx27lite.c b/arch/arm/mach-imx/mach-imx27lite.c
deleted file mode 100644 (file)
index 9992089..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright 2007 Robert Schwebel <r.schwebel@pengutronix.de>, Pengutronix
- * Copyright (C) 2008 Juergen Beisert (kernel@pengutronix.de)
- * Copyright 2009 Daniel Schaeffer (daniel.schaeffer@timesys.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- */
-
-#include <linux/platform_device.h>
-#include <linux/gpio.h>
-#include <asm/mach-types.h>
-#include <asm/mach/arch.h>
-#include <asm/mach/time.h>
-#include <asm/mach/map.h>
-
-#include "common.h"
-#include "devices-imx27.h"
-#include "hardware.h"
-#include "iomux-mx27.h"
-
-static const int mx27lite_pins[] __initconst = {
-       /* UART1 */
-       PE12_PF_UART1_TXD,
-       PE13_PF_UART1_RXD,
-       PE14_PF_UART1_CTS,
-       PE15_PF_UART1_RTS,
-       /* FEC */
-       PD0_AIN_FEC_TXD0,
-       PD1_AIN_FEC_TXD1,
-       PD2_AIN_FEC_TXD2,
-       PD3_AIN_FEC_TXD3,
-       PD4_AOUT_FEC_RX_ER,
-       PD5_AOUT_FEC_RXD1,
-       PD6_AOUT_FEC_RXD2,
-       PD7_AOUT_FEC_RXD3,
-       PD8_AF_FEC_MDIO,
-       PD9_AIN_FEC_MDC,
-       PD10_AOUT_FEC_CRS,
-       PD11_AOUT_FEC_TX_CLK,
-       PD12_AOUT_FEC_RXD0,
-       PD13_AOUT_FEC_RX_DV,
-       PD14_AOUT_FEC_RX_CLK,
-       PD15_AOUT_FEC_COL,
-       PD16_AIN_FEC_TX_ER,
-       PF23_AIN_FEC_TX_EN,
-};
-
-static const struct imxuart_platform_data uart_pdata __initconst = {
-       .flags = IMXUART_HAVE_RTSCTS,
-};
-
-static void __init mx27lite_init(void)
-{
-       imx27_soc_init();
-
-       mxc_gpio_setup_multiple_pins(mx27lite_pins, ARRAY_SIZE(mx27lite_pins),
-               "imx27lite");
-       imx27_add_imx_uart0(&uart_pdata);
-       imx27_add_fec(NULL);
-}
-
-static void __init mx27lite_timer_init(void)
-{
-       mx27_clocks_init(26000000);
-}
-
-MACHINE_START(IMX27LITE, "LogicPD i.MX27LITE")
-       .atag_offset = 0x100,
-       .map_io = mx27_map_io,
-       .init_early = imx27_init_early,
-       .init_irq = mx27_init_irq,
-       .init_time      = mx27lite_timer_init,
-       .init_machine = mx27lite_init,
-       .restart        = mxc_restart,
-MACHINE_END
index b899c0b59afd7005847abd7e48c78658b3305079..b1e56a94a38289138c209a599b503a40716f3b32 100644 (file)
@@ -23,14 +23,13 @@ static void __init imx50_dt_init(void)
        of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
 }
 
-static const char *imx50_dt_board_compat[] __initconst = {
+static const char * const imx50_dt_board_compat[] __initconst = {
        "fsl,imx50",
        NULL
 };
 
 DT_MACHINE_START(IMX50_DT, "Freescale i.MX50 (Device Tree Support)")
-       .map_io         = mx53_map_io,
-       .init_irq       = mx53_init_irq,
+       .init_irq       = tzic_init_irq,
        .init_machine   = imx50_dt_init,
        .dt_compat      = imx50_dt_board_compat,
        .restart        = mxc_restart,
diff --git a/arch/arm/mach-imx/mach-imx51.c b/arch/arm/mach-imx/mach-imx51.c
new file mode 100644 (file)
index 0000000..c77deb3
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2011 Freescale Semiconductor, Inc. All Rights Reserved.
+ * Copyright 2011 Linaro Ltd.
+ *
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+#include <linux/io.h>
+#include <linux/irq.h>
+#include <linux/of_irq.h>
+#include <linux/of_platform.h>
+#include <asm/mach/arch.h>
+#include <asm/mach/time.h>
+
+#include "common.h"
+#include "hardware.h"
+
+static void __init imx51_init_early(void)
+{
+       mxc_set_cpu_type(MXC_CPU_MX51);
+}
+
+/*
+ * The MIPI HSC unit has been removed from the i.MX51 Reference Manual by
+ * the Freescale marketing division. However this did not remove the
+ * hardware from the chip which still needs to be configured for proper
+ * IPU support.
+ */
+#define MX51_MIPI_HSC_BASE 0x83fdc000
+static void __init imx51_ipu_mipi_setup(void)
+{
+       void __iomem *hsc_addr;
+
+       hsc_addr = ioremap(MX51_MIPI_HSC_BASE, SZ_16K);
+       WARN_ON(!hsc_addr);
+
+       /* setup MIPI module to legacy mode */
+       __raw_writel(0xf00, hsc_addr);
+
+       /* CSI mode: reserved; DI control mode: legacy (from Freescale BSP) */
+       __raw_writel(__raw_readl(hsc_addr + 0x800) | 0x30ff,
+               hsc_addr + 0x800);
+
+       iounmap(hsc_addr);
+}
+
+static void __init imx51_dt_init(void)
+{
+       struct platform_device_info devinfo = { .name = "cpufreq-cpu0", };
+
+       mxc_arch_reset_init_dt();
+       imx51_ipu_mipi_setup();
+       imx_src_init();
+
+       of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
+       platform_device_register_full(&devinfo);
+}
+
+static void __init imx51_init_late(void)
+{
+       mx51_neon_fixup();
+       imx51_pm_init();
+}
+
+static const char * const imx51_dt_board_compat[] __initconst = {
+       "fsl,imx51",
+       NULL
+};
+
+DT_MACHINE_START(IMX51_DT, "Freescale i.MX51 (Device Tree Support)")
+       .init_early     = imx51_init_early,
+       .init_irq       = tzic_init_irq,
+       .init_machine   = imx51_dt_init,
+       .init_late      = imx51_init_late,
+       .dt_compat      = imx51_dt_board_compat,
+       .restart        = mxc_restart,
+MACHINE_END
index 2bad387956c03920adb74ba67aff28246670a8a5..03dd6ea13accb9688c650c8e5c75617d4cad3555 100644 (file)
 
 #include "common.h"
 #include "hardware.h"
-#include "mx53.h"
+
+static void __init imx53_init_early(void)
+{
+       mxc_set_cpu_type(MXC_CPU_MX53);
+}
 
 static void __init imx53_dt_init(void)
 {
        mxc_arch_reset_init_dt();
+       imx_src_init();
 
        of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
+
+       imx_aips_allow_unprivileged_access("fsl,imx53-aipstz");
+}
+
+static void __init imx53_init_late(void)
+{
+       imx53_pm_init();
 }
 
-static const char *imx53_dt_board_compat[] __initconst = {
+static const char * const imx53_dt_board_compat[] __initconst = {
        "fsl,imx53",
        NULL
 };
 
 DT_MACHINE_START(IMX53_DT, "Freescale i.MX53 (Device Tree Support)")
-       .map_io         = mx53_map_io,
        .init_early     = imx53_init_early,
-       .init_irq       = mx53_init_irq,
+       .init_irq       = tzic_init_irq,
        .init_machine   = imx53_dt_init,
        .init_late      = imx53_init_late,
        .dt_compat      = imx53_dt_board_compat,
index e60456d85c9d867218eca5e244034ef348592376..d51c6e99a2e9e287e98fadc1223c73ffcf86315e 100644 (file)
@@ -320,7 +320,7 @@ static void __init imx6q_opp_check_speed_grading(struct device *cpu_dev)
        val >>= OCOTP_CFG3_SPEED_SHIFT;
        val &= 0x3;
 
-       if (val != OCOTP_CFG3_SPEED_1P2GHZ)
+       if ((val != OCOTP_CFG3_SPEED_1P2GHZ) && cpu_is_imx6q())
                if (dev_pm_opp_disable(cpu_dev, 1200000000))
                        pr_warn("failed to disable 1.2 GHz OPP\n");
        if (val < OCOTP_CFG3_SPEED_996MHZ)
@@ -396,7 +396,7 @@ static void __init imx6q_init_irq(void)
        irqchip_init();
 }
 
-static const char *imx6q_dt_compat[] __initconst = {
+static const char * const imx6q_dt_compat[] __initconst = {
        "fsl,imx6dl",
        "fsl,imx6q",
        NULL,
index ad323385115c0f2a607c55219a2f5ae8e599a814..ed263a21d928da397ba003353195c50d5e9ca26a 100644 (file)
@@ -70,7 +70,7 @@ static void __init imx6sl_init_irq(void)
        irqchip_init();
 }
 
-static const char *imx6sl_dt_compat[] __initconst = {
+static const char * const imx6sl_dt_compat[] __initconst = {
        "fsl,imx6sl",
        NULL,
 };
index 02fccf6033ac8a0993087e36fde4e81cfee0e6a5..673a734165bab93699bff75936ab9b1511bb2a31 100644 (file)
@@ -12,6 +12,7 @@
 #include <asm/mach/map.h>
 
 #include "common.h"
+#include "cpuidle.h"
 
 static void __init imx6sx_init_machine(void)
 {
@@ -26,6 +27,7 @@ static void __init imx6sx_init_machine(void)
        of_platform_populate(NULL, of_default_bus_match_table, NULL, parent);
 
        imx_anatop_init();
+       imx6sx_pm_init();
 }
 
 static void __init imx6sx_init_irq(void)
@@ -37,7 +39,12 @@ static void __init imx6sx_init_irq(void)
        irqchip_init();
 }
 
-static const char *imx6sx_dt_compat[] __initconst = {
+static void __init imx6sx_init_late(void)
+{
+       imx6q_cpuidle_init();
+}
+
+static const char * const imx6sx_dt_compat[] __initconst = {
        "fsl,imx6sx",
        NULL,
 };
@@ -47,5 +54,6 @@ DT_MACHINE_START(IMX6SX, "Freescale i.MX6 SoloX (Device Tree)")
        .init_irq       = imx6sx_init_irq,
        .init_machine   = imx6sx_init_machine,
        .dt_compat      = imx6sx_dt_compat,
+       .init_late      = imx6sx_init_late,
        .restart        = mxc_restart,
 MACHINE_END
index ea1fa199c1488d07d8785d02287ec5179523d806..0d01e367b062cdf464821336fce410036bdd0914 100644 (file)
@@ -39,6 +39,7 @@
 
 #include "common.h"
 #include "devices-imx25.h"
+#include "ehci.h"
 #include "hardware.h"
 #include "iomux-mx25.h"
 #include "mx25.h"
index 435a5428a6783b25ea0b7604d4d0a5e527d4f011..9ef4640f3660663dd5fb5eb0f61a38b02e715f8d 100644 (file)
@@ -40,6 +40,7 @@
 #include "3ds_debugboard.h"
 #include "common.h"
 #include "devices-imx27.h"
+#include "ehci.h"
 #include "hardware.h"
 #include "iomux-mx27.h"
 #include "ulpi.h"
index 4217871a9653f67daa596e8a6b0bb724e1325173..453f41a2c5a97b5ee7e08d566dcd9e71f887c647 100644 (file)
@@ -40,6 +40,7 @@
 #include "3ds_debugboard.h"
 #include "common.h"
 #include "devices-imx31.h"
+#include "ehci.h"
 #include "hardware.h"
 #include "iomux-mx3.h"
 #include "ulpi.h"
index eee042fa2768e1f095df4643fc2b64dbc01ac405..e9549a3c0223e849b9bbe6f2009d42405b72d1dc 100644 (file)
@@ -45,6 +45,7 @@
 #include "board-mx31lilly.h"
 #include "common.h"
 #include "devices-imx31.h"
+#include "ehci.h"
 #include "hardware.h"
 #include "iomux-mx3.h"
 #include "ulpi.h"
index fa15d0b6118d8a7befd3ce6bd4b1334278be23da..57eac6f45fab015021830fdd07f7a791b7c90cc2 100644 (file)
@@ -42,6 +42,7 @@
 #include "board-mx31lite.h"
 #include "common.h"
 #include "devices-imx31.h"
+#include "ehci.h"
 #include "hardware.h"
 #include "iomux-mx3.h"
 #include "ulpi.h"
index 08730f238449677e7706d5560ac47f5eb2246886..bb6f8a52a6b8b2ebaba9b8be1dc6f9478cfc3c2c 100644 (file)
@@ -47,6 +47,7 @@
 #include "board-mx31moboard.h"
 #include "common.h"
 #include "devices-imx31.h"
+#include "ehci.h"
 #include "hardware.h"
 #include "iomux-mx3.h"
 #include "ulpi.h"
@@ -434,10 +435,8 @@ static int __init moboard_usbh2_init(void)
                return -ENODEV;
 
        pdev = imx31_add_mxc_ehci_hs(2, &usbh2_pdata);
-       if (IS_ERR(pdev))
-               return PTR_ERR(pdev);
 
-       return 0;
+       return PTR_ERR_OR_ZERO(pdev);
 }
 
 static const struct gpio_led mx31moboard_leds[] __initconst = {
index 4e8b184d773b8f2f5c12aa064aa7e4296d605eba..72cd77d21f638c82f62736c75ab4d43e151277a9 100644 (file)
@@ -50,6 +50,7 @@
 #include "3ds_debugboard.h"
 #include "common.h"
 #include "devices-imx35.h"
+#include "ehci.h"
 #include "hardware.h"
 #include "iomux-mx35.h"
 
index 12212378c67262f5de447ce8916a580d31b69553..2d1c50bd8bdfbd68f4594f20723fb7da2dc1eeda 100644 (file)
@@ -36,6 +36,7 @@
 
 #include "common.h"
 #include "devices-imx27.h"
+#include "ehci.h"
 #include "hardware.h"
 #include "iomux-mx27.h"
 #include "ulpi.h"
index 81b8affb9448378165e08dcf76becc7913a9ffd8..8eb1570f7851f1452c5d6dee41ae226e1d335c4a 100644 (file)
@@ -45,6 +45,7 @@
 
 #include "common.h"
 #include "devices-imx31.h"
+#include "ehci.h"
 #include "hardware.h"
 #include "iomux-mx3.h"
 #include "pcm037.h"
index 6c56fb5553c77ff4975951ad394de955e53d3c43..ee862ad6b6fc9585651e5983a339382fa2af515e 100644 (file)
@@ -36,6 +36,7 @@
 #include "board-pcm038.h"
 #include "common.h"
 #include "devices-imx27.h"
+#include "ehci.h"
 #include "hardware.h"
 #include "iomux-mx27.h"
 #include "ulpi.h"
index c62b5d2613452cfbf50b05924bc5735a0f9cc451..b623bcaca76ca92624effb5fe780c3f67e0c89ae 100644 (file)
@@ -35,6 +35,7 @@
 
 #include "common.h"
 #include "devices-imx35.h"
+#include "ehci.h"
 #include "hardware.h"
 #include "iomux-mx35.h"
 #include "ulpi.h"
index c446027581209419d58c0c9a12aec3c05e8cf7ee..ee7e57b752a75b82b56faa66a0190e8d4203b285 100644 (file)
@@ -20,7 +20,7 @@ static void __init vf610_init_machine(void)
        of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
 }
 
-static const char *vf610_dt_compat[] __initconst = {
+static const char * const vf610_dt_compat[] __initconst = {
        "fsl,vf610",
        NULL,
 };
index 872b3c6ba408e63beed62c343c859eae9729fa8d..97836e94451c471e50033aef17599bad80413585 100644 (file)
@@ -34,6 +34,7 @@
 
 #include "common.h"
 #include "devices-imx35.h"
+#include "ehci.h"
 #include "hardware.h"
 #include "iomux-mx35.h"
 
diff --git a/arch/arm/mach-imx/mm-imx5.c b/arch/arm/mach-imx/mm-imx5.c
deleted file mode 100644 (file)
index 4c11202..0000000
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright 2008-2010 Freescale Semiconductor, Inc. All Rights Reserved.
- *
- * The code contained herein is licensed under the GNU General Public
- * License.  You may obtain a copy of the GNU General Public License
- * Version 2 or later at the following locations:
- *
- * http://www.opensource.org/licenses/gpl-license.html
- * http://www.gnu.org/copyleft/gpl.html
- *
- * Create static mapping between physical to virtual memory.
- */
-
-#include <linux/mm.h>
-#include <linux/init.h>
-#include <linux/clk.h>
-#include <linux/pinctrl/machine.h>
-#include <linux/of_address.h>
-
-#include <asm/mach/map.h>
-
-#include "common.h"
-#include "devices/devices-common.h"
-#include "hardware.h"
-#include "iomux-v3.h"
-
-/*
- * Define the MX51 memory map.
- */
-static struct map_desc mx51_io_desc[] __initdata = {
-       imx_map_entry(MX51, TZIC, MT_DEVICE),
-       imx_map_entry(MX51, IRAM, MT_DEVICE),
-       imx_map_entry(MX51, AIPS1, MT_DEVICE),
-       imx_map_entry(MX51, SPBA0, MT_DEVICE),
-       imx_map_entry(MX51, AIPS2, MT_DEVICE),
-};
-
-/*
- * Define the MX53 memory map.
- */
-static struct map_desc mx53_io_desc[] __initdata = {
-       imx_map_entry(MX53, TZIC, MT_DEVICE),
-       imx_map_entry(MX53, AIPS1, MT_DEVICE),
-       imx_map_entry(MX53, SPBA0, MT_DEVICE),
-       imx_map_entry(MX53, AIPS2, MT_DEVICE),
-};
-
-/*
- * This function initializes the memory map. It is called during the
- * system startup to create static physical to virtual memory mappings
- * for the IO modules.
- */
-void __init mx51_map_io(void)
-{
-       iotable_init(mx51_io_desc, ARRAY_SIZE(mx51_io_desc));
-}
-
-void __init mx53_map_io(void)
-{
-       iotable_init(mx53_io_desc, ARRAY_SIZE(mx53_io_desc));
-}
-
-/*
- * The MIPI HSC unit has been removed from the i.MX51 Reference Manual by
- * the Freescale marketing division. However this did not remove the
- * hardware from the chip which still needs to be configured for proper
- * IPU support.
- */
-static void __init imx51_ipu_mipi_setup(void)
-{
-       void __iomem *hsc_addr;
-       hsc_addr = MX51_IO_ADDRESS(MX51_MIPI_HSC_BASE_ADDR);
-
-       /* setup MIPI module to legacy mode */
-       __raw_writel(0xf00, hsc_addr);
-
-       /* CSI mode: reserved; DI control mode: legacy (from Freescale BSP) */
-       __raw_writel(__raw_readl(hsc_addr + 0x800) | 0x30ff,
-               hsc_addr + 0x800);
-}
-
-void __init imx51_init_early(void)
-{
-       imx51_ipu_mipi_setup();
-       mxc_set_cpu_type(MXC_CPU_MX51);
-       mxc_iomux_v3_init(MX51_IO_ADDRESS(MX51_IOMUXC_BASE_ADDR));
-       imx_src_init();
-}
-
-void __init imx53_init_early(void)
-{
-       mxc_set_cpu_type(MXC_CPU_MX53);
-       imx_src_init();
-}
-
-void __init mx51_init_irq(void)
-{
-       tzic_init_irq(MX51_IO_ADDRESS(MX51_TZIC_BASE_ADDR));
-}
-
-void __init mx53_init_irq(void)
-{
-       struct device_node *np;
-       void __iomem *base;
-
-       np = of_find_compatible_node(NULL, NULL, "fsl,imx53-tzic");
-       base = of_iomap(np, 0);
-       WARN_ON(!base);
-
-       tzic_init_irq(base);
-}
-
-static struct sdma_platform_data imx51_sdma_pdata __initdata = {
-       .fw_name = "sdma-imx51.bin",
-};
-
-static const struct resource imx51_audmux_res[] __initconst = {
-       DEFINE_RES_MEM(MX51_AUDMUX_BASE_ADDR, SZ_16K),
-};
-
-void __init imx51_soc_init(void)
-{
-       mxc_arch_reset_init(MX51_IO_ADDRESS(MX51_WDOG1_BASE_ADDR));
-       mxc_device_init();
-
-       /* i.mx51 has the i.mx35 type gpio */
-       mxc_register_gpio("imx35-gpio", 0, MX51_GPIO1_BASE_ADDR, SZ_16K, MX51_INT_GPIO1_LOW, MX51_INT_GPIO1_HIGH);
-       mxc_register_gpio("imx35-gpio", 1, MX51_GPIO2_BASE_ADDR, SZ_16K, MX51_INT_GPIO2_LOW, MX51_INT_GPIO2_HIGH);
-       mxc_register_gpio("imx35-gpio", 2, MX51_GPIO3_BASE_ADDR, SZ_16K, MX51_INT_GPIO3_LOW, MX51_INT_GPIO3_HIGH);
-       mxc_register_gpio("imx35-gpio", 3, MX51_GPIO4_BASE_ADDR, SZ_16K, MX51_INT_GPIO4_LOW, MX51_INT_GPIO4_HIGH);
-
-       pinctrl_provide_dummies();
-
-       /* i.mx51 has the i.mx35 type sdma */
-       imx_add_imx_sdma("imx35-sdma", MX51_SDMA_BASE_ADDR, MX51_INT_SDMA, &imx51_sdma_pdata);
-
-       /* Setup AIPS registers */
-       imx_set_aips(MX51_IO_ADDRESS(MX51_AIPS1_BASE_ADDR));
-       imx_set_aips(MX51_IO_ADDRESS(MX51_AIPS2_BASE_ADDR));
-
-       /* i.mx51 has the i.mx31 type audmux */
-       platform_device_register_simple("imx31-audmux", 0, imx51_audmux_res,
-                                       ARRAY_SIZE(imx51_audmux_res));
-}
-
-void __init imx51_init_late(void)
-{
-       mx51_neon_fixup();
-       imx5_pm_init();
-}
-
-void __init imx53_init_late(void)
-{
-       imx5_pm_init();
-}
diff --git a/arch/arm/mach-imx/mx1-camera-fiq-ksym.c b/arch/arm/mach-imx/mx1-camera-fiq-ksym.c
deleted file mode 100644 (file)
index fb38436..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * Exported ksyms of ARCH_MX1
- *
- * Copyright (C) 2008, Darius Augulis <augulis.darius@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#include <linux/platform_device.h>
-#include <linux/module.h>
-
-#include <linux/platform_data/camera-mx1.h>
-
-/* IMX camera FIQ handler */
-EXPORT_SYMBOL(mx1_camera_sof_fiq_start);
-EXPORT_SYMBOL(mx1_camera_sof_fiq_end);
diff --git a/arch/arm/mach-imx/mx1-camera-fiq.S b/arch/arm/mach-imx/mx1-camera-fiq.S
deleted file mode 100644 (file)
index 9c69aa6..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  Copyright (C) 2008 Paulius Zaleckas <paulius.zaleckas@teltonika.lt>
- *
- *  Based on linux/arch/arm/lib/floppydma.S
- *      Copyright (C) 1995, 1996 Russell King
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-#include <linux/linkage.h>
-#include <asm/assembler.h>
-
-               .text
-               .global mx1_camera_sof_fiq_end
-               .global mx1_camera_sof_fiq_start
-mx1_camera_sof_fiq_start:
-               @ enable dma
-               ldr     r12, [r9]
-               orr     r12, r12, #0x00000001
-               str     r12, [r9]
-               @ unmask DMA interrupt
-               ldr     r12, [r8]
-               bic     r12, r12, r13
-               str     r12, [r8]
-               @ disable SOF interrupt
-               ldr     r12, [r10]
-               bic     r12, r12, #0x00010000
-               str     r12, [r10]
-               @ clear SOF flag
-               mov     r12, #0x00010000
-               str     r12, [r11]
-               @ return from FIQ
-               subs    pc, lr, #4
-mx1_camera_sof_fiq_end:
index 52d5b1574721adf5b2e7518bc5bb62b236c6171c..1e91a0918e8341220f16adea31c01cccba57e980 100644 (file)
@@ -24,6 +24,7 @@
 
 #include "common.h"
 #include "devices-imx31.h"
+#include "ehci.h"
 #include "hardware.h"
 #include "iomux-mx3.h"
 #include "ulpi.h"
@@ -213,10 +214,8 @@ static int __init devboard_usbh1_init(void)
        usbh1_pdata.otg = phy;
 
        pdev = imx31_add_mxc_ehci_hs(1, &usbh1_pdata);
-       if (IS_ERR(pdev))
-               return PTR_ERR(pdev);
 
-       return 0;
+       return PTR_ERR_OR_ZERO(pdev);
 }
 
 
index a4f43e90f3c12afe42b9db69f3b4f038838a133c..2e895a82a6eb39627f10b53424f9384070f06a89 100644 (file)
@@ -28,6 +28,7 @@
 
 #include "common.h"
 #include "devices-imx31.h"
+#include "ehci.h"
 #include "hardware.h"
 #include "iomux-mx3.h"
 #include "ulpi.h"
@@ -327,10 +328,8 @@ static int __init marxbot_usbh1_init(void)
        usbh1_pdata.otg = phy;
 
        pdev = imx31_add_mxc_ehci_hs(1, &usbh1_pdata);
-       if (IS_ERR(pdev))
-               return PTR_ERR(pdev);
 
-       return 0;
+       return PTR_ERR_OR_ZERO(pdev);
 }
 
 static const struct fsl_usb2_platform_data usb_pdata __initconst = {
index 04ae45dbfaa724a3bae40d11a8e3106239069ae0..89fc35a64448646f2d99567c79010450e62ed058 100644 (file)
@@ -28,6 +28,7 @@
 #include "board-mx31moboard.h"
 #include "common.h"
 #include "devices-imx31.h"
+#include "ehci.h"
 #include "hardware.h"
 #include "iomux-mx3.h"
 #include "ulpi.h"
@@ -141,10 +142,8 @@ static int __init smartbot_otg_host_init(void)
                return -ENODEV;
 
        pdev = imx31_add_mxc_ehci_otg(&otg_host_pdata);
-       if (IS_ERR(pdev))
-               return PTR_ERR(pdev);
 
-       return 0;
+       return PTR_ERR_OR_ZERO(pdev);
 }
 #else
 static inline int smartbot_otg_host_init(void) { return 0; }
diff --git a/arch/arm/mach-imx/mx51.h b/arch/arm/mach-imx/mx51.h
deleted file mode 100644 (file)
index af844f7..0000000
+++ /dev/null
@@ -1,346 +0,0 @@
-#ifndef __MACH_MX51_H__
-#define __MACH_MX51_H__
-
-/*
- * IROM
- */
-#define MX51_IROM_BASE_ADDR            0x0
-#define MX51_IROM_SIZE                 SZ_64K
-
-/*
- * IRAM
- */
-#define MX51_IRAM_BASE_ADDR            0x1ffe0000      /* internal ram */
-#define MX51_IRAM_PARTITIONS           16
-#define MX51_IRAM_SIZE         (MX51_IRAM_PARTITIONS * SZ_8K)  /* 128KB */
-
-#define MX51_GPU_BASE_ADDR             0x20000000
-#define MX51_GPU_CTRL_BASE_ADDR                0x30000000
-#define MX51_IPU_CTRL_BASE_ADDR                0x40000000
-
-/*
- * SPBA global module enabled #0
- */
-#define MX51_SPBA0_BASE_ADDR           0x70000000
-#define MX51_SPBA0_SIZE                        SZ_1M
-
-#define MX51_ESDHC1_BASE_ADDR          (MX51_SPBA0_BASE_ADDR + 0x04000)
-#define MX51_ESDHC2_BASE_ADDR          (MX51_SPBA0_BASE_ADDR + 0x08000)
-#define MX51_UART3_BASE_ADDR           (MX51_SPBA0_BASE_ADDR + 0x0c000)
-#define MX51_ECSPI1_BASE_ADDR          (MX51_SPBA0_BASE_ADDR + 0x10000)
-#define MX51_SSI2_BASE_ADDR            (MX51_SPBA0_BASE_ADDR + 0x14000)
-#define MX51_ESDHC3_BASE_ADDR          (MX51_SPBA0_BASE_ADDR + 0x20000)
-#define MX51_ESDHC4_BASE_ADDR          (MX51_SPBA0_BASE_ADDR + 0x24000)
-#define MX51_SPDIF_BASE_ADDR           (MX51_SPBA0_BASE_ADDR + 0x28000)
-#define MX51_ATA_DMA_BASE_ADDR         (MX51_SPBA0_BASE_ADDR + 0x30000)
-#define MX51_SLIM_DMA_BASE_ADDR                (MX51_SPBA0_BASE_ADDR + 0x34000)
-#define MX51_HSI2C_DMA_BASE_ADDR       (MX51_SPBA0_BASE_ADDR + 0x38000)
-#define MX51_SPBA_CTRL_BASE_ADDR       (MX51_SPBA0_BASE_ADDR + 0x3c000)
-
-/*
- * AIPS 1
- */
-#define MX51_AIPS1_BASE_ADDR           0x73f00000
-#define MX51_AIPS1_SIZE                        SZ_1M
-
-#define MX51_USB_BASE_ADDR             (MX51_AIPS1_BASE_ADDR + 0x80000)
-#define MX51_USB_OTG_BASE_ADDR         (MX51_USB_BASE_ADDR + 0x0000)
-#define MX51_USB_HS1_BASE_ADDR         (MX51_USB_BASE_ADDR + 0x0200)
-#define MX51_USB_HS2_BASE_ADDR         (MX51_USB_BASE_ADDR + 0x0400)
-#define MX51_GPIO1_BASE_ADDR           (MX51_AIPS1_BASE_ADDR + 0x84000)
-#define MX51_GPIO2_BASE_ADDR           (MX51_AIPS1_BASE_ADDR + 0x88000)
-#define MX51_GPIO3_BASE_ADDR           (MX51_AIPS1_BASE_ADDR + 0x8c000)
-#define MX51_GPIO4_BASE_ADDR           (MX51_AIPS1_BASE_ADDR + 0x90000)
-#define MX51_KPP_BASE_ADDR             (MX51_AIPS1_BASE_ADDR + 0x94000)
-#define MX51_WDOG1_BASE_ADDR           (MX51_AIPS1_BASE_ADDR + 0x98000)
-#define MX51_WDOG2_BASE_ADDR           (MX51_AIPS1_BASE_ADDR + 0x9c000)
-#define MX51_GPT1_BASE_ADDR            (MX51_AIPS1_BASE_ADDR + 0xa0000)
-#define MX51_SRTC_BASE_ADDR            (MX51_AIPS1_BASE_ADDR + 0xa4000)
-#define MX51_IOMUXC_BASE_ADDR          (MX51_AIPS1_BASE_ADDR + 0xa8000)
-#define MX51_EPIT1_BASE_ADDR           (MX51_AIPS1_BASE_ADDR + 0xac000)
-#define MX51_EPIT2_BASE_ADDR           (MX51_AIPS1_BASE_ADDR + 0xb0000)
-#define MX51_PWM1_BASE_ADDR            (MX51_AIPS1_BASE_ADDR + 0xb4000)
-#define MX51_PWM2_BASE_ADDR            (MX51_AIPS1_BASE_ADDR + 0xb8000)
-#define MX51_UART1_BASE_ADDR           (MX51_AIPS1_BASE_ADDR + 0xbc000)
-#define MX51_UART2_BASE_ADDR           (MX51_AIPS1_BASE_ADDR + 0xc0000)
-#define MX51_SRC_BASE_ADDR             (MX51_AIPS1_BASE_ADDR + 0xd0000)
-#define MX51_CCM_BASE_ADDR             (MX51_AIPS1_BASE_ADDR + 0xd4000)
-#define MX51_GPC_BASE_ADDR             (MX51_AIPS1_BASE_ADDR + 0xd8000)
-
-/*
- * AIPS 2
- */
-#define MX51_AIPS2_BASE_ADDR           0x83f00000
-#define MX51_AIPS2_SIZE                        SZ_1M
-
-#define MX51_PLL1_BASE_ADDR            (MX51_AIPS2_BASE_ADDR + 0x80000)
-#define MX51_PLL2_BASE_ADDR            (MX51_AIPS2_BASE_ADDR + 0x84000)
-#define MX51_PLL3_BASE_ADDR            (MX51_AIPS2_BASE_ADDR + 0x88000)
-#define MX51_AHBMAX_BASE_ADDR          (MX51_AIPS2_BASE_ADDR + 0x94000)
-#define MX51_IIM_BASE_ADDR             (MX51_AIPS2_BASE_ADDR + 0x98000)
-#define MX51_CSU_BASE_ADDR             (MX51_AIPS2_BASE_ADDR + 0x9c000)
-#define MX51_ARM_BASE_ADDR             (MX51_AIPS2_BASE_ADDR + 0xa0000)
-#define MX51_OWIRE_BASE_ADDR           (MX51_AIPS2_BASE_ADDR + 0xa4000)
-#define MX51_FIRI_BASE_ADDR            (MX51_AIPS2_BASE_ADDR + 0xa8000)
-#define MX51_ECSPI2_BASE_ADDR          (MX51_AIPS2_BASE_ADDR + 0xac000)
-#define MX51_SDMA_BASE_ADDR            (MX51_AIPS2_BASE_ADDR + 0xb0000)
-#define MX51_SCC_BASE_ADDR             (MX51_AIPS2_BASE_ADDR + 0xb4000)
-#define MX51_ROMCP_BASE_ADDR           (MX51_AIPS2_BASE_ADDR + 0xb8000)
-#define MX51_RTIC_BASE_ADDR            (MX51_AIPS2_BASE_ADDR + 0xbc000)
-#define MX51_CSPI_BASE_ADDR            (MX51_AIPS2_BASE_ADDR + 0xc0000)
-#define MX51_I2C2_BASE_ADDR            (MX51_AIPS2_BASE_ADDR + 0xc4000)
-#define MX51_I2C1_BASE_ADDR            (MX51_AIPS2_BASE_ADDR + 0xc8000)
-#define MX51_SSI1_BASE_ADDR            (MX51_AIPS2_BASE_ADDR + 0xcc000)
-#define MX51_AUDMUX_BASE_ADDR          (MX51_AIPS2_BASE_ADDR + 0xd0000)
-#define MX51_M4IF_BASE_ADDR            (MX51_AIPS2_BASE_ADDR + 0xd8000)
-#define MX51_ESDCTL_BASE_ADDR          (MX51_AIPS2_BASE_ADDR + 0xd9000)
-#define MX51_WEIM_BASE_ADDR            (MX51_AIPS2_BASE_ADDR + 0xda000)
-#define MX51_NFC_BASE_ADDR             (MX51_AIPS2_BASE_ADDR + 0xdb000)
-#define MX51_EMI_BASE_ADDR             (MX51_AIPS2_BASE_ADDR + 0xdbf00)
-#define MX51_MIPI_HSC_BASE_ADDR                (MX51_AIPS2_BASE_ADDR + 0xdc000)
-#define MX51_ATA_BASE_ADDR             (MX51_AIPS2_BASE_ADDR + 0xe0000)
-#define MX51_SIM_BASE_ADDR             (MX51_AIPS2_BASE_ADDR + 0xe4000)
-#define MX51_SSI3_BASE_ADDR            (MX51_AIPS2_BASE_ADDR + 0xe8000)
-#define MX51_FEC_BASE_ADDR             (MX51_AIPS2_BASE_ADDR + 0xec000)
-#define MX51_TVE_BASE_ADDR             (MX51_AIPS2_BASE_ADDR + 0xf0000)
-#define MX51_VPU_BASE_ADDR             (MX51_AIPS2_BASE_ADDR + 0xf4000)
-#define MX51_SAHARA_BASE_ADDR          (MX51_AIPS2_BASE_ADDR + 0xf8000)
-
-#define MX51_CSD0_BASE_ADDR            0x90000000
-#define MX51_CSD1_BASE_ADDR            0xa0000000
-#define MX51_CS0_BASE_ADDR             0xb0000000
-#define MX51_CS1_BASE_ADDR             0xb8000000
-#define MX51_CS2_BASE_ADDR             0xc0000000
-#define MX51_CS3_BASE_ADDR             0xc8000000
-#define MX51_CS4_BASE_ADDR             0xcc000000
-#define MX51_CS5_BASE_ADDR             0xce000000
-
-/*
- * NFC
- */
-#define MX51_NFC_AXI_BASE_ADDR         0xcfff0000      /* NAND flash AXI */
-#define MX51_NFC_AXI_SIZE              SZ_64K
-
-#define MX51_GPU2D_BASE_ADDR           0xd0000000
-#define MX51_TZIC_BASE_ADDR            0xe0000000
-#define MX51_TZIC_SIZE                 SZ_16K
-
-#define MX51_IO_P2V(x)                 IMX_IO_P2V(x)
-#define MX51_IO_ADDRESS(x)             IOMEM(MX51_IO_P2V(x))
-
-/*
- * defines for SPBA modules
- */
-#define MX51_SPBA_SDHC1        0x04
-#define MX51_SPBA_SDHC2        0x08
-#define MX51_SPBA_UART3        0x0c
-#define MX51_SPBA_CSPI1        0x10
-#define MX51_SPBA_SSI2 0x14
-#define MX51_SPBA_SDHC3        0x20
-#define MX51_SPBA_SDHC4        0x24
-#define MX51_SPBA_SPDIF        0x28
-#define MX51_SPBA_ATA  0x30
-#define MX51_SPBA_SLIM 0x34
-#define MX51_SPBA_HSI2C        0x38
-#define MX51_SPBA_CTRL 0x3c
-
-/*
- * Defines for modules using static and dynamic DMA channels
- */
-#define MX51_MXC_DMA_CHANNEL_IRAM      30
-#define MX51_MXC_DMA_CHANNEL_SPDIF_TX  MXC_DMA_DYNAMIC_CHANNEL
-#define MX51_MXC_DMA_CHANNEL_UART1_RX  MXC_DMA_DYNAMIC_CHANNEL
-#define MX51_MXC_DMA_CHANNEL_UART1_TX  MXC_DMA_DYNAMIC_CHANNEL
-#define MX51_MXC_DMA_CHANNEL_UART2_RX  MXC_DMA_DYNAMIC_CHANNEL
-#define MX51_MXC_DMA_CHANNEL_UART2_TX  MXC_DMA_DYNAMIC_CHANNEL
-#define MX51_MXC_DMA_CHANNEL_UART3_RX  MXC_DMA_DYNAMIC_CHANNEL
-#define MX51_MXC_DMA_CHANNEL_UART3_TX  MXC_DMA_DYNAMIC_CHANNEL
-#define MX51_MXC_DMA_CHANNEL_MMC1      MXC_DMA_DYNAMIC_CHANNEL
-#define MX51_MXC_DMA_CHANNEL_MMC2      MXC_DMA_DYNAMIC_CHANNEL
-#define MX51_MXC_DMA_CHANNEL_SSI1_RX   MXC_DMA_DYNAMIC_CHANNEL
-#define MX51_MXC_DMA_CHANNEL_SSI1_TX   MXC_DMA_DYNAMIC_CHANNEL
-#define MX51_MXC_DMA_CHANNEL_SSI2_RX   MXC_DMA_DYNAMIC_CHANNEL
-#ifdef CONFIG_SDMA_IRAM
-#define MX51_MXC_DMA_CHANNEL_SSI2_TX   (MX51_MXC_DMA_CHANNEL_IRAM + 1)
-#else                          /*CONFIG_SDMA_IRAM */
-#define MX51_MXC_DMA_CHANNEL_SSI2_TX   MXC_DMA_DYNAMIC_CHANNEL
-#endif                         /*CONFIG_SDMA_IRAM */
-#define MX51_MXC_DMA_CHANNEL_CSPI1_RX  MXC_DMA_DYNAMIC_CHANNEL
-#define MX51_MXC_DMA_CHANNEL_CSPI1_TX  MXC_DMA_DYNAMIC_CHANNEL
-#define MX51_MXC_DMA_CHANNEL_CSPI2_RX  MXC_DMA_DYNAMIC_CHANNEL
-#define MX51_MXC_DMA_CHANNEL_CSPI2_TX  MXC_DMA_DYNAMIC_CHANNEL
-#define MX51_MXC_DMA_CHANNEL_CSPI3_RX  MXC_DMA_DYNAMIC_CHANNEL
-#define MX51_MXC_DMA_CHANNEL_CSPI3_TX  MXC_DMA_DYNAMIC_CHANNEL
-#define MX51_MXC_DMA_CHANNEL_ATA_RX    MXC_DMA_DYNAMIC_CHANNEL
-#define MX51_MXC_DMA_CHANNEL_ATA_TX    MXC_DMA_DYNAMIC_CHANNEL
-#define MX51_MXC_DMA_CHANNEL_MEMORY    MXC_DMA_DYNAMIC_CHANNEL
-
-#define MX51_IS_MEM_DEVICE_NONSHARED(x)                0
-
-/*
- * DMA request assignments
- */
-#define MX51_DMA_REQ_VPU               0
-#define MX51_DMA_REQ_GPC               1
-#define MX51_DMA_REQ_ATA_RX            2
-#define MX51_DMA_REQ_ATA_TX            3
-#define MX51_DMA_REQ_ATA_TX_END                4
-#define MX51_DMA_REQ_SLIM_B            5
-#define MX51_DMA_REQ_CSPI1_RX          6
-#define MX51_DMA_REQ_CSPI1_TX          7
-#define MX51_DMA_REQ_CSPI2_RX          8
-#define MX51_DMA_REQ_CSPI2_TX          9
-#define MX51_DMA_REQ_HS_I2C_TX         10
-#define MX51_DMA_REQ_HS_I2C_RX         11
-#define MX51_DMA_REQ_FIRI_RX           12
-#define MX51_DMA_REQ_FIRI_TX           13
-#define MX51_DMA_REQ_EXTREQ1           14
-#define MX51_DMA_REQ_GPU               15
-#define MX51_DMA_REQ_UART2_RX          16
-#define MX51_DMA_REQ_UART2_TX          17
-#define MX51_DMA_REQ_UART1_RX          18
-#define MX51_DMA_REQ_UART1_TX          19
-#define MX51_DMA_REQ_SDHC1             20
-#define MX51_DMA_REQ_SDHC2             21
-#define MX51_DMA_REQ_SSI2_RX1          22
-#define MX51_DMA_REQ_SSI2_TX1          23
-#define MX51_DMA_REQ_SSI2_RX0          24
-#define MX51_DMA_REQ_SSI2_TX0          25
-#define MX51_DMA_REQ_SSI1_RX1          26
-#define MX51_DMA_REQ_SSI1_TX1          27
-#define MX51_DMA_REQ_SSI1_RX0          28
-#define MX51_DMA_REQ_SSI1_TX0          29
-#define MX51_DMA_REQ_EMI_RD            30
-#define MX51_DMA_REQ_CTI2_0            31
-#define MX51_DMA_REQ_EMI_WR            32
-#define MX51_DMA_REQ_CTI2_1            33
-#define MX51_DMA_REQ_EPIT2             34
-#define MX51_DMA_REQ_SSI3_RX1          35
-#define MX51_DMA_REQ_IPU               36
-#define MX51_DMA_REQ_SSI3_TX1          37
-#define MX51_DMA_REQ_CSPI_RX           38
-#define MX51_DMA_REQ_CSPI_TX           39
-#define MX51_DMA_REQ_SDHC3             40
-#define MX51_DMA_REQ_SDHC4             41
-#define MX51_DMA_REQ_SLIM_B_TX         42
-#define MX51_DMA_REQ_UART3_RX          43
-#define MX51_DMA_REQ_UART3_TX          44
-#define MX51_DMA_REQ_SPDIF             45
-#define MX51_DMA_REQ_SSI3_RX0          46
-#define MX51_DMA_REQ_SSI3_TX0          47
-
-/*
- * Interrupt numbers
- */
-#include <asm/irq.h>
-#define MX51_INT_BASE                  (NR_IRQS_LEGACY + 0)
-#define MX51_INT_RESV0                 (NR_IRQS_LEGACY + 0)
-#define MX51_INT_ESDHC1                        (NR_IRQS_LEGACY + 1)
-#define MX51_INT_ESDHC2                        (NR_IRQS_LEGACY + 2)
-#define MX51_INT_ESDHC3                        (NR_IRQS_LEGACY + 3)
-#define MX51_INT_ESDHC4                        (NR_IRQS_LEGACY + 4)
-#define MX51_INT_RESV5                 (NR_IRQS_LEGACY + 5)
-#define MX51_INT_SDMA                  (NR_IRQS_LEGACY + 6)
-#define MX51_INT_IOMUX                 (NR_IRQS_LEGACY + 7)
-#define MX51_INT_NFC                   (NR_IRQS_LEGACY + 8)
-#define MX51_INT_VPU                   (NR_IRQS_LEGACY + 9)
-#define MX51_INT_IPU_ERR               (NR_IRQS_LEGACY + 10)
-#define MX51_INT_IPU_SYN               (NR_IRQS_LEGACY + 11)
-#define MX51_INT_GPU                   (NR_IRQS_LEGACY + 12)
-#define MX51_INT_RESV13                        (NR_IRQS_LEGACY + 13)
-#define MX51_INT_USB_HS1               (NR_IRQS_LEGACY + 14)
-#define MX51_INT_EMI                   (NR_IRQS_LEGACY + 15)
-#define MX51_INT_USB_HS2               (NR_IRQS_LEGACY + 16)
-#define MX51_INT_USB_HS3               (NR_IRQS_LEGACY + 17)
-#define MX51_INT_USB_OTG               (NR_IRQS_LEGACY + 18)
-#define MX51_INT_SAHARA_H0             (NR_IRQS_LEGACY + 19)
-#define MX51_INT_SAHARA_H1             (NR_IRQS_LEGACY + 20)
-#define MX51_INT_SCC_SMN               (NR_IRQS_LEGACY + 21)
-#define MX51_INT_SCC_STZ               (NR_IRQS_LEGACY + 22)
-#define MX51_INT_SCC_SCM               (NR_IRQS_LEGACY + 23)
-#define MX51_INT_SRTC_NTZ              (NR_IRQS_LEGACY + 24)
-#define MX51_INT_SRTC_TZ               (NR_IRQS_LEGACY + 25)
-#define MX51_INT_RTIC                  (NR_IRQS_LEGACY + 26)
-#define MX51_INT_CSU                   (NR_IRQS_LEGACY + 27)
-#define MX51_INT_SLIM_B                        (NR_IRQS_LEGACY + 28)
-#define MX51_INT_SSI1                  (NR_IRQS_LEGACY + 29)
-#define MX51_INT_SSI2                  (NR_IRQS_LEGACY + 30)
-#define MX51_INT_UART1                 (NR_IRQS_LEGACY + 31)
-#define MX51_INT_UART2                 (NR_IRQS_LEGACY + 32)
-#define MX51_INT_UART3                 (NR_IRQS_LEGACY + 33)
-#define MX51_INT_RESV34                        (NR_IRQS_LEGACY + 34)
-#define MX51_INT_RESV35                        (NR_IRQS_LEGACY + 35)
-#define MX51_INT_ECSPI1                        (NR_IRQS_LEGACY + 36)
-#define MX51_INT_ECSPI2                        (NR_IRQS_LEGACY + 37)
-#define MX51_INT_CSPI                  (NR_IRQS_LEGACY + 38)
-#define MX51_INT_GPT                   (NR_IRQS_LEGACY + 39)
-#define MX51_INT_EPIT1                 (NR_IRQS_LEGACY + 40)
-#define MX51_INT_EPIT2                 (NR_IRQS_LEGACY + 41)
-#define MX51_INT_GPIO1_INT7            (NR_IRQS_LEGACY + 42)
-#define MX51_INT_GPIO1_INT6            (NR_IRQS_LEGACY + 43)
-#define MX51_INT_GPIO1_INT5            (NR_IRQS_LEGACY + 44)
-#define MX51_INT_GPIO1_INT4            (NR_IRQS_LEGACY + 45)
-#define MX51_INT_GPIO1_INT3            (NR_IRQS_LEGACY + 46)
-#define MX51_INT_GPIO1_INT2            (NR_IRQS_LEGACY + 47)
-#define MX51_INT_GPIO1_INT1            (NR_IRQS_LEGACY + 48)
-#define MX51_INT_GPIO1_INT0            (NR_IRQS_LEGACY + 49)
-#define MX51_INT_GPIO1_LOW             (NR_IRQS_LEGACY + 50)
-#define MX51_INT_GPIO1_HIGH            (NR_IRQS_LEGACY + 51)
-#define MX51_INT_GPIO2_LOW             (NR_IRQS_LEGACY + 52)
-#define MX51_INT_GPIO2_HIGH            (NR_IRQS_LEGACY + 53)
-#define MX51_INT_GPIO3_LOW             (NR_IRQS_LEGACY + 54)
-#define MX51_INT_GPIO3_HIGH            (NR_IRQS_LEGACY + 55)
-#define MX51_INT_GPIO4_LOW             (NR_IRQS_LEGACY + 56)
-#define MX51_INT_GPIO4_HIGH            (NR_IRQS_LEGACY + 57)
-#define MX51_INT_WDOG1                 (NR_IRQS_LEGACY + 58)
-#define MX51_INT_WDOG2                 (NR_IRQS_LEGACY + 59)
-#define MX51_INT_KPP                   (NR_IRQS_LEGACY + 60)
-#define MX51_INT_PWM1                  (NR_IRQS_LEGACY + 61)
-#define MX51_INT_I2C1                  (NR_IRQS_LEGACY + 62)
-#define MX51_INT_I2C2                  (NR_IRQS_LEGACY + 63)
-#define MX51_INT_HS_I2C                        (NR_IRQS_LEGACY + 64)
-#define MX51_INT_RESV65                        (NR_IRQS_LEGACY + 65)
-#define MX51_INT_RESV66                        (NR_IRQS_LEGACY + 66)
-#define MX51_INT_SIM_IPB               (NR_IRQS_LEGACY + 67)
-#define MX51_INT_SIM_DAT               (NR_IRQS_LEGACY + 68)
-#define MX51_INT_IIM                   (NR_IRQS_LEGACY + 69)
-#define MX51_INT_ATA                   (NR_IRQS_LEGACY + 70)
-#define MX51_INT_CCM1                  (NR_IRQS_LEGACY + 71)
-#define MX51_INT_CCM2                  (NR_IRQS_LEGACY + 72)
-#define MX51_INT_GPC1                  (NR_IRQS_LEGACY + 73)
-#define MX51_INT_GPC2                  (NR_IRQS_LEGACY + 74)
-#define MX51_INT_SRC                   (NR_IRQS_LEGACY + 75)
-#define MX51_INT_NM                    (NR_IRQS_LEGACY + 76)
-#define MX51_INT_PMU                   (NR_IRQS_LEGACY + 77)
-#define MX51_INT_CTI_IRQ               (NR_IRQS_LEGACY + 78)
-#define MX51_INT_CTI1_TG0              (NR_IRQS_LEGACY + 79)
-#define MX51_INT_CTI1_TG1              (NR_IRQS_LEGACY + 80)
-#define MX51_INT_MCG_ERR               (NR_IRQS_LEGACY + 81)
-#define MX51_INT_MCG_TMR               (NR_IRQS_LEGACY + 82)
-#define MX51_INT_MCG_FUNC              (NR_IRQS_LEGACY + 83)
-#define MX51_INT_GPU2_IRQ              (NR_IRQS_LEGACY + 84)
-#define MX51_INT_GPU2_BUSY             (NR_IRQS_LEGACY + 85)
-#define MX51_INT_RESV86                        (NR_IRQS_LEGACY + 86)
-#define MX51_INT_FEC                   (NR_IRQS_LEGACY + 87)
-#define MX51_INT_OWIRE                 (NR_IRQS_LEGACY + 88)
-#define MX51_INT_CTI1_TG2              (NR_IRQS_LEGACY + 89)
-#define MX51_INT_SJC                   (NR_IRQS_LEGACY + 90)
-#define MX51_INT_SPDIF                 (NR_IRQS_LEGACY + 91)
-#define MX51_INT_TVE                   (NR_IRQS_LEGACY + 92)
-#define MX51_INT_FIRI                  (NR_IRQS_LEGACY + 93)
-#define MX51_INT_PWM2                  (NR_IRQS_LEGACY + 94)
-#define MX51_INT_SLIM_EXP              (NR_IRQS_LEGACY + 95)
-#define MX51_INT_SSI3                  (NR_IRQS_LEGACY + 96)
-#define MX51_INT_EMI_BOOT              (NR_IRQS_LEGACY + 97)
-#define MX51_INT_CTI1_TG3              (NR_IRQS_LEGACY + 98)
-#define MX51_INT_SMC_RX                        (NR_IRQS_LEGACY + 99)
-#define MX51_INT_VPU_IDLE              (NR_IRQS_LEGACY + 100)
-#define MX51_INT_EMI_NFC               (NR_IRQS_LEGACY + 101)
-#define MX51_INT_GPU_IDLE              (NR_IRQS_LEGACY + 102)
-
-#if !defined(__ASSEMBLY__) && !defined(__MXC_BOOT_UNCOMPRESS)
-extern int mx51_revision(void);
-extern void mx51_display_revision(void);
-#endif
-
-#endif /* ifndef __MACH_MX51_H__ */
diff --git a/arch/arm/mach-imx/mx53.h b/arch/arm/mach-imx/mx53.h
deleted file mode 100644 (file)
index f829d1c..0000000
+++ /dev/null
@@ -1,342 +0,0 @@
-#ifndef __MACH_MX53_H__
-#define __MACH_MX53_H__
-
-/*
- * IROM
- */
-#define MX53_IROM_BASE_ADDR            0x0
-#define MX53_IROM_SIZE                 SZ_64K
-
-/* TZIC */
-#define MX53_TZIC_BASE_ADDR            0x0FFFC000
-#define MX53_TZIC_SIZE                 SZ_16K
-
-/*
- * AHCI SATA
- */
-#define MX53_SATA_BASE_ADDR            0x10000000
-
-/*
- * NFC
- */
-#define MX53_NFC_AXI_BASE_ADDR 0xF7FF0000      /* NAND flash AXI */
-#define MX53_NFC_AXI_SIZE              SZ_64K
-
-/*
- * IRAM
- */
-#define MX53_IRAM_BASE_ADDR    0xF8000000      /* internal ram */
-#define MX53_IRAM_PARTITIONS   16
-#define MX53_IRAM_SIZE         (MX53_IRAM_PARTITIONS * SZ_8K)  /* 128KB */
-
-/*
- * Graphics Memory of GPU
- */
-#define MX53_IPU_CTRL_BASE_ADDR        0x18000000
-#define MX53_GPU2D_BASE_ADDR           0x20000000
-#define MX53_GPU_BASE_ADDR             0x30000000
-#define MX53_GPU_GMEM_BASE_ADDR        0xF8020000
-
-#define MX53_DEBUG_BASE_ADDR           0x40000000
-#define MX53_DEBUG_SIZE                SZ_1M
-#define MX53_ETB_BASE_ADDR             (MX53_DEBUG_BASE_ADDR + 0x00001000)
-#define MX53_ETM_BASE_ADDR             (MX53_DEBUG_BASE_ADDR + 0x00002000)
-#define MX53_TPIU_BASE_ADDR            (MX53_DEBUG_BASE_ADDR + 0x00003000)
-#define MX53_CTI0_BASE_ADDR            (MX53_DEBUG_BASE_ADDR + 0x00004000)
-#define MX53_CTI1_BASE_ADDR            (MX53_DEBUG_BASE_ADDR + 0x00005000)
-#define MX53_CTI2_BASE_ADDR            (MX53_DEBUG_BASE_ADDR + 0x00006000)
-#define MX53_CTI3_BASE_ADDR            (MX53_DEBUG_BASE_ADDR + 0x00007000)
-#define MX53_CORTEX_DBG_BASE_ADDR      (MX53_DEBUG_BASE_ADDR + 0x00008000)
-
-/*
- * SPBA global module enabled #0
- */
-#define MX53_SPBA0_BASE_ADDR           0x50000000
-#define MX53_SPBA0_SIZE                SZ_1M
-
-#define MX53_ESDHC1_BASE_ADDR  (MX53_SPBA0_BASE_ADDR + 0x00004000)
-#define MX53_ESDHC2_BASE_ADDR  (MX53_SPBA0_BASE_ADDR + 0x00008000)
-#define MX53_UART3_BASE_ADDR           (MX53_SPBA0_BASE_ADDR + 0x0000C000)
-#define MX53_ECSPI1_BASE_ADDR          (MX53_SPBA0_BASE_ADDR + 0x00010000)
-#define MX53_SSI2_BASE_ADDR            (MX53_SPBA0_BASE_ADDR + 0x00014000)
-#define MX53_ESDHC3_BASE_ADDR  (MX53_SPBA0_BASE_ADDR + 0x00020000)
-#define MX53_ESDHC4_BASE_ADDR  (MX53_SPBA0_BASE_ADDR + 0x00024000)
-#define MX53_SPDIF_BASE_ADDR           (MX53_SPBA0_BASE_ADDR + 0x00028000)
-#define MX53_ASRC_BASE_ADDR            (MX53_SPBA0_BASE_ADDR + 0x0002C000)
-#define MX53_ATA_DMA_BASE_ADDR (MX53_SPBA0_BASE_ADDR + 0x00030000)
-#define MX53_SLIM_DMA_BASE_ADDR        (MX53_SPBA0_BASE_ADDR + 0x00034000)
-#define MX53_HSI2C_DMA_BASE_ADDR       (MX53_SPBA0_BASE_ADDR + 0x00038000)
-#define MX53_SPBA_CTRL_BASE_ADDR       (MX53_SPBA0_BASE_ADDR + 0x0003C000)
-
-/*
- * AIPS 1
- */
-#define MX53_AIPS1_BASE_ADDR   0x53F00000
-#define MX53_AIPS1_SIZE                SZ_1M
-
-#define MX53_OTG_BASE_ADDR     (MX53_AIPS1_BASE_ADDR + 0x00080000)
-#define MX53_GPIO1_BASE_ADDR   (MX53_AIPS1_BASE_ADDR + 0x00084000)
-#define MX53_GPIO2_BASE_ADDR   (MX53_AIPS1_BASE_ADDR + 0x00088000)
-#define MX53_GPIO3_BASE_ADDR   (MX53_AIPS1_BASE_ADDR + 0x0008C000)
-#define MX53_GPIO4_BASE_ADDR   (MX53_AIPS1_BASE_ADDR + 0x00090000)
-#define MX53_KPP_BASE_ADDR     (MX53_AIPS1_BASE_ADDR + 0x00094000)
-#define MX53_WDOG1_BASE_ADDR   (MX53_AIPS1_BASE_ADDR + 0x00098000)
-#define MX53_WDOG2_BASE_ADDR   (MX53_AIPS1_BASE_ADDR + 0x0009C000)
-#define MX53_GPT1_BASE_ADDR    (MX53_AIPS1_BASE_ADDR + 0x000A0000)
-#define MX53_SRTC_BASE_ADDR    (MX53_AIPS1_BASE_ADDR + 0x000A4000)
-#define MX53_IOMUXC_BASE_ADDR  (MX53_AIPS1_BASE_ADDR + 0x000A8000)
-#define MX53_EPIT1_BASE_ADDR   (MX53_AIPS1_BASE_ADDR + 0x000AC000)
-#define MX53_EPIT2_BASE_ADDR   (MX53_AIPS1_BASE_ADDR + 0x000B0000)
-#define MX53_PWM1_BASE_ADDR    (MX53_AIPS1_BASE_ADDR + 0x000B4000)
-#define MX53_PWM2_BASE_ADDR    (MX53_AIPS1_BASE_ADDR + 0x000B8000)
-#define MX53_UART1_BASE_ADDR   (MX53_AIPS1_BASE_ADDR + 0x000BC000)
-#define MX53_UART2_BASE_ADDR   (MX53_AIPS1_BASE_ADDR + 0x000C0000)
-#define MX53_SRC_BASE_ADDR     (MX53_AIPS1_BASE_ADDR + 0x000D0000)
-#define MX53_CCM_BASE_ADDR     (MX53_AIPS1_BASE_ADDR + 0x000D4000)
-#define MX53_GPC_BASE_ADDR     (MX53_AIPS1_BASE_ADDR + 0x000D8000)
-#define MX53_GPIO5_BASE_ADDR   (MX53_AIPS1_BASE_ADDR + 0x000DC000)
-#define MX53_GPIO6_BASE_ADDR   (MX53_AIPS1_BASE_ADDR + 0x000E0000)
-#define MX53_GPIO7_BASE_ADDR   (MX53_AIPS1_BASE_ADDR + 0x000E4000)
-#define MX53_ATA_BASE_ADDR     (MX53_AIPS1_BASE_ADDR + 0x000E8000)
-#define MX53_I2C3_BASE_ADDR    (MX53_AIPS1_BASE_ADDR + 0x000EC000)
-#define MX53_UART4_BASE_ADDR   (MX53_AIPS1_BASE_ADDR + 0x000F0000)
-
-/*
- * AIPS 2
- */
-#define MX53_AIPS2_BASE_ADDR           0x63F00000
-#define MX53_AIPS2_SIZE                        SZ_1M
-
-#define MX53_PLL1_BASE_ADDR    (MX53_AIPS2_BASE_ADDR + 0x00080000)
-#define MX53_PLL2_BASE_ADDR    (MX53_AIPS2_BASE_ADDR + 0x00084000)
-#define MX53_PLL3_BASE_ADDR    (MX53_AIPS2_BASE_ADDR + 0x00088000)
-#define MX53_PLL4_BASE_ADDR    (MX53_AIPS2_BASE_ADDR + 0x0008C000)
-#define MX53_UART5_BASE_ADDR   (MX53_AIPS2_BASE_ADDR + 0x00090000)
-#define MX53_AHBMAX_BASE_ADDR  (MX53_AIPS2_BASE_ADDR + 0x00094000)
-#define MX53_IIM_BASE_ADDR     (MX53_AIPS2_BASE_ADDR + 0x00098000)
-#define MX53_CSU_BASE_ADDR     (MX53_AIPS2_BASE_ADDR + 0x0009C000)
-#define MX53_ARM_BASE_ADDR     (MX53_AIPS2_BASE_ADDR + 0x000A0000)
-#define MX53_OWIRE_BASE_ADDR   (MX53_AIPS2_BASE_ADDR + 0x000A4000)
-#define MX53_FIRI_BASE_ADDR    (MX53_AIPS2_BASE_ADDR + 0x000A8000)
-#define MX53_ECSPI2_BASE_ADDR  (MX53_AIPS2_BASE_ADDR + 0x000AC000)
-#define MX53_SDMA_BASE_ADDR    (MX53_AIPS2_BASE_ADDR + 0x000B0000)
-#define MX53_SCC_BASE_ADDR     (MX53_AIPS2_BASE_ADDR + 0x000B4000)
-#define MX53_ROMCP_BASE_ADDR   (MX53_AIPS2_BASE_ADDR + 0x000B8000)
-#define MX53_RTIC_BASE_ADDR    (MX53_AIPS2_BASE_ADDR + 0x000BC000)
-#define MX53_CSPI_BASE_ADDR    (MX53_AIPS2_BASE_ADDR + 0x000C0000)
-#define MX53_I2C2_BASE_ADDR    (MX53_AIPS2_BASE_ADDR + 0x000C4000)
-#define MX53_I2C1_BASE_ADDR    (MX53_AIPS2_BASE_ADDR + 0x000C8000)
-#define MX53_SSI1_BASE_ADDR    (MX53_AIPS2_BASE_ADDR + 0x000CC000)
-#define MX53_AUDMUX_BASE_ADDR  (MX53_AIPS2_BASE_ADDR + 0x000D0000)
-#define MX53_RTC_BASE_ADDR     (MX53_AIPS2_BASE_ADDR + 0x000D4000)
-#define MX53_M4IF_BASE_ADDR    (MX53_AIPS2_BASE_ADDR + 0x000D8000)
-#define MX53_ESDCTL_BASE_ADDR  (MX53_AIPS2_BASE_ADDR + 0x000D9000)
-#define MX53_WEIM_BASE_ADDR    (MX53_AIPS2_BASE_ADDR + 0x000DA000)
-#define MX53_NFC_BASE_ADDR     (MX53_AIPS2_BASE_ADDR + 0x000DB000)
-#define MX53_EMI_BASE_ADDR     (MX53_AIPS2_BASE_ADDR + 0x000DBF00)
-#define MX53_MIPI_HSC_BASE_ADDR        (MX53_AIPS2_BASE_ADDR + 0x000DC000)
-#define MX53_MLB_BASE_ADDR     (MX53_AIPS2_BASE_ADDR + 0x000E4000)
-#define MX53_SSI3_BASE_ADDR    (MX53_AIPS2_BASE_ADDR + 0x000E8000)
-#define MX53_FEC_BASE_ADDR     (MX53_AIPS2_BASE_ADDR + 0x000EC000)
-#define MX53_TVE_BASE_ADDR     (MX53_AIPS2_BASE_ADDR + 0x000F0000)
-#define MX53_VPU_BASE_ADDR     (MX53_AIPS2_BASE_ADDR + 0x000F4000)
-#define MX53_SAHARA_BASE_ADDR  (MX53_AIPS2_BASE_ADDR + 0x000F8000)
-#define MX53_PTP_BASE_ADDR     (MX53_AIPS2_BASE_ADDR + 0x000FC000)
-
-/*
- * Memory regions and CS
- */
-#define MX53_CSD0_BASE_ADDR            0x70000000
-#define MX53_CSD1_BASE_ADDR            0xB0000000
-#define MX53_CS0_BASE_ADDR             0xF0000000
-#define MX53_CS1_32MB_BASE_ADDR        0xF2000000
-#define MX53_CS1_64MB_BASE_ADDR                0xF4000000
-#define MX53_CS2_64MB_BASE_ADDR                0xF4000000
-#define MX53_CS2_96MB_BASE_ADDR                0xF6000000
-#define MX53_CS3_BASE_ADDR             0xF6000000
-
-#define MX53_IO_P2V(x)                 IMX_IO_P2V(x)
-#define MX53_IO_ADDRESS(x)             IOMEM(MX53_IO_P2V(x))
-
-/*
- * defines for SPBA modules
- */
-#define MX53_SPBA_SDHC1        0x04
-#define MX53_SPBA_SDHC2        0x08
-#define MX53_SPBA_UART3        0x0C
-#define MX53_SPBA_CSPI1        0x10
-#define MX53_SPBA_SSI2         0x14
-#define MX53_SPBA_SDHC3        0x20
-#define MX53_SPBA_SDHC4        0x24
-#define MX53_SPBA_SPDIF        0x28
-#define MX53_SPBA_ATA          0x30
-#define MX53_SPBA_SLIM         0x34
-#define MX53_SPBA_HSI2C        0x38
-#define MX53_SPBA_CTRL         0x3C
-
-/*
- * DMA request assignments
- */
-#define MX53_DMA_REQ_SSI3_TX0          47
-#define MX53_DMA_REQ_SSI3_RX0          46
-#define MX53_DMA_REQ_SSI3_TX1          45
-#define MX53_DMA_REQ_SSI3_RX1          44
-#define MX53_DMA_REQ_UART3_TX  43
-#define MX53_DMA_REQ_UART3_RX  42
-#define MX53_DMA_REQ_ESAI_TX           41
-#define MX53_DMA_REQ_ESAI_RX           40
-#define MX53_DMA_REQ_CSPI_TX           39
-#define MX53_DMA_REQ_CSPI_RX           38
-#define MX53_DMA_REQ_ASRC_DMA6 37
-#define MX53_DMA_REQ_ASRC_DMA5 36
-#define MX53_DMA_REQ_ASRC_DMA4 35
-#define MX53_DMA_REQ_ASRC_DMA3 34
-#define MX53_DMA_REQ_ASRC_DMA2 33
-#define MX53_DMA_REQ_ASRC_DMA1 32
-#define MX53_DMA_REQ_EMI_WR            31
-#define MX53_DMA_REQ_EMI_RD            30
-#define MX53_DMA_REQ_SSI1_TX0          29
-#define MX53_DMA_REQ_SSI1_RX0          28
-#define MX53_DMA_REQ_SSI1_TX1          27
-#define MX53_DMA_REQ_SSI1_RX1          26
-#define MX53_DMA_REQ_SSI2_TX0          25
-#define MX53_DMA_REQ_SSI2_RX0          24
-#define MX53_DMA_REQ_SSI2_TX1          23
-#define MX53_DMA_REQ_SSI2_RX1          22
-#define MX53_DMA_REQ_I2C2_SDHC2        21
-#define MX53_DMA_REQ_I2C1_SDHC1        20
-#define MX53_DMA_REQ_UART1_TX  19
-#define MX53_DMA_REQ_UART1_RX  18
-#define MX53_DMA_REQ_UART5_TX  17
-#define MX53_DMA_REQ_UART5_RX  16
-#define MX53_DMA_REQ_SPDIF_TX          15
-#define MX53_DMA_REQ_SPDIF_RX          14
-#define MX53_DMA_REQ_UART2_FIRI_TX     13
-#define MX53_DMA_REQ_UART2_FIRI_RX     12
-#define MX53_DMA_REQ_SDHC4             11
-#define MX53_DMA_REQ_I2C3_SDHC3        10
-#define MX53_DMA_REQ_CSPI2_TX          9
-#define MX53_DMA_REQ_CSPI2_RX          8
-#define MX53_DMA_REQ_CSPI1_TX          7
-#define MX53_DMA_REQ_CSPI1_RX          6
-#define MX53_DMA_REQ_IPU               5
-#define MX53_DMA_REQ_ATA_TX_END        4
-#define MX53_DMA_REQ_ATA_UART4_TX      3
-#define MX53_DMA_REQ_ATA_UART4_RX      2
-#define MX53_DMA_REQ_GPC               1
-#define MX53_DMA_REQ_VPU               0
-
-/*
- * Interrupt numbers
- */
-#include <asm/irq.h>
-#define MX53_INT_RESV0         (NR_IRQS_LEGACY + 0)
-#define MX53_INT_ESDHC1                (NR_IRQS_LEGACY + 1)
-#define MX53_INT_ESDHC2                (NR_IRQS_LEGACY + 2)
-#define MX53_INT_ESDHC3                (NR_IRQS_LEGACY + 3)
-#define MX53_INT_ESDHC4                (NR_IRQS_LEGACY + 4)
-#define MX53_INT_DAP           (NR_IRQS_LEGACY + 5)
-#define MX53_INT_SDMA          (NR_IRQS_LEGACY + 6)
-#define MX53_INT_IOMUX         (NR_IRQS_LEGACY + 7)
-#define MX53_INT_NFC           (NR_IRQS_LEGACY + 8)
-#define MX53_INT_VPU           (NR_IRQS_LEGACY + 9)
-#define MX53_INT_IPU_ERR       (NR_IRQS_LEGACY + 10)
-#define MX53_INT_IPU_SYN       (NR_IRQS_LEGACY + 11)
-#define MX53_INT_GPU           (NR_IRQS_LEGACY + 12)
-#define MX53_INT_UART4         (NR_IRQS_LEGACY + 13)
-#define MX53_INT_USB_H1                (NR_IRQS_LEGACY + 14)
-#define MX53_INT_EMI           (NR_IRQS_LEGACY + 15)
-#define MX53_INT_USB_H2                (NR_IRQS_LEGACY + 16)
-#define MX53_INT_USB_H3                (NR_IRQS_LEGACY + 17)
-#define MX53_INT_USB_OTG       (NR_IRQS_LEGACY + 18)
-#define MX53_INT_SAHARA_H0     (NR_IRQS_LEGACY + 19)
-#define MX53_INT_SAHARA_H1     (NR_IRQS_LEGACY + 20)
-#define MX53_INT_SCC_SMN       (NR_IRQS_LEGACY + 21)
-#define MX53_INT_SCC_STZ       (NR_IRQS_LEGACY + 22)
-#define MX53_INT_SCC_SCM       (NR_IRQS_LEGACY + 23)
-#define MX53_INT_SRTC_NTZ      (NR_IRQS_LEGACY + 24)
-#define MX53_INT_SRTC_TZ       (NR_IRQS_LEGACY + 25)
-#define MX53_INT_RTIC          (NR_IRQS_LEGACY + 26)
-#define MX53_INT_CSU           (NR_IRQS_LEGACY + 27)
-#define MX53_INT_SATA          (NR_IRQS_LEGACY + 28)
-#define MX53_INT_SSI1          (NR_IRQS_LEGACY + 29)
-#define MX53_INT_SSI2          (NR_IRQS_LEGACY + 30)
-#define MX53_INT_UART1         (NR_IRQS_LEGACY + 31)
-#define MX53_INT_UART2         (NR_IRQS_LEGACY + 32)
-#define MX53_INT_UART3         (NR_IRQS_LEGACY + 33)
-#define MX53_INT_RTC           (NR_IRQS_LEGACY + 34)
-#define MX53_INT_PTP           (NR_IRQS_LEGACY + 35)
-#define MX53_INT_ECSPI1                (NR_IRQS_LEGACY + 36)
-#define MX53_INT_ECSPI2                (NR_IRQS_LEGACY + 37)
-#define MX53_INT_CSPI          (NR_IRQS_LEGACY + 38)
-#define MX53_INT_GPT           (NR_IRQS_LEGACY + 39)
-#define MX53_INT_EPIT1         (NR_IRQS_LEGACY + 40)
-#define MX53_INT_EPIT2         (NR_IRQS_LEGACY + 41)
-#define MX53_INT_GPIO1_INT7    (NR_IRQS_LEGACY + 42)
-#define MX53_INT_GPIO1_INT6    (NR_IRQS_LEGACY + 43)
-#define MX53_INT_GPIO1_INT5    (NR_IRQS_LEGACY + 44)
-#define MX53_INT_GPIO1_INT4    (NR_IRQS_LEGACY + 45)
-#define MX53_INT_GPIO1_INT3    (NR_IRQS_LEGACY + 46)
-#define MX53_INT_GPIO1_INT2    (NR_IRQS_LEGACY + 47)
-#define MX53_INT_GPIO1_INT1    (NR_IRQS_LEGACY + 48)
-#define MX53_INT_GPIO1_INT0    (NR_IRQS_LEGACY + 49)
-#define MX53_INT_GPIO1_LOW     (NR_IRQS_LEGACY + 50)
-#define MX53_INT_GPIO1_HIGH    (NR_IRQS_LEGACY + 51)
-#define MX53_INT_GPIO2_LOW     (NR_IRQS_LEGACY + 52)
-#define MX53_INT_GPIO2_HIGH    (NR_IRQS_LEGACY + 53)
-#define MX53_INT_GPIO3_LOW     (NR_IRQS_LEGACY + 54)
-#define MX53_INT_GPIO3_HIGH    (NR_IRQS_LEGACY + 55)
-#define MX53_INT_GPIO4_LOW     (NR_IRQS_LEGACY + 56)
-#define MX53_INT_GPIO4_HIGH    (NR_IRQS_LEGACY + 57)
-#define MX53_INT_WDOG1         (NR_IRQS_LEGACY + 58)
-#define MX53_INT_WDOG2         (NR_IRQS_LEGACY + 59)
-#define MX53_INT_KPP           (NR_IRQS_LEGACY + 60)
-#define MX53_INT_PWM1          (NR_IRQS_LEGACY + 61)
-#define MX53_INT_I2C1          (NR_IRQS_LEGACY + 62)
-#define MX53_INT_I2C2          (NR_IRQS_LEGACY + 63)
-#define MX53_INT_I2C3          (NR_IRQS_LEGACY + 64)
-#define MX53_INT_MLB           (NR_IRQS_LEGACY + 65)
-#define MX53_INT_ASRC          (NR_IRQS_LEGACY + 66)
-#define MX53_INT_SPDIF         (NR_IRQS_LEGACY + 67)
-#define MX53_INT_SIM_DAT       (NR_IRQS_LEGACY + 68)
-#define MX53_INT_IIM           (NR_IRQS_LEGACY + 69)
-#define MX53_INT_ATA           (NR_IRQS_LEGACY + 70)
-#define MX53_INT_CCM1          (NR_IRQS_LEGACY + 71)
-#define MX53_INT_CCM2          (NR_IRQS_LEGACY + 72)
-#define MX53_INT_GPC1          (NR_IRQS_LEGACY + 73)
-#define MX53_INT_GPC2          (NR_IRQS_LEGACY + 74)
-#define MX53_INT_SRC           (NR_IRQS_LEGACY + 75)
-#define MX53_INT_NM            (NR_IRQS_LEGACY + 76)
-#define MX53_INT_PMU           (NR_IRQS_LEGACY + 77)
-#define MX53_INT_CTI_IRQ       (NR_IRQS_LEGACY + 78)
-#define MX53_INT_CTI1_TG0      (NR_IRQS_LEGACY + 79)
-#define MX53_INT_CTI1_TG1      (NR_IRQS_LEGACY + 80)
-#define MX53_INT_ESAI          (NR_IRQS_LEGACY + 81)
-#define MX53_INT_CAN1          (NR_IRQS_LEGACY + 82)
-#define MX53_INT_CAN2          (NR_IRQS_LEGACY + 83)
-#define MX53_INT_GPU2_IRQ      (NR_IRQS_LEGACY + 84)
-#define MX53_INT_GPU2_BUSY     (NR_IRQS_LEGACY + 85)
-#define MX53_INT_UART5         (NR_IRQS_LEGACY + 86)
-#define MX53_INT_FEC           (NR_IRQS_LEGACY + 87)
-#define MX53_INT_OWIRE         (NR_IRQS_LEGACY + 88)
-#define MX53_INT_CTI1_TG2      (NR_IRQS_LEGACY + 89)
-#define MX53_INT_SJC           (NR_IRQS_LEGACY + 90)
-#define MX53_INT_TVE           (NR_IRQS_LEGACY + 92)
-#define MX53_INT_FIRI          (NR_IRQS_LEGACY + 93)
-#define MX53_INT_PWM2          (NR_IRQS_LEGACY + 94)
-#define MX53_INT_SLIM_EXP      (NR_IRQS_LEGACY + 95)
-#define MX53_INT_SSI3          (NR_IRQS_LEGACY + 96)
-#define MX53_INT_EMI_BOOT      (NR_IRQS_LEGACY + 97)
-#define MX53_INT_CTI1_TG3      (NR_IRQS_LEGACY + 98)
-#define MX53_INT_SMC_RX                (NR_IRQS_LEGACY + 99)
-#define MX53_INT_VPU_IDLE      (NR_IRQS_LEGACY + 100)
-#define MX53_INT_EMI_NFC       (NR_IRQS_LEGACY + 101)
-#define MX53_INT_GPU_IDLE      (NR_IRQS_LEGACY + 102)
-#define MX53_INT_GPIO5_LOW     (NR_IRQS_LEGACY + 103)
-#define MX53_INT_GPIO5_HIGH    (NR_IRQS_LEGACY + 104)
-#define MX53_INT_GPIO6_LOW     (NR_IRQS_LEGACY + 105)
-#define MX53_INT_GPIO6_HIGH    (NR_IRQS_LEGACY + 106)
-#define MX53_INT_GPIO7_LOW     (NR_IRQS_LEGACY + 107)
-#define MX53_INT_GPIO7_HIGH    (NR_IRQS_LEGACY + 108)
-
-#endif /* ifndef __MACH_MX53_H__ */
index 75d6a37e1ae490f3603ac84b19369f6d3204a139..a39b69ef43019ff0460aaa7012c63d466d48f39a 100644 (file)
@@ -154,10 +154,17 @@ extern unsigned int __mxc_cpu_type;
 #endif
 
 #ifndef __ASSEMBLY__
+#ifdef CONFIG_SOC_IMX6SL
 static inline bool cpu_is_imx6sl(void)
 {
        return __mxc_cpu_type == MXC_CPU_IMX6SL;
 }
+#else
+static inline bool cpu_is_imx6sl(void)
+{
+       return false;
+}
+#endif
 
 static inline bool cpu_is_imx6dl(void)
 {
index 58aeaf5baaf62f24368b1b646e57aee867282d03..f1f80ab73e692ea70e95044eb016e92c9eddc28f 100644 (file)
 
 #include "common.h"
 #include "cpuidle.h"
-#include "crm-regs-imx5.h"
 #include "hardware.h"
 
+#define MXC_CCM_CLPCR                  0x54
+#define MXC_CCM_CLPCR_LPM_OFFSET       0
+#define MXC_CCM_CLPCR_LPM_MASK         0x3
+#define MXC_CCM_CLPCR_STBY_COUNT_OFFSET        9
+#define MXC_CCM_CLPCR_VSTBY            (0x1 << 8)
+#define MXC_CCM_CLPCR_SBYOS            (0x1 << 6)
+
+#define MXC_CORTEXA8_PLAT_LPC          0xc
+#define MXC_CORTEXA8_PLAT_LPC_DSM      (1 << 0)
+#define MXC_CORTEXA8_PLAT_LPC_DBG_DSM  (1 << 1)
+
+#define MXC_SRPG_NEON_SRPGCR           0x280
+#define MXC_SRPG_ARM_SRPGCR            0x2a0
+#define MXC_SRPG_EMPGC0_SRPGCR         0x2c0
+#define MXC_SRPG_EMPGC1_SRPGCR         0x2d0
+
+#define MXC_SRPGCR_PCR                 1
+
 /*
  * The WAIT_UNCLOCKED_POWER_OFF state only requires <= 500ns to exit.
  * This is also the lowest power state possible without affecting
  */
 #define IMX5_DEFAULT_CPU_IDLE_STATE WAIT_UNCLOCKED_POWER_OFF
 
+struct imx5_pm_data {
+       phys_addr_t cortex_addr;
+       phys_addr_t gpc_addr;
+};
+
+static const struct imx5_pm_data imx51_pm_data __initconst = {
+       .cortex_addr = 0x83fa0000,
+       .gpc_addr = 0x73fd8000,
+};
+
+static const struct imx5_pm_data imx53_pm_data __initconst = {
+       .cortex_addr = 0x63fa0000,
+       .gpc_addr = 0x53fd8000,
+};
+
+static void __iomem *ccm_base;
+static void __iomem *cortex_base;
+static void __iomem *gpc_base;
+
+void __init imx5_pm_set_ccm_base(void __iomem *base)
+{
+       ccm_base = base;
+}
+
 /*
  * set cpu low power mode before WFI instruction. This function is called
  * mx5 because it can be used for mx51, and mx53.
@@ -43,12 +84,16 @@ static void mx5_cpu_lp_set(enum mxc_cpu_pwr_mode mode)
        int stop_mode = 0;
 
        /* always allow platform to issue a deep sleep mode request */
-       plat_lpc = __raw_readl(MXC_CORTEXA8_PLAT_LPC) &
+       plat_lpc = __raw_readl(cortex_base + MXC_CORTEXA8_PLAT_LPC) &
            ~(MXC_CORTEXA8_PLAT_LPC_DSM);
-       ccm_clpcr = __raw_readl(MXC_CCM_CLPCR) & ~(MXC_CCM_CLPCR_LPM_MASK);
-       arm_srpgcr = __raw_readl(MXC_SRPG_ARM_SRPGCR) & ~(MXC_SRPGCR_PCR);
-       empgc0 = __raw_readl(MXC_SRPG_EMPGC0_SRPGCR) & ~(MXC_SRPGCR_PCR);
-       empgc1 = __raw_readl(MXC_SRPG_EMPGC1_SRPGCR) & ~(MXC_SRPGCR_PCR);
+       ccm_clpcr = __raw_readl(ccm_base + MXC_CCM_CLPCR) &
+                   ~(MXC_CCM_CLPCR_LPM_MASK);
+       arm_srpgcr = __raw_readl(gpc_base + MXC_SRPG_ARM_SRPGCR) &
+                    ~(MXC_SRPGCR_PCR);
+       empgc0 = __raw_readl(gpc_base + MXC_SRPG_EMPGC0_SRPGCR) &
+                ~(MXC_SRPGCR_PCR);
+       empgc1 = __raw_readl(gpc_base + MXC_SRPG_EMPGC1_SRPGCR) &
+                ~(MXC_SRPGCR_PCR);
 
        switch (mode) {
        case WAIT_CLOCKED:
@@ -82,17 +127,17 @@ static void mx5_cpu_lp_set(enum mxc_cpu_pwr_mode mode)
                return;
        }
 
-       __raw_writel(plat_lpc, MXC_CORTEXA8_PLAT_LPC);
-       __raw_writel(ccm_clpcr, MXC_CCM_CLPCR);
-       __raw_writel(arm_srpgcr, MXC_SRPG_ARM_SRPGCR);
-       __raw_writel(arm_srpgcr, MXC_SRPG_NEON_SRPGCR);
+       __raw_writel(plat_lpc, cortex_base + MXC_CORTEXA8_PLAT_LPC);
+       __raw_writel(ccm_clpcr, ccm_base + MXC_CCM_CLPCR);
+       __raw_writel(arm_srpgcr, gpc_base + MXC_SRPG_ARM_SRPGCR);
+       __raw_writel(arm_srpgcr, gpc_base + MXC_SRPG_NEON_SRPGCR);
 
        if (stop_mode) {
                empgc0 |= MXC_SRPGCR_PCR;
                empgc1 |= MXC_SRPGCR_PCR;
 
-               __raw_writel(empgc0, MXC_SRPG_EMPGC0_SRPGCR);
-               __raw_writel(empgc1, MXC_SRPG_EMPGC1_SRPGCR);
+               __raw_writel(empgc0, gpc_base + MXC_SRPG_EMPGC0_SRPGCR);
+               __raw_writel(empgc1, gpc_base + MXC_SRPG_EMPGC1_SRPGCR);
        }
 }
 
@@ -114,8 +159,8 @@ static int mx5_suspend_enter(suspend_state_t state)
                flush_cache_all();
 
                /*clear the EMPGC0/1 bits */
-               __raw_writel(0, MXC_SRPG_EMPGC0_SRPGCR);
-               __raw_writel(0, MXC_SRPG_EMPGC1_SRPGCR);
+               __raw_writel(0, gpc_base + MXC_SRPG_EMPGC0_SRPGCR);
+               __raw_writel(0, gpc_base + MXC_SRPG_EMPGC1_SRPGCR);
        }
        cpu_do_idle();
 
@@ -149,7 +194,7 @@ static void imx5_pm_idle(void)
        imx5_cpu_do_idle();
 }
 
-static int __init imx5_pm_common_init(void)
+static int __init imx5_pm_common_init(const struct imx5_pm_data *data)
 {
        int ret;
        struct clk *gpc_dvfs_clk = clk_get(NULL, "gpc_dvfs");
@@ -163,15 +208,28 @@ static int __init imx5_pm_common_init(void)
 
        arm_pm_idle = imx5_pm_idle;
 
+       cortex_base = ioremap(data->cortex_addr, SZ_16K);
+       gpc_base = ioremap(data->gpc_addr, SZ_16K);
+       WARN_ON(!ccm_base || !cortex_base || !gpc_base);
+
        /* Set the registers to the default cpu idle state. */
        mx5_cpu_lp_set(IMX5_DEFAULT_CPU_IDLE_STATE);
 
-       return imx5_cpuidle_init();
+       ret = imx5_cpuidle_init();
+       if (ret)
+               pr_warn("%s: cpuidle init failed %d\n", __func__, ret);
+
+       suspend_set_ops(&mx5_suspend_ops);
+
+       return 0;
+}
+
+void __init imx51_pm_init(void)
+{
+       imx5_pm_common_init(&imx51_pm_data);
 }
 
-void __init imx5_pm_init(void)
+void __init imx53_pm_init(void)
 {
-       int ret = imx5_pm_common_init();
-       if (!ret)
-               suspend_set_ops(&mx5_suspend_ops);
+       imx5_pm_common_init(&imx53_pm_data);
 }
index 9392a8f4ef24bcbb31ad58a14623b23c6511afc1..5c3af8f993d0c490db6c58a7a8c349e0fb282fc6 100644 (file)
@@ -129,6 +129,14 @@ static const u32 imx6sl_mmdc_io_offset[] __initconst = {
        0x330, 0x334, 0x320,        /* SDCKE0, SDCKE1, RESET */
 };
 
+static const u32 imx6sx_mmdc_io_offset[] __initconst = {
+       0x2ec, 0x2f0, 0x2f4, 0x2f8, /* DQM0 ~ DQM3 */
+       0x60c, 0x610, 0x61c, 0x620, /* GPR_B0DS ~ GPR_B3DS */
+       0x300, 0x2fc, 0x32c, 0x5f4, /* CAS, RAS, SDCLK_0, GPR_ADDS */
+       0x310, 0x314, 0x5f8, 0x608, /* SODT0, SODT1, MODE_CTL, MODE */
+       0x330, 0x334, 0x338, 0x33c, /* SDQS0 ~ SDQS3 */
+};
+
 static const struct imx6_pm_socdata imx6q_pm_data __initconst = {
        .cpu_type = MXC_CPU_IMX6Q,
        .mmdc_compat = "fsl,imx6q-mmdc",
@@ -159,6 +167,16 @@ static const struct imx6_pm_socdata imx6sl_pm_data __initconst = {
        .mmdc_io_offset = imx6sl_mmdc_io_offset,
 };
 
+static const struct imx6_pm_socdata imx6sx_pm_data __initconst = {
+       .cpu_type = MXC_CPU_IMX6SX,
+       .mmdc_compat = "fsl,imx6sx-mmdc",
+       .src_compat = "fsl,imx6sx-src",
+       .iomuxc_compat = "fsl,imx6sx-iomuxc",
+       .gpc_compat = "fsl,imx6sx-gpc",
+       .mmdc_io_num = ARRAY_SIZE(imx6sx_mmdc_io_offset),
+       .mmdc_io_offset = imx6sx_mmdc_io_offset,
+};
+
 /*
  * This structure is for passing necessary data for low level ocram
  * suspend code(arch/arm/mach-imx/suspend-imx6.S), if this struct
@@ -181,11 +199,13 @@ struct imx6_cpu_pm_info {
        u32 mmdc_io_val[MX6_MAX_MMDC_IO_NUM][2]; /* To save offset and value */
 } __aligned(8);
 
-void imx6q_set_int_mem_clk_lpm(void)
+void imx6q_set_int_mem_clk_lpm(bool enable)
 {
        u32 val = readl_relaxed(ccm_base + CGPR);
 
-       val |= BM_CGPR_INT_MEM_CLK_LPM;
+       val &= ~BM_CGPR_INT_MEM_CLK_LPM;
+       if (enable)
+               val |= BM_CGPR_INT_MEM_CLK_LPM;
        writel_relaxed(val, ccm_base + CGPR);
 }
 
@@ -254,6 +274,14 @@ int imx6q_set_lpm(enum mxc_cpu_pwr_mode mode)
                break;
        case STOP_POWER_ON:
                val |= 0x2 << BP_CLPCR_LPM;
+               val &= ~BM_CLPCR_VSTBY;
+               val &= ~BM_CLPCR_SBYOS;
+               if (cpu_is_imx6sl())
+                       val |= BM_CLPCR_BYPASS_PMIC_READY;
+               if (cpu_is_imx6sl() || cpu_is_imx6sx())
+                       val |= BM_CLPCR_BYP_MMDC_CH0_LPM_HS;
+               else
+                       val |= BM_CLPCR_BYP_MMDC_CH1_LPM_HS;
                break;
        case WAIT_UNCLOCKED_POWER_OFF:
                val |= 0x1 << BP_CLPCR_LPM;
@@ -265,12 +293,12 @@ int imx6q_set_lpm(enum mxc_cpu_pwr_mode mode)
                val |= 0x3 << BP_CLPCR_STBY_COUNT;
                val |= BM_CLPCR_VSTBY;
                val |= BM_CLPCR_SBYOS;
-               if (cpu_is_imx6sl()) {
+               if (cpu_is_imx6sl())
                        val |= BM_CLPCR_BYPASS_PMIC_READY;
+               if (cpu_is_imx6sl() || cpu_is_imx6sx())
                        val |= BM_CLPCR_BYP_MMDC_CH0_LPM_HS;
-               } else {
+               else
                        val |= BM_CLPCR_BYP_MMDC_CH1_LPM_HS;
-               }
                break;
        default:
                return -EINVAL;
@@ -314,8 +342,22 @@ static int imx6q_suspend_finish(unsigned long val)
 static int imx6q_pm_enter(suspend_state_t state)
 {
        switch (state) {
+       case PM_SUSPEND_STANDBY:
+               imx6q_set_lpm(STOP_POWER_ON);
+               imx6q_set_int_mem_clk_lpm(true);
+               imx_gpc_pre_suspend(false);
+               if (cpu_is_imx6sl())
+                       imx6sl_set_wait_clk(true);
+               /* Zzz ... */
+               cpu_do_idle();
+               if (cpu_is_imx6sl())
+                       imx6sl_set_wait_clk(false);
+               imx_gpc_post_resume();
+               imx6q_set_lpm(WAIT_CLOCKED);
+               break;
        case PM_SUSPEND_MEM:
                imx6q_set_lpm(STOP_POWER_OFF);
+               imx6q_set_int_mem_clk_lpm(false);
                imx6q_enable_wb(true);
                /*
                 * For suspend into ocram, asm code already take care of
@@ -323,7 +365,7 @@ static int imx6q_pm_enter(suspend_state_t state)
                 */
                if (!imx6_suspend_in_ocram_fn)
                        imx6q_enable_rbc(true);
-               imx_gpc_pre_suspend();
+               imx_gpc_pre_suspend(true);
                imx_anatop_pre_suspend();
                imx_set_cpu_jump(0, v7_cpu_resume);
                /* Zzz ... */
@@ -334,6 +376,7 @@ static int imx6q_pm_enter(suspend_state_t state)
                imx_gpc_post_resume();
                imx6q_enable_rbc(false);
                imx6q_enable_wb(false);
+               imx6q_set_int_mem_clk_lpm(true);
                imx6q_set_lpm(WAIT_CLOCKED);
                break;
        default:
@@ -343,9 +386,14 @@ static int imx6q_pm_enter(suspend_state_t state)
        return 0;
 }
 
+static int imx6q_pm_valid(suspend_state_t state)
+{
+       return (state == PM_SUSPEND_STANDBY || state == PM_SUSPEND_MEM);
+}
+
 static const struct platform_suspend_ops imx6q_pm_ops = {
        .enter = imx6q_pm_enter,
-       .valid = suspend_valid_only_mem,
+       .valid = imx6q_pm_valid,
 };
 
 void __init imx6q_pm_set_ccm_base(void __iomem *base)
@@ -549,3 +597,8 @@ void __init imx6sl_pm_init(void)
 {
        imx6_pm_common_init(&imx6sl_pm_data);
 }
+
+void __init imx6sx_pm_init(void)
+{
+       imx6_pm_common_init(&imx6sx_pm_data);
+}
index 3b0733edb68c2ab30e93cfd60becd1a221ffa5f8..d14c33fd6b037b5627eb700777f770a833acd9ab 100644 (file)
@@ -42,7 +42,10 @@ void mxc_restart(enum reboot_mode mode, const char *cmd)
 {
        unsigned int wcr_enable;
 
-       if (wdog_clk)
+       if (!wdog_base)
+               goto reset_fallback;
+
+       if (!IS_ERR(wdog_clk))
                clk_enable(wdog_clk);
 
        if (cpu_is_mx1())
@@ -70,6 +73,7 @@ void mxc_restart(enum reboot_mode mode, const char *cmd)
        /* delay to allow the serial port to show the message */
        mdelay(50);
 
+reset_fallback:
        /* we'll take a jump through zero as a poor second */
        soft_restart(0);
 }
@@ -79,13 +83,10 @@ void __init mxc_arch_reset_init(void __iomem *base)
        wdog_base = base;
 
        wdog_clk = clk_get_sys("imx2-wdt.0", NULL);
-       if (IS_ERR(wdog_clk)) {
+       if (IS_ERR(wdog_clk))
                pr_warn("%s: failed to get wdog clock\n", __func__);
-               wdog_clk = NULL;
-               return;
-       }
-
-       clk_prepare(wdog_clk);
+       else
+               clk_prepare(wdog_clk);
 }
 
 void __init mxc_arch_reset_init_dt(void)
@@ -97,13 +98,10 @@ void __init mxc_arch_reset_init_dt(void)
        WARN_ON(!wdog_base);
 
        wdog_clk = of_clk_get(np, 0);
-       if (IS_ERR(wdog_clk)) {
+       if (IS_ERR(wdog_clk))
                pr_warn("%s: failed to get wdog clock\n", __func__);
-               wdog_clk = NULL;
-               return;
-       }
-
-       clk_prepare(wdog_clk);
+       else
+               clk_prepare(wdog_clk);
 }
 
 #ifdef CONFIG_CACHE_L2X0
index bed081e58262ed1f94190a44039b6251db5d9f5e..bf92e5a351c05e384136f206b1651e56b9e6e46f 100644 (file)
@@ -290,25 +290,20 @@ static int __init mxc_clockevent_init(struct clk *timer_clk)
        return 0;
 }
 
-void __init mxc_timer_init(void __iomem *base, int irq)
+static void __init _mxc_timer_init(int irq,
+                                  struct clk *clk_per, struct clk *clk_ipg)
 {
        uint32_t tctl_val;
-       struct clk *timer_clk;
-       struct clk *timer_ipg_clk;
 
-       timer_clk = clk_get_sys("imx-gpt.0", "per");
-       if (IS_ERR(timer_clk)) {
+       if (IS_ERR(clk_per)) {
                pr_err("i.MX timer: unable to get clk\n");
                return;
        }
 
-       timer_ipg_clk = clk_get_sys("imx-gpt.0", "ipg");
-       if (!IS_ERR(timer_ipg_clk))
-               clk_prepare_enable(timer_ipg_clk);
-
-       clk_prepare_enable(timer_clk);
+       if (!IS_ERR(clk_ipg))
+               clk_prepare_enable(clk_ipg);
 
-       timer_base = base;
+       clk_prepare_enable(clk_per);
 
        /*
         * Initialise to a known state (all timers off, and timing reset)
@@ -325,21 +320,45 @@ void __init mxc_timer_init(void __iomem *base, int irq)
        __raw_writel(tctl_val, timer_base + MXC_TCTL);
 
        /* init and register the timer to the framework */
-       mxc_clocksource_init(timer_clk);
-       mxc_clockevent_init(timer_clk);
+       mxc_clocksource_init(clk_per);
+       mxc_clockevent_init(clk_per);
 
        /* Make irqs happen */
        setup_irq(irq, &mxc_timer_irq);
 }
 
-void __init mxc_timer_init_dt(struct device_node *np)
+void __init mxc_timer_init(void __iomem *base, int irq)
 {
-       void __iomem *base;
+       struct clk *clk_per = clk_get_sys("imx-gpt.0", "per");
+       struct clk *clk_ipg = clk_get_sys("imx-gpt.0", "ipg");
+
+       timer_base = base;
+
+       _mxc_timer_init(irq, clk_per, clk_ipg);
+}
+
+static void __init mxc_timer_init_dt(struct device_node *np)
+{
+       struct clk *clk_per, *clk_ipg;
        int irq;
 
-       base = of_iomap(np, 0);
-       WARN_ON(!base);
+       if (timer_base)
+               return;
+
+       timer_base = of_iomap(np, 0);
+       WARN_ON(!timer_base);
        irq = irq_of_parse_and_map(np, 0);
 
-       mxc_timer_init(base, irq);
+       clk_per = of_clk_get_by_name(np, "per");
+       clk_ipg = of_clk_get_by_name(np, "ipg");
+
+       _mxc_timer_init(irq, clk_per, clk_ipg);
 }
+CLOCKSOURCE_OF_DECLARE(mx1_timer, "fsl,imx1-gpt", mxc_timer_init_dt);
+CLOCKSOURCE_OF_DECLARE(mx25_timer, "fsl,imx25-gpt", mxc_timer_init_dt);
+CLOCKSOURCE_OF_DECLARE(mx50_timer, "fsl,imx50-gpt", mxc_timer_init_dt);
+CLOCKSOURCE_OF_DECLARE(mx51_timer, "fsl,imx51-gpt", mxc_timer_init_dt);
+CLOCKSOURCE_OF_DECLARE(mx53_timer, "fsl,imx53-gpt", mxc_timer_init_dt);
+CLOCKSOURCE_OF_DECLARE(mx6q_timer, "fsl,imx6q-gpt", mxc_timer_init_dt);
+CLOCKSOURCE_OF_DECLARE(mx6sl_timer, "fsl,imx6sl-gpt", mxc_timer_init_dt);
+CLOCKSOURCE_OF_DECLARE(mx6sx_timer, "fsl,imx6sx-gpt", mxc_timer_init_dt);
index 7828af4b20223be5668613282f15684954af1d95..1d4f384ca773f78e72de41248a8f242db20c5ec1 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/io.h>
 #include <linux/irqdomain.h>
 #include <linux/of.h>
+#include <linux/of_address.h>
 
 #include <asm/mach/irq.h>
 #include <asm/exception.h>
@@ -153,13 +154,16 @@ static void __exception_irq_entry tzic_handle_irq(struct pt_regs *regs)
  * interrupts. It registers the interrupt enable and disable functions
  * to the kernel for each interrupt source.
  */
-void __init tzic_init_irq(void __iomem *irqbase)
+void __init tzic_init_irq(void)
 {
        struct device_node *np;
        int irq_base;
        int i;
 
-       tzic_base = irqbase;
+       np = of_find_compatible_node(NULL, NULL, "fsl,tzic");
+       tzic_base = of_iomap(np, 0);
+       WARN_ON(!tzic_base);
+
        /* put the TZIC into the reset value with
         * all interrupts disabled
         */
@@ -181,7 +185,6 @@ void __init tzic_init_irq(void __iomem *irqbase)
        irq_base = irq_alloc_descs(-1, 0, TZIC_NUM_IRQS, numa_node_id());
        WARN_ON(irq_base < 0);
 
-       np = of_find_compatible_node(NULL, NULL, "fsl,tzic");
        domain = irq_domain_add_legacy(np, TZIC_NUM_IRQS, irq_base, 0,
                                       &irq_domain_simple_ops, NULL);
        WARN_ON(!domain);
index 64f8e2564a376837e11bb59a4c9caad7d7041acc..c455e974bbfe4f2c05bc4451f1e50ae317482019 100644 (file)
@@ -17,7 +17,6 @@ config ARCH_INTEGRATOR_CP
        bool "Support Integrator/CP platform"
        select ARCH_CINTEGRATOR
        select ARM_TIMER_SP804
-       select PLAT_VERSATILE_CLCD
        select SERIAL_AMBA_PL011 if TTY
        select SERIAL_AMBA_PL011_CONSOLE if TTY
        select SOC_BUS
diff --git a/arch/arm/mach-integrator/include/mach/memory.h b/arch/arm/mach-integrator/include/mach/memory.h
deleted file mode 100644 (file)
index 7268cb5..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- *  arch/arm/mach-integrator/include/mach/memory.h
- *
- *  Copyright (C) 1999 ARM Limited
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-#ifndef __ASM_ARCH_MEMORY_H
-#define __ASM_ARCH_MEMORY_H
-
-#define BUS_OFFSET     UL(0x80000000)
-#define __virt_to_bus(x)       ((x) - PAGE_OFFSET + BUS_OFFSET)
-#define __bus_to_virt(x)       ((x) - BUS_OFFSET + PAGE_OFFSET)
-#define __pfn_to_bus(x)                (__pfn_to_phys(x) + (BUS_OFFSET - PHYS_OFFSET))
-#define __bus_to_pfn(x)                __phys_to_pfn((x) - (BUS_OFFSET - PHYS_OFFSET))
-
-#endif
index 660ca6feff4024fe8cd51bea46463be542ebf38e..8ca290b479b1ffb04eb931db39183999caa1b7d8 100644 (file)
@@ -31,7 +31,7 @@
 #include <linux/clockchips.h>
 #include <linux/interrupt.h>
 #include <linux/io.h>
-#include <linux/irqchip/versatile-fpga.h>
+#include <linux/irqchip.h>
 #include <linux/mtd/physmap.h>
 #include <linux/clk.h>
 #include <linux/platform_data/clk-integrator.h>
@@ -439,15 +439,10 @@ static void __init ap_of_timer_init(void)
        integrator_clockevent_init(rate, base, irq);
 }
 
-static const struct of_device_id fpga_irq_of_match[] __initconst = {
-       { .compatible = "arm,versatile-fpga-irq", .data = fpga_irq_of_init, },
-       { /* Sentinel */ }
-};
-
 static void __init ap_init_irq_of(void)
 {
        cm_init();
-       of_irq_init(fpga_irq_of_match);
+       irqchip_init();
 }
 
 /* For the Device Tree, add in the UART callbacks as AUXDATA */
@@ -558,7 +553,6 @@ DT_MACHINE_START(INTEGRATOR_AP_DT, "ARM Integrator/AP (Device Tree)")
        .map_io         = ap_map_io,
        .init_early     = ap_init_early,
        .init_irq       = ap_init_irq_of,
-       .handle_irq     = fpga_handle_irq,
        .init_time      = ap_of_timer_init,
        .init_machine   = ap_init_of,
        .restart        = integrator_restart,
index 0e57f8f820a54ec040270449e8d16487c7a8edc9..cca02eb75eb5680674eb05e9728d1bfed9dfd97d 100644 (file)
 #include <linux/amba/bus.h>
 #include <linux/amba/kmi.h>
 #include <linux/amba/clcd.h>
+#include <linux/platform_data/video-clcd-versatile.h>
 #include <linux/amba/mmci.h>
 #include <linux/io.h>
-#include <linux/irqchip/versatile-fpga.h>
+#include <linux/irqchip.h>
 #include <linux/gfp.h>
 #include <linux/mtd/physmap.h>
 #include <linux/of_irq.h>
@@ -36,8 +37,6 @@
 #include <asm/mach/map.h>
 #include <asm/mach/time.h>
 
-#include <plat/clcd.h>
-
 #include "hardware.h"
 #include "cm.h"
 #include "common.h"
@@ -235,15 +234,10 @@ static void __init intcp_init_early(void)
        sched_clock_register(intcp_read_sched_clock, 32, 24000000);
 }
 
-static const struct of_device_id fpga_irq_of_match[] __initconst = {
-       { .compatible = "arm,versatile-fpga-irq", .data = fpga_irq_of_init, },
-       { /* Sentinel */ }
-};
-
 static void __init intcp_init_irq_of(void)
 {
        cm_init();
-       of_irq_init(fpga_irq_of_match);
+       irqchip_init();
 }
 
 /*
@@ -329,7 +323,6 @@ DT_MACHINE_START(INTEGRATOR_CP_DT, "ARM Integrator/CP (Device Tree)")
        .map_io         = intcp_map_io,
        .init_early     = intcp_init_early,
        .init_irq       = intcp_init_irq_of,
-       .handle_irq     = fpga_handle_irq,
        .init_machine   = intcp_init_of,
        .restart        = integrator_restart,
        .dt_compat      = intcp_dt_board_compat,
diff --git a/arch/arm/mach-kirkwood/Kconfig b/arch/arm/mach-kirkwood/Kconfig
deleted file mode 100644 (file)
index df4b263..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-if ARCH_KIRKWOOD
-
-menu "Marvell Kirkwood Implementations"
-
-config KIRKWOOD_LEGACY
-       bool
-
-config MACH_D2NET_V2
-       bool "LaCie d2 Network v2 NAS Board"
-       select KIRKWOOD_LEGACY
-       help
-         Say 'Y' here if you want your kernel to support the
-         LaCie d2 Network v2 NAS.
-
-config MACH_NET2BIG_V2
-       bool "LaCie 2Big Network v2 NAS Board"
-       select KIRKWOOD_LEGACY
-       help
-         Say 'Y' here if you want your kernel to support the
-         LaCie 2Big Network v2 NAS.
-
-config MACH_NET5BIG_V2
-       bool "LaCie 5Big Network v2 NAS Board"
-       select KIRKWOOD_LEGACY
-       help
-         Say 'Y' here if you want your kernel to support the
-         LaCie 5Big Network v2 NAS.
-
-config MACH_OPENRD
-       select KIRKWOOD_LEGACY
-        bool
-
-config MACH_OPENRD_BASE
-       bool "Marvell OpenRD Base Board"
-       select MACH_OPENRD
-       help
-         Say 'Y' here if you want your kernel to support the
-         Marvell OpenRD Base Board.
-
-config MACH_OPENRD_CLIENT
-       bool "Marvell OpenRD Client Board"
-       select MACH_OPENRD
-       help
-         Say 'Y' here if you want your kernel to support the
-         Marvell OpenRD Client Board.
-
-config MACH_OPENRD_ULTIMATE
-       bool "Marvell OpenRD Ultimate Board"
-       select MACH_OPENRD
-       help
-         Say 'Y' here if you want your kernel to support the
-         Marvell OpenRD Ultimate Board.
-
-config MACH_RD88F6192_NAS
-       bool "Marvell RD-88F6192-NAS Reference Board"
-       select KIRKWOOD_LEGACY
-       help
-         Say 'Y' here if you want your kernel to support the
-         Marvell RD-88F6192-NAS Reference Board.
-
-config MACH_RD88F6281
-       bool "Marvell RD-88F6281 Reference Board"
-       select KIRKWOOD_LEGACY
-       help
-         Say 'Y' here if you want your kernel to support the
-         Marvell RD-88F6281 Reference Board.
-
-config MACH_T5325
-       bool "HP t5325 Thin Client"
-       select KIRKWOOD_LEGACY
-       help
-         Say 'Y' here if you want your kernel to support the
-         HP t5325 Thin Client.
-
-config MACH_TS219
-       bool "QNAP TS-110, TS-119, TS-119P+, TS-210, TS-219, TS-219P and TS-219P+ Turbo NAS"
-       select KIRKWOOD_LEGACY
-       help
-         Say 'Y' here if you want your kernel to support the
-         QNAP TS-110, TS-119, TS-119P+, TS-210, TS-219, TS-219P and
-         TS-219P+ Turbo NAS devices.
-
-config MACH_TS41X
-       bool "QNAP TS-410, TS-410U, TS-419P, TS-419P+ and TS-419U Turbo NAS"
-       select KIRKWOOD_LEGACY
-       help
-         Say 'Y' here if you want your kernel to support the
-         QNAP TS-410, TS-410U, TS-419P, TS-419P+ and TS-419U Turbo
-         NAS devices.
-
-comment "Device tree entries"
-
-config ARCH_KIRKWOOD_DT
-       bool "Marvell Kirkwood Flattened Device Tree"
-       select KIRKWOOD_CLK
-       select OF_IRQ
-       select ORION_IRQCHIP
-       select ORION_TIMER
-       select POWER_SUPPLY
-       select POWER_RESET
-       select POWER_RESET_GPIO
-       select REGULATOR
-       select REGULATOR_FIXED_VOLTAGE
-       select USE_OF
-       help
-         Say 'Y' here if you want your kernel to support the
-         Marvell Kirkwood using flattened device tree.
-
-endmenu
-
-endif
diff --git a/arch/arm/mach-kirkwood/Makefile b/arch/arm/mach-kirkwood/Makefile
deleted file mode 100644 (file)
index 3a72c5c..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-obj-$(CONFIG_KIRKWOOD_LEGACY)  += irq.o mpp.o common.o pcie.o
-obj-$(CONFIG_PM)               += pm.o
-
-obj-$(CONFIG_MACH_D2NET_V2)            += d2net_v2-setup.o lacie_v2-common.o
-obj-$(CONFIG_MACH_NET2BIG_V2)          += netxbig_v2-setup.o lacie_v2-common.o
-obj-$(CONFIG_MACH_NET5BIG_V2)          += netxbig_v2-setup.o lacie_v2-common.o
-obj-$(CONFIG_MACH_OPENRD)              += openrd-setup.o
-obj-$(CONFIG_MACH_RD88F6192_NAS)       += rd88f6192-nas-setup.o
-obj-$(CONFIG_MACH_RD88F6281)           += rd88f6281-setup.o
-obj-$(CONFIG_MACH_T5325)               += t5325-setup.o
-obj-$(CONFIG_MACH_TS219)               += ts219-setup.o tsx1x-common.o
-obj-$(CONFIG_MACH_TS41X)               += ts41x-setup.o tsx1x-common.o
-
-obj-$(CONFIG_ARCH_KIRKWOOD_DT)         += board-dt.o
diff --git a/arch/arm/mach-kirkwood/Makefile.boot b/arch/arm/mach-kirkwood/Makefile.boot
deleted file mode 100644 (file)
index 760a0ef..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-   zreladdr-y  += 0x00008000
-params_phys-y  := 0x00000100
-initrd_phys-y  := 0x00800000
diff --git a/arch/arm/mach-kirkwood/board-dt.c b/arch/arm/mach-kirkwood/board-dt.c
deleted file mode 100644 (file)
index ff18ff2..0000000
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- * Copyright 2012 (C), Jason Cooper <jason@lakedaemon.net>
- *
- * arch/arm/mach-kirkwood/board-dt.c
- *
- * Flattened Device Tree board initialization
- *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
- */
-
-#include <linux/clk.h>
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/of.h>
-#include <linux/of_address.h>
-#include <linux/of_net.h>
-#include <linux/of_platform.h>
-#include <linux/dma-mapping.h>
-#include <linux/irqchip.h>
-#include <asm/hardware/cache-feroceon-l2.h>
-#include <asm/mach/arch.h>
-#include <asm/mach/map.h>
-#include <mach/bridge-regs.h>
-#include <plat/common.h>
-#include <plat/pcie.h>
-#include "pm.h"
-
-static struct map_desc kirkwood_io_desc[] __initdata = {
-       {
-               .virtual        = (unsigned long) KIRKWOOD_REGS_VIRT_BASE,
-               .pfn            = __phys_to_pfn(KIRKWOOD_REGS_PHYS_BASE),
-               .length         = KIRKWOOD_REGS_SIZE,
-               .type           = MT_DEVICE,
-       },
-};
-
-static void __init kirkwood_map_io(void)
-{
-       iotable_init(kirkwood_io_desc, ARRAY_SIZE(kirkwood_io_desc));
-}
-
-static struct resource kirkwood_cpufreq_resources[] = {
-       [0] = {
-               .start  = CPU_CONTROL_PHYS,
-               .end    = CPU_CONTROL_PHYS + 3,
-               .flags  = IORESOURCE_MEM,
-       },
-};
-
-static struct platform_device kirkwood_cpufreq_device = {
-       .name           = "kirkwood-cpufreq",
-       .id             = -1,
-       .num_resources  = ARRAY_SIZE(kirkwood_cpufreq_resources),
-       .resource       = kirkwood_cpufreq_resources,
-};
-
-static void __init kirkwood_cpufreq_init(void)
-{
-       platform_device_register(&kirkwood_cpufreq_device);
-}
-
-static struct resource kirkwood_cpuidle_resource[] = {
-       {
-               .flags  = IORESOURCE_MEM,
-               .start  = DDR_OPERATION_BASE,
-               .end    = DDR_OPERATION_BASE + 3,
-       },
-};
-
-static struct platform_device kirkwood_cpuidle = {
-       .name           = "kirkwood_cpuidle",
-       .id             = -1,
-       .resource       = kirkwood_cpuidle_resource,
-       .num_resources  = 1,
-};
-
-static void __init kirkwood_cpuidle_init(void)
-{
-       platform_device_register(&kirkwood_cpuidle);
-}
-
-/* Temporary here since mach-mvebu has a function we can use */
-static void kirkwood_restart(enum reboot_mode mode, const char *cmd)
-{
-       /*
-        * Enable soft reset to assert RSTOUTn.
-        */
-       writel(SOFT_RESET_OUT_EN, RSTOUTn_MASK);
-
-       /*
-        * Assert soft reset.
-        */
-       writel(SOFT_RESET, SYSTEM_SOFT_RESET);
-
-       while (1)
-               ;
-}
-
-#define MV643XX_ETH_MAC_ADDR_LOW       0x0414
-#define MV643XX_ETH_MAC_ADDR_HIGH      0x0418
-
-static void __init kirkwood_dt_eth_fixup(void)
-{
-       struct device_node *np;
-
-       /*
-        * The ethernet interfaces forget the MAC address assigned by u-boot
-        * if the clocks are turned off. Usually, u-boot on kirkwood boards
-        * has no DT support to properly set local-mac-address property.
-        * As a workaround, we get the MAC address from mv643xx_eth registers
-        * and update the port device node if no valid MAC address is set.
-        */
-       for_each_compatible_node(np, NULL, "marvell,kirkwood-eth-port") {
-               struct device_node *pnp = of_get_parent(np);
-               struct clk *clk;
-               struct property *pmac;
-               void __iomem *io;
-               u8 *macaddr;
-               u32 reg;
-
-               if (!pnp)
-                       continue;
-
-               /* skip disabled nodes or nodes with valid MAC address*/
-               if (!of_device_is_available(pnp) || of_get_mac_address(np))
-                       goto eth_fixup_skip;
-
-               clk = of_clk_get(pnp, 0);
-               if (IS_ERR(clk))
-                       goto eth_fixup_skip;
-
-               io = of_iomap(pnp, 0);
-               if (!io)
-                       goto eth_fixup_no_map;
-
-               /* ensure port clock is not gated to not hang CPU */
-               clk_prepare_enable(clk);
-
-               /* store MAC address register contents in local-mac-address */
-               pr_err(FW_INFO "%s: local-mac-address is not set\n",
-                      np->full_name);
-
-               pmac = kzalloc(sizeof(*pmac) + 6, GFP_KERNEL);
-               if (!pmac)
-                       goto eth_fixup_no_mem;
-
-               pmac->value = pmac + 1;
-               pmac->length = 6;
-               pmac->name = kstrdup("local-mac-address", GFP_KERNEL);
-               if (!pmac->name) {
-                       kfree(pmac);
-                       goto eth_fixup_no_mem;
-               }
-
-               macaddr = pmac->value;
-               reg = readl(io + MV643XX_ETH_MAC_ADDR_HIGH);
-               macaddr[0] = (reg >> 24) & 0xff;
-               macaddr[1] = (reg >> 16) & 0xff;
-               macaddr[2] = (reg >> 8) & 0xff;
-               macaddr[3] = reg & 0xff;
-
-               reg = readl(io + MV643XX_ETH_MAC_ADDR_LOW);
-               macaddr[4] = (reg >> 8) & 0xff;
-               macaddr[5] = reg & 0xff;
-
-               of_update_property(np, pmac);
-
-eth_fixup_no_mem:
-               iounmap(io);
-               clk_disable_unprepare(clk);
-eth_fixup_no_map:
-               clk_put(clk);
-eth_fixup_skip:
-               of_node_put(pnp);
-       }
-}
-
-/*
- * Disable propagation of mbus errors to the CPU local bus, as this
- * causes mbus errors (which can occur for example for PCI aborts) to
- * throw CPU aborts, which we're not set up to deal with.
- */
-static void __init kirkwood_disable_mbus_error_propagation(void)
-{
-       void __iomem *cpu_config;
-
-       cpu_config = ioremap(CPU_CONFIG_PHYS, 4);
-       writel(readl(cpu_config) & ~CPU_CONFIG_ERROR_PROP, cpu_config);
-       iounmap(cpu_config);
-}
-
-static void __init kirkwood_dt_init(void)
-{
-       kirkwood_disable_mbus_error_propagation();
-
-       BUG_ON(mvebu_mbus_dt_init(false));
-
-#ifdef CONFIG_CACHE_FEROCEON_L2
-       feroceon_of_init();
-#endif
-       kirkwood_cpufreq_init();
-       kirkwood_cpuidle_init();
-
-       kirkwood_pm_init();
-       kirkwood_dt_eth_fixup();
-
-       of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
-}
-
-static const char * const kirkwood_dt_board_compat[] = {
-       "marvell,kirkwood",
-       NULL
-};
-
-DT_MACHINE_START(KIRKWOOD_DT, "Marvell Kirkwood (Flattened Device Tree)")
-       /* Maintainer: Jason Cooper <jason@lakedaemon.net> */
-       .map_io         = kirkwood_map_io,
-       .init_machine   = kirkwood_dt_init,
-       .restart        = kirkwood_restart,
-       .dt_compat      = kirkwood_dt_board_compat,
-MACHINE_END
diff --git a/arch/arm/mach-kirkwood/common.c b/arch/arm/mach-kirkwood/common.c
deleted file mode 100644 (file)
index 255f33a..0000000
+++ /dev/null
@@ -1,746 +0,0 @@
-/*
- * arch/arm/mach-kirkwood/common.c
- *
- * Core functions for Marvell Kirkwood SoCs
- *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
- */
-
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/platform_device.h>
-#include <linux/serial_8250.h>
-#include <linux/ata_platform.h>
-#include <linux/mtd/nand.h>
-#include <linux/dma-mapping.h>
-#include <linux/clk-provider.h>
-#include <linux/spinlock.h>
-#include <linux/mv643xx_i2c.h>
-#include <linux/timex.h>
-#include <linux/kexec.h>
-#include <linux/reboot.h>
-#include <net/dsa.h>
-#include <asm/page.h>
-#include <asm/mach/map.h>
-#include <asm/mach/time.h>
-#include <asm/hardware/cache-feroceon-l2.h>
-#include <mach/kirkwood.h>
-#include <mach/bridge-regs.h>
-#include <linux/platform_data/asoc-kirkwood.h>
-#include <linux/platform_data/mmc-mvsdio.h>
-#include <linux/platform_data/mtd-orion_nand.h>
-#include <linux/platform_data/usb-ehci-orion.h>
-#include <plat/common.h>
-#include <plat/time.h>
-#include <linux/platform_data/dma-mv_xor.h>
-#include "common.h"
-#include "pm.h"
-
-/* These can go away once Kirkwood uses the mvebu-mbus DT binding */
-#define KIRKWOOD_MBUS_NAND_TARGET 0x01
-#define KIRKWOOD_MBUS_NAND_ATTR   0x2f
-#define KIRKWOOD_MBUS_SRAM_TARGET 0x03
-#define KIRKWOOD_MBUS_SRAM_ATTR   0x01
-
-/*****************************************************************************
- * I/O Address Mapping
- ****************************************************************************/
-static struct map_desc kirkwood_io_desc[] __initdata = {
-       {
-               .virtual        = (unsigned long) KIRKWOOD_REGS_VIRT_BASE,
-               .pfn            = __phys_to_pfn(KIRKWOOD_REGS_PHYS_BASE),
-               .length         = KIRKWOOD_REGS_SIZE,
-               .type           = MT_DEVICE,
-       },
-};
-
-void __init kirkwood_map_io(void)
-{
-       iotable_init(kirkwood_io_desc, ARRAY_SIZE(kirkwood_io_desc));
-}
-
-/*****************************************************************************
- * CLK tree
- ****************************************************************************/
-
-static void enable_sata0(void)
-{
-       /* Enable PLL and IVREF */
-       writel(readl(SATA0_PHY_MODE_2) | 0xf, SATA0_PHY_MODE_2);
-       /* Enable PHY */
-       writel(readl(SATA0_IF_CTRL) & ~0x200, SATA0_IF_CTRL);
-}
-
-static void disable_sata0(void)
-{
-       /* Disable PLL and IVREF */
-       writel(readl(SATA0_PHY_MODE_2) & ~0xf, SATA0_PHY_MODE_2);
-       /* Disable PHY */
-       writel(readl(SATA0_IF_CTRL) | 0x200, SATA0_IF_CTRL);
-}
-
-static void enable_sata1(void)
-{
-       /* Enable PLL and IVREF */
-       writel(readl(SATA1_PHY_MODE_2) | 0xf, SATA1_PHY_MODE_2);
-       /* Enable PHY */
-       writel(readl(SATA1_IF_CTRL) & ~0x200, SATA1_IF_CTRL);
-}
-
-static void disable_sata1(void)
-{
-       /* Disable PLL and IVREF */
-       writel(readl(SATA1_PHY_MODE_2) & ~0xf, SATA1_PHY_MODE_2);
-       /* Disable PHY */
-       writel(readl(SATA1_IF_CTRL) | 0x200, SATA1_IF_CTRL);
-}
-
-static void disable_pcie0(void)
-{
-       writel(readl(PCIE_LINK_CTRL) | 0x10, PCIE_LINK_CTRL);
-       while (1)
-               if (readl(PCIE_STATUS) & 0x1)
-                       break;
-       writel(readl(PCIE_LINK_CTRL) & ~0x10, PCIE_LINK_CTRL);
-}
-
-static void disable_pcie1(void)
-{
-       u32 dev, rev;
-
-       kirkwood_pcie_id(&dev, &rev);
-
-       if (dev == MV88F6282_DEV_ID) {
-               writel(readl(PCIE1_LINK_CTRL) | 0x10, PCIE1_LINK_CTRL);
-               while (1)
-                       if (readl(PCIE1_STATUS) & 0x1)
-                               break;
-               writel(readl(PCIE1_LINK_CTRL) & ~0x10, PCIE1_LINK_CTRL);
-       }
-}
-
-/* An extended version of the gated clk. This calls fn_en()/fn_dis
- * before enabling/disabling the clock.  We use this to turn on/off
- * PHYs etc.  */
-struct clk_gate_fn {
-       struct clk_gate gate;
-       void (*fn_en)(void);
-       void (*fn_dis)(void);
-};
-
-#define to_clk_gate_fn(_gate) container_of(_gate, struct clk_gate_fn, gate)
-#define to_clk_gate(_hw) container_of(_hw, struct clk_gate, hw)
-
-static int clk_gate_fn_enable(struct clk_hw *hw)
-{
-       struct clk_gate *gate = to_clk_gate(hw);
-       struct clk_gate_fn *gate_fn = to_clk_gate_fn(gate);
-       int ret;
-
-       ret = clk_gate_ops.enable(hw);
-       if (!ret && gate_fn->fn_en)
-               gate_fn->fn_en();
-
-       return ret;
-}
-
-static void clk_gate_fn_disable(struct clk_hw *hw)
-{
-       struct clk_gate *gate = to_clk_gate(hw);
-       struct clk_gate_fn *gate_fn = to_clk_gate_fn(gate);
-
-       if (gate_fn->fn_dis)
-               gate_fn->fn_dis();
-
-       clk_gate_ops.disable(hw);
-}
-
-static struct clk_ops clk_gate_fn_ops;
-
-static struct clk __init *clk_register_gate_fn(struct device *dev,
-               const char *name,
-               const char *parent_name, unsigned long flags,
-               void __iomem *reg, u8 bit_idx,
-               u8 clk_gate_flags, spinlock_t *lock,
-               void (*fn_en)(void), void (*fn_dis)(void))
-{
-       struct clk_gate_fn *gate_fn;
-       struct clk *clk;
-       struct clk_init_data init;
-
-       gate_fn = kzalloc(sizeof(struct clk_gate_fn), GFP_KERNEL);
-       if (!gate_fn) {
-               pr_err("%s: could not allocate gated clk\n", __func__);
-               return ERR_PTR(-ENOMEM);
-       }
-
-       init.name = name;
-       init.ops = &clk_gate_fn_ops;
-       init.flags = flags;
-       init.parent_names = (parent_name ? &parent_name : NULL);
-       init.num_parents = (parent_name ? 1 : 0);
-
-       /* struct clk_gate assignments */
-       gate_fn->gate.reg = reg;
-       gate_fn->gate.bit_idx = bit_idx;
-       gate_fn->gate.flags = clk_gate_flags;
-       gate_fn->gate.lock = lock;
-       gate_fn->gate.hw.init = &init;
-       gate_fn->fn_en = fn_en;
-       gate_fn->fn_dis = fn_dis;
-
-       /* ops is the gate ops, but with our enable/disable functions */
-       if (clk_gate_fn_ops.enable != clk_gate_fn_enable ||
-           clk_gate_fn_ops.disable != clk_gate_fn_disable) {
-               clk_gate_fn_ops = clk_gate_ops;
-               clk_gate_fn_ops.enable = clk_gate_fn_enable;
-               clk_gate_fn_ops.disable = clk_gate_fn_disable;
-       }
-
-       clk = clk_register(dev, &gate_fn->gate.hw);
-
-       if (IS_ERR(clk))
-               kfree(gate_fn);
-
-       return clk;
-}
-
-static DEFINE_SPINLOCK(gating_lock);
-static struct clk *tclk;
-
-static struct clk __init *kirkwood_register_gate(const char *name, u8 bit_idx)
-{
-       return clk_register_gate(NULL, name, "tclk", 0, CLOCK_GATING_CTRL,
-                                bit_idx, 0, &gating_lock);
-}
-
-static struct clk __init *kirkwood_register_gate_fn(const char *name,
-                                                   u8 bit_idx,
-                                                   void (*fn_en)(void),
-                                                   void (*fn_dis)(void))
-{
-       return clk_register_gate_fn(NULL, name, "tclk", 0, CLOCK_GATING_CTRL,
-                                   bit_idx, 0, &gating_lock, fn_en, fn_dis);
-}
-
-static struct clk *ge0, *ge1;
-
-void __init kirkwood_clk_init(void)
-{
-       struct clk *runit, *sata0, *sata1, *usb0, *sdio;
-       struct clk *crypto, *xor0, *xor1, *pex0, *pex1, *audio;
-
-       tclk = clk_register_fixed_rate(NULL, "tclk", NULL,
-                                      CLK_IS_ROOT, kirkwood_tclk);
-
-       runit = kirkwood_register_gate("runit",  CGC_BIT_RUNIT);
-       ge0 = kirkwood_register_gate("ge0",    CGC_BIT_GE0);
-       ge1 = kirkwood_register_gate("ge1",    CGC_BIT_GE1);
-       sata0 = kirkwood_register_gate_fn("sata0",  CGC_BIT_SATA0,
-                                         enable_sata0, disable_sata0);
-       sata1 = kirkwood_register_gate_fn("sata1",  CGC_BIT_SATA1,
-                                         enable_sata1, disable_sata1);
-       usb0 = kirkwood_register_gate("usb0",   CGC_BIT_USB0);
-       sdio = kirkwood_register_gate("sdio",   CGC_BIT_SDIO);
-       crypto = kirkwood_register_gate("crypto", CGC_BIT_CRYPTO);
-       xor0 = kirkwood_register_gate("xor0",   CGC_BIT_XOR0);
-       xor1 = kirkwood_register_gate("xor1",   CGC_BIT_XOR1);
-       pex0 = kirkwood_register_gate_fn("pex0",   CGC_BIT_PEX0,
-                                        NULL, disable_pcie0);
-       pex1 = kirkwood_register_gate_fn("pex1",   CGC_BIT_PEX1,
-                                        NULL, disable_pcie1);
-       audio = kirkwood_register_gate("audio",  CGC_BIT_AUDIO);
-       kirkwood_register_gate("tdm",    CGC_BIT_TDM);
-       kirkwood_register_gate("tsu",    CGC_BIT_TSU);
-
-       /* clkdev entries, mapping clks to devices */
-       orion_clkdev_add(NULL, "orion_spi.0", runit);
-       orion_clkdev_add(NULL, "orion_spi.1", runit);
-       orion_clkdev_add(NULL, MV643XX_ETH_NAME ".0", ge0);
-       orion_clkdev_add(NULL, MV643XX_ETH_NAME ".1", ge1);
-       orion_clkdev_add(NULL, "orion_wdt", tclk);
-       orion_clkdev_add("0", "sata_mv.0", sata0);
-       orion_clkdev_add("1", "sata_mv.0", sata1);
-       orion_clkdev_add(NULL, "orion-ehci.0", usb0);
-       orion_clkdev_add(NULL, "orion_nand", runit);
-       orion_clkdev_add(NULL, "mvsdio", sdio);
-       orion_clkdev_add(NULL, "mv_crypto", crypto);
-       orion_clkdev_add(NULL, MV_XOR_NAME ".0", xor0);
-       orion_clkdev_add(NULL, MV_XOR_NAME ".1", xor1);
-       orion_clkdev_add("0", "pcie", pex0);
-       orion_clkdev_add("1", "pcie", pex1);
-       orion_clkdev_add(NULL, "mvebu-audio", audio);
-       orion_clkdev_add(NULL, MV64XXX_I2C_CTLR_NAME ".0", runit);
-       orion_clkdev_add(NULL, MV64XXX_I2C_CTLR_NAME ".1", runit);
-
-       /* Marvell says runit is used by SPI, UART, NAND, TWSI, ...,
-        * so should never be gated.
-        */
-       clk_prepare_enable(runit);
-}
-
-/*****************************************************************************
- * EHCI0
- ****************************************************************************/
-void __init kirkwood_ehci_init(void)
-{
-       orion_ehci_init(USB_PHYS_BASE, IRQ_KIRKWOOD_USB, EHCI_PHY_NA);
-}
-
-
-/*****************************************************************************
- * GE00
- ****************************************************************************/
-void __init kirkwood_ge00_init(struct mv643xx_eth_platform_data *eth_data)
-{
-       orion_ge00_init(eth_data,
-                       GE00_PHYS_BASE, IRQ_KIRKWOOD_GE00_SUM,
-                       IRQ_KIRKWOOD_GE00_ERR, 1600);
-       /* The interface forgets the MAC address assigned by u-boot if
-       the clock is turned off, so claim the clk now. */
-       clk_prepare_enable(ge0);
-}
-
-
-/*****************************************************************************
- * GE01
- ****************************************************************************/
-void __init kirkwood_ge01_init(struct mv643xx_eth_platform_data *eth_data)
-{
-       orion_ge01_init(eth_data,
-                       GE01_PHYS_BASE, IRQ_KIRKWOOD_GE01_SUM,
-                       IRQ_KIRKWOOD_GE01_ERR, 1600);
-       clk_prepare_enable(ge1);
-}
-
-
-/*****************************************************************************
- * Ethernet switch
- ****************************************************************************/
-void __init kirkwood_ge00_switch_init(struct dsa_platform_data *d, int irq)
-{
-       orion_ge00_switch_init(d, irq);
-}
-
-
-/*****************************************************************************
- * NAND flash
- ****************************************************************************/
-static struct resource kirkwood_nand_resource = {
-       .flags          = IORESOURCE_MEM,
-       .start          = KIRKWOOD_NAND_MEM_PHYS_BASE,
-       .end            = KIRKWOOD_NAND_MEM_PHYS_BASE +
-                               KIRKWOOD_NAND_MEM_SIZE - 1,
-};
-
-static struct orion_nand_data kirkwood_nand_data = {
-       .cle            = 0,
-       .ale            = 1,
-       .width          = 8,
-};
-
-static struct platform_device kirkwood_nand_flash = {
-       .name           = "orion_nand",
-       .id             = -1,
-       .dev            = {
-               .platform_data  = &kirkwood_nand_data,
-       },
-       .resource       = &kirkwood_nand_resource,
-       .num_resources  = 1,
-};
-
-void __init kirkwood_nand_init(struct mtd_partition *parts, int nr_parts,
-                              int chip_delay)
-{
-       kirkwood_nand_data.parts = parts;
-       kirkwood_nand_data.nr_parts = nr_parts;
-       kirkwood_nand_data.chip_delay = chip_delay;
-       platform_device_register(&kirkwood_nand_flash);
-}
-
-void __init kirkwood_nand_init_rnb(struct mtd_partition *parts, int nr_parts,
-                                  int (*dev_ready)(struct mtd_info *))
-{
-       kirkwood_nand_data.parts = parts;
-       kirkwood_nand_data.nr_parts = nr_parts;
-       kirkwood_nand_data.dev_ready = dev_ready;
-       platform_device_register(&kirkwood_nand_flash);
-}
-
-/*****************************************************************************
- * SoC RTC
- ****************************************************************************/
-static void __init kirkwood_rtc_init(void)
-{
-       orion_rtc_init(RTC_PHYS_BASE, IRQ_KIRKWOOD_RTC);
-}
-
-
-/*****************************************************************************
- * SATA
- ****************************************************************************/
-void __init kirkwood_sata_init(struct mv_sata_platform_data *sata_data)
-{
-       orion_sata_init(sata_data, SATA_PHYS_BASE, IRQ_KIRKWOOD_SATA);
-}
-
-
-/*****************************************************************************
- * SD/SDIO/MMC
- ****************************************************************************/
-static struct resource mvsdio_resources[] = {
-       [0] = {
-               .start  = SDIO_PHYS_BASE,
-               .end    = SDIO_PHYS_BASE + SZ_1K - 1,
-               .flags  = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start  = IRQ_KIRKWOOD_SDIO,
-               .end    = IRQ_KIRKWOOD_SDIO,
-               .flags  = IORESOURCE_IRQ,
-       },
-};
-
-static u64 mvsdio_dmamask = DMA_BIT_MASK(32);
-
-static struct platform_device kirkwood_sdio = {
-       .name           = "mvsdio",
-       .id             = -1,
-       .dev            = {
-               .dma_mask = &mvsdio_dmamask,
-               .coherent_dma_mask = DMA_BIT_MASK(32),
-       },
-       .num_resources  = ARRAY_SIZE(mvsdio_resources),
-       .resource       = mvsdio_resources,
-};
-
-void __init kirkwood_sdio_init(struct mvsdio_platform_data *mvsdio_data)
-{
-       u32 dev, rev;
-
-       kirkwood_pcie_id(&dev, &rev);
-       if (rev == 0 && dev != MV88F6282_DEV_ID) /* catch all Kirkwood Z0's */
-               mvsdio_data->clock = 100000000;
-       else
-               mvsdio_data->clock = 200000000;
-       kirkwood_sdio.dev.platform_data = mvsdio_data;
-       platform_device_register(&kirkwood_sdio);
-}
-
-
-/*****************************************************************************
- * SPI
- ****************************************************************************/
-void __init kirkwood_spi_init(void)
-{
-       orion_spi_init(SPI_PHYS_BASE);
-}
-
-
-/*****************************************************************************
- * I2C
- ****************************************************************************/
-void __init kirkwood_i2c_init(void)
-{
-       orion_i2c_init(I2C_PHYS_BASE, IRQ_KIRKWOOD_TWSI, 8);
-}
-
-
-/*****************************************************************************
- * UART0
- ****************************************************************************/
-
-void __init kirkwood_uart0_init(void)
-{
-       orion_uart0_init(UART0_VIRT_BASE, UART0_PHYS_BASE,
-                        IRQ_KIRKWOOD_UART_0, tclk);
-}
-
-
-/*****************************************************************************
- * UART1
- ****************************************************************************/
-void __init kirkwood_uart1_init(void)
-{
-       orion_uart1_init(UART1_VIRT_BASE, UART1_PHYS_BASE,
-                        IRQ_KIRKWOOD_UART_1, tclk);
-}
-
-/*****************************************************************************
- * Cryptographic Engines and Security Accelerator (CESA)
- ****************************************************************************/
-void __init kirkwood_crypto_init(void)
-{
-       orion_crypto_init(CRYPTO_PHYS_BASE, KIRKWOOD_SRAM_PHYS_BASE,
-                         KIRKWOOD_SRAM_SIZE, IRQ_KIRKWOOD_CRYPTO);
-}
-
-
-/*****************************************************************************
- * XOR0
- ****************************************************************************/
-void __init kirkwood_xor0_init(void)
-{
-       orion_xor0_init(XOR0_PHYS_BASE, XOR0_HIGH_PHYS_BASE,
-                       IRQ_KIRKWOOD_XOR_00, IRQ_KIRKWOOD_XOR_01);
-}
-
-
-/*****************************************************************************
- * XOR1
- ****************************************************************************/
-void __init kirkwood_xor1_init(void)
-{
-       orion_xor1_init(XOR1_PHYS_BASE, XOR1_HIGH_PHYS_BASE,
-                       IRQ_KIRKWOOD_XOR_10, IRQ_KIRKWOOD_XOR_11);
-}
-
-
-/*****************************************************************************
- * Watchdog
- ****************************************************************************/
-void __init kirkwood_wdt_init(void)
-{
-       orion_wdt_init();
-}
-
-/*****************************************************************************
- * CPU idle
- ****************************************************************************/
-static struct resource kirkwood_cpuidle_resource[] = {
-       {
-               .flags  = IORESOURCE_MEM,
-               .start  = DDR_OPERATION_BASE,
-               .end    = DDR_OPERATION_BASE + 3,
-       },
-};
-
-static struct platform_device kirkwood_cpuidle = {
-       .name           = "kirkwood_cpuidle",
-       .id             = -1,
-       .resource       = kirkwood_cpuidle_resource,
-       .num_resources  = 1,
-};
-
-void __init kirkwood_cpuidle_init(void)
-{
-       platform_device_register(&kirkwood_cpuidle);
-}
-
-/*****************************************************************************
- * Time handling
- ****************************************************************************/
-void __init kirkwood_init_early(void)
-{
-       orion_time_set_base(TIMER_VIRT_BASE);
-}
-
-int kirkwood_tclk;
-
-static int __init kirkwood_find_tclk(void)
-{
-       u32 dev, rev;
-
-       kirkwood_pcie_id(&dev, &rev);
-
-       if (dev == MV88F6281_DEV_ID || dev == MV88F6282_DEV_ID)
-               if (((readl(SAMPLE_AT_RESET) >> 21) & 1) == 0)
-                       return 200000000;
-
-       return 166666667;
-}
-
-void __init kirkwood_timer_init(void)
-{
-       kirkwood_tclk = kirkwood_find_tclk();
-
-       orion_time_init(BRIDGE_VIRT_BASE, BRIDGE_INT_TIMER1_CLR,
-                       IRQ_KIRKWOOD_BRIDGE, kirkwood_tclk);
-}
-
-/*****************************************************************************
- * Audio
- ****************************************************************************/
-static struct resource kirkwood_audio_resources[] = {
-       [0] = {
-               .start  = AUDIO_PHYS_BASE,
-               .end    = AUDIO_PHYS_BASE + SZ_16K - 1,
-               .flags  = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start  = IRQ_KIRKWOOD_I2S,
-               .end    = IRQ_KIRKWOOD_I2S,
-               .flags  = IORESOURCE_IRQ,
-       },
-};
-
-static struct kirkwood_asoc_platform_data kirkwood_audio_data = {
-       .burst       = 128,
-};
-
-static struct platform_device kirkwood_audio_device = {
-       .name           = "mvebu-audio",
-       .id             = -1,
-       .num_resources  = ARRAY_SIZE(kirkwood_audio_resources),
-       .resource       = kirkwood_audio_resources,
-       .dev            = {
-               .platform_data  = &kirkwood_audio_data,
-       },
-};
-
-void __init kirkwood_audio_init(void)
-{
-       platform_device_register(&kirkwood_audio_device);
-}
-
-/*****************************************************************************
- * CPU Frequency
- ****************************************************************************/
-static struct resource kirkwood_cpufreq_resources[] = {
-       [0] = {
-               .start  = CPU_CONTROL_PHYS,
-               .end    = CPU_CONTROL_PHYS + 3,
-               .flags  = IORESOURCE_MEM,
-       },
-};
-
-static struct platform_device kirkwood_cpufreq_device = {
-       .name           = "kirkwood-cpufreq",
-       .id             = -1,
-       .num_resources  = ARRAY_SIZE(kirkwood_cpufreq_resources),
-       .resource       = kirkwood_cpufreq_resources,
-};
-
-void __init kirkwood_cpufreq_init(void)
-{
-       platform_device_register(&kirkwood_cpufreq_device);
-}
-
-/*****************************************************************************
- * General
- ****************************************************************************/
-/*
- * Identify device ID and revision.
- */
-char * __init kirkwood_id(void)
-{
-       u32 dev, rev;
-
-       kirkwood_pcie_id(&dev, &rev);
-
-       if (dev == MV88F6281_DEV_ID) {
-               if (rev == MV88F6281_REV_Z0)
-                       return "MV88F6281-Z0";
-               else if (rev == MV88F6281_REV_A0)
-                       return "MV88F6281-A0";
-               else if (rev == MV88F6281_REV_A1)
-                       return "MV88F6281-A1";
-               else
-                       return "MV88F6281-Rev-Unsupported";
-       } else if (dev == MV88F6192_DEV_ID) {
-               if (rev == MV88F6192_REV_Z0)
-                       return "MV88F6192-Z0";
-               else if (rev == MV88F6192_REV_A0)
-                       return "MV88F6192-A0";
-               else if (rev == MV88F6192_REV_A1)
-                       return "MV88F6192-A1";
-               else
-                       return "MV88F6192-Rev-Unsupported";
-       } else if (dev == MV88F6180_DEV_ID) {
-               if (rev == MV88F6180_REV_A0)
-                       return "MV88F6180-Rev-A0";
-               else if (rev == MV88F6180_REV_A1)
-                       return "MV88F6180-Rev-A1";
-               else
-                       return "MV88F6180-Rev-Unsupported";
-       } else if (dev == MV88F6282_DEV_ID) {
-               if (rev == MV88F6282_REV_A0)
-                       return "MV88F6282-Rev-A0";
-               else if (rev == MV88F6282_REV_A1)
-                       return "MV88F6282-Rev-A1";
-               else
-                       return "MV88F6282-Rev-Unsupported";
-       } else {
-               return "Device-Unknown";
-       }
-}
-
-void __init kirkwood_setup_wins(void)
-{
-       mvebu_mbus_add_window_by_id(KIRKWOOD_MBUS_NAND_TARGET,
-                                   KIRKWOOD_MBUS_NAND_ATTR,
-                                   KIRKWOOD_NAND_MEM_PHYS_BASE,
-                                   KIRKWOOD_NAND_MEM_SIZE);
-       mvebu_mbus_add_window_by_id(KIRKWOOD_MBUS_SRAM_TARGET,
-                                   KIRKWOOD_MBUS_SRAM_ATTR,
-                                   KIRKWOOD_SRAM_PHYS_BASE,
-                                   KIRKWOOD_SRAM_SIZE);
-}
-
-void __init kirkwood_l2_init(void)
-{
-#ifdef CONFIG_CACHE_FEROCEON_L2
-#ifdef CONFIG_CACHE_FEROCEON_L2_WRITETHROUGH
-       writel(readl(L2_CONFIG_REG) | L2_WRITETHROUGH, L2_CONFIG_REG);
-       feroceon_l2_init(1);
-#else
-       writel(readl(L2_CONFIG_REG) & ~L2_WRITETHROUGH, L2_CONFIG_REG);
-       feroceon_l2_init(0);
-#endif
-#endif
-}
-
-void __init kirkwood_init(void)
-{
-       pr_info("Kirkwood: %s, TCLK=%d.\n", kirkwood_id(), kirkwood_tclk);
-
-       /*
-        * Disable propagation of mbus errors to the CPU local bus,
-        * as this causes mbus errors (which can occur for example
-        * for PCI aborts) to throw CPU aborts, which we're not set
-        * up to deal with.
-        */
-       writel(readl(CPU_CONFIG) & ~CPU_CONFIG_ERROR_PROP, CPU_CONFIG);
-
-       BUG_ON(mvebu_mbus_init("marvell,kirkwood-mbus",
-                       BRIDGE_WINS_BASE, BRIDGE_WINS_SZ,
-                       DDR_WINDOW_CPU_BASE, DDR_WINDOW_CPU_SZ));
-
-       kirkwood_setup_wins();
-
-       kirkwood_l2_init();
-
-       /* Setup root of clk tree */
-       kirkwood_clk_init();
-
-       /* internal devices that every board has */
-       kirkwood_rtc_init();
-       kirkwood_wdt_init();
-       kirkwood_xor0_init();
-       kirkwood_xor1_init();
-       kirkwood_crypto_init();
-
-       kirkwood_pm_init();
-       kirkwood_cpuidle_init();
-#ifdef CONFIG_KEXEC
-       kexec_reinit = kirkwood_enable_pcie;
-#endif
-}
-
-void kirkwood_restart(enum reboot_mode mode, const char *cmd)
-{
-       /*
-        * Enable soft reset to assert RSTOUTn.
-        */
-       writel(SOFT_RESET_OUT_EN, RSTOUTn_MASK);
-
-       /*
-        * Assert soft reset.
-        */
-       writel(SOFT_RESET, SYSTEM_SOFT_RESET);
-
-       while (1)
-               ;
-}
diff --git a/arch/arm/mach-kirkwood/common.h b/arch/arm/mach-kirkwood/common.h
deleted file mode 100644 (file)
index 832a4e2..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * arch/arm/mach-kirkwood/common.h
- *
- * Core functions for Marvell Kirkwood SoCs
- *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
- */
-
-#ifndef __ARCH_KIRKWOOD_COMMON_H
-#define __ARCH_KIRKWOOD_COMMON_H
-
-#include <linux/reboot.h>
-
-struct dsa_platform_data;
-struct mv643xx_eth_platform_data;
-struct mv_sata_platform_data;
-struct mvsdio_platform_data;
-struct mtd_partition;
-struct mtd_info;
-struct kirkwood_asoc_platform_data;
-
-#define KW_PCIE0       (1 << 0)
-#define KW_PCIE1       (1 << 1)
-
-/*
- * Basic Kirkwood init functions used early by machine-setup.
- */
-void kirkwood_map_io(void);
-void kirkwood_init(void);
-void kirkwood_init_early(void);
-void kirkwood_init_irq(void);
-
-void kirkwood_setup_wins(void);
-
-void kirkwood_enable_pcie(void);
-void kirkwood_pcie_id(u32 *dev, u32 *rev);
-
-void kirkwood_ehci_init(void);
-void kirkwood_ge00_init(struct mv643xx_eth_platform_data *eth_data);
-void kirkwood_ge01_init(struct mv643xx_eth_platform_data *eth_data);
-void kirkwood_ge00_switch_init(struct dsa_platform_data *d, int irq);
-void kirkwood_pcie_init(unsigned int portmask);
-void kirkwood_sata_init(struct mv_sata_platform_data *sata_data);
-void kirkwood_sdio_init(struct mvsdio_platform_data *mvsdio_data);
-void kirkwood_spi_init(void);
-void kirkwood_i2c_init(void);
-void kirkwood_uart0_init(void);
-void kirkwood_uart1_init(void);
-void kirkwood_nand_init(struct mtd_partition *parts, int nr_parts, int delay);
-void kirkwood_nand_init_rnb(struct mtd_partition *parts, int nr_parts,
-                           int (*dev_ready)(struct mtd_info *));
-void kirkwood_audio_init(void);
-void kirkwood_cpuidle_init(void);
-void kirkwood_cpufreq_init(void);
-
-void kirkwood_restart(enum reboot_mode, const char *);
-void kirkwood_clk_init(void);
-
-/* early init functions not converted to fdt yet */
-char *kirkwood_id(void);
-void kirkwood_l2_init(void);
-void kirkwood_wdt_init(void);
-void kirkwood_xor0_init(void);
-void kirkwood_xor1_init(void);
-void kirkwood_crypto_init(void);
-
-extern int kirkwood_tclk;
-extern void kirkwood_timer_init(void);
-
-#define ARRAY_AND_SIZE(x)      (x), ARRAY_SIZE(x)
-
-#endif
diff --git a/arch/arm/mach-kirkwood/d2net_v2-setup.c b/arch/arm/mach-kirkwood/d2net_v2-setup.c
deleted file mode 100644 (file)
index 4534180..0000000
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * arch/arm/mach-kirkwood/d2net_v2-setup.c
- *
- * LaCie d2 Network Space v2 Board Setup
- *
- * Copyright (C) 2010 Simon Guinot <sguinot@lacie.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/platform_device.h>
-#include <linux/ata_platform.h>
-#include <linux/mv643xx_eth.h>
-#include <linux/input.h>
-#include <linux/gpio.h>
-#include <linux/gpio_keys.h>
-#include <linux/leds.h>
-#include <asm/mach-types.h>
-#include <asm/mach/arch.h>
-#include <mach/kirkwood.h>
-#include <linux/platform_data/leds-kirkwood-ns2.h>
-#include "common.h"
-#include "mpp.h"
-#include "lacie_v2-common.h"
-
-/*****************************************************************************
- * Ethernet
- ****************************************************************************/
-
-static struct mv643xx_eth_platform_data d2net_v2_ge00_data = {
-       .phy_addr       = MV643XX_ETH_PHY_ADDR(8),
-};
-
-/*****************************************************************************
- * SATA
- ****************************************************************************/
-
-static struct mv_sata_platform_data d2net_v2_sata_data = {
-       .n_ports        = 2,
-};
-
-/*****************************************************************************
- * GPIO keys
- ****************************************************************************/
-
-#define D2NET_V2_GPIO_PUSH_BUTTON          34
-#define D2NET_V2_GPIO_POWER_SWITCH_ON      13
-#define D2NET_V2_GPIO_POWER_SWITCH_OFF     15
-
-#define D2NET_V2_SWITCH_POWER_ON           0x1
-#define D2NET_V2_SWITCH_POWER_OFF          0x2
-
-static struct gpio_keys_button d2net_v2_buttons[] = {
-       [0] = {
-               .type           = EV_SW,
-               .code           = D2NET_V2_SWITCH_POWER_ON,
-               .gpio           = D2NET_V2_GPIO_POWER_SWITCH_ON,
-               .desc           = "Back power switch (on|auto)",
-               .active_low     = 0,
-       },
-       [1] = {
-               .type           = EV_SW,
-               .code           = D2NET_V2_SWITCH_POWER_OFF,
-               .gpio           = D2NET_V2_GPIO_POWER_SWITCH_OFF,
-               .desc           = "Back power switch (auto|off)",
-               .active_low     = 0,
-       },
-       [2] = {
-               .code           = KEY_POWER,
-               .gpio           = D2NET_V2_GPIO_PUSH_BUTTON,
-               .desc           = "Front Push Button",
-               .active_low     = 1,
-       },
-};
-
-static struct gpio_keys_platform_data d2net_v2_button_data = {
-       .buttons        = d2net_v2_buttons,
-       .nbuttons       = ARRAY_SIZE(d2net_v2_buttons),
-};
-
-static struct platform_device d2net_v2_gpio_buttons = {
-       .name           = "gpio-keys",
-       .id             = -1,
-       .dev            = {
-               .platform_data  = &d2net_v2_button_data,
-       },
-};
-
-/*****************************************************************************
- * GPIO LEDs
- ****************************************************************************/
-
-#define D2NET_V2_GPIO_RED_LED          12
-
-static struct gpio_led d2net_v2_gpio_led_pins[] = {
-       {
-               .name   = "d2net_v2:red:fail",
-               .gpio   = D2NET_V2_GPIO_RED_LED,
-       },
-};
-
-static struct gpio_led_platform_data d2net_v2_gpio_leds_data = {
-       .num_leds       = ARRAY_SIZE(d2net_v2_gpio_led_pins),
-       .leds           = d2net_v2_gpio_led_pins,
-};
-
-static struct platform_device d2net_v2_gpio_leds = {
-       .name           = "leds-gpio",
-       .id             = -1,
-       .dev            = {
-               .platform_data  = &d2net_v2_gpio_leds_data,
-       },
-};
-
-/*****************************************************************************
- * Dual-GPIO CPLD LEDs
- ****************************************************************************/
-
-#define D2NET_V2_GPIO_BLUE_LED_SLOW    29
-#define D2NET_V2_GPIO_BLUE_LED_CMD     30
-
-static struct ns2_led d2net_v2_led_pins[] = {
-       {
-               .name   = "d2net_v2:blue:sata",
-               .cmd    = D2NET_V2_GPIO_BLUE_LED_CMD,
-               .slow   = D2NET_V2_GPIO_BLUE_LED_SLOW,
-       },
-};
-
-static struct ns2_led_platform_data d2net_v2_leds_data = {
-       .num_leds       = ARRAY_SIZE(d2net_v2_led_pins),
-       .leds           = d2net_v2_led_pins,
-};
-
-static struct platform_device d2net_v2_leds = {
-       .name           = "leds-ns2",
-       .id             = -1,
-       .dev            = {
-               .platform_data  = &d2net_v2_leds_data,
-       },
-};
-
-/*****************************************************************************
- * General Setup
- ****************************************************************************/
-
-static unsigned int d2net_v2_mpp_config[] __initdata = {
-       MPP0_SPI_SCn,
-       MPP1_SPI_MOSI,
-       MPP2_SPI_SCK,
-       MPP3_SPI_MISO,
-       MPP6_SYSRST_OUTn,
-       MPP7_GPO,               /* Request power-off */
-       MPP8_TW0_SDA,
-       MPP9_TW0_SCK,
-       MPP10_UART0_TXD,
-       MPP11_UART0_RXD,
-       MPP12_GPO,              /* Red led */
-       MPP13_GPIO,             /* Rear power switch (on|auto) */
-       MPP14_GPIO,             /* USB fuse */
-       MPP15_GPIO,             /* Rear power switch (auto|off) */
-       MPP16_GPIO,             /* SATA 0 power */
-       MPP21_SATA0_ACTn,
-       MPP24_GPIO,             /* USB mode select */
-       MPP26_GPIO,             /* USB device vbus */
-       MPP28_GPIO,             /* USB enable host vbus */
-       MPP29_GPIO,             /* Blue led (slow register) */
-       MPP30_GPIO,             /* Blue led (command register) */
-       MPP34_GPIO,             /* Power button (1 = Released, 0 = Pushed) */
-       MPP35_GPIO,             /* Inhibit power-off */
-       0
-};
-
-#define D2NET_V2_GPIO_POWER_OFF                7
-
-static void d2net_v2_power_off(void)
-{
-       gpio_set_value(D2NET_V2_GPIO_POWER_OFF, 1);
-}
-
-static void __init d2net_v2_init(void)
-{
-       /*
-        * Basic setup. Needs to be called early.
-        */
-       kirkwood_init();
-       kirkwood_mpp_conf(d2net_v2_mpp_config);
-
-       lacie_v2_hdd_power_init(1);
-
-       kirkwood_ehci_init();
-       kirkwood_ge00_init(&d2net_v2_ge00_data);
-       kirkwood_sata_init(&d2net_v2_sata_data);
-       kirkwood_uart0_init();
-       lacie_v2_register_flash();
-       lacie_v2_register_i2c_devices();
-
-       platform_device_register(&d2net_v2_leds);
-       platform_device_register(&d2net_v2_gpio_leds);
-       platform_device_register(&d2net_v2_gpio_buttons);
-
-       if (gpio_request(D2NET_V2_GPIO_POWER_OFF, "power-off") == 0 &&
-           gpio_direction_output(D2NET_V2_GPIO_POWER_OFF, 0) == 0)
-               pm_power_off = d2net_v2_power_off;
-       else
-               pr_err("d2net_v2: failed to configure power-off GPIO\n");
-}
-
-MACHINE_START(D2NET_V2, "LaCie d2 Network v2")
-       .atag_offset    = 0x100,
-       .init_machine   = d2net_v2_init,
-       .map_io         = kirkwood_map_io,
-       .init_early     = kirkwood_init_early,
-       .init_irq       = kirkwood_init_irq,
-       .init_time      = kirkwood_timer_init,
-       .restart        = kirkwood_restart,
-MACHINE_END
diff --git a/arch/arm/mach-kirkwood/include/mach/bridge-regs.h b/arch/arm/mach-kirkwood/include/mach/bridge-regs.h
deleted file mode 100644 (file)
index 1c37082..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * arch/arm/mach-kirkwood/include/mach/bridge-regs.h
- *
- * Mbus-L to Mbus Bridge Registers
- *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
- */
-
-#ifndef __ASM_ARCH_BRIDGE_REGS_H
-#define __ASM_ARCH_BRIDGE_REGS_H
-
-#include <mach/kirkwood.h>
-
-#define CPU_CONFIG             (BRIDGE_VIRT_BASE + 0x0100)
-#define CPU_CONFIG_PHYS                (BRIDGE_PHYS_BASE + 0x0100)
-#define CPU_CONFIG_ERROR_PROP  0x00000004
-
-#define CPU_CONTROL            (BRIDGE_VIRT_BASE + 0x0104)
-#define CPU_CONTROL_PHYS       (BRIDGE_PHYS_BASE + 0x0104)
-#define CPU_RESET              0x00000002
-
-#define RSTOUTn_MASK           (BRIDGE_VIRT_BASE + 0x0108)
-#define RSTOUTn_MASK_PHYS      (BRIDGE_PHYS_BASE + 0x0108)
-#define SOFT_RESET_OUT_EN      0x00000004
-
-#define SYSTEM_SOFT_RESET      (BRIDGE_VIRT_BASE + 0x010c)
-#define SOFT_RESET             0x00000001
-
-#define BRIDGE_CAUSE           (BRIDGE_VIRT_BASE + 0x0110)
-
-#define BRIDGE_INT_TIMER1_CLR  (~0x0004)
-
-#define IRQ_VIRT_BASE          (BRIDGE_VIRT_BASE + 0x0200)
-#define IRQ_CAUSE_LOW_OFF      0x0000
-#define IRQ_MASK_LOW_OFF       0x0004
-#define IRQ_CAUSE_HIGH_OFF     0x0010
-#define IRQ_MASK_HIGH_OFF      0x0014
-
-#define TIMER_VIRT_BASE                (BRIDGE_VIRT_BASE + 0x0300)
-#define TIMER_PHYS_BASE                (BRIDGE_PHYS_BASE + 0x0300)
-
-#define L2_CONFIG_REG          (BRIDGE_VIRT_BASE + 0x0128)
-#define L2_WRITETHROUGH                0x00000010
-
-#define CLOCK_GATING_CTRL      (BRIDGE_VIRT_BASE + 0x11c)
-#define CGC_BIT_GE0            (0)
-#define CGC_BIT_PEX0           (2)
-#define CGC_BIT_USB0           (3)
-#define CGC_BIT_SDIO           (4)
-#define CGC_BIT_TSU            (5)
-#define CGC_BIT_DUNIT          (6)
-#define CGC_BIT_RUNIT          (7)
-#define CGC_BIT_XOR0           (8)
-#define CGC_BIT_AUDIO          (9)
-#define CGC_BIT_SATA0          (14)
-#define CGC_BIT_SATA1          (15)
-#define CGC_BIT_XOR1           (16)
-#define CGC_BIT_CRYPTO         (17)
-#define CGC_BIT_PEX1           (18)
-#define CGC_BIT_GE1            (19)
-#define CGC_BIT_TDM            (20)
-#define CGC_GE0                        (1 << 0)
-#define CGC_PEX0               (1 << 2)
-#define CGC_USB0               (1 << 3)
-#define CGC_SDIO               (1 << 4)
-#define CGC_TSU                        (1 << 5)
-#define CGC_DUNIT              (1 << 6)
-#define CGC_RUNIT              (1 << 7)
-#define CGC_XOR0               (1 << 8)
-#define CGC_AUDIO              (1 << 9)
-#define CGC_POWERSAVE           (1 << 11)
-#define CGC_SATA0              (1 << 14)
-#define CGC_SATA1              (1 << 15)
-#define CGC_XOR1               (1 << 16)
-#define CGC_CRYPTO             (1 << 17)
-#define CGC_PEX1               (1 << 18)
-#define CGC_GE1                        (1 << 19)
-#define CGC_TDM                        (1 << 20)
-#define CGC_RESERVED           (0x6 << 21)
-
-#define MEMORY_PM_CTRL         (BRIDGE_VIRT_BASE + 0x118)
-#define MEMORY_PM_CTRL_PHYS    (BRIDGE_PHYS_BASE + 0x118)
-
-#endif
diff --git a/arch/arm/mach-kirkwood/include/mach/entry-macro.S b/arch/arm/mach-kirkwood/include/mach/entry-macro.S
deleted file mode 100644 (file)
index 82db29f..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * arch/arm/mach-kirkwood/include/mach/entry-macro.S
- *
- * Low-level IRQ helper macros for Marvell Kirkwood platforms
- *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
- */
-
-#include <mach/bridge-regs.h>
-
-       .macro  get_irqnr_preamble, base, tmp
-       ldr     \base, =IRQ_VIRT_BASE
-       .endm
-
-       .macro  get_irqnr_and_base, irqnr, irqstat, base, tmp
-       @ check low interrupts
-       ldr     \irqstat, [\base, #IRQ_CAUSE_LOW_OFF]
-       ldr     \tmp, [\base, #IRQ_MASK_LOW_OFF]
-       mov     \irqnr, #31
-       ands    \irqstat, \irqstat, \tmp
-       bne     1001f
-
-       @ if no low interrupts set, check high interrupts
-       ldr     \irqstat, [\base, #IRQ_CAUSE_HIGH_OFF]
-       ldr     \tmp, [\base, #IRQ_MASK_HIGH_OFF]
-       mov     \irqnr, #63
-       ands    \irqstat, \irqstat, \tmp
-
-       @ find first active interrupt source
-1001:  clzne   \irqstat, \irqstat
-       subne   \irqnr, \irqnr, \irqstat
-       .endm
diff --git a/arch/arm/mach-kirkwood/include/mach/hardware.h b/arch/arm/mach-kirkwood/include/mach/hardware.h
deleted file mode 100644 (file)
index 742b74f..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- * arch/arm/mach-kirkwood/include/mach/hardware.h
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#ifndef __ASM_ARCH_HARDWARE_H
-#define __ASM_ARCH_HARDWARE_H
-
-#include "kirkwood.h"
-
-#endif
diff --git a/arch/arm/mach-kirkwood/include/mach/irqs.h b/arch/arm/mach-kirkwood/include/mach/irqs.h
deleted file mode 100644 (file)
index 2bf8161..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * arch/arm/mach-kirkwood/include/mach/irqs.h
- *
- * IRQ definitions for Marvell Kirkwood SoCs
- *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
- */
-
-#ifndef __ASM_ARCH_IRQS_H
-#define __ASM_ARCH_IRQS_H
-
-/*
- * Low Interrupt Controller
- */
-#define IRQ_KIRKWOOD_HIGH_SUM  0
-#define IRQ_KIRKWOOD_BRIDGE    1
-#define IRQ_KIRKWOOD_HOST2CPU  2
-#define IRQ_KIRKWOOD_CPU2HOST  3
-#define IRQ_KIRKWOOD_XOR_00    5
-#define IRQ_KIRKWOOD_XOR_01    6
-#define IRQ_KIRKWOOD_XOR_10    7
-#define IRQ_KIRKWOOD_XOR_11    8
-#define IRQ_KIRKWOOD_PCIE      9
-#define IRQ_KIRKWOOD_PCIE1     10
-#define IRQ_KIRKWOOD_GE00_SUM  11
-#define IRQ_KIRKWOOD_GE01_SUM  15
-#define IRQ_KIRKWOOD_USB       19
-#define IRQ_KIRKWOOD_SATA      21
-#define IRQ_KIRKWOOD_CRYPTO    22
-#define IRQ_KIRKWOOD_SPI       23
-#define IRQ_KIRKWOOD_I2S       24
-#define IRQ_KIRKWOOD_TS_0      26
-#define IRQ_KIRKWOOD_SDIO      28
-#define IRQ_KIRKWOOD_TWSI      29
-#define IRQ_KIRKWOOD_AVB       30
-#define IRQ_KIRKWOOD_TDMI      31
-
-/*
- * High Interrupt Controller
- */
-#define IRQ_KIRKWOOD_UART_0    33
-#define IRQ_KIRKWOOD_UART_1    34
-#define IRQ_KIRKWOOD_GPIO_LOW_0_7      35
-#define IRQ_KIRKWOOD_GPIO_LOW_8_15     36
-#define IRQ_KIRKWOOD_GPIO_LOW_16_23    37
-#define IRQ_KIRKWOOD_GPIO_LOW_24_31    38
-#define IRQ_KIRKWOOD_GPIO_HIGH_0_7     39
-#define IRQ_KIRKWOOD_GPIO_HIGH_8_15    40
-#define IRQ_KIRKWOOD_GPIO_HIGH_16_23   41
-#define IRQ_KIRKWOOD_GE00_ERR  46
-#define IRQ_KIRKWOOD_GE01_ERR  47
-#define IRQ_KIRKWOOD_RTC        53
-
-/*
- * KIRKWOOD General Purpose Pins
- */
-#define IRQ_KIRKWOOD_GPIO_START        64
-#define NR_GPIO_IRQS           50
-
-#define NR_IRQS                        (IRQ_KIRKWOOD_GPIO_START + NR_GPIO_IRQS)
-
-
-#endif
diff --git a/arch/arm/mach-kirkwood/include/mach/kirkwood.h b/arch/arm/mach-kirkwood/include/mach/kirkwood.h
deleted file mode 100644 (file)
index 92976ce..0000000
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * arch/arm/mach-kirkwood/include/mach/kirkwood.h
- *
- * Generic definitions for Marvell Kirkwood SoC flavors:
- *  88F6180, 88F6192 and 88F6281.
- *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
- */
-
-#ifndef __ASM_ARCH_KIRKWOOD_H
-#define __ASM_ARCH_KIRKWOOD_H
-
-/*
- * Marvell Kirkwood address maps.
- *
- * phys
- * e0000000    PCIe #0 Memory space
- * e8000000    PCIe #1 Memory space
- * f1000000    on-chip peripheral registers
- * f2000000    PCIe #0 I/O space
- * f3000000    PCIe #1 I/O space
- * f4000000    NAND controller address window
- * f5000000    Security Accelerator SRAM
- *
- * virt                phys            size
- * fed00000    f1000000        1M      on-chip peripheral registers
- * fee00000    f2000000        1M      PCIe #0 I/O space
- * fef00000    f3000000        1M      PCIe #1 I/O space
- */
-
-#define KIRKWOOD_SRAM_PHYS_BASE                0xf5000000
-#define KIRKWOOD_SRAM_SIZE             SZ_2K
-
-#define KIRKWOOD_NAND_MEM_PHYS_BASE    0xf4000000
-#define KIRKWOOD_NAND_MEM_SIZE         SZ_1K
-
-#define KIRKWOOD_PCIE1_IO_PHYS_BASE    0xf3000000
-#define KIRKWOOD_PCIE1_IO_BUS_BASE     0x00010000
-#define KIRKWOOD_PCIE1_IO_SIZE         SZ_64K
-
-#define KIRKWOOD_PCIE_IO_PHYS_BASE     0xf2000000
-#define KIRKWOOD_PCIE_IO_BUS_BASE      0x00000000
-#define KIRKWOOD_PCIE_IO_SIZE          SZ_64K
-
-#define KIRKWOOD_REGS_PHYS_BASE                0xf1000000
-#define KIRKWOOD_REGS_VIRT_BASE                IOMEM(0xfed00000)
-#define KIRKWOOD_REGS_SIZE             SZ_1M
-
-#define KIRKWOOD_PCIE_MEM_PHYS_BASE    0xe0000000
-#define KIRKWOOD_PCIE_MEM_BUS_BASE     0xe0000000
-#define KIRKWOOD_PCIE_MEM_SIZE         SZ_128M
-
-#define KIRKWOOD_PCIE1_MEM_PHYS_BASE   0xe8000000
-#define KIRKWOOD_PCIE1_MEM_BUS_BASE    0xe8000000
-#define KIRKWOOD_PCIE1_MEM_SIZE                SZ_128M
-
-/*
- * Register Map
- */
-#define DDR_VIRT_BASE          (KIRKWOOD_REGS_VIRT_BASE + 0x00000)
-#define DDR_PHYS_BASE           (KIRKWOOD_REGS_PHYS_BASE + 0x00000)
-#define  DDR_WINDOW_CPU_BASE    (DDR_PHYS_BASE + 0x1500)
-#define  DDR_WINDOW_CPU_SZ      (0x20)
-#define DDR_OPERATION_BASE     (DDR_PHYS_BASE + 0x1418)
-
-#define DEV_BUS_PHYS_BASE      (KIRKWOOD_REGS_PHYS_BASE + 0x10000)
-#define DEV_BUS_VIRT_BASE      (KIRKWOOD_REGS_VIRT_BASE + 0x10000)
-#define  SAMPLE_AT_RESET       (DEV_BUS_VIRT_BASE + 0x0030)
-#define  DEVICE_ID             (DEV_BUS_VIRT_BASE + 0x0034)
-#define  GPIO_LOW_VIRT_BASE    (DEV_BUS_VIRT_BASE + 0x0100)
-#define  GPIO_HIGH_VIRT_BASE   (DEV_BUS_VIRT_BASE + 0x0140)
-#define  RTC_PHYS_BASE         (DEV_BUS_PHYS_BASE + 0x0300)
-#define  SPI_PHYS_BASE         (DEV_BUS_PHYS_BASE + 0x0600)
-#define  I2C_PHYS_BASE         (DEV_BUS_PHYS_BASE + 0x1000)
-#define  UART0_PHYS_BASE       (DEV_BUS_PHYS_BASE + 0x2000)
-#define  UART0_VIRT_BASE       (DEV_BUS_VIRT_BASE + 0x2000)
-#define  UART1_PHYS_BASE       (DEV_BUS_PHYS_BASE + 0x2100)
-#define  UART1_VIRT_BASE       (DEV_BUS_VIRT_BASE + 0x2100)
-
-#define BRIDGE_VIRT_BASE       (KIRKWOOD_REGS_VIRT_BASE + 0x20000)
-#define BRIDGE_PHYS_BASE       (KIRKWOOD_REGS_PHYS_BASE + 0x20000)
-#define  BRIDGE_WINS_BASE       (BRIDGE_PHYS_BASE)
-#define  BRIDGE_WINS_SZ         (0x80)
-
-#define CRYPTO_PHYS_BASE       (KIRKWOOD_REGS_PHYS_BASE + 0x30000)
-
-#define PCIE_VIRT_BASE         (KIRKWOOD_REGS_VIRT_BASE + 0x40000)
-#define PCIE_LINK_CTRL         (PCIE_VIRT_BASE + 0x70)
-#define PCIE_STATUS            (PCIE_VIRT_BASE + 0x1a04)
-#define PCIE1_VIRT_BASE                (KIRKWOOD_REGS_VIRT_BASE + 0x44000)
-#define PCIE1_LINK_CTRL                (PCIE1_VIRT_BASE + 0x70)
-#define PCIE1_STATUS           (PCIE1_VIRT_BASE + 0x1a04)
-
-#define USB_PHYS_BASE          (KIRKWOOD_REGS_PHYS_BASE + 0x50000)
-
-#define XOR0_PHYS_BASE         (KIRKWOOD_REGS_PHYS_BASE + 0x60800)
-#define XOR0_VIRT_BASE         (KIRKWOOD_REGS_VIRT_BASE + 0x60800)
-#define XOR1_PHYS_BASE         (KIRKWOOD_REGS_PHYS_BASE + 0x60900)
-#define XOR1_VIRT_BASE         (KIRKWOOD_REGS_VIRT_BASE + 0x60900)
-#define XOR0_HIGH_PHYS_BASE    (KIRKWOOD_REGS_PHYS_BASE + 0x60A00)
-#define XOR0_HIGH_VIRT_BASE    (KIRKWOOD_REGS_VIRT_BASE + 0x60A00)
-#define XOR1_HIGH_PHYS_BASE    (KIRKWOOD_REGS_PHYS_BASE + 0x60B00)
-#define XOR1_HIGH_VIRT_BASE    (KIRKWOOD_REGS_VIRT_BASE + 0x60B00)
-
-#define GE00_PHYS_BASE         (KIRKWOOD_REGS_PHYS_BASE + 0x70000)
-#define GE01_PHYS_BASE         (KIRKWOOD_REGS_PHYS_BASE + 0x74000)
-
-#define SATA_PHYS_BASE         (KIRKWOOD_REGS_PHYS_BASE + 0x80000)
-#define SATA_VIRT_BASE         (KIRKWOOD_REGS_VIRT_BASE + 0x80000)
-#define SATA0_IF_CTRL          (SATA_VIRT_BASE + 0x2050)
-#define SATA0_PHY_MODE_2       (SATA_VIRT_BASE + 0x2330)
-#define SATA1_IF_CTRL          (SATA_VIRT_BASE + 0x4050)
-#define SATA1_PHY_MODE_2       (SATA_VIRT_BASE + 0x4330)
-
-#define SDIO_PHYS_BASE         (KIRKWOOD_REGS_PHYS_BASE + 0x90000)
-
-#define AUDIO_PHYS_BASE                (KIRKWOOD_REGS_PHYS_BASE + 0xA0000)
-#define AUDIO_VIRT_BASE                (KIRKWOOD_REGS_VIRT_BASE + 0xA0000)
-
-/*
- * Supported devices and revisions.
- */
-#define MV88F6281_DEV_ID       0x6281
-#define MV88F6281_REV_Z0       0
-#define MV88F6281_REV_A0       2
-#define MV88F6281_REV_A1       3
-
-#define MV88F6192_DEV_ID       0x6192
-#define MV88F6192_REV_Z0       0
-#define MV88F6192_REV_A0       2
-#define MV88F6192_REV_A1       3
-
-#define MV88F6180_DEV_ID       0x6180
-#define MV88F6180_REV_A0       2
-#define MV88F6180_REV_A1       3
-
-#define MV88F6282_DEV_ID       0x6282
-#define MV88F6282_REV_A0       0
-#define MV88F6282_REV_A1       1
-#endif
diff --git a/arch/arm/mach-kirkwood/include/mach/uncompress.h b/arch/arm/mach-kirkwood/include/mach/uncompress.h
deleted file mode 100644 (file)
index 5bca553..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * arch/arm/mach-kirkwood/include/mach/uncompress.h
- *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
- */
-
-#include <linux/serial_reg.h>
-#include <mach/kirkwood.h>
-
-#define SERIAL_BASE    ((unsigned char *)UART0_PHYS_BASE)
-
-static void putc(const char c)
-{
-       unsigned char *base = SERIAL_BASE;
-       int i;
-
-       for (i = 0; i < 0x1000; i++) {
-               if (base[UART_LSR << 2] & UART_LSR_THRE)
-                       break;
-               barrier();
-       }
-
-       base[UART_TX << 2] = c;
-}
-
-static void flush(void)
-{
-       unsigned char *base = SERIAL_BASE;
-       unsigned char mask;
-       int i;
-
-       mask = UART_LSR_TEMT | UART_LSR_THRE;
-
-       for (i = 0; i < 0x1000; i++) {
-               if ((base[UART_LSR << 2] & mask) == mask)
-                       break;
-               barrier();
-       }
-}
-
-/*
- * nothing to do
- */
-#define arch_decomp_setup()
diff --git a/arch/arm/mach-kirkwood/irq.c b/arch/arm/mach-kirkwood/irq.c
deleted file mode 100644 (file)
index 2c47a8a..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * arch/arm/mach-kirkwood/irq.c
- *
- * Kirkwood IRQ handling.
- *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
- */
-#include <asm/exception.h>
-#include <linux/gpio.h>
-#include <linux/kernel.h>
-#include <linux/irq.h>
-#include <linux/io.h>
-#include <mach/bridge-regs.h>
-#include <plat/orion-gpio.h>
-#include <plat/irq.h>
-#include "common.h"
-
-static int __initdata gpio0_irqs[4] = {
-       IRQ_KIRKWOOD_GPIO_LOW_0_7,
-       IRQ_KIRKWOOD_GPIO_LOW_8_15,
-       IRQ_KIRKWOOD_GPIO_LOW_16_23,
-       IRQ_KIRKWOOD_GPIO_LOW_24_31,
-};
-
-static int __initdata gpio1_irqs[4] = {
-       IRQ_KIRKWOOD_GPIO_HIGH_0_7,
-       IRQ_KIRKWOOD_GPIO_HIGH_8_15,
-       IRQ_KIRKWOOD_GPIO_HIGH_16_23,
-       0,
-};
-
-#ifdef CONFIG_MULTI_IRQ_HANDLER
-/*
- * Compiling with both non-DT and DT support enabled, will
- * break asm irq handler used by non-DT boards. Therefore,
- * we provide a C-style irq handler even for non-DT boards,
- * if MULTI_IRQ_HANDLER is set.
- */
-
-static void __iomem *kirkwood_irq_base = IRQ_VIRT_BASE;
-
-asmlinkage void
-__exception_irq_entry kirkwood_legacy_handle_irq(struct pt_regs *regs)
-{
-       u32 stat;
-
-       stat = readl_relaxed(kirkwood_irq_base + IRQ_CAUSE_LOW_OFF);
-       stat &= readl_relaxed(kirkwood_irq_base + IRQ_MASK_LOW_OFF);
-       if (stat) {
-               unsigned int hwirq = __fls(stat);
-               handle_IRQ(hwirq, regs);
-               return;
-       }
-       stat = readl_relaxed(kirkwood_irq_base + IRQ_CAUSE_HIGH_OFF);
-       stat &= readl_relaxed(kirkwood_irq_base + IRQ_MASK_HIGH_OFF);
-       if (stat) {
-               unsigned int hwirq = 32 + __fls(stat);
-               handle_IRQ(hwirq, regs);
-               return;
-       }
-}
-#endif
-
-void __init kirkwood_init_irq(void)
-{
-       orion_irq_init(0, IRQ_VIRT_BASE + IRQ_MASK_LOW_OFF);
-       orion_irq_init(32, IRQ_VIRT_BASE + IRQ_MASK_HIGH_OFF);
-
-#ifdef CONFIG_MULTI_IRQ_HANDLER
-       set_handle_irq(kirkwood_legacy_handle_irq);
-#endif
-
-       /*
-        * Initialize gpiolib for GPIOs 0-49.
-        */
-       orion_gpio_init(NULL, 0, 32, GPIO_LOW_VIRT_BASE, 0,
-                       IRQ_KIRKWOOD_GPIO_START, gpio0_irqs);
-       orion_gpio_init(NULL, 32, 18, GPIO_HIGH_VIRT_BASE, 0,
-                       IRQ_KIRKWOOD_GPIO_START + 32, gpio1_irqs);
-}
diff --git a/arch/arm/mach-kirkwood/lacie_v2-common.c b/arch/arm/mach-kirkwood/lacie_v2-common.c
deleted file mode 100644 (file)
index 8e3e433..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * arch/arm/mach-kirkwood/lacie_v2-common.c
- *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
- */
-
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/mtd/physmap.h>
-#include <linux/spi/flash.h>
-#include <linux/spi/spi.h>
-#include <linux/i2c.h>
-#include <linux/platform_data/at24.h>
-#include <linux/gpio.h>
-#include <asm/mach/time.h>
-#include <mach/kirkwood.h>
-#include <mach/irqs.h>
-#include <plat/time.h>
-#include "common.h"
-#include "lacie_v2-common.h"
-
-/*****************************************************************************
- * 512KB SPI Flash on Boot Device (MACRONIX MX25L4005)
- ****************************************************************************/
-
-static struct mtd_partition lacie_v2_flash_parts[] = {
-       {
-               .name = "u-boot",
-               .size = MTDPART_SIZ_FULL,
-               .offset = 0,
-               .mask_flags = MTD_WRITEABLE, /* force read-only */
-       },
-};
-
-static const struct flash_platform_data lacie_v2_flash = {
-       .type           = "mx25l4005a",
-       .name           = "spi_flash",
-       .parts          = lacie_v2_flash_parts,
-       .nr_parts       = ARRAY_SIZE(lacie_v2_flash_parts),
-};
-
-static struct spi_board_info __initdata lacie_v2_spi_slave_info[] = {
-       {
-               .modalias       = "m25p80",
-               .platform_data  = &lacie_v2_flash,
-               .irq            = -1,
-               .max_speed_hz   = 20000000,
-               .bus_num        = 0,
-               .chip_select    = 0,
-       },
-};
-
-void __init lacie_v2_register_flash(void)
-{
-       spi_register_board_info(lacie_v2_spi_slave_info,
-                               ARRAY_SIZE(lacie_v2_spi_slave_info));
-       kirkwood_spi_init();
-}
-
-/*****************************************************************************
- * I2C devices
- ****************************************************************************/
-
-static struct at24_platform_data at24c04 = {
-       .byte_len       = SZ_4K / 8,
-       .page_size      = 16,
-};
-
-/*
- * i2c addr | chip         | description
- * 0x50     | HT24LC04     | eeprom (512B)
- */
-
-static struct i2c_board_info __initdata lacie_v2_i2c_info[] = {
-       {
-               I2C_BOARD_INFO("24c04", 0x50),
-               .platform_data  = &at24c04,
-       }
-};
-
-void __init lacie_v2_register_i2c_devices(void)
-{
-       kirkwood_i2c_init();
-       i2c_register_board_info(0, lacie_v2_i2c_info,
-                               ARRAY_SIZE(lacie_v2_i2c_info));
-}
-
-/*****************************************************************************
- * Hard Disk power
- ****************************************************************************/
-
-static int __initdata lacie_v2_gpio_hdd_power[] = { 16, 17, 41, 42, 43 };
-
-void __init lacie_v2_hdd_power_init(int hdd_num)
-{
-       int i;
-       int err;
-
-       /* Power up all hard disks. */
-       for (i = 0; i < hdd_num; i++) {
-               err = gpio_request(lacie_v2_gpio_hdd_power[i], NULL);
-               if (err == 0) {
-                       err = gpio_direction_output(
-                                       lacie_v2_gpio_hdd_power[i], 1);
-                       /* Free the HDD power GPIOs. This allow user-space to
-                        * configure them via the gpiolib sysfs interface. */
-                       gpio_free(lacie_v2_gpio_hdd_power[i]);
-               }
-               if (err)
-                       pr_err("Failed to power up HDD%d\n", i + 1);
-       }
-}
diff --git a/arch/arm/mach-kirkwood/lacie_v2-common.h b/arch/arm/mach-kirkwood/lacie_v2-common.h
deleted file mode 100644 (file)
index fc64f57..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * arch/arm/mach-kirkwood/lacie_v2-common.h
- *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
- */
-
-#ifndef __ARCH_KIRKWOOD_LACIE_V2_COMMON_H
-#define __ARCH_KIRKWOOD_LACIE_V2_COMMON_H
-
-void lacie_v2_register_flash(void);
-void lacie_v2_register_i2c_devices(void);
-void lacie_v2_hdd_power_init(int hdd_num);
-
-#endif
diff --git a/arch/arm/mach-kirkwood/mpp.c b/arch/arm/mach-kirkwood/mpp.c
deleted file mode 100644 (file)
index e96fd71..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * arch/arm/mach-kirkwood/mpp.c
- *
- * MPP functions for Marvell Kirkwood SoCs
- *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
- */
-#include <linux/gpio.h>
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/io.h>
-#include <mach/hardware.h>
-#include <plat/mpp.h>
-#include "common.h"
-#include "mpp.h"
-
-static unsigned int __init kirkwood_variant(void)
-{
-       u32 dev, rev;
-
-       kirkwood_pcie_id(&dev, &rev);
-
-       if (dev == MV88F6281_DEV_ID && rev >= MV88F6281_REV_A0)
-               return MPP_F6281_MASK;
-       if (dev == MV88F6282_DEV_ID)
-               return MPP_F6282_MASK;
-       if (dev == MV88F6192_DEV_ID && rev >= MV88F6192_REV_A0)
-               return MPP_F6192_MASK;
-       if (dev == MV88F6180_DEV_ID)
-               return MPP_F6180_MASK;
-
-       pr_err("MPP setup: unknown kirkwood variant (dev %#x rev %#x)\n",
-              dev, rev);
-       return 0;
-}
-
-void __init kirkwood_mpp_conf(unsigned int *mpp_list)
-{
-       orion_mpp_conf(mpp_list, kirkwood_variant(),
-                      MPP_MAX, DEV_BUS_VIRT_BASE);
-}
diff --git a/arch/arm/mach-kirkwood/mpp.h b/arch/arm/mach-kirkwood/mpp.h
deleted file mode 100644 (file)
index d5a0d1d..0000000
+++ /dev/null
@@ -1,348 +0,0 @@
-/*
- * linux/arch/arm/mach-kirkwood/mpp.h -- Multi Purpose Pins
- *
- * Copyright 2009: Marvell Technology Group Ltd.
- *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
- */
-
-#ifndef __KIRKWOOD_MPP_H
-#define __KIRKWOOD_MPP_H
-
-#define MPP(_num, _sel, _in, _out, _F6180, _F6190, _F6192, _F6281, _F6282) ( \
-       /* MPP number */                ((_num) & 0xff) | \
-       /* MPP select value */          (((_sel) & 0xf) << 8) | \
-       /* may be input signal */       ((!!(_in)) << 12) | \
-       /* may be output signal */      ((!!(_out)) << 13) | \
-       /* available on F6180 */        ((!!(_F6180)) << 14) | \
-       /* available on F6190 */        ((!!(_F6190)) << 15) | \
-       /* available on F6192 */        ((!!(_F6192)) << 16) | \
-       /* available on F6281 */        ((!!(_F6281)) << 17) | \
-       /* available on F6282 */        ((!!(_F6282)) << 18))
-
-                               /*   num sel  i  o  6180 6190 6192 6281 6282 */
-
-#define MPP_F6180_MASK         MPP(  0, 0x0, 0, 0, 1,   0,   0,   0,   0 )
-#define MPP_F6190_MASK         MPP(  0, 0x0, 0, 0, 0,   1,   0,   0,   0 )
-#define MPP_F6192_MASK         MPP(  0, 0x0, 0, 0, 0,   0,   1,   0,   0 )
-#define MPP_F6281_MASK         MPP(  0, 0x0, 0, 0, 0,   0,   0,   1,   0 )
-#define MPP_F6282_MASK         MPP(  0, 0x0, 0, 0, 0,   0,   0,   0,   1 )
-
-#define MPP0_GPIO              MPP(  0, 0x0, 1, 1, 1,   1,   1,   1,   1 )
-#define MPP0_NF_IO2            MPP(  0, 0x1, 0, 0, 1,   1,   1,   1,   1 )
-#define MPP0_SPI_SCn           MPP(  0, 0x2, 0, 0, 1,   1,   1,   1,   1 )
-
-#define MPP1_GPO               MPP(  1, 0x0, 0, 1, 1,   1,   1,   1,   1 )
-#define MPP1_NF_IO3            MPP(  1, 0x1, 0, 0, 1,   1,   1,   1,   1 )
-#define MPP1_SPI_MOSI          MPP(  1, 0x2, 0, 0, 1,   1,   1,   1,   1 )
-
-#define MPP2_GPO               MPP(  2, 0x0, 0, 1, 1,   1,   1,   1,   1 )
-#define MPP2_NF_IO4            MPP(  2, 0x1, 0, 0, 1,   1,   1,   1,   1 )
-#define MPP2_SPI_SCK           MPP(  2, 0x2, 0, 0, 1,   1,   1,   1,   1 )
-
-#define MPP3_GPO               MPP(  3, 0x0, 0, 1, 1,   1,   1,   1,   1 )
-#define MPP3_NF_IO5            MPP(  3, 0x1, 0, 0, 1,   1,   1,   1,   1 )
-#define MPP3_SPI_MISO          MPP(  3, 0x2, 0, 0, 1,   1,   1,   1,   1 )
-
-#define MPP4_GPIO              MPP(  4, 0x0, 1, 1, 1,   1,   1,   1,   1 )
-#define MPP4_NF_IO6            MPP(  4, 0x1, 0, 0, 1,   1,   1,   1,   1 )
-#define MPP4_UART0_RXD         MPP(  4, 0x2, 0, 0, 1,   1,   1,   1,   1 )
-#define MPP4_SATA1_ACTn                MPP(  4, 0x5, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP4_LCD_VGA_HSYNC     MPP(  4, 0xb, 0, 0, 0,   0,   0,   0,   1 )
-#define MPP4_PTP_CLK           MPP(  4, 0xd, 0, 0, 1,   1,   1,   1,   0 )
-
-#define MPP5_GPO               MPP(  5, 0x0, 0, 1, 1,   1,   1,   1,   1 )
-#define MPP5_NF_IO7            MPP(  5, 0x1, 0, 0, 1,   1,   1,   1,   1 )
-#define MPP5_UART0_TXD         MPP(  5, 0x2, 0, 0, 1,   1,   1,   1,   1 )
-#define MPP5_PTP_TRIG_GEN      MPP(  5, 0x4, 0, 0, 1,   1,   1,   1,   0 )
-#define MPP5_SATA0_ACTn                MPP(  5, 0x5, 0, 0, 0,   1,   1,   1,   1 )
-#define MPP5_LCD_VGA_VSYNC     MPP(  5, 0xb, 0, 0, 0,   0,   0,   0,   1 )
-
-#define MPP6_SYSRST_OUTn       MPP(  6, 0x1, 0, 0, 1,   1,   1,   1,   1 )
-#define MPP6_SPI_MOSI          MPP(  6, 0x2, 0, 0, 1,   1,   1,   1,   1 )
-#define MPP6_PTP_TRIG_GEN      MPP(  6, 0x3, 0, 0, 1,   1,   1,   1,   0 )
-
-#define MPP7_GPO               MPP(  7, 0x0, 0, 1, 1,   1,   1,   1,   1 )
-#define MPP7_PEX_RST_OUTn      MPP(  7, 0x1, 0, 0, 1,   1,   1,   1,   0 )
-#define MPP7_SPI_SCn           MPP(  7, 0x2, 0, 0, 1,   1,   1,   1,   1 )
-#define MPP7_PTP_TRIG_GEN      MPP(  7, 0x3, 0, 0, 1,   1,   1,   1,   0 )
-#define MPP7_LCD_PWM           MPP(  7, 0xb, 0, 0, 0,   0,   0,   0,   1 )
-
-#define MPP8_GPIO              MPP(  8, 0x0, 1, 1, 1,   1,   1,   1,   1 )
-#define MPP8_TW0_SDA           MPP(  8, 0x1, 0, 0, 1,   1,   1,   1,   1 )
-#define MPP8_UART0_RTS         MPP(  8, 0x2, 0, 0, 1,   1,   1,   1,   1 )
-#define MPP8_UART1_RTS         MPP(  8, 0x3, 0, 0, 1,   1,   1,   1,   1 )
-#define MPP8_MII0_RXERR                MPP(  8, 0x4, 0, 0, 0,   1,   1,   1,   1 )
-#define MPP8_SATA1_PRESENTn    MPP(  8, 0x5, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP8_PTP_CLK           MPP(  8, 0xc, 0, 0, 1,   1,   1,   1,   0 )
-#define MPP8_MII0_COL          MPP(  8, 0xd, 0, 0, 1,   1,   1,   1,   1 )
-
-#define MPP9_GPIO              MPP(  9, 0x0, 1, 1, 1,   1,   1,   1,   1 )
-#define MPP9_TW0_SCK           MPP(  9, 0x1, 0, 0, 1,   1,   1,   1,   1 )
-#define MPP9_UART0_CTS         MPP(  9, 0x2, 0, 0, 1,   1,   1,   1,   1 )
-#define MPP9_UART1_CTS         MPP(  9, 0x3, 0, 0, 1,   1,   1,   1,   1 )
-#define MPP9_SATA0_PRESENTn    MPP(  9, 0x5, 0, 0, 0,   1,   1,   1,   1 )
-#define MPP9_PTP_EVENT_REQ     MPP(  9, 0xc, 0, 0, 1,   1,   1,   1,   0 )
-#define MPP9_MII0_CRS          MPP(  9, 0xd, 0, 0, 1,   1,   1,   1,   1 )
-
-#define MPP10_GPO              MPP( 10, 0x0, 0, 1, 1,   1,   1,   1,   1 )
-#define MPP10_SPI_SCK          MPP( 10, 0x2, 0, 0, 1,   1,   1,   1,   1 )
-#define MPP10_UART0_TXD                MPP( 10, 0X3, 0, 0, 1,   1,   1,   1,   1 )
-#define MPP10_SATA1_ACTn       MPP( 10, 0x5, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP10_PTP_TRIG_GEN     MPP( 10, 0xc, 0, 0, 1,   1,   1,   1,   0 )
-
-#define MPP11_GPIO             MPP( 11, 0x0, 1, 1, 1,   1,   1,   1,   1 )
-#define MPP11_SPI_MISO         MPP( 11, 0x2, 0, 0, 1,   1,   1,   1,   1 )
-#define MPP11_UART0_RXD                MPP( 11, 0x3, 0, 0, 1,   1,   1,   1,   1 )
-#define MPP11_PTP_EVENT_REQ    MPP( 11, 0x4, 0, 0, 1,   1,   1,   1,   0 )
-#define MPP11_PTP_TRIG_GEN     MPP( 11, 0xc, 0, 0, 1,   1,   1,   1,   0 )
-#define MPP11_PTP_CLK          MPP( 11, 0xd, 0, 0, 1,   1,   1,   1,   0 )
-#define MPP11_SATA0_ACTn       MPP( 11, 0x5, 0, 0, 0,   1,   1,   1,   1 )
-
-#define MPP12_GPO              MPP( 12, 0x0, 0, 1, 1,   1,   1,   1,   1 )
-#define MPP12_GPIO             MPP( 12, 0x0, 1, 1, 0,   0,   0,   1,   0 )
-#define MPP12_SD_CLK           MPP( 12, 0x1, 0, 0, 1,   1,   1,   1,   1 )
-#define MPP12_AU_SPDIF0                MPP( 12, 0xa, 0, 0, 0,   0,   0,   0,   1 )
-#define MPP12_SPI_MOSI         MPP( 12, 0xb, 0, 0, 0,   0,   0,   0,   1 )
-#define MPP12_TW1_SDA          MPP( 12, 0xd, 0, 0, 0,   0,   0,   0,   1 )
-
-#define MPP13_GPIO             MPP( 13, 0x0, 1, 1, 1,   1,   1,   1,   1 )
-#define MPP13_SD_CMD           MPP( 13, 0x1, 0, 0, 1,   1,   1,   1,   1 )
-#define MPP13_UART1_TXD                MPP( 13, 0x3, 0, 0, 1,   1,   1,   1,   1 )
-#define MPP13_AU_SPDIFRMCLK    MPP( 13, 0xa, 0, 0, 0,   0,   0,   0,   1 )
-#define MPP13_LCDPWM           MPP( 13, 0xb, 0, 0, 0,   0,   0,   0,   1 )
-
-#define MPP14_GPIO             MPP( 14, 0x0, 1, 1, 1,   1,   1,   1,   1 )
-#define MPP14_SD_D0            MPP( 14, 0x1, 0, 0, 1,   1,   1,   1,   1 )
-#define MPP14_UART1_RXD                MPP( 14, 0x3, 0, 0, 1,   1,   1,   1,   1 )
-#define MPP14_SATA1_PRESENTn   MPP( 14, 0x4, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP14_AU_SPDIFI                MPP( 14, 0xa, 0, 0, 0,   0,   0,   0,   1 )
-#define MPP14_AU_I2SDI         MPP( 14, 0xb, 0, 0, 0,   0,   0,   0,   1 )
-#define MPP14_MII0_COL         MPP( 14, 0xd, 0, 0, 1,   1,   1,   1,   1 )
-
-#define MPP15_GPIO             MPP( 15, 0x0, 1, 1, 1,   1,   1,   1,   1 )
-#define MPP15_SD_D1            MPP( 15, 0x1, 0, 0, 1,   1,   1,   1,   1 )
-#define MPP15_UART0_RTS                MPP( 15, 0x2, 0, 0, 1,   1,   1,   1,   1 )
-#define MPP15_UART1_TXD                MPP( 15, 0x3, 0, 0, 1,   1,   1,   1,   1 )
-#define MPP15_SATA0_ACTn       MPP( 15, 0x4, 0, 0, 0,   1,   1,   1,   1 )
-#define MPP15_SPI_CSn          MPP( 15, 0xb, 0, 0, 0,   0,   0,   0,   1 )
-
-#define MPP16_GPIO             MPP( 16, 0x0, 1, 1, 1,   1,   1,   1,   1 )
-#define MPP16_SD_D2            MPP( 16, 0x1, 0, 0, 1,   1,   1,   1,   1 )
-#define MPP16_UART0_CTS                MPP( 16, 0x2, 0, 0, 1,   1,   1,   1,   1 )
-#define MPP16_UART1_RXD                MPP( 16, 0x3, 0, 0, 1,   1,   1,   1,   1 )
-#define MPP16_SATA1_ACTn       MPP( 16, 0x4, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP16_LCD_EXT_REF_CLK  MPP( 16, 0xb, 0, 0, 0,   0,   0,   0,   1 )
-#define MPP16_MII0_CRS         MPP( 16, 0xd, 0, 0, 1,   1,   1,   1,   1 )
-
-#define MPP17_GPIO             MPP( 17, 0x0, 1, 1, 1,   1,   1,   1,   1 )
-#define MPP17_SD_D3            MPP( 17, 0x1, 0, 0, 1,   1,   1,   1,   1 )
-#define MPP17_SATA0_PRESENTn   MPP( 17, 0x4, 0, 0, 0,   1,   1,   1,   1 )
-#define MPP17_SATA1_ACTn       MPP( 17, 0xa, 0, 0, 0,   0,   0,   0,   1 )
-#define MPP17_TW1_SCK          MPP( 17, 0xd, 0, 0, 0,   0,   0,   0,   1 )
-
-#define MPP18_GPO              MPP( 18, 0x0, 0, 1, 1,   1,   1,   1,   1 )
-#define MPP18_NF_IO0           MPP( 18, 0x1, 0, 0, 1,   1,   1,   1,   1 )
-#define MPP18_PEX0_CLKREQ      MPP( 18, 0x2, 0, 0, 0,   0,   0,   0,   1 )
-
-#define MPP19_GPO              MPP( 19, 0x0, 0, 1, 1,   1,   1,   1,   1 )
-#define MPP19_NF_IO1           MPP( 19, 0x1, 0, 0, 1,   1,   1,   1,   1 )
-
-#define MPP20_GPIO             MPP( 20, 0x0, 1, 1, 0,   1,   1,   1,   1 )
-#define MPP20_TSMP0            MPP( 20, 0x1, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP20_TDM_CH0_TX_QL    MPP( 20, 0x2, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP20_GE1_TXD0         MPP( 20, 0x3, 0, 0, 0,   1,   1,   1,   1 )
-#define MPP20_AU_SPDIFI                MPP( 20, 0x4, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP20_SATA1_ACTn       MPP( 20, 0x5, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP20_LCD_D0           MPP( 20, 0xb, 0, 0, 0,   0,   0,   0,   1 )
-
-#define MPP21_GPIO             MPP( 21, 0x0, 1, 1, 0,   1,   1,   1,   1 )
-#define MPP21_TSMP1            MPP( 21, 0x1, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP21_TDM_CH0_RX_QL    MPP( 21, 0x2, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP21_GE1_TXD1         MPP( 21, 0x3, 0, 0, 0,   1,   1,   1,   1 )
-#define MPP21_AU_SPDIFO                MPP( 21, 0x4, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP21_SATA0_ACTn       MPP( 21, 0x5, 0, 0, 0,   1,   1,   1,   1 )
-#define MPP21_LCD_D1           MPP( 21, 0xb, 0, 0, 0,   0,   0,   0,   1 )
-
-#define MPP22_GPIO             MPP( 22, 0x0, 1, 1, 0,   1,   1,   1,   1 )
-#define MPP22_TSMP2            MPP( 22, 0x1, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP22_TDM_CH2_TX_QL    MPP( 22, 0x2, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP22_GE1_TXD2         MPP( 22, 0x3, 0, 0, 0,   1,   1,   1,   1 )
-#define MPP22_AU_SPDIFRMKCLK   MPP( 22, 0x4, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP22_SATA1_PRESENTn   MPP( 22, 0x5, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP22_LCD_D2           MPP( 22, 0xb, 0, 0, 0,   0,   0,   0,   1 )
-
-#define MPP23_GPIO             MPP( 23, 0x0, 1, 1, 0,   1,   1,   1,   1 )
-#define MPP23_TSMP3            MPP( 23, 0x1, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP23_TDM_CH2_RX_QL    MPP( 23, 0x2, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP23_GE1_TXD3         MPP( 23, 0x3, 0, 0, 0,   1,   1,   1,   1 )
-#define MPP23_AU_I2SBCLK       MPP( 23, 0x4, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP23_SATA0_PRESENTn   MPP( 23, 0x5, 0, 0, 0,   1,   1,   1,   1 )
-#define MPP23_LCD_D3           MPP( 23, 0xb, 0, 0, 0,   0,   0,   0,   1 )
-
-#define MPP24_GPIO             MPP( 24, 0x0, 1, 1, 0,   1,   1,   1,   1 )
-#define MPP24_TSMP4            MPP( 24, 0x1, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP24_TDM_SPI_CS0      MPP( 24, 0x2, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP24_GE1_RXD0         MPP( 24, 0x3, 0, 0, 0,   1,   1,   1,   1 )
-#define MPP24_AU_I2SDO         MPP( 24, 0x4, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP24_LCD_D4           MPP( 24, 0xb, 0, 0, 0,   0,   0,   0,   1 )
-
-#define MPP25_GPIO             MPP( 25, 0x0, 1, 1, 0,   1,   1,   1,   1 )
-#define MPP25_TSMP5            MPP( 25, 0x1, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP25_TDM_SPI_SCK      MPP( 25, 0x2, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP25_GE1_RXD1         MPP( 25, 0x3, 0, 0, 0,   1,   1,   1,   1 )
-#define MPP25_AU_I2SLRCLK      MPP( 25, 0x4, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP25_LCD_D5           MPP( 25, 0xb, 0, 0, 0,   0,   0,   0,   1 )
-
-#define MPP26_GPIO             MPP( 26, 0x0, 1, 1, 0,   1,   1,   1,   1 )
-#define MPP26_TSMP6            MPP( 26, 0x1, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP26_TDM_SPI_MISO     MPP( 26, 0x2, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP26_GE1_RXD2         MPP( 26, 0x3, 0, 0, 0,   1,   1,   1,   1 )
-#define MPP26_AU_I2SMCLK       MPP( 26, 0x4, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP26_LCD_D6           MPP( 26, 0xb, 0, 0, 0,   0,   0,   0,   1 )
-
-#define MPP27_GPIO             MPP( 27, 0x0, 1, 1, 0,   1,   1,   1,   1 )
-#define MPP27_TSMP7            MPP( 27, 0x1, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP27_TDM_SPI_MOSI     MPP( 27, 0x2, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP27_GE1_RXD3         MPP( 27, 0x3, 0, 0, 0,   1,   1,   1,   1 )
-#define MPP27_AU_I2SDI         MPP( 27, 0x4, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP27_LCD_D7           MPP( 27, 0xb, 0, 0, 0,   0,   0,   0,   1 )
-
-#define MPP28_GPIO             MPP( 28, 0x0, 1, 1, 0,   1,   1,   1,   1 )
-#define MPP28_TSMP8            MPP( 28, 0x1, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP28_TDM_CODEC_INTn   MPP( 28, 0x2, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP28_GE1_COL          MPP( 28, 0x3, 0, 0, 0,   1,   1,   1,   1 )
-#define MPP28_AU_EXTCLK                MPP( 28, 0x4, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP28_LCD_D8           MPP( 28, 0xb, 0, 0, 0,   0,   0,   0,   1 )
-
-#define MPP29_GPIO             MPP( 29, 0x0, 1, 1, 0,   1,   1,   1,   1 )
-#define MPP29_TSMP9            MPP( 29, 0x1, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP29_TDM_CODEC_RSTn   MPP( 29, 0x2, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP29_GE1_TCLK         MPP( 29, 0x3, 0, 0, 0,   1,   1,   1,   1 )
-#define MPP29_LCD_D9           MPP( 29, 0xb, 0, 0, 0,   0,   0,   0,   1 )
-
-#define MPP30_GPIO             MPP( 30, 0x0, 1, 1, 0,   1,   1,   1,   1 )
-#define MPP30_TSMP10           MPP( 30, 0x1, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP30_TDM_PCLK         MPP( 30, 0x2, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP30_GE1_RXCTL                MPP( 30, 0x3, 0, 0, 0,   1,   1,   1,   1 )
-#define MPP30_LCD_D10          MPP( 30, 0xb, 0, 0, 0,   0,   0,   0,   1 )
-
-#define MPP31_GPIO             MPP( 31, 0x0, 1, 1, 0,   1,   1,   1,   1 )
-#define MPP31_TSMP11           MPP( 31, 0x1, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP31_TDM_FS           MPP( 31, 0x2, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP31_GE1_RXCLK                MPP( 31, 0x3, 0, 0, 0,   1,   1,   1,   1 )
-#define MPP31_LCD_D11          MPP( 31, 0xb, 0, 0, 0,   0,   0,   0,   1 )
-
-#define MPP32_GPIO             MPP( 32, 0x0, 1, 1, 0,   1,   1,   1,   1 )
-#define MPP32_TSMP12           MPP( 32, 0x1, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP32_TDM_DRX          MPP( 32, 0x2, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP32_GE1_TCLKOUT      MPP( 32, 0x3, 0, 0, 0,   1,   1,   1,   1 )
-#define MPP32_LCD_D12          MPP( 32, 0xb, 0, 0, 0,   0,   0,   0,   1 )
-
-#define MPP33_GPO              MPP( 33, 0x0, 0, 1, 0,   1,   1,   1,   1 )
-#define MPP33_TDM_DTX          MPP( 33, 0x2, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP33_GE1_TXCTL                MPP( 33, 0x3, 0, 0, 0,   1,   1,   1,   1 )
-#define MPP33_LCD_D13          MPP( 33, 0xb, 0, 0, 0,   0,   0,   0,   1 )
-
-#define MPP34_GPIO             MPP( 34, 0x0, 1, 1, 0,   1,   1,   1,   1 )
-#define MPP34_TDM_SPI_CS1      MPP( 34, 0x2, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP34_GE1_TXEN         MPP( 34, 0x3, 0, 0, 0,   1,   1,   1,   1 )
-#define MPP34_SATA1_ACTn       MPP( 34, 0x5, 0, 0, 0,   0,   0,   1,   1 )
-#define MPP34_LCD_D14          MPP( 34, 0xb, 0, 0, 0,   0,   0,   0,   1 )
-
-#define MPP35_GPIO             MPP( 35, 0x0, 1, 1, 1,   1,   1,   1,   1 )
-#define MPP35_TDM_CH0_TX_QL    MPP( 35, 0x2, 0, 0, 0,   0,   1,   1,   1 )
-#define MPP35_GE1_RXERR                MPP( 35, 0x3, 0, 0, 0,   1,   1,   1,   1 )
-#define MPP35_SATA0_ACTn       MPP( 35, 0x5, 0, 0, 0,   1,   1,   1,   1 )
-#define MPP35_LCD_D15          MPP( 22, 0xb, 0, 0, 0,   0,   0,   0,   1 )
-#define MPP35_MII0_RXERR       MPP( 35, 0xc, 0, 0, 1,   1,   1,   1,   1 )
-
-#define MPP36_GPIO             MPP( 36, 0x0, 1, 1, 1,   0,   0,   1,   1 )
-#define MPP36_TSMP0            MPP( 36, 0x1, 0, 0, 0,   0,   0,   1,   1 )
-#define MPP36_TDM_SPI_CS1      MPP( 36, 0x2, 0, 0, 0,   0,   0,   1,   1 )
-#define MPP36_AU_SPDIFI                MPP( 36, 0x4, 0, 0, 1,   0,   0,   1,   1 )
-#define MPP36_TW1_SDA          MPP( 36, 0xb, 0, 0, 0,   0,   0,   0,   1 )
-
-#define MPP37_GPIO             MPP( 37, 0x0, 1, 1, 1,   0,   0,   1,   1 )
-#define MPP37_TSMP1            MPP( 37, 0x1, 0, 0, 0,   0,   0,   1,   1 )
-#define MPP37_TDM_CH2_TX_QL    MPP( 37, 0x2, 0, 0, 0,   0,   0,   1,   1 )
-#define MPP37_AU_SPDIFO                MPP( 37, 0x4, 0, 0, 1,   0,   0,   1,   1 )
-#define MPP37_TW1_SCK          MPP( 37, 0xb, 0, 0, 0,   0,   0,   0,   1 )
-
-#define MPP38_GPIO             MPP( 38, 0x0, 1, 1, 1,   0,   0,   1,   1 )
-#define MPP38_TSMP2            MPP( 38, 0x1, 0, 0, 0,   0,   0,   1,   1 )
-#define MPP38_TDM_CH2_RX_QL    MPP( 38, 0x2, 0, 0, 0,   0,   0,   1,   1 )
-#define MPP38_AU_SPDIFRMLCLK   MPP( 38, 0x4, 0, 0, 1,   0,   0,   1,   1 )
-#define MPP38_LCD_D18          MPP( 38, 0xb, 0, 0, 0,   0,   0,   0,   1 )
-
-#define MPP39_GPIO             MPP( 39, 0x0, 1, 1, 1,   0,   0,   1,   1 )
-#define MPP39_TSMP3            MPP( 39, 0x1, 0, 0, 0,   0,   0,   1,   1 )
-#define MPP39_TDM_SPI_CS0      MPP( 39, 0x2, 0, 0, 0,   0,   0,   1,   1 )
-#define MPP39_AU_I2SBCLK       MPP( 39, 0x4, 0, 0, 1,   0,   0,   1,   1 )
-#define MPP39_LCD_D19          MPP( 39, 0xb, 0, 0, 0,   0,   0,   0,   1 )
-
-#define MPP40_GPIO             MPP( 40, 0x0, 1, 1, 1,   0,   0,   1,   1 )
-#define MPP40_TSMP4            MPP( 40, 0x1, 0, 0, 0,   0,   0,   1,   1 )
-#define MPP40_TDM_SPI_SCK      MPP( 40, 0x2, 0, 0, 0,   0,   0,   1,   1 )
-#define MPP40_AU_I2SDO         MPP( 40, 0x4, 0, 0, 1,   0,   0,   1,   1 )
-#define MPP40_LCD_D20          MPP( 40, 0xb, 0, 0, 0,   0,   0,   0,   1 )
-
-#define MPP41_GPIO             MPP( 41, 0x0, 1, 1, 1,   0,   0,   1,   1 )
-#define MPP41_TSMP5            MPP( 41, 0x1, 0, 0, 0,   0,   0,   1,   1 )
-#define MPP41_TDM_SPI_MISO     MPP( 41, 0x2, 0, 0, 0,   0,   0,   1,   1 )
-#define MPP41_AU_I2SLRCLK      MPP( 41, 0x4, 0, 0, 1,   0,   0,   1,   1 )
-#define MPP41_LCD_D21          MPP( 41, 0xb, 0, 0, 0,   0,   0,   0,   1 )
-
-#define MPP42_GPIO             MPP( 42, 0x0, 1, 1, 1,   0,   0,   1,   1 )
-#define MPP42_TSMP6            MPP( 42, 0x1, 0, 0, 0,   0,   0,   1,   1 )
-#define MPP42_TDM_SPI_MOSI     MPP( 42, 0x2, 0, 0, 0,   0,   0,   1,   1 )
-#define MPP42_AU_I2SMCLK       MPP( 42, 0x4, 0, 0, 1,   0,   0,   1,   1 )
-#define MPP42_LCD_D22          MPP( 42, 0xb, 0, 0, 0,   0,   0,   0,   1 )
-
-#define MPP43_GPIO             MPP( 43, 0x0, 1, 1, 1,   0,   0,   1,   1 )
-#define MPP43_TSMP7            MPP( 43, 0x1, 0, 0, 0,   0,   0,   1,   1 )
-#define MPP43_TDM_CODEC_INTn   MPP( 43, 0x2, 0, 0, 0,   0,   0,   1,   1 )
-#define MPP43_AU_I2SDI         MPP( 43, 0x4, 0, 0, 1,   0,   0,   1,   1 )
-#define MPP43_LCD_D23          MPP( 22, 0xb, 0, 0, 0,   0,   0,   0,   1 )
-
-#define MPP44_GPIO             MPP( 44, 0x0, 1, 1, 1,   0,   0,   1,   1 )
-#define MPP44_TSMP8            MPP( 44, 0x1, 0, 0, 0,   0,   0,   1,   1 )
-#define MPP44_TDM_CODEC_RSTn   MPP( 44, 0x2, 0, 0, 0,   0,   0,   1,   1 )
-#define MPP44_AU_EXTCLK                MPP( 44, 0x4, 0, 0, 1,   0,   0,   1,   1 )
-#define MPP44_LCD_CLK          MPP( 44, 0xb, 0, 0, 0,   0,   0,   0,   1 )
-
-#define MPP45_GPIO             MPP( 45, 0x0, 1, 1, 0,   0,   0,   1,   1 )
-#define MPP45_TSMP9            MPP( 45, 0x1, 0, 0, 0,   0,   0,   1,   1 )
-#define MPP45_TDM_PCLK         MPP( 45, 0x2, 0, 0, 0,   0,   0,   1,   1 )
-#define MPP245_LCD_E           MPP( 45, 0xb, 0, 0, 0,   0,   0,   0,   1 )
-
-#define MPP46_GPIO             MPP( 46, 0x0, 1, 1, 0,   0,   0,   1,   1 )
-#define MPP46_TSMP10           MPP( 46, 0x1, 0, 0, 0,   0,   0,   1,   1 )
-#define MPP46_TDM_FS           MPP( 46, 0x2, 0, 0, 0,   0,   0,   1,   1 )
-#define MPP46_LCD_HSYNC                MPP( 46, 0xb, 0, 0, 0,   0,   0,   0,   1 )
-
-#define MPP47_GPIO             MPP( 47, 0x0, 1, 1, 0,   0,   0,   1,   1 )
-#define MPP47_TSMP11           MPP( 47, 0x1, 0, 0, 0,   0,   0,   1,   1 )
-#define MPP47_TDM_DRX          MPP( 47, 0x2, 0, 0, 0,   0,   0,   1,   1 )
-#define MPP47_LCD_VSYNC                MPP( 47, 0xb, 0, 0, 0,   0,   0,   0,   1 )
-
-#define MPP48_GPIO             MPP( 48, 0x0, 1, 1, 0,   0,   0,   1,   1 )
-#define MPP48_TSMP12           MPP( 48, 0x1, 0, 0, 0,   0,   0,   1,   1 )
-#define MPP48_TDM_DTX          MPP( 48, 0x2, 0, 0, 0,   0,   0,   1,   1 )
-#define MPP48_LCD_D16          MPP( 22, 0xb, 0, 0, 0,   0,   0,   0,   1 )
-
-#define MPP49_GPIO             MPP( 49, 0x0, 1, 1, 0,   0,   0,   1,   0 )
-#define MPP49_GPO              MPP( 49, 0x0, 0, 1, 0,   0,   0,   0,   1 )
-#define MPP49_TSMP9            MPP( 49, 0x1, 0, 0, 0,   0,   0,   1,   0 )
-#define MPP49_TDM_CH0_RX_QL    MPP( 49, 0x2, 0, 0, 0,   0,   0,   1,   1 )
-#define MPP49_PTP_CLK          MPP( 49, 0x5, 0, 0, 0,   0,   0,   1,   0 )
-#define MPP49_PEX0_CLKREQ      MPP( 49, 0xa, 0, 0, 0,   0,   0,   0,   1 )
-#define MPP49_LCD_D17          MPP( 49, 0xb, 0, 0, 0,   0,   0,   0,   1 )
-
-#define MPP_MAX                        49
-
-void kirkwood_mpp_conf(unsigned int *mpp_list);
-
-#endif
diff --git a/arch/arm/mach-kirkwood/netxbig_v2-setup.c b/arch/arm/mach-kirkwood/netxbig_v2-setup.c
deleted file mode 100644 (file)
index 913d032..0000000
+++ /dev/null
@@ -1,422 +0,0 @@
-/*
- * arch/arm/mach-kirkwood/netxbig_v2-setup.c
- *
- * LaCie 2Big and 5Big Network v2 board setup
- *
- * Copyright (C) 2010 Simon Guinot <sguinot@lacie.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/platform_device.h>
-#include <linux/ata_platform.h>
-#include <linux/mv643xx_eth.h>
-#include <linux/input.h>
-#include <linux/gpio.h>
-#include <linux/gpio_keys.h>
-#include <linux/leds.h>
-#include <asm/mach-types.h>
-#include <asm/mach/arch.h>
-#include <mach/kirkwood.h>
-#include <linux/platform_data/leds-kirkwood-netxbig.h>
-#include "common.h"
-#include "mpp.h"
-#include "lacie_v2-common.h"
-
-/*****************************************************************************
- * Ethernet
- ****************************************************************************/
-
-static struct mv643xx_eth_platform_data netxbig_v2_ge00_data = {
-       .phy_addr       = MV643XX_ETH_PHY_ADDR(8),
-};
-
-static struct mv643xx_eth_platform_data netxbig_v2_ge01_data = {
-       .phy_addr       = MV643XX_ETH_PHY_ADDR(0),
-};
-
-/*****************************************************************************
- * SATA
- ****************************************************************************/
-
-static struct mv_sata_platform_data netxbig_v2_sata_data = {
-       .n_ports        = 2,
-};
-
-/*****************************************************************************
- * GPIO keys
- ****************************************************************************/
-
-#define NETXBIG_V2_GPIO_SWITCH_POWER_ON                13
-#define NETXBIG_V2_GPIO_SWITCH_POWER_OFF       15
-#define NETXBIG_V2_GPIO_FUNC_BUTTON            34
-
-#define NETXBIG_V2_SWITCH_POWER_ON             0x1
-#define NETXBIG_V2_SWITCH_POWER_OFF            0x2
-
-static struct gpio_keys_button netxbig_v2_buttons[] = {
-       [0] = {
-               .type           = EV_SW,
-               .code           = NETXBIG_V2_SWITCH_POWER_ON,
-               .gpio           = NETXBIG_V2_GPIO_SWITCH_POWER_ON,
-               .desc           = "Back power switch (on|auto)",
-               .active_low     = 1,
-       },
-       [1] = {
-               .type           = EV_SW,
-               .code           = NETXBIG_V2_SWITCH_POWER_OFF,
-               .gpio           = NETXBIG_V2_GPIO_SWITCH_POWER_OFF,
-               .desc           = "Back power switch (auto|off)",
-               .active_low     = 1,
-       },
-       [2] = {
-               .code           = KEY_OPTION,
-               .gpio           = NETXBIG_V2_GPIO_FUNC_BUTTON,
-               .desc           = "Function button",
-               .active_low     = 1,
-       },
-};
-
-static struct gpio_keys_platform_data netxbig_v2_button_data = {
-       .buttons        = netxbig_v2_buttons,
-       .nbuttons       = ARRAY_SIZE(netxbig_v2_buttons),
-};
-
-static struct platform_device netxbig_v2_gpio_buttons = {
-       .name           = "gpio-keys",
-       .id             = -1,
-       .dev            = {
-               .platform_data  = &netxbig_v2_button_data,
-       },
-};
-
-/*****************************************************************************
- * GPIO extension LEDs
- ****************************************************************************/
-
-/*
- * The LEDs are controlled by a CPLD and can be configured through a GPIO
- * extension bus:
- *
- * - address register : bit [0-2] -> GPIO [47-49]
- * - data register    : bit [0-2] -> GPIO [44-46]
- * - enable register  : GPIO 29
- */
-
-static int netxbig_v2_gpio_ext_addr[] = { 47, 48, 49 };
-static int netxbig_v2_gpio_ext_data[] = { 44, 45, 46 };
-
-static struct netxbig_gpio_ext netxbig_v2_gpio_ext = {
-       .addr           = netxbig_v2_gpio_ext_addr,
-       .num_addr       = ARRAY_SIZE(netxbig_v2_gpio_ext_addr),
-       .data           = netxbig_v2_gpio_ext_data,
-       .num_data       = ARRAY_SIZE(netxbig_v2_gpio_ext_data),
-       .enable         = 29,
-};
-
-/*
- * Address register selection:
- *
- * addr | register
- * ----------------------------
- *   0  | front LED
- *   1  | front LED brightness
- *   2  | SATA LED brightness
- *   3  | SATA0 LED
- *   4  | SATA1 LED
- *   5  | SATA2 LED
- *   6  | SATA3 LED
- *   7  | SATA4 LED
- *
- * Data register configuration:
- *
- * data | LED brightness
- * -------------------------------------------------
- *   0  | min (off)
- *   -  | -
- *   7  | max
- *
- * data | front LED mode
- * -------------------------------------------------
- *   0  | fix off
- *   1  | fix blue on
- *   2  | fix red on
- *   3  | blink blue on=1 sec and blue off=1 sec
- *   4  | blink red on=1 sec and red off=1 sec
- *   5  | blink blue on=2.5 sec and red on=0.5 sec
- *   6  | blink blue on=1 sec and red on=1 sec
- *   7  | blink blue on=0.5 sec and blue off=2.5 sec
- *
- * data | SATA LED mode
- * -------------------------------------------------
- *   0  | fix off
- *   1  | SATA activity blink
- *   2  | fix red on
- *   3  | blink blue on=1 sec and blue off=1 sec
- *   4  | blink red on=1 sec and red off=1 sec
- *   5  | blink blue on=2.5 sec and red on=0.5 sec
- *   6  | blink blue on=1 sec and red on=1 sec
- *   7  | fix blue on
- */
-
-static int netxbig_v2_red_mled[NETXBIG_LED_MODE_NUM] = {
-       [NETXBIG_LED_OFF]       = 0,
-       [NETXBIG_LED_ON]        = 2,
-       [NETXBIG_LED_SATA]      = NETXBIG_LED_INVALID_MODE,
-       [NETXBIG_LED_TIMER1]    = 4,
-       [NETXBIG_LED_TIMER2]    = NETXBIG_LED_INVALID_MODE,
-};
-
-static int netxbig_v2_blue_pwr_mled[NETXBIG_LED_MODE_NUM] = {
-       [NETXBIG_LED_OFF]       = 0,
-       [NETXBIG_LED_ON]        = 1,
-       [NETXBIG_LED_SATA]      = NETXBIG_LED_INVALID_MODE,
-       [NETXBIG_LED_TIMER1]    = 3,
-       [NETXBIG_LED_TIMER2]    = 7,
-};
-
-static int netxbig_v2_blue_sata_mled[NETXBIG_LED_MODE_NUM] = {
-       [NETXBIG_LED_OFF]       = 0,
-       [NETXBIG_LED_ON]        = 7,
-       [NETXBIG_LED_SATA]      = 1,
-       [NETXBIG_LED_TIMER1]    = 3,
-       [NETXBIG_LED_TIMER2]    = NETXBIG_LED_INVALID_MODE,
-};
-
-static struct netxbig_led_timer netxbig_v2_led_timer[] = {
-       [0] = {
-               .delay_on       = 500,
-               .delay_off      = 500,
-               .mode           = NETXBIG_LED_TIMER1,
-       },
-       [1] = {
-               .delay_on       = 500,
-               .delay_off      = 1000,
-               .mode           = NETXBIG_LED_TIMER2,
-       },
-};
-
-#define NETXBIG_LED(_name, maddr, mval, baddr)                 \
-       { .name         = _name,                                \
-         .mode_addr    = maddr,                                \
-         .mode_val     = mval,                                 \
-         .bright_addr  = baddr }
-
-static struct netxbig_led net2big_v2_leds_ctrl[] = {
-       NETXBIG_LED("net2big-v2:blue:power", 0, netxbig_v2_blue_pwr_mled,  1),
-       NETXBIG_LED("net2big-v2:red:power",  0, netxbig_v2_red_mled,       1),
-       NETXBIG_LED("net2big-v2:blue:sata0", 3, netxbig_v2_blue_sata_mled, 2),
-       NETXBIG_LED("net2big-v2:red:sata0",  3, netxbig_v2_red_mled,       2),
-       NETXBIG_LED("net2big-v2:blue:sata1", 4, netxbig_v2_blue_sata_mled, 2),
-       NETXBIG_LED("net2big-v2:red:sata1",  4, netxbig_v2_red_mled,       2),
-};
-
-static struct netxbig_led_platform_data net2big_v2_leds_data = {
-       .gpio_ext       = &netxbig_v2_gpio_ext,
-       .timer          = netxbig_v2_led_timer,
-       .num_timer      = ARRAY_SIZE(netxbig_v2_led_timer),
-       .leds           = net2big_v2_leds_ctrl,
-       .num_leds       = ARRAY_SIZE(net2big_v2_leds_ctrl),
-};
-
-static struct netxbig_led net5big_v2_leds_ctrl[] = {
-       NETXBIG_LED("net5big-v2:blue:power", 0, netxbig_v2_blue_pwr_mled,  1),
-       NETXBIG_LED("net5big-v2:red:power",  0, netxbig_v2_red_mled,       1),
-       NETXBIG_LED("net5big-v2:blue:sata0", 3, netxbig_v2_blue_sata_mled, 2),
-       NETXBIG_LED("net5big-v2:red:sata0",  3, netxbig_v2_red_mled,       2),
-       NETXBIG_LED("net5big-v2:blue:sata1", 4, netxbig_v2_blue_sata_mled, 2),
-       NETXBIG_LED("net5big-v2:red:sata1",  4, netxbig_v2_red_mled,       2),
-       NETXBIG_LED("net5big-v2:blue:sata2", 5, netxbig_v2_blue_sata_mled, 2),
-       NETXBIG_LED("net5big-v2:red:sata2",  5, netxbig_v2_red_mled,       2),
-       NETXBIG_LED("net5big-v2:blue:sata3", 6, netxbig_v2_blue_sata_mled, 2),
-       NETXBIG_LED("net5big-v2:red:sata3",  6, netxbig_v2_red_mled,       2),
-       NETXBIG_LED("net5big-v2:blue:sata4", 7, netxbig_v2_blue_sata_mled, 2),
-       NETXBIG_LED("net5big-v2:red:sata5",  7, netxbig_v2_red_mled,       2),
-};
-
-static struct netxbig_led_platform_data net5big_v2_leds_data = {
-       .gpio_ext       = &netxbig_v2_gpio_ext,
-       .timer          = netxbig_v2_led_timer,
-       .num_timer      = ARRAY_SIZE(netxbig_v2_led_timer),
-       .leds           = net5big_v2_leds_ctrl,
-       .num_leds       = ARRAY_SIZE(net5big_v2_leds_ctrl),
-};
-
-static struct platform_device netxbig_v2_leds = {
-       .name           = "leds-netxbig",
-       .id             = -1,
-       .dev            = {
-               .platform_data  = &net2big_v2_leds_data,
-       },
-};
-
-/*****************************************************************************
- * General Setup
- ****************************************************************************/
-
-static unsigned int net2big_v2_mpp_config[] __initdata = {
-       MPP0_SPI_SCn,
-       MPP1_SPI_MOSI,
-       MPP2_SPI_SCK,
-       MPP3_SPI_MISO,
-       MPP6_SYSRST_OUTn,
-       MPP7_GPO,               /* Request power-off */
-       MPP8_TW0_SDA,
-       MPP9_TW0_SCK,
-       MPP10_UART0_TXD,
-       MPP11_UART0_RXD,
-       MPP13_GPIO,             /* Rear power switch (on|auto) */
-       MPP14_GPIO,             /* USB fuse alarm */
-       MPP15_GPIO,             /* Rear power switch (auto|off) */
-       MPP16_GPIO,             /* SATA HDD1 power */
-       MPP17_GPIO,             /* SATA HDD2 power */
-       MPP20_SATA1_ACTn,
-       MPP21_SATA0_ACTn,
-       MPP24_GPIO,             /* USB mode select */
-       MPP26_GPIO,             /* USB device vbus */
-       MPP28_GPIO,             /* USB enable host vbus */
-       MPP29_GPIO,             /* GPIO extension ALE */
-       MPP34_GPIO,             /* Rear Push button */
-       MPP35_GPIO,             /* Inhibit switch power-off */
-       MPP36_GPIO,             /* SATA HDD1 presence */
-       MPP37_GPIO,             /* SATA HDD2 presence */
-       MPP40_GPIO,             /* eSATA presence */
-       MPP44_GPIO,             /* GPIO extension (data 0) */
-       MPP45_GPIO,             /* GPIO extension (data 1) */
-       MPP46_GPIO,             /* GPIO extension (data 2) */
-       MPP47_GPIO,             /* GPIO extension (addr 0) */
-       MPP48_GPIO,             /* GPIO extension (addr 1) */
-       MPP49_GPIO,             /* GPIO extension (addr 2) */
-       0
-};
-
-static unsigned int net5big_v2_mpp_config[] __initdata = {
-       MPP0_SPI_SCn,
-       MPP1_SPI_MOSI,
-       MPP2_SPI_SCK,
-       MPP3_SPI_MISO,
-       MPP6_SYSRST_OUTn,
-       MPP7_GPO,               /* Request power-off */
-       MPP8_TW0_SDA,
-       MPP9_TW0_SCK,
-       MPP10_UART0_TXD,
-       MPP11_UART0_RXD,
-       MPP13_GPIO,             /* Rear power switch (on|auto) */
-       MPP14_GPIO,             /* USB fuse alarm */
-       MPP15_GPIO,             /* Rear power switch (auto|off) */
-       MPP16_GPIO,             /* SATA HDD1 power */
-       MPP17_GPIO,             /* SATA HDD2 power */
-       MPP20_GE1_TXD0,
-       MPP21_GE1_TXD1,
-       MPP22_GE1_TXD2,
-       MPP23_GE1_TXD3,
-       MPP24_GE1_RXD0,
-       MPP25_GE1_RXD1,
-       MPP26_GE1_RXD2,
-       MPP27_GE1_RXD3,
-       MPP28_GPIO,             /* USB enable host vbus */
-       MPP29_GPIO,             /* GPIO extension ALE */
-       MPP30_GE1_RXCTL,
-       MPP31_GE1_RXCLK,
-       MPP32_GE1_TCLKOUT,
-       MPP33_GE1_TXCTL,
-       MPP34_GPIO,             /* Rear Push button */
-       MPP35_GPIO,             /* Inhibit switch power-off */
-       MPP36_GPIO,             /* SATA HDD1 presence */
-       MPP37_GPIO,             /* SATA HDD2 presence */
-       MPP38_GPIO,             /* SATA HDD3 presence */
-       MPP39_GPIO,             /* SATA HDD4 presence */
-       MPP40_GPIO,             /* SATA HDD5 presence */
-       MPP41_GPIO,             /* SATA HDD3 power */
-       MPP42_GPIO,             /* SATA HDD4 power */
-       MPP43_GPIO,             /* SATA HDD5 power */
-       MPP44_GPIO,             /* GPIO extension (data 0) */
-       MPP45_GPIO,             /* GPIO extension (data 1) */
-       MPP46_GPIO,             /* GPIO extension (data 2) */
-       MPP47_GPIO,             /* GPIO extension (addr 0) */
-       MPP48_GPIO,             /* GPIO extension (addr 1) */
-       MPP49_GPIO,             /* GPIO extension (addr 2) */
-       0
-};
-
-#define NETXBIG_V2_GPIO_POWER_OFF              7
-
-static void netxbig_v2_power_off(void)
-{
-       gpio_set_value(NETXBIG_V2_GPIO_POWER_OFF, 1);
-}
-
-static void __init netxbig_v2_init(void)
-{
-       /*
-        * Basic setup. Needs to be called early.
-        */
-       kirkwood_init();
-       if (machine_is_net2big_v2())
-               kirkwood_mpp_conf(net2big_v2_mpp_config);
-       else
-               kirkwood_mpp_conf(net5big_v2_mpp_config);
-
-       if (machine_is_net2big_v2())
-               lacie_v2_hdd_power_init(2);
-       else
-               lacie_v2_hdd_power_init(5);
-
-       kirkwood_ehci_init();
-       kirkwood_ge00_init(&netxbig_v2_ge00_data);
-       if (machine_is_net5big_v2())
-               kirkwood_ge01_init(&netxbig_v2_ge01_data);
-       kirkwood_sata_init(&netxbig_v2_sata_data);
-       kirkwood_uart0_init();
-       lacie_v2_register_flash();
-       lacie_v2_register_i2c_devices();
-
-       if (machine_is_net5big_v2())
-               netxbig_v2_leds.dev.platform_data = &net5big_v2_leds_data;
-       platform_device_register(&netxbig_v2_leds);
-       platform_device_register(&netxbig_v2_gpio_buttons);
-
-       if (gpio_request(NETXBIG_V2_GPIO_POWER_OFF, "power-off") == 0 &&
-           gpio_direction_output(NETXBIG_V2_GPIO_POWER_OFF, 0) == 0)
-               pm_power_off = netxbig_v2_power_off;
-       else
-               pr_err("netxbig_v2: failed to configure power-off GPIO\n");
-}
-
-#ifdef CONFIG_MACH_NET2BIG_V2
-MACHINE_START(NET2BIG_V2, "LaCie 2Big Network v2")
-       .atag_offset    = 0x100,
-       .init_machine   = netxbig_v2_init,
-       .map_io         = kirkwood_map_io,
-       .init_early     = kirkwood_init_early,
-       .init_irq       = kirkwood_init_irq,
-       .init_time      = kirkwood_timer_init,
-       .restart        = kirkwood_restart,
-MACHINE_END
-#endif
-
-#ifdef CONFIG_MACH_NET5BIG_V2
-MACHINE_START(NET5BIG_V2, "LaCie 5Big Network v2")
-       .atag_offset    = 0x100,
-       .init_machine   = netxbig_v2_init,
-       .map_io         = kirkwood_map_io,
-       .init_early     = kirkwood_init_early,
-       .init_irq       = kirkwood_init_irq,
-       .init_time      = kirkwood_timer_init,
-       .restart        = kirkwood_restart,
-MACHINE_END
-#endif
diff --git a/arch/arm/mach-kirkwood/openrd-setup.c b/arch/arm/mach-kirkwood/openrd-setup.c
deleted file mode 100644 (file)
index e5cf841..0000000
+++ /dev/null
@@ -1,255 +0,0 @@
-/*
- * arch/arm/mach-kirkwood/openrd-setup.c
- *
- * Marvell OpenRD (Base|Client|Ultimate) Board Setup
- *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
- */
-
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/platform_device.h>
-#include <linux/mtd/nand.h>
-#include <linux/mtd/partitions.h>
-#include <linux/ata_platform.h>
-#include <linux/mv643xx_eth.h>
-#include <linux/i2c.h>
-#include <linux/gpio.h>
-#include <asm/mach-types.h>
-#include <asm/mach/arch.h>
-#include <mach/kirkwood.h>
-#include <linux/platform_data/mmc-mvsdio.h>
-#include "common.h"
-#include "mpp.h"
-
-static struct mtd_partition openrd_nand_parts[] = {
-       {
-               .name           = "u-boot",
-               .offset         = 0,
-               .size           = SZ_1M,
-               .mask_flags     = MTD_WRITEABLE
-       }, {
-               .name           = "uImage",
-               .offset         = MTDPART_OFS_NXTBLK,
-               .size           = SZ_4M
-       }, {
-               .name           = "root",
-               .offset         = MTDPART_OFS_NXTBLK,
-               .size           = MTDPART_SIZ_FULL
-       },
-};
-
-static struct mv643xx_eth_platform_data openrd_ge00_data = {
-       .phy_addr       = MV643XX_ETH_PHY_ADDR(8),
-};
-
-static struct mv643xx_eth_platform_data openrd_ge01_data = {
-       .phy_addr       = MV643XX_ETH_PHY_ADDR(24),
-};
-
-static struct mv_sata_platform_data openrd_sata_data = {
-       .n_ports        = 2,
-};
-
-static struct mvsdio_platform_data openrd_mvsdio_data = {
-       .gpio_card_detect = 29, /* MPP29 used as SD card detect */
-       .gpio_write_protect = -1,
-};
-
-static unsigned int openrd_mpp_config[] __initdata = {
-       MPP12_SD_CLK,
-       MPP13_SD_CMD,
-       MPP14_SD_D0,
-       MPP15_SD_D1,
-       MPP16_SD_D2,
-       MPP17_SD_D3,
-       MPP28_GPIO,
-       MPP29_GPIO,
-       MPP34_GPIO,
-       0
-};
-
-/* Configure MPP for UART1 */
-static unsigned int openrd_uart1_mpp_config[] __initdata = {
-       MPP13_UART1_TXD,
-       MPP14_UART1_RXD,
-       0
-};
-
-static struct i2c_board_info i2c_board_info[] __initdata = {
-       {
-               I2C_BOARD_INFO("cs42l51", 0x4a),
-       },
-};
-
-static struct platform_device openrd_client_audio_device = {
-       .name           = "openrd-client-audio",
-       .id             = -1,
-};
-
-static int __initdata uart1;
-
-static int __init sd_uart_selection(char *str)
-{
-       uart1 = -EINVAL;
-
-       /* Default is SD. Change if required, for UART */
-       if (!str)
-               return 0;
-
-       if (!strncmp(str, "232", 3)) {
-               uart1 = 232;
-       } else if (!strncmp(str, "485", 3)) {
-               /* OpenRD-Base doesn't have RS485. Treat is as an
-                * unknown argument & just have default setting -
-                * which is SD */
-               if (machine_is_openrd_base()) {
-                       uart1 = -ENODEV;
-                       return 1;
-               }
-
-               uart1 = 485;
-       }
-       return 1;
-}
-/* Parse boot_command_line string kw_openrd_init_uart1=232/485 */
-__setup("kw_openrd_init_uart1=", sd_uart_selection);
-
-static int __init uart1_mpp_config(void)
-{
-       kirkwood_mpp_conf(openrd_uart1_mpp_config);
-
-       if (gpio_request(34, "SD_UART1_SEL")) {
-               pr_err("GPIO request 34 failed for SD/UART1 selection\n");
-               return -EIO;
-       }
-
-       if (gpio_request(28, "RS232_RS485_SEL")) {
-               pr_err("GPIO request 28 failed for RS232/RS485 selection\n");
-               gpio_free(34);
-               return -EIO;
-       }
-
-       /* Select UART1
-        * Pin # 34: 0 => UART1, 1 => SD */
-       gpio_direction_output(34, 0);
-
-       /* Select RS232 OR RS485
-        * Pin # 28: 0 => RS232, 1 => RS485 */
-       if (uart1 == 232)
-               gpio_direction_output(28, 0);
-       else
-               gpio_direction_output(28, 1);
-
-       gpio_free(34);
-       gpio_free(28);
-
-       return 0;
-}
-
-static void __init openrd_init(void)
-{
-       /*
-        * Basic setup. Needs to be called early.
-        */
-       kirkwood_init();
-       kirkwood_mpp_conf(openrd_mpp_config);
-
-       kirkwood_uart0_init();
-       kirkwood_nand_init(openrd_nand_parts, ARRAY_SIZE(openrd_nand_parts),
-                          25);
-
-       kirkwood_ehci_init();
-
-       if (machine_is_openrd_ultimate()) {
-               openrd_ge00_data.phy_addr = MV643XX_ETH_PHY_ADDR(0);
-               openrd_ge01_data.phy_addr = MV643XX_ETH_PHY_ADDR(1);
-       }
-
-       kirkwood_ge00_init(&openrd_ge00_data);
-       if (!machine_is_openrd_base())
-               kirkwood_ge01_init(&openrd_ge01_data);
-
-       kirkwood_sata_init(&openrd_sata_data);
-
-       kirkwood_i2c_init();
-
-       if (machine_is_openrd_client() || machine_is_openrd_ultimate()) {
-               platform_device_register(&openrd_client_audio_device);
-               i2c_register_board_info(0, i2c_board_info,
-                       ARRAY_SIZE(i2c_board_info));
-               kirkwood_audio_init();
-       }
-
-       if (uart1 <= 0) {
-               if (uart1 < 0)
-                       pr_err("Invalid kernel parameter to select UART1. Defaulting to SD. ERROR CODE: %d\n",
-                              uart1);
-
-               /* Select SD
-                * Pin # 34: 0 => UART1, 1 => SD */
-               if (gpio_request(34, "SD_UART1_SEL")) {
-                       pr_err("GPIO request 34 failed for SD/UART1 selection\n");
-               } else {
-
-                       gpio_direction_output(34, 1);
-                       gpio_free(34);
-                       kirkwood_sdio_init(&openrd_mvsdio_data);
-               }
-       } else {
-               if (!uart1_mpp_config())
-                       kirkwood_uart1_init();
-       }
-}
-
-static int __init openrd_pci_init(void)
-{
-       if (machine_is_openrd_base() ||
-           machine_is_openrd_client() ||
-           machine_is_openrd_ultimate())
-               kirkwood_pcie_init(KW_PCIE0);
-
-       return 0;
-}
-subsys_initcall(openrd_pci_init);
-
-#ifdef CONFIG_MACH_OPENRD_BASE
-MACHINE_START(OPENRD_BASE, "Marvell OpenRD Base Board")
-       /* Maintainer: Dhaval Vasa <dhaval.vasa@einfochips.com> */
-       .atag_offset    = 0x100,
-       .init_machine   = openrd_init,
-       .map_io         = kirkwood_map_io,
-       .init_early     = kirkwood_init_early,
-       .init_irq       = kirkwood_init_irq,
-       .init_time      = kirkwood_timer_init,
-       .restart        = kirkwood_restart,
-MACHINE_END
-#endif
-
-#ifdef CONFIG_MACH_OPENRD_CLIENT
-MACHINE_START(OPENRD_CLIENT, "Marvell OpenRD Client Board")
-       /* Maintainer: Dhaval Vasa <dhaval.vasa@einfochips.com> */
-       .atag_offset    = 0x100,
-       .init_machine   = openrd_init,
-       .map_io         = kirkwood_map_io,
-       .init_early     = kirkwood_init_early,
-       .init_irq       = kirkwood_init_irq,
-       .init_time      = kirkwood_timer_init,
-       .restart        = kirkwood_restart,
-MACHINE_END
-#endif
-
-#ifdef CONFIG_MACH_OPENRD_ULTIMATE
-MACHINE_START(OPENRD_ULTIMATE, "Marvell OpenRD Ultimate Board")
-       /* Maintainer: Dhaval Vasa <dhaval.vasa@einfochips.com> */
-       .atag_offset    = 0x100,
-       .init_machine   = openrd_init,
-       .map_io         = kirkwood_map_io,
-       .init_early     = kirkwood_init_early,
-       .init_irq       = kirkwood_init_irq,
-       .init_time      = kirkwood_timer_init,
-       .restart        = kirkwood_restart,
-MACHINE_END
-#endif
diff --git a/arch/arm/mach-kirkwood/pcie.c b/arch/arm/mach-kirkwood/pcie.c
deleted file mode 100644 (file)
index 12d86f3..0000000
+++ /dev/null
@@ -1,296 +0,0 @@
-/*
- * arch/arm/mach-kirkwood/pcie.c
- *
- * PCIe functions for Marvell Kirkwood SoCs
- *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
- */
-
-#include <linux/kernel.h>
-#include <linux/pci.h>
-#include <linux/slab.h>
-#include <linux/clk.h>
-#include <linux/mbus.h>
-#include <video/vga.h>
-#include <asm/irq.h>
-#include <asm/mach/pci.h>
-#include <plat/pcie.h>
-#include <mach/bridge-regs.h>
-#include "common.h"
-
-/* These can go away once Kirkwood uses the mvebu-mbus DT binding */
-#define KIRKWOOD_MBUS_PCIE0_MEM_TARGET    0x4
-#define KIRKWOOD_MBUS_PCIE0_MEM_ATTR      0xe8
-#define KIRKWOOD_MBUS_PCIE0_IO_TARGET     0x4
-#define KIRKWOOD_MBUS_PCIE0_IO_ATTR       0xe0
-#define KIRKWOOD_MBUS_PCIE1_MEM_TARGET    0x4
-#define KIRKWOOD_MBUS_PCIE1_MEM_ATTR      0xd8
-#define KIRKWOOD_MBUS_PCIE1_IO_TARGET     0x4
-#define KIRKWOOD_MBUS_PCIE1_IO_ATTR       0xd0
-
-static void kirkwood_enable_pcie_clk(const char *port)
-{
-       struct clk *clk;
-
-       clk = clk_get_sys("pcie", port);
-       if (IS_ERR(clk)) {
-               pr_err("PCIE clock %s missing\n", port);
-               return;
-       }
-       clk_prepare_enable(clk);
-       clk_put(clk);
-}
-
-/* This function is called very early in the boot when probing the
-   hardware to determine what we actually are, and what rate tclk is
-   ticking at. Hence calling kirkwood_enable_pcie_clk() is not
-   possible since the clk tree has not been created yet. */
-void kirkwood_enable_pcie(void)
-{
-       u32 curr = readl(CLOCK_GATING_CTRL);
-       if (!(curr & CGC_PEX0))
-               writel(curr | CGC_PEX0, CLOCK_GATING_CTRL);
-}
-
-void kirkwood_pcie_id(u32 *dev, u32 *rev)
-{
-       kirkwood_enable_pcie();
-       *dev = orion_pcie_dev_id(PCIE_VIRT_BASE);
-       *rev = orion_pcie_rev(PCIE_VIRT_BASE);
-}
-
-struct pcie_port {
-       u8                      root_bus_nr;
-       void __iomem            *base;
-       spinlock_t              conf_lock;
-       int                     irq;
-       struct resource         res;
-};
-
-static int pcie_port_map[2];
-static int num_pcie_ports;
-
-static int pcie_valid_config(struct pcie_port *pp, int bus, int dev)
-{
-       /*
-        * Don't go out when trying to access --
-        * 1. nonexisting device on local bus
-        * 2. where there's no device connected (no link)
-        */
-       if (bus == pp->root_bus_nr && dev == 0)
-               return 1;
-
-       if (!orion_pcie_link_up(pp->base))
-               return 0;
-
-       if (bus == pp->root_bus_nr && dev != 1)
-               return 0;
-
-       return 1;
-}
-
-
-/*
- * PCIe config cycles are done by programming the PCIE_CONF_ADDR register
- * and then reading the PCIE_CONF_DATA register. Need to make sure these
- * transactions are atomic.
- */
-
-static int pcie_rd_conf(struct pci_bus *bus, u32 devfn, int where,
-                       int size, u32 *val)
-{
-       struct pci_sys_data *sys = bus->sysdata;
-       struct pcie_port *pp = sys->private_data;
-       unsigned long flags;
-       int ret;
-
-       if (pcie_valid_config(pp, bus->number, PCI_SLOT(devfn)) == 0) {
-               *val = 0xffffffff;
-               return PCIBIOS_DEVICE_NOT_FOUND;
-       }
-
-       spin_lock_irqsave(&pp->conf_lock, flags);
-       ret = orion_pcie_rd_conf(pp->base, bus, devfn, where, size, val);
-       spin_unlock_irqrestore(&pp->conf_lock, flags);
-
-       return ret;
-}
-
-static int pcie_wr_conf(struct pci_bus *bus, u32 devfn,
-                       int where, int size, u32 val)
-{
-       struct pci_sys_data *sys = bus->sysdata;
-       struct pcie_port *pp = sys->private_data;
-       unsigned long flags;
-       int ret;
-
-       if (pcie_valid_config(pp, bus->number, PCI_SLOT(devfn)) == 0)
-               return PCIBIOS_DEVICE_NOT_FOUND;
-
-       spin_lock_irqsave(&pp->conf_lock, flags);
-       ret = orion_pcie_wr_conf(pp->base, bus, devfn, where, size, val);
-       spin_unlock_irqrestore(&pp->conf_lock, flags);
-
-       return ret;
-}
-
-static struct pci_ops pcie_ops = {
-       .read = pcie_rd_conf,
-       .write = pcie_wr_conf,
-};
-
-static void __init pcie0_ioresources_init(struct pcie_port *pp)
-{
-       pp->base = PCIE_VIRT_BASE;
-       pp->irq = IRQ_KIRKWOOD_PCIE;
-
-       /*
-        * IORESOURCE_MEM
-        */
-       pp->res.name = "PCIe 0 MEM";
-       pp->res.start = KIRKWOOD_PCIE_MEM_PHYS_BASE;
-       pp->res.end = pp->res.start + KIRKWOOD_PCIE_MEM_SIZE - 1;
-       pp->res.flags = IORESOURCE_MEM;
-}
-
-static void __init pcie1_ioresources_init(struct pcie_port *pp)
-{
-       pp->base = PCIE1_VIRT_BASE;
-       pp->irq = IRQ_KIRKWOOD_PCIE1;
-
-       /*
-        * IORESOURCE_MEM
-        */
-       pp->res.name = "PCIe 1 MEM";
-       pp->res.start = KIRKWOOD_PCIE1_MEM_PHYS_BASE;
-       pp->res.end = pp->res.start + KIRKWOOD_PCIE1_MEM_SIZE - 1;
-       pp->res.flags = IORESOURCE_MEM;
-}
-
-static int __init kirkwood_pcie_setup(int nr, struct pci_sys_data *sys)
-{
-       struct pcie_port *pp;
-       int index;
-
-       if (nr >= num_pcie_ports)
-               return 0;
-
-       index = pcie_port_map[nr];
-       pr_info("PCI: bus%d uses PCIe port %d\n", sys->busnr, index);
-
-       pp = kzalloc(sizeof(*pp), GFP_KERNEL);
-       if (!pp)
-               panic("PCIe: failed to allocate pcie_port data");
-       sys->private_data = pp;
-       pp->root_bus_nr = sys->busnr;
-       spin_lock_init(&pp->conf_lock);
-
-       switch (index) {
-       case 0:
-               kirkwood_enable_pcie_clk("0");
-               pcie0_ioresources_init(pp);
-               pci_ioremap_io(SZ_64K * sys->busnr, KIRKWOOD_PCIE_IO_PHYS_BASE);
-               break;
-       case 1:
-               kirkwood_enable_pcie_clk("1");
-               pcie1_ioresources_init(pp);
-               pci_ioremap_io(SZ_64K * sys->busnr,
-                              KIRKWOOD_PCIE1_IO_PHYS_BASE);
-               break;
-       default:
-               panic("PCIe setup: invalid controller %d", index);
-       }
-
-       if (request_resource(&iomem_resource, &pp->res))
-               panic("Request PCIe%d Memory resource failed\n", index);
-
-       pci_add_resource_offset(&sys->resources, &pp->res, sys->mem_offset);
-
-       /*
-        * Generic PCIe unit setup.
-        */
-       orion_pcie_set_local_bus_nr(pp->base, sys->busnr);
-
-       orion_pcie_setup(pp->base);
-
-       return 1;
-}
-
-/*
- * The root complex has a hardwired class of PCI_CLASS_MEMORY_OTHER, when it
- * is operating as a root complex this needs to be switched to
- * PCI_CLASS_BRIDGE_HOST or Linux will errantly try to process the BAR's on
- * the device. Decoding setup is handled by the orion code.
- */
-static void rc_pci_fixup(struct pci_dev *dev)
-{
-       if (dev->bus->parent == NULL && dev->devfn == 0) {
-               int i;
-
-               dev->class &= 0xff;
-               dev->class |= PCI_CLASS_BRIDGE_HOST << 8;
-               for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
-                       dev->resource[i].start = 0;
-                       dev->resource[i].end   = 0;
-                       dev->resource[i].flags = 0;
-               }
-       }
-}
-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL, PCI_ANY_ID, rc_pci_fixup);
-
-static int __init kirkwood_pcie_map_irq(const struct pci_dev *dev, u8 slot,
-       u8 pin)
-{
-       struct pci_sys_data *sys = dev->sysdata;
-       struct pcie_port *pp = sys->private_data;
-
-       return pp->irq;
-}
-
-static struct hw_pci kirkwood_pci __initdata = {
-       .setup          = kirkwood_pcie_setup,
-       .map_irq        = kirkwood_pcie_map_irq,
-       .ops            = &pcie_ops,
-};
-
-static void __init add_pcie_port(int index, void __iomem *base)
-{
-       pcie_port_map[num_pcie_ports++] = index;
-       pr_info("Kirkwood PCIe port %d: link %s\n", index,
-               orion_pcie_link_up(base) ? "up" : "down");
-}
-
-void __init kirkwood_pcie_init(unsigned int portmask)
-{
-       mvebu_mbus_add_window_remap_by_id(KIRKWOOD_MBUS_PCIE0_IO_TARGET,
-                                         KIRKWOOD_MBUS_PCIE0_IO_ATTR,
-                                         KIRKWOOD_PCIE_IO_PHYS_BASE,
-                                         KIRKWOOD_PCIE_IO_SIZE,
-                                         KIRKWOOD_PCIE_IO_BUS_BASE);
-       mvebu_mbus_add_window_by_id(KIRKWOOD_MBUS_PCIE0_MEM_TARGET,
-                                   KIRKWOOD_MBUS_PCIE0_MEM_ATTR,
-                                   KIRKWOOD_PCIE_MEM_PHYS_BASE,
-                                   KIRKWOOD_PCIE_MEM_SIZE);
-       mvebu_mbus_add_window_remap_by_id(KIRKWOOD_MBUS_PCIE1_IO_TARGET,
-                                         KIRKWOOD_MBUS_PCIE1_IO_ATTR,
-                                         KIRKWOOD_PCIE1_IO_PHYS_BASE,
-                                         KIRKWOOD_PCIE1_IO_SIZE,
-                                         KIRKWOOD_PCIE1_IO_BUS_BASE);
-       mvebu_mbus_add_window_by_id(KIRKWOOD_MBUS_PCIE1_MEM_TARGET,
-                                   KIRKWOOD_MBUS_PCIE1_MEM_ATTR,
-                                   KIRKWOOD_PCIE1_MEM_PHYS_BASE,
-                                   KIRKWOOD_PCIE1_MEM_SIZE);
-
-       vga_base = KIRKWOOD_PCIE_MEM_PHYS_BASE;
-
-       if (portmask & KW_PCIE0)
-               add_pcie_port(0, PCIE_VIRT_BASE);
-
-       if (portmask & KW_PCIE1)
-               add_pcie_port(1, PCIE1_VIRT_BASE);
-
-       kirkwood_pci.nr_controllers = num_pcie_ports;
-       pci_common_init(&kirkwood_pci);
-}
diff --git a/arch/arm/mach-kirkwood/pm.c b/arch/arm/mach-kirkwood/pm.c
deleted file mode 100644 (file)
index 8e5e032..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Power Management driver for Marvell Kirkwood SoCs
- *
- * Copyright (C) 2013 Ezequiel Garcia <ezequiel@free-electrons.com>
- * Copyright (C) 2010 Simon Guinot <sguinot@lacie.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License,
- * version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- */
-
-#include <linux/kernel.h>
-#include <linux/suspend.h>
-#include <linux/io.h>
-#include <mach/bridge-regs.h>
-#include "common.h"
-
-static void __iomem *ddr_operation_base;
-static void __iomem *memory_pm_ctrl;
-
-static void kirkwood_low_power(void)
-{
-       u32 mem_pm_ctrl;
-
-       mem_pm_ctrl = readl(memory_pm_ctrl);
-
-       /* Set peripherals to low-power mode */
-       writel_relaxed(~0, memory_pm_ctrl);
-
-       /* Set DDR in self-refresh */
-       writel_relaxed(0x7, ddr_operation_base);
-
-       /*
-        * Set CPU in wait-for-interrupt state.
-        * This disables the CPU core clocks,
-        * the array clocks, and also the L2 controller.
-        */
-       cpu_do_idle();
-
-       writel_relaxed(mem_pm_ctrl, memory_pm_ctrl);
-}
-
-static int kirkwood_suspend_enter(suspend_state_t state)
-{
-       switch (state) {
-       case PM_SUSPEND_STANDBY:
-               kirkwood_low_power();
-               break;
-       default:
-               return -EINVAL;
-       }
-       return 0;
-}
-
-static int kirkwood_pm_valid_standby(suspend_state_t state)
-{
-       return state == PM_SUSPEND_STANDBY;
-}
-
-static const struct platform_suspend_ops kirkwood_suspend_ops = {
-       .enter = kirkwood_suspend_enter,
-       .valid = kirkwood_pm_valid_standby,
-};
-
-void __init kirkwood_pm_init(void)
-{
-       ddr_operation_base = ioremap(DDR_OPERATION_BASE, 4);
-       memory_pm_ctrl = ioremap(MEMORY_PM_CTRL_PHYS, 4);
-
-       suspend_set_ops(&kirkwood_suspend_ops);
-}
diff --git a/arch/arm/mach-kirkwood/pm.h b/arch/arm/mach-kirkwood/pm.h
deleted file mode 100644 (file)
index 21e7530..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Power Management driver for Marvell Kirkwood SoCs
- *
- * Copyright (C) 2013 Ezequiel Garcia <ezequiel@free-electrons.com>
- * Copyright (C) 2010 Simon Guinot <sguinot@lacie.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License,
- * version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- */
-
-#ifndef __ARCH_KIRKWOOD_PM_H
-#define __ARCH_KIRKWOOD_PM_H
-
-#ifdef CONFIG_PM
-void kirkwood_pm_init(void);
-#else
-static inline void kirkwood_pm_init(void) {};
-#endif
-
-#endif
diff --git a/arch/arm/mach-kirkwood/rd88f6192-nas-setup.c b/arch/arm/mach-kirkwood/rd88f6192-nas-setup.c
deleted file mode 100644 (file)
index e4fd312..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * arch/arm/mach-kirkwood/rd88f6192-nas-setup.c
- *
- * Marvell RD-88F6192-NAS Reference Board Setup
- *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
- */
-
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/platform_device.h>
-#include <linux/ata_platform.h>
-#include <linux/mv643xx_eth.h>
-#include <linux/gpio.h>
-#include <linux/spi/flash.h>
-#include <linux/spi/spi.h>
-#include <asm/mach-types.h>
-#include <asm/mach/arch.h>
-#include <mach/kirkwood.h>
-#include <plat/orion-gpio.h>
-#include "common.h"
-
-#define RD88F6192_GPIO_USB_VBUS                10
-
-static struct mv643xx_eth_platform_data rd88f6192_ge00_data = {
-       .phy_addr       = MV643XX_ETH_PHY_ADDR(8),
-};
-
-static struct mv_sata_platform_data rd88f6192_sata_data = {
-       .n_ports        = 2,
-};
-
-static const struct flash_platform_data rd88F6192_spi_slave_data = {
-       .type           = "m25p128",
-};
-
-static struct spi_board_info __initdata rd88F6192_spi_slave_info[] = {
-       {
-               .modalias       = "m25p80",
-               .platform_data  = &rd88F6192_spi_slave_data,
-               .irq            = -1,
-               .max_speed_hz   = 20000000,
-               .bus_num        = 0,
-               .chip_select    = 0,
-       },
-};
-
-static void __init rd88f6192_init(void)
-{
-       /*
-        * Basic setup. Needs to be called early.
-        */
-       kirkwood_init();
-
-       orion_gpio_set_valid(RD88F6192_GPIO_USB_VBUS, 1);
-       if (gpio_request(RD88F6192_GPIO_USB_VBUS, "USB VBUS") != 0 ||
-           gpio_direction_output(RD88F6192_GPIO_USB_VBUS, 1) != 0)
-               pr_err("RD-88F6192-NAS: failed to setup USB VBUS GPIO\n");
-
-       kirkwood_ehci_init();
-       kirkwood_ge00_init(&rd88f6192_ge00_data);
-       kirkwood_sata_init(&rd88f6192_sata_data);
-       spi_register_board_info(rd88F6192_spi_slave_info,
-                               ARRAY_SIZE(rd88F6192_spi_slave_info));
-       kirkwood_spi_init();
-       kirkwood_uart0_init();
-}
-
-static int __init rd88f6192_pci_init(void)
-{
-       if (machine_is_rd88f6192_nas())
-               kirkwood_pcie_init(KW_PCIE0);
-
-       return 0;
-}
-subsys_initcall(rd88f6192_pci_init);
-
-MACHINE_START(RD88F6192_NAS, "Marvell RD-88F6192-NAS Development Board")
-       /* Maintainer: Saeed Bishara <saeed@marvell.com> */
-       .atag_offset    = 0x100,
-       .init_machine   = rd88f6192_init,
-       .map_io         = kirkwood_map_io,
-       .init_early     = kirkwood_init_early,
-       .init_irq       = kirkwood_init_irq,
-       .init_time      = kirkwood_timer_init,
-       .restart        = kirkwood_restart,
-MACHINE_END
diff --git a/arch/arm/mach-kirkwood/rd88f6281-setup.c b/arch/arm/mach-kirkwood/rd88f6281-setup.c
deleted file mode 100644 (file)
index 5154bd2..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * arch/arm/mach-kirkwood/rd88f6281-setup.c
- *
- * Marvell RD-88F6281 Reference Board Setup
- *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
- */
-
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/platform_device.h>
-#include <linux/irq.h>
-#include <linux/mtd/partitions.h>
-#include <linux/ata_platform.h>
-#include <linux/mv643xx_eth.h>
-#include <linux/ethtool.h>
-#include <net/dsa.h>
-#include <asm/mach-types.h>
-#include <asm/mach/arch.h>
-#include <mach/kirkwood.h>
-#include <linux/platform_data/mmc-mvsdio.h>
-#include "common.h"
-#include "mpp.h"
-
-static struct mtd_partition rd88f6281_nand_parts[] = {
-       {
-               .name = "u-boot",
-               .offset = 0,
-               .size = SZ_1M
-       }, {
-               .name = "uImage",
-               .offset = MTDPART_OFS_NXTBLK,
-               .size = SZ_2M
-       }, {
-               .name = "root",
-               .offset = MTDPART_OFS_NXTBLK,
-               .size = MTDPART_SIZ_FULL
-       },
-};
-
-static struct mv643xx_eth_platform_data rd88f6281_ge00_data = {
-       .phy_addr       = MV643XX_ETH_PHY_NONE,
-       .speed          = SPEED_1000,
-       .duplex         = DUPLEX_FULL,
-};
-
-static struct dsa_chip_data rd88f6281_switch_chip_data = {
-       .port_names[0]  = "lan1",
-       .port_names[1]  = "lan2",
-       .port_names[2]  = "lan3",
-       .port_names[3]  = "lan4",
-       .port_names[5]  = "cpu",
-};
-
-static struct dsa_platform_data rd88f6281_switch_plat_data = {
-       .nr_chips       = 1,
-       .chip           = &rd88f6281_switch_chip_data,
-};
-
-static struct mv643xx_eth_platform_data rd88f6281_ge01_data = {
-       .phy_addr       = MV643XX_ETH_PHY_ADDR(11),
-};
-
-static struct mv_sata_platform_data rd88f6281_sata_data = {
-       .n_ports        = 2,
-};
-
-static struct mvsdio_platform_data rd88f6281_mvsdio_data = {
-       .gpio_card_detect = 28,
-       .gpio_write_protect = -1,
-};
-
-static unsigned int rd88f6281_mpp_config[] __initdata = {
-       MPP28_GPIO,
-       0
-};
-
-static void __init rd88f6281_init(void)
-{
-       u32 dev, rev;
-
-       /*
-        * Basic setup. Needs to be called early.
-        */
-       kirkwood_init();
-       kirkwood_mpp_conf(rd88f6281_mpp_config);
-
-       kirkwood_nand_init(rd88f6281_nand_parts,
-                          ARRAY_SIZE(rd88f6281_nand_parts),
-                          25);
-       kirkwood_ehci_init();
-
-       kirkwood_ge00_init(&rd88f6281_ge00_data);
-       kirkwood_pcie_id(&dev, &rev);
-       if (rev == MV88F6281_REV_A0) {
-               rd88f6281_switch_chip_data.sw_addr = 10;
-               kirkwood_ge01_init(&rd88f6281_ge01_data);
-       } else {
-               rd88f6281_switch_chip_data.port_names[4] = "wan";
-       }
-       kirkwood_ge00_switch_init(&rd88f6281_switch_plat_data, NO_IRQ);
-
-       kirkwood_sata_init(&rd88f6281_sata_data);
-       kirkwood_sdio_init(&rd88f6281_mvsdio_data);
-       kirkwood_uart0_init();
-}
-
-static int __init rd88f6281_pci_init(void)
-{
-       if (machine_is_rd88f6281())
-               kirkwood_pcie_init(KW_PCIE0);
-
-       return 0;
-}
-subsys_initcall(rd88f6281_pci_init);
-
-MACHINE_START(RD88F6281, "Marvell RD-88F6281 Reference Board")
-       /* Maintainer: Saeed Bishara <saeed@marvell.com> */
-       .atag_offset    = 0x100,
-       .init_machine   = rd88f6281_init,
-       .map_io         = kirkwood_map_io,
-       .init_early     = kirkwood_init_early,
-       .init_irq       = kirkwood_init_irq,
-       .init_time      = kirkwood_timer_init,
-       .restart        = kirkwood_restart,
-MACHINE_END
diff --git a/arch/arm/mach-kirkwood/t5325-setup.c b/arch/arm/mach-kirkwood/t5325-setup.c
deleted file mode 100644 (file)
index 8736f8c..0000000
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- *
- * HP t5325 Thin Client setup
- *
- * Copyright (C) 2010  Martin Michlmayr <tbm@cyrius.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
- */
-
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/platform_device.h>
-#include <linux/mtd/physmap.h>
-#include <linux/spi/flash.h>
-#include <linux/spi/spi.h>
-#include <linux/i2c.h>
-#include <linux/mv643xx_eth.h>
-#include <linux/ata_platform.h>
-#include <linux/gpio.h>
-#include <linux/gpio_keys.h>
-#include <linux/input.h>
-#include <sound/alc5623.h>
-#include <asm/mach-types.h>
-#include <asm/mach/arch.h>
-#include <mach/kirkwood.h>
-#include "common.h"
-#include "mpp.h"
-
-static struct mtd_partition hp_t5325_partitions[] = {
-       {
-               .name           = "u-boot env",
-               .size           = SZ_64K,
-               .offset         = SZ_512K + SZ_256K,
-       },
-       {
-               .name           = "permanent u-boot env",
-               .size           = SZ_64K,
-               .offset         = MTDPART_OFS_APPEND,
-               .mask_flags     = MTD_WRITEABLE,
-       },
-       {
-               .name           = "HP env",
-               .size           = SZ_64K,
-               .offset         = MTDPART_OFS_APPEND,
-       },
-       {
-               .name           = "u-boot",
-               .size           = SZ_512K,
-               .offset         = 0,
-               .mask_flags     = MTD_WRITEABLE,
-       },
-       {
-               .name           = "SSD firmware",
-               .size           = SZ_256K,
-               .offset         = SZ_512K,
-       },
-};
-
-static const struct flash_platform_data hp_t5325_flash = {
-       .type           = "mx25l8005",
-       .name           = "spi_flash",
-       .parts          = hp_t5325_partitions,
-       .nr_parts       = ARRAY_SIZE(hp_t5325_partitions),
-};
-
-static struct spi_board_info __initdata hp_t5325_spi_slave_info[] = {
-       {
-               .modalias       = "m25p80",
-               .platform_data  = &hp_t5325_flash,
-               .irq            = -1,
-       },
-};
-
-static struct mv643xx_eth_platform_data hp_t5325_ge00_data = {
-       .phy_addr       = MV643XX_ETH_PHY_ADDR(8),
-};
-
-static struct mv_sata_platform_data hp_t5325_sata_data = {
-       .n_ports        = 2,
-};
-
-static struct gpio_keys_button hp_t5325_buttons[] = {
-       {
-               .code           = KEY_POWER,
-               .gpio           = 45,
-               .desc           = "Power",
-               .active_low     = 1,
-       },
-};
-
-static struct gpio_keys_platform_data hp_t5325_button_data = {
-       .buttons        = hp_t5325_buttons,
-       .nbuttons       = ARRAY_SIZE(hp_t5325_buttons),
-};
-
-static struct platform_device hp_t5325_button_device = {
-       .name           = "gpio-keys",
-       .id             = -1,
-       .num_resources  = 0,
-       .dev            = {
-               .platform_data  = &hp_t5325_button_data,
-       }
-};
-
-static struct platform_device hp_t5325_audio_device = {
-       .name           = "t5325-audio",
-       .id             = -1,
-};
-
-static unsigned int hp_t5325_mpp_config[] __initdata = {
-       MPP0_NF_IO2,
-       MPP1_SPI_MOSI,
-       MPP2_SPI_SCK,
-       MPP3_SPI_MISO,
-       MPP4_NF_IO6,
-       MPP5_NF_IO7,
-       MPP6_SYSRST_OUTn,
-       MPP7_SPI_SCn,
-       MPP8_TW0_SDA,
-       MPP9_TW0_SCK,
-       MPP10_UART0_TXD,
-       MPP11_UART0_RXD,
-       MPP12_SD_CLK,
-       MPP13_GPIO,
-       MPP14_GPIO,
-       MPP15_GPIO,
-       MPP16_GPIO,
-       MPP17_GPIO,
-       MPP18_NF_IO0,
-       MPP19_NF_IO1,
-       MPP20_GPIO,
-       MPP21_GPIO,
-       MPP22_GPIO,
-       MPP23_GPIO,
-       MPP32_GPIO,
-       MPP33_GE1_TXCTL,
-       MPP39_AU_I2SBCLK,
-       MPP40_AU_I2SDO,
-       MPP43_AU_I2SDI,
-       MPP41_AU_I2SLRCLK,
-       MPP42_AU_I2SMCLK,
-       MPP45_GPIO,             /* Power button */
-       MPP48_GPIO,             /* Board power off */
-       0
-};
-
-static struct alc5623_platform_data alc5621_data = {
-       .add_ctrl = 0x3700,
-       .jack_det_ctrl = 0x4810,
-};
-
-static struct i2c_board_info i2c_board_info[] __initdata = {
-       {
-               I2C_BOARD_INFO("alc5621", 0x1a),
-               .platform_data = &alc5621_data,
-       },
-};
-
-#define HP_T5325_GPIO_POWER_OFF                48
-
-static void hp_t5325_power_off(void)
-{
-       gpio_set_value(HP_T5325_GPIO_POWER_OFF, 1);
-}
-
-static void __init hp_t5325_init(void)
-{
-       /*
-        * Basic setup. Needs to be called early.
-        */
-       kirkwood_init();
-       kirkwood_mpp_conf(hp_t5325_mpp_config);
-
-       kirkwood_uart0_init();
-       spi_register_board_info(hp_t5325_spi_slave_info,
-                               ARRAY_SIZE(hp_t5325_spi_slave_info));
-       kirkwood_spi_init();
-       kirkwood_i2c_init();
-       kirkwood_ge00_init(&hp_t5325_ge00_data);
-       kirkwood_sata_init(&hp_t5325_sata_data);
-       kirkwood_ehci_init();
-       platform_device_register(&hp_t5325_button_device);
-       platform_device_register(&hp_t5325_audio_device);
-
-       i2c_register_board_info(0, i2c_board_info, ARRAY_SIZE(i2c_board_info));
-       kirkwood_audio_init();
-
-       if (gpio_request(HP_T5325_GPIO_POWER_OFF, "power-off") == 0 &&
-           gpio_direction_output(HP_T5325_GPIO_POWER_OFF, 0) == 0)
-               pm_power_off = hp_t5325_power_off;
-       else
-               pr_err("t5325: failed to configure power-off GPIO\n");
-}
-
-static int __init hp_t5325_pci_init(void)
-{
-       if (machine_is_t5325())
-               kirkwood_pcie_init(KW_PCIE0);
-
-       return 0;
-}
-subsys_initcall(hp_t5325_pci_init);
-
-MACHINE_START(T5325, "HP t5325 Thin Client")
-       /* Maintainer: Martin Michlmayr <tbm@cyrius.com> */
-       .atag_offset    = 0x100,
-       .init_machine   = hp_t5325_init,
-       .map_io         = kirkwood_map_io,
-       .init_early     = kirkwood_init_early,
-       .init_irq       = kirkwood_init_irq,
-       .init_time      = kirkwood_timer_init,
-       .restart        = kirkwood_restart,
-MACHINE_END
diff --git a/arch/arm/mach-kirkwood/ts219-setup.c b/arch/arm/mach-kirkwood/ts219-setup.c
deleted file mode 100644 (file)
index e1267d6..0000000
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- *
- * QNAP TS-11x/TS-21x Turbo NAS Board Setup
- *
- * Copyright (C) 2009  Martin Michlmayr <tbm@cyrius.com>
- * Copyright (C) 2008  Byron Bradley <byron.bbradley@gmail.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
- */
-
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/platform_device.h>
-#include <linux/i2c.h>
-#include <linux/mv643xx_eth.h>
-#include <linux/ata_platform.h>
-#include <linux/gpio_keys.h>
-#include <linux/input.h>
-#include <asm/mach-types.h>
-#include <asm/mach/arch.h>
-#include <mach/kirkwood.h>
-#include "common.h"
-#include "mpp.h"
-#include "tsx1x-common.h"
-
-static struct i2c_board_info __initdata qnap_ts219_i2c_rtc = {
-       I2C_BOARD_INFO("s35390a", 0x30),
-};
-
-static struct mv643xx_eth_platform_data qnap_ts219_ge00_data = {
-       .phy_addr       = MV643XX_ETH_PHY_ADDR(8),
-};
-
-static struct mv_sata_platform_data qnap_ts219_sata_data = {
-       .n_ports        = 2,
-};
-
-static struct gpio_keys_button qnap_ts219_buttons[] = {
-       {
-               .code           = KEY_COPY,
-               .gpio           = 15,
-               .desc           = "USB Copy",
-               .active_low     = 1,
-       },
-       {
-               .code           = KEY_RESTART,
-               .gpio           = 16,
-               .desc           = "Reset",
-               .active_low     = 1,
-       },
-};
-
-static struct gpio_keys_platform_data qnap_ts219_button_data = {
-       .buttons        = qnap_ts219_buttons,
-       .nbuttons       = ARRAY_SIZE(qnap_ts219_buttons),
-};
-
-static struct platform_device qnap_ts219_button_device = {
-       .name           = "gpio-keys",
-       .id             = -1,
-       .num_resources  = 0,
-       .dev            = {
-               .platform_data  = &qnap_ts219_button_data,
-       }
-};
-
-static unsigned int qnap_ts219_mpp_config[] __initdata = {
-       MPP0_SPI_SCn,
-       MPP1_SPI_MOSI,
-       MPP2_SPI_SCK,
-       MPP3_SPI_MISO,
-       MPP4_SATA1_ACTn,
-       MPP5_SATA0_ACTn,
-       MPP8_TW0_SDA,
-       MPP9_TW0_SCK,
-       MPP10_UART0_TXD,
-       MPP11_UART0_RXD,
-       MPP13_UART1_TXD,        /* PIC controller */
-       MPP14_UART1_RXD,        /* PIC controller */
-       MPP15_GPIO,             /* USB Copy button (on devices with 88F6281) */
-       MPP16_GPIO,             /* Reset button (on devices with 88F6281) */
-       MPP36_GPIO,             /* RAM: 0: 256 MB, 1: 512 MB */
-       MPP37_GPIO,             /* Reset button (on devices with 88F6282) */
-       MPP43_GPIO,             /* USB Copy button (on devices with 88F6282) */
-       MPP44_GPIO,             /* Board ID: 0: TS-11x, 1: TS-21x */
-       0
-};
-
-static void __init qnap_ts219_init(void)
-{
-       u32 dev, rev;
-
-       /*
-        * Basic setup. Needs to be called early.
-        */
-       kirkwood_init();
-       kirkwood_mpp_conf(qnap_ts219_mpp_config);
-
-       kirkwood_uart0_init();
-       kirkwood_uart1_init(); /* A PIC controller is connected here. */
-       qnap_tsx1x_register_flash();
-       kirkwood_i2c_init();
-       i2c_register_board_info(0, &qnap_ts219_i2c_rtc, 1);
-
-       kirkwood_pcie_id(&dev, &rev);
-       if (dev == MV88F6282_DEV_ID) {
-               qnap_ts219_buttons[0].gpio = 43; /* USB Copy button */
-               qnap_ts219_buttons[1].gpio = 37; /* Reset button */
-               qnap_ts219_ge00_data.phy_addr = MV643XX_ETH_PHY_ADDR(0);
-       }
-
-       kirkwood_ge00_init(&qnap_ts219_ge00_data);
-       kirkwood_sata_init(&qnap_ts219_sata_data);
-       kirkwood_ehci_init();
-       platform_device_register(&qnap_ts219_button_device);
-
-       pm_power_off = qnap_tsx1x_power_off;
-
-}
-
-static int __init ts219_pci_init(void)
-{
-       if (machine_is_ts219())
-               kirkwood_pcie_init(KW_PCIE1 | KW_PCIE0);
-
-       return 0;
-}
-subsys_initcall(ts219_pci_init);
-
-MACHINE_START(TS219, "QNAP TS-119/TS-219")
-       /* Maintainer: Martin Michlmayr <tbm@cyrius.com> */
-       .atag_offset    = 0x100,
-       .init_machine   = qnap_ts219_init,
-       .map_io         = kirkwood_map_io,
-       .init_early     = kirkwood_init_early,
-       .init_irq       = kirkwood_init_irq,
-       .init_time      = kirkwood_timer_init,
-       .restart        = kirkwood_restart,
-MACHINE_END
diff --git a/arch/arm/mach-kirkwood/ts41x-setup.c b/arch/arm/mach-kirkwood/ts41x-setup.c
deleted file mode 100644 (file)
index 81d5858..0000000
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- *
- * QNAP TS-410, TS-410U, TS-419P and TS-419U Turbo NAS Board Setup
- *
- * Copyright (C) 2009-2010  Martin Michlmayr <tbm@cyrius.com>
- * Copyright (C) 2008  Byron Bradley <byron.bbradley@gmail.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
- */
-
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/platform_device.h>
-#include <linux/i2c.h>
-#include <linux/mv643xx_eth.h>
-#include <linux/ata_platform.h>
-#include <linux/gpio.h>
-#include <linux/gpio_keys.h>
-#include <linux/input.h>
-#include <linux/io.h>
-#include <asm/mach-types.h>
-#include <asm/mach/arch.h>
-#include <mach/kirkwood.h>
-#include "common.h"
-#include "mpp.h"
-#include "tsx1x-common.h"
-
-/* for the PCIe reset workaround */
-#include <plat/pcie.h>
-
-
-#define QNAP_TS41X_JUMPER_JP1  45
-
-static struct i2c_board_info __initdata qnap_ts41x_i2c_rtc = {
-       I2C_BOARD_INFO("s35390a", 0x30),
-};
-
-static struct mv643xx_eth_platform_data qnap_ts41x_ge00_data = {
-       .phy_addr       = MV643XX_ETH_PHY_ADDR(8),
-};
-
-static struct mv643xx_eth_platform_data qnap_ts41x_ge01_data = {
-       .phy_addr       = MV643XX_ETH_PHY_ADDR(0),
-};
-
-static struct mv_sata_platform_data qnap_ts41x_sata_data = {
-       .n_ports        = 2,
-};
-
-static struct gpio_keys_button qnap_ts41x_buttons[] = {
-       {
-               .code           = KEY_COPY,
-               .gpio           = 43,
-               .desc           = "USB Copy",
-               .active_low     = 1,
-       },
-       {
-               .code           = KEY_RESTART,
-               .gpio           = 37,
-               .desc           = "Reset",
-               .active_low     = 1,
-       },
-};
-
-static struct gpio_keys_platform_data qnap_ts41x_button_data = {
-       .buttons        = qnap_ts41x_buttons,
-       .nbuttons       = ARRAY_SIZE(qnap_ts41x_buttons),
-};
-
-static struct platform_device qnap_ts41x_button_device = {
-       .name           = "gpio-keys",
-       .id             = -1,
-       .num_resources  = 0,
-       .dev            = {
-               .platform_data  = &qnap_ts41x_button_data,
-       }
-};
-
-static unsigned int qnap_ts41x_mpp_config[] __initdata = {
-       MPP0_SPI_SCn,
-       MPP1_SPI_MOSI,
-       MPP2_SPI_SCK,
-       MPP3_SPI_MISO,
-       MPP6_SYSRST_OUTn,
-       MPP7_PEX_RST_OUTn,
-       MPP8_TW0_SDA,
-       MPP9_TW0_SCK,
-       MPP10_UART0_TXD,
-       MPP11_UART0_RXD,
-       MPP13_UART1_TXD,        /* PIC controller */
-       MPP14_UART1_RXD,        /* PIC controller */
-       MPP15_SATA0_ACTn,
-       MPP16_SATA1_ACTn,
-       MPP20_GE1_TXD0,
-       MPP21_GE1_TXD1,
-       MPP22_GE1_TXD2,
-       MPP23_GE1_TXD3,
-       MPP24_GE1_RXD0,
-       MPP25_GE1_RXD1,
-       MPP26_GE1_RXD2,
-       MPP27_GE1_RXD3,
-       MPP30_GE1_RXCTL,
-       MPP31_GE1_RXCLK,
-       MPP32_GE1_TCLKOUT,
-       MPP33_GE1_TXCTL,
-       MPP36_GPIO,             /* RAM: 0: 256 MB, 1: 512 MB */
-       MPP37_GPIO,             /* Reset button */
-       MPP43_GPIO,             /* USB Copy button */
-       MPP44_GPIO,             /* Board ID: 0: TS-419U, 1: TS-419 */
-       MPP45_GPIO,             /* JP1: 0: LCD, 1: serial console */
-       MPP46_GPIO,             /* External SATA HDD1 error indicator */
-       MPP47_GPIO,             /* External SATA HDD2 error indicator */
-       MPP48_GPIO,             /* External SATA HDD3 error indicator */
-       MPP49_GPIO,             /* External SATA HDD4 error indicator */
-       0
-};
-
-static void __init qnap_ts41x_init(void)
-{
-       u32 dev, rev;
-
-       /*
-        * Basic setup. Needs to be called early.
-        */
-       kirkwood_init();
-       kirkwood_mpp_conf(qnap_ts41x_mpp_config);
-
-       kirkwood_uart0_init();
-       kirkwood_uart1_init(); /* A PIC controller is connected here. */
-       qnap_tsx1x_register_flash();
-       kirkwood_i2c_init();
-       i2c_register_board_info(0, &qnap_ts41x_i2c_rtc, 1);
-
-       kirkwood_pcie_id(&dev, &rev);
-       if (dev == MV88F6282_DEV_ID) {
-               qnap_ts41x_ge00_data.phy_addr = MV643XX_ETH_PHY_ADDR(0);
-               qnap_ts41x_ge01_data.phy_addr = MV643XX_ETH_PHY_ADDR(1);
-       }
-       kirkwood_ge00_init(&qnap_ts41x_ge00_data);
-       kirkwood_ge01_init(&qnap_ts41x_ge01_data);
-
-       kirkwood_sata_init(&qnap_ts41x_sata_data);
-       kirkwood_ehci_init();
-       platform_device_register(&qnap_ts41x_button_device);
-
-       pm_power_off = qnap_tsx1x_power_off;
-
-       if (gpio_request(QNAP_TS41X_JUMPER_JP1, "JP1") == 0)
-               gpio_export(QNAP_TS41X_JUMPER_JP1, 0);
-}
-
-static int __init ts41x_pci_init(void)
-{
-       if (machine_is_ts41x()) {
-               u32 dev, rev;
-
-               /*
-                * Without this explicit reset, the PCIe SATA controller
-                * (Marvell 88sx7042/sata_mv) is known to stop working
-                * after a few minutes.
-                */
-               orion_pcie_reset(PCIE_VIRT_BASE);
-
-               kirkwood_pcie_id(&dev, &rev);
-               if (dev == MV88F6282_DEV_ID)
-                       kirkwood_pcie_init(KW_PCIE1 | KW_PCIE0);
-               else
-                       kirkwood_pcie_init(KW_PCIE0);
-       }
-       return 0;
-}
-subsys_initcall(ts41x_pci_init);
-
-MACHINE_START(TS41X, "QNAP TS-41x")
-       /* Maintainer: Martin Michlmayr <tbm@cyrius.com> */
-       .atag_offset    = 0x100,
-       .init_machine   = qnap_ts41x_init,
-       .map_io         = kirkwood_map_io,
-       .init_early     = kirkwood_init_early,
-       .init_irq       = kirkwood_init_irq,
-       .init_time      = kirkwood_timer_init,
-       .restart        = kirkwood_restart,
-MACHINE_END
diff --git a/arch/arm/mach-kirkwood/tsx1x-common.c b/arch/arm/mach-kirkwood/tsx1x-common.c
deleted file mode 100644 (file)
index cec87ce..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-#include <linux/kernel.h>
-#include <linux/pci.h>
-#include <linux/platform_device.h>
-#include <linux/mtd/physmap.h>
-#include <linux/spi/flash.h>
-#include <linux/spi/spi.h>
-#include <linux/serial_reg.h>
-#include <mach/kirkwood.h>
-#include "common.h"
-#include "tsx1x-common.h"
-
-/*
- * QNAP TS-x1x Boards flash
- */
-
-/****************************************************************************
- * 16 MiB NOR flash. The struct mtd_partition is not in the same order as the
- *     partitions on the device because we want to keep compatibility with
- *     the QNAP firmware.
- * Layout as used by QNAP:
- *  0x00000000-0x00080000 : "U-Boot"
- *  0x00200000-0x00400000 : "Kernel"
- *  0x00400000-0x00d00000 : "RootFS"
- *  0x00d00000-0x01000000 : "RootFS2"
- *  0x00080000-0x000c0000 : "U-Boot Config"
- *  0x000c0000-0x00200000 : "NAS Config"
- *
- * We'll use "RootFS1" instead of "RootFS" to stay compatible with the layout
- * used by the QNAP TS-109/TS-209.
- *
- ***************************************************************************/
-
-static struct mtd_partition qnap_tsx1x_partitions[] = {
-       {
-               .name           = "U-Boot",
-               .size           = 0x00080000,
-               .offset         = 0,
-               .mask_flags     = MTD_WRITEABLE,
-       }, {
-               .name           = "Kernel",
-               .size           = 0x00200000,
-               .offset         = 0x00200000,
-       }, {
-               .name           = "RootFS1",
-               .size           = 0x00900000,
-               .offset         = 0x00400000,
-       }, {
-               .name           = "RootFS2",
-               .size           = 0x00300000,
-               .offset         = 0x00d00000,
-       }, {
-               .name           = "U-Boot Config",
-               .size           = 0x00040000,
-               .offset         = 0x00080000,
-       }, {
-               .name           = "NAS Config",
-               .size           = 0x00140000,
-               .offset         = 0x000c0000,
-       },
-};
-
-static const struct flash_platform_data qnap_tsx1x_flash = {
-       .type           = "m25p128",
-       .name           = "spi_flash",
-       .parts          = qnap_tsx1x_partitions,
-       .nr_parts       = ARRAY_SIZE(qnap_tsx1x_partitions),
-};
-
-static struct spi_board_info __initdata qnap_tsx1x_spi_slave_info[] = {
-       {
-               .modalias       = "m25p80",
-               .platform_data  = &qnap_tsx1x_flash,
-               .irq            = -1,
-               .max_speed_hz   = 20000000,
-               .bus_num        = 0,
-               .chip_select    = 0,
-       },
-};
-
-void __init qnap_tsx1x_register_flash(void)
-{
-       spi_register_board_info(qnap_tsx1x_spi_slave_info,
-                               ARRAY_SIZE(qnap_tsx1x_spi_slave_info));
-       kirkwood_spi_init();
-}
-
-
-/*****************************************************************************
- * QNAP TS-x1x specific power off method via UART1-attached PIC
- ****************************************************************************/
-
-#define UART1_REG(x)   (UART1_VIRT_BASE + ((UART_##x) << 2))
-
-void qnap_tsx1x_power_off(void)
-{
-       /* 19200 baud divisor */
-       const unsigned divisor = ((kirkwood_tclk + (8 * 19200)) / (16 * 19200));
-
-       pr_info("%s: triggering power-off...\n", __func__);
-
-       /* hijack UART1 and reset into sane state (19200,8n1) */
-       writel(0x83, UART1_REG(LCR));
-       writel(divisor & 0xff, UART1_REG(DLL));
-       writel((divisor >> 8) & 0xff, UART1_REG(DLM));
-       writel(0x03, UART1_REG(LCR));
-       writel(0x00, UART1_REG(IER));
-       writel(0x00, UART1_REG(FCR));
-       writel(0x00, UART1_REG(MCR));
-
-       /* send the power-off command 'A' to PIC */
-       writel('A', UART1_REG(TX));
-}
-
diff --git a/arch/arm/mach-kirkwood/tsx1x-common.h b/arch/arm/mach-kirkwood/tsx1x-common.h
deleted file mode 100644 (file)
index 7fa0373..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-#ifndef __ARCH_KIRKWOOD_TSX1X_COMMON_H
-#define __ARCH_KIRKWOOD_TSX1X_COMMON_H
-
-extern void __init qnap_tsx1x_register_flash(void);
-extern void qnap_tsx1x_power_off(void);
-
-#endif
diff --git a/arch/arm/mach-mediatek/Kconfig b/arch/arm/mach-mediatek/Kconfig
new file mode 100644 (file)
index 0000000..2c043a2
--- /dev/null
@@ -0,0 +1,6 @@
+config ARCH_MEDIATEK
+       bool "Mediatek MT6589 SoC" if ARCH_MULTI_V7
+       select ARM_GIC
+       select MTK_TIMER
+       help
+         Support for Mediatek Cortex-A7 Quad-Core-SoC MT6589.
diff --git a/arch/arm/mach-mediatek/Makefile b/arch/arm/mach-mediatek/Makefile
new file mode 100644 (file)
index 0000000..43e619f
--- /dev/null
@@ -0,0 +1 @@
+obj-$(CONFIG_ARCH_MEDIATEK) += mediatek.o
diff --git a/arch/arm/mach-mediatek/mediatek.c b/arch/arm/mach-mediatek/mediatek.c
new file mode 100644 (file)
index 0000000..f2acf07
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Device Tree support for Mediatek SoCs
+ *
+ * Copyright (c) 2014 MundoReader S.L.
+ * Author: Matthias Brugger <matthias.bgg@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+#include <linux/init.h>
+#include <asm/mach/arch.h>
+
+static const char * const mediatek_board_dt_compat[] = {
+       "mediatek,mt6589",
+       NULL,
+};
+
+DT_MACHINE_START(MEDIATEK_DT, "Mediatek Cortex-A7 (Device Tree)")
+       .dt_compat      = mediatek_board_dt_compat,
+MACHINE_END
index fbd7ee8e48972a7b3773cd2f4bf26fd9378a98fc..8c78f2b164528d8b0adbd2e9b1f42d41fbe94378 100644 (file)
@@ -23,7 +23,6 @@
 #define SM_nCS0_nCS0           MFP_CFG(SM_nCS0, AF0)
 #define SM_ADV_SM_ADV          MFP_CFG(SM_ADV, AF0)
 #define SM_SCLK_SM_SCLK                MFP_CFG(SM_SCLK, AF0)
-#define SM_SCLK_SM_SCLK                MFP_CFG(SM_SCLK, AF0)
 #define SM_BE0_SM_BE0          MFP_CFG(SM_BE0, AF1)
 #define SM_BE1_SM_BE1          MFP_CFG(SM_BE1, AF1)
 
index b9bc599a5fd04fa8bc4b7b6e13ad1073fb4c513a..c1e4567a5ab3ed8cfc10da7340beb624a7e0713c 100644 (file)
@@ -14,11 +14,15 @@ menuconfig ARCH_MVEBU
 
 if ARCH_MVEBU
 
+config MACH_MVEBU_ANY
+       bool
+
 config MACH_MVEBU_V7
        bool
        select ARMADA_370_XP_TIMER
        select CACHE_L2X0
        select ARM_CPU_SUSPEND
+       select MACH_MVEBU_ANY
 
 config MACH_ARMADA_370
        bool "Marvell Armada 370 boards" if ARCH_MULTI_V7
@@ -75,6 +79,7 @@ config MACH_DOVE
        select CACHE_L2X0
        select CPU_PJ4
        select DOVE_CLK
+       select MACH_MVEBU_ANY
        select ORION_IRQCHIP
        select ORION_TIMER
        select PINCTRL_DOVE
@@ -87,6 +92,7 @@ config MACH_KIRKWOOD
        select ARCH_REQUIRE_GPIOLIB
        select CPU_FEROCEON
        select KIRKWOOD_CLK
+       select MACH_MVEBU_ANY
        select ORION_IRQCHIP
        select ORION_TIMER
        select PCI
@@ -96,4 +102,11 @@ config MACH_KIRKWOOD
          Say 'Y' here if you want your kernel to support boards based
          on the Marvell Kirkwood device tree.
 
+config MACH_NETXBIG
+       bool "LaCie 2Big and 5Big Network v2"
+       depends on MACH_KIRKWOOD
+       help
+         Say 'Y' here if you want your kernel to support the
+         LaCie 2Big and 5Big Network v2
+
 endif
index 1636cdbef01a792ed44a285ef4a795ae1d3d57f5..e24136b42765f69384c3143732961c8975652cab 100644 (file)
@@ -4,13 +4,13 @@ ccflags-$(CONFIG_ARCH_MULTIPLATFORM) := -I$(srctree)/$(src)/include \
 AFLAGS_coherency_ll.o          := -Wa,-march=armv7-a
 CFLAGS_pmsu.o                  := -march=armv7-a
 
-obj-y                           += system-controller.o mvebu-soc-id.o
+obj-$(CONFIG_MACH_MVEBU_ANY)    += system-controller.o mvebu-soc-id.o
 
 ifeq ($(CONFIG_MACH_MVEBU_V7),y)
 obj-y                           += cpu-reset.o board-v7.o coherency.o coherency_ll.o pmsu.o pmsu_ll.o
 obj-$(CONFIG_SMP)               += platsmp.o headsmp.o platsmp-a9.o headsmp-a9.o
-obj-$(CONFIG_HOTPLUG_CPU)       += hotplug.o
 endif
 
 obj-$(CONFIG_MACH_DOVE)                 += dove.o
 obj-$(CONFIG_MACH_KIRKWOOD)     += kirkwood.o kirkwood-pm.o
+obj-$(CONFIG_MACH_NETXBIG)      += netxbig.o
index c3465f5b12500fb74e6975ce46c9a8a34c1871f3..84cd90d9b8609a1990fb4f2d0ce2a999740973fc 100644 (file)
@@ -24,4 +24,6 @@ void armada_xp_secondary_startup(void);
 extern struct smp_operations armada_xp_smp_ops;
 #endif
 
+int armada_370_xp_pmsu_idle_enter(unsigned long deepidle);
+
 #endif /* __MACH_ARMADA_370_XP_H */
index b2524d689f21bfd01e15045dde57898d477710e6..6478626e3ff64c035e11ac69a290099c44d972a8 100644 (file)
 #include "coherency.h"
 #include "mvebu-soc-id.h"
 
+static void __iomem *scu_base;
+
 /*
  * Enables the SCU when available. Obviously, this is only useful on
  * Cortex-A based SOCs, not on PJ4B based ones.
  */
 static void __init mvebu_scu_enable(void)
 {
-       void __iomem *scu_base;
-
        struct device_node *np =
                of_find_compatible_node(NULL, NULL, "arm,cortex-a9-scu");
        if (np) {
@@ -51,6 +51,11 @@ static void __init mvebu_scu_enable(void)
        }
 }
 
+void __iomem *mvebu_get_scu_base(void)
+{
+       return scu_base;
+}
+
 /*
  * Early versions of Armada 375 SoC have a bug where the BootROM
  * leaves an external data abort pending. The kernel is hit by this
@@ -125,8 +130,16 @@ static void __init thermal_quirk(void)
 {
        struct device_node *np;
        u32 dev, rev;
+       int res;
 
-       if (mvebu_get_soc_id(&dev, &rev) == 0 && rev > ARMADA_375_Z1_REV)
+       /*
+        * The early SoC Z1 revision needs a quirk to be applied in order
+        * for the thermal controller to work properly. This quirk breaks
+        * the thermal support if applied on a SoC that doesn't need it,
+        * so we enforce the SoC revision to be known.
+        */
+       res = mvebu_get_soc_id(&dev, &rev);
+       if (res < 0 || (res == 0 && rev > ARMADA_375_Z1_REV))
                return;
 
        for_each_compatible_node(np, NULL, "marvell,armada375-thermal") {
@@ -160,7 +173,8 @@ static void __init thermal_quirk(void)
 
                /*
                 * The thermal controller needs some quirk too, so let's change
-                * the compatible string to reflect this.
+                * the compatible string to reflect this and allow the driver
+                * the take the necessary action.
                 */
                prop = kzalloc(sizeof(*prop), GFP_KERNEL);
                prop->name = kstrdup("compatible", GFP_KERNEL);
index 9c7bb4386f8bc92574a0723ebd7ea303e9028201..98e32cc2ef3dac4388e1fd5c06d444fa20734d02 100644 (file)
@@ -13,4 +13,9 @@
 #ifndef __ARCH_MVEBU_BOARD_H
 #define __ARCH_MVEBU_BOARD_H
 
+#ifdef CONFIG_MACH_NETXBIG
+void netxbig_init(void);
+#else
+static inline void netxbig_init(void) {};
+#endif
 #endif
index b67fb7a10d8b466086672170c5615de4583f009f..3ccb40c3bf94d1af6c9afcedd1ff38b9f0a3f4e0 100644 (file)
@@ -21,7 +21,8 @@ void mvebu_restart(enum reboot_mode mode, const char *cmd);
 int mvebu_cpu_reset_deassert(int cpu);
 void mvebu_pmsu_set_cpu_boot_addr(int hw_cpu, void *boot_addr);
 void mvebu_system_controller_set_cpu_boot_addr(void *boot_addr);
+int mvebu_system_controller_get_soc_id(u32 *dev, u32 *rev);
 
-void armada_xp_cpu_die(unsigned int cpu);
+void __iomem *mvebu_get_scu_base(void);
 
 #endif
index 4a8f9eebebead591f9c13970d818e2283dd07642..60fb537870047d2850e8681a57e92f3e4a399460 100644 (file)
@@ -67,7 +67,7 @@ static int mvebu_cpu_reset_map(struct device_node *np, int res_idx)
        return 0;
 }
 
-int __init mvebu_cpu_reset_init(void)
+static int __init mvebu_cpu_reset_init(void)
 {
        struct device_node *np;
        int res_idx;
index 2c3c7fc65e284a7d5805afcb04c087bf98165fa0..be51c998c0cd2f45ba0dcc92401ef9361805b514 100644 (file)
 #include <asm/assembler.h>
 
        __CPUINIT
-#define CPU_RESUME_ADDR_REG 0xf10182d4
-
-.global armada_375_smp_cpu1_enable_code_start
-.global armada_375_smp_cpu1_enable_code_end
-
-armada_375_smp_cpu1_enable_code_start:
-ARM_BE8(setend be)
-       adr     r0, 1f
-       ldr     r0, [r0]
-       ldr     r1, [r0]
-ARM_BE8(rev    r1, r1)
-       ret     r1
-1:
-       .word   CPU_RESUME_ADDR_REG
-armada_375_smp_cpu1_enable_code_end:
 
 ENTRY(mvebu_cortex_a9_secondary_startup)
 ARM_BE8(setend be)
diff --git a/arch/arm/mach-mvebu/hotplug.c b/arch/arm/mach-mvebu/hotplug.c
deleted file mode 100644 (file)
index d95e910..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Symmetric Multi Processing (SMP) support for Armada XP
- *
- * Copyright (C) 2012 Marvell
- *
- * Lior Amsalem <alior@marvell.com>
- * Gregory CLEMENT <gregory.clement@free-electrons.com>
- * Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
- *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
- */
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/smp.h>
-#include <asm/proc-fns.h>
-#include "common.h"
-
-/*
- * platform-specific code to shutdown a CPU
- *
- * Called with IRQs disabled
- */
-void __ref armada_xp_cpu_die(unsigned int cpu)
-{
-       cpu_do_idle();
-
-       /* We should never return from idle */
-       panic("mvebu: cpu %d unexpectedly exit from shutdown\n", cpu);
-}
index 46f105913c84b75e6b6c7b1095cdf485f015af5d..6b5310828eb2e7fa95fda207492ff0cc014803ab 100644 (file)
@@ -180,6 +180,9 @@ static void __init kirkwood_dt_init(void)
        kirkwood_pm_init();
        kirkwood_dt_eth_fixup();
 
+       if (of_machine_is_compatible("lacie,netxbig"))
+               netxbig_init();
+
        of_platform_populate(NULL, of_default_bus_match_table, auxdata, NULL);
 }
 
index d0f35b4d4a234af8ff826c30b0bf6e8dfaea19b0..a99434bcee849bc2654e356a2f0148d09fbcc039 100644 (file)
@@ -25,6 +25,7 @@
 #include <linux/of_address.h>
 #include <linux/slab.h>
 #include <linux/sys_soc.h>
+#include "common.h"
 #include "mvebu-soc-id.h"
 
 #define PCIE_DEV_ID_OFF                0x0
@@ -51,10 +52,10 @@ int mvebu_get_soc_id(u32 *dev, u32 *rev)
                *rev = soc_rev;
                return 0;
        } else
-               return -1;
+               return -ENODEV;
 }
 
-static int __init mvebu_soc_id_init(void)
+static int __init get_soc_id_by_pci(void)
 {
        struct device_node *np;
        int ret = 0;
@@ -129,6 +130,22 @@ clk_err:
 
        return ret;
 }
+
+static int __init mvebu_soc_id_init(void)
+{
+
+       /*
+        * First try to get the ID and the revision by the system
+        * register and use PCI registers only if it is not possible
+        */
+       if (!mvebu_system_controller_get_soc_id(&soc_dev_id, &soc_rev)) {
+               is_id_valid = true;
+               pr_info("MVEBU SoC ID=0x%X, Rev=0x%X\n", soc_dev_id, soc_rev);
+               return 0;
+       }
+
+       return get_soc_id_by_pci();
+}
 early_initcall(mvebu_soc_id_init);
 
 static int __init mvebu_soc_device(void)
diff --git a/arch/arm/mach-mvebu/netxbig.c b/arch/arm/mach-mvebu/netxbig.c
new file mode 100644 (file)
index 0000000..94b11b6
--- /dev/null
@@ -0,0 +1,191 @@
+/*
+ * arch/arm/mach-mvbu/board-netxbig.c
+ *
+ * LaCie 2Big and 5Big Network v2 board setup
+ *
+ * Copyright (C) 2010 Simon Guinot <sguinot@lacie.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/kernel.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/platform_data/leds-kirkwood-netxbig.h>
+#include "common.h"
+
+/*****************************************************************************
+ * GPIO extension LEDs
+ ****************************************************************************/
+
+/*
+ * The LEDs are controlled by a CPLD and can be configured through a GPIO
+ * extension bus:
+ *
+ * - address register : bit [0-2] -> GPIO [47-49]
+ * - data register    : bit [0-2] -> GPIO [44-46]
+ * - enable register  : GPIO 29
+ */
+
+static int netxbig_v2_gpio_ext_addr[] = { 47, 48, 49 };
+static int netxbig_v2_gpio_ext_data[] = { 44, 45, 46 };
+
+static struct netxbig_gpio_ext netxbig_v2_gpio_ext = {
+       .addr           = netxbig_v2_gpio_ext_addr,
+       .num_addr       = ARRAY_SIZE(netxbig_v2_gpio_ext_addr),
+       .data           = netxbig_v2_gpio_ext_data,
+       .num_data       = ARRAY_SIZE(netxbig_v2_gpio_ext_data),
+       .enable         = 29,
+};
+
+/*
+ * Address register selection:
+ *
+ * addr | register
+ * ----------------------------
+ *   0  | front LED
+ *   1  | front LED brightness
+ *   2  | SATA LED brightness
+ *   3  | SATA0 LED
+ *   4  | SATA1 LED
+ *   5  | SATA2 LED
+ *   6  | SATA3 LED
+ *   7  | SATA4 LED
+ *
+ * Data register configuration:
+ *
+ * data | LED brightness
+ * -------------------------------------------------
+ *   0  | min (off)
+ *   -  | -
+ *   7  | max
+ *
+ * data | front LED mode
+ * -------------------------------------------------
+ *   0  | fix off
+ *   1  | fix blue on
+ *   2  | fix red on
+ *   3  | blink blue on=1 sec and blue off=1 sec
+ *   4  | blink red on=1 sec and red off=1 sec
+ *   5  | blink blue on=2.5 sec and red on=0.5 sec
+ *   6  | blink blue on=1 sec and red on=1 sec
+ *   7  | blink blue on=0.5 sec and blue off=2.5 sec
+ *
+ * data | SATA LED mode
+ * -------------------------------------------------
+ *   0  | fix off
+ *   1  | SATA activity blink
+ *   2  | fix red on
+ *   3  | blink blue on=1 sec and blue off=1 sec
+ *   4  | blink red on=1 sec and red off=1 sec
+ *   5  | blink blue on=2.5 sec and red on=0.5 sec
+ *   6  | blink blue on=1 sec and red on=1 sec
+ *   7  | fix blue on
+ */
+
+static int netxbig_v2_red_mled[NETXBIG_LED_MODE_NUM] = {
+       [NETXBIG_LED_OFF]       = 0,
+       [NETXBIG_LED_ON]        = 2,
+       [NETXBIG_LED_SATA]      = NETXBIG_LED_INVALID_MODE,
+       [NETXBIG_LED_TIMER1]    = 4,
+       [NETXBIG_LED_TIMER2]    = NETXBIG_LED_INVALID_MODE,
+};
+
+static int netxbig_v2_blue_pwr_mled[NETXBIG_LED_MODE_NUM] = {
+       [NETXBIG_LED_OFF]       = 0,
+       [NETXBIG_LED_ON]        = 1,
+       [NETXBIG_LED_SATA]      = NETXBIG_LED_INVALID_MODE,
+       [NETXBIG_LED_TIMER1]    = 3,
+       [NETXBIG_LED_TIMER2]    = 7,
+};
+
+static int netxbig_v2_blue_sata_mled[NETXBIG_LED_MODE_NUM] = {
+       [NETXBIG_LED_OFF]       = 0,
+       [NETXBIG_LED_ON]        = 7,
+       [NETXBIG_LED_SATA]      = 1,
+       [NETXBIG_LED_TIMER1]    = 3,
+       [NETXBIG_LED_TIMER2]    = NETXBIG_LED_INVALID_MODE,
+};
+
+static struct netxbig_led_timer netxbig_v2_led_timer[] = {
+       [0] = {
+               .delay_on       = 500,
+               .delay_off      = 500,
+               .mode           = NETXBIG_LED_TIMER1,
+       },
+       [1] = {
+               .delay_on       = 500,
+               .delay_off      = 1000,
+               .mode           = NETXBIG_LED_TIMER2,
+       },
+};
+
+#define NETXBIG_LED(_name, maddr, mval, baddr)                 \
+       { .name         = _name,                                \
+         .mode_addr    = maddr,                                \
+         .mode_val     = mval,                                 \
+         .bright_addr  = baddr }
+
+static struct netxbig_led net2big_v2_leds_ctrl[] = {
+       NETXBIG_LED("net2big-v2:blue:power", 0, netxbig_v2_blue_pwr_mled,  1),
+       NETXBIG_LED("net2big-v2:red:power",  0, netxbig_v2_red_mled,       1),
+       NETXBIG_LED("net2big-v2:blue:sata0", 3, netxbig_v2_blue_sata_mled, 2),
+       NETXBIG_LED("net2big-v2:red:sata0",  3, netxbig_v2_red_mled,       2),
+       NETXBIG_LED("net2big-v2:blue:sata1", 4, netxbig_v2_blue_sata_mled, 2),
+       NETXBIG_LED("net2big-v2:red:sata1",  4, netxbig_v2_red_mled,       2),
+};
+
+static struct netxbig_led_platform_data net2big_v2_leds_data = {
+       .gpio_ext       = &netxbig_v2_gpio_ext,
+       .timer          = netxbig_v2_led_timer,
+       .num_timer      = ARRAY_SIZE(netxbig_v2_led_timer),
+       .leds           = net2big_v2_leds_ctrl,
+       .num_leds       = ARRAY_SIZE(net2big_v2_leds_ctrl),
+};
+
+static struct netxbig_led net5big_v2_leds_ctrl[] = {
+       NETXBIG_LED("net5big-v2:blue:power", 0, netxbig_v2_blue_pwr_mled,  1),
+       NETXBIG_LED("net5big-v2:red:power",  0, netxbig_v2_red_mled,       1),
+       NETXBIG_LED("net5big-v2:blue:sata0", 3, netxbig_v2_blue_sata_mled, 2),
+       NETXBIG_LED("net5big-v2:red:sata0",  3, netxbig_v2_red_mled,       2),
+       NETXBIG_LED("net5big-v2:blue:sata1", 4, netxbig_v2_blue_sata_mled, 2),
+       NETXBIG_LED("net5big-v2:red:sata1",  4, netxbig_v2_red_mled,       2),
+       NETXBIG_LED("net5big-v2:blue:sata2", 5, netxbig_v2_blue_sata_mled, 2),
+       NETXBIG_LED("net5big-v2:red:sata2",  5, netxbig_v2_red_mled,       2),
+       NETXBIG_LED("net5big-v2:blue:sata3", 6, netxbig_v2_blue_sata_mled, 2),
+       NETXBIG_LED("net5big-v2:red:sata3",  6, netxbig_v2_red_mled,       2),
+       NETXBIG_LED("net5big-v2:blue:sata4", 7, netxbig_v2_blue_sata_mled, 2),
+       NETXBIG_LED("net5big-v2:red:sata4",  7, netxbig_v2_red_mled,       2),
+};
+
+static struct netxbig_led_platform_data net5big_v2_leds_data = {
+       .gpio_ext       = &netxbig_v2_gpio_ext,
+       .timer          = netxbig_v2_led_timer,
+       .num_timer      = ARRAY_SIZE(netxbig_v2_led_timer),
+       .leds           = net5big_v2_leds_ctrl,
+       .num_leds       = ARRAY_SIZE(net5big_v2_leds_ctrl),
+};
+
+static struct platform_device netxbig_v2_leds = {
+       .name           = "leds-netxbig",
+       .id             = -1,
+       .dev            = {
+               .platform_data  = &net2big_v2_leds_data,
+       },
+};
+
+void __init netxbig_init(void)
+{
+
+       if (of_machine_is_compatible("lacie,net5big_v2"))
+               netxbig_v2_leds.dev.platform_data = &net5big_v2_leds_data;
+       platform_device_register(&netxbig_v2_leds);
+}
index 96c2c59e34b67bc108d05f8f81c1255faa9f9174..47a71a924b965f130b6e21a667eaaa5d7adb53d5 100644 (file)
 #include <asm/smp_scu.h>
 #include <asm/smp_plat.h>
 #include "common.h"
-#include "mvebu-soc-id.h"
 #include "pmsu.h"
 
-#define CRYPT0_ENG_ID   41
-#define CRYPT0_ENG_ATTR 0x1
-#define SRAM_PHYS_BASE  0xFFFF0000
-
-#define BOOTROM_BASE    0xFFF00000
-#define BOOTROM_SIZE    0x100000
-
-extern unsigned char armada_375_smp_cpu1_enable_code_end;
-extern unsigned char armada_375_smp_cpu1_enable_code_start;
-
-void armada_375_smp_cpu1_enable_wa(void)
-{
-       void __iomem *sram_virt_base;
-
-       mvebu_mbus_del_window(BOOTROM_BASE, BOOTROM_SIZE);
-       mvebu_mbus_add_window_by_id(CRYPT0_ENG_ID, CRYPT0_ENG_ATTR,
-                               SRAM_PHYS_BASE, SZ_64K);
-       sram_virt_base = ioremap(SRAM_PHYS_BASE, SZ_64K);
-
-       memcpy(sram_virt_base, &armada_375_smp_cpu1_enable_code_start,
-              &armada_375_smp_cpu1_enable_code_end
-              - &armada_375_smp_cpu1_enable_code_start);
-}
-
 extern void mvebu_cortex_a9_secondary_startup(void);
 
 static int __cpuinit mvebu_cortex_a9_boot_secondary(unsigned int cpu,
@@ -63,21 +38,10 @@ static int __cpuinit mvebu_cortex_a9_boot_secondary(unsigned int cpu,
         * address.
         */
        hw_cpu = cpu_logical_map(cpu);
-
-       if (of_machine_is_compatible("marvell,armada375")) {
-               u32 dev, rev;
-
-               if (mvebu_get_soc_id(&dev, &rev) == 0 &&
-                   rev == ARMADA_375_Z1_REV)
-                       armada_375_smp_cpu1_enable_wa();
-
+       if (of_machine_is_compatible("marvell,armada375"))
                mvebu_system_controller_set_cpu_boot_addr(mvebu_cortex_a9_secondary_startup);
-       }
-       else {
-               mvebu_pmsu_set_cpu_boot_addr(hw_cpu,
-                                            mvebu_cortex_a9_secondary_startup);
-       }
-
+       else
+               mvebu_pmsu_set_cpu_boot_addr(hw_cpu, mvebu_cortex_a9_secondary_startup);
        smp_wmb();
        ret = mvebu_cpu_reset_deassert(hw_cpu);
        if (ret) {
@@ -91,9 +55,6 @@ static int __cpuinit mvebu_cortex_a9_boot_secondary(unsigned int cpu,
 
 static struct smp_operations mvebu_cortex_a9_smp_ops __initdata = {
        .smp_boot_secondary     = mvebu_cortex_a9_boot_secondary,
-#ifdef CONFIG_HOTPLUG_CPU
-       .cpu_die                = armada_xp_cpu_die,
-#endif
 };
 
 CPU_METHOD_OF_DECLARE(mvebu_armada_375_smp, "marvell,armada-375-smp",
index 88b976b317198f7733b4945eaad440c195175aaa..895dc373c8a1cce357d8ed93876ef5432673acdc 100644 (file)
@@ -67,6 +67,7 @@ static void __init set_secondary_cpus_clock(void)
                if (!cpu_clk)
                        return;
                clk_set_rate(cpu_clk, rate);
+               clk_prepare_enable(cpu_clk);
        }
 }
 
@@ -78,6 +79,17 @@ static int armada_xp_boot_secondary(unsigned int cpu, struct task_struct *idle)
 
        hw_cpu = cpu_logical_map(cpu);
        mvebu_pmsu_set_cpu_boot_addr(hw_cpu, armada_xp_secondary_startup);
+
+       /*
+        * This is needed to wake up CPUs in the offline state after
+        * using CPU hotplug.
+        */
+       arch_send_wakeup_ipi_mask(cpumask_of(cpu));
+
+       /*
+        * This is needed to take secondary CPUs out of reset on the
+        * initial boot.
+        */
        ret = mvebu_cpu_reset_deassert(hw_cpu);
        if (ret) {
                pr_warn("unable to boot CPU: %d\n", ret);
@@ -87,6 +99,19 @@ static int armada_xp_boot_secondary(unsigned int cpu, struct task_struct *idle)
        return 0;
 }
 
+/*
+ * When a CPU is brought back online, either through CPU hotplug, or
+ * because of the boot of a kexec'ed kernel, the PMSU configuration
+ * for this CPU might be in the deep idle state, preventing this CPU
+ * from receiving interrupts. Here, we therefore take out the current
+ * CPU from this state, which was entered by armada_xp_cpu_die()
+ * below.
+ */
+static void armada_xp_secondary_init(unsigned int cpu)
+{
+       mvebu_v7_pmsu_idle_exit();
+}
+
 static void __init armada_xp_smp_init_cpus(void)
 {
        unsigned int ncores = num_possible_cpus();
@@ -122,12 +147,36 @@ static void __init armada_xp_smp_prepare_cpus(unsigned int max_cpus)
                panic("The address for the BootROM is incorrect");
 }
 
+#ifdef CONFIG_HOTPLUG_CPU
+static void armada_xp_cpu_die(unsigned int cpu)
+{
+       /*
+        * CPU hotplug is implemented by putting offline CPUs into the
+        * deep idle sleep state.
+        */
+       armada_370_xp_pmsu_idle_enter(true);
+}
+
+/*
+ * We need a dummy function, so that platform_can_cpu_hotplug() knows
+ * we support CPU hotplug. However, the function does not need to do
+ * anything, because CPUs going offline can enter the deep idle state
+ * by themselves, without any help from a still alive CPU.
+ */
+static int armada_xp_cpu_kill(unsigned int cpu)
+{
+       return 1;
+}
+#endif
+
 struct smp_operations armada_xp_smp_ops __initdata = {
        .smp_init_cpus          = armada_xp_smp_init_cpus,
        .smp_prepare_cpus       = armada_xp_smp_prepare_cpus,
        .smp_boot_secondary     = armada_xp_boot_secondary,
+       .smp_secondary_init     = armada_xp_secondary_init,
 #ifdef CONFIG_HOTPLUG_CPU
        .cpu_die                = armada_xp_cpu_die,
+       .cpu_kill               = armada_xp_cpu_kill,
 #endif
 };
 
index 25aa8237d66844ca5523ca6b81f1c48e8e2a7cb1..8a70a51533fd4507e02f10cb576667500cfbf575 100644 (file)
 
 #define pr_fmt(fmt) "mvebu-pmsu: " fmt
 
+#include <linux/clk.h>
 #include <linux/cpu_pm.h>
-#include <linux/kernel.h>
+#include <linux/delay.h>
 #include <linux/init.h>
-#include <linux/of_address.h>
 #include <linux/io.h>
+#include <linux/kernel.h>
+#include <linux/mbus.h>
+#include <linux/of_address.h>
+#include <linux/of_device.h>
 #include <linux/platform_device.h>
-#include <linux/smp.h>
+#include <linux/pm_opp.h>
 #include <linux/resource.h>
+#include <linux/slab.h>
+#include <linux/smp.h>
 #include <asm/cacheflush.h>
 #include <asm/cp15.h>
+#include <asm/smp_scu.h>
 #include <asm/smp_plat.h>
 #include <asm/suspend.h>
 #include <asm/tlbflush.h>
 #include "common.h"
+#include "armada-370-xp.h"
 
-static void __iomem *pmsu_mp_base;
 
 #define PMSU_BASE_OFFSET    0x100
 #define PMSU_REG_SIZE      0x1000
@@ -57,20 +64,45 @@ static void __iomem *pmsu_mp_base;
 #define PMSU_STATUS_AND_MASK_IRQ_MASK          BIT(24)
 #define PMSU_STATUS_AND_MASK_FIQ_MASK          BIT(25)
 
+#define PMSU_EVENT_STATUS_AND_MASK(cpu)     ((cpu * 0x100) + 0x120)
+#define PMSU_EVENT_STATUS_AND_MASK_DFS_DONE        BIT(1)
+#define PMSU_EVENT_STATUS_AND_MASK_DFS_DONE_MASK   BIT(17)
+
 #define PMSU_BOOT_ADDR_REDIRECT_OFFSET(cpu) ((cpu * 0x100) + 0x124)
 
 /* PMSU fabric registers */
 #define L2C_NFABRIC_PM_CTL                 0x4
 #define L2C_NFABRIC_PM_CTL_PWR_DOWN            BIT(20)
 
+/* PMSU delay registers */
+#define PMSU_POWERDOWN_DELAY               0xF04
+#define PMSU_POWERDOWN_DELAY_PMU               BIT(1)
+#define PMSU_POWERDOWN_DELAY_MASK              0xFFFE
+#define PMSU_DFLT_ARMADA38X_DELAY              0x64
+
+/* CA9 MPcore SoC Control registers */
+
+#define MPCORE_RESET_CTL                   0x64
+#define MPCORE_RESET_CTL_L2                    BIT(0)
+#define MPCORE_RESET_CTL_DEBUG                 BIT(16)
+
+#define SRAM_PHYS_BASE  0xFFFF0000
+#define BOOTROM_BASE    0xFFF00000
+#define BOOTROM_SIZE    0x100000
+
+#define ARMADA_370_CRYPT0_ENG_TARGET   0x9
+#define ARMADA_370_CRYPT0_ENG_ATTR     0x1
+
 extern void ll_disable_coherency(void);
 extern void ll_enable_coherency(void);
 
 extern void armada_370_xp_cpu_resume(void);
+extern void armada_38x_cpu_resume(void);
 
-static struct platform_device armada_xp_cpuidle_device = {
-       .name = "cpuidle-armada-370-xp",
-};
+static phys_addr_t pmsu_mp_phys_base;
+static void __iomem *pmsu_mp_base;
+
+static void *mvebu_cpu_resume;
 
 static struct of_device_id of_pmsu_table[] = {
        { .compatible = "marvell,armada-370-pmsu", },
@@ -85,7 +117,49 @@ void mvebu_pmsu_set_cpu_boot_addr(int hw_cpu, void *boot_addr)
                PMSU_BOOT_ADDR_REDIRECT_OFFSET(hw_cpu));
 }
 
-static int __init armada_370_xp_pmsu_init(void)
+extern unsigned char mvebu_boot_wa_start;
+extern unsigned char mvebu_boot_wa_end;
+
+/*
+ * This function sets up the boot address workaround needed for SMP
+ * boot on Armada 375 Z1 and cpuidle on Armada 370. It unmaps the
+ * BootROM Mbus window, and instead remaps a crypto SRAM into which a
+ * custom piece of code is copied to replace the problematic BootROM.
+ */
+int mvebu_setup_boot_addr_wa(unsigned int crypto_eng_target,
+                            unsigned int crypto_eng_attribute,
+                            phys_addr_t resume_addr_reg)
+{
+       void __iomem *sram_virt_base;
+       u32 code_len = &mvebu_boot_wa_end - &mvebu_boot_wa_start;
+
+       mvebu_mbus_del_window(BOOTROM_BASE, BOOTROM_SIZE);
+       mvebu_mbus_add_window_by_id(crypto_eng_target, crypto_eng_attribute,
+                                   SRAM_PHYS_BASE, SZ_64K);
+
+       sram_virt_base = ioremap(SRAM_PHYS_BASE, SZ_64K);
+       if (!sram_virt_base) {
+               pr_err("Unable to map SRAM to setup the boot address WA\n");
+               return -ENOMEM;
+       }
+
+       memcpy(sram_virt_base, &mvebu_boot_wa_start, code_len);
+
+       /*
+        * The last word of the code copied in SRAM must contain the
+        * physical base address of the PMSU register. We
+        * intentionally store this address in the native endianness
+        * of the system.
+        */
+       __raw_writel((unsigned long)resume_addr_reg,
+                    sram_virt_base + code_len - 4);
+
+       iounmap(sram_virt_base);
+
+       return 0;
+}
+
+static int __init mvebu_v7_pmsu_init(void)
 {
        struct device_node *np;
        struct resource res;
@@ -116,6 +190,8 @@ static int __init armada_370_xp_pmsu_init(void)
                goto out;
        }
 
+       pmsu_mp_phys_base = res.start;
+
        pmsu_mp_base = ioremap(res.start, resource_size(&res));
        if (!pmsu_mp_base) {
                pr_err("unable to map registers\n");
@@ -129,7 +205,7 @@ static int __init armada_370_xp_pmsu_init(void)
        return ret;
 }
 
-static void armada_370_xp_pmsu_enable_l2_powerdown_onidle(void)
+static void mvebu_v7_pmsu_enable_l2_powerdown_onidle(void)
 {
        u32 reg;
 
@@ -142,14 +218,20 @@ static void armada_370_xp_pmsu_enable_l2_powerdown_onidle(void)
        writel(reg, pmsu_mp_base + L2C_NFABRIC_PM_CTL);
 }
 
+enum pmsu_idle_prepare_flags {
+       PMSU_PREPARE_NORMAL = 0,
+       PMSU_PREPARE_DEEP_IDLE = BIT(0),
+       PMSU_PREPARE_SNOOP_DISABLE = BIT(1),
+};
+
 /* No locking is needed because we only access per-CPU registers */
-void armada_370_xp_pmsu_idle_prepare(bool deepidle)
+static int mvebu_v7_pmsu_idle_prepare(unsigned long flags)
 {
        unsigned int hw_cpu = cpu_logical_map(smp_processor_id());
        u32 reg;
 
        if (pmsu_mp_base == NULL)
-               return;
+               return -EINVAL;
 
        /*
         * Adjust the PMSU configuration to wait for WFI signal, enable
@@ -167,22 +249,34 @@ void armada_370_xp_pmsu_idle_prepare(bool deepidle)
 
        reg = readl(pmsu_mp_base + PMSU_CONTROL_AND_CONFIG(hw_cpu));
        /* ask HW to power down the L2 Cache if needed */
-       if (deepidle)
+       if (flags & PMSU_PREPARE_DEEP_IDLE)
                reg |= PMSU_CONTROL_AND_CONFIG_L2_PWDDN;
 
        /* request power down */
        reg |= PMSU_CONTROL_AND_CONFIG_PWDDN_REQ;
        writel(reg, pmsu_mp_base + PMSU_CONTROL_AND_CONFIG(hw_cpu));
 
-       /* Disable snoop disable by HW - SW is taking care of it */
-       reg = readl(pmsu_mp_base + PMSU_CPU_POWER_DOWN_CONTROL(hw_cpu));
-       reg |= PMSU_CPU_POWER_DOWN_DIS_SNP_Q_SKIP;
-       writel(reg, pmsu_mp_base + PMSU_CPU_POWER_DOWN_CONTROL(hw_cpu));
+       if (flags & PMSU_PREPARE_SNOOP_DISABLE) {
+               /* Disable snoop disable by HW - SW is taking care of it */
+               reg = readl(pmsu_mp_base + PMSU_CPU_POWER_DOWN_CONTROL(hw_cpu));
+               reg |= PMSU_CPU_POWER_DOWN_DIS_SNP_Q_SKIP;
+               writel(reg, pmsu_mp_base + PMSU_CPU_POWER_DOWN_CONTROL(hw_cpu));
+       }
+
+       return 0;
 }
 
-static noinline int do_armada_370_xp_cpu_suspend(unsigned long deepidle)
+int armada_370_xp_pmsu_idle_enter(unsigned long deepidle)
 {
-       armada_370_xp_pmsu_idle_prepare(deepidle);
+       unsigned long flags = PMSU_PREPARE_SNOOP_DISABLE;
+       int ret;
+
+       if (deepidle)
+               flags |= PMSU_PREPARE_DEEP_IDLE;
+
+       ret = mvebu_v7_pmsu_idle_prepare(flags);
+       if (ret)
+               return ret;
 
        v7_exit_coherency_flush(all);
 
@@ -208,25 +302,50 @@ static noinline int do_armada_370_xp_cpu_suspend(unsigned long deepidle)
        "isb    "
        : : : "r0");
 
-       pr_warn("Failed to suspend the system\n");
+       pr_debug("Failed to suspend the system\n");
 
        return 0;
 }
 
 static int armada_370_xp_cpu_suspend(unsigned long deepidle)
 {
-       return cpu_suspend(deepidle, do_armada_370_xp_cpu_suspend);
+       return cpu_suspend(deepidle, armada_370_xp_pmsu_idle_enter);
+}
+
+static int armada_38x_do_cpu_suspend(unsigned long deepidle)
+{
+       unsigned long flags = 0;
+
+       if (deepidle)
+               flags |= PMSU_PREPARE_DEEP_IDLE;
+
+       mvebu_v7_pmsu_idle_prepare(flags);
+       /*
+        * Already flushed cache, but do it again as the outer cache
+        * functions dirty the cache with spinlocks
+        */
+       v7_exit_coherency_flush(louis);
+
+       scu_power_mode(mvebu_get_scu_base(), SCU_PM_POWEROFF);
+
+       cpu_do_idle();
+
+       return 1;
+}
+
+static int armada_38x_cpu_suspend(unsigned long deepidle)
+{
+       return cpu_suspend(false, armada_38x_do_cpu_suspend);
 }
 
 /* No locking is needed because we only access per-CPU registers */
-static noinline void armada_370_xp_pmsu_idle_restore(void)
+void mvebu_v7_pmsu_idle_exit(void)
 {
        unsigned int hw_cpu = cpu_logical_map(smp_processor_id());
        u32 reg;
 
        if (pmsu_mp_base == NULL)
                return;
-
        /* cancel ask HW to power down the L2 Cache if possible */
        reg = readl(pmsu_mp_base + PMSU_CONTROL_AND_CONFIG(hw_cpu));
        reg &= ~PMSU_CONTROL_AND_CONFIG_L2_PWDDN;
@@ -241,53 +360,292 @@ static noinline void armada_370_xp_pmsu_idle_restore(void)
        writel(reg, pmsu_mp_base + PMSU_STATUS_AND_MASK(hw_cpu));
 }
 
-static int armada_370_xp_cpu_pm_notify(struct notifier_block *self,
+static int mvebu_v7_cpu_pm_notify(struct notifier_block *self,
                                    unsigned long action, void *hcpu)
 {
        if (action == CPU_PM_ENTER) {
                unsigned int hw_cpu = cpu_logical_map(smp_processor_id());
-               mvebu_pmsu_set_cpu_boot_addr(hw_cpu, armada_370_xp_cpu_resume);
+               mvebu_pmsu_set_cpu_boot_addr(hw_cpu, mvebu_cpu_resume);
        } else if (action == CPU_PM_EXIT) {
-               armada_370_xp_pmsu_idle_restore();
+               mvebu_v7_pmsu_idle_exit();
        }
 
        return NOTIFY_OK;
 }
 
-static struct notifier_block armada_370_xp_cpu_pm_notifier = {
-       .notifier_call = armada_370_xp_cpu_pm_notify,
+static struct notifier_block mvebu_v7_cpu_pm_notifier = {
+       .notifier_call = mvebu_v7_cpu_pm_notify,
 };
 
-int __init armada_370_xp_cpu_pm_init(void)
+static struct platform_device mvebu_v7_cpuidle_device;
+
+static __init int armada_370_cpuidle_init(void)
 {
        struct device_node *np;
+       phys_addr_t redirect_reg;
+
+       np = of_find_compatible_node(NULL, NULL, "marvell,coherency-fabric");
+       if (!np)
+               return -ENODEV;
+       of_node_put(np);
 
        /*
-        * Check that all the requirements are available to enable
-        * cpuidle. So far, it is only supported on Armada XP, cpuidle
-        * needs the coherency fabric and the PMSU enabled
+        * On Armada 370, there is "a slow exit process from the deep
+        * idle state due to heavy L1/L2 cache cleanup operations
+        * performed by the BootROM software". To avoid this, we
+        * replace the restart code of the bootrom by a a simple jump
+        * to the boot address. Then the code located at this boot
+        * address will take care of the initialization.
         */
+       redirect_reg = pmsu_mp_phys_base + PMSU_BOOT_ADDR_REDIRECT_OFFSET(0);
+       mvebu_setup_boot_addr_wa(ARMADA_370_CRYPT0_ENG_TARGET,
+                                ARMADA_370_CRYPT0_ENG_ATTR,
+                                redirect_reg);
 
-       if (!of_machine_is_compatible("marvell,armadaxp"))
-               return 0;
+       mvebu_cpu_resume = armada_370_xp_cpu_resume;
+       mvebu_v7_cpuidle_device.dev.platform_data = armada_370_xp_cpu_suspend;
+       mvebu_v7_cpuidle_device.name = "cpuidle-armada-370";
+
+       return 0;
+}
+
+static __init int armada_38x_cpuidle_init(void)
+{
+       struct device_node *np;
+       void __iomem *mpsoc_base;
+       u32 reg;
+
+       np = of_find_compatible_node(NULL, NULL,
+                                    "marvell,armada-380-coherency-fabric");
+       if (!np)
+               return -ENODEV;
+       of_node_put(np);
+
+       np = of_find_compatible_node(NULL, NULL,
+                                    "marvell,armada-380-mpcore-soc-ctrl");
+       if (!np)
+               return -ENODEV;
+       mpsoc_base = of_iomap(np, 0);
+       BUG_ON(!mpsoc_base);
+       of_node_put(np);
+
+       /* Set up reset mask when powering down the cpus */
+       reg = readl(mpsoc_base + MPCORE_RESET_CTL);
+       reg |= MPCORE_RESET_CTL_L2;
+       reg |= MPCORE_RESET_CTL_DEBUG;
+       writel(reg, mpsoc_base + MPCORE_RESET_CTL);
+       iounmap(mpsoc_base);
+
+       /* Set up delay */
+       reg = readl(pmsu_mp_base + PMSU_POWERDOWN_DELAY);
+       reg &= ~PMSU_POWERDOWN_DELAY_MASK;
+       reg |= PMSU_DFLT_ARMADA38X_DELAY;
+       reg |= PMSU_POWERDOWN_DELAY_PMU;
+       writel(reg, pmsu_mp_base + PMSU_POWERDOWN_DELAY);
+
+       mvebu_cpu_resume = armada_38x_cpu_resume;
+       mvebu_v7_cpuidle_device.dev.platform_data = armada_38x_cpu_suspend;
+       mvebu_v7_cpuidle_device.name = "cpuidle-armada-38x";
+
+       return 0;
+}
+
+static __init int armada_xp_cpuidle_init(void)
+{
+       struct device_node *np;
 
        np = of_find_compatible_node(NULL, NULL, "marvell,coherency-fabric");
        if (!np)
-               return 0;
+               return -ENODEV;
        of_node_put(np);
 
+       mvebu_cpu_resume = armada_370_xp_cpu_resume;
+       mvebu_v7_cpuidle_device.dev.platform_data = armada_370_xp_cpu_suspend;
+       mvebu_v7_cpuidle_device.name = "cpuidle-armada-xp";
+
+       return 0;
+}
+
+static int __init mvebu_v7_cpu_pm_init(void)
+{
+       struct device_node *np;
+       int ret;
+
        np = of_find_matching_node(NULL, of_pmsu_table);
        if (!np)
                return 0;
        of_node_put(np);
 
-       armada_370_xp_pmsu_enable_l2_powerdown_onidle();
-       armada_xp_cpuidle_device.dev.platform_data = armada_370_xp_cpu_suspend;
-       platform_device_register(&armada_xp_cpuidle_device);
-       cpu_pm_register_notifier(&armada_370_xp_cpu_pm_notifier);
+       if (of_machine_is_compatible("marvell,armadaxp"))
+               ret = armada_xp_cpuidle_init();
+       else if (of_machine_is_compatible("marvell,armada370"))
+               ret = armada_370_cpuidle_init();
+       else if (of_machine_is_compatible("marvell,armada380"))
+               ret = armada_38x_cpuidle_init();
+       else
+               return 0;
+
+       if (ret)
+               return ret;
+
+       mvebu_v7_pmsu_enable_l2_powerdown_onidle();
+       platform_device_register(&mvebu_v7_cpuidle_device);
+       cpu_pm_register_notifier(&mvebu_v7_cpu_pm_notifier);
+
+       return 0;
+}
+
+arch_initcall(mvebu_v7_cpu_pm_init);
+early_initcall(mvebu_v7_pmsu_init);
+
+static void mvebu_pmsu_dfs_request_local(void *data)
+{
+       u32 reg;
+       u32 cpu = smp_processor_id();
+       unsigned long flags;
+
+       local_irq_save(flags);
+
+       /* Prepare to enter idle */
+       reg = readl(pmsu_mp_base + PMSU_STATUS_AND_MASK(cpu));
+       reg |= PMSU_STATUS_AND_MASK_CPU_IDLE_WAIT |
+              PMSU_STATUS_AND_MASK_IRQ_MASK     |
+              PMSU_STATUS_AND_MASK_FIQ_MASK;
+       writel(reg, pmsu_mp_base + PMSU_STATUS_AND_MASK(cpu));
+
+       /* Request the DFS transition */
+       reg = readl(pmsu_mp_base + PMSU_CONTROL_AND_CONFIG(cpu));
+       reg |= PMSU_CONTROL_AND_CONFIG_DFS_REQ;
+       writel(reg, pmsu_mp_base + PMSU_CONTROL_AND_CONFIG(cpu));
+
+       /* The fact of entering idle will trigger the DFS transition */
+       wfi();
+
+       /*
+        * We're back from idle, the DFS transition has completed,
+        * clear the idle wait indication.
+        */
+       reg = readl(pmsu_mp_base + PMSU_STATUS_AND_MASK(cpu));
+       reg &= ~PMSU_STATUS_AND_MASK_CPU_IDLE_WAIT;
+       writel(reg, pmsu_mp_base + PMSU_STATUS_AND_MASK(cpu));
+
+       local_irq_restore(flags);
+}
+
+int mvebu_pmsu_dfs_request(int cpu)
+{
+       unsigned long timeout;
+       int hwcpu = cpu_logical_map(cpu);
+       u32 reg;
+
+       /* Clear any previous DFS DONE event */
+       reg = readl(pmsu_mp_base + PMSU_EVENT_STATUS_AND_MASK(hwcpu));
+       reg &= ~PMSU_EVENT_STATUS_AND_MASK_DFS_DONE;
+       writel(reg, pmsu_mp_base + PMSU_EVENT_STATUS_AND_MASK(hwcpu));
+
+       /* Mask the DFS done interrupt, since we are going to poll */
+       reg = readl(pmsu_mp_base + PMSU_EVENT_STATUS_AND_MASK(hwcpu));
+       reg |= PMSU_EVENT_STATUS_AND_MASK_DFS_DONE_MASK;
+       writel(reg, pmsu_mp_base + PMSU_EVENT_STATUS_AND_MASK(hwcpu));
+
+       /* Trigger the DFS on the appropriate CPU */
+       smp_call_function_single(cpu, mvebu_pmsu_dfs_request_local,
+                                NULL, false);
+
+       /* Poll until the DFS done event is generated */
+       timeout = jiffies + HZ;
+       while (time_before(jiffies, timeout)) {
+               reg = readl(pmsu_mp_base + PMSU_EVENT_STATUS_AND_MASK(hwcpu));
+               if (reg & PMSU_EVENT_STATUS_AND_MASK_DFS_DONE)
+                       break;
+               udelay(10);
+       }
+
+       if (time_after(jiffies, timeout))
+               return -ETIME;
+
+       /* Restore the DFS mask to its original state */
+       reg = readl(pmsu_mp_base + PMSU_EVENT_STATUS_AND_MASK(hwcpu));
+       reg &= ~PMSU_EVENT_STATUS_AND_MASK_DFS_DONE_MASK;
+       writel(reg, pmsu_mp_base + PMSU_EVENT_STATUS_AND_MASK(hwcpu));
+
+       return 0;
+}
+
+static int __init armada_xp_pmsu_cpufreq_init(void)
+{
+       struct device_node *np;
+       struct resource res;
+       int ret, cpu;
+
+       if (!of_machine_is_compatible("marvell,armadaxp"))
+               return 0;
+
+       /*
+        * In order to have proper cpufreq handling, we need to ensure
+        * that the Device Tree description of the CPU clock includes
+        * the definition of the PMU DFS registers. If not, we do not
+        * register the clock notifier and the cpufreq driver. This
+        * piece of code is only for compatibility with old Device
+        * Trees.
+        */
+       np = of_find_compatible_node(NULL, NULL, "marvell,armada-xp-cpu-clock");
+       if (!np)
+               return 0;
+
+       ret = of_address_to_resource(np, 1, &res);
+       if (ret) {
+               pr_warn(FW_WARN "not enabling cpufreq, deprecated armada-xp-cpu-clock binding\n");
+               of_node_put(np);
+               return 0;
+       }
+
+       of_node_put(np);
+
+       /*
+        * For each CPU, this loop registers the operating points
+        * supported (which are the nominal CPU frequency and half of
+        * it), and registers the clock notifier that will take care
+        * of doing the PMSU part of a frequency transition.
+        */
+       for_each_possible_cpu(cpu) {
+               struct device *cpu_dev;
+               struct clk *clk;
+               int ret;
+
+               cpu_dev = get_cpu_device(cpu);
+               if (!cpu_dev) {
+                       pr_err("Cannot get CPU %d\n", cpu);
+                       continue;
+               }
+
+               clk = clk_get(cpu_dev, 0);
+               if (IS_ERR(clk)) {
+                       pr_err("Cannot get clock for CPU %d\n", cpu);
+                       return PTR_ERR(clk);
+               }
+
+               /*
+                * In case of a failure of dev_pm_opp_add(), we don't
+                * bother with cleaning up the registered OPP (there's
+                * no function to do so), and simply cancel the
+                * registration of the cpufreq device.
+                */
+               ret = dev_pm_opp_add(cpu_dev, clk_get_rate(clk), 0);
+               if (ret) {
+                       clk_put(clk);
+                       return ret;
+               }
+
+               ret = dev_pm_opp_add(cpu_dev, clk_get_rate(clk) / 2, 0);
+               if (ret) {
+                       clk_put(clk);
+                       return ret;
+               }
+       }
 
+       platform_device_register_simple("cpufreq-generic", -1, NULL, 0);
        return 0;
 }
 
-arch_initcall(armada_370_xp_cpu_pm_init);
-early_initcall(armada_370_xp_pmsu_init);
+device_initcall(armada_xp_pmsu_cpufreq_init);
index 07a737c6b95d15ecd4b8b4a6cbddaed0d1913959..6b58c1fe2b0d8e07ec10480100fbd95ba9e716c6 100644 (file)
 #define __MACH_MVEBU_PMSU_H
 
 int armada_xp_boot_cpu(unsigned int cpu_id, void *phys_addr);
+int mvebu_setup_boot_addr_wa(unsigned int crypto_eng_target,
+                             unsigned int crypto_eng_attribute,
+                             phys_addr_t resume_addr_reg);
+
+void mvebu_v7_pmsu_idle_exit(void);
 
 #endif /* __MACH_370_XP_PMSU_H */
index fc3de68d8c548a53cc56b581a4813d2dd3fcfc9f..a945756cfb45865d6fd0f9bd5927b6c6729e984d 100644 (file)
@@ -23,3 +23,39 @@ ARM_BE8(setend       be )                    @ go BE8 if entered LE
        b       cpu_resume
 ENDPROC(armada_370_xp_cpu_resume)
 
+ENTRY(armada_38x_cpu_resume)
+       /* do we need it for Armada 38x*/
+ARM_BE8(setend be )                    @ go BE8 if entered LE
+       bl      v7_invalidate_l1
+       mrc     p15, 4, r1, c15, c0     @ get SCU base address
+       orr     r1, r1, #0x8            @ SCU CPU Power Status Register
+       mrc     15, 0, r0, cr0, cr0, 5  @ get the CPU ID
+       and     r0, r0, #15
+       add     r1, r1, r0
+       mov     r0, #0x0
+       strb    r0, [r1]                @ switch SCU power state to Normal mode
+       b       cpu_resume
+ENDPROC(armada_38x_cpu_resume)
+
+.global mvebu_boot_wa_start
+.global mvebu_boot_wa_end
+
+/* The following code will be executed from SRAM */
+ENTRY(mvebu_boot_wa_start)
+mvebu_boot_wa_start:
+ARM_BE8(setend be)
+       adr     r0, 1f
+       ldr     r0, [r0]                @ load the address of the
+                                       @ resume register
+       ldr     r0, [r0]                @ load the value in the
+                                       @ resume register
+ARM_BE8(rev    r0, r0)                 @ the value is stored LE
+       mov     pc, r0                  @ jump to this value
+/*
+ * the last word of this piece of code will be filled by the physical
+ * address of the boot address register just after being copied in SRAM
+ */
+1:
+       .long   .
+mvebu_boot_wa_end:
+ENDPROC(mvebu_boot_wa_end)
index 0c5524ac75b75c4b00b1cb2ba2814e94be35bc2a..a068cb5c2ce809c285d254a3f6fb924bb9f4ed30 100644 (file)
 #include <linux/io.h>
 #include <linux/reboot.h>
 #include "common.h"
+#include "mvebu-soc-id.h"
+#include "pmsu.h"
+
+#define ARMADA_375_CRYPT0_ENG_TARGET 41
+#define ARMADA_375_CRYPT0_ENG_ATTR    1
 
 static void __iomem *system_controller_base;
+static phys_addr_t system_controller_phys_base;
 
 struct mvebu_system_controller {
        u32 rstoutn_mask_offset;
@@ -39,6 +45,9 @@ struct mvebu_system_controller {
        u32 system_soft_reset;
 
        u32 resume_boot_addr;
+
+       u32 dev_id;
+       u32 rev_id;
 };
 static struct mvebu_system_controller *mvebu_sc;
 
@@ -47,6 +56,8 @@ static const struct mvebu_system_controller armada_370_xp_system_controller = {
        .system_soft_reset_offset = 0x64,
        .rstoutn_mask_reset_out_en = 0x1,
        .system_soft_reset = 0x1,
+       .dev_id = 0x38,
+       .rev_id = 0x3c,
 };
 
 static const struct mvebu_system_controller armada_375_system_controller = {
@@ -55,6 +66,8 @@ static const struct mvebu_system_controller armada_375_system_controller = {
        .rstoutn_mask_reset_out_en = 0x1,
        .system_soft_reset = 0x1,
        .resume_boot_addr = 0xd4,
+       .dev_id = 0x38,
+       .rev_id = 0x3c,
 };
 
 static const struct mvebu_system_controller orion_system_controller = {
@@ -101,11 +114,45 @@ void mvebu_restart(enum reboot_mode mode, const char *cmd)
                ;
 }
 
+int mvebu_system_controller_get_soc_id(u32 *dev, u32 *rev)
+{
+       if (of_machine_is_compatible("marvell,armada380") &&
+               system_controller_base) {
+               *dev = readl(system_controller_base + mvebu_sc->dev_id) >> 16;
+               *rev = (readl(system_controller_base + mvebu_sc->rev_id) >> 8)
+                       & 0xF;
+               return 0;
+       } else
+               return -ENODEV;
+}
+
 #ifdef CONFIG_SMP
+void mvebu_armada375_smp_wa_init(void)
+{
+       u32 dev, rev;
+       phys_addr_t resume_addr_reg;
+
+       if (mvebu_get_soc_id(&dev, &rev) != 0)
+               return;
+
+       if (rev != ARMADA_375_Z1_REV)
+               return;
+
+       resume_addr_reg = system_controller_phys_base +
+               mvebu_sc->resume_boot_addr;
+       mvebu_setup_boot_addr_wa(ARMADA_375_CRYPT0_ENG_TARGET,
+                                ARMADA_375_CRYPT0_ENG_ATTR,
+                                resume_addr_reg);
+}
+
 void mvebu_system_controller_set_cpu_boot_addr(void *boot_addr)
 {
        BUG_ON(system_controller_base == NULL);
        BUG_ON(mvebu_sc->resume_boot_addr == 0);
+
+       if (of_machine_is_compatible("marvell,armada375"))
+               mvebu_armada375_smp_wa_init();
+
        writel(virt_to_phys(boot_addr), system_controller_base +
               mvebu_sc->resume_boot_addr);
 }
@@ -119,7 +166,10 @@ static int __init mvebu_system_controller_init(void)
        np = of_find_matching_node_and_match(NULL, of_system_controller_table,
                                             &match);
        if (np) {
+               struct resource res;
                system_controller_base = of_iomap(np, 0);
+               of_address_to_resource(np, 0, &res);
+               system_controller_phys_base = res.start;
                mvebu_sc = (struct mvebu_system_controller *)match->data;
                of_node_put(np);
        }
index 238170cab5b76cecfc20750970cf281f7cda7a76..44a3d19eb481b71f783794c71ba7ce02a37590b9 100644 (file)
@@ -55,7 +55,6 @@ static struct clk *ocpi_ck;
 
 /*
  * Enables device access to OMAP buses via the OCPI bridge
- * FIXME: Add locking
  */
 int ocpi_enable(void)
 {
index fa780001575309e0c3ca38b2cb970c03e478a72f..69bbcba8842f7316013e2ca1c0a3ee554c959d4d 100644 (file)
@@ -176,13 +176,11 @@ obj-$(CONFIG_SOC_DRA7XX)          += clockdomains7xx_data.o
 
 # Clock framework
 obj-$(CONFIG_ARCH_OMAP2)               += $(clock-common) clock2xxx.o
-obj-$(CONFIG_ARCH_OMAP2)               += clkt2xxx_sys.o
 obj-$(CONFIG_ARCH_OMAP2)               += clkt2xxx_dpllcore.o
 obj-$(CONFIG_ARCH_OMAP2)               += clkt2xxx_virt_prcm_set.o
-obj-$(CONFIG_ARCH_OMAP2)               += clkt2xxx_apll.o clkt2xxx_osc.o
+obj-$(CONFIG_ARCH_OMAP2)               += clkt2xxx_apll.o
 obj-$(CONFIG_ARCH_OMAP2)               += clkt2xxx_dpll.o clkt_iclk.o
-obj-$(CONFIG_SOC_OMAP2420)             += cclock2420_data.o
-obj-$(CONFIG_SOC_OMAP2430)             += clock2430.o cclock2430_data.o
+obj-$(CONFIG_SOC_OMAP2430)             += clock2430.o
 obj-$(CONFIG_ARCH_OMAP3)               += $(clock-common) clock3xxx.o
 obj-$(CONFIG_ARCH_OMAP3)               += clock34xx.o clkt34xx_dpll3m2.o
 obj-$(CONFIG_ARCH_OMAP3)               += clock3517.o clock36xx.o
@@ -202,6 +200,7 @@ obj-$(CONFIG_SOC_OMAP2420)          += opp2420_data.o
 obj-$(CONFIG_SOC_OMAP2430)             += opp2430_data.o
 
 # hwmod data
+obj-y                                  += omap_hwmod_common_ipblock_data.o
 obj-$(CONFIG_SOC_OMAP2420)             += omap_hwmod_2xxx_ipblock_data.o
 obj-$(CONFIG_SOC_OMAP2420)             += omap_hwmod_2xxx_3xxx_ipblock_data.o
 obj-$(CONFIG_SOC_OMAP2420)             += omap_hwmod_2xxx_interconnect_data.o
diff --git a/arch/arm/mach-omap2/cclock2420_data.c b/arch/arm/mach-omap2/cclock2420_data.c
deleted file mode 100644 (file)
index 3662f4d..0000000
+++ /dev/null
@@ -1,1931 +0,0 @@
-/*
- * OMAP2420 clock data
- *
- * Copyright (C) 2005-2012 Texas Instruments, Inc.
- * Copyright (C) 2004-2011 Nokia Corporation
- *
- * Contacts:
- * Richard Woodruff <r-woodruff2@ti.com>
- * Paul Walmsley
- * Updated to COMMON clk format by Rajendra Nayak <rnayak@ti.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#include <linux/kernel.h>
-#include <linux/io.h>
-#include <linux/clk.h>
-#include <linux/clk-private.h>
-#include <linux/list.h>
-
-#include "soc.h"
-#include "iomap.h"
-#include "clock.h"
-#include "clock2xxx.h"
-#include "opp2xxx.h"
-#include "cm2xxx.h"
-#include "prm2xxx.h"
-#include "prm-regbits-24xx.h"
-#include "cm-regbits-24xx.h"
-#include "sdrc.h"
-#include "control.h"
-
-#define OMAP_CM_REGADDR                 OMAP2420_CM_REGADDR
-
-/*
- * 2420 clock tree.
- *
- * NOTE:In many cases here we are assigning a 'default' parent. In
- *     many cases the parent is selectable. The set parent calls will
- *     also switch sources.
- *
- *     Several sources are given initial rates which may be wrong, this will
- *     be fixed up in the init func.
- *
- *     Things are broadly separated below by clock domains. It is
- *     noteworthy that most peripherals have dependencies on multiple clock
- *     domains. Many get their interface clocks from the L4 domain, but get
- *     functional clocks from fixed sources or other core domain derived
- *     clocks.
- */
-
-DEFINE_CLK_FIXED_RATE(alt_ck, CLK_IS_ROOT, 54000000, 0x0);
-
-DEFINE_CLK_FIXED_RATE(func_32k_ck, CLK_IS_ROOT, 32768, 0x0);
-
-DEFINE_CLK_FIXED_RATE(mcbsp_clks, CLK_IS_ROOT, 0x0, 0x0);
-
-static struct clk osc_ck;
-
-static const struct clk_ops osc_ck_ops = {
-       .recalc_rate    = &omap2_osc_clk_recalc,
-};
-
-static struct clk_hw_omap osc_ck_hw = {
-       .hw = {
-               .clk = &osc_ck,
-       },
-};
-
-static struct clk osc_ck = {
-       .name   = "osc_ck",
-       .ops    = &osc_ck_ops,
-       .hw     = &osc_ck_hw.hw,
-       .flags  = CLK_IS_ROOT,
-};
-
-DEFINE_CLK_FIXED_RATE(secure_32k_ck, CLK_IS_ROOT, 32768, 0x0);
-
-static struct clk sys_ck;
-
-static const char *sys_ck_parent_names[] = {
-       "osc_ck",
-};
-
-static const struct clk_ops sys_ck_ops = {
-       .init           = &omap2_init_clk_clkdm,
-       .recalc_rate    = &omap2xxx_sys_clk_recalc,
-};
-
-DEFINE_STRUCT_CLK_HW_OMAP(sys_ck, "wkup_clkdm");
-DEFINE_STRUCT_CLK(sys_ck, sys_ck_parent_names, sys_ck_ops);
-
-static struct dpll_data dpll_dd = {
-       .mult_div1_reg  = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
-       .mult_mask      = OMAP24XX_DPLL_MULT_MASK,
-       .div1_mask      = OMAP24XX_DPLL_DIV_MASK,
-       .clk_bypass     = &sys_ck,
-       .clk_ref        = &sys_ck,
-       .control_reg    = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
-       .enable_mask    = OMAP24XX_EN_DPLL_MASK,
-       .max_multiplier = 1023,
-       .min_divider    = 1,
-       .max_divider    = 16,
-};
-
-static struct clk dpll_ck;
-
-static const char *dpll_ck_parent_names[] = {
-       "sys_ck",
-};
-
-static const struct clk_ops dpll_ck_ops = {
-       .init           = &omap2_init_clk_clkdm,
-       .get_parent     = &omap2_init_dpll_parent,
-       .recalc_rate    = &omap2_dpllcore_recalc,
-       .round_rate     = &omap2_dpll_round_rate,
-       .set_rate       = &omap2_reprogram_dpllcore,
-};
-
-static struct clk_hw_omap dpll_ck_hw = {
-       .hw = {
-               .clk = &dpll_ck,
-       },
-       .ops            = &clkhwops_omap2xxx_dpll,
-       .dpll_data      = &dpll_dd,
-       .clkdm_name     = "wkup_clkdm",
-};
-
-DEFINE_STRUCT_CLK(dpll_ck, dpll_ck_parent_names, dpll_ck_ops);
-
-static struct clk core_ck;
-
-static const char *core_ck_parent_names[] = {
-       "dpll_ck",
-};
-
-static const struct clk_ops core_ck_ops = {
-       .init           = &omap2_init_clk_clkdm,
-};
-
-DEFINE_STRUCT_CLK_HW_OMAP(core_ck, "wkup_clkdm");
-DEFINE_STRUCT_CLK(core_ck, core_ck_parent_names, core_ck_ops);
-
-DEFINE_CLK_DIVIDER(core_l3_ck, "core_ck", &core_ck, 0x0,
-                  OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
-                  OMAP24XX_CLKSEL_L3_SHIFT, OMAP24XX_CLKSEL_L3_WIDTH,
-                  CLK_DIVIDER_ONE_BASED, NULL);
-
-DEFINE_CLK_DIVIDER(l4_ck, "core_l3_ck", &core_l3_ck, 0x0,
-                  OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
-                  OMAP24XX_CLKSEL_L4_SHIFT, OMAP24XX_CLKSEL_L4_WIDTH,
-                  CLK_DIVIDER_ONE_BASED, NULL);
-
-static struct clk aes_ick;
-
-static const char *aes_ick_parent_names[] = {
-       "l4_ck",
-};
-
-static const struct clk_ops aes_ick_ops = {
-       .init           = &omap2_init_clk_clkdm,
-       .enable         = &omap2_dflt_clk_enable,
-       .disable        = &omap2_dflt_clk_disable,
-       .is_enabled     = &omap2_dflt_clk_is_enabled,
-};
-
-static struct clk_hw_omap aes_ick_hw = {
-       .hw = {
-               .clk = &aes_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4),
-       .enable_bit     = OMAP24XX_EN_AES_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(aes_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk apll54_ck;
-
-static const struct clk_ops apll54_ck_ops = {
-       .init           = &omap2_init_clk_clkdm,
-       .enable         = &omap2_clk_apll54_enable,
-       .disable        = &omap2_clk_apll54_disable,
-       .recalc_rate    = &omap2_clk_apll54_recalc,
-};
-
-static struct clk_hw_omap apll54_ck_hw = {
-       .hw = {
-               .clk = &apll54_ck,
-       },
-       .ops            = &clkhwops_apll54,
-       .enable_reg     = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
-       .enable_bit     = OMAP24XX_EN_54M_PLL_SHIFT,
-       .flags          = ENABLE_ON_INIT,
-       .clkdm_name     = "wkup_clkdm",
-};
-
-DEFINE_STRUCT_CLK(apll54_ck, dpll_ck_parent_names, apll54_ck_ops);
-
-static struct clk apll96_ck;
-
-static const struct clk_ops apll96_ck_ops = {
-       .init           = &omap2_init_clk_clkdm,
-       .enable         = &omap2_clk_apll96_enable,
-       .disable        = &omap2_clk_apll96_disable,
-       .recalc_rate    = &omap2_clk_apll96_recalc,
-};
-
-static struct clk_hw_omap apll96_ck_hw = {
-       .hw = {
-               .clk = &apll96_ck,
-       },
-       .ops            = &clkhwops_apll96,
-       .enable_reg     = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
-       .enable_bit     = OMAP24XX_EN_96M_PLL_SHIFT,
-       .flags          = ENABLE_ON_INIT,
-       .clkdm_name     = "wkup_clkdm",
-};
-
-DEFINE_STRUCT_CLK(apll96_ck, dpll_ck_parent_names, apll96_ck_ops);
-
-static struct clk func_96m_ck;
-
-static const char *func_96m_ck_parent_names[] = {
-       "apll96_ck",
-};
-
-DEFINE_STRUCT_CLK_HW_OMAP(func_96m_ck, "wkup_clkdm");
-DEFINE_STRUCT_CLK(func_96m_ck, func_96m_ck_parent_names, core_ck_ops);
-
-static struct clk cam_fck;
-
-static const char *cam_fck_parent_names[] = {
-       "func_96m_ck",
-};
-
-static struct clk_hw_omap cam_fck_hw = {
-       .hw = {
-               .clk = &cam_fck,
-       },
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-       .enable_bit     = OMAP24XX_EN_CAM_SHIFT,
-       .clkdm_name     = "core_l3_clkdm",
-};
-
-DEFINE_STRUCT_CLK(cam_fck, cam_fck_parent_names, aes_ick_ops);
-
-static struct clk cam_ick;
-
-static struct clk_hw_omap cam_ick_hw = {
-       .hw = {
-               .clk = &cam_ick,
-       },
-       .ops            = &clkhwops_iclk,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_CAM_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(cam_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk des_ick;
-
-static struct clk_hw_omap des_ick_hw = {
-       .hw = {
-               .clk = &des_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4),
-       .enable_bit     = OMAP24XX_EN_DES_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(des_ick, aes_ick_parent_names, aes_ick_ops);
-
-static const struct clksel_rate dsp_fck_core_rates[] = {
-       { .div = 1, .val = 1, .flags = RATE_IN_24XX },
-       { .div = 2, .val = 2, .flags = RATE_IN_24XX },
-       { .div = 3, .val = 3, .flags = RATE_IN_24XX },
-       { .div = 4, .val = 4, .flags = RATE_IN_24XX },
-       { .div = 6, .val = 6, .flags = RATE_IN_242X },
-       { .div = 8, .val = 8, .flags = RATE_IN_242X },
-       { .div = 12, .val = 12, .flags = RATE_IN_242X },
-       { .div = 0 }
-};
-
-static const struct clksel dsp_fck_clksel[] = {
-       { .parent = &core_ck, .rates = dsp_fck_core_rates },
-       { .parent = NULL },
-};
-
-static const char *dsp_fck_parent_names[] = {
-       "core_ck",
-};
-
-static const struct clk_ops dsp_fck_ops = {
-       .init           = &omap2_init_clk_clkdm,
-       .enable         = &omap2_dflt_clk_enable,
-       .disable        = &omap2_dflt_clk_disable,
-       .is_enabled     = &omap2_dflt_clk_is_enabled,
-       .recalc_rate    = &omap2_clksel_recalc,
-       .set_rate       = &omap2_clksel_set_rate,
-       .round_rate     = &omap2_clksel_round_rate,
-};
-
-DEFINE_CLK_OMAP_MUX_GATE(dsp_fck, "dsp_clkdm", dsp_fck_clksel,
-                        OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_CLKSEL),
-                        OMAP24XX_CLKSEL_DSP_MASK,
-                        OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_FCLKEN),
-                        OMAP24XX_CM_FCLKEN_DSP_EN_DSP_SHIFT, &clkhwops_wait,
-                        dsp_fck_parent_names, dsp_fck_ops);
-
-static const struct clksel dsp_ick_clksel[] = {
-       { .parent = &dsp_fck, .rates = dsp_ick_rates },
-       { .parent = NULL },
-};
-
-static const char *dsp_ick_parent_names[] = {
-       "dsp_fck",
-};
-
-DEFINE_CLK_OMAP_MUX_GATE(dsp_ick, "dsp_clkdm", dsp_ick_clksel,
-                        OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_CLKSEL),
-                        OMAP24XX_CLKSEL_DSP_IF_MASK,
-                        OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_ICLKEN),
-                        OMAP2420_EN_DSP_IPI_SHIFT, &clkhwops_iclk_wait,
-                        dsp_ick_parent_names, dsp_fck_ops);
-
-static const struct clksel_rate dss1_fck_sys_rates[] = {
-       { .div = 1, .val = 0, .flags = RATE_IN_24XX },
-       { .div = 0 }
-};
-
-static const struct clksel_rate dss1_fck_core_rates[] = {
-       { .div = 1, .val = 1, .flags = RATE_IN_24XX },
-       { .div = 2, .val = 2, .flags = RATE_IN_24XX },
-       { .div = 3, .val = 3, .flags = RATE_IN_24XX },
-       { .div = 4, .val = 4, .flags = RATE_IN_24XX },
-       { .div = 5, .val = 5, .flags = RATE_IN_24XX },
-       { .div = 6, .val = 6, .flags = RATE_IN_24XX },
-       { .div = 8, .val = 8, .flags = RATE_IN_24XX },
-       { .div = 9, .val = 9, .flags = RATE_IN_24XX },
-       { .div = 12, .val = 12, .flags = RATE_IN_24XX },
-       { .div = 16, .val = 16, .flags = RATE_IN_24XX },
-       { .div = 0 }
-};
-
-static const struct clksel dss1_fck_clksel[] = {
-       { .parent = &sys_ck, .rates = dss1_fck_sys_rates },
-       { .parent = &core_ck, .rates = dss1_fck_core_rates },
-       { .parent = NULL },
-};
-
-static const char *dss1_fck_parent_names[] = {
-       "sys_ck", "core_ck",
-};
-
-static struct clk dss1_fck;
-
-static const struct clk_ops dss1_fck_ops = {
-       .init           = &omap2_init_clk_clkdm,
-       .enable         = &omap2_dflt_clk_enable,
-       .disable        = &omap2_dflt_clk_disable,
-       .is_enabled     = &omap2_dflt_clk_is_enabled,
-       .recalc_rate    = &omap2_clksel_recalc,
-       .get_parent     = &omap2_clksel_find_parent_index,
-       .set_parent     = &omap2_clksel_set_parent,
-};
-
-DEFINE_CLK_OMAP_MUX_GATE(dss1_fck, "dss_clkdm", dss1_fck_clksel,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
-                        OMAP24XX_CLKSEL_DSS1_MASK,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-                        OMAP24XX_EN_DSS1_SHIFT, NULL,
-                        dss1_fck_parent_names, dss1_fck_ops);
-
-static const struct clksel_rate dss2_fck_sys_rates[] = {
-       { .div = 1, .val = 0, .flags = RATE_IN_24XX },
-       { .div = 0 }
-};
-
-static const struct clksel_rate dss2_fck_48m_rates[] = {
-       { .div = 1, .val = 1, .flags = RATE_IN_24XX },
-       { .div = 0 }
-};
-
-static const struct clksel_rate func_48m_apll96_rates[] = {
-       { .div = 2, .val = 0, .flags = RATE_IN_24XX },
-       { .div = 0 }
-};
-
-static const struct clksel_rate func_48m_alt_rates[] = {
-       { .div = 1, .val = 1, .flags = RATE_IN_24XX },
-       { .div = 0 }
-};
-
-static const struct clksel func_48m_clksel[] = {
-       { .parent = &apll96_ck, .rates = func_48m_apll96_rates },
-       { .parent = &alt_ck, .rates = func_48m_alt_rates },
-       { .parent = NULL },
-};
-
-static const char *func_48m_ck_parent_names[] = {
-       "apll96_ck", "alt_ck",
-};
-
-static struct clk func_48m_ck;
-
-static const struct clk_ops func_48m_ck_ops = {
-       .init           = &omap2_init_clk_clkdm,
-       .recalc_rate    = &omap2_clksel_recalc,
-       .set_rate       = &omap2_clksel_set_rate,
-       .round_rate     = &omap2_clksel_round_rate,
-       .get_parent     = &omap2_clksel_find_parent_index,
-       .set_parent     = &omap2_clksel_set_parent,
-};
-
-static struct clk_hw_omap func_48m_ck_hw = {
-       .hw = {
-               .clk = &func_48m_ck,
-       },
-       .clksel         = func_48m_clksel,
-       .clksel_reg     = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
-       .clksel_mask    = OMAP24XX_48M_SOURCE_MASK,
-       .clkdm_name     = "wkup_clkdm",
-};
-
-DEFINE_STRUCT_CLK(func_48m_ck, func_48m_ck_parent_names, func_48m_ck_ops);
-
-static const struct clksel dss2_fck_clksel[] = {
-       { .parent = &sys_ck, .rates = dss2_fck_sys_rates },
-       { .parent = &func_48m_ck, .rates = dss2_fck_48m_rates },
-       { .parent = NULL },
-};
-
-static const char *dss2_fck_parent_names[] = {
-       "sys_ck", "func_48m_ck",
-};
-
-DEFINE_CLK_OMAP_MUX_GATE(dss2_fck, "dss_clkdm", dss2_fck_clksel,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
-                        OMAP24XX_CLKSEL_DSS2_MASK,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-                        OMAP24XX_EN_DSS2_SHIFT, NULL,
-                        dss2_fck_parent_names, dss1_fck_ops);
-
-static const char *func_54m_ck_parent_names[] = {
-       "apll54_ck", "alt_ck",
-};
-
-DEFINE_CLK_MUX(func_54m_ck, func_54m_ck_parent_names, NULL, 0x0,
-              OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
-              OMAP24XX_54M_SOURCE_SHIFT, OMAP24XX_54M_SOURCE_WIDTH,
-              0x0, NULL);
-
-static struct clk dss_54m_fck;
-
-static const char *dss_54m_fck_parent_names[] = {
-       "func_54m_ck",
-};
-
-static struct clk_hw_omap dss_54m_fck_hw = {
-       .hw = {
-               .clk = &dss_54m_fck,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-       .enable_bit     = OMAP24XX_EN_TV_SHIFT,
-       .clkdm_name     = "dss_clkdm",
-};
-
-DEFINE_STRUCT_CLK(dss_54m_fck, dss_54m_fck_parent_names, aes_ick_ops);
-
-static struct clk dss_ick;
-
-static struct clk_hw_omap dss_ick_hw = {
-       .hw = {
-               .clk = &dss_ick,
-       },
-       .ops            = &clkhwops_iclk,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_DSS1_SHIFT,
-       .clkdm_name     = "dss_clkdm",
-};
-
-DEFINE_STRUCT_CLK(dss_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk eac_fck;
-
-static struct clk_hw_omap eac_fck_hw = {
-       .hw = {
-               .clk = &eac_fck,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-       .enable_bit     = OMAP2420_EN_EAC_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(eac_fck, cam_fck_parent_names, aes_ick_ops);
-
-static struct clk eac_ick;
-
-static struct clk_hw_omap eac_ick_hw = {
-       .hw = {
-               .clk = &eac_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP2420_EN_EAC_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(eac_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk emul_ck;
-
-static struct clk_hw_omap emul_ck_hw = {
-       .hw = {
-               .clk = &emul_ck,
-       },
-       .enable_reg     = OMAP2420_PRCM_CLKEMUL_CTRL,
-       .enable_bit     = OMAP24XX_EMULATION_EN_SHIFT,
-       .clkdm_name     = "wkup_clkdm",
-};
-
-DEFINE_STRUCT_CLK(emul_ck, dss_54m_fck_parent_names, aes_ick_ops);
-
-DEFINE_CLK_FIXED_FACTOR(func_12m_ck, "func_48m_ck", &func_48m_ck, 0x0, 1, 4);
-
-static struct clk fac_fck;
-
-static const char *fac_fck_parent_names[] = {
-       "func_12m_ck",
-};
-
-static struct clk_hw_omap fac_fck_hw = {
-       .hw = {
-               .clk = &fac_fck,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-       .enable_bit     = OMAP24XX_EN_FAC_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(fac_fck, fac_fck_parent_names, aes_ick_ops);
-
-static struct clk fac_ick;
-
-static struct clk_hw_omap fac_ick_hw = {
-       .hw = {
-               .clk = &fac_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_FAC_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(fac_ick, aes_ick_parent_names, aes_ick_ops);
-
-static const struct clksel gfx_fck_clksel[] = {
-       { .parent = &core_l3_ck, .rates = gfx_l3_rates },
-       { .parent = NULL },
-};
-
-static const char *gfx_2d_fck_parent_names[] = {
-       "core_l3_ck",
-};
-
-DEFINE_CLK_OMAP_MUX_GATE(gfx_2d_fck, "gfx_clkdm", gfx_fck_clksel,
-                        OMAP_CM_REGADDR(GFX_MOD, CM_CLKSEL),
-                        OMAP_CLKSEL_GFX_MASK,
-                        OMAP_CM_REGADDR(GFX_MOD, CM_FCLKEN),
-                        OMAP24XX_EN_2D_SHIFT, &clkhwops_wait,
-                        gfx_2d_fck_parent_names, dsp_fck_ops);
-
-DEFINE_CLK_OMAP_MUX_GATE(gfx_3d_fck, "gfx_clkdm", gfx_fck_clksel,
-                        OMAP_CM_REGADDR(GFX_MOD, CM_CLKSEL),
-                        OMAP_CLKSEL_GFX_MASK,
-                        OMAP_CM_REGADDR(GFX_MOD, CM_FCLKEN),
-                        OMAP24XX_EN_3D_SHIFT, &clkhwops_wait,
-                        gfx_2d_fck_parent_names, dsp_fck_ops);
-
-static struct clk gfx_ick;
-
-static const char *gfx_ick_parent_names[] = {
-       "core_l3_ck",
-};
-
-static struct clk_hw_omap gfx_ick_hw = {
-       .hw = {
-               .clk = &gfx_ick,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(GFX_MOD, CM_ICLKEN),
-       .enable_bit     = OMAP_EN_GFX_SHIFT,
-       .clkdm_name     = "gfx_clkdm",
-};
-
-DEFINE_STRUCT_CLK(gfx_ick, gfx_ick_parent_names, aes_ick_ops);
-
-static struct clk gpios_fck;
-
-static const char *gpios_fck_parent_names[] = {
-       "func_32k_ck",
-};
-
-static struct clk_hw_omap gpios_fck_hw = {
-       .hw = {
-               .clk = &gpios_fck,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
-       .enable_bit     = OMAP24XX_EN_GPIOS_SHIFT,
-       .clkdm_name     = "wkup_clkdm",
-};
-
-DEFINE_STRUCT_CLK(gpios_fck, gpios_fck_parent_names, aes_ick_ops);
-
-static struct clk gpios_ick;
-
-static const char *gpios_ick_parent_names[] = {
-       "sys_ck",
-};
-
-static struct clk_hw_omap gpios_ick_hw = {
-       .hw = {
-               .clk = &gpios_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
-       .enable_bit     = OMAP24XX_EN_GPIOS_SHIFT,
-       .clkdm_name     = "wkup_clkdm",
-};
-
-DEFINE_STRUCT_CLK(gpios_ick, gpios_ick_parent_names, aes_ick_ops);
-
-static struct clk gpmc_fck;
-
-static struct clk_hw_omap gpmc_fck_hw = {
-       .hw = {
-               .clk = &gpmc_fck,
-       },
-       .ops            = &clkhwops_iclk,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3),
-       .enable_bit     = OMAP24XX_AUTO_GPMC_SHIFT,
-       .flags          = ENABLE_ON_INIT,
-       .clkdm_name     = "core_l3_clkdm",
-};
-
-DEFINE_STRUCT_CLK(gpmc_fck, gfx_ick_parent_names, core_ck_ops);
-
-static const struct clksel_rate gpt_alt_rates[] = {
-       { .div = 1, .val = 2, .flags = RATE_IN_24XX },
-       { .div = 0 }
-};
-
-static const struct clksel omap24xx_gpt_clksel[] = {
-       { .parent = &func_32k_ck, .rates = gpt_32k_rates },
-       { .parent = &sys_ck, .rates = gpt_sys_rates },
-       { .parent = &alt_ck, .rates = gpt_alt_rates },
-       { .parent = NULL },
-};
-
-static const char *gpt10_fck_parent_names[] = {
-       "func_32k_ck", "sys_ck", "alt_ck",
-};
-
-DEFINE_CLK_OMAP_MUX_GATE(gpt10_fck, "core_l4_clkdm", omap24xx_gpt_clksel,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
-                        OMAP24XX_CLKSEL_GPT10_MASK,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-                        OMAP24XX_EN_GPT10_SHIFT, &clkhwops_wait,
-                        gpt10_fck_parent_names, dss1_fck_ops);
-
-static struct clk gpt10_ick;
-
-static struct clk_hw_omap gpt10_ick_hw = {
-       .hw = {
-               .clk = &gpt10_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_GPT10_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(gpt10_ick, aes_ick_parent_names, aes_ick_ops);
-
-DEFINE_CLK_OMAP_MUX_GATE(gpt11_fck, "core_l4_clkdm", omap24xx_gpt_clksel,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
-                        OMAP24XX_CLKSEL_GPT11_MASK,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-                        OMAP24XX_EN_GPT11_SHIFT, &clkhwops_wait,
-                        gpt10_fck_parent_names, dss1_fck_ops);
-
-static struct clk gpt11_ick;
-
-static struct clk_hw_omap gpt11_ick_hw = {
-       .hw = {
-               .clk = &gpt11_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_GPT11_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(gpt11_ick, aes_ick_parent_names, aes_ick_ops);
-
-DEFINE_CLK_OMAP_MUX_GATE(gpt12_fck, "core_l4_clkdm", omap24xx_gpt_clksel,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
-                        OMAP24XX_CLKSEL_GPT12_MASK,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-                        OMAP24XX_EN_GPT12_SHIFT, &clkhwops_wait,
-                        gpt10_fck_parent_names, dss1_fck_ops);
-
-static struct clk gpt12_ick;
-
-static struct clk_hw_omap gpt12_ick_hw = {
-       .hw = {
-               .clk = &gpt12_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_GPT12_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(gpt12_ick, aes_ick_parent_names, aes_ick_ops);
-
-static const struct clk_ops gpt1_fck_ops = {
-       .init           = &omap2_init_clk_clkdm,
-       .enable         = &omap2_dflt_clk_enable,
-       .disable        = &omap2_dflt_clk_disable,
-       .is_enabled     = &omap2_dflt_clk_is_enabled,
-       .recalc_rate    = &omap2_clksel_recalc,
-       .set_rate       = &omap2_clksel_set_rate,
-       .round_rate     = &omap2_clksel_round_rate,
-       .get_parent     = &omap2_clksel_find_parent_index,
-       .set_parent     = &omap2_clksel_set_parent,
-};
-
-DEFINE_CLK_OMAP_MUX_GATE(gpt1_fck, "core_l4_clkdm", omap24xx_gpt_clksel,
-                        OMAP_CM_REGADDR(WKUP_MOD, CM_CLKSEL1),
-                        OMAP24XX_CLKSEL_GPT1_MASK,
-                        OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
-                        OMAP24XX_EN_GPT1_SHIFT, &clkhwops_wait,
-                        gpt10_fck_parent_names, gpt1_fck_ops);
-
-static struct clk gpt1_ick;
-
-static struct clk_hw_omap gpt1_ick_hw = {
-       .hw = {
-               .clk = &gpt1_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
-       .enable_bit     = OMAP24XX_EN_GPT1_SHIFT,
-       .clkdm_name     = "wkup_clkdm",
-};
-
-DEFINE_STRUCT_CLK(gpt1_ick, gpios_ick_parent_names, aes_ick_ops);
-
-DEFINE_CLK_OMAP_MUX_GATE(gpt2_fck, "core_l4_clkdm", omap24xx_gpt_clksel,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
-                        OMAP24XX_CLKSEL_GPT2_MASK,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-                        OMAP24XX_EN_GPT2_SHIFT, &clkhwops_wait,
-                        gpt10_fck_parent_names, dss1_fck_ops);
-
-static struct clk gpt2_ick;
-
-static struct clk_hw_omap gpt2_ick_hw = {
-       .hw = {
-               .clk = &gpt2_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_GPT2_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(gpt2_ick, aes_ick_parent_names, aes_ick_ops);
-
-DEFINE_CLK_OMAP_MUX_GATE(gpt3_fck, "core_l4_clkdm", omap24xx_gpt_clksel,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
-                        OMAP24XX_CLKSEL_GPT3_MASK,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-                        OMAP24XX_EN_GPT3_SHIFT, &clkhwops_wait,
-                        gpt10_fck_parent_names, dss1_fck_ops);
-
-static struct clk gpt3_ick;
-
-static struct clk_hw_omap gpt3_ick_hw = {
-       .hw = {
-               .clk = &gpt3_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_GPT3_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(gpt3_ick, aes_ick_parent_names, aes_ick_ops);
-
-DEFINE_CLK_OMAP_MUX_GATE(gpt4_fck, "core_l4_clkdm", omap24xx_gpt_clksel,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
-                        OMAP24XX_CLKSEL_GPT4_MASK,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-                        OMAP24XX_EN_GPT4_SHIFT, &clkhwops_wait,
-                        gpt10_fck_parent_names, dss1_fck_ops);
-
-static struct clk gpt4_ick;
-
-static struct clk_hw_omap gpt4_ick_hw = {
-       .hw = {
-               .clk = &gpt4_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_GPT4_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(gpt4_ick, aes_ick_parent_names, aes_ick_ops);
-
-DEFINE_CLK_OMAP_MUX_GATE(gpt5_fck, "core_l4_clkdm", omap24xx_gpt_clksel,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
-                        OMAP24XX_CLKSEL_GPT5_MASK,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-                        OMAP24XX_EN_GPT5_SHIFT, &clkhwops_wait,
-                        gpt10_fck_parent_names, dss1_fck_ops);
-
-static struct clk gpt5_ick;
-
-static struct clk_hw_omap gpt5_ick_hw = {
-       .hw = {
-               .clk = &gpt5_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_GPT5_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(gpt5_ick, aes_ick_parent_names, aes_ick_ops);
-
-DEFINE_CLK_OMAP_MUX_GATE(gpt6_fck, "core_l4_clkdm", omap24xx_gpt_clksel,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
-                        OMAP24XX_CLKSEL_GPT6_MASK,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-                        OMAP24XX_EN_GPT6_SHIFT, &clkhwops_wait,
-                        gpt10_fck_parent_names, dss1_fck_ops);
-
-static struct clk gpt6_ick;
-
-static struct clk_hw_omap gpt6_ick_hw = {
-       .hw = {
-               .clk = &gpt6_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_GPT6_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(gpt6_ick, aes_ick_parent_names, aes_ick_ops);
-
-DEFINE_CLK_OMAP_MUX_GATE(gpt7_fck, "core_l4_clkdm", omap24xx_gpt_clksel,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
-                        OMAP24XX_CLKSEL_GPT7_MASK,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-                        OMAP24XX_EN_GPT7_SHIFT, &clkhwops_wait,
-                        gpt10_fck_parent_names, dss1_fck_ops);
-
-static struct clk gpt7_ick;
-
-static struct clk_hw_omap gpt7_ick_hw = {
-       .hw = {
-               .clk = &gpt7_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_GPT7_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(gpt7_ick, aes_ick_parent_names, aes_ick_ops);
-
-DEFINE_CLK_OMAP_MUX_GATE(gpt8_fck, "core_l4_clkdm", omap24xx_gpt_clksel,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
-                        OMAP24XX_CLKSEL_GPT8_MASK,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-                        OMAP24XX_EN_GPT8_SHIFT, &clkhwops_wait,
-                        gpt10_fck_parent_names, dss1_fck_ops);
-
-static struct clk gpt8_ick;
-
-static struct clk_hw_omap gpt8_ick_hw = {
-       .hw = {
-               .clk = &gpt8_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_GPT8_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(gpt8_ick, aes_ick_parent_names, aes_ick_ops);
-
-DEFINE_CLK_OMAP_MUX_GATE(gpt9_fck, "core_l4_clkdm", omap24xx_gpt_clksel,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
-                        OMAP24XX_CLKSEL_GPT9_MASK,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-                        OMAP24XX_EN_GPT9_SHIFT, &clkhwops_wait,
-                        gpt10_fck_parent_names, dss1_fck_ops);
-
-static struct clk gpt9_ick;
-
-static struct clk_hw_omap gpt9_ick_hw = {
-       .hw = {
-               .clk = &gpt9_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_GPT9_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(gpt9_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk hdq_fck;
-
-static struct clk_hw_omap hdq_fck_hw = {
-       .hw = {
-               .clk = &hdq_fck,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-       .enable_bit     = OMAP24XX_EN_HDQ_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(hdq_fck, fac_fck_parent_names, aes_ick_ops);
-
-static struct clk hdq_ick;
-
-static struct clk_hw_omap hdq_ick_hw = {
-       .hw = {
-               .clk = &hdq_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_HDQ_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(hdq_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk i2c1_fck;
-
-static struct clk_hw_omap i2c1_fck_hw = {
-       .hw = {
-               .clk = &i2c1_fck,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-       .enable_bit     = OMAP2420_EN_I2C1_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(i2c1_fck, fac_fck_parent_names, aes_ick_ops);
-
-static struct clk i2c1_ick;
-
-static struct clk_hw_omap i2c1_ick_hw = {
-       .hw = {
-               .clk = &i2c1_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP2420_EN_I2C1_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(i2c1_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk i2c2_fck;
-
-static struct clk_hw_omap i2c2_fck_hw = {
-       .hw = {
-               .clk = &i2c2_fck,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-       .enable_bit     = OMAP2420_EN_I2C2_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(i2c2_fck, fac_fck_parent_names, aes_ick_ops);
-
-static struct clk i2c2_ick;
-
-static struct clk_hw_omap i2c2_ick_hw = {
-       .hw = {
-               .clk = &i2c2_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP2420_EN_I2C2_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(i2c2_ick, aes_ick_parent_names, aes_ick_ops);
-
-DEFINE_CLK_OMAP_MUX_GATE(iva1_ifck, "iva1_clkdm", dsp_fck_clksel,
-                        OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_CLKSEL),
-                        OMAP2420_CLKSEL_IVA_MASK,
-                        OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_FCLKEN),
-                        OMAP2420_EN_IVA_COP_SHIFT, &clkhwops_wait,
-                        dsp_fck_parent_names, dsp_fck_ops);
-
-static struct clk iva1_mpu_int_ifck;
-
-static const char *iva1_mpu_int_ifck_parent_names[] = {
-       "iva1_ifck",
-};
-
-static const struct clk_ops iva1_mpu_int_ifck_ops = {
-       .init           = &omap2_init_clk_clkdm,
-       .enable         = &omap2_dflt_clk_enable,
-       .disable        = &omap2_dflt_clk_disable,
-       .is_enabled     = &omap2_dflt_clk_is_enabled,
-       .recalc_rate    = &omap_fixed_divisor_recalc,
-};
-
-static struct clk_hw_omap iva1_mpu_int_ifck_hw = {
-       .hw = {
-               .clk = &iva1_mpu_int_ifck,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_FCLKEN),
-       .enable_bit     = OMAP2420_EN_IVA_MPU_SHIFT,
-       .clkdm_name     = "iva1_clkdm",
-       .fixed_div      = 2,
-};
-
-DEFINE_STRUCT_CLK(iva1_mpu_int_ifck, iva1_mpu_int_ifck_parent_names,
-                 iva1_mpu_int_ifck_ops);
-
-static struct clk mailboxes_ick;
-
-static struct clk_hw_omap mailboxes_ick_hw = {
-       .hw = {
-               .clk = &mailboxes_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_MAILBOXES_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(mailboxes_ick, aes_ick_parent_names, aes_ick_ops);
-
-static const struct clksel_rate common_mcbsp_96m_rates[] = {
-       { .div = 1, .val = 0, .flags = RATE_IN_24XX },
-       { .div = 0 }
-};
-
-static const struct clksel_rate common_mcbsp_mcbsp_rates[] = {
-       { .div = 1, .val = 1, .flags = RATE_IN_24XX },
-       { .div = 0 }
-};
-
-static const struct clksel mcbsp_fck_clksel[] = {
-       { .parent = &func_96m_ck, .rates = common_mcbsp_96m_rates },
-       { .parent = &mcbsp_clks, .rates = common_mcbsp_mcbsp_rates },
-       { .parent = NULL },
-};
-
-static const char *mcbsp1_fck_parent_names[] = {
-       "func_96m_ck", "mcbsp_clks",
-};
-
-DEFINE_CLK_OMAP_MUX_GATE(mcbsp1_fck, "core_l4_clkdm", mcbsp_fck_clksel,
-                        OMAP242X_CTRL_REGADDR(OMAP2_CONTROL_DEVCONF0),
-                        OMAP2_MCBSP1_CLKS_MASK,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-                        OMAP24XX_EN_MCBSP1_SHIFT, &clkhwops_wait,
-                        mcbsp1_fck_parent_names, dss1_fck_ops);
-
-static struct clk mcbsp1_ick;
-
-static struct clk_hw_omap mcbsp1_ick_hw = {
-       .hw = {
-               .clk = &mcbsp1_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_MCBSP1_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(mcbsp1_ick, aes_ick_parent_names, aes_ick_ops);
-
-DEFINE_CLK_OMAP_MUX_GATE(mcbsp2_fck, "core_l4_clkdm", mcbsp_fck_clksel,
-                        OMAP242X_CTRL_REGADDR(OMAP2_CONTROL_DEVCONF0),
-                        OMAP2_MCBSP2_CLKS_MASK,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-                        OMAP24XX_EN_MCBSP2_SHIFT, &clkhwops_wait,
-                        mcbsp1_fck_parent_names, dss1_fck_ops);
-
-static struct clk mcbsp2_ick;
-
-static struct clk_hw_omap mcbsp2_ick_hw = {
-       .hw = {
-               .clk = &mcbsp2_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_MCBSP2_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(mcbsp2_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk mcspi1_fck;
-
-static const char *mcspi1_fck_parent_names[] = {
-       "func_48m_ck",
-};
-
-static struct clk_hw_omap mcspi1_fck_hw = {
-       .hw = {
-               .clk = &mcspi1_fck,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-       .enable_bit     = OMAP24XX_EN_MCSPI1_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(mcspi1_fck, mcspi1_fck_parent_names, aes_ick_ops);
-
-static struct clk mcspi1_ick;
-
-static struct clk_hw_omap mcspi1_ick_hw = {
-       .hw = {
-               .clk = &mcspi1_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_MCSPI1_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(mcspi1_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk mcspi2_fck;
-
-static struct clk_hw_omap mcspi2_fck_hw = {
-       .hw = {
-               .clk = &mcspi2_fck,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-       .enable_bit     = OMAP24XX_EN_MCSPI2_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(mcspi2_fck, mcspi1_fck_parent_names, aes_ick_ops);
-
-static struct clk mcspi2_ick;
-
-static struct clk_hw_omap mcspi2_ick_hw = {
-       .hw = {
-               .clk = &mcspi2_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_MCSPI2_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(mcspi2_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk mmc_fck;
-
-static struct clk_hw_omap mmc_fck_hw = {
-       .hw = {
-               .clk = &mmc_fck,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-       .enable_bit     = OMAP2420_EN_MMC_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(mmc_fck, cam_fck_parent_names, aes_ick_ops);
-
-static struct clk mmc_ick;
-
-static struct clk_hw_omap mmc_ick_hw = {
-       .hw = {
-               .clk = &mmc_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP2420_EN_MMC_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(mmc_ick, aes_ick_parent_names, aes_ick_ops);
-
-DEFINE_CLK_DIVIDER(mpu_ck, "core_ck", &core_ck, 0x0,
-                  OMAP_CM_REGADDR(MPU_MOD, CM_CLKSEL),
-                  OMAP24XX_CLKSEL_MPU_SHIFT, OMAP24XX_CLKSEL_MPU_WIDTH,
-                  CLK_DIVIDER_ONE_BASED, NULL);
-
-static struct clk mpu_wdt_fck;
-
-static struct clk_hw_omap mpu_wdt_fck_hw = {
-       .hw = {
-               .clk = &mpu_wdt_fck,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
-       .enable_bit     = OMAP24XX_EN_MPU_WDT_SHIFT,
-       .clkdm_name     = "wkup_clkdm",
-};
-
-DEFINE_STRUCT_CLK(mpu_wdt_fck, gpios_fck_parent_names, aes_ick_ops);
-
-static struct clk mpu_wdt_ick;
-
-static struct clk_hw_omap mpu_wdt_ick_hw = {
-       .hw = {
-               .clk = &mpu_wdt_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
-       .enable_bit     = OMAP24XX_EN_MPU_WDT_SHIFT,
-       .clkdm_name     = "wkup_clkdm",
-};
-
-DEFINE_STRUCT_CLK(mpu_wdt_ick, gpios_ick_parent_names, aes_ick_ops);
-
-static struct clk mspro_fck;
-
-static struct clk_hw_omap mspro_fck_hw = {
-       .hw = {
-               .clk = &mspro_fck,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-       .enable_bit     = OMAP24XX_EN_MSPRO_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(mspro_fck, cam_fck_parent_names, aes_ick_ops);
-
-static struct clk mspro_ick;
-
-static struct clk_hw_omap mspro_ick_hw = {
-       .hw = {
-               .clk = &mspro_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_MSPRO_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(mspro_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk omapctrl_ick;
-
-static struct clk_hw_omap omapctrl_ick_hw = {
-       .hw = {
-               .clk = &omapctrl_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
-       .enable_bit     = OMAP24XX_EN_OMAPCTRL_SHIFT,
-       .flags          = ENABLE_ON_INIT,
-       .clkdm_name     = "wkup_clkdm",
-};
-
-DEFINE_STRUCT_CLK(omapctrl_ick, gpios_ick_parent_names, aes_ick_ops);
-
-static struct clk pka_ick;
-
-static struct clk_hw_omap pka_ick_hw = {
-       .hw = {
-               .clk = &pka_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4),
-       .enable_bit     = OMAP24XX_EN_PKA_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(pka_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk rng_ick;
-
-static struct clk_hw_omap rng_ick_hw = {
-       .hw = {
-               .clk = &rng_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4),
-       .enable_bit     = OMAP24XX_EN_RNG_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(rng_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk sdma_fck;
-
-DEFINE_STRUCT_CLK_HW_OMAP(sdma_fck, "core_l3_clkdm");
-DEFINE_STRUCT_CLK(sdma_fck, gfx_ick_parent_names, core_ck_ops);
-
-static struct clk sdma_ick;
-
-static struct clk_hw_omap sdma_ick_hw = {
-       .hw = {
-               .clk = &sdma_ick,
-       },
-       .ops            = &clkhwops_iclk,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3),
-       .enable_bit     = OMAP24XX_AUTO_SDMA_SHIFT,
-       .clkdm_name     = "core_l3_clkdm",
-};
-
-DEFINE_STRUCT_CLK(sdma_ick, gfx_ick_parent_names, core_ck_ops);
-
-static struct clk sdrc_ick;
-
-static struct clk_hw_omap sdrc_ick_hw = {
-       .hw = {
-               .clk = &sdrc_ick,
-       },
-       .ops            = &clkhwops_iclk,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3),
-       .enable_bit     = OMAP24XX_AUTO_SDRC_SHIFT,
-       .flags          = ENABLE_ON_INIT,
-       .clkdm_name     = "core_l3_clkdm",
-};
-
-DEFINE_STRUCT_CLK(sdrc_ick, gfx_ick_parent_names, core_ck_ops);
-
-static struct clk sha_ick;
-
-static struct clk_hw_omap sha_ick_hw = {
-       .hw = {
-               .clk = &sha_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4),
-       .enable_bit     = OMAP24XX_EN_SHA_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(sha_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk ssi_l4_ick;
-
-static struct clk_hw_omap ssi_l4_ick_hw = {
-       .hw = {
-               .clk = &ssi_l4_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
-       .enable_bit     = OMAP24XX_EN_SSI_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(ssi_l4_ick, aes_ick_parent_names, aes_ick_ops);
-
-static const struct clksel_rate ssi_ssr_sst_fck_core_rates[] = {
-       { .div = 1, .val = 1, .flags = RATE_IN_24XX },
-       { .div = 2, .val = 2, .flags = RATE_IN_24XX },
-       { .div = 3, .val = 3, .flags = RATE_IN_24XX },
-       { .div = 4, .val = 4, .flags = RATE_IN_24XX },
-       { .div = 6, .val = 6, .flags = RATE_IN_242X },
-       { .div = 8, .val = 8, .flags = RATE_IN_242X },
-       { .div = 0 }
-};
-
-static const struct clksel ssi_ssr_sst_fck_clksel[] = {
-       { .parent = &core_ck, .rates = ssi_ssr_sst_fck_core_rates },
-       { .parent = NULL },
-};
-
-static const char *ssi_ssr_sst_fck_parent_names[] = {
-       "core_ck",
-};
-
-DEFINE_CLK_OMAP_MUX_GATE(ssi_ssr_sst_fck, "core_l3_clkdm",
-                        ssi_ssr_sst_fck_clksel,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
-                        OMAP24XX_CLKSEL_SSI_MASK,
-                        OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
-                        OMAP24XX_EN_SSI_SHIFT, &clkhwops_wait,
-                        ssi_ssr_sst_fck_parent_names, dsp_fck_ops);
-
-static struct clk sync_32k_ick;
-
-static struct clk_hw_omap sync_32k_ick_hw = {
-       .hw = {
-               .clk = &sync_32k_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
-       .enable_bit     = OMAP24XX_EN_32KSYNC_SHIFT,
-       .flags          = ENABLE_ON_INIT,
-       .clkdm_name     = "wkup_clkdm",
-};
-
-DEFINE_STRUCT_CLK(sync_32k_ick, gpios_ick_parent_names, aes_ick_ops);
-
-static const struct clksel_rate common_clkout_src_core_rates[] = {
-       { .div = 1, .val = 0, .flags = RATE_IN_24XX },
-       { .div = 0 }
-};
-
-static const struct clksel_rate common_clkout_src_sys_rates[] = {
-       { .div = 1, .val = 1, .flags = RATE_IN_24XX },
-       { .div = 0 }
-};
-
-static const struct clksel_rate common_clkout_src_96m_rates[] = {
-       { .div = 1, .val = 2, .flags = RATE_IN_24XX },
-       { .div = 0 }
-};
-
-static const struct clksel_rate common_clkout_src_54m_rates[] = {
-       { .div = 1, .val = 3, .flags = RATE_IN_24XX },
-       { .div = 0 }
-};
-
-static const struct clksel common_clkout_src_clksel[] = {
-       { .parent = &core_ck, .rates = common_clkout_src_core_rates },
-       { .parent = &sys_ck, .rates = common_clkout_src_sys_rates },
-       { .parent = &func_96m_ck, .rates = common_clkout_src_96m_rates },
-       { .parent = &func_54m_ck, .rates = common_clkout_src_54m_rates },
-       { .parent = NULL },
-};
-
-static const char *sys_clkout_src_parent_names[] = {
-       "core_ck", "sys_ck", "func_96m_ck", "func_54m_ck",
-};
-
-DEFINE_CLK_OMAP_MUX_GATE(sys_clkout_src, "wkup_clkdm", common_clkout_src_clksel,
-                        OMAP2420_PRCM_CLKOUT_CTRL, OMAP24XX_CLKOUT_SOURCE_MASK,
-                        OMAP2420_PRCM_CLKOUT_CTRL, OMAP24XX_CLKOUT_EN_SHIFT,
-                        NULL, sys_clkout_src_parent_names, gpt1_fck_ops);
-
-DEFINE_CLK_DIVIDER(sys_clkout, "sys_clkout_src", &sys_clkout_src, 0x0,
-                  OMAP2420_PRCM_CLKOUT_CTRL, OMAP24XX_CLKOUT_DIV_SHIFT,
-                  OMAP24XX_CLKOUT_DIV_WIDTH, CLK_DIVIDER_POWER_OF_TWO, NULL);
-
-DEFINE_CLK_OMAP_MUX_GATE(sys_clkout2_src, "wkup_clkdm",
-                        common_clkout_src_clksel, OMAP2420_PRCM_CLKOUT_CTRL,
-                        OMAP2420_CLKOUT2_SOURCE_MASK,
-                        OMAP2420_PRCM_CLKOUT_CTRL, OMAP2420_CLKOUT2_EN_SHIFT,
-                        NULL, sys_clkout_src_parent_names, gpt1_fck_ops);
-
-DEFINE_CLK_DIVIDER(sys_clkout2, "sys_clkout2_src", &sys_clkout2_src, 0x0,
-                  OMAP2420_PRCM_CLKOUT_CTRL, OMAP2420_CLKOUT2_DIV_SHIFT,
-                  OMAP2420_CLKOUT2_DIV_WIDTH, CLK_DIVIDER_POWER_OF_TWO, NULL);
-
-static struct clk uart1_fck;
-
-static struct clk_hw_omap uart1_fck_hw = {
-       .hw = {
-               .clk = &uart1_fck,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-       .enable_bit     = OMAP24XX_EN_UART1_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(uart1_fck, mcspi1_fck_parent_names, aes_ick_ops);
-
-static struct clk uart1_ick;
-
-static struct clk_hw_omap uart1_ick_hw = {
-       .hw = {
-               .clk = &uart1_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_UART1_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(uart1_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk uart2_fck;
-
-static struct clk_hw_omap uart2_fck_hw = {
-       .hw = {
-               .clk = &uart2_fck,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-       .enable_bit     = OMAP24XX_EN_UART2_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(uart2_fck, mcspi1_fck_parent_names, aes_ick_ops);
-
-static struct clk uart2_ick;
-
-static struct clk_hw_omap uart2_ick_hw = {
-       .hw = {
-               .clk = &uart2_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_UART2_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(uart2_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk uart3_fck;
-
-static struct clk_hw_omap uart3_fck_hw = {
-       .hw = {
-               .clk = &uart3_fck,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
-       .enable_bit     = OMAP24XX_EN_UART3_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(uart3_fck, mcspi1_fck_parent_names, aes_ick_ops);
-
-static struct clk uart3_ick;
-
-static struct clk_hw_omap uart3_ick_hw = {
-       .hw = {
-               .clk = &uart3_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
-       .enable_bit     = OMAP24XX_EN_UART3_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(uart3_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk usb_fck;
-
-static struct clk_hw_omap usb_fck_hw = {
-       .hw = {
-               .clk = &usb_fck,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
-       .enable_bit     = OMAP24XX_EN_USB_SHIFT,
-       .clkdm_name     = "core_l3_clkdm",
-};
-
-DEFINE_STRUCT_CLK(usb_fck, mcspi1_fck_parent_names, aes_ick_ops);
-
-static const struct clksel_rate usb_l4_ick_core_l3_rates[] = {
-       { .div = 1, .val = 1, .flags = RATE_IN_24XX },
-       { .div = 2, .val = 2, .flags = RATE_IN_24XX },
-       { .div = 4, .val = 4, .flags = RATE_IN_24XX },
-       { .div = 0 }
-};
-
-static const struct clksel usb_l4_ick_clksel[] = {
-       { .parent = &core_l3_ck, .rates = usb_l4_ick_core_l3_rates },
-       { .parent = NULL },
-};
-
-static const char *usb_l4_ick_parent_names[] = {
-       "core_l3_ck",
-};
-
-DEFINE_CLK_OMAP_MUX_GATE(usb_l4_ick, "core_l4_clkdm", usb_l4_ick_clksel,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
-                        OMAP24XX_CLKSEL_USB_MASK,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
-                        OMAP24XX_EN_USB_SHIFT, &clkhwops_iclk_wait,
-                        usb_l4_ick_parent_names, dsp_fck_ops);
-
-static struct clk virt_prcm_set;
-
-static const char *virt_prcm_set_parent_names[] = {
-       "mpu_ck",
-};
-
-static const struct clk_ops virt_prcm_set_ops = {
-       .recalc_rate    = &omap2_table_mpu_recalc,
-       .set_rate       = &omap2_select_table_rate,
-       .round_rate     = &omap2_round_to_table_rate,
-};
-
-DEFINE_STRUCT_CLK_HW_OMAP(virt_prcm_set, NULL);
-DEFINE_STRUCT_CLK(virt_prcm_set, virt_prcm_set_parent_names, virt_prcm_set_ops);
-
-static const struct clksel_rate vlynq_fck_96m_rates[] = {
-       { .div = 1, .val = 0, .flags = RATE_IN_242X },
-       { .div = 0 }
-};
-
-static const struct clksel_rate vlynq_fck_core_rates[] = {
-       { .div = 1, .val = 1, .flags = RATE_IN_242X },
-       { .div = 2, .val = 2, .flags = RATE_IN_242X },
-       { .div = 3, .val = 3, .flags = RATE_IN_242X },
-       { .div = 4, .val = 4, .flags = RATE_IN_242X },
-       { .div = 6, .val = 6, .flags = RATE_IN_242X },
-       { .div = 8, .val = 8, .flags = RATE_IN_242X },
-       { .div = 9, .val = 9, .flags = RATE_IN_242X },
-       { .div = 12, .val = 12, .flags = RATE_IN_242X },
-       { .div = 16, .val = 16, .flags = RATE_IN_242X },
-       { .div = 18, .val = 18, .flags = RATE_IN_242X },
-       { .div = 0 }
-};
-
-static const struct clksel vlynq_fck_clksel[] = {
-       { .parent = &func_96m_ck, .rates = vlynq_fck_96m_rates },
-       { .parent = &core_ck, .rates = vlynq_fck_core_rates },
-       { .parent = NULL },
-};
-
-static const char *vlynq_fck_parent_names[] = {
-       "func_96m_ck", "core_ck",
-};
-
-DEFINE_CLK_OMAP_MUX_GATE(vlynq_fck, "core_l3_clkdm", vlynq_fck_clksel,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
-                        OMAP2420_CLKSEL_VLYNQ_MASK,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-                        OMAP2420_EN_VLYNQ_SHIFT, &clkhwops_wait,
-                        vlynq_fck_parent_names, dss1_fck_ops);
-
-static struct clk vlynq_ick;
-
-static struct clk_hw_omap vlynq_ick_hw = {
-       .hw = {
-               .clk = &vlynq_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP2420_EN_VLYNQ_SHIFT,
-       .clkdm_name     = "core_l3_clkdm",
-};
-
-DEFINE_STRUCT_CLK(vlynq_ick, gfx_ick_parent_names, aes_ick_ops);
-
-static struct clk wdt1_ick;
-
-static struct clk_hw_omap wdt1_ick_hw = {
-       .hw = {
-               .clk = &wdt1_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
-       .enable_bit     = OMAP24XX_EN_WDT1_SHIFT,
-       .clkdm_name     = "wkup_clkdm",
-};
-
-DEFINE_STRUCT_CLK(wdt1_ick, gpios_ick_parent_names, aes_ick_ops);
-
-static struct clk wdt3_fck;
-
-static struct clk_hw_omap wdt3_fck_hw = {
-       .hw = {
-               .clk = &wdt3_fck,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-       .enable_bit     = OMAP2420_EN_WDT3_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(wdt3_fck, gpios_fck_parent_names, aes_ick_ops);
-
-static struct clk wdt3_ick;
-
-static struct clk_hw_omap wdt3_ick_hw = {
-       .hw = {
-               .clk = &wdt3_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP2420_EN_WDT3_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(wdt3_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk wdt4_fck;
-
-static struct clk_hw_omap wdt4_fck_hw = {
-       .hw = {
-               .clk = &wdt4_fck,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-       .enable_bit     = OMAP24XX_EN_WDT4_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(wdt4_fck, gpios_fck_parent_names, aes_ick_ops);
-
-static struct clk wdt4_ick;
-
-static struct clk_hw_omap wdt4_ick_hw = {
-       .hw = {
-               .clk = &wdt4_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_WDT4_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(wdt4_ick, aes_ick_parent_names, aes_ick_ops);
-
-/*
- * clkdev integration
- */
-
-static struct omap_clk omap2420_clks[] = {
-       /* external root sources */
-       CLK(NULL,       "func_32k_ck",  &func_32k_ck),
-       CLK(NULL,       "secure_32k_ck", &secure_32k_ck),
-       CLK(NULL,       "osc_ck",       &osc_ck),
-       CLK(NULL,       "sys_ck",       &sys_ck),
-       CLK(NULL,       "alt_ck",       &alt_ck),
-       CLK(NULL,       "mcbsp_clks",   &mcbsp_clks),
-       /* internal analog sources */
-       CLK(NULL,       "dpll_ck",      &dpll_ck),
-       CLK(NULL,       "apll96_ck",    &apll96_ck),
-       CLK(NULL,       "apll54_ck",    &apll54_ck),
-       /* internal prcm root sources */
-       CLK(NULL,       "func_54m_ck",  &func_54m_ck),
-       CLK(NULL,       "core_ck",      &core_ck),
-       CLK(NULL,       "func_96m_ck",  &func_96m_ck),
-       CLK(NULL,       "func_48m_ck",  &func_48m_ck),
-       CLK(NULL,       "func_12m_ck",  &func_12m_ck),
-       CLK(NULL,       "sys_clkout_src", &sys_clkout_src),
-       CLK(NULL,       "sys_clkout",   &sys_clkout),
-       CLK(NULL,       "sys_clkout2_src", &sys_clkout2_src),
-       CLK(NULL,       "sys_clkout2",  &sys_clkout2),
-       CLK(NULL,       "emul_ck",      &emul_ck),
-       /* mpu domain clocks */
-       CLK(NULL,       "mpu_ck",       &mpu_ck),
-       /* dsp domain clocks */
-       CLK(NULL,       "dsp_fck",      &dsp_fck),
-       CLK(NULL,       "dsp_ick",      &dsp_ick),
-       CLK(NULL,       "iva1_ifck",    &iva1_ifck),
-       CLK(NULL,       "iva1_mpu_int_ifck", &iva1_mpu_int_ifck),
-       /* GFX domain clocks */
-       CLK(NULL,       "gfx_3d_fck",   &gfx_3d_fck),
-       CLK(NULL,       "gfx_2d_fck",   &gfx_2d_fck),
-       CLK(NULL,       "gfx_ick",      &gfx_ick),
-       /* DSS domain clocks */
-       CLK("omapdss_dss",      "ick",          &dss_ick),
-       CLK(NULL,       "dss_ick",              &dss_ick),
-       CLK(NULL,       "dss1_fck",             &dss1_fck),
-       CLK(NULL,       "dss2_fck",     &dss2_fck),
-       CLK(NULL,       "dss_54m_fck",  &dss_54m_fck),
-       /* L3 domain clocks */
-       CLK(NULL,       "core_l3_ck",   &core_l3_ck),
-       CLK(NULL,       "ssi_fck",      &ssi_ssr_sst_fck),
-       CLK(NULL,       "usb_l4_ick",   &usb_l4_ick),
-       /* L4 domain clocks */
-       CLK(NULL,       "l4_ck",        &l4_ck),
-       CLK(NULL,       "ssi_l4_ick",   &ssi_l4_ick),
-       /* virtual meta-group clock */
-       CLK(NULL,       "virt_prcm_set", &virt_prcm_set),
-       /* general l4 interface ck, multi-parent functional clk */
-       CLK(NULL,       "gpt1_ick",     &gpt1_ick),
-       CLK(NULL,       "gpt1_fck",     &gpt1_fck),
-       CLK(NULL,       "gpt2_ick",     &gpt2_ick),
-       CLK(NULL,       "gpt2_fck",     &gpt2_fck),
-       CLK(NULL,       "gpt3_ick",     &gpt3_ick),
-       CLK(NULL,       "gpt3_fck",     &gpt3_fck),
-       CLK(NULL,       "gpt4_ick",     &gpt4_ick),
-       CLK(NULL,       "gpt4_fck",     &gpt4_fck),
-       CLK(NULL,       "gpt5_ick",     &gpt5_ick),
-       CLK(NULL,       "gpt5_fck",     &gpt5_fck),
-       CLK(NULL,       "gpt6_ick",     &gpt6_ick),
-       CLK(NULL,       "gpt6_fck",     &gpt6_fck),
-       CLK(NULL,       "gpt7_ick",     &gpt7_ick),
-       CLK(NULL,       "gpt7_fck",     &gpt7_fck),
-       CLK(NULL,       "gpt8_ick",     &gpt8_ick),
-       CLK(NULL,       "gpt8_fck",     &gpt8_fck),
-       CLK(NULL,       "gpt9_ick",     &gpt9_ick),
-       CLK(NULL,       "gpt9_fck",     &gpt9_fck),
-       CLK(NULL,       "gpt10_ick",    &gpt10_ick),
-       CLK(NULL,       "gpt10_fck",    &gpt10_fck),
-       CLK(NULL,       "gpt11_ick",    &gpt11_ick),
-       CLK(NULL,       "gpt11_fck",    &gpt11_fck),
-       CLK(NULL,       "gpt12_ick",    &gpt12_ick),
-       CLK(NULL,       "gpt12_fck",    &gpt12_fck),
-       CLK("omap-mcbsp.1", "ick",      &mcbsp1_ick),
-       CLK(NULL,       "mcbsp1_ick",   &mcbsp1_ick),
-       CLK(NULL,       "mcbsp1_fck",   &mcbsp1_fck),
-       CLK("omap-mcbsp.2", "ick",      &mcbsp2_ick),
-       CLK(NULL,       "mcbsp2_ick",   &mcbsp2_ick),
-       CLK(NULL,       "mcbsp2_fck",   &mcbsp2_fck),
-       CLK("omap2_mcspi.1", "ick",     &mcspi1_ick),
-       CLK(NULL,       "mcspi1_ick",   &mcspi1_ick),
-       CLK(NULL,       "mcspi1_fck",   &mcspi1_fck),
-       CLK("omap2_mcspi.2", "ick",     &mcspi2_ick),
-       CLK(NULL,       "mcspi2_ick",   &mcspi2_ick),
-       CLK(NULL,       "mcspi2_fck",   &mcspi2_fck),
-       CLK(NULL,       "uart1_ick",    &uart1_ick),
-       CLK(NULL,       "uart1_fck",    &uart1_fck),
-       CLK(NULL,       "uart2_ick",    &uart2_ick),
-       CLK(NULL,       "uart2_fck",    &uart2_fck),
-       CLK(NULL,       "uart3_ick",    &uart3_ick),
-       CLK(NULL,       "uart3_fck",    &uart3_fck),
-       CLK(NULL,       "gpios_ick",    &gpios_ick),
-       CLK(NULL,       "gpios_fck",    &gpios_fck),
-       CLK("omap_wdt", "ick",          &mpu_wdt_ick),
-       CLK(NULL,       "mpu_wdt_ick",          &mpu_wdt_ick),
-       CLK(NULL,       "mpu_wdt_fck",  &mpu_wdt_fck),
-       CLK(NULL,       "sync_32k_ick", &sync_32k_ick),
-       CLK(NULL,       "wdt1_ick",     &wdt1_ick),
-       CLK(NULL,       "omapctrl_ick", &omapctrl_ick),
-       CLK("omap24xxcam", "fck",       &cam_fck),
-       CLK(NULL,       "cam_fck",      &cam_fck),
-       CLK("omap24xxcam", "ick",       &cam_ick),
-       CLK(NULL,       "cam_ick",      &cam_ick),
-       CLK(NULL,       "mailboxes_ick", &mailboxes_ick),
-       CLK(NULL,       "wdt4_ick",     &wdt4_ick),
-       CLK(NULL,       "wdt4_fck",     &wdt4_fck),
-       CLK(NULL,       "wdt3_ick",     &wdt3_ick),
-       CLK(NULL,       "wdt3_fck",     &wdt3_fck),
-       CLK(NULL,       "mspro_ick",    &mspro_ick),
-       CLK(NULL,       "mspro_fck",    &mspro_fck),
-       CLK("mmci-omap.0", "ick",       &mmc_ick),
-       CLK(NULL,       "mmc_ick",      &mmc_ick),
-       CLK("mmci-omap.0", "fck",       &mmc_fck),
-       CLK(NULL,       "mmc_fck",      &mmc_fck),
-       CLK(NULL,       "fac_ick",      &fac_ick),
-       CLK(NULL,       "fac_fck",      &fac_fck),
-       CLK(NULL,       "eac_ick",      &eac_ick),
-       CLK(NULL,       "eac_fck",      &eac_fck),
-       CLK("omap_hdq.0", "ick",        &hdq_ick),
-       CLK(NULL,       "hdq_ick",      &hdq_ick),
-       CLK("omap_hdq.0", "fck",        &hdq_fck),
-       CLK(NULL,       "hdq_fck",      &hdq_fck),
-       CLK("omap_i2c.1", "ick",        &i2c1_ick),
-       CLK(NULL,       "i2c1_ick",     &i2c1_ick),
-       CLK(NULL,       "i2c1_fck",     &i2c1_fck),
-       CLK("omap_i2c.2", "ick",        &i2c2_ick),
-       CLK(NULL,       "i2c2_ick",     &i2c2_ick),
-       CLK(NULL,       "i2c2_fck",     &i2c2_fck),
-       CLK(NULL,       "gpmc_fck",     &gpmc_fck),
-       CLK(NULL,       "sdma_fck",     &sdma_fck),
-       CLK(NULL,       "sdma_ick",     &sdma_ick),
-       CLK(NULL,       "sdrc_ick",     &sdrc_ick),
-       CLK(NULL,       "vlynq_ick",    &vlynq_ick),
-       CLK(NULL,       "vlynq_fck",    &vlynq_fck),
-       CLK(NULL,       "des_ick",      &des_ick),
-       CLK("omap-sham",        "ick",  &sha_ick),
-       CLK(NULL,       "sha_ick",      &sha_ick),
-       CLK("omap_rng", "ick",          &rng_ick),
-       CLK(NULL,       "rng_ick",              &rng_ick),
-       CLK("omap-aes", "ick",  &aes_ick),
-       CLK(NULL,       "aes_ick",      &aes_ick),
-       CLK(NULL,       "pka_ick",      &pka_ick),
-       CLK(NULL,       "usb_fck",      &usb_fck),
-       CLK("musb-hdrc",        "fck",  &osc_ck),
-       CLK(NULL,       "timer_32k_ck", &func_32k_ck),
-       CLK(NULL,       "timer_sys_ck", &sys_ck),
-       CLK(NULL,       "timer_ext_ck", &alt_ck),
-       CLK(NULL,       "cpufreq_ck",   &virt_prcm_set),
-};
-
-
-static const char *enable_init_clks[] = {
-       "apll96_ck",
-       "apll54_ck",
-       "sync_32k_ick",
-       "omapctrl_ick",
-       "gpmc_fck",
-       "sdrc_ick",
-};
-
-/*
- * init code
- */
-
-int __init omap2420_clk_init(void)
-{
-       prcm_clksrc_ctrl = OMAP2420_PRCM_CLKSRC_CTRL;
-       cpu_mask = RATE_IN_242X;
-       rate_table = omap2420_rate_table;
-
-       omap2xxx_clkt_dpllcore_init(&dpll_ck_hw.hw);
-
-       omap2xxx_clkt_vps_check_bootloader_rates();
-
-       omap_clocks_register(omap2420_clks, ARRAY_SIZE(omap2420_clks));
-
-       omap2xxx_clkt_vps_late_init();
-
-       omap2_clk_disable_autoidle_all();
-
-       omap2_clk_enable_init_clocks(enable_init_clks,
-                                    ARRAY_SIZE(enable_init_clks));
-
-       pr_info("Clocking rate (Crystal/DPLL/MPU): %ld.%01ld/%ld/%ld MHz\n",
-               (clk_get_rate(&sys_ck) / 1000000),
-               (clk_get_rate(&sys_ck) / 100000) % 10,
-               (clk_get_rate(&dpll_ck) / 1000000),
-               (clk_get_rate(&mpu_ck) / 1000000));
-
-       return 0;
-}
diff --git a/arch/arm/mach-omap2/cclock2430_data.c b/arch/arm/mach-omap2/cclock2430_data.c
deleted file mode 100644 (file)
index 5e4b037..0000000
+++ /dev/null
@@ -1,2048 +0,0 @@
-/*
- * OMAP2430 clock data
- *
- * Copyright (C) 2005-2009, 2012 Texas Instruments, Inc.
- * Copyright (C) 2004-2011 Nokia Corporation
- *
- * Contacts:
- * Richard Woodruff <r-woodruff2@ti.com>
- * Paul Walmsley
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#include <linux/kernel.h>
-#include <linux/clk.h>
-#include <linux/clk-private.h>
-#include <linux/list.h>
-
-#include "soc.h"
-#include "iomap.h"
-#include "clock.h"
-#include "clock2xxx.h"
-#include "opp2xxx.h"
-#include "cm2xxx.h"
-#include "prm2xxx.h"
-#include "prm-regbits-24xx.h"
-#include "cm-regbits-24xx.h"
-#include "sdrc.h"
-#include "control.h"
-
-#define OMAP_CM_REGADDR                        OMAP2430_CM_REGADDR
-
-/*
- * 2430 clock tree.
- *
- * NOTE:In many cases here we are assigning a 'default' parent. In
- *     many cases the parent is selectable. The set parent calls will
- *     also switch sources.
- *
- *     Several sources are given initial rates which may be wrong, this will
- *     be fixed up in the init func.
- *
- *     Things are broadly separated below by clock domains. It is
- *     noteworthy that most peripherals have dependencies on multiple clock
- *     domains. Many get their interface clocks from the L4 domain, but get
- *     functional clocks from fixed sources or other core domain derived
- *     clocks.
- */
-
-DEFINE_CLK_FIXED_RATE(alt_ck, CLK_IS_ROOT, 54000000, 0x0);
-
-DEFINE_CLK_FIXED_RATE(func_32k_ck, CLK_IS_ROOT, 32768, 0x0);
-
-DEFINE_CLK_FIXED_RATE(mcbsp_clks, CLK_IS_ROOT, 0x0, 0x0);
-
-static struct clk osc_ck;
-
-static const struct clk_ops osc_ck_ops = {
-       .enable         = &omap2_enable_osc_ck,
-       .disable        = omap2_disable_osc_ck,
-       .recalc_rate    = &omap2_osc_clk_recalc,
-};
-
-static struct clk_hw_omap osc_ck_hw = {
-       .hw = {
-               .clk = &osc_ck,
-       },
-};
-
-static struct clk osc_ck = {
-       .name   = "osc_ck",
-       .ops    = &osc_ck_ops,
-       .hw     = &osc_ck_hw.hw,
-       .flags  = CLK_IS_ROOT,
-};
-
-DEFINE_CLK_FIXED_RATE(secure_32k_ck, CLK_IS_ROOT, 32768, 0x0);
-
-static struct clk sys_ck;
-
-static const char *sys_ck_parent_names[] = {
-       "osc_ck",
-};
-
-static const struct clk_ops sys_ck_ops = {
-       .init           = &omap2_init_clk_clkdm,
-       .recalc_rate    = &omap2xxx_sys_clk_recalc,
-};
-
-DEFINE_STRUCT_CLK_HW_OMAP(sys_ck, "wkup_clkdm");
-DEFINE_STRUCT_CLK(sys_ck, sys_ck_parent_names, sys_ck_ops);
-
-static struct dpll_data dpll_dd = {
-       .mult_div1_reg  = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
-       .mult_mask      = OMAP24XX_DPLL_MULT_MASK,
-       .div1_mask      = OMAP24XX_DPLL_DIV_MASK,
-       .clk_bypass     = &sys_ck,
-       .clk_ref        = &sys_ck,
-       .control_reg    = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
-       .enable_mask    = OMAP24XX_EN_DPLL_MASK,
-       .max_multiplier = 1023,
-       .min_divider    = 1,
-       .max_divider    = 16,
-};
-
-static struct clk dpll_ck;
-
-static const char *dpll_ck_parent_names[] = {
-       "sys_ck",
-};
-
-static const struct clk_ops dpll_ck_ops = {
-       .init           = &omap2_init_clk_clkdm,
-       .get_parent     = &omap2_init_dpll_parent,
-       .recalc_rate    = &omap2_dpllcore_recalc,
-       .round_rate     = &omap2_dpll_round_rate,
-       .set_rate       = &omap2_reprogram_dpllcore,
-};
-
-static struct clk_hw_omap dpll_ck_hw = {
-       .hw = {
-               .clk = &dpll_ck,
-       },
-       .ops            = &clkhwops_omap2xxx_dpll,
-       .dpll_data      = &dpll_dd,
-       .clkdm_name     = "wkup_clkdm",
-};
-
-DEFINE_STRUCT_CLK(dpll_ck, dpll_ck_parent_names, dpll_ck_ops);
-
-static struct clk core_ck;
-
-static const char *core_ck_parent_names[] = {
-       "dpll_ck",
-};
-
-static const struct clk_ops core_ck_ops = {
-       .init           = &omap2_init_clk_clkdm,
-};
-
-DEFINE_STRUCT_CLK_HW_OMAP(core_ck, "wkup_clkdm");
-DEFINE_STRUCT_CLK(core_ck, core_ck_parent_names, core_ck_ops);
-
-DEFINE_CLK_DIVIDER(core_l3_ck, "core_ck", &core_ck, 0x0,
-                  OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
-                  OMAP24XX_CLKSEL_L3_SHIFT, OMAP24XX_CLKSEL_L3_WIDTH,
-                  CLK_DIVIDER_ONE_BASED, NULL);
-
-DEFINE_CLK_DIVIDER(l4_ck, "core_l3_ck", &core_l3_ck, 0x0,
-                  OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
-                  OMAP24XX_CLKSEL_L4_SHIFT, OMAP24XX_CLKSEL_L4_WIDTH,
-                  CLK_DIVIDER_ONE_BASED, NULL);
-
-static struct clk aes_ick;
-
-static const char *aes_ick_parent_names[] = {
-       "l4_ck",
-};
-
-static const struct clk_ops aes_ick_ops = {
-       .init           = &omap2_init_clk_clkdm,
-       .enable         = &omap2_dflt_clk_enable,
-       .disable        = &omap2_dflt_clk_disable,
-       .is_enabled     = &omap2_dflt_clk_is_enabled,
-};
-
-static struct clk_hw_omap aes_ick_hw = {
-       .hw = {
-               .clk = &aes_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4),
-       .enable_bit     = OMAP24XX_EN_AES_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(aes_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk apll54_ck;
-
-static const struct clk_ops apll54_ck_ops = {
-       .init           = &omap2_init_clk_clkdm,
-       .enable         = &omap2_clk_apll54_enable,
-       .disable        = &omap2_clk_apll54_disable,
-       .recalc_rate    = &omap2_clk_apll54_recalc,
-};
-
-static struct clk_hw_omap apll54_ck_hw = {
-       .hw = {
-               .clk = &apll54_ck,
-       },
-       .ops            = &clkhwops_apll54,
-       .enable_reg     = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
-       .enable_bit     = OMAP24XX_EN_54M_PLL_SHIFT,
-       .flags          = ENABLE_ON_INIT,
-       .clkdm_name     = "wkup_clkdm",
-};
-
-DEFINE_STRUCT_CLK(apll54_ck, dpll_ck_parent_names, apll54_ck_ops);
-
-static struct clk apll96_ck;
-
-static const struct clk_ops apll96_ck_ops = {
-       .init           = &omap2_init_clk_clkdm,
-       .enable         = &omap2_clk_apll96_enable,
-       .disable        = &omap2_clk_apll96_disable,
-       .recalc_rate    = &omap2_clk_apll96_recalc,
-};
-
-static struct clk_hw_omap apll96_ck_hw = {
-       .hw = {
-               .clk = &apll96_ck,
-       },
-       .ops            = &clkhwops_apll96,
-       .enable_reg     = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
-       .enable_bit     = OMAP24XX_EN_96M_PLL_SHIFT,
-       .flags          = ENABLE_ON_INIT,
-       .clkdm_name     = "wkup_clkdm",
-};
-
-DEFINE_STRUCT_CLK(apll96_ck, dpll_ck_parent_names, apll96_ck_ops);
-
-static const char *func_96m_ck_parent_names[] = {
-       "apll96_ck", "alt_ck",
-};
-
-DEFINE_CLK_MUX(func_96m_ck, func_96m_ck_parent_names, NULL, 0x0,
-              OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1), OMAP2430_96M_SOURCE_SHIFT,
-              OMAP2430_96M_SOURCE_WIDTH, 0x0, NULL);
-
-static struct clk cam_fck;
-
-static const char *cam_fck_parent_names[] = {
-       "func_96m_ck",
-};
-
-static struct clk_hw_omap cam_fck_hw = {
-       .hw = {
-               .clk = &cam_fck,
-       },
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-       .enable_bit     = OMAP24XX_EN_CAM_SHIFT,
-       .clkdm_name     = "core_l3_clkdm",
-};
-
-DEFINE_STRUCT_CLK(cam_fck, cam_fck_parent_names, aes_ick_ops);
-
-static struct clk cam_ick;
-
-static struct clk_hw_omap cam_ick_hw = {
-       .hw = {
-               .clk = &cam_ick,
-       },
-       .ops            = &clkhwops_iclk,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_CAM_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(cam_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk des_ick;
-
-static struct clk_hw_omap des_ick_hw = {
-       .hw = {
-               .clk = &des_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4),
-       .enable_bit     = OMAP24XX_EN_DES_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(des_ick, aes_ick_parent_names, aes_ick_ops);
-
-static const struct clksel_rate dsp_fck_core_rates[] = {
-       { .div = 1, .val = 1, .flags = RATE_IN_24XX },
-       { .div = 2, .val = 2, .flags = RATE_IN_24XX },
-       { .div = 3, .val = 3, .flags = RATE_IN_24XX },
-       { .div = 4, .val = 4, .flags = RATE_IN_24XX },
-       { .div = 0 }
-};
-
-static const struct clksel dsp_fck_clksel[] = {
-       { .parent = &core_ck, .rates = dsp_fck_core_rates },
-       { .parent = NULL },
-};
-
-static const char *dsp_fck_parent_names[] = {
-       "core_ck",
-};
-
-static struct clk dsp_fck;
-
-static const struct clk_ops dsp_fck_ops = {
-       .init           = &omap2_init_clk_clkdm,
-       .enable         = &omap2_dflt_clk_enable,
-       .disable        = &omap2_dflt_clk_disable,
-       .is_enabled     = &omap2_dflt_clk_is_enabled,
-       .recalc_rate    = &omap2_clksel_recalc,
-       .set_rate       = &omap2_clksel_set_rate,
-       .round_rate     = &omap2_clksel_round_rate,
-};
-
-DEFINE_CLK_OMAP_MUX_GATE(dsp_fck, "dsp_clkdm", dsp_fck_clksel,
-                        OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_CLKSEL),
-                        OMAP24XX_CLKSEL_DSP_MASK,
-                        OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_FCLKEN),
-                        OMAP24XX_CM_FCLKEN_DSP_EN_DSP_SHIFT, &clkhwops_wait,
-                        dsp_fck_parent_names, dsp_fck_ops);
-
-static const struct clksel_rate dss1_fck_sys_rates[] = {
-       { .div = 1, .val = 0, .flags = RATE_IN_24XX },
-       { .div = 0 }
-};
-
-static const struct clksel_rate dss1_fck_core_rates[] = {
-       { .div = 1, .val = 1, .flags = RATE_IN_24XX },
-       { .div = 2, .val = 2, .flags = RATE_IN_24XX },
-       { .div = 3, .val = 3, .flags = RATE_IN_24XX },
-       { .div = 4, .val = 4, .flags = RATE_IN_24XX },
-       { .div = 5, .val = 5, .flags = RATE_IN_24XX },
-       { .div = 6, .val = 6, .flags = RATE_IN_24XX },
-       { .div = 8, .val = 8, .flags = RATE_IN_24XX },
-       { .div = 9, .val = 9, .flags = RATE_IN_24XX },
-       { .div = 12, .val = 12, .flags = RATE_IN_24XX },
-       { .div = 16, .val = 16, .flags = RATE_IN_24XX },
-       { .div = 0 }
-};
-
-static const struct clksel dss1_fck_clksel[] = {
-       { .parent = &sys_ck, .rates = dss1_fck_sys_rates },
-       { .parent = &core_ck, .rates = dss1_fck_core_rates },
-       { .parent = NULL },
-};
-
-static const char *dss1_fck_parent_names[] = {
-       "sys_ck", "core_ck",
-};
-
-static const struct clk_ops dss1_fck_ops = {
-       .init           = &omap2_init_clk_clkdm,
-       .enable         = &omap2_dflt_clk_enable,
-       .disable        = &omap2_dflt_clk_disable,
-       .is_enabled     = &omap2_dflt_clk_is_enabled,
-       .recalc_rate    = &omap2_clksel_recalc,
-       .get_parent     = &omap2_clksel_find_parent_index,
-       .set_parent     = &omap2_clksel_set_parent,
-};
-
-DEFINE_CLK_OMAP_MUX_GATE(dss1_fck, "dss_clkdm", dss1_fck_clksel,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
-                        OMAP24XX_CLKSEL_DSS1_MASK,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-                        OMAP24XX_EN_DSS1_SHIFT, NULL,
-                        dss1_fck_parent_names, dss1_fck_ops);
-
-static const struct clksel_rate dss2_fck_sys_rates[] = {
-       { .div = 1, .val = 0, .flags = RATE_IN_24XX },
-       { .div = 0 }
-};
-
-static const struct clksel_rate dss2_fck_48m_rates[] = {
-       { .div = 1, .val = 1, .flags = RATE_IN_24XX },
-       { .div = 0 }
-};
-
-static const struct clksel_rate func_48m_apll96_rates[] = {
-       { .div = 2, .val = 0, .flags = RATE_IN_24XX },
-       { .div = 0 }
-};
-
-static const struct clksel_rate func_48m_alt_rates[] = {
-       { .div = 1, .val = 1, .flags = RATE_IN_24XX },
-       { .div = 0 }
-};
-
-static const struct clksel func_48m_clksel[] = {
-       { .parent = &apll96_ck, .rates = func_48m_apll96_rates },
-       { .parent = &alt_ck, .rates = func_48m_alt_rates },
-       { .parent = NULL },
-};
-
-static const char *func_48m_ck_parent_names[] = {
-       "apll96_ck", "alt_ck",
-};
-
-static struct clk func_48m_ck;
-
-static const struct clk_ops func_48m_ck_ops = {
-       .init           = &omap2_init_clk_clkdm,
-       .recalc_rate    = &omap2_clksel_recalc,
-       .set_rate       = &omap2_clksel_set_rate,
-       .round_rate     = &omap2_clksel_round_rate,
-       .get_parent     = &omap2_clksel_find_parent_index,
-       .set_parent     = &omap2_clksel_set_parent,
-};
-
-static struct clk_hw_omap func_48m_ck_hw = {
-       .hw = {
-               .clk = &func_48m_ck,
-       },
-       .clksel         = func_48m_clksel,
-       .clksel_reg     = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
-       .clksel_mask    = OMAP24XX_48M_SOURCE_MASK,
-       .clkdm_name     = "wkup_clkdm",
-};
-
-DEFINE_STRUCT_CLK(func_48m_ck, func_48m_ck_parent_names, func_48m_ck_ops);
-
-static const struct clksel dss2_fck_clksel[] = {
-       { .parent = &sys_ck, .rates = dss2_fck_sys_rates },
-       { .parent = &func_48m_ck, .rates = dss2_fck_48m_rates },
-       { .parent = NULL },
-};
-
-static const char *dss2_fck_parent_names[] = {
-       "sys_ck", "func_48m_ck",
-};
-
-DEFINE_CLK_OMAP_MUX_GATE(dss2_fck, "dss_clkdm", dss2_fck_clksel,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
-                        OMAP24XX_CLKSEL_DSS2_MASK,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-                        OMAP24XX_EN_DSS2_SHIFT, NULL,
-                        dss2_fck_parent_names, dss1_fck_ops);
-
-static const char *func_54m_ck_parent_names[] = {
-       "apll54_ck", "alt_ck",
-};
-
-DEFINE_CLK_MUX(func_54m_ck, func_54m_ck_parent_names, NULL, 0x0,
-              OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
-              OMAP24XX_54M_SOURCE_SHIFT, OMAP24XX_54M_SOURCE_WIDTH, 0x0, NULL);
-
-static struct clk dss_54m_fck;
-
-static const char *dss_54m_fck_parent_names[] = {
-       "func_54m_ck",
-};
-
-static struct clk_hw_omap dss_54m_fck_hw = {
-       .hw = {
-               .clk = &dss_54m_fck,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-       .enable_bit     = OMAP24XX_EN_TV_SHIFT,
-       .clkdm_name     = "dss_clkdm",
-};
-
-DEFINE_STRUCT_CLK(dss_54m_fck, dss_54m_fck_parent_names, aes_ick_ops);
-
-static struct clk dss_ick;
-
-static struct clk_hw_omap dss_ick_hw = {
-       .hw = {
-               .clk = &dss_ick,
-       },
-       .ops            = &clkhwops_iclk,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_DSS1_SHIFT,
-       .clkdm_name     = "dss_clkdm",
-};
-
-DEFINE_STRUCT_CLK(dss_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk emul_ck;
-
-static struct clk_hw_omap emul_ck_hw = {
-       .hw = {
-               .clk = &emul_ck,
-       },
-       .enable_reg     = OMAP2430_PRCM_CLKEMUL_CTRL,
-       .enable_bit     = OMAP24XX_EMULATION_EN_SHIFT,
-       .clkdm_name     = "wkup_clkdm",
-};
-
-DEFINE_STRUCT_CLK(emul_ck, dss_54m_fck_parent_names, aes_ick_ops);
-
-DEFINE_CLK_FIXED_FACTOR(func_12m_ck, "func_48m_ck", &func_48m_ck, 0x0, 1, 4);
-
-static struct clk fac_fck;
-
-static const char *fac_fck_parent_names[] = {
-       "func_12m_ck",
-};
-
-static struct clk_hw_omap fac_fck_hw = {
-       .hw = {
-               .clk = &fac_fck,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-       .enable_bit     = OMAP24XX_EN_FAC_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(fac_fck, fac_fck_parent_names, aes_ick_ops);
-
-static struct clk fac_ick;
-
-static struct clk_hw_omap fac_ick_hw = {
-       .hw = {
-               .clk = &fac_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_FAC_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(fac_ick, aes_ick_parent_names, aes_ick_ops);
-
-static const struct clksel gfx_fck_clksel[] = {
-       { .parent = &core_l3_ck, .rates = gfx_l3_rates },
-       { .parent = NULL },
-};
-
-static const char *gfx_2d_fck_parent_names[] = {
-       "core_l3_ck",
-};
-
-DEFINE_CLK_OMAP_MUX_GATE(gfx_2d_fck, "gfx_clkdm", gfx_fck_clksel,
-                        OMAP_CM_REGADDR(GFX_MOD, CM_CLKSEL),
-                        OMAP_CLKSEL_GFX_MASK,
-                        OMAP_CM_REGADDR(GFX_MOD, CM_FCLKEN),
-                        OMAP24XX_EN_2D_SHIFT, &clkhwops_wait,
-                        gfx_2d_fck_parent_names, dsp_fck_ops);
-
-DEFINE_CLK_OMAP_MUX_GATE(gfx_3d_fck, "gfx_clkdm", gfx_fck_clksel,
-                        OMAP_CM_REGADDR(GFX_MOD, CM_CLKSEL),
-                        OMAP_CLKSEL_GFX_MASK,
-                        OMAP_CM_REGADDR(GFX_MOD, CM_FCLKEN),
-                        OMAP24XX_EN_3D_SHIFT, &clkhwops_wait,
-                        gfx_2d_fck_parent_names, dsp_fck_ops);
-
-static struct clk gfx_ick;
-
-static const char *gfx_ick_parent_names[] = {
-       "core_l3_ck",
-};
-
-static struct clk_hw_omap gfx_ick_hw = {
-       .hw = {
-               .clk = &gfx_ick,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(GFX_MOD, CM_ICLKEN),
-       .enable_bit     = OMAP_EN_GFX_SHIFT,
-       .clkdm_name     = "gfx_clkdm",
-};
-
-DEFINE_STRUCT_CLK(gfx_ick, gfx_ick_parent_names, aes_ick_ops);
-
-static struct clk gpio5_fck;
-
-static const char *gpio5_fck_parent_names[] = {
-       "func_32k_ck",
-};
-
-static struct clk_hw_omap gpio5_fck_hw = {
-       .hw = {
-               .clk = &gpio5_fck,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
-       .enable_bit     = OMAP2430_EN_GPIO5_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(gpio5_fck, gpio5_fck_parent_names, aes_ick_ops);
-
-static struct clk gpio5_ick;
-
-static struct clk_hw_omap gpio5_ick_hw = {
-       .hw = {
-               .clk = &gpio5_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
-       .enable_bit     = OMAP2430_EN_GPIO5_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(gpio5_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk gpios_fck;
-
-static struct clk_hw_omap gpios_fck_hw = {
-       .hw = {
-               .clk = &gpios_fck,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
-       .enable_bit     = OMAP24XX_EN_GPIOS_SHIFT,
-       .clkdm_name     = "wkup_clkdm",
-};
-
-DEFINE_STRUCT_CLK(gpios_fck, gpio5_fck_parent_names, aes_ick_ops);
-
-static struct clk gpios_ick;
-
-static const char *gpios_ick_parent_names[] = {
-       "sys_ck",
-};
-
-static struct clk_hw_omap gpios_ick_hw = {
-       .hw = {
-               .clk = &gpios_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
-       .enable_bit     = OMAP24XX_EN_GPIOS_SHIFT,
-       .clkdm_name     = "wkup_clkdm",
-};
-
-DEFINE_STRUCT_CLK(gpios_ick, gpios_ick_parent_names, aes_ick_ops);
-
-static struct clk gpmc_fck;
-
-static struct clk_hw_omap gpmc_fck_hw = {
-       .hw = {
-               .clk = &gpmc_fck,
-       },
-       .ops            = &clkhwops_iclk,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3),
-       .enable_bit     = OMAP24XX_AUTO_GPMC_SHIFT,
-       .flags          = ENABLE_ON_INIT,
-       .clkdm_name     = "core_l3_clkdm",
-};
-
-DEFINE_STRUCT_CLK(gpmc_fck, gfx_ick_parent_names, core_ck_ops);
-
-static const struct clksel_rate gpt_alt_rates[] = {
-       { .div = 1, .val = 2, .flags = RATE_IN_24XX },
-       { .div = 0 }
-};
-
-static const struct clksel omap24xx_gpt_clksel[] = {
-       { .parent = &func_32k_ck, .rates = gpt_32k_rates },
-       { .parent = &sys_ck, .rates = gpt_sys_rates },
-       { .parent = &alt_ck, .rates = gpt_alt_rates },
-       { .parent = NULL },
-};
-
-static const char *gpt10_fck_parent_names[] = {
-       "func_32k_ck", "sys_ck", "alt_ck",
-};
-
-DEFINE_CLK_OMAP_MUX_GATE(gpt10_fck, "core_l4_clkdm", omap24xx_gpt_clksel,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
-                        OMAP24XX_CLKSEL_GPT10_MASK,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-                        OMAP24XX_EN_GPT10_SHIFT, &clkhwops_wait,
-                        gpt10_fck_parent_names, dss1_fck_ops);
-
-static struct clk gpt10_ick;
-
-static struct clk_hw_omap gpt10_ick_hw = {
-       .hw = {
-               .clk = &gpt10_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_GPT10_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(gpt10_ick, aes_ick_parent_names, aes_ick_ops);
-
-DEFINE_CLK_OMAP_MUX_GATE(gpt11_fck, "core_l4_clkdm", omap24xx_gpt_clksel,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
-                        OMAP24XX_CLKSEL_GPT11_MASK,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-                        OMAP24XX_EN_GPT11_SHIFT, &clkhwops_wait,
-                        gpt10_fck_parent_names, dss1_fck_ops);
-
-static struct clk gpt11_ick;
-
-static struct clk_hw_omap gpt11_ick_hw = {
-       .hw = {
-               .clk = &gpt11_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_GPT11_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(gpt11_ick, aes_ick_parent_names, aes_ick_ops);
-
-DEFINE_CLK_OMAP_MUX_GATE(gpt12_fck, "core_l4_clkdm", omap24xx_gpt_clksel,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
-                        OMAP24XX_CLKSEL_GPT12_MASK,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-                        OMAP24XX_EN_GPT12_SHIFT, &clkhwops_wait,
-                        gpt10_fck_parent_names, dss1_fck_ops);
-
-static struct clk gpt12_ick;
-
-static struct clk_hw_omap gpt12_ick_hw = {
-       .hw = {
-               .clk = &gpt12_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_GPT12_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(gpt12_ick, aes_ick_parent_names, aes_ick_ops);
-
-static const struct clk_ops gpt1_fck_ops = {
-       .init           = &omap2_init_clk_clkdm,
-       .enable         = &omap2_dflt_clk_enable,
-       .disable        = &omap2_dflt_clk_disable,
-       .is_enabled     = &omap2_dflt_clk_is_enabled,
-       .recalc_rate    = &omap2_clksel_recalc,
-       .set_rate       = &omap2_clksel_set_rate,
-       .round_rate     = &omap2_clksel_round_rate,
-       .get_parent     = &omap2_clksel_find_parent_index,
-       .set_parent     = &omap2_clksel_set_parent,
-};
-
-DEFINE_CLK_OMAP_MUX_GATE(gpt1_fck, "core_l4_clkdm", omap24xx_gpt_clksel,
-                        OMAP_CM_REGADDR(WKUP_MOD, CM_CLKSEL1),
-                        OMAP24XX_CLKSEL_GPT1_MASK,
-                        OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
-                        OMAP24XX_EN_GPT1_SHIFT, &clkhwops_wait,
-                        gpt10_fck_parent_names, gpt1_fck_ops);
-
-static struct clk gpt1_ick;
-
-static struct clk_hw_omap gpt1_ick_hw = {
-       .hw = {
-               .clk = &gpt1_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
-       .enable_bit     = OMAP24XX_EN_GPT1_SHIFT,
-       .clkdm_name     = "wkup_clkdm",
-};
-
-DEFINE_STRUCT_CLK(gpt1_ick, gpios_ick_parent_names, aes_ick_ops);
-
-DEFINE_CLK_OMAP_MUX_GATE(gpt2_fck, "core_l4_clkdm", omap24xx_gpt_clksel,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
-                        OMAP24XX_CLKSEL_GPT2_MASK,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-                        OMAP24XX_EN_GPT2_SHIFT, &clkhwops_wait,
-                        gpt10_fck_parent_names, dss1_fck_ops);
-
-static struct clk gpt2_ick;
-
-static struct clk_hw_omap gpt2_ick_hw = {
-       .hw = {
-               .clk = &gpt2_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_GPT2_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(gpt2_ick, aes_ick_parent_names, aes_ick_ops);
-
-DEFINE_CLK_OMAP_MUX_GATE(gpt3_fck, "core_l4_clkdm", omap24xx_gpt_clksel,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
-                        OMAP24XX_CLKSEL_GPT3_MASK,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-                        OMAP24XX_EN_GPT3_SHIFT, &clkhwops_wait,
-                        gpt10_fck_parent_names, dss1_fck_ops);
-
-static struct clk gpt3_ick;
-
-static struct clk_hw_omap gpt3_ick_hw = {
-       .hw = {
-               .clk = &gpt3_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_GPT3_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(gpt3_ick, aes_ick_parent_names, aes_ick_ops);
-
-DEFINE_CLK_OMAP_MUX_GATE(gpt4_fck, "core_l4_clkdm", omap24xx_gpt_clksel,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
-                        OMAP24XX_CLKSEL_GPT4_MASK,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-                        OMAP24XX_EN_GPT4_SHIFT, &clkhwops_wait,
-                        gpt10_fck_parent_names, dss1_fck_ops);
-
-static struct clk gpt4_ick;
-
-static struct clk_hw_omap gpt4_ick_hw = {
-       .hw = {
-               .clk = &gpt4_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_GPT4_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(gpt4_ick, aes_ick_parent_names, aes_ick_ops);
-
-DEFINE_CLK_OMAP_MUX_GATE(gpt5_fck, "core_l4_clkdm", omap24xx_gpt_clksel,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
-                        OMAP24XX_CLKSEL_GPT5_MASK,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-                        OMAP24XX_EN_GPT5_SHIFT, &clkhwops_wait,
-                        gpt10_fck_parent_names, dss1_fck_ops);
-
-static struct clk gpt5_ick;
-
-static struct clk_hw_omap gpt5_ick_hw = {
-       .hw = {
-               .clk = &gpt5_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_GPT5_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(gpt5_ick, aes_ick_parent_names, aes_ick_ops);
-
-DEFINE_CLK_OMAP_MUX_GATE(gpt6_fck, "core_l4_clkdm", omap24xx_gpt_clksel,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
-                        OMAP24XX_CLKSEL_GPT6_MASK,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-                        OMAP24XX_EN_GPT6_SHIFT, &clkhwops_wait,
-                        gpt10_fck_parent_names, dss1_fck_ops);
-
-static struct clk gpt6_ick;
-
-static struct clk_hw_omap gpt6_ick_hw = {
-       .hw = {
-               .clk = &gpt6_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_GPT6_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(gpt6_ick, aes_ick_parent_names, aes_ick_ops);
-
-DEFINE_CLK_OMAP_MUX_GATE(gpt7_fck, "core_l4_clkdm", omap24xx_gpt_clksel,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
-                        OMAP24XX_CLKSEL_GPT7_MASK,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-                        OMAP24XX_EN_GPT7_SHIFT, &clkhwops_wait,
-                        gpt10_fck_parent_names, dss1_fck_ops);
-
-static struct clk gpt7_ick;
-
-static struct clk_hw_omap gpt7_ick_hw = {
-       .hw = {
-               .clk = &gpt7_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_GPT7_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(gpt7_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk gpt8_fck;
-
-DEFINE_CLK_OMAP_MUX_GATE(gpt8_fck, "core_l4_clkdm", omap24xx_gpt_clksel,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
-                        OMAP24XX_CLKSEL_GPT8_MASK,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-                        OMAP24XX_EN_GPT8_SHIFT, &clkhwops_wait,
-                        gpt10_fck_parent_names, dss1_fck_ops);
-
-static struct clk gpt8_ick;
-
-static struct clk_hw_omap gpt8_ick_hw = {
-       .hw = {
-               .clk = &gpt8_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_GPT8_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(gpt8_ick, aes_ick_parent_names, aes_ick_ops);
-
-DEFINE_CLK_OMAP_MUX_GATE(gpt9_fck, "core_l4_clkdm", omap24xx_gpt_clksel,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
-                        OMAP24XX_CLKSEL_GPT9_MASK,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-                        OMAP24XX_EN_GPT9_SHIFT, &clkhwops_wait,
-                        gpt10_fck_parent_names, dss1_fck_ops);
-
-static struct clk gpt9_ick;
-
-static struct clk_hw_omap gpt9_ick_hw = {
-       .hw = {
-               .clk = &gpt9_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_GPT9_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(gpt9_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk hdq_fck;
-
-static struct clk_hw_omap hdq_fck_hw = {
-       .hw = {
-               .clk = &hdq_fck,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-       .enable_bit     = OMAP24XX_EN_HDQ_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(hdq_fck, fac_fck_parent_names, aes_ick_ops);
-
-static struct clk hdq_ick;
-
-static struct clk_hw_omap hdq_ick_hw = {
-       .hw = {
-               .clk = &hdq_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_HDQ_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(hdq_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk i2c1_ick;
-
-static struct clk_hw_omap i2c1_ick_hw = {
-       .hw = {
-               .clk = &i2c1_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP2420_EN_I2C1_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(i2c1_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk i2c2_ick;
-
-static struct clk_hw_omap i2c2_ick_hw = {
-       .hw = {
-               .clk = &i2c2_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP2420_EN_I2C2_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(i2c2_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk i2chs1_fck;
-
-static struct clk_hw_omap i2chs1_fck_hw = {
-       .hw = {
-               .clk = &i2chs1_fck,
-       },
-       .ops            = &clkhwops_omap2430_i2chs_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
-       .enable_bit     = OMAP2430_EN_I2CHS1_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(i2chs1_fck, cam_fck_parent_names, aes_ick_ops);
-
-static struct clk i2chs2_fck;
-
-static struct clk_hw_omap i2chs2_fck_hw = {
-       .hw = {
-               .clk = &i2chs2_fck,
-       },
-       .ops            = &clkhwops_omap2430_i2chs_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
-       .enable_bit     = OMAP2430_EN_I2CHS2_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(i2chs2_fck, cam_fck_parent_names, aes_ick_ops);
-
-static struct clk icr_ick;
-
-static struct clk_hw_omap icr_ick_hw = {
-       .hw = {
-               .clk = &icr_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
-       .enable_bit     = OMAP2430_EN_ICR_SHIFT,
-       .clkdm_name     = "wkup_clkdm",
-};
-
-DEFINE_STRUCT_CLK(icr_ick, gpios_ick_parent_names, aes_ick_ops);
-
-static const struct clksel dsp_ick_clksel[] = {
-       { .parent = &dsp_fck, .rates = dsp_ick_rates },
-       { .parent = NULL },
-};
-
-static const char *iva2_1_ick_parent_names[] = {
-       "dsp_fck",
-};
-
-DEFINE_CLK_OMAP_MUX_GATE(iva2_1_ick, "dsp_clkdm", dsp_ick_clksel,
-                        OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_CLKSEL),
-                        OMAP24XX_CLKSEL_DSP_IF_MASK,
-                        OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_FCLKEN),
-                        OMAP24XX_CM_FCLKEN_DSP_EN_DSP_SHIFT, &clkhwops_wait,
-                        iva2_1_ick_parent_names, dsp_fck_ops);
-
-static struct clk mailboxes_ick;
-
-static struct clk_hw_omap mailboxes_ick_hw = {
-       .hw = {
-               .clk = &mailboxes_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_MAILBOXES_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(mailboxes_ick, aes_ick_parent_names, aes_ick_ops);
-
-static const struct clksel_rate common_mcbsp_96m_rates[] = {
-       { .div = 1, .val = 0, .flags = RATE_IN_24XX },
-       { .div = 0 }
-};
-
-static const struct clksel_rate common_mcbsp_mcbsp_rates[] = {
-       { .div = 1, .val = 1, .flags = RATE_IN_24XX },
-       { .div = 0 }
-};
-
-static const struct clksel mcbsp_fck_clksel[] = {
-       { .parent = &func_96m_ck, .rates = common_mcbsp_96m_rates },
-       { .parent = &mcbsp_clks, .rates = common_mcbsp_mcbsp_rates },
-       { .parent = NULL },
-};
-
-static const char *mcbsp1_fck_parent_names[] = {
-       "func_96m_ck", "mcbsp_clks",
-};
-
-DEFINE_CLK_OMAP_MUX_GATE(mcbsp1_fck, "core_l4_clkdm", mcbsp_fck_clksel,
-                        OMAP243X_CTRL_REGADDR(OMAP2_CONTROL_DEVCONF0),
-                        OMAP2_MCBSP1_CLKS_MASK,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-                        OMAP24XX_EN_MCBSP1_SHIFT, &clkhwops_wait,
-                        mcbsp1_fck_parent_names, dss1_fck_ops);
-
-static struct clk mcbsp1_ick;
-
-static struct clk_hw_omap mcbsp1_ick_hw = {
-       .hw = {
-               .clk = &mcbsp1_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_MCBSP1_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(mcbsp1_ick, aes_ick_parent_names, aes_ick_ops);
-
-DEFINE_CLK_OMAP_MUX_GATE(mcbsp2_fck, "core_l4_clkdm", mcbsp_fck_clksel,
-                        OMAP243X_CTRL_REGADDR(OMAP2_CONTROL_DEVCONF0),
-                        OMAP2_MCBSP2_CLKS_MASK,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-                        OMAP24XX_EN_MCBSP2_SHIFT, &clkhwops_wait,
-                        mcbsp1_fck_parent_names, dss1_fck_ops);
-
-static struct clk mcbsp2_ick;
-
-static struct clk_hw_omap mcbsp2_ick_hw = {
-       .hw = {
-               .clk = &mcbsp2_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_MCBSP2_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(mcbsp2_ick, aes_ick_parent_names, aes_ick_ops);
-
-DEFINE_CLK_OMAP_MUX_GATE(mcbsp3_fck, "core_l4_clkdm", mcbsp_fck_clksel,
-                        OMAP243X_CTRL_REGADDR(OMAP243X_CONTROL_DEVCONF1),
-                        OMAP2_MCBSP3_CLKS_MASK,
-                        OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
-                        OMAP2430_EN_MCBSP3_SHIFT, &clkhwops_wait,
-                        mcbsp1_fck_parent_names, dss1_fck_ops);
-
-static struct clk mcbsp3_ick;
-
-static struct clk_hw_omap mcbsp3_ick_hw = {
-       .hw = {
-               .clk = &mcbsp3_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
-       .enable_bit     = OMAP2430_EN_MCBSP3_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(mcbsp3_ick, aes_ick_parent_names, aes_ick_ops);
-
-DEFINE_CLK_OMAP_MUX_GATE(mcbsp4_fck, "core_l4_clkdm", mcbsp_fck_clksel,
-                        OMAP243X_CTRL_REGADDR(OMAP243X_CONTROL_DEVCONF1),
-                        OMAP2_MCBSP4_CLKS_MASK,
-                        OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
-                        OMAP2430_EN_MCBSP4_SHIFT, &clkhwops_wait,
-                        mcbsp1_fck_parent_names, dss1_fck_ops);
-
-static struct clk mcbsp4_ick;
-
-static struct clk_hw_omap mcbsp4_ick_hw = {
-       .hw = {
-               .clk = &mcbsp4_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
-       .enable_bit     = OMAP2430_EN_MCBSP4_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(mcbsp4_ick, aes_ick_parent_names, aes_ick_ops);
-
-DEFINE_CLK_OMAP_MUX_GATE(mcbsp5_fck, "core_l4_clkdm", mcbsp_fck_clksel,
-                        OMAP243X_CTRL_REGADDR(OMAP243X_CONTROL_DEVCONF1),
-                        OMAP2_MCBSP5_CLKS_MASK,
-                        OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
-                        OMAP2430_EN_MCBSP5_SHIFT, &clkhwops_wait,
-                        mcbsp1_fck_parent_names, dss1_fck_ops);
-
-static struct clk mcbsp5_ick;
-
-static struct clk_hw_omap mcbsp5_ick_hw = {
-       .hw = {
-               .clk = &mcbsp5_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
-       .enable_bit     = OMAP2430_EN_MCBSP5_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(mcbsp5_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk mcspi1_fck;
-
-static const char *mcspi1_fck_parent_names[] = {
-       "func_48m_ck",
-};
-
-static struct clk_hw_omap mcspi1_fck_hw = {
-       .hw = {
-               .clk = &mcspi1_fck,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-       .enable_bit     = OMAP24XX_EN_MCSPI1_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(mcspi1_fck, mcspi1_fck_parent_names, aes_ick_ops);
-
-static struct clk mcspi1_ick;
-
-static struct clk_hw_omap mcspi1_ick_hw = {
-       .hw = {
-               .clk = &mcspi1_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_MCSPI1_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(mcspi1_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk mcspi2_fck;
-
-static struct clk_hw_omap mcspi2_fck_hw = {
-       .hw = {
-               .clk = &mcspi2_fck,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-       .enable_bit     = OMAP24XX_EN_MCSPI2_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(mcspi2_fck, mcspi1_fck_parent_names, aes_ick_ops);
-
-static struct clk mcspi2_ick;
-
-static struct clk_hw_omap mcspi2_ick_hw = {
-       .hw = {
-               .clk = &mcspi2_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_MCSPI2_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(mcspi2_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk mcspi3_fck;
-
-static struct clk_hw_omap mcspi3_fck_hw = {
-       .hw = {
-               .clk = &mcspi3_fck,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
-       .enable_bit     = OMAP2430_EN_MCSPI3_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(mcspi3_fck, mcspi1_fck_parent_names, aes_ick_ops);
-
-static struct clk mcspi3_ick;
-
-static struct clk_hw_omap mcspi3_ick_hw = {
-       .hw = {
-               .clk = &mcspi3_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
-       .enable_bit     = OMAP2430_EN_MCSPI3_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(mcspi3_ick, aes_ick_parent_names, aes_ick_ops);
-
-static const struct clksel_rate mdm_ick_core_rates[] = {
-       { .div = 1, .val = 1, .flags = RATE_IN_243X },
-       { .div = 4, .val = 4, .flags = RATE_IN_243X },
-       { .div = 6, .val = 6, .flags = RATE_IN_243X },
-       { .div = 9, .val = 9, .flags = RATE_IN_243X },
-       { .div = 0 }
-};
-
-static const struct clksel mdm_ick_clksel[] = {
-       { .parent = &core_ck, .rates = mdm_ick_core_rates },
-       { .parent = NULL },
-};
-
-static const char *mdm_ick_parent_names[] = {
-       "core_ck",
-};
-
-DEFINE_CLK_OMAP_MUX_GATE(mdm_ick, "mdm_clkdm", mdm_ick_clksel,
-                        OMAP_CM_REGADDR(OMAP2430_MDM_MOD, CM_CLKSEL),
-                        OMAP2430_CLKSEL_MDM_MASK,
-                        OMAP_CM_REGADDR(OMAP2430_MDM_MOD, CM_ICLKEN),
-                        OMAP2430_CM_ICLKEN_MDM_EN_MDM_SHIFT,
-                        &clkhwops_iclk_wait, mdm_ick_parent_names,
-                        dsp_fck_ops);
-
-static struct clk mdm_intc_ick;
-
-static struct clk_hw_omap mdm_intc_ick_hw = {
-       .hw = {
-               .clk = &mdm_intc_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
-       .enable_bit     = OMAP2430_EN_MDM_INTC_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(mdm_intc_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk mdm_osc_ck;
-
-static struct clk_hw_omap mdm_osc_ck_hw = {
-       .hw = {
-               .clk = &mdm_osc_ck,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(OMAP2430_MDM_MOD, CM_FCLKEN),
-       .enable_bit     = OMAP2430_EN_OSC_SHIFT,
-       .clkdm_name     = "mdm_clkdm",
-};
-
-DEFINE_STRUCT_CLK(mdm_osc_ck, sys_ck_parent_names, aes_ick_ops);
-
-static struct clk mmchs1_fck;
-
-static struct clk_hw_omap mmchs1_fck_hw = {
-       .hw = {
-               .clk = &mmchs1_fck,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
-       .enable_bit     = OMAP2430_EN_MMCHS1_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(mmchs1_fck, cam_fck_parent_names, aes_ick_ops);
-
-static struct clk mmchs1_ick;
-
-static struct clk_hw_omap mmchs1_ick_hw = {
-       .hw = {
-               .clk = &mmchs1_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
-       .enable_bit     = OMAP2430_EN_MMCHS1_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(mmchs1_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk mmchs2_fck;
-
-static struct clk_hw_omap mmchs2_fck_hw = {
-       .hw = {
-               .clk = &mmchs2_fck,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
-       .enable_bit     = OMAP2430_EN_MMCHS2_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(mmchs2_fck, cam_fck_parent_names, aes_ick_ops);
-
-static struct clk mmchs2_ick;
-
-static struct clk_hw_omap mmchs2_ick_hw = {
-       .hw = {
-               .clk = &mmchs2_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
-       .enable_bit     = OMAP2430_EN_MMCHS2_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(mmchs2_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk mmchsdb1_fck;
-
-static struct clk_hw_omap mmchsdb1_fck_hw = {
-       .hw = {
-               .clk = &mmchsdb1_fck,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
-       .enable_bit     = OMAP2430_EN_MMCHSDB1_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(mmchsdb1_fck, gpio5_fck_parent_names, aes_ick_ops);
-
-static struct clk mmchsdb2_fck;
-
-static struct clk_hw_omap mmchsdb2_fck_hw = {
-       .hw = {
-               .clk = &mmchsdb2_fck,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
-       .enable_bit     = OMAP2430_EN_MMCHSDB2_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(mmchsdb2_fck, gpio5_fck_parent_names, aes_ick_ops);
-
-DEFINE_CLK_DIVIDER(mpu_ck, "core_ck", &core_ck, 0x0,
-                  OMAP_CM_REGADDR(MPU_MOD, CM_CLKSEL),
-                  OMAP24XX_CLKSEL_MPU_SHIFT, OMAP24XX_CLKSEL_MPU_WIDTH,
-                  CLK_DIVIDER_ONE_BASED, NULL);
-
-static struct clk mpu_wdt_fck;
-
-static struct clk_hw_omap mpu_wdt_fck_hw = {
-       .hw = {
-               .clk = &mpu_wdt_fck,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
-       .enable_bit     = OMAP24XX_EN_MPU_WDT_SHIFT,
-       .clkdm_name     = "wkup_clkdm",
-};
-
-DEFINE_STRUCT_CLK(mpu_wdt_fck, gpio5_fck_parent_names, aes_ick_ops);
-
-static struct clk mpu_wdt_ick;
-
-static struct clk_hw_omap mpu_wdt_ick_hw = {
-       .hw = {
-               .clk = &mpu_wdt_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
-       .enable_bit     = OMAP24XX_EN_MPU_WDT_SHIFT,
-       .clkdm_name     = "wkup_clkdm",
-};
-
-DEFINE_STRUCT_CLK(mpu_wdt_ick, gpios_ick_parent_names, aes_ick_ops);
-
-static struct clk mspro_fck;
-
-static struct clk_hw_omap mspro_fck_hw = {
-       .hw = {
-               .clk = &mspro_fck,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-       .enable_bit     = OMAP24XX_EN_MSPRO_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(mspro_fck, cam_fck_parent_names, aes_ick_ops);
-
-static struct clk mspro_ick;
-
-static struct clk_hw_omap mspro_ick_hw = {
-       .hw = {
-               .clk = &mspro_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_MSPRO_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(mspro_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk omapctrl_ick;
-
-static struct clk_hw_omap omapctrl_ick_hw = {
-       .hw = {
-               .clk = &omapctrl_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
-       .enable_bit     = OMAP24XX_EN_OMAPCTRL_SHIFT,
-       .flags          = ENABLE_ON_INIT,
-       .clkdm_name     = "wkup_clkdm",
-};
-
-DEFINE_STRUCT_CLK(omapctrl_ick, gpios_ick_parent_names, aes_ick_ops);
-
-static struct clk pka_ick;
-
-static struct clk_hw_omap pka_ick_hw = {
-       .hw = {
-               .clk = &pka_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4),
-       .enable_bit     = OMAP24XX_EN_PKA_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(pka_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk rng_ick;
-
-static struct clk_hw_omap rng_ick_hw = {
-       .hw = {
-               .clk = &rng_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4),
-       .enable_bit     = OMAP24XX_EN_RNG_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(rng_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk sdma_fck;
-
-DEFINE_STRUCT_CLK_HW_OMAP(sdma_fck, "core_l3_clkdm");
-DEFINE_STRUCT_CLK(sdma_fck, gfx_ick_parent_names, core_ck_ops);
-
-static struct clk sdma_ick;
-
-static struct clk_hw_omap sdma_ick_hw = {
-       .hw = {
-               .clk = &sdma_ick,
-       },
-       .ops            = &clkhwops_iclk,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3),
-       .enable_bit     = OMAP24XX_AUTO_SDMA_SHIFT,
-       .clkdm_name     = "core_l3_clkdm",
-};
-
-DEFINE_STRUCT_CLK(sdma_ick, gfx_ick_parent_names, core_ck_ops);
-
-static struct clk sdrc_ick;
-
-static struct clk_hw_omap sdrc_ick_hw = {
-       .hw = {
-               .clk = &sdrc_ick,
-       },
-       .ops            = &clkhwops_iclk,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3),
-       .enable_bit     = OMAP2430_EN_SDRC_SHIFT,
-       .flags          = ENABLE_ON_INIT,
-       .clkdm_name     = "core_l3_clkdm",
-};
-
-DEFINE_STRUCT_CLK(sdrc_ick, gfx_ick_parent_names, core_ck_ops);
-
-static struct clk sha_ick;
-
-static struct clk_hw_omap sha_ick_hw = {
-       .hw = {
-               .clk = &sha_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4),
-       .enable_bit     = OMAP24XX_EN_SHA_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(sha_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk ssi_l4_ick;
-
-static struct clk_hw_omap ssi_l4_ick_hw = {
-       .hw = {
-               .clk = &ssi_l4_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
-       .enable_bit     = OMAP24XX_EN_SSI_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(ssi_l4_ick, aes_ick_parent_names, aes_ick_ops);
-
-static const struct clksel_rate ssi_ssr_sst_fck_core_rates[] = {
-       { .div = 1, .val = 1, .flags = RATE_IN_24XX },
-       { .div = 2, .val = 2, .flags = RATE_IN_24XX },
-       { .div = 3, .val = 3, .flags = RATE_IN_24XX },
-       { .div = 4, .val = 4, .flags = RATE_IN_24XX },
-       { .div = 5, .val = 5, .flags = RATE_IN_243X },
-       { .div = 0 }
-};
-
-static const struct clksel ssi_ssr_sst_fck_clksel[] = {
-       { .parent = &core_ck, .rates = ssi_ssr_sst_fck_core_rates },
-       { .parent = NULL },
-};
-
-static const char *ssi_ssr_sst_fck_parent_names[] = {
-       "core_ck",
-};
-
-DEFINE_CLK_OMAP_MUX_GATE(ssi_ssr_sst_fck, "core_l3_clkdm",
-                        ssi_ssr_sst_fck_clksel,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
-                        OMAP24XX_CLKSEL_SSI_MASK,
-                        OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
-                        OMAP24XX_EN_SSI_SHIFT, &clkhwops_wait,
-                        ssi_ssr_sst_fck_parent_names, dsp_fck_ops);
-
-static struct clk sync_32k_ick;
-
-static struct clk_hw_omap sync_32k_ick_hw = {
-       .hw = {
-               .clk = &sync_32k_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
-       .enable_bit     = OMAP24XX_EN_32KSYNC_SHIFT,
-       .flags          = ENABLE_ON_INIT,
-       .clkdm_name     = "wkup_clkdm",
-};
-
-DEFINE_STRUCT_CLK(sync_32k_ick, gpios_ick_parent_names, aes_ick_ops);
-
-static const struct clksel_rate common_clkout_src_core_rates[] = {
-       { .div = 1, .val = 0, .flags = RATE_IN_24XX },
-       { .div = 0 }
-};
-
-static const struct clksel_rate common_clkout_src_sys_rates[] = {
-       { .div = 1, .val = 1, .flags = RATE_IN_24XX },
-       { .div = 0 }
-};
-
-static const struct clksel_rate common_clkout_src_96m_rates[] = {
-       { .div = 1, .val = 2, .flags = RATE_IN_24XX },
-       { .div = 0 }
-};
-
-static const struct clksel_rate common_clkout_src_54m_rates[] = {
-       { .div = 1, .val = 3, .flags = RATE_IN_24XX },
-       { .div = 0 }
-};
-
-static const struct clksel common_clkout_src_clksel[] = {
-       { .parent = &core_ck, .rates = common_clkout_src_core_rates },
-       { .parent = &sys_ck, .rates = common_clkout_src_sys_rates },
-       { .parent = &func_96m_ck, .rates = common_clkout_src_96m_rates },
-       { .parent = &func_54m_ck, .rates = common_clkout_src_54m_rates },
-       { .parent = NULL },
-};
-
-static const char *sys_clkout_src_parent_names[] = {
-       "core_ck", "sys_ck", "func_96m_ck", "func_54m_ck",
-};
-
-DEFINE_CLK_OMAP_MUX_GATE(sys_clkout_src, "wkup_clkdm", common_clkout_src_clksel,
-                        OMAP2430_PRCM_CLKOUT_CTRL, OMAP24XX_CLKOUT_SOURCE_MASK,
-                        OMAP2430_PRCM_CLKOUT_CTRL, OMAP24XX_CLKOUT_EN_SHIFT,
-                        NULL, sys_clkout_src_parent_names, gpt1_fck_ops);
-
-DEFINE_CLK_DIVIDER(sys_clkout, "sys_clkout_src", &sys_clkout_src, 0x0,
-                  OMAP2430_PRCM_CLKOUT_CTRL, OMAP24XX_CLKOUT_DIV_SHIFT,
-                  OMAP24XX_CLKOUT_DIV_WIDTH, CLK_DIVIDER_POWER_OF_TWO, NULL);
-
-static struct clk uart1_fck;
-
-static struct clk_hw_omap uart1_fck_hw = {
-       .hw = {
-               .clk = &uart1_fck,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-       .enable_bit     = OMAP24XX_EN_UART1_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(uart1_fck, mcspi1_fck_parent_names, aes_ick_ops);
-
-static struct clk uart1_ick;
-
-static struct clk_hw_omap uart1_ick_hw = {
-       .hw = {
-               .clk = &uart1_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_UART1_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(uart1_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk uart2_fck;
-
-static struct clk_hw_omap uart2_fck_hw = {
-       .hw = {
-               .clk = &uart2_fck,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-       .enable_bit     = OMAP24XX_EN_UART2_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(uart2_fck, mcspi1_fck_parent_names, aes_ick_ops);
-
-static struct clk uart2_ick;
-
-static struct clk_hw_omap uart2_ick_hw = {
-       .hw = {
-               .clk = &uart2_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_UART2_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(uart2_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk uart3_fck;
-
-static struct clk_hw_omap uart3_fck_hw = {
-       .hw = {
-               .clk = &uart3_fck,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
-       .enable_bit     = OMAP24XX_EN_UART3_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(uart3_fck, mcspi1_fck_parent_names, aes_ick_ops);
-
-static struct clk uart3_ick;
-
-static struct clk_hw_omap uart3_ick_hw = {
-       .hw = {
-               .clk = &uart3_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
-       .enable_bit     = OMAP24XX_EN_UART3_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(uart3_ick, aes_ick_parent_names, aes_ick_ops);
-
-static struct clk usb_fck;
-
-static struct clk_hw_omap usb_fck_hw = {
-       .hw = {
-               .clk = &usb_fck,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
-       .enable_bit     = OMAP24XX_EN_USB_SHIFT,
-       .clkdm_name     = "core_l3_clkdm",
-};
-
-DEFINE_STRUCT_CLK(usb_fck, mcspi1_fck_parent_names, aes_ick_ops);
-
-static const struct clksel_rate usb_l4_ick_core_l3_rates[] = {
-       { .div = 1, .val = 1, .flags = RATE_IN_24XX },
-       { .div = 2, .val = 2, .flags = RATE_IN_24XX },
-       { .div = 4, .val = 4, .flags = RATE_IN_24XX },
-       { .div = 0 }
-};
-
-static const struct clksel usb_l4_ick_clksel[] = {
-       { .parent = &core_l3_ck, .rates = usb_l4_ick_core_l3_rates },
-       { .parent = NULL },
-};
-
-static const char *usb_l4_ick_parent_names[] = {
-       "core_l3_ck",
-};
-
-DEFINE_CLK_OMAP_MUX_GATE(usb_l4_ick, "core_l4_clkdm", usb_l4_ick_clksel,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
-                        OMAP24XX_CLKSEL_USB_MASK,
-                        OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
-                        OMAP24XX_EN_USB_SHIFT, &clkhwops_iclk_wait,
-                        usb_l4_ick_parent_names, dsp_fck_ops);
-
-static struct clk usbhs_ick;
-
-static struct clk_hw_omap usbhs_ick_hw = {
-       .hw = {
-               .clk = &usbhs_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
-       .enable_bit     = OMAP2430_EN_USBHS_SHIFT,
-       .clkdm_name     = "core_l3_clkdm",
-};
-
-DEFINE_STRUCT_CLK(usbhs_ick, gfx_ick_parent_names, aes_ick_ops);
-
-static struct clk virt_prcm_set;
-
-static const char *virt_prcm_set_parent_names[] = {
-       "mpu_ck",
-};
-
-static const struct clk_ops virt_prcm_set_ops = {
-       .recalc_rate    = &omap2_table_mpu_recalc,
-       .set_rate       = &omap2_select_table_rate,
-       .round_rate     = &omap2_round_to_table_rate,
-};
-
-DEFINE_STRUCT_CLK_HW_OMAP(virt_prcm_set, NULL);
-DEFINE_STRUCT_CLK(virt_prcm_set, virt_prcm_set_parent_names, virt_prcm_set_ops);
-
-static struct clk wdt1_ick;
-
-static struct clk_hw_omap wdt1_ick_hw = {
-       .hw = {
-               .clk = &wdt1_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
-       .enable_bit     = OMAP24XX_EN_WDT1_SHIFT,
-       .clkdm_name     = "wkup_clkdm",
-};
-
-DEFINE_STRUCT_CLK(wdt1_ick, gpios_ick_parent_names, aes_ick_ops);
-
-static struct clk wdt4_fck;
-
-static struct clk_hw_omap wdt4_fck_hw = {
-       .hw = {
-               .clk = &wdt4_fck,
-       },
-       .ops            = &clkhwops_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
-       .enable_bit     = OMAP24XX_EN_WDT4_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(wdt4_fck, gpio5_fck_parent_names, aes_ick_ops);
-
-static struct clk wdt4_ick;
-
-static struct clk_hw_omap wdt4_ick_hw = {
-       .hw = {
-               .clk = &wdt4_ick,
-       },
-       .ops            = &clkhwops_iclk_wait,
-       .enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
-       .enable_bit     = OMAP24XX_EN_WDT4_SHIFT,
-       .clkdm_name     = "core_l4_clkdm",
-};
-
-DEFINE_STRUCT_CLK(wdt4_ick, aes_ick_parent_names, aes_ick_ops);
-
-/*
- * clkdev integration
- */
-
-static struct omap_clk omap2430_clks[] = {
-       /* external root sources */
-       CLK(NULL,       "func_32k_ck",  &func_32k_ck),
-       CLK(NULL,       "secure_32k_ck", &secure_32k_ck),
-       CLK(NULL,       "osc_ck",       &osc_ck),
-       CLK("twl",      "fck",          &osc_ck),
-       CLK(NULL,       "sys_ck",       &sys_ck),
-       CLK(NULL,       "alt_ck",       &alt_ck),
-       CLK(NULL,       "mcbsp_clks",   &mcbsp_clks),
-       /* internal analog sources */
-       CLK(NULL,       "dpll_ck",      &dpll_ck),
-       CLK(NULL,       "apll96_ck",    &apll96_ck),
-       CLK(NULL,       "apll54_ck",    &apll54_ck),
-       /* internal prcm root sources */
-       CLK(NULL,       "func_54m_ck",  &func_54m_ck),
-       CLK(NULL,       "core_ck",      &core_ck),
-       CLK(NULL,       "func_96m_ck",  &func_96m_ck),
-       CLK(NULL,       "func_48m_ck",  &func_48m_ck),
-       CLK(NULL,       "func_12m_ck",  &func_12m_ck),
-       CLK(NULL,       "sys_clkout_src", &sys_clkout_src),
-       CLK(NULL,       "sys_clkout",   &sys_clkout),
-       CLK(NULL,       "emul_ck",      &emul_ck),
-       /* mpu domain clocks */
-       CLK(NULL,       "mpu_ck",       &mpu_ck),
-       /* dsp domain clocks */
-       CLK(NULL,       "dsp_fck",      &dsp_fck),
-       CLK(NULL,       "iva2_1_ick",   &iva2_1_ick),
-       /* GFX domain clocks */
-       CLK(NULL,       "gfx_3d_fck",   &gfx_3d_fck),
-       CLK(NULL,       "gfx_2d_fck",   &gfx_2d_fck),
-       CLK(NULL,       "gfx_ick",      &gfx_ick),
-       /* Modem domain clocks */
-       CLK(NULL,       "mdm_ick",      &mdm_ick),
-       CLK(NULL,       "mdm_osc_ck",   &mdm_osc_ck),
-       /* DSS domain clocks */
-       CLK("omapdss_dss",      "ick",          &dss_ick),
-       CLK(NULL,       "dss_ick",              &dss_ick),
-       CLK(NULL,       "dss1_fck",             &dss1_fck),
-       CLK(NULL,       "dss2_fck",     &dss2_fck),
-       CLK(NULL,       "dss_54m_fck",  &dss_54m_fck),
-       /* L3 domain clocks */
-       CLK(NULL,       "core_l3_ck",   &core_l3_ck),
-       CLK(NULL,       "ssi_fck",      &ssi_ssr_sst_fck),
-       CLK(NULL,       "usb_l4_ick",   &usb_l4_ick),
-       /* L4 domain clocks */
-       CLK(NULL,       "l4_ck",        &l4_ck),
-       CLK(NULL,       "ssi_l4_ick",   &ssi_l4_ick),
-       /* virtual meta-group clock */
-       CLK(NULL,       "virt_prcm_set", &virt_prcm_set),
-       /* general l4 interface ck, multi-parent functional clk */
-       CLK(NULL,       "gpt1_ick",     &gpt1_ick),
-       CLK(NULL,       "gpt1_fck",     &gpt1_fck),
-       CLK(NULL,       "gpt2_ick",     &gpt2_ick),
-       CLK(NULL,       "gpt2_fck",     &gpt2_fck),
-       CLK(NULL,       "gpt3_ick",     &gpt3_ick),
-       CLK(NULL,       "gpt3_fck",     &gpt3_fck),
-       CLK(NULL,       "gpt4_ick",     &gpt4_ick),
-       CLK(NULL,       "gpt4_fck",     &gpt4_fck),
-       CLK(NULL,       "gpt5_ick",     &gpt5_ick),
-       CLK(NULL,       "gpt5_fck",     &gpt5_fck),
-       CLK(NULL,       "gpt6_ick",     &gpt6_ick),
-       CLK(NULL,       "gpt6_fck",     &gpt6_fck),
-       CLK(NULL,       "gpt7_ick",     &gpt7_ick),
-       CLK(NULL,       "gpt7_fck",     &gpt7_fck),
-       CLK(NULL,       "gpt8_ick",     &gpt8_ick),
-       CLK(NULL,       "gpt8_fck",     &gpt8_fck),
-       CLK(NULL,       "gpt9_ick",     &gpt9_ick),
-       CLK(NULL,       "gpt9_fck",     &gpt9_fck),
-       CLK(NULL,       "gpt10_ick",    &gpt10_ick),
-       CLK(NULL,       "gpt10_fck",    &gpt10_fck),
-       CLK(NULL,       "gpt11_ick",    &gpt11_ick),
-       CLK(NULL,       "gpt11_fck",    &gpt11_fck),
-       CLK(NULL,       "gpt12_ick",    &gpt12_ick),
-       CLK(NULL,       "gpt12_fck",    &gpt12_fck),
-       CLK("omap-mcbsp.1", "ick",      &mcbsp1_ick),
-       CLK(NULL,       "mcbsp1_ick",   &mcbsp1_ick),
-       CLK(NULL,       "mcbsp1_fck",   &mcbsp1_fck),
-       CLK("omap-mcbsp.2", "ick",      &mcbsp2_ick),
-       CLK(NULL,       "mcbsp2_ick",   &mcbsp2_ick),
-       CLK(NULL,       "mcbsp2_fck",   &mcbsp2_fck),
-       CLK("omap-mcbsp.3", "ick",      &mcbsp3_ick),
-       CLK(NULL,       "mcbsp3_ick",   &mcbsp3_ick),
-       CLK(NULL,       "mcbsp3_fck",   &mcbsp3_fck),
-       CLK("omap-mcbsp.4", "ick",      &mcbsp4_ick),
-       CLK(NULL,       "mcbsp4_ick",   &mcbsp4_ick),
-       CLK(NULL,       "mcbsp4_fck",   &mcbsp4_fck),
-       CLK("omap-mcbsp.5", "ick",      &mcbsp5_ick),
-       CLK(NULL,       "mcbsp5_ick",   &mcbsp5_ick),
-       CLK(NULL,       "mcbsp5_fck",   &mcbsp5_fck),
-       CLK("omap2_mcspi.1", "ick",     &mcspi1_ick),
-       CLK(NULL,       "mcspi1_ick",   &mcspi1_ick),
-       CLK(NULL,       "mcspi1_fck",   &mcspi1_fck),
-       CLK("omap2_mcspi.2", "ick",     &mcspi2_ick),
-       CLK(NULL,       "mcspi2_ick",   &mcspi2_ick),
-       CLK(NULL,       "mcspi2_fck",   &mcspi2_fck),
-       CLK("omap2_mcspi.3", "ick",     &mcspi3_ick),
-       CLK(NULL,       "mcspi3_ick",   &mcspi3_ick),
-       CLK(NULL,       "mcspi3_fck",   &mcspi3_fck),
-       CLK(NULL,       "uart1_ick",    &uart1_ick),
-       CLK(NULL,       "uart1_fck",    &uart1_fck),
-       CLK(NULL,       "uart2_ick",    &uart2_ick),
-       CLK(NULL,       "uart2_fck",    &uart2_fck),
-       CLK(NULL,       "uart3_ick",    &uart3_ick),
-       CLK(NULL,       "uart3_fck",    &uart3_fck),
-       CLK(NULL,       "gpios_ick",    &gpios_ick),
-       CLK(NULL,       "gpios_fck",    &gpios_fck),
-       CLK("omap_wdt", "ick",          &mpu_wdt_ick),
-       CLK(NULL,       "mpu_wdt_ick",  &mpu_wdt_ick),
-       CLK(NULL,       "mpu_wdt_fck",  &mpu_wdt_fck),
-       CLK(NULL,       "sync_32k_ick", &sync_32k_ick),
-       CLK(NULL,       "wdt1_ick",     &wdt1_ick),
-       CLK(NULL,       "omapctrl_ick", &omapctrl_ick),
-       CLK(NULL,       "icr_ick",      &icr_ick),
-       CLK("omap24xxcam", "fck",       &cam_fck),
-       CLK(NULL,       "cam_fck",      &cam_fck),
-       CLK("omap24xxcam", "ick",       &cam_ick),
-       CLK(NULL,       "cam_ick",      &cam_ick),
-       CLK(NULL,       "mailboxes_ick", &mailboxes_ick),
-       CLK(NULL,       "wdt4_ick",     &wdt4_ick),
-       CLK(NULL,       "wdt4_fck",     &wdt4_fck),
-       CLK(NULL,       "mspro_ick",    &mspro_ick),
-       CLK(NULL,       "mspro_fck",    &mspro_fck),
-       CLK(NULL,       "fac_ick",      &fac_ick),
-       CLK(NULL,       "fac_fck",      &fac_fck),
-       CLK("omap_hdq.0", "ick",        &hdq_ick),
-       CLK(NULL,       "hdq_ick",      &hdq_ick),
-       CLK("omap_hdq.1", "fck",        &hdq_fck),
-       CLK(NULL,       "hdq_fck",      &hdq_fck),
-       CLK("omap_i2c.1", "ick",        &i2c1_ick),
-       CLK(NULL,       "i2c1_ick",     &i2c1_ick),
-       CLK(NULL,       "i2chs1_fck",   &i2chs1_fck),
-       CLK("omap_i2c.2", "ick",        &i2c2_ick),
-       CLK(NULL,       "i2c2_ick",     &i2c2_ick),
-       CLK(NULL,       "i2chs2_fck",   &i2chs2_fck),
-       CLK(NULL,       "gpmc_fck",     &gpmc_fck),
-       CLK(NULL,       "sdma_fck",     &sdma_fck),
-       CLK(NULL,       "sdma_ick",     &sdma_ick),
-       CLK(NULL,       "sdrc_ick",     &sdrc_ick),
-       CLK(NULL,       "des_ick",      &des_ick),
-       CLK("omap-sham",        "ick",  &sha_ick),
-       CLK(NULL,       "sha_ick",      &sha_ick),
-       CLK("omap_rng", "ick",          &rng_ick),
-       CLK(NULL,       "rng_ick",      &rng_ick),
-       CLK("omap-aes", "ick",  &aes_ick),
-       CLK(NULL,       "aes_ick",      &aes_ick),
-       CLK(NULL,       "pka_ick",      &pka_ick),
-       CLK(NULL,       "usb_fck",      &usb_fck),
-       CLK("musb-omap2430",    "ick",  &usbhs_ick),
-       CLK(NULL,       "usbhs_ick",    &usbhs_ick),
-       CLK("omap_hsmmc.0", "ick",      &mmchs1_ick),
-       CLK(NULL,       "mmchs1_ick",   &mmchs1_ick),
-       CLK(NULL,       "mmchs1_fck",   &mmchs1_fck),
-       CLK("omap_hsmmc.1", "ick",      &mmchs2_ick),
-       CLK(NULL,       "mmchs2_ick",   &mmchs2_ick),
-       CLK(NULL,       "mmchs2_fck",   &mmchs2_fck),
-       CLK(NULL,       "gpio5_ick",    &gpio5_ick),
-       CLK(NULL,       "gpio5_fck",    &gpio5_fck),
-       CLK(NULL,       "mdm_intc_ick", &mdm_intc_ick),
-       CLK("omap_hsmmc.0", "mmchsdb_fck",      &mmchsdb1_fck),
-       CLK(NULL,        "mmchsdb1_fck",        &mmchsdb1_fck),
-       CLK("omap_hsmmc.1", "mmchsdb_fck",      &mmchsdb2_fck),
-       CLK(NULL,        "mmchsdb2_fck",        &mmchsdb2_fck),
-       CLK(NULL,       "timer_32k_ck",  &func_32k_ck),
-       CLK(NULL,       "timer_sys_ck", &sys_ck),
-       CLK(NULL,       "timer_ext_ck", &alt_ck),
-       CLK(NULL,       "cpufreq_ck",   &virt_prcm_set),
-};
-
-static const char *enable_init_clks[] = {
-       "apll96_ck",
-       "apll54_ck",
-       "sync_32k_ick",
-       "omapctrl_ick",
-       "gpmc_fck",
-       "sdrc_ick",
-};
-
-/*
- * init code
- */
-
-int __init omap2430_clk_init(void)
-{
-       prcm_clksrc_ctrl = OMAP2430_PRCM_CLKSRC_CTRL;
-       cpu_mask = RATE_IN_243X;
-       rate_table = omap2430_rate_table;
-
-       omap2xxx_clkt_dpllcore_init(&dpll_ck_hw.hw);
-
-       omap2xxx_clkt_vps_check_bootloader_rates();
-
-       omap_clocks_register(omap2430_clks, ARRAY_SIZE(omap2430_clks));
-
-       omap2xxx_clkt_vps_late_init();
-
-       omap2_clk_disable_autoidle_all();
-
-       omap2_clk_enable_init_clocks(enable_init_clks,
-                                    ARRAY_SIZE(enable_init_clks));
-
-       pr_info("Clocking rate (Crystal/DPLL/MPU): %ld.%01ld/%ld/%ld MHz\n",
-               (clk_get_rate(&sys_ck) / 1000000),
-               (clk_get_rate(&sys_ck) / 100000) % 10,
-               (clk_get_rate(&dpll_ck) / 1000000),
-               (clk_get_rate(&mpu_ck) / 1000000));
-
-       return 0;
-}
diff --git a/arch/arm/mach-omap2/clkt2xxx_osc.c b/arch/arm/mach-omap2/clkt2xxx_osc.c
deleted file mode 100644 (file)
index 0717dff..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * OMAP2xxx osc_clk-specific clock code
- *
- * Copyright (C) 2005-2008 Texas Instruments, Inc.
- * Copyright (C) 2004-2010 Nokia Corporation
- *
- * Contacts:
- * Richard Woodruff <r-woodruff2@ti.com>
- * Paul Walmsley
- *
- * Based on earlier work by Tuukka Tikkanen, Tony Lindgren,
- * Gordon McNutt and RidgeRun, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-#undef DEBUG
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/clk.h>
-#include <linux/io.h>
-
-#include "clock.h"
-#include "clock2xxx.h"
-#include "prm2xxx_3xxx.h"
-#include "prm-regbits-24xx.h"
-
-/*
- * XXX This does not actually enable the osc_ck, since the osc_ck must
- * be running for this function to be called.  Instead, this function
- * is used to disable an autoidle mode on the osc_ck.  The existing
- * clk_enable/clk_disable()-based usecounting for osc_ck should be
- * replaced with autoidle-based usecounting.
- */
-int omap2_enable_osc_ck(struct clk_hw *clk)
-{
-       u32 pcc;
-
-       pcc = readl_relaxed(prcm_clksrc_ctrl);
-
-       writel_relaxed(pcc & ~OMAP_AUTOEXTCLKMODE_MASK, prcm_clksrc_ctrl);
-
-       return 0;
-}
-
-/*
- * XXX This does not actually disable the osc_ck, since doing so would
- * immediately halt the system.  Instead, this function is used to
- * enable an autoidle mode on the osc_ck.  The existing
- * clk_enable/clk_disable()-based usecounting for osc_ck should be
- * replaced with autoidle-based usecounting.
- */
-void omap2_disable_osc_ck(struct clk_hw *clk)
-{
-       u32 pcc;
-
-       pcc = readl_relaxed(prcm_clksrc_ctrl);
-
-       writel_relaxed(pcc | OMAP_AUTOEXTCLKMODE_MASK, prcm_clksrc_ctrl);
-}
-
-unsigned long omap2_osc_clk_recalc(struct clk_hw *clk,
-                                  unsigned long parent_rate)
-{
-       return omap2xxx_get_apll_clkin() * omap2xxx_get_sysclkdiv();
-}
diff --git a/arch/arm/mach-omap2/clkt2xxx_sys.c b/arch/arm/mach-omap2/clkt2xxx_sys.c
deleted file mode 100644 (file)
index 58dd3a9..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * OMAP2xxx sys_clk-specific clock code
- *
- * Copyright (C) 2005-2008 Texas Instruments, Inc.
- * Copyright (C) 2004-2010 Nokia Corporation
- *
- * Contacts:
- * Richard Woodruff <r-woodruff2@ti.com>
- * Paul Walmsley
- *
- * Based on earlier work by Tuukka Tikkanen, Tony Lindgren,
- * Gordon McNutt and RidgeRun, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-#undef DEBUG
-
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/clk.h>
-#include <linux/io.h>
-
-#include "clock.h"
-#include "clock2xxx.h"
-#include "prm2xxx_3xxx.h"
-#include "prm-regbits-24xx.h"
-
-void __iomem *prcm_clksrc_ctrl;
-
-u32 omap2xxx_get_sysclkdiv(void)
-{
-       u32 div;
-
-       div = readl_relaxed(prcm_clksrc_ctrl);
-       div &= OMAP_SYSCLKDIV_MASK;
-       div >>= OMAP_SYSCLKDIV_SHIFT;
-
-       return div;
-}
-
-unsigned long omap2xxx_sys_clk_recalc(struct clk_hw *clk,
-                                     unsigned long parent_rate)
-{
-       return parent_rate / omap2xxx_get_sysclkdiv();
-}
index 67fd26a18441885976e9e8ee85c59089d98005f9..b2ff6cd7ca9f0f35e01208475a9daa58f92a7e63 100644 (file)
 
 #include <asm/div64.h>
 
-#include "soc.h"
 #include "clock.h"
-#include "cm-regbits-24xx.h"
-#include "cm-regbits-34xx.h"
 
 /* DPLL rate rounding: minimum DPLL multiplier, divider values */
 #define DPLL_MIN_MULTIPLIER            2
 #define DPLL_ROUNDING_VAL              ((DPLL_SCALE_BASE / 2) * \
                                         (DPLL_SCALE_FACTOR / DPLL_SCALE_BASE))
 
-/* DPLL valid Fint frequency band limits - from 34xx TRM Section 4.7.6.2 */
-#define OMAP3430_DPLL_FINT_BAND1_MIN   750000
-#define OMAP3430_DPLL_FINT_BAND1_MAX   2100000
-#define OMAP3430_DPLL_FINT_BAND2_MIN   7500000
-#define OMAP3430_DPLL_FINT_BAND2_MAX   21000000
-
 /*
  * DPLL valid Fint frequency range for OMAP36xx and OMAP4xxx.
  * From device data manual section 4.3 "DPLL and DLL Specifications".
  */
 #define OMAP3PLUS_DPLL_FINT_JTYPE_MIN  500000
 #define OMAP3PLUS_DPLL_FINT_JTYPE_MAX  2500000
-#define OMAP3PLUS_DPLL_FINT_MIN                32000
-#define OMAP3PLUS_DPLL_FINT_MAX                52000000
 
 /* _dpll_test_fint() return codes */
 #define DPLL_FINT_UNDERFLOW            -1
@@ -87,33 +76,31 @@ static int _dpll_test_fint(struct clk_hw_omap *clk, unsigned int n)
        /* DPLL divider must result in a valid jitter correction val */
        fint = __clk_get_rate(__clk_get_parent(clk->hw.clk)) / n;
 
-       if (cpu_is_omap24xx()) {
-               /* Should not be called for OMAP2, so warn if it is called */
-               WARN(1, "No fint limits available for OMAP2!\n");
-               return DPLL_FINT_INVALID;
-       } else if (cpu_is_omap3430()) {
-               fint_min = OMAP3430_DPLL_FINT_BAND1_MIN;
-               fint_max = OMAP3430_DPLL_FINT_BAND2_MAX;
-       } else if (dd->flags & DPLL_J_TYPE) {
+       if (dd->flags & DPLL_J_TYPE) {
                fint_min = OMAP3PLUS_DPLL_FINT_JTYPE_MIN;
                fint_max = OMAP3PLUS_DPLL_FINT_JTYPE_MAX;
        } else {
-               fint_min = OMAP3PLUS_DPLL_FINT_MIN;
-               fint_max = OMAP3PLUS_DPLL_FINT_MAX;
+               fint_min = ti_clk_features.fint_min;
+               fint_max = ti_clk_features.fint_max;
        }
 
-       if (fint < fint_min) {
+       if (!fint_min || !fint_max) {
+               WARN(1, "No fint limits available!\n");
+               return DPLL_FINT_INVALID;
+       }
+
+       if (fint < ti_clk_features.fint_min) {
                pr_debug("rejecting n=%d due to Fint failure, lowering max_divider\n",
                         n);
                dd->max_divider = n;
                ret = DPLL_FINT_UNDERFLOW;
-       } else if (fint > fint_max) {
+       } else if (fint > ti_clk_features.fint_max) {
                pr_debug("rejecting n=%d due to Fint failure, boosting min_divider\n",
                         n);
                dd->min_divider = n;
                ret = DPLL_FINT_INVALID;
-       } else if (cpu_is_omap3430() && fint > OMAP3430_DPLL_FINT_BAND1_MAX &&
-                  fint < OMAP3430_DPLL_FINT_BAND2_MIN) {
+       } else if (fint > ti_clk_features.fint_band1_max &&
+                  fint < ti_clk_features.fint_band2_min) {
                pr_debug("rejecting n=%d due to Fint failure\n", n);
                ret = DPLL_FINT_INVALID;
        }
@@ -185,6 +172,34 @@ static int _dpll_test_mult(int *m, int n, unsigned long *new_rate,
        return r;
 }
 
+/**
+ * _omap2_dpll_is_in_bypass - check if DPLL is in bypass mode or not
+ * @v: bitfield value of the DPLL enable
+ *
+ * Checks given DPLL enable bitfield to see whether the DPLL is in bypass
+ * mode or not. Returns 1 if the DPLL is in bypass, 0 otherwise.
+ */
+static int _omap2_dpll_is_in_bypass(u32 v)
+{
+       u8 mask, val;
+
+       mask = ti_clk_features.dpll_bypass_vals;
+
+       /*
+        * Each set bit in the mask corresponds to a bypass value equal
+        * to the bitshift. Go through each set-bit in the mask and
+        * compare against the given register value.
+        */
+       while (mask) {
+               val = __ffs(mask);
+               mask ^= (1 << val);
+               if (v == val)
+                       return 1;
+       }
+
+       return 0;
+}
+
 /* Public functions */
 u8 omap2_init_dpll_parent(struct clk_hw *hw)
 {
@@ -201,20 +216,9 @@ u8 omap2_init_dpll_parent(struct clk_hw *hw)
        v >>= __ffs(dd->enable_mask);
 
        /* Reparent the struct clk in case the dpll is in bypass */
-       if (cpu_is_omap24xx()) {
-               if (v == OMAP2XXX_EN_DPLL_LPBYPASS ||
-                   v == OMAP2XXX_EN_DPLL_FRBYPASS)
-                       return 1;
-       } else if (cpu_is_omap34xx()) {
-               if (v == OMAP3XXX_EN_DPLL_LPBYPASS ||
-                   v == OMAP3XXX_EN_DPLL_FRBYPASS)
-                       return 1;
-       } else if (soc_is_am33xx() || cpu_is_omap44xx() || soc_is_am43xx()) {
-               if (v == OMAP4XXX_EN_DPLL_LPBYPASS ||
-                   v == OMAP4XXX_EN_DPLL_FRBYPASS ||
-                   v == OMAP4XXX_EN_DPLL_MNBYPASS)
-                       return 1;
-       }
+       if (_omap2_dpll_is_in_bypass(v))
+               return 1;
+
        return 0;
 }
 
@@ -247,20 +251,8 @@ unsigned long omap2_get_dpll_rate(struct clk_hw_omap *clk)
        v &= dd->enable_mask;
        v >>= __ffs(dd->enable_mask);
 
-       if (cpu_is_omap24xx()) {
-               if (v == OMAP2XXX_EN_DPLL_LPBYPASS ||
-                   v == OMAP2XXX_EN_DPLL_FRBYPASS)
-                       return __clk_get_rate(dd->clk_bypass);
-       } else if (cpu_is_omap34xx()) {
-               if (v == OMAP3XXX_EN_DPLL_LPBYPASS ||
-                   v == OMAP3XXX_EN_DPLL_FRBYPASS)
-                       return __clk_get_rate(dd->clk_bypass);
-       } else if (soc_is_am33xx() || cpu_is_omap44xx() || soc_is_am43xx()) {
-               if (v == OMAP4XXX_EN_DPLL_LPBYPASS ||
-                   v == OMAP4XXX_EN_DPLL_FRBYPASS ||
-                   v == OMAP4XXX_EN_DPLL_MNBYPASS)
-                       return __clk_get_rate(dd->clk_bypass);
-       }
+       if (_omap2_dpll_is_in_bypass(v))
+               return __clk_get_rate(dd->clk_bypass);
 
        v = omap2_clk_readl(clk, dd->mult_div1_reg);
        dpll_mult = v & dd->mult_mask;
index 333f0a66617165fa23448e19cd6b59c8856c78d3..55eb579aeae1b4afc6a6772b5380d6f7b60c92b5 100644 (file)
 #include <linux/clk-provider.h>
 #include <linux/io.h>
 
-
 #include "clock.h"
-#include "clock2xxx.h"
-#include "cm2xxx_3xxx.h"
-#include "cm-regbits-24xx.h"
+
+/* Register offsets */
+#define CM_AUTOIDLE                    0x30
+#define CM_ICLKEN                      0x10
 
 /* Private functions */
 
index 591581a665321c09fafbe78fd9c5bdbcae53c5a4..500530d1364a384859a6720c783ef1394545b983 100644 (file)
 
 u16 cpu_mask;
 
+/*
+ * Clock features setup. Used instead of CPU type checks.
+ */
+struct ti_clk_features ti_clk_features;
+
+/* DPLL valid Fint frequency band limits - from 34xx TRM Section 4.7.6.2 */
+#define OMAP3430_DPLL_FINT_BAND1_MIN   750000
+#define OMAP3430_DPLL_FINT_BAND1_MAX   2100000
+#define OMAP3430_DPLL_FINT_BAND2_MIN   7500000
+#define OMAP3430_DPLL_FINT_BAND2_MAX   21000000
+
+/*
+ * DPLL valid Fint frequency range for OMAP36xx and OMAP4xxx.
+ * From device data manual section 4.3 "DPLL and DLL Specifications".
+ */
+#define OMAP3PLUS_DPLL_FINT_MIN                32000
+#define OMAP3PLUS_DPLL_FINT_MAX                52000000
+
 /*
  * clkdm_control: if true, then when a clock is enabled in the
  * hardware, its clockdomain will first be enabled; and when a clock
@@ -81,27 +99,6 @@ u32 omap2_clk_readl(struct clk_hw_omap *clk, void __iomem *reg)
        return val;
 }
 
-/*
- * Used for clocks that have the same value as the parent clock,
- * divided by some factor
- */
-unsigned long omap_fixed_divisor_recalc(struct clk_hw *hw,
-               unsigned long parent_rate)
-{
-       struct clk_hw_omap *oclk;
-
-       if (!hw) {
-               pr_warn("%s: hw is NULL\n", __func__);
-               return -EINVAL;
-       }
-
-       oclk = to_clk_hw_omap(hw);
-
-       WARN_ON(!oclk->fixed_div);
-
-       return parent_rate / oclk->fixed_div;
-}
-
 /*
  * OMAP2+ specific clock functions
  */
@@ -287,13 +284,7 @@ void omap2_clk_dflt_find_idlest(struct clk_hw_omap *clk,
         * 34xx reverses this, just to keep us on our toes
         * AM35xx uses both, depending on the module.
         */
-       if (cpu_is_omap24xx())
-               *idlest_val = OMAP24XX_CM_IDLEST_VAL;
-       else if (cpu_is_omap34xx())
-               *idlest_val = OMAP34XX_CM_IDLEST_VAL;
-       else
-               BUG();
-
+       *idlest_val = ti_clk_features.cm_idlest_val;
 }
 
 /**
@@ -731,3 +722,53 @@ void __init omap2_clk_print_new_rates(const char *hfclkin_ck_name,
                (clk_get_rate(core_ck) / 1000000),
                (clk_get_rate(mpu_ck) / 1000000));
 }
+
+/**
+ * ti_clk_init_features - init clock features struct for the SoC
+ *
+ * Initializes the clock features struct based on the SoC type.
+ */
+void __init ti_clk_init_features(void)
+{
+       /* Fint setup for DPLLs */
+       if (cpu_is_omap3430()) {
+               ti_clk_features.fint_min = OMAP3430_DPLL_FINT_BAND1_MIN;
+               ti_clk_features.fint_max = OMAP3430_DPLL_FINT_BAND2_MAX;
+               ti_clk_features.fint_band1_max = OMAP3430_DPLL_FINT_BAND1_MAX;
+               ti_clk_features.fint_band2_min = OMAP3430_DPLL_FINT_BAND2_MIN;
+       } else {
+               ti_clk_features.fint_min = OMAP3PLUS_DPLL_FINT_MIN;
+               ti_clk_features.fint_max = OMAP3PLUS_DPLL_FINT_MAX;
+       }
+
+       /* Bypass value setup for DPLLs */
+       if (cpu_is_omap24xx()) {
+               ti_clk_features.dpll_bypass_vals |=
+                       (1 << OMAP2XXX_EN_DPLL_LPBYPASS) |
+                       (1 << OMAP2XXX_EN_DPLL_FRBYPASS);
+       } else if (cpu_is_omap34xx()) {
+               ti_clk_features.dpll_bypass_vals |=
+                       (1 << OMAP3XXX_EN_DPLL_LPBYPASS) |
+                       (1 << OMAP3XXX_EN_DPLL_FRBYPASS);
+       } else if (soc_is_am33xx() || cpu_is_omap44xx() || soc_is_am43xx() ||
+                  soc_is_omap54xx() || soc_is_dra7xx()) {
+               ti_clk_features.dpll_bypass_vals |=
+                       (1 << OMAP4XXX_EN_DPLL_LPBYPASS) |
+                       (1 << OMAP4XXX_EN_DPLL_FRBYPASS) |
+                       (1 << OMAP4XXX_EN_DPLL_MNBYPASS);
+       }
+
+       /* Jitter correction only available on OMAP343X */
+       if (cpu_is_omap343x())
+               ti_clk_features.flags |= TI_CLK_DPLL_HAS_FREQSEL;
+
+       /* Idlest value for interface clocks.
+        * 24xx uses 0 to indicate not ready, and 1 to indicate ready.
+        * 34xx reverses this, just to keep us on our toes
+        * AM35xx uses both, depending on the module.
+        */
+       if (cpu_is_omap24xx())
+               ti_clk_features.cm_idlest_val = OMAP24XX_CM_IDLEST_VAL;
+       else if (cpu_is_omap34xx())
+               ti_clk_features.cm_idlest_val = OMAP34XX_CM_IDLEST_VAL;
+}
index 12f54d428d7c6f3ece2e4c5c6244c8cb9841d194..4592a2762592fef88c69be32aa1ce42cc6f18a4a 100644 (file)
@@ -101,31 +101,6 @@ struct clockdomain;
        };                                                      \
        DEFINE_STRUCT_CLK(_name, _parent_names, _ops);
 
-#define DEFINE_CLK_OMAP_HSDIVIDER(_name, _parent_name,         \
-                               _parent_ptr, _flags,            \
-                               _clksel_reg, _clksel_mask)      \
-       static const struct clksel _name##_div[] = {            \
-               {                                               \
-                       .parent = _parent_ptr,                  \
-                       .rates = div31_1to31_rates              \
-               },                                              \
-               { .parent = NULL },                             \
-       };                                                      \
-       static struct clk _name;                                \
-       static const char *_name##_parent_names[] = {           \
-               _parent_name,                                   \
-       };                                                      \
-       static struct clk_hw_omap _name##_hw = {                \
-               .hw = {                                         \
-                       .clk = &_name,                          \
-               },                                              \
-               .clksel         = _name##_div,                  \
-               .clksel_reg     = _clksel_reg,                  \
-               .clksel_mask    = _clksel_mask,                 \
-               .ops            = &clkhwops_omap4_dpllmx,       \
-       };                                                      \
-       DEFINE_STRUCT_CLK(_name, _name##_parent_names, omap_hsdivider_ops);
-
 /* struct clksel_rate.flags possibilities */
 #define RATE_IN_242X           (1 << 0)
 #define RATE_IN_243X           (1 << 1)
@@ -178,9 +153,6 @@ struct clksel {
        const struct clksel_rate *rates;
 };
 
-unsigned long omap_fixed_divisor_recalc(struct clk_hw *hw,
-                                       unsigned long parent_rate);
-
 /* CM_CLKSEL2_PLL.CORE_CLK_SRC bits (2XXX) */
 #define CORE_CLK_SRC_32K               0x0
 #define CORE_CLK_SRC_DPLL              0x1
@@ -248,6 +220,23 @@ void omap2_clk_writel(u32 val, struct clk_hw_omap *clk, void __iomem *reg);
 
 extern u16 cpu_mask;
 
+/*
+ * Clock features setup. Used instead of CPU type checks.
+ */
+struct ti_clk_features {
+       u32 flags;
+       long fint_min;
+       long fint_max;
+       long fint_band1_max;
+       long fint_band2_min;
+       u8 dpll_bypass_vals;
+       u8 cm_idlest_val;
+};
+
+#define TI_CLK_DPLL_HAS_FREQSEL                (1 << 0)
+
+extern struct ti_clk_features ti_clk_features;
+
 extern const struct clkops clkops_omap2_dflt_wait;
 extern const struct clkops clkops_dummy;
 extern const struct clkops clkops_omap2_dflt;
@@ -286,4 +275,6 @@ extern int omap2_clkops_enable_clkdm(struct clk_hw *hw);
 extern void omap2_clkops_disable_clkdm(struct clk_hw *hw);
 
 extern void omap_clocks_register(struct omap_clk *oclks, int cnt);
+
+void __init ti_clk_init_features(void);
 #endif
index 45f41a4116031be4cbb722bc2db63cc33841c31f..a090225ceeba9d1f09a79b34c5b763da363ae4a0 100644 (file)
@@ -45,8 +45,6 @@ int omap2430_clk_init(void);
 #define omap2430_clk_init()    do { } while(0)
 #endif
 
-extern void __iomem *prcm_clksrc_ctrl;
-
 extern struct clk_hw *dclk_hw;
 int omap2_enable_osc_ck(struct clk_hw *hw);
 void omap2_disable_osc_ck(struct clk_hw *hw);
index 8538669cc2ad71d132540a9463d8c1e3b02dcb28..d7a5d11cbcbfa1df1086fd84bbb5a855d6a0cd76 100644 (file)
 #define OMAP24XX_AUTO_DPLL_SHIFT                       0
 #define OMAP24XX_AUTO_DPLL_MASK                                (0x3 << 0)
 #define OMAP24XX_APLLS_CLKIN_SHIFT                     23
+#define OMAP24XX_APLLS_CLKIN_WIDTH                     3
 #define OMAP24XX_APLLS_CLKIN_MASK                      (0x7 << 23)
 #define OMAP24XX_DPLL_MULT_MASK                                (0x3ff << 12)
 #define OMAP24XX_DPLL_DIV_MASK                         (0xf << 8)
index 9ad7594e76225f4c75b2dc4cbce33cd822457bce..e966e3a3c93190e5704d4fdcfe6cce3a17db10f9 100644 (file)
 #define DRA7XX_CM_L3INIT_SATA_CLKCTRL                          DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L3INIT_INST, 0x0088)
 #define DRA7XX_CM_PCIE_CLKSTCTRL_OFFSET                                0x00a0
 #define DRA7XX_CM_PCIE_STATICDEP_OFFSET                                0x00a4
+#define DRA7XX_CM_L3INIT_PCIESS1_CLKCTRL_OFFSET                        0x00b0
+#define DRA7XX_CM_L3INIT_PCIESS1_CLKCTRL                       DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L3INIT_INST, 0x00b0)
+#define DRA7XX_CM_L3INIT_PCIESS2_CLKCTRL_OFFSET                        0x00b8
+#define DRA7XX_CM_L3INIT_PCIESS2_CLKCTRL                       DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L3INIT_INST, 0x00b8)
 #define DRA7XX_CM_GMAC_CLKSTCTRL_OFFSET                                0x00c0
 #define DRA7XX_CM_GMAC_STATICDEP_OFFSET                                0x00c4
 #define DRA7XX_CM_GMAC_DYNAMICDEP_OFFSET                       0x00c8
index 751f3549bf6fcb7c2a3c4d1a53f6ca628dc3956c..f4796c002070819aa91d5ae229fabae51e5a252b 100644 (file)
@@ -44,8 +44,7 @@ struct omap3_scratchpad {
 };
 
 struct omap3_scratchpad_prcm_block {
-       u32 prm_clksrc_ctrl;
-       u32 prm_clksel;
+       u32 prm_contents[2];
        u32 cm_contents[11];
        u32 prcm_block_size;
 };
@@ -282,13 +281,9 @@ void omap3_clear_scratchpad_contents(void)
        void __iomem *v_addr;
        u32 offset = 0;
        v_addr = OMAP2_L4_IO_ADDRESS(OMAP343X_SCRATCHPAD_ROM);
-       if (omap2_prm_read_mod_reg(OMAP3430_GR_MOD, OMAP3_PRM_RSTST_OFFSET) &
-           OMAP3430_GLOBAL_COLD_RST_MASK) {
+       if (omap3xxx_prm_clear_global_cold_reset()) {
                for ( ; offset <= max_offset; offset += 0x4)
                        writel_relaxed(0x0, (v_addr + offset));
-               omap2_prm_set_mod_reg_bits(OMAP3430_GLOBAL_COLD_RST_MASK,
-                                          OMAP3430_GR_MOD,
-                                          OMAP3_PRM_RSTST_OFFSET);
        }
 }
 
@@ -331,13 +326,7 @@ void omap3_save_scratchpad_contents(void)
        scratchpad_contents.sdrc_block_offset = 0x64;
 
        /* Populate the PRCM block contents */
-       prcm_block_contents.prm_clksrc_ctrl =
-               omap2_prm_read_mod_reg(OMAP3430_GR_MOD,
-                                      OMAP3_PRM_CLKSRC_CTRL_OFFSET);
-       prcm_block_contents.prm_clksel =
-               omap2_prm_read_mod_reg(OMAP3430_CCR_MOD,
-                                      OMAP3_PRM_CLKSEL_OFFSET);
-
+       omap3_prm_save_scratchpad_contents(prcm_block_contents.prm_contents);
        omap3_cm_save_scratchpad_contents(prcm_block_contents.cm_contents);
 
        prcm_block_contents.prcm_block_size = 0x0;
@@ -575,9 +564,50 @@ int omap3_ctrl_save_padconf(void)
  * Sets the bootmode for IVA2 to idle. This is needed by the PM code to
  * force disable IVA2 so that it does not prevent any low-power states.
  */
-void omap3_ctrl_set_iva_bootmode_idle(void)
+static void __init omap3_ctrl_set_iva_bootmode_idle(void)
 {
        omap_ctrl_writel(OMAP3_IVA2_BOOTMOD_IDLE,
                         OMAP343X_CONTROL_IVA2_BOOTMOD);
 }
+
+/**
+ * omap3_ctrl_setup_d2d_padconf - setup stacked modem pads for idle
+ *
+ * Sets up the pads controlling the stacked modem in such way that the
+ * device can enter idle.
+ */
+static void __init omap3_ctrl_setup_d2d_padconf(void)
+{
+       u16 mask, padconf;
+
+       /*
+        * In a stand alone OMAP3430 where there is not a stacked
+        * modem for the D2D Idle Ack and D2D MStandby must be pulled
+        * high. S CONTROL_PADCONF_SAD2D_IDLEACK and
+        * CONTROL_PADCONF_SAD2D_MSTDBY to have a pull up.
+        */
+       mask = (1 << 4) | (1 << 3); /* pull-up, enabled */
+       padconf = omap_ctrl_readw(OMAP3_PADCONF_SAD2D_MSTANDBY);
+       padconf |= mask;
+       omap_ctrl_writew(padconf, OMAP3_PADCONF_SAD2D_MSTANDBY);
+
+       padconf = omap_ctrl_readw(OMAP3_PADCONF_SAD2D_IDLEACK);
+       padconf |= mask;
+       omap_ctrl_writew(padconf, OMAP3_PADCONF_SAD2D_IDLEACK);
+}
+
+/**
+ * omap3_ctrl_init - does static initializations for control module
+ *
+ * Initializes system control module. This sets up the sysconfig autoidle,
+ * and sets up modem and iva2 so that they can be idled properly.
+ */
+void __init omap3_ctrl_init(void)
+{
+       omap_ctrl_writel(OMAP3430_AUTOIDLE_MASK, OMAP2_CONTROL_SYSCONFIG);
+
+       omap3_ctrl_set_iva_bootmode_idle();
+
+       omap3_ctrl_setup_d2d_padconf();
+}
 #endif /* CONFIG_ARCH_OMAP3 && CONFIG_PM */
index da054801b114d9baf0c9b9b2113622a1071ead43..a3c013345c45fa3b495924edaaa8628e636e147d 100644 (file)
 #ifndef __ARCH_ARM_MACH_OMAP2_CONTROL_H
 #define __ARCH_ARM_MACH_OMAP2_CONTROL_H
 
-#include "ctrl_module_core_44xx.h"
-#include "ctrl_module_wkup_44xx.h"
-#include "ctrl_module_pad_core_44xx.h"
-#include "ctrl_module_pad_wkup_44xx.h"
-
 #include "am33xx.h"
 
 #ifndef __ASSEMBLY__
 /* TI81XX CONTROL_DEVCONF register offsets */
 #define TI81XX_CONTROL_DEVICE_ID       (TI81XX_CONTROL_DEVCONF + 0x000)
 
+/* OMAP4 CONTROL MODULE */
+#define OMAP4_CTRL_MODULE_PAD_WKUP                     0x4a31e000
+#define OMAP4_CTRL_MODULE_PAD_WKUP_CONTROL_I2C_2       0x0604
+#define OMAP4_CTRL_MODULE_CORE_STATUS                  0x02c4
+#define OMAP4_CTRL_MODULE_CORE_STD_FUSE_PROD_ID_1      0x0218
+#define OMAP4_CTRL_MODULE_CORE_DSP_BOOTADDR            0x0304
+#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_DSIPHY      0x0618
+#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_CAMERA_RX   0x0608
+
+/* OMAP4 CONTROL_DSIPHY */
+#define OMAP4_DSI2_LANEENABLE_SHIFT                    29
+#define OMAP4_DSI2_LANEENABLE_MASK                     (0x7 << 29)
+#define OMAP4_DSI1_LANEENABLE_SHIFT                    24
+#define OMAP4_DSI1_LANEENABLE_MASK                     (0x1f << 24)
+#define OMAP4_DSI1_PIPD_SHIFT                          19
+#define OMAP4_DSI1_PIPD_MASK                           (0x1f << 19)
+#define OMAP4_DSI2_PIPD_SHIFT                          14
+#define OMAP4_DSI2_PIPD_MASK                           (0x1f << 14)
+
+/* OMAP4 CONTROL_CAMERA_RX */
+#define OMAP4_CAMERARX_CSI21_LANEENABLE_SHIFT          24
+#define OMAP4_CAMERARX_CSI21_LANEENABLE_MASK           (0x1f << 24)
+#define OMAP4_CAMERARX_CSI22_LANEENABLE_SHIFT          29
+#define OMAP4_CAMERARX_CSI22_LANEENABLE_MASK           (0x3 << 29)
+#define OMAP4_CAMERARX_CSI22_CTRLCLKEN_SHIFT           21
+#define OMAP4_CAMERARX_CSI22_CTRLCLKEN_MASK            (1 << 21)
+#define OMAP4_CAMERARX_CSI22_CAMMODE_SHIFT             19
+#define OMAP4_CAMERARX_CSI22_CAMMODE_MASK              (0x3 << 19)
+#define OMAP4_CAMERARX_CSI21_CTRLCLKEN_SHIFT           18
+#define OMAP4_CAMERARX_CSI21_CTRLCLKEN_MASK            (1 << 18)
+#define OMAP4_CAMERARX_CSI21_CAMMODE_SHIFT             16
+#define OMAP4_CAMERARX_CSI21_CAMMODE_MASK              (0x3 << 16)
+
 /* OMAP54XX CONTROL STATUS register */
 #define OMAP5XXX_CONTROL_STATUS                0x134
 #define OMAP5_DEVICETYPE_MASK          (0x7 << 6)
@@ -427,7 +455,7 @@ extern void omap_ctrl_write_dsp_boot_addr(u32 bootaddr);
 extern void omap_ctrl_write_dsp_boot_mode(u8 bootmode);
 extern void omap3630_ctrl_disable_rta(void);
 extern int omap3_ctrl_save_padconf(void);
-extern void omap3_ctrl_set_iva_bootmode_idle(void);
+void omap3_ctrl_init(void);
 extern void omap2_set_globals_control(void __iomem *ctrl,
                                      void __iomem *ctrl_pad);
 #else
diff --git a/arch/arm/mach-omap2/ctrl_module_core_44xx.h b/arch/arm/mach-omap2/ctrl_module_core_44xx.h
deleted file mode 100644 (file)
index 0197082..0000000
+++ /dev/null
@@ -1,392 +0,0 @@
-/*
- * OMAP44xx CTRL_MODULE_CORE registers and bitfields
- *
- * Copyright (C) 2009-2010 Texas Instruments, Inc.
- *
- * Benoit Cousson (b-cousson@ti.com)
- * Santosh Shilimkar (santosh.shilimkar@ti.com)
- *
- * This file is automatically generated from the OMAP hardware databases.
- * We respectfully ask that any modifications to this file be coordinated
- * with the public linux-omap@vger.kernel.org mailing list and the
- * authors above to ensure that the autogeneration scripts are kept
- * up-to-date with the file contents.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#ifndef __ARCH_ARM_MACH_OMAP2_CTRL_MODULE_CORE_44XX_H
-#define __ARCH_ARM_MACH_OMAP2_CTRL_MODULE_CORE_44XX_H
-
-
-/* Base address */
-#define OMAP4_CTRL_MODULE_CORE                                 0x4a002000
-
-/* Registers offset */
-#define OMAP4_CTRL_MODULE_CORE_IP_REVISION                     0x0000
-#define OMAP4_CTRL_MODULE_CORE_IP_HWINFO                       0x0004
-#define OMAP4_CTRL_MODULE_CORE_IP_SYSCONFIG                    0x0010
-#define OMAP4_CTRL_MODULE_CORE_STD_FUSE_DIE_ID_0               0x0200
-#define OMAP4_CTRL_MODULE_CORE_ID_CODE                         0x0204
-#define OMAP4_CTRL_MODULE_CORE_STD_FUSE_DIE_ID_1               0x0208
-#define OMAP4_CTRL_MODULE_CORE_STD_FUSE_DIE_ID_2               0x020c
-#define OMAP4_CTRL_MODULE_CORE_STD_FUSE_DIE_ID_3               0x0210
-#define OMAP4_CTRL_MODULE_CORE_STD_FUSE_PROD_ID_0              0x0214
-#define OMAP4_CTRL_MODULE_CORE_STD_FUSE_PROD_ID_1              0x0218
-#define OMAP4_CTRL_MODULE_CORE_STD_FUSE_USB_CONF               0x021c
-#define OMAP4_CTRL_MODULE_CORE_STD_FUSE_OPP_VDD_WKUP           0x0228
-#define OMAP4_CTRL_MODULE_CORE_STD_FUSE_OPP_BGAP               0x0260
-#define OMAP4_CTRL_MODULE_CORE_STD_FUSE_OPP_DPLL_0             0x0264
-#define OMAP4_CTRL_MODULE_CORE_STD_FUSE_OPP_DPLL_1             0x0268
-#define OMAP4_CTRL_MODULE_CORE_STATUS                          0x02c4
-#define OMAP4_CTRL_MODULE_CORE_DEV_CONF                                0x0300
-#define OMAP4_CTRL_MODULE_CORE_DSP_BOOTADDR                    0x0304
-#define OMAP4_CTRL_MODULE_CORE_LDOVBB_IVA_VOLTAGE_CTRL         0x0314
-#define OMAP4_CTRL_MODULE_CORE_LDOVBB_MPU_VOLTAGE_CTRL         0x0318
-#define OMAP4_CTRL_MODULE_CORE_LDOSRAM_IVA_VOLTAGE_CTRL                0x0320
-#define OMAP4_CTRL_MODULE_CORE_LDOSRAM_MPU_VOLTAGE_CTRL                0x0324
-#define OMAP4_CTRL_MODULE_CORE_LDOSRAM_CORE_VOLTAGE_CTRL       0x0328
-#define OMAP4_CTRL_MODULE_CORE_TEMP_SENSOR                     0x032c
-#define OMAP4_CTRL_MODULE_CORE_DPLL_NWELL_TRIM_0               0x0330
-#define OMAP4_CTRL_MODULE_CORE_DPLL_NWELL_TRIM_1               0x0334
-#define OMAP4_CTRL_MODULE_CORE_USBOTGHS_CONTROL                        0x033c
-#define OMAP4_CTRL_MODULE_CORE_DSS_CONTROL                     0x0340
-#define OMAP4_CTRL_MODULE_CORE_HWOBS_CONTROL                   0x0350
-#define OMAP4_CTRL_MODULE_CORE_DEBOBS_FINAL_MUX_SEL            0x0400
-#define OMAP4_CTRL_MODULE_CORE_DEBOBS_MMR_MPU                  0x0408
-#define OMAP4_CTRL_MODULE_CORE_CONF_SDMA_REQ_SEL0              0x042c
-#define OMAP4_CTRL_MODULE_CORE_CONF_SDMA_REQ_SEL1              0x0430
-#define OMAP4_CTRL_MODULE_CORE_CONF_SDMA_REQ_SEL2              0x0434
-#define OMAP4_CTRL_MODULE_CORE_CONF_SDMA_REQ_SEL3              0x0438
-#define OMAP4_CTRL_MODULE_CORE_CONF_CLK_SEL0                   0x0440
-#define OMAP4_CTRL_MODULE_CORE_CONF_CLK_SEL1                   0x0444
-#define OMAP4_CTRL_MODULE_CORE_CONF_CLK_SEL2                   0x0448
-#define OMAP4_CTRL_MODULE_CORE_CONF_DPLL_FREQLOCK_SEL          0x044c
-#define OMAP4_CTRL_MODULE_CORE_CONF_DPLL_TINITZ_SEL            0x0450
-#define OMAP4_CTRL_MODULE_CORE_CONF_DPLL_PHASELOCK_SEL         0x0454
-#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_0            0x0480
-#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_1            0x0484
-#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_2            0x0488
-#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_3            0x048c
-#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_4            0x0490
-#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_5            0x0494
-#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_6            0x0498
-#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_7            0x049c
-#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_8            0x04a0
-#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_9            0x04a4
-#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_10           0x04a8
-#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_11           0x04ac
-#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_12           0x04b0
-#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_13           0x04b4
-#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_14           0x04b8
-#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_15           0x04bc
-#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_16           0x04c0
-#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_17           0x04c4
-#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_18           0x04c8
-#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_19           0x04cc
-#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_20           0x04d0
-#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_21           0x04d4
-#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_22           0x04d8
-#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_23           0x04dc
-#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_24           0x04e0
-#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_25           0x04e4
-#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_26           0x04e8
-#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_27           0x04ec
-#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_28           0x04f0
-#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_29           0x04f4
-#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_30           0x04f8
-#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_31           0x04fc
-
-/* Registers shifts and masks */
-
-/* IP_REVISION */
-#define OMAP4_IP_REV_SCHEME_SHIFT                      30
-#define OMAP4_IP_REV_SCHEME_MASK                       (0x3 << 30)
-#define OMAP4_IP_REV_FUNC_SHIFT                                16
-#define OMAP4_IP_REV_FUNC_MASK                         (0xfff << 16)
-#define OMAP4_IP_REV_RTL_SHIFT                         11
-#define OMAP4_IP_REV_RTL_MASK                          (0x1f << 11)
-#define OMAP4_IP_REV_MAJOR_SHIFT                       8
-#define OMAP4_IP_REV_MAJOR_MASK                                (0x7 << 8)
-#define OMAP4_IP_REV_CUSTOM_SHIFT                      6
-#define OMAP4_IP_REV_CUSTOM_MASK                       (0x3 << 6)
-#define OMAP4_IP_REV_MINOR_SHIFT                       0
-#define OMAP4_IP_REV_MINOR_MASK                                (0x3f << 0)
-
-/* IP_HWINFO */
-#define OMAP4_IP_HWINFO_SHIFT                          0
-#define OMAP4_IP_HWINFO_MASK                           (0xffffffff << 0)
-
-/* IP_SYSCONFIG */
-#define OMAP4_IP_SYSCONFIG_IDLEMODE_SHIFT              2
-#define OMAP4_IP_SYSCONFIG_IDLEMODE_MASK               (0x3 << 2)
-
-/* STD_FUSE_DIE_ID_0 */
-#define OMAP4_STD_FUSE_DIE_ID_0_SHIFT                  0
-#define OMAP4_STD_FUSE_DIE_ID_0_MASK                   (0xffffffff << 0)
-
-/* ID_CODE */
-#define OMAP4_STD_FUSE_IDCODE_SHIFT                    0
-#define OMAP4_STD_FUSE_IDCODE_MASK                     (0xffffffff << 0)
-
-/* STD_FUSE_DIE_ID_1 */
-#define OMAP4_STD_FUSE_DIE_ID_1_SHIFT                  0
-#define OMAP4_STD_FUSE_DIE_ID_1_MASK                   (0xffffffff << 0)
-
-/* STD_FUSE_DIE_ID_2 */
-#define OMAP4_STD_FUSE_DIE_ID_2_SHIFT                  0
-#define OMAP4_STD_FUSE_DIE_ID_2_MASK                   (0xffffffff << 0)
-
-/* STD_FUSE_DIE_ID_3 */
-#define OMAP4_STD_FUSE_DIE_ID_3_SHIFT                  0
-#define OMAP4_STD_FUSE_DIE_ID_3_MASK                   (0xffffffff << 0)
-
-/* STD_FUSE_PROD_ID_0 */
-#define OMAP4_STD_FUSE_PROD_ID_0_SHIFT                 0
-#define OMAP4_STD_FUSE_PROD_ID_0_MASK                  (0xffffffff << 0)
-
-/* STD_FUSE_PROD_ID_1 */
-#define OMAP4_STD_FUSE_PROD_ID_1_SHIFT                 0
-#define OMAP4_STD_FUSE_PROD_ID_1_MASK                  (0xffffffff << 0)
-
-/* STD_FUSE_USB_CONF */
-#define OMAP4_USB_PROD_ID_SHIFT                                16
-#define OMAP4_USB_PROD_ID_MASK                         (0xffff << 16)
-#define OMAP4_USB_VENDOR_ID_SHIFT                      0
-#define OMAP4_USB_VENDOR_ID_MASK                       (0xffff << 0)
-
-/* STD_FUSE_OPP_VDD_WKUP */
-#define OMAP4_STD_FUSE_OPP_VDD_WKUP_SHIFT              0
-#define OMAP4_STD_FUSE_OPP_VDD_WKUP_MASK               (0xffffffff << 0)
-
-/* STD_FUSE_OPP_BGAP */
-#define OMAP4_STD_FUSE_OPP_BGAP_SHIFT                  0
-#define OMAP4_STD_FUSE_OPP_BGAP_MASK                   (0xffffffff << 0)
-
-/* STD_FUSE_OPP_DPLL_0 */
-#define OMAP4_STD_FUSE_OPP_DPLL_0_SHIFT                        0
-#define OMAP4_STD_FUSE_OPP_DPLL_0_MASK                 (0xffffffff << 0)
-
-/* STD_FUSE_OPP_DPLL_1 */
-#define OMAP4_STD_FUSE_OPP_DPLL_1_SHIFT                        0
-#define OMAP4_STD_FUSE_OPP_DPLL_1_MASK                 (0xffffffff << 0)
-
-/* STATUS */
-#define OMAP4_ATTILA_CONF_SHIFT                                11
-#define OMAP4_ATTILA_CONF_MASK                         (0x3 << 11)
-#define OMAP4_DEVICE_TYPE_SHIFT                                8
-#define OMAP4_DEVICE_TYPE_MASK                         (0x7 << 8)
-#define OMAP4_SYS_BOOT_SHIFT                           0
-#define OMAP4_SYS_BOOT_MASK                            (0xff << 0)
-
-/* DEV_CONF */
-#define OMAP4_DEV_CONF_SHIFT                           1
-#define OMAP4_DEV_CONF_MASK                            (0x7fffffff << 1)
-#define OMAP4_USBPHY_PD_SHIFT                          0
-#define OMAP4_USBPHY_PD_MASK                           (1 << 0)
-
-/* LDOVBB_IVA_VOLTAGE_CTRL */
-#define OMAP4_LDOVBBIVA_RBB_MUX_CTRL_SHIFT             26
-#define OMAP4_LDOVBBIVA_RBB_MUX_CTRL_MASK              (1 << 26)
-#define OMAP4_LDOVBBIVA_RBB_VSET_IN_SHIFT              21
-#define OMAP4_LDOVBBIVA_RBB_VSET_IN_MASK               (0x1f << 21)
-#define OMAP4_LDOVBBIVA_RBB_VSET_OUT_SHIFT             16
-#define OMAP4_LDOVBBIVA_RBB_VSET_OUT_MASK              (0x1f << 16)
-#define OMAP4_LDOVBBIVA_FBB_MUX_CTRL_SHIFT             10
-#define OMAP4_LDOVBBIVA_FBB_MUX_CTRL_MASK              (1 << 10)
-#define OMAP4_LDOVBBIVA_FBB_VSET_IN_SHIFT              5
-#define OMAP4_LDOVBBIVA_FBB_VSET_IN_MASK               (0x1f << 5)
-#define OMAP4_LDOVBBIVA_FBB_VSET_OUT_SHIFT             0
-#define OMAP4_LDOVBBIVA_FBB_VSET_OUT_MASK              (0x1f << 0)
-
-/* LDOVBB_MPU_VOLTAGE_CTRL */
-#define OMAP4_LDOVBBMPU_RBB_MUX_CTRL_SHIFT             26
-#define OMAP4_LDOVBBMPU_RBB_MUX_CTRL_MASK              (1 << 26)
-#define OMAP4_LDOVBBMPU_RBB_VSET_IN_SHIFT              21
-#define OMAP4_LDOVBBMPU_RBB_VSET_IN_MASK               (0x1f << 21)
-#define OMAP4_LDOVBBMPU_RBB_VSET_OUT_SHIFT             16
-#define OMAP4_LDOVBBMPU_RBB_VSET_OUT_MASK              (0x1f << 16)
-#define OMAP4_LDOVBBMPU_FBB_MUX_CTRL_SHIFT             10
-#define OMAP4_LDOVBBMPU_FBB_MUX_CTRL_MASK              (1 << 10)
-#define OMAP4_LDOVBBMPU_FBB_VSET_IN_SHIFT              5
-#define OMAP4_LDOVBBMPU_FBB_VSET_IN_MASK               (0x1f << 5)
-#define OMAP4_LDOVBBMPU_FBB_VSET_OUT_SHIFT             0
-#define OMAP4_LDOVBBMPU_FBB_VSET_OUT_MASK              (0x1f << 0)
-
-/* LDOSRAM_IVA_VOLTAGE_CTRL */
-#define OMAP4_LDOSRAMIVA_RETMODE_MUX_CTRL_SHIFT                26
-#define OMAP4_LDOSRAMIVA_RETMODE_MUX_CTRL_MASK         (1 << 26)
-#define OMAP4_LDOSRAMIVA_RETMODE_VSET_IN_SHIFT         21
-#define OMAP4_LDOSRAMIVA_RETMODE_VSET_IN_MASK          (0x1f << 21)
-#define OMAP4_LDOSRAMIVA_RETMODE_VSET_OUT_SHIFT                16
-#define OMAP4_LDOSRAMIVA_RETMODE_VSET_OUT_MASK         (0x1f << 16)
-#define OMAP4_LDOSRAMIVA_ACTMODE_MUX_CTRL_SHIFT                10
-#define OMAP4_LDOSRAMIVA_ACTMODE_MUX_CTRL_MASK         (1 << 10)
-#define OMAP4_LDOSRAMIVA_ACTMODE_VSET_IN_SHIFT         5
-#define OMAP4_LDOSRAMIVA_ACTMODE_VSET_IN_MASK          (0x1f << 5)
-#define OMAP4_LDOSRAMIVA_ACTMODE_VSET_OUT_SHIFT                0
-#define OMAP4_LDOSRAMIVA_ACTMODE_VSET_OUT_MASK         (0x1f << 0)
-
-/* LDOSRAM_MPU_VOLTAGE_CTRL */
-#define OMAP4_LDOSRAMMPU_RETMODE_MUX_CTRL_SHIFT                26
-#define OMAP4_LDOSRAMMPU_RETMODE_MUX_CTRL_MASK         (1 << 26)
-#define OMAP4_LDOSRAMMPU_RETMODE_VSET_IN_SHIFT         21
-#define OMAP4_LDOSRAMMPU_RETMODE_VSET_IN_MASK          (0x1f << 21)
-#define OMAP4_LDOSRAMMPU_RETMODE_VSET_OUT_SHIFT                16
-#define OMAP4_LDOSRAMMPU_RETMODE_VSET_OUT_MASK         (0x1f << 16)
-#define OMAP4_LDOSRAMMPU_ACTMODE_MUX_CTRL_SHIFT                10
-#define OMAP4_LDOSRAMMPU_ACTMODE_MUX_CTRL_MASK         (1 << 10)
-#define OMAP4_LDOSRAMMPU_ACTMODE_VSET_IN_SHIFT         5
-#define OMAP4_LDOSRAMMPU_ACTMODE_VSET_IN_MASK          (0x1f << 5)
-#define OMAP4_LDOSRAMMPU_ACTMODE_VSET_OUT_SHIFT                0
-#define OMAP4_LDOSRAMMPU_ACTMODE_VSET_OUT_MASK         (0x1f << 0)
-
-/* LDOSRAM_CORE_VOLTAGE_CTRL */
-#define OMAP4_LDOSRAMCORE_RETMODE_MUX_CTRL_SHIFT       26
-#define OMAP4_LDOSRAMCORE_RETMODE_MUX_CTRL_MASK                (1 << 26)
-#define OMAP4_LDOSRAMCORE_RETMODE_VSET_IN_SHIFT                21
-#define OMAP4_LDOSRAMCORE_RETMODE_VSET_IN_MASK         (0x1f << 21)
-#define OMAP4_LDOSRAMCORE_RETMODE_VSET_OUT_SHIFT       16
-#define OMAP4_LDOSRAMCORE_RETMODE_VSET_OUT_MASK                (0x1f << 16)
-#define OMAP4_LDOSRAMCORE_ACTMODE_MUX_CTRL_SHIFT       10
-#define OMAP4_LDOSRAMCORE_ACTMODE_MUX_CTRL_MASK                (1 << 10)
-#define OMAP4_LDOSRAMCORE_ACTMODE_VSET_IN_SHIFT                5
-#define OMAP4_LDOSRAMCORE_ACTMODE_VSET_IN_MASK         (0x1f << 5)
-#define OMAP4_LDOSRAMCORE_ACTMODE_VSET_OUT_SHIFT       0
-#define OMAP4_LDOSRAMCORE_ACTMODE_VSET_OUT_MASK                (0x1f << 0)
-
-/* TEMP_SENSOR */
-#define OMAP4_BGAP_TEMPSOFF_SHIFT                      12
-#define OMAP4_BGAP_TEMPSOFF_MASK                       (1 << 12)
-#define OMAP4_BGAP_TSHUT_SHIFT                         11
-#define OMAP4_BGAP_TSHUT_MASK                          (1 << 11)
-#define OMAP4_BGAP_TEMP_SENSOR_CONTCONV_SHIFT          10
-#define OMAP4_BGAP_TEMP_SENSOR_CONTCONV_MASK           (1 << 10)
-#define OMAP4_BGAP_TEMP_SENSOR_SOC_SHIFT               9
-#define OMAP4_BGAP_TEMP_SENSOR_SOC_MASK                        (1 << 9)
-#define OMAP4_BGAP_TEMP_SENSOR_EOCZ_SHIFT              8
-#define OMAP4_BGAP_TEMP_SENSOR_EOCZ_MASK               (1 << 8)
-#define OMAP4_BGAP_TEMP_SENSOR_DTEMP_SHIFT             0
-#define OMAP4_BGAP_TEMP_SENSOR_DTEMP_MASK              (0xff << 0)
-
-/* DPLL_NWELL_TRIM_0 */
-#define OMAP4_DPLL_ABE_NWELL_TRIM_MUX_CTRL_SHIFT       29
-#define OMAP4_DPLL_ABE_NWELL_TRIM_MUX_CTRL_MASK                (1 << 29)
-#define OMAP4_DPLL_ABE_NWELL_TRIM_SHIFT                        24
-#define OMAP4_DPLL_ABE_NWELL_TRIM_MASK                 (0x1f << 24)
-#define OMAP4_DPLL_PER_NWELL_TRIM_MUX_CTRL_SHIFT       23
-#define OMAP4_DPLL_PER_NWELL_TRIM_MUX_CTRL_MASK                (1 << 23)
-#define OMAP4_DPLL_PER_NWELL_TRIM_SHIFT                        18
-#define OMAP4_DPLL_PER_NWELL_TRIM_MASK                 (0x1f << 18)
-#define OMAP4_DPLL_CORE_NWELL_TRIM_MUX_CTRL_SHIFT      17
-#define OMAP4_DPLL_CORE_NWELL_TRIM_MUX_CTRL_MASK       (1 << 17)
-#define OMAP4_DPLL_CORE_NWELL_TRIM_SHIFT               12
-#define OMAP4_DPLL_CORE_NWELL_TRIM_MASK                        (0x1f << 12)
-#define OMAP4_DPLL_IVA_NWELL_TRIM_MUX_CTRL_SHIFT       11
-#define OMAP4_DPLL_IVA_NWELL_TRIM_MUX_CTRL_MASK                (1 << 11)
-#define OMAP4_DPLL_IVA_NWELL_TRIM_SHIFT                        6
-#define OMAP4_DPLL_IVA_NWELL_TRIM_MASK                 (0x1f << 6)
-#define OMAP4_DPLL_MPU_NWELL_TRIM_MUX_CTRL_SHIFT       5
-#define OMAP4_DPLL_MPU_NWELL_TRIM_MUX_CTRL_MASK                (1 << 5)
-#define OMAP4_DPLL_MPU_NWELL_TRIM_SHIFT                        0
-#define OMAP4_DPLL_MPU_NWELL_TRIM_MASK                 (0x1f << 0)
-
-/* DPLL_NWELL_TRIM_1 */
-#define OMAP4_DPLL_UNIPRO_NWELL_TRIM_MUX_CTRL_SHIFT    29
-#define OMAP4_DPLL_UNIPRO_NWELL_TRIM_MUX_CTRL_MASK     (1 << 29)
-#define OMAP4_DPLL_UNIPRO_NWELL_TRIM_SHIFT             24
-#define OMAP4_DPLL_UNIPRO_NWELL_TRIM_MASK              (0x1f << 24)
-#define OMAP4_DPLL_USB_NWELL_TRIM_MUX_CTRL_SHIFT       23
-#define OMAP4_DPLL_USB_NWELL_TRIM_MUX_CTRL_MASK                (1 << 23)
-#define OMAP4_DPLL_USB_NWELL_TRIM_SHIFT                        18
-#define OMAP4_DPLL_USB_NWELL_TRIM_MASK                 (0x1f << 18)
-#define OMAP4_DPLL_HDMI_NWELL_TRIM_MUX_CTRL_SHIFT      17
-#define OMAP4_DPLL_HDMI_NWELL_TRIM_MUX_CTRL_MASK       (1 << 17)
-#define OMAP4_DPLL_HDMI_NWELL_TRIM_SHIFT               12
-#define OMAP4_DPLL_HDMI_NWELL_TRIM_MASK                        (0x1f << 12)
-#define OMAP4_DPLL_DSI2_NWELL_TRIM_MUX_CTRL_SHIFT      11
-#define OMAP4_DPLL_DSI2_NWELL_TRIM_MUX_CTRL_MASK       (1 << 11)
-#define OMAP4_DPLL_DSI2_NWELL_TRIM_SHIFT               6
-#define OMAP4_DPLL_DSI2_NWELL_TRIM_MASK                        (0x1f << 6)
-#define OMAP4_DPLL_DSI1_NWELL_TRIM_MUX_CTRL_SHIFT      5
-#define OMAP4_DPLL_DSI1_NWELL_TRIM_MUX_CTRL_MASK       (1 << 5)
-#define OMAP4_DPLL_DSI1_NWELL_TRIM_SHIFT               0
-#define OMAP4_DPLL_DSI1_NWELL_TRIM_MASK                        (0x1f << 0)
-
-/* USBOTGHS_CONTROL */
-#define OMAP4_DISCHRGVBUS_SHIFT                                8
-#define OMAP4_DISCHRGVBUS_MASK                         (1 << 8)
-#define OMAP4_CHRGVBUS_SHIFT                           7
-#define OMAP4_CHRGVBUS_MASK                            (1 << 7)
-#define OMAP4_DRVVBUS_SHIFT                            6
-#define OMAP4_DRVVBUS_MASK                             (1 << 6)
-#define OMAP4_IDPULLUP_SHIFT                           5
-#define OMAP4_IDPULLUP_MASK                            (1 << 5)
-#define OMAP4_IDDIG_SHIFT                              4
-#define OMAP4_IDDIG_MASK                               (1 << 4)
-#define OMAP4_SESSEND_SHIFT                            3
-#define OMAP4_SESSEND_MASK                             (1 << 3)
-#define OMAP4_VBUSVALID_SHIFT                          2
-#define OMAP4_VBUSVALID_MASK                           (1 << 2)
-#define OMAP4_BVALID_SHIFT                             1
-#define OMAP4_BVALID_MASK                              (1 << 1)
-#define OMAP4_AVALID_SHIFT                             0
-#define OMAP4_AVALID_MASK                              (1 << 0)
-
-/* DSS_CONTROL */
-#define OMAP4_DSS_MUX6_SELECT_SHIFT                    0
-#define OMAP4_DSS_MUX6_SELECT_MASK                     (1 << 0)
-
-/* HWOBS_CONTROL */
-#define OMAP4_HWOBS_CLKDIV_SEL_SHIFT                   3
-#define OMAP4_HWOBS_CLKDIV_SEL_MASK                    (0x1f << 3)
-#define OMAP4_HWOBS_ALL_ZERO_MODE_SHIFT                        2
-#define OMAP4_HWOBS_ALL_ZERO_MODE_MASK                 (1 << 2)
-#define OMAP4_HWOBS_ALL_ONE_MODE_SHIFT                 1
-#define OMAP4_HWOBS_ALL_ONE_MODE_MASK                  (1 << 1)
-#define OMAP4_HWOBS_MACRO_ENABLE_SHIFT                 0
-#define OMAP4_HWOBS_MACRO_ENABLE_MASK                  (1 << 0)
-
-/* DEBOBS_FINAL_MUX_SEL */
-#define OMAP4_SELECT_SHIFT                             0
-#define OMAP4_SELECT_MASK                              (0xffffffff << 0)
-
-/* DEBOBS_MMR_MPU */
-#define OMAP4_SELECT_DEBOBS_MMR_MPU_SHIFT              0
-#define OMAP4_SELECT_DEBOBS_MMR_MPU_MASK               (0xf << 0)
-
-/* CONF_SDMA_REQ_SEL0 */
-#define OMAP4_MULT_SHIFT                               0
-#define OMAP4_MULT_MASK                                        (0x7f << 0)
-
-/* CONF_CLK_SEL0 */
-#define OMAP4_MULT_CONF_CLK_SEL0_SHIFT                 0
-#define OMAP4_MULT_CONF_CLK_SEL0_MASK                  (0x7 << 0)
-
-/* CONF_CLK_SEL1 */
-#define OMAP4_MULT_CONF_CLK_SEL1_SHIFT                 0
-#define OMAP4_MULT_CONF_CLK_SEL1_MASK                  (0x7 << 0)
-
-/* CONF_CLK_SEL2 */
-#define OMAP4_MULT_CONF_CLK_SEL2_SHIFT                 0
-#define OMAP4_MULT_CONF_CLK_SEL2_MASK                  (0x7 << 0)
-
-/* CONF_DPLL_FREQLOCK_SEL */
-#define OMAP4_MULT_CONF_DPLL_FREQLOCK_SEL_SHIFT                0
-#define OMAP4_MULT_CONF_DPLL_FREQLOCK_SEL_MASK         (0x7 << 0)
-
-/* CONF_DPLL_TINITZ_SEL */
-#define OMAP4_MULT_CONF_DPLL_TINITZ_SEL_SHIFT          0
-#define OMAP4_MULT_CONF_DPLL_TINITZ_SEL_MASK           (0x7 << 0)
-
-/* CONF_DPLL_PHASELOCK_SEL */
-#define OMAP4_MULT_CONF_DPLL_PHASELOCK_SEL_SHIFT       0
-#define OMAP4_MULT_CONF_DPLL_PHASELOCK_SEL_MASK                (0x7 << 0)
-
-/* CONF_DEBUG_SEL_TST_0 */
-#define OMAP4_MODE_SHIFT                               0
-#define OMAP4_MODE_MASK                                        (0xf << 0)
-
-#endif
diff --git a/arch/arm/mach-omap2/ctrl_module_pad_core_44xx.h b/arch/arm/mach-omap2/ctrl_module_pad_core_44xx.h
deleted file mode 100644 (file)
index c88420d..0000000
+++ /dev/null
@@ -1,1409 +0,0 @@
-/*
- * OMAP44xx CTRL_MODULE_PAD_CORE registers and bitfields
- *
- * Copyright (C) 2009-2010 Texas Instruments, Inc.
- *
- * Benoit Cousson (b-cousson@ti.com)
- * Santosh Shilimkar (santosh.shilimkar@ti.com)
- *
- * This file is automatically generated from the OMAP hardware databases.
- * We respectfully ask that any modifications to this file be coordinated
- * with the public linux-omap@vger.kernel.org mailing list and the
- * authors above to ensure that the autogeneration scripts are kept
- * up-to-date with the file contents.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#ifndef __ARCH_ARM_MACH_OMAP2_CTRL_MODULE_PAD_CORE_44XX_H
-#define __ARCH_ARM_MACH_OMAP2_CTRL_MODULE_PAD_CORE_44XX_H
-
-
-/* Base address */
-#define OMAP4_CTRL_MODULE_PAD_CORE                             0x4a100000
-
-/* Registers offset */
-#define OMAP4_CTRL_MODULE_PAD_CORE_IP_REVISION                 0x0000
-#define OMAP4_CTRL_MODULE_PAD_CORE_IP_HWINFO                   0x0004
-#define OMAP4_CTRL_MODULE_PAD_CORE_IP_SYSCONFIG                        0x0010
-#define OMAP4_CTRL_MODULE_PAD_CORE_PADCONF_WAKEUPEVENT_0       0x01d8
-#define OMAP4_CTRL_MODULE_PAD_CORE_PADCONF_WAKEUPEVENT_1       0x01dc
-#define OMAP4_CTRL_MODULE_PAD_CORE_PADCONF_WAKEUPEVENT_2       0x01e0
-#define OMAP4_CTRL_MODULE_PAD_CORE_PADCONF_WAKEUPEVENT_3       0x01e4
-#define OMAP4_CTRL_MODULE_PAD_CORE_PADCONF_WAKEUPEVENT_4       0x01e8
-#define OMAP4_CTRL_MODULE_PAD_CORE_PADCONF_WAKEUPEVENT_5       0x01ec
-#define OMAP4_CTRL_MODULE_PAD_CORE_PADCONF_WAKEUPEVENT_6       0x01f0
-#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_PADCONF_GLOBAL      0x05a0
-#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_PADCONF_MODE                0x05a4
-#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_SMART1IO_PADCONF_0  0x05a8
-#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_SMART1IO_PADCONF_1  0x05ac
-#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_SMART2IO_PADCONF_0  0x05b0
-#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_SMART2IO_PADCONF_1  0x05b4
-#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_SMART3IO_PADCONF_0  0x05b8
-#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_SMART3IO_PADCONF_1  0x05bc
-#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_SMART3IO_PADCONF_2  0x05c0
-#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_USBB_HSIC           0x05c4
-#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_SLIMBUS             0x05c8
-#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_PBIASLITE           0x0600
-#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_I2C_0               0x0604
-#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_CAMERA_RX           0x0608
-#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_AVDAC               0x060c
-#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_HDMI_TX_PHY         0x0610
-#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_MMC2                        0x0614
-#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_DSIPHY              0x0618
-#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_MCBSPLP             0x061c
-#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_USB2PHYCORE         0x0620
-#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_I2C_1               0x0624
-#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_MMC1                        0x0628
-#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_HSI                 0x062c
-#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_USB                 0x0630
-#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_HDQ                 0x0634
-#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_LPDDR2IO1_0         0x0638
-#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_LPDDR2IO1_1         0x063c
-#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_LPDDR2IO1_2         0x0640
-#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_LPDDR2IO1_3         0x0644
-#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_LPDDR2IO2_0         0x0648
-#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_LPDDR2IO2_1         0x064c
-#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_LPDDR2IO2_2         0x0650
-#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_LPDDR2IO2_3         0x0654
-#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_BUS_HOLD            0x0658
-#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_C2C                 0x065c
-#define OMAP4_CTRL_MODULE_PAD_CORE_CORE_CONTROL_SPARE_RW       0x0660
-#define OMAP4_CTRL_MODULE_PAD_CORE_CORE_CONTROL_SPARE_R                0x0664
-#define OMAP4_CTRL_MODULE_PAD_CORE_CORE_CONTROL_SPARE_R_C0     0x0668
-#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_EFUSE_1             0x0700
-#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_EFUSE_2             0x0704
-#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_EFUSE_3             0x0708
-#define OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_EFUSE_4             0x070c
-
-/* Registers shifts and masks */
-
-/* IP_REVISION */
-#define OMAP4_IP_REV_SCHEME_SHIFT                              30
-#define OMAP4_IP_REV_SCHEME_MASK                               (0x3 << 30)
-#define OMAP4_IP_REV_FUNC_SHIFT                                        16
-#define OMAP4_IP_REV_FUNC_MASK                                 (0xfff << 16)
-#define OMAP4_IP_REV_RTL_SHIFT                                 11
-#define OMAP4_IP_REV_RTL_MASK                                  (0x1f << 11)
-#define OMAP4_IP_REV_MAJOR_SHIFT                               8
-#define OMAP4_IP_REV_MAJOR_MASK                                        (0x7 << 8)
-#define OMAP4_IP_REV_CUSTOM_SHIFT                              6
-#define OMAP4_IP_REV_CUSTOM_MASK                               (0x3 << 6)
-#define OMAP4_IP_REV_MINOR_SHIFT                               0
-#define OMAP4_IP_REV_MINOR_MASK                                        (0x3f << 0)
-
-/* IP_HWINFO */
-#define OMAP4_IP_HWINFO_SHIFT                                  0
-#define OMAP4_IP_HWINFO_MASK                                   (0xffffffff << 0)
-
-/* IP_SYSCONFIG */
-#define OMAP4_IP_SYSCONFIG_IDLEMODE_SHIFT                      2
-#define OMAP4_IP_SYSCONFIG_IDLEMODE_MASK                       (0x3 << 2)
-
-/* PADCONF_WAKEUPEVENT_0 */
-#define OMAP4_GPMC_CLK_DUPLICATEWAKEUPEVENT_SHIFT              31
-#define OMAP4_GPMC_CLK_DUPLICATEWAKEUPEVENT_MASK               (1 << 31)
-#define OMAP4_GPMC_NWP_DUPLICATEWAKEUPEVENT_SHIFT              30
-#define OMAP4_GPMC_NWP_DUPLICATEWAKEUPEVENT_MASK               (1 << 30)
-#define OMAP4_GPMC_NCS3_DUPLICATEWAKEUPEVENT_SHIFT             29
-#define OMAP4_GPMC_NCS3_DUPLICATEWAKEUPEVENT_MASK              (1 << 29)
-#define OMAP4_GPMC_NCS2_DUPLICATEWAKEUPEVENT_SHIFT             28
-#define OMAP4_GPMC_NCS2_DUPLICATEWAKEUPEVENT_MASK              (1 << 28)
-#define OMAP4_GPMC_NCS1_DUPLICATEWAKEUPEVENT_SHIFT             27
-#define OMAP4_GPMC_NCS1_DUPLICATEWAKEUPEVENT_MASK              (1 << 27)
-#define OMAP4_GPMC_NCS0_DUPLICATEWAKEUPEVENT_SHIFT             26
-#define OMAP4_GPMC_NCS0_DUPLICATEWAKEUPEVENT_MASK              (1 << 26)
-#define OMAP4_GPMC_A25_DUPLICATEWAKEUPEVENT_SHIFT              25
-#define OMAP4_GPMC_A25_DUPLICATEWAKEUPEVENT_MASK               (1 << 25)
-#define OMAP4_GPMC_A24_DUPLICATEWAKEUPEVENT_SHIFT              24
-#define OMAP4_GPMC_A24_DUPLICATEWAKEUPEVENT_MASK               (1 << 24)
-#define OMAP4_GPMC_A23_DUPLICATEWAKEUPEVENT_SHIFT              23
-#define OMAP4_GPMC_A23_DUPLICATEWAKEUPEVENT_MASK               (1 << 23)
-#define OMAP4_GPMC_A22_DUPLICATEWAKEUPEVENT_SHIFT              22
-#define OMAP4_GPMC_A22_DUPLICATEWAKEUPEVENT_MASK               (1 << 22)
-#define OMAP4_GPMC_A21_DUPLICATEWAKEUPEVENT_SHIFT              21
-#define OMAP4_GPMC_A21_DUPLICATEWAKEUPEVENT_MASK               (1 << 21)
-#define OMAP4_GPMC_A20_DUPLICATEWAKEUPEVENT_SHIFT              20
-#define OMAP4_GPMC_A20_DUPLICATEWAKEUPEVENT_MASK               (1 << 20)
-#define OMAP4_GPMC_A19_DUPLICATEWAKEUPEVENT_SHIFT              19
-#define OMAP4_GPMC_A19_DUPLICATEWAKEUPEVENT_MASK               (1 << 19)
-#define OMAP4_GPMC_A18_DUPLICATEWAKEUPEVENT_SHIFT              18
-#define OMAP4_GPMC_A18_DUPLICATEWAKEUPEVENT_MASK               (1 << 18)
-#define OMAP4_GPMC_A17_DUPLICATEWAKEUPEVENT_SHIFT              17
-#define OMAP4_GPMC_A17_DUPLICATEWAKEUPEVENT_MASK               (1 << 17)
-#define OMAP4_GPMC_A16_DUPLICATEWAKEUPEVENT_SHIFT              16
-#define OMAP4_GPMC_A16_DUPLICATEWAKEUPEVENT_MASK               (1 << 16)
-#define OMAP4_GPMC_AD15_DUPLICATEWAKEUPEVENT_SHIFT             15
-#define OMAP4_GPMC_AD15_DUPLICATEWAKEUPEVENT_MASK              (1 << 15)
-#define OMAP4_GPMC_AD14_DUPLICATEWAKEUPEVENT_SHIFT             14
-#define OMAP4_GPMC_AD14_DUPLICATEWAKEUPEVENT_MASK              (1 << 14)
-#define OMAP4_GPMC_AD13_DUPLICATEWAKEUPEVENT_SHIFT             13
-#define OMAP4_GPMC_AD13_DUPLICATEWAKEUPEVENT_MASK              (1 << 13)
-#define OMAP4_GPMC_AD12_DUPLICATEWAKEUPEVENT_SHIFT             12
-#define OMAP4_GPMC_AD12_DUPLICATEWAKEUPEVENT_MASK              (1 << 12)
-#define OMAP4_GPMC_AD11_DUPLICATEWAKEUPEVENT_SHIFT             11
-#define OMAP4_GPMC_AD11_DUPLICATEWAKEUPEVENT_MASK              (1 << 11)
-#define OMAP4_GPMC_AD10_DUPLICATEWAKEUPEVENT_SHIFT             10
-#define OMAP4_GPMC_AD10_DUPLICATEWAKEUPEVENT_MASK              (1 << 10)
-#define OMAP4_GPMC_AD9_DUPLICATEWAKEUPEVENT_SHIFT              9
-#define OMAP4_GPMC_AD9_DUPLICATEWAKEUPEVENT_MASK               (1 << 9)
-#define OMAP4_GPMC_AD8_DUPLICATEWAKEUPEVENT_SHIFT              8
-#define OMAP4_GPMC_AD8_DUPLICATEWAKEUPEVENT_MASK               (1 << 8)
-#define OMAP4_GPMC_AD7_DUPLICATEWAKEUPEVENT_SHIFT              7
-#define OMAP4_GPMC_AD7_DUPLICATEWAKEUPEVENT_MASK               (1 << 7)
-#define OMAP4_GPMC_AD6_DUPLICATEWAKEUPEVENT_SHIFT              6
-#define OMAP4_GPMC_AD6_DUPLICATEWAKEUPEVENT_MASK               (1 << 6)
-#define OMAP4_GPMC_AD5_DUPLICATEWAKEUPEVENT_SHIFT              5
-#define OMAP4_GPMC_AD5_DUPLICATEWAKEUPEVENT_MASK               (1 << 5)
-#define OMAP4_GPMC_AD4_DUPLICATEWAKEUPEVENT_SHIFT              4
-#define OMAP4_GPMC_AD4_DUPLICATEWAKEUPEVENT_MASK               (1 << 4)
-#define OMAP4_GPMC_AD3_DUPLICATEWAKEUPEVENT_SHIFT              3
-#define OMAP4_GPMC_AD3_DUPLICATEWAKEUPEVENT_MASK               (1 << 3)
-#define OMAP4_GPMC_AD2_DUPLICATEWAKEUPEVENT_SHIFT              2
-#define OMAP4_GPMC_AD2_DUPLICATEWAKEUPEVENT_MASK               (1 << 2)
-#define OMAP4_GPMC_AD1_DUPLICATEWAKEUPEVENT_SHIFT              1
-#define OMAP4_GPMC_AD1_DUPLICATEWAKEUPEVENT_MASK               (1 << 1)
-#define OMAP4_GPMC_AD0_DUPLICATEWAKEUPEVENT_SHIFT              0
-#define OMAP4_GPMC_AD0_DUPLICATEWAKEUPEVENT_MASK               (1 << 0)
-
-/* PADCONF_WAKEUPEVENT_1 */
-#define OMAP4_CAM_STROBE_DUPLICATEWAKEUPEVENT_SHIFT            31
-#define OMAP4_CAM_STROBE_DUPLICATEWAKEUPEVENT_MASK             (1 << 31)
-#define OMAP4_CAM_SHUTTER_DUPLICATEWAKEUPEVENT_SHIFT           30
-#define OMAP4_CAM_SHUTTER_DUPLICATEWAKEUPEVENT_MASK            (1 << 30)
-#define OMAP4_CSI22_DY1_DUPLICATEWAKEUPEVENT_SHIFT             29
-#define OMAP4_CSI22_DY1_DUPLICATEWAKEUPEVENT_MASK              (1 << 29)
-#define OMAP4_CSI22_DX1_DUPLICATEWAKEUPEVENT_SHIFT             28
-#define OMAP4_CSI22_DX1_DUPLICATEWAKEUPEVENT_MASK              (1 << 28)
-#define OMAP4_CSI22_DY0_DUPLICATEWAKEUPEVENT_SHIFT             27
-#define OMAP4_CSI22_DY0_DUPLICATEWAKEUPEVENT_MASK              (1 << 27)
-#define OMAP4_CSI22_DX0_DUPLICATEWAKEUPEVENT_SHIFT             26
-#define OMAP4_CSI22_DX0_DUPLICATEWAKEUPEVENT_MASK              (1 << 26)
-#define OMAP4_CSI21_DY4_DUPLICATEWAKEUPEVENT_SHIFT             25
-#define OMAP4_CSI21_DY4_DUPLICATEWAKEUPEVENT_MASK              (1 << 25)
-#define OMAP4_CSI21_DX4_DUPLICATEWAKEUPEVENT_SHIFT             24
-#define OMAP4_CSI21_DX4_DUPLICATEWAKEUPEVENT_MASK              (1 << 24)
-#define OMAP4_CSI21_DY3_DUPLICATEWAKEUPEVENT_SHIFT             23
-#define OMAP4_CSI21_DY3_DUPLICATEWAKEUPEVENT_MASK              (1 << 23)
-#define OMAP4_CSI21_DX3_DUPLICATEWAKEUPEVENT_SHIFT             22
-#define OMAP4_CSI21_DX3_DUPLICATEWAKEUPEVENT_MASK              (1 << 22)
-#define OMAP4_CSI21_DY2_DUPLICATEWAKEUPEVENT_SHIFT             21
-#define OMAP4_CSI21_DY2_DUPLICATEWAKEUPEVENT_MASK              (1 << 21)
-#define OMAP4_CSI21_DX2_DUPLICATEWAKEUPEVENT_SHIFT             20
-#define OMAP4_CSI21_DX2_DUPLICATEWAKEUPEVENT_MASK              (1 << 20)
-#define OMAP4_CSI21_DY1_DUPLICATEWAKEUPEVENT_SHIFT             19
-#define OMAP4_CSI21_DY1_DUPLICATEWAKEUPEVENT_MASK              (1 << 19)
-#define OMAP4_CSI21_DX1_DUPLICATEWAKEUPEVENT_SHIFT             18
-#define OMAP4_CSI21_DX1_DUPLICATEWAKEUPEVENT_MASK              (1 << 18)
-#define OMAP4_CSI21_DY0_DUPLICATEWAKEUPEVENT_SHIFT             17
-#define OMAP4_CSI21_DY0_DUPLICATEWAKEUPEVENT_MASK              (1 << 17)
-#define OMAP4_CSI21_DX0_DUPLICATEWAKEUPEVENT_SHIFT             16
-#define OMAP4_CSI21_DX0_DUPLICATEWAKEUPEVENT_MASK              (1 << 16)
-#define OMAP4_HDMI_DDC_SDA_DUPLICATEWAKEUPEVENT_SHIFT          15
-#define OMAP4_HDMI_DDC_SDA_DUPLICATEWAKEUPEVENT_MASK           (1 << 15)
-#define OMAP4_HDMI_DDC_SCL_DUPLICATEWAKEUPEVENT_SHIFT          14
-#define OMAP4_HDMI_DDC_SCL_DUPLICATEWAKEUPEVENT_MASK           (1 << 14)
-#define OMAP4_HDMI_CEC_DUPLICATEWAKEUPEVENT_SHIFT              13
-#define OMAP4_HDMI_CEC_DUPLICATEWAKEUPEVENT_MASK               (1 << 13)
-#define OMAP4_HDMI_HPD_DUPLICATEWAKEUPEVENT_SHIFT              12
-#define OMAP4_HDMI_HPD_DUPLICATEWAKEUPEVENT_MASK               (1 << 12)
-#define OMAP4_C2C_DATA15_DUPLICATEWAKEUPEVENT_SHIFT            11
-#define OMAP4_C2C_DATA15_DUPLICATEWAKEUPEVENT_MASK             (1 << 11)
-#define OMAP4_C2C_DATA14_DUPLICATEWAKEUPEVENT_SHIFT            10
-#define OMAP4_C2C_DATA14_DUPLICATEWAKEUPEVENT_MASK             (1 << 10)
-#define OMAP4_C2C_DATA13_DUPLICATEWAKEUPEVENT_SHIFT            9
-#define OMAP4_C2C_DATA13_DUPLICATEWAKEUPEVENT_MASK             (1 << 9)
-#define OMAP4_C2C_DATA12_DUPLICATEWAKEUPEVENT_SHIFT            8
-#define OMAP4_C2C_DATA12_DUPLICATEWAKEUPEVENT_MASK             (1 << 8)
-#define OMAP4_C2C_DATA11_DUPLICATEWAKEUPEVENT_SHIFT            7
-#define OMAP4_C2C_DATA11_DUPLICATEWAKEUPEVENT_MASK             (1 << 7)
-#define OMAP4_GPMC_WAIT1_DUPLICATEWAKEUPEVENT_SHIFT            6
-#define OMAP4_GPMC_WAIT1_DUPLICATEWAKEUPEVENT_MASK             (1 << 6)
-#define OMAP4_GPMC_WAIT0_DUPLICATEWAKEUPEVENT_SHIFT            5
-#define OMAP4_GPMC_WAIT0_DUPLICATEWAKEUPEVENT_MASK             (1 << 5)
-#define OMAP4_GPMC_NBE1_DUPLICATEWAKEUPEVENT_SHIFT             4
-#define OMAP4_GPMC_NBE1_DUPLICATEWAKEUPEVENT_MASK              (1 << 4)
-#define OMAP4_GPMC_NBE0_CLE_DUPLICATEWAKEUPEVENT_SHIFT         3
-#define OMAP4_GPMC_NBE0_CLE_DUPLICATEWAKEUPEVENT_MASK          (1 << 3)
-#define OMAP4_GPMC_NWE_DUPLICATEWAKEUPEVENT_SHIFT              2
-#define OMAP4_GPMC_NWE_DUPLICATEWAKEUPEVENT_MASK               (1 << 2)
-#define OMAP4_GPMC_NOE_DUPLICATEWAKEUPEVENT_SHIFT              1
-#define OMAP4_GPMC_NOE_DUPLICATEWAKEUPEVENT_MASK               (1 << 1)
-#define OMAP4_GPMC_NADV_ALE_DUPLICATEWAKEUPEVENT_SHIFT         0
-#define OMAP4_GPMC_NADV_ALE_DUPLICATEWAKEUPEVENT_MASK          (1 << 0)
-
-/* PADCONF_WAKEUPEVENT_2 */
-#define OMAP4_ABE_MCBSP1_CLKX_DUPLICATEWAKEUPEVENT_SHIFT       31
-#define OMAP4_ABE_MCBSP1_CLKX_DUPLICATEWAKEUPEVENT_MASK                (1 << 31)
-#define OMAP4_ABE_MCBSP2_FSX_DUPLICATEWAKEUPEVENT_SHIFT                30
-#define OMAP4_ABE_MCBSP2_FSX_DUPLICATEWAKEUPEVENT_MASK         (1 << 30)
-#define OMAP4_ABE_MCBSP2_DX_DUPLICATEWAKEUPEVENT_SHIFT         29
-#define OMAP4_ABE_MCBSP2_DX_DUPLICATEWAKEUPEVENT_MASK          (1 << 29)
-#define OMAP4_ABE_MCBSP2_DR_DUPLICATEWAKEUPEVENT_SHIFT         28
-#define OMAP4_ABE_MCBSP2_DR_DUPLICATEWAKEUPEVENT_MASK          (1 << 28)
-#define OMAP4_ABE_MCBSP2_CLKX_DUPLICATEWAKEUPEVENT_SHIFT       27
-#define OMAP4_ABE_MCBSP2_CLKX_DUPLICATEWAKEUPEVENT_MASK                (1 << 27)
-#define OMAP4_SDMMC1_DAT7_DUPLICATEWAKEUPEVENT_SHIFT           26
-#define OMAP4_SDMMC1_DAT7_DUPLICATEWAKEUPEVENT_MASK            (1 << 26)
-#define OMAP4_SDMMC1_DAT6_DUPLICATEWAKEUPEVENT_SHIFT           25
-#define OMAP4_SDMMC1_DAT6_DUPLICATEWAKEUPEVENT_MASK            (1 << 25)
-#define OMAP4_SDMMC1_DAT5_DUPLICATEWAKEUPEVENT_SHIFT           24
-#define OMAP4_SDMMC1_DAT5_DUPLICATEWAKEUPEVENT_MASK            (1 << 24)
-#define OMAP4_SDMMC1_DAT4_DUPLICATEWAKEUPEVENT_SHIFT           23
-#define OMAP4_SDMMC1_DAT4_DUPLICATEWAKEUPEVENT_MASK            (1 << 23)
-#define OMAP4_SDMMC1_DAT3_DUPLICATEWAKEUPEVENT_SHIFT           22
-#define OMAP4_SDMMC1_DAT3_DUPLICATEWAKEUPEVENT_MASK            (1 << 22)
-#define OMAP4_SDMMC1_DAT2_DUPLICATEWAKEUPEVENT_SHIFT           21
-#define OMAP4_SDMMC1_DAT2_DUPLICATEWAKEUPEVENT_MASK            (1 << 21)
-#define OMAP4_SDMMC1_DAT1_DUPLICATEWAKEUPEVENT_SHIFT           20
-#define OMAP4_SDMMC1_DAT1_DUPLICATEWAKEUPEVENT_MASK            (1 << 20)
-#define OMAP4_SDMMC1_DAT0_DUPLICATEWAKEUPEVENT_SHIFT           19
-#define OMAP4_SDMMC1_DAT0_DUPLICATEWAKEUPEVENT_MASK            (1 << 19)
-#define OMAP4_SDMMC1_CMD_DUPLICATEWAKEUPEVENT_SHIFT            18
-#define OMAP4_SDMMC1_CMD_DUPLICATEWAKEUPEVENT_MASK             (1 << 18)
-#define OMAP4_SDMMC1_CLK_DUPLICATEWAKEUPEVENT_SHIFT            17
-#define OMAP4_SDMMC1_CLK_DUPLICATEWAKEUPEVENT_MASK             (1 << 17)
-#define OMAP4_USBC1_ICUSB_DM_DUPLICATEWAKEUPEVENT_SHIFT                16
-#define OMAP4_USBC1_ICUSB_DM_DUPLICATEWAKEUPEVENT_MASK         (1 << 16)
-#define OMAP4_USBC1_ICUSB_DP_DUPLICATEWAKEUPEVENT_SHIFT                15
-#define OMAP4_USBC1_ICUSB_DP_DUPLICATEWAKEUPEVENT_MASK         (1 << 15)
-#define OMAP4_USBB1_HSIC_STROBE_DUPLICATEWAKEUPEVENT_SHIFT     14
-#define OMAP4_USBB1_HSIC_STROBE_DUPLICATEWAKEUPEVENT_MASK      (1 << 14)
-#define OMAP4_USBB1_HSIC_DATA_DUPLICATEWAKEUPEVENT_SHIFT       13
-#define OMAP4_USBB1_HSIC_DATA_DUPLICATEWAKEUPEVENT_MASK                (1 << 13)
-#define OMAP4_USBB1_ULPITLL_DAT7_DUPLICATEWAKEUPEVENT_SHIFT    12
-#define OMAP4_USBB1_ULPITLL_DAT7_DUPLICATEWAKEUPEVENT_MASK     (1 << 12)
-#define OMAP4_USBB1_ULPITLL_DAT6_DUPLICATEWAKEUPEVENT_SHIFT    11
-#define OMAP4_USBB1_ULPITLL_DAT6_DUPLICATEWAKEUPEVENT_MASK     (1 << 11)
-#define OMAP4_USBB1_ULPITLL_DAT5_DUPLICATEWAKEUPEVENT_SHIFT    10
-#define OMAP4_USBB1_ULPITLL_DAT5_DUPLICATEWAKEUPEVENT_MASK     (1 << 10)
-#define OMAP4_USBB1_ULPITLL_DAT4_DUPLICATEWAKEUPEVENT_SHIFT    9
-#define OMAP4_USBB1_ULPITLL_DAT4_DUPLICATEWAKEUPEVENT_MASK     (1 << 9)
-#define OMAP4_USBB1_ULPITLL_DAT3_DUPLICATEWAKEUPEVENT_SHIFT    8
-#define OMAP4_USBB1_ULPITLL_DAT3_DUPLICATEWAKEUPEVENT_MASK     (1 << 8)
-#define OMAP4_USBB1_ULPITLL_DAT2_DUPLICATEWAKEUPEVENT_SHIFT    7
-#define OMAP4_USBB1_ULPITLL_DAT2_DUPLICATEWAKEUPEVENT_MASK     (1 << 7)
-#define OMAP4_USBB1_ULPITLL_DAT1_DUPLICATEWAKEUPEVENT_SHIFT    6
-#define OMAP4_USBB1_ULPITLL_DAT1_DUPLICATEWAKEUPEVENT_MASK     (1 << 6)
-#define OMAP4_USBB1_ULPITLL_DAT0_DUPLICATEWAKEUPEVENT_SHIFT    5
-#define OMAP4_USBB1_ULPITLL_DAT0_DUPLICATEWAKEUPEVENT_MASK     (1 << 5)
-#define OMAP4_USBB1_ULPITLL_NXT_DUPLICATEWAKEUPEVENT_SHIFT     4
-#define OMAP4_USBB1_ULPITLL_NXT_DUPLICATEWAKEUPEVENT_MASK      (1 << 4)
-#define OMAP4_USBB1_ULPITLL_DIR_DUPLICATEWAKEUPEVENT_SHIFT     3
-#define OMAP4_USBB1_ULPITLL_DIR_DUPLICATEWAKEUPEVENT_MASK      (1 << 3)
-#define OMAP4_USBB1_ULPITLL_STP_DUPLICATEWAKEUPEVENT_SHIFT     2
-#define OMAP4_USBB1_ULPITLL_STP_DUPLICATEWAKEUPEVENT_MASK      (1 << 2)
-#define OMAP4_USBB1_ULPITLL_CLK_DUPLICATEWAKEUPEVENT_SHIFT     1
-#define OMAP4_USBB1_ULPITLL_CLK_DUPLICATEWAKEUPEVENT_MASK      (1 << 1)
-#define OMAP4_CAM_GLOBALRESET_DUPLICATEWAKEUPEVENT_SHIFT       0
-#define OMAP4_CAM_GLOBALRESET_DUPLICATEWAKEUPEVENT_MASK                (1 << 0)
-
-/* PADCONF_WAKEUPEVENT_3 */
-#define OMAP4_MCSPI1_CS3_DUPLICATEWAKEUPEVENT_SHIFT            31
-#define OMAP4_MCSPI1_CS3_DUPLICATEWAKEUPEVENT_MASK             (1 << 31)
-#define OMAP4_MCSPI1_CS2_DUPLICATEWAKEUPEVENT_SHIFT            30
-#define OMAP4_MCSPI1_CS2_DUPLICATEWAKEUPEVENT_MASK             (1 << 30)
-#define OMAP4_MCSPI1_CS1_DUPLICATEWAKEUPEVENT_SHIFT            29
-#define OMAP4_MCSPI1_CS1_DUPLICATEWAKEUPEVENT_MASK             (1 << 29)
-#define OMAP4_MCSPI1_CS0_DUPLICATEWAKEUPEVENT_SHIFT            28
-#define OMAP4_MCSPI1_CS0_DUPLICATEWAKEUPEVENT_MASK             (1 << 28)
-#define OMAP4_MCSPI1_SIMO_DUPLICATEWAKEUPEVENT_SHIFT           27
-#define OMAP4_MCSPI1_SIMO_DUPLICATEWAKEUPEVENT_MASK            (1 << 27)
-#define OMAP4_MCSPI1_SOMI_DUPLICATEWAKEUPEVENT_SHIFT           26
-#define OMAP4_MCSPI1_SOMI_DUPLICATEWAKEUPEVENT_MASK            (1 << 26)
-#define OMAP4_MCSPI1_CLK_DUPLICATEWAKEUPEVENT_SHIFT            25
-#define OMAP4_MCSPI1_CLK_DUPLICATEWAKEUPEVENT_MASK             (1 << 25)
-#define OMAP4_I2C4_SDA_DUPLICATEWAKEUPEVENT_SHIFT              24
-#define OMAP4_I2C4_SDA_DUPLICATEWAKEUPEVENT_MASK               (1 << 24)
-#define OMAP4_I2C4_SCL_DUPLICATEWAKEUPEVENT_SHIFT              23
-#define OMAP4_I2C4_SCL_DUPLICATEWAKEUPEVENT_MASK               (1 << 23)
-#define OMAP4_I2C3_SDA_DUPLICATEWAKEUPEVENT_SHIFT              22
-#define OMAP4_I2C3_SDA_DUPLICATEWAKEUPEVENT_MASK               (1 << 22)
-#define OMAP4_I2C3_SCL_DUPLICATEWAKEUPEVENT_SHIFT              21
-#define OMAP4_I2C3_SCL_DUPLICATEWAKEUPEVENT_MASK               (1 << 21)
-#define OMAP4_I2C2_SDA_DUPLICATEWAKEUPEVENT_SHIFT              20
-#define OMAP4_I2C2_SDA_DUPLICATEWAKEUPEVENT_MASK               (1 << 20)
-#define OMAP4_I2C2_SCL_DUPLICATEWAKEUPEVENT_SHIFT              19
-#define OMAP4_I2C2_SCL_DUPLICATEWAKEUPEVENT_MASK               (1 << 19)
-#define OMAP4_I2C1_SDA_DUPLICATEWAKEUPEVENT_SHIFT              18
-#define OMAP4_I2C1_SDA_DUPLICATEWAKEUPEVENT_MASK               (1 << 18)
-#define OMAP4_I2C1_SCL_DUPLICATEWAKEUPEVENT_SHIFT              17
-#define OMAP4_I2C1_SCL_DUPLICATEWAKEUPEVENT_MASK               (1 << 17)
-#define OMAP4_HDQ_SIO_DUPLICATEWAKEUPEVENT_SHIFT               16
-#define OMAP4_HDQ_SIO_DUPLICATEWAKEUPEVENT_MASK                        (1 << 16)
-#define OMAP4_UART2_TX_DUPLICATEWAKEUPEVENT_SHIFT              15
-#define OMAP4_UART2_TX_DUPLICATEWAKEUPEVENT_MASK               (1 << 15)
-#define OMAP4_UART2_RX_DUPLICATEWAKEUPEVENT_SHIFT              14
-#define OMAP4_UART2_RX_DUPLICATEWAKEUPEVENT_MASK               (1 << 14)
-#define OMAP4_UART2_RTS_DUPLICATEWAKEUPEVENT_SHIFT             13
-#define OMAP4_UART2_RTS_DUPLICATEWAKEUPEVENT_MASK              (1 << 13)
-#define OMAP4_UART2_CTS_DUPLICATEWAKEUPEVENT_SHIFT             12
-#define OMAP4_UART2_CTS_DUPLICATEWAKEUPEVENT_MASK              (1 << 12)
-#define OMAP4_ABE_DMIC_DIN3_DUPLICATEWAKEUPEVENT_SHIFT         11
-#define OMAP4_ABE_DMIC_DIN3_DUPLICATEWAKEUPEVENT_MASK          (1 << 11)
-#define OMAP4_ABE_DMIC_DIN2_DUPLICATEWAKEUPEVENT_SHIFT         10
-#define OMAP4_ABE_DMIC_DIN2_DUPLICATEWAKEUPEVENT_MASK          (1 << 10)
-#define OMAP4_ABE_DMIC_DIN1_DUPLICATEWAKEUPEVENT_SHIFT         9
-#define OMAP4_ABE_DMIC_DIN1_DUPLICATEWAKEUPEVENT_MASK          (1 << 9)
-#define OMAP4_ABE_DMIC_CLK1_DUPLICATEWAKEUPEVENT_SHIFT         8
-#define OMAP4_ABE_DMIC_CLK1_DUPLICATEWAKEUPEVENT_MASK          (1 << 8)
-#define OMAP4_ABE_CLKS_DUPLICATEWAKEUPEVENT_SHIFT              7
-#define OMAP4_ABE_CLKS_DUPLICATEWAKEUPEVENT_MASK               (1 << 7)
-#define OMAP4_ABE_PDM_LB_CLK_DUPLICATEWAKEUPEVENT_SHIFT                6
-#define OMAP4_ABE_PDM_LB_CLK_DUPLICATEWAKEUPEVENT_MASK         (1 << 6)
-#define OMAP4_ABE_PDM_FRAME_DUPLICATEWAKEUPEVENT_SHIFT         5
-#define OMAP4_ABE_PDM_FRAME_DUPLICATEWAKEUPEVENT_MASK          (1 << 5)
-#define OMAP4_ABE_PDM_DL_DATA_DUPLICATEWAKEUPEVENT_SHIFT       4
-#define OMAP4_ABE_PDM_DL_DATA_DUPLICATEWAKEUPEVENT_MASK                (1 << 4)
-#define OMAP4_ABE_PDM_UL_DATA_DUPLICATEWAKEUPEVENT_SHIFT       3
-#define OMAP4_ABE_PDM_UL_DATA_DUPLICATEWAKEUPEVENT_MASK                (1 << 3)
-#define OMAP4_ABE_MCBSP1_FSX_DUPLICATEWAKEUPEVENT_SHIFT                2
-#define OMAP4_ABE_MCBSP1_FSX_DUPLICATEWAKEUPEVENT_MASK         (1 << 2)
-#define OMAP4_ABE_MCBSP1_DX_DUPLICATEWAKEUPEVENT_SHIFT         1
-#define OMAP4_ABE_MCBSP1_DX_DUPLICATEWAKEUPEVENT_MASK          (1 << 1)
-#define OMAP4_ABE_MCBSP1_DR_DUPLICATEWAKEUPEVENT_SHIFT         0
-#define OMAP4_ABE_MCBSP1_DR_DUPLICATEWAKEUPEVENT_MASK          (1 << 0)
-
-/* PADCONF_WAKEUPEVENT_4 */
-#define OMAP4_UNIPRO_TY0_DUPLICATEWAKEUPEVENT_SHIFT            31
-#define OMAP4_UNIPRO_TY0_DUPLICATEWAKEUPEVENT_MASK             (1 << 31)
-#define OMAP4_UNIPRO_TX0_DUPLICATEWAKEUPEVENT_SHIFT            30
-#define OMAP4_UNIPRO_TX0_DUPLICATEWAKEUPEVENT_MASK             (1 << 30)
-#define OMAP4_USBB2_HSIC_STROBE_DUPLICATEWAKEUPEVENT_SHIFT     29
-#define OMAP4_USBB2_HSIC_STROBE_DUPLICATEWAKEUPEVENT_MASK      (1 << 29)
-#define OMAP4_USBB2_HSIC_DATA_DUPLICATEWAKEUPEVENT_SHIFT       28
-#define OMAP4_USBB2_HSIC_DATA_DUPLICATEWAKEUPEVENT_MASK                (1 << 28)
-#define OMAP4_USBB2_ULPITLL_DAT7_DUPLICATEWAKEUPEVENT_SHIFT    27
-#define OMAP4_USBB2_ULPITLL_DAT7_DUPLICATEWAKEUPEVENT_MASK     (1 << 27)
-#define OMAP4_USBB2_ULPITLL_DAT6_DUPLICATEWAKEUPEVENT_SHIFT    26
-#define OMAP4_USBB2_ULPITLL_DAT6_DUPLICATEWAKEUPEVENT_MASK     (1 << 26)
-#define OMAP4_USBB2_ULPITLL_DAT5_DUPLICATEWAKEUPEVENT_SHIFT    25
-#define OMAP4_USBB2_ULPITLL_DAT5_DUPLICATEWAKEUPEVENT_MASK     (1 << 25)
-#define OMAP4_USBB2_ULPITLL_DAT4_DUPLICATEWAKEUPEVENT_SHIFT    24
-#define OMAP4_USBB2_ULPITLL_DAT4_DUPLICATEWAKEUPEVENT_MASK     (1 << 24)
-#define OMAP4_USBB2_ULPITLL_DAT3_DUPLICATEWAKEUPEVENT_SHIFT    23
-#define OMAP4_USBB2_ULPITLL_DAT3_DUPLICATEWAKEUPEVENT_MASK     (1 << 23)
-#define OMAP4_USBB2_ULPITLL_DAT2_DUPLICATEWAKEUPEVENT_SHIFT    22
-#define OMAP4_USBB2_ULPITLL_DAT2_DUPLICATEWAKEUPEVENT_MASK     (1 << 22)
-#define OMAP4_USBB2_ULPITLL_DAT1_DUPLICATEWAKEUPEVENT_SHIFT    21
-#define OMAP4_USBB2_ULPITLL_DAT1_DUPLICATEWAKEUPEVENT_MASK     (1 << 21)
-#define OMAP4_USBB2_ULPITLL_DAT0_DUPLICATEWAKEUPEVENT_SHIFT    20
-#define OMAP4_USBB2_ULPITLL_DAT0_DUPLICATEWAKEUPEVENT_MASK     (1 << 20)
-#define OMAP4_USBB2_ULPITLL_NXT_DUPLICATEWAKEUPEVENT_SHIFT     19
-#define OMAP4_USBB2_ULPITLL_NXT_DUPLICATEWAKEUPEVENT_MASK      (1 << 19)
-#define OMAP4_USBB2_ULPITLL_DIR_DUPLICATEWAKEUPEVENT_SHIFT     18
-#define OMAP4_USBB2_ULPITLL_DIR_DUPLICATEWAKEUPEVENT_MASK      (1 << 18)
-#define OMAP4_USBB2_ULPITLL_STP_DUPLICATEWAKEUPEVENT_SHIFT     17
-#define OMAP4_USBB2_ULPITLL_STP_DUPLICATEWAKEUPEVENT_MASK      (1 << 17)
-#define OMAP4_USBB2_ULPITLL_CLK_DUPLICATEWAKEUPEVENT_SHIFT     16
-#define OMAP4_USBB2_ULPITLL_CLK_DUPLICATEWAKEUPEVENT_MASK      (1 << 16)
-#define OMAP4_UART4_TX_DUPLICATEWAKEUPEVENT_SHIFT              15
-#define OMAP4_UART4_TX_DUPLICATEWAKEUPEVENT_MASK               (1 << 15)
-#define OMAP4_UART4_RX_DUPLICATEWAKEUPEVENT_SHIFT              14
-#define OMAP4_UART4_RX_DUPLICATEWAKEUPEVENT_MASK               (1 << 14)
-#define OMAP4_MCSPI4_CS0_DUPLICATEWAKEUPEVENT_SHIFT            13
-#define OMAP4_MCSPI4_CS0_DUPLICATEWAKEUPEVENT_MASK             (1 << 13)
-#define OMAP4_MCSPI4_SOMI_DUPLICATEWAKEUPEVENT_SHIFT           12
-#define OMAP4_MCSPI4_SOMI_DUPLICATEWAKEUPEVENT_MASK            (1 << 12)
-#define OMAP4_MCSPI4_SIMO_DUPLICATEWAKEUPEVENT_SHIFT           11
-#define OMAP4_MCSPI4_SIMO_DUPLICATEWAKEUPEVENT_MASK            (1 << 11)
-#define OMAP4_MCSPI4_CLK_DUPLICATEWAKEUPEVENT_SHIFT            10
-#define OMAP4_MCSPI4_CLK_DUPLICATEWAKEUPEVENT_MASK             (1 << 10)
-#define OMAP4_SDMMC5_DAT3_DUPLICATEWAKEUPEVENT_SHIFT           9
-#define OMAP4_SDMMC5_DAT3_DUPLICATEWAKEUPEVENT_MASK            (1 << 9)
-#define OMAP4_SDMMC5_DAT2_DUPLICATEWAKEUPEVENT_SHIFT           8
-#define OMAP4_SDMMC5_DAT2_DUPLICATEWAKEUPEVENT_MASK            (1 << 8)
-#define OMAP4_SDMMC5_DAT1_DUPLICATEWAKEUPEVENT_SHIFT           7
-#define OMAP4_SDMMC5_DAT1_DUPLICATEWAKEUPEVENT_MASK            (1 << 7)
-#define OMAP4_SDMMC5_DAT0_DUPLICATEWAKEUPEVENT_SHIFT           6
-#define OMAP4_SDMMC5_DAT0_DUPLICATEWAKEUPEVENT_MASK            (1 << 6)
-#define OMAP4_SDMMC5_CMD_DUPLICATEWAKEUPEVENT_SHIFT            5
-#define OMAP4_SDMMC5_CMD_DUPLICATEWAKEUPEVENT_MASK             (1 << 5)
-#define OMAP4_SDMMC5_CLK_DUPLICATEWAKEUPEVENT_SHIFT            4
-#define OMAP4_SDMMC5_CLK_DUPLICATEWAKEUPEVENT_MASK             (1 << 4)
-#define OMAP4_UART3_TX_IRTX_DUPLICATEWAKEUPEVENT_SHIFT         3
-#define OMAP4_UART3_TX_IRTX_DUPLICATEWAKEUPEVENT_MASK          (1 << 3)
-#define OMAP4_UART3_RX_IRRX_DUPLICATEWAKEUPEVENT_SHIFT         2
-#define OMAP4_UART3_RX_IRRX_DUPLICATEWAKEUPEVENT_MASK          (1 << 2)
-#define OMAP4_UART3_RTS_SD_DUPLICATEWAKEUPEVENT_SHIFT          1
-#define OMAP4_UART3_RTS_SD_DUPLICATEWAKEUPEVENT_MASK           (1 << 1)
-#define OMAP4_UART3_CTS_RCTX_DUPLICATEWAKEUPEVENT_SHIFT                0
-#define OMAP4_UART3_CTS_RCTX_DUPLICATEWAKEUPEVENT_MASK         (1 << 0)
-
-/* PADCONF_WAKEUPEVENT_5 */
-#define OMAP4_DPM_EMU11_DUPLICATEWAKEUPEVENT_SHIFT             31
-#define OMAP4_DPM_EMU11_DUPLICATEWAKEUPEVENT_MASK              (1 << 31)
-#define OMAP4_DPM_EMU10_DUPLICATEWAKEUPEVENT_SHIFT             30
-#define OMAP4_DPM_EMU10_DUPLICATEWAKEUPEVENT_MASK              (1 << 30)
-#define OMAP4_DPM_EMU9_DUPLICATEWAKEUPEVENT_SHIFT              29
-#define OMAP4_DPM_EMU9_DUPLICATEWAKEUPEVENT_MASK               (1 << 29)
-#define OMAP4_DPM_EMU8_DUPLICATEWAKEUPEVENT_SHIFT              28
-#define OMAP4_DPM_EMU8_DUPLICATEWAKEUPEVENT_MASK               (1 << 28)
-#define OMAP4_DPM_EMU7_DUPLICATEWAKEUPEVENT_SHIFT              27
-#define OMAP4_DPM_EMU7_DUPLICATEWAKEUPEVENT_MASK               (1 << 27)
-#define OMAP4_DPM_EMU6_DUPLICATEWAKEUPEVENT_SHIFT              26
-#define OMAP4_DPM_EMU6_DUPLICATEWAKEUPEVENT_MASK               (1 << 26)
-#define OMAP4_DPM_EMU5_DUPLICATEWAKEUPEVENT_SHIFT              25
-#define OMAP4_DPM_EMU5_DUPLICATEWAKEUPEVENT_MASK               (1 << 25)
-#define OMAP4_DPM_EMU4_DUPLICATEWAKEUPEVENT_SHIFT              24
-#define OMAP4_DPM_EMU4_DUPLICATEWAKEUPEVENT_MASK               (1 << 24)
-#define OMAP4_DPM_EMU3_DUPLICATEWAKEUPEVENT_SHIFT              23
-#define OMAP4_DPM_EMU3_DUPLICATEWAKEUPEVENT_MASK               (1 << 23)
-#define OMAP4_DPM_EMU2_DUPLICATEWAKEUPEVENT_SHIFT              22
-#define OMAP4_DPM_EMU2_DUPLICATEWAKEUPEVENT_MASK               (1 << 22)
-#define OMAP4_DPM_EMU1_DUPLICATEWAKEUPEVENT_SHIFT              21
-#define OMAP4_DPM_EMU1_DUPLICATEWAKEUPEVENT_MASK               (1 << 21)
-#define OMAP4_DPM_EMU0_DUPLICATEWAKEUPEVENT_SHIFT              20
-#define OMAP4_DPM_EMU0_DUPLICATEWAKEUPEVENT_MASK               (1 << 20)
-#define OMAP4_SYS_BOOT5_DUPLICATEWAKEUPEVENT_SHIFT             19
-#define OMAP4_SYS_BOOT5_DUPLICATEWAKEUPEVENT_MASK              (1 << 19)
-#define OMAP4_SYS_BOOT4_DUPLICATEWAKEUPEVENT_SHIFT             18
-#define OMAP4_SYS_BOOT4_DUPLICATEWAKEUPEVENT_MASK              (1 << 18)
-#define OMAP4_SYS_BOOT3_DUPLICATEWAKEUPEVENT_SHIFT             17
-#define OMAP4_SYS_BOOT3_DUPLICATEWAKEUPEVENT_MASK              (1 << 17)
-#define OMAP4_SYS_BOOT2_DUPLICATEWAKEUPEVENT_SHIFT             16
-#define OMAP4_SYS_BOOT2_DUPLICATEWAKEUPEVENT_MASK              (1 << 16)
-#define OMAP4_SYS_BOOT1_DUPLICATEWAKEUPEVENT_SHIFT             15
-#define OMAP4_SYS_BOOT1_DUPLICATEWAKEUPEVENT_MASK              (1 << 15)
-#define OMAP4_SYS_BOOT0_DUPLICATEWAKEUPEVENT_SHIFT             14
-#define OMAP4_SYS_BOOT0_DUPLICATEWAKEUPEVENT_MASK              (1 << 14)
-#define OMAP4_SYS_NIRQ2_DUPLICATEWAKEUPEVENT_SHIFT             13
-#define OMAP4_SYS_NIRQ2_DUPLICATEWAKEUPEVENT_MASK              (1 << 13)
-#define OMAP4_SYS_NIRQ1_DUPLICATEWAKEUPEVENT_SHIFT             12
-#define OMAP4_SYS_NIRQ1_DUPLICATEWAKEUPEVENT_MASK              (1 << 12)
-#define OMAP4_FREF_CLK2_OUT_DUPLICATEWAKEUPEVENT_SHIFT         11
-#define OMAP4_FREF_CLK2_OUT_DUPLICATEWAKEUPEVENT_MASK          (1 << 11)
-#define OMAP4_FREF_CLK1_OUT_DUPLICATEWAKEUPEVENT_SHIFT         10
-#define OMAP4_FREF_CLK1_OUT_DUPLICATEWAKEUPEVENT_MASK          (1 << 10)
-#define OMAP4_UNIPRO_RY2_DUPLICATEWAKEUPEVENT_SHIFT            9
-#define OMAP4_UNIPRO_RY2_DUPLICATEWAKEUPEVENT_MASK             (1 << 9)
-#define OMAP4_UNIPRO_RX2_DUPLICATEWAKEUPEVENT_SHIFT            8
-#define OMAP4_UNIPRO_RX2_DUPLICATEWAKEUPEVENT_MASK             (1 << 8)
-#define OMAP4_UNIPRO_RY1_DUPLICATEWAKEUPEVENT_SHIFT            7
-#define OMAP4_UNIPRO_RY1_DUPLICATEWAKEUPEVENT_MASK             (1 << 7)
-#define OMAP4_UNIPRO_RX1_DUPLICATEWAKEUPEVENT_SHIFT            6
-#define OMAP4_UNIPRO_RX1_DUPLICATEWAKEUPEVENT_MASK             (1 << 6)
-#define OMAP4_UNIPRO_RY0_DUPLICATEWAKEUPEVENT_SHIFT            5
-#define OMAP4_UNIPRO_RY0_DUPLICATEWAKEUPEVENT_MASK             (1 << 5)
-#define OMAP4_UNIPRO_RX0_DUPLICATEWAKEUPEVENT_SHIFT            4
-#define OMAP4_UNIPRO_RX0_DUPLICATEWAKEUPEVENT_MASK             (1 << 4)
-#define OMAP4_UNIPRO_TY2_DUPLICATEWAKEUPEVENT_SHIFT            3
-#define OMAP4_UNIPRO_TY2_DUPLICATEWAKEUPEVENT_MASK             (1 << 3)
-#define OMAP4_UNIPRO_TX2_DUPLICATEWAKEUPEVENT_SHIFT            2
-#define OMAP4_UNIPRO_TX2_DUPLICATEWAKEUPEVENT_MASK             (1 << 2)
-#define OMAP4_UNIPRO_TY1_DUPLICATEWAKEUPEVENT_SHIFT            1
-#define OMAP4_UNIPRO_TY1_DUPLICATEWAKEUPEVENT_MASK             (1 << 1)
-#define OMAP4_UNIPRO_TX1_DUPLICATEWAKEUPEVENT_SHIFT            0
-#define OMAP4_UNIPRO_TX1_DUPLICATEWAKEUPEVENT_MASK             (1 << 0)
-
-/* PADCONF_WAKEUPEVENT_6 */
-#define OMAP4_DPM_EMU19_DUPLICATEWAKEUPEVENT_SHIFT             7
-#define OMAP4_DPM_EMU19_DUPLICATEWAKEUPEVENT_MASK              (1 << 7)
-#define OMAP4_DPM_EMU18_DUPLICATEWAKEUPEVENT_SHIFT             6
-#define OMAP4_DPM_EMU18_DUPLICATEWAKEUPEVENT_MASK              (1 << 6)
-#define OMAP4_DPM_EMU17_DUPLICATEWAKEUPEVENT_SHIFT             5
-#define OMAP4_DPM_EMU17_DUPLICATEWAKEUPEVENT_MASK              (1 << 5)
-#define OMAP4_DPM_EMU16_DUPLICATEWAKEUPEVENT_SHIFT             4
-#define OMAP4_DPM_EMU16_DUPLICATEWAKEUPEVENT_MASK              (1 << 4)
-#define OMAP4_DPM_EMU15_DUPLICATEWAKEUPEVENT_SHIFT             3
-#define OMAP4_DPM_EMU15_DUPLICATEWAKEUPEVENT_MASK              (1 << 3)
-#define OMAP4_DPM_EMU14_DUPLICATEWAKEUPEVENT_SHIFT             2
-#define OMAP4_DPM_EMU14_DUPLICATEWAKEUPEVENT_MASK              (1 << 2)
-#define OMAP4_DPM_EMU13_DUPLICATEWAKEUPEVENT_SHIFT             1
-#define OMAP4_DPM_EMU13_DUPLICATEWAKEUPEVENT_MASK              (1 << 1)
-#define OMAP4_DPM_EMU12_DUPLICATEWAKEUPEVENT_SHIFT             0
-#define OMAP4_DPM_EMU12_DUPLICATEWAKEUPEVENT_MASK              (1 << 0)
-
-/* CONTROL_PADCONF_GLOBAL */
-#define OMAP4_FORCE_OFFMODE_EN_SHIFT                           31
-#define OMAP4_FORCE_OFFMODE_EN_MASK                            (1 << 31)
-
-/* CONTROL_PADCONF_MODE */
-#define OMAP4_VDDS_DV_BANK0_SHIFT                              31
-#define OMAP4_VDDS_DV_BANK0_MASK                               (1 << 31)
-#define OMAP4_VDDS_DV_BANK1_SHIFT                              30
-#define OMAP4_VDDS_DV_BANK1_MASK                               (1 << 30)
-#define OMAP4_VDDS_DV_BANK3_SHIFT                              29
-#define OMAP4_VDDS_DV_BANK3_MASK                               (1 << 29)
-#define OMAP4_VDDS_DV_BANK4_SHIFT                              28
-#define OMAP4_VDDS_DV_BANK4_MASK                               (1 << 28)
-#define OMAP4_VDDS_DV_BANK5_SHIFT                              27
-#define OMAP4_VDDS_DV_BANK5_MASK                               (1 << 27)
-#define OMAP4_VDDS_DV_BANK6_SHIFT                              26
-#define OMAP4_VDDS_DV_BANK6_MASK                               (1 << 26)
-#define OMAP4_VDDS_DV_C2C_SHIFT                                        25
-#define OMAP4_VDDS_DV_C2C_MASK                                 (1 << 25)
-#define OMAP4_VDDS_DV_CAM_SHIFT                                        24
-#define OMAP4_VDDS_DV_CAM_MASK                                 (1 << 24)
-#define OMAP4_VDDS_DV_GPMC_SHIFT                               23
-#define OMAP4_VDDS_DV_GPMC_MASK                                        (1 << 23)
-#define OMAP4_VDDS_DV_SDMMC2_SHIFT                             22
-#define OMAP4_VDDS_DV_SDMMC2_MASK                              (1 << 22)
-
-/* CONTROL_SMART1IO_PADCONF_0 */
-#define OMAP4_ABE_DR0_SC_SHIFT                                 30
-#define OMAP4_ABE_DR0_SC_MASK                                  (0x3 << 30)
-#define OMAP4_CAM_DR0_SC_SHIFT                                 28
-#define OMAP4_CAM_DR0_SC_MASK                                  (0x3 << 28)
-#define OMAP4_FREF_DR2_SC_SHIFT                                        26
-#define OMAP4_FREF_DR2_SC_MASK                                 (0x3 << 26)
-#define OMAP4_FREF_DR3_SC_SHIFT                                        24
-#define OMAP4_FREF_DR3_SC_MASK                                 (0x3 << 24)
-#define OMAP4_GPIO_DR8_SC_SHIFT                                        22
-#define OMAP4_GPIO_DR8_SC_MASK                                 (0x3 << 22)
-#define OMAP4_GPIO_DR9_SC_SHIFT                                        20
-#define OMAP4_GPIO_DR9_SC_MASK                                 (0x3 << 20)
-#define OMAP4_GPMC_DR2_SC_SHIFT                                        18
-#define OMAP4_GPMC_DR2_SC_MASK                                 (0x3 << 18)
-#define OMAP4_GPMC_DR3_SC_SHIFT                                        16
-#define OMAP4_GPMC_DR3_SC_MASK                                 (0x3 << 16)
-#define OMAP4_GPMC_DR6_SC_SHIFT                                        14
-#define OMAP4_GPMC_DR6_SC_MASK                                 (0x3 << 14)
-#define OMAP4_HDMI_DR0_SC_SHIFT                                        12
-#define OMAP4_HDMI_DR0_SC_MASK                                 (0x3 << 12)
-#define OMAP4_MCSPI1_DR0_SC_SHIFT                              10
-#define OMAP4_MCSPI1_DR0_SC_MASK                               (0x3 << 10)
-#define OMAP4_UART1_DR0_SC_SHIFT                               8
-#define OMAP4_UART1_DR0_SC_MASK                                        (0x3 << 8)
-#define OMAP4_UART3_DR0_SC_SHIFT                               6
-#define OMAP4_UART3_DR0_SC_MASK                                        (0x3 << 6)
-#define OMAP4_UART3_DR1_SC_SHIFT                               4
-#define OMAP4_UART3_DR1_SC_MASK                                        (0x3 << 4)
-#define OMAP4_UNIPRO_DR0_SC_SHIFT                              2
-#define OMAP4_UNIPRO_DR0_SC_MASK                               (0x3 << 2)
-#define OMAP4_UNIPRO_DR1_SC_SHIFT                              0
-#define OMAP4_UNIPRO_DR1_SC_MASK                               (0x3 << 0)
-
-/* CONTROL_SMART1IO_PADCONF_1 */
-#define OMAP4_ABE_DR0_LB_SHIFT                                 30
-#define OMAP4_ABE_DR0_LB_MASK                                  (0x3 << 30)
-#define OMAP4_CAM_DR0_LB_SHIFT                                 28
-#define OMAP4_CAM_DR0_LB_MASK                                  (0x3 << 28)
-#define OMAP4_FREF_DR2_LB_SHIFT                                        26
-#define OMAP4_FREF_DR2_LB_MASK                                 (0x3 << 26)
-#define OMAP4_FREF_DR3_LB_SHIFT                                        24
-#define OMAP4_FREF_DR3_LB_MASK                                 (0x3 << 24)
-#define OMAP4_GPIO_DR8_LB_SHIFT                                        22
-#define OMAP4_GPIO_DR8_LB_MASK                                 (0x3 << 22)
-#define OMAP4_GPIO_DR9_LB_SHIFT                                        20
-#define OMAP4_GPIO_DR9_LB_MASK                                 (0x3 << 20)
-#define OMAP4_GPMC_DR2_LB_SHIFT                                        18
-#define OMAP4_GPMC_DR2_LB_MASK                                 (0x3 << 18)
-#define OMAP4_GPMC_DR3_LB_SHIFT                                        16
-#define OMAP4_GPMC_DR3_LB_MASK                                 (0x3 << 16)
-#define OMAP4_GPMC_DR6_LB_SHIFT                                        14
-#define OMAP4_GPMC_DR6_LB_MASK                                 (0x3 << 14)
-#define OMAP4_HDMI_DR0_LB_SHIFT                                        12
-#define OMAP4_HDMI_DR0_LB_MASK                                 (0x3 << 12)
-#define OMAP4_MCSPI1_DR0_LB_SHIFT                              10
-#define OMAP4_MCSPI1_DR0_LB_MASK                               (0x3 << 10)
-#define OMAP4_UART1_DR0_LB_SHIFT                               8
-#define OMAP4_UART1_DR0_LB_MASK                                        (0x3 << 8)
-#define OMAP4_UART3_DR0_LB_SHIFT                               6
-#define OMAP4_UART3_DR0_LB_MASK                                        (0x3 << 6)
-#define OMAP4_UART3_DR1_LB_SHIFT                               4
-#define OMAP4_UART3_DR1_LB_MASK                                        (0x3 << 4)
-#define OMAP4_UNIPRO_DR0_LB_SHIFT                              2
-#define OMAP4_UNIPRO_DR0_LB_MASK                               (0x3 << 2)
-#define OMAP4_UNIPRO_DR1_LB_SHIFT                              0
-#define OMAP4_UNIPRO_DR1_LB_MASK                               (0x3 << 0)
-
-/* CONTROL_SMART2IO_PADCONF_0 */
-#define OMAP4_C2C_DR0_LB_SHIFT                                 31
-#define OMAP4_C2C_DR0_LB_MASK                                  (1 << 31)
-#define OMAP4_DPM_DR1_LB_SHIFT                                 30
-#define OMAP4_DPM_DR1_LB_MASK                                  (1 << 30)
-#define OMAP4_DPM_DR2_LB_SHIFT                                 29
-#define OMAP4_DPM_DR2_LB_MASK                                  (1 << 29)
-#define OMAP4_DPM_DR3_LB_SHIFT                                 28
-#define OMAP4_DPM_DR3_LB_MASK                                  (1 << 28)
-#define OMAP4_GPIO_DR0_LB_SHIFT                                        27
-#define OMAP4_GPIO_DR0_LB_MASK                                 (1 << 27)
-#define OMAP4_GPIO_DR1_LB_SHIFT                                        26
-#define OMAP4_GPIO_DR1_LB_MASK                                 (1 << 26)
-#define OMAP4_GPIO_DR10_LB_SHIFT                               25
-#define OMAP4_GPIO_DR10_LB_MASK                                        (1 << 25)
-#define OMAP4_GPIO_DR2_LB_SHIFT                                        24
-#define OMAP4_GPIO_DR2_LB_MASK                                 (1 << 24)
-#define OMAP4_GPMC_DR0_LB_SHIFT                                        23
-#define OMAP4_GPMC_DR0_LB_MASK                                 (1 << 23)
-#define OMAP4_GPMC_DR1_LB_SHIFT                                        22
-#define OMAP4_GPMC_DR1_LB_MASK                                 (1 << 22)
-#define OMAP4_GPMC_DR4_LB_SHIFT                                        21
-#define OMAP4_GPMC_DR4_LB_MASK                                 (1 << 21)
-#define OMAP4_GPMC_DR5_LB_SHIFT                                        20
-#define OMAP4_GPMC_DR5_LB_MASK                                 (1 << 20)
-#define OMAP4_GPMC_DR7_LB_SHIFT                                        19
-#define OMAP4_GPMC_DR7_LB_MASK                                 (1 << 19)
-#define OMAP4_HSI2_DR0_LB_SHIFT                                        18
-#define OMAP4_HSI2_DR0_LB_MASK                                 (1 << 18)
-#define OMAP4_HSI2_DR1_LB_SHIFT                                        17
-#define OMAP4_HSI2_DR1_LB_MASK                                 (1 << 17)
-#define OMAP4_HSI2_DR2_LB_SHIFT                                        16
-#define OMAP4_HSI2_DR2_LB_MASK                                 (1 << 16)
-#define OMAP4_KPD_DR0_LB_SHIFT                                 15
-#define OMAP4_KPD_DR0_LB_MASK                                  (1 << 15)
-#define OMAP4_KPD_DR1_LB_SHIFT                                 14
-#define OMAP4_KPD_DR1_LB_MASK                                  (1 << 14)
-#define OMAP4_PDM_DR0_LB_SHIFT                                 13
-#define OMAP4_PDM_DR0_LB_MASK                                  (1 << 13)
-#define OMAP4_SDMMC2_DR0_LB_SHIFT                              12
-#define OMAP4_SDMMC2_DR0_LB_MASK                               (1 << 12)
-#define OMAP4_SDMMC3_DR0_LB_SHIFT                              11
-#define OMAP4_SDMMC3_DR0_LB_MASK                               (1 << 11)
-#define OMAP4_SDMMC4_DR0_LB_SHIFT                              10
-#define OMAP4_SDMMC4_DR0_LB_MASK                               (1 << 10)
-#define OMAP4_SDMMC4_DR1_LB_SHIFT                              9
-#define OMAP4_SDMMC4_DR1_LB_MASK                               (1 << 9)
-#define OMAP4_SPI3_DR0_LB_SHIFT                                        8
-#define OMAP4_SPI3_DR0_LB_MASK                                 (1 << 8)
-#define OMAP4_SPI3_DR1_LB_SHIFT                                        7
-#define OMAP4_SPI3_DR1_LB_MASK                                 (1 << 7)
-#define OMAP4_UART3_DR2_LB_SHIFT                               6
-#define OMAP4_UART3_DR2_LB_MASK                                        (1 << 6)
-#define OMAP4_UART3_DR3_LB_SHIFT                               5
-#define OMAP4_UART3_DR3_LB_MASK                                        (1 << 5)
-#define OMAP4_UART3_DR4_LB_SHIFT                               4
-#define OMAP4_UART3_DR4_LB_MASK                                        (1 << 4)
-#define OMAP4_UART3_DR5_LB_SHIFT                               3
-#define OMAP4_UART3_DR5_LB_MASK                                        (1 << 3)
-#define OMAP4_USBA0_DR1_LB_SHIFT                               2
-#define OMAP4_USBA0_DR1_LB_MASK                                        (1 << 2)
-#define OMAP4_USBA_DR2_LB_SHIFT                                        1
-#define OMAP4_USBA_DR2_LB_MASK                                 (1 << 1)
-
-/* CONTROL_SMART2IO_PADCONF_1 */
-#define OMAP4_USBB1_DR0_LB_SHIFT                               31
-#define OMAP4_USBB1_DR0_LB_MASK                                        (1 << 31)
-#define OMAP4_USBB2_DR0_LB_SHIFT                               30
-#define OMAP4_USBB2_DR0_LB_MASK                                        (1 << 30)
-#define OMAP4_USBA0_DR0_LB_SHIFT                               29
-#define OMAP4_USBA0_DR0_LB_MASK                                        (1 << 29)
-
-/* CONTROL_SMART3IO_PADCONF_0 */
-#define OMAP4_DMIC_DR0_MB_SHIFT                                        30
-#define OMAP4_DMIC_DR0_MB_MASK                                 (0x3 << 30)
-#define OMAP4_GPIO_DR3_MB_SHIFT                                        28
-#define OMAP4_GPIO_DR3_MB_MASK                                 (0x3 << 28)
-#define OMAP4_GPIO_DR4_MB_SHIFT                                        26
-#define OMAP4_GPIO_DR4_MB_MASK                                 (0x3 << 26)
-#define OMAP4_GPIO_DR5_MB_SHIFT                                        24
-#define OMAP4_GPIO_DR5_MB_MASK                                 (0x3 << 24)
-#define OMAP4_GPIO_DR6_MB_SHIFT                                        22
-#define OMAP4_GPIO_DR6_MB_MASK                                 (0x3 << 22)
-#define OMAP4_HSI_DR1_MB_SHIFT                                 20
-#define OMAP4_HSI_DR1_MB_MASK                                  (0x3 << 20)
-#define OMAP4_HSI_DR2_MB_SHIFT                                 18
-#define OMAP4_HSI_DR2_MB_MASK                                  (0x3 << 18)
-#define OMAP4_HSI_DR3_MB_SHIFT                                 16
-#define OMAP4_HSI_DR3_MB_MASK                                  (0x3 << 16)
-#define OMAP4_MCBSP2_DR0_MB_SHIFT                              14
-#define OMAP4_MCBSP2_DR0_MB_MASK                               (0x3 << 14)
-#define OMAP4_MCSPI4_DR0_MB_SHIFT                              12
-#define OMAP4_MCSPI4_DR0_MB_MASK                               (0x3 << 12)
-#define OMAP4_MCSPI4_DR1_MB_SHIFT                              10
-#define OMAP4_MCSPI4_DR1_MB_MASK                               (0x3 << 10)
-#define OMAP4_SDMMC3_DR0_MB_SHIFT                              8
-#define OMAP4_SDMMC3_DR0_MB_MASK                               (0x3 << 8)
-#define OMAP4_SPI2_DR0_MB_SHIFT                                        0
-#define OMAP4_SPI2_DR0_MB_MASK                                 (0x3 << 0)
-
-/* CONTROL_SMART3IO_PADCONF_1 */
-#define OMAP4_SPI2_DR1_MB_SHIFT                                        30
-#define OMAP4_SPI2_DR1_MB_MASK                                 (0x3 << 30)
-#define OMAP4_SPI2_DR2_MB_SHIFT                                        28
-#define OMAP4_SPI2_DR2_MB_MASK                                 (0x3 << 28)
-#define OMAP4_UART2_DR0_MB_SHIFT                               26
-#define OMAP4_UART2_DR0_MB_MASK                                        (0x3 << 26)
-#define OMAP4_UART2_DR1_MB_SHIFT                               24
-#define OMAP4_UART2_DR1_MB_MASK                                        (0x3 << 24)
-#define OMAP4_UART4_DR0_MB_SHIFT                               22
-#define OMAP4_UART4_DR0_MB_MASK                                        (0x3 << 22)
-#define OMAP4_HSI_DR0_MB_SHIFT                                 20
-#define OMAP4_HSI_DR0_MB_MASK                                  (0x3 << 20)
-
-/* CONTROL_SMART3IO_PADCONF_2 */
-#define OMAP4_DMIC_DR0_LB_SHIFT                                        31
-#define OMAP4_DMIC_DR0_LB_MASK                                 (1 << 31)
-#define OMAP4_GPIO_DR3_LB_SHIFT                                        30
-#define OMAP4_GPIO_DR3_LB_MASK                                 (1 << 30)
-#define OMAP4_GPIO_DR4_LB_SHIFT                                        29
-#define OMAP4_GPIO_DR4_LB_MASK                                 (1 << 29)
-#define OMAP4_GPIO_DR5_LB_SHIFT                                        28
-#define OMAP4_GPIO_DR5_LB_MASK                                 (1 << 28)
-#define OMAP4_GPIO_DR6_LB_SHIFT                                        27
-#define OMAP4_GPIO_DR6_LB_MASK                                 (1 << 27)
-#define OMAP4_HSI_DR1_LB_SHIFT                                 26
-#define OMAP4_HSI_DR1_LB_MASK                                  (1 << 26)
-#define OMAP4_HSI_DR2_LB_SHIFT                                 25
-#define OMAP4_HSI_DR2_LB_MASK                                  (1 << 25)
-#define OMAP4_HSI_DR3_LB_SHIFT                                 24
-#define OMAP4_HSI_DR3_LB_MASK                                  (1 << 24)
-#define OMAP4_MCBSP2_DR0_LB_SHIFT                              23
-#define OMAP4_MCBSP2_DR0_LB_MASK                               (1 << 23)
-#define OMAP4_MCSPI4_DR0_LB_SHIFT                              22
-#define OMAP4_MCSPI4_DR0_LB_MASK                               (1 << 22)
-#define OMAP4_MCSPI4_DR1_LB_SHIFT                              21
-#define OMAP4_MCSPI4_DR1_LB_MASK                               (1 << 21)
-#define OMAP4_SLIMBUS2_DR0_LB_SHIFT                            18
-#define OMAP4_SLIMBUS2_DR0_LB_MASK                             (1 << 18)
-#define OMAP4_SPI2_DR0_LB_SHIFT                                        16
-#define OMAP4_SPI2_DR0_LB_MASK                                 (1 << 16)
-#define OMAP4_SPI2_DR1_LB_SHIFT                                        15
-#define OMAP4_SPI2_DR1_LB_MASK                                 (1 << 15)
-#define OMAP4_SPI2_DR2_LB_SHIFT                                        14
-#define OMAP4_SPI2_DR2_LB_MASK                                 (1 << 14)
-#define OMAP4_UART2_DR0_LB_SHIFT                               13
-#define OMAP4_UART2_DR0_LB_MASK                                        (1 << 13)
-#define OMAP4_UART2_DR1_LB_SHIFT                               12
-#define OMAP4_UART2_DR1_LB_MASK                                        (1 << 12)
-#define OMAP4_UART4_DR0_LB_SHIFT                               11
-#define OMAP4_UART4_DR0_LB_MASK                                        (1 << 11)
-#define OMAP4_HSI_DR0_LB_SHIFT                                 10
-#define OMAP4_HSI_DR0_LB_MASK                                  (1 << 10)
-
-/* CONTROL_USBB_HSIC */
-#define OMAP4_USBB2_DR1_SR_SHIFT                               30
-#define OMAP4_USBB2_DR1_SR_MASK                                        (0x3 << 30)
-#define OMAP4_USBB2_DR1_I_SHIFT                                        27
-#define OMAP4_USBB2_DR1_I_MASK                                 (0x7 << 27)
-#define OMAP4_USBB1_DR1_SR_SHIFT                               25
-#define OMAP4_USBB1_DR1_SR_MASK                                        (0x3 << 25)
-#define OMAP4_USBB1_DR1_I_SHIFT                                        22
-#define OMAP4_USBB1_DR1_I_MASK                                 (0x7 << 22)
-#define OMAP4_USBB1_HSIC_DATA_WD_SHIFT                         20
-#define OMAP4_USBB1_HSIC_DATA_WD_MASK                          (0x3 << 20)
-#define OMAP4_USBB1_HSIC_STROBE_WD_SHIFT                       18
-#define OMAP4_USBB1_HSIC_STROBE_WD_MASK                                (0x3 << 18)
-#define OMAP4_USBB2_HSIC_DATA_WD_SHIFT                         16
-#define OMAP4_USBB2_HSIC_DATA_WD_MASK                          (0x3 << 16)
-#define OMAP4_USBB2_HSIC_STROBE_WD_SHIFT                       14
-#define OMAP4_USBB2_HSIC_STROBE_WD_MASK                                (0x3 << 14)
-#define OMAP4_USBB1_HSIC_DATA_OFFMODE_WD_ENABLE_SHIFT          13
-#define OMAP4_USBB1_HSIC_DATA_OFFMODE_WD_ENABLE_MASK           (1 << 13)
-#define OMAP4_USBB1_HSIC_DATA_OFFMODE_WD_SHIFT                 11
-#define OMAP4_USBB1_HSIC_DATA_OFFMODE_WD_MASK                  (0x3 << 11)
-#define OMAP4_USBB1_HSIC_STROBE_OFFMODE_WD_ENABLE_SHIFT                10
-#define OMAP4_USBB1_HSIC_STROBE_OFFMODE_WD_ENABLE_MASK         (1 << 10)
-#define OMAP4_USBB1_HSIC_STROBE_OFFMODE_WD_SHIFT               8
-#define OMAP4_USBB1_HSIC_STROBE_OFFMODE_WD_MASK                        (0x3 << 8)
-#define OMAP4_USBB2_HSIC_DATA_OFFMODE_WD_ENABLE_SHIFT          7
-#define OMAP4_USBB2_HSIC_DATA_OFFMODE_WD_ENABLE_MASK           (1 << 7)
-#define OMAP4_USBB2_HSIC_DATA_OFFMODE_WD_SHIFT                 5
-#define OMAP4_USBB2_HSIC_DATA_OFFMODE_WD_MASK                  (0x3 << 5)
-#define OMAP4_USBB2_HSIC_STROBE_OFFMODE_WD_ENABLE_SHIFT                4
-#define OMAP4_USBB2_HSIC_STROBE_OFFMODE_WD_ENABLE_MASK         (1 << 4)
-#define OMAP4_USBB2_HSIC_STROBE_OFFMODE_WD_SHIFT               2
-#define OMAP4_USBB2_HSIC_STROBE_OFFMODE_WD_MASK                        (0x3 << 2)
-
-/* CONTROL_SLIMBUS */
-#define OMAP4_SLIMBUS1_DR0_MB_SHIFT                            30
-#define OMAP4_SLIMBUS1_DR0_MB_MASK                             (0x3 << 30)
-#define OMAP4_SLIMBUS1_DR1_MB_SHIFT                            28
-#define OMAP4_SLIMBUS1_DR1_MB_MASK                             (0x3 << 28)
-#define OMAP4_SLIMBUS2_DR0_MB_SHIFT                            26
-#define OMAP4_SLIMBUS2_DR0_MB_MASK                             (0x3 << 26)
-#define OMAP4_SLIMBUS2_DR1_MB_SHIFT                            24
-#define OMAP4_SLIMBUS2_DR1_MB_MASK                             (0x3 << 24)
-#define OMAP4_SLIMBUS2_DR2_MB_SHIFT                            22
-#define OMAP4_SLIMBUS2_DR2_MB_MASK                             (0x3 << 22)
-#define OMAP4_SLIMBUS2_DR3_MB_SHIFT                            20
-#define OMAP4_SLIMBUS2_DR3_MB_MASK                             (0x3 << 20)
-#define OMAP4_SLIMBUS1_DR0_LB_SHIFT                            19
-#define OMAP4_SLIMBUS1_DR0_LB_MASK                             (1 << 19)
-#define OMAP4_SLIMBUS2_DR1_LB_SHIFT                            18
-#define OMAP4_SLIMBUS2_DR1_LB_MASK                             (1 << 18)
-
-/* CONTROL_PBIASLITE */
-#define OMAP4_USIM_PBIASLITE_HIZ_MODE_SHIFT                    31
-#define OMAP4_USIM_PBIASLITE_HIZ_MODE_MASK                     (1 << 31)
-#define OMAP4_USIM_PBIASLITE_SUPPLY_HI_OUT_SHIFT               30
-#define OMAP4_USIM_PBIASLITE_SUPPLY_HI_OUT_MASK                        (1 << 30)
-#define OMAP4_USIM_PBIASLITE_VMODE_ERROR_SHIFT                 29
-#define OMAP4_USIM_PBIASLITE_VMODE_ERROR_MASK                  (1 << 29)
-#define OMAP4_USIM_PBIASLITE_PWRDNZ_SHIFT                      28
-#define OMAP4_USIM_PBIASLITE_PWRDNZ_MASK                       (1 << 28)
-#define OMAP4_USIM_PBIASLITE_VMODE_SHIFT                       27
-#define OMAP4_USIM_PBIASLITE_VMODE_MASK                                (1 << 27)
-#define OMAP4_MMC1_PWRDNZ_SHIFT                                        26
-#define OMAP4_MMC1_PWRDNZ_MASK                                 (1 << 26)
-#define OMAP4_MMC1_PBIASLITE_HIZ_MODE_SHIFT                    25
-#define OMAP4_MMC1_PBIASLITE_HIZ_MODE_MASK                     (1 << 25)
-#define OMAP4_MMC1_PBIASLITE_SUPPLY_HI_OUT_SHIFT               24
-#define OMAP4_MMC1_PBIASLITE_SUPPLY_HI_OUT_MASK                        (1 << 24)
-#define OMAP4_MMC1_PBIASLITE_VMODE_ERROR_SHIFT                 23
-#define OMAP4_MMC1_PBIASLITE_VMODE_ERROR_MASK                  (1 << 23)
-#define OMAP4_MMC1_PBIASLITE_PWRDNZ_SHIFT                      22
-#define OMAP4_MMC1_PBIASLITE_PWRDNZ_MASK                       (1 << 22)
-#define OMAP4_MMC1_PBIASLITE_VMODE_SHIFT                       21
-#define OMAP4_MMC1_PBIASLITE_VMODE_MASK                                (1 << 21)
-#define OMAP4_USBC1_ICUSB_PWRDNZ_SHIFT                         20
-#define OMAP4_USBC1_ICUSB_PWRDNZ_MASK                          (1 << 20)
-
-/* CONTROL_I2C_0 */
-#define OMAP4_I2C4_SDA_GLFENB_SHIFT                            31
-#define OMAP4_I2C4_SDA_GLFENB_MASK                             (1 << 31)
-#define OMAP4_I2C4_SDA_LOAD_BITS_SHIFT                         29
-#define OMAP4_I2C4_SDA_LOAD_BITS_MASK                          (0x3 << 29)
-#define OMAP4_I2C4_SDA_PULLUPRESX_SHIFT                                28
-#define OMAP4_I2C4_SDA_PULLUPRESX_MASK                         (1 << 28)
-#define OMAP4_I2C3_SDA_GLFENB_SHIFT                            27
-#define OMAP4_I2C3_SDA_GLFENB_MASK                             (1 << 27)
-#define OMAP4_I2C3_SDA_LOAD_BITS_SHIFT                         25
-#define OMAP4_I2C3_SDA_LOAD_BITS_MASK                          (0x3 << 25)
-#define OMAP4_I2C3_SDA_PULLUPRESX_SHIFT                                24
-#define OMAP4_I2C3_SDA_PULLUPRESX_MASK                         (1 << 24)
-#define OMAP4_I2C2_SDA_GLFENB_SHIFT                            23
-#define OMAP4_I2C2_SDA_GLFENB_MASK                             (1 << 23)
-#define OMAP4_I2C2_SDA_LOAD_BITS_SHIFT                         21
-#define OMAP4_I2C2_SDA_LOAD_BITS_MASK                          (0x3 << 21)
-#define OMAP4_I2C2_SDA_PULLUPRESX_SHIFT                                20
-#define OMAP4_I2C2_SDA_PULLUPRESX_MASK                         (1 << 20)
-#define OMAP4_I2C1_SDA_GLFENB_SHIFT                            19
-#define OMAP4_I2C1_SDA_GLFENB_MASK                             (1 << 19)
-#define OMAP4_I2C1_SDA_LOAD_BITS_SHIFT                         17
-#define OMAP4_I2C1_SDA_LOAD_BITS_MASK                          (0x3 << 17)
-#define OMAP4_I2C1_SDA_PULLUPRESX_SHIFT                                16
-#define OMAP4_I2C1_SDA_PULLUPRESX_MASK                         (1 << 16)
-#define OMAP4_I2C4_SCL_GLFENB_SHIFT                            15
-#define OMAP4_I2C4_SCL_GLFENB_MASK                             (1 << 15)
-#define OMAP4_I2C4_SCL_LOAD_BITS_SHIFT                         13
-#define OMAP4_I2C4_SCL_LOAD_BITS_MASK                          (0x3 << 13)
-#define OMAP4_I2C4_SCL_PULLUPRESX_SHIFT                                12
-#define OMAP4_I2C4_SCL_PULLUPRESX_MASK                         (1 << 12)
-#define OMAP4_I2C3_SCL_GLFENB_SHIFT                            11
-#define OMAP4_I2C3_SCL_GLFENB_MASK                             (1 << 11)
-#define OMAP4_I2C3_SCL_LOAD_BITS_SHIFT                         9
-#define OMAP4_I2C3_SCL_LOAD_BITS_MASK                          (0x3 << 9)
-#define OMAP4_I2C3_SCL_PULLUPRESX_SHIFT                                8
-#define OMAP4_I2C3_SCL_PULLUPRESX_MASK                         (1 << 8)
-#define OMAP4_I2C2_SCL_GLFENB_SHIFT                            7
-#define OMAP4_I2C2_SCL_GLFENB_MASK                             (1 << 7)
-#define OMAP4_I2C2_SCL_LOAD_BITS_SHIFT                         5
-#define OMAP4_I2C2_SCL_LOAD_BITS_MASK                          (0x3 << 5)
-#define OMAP4_I2C2_SCL_PULLUPRESX_SHIFT                                4
-#define OMAP4_I2C2_SCL_PULLUPRESX_MASK                         (1 << 4)
-#define OMAP4_I2C1_SCL_GLFENB_SHIFT                            3
-#define OMAP4_I2C1_SCL_GLFENB_MASK                             (1 << 3)
-#define OMAP4_I2C1_SCL_LOAD_BITS_SHIFT                         1
-#define OMAP4_I2C1_SCL_LOAD_BITS_MASK                          (0x3 << 1)
-#define OMAP4_I2C1_SCL_PULLUPRESX_SHIFT                                0
-#define OMAP4_I2C1_SCL_PULLUPRESX_MASK                         (1 << 0)
-
-/* CONTROL_CAMERA_RX */
-#define OMAP4_CAMERARX_UNIPRO_CTRLCLKEN_SHIFT                  31
-#define OMAP4_CAMERARX_UNIPRO_CTRLCLKEN_MASK                   (1 << 31)
-#define OMAP4_CAMERARX_CSI22_LANEENABLE_SHIFT                  29
-#define OMAP4_CAMERARX_CSI22_LANEENABLE_MASK                   (0x3 << 29)
-#define OMAP4_CAMERARX_CSI21_LANEENABLE_SHIFT                  24
-#define OMAP4_CAMERARX_CSI21_LANEENABLE_MASK                   (0x1f << 24)
-#define OMAP4_CAMERARX_UNIPRO_CAMMODE_SHIFT                    22
-#define OMAP4_CAMERARX_UNIPRO_CAMMODE_MASK                     (0x3 << 22)
-#define OMAP4_CAMERARX_CSI22_CTRLCLKEN_SHIFT                   21
-#define OMAP4_CAMERARX_CSI22_CTRLCLKEN_MASK                    (1 << 21)
-#define OMAP4_CAMERARX_CSI22_CAMMODE_SHIFT                     19
-#define OMAP4_CAMERARX_CSI22_CAMMODE_MASK                      (0x3 << 19)
-#define OMAP4_CAMERARX_CSI21_CTRLCLKEN_SHIFT                   18
-#define OMAP4_CAMERARX_CSI21_CTRLCLKEN_MASK                    (1 << 18)
-#define OMAP4_CAMERARX_CSI21_CAMMODE_SHIFT                     16
-#define OMAP4_CAMERARX_CSI21_CAMMODE_MASK                      (0x3 << 16)
-
-/* CONTROL_AVDAC */
-#define OMAP4_AVDAC_ACEN_SHIFT                                 31
-#define OMAP4_AVDAC_ACEN_MASK                                  (1 << 31)
-#define OMAP4_AVDAC_TVOUTBYPASS_SHIFT                          30
-#define OMAP4_AVDAC_TVOUTBYPASS_MASK                           (1 << 30)
-#define OMAP4_AVDAC_INPUTINV_SHIFT                             29
-#define OMAP4_AVDAC_INPUTINV_MASK                              (1 << 29)
-#define OMAP4_AVDAC_CTL_SHIFT                                  13
-#define OMAP4_AVDAC_CTL_MASK                                   (0xffff << 13)
-#define OMAP4_AVDAC_CTL_WR_ACK_SHIFT                           12
-#define OMAP4_AVDAC_CTL_WR_ACK_MASK                            (1 << 12)
-
-/* CONTROL_HDMI_TX_PHY */
-#define OMAP4_HDMITXPHY_PADORDER_SHIFT                         31
-#define OMAP4_HDMITXPHY_PADORDER_MASK                          (1 << 31)
-#define OMAP4_HDMITXPHY_TXVALID_SHIFT                          30
-#define OMAP4_HDMITXPHY_TXVALID_MASK                           (1 << 30)
-#define OMAP4_HDMITXPHY_ENBYPASSCLK_SHIFT                      29
-#define OMAP4_HDMITXPHY_ENBYPASSCLK_MASK                       (1 << 29)
-#define OMAP4_HDMITXPHY_PD_PULLUPDET_SHIFT                     28
-#define OMAP4_HDMITXPHY_PD_PULLUPDET_MASK                      (1 << 28)
-
-/* CONTROL_MMC2 */
-#define OMAP4_MMC2_FEEDBACK_CLK_SEL_SHIFT                      31
-#define OMAP4_MMC2_FEEDBACK_CLK_SEL_MASK                       (1 << 31)
-
-/* CONTROL_DSIPHY */
-#define OMAP4_DSI2_LANEENABLE_SHIFT                            29
-#define OMAP4_DSI2_LANEENABLE_MASK                             (0x7 << 29)
-#define OMAP4_DSI1_LANEENABLE_SHIFT                            24
-#define OMAP4_DSI1_LANEENABLE_MASK                             (0x1f << 24)
-#define OMAP4_DSI1_PIPD_SHIFT                                  19
-#define OMAP4_DSI1_PIPD_MASK                                   (0x1f << 19)
-#define OMAP4_DSI2_PIPD_SHIFT                                  14
-#define OMAP4_DSI2_PIPD_MASK                                   (0x1f << 14)
-
-/* CONTROL_MCBSPLP */
-#define OMAP4_ALBCTRLRX_FSX_SHIFT                              31
-#define OMAP4_ALBCTRLRX_FSX_MASK                               (1 << 31)
-#define OMAP4_ALBCTRLRX_CLKX_SHIFT                             30
-#define OMAP4_ALBCTRLRX_CLKX_MASK                              (1 << 30)
-#define OMAP4_ABE_MCBSP1_DR_EN_SHIFT                           29
-#define OMAP4_ABE_MCBSP1_DR_EN_MASK                            (1 << 29)
-
-/* CONTROL_USB2PHYCORE */
-#define OMAP4_USB2PHY_AUTORESUME_EN_SHIFT                      31
-#define OMAP4_USB2PHY_AUTORESUME_EN_MASK                       (1 << 31)
-#define OMAP4_USB2PHY_DISCHGDET_SHIFT                          30
-#define OMAP4_USB2PHY_DISCHGDET_MASK                           (1 << 30)
-#define OMAP4_USB2PHY_GPIOMODE_SHIFT                           29
-#define OMAP4_USB2PHY_GPIOMODE_MASK                            (1 << 29)
-#define OMAP4_USB2PHY_CHG_DET_EXT_CTL_SHIFT                    28
-#define OMAP4_USB2PHY_CHG_DET_EXT_CTL_MASK                     (1 << 28)
-#define OMAP4_USB2PHY_RDM_PD_CHGDET_EN_SHIFT                   27
-#define OMAP4_USB2PHY_RDM_PD_CHGDET_EN_MASK                    (1 << 27)
-#define OMAP4_USB2PHY_RDP_PU_CHGDET_EN_SHIFT                   26
-#define OMAP4_USB2PHY_RDP_PU_CHGDET_EN_MASK                    (1 << 26)
-#define OMAP4_USB2PHY_CHG_VSRC_EN_SHIFT                                25
-#define OMAP4_USB2PHY_CHG_VSRC_EN_MASK                         (1 << 25)
-#define OMAP4_USB2PHY_CHG_ISINK_EN_SHIFT                       24
-#define OMAP4_USB2PHY_CHG_ISINK_EN_MASK                                (1 << 24)
-#define OMAP4_USB2PHY_CHG_DET_STATUS_SHIFT                     21
-#define OMAP4_USB2PHY_CHG_DET_STATUS_MASK                      (0x7 << 21)
-#define OMAP4_USB2PHY_CHG_DET_DM_COMP_SHIFT                    20
-#define OMAP4_USB2PHY_CHG_DET_DM_COMP_MASK                     (1 << 20)
-#define OMAP4_USB2PHY_CHG_DET_DP_COMP_SHIFT                    19
-#define OMAP4_USB2PHY_CHG_DET_DP_COMP_MASK                     (1 << 19)
-#define OMAP4_USB2PHY_DATADET_SHIFT                            18
-#define OMAP4_USB2PHY_DATADET_MASK                             (1 << 18)
-#define OMAP4_USB2PHY_SINKONDP_SHIFT                           17
-#define OMAP4_USB2PHY_SINKONDP_MASK                            (1 << 17)
-#define OMAP4_USB2PHY_SRCONDM_SHIFT                            16
-#define OMAP4_USB2PHY_SRCONDM_MASK                             (1 << 16)
-#define OMAP4_USB2PHY_RESTARTCHGDET_SHIFT                      15
-#define OMAP4_USB2PHY_RESTARTCHGDET_MASK                       (1 << 15)
-#define OMAP4_USB2PHY_CHGDETDONE_SHIFT                         14
-#define OMAP4_USB2PHY_CHGDETDONE_MASK                          (1 << 14)
-#define OMAP4_USB2PHY_CHGDETECTED_SHIFT                                13
-#define OMAP4_USB2PHY_CHGDETECTED_MASK                         (1 << 13)
-#define OMAP4_USB2PHY_MCPCPUEN_SHIFT                           12
-#define OMAP4_USB2PHY_MCPCPUEN_MASK                            (1 << 12)
-#define OMAP4_USB2PHY_MCPCMODEEN_SHIFT                         11
-#define OMAP4_USB2PHY_MCPCMODEEN_MASK                          (1 << 11)
-#define OMAP4_USB2PHY_RESETDONEMCLK_SHIFT                      10
-#define OMAP4_USB2PHY_RESETDONEMCLK_MASK                       (1 << 10)
-#define OMAP4_USB2PHY_UTMIRESETDONE_SHIFT                      9
-#define OMAP4_USB2PHY_UTMIRESETDONE_MASK                       (1 << 9)
-#define OMAP4_USB2PHY_TXBITSTUFFENABLE_SHIFT                   8
-#define OMAP4_USB2PHY_TXBITSTUFFENABLE_MASK                    (1 << 8)
-#define OMAP4_USB2PHY_DATAPOLARITYN_SHIFT                      7
-#define OMAP4_USB2PHY_DATAPOLARITYN_MASK                       (1 << 7)
-#define OMAP4_USBDPLL_FREQLOCK_SHIFT                           6
-#define OMAP4_USBDPLL_FREQLOCK_MASK                            (1 << 6)
-#define OMAP4_USB2PHY_RESETDONETCLK_SHIFT                      5
-#define OMAP4_USB2PHY_RESETDONETCLK_MASK                       (1 << 5)
-
-/* CONTROL_I2C_1 */
-#define OMAP4_HDMI_DDC_SDA_GLFENB_SHIFT                                31
-#define OMAP4_HDMI_DDC_SDA_GLFENB_MASK                         (1 << 31)
-#define OMAP4_HDMI_DDC_SDA_LOAD_BITS_SHIFT                     29
-#define OMAP4_HDMI_DDC_SDA_LOAD_BITS_MASK                      (0x3 << 29)
-#define OMAP4_HDMI_DDC_SDA_PULLUPRESX_SHIFT                    28
-#define OMAP4_HDMI_DDC_SDA_PULLUPRESX_MASK                     (1 << 28)
-#define OMAP4_HDMI_DDC_SCL_GLFENB_SHIFT                                27
-#define OMAP4_HDMI_DDC_SCL_GLFENB_MASK                         (1 << 27)
-#define OMAP4_HDMI_DDC_SCL_LOAD_BITS_SHIFT                     25
-#define OMAP4_HDMI_DDC_SCL_LOAD_BITS_MASK                      (0x3 << 25)
-#define OMAP4_HDMI_DDC_SCL_PULLUPRESX_SHIFT                    24
-#define OMAP4_HDMI_DDC_SCL_PULLUPRESX_MASK                     (1 << 24)
-#define OMAP4_HDMI_DDC_SDA_HSMODE_SHIFT                                23
-#define OMAP4_HDMI_DDC_SDA_HSMODE_MASK                         (1 << 23)
-#define OMAP4_HDMI_DDC_SDA_NMODE_SHIFT                         22
-#define OMAP4_HDMI_DDC_SDA_NMODE_MASK                          (1 << 22)
-#define OMAP4_HDMI_DDC_SCL_HSMODE_SHIFT                                21
-#define OMAP4_HDMI_DDC_SCL_HSMODE_MASK                         (1 << 21)
-#define OMAP4_HDMI_DDC_SCL_NMODE_SHIFT                         20
-#define OMAP4_HDMI_DDC_SCL_NMODE_MASK                          (1 << 20)
-
-/* CONTROL_MMC1 */
-#define OMAP4_SDMMC1_PUSTRENGTH_GRP0_SHIFT                     31
-#define OMAP4_SDMMC1_PUSTRENGTH_GRP0_MASK                      (1 << 31)
-#define OMAP4_SDMMC1_PUSTRENGTH_GRP1_SHIFT                     30
-#define OMAP4_SDMMC1_PUSTRENGTH_GRP1_MASK                      (1 << 30)
-#define OMAP4_SDMMC1_PUSTRENGTH_GRP2_SHIFT                     29
-#define OMAP4_SDMMC1_PUSTRENGTH_GRP2_MASK                      (1 << 29)
-#define OMAP4_SDMMC1_PUSTRENGTH_GRP3_SHIFT                     28
-#define OMAP4_SDMMC1_PUSTRENGTH_GRP3_MASK                      (1 << 28)
-#define OMAP4_SDMMC1_DR0_SPEEDCTRL_SHIFT                       27
-#define OMAP4_SDMMC1_DR0_SPEEDCTRL_MASK                                (1 << 27)
-#define OMAP4_SDMMC1_DR1_SPEEDCTRL_SHIFT                       26
-#define OMAP4_SDMMC1_DR1_SPEEDCTRL_MASK                                (1 << 26)
-#define OMAP4_SDMMC1_DR2_SPEEDCTRL_SHIFT                       25
-#define OMAP4_SDMMC1_DR2_SPEEDCTRL_MASK                                (1 << 25)
-#define OMAP4_USBC1_DR0_SPEEDCTRL_SHIFT                                24
-#define OMAP4_USBC1_DR0_SPEEDCTRL_MASK                         (1 << 24)
-#define OMAP4_USB_FD_CDEN_SHIFT                                        23
-#define OMAP4_USB_FD_CDEN_MASK                                 (1 << 23)
-#define OMAP4_USBC1_ICUSB_DP_PDDIS_SHIFT                       22
-#define OMAP4_USBC1_ICUSB_DP_PDDIS_MASK                                (1 << 22)
-#define OMAP4_USBC1_ICUSB_DM_PDDIS_SHIFT                       21
-#define OMAP4_USBC1_ICUSB_DM_PDDIS_MASK                                (1 << 21)
-
-/* CONTROL_HSI */
-#define OMAP4_HSI1_CALLOOP_SEL_SHIFT                           31
-#define OMAP4_HSI1_CALLOOP_SEL_MASK                            (1 << 31)
-#define OMAP4_HSI1_CALMUX_SEL_SHIFT                            30
-#define OMAP4_HSI1_CALMUX_SEL_MASK                             (1 << 30)
-#define OMAP4_HSI2_CALLOOP_SEL_SHIFT                           29
-#define OMAP4_HSI2_CALLOOP_SEL_MASK                            (1 << 29)
-#define OMAP4_HSI2_CALMUX_SEL_SHIFT                            28
-#define OMAP4_HSI2_CALMUX_SEL_MASK                             (1 << 28)
-
-/* CONTROL_USB */
-#define OMAP4_CARKIT_USBA0_ULPIPHY_DAT0_AUTO_EN_SHIFT          31
-#define OMAP4_CARKIT_USBA0_ULPIPHY_DAT0_AUTO_EN_MASK           (1 << 31)
-#define OMAP4_CARKIT_USBA0_ULPIPHY_DAT1_AUTO_EN_SHIFT          30
-#define OMAP4_CARKIT_USBA0_ULPIPHY_DAT1_AUTO_EN_MASK           (1 << 30)
-
-/* CONTROL_HDQ */
-#define OMAP4_HDQ_SIO_PWRDNZ_SHIFT                             31
-#define OMAP4_HDQ_SIO_PWRDNZ_MASK                              (1 << 31)
-
-/* CONTROL_LPDDR2IO1_0 */
-#define OMAP4_LPDDR2IO1_GR4_SR_SHIFT                           30
-#define OMAP4_LPDDR2IO1_GR4_SR_MASK                            (0x3 << 30)
-#define OMAP4_LPDDR2IO1_GR4_I_SHIFT                            27
-#define OMAP4_LPDDR2IO1_GR4_I_MASK                             (0x7 << 27)
-#define OMAP4_LPDDR2IO1_GR4_WD_SHIFT                           25
-#define OMAP4_LPDDR2IO1_GR4_WD_MASK                            (0x3 << 25)
-#define OMAP4_LPDDR2IO1_GR3_SR_SHIFT                           22
-#define OMAP4_LPDDR2IO1_GR3_SR_MASK                            (0x3 << 22)
-#define OMAP4_LPDDR2IO1_GR3_I_SHIFT                            19
-#define OMAP4_LPDDR2IO1_GR3_I_MASK                             (0x7 << 19)
-#define OMAP4_LPDDR2IO1_GR3_WD_SHIFT                           17
-#define OMAP4_LPDDR2IO1_GR3_WD_MASK                            (0x3 << 17)
-#define OMAP4_LPDDR2IO1_GR2_SR_SHIFT                           14
-#define OMAP4_LPDDR2IO1_GR2_SR_MASK                            (0x3 << 14)
-#define OMAP4_LPDDR2IO1_GR2_I_SHIFT                            11
-#define OMAP4_LPDDR2IO1_GR2_I_MASK                             (0x7 << 11)
-#define OMAP4_LPDDR2IO1_GR2_WD_SHIFT                           9
-#define OMAP4_LPDDR2IO1_GR2_WD_MASK                            (0x3 << 9)
-#define OMAP4_LPDDR2IO1_GR1_SR_SHIFT                           6
-#define OMAP4_LPDDR2IO1_GR1_SR_MASK                            (0x3 << 6)
-#define OMAP4_LPDDR2IO1_GR1_I_SHIFT                            3
-#define OMAP4_LPDDR2IO1_GR1_I_MASK                             (0x7 << 3)
-#define OMAP4_LPDDR2IO1_GR1_WD_SHIFT                           1
-#define OMAP4_LPDDR2IO1_GR1_WD_MASK                            (0x3 << 1)
-
-/* CONTROL_LPDDR2IO1_1 */
-#define OMAP4_LPDDR2IO1_GR8_SR_SHIFT                           30
-#define OMAP4_LPDDR2IO1_GR8_SR_MASK                            (0x3 << 30)
-#define OMAP4_LPDDR2IO1_GR8_I_SHIFT                            27
-#define OMAP4_LPDDR2IO1_GR8_I_MASK                             (0x7 << 27)
-#define OMAP4_LPDDR2IO1_GR8_WD_SHIFT                           25
-#define OMAP4_LPDDR2IO1_GR8_WD_MASK                            (0x3 << 25)
-#define OMAP4_LPDDR2IO1_GR7_SR_SHIFT                           22
-#define OMAP4_LPDDR2IO1_GR7_SR_MASK                            (0x3 << 22)
-#define OMAP4_LPDDR2IO1_GR7_I_SHIFT                            19
-#define OMAP4_LPDDR2IO1_GR7_I_MASK                             (0x7 << 19)
-#define OMAP4_LPDDR2IO1_GR7_WD_SHIFT                           17
-#define OMAP4_LPDDR2IO1_GR7_WD_MASK                            (0x3 << 17)
-#define OMAP4_LPDDR2IO1_GR6_SR_SHIFT                           14
-#define OMAP4_LPDDR2IO1_GR6_SR_MASK                            (0x3 << 14)
-#define OMAP4_LPDDR2IO1_GR6_I_SHIFT                            11
-#define OMAP4_LPDDR2IO1_GR6_I_MASK                             (0x7 << 11)
-#define OMAP4_LPDDR2IO1_GR6_WD_SHIFT                           9
-#define OMAP4_LPDDR2IO1_GR6_WD_MASK                            (0x3 << 9)
-#define OMAP4_LPDDR2IO1_GR5_SR_SHIFT                           6
-#define OMAP4_LPDDR2IO1_GR5_SR_MASK                            (0x3 << 6)
-#define OMAP4_LPDDR2IO1_GR5_I_SHIFT                            3
-#define OMAP4_LPDDR2IO1_GR5_I_MASK                             (0x7 << 3)
-#define OMAP4_LPDDR2IO1_GR5_WD_SHIFT                           1
-#define OMAP4_LPDDR2IO1_GR5_WD_MASK                            (0x3 << 1)
-
-/* CONTROL_LPDDR2IO1_2 */
-#define OMAP4_LPDDR2IO1_GR11_SR_SHIFT                          30
-#define OMAP4_LPDDR2IO1_GR11_SR_MASK                           (0x3 << 30)
-#define OMAP4_LPDDR2IO1_GR11_I_SHIFT                           27
-#define OMAP4_LPDDR2IO1_GR11_I_MASK                            (0x7 << 27)
-#define OMAP4_LPDDR2IO1_GR11_WD_SHIFT                          25
-#define OMAP4_LPDDR2IO1_GR11_WD_MASK                           (0x3 << 25)
-#define OMAP4_LPDDR2IO1_GR10_SR_SHIFT                          22
-#define OMAP4_LPDDR2IO1_GR10_SR_MASK                           (0x3 << 22)
-#define OMAP4_LPDDR2IO1_GR10_I_SHIFT                           19
-#define OMAP4_LPDDR2IO1_GR10_I_MASK                            (0x7 << 19)
-#define OMAP4_LPDDR2IO1_GR10_WD_SHIFT                          17
-#define OMAP4_LPDDR2IO1_GR10_WD_MASK                           (0x3 << 17)
-#define OMAP4_LPDDR2IO1_GR9_SR_SHIFT                           14
-#define OMAP4_LPDDR2IO1_GR9_SR_MASK                            (0x3 << 14)
-#define OMAP4_LPDDR2IO1_GR9_I_SHIFT                            11
-#define OMAP4_LPDDR2IO1_GR9_I_MASK                             (0x7 << 11)
-#define OMAP4_LPDDR2IO1_GR9_WD_SHIFT                           9
-#define OMAP4_LPDDR2IO1_GR9_WD_MASK                            (0x3 << 9)
-
-/* CONTROL_LPDDR2IO1_3 */
-#define OMAP4_LPDDR21_VREF_CA_CCAP0_SHIFT                      31
-#define OMAP4_LPDDR21_VREF_CA_CCAP0_MASK                       (1 << 31)
-#define OMAP4_LPDDR21_VREF_CA_CCAP1_SHIFT                      30
-#define OMAP4_LPDDR21_VREF_CA_CCAP1_MASK                       (1 << 30)
-#define OMAP4_LPDDR21_VREF_CA_INT_CCAP0_SHIFT                  29
-#define OMAP4_LPDDR21_VREF_CA_INT_CCAP0_MASK                   (1 << 29)
-#define OMAP4_LPDDR21_VREF_CA_INT_CCAP1_SHIFT                  28
-#define OMAP4_LPDDR21_VREF_CA_INT_CCAP1_MASK                   (1 << 28)
-#define OMAP4_LPDDR21_VREF_CA_INT_TAP0_SHIFT                   27
-#define OMAP4_LPDDR21_VREF_CA_INT_TAP0_MASK                    (1 << 27)
-#define OMAP4_LPDDR21_VREF_CA_INT_TAP1_SHIFT                   26
-#define OMAP4_LPDDR21_VREF_CA_INT_TAP1_MASK                    (1 << 26)
-#define OMAP4_LPDDR21_VREF_CA_TAP0_SHIFT                       25
-#define OMAP4_LPDDR21_VREF_CA_TAP0_MASK                                (1 << 25)
-#define OMAP4_LPDDR21_VREF_CA_TAP1_SHIFT                       24
-#define OMAP4_LPDDR21_VREF_CA_TAP1_MASK                                (1 << 24)
-#define OMAP4_LPDDR21_VREF_DQ0_INT_CCAP0_SHIFT                 23
-#define OMAP4_LPDDR21_VREF_DQ0_INT_CCAP0_MASK                  (1 << 23)
-#define OMAP4_LPDDR21_VREF_DQ0_INT_CCAP1_SHIFT                 22
-#define OMAP4_LPDDR21_VREF_DQ0_INT_CCAP1_MASK                  (1 << 22)
-#define OMAP4_LPDDR21_VREF_DQ0_INT_TAP0_SHIFT                  21
-#define OMAP4_LPDDR21_VREF_DQ0_INT_TAP0_MASK                   (1 << 21)
-#define OMAP4_LPDDR21_VREF_DQ0_INT_TAP1_SHIFT                  20
-#define OMAP4_LPDDR21_VREF_DQ0_INT_TAP1_MASK                   (1 << 20)
-#define OMAP4_LPDDR21_VREF_DQ1_INT_CCAP0_SHIFT                 19
-#define OMAP4_LPDDR21_VREF_DQ1_INT_CCAP0_MASK                  (1 << 19)
-#define OMAP4_LPDDR21_VREF_DQ1_INT_CCAP1_SHIFT                 18
-#define OMAP4_LPDDR21_VREF_DQ1_INT_CCAP1_MASK                  (1 << 18)
-#define OMAP4_LPDDR21_VREF_DQ1_INT_TAP0_SHIFT                  17
-#define OMAP4_LPDDR21_VREF_DQ1_INT_TAP0_MASK                   (1 << 17)
-#define OMAP4_LPDDR21_VREF_DQ1_INT_TAP1_SHIFT                  16
-#define OMAP4_LPDDR21_VREF_DQ1_INT_TAP1_MASK                   (1 << 16)
-#define OMAP4_LPDDR21_VREF_DQ_CCAP0_SHIFT                      15
-#define OMAP4_LPDDR21_VREF_DQ_CCAP0_MASK                       (1 << 15)
-#define OMAP4_LPDDR21_VREF_DQ_CCAP1_SHIFT                      14
-#define OMAP4_LPDDR21_VREF_DQ_CCAP1_MASK                       (1 << 14)
-#define OMAP4_LPDDR21_VREF_DQ_TAP0_SHIFT                       13
-#define OMAP4_LPDDR21_VREF_DQ_TAP0_MASK                                (1 << 13)
-#define OMAP4_LPDDR21_VREF_DQ_TAP1_SHIFT                       12
-#define OMAP4_LPDDR21_VREF_DQ_TAP1_MASK                                (1 << 12)
-
-/* CONTROL_LPDDR2IO2_0 */
-#define OMAP4_LPDDR2IO2_GR4_SR_SHIFT                           30
-#define OMAP4_LPDDR2IO2_GR4_SR_MASK                            (0x3 << 30)
-#define OMAP4_LPDDR2IO2_GR4_I_SHIFT                            27
-#define OMAP4_LPDDR2IO2_GR4_I_MASK                             (0x7 << 27)
-#define OMAP4_LPDDR2IO2_GR4_WD_SHIFT                           25
-#define OMAP4_LPDDR2IO2_GR4_WD_MASK                            (0x3 << 25)
-#define OMAP4_LPDDR2IO2_GR3_SR_SHIFT                           22
-#define OMAP4_LPDDR2IO2_GR3_SR_MASK                            (0x3 << 22)
-#define OMAP4_LPDDR2IO2_GR3_I_SHIFT                            19
-#define OMAP4_LPDDR2IO2_GR3_I_MASK                             (0x7 << 19)
-#define OMAP4_LPDDR2IO2_GR3_WD_SHIFT                           17
-#define OMAP4_LPDDR2IO2_GR3_WD_MASK                            (0x3 << 17)
-#define OMAP4_LPDDR2IO2_GR2_SR_SHIFT                           14
-#define OMAP4_LPDDR2IO2_GR2_SR_MASK                            (0x3 << 14)
-#define OMAP4_LPDDR2IO2_GR2_I_SHIFT                            11
-#define OMAP4_LPDDR2IO2_GR2_I_MASK                             (0x7 << 11)
-#define OMAP4_LPDDR2IO2_GR2_WD_SHIFT                           9
-#define OMAP4_LPDDR2IO2_GR2_WD_MASK                            (0x3 << 9)
-#define OMAP4_LPDDR2IO2_GR1_SR_SHIFT                           6
-#define OMAP4_LPDDR2IO2_GR1_SR_MASK                            (0x3 << 6)
-#define OMAP4_LPDDR2IO2_GR1_I_SHIFT                            3
-#define OMAP4_LPDDR2IO2_GR1_I_MASK                             (0x7 << 3)
-#define OMAP4_LPDDR2IO2_GR1_WD_SHIFT                           1
-#define OMAP4_LPDDR2IO2_GR1_WD_MASK                            (0x3 << 1)
-
-/* CONTROL_LPDDR2IO2_1 */
-#define OMAP4_LPDDR2IO2_GR8_SR_SHIFT                           30
-#define OMAP4_LPDDR2IO2_GR8_SR_MASK                            (0x3 << 30)
-#define OMAP4_LPDDR2IO2_GR8_I_SHIFT                            27
-#define OMAP4_LPDDR2IO2_GR8_I_MASK                             (0x7 << 27)
-#define OMAP4_LPDDR2IO2_GR8_WD_SHIFT                           25
-#define OMAP4_LPDDR2IO2_GR8_WD_MASK                            (0x3 << 25)
-#define OMAP4_LPDDR2IO2_GR7_SR_SHIFT                           22
-#define OMAP4_LPDDR2IO2_GR7_SR_MASK                            (0x3 << 22)
-#define OMAP4_LPDDR2IO2_GR7_I_SHIFT                            19
-#define OMAP4_LPDDR2IO2_GR7_I_MASK                             (0x7 << 19)
-#define OMAP4_LPDDR2IO2_GR7_WD_SHIFT                           17
-#define OMAP4_LPDDR2IO2_GR7_WD_MASK                            (0x3 << 17)
-#define OMAP4_LPDDR2IO2_GR6_SR_SHIFT                           14
-#define OMAP4_LPDDR2IO2_GR6_SR_MASK                            (0x3 << 14)
-#define OMAP4_LPDDR2IO2_GR6_I_SHIFT                            11
-#define OMAP4_LPDDR2IO2_GR6_I_MASK                             (0x7 << 11)
-#define OMAP4_LPDDR2IO2_GR6_WD_SHIFT                           9
-#define OMAP4_LPDDR2IO2_GR6_WD_MASK                            (0x3 << 9)
-#define OMAP4_LPDDR2IO2_GR5_SR_SHIFT                           6
-#define OMAP4_LPDDR2IO2_GR5_SR_MASK                            (0x3 << 6)
-#define OMAP4_LPDDR2IO2_GR5_I_SHIFT                            3
-#define OMAP4_LPDDR2IO2_GR5_I_MASK                             (0x7 << 3)
-#define OMAP4_LPDDR2IO2_GR5_WD_SHIFT                           1
-#define OMAP4_LPDDR2IO2_GR5_WD_MASK                            (0x3 << 1)
-
-/* CONTROL_LPDDR2IO2_2 */
-#define OMAP4_LPDDR2IO2_GR11_SR_SHIFT                          30
-#define OMAP4_LPDDR2IO2_GR11_SR_MASK                           (0x3 << 30)
-#define OMAP4_LPDDR2IO2_GR11_I_SHIFT                           27
-#define OMAP4_LPDDR2IO2_GR11_I_MASK                            (0x7 << 27)
-#define OMAP4_LPDDR2IO2_GR11_WD_SHIFT                          25
-#define OMAP4_LPDDR2IO2_GR11_WD_MASK                           (0x3 << 25)
-#define OMAP4_LPDDR2IO2_GR10_SR_SHIFT                          22
-#define OMAP4_LPDDR2IO2_GR10_SR_MASK                           (0x3 << 22)
-#define OMAP4_LPDDR2IO2_GR10_I_SHIFT                           19
-#define OMAP4_LPDDR2IO2_GR10_I_MASK                            (0x7 << 19)
-#define OMAP4_LPDDR2IO2_GR10_WD_SHIFT                          17
-#define OMAP4_LPDDR2IO2_GR10_WD_MASK                           (0x3 << 17)
-#define OMAP4_LPDDR2IO2_GR9_SR_SHIFT                           14
-#define OMAP4_LPDDR2IO2_GR9_SR_MASK                            (0x3 << 14)
-#define OMAP4_LPDDR2IO2_GR9_I_SHIFT                            11
-#define OMAP4_LPDDR2IO2_GR9_I_MASK                             (0x7 << 11)
-#define OMAP4_LPDDR2IO2_GR9_WD_SHIFT                           9
-#define OMAP4_LPDDR2IO2_GR9_WD_MASK                            (0x3 << 9)
-
-/* CONTROL_LPDDR2IO2_3 */
-#define OMAP4_LPDDR22_VREF_CA_CCAP0_SHIFT                      31
-#define OMAP4_LPDDR22_VREF_CA_CCAP0_MASK                       (1 << 31)
-#define OMAP4_LPDDR22_VREF_CA_CCAP1_SHIFT                      30
-#define OMAP4_LPDDR22_VREF_CA_CCAP1_MASK                       (1 << 30)
-#define OMAP4_LPDDR22_VREF_CA_INT_CCAP0_SHIFT                  29
-#define OMAP4_LPDDR22_VREF_CA_INT_CCAP0_MASK                   (1 << 29)
-#define OMAP4_LPDDR22_VREF_CA_INT_CCAP1_SHIFT                  28
-#define OMAP4_LPDDR22_VREF_CA_INT_CCAP1_MASK                   (1 << 28)
-#define OMAP4_LPDDR22_VREF_CA_INT_TAP0_SHIFT                   27
-#define OMAP4_LPDDR22_VREF_CA_INT_TAP0_MASK                    (1 << 27)
-#define OMAP4_LPDDR22_VREF_CA_INT_TAP1_SHIFT                   26
-#define OMAP4_LPDDR22_VREF_CA_INT_TAP1_MASK                    (1 << 26)
-#define OMAP4_LPDDR22_VREF_CA_TAP0_SHIFT                       25
-#define OMAP4_LPDDR22_VREF_CA_TAP0_MASK                                (1 << 25)
-#define OMAP4_LPDDR22_VREF_CA_TAP1_SHIFT                       24
-#define OMAP4_LPDDR22_VREF_CA_TAP1_MASK                                (1 << 24)
-#define OMAP4_LPDDR22_VREF_DQ0_INT_CCAP0_SHIFT                 23
-#define OMAP4_LPDDR22_VREF_DQ0_INT_CCAP0_MASK                  (1 << 23)
-#define OMAP4_LPDDR22_VREF_DQ0_INT_CCAP1_SHIFT                 22
-#define OMAP4_LPDDR22_VREF_DQ0_INT_CCAP1_MASK                  (1 << 22)
-#define OMAP4_LPDDR22_VREF_DQ0_INT_TAP0_SHIFT                  21
-#define OMAP4_LPDDR22_VREF_DQ0_INT_TAP0_MASK                   (1 << 21)
-#define OMAP4_LPDDR22_VREF_DQ0_INT_TAP1_SHIFT                  20
-#define OMAP4_LPDDR22_VREF_DQ0_INT_TAP1_MASK                   (1 << 20)
-#define OMAP4_LPDDR22_VREF_DQ1_INT_CCAP0_SHIFT                 19
-#define OMAP4_LPDDR22_VREF_DQ1_INT_CCAP0_MASK                  (1 << 19)
-#define OMAP4_LPDDR22_VREF_DQ1_INT_CCAP1_SHIFT                 18
-#define OMAP4_LPDDR22_VREF_DQ1_INT_CCAP1_MASK                  (1 << 18)
-#define OMAP4_LPDDR22_VREF_DQ1_INT_TAP0_SHIFT                  17
-#define OMAP4_LPDDR22_VREF_DQ1_INT_TAP0_MASK                   (1 << 17)
-#define OMAP4_LPDDR22_VREF_DQ1_INT_TAP1_SHIFT                  16
-#define OMAP4_LPDDR22_VREF_DQ1_INT_TAP1_MASK                   (1 << 16)
-#define OMAP4_LPDDR22_VREF_DQ_CCAP0_SHIFT                      15
-#define OMAP4_LPDDR22_VREF_DQ_CCAP0_MASK                       (1 << 15)
-#define OMAP4_LPDDR22_VREF_DQ_CCAP1_SHIFT                      14
-#define OMAP4_LPDDR22_VREF_DQ_CCAP1_MASK                       (1 << 14)
-#define OMAP4_LPDDR22_VREF_DQ_TAP0_SHIFT                       13
-#define OMAP4_LPDDR22_VREF_DQ_TAP0_MASK                                (1 << 13)
-#define OMAP4_LPDDR22_VREF_DQ_TAP1_SHIFT                       12
-#define OMAP4_LPDDR22_VREF_DQ_TAP1_MASK                                (1 << 12)
-
-/* CONTROL_BUS_HOLD */
-#define OMAP4_ABE_DMIC_DIN3_EN_SHIFT                           31
-#define OMAP4_ABE_DMIC_DIN3_EN_MASK                            (1 << 31)
-#define OMAP4_MCSPI1_CS3_EN_SHIFT                              30
-#define OMAP4_MCSPI1_CS3_EN_MASK                               (1 << 30)
-
-/* CONTROL_C2C */
-#define OMAP4_MIRROR_MODE_EN_SHIFT                             31
-#define OMAP4_MIRROR_MODE_EN_MASK                              (1 << 31)
-#define OMAP4_C2C_SPARE_SHIFT                                  24
-#define OMAP4_C2C_SPARE_MASK                                   (0x7f << 24)
-
-/* CORE_CONTROL_SPARE_RW */
-#define OMAP4_CORE_CONTROL_SPARE_RW_SHIFT                      0
-#define OMAP4_CORE_CONTROL_SPARE_RW_MASK                       (0xffffffff << 0)
-
-/* CORE_CONTROL_SPARE_R */
-#define OMAP4_CORE_CONTROL_SPARE_R_SHIFT                       0
-#define OMAP4_CORE_CONTROL_SPARE_R_MASK                                (0xffffffff << 0)
-
-/* CORE_CONTROL_SPARE_R_C0 */
-#define OMAP4_CORE_CONTROL_SPARE_R_C0_SHIFT                    31
-#define OMAP4_CORE_CONTROL_SPARE_R_C0_MASK                     (1 << 31)
-#define OMAP4_CORE_CONTROL_SPARE_R_C1_SHIFT                    30
-#define OMAP4_CORE_CONTROL_SPARE_R_C1_MASK                     (1 << 30)
-#define OMAP4_CORE_CONTROL_SPARE_R_C2_SHIFT                    29
-#define OMAP4_CORE_CONTROL_SPARE_R_C2_MASK                     (1 << 29)
-#define OMAP4_CORE_CONTROL_SPARE_R_C3_SHIFT                    28
-#define OMAP4_CORE_CONTROL_SPARE_R_C3_MASK                     (1 << 28)
-#define OMAP4_CORE_CONTROL_SPARE_R_C4_SHIFT                    27
-#define OMAP4_CORE_CONTROL_SPARE_R_C4_MASK                     (1 << 27)
-#define OMAP4_CORE_CONTROL_SPARE_R_C5_SHIFT                    26
-#define OMAP4_CORE_CONTROL_SPARE_R_C5_MASK                     (1 << 26)
-#define OMAP4_CORE_CONTROL_SPARE_R_C6_SHIFT                    25
-#define OMAP4_CORE_CONTROL_SPARE_R_C6_MASK                     (1 << 25)
-#define OMAP4_CORE_CONTROL_SPARE_R_C7_SHIFT                    24
-#define OMAP4_CORE_CONTROL_SPARE_R_C7_MASK                     (1 << 24)
-
-/* CONTROL_EFUSE_1 */
-#define OMAP4_AVDAC_TRIM_BYTE3_SHIFT                           24
-#define OMAP4_AVDAC_TRIM_BYTE3_MASK                            (0x7f << 24)
-#define OMAP4_AVDAC_TRIM_BYTE2_SHIFT                           16
-#define OMAP4_AVDAC_TRIM_BYTE2_MASK                            (0xff << 16)
-#define OMAP4_AVDAC_TRIM_BYTE1_SHIFT                           8
-#define OMAP4_AVDAC_TRIM_BYTE1_MASK                            (0xff << 8)
-#define OMAP4_AVDAC_TRIM_BYTE0_SHIFT                           0
-#define OMAP4_AVDAC_TRIM_BYTE0_MASK                            (0xff << 0)
-
-/* CONTROL_EFUSE_2 */
-#define OMAP4_EFUSE_SMART2TEST_P0_SHIFT                                31
-#define OMAP4_EFUSE_SMART2TEST_P0_MASK                         (1 << 31)
-#define OMAP4_EFUSE_SMART2TEST_P1_SHIFT                                30
-#define OMAP4_EFUSE_SMART2TEST_P1_MASK                         (1 << 30)
-#define OMAP4_EFUSE_SMART2TEST_P2_SHIFT                                29
-#define OMAP4_EFUSE_SMART2TEST_P2_MASK                         (1 << 29)
-#define OMAP4_EFUSE_SMART2TEST_P3_SHIFT                                28
-#define OMAP4_EFUSE_SMART2TEST_P3_MASK                         (1 << 28)
-#define OMAP4_EFUSE_SMART2TEST_N0_SHIFT                                27
-#define OMAP4_EFUSE_SMART2TEST_N0_MASK                         (1 << 27)
-#define OMAP4_EFUSE_SMART2TEST_N1_SHIFT                                26
-#define OMAP4_EFUSE_SMART2TEST_N1_MASK                         (1 << 26)
-#define OMAP4_EFUSE_SMART2TEST_N2_SHIFT                                25
-#define OMAP4_EFUSE_SMART2TEST_N2_MASK                         (1 << 25)
-#define OMAP4_EFUSE_SMART2TEST_N3_SHIFT                                24
-#define OMAP4_EFUSE_SMART2TEST_N3_MASK                         (1 << 24)
-#define OMAP4_LPDDR2_PTV_N1_SHIFT                              23
-#define OMAP4_LPDDR2_PTV_N1_MASK                               (1 << 23)
-#define OMAP4_LPDDR2_PTV_N2_SHIFT                              22
-#define OMAP4_LPDDR2_PTV_N2_MASK                               (1 << 22)
-#define OMAP4_LPDDR2_PTV_N3_SHIFT                              21
-#define OMAP4_LPDDR2_PTV_N3_MASK                               (1 << 21)
-#define OMAP4_LPDDR2_PTV_N4_SHIFT                              20
-#define OMAP4_LPDDR2_PTV_N4_MASK                               (1 << 20)
-#define OMAP4_LPDDR2_PTV_N5_SHIFT                              19
-#define OMAP4_LPDDR2_PTV_N5_MASK                               (1 << 19)
-#define OMAP4_LPDDR2_PTV_P1_SHIFT                              18
-#define OMAP4_LPDDR2_PTV_P1_MASK                               (1 << 18)
-#define OMAP4_LPDDR2_PTV_P2_SHIFT                              17
-#define OMAP4_LPDDR2_PTV_P2_MASK                               (1 << 17)
-#define OMAP4_LPDDR2_PTV_P3_SHIFT                              16
-#define OMAP4_LPDDR2_PTV_P3_MASK                               (1 << 16)
-#define OMAP4_LPDDR2_PTV_P4_SHIFT                              15
-#define OMAP4_LPDDR2_PTV_P4_MASK                               (1 << 15)
-#define OMAP4_LPDDR2_PTV_P5_SHIFT                              14
-#define OMAP4_LPDDR2_PTV_P5_MASK                               (1 << 14)
-
-/* CONTROL_EFUSE_3 */
-#define OMAP4_STD_FUSE_SPARE_1_SHIFT                           24
-#define OMAP4_STD_FUSE_SPARE_1_MASK                            (0xff << 24)
-#define OMAP4_STD_FUSE_SPARE_2_SHIFT                           16
-#define OMAP4_STD_FUSE_SPARE_2_MASK                            (0xff << 16)
-#define OMAP4_STD_FUSE_SPARE_3_SHIFT                           8
-#define OMAP4_STD_FUSE_SPARE_3_MASK                            (0xff << 8)
-#define OMAP4_STD_FUSE_SPARE_4_SHIFT                           0
-#define OMAP4_STD_FUSE_SPARE_4_MASK                            (0xff << 0)
-
-/* CONTROL_EFUSE_4 */
-#define OMAP4_STD_FUSE_SPARE_5_SHIFT                           24
-#define OMAP4_STD_FUSE_SPARE_5_MASK                            (0xff << 24)
-#define OMAP4_STD_FUSE_SPARE_6_SHIFT                           16
-#define OMAP4_STD_FUSE_SPARE_6_MASK                            (0xff << 16)
-#define OMAP4_STD_FUSE_SPARE_7_SHIFT                           8
-#define OMAP4_STD_FUSE_SPARE_7_MASK                            (0xff << 8)
-#define OMAP4_STD_FUSE_SPARE_8_SHIFT                           0
-#define OMAP4_STD_FUSE_SPARE_8_MASK                            (0xff << 0)
-
-#endif
diff --git a/arch/arm/mach-omap2/ctrl_module_pad_wkup_44xx.h b/arch/arm/mach-omap2/ctrl_module_pad_wkup_44xx.h
deleted file mode 100644 (file)
index 17c9b37..0000000
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- * OMAP44xx CTRL_MODULE_PAD_WKUP registers and bitfields
- *
- * Copyright (C) 2009-2010 Texas Instruments, Inc.
- *
- * Benoit Cousson (b-cousson@ti.com)
- * Santosh Shilimkar (santosh.shilimkar@ti.com)
- *
- * This file is automatically generated from the OMAP hardware databases.
- * We respectfully ask that any modifications to this file be coordinated
- * with the public linux-omap@vger.kernel.org mailing list and the
- * authors above to ensure that the autogeneration scripts are kept
- * up-to-date with the file contents.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#ifndef __ARCH_ARM_MACH_OMAP2_CTRL_MODULE_PAD_WKUP_44XX_H
-#define __ARCH_ARM_MACH_OMAP2_CTRL_MODULE_PAD_WKUP_44XX_H
-
-
-/* Base address */
-#define OMAP4_CTRL_MODULE_PAD_WKUP                                     0x4a31e000
-
-/* Registers offset */
-#define OMAP4_CTRL_MODULE_PAD_WKUP_IP_REVISION                         0x0000
-#define OMAP4_CTRL_MODULE_PAD_WKUP_IP_HWINFO                           0x0004
-#define OMAP4_CTRL_MODULE_PAD_WKUP_IP_SYSCONFIG                                0x0010
-#define OMAP4_CTRL_MODULE_PAD_WKUP_PADCONF_WAKEUPEVENT_0               0x007c
-#define OMAP4_CTRL_MODULE_PAD_WKUP_CONTROL_SMART1NOPMIO_PADCONF_0      0x05a0
-#define OMAP4_CTRL_MODULE_PAD_WKUP_CONTROL_SMART1NOPMIO_PADCONF_1      0x05a4
-#define OMAP4_CTRL_MODULE_PAD_WKUP_CONTROL_PADCONF_MODE                        0x05a8
-#define OMAP4_CTRL_MODULE_PAD_WKUP_CONTROL_XTAL_OSCILLATOR             0x05ac
-#define OMAP4_CTRL_MODULE_PAD_WKUP_CONTROL_USIMIO                      0x0600
-#define OMAP4_CTRL_MODULE_PAD_WKUP_CONTROL_I2C_2                       0x0604
-#define OMAP4_CTRL_MODULE_PAD_WKUP_CONTROL_JTAG                                0x0608
-#define OMAP4_CTRL_MODULE_PAD_WKUP_CONTROL_SYS                         0x060c
-#define OMAP4_CTRL_MODULE_PAD_WKUP_WKUP_CONTROL_SPARE_RW               0x0614
-#define OMAP4_CTRL_MODULE_PAD_WKUP_WKUP_CONTROL_SPARE_R                        0x0618
-#define OMAP4_CTRL_MODULE_PAD_WKUP_WKUP_CONTROL_SPARE_R_C0             0x061c
-
-/* Registers shifts and masks */
-
-/* IP_REVISION */
-#define OMAP4_IP_REV_SCHEME_SHIFT                              30
-#define OMAP4_IP_REV_SCHEME_MASK                               (0x3 << 30)
-#define OMAP4_IP_REV_FUNC_SHIFT                                        16
-#define OMAP4_IP_REV_FUNC_MASK                                 (0xfff << 16)
-#define OMAP4_IP_REV_RTL_SHIFT                                 11
-#define OMAP4_IP_REV_RTL_MASK                                  (0x1f << 11)
-#define OMAP4_IP_REV_MAJOR_SHIFT                               8
-#define OMAP4_IP_REV_MAJOR_MASK                                        (0x7 << 8)
-#define OMAP4_IP_REV_CUSTOM_SHIFT                              6
-#define OMAP4_IP_REV_CUSTOM_MASK                               (0x3 << 6)
-#define OMAP4_IP_REV_MINOR_SHIFT                               0
-#define OMAP4_IP_REV_MINOR_MASK                                        (0x3f << 0)
-
-/* IP_HWINFO */
-#define OMAP4_IP_HWINFO_SHIFT                                  0
-#define OMAP4_IP_HWINFO_MASK                                   (0xffffffff << 0)
-
-/* IP_SYSCONFIG */
-#define OMAP4_IP_SYSCONFIG_IDLEMODE_SHIFT                      2
-#define OMAP4_IP_SYSCONFIG_IDLEMODE_MASK                       (0x3 << 2)
-
-/* PADCONF_WAKEUPEVENT_0 */
-#define OMAP4_JTAG_TDO_DUPLICATEWAKEUPEVENT_SHIFT              24
-#define OMAP4_JTAG_TDO_DUPLICATEWAKEUPEVENT_MASK               (1 << 24)
-#define OMAP4_JTAG_TDI_DUPLICATEWAKEUPEVENT_SHIFT              23
-#define OMAP4_JTAG_TDI_DUPLICATEWAKEUPEVENT_MASK               (1 << 23)
-#define OMAP4_JTAG_TMS_TMSC_DUPLICATEWAKEUPEVENT_SHIFT         22
-#define OMAP4_JTAG_TMS_TMSC_DUPLICATEWAKEUPEVENT_MASK          (1 << 22)
-#define OMAP4_JTAG_RTCK_DUPLICATEWAKEUPEVENT_SHIFT             21
-#define OMAP4_JTAG_RTCK_DUPLICATEWAKEUPEVENT_MASK              (1 << 21)
-#define OMAP4_JTAG_TCK_DUPLICATEWAKEUPEVENT_SHIFT              20
-#define OMAP4_JTAG_TCK_DUPLICATEWAKEUPEVENT_MASK               (1 << 20)
-#define OMAP4_JTAG_NTRST_DUPLICATEWAKEUPEVENT_SHIFT            19
-#define OMAP4_JTAG_NTRST_DUPLICATEWAKEUPEVENT_MASK             (1 << 19)
-#define OMAP4_SYS_BOOT7_DUPLICATEWAKEUPEVENT_SHIFT             18
-#define OMAP4_SYS_BOOT7_DUPLICATEWAKEUPEVENT_MASK              (1 << 18)
-#define OMAP4_SYS_BOOT6_DUPLICATEWAKEUPEVENT_SHIFT             17
-#define OMAP4_SYS_BOOT6_DUPLICATEWAKEUPEVENT_MASK              (1 << 17)
-#define OMAP4_SYS_PWRON_RESET_OUT_DUPLICATEWAKEUPEVENT_SHIFT   16
-#define OMAP4_SYS_PWRON_RESET_OUT_DUPLICATEWAKEUPEVENT_MASK    (1 << 16)
-#define OMAP4_SYS_PWR_REQ_DUPLICATEWAKEUPEVENT_SHIFT           15
-#define OMAP4_SYS_PWR_REQ_DUPLICATEWAKEUPEVENT_MASK            (1 << 15)
-#define OMAP4_SYS_NRESWARM_DUPLICATEWAKEUPEVENT_SHIFT          14
-#define OMAP4_SYS_NRESWARM_DUPLICATEWAKEUPEVENT_MASK           (1 << 14)
-#define OMAP4_SYS_32K_DUPLICATEWAKEUPEVENT_SHIFT               13
-#define OMAP4_SYS_32K_DUPLICATEWAKEUPEVENT_MASK                        (1 << 13)
-#define OMAP4_FREF_CLK4_OUT_DUPLICATEWAKEUPEVENT_SHIFT         12
-#define OMAP4_FREF_CLK4_OUT_DUPLICATEWAKEUPEVENT_MASK          (1 << 12)
-#define OMAP4_FREF_CLK4_REQ_DUPLICATEWAKEUPEVENT_SHIFT         11
-#define OMAP4_FREF_CLK4_REQ_DUPLICATEWAKEUPEVENT_MASK          (1 << 11)
-#define OMAP4_FREF_CLK3_OUT_DUPLICATEWAKEUPEVENT_SHIFT         10
-#define OMAP4_FREF_CLK3_OUT_DUPLICATEWAKEUPEVENT_MASK          (1 << 10)
-#define OMAP4_FREF_CLK3_REQ_DUPLICATEWAKEUPEVENT_SHIFT         9
-#define OMAP4_FREF_CLK3_REQ_DUPLICATEWAKEUPEVENT_MASK          (1 << 9)
-#define OMAP4_FREF_CLK0_OUT_DUPLICATEWAKEUPEVENT_SHIFT         8
-#define OMAP4_FREF_CLK0_OUT_DUPLICATEWAKEUPEVENT_MASK          (1 << 8)
-#define OMAP4_FREF_CLK_IOREQ_DUPLICATEWAKEUPEVENT_SHIFT                7
-#define OMAP4_FREF_CLK_IOREQ_DUPLICATEWAKEUPEVENT_MASK         (1 << 7)
-#define OMAP4_SR_SDA_DUPLICATEWAKEUPEVENT_SHIFT                        6
-#define OMAP4_SR_SDA_DUPLICATEWAKEUPEVENT_MASK                 (1 << 6)
-#define OMAP4_SR_SCL_DUPLICATEWAKEUPEVENT_SHIFT                        5
-#define OMAP4_SR_SCL_DUPLICATEWAKEUPEVENT_MASK                 (1 << 5)
-#define OMAP4_SIM_PWRCTRL_DUPLICATEWAKEUPEVENT_SHIFT           4
-#define OMAP4_SIM_PWRCTRL_DUPLICATEWAKEUPEVENT_MASK            (1 << 4)
-#define OMAP4_SIM_CD_DUPLICATEWAKEUPEVENT_SHIFT                        3
-#define OMAP4_SIM_CD_DUPLICATEWAKEUPEVENT_MASK                 (1 << 3)
-#define OMAP4_SIM_RESET_DUPLICATEWAKEUPEVENT_SHIFT             2
-#define OMAP4_SIM_RESET_DUPLICATEWAKEUPEVENT_MASK              (1 << 2)
-#define OMAP4_SIM_CLK_DUPLICATEWAKEUPEVENT_SHIFT               1
-#define OMAP4_SIM_CLK_DUPLICATEWAKEUPEVENT_MASK                        (1 << 1)
-#define OMAP4_SIM_IO_DUPLICATEWAKEUPEVENT_SHIFT                        0
-#define OMAP4_SIM_IO_DUPLICATEWAKEUPEVENT_MASK                 (1 << 0)
-
-/* CONTROL_SMART1NOPMIO_PADCONF_0 */
-#define OMAP4_FREF_DR0_SC_SHIFT                                        30
-#define OMAP4_FREF_DR0_SC_MASK                                 (0x3 << 30)
-#define OMAP4_FREF_DR1_SC_SHIFT                                        28
-#define OMAP4_FREF_DR1_SC_MASK                                 (0x3 << 28)
-#define OMAP4_FREF_DR4_SC_SHIFT                                        26
-#define OMAP4_FREF_DR4_SC_MASK                                 (0x3 << 26)
-#define OMAP4_FREF_DR5_SC_SHIFT                                        24
-#define OMAP4_FREF_DR5_SC_MASK                                 (0x3 << 24)
-#define OMAP4_FREF_DR6_SC_SHIFT                                        22
-#define OMAP4_FREF_DR6_SC_MASK                                 (0x3 << 22)
-#define OMAP4_FREF_DR7_SC_SHIFT                                        20
-#define OMAP4_FREF_DR7_SC_MASK                                 (0x3 << 20)
-#define OMAP4_GPIO_DR7_SC_SHIFT                                        18
-#define OMAP4_GPIO_DR7_SC_MASK                                 (0x3 << 18)
-#define OMAP4_DPM_DR0_SC_SHIFT                                 14
-#define OMAP4_DPM_DR0_SC_MASK                                  (0x3 << 14)
-#define OMAP4_SIM_DR0_SC_SHIFT                                 12
-#define OMAP4_SIM_DR0_SC_MASK                                  (0x3 << 12)
-
-/* CONTROL_SMART1NOPMIO_PADCONF_1 */
-#define OMAP4_FREF_DR0_LB_SHIFT                                        30
-#define OMAP4_FREF_DR0_LB_MASK                                 (0x3 << 30)
-#define OMAP4_FREF_DR1_LB_SHIFT                                        28
-#define OMAP4_FREF_DR1_LB_MASK                                 (0x3 << 28)
-#define OMAP4_FREF_DR4_LB_SHIFT                                        26
-#define OMAP4_FREF_DR4_LB_MASK                                 (0x3 << 26)
-#define OMAP4_FREF_DR5_LB_SHIFT                                        24
-#define OMAP4_FREF_DR5_LB_MASK                                 (0x3 << 24)
-#define OMAP4_FREF_DR6_LB_SHIFT                                        22
-#define OMAP4_FREF_DR6_LB_MASK                                 (0x3 << 22)
-#define OMAP4_FREF_DR7_LB_SHIFT                                        20
-#define OMAP4_FREF_DR7_LB_MASK                                 (0x3 << 20)
-#define OMAP4_GPIO_DR7_LB_SHIFT                                        18
-#define OMAP4_GPIO_DR7_LB_MASK                                 (0x3 << 18)
-#define OMAP4_DPM_DR0_LB_SHIFT                                 14
-#define OMAP4_DPM_DR0_LB_MASK                                  (0x3 << 14)
-#define OMAP4_SIM_DR0_LB_SHIFT                                 12
-#define OMAP4_SIM_DR0_LB_MASK                                  (0x3 << 12)
-
-/* CONTROL_PADCONF_MODE */
-#define OMAP4_VDDS_DV_FREF_SHIFT                               31
-#define OMAP4_VDDS_DV_FREF_MASK                                        (1 << 31)
-#define OMAP4_VDDS_DV_BANK2_SHIFT                              30
-#define OMAP4_VDDS_DV_BANK2_MASK                               (1 << 30)
-
-/* CONTROL_XTAL_OSCILLATOR */
-#define OMAP4_OSCILLATOR_BOOST_SHIFT                           31
-#define OMAP4_OSCILLATOR_BOOST_MASK                            (1 << 31)
-#define OMAP4_OSCILLATOR_OS_OUT_SHIFT                          30
-#define OMAP4_OSCILLATOR_OS_OUT_MASK                           (1 << 30)
-
-/* CONTROL_USIMIO */
-#define OMAP4_PAD_USIM_CLK_LOW_SHIFT                           31
-#define OMAP4_PAD_USIM_CLK_LOW_MASK                            (1 << 31)
-#define OMAP4_PAD_USIM_RST_LOW_SHIFT                           29
-#define OMAP4_PAD_USIM_RST_LOW_MASK                            (1 << 29)
-#define OMAP4_USIM_PWRDNZ_SHIFT                                        28
-#define OMAP4_USIM_PWRDNZ_MASK                                 (1 << 28)
-
-/* CONTROL_I2C_2 */
-#define OMAP4_SR_SDA_GLFENB_SHIFT                              31
-#define OMAP4_SR_SDA_GLFENB_MASK                               (1 << 31)
-#define OMAP4_SR_SDA_LOAD_BITS_SHIFT                           29
-#define OMAP4_SR_SDA_LOAD_BITS_MASK                            (0x3 << 29)
-#define OMAP4_SR_SDA_PULLUPRESX_SHIFT                          28
-#define OMAP4_SR_SDA_PULLUPRESX_MASK                           (1 << 28)
-#define OMAP4_SR_SCL_GLFENB_SHIFT                              27
-#define OMAP4_SR_SCL_GLFENB_MASK                               (1 << 27)
-#define OMAP4_SR_SCL_LOAD_BITS_SHIFT                           25
-#define OMAP4_SR_SCL_LOAD_BITS_MASK                            (0x3 << 25)
-#define OMAP4_SR_SCL_PULLUPRESX_SHIFT                          24
-#define OMAP4_SR_SCL_PULLUPRESX_MASK                           (1 << 24)
-
-/* CONTROL_JTAG */
-#define OMAP4_JTAG_NTRST_EN_SHIFT                              31
-#define OMAP4_JTAG_NTRST_EN_MASK                               (1 << 31)
-#define OMAP4_JTAG_TCK_EN_SHIFT                                        30
-#define OMAP4_JTAG_TCK_EN_MASK                                 (1 << 30)
-#define OMAP4_JTAG_RTCK_EN_SHIFT                               29
-#define OMAP4_JTAG_RTCK_EN_MASK                                        (1 << 29)
-#define OMAP4_JTAG_TDI_EN_SHIFT                                        28
-#define OMAP4_JTAG_TDI_EN_MASK                                 (1 << 28)
-#define OMAP4_JTAG_TDO_EN_SHIFT                                        27
-#define OMAP4_JTAG_TDO_EN_MASK                                 (1 << 27)
-
-/* CONTROL_SYS */
-#define OMAP4_SYS_NRESWARM_PIPU_SHIFT                          31
-#define OMAP4_SYS_NRESWARM_PIPU_MASK                           (1 << 31)
-
-/* WKUP_CONTROL_SPARE_RW */
-#define OMAP4_WKUP_CONTROL_SPARE_RW_SHIFT                      0
-#define OMAP4_WKUP_CONTROL_SPARE_RW_MASK                       (0xffffffff << 0)
-
-/* WKUP_CONTROL_SPARE_R */
-#define OMAP4_WKUP_CONTROL_SPARE_R_SHIFT                       0
-#define OMAP4_WKUP_CONTROL_SPARE_R_MASK                                (0xffffffff << 0)
-
-/* WKUP_CONTROL_SPARE_R_C0 */
-#define OMAP4_WKUP_CONTROL_SPARE_R_C0_SHIFT                    31
-#define OMAP4_WKUP_CONTROL_SPARE_R_C0_MASK                     (1 << 31)
-#define OMAP4_WKUP_CONTROL_SPARE_R_C1_SHIFT                    30
-#define OMAP4_WKUP_CONTROL_SPARE_R_C1_MASK                     (1 << 30)
-#define OMAP4_WKUP_CONTROL_SPARE_R_C2_SHIFT                    29
-#define OMAP4_WKUP_CONTROL_SPARE_R_C2_MASK                     (1 << 29)
-#define OMAP4_WKUP_CONTROL_SPARE_R_C3_SHIFT                    28
-#define OMAP4_WKUP_CONTROL_SPARE_R_C3_MASK                     (1 << 28)
-#define OMAP4_WKUP_CONTROL_SPARE_R_C4_SHIFT                    27
-#define OMAP4_WKUP_CONTROL_SPARE_R_C4_MASK                     (1 << 27)
-#define OMAP4_WKUP_CONTROL_SPARE_R_C5_SHIFT                    26
-#define OMAP4_WKUP_CONTROL_SPARE_R_C5_MASK                     (1 << 26)
-#define OMAP4_WKUP_CONTROL_SPARE_R_C6_SHIFT                    25
-#define OMAP4_WKUP_CONTROL_SPARE_R_C6_MASK                     (1 << 25)
-#define OMAP4_WKUP_CONTROL_SPARE_R_C7_SHIFT                    24
-#define OMAP4_WKUP_CONTROL_SPARE_R_C7_MASK                     (1 << 24)
-
-#endif
index b6f8f348296e31936f0dca84cbdcc80a01395203..324f02bf8a51da6b3d3395d30c309447a8f7c793 100644 (file)
@@ -432,9 +432,9 @@ static int __init omap2_init_devices(void)
         */
        omap_init_audio();
        omap_init_camera();
-       omap_init_mbox();
        /* If dtb is there, the devices will be created dynamically */
        if (!of_have_populated_dt()) {
+               omap_init_mbox();
                omap_init_mcspi();
                omap_init_sham();
                omap_init_aes();
index a6d2cf1f8d02f790f82a45ab73cfb1e256f1177f..e1a56d87599e640620e506989de7b5f302c49695 100644 (file)
@@ -259,6 +259,9 @@ static int __init omap2_system_dma_init_dev(struct omap_hwmod *oh, void *unused)
        if (cpu_is_omap34xx() && (omap_type() != OMAP2_DEVICE_TYPE_GP))
                d->dev_caps |= HS_CHANNELS_RESERVED;
 
+       if (platform_get_irq_byname(pdev, "0") < 0)
+               d->dev_caps |= DMA_ENGINE_HANDLE_IRQ;
+
        /* Check the capabilities register for descriptor loading feature */
        if (dma_read(CAPS_0, 0) & DMA_HAS_DESCRIPTOR_CAPS)
                dma_common_ch_end = CCDN;
index 6d7ba37e225735d49e262723bc6927e0e0b52ed1..cd5f3a0b97bd86658de0228da51f8f7d074370ac 100644 (file)
 #include <linux/bitops.h>
 #include <linux/clkdev.h>
 
-#include "soc.h"
 #include "clockdomain.h"
 #include "clock.h"
-#include "cm2xxx_3xxx.h"
-#include "cm-regbits-34xx.h"
 
 /* CM_AUTOIDLE_PLL*.AUTO_* bit values */
 #define DPLL_AUTOIDLE_DISABLE                  0x0
@@ -310,7 +307,7 @@ static int omap3_noncore_dpll_program(struct clk_hw_omap *clk, u16 freqsel)
         * Set jitter correction. Jitter correction applicable for OMAP343X
         * only since freqsel field is no longer present on other devices.
         */
-       if (cpu_is_omap343x()) {
+       if (ti_clk_features.flags & TI_CLK_DPLL_HAS_FREQSEL) {
                v = omap2_clk_readl(clk, dd->control_reg);
                v &= ~dd->freqsel_mask;
                v |= freqsel << __ffs(dd->freqsel_mask);
@@ -512,7 +509,7 @@ int omap3_noncore_dpll_set_rate(struct clk_hw *hw, unsigned long rate,
                        return -EINVAL;
 
                /* Freqsel is available only on OMAP343X devices */
-               if (cpu_is_omap343x()) {
+               if (ti_clk_features.flags & TI_CLK_DPLL_HAS_FREQSEL) {
                        freqsel = _omap3_dpll_compute_freqsel(clk,
                                                dd->last_rounded_n);
                        WARN_ON(!freqsel);
index 52f9438b92f2a5d165b548b323bacb8680588bae..4613f1e86988751072826fb549a0f920d7df25e8 100644 (file)
 #include <linux/io.h>
 #include <linux/bitops.h>
 
-#include "soc.h"
 #include "clock.h"
-#include "clock44xx.h"
-#include "cm-regbits-44xx.h"
 
 /*
  * Maximum DPLL input frequency (FINT) and output frequency (FOUT) that
 #define OMAP4_DPLL_LP_FINT_MAX 1000000
 #define OMAP4_DPLL_LP_FOUT_MAX 100000000
 
+/*
+ * Bitfield declarations
+ */
+#define OMAP4430_DPLL_CLKOUT_GATE_CTRL_MASK            (1 << 8)
+#define OMAP4430_DPLL_CLKOUTX2_GATE_CTRL_MASK          (1 << 10)
+#define OMAP4430_DPLL_REGM4XEN_MASK                    (1 << 11)
+
+/* Static rate multiplier for OMAP4 REGM4XEN clocks */
+#define OMAP4430_REGM4XEN_MULT                         4
+
 /* Supported only on OMAP4 */
 int omap4_dpllmx_gatectrl_read(struct clk_hw_omap *clk)
 {
        u32 v;
        u32 mask;
 
-       if (!clk || !clk->clksel_reg || !cpu_is_omap44xx())
+       if (!clk || !clk->clksel_reg)
                return -EINVAL;
 
        mask = clk->flags & CLOCK_CLKOUTX2 ?
@@ -54,7 +61,7 @@ void omap4_dpllmx_allow_gatectrl(struct clk_hw_omap *clk)
        u32 v;
        u32 mask;
 
-       if (!clk || !clk->clksel_reg || !cpu_is_omap44xx())
+       if (!clk || !clk->clksel_reg)
                return;
 
        mask = clk->flags & CLOCK_CLKOUTX2 ?
@@ -72,7 +79,7 @@ void omap4_dpllmx_deny_gatectrl(struct clk_hw_omap *clk)
        u32 v;
        u32 mask;
 
-       if (!clk || !clk->clksel_reg || !cpu_is_omap44xx())
+       if (!clk || !clk->clksel_reg)
                return;
 
        mask = clk->flags & CLOCK_CLKOUTX2 ?
index 93914d2200691ca3e27a6b74d04ce3b52eb02703..8897ad7035fd448bf8021a9aea06c3684639fb3f 100644 (file)
 /* minimum size for IO mapping */
 #define        NAND_IO_SIZE    4
 
-static struct resource gpmc_nand_resource[] = {
-       {
-               .flags          = IORESOURCE_MEM,
-       },
-       {
-               .flags          = IORESOURCE_IRQ,
-       },
-       {
-               .flags          = IORESOURCE_IRQ,
-       },
-};
-
-static struct platform_device gpmc_nand_device = {
-       .name           = "omap2-nand",
-       .id             = 0,
-       .num_resources  = ARRAY_SIZE(gpmc_nand_resource),
-       .resource       = gpmc_nand_resource,
-};
-
 static bool gpmc_hwecc_bch_capable(enum omap_ecc ecc_opt)
 {
        /* platforms which support all ECC schemes */
@@ -95,43 +76,41 @@ int gpmc_nand_init(struct omap_nand_platform_data *gpmc_nand_data,
 {
        int err = 0;
        struct gpmc_settings s;
-       struct device *dev = &gpmc_nand_device.dev;
-
-       memset(&s, 0, sizeof(struct gpmc_settings));
+       struct platform_device *pdev;
+       struct resource gpmc_nand_res[] = {
+               { .flags = IORESOURCE_MEM, },
+               { .flags = IORESOURCE_IRQ, },
+               { .flags = IORESOURCE_IRQ, },
+       };
 
-       gpmc_nand_device.dev.platform_data = gpmc_nand_data;
+       BUG_ON(gpmc_nand_data->cs >= GPMC_CS_NUM);
 
        err = gpmc_cs_request(gpmc_nand_data->cs, NAND_IO_SIZE,
-                               (unsigned long *)&gpmc_nand_resource[0].start);
+                             (unsigned long *)&gpmc_nand_res[0].start);
        if (err < 0) {
-               dev_err(dev, "Cannot request GPMC CS %d, error %d\n",
-                       gpmc_nand_data->cs, err);
+               pr_err("omap2-gpmc: Cannot request GPMC CS %d, error %d\n",
+                      gpmc_nand_data->cs, err);
                return err;
        }
-
-       gpmc_nand_resource[0].end = gpmc_nand_resource[0].start +
-                                                       NAND_IO_SIZE - 1;
-
-       gpmc_nand_resource[1].start =
-                               gpmc_get_client_irq(GPMC_IRQ_FIFOEVENTENABLE);
-       gpmc_nand_resource[2].start =
-                               gpmc_get_client_irq(GPMC_IRQ_COUNT_EVENT);
+       gpmc_nand_res[0].end = gpmc_nand_res[0].start + NAND_IO_SIZE - 1;
+       gpmc_nand_res[1].start = gpmc_get_client_irq(GPMC_IRQ_FIFOEVENTENABLE);
+       gpmc_nand_res[2].start = gpmc_get_client_irq(GPMC_IRQ_COUNT_EVENT);
 
        if (gpmc_t) {
                err = gpmc_cs_set_timings(gpmc_nand_data->cs, gpmc_t);
                if (err < 0) {
-                       dev_err(dev, "Unable to set gpmc timings: %d\n", err);
+                       pr_err("omap2-gpmc: Unable to set gpmc timings: %d\n", err);
                        return err;
                }
        }
 
+       memset(&s, 0, sizeof(struct gpmc_settings));
        if (gpmc_nand_data->of_node)
                gpmc_read_settings_dt(gpmc_nand_data->of_node, &s);
        else
                gpmc_set_legacy(gpmc_nand_data, &s);
 
        s.device_nand = true;
-
        err = gpmc_cs_program_settings(gpmc_nand_data->cs, &s);
        if (err < 0)
                goto out_free_cs;
@@ -143,18 +122,34 @@ int gpmc_nand_init(struct omap_nand_platform_data *gpmc_nand_data,
        gpmc_update_nand_reg(&gpmc_nand_data->reg, gpmc_nand_data->cs);
 
        if (!gpmc_hwecc_bch_capable(gpmc_nand_data->ecc_opt)) {
-               dev_err(dev, "Unsupported NAND ECC scheme selected\n");
-               return -EINVAL;
+               pr_err("omap2-nand: Unsupported NAND ECC scheme selected\n");
+               err = -EINVAL;
+               goto out_free_cs;
        }
 
-       err = platform_device_register(&gpmc_nand_device);
-       if (err < 0) {
-               dev_err(dev, "Unable to register NAND device\n");
-               goto out_free_cs;
+
+       pdev = platform_device_alloc("omap2-nand", gpmc_nand_data->cs);
+       if (pdev) {
+               err = platform_device_add_resources(pdev, gpmc_nand_res,
+                                                   ARRAY_SIZE(gpmc_nand_res));
+               if (!err)
+                       pdev->dev.platform_data = gpmc_nand_data;
+       } else {
+               err = -ENOMEM;
+       }
+       if (err)
+               goto out_free_pdev;
+
+       err = platform_device_add(pdev);
+       if (err) {
+               dev_err(&pdev->dev, "Unable to register NAND device\n");
+               goto out_free_pdev;
        }
 
        return 0;
 
+out_free_pdev:
+       platform_device_put(pdev);
 out_free_cs:
        gpmc_cs_free(gpmc_nand_data->cs);
 
index 8f559450c876292f7b1a381cc2b15ba193389612..5d0667c119f6e6866e23d25d344eb47ddb34472a 100644 (file)
@@ -53,6 +53,7 @@
 #include "prm2xxx.h"
 #include "prm3xxx.h"
 #include "prm44xx.h"
+#include "opp2xxx.h"
 
 /*
  * omap_clk_soc_init: points to a function that does the SoC-specific
@@ -410,7 +411,8 @@ void __init omap2420_init_early(void)
        omap242x_clockdomains_init();
        omap2420_hwmod_init();
        omap_hwmod_init_postsetup();
-       omap_clk_soc_init = omap2420_clk_init;
+       omap_clk_soc_init = omap2420_dt_clk_init;
+       rate_table = omap2420_rate_table;
 }
 
 void __init omap2420_init_late(void)
@@ -439,7 +441,8 @@ void __init omap2430_init_early(void)
        omap243x_clockdomains_init();
        omap2430_hwmod_init();
        omap_hwmod_init_postsetup();
-       omap_clk_soc_init = omap2430_clk_init;
+       omap_clk_soc_init = omap2430_dt_clk_init;
+       rate_table = omap2430_rate_table;
 }
 
 void __init omap2430_init_late(void)
@@ -728,6 +731,8 @@ int __init omap_clk_init(void)
        if (!omap_clk_soc_init)
                return 0;
 
+       ti_clk_init_features();
+
        ret = of_prcm_init();
        if (!ret)
                ret = omap_clk_soc_init();
index 2f15979c2e9c410ed6c8ee42b7deb4a17c8d85ca..65b1647092bd541419b5c192565de2451415015c 100644 (file)
@@ -16,7 +16,6 @@
 #include <linux/i2c-omap.h>
 #include <linux/platform_data/spi-omap2-mcspi.h>
 #include <linux/omap-dma.h>
-#include <linux/platform_data/mailbox-omap.h>
 #include <plat/dmtimer.h>
 
 #include "omap_hwmod.h"
@@ -163,18 +162,6 @@ static struct omap_hwmod omap2420_dma_system_hwmod = {
 };
 
 /* mailbox */
-static struct omap_mbox_dev_info omap2420_mailbox_info[] = {
-       { .name = "dsp", .tx_id = 0, .rx_id = 1, .irq_id = 0, .usr_id = 0 },
-       { .name = "iva", .tx_id = 2, .rx_id = 3, .irq_id = 1, .usr_id = 3 },
-};
-
-static struct omap_mbox_pdata omap2420_mailbox_attrs = {
-       .num_users      = 4,
-       .num_fifos      = 6,
-       .info_cnt       = ARRAY_SIZE(omap2420_mailbox_info),
-       .info           = omap2420_mailbox_info,
-};
-
 static struct omap_hwmod omap2420_mailbox_hwmod = {
        .name           = "mailbox",
        .class          = &omap2xxx_mailbox_hwmod_class,
@@ -188,7 +175,6 @@ static struct omap_hwmod omap2420_mailbox_hwmod = {
                        .idlest_idle_bit = OMAP24XX_ST_MAILBOXES_SHIFT,
                },
        },
-       .dev_attr       = &omap2420_mailbox_attrs,
 };
 
 /*
index 6d1b60902179d12e707f5b1f7564080072eea371..c2555cb95e7116765f2132bf711d1f959723765d 100644 (file)
@@ -17,7 +17,6 @@
 #include <linux/platform_data/asoc-ti-mcbsp.h>
 #include <linux/platform_data/spi-omap2-mcspi.h>
 #include <linux/omap-dma.h>
-#include <linux/platform_data/mailbox-omap.h>
 #include <plat/dmtimer.h>
 
 #include "omap_hwmod.h"
@@ -161,17 +160,6 @@ static struct omap_hwmod omap2430_dma_system_hwmod = {
 };
 
 /* mailbox */
-static struct omap_mbox_dev_info omap2430_mailbox_info[] = {
-       { .name = "dsp", .tx_id = 0, .rx_id = 1 },
-};
-
-static struct omap_mbox_pdata omap2430_mailbox_attrs = {
-       .num_users      = 4,
-       .num_fifos      = 6,
-       .info_cnt       = ARRAY_SIZE(omap2430_mailbox_info),
-       .info           = omap2430_mailbox_info,
-};
-
 static struct omap_hwmod omap2430_mailbox_hwmod = {
        .name           = "mailbox",
        .class          = &omap2xxx_mailbox_hwmod_class,
@@ -185,7 +173,6 @@ static struct omap_hwmod omap2430_mailbox_hwmod = {
                        .idlest_idle_bit = OMAP24XX_ST_MAILBOXES_SHIFT,
                },
        },
-       .dev_attr       = &omap2430_mailbox_attrs,
 };
 
 /* mcspi3 */
index 0413daba2dba1bdc88e4522cf9c6c04bf76acca0..c1e98d5891006ce8a62b9014af251a03a14c82df 100644 (file)
@@ -152,15 +152,6 @@ struct omap_hwmod_addr_space omap2_dma_system_addrs[] = {
        { }
 };
 
-struct omap_hwmod_addr_space omap2_mailbox_addrs[] = {
-       {
-               .pa_start       = 0x48094000,
-               .pa_end         = 0x48094000 + SZ_512 - 1,
-               .flags          = ADDR_TYPE_RT,
-       },
-       { }
-};
-
 struct omap_hwmod_addr_space omap2_mcbsp1_addrs[] = {
        {
                .name           = "mpu",
index 5da7a42a6d9085984b79e10c0e46423432f7b0f0..c6c6384de8678f2fb8dd58a996499afdc47fa709 100644 (file)
@@ -36,46 +36,6 @@ struct omap_hwmod_class omap2_uart_class = {
        .sysc   = &omap2_uart_sysc,
 };
 
-/*
- * 'dss' class
- * display sub-system
- */
-
-static struct omap_hwmod_class_sysconfig omap2_dss_sysc = {
-       .rev_offs       = 0x0000,
-       .sysc_offs      = 0x0010,
-       .syss_offs      = 0x0014,
-       .sysc_flags     = (SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE |
-                          SYSS_HAS_RESET_STATUS),
-       .sysc_fields    = &omap_hwmod_sysc_type1,
-};
-
-struct omap_hwmod_class omap2_dss_hwmod_class = {
-       .name   = "dss",
-       .sysc   = &omap2_dss_sysc,
-       .reset  = omap_dss_reset,
-};
-
-/*
- * 'rfbi' class
- * remote frame buffer interface
- */
-
-static struct omap_hwmod_class_sysconfig omap2_rfbi_sysc = {
-       .rev_offs       = 0x0000,
-       .sysc_offs      = 0x0010,
-       .syss_offs      = 0x0014,
-       .sysc_flags     = (SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET |
-                          SYSC_HAS_AUTOIDLE),
-       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
-       .sysc_fields    = &omap_hwmod_sysc_type1,
-};
-
-struct omap_hwmod_class omap2_rfbi_hwmod_class = {
-       .name   = "rfbi",
-       .sysc   = &omap2_rfbi_sysc,
-};
-
 /*
  * 'venc' class
  * video encoder
index e2db378b849e398126100306367b10f8c2178993..8f5989d48a801306224f94ad73dcf21345e4b84b 100644 (file)
@@ -317,21 +317,11 @@ struct omap_hwmod_ocp_if am33xx_l4_per__i2c3 = {
        .user           = OCP_USER_MPU,
 };
 
-static struct omap_hwmod_addr_space am33xx_mailbox_addrs[] = {
-       {
-               .pa_start       = 0x480C8000,
-               .pa_end         = 0x480C8000 + (SZ_4K - 1),
-               .flags          = ADDR_TYPE_RT
-       },
-       { }
-};
-
 /* l4 ls -> mailbox */
 struct omap_hwmod_ocp_if am33xx_l4_per__mailbox = {
        .master         = &am33xx_l4_ls_hwmod,
        .slave          = &am33xx_mailbox_hwmod,
        .clk            = "l4ls_gclk",
-       .addr           = am33xx_mailbox_addrs,
        .user           = OCP_USER_MPU,
 };
 
index 5c2cc8083fdd9ba22087f1add79f061a4d5d28b2..fea01aa3ef425846a0ae42f6eff5f706ae43a260 100644 (file)
@@ -19,6 +19,8 @@
 #include "omap_hwmod.h"
 #include "omap_hwmod_33xx_43xx_common_data.h"
 #include "prcm43xx.h"
+#include "omap_hwmod_common_data.h"
+
 
 /* IP blocks */
 static struct omap_hwmod am43xx_l4_hs_hwmod = {
@@ -415,6 +417,72 @@ static struct omap_hwmod am43xx_qspi_hwmod = {
        },
 };
 
+/* dss */
+
+static struct omap_hwmod am43xx_dss_core_hwmod = {
+       .name           = "dss_core",
+       .class          = &omap2_dss_hwmod_class,
+       .clkdm_name     = "dss_clkdm",
+       .main_clk       = "disp_clk",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = AM43XX_CM_PER_DSS_CLKCTRL_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* dispc */
+
+struct omap_dss_dispc_dev_attr am43xx_dss_dispc_dev_attr = {
+       .manager_count          = 1,
+       .has_framedonetv_irq    = 0
+};
+
+static struct omap_hwmod_class_sysconfig am43xx_dispc_sysc = {
+       .rev_offs       = 0x0000,
+       .sysc_offs      = 0x0010,
+       .syss_offs      = 0x0014,
+       .sysc_flags     = (SYSC_HAS_AUTOIDLE | SYSC_HAS_SOFTRESET |
+                          SYSC_HAS_ENAWAKEUP | SYSC_HAS_SIDLEMODE |
+                          SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_MIDLEMODE),
+       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
+                          MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART),
+       .sysc_fields    = &omap_hwmod_sysc_type1,
+};
+
+static struct omap_hwmod_class am43xx_dispc_hwmod_class = {
+       .name   = "dispc",
+       .sysc   = &am43xx_dispc_sysc,
+};
+
+static struct omap_hwmod am43xx_dss_dispc_hwmod = {
+       .name           = "dss_dispc",
+       .class          = &am43xx_dispc_hwmod_class,
+       .clkdm_name     = "dss_clkdm",
+       .main_clk       = "disp_clk",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = AM43XX_CM_PER_DSS_CLKCTRL_OFFSET,
+               },
+       },
+       .dev_attr       = &am43xx_dss_dispc_dev_attr,
+};
+
+/* rfbi */
+
+static struct omap_hwmod am43xx_dss_rfbi_hwmod = {
+       .name           = "dss_rfbi",
+       .class          = &omap2_rfbi_hwmod_class,
+       .clkdm_name     = "dss_clkdm",
+       .main_clk       = "disp_clk",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = AM43XX_CM_PER_DSS_CLKCTRL_OFFSET,
+               },
+       },
+};
+
 /* Interfaces */
 static struct omap_hwmod_ocp_if am43xx_l3_main__l4_hs = {
        .master         = &am33xx_l3_main_hwmod,
@@ -654,6 +722,34 @@ static struct omap_hwmod_ocp_if am43xx_l3_s__qspi = {
        .user           = OCP_USER_MPU | OCP_USER_SDMA,
 };
 
+static struct omap_hwmod_ocp_if am43xx_dss__l3_main = {
+       .master         = &am43xx_dss_core_hwmod,
+       .slave          = &am33xx_l3_main_hwmod,
+       .clk            = "l3_gclk",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+static struct omap_hwmod_ocp_if am43xx_l4_ls__dss = {
+       .master         = &am33xx_l4_ls_hwmod,
+       .slave          = &am43xx_dss_core_hwmod,
+       .clk            = "l4ls_gclk",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+static struct omap_hwmod_ocp_if am43xx_l4_ls__dss_dispc = {
+       .master         = &am33xx_l4_ls_hwmod,
+       .slave          = &am43xx_dss_dispc_hwmod,
+       .clk            = "l4ls_gclk",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+static struct omap_hwmod_ocp_if am43xx_l4_ls__dss_rfbi = {
+       .master         = &am33xx_l4_ls_hwmod,
+       .slave          = &am43xx_dss_rfbi_hwmod,
+       .clk            = "l4ls_gclk",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
 static struct omap_hwmod_ocp_if *am43xx_hwmod_ocp_ifs[] __initdata = {
        &am33xx_l4_wkup__synctimer,
        &am43xx_l4_ls__timer8,
@@ -748,6 +844,10 @@ static struct omap_hwmod_ocp_if *am43xx_hwmod_ocp_ifs[] __initdata = {
        &am43xx_l4_ls__ocp2scp1,
        &am43xx_l3_s__usbotgss0,
        &am43xx_l3_s__usbotgss1,
+       &am43xx_dss__l3_main,
+       &am43xx_l4_ls__dss,
+       &am43xx_l4_ls__dss_dispc,
+       &am43xx_l4_ls__dss_rfbi,
        NULL,
 };
 
index b4acc0a7576f22dfa60c38d1bc164abc027218ce..44e5634bba3450e3660a62c2f1341ba3231cf304 100644 (file)
@@ -4138,21 +4138,11 @@ static struct omap_hwmod_ocp_if omap44xx_l4_wkup__kbd = {
        .user           = OCP_USER_MPU | OCP_USER_SDMA,
 };
 
-static struct omap_hwmod_addr_space omap44xx_mailbox_addrs[] = {
-       {
-               .pa_start       = 0x4a0f4000,
-               .pa_end         = 0x4a0f41ff,
-               .flags          = ADDR_TYPE_RT
-       },
-       { }
-};
-
 /* l4_cfg -> mailbox */
 static struct omap_hwmod_ocp_if omap44xx_l4_cfg__mailbox = {
        .master         = &omap44xx_l4_cfg_hwmod,
        .slave          = &omap44xx_mailbox_hwmod,
        .clk            = "l4_div_ck",
-       .addr           = omap44xx_mailbox_addrs,
        .user           = OCP_USER_MPU | OCP_USER_SDMA,
 };
 
index 284324f2b98acef67e8deb4cbb3e4c5b42db2c43..2757abf87fbc5216662daa5ae87e06c991940756 100644 (file)
@@ -272,6 +272,56 @@ static struct omap_hwmod dra7xx_ctrl_module_wkup_hwmod = {
        },
 };
 
+/*
+ * 'gmac' class
+ * cpsw/gmac sub system
+ */
+static struct omap_hwmod_class_sysconfig dra7xx_gmac_sysc = {
+       .rev_offs       = 0x0,
+       .sysc_offs      = 0x8,
+       .syss_offs      = 0x4,
+       .sysc_flags     = (SYSC_HAS_SIDLEMODE | SYSC_HAS_MIDLEMODE |
+                          SYSS_HAS_RESET_STATUS),
+       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | MSTANDBY_FORCE |
+                          MSTANDBY_NO),
+       .sysc_fields    = &omap_hwmod_sysc_type3,
+};
+
+static struct omap_hwmod_class dra7xx_gmac_hwmod_class = {
+       .name           = "gmac",
+       .sysc           = &dra7xx_gmac_sysc,
+};
+
+static struct omap_hwmod dra7xx_gmac_hwmod = {
+       .name           = "gmac",
+       .class          = &dra7xx_gmac_hwmod_class,
+       .clkdm_name     = "gmac_clkdm",
+       .flags          = (HWMOD_SWSUP_SIDLE | HWMOD_SWSUP_MSTANDBY),
+       .main_clk       = "dpll_gmac_ck",
+       .mpu_rt_idx     = 1,
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = DRA7XX_CM_GMAC_GMAC_CLKCTRL_OFFSET,
+                       .context_offs   = DRA7XX_RM_GMAC_GMAC_CONTEXT_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/*
+ * 'mdio' class
+ */
+static struct omap_hwmod_class dra7xx_mdio_hwmod_class = {
+       .name           = "davinci_mdio",
+};
+
+static struct omap_hwmod dra7xx_mdio_hwmod = {
+       .name           = "davinci_mdio",
+       .class          = &dra7xx_mdio_hwmod_class,
+       .clkdm_name     = "gmac_clkdm",
+       .main_clk       = "dpll_gmac_ck",
+};
+
 /*
  * 'dcan' class
  *
@@ -343,19 +393,10 @@ static struct omap_dma_dev_attr dma_dev_attr = {
 };
 
 /* dma_system */
-static struct omap_hwmod_irq_info dra7xx_dma_system_irqs[] = {
-       { .name = "0", .irq = 12 + DRA7XX_IRQ_GIC_START },
-       { .name = "1", .irq = 13 + DRA7XX_IRQ_GIC_START },
-       { .name = "2", .irq = 14 + DRA7XX_IRQ_GIC_START },
-       { .name = "3", .irq = 15 + DRA7XX_IRQ_GIC_START },
-       { .irq = -1 }
-};
-
 static struct omap_hwmod dra7xx_dma_system_hwmod = {
        .name           = "dma_system",
        .class          = &dra7xx_dma_hwmod_class,
        .clkdm_name     = "dma_clkdm",
-       .mpu_irqs       = dra7xx_dma_system_irqs,
        .main_clk       = "l3_iclk_div",
        .prcm = {
                .omap4 = {
@@ -938,6 +979,194 @@ static struct omap_hwmod dra7xx_i2c5_hwmod = {
        .dev_attr       = &i2c_dev_attr,
 };
 
+/*
+ * 'mailbox' class
+ *
+ */
+
+static struct omap_hwmod_class_sysconfig dra7xx_mailbox_sysc = {
+       .rev_offs       = 0x0000,
+       .sysc_offs      = 0x0010,
+       .sysc_flags     = (SYSC_HAS_RESET_STATUS | SYSC_HAS_SIDLEMODE |
+                          SYSC_HAS_SOFTRESET),
+       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
+       .sysc_fields    = &omap_hwmod_sysc_type2,
+};
+
+static struct omap_hwmod_class dra7xx_mailbox_hwmod_class = {
+       .name   = "mailbox",
+       .sysc   = &dra7xx_mailbox_sysc,
+};
+
+/* mailbox1 */
+static struct omap_hwmod dra7xx_mailbox1_hwmod = {
+       .name           = "mailbox1",
+       .class          = &dra7xx_mailbox_hwmod_class,
+       .clkdm_name     = "l4cfg_clkdm",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = DRA7XX_CM_L4CFG_MAILBOX1_CLKCTRL_OFFSET,
+                       .context_offs = DRA7XX_RM_L4CFG_MAILBOX1_CONTEXT_OFFSET,
+               },
+       },
+};
+
+/* mailbox2 */
+static struct omap_hwmod dra7xx_mailbox2_hwmod = {
+       .name           = "mailbox2",
+       .class          = &dra7xx_mailbox_hwmod_class,
+       .clkdm_name     = "l4cfg_clkdm",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = DRA7XX_CM_L4CFG_MAILBOX2_CLKCTRL_OFFSET,
+                       .context_offs = DRA7XX_RM_L4CFG_MAILBOX2_CONTEXT_OFFSET,
+               },
+       },
+};
+
+/* mailbox3 */
+static struct omap_hwmod dra7xx_mailbox3_hwmod = {
+       .name           = "mailbox3",
+       .class          = &dra7xx_mailbox_hwmod_class,
+       .clkdm_name     = "l4cfg_clkdm",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = DRA7XX_CM_L4CFG_MAILBOX3_CLKCTRL_OFFSET,
+                       .context_offs = DRA7XX_RM_L4CFG_MAILBOX3_CONTEXT_OFFSET,
+               },
+       },
+};
+
+/* mailbox4 */
+static struct omap_hwmod dra7xx_mailbox4_hwmod = {
+       .name           = "mailbox4",
+       .class          = &dra7xx_mailbox_hwmod_class,
+       .clkdm_name     = "l4cfg_clkdm",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = DRA7XX_CM_L4CFG_MAILBOX4_CLKCTRL_OFFSET,
+                       .context_offs = DRA7XX_RM_L4CFG_MAILBOX4_CONTEXT_OFFSET,
+               },
+       },
+};
+
+/* mailbox5 */
+static struct omap_hwmod dra7xx_mailbox5_hwmod = {
+       .name           = "mailbox5",
+       .class          = &dra7xx_mailbox_hwmod_class,
+       .clkdm_name     = "l4cfg_clkdm",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = DRA7XX_CM_L4CFG_MAILBOX5_CLKCTRL_OFFSET,
+                       .context_offs = DRA7XX_RM_L4CFG_MAILBOX5_CONTEXT_OFFSET,
+               },
+       },
+};
+
+/* mailbox6 */
+static struct omap_hwmod dra7xx_mailbox6_hwmod = {
+       .name           = "mailbox6",
+       .class          = &dra7xx_mailbox_hwmod_class,
+       .clkdm_name     = "l4cfg_clkdm",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = DRA7XX_CM_L4CFG_MAILBOX6_CLKCTRL_OFFSET,
+                       .context_offs = DRA7XX_RM_L4CFG_MAILBOX6_CONTEXT_OFFSET,
+               },
+       },
+};
+
+/* mailbox7 */
+static struct omap_hwmod dra7xx_mailbox7_hwmod = {
+       .name           = "mailbox7",
+       .class          = &dra7xx_mailbox_hwmod_class,
+       .clkdm_name     = "l4cfg_clkdm",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = DRA7XX_CM_L4CFG_MAILBOX7_CLKCTRL_OFFSET,
+                       .context_offs = DRA7XX_RM_L4CFG_MAILBOX7_CONTEXT_OFFSET,
+               },
+       },
+};
+
+/* mailbox8 */
+static struct omap_hwmod dra7xx_mailbox8_hwmod = {
+       .name           = "mailbox8",
+       .class          = &dra7xx_mailbox_hwmod_class,
+       .clkdm_name     = "l4cfg_clkdm",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = DRA7XX_CM_L4CFG_MAILBOX8_CLKCTRL_OFFSET,
+                       .context_offs = DRA7XX_RM_L4CFG_MAILBOX8_CONTEXT_OFFSET,
+               },
+       },
+};
+
+/* mailbox9 */
+static struct omap_hwmod dra7xx_mailbox9_hwmod = {
+       .name           = "mailbox9",
+       .class          = &dra7xx_mailbox_hwmod_class,
+       .clkdm_name     = "l4cfg_clkdm",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = DRA7XX_CM_L4CFG_MAILBOX9_CLKCTRL_OFFSET,
+                       .context_offs = DRA7XX_RM_L4CFG_MAILBOX9_CONTEXT_OFFSET,
+               },
+       },
+};
+
+/* mailbox10 */
+static struct omap_hwmod dra7xx_mailbox10_hwmod = {
+       .name           = "mailbox10",
+       .class          = &dra7xx_mailbox_hwmod_class,
+       .clkdm_name     = "l4cfg_clkdm",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = DRA7XX_CM_L4CFG_MAILBOX10_CLKCTRL_OFFSET,
+                       .context_offs = DRA7XX_RM_L4CFG_MAILBOX10_CONTEXT_OFFSET,
+               },
+       },
+};
+
+/* mailbox11 */
+static struct omap_hwmod dra7xx_mailbox11_hwmod = {
+       .name           = "mailbox11",
+       .class          = &dra7xx_mailbox_hwmod_class,
+       .clkdm_name     = "l4cfg_clkdm",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = DRA7XX_CM_L4CFG_MAILBOX11_CLKCTRL_OFFSET,
+                       .context_offs = DRA7XX_RM_L4CFG_MAILBOX11_CONTEXT_OFFSET,
+               },
+       },
+};
+
+/* mailbox12 */
+static struct omap_hwmod dra7xx_mailbox12_hwmod = {
+       .name           = "mailbox12",
+       .class          = &dra7xx_mailbox_hwmod_class,
+       .clkdm_name     = "l4cfg_clkdm",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = DRA7XX_CM_L4CFG_MAILBOX12_CLKCTRL_OFFSET,
+                       .context_offs = DRA7XX_RM_L4CFG_MAILBOX12_CONTEXT_OFFSET,
+               },
+       },
+};
+
+/* mailbox13 */
+static struct omap_hwmod dra7xx_mailbox13_hwmod = {
+       .name           = "mailbox13",
+       .class          = &dra7xx_mailbox_hwmod_class,
+       .clkdm_name     = "l4cfg_clkdm",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = DRA7XX_CM_L4CFG_MAILBOX13_CLKCTRL_OFFSET,
+                       .context_offs = DRA7XX_RM_L4CFG_MAILBOX13_CONTEXT_OFFSET,
+               },
+       },
+};
+
 /*
  * 'mcspi' class
  *
@@ -1215,6 +1444,97 @@ static struct omap_hwmod dra7xx_ocp2scp1_hwmod = {
        },
 };
 
+/* ocp2scp3 */
+static struct omap_hwmod dra7xx_ocp2scp3_hwmod = {
+       .name           = "ocp2scp3",
+       .class          = &dra7xx_ocp2scp_hwmod_class,
+       .clkdm_name     = "l3init_clkdm",
+       .main_clk       = "l4_root_clk_div",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = DRA7XX_CM_L3INIT_OCP2SCP3_CLKCTRL_OFFSET,
+                       .context_offs = DRA7XX_RM_L3INIT_OCP2SCP3_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_HWCTRL,
+               },
+       },
+};
+
+/*
+ * 'PCIE' class
+ *
+ */
+
+static struct omap_hwmod_class dra7xx_pcie_hwmod_class = {
+       .name   = "pcie",
+};
+
+/* pcie1 */
+static struct omap_hwmod dra7xx_pcie1_hwmod = {
+       .name           = "pcie1",
+       .class          = &dra7xx_pcie_hwmod_class,
+       .clkdm_name     = "pcie_clkdm",
+       .main_clk       = "l4_root_clk_div",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs   = DRA7XX_CM_PCIE_CLKSTCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* pcie2 */
+static struct omap_hwmod dra7xx_pcie2_hwmod = {
+       .name           = "pcie2",
+       .class          = &dra7xx_pcie_hwmod_class,
+       .clkdm_name     = "pcie_clkdm",
+       .main_clk       = "l4_root_clk_div",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = DRA7XX_CM_PCIE_CLKSTCTRL_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/*
+ * 'PCIE PHY' class
+ *
+ */
+
+static struct omap_hwmod_class dra7xx_pcie_phy_hwmod_class = {
+       .name   = "pcie-phy",
+};
+
+/* pcie1 phy */
+static struct omap_hwmod dra7xx_pcie1_phy_hwmod = {
+       .name           = "pcie1-phy",
+       .class          = &dra7xx_pcie_phy_hwmod_class,
+       .clkdm_name     = "l3init_clkdm",
+       .main_clk       = "l4_root_clk_div",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = DRA7XX_CM_L3INIT_PCIESS1_CLKCTRL_OFFSET,
+                       .context_offs = DRA7XX_RM_L3INIT_PCIESS1_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* pcie2 phy */
+static struct omap_hwmod dra7xx_pcie2_phy_hwmod = {
+       .name           = "pcie2-phy",
+       .class          = &dra7xx_pcie_phy_hwmod_class,
+       .clkdm_name     = "l3init_clkdm",
+       .main_clk       = "l4_root_clk_div",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = DRA7XX_CM_L3INIT_PCIESS2_CLKCTRL_OFFSET,
+                       .context_offs = DRA7XX_RM_L3INIT_PCIESS2_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
 /*
  * 'qspi' class
  *
@@ -1248,6 +1568,38 @@ static struct omap_hwmod dra7xx_qspi_hwmod = {
        },
 };
 
+/*
+ * 'rtcss' class
+ *
+ */
+static struct omap_hwmod_class_sysconfig dra7xx_rtcss_sysc = {
+       .sysc_offs      = 0x0078,
+       .sysc_flags     = SYSC_HAS_SIDLEMODE,
+       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
+                          SIDLE_SMART_WKUP),
+       .sysc_fields    = &omap_hwmod_sysc_type3,
+};
+
+static struct omap_hwmod_class dra7xx_rtcss_hwmod_class = {
+       .name   = "rtcss",
+       .sysc   = &dra7xx_rtcss_sysc,
+};
+
+/* rtcss */
+static struct omap_hwmod dra7xx_rtcss_hwmod = {
+       .name           = "rtcss",
+       .class          = &dra7xx_rtcss_hwmod_class,
+       .clkdm_name     = "rtc_clkdm",
+       .main_clk       = "sys_32k_ck",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = DRA7XX_CM_RTC_RTCSS_CLKCTRL_OFFSET,
+                       .context_offs = DRA7XX_RM_RTC_RTCSS_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
 /*
  * 'sata' class
  *
@@ -2007,6 +2359,19 @@ static struct omap_hwmod_ocp_if dra7xx_l4_wkup__ctrl_module_wkup = {
        .user           = OCP_USER_MPU | OCP_USER_SDMA,
 };
 
+static struct omap_hwmod_ocp_if dra7xx_l4_per2__cpgmac0 = {
+       .master         = &dra7xx_l4_per2_hwmod,
+       .slave          = &dra7xx_gmac_hwmod,
+       .clk            = "dpll_gmac_ck",
+       .user           = OCP_USER_MPU,
+};
+
+static struct omap_hwmod_ocp_if dra7xx_gmac__mdio = {
+       .master         = &dra7xx_gmac_hwmod,
+       .slave          = &dra7xx_mdio_hwmod,
+       .user           = OCP_USER_MPU,
+};
+
 /* l4_wkup -> dcan1 */
 static struct omap_hwmod_ocp_if dra7xx_l4_wkup__dcan1 = {
        .master         = &dra7xx_l4_wkup_hwmod,
@@ -2254,6 +2619,110 @@ static struct omap_hwmod_ocp_if dra7xx_l4_per1__i2c5 = {
        .user           = OCP_USER_MPU | OCP_USER_SDMA,
 };
 
+/* l4_cfg -> mailbox1 */
+static struct omap_hwmod_ocp_if dra7xx_l4_cfg__mailbox1 = {
+       .master         = &dra7xx_l4_cfg_hwmod,
+       .slave          = &dra7xx_mailbox1_hwmod,
+       .clk            = "l3_iclk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per3 -> mailbox2 */
+static struct omap_hwmod_ocp_if dra7xx_l4_per3__mailbox2 = {
+       .master         = &dra7xx_l4_per3_hwmod,
+       .slave          = &dra7xx_mailbox2_hwmod,
+       .clk            = "l3_iclk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per3 -> mailbox3 */
+static struct omap_hwmod_ocp_if dra7xx_l4_per3__mailbox3 = {
+       .master         = &dra7xx_l4_per3_hwmod,
+       .slave          = &dra7xx_mailbox3_hwmod,
+       .clk            = "l3_iclk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per3 -> mailbox4 */
+static struct omap_hwmod_ocp_if dra7xx_l4_per3__mailbox4 = {
+       .master         = &dra7xx_l4_per3_hwmod,
+       .slave          = &dra7xx_mailbox4_hwmod,
+       .clk            = "l3_iclk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per3 -> mailbox5 */
+static struct omap_hwmod_ocp_if dra7xx_l4_per3__mailbox5 = {
+       .master         = &dra7xx_l4_per3_hwmod,
+       .slave          = &dra7xx_mailbox5_hwmod,
+       .clk            = "l3_iclk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per3 -> mailbox6 */
+static struct omap_hwmod_ocp_if dra7xx_l4_per3__mailbox6 = {
+       .master         = &dra7xx_l4_per3_hwmod,
+       .slave          = &dra7xx_mailbox6_hwmod,
+       .clk            = "l3_iclk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per3 -> mailbox7 */
+static struct omap_hwmod_ocp_if dra7xx_l4_per3__mailbox7 = {
+       .master         = &dra7xx_l4_per3_hwmod,
+       .slave          = &dra7xx_mailbox7_hwmod,
+       .clk            = "l3_iclk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per3 -> mailbox8 */
+static struct omap_hwmod_ocp_if dra7xx_l4_per3__mailbox8 = {
+       .master         = &dra7xx_l4_per3_hwmod,
+       .slave          = &dra7xx_mailbox8_hwmod,
+       .clk            = "l3_iclk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per3 -> mailbox9 */
+static struct omap_hwmod_ocp_if dra7xx_l4_per3__mailbox9 = {
+       .master         = &dra7xx_l4_per3_hwmod,
+       .slave          = &dra7xx_mailbox9_hwmod,
+       .clk            = "l3_iclk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per3 -> mailbox10 */
+static struct omap_hwmod_ocp_if dra7xx_l4_per3__mailbox10 = {
+       .master         = &dra7xx_l4_per3_hwmod,
+       .slave          = &dra7xx_mailbox10_hwmod,
+       .clk            = "l3_iclk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per3 -> mailbox11 */
+static struct omap_hwmod_ocp_if dra7xx_l4_per3__mailbox11 = {
+       .master         = &dra7xx_l4_per3_hwmod,
+       .slave          = &dra7xx_mailbox11_hwmod,
+       .clk            = "l3_iclk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per3 -> mailbox12 */
+static struct omap_hwmod_ocp_if dra7xx_l4_per3__mailbox12 = {
+       .master         = &dra7xx_l4_per3_hwmod,
+       .slave          = &dra7xx_mailbox12_hwmod,
+       .clk            = "l3_iclk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per3 -> mailbox13 */
+static struct omap_hwmod_ocp_if dra7xx_l4_per3__mailbox13 = {
+       .master         = &dra7xx_l4_per3_hwmod,
+       .slave          = &dra7xx_mailbox13_hwmod,
+       .clk            = "l3_iclk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
 /* l4_per1 -> mcspi1 */
 static struct omap_hwmod_ocp_if dra7xx_l4_per1__mcspi1 = {
        .master         = &dra7xx_l4_per1_hwmod,
@@ -2334,6 +2803,62 @@ static struct omap_hwmod_ocp_if dra7xx_l4_cfg__ocp2scp1 = {
        .user           = OCP_USER_MPU | OCP_USER_SDMA,
 };
 
+/* l4_cfg -> ocp2scp3 */
+static struct omap_hwmod_ocp_if dra7xx_l4_cfg__ocp2scp3 = {
+       .master         = &dra7xx_l4_cfg_hwmod,
+       .slave          = &dra7xx_ocp2scp3_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l3_main_1 -> pcie1 */
+static struct omap_hwmod_ocp_if dra7xx_l3_main_1__pcie1 = {
+       .master         = &dra7xx_l3_main_1_hwmod,
+       .slave          = &dra7xx_pcie1_hwmod,
+       .clk            = "l3_iclk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_cfg -> pcie1 */
+static struct omap_hwmod_ocp_if dra7xx_l4_cfg__pcie1 = {
+       .master         = &dra7xx_l4_cfg_hwmod,
+       .slave          = &dra7xx_pcie1_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l3_main_1 -> pcie2 */
+static struct omap_hwmod_ocp_if dra7xx_l3_main_1__pcie2 = {
+       .master         = &dra7xx_l3_main_1_hwmod,
+       .slave          = &dra7xx_pcie2_hwmod,
+       .clk            = "l3_iclk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_cfg -> pcie2 */
+static struct omap_hwmod_ocp_if dra7xx_l4_cfg__pcie2 = {
+       .master         = &dra7xx_l4_cfg_hwmod,
+       .slave          = &dra7xx_pcie2_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_cfg -> pcie1 phy */
+static struct omap_hwmod_ocp_if dra7xx_l4_cfg__pcie1_phy = {
+       .master         = &dra7xx_l4_cfg_hwmod,
+       .slave          = &dra7xx_pcie1_phy_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_cfg -> pcie2 phy */
+static struct omap_hwmod_ocp_if dra7xx_l4_cfg__pcie2_phy = {
+       .master         = &dra7xx_l4_cfg_hwmod,
+       .slave          = &dra7xx_pcie2_phy_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
 static struct omap_hwmod_addr_space dra7xx_qspi_addrs[] = {
        {
                .pa_start       = 0x4b300000,
@@ -2352,6 +2877,14 @@ static struct omap_hwmod_ocp_if dra7xx_l3_main_1__qspi = {
        .user           = OCP_USER_MPU | OCP_USER_SDMA,
 };
 
+/* l4_per3 -> rtcss */
+static struct omap_hwmod_ocp_if dra7xx_l4_per3__rtcss = {
+       .master         = &dra7xx_l4_per3_hwmod,
+       .slave          = &dra7xx_rtcss_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
 static struct omap_hwmod_addr_space dra7xx_sata_addrs[] = {
        {
                .name           = "sysc",
@@ -2650,6 +3183,8 @@ static struct omap_hwmod_ocp_if *dra7xx_hwmod_ocp_ifs[] __initdata = {
        &dra7xx_l4_wkup__ctrl_module_wkup,
        &dra7xx_l4_wkup__dcan1,
        &dra7xx_l4_per2__dcan2,
+       &dra7xx_l4_per2__cpgmac0,
+       &dra7xx_gmac__mdio,
        &dra7xx_l4_cfg__dma_system,
        &dra7xx_l3_main_1__dss,
        &dra7xx_l3_main_1__dispc,
@@ -2670,6 +3205,19 @@ static struct omap_hwmod_ocp_if *dra7xx_hwmod_ocp_ifs[] __initdata = {
        &dra7xx_l4_per1__i2c3,
        &dra7xx_l4_per1__i2c4,
        &dra7xx_l4_per1__i2c5,
+       &dra7xx_l4_cfg__mailbox1,
+       &dra7xx_l4_per3__mailbox2,
+       &dra7xx_l4_per3__mailbox3,
+       &dra7xx_l4_per3__mailbox4,
+       &dra7xx_l4_per3__mailbox5,
+       &dra7xx_l4_per3__mailbox6,
+       &dra7xx_l4_per3__mailbox7,
+       &dra7xx_l4_per3__mailbox8,
+       &dra7xx_l4_per3__mailbox9,
+       &dra7xx_l4_per3__mailbox10,
+       &dra7xx_l4_per3__mailbox11,
+       &dra7xx_l4_per3__mailbox12,
+       &dra7xx_l4_per3__mailbox13,
        &dra7xx_l4_per1__mcspi1,
        &dra7xx_l4_per1__mcspi2,
        &dra7xx_l4_per1__mcspi3,
@@ -2680,7 +3228,15 @@ static struct omap_hwmod_ocp_if *dra7xx_hwmod_ocp_ifs[] __initdata = {
        &dra7xx_l4_per1__mmc4,
        &dra7xx_l4_cfg__mpu,
        &dra7xx_l4_cfg__ocp2scp1,
+       &dra7xx_l4_cfg__ocp2scp3,
+       &dra7xx_l3_main_1__pcie1,
+       &dra7xx_l4_cfg__pcie1,
+       &dra7xx_l3_main_1__pcie2,
+       &dra7xx_l4_cfg__pcie2,
+       &dra7xx_l4_cfg__pcie1_phy,
+       &dra7xx_l4_cfg__pcie2_phy,
        &dra7xx_l3_main_1__qspi,
+       &dra7xx_l4_per3__rtcss,
        &dra7xx_l4_cfg__sata,
        &dra7xx_l4_cfg__smartreflex_core,
        &dra7xx_l4_cfg__smartreflex_mpu,
index 2c38c6b0ee034691faf75c1205be0bb6edcbb4e0..11ed5a17dd77976370028341990d3490fcf3bae0 100644 (file)
@@ -33,7 +33,6 @@ extern struct omap_hwmod_addr_space omap2_mcspi1_addr_space[];
 extern struct omap_hwmod_addr_space omap2_mcspi2_addr_space[];
 extern struct omap_hwmod_addr_space omap2430_mcspi3_addr_space[];
 extern struct omap_hwmod_addr_space omap2_dma_system_addrs[];
-extern struct omap_hwmod_addr_space omap2_mailbox_addrs[];
 extern struct omap_hwmod_addr_space omap2_mcbsp1_addrs[];
 extern struct omap_hwmod_addr_space omap2_hdq1w_addr_space[];
 
diff --git a/arch/arm/mach-omap2/omap_hwmod_common_ipblock_data.c b/arch/arm/mach-omap2/omap_hwmod_common_ipblock_data.c
new file mode 100644 (file)
index 0000000..f21664d
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * omap_hwmod_common_ipblock_data.c - common IP block data for OMAP2+
+ *
+ * Copyright (C) 2011 Nokia Corporation
+ * Copyright (C) 2012 Texas Instruments, Inc.
+ * Paul Walmsley
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include "omap_hwmod.h"
+#include "omap_hwmod_common_data.h"
+
+/*
+ * 'dss' class
+ * display sub-system
+ */
+
+static struct omap_hwmod_class_sysconfig omap2_dss_sysc = {
+       .rev_offs       = 0x0000,
+       .sysc_offs      = 0x0010,
+       .syss_offs      = 0x0014,
+       .sysc_flags     = (SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE |
+                          SYSS_HAS_RESET_STATUS),
+       .sysc_fields    = &omap_hwmod_sysc_type1,
+};
+
+struct omap_hwmod_class omap2_dss_hwmod_class = {
+       .name   = "dss",
+       .sysc   = &omap2_dss_sysc,
+       .reset  = omap_dss_reset,
+};
+
+/*
+ * 'rfbi' class
+ * remote frame buffer interface
+ */
+
+static struct omap_hwmod_class_sysconfig omap2_rfbi_sysc = {
+       .rev_offs       = 0x0000,
+       .sysc_offs      = 0x0010,
+       .syss_offs      = 0x0014,
+       .sysc_flags     = (SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET |
+                          SYSC_HAS_AUTOIDLE),
+       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
+       .sysc_fields    = &omap_hwmod_sysc_type1,
+};
+
+struct omap_hwmod_class omap2_rfbi_hwmod_class = {
+       .name   = "rfbi",
+       .sysc   = &omap2_rfbi_sysc,
+};
+
index a5ea988ff340a217481289a1e9626949a7c9d2fd..fe01c5a03aa242ccf3abd62bdd8d65e84ae29a27 100644 (file)
@@ -75,9 +75,9 @@ static int omap2_enter_full_retention(void)
 
        /* Clear old wake-up events */
        /* REVISIT: These write to reserved bits? */
-       omap2_prm_write_mod_reg(0xffffffff, CORE_MOD, PM_WKST1);
-       omap2_prm_write_mod_reg(0xffffffff, CORE_MOD, OMAP24XX_PM_WKST2);
-       omap2_prm_write_mod_reg(0xffffffff, WKUP_MOD, PM_WKST);
+       omap2xxx_prm_clear_mod_irqs(CORE_MOD, PM_WKST1, ~0);
+       omap2xxx_prm_clear_mod_irqs(CORE_MOD, OMAP24XX_PM_WKST2, ~0);
+       omap2xxx_prm_clear_mod_irqs(WKUP_MOD, PM_WKST, ~0);
 
        pwrdm_set_next_pwrst(core_pwrdm, PWRDM_POWER_RET);
        pwrdm_set_next_pwrst(mpu_pwrdm, PWRDM_POWER_RET);
@@ -104,23 +104,18 @@ no_sleep:
        clk_enable(osc_ck);
 
        /* clear CORE wake-up events */
-       omap2_prm_write_mod_reg(0xffffffff, CORE_MOD, PM_WKST1);
-       omap2_prm_write_mod_reg(0xffffffff, CORE_MOD, OMAP24XX_PM_WKST2);
+       omap2xxx_prm_clear_mod_irqs(CORE_MOD, PM_WKST1, ~0);
+       omap2xxx_prm_clear_mod_irqs(CORE_MOD, OMAP24XX_PM_WKST2, ~0);
 
        /* wakeup domain events - bit 1: GPT1, bit5 GPIO */
-       omap2_prm_clear_mod_reg_bits(0x4 | 0x1, WKUP_MOD, PM_WKST);
+       omap2xxx_prm_clear_mod_irqs(WKUP_MOD, PM_WKST, 0x4 | 0x1);
 
        /* MPU domain wake events */
-       l = omap2_prm_read_mod_reg(OCP_MOD, OMAP2_PRCM_IRQSTATUS_MPU_OFFSET);
-       if (l & 0x01)
-               omap2_prm_write_mod_reg(0x01, OCP_MOD,
-                                 OMAP2_PRCM_IRQSTATUS_MPU_OFFSET);
-       if (l & 0x20)
-               omap2_prm_write_mod_reg(0x20, OCP_MOD,
-                                 OMAP2_PRCM_IRQSTATUS_MPU_OFFSET);
+       omap2xxx_prm_clear_mod_irqs(OCP_MOD, OMAP2_PRCM_IRQSTATUS_MPU_OFFSET,
+                                   0x1);
 
-       /* Mask future PRCM-to-MPU interrupts */
-       omap2_prm_write_mod_reg(0x0, OCP_MOD, OMAP2_PRCM_IRQSTATUS_MPU_OFFSET);
+       omap2xxx_prm_clear_mod_irqs(OCP_MOD, OMAP2_PRCM_IRQSTATUS_MPU_OFFSET,
+                                   0x20);
 
        pwrdm_set_next_pwrst(mpu_pwrdm, PWRDM_POWER_ON);
        pwrdm_set_next_pwrst(core_pwrdm, PWRDM_POWER_ON);
@@ -148,9 +143,9 @@ static void omap2_enter_mpu_retention(void)
         * it is in retention mode. */
        if (omap2_allow_mpu_retention()) {
                /* REVISIT: These write to reserved bits? */
-               omap2_prm_write_mod_reg(0xffffffff, CORE_MOD, PM_WKST1);
-               omap2_prm_write_mod_reg(0xffffffff, CORE_MOD, OMAP24XX_PM_WKST2);
-               omap2_prm_write_mod_reg(0xffffffff, WKUP_MOD, PM_WKST);
+               omap2xxx_prm_clear_mod_irqs(CORE_MOD, PM_WKST1, ~0);
+               omap2xxx_prm_clear_mod_irqs(CORE_MOD, OMAP24XX_PM_WKST2, ~0);
+               omap2xxx_prm_clear_mod_irqs(WKUP_MOD, PM_WKST, ~0);
 
                /* Try to enter MPU retention */
                pwrdm_set_next_pwrst(mpu_pwrdm, PWRDM_POWER_RET);
@@ -249,6 +244,10 @@ static void __init prcm_setup_regs(void)
        /* Enable wake-up events */
        omap2_prm_write_mod_reg(OMAP24XX_EN_GPIOS_MASK | OMAP24XX_EN_GPT1_MASK,
                                WKUP_MOD, PM_WKEN);
+
+       /* Enable SYS_CLKEN control when all domains idle */
+       omap2_prm_set_mod_reg_bits(OMAP_AUTOEXTCLKMODE_MASK, OMAP24XX_GR_MOD,
+                                  OMAP2_PRCM_CLKSRC_CTRL_OFFSET);
 }
 
 int __init omap2_pm_init(void)
index 507d8eeaab95c3ee1a8acb9d4d6ad91b700d81f7..3f80929a5f7e80eacaaa2f8f369f1dda4c232731 100644 (file)
@@ -133,60 +133,13 @@ static void omap3_save_secure_ram_context(void)
        }
 }
 
-/*
- * PRCM Interrupt Handler Helper Function
- *
- * The purpose of this function is to clear any wake-up events latched
- * in the PRCM PM_WKST_x registers. It is possible that a wake-up event
- * may occur whilst attempting to clear a PM_WKST_x register and thus
- * set another bit in this register. A while loop is used to ensure
- * that any peripheral wake-up events occurring while attempting to
- * clear the PM_WKST_x are detected and cleared.
- */
-static int prcm_clear_mod_irqs(s16 module, u8 regs, u32 ignore_bits)
-{
-       u32 wkst, fclk, iclk, clken;
-       u16 wkst_off = (regs == 3) ? OMAP3430ES2_PM_WKST3 : PM_WKST1;
-       u16 fclk_off = (regs == 3) ? OMAP3430ES2_CM_FCLKEN3 : CM_FCLKEN1;
-       u16 iclk_off = (regs == 3) ? CM_ICLKEN3 : CM_ICLKEN1;
-       u16 grpsel_off = (regs == 3) ?
-               OMAP3430ES2_PM_MPUGRPSEL3 : OMAP3430_PM_MPUGRPSEL;
-       int c = 0;
-
-       wkst = omap2_prm_read_mod_reg(module, wkst_off);
-       wkst &= omap2_prm_read_mod_reg(module, grpsel_off);
-       wkst &= ~ignore_bits;
-       if (wkst) {
-               iclk = omap2_cm_read_mod_reg(module, iclk_off);
-               fclk = omap2_cm_read_mod_reg(module, fclk_off);
-               while (wkst) {
-                       clken = wkst;
-                       omap2_cm_set_mod_reg_bits(clken, module, iclk_off);
-                       /*
-                        * For USBHOST, we don't know whether HOST1 or
-                        * HOST2 woke us up, so enable both f-clocks
-                        */
-                       if (module == OMAP3430ES2_USBHOST_MOD)
-                               clken |= 1 << OMAP3430ES2_EN_USBHOST2_SHIFT;
-                       omap2_cm_set_mod_reg_bits(clken, module, fclk_off);
-                       omap2_prm_write_mod_reg(wkst, module, wkst_off);
-                       wkst = omap2_prm_read_mod_reg(module, wkst_off);
-                       wkst &= ~ignore_bits;
-                       c++;
-               }
-               omap2_cm_write_mod_reg(iclk, module, iclk_off);
-               omap2_cm_write_mod_reg(fclk, module, fclk_off);
-       }
-
-       return c;
-}
-
 static irqreturn_t _prcm_int_handle_io(int irq, void *unused)
 {
        int c;
 
-       c = prcm_clear_mod_irqs(WKUP_MOD, 1,
-               ~(OMAP3430_ST_IO_MASK | OMAP3430_ST_IO_CHAIN_MASK));
+       c = omap3xxx_prm_clear_mod_irqs(WKUP_MOD, 1,
+                                       ~(OMAP3430_ST_IO_MASK |
+                                         OMAP3430_ST_IO_CHAIN_MASK));
 
        return c ? IRQ_HANDLED : IRQ_NONE;
 }
@@ -200,13 +153,14 @@ static irqreturn_t _prcm_int_handle_wakeup(int irq, void *unused)
         * these are handled in a separate handler to avoid acking
         * IO events before parsing in mux code
         */
-       c = prcm_clear_mod_irqs(WKUP_MOD, 1,
-               OMAP3430_ST_IO_MASK | OMAP3430_ST_IO_CHAIN_MASK);
-       c += prcm_clear_mod_irqs(CORE_MOD, 1, 0);
-       c += prcm_clear_mod_irqs(OMAP3430_PER_MOD, 1, 0);
+       c = omap3xxx_prm_clear_mod_irqs(WKUP_MOD, 1,
+                                       OMAP3430_ST_IO_MASK |
+                                       OMAP3430_ST_IO_CHAIN_MASK);
+       c += omap3xxx_prm_clear_mod_irqs(CORE_MOD, 1, 0);
+       c += omap3xxx_prm_clear_mod_irqs(OMAP3430_PER_MOD, 1, 0);
        if (omap_rev() > OMAP3430_REV_ES1_0) {
-               c += prcm_clear_mod_irqs(CORE_MOD, 3, 0);
-               c += prcm_clear_mod_irqs(OMAP3430ES2_USBHOST_MOD, 1, 0);
+               c += omap3xxx_prm_clear_mod_irqs(CORE_MOD, 3, 0);
+               c += omap3xxx_prm_clear_mod_irqs(OMAP3430ES2_USBHOST_MOD, 1, 0);
        }
 
        return c ? IRQ_HANDLED : IRQ_NONE;
@@ -399,159 +353,11 @@ restore:
 #define omap3_pm_suspend NULL
 #endif /* CONFIG_SUSPEND */
 
-
-/**
- * omap3_iva_idle(): ensure IVA is in idle so it can be put into
- *                   retention
- *
- * In cases where IVA2 is activated by bootcode, it may prevent
- * full-chip retention or off-mode because it is not idle.  This
- * function forces the IVA2 into idle state so it can go
- * into retention/off and thus allow full-chip retention/off.
- *
- **/
-static void __init omap3_iva_idle(void)
-{
-       /* ensure IVA2 clock is disabled */
-       omap2_cm_write_mod_reg(0, OMAP3430_IVA2_MOD, CM_FCLKEN);
-
-       /* if no clock activity, nothing else to do */
-       if (!(omap2_cm_read_mod_reg(OMAP3430_IVA2_MOD, OMAP3430_CM_CLKSTST) &
-             OMAP3430_CLKACTIVITY_IVA2_MASK))
-               return;
-
-       /* Reset IVA2 */
-       omap2_prm_write_mod_reg(OMAP3430_RST1_IVA2_MASK |
-                         OMAP3430_RST2_IVA2_MASK |
-                         OMAP3430_RST3_IVA2_MASK,
-                         OMAP3430_IVA2_MOD, OMAP2_RM_RSTCTRL);
-
-       /* Enable IVA2 clock */
-       omap2_cm_write_mod_reg(OMAP3430_CM_FCLKEN_IVA2_EN_IVA2_MASK,
-                        OMAP3430_IVA2_MOD, CM_FCLKEN);
-
-       /* Set IVA2 boot mode to 'idle' */
-       omap3_ctrl_set_iva_bootmode_idle();
-
-       /* Un-reset IVA2 */
-       omap2_prm_write_mod_reg(0, OMAP3430_IVA2_MOD, OMAP2_RM_RSTCTRL);
-
-       /* Disable IVA2 clock */
-       omap2_cm_write_mod_reg(0, OMAP3430_IVA2_MOD, CM_FCLKEN);
-
-       /* Reset IVA2 */
-       omap2_prm_write_mod_reg(OMAP3430_RST1_IVA2_MASK |
-                         OMAP3430_RST2_IVA2_MASK |
-                         OMAP3430_RST3_IVA2_MASK,
-                         OMAP3430_IVA2_MOD, OMAP2_RM_RSTCTRL);
-}
-
-static void __init omap3_d2d_idle(void)
-{
-       u16 mask, padconf;
-
-       /* In a stand alone OMAP3430 where there is not a stacked
-        * modem for the D2D Idle Ack and D2D MStandby must be pulled
-        * high. S CONTROL_PADCONF_SAD2D_IDLEACK and
-        * CONTROL_PADCONF_SAD2D_MSTDBY to have a pull up. */
-       mask = (1 << 4) | (1 << 3); /* pull-up, enabled */
-       padconf = omap_ctrl_readw(OMAP3_PADCONF_SAD2D_MSTANDBY);
-       padconf |= mask;
-       omap_ctrl_writew(padconf, OMAP3_PADCONF_SAD2D_MSTANDBY);
-
-       padconf = omap_ctrl_readw(OMAP3_PADCONF_SAD2D_IDLEACK);
-       padconf |= mask;
-       omap_ctrl_writew(padconf, OMAP3_PADCONF_SAD2D_IDLEACK);
-
-       /* reset modem */
-       omap2_prm_write_mod_reg(OMAP3430_RM_RSTCTRL_CORE_MODEM_SW_RSTPWRON_MASK |
-                         OMAP3430_RM_RSTCTRL_CORE_MODEM_SW_RST_MASK,
-                         CORE_MOD, OMAP2_RM_RSTCTRL);
-       omap2_prm_write_mod_reg(0, CORE_MOD, OMAP2_RM_RSTCTRL);
-}
-
 static void __init prcm_setup_regs(void)
 {
-       u32 omap3630_en_uart4_mask = cpu_is_omap3630() ?
-                                       OMAP3630_EN_UART4_MASK : 0;
-       u32 omap3630_grpsel_uart4_mask = cpu_is_omap3630() ?
-                                       OMAP3630_GRPSEL_UART4_MASK : 0;
-
-       /* XXX This should be handled by hwmod code or SCM init code */
-       omap_ctrl_writel(OMAP3430_AUTOIDLE_MASK, OMAP2_CONTROL_SYSCONFIG);
-
-       /*
-        * Enable control of expternal oscillator through
-        * sys_clkreq. In the long run clock framework should
-        * take care of this.
-        */
-       omap2_prm_rmw_mod_reg_bits(OMAP_AUTOEXTCLKMODE_MASK,
-                            1 << OMAP_AUTOEXTCLKMODE_SHIFT,
-                            OMAP3430_GR_MOD,
-                            OMAP3_PRM_CLKSRC_CTRL_OFFSET);
-
-       /* setup wakup source */
-       omap2_prm_write_mod_reg(OMAP3430_EN_IO_MASK | OMAP3430_EN_GPIO1_MASK |
-                         OMAP3430_EN_GPT1_MASK | OMAP3430_EN_GPT12_MASK,
-                         WKUP_MOD, PM_WKEN);
-       /* No need to write EN_IO, that is always enabled */
-       omap2_prm_write_mod_reg(OMAP3430_GRPSEL_GPIO1_MASK |
-                         OMAP3430_GRPSEL_GPT1_MASK |
-                         OMAP3430_GRPSEL_GPT12_MASK,
-                         WKUP_MOD, OMAP3430_PM_MPUGRPSEL);
-
-       /* Enable PM_WKEN to support DSS LPR */
-       omap2_prm_write_mod_reg(OMAP3430_PM_WKEN_DSS_EN_DSS_MASK,
-                               OMAP3430_DSS_MOD, PM_WKEN);
-
-       /* Enable wakeups in PER */
-       omap2_prm_write_mod_reg(omap3630_en_uart4_mask |
-                         OMAP3430_EN_GPIO2_MASK | OMAP3430_EN_GPIO3_MASK |
-                         OMAP3430_EN_GPIO4_MASK | OMAP3430_EN_GPIO5_MASK |
-                         OMAP3430_EN_GPIO6_MASK | OMAP3430_EN_UART3_MASK |
-                         OMAP3430_EN_MCBSP2_MASK | OMAP3430_EN_MCBSP3_MASK |
-                         OMAP3430_EN_MCBSP4_MASK,
-                         OMAP3430_PER_MOD, PM_WKEN);
-       /* and allow them to wake up MPU */
-       omap2_prm_write_mod_reg(omap3630_grpsel_uart4_mask |
-                         OMAP3430_GRPSEL_GPIO2_MASK |
-                         OMAP3430_GRPSEL_GPIO3_MASK |
-                         OMAP3430_GRPSEL_GPIO4_MASK |
-                         OMAP3430_GRPSEL_GPIO5_MASK |
-                         OMAP3430_GRPSEL_GPIO6_MASK |
-                         OMAP3430_GRPSEL_UART3_MASK |
-                         OMAP3430_GRPSEL_MCBSP2_MASK |
-                         OMAP3430_GRPSEL_MCBSP3_MASK |
-                         OMAP3430_GRPSEL_MCBSP4_MASK,
-                         OMAP3430_PER_MOD, OMAP3430_PM_MPUGRPSEL);
-
-       /* Don't attach IVA interrupts */
-       if (omap3_has_iva()) {
-               omap2_prm_write_mod_reg(0, WKUP_MOD, OMAP3430_PM_IVAGRPSEL);
-               omap2_prm_write_mod_reg(0, CORE_MOD, OMAP3430_PM_IVAGRPSEL1);
-               omap2_prm_write_mod_reg(0, CORE_MOD, OMAP3430ES2_PM_IVAGRPSEL3);
-               omap2_prm_write_mod_reg(0, OMAP3430_PER_MOD,
-                                       OMAP3430_PM_IVAGRPSEL);
-       }
-
-       /* Clear any pending 'reset' flags */
-       omap2_prm_write_mod_reg(0xffffffff, MPU_MOD, OMAP2_RM_RSTST);
-       omap2_prm_write_mod_reg(0xffffffff, CORE_MOD, OMAP2_RM_RSTST);
-       omap2_prm_write_mod_reg(0xffffffff, OMAP3430_PER_MOD, OMAP2_RM_RSTST);
-       omap2_prm_write_mod_reg(0xffffffff, OMAP3430_EMU_MOD, OMAP2_RM_RSTST);
-       omap2_prm_write_mod_reg(0xffffffff, OMAP3430_NEON_MOD, OMAP2_RM_RSTST);
-       omap2_prm_write_mod_reg(0xffffffff, OMAP3430_DSS_MOD, OMAP2_RM_RSTST);
-       omap2_prm_write_mod_reg(0xffffffff, OMAP3430ES2_USBHOST_MOD, OMAP2_RM_RSTST);
-
-       /* Clear any pending PRCM interrupts */
-       omap2_prm_write_mod_reg(0, OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET);
-
-       /*
-        * We need to idle iva2_pwrdm even on am3703 with no iva2.
-        */
-       omap3_iva_idle();
+       omap3_ctrl_init();
 
-       omap3_d2d_idle();
+       omap3_prm_init_pm(cpu_is_omap3630(), omap3_has_iva());
 }
 
 void omap3_pm_off_mode_enable(int enable)
index 7785be984edd2dd5fd3f9208c73bc0e177b4d3a6..ad7b3e9977f8fa520b0281e3e9b876e98f7e98b3 100644 (file)
 #define AM43XX_CM_PER_USBPHYOCP2SCP0_CLKCTRL_OFFSET    0x05B8
 #define AM43XX_CM_PER_USB_OTG_SS1_CLKCTRL_OFFSET        0x0268
 #define AM43XX_CM_PER_USBPHYOCP2SCP1_CLKCTRL_OFFSET    0x05C0
+#define AM43XX_CM_PER_DSS_CLKCTRL_OFFSET               0x0a20
 
 #endif
index a3a3cca2bcc4c203a9e77fdbd134cc36fcafe957..86958050547a4a803c6a86604c6ba17b2b5011e7 100644 (file)
@@ -114,6 +114,24 @@ void omap2xxx_prm_dpll_reset(void)
        omap2_prm_read_mod_reg(WKUP_MOD, OMAP2_RM_RSTCTRL);
 }
 
+/**
+ * omap2xxx_prm_clear_mod_irqs - clear wakeup status bits for a module
+ * @module: PRM module to clear wakeups from
+ * @regs: register offset to clear
+ * @wkst_mask: wakeup status mask to clear
+ *
+ * Clears wakeup status bits for a given module, so that the device can
+ * re-enter idle.
+ */
+void omap2xxx_prm_clear_mod_irqs(s16 module, u8 regs, u32 wkst_mask)
+{
+       u32 wkst;
+
+       wkst = omap2_prm_read_mod_reg(module, regs);
+       wkst &= wkst_mask;
+       omap2_prm_write_mod_reg(wkst, module, regs);
+}
+
 int omap2xxx_clkdm_sleep(struct clockdomain *clkdm)
 {
        omap2_prm_set_mod_reg_bits(OMAP24XX_FORCESTATE_MASK,
index d2cb6365716f5565f6af33c3c2dfc7f4744f75cb..d73414139292478a99b3f35aaadb1bad0fdab0b7 100644 (file)
@@ -125,6 +125,7 @@ extern int omap2xxx_clkdm_sleep(struct clockdomain *clkdm);
 extern int omap2xxx_clkdm_wakeup(struct clockdomain *clkdm);
 
 extern void omap2xxx_prm_dpll_reset(void);
+void omap2xxx_prm_clear_mod_irqs(s16 module, u8 regs, u32 wkst_mask);
 
 extern int __init omap2xxx_prm_init(void);
 
index 4bd7a2dca8af813fcf7f893c11ce36a346fd4d32..2458be6fc67bd7ef0617aea4899164d1507077c0 100644 (file)
@@ -26,6 +26,8 @@
 #include "prm2xxx_3xxx.h"
 #include "cm2xxx_3xxx.h"
 #include "prm-regbits-34xx.h"
+#include "cm3xxx.h"
+#include "cm-regbits-34xx.h"
 
 static const struct omap_prcm_irq omap3_prcm_irqs[] = {
        OMAP_PRCM_IRQ("wkup",   0,      0),
@@ -205,6 +207,167 @@ void omap3xxx_prm_restore_irqen(u32 *saved_mask)
                                OMAP3_PRM_IRQENABLE_MPU_OFFSET);
 }
 
+/**
+ * omap3xxx_prm_clear_mod_irqs - clear wake-up events from PRCM interrupt
+ * @module: PRM module to clear wakeups from
+ * @regs: register set to clear, 1 or 3
+ * @ignore_bits: wakeup status bits to ignore
+ *
+ * The purpose of this function is to clear any wake-up events latched
+ * in the PRCM PM_WKST_x registers. It is possible that a wake-up event
+ * may occur whilst attempting to clear a PM_WKST_x register and thus
+ * set another bit in this register. A while loop is used to ensure
+ * that any peripheral wake-up events occurring while attempting to
+ * clear the PM_WKST_x are detected and cleared.
+ */
+int omap3xxx_prm_clear_mod_irqs(s16 module, u8 regs, u32 ignore_bits)
+{
+       u32 wkst, fclk, iclk, clken;
+       u16 wkst_off = (regs == 3) ? OMAP3430ES2_PM_WKST3 : PM_WKST1;
+       u16 fclk_off = (regs == 3) ? OMAP3430ES2_CM_FCLKEN3 : CM_FCLKEN1;
+       u16 iclk_off = (regs == 3) ? CM_ICLKEN3 : CM_ICLKEN1;
+       u16 grpsel_off = (regs == 3) ?
+               OMAP3430ES2_PM_MPUGRPSEL3 : OMAP3430_PM_MPUGRPSEL;
+       int c = 0;
+
+       wkst = omap2_prm_read_mod_reg(module, wkst_off);
+       wkst &= omap2_prm_read_mod_reg(module, grpsel_off);
+       wkst &= ~ignore_bits;
+       if (wkst) {
+               iclk = omap2_cm_read_mod_reg(module, iclk_off);
+               fclk = omap2_cm_read_mod_reg(module, fclk_off);
+               while (wkst) {
+                       clken = wkst;
+                       omap2_cm_set_mod_reg_bits(clken, module, iclk_off);
+                       /*
+                        * For USBHOST, we don't know whether HOST1 or
+                        * HOST2 woke us up, so enable both f-clocks
+                        */
+                       if (module == OMAP3430ES2_USBHOST_MOD)
+                               clken |= 1 << OMAP3430ES2_EN_USBHOST2_SHIFT;
+                       omap2_cm_set_mod_reg_bits(clken, module, fclk_off);
+                       omap2_prm_write_mod_reg(wkst, module, wkst_off);
+                       wkst = omap2_prm_read_mod_reg(module, wkst_off);
+                       wkst &= ~ignore_bits;
+                       c++;
+               }
+               omap2_cm_write_mod_reg(iclk, module, iclk_off);
+               omap2_cm_write_mod_reg(fclk, module, fclk_off);
+       }
+
+       return c;
+}
+
+/**
+ * omap3_prm_reset_modem - toggle reset signal for modem
+ *
+ * Toggles the reset signal to modem IP block. Required to allow
+ * OMAP3430 without stacked modem to idle properly.
+ */
+void __init omap3_prm_reset_modem(void)
+{
+       omap2_prm_write_mod_reg(
+               OMAP3430_RM_RSTCTRL_CORE_MODEM_SW_RSTPWRON_MASK |
+               OMAP3430_RM_RSTCTRL_CORE_MODEM_SW_RST_MASK,
+                               CORE_MOD, OMAP2_RM_RSTCTRL);
+       omap2_prm_write_mod_reg(0, CORE_MOD, OMAP2_RM_RSTCTRL);
+}
+
+/**
+ * omap3_prm_init_pm - initialize PM related registers for PRM
+ * @has_uart4: SoC has UART4
+ * @has_iva: SoC has IVA
+ *
+ * Initializes PRM registers for PM use. Called from PM init.
+ */
+void __init omap3_prm_init_pm(bool has_uart4, bool has_iva)
+{
+       u32 en_uart4_mask;
+       u32 grpsel_uart4_mask;
+
+       /*
+        * Enable control of expternal oscillator through
+        * sys_clkreq. In the long run clock framework should
+        * take care of this.
+        */
+       omap2_prm_rmw_mod_reg_bits(OMAP_AUTOEXTCLKMODE_MASK,
+                                  1 << OMAP_AUTOEXTCLKMODE_SHIFT,
+                                  OMAP3430_GR_MOD,
+                                  OMAP3_PRM_CLKSRC_CTRL_OFFSET);
+
+       /* setup wakup source */
+       omap2_prm_write_mod_reg(OMAP3430_EN_IO_MASK | OMAP3430_EN_GPIO1_MASK |
+                               OMAP3430_EN_GPT1_MASK | OMAP3430_EN_GPT12_MASK,
+                               WKUP_MOD, PM_WKEN);
+       /* No need to write EN_IO, that is always enabled */
+       omap2_prm_write_mod_reg(OMAP3430_GRPSEL_GPIO1_MASK |
+                               OMAP3430_GRPSEL_GPT1_MASK |
+                               OMAP3430_GRPSEL_GPT12_MASK,
+                               WKUP_MOD, OMAP3430_PM_MPUGRPSEL);
+
+       /* Enable PM_WKEN to support DSS LPR */
+       omap2_prm_write_mod_reg(OMAP3430_PM_WKEN_DSS_EN_DSS_MASK,
+                               OMAP3430_DSS_MOD, PM_WKEN);
+
+       if (has_uart4) {
+               en_uart4_mask = OMAP3630_EN_UART4_MASK;
+               grpsel_uart4_mask = OMAP3630_GRPSEL_UART4_MASK;
+       }
+
+       /* Enable wakeups in PER */
+       omap2_prm_write_mod_reg(en_uart4_mask |
+                               OMAP3430_EN_GPIO2_MASK |
+                               OMAP3430_EN_GPIO3_MASK |
+                               OMAP3430_EN_GPIO4_MASK |
+                               OMAP3430_EN_GPIO5_MASK |
+                               OMAP3430_EN_GPIO6_MASK |
+                               OMAP3430_EN_UART3_MASK |
+                               OMAP3430_EN_MCBSP2_MASK |
+                               OMAP3430_EN_MCBSP3_MASK |
+                               OMAP3430_EN_MCBSP4_MASK,
+                               OMAP3430_PER_MOD, PM_WKEN);
+
+       /* and allow them to wake up MPU */
+       omap2_prm_write_mod_reg(grpsel_uart4_mask |
+                               OMAP3430_GRPSEL_GPIO2_MASK |
+                               OMAP3430_GRPSEL_GPIO3_MASK |
+                               OMAP3430_GRPSEL_GPIO4_MASK |
+                               OMAP3430_GRPSEL_GPIO5_MASK |
+                               OMAP3430_GRPSEL_GPIO6_MASK |
+                               OMAP3430_GRPSEL_UART3_MASK |
+                               OMAP3430_GRPSEL_MCBSP2_MASK |
+                               OMAP3430_GRPSEL_MCBSP3_MASK |
+                               OMAP3430_GRPSEL_MCBSP4_MASK,
+                               OMAP3430_PER_MOD, OMAP3430_PM_MPUGRPSEL);
+
+       /* Don't attach IVA interrupts */
+       if (has_iva) {
+               omap2_prm_write_mod_reg(0, WKUP_MOD, OMAP3430_PM_IVAGRPSEL);
+               omap2_prm_write_mod_reg(0, CORE_MOD, OMAP3430_PM_IVAGRPSEL1);
+               omap2_prm_write_mod_reg(0, CORE_MOD, OMAP3430ES2_PM_IVAGRPSEL3);
+               omap2_prm_write_mod_reg(0, OMAP3430_PER_MOD,
+                                       OMAP3430_PM_IVAGRPSEL);
+       }
+
+       /* Clear any pending 'reset' flags */
+       omap2_prm_write_mod_reg(0xffffffff, MPU_MOD, OMAP2_RM_RSTST);
+       omap2_prm_write_mod_reg(0xffffffff, CORE_MOD, OMAP2_RM_RSTST);
+       omap2_prm_write_mod_reg(0xffffffff, OMAP3430_PER_MOD, OMAP2_RM_RSTST);
+       omap2_prm_write_mod_reg(0xffffffff, OMAP3430_EMU_MOD, OMAP2_RM_RSTST);
+       omap2_prm_write_mod_reg(0xffffffff, OMAP3430_NEON_MOD, OMAP2_RM_RSTST);
+       omap2_prm_write_mod_reg(0xffffffff, OMAP3430_DSS_MOD, OMAP2_RM_RSTST);
+       omap2_prm_write_mod_reg(0xffffffff, OMAP3430ES2_USBHOST_MOD,
+                               OMAP2_RM_RSTST);
+
+       /* Clear any pending PRCM interrupts */
+       omap2_prm_write_mod_reg(0, OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET);
+
+       /* We need to idle iva2_pwrdm even on am3703 with no iva2. */
+       omap3xxx_prm_iva_idle();
+
+       omap3_prm_reset_modem();
+}
+
 /**
  * omap3xxx_prm_reconfigure_io_chain - clear latches and reconfigure I/O chain
  *
@@ -276,6 +439,76 @@ static u32 omap3xxx_prm_read_reset_sources(void)
        return r;
 }
 
+/**
+ * omap3xxx_prm_iva_idle - ensure IVA is in idle so it can be put into retention
+ *
+ * In cases where IVA2 is activated by bootcode, it may prevent
+ * full-chip retention or off-mode because it is not idle.  This
+ * function forces the IVA2 into idle state so it can go
+ * into retention/off and thus allow full-chip retention/off.
+ */
+void omap3xxx_prm_iva_idle(void)
+{
+       /* ensure IVA2 clock is disabled */
+       omap2_cm_write_mod_reg(0, OMAP3430_IVA2_MOD, CM_FCLKEN);
+
+       /* if no clock activity, nothing else to do */
+       if (!(omap2_cm_read_mod_reg(OMAP3430_IVA2_MOD, OMAP3430_CM_CLKSTST) &
+             OMAP3430_CLKACTIVITY_IVA2_MASK))
+               return;
+
+       /* Reset IVA2 */
+       omap2_prm_write_mod_reg(OMAP3430_RST1_IVA2_MASK |
+                               OMAP3430_RST2_IVA2_MASK |
+                               OMAP3430_RST3_IVA2_MASK,
+                               OMAP3430_IVA2_MOD, OMAP2_RM_RSTCTRL);
+
+       /* Enable IVA2 clock */
+       omap2_cm_write_mod_reg(OMAP3430_CM_FCLKEN_IVA2_EN_IVA2_MASK,
+                              OMAP3430_IVA2_MOD, CM_FCLKEN);
+
+       /* Un-reset IVA2 */
+       omap2_prm_write_mod_reg(0, OMAP3430_IVA2_MOD, OMAP2_RM_RSTCTRL);
+
+       /* Disable IVA2 clock */
+       omap2_cm_write_mod_reg(0, OMAP3430_IVA2_MOD, CM_FCLKEN);
+
+       /* Reset IVA2 */
+       omap2_prm_write_mod_reg(OMAP3430_RST1_IVA2_MASK |
+                               OMAP3430_RST2_IVA2_MASK |
+                               OMAP3430_RST3_IVA2_MASK,
+                               OMAP3430_IVA2_MOD, OMAP2_RM_RSTCTRL);
+}
+
+/**
+ * omap3xxx_prm_clear_global_cold_reset - checks the global cold reset status
+ *                                       and clears it if asserted
+ *
+ * Checks if cold-reset has occurred and clears the status bit if yes. Returns
+ * 1 if cold-reset has occurred, 0 otherwise.
+ */
+int omap3xxx_prm_clear_global_cold_reset(void)
+{
+       if (omap2_prm_read_mod_reg(OMAP3430_GR_MOD, OMAP3_PRM_RSTST_OFFSET) &
+           OMAP3430_GLOBAL_COLD_RST_MASK) {
+               omap2_prm_set_mod_reg_bits(OMAP3430_GLOBAL_COLD_RST_MASK,
+                                          OMAP3430_GR_MOD,
+                                          OMAP3_PRM_RSTST_OFFSET);
+               return 1;
+       }
+
+       return 0;
+}
+
+void omap3_prm_save_scratchpad_contents(u32 *ptr)
+{
+       *ptr++ = omap2_prm_read_mod_reg(OMAP3430_GR_MOD,
+                                       OMAP3_PRM_CLKSRC_CTRL_OFFSET);
+
+       *ptr++ = omap2_prm_read_mod_reg(OMAP3430_GR_MOD,
+                                       OMAP3_PRM_CLKSEL_OFFSET);
+}
+
 /* Powerdomain low-level functions */
 
 static int omap3_pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst)
index 1dacfc5b19591fe24b0087bdfbf7c3524cc410c2..bc37d42a8704ce34f0adfa353441a21b1e16dc55 100644 (file)
@@ -162,6 +162,12 @@ extern void omap3xxx_prm_dpll3_reset(void);
 
 extern int __init omap3xxx_prm_init(void);
 extern u32 omap3xxx_prm_get_reset_sources(void);
+int omap3xxx_prm_clear_mod_irqs(s16 module, u8 regs, u32 ignore_bits);
+void omap3xxx_prm_iva_idle(void);
+void omap3_prm_reset_modem(void);
+int omap3xxx_prm_clear_global_cold_reset(void);
+void omap3_prm_save_scratchpad_contents(u32 *ptr);
+void omap3_prm_init_pm(bool has_uart4, bool has_iva);
 
 #endif /* __ASSEMBLER */
 
index d92a8404edc778c7c01bf82c561c5e724b8b7741..4bb50fbf29bebb5f546edf866665dcd29bb11d36 100644 (file)
 #define DRA7XX_RM_L3INIT_IEEE1500_2_OCP_CONTEXT_OFFSET         0x007c
 #define DRA7XX_PM_L3INIT_SATA_WKDEP_OFFSET                     0x0088
 #define DRA7XX_RM_L3INIT_SATA_CONTEXT_OFFSET                   0x008c
+#define DRA7XX_PM_L3INIT_PCIESS1_WKDEP_OFFSET                  0x00b0
+#define DRA7XX_RM_L3INIT_PCIESS1_CONTEXT_OFFSET                0x00b4
+#define DRA7XX_PM_L3INIT_PCIESS2_WKDEP_OFFSET                  0x00b8
+#define DRA7XX_RM_L3INIT_PCIESS2_CONTEXT_OFFSET                0x00bc
 #define DRA7XX_RM_GMAC_GMAC_CONTEXT_OFFSET                     0x00d4
 #define DRA7XX_RM_L3INIT_OCP2SCP1_CONTEXT_OFFSET               0x00e4
 #define DRA7XX_RM_L3INIT_OCP2SCP3_CONTEXT_OFFSET               0x00ec
index 25e8b8232115cab152b5f926f3ca044922b4b9d0..76ca320f007c2158cae69eb494b6215f98acbcbd 100644 (file)
@@ -472,6 +472,8 @@ static struct of_device_id omap_prcm_dt_match_table[] = {
        { .compatible = "ti,am3-scrm" },
        { .compatible = "ti,am4-prcm" },
        { .compatible = "ti,am4-scrm" },
+       { .compatible = "ti,omap2-prcm" },
+       { .compatible = "ti,omap2-scrm" },
        { .compatible = "ti,omap3-prm" },
        { .compatible = "ti,omap3-cm" },
        { .compatible = "ti,omap3-scrm" },
index e832bc7b8e2dd77042ef323d68185d8f9a7dd135..8333400898fb0e14b175fed06731e0d76304c605 100644 (file)
@@ -95,7 +95,6 @@ static int tusb_set_sync_mode(unsigned sysclk_ps)
        dev_t.t_avdp_w = t_scsnh_advnh;
        dev_t.cyc_aavdh_we = 3;
        dev_t.cyc_wpl = 6;
-       dev_t.t_ce_rdyz = 7000;
 
        gpmc_calc_timings(&t, &tusb_sync, &dev_t);
 
index 91dd1c7cdbcd7dd79638eb0930d17a9945c6a87a..06022b2357309cb2817cc5115c620054f5ab959e 100644 (file)
@@ -514,7 +514,7 @@ static struct pxa2xx_udc_mach_info udc_info __initdata = {
        .gpio_pullup            = CORGI_GPIO_USB_PULLUP,
 };
 
-#if defined(CONFIG_SPI_PXA2XX) || defined(CONFIG_SPI_PXA2XX_MASTER)
+#if IS_ENABLED(CONFIG_SPI_PXA2XX)
 static struct pxa2xx_spi_master corgi_spi_info = {
        .num_chipselect = 3,
 };
index 6f38e1af45af5d0aa901fae5cdbd8ae0d4a28bd4..630fa916bbc60601ffc94e9ca94616dbb34debe4 100644 (file)
@@ -90,19 +90,15 @@ EXPORT_SYMBOL(get_clk_frequency_khz);
  */
 static struct map_desc common_io_desc[] __initdata = {
        {       /* Devs */
-               .virtual        =  0xf2000000,
-               .pfn            = __phys_to_pfn(0x40000000),
-               .length         = 0x02000000,
-               .type           = MT_DEVICE
-       }, {    /* UNCACHED_PHYS_0 */
-               .virtual        = 0xff000000,
-               .pfn            = __phys_to_pfn(0x00000000),
-               .length         = 0x00100000,
+               .virtual        = (unsigned long)PERIPH_VIRT,
+               .pfn            = __phys_to_pfn(PERIPH_PHYS),
+               .length         = PERIPH_SIZE,
                .type           = MT_DEVICE
        }
 };
 
 void __init pxa_map_io(void)
 {
+       debug_ll_io_init();
        iotable_init(ARRAY_AND_SIZE(common_io_desc));
 }
index ccb06e485520e64cff16e0fdaffa4a2cfef74732..8d63c211b22f78ab042b9b79e001812adfc968f4 100644 (file)
@@ -19,8 +19,8 @@
  * Workarounds for at least 2 errata so far require this.
  * The mapping is set in mach-pxa/generic.c.
  */
-#define UNCACHED_PHYS_0                0xff000000
-#define UNCACHED_ADDR          UNCACHED_PHYS_0
+#define UNCACHED_PHYS_0                0xfe000000
+#define UNCACHED_PHYS_0_SIZE   0x00100000
 
 /*
  * Intel PXA2xx internal register mapping:
index f2c28972084d92e9dbb74aca91804a093534093b..66e4a2b6316ea650d02aace1fcc4dfae7e5a8909 100644 (file)
@@ -331,7 +331,12 @@ static struct map_desc pxa25x_io_desc[] __initdata = {
        {       /* Mem Ctl */
                .virtual        = (unsigned long)SMEMC_VIRT,
                .pfn            = __phys_to_pfn(PXA2XX_SMEMC_BASE),
-               .length         = 0x00200000,
+               .length         = SMEMC_SIZE,
+               .type           = MT_DEVICE
+       }, {    /* UNCACHED_PHYS_0 */
+               .virtual        = UNCACHED_PHYS_0,
+               .pfn            = __phys_to_pfn(0x00000000),
+               .length         = UNCACHED_PHYS_0_SIZE,
                .type           = MT_DEVICE
        },
 };
index 301471a07a109256fecdb054ab18f297620bfe49..b040d7d1488839085e5fb5fedf5bee29b0b15803 100644 (file)
@@ -402,12 +402,12 @@ static struct map_desc pxa27x_io_desc[] __initdata = {
        {       /* Mem Ctl */
                .virtual        = (unsigned long)SMEMC_VIRT,
                .pfn            = __phys_to_pfn(PXA2XX_SMEMC_BASE),
-               .length         = 0x00200000,
+               .length         = SMEMC_SIZE,
                .type           = MT_DEVICE
-       }, {    /* IMem ctl */
-               .virtual        =  0xfe000000,
-               .pfn            = __phys_to_pfn(0x58000000),
-               .length         = 0x00100000,
+       }, {    /* UNCACHED_PHYS_0 */
+               .virtual        = UNCACHED_PHYS_0,
+               .pfn            = __phys_to_pfn(0x00000000),
+               .length         = UNCACHED_PHYS_0_SIZE,
                .type           = MT_DEVICE
        },
 };
index 87011f3de69d6daa8e55030200c4dbfe57ffdf92..593ccd35ca9780696824fb1c5056ec0df1bc9527 100644 (file)
@@ -416,7 +416,7 @@ static struct map_desc pxa3xx_io_desc[] __initdata = {
        {       /* Mem Ctl */
                .virtual        = (unsigned long)SMEMC_VIRT,
                .pfn            = __phys_to_pfn(PXA3XX_SMEMC_BASE),
-               .length         = 0x00200000,
+               .length         = SMEMC_SIZE,
                .type           = MT_DEVICE
        }
 };
index 1e544be9905dc11abb9182b46e95ce73d8fca43b..6c5b3ffd2cd3f53900a4106696566dee2a2b9c5f 100644 (file)
@@ -157,7 +157,7 @@ pxa_cpu_do_suspend:
        @ Do not reorder...
        @ Intel PXA270 Specification Update notes problems performing
        @ external accesses after SDRAM is put in self-refresh mode
-       @ (see Errata 39 ...hangs when entering self-refresh mode)
+       @ (see Errata 38 ...hangs when entering self-refresh mode)
 
        @ force address lines low by reading at physical address 0
        ldr     r3, [r2]
index 8c1b39a0caa0cfc1af0425e7de33d261a7272e35..850e506926dfb8adbc137f652353d8d84cc40197 100644 (file)
@@ -25,6 +25,7 @@
 #include <linux/interrupt.h>
 #include <linux/amba/bus.h>
 #include <linux/amba/clcd.h>
+#include <linux/platform_data/video-clcd-versatile.h>
 #include <linux/io.h>
 #include <linux/smsc911x.h>
 #include <linux/ata_platform.h>
@@ -48,7 +49,6 @@
 #include <mach/irqs.h>
 #include <asm/hardware/timer-sp.h>
 
-#include <plat/clcd.h>
 #include <plat/sched_clock.h>
 
 #include "core.h"
index e4564c259ed11b27ea656abf72638ae4d0c98ce9..d1686696ca41d00b3292d1d0bc70a7327acd73df 100644 (file)
@@ -6,6 +6,7 @@ config ARCH_ROCKCHIP
        select ARCH_REQUIRE_GPIOLIB
        select ARM_GIC
        select CACHE_L2X0
+       select HAVE_ARM_ARCH_TIMER
        select HAVE_ARM_SCU if SMP
        select HAVE_ARM_TWD if SMP
        select DW_APB_TIMER_OF
index 4377a1436a98bc2acc67ad396d1b6bb39fa7b1cf..b29d8ead4cf296256e87c45b97c34243c977b52e 100644 (file)
@@ -1,2 +1,4 @@
+CFLAGS_platsmp.o := -march=armv7-a
+
 obj-$(CONFIG_ARCH_ROCKCHIP) += rockchip.o
 obj-$(CONFIG_SMP) += headsmp.o platsmp.o
index 910835d4ccf4abe2e0606fde60a1d13d9b619e3f..189684f55927f4c8ce1efa83b20c890adca4d935 100644 (file)
@@ -21,6 +21,7 @@
 #include <linux/of_address.h>
 
 #include <asm/cacheflush.h>
+#include <asm/cp15.h>
 #include <asm/smp_scu.h>
 #include <asm/smp_plat.h>
 #include <asm/mach/map.h>
@@ -178,8 +179,27 @@ static void __init rockchip_smp_prepare_cpus(unsigned int max_cpus)
                pmu_set_power_domain(0 + i, false);
 }
 
+#ifdef CONFIG_HOTPLUG_CPU
+static int rockchip_cpu_kill(unsigned int cpu)
+{
+       pmu_set_power_domain(0 + cpu, false);
+       return 1;
+}
+
+static void rockchip_cpu_die(unsigned int cpu)
+{
+       v7_exit_coherency_flush(louis);
+       while(1)
+               cpu_do_idle();
+}
+#endif
+
 static struct smp_operations rockchip_smp_ops __initdata = {
        .smp_prepare_cpus       = rockchip_smp_prepare_cpus,
        .smp_boot_secondary     = rockchip_boot_secondary,
+#ifdef CONFIG_HOTPLUG_CPU
+       .cpu_kill               = rockchip_cpu_kill,
+       .cpu_die                = rockchip_cpu_die,
+#endif
 };
 CPU_METHOD_OF_DECLARE(rk3066_smp, "rockchip,rk3066-smp", &rockchip_smp_ops);
index 968cc348e624bc4ebec18742e36d1e1f8eb96817..8ab9e0e7ff049bed553404ac17f3f063ab5bb601 100644 (file)
@@ -29,6 +29,7 @@ static const char * const rockchip_board_dt_compat[] = {
        "rockchip,rk3066a",
        "rockchip,rk3066b",
        "rockchip,rk3188",
+       "rockchip,rk3288",
        NULL,
 };
 
index c0763b8377455fba802441a65901649668f18846..44fa95df926286bebedf3070f196c263cad3ee0b 100644 (file)
@@ -49,9 +49,7 @@
 
 #include <plat/cpu.h>
 #include <plat/devs.h>
-#include <plat/clock.h>
 #include <plat/cpu-freq.h>
-#include <plat/pll.h>
 #include <plat/pwm-core.h>
 #include <plat/watchdog-reset.h>
 
index bd064c05c4738584e91934765347eb4f85bfdaea..28b13951de8783fb3160b486889d7c6eee798499 100644 (file)
@@ -29,7 +29,6 @@
 
 #include <plat/cpu.h>
 #include <plat/cpu-freq-core.h>
-#include <plat/clock.h>
 
 #include <mach/s3c2412.h>
 
index fbf5487ae5d1998fd5ec8f5de2df93026b3327e4..c9a99bbad5459007cdfdc91ae15d6f848bacc60b 100644 (file)
@@ -60,7 +60,6 @@
 #include <plat/cpu.h>
 #include <plat/devs.h>
 #include <plat/gpio-cfg.h>
-#include <plat/pll.h>
 #include <plat/pm.h>
 #include <plat/samsung-time.h>
 
 
 #define H1940_LATCH_BIT(x)     (1 << ((x) + 16 - S3C_GPIO_END))
 
+#define S3C24XX_PLL_MDIV_SHIFT         (12)
+#define S3C24XX_PLL_PDIV_SHIFT         (4)
+#define S3C24XX_PLL_SDIV_SHIFT         (0)
+
 static struct map_desc h1940_iodesc[] __initdata = {
        [0] = {
                .virtual        = (unsigned long)H1940_LATCH,
index bac9bb5fa2659a9332d7496d743c7901be282c8d..7804d3c6991b769eb68aa630bd495bbd53c7e820 100644 (file)
@@ -48,7 +48,6 @@
 #include <linux/mtd/partitions.h>
 
 #include <plat/gpio-cfg.h>
-#include <plat/clock.h>
 #include <plat/devs.h>
 #include <plat/cpu.h>
 #include <plat/pm.h>
index fb3b80e44595fed2629c22d0793c3545cdd8eba0..10726bf8492019133b8589c27f0a9402ecee9e8d 100644 (file)
@@ -43,7 +43,6 @@
 #include <mach/gpio-samsung.h>
 #include <mach/fb.h>
 
-#include <plat/clock.h>
 #include <plat/devs.h>
 #include <plat/cpu.h>
 #include <plat/samsung-time.h>
index fa6f30d23601d24c46e4ca2925ce6e0f1c135db2..24189e8e85605939a5bd51d34ce86a5f082c2ec6 100644 (file)
@@ -44,7 +44,6 @@
 #include <linux/platform_data/i2c-s3c2410.h>
 
 #include <plat/gpio-cfg.h>
-#include <plat/clock.h>
 #include <plat/devs.h>
 #include <plat/cpu.h>
 #include <linux/platform_data/mtd-nand-s3c2410.h>
index ef5d5ea33182f797679406baa79d8a8cfe704e15..0ed77614dcfe724baffe334093120df774740954 100644 (file)
@@ -38,7 +38,6 @@
 #include <mach/fb.h>
 #include <linux/platform_data/i2c-s3c2410.h>
 
-#include <plat/clock.h>
 #include <plat/devs.h>
 #include <plat/cpu.h>
 #include <plat/samsung-time.h>
index 9104c2be36c957fd8263b8d11ad73ca2cfa94be0..9d4f6475069887ff1b4c5addd0d276aea265d114 100644 (file)
@@ -42,7 +42,6 @@
 #include <linux/platform_data/i2c-s3c2410.h>
 #include <linux/platform_data/mtd-nand-s3c2410.h>
 
-#include <plat/clock.h>
 #include <plat/devs.h>
 #include <plat/cpu.h>
 #include <plat/samsung-time.h>
index 7eab888298836e957dd81b97ba33aeba2902ccf6..5ffe828cd659f2c6a41de1838e10e06928c95e9a 100644 (file)
@@ -41,8 +41,6 @@
 
 #include <plat/cpu.h>
 #include <plat/devs.h>
-#include <plat/clock.h>
-#include <plat/pll.h>
 #include <plat/pm.h>
 #include <plat/watchdog-reset.h>
 
@@ -83,10 +81,6 @@ void __init s3c2410_map_io(void)
        iotable_init(s3c2410_iodesc, ARRAY_SIZE(s3c2410_iodesc));
 }
 
-void __init_or_cpufreq s3c2410_setup_clocks(void)
-{
-}
-
 struct bus_type s3c2410_subsys = {
        .name = "s3c2410-core",
        .dev_name = "s3c2410-core",
index d49f52fbc842d125082f81196e2b61f6db290b63..569f3f5a6c71ea861141bbb0c94af18e882c99e4 100644 (file)
 #include <mach/regs-clock.h>
 #include <mach/regs-gpio.h>
 
-#include <plat/clock.h>
 #include <plat/cpu.h>
 #include <plat/cpu-freq.h>
 #include <plat/devs.h>
 #include <plat/nand-core.h>
-#include <plat/pll.h>
 #include <plat/pm.h>
 #include <plat/regs-spi.h>
 
@@ -171,10 +169,6 @@ void __init s3c2412_map_io(void)
        iotable_init(s3c2412_iodesc, ARRAY_SIZE(s3c2412_iodesc));
 }
 
-void __init_or_cpufreq s3c2412_setup_clocks(void)
-{
-}
-
 /* need to register the subsystem before we actually register the device, and
  * we also need to ensure that it has been initialised before any of the
  * drivers even try to use it (even if not on an s3c2412 based system)
index fb9da2b603a2d290e8753a3d7e4fa7282b656122..7b043349f1c8297c6256ac2690d924d2e59d2c81 100644 (file)
@@ -43,7 +43,6 @@
 
 #include <mach/regs-clock.h>
 
-#include <plat/clock.h>
 #include <plat/cpu.h>
 #include <plat/pm.h>
 
index 4a64bcc9eb515eb79be4cee1fd182e6254569920..d1c3e65785a1305f6c8565385ddb6fde6064ca5d 100644 (file)
 #include <mach/regs-clock.h>
 #include <mach/regs-gpio.h>
 
-#include <plat/clock.h>
 #include <plat/devs.h>
 #include <plat/cpu.h>
 #include <plat/pm.h>
-#include <plat/pll.h>
 #include <plat/nand-core.h>
 #include <plat/watchdog-reset.h>
 
@@ -78,10 +76,6 @@ void __init s3c244x_map_io(void)
        s3c2410_device_dclk.name = "s3c2440-dclk";
 }
 
-void __init_or_cpufreq s3c244x_setup_clocks(void)
-{
-}
-
 /* Since the S3C2442 and S3C2440 share items, put both subsystems here */
 
 struct bus_type s3c2440_subsys = {
index 55eb6a69655bb14e9b69b76587921e5933c7d178..60576dfbea8d42cf152cdd0aced552f10f888d27 100644 (file)
@@ -45,7 +45,6 @@
 #include <linux/platform_data/i2c-s3c2410.h>
 #include <plat/fb.h>
 
-#include <plat/clock.h>
 #include <plat/devs.h>
 #include <plat/cpu.h>
 #include <mach/regs-gpio.h>
index 4b0199fff9f59e9390c23a8a703cbf253bd40bf8..fe116334afda929958a2671ba224bb06d8fe88be 100644 (file)
@@ -58,7 +58,6 @@
 #include <linux/platform_data/spi-s3c64xx.h>
 
 #include <plat/keypad.h>
-#include <plat/clock.h>
 #include <plat/devs.h>
 #include <plat/cpu.h>
 #include <plat/adc.h>
index 72cee08c8bf53c0a929135b64546705fb40efd74..19e8feb908fdba504cda3f150202f053dbd21255 100644 (file)
@@ -39,7 +39,6 @@
 #include <plat/fb.h>
 #include <linux/platform_data/mtd-nand-s3c2410.h>
 
-#include <plat/clock.h>
 #include <plat/devs.h>
 #include <plat/cpu.h>
 #include <plat/samsung-time.h>
index 67f06a9ae656bb3c8955a480ef9298bd490b0dc8..4bae7dc49eeabe9a9602f8efda7bb06e89eb931b 100644 (file)
@@ -40,7 +40,6 @@
 #include <linux/platform_data/i2c-s3c2410.h>
 #include <plat/fb.h>
 
-#include <plat/clock.h>
 #include <plat/devs.h>
 #include <plat/cpu.h>
 #include <plat/samsung-time.h>
index 78dd6f73c072fa76c0f1e8a35b5374cec0eca918..b3d13537a7f0b2a0ce1fb3adfcd28efce08f7c3b 100644 (file)
@@ -28,7 +28,6 @@
 #include <mach/regs-gpio.h>
 #include <mach/gpio-samsung.h>
 
-#include <plat/clock.h>
 #include <plat/cpu.h>
 #include <plat/devs.h>
 #include <linux/platform_data/i2c-s3c2410.h>
index c85d1cbe769f079dfa9800829c8d072041e4d250..91074976834042646cb8a42e6d4ffe44eb1fd59c 100644 (file)
@@ -30,7 +30,6 @@
 #include <mach/hardware.h>
 #include <mach/map.h>
 
-#include <plat/clock.h>
 #include <plat/devs.h>
 #include <plat/cpu.h>
 #include <linux/platform_data/i2c-s3c2410.h>
index c6a8b2ab0240c6978e705635479f9c84c65940f3..1dc86d76b530032a75cdd644a34219909cf8f7c9 100644 (file)
@@ -63,7 +63,6 @@
 #include <plat/fb.h>
 #include <plat/gpio-cfg.h>
 
-#include <plat/clock.h>
 #include <plat/devs.h>
 #include <plat/cpu.h>
 #include <plat/adc.h>
index 8c42807bf57903ca19d64caf82448570dffee053..1ce48c54cd9c82c1fd499b03aff3f3a79fb3e653 100644 (file)
@@ -39,7 +39,6 @@
 
 #include <plat/cpu.h>
 #include <plat/devs.h>
-#include <plat/clock.h>
 #include <plat/sdhci.h>
 #include <plat/iic-core.h>
 #include <plat/onenand-core.h>
index 5be3f09bac92e3395738267b0f7574c4f6a02e3e..b2a7930548d907f265d159b30f216b362d717ad2 100644 (file)
@@ -40,7 +40,6 @@
 
 #include <plat/cpu.h>
 #include <plat/devs.h>
-#include <plat/clock.h>
 #include <plat/sdhci.h>
 #include <plat/ata-core.h>
 #include <plat/adc-core.h>
diff --git a/arch/arm/mach-s5p64x0/Kconfig b/arch/arm/mach-s5p64x0/Kconfig
deleted file mode 100644 (file)
index 26003e2..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-# arch/arm/mach-s5p64x0/Kconfig
-#
-# Copyright (c) 2009-2010 Samsung Electronics Co., Ltd.
-#              http://www.samsung.com/
-#
-# Licensed under GPLv2
-
-if ARCH_S5P64X0
-
-config CPU_S5P6440
-       bool
-       select ARM_AMBA
-       select PL330_DMA if DMADEVICES
-       select S5P_SLEEP if PM
-       select SAMSUNG_WAKEMASK if PM
-       help
-         Enable S5P6440 CPU support
-
-config CPU_S5P6450
-       bool
-       select ARM_AMBA
-       select PL330_DMA if DMADEVICES
-       select S5P_SLEEP if PM
-       select SAMSUNG_WAKEMASK if PM
-       help
-         Enable S5P6450 CPU support
-
-config S5P64X0_SETUP_FB_24BPP
-       bool
-       help
-         Common setup code for S5P64X0 based boards with a LCD display
-         through RGB interface.
-
-config S5P64X0_SETUP_I2C1
-       bool
-       help
-         Common setup code for i2c bus 1.
-
-config S5P64X0_SETUP_SPI
-       bool
-       help
-         Common setup code for SPI GPIO configurations
-
-config S5P64X0_SETUP_SDHCI_GPIO
-       bool
-       help
-         Common setup code for SDHCI gpio.
-
-# machine support
-
-config MACH_SMDK6440
-       bool "SMDK6440"
-       select CPU_S5P6440
-       select S3C_DEV_FB
-       select S3C_DEV_HSMMC
-       select S3C_DEV_HSMMC1
-       select S3C_DEV_HSMMC2
-       select S3C_DEV_I2C1
-       select S3C_DEV_RTC
-       select S3C_DEV_WDT
-       select S5P64X0_SETUP_FB_24BPP
-       select S5P64X0_SETUP_I2C1
-       select S5P64X0_SETUP_SDHCI_GPIO
-       select SAMSUNG_DEV_ADC
-       select SAMSUNG_DEV_BACKLIGHT
-       select SAMSUNG_DEV_PWM
-       select SAMSUNG_DEV_TS
-       help
-         Machine support for the Samsung SMDK6440
-
-config MACH_SMDK6450
-       bool "SMDK6450"
-       select CPU_S5P6450
-       select S3C_DEV_FB
-       select S3C_DEV_HSMMC
-       select S3C_DEV_HSMMC1
-       select S3C_DEV_HSMMC2
-       select S3C_DEV_I2C1
-       select S3C_DEV_RTC
-       select S3C_DEV_WDT
-       select S5P64X0_SETUP_FB_24BPP
-       select S5P64X0_SETUP_I2C1
-       select S5P64X0_SETUP_SDHCI_GPIO
-       select SAMSUNG_DEV_ADC
-       select SAMSUNG_DEV_BACKLIGHT
-       select SAMSUNG_DEV_PWM
-       select SAMSUNG_DEV_TS
-       help
-         Machine support for the Samsung SMDK6450
-
-menu "Use 8-bit SDHCI bus width"
-
-config S5P64X0_SD_CH1_8BIT
-       bool "SDHCI Channel 1 (Slot 1)"
-       depends on MACH_SMDK6450 || MACH_SMDK6440
-       help
-         Support SDHCI Channel 1 8-bit bus.
-         If selected, Channel 2 is disabled.
-
-endmenu
-
-endif
diff --git a/arch/arm/mach-s5p64x0/Makefile b/arch/arm/mach-s5p64x0/Makefile
deleted file mode 100644 (file)
index 12bb951..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-# arch/arm/mach-s5p64x0/Makefile
-#
-# Copyright (c) 2009-2010 Samsung Electronics Co., Ltd.
-#              http://www.samsung.com
-#
-# Licensed under GPLv2
-
-obj-y                          :=
-obj-m                          :=
-obj-n                          :=
-obj-                           :=
-
-# Core
-
-obj-y                          += common.o clock.o
-obj-$(CONFIG_CPU_S5P6440)      += clock-s5p6440.o
-obj-$(CONFIG_CPU_S5P6450)      += clock-s5p6450.o
-
-obj-$(CONFIG_PM)               += pm.o irq-pm.o
-
-obj-y                          += dma.o
-
-# machine support
-
-obj-$(CONFIG_MACH_SMDK6440)    += mach-smdk6440.o
-obj-$(CONFIG_MACH_SMDK6450)    += mach-smdk6450.o
-
-# device support
-
-obj-y                          += dev-audio.o
-
-obj-y                                  += setup-i2c0.o
-obj-$(CONFIG_S5P64X0_SETUP_I2C1)       += setup-i2c1.o
-obj-$(CONFIG_S5P64X0_SETUP_FB_24BPP)   += setup-fb-24bpp.o
-obj-$(CONFIG_S5P64X0_SETUP_SPI)                += setup-spi.o
-obj-$(CONFIG_S5P64X0_SETUP_SDHCI_GPIO) += setup-sdhci-gpio.o
diff --git a/arch/arm/mach-s5p64x0/Makefile.boot b/arch/arm/mach-s5p64x0/Makefile.boot
deleted file mode 100644 (file)
index 79ece40..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-   zreladdr-y  += 0x20008000
-params_phys-y  := 0x20000100
diff --git a/arch/arm/mach-s5p64x0/clock-s5p6440.c b/arch/arm/mach-s5p64x0/clock-s5p6440.c
deleted file mode 100644 (file)
index ae34a1d..0000000
+++ /dev/null
@@ -1,632 +0,0 @@
-/* linux/arch/arm/mach-s5p64x0/clock-s5p6440.c
- *
- * Copyright (c) 2009-2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * S5P6440 - Clock support
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#include <linux/init.h>
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/list.h>
-#include <linux/errno.h>
-#include <linux/err.h>
-#include <linux/clk.h>
-#include <linux/device.h>
-#include <linux/io.h>
-
-#include <mach/hardware.h>
-#include <mach/map.h>
-#include <mach/regs-clock.h>
-
-#include <plat/cpu-freq.h>
-#include <plat/clock.h>
-#include <plat/cpu.h>
-#include <plat/pll.h>
-#include <plat/s5p-clock.h>
-#include <plat/clock-clksrc.h>
-
-#include "clock.h"
-#include "common.h"
-
-static u32 epll_div[][5] = {
-       { 36000000,     0,      48, 1, 4 },
-       { 48000000,     0,      32, 1, 3 },
-       { 60000000,     0,      40, 1, 3 },
-       { 72000000,     0,      48, 1, 3 },
-       { 84000000,     0,      28, 1, 2 },
-       { 96000000,     0,      32, 1, 2 },
-       { 32768000,     45264,  43, 1, 4 },
-       { 45158000,     6903,   30, 1, 3 },
-       { 49152000,     50332,  32, 1, 3 },
-       { 67738000,     10398,  45, 1, 3 },
-       { 73728000,     9961,   49, 1, 3 }
-};
-
-static int s5p6440_epll_set_rate(struct clk *clk, unsigned long rate)
-{
-       unsigned int epll_con, epll_con_k;
-       unsigned int i;
-
-       if (clk->rate == rate)  /* Return if nothing changed */
-               return 0;
-
-       epll_con = __raw_readl(S5P64X0_EPLL_CON);
-       epll_con_k = __raw_readl(S5P64X0_EPLL_CON_K);
-
-       epll_con_k &= ~(PLL90XX_KDIV_MASK);
-       epll_con &= ~(PLL90XX_MDIV_MASK | PLL90XX_PDIV_MASK | PLL90XX_SDIV_MASK);
-
-       for (i = 0; i < ARRAY_SIZE(epll_div); i++) {
-                if (epll_div[i][0] == rate) {
-                       epll_con_k |= (epll_div[i][1] << PLL90XX_KDIV_SHIFT);
-                       epll_con |= (epll_div[i][2] << PLL90XX_MDIV_SHIFT) |
-                                   (epll_div[i][3] << PLL90XX_PDIV_SHIFT) |
-                                   (epll_div[i][4] << PLL90XX_SDIV_SHIFT);
-                       break;
-               }
-       }
-
-       if (i == ARRAY_SIZE(epll_div)) {
-               printk(KERN_ERR "%s: Invalid Clock EPLL Frequency\n", __func__);
-               return -EINVAL;
-       }
-
-       __raw_writel(epll_con, S5P64X0_EPLL_CON);
-       __raw_writel(epll_con_k, S5P64X0_EPLL_CON_K);
-
-       printk(KERN_WARNING "EPLL Rate changes from %lu to %lu\n",
-                       clk->rate, rate);
-
-       clk->rate = rate;
-
-       return 0;
-}
-
-static struct clk_ops s5p6440_epll_ops = {
-       .get_rate = s5p_epll_get_rate,
-       .set_rate = s5p6440_epll_set_rate,
-};
-
-static struct clksrc_clk clk_hclk = {
-       .clk    = {
-               .name           = "clk_hclk",
-               .parent         = &clk_armclk.clk,
-       },
-       .reg_div        = { .reg = S5P64X0_CLK_DIV0, .shift = 8, .size = 4 },
-};
-
-static struct clksrc_clk clk_pclk = {
-       .clk    = {
-               .name           = "clk_pclk",
-               .parent         = &clk_hclk.clk,
-       },
-       .reg_div        = { .reg = S5P64X0_CLK_DIV0, .shift = 12, .size = 4 },
-};
-static struct clksrc_clk clk_hclk_low = {
-       .clk    = {
-               .name           = "clk_hclk_low",
-       },
-       .sources        = &clkset_hclk_low,
-       .reg_src        = { .reg = S5P64X0_SYS_OTHERS, .shift = 6, .size = 1 },
-       .reg_div        = { .reg = S5P64X0_CLK_DIV3, .shift = 8, .size = 4 },
-};
-
-static struct clksrc_clk clk_pclk_low = {
-       .clk    = {
-               .name           = "clk_pclk_low",
-               .parent         = &clk_hclk_low.clk,
-       },
-       .reg_div        = { .reg = S5P64X0_CLK_DIV3, .shift = 12, .size = 4 },
-};
-
-/*
- * The following clocks will be disabled during clock initialization. It is
- * recommended to keep the following clocks disabled until the driver requests
- * for enabling the clock.
- */
-static struct clk init_clocks_off[] = {
-       {
-               .name           = "nand",
-               .parent         = &clk_hclk.clk,
-               .enable         = s5p64x0_mem_ctrl,
-               .ctrlbit        = (1 << 2),
-       }, {
-               .name           = "post",
-               .parent         = &clk_hclk_low.clk,
-               .enable         = s5p64x0_hclk0_ctrl,
-               .ctrlbit        = (1 << 5)
-       }, {
-               .name           = "2d",
-               .parent         = &clk_hclk.clk,
-               .enable         = s5p64x0_hclk0_ctrl,
-               .ctrlbit        = (1 << 8),
-       }, {
-               .name           = "dma",
-               .devname        = "dma-pl330",
-               .parent         = &clk_hclk_low.clk,
-               .enable         = s5p64x0_hclk0_ctrl,
-               .ctrlbit        = (1 << 12),
-       }, {
-               .name           = "hsmmc",
-               .devname        = "s3c-sdhci.0",
-               .parent         = &clk_hclk_low.clk,
-               .enable         = s5p64x0_hclk0_ctrl,
-               .ctrlbit        = (1 << 17),
-       }, {
-               .name           = "hsmmc",
-               .devname        = "s3c-sdhci.1",
-               .parent         = &clk_hclk_low.clk,
-               .enable         = s5p64x0_hclk0_ctrl,
-               .ctrlbit        = (1 << 18),
-       }, {
-               .name           = "hsmmc",
-               .devname        = "s3c-sdhci.2",
-               .parent         = &clk_hclk_low.clk,
-               .enable         = s5p64x0_hclk0_ctrl,
-               .ctrlbit        = (1 << 19),
-       }, {
-               .name           = "otg",
-               .parent         = &clk_hclk_low.clk,
-               .enable         = s5p64x0_hclk0_ctrl,
-               .ctrlbit        = (1 << 20)
-       }, {
-               .name           = "irom",
-               .parent         = &clk_hclk.clk,
-               .enable         = s5p64x0_hclk0_ctrl,
-               .ctrlbit        = (1 << 25),
-       }, {
-               .name           = "lcd",
-               .parent         = &clk_hclk_low.clk,
-               .enable         = s5p64x0_hclk1_ctrl,
-               .ctrlbit        = (1 << 1),
-       }, {
-               .name           = "hclk_fimgvg",
-               .parent         = &clk_hclk.clk,
-               .enable         = s5p64x0_hclk1_ctrl,
-               .ctrlbit        = (1 << 2),
-       }, {
-               .name           = "tsi",
-               .parent         = &clk_hclk_low.clk,
-               .enable         = s5p64x0_hclk1_ctrl,
-               .ctrlbit        = (1 << 0),
-       }, {
-               .name           = "watchdog",
-               .parent         = &clk_pclk_low.clk,
-               .enable         = s5p64x0_pclk_ctrl,
-               .ctrlbit        = (1 << 5),
-       }, {
-               .name           = "rtc",
-               .parent         = &clk_pclk_low.clk,
-               .enable         = s5p64x0_pclk_ctrl,
-               .ctrlbit        = (1 << 6),
-       }, {
-               .name           = "timers",
-               .parent         = &clk_pclk_low.clk,
-               .enable         = s5p64x0_pclk_ctrl,
-               .ctrlbit        = (1 << 7),
-       }, {
-               .name           = "pcm",
-               .parent         = &clk_pclk_low.clk,
-               .enable         = s5p64x0_pclk_ctrl,
-               .ctrlbit        = (1 << 8),
-       }, {
-               .name           = "adc",
-               .parent         = &clk_pclk_low.clk,
-               .enable         = s5p64x0_pclk_ctrl,
-               .ctrlbit        = (1 << 12),
-       }, {
-               .name           = "i2c",
-               .parent         = &clk_pclk_low.clk,
-               .enable         = s5p64x0_pclk_ctrl,
-               .ctrlbit        = (1 << 17),
-       }, {
-               .name           = "spi",
-               .devname        = "s5p64x0-spi.0",
-               .parent         = &clk_pclk_low.clk,
-               .enable         = s5p64x0_pclk_ctrl,
-               .ctrlbit        = (1 << 21),
-       }, {
-               .name           = "spi",
-               .devname        = "s5p64x0-spi.1",
-               .parent         = &clk_pclk_low.clk,
-               .enable         = s5p64x0_pclk_ctrl,
-               .ctrlbit        = (1 << 22),
-       }, {
-               .name           = "gps",
-               .parent         = &clk_pclk_low.clk,
-               .enable         = s5p64x0_pclk_ctrl,
-               .ctrlbit        = (1 << 25),
-       }, {
-               .name           = "dsim",
-               .parent         = &clk_pclk_low.clk,
-               .enable         = s5p64x0_pclk_ctrl,
-               .ctrlbit        = (1 << 28),
-       }, {
-               .name           = "etm",
-               .parent         = &clk_pclk.clk,
-               .enable         = s5p64x0_pclk_ctrl,
-               .ctrlbit        = (1 << 29),
-       }, {
-               .name           = "dmc0",
-               .parent         = &clk_pclk.clk,
-               .enable         = s5p64x0_pclk_ctrl,
-               .ctrlbit        = (1 << 30),
-       }, {
-               .name           = "pclk_fimgvg",
-               .parent         = &clk_pclk.clk,
-               .enable         = s5p64x0_pclk_ctrl,
-               .ctrlbit        = (1 << 31),
-       }, {
-               .name           = "mmc_48m",
-               .devname        = "s3c-sdhci.0",
-               .parent         = &clk_48m,
-               .enable         = s5p64x0_sclk_ctrl,
-               .ctrlbit        = (1 << 27),
-       }, {
-               .name           = "mmc_48m",
-               .devname        = "s3c-sdhci.1",
-               .parent         = &clk_48m,
-               .enable         = s5p64x0_sclk_ctrl,
-               .ctrlbit        = (1 << 28),
-       }, {
-               .name           = "mmc_48m",
-               .devname        = "s3c-sdhci.2",
-               .parent         = &clk_48m,
-               .enable         = s5p64x0_sclk_ctrl,
-               .ctrlbit        = (1 << 29),
-       },
-};
-
-/*
- * The following clocks will be enabled during clock initialization.
- */
-static struct clk init_clocks[] = {
-       {
-               .name           = "intc",
-               .parent         = &clk_hclk.clk,
-               .enable         = s5p64x0_hclk0_ctrl,
-               .ctrlbit        = (1 << 1),
-       }, {
-               .name           = "mem",
-               .parent         = &clk_hclk.clk,
-               .enable         = s5p64x0_hclk0_ctrl,
-               .ctrlbit        = (1 << 21),
-       }, {
-               .name           = "uart",
-               .devname        = "s3c6400-uart.0",
-               .parent         = &clk_pclk_low.clk,
-               .enable         = s5p64x0_pclk_ctrl,
-               .ctrlbit        = (1 << 1),
-       }, {
-               .name           = "uart",
-               .devname        = "s3c6400-uart.1",
-               .parent         = &clk_pclk_low.clk,
-               .enable         = s5p64x0_pclk_ctrl,
-               .ctrlbit        = (1 << 2),
-       }, {
-               .name           = "uart",
-               .devname        = "s3c6400-uart.2",
-               .parent         = &clk_pclk_low.clk,
-               .enable         = s5p64x0_pclk_ctrl,
-               .ctrlbit        = (1 << 3),
-       }, {
-               .name           = "uart",
-               .devname        = "s3c6400-uart.3",
-               .parent         = &clk_pclk_low.clk,
-               .enable         = s5p64x0_pclk_ctrl,
-               .ctrlbit        = (1 << 4),
-       }, {
-               .name           = "gpio",
-               .parent         = &clk_pclk_low.clk,
-               .enable         = s5p64x0_pclk_ctrl,
-               .ctrlbit        = (1 << 18),
-       },
-};
-
-static struct clk clk_iis_cd_v40 = {
-       .name           = "iis_cdclk_v40",
-};
-
-static struct clk clk_pcm_cd = {
-       .name           = "pcm_cdclk",
-};
-
-static struct clk *clkset_group1_list[] = {
-       &clk_mout_epll.clk,
-       &clk_dout_mpll.clk,
-       &clk_fin_epll,
-};
-
-static struct clksrc_sources clkset_group1 = {
-       .sources        = clkset_group1_list,
-       .nr_sources     = ARRAY_SIZE(clkset_group1_list),
-};
-
-static struct clk *clkset_uart_list[] = {
-       &clk_mout_epll.clk,
-       &clk_dout_mpll.clk,
-};
-
-static struct clksrc_sources clkset_uart = {
-       .sources        = clkset_uart_list,
-       .nr_sources     = ARRAY_SIZE(clkset_uart_list),
-};
-
-static struct clk *clkset_audio_list[] = {
-       &clk_mout_epll.clk,
-       &clk_dout_mpll.clk,
-       &clk_fin_epll,
-       &clk_iis_cd_v40,
-       &clk_pcm_cd,
-};
-
-static struct clksrc_sources clkset_audio = {
-       .sources        = clkset_audio_list,
-       .nr_sources     = ARRAY_SIZE(clkset_audio_list),
-};
-
-static struct clksrc_clk clksrcs[] = {
-       {
-               .clk    = {
-                       .name           = "sclk_post",
-                       .ctrlbit        = (1 << 10),
-                       .enable         = s5p64x0_sclk_ctrl,
-               },
-               .sources = &clkset_group1,
-               .reg_src = { .reg = S5P64X0_CLK_SRC0, .shift = 26, .size = 2 },
-               .reg_div = { .reg = S5P64X0_CLK_DIV1, .shift = 12, .size = 4 },
-       }, {
-               .clk    = {
-                       .name           = "sclk_dispcon",
-                       .ctrlbit        = (1 << 1),
-                       .enable         = s5p64x0_sclk1_ctrl,
-               },
-               .sources = &clkset_group1,
-               .reg_src = { .reg = S5P64X0_CLK_SRC1, .shift = 4, .size = 2 },
-               .reg_div = { .reg = S5P64X0_CLK_DIV3, .shift = 0, .size = 4 },
-       }, {
-               .clk    = {
-                       .name           = "sclk_fimgvg",
-                       .ctrlbit        = (1 << 2),
-                       .enable         = s5p64x0_sclk1_ctrl,
-               },
-               .sources = &clkset_group1,
-               .reg_src = { .reg = S5P64X0_CLK_SRC1, .shift = 8, .size = 2 },
-               .reg_div = { .reg = S5P64X0_CLK_DIV3, .shift = 4, .size = 4 },
-       },
-};
-
-static struct clksrc_clk clk_sclk_mmc0 = {
-       .clk    = {
-               .name           = "sclk_mmc",
-               .devname        = "s3c-sdhci.0",
-               .ctrlbit        = (1 << 24),
-               .enable         = s5p64x0_sclk_ctrl,
-       },
-       .sources = &clkset_group1,
-       .reg_src = { .reg = S5P64X0_CLK_SRC0, .shift = 18, .size = 2 },
-       .reg_div = { .reg = S5P64X0_CLK_DIV1, .shift = 0, .size = 4 },
-};
-
-static struct clksrc_clk clk_sclk_mmc1 = {
-       .clk    = {
-               .name           = "sclk_mmc",
-               .devname        = "s3c-sdhci.1",
-               .ctrlbit        = (1 << 25),
-               .enable         = s5p64x0_sclk_ctrl,
-       },
-       .sources = &clkset_group1,
-       .reg_src = { .reg = S5P64X0_CLK_SRC0, .shift = 20, .size = 2 },
-       .reg_div = { .reg = S5P64X0_CLK_DIV1, .shift = 4, .size = 4 },
-};
-
-static struct clksrc_clk clk_sclk_mmc2 = {
-       .clk    = {
-               .name           = "sclk_mmc",
-               .devname        = "s3c-sdhci.2",
-               .ctrlbit        = (1 << 26),
-               .enable         = s5p64x0_sclk_ctrl,
-       },
-       .sources = &clkset_group1,
-       .reg_src = { .reg = S5P64X0_CLK_SRC0, .shift = 22, .size = 2 },
-       .reg_div = { .reg = S5P64X0_CLK_DIV1, .shift = 8, .size = 4 },
-};
-
-static struct clksrc_clk clk_sclk_uclk = {
-       .clk    = {
-               .name           = "uclk1",
-               .ctrlbit        = (1 << 5),
-               .enable         = s5p64x0_sclk_ctrl,
-       },
-       .sources = &clkset_uart,
-       .reg_src = { .reg = S5P64X0_CLK_SRC0, .shift = 13, .size = 1 },
-       .reg_div = { .reg = S5P64X0_CLK_DIV2, .shift = 16, .size = 4 },
-};
-
-static struct clk clk_i2s0 = {
-       .name           = "iis",
-       .devname        = "samsung-i2s.0",
-       .parent         = &clk_pclk_low.clk,
-       .enable         = s5p64x0_pclk_ctrl,
-       .ctrlbit        = (1 << 26),
-};
-
-static struct clksrc_clk clk_audio_bus2 = {
-       .clk    = {
-               .name           = "sclk_audio2",
-               .devname        = "samsung-i2s.0",
-               .ctrlbit        = (1 << 11),
-               .enable         = s5p64x0_sclk_ctrl,
-       },
-       .sources = &clkset_audio,
-       .reg_src = { .reg = S5P64X0_CLK_SRC1, .shift = 0, .size = 3 },
-       .reg_div = { .reg = S5P64X0_CLK_DIV2, .shift = 24, .size = 4 },
-};
-
-static struct clksrc_clk clk_sclk_spi0 = {
-       .clk    = {
-               .name           = "sclk_spi",
-               .devname        = "s5p64x0-spi.0",
-               .ctrlbit        = (1 << 20),
-               .enable         = s5p64x0_sclk_ctrl,
-       },
-       .sources = &clkset_group1,
-       .reg_src = { .reg = S5P64X0_CLK_SRC0, .shift = 14, .size = 2 },
-       .reg_div = { .reg = S5P64X0_CLK_DIV2, .shift = 0, .size = 4 },
-};
-
-static struct clksrc_clk clk_sclk_spi1 = {
-       .clk    = {
-               .name           = "sclk_spi",
-               .devname        = "s5p64x0-spi.1",
-               .ctrlbit        = (1 << 21),
-               .enable         = s5p64x0_sclk_ctrl,
-       },
-       .sources = &clkset_group1,
-       .reg_src = { .reg = S5P64X0_CLK_SRC0, .shift = 16, .size = 2 },
-       .reg_div = { .reg = S5P64X0_CLK_DIV2, .shift = 4, .size = 4 },
-};
-
-/* Clock initialization code */
-static struct clksrc_clk *sysclks[] = {
-       &clk_mout_apll,
-       &clk_mout_epll,
-       &clk_mout_mpll,
-       &clk_dout_mpll,
-       &clk_armclk,
-       &clk_hclk,
-       &clk_pclk,
-       &clk_hclk_low,
-       &clk_pclk_low,
-};
-
-static struct clk dummy_apb_pclk = {
-       .name           = "apb_pclk",
-       .id             = -1,
-};
-
-static struct clk *clk_cdev[] = {
-       &clk_i2s0,
-};
-
-static struct clksrc_clk *clksrc_cdev[] = {
-       &clk_sclk_uclk,
-       &clk_sclk_spi0,
-       &clk_sclk_spi1,
-       &clk_sclk_mmc0,
-       &clk_sclk_mmc1,
-       &clk_sclk_mmc2,
-       &clk_audio_bus2,
-};
-
-static struct clk_lookup s5p6440_clk_lookup[] = {
-       CLKDEV_INIT(NULL, "clk_uart_baud2", &clk_pclk_low.clk),
-       CLKDEV_INIT(NULL, "clk_uart_baud3", &clk_sclk_uclk.clk),
-       CLKDEV_INIT(NULL, "spi_busclk0", &clk_p),
-       CLKDEV_INIT("s5p64x0-spi.0", "spi_busclk1", &clk_sclk_spi0.clk),
-       CLKDEV_INIT("s5p64x0-spi.1", "spi_busclk1", &clk_sclk_spi1.clk),
-       CLKDEV_INIT("s3c-sdhci.0", "mmc_busclk.2", &clk_sclk_mmc0.clk),
-       CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.2", &clk_sclk_mmc1.clk),
-       CLKDEV_INIT("s3c-sdhci.2", "mmc_busclk.2", &clk_sclk_mmc2.clk),
-       CLKDEV_INIT("samsung-i2s.0", "i2s_opclk0", &clk_i2s0),
-       CLKDEV_INIT("samsung-i2s.0", "i2s_opclk1", &clk_audio_bus2.clk),
-};
-
-void __init_or_cpufreq s5p6440_setup_clocks(void)
-{
-       struct clk *xtal_clk;
-
-       unsigned long xtal;
-       unsigned long fclk;
-       unsigned long hclk;
-       unsigned long hclk_low;
-       unsigned long pclk;
-       unsigned long pclk_low;
-
-       unsigned long apll;
-       unsigned long mpll;
-       unsigned long epll;
-       unsigned int ptr;
-
-       /* Set S5P6440 functions for clk_fout_epll */
-
-       clk_fout_epll.enable = s5p_epll_enable;
-       clk_fout_epll.ops = &s5p6440_epll_ops;
-
-       clk_48m.enable = s5p64x0_clk48m_ctrl;
-
-       xtal_clk = clk_get(NULL, "ext_xtal");
-       BUG_ON(IS_ERR(xtal_clk));
-
-       xtal = clk_get_rate(xtal_clk);
-       clk_put(xtal_clk);
-
-       apll = s5p_get_pll45xx(xtal, __raw_readl(S5P64X0_APLL_CON), pll_4502);
-       mpll = s5p_get_pll45xx(xtal, __raw_readl(S5P64X0_MPLL_CON), pll_4502);
-       epll = s5p_get_pll90xx(xtal, __raw_readl(S5P64X0_EPLL_CON),
-                               __raw_readl(S5P64X0_EPLL_CON_K));
-
-       clk_fout_apll.rate = apll;
-       clk_fout_mpll.rate = mpll;
-       clk_fout_epll.rate = epll;
-
-       printk(KERN_INFO "S5P6440: PLL settings, A=%ld.%ldMHz, M=%ld.%ldMHz," \
-                       " E=%ld.%ldMHz\n",
-                       print_mhz(apll), print_mhz(mpll), print_mhz(epll));
-
-       fclk = clk_get_rate(&clk_armclk.clk);
-       hclk = clk_get_rate(&clk_hclk.clk);
-       pclk = clk_get_rate(&clk_pclk.clk);
-       hclk_low = clk_get_rate(&clk_hclk_low.clk);
-       pclk_low = clk_get_rate(&clk_pclk_low.clk);
-
-       printk(KERN_INFO "S5P6440: HCLK=%ld.%ldMHz, HCLK_LOW=%ld.%ldMHz," \
-                       " PCLK=%ld.%ldMHz, PCLK_LOW=%ld.%ldMHz\n",
-                       print_mhz(hclk), print_mhz(hclk_low),
-                       print_mhz(pclk), print_mhz(pclk_low));
-
-       clk_f.rate = fclk;
-       clk_h.rate = hclk;
-       clk_p.rate = pclk;
-
-       for (ptr = 0; ptr < ARRAY_SIZE(clksrcs); ptr++)
-               s3c_set_clksrc(&clksrcs[ptr], true);
-}
-
-static struct clk *clks[] __initdata = {
-       &clk_ext,
-       &clk_iis_cd_v40,
-       &clk_pcm_cd,
-};
-
-void __init s5p6440_register_clocks(void)
-{
-       int ptr;
-       unsigned int cnt;
-
-       s3c24xx_register_clocks(clks, ARRAY_SIZE(clks));
-
-       for (ptr = 0; ptr < ARRAY_SIZE(sysclks); ptr++)
-               s3c_register_clksrc(sysclks[ptr], 1);
-
-       s3c24xx_register_clocks(clk_cdev, ARRAY_SIZE(clk_cdev));
-       for (cnt = 0; cnt < ARRAY_SIZE(clk_cdev); cnt++)
-               s3c_disable_clocks(clk_cdev[cnt], 1);
-
-       s3c_register_clksrc(clksrcs, ARRAY_SIZE(clksrcs));
-       s3c_register_clocks(init_clocks, ARRAY_SIZE(init_clocks));
-       for (ptr = 0; ptr < ARRAY_SIZE(clksrc_cdev); ptr++)
-               s3c_register_clksrc(clksrc_cdev[ptr], 1);
-
-       s3c_register_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off));
-       s3c_disable_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off));
-       clkdev_add_table(s5p6440_clk_lookup, ARRAY_SIZE(s5p6440_clk_lookup));
-
-       s3c24xx_register_clock(&dummy_apb_pclk);
-}
diff --git a/arch/arm/mach-s5p64x0/clock-s5p6450.c b/arch/arm/mach-s5p64x0/clock-s5p6450.c
deleted file mode 100644 (file)
index 0b3ca2e..0000000
+++ /dev/null
@@ -1,701 +0,0 @@
-/* linux/arch/arm/mach-s5p64x0/clock-s5p6450.c
- *
- * Copyright (c) 2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * S5P6450 - Clock support
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#include <linux/init.h>
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/list.h>
-#include <linux/errno.h>
-#include <linux/err.h>
-#include <linux/clk.h>
-#include <linux/device.h>
-#include <linux/io.h>
-
-#include <mach/hardware.h>
-#include <mach/map.h>
-#include <mach/regs-clock.h>
-
-#include <plat/cpu-freq.h>
-#include <plat/clock.h>
-#include <plat/cpu.h>
-#include <plat/pll.h>
-#include <plat/s5p-clock.h>
-#include <plat/clock-clksrc.h>
-
-#include "clock.h"
-#include "common.h"
-
-static struct clksrc_clk clk_mout_dpll = {
-       .clk    = {
-               .name           = "mout_dpll",
-       },
-       .sources        = &clk_src_dpll,
-       .reg_src        = { .reg = S5P64X0_CLK_SRC0, .shift = 5, .size = 1 },
-};
-
-static u32 epll_div[][5] = {
-       { 133000000,    27307,  55, 2, 2 },
-       { 100000000,    43691,  41, 2, 2 },
-       { 480000000,    0,      80, 2, 0 },
-};
-
-static int s5p6450_epll_set_rate(struct clk *clk, unsigned long rate)
-{
-       unsigned int epll_con, epll_con_k;
-       unsigned int i;
-
-       if (clk->rate == rate)  /* Return if nothing changed */
-               return 0;
-
-       epll_con = __raw_readl(S5P64X0_EPLL_CON);
-       epll_con_k = __raw_readl(S5P64X0_EPLL_CON_K);
-
-       epll_con_k &= ~(PLL90XX_KDIV_MASK);
-       epll_con &= ~(PLL90XX_MDIV_MASK | PLL90XX_PDIV_MASK | PLL90XX_SDIV_MASK);
-
-       for (i = 0; i < ARRAY_SIZE(epll_div); i++) {
-                if (epll_div[i][0] == rate) {
-                       epll_con_k |= (epll_div[i][1] << PLL90XX_KDIV_SHIFT);
-                       epll_con |= (epll_div[i][2] << PLL90XX_MDIV_SHIFT) |
-                                   (epll_div[i][3] << PLL90XX_PDIV_SHIFT) |
-                                   (epll_div[i][4] << PLL90XX_SDIV_SHIFT);
-                       break;
-               }
-       }
-
-       if (i == ARRAY_SIZE(epll_div)) {
-               printk(KERN_ERR "%s: Invalid Clock EPLL Frequency\n", __func__);
-               return -EINVAL;
-       }
-
-       __raw_writel(epll_con, S5P64X0_EPLL_CON);
-       __raw_writel(epll_con_k, S5P64X0_EPLL_CON_K);
-
-       printk(KERN_WARNING "EPLL Rate changes from %lu to %lu\n",
-                       clk->rate, rate);
-
-       clk->rate = rate;
-
-       return 0;
-}
-
-static struct clk_ops s5p6450_epll_ops = {
-       .get_rate = s5p_epll_get_rate,
-       .set_rate = s5p6450_epll_set_rate,
-};
-
-static struct clksrc_clk clk_dout_epll = {
-       .clk    = {
-               .name           = "dout_epll",
-               .parent         = &clk_mout_epll.clk,
-       },
-       .reg_div        = { .reg = S5P64X0_CLK_DIV1, .shift = 24, .size = 4 },
-};
-
-static struct clksrc_clk clk_mout_hclk_sel = {
-       .clk    = {
-               .name           = "mout_hclk_sel",
-       },
-       .sources        = &clkset_hclk_low,
-       .reg_src        = { .reg = S5P64X0_OTHERS, .shift = 15, .size = 1 },
-};
-
-static struct clk *clkset_hclk_list[] = {
-       &clk_mout_hclk_sel.clk,
-       &clk_armclk.clk,
-};
-
-static struct clksrc_sources clkset_hclk = {
-       .sources        = clkset_hclk_list,
-       .nr_sources     = ARRAY_SIZE(clkset_hclk_list),
-};
-
-static struct clksrc_clk clk_hclk = {
-       .clk    = {
-               .name           = "clk_hclk",
-       },
-       .sources        = &clkset_hclk,
-       .reg_src        = { .reg = S5P64X0_OTHERS, .shift = 14, .size = 1 },
-       .reg_div        = { .reg = S5P64X0_CLK_DIV0, .shift = 8, .size = 4 },
-};
-
-static struct clksrc_clk clk_pclk = {
-       .clk    = {
-               .name           = "clk_pclk",
-               .parent         = &clk_hclk.clk,
-       },
-       .reg_div = { .reg = S5P64X0_CLK_DIV0, .shift = 12, .size = 4 },
-};
-static struct clksrc_clk clk_dout_pwm_ratio0 = {
-       .clk    = {
-               .name           = "clk_dout_pwm_ratio0",
-               .parent         = &clk_mout_hclk_sel.clk,
-       },
-       .reg_div        = { .reg = S5P64X0_CLK_DIV3, .shift = 16, .size = 4 },
-};
-
-static struct clksrc_clk clk_pclk_to_wdt_pwm = {
-       .clk    = {
-               .name           = "clk_pclk_to_wdt_pwm",
-               .parent         = &clk_dout_pwm_ratio0.clk,
-       },
-       .reg_div        = { .reg = S5P64X0_CLK_DIV3, .shift = 20, .size = 4 },
-};
-
-static struct clksrc_clk clk_hclk_low = {
-       .clk    = {
-               .name           = "clk_hclk_low",
-       },
-       .sources        = &clkset_hclk_low,
-       .reg_src        = { .reg = S5P64X0_OTHERS, .shift = 6, .size = 1 },
-       .reg_div        = { .reg = S5P64X0_CLK_DIV3, .shift = 8, .size = 4 },
-};
-
-static struct clksrc_clk clk_pclk_low = {
-       .clk    = {
-               .name           = "clk_pclk_low",
-               .parent         = &clk_hclk_low.clk,
-       },
-       .reg_div        = { .reg = S5P64X0_CLK_DIV3, .shift = 12, .size = 4 },
-};
-
-/*
- * The following clocks will be disabled during clock initialization. It is
- * recommended to keep the following clocks disabled until the driver requests
- * for enabling the clock.
- */
-static struct clk init_clocks_off[] = {
-       {
-               .name           = "usbhost",
-               .parent         = &clk_hclk_low.clk,
-               .enable         = s5p64x0_hclk0_ctrl,
-               .ctrlbit        = (1 << 3),
-       }, {
-               .name           = "dma",
-               .devname        = "dma-pl330",
-               .parent         = &clk_hclk_low.clk,
-               .enable         = s5p64x0_hclk0_ctrl,
-               .ctrlbit        = (1 << 12),
-       }, {
-               .name           = "hsmmc",
-               .devname        = "s3c-sdhci.0",
-               .parent         = &clk_hclk_low.clk,
-               .enable         = s5p64x0_hclk0_ctrl,
-               .ctrlbit        = (1 << 17),
-       }, {
-               .name           = "hsmmc",
-               .devname        = "s3c-sdhci.1",
-               .parent         = &clk_hclk_low.clk,
-               .enable         = s5p64x0_hclk0_ctrl,
-               .ctrlbit        = (1 << 18),
-       }, {
-               .name           = "hsmmc",
-               .devname        = "s3c-sdhci.2",
-               .parent         = &clk_hclk_low.clk,
-               .enable         = s5p64x0_hclk0_ctrl,
-               .ctrlbit        = (1 << 19),
-       }, {
-               .name           = "usbotg",
-               .parent         = &clk_hclk_low.clk,
-               .enable         = s5p64x0_hclk0_ctrl,
-               .ctrlbit        = (1 << 20),
-       }, {
-               .name           = "lcd",
-               .parent         = &clk_h,
-               .enable         = s5p64x0_hclk1_ctrl,
-               .ctrlbit        = (1 << 1),
-       }, {
-               .name           = "watchdog",
-               .parent         = &clk_pclk_low.clk,
-               .enable         = s5p64x0_pclk_ctrl,
-               .ctrlbit        = (1 << 5),
-       }, {
-               .name           = "rtc",
-               .parent         = &clk_pclk_low.clk,
-               .enable         = s5p64x0_pclk_ctrl,
-               .ctrlbit        = (1 << 6),
-       }, {
-               .name           = "adc",
-               .parent         = &clk_pclk_low.clk,
-               .enable         = s5p64x0_pclk_ctrl,
-               .ctrlbit        = (1 << 12),
-       }, {
-               .name           = "i2c",
-               .devname        = "s3c2440-i2c.0",
-               .parent         = &clk_pclk_low.clk,
-               .enable         = s5p64x0_pclk_ctrl,
-               .ctrlbit        = (1 << 17),
-       }, {
-               .name           = "spi",
-               .devname        = "s5p64x0-spi.0",
-               .parent         = &clk_pclk_low.clk,
-               .enable         = s5p64x0_pclk_ctrl,
-               .ctrlbit        = (1 << 21),
-       }, {
-               .name           = "spi",
-               .devname        = "s5p64x0-spi.1",
-               .parent         = &clk_pclk_low.clk,
-               .enable         = s5p64x0_pclk_ctrl,
-               .ctrlbit        = (1 << 22),
-       }, {
-               .name           = "i2c",
-               .devname        = "s3c2440-i2c.1",
-               .parent         = &clk_pclk_low.clk,
-               .enable         = s5p64x0_pclk_ctrl,
-               .ctrlbit        = (1 << 27),
-       }, {
-               .name           = "dmc0",
-               .parent         = &clk_pclk.clk,
-               .enable         = s5p64x0_pclk_ctrl,
-               .ctrlbit        = (1 << 30),
-       }
-};
-
-/*
- * The following clocks will be enabled during clock initialization.
- */
-static struct clk init_clocks[] = {
-       {
-               .name           = "intc",
-               .parent         = &clk_hclk.clk,
-               .enable         = s5p64x0_hclk0_ctrl,
-               .ctrlbit        = (1 << 1),
-       }, {
-               .name           = "mem",
-               .parent         = &clk_hclk.clk,
-               .enable         = s5p64x0_hclk0_ctrl,
-               .ctrlbit        = (1 << 21),
-       }, {
-               .name           = "uart",
-               .devname        = "s3c6400-uart.0",
-               .parent         = &clk_pclk_low.clk,
-               .enable         = s5p64x0_pclk_ctrl,
-               .ctrlbit        = (1 << 1),
-       }, {
-               .name           = "uart",
-               .devname        = "s3c6400-uart.1",
-               .parent         = &clk_pclk_low.clk,
-               .enable         = s5p64x0_pclk_ctrl,
-               .ctrlbit        = (1 << 2),
-       }, {
-               .name           = "uart",
-               .devname        = "s3c6400-uart.2",
-               .parent         = &clk_pclk_low.clk,
-               .enable         = s5p64x0_pclk_ctrl,
-               .ctrlbit        = (1 << 3),
-       }, {
-               .name           = "uart",
-               .devname        = "s3c6400-uart.3",
-               .parent         = &clk_pclk_low.clk,
-               .enable         = s5p64x0_pclk_ctrl,
-               .ctrlbit        = (1 << 4),
-       }, {
-               .name           = "timers",
-               .parent         = &clk_pclk_to_wdt_pwm.clk,
-               .enable         = s5p64x0_pclk_ctrl,
-               .ctrlbit        = (1 << 7),
-       }, {
-               .name           = "gpio",
-               .parent         = &clk_pclk_low.clk,
-               .enable         = s5p64x0_pclk_ctrl,
-               .ctrlbit        = (1 << 18),
-       },
-};
-
-static struct clk *clkset_uart_list[] = {
-       &clk_dout_epll.clk,
-       &clk_dout_mpll.clk,
-};
-
-static struct clksrc_sources clkset_uart = {
-       .sources        = clkset_uart_list,
-       .nr_sources     = ARRAY_SIZE(clkset_uart_list),
-};
-
-static struct clk *clkset_mali_list[] = {
-       &clk_mout_epll.clk,
-       &clk_mout_apll.clk,
-       &clk_mout_mpll.clk,
-};
-
-static struct clksrc_sources clkset_mali = {
-       .sources        = clkset_mali_list,
-       .nr_sources     = ARRAY_SIZE(clkset_mali_list),
-};
-
-static struct clk *clkset_group2_list[] = {
-       &clk_dout_epll.clk,
-       &clk_dout_mpll.clk,
-       &clk_ext_xtal_mux,
-};
-
-static struct clksrc_sources clkset_group2 = {
-       .sources        = clkset_group2_list,
-       .nr_sources     = ARRAY_SIZE(clkset_group2_list),
-};
-
-static struct clk *clkset_dispcon_list[] = {
-       &clk_dout_epll.clk,
-       &clk_dout_mpll.clk,
-       &clk_ext_xtal_mux,
-       &clk_mout_dpll.clk,
-};
-
-static struct clksrc_sources clkset_dispcon = {
-       .sources        = clkset_dispcon_list,
-       .nr_sources     = ARRAY_SIZE(clkset_dispcon_list),
-};
-
-static struct clk *clkset_hsmmc44_list[] = {
-       &clk_dout_epll.clk,
-       &clk_dout_mpll.clk,
-       &clk_ext_xtal_mux,
-       &s5p_clk_27m,
-       &clk_48m,
-};
-
-static struct clksrc_sources clkset_hsmmc44 = {
-       .sources        = clkset_hsmmc44_list,
-       .nr_sources     = ARRAY_SIZE(clkset_hsmmc44_list),
-};
-
-static struct clk *clkset_sclk_audio0_list[] = {
-       [0] = &clk_dout_epll.clk,
-       [1] = &clk_dout_mpll.clk,
-       [2] = &clk_ext_xtal_mux,
-       [3] = NULL,
-       [4] = NULL,
-};
-
-static struct clksrc_sources clkset_sclk_audio0 = {
-       .sources        = clkset_sclk_audio0_list,
-       .nr_sources     = ARRAY_SIZE(clkset_sclk_audio0_list),
-};
-
-static struct clksrc_clk clk_sclk_audio0 = {
-       .clk            = {
-               .name           = "audio-bus",
-               .devname        = "samsung-i2s.0",
-               .enable         = s5p64x0_sclk_ctrl,
-               .ctrlbit        = (1 << 8),
-               .parent         = &clk_dout_epll.clk,
-       },
-       .sources        = &clkset_sclk_audio0,
-       .reg_src        = { .reg = S5P64X0_CLK_SRC1, .shift = 10, .size = 3 },
-       .reg_div        = { .reg = S5P64X0_CLK_DIV2, .shift = 8, .size = 4 },
-};
-
-static struct clksrc_clk clksrcs[] = {
-       {
-               .clk    = {
-                       .name           = "sclk_fimc",
-                       .ctrlbit        = (1 << 10),
-                       .enable         = s5p64x0_sclk_ctrl,
-               },
-               .sources = &clkset_group2,
-               .reg_src = { .reg = S5P64X0_CLK_SRC0, .shift = 26, .size = 2 },
-               .reg_div = { .reg = S5P64X0_CLK_DIV1, .shift = 12, .size = 4 },
-       }, {
-               .clk    = {
-                       .name           = "aclk_mali",
-                       .ctrlbit        = (1 << 2),
-                       .enable         = s5p64x0_sclk1_ctrl,
-               },
-               .sources = &clkset_mali,
-               .reg_src = { .reg = S5P64X0_CLK_SRC1, .shift = 8, .size = 2 },
-               .reg_div = { .reg = S5P64X0_CLK_DIV3, .shift = 4, .size = 4 },
-       }, {
-               .clk    = {
-                       .name           = "sclk_2d",
-                       .ctrlbit        = (1 << 12),
-                       .enable         = s5p64x0_sclk_ctrl,
-               },
-               .sources = &clkset_mali,
-               .reg_src = { .reg = S5P64X0_CLK_SRC0, .shift = 30, .size = 2 },
-               .reg_div = { .reg = S5P64X0_CLK_DIV2, .shift = 20, .size = 4 },
-       }, {
-               .clk    = {
-                       .name           = "sclk_usi",
-                       .ctrlbit        = (1 << 7),
-                       .enable         = s5p64x0_sclk_ctrl,
-               },
-               .sources = &clkset_group2,
-               .reg_src = { .reg = S5P64X0_CLK_SRC0, .shift = 10, .size = 2 },
-               .reg_div = { .reg = S5P64X0_CLK_DIV1, .shift = 16, .size = 4 },
-       }, {
-               .clk    = {
-                       .name           = "sclk_camif",
-                       .ctrlbit        = (1 << 6),
-                       .enable         = s5p64x0_sclk_ctrl,
-               },
-               .sources = &clkset_group2,
-               .reg_src = { .reg = S5P64X0_CLK_SRC0, .shift = 28, .size = 2 },
-               .reg_div = { .reg = S5P64X0_CLK_DIV1, .shift = 20, .size = 4 },
-       }, {
-               .clk    = {
-                       .name           = "sclk_dispcon",
-                       .ctrlbit        = (1 << 1),
-                       .enable         = s5p64x0_sclk1_ctrl,
-               },
-               .sources = &clkset_dispcon,
-               .reg_src = { .reg = S5P64X0_CLK_SRC1, .shift = 4, .size = 2 },
-               .reg_div = { .reg = S5P64X0_CLK_DIV3, .shift = 0, .size = 4 },
-       }, {
-               .clk    = {
-                       .name           = "sclk_hsmmc44",
-                       .ctrlbit        = (1 << 30),
-                       .enable         = s5p64x0_sclk_ctrl,
-               },
-               .sources = &clkset_hsmmc44,
-               .reg_src = { .reg = S5P64X0_CLK_SRC0, .shift = 6, .size = 3 },
-               .reg_div = { .reg = S5P64X0_CLK_DIV1, .shift = 28, .size = 4 },
-       },
-};
-
-static struct clksrc_clk clk_sclk_mmc0 = {
-       .clk    = {
-               .name           = "sclk_mmc",
-               .devname        = "s3c-sdhci.0",
-               .ctrlbit        = (1 << 24),
-               .enable         = s5p64x0_sclk_ctrl,
-       },
-       .sources = &clkset_group2,
-       .reg_src = { .reg = S5P64X0_CLK_SRC0, .shift = 18, .size = 2 },
-       .reg_div = { .reg = S5P64X0_CLK_DIV1, .shift = 0, .size = 4 },
-};
-
-static struct clksrc_clk clk_sclk_mmc1 = {
-       .clk    = {
-               .name           = "sclk_mmc",
-               .devname        = "s3c-sdhci.1",
-               .ctrlbit        = (1 << 25),
-               .enable         = s5p64x0_sclk_ctrl,
-       },
-       .sources = &clkset_group2,
-       .reg_src = { .reg = S5P64X0_CLK_SRC0, .shift = 20, .size = 2 },
-       .reg_div = { .reg = S5P64X0_CLK_DIV1, .shift = 4, .size = 4 },
-};
-
-static struct clksrc_clk clk_sclk_mmc2 = {
-       .clk    = {
-               .name           = "sclk_mmc",
-               .devname        = "s3c-sdhci.2",
-               .ctrlbit        = (1 << 26),
-               .enable         = s5p64x0_sclk_ctrl,
-       },
-       .sources = &clkset_group2,
-       .reg_src = { .reg = S5P64X0_CLK_SRC0, .shift = 22, .size = 2 },
-       .reg_div = { .reg = S5P64X0_CLK_DIV1, .shift = 8, .size = 4 },
-};
-
-static struct clksrc_clk clk_sclk_uclk = {
-       .clk    = {
-               .name           = "uclk1",
-               .ctrlbit        = (1 << 5),
-               .enable         = s5p64x0_sclk_ctrl,
-       },
-       .sources = &clkset_uart,
-       .reg_src = { .reg = S5P64X0_CLK_SRC0, .shift = 13, .size = 1 },
-       .reg_div = { .reg = S5P64X0_CLK_DIV2, .shift = 16, .size = 4 },
-};
-
-static struct clksrc_clk clk_sclk_spi0 = {
-       .clk    = {
-               .name           = "sclk_spi",
-               .devname        = "s5p64x0-spi.0",
-               .ctrlbit        = (1 << 20),
-               .enable         = s5p64x0_sclk_ctrl,
-       },
-       .sources = &clkset_group2,
-       .reg_src = { .reg = S5P64X0_CLK_SRC0, .shift = 14, .size = 2 },
-       .reg_div = { .reg = S5P64X0_CLK_DIV2, .shift = 0, .size = 4 },
-};
-
-static struct clksrc_clk clk_sclk_spi1 = {
-       .clk    = {
-               .name           = "sclk_spi",
-               .devname        = "s5p64x0-spi.1",
-               .ctrlbit        = (1 << 21),
-               .enable         = s5p64x0_sclk_ctrl,
-       },
-       .sources = &clkset_group2,
-       .reg_src = { .reg = S5P64X0_CLK_SRC0, .shift = 16, .size = 2 },
-       .reg_div = { .reg = S5P64X0_CLK_DIV2, .shift = 4, .size = 4 },
-};
-
-static struct clk clk_i2s0 = {
-       .name           = "iis",
-       .devname        = "samsung-i2s.0",
-       .parent         = &clk_pclk_low.clk,
-       .enable         = s5p64x0_pclk_ctrl,
-       .ctrlbit        = (1 << 26),
-};
-
-static struct clk clk_i2s1 = {
-       .name           = "iis",
-       .devname        = "samsung-i2s.1",
-       .parent         = &clk_pclk_low.clk,
-       .enable         = s5p64x0_pclk_ctrl,
-       .ctrlbit        = (1 << 15),
-};
-
-static struct clk clk_i2s2 = {
-       .name           = "iis",
-       .devname        = "samsung-i2s.2",
-       .parent         = &clk_pclk_low.clk,
-       .enable         = s5p64x0_pclk_ctrl,
-       .ctrlbit        = (1 << 16),
-};
-
-static struct clk *clk_cdev[] = {
-       &clk_i2s0,
-       &clk_i2s1,
-       &clk_i2s2,
-};
-
-static struct clksrc_clk *clksrc_cdev[] = {
-       &clk_sclk_uclk,
-       &clk_sclk_spi0,
-       &clk_sclk_spi1,
-       &clk_sclk_mmc0,
-       &clk_sclk_mmc1,
-       &clk_sclk_mmc2,
-       &clk_sclk_audio0,
-};
-
-static struct clk_lookup s5p6450_clk_lookup[] = {
-       CLKDEV_INIT(NULL, "clk_uart_baud2", &clk_pclk_low.clk),
-       CLKDEV_INIT(NULL, "clk_uart_baud3", &clk_sclk_uclk.clk),
-       CLKDEV_INIT(NULL, "spi_busclk0", &clk_p),
-       CLKDEV_INIT("s5p64x0-spi.0", "spi_busclk1", &clk_sclk_spi0.clk),
-       CLKDEV_INIT("s5p64x0-spi.1", "spi_busclk1", &clk_sclk_spi1.clk),
-       CLKDEV_INIT("s3c-sdhci.0", "mmc_busclk.2", &clk_sclk_mmc0.clk),
-       CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.2", &clk_sclk_mmc1.clk),
-       CLKDEV_INIT("s3c-sdhci.2", "mmc_busclk.2", &clk_sclk_mmc2.clk),
-       CLKDEV_INIT("samsung-i2s.0", "i2s_opclk0", &clk_i2s0),
-       CLKDEV_INIT("samsung-i2s.0", "i2s_opclk1", &clk_sclk_audio0.clk),
-       CLKDEV_INIT("samsung-i2s.1", "i2s_opclk0", &clk_i2s1),
-       CLKDEV_INIT("samsung-i2s.2", "i2s_opclk0", &clk_i2s2),
-};
-
-/* Clock initialization code */
-static struct clksrc_clk *sysclks[] = {
-       &clk_mout_apll,
-       &clk_mout_epll,
-       &clk_dout_epll,
-       &clk_mout_mpll,
-       &clk_dout_mpll,
-       &clk_armclk,
-       &clk_mout_hclk_sel,
-       &clk_dout_pwm_ratio0,
-       &clk_pclk_to_wdt_pwm,
-       &clk_hclk,
-       &clk_pclk,
-       &clk_hclk_low,
-       &clk_pclk_low,
-};
-
-static struct clk dummy_apb_pclk = {
-       .name           = "apb_pclk",
-       .id             = -1,
-};
-
-void __init_or_cpufreq s5p6450_setup_clocks(void)
-{
-       struct clk *xtal_clk;
-
-       unsigned long xtal;
-       unsigned long fclk;
-       unsigned long hclk;
-       unsigned long hclk_low;
-       unsigned long pclk;
-       unsigned long pclk_low;
-
-       unsigned long apll;
-       unsigned long mpll;
-       unsigned long epll;
-       unsigned long dpll;
-       unsigned int ptr;
-
-       /* Set S5P6450 functions for clk_fout_epll */
-
-       clk_fout_epll.enable = s5p_epll_enable;
-       clk_fout_epll.ops = &s5p6450_epll_ops;
-
-       clk_48m.enable = s5p64x0_clk48m_ctrl;
-
-       xtal_clk = clk_get(NULL, "ext_xtal");
-       BUG_ON(IS_ERR(xtal_clk));
-
-       xtal = clk_get_rate(xtal_clk);
-       clk_put(xtal_clk);
-
-       apll = s5p_get_pll45xx(xtal, __raw_readl(S5P64X0_APLL_CON), pll_4502);
-       mpll = s5p_get_pll45xx(xtal, __raw_readl(S5P64X0_MPLL_CON), pll_4502);
-       epll = s5p_get_pll90xx(xtal, __raw_readl(S5P64X0_EPLL_CON),
-                               __raw_readl(S5P64X0_EPLL_CON_K));
-       dpll = s5p_get_pll46xx(xtal, __raw_readl(S5P6450_DPLL_CON),
-                               __raw_readl(S5P6450_DPLL_CON_K), pll_4650c);
-
-       clk_fout_apll.rate = apll;
-       clk_fout_mpll.rate = mpll;
-       clk_fout_epll.rate = epll;
-       clk_fout_dpll.rate = dpll;
-
-       printk(KERN_INFO "S5P6450: PLL settings, A=%ld.%ldMHz, M=%ld.%ldMHz," \
-                       " E=%ld.%ldMHz, D=%ld.%ldMHz\n",
-                       print_mhz(apll), print_mhz(mpll), print_mhz(epll),
-                       print_mhz(dpll));
-
-       fclk = clk_get_rate(&clk_armclk.clk);
-       hclk = clk_get_rate(&clk_hclk.clk);
-       pclk = clk_get_rate(&clk_pclk.clk);
-       hclk_low = clk_get_rate(&clk_hclk_low.clk);
-       pclk_low = clk_get_rate(&clk_pclk_low.clk);
-
-       printk(KERN_INFO "S5P6450: HCLK=%ld.%ldMHz, HCLK_LOW=%ld.%ldMHz," \
-                       " PCLK=%ld.%ldMHz, PCLK_LOW=%ld.%ldMHz\n",
-                       print_mhz(hclk), print_mhz(hclk_low),
-                       print_mhz(pclk), print_mhz(pclk_low));
-
-       clk_f.rate = fclk;
-       clk_h.rate = hclk;
-       clk_p.rate = pclk;
-
-       for (ptr = 0; ptr < ARRAY_SIZE(clksrcs); ptr++)
-               s3c_set_clksrc(&clksrcs[ptr], true);
-}
-
-void __init s5p6450_register_clocks(void)
-{
-       int ptr;
-       unsigned int cnt;
-
-       for (ptr = 0; ptr < ARRAY_SIZE(sysclks); ptr++)
-               s3c_register_clksrc(sysclks[ptr], 1);
-
-
-       s3c24xx_register_clocks(clk_cdev, ARRAY_SIZE(clk_cdev));
-       for (cnt = 0; cnt < ARRAY_SIZE(clk_cdev); cnt++)
-               s3c_disable_clocks(clk_cdev[cnt], 1);
-
-       s3c_register_clksrc(clksrcs, ARRAY_SIZE(clksrcs));
-       s3c_register_clocks(init_clocks, ARRAY_SIZE(init_clocks));
-       for (ptr = 0; ptr < ARRAY_SIZE(clksrc_cdev); ptr++)
-               s3c_register_clksrc(clksrc_cdev[ptr], 1);
-
-       s3c_register_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off));
-       s3c_disable_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off));
-       clkdev_add_table(s5p6450_clk_lookup, ARRAY_SIZE(s5p6450_clk_lookup));
-
-       s3c24xx_register_clock(&dummy_apb_pclk);
-}
diff --git a/arch/arm/mach-s5p64x0/clock.c b/arch/arm/mach-s5p64x0/clock.c
deleted file mode 100644 (file)
index 57e7189..0000000
+++ /dev/null
@@ -1,236 +0,0 @@
-/* linux/arch/arm/mach-s5p64x0/clock.c
- *
- * Copyright (c) 2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * S5P64X0 - Clock support
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#include <linux/init.h>
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/list.h>
-#include <linux/errno.h>
-#include <linux/err.h>
-#include <linux/clk.h>
-#include <linux/device.h>
-#include <linux/io.h>
-
-#include <mach/hardware.h>
-#include <mach/map.h>
-#include <mach/regs-clock.h>
-
-#include <plat/cpu-freq.h>
-#include <plat/clock.h>
-#include <plat/cpu.h>
-#include <plat/pll.h>
-#include <plat/s5p-clock.h>
-#include <plat/clock-clksrc.h>
-
-#include "common.h"
-
-struct clksrc_clk clk_mout_apll = {
-       .clk    = {
-               .name           = "mout_apll",
-               .id             = -1,
-       },
-       .sources        = &clk_src_apll,
-       .reg_src        = { .reg = S5P64X0_CLK_SRC0, .shift = 0, .size = 1 },
-};
-
-struct clksrc_clk clk_mout_mpll = {
-       .clk    = {
-               .name           = "mout_mpll",
-               .id             = -1,
-       },
-       .sources        = &clk_src_mpll,
-       .reg_src        = { .reg = S5P64X0_CLK_SRC0, .shift = 1, .size = 1 },
-};
-
-struct clksrc_clk clk_mout_epll = {
-       .clk    = {
-               .name           = "mout_epll",
-               .id             = -1,
-       },
-       .sources        = &clk_src_epll,
-       .reg_src        = { .reg = S5P64X0_CLK_SRC0, .shift = 2, .size = 1 },
-};
-
-enum perf_level {
-       L0 = 532*1000,
-       L1 = 266*1000,
-       L2 = 133*1000,
-};
-
-static const u32 clock_table[][3] = {
-       /*{ARM_CLK, DIVarm, DIVhclk}*/
-       {L0 * 1000, (0 << ARM_DIV_RATIO_SHIFT), (3 << S5P64X0_CLKDIV0_HCLK_SHIFT)},
-       {L1 * 1000, (1 << ARM_DIV_RATIO_SHIFT), (1 << S5P64X0_CLKDIV0_HCLK_SHIFT)},
-       {L2 * 1000, (3 << ARM_DIV_RATIO_SHIFT), (0 << S5P64X0_CLKDIV0_HCLK_SHIFT)},
-};
-
-static unsigned long s5p64x0_armclk_get_rate(struct clk *clk)
-{
-       unsigned long rate = clk_get_rate(clk->parent);
-       u32 clkdiv;
-
-       /* divisor mask starts at bit0, so no need to shift */
-       clkdiv = __raw_readl(ARM_CLK_DIV) & ARM_DIV_MASK;
-
-       return rate / (clkdiv + 1);
-}
-
-static unsigned long s5p64x0_armclk_round_rate(struct clk *clk,
-                                              unsigned long rate)
-{
-       u32 iter;
-
-       for (iter = 1 ; iter < ARRAY_SIZE(clock_table) ; iter++) {
-               if (rate > clock_table[iter][0])
-                       return clock_table[iter-1][0];
-       }
-
-       return clock_table[ARRAY_SIZE(clock_table) - 1][0];
-}
-
-static int s5p64x0_armclk_set_rate(struct clk *clk, unsigned long rate)
-{
-       u32 round_tmp;
-       u32 iter;
-       u32 clk_div0_tmp;
-       u32 cur_rate = clk->ops->get_rate(clk);
-       unsigned long flags;
-
-       round_tmp = clk->ops->round_rate(clk, rate);
-       if (round_tmp == cur_rate)
-               return 0;
-
-
-       for (iter = 0 ; iter < ARRAY_SIZE(clock_table) ; iter++) {
-               if (round_tmp == clock_table[iter][0])
-                       break;
-       }
-
-       if (iter >= ARRAY_SIZE(clock_table))
-               iter = ARRAY_SIZE(clock_table) - 1;
-
-       local_irq_save(flags);
-       if (cur_rate > round_tmp) {
-               /* Frequency Down */
-               clk_div0_tmp = __raw_readl(ARM_CLK_DIV) & ~(ARM_DIV_MASK);
-               clk_div0_tmp |= clock_table[iter][1];
-               __raw_writel(clk_div0_tmp, ARM_CLK_DIV);
-
-               clk_div0_tmp = __raw_readl(ARM_CLK_DIV) &
-                               ~(S5P64X0_CLKDIV0_HCLK_MASK);
-               clk_div0_tmp |= clock_table[iter][2];
-               __raw_writel(clk_div0_tmp, ARM_CLK_DIV);
-
-
-       } else {
-               /* Frequency Up */
-               clk_div0_tmp = __raw_readl(ARM_CLK_DIV) &
-                               ~(S5P64X0_CLKDIV0_HCLK_MASK);
-               clk_div0_tmp |= clock_table[iter][2];
-               __raw_writel(clk_div0_tmp, ARM_CLK_DIV);
-
-               clk_div0_tmp = __raw_readl(ARM_CLK_DIV) & ~(ARM_DIV_MASK);
-               clk_div0_tmp |= clock_table[iter][1];
-               __raw_writel(clk_div0_tmp, ARM_CLK_DIV);
-       }
-       local_irq_restore(flags);
-
-       clk->rate = clock_table[iter][0];
-
-       return 0;
-}
-
-static struct clk_ops s5p64x0_clkarm_ops = {
-       .get_rate       = s5p64x0_armclk_get_rate,
-       .set_rate       = s5p64x0_armclk_set_rate,
-       .round_rate     = s5p64x0_armclk_round_rate,
-};
-
-struct clksrc_clk clk_armclk = {
-       .clk    = {
-               .name           = "armclk",
-               .id             = 1,
-               .parent         = &clk_mout_apll.clk,
-               .ops            = &s5p64x0_clkarm_ops,
-       },
-       .reg_div        = { .reg = S5P64X0_CLK_DIV0, .shift = 0, .size = 4 },
-};
-
-struct clksrc_clk clk_dout_mpll = {
-       .clk    = {
-               .name           = "dout_mpll",
-               .id             = -1,
-               .parent         = &clk_mout_mpll.clk,
-       },
-       .reg_div        = { .reg = S5P64X0_CLK_DIV0, .shift = 4, .size = 1 },
-};
-
-static struct clk *clkset_hclk_low_list[] = {
-       &clk_mout_apll.clk,
-       &clk_mout_mpll.clk,
-};
-
-struct clksrc_sources clkset_hclk_low = {
-       .sources        = clkset_hclk_low_list,
-       .nr_sources     = ARRAY_SIZE(clkset_hclk_low_list),
-};
-
-int s5p64x0_pclk_ctrl(struct clk *clk, int enable)
-{
-       return s5p_gatectrl(S5P64X0_CLK_GATE_PCLK, clk, enable);
-}
-
-int s5p64x0_hclk0_ctrl(struct clk *clk, int enable)
-{
-       return s5p_gatectrl(S5P64X0_CLK_GATE_HCLK0, clk, enable);
-}
-
-int s5p64x0_hclk1_ctrl(struct clk *clk, int enable)
-{
-       return s5p_gatectrl(S5P64X0_CLK_GATE_HCLK1, clk, enable);
-}
-
-int s5p64x0_sclk_ctrl(struct clk *clk, int enable)
-{
-       return s5p_gatectrl(S5P64X0_CLK_GATE_SCLK0, clk, enable);
-}
-
-int s5p64x0_sclk1_ctrl(struct clk *clk, int enable)
-{
-       return s5p_gatectrl(S5P64X0_CLK_GATE_SCLK1, clk, enable);
-}
-
-int s5p64x0_mem_ctrl(struct clk *clk, int enable)
-{
-       return s5p_gatectrl(S5P64X0_CLK_GATE_MEM0, clk, enable);
-}
-
-int s5p64x0_clk48m_ctrl(struct clk *clk, int enable)
-{
-       unsigned long flags;
-       u32 val;
-
-       /* can't rely on clock lock, this register has other usages */
-       local_irq_save(flags);
-
-       val = __raw_readl(S5P64X0_OTHERS);
-       if (enable)
-               val |= S5P64X0_OTHERS_USB_SIG_MASK;
-       else
-               val &= ~S5P64X0_OTHERS_USB_SIG_MASK;
-
-       __raw_writel(val, S5P64X0_OTHERS);
-
-       local_irq_restore(flags);
-
-       return 0;
-}
diff --git a/arch/arm/mach-s5p64x0/clock.h b/arch/arm/mach-s5p64x0/clock.h
deleted file mode 100644 (file)
index 28b8e3c..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (c) 2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * Header file for s5p64x0 clock support
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#ifndef __MACH_S5P64X0_CLOCK_H
-#define __MACH_S5P64X0_CLOCK_H __FILE__
-
-#include <linux/clk.h>
-
-extern struct clksrc_clk clk_mout_apll;
-extern struct clksrc_clk clk_mout_mpll;
-extern struct clksrc_clk clk_mout_epll;
-
-extern int s5p64x0_epll_enable(struct clk *clk, int enable);
-extern unsigned long s5p64x0_epll_get_rate(struct clk *clk);
-
-extern struct clksrc_clk clk_armclk;
-extern struct clksrc_clk clk_dout_mpll;
-
-extern struct clksrc_sources clkset_hclk_low;
-
-extern int s5p64x0_pclk_ctrl(struct clk *clk, int enable);
-extern int s5p64x0_hclk0_ctrl(struct clk *clk, int enable);
-extern int s5p64x0_hclk1_ctrl(struct clk *clk, int enable);
-extern int s5p64x0_sclk_ctrl(struct clk *clk, int enable);
-extern int s5p64x0_sclk1_ctrl(struct clk *clk, int enable);
-extern int s5p64x0_mem_ctrl(struct clk *clk, int enable);
-
-extern int s5p64x0_clk48m_ctrl(struct clk *clk, int enable);
-
-#endif /* __MACH_S5P64X0_CLOCK_H */
diff --git a/arch/arm/mach-s5p64x0/common.c b/arch/arm/mach-s5p64x0/common.c
deleted file mode 100644 (file)
index 9a43be0..0000000
+++ /dev/null
@@ -1,490 +0,0 @@
-/*
- * Copyright (c) 2009-2011 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * Common Codes for S5P64X0 machines
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/interrupt.h>
-#include <linux/list.h>
-#include <linux/timer.h>
-#include <linux/init.h>
-#include <linux/clk.h>
-#include <linux/io.h>
-#include <linux/device.h>
-#include <linux/serial_core.h>
-#include <linux/serial_s3c.h>
-#include <clocksource/samsung_pwm.h>
-#include <linux/platform_device.h>
-#include <linux/sched.h>
-#include <linux/dma-mapping.h>
-#include <linux/gpio.h>
-#include <linux/irq.h>
-#include <linux/reboot.h>
-
-#include <asm/irq.h>
-#include <asm/proc-fns.h>
-#include <asm/system_misc.h>
-#include <asm/mach/arch.h>
-#include <asm/mach/map.h>
-#include <asm/mach/irq.h>
-
-#include <mach/map.h>
-#include <mach/hardware.h>
-#include <mach/regs-clock.h>
-#include <mach/regs-gpio.h>
-
-#include <plat/cpu.h>
-#include <plat/clock.h>
-#include <plat/devs.h>
-#include <plat/pm.h>
-#include <plat/sdhci.h>
-#include <plat/adc-core.h>
-#include <plat/fb-core.h>
-#include <plat/spi-core.h>
-#include <plat/gpio-cfg.h>
-#include <plat/pwm-core.h>
-#include <plat/regs-irqtype.h>
-#include <plat/watchdog-reset.h>
-
-#include "common.h"
-
-static const char name_s5p6440[] = "S5P6440";
-static const char name_s5p6450[] = "S5P6450";
-
-static struct cpu_table cpu_ids[] __initdata = {
-       {
-               .idcode         = S5P6440_CPU_ID,
-               .idmask         = S5P64XX_CPU_MASK,
-               .map_io         = s5p6440_map_io,
-               .init_clocks    = s5p6440_init_clocks,
-               .init_uarts     = s5p6440_init_uarts,
-               .init           = s5p64x0_init,
-               .name           = name_s5p6440,
-       }, {
-               .idcode         = S5P6450_CPU_ID,
-               .idmask         = S5P64XX_CPU_MASK,
-               .map_io         = s5p6450_map_io,
-               .init_clocks    = s5p6450_init_clocks,
-               .init_uarts     = s5p6450_init_uarts,
-               .init           = s5p64x0_init,
-               .name           = name_s5p6450,
-       },
-};
-
-/* Initial IO mappings */
-
-static struct map_desc s5p64x0_iodesc[] __initdata = {
-       {
-               .virtual        = (unsigned long)S5P_VA_CHIPID,
-               .pfn            = __phys_to_pfn(S5P64X0_PA_CHIPID),
-               .length         = SZ_4K,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = (unsigned long)S3C_VA_SYS,
-               .pfn            = __phys_to_pfn(S5P64X0_PA_SYSCON),
-               .length         = SZ_64K,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = (unsigned long)S3C_VA_TIMER,
-               .pfn            = __phys_to_pfn(S5P64X0_PA_TIMER),
-               .length         = SZ_16K,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = (unsigned long)S3C_VA_WATCHDOG,
-               .pfn            = __phys_to_pfn(S5P64X0_PA_WDT),
-               .length         = SZ_4K,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = (unsigned long)S5P_VA_SROMC,
-               .pfn            = __phys_to_pfn(S5P64X0_PA_SROMC),
-               .length         = SZ_4K,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = (unsigned long)S5P_VA_GPIO,
-               .pfn            = __phys_to_pfn(S5P64X0_PA_GPIO),
-               .length         = SZ_4K,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = (unsigned long)VA_VIC0,
-               .pfn            = __phys_to_pfn(S5P64X0_PA_VIC0),
-               .length         = SZ_16K,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = (unsigned long)VA_VIC1,
-               .pfn            = __phys_to_pfn(S5P64X0_PA_VIC1),
-               .length         = SZ_16K,
-               .type           = MT_DEVICE,
-       },
-};
-
-static struct map_desc s5p6440_iodesc[] __initdata = {
-       {
-               .virtual        = (unsigned long)S3C_VA_UART,
-               .pfn            = __phys_to_pfn(S5P6440_PA_UART(0)),
-               .length         = SZ_4K,
-               .type           = MT_DEVICE,
-       },
-};
-
-static struct map_desc s5p6450_iodesc[] __initdata = {
-       {
-               .virtual        = (unsigned long)S3C_VA_UART,
-               .pfn            = __phys_to_pfn(S5P6450_PA_UART(0)),
-               .length         = SZ_512K,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = (unsigned long)S3C_VA_UART + SZ_512K,
-               .pfn            = __phys_to_pfn(S5P6450_PA_UART(5)),
-               .length         = SZ_4K,
-               .type           = MT_DEVICE,
-       },
-};
-
-static void s5p64x0_idle(void)
-{
-       unsigned long val;
-
-       val = __raw_readl(S5P64X0_PWR_CFG);
-       val &= ~(0x3 << 5);
-       val |= (0x1 << 5);
-       __raw_writel(val, S5P64X0_PWR_CFG);
-
-       cpu_do_idle();
-}
-
-static struct samsung_pwm_variant s5p64x0_pwm_variant = {
-       .bits           = 32,
-       .div_base       = 0,
-       .has_tint_cstat = true,
-       .tclk_mask      = 0,
-};
-
-void __init samsung_set_timer_source(unsigned int event, unsigned int source)
-{
-       s5p64x0_pwm_variant.output_mask = BIT(SAMSUNG_PWM_NUM) - 1;
-       s5p64x0_pwm_variant.output_mask &= ~(BIT(event) | BIT(source));
-}
-
-void __init samsung_timer_init(void)
-{
-       unsigned int timer_irqs[SAMSUNG_PWM_NUM] = {
-               IRQ_TIMER0_VIC, IRQ_TIMER1_VIC, IRQ_TIMER2_VIC,
-               IRQ_TIMER3_VIC, IRQ_TIMER4_VIC,
-       };
-
-       samsung_pwm_clocksource_init(S3C_VA_TIMER,
-                                       timer_irqs, &s5p64x0_pwm_variant);
-}
-
-/*
- * s5p64x0_map_io
- *
- * register the standard CPU IO areas
- */
-
-void __init s5p64x0_init_io(struct map_desc *mach_desc, int size)
-{
-       /* initialize the io descriptors we need for initialization */
-       iotable_init(s5p64x0_iodesc, ARRAY_SIZE(s5p64x0_iodesc));
-       if (mach_desc)
-               iotable_init(mach_desc, size);
-
-       /* detect cpu id and rev. */
-       s5p_init_cpu(S5P64X0_SYS_ID);
-
-       s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids));
-       samsung_wdt_reset_init(S3C_VA_WATCHDOG);
-
-       samsung_pwm_set_platdata(&s5p64x0_pwm_variant);
-}
-
-#ifdef CONFIG_CPU_S5P6440
-void __init s5p6440_map_io(void)
-{
-       /* initialize any device information early */
-       s3c_adc_setname("s3c64xx-adc");
-       s3c_fb_setname("s5p64x0-fb");
-       s3c64xx_spi_setname("s5p64x0-spi");
-
-       s5p64x0_default_sdhci0();
-       s5p64x0_default_sdhci1();
-       s5p6440_default_sdhci2();
-
-       iotable_init(s5p6440_iodesc, ARRAY_SIZE(s5p6440_iodesc));
-}
-#endif
-
-#ifdef CONFIG_CPU_S5P6450
-void __init s5p6450_map_io(void)
-{
-       /* initialize any device information early */
-       s3c_adc_setname("s3c64xx-adc");
-       s3c_fb_setname("s5p64x0-fb");
-       s3c64xx_spi_setname("s5p64x0-spi");
-
-       s5p64x0_default_sdhci0();
-       s5p64x0_default_sdhci1();
-       s5p6450_default_sdhci2();
-
-       iotable_init(s5p6450_iodesc, ARRAY_SIZE(s5p6450_iodesc));
-}
-#endif
-
-/*
- * s5p64x0_init_clocks
- *
- * register and setup the CPU clocks
- */
-#ifdef CONFIG_CPU_S5P6440
-void __init s5p6440_init_clocks(int xtal)
-{
-       printk(KERN_DEBUG "%s: initializing clocks\n", __func__);
-
-       s3c24xx_register_baseclocks(xtal);
-       s5p_register_clocks(xtal);
-       s5p6440_register_clocks();
-       s5p6440_setup_clocks();
-}
-#endif
-
-#ifdef CONFIG_CPU_S5P6450
-void __init s5p6450_init_clocks(int xtal)
-{
-       printk(KERN_DEBUG "%s: initializing clocks\n", __func__);
-
-       s3c24xx_register_baseclocks(xtal);
-       s5p_register_clocks(xtal);
-       s5p6450_register_clocks();
-       s5p6450_setup_clocks();
-}
-#endif
-
-/*
- * s5p64x0_init_irq
- *
- * register the CPU interrupts
- */
-#ifdef CONFIG_CPU_S5P6440
-void __init s5p6440_init_irq(void)
-{
-       /* S5P6440 supports 2 VIC */
-       u32 vic[2];
-
-       /*
-        * VIC0 is missing IRQ_VIC0[3, 4, 8, 10, (12-22)]
-        * VIC1 is missing IRQ VIC1[1, 3, 4, 10, 11, 12, 14, 15, 22]
-        */
-       vic[0] = 0xff800ae7;
-       vic[1] = 0xffbf23e5;
-
-       s5p_init_irq(vic, ARRAY_SIZE(vic));
-}
-#endif
-
-#ifdef CONFIG_CPU_S5P6450
-void __init s5p6450_init_irq(void)
-{
-       /* S5P6450 supports only 2 VIC */
-       u32 vic[2];
-
-       /*
-        * VIC0 is missing IRQ_VIC0[(13-15), (21-22)]
-        * VIC1 is missing IRQ VIC1[12, 14, 23]
-        */
-       vic[0] = 0xff9f1fff;
-       vic[1] = 0xff7fafff;
-
-       s5p_init_irq(vic, ARRAY_SIZE(vic));
-}
-#endif
-
-struct bus_type s5p64x0_subsys = {
-       .name           = "s5p64x0-core",
-       .dev_name       = "s5p64x0-core",
-};
-
-static struct device s5p64x0_dev = {
-       .bus    = &s5p64x0_subsys,
-};
-
-static int __init s5p64x0_core_init(void)
-{
-       return subsys_system_register(&s5p64x0_subsys, NULL);
-}
-core_initcall(s5p64x0_core_init);
-
-int __init s5p64x0_init(void)
-{
-       printk(KERN_INFO "S5P64X0(S5P6440/S5P6450): Initializing architecture\n");
-
-       /* set idle function */
-       arm_pm_idle = s5p64x0_idle;
-
-       return device_register(&s5p64x0_dev);
-}
-
-/* uart registration process */
-#ifdef CONFIG_CPU_S5P6440
-void __init s5p6440_init_uarts(struct s3c2410_uartcfg *cfg, int no)
-{
-       int uart;
-
-       for (uart = 0; uart < no; uart++) {
-               s5p_uart_resources[uart].resources->start = S5P6440_PA_UART(uart);
-               s5p_uart_resources[uart].resources->end = S5P6440_PA_UART(uart) + S5P_SZ_UART;
-       }
-
-       s3c24xx_init_uartdevs("s3c6400-uart", s5p_uart_resources, cfg, no);
-}
-#endif
-
-#ifdef CONFIG_CPU_S5P6450
-void __init s5p6450_init_uarts(struct s3c2410_uartcfg *cfg, int no)
-{
-       s3c24xx_init_uartdevs("s3c6400-uart", s5p_uart_resources, cfg, no);
-}
-#endif
-
-#define eint_offset(irq)       ((irq) - IRQ_EINT(0))
-
-static int s5p64x0_irq_eint_set_type(struct irq_data *data, unsigned int type)
-{
-       int offs = eint_offset(data->irq);
-       int shift;
-       u32 ctrl, mask;
-       u32 newvalue = 0;
-
-       if (offs > 15)
-               return -EINVAL;
-
-       switch (type) {
-       case IRQ_TYPE_NONE:
-               printk(KERN_WARNING "No edge setting!\n");
-               break;
-       case IRQ_TYPE_EDGE_RISING:
-               newvalue = S3C2410_EXTINT_RISEEDGE;
-               break;
-       case IRQ_TYPE_EDGE_FALLING:
-               newvalue = S3C2410_EXTINT_FALLEDGE;
-               break;
-       case IRQ_TYPE_EDGE_BOTH:
-               newvalue = S3C2410_EXTINT_BOTHEDGE;
-               break;
-       case IRQ_TYPE_LEVEL_LOW:
-               newvalue = S3C2410_EXTINT_LOWLEV;
-               break;
-       case IRQ_TYPE_LEVEL_HIGH:
-               newvalue = S3C2410_EXTINT_HILEV;
-               break;
-       default:
-               printk(KERN_ERR "No such irq type %d", type);
-               return -EINVAL;
-       }
-
-       shift = (offs / 2) * 4;
-       mask = 0x7 << shift;
-
-       ctrl = __raw_readl(S5P64X0_EINT0CON0) & ~mask;
-       ctrl |= newvalue << shift;
-       __raw_writel(ctrl, S5P64X0_EINT0CON0);
-
-       /* Configure the GPIO pin for 6450 or 6440 based on CPU ID */
-       if (soc_is_s5p6450())
-               s3c_gpio_cfgpin(S5P6450_GPN(offs), S3C_GPIO_SFN(2));
-       else
-               s3c_gpio_cfgpin(S5P6440_GPN(offs), S3C_GPIO_SFN(2));
-
-       return 0;
-}
-
-/*
- * s5p64x0_irq_demux_eint
- *
- * This function demuxes the IRQ from the group0 external interrupts,
- * from IRQ_EINT(0) to IRQ_EINT(15). It is designed to be inlined into
- * the specific handlers s5p64x0_irq_demux_eintX_Y.
- */
-static inline void s5p64x0_irq_demux_eint(unsigned int start, unsigned int end)
-{
-       u32 status = __raw_readl(S5P64X0_EINT0PEND);
-       u32 mask = __raw_readl(S5P64X0_EINT0MASK);
-       unsigned int irq;
-
-       status &= ~mask;
-       status >>= start;
-       status &= (1 << (end - start + 1)) - 1;
-
-       for (irq = IRQ_EINT(start); irq <= IRQ_EINT(end); irq++) {
-               if (status & 1)
-                       generic_handle_irq(irq);
-               status >>= 1;
-       }
-}
-
-static void s5p64x0_irq_demux_eint0_3(unsigned int irq, struct irq_desc *desc)
-{
-       s5p64x0_irq_demux_eint(0, 3);
-}
-
-static void s5p64x0_irq_demux_eint4_11(unsigned int irq, struct irq_desc *desc)
-{
-       s5p64x0_irq_demux_eint(4, 11);
-}
-
-static void s5p64x0_irq_demux_eint12_15(unsigned int irq,
-                                       struct irq_desc *desc)
-{
-       s5p64x0_irq_demux_eint(12, 15);
-}
-
-static int s5p64x0_alloc_gc(void)
-{
-       struct irq_chip_generic *gc;
-       struct irq_chip_type *ct;
-
-       gc = irq_alloc_generic_chip("s5p64x0-eint", 1, S5P_IRQ_EINT_BASE,
-                                   S5P_VA_GPIO, handle_level_irq);
-       if (!gc) {
-               printk(KERN_ERR "%s: irq_alloc_generic_chip for group 0"
-                       "external interrupts failed\n", __func__);
-               return -EINVAL;
-       }
-
-       ct = gc->chip_types;
-       ct->chip.irq_ack = irq_gc_ack_set_bit;
-       ct->chip.irq_mask = irq_gc_mask_set_bit;
-       ct->chip.irq_unmask = irq_gc_mask_clr_bit;
-       ct->chip.irq_set_type = s5p64x0_irq_eint_set_type;
-       ct->chip.irq_set_wake = s3c_irqext_wake;
-       ct->regs.ack = EINT0PEND_OFFSET;
-       ct->regs.mask = EINT0MASK_OFFSET;
-       irq_setup_generic_chip(gc, IRQ_MSK(16), IRQ_GC_INIT_MASK_CACHE,
-                              IRQ_NOREQUEST | IRQ_NOPROBE, 0);
-       return 0;
-}
-
-static int __init s5p64x0_init_irq_eint(void)
-{
-       int ret = s5p64x0_alloc_gc();
-       irq_set_chained_handler(IRQ_EINT0_3, s5p64x0_irq_demux_eint0_3);
-       irq_set_chained_handler(IRQ_EINT4_11, s5p64x0_irq_demux_eint4_11);
-       irq_set_chained_handler(IRQ_EINT12_15, s5p64x0_irq_demux_eint12_15);
-
-       return ret;
-}
-arch_initcall(s5p64x0_init_irq_eint);
-
-void s5p64x0_restart(enum reboot_mode mode, const char *cmd)
-{
-       if (mode != REBOOT_SOFT)
-               samsung_wdt_reset();
-
-       soft_restart(0);
-}
diff --git a/arch/arm/mach-s5p64x0/common.h b/arch/arm/mach-s5p64x0/common.h
deleted file mode 100644 (file)
index cbe7f3d..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * Common Header for S5P64X0 machines
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#ifndef __ARCH_ARM_MACH_S5P64X0_COMMON_H
-#define __ARCH_ARM_MACH_S5P64X0_COMMON_H
-
-#include <linux/reboot.h>
-
-void s5p6440_init_irq(void);
-void s5p6450_init_irq(void);
-void s5p64x0_init_io(struct map_desc *mach_desc, int size);
-
-void s5p6440_register_clocks(void);
-void s5p6440_setup_clocks(void);
-
-void s5p6450_register_clocks(void);
-void s5p6450_setup_clocks(void);
-
-void s5p64x0_restart(enum reboot_mode mode, const char *cmd);
-extern  int s5p64x0_init(void);
-
-#ifdef CONFIG_CPU_S5P6440
-
-extern void s5p6440_map_io(void);
-extern void s5p6440_init_clocks(int xtal);
-
-extern void s5p6440_init_uarts(struct s3c2410_uartcfg *cfg, int no);
-
-#else
-#define s5p6440_init_clocks NULL
-#define s5p6440_init_uarts NULL
-#define s5p6440_map_io NULL
-#endif
-
-#ifdef CONFIG_CPU_S5P6450
-
-extern void s5p6450_map_io(void);
-extern void s5p6450_init_clocks(int xtal);
-
-extern void s5p6450_init_uarts(struct s3c2410_uartcfg *cfg, int no);
-
-#else
-#define s5p6450_init_clocks NULL
-#define s5p6450_init_uarts NULL
-#define s5p6450_map_io NULL
-#endif
-
-#endif /* __ARCH_ARM_MACH_S5P64X0_COMMON_H */
diff --git a/arch/arm/mach-s5p64x0/dev-audio.c b/arch/arm/mach-s5p64x0/dev-audio.c
deleted file mode 100644 (file)
index 723d477..0000000
+++ /dev/null
@@ -1,176 +0,0 @@
-/* linux/arch/arm/mach-s5p64x0/dev-audio.c
- *
- * Copyright (c) 2010 Samsung Electronics Co. Ltd
- *     Jaswinder Singh <jassi.brar@samsung.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#include <linux/platform_device.h>
-#include <linux/dma-mapping.h>
-#include <linux/gpio.h>
-
-#include <plat/gpio-cfg.h>
-#include <linux/platform_data/asoc-s3c.h>
-
-#include <mach/map.h>
-#include <mach/dma.h>
-#include <mach/irqs.h>
-
-static int s5p6440_cfg_i2s(struct platform_device *pdev)
-{
-       switch (pdev->id) {
-       case 0:
-               s3c_gpio_cfgpin_range(S5P6440_GPC(4), 2, S3C_GPIO_SFN(5));
-               s3c_gpio_cfgpin(S5P6440_GPC(7), S3C_GPIO_SFN(5));
-               s3c_gpio_cfgpin_range(S5P6440_GPH(6), 4, S3C_GPIO_SFN(5));
-               break;
-       default:
-               printk(KERN_ERR "Invalid Device %d\n", pdev->id);
-               return -EINVAL;
-       }
-
-       return 0;
-}
-
-static struct s3c_audio_pdata s5p6440_i2s_pdata = {
-       .cfg_gpio = s5p6440_cfg_i2s,
-       .type = {
-               .i2s = {
-                       .quirks = QUIRK_PRI_6CHAN,
-               },
-       },
-};
-
-static struct resource s5p64x0_i2s0_resource[] = {
-       [0] = DEFINE_RES_MEM(S5P64X0_PA_I2S, SZ_256),
-       [1] = DEFINE_RES_DMA(DMACH_I2S0_TX),
-       [2] = DEFINE_RES_DMA(DMACH_I2S0_RX),
-};
-
-struct platform_device s5p6440_device_iis = {
-       .name           = "samsung-i2s",
-       .id             = 0,
-       .num_resources  = ARRAY_SIZE(s5p64x0_i2s0_resource),
-       .resource       = s5p64x0_i2s0_resource,
-       .dev = {
-               .platform_data = &s5p6440_i2s_pdata,
-       },
-};
-
-static int s5p6450_cfg_i2s(struct platform_device *pdev)
-{
-       switch (pdev->id) {
-       case 0:
-               s3c_gpio_cfgpin_range(S5P6450_GPR(4), 5, S3C_GPIO_SFN(5));
-               s3c_gpio_cfgpin_range(S5P6450_GPR(13), 2, S3C_GPIO_SFN(5));
-               break;
-       case 1:
-               s3c_gpio_cfgpin(S5P6440_GPB(4), S3C_GPIO_SFN(5));
-               s3c_gpio_cfgpin_range(S5P6450_GPC(0), 4, S3C_GPIO_SFN(5));
-               break;
-       case 2:
-               s3c_gpio_cfgpin_range(S5P6450_GPK(0), 5, S3C_GPIO_SFN(5));
-               break;
-       default:
-               printk(KERN_ERR "Invalid Device %d\n", pdev->id);
-               return -EINVAL;
-       }
-
-       return 0;
-}
-
-static struct s3c_audio_pdata s5p6450_i2s0_pdata = {
-       .cfg_gpio = s5p6450_cfg_i2s,
-       .type = {
-               .i2s = {
-                       .quirks = QUIRK_PRI_6CHAN,
-               },
-       },
-};
-
-struct platform_device s5p6450_device_iis0 = {
-       .name           = "samsung-i2s",
-       .id             = 0,
-       .num_resources  = ARRAY_SIZE(s5p64x0_i2s0_resource),
-       .resource       = s5p64x0_i2s0_resource,
-       .dev = {
-               .platform_data = &s5p6450_i2s0_pdata,
-       },
-};
-
-static struct s3c_audio_pdata s5p6450_i2s_pdata = {
-       .cfg_gpio = s5p6450_cfg_i2s,
-};
-
-static struct resource s5p6450_i2s1_resource[] = {
-       [0] = DEFINE_RES_MEM(S5P6450_PA_I2S1, SZ_256),
-       [1] = DEFINE_RES_DMA(DMACH_I2S1_TX),
-       [2] = DEFINE_RES_DMA(DMACH_I2S1_RX),
-};
-
-struct platform_device s5p6450_device_iis1 = {
-       .name           = "samsung-i2s",
-       .id             = 1,
-       .num_resources  = ARRAY_SIZE(s5p6450_i2s1_resource),
-       .resource       = s5p6450_i2s1_resource,
-       .dev = {
-               .platform_data = &s5p6450_i2s_pdata,
-       },
-};
-
-static struct resource s5p6450_i2s2_resource[] = {
-       [0] = DEFINE_RES_MEM(S5P6450_PA_I2S2, SZ_256),
-       [1] = DEFINE_RES_DMA(DMACH_I2S2_TX),
-       [2] = DEFINE_RES_DMA(DMACH_I2S2_RX),
-};
-
-struct platform_device s5p6450_device_iis2 = {
-       .name           = "samsung-i2s",
-       .id             = 2,
-       .num_resources  = ARRAY_SIZE(s5p6450_i2s2_resource),
-       .resource       = s5p6450_i2s2_resource,
-       .dev = {
-               .platform_data = &s5p6450_i2s_pdata,
-       },
-};
-
-/* PCM Controller platform_devices */
-
-static int s5p6440_pcm_cfg_gpio(struct platform_device *pdev)
-{
-       switch (pdev->id) {
-       case 0:
-               s3c_gpio_cfgpin_range(S5P6440_GPR(6), 3, S3C_GPIO_SFN(2));
-               s3c_gpio_cfgpin_range(S5P6440_GPR(13), 2, S3C_GPIO_SFN(2));
-               break;
-
-       default:
-               printk(KERN_DEBUG "Invalid PCM Controller number!");
-               return -EINVAL;
-       }
-
-       return 0;
-}
-
-static struct s3c_audio_pdata s5p6440_pcm_pdata = {
-       .cfg_gpio = s5p6440_pcm_cfg_gpio,
-};
-
-static struct resource s5p6440_pcm0_resource[] = {
-       [0] = DEFINE_RES_MEM(S5P64X0_PA_PCM, SZ_256),
-       [1] = DEFINE_RES_DMA(DMACH_PCM0_TX),
-       [2] = DEFINE_RES_DMA(DMACH_PCM0_RX),
-};
-
-struct platform_device s5p6440_device_pcm = {
-       .name           = "samsung-pcm",
-       .id             = 0,
-       .num_resources  = ARRAY_SIZE(s5p6440_pcm0_resource),
-       .resource       = s5p6440_pcm0_resource,
-       .dev = {
-               .platform_data = &s5p6440_pcm_pdata,
-       },
-};
diff --git a/arch/arm/mach-s5p64x0/dma.c b/arch/arm/mach-s5p64x0/dma.c
deleted file mode 100644 (file)
index 9c4ce08..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-/* linux/arch/arm/mach-s5p64x0/dma.c
- *
- * Copyright (c) 2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * Copyright (C) 2010 Samsung Electronics Co. Ltd.
- *     Jaswinder Singh <jassi.brar@samsung.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#include <linux/dma-mapping.h>
-#include <linux/amba/bus.h>
-#include <linux/amba/pl330.h>
-
-#include <asm/irq.h>
-
-#include <mach/map.h>
-#include <mach/irqs.h>
-#include <mach/regs-clock.h>
-#include <mach/dma.h>
-
-#include <plat/cpu.h>
-#include <plat/devs.h>
-#include <plat/irqs.h>
-
-static u8 s5p6440_pdma_peri[] = {
-       DMACH_UART0_RX,
-       DMACH_UART0_TX,
-       DMACH_UART1_RX,
-       DMACH_UART1_TX,
-       DMACH_UART2_RX,
-       DMACH_UART2_TX,
-       DMACH_UART3_RX,
-       DMACH_UART3_TX,
-       DMACH_MAX,
-       DMACH_MAX,
-       DMACH_PCM0_TX,
-       DMACH_PCM0_RX,
-       DMACH_I2S0_TX,
-       DMACH_I2S0_RX,
-       DMACH_SPI0_TX,
-       DMACH_SPI0_RX,
-       DMACH_MAX,
-       DMACH_MAX,
-       DMACH_MAX,
-       DMACH_MAX,
-       DMACH_SPI1_TX,
-       DMACH_SPI1_RX,
-};
-
-static struct dma_pl330_platdata s5p6440_pdma_pdata = {
-       .nr_valid_peri = ARRAY_SIZE(s5p6440_pdma_peri),
-       .peri_id = s5p6440_pdma_peri,
-};
-
-static u8 s5p6450_pdma_peri[] = {
-       DMACH_UART0_RX,
-       DMACH_UART0_TX,
-       DMACH_UART1_RX,
-       DMACH_UART1_TX,
-       DMACH_UART2_RX,
-       DMACH_UART2_TX,
-       DMACH_UART3_RX,
-       DMACH_UART3_TX,
-       DMACH_UART4_RX,
-       DMACH_UART4_TX,
-       DMACH_PCM0_TX,
-       DMACH_PCM0_RX,
-       DMACH_I2S0_TX,
-       DMACH_I2S0_RX,
-       DMACH_SPI0_TX,
-       DMACH_SPI0_RX,
-       DMACH_PCM1_TX,
-       DMACH_PCM1_RX,
-       DMACH_PCM2_TX,
-       DMACH_PCM2_RX,
-       DMACH_SPI1_TX,
-       DMACH_SPI1_RX,
-       DMACH_USI_TX,
-       DMACH_USI_RX,
-       DMACH_MAX,
-       DMACH_I2S1_TX,
-       DMACH_I2S1_RX,
-       DMACH_I2S2_TX,
-       DMACH_I2S2_RX,
-       DMACH_PWM,
-       DMACH_UART5_RX,
-       DMACH_UART5_TX,
-};
-
-static struct dma_pl330_platdata s5p6450_pdma_pdata = {
-       .nr_valid_peri = ARRAY_SIZE(s5p6450_pdma_peri),
-       .peri_id = s5p6450_pdma_peri,
-};
-
-static AMBA_AHB_DEVICE(s5p64x0_pdma, "dma-pl330", 0x00041330,
-       S5P64X0_PA_PDMA, {IRQ_DMA0}, NULL);
-
-static int __init s5p64x0_dma_init(void)
-{
-       if (soc_is_s5p6450()) {
-               dma_cap_set(DMA_SLAVE, s5p6450_pdma_pdata.cap_mask);
-               dma_cap_set(DMA_CYCLIC, s5p6450_pdma_pdata.cap_mask);
-               s5p64x0_pdma_device.dev.platform_data = &s5p6450_pdma_pdata;
-       } else {
-               dma_cap_set(DMA_SLAVE, s5p6440_pdma_pdata.cap_mask);
-               dma_cap_set(DMA_CYCLIC, s5p6440_pdma_pdata.cap_mask);
-               s5p64x0_pdma_device.dev.platform_data = &s5p6440_pdma_pdata;
-       }
-
-       amba_device_register(&s5p64x0_pdma_device, &iomem_resource);
-
-       return 0;
-}
-arch_initcall(s5p64x0_dma_init);
diff --git a/arch/arm/mach-s5p64x0/i2c.h b/arch/arm/mach-s5p64x0/i2c.h
deleted file mode 100644 (file)
index 1e5bb4e..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * Copyright (c) 2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * S5P64X0 I2C configuration
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-extern void s5p6440_i2c0_cfg_gpio(struct platform_device *dev);
-extern void s5p6440_i2c1_cfg_gpio(struct platform_device *dev);
-
-extern void s5p6450_i2c0_cfg_gpio(struct platform_device *dev);
-extern void s5p6450_i2c1_cfg_gpio(struct platform_device *dev);
diff --git a/arch/arm/mach-s5p64x0/include/mach/debug-macro.S b/arch/arm/mach-s5p64x0/include/mach/debug-macro.S
deleted file mode 100644 (file)
index 8759e78..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/* linux/arch/arm/mach-s5p64x0/include/mach/debug-macro.S
- *
- * Copyright (c) 2009-2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-/* pull in the relevant register and map files. */
-
-#include <linux/serial_s3c.h>
-#include <plat/map-base.h>
-#include <plat/map-s5p.h>
-
-       .macro addruart, rp, rv, tmp
-               mov     \rp, #0xE0000000
-               orr     \rp, \rp, #0x00100000
-               ldr     \rp, [\rp, #0x118 ]
-               and     \rp, \rp, #0xff000
-               teq     \rp, #0x50000           @@ S5P6450
-               ldreq   \rp, =0xEC800000
-               movne   \rp, #0xEC000000        @@ S5P6440
-               ldrne   \rv, = S3C_VA_UART
-#if CONFIG_DEBUG_S3C_UART != 0
-               add     \rp, \rp, #(0x400 * CONFIG_DEBUG_S3C_UART)
-               add     \rv, \rv, #(0x400 * CONFIG_DEBUG_S3C_UART)
-#endif
-       .endm
-
-#include <debug/samsung.S>
diff --git a/arch/arm/mach-s5p64x0/include/mach/dma.h b/arch/arm/mach-s5p64x0/include/mach/dma.h
deleted file mode 100644 (file)
index 5a622af..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2010 Samsung Electronics Co. Ltd.
- *     Jaswinder Singh <jassi.brar@samsung.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef __MACH_DMA_H
-#define __MACH_DMA_H
-
-/* This platform uses the common common DMA API driver for PL330 */
-#include <plat/dma-pl330.h>
-
-#endif /* __MACH_DMA_H */
diff --git a/arch/arm/mach-s5p64x0/include/mach/gpio.h b/arch/arm/mach-s5p64x0/include/mach/gpio.h
deleted file mode 100644 (file)
index 06cd3c9..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-/* linux/arch/arm/mach-s5p64x0/include/mach/gpio.h
- *
- * Copyright (c) 2009-2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * S5P64X0 - GPIO lib support
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#ifndef __ASM_ARCH_GPIO_H
-#define __ASM_ARCH_GPIO_H __FILE__
-
-/* GPIO bank sizes */
-
-#define S5P6440_GPIO_A_NR      (6)
-#define S5P6440_GPIO_B_NR      (7)
-#define S5P6440_GPIO_C_NR      (8)
-#define S5P6440_GPIO_F_NR      (16)
-#define S5P6440_GPIO_G_NR      (7)
-#define S5P6440_GPIO_H_NR      (10)
-#define S5P6440_GPIO_I_NR      (16)
-#define S5P6440_GPIO_J_NR      (12)
-#define S5P6440_GPIO_N_NR      (16)
-#define S5P6440_GPIO_P_NR      (8)
-#define S5P6440_GPIO_R_NR      (15)
-
-#define S5P6450_GPIO_A_NR      (6)
-#define S5P6450_GPIO_B_NR      (7)
-#define S5P6450_GPIO_C_NR      (8)
-#define S5P6450_GPIO_D_NR      (8)
-#define S5P6450_GPIO_F_NR      (16)
-#define S5P6450_GPIO_G_NR      (14)
-#define S5P6450_GPIO_H_NR      (10)
-#define S5P6450_GPIO_I_NR      (16)
-#define S5P6450_GPIO_J_NR      (12)
-#define S5P6450_GPIO_K_NR      (5)
-#define S5P6450_GPIO_N_NR      (16)
-#define S5P6450_GPIO_P_NR      (11)
-#define S5P6450_GPIO_Q_NR      (14)
-#define S5P6450_GPIO_R_NR      (15)
-#define S5P6450_GPIO_S_NR      (8)
-
-/* GPIO bank numbers */
-
-/* CONFIG_S3C_GPIO_SPACE allows the user to select extra
- * space for debugging purposes so that any accidental
- * change from one gpio bank to another can be caught.
-*/
-
-#define S5P64X0_GPIO_NEXT(__gpio) \
-       ((__gpio##_START) + (__gpio##_NR) + CONFIG_S3C_GPIO_SPACE + 1)
-
-enum s5p6440_gpio_number {
-       S5P6440_GPIO_A_START    = 0,
-       S5P6440_GPIO_B_START    = S5P64X0_GPIO_NEXT(S5P6440_GPIO_A),
-       S5P6440_GPIO_C_START    = S5P64X0_GPIO_NEXT(S5P6440_GPIO_B),
-       S5P6440_GPIO_F_START    = S5P64X0_GPIO_NEXT(S5P6440_GPIO_C),
-       S5P6440_GPIO_G_START    = S5P64X0_GPIO_NEXT(S5P6440_GPIO_F),
-       S5P6440_GPIO_H_START    = S5P64X0_GPIO_NEXT(S5P6440_GPIO_G),
-       S5P6440_GPIO_I_START    = S5P64X0_GPIO_NEXT(S5P6440_GPIO_H),
-       S5P6440_GPIO_J_START    = S5P64X0_GPIO_NEXT(S5P6440_GPIO_I),
-       S5P6440_GPIO_N_START    = S5P64X0_GPIO_NEXT(S5P6440_GPIO_J),
-       S5P6440_GPIO_P_START    = S5P64X0_GPIO_NEXT(S5P6440_GPIO_N),
-       S5P6440_GPIO_R_START    = S5P64X0_GPIO_NEXT(S5P6440_GPIO_P),
-};
-
-enum s5p6450_gpio_number {
-       S5P6450_GPIO_A_START    = 0,
-       S5P6450_GPIO_B_START    = S5P64X0_GPIO_NEXT(S5P6450_GPIO_A),
-       S5P6450_GPIO_C_START    = S5P64X0_GPIO_NEXT(S5P6450_GPIO_B),
-       S5P6450_GPIO_D_START    = S5P64X0_GPIO_NEXT(S5P6450_GPIO_C),
-       S5P6450_GPIO_F_START    = S5P64X0_GPIO_NEXT(S5P6450_GPIO_D),
-       S5P6450_GPIO_G_START    = S5P64X0_GPIO_NEXT(S5P6450_GPIO_F),
-       S5P6450_GPIO_H_START    = S5P64X0_GPIO_NEXT(S5P6450_GPIO_G),
-       S5P6450_GPIO_I_START    = S5P64X0_GPIO_NEXT(S5P6450_GPIO_H),
-       S5P6450_GPIO_J_START    = S5P64X0_GPIO_NEXT(S5P6450_GPIO_I),
-       S5P6450_GPIO_K_START    = S5P64X0_GPIO_NEXT(S5P6450_GPIO_J),
-       S5P6450_GPIO_N_START    = S5P64X0_GPIO_NEXT(S5P6450_GPIO_K),
-       S5P6450_GPIO_P_START    = S5P64X0_GPIO_NEXT(S5P6450_GPIO_N),
-       S5P6450_GPIO_Q_START    = S5P64X0_GPIO_NEXT(S5P6450_GPIO_P),
-       S5P6450_GPIO_R_START    = S5P64X0_GPIO_NEXT(S5P6450_GPIO_Q),
-       S5P6450_GPIO_S_START    = S5P64X0_GPIO_NEXT(S5P6450_GPIO_R),
-};
-
-/* GPIO number definitions */
-
-#define S5P6440_GPA(_nr)       (S5P6440_GPIO_A_START + (_nr))
-#define S5P6440_GPB(_nr)       (S5P6440_GPIO_B_START + (_nr))
-#define S5P6440_GPC(_nr)       (S5P6440_GPIO_C_START + (_nr))
-#define S5P6440_GPF(_nr)       (S5P6440_GPIO_F_START + (_nr))
-#define S5P6440_GPG(_nr)       (S5P6440_GPIO_G_START + (_nr))
-#define S5P6440_GPH(_nr)       (S5P6440_GPIO_H_START + (_nr))
-#define S5P6440_GPI(_nr)       (S5P6440_GPIO_I_START + (_nr))
-#define S5P6440_GPJ(_nr)       (S5P6440_GPIO_J_START + (_nr))
-#define S5P6440_GPN(_nr)       (S5P6440_GPIO_N_START + (_nr))
-#define S5P6440_GPP(_nr)       (S5P6440_GPIO_P_START + (_nr))
-#define S5P6440_GPR(_nr)       (S5P6440_GPIO_R_START + (_nr))
-
-#define S5P6450_GPA(_nr)       (S5P6450_GPIO_A_START + (_nr))
-#define S5P6450_GPB(_nr)       (S5P6450_GPIO_B_START + (_nr))
-#define S5P6450_GPC(_nr)       (S5P6450_GPIO_C_START + (_nr))
-#define S5P6450_GPD(_nr)       (S5P6450_GPIO_D_START + (_nr))
-#define S5P6450_GPF(_nr)       (S5P6450_GPIO_F_START + (_nr))
-#define S5P6450_GPG(_nr)       (S5P6450_GPIO_G_START + (_nr))
-#define S5P6450_GPH(_nr)       (S5P6450_GPIO_H_START + (_nr))
-#define S5P6450_GPI(_nr)       (S5P6450_GPIO_I_START + (_nr))
-#define S5P6450_GPJ(_nr)       (S5P6450_GPIO_J_START + (_nr))
-#define S5P6450_GPK(_nr)       (S5P6450_GPIO_K_START + (_nr))
-#define S5P6450_GPN(_nr)       (S5P6450_GPIO_N_START + (_nr))
-#define S5P6450_GPP(_nr)       (S5P6450_GPIO_P_START + (_nr))
-#define S5P6450_GPQ(_nr)       (S5P6450_GPIO_Q_START + (_nr))
-#define S5P6450_GPR(_nr)       (S5P6450_GPIO_R_START + (_nr))
-#define S5P6450_GPS(_nr)       (S5P6450_GPIO_S_START + (_nr))
-
-/* the end of the S5P64X0 specific gpios */
-
-#define S5P6440_GPIO_END       (S5P6440_GPR(S5P6440_GPIO_R_NR) + 1)
-#define S5P6450_GPIO_END       (S5P6450_GPS(S5P6450_GPIO_S_NR) + 1)
-
-#define S5P64X0_GPIO_END       (S5P6440_GPIO_END > S5P6450_GPIO_END ?  \
-                                S5P6440_GPIO_END : S5P6450_GPIO_END)
-
-#define S3C_GPIO_END           S5P64X0_GPIO_END
-
-/* define the number of gpios we need to the one after the last GPIO range */
-
-#define ARCH_NR_GPIOS          (S5P64X0_GPIO_END + CONFIG_SAMSUNG_GPIO_EXTRA)
-
-#endif /* __ASM_ARCH_GPIO_H */
diff --git a/arch/arm/mach-s5p64x0/include/mach/hardware.h b/arch/arm/mach-s5p64x0/include/mach/hardware.h
deleted file mode 100644 (file)
index d3e8799..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-/* linux/arch/arm/mach-s5p64x0/include/mach/hardware.h
- *
- * Copyright (c) 2009-2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * S5P64X0 - Hardware support
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#ifndef __ASM_ARCH_HARDWARE_H
-#define __ASM_ARCH_HARDWARE_H __FILE__
-
-/* currently nothing here, placeholder */
-
-#endif /* __ASM_ARCH_HARDWARE_H */
diff --git a/arch/arm/mach-s5p64x0/include/mach/irqs.h b/arch/arm/mach-s5p64x0/include/mach/irqs.h
deleted file mode 100644 (file)
index 53982db..0000000
+++ /dev/null
@@ -1,148 +0,0 @@
-/* linux/arch/arm/mach-s5p64x0/include/mach/irqs.h
- *
- * Copyright 2009-2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * S5P64X0 - IRQ definitions
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#ifndef __ASM_ARCH_IRQS_H
-#define __ASM_ARCH_IRQS_H __FILE__
-
-#include <plat/irqs.h>
-
-/* VIC0 */
-
-#define IRQ_EINT0_3            S5P_IRQ_VIC0(0)
-#define IRQ_EINT4_11           S5P_IRQ_VIC0(1)
-#define IRQ_RTC_TIC            S5P_IRQ_VIC0(2)
-#define IRQ_IIS1               S5P_IRQ_VIC0(3) /* for only S5P6450 */
-#define IRQ_IIS2               S5P_IRQ_VIC0(4) /* for only S5P6450 */
-#define IRQ_IIC1               S5P_IRQ_VIC0(5)
-#define IRQ_I2SV40             S5P_IRQ_VIC0(6)
-#define IRQ_GPS                        S5P_IRQ_VIC0(7) /* for only S5P6450 */
-
-#define IRQ_2D                 S5P_IRQ_VIC0(11)
-#define IRQ_TIMER0_VIC         S5P_IRQ_VIC0(23)
-#define IRQ_TIMER1_VIC         S5P_IRQ_VIC0(24)
-#define IRQ_TIMER2_VIC         S5P_IRQ_VIC0(25)
-#define IRQ_WDT                        S5P_IRQ_VIC0(26)
-#define IRQ_TIMER3_VIC         S5P_IRQ_VIC0(27)
-#define IRQ_TIMER4_VIC         S5P_IRQ_VIC0(28)
-#define IRQ_DISPCON0           S5P_IRQ_VIC0(29)
-#define IRQ_DISPCON1           S5P_IRQ_VIC0(30)
-#define IRQ_DISPCON2           S5P_IRQ_VIC0(31)
-
-/* VIC1 */
-
-#define IRQ_EINT12_15          S5P_IRQ_VIC1(0)
-#define IRQ_PCM0               S5P_IRQ_VIC1(2)
-#define IRQ_PCM1               S5P_IRQ_VIC1(3) /* for only S5P6450 */
-#define IRQ_PCM2               S5P_IRQ_VIC1(4) /* for only S5P6450 */
-#define IRQ_UART0              S5P_IRQ_VIC1(5)
-#define IRQ_UART1              S5P_IRQ_VIC1(6)
-#define IRQ_UART2              S5P_IRQ_VIC1(7)
-#define IRQ_UART3              S5P_IRQ_VIC1(8)
-#define IRQ_DMA0               S5P_IRQ_VIC1(9)
-#define IRQ_UART4              S5P_IRQ_VIC1(10)        /* S5P6450 */
-#define IRQ_UART5              S5P_IRQ_VIC1(11)        /* S5P6450 */
-#define IRQ_NFC                        S5P_IRQ_VIC1(13)
-#define IRQ_USI                        S5P_IRQ_VIC1(15)        /* S5P6450 */
-#define IRQ_SPI0               S5P_IRQ_VIC1(16)
-#define IRQ_SPI1               S5P_IRQ_VIC1(17)
-#define IRQ_HSMMC2             S5P_IRQ_VIC1(17)        /* Shared */
-#define IRQ_IIC                        S5P_IRQ_VIC1(18)
-#define IRQ_DISPCON3           S5P_IRQ_VIC1(19)
-#define IRQ_EINT_GROUPS                S5P_IRQ_VIC1(21)
-#define IRQ_PMU                        S5P_IRQ_VIC1(23)        /* S5P6440 */
-#define IRQ_HSMMC0             S5P_IRQ_VIC1(24)
-#define IRQ_HSMMC1             S5P_IRQ_VIC1(25)
-#define IRQ_OTG                        S5P_IRQ_VIC1(26)
-#define IRQ_DSI                        S5P_IRQ_VIC1(27)
-#define IRQ_RTC_ALARM          S5P_IRQ_VIC1(28)
-#define IRQ_TSI                        S5P_IRQ_VIC1(29)
-#define IRQ_PENDN              S5P_IRQ_VIC1(30)
-#define IRQ_TC                 IRQ_PENDN
-#define IRQ_ADC                        S5P_IRQ_VIC1(31)
-
-/* UART interrupts, S5P6450 has 5 UARTs */
-#define IRQ_S5P_UART_BASE4     (96)
-#define IRQ_S5P_UART_BASE5     (100)
-
-#define IRQ_S5P_UART_RX4       (IRQ_S5P_UART_BASE4 + UART_IRQ_RXD)
-#define IRQ_S5P_UART_TX4       (IRQ_S5P_UART_BASE4 + UART_IRQ_TXD)
-#define IRQ_S5P_UART_ERR4      (IRQ_S5P_UART_BASE4 + UART_IRQ_ERR)
-
-#define IRQ_S5P_UART_RX5       (IRQ_S5P_UART_BASE5 + UART_IRQ_RXD)
-#define IRQ_S5P_UART_TX5       (IRQ_S5P_UART_BASE5 + UART_IRQ_TXD)
-#define IRQ_S5P_UART_ERR5      (IRQ_S5P_UART_BASE5 + UART_IRQ_ERR)
-
-/* S3C compatibilty defines */
-#define IRQ_S3CUART_RX4                IRQ_S5P_UART_RX4
-#define IRQ_S3CUART_RX5                IRQ_S5P_UART_RX5
-
-#define IRQ_I2S0               IRQ_I2SV40
-
-#define IRQ_LCD_FIFO           IRQ_DISPCON0
-#define IRQ_LCD_VSYNC          IRQ_DISPCON1
-#define IRQ_LCD_SYSTEM         IRQ_DISPCON2
-
-/* S5P6450 EINT feature will be added */
-
-/*
- * Since the IRQ_EINT(x) are a linear mapping on s5p6440 we just defined
- * them as an IRQ_EINT(x) macro from S5P_IRQ_EINT_BASE which we place
- * after the pair of VICs.
- */
-
-#define S5P_IRQ_EINT_BASE      (S5P_IRQ_VIC1(31) + 6)
-
-#define S5P_EINT(x)            ((x) + S5P_IRQ_EINT_BASE)
-
-#define S5P_EINT_BASE1         (S5P_IRQ_EINT_BASE)
-/*
- * S5P6440 has 0-15 external interrupts in group 0. Only these can be used
- * to wake up from sleep. If request is beyond this range, by mistake, a large
- * return value for an irq number should be indication of something amiss.
- */
-#define S5P_EINT_BASE2         (0xf0000000)
-
-/*
- * Next the external interrupt groups. These are similar to the IRQ_EINT(x)
- * that they are sourced from the GPIO pins but with a different scheme for
- * priority and source indication.
- *
- * The IRQ_EINT(x) can be thought of as 'group 0' of the available GPIO
- * interrupts, but for historical reasons they are kept apart from these
- * next interrupts.
- *
- * Use IRQ_EINT_GROUP(group, offset) to get the number for use in the
- * machine specific support files.
- */
-
-/* Actually, #6 and #7 are missing in the EINT_GROUP1 */
-#define IRQ_EINT_GROUP1_NR     (15)
-#define IRQ_EINT_GROUP2_NR     (8)
-#define IRQ_EINT_GROUP5_NR     (7)
-#define IRQ_EINT_GROUP6_NR     (10)
-/* Actually, #0, #1 and #2 are missing in the EINT_GROUP8 */
-#define IRQ_EINT_GROUP8_NR     (11)
-
-#define IRQ_EINT_GROUP_BASE    S5P_EINT(16)
-#define IRQ_EINT_GROUP1_BASE   (IRQ_EINT_GROUP_BASE + 0)
-#define IRQ_EINT_GROUP2_BASE   (IRQ_EINT_GROUP1_BASE + IRQ_EINT_GROUP1_NR)
-#define IRQ_EINT_GROUP5_BASE   (IRQ_EINT_GROUP2_BASE + IRQ_EINT_GROUP2_NR)
-#define IRQ_EINT_GROUP6_BASE   (IRQ_EINT_GROUP5_BASE + IRQ_EINT_GROUP5_NR)
-#define IRQ_EINT_GROUP8_BASE   (IRQ_EINT_GROUP6_BASE + IRQ_EINT_GROUP6_NR)
-
-#define IRQ_EINT_GROUP(grp, x) (IRQ_EINT_GROUP##grp##_BASE + (x))
-
-/* Set the default NR_IRQS */
-
-#define NR_IRQS                        (IRQ_EINT_GROUP8_BASE + IRQ_EINT_GROUP8_NR + 1)
-
-#endif /* __ASM_ARCH_IRQS_H */
diff --git a/arch/arm/mach-s5p64x0/include/mach/map.h b/arch/arm/mach-s5p64x0/include/mach/map.h
deleted file mode 100644 (file)
index 50a6e96..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-/* linux/arch/arm/mach-s5p64x0/include/mach/map.h
- *
- * Copyright (c) 2009-2011 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * S5P64X0 - Memory map definitions
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#ifndef __ASM_ARCH_MAP_H
-#define __ASM_ARCH_MAP_H __FILE__
-
-#include <plat/map-base.h>
-#include <plat/map-s5p.h>
-
-#define S5P64X0_PA_SDRAM       0x20000000
-
-#define S5P64X0_PA_CHIPID      0xE0000000
-
-#define S5P64X0_PA_SYSCON      0xE0100000
-
-#define S5P64X0_PA_GPIO                0xE0308000
-
-#define S5P64X0_PA_VIC0                0xE4000000
-#define S5P64X0_PA_VIC1                0xE4100000
-
-#define S5P64X0_PA_SROMC       0xE7000000
-
-#define S5P64X0_PA_PDMA                0xE9000000
-
-#define S5P64X0_PA_TIMER       0xEA000000
-#define S5P64X0_PA_RTC         0xEA100000
-#define S5P64X0_PA_WDT         0xEA200000
-
-#define S5P6440_PA_IIC0                0xEC104000
-#define S5P6440_PA_IIC1                0xEC20F000
-#define S5P6450_PA_IIC0                0xEC100000
-#define S5P6450_PA_IIC1                0xEC200000
-
-#define S5P64X0_PA_SPI0                0xEC400000
-#define S5P64X0_PA_SPI1                0xEC500000
-
-#define S5P64X0_PA_HSOTG       0xED100000
-
-#define S5P64X0_PA_HSMMC(x)    (0xED800000 + ((x) * 0x100000))
-
-#define S5P64X0_PA_FB          0xEE000000
-
-#define S5P64X0_PA_I2S         0xF2000000
-#define S5P6450_PA_I2S1                0xF2800000
-#define S5P6450_PA_I2S2                0xF2900000
-
-#define S5P64X0_PA_PCM         0xF2100000
-
-#define S5P64X0_PA_ADC         0xF3000000
-
-/* Compatibiltiy Defines */
-
-#define S3C_PA_HSMMC0          S5P64X0_PA_HSMMC(0)
-#define S3C_PA_HSMMC1          S5P64X0_PA_HSMMC(1)
-#define S3C_PA_HSMMC2          S5P64X0_PA_HSMMC(2)
-#define S3C_PA_IIC             S5P6440_PA_IIC0
-#define S3C_PA_IIC1            S5P6440_PA_IIC1
-#define S3C_PA_RTC             S5P64X0_PA_RTC
-#define S3C_PA_WDT             S5P64X0_PA_WDT
-#define S3C_PA_FB              S5P64X0_PA_FB
-#define S3C_PA_SPI0            S5P64X0_PA_SPI0
-#define S3C_PA_SPI1            S5P64X0_PA_SPI1
-
-#define S5P_PA_CHIPID          S5P64X0_PA_CHIPID
-#define S5P_PA_SROMC           S5P64X0_PA_SROMC
-#define S5P_PA_SYSCON          S5P64X0_PA_SYSCON
-#define S5P_PA_TIMER           S5P64X0_PA_TIMER
-
-#define SAMSUNG_PA_ADC         S5P64X0_PA_ADC
-#define SAMSUNG_PA_TIMER       S5P64X0_PA_TIMER
-
-/* UART */
-
-#define S5P6440_PA_UART(x)     (0xEC000000 + ((x) * S3C_UART_OFFSET))
-#define S5P6450_PA_UART(x)     ((x < 5) ? (0xEC800000 + ((x) * S3C_UART_OFFSET)) : (0xEC000000))
-
-#define S5P_PA_UART0           S5P6450_PA_UART(0)
-#define S5P_PA_UART1           S5P6450_PA_UART(1)
-#define S5P_PA_UART2           S5P6450_PA_UART(2)
-#define S5P_PA_UART3           S5P6450_PA_UART(3)
-#define S5P_PA_UART4           S5P6450_PA_UART(4)
-#define S5P_PA_UART5           S5P6450_PA_UART(5)
-
-#define S5P_SZ_UART            SZ_256
-#define S3C_VA_UARTx(x)                (S3C_VA_UART + ((x) * S3C_UART_OFFSET))
-
-#endif /* __ASM_ARCH_MAP_H */
diff --git a/arch/arm/mach-s5p64x0/include/mach/pm-core.h b/arch/arm/mach-s5p64x0/include/mach/pm-core.h
deleted file mode 100644 (file)
index 1e0eb65..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-/* linux/arch/arm/mach-s5p64x0/include/mach/pm-core.h
- *
- * Copyright (c) 2011 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * S5P64X0 - PM core support for arch/arm/plat-samsung/pm.c
- *
- * Based on PM core support for S3C64XX by Ben Dooks
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#include <linux/serial_s3c.h>
-
-#include <mach/regs-gpio.h>
-
-static inline void s3c_pm_debug_init_uart(void)
-{
-       u32 tmp = __raw_readl(S5P64X0_CLK_GATE_PCLK);
-
-       /*
-        * As a note, since the S5P64X0 UARTs generally have multiple
-        * clock sources, we simply enable PCLK at the moment and hope
-        * that the resume settings for the UART are suitable for the
-        * use with PCLK.
-        */
-       tmp |= S5P64X0_CLK_GATE_PCLK_UART0;
-       tmp |= S5P64X0_CLK_GATE_PCLK_UART1;
-       tmp |= S5P64X0_CLK_GATE_PCLK_UART2;
-       tmp |= S5P64X0_CLK_GATE_PCLK_UART3;
-
-       __raw_writel(tmp, S5P64X0_CLK_GATE_PCLK);
-       udelay(10);
-}
-
-static inline void s3c_pm_arch_prepare_irqs(void)
-{
-       /* VIC should have already been taken care of */
-
-       /* clear any pending EINT0 interrupts */
-       __raw_writel(__raw_readl(S5P64X0_EINT0PEND), S5P64X0_EINT0PEND);
-}
-
-static inline void s3c_pm_arch_stop_clocks(void) { }
-static inline void s3c_pm_arch_show_resume_irqs(void) { }
-
-/*
- * make these defines, we currently do not have any need to change
- * the IRQ wake controls depending on the CPU we are running on
- */
-#define s3c_irqwake_eintallow  ((1 << 16) - 1)
-#define s3c_irqwake_intallow   (~0)
-
-static inline void s3c_pm_arch_update_uart(void __iomem *regs,
-                                       struct pm_uart_save *save)
-{
-       u32 ucon = __raw_readl(regs + S3C2410_UCON);
-       u32 ucon_clk = ucon & S3C6400_UCON_CLKMASK;
-       u32 save_clk = save->ucon & S3C6400_UCON_CLKMASK;
-       u32 new_ucon;
-       u32 delta;
-
-       /*
-        * S5P64X0 UART blocks only support level interrupts, so ensure that
-        * when we restore unused UART blocks we force the level interrupt
-        * settings.
-        */
-       save->ucon |= S3C2410_UCON_TXILEVEL | S3C2410_UCON_RXILEVEL;
-
-       /*
-        * We have a constraint on changing the clock type of the UART
-        * between UCLKx and PCLK, so ensure that when we restore UCON
-        * that the CLK field is correctly modified if the bootloader
-        * has changed anything.
-        */
-       if (ucon_clk != save_clk) {
-               new_ucon = save->ucon;
-               delta = ucon_clk ^ save_clk;
-
-               /*
-                * change from UCLKx => wrong PCLK,
-                * either UCLK can be tested for by a bit-test
-                * with UCLK0
-                */
-               if (ucon_clk & S3C6400_UCON_UCLK0 &&
-               !(save_clk & S3C6400_UCON_UCLK0) &&
-               delta & S3C6400_UCON_PCLK2) {
-                       new_ucon &= ~S3C6400_UCON_UCLK0;
-               } else if (delta == S3C6400_UCON_PCLK2) {
-                       /*
-                        * as a precaution, don't change from
-                        * PCLK2 => PCLK or vice-versa
-                        */
-                       new_ucon ^= S3C6400_UCON_PCLK2;
-               }
-
-               S3C_PMDBG("ucon change %04x => %04x (save=%04x)\n",
-                       ucon, new_ucon, save->ucon);
-               save->ucon = new_ucon;
-       }
-}
-
-static inline void s3c_pm_restored_gpios(void)
-{
-       /* ensure sleep mode has been cleared from the system */
-       __raw_writel(0, S5P64X0_SLPEN);
-}
-
-static inline void samsung_pm_saved_gpios(void)
-{
-       /*
-        * turn on the sleep mode and keep it there, as it seems that during
-        * suspend the xCON registers get re-set and thus you can end up with
-        * problems between going to sleep and resuming.
-        */
-       __raw_writel(S5P64X0_SLPEN_USE_xSLP, S5P64X0_SLPEN);
-}
diff --git a/arch/arm/mach-s5p64x0/include/mach/regs-clock.h b/arch/arm/mach-s5p64x0/include/mach/regs-clock.h
deleted file mode 100644 (file)
index bd91112..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-/* linux/arch/arm/mach-s5p64x0/include/mach/regs-clock.h
- *
- * Copyright (c) 2009-2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * S5P64X0 - Clock register definitions
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#ifndef __ASM_ARCH_REGS_CLOCK_H
-#define __ASM_ARCH_REGS_CLOCK_H __FILE__
-
-#include <mach/map.h>
-
-#define S5P_CLKREG(x)                  (S3C_VA_SYS + (x))
-
-#define S5P64X0_APLL_CON               S5P_CLKREG(0x0C)
-#define S5P64X0_MPLL_CON               S5P_CLKREG(0x10)
-#define S5P64X0_EPLL_CON               S5P_CLKREG(0x14)
-#define S5P64X0_EPLL_CON_K             S5P_CLKREG(0x18)
-
-#define S5P64X0_CLK_SRC0               S5P_CLKREG(0x1C)
-
-#define S5P64X0_CLK_DIV0               S5P_CLKREG(0x20)
-#define S5P64X0_CLK_DIV1               S5P_CLKREG(0x24)
-#define S5P64X0_CLK_DIV2               S5P_CLKREG(0x28)
-
-#define S5P64X0_CLK_GATE_HCLK0         S5P_CLKREG(0x30)
-#define S5P64X0_CLK_GATE_PCLK          S5P_CLKREG(0x34)
-#define S5P64X0_CLK_GATE_SCLK0         S5P_CLKREG(0x38)
-#define S5P64X0_CLK_GATE_MEM0          S5P_CLKREG(0x3C)
-
-#define S5P64X0_CLK_DIV3               S5P_CLKREG(0x40)
-
-#define S5P64X0_CLK_GATE_HCLK1         S5P_CLKREG(0x44)
-#define S5P64X0_CLK_GATE_SCLK1         S5P_CLKREG(0x48)
-
-#define S5P6450_DPLL_CON               S5P_CLKREG(0x50)
-#define S5P6450_DPLL_CON_K             S5P_CLKREG(0x54)
-
-#define S5P64X0_AHB_CON0               S5P_CLKREG(0x100)
-#define S5P64X0_CLK_SRC1               S5P_CLKREG(0x10C)
-
-#define S5P64X0_SYS_ID                 S5P_CLKREG(0x118)
-#define S5P64X0_SYS_OTHERS             S5P_CLKREG(0x11C)
-
-#define S5P64X0_PWR_CFG                        S5P_CLKREG(0x804)
-#define S5P64X0_EINT_WAKEUP_MASK       S5P_CLKREG(0x808)
-#define S5P64X0_SLEEP_CFG              S5P_CLKREG(0x818)
-#define S5P64X0_PWR_STABLE             S5P_CLKREG(0x828)
-
-#define S5P64X0_OTHERS                 S5P_CLKREG(0x900)
-#define S5P64X0_WAKEUP_STAT            S5P_CLKREG(0x908)
-
-#define S5P64X0_INFORM0                        S5P_CLKREG(0xA00)
-
-#define S5P64X0_CLKDIV0_HCLK_SHIFT     (8)
-#define S5P64X0_CLKDIV0_HCLK_MASK      (0xF << S5P64X0_CLKDIV0_HCLK_SHIFT)
-
-/* HCLK GATE Registers */
-#define S5P64X0_CLK_GATE_HCLK1_FIMGVG  (1 << 2)
-#define S5P64X0_CLK_GATE_SCLK1_FIMGVG  (1 << 2)
-
-/* PCLK GATE Registers */
-#define S5P64X0_CLK_GATE_PCLK_UART3    (1 << 4)
-#define S5P64X0_CLK_GATE_PCLK_UART2    (1 << 3)
-#define S5P64X0_CLK_GATE_PCLK_UART1    (1 << 2)
-#define S5P64X0_CLK_GATE_PCLK_UART0    (1 << 1)
-
-#define S5P64X0_PWR_CFG_MMC1_DISABLE           (1 << 15)
-#define S5P64X0_PWR_CFG_MMC0_DISABLE           (1 << 14)
-#define S5P64X0_PWR_CFG_RTC_TICK_DISABLE       (1 << 11)
-#define S5P64X0_PWR_CFG_RTC_ALRM_DISABLE       (1 << 10)
-#define S5P64X0_PWR_CFG_WFI_MASK               (3 << 5)
-#define S5P64X0_PWR_CFG_WFI_SLEEP              (3 << 5)
-
-#define S5P64X0_SLEEP_CFG_OSC_EN       (1 << 0)
-
-#define S5P64X0_PWR_STABLE_PWR_CNT_VAL4        (4 << 0)
-
-#define S5P6450_OTHERS_DISABLE_INT     (1 << 31)
-#define S5P64X0_OTHERS_RET_UART                (1 << 26)
-#define S5P64X0_OTHERS_RET_MMC1                (1 << 25)
-#define S5P64X0_OTHERS_RET_MMC0                (1 << 24)
-#define S5P64X0_OTHERS_USB_SIG_MASK    (1 << 16)
-
-/* Compatibility defines */
-
-#define ARM_CLK_DIV                    S5P64X0_CLK_DIV0
-#define ARM_DIV_RATIO_SHIFT            0
-#define ARM_DIV_MASK                   (0xF << ARM_DIV_RATIO_SHIFT)
-
-#define S5P_EPLL_CON                   S5P64X0_EPLL_CON
-
-#endif /* __ASM_ARCH_REGS_CLOCK_H */
diff --git a/arch/arm/mach-s5p64x0/include/mach/regs-gpio.h b/arch/arm/mach-s5p64x0/include/mach/regs-gpio.h
deleted file mode 100644 (file)
index cfdfa4f..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-/* linux/arch/arm/mach-s5p64x0/include/mach/regs-gpio.h
- *
- * Copyright (c) 2009-2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * S5P64X0 - GPIO register definitions
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#ifndef __ASM_ARCH_REGS_GPIO_H
-#define __ASM_ARCH_REGS_GPIO_H __FILE__
-
-#include <mach/map.h>
-
-/* Base addresses for each of the banks */
-
-#define S5P64X0_GPA_BASE               (S5P_VA_GPIO + 0x0000)
-#define S5P64X0_GPB_BASE               (S5P_VA_GPIO + 0x0020)
-#define S5P64X0_GPC_BASE               (S5P_VA_GPIO + 0x0040)
-#define S5P64X0_GPF_BASE               (S5P_VA_GPIO + 0x00A0)
-#define S5P64X0_GPG_BASE               (S5P_VA_GPIO + 0x00C0)
-#define S5P64X0_GPH_BASE               (S5P_VA_GPIO + 0x00E0)
-#define S5P64X0_GPI_BASE               (S5P_VA_GPIO + 0x0100)
-#define S5P64X0_GPJ_BASE               (S5P_VA_GPIO + 0x0120)
-#define S5P64X0_GPN_BASE               (S5P_VA_GPIO + 0x0830)
-#define S5P64X0_GPP_BASE               (S5P_VA_GPIO + 0x0160)
-#define S5P64X0_GPR_BASE               (S5P_VA_GPIO + 0x0290)
-
-#define S5P6450_GPD_BASE               (S5P_VA_GPIO + 0x0060)
-#define S5P6450_GPK_BASE               (S5P_VA_GPIO + 0x0140)
-#define S5P6450_GPQ_BASE               (S5P_VA_GPIO + 0x0180)
-#define S5P6450_GPS_BASE               (S5P_VA_GPIO + 0x0300)
-
-#define S5P64X0_SPCON0                 (S5P_VA_GPIO + 0x1A0)
-#define S5P64X0_SPCON0_LCD_SEL_MASK    (0x3 << 0)
-#define S5P64X0_SPCON0_LCD_SEL_RGB     (0x1 << 0)
-#define S5P64X0_SPCON1                 (S5P_VA_GPIO + 0x2B0)
-
-#define S5P64X0_MEM0CONSLP0            (S5P_VA_GPIO + 0x1C0)
-#define S5P64X0_MEM0CONSLP1            (S5P_VA_GPIO + 0x1C4)
-#define S5P64X0_MEM0DRVCON             (S5P_VA_GPIO + 0x1D0)
-#define S5P64X0_MEM1DRVCON             (S5P_VA_GPIO + 0x1D4)
-
-#define S5P64X0_EINT12CON              (S5P_VA_GPIO + 0x200)
-#define S5P64X0_EINT12FLTCON           (S5P_VA_GPIO + 0x220)
-#define S5P64X0_EINT12MASK             (S5P_VA_GPIO + 0x240)
-
-/* External interrupt control registers for group0 */
-
-#define EINT0CON0_OFFSET               (0x900)
-#define EINT0FLTCON0_OFFSET            (0x910)
-#define EINT0FLTCON1_OFFSET            (0x914)
-#define EINT0MASK_OFFSET               (0x920)
-#define EINT0PEND_OFFSET               (0x924)
-
-#define S5P64X0_EINT0CON0              (S5P_VA_GPIO + EINT0CON0_OFFSET)
-#define S5P64X0_EINT0FLTCON0           (S5P_VA_GPIO + EINT0FLTCON0_OFFSET)
-#define S5P64X0_EINT0FLTCON1           (S5P_VA_GPIO + EINT0FLTCON1_OFFSET)
-#define S5P64X0_EINT0MASK              (S5P_VA_GPIO + EINT0MASK_OFFSET)
-#define S5P64X0_EINT0PEND              (S5P_VA_GPIO + EINT0PEND_OFFSET)
-
-#define S5P64X0_SLPEN                  (S5P_VA_GPIO + 0x930)
-#define S5P64X0_SLPEN_USE_xSLP         (1 << 0)
-
-#endif /* __ASM_ARCH_REGS_GPIO_H */
diff --git a/arch/arm/mach-s5p64x0/include/mach/regs-irq.h b/arch/arm/mach-s5p64x0/include/mach/regs-irq.h
deleted file mode 100644 (file)
index d60397d..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-/* linux/arch/arm/mach-s5p64x0/include/mach/regs-irq.h
- *
- * Copyright (c) 2009-2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * S5P64X0 - IRQ register definitions
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#ifndef __ASM_ARCH_REGS_IRQ_H
-#define __ASM_ARCH_REGS_IRQ_H __FILE__
-
-#include <mach/map.h>
-
-#endif /* __ASM_ARCH_REGS_IRQ_H */
diff --git a/arch/arm/mach-s5p64x0/irq-pm.c b/arch/arm/mach-s5p64x0/irq-pm.c
deleted file mode 100644 (file)
index 2ed921e..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-/* linux/arch/arm/mach-s5p64x0/irq-pm.c
- *
- * Copyright (c) 2011 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * S5P64X0 - Interrupt handling Power Management
- *
- * Based on arch/arm/mach-s3c64xx/irq-pm.c by Ben Dooks
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#include <linux/syscore_ops.h>
-#include <linux/serial_core.h>
-#include <linux/serial_s3c.h>
-#include <linux/io.h>
-
-#include <plat/pm.h>
-
-#include <mach/regs-gpio.h>
-
-static struct sleep_save irq_save[] = {
-       SAVE_ITEM(S5P64X0_EINT0CON0),
-       SAVE_ITEM(S5P64X0_EINT0FLTCON0),
-       SAVE_ITEM(S5P64X0_EINT0FLTCON1),
-       SAVE_ITEM(S5P64X0_EINT0MASK),
-};
-
-static struct irq_grp_save {
-       u32     con;
-       u32     fltcon;
-       u32     mask;
-} eint_grp_save[4];
-
-#ifdef CONFIG_SERIAL_SAMSUNG
-static u32 irq_uart_mask[CONFIG_SERIAL_SAMSUNG_UARTS];
-#endif
-
-static int s5p64x0_irq_pm_suspend(void)
-{
-       struct irq_grp_save *grp = eint_grp_save;
-       int i;
-
-       S3C_PMDBG("%s: suspending IRQs\n", __func__);
-
-       s3c_pm_do_save(irq_save, ARRAY_SIZE(irq_save));
-
-#ifdef CONFIG_SERIAL_SAMSUNG
-       for (i = 0; i < CONFIG_SERIAL_SAMSUNG_UARTS; i++)
-               irq_uart_mask[i] = __raw_readl(S3C_VA_UARTx(i) + S3C64XX_UINTM);
-#endif
-
-       for (i = 0; i < ARRAY_SIZE(eint_grp_save); i++, grp++) {
-               grp->con = __raw_readl(S5P64X0_EINT12CON + (i * 4));
-               grp->mask = __raw_readl(S5P64X0_EINT12MASK + (i * 4));
-               grp->fltcon = __raw_readl(S5P64X0_EINT12FLTCON + (i * 4));
-       }
-
-       return 0;
-}
-
-static void s5p64x0_irq_pm_resume(void)
-{
-       struct irq_grp_save *grp = eint_grp_save;
-       int i;
-
-       S3C_PMDBG("%s: resuming IRQs\n", __func__);
-
-       s3c_pm_do_restore(irq_save, ARRAY_SIZE(irq_save));
-
-#ifdef CONFIG_SERIAL_SAMSUNG
-       for (i = 0; i < CONFIG_SERIAL_SAMSUNG_UARTS; i++)
-               __raw_writel(irq_uart_mask[i], S3C_VA_UARTx(i) + S3C64XX_UINTM);
-#endif
-
-       for (i = 0; i < ARRAY_SIZE(eint_grp_save); i++, grp++) {
-               __raw_writel(grp->con, S5P64X0_EINT12CON + (i * 4));
-               __raw_writel(grp->mask, S5P64X0_EINT12MASK + (i * 4));
-               __raw_writel(grp->fltcon, S5P64X0_EINT12FLTCON + (i * 4));
-       }
-
-       S3C_PMDBG("%s: IRQ configuration restored\n", __func__);
-}
-
-static struct syscore_ops s5p64x0_irq_syscore_ops = {
-       .suspend = s5p64x0_irq_pm_suspend,
-       .resume  = s5p64x0_irq_pm_resume,
-};
-
-static int __init s5p64x0_syscore_init(void)
-{
-       register_syscore_ops(&s5p64x0_irq_syscore_ops);
-
-       return 0;
-}
-core_initcall(s5p64x0_syscore_init);
diff --git a/arch/arm/mach-s5p64x0/mach-smdk6440.c b/arch/arm/mach-s5p64x0/mach-smdk6440.c
deleted file mode 100644 (file)
index 6840e19..0000000
+++ /dev/null
@@ -1,280 +0,0 @@
-/* linux/arch/arm/mach-s5p64x0/mach-smdk6440.c
- *
- * Copyright (c) 2009-2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/interrupt.h>
-#include <linux/list.h>
-#include <linux/timer.h>
-#include <linux/delay.h>
-#include <linux/init.h>
-#include <linux/i2c.h>
-#include <linux/serial_core.h>
-#include <linux/serial_s3c.h>
-#include <linux/platform_device.h>
-#include <linux/io.h>
-#include <linux/module.h>
-#include <linux/clk.h>
-#include <linux/gpio.h>
-#include <linux/pwm_backlight.h>
-#include <linux/fb.h>
-#include <linux/mmc/host.h>
-
-#include <video/platform_lcd.h>
-#include <video/samsung_fimd.h>
-
-#include <asm/mach/arch.h>
-#include <asm/mach/map.h>
-#include <asm/irq.h>
-#include <asm/mach-types.h>
-
-#include <mach/hardware.h>
-#include <mach/map.h>
-#include <mach/regs-clock.h>
-#include <mach/regs-gpio.h>
-
-#include <plat/gpio-cfg.h>
-#include <plat/clock.h>
-#include <plat/devs.h>
-#include <plat/cpu.h>
-#include <linux/platform_data/i2c-s3c2410.h>
-#include <plat/pll.h>
-#include <plat/adc.h>
-#include <linux/platform_data/touchscreen-s3c2410.h>
-#include <plat/samsung-time.h>
-#include <plat/backlight.h>
-#include <plat/fb.h>
-#include <plat/sdhci.h>
-
-#include "common.h"
-#include "i2c.h"
-
-#define SMDK6440_UCON_DEFAULT  (S3C2410_UCON_TXILEVEL |        \
-                               S3C2410_UCON_RXILEVEL |         \
-                               S3C2410_UCON_TXIRQMODE |        \
-                               S3C2410_UCON_RXIRQMODE |        \
-                               S3C2410_UCON_RXFIFO_TOI |       \
-                               S3C2443_UCON_RXERR_IRQEN)
-
-#define SMDK6440_ULCON_DEFAULT S3C2410_LCON_CS8
-
-#define SMDK6440_UFCON_DEFAULT (S3C2410_UFCON_FIFOMODE |       \
-                               S3C2440_UFCON_TXTRIG16 |        \
-                               S3C2410_UFCON_RXTRIG8)
-
-static struct s3c2410_uartcfg smdk6440_uartcfgs[] __initdata = {
-       [0] = {
-               .hwport         = 0,
-               .flags          = 0,
-               .ucon           = SMDK6440_UCON_DEFAULT,
-               .ulcon          = SMDK6440_ULCON_DEFAULT,
-               .ufcon          = SMDK6440_UFCON_DEFAULT,
-       },
-       [1] = {
-               .hwport         = 1,
-               .flags          = 0,
-               .ucon           = SMDK6440_UCON_DEFAULT,
-               .ulcon          = SMDK6440_ULCON_DEFAULT,
-               .ufcon          = SMDK6440_UFCON_DEFAULT,
-       },
-       [2] = {
-               .hwport         = 2,
-               .flags          = 0,
-               .ucon           = SMDK6440_UCON_DEFAULT,
-               .ulcon          = SMDK6440_ULCON_DEFAULT,
-               .ufcon          = SMDK6440_UFCON_DEFAULT,
-       },
-       [3] = {
-               .hwport         = 3,
-               .flags          = 0,
-               .ucon           = SMDK6440_UCON_DEFAULT,
-               .ulcon          = SMDK6440_ULCON_DEFAULT,
-               .ufcon          = SMDK6440_UFCON_DEFAULT,
-       },
-};
-
-/* Frame Buffer */
-static struct s3c_fb_pd_win smdk6440_fb_win0 = {
-       .max_bpp        = 32,
-       .default_bpp    = 24,
-       .xres           = 800,
-       .yres           = 480,
-};
-
-static struct fb_videomode smdk6440_lcd_timing = {
-       .left_margin    = 8,
-       .right_margin   = 13,
-       .upper_margin   = 7,
-       .lower_margin   = 5,
-       .hsync_len      = 3,
-       .vsync_len      = 1,
-       .xres           = 800,
-       .yres           = 480,
-};
-
-static struct s3c_fb_platdata smdk6440_lcd_pdata __initdata = {
-       .win[0]         = &smdk6440_fb_win0,
-       .vtiming        = &smdk6440_lcd_timing,
-       .vidcon0        = VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB,
-       .vidcon1        = VIDCON1_INV_HSYNC | VIDCON1_INV_VSYNC,
-       .setup_gpio     = s5p64x0_fb_gpio_setup_24bpp,
-};
-
-/* LCD power controller */
-static void smdk6440_lte480_reset_power(struct plat_lcd_data *pd,
-                                        unsigned int power)
-{
-       int err;
-
-       if (power) {
-               err = gpio_request(S5P6440_GPN(5), "GPN");
-               if (err) {
-                       printk(KERN_ERR "failed to request GPN for lcd reset\n");
-                       return;
-               }
-
-               gpio_direction_output(S5P6440_GPN(5), 1);
-               gpio_set_value(S5P6440_GPN(5), 0);
-               gpio_set_value(S5P6440_GPN(5), 1);
-               gpio_free(S5P6440_GPN(5));
-       }
-}
-
-static struct plat_lcd_data smdk6440_lcd_power_data = {
-       .set_power      = smdk6440_lte480_reset_power,
-};
-
-static struct platform_device smdk6440_lcd_lte480wv = {
-       .name                   = "platform-lcd",
-       .dev.parent             = &s3c_device_fb.dev,
-       .dev.platform_data      = &smdk6440_lcd_power_data,
-};
-
-static struct platform_device *smdk6440_devices[] __initdata = {
-       &s3c_device_adc,
-       &s3c_device_rtc,
-       &s3c_device_i2c0,
-       &s3c_device_i2c1,
-       &samsung_device_pwm,
-       &s3c_device_ts,
-       &s3c_device_wdt,
-       &s5p6440_device_iis,
-       &s3c_device_fb,
-       &smdk6440_lcd_lte480wv,
-       &s3c_device_hsmmc0,
-       &s3c_device_hsmmc1,
-       &s3c_device_hsmmc2,
-};
-
-static struct s3c_sdhci_platdata smdk6440_hsmmc0_pdata __initdata = {
-       .cd_type        = S3C_SDHCI_CD_NONE,
-};
-
-static struct s3c_sdhci_platdata smdk6440_hsmmc1_pdata __initdata = {
-       .cd_type        = S3C_SDHCI_CD_INTERNAL,
-#if defined(CONFIG_S5P64X0_SD_CH1_8BIT)
-       .max_width      = 8,
-       .host_caps      = MMC_CAP_8_BIT_DATA,
-#endif
-};
-
-static struct s3c_sdhci_platdata smdk6440_hsmmc2_pdata __initdata = {
-       .cd_type        = S3C_SDHCI_CD_NONE,
-};
-
-static struct s3c2410_platform_i2c s5p6440_i2c0_data __initdata = {
-       .flags          = 0,
-       .slave_addr     = 0x10,
-       .frequency      = 100*1000,
-       .sda_delay      = 100,
-       .cfg_gpio       = s5p6440_i2c0_cfg_gpio,
-};
-
-static struct s3c2410_platform_i2c s5p6440_i2c1_data __initdata = {
-       .flags          = 0,
-       .bus_num        = 1,
-       .slave_addr     = 0x10,
-       .frequency      = 100*1000,
-       .sda_delay      = 100,
-       .cfg_gpio       = s5p6440_i2c1_cfg_gpio,
-};
-
-static struct i2c_board_info smdk6440_i2c_devs0[] __initdata = {
-       { I2C_BOARD_INFO("24c08", 0x50), },
-       { I2C_BOARD_INFO("wm8580", 0x1b), },
-};
-
-static struct i2c_board_info smdk6440_i2c_devs1[] __initdata = {
-       /* To be populated */
-};
-
-/* LCD Backlight data */
-static struct samsung_bl_gpio_info smdk6440_bl_gpio_info = {
-       .no = S5P6440_GPF(15),
-       .func = S3C_GPIO_SFN(2),
-};
-
-static struct platform_pwm_backlight_data smdk6440_bl_data = {
-       .pwm_id = 1,
-       .enable_gpio = -1,
-};
-
-static void __init smdk6440_map_io(void)
-{
-       s5p64x0_init_io(NULL, 0);
-       s3c24xx_init_clocks(12000000);
-       s3c24xx_init_uarts(smdk6440_uartcfgs, ARRAY_SIZE(smdk6440_uartcfgs));
-       samsung_set_timer_source(SAMSUNG_PWM3, SAMSUNG_PWM4);
-}
-
-static void s5p6440_set_lcd_interface(void)
-{
-       unsigned int cfg;
-
-       /* select TFT LCD type (RGB I/F) */
-       cfg = __raw_readl(S5P64X0_SPCON0);
-       cfg &= ~S5P64X0_SPCON0_LCD_SEL_MASK;
-       cfg |= S5P64X0_SPCON0_LCD_SEL_RGB;
-       __raw_writel(cfg, S5P64X0_SPCON0);
-}
-
-static void __init smdk6440_machine_init(void)
-{
-       s3c24xx_ts_set_platdata(NULL);
-
-       s3c_i2c0_set_platdata(&s5p6440_i2c0_data);
-       s3c_i2c1_set_platdata(&s5p6440_i2c1_data);
-       i2c_register_board_info(0, smdk6440_i2c_devs0,
-                       ARRAY_SIZE(smdk6440_i2c_devs0));
-       i2c_register_board_info(1, smdk6440_i2c_devs1,
-                       ARRAY_SIZE(smdk6440_i2c_devs1));
-
-       s5p6440_set_lcd_interface();
-       s3c_fb_set_platdata(&smdk6440_lcd_pdata);
-
-       s3c_sdhci0_set_platdata(&smdk6440_hsmmc0_pdata);
-       s3c_sdhci1_set_platdata(&smdk6440_hsmmc1_pdata);
-       s3c_sdhci2_set_platdata(&smdk6440_hsmmc2_pdata);
-
-       platform_add_devices(smdk6440_devices, ARRAY_SIZE(smdk6440_devices));
-
-       samsung_bl_set(&smdk6440_bl_gpio_info, &smdk6440_bl_data);
-}
-
-MACHINE_START(SMDK6440, "SMDK6440")
-       /* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */
-       .atag_offset    = 0x100,
-
-       .init_irq       = s5p6440_init_irq,
-       .map_io         = smdk6440_map_io,
-       .init_machine   = smdk6440_machine_init,
-       .init_time      = samsung_timer_init,
-       .restart        = s5p64x0_restart,
-MACHINE_END
diff --git a/arch/arm/mach-s5p64x0/mach-smdk6450.c b/arch/arm/mach-s5p64x0/mach-smdk6450.c
deleted file mode 100644 (file)
index fa1341c..0000000
+++ /dev/null
@@ -1,299 +0,0 @@
-/* linux/arch/arm/mach-s5p64x0/mach-smdk6450.c
- *
- * Copyright (c) 2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/interrupt.h>
-#include <linux/list.h>
-#include <linux/timer.h>
-#include <linux/delay.h>
-#include <linux/init.h>
-#include <linux/i2c.h>
-#include <linux/serial_core.h>
-#include <linux/serial_s3c.h>
-#include <linux/platform_device.h>
-#include <linux/io.h>
-#include <linux/module.h>
-#include <linux/clk.h>
-#include <linux/gpio.h>
-#include <linux/pwm_backlight.h>
-#include <linux/fb.h>
-#include <linux/mmc/host.h>
-
-#include <video/platform_lcd.h>
-#include <video/samsung_fimd.h>
-
-#include <asm/mach/arch.h>
-#include <asm/mach/map.h>
-#include <asm/irq.h>
-#include <asm/mach-types.h>
-
-#include <mach/hardware.h>
-#include <mach/map.h>
-#include <mach/regs-clock.h>
-#include <mach/regs-gpio.h>
-
-#include <plat/gpio-cfg.h>
-#include <plat/clock.h>
-#include <plat/devs.h>
-#include <plat/cpu.h>
-#include <linux/platform_data/i2c-s3c2410.h>
-#include <plat/pll.h>
-#include <plat/adc.h>
-#include <linux/platform_data/touchscreen-s3c2410.h>
-#include <plat/samsung-time.h>
-#include <plat/backlight.h>
-#include <plat/fb.h>
-#include <plat/sdhci.h>
-
-#include "common.h"
-#include "i2c.h"
-
-#define SMDK6450_UCON_DEFAULT  (S3C2410_UCON_TXILEVEL |        \
-                               S3C2410_UCON_RXILEVEL |         \
-                               S3C2410_UCON_TXIRQMODE |        \
-                               S3C2410_UCON_RXIRQMODE |        \
-                               S3C2410_UCON_RXFIFO_TOI |       \
-                               S3C2443_UCON_RXERR_IRQEN)
-
-#define SMDK6450_ULCON_DEFAULT S3C2410_LCON_CS8
-
-#define SMDK6450_UFCON_DEFAULT (S3C2410_UFCON_FIFOMODE |       \
-                               S3C2440_UFCON_TXTRIG16 |        \
-                               S3C2410_UFCON_RXTRIG8)
-
-static struct s3c2410_uartcfg smdk6450_uartcfgs[] __initdata = {
-       [0] = {
-               .hwport         = 0,
-               .flags          = 0,
-               .ucon           = SMDK6450_UCON_DEFAULT,
-               .ulcon          = SMDK6450_ULCON_DEFAULT,
-               .ufcon          = SMDK6450_UFCON_DEFAULT,
-       },
-       [1] = {
-               .hwport         = 1,
-               .flags          = 0,
-               .ucon           = SMDK6450_UCON_DEFAULT,
-               .ulcon          = SMDK6450_ULCON_DEFAULT,
-               .ufcon          = SMDK6450_UFCON_DEFAULT,
-       },
-       [2] = {
-               .hwport         = 2,
-               .flags          = 0,
-               .ucon           = SMDK6450_UCON_DEFAULT,
-               .ulcon          = SMDK6450_ULCON_DEFAULT,
-               .ufcon          = SMDK6450_UFCON_DEFAULT,
-       },
-       [3] = {
-               .hwport         = 3,
-               .flags          = 0,
-               .ucon           = SMDK6450_UCON_DEFAULT,
-               .ulcon          = SMDK6450_ULCON_DEFAULT,
-               .ufcon          = SMDK6450_UFCON_DEFAULT,
-       },
-#if CONFIG_SERIAL_SAMSUNG_UARTS > 4
-       [4] = {
-               .hwport         = 4,
-               .flags          = 0,
-               .ucon           = SMDK6450_UCON_DEFAULT,
-               .ulcon          = SMDK6450_ULCON_DEFAULT,
-               .ufcon          = SMDK6450_UFCON_DEFAULT,
-       },
-#endif
-#if CONFIG_SERIAL_SAMSUNG_UARTS > 5
-       [5] = {
-               .hwport         = 5,
-               .flags          = 0,
-               .ucon           = SMDK6450_UCON_DEFAULT,
-               .ulcon          = SMDK6450_ULCON_DEFAULT,
-               .ufcon          = SMDK6450_UFCON_DEFAULT,
-       },
-#endif
-};
-
-/* Frame Buffer */
-static struct s3c_fb_pd_win smdk6450_fb_win0 = {
-       .max_bpp        = 32,
-       .default_bpp    = 24,
-       .xres           = 800,
-       .yres           = 480,
-};
-
-static struct fb_videomode smdk6450_lcd_timing = {
-       .left_margin    = 8,
-       .right_margin   = 13,
-       .upper_margin   = 7,
-       .lower_margin   = 5,
-       .hsync_len      = 3,
-       .vsync_len      = 1,
-       .xres           = 800,
-       .yres           = 480,
-};
-
-static struct s3c_fb_platdata smdk6450_lcd_pdata __initdata = {
-       .win[0]         = &smdk6450_fb_win0,
-       .vtiming        = &smdk6450_lcd_timing,
-       .vidcon0        = VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB,
-       .vidcon1        = VIDCON1_INV_HSYNC | VIDCON1_INV_VSYNC,
-       .setup_gpio     = s5p64x0_fb_gpio_setup_24bpp,
-};
-
-/* LCD power controller */
-static void smdk6450_lte480_reset_power(struct plat_lcd_data *pd,
-                                        unsigned int power)
-{
-       int err;
-
-       if (power) {
-               err = gpio_request(S5P6450_GPN(5), "GPN");
-               if (err) {
-                       printk(KERN_ERR "failed to request GPN for lcd reset\n");
-                       return;
-               }
-
-               gpio_direction_output(S5P6450_GPN(5), 1);
-               gpio_set_value(S5P6450_GPN(5), 0);
-               gpio_set_value(S5P6450_GPN(5), 1);
-               gpio_free(S5P6450_GPN(5));
-       }
-}
-
-static struct plat_lcd_data smdk6450_lcd_power_data = {
-       .set_power      = smdk6450_lte480_reset_power,
-};
-
-static struct platform_device smdk6450_lcd_lte480wv = {
-       .name                   = "platform-lcd",
-       .dev.parent             = &s3c_device_fb.dev,
-       .dev.platform_data      = &smdk6450_lcd_power_data,
-};
-
-static struct platform_device *smdk6450_devices[] __initdata = {
-       &s3c_device_adc,
-       &s3c_device_rtc,
-       &s3c_device_i2c0,
-       &s3c_device_i2c1,
-       &samsung_device_pwm,
-       &s3c_device_ts,
-       &s3c_device_wdt,
-       &s5p6450_device_iis0,
-       &s3c_device_fb,
-       &smdk6450_lcd_lte480wv,
-       &s3c_device_hsmmc0,
-       &s3c_device_hsmmc1,
-       &s3c_device_hsmmc2,
-       /* s5p6450_device_spi0 will be added */
-};
-
-static struct s3c_sdhci_platdata smdk6450_hsmmc0_pdata __initdata = {
-       .cd_type        = S3C_SDHCI_CD_NONE,
-};
-
-static struct s3c_sdhci_platdata smdk6450_hsmmc1_pdata __initdata = {
-       .cd_type        = S3C_SDHCI_CD_NONE,
-#if defined(CONFIG_S5P64X0_SD_CH1_8BIT)
-       .max_width      = 8,
-       .host_caps      = MMC_CAP_8_BIT_DATA,
-#endif
-};
-
-static struct s3c_sdhci_platdata smdk6450_hsmmc2_pdata __initdata = {
-       .cd_type        = S3C_SDHCI_CD_NONE,
-};
-
-static struct s3c2410_platform_i2c s5p6450_i2c0_data __initdata = {
-       .flags          = 0,
-       .slave_addr     = 0x10,
-       .frequency      = 100*1000,
-       .sda_delay      = 100,
-       .cfg_gpio       = s5p6450_i2c0_cfg_gpio,
-};
-
-static struct s3c2410_platform_i2c s5p6450_i2c1_data __initdata = {
-       .flags          = 0,
-       .bus_num        = 1,
-       .slave_addr     = 0x10,
-       .frequency      = 100*1000,
-       .sda_delay      = 100,
-       .cfg_gpio       = s5p6450_i2c1_cfg_gpio,
-};
-
-static struct i2c_board_info smdk6450_i2c_devs0[] __initdata = {
-       { I2C_BOARD_INFO("wm8580", 0x1b), },
-       { I2C_BOARD_INFO("24c08", 0x50), },     /* Samsung KS24C080C EEPROM */
-};
-
-static struct i2c_board_info smdk6450_i2c_devs1[] __initdata = {
-       { I2C_BOARD_INFO("24c128", 0x57), },/* Samsung S524AD0XD1 EEPROM */
-};
-
-/* LCD Backlight data */
-static struct samsung_bl_gpio_info smdk6450_bl_gpio_info = {
-       .no = S5P6450_GPF(15),
-       .func = S3C_GPIO_SFN(2),
-};
-
-static struct platform_pwm_backlight_data smdk6450_bl_data = {
-       .pwm_id = 1,
-       .enable_gpio = -1,
-};
-
-static void __init smdk6450_map_io(void)
-{
-       s5p64x0_init_io(NULL, 0);
-       s3c24xx_init_clocks(19200000);
-       s3c24xx_init_uarts(smdk6450_uartcfgs, ARRAY_SIZE(smdk6450_uartcfgs));
-       samsung_set_timer_source(SAMSUNG_PWM3, SAMSUNG_PWM4);
-}
-
-static void s5p6450_set_lcd_interface(void)
-{
-       unsigned int cfg;
-
-       /* select TFT LCD type (RGB I/F) */
-       cfg = __raw_readl(S5P64X0_SPCON0);
-       cfg &= ~S5P64X0_SPCON0_LCD_SEL_MASK;
-       cfg |= S5P64X0_SPCON0_LCD_SEL_RGB;
-       __raw_writel(cfg, S5P64X0_SPCON0);
-}
-
-static void __init smdk6450_machine_init(void)
-{
-       s3c24xx_ts_set_platdata(NULL);
-
-       s3c_i2c0_set_platdata(&s5p6450_i2c0_data);
-       s3c_i2c1_set_platdata(&s5p6450_i2c1_data);
-       i2c_register_board_info(0, smdk6450_i2c_devs0,
-                       ARRAY_SIZE(smdk6450_i2c_devs0));
-       i2c_register_board_info(1, smdk6450_i2c_devs1,
-                       ARRAY_SIZE(smdk6450_i2c_devs1));
-
-       s5p6450_set_lcd_interface();
-       s3c_fb_set_platdata(&smdk6450_lcd_pdata);
-
-       s3c_sdhci0_set_platdata(&smdk6450_hsmmc0_pdata);
-       s3c_sdhci1_set_platdata(&smdk6450_hsmmc1_pdata);
-       s3c_sdhci2_set_platdata(&smdk6450_hsmmc2_pdata);
-
-       platform_add_devices(smdk6450_devices, ARRAY_SIZE(smdk6450_devices));
-
-       samsung_bl_set(&smdk6450_bl_gpio_info, &smdk6450_bl_data);
-}
-
-MACHINE_START(SMDK6450, "SMDK6450")
-       /* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */
-       .atag_offset    = 0x100,
-
-       .init_irq       = s5p6450_init_irq,
-       .map_io         = smdk6450_map_io,
-       .init_machine   = smdk6450_machine_init,
-       .init_time      = samsung_timer_init,
-       .restart        = s5p64x0_restart,
-MACHINE_END
diff --git a/arch/arm/mach-s5p64x0/pm.c b/arch/arm/mach-s5p64x0/pm.c
deleted file mode 100644 (file)
index ec8229c..0000000
+++ /dev/null
@@ -1,202 +0,0 @@
-/* linux/arch/arm/mach-s5p64x0/pm.c
- *
- * Copyright (c) 2011 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * S5P64X0 Power Management Support
- *
- * Based on arch/arm/mach-s3c64xx/pm.c by Ben Dooks
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#include <linux/suspend.h>
-#include <linux/syscore_ops.h>
-#include <linux/io.h>
-
-#include <plat/cpu.h>
-#include <plat/pm.h>
-#include <plat/wakeup-mask.h>
-
-#include <mach/regs-clock.h>
-#include <mach/regs-gpio.h>
-
-static struct sleep_save s5p64x0_core_save[] = {
-       SAVE_ITEM(S5P64X0_APLL_CON),
-       SAVE_ITEM(S5P64X0_MPLL_CON),
-       SAVE_ITEM(S5P64X0_EPLL_CON),
-       SAVE_ITEM(S5P64X0_EPLL_CON_K),
-       SAVE_ITEM(S5P64X0_CLK_SRC0),
-       SAVE_ITEM(S5P64X0_CLK_SRC1),
-       SAVE_ITEM(S5P64X0_CLK_DIV0),
-       SAVE_ITEM(S5P64X0_CLK_DIV1),
-       SAVE_ITEM(S5P64X0_CLK_DIV2),
-       SAVE_ITEM(S5P64X0_CLK_DIV3),
-       SAVE_ITEM(S5P64X0_CLK_GATE_MEM0),
-       SAVE_ITEM(S5P64X0_CLK_GATE_HCLK1),
-       SAVE_ITEM(S5P64X0_CLK_GATE_SCLK1),
-};
-
-static struct sleep_save s5p64x0_misc_save[] = {
-       SAVE_ITEM(S5P64X0_AHB_CON0),
-       SAVE_ITEM(S5P64X0_SPCON0),
-       SAVE_ITEM(S5P64X0_SPCON1),
-       SAVE_ITEM(S5P64X0_MEM0CONSLP0),
-       SAVE_ITEM(S5P64X0_MEM0CONSLP1),
-       SAVE_ITEM(S5P64X0_MEM0DRVCON),
-       SAVE_ITEM(S5P64X0_MEM1DRVCON),
-};
-
-/* DPLL is present only in S5P6450 */
-static struct sleep_save s5p6450_core_save[] = {
-       SAVE_ITEM(S5P6450_DPLL_CON),
-       SAVE_ITEM(S5P6450_DPLL_CON_K),
-};
-
-void s3c_pm_configure_extint(void)
-{
-       __raw_writel(s3c_irqwake_eintmask, S5P64X0_EINT_WAKEUP_MASK);
-}
-
-void s3c_pm_restore_core(void)
-{
-       __raw_writel(0, S5P64X0_EINT_WAKEUP_MASK);
-
-       s3c_pm_do_restore_core(s5p64x0_core_save,
-                               ARRAY_SIZE(s5p64x0_core_save));
-
-       if (soc_is_s5p6450())
-               s3c_pm_do_restore_core(s5p6450_core_save,
-                               ARRAY_SIZE(s5p6450_core_save));
-
-       s3c_pm_do_restore(s5p64x0_misc_save, ARRAY_SIZE(s5p64x0_misc_save));
-}
-
-void s3c_pm_save_core(void)
-{
-       s3c_pm_do_save(s5p64x0_misc_save, ARRAY_SIZE(s5p64x0_misc_save));
-
-       if (soc_is_s5p6450())
-               s3c_pm_do_save(s5p6450_core_save,
-                               ARRAY_SIZE(s5p6450_core_save));
-
-       s3c_pm_do_save(s5p64x0_core_save, ARRAY_SIZE(s5p64x0_core_save));
-}
-
-static int s5p64x0_cpu_suspend(unsigned long arg)
-{
-       unsigned long tmp = 0;
-
-       /*
-        * Issue the standby signal into the pm unit. Note, we
-        * issue a write-buffer drain just in case.
-        */
-       asm("b 1f\n\t"
-           ".align 5\n\t"
-           "1:\n\t"
-           "mcr p15, 0, %0, c7, c10, 5\n\t"
-           "mcr p15, 0, %0, c7, c10, 4\n\t"
-           "mcr p15, 0, %0, c7, c0, 4" : : "r" (tmp));
-
-       pr_info("Failed to suspend the system\n");
-       return 1; /* Aborting suspend */
-}
-
-/* mapping of interrupts to parts of the wakeup mask */
-static struct samsung_wakeup_mask s5p64x0_wake_irqs[] = {
-       { .irq = IRQ_RTC_ALARM, .bit = S5P64X0_PWR_CFG_RTC_ALRM_DISABLE, },
-       { .irq = IRQ_RTC_TIC,   .bit = S5P64X0_PWR_CFG_RTC_TICK_DISABLE, },
-       { .irq = IRQ_HSMMC0,    .bit = S5P64X0_PWR_CFG_MMC0_DISABLE, },
-       { .irq = IRQ_HSMMC1,    .bit = S5P64X0_PWR_CFG_MMC1_DISABLE, },
-};
-
-static void s5p64x0_pm_prepare(void)
-{
-       u32 tmp;
-
-       samsung_sync_wakemask(S5P64X0_PWR_CFG,
-                       s5p64x0_wake_irqs, ARRAY_SIZE(s5p64x0_wake_irqs));
-
-       /* store the resume address in INFORM0 register */
-       __raw_writel(virt_to_phys(s3c_cpu_resume), S5P64X0_INFORM0);
-
-       /* setup clock gating for FIMGVG block */
-       __raw_writel((__raw_readl(S5P64X0_CLK_GATE_HCLK1) | \
-               (S5P64X0_CLK_GATE_HCLK1_FIMGVG)), S5P64X0_CLK_GATE_HCLK1);
-       __raw_writel((__raw_readl(S5P64X0_CLK_GATE_SCLK1) | \
-               (S5P64X0_CLK_GATE_SCLK1_FIMGVG)), S5P64X0_CLK_GATE_SCLK1);
-
-       /* Configure the stabilization counter with wait time required */
-       __raw_writel(S5P64X0_PWR_STABLE_PWR_CNT_VAL4, S5P64X0_PWR_STABLE);
-
-       /* set WFI to SLEEP mode configuration */
-       tmp = __raw_readl(S5P64X0_SLEEP_CFG);
-       tmp &= ~(S5P64X0_SLEEP_CFG_OSC_EN);
-       __raw_writel(tmp, S5P64X0_SLEEP_CFG);
-
-       tmp = __raw_readl(S5P64X0_PWR_CFG);
-       tmp &= ~(S5P64X0_PWR_CFG_WFI_MASK);
-       tmp |= S5P64X0_PWR_CFG_WFI_SLEEP;
-       __raw_writel(tmp, S5P64X0_PWR_CFG);
-
-       /*
-        * set OTHERS register to disable interrupt before going to
-        * sleep. This bit is present only in S5P6450, it is reserved
-        * in S5P6440.
-        */
-       if (soc_is_s5p6450()) {
-               tmp = __raw_readl(S5P64X0_OTHERS);
-               tmp |= S5P6450_OTHERS_DISABLE_INT;
-               __raw_writel(tmp, S5P64X0_OTHERS);
-       }
-
-       /* ensure previous wakeup state is cleared before sleeping */
-       __raw_writel(__raw_readl(S5P64X0_WAKEUP_STAT), S5P64X0_WAKEUP_STAT);
-
-}
-
-static int s5p64x0_pm_add(struct device *dev, struct subsys_interface *sif)
-{
-       pm_cpu_prep = s5p64x0_pm_prepare;
-       pm_cpu_sleep = s5p64x0_cpu_suspend;
-
-       return 0;
-}
-
-static struct subsys_interface s5p64x0_pm_interface = {
-       .name           = "s5p64x0_pm",
-       .subsys         = &s5p64x0_subsys,
-       .add_dev        = s5p64x0_pm_add,
-};
-
-static __init int s5p64x0_pm_drvinit(void)
-{
-       s3c_pm_init();
-
-       return subsys_interface_register(&s5p64x0_pm_interface);
-}
-arch_initcall(s5p64x0_pm_drvinit);
-
-static void s5p64x0_pm_resume(void)
-{
-       u32 tmp;
-
-       tmp = __raw_readl(S5P64X0_OTHERS);
-       tmp |= (S5P64X0_OTHERS_RET_MMC0 | S5P64X0_OTHERS_RET_MMC1 | \
-                       S5P64X0_OTHERS_RET_UART);
-       __raw_writel(tmp , S5P64X0_OTHERS);
-}
-
-static struct syscore_ops s5p64x0_pm_syscore_ops = {
-       .resume         = s5p64x0_pm_resume,
-};
-
-static __init int s5p64x0_pm_syscore_init(void)
-{
-       register_syscore_ops(&s5p64x0_pm_syscore_ops);
-
-       return 0;
-}
-arch_initcall(s5p64x0_pm_syscore_init);
diff --git a/arch/arm/mach-s5p64x0/setup-fb-24bpp.c b/arch/arm/mach-s5p64x0/setup-fb-24bpp.c
deleted file mode 100644 (file)
index f346ee4..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/* linux/arch/arm/mach-s5p64x0/setup-fb-24bpp.c
- *
- * Copyright (c) 2011 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com/
- *
- * Base S5P64X0 GPIO setup information for LCD framebuffer
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#include <linux/fb.h>
-#include <linux/gpio.h>
-
-#include <plat/cpu.h>
-#include <plat/fb.h>
-#include <plat/gpio-cfg.h>
-
-void s5p64x0_fb_gpio_setup_24bpp(void)
-{
-       if (soc_is_s5p6440()) {
-               s3c_gpio_cfgrange_nopull(S5P6440_GPI(0), 16, S3C_GPIO_SFN(2));
-               s3c_gpio_cfgrange_nopull(S5P6440_GPJ(0), 12, S3C_GPIO_SFN(2));
-       } else if (soc_is_s5p6450()) {
-               s3c_gpio_cfgrange_nopull(S5P6450_GPI(0), 16, S3C_GPIO_SFN(2));
-               s3c_gpio_cfgrange_nopull(S5P6450_GPJ(0), 12, S3C_GPIO_SFN(2));
-       }
-}
diff --git a/arch/arm/mach-s5p64x0/setup-i2c0.c b/arch/arm/mach-s5p64x0/setup-i2c0.c
deleted file mode 100644 (file)
index 569b76a..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/* linux/arch/arm/mach-s5p64x0/setup-i2c0.c
- *
- * Copyright (c) 2009-2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * I2C0 GPIO configuration.
- *
- * Based on plat-s3c64x0/setup-i2c0.c
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/gpio.h>
-
-struct platform_device; /* don't need the contents */
-
-#include <plat/gpio-cfg.h>
-#include <linux/platform_data/i2c-s3c2410.h>
-
-#include "i2c.h"
-
-void s5p6440_i2c0_cfg_gpio(struct platform_device *dev)
-{
-       s3c_gpio_cfgall_range(S5P6440_GPB(5), 2,
-                             S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP);
-}
-
-void s5p6450_i2c0_cfg_gpio(struct platform_device *dev)
-{
-       s3c_gpio_cfgall_range(S5P6450_GPB(5), 2,
-                             S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP);
-}
-
-void s3c_i2c0_cfg_gpio(struct platform_device *dev) { }
diff --git a/arch/arm/mach-s5p64x0/setup-i2c1.c b/arch/arm/mach-s5p64x0/setup-i2c1.c
deleted file mode 100644 (file)
index 867374e..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/* linux/arch/arm/mach-s5p64xx/setup-i2c1.c
- *
- * Copyright (c) 2009-2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * I2C1 GPIO configuration.
- *
- * Based on plat-s3c64xx/setup-i2c0.c
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/gpio.h>
-
-struct platform_device; /* don't need the contents */
-
-#include <plat/gpio-cfg.h>
-#include <linux/platform_data/i2c-s3c2410.h>
-
-#include "i2c.h"
-
-void s5p6440_i2c1_cfg_gpio(struct platform_device *dev)
-{
-       s3c_gpio_cfgall_range(S5P6440_GPR(9), 2,
-                             S3C_GPIO_SFN(6), S3C_GPIO_PULL_UP);
-}
-
-void s5p6450_i2c1_cfg_gpio(struct platform_device *dev)
-{
-       s3c_gpio_cfgall_range(S5P6450_GPR(9), 2,
-                             S3C_GPIO_SFN(6), S3C_GPIO_PULL_UP);
-}
-
-void s3c_i2c1_cfg_gpio(struct platform_device *dev) { }
diff --git a/arch/arm/mach-s5p64x0/setup-sdhci-gpio.c b/arch/arm/mach-s5p64x0/setup-sdhci-gpio.c
deleted file mode 100644 (file)
index 8410af0..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-/* linux/arch/arm/mach-s5p64x0/setup-sdhci-gpio.c
- *
- * Copyright (c) 2011 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com/
- *
- * S5P64X0 - Helper functions for setting up SDHCI device(s) GPIO (HSMMC)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#include <linux/platform_device.h>
-#include <linux/io.h>
-#include <linux/gpio.h>
-
-#include <mach/regs-gpio.h>
-#include <mach/regs-clock.h>
-
-#include <plat/gpio-cfg.h>
-#include <plat/sdhci.h>
-#include <plat/cpu.h>
-
-void s5p64x0_setup_sdhci0_cfg_gpio(struct platform_device *dev, int width)
-{
-       struct s3c_sdhci_platdata *pdata = dev->dev.platform_data;
-
-       /* Set all the necessary GPG pins to special-function 2 */
-       if (soc_is_s5p6450())
-               s3c_gpio_cfgrange_nopull(S5P6450_GPG(0), 2 + width,
-                                        S3C_GPIO_SFN(2));
-       else
-               s3c_gpio_cfgrange_nopull(S5P6440_GPG(0), 2 + width,
-                                        S3C_GPIO_SFN(2));
-
-       /* Set GPG[6] pin to special-function 2 - MMC0 CDn */
-       if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) {
-               if (soc_is_s5p6450()) {
-                       s3c_gpio_setpull(S5P6450_GPG(6), S3C_GPIO_PULL_UP);
-                       s3c_gpio_cfgpin(S5P6450_GPG(6), S3C_GPIO_SFN(2));
-               } else {
-                       s3c_gpio_setpull(S5P6440_GPG(6), S3C_GPIO_PULL_UP);
-                       s3c_gpio_cfgpin(S5P6440_GPG(6), S3C_GPIO_SFN(2));
-               }
-       }
-}
-
-void s5p64x0_setup_sdhci1_cfg_gpio(struct platform_device *dev, int width)
-{
-       struct s3c_sdhci_platdata *pdata = dev->dev.platform_data;
-
-       /* Set GPH[0:1] pins to special-function 2 - CLK and CMD */
-       if (soc_is_s5p6450())
-               s3c_gpio_cfgrange_nopull(S5P6450_GPH(0), 2, S3C_GPIO_SFN(2));
-       else
-               s3c_gpio_cfgrange_nopull(S5P6440_GPH(0), 2 , S3C_GPIO_SFN(2));
-
-       switch (width) {
-       case 8:
-               /* Set data pins GPH[6:9] special-function 2 */
-               if (soc_is_s5p6450())
-                       s3c_gpio_cfgrange_nopull(S5P6450_GPH(6), 4,
-                                                S3C_GPIO_SFN(2));
-               else
-                       s3c_gpio_cfgrange_nopull(S5P6440_GPH(6), 4,
-                                                S3C_GPIO_SFN(2));
-       case 4:
-               /* set data pins GPH[2:5] special-function 2 */
-               if (soc_is_s5p6450())
-                       s3c_gpio_cfgrange_nopull(S5P6450_GPH(2), 4,
-                                                S3C_GPIO_SFN(2));
-               else
-                       s3c_gpio_cfgrange_nopull(S5P6440_GPH(2), 4,
-                                                S3C_GPIO_SFN(2));
-       default:
-               break;
-       }
-
-       /* Set GPG[6] pin to special-funtion 3 : MMC1 CDn */
-       if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) {
-               if (soc_is_s5p6450()) {
-                       s3c_gpio_setpull(S5P6450_GPG(6), S3C_GPIO_PULL_UP);
-                       s3c_gpio_cfgpin(S5P6450_GPG(6), S3C_GPIO_SFN(3));
-               } else {
-                       s3c_gpio_setpull(S5P6440_GPG(6), S3C_GPIO_PULL_UP);
-                       s3c_gpio_cfgpin(S5P6440_GPG(6), S3C_GPIO_SFN(3));
-               }
-       }
-}
-
-void s5p6440_setup_sdhci2_cfg_gpio(struct platform_device *dev, int width)
-{
-       /* Set GPC[4:5] pins to special-function 3 - CLK and CMD */
-       s3c_gpio_cfgrange_nopull(S5P6440_GPC(4), 2, S3C_GPIO_SFN(3));
-
-       /* Set data pins GPH[6:9] pins to special-function 3 */
-       s3c_gpio_cfgrange_nopull(S5P6440_GPH(6), 4, S3C_GPIO_SFN(3));
-}
-
-void s5p6450_setup_sdhci2_cfg_gpio(struct platform_device *dev, int width)
-{
-       /* Set all the necessary GPG pins to special-function 3 */
-       s3c_gpio_cfgrange_nopull(S5P6450_GPG(7), 2 + width, S3C_GPIO_SFN(3));
-}
diff --git a/arch/arm/mach-s5p64x0/setup-spi.c b/arch/arm/mach-s5p64x0/setup-spi.c
deleted file mode 100644 (file)
index 7664356..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/* linux/arch/arm/mach-s5p64x0/setup-spi.c
- *
- * Copyright (C) 2011 Samsung Electronics Ltd.
- *             http://www.samsung.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#include <linux/gpio.h>
-#include <plat/gpio-cfg.h>
-
-#ifdef CONFIG_S3C64XX_DEV_SPI0
-int s3c64xx_spi0_cfg_gpio(void)
-{
-       if (soc_is_s5p6450())
-               s3c_gpio_cfgall_range(S5P6450_GPC(0), 3,
-                                       S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP);
-       else
-               s3c_gpio_cfgall_range(S5P6440_GPC(0), 3,
-                                       S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP);
-       return 0;
-}
-#endif
-
-#ifdef CONFIG_S3C64XX_DEV_SPI1
-int s3c64xx_spi1_cfg_gpio(void)
-{
-       if (soc_is_s5p6450())
-               s3c_gpio_cfgall_range(S5P6450_GPC(4), 3,
-                                       S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP);
-       else
-               s3c_gpio_cfgall_range(S5P6440_GPC(4), 3,
-                                       S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP);
-       return 0;
-}
-#endif
diff --git a/arch/arm/mach-s5pc100/Kconfig b/arch/arm/mach-s5pc100/Kconfig
deleted file mode 100644 (file)
index c5e3a96..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-# Copyright 2009 Samsung Electronics Co.
-#      Byungho Min <bhmin@samsung.com>
-#
-# Licensed under GPLv2
-
-# Configuration options for the S5PC100 CPU
-
-if ARCH_S5PC100
-
-config CPU_S5PC100
-       bool
-       select ARM_AMBA
-       select PL330_DMA if DMADEVICES
-       select S5P_EXT_INT
-       help
-         Enable S5PC100 CPU support
-
-config S5PC100_SETUP_FB_24BPP
-       bool
-       help
-         Common setup code for S5PC1XX with an 24bpp RGB display helper.
-
-config S5PC100_SETUP_I2C1
-       bool
-       help
-         Common setup code for i2c bus 1.
-
-config S5PC100_SETUP_IDE
-       bool
-       help
-         Common setup code for S5PC100 IDE GPIO configurations
-
-config S5PC100_SETUP_KEYPAD
-       bool
-       help
-         Common setup code for KEYPAD GPIO configurations.
-
-config S5PC100_SETUP_SDHCI
-       bool
-       select S5PC100_SETUP_SDHCI_GPIO
-       help
-         Internal helper functions for S5PC100 based SDHCI systems
-
-config S5PC100_SETUP_SDHCI_GPIO
-       bool
-       help
-         Common setup code for SDHCI gpio.
-
-config S5PC100_SETUP_SPI
-       bool
-       help
-         Common setup code for SPI GPIO configurations.
-
-config MACH_SMDKC100
-       bool "SMDKC100"
-       select CPU_S5PC100
-       select S3C_DEV_FB
-       select S3C_DEV_HSMMC
-       select S3C_DEV_HSMMC1
-       select S3C_DEV_HSMMC2
-       select S3C_DEV_I2C1
-       select S3C_DEV_RTC
-       select S3C_DEV_WDT
-       select S5PC100_SETUP_FB_24BPP
-       select S5PC100_SETUP_I2C1
-       select S5PC100_SETUP_IDE
-       select S5PC100_SETUP_KEYPAD
-       select S5PC100_SETUP_SDHCI
-       select S5P_DEV_FIMC0
-       select S5P_DEV_FIMC1
-       select S5P_DEV_FIMC2
-       select SAMSUNG_DEV_ADC
-       select SAMSUNG_DEV_BACKLIGHT
-       select SAMSUNG_DEV_IDE
-       select SAMSUNG_DEV_KEYPAD
-       select SAMSUNG_DEV_PWM
-       select SAMSUNG_DEV_TS
-       help
-         Machine support for the Samsung SMDKC100
-
-endif
diff --git a/arch/arm/mach-s5pc100/Makefile b/arch/arm/mach-s5pc100/Makefile
deleted file mode 100644 (file)
index 118c711..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-# arch/arm/mach-s5pc100/Makefile
-#
-# Copyright 2009 Samsung Electronics Co.
-#
-# Licensed under GPLv2
-
-obj-y                          :=
-obj-m                          :=
-obj-n                          :=
-obj-                           :=
-
-# Core
-
-obj-y                          += common.o clock.o
-
-obj-y                          += dma.o
-
-# machine support
-
-obj-$(CONFIG_MACH_SMDKC100)    += mach-smdkc100.o
-
-# device support
-
-obj-y                          += dev-audio.o
-
-obj-y                                  += setup-i2c0.o
-obj-$(CONFIG_S5PC100_SETUP_FB_24BPP)   += setup-fb-24bpp.o
-obj-$(CONFIG_S5PC100_SETUP_I2C1)       += setup-i2c1.o
-obj-$(CONFIG_S5PC100_SETUP_IDE)                += setup-ide.o
-obj-$(CONFIG_S5PC100_SETUP_KEYPAD)     += setup-keypad.o
-obj-$(CONFIG_S5PC100_SETUP_SDHCI_GPIO) += setup-sdhci-gpio.o
-obj-$(CONFIG_S5PC100_SETUP_SPI)                += setup-spi.o
diff --git a/arch/arm/mach-s5pc100/Makefile.boot b/arch/arm/mach-s5pc100/Makefile.boot
deleted file mode 100644 (file)
index 79ece40..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-   zreladdr-y  += 0x20008000
-params_phys-y  := 0x20000100
diff --git a/arch/arm/mach-s5pc100/clock.c b/arch/arm/mach-s5pc100/clock.c
deleted file mode 100644 (file)
index d0dc10e..0000000
+++ /dev/null
@@ -1,1361 +0,0 @@
-/* linux/arch/arm/mach-s5pc100/clock.c
- *
- * Copyright (c) 2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com/
- *
- * S5PC100 - Clock support
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#include <linux/init.h>
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/list.h>
-#include <linux/err.h>
-#include <linux/clk.h>
-#include <linux/io.h>
-
-#include <mach/map.h>
-
-#include <plat/cpu-freq.h>
-#include <mach/regs-clock.h>
-#include <plat/clock.h>
-#include <plat/cpu.h>
-#include <plat/pll.h>
-#include <plat/s5p-clock.h>
-#include <plat/clock-clksrc.h>
-
-#include "common.h"
-
-static struct clk s5p_clk_otgphy = {
-       .name           = "otg_phy",
-};
-
-static struct clk dummy_apb_pclk = {
-       .name           = "apb_pclk",
-       .id             = -1,
-};
-
-static struct clk *clk_src_mout_href_list[] = {
-       [0] = &s5p_clk_27m,
-       [1] = &clk_fin_hpll,
-};
-
-static struct clksrc_sources clk_src_mout_href = {
-       .sources        = clk_src_mout_href_list,
-       .nr_sources     = ARRAY_SIZE(clk_src_mout_href_list),
-};
-
-static struct clksrc_clk clk_mout_href = {
-       .clk = {
-               .name           = "mout_href",
-       },
-       .sources        = &clk_src_mout_href,
-       .reg_src        = { .reg = S5P_CLK_SRC0, .shift = 20, .size = 1 },
-};
-
-static struct clk *clk_src_mout_48m_list[] = {
-       [0] = &clk_xusbxti,
-       [1] = &s5p_clk_otgphy,
-};
-
-static struct clksrc_sources clk_src_mout_48m = {
-       .sources        = clk_src_mout_48m_list,
-       .nr_sources     = ARRAY_SIZE(clk_src_mout_48m_list),
-};
-
-static struct clksrc_clk clk_mout_48m = {
-       .clk = {
-               .name           = "mout_48m",
-       },
-       .sources        = &clk_src_mout_48m,
-       .reg_src        = { .reg = S5P_CLK_SRC1, .shift = 24, .size = 1 },
-};
-
-static struct clksrc_clk clk_mout_mpll = {
-       .clk = {
-               .name           = "mout_mpll",
-       },
-       .sources        = &clk_src_mpll,
-       .reg_src        = { .reg = S5P_CLK_SRC0, .shift = 4, .size = 1 },
-};
-
-
-static struct clksrc_clk clk_mout_apll = {
-       .clk    = {
-               .name           = "mout_apll",
-       },
-       .sources        = &clk_src_apll,
-       .reg_src        = { .reg = S5P_CLK_SRC0, .shift = 0, .size = 1 },
-};
-
-static struct clksrc_clk clk_mout_epll = {
-       .clk    = {
-               .name           = "mout_epll",
-       },
-       .sources        = &clk_src_epll,
-       .reg_src        = { .reg = S5P_CLK_SRC0, .shift = 8, .size = 1 },
-};
-
-static struct clk *clk_src_mout_hpll_list[] = {
-       [0] = &s5p_clk_27m,
-};
-
-static struct clksrc_sources clk_src_mout_hpll = {
-       .sources        = clk_src_mout_hpll_list,
-       .nr_sources     = ARRAY_SIZE(clk_src_mout_hpll_list),
-};
-
-static struct clksrc_clk clk_mout_hpll = {
-       .clk    = {
-               .name           = "mout_hpll",
-       },
-       .sources        = &clk_src_mout_hpll,
-       .reg_src        = { .reg = S5P_CLK_SRC0, .shift = 12, .size = 1 },
-};
-
-static struct clksrc_clk clk_div_apll = {
-       .clk    = {
-               .name   = "div_apll",
-               .parent = &clk_mout_apll.clk,
-       },
-       .reg_div = { .reg = S5P_CLK_DIV0, .shift = 0, .size = 1 },
-};
-
-static struct clksrc_clk clk_div_arm = {
-       .clk    = {
-               .name   = "div_arm",
-               .parent = &clk_div_apll.clk,
-       },
-       .reg_div = { .reg = S5P_CLK_DIV0, .shift = 4, .size = 3 },
-};
-
-static struct clksrc_clk clk_div_d0_bus = {
-       .clk    = {
-               .name   = "div_d0_bus",
-               .parent = &clk_div_arm.clk,
-       },
-       .reg_div = { .reg = S5P_CLK_DIV0, .shift = 8, .size = 3 },
-};
-
-static struct clksrc_clk clk_div_pclkd0 = {
-       .clk    = {
-               .name   = "div_pclkd0",
-               .parent = &clk_div_d0_bus.clk,
-       },
-       .reg_div = { .reg = S5P_CLK_DIV0, .shift = 12, .size = 3 },
-};
-
-static struct clksrc_clk clk_div_secss = {
-       .clk    = {
-               .name   = "div_secss",
-               .parent = &clk_div_d0_bus.clk,
-       },
-       .reg_div = { .reg = S5P_CLK_DIV0, .shift = 16, .size = 3 },
-};
-
-static struct clksrc_clk clk_div_apll2 = {
-       .clk    = {
-               .name   = "div_apll2",
-               .parent = &clk_mout_apll.clk,
-       },
-       .reg_div = { .reg = S5P_CLK_DIV1, .shift = 0, .size = 3 },
-};
-
-static struct clk *clk_src_mout_am_list[] = {
-       [0] = &clk_mout_mpll.clk,
-       [1] = &clk_div_apll2.clk,
-};
-
-static struct clksrc_sources clk_src_mout_am = {
-       .sources        = clk_src_mout_am_list,
-       .nr_sources     = ARRAY_SIZE(clk_src_mout_am_list),
-};
-
-static struct clksrc_clk clk_mout_am = {
-       .clk    = {
-               .name   = "mout_am",
-       },
-       .sources = &clk_src_mout_am,
-       .reg_src = { .reg = S5P_CLK_SRC0, .shift = 16, .size = 1 },
-};
-
-static struct clksrc_clk clk_div_d1_bus = {
-       .clk    = {
-               .name   = "div_d1_bus",
-               .parent = &clk_mout_am.clk,
-       },
-       .reg_div = { .reg = S5P_CLK_DIV1, .shift = 12, .size = 3 },
-};
-
-static struct clksrc_clk clk_div_mpll2 = {
-       .clk    = {
-               .name   = "div_mpll2",
-               .parent = &clk_mout_am.clk,
-       },
-       .reg_div = { .reg = S5P_CLK_DIV1, .shift = 8, .size = 1 },
-};
-
-static struct clksrc_clk clk_div_mpll = {
-       .clk    = {
-               .name   = "div_mpll",
-               .parent = &clk_mout_am.clk,
-       },
-       .reg_div = { .reg = S5P_CLK_DIV1, .shift = 4, .size = 2 },
-};
-
-static struct clk *clk_src_mout_onenand_list[] = {
-       [0] = &clk_div_d0_bus.clk,
-       [1] = &clk_div_d1_bus.clk,
-};
-
-static struct clksrc_sources clk_src_mout_onenand = {
-       .sources        = clk_src_mout_onenand_list,
-       .nr_sources     = ARRAY_SIZE(clk_src_mout_onenand_list),
-};
-
-static struct clksrc_clk clk_mout_onenand = {
-       .clk    = {
-               .name   = "mout_onenand",
-       },
-       .sources = &clk_src_mout_onenand,
-       .reg_src = { .reg = S5P_CLK_SRC0, .shift = 24, .size = 1 },
-};
-
-static struct clksrc_clk clk_div_onenand = {
-       .clk    = {
-               .name   = "div_onenand",
-               .parent = &clk_mout_onenand.clk,
-       },
-       .reg_div = { .reg = S5P_CLK_DIV1, .shift = 20, .size = 2 },
-};
-
-static struct clksrc_clk clk_div_pclkd1 = {
-       .clk    = {
-               .name   = "div_pclkd1",
-               .parent = &clk_div_d1_bus.clk,
-       },
-       .reg_div = { .reg = S5P_CLK_DIV1, .shift = 16, .size = 3 },
-};
-
-static struct clksrc_clk clk_div_cam = {
-       .clk    = {
-               .name   = "div_cam",
-               .parent = &clk_div_mpll2.clk,
-       },
-       .reg_div = { .reg = S5P_CLK_DIV1, .shift = 24, .size = 5 },
-};
-
-static struct clksrc_clk clk_div_hdmi = {
-       .clk    = {
-               .name   = "div_hdmi",
-               .parent = &clk_mout_hpll.clk,
-       },
-       .reg_div = { .reg = S5P_CLK_DIV3, .shift = 28, .size = 4 },
-};
-
-static u32 epll_div[][4] = {
-       { 32750000,     131, 3, 4 },
-       { 32768000,     131, 3, 4 },
-       { 36000000,     72,  3, 3 },
-       { 45000000,     90,  3, 3 },
-       { 45158000,     90,  3, 3 },
-       { 45158400,     90,  3, 3 },
-       { 48000000,     96,  3, 3 },
-       { 49125000,     131, 4, 3 },
-       { 49152000,     131, 4, 3 },
-       { 60000000,     120, 3, 3 },
-       { 67737600,     226, 5, 3 },
-       { 67738000,     226, 5, 3 },
-       { 73800000,     246, 5, 3 },
-       { 73728000,     246, 5, 3 },
-       { 72000000,     144, 3, 3 },
-       { 84000000,     168, 3, 3 },
-       { 96000000,     96,  3, 2 },
-       { 144000000,    144, 3, 2 },
-       { 192000000,    96,  3, 1 }
-};
-
-static int s5pc100_epll_set_rate(struct clk *clk, unsigned long rate)
-{
-       unsigned int epll_con;
-       unsigned int i;
-
-       if (clk->rate == rate)  /* Return if nothing changed */
-               return 0;
-
-       epll_con = __raw_readl(S5P_EPLL_CON);
-
-       epll_con &= ~(PLL65XX_MDIV_MASK | PLL65XX_PDIV_MASK | PLL65XX_SDIV_MASK);
-
-       for (i = 0; i < ARRAY_SIZE(epll_div); i++) {
-               if (epll_div[i][0] == rate) {
-                       epll_con |= (epll_div[i][1] << PLL65XX_MDIV_SHIFT) |
-                                   (epll_div[i][2] << PLL65XX_PDIV_SHIFT) |
-                                   (epll_div[i][3] << PLL65XX_SDIV_SHIFT);
-                       break;
-               }
-       }
-
-       if (i == ARRAY_SIZE(epll_div)) {
-               printk(KERN_ERR "%s: Invalid Clock EPLL Frequency\n", __func__);
-               return -EINVAL;
-       }
-
-       __raw_writel(epll_con, S5P_EPLL_CON);
-
-       printk(KERN_WARNING "EPLL Rate changes from %lu to %lu\n",
-                       clk->rate, rate);
-
-       clk->rate = rate;
-
-       return 0;
-}
-
-static struct clk_ops s5pc100_epll_ops = {
-       .get_rate = s5p_epll_get_rate,
-       .set_rate = s5pc100_epll_set_rate,
-};
-
-static int s5pc100_d0_0_ctrl(struct clk *clk, int enable)
-{
-       return s5p_gatectrl(S5P_CLKGATE_D00, clk, enable);
-}
-
-static int s5pc100_d0_1_ctrl(struct clk *clk, int enable)
-{
-       return s5p_gatectrl(S5P_CLKGATE_D01, clk, enable);
-}
-
-static int s5pc100_d0_2_ctrl(struct clk *clk, int enable)
-{
-       return s5p_gatectrl(S5P_CLKGATE_D02, clk, enable);
-}
-
-static int s5pc100_d1_0_ctrl(struct clk *clk, int enable)
-{
-       return s5p_gatectrl(S5P_CLKGATE_D10, clk, enable);
-}
-
-static int s5pc100_d1_1_ctrl(struct clk *clk, int enable)
-{
-       return s5p_gatectrl(S5P_CLKGATE_D11, clk, enable);
-}
-
-static int s5pc100_d1_2_ctrl(struct clk *clk, int enable)
-{
-       return s5p_gatectrl(S5P_CLKGATE_D12, clk, enable);
-}
-
-static int s5pc100_d1_3_ctrl(struct clk *clk, int enable)
-{
-       return s5p_gatectrl(S5P_CLKGATE_D13, clk, enable);
-}
-
-static int s5pc100_d1_4_ctrl(struct clk *clk, int enable)
-{
-       return s5p_gatectrl(S5P_CLKGATE_D14, clk, enable);
-}
-
-static int s5pc100_d1_5_ctrl(struct clk *clk, int enable)
-{
-       return s5p_gatectrl(S5P_CLKGATE_D15, clk, enable);
-}
-
-static int s5pc100_sclk0_ctrl(struct clk *clk, int enable)
-{
-       return s5p_gatectrl(S5P_CLKGATE_SCLK0, clk, enable);
-}
-
-static int s5pc100_sclk1_ctrl(struct clk *clk, int enable)
-{
-       return s5p_gatectrl(S5P_CLKGATE_SCLK1, clk, enable);
-}
-
-/*
- * The following clocks will be disabled during clock initialization. It is
- * recommended to keep the following clocks disabled until the driver requests
- * for enabling the clock.
- */
-static struct clk init_clocks_off[] = {
-       {
-               .name           = "cssys",
-               .parent         = &clk_div_d0_bus.clk,
-               .enable         = s5pc100_d0_0_ctrl,
-               .ctrlbit        = (1 << 6),
-       }, {
-               .name           = "secss",
-               .parent         = &clk_div_d0_bus.clk,
-               .enable         = s5pc100_d0_0_ctrl,
-               .ctrlbit        = (1 << 5),
-       }, {
-               .name           = "g2d",
-               .parent         = &clk_div_d0_bus.clk,
-               .enable         = s5pc100_d0_0_ctrl,
-               .ctrlbit        = (1 << 4),
-       }, {
-               .name           = "mdma",
-               .parent         = &clk_div_d0_bus.clk,
-               .enable         = s5pc100_d0_0_ctrl,
-               .ctrlbit        = (1 << 3),
-       }, {
-               .name           = "cfcon",
-               .parent         = &clk_div_d0_bus.clk,
-               .enable         = s5pc100_d0_0_ctrl,
-               .ctrlbit        = (1 << 2),
-       }, {
-               .name           = "nfcon",
-               .parent         = &clk_div_d0_bus.clk,
-               .enable         = s5pc100_d0_1_ctrl,
-               .ctrlbit        = (1 << 3),
-       }, {
-               .name           = "onenandc",
-               .parent         = &clk_div_d0_bus.clk,
-               .enable         = s5pc100_d0_1_ctrl,
-               .ctrlbit        = (1 << 2),
-       }, {
-               .name           = "sdm",
-               .parent         = &clk_div_d0_bus.clk,
-               .enable         = s5pc100_d0_2_ctrl,
-               .ctrlbit        = (1 << 2),
-       }, {
-               .name           = "seckey",
-               .parent         = &clk_div_d0_bus.clk,
-               .enable         = s5pc100_d0_2_ctrl,
-               .ctrlbit        = (1 << 1),
-       }, {
-               .name           = "modemif",
-               .parent         = &clk_div_d1_bus.clk,
-               .enable         = s5pc100_d1_0_ctrl,
-               .ctrlbit        = (1 << 4),
-       }, {
-               .name           = "otg",
-               .parent         = &clk_div_d1_bus.clk,
-               .enable         = s5pc100_d1_0_ctrl,
-               .ctrlbit        = (1 << 3),
-       }, {
-               .name           = "usbhost",
-               .parent         = &clk_div_d1_bus.clk,
-               .enable         = s5pc100_d1_0_ctrl,
-               .ctrlbit        = (1 << 2),
-       }, {
-               .name           = "dma",
-               .devname        = "dma-pl330.1",
-               .parent         = &clk_div_d1_bus.clk,
-               .enable         = s5pc100_d1_0_ctrl,
-               .ctrlbit        = (1 << 1),
-       }, {
-               .name           = "dma",
-               .devname        = "dma-pl330.0",
-               .parent         = &clk_div_d1_bus.clk,
-               .enable         = s5pc100_d1_0_ctrl,
-               .ctrlbit        = (1 << 0),
-       }, {
-               .name           = "lcd",
-               .parent         = &clk_div_d1_bus.clk,
-               .enable         = s5pc100_d1_1_ctrl,
-               .ctrlbit        = (1 << 0),
-       }, {
-               .name           = "rotator",
-               .parent         = &clk_div_d1_bus.clk,
-               .enable         = s5pc100_d1_1_ctrl,
-               .ctrlbit        = (1 << 1),
-       }, {
-               .name           = "fimc",
-               .devname        = "s5p-fimc.0",
-               .parent         = &clk_div_d1_bus.clk,
-               .enable         = s5pc100_d1_1_ctrl,
-               .ctrlbit        = (1 << 2),
-       }, {
-               .name           = "fimc",
-               .devname        = "s5p-fimc.1",
-               .parent         = &clk_div_d1_bus.clk,
-               .enable         = s5pc100_d1_1_ctrl,
-               .ctrlbit        = (1 << 3),
-       }, {
-               .name           = "fimc",
-               .devname        = "s5p-fimc.2",
-               .enable         = s5pc100_d1_1_ctrl,
-               .ctrlbit        = (1 << 4),
-       }, {
-               .name           = "jpeg",
-               .parent         = &clk_div_d1_bus.clk,
-               .enable         = s5pc100_d1_1_ctrl,
-               .ctrlbit        = (1 << 5),
-       }, {
-               .name           = "mipi-dsim",
-               .parent         = &clk_div_d1_bus.clk,
-               .enable         = s5pc100_d1_1_ctrl,
-               .ctrlbit        = (1 << 6),
-       }, {
-               .name           = "mipi-csis",
-               .parent         = &clk_div_d1_bus.clk,
-               .enable         = s5pc100_d1_1_ctrl,
-               .ctrlbit        = (1 << 7),
-       }, {
-               .name           = "g3d",
-               .parent         = &clk_div_d1_bus.clk,
-               .enable         = s5pc100_d1_0_ctrl,
-               .ctrlbit        = (1 << 8),
-       }, {
-               .name           = "tv",
-               .parent         = &clk_div_d1_bus.clk,
-               .enable         = s5pc100_d1_2_ctrl,
-               .ctrlbit        = (1 << 0),
-       }, {
-               .name           = "vp",
-               .parent         = &clk_div_d1_bus.clk,
-               .enable         = s5pc100_d1_2_ctrl,
-               .ctrlbit        = (1 << 1),
-       }, {
-               .name           = "mixer",
-               .parent         = &clk_div_d1_bus.clk,
-               .enable         = s5pc100_d1_2_ctrl,
-               .ctrlbit        = (1 << 2),
-       }, {
-               .name           = "hdmi",
-               .parent         = &clk_div_d1_bus.clk,
-               .enable         = s5pc100_d1_2_ctrl,
-               .ctrlbit        = (1 << 3),
-       }, {
-               .name           = "mfc",
-               .parent         = &clk_div_d1_bus.clk,
-               .enable         = s5pc100_d1_2_ctrl,
-               .ctrlbit        = (1 << 4),
-       }, {
-               .name           = "apc",
-               .parent         = &clk_div_d1_bus.clk,
-               .enable         = s5pc100_d1_3_ctrl,
-               .ctrlbit        = (1 << 2),
-       }, {
-               .name           = "iec",
-               .parent         = &clk_div_d1_bus.clk,
-               .enable         = s5pc100_d1_3_ctrl,
-               .ctrlbit        = (1 << 3),
-       }, {
-               .name           = "systimer",
-               .parent         = &clk_div_d1_bus.clk,
-               .enable         = s5pc100_d1_3_ctrl,
-               .ctrlbit        = (1 << 7),
-       }, {
-               .name           = "watchdog",
-               .parent         = &clk_div_d1_bus.clk,
-               .enable         = s5pc100_d1_3_ctrl,
-               .ctrlbit        = (1 << 8),
-       }, {
-               .name           = "rtc",
-               .parent         = &clk_div_d1_bus.clk,
-               .enable         = s5pc100_d1_3_ctrl,
-               .ctrlbit        = (1 << 9),
-       }, {
-               .name           = "i2c",
-               .devname        = "s3c2440-i2c.0",
-               .parent         = &clk_div_d1_bus.clk,
-               .enable         = s5pc100_d1_4_ctrl,
-               .ctrlbit        = (1 << 4),
-       }, {
-               .name           = "i2c",
-               .devname        = "s3c2440-i2c.1",
-               .parent         = &clk_div_d1_bus.clk,
-               .enable         = s5pc100_d1_4_ctrl,
-               .ctrlbit        = (1 << 5),
-       }, {
-               .name           = "spi",
-               .devname        = "s5pc100-spi.0",
-               .parent         = &clk_div_d1_bus.clk,
-               .enable         = s5pc100_d1_4_ctrl,
-               .ctrlbit        = (1 << 6),
-       }, {
-               .name           = "spi",
-               .devname        = "s5pc100-spi.1",
-               .parent         = &clk_div_d1_bus.clk,
-               .enable         = s5pc100_d1_4_ctrl,
-               .ctrlbit        = (1 << 7),
-       }, {
-               .name           = "spi",
-               .devname        = "s5pc100-spi.2",
-               .parent         = &clk_div_d1_bus.clk,
-               .enable         = s5pc100_d1_4_ctrl,
-               .ctrlbit        = (1 << 8),
-       }, {
-               .name           = "irda",
-               .parent         = &clk_div_d1_bus.clk,
-               .enable         = s5pc100_d1_4_ctrl,
-               .ctrlbit        = (1 << 9),
-       }, {
-               .name           = "ccan",
-               .parent         = &clk_div_d1_bus.clk,
-               .enable         = s5pc100_d1_4_ctrl,
-               .ctrlbit        = (1 << 10),
-       }, {
-               .name           = "ccan",
-               .parent         = &clk_div_d1_bus.clk,
-               .enable         = s5pc100_d1_4_ctrl,
-               .ctrlbit        = (1 << 11),
-       }, {
-               .name           = "hsitx",
-               .parent         = &clk_div_d1_bus.clk,
-               .enable         = s5pc100_d1_4_ctrl,
-               .ctrlbit        = (1 << 12),
-       }, {
-               .name           = "hsirx",
-               .parent         = &clk_div_d1_bus.clk,
-               .enable         = s5pc100_d1_4_ctrl,
-               .ctrlbit        = (1 << 13),
-       }, {
-               .name           = "ac97",
-               .parent         = &clk_div_pclkd1.clk,
-               .enable         = s5pc100_d1_5_ctrl,
-               .ctrlbit        = (1 << 3),
-       }, {
-               .name           = "pcm",
-               .devname        = "samsung-pcm.0",
-               .parent         = &clk_div_pclkd1.clk,
-               .enable         = s5pc100_d1_5_ctrl,
-               .ctrlbit        = (1 << 4),
-       }, {
-               .name           = "pcm",
-               .devname        = "samsung-pcm.1",
-               .parent         = &clk_div_pclkd1.clk,
-               .enable         = s5pc100_d1_5_ctrl,
-               .ctrlbit        = (1 << 5),
-       }, {
-               .name           = "spdif",
-               .parent         = &clk_div_pclkd1.clk,
-               .enable         = s5pc100_d1_5_ctrl,
-               .ctrlbit        = (1 << 6),
-       }, {
-               .name           = "adc",
-               .parent         = &clk_div_pclkd1.clk,
-               .enable         = s5pc100_d1_5_ctrl,
-               .ctrlbit        = (1 << 7),
-       }, {
-               .name           = "keypad",
-               .parent         = &clk_div_pclkd1.clk,
-               .enable         = s5pc100_d1_5_ctrl,
-               .ctrlbit        = (1 << 8),
-       }, {
-               .name           = "mmc_48m",
-               .devname        = "s3c-sdhci.0",
-               .parent         = &clk_mout_48m.clk,
-               .enable         = s5pc100_sclk0_ctrl,
-               .ctrlbit        = (1 << 15),
-       }, {
-               .name           = "mmc_48m",
-               .devname        = "s3c-sdhci.1",
-               .parent         = &clk_mout_48m.clk,
-               .enable         = s5pc100_sclk0_ctrl,
-               .ctrlbit        = (1 << 16),
-       }, {
-               .name           = "mmc_48m",
-               .devname        = "s3c-sdhci.2",
-               .parent         = &clk_mout_48m.clk,
-               .enable         = s5pc100_sclk0_ctrl,
-               .ctrlbit        = (1 << 17),
-       },
-};
-
-static struct clk clk_hsmmc2 = {
-       .name           = "hsmmc",
-       .devname        = "s3c-sdhci.2",
-       .parent         = &clk_div_d1_bus.clk,
-       .enable         = s5pc100_d1_0_ctrl,
-       .ctrlbit        = (1 << 7),
-};
-
-static struct clk clk_hsmmc1 = {
-       .name           = "hsmmc",
-       .devname        = "s3c-sdhci.1",
-       .parent         = &clk_div_d1_bus.clk,
-       .enable         = s5pc100_d1_0_ctrl,
-       .ctrlbit        = (1 << 6),
-};
-
-static struct clk clk_hsmmc0 = {
-       .name           = "hsmmc",
-       .devname        = "s3c-sdhci.0",
-       .parent         = &clk_div_d1_bus.clk,
-       .enable         = s5pc100_d1_0_ctrl,
-       .ctrlbit        = (1 << 5),
-};
-
-static struct clk clk_48m_spi0 = {
-       .name           = "spi_48m",
-       .devname        = "s5pc100-spi.0",
-       .parent         = &clk_mout_48m.clk,
-       .enable         = s5pc100_sclk0_ctrl,
-       .ctrlbit        = (1 << 7),
-};
-
-static struct clk clk_48m_spi1 = {
-       .name           = "spi_48m",
-       .devname        = "s5pc100-spi.1",
-       .parent         = &clk_mout_48m.clk,
-       .enable         = s5pc100_sclk0_ctrl,
-       .ctrlbit        = (1 << 8),
-};
-
-static struct clk clk_48m_spi2 = {
-       .name           = "spi_48m",
-       .devname        = "s5pc100-spi.2",
-       .parent         = &clk_mout_48m.clk,
-       .enable         = s5pc100_sclk0_ctrl,
-       .ctrlbit        = (1 << 9),
-};
-
-static struct clk clk_i2s0 = {
-       .name           = "iis",
-       .devname        = "samsung-i2s.0",
-       .parent         = &clk_div_pclkd1.clk,
-       .enable         = s5pc100_d1_5_ctrl,
-       .ctrlbit        = (1 << 0),
-};
-
-static struct clk clk_i2s1 = {
-       .name           = "iis",
-       .devname        = "samsung-i2s.1",
-       .parent         = &clk_div_pclkd1.clk,
-       .enable         = s5pc100_d1_5_ctrl,
-       .ctrlbit        = (1 << 1),
-};
-
-static struct clk clk_i2s2 = {
-       .name           = "iis",
-       .devname        = "samsung-i2s.2",
-       .parent         = &clk_div_pclkd1.clk,
-       .enable         = s5pc100_d1_5_ctrl,
-       .ctrlbit        = (1 << 2),
-};
-
-static struct clk clk_vclk54m = {
-       .name           = "vclk_54m",
-       .rate           = 54000000,
-};
-
-static struct clk clk_i2scdclk0 = {
-       .name           = "i2s_cdclk0",
-};
-
-static struct clk clk_i2scdclk1 = {
-       .name           = "i2s_cdclk1",
-};
-
-static struct clk clk_i2scdclk2 = {
-       .name           = "i2s_cdclk2",
-};
-
-static struct clk clk_pcmcdclk0 = {
-       .name           = "pcm_cdclk0",
-};
-
-static struct clk clk_pcmcdclk1 = {
-       .name           = "pcm_cdclk1",
-};
-
-static struct clk *clk_src_group1_list[] = {
-       [0] = &clk_mout_epll.clk,
-       [1] = &clk_div_mpll2.clk,
-       [2] = &clk_fin_epll,
-       [3] = &clk_mout_hpll.clk,
-};
-
-static struct clksrc_sources clk_src_group1 = {
-       .sources        = clk_src_group1_list,
-       .nr_sources     = ARRAY_SIZE(clk_src_group1_list),
-};
-
-static struct clk *clk_src_group2_list[] = {
-       [0] = &clk_mout_epll.clk,
-       [1] = &clk_div_mpll.clk,
-};
-
-static struct clksrc_sources clk_src_group2 = {
-       .sources        = clk_src_group2_list,
-       .nr_sources     = ARRAY_SIZE(clk_src_group2_list),
-};
-
-static struct clk *clk_src_group3_list[] = {
-       [0] = &clk_mout_epll.clk,
-       [1] = &clk_div_mpll.clk,
-       [2] = &clk_fin_epll,
-       [3] = &clk_i2scdclk0,
-       [4] = &clk_pcmcdclk0,
-       [5] = &clk_mout_hpll.clk,
-};
-
-static struct clksrc_sources clk_src_group3 = {
-       .sources        = clk_src_group3_list,
-       .nr_sources     = ARRAY_SIZE(clk_src_group3_list),
-};
-
-static struct clksrc_clk clk_sclk_audio0 = {
-       .clk    = {
-               .name           = "sclk_audio",
-               .devname        = "samsung-pcm.0",
-               .ctrlbit        = (1 << 8),
-               .enable         = s5pc100_sclk1_ctrl,
-       },
-       .sources = &clk_src_group3,
-       .reg_src = { .reg = S5P_CLK_SRC3, .shift = 12, .size = 3 },
-       .reg_div = { .reg = S5P_CLK_DIV4, .shift = 12, .size = 4 },
-};
-
-static struct clk *clk_src_group4_list[] = {
-       [0] = &clk_mout_epll.clk,
-       [1] = &clk_div_mpll.clk,
-       [2] = &clk_fin_epll,
-       [3] = &clk_i2scdclk1,
-       [4] = &clk_pcmcdclk1,
-       [5] = &clk_mout_hpll.clk,
-};
-
-static struct clksrc_sources clk_src_group4 = {
-       .sources        = clk_src_group4_list,
-       .nr_sources     = ARRAY_SIZE(clk_src_group4_list),
-};
-
-static struct clksrc_clk clk_sclk_audio1 = {
-       .clk    = {
-               .name           = "sclk_audio",
-               .devname        = "samsung-pcm.1",
-               .ctrlbit        = (1 << 9),
-               .enable         = s5pc100_sclk1_ctrl,
-       },
-       .sources = &clk_src_group4,
-       .reg_src = { .reg = S5P_CLK_SRC3, .shift = 16, .size = 3 },
-       .reg_div = { .reg = S5P_CLK_DIV4, .shift = 16, .size = 4 },
-};
-
-static struct clk *clk_src_group5_list[] = {
-       [0] = &clk_mout_epll.clk,
-       [1] = &clk_div_mpll.clk,
-       [2] = &clk_fin_epll,
-       [3] = &clk_i2scdclk2,
-       [4] = &clk_mout_hpll.clk,
-};
-
-static struct clksrc_sources clk_src_group5 = {
-       .sources        = clk_src_group5_list,
-       .nr_sources     = ARRAY_SIZE(clk_src_group5_list),
-};
-
-static struct clksrc_clk clk_sclk_audio2 = {
-       .clk    = {
-               .name           = "sclk_audio",
-               .devname        = "samsung-pcm.2",
-               .ctrlbit        = (1 << 10),
-               .enable         = s5pc100_sclk1_ctrl,
-       },
-       .sources = &clk_src_group5,
-       .reg_src = { .reg = S5P_CLK_SRC3, .shift = 20, .size = 3 },
-       .reg_div = { .reg = S5P_CLK_DIV4, .shift = 20, .size = 4 },
-};
-
-static struct clk *clk_src_group6_list[] = {
-       [0] = &s5p_clk_27m,
-       [1] = &clk_vclk54m,
-       [2] = &clk_div_hdmi.clk,
-};
-
-static struct clksrc_sources clk_src_group6 = {
-       .sources        = clk_src_group6_list,
-       .nr_sources     = ARRAY_SIZE(clk_src_group6_list),
-};
-
-static struct clk *clk_src_group7_list[] = {
-       [0] = &clk_mout_epll.clk,
-       [1] = &clk_div_mpll.clk,
-       [2] = &clk_mout_hpll.clk,
-       [3] = &clk_vclk54m,
-};
-
-static struct clksrc_sources clk_src_group7 = {
-       .sources        = clk_src_group7_list,
-       .nr_sources     = ARRAY_SIZE(clk_src_group7_list),
-};
-
-static struct clk *clk_src_mmc0_list[] = {
-       [0] = &clk_mout_epll.clk,
-       [1] = &clk_div_mpll.clk,
-       [2] = &clk_fin_epll,
-};
-
-static struct clksrc_sources clk_src_mmc0 = {
-       .sources        = clk_src_mmc0_list,
-       .nr_sources     = ARRAY_SIZE(clk_src_mmc0_list),
-};
-
-static struct clk *clk_src_mmc12_list[] = {
-       [0] = &clk_mout_epll.clk,
-       [1] = &clk_div_mpll.clk,
-       [2] = &clk_fin_epll,
-       [3] = &clk_mout_hpll.clk,
-};
-
-static struct clksrc_sources clk_src_mmc12 = {
-       .sources        = clk_src_mmc12_list,
-       .nr_sources     = ARRAY_SIZE(clk_src_mmc12_list),
-};
-
-static struct clk *clk_src_irda_usb_list[] = {
-       [0] = &clk_mout_epll.clk,
-       [1] = &clk_div_mpll.clk,
-       [2] = &clk_fin_epll,
-       [3] = &clk_mout_hpll.clk,
-};
-
-static struct clksrc_sources clk_src_irda_usb = {
-       .sources        = clk_src_irda_usb_list,
-       .nr_sources     = ARRAY_SIZE(clk_src_irda_usb_list),
-};
-
-static struct clk *clk_src_pwi_list[] = {
-       [0] = &clk_fin_epll,
-       [1] = &clk_mout_epll.clk,
-       [2] = &clk_div_mpll.clk,
-};
-
-static struct clksrc_sources clk_src_pwi = {
-       .sources        = clk_src_pwi_list,
-       .nr_sources     = ARRAY_SIZE(clk_src_pwi_list),
-};
-
-static struct clk *clk_sclk_spdif_list[] = {
-       [0] = &clk_sclk_audio0.clk,
-       [1] = &clk_sclk_audio1.clk,
-       [2] = &clk_sclk_audio2.clk,
-};
-
-static struct clksrc_sources clk_src_sclk_spdif = {
-       .sources        = clk_sclk_spdif_list,
-       .nr_sources     = ARRAY_SIZE(clk_sclk_spdif_list),
-};
-
-static struct clksrc_clk clk_sclk_spdif = {
-       .clk    = {
-               .name           = "sclk_spdif",
-               .ctrlbit        = (1 << 11),
-               .enable         = s5pc100_sclk1_ctrl,
-               .ops            = &s5p_sclk_spdif_ops,
-       },
-       .sources = &clk_src_sclk_spdif,
-       .reg_src = { .reg = S5P_CLK_SRC3, .shift = 24, .size = 2 },
-};
-
-static struct clksrc_clk clksrcs[] = {
-       {
-               .clk    = {
-                       .name           = "sclk_mixer",
-                       .ctrlbit        = (1 << 6),
-                       .enable         = s5pc100_sclk0_ctrl,
-
-               },
-               .sources = &clk_src_group6,
-               .reg_src = { .reg = S5P_CLK_SRC2, .shift = 28, .size = 2 },
-       }, {
-               .clk    = {
-                       .name           = "sclk_lcd",
-                       .ctrlbit        = (1 << 0),
-                       .enable         = s5pc100_sclk1_ctrl,
-
-               },
-               .sources = &clk_src_group7,
-               .reg_src = { .reg = S5P_CLK_SRC2, .shift = 12, .size = 2 },
-               .reg_div = { .reg = S5P_CLK_DIV3, .shift = 12, .size = 4 },
-       }, {
-               .clk    = {
-                       .name           = "sclk_fimc",
-                       .devname        = "s5p-fimc.0",
-                       .ctrlbit        = (1 << 1),
-                       .enable         = s5pc100_sclk1_ctrl,
-
-               },
-               .sources = &clk_src_group7,
-               .reg_src = { .reg = S5P_CLK_SRC2, .shift = 16, .size = 2 },
-               .reg_div = { .reg = S5P_CLK_DIV3, .shift = 16, .size = 4 },
-       }, {
-               .clk    = {
-                       .name           = "sclk_fimc",
-                       .devname        = "s5p-fimc.1",
-                       .ctrlbit        = (1 << 2),
-                       .enable         = s5pc100_sclk1_ctrl,
-
-               },
-               .sources = &clk_src_group7,
-               .reg_src = { .reg = S5P_CLK_SRC2, .shift = 20, .size = 2 },
-               .reg_div = { .reg = S5P_CLK_DIV3, .shift = 20, .size = 4 },
-       }, {
-               .clk    = {
-                       .name           = "sclk_fimc",
-                       .devname        = "s5p-fimc.2",
-                       .ctrlbit        = (1 << 3),
-                       .enable         = s5pc100_sclk1_ctrl,
-
-               },
-               .sources = &clk_src_group7,
-               .reg_src = { .reg = S5P_CLK_SRC2, .shift = 24, .size = 2 },
-               .reg_div = { .reg = S5P_CLK_DIV3, .shift = 24, .size = 4 },
-       }, {
-               .clk    = {
-                       .name           = "sclk_irda",
-                       .ctrlbit        = (1 << 10),
-                       .enable         = s5pc100_sclk0_ctrl,
-
-               },
-               .sources = &clk_src_irda_usb,
-               .reg_src = { .reg = S5P_CLK_SRC2, .shift = 8, .size = 2 },
-               .reg_div = { .reg = S5P_CLK_DIV3, .shift = 8, .size = 4 },
-       }, {
-               .clk    = {
-                       .name           = "sclk_irda",
-                       .ctrlbit        = (1 << 10),
-                       .enable         = s5pc100_sclk0_ctrl,
-
-               },
-               .sources = &clk_src_mmc12,
-               .reg_src = { .reg = S5P_CLK_SRC1, .shift = 16, .size = 2 },
-               .reg_div = { .reg = S5P_CLK_DIV2, .shift = 16, .size = 4 },
-       }, {
-               .clk    = {
-                       .name           = "sclk_pwi",
-                       .ctrlbit        = (1 << 1),
-                       .enable         = s5pc100_sclk0_ctrl,
-
-               },
-               .sources = &clk_src_pwi,
-               .reg_src = { .reg = S5P_CLK_SRC3, .shift = 0, .size = 2 },
-               .reg_div = { .reg = S5P_CLK_DIV4, .shift = 0, .size = 3 },
-       }, {
-               .clk    = {
-                       .name           = "sclk_uhost",
-                       .ctrlbit        = (1 << 11),
-                       .enable         = s5pc100_sclk0_ctrl,
-
-               },
-               .sources = &clk_src_irda_usb,
-               .reg_src = { .reg = S5P_CLK_SRC1, .shift = 20, .size = 2 },
-               .reg_div = { .reg = S5P_CLK_DIV2, .shift = 20, .size = 4 },
-       },
-};
-
-static struct clksrc_clk clk_sclk_uart = {
-       .clk    = {
-               .name           = "uclk1",
-               .ctrlbit        = (1 << 3),
-               .enable         = s5pc100_sclk0_ctrl,
-       },
-       .sources = &clk_src_group2,
-       .reg_src = { .reg = S5P_CLK_SRC1, .shift = 0, .size = 1 },
-       .reg_div = { .reg = S5P_CLK_DIV2, .shift = 0, .size = 4 },
-};
-
-static struct clksrc_clk clk_sclk_mmc0 = {
-       .clk    = {
-               .name           = "sclk_mmc",
-               .devname        = "s3c-sdhci.0",
-               .ctrlbit        = (1 << 12),
-               .enable         = s5pc100_sclk1_ctrl,
-       },
-       .sources = &clk_src_mmc0,
-       .reg_src = { .reg = S5P_CLK_SRC2, .shift = 0, .size = 2 },
-       .reg_div = { .reg = S5P_CLK_DIV3, .shift = 0, .size = 4 },
-};
-
-static struct clksrc_clk clk_sclk_mmc1 = {
-       .clk    = {
-               .name           = "sclk_mmc",
-               .devname        = "s3c-sdhci.1",
-               .ctrlbit        = (1 << 13),
-               .enable         = s5pc100_sclk1_ctrl,
-       },
-       .sources = &clk_src_mmc12,
-       .reg_src = { .reg = S5P_CLK_SRC2, .shift = 4, .size = 2 },
-       .reg_div = { .reg = S5P_CLK_DIV3, .shift = 4, .size = 4 },
-};
-
-static struct clksrc_clk clk_sclk_mmc2 = {
-       .clk    = {
-               .name           = "sclk_mmc",
-               .devname        = "s3c-sdhci.2",
-               .ctrlbit        = (1 << 14),
-               .enable         = s5pc100_sclk1_ctrl,
-       },
-       .sources = &clk_src_mmc12,
-       .reg_src = { .reg = S5P_CLK_SRC2, .shift = 8, .size = 2 },
-       .reg_div = { .reg = S5P_CLK_DIV3, .shift = 8, .size = 4 },
-};
-
-static struct clksrc_clk clk_sclk_spi0 = {
-       .clk    = {
-               .name           = "sclk_spi",
-               .devname        = "s5pc100-spi.0",
-               .ctrlbit        = (1 << 4),
-               .enable         = s5pc100_sclk0_ctrl,
-       },
-       .sources = &clk_src_group1,
-       .reg_src = { .reg = S5P_CLK_SRC1, .shift = 4, .size = 2 },
-       .reg_div = { .reg = S5P_CLK_DIV2, .shift = 4, .size = 4 },
-};
-
-static struct clksrc_clk clk_sclk_spi1 = {
-       .clk    = {
-               .name           = "sclk_spi",
-               .devname        = "s5pc100-spi.1",
-               .ctrlbit        = (1 << 5),
-               .enable         = s5pc100_sclk0_ctrl,
-       },
-       .sources = &clk_src_group1,
-       .reg_src = { .reg = S5P_CLK_SRC1, .shift = 8, .size = 2 },
-       .reg_div = { .reg = S5P_CLK_DIV2, .shift = 8, .size = 4 },
-};
-
-static struct clksrc_clk clk_sclk_spi2 = {
-       .clk    = {
-               .name           = "sclk_spi",
-               .devname        = "s5pc100-spi.2",
-               .ctrlbit        = (1 << 6),
-               .enable         = s5pc100_sclk0_ctrl,
-       },
-       .sources = &clk_src_group1,
-       .reg_src = { .reg = S5P_CLK_SRC1, .shift = 12, .size = 2 },
-       .reg_div = { .reg = S5P_CLK_DIV2, .shift = 12, .size = 4 },
-};
-
-/* Clock initialisation code */
-static struct clksrc_clk *sysclks[] = {
-       &clk_mout_apll,
-       &clk_mout_epll,
-       &clk_mout_mpll,
-       &clk_mout_hpll,
-       &clk_mout_href,
-       &clk_mout_48m,
-       &clk_div_apll,
-       &clk_div_arm,
-       &clk_div_d0_bus,
-       &clk_div_pclkd0,
-       &clk_div_secss,
-       &clk_div_apll2,
-       &clk_mout_am,
-       &clk_div_d1_bus,
-       &clk_div_mpll2,
-       &clk_div_mpll,
-       &clk_mout_onenand,
-       &clk_div_onenand,
-       &clk_div_pclkd1,
-       &clk_div_cam,
-       &clk_div_hdmi,
-       &clk_sclk_audio0,
-       &clk_sclk_audio1,
-       &clk_sclk_audio2,
-       &clk_sclk_spdif,
-};
-
-static struct clk *clk_cdev[] = {
-       &clk_hsmmc0,
-       &clk_hsmmc1,
-       &clk_hsmmc2,
-       &clk_48m_spi0,
-       &clk_48m_spi1,
-       &clk_48m_spi2,
-       &clk_i2s0,
-       &clk_i2s1,
-       &clk_i2s2,
-};
-
-static struct clksrc_clk *clksrc_cdev[] = {
-       &clk_sclk_uart,
-       &clk_sclk_mmc0,
-       &clk_sclk_mmc1,
-       &clk_sclk_mmc2,
-       &clk_sclk_spi0,
-       &clk_sclk_spi1,
-       &clk_sclk_spi2,
-};
-
-void __init_or_cpufreq s5pc100_setup_clocks(void)
-{
-       unsigned long xtal;
-       unsigned long arm;
-       unsigned long hclkd0;
-       unsigned long hclkd1;
-       unsigned long pclkd0;
-       unsigned long pclkd1;
-       unsigned long apll;
-       unsigned long mpll;
-       unsigned long epll;
-       unsigned long hpll;
-       unsigned int ptr;
-
-       /* Set S5PC100 functions for clk_fout_epll */
-       clk_fout_epll.enable = s5p_epll_enable;
-       clk_fout_epll.ops = &s5pc100_epll_ops;
-
-       printk(KERN_DEBUG "%s: registering clocks\n", __func__);
-
-       xtal = clk_get_rate(&clk_xtal);
-
-       printk(KERN_DEBUG "%s: xtal is %ld\n", __func__, xtal);
-
-       apll = s5p_get_pll65xx(xtal, __raw_readl(S5P_APLL_CON));
-       mpll = s5p_get_pll65xx(xtal, __raw_readl(S5P_MPLL_CON));
-       epll = s5p_get_pll65xx(xtal, __raw_readl(S5P_EPLL_CON));
-       hpll = s5p_get_pll65xx(xtal, __raw_readl(S5P_HPLL_CON));
-
-       printk(KERN_INFO "S5PC100: PLL settings, A=%ld.%ldMHz, M=%ld.%ldMHz, E=%ld.%ldMHz, H=%ld.%ldMHz\n",
-                       print_mhz(apll), print_mhz(mpll), print_mhz(epll), print_mhz(hpll));
-
-       clk_fout_apll.rate = apll;
-       clk_fout_mpll.rate = mpll;
-       clk_fout_epll.rate = epll;
-       clk_mout_hpll.clk.rate = hpll;
-
-       for (ptr = 0; ptr < ARRAY_SIZE(clksrcs); ptr++)
-               s3c_set_clksrc(&clksrcs[ptr], true);
-
-       arm = clk_get_rate(&clk_div_arm.clk);
-       hclkd0 = clk_get_rate(&clk_div_d0_bus.clk);
-       pclkd0 = clk_get_rate(&clk_div_pclkd0.clk);
-       hclkd1 = clk_get_rate(&clk_div_d1_bus.clk);
-       pclkd1 = clk_get_rate(&clk_div_pclkd1.clk);
-
-       printk(KERN_INFO "S5PC100: HCLKD0=%ld.%ldMHz, HCLKD1=%ld.%ldMHz, PCLKD0=%ld.%ldMHz, PCLKD1=%ld.%ldMHz\n",
-                       print_mhz(hclkd0), print_mhz(hclkd1), print_mhz(pclkd0), print_mhz(pclkd1));
-
-       clk_f.rate = arm;
-       clk_h.rate = hclkd1;
-       clk_p.rate = pclkd1;
-}
-
-/*
- * The following clocks will be enabled during clock initialization.
- */
-static struct clk init_clocks[] = {
-       {
-               .name           = "tzic",
-               .parent         = &clk_div_d0_bus.clk,
-               .enable         = s5pc100_d0_0_ctrl,
-               .ctrlbit        = (1 << 1),
-       }, {
-               .name           = "intc",
-               .parent         = &clk_div_d0_bus.clk,
-               .enable         = s5pc100_d0_0_ctrl,
-               .ctrlbit        = (1 << 0),
-       }, {
-               .name           = "ebi",
-               .parent         = &clk_div_d0_bus.clk,
-               .enable         = s5pc100_d0_1_ctrl,
-               .ctrlbit        = (1 << 5),
-       }, {
-               .name           = "intmem",
-               .parent         = &clk_div_d0_bus.clk,
-               .enable         = s5pc100_d0_1_ctrl,
-               .ctrlbit        = (1 << 4),
-       }, {
-               .name           = "sromc",
-               .parent         = &clk_div_d0_bus.clk,
-               .enable         = s5pc100_d0_1_ctrl,
-               .ctrlbit        = (1 << 1),
-       }, {
-               .name           = "dmc",
-               .parent         = &clk_div_d0_bus.clk,
-               .enable         = s5pc100_d0_1_ctrl,
-               .ctrlbit        = (1 << 0),
-       }, {
-               .name           = "chipid",
-               .parent         = &clk_div_d0_bus.clk,
-               .enable         = s5pc100_d0_1_ctrl,
-               .ctrlbit        = (1 << 0),
-       }, {
-               .name           = "gpio",
-               .parent         = &clk_div_d1_bus.clk,
-               .enable         = s5pc100_d1_3_ctrl,
-               .ctrlbit        = (1 << 1),
-       }, {
-               .name           = "uart",
-               .devname        = "s3c6400-uart.0",
-               .parent         = &clk_div_d1_bus.clk,
-               .enable         = s5pc100_d1_4_ctrl,
-               .ctrlbit        = (1 << 0),
-       }, {
-               .name           = "uart",
-               .devname        = "s3c6400-uart.1",
-               .parent         = &clk_div_d1_bus.clk,
-               .enable         = s5pc100_d1_4_ctrl,
-               .ctrlbit        = (1 << 1),
-       }, {
-               .name           = "uart",
-               .devname        = "s3c6400-uart.2",
-               .parent         = &clk_div_d1_bus.clk,
-               .enable         = s5pc100_d1_4_ctrl,
-               .ctrlbit        = (1 << 2),
-       }, {
-               .name           = "uart",
-               .devname        = "s3c6400-uart.3",
-               .parent         = &clk_div_d1_bus.clk,
-               .enable         = s5pc100_d1_4_ctrl,
-               .ctrlbit        = (1 << 3),
-       }, {
-               .name           = "timers",
-               .parent         = &clk_div_d1_bus.clk,
-               .enable         = s5pc100_d1_3_ctrl,
-               .ctrlbit        = (1 << 6),
-       },
-};
-
-static struct clk *clks[] __initdata = {
-       &clk_ext,
-       &clk_i2scdclk0,
-       &clk_i2scdclk1,
-       &clk_i2scdclk2,
-       &clk_pcmcdclk0,
-       &clk_pcmcdclk1,
-};
-
-static struct clk_lookup s5pc100_clk_lookup[] = {
-       CLKDEV_INIT(NULL, "clk_uart_baud2", &clk_p),
-       CLKDEV_INIT(NULL, "clk_uart_baud3", &clk_sclk_uart.clk),
-       CLKDEV_INIT("s3c-sdhci.0", "mmc_busclk.0", &clk_hsmmc0),
-       CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.0", &clk_hsmmc1),
-       CLKDEV_INIT("s3c-sdhci.2", "mmc_busclk.0", &clk_hsmmc2),
-       CLKDEV_INIT("s3c-sdhci.0", "mmc_busclk.2", &clk_sclk_mmc0.clk),
-       CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.2", &clk_sclk_mmc1.clk),
-       CLKDEV_INIT("s3c-sdhci.2", "mmc_busclk.2", &clk_sclk_mmc2.clk),
-       CLKDEV_INIT(NULL, "spi_busclk0", &clk_p),
-       CLKDEV_INIT("s5pc100-spi.0", "spi_busclk1", &clk_48m_spi0),
-       CLKDEV_INIT("s5pc100-spi.0", "spi_busclk2", &clk_sclk_spi0.clk),
-       CLKDEV_INIT("s5pc100-spi.1", "spi_busclk1", &clk_48m_spi1),
-       CLKDEV_INIT("s5pc100-spi.1", "spi_busclk2", &clk_sclk_spi1.clk),
-       CLKDEV_INIT("s5pc100-spi.2", "spi_busclk1", &clk_48m_spi2),
-       CLKDEV_INIT("s5pc100-spi.2", "spi_busclk2", &clk_sclk_spi2.clk),
-       CLKDEV_INIT("samsung-i2s.0", "i2s_opclk0", &clk_i2s0),
-       CLKDEV_INIT("samsung-i2s.1", "i2s_opclk0", &clk_i2s1),
-       CLKDEV_INIT("samsung-i2s.2", "i2s_opclk0", &clk_i2s2),
-};
-
-void __init s5pc100_register_clocks(void)
-{
-       int ptr;
-
-       s3c24xx_register_clocks(clks, ARRAY_SIZE(clks));
-
-       for (ptr = 0; ptr < ARRAY_SIZE(sysclks); ptr++)
-               s3c_register_clksrc(sysclks[ptr], 1);
-
-       s3c_register_clksrc(clksrcs, ARRAY_SIZE(clksrcs));
-       s3c_register_clocks(init_clocks, ARRAY_SIZE(init_clocks));
-       for (ptr = 0; ptr < ARRAY_SIZE(clksrc_cdev); ptr++)
-               s3c_register_clksrc(clksrc_cdev[ptr], 1);
-
-       s3c_register_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off));
-       s3c_disable_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off));
-       clkdev_add_table(s5pc100_clk_lookup, ARRAY_SIZE(s5pc100_clk_lookup));
-
-       s3c24xx_register_clocks(clk_cdev, ARRAY_SIZE(clk_cdev));
-       for (ptr = 0; ptr < ARRAY_SIZE(clk_cdev); ptr++)
-               s3c_disable_clocks(clk_cdev[ptr], 1);
-
-       s3c24xx_register_clock(&dummy_apb_pclk);
-}
diff --git a/arch/arm/mach-s5pc100/common.c b/arch/arm/mach-s5pc100/common.c
deleted file mode 100644 (file)
index 6a41bf7..0000000
+++ /dev/null
@@ -1,255 +0,0 @@
-/*
- * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * Copyright 2009 Samsung Electronics Co.
- *     Byungho Min <bhmin@samsung.com>
- *
- * Common Codes for S5PC100
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/interrupt.h>
-#include <linux/list.h>
-#include <linux/timer.h>
-#include <linux/init.h>
-#include <linux/clk.h>
-#include <linux/io.h>
-#include <linux/device.h>
-#include <linux/serial_core.h>
-#include <linux/serial_s3c.h>
-#include <clocksource/samsung_pwm.h>
-#include <linux/platform_device.h>
-#include <linux/sched.h>
-#include <linux/reboot.h>
-
-#include <asm/irq.h>
-#include <asm/proc-fns.h>
-#include <asm/system_misc.h>
-#include <asm/mach/arch.h>
-#include <asm/mach/map.h>
-#include <asm/mach/irq.h>
-
-#include <mach/map.h>
-#include <mach/hardware.h>
-#include <mach/regs-clock.h>
-
-#include <plat/cpu.h>
-#include <plat/devs.h>
-#include <plat/clock.h>
-#include <plat/sdhci.h>
-#include <plat/adc-core.h>
-#include <plat/ata-core.h>
-#include <plat/fb-core.h>
-#include <plat/iic-core.h>
-#include <plat/onenand-core.h>
-#include <plat/pwm-core.h>
-#include <plat/spi-core.h>
-#include <plat/watchdog-reset.h>
-
-#include "common.h"
-
-static const char name_s5pc100[] = "S5PC100";
-
-static struct cpu_table cpu_ids[] __initdata = {
-       {
-               .idcode         = S5PC100_CPU_ID,
-               .idmask         = S5PC100_CPU_MASK,
-               .map_io         = s5pc100_map_io,
-               .init_clocks    = s5pc100_init_clocks,
-               .init_uarts     = s5pc100_init_uarts,
-               .init           = s5pc100_init,
-               .name           = name_s5pc100,
-       },
-};
-
-/* Initial IO mappings */
-
-static struct map_desc s5pc100_iodesc[] __initdata = {
-       {
-               .virtual        = (unsigned long)S5P_VA_CHIPID,
-               .pfn            = __phys_to_pfn(S5PC100_PA_CHIPID),
-               .length         = SZ_4K,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = (unsigned long)S3C_VA_SYS,
-               .pfn            = __phys_to_pfn(S5PC100_PA_SYSCON),
-               .length         = SZ_64K,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = (unsigned long)S3C_VA_TIMER,
-               .pfn            = __phys_to_pfn(S5PC100_PA_TIMER),
-               .length         = SZ_16K,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = (unsigned long)S3C_VA_WATCHDOG,
-               .pfn            = __phys_to_pfn(S5PC100_PA_WATCHDOG),
-               .length         = SZ_4K,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = (unsigned long)S5P_VA_SROMC,
-               .pfn            = __phys_to_pfn(S5PC100_PA_SROMC),
-               .length         = SZ_4K,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = (unsigned long)S5P_VA_SYSTIMER,
-               .pfn            = __phys_to_pfn(S5PC100_PA_SYSTIMER),
-               .length         = SZ_16K,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = (unsigned long)S5P_VA_GPIO,
-               .pfn            = __phys_to_pfn(S5PC100_PA_GPIO),
-               .length         = SZ_4K,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = (unsigned long)VA_VIC0,
-               .pfn            = __phys_to_pfn(S5PC100_PA_VIC0),
-               .length         = SZ_16K,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = (unsigned long)VA_VIC1,
-               .pfn            = __phys_to_pfn(S5PC100_PA_VIC1),
-               .length         = SZ_16K,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = (unsigned long)VA_VIC2,
-               .pfn            = __phys_to_pfn(S5PC100_PA_VIC2),
-               .length         = SZ_16K,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = (unsigned long)S3C_VA_UART,
-               .pfn            = __phys_to_pfn(S3C_PA_UART),
-               .length         = SZ_512K,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = (unsigned long)S5PC100_VA_OTHERS,
-               .pfn            = __phys_to_pfn(S5PC100_PA_OTHERS),
-               .length         = SZ_4K,
-               .type           = MT_DEVICE,
-       }
-};
-
-static struct samsung_pwm_variant s5pc100_pwm_variant = {
-       .bits           = 32,
-       .div_base       = 0,
-       .has_tint_cstat = true,
-       .tclk_mask      = (1 << 5),
-};
-
-void __init samsung_set_timer_source(unsigned int event, unsigned int source)
-{
-       s5pc100_pwm_variant.output_mask = BIT(SAMSUNG_PWM_NUM) - 1;
-       s5pc100_pwm_variant.output_mask &= ~(BIT(event) | BIT(source));
-}
-
-void __init samsung_timer_init(void)
-{
-       unsigned int timer_irqs[SAMSUNG_PWM_NUM] = {
-               IRQ_TIMER0_VIC, IRQ_TIMER1_VIC, IRQ_TIMER2_VIC,
-               IRQ_TIMER3_VIC, IRQ_TIMER4_VIC,
-       };
-
-       samsung_pwm_clocksource_init(S3C_VA_TIMER,
-                                       timer_irqs, &s5pc100_pwm_variant);
-}
-
-/*
- * s5pc100_map_io
- *
- * register the standard CPU IO areas
- */
-
-void __init s5pc100_init_io(struct map_desc *mach_desc, int size)
-{
-       /* initialize the io descriptors we need for initialization */
-       iotable_init(s5pc100_iodesc, ARRAY_SIZE(s5pc100_iodesc));
-       if (mach_desc)
-               iotable_init(mach_desc, size);
-
-       /* detect cpu id and rev. */
-       s5p_init_cpu(S5P_VA_CHIPID);
-
-       s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids));
-
-       samsung_pwm_set_platdata(&s5pc100_pwm_variant);
-}
-
-void __init s5pc100_map_io(void)
-{
-       /* initialise device information early */
-       s5pc100_default_sdhci0();
-       s5pc100_default_sdhci1();
-       s5pc100_default_sdhci2();
-
-       s3c_adc_setname("s3c64xx-adc");
-
-       /* the i2c devices are directly compatible with s3c2440 */
-       s3c_i2c0_setname("s3c2440-i2c");
-       s3c_i2c1_setname("s3c2440-i2c");
-
-       s3c_onenand_setname("s5pc100-onenand");
-       s3c_fb_setname("s5pc100-fb");
-       s3c_cfcon_setname("s5pc100-pata");
-
-       s3c64xx_spi_setname("s5pc100-spi");
-}
-
-void __init s5pc100_init_clocks(int xtal)
-{
-       printk(KERN_DEBUG "%s: initializing clocks\n", __func__);
-
-       s3c24xx_register_baseclocks(xtal);
-       s5p_register_clocks(xtal);
-       s5pc100_register_clocks();
-       s5pc100_setup_clocks();
-       samsung_wdt_reset_init(S3C_VA_WATCHDOG);
-}
-
-void __init s5pc100_init_irq(void)
-{
-       u32 vic[] = {~0, ~0, ~0};
-
-       /* VIC0, VIC1, and VIC2 are fully populated. */
-       s5p_init_irq(vic, ARRAY_SIZE(vic));
-}
-
-static struct bus_type s5pc100_subsys = {
-       .name           = "s5pc100-core",
-       .dev_name       = "s5pc100-core",
-};
-
-static struct device s5pc100_dev = {
-       .bus    = &s5pc100_subsys,
-};
-
-static int __init s5pc100_core_init(void)
-{
-       return subsys_system_register(&s5pc100_subsys, NULL);
-}
-core_initcall(s5pc100_core_init);
-
-int __init s5pc100_init(void)
-{
-       printk(KERN_INFO "S5PC100: Initializing architecture\n");
-       return device_register(&s5pc100_dev);
-}
-
-/* uart registration process */
-
-void __init s5pc100_init_uarts(struct s3c2410_uartcfg *cfg, int no)
-{
-       s3c24xx_init_uartdevs("s3c6400-uart", s5p_uart_resources, cfg, no);
-}
-
-void s5pc100_restart(enum reboot_mode mode, const char *cmd)
-{
-       if (mode != REBOOT_SOFT)
-               samsung_wdt_reset();
-
-       soft_restart(0);
-}
diff --git a/arch/arm/mach-s5pc100/common.h b/arch/arm/mach-s5pc100/common.h
deleted file mode 100644 (file)
index 08d782d..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * Common Header for S5PC100 machines
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#ifndef __ARCH_ARM_MACH_S5PC100_COMMON_H
-#define __ARCH_ARM_MACH_S5PC100_COMMON_H
-
-#include <linux/reboot.h>
-
-void s5pc100_init_io(struct map_desc *mach_desc, int size);
-void s5pc100_init_irq(void);
-
-void s5pc100_register_clocks(void);
-void s5pc100_setup_clocks(void);
-
-void s5pc100_restart(enum reboot_mode mode, const char *cmd);
-
-extern  int s5pc100_init(void);
-extern void s5pc100_map_io(void);
-extern void s5pc100_init_clocks(int xtal);
-extern void s5pc100_init_uarts(struct s3c2410_uartcfg *cfg, int no);
-
-#endif /* __ARCH_ARM_MACH_S5PC100_COMMON_H */
diff --git a/arch/arm/mach-s5pc100/dev-audio.c b/arch/arm/mach-s5pc100/dev-audio.c
deleted file mode 100644 (file)
index 46f488b..0000000
+++ /dev/null
@@ -1,239 +0,0 @@
-/* linux/arch/arm/mach-s5pc100/dev-audio.c
- *
- * Copyright (c) 2010 Samsung Electronics Co. Ltd
- *     Jaswinder Singh <jassi.brar@samsung.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#include <linux/platform_device.h>
-#include <linux/dma-mapping.h>
-#include <linux/gpio.h>
-
-#include <plat/gpio-cfg.h>
-#include <linux/platform_data/asoc-s3c.h>
-
-#include <mach/map.h>
-#include <mach/dma.h>
-#include <mach/irqs.h>
-
-static int s5pc100_cfg_i2s(struct platform_device *pdev)
-{
-       /* configure GPIO for i2s port */
-       switch (pdev->id) {
-       case 0: /* Dedicated pins */
-               break;
-       case 1:
-               s3c_gpio_cfgpin_range(S5PC100_GPC(0), 5, S3C_GPIO_SFN(2));
-               break;
-       case 2:
-               s3c_gpio_cfgpin_range(S5PC100_GPG3(0), 5, S3C_GPIO_SFN(4));
-               break;
-       default:
-               printk(KERN_ERR "Invalid Device %d\n", pdev->id);
-               return -EINVAL;
-       }
-
-       return 0;
-}
-
-static struct s3c_audio_pdata i2sv5_pdata = {
-       .cfg_gpio = s5pc100_cfg_i2s,
-       .type = {
-               .i2s = {
-                       .quirks = QUIRK_PRI_6CHAN | QUIRK_SEC_DAI
-                                        | QUIRK_NEED_RSTCLR,
-               },
-       },
-};
-
-static struct resource s5pc100_iis0_resource[] = {
-       [0] = DEFINE_RES_MEM(S5PC100_PA_I2S0, SZ_256),
-       [1] = DEFINE_RES_DMA(DMACH_I2S0_TX),
-       [2] = DEFINE_RES_DMA(DMACH_I2S0_RX),
-       [3] = DEFINE_RES_DMA(DMACH_I2S0S_TX),
-};
-
-struct platform_device s5pc100_device_iis0 = {
-       .name = "samsung-i2s",
-       .id = 0,
-       .num_resources    = ARRAY_SIZE(s5pc100_iis0_resource),
-       .resource         = s5pc100_iis0_resource,
-       .dev = {
-               .platform_data = &i2sv5_pdata,
-       },
-};
-
-static struct s3c_audio_pdata i2sv3_pdata = {
-       .cfg_gpio = s5pc100_cfg_i2s,
-};
-
-static struct resource s5pc100_iis1_resource[] = {
-       [0] = DEFINE_RES_MEM(S5PC100_PA_I2S1, SZ_256),
-       [1] = DEFINE_RES_DMA(DMACH_I2S1_TX),
-       [2] = DEFINE_RES_DMA(DMACH_I2S1_RX),
-};
-
-struct platform_device s5pc100_device_iis1 = {
-       .name             = "samsung-i2s",
-       .id               = 1,
-       .num_resources    = ARRAY_SIZE(s5pc100_iis1_resource),
-       .resource         = s5pc100_iis1_resource,
-       .dev = {
-               .platform_data = &i2sv3_pdata,
-       },
-};
-
-static struct resource s5pc100_iis2_resource[] = {
-       [0] = DEFINE_RES_MEM(S5PC100_PA_I2S2, SZ_256),
-       [1] = DEFINE_RES_DMA(DMACH_I2S2_TX),
-       [2] = DEFINE_RES_DMA(DMACH_I2S2_RX),
-};
-
-struct platform_device s5pc100_device_iis2 = {
-       .name             = "samsung-i2s",
-       .id               = 2,
-       .num_resources    = ARRAY_SIZE(s5pc100_iis2_resource),
-       .resource         = s5pc100_iis2_resource,
-       .dev = {
-               .platform_data = &i2sv3_pdata,
-       },
-};
-
-/* PCM Controller platform_devices */
-
-static int s5pc100_pcm_cfg_gpio(struct platform_device *pdev)
-{
-       switch (pdev->id) {
-       case 0:
-               s3c_gpio_cfgpin_range(S5PC100_GPG3(0), 5, S3C_GPIO_SFN(5));
-               break;
-
-       case 1:
-               s3c_gpio_cfgpin_range(S5PC100_GPC(0), 5, S3C_GPIO_SFN(3));
-               break;
-
-       default:
-               printk(KERN_DEBUG "Invalid PCM Controller number!");
-               return -EINVAL;
-       }
-
-       return 0;
-}
-
-static struct s3c_audio_pdata s3c_pcm_pdata = {
-       .cfg_gpio = s5pc100_pcm_cfg_gpio,
-};
-
-static struct resource s5pc100_pcm0_resource[] = {
-       [0] = DEFINE_RES_MEM(S5PC100_PA_PCM0, SZ_256),
-       [1] = DEFINE_RES_DMA(DMACH_PCM0_TX),
-       [2] = DEFINE_RES_DMA(DMACH_PCM0_RX),
-};
-
-struct platform_device s5pc100_device_pcm0 = {
-       .name             = "samsung-pcm",
-       .id               = 0,
-       .num_resources    = ARRAY_SIZE(s5pc100_pcm0_resource),
-       .resource         = s5pc100_pcm0_resource,
-       .dev = {
-               .platform_data = &s3c_pcm_pdata,
-       },
-};
-
-static struct resource s5pc100_pcm1_resource[] = {
-       [0] = DEFINE_RES_MEM(S5PC100_PA_PCM1, SZ_256),
-       [1] = DEFINE_RES_DMA(DMACH_PCM1_TX),
-       [2] = DEFINE_RES_DMA(DMACH_PCM1_RX),
-};
-
-struct platform_device s5pc100_device_pcm1 = {
-       .name             = "samsung-pcm",
-       .id               = 1,
-       .num_resources    = ARRAY_SIZE(s5pc100_pcm1_resource),
-       .resource         = s5pc100_pcm1_resource,
-       .dev = {
-               .platform_data = &s3c_pcm_pdata,
-       },
-};
-
-/* AC97 Controller platform devices */
-
-static int s5pc100_ac97_cfg_gpio(struct platform_device *pdev)
-{
-       return s3c_gpio_cfgpin_range(S5PC100_GPC(0), 5, S3C_GPIO_SFN(4));
-}
-
-static struct resource s5pc100_ac97_resource[] = {
-       [0] = DEFINE_RES_MEM(S5PC100_PA_AC97, SZ_256),
-       [1] = DEFINE_RES_DMA(DMACH_AC97_PCMOUT),
-       [2] = DEFINE_RES_DMA(DMACH_AC97_PCMIN),
-       [3] = DEFINE_RES_DMA(DMACH_AC97_MICIN),
-       [4] = DEFINE_RES_IRQ(IRQ_AC97),
-};
-
-static struct s3c_audio_pdata s3c_ac97_pdata = {
-       .cfg_gpio = s5pc100_ac97_cfg_gpio,
-};
-
-static u64 s5pc100_ac97_dmamask = DMA_BIT_MASK(32);
-
-struct platform_device s5pc100_device_ac97 = {
-       .name             = "samsung-ac97",
-       .id               = -1,
-       .num_resources    = ARRAY_SIZE(s5pc100_ac97_resource),
-       .resource         = s5pc100_ac97_resource,
-       .dev = {
-               .platform_data = &s3c_ac97_pdata,
-               .dma_mask = &s5pc100_ac97_dmamask,
-               .coherent_dma_mask = DMA_BIT_MASK(32),
-       },
-};
-
-/* S/PDIF Controller platform_device */
-static int s5pc100_spdif_cfg_gpd(struct platform_device *pdev)
-{
-       s3c_gpio_cfgpin_range(S5PC100_GPD(5), 2, S3C_GPIO_SFN(3));
-
-       return 0;
-}
-
-static int s5pc100_spdif_cfg_gpg3(struct platform_device *pdev)
-{
-       s3c_gpio_cfgpin_range(S5PC100_GPG3(5), 2, S3C_GPIO_SFN(3));
-
-       return 0;
-}
-
-static struct resource s5pc100_spdif_resource[] = {
-       [0] = DEFINE_RES_MEM(S5PC100_PA_SPDIF, SZ_256),
-       [1] = DEFINE_RES_DMA(DMACH_SPDIF),
-};
-
-static struct s3c_audio_pdata s5p_spdif_pdata = {
-       .cfg_gpio = s5pc100_spdif_cfg_gpd,
-};
-
-static u64 s5pc100_spdif_dmamask = DMA_BIT_MASK(32);
-
-struct platform_device s5pc100_device_spdif = {
-       .name           = "samsung-spdif",
-       .id             = -1,
-       .num_resources  = ARRAY_SIZE(s5pc100_spdif_resource),
-       .resource       = s5pc100_spdif_resource,
-       .dev = {
-               .platform_data = &s5p_spdif_pdata,
-               .dma_mask = &s5pc100_spdif_dmamask,
-               .coherent_dma_mask = DMA_BIT_MASK(32),
-       },
-};
-
-void __init s5pc100_spdif_setup_gpio(int gpio)
-{
-       if (gpio == S5PC100_SPDIF_GPD)
-               s5p_spdif_pdata.cfg_gpio = s5pc100_spdif_cfg_gpd;
-       else
-               s5p_spdif_pdata.cfg_gpio = s5pc100_spdif_cfg_gpg3;
-}
diff --git a/arch/arm/mach-s5pc100/dma.c b/arch/arm/mach-s5pc100/dma.c
deleted file mode 100644 (file)
index b141840..0000000
+++ /dev/null
@@ -1,130 +0,0 @@
-/* linux/arch/arm/mach-s5pc100/dma.c
- *
- * Copyright (c) 2011 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * Copyright (C) 2010 Samsung Electronics Co. Ltd.
- *     Jaswinder Singh <jassi.brar@samsung.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/dma-mapping.h>
-#include <linux/amba/bus.h>
-#include <linux/amba/pl330.h>
-
-#include <asm/irq.h>
-#include <plat/devs.h>
-#include <plat/irqs.h>
-
-#include <mach/map.h>
-#include <mach/irqs.h>
-#include <mach/dma.h>
-
-static u8 pdma0_peri[] = {
-       DMACH_UART0_RX,
-       DMACH_UART0_TX,
-       DMACH_UART1_RX,
-       DMACH_UART1_TX,
-       DMACH_UART2_RX,
-       DMACH_UART2_TX,
-       DMACH_UART3_RX,
-       DMACH_UART3_TX,
-       DMACH_IRDA,
-       DMACH_I2S0_RX,
-       DMACH_I2S0_TX,
-       DMACH_I2S0S_TX,
-       DMACH_I2S1_RX,
-       DMACH_I2S1_TX,
-       DMACH_I2S2_RX,
-       DMACH_I2S2_TX,
-       DMACH_SPI0_RX,
-       DMACH_SPI0_TX,
-       DMACH_SPI1_RX,
-       DMACH_SPI1_TX,
-       DMACH_SPI2_RX,
-       DMACH_SPI2_TX,
-       DMACH_AC97_MICIN,
-       DMACH_AC97_PCMIN,
-       DMACH_AC97_PCMOUT,
-       DMACH_EXTERNAL,
-       DMACH_PWM,
-       DMACH_SPDIF,
-       DMACH_HSI_RX,
-       DMACH_HSI_TX,
-};
-
-static struct dma_pl330_platdata s5pc100_pdma0_pdata = {
-       .nr_valid_peri = ARRAY_SIZE(pdma0_peri),
-       .peri_id = pdma0_peri,
-};
-
-static AMBA_AHB_DEVICE(s5pc100_pdma0,  "dma-pl330.0", 0x00041330,
-       S5PC100_PA_PDMA0, {IRQ_PDMA0}, &s5pc100_pdma0_pdata);
-
-static u8 pdma1_peri[] = {
-       DMACH_UART0_RX,
-       DMACH_UART0_TX,
-       DMACH_UART1_RX,
-       DMACH_UART1_TX,
-       DMACH_UART2_RX,
-       DMACH_UART2_TX,
-       DMACH_UART3_RX,
-       DMACH_UART3_TX,
-       DMACH_IRDA,
-       DMACH_I2S0_RX,
-       DMACH_I2S0_TX,
-       DMACH_I2S0S_TX,
-       DMACH_I2S1_RX,
-       DMACH_I2S1_TX,
-       DMACH_I2S2_RX,
-       DMACH_I2S2_TX,
-       DMACH_SPI0_RX,
-       DMACH_SPI0_TX,
-       DMACH_SPI1_RX,
-       DMACH_SPI1_TX,
-       DMACH_SPI2_RX,
-       DMACH_SPI2_TX,
-       DMACH_PCM0_RX,
-       DMACH_PCM0_TX,
-       DMACH_PCM1_RX,
-       DMACH_PCM1_TX,
-       DMACH_MSM_REQ0,
-       DMACH_MSM_REQ1,
-       DMACH_MSM_REQ2,
-       DMACH_MSM_REQ3,
-};
-
-static struct dma_pl330_platdata s5pc100_pdma1_pdata = {
-       .nr_valid_peri = ARRAY_SIZE(pdma1_peri),
-       .peri_id = pdma1_peri,
-};
-
-static AMBA_AHB_DEVICE(s5pc100_pdma1, "dma-pl330.1", 0x00041330,
-       S5PC100_PA_PDMA1, {IRQ_PDMA1}, &s5pc100_pdma1_pdata);
-
-static int __init s5pc100_dma_init(void)
-{
-       dma_cap_set(DMA_SLAVE, s5pc100_pdma0_pdata.cap_mask);
-       dma_cap_set(DMA_CYCLIC, s5pc100_pdma0_pdata.cap_mask);
-       amba_device_register(&s5pc100_pdma0_device, &iomem_resource);
-
-       dma_cap_set(DMA_SLAVE, s5pc100_pdma1_pdata.cap_mask);
-       dma_cap_set(DMA_CYCLIC, s5pc100_pdma1_pdata.cap_mask);
-       amba_device_register(&s5pc100_pdma1_device, &iomem_resource);
-
-       return 0;
-}
-arch_initcall(s5pc100_dma_init);
diff --git a/arch/arm/mach-s5pc100/include/mach/debug-macro.S b/arch/arm/mach-s5pc100/include/mach/debug-macro.S
deleted file mode 100644 (file)
index 22c2385..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-/* arch/arm/mach-s5pc100/include/mach/debug-macro.S
- *
- * Copyright 2009 Samsung Electronics Co.
- *     Byungho Min <bhmin@samsung.com>
- *
- *
- * Based on mach-s3c6400/include/mach/debug-macro.S
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-/* pull in the relevant register and map files. */
-
-#include <linux/serial_s3c.h>
-#include <mach/map.h>
-
-       /* note, for the boot process to work we have to keep the UART
-        * virtual address aligned to an 1MiB boundary for the L1
-        * mapping the head code makes. We keep the UART virtual address
-        * aligned and add in the offset when we load the value here.
-        */
-
-       .macro addruart, rp, rv, tmp
-               ldr     \rp, = S3C_PA_UART
-               ldr     \rv, = S3C_VA_UART
-#if CONFIG_DEBUG_S3C_UART != 0
-               add     \rp, \rp, #(0x400 * CONFIG_DEBUG_S3C_UART)
-               add     \rv, \rv, #(0x400 * CONFIG_DEBUG_S3C_UART)
-#endif
-       .endm
-
-/* include the reset of the code which will do the work, we're only
- * compiling for a single cpu processor type so the default of s3c2440
- * will be fine with us.
- */
-
-#include <debug/samsung.S>
diff --git a/arch/arm/mach-s5pc100/include/mach/dma.h b/arch/arm/mach-s5pc100/include/mach/dma.h
deleted file mode 100644 (file)
index 201842a..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2010 Samsung Electronics Co. Ltd.
- *     Jaswinder Singh <jassi.brar@samsung.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef __MACH_DMA_H
-#define __MACH_DMA_H
-
-/* This platform uses the common DMA API driver for PL330 */
-#include <plat/dma-pl330.h>
-
-#endif /* __MACH_DMA_H */
diff --git a/arch/arm/mach-s5pc100/include/mach/entry-macro.S b/arch/arm/mach-s5pc100/include/mach/entry-macro.S
deleted file mode 100644 (file)
index bad0700..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/* arch/arm/mach-s5pc100/include/mach/entry-macro.S
- *
- * Copyright 2009 Samsung Electronics Co.
- *     Byungho Min <bhmin@samsung.com>
- *
- * Based on mach-s3c6400/include/mach/entry-macro.S
- *
- * Low-level IRQ helper macros for the Samsung S5PC1XX series
- *
- * This file is licensed under  the terms of the GNU General Public
- * License version 2. This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
-*/
-
-       .macro  get_irqnr_preamble, base, tmp
-       .endm
-
-       .macro  get_irqnr_and_base, irqnr, irqstat, base, tmp
-       .endm
diff --git a/arch/arm/mach-s5pc100/include/mach/gpio.h b/arch/arm/mach-s5pc100/include/mach/gpio.h
deleted file mode 100644 (file)
index 5e1a924..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
-/* arch/arm/mach-s5pc100/include/mach/gpio.h
- *
- * Copyright 2009 Samsung Electronics Co.
- *     Byungho Min <bhmin@samsung.com>
- *
- * S5PC100 - GPIO lib support
- *
- * Base on mach-s3c6400/include/mach/gpio.h
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#ifndef __ASM_ARCH_GPIO_H
-#define __ASM_ARCH_GPIO_H __FILE__
-
-/* GPIO bank sizes */
-#define S5PC100_GPIO_A0_NR     (8)
-#define S5PC100_GPIO_A1_NR     (5)
-#define S5PC100_GPIO_B_NR      (8)
-#define S5PC100_GPIO_C_NR      (5)
-#define S5PC100_GPIO_D_NR      (7)
-#define S5PC100_GPIO_E0_NR     (8)
-#define S5PC100_GPIO_E1_NR     (6)
-#define S5PC100_GPIO_F0_NR     (8)
-#define S5PC100_GPIO_F1_NR     (8)
-#define S5PC100_GPIO_F2_NR     (8)
-#define S5PC100_GPIO_F3_NR     (4)
-#define S5PC100_GPIO_G0_NR     (8)
-#define S5PC100_GPIO_G1_NR     (3)
-#define S5PC100_GPIO_G2_NR     (7)
-#define S5PC100_GPIO_G3_NR     (7)
-#define S5PC100_GPIO_H0_NR     (8)
-#define S5PC100_GPIO_H1_NR     (8)
-#define S5PC100_GPIO_H2_NR     (8)
-#define S5PC100_GPIO_H3_NR     (8)
-#define S5PC100_GPIO_I_NR      (8)
-#define S5PC100_GPIO_J0_NR     (8)
-#define S5PC100_GPIO_J1_NR     (5)
-#define S5PC100_GPIO_J2_NR     (8)
-#define S5PC100_GPIO_J3_NR     (8)
-#define S5PC100_GPIO_J4_NR     (4)
-#define S5PC100_GPIO_K0_NR     (8)
-#define S5PC100_GPIO_K1_NR     (6)
-#define S5PC100_GPIO_K2_NR     (8)
-#define S5PC100_GPIO_K3_NR     (8)
-#define S5PC100_GPIO_L0_NR     (8)
-#define S5PC100_GPIO_L1_NR     (8)
-#define S5PC100_GPIO_L2_NR     (8)
-#define S5PC100_GPIO_L3_NR     (8)
-#define S5PC100_GPIO_L4_NR     (8)
-
-/* GPIO bank numbes */
-
-/* CONFIG_S3C_GPIO_SPACE allows the user to select extra
- * space for debugging purposes so that any accidental
- * change from one gpio bank to another can be caught.
-*/
-
-#define S5PC100_GPIO_NEXT(__gpio) \
-       ((__gpio##_START) + (__gpio##_NR) + CONFIG_S3C_GPIO_SPACE + 1)
-
-enum s5p_gpio_number {
-       S5PC100_GPIO_A0_START   = 0,
-       S5PC100_GPIO_A1_START   = S5PC100_GPIO_NEXT(S5PC100_GPIO_A0),
-       S5PC100_GPIO_B_START    = S5PC100_GPIO_NEXT(S5PC100_GPIO_A1),
-       S5PC100_GPIO_C_START    = S5PC100_GPIO_NEXT(S5PC100_GPIO_B),
-       S5PC100_GPIO_D_START    = S5PC100_GPIO_NEXT(S5PC100_GPIO_C),
-       S5PC100_GPIO_E0_START   = S5PC100_GPIO_NEXT(S5PC100_GPIO_D),
-       S5PC100_GPIO_E1_START   = S5PC100_GPIO_NEXT(S5PC100_GPIO_E0),
-       S5PC100_GPIO_F0_START   = S5PC100_GPIO_NEXT(S5PC100_GPIO_E1),
-       S5PC100_GPIO_F1_START   = S5PC100_GPIO_NEXT(S5PC100_GPIO_F0),
-       S5PC100_GPIO_F2_START   = S5PC100_GPIO_NEXT(S5PC100_GPIO_F1),
-       S5PC100_GPIO_F3_START   = S5PC100_GPIO_NEXT(S5PC100_GPIO_F2),
-       S5PC100_GPIO_G0_START   = S5PC100_GPIO_NEXT(S5PC100_GPIO_F3),
-       S5PC100_GPIO_G1_START   = S5PC100_GPIO_NEXT(S5PC100_GPIO_G0),
-       S5PC100_GPIO_G2_START   = S5PC100_GPIO_NEXT(S5PC100_GPIO_G1),
-       S5PC100_GPIO_G3_START   = S5PC100_GPIO_NEXT(S5PC100_GPIO_G2),
-       S5PC100_GPIO_H0_START   = S5PC100_GPIO_NEXT(S5PC100_GPIO_G3),
-       S5PC100_GPIO_H1_START   = S5PC100_GPIO_NEXT(S5PC100_GPIO_H0),
-       S5PC100_GPIO_H2_START   = S5PC100_GPIO_NEXT(S5PC100_GPIO_H1),
-       S5PC100_GPIO_H3_START   = S5PC100_GPIO_NEXT(S5PC100_GPIO_H2),
-       S5PC100_GPIO_I_START    = S5PC100_GPIO_NEXT(S5PC100_GPIO_H3),
-       S5PC100_GPIO_J0_START   = S5PC100_GPIO_NEXT(S5PC100_GPIO_I),
-       S5PC100_GPIO_J1_START   = S5PC100_GPIO_NEXT(S5PC100_GPIO_J0),
-       S5PC100_GPIO_J2_START   = S5PC100_GPIO_NEXT(S5PC100_GPIO_J1),
-       S5PC100_GPIO_J3_START   = S5PC100_GPIO_NEXT(S5PC100_GPIO_J2),
-       S5PC100_GPIO_J4_START   = S5PC100_GPIO_NEXT(S5PC100_GPIO_J3),
-       S5PC100_GPIO_K0_START   = S5PC100_GPIO_NEXT(S5PC100_GPIO_J4),
-       S5PC100_GPIO_K1_START   = S5PC100_GPIO_NEXT(S5PC100_GPIO_K0),
-       S5PC100_GPIO_K2_START   = S5PC100_GPIO_NEXT(S5PC100_GPIO_K1),
-       S5PC100_GPIO_K3_START   = S5PC100_GPIO_NEXT(S5PC100_GPIO_K2),
-       S5PC100_GPIO_L0_START   = S5PC100_GPIO_NEXT(S5PC100_GPIO_K3),
-       S5PC100_GPIO_L1_START   = S5PC100_GPIO_NEXT(S5PC100_GPIO_L0),
-       S5PC100_GPIO_L2_START   = S5PC100_GPIO_NEXT(S5PC100_GPIO_L1),
-       S5PC100_GPIO_L3_START   = S5PC100_GPIO_NEXT(S5PC100_GPIO_L2),
-       S5PC100_GPIO_L4_START   = S5PC100_GPIO_NEXT(S5PC100_GPIO_L3),
-       S5PC100_GPIO_END        = S5PC100_GPIO_NEXT(S5PC100_GPIO_L4),
-};
-
-/* S5PC100 GPIO number definitions. */
-#define S5PC100_GPA0(_nr)      (S5PC100_GPIO_A0_START + (_nr))
-#define S5PC100_GPA1(_nr)      (S5PC100_GPIO_A1_START + (_nr))
-#define S5PC100_GPB(_nr)       (S5PC100_GPIO_B_START + (_nr))
-#define S5PC100_GPC(_nr)       (S5PC100_GPIO_C_START + (_nr))
-#define S5PC100_GPD(_nr)       (S5PC100_GPIO_D_START + (_nr))
-#define S5PC100_GPE0(_nr)      (S5PC100_GPIO_E0_START + (_nr))
-#define S5PC100_GPE1(_nr)      (S5PC100_GPIO_E1_START + (_nr))
-#define S5PC100_GPF0(_nr)      (S5PC100_GPIO_F0_START + (_nr))
-#define S5PC100_GPF1(_nr)      (S5PC100_GPIO_F1_START + (_nr))
-#define S5PC100_GPF2(_nr)      (S5PC100_GPIO_F2_START + (_nr))
-#define S5PC100_GPF3(_nr)      (S5PC100_GPIO_F3_START + (_nr))
-#define S5PC100_GPG0(_nr)      (S5PC100_GPIO_G0_START + (_nr))
-#define S5PC100_GPG1(_nr)      (S5PC100_GPIO_G1_START + (_nr))
-#define S5PC100_GPG2(_nr)      (S5PC100_GPIO_G2_START + (_nr))
-#define S5PC100_GPG3(_nr)      (S5PC100_GPIO_G3_START + (_nr))
-#define S5PC100_GPH0(_nr)      (S5PC100_GPIO_H0_START + (_nr))
-#define S5PC100_GPH1(_nr)      (S5PC100_GPIO_H1_START + (_nr))
-#define S5PC100_GPH2(_nr)      (S5PC100_GPIO_H2_START + (_nr))
-#define S5PC100_GPH3(_nr)      (S5PC100_GPIO_H3_START + (_nr))
-#define S5PC100_GPI(_nr)       (S5PC100_GPIO_I_START + (_nr))
-#define S5PC100_GPJ0(_nr)      (S5PC100_GPIO_J0_START + (_nr))
-#define S5PC100_GPJ1(_nr)      (S5PC100_GPIO_J1_START + (_nr))
-#define S5PC100_GPJ2(_nr)      (S5PC100_GPIO_J2_START + (_nr))
-#define S5PC100_GPJ3(_nr)      (S5PC100_GPIO_J3_START + (_nr))
-#define S5PC100_GPJ4(_nr)      (S5PC100_GPIO_J4_START + (_nr))
-#define S5PC100_GPK0(_nr)      (S5PC100_GPIO_K0_START + (_nr))
-#define S5PC100_GPK1(_nr)      (S5PC100_GPIO_K1_START + (_nr))
-#define S5PC100_GPK2(_nr)      (S5PC100_GPIO_K2_START + (_nr))
-#define S5PC100_GPK3(_nr)      (S5PC100_GPIO_K3_START + (_nr))
-#define S5PC100_GPL0(_nr)      (S5PC100_GPIO_L0_START + (_nr))
-#define S5PC100_GPL1(_nr)      (S5PC100_GPIO_L1_START + (_nr))
-#define S5PC100_GPL2(_nr)      (S5PC100_GPIO_L2_START + (_nr))
-#define S5PC100_GPL3(_nr)      (S5PC100_GPIO_L3_START + (_nr))
-#define S5PC100_GPL4(_nr)      (S5PC100_GPIO_L4_START + (_nr))
-
-/* It used the end of the S5PC100 gpios */
-#define S3C_GPIO_END           S5PC100_GPIO_END
-
-/* define the number of gpios we need to the one after the MP04() range */
-#define ARCH_NR_GPIOS          (S5PC100_GPIO_END + 1)
-
-#endif /* __ASM_ARCH_GPIO_H */
diff --git a/arch/arm/mach-s5pc100/include/mach/hardware.h b/arch/arm/mach-s5pc100/include/mach/hardware.h
deleted file mode 100644 (file)
index 6b38618..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-/* linux/arch/arm/mach-s5pc100/include/mach/hardware.h
- *
- * Copyright 2009 Samsung Electronics Co.
- *      Byungho Min <bhmin@samsung.com>
- *
- * S5PC100 - Hardware support
- */
-
-#ifndef __ASM_ARCH_HARDWARE_H
-#define __ASM_ARCH_HARDWARE_H __FILE__
-
-/* currently nothing here, placeholder */
-
-#endif /* __ASM_ARCH_HARDWARE_H */
diff --git a/arch/arm/mach-s5pc100/include/mach/irqs.h b/arch/arm/mach-s5pc100/include/mach/irqs.h
deleted file mode 100644 (file)
index d2eb475..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-/* linux/arch/arm/mach-s5pc100/include/mach/irqs.h
- *
- * Copyright 2009 Samsung Electronics Co.
- *      Byungho Min <bhmin@samsung.com>
- *
- * S5PC100 - IRQ definitions
- */
-
-#ifndef __ASM_ARCH_IRQS_H
-#define __ASM_ARCH_IRQS_H __FILE__
-
-#include <plat/irqs.h>
-
-/* VIC0: system, DMA, timer */
-#define IRQ_EINT16_31          S5P_IRQ_VIC0(16)
-#define IRQ_BATF               S5P_IRQ_VIC0(17)
-#define IRQ_MDMA               S5P_IRQ_VIC0(18)
-#define IRQ_PDMA0              S5P_IRQ_VIC0(19)
-#define IRQ_PDMA1              S5P_IRQ_VIC0(20)
-#define IRQ_TIMER0_VIC         S5P_IRQ_VIC0(21)
-#define IRQ_TIMER1_VIC         S5P_IRQ_VIC0(22)
-#define IRQ_TIMER2_VIC         S5P_IRQ_VIC0(23)
-#define IRQ_TIMER3_VIC         S5P_IRQ_VIC0(24)
-#define IRQ_TIMER4_VIC         S5P_IRQ_VIC0(25)
-#define IRQ_SYSTIMER           S5P_IRQ_VIC0(26)
-#define IRQ_WDT                        S5P_IRQ_VIC0(27)
-#define IRQ_RTC_ALARM          S5P_IRQ_VIC0(28)
-#define IRQ_RTC_TIC            S5P_IRQ_VIC0(29)
-#define IRQ_GPIOINT            S5P_IRQ_VIC0(30)
-
-/* VIC1: ARM, power, memory, connectivity */
-#define IRQ_PMU                        S5P_IRQ_VIC1(0)
-#define IRQ_CORTEX1            S5P_IRQ_VIC1(1)
-#define IRQ_CORTEX2            S5P_IRQ_VIC1(2)
-#define IRQ_CORTEX3            S5P_IRQ_VIC1(3)
-#define IRQ_CORTEX4            S5P_IRQ_VIC1(4)
-#define IRQ_IEMAPC             S5P_IRQ_VIC1(5)
-#define IRQ_IEMIEC             S5P_IRQ_VIC1(6)
-#define IRQ_ONENAND            S5P_IRQ_VIC1(7)
-#define IRQ_NFC                        S5P_IRQ_VIC1(8)
-#define IRQ_CFCON              S5P_IRQ_VIC1(9)
-#define IRQ_UART0              S5P_IRQ_VIC1(10)
-#define IRQ_UART1              S5P_IRQ_VIC1(11)
-#define IRQ_UART2              S5P_IRQ_VIC1(12)
-#define IRQ_UART3              S5P_IRQ_VIC1(13)
-#define IRQ_IIC                        S5P_IRQ_VIC1(14)
-#define IRQ_SPI0               S5P_IRQ_VIC1(15)
-#define IRQ_SPI1               S5P_IRQ_VIC1(16)
-#define IRQ_SPI2               S5P_IRQ_VIC1(17)
-#define IRQ_IRDA               S5P_IRQ_VIC1(18)
-#define IRQ_IIC2               S5P_IRQ_VIC1(19)
-#define IRQ_IIC3               S5P_IRQ_VIC1(20)
-#define IRQ_HSIRX              S5P_IRQ_VIC1(21)
-#define IRQ_HSITX              S5P_IRQ_VIC1(22)
-#define IRQ_UHOST              S5P_IRQ_VIC1(23)
-#define IRQ_OTG                        S5P_IRQ_VIC1(24)
-#define IRQ_MSM                        S5P_IRQ_VIC1(25)
-#define IRQ_HSMMC0             S5P_IRQ_VIC1(26)
-#define IRQ_HSMMC1             S5P_IRQ_VIC1(27)
-#define IRQ_HSMMC2             S5P_IRQ_VIC1(28)
-#define IRQ_MIPICSI            S5P_IRQ_VIC1(29)
-#define IRQ_MIPIDSI            S5P_IRQ_VIC1(30)
-
-/* VIC2: multimedia, audio, security */
-#define IRQ_LCD0               S5P_IRQ_VIC2(0)
-#define IRQ_LCD1               S5P_IRQ_VIC2(1)
-#define IRQ_LCD2               S5P_IRQ_VIC2(2)
-#define IRQ_LCD3               S5P_IRQ_VIC2(3)
-#define IRQ_ROTATOR            S5P_IRQ_VIC2(4)
-#define IRQ_FIMC0              S5P_IRQ_VIC2(5)
-#define IRQ_FIMC1              S5P_IRQ_VIC2(6)
-#define IRQ_FIMC2              S5P_IRQ_VIC2(7)
-#define IRQ_JPEG               S5P_IRQ_VIC2(8)
-#define IRQ_2D                 S5P_IRQ_VIC2(9)
-#define IRQ_3D                 S5P_IRQ_VIC2(10)
-#define IRQ_MIXER              S5P_IRQ_VIC2(11)
-#define IRQ_HDMI               S5P_IRQ_VIC2(12)
-#define IRQ_IIC1               S5P_IRQ_VIC2(13)
-#define IRQ_MFC                        S5P_IRQ_VIC2(14)
-#define IRQ_TVENC              S5P_IRQ_VIC2(15)
-#define IRQ_I2S0               S5P_IRQ_VIC2(16)
-#define IRQ_I2S1               S5P_IRQ_VIC2(17)
-#define IRQ_I2S2               S5P_IRQ_VIC2(18)
-#define IRQ_AC97               S5P_IRQ_VIC2(19)
-#define IRQ_PCM0               S5P_IRQ_VIC2(20)
-#define IRQ_PCM1               S5P_IRQ_VIC2(21)
-#define IRQ_SPDIF              S5P_IRQ_VIC2(22)
-#define IRQ_ADC                        S5P_IRQ_VIC2(23)
-#define IRQ_PENDN              S5P_IRQ_VIC2(24)
-#define IRQ_TC                 IRQ_PENDN
-#define IRQ_KEYPAD             S5P_IRQ_VIC2(25)
-#define IRQ_CG                 S5P_IRQ_VIC2(26)
-#define IRQ_SEC                        S5P_IRQ_VIC2(27)
-#define IRQ_SECRX              S5P_IRQ_VIC2(28)
-#define IRQ_SECTX              S5P_IRQ_VIC2(29)
-#define IRQ_SDMIRQ             S5P_IRQ_VIC2(30)
-#define IRQ_SDMFIQ             S5P_IRQ_VIC2(31)
-#define IRQ_VIC_END            S5P_IRQ_VIC2(31)
-
-#define S5P_EINT_BASE1         (S5P_IRQ_VIC0(0))
-#define S5P_EINT_BASE2         (IRQ_VIC_END + 1)
-
-/* GPIO interrupt */
-#define S5P_GPIOINT_BASE       (IRQ_EINT(31) + 1)
-#define S5P_GPIOINT_GROUP_MAXNR        21
-
-/* Set the default NR_IRQS */
-#define NR_IRQS                        (IRQ_EINT(31) + S5P_GPIOINT_COUNT + 1)
-
-/* Compatibility */
-#define IRQ_LCD_FIFO           IRQ_LCD0
-#define IRQ_LCD_VSYNC          IRQ_LCD1
-#define IRQ_LCD_SYSTEM         IRQ_LCD2
-
-#endif /* __ASM_ARCH_IRQS_H */
diff --git a/arch/arm/mach-s5pc100/include/mach/map.h b/arch/arm/mach-s5pc100/include/mach/map.h
deleted file mode 100644 (file)
index 2550b61..0000000
+++ /dev/null
@@ -1,137 +0,0 @@
-/* linux/arch/arm/mach-s5pc100/include/mach/map.h
- *
- * Copyright (c) 2011 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com/
- *
- * Copyright 2009 Samsung Electronics Co.
- *     Byungho Min <bhmin@samsung.com>
- *
- * S5PC100 - Memory map definitions
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#ifndef __ASM_ARCH_MAP_H
-#define __ASM_ARCH_MAP_H __FILE__
-
-#include <plat/map-base.h>
-#include <plat/map-s5p.h>
-
-#define S5PC100_PA_SDRAM               0x20000000
-
-#define S5PC100_PA_ONENAND             0xE7100000
-#define S5PC100_PA_ONENAND_BUF         0xB0000000
-
-#define S5PC100_PA_CHIPID              0xE0000000
-
-#define S5PC100_PA_SYSCON              0xE0100000
-
-#define S5PC100_PA_OTHERS              0xE0200000
-
-#define S5PC100_PA_GPIO                        0xE0300000
-
-#define S5PC100_PA_VIC0                        0xE4000000
-#define S5PC100_PA_VIC1                        0xE4100000
-#define S5PC100_PA_VIC2                        0xE4200000
-
-#define S5PC100_PA_SROMC               0xE7000000
-
-#define S5PC100_PA_CFCON               0xE7800000
-
-#define S5PC100_PA_MDMA                        0xE8100000
-#define S5PC100_PA_PDMA0               0xE9000000
-#define S5PC100_PA_PDMA1               0xE9200000
-
-#define S5PC100_PA_TIMER               0xEA000000
-#define S5PC100_PA_SYSTIMER            0xEA100000
-#define S5PC100_PA_WATCHDOG            0xEA200000
-#define S5PC100_PA_RTC                 0xEA300000
-
-#define S5PC100_PA_UART                        0xEC000000
-
-#define S5PC100_PA_IIC0                        0xEC100000
-#define S5PC100_PA_IIC1                        0xEC200000
-
-#define S5PC100_PA_SPI0                        0xEC300000
-#define S5PC100_PA_SPI1                        0xEC400000
-#define S5PC100_PA_SPI2                        0xEC500000
-
-#define S5PC100_PA_USB_HSOTG           0xED200000
-#define S5PC100_PA_USB_HSPHY           0xED300000
-
-#define S5PC100_PA_HSMMC(x)            (0xED800000 + ((x) * 0x100000))
-
-#define S5PC100_PA_FB                  0xEE000000
-
-#define S5PC100_PA_FIMC0               0xEE200000
-#define S5PC100_PA_FIMC1               0xEE300000
-#define S5PC100_PA_FIMC2               0xEE400000
-
-#define S5PC100_PA_I2S0                        0xF2000000
-#define S5PC100_PA_I2S1                        0xF2100000
-#define S5PC100_PA_I2S2                        0xF2200000
-
-#define S5PC100_PA_AC97                        0xF2300000
-
-#define S5PC100_PA_PCM0                        0xF2400000
-#define S5PC100_PA_PCM1                        0xF2500000
-
-#define S5PC100_PA_SPDIF               0xF2600000
-
-#define S5PC100_PA_TSADC               0xF3000000
-
-#define S5PC100_PA_KEYPAD              0xF3100000
-
-/* Compatibiltiy Defines */
-
-#define S3C_PA_FB                      S5PC100_PA_FB
-#define S3C_PA_HSMMC0                  S5PC100_PA_HSMMC(0)
-#define S3C_PA_HSMMC1                  S5PC100_PA_HSMMC(1)
-#define S3C_PA_HSMMC2                  S5PC100_PA_HSMMC(2)
-#define S3C_PA_IIC                     S5PC100_PA_IIC0
-#define S3C_PA_IIC1                    S5PC100_PA_IIC1
-#define S3C_PA_KEYPAD                  S5PC100_PA_KEYPAD
-#define S3C_PA_ONENAND                 S5PC100_PA_ONENAND
-#define S3C_PA_ONENAND_BUF             S5PC100_PA_ONENAND_BUF
-#define S3C_PA_RTC                     S5PC100_PA_RTC
-#define S3C_PA_TSADC                   S5PC100_PA_TSADC
-#define S3C_PA_USB_HSOTG               S5PC100_PA_USB_HSOTG
-#define S3C_PA_USB_HSPHY               S5PC100_PA_USB_HSPHY
-#define S3C_PA_WDT                     S5PC100_PA_WATCHDOG
-#define S3C_PA_SPI0                    S5PC100_PA_SPI0
-#define S3C_PA_SPI1                    S5PC100_PA_SPI1
-#define S3C_PA_SPI2                    S5PC100_PA_SPI2
-
-#define S5P_PA_CHIPID                  S5PC100_PA_CHIPID
-#define S5P_PA_FIMC0                   S5PC100_PA_FIMC0
-#define S5P_PA_FIMC1                   S5PC100_PA_FIMC1
-#define S5P_PA_FIMC2                   S5PC100_PA_FIMC2
-#define S5P_PA_SDRAM                   S5PC100_PA_SDRAM
-#define S5P_PA_SROMC                   S5PC100_PA_SROMC
-#define S5P_PA_SYSCON                  S5PC100_PA_SYSCON
-#define S5P_PA_TIMER                   S5PC100_PA_TIMER
-
-#define SAMSUNG_PA_ADC                 S5PC100_PA_TSADC
-#define SAMSUNG_PA_CFCON               S5PC100_PA_CFCON
-#define SAMSUNG_PA_KEYPAD              S5PC100_PA_KEYPAD
-#define SAMSUNG_PA_TIMER               S5PC100_PA_TIMER
-
-#define S5PC100_VA_OTHERS              (S3C_VA_SYS + 0x10000)
-
-#define S3C_SZ_ONENAND_BUF             (SZ_256M - SZ_32M)
-
-/* UART */
-
-#define S3C_PA_UART                    S5PC100_PA_UART
-
-#define S5P_PA_UART(x)                 (S3C_PA_UART + ((x) * S3C_UART_OFFSET))
-#define S5P_PA_UART0                   S5P_PA_UART(0)
-#define S5P_PA_UART1                   S5P_PA_UART(1)
-#define S5P_PA_UART2                   S5P_PA_UART(2)
-#define S5P_PA_UART3                   S5P_PA_UART(3)
-
-#define S5P_SZ_UART                    SZ_256
-
-#endif /* __ASM_ARCH_MAP_H */
diff --git a/arch/arm/mach-s5pc100/include/mach/regs-clock.h b/arch/arm/mach-s5pc100/include/mach/regs-clock.h
deleted file mode 100644 (file)
index bc92da2..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-/* linux/arch/arm/mach-s5pc100/include/mach/regs-clock.h
- *
- * Copyright (c) 2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com/
- *
- * S5PC100 - Clock register definitions
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#ifndef __ASM_ARCH_REGS_CLOCK_H
-#define __ASM_ARCH_REGS_CLOCK_H __FILE__
-
-#include <mach/map.h>
-
-#define S5P_CLKREG(x)          (S3C_VA_SYS + (x))
-
-#define S5PC100_REG_OTHERS(x)  (S5PC100_VA_OTHERS + (x))
-
-#define S5P_APLL_LOCK          S5P_CLKREG(0x00)
-#define S5P_MPLL_LOCK          S5P_CLKREG(0x04)
-#define S5P_EPLL_LOCK          S5P_CLKREG(0x08)
-#define S5P_HPLL_LOCK          S5P_CLKREG(0x0C)
-
-#define S5P_APLL_CON           S5P_CLKREG(0x100)
-#define S5P_MPLL_CON           S5P_CLKREG(0x104)
-#define S5P_EPLL_CON           S5P_CLKREG(0x108)
-#define S5P_HPLL_CON           S5P_CLKREG(0x10C)
-
-#define S5P_CLK_SRC0           S5P_CLKREG(0x200)
-#define S5P_CLK_SRC1           S5P_CLKREG(0x204)
-#define S5P_CLK_SRC2           S5P_CLKREG(0x208)
-#define S5P_CLK_SRC3           S5P_CLKREG(0x20C)
-
-#define S5P_CLK_DIV0           S5P_CLKREG(0x300)
-#define S5P_CLK_DIV1           S5P_CLKREG(0x304)
-#define S5P_CLK_DIV2           S5P_CLKREG(0x308)
-#define S5P_CLK_DIV3           S5P_CLKREG(0x30C)
-#define S5P_CLK_DIV4           S5P_CLKREG(0x310)
-
-#define S5P_CLK_OUT            S5P_CLKREG(0x400)
-
-#define S5P_CLKGATE_D00                S5P_CLKREG(0x500)
-#define S5P_CLKGATE_D01                S5P_CLKREG(0x504)
-#define S5P_CLKGATE_D02                S5P_CLKREG(0x508)
-
-#define S5P_CLKGATE_D10                S5P_CLKREG(0x520)
-#define S5P_CLKGATE_D11                S5P_CLKREG(0x524)
-#define S5P_CLKGATE_D12                S5P_CLKREG(0x528)
-#define S5P_CLKGATE_D13                S5P_CLKREG(0x52C)
-#define S5P_CLKGATE_D14                S5P_CLKREG(0x530)
-#define S5P_CLKGATE_D15                S5P_CLKREG(0x534)
-
-#define S5P_CLKGATE_D20                S5P_CLKREG(0x540)
-
-#define S5P_CLKGATE_SCLK0      S5P_CLKREG(0x560)
-#define S5P_CLKGATE_SCLK1      S5P_CLKREG(0x564)
-
-/* CLKDIV0 */
-#define S5P_CLKDIV0_D0_MASK            (0x7<<8)
-#define S5P_CLKDIV0_D0_SHIFT           (8)
-#define S5P_CLKDIV0_PCLKD0_MASK                (0x7<<12)
-#define S5P_CLKDIV0_PCLKD0_SHIFT       (12)
-
-/* CLKDIV1 */
-#define S5P_CLKDIV1_D1_MASK            (0x7<<12)
-#define S5P_CLKDIV1_D1_SHIFT           (12)
-#define S5P_CLKDIV1_PCLKD1_MASK                (0x7<<16)
-#define S5P_CLKDIV1_PCLKD1_SHIFT       (16)
-
-#define S5PC100_SWRESET                S5PC100_REG_OTHERS(0x000)
-#define S5PC100_MEM_SYS_CFG    S5PC100_REG_OTHERS(0x200)
-
-#define S5PC100_SWRESET_RESETVAL       0xc100
-
-#define MEM_SYS_CFG_EBI_FIX_PRI_CFCON  0x30
-
-#endif /* __ASM_ARCH_REGS_CLOCK_H */
diff --git a/arch/arm/mach-s5pc100/include/mach/regs-gpio.h b/arch/arm/mach-s5pc100/include/mach/regs-gpio.h
deleted file mode 100644 (file)
index 0bf7320..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/* linux/arch/arm/plat-s5pc100/include/plat/regs-gpio.h
- *
- * Copyright 2009 Samsung Electronics Co.
- *      Byungho Min <bhmin@samsung.com>
- *
- * S5PC100 - GPIO register definitions
- */
-
-#ifndef __ASM_MACH_S5PC100_REGS_GPIO_H
-#define __ASM_MACH_S5PC100_REGS_GPIO_H __FILE__
-
-#include <mach/map.h>
-
-#define S5PC100EINT30CON               (S5P_VA_GPIO + 0xE00)
-#define S5P_EINT_CON(x)                        (S5PC100EINT30CON + ((x) * 0x4))
-
-#define S5PC100EINT30FLTCON0           (S5P_VA_GPIO + 0xE80)
-#define S5P_EINT_FLTCON(x)             (S5PC100EINT30FLTCON0 + ((x) * 0x4))
-
-#define S5PC100EINT30MASK              (S5P_VA_GPIO + 0xF00)
-#define S5P_EINT_MASK(x)               (S5PC100EINT30MASK + ((x) * 0x4))
-
-#define S5PC100EINT30PEND              (S5P_VA_GPIO + 0xF40)
-#define S5P_EINT_PEND(x)               (S5PC100EINT30PEND + ((x) * 0x4))
-
-#define EINT_REG_NR(x)                 (EINT_OFFSET(x) >> 3)
-
-#define eint_irq_to_bit(irq)           (1 << (EINT_OFFSET(irq) & 0x7))
-
-#define EINT_MODE              S3C_GPIO_SFN(0x2)
-
-#define EINT_GPIO_0(x)         S5PC100_GPH0(x)
-#define EINT_GPIO_1(x)         S5PC100_GPH1(x)
-#define EINT_GPIO_2(x)         S5PC100_GPH2(x)
-#define EINT_GPIO_3(x)         S5PC100_GPH3(x)
-
-#endif /* __ASM_MACH_S5PC100_REGS_GPIO_H */
-
diff --git a/arch/arm/mach-s5pc100/include/mach/regs-irq.h b/arch/arm/mach-s5pc100/include/mach/regs-irq.h
deleted file mode 100644 (file)
index 7616278..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-/* linux/arch/arm/mach-s5pc100/include/mach/regs-irq.h
- *
- * Copyright 2009 Samsung Electronics Co.
- *     Byungho Min <bhmin@samsung.com>
- *
- * S5PC100 - IRQ register definitions
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#ifndef __ASM_ARCH_REGS_IRQ_H
-#define __ASM_ARCH_REGS_IRQ_H __FILE__
-
-#include <mach/map.h>
-
-#endif /* __ASM_ARCH_REGS_IRQ_H */
diff --git a/arch/arm/mach-s5pc100/mach-smdkc100.c b/arch/arm/mach-s5pc100/mach-smdkc100.c
deleted file mode 100644 (file)
index 668af3a..0000000
+++ /dev/null
@@ -1,264 +0,0 @@
-/* linux/arch/arm/mach-s5pc100/mach-smdkc100.c
- *
- * Copyright 2009 Samsung Electronics Co.
- * Author: Byungho Min <bhmin@samsung.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
-*/
-
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/interrupt.h>
-#include <linux/list.h>
-#include <linux/timer.h>
-#include <linux/init.h>
-#include <linux/serial_core.h>
-#include <linux/serial_s3c.h>
-#include <linux/platform_device.h>
-#include <linux/io.h>
-#include <linux/gpio.h>
-#include <linux/i2c.h>
-#include <linux/fb.h>
-#include <linux/delay.h>
-#include <linux/input.h>
-#include <linux/pwm_backlight.h>
-
-#include <asm/mach/arch.h>
-#include <asm/mach/map.h>
-
-#include <mach/map.h>
-#include <mach/regs-gpio.h>
-
-#include <video/platform_lcd.h>
-#include <video/samsung_fimd.h>
-
-#include <asm/irq.h>
-#include <asm/mach-types.h>
-
-#include <plat/gpio-cfg.h>
-
-#include <plat/clock.h>
-#include <plat/devs.h>
-#include <plat/cpu.h>
-#include <plat/fb.h>
-#include <linux/platform_data/i2c-s3c2410.h>
-#include <linux/platform_data/ata-samsung_cf.h>
-#include <plat/adc.h>
-#include <plat/keypad.h>
-#include <linux/platform_data/touchscreen-s3c2410.h>
-#include <linux/platform_data/asoc-s3c.h>
-#include <plat/backlight.h>
-#include <plat/samsung-time.h>
-
-#include "common.h"
-
-/* Following are default values for UCON, ULCON and UFCON UART registers */
-#define SMDKC100_UCON_DEFAULT  (S3C2410_UCON_TXILEVEL |        \
-                                S3C2410_UCON_RXILEVEL |        \
-                                S3C2410_UCON_TXIRQMODE |       \
-                                S3C2410_UCON_RXIRQMODE |       \
-                                S3C2410_UCON_RXFIFO_TOI |      \
-                                S3C2443_UCON_RXERR_IRQEN)
-
-#define SMDKC100_ULCON_DEFAULT S3C2410_LCON_CS8
-
-#define SMDKC100_UFCON_DEFAULT (S3C2410_UFCON_FIFOMODE |       \
-                                S3C2440_UFCON_RXTRIG8 |        \
-                                S3C2440_UFCON_TXTRIG16)
-
-static struct s3c2410_uartcfg smdkc100_uartcfgs[] __initdata = {
-       [0] = {
-               .hwport      = 0,
-               .flags       = 0,
-               .ucon        = SMDKC100_UCON_DEFAULT,
-               .ulcon       = SMDKC100_ULCON_DEFAULT,
-               .ufcon       = SMDKC100_UFCON_DEFAULT,
-       },
-       [1] = {
-               .hwport      = 1,
-               .flags       = 0,
-               .ucon        = SMDKC100_UCON_DEFAULT,
-               .ulcon       = SMDKC100_ULCON_DEFAULT,
-               .ufcon       = SMDKC100_UFCON_DEFAULT,
-       },
-       [2] = {
-               .hwport      = 2,
-               .flags       = 0,
-               .ucon        = SMDKC100_UCON_DEFAULT,
-               .ulcon       = SMDKC100_ULCON_DEFAULT,
-               .ufcon       = SMDKC100_UFCON_DEFAULT,
-       },
-       [3] = {
-               .hwport      = 3,
-               .flags       = 0,
-               .ucon        = SMDKC100_UCON_DEFAULT,
-               .ulcon       = SMDKC100_ULCON_DEFAULT,
-               .ufcon       = SMDKC100_UFCON_DEFAULT,
-       },
-};
-
-/* I2C0 */
-static struct i2c_board_info i2c_devs0[] __initdata = {
-       {I2C_BOARD_INFO("wm8580", 0x1b),},
-};
-
-/* I2C1 */
-static struct i2c_board_info i2c_devs1[] __initdata = {
-};
-
-/* LCD power controller */
-static void smdkc100_lcd_power_set(struct plat_lcd_data *pd,
-                                  unsigned int power)
-{
-       if (power) {
-               /* module reset */
-               gpio_direction_output(S5PC100_GPH0(6), 1);
-               mdelay(100);
-               gpio_direction_output(S5PC100_GPH0(6), 0);
-               mdelay(10);
-               gpio_direction_output(S5PC100_GPH0(6), 1);
-               mdelay(10);
-       }
-}
-
-static struct plat_lcd_data smdkc100_lcd_power_data = {
-       .set_power      = smdkc100_lcd_power_set,
-};
-
-static struct platform_device smdkc100_lcd_powerdev = {
-       .name                   = "platform-lcd",
-       .dev.parent             = &s3c_device_fb.dev,
-       .dev.platform_data      = &smdkc100_lcd_power_data,
-};
-
-/* Frame Buffer */
-static struct s3c_fb_pd_win smdkc100_fb_win0 = {
-       .max_bpp        = 32,
-       .default_bpp    = 16,
-       .xres           = 800,
-       .yres           = 480,
-};
-
-static struct fb_videomode smdkc100_lcd_timing = {
-       .left_margin    = 8,
-       .right_margin   = 13,
-       .upper_margin   = 7,
-       .lower_margin   = 5,
-       .hsync_len      = 3,
-       .vsync_len      = 1,
-       .xres           = 800,
-       .yres           = 480,
-       .refresh        = 80,
-};
-
-static struct s3c_fb_platdata smdkc100_lcd_pdata __initdata = {
-       .win[0]         = &smdkc100_fb_win0,
-       .vtiming        = &smdkc100_lcd_timing,
-       .vidcon0        = VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB,
-       .vidcon1        = VIDCON1_INV_HSYNC | VIDCON1_INV_VSYNC,
-       .setup_gpio     = s5pc100_fb_gpio_setup_24bpp,
-};
-
-static struct s3c_ide_platdata smdkc100_ide_pdata __initdata = {
-       .setup_gpio     = s5pc100_ide_setup_gpio,
-};
-
-static uint32_t smdkc100_keymap[] __initdata = {
-       /* KEY(row, col, keycode) */
-       KEY(0, 3, KEY_1), KEY(0, 4, KEY_2), KEY(0, 5, KEY_3),
-       KEY(0, 6, KEY_4), KEY(0, 7, KEY_5),
-       KEY(1, 3, KEY_A), KEY(1, 4, KEY_B), KEY(1, 5, KEY_C),
-       KEY(1, 6, KEY_D), KEY(1, 7, KEY_E)
-};
-
-static struct matrix_keymap_data smdkc100_keymap_data __initdata = {
-       .keymap         = smdkc100_keymap,
-       .keymap_size    = ARRAY_SIZE(smdkc100_keymap),
-};
-
-static struct samsung_keypad_platdata smdkc100_keypad_data __initdata = {
-       .keymap_data    = &smdkc100_keymap_data,
-       .rows           = 2,
-       .cols           = 8,
-};
-
-static struct platform_device *smdkc100_devices[] __initdata = {
-       &s3c_device_adc,
-       &s3c_device_cfcon,
-       &s3c_device_i2c0,
-       &s3c_device_i2c1,
-       &s3c_device_fb,
-       &s3c_device_hsmmc0,
-       &s3c_device_hsmmc1,
-       &s3c_device_hsmmc2,
-       &samsung_device_pwm,
-       &s3c_device_ts,
-       &s3c_device_wdt,
-       &smdkc100_lcd_powerdev,
-       &s5pc100_device_iis0,
-       &samsung_device_keypad,
-       &s5pc100_device_ac97,
-       &s3c_device_rtc,
-       &s5p_device_fimc0,
-       &s5p_device_fimc1,
-       &s5p_device_fimc2,
-       &s5pc100_device_spdif,
-};
-
-/* LCD Backlight data */
-static struct samsung_bl_gpio_info smdkc100_bl_gpio_info = {
-       .no = S5PC100_GPD(0),
-       .func = S3C_GPIO_SFN(2),
-};
-
-static struct platform_pwm_backlight_data smdkc100_bl_data = {
-       .pwm_id = 0,
-       .enable_gpio = -1,
-};
-
-static void __init smdkc100_map_io(void)
-{
-       s5pc100_init_io(NULL, 0);
-       s3c24xx_init_clocks(12000000);
-       s3c24xx_init_uarts(smdkc100_uartcfgs, ARRAY_SIZE(smdkc100_uartcfgs));
-       samsung_set_timer_source(SAMSUNG_PWM3, SAMSUNG_PWM4);
-}
-
-static void __init smdkc100_machine_init(void)
-{
-       s3c24xx_ts_set_platdata(NULL);
-
-       /* I2C */
-       s3c_i2c0_set_platdata(NULL);
-       s3c_i2c1_set_platdata(NULL);
-       i2c_register_board_info(0, i2c_devs0, ARRAY_SIZE(i2c_devs0));
-       i2c_register_board_info(1, i2c_devs1, ARRAY_SIZE(i2c_devs1));
-
-       s3c_fb_set_platdata(&smdkc100_lcd_pdata);
-       s3c_ide_set_platdata(&smdkc100_ide_pdata);
-
-       samsung_keypad_set_platdata(&smdkc100_keypad_data);
-
-       s5pc100_spdif_setup_gpio(S5PC100_SPDIF_GPD);
-
-       /* LCD init */
-       gpio_request(S5PC100_GPH0(6), "GPH0");
-       smdkc100_lcd_power_set(&smdkc100_lcd_power_data, 0);
-
-       platform_add_devices(smdkc100_devices, ARRAY_SIZE(smdkc100_devices));
-
-       samsung_bl_set(&smdkc100_bl_gpio_info, &smdkc100_bl_data);
-}
-
-MACHINE_START(SMDKC100, "SMDKC100")
-       /* Maintainer: Byungho Min <bhmin@samsung.com> */
-       .atag_offset    = 0x100,
-       .init_irq       = s5pc100_init_irq,
-       .map_io         = smdkc100_map_io,
-       .init_machine   = smdkc100_machine_init,
-       .init_time      = samsung_timer_init,
-       .restart        = s5pc100_restart,
-MACHINE_END
diff --git a/arch/arm/mach-s5pc100/setup-fb-24bpp.c b/arch/arm/mach-s5pc100/setup-fb-24bpp.c
deleted file mode 100644 (file)
index 8978e4c..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * linux/arch/arm/mach-s5pc100/setup-fb-24bpp.c
- *
- * Copyright 2009 Samsung Electronics
- *
- * Base S5PC100 setup information for 24bpp LCD framebuffer
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/fb.h>
-#include <linux/gpio.h>
-
-#include <mach/map.h>
-#include <plat/fb.h>
-#include <plat/gpio-cfg.h>
-
-#define DISR_OFFSET    0x7008
-
-static void s5pc100_fb_setgpios(unsigned int base, unsigned int nr)
-{
-       s3c_gpio_cfgrange_nopull(base, nr, S3C_GPIO_SFN(2));
-}
-
-void s5pc100_fb_gpio_setup_24bpp(void)
-{
-       s5pc100_fb_setgpios(S5PC100_GPF0(0), 8);
-       s5pc100_fb_setgpios(S5PC100_GPF1(0), 8);
-       s5pc100_fb_setgpios(S5PC100_GPF2(0), 8);
-       s5pc100_fb_setgpios(S5PC100_GPF3(0), 4);
-}
diff --git a/arch/arm/mach-s5pc100/setup-i2c0.c b/arch/arm/mach-s5pc100/setup-i2c0.c
deleted file mode 100644 (file)
index 89a6a76..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-/* linux/arch/arm/mach-s5pc100/setup-i2c0.c
- *
- * Copyright 2009 Samsung Electronics Co.
- *     Byungho Min <bhmin@samsung.com>
- *
- * Base S5PC100 I2C bus 0 gpio configuration
- *
- * Based on plat-s3c64xx/setup-i2c0.c
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#include <linux/kernel.h>
-#include <linux/types.h>
-
-struct platform_device; /* don't need the contents */
-
-#include <linux/gpio.h>
-#include <linux/platform_data/i2c-s3c2410.h>
-#include <plat/gpio-cfg.h>
-
-void s3c_i2c0_cfg_gpio(struct platform_device *dev)
-{
-       s3c_gpio_cfgall_range(S5PC100_GPD(3), 2,
-                             S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP);
-}
diff --git a/arch/arm/mach-s5pc100/setup-i2c1.c b/arch/arm/mach-s5pc100/setup-i2c1.c
deleted file mode 100644 (file)
index faa667e..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-/* linux/arch/arm/mach-s5pc100/setup-i2c1.c
- *
- * Copyright 2009 Samsung Electronics Co.
- *     Byungho Min <bhmin@samsung.com>
- *
- * Base S5PC100 I2C bus 1 gpio configuration
- *
- * Based on plat-s3c64xx/setup-i2c1.c
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#include <linux/kernel.h>
-#include <linux/types.h>
-
-struct platform_device; /* don't need the contents */
-
-#include <linux/gpio.h>
-#include <linux/platform_data/i2c-s3c2410.h>
-#include <plat/gpio-cfg.h>
-
-void s3c_i2c1_cfg_gpio(struct platform_device *dev)
-{
-       s3c_gpio_cfgall_range(S5PC100_GPD(5), 2,
-                             S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP);
-}
diff --git a/arch/arm/mach-s5pc100/setup-ide.c b/arch/arm/mach-s5pc100/setup-ide.c
deleted file mode 100644 (file)
index 223aae0..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-/* linux/arch/arm/mach-s5pc100/setup-ide.c
- *
- * Copyright (c) 2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * S5PC100 setup information for IDE
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#include <linux/kernel.h>
-#include <linux/gpio.h>
-#include <linux/io.h>
-
-#include <mach/regs-clock.h>
-#include <plat/gpio-cfg.h>
-
-static void s5pc100_ide_cfg_gpios(unsigned int base, unsigned int nr)
-{
-       s3c_gpio_cfgrange_nopull(base, nr, S3C_GPIO_SFN(4));
-
-       for (; nr > 0; nr--, base++)
-               s5p_gpio_set_drvstr(base, S5P_GPIO_DRVSTR_LV4);
-}
-
-void s5pc100_ide_setup_gpio(void)
-{
-       u32 reg;
-
-       /* Independent CF interface, CF chip select configuration */
-       reg = readl(S5PC100_MEM_SYS_CFG) & (~0x3f);
-       writel(reg | MEM_SYS_CFG_EBI_FIX_PRI_CFCON, S5PC100_MEM_SYS_CFG);
-
-       /* CF_Add[0 - 2], CF_IORDY, CF_INTRQ, CF_DMARQ, CF_DMARST, CF_DMACK */
-       s5pc100_ide_cfg_gpios(S5PC100_GPJ0(0), 8);
-
-       /*CF_Data[0 - 7] */
-       s5pc100_ide_cfg_gpios(S5PC100_GPJ2(0), 8);
-
-       /* CF_Data[8 - 15] */
-       s5pc100_ide_cfg_gpios(S5PC100_GPJ3(0), 8);
-
-       /* CF_CS0, CF_CS1, CF_IORD, CF_IOWR */
-       s5pc100_ide_cfg_gpios(S5PC100_GPJ4(0), 4);
-
-       /* EBI_OE, EBI_WE */
-       s3c_gpio_cfgpin_range(S5PC100_GPK0(6), 2, S3C_GPIO_SFN(0));
-
-       /* CF_OE, CF_WE */
-       s3c_gpio_cfgrange_nopull(S5PC100_GPK1(6), 8, S3C_GPIO_SFN(2));
-
-       /* CF_CD */
-       s3c_gpio_cfgpin(S5PC100_GPK3(5), S3C_GPIO_SFN(2));
-       s3c_gpio_setpull(S5PC100_GPK3(5), S3C_GPIO_PULL_NONE);
-}
diff --git a/arch/arm/mach-s5pc100/setup-keypad.c b/arch/arm/mach-s5pc100/setup-keypad.c
deleted file mode 100644 (file)
index ada377f..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* linux/arch/arm/mach-s5pc100/setup-keypad.c
- *
- * Copyright (c) 2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com/
- *
- * GPIO configuration for S5PC100 KeyPad device
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#include <linux/gpio.h>
-#include <plat/gpio-cfg.h>
-
-void samsung_keypad_cfg_gpio(unsigned int rows, unsigned int cols)
-{
-       /* Set all the necessary GPH3 pins to special-function 3: KP_ROW[x] */
-       s3c_gpio_cfgrange_nopull(S5PC100_GPH3(0), rows, S3C_GPIO_SFN(3));
-
-       /* Set all the necessary GPH2 pins to special-function 3: KP_COL[x] */
-       s3c_gpio_cfgrange_nopull(S5PC100_GPH2(0), cols, S3C_GPIO_SFN(3));
-}
diff --git a/arch/arm/mach-s5pc100/setup-sdhci-gpio.c b/arch/arm/mach-s5pc100/setup-sdhci-gpio.c
deleted file mode 100644 (file)
index 6010c03..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-/* linux/arch/arm/plat-s5pc100/setup-sdhci-gpio.c
- *
- * Copyright 2009 Samsung Eletronics
- *
- * S5PC100 - Helper functions for setting up SDHCI device(s) GPIO (HSMMC)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/interrupt.h>
-#include <linux/platform_device.h>
-#include <linux/io.h>
-#include <linux/gpio.h>
-#include <linux/mmc/host.h>
-#include <linux/mmc/card.h>
-
-#include <plat/gpio-cfg.h>
-#include <plat/sdhci.h>
-
-void s5pc100_setup_sdhci0_cfg_gpio(struct platform_device *dev, int width)
-{
-       struct s3c_sdhci_platdata *pdata = dev->dev.platform_data;
-       unsigned int num;
-
-       num = width;
-       /* In case of 8 width, we should decrease the 2 */
-       if (width == 8)
-               num = width - 2;
-
-       /* Set all the necessary GPG0/GPG1 pins to special-function 0 */
-       s3c_gpio_cfgrange_nopull(S5PC100_GPG0(0), 2 + num, S3C_GPIO_SFN(2));
-
-       if (width == 8)
-               s3c_gpio_cfgrange_nopull(S5PC100_GPG1(0), 2, S3C_GPIO_SFN(2));
-
-       if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) {
-               s3c_gpio_setpull(S5PC100_GPG1(2), S3C_GPIO_PULL_UP);
-               s3c_gpio_cfgpin(S5PC100_GPG1(2), S3C_GPIO_SFN(2));
-       }
-}
-
-void s5pc100_setup_sdhci1_cfg_gpio(struct platform_device *dev, int width)
-{
-       struct s3c_sdhci_platdata *pdata = dev->dev.platform_data;
-
-       /* Set all the necessary GPG2 pins to special-function 2 */
-       s3c_gpio_cfgrange_nopull(S5PC100_GPG2(0), 2 + width, S3C_GPIO_SFN(2));
-
-       if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) {
-               s3c_gpio_setpull(S5PC100_GPG2(6), S3C_GPIO_PULL_UP);
-               s3c_gpio_cfgpin(S5PC100_GPG2(6), S3C_GPIO_SFN(2));
-       }
-}
-
-void s5pc100_setup_sdhci2_cfg_gpio(struct platform_device *dev, int width)
-{
-       struct s3c_sdhci_platdata *pdata = dev->dev.platform_data;
-
-       /* Set all the necessary GPG3 pins to special-function 2 */
-       s3c_gpio_cfgrange_nopull(S5PC100_GPG3(0), 2 + width, S3C_GPIO_SFN(2));
-
-       if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) {
-               s3c_gpio_setpull(S5PC100_GPG3(6), S3C_GPIO_PULL_UP);
-               s3c_gpio_cfgpin(S5PC100_GPG3(6), S3C_GPIO_SFN(2));
-       }
-}
diff --git a/arch/arm/mach-s5pc100/setup-spi.c b/arch/arm/mach-s5pc100/setup-spi.c
deleted file mode 100644 (file)
index 1835679..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/* linux/arch/arm/mach-s5pc100/setup-spi.c
- *
- * Copyright (C) 2011 Samsung Electronics Ltd.
- *             http://www.samsung.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#include <linux/gpio.h>
-#include <plat/gpio-cfg.h>
-
-#ifdef CONFIG_S3C64XX_DEV_SPI0
-int s3c64xx_spi0_cfg_gpio(void)
-{
-       s3c_gpio_cfgall_range(S5PC100_GPB(0), 3,
-                               S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP);
-       return 0;
-}
-#endif
-
-#ifdef CONFIG_S3C64XX_DEV_SPI1
-int s3c64xx_spi1_cfg_gpio(void)
-{
-       s3c_gpio_cfgall_range(S5PC100_GPB(4), 3,
-                               S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP);
-       return 0;
-}
-#endif
-
-#ifdef CONFIG_S3C64XX_DEV_SPI2
-int s3c64xx_spi2_cfg_gpio(void)
-{
-       s3c_gpio_cfgpin(S5PC100_GPG3(0), S3C_GPIO_SFN(3));
-       s3c_gpio_setpull(S5PC100_GPG3(0), S3C_GPIO_PULL_UP);
-       s3c_gpio_cfgall_range(S5PC100_GPB(2), 2,
-                               S3C_GPIO_SFN(3), S3C_GPIO_PULL_UP);
-       return 0;
-}
-#endif
index f60f2862856d5a0e7087cb759e7c659afab1280d..330bfc8fcd52d2c74e796e4bdb1d5d2d90a884e0 100644 (file)
 
 # Configuration options for the S5PV210/S5PC110
 
+config ARCH_S5PV210
+       bool "Samsung S5PV210/S5PC110" if ARCH_MULTI_V7
+       select ARCH_HAS_HOLES_MEMORYMODEL
+       select ARCH_REQUIRE_GPIOLIB
+       select ARM_VIC
+       select CLKSRC_SAMSUNG_PWM
+       select COMMON_CLK_SAMSUNG
+       select HAVE_S3C2410_I2C if I2C
+       select HAVE_S3C2410_WATCHDOG if WATCHDOG
+       select HAVE_S3C_RTC if RTC_CLASS
+       select PINCTRL
+       select PINCTRL_EXYNOS
+       help
+         Samsung S5PV210/S5PC110 series based systems
+
 if ARCH_S5PV210
 
 config CPU_S5PV210
-       bool
+       def_bool y
        select ARM_AMBA
        select PL330_DMA if DMADEVICES
-       select S5P_EXT_INT
-       select S5P_PM if PM
-       select S5P_SLEEP if PM
        help
          Enable S5PV210 CPU support
 
-config S5PV210_SETUP_I2C1
-       bool
-       help
-         Common setup code for i2c bus 1.
-
-config S5PV210_SETUP_I2C2
-       bool
-       help
-         Common setup code for i2c bus 2.
-
-config S5PV210_SETUP_IDE
-       bool
-       help
-         Common setup code for S5PV210 IDE GPIO configurations
-
-config S5PV210_SETUP_FB_24BPP
-       bool
-       help
-          Common setup code for S5PV210 with an 24bpp RGB display helper.
-
-config S5PV210_SETUP_KEYPAD
-       bool
-       help
-         Common setup code for keypad.
-
-config S5PV210_SETUP_SDHCI
-        bool
-        select S5PV210_SETUP_SDHCI_GPIO
-        help
-          Internal helper functions for S5PV210 based SDHCI systems
-
-config S5PV210_SETUP_SDHCI_GPIO
-       bool
-       help
-         Common setup code for SDHCI gpio.
-
-config S5PV210_SETUP_FIMC
-       bool
-       help
-         Common setup code for the camera interfaces.
-
-config S5PV210_SETUP_SPI
-       bool
-       help
-         Common setup code for SPI GPIO configurations.
-
-config S5PV210_SETUP_USB_PHY
-       bool
-       help
-         Common setup code for USB PHY controller
-
-menu "S5PC110 Machines"
-
-config MACH_AQUILA
-       bool "Aquila"
-       select CPU_S5PV210
-       select S3C_DEV_FB
-       select S3C_DEV_HSMMC
-       select S3C_DEV_HSMMC1
-       select S3C_DEV_HSMMC2
-       select S5PV210_SETUP_FB_24BPP
-       select S5PV210_SETUP_SDHCI
-       select S5PV210_SETUP_USB_PHY
-       select S5P_DEV_FIMC0
-       select S5P_DEV_FIMC1
-       select S5P_DEV_FIMC2
-       select S5P_DEV_ONENAND
-       help
-         Machine support for the Samsung Aquila target based on S5PC110 SoC
-
-config MACH_GONI
-       bool "GONI"
-       select CPU_S5PV210
-       select S3C_DEV_FB
-       select S3C_DEV_HSMMC
-       select S3C_DEV_HSMMC1
-       select S3C_DEV_HSMMC2
-       select S3C_DEV_I2C1
-       select S3C_DEV_I2C2
-       select S3C_DEV_USB_HSOTG
-       select S5PV210_SETUP_FB_24BPP
-       select S5PV210_SETUP_FIMC
-       select S5PV210_SETUP_I2C1
-       select S5PV210_SETUP_I2C2
-       select S5PV210_SETUP_KEYPAD
-       select S5PV210_SETUP_SDHCI
-       select S5PV210_SETUP_USB_PHY
-       select S5P_DEV_FIMC0
-       select S5P_DEV_FIMC1
-       select S5P_DEV_FIMC2
-       select S5P_DEV_MFC
-       select S5P_DEV_ONENAND
-       select S5P_DEV_TV
-       select S5P_GPIO_INT
-       select SAMSUNG_DEV_KEYPAD
-       help
-         Machine support for Samsung GONI board
-         S5PC110(MCP) is one of package option of S5PV210
-
-config MACH_SMDKC110
-       bool "SMDKC110"
-       select CPU_S5PV210
-       select S3C_DEV_I2C1
-       select S3C_DEV_I2C2
-       select S3C_DEV_RTC
-       select S3C_DEV_WDT
-       select S5PV210_SETUP_I2C1
-       select S5PV210_SETUP_I2C2
-       select S5PV210_SETUP_IDE
-       select S5P_DEV_FIMC0
-       select S5P_DEV_FIMC1
-       select S5P_DEV_FIMC2
-       select S5P_DEV_MFC
-       select SAMSUNG_DEV_IDE
-       help
-         Machine support for Samsung SMDKC110
-         S5PC110(MCP) is one of package option of S5PV210
-
-endmenu
-
-menu "S5PV210 Machines"
-
-config MACH_SMDKV210
-       bool "SMDKV210"
-       select CPU_S5PV210
-       select S3C_DEV_FB
-       select S3C_DEV_HSMMC
-       select S3C_DEV_HSMMC1
-       select S3C_DEV_HSMMC2
-       select S3C_DEV_HSMMC3
-       select S3C_DEV_I2C1
-       select S3C_DEV_I2C2
-       select S3C_DEV_RTC
-       select S3C_DEV_USB_HSOTG
-       select S3C_DEV_WDT
-       select S5PV210_SETUP_FB_24BPP
-       select S5PV210_SETUP_I2C1
-       select S5PV210_SETUP_I2C2
-       select S5PV210_SETUP_IDE
-       select S5PV210_SETUP_KEYPAD
-       select S5PV210_SETUP_SDHCI
-       select S5PV210_SETUP_USB_PHY
-       select S5P_DEV_FIMC0
-       select S5P_DEV_FIMC1
-       select S5P_DEV_FIMC2
-       select S5P_DEV_JPEG
-       select S5P_DEV_MFC
-       select SAMSUNG_DEV_ADC
-       select SAMSUNG_DEV_BACKLIGHT
-       select SAMSUNG_DEV_IDE
-       select SAMSUNG_DEV_KEYPAD
-       select SAMSUNG_DEV_PWM
-       select SAMSUNG_DEV_TS
-       help
-         Machine support for Samsung SMDKV210
-
-config MACH_TORBRECK
-       bool "Torbreck"
-       select ARCH_SPARSEMEM_ENABLE
-       select CPU_S5PV210
-       select S3C_DEV_HSMMC
-       select S3C_DEV_HSMMC1
-       select S3C_DEV_HSMMC2
-       select S3C_DEV_HSMMC3
-       select S3C_DEV_I2C1
-       select S3C_DEV_I2C2
-       select S3C_DEV_RTC
-       select S3C_DEV_WDT
-       select S5PV210_SETUP_I2C1
-       select S5PV210_SETUP_I2C2
-       select S5PV210_SETUP_SDHCI
-       select SAMSUNG_DEV_IDE
-       help
-         Machine support for aESOP Torbreck
-
-endmenu
-
 endif
index 1c4e41998a1031f2dcc6de7e3b690494391bba17..7dc2d0e25a83363e337e5e6e8433ee66ae1527cc 100644 (file)
@@ -5,6 +5,8 @@
 #
 # Licensed under GPLv2
 
+ccflags-$(CONFIG_ARCH_MULTIPLATFORM) += -I$(srctree)/$(src)/include -I$(srctree)/arch/arm/plat-samsung/include
+
 obj-y                          :=
 obj-m                          :=
 obj-n                          :=
@@ -12,31 +14,8 @@ obj-                         :=
 
 # Core
 
-obj-y                          += common.o clock.o
-
-obj-$(CONFIG_PM)               += pm.o
-
-obj-y                          += dma.o
+obj-$(CONFIG_PM_SLEEP)         += pm.o sleep.o
 
 # machine support
 
-obj-$(CONFIG_MACH_AQUILA)      += mach-aquila.o
-obj-$(CONFIG_MACH_GONI)                += mach-goni.o
-obj-$(CONFIG_MACH_SMDKC110)    += mach-smdkc110.o
-obj-$(CONFIG_MACH_SMDKV210)    += mach-smdkv210.o
-obj-$(CONFIG_MACH_TORBRECK)    += mach-torbreck.o
-
-# device support
-
-obj-y                          += dev-audio.o
-
-obj-y                                  += setup-i2c0.o
-obj-$(CONFIG_S5PV210_SETUP_FB_24BPP)   += setup-fb-24bpp.o
-obj-$(CONFIG_S5PV210_SETUP_FIMC)       += setup-fimc.o
-obj-$(CONFIG_S5PV210_SETUP_I2C1)       += setup-i2c1.o
-obj-$(CONFIG_S5PV210_SETUP_I2C2)       += setup-i2c2.o
-obj-$(CONFIG_S5PV210_SETUP_IDE)                += setup-ide.o
-obj-$(CONFIG_S5PV210_SETUP_KEYPAD)     += setup-keypad.o
-obj-$(CONFIG_S5PV210_SETUP_SDHCI_GPIO) += setup-sdhci-gpio.o
-obj-$(CONFIG_S5PV210_SETUP_SPI)                += setup-spi.o
-obj-$(CONFIG_S5PV210_SETUP_USB_PHY) += setup-usb-phy.o
+obj-y                          += s5pv210.o
diff --git a/arch/arm/mach-s5pv210/Makefile.boot b/arch/arm/mach-s5pv210/Makefile.boot
deleted file mode 100644 (file)
index 79ece40..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-   zreladdr-y  += 0x20008000
-params_phys-y  := 0x20000100
diff --git a/arch/arm/mach-s5pv210/clock.c b/arch/arm/mach-s5pv210/clock.c
deleted file mode 100644 (file)
index ca46372..0000000
+++ /dev/null
@@ -1,1365 +0,0 @@
-/* linux/arch/arm/mach-s5pv210/clock.c
- *
- * Copyright (c) 2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com/
- *
- * S5PV210 - Clock support
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#include <linux/init.h>
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/list.h>
-#include <linux/errno.h>
-#include <linux/err.h>
-#include <linux/clk.h>
-#include <linux/device.h>
-#include <linux/io.h>
-
-#include <mach/map.h>
-
-#include <plat/cpu-freq.h>
-#include <mach/regs-clock.h>
-#include <plat/clock.h>
-#include <plat/cpu.h>
-#include <plat/pll.h>
-#include <plat/s5p-clock.h>
-#include <plat/clock-clksrc.h>
-
-#include "common.h"
-
-static unsigned long xtal;
-
-static struct clksrc_clk clk_mout_apll = {
-       .clk    = {
-               .name           = "mout_apll",
-       },
-       .sources        = &clk_src_apll,
-       .reg_src        = { .reg = S5P_CLK_SRC0, .shift = 0, .size = 1 },
-};
-
-static struct clksrc_clk clk_mout_epll = {
-       .clk    = {
-               .name           = "mout_epll",
-       },
-       .sources        = &clk_src_epll,
-       .reg_src        = { .reg = S5P_CLK_SRC0, .shift = 8, .size = 1 },
-};
-
-static struct clksrc_clk clk_mout_mpll = {
-       .clk = {
-               .name           = "mout_mpll",
-       },
-       .sources        = &clk_src_mpll,
-       .reg_src        = { .reg = S5P_CLK_SRC0, .shift = 4, .size = 1 },
-};
-
-static struct clk *clkset_armclk_list[] = {
-       [0] = &clk_mout_apll.clk,
-       [1] = &clk_mout_mpll.clk,
-};
-
-static struct clksrc_sources clkset_armclk = {
-       .sources        = clkset_armclk_list,
-       .nr_sources     = ARRAY_SIZE(clkset_armclk_list),
-};
-
-static struct clksrc_clk clk_armclk = {
-       .clk    = {
-               .name           = "armclk",
-       },
-       .sources        = &clkset_armclk,
-       .reg_src        = { .reg = S5P_CLK_SRC0, .shift = 16, .size = 1 },
-       .reg_div        = { .reg = S5P_CLK_DIV0, .shift = 0, .size = 3 },
-};
-
-static struct clksrc_clk clk_hclk_msys = {
-       .clk    = {
-               .name           = "hclk_msys",
-               .parent         = &clk_armclk.clk,
-       },
-       .reg_div        = { .reg = S5P_CLK_DIV0, .shift = 8, .size = 3 },
-};
-
-static struct clksrc_clk clk_pclk_msys = {
-       .clk    = {
-               .name           = "pclk_msys",
-               .parent         = &clk_hclk_msys.clk,
-       },
-       .reg_div        = { .reg = S5P_CLK_DIV0, .shift = 12, .size = 3 },
-};
-
-static struct clksrc_clk clk_sclk_a2m = {
-       .clk    = {
-               .name           = "sclk_a2m",
-               .parent         = &clk_mout_apll.clk,
-       },
-       .reg_div        = { .reg = S5P_CLK_DIV0, .shift = 4, .size = 3 },
-};
-
-static struct clk *clkset_hclk_sys_list[] = {
-       [0] = &clk_mout_mpll.clk,
-       [1] = &clk_sclk_a2m.clk,
-};
-
-static struct clksrc_sources clkset_hclk_sys = {
-       .sources        = clkset_hclk_sys_list,
-       .nr_sources     = ARRAY_SIZE(clkset_hclk_sys_list),
-};
-
-static struct clksrc_clk clk_hclk_dsys = {
-       .clk    = {
-               .name   = "hclk_dsys",
-       },
-       .sources        = &clkset_hclk_sys,
-       .reg_src        = { .reg = S5P_CLK_SRC0, .shift = 20, .size = 1 },
-       .reg_div        = { .reg = S5P_CLK_DIV0, .shift = 16, .size = 4 },
-};
-
-static struct clksrc_clk clk_pclk_dsys = {
-       .clk    = {
-               .name   = "pclk_dsys",
-               .parent = &clk_hclk_dsys.clk,
-       },
-       .reg_div = { .reg = S5P_CLK_DIV0, .shift = 20, .size = 3 },
-};
-
-static struct clksrc_clk clk_hclk_psys = {
-       .clk    = {
-               .name   = "hclk_psys",
-       },
-       .sources        = &clkset_hclk_sys,
-       .reg_src        = { .reg = S5P_CLK_SRC0, .shift = 24, .size = 1 },
-       .reg_div        = { .reg = S5P_CLK_DIV0, .shift = 24, .size = 4 },
-};
-
-static struct clksrc_clk clk_pclk_psys = {
-       .clk    = {
-               .name   = "pclk_psys",
-               .parent = &clk_hclk_psys.clk,
-       },
-       .reg_div        = { .reg = S5P_CLK_DIV0, .shift = 28, .size = 3 },
-};
-
-static int s5pv210_clk_ip0_ctrl(struct clk *clk, int enable)
-{
-       return s5p_gatectrl(S5P_CLKGATE_IP0, clk, enable);
-}
-
-static int s5pv210_clk_ip1_ctrl(struct clk *clk, int enable)
-{
-       return s5p_gatectrl(S5P_CLKGATE_IP1, clk, enable);
-}
-
-static int s5pv210_clk_ip2_ctrl(struct clk *clk, int enable)
-{
-       return s5p_gatectrl(S5P_CLKGATE_IP2, clk, enable);
-}
-
-static int s5pv210_clk_ip3_ctrl(struct clk *clk, int enable)
-{
-       return s5p_gatectrl(S5P_CLKGATE_IP3, clk, enable);
-}
-
-static int s5pv210_clk_mask0_ctrl(struct clk *clk, int enable)
-{
-       return s5p_gatectrl(S5P_CLK_SRC_MASK0, clk, enable);
-}
-
-static int s5pv210_clk_mask1_ctrl(struct clk *clk, int enable)
-{
-       return s5p_gatectrl(S5P_CLK_SRC_MASK1, clk, enable);
-}
-
-static int s5pv210_clk_hdmiphy_ctrl(struct clk *clk, int enable)
-{
-       return s5p_gatectrl(S5P_HDMI_PHY_CONTROL, clk, enable);
-}
-
-static int exynos4_clk_dac_ctrl(struct clk *clk, int enable)
-{
-       return s5p_gatectrl(S5P_DAC_PHY_CONTROL, clk, enable);
-}
-
-static struct clk clk_sclk_hdmi27m = {
-       .name           = "sclk_hdmi27m",
-       .rate           = 27000000,
-};
-
-static struct clk clk_sclk_hdmiphy = {
-       .name           = "sclk_hdmiphy",
-};
-
-static struct clk clk_sclk_usbphy0 = {
-       .name           = "sclk_usbphy0",
-};
-
-static struct clk clk_sclk_usbphy1 = {
-       .name           = "sclk_usbphy1",
-};
-
-static struct clk clk_pcmcdclk0 = {
-       .name           = "pcmcdclk",
-};
-
-static struct clk clk_pcmcdclk1 = {
-       .name           = "pcmcdclk",
-};
-
-static struct clk clk_pcmcdclk2 = {
-       .name           = "pcmcdclk",
-};
-
-static struct clk *clkset_vpllsrc_list[] = {
-       [0] = &clk_fin_vpll,
-       [1] = &clk_sclk_hdmi27m,
-};
-
-static struct clksrc_sources clkset_vpllsrc = {
-       .sources        = clkset_vpllsrc_list,
-       .nr_sources     = ARRAY_SIZE(clkset_vpllsrc_list),
-};
-
-static struct clksrc_clk clk_vpllsrc = {
-       .clk    = {
-               .name           = "vpll_src",
-               .enable         = s5pv210_clk_mask0_ctrl,
-               .ctrlbit        = (1 << 7),
-       },
-       .sources        = &clkset_vpllsrc,
-       .reg_src        = { .reg = S5P_CLK_SRC1, .shift = 28, .size = 1 },
-};
-
-static struct clk *clkset_sclk_vpll_list[] = {
-       [0] = &clk_vpllsrc.clk,
-       [1] = &clk_fout_vpll,
-};
-
-static struct clksrc_sources clkset_sclk_vpll = {
-       .sources        = clkset_sclk_vpll_list,
-       .nr_sources     = ARRAY_SIZE(clkset_sclk_vpll_list),
-};
-
-static struct clksrc_clk clk_sclk_vpll = {
-       .clk    = {
-               .name           = "sclk_vpll",
-       },
-       .sources        = &clkset_sclk_vpll,
-       .reg_src        = { .reg = S5P_CLK_SRC0, .shift = 12, .size = 1 },
-};
-
-static struct clk *clkset_moutdmc0src_list[] = {
-       [0] = &clk_sclk_a2m.clk,
-       [1] = &clk_mout_mpll.clk,
-       [2] = NULL,
-       [3] = NULL,
-};
-
-static struct clksrc_sources clkset_moutdmc0src = {
-       .sources        = clkset_moutdmc0src_list,
-       .nr_sources     = ARRAY_SIZE(clkset_moutdmc0src_list),
-};
-
-static struct clksrc_clk clk_mout_dmc0 = {
-       .clk    = {
-               .name           = "mout_dmc0",
-       },
-       .sources        = &clkset_moutdmc0src,
-       .reg_src        = { .reg = S5P_CLK_SRC6, .shift = 24, .size = 2 },
-};
-
-static struct clksrc_clk clk_sclk_dmc0 = {
-       .clk    = {
-               .name           = "sclk_dmc0",
-               .parent         = &clk_mout_dmc0.clk,
-       },
-       .reg_div        = { .reg = S5P_CLK_DIV6, .shift = 28, .size = 4 },
-};
-
-static unsigned long s5pv210_clk_imem_get_rate(struct clk *clk)
-{
-       return clk_get_rate(clk->parent) / 2;
-}
-
-static struct clk_ops clk_hclk_imem_ops = {
-       .get_rate       = s5pv210_clk_imem_get_rate,
-};
-
-static unsigned long s5pv210_clk_fout_apll_get_rate(struct clk *clk)
-{
-       return s5p_get_pll45xx(xtal, __raw_readl(S5P_APLL_CON), pll_4508);
-}
-
-static struct clk_ops clk_fout_apll_ops = {
-       .get_rate       = s5pv210_clk_fout_apll_get_rate,
-};
-
-static struct clk init_clocks_off[] = {
-       {
-               .name           = "rot",
-               .parent         = &clk_hclk_dsys.clk,
-               .enable         = s5pv210_clk_ip0_ctrl,
-               .ctrlbit        = (1<<29),
-       }, {
-               .name           = "fimc",
-               .devname        = "s5pv210-fimc.0",
-               .parent         = &clk_hclk_dsys.clk,
-               .enable         = s5pv210_clk_ip0_ctrl,
-               .ctrlbit        = (1 << 24),
-       }, {
-               .name           = "fimc",
-               .devname        = "s5pv210-fimc.1",
-               .parent         = &clk_hclk_dsys.clk,
-               .enable         = s5pv210_clk_ip0_ctrl,
-               .ctrlbit        = (1 << 25),
-       }, {
-               .name           = "fimc",
-               .devname        = "s5pv210-fimc.2",
-               .parent         = &clk_hclk_dsys.clk,
-               .enable         = s5pv210_clk_ip0_ctrl,
-               .ctrlbit        = (1 << 26),
-       }, {
-               .name           = "jpeg",
-               .parent         = &clk_hclk_dsys.clk,
-               .enable         = s5pv210_clk_ip0_ctrl,
-               .ctrlbit        = (1 << 28),
-       }, {
-               .name           = "mfc",
-               .devname        = "s5p-mfc",
-               .parent         = &clk_pclk_psys.clk,
-               .enable         = s5pv210_clk_ip0_ctrl,
-               .ctrlbit        = (1 << 16),
-       }, {
-               .name           = "dac",
-               .devname        = "s5p-sdo",
-               .parent         = &clk_hclk_dsys.clk,
-               .enable         = s5pv210_clk_ip1_ctrl,
-               .ctrlbit        = (1 << 10),
-       }, {
-               .name           = "mixer",
-               .devname        = "s5p-mixer",
-               .parent         = &clk_hclk_dsys.clk,
-               .enable         = s5pv210_clk_ip1_ctrl,
-               .ctrlbit        = (1 << 9),
-       }, {
-               .name           = "vp",
-               .devname        = "s5p-mixer",
-               .parent         = &clk_hclk_dsys.clk,
-               .enable         = s5pv210_clk_ip1_ctrl,
-               .ctrlbit        = (1 << 8),
-       }, {
-               .name           = "hdmi",
-               .devname        = "s5pv210-hdmi",
-               .parent         = &clk_hclk_dsys.clk,
-               .enable         = s5pv210_clk_ip1_ctrl,
-               .ctrlbit        = (1 << 11),
-       }, {
-               .name           = "hdmiphy",
-               .devname        = "s5pv210-hdmi",
-               .enable         = s5pv210_clk_hdmiphy_ctrl,
-               .ctrlbit        = (1 << 0),
-       }, {
-               .name           = "dacphy",
-               .devname        = "s5p-sdo",
-               .enable         = exynos4_clk_dac_ctrl,
-               .ctrlbit        = (1 << 0),
-       }, {
-               .name           = "otg",
-               .parent         = &clk_hclk_psys.clk,
-               .enable         = s5pv210_clk_ip1_ctrl,
-               .ctrlbit        = (1<<16),
-       }, {
-               .name           = "usb-host",
-               .parent         = &clk_hclk_psys.clk,
-               .enable         = s5pv210_clk_ip1_ctrl,
-               .ctrlbit        = (1<<17),
-       }, {
-               .name           = "lcd",
-               .parent         = &clk_hclk_dsys.clk,
-               .enable         = s5pv210_clk_ip1_ctrl,
-               .ctrlbit        = (1<<0),
-       }, {
-               .name           = "cfcon",
-               .parent         = &clk_hclk_psys.clk,
-               .enable         = s5pv210_clk_ip1_ctrl,
-               .ctrlbit        = (1<<25),
-       }, {
-               .name           = "systimer",
-               .parent         = &clk_pclk_psys.clk,
-               .enable         = s5pv210_clk_ip3_ctrl,
-               .ctrlbit        = (1<<16),
-       }, {
-               .name           = "watchdog",
-               .parent         = &clk_pclk_psys.clk,
-               .enable         = s5pv210_clk_ip3_ctrl,
-               .ctrlbit        = (1<<22),
-       }, {
-               .name           = "rtc",
-               .parent         = &clk_pclk_psys.clk,
-               .enable         = s5pv210_clk_ip3_ctrl,
-               .ctrlbit        = (1<<15),
-       }, {
-               .name           = "i2c",
-               .devname        = "s3c2440-i2c.0",
-               .parent         = &clk_pclk_psys.clk,
-               .enable         = s5pv210_clk_ip3_ctrl,
-               .ctrlbit        = (1<<7),
-       }, {
-               .name           = "i2c",
-               .devname        = "s3c2440-i2c.1",
-               .parent         = &clk_pclk_psys.clk,
-               .enable         = s5pv210_clk_ip3_ctrl,
-               .ctrlbit        = (1 << 10),
-       }, {
-               .name           = "i2c",
-               .devname        = "s3c2440-i2c.2",
-               .parent         = &clk_pclk_psys.clk,
-               .enable         = s5pv210_clk_ip3_ctrl,
-               .ctrlbit        = (1<<9),
-       }, {
-               .name           = "i2c",
-               .devname        = "s3c2440-hdmiphy-i2c",
-               .parent         = &clk_pclk_psys.clk,
-               .enable         = s5pv210_clk_ip3_ctrl,
-               .ctrlbit        = (1 << 11),
-       }, {
-               .name           = "spi",
-               .devname        = "s5pv210-spi.0",
-               .parent         = &clk_pclk_psys.clk,
-               .enable         = s5pv210_clk_ip3_ctrl,
-               .ctrlbit        = (1<<12),
-       }, {
-               .name           = "spi",
-               .devname        = "s5pv210-spi.1",
-               .parent         = &clk_pclk_psys.clk,
-               .enable         = s5pv210_clk_ip3_ctrl,
-               .ctrlbit        = (1<<13),
-       }, {
-               .name           = "spi",
-               .devname        = "s5pv210-spi.2",
-               .parent         = &clk_pclk_psys.clk,
-               .enable         = s5pv210_clk_ip3_ctrl,
-               .ctrlbit        = (1<<14),
-       }, {
-               .name           = "timers",
-               .parent         = &clk_pclk_psys.clk,
-               .enable         = s5pv210_clk_ip3_ctrl,
-               .ctrlbit        = (1<<23),
-       }, {
-               .name           = "adc",
-               .parent         = &clk_pclk_psys.clk,
-               .enable         = s5pv210_clk_ip3_ctrl,
-               .ctrlbit        = (1<<24),
-       }, {
-               .name           = "keypad",
-               .parent         = &clk_pclk_psys.clk,
-               .enable         = s5pv210_clk_ip3_ctrl,
-               .ctrlbit        = (1<<21),
-       }, {
-               .name           = "iis",
-               .devname        = "samsung-i2s.0",
-               .parent         = &clk_p,
-               .enable         = s5pv210_clk_ip3_ctrl,
-               .ctrlbit        = (1<<4),
-       }, {
-               .name           = "iis",
-               .devname        = "samsung-i2s.1",
-               .parent         = &clk_p,
-               .enable         = s5pv210_clk_ip3_ctrl,
-               .ctrlbit        = (1 << 5),
-       }, {
-               .name           = "iis",
-               .devname        = "samsung-i2s.2",
-               .parent         = &clk_p,
-               .enable         = s5pv210_clk_ip3_ctrl,
-               .ctrlbit        = (1 << 6),
-       }, {
-               .name           = "spdif",
-               .parent         = &clk_p,
-               .enable         = s5pv210_clk_ip3_ctrl,
-               .ctrlbit        = (1 << 0),
-       },
-};
-
-static struct clk init_clocks[] = {
-       {
-               .name           = "hclk_imem",
-               .parent         = &clk_hclk_msys.clk,
-               .ctrlbit        = (1 << 5),
-               .enable         = s5pv210_clk_ip0_ctrl,
-               .ops            = &clk_hclk_imem_ops,
-       }, {
-               .name           = "uart",
-               .devname        = "s5pv210-uart.0",
-               .parent         = &clk_pclk_psys.clk,
-               .enable         = s5pv210_clk_ip3_ctrl,
-               .ctrlbit        = (1 << 17),
-       }, {
-               .name           = "uart",
-               .devname        = "s5pv210-uart.1",
-               .parent         = &clk_pclk_psys.clk,
-               .enable         = s5pv210_clk_ip3_ctrl,
-               .ctrlbit        = (1 << 18),
-       }, {
-               .name           = "uart",
-               .devname        = "s5pv210-uart.2",
-               .parent         = &clk_pclk_psys.clk,
-               .enable         = s5pv210_clk_ip3_ctrl,
-               .ctrlbit        = (1 << 19),
-       }, {
-               .name           = "uart",
-               .devname        = "s5pv210-uart.3",
-               .parent         = &clk_pclk_psys.clk,
-               .enable         = s5pv210_clk_ip3_ctrl,
-               .ctrlbit        = (1 << 20),
-       }, {
-               .name           = "sromc",
-               .parent         = &clk_hclk_psys.clk,
-               .enable         = s5pv210_clk_ip1_ctrl,
-               .ctrlbit        = (1 << 26),
-       },
-};
-
-static struct clk clk_hsmmc0 = {
-       .name           = "hsmmc",
-       .devname        = "s3c-sdhci.0",
-       .parent         = &clk_hclk_psys.clk,
-       .enable         = s5pv210_clk_ip2_ctrl,
-       .ctrlbit        = (1<<16),
-};
-
-static struct clk clk_hsmmc1 = {
-       .name           = "hsmmc",
-       .devname        = "s3c-sdhci.1",
-       .parent         = &clk_hclk_psys.clk,
-       .enable         = s5pv210_clk_ip2_ctrl,
-       .ctrlbit        = (1<<17),
-};
-
-static struct clk clk_hsmmc2 = {
-       .name           = "hsmmc",
-       .devname        = "s3c-sdhci.2",
-       .parent         = &clk_hclk_psys.clk,
-       .enable         = s5pv210_clk_ip2_ctrl,
-       .ctrlbit        = (1<<18),
-};
-
-static struct clk clk_hsmmc3 = {
-       .name           = "hsmmc",
-       .devname        = "s3c-sdhci.3",
-       .parent         = &clk_hclk_psys.clk,
-       .enable         = s5pv210_clk_ip2_ctrl,
-       .ctrlbit        = (1<<19),
-};
-
-static struct clk clk_pdma0 = {
-       .name           = "pdma0",
-       .parent         = &clk_hclk_psys.clk,
-       .enable         = s5pv210_clk_ip0_ctrl,
-       .ctrlbit        = (1 << 3),
-};
-
-static struct clk clk_pdma1 = {
-       .name           = "pdma1",
-       .parent         = &clk_hclk_psys.clk,
-       .enable         = s5pv210_clk_ip0_ctrl,
-       .ctrlbit        = (1 << 4),
-};
-
-static struct clk *clkset_uart_list[] = {
-       [6] = &clk_mout_mpll.clk,
-       [7] = &clk_mout_epll.clk,
-};
-
-static struct clksrc_sources clkset_uart = {
-       .sources        = clkset_uart_list,
-       .nr_sources     = ARRAY_SIZE(clkset_uart_list),
-};
-
-static struct clk *clkset_group1_list[] = {
-       [0] = &clk_sclk_a2m.clk,
-       [1] = &clk_mout_mpll.clk,
-       [2] = &clk_mout_epll.clk,
-       [3] = &clk_sclk_vpll.clk,
-};
-
-static struct clksrc_sources clkset_group1 = {
-       .sources        = clkset_group1_list,
-       .nr_sources     = ARRAY_SIZE(clkset_group1_list),
-};
-
-static struct clk *clkset_sclk_onenand_list[] = {
-       [0] = &clk_hclk_psys.clk,
-       [1] = &clk_hclk_dsys.clk,
-};
-
-static struct clksrc_sources clkset_sclk_onenand = {
-       .sources        = clkset_sclk_onenand_list,
-       .nr_sources     = ARRAY_SIZE(clkset_sclk_onenand_list),
-};
-
-static struct clk *clkset_sclk_dac_list[] = {
-       [0] = &clk_sclk_vpll.clk,
-       [1] = &clk_sclk_hdmiphy,
-};
-
-static struct clksrc_sources clkset_sclk_dac = {
-       .sources        = clkset_sclk_dac_list,
-       .nr_sources     = ARRAY_SIZE(clkset_sclk_dac_list),
-};
-
-static struct clksrc_clk clk_sclk_dac = {
-       .clk            = {
-               .name           = "sclk_dac",
-               .enable         = s5pv210_clk_mask0_ctrl,
-               .ctrlbit        = (1 << 2),
-       },
-       .sources        = &clkset_sclk_dac,
-       .reg_src        = { .reg = S5P_CLK_SRC1, .shift = 8, .size = 1 },
-};
-
-static struct clksrc_clk clk_sclk_pixel = {
-       .clk            = {
-               .name           = "sclk_pixel",
-               .parent         = &clk_sclk_vpll.clk,
-       },
-       .reg_div        = { .reg = S5P_CLK_DIV1, .shift = 0, .size = 4},
-};
-
-static struct clk *clkset_sclk_hdmi_list[] = {
-       [0] = &clk_sclk_pixel.clk,
-       [1] = &clk_sclk_hdmiphy,
-};
-
-static struct clksrc_sources clkset_sclk_hdmi = {
-       .sources        = clkset_sclk_hdmi_list,
-       .nr_sources     = ARRAY_SIZE(clkset_sclk_hdmi_list),
-};
-
-static struct clksrc_clk clk_sclk_hdmi = {
-       .clk            = {
-               .name           = "sclk_hdmi",
-               .enable         = s5pv210_clk_mask0_ctrl,
-               .ctrlbit        = (1 << 0),
-       },
-       .sources        = &clkset_sclk_hdmi,
-       .reg_src        = { .reg = S5P_CLK_SRC1, .shift = 0, .size = 1 },
-};
-
-static struct clk *clkset_sclk_mixer_list[] = {
-       [0] = &clk_sclk_dac.clk,
-       [1] = &clk_sclk_hdmi.clk,
-};
-
-static struct clksrc_sources clkset_sclk_mixer = {
-       .sources        = clkset_sclk_mixer_list,
-       .nr_sources     = ARRAY_SIZE(clkset_sclk_mixer_list),
-};
-
-static struct clksrc_clk clk_sclk_mixer = {
-       .clk            = {
-               .name           = "sclk_mixer",
-               .enable         = s5pv210_clk_mask0_ctrl,
-               .ctrlbit        = (1 << 1),
-       },
-       .sources = &clkset_sclk_mixer,
-       .reg_src = { .reg = S5P_CLK_SRC1, .shift = 4, .size = 1 },
-};
-
-static struct clksrc_clk *sclk_tv[] = {
-       &clk_sclk_dac,
-       &clk_sclk_pixel,
-       &clk_sclk_hdmi,
-       &clk_sclk_mixer,
-};
-
-static struct clk *clkset_sclk_audio0_list[] = {
-       [0] = &clk_ext_xtal_mux,
-       [1] = &clk_pcmcdclk0,
-       [2] = &clk_sclk_hdmi27m,
-       [3] = &clk_sclk_usbphy0,
-       [4] = &clk_sclk_usbphy1,
-       [5] = &clk_sclk_hdmiphy,
-       [6] = &clk_mout_mpll.clk,
-       [7] = &clk_mout_epll.clk,
-       [8] = &clk_sclk_vpll.clk,
-};
-
-static struct clksrc_sources clkset_sclk_audio0 = {
-       .sources        = clkset_sclk_audio0_list,
-       .nr_sources     = ARRAY_SIZE(clkset_sclk_audio0_list),
-};
-
-static struct clksrc_clk clk_sclk_audio0 = {
-       .clk            = {
-               .name           = "sclk_audio",
-               .devname        = "soc-audio.0",
-               .enable         = s5pv210_clk_mask0_ctrl,
-               .ctrlbit        = (1 << 24),
-       },
-       .sources = &clkset_sclk_audio0,
-       .reg_src = { .reg = S5P_CLK_SRC6, .shift = 0, .size = 4 },
-       .reg_div = { .reg = S5P_CLK_DIV6, .shift = 0, .size = 4 },
-};
-
-static struct clk *clkset_sclk_audio1_list[] = {
-       [0] = &clk_ext_xtal_mux,
-       [1] = &clk_pcmcdclk1,
-       [2] = &clk_sclk_hdmi27m,
-       [3] = &clk_sclk_usbphy0,
-       [4] = &clk_sclk_usbphy1,
-       [5] = &clk_sclk_hdmiphy,
-       [6] = &clk_mout_mpll.clk,
-       [7] = &clk_mout_epll.clk,
-       [8] = &clk_sclk_vpll.clk,
-};
-
-static struct clksrc_sources clkset_sclk_audio1 = {
-       .sources        = clkset_sclk_audio1_list,
-       .nr_sources     = ARRAY_SIZE(clkset_sclk_audio1_list),
-};
-
-static struct clksrc_clk clk_sclk_audio1 = {
-       .clk            = {
-               .name           = "sclk_audio",
-               .devname        = "soc-audio.1",
-               .enable         = s5pv210_clk_mask0_ctrl,
-               .ctrlbit        = (1 << 25),
-       },
-       .sources = &clkset_sclk_audio1,
-       .reg_src = { .reg = S5P_CLK_SRC6, .shift = 4, .size = 4 },
-       .reg_div = { .reg = S5P_CLK_DIV6, .shift = 4, .size = 4 },
-};
-
-static struct clk *clkset_sclk_audio2_list[] = {
-       [0] = &clk_ext_xtal_mux,
-       [1] = &clk_pcmcdclk0,
-       [2] = &clk_sclk_hdmi27m,
-       [3] = &clk_sclk_usbphy0,
-       [4] = &clk_sclk_usbphy1,
-       [5] = &clk_sclk_hdmiphy,
-       [6] = &clk_mout_mpll.clk,
-       [7] = &clk_mout_epll.clk,
-       [8] = &clk_sclk_vpll.clk,
-};
-
-static struct clksrc_sources clkset_sclk_audio2 = {
-       .sources        = clkset_sclk_audio2_list,
-       .nr_sources     = ARRAY_SIZE(clkset_sclk_audio2_list),
-};
-
-static struct clksrc_clk clk_sclk_audio2 = {
-       .clk            = {
-               .name           = "sclk_audio",
-               .devname        = "soc-audio.2",
-               .enable         = s5pv210_clk_mask0_ctrl,
-               .ctrlbit        = (1 << 26),
-       },
-       .sources = &clkset_sclk_audio2,
-       .reg_src = { .reg = S5P_CLK_SRC6, .shift = 8, .size = 4 },
-       .reg_div = { .reg = S5P_CLK_DIV6, .shift = 8, .size = 4 },
-};
-
-static struct clk *clkset_sclk_spdif_list[] = {
-       [0] = &clk_sclk_audio0.clk,
-       [1] = &clk_sclk_audio1.clk,
-       [2] = &clk_sclk_audio2.clk,
-};
-
-static struct clksrc_sources clkset_sclk_spdif = {
-       .sources        = clkset_sclk_spdif_list,
-       .nr_sources     = ARRAY_SIZE(clkset_sclk_spdif_list),
-};
-
-static struct clksrc_clk clk_sclk_spdif = {
-       .clk            = {
-               .name           = "sclk_spdif",
-               .enable         = s5pv210_clk_mask0_ctrl,
-               .ctrlbit        = (1 << 27),
-               .ops            = &s5p_sclk_spdif_ops,
-       },
-       .sources = &clkset_sclk_spdif,
-       .reg_src = { .reg = S5P_CLK_SRC6, .shift = 12, .size = 2 },
-};
-
-static struct clk *clkset_group2_list[] = {
-       [0] = &clk_ext_xtal_mux,
-       [1] = &clk_xusbxti,
-       [2] = &clk_sclk_hdmi27m,
-       [3] = &clk_sclk_usbphy0,
-       [4] = &clk_sclk_usbphy1,
-       [5] = &clk_sclk_hdmiphy,
-       [6] = &clk_mout_mpll.clk,
-       [7] = &clk_mout_epll.clk,
-       [8] = &clk_sclk_vpll.clk,
-};
-
-static struct clksrc_sources clkset_group2 = {
-       .sources        = clkset_group2_list,
-       .nr_sources     = ARRAY_SIZE(clkset_group2_list),
-};
-
-static struct clksrc_clk clksrcs[] = {
-       {
-               .clk    = {
-                       .name           = "sclk_dmc",
-               },
-               .sources = &clkset_group1,
-               .reg_src = { .reg = S5P_CLK_SRC6, .shift = 24, .size = 2 },
-               .reg_div = { .reg = S5P_CLK_DIV6, .shift = 28, .size = 4 },
-       }, {
-               .clk    = {
-                       .name           = "sclk_onenand",
-               },
-               .sources = &clkset_sclk_onenand,
-               .reg_src = { .reg = S5P_CLK_SRC0, .shift = 28, .size = 1 },
-               .reg_div = { .reg = S5P_CLK_DIV6, .shift = 12, .size = 3 },
-       }, {
-               .clk    = {
-                       .name           = "sclk_fimc",
-                       .devname        = "s5pv210-fimc.0",
-                       .enable         = s5pv210_clk_mask1_ctrl,
-                       .ctrlbit        = (1 << 2),
-               },
-               .sources = &clkset_group2,
-               .reg_src = { .reg = S5P_CLK_SRC3, .shift = 12, .size = 4 },
-               .reg_div = { .reg = S5P_CLK_DIV3, .shift = 12, .size = 4 },
-       }, {
-               .clk    = {
-                       .name           = "sclk_fimc",
-                       .devname        = "s5pv210-fimc.1",
-                       .enable         = s5pv210_clk_mask1_ctrl,
-                       .ctrlbit        = (1 << 3),
-               },
-               .sources = &clkset_group2,
-               .reg_src = { .reg = S5P_CLK_SRC3, .shift = 16, .size = 4 },
-               .reg_div = { .reg = S5P_CLK_DIV3, .shift = 16, .size = 4 },
-       }, {
-               .clk    = {
-                       .name           = "sclk_fimc",
-                       .devname        = "s5pv210-fimc.2",
-                       .enable         = s5pv210_clk_mask1_ctrl,
-                       .ctrlbit        = (1 << 4),
-               },
-               .sources = &clkset_group2,
-               .reg_src = { .reg = S5P_CLK_SRC3, .shift = 20, .size = 4 },
-               .reg_div = { .reg = S5P_CLK_DIV3, .shift = 20, .size = 4 },
-       }, {
-               .clk            = {
-                       .name           = "sclk_cam0",
-                       .enable         = s5pv210_clk_mask0_ctrl,
-                       .ctrlbit        = (1 << 3),
-               },
-               .sources = &clkset_group2,
-               .reg_src = { .reg = S5P_CLK_SRC1, .shift = 12, .size = 4 },
-               .reg_div = { .reg = S5P_CLK_DIV1, .shift = 12, .size = 4 },
-       }, {
-               .clk            = {
-                       .name           = "sclk_cam1",
-                       .enable         = s5pv210_clk_mask0_ctrl,
-                       .ctrlbit        = (1 << 4),
-               },
-               .sources = &clkset_group2,
-               .reg_src = { .reg = S5P_CLK_SRC1, .shift = 16, .size = 4 },
-               .reg_div = { .reg = S5P_CLK_DIV1, .shift = 16, .size = 4 },
-       }, {
-               .clk            = {
-                       .name           = "sclk_fimd",
-                       .enable         = s5pv210_clk_mask0_ctrl,
-                       .ctrlbit        = (1 << 5),
-               },
-               .sources = &clkset_group2,
-               .reg_src = { .reg = S5P_CLK_SRC1, .shift = 20, .size = 4 },
-               .reg_div = { .reg = S5P_CLK_DIV1, .shift = 20, .size = 4 },
-       }, {
-               .clk            = {
-                       .name           = "sclk_mfc",
-                       .devname        = "s5p-mfc",
-                       .enable         = s5pv210_clk_ip0_ctrl,
-                       .ctrlbit        = (1 << 16),
-               },
-               .sources = &clkset_group1,
-               .reg_src = { .reg = S5P_CLK_SRC2, .shift = 4, .size = 2 },
-               .reg_div = { .reg = S5P_CLK_DIV2, .shift = 4, .size = 4 },
-       }, {
-               .clk            = {
-                       .name           = "sclk_g2d",
-                       .enable         = s5pv210_clk_ip0_ctrl,
-                       .ctrlbit        = (1 << 12),
-               },
-               .sources = &clkset_group1,
-               .reg_src = { .reg = S5P_CLK_SRC2, .shift = 8, .size = 2 },
-               .reg_div = { .reg = S5P_CLK_DIV2, .shift = 8, .size = 4 },
-       }, {
-               .clk            = {
-                       .name           = "sclk_g3d",
-                       .enable         = s5pv210_clk_ip0_ctrl,
-                       .ctrlbit        = (1 << 8),
-               },
-               .sources = &clkset_group1,
-               .reg_src = { .reg = S5P_CLK_SRC2, .shift = 0, .size = 2 },
-               .reg_div = { .reg = S5P_CLK_DIV2, .shift = 0, .size = 4 },
-       }, {
-               .clk            = {
-                       .name           = "sclk_csis",
-                       .enable         = s5pv210_clk_mask0_ctrl,
-                       .ctrlbit        = (1 << 6),
-               },
-               .sources = &clkset_group2,
-               .reg_src = { .reg = S5P_CLK_SRC1, .shift = 24, .size = 4 },
-               .reg_div = { .reg = S5P_CLK_DIV1, .shift = 28, .size = 4 },
-       }, {
-               .clk            = {
-                       .name           = "sclk_pwi",
-                       .enable         = s5pv210_clk_mask0_ctrl,
-                       .ctrlbit        = (1 << 29),
-               },
-               .sources = &clkset_group2,
-               .reg_src = { .reg = S5P_CLK_SRC6, .shift = 20, .size = 4 },
-               .reg_div = { .reg = S5P_CLK_DIV6, .shift = 24, .size = 4 },
-       }, {
-               .clk            = {
-                       .name           = "sclk_pwm",
-                       .enable         = s5pv210_clk_mask0_ctrl,
-                       .ctrlbit        = (1 << 19),
-               },
-               .sources = &clkset_group2,
-               .reg_src = { .reg = S5P_CLK_SRC5, .shift = 12, .size = 4 },
-               .reg_div = { .reg = S5P_CLK_DIV5, .shift = 12, .size = 4 },
-       },
-};
-
-static struct clksrc_clk clk_sclk_uart0 = {
-       .clk    = {
-               .name           = "uclk1",
-               .devname        = "s5pv210-uart.0",
-               .enable         = s5pv210_clk_mask0_ctrl,
-               .ctrlbit        = (1 << 12),
-       },
-       .sources = &clkset_uart,
-       .reg_src = { .reg = S5P_CLK_SRC4, .shift = 16, .size = 4 },
-       .reg_div = { .reg = S5P_CLK_DIV4, .shift = 16, .size = 4 },
-};
-
-static struct clksrc_clk clk_sclk_uart1 = {
-       .clk            = {
-               .name           = "uclk1",
-               .devname        = "s5pv210-uart.1",
-               .enable         = s5pv210_clk_mask0_ctrl,
-               .ctrlbit        = (1 << 13),
-       },
-       .sources = &clkset_uart,
-       .reg_src = { .reg = S5P_CLK_SRC4, .shift = 20, .size = 4 },
-       .reg_div = { .reg = S5P_CLK_DIV4, .shift = 20, .size = 4 },
-};
-
-static struct clksrc_clk clk_sclk_uart2 = {
-       .clk            = {
-               .name           = "uclk1",
-               .devname        = "s5pv210-uart.2",
-               .enable         = s5pv210_clk_mask0_ctrl,
-               .ctrlbit        = (1 << 14),
-       },
-       .sources = &clkset_uart,
-       .reg_src = { .reg = S5P_CLK_SRC4, .shift = 24, .size = 4 },
-       .reg_div = { .reg = S5P_CLK_DIV4, .shift = 24, .size = 4 },
-};
-
-static struct clksrc_clk clk_sclk_uart3        = {
-       .clk            = {
-               .name           = "uclk1",
-               .devname        = "s5pv210-uart.3",
-               .enable         = s5pv210_clk_mask0_ctrl,
-               .ctrlbit        = (1 << 15),
-       },
-       .sources = &clkset_uart,
-       .reg_src = { .reg = S5P_CLK_SRC4, .shift = 28, .size = 4 },
-       .reg_div = { .reg = S5P_CLK_DIV4, .shift = 28, .size = 4 },
-};
-
-static struct clksrc_clk clk_sclk_mmc0 = {
-       .clk            = {
-               .name           = "sclk_mmc",
-               .devname        = "s3c-sdhci.0",
-               .enable         = s5pv210_clk_mask0_ctrl,
-               .ctrlbit        = (1 << 8),
-       },
-       .sources = &clkset_group2,
-       .reg_src = { .reg = S5P_CLK_SRC4, .shift = 0, .size = 4 },
-       .reg_div = { .reg = S5P_CLK_DIV4, .shift = 0, .size = 4 },
-};
-
-static struct clksrc_clk clk_sclk_mmc1 = {
-       .clk            = {
-               .name           = "sclk_mmc",
-               .devname        = "s3c-sdhci.1",
-               .enable         = s5pv210_clk_mask0_ctrl,
-               .ctrlbit        = (1 << 9),
-       },
-       .sources = &clkset_group2,
-       .reg_src = { .reg = S5P_CLK_SRC4, .shift = 4, .size = 4 },
-       .reg_div = { .reg = S5P_CLK_DIV4, .shift = 4, .size = 4 },
-};
-
-static struct clksrc_clk clk_sclk_mmc2 = {
-       .clk            = {
-               .name           = "sclk_mmc",
-               .devname        = "s3c-sdhci.2",
-               .enable         = s5pv210_clk_mask0_ctrl,
-               .ctrlbit        = (1 << 10),
-       },
-       .sources = &clkset_group2,
-       .reg_src = { .reg = S5P_CLK_SRC4, .shift = 8, .size = 4 },
-       .reg_div = { .reg = S5P_CLK_DIV4, .shift = 8, .size = 4 },
-};
-
-static struct clksrc_clk clk_sclk_mmc3 = {
-       .clk            = {
-               .name           = "sclk_mmc",
-               .devname        = "s3c-sdhci.3",
-               .enable         = s5pv210_clk_mask0_ctrl,
-               .ctrlbit        = (1 << 11),
-       },
-       .sources = &clkset_group2,
-       .reg_src = { .reg = S5P_CLK_SRC4, .shift = 12, .size = 4 },
-       .reg_div = { .reg = S5P_CLK_DIV4, .shift = 12, .size = 4 },
-};
-
-static struct clksrc_clk clk_sclk_spi0 = {
-       .clk            = {
-               .name           = "sclk_spi",
-               .devname        = "s5pv210-spi.0",
-               .enable         = s5pv210_clk_mask0_ctrl,
-               .ctrlbit        = (1 << 16),
-       },
-       .sources = &clkset_group2,
-       .reg_src = { .reg = S5P_CLK_SRC5, .shift = 0, .size = 4 },
-       .reg_div = { .reg = S5P_CLK_DIV5, .shift = 0, .size = 4 },
-       };
-
-static struct clksrc_clk clk_sclk_spi1 = {
-       .clk            = {
-               .name           = "sclk_spi",
-               .devname        = "s5pv210-spi.1",
-               .enable         = s5pv210_clk_mask0_ctrl,
-               .ctrlbit        = (1 << 17),
-       },
-       .sources = &clkset_group2,
-       .reg_src = { .reg = S5P_CLK_SRC5, .shift = 4, .size = 4 },
-       .reg_div = { .reg = S5P_CLK_DIV5, .shift = 4, .size = 4 },
-       };
-
-
-static struct clksrc_clk *clksrc_cdev[] = {
-       &clk_sclk_uart0,
-       &clk_sclk_uart1,
-       &clk_sclk_uart2,
-       &clk_sclk_uart3,
-       &clk_sclk_mmc0,
-       &clk_sclk_mmc1,
-       &clk_sclk_mmc2,
-       &clk_sclk_mmc3,
-       &clk_sclk_spi0,
-       &clk_sclk_spi1,
-};
-
-static struct clk *clk_cdev[] = {
-       &clk_hsmmc0,
-       &clk_hsmmc1,
-       &clk_hsmmc2,
-       &clk_hsmmc3,
-       &clk_pdma0,
-       &clk_pdma1,
-};
-
-/* Clock initialisation code */
-static struct clksrc_clk *sysclks[] = {
-       &clk_mout_apll,
-       &clk_mout_epll,
-       &clk_mout_mpll,
-       &clk_armclk,
-       &clk_hclk_msys,
-       &clk_sclk_a2m,
-       &clk_hclk_dsys,
-       &clk_hclk_psys,
-       &clk_pclk_msys,
-       &clk_pclk_dsys,
-       &clk_pclk_psys,
-       &clk_vpllsrc,
-       &clk_sclk_vpll,
-       &clk_mout_dmc0,
-       &clk_sclk_dmc0,
-       &clk_sclk_audio0,
-       &clk_sclk_audio1,
-       &clk_sclk_audio2,
-       &clk_sclk_spdif,
-};
-
-static u32 epll_div[][6] = {
-       {  48000000, 0, 48, 3, 3, 0 },
-       {  96000000, 0, 48, 3, 2, 0 },
-       { 144000000, 1, 72, 3, 2, 0 },
-       { 192000000, 0, 48, 3, 1, 0 },
-       { 288000000, 1, 72, 3, 1, 0 },
-       {  32750000, 1, 65, 3, 4, 35127 },
-       {  32768000, 1, 65, 3, 4, 35127 },
-       {  45158400, 0, 45, 3, 3, 10355 },
-       {  45000000, 0, 45, 3, 3, 10355 },
-       {  45158000, 0, 45, 3, 3, 10355 },
-       {  49125000, 0, 49, 3, 3, 9961 },
-       {  49152000, 0, 49, 3, 3, 9961 },
-       {  67737600, 1, 67, 3, 3, 48366 },
-       {  67738000, 1, 67, 3, 3, 48366 },
-       {  73800000, 1, 73, 3, 3, 47710 },
-       {  73728000, 1, 73, 3, 3, 47710 },
-       {  36000000, 1, 32, 3, 4, 0 },
-       {  60000000, 1, 60, 3, 3, 0 },
-       {  72000000, 1, 72, 3, 3, 0 },
-       {  80000000, 1, 80, 3, 3, 0 },
-       {  84000000, 0, 42, 3, 2, 0 },
-       {  50000000, 0, 50, 3, 3, 0 },
-};
-
-static int s5pv210_epll_set_rate(struct clk *clk, unsigned long rate)
-{
-       unsigned int epll_con, epll_con_k;
-       unsigned int i;
-
-       /* Return if nothing changed */
-       if (clk->rate == rate)
-               return 0;
-
-       epll_con = __raw_readl(S5P_EPLL_CON);
-       epll_con_k = __raw_readl(S5P_EPLL_CON1);
-
-       epll_con_k &= ~PLL46XX_KDIV_MASK;
-       epll_con &= ~(1 << 27 |
-                       PLL46XX_MDIV_MASK << PLL46XX_MDIV_SHIFT |
-                       PLL46XX_PDIV_MASK << PLL46XX_PDIV_SHIFT |
-                       PLL46XX_SDIV_MASK << PLL46XX_SDIV_SHIFT);
-
-       for (i = 0; i < ARRAY_SIZE(epll_div); i++) {
-               if (epll_div[i][0] == rate) {
-                       epll_con_k |= epll_div[i][5] << 0;
-                       epll_con |= (epll_div[i][1] << 27 |
-                                       epll_div[i][2] << PLL46XX_MDIV_SHIFT |
-                                       epll_div[i][3] << PLL46XX_PDIV_SHIFT |
-                                       epll_div[i][4] << PLL46XX_SDIV_SHIFT);
-                       break;
-               }
-       }
-
-       if (i == ARRAY_SIZE(epll_div)) {
-               printk(KERN_ERR "%s: Invalid Clock EPLL Frequency\n",
-                               __func__);
-               return -EINVAL;
-       }
-
-       __raw_writel(epll_con, S5P_EPLL_CON);
-       __raw_writel(epll_con_k, S5P_EPLL_CON1);
-
-       printk(KERN_WARNING "EPLL Rate changes from %lu to %lu\n",
-                       clk->rate, rate);
-
-       clk->rate = rate;
-
-       return 0;
-}
-
-static struct clk_ops s5pv210_epll_ops = {
-       .set_rate = s5pv210_epll_set_rate,
-       .get_rate = s5p_epll_get_rate,
-};
-
-static u32 vpll_div[][5] = {
-       {  54000000, 3, 53, 3, 0 },
-       { 108000000, 3, 53, 2, 0 },
-};
-
-static unsigned long s5pv210_vpll_get_rate(struct clk *clk)
-{
-       return clk->rate;
-}
-
-static int s5pv210_vpll_set_rate(struct clk *clk, unsigned long rate)
-{
-       unsigned int vpll_con;
-       unsigned int i;
-
-       /* Return if nothing changed */
-       if (clk->rate == rate)
-               return 0;
-
-       vpll_con = __raw_readl(S5P_VPLL_CON);
-       vpll_con &= ~(0x1 << 27 |                                       \
-                       PLL90XX_MDIV_MASK << PLL90XX_MDIV_SHIFT |       \
-                       PLL90XX_PDIV_MASK << PLL90XX_PDIV_SHIFT |       \
-                       PLL90XX_SDIV_MASK << PLL90XX_SDIV_SHIFT);
-
-       for (i = 0; i < ARRAY_SIZE(vpll_div); i++) {
-               if (vpll_div[i][0] == rate) {
-                       vpll_con |= vpll_div[i][1] << PLL90XX_PDIV_SHIFT;
-                       vpll_con |= vpll_div[i][2] << PLL90XX_MDIV_SHIFT;
-                       vpll_con |= vpll_div[i][3] << PLL90XX_SDIV_SHIFT;
-                       vpll_con |= vpll_div[i][4] << 27;
-                       break;
-               }
-       }
-
-       if (i == ARRAY_SIZE(vpll_div)) {
-               printk(KERN_ERR "%s: Invalid Clock VPLL Frequency\n",
-                               __func__);
-               return -EINVAL;
-       }
-
-       __raw_writel(vpll_con, S5P_VPLL_CON);
-
-       /* Wait for VPLL lock */
-       while (!(__raw_readl(S5P_VPLL_CON) & (1 << PLL90XX_LOCKED_SHIFT)))
-               continue;
-
-       clk->rate = rate;
-       return 0;
-}
-static struct clk_ops s5pv210_vpll_ops = {
-       .get_rate = s5pv210_vpll_get_rate,
-       .set_rate = s5pv210_vpll_set_rate,
-};
-
-void __init_or_cpufreq s5pv210_setup_clocks(void)
-{
-       struct clk *xtal_clk;
-       unsigned long vpllsrc;
-       unsigned long armclk;
-       unsigned long hclk_msys;
-       unsigned long hclk_dsys;
-       unsigned long hclk_psys;
-       unsigned long pclk_msys;
-       unsigned long pclk_dsys;
-       unsigned long pclk_psys;
-       unsigned long apll;
-       unsigned long mpll;
-       unsigned long epll;
-       unsigned long vpll;
-       unsigned int ptr;
-       u32 clkdiv0, clkdiv1;
-
-       /* Set functions for clk_fout_epll */
-       clk_fout_epll.enable = s5p_epll_enable;
-       clk_fout_epll.ops = &s5pv210_epll_ops;
-
-       printk(KERN_DEBUG "%s: registering clocks\n", __func__);
-
-       clkdiv0 = __raw_readl(S5P_CLK_DIV0);
-       clkdiv1 = __raw_readl(S5P_CLK_DIV1);
-
-       printk(KERN_DEBUG "%s: clkdiv0 = %08x, clkdiv1 = %08x\n",
-                               __func__, clkdiv0, clkdiv1);
-
-       xtal_clk = clk_get(NULL, "xtal");
-       BUG_ON(IS_ERR(xtal_clk));
-
-       xtal = clk_get_rate(xtal_clk);
-       clk_put(xtal_clk);
-
-       printk(KERN_DEBUG "%s: xtal is %ld\n", __func__, xtal);
-
-       apll = s5p_get_pll45xx(xtal, __raw_readl(S5P_APLL_CON), pll_4508);
-       mpll = s5p_get_pll45xx(xtal, __raw_readl(S5P_MPLL_CON), pll_4502);
-       epll = s5p_get_pll46xx(xtal, __raw_readl(S5P_EPLL_CON),
-                               __raw_readl(S5P_EPLL_CON1), pll_4600);
-       vpllsrc = clk_get_rate(&clk_vpllsrc.clk);
-       vpll = s5p_get_pll45xx(vpllsrc, __raw_readl(S5P_VPLL_CON), pll_4502);
-
-       clk_fout_apll.ops = &clk_fout_apll_ops;
-       clk_fout_mpll.rate = mpll;
-       clk_fout_epll.rate = epll;
-       clk_fout_vpll.ops = &s5pv210_vpll_ops;
-       clk_fout_vpll.rate = vpll;
-
-       printk(KERN_INFO "S5PV210: PLL settings, A=%ld, M=%ld, E=%ld V=%ld",
-                       apll, mpll, epll, vpll);
-
-       armclk = clk_get_rate(&clk_armclk.clk);
-       hclk_msys = clk_get_rate(&clk_hclk_msys.clk);
-       hclk_dsys = clk_get_rate(&clk_hclk_dsys.clk);
-       hclk_psys = clk_get_rate(&clk_hclk_psys.clk);
-       pclk_msys = clk_get_rate(&clk_pclk_msys.clk);
-       pclk_dsys = clk_get_rate(&clk_pclk_dsys.clk);
-       pclk_psys = clk_get_rate(&clk_pclk_psys.clk);
-
-       printk(KERN_INFO "S5PV210: ARMCLK=%ld, HCLKM=%ld, HCLKD=%ld\n"
-                        "HCLKP=%ld, PCLKM=%ld, PCLKD=%ld, PCLKP=%ld\n",
-                       armclk, hclk_msys, hclk_dsys, hclk_psys,
-                       pclk_msys, pclk_dsys, pclk_psys);
-
-       clk_f.rate = armclk;
-       clk_h.rate = hclk_psys;
-       clk_p.rate = pclk_psys;
-
-       for (ptr = 0; ptr < ARRAY_SIZE(clksrcs); ptr++)
-               s3c_set_clksrc(&clksrcs[ptr], true);
-}
-
-static struct clk *clks[] __initdata = {
-       &clk_sclk_hdmi27m,
-       &clk_sclk_hdmiphy,
-       &clk_sclk_usbphy0,
-       &clk_sclk_usbphy1,
-       &clk_pcmcdclk0,
-       &clk_pcmcdclk1,
-       &clk_pcmcdclk2,
-};
-
-static struct clk_lookup s5pv210_clk_lookup[] = {
-       CLKDEV_INIT(NULL, "clk_uart_baud0", &clk_p),
-       CLKDEV_INIT("s5pv210-uart.0", "clk_uart_baud1", &clk_sclk_uart0.clk),
-       CLKDEV_INIT("s5pv210-uart.1", "clk_uart_baud1", &clk_sclk_uart1.clk),
-       CLKDEV_INIT("s5pv210-uart.2", "clk_uart_baud1", &clk_sclk_uart2.clk),
-       CLKDEV_INIT("s5pv210-uart.3", "clk_uart_baud1", &clk_sclk_uart3.clk),
-       CLKDEV_INIT("s3c-sdhci.0", "mmc_busclk.0", &clk_hsmmc0),
-       CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.0", &clk_hsmmc1),
-       CLKDEV_INIT("s3c-sdhci.2", "mmc_busclk.0", &clk_hsmmc2),
-       CLKDEV_INIT("s3c-sdhci.3", "mmc_busclk.0", &clk_hsmmc3),
-       CLKDEV_INIT("s3c-sdhci.0", "mmc_busclk.2", &clk_sclk_mmc0.clk),
-       CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.2", &clk_sclk_mmc1.clk),
-       CLKDEV_INIT("s3c-sdhci.2", "mmc_busclk.2", &clk_sclk_mmc2.clk),
-       CLKDEV_INIT("s3c-sdhci.3", "mmc_busclk.2", &clk_sclk_mmc3.clk),
-       CLKDEV_INIT(NULL, "spi_busclk0", &clk_p),
-       CLKDEV_INIT("s5pv210-spi.0", "spi_busclk1", &clk_sclk_spi0.clk),
-       CLKDEV_INIT("s5pv210-spi.1", "spi_busclk1", &clk_sclk_spi1.clk),
-       CLKDEV_INIT("dma-pl330.0", "apb_pclk", &clk_pdma0),
-       CLKDEV_INIT("dma-pl330.1", "apb_pclk", &clk_pdma1),
-};
-
-void __init s5pv210_register_clocks(void)
-{
-       int ptr;
-
-       s3c24xx_register_clocks(clks, ARRAY_SIZE(clks));
-
-       for (ptr = 0; ptr < ARRAY_SIZE(sysclks); ptr++)
-               s3c_register_clksrc(sysclks[ptr], 1);
-
-       for (ptr = 0; ptr < ARRAY_SIZE(sclk_tv); ptr++)
-               s3c_register_clksrc(sclk_tv[ptr], 1);
-
-       for (ptr = 0; ptr < ARRAY_SIZE(clksrc_cdev); ptr++)
-               s3c_register_clksrc(clksrc_cdev[ptr], 1);
-
-       s3c_register_clksrc(clksrcs, ARRAY_SIZE(clksrcs));
-       s3c_register_clocks(init_clocks, ARRAY_SIZE(init_clocks));
-
-       s3c_register_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off));
-       s3c_disable_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off));
-       clkdev_add_table(s5pv210_clk_lookup, ARRAY_SIZE(s5pv210_clk_lookup));
-
-       s3c24xx_register_clocks(clk_cdev, ARRAY_SIZE(clk_cdev));
-       for (ptr = 0; ptr < ARRAY_SIZE(clk_cdev); ptr++)
-               s3c_disable_clocks(clk_cdev[ptr], 1);
-
-}
diff --git a/arch/arm/mach-s5pv210/common.c b/arch/arm/mach-s5pv210/common.c
deleted file mode 100644 (file)
index 7024dcd..0000000
+++ /dev/null
@@ -1,279 +0,0 @@
-/*
- * Copyright (c) 2009-2011 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * Common Codes for S5PV210
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/interrupt.h>
-#include <linux/list.h>
-#include <linux/timer.h>
-#include <linux/init.h>
-#include <linux/module.h>
-#include <linux/clk.h>
-#include <linux/io.h>
-#include <linux/device.h>
-#include <clocksource/samsung_pwm.h>
-#include <linux/platform_device.h>
-#include <linux/sched.h>
-#include <linux/dma-mapping.h>
-#include <linux/serial_core.h>
-#include <linux/serial_s3c.h>
-
-#include <asm/proc-fns.h>
-#include <asm/mach/arch.h>
-#include <asm/mach/map.h>
-#include <asm/mach/irq.h>
-
-#include <mach/map.h>
-#include <mach/regs-clock.h>
-
-#include <plat/cpu.h>
-#include <plat/clock.h>
-#include <plat/devs.h>
-#include <plat/sdhci.h>
-#include <plat/adc-core.h>
-#include <plat/ata-core.h>
-#include <plat/fb-core.h>
-#include <plat/fimc-core.h>
-#include <plat/iic-core.h>
-#include <plat/keypad-core.h>
-#include <plat/pwm-core.h>
-#include <plat/tv-core.h>
-#include <plat/spi-core.h>
-
-#include "common.h"
-
-static const char name_s5pv210[] = "S5PV210/S5PC110";
-
-static struct cpu_table cpu_ids[] __initdata = {
-       {
-               .idcode         = S5PV210_CPU_ID,
-               .idmask         = S5PV210_CPU_MASK,
-               .map_io         = s5pv210_map_io,
-               .init_clocks    = s5pv210_init_clocks,
-               .init_uarts     = s5pv210_init_uarts,
-               .init           = s5pv210_init,
-               .name           = name_s5pv210,
-       },
-};
-
-/* Initial IO mappings */
-
-static struct map_desc s5pv210_iodesc[] __initdata = {
-       {
-               .virtual        = (unsigned long)S5P_VA_CHIPID,
-               .pfn            = __phys_to_pfn(S5PV210_PA_CHIPID),
-               .length         = SZ_4K,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = (unsigned long)S3C_VA_SYS,
-               .pfn            = __phys_to_pfn(S5PV210_PA_SYSCON),
-               .length         = SZ_64K,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = (unsigned long)S3C_VA_TIMER,
-               .pfn            = __phys_to_pfn(S5PV210_PA_TIMER),
-               .length         = SZ_16K,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = (unsigned long)S3C_VA_WATCHDOG,
-               .pfn            = __phys_to_pfn(S5PV210_PA_WATCHDOG),
-               .length         = SZ_4K,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = (unsigned long)S5P_VA_SROMC,
-               .pfn            = __phys_to_pfn(S5PV210_PA_SROMC),
-               .length         = SZ_4K,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = (unsigned long)S5P_VA_SYSTIMER,
-               .pfn            = __phys_to_pfn(S5PV210_PA_SYSTIMER),
-               .length         = SZ_4K,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = (unsigned long)S5P_VA_GPIO,
-               .pfn            = __phys_to_pfn(S5PV210_PA_GPIO),
-               .length         = SZ_4K,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = (unsigned long)VA_VIC0,
-               .pfn            = __phys_to_pfn(S5PV210_PA_VIC0),
-               .length         = SZ_16K,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = (unsigned long)VA_VIC1,
-               .pfn            = __phys_to_pfn(S5PV210_PA_VIC1),
-               .length         = SZ_16K,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = (unsigned long)VA_VIC2,
-               .pfn            = __phys_to_pfn(S5PV210_PA_VIC2),
-               .length         = SZ_16K,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = (unsigned long)VA_VIC3,
-               .pfn            = __phys_to_pfn(S5PV210_PA_VIC3),
-               .length         = SZ_16K,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = (unsigned long)S3C_VA_UART,
-               .pfn            = __phys_to_pfn(S3C_PA_UART),
-               .length         = SZ_512K,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = (unsigned long)S5P_VA_DMC0,
-               .pfn            = __phys_to_pfn(S5PV210_PA_DMC0),
-               .length         = SZ_4K,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = (unsigned long)S5P_VA_DMC1,
-               .pfn            = __phys_to_pfn(S5PV210_PA_DMC1),
-               .length         = SZ_4K,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = (unsigned long)S3C_VA_USB_HSPHY,
-               .pfn            =__phys_to_pfn(S5PV210_PA_HSPHY),
-               .length         = SZ_4K,
-               .type           = MT_DEVICE,
-       }
-};
-
-void s5pv210_restart(enum reboot_mode mode, const char *cmd)
-{
-       __raw_writel(0x1, S5P_SWRESET);
-}
-
-static struct samsung_pwm_variant s5pv210_pwm_variant = {
-       .bits           = 32,
-       .div_base       = 0,
-       .has_tint_cstat = true,
-       .tclk_mask      = (1 << 5),
-};
-
-void __init samsung_set_timer_source(unsigned int event, unsigned int source)
-{
-       s5pv210_pwm_variant.output_mask = BIT(SAMSUNG_PWM_NUM) - 1;
-       s5pv210_pwm_variant.output_mask &= ~(BIT(event) | BIT(source));
-}
-
-void __init samsung_timer_init(void)
-{
-       unsigned int timer_irqs[SAMSUNG_PWM_NUM] = {
-               IRQ_TIMER0_VIC, IRQ_TIMER1_VIC, IRQ_TIMER2_VIC,
-               IRQ_TIMER3_VIC, IRQ_TIMER4_VIC,
-       };
-
-       samsung_pwm_clocksource_init(S3C_VA_TIMER,
-                                       timer_irqs, &s5pv210_pwm_variant);
-}
-
-/*
- * s5pv210_map_io
- *
- * register the standard cpu IO areas
- */
-
-void __init s5pv210_init_io(struct map_desc *mach_desc, int size)
-{
-       /* initialize the io descriptors we need for initialization */
-       iotable_init(s5pv210_iodesc, ARRAY_SIZE(s5pv210_iodesc));
-       if (mach_desc)
-               iotable_init(mach_desc, size);
-
-       /* detect cpu id and rev. */
-       s5p_init_cpu(S5P_VA_CHIPID);
-
-       s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids));
-
-       samsung_pwm_set_platdata(&s5pv210_pwm_variant);
-}
-
-void __init s5pv210_map_io(void)
-{
-       /* initialise device information early */
-       s5pv210_default_sdhci0();
-       s5pv210_default_sdhci1();
-       s5pv210_default_sdhci2();
-       s5pv210_default_sdhci3();
-
-       s3c_adc_setname("samsung-adc-v3");
-
-       s3c_cfcon_setname("s5pv210-pata");
-
-       s3c_fimc_setname(0, "s5pv210-fimc");
-       s3c_fimc_setname(1, "s5pv210-fimc");
-       s3c_fimc_setname(2, "s5pv210-fimc");
-
-       /* the i2c devices are directly compatible with s3c2440 */
-       s3c_i2c0_setname("s3c2440-i2c");
-       s3c_i2c1_setname("s3c2440-i2c");
-       s3c_i2c2_setname("s3c2440-i2c");
-
-       s3c_fb_setname("s5pv210-fb");
-
-       /* Use s5pv210-keypad instead of samsung-keypad */
-       samsung_keypad_setname("s5pv210-keypad");
-
-       /* setup TV devices */
-       s5p_hdmi_setname("s5pv210-hdmi");
-
-       s3c64xx_spi_setname("s5pv210-spi");
-}
-
-void __init s5pv210_init_clocks(int xtal)
-{
-       printk(KERN_DEBUG "%s: initializing clocks\n", __func__);
-
-       s3c24xx_register_baseclocks(xtal);
-       s5p_register_clocks(xtal);
-       s5pv210_register_clocks();
-       s5pv210_setup_clocks();
-}
-
-void __init s5pv210_init_irq(void)
-{
-       u32 vic[4];     /* S5PV210 supports 4 VIC */
-
-       /* All the VICs are fully populated. */
-       vic[0] = ~0;
-       vic[1] = ~0;
-       vic[2] = ~0;
-       vic[3] = ~0;
-
-       s5p_init_irq(vic, ARRAY_SIZE(vic));
-}
-
-struct bus_type s5pv210_subsys = {
-       .name           = "s5pv210-core",
-       .dev_name       = "s5pv210-core",
-};
-
-static struct device s5pv210_dev = {
-       .bus    = &s5pv210_subsys,
-};
-
-static int __init s5pv210_core_init(void)
-{
-       return subsys_system_register(&s5pv210_subsys, NULL);
-}
-core_initcall(s5pv210_core_init);
-
-int __init s5pv210_init(void)
-{
-       printk(KERN_INFO "S5PV210: Initializing architecture\n");
-       return device_register(&s5pv210_dev);
-}
-
-/* uart registration process */
-
-void __init s5pv210_init_uarts(struct s3c2410_uartcfg *cfg, int no)
-{
-       s3c24xx_init_uartdevs("s5pv210-uart", s5p_uart_resources, cfg, no);
-}
index fe1beb54e548ee88d9259a2a310a6b7e73ba0904..2ad387c1ecf0498f6ebdacbab69d8810199e1cd6 100644 (file)
 #ifndef __ARCH_ARM_MACH_S5PV210_COMMON_H
 #define __ARCH_ARM_MACH_S5PV210_COMMON_H
 
-#include <linux/reboot.h>
-
-void s5pv210_init_io(struct map_desc *mach_desc, int size);
-void s5pv210_init_irq(void);
-
-void s5pv210_register_clocks(void);
-void s5pv210_setup_clocks(void);
-
-void s5pv210_restart(enum reboot_mode mode, const char *cmd);
-
-extern  int s5pv210_init(void);
-extern void s5pv210_map_io(void);
-extern void s5pv210_init_clocks(int xtal);
-extern void s5pv210_init_uarts(struct s3c2410_uartcfg *cfg, int no);
+#ifdef CONFIG_PM_SLEEP
+u32 exynos_get_eint_wake_mask(void);
+void s5pv210_cpu_resume(void);
+void s5pv210_pm_init(void);
+#else
+static inline void s5pv210_pm_init(void) {}
+#endif
 
 #endif /* __ARCH_ARM_MACH_S5PV210_COMMON_H */
diff --git a/arch/arm/mach-s5pv210/dev-audio.c b/arch/arm/mach-s5pv210/dev-audio.c
deleted file mode 100644 (file)
index 2d67361..0000000
+++ /dev/null
@@ -1,246 +0,0 @@
-/* linux/arch/arm/mach-s5pv210/dev-audio.c
- *
- * Copyright (c) 2010 Samsung Electronics Co. Ltd
- *     Jaswinder Singh <jassi.brar@samsung.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#include <linux/platform_device.h>
-#include <linux/dma-mapping.h>
-#include <linux/gpio.h>
-
-#include <plat/gpio-cfg.h>
-#include <linux/platform_data/asoc-s3c.h>
-
-#include <mach/map.h>
-#include <mach/dma.h>
-#include <mach/irqs.h>
-
-#define S5PV210_AUDSS_INT_MEM  (0xC0000000)
-
-static int s5pv210_cfg_i2s(struct platform_device *pdev)
-{
-       /* configure GPIO for i2s port */
-       switch (pdev->id) {
-       case 0:
-               s3c_gpio_cfgpin_range(S5PV210_GPI(0), 7, S3C_GPIO_SFN(2));
-               break;
-       case 1:
-               s3c_gpio_cfgpin_range(S5PV210_GPC0(0), 5, S3C_GPIO_SFN(2));
-               break;
-       case 2:
-               s3c_gpio_cfgpin_range(S5PV210_GPC1(0), 5, S3C_GPIO_SFN(4));
-               break;
-       default:
-               printk(KERN_ERR "Invalid Device %d\n", pdev->id);
-               return -EINVAL;
-       }
-
-       return 0;
-}
-
-static struct s3c_audio_pdata i2sv5_pdata = {
-       .cfg_gpio = s5pv210_cfg_i2s,
-       .type = {
-               .i2s = {
-                       .quirks = QUIRK_PRI_6CHAN | QUIRK_SEC_DAI
-                                        | QUIRK_NEED_RSTCLR,
-                       .idma_addr = S5PV210_AUDSS_INT_MEM,
-               },
-       },
-};
-
-static struct resource s5pv210_iis0_resource[] = {
-       [0] = DEFINE_RES_MEM(S5PV210_PA_IIS0, SZ_256),
-       [1] = DEFINE_RES_DMA(DMACH_I2S0_TX),
-       [2] = DEFINE_RES_DMA(DMACH_I2S0_RX),
-       [3] = DEFINE_RES_DMA(DMACH_I2S0S_TX),
-};
-
-struct platform_device s5pv210_device_iis0 = {
-       .name = "samsung-i2s",
-       .id = 0,
-       .num_resources    = ARRAY_SIZE(s5pv210_iis0_resource),
-       .resource         = s5pv210_iis0_resource,
-       .dev = {
-               .platform_data = &i2sv5_pdata,
-       },
-};
-
-static struct s3c_audio_pdata i2sv3_pdata = {
-       .cfg_gpio = s5pv210_cfg_i2s,
-};
-
-static struct resource s5pv210_iis1_resource[] = {
-       [0] = DEFINE_RES_MEM(S5PV210_PA_IIS1, SZ_256),
-       [1] = DEFINE_RES_DMA(DMACH_I2S1_TX),
-       [2] = DEFINE_RES_DMA(DMACH_I2S1_RX),
-};
-
-struct platform_device s5pv210_device_iis1 = {
-       .name             = "samsung-i2s",
-       .id               = 1,
-       .num_resources    = ARRAY_SIZE(s5pv210_iis1_resource),
-       .resource         = s5pv210_iis1_resource,
-       .dev = {
-               .platform_data = &i2sv3_pdata,
-       },
-};
-
-static struct resource s5pv210_iis2_resource[] = {
-       [0] = DEFINE_RES_MEM(S5PV210_PA_IIS2, SZ_256),
-       [1] = DEFINE_RES_DMA(DMACH_I2S2_TX),
-       [2] = DEFINE_RES_DMA(DMACH_I2S2_RX),
-};
-
-struct platform_device s5pv210_device_iis2 = {
-       .name             = "samsung-i2s",
-       .id               = 2,
-       .num_resources    = ARRAY_SIZE(s5pv210_iis2_resource),
-       .resource         = s5pv210_iis2_resource,
-       .dev = {
-               .platform_data = &i2sv3_pdata,
-       },
-};
-
-/* PCM Controller platform_devices */
-
-static int s5pv210_pcm_cfg_gpio(struct platform_device *pdev)
-{
-       switch (pdev->id) {
-       case 0:
-               s3c_gpio_cfgpin_range(S5PV210_GPI(0), 5, S3C_GPIO_SFN(3));
-               break;
-       case 1:
-               s3c_gpio_cfgpin_range(S5PV210_GPC0(0), 5, S3C_GPIO_SFN(3));
-               break;
-       case 2:
-               s3c_gpio_cfgpin_range(S5PV210_GPC1(0), 5, S3C_GPIO_SFN(2));
-               break;
-       default:
-               printk(KERN_DEBUG "Invalid PCM Controller number!");
-               return -EINVAL;
-       }
-
-       return 0;
-}
-
-static struct s3c_audio_pdata s3c_pcm_pdata = {
-       .cfg_gpio = s5pv210_pcm_cfg_gpio,
-};
-
-static struct resource s5pv210_pcm0_resource[] = {
-       [0] = DEFINE_RES_MEM(S5PV210_PA_PCM0, SZ_256),
-       [1] = DEFINE_RES_DMA(DMACH_PCM0_TX),
-       [2] = DEFINE_RES_DMA(DMACH_PCM0_RX),
-};
-
-struct platform_device s5pv210_device_pcm0 = {
-       .name             = "samsung-pcm",
-       .id               = 0,
-       .num_resources    = ARRAY_SIZE(s5pv210_pcm0_resource),
-       .resource         = s5pv210_pcm0_resource,
-       .dev = {
-               .platform_data = &s3c_pcm_pdata,
-       },
-};
-
-static struct resource s5pv210_pcm1_resource[] = {
-       [0] = DEFINE_RES_MEM(S5PV210_PA_PCM1, SZ_256),
-       [1] = DEFINE_RES_DMA(DMACH_PCM1_TX),
-       [2] = DEFINE_RES_DMA(DMACH_PCM1_RX),
-};
-
-struct platform_device s5pv210_device_pcm1 = {
-       .name             = "samsung-pcm",
-       .id               = 1,
-       .num_resources    = ARRAY_SIZE(s5pv210_pcm1_resource),
-       .resource         = s5pv210_pcm1_resource,
-       .dev = {
-               .platform_data = &s3c_pcm_pdata,
-       },
-};
-
-static struct resource s5pv210_pcm2_resource[] = {
-       [0] = DEFINE_RES_MEM(S5PV210_PA_PCM2, SZ_256),
-       [1] = DEFINE_RES_DMA(DMACH_PCM2_TX),
-       [2] = DEFINE_RES_DMA(DMACH_PCM2_RX),
-};
-
-struct platform_device s5pv210_device_pcm2 = {
-       .name             = "samsung-pcm",
-       .id               = 2,
-       .num_resources    = ARRAY_SIZE(s5pv210_pcm2_resource),
-       .resource         = s5pv210_pcm2_resource,
-       .dev = {
-               .platform_data = &s3c_pcm_pdata,
-       },
-};
-
-/* AC97 Controller platform devices */
-
-static int s5pv210_ac97_cfg_gpio(struct platform_device *pdev)
-{
-       return s3c_gpio_cfgpin_range(S5PV210_GPC0(0), 5, S3C_GPIO_SFN(4));
-}
-
-static struct resource s5pv210_ac97_resource[] = {
-       [0] = DEFINE_RES_MEM(S5PV210_PA_AC97, SZ_256),
-       [1] = DEFINE_RES_DMA(DMACH_AC97_PCMOUT),
-       [2] = DEFINE_RES_DMA(DMACH_AC97_PCMIN),
-       [3] = DEFINE_RES_DMA(DMACH_AC97_MICIN),
-       [4] = DEFINE_RES_IRQ(IRQ_AC97),
-};
-
-static struct s3c_audio_pdata s3c_ac97_pdata = {
-       .cfg_gpio = s5pv210_ac97_cfg_gpio,
-};
-
-static u64 s5pv210_ac97_dmamask = DMA_BIT_MASK(32);
-
-struct platform_device s5pv210_device_ac97 = {
-       .name             = "samsung-ac97",
-       .id               = -1,
-       .num_resources    = ARRAY_SIZE(s5pv210_ac97_resource),
-       .resource         = s5pv210_ac97_resource,
-       .dev = {
-               .platform_data = &s3c_ac97_pdata,
-               .dma_mask = &s5pv210_ac97_dmamask,
-               .coherent_dma_mask = DMA_BIT_MASK(32),
-       },
-};
-
-/* S/PDIF Controller platform_device */
-
-static int s5pv210_spdif_cfg_gpio(struct platform_device *pdev)
-{
-       s3c_gpio_cfgpin_range(S5PV210_GPC1(0), 2, S3C_GPIO_SFN(3));
-
-       return 0;
-}
-
-static struct resource s5pv210_spdif_resource[] = {
-       [0] = DEFINE_RES_MEM(S5PV210_PA_SPDIF, SZ_256),
-       [1] = DEFINE_RES_DMA(DMACH_SPDIF),
-};
-
-static struct s3c_audio_pdata samsung_spdif_pdata = {
-       .cfg_gpio = s5pv210_spdif_cfg_gpio,
-};
-
-static u64 s5pv210_spdif_dmamask = DMA_BIT_MASK(32);
-
-struct platform_device s5pv210_device_spdif = {
-       .name           = "samsung-spdif",
-       .id             = -1,
-       .num_resources  = ARRAY_SIZE(s5pv210_spdif_resource),
-       .resource       = s5pv210_spdif_resource,
-       .dev = {
-               .platform_data = &samsung_spdif_pdata,
-               .dma_mask = &s5pv210_spdif_dmamask,
-               .coherent_dma_mask = DMA_BIT_MASK(32),
-       },
-};
diff --git a/arch/arm/mach-s5pv210/dma.c b/arch/arm/mach-s5pv210/dma.c
deleted file mode 100644 (file)
index b8337e2..0000000
+++ /dev/null
@@ -1,130 +0,0 @@
-/* linux/arch/arm/mach-s5pv210/dma.c
- *
- * Copyright (c) 2011 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * Copyright (C) 2010 Samsung Electronics Co. Ltd.
- *     Jaswinder Singh <jassi.brar@samsung.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/dma-mapping.h>
-#include <linux/amba/bus.h>
-#include <linux/amba/pl330.h>
-
-#include <asm/irq.h>
-#include <plat/devs.h>
-#include <plat/irqs.h>
-
-#include <mach/map.h>
-#include <mach/irqs.h>
-#include <mach/dma.h>
-
-static u8 pdma0_peri[] = {
-       DMACH_UART0_RX,
-       DMACH_UART0_TX,
-       DMACH_UART1_RX,
-       DMACH_UART1_TX,
-       DMACH_UART2_RX,
-       DMACH_UART2_TX,
-       DMACH_UART3_RX,
-       DMACH_UART3_TX,
-       DMACH_MAX,
-       DMACH_I2S0_RX,
-       DMACH_I2S0_TX,
-       DMACH_I2S0S_TX,
-       DMACH_I2S1_RX,
-       DMACH_I2S1_TX,
-       DMACH_MAX,
-       DMACH_MAX,
-       DMACH_SPI0_RX,
-       DMACH_SPI0_TX,
-       DMACH_SPI1_RX,
-       DMACH_SPI1_TX,
-       DMACH_MAX,
-       DMACH_MAX,
-       DMACH_AC97_MICIN,
-       DMACH_AC97_PCMIN,
-       DMACH_AC97_PCMOUT,
-       DMACH_MAX,
-       DMACH_PWM,
-       DMACH_SPDIF,
-};
-
-static struct dma_pl330_platdata s5pv210_pdma0_pdata = {
-       .nr_valid_peri = ARRAY_SIZE(pdma0_peri),
-       .peri_id = pdma0_peri,
-};
-
-static AMBA_AHB_DEVICE(s5pv210_pdma0, "dma-pl330.0", 0x00041330,
-       S5PV210_PA_PDMA0, {IRQ_PDMA0}, &s5pv210_pdma0_pdata);
-
-static u8 pdma1_peri[] = {
-       DMACH_UART0_RX,
-       DMACH_UART0_TX,
-       DMACH_UART1_RX,
-       DMACH_UART1_TX,
-       DMACH_UART2_RX,
-       DMACH_UART2_TX,
-       DMACH_UART3_RX,
-       DMACH_UART3_TX,
-       DMACH_MAX,
-       DMACH_I2S0_RX,
-       DMACH_I2S0_TX,
-       DMACH_I2S0S_TX,
-       DMACH_I2S1_RX,
-       DMACH_I2S1_TX,
-       DMACH_I2S2_RX,
-       DMACH_I2S2_TX,
-       DMACH_SPI0_RX,
-       DMACH_SPI0_TX,
-       DMACH_SPI1_RX,
-       DMACH_SPI1_TX,
-       DMACH_MAX,
-       DMACH_MAX,
-       DMACH_PCM0_RX,
-       DMACH_PCM0_TX,
-       DMACH_PCM1_RX,
-       DMACH_PCM1_TX,
-       DMACH_MSM_REQ0,
-       DMACH_MSM_REQ1,
-       DMACH_MSM_REQ2,
-       DMACH_MSM_REQ3,
-       DMACH_PCM2_RX,
-       DMACH_PCM2_TX,
-};
-
-static struct dma_pl330_platdata s5pv210_pdma1_pdata = {
-       .nr_valid_peri = ARRAY_SIZE(pdma1_peri),
-       .peri_id = pdma1_peri,
-};
-
-static AMBA_AHB_DEVICE(s5pv210_pdma1, "dma-pl330.1", 0x00041330,
-       S5PV210_PA_PDMA1, {IRQ_PDMA1}, &s5pv210_pdma1_pdata);
-
-static int __init s5pv210_dma_init(void)
-{
-       dma_cap_set(DMA_SLAVE, s5pv210_pdma0_pdata.cap_mask);
-       dma_cap_set(DMA_CYCLIC, s5pv210_pdma0_pdata.cap_mask);
-       amba_device_register(&s5pv210_pdma0_device, &iomem_resource);
-
-       dma_cap_set(DMA_SLAVE, s5pv210_pdma1_pdata.cap_mask);
-       dma_cap_set(DMA_CYCLIC, s5pv210_pdma1_pdata.cap_mask);
-       amba_device_register(&s5pv210_pdma1_device, &iomem_resource);
-
-       return 0;
-}
-arch_initcall(s5pv210_dma_init);
diff --git a/arch/arm/mach-s5pv210/include/mach/debug-macro.S b/arch/arm/mach-s5pv210/include/mach/debug-macro.S
deleted file mode 100644 (file)
index 30b511a..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/* linux/arch/arm/mach-s5pv210/include/mach/debug-macro.S
- *
- * Copyright (c) 2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com/
- *
- * Based on arch/arm/mach-s3c6400/include/mach/debug-macro.S
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-/* pull in the relevant register and map files. */
-
-#include <linux/serial_s3c.h>
-#include <mach/map.h>
-
-       /* note, for the boot process to work we have to keep the UART
-        * virtual address aligned to an 1MiB boundary for the L1
-        * mapping the head code makes. We keep the UART virtual address
-        * aligned and add in the offset when we load the value here.
-        */
-
-       .macro addruart, rp, rv, tmp
-               ldr     \rp, = S3C_PA_UART
-               ldr     \rv, = S3C_VA_UART
-#if CONFIG_DEBUG_S3C_UART != 0
-               add     \rp, \rp, #(0x400 * CONFIG_DEBUG_S3C_UART)
-               add     \rv, \rv, #(0x400 * CONFIG_DEBUG_S3C_UART)
-#endif
-       .endm
-
-#define fifo_full fifo_full_s5pv210
-#define fifo_level fifo_level_s5pv210
-
-/* include the reset of the code which will do the work, we're only
- * compiling for a single cpu processor type so the default of s3c2440
- * will be fine with us.
- */
-
-#include <debug/samsung.S>
diff --git a/arch/arm/mach-s5pv210/include/mach/dma.h b/arch/arm/mach-s5pv210/include/mach/dma.h
deleted file mode 100644 (file)
index 201842a..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2010 Samsung Electronics Co. Ltd.
- *     Jaswinder Singh <jassi.brar@samsung.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef __MACH_DMA_H
-#define __MACH_DMA_H
-
-/* This platform uses the common DMA API driver for PL330 */
-#include <plat/dma-pl330.h>
-
-#endif /* __MACH_DMA_H */
diff --git a/arch/arm/mach-s5pv210/include/mach/gpio.h b/arch/arm/mach-s5pv210/include/mach/gpio.h
deleted file mode 100644 (file)
index 6c8b903..0000000
+++ /dev/null
@@ -1,140 +0,0 @@
-/* linux/arch/arm/mach-s5pv210/include/mach/gpio.h
- *
- * Copyright (c) 2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com/
- *
- * S5PV210 - GPIO lib support
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#ifndef __ASM_ARCH_GPIO_H
-#define __ASM_ARCH_GPIO_H __FILE__
-
-/* Practically, GPIO banks up to MP03 are the configurable gpio banks */
-
-/* GPIO bank sizes */
-#define S5PV210_GPIO_A0_NR     (8)
-#define S5PV210_GPIO_A1_NR     (4)
-#define S5PV210_GPIO_B_NR      (8)
-#define S5PV210_GPIO_C0_NR     (5)
-#define S5PV210_GPIO_C1_NR     (5)
-#define S5PV210_GPIO_D0_NR     (4)
-#define S5PV210_GPIO_D1_NR     (6)
-#define S5PV210_GPIO_E0_NR     (8)
-#define S5PV210_GPIO_E1_NR     (5)
-#define S5PV210_GPIO_F0_NR     (8)
-#define S5PV210_GPIO_F1_NR     (8)
-#define S5PV210_GPIO_F2_NR     (8)
-#define S5PV210_GPIO_F3_NR     (6)
-#define S5PV210_GPIO_G0_NR     (7)
-#define S5PV210_GPIO_G1_NR     (7)
-#define S5PV210_GPIO_G2_NR     (7)
-#define S5PV210_GPIO_G3_NR     (7)
-#define S5PV210_GPIO_H0_NR     (8)
-#define S5PV210_GPIO_H1_NR     (8)
-#define S5PV210_GPIO_H2_NR     (8)
-#define S5PV210_GPIO_H3_NR     (8)
-#define S5PV210_GPIO_I_NR      (7)
-#define S5PV210_GPIO_J0_NR     (8)
-#define S5PV210_GPIO_J1_NR     (6)
-#define S5PV210_GPIO_J2_NR     (8)
-#define S5PV210_GPIO_J3_NR     (8)
-#define S5PV210_GPIO_J4_NR     (5)
-
-#define S5PV210_GPIO_MP01_NR   (8)
-#define S5PV210_GPIO_MP02_NR   (4)
-#define S5PV210_GPIO_MP03_NR   (8)
-#define S5PV210_GPIO_MP04_NR   (8)
-#define S5PV210_GPIO_MP05_NR   (8)
-
-/* GPIO bank numbers */
-
-/* CONFIG_S3C_GPIO_SPACE allows the user to select extra
- * space for debugging purposes so that any accidental
- * change from one gpio bank to another can be caught.
-*/
-
-#define S5PV210_GPIO_NEXT(__gpio) \
-       ((__gpio##_START) + (__gpio##_NR) + CONFIG_S3C_GPIO_SPACE + 1)
-
-enum s5p_gpio_number {
-       S5PV210_GPIO_A0_START   = 0,
-       S5PV210_GPIO_A1_START   = S5PV210_GPIO_NEXT(S5PV210_GPIO_A0),
-       S5PV210_GPIO_B_START    = S5PV210_GPIO_NEXT(S5PV210_GPIO_A1),
-       S5PV210_GPIO_C0_START   = S5PV210_GPIO_NEXT(S5PV210_GPIO_B),
-       S5PV210_GPIO_C1_START   = S5PV210_GPIO_NEXT(S5PV210_GPIO_C0),
-       S5PV210_GPIO_D0_START   = S5PV210_GPIO_NEXT(S5PV210_GPIO_C1),
-       S5PV210_GPIO_D1_START   = S5PV210_GPIO_NEXT(S5PV210_GPIO_D0),
-       S5PV210_GPIO_E0_START   = S5PV210_GPIO_NEXT(S5PV210_GPIO_D1),
-       S5PV210_GPIO_E1_START   = S5PV210_GPIO_NEXT(S5PV210_GPIO_E0),
-       S5PV210_GPIO_F0_START   = S5PV210_GPIO_NEXT(S5PV210_GPIO_E1),
-       S5PV210_GPIO_F1_START   = S5PV210_GPIO_NEXT(S5PV210_GPIO_F0),
-       S5PV210_GPIO_F2_START   = S5PV210_GPIO_NEXT(S5PV210_GPIO_F1),
-       S5PV210_GPIO_F3_START   = S5PV210_GPIO_NEXT(S5PV210_GPIO_F2),
-       S5PV210_GPIO_G0_START   = S5PV210_GPIO_NEXT(S5PV210_GPIO_F3),
-       S5PV210_GPIO_G1_START   = S5PV210_GPIO_NEXT(S5PV210_GPIO_G0),
-       S5PV210_GPIO_G2_START   = S5PV210_GPIO_NEXT(S5PV210_GPIO_G1),
-       S5PV210_GPIO_G3_START   = S5PV210_GPIO_NEXT(S5PV210_GPIO_G2),
-       S5PV210_GPIO_H0_START   = S5PV210_GPIO_NEXT(S5PV210_GPIO_G3),
-       S5PV210_GPIO_H1_START   = S5PV210_GPIO_NEXT(S5PV210_GPIO_H0),
-       S5PV210_GPIO_H2_START   = S5PV210_GPIO_NEXT(S5PV210_GPIO_H1),
-       S5PV210_GPIO_H3_START   = S5PV210_GPIO_NEXT(S5PV210_GPIO_H2),
-       S5PV210_GPIO_I_START    = S5PV210_GPIO_NEXT(S5PV210_GPIO_H3),
-       S5PV210_GPIO_J0_START   = S5PV210_GPIO_NEXT(S5PV210_GPIO_I),
-       S5PV210_GPIO_J1_START   = S5PV210_GPIO_NEXT(S5PV210_GPIO_J0),
-       S5PV210_GPIO_J2_START   = S5PV210_GPIO_NEXT(S5PV210_GPIO_J1),
-       S5PV210_GPIO_J3_START   = S5PV210_GPIO_NEXT(S5PV210_GPIO_J2),
-       S5PV210_GPIO_J4_START   = S5PV210_GPIO_NEXT(S5PV210_GPIO_J3),
-       S5PV210_GPIO_MP01_START = S5PV210_GPIO_NEXT(S5PV210_GPIO_J4),
-       S5PV210_GPIO_MP02_START = S5PV210_GPIO_NEXT(S5PV210_GPIO_MP01),
-       S5PV210_GPIO_MP03_START = S5PV210_GPIO_NEXT(S5PV210_GPIO_MP02),
-       S5PV210_GPIO_MP04_START = S5PV210_GPIO_NEXT(S5PV210_GPIO_MP03),
-       S5PV210_GPIO_MP05_START = S5PV210_GPIO_NEXT(S5PV210_GPIO_MP04),
-};
-
-/* S5PV210 GPIO number definitions */
-#define S5PV210_GPA0(_nr)      (S5PV210_GPIO_A0_START + (_nr))
-#define S5PV210_GPA1(_nr)      (S5PV210_GPIO_A1_START + (_nr))
-#define S5PV210_GPB(_nr)       (S5PV210_GPIO_B_START + (_nr))
-#define S5PV210_GPC0(_nr)      (S5PV210_GPIO_C0_START + (_nr))
-#define S5PV210_GPC1(_nr)      (S5PV210_GPIO_C1_START + (_nr))
-#define S5PV210_GPD0(_nr)      (S5PV210_GPIO_D0_START + (_nr))
-#define S5PV210_GPD1(_nr)      (S5PV210_GPIO_D1_START + (_nr))
-#define S5PV210_GPE0(_nr)      (S5PV210_GPIO_E0_START + (_nr))
-#define S5PV210_GPE1(_nr)      (S5PV210_GPIO_E1_START + (_nr))
-#define S5PV210_GPF0(_nr)      (S5PV210_GPIO_F0_START + (_nr))
-#define S5PV210_GPF1(_nr)      (S5PV210_GPIO_F1_START + (_nr))
-#define S5PV210_GPF2(_nr)      (S5PV210_GPIO_F2_START + (_nr))
-#define S5PV210_GPF3(_nr)      (S5PV210_GPIO_F3_START + (_nr))
-#define S5PV210_GPG0(_nr)      (S5PV210_GPIO_G0_START + (_nr))
-#define S5PV210_GPG1(_nr)      (S5PV210_GPIO_G1_START + (_nr))
-#define S5PV210_GPG2(_nr)      (S5PV210_GPIO_G2_START + (_nr))
-#define S5PV210_GPG3(_nr)      (S5PV210_GPIO_G3_START + (_nr))
-#define S5PV210_GPH0(_nr)      (S5PV210_GPIO_H0_START + (_nr))
-#define S5PV210_GPH1(_nr)      (S5PV210_GPIO_H1_START + (_nr))
-#define S5PV210_GPH2(_nr)      (S5PV210_GPIO_H2_START + (_nr))
-#define S5PV210_GPH3(_nr)      (S5PV210_GPIO_H3_START + (_nr))
-#define S5PV210_GPI(_nr)       (S5PV210_GPIO_I_START + (_nr))
-#define S5PV210_GPJ0(_nr)      (S5PV210_GPIO_J0_START + (_nr))
-#define S5PV210_GPJ1(_nr)      (S5PV210_GPIO_J1_START + (_nr))
-#define S5PV210_GPJ2(_nr)      (S5PV210_GPIO_J2_START + (_nr))
-#define S5PV210_GPJ3(_nr)      (S5PV210_GPIO_J3_START + (_nr))
-#define S5PV210_GPJ4(_nr)      (S5PV210_GPIO_J4_START + (_nr))
-#define S5PV210_MP01(_nr)      (S5PV210_GPIO_MP01_START + (_nr))
-#define S5PV210_MP02(_nr)      (S5PV210_GPIO_MP02_START + (_nr))
-#define S5PV210_MP03(_nr)      (S5PV210_GPIO_MP03_START + (_nr))
-#define S5PV210_MP04(_nr)      (S5PV210_GPIO_MP04_START + (_nr))
-#define S5PV210_MP05(_nr)      (S5PV210_GPIO_MP05_START + (_nr))
-
-/* the end of the S5PV210 specific gpios */
-#define S5PV210_GPIO_END       (S5PV210_MP05(S5PV210_GPIO_MP05_NR) + 1)
-#define S3C_GPIO_END           S5PV210_GPIO_END
-
-/* define the number of gpios we need to the one after the MP05() range */
-#define ARCH_NR_GPIOS          (S5PV210_MP05(S5PV210_GPIO_MP05_NR) +   \
-                                CONFIG_SAMSUNG_GPIO_EXTRA + 1)
-
-#endif /* __ASM_ARCH_GPIO_H */
diff --git a/arch/arm/mach-s5pv210/include/mach/hardware.h b/arch/arm/mach-s5pv210/include/mach/hardware.h
deleted file mode 100644 (file)
index fada7a3..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-/* linux/arch/arm/mach-s5pv210/include/mach/hardware.h
- *
- * Copyright (c) 2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com/
- *
- * S5PV210 - Hardware support
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#ifndef __ASM_ARCH_HARDWARE_H
-#define __ASM_ARCH_HARDWARE_H __FILE__
-
-/* currently nothing here, placeholder */
-
-#endif /* __ASM_ARCH_HARDWARE_H */
diff --git a/arch/arm/mach-s5pv210/include/mach/irqs.h b/arch/arm/mach-s5pv210/include/mach/irqs.h
deleted file mode 100644 (file)
index 5e0de3a..0000000
+++ /dev/null
@@ -1,137 +0,0 @@
-/* linux/arch/arm/mach-s5pv210/include/mach/irqs.h
- *
- * Copyright (c) 2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com/
- *
- * S5PV210 - IRQ definitions
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#ifndef __ASM_ARCH_IRQS_H
-#define __ASM_ARCH_IRQS_H __FILE__
-
-#include <plat/irqs.h>
-
-/* VIC0: System, DMA, Timer */
-
-#define IRQ_EINT16_31          S5P_IRQ_VIC0(16)
-#define IRQ_BATF               S5P_IRQ_VIC0(17)
-#define IRQ_MDMA               S5P_IRQ_VIC0(18)
-#define IRQ_PDMA0              S5P_IRQ_VIC0(19)
-#define IRQ_PDMA1              S5P_IRQ_VIC0(20)
-#define IRQ_TIMER0_VIC         S5P_IRQ_VIC0(21)
-#define IRQ_TIMER1_VIC         S5P_IRQ_VIC0(22)
-#define IRQ_TIMER2_VIC         S5P_IRQ_VIC0(23)
-#define IRQ_TIMER3_VIC         S5P_IRQ_VIC0(24)
-#define IRQ_TIMER4_VIC         S5P_IRQ_VIC0(25)
-#define IRQ_SYSTIMER           S5P_IRQ_VIC0(26)
-#define IRQ_WDT                        S5P_IRQ_VIC0(27)
-#define IRQ_RTC_ALARM          S5P_IRQ_VIC0(28)
-#define IRQ_RTC_TIC            S5P_IRQ_VIC0(29)
-#define IRQ_GPIOINT            S5P_IRQ_VIC0(30)
-#define IRQ_FIMC3              S5P_IRQ_VIC0(31)
-
-/* VIC1: ARM, Power, Memory, Connectivity, Storage */
-
-#define IRQ_PMU                        S5P_IRQ_VIC1(0)
-#define IRQ_CORTEX1            S5P_IRQ_VIC1(1)
-#define IRQ_CORTEX2            S5P_IRQ_VIC1(2)
-#define IRQ_CORTEX3            S5P_IRQ_VIC1(3)
-#define IRQ_CORTEX4            S5P_IRQ_VIC1(4)
-#define IRQ_IEMAPC             S5P_IRQ_VIC1(5)
-#define IRQ_IEMIEC             S5P_IRQ_VIC1(6)
-#define IRQ_ONENAND            S5P_IRQ_VIC1(7)
-#define IRQ_NFC                        S5P_IRQ_VIC1(8)
-#define IRQ_CFCON              S5P_IRQ_VIC1(9)
-#define IRQ_UART0              S5P_IRQ_VIC1(10)
-#define IRQ_UART1              S5P_IRQ_VIC1(11)
-#define IRQ_UART2              S5P_IRQ_VIC1(12)
-#define IRQ_UART3              S5P_IRQ_VIC1(13)
-#define IRQ_IIC                        S5P_IRQ_VIC1(14)
-#define IRQ_SPI0               S5P_IRQ_VIC1(15)
-#define IRQ_SPI1               S5P_IRQ_VIC1(16)
-#define IRQ_SPI2               S5P_IRQ_VIC1(17)
-#define IRQ_IRDA               S5P_IRQ_VIC1(18)
-#define IRQ_IIC2               S5P_IRQ_VIC1(19)
-#define IRQ_IIC_HDMIPHY                S5P_IRQ_VIC1(20)
-#define IRQ_HSIRX              S5P_IRQ_VIC1(21)
-#define IRQ_HSITX              S5P_IRQ_VIC1(22)
-#define IRQ_UHOST              S5P_IRQ_VIC1(23)
-#define IRQ_OTG                        S5P_IRQ_VIC1(24)
-#define IRQ_MSM                        S5P_IRQ_VIC1(25)
-#define IRQ_HSMMC0             S5P_IRQ_VIC1(26)
-#define IRQ_HSMMC1             S5P_IRQ_VIC1(27)
-#define IRQ_HSMMC2             S5P_IRQ_VIC1(28)
-#define IRQ_MIPI_CSIS          S5P_IRQ_VIC1(29)
-#define IRQ_MIPIDSI            S5P_IRQ_VIC1(30)
-#define IRQ_ONENAND_AUDI       S5P_IRQ_VIC1(31)
-
-/* VIC2: Multimedia, Audio, Security */
-
-#define IRQ_LCD0               S5P_IRQ_VIC2(0)
-#define IRQ_LCD1               S5P_IRQ_VIC2(1)
-#define IRQ_LCD2               S5P_IRQ_VIC2(2)
-#define IRQ_LCD3               S5P_IRQ_VIC2(3)
-#define IRQ_ROTATOR            S5P_IRQ_VIC2(4)
-#define IRQ_FIMC0              S5P_IRQ_VIC2(5)
-#define IRQ_FIMC1              S5P_IRQ_VIC2(6)
-#define IRQ_FIMC2              S5P_IRQ_VIC2(7)
-#define IRQ_JPEG               S5P_IRQ_VIC2(8)
-#define IRQ_2D                 S5P_IRQ_VIC2(9)
-#define IRQ_3D                 S5P_IRQ_VIC2(10)
-#define IRQ_MIXER              S5P_IRQ_VIC2(11)
-#define IRQ_HDMI               S5P_IRQ_VIC2(12)
-#define IRQ_IIC1               S5P_IRQ_VIC2(13)
-#define IRQ_MFC                        S5P_IRQ_VIC2(14)
-#define IRQ_SDO                        S5P_IRQ_VIC2(15)
-#define IRQ_I2S0               S5P_IRQ_VIC2(16)
-#define IRQ_I2S1               S5P_IRQ_VIC2(17)
-#define IRQ_I2S2               S5P_IRQ_VIC2(18)
-#define IRQ_AC97               S5P_IRQ_VIC2(19)
-#define IRQ_PCM0               S5P_IRQ_VIC2(20)
-#define IRQ_PCM1               S5P_IRQ_VIC2(21)
-#define IRQ_SPDIF              S5P_IRQ_VIC2(22)
-#define IRQ_ADC                        S5P_IRQ_VIC2(23)
-#define IRQ_PENDN              S5P_IRQ_VIC2(24)
-#define IRQ_TC                 IRQ_PENDN
-#define IRQ_KEYPAD             S5P_IRQ_VIC2(25)
-#define IRQ_CG                 S5P_IRQ_VIC2(26)
-#define IRQ_SSS_INT            S5P_IRQ_VIC2(27)
-#define IRQ_SSS_HASH           S5P_IRQ_VIC2(28)
-#define IRQ_PCM2               S5P_IRQ_VIC2(29)
-#define IRQ_SDMIRQ             S5P_IRQ_VIC2(30)
-#define IRQ_SDMFIQ             S5P_IRQ_VIC2(31)
-
-/* VIC3: Etc */
-
-#define IRQ_IPC                        S5P_IRQ_VIC3(0)
-#define IRQ_HOSTIF             S5P_IRQ_VIC3(1)
-#define IRQ_HSMMC3             S5P_IRQ_VIC3(2)
-#define IRQ_CEC                        S5P_IRQ_VIC3(3)
-#define IRQ_TSI                        S5P_IRQ_VIC3(4)
-#define IRQ_MDNIE0             S5P_IRQ_VIC3(5)
-#define IRQ_MDNIE1             S5P_IRQ_VIC3(6)
-#define IRQ_MDNIE2             S5P_IRQ_VIC3(7)
-#define IRQ_MDNIE3             S5P_IRQ_VIC3(8)
-#define IRQ_VIC_END            S5P_IRQ_VIC3(31)
-
-#define S5P_EINT_BASE1         (S5P_IRQ_VIC0(0))
-#define S5P_EINT_BASE2         (IRQ_VIC_END + 1)
-
-/* GPIO interrupt */
-#define S5P_GPIOINT_BASE       (IRQ_EINT(31) + 1)
-#define S5P_GPIOINT_GROUP_MAXNR        22
-
-/* Set the default NR_IRQS */
-#define NR_IRQS                        (IRQ_EINT(31) + S5P_GPIOINT_COUNT + 1)
-
-/* Compatibility */
-#define IRQ_LCD_FIFO           IRQ_LCD0
-#define IRQ_LCD_VSYNC          IRQ_LCD1
-#define IRQ_LCD_SYSTEM         IRQ_LCD2
-#define IRQ_MIPI_CSIS0         IRQ_MIPI_CSIS
-
-#endif /* ASM_ARCH_IRQS_H */
diff --git a/arch/arm/mach-s5pv210/include/mach/map.h b/arch/arm/mach-s5pv210/include/mach/map.h
deleted file mode 100644 (file)
index 763929a..0000000
+++ /dev/null
@@ -1,158 +0,0 @@
-/* linux/arch/arm/mach-s5pv210/include/mach/map.h
- *
- * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com/
- *
- * S5PV210 - Memory map definitions
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#ifndef __ASM_ARCH_MAP_H
-#define __ASM_ARCH_MAP_H __FILE__
-
-#include <plat/map-base.h>
-#include <plat/map-s5p.h>
-
-#define S5PV210_PA_SDRAM               0x20000000
-
-#define S5PV210_PA_SROM_BANK5          0xA8000000
-
-#define S5PC110_PA_ONENAND             0xB0000000
-#define S5PC110_PA_ONENAND_DMA         0xB0600000
-
-#define S5PV210_PA_CHIPID              0xE0000000
-
-#define S5PV210_PA_SYSCON              0xE0100000
-
-#define S5PV210_PA_GPIO                        0xE0200000
-
-#define S5PV210_PA_SPDIF               0xE1100000
-
-#define S5PV210_PA_SPI0                        0xE1300000
-#define S5PV210_PA_SPI1                        0xE1400000
-
-#define S5PV210_PA_KEYPAD              0xE1600000
-
-#define S5PV210_PA_ADC                 0xE1700000
-
-#define S5PV210_PA_IIC0                        0xE1800000
-#define S5PV210_PA_IIC1                        0xFAB00000
-#define S5PV210_PA_IIC2                        0xE1A00000
-
-#define S5PV210_PA_AC97                        0xE2200000
-
-#define S5PV210_PA_PCM0                        0xE2300000
-#define S5PV210_PA_PCM1                        0xE1200000
-#define S5PV210_PA_PCM2                        0xE2B00000
-
-#define S5PV210_PA_TIMER               0xE2500000
-#define S5PV210_PA_SYSTIMER            0xE2600000
-#define S5PV210_PA_WATCHDOG            0xE2700000
-#define S5PV210_PA_RTC                 0xE2800000
-
-#define S5PV210_PA_UART                        0xE2900000
-
-#define S5PV210_PA_SROMC               0xE8000000
-
-#define S5PV210_PA_CFCON               0xE8200000
-
-#define S5PV210_PA_MFC                 0xF1700000
-
-#define S5PV210_PA_HSMMC(x)            (0xEB000000 + ((x) * 0x100000))
-
-#define S5PV210_PA_HSOTG               0xEC000000
-#define S5PV210_PA_HSPHY               0xEC100000
-
-#define S5PV210_PA_IIS0                        0xEEE30000
-#define S5PV210_PA_IIS1                        0xE2100000
-#define S5PV210_PA_IIS2                        0xE2A00000
-
-#define S5PV210_PA_DMC0                        0xF0000000
-#define S5PV210_PA_DMC1                        0xF1400000
-
-#define S5PV210_PA_VIC0                        0xF2000000
-#define S5PV210_PA_VIC1                        0xF2100000
-#define S5PV210_PA_VIC2                        0xF2200000
-#define S5PV210_PA_VIC3                        0xF2300000
-
-#define S5PV210_PA_FB                  0xF8000000
-
-#define S5PV210_PA_MDMA                        0xFA200000
-#define S5PV210_PA_PDMA0               0xE0900000
-#define S5PV210_PA_PDMA1               0xE0A00000
-
-#define S5PV210_PA_MIPI_CSIS           0xFA600000
-
-#define S5PV210_PA_FIMC0               0xFB200000
-#define S5PV210_PA_FIMC1               0xFB300000
-#define S5PV210_PA_FIMC2               0xFB400000
-
-#define S5PV210_PA_JPEG                        0xFB600000
-
-#define S5PV210_PA_SDO                 0xF9000000
-#define S5PV210_PA_VP                  0xF9100000
-#define S5PV210_PA_MIXER               0xF9200000
-#define S5PV210_PA_HDMI                        0xFA100000
-#define S5PV210_PA_IIC_HDMIPHY         0xFA900000
-
-/* Compatibiltiy Defines */
-
-#define S3C_PA_FB                      S5PV210_PA_FB
-#define S3C_PA_HSMMC0                  S5PV210_PA_HSMMC(0)
-#define S3C_PA_HSMMC1                  S5PV210_PA_HSMMC(1)
-#define S3C_PA_HSMMC2                  S5PV210_PA_HSMMC(2)
-#define S3C_PA_HSMMC3                  S5PV210_PA_HSMMC(3)
-#define S3C_PA_IIC                     S5PV210_PA_IIC0
-#define S3C_PA_IIC1                    S5PV210_PA_IIC1
-#define S3C_PA_IIC2                    S5PV210_PA_IIC2
-#define S3C_PA_RTC                     S5PV210_PA_RTC
-#define S3C_PA_USB_HSOTG               S5PV210_PA_HSOTG
-#define S3C_PA_WDT                     S5PV210_PA_WATCHDOG
-#define S3C_PA_SPI0                    S5PV210_PA_SPI0
-#define S3C_PA_SPI1                    S5PV210_PA_SPI1
-
-#define S5P_PA_CHIPID                  S5PV210_PA_CHIPID
-#define S5P_PA_FIMC0                   S5PV210_PA_FIMC0
-#define S5P_PA_FIMC1                   S5PV210_PA_FIMC1
-#define S5P_PA_FIMC2                   S5PV210_PA_FIMC2
-#define S5P_PA_MIPI_CSIS0              S5PV210_PA_MIPI_CSIS
-#define S5P_PA_MFC                     S5PV210_PA_MFC
-#define S5P_PA_IIC_HDMIPHY             S5PV210_PA_IIC_HDMIPHY
-
-#define S5P_PA_SDO                     S5PV210_PA_SDO
-#define S5P_PA_VP                      S5PV210_PA_VP
-#define S5P_PA_MIXER                   S5PV210_PA_MIXER
-#define S5P_PA_HDMI                    S5PV210_PA_HDMI
-
-#define S5P_PA_ONENAND                 S5PC110_PA_ONENAND
-#define S5P_PA_ONENAND_DMA             S5PC110_PA_ONENAND_DMA
-#define S5P_PA_SDRAM                   S5PV210_PA_SDRAM
-#define S5P_PA_SROMC                   S5PV210_PA_SROMC
-#define S5P_PA_SYSCON                  S5PV210_PA_SYSCON
-#define S5P_PA_TIMER                   S5PV210_PA_TIMER
-
-#define S5P_PA_JPEG                    S5PV210_PA_JPEG
-
-#define SAMSUNG_PA_ADC                 S5PV210_PA_ADC
-#define SAMSUNG_PA_CFCON               S5PV210_PA_CFCON
-#define SAMSUNG_PA_KEYPAD              S5PV210_PA_KEYPAD
-#define SAMSUNG_PA_TIMER               S5PV210_PA_TIMER
-
-/* UART */
-
-#define S3C_VA_UARTx(x)                        (S3C_VA_UART + ((x) * S3C_UART_OFFSET))
-
-#define S3C_PA_UART                    S5PV210_PA_UART
-
-#define S5P_PA_UART(x)                 (S3C_PA_UART + ((x) * S3C_UART_OFFSET))
-#define S5P_PA_UART0                   S5P_PA_UART(0)
-#define S5P_PA_UART1                   S5P_PA_UART(1)
-#define S5P_PA_UART2                   S5P_PA_UART(2)
-#define S5P_PA_UART3                   S5P_PA_UART(3)
-
-#define S5P_SZ_UART                    SZ_256
-
-#endif /* __ASM_ARCH_MAP_H */
diff --git a/arch/arm/mach-s5pv210/include/mach/memory.h b/arch/arm/mach-s5pv210/include/mach/memory.h
deleted file mode 100644 (file)
index d584fac..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-/* linux/arch/arm/mach-s5pv210/include/mach/memory.h
- *
- * Copyright (c) 2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com/
- *
- * S5PV210 - Memory definitions
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#ifndef __ASM_ARCH_MEMORY_H
-#define __ASM_ARCH_MEMORY_H
-
-/*
- * Sparsemem support
- * Physical memory can be located from 0x20000000 to 0x7fffffff,
- * so MAX_PHYSMEM_BITS is 31.
- */
-
-#define MAX_PHYSMEM_BITS       31
-#define SECTION_SIZE_BITS      28
-
-#endif /* __ASM_ARCH_MEMORY_H */
diff --git a/arch/arm/mach-s5pv210/include/mach/pm-core.h b/arch/arm/mach-s5pv210/include/mach/pm-core.h
deleted file mode 100644 (file)
index eba8aea..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/* linux/arch/arm/mach-s5pv210/include/mach/pm-core.h
- *
- * Copyright (c) 2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * Based on arch/arm/mach-s3c2410/include/mach/pm-core.h,
- * Copyright 2008 Simtec Electronics
- *      Ben Dooks <ben@simtec.co.uk>
- *      http://armlinux.simtec.co.uk/
- *
- * S5PV210 - PM core support for arch/arm/plat-s5p/pm.c
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-static inline void s3c_pm_debug_init_uart(void)
-{
-       /* nothing here yet */
-}
-
-static inline void s3c_pm_arch_prepare_irqs(void)
-{
-       __raw_writel(s3c_irqwake_intmask, S5P_WAKEUP_MASK);
-       __raw_writel(s3c_irqwake_eintmask, S5P_EINT_WAKEUP_MASK);
-}
-
-static inline void s3c_pm_arch_stop_clocks(void)
-{
-       /* nothing here yet */
-}
-
-static inline void s3c_pm_arch_show_resume_irqs(void)
-{
-       /* nothing here yet */
-}
-
-static inline void s3c_pm_arch_update_uart(void __iomem *regs,
-                                          struct pm_uart_save *save)
-{
-       /* nothing here yet */
-}
-
-static inline void s3c_pm_restored_gpios(void) { }
-static inline void samsung_pm_saved_gpios(void) { }
index e345584d4c34ccbd8363680038ad1511adf04b2a..b14ffcd7f6ccbcc523b4f0cf4db47ebe30305b5e 100644 (file)
@@ -13,7 +13,7 @@
 #ifndef __ASM_ARCH_REGS_CLOCK_H
 #define __ASM_ARCH_REGS_CLOCK_H __FILE__
 
-#include <mach/map.h>
+#include <plat/map-base.h>
 
 #define S5P_CLKREG(x)          (S3C_VA_SYS + (x))
 
diff --git a/arch/arm/mach-s5pv210/include/mach/regs-gpio.h b/arch/arm/mach-s5pv210/include/mach/regs-gpio.h
deleted file mode 100644 (file)
index de0c899..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/* linux/arch/arm/mach-s5pv210/include/mach/regs-gpio.h
- *
- * Copyright (c) 2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * S5PV210 - GPIO (including EINT) register definitions
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#ifndef __ASM_ARCH_REGS_GPIO_H
-#define __ASM_ARCH_REGS_GPIO_H __FILE__
-
-#include <mach/map.h>
-
-#define S5PV210_EINT30CON              (S5P_VA_GPIO + 0xE00)
-#define S5P_EINT_CON(x)                        (S5PV210_EINT30CON + ((x) * 0x4))
-
-#define S5PV210_EINT30FLTCON0          (S5P_VA_GPIO + 0xE80)
-#define S5P_EINT_FLTCON(x)             (S5PV210_EINT30FLTCON0 + ((x) * 0x4))
-
-#define S5PV210_EINT30MASK             (S5P_VA_GPIO + 0xF00)
-#define S5P_EINT_MASK(x)               (S5PV210_EINT30MASK + ((x) * 0x4))
-
-#define S5PV210_EINT30PEND             (S5P_VA_GPIO + 0xF40)
-#define S5P_EINT_PEND(x)               (S5PV210_EINT30PEND + ((x) * 0x4))
-
-#define EINT_REG_NR(x)                 (EINT_OFFSET(x) >> 3)
-
-#define eint_irq_to_bit(irq)           (1 << (EINT_OFFSET(irq) & 0x7))
-
-#define EINT_MODE              S3C_GPIO_SFN(0xf)
-
-#define EINT_GPIO_0(x)         S5PV210_GPH0(x)
-#define EINT_GPIO_1(x)         S5PV210_GPH1(x)
-#define EINT_GPIO_2(x)         S5PV210_GPH2(x)
-#define EINT_GPIO_3(x)         S5PV210_GPH3(x)
-
-#endif /* __ASM_ARCH_REGS_GPIO_H */
diff --git a/arch/arm/mach-s5pv210/include/mach/regs-irq.h b/arch/arm/mach-s5pv210/include/mach/regs-irq.h
deleted file mode 100644 (file)
index d8bc1e6..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-/* linux/arch/arm/mach-s5pv210/include/mach/regs-irq.h
- *
- * Copyright (c) 2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com/
- *
- * S5PV210 - IRQ register definitions
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#ifndef __ASM_ARCH_REGS_IRQ_H
-#define __ASM_ARCH_REGS_IRQ_H __FILE__
-
-#include <mach/map.h>
-
-#endif /* __ASM_ARCH_REGS_IRQ_H */
diff --git a/arch/arm/mach-s5pv210/mach-aquila.c b/arch/arm/mach-s5pv210/mach-aquila.c
deleted file mode 100644 (file)
index cc37eda..0000000
+++ /dev/null
@@ -1,687 +0,0 @@
-/* linux/arch/arm/mach-s5pv210/mach-aquila.c
- *
- * Copyright (c) 2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/init.h>
-#include <linux/serial_core.h>
-#include <linux/serial_s3c.h>
-#include <linux/fb.h>
-#include <linux/i2c.h>
-#include <linux/i2c-gpio.h>
-#include <linux/mfd/max8998.h>
-#include <linux/mfd/wm8994/pdata.h>
-#include <linux/regulator/fixed.h>
-#include <linux/gpio_keys.h>
-#include <linux/input.h>
-#include <linux/gpio.h>
-
-#include <asm/mach/arch.h>
-#include <asm/mach/map.h>
-#include <asm/setup.h>
-#include <asm/mach-types.h>
-
-#include <video/samsung_fimd.h>
-#include <mach/map.h>
-#include <mach/regs-clock.h>
-
-#include <plat/gpio-cfg.h>
-#include <plat/devs.h>
-#include <plat/cpu.h>
-#include <plat/fb.h>
-#include <plat/fimc-core.h>
-#include <plat/sdhci.h>
-#include <plat/samsung-time.h>
-
-#include "common.h"
-
-/* Following are default values for UCON, ULCON and UFCON UART registers */
-#define AQUILA_UCON_DEFAULT    (S3C2410_UCON_TXILEVEL |        \
-                                S3C2410_UCON_RXILEVEL |        \
-                                S3C2410_UCON_TXIRQMODE |       \
-                                S3C2410_UCON_RXIRQMODE |       \
-                                S3C2410_UCON_RXFIFO_TOI |      \
-                                S3C2443_UCON_RXERR_IRQEN)
-
-#define AQUILA_ULCON_DEFAULT   S3C2410_LCON_CS8
-
-#define AQUILA_UFCON_DEFAULT   S3C2410_UFCON_FIFOMODE
-
-static struct s3c2410_uartcfg aquila_uartcfgs[] __initdata = {
-       [0] = {
-               .hwport         = 0,
-               .flags          = 0,
-               .ucon           = AQUILA_UCON_DEFAULT,
-               .ulcon          = AQUILA_ULCON_DEFAULT,
-               /*
-                * Actually UART0 can support 256 bytes fifo, but aquila board
-                * supports 128 bytes fifo because of initial chip bug
-                */
-               .ufcon          = AQUILA_UFCON_DEFAULT |
-                       S5PV210_UFCON_TXTRIG128 | S5PV210_UFCON_RXTRIG128,
-       },
-       [1] = {
-               .hwport         = 1,
-               .flags          = 0,
-               .ucon           = AQUILA_UCON_DEFAULT,
-               .ulcon          = AQUILA_ULCON_DEFAULT,
-               .ufcon          = AQUILA_UFCON_DEFAULT |
-                       S5PV210_UFCON_TXTRIG64 | S5PV210_UFCON_RXTRIG64,
-       },
-       [2] = {
-               .hwport         = 2,
-               .flags          = 0,
-               .ucon           = AQUILA_UCON_DEFAULT,
-               .ulcon          = AQUILA_ULCON_DEFAULT,
-               .ufcon          = AQUILA_UFCON_DEFAULT |
-                       S5PV210_UFCON_TXTRIG16 | S5PV210_UFCON_RXTRIG16,
-       },
-       [3] = {
-               .hwport         = 3,
-               .flags          = 0,
-               .ucon           = AQUILA_UCON_DEFAULT,
-               .ulcon          = AQUILA_ULCON_DEFAULT,
-               .ufcon          = AQUILA_UFCON_DEFAULT |
-                       S5PV210_UFCON_TXTRIG16 | S5PV210_UFCON_RXTRIG16,
-       },
-};
-
-/* Frame Buffer */
-static struct s3c_fb_pd_win aquila_fb_win0 = {
-       .max_bpp = 32,
-       .default_bpp = 16,
-       .xres = 480,
-       .yres = 800,
-};
-
-static struct s3c_fb_pd_win aquila_fb_win1 = {
-       .max_bpp = 32,
-       .default_bpp = 16,
-       .xres = 480,
-       .yres = 800,
-};
-
-static struct fb_videomode aquila_lcd_timing = {
-       .left_margin = 16,
-       .right_margin = 16,
-       .upper_margin = 3,
-       .lower_margin = 28,
-       .hsync_len = 2,
-       .vsync_len = 2,
-       .xres = 480,
-       .yres = 800,
-};
-
-static struct s3c_fb_platdata aquila_lcd_pdata __initdata = {
-       .win[0]         = &aquila_fb_win0,
-       .win[1]         = &aquila_fb_win1,
-       .vtiming        = &aquila_lcd_timing,
-       .vidcon0        = VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB,
-       .vidcon1        = VIDCON1_INV_HSYNC | VIDCON1_INV_VSYNC |
-                         VIDCON1_INV_VCLK | VIDCON1_INV_VDEN,
-       .setup_gpio     = s5pv210_fb_gpio_setup_24bpp,
-};
-
-/* MAX8998 regulators */
-#if defined(CONFIG_REGULATOR_MAX8998) || defined(CONFIG_REGULATOR_MAX8998_MODULE)
-
-static struct regulator_init_data aquila_ldo2_data = {
-       .constraints    = {
-               .name           = "VALIVE_1.1V",
-               .min_uV         = 1100000,
-               .max_uV         = 1100000,
-               .apply_uV       = 1,
-               .always_on      = 1,
-               .state_mem      = {
-                       .enabled = 1,
-               },
-       },
-};
-
-static struct regulator_init_data aquila_ldo3_data = {
-       .constraints    = {
-               .name           = "VUSB+MIPI_1.1V",
-               .min_uV         = 1100000,
-               .max_uV         = 1100000,
-               .apply_uV       = 1,
-               .always_on      = 1,
-       },
-};
-
-static struct regulator_init_data aquila_ldo4_data = {
-       .constraints    = {
-               .name           = "VDAC_3.3V",
-               .min_uV         = 3300000,
-               .max_uV         = 3300000,
-               .apply_uV       = 1,
-       },
-};
-
-static struct regulator_init_data aquila_ldo5_data = {
-       .constraints    = {
-               .name           = "VTF_2.8V",
-               .min_uV         = 2800000,
-               .max_uV         = 2800000,
-               .apply_uV       = 1,
-       },
-};
-
-static struct regulator_init_data aquila_ldo6_data = {
-       .constraints    = {
-               .name           = "VCC_3.3V",
-               .min_uV         = 3300000,
-               .max_uV         = 3300000,
-               .apply_uV       = 1,
-       },
-};
-
-static struct regulator_init_data aquila_ldo7_data = {
-       .constraints    = {
-               .name           = "VCC_3.0V",
-               .min_uV         = 3000000,
-               .max_uV         = 3000000,
-               .apply_uV       = 1,
-               .boot_on        = 1,
-               .always_on      = 1,
-       },
-};
-
-static struct regulator_init_data aquila_ldo8_data = {
-       .constraints    = {
-               .name           = "VUSB+VADC_3.3V",
-               .min_uV         = 3300000,
-               .max_uV         = 3300000,
-               .apply_uV       = 1,
-               .always_on      = 1,
-       },
-};
-
-static struct regulator_init_data aquila_ldo9_data = {
-       .constraints    = {
-               .name           = "VCC+VCAM_2.8V",
-               .min_uV         = 2800000,
-               .max_uV         = 2800000,
-               .apply_uV       = 1,
-               .always_on      = 1,
-       },
-};
-
-static struct regulator_init_data aquila_ldo10_data = {
-       .constraints    = {
-               .name           = "VPLL_1.1V",
-               .min_uV         = 1100000,
-               .max_uV         = 1100000,
-               .apply_uV       = 1,
-               .boot_on        = 1,
-       },
-};
-
-static struct regulator_init_data aquila_ldo11_data = {
-       .constraints    = {
-               .name           = "CAM_IO_2.8V",
-               .min_uV         = 2800000,
-               .max_uV         = 2800000,
-               .apply_uV       = 1,
-               .always_on      = 1,
-       },
-};
-
-static struct regulator_init_data aquila_ldo12_data = {
-       .constraints    = {
-               .name           = "CAM_ISP_1.2V",
-               .min_uV         = 1200000,
-               .max_uV         = 1200000,
-               .apply_uV       = 1,
-               .always_on      = 1,
-       },
-};
-
-static struct regulator_init_data aquila_ldo13_data = {
-       .constraints    = {
-               .name           = "CAM_A_2.8V",
-               .min_uV         = 2800000,
-               .max_uV         = 2800000,
-               .apply_uV       = 1,
-               .always_on      = 1,
-       },
-};
-
-static struct regulator_init_data aquila_ldo14_data = {
-       .constraints    = {
-               .name           = "CAM_CIF_1.8V",
-               .min_uV         = 1800000,
-               .max_uV         = 1800000,
-               .apply_uV       = 1,
-               .always_on      = 1,
-       },
-};
-
-static struct regulator_init_data aquila_ldo15_data = {
-       .constraints    = {
-               .name           = "CAM_AF_3.3V",
-               .min_uV         = 3300000,
-               .max_uV         = 3300000,
-               .apply_uV       = 1,
-               .always_on      = 1,
-       },
-};
-
-static struct regulator_init_data aquila_ldo16_data = {
-       .constraints    = {
-               .name           = "VMIPI_1.8V",
-               .min_uV         = 1800000,
-               .max_uV         = 1800000,
-               .apply_uV       = 1,
-               .always_on      = 1,
-       },
-};
-
-static struct regulator_init_data aquila_ldo17_data = {
-       .constraints    = {
-               .name           = "CAM_8M_1.8V",
-               .min_uV         = 1800000,
-               .max_uV         = 1800000,
-               .apply_uV       = 1,
-               .always_on      = 1,
-       },
-};
-
-/* BUCK */
-static struct regulator_consumer_supply buck1_consumer =
-       REGULATOR_SUPPLY("vddarm", NULL);
-
-static struct regulator_consumer_supply buck2_consumer =
-       REGULATOR_SUPPLY("vddint", NULL);
-
-static struct regulator_init_data aquila_buck1_data = {
-       .constraints    = {
-               .name           = "VARM_1.2V",
-               .min_uV         = 1200000,
-               .max_uV         = 1200000,
-               .apply_uV       = 1,
-               .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
-                                 REGULATOR_CHANGE_STATUS,
-       },
-       .num_consumer_supplies  = 1,
-       .consumer_supplies      = &buck1_consumer,
-};
-
-static struct regulator_init_data aquila_buck2_data = {
-       .constraints    = {
-               .name           = "VINT_1.2V",
-               .min_uV         = 1200000,
-               .max_uV         = 1200000,
-               .apply_uV       = 1,
-               .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
-                                 REGULATOR_CHANGE_STATUS,
-       },
-       .num_consumer_supplies  = 1,
-       .consumer_supplies      = &buck2_consumer,
-};
-
-static struct regulator_init_data aquila_buck3_data = {
-       .constraints    = {
-               .name           = "VCC_1.8V",
-               .min_uV         = 1800000,
-               .max_uV         = 1800000,
-               .apply_uV       = 1,
-               .state_mem      = {
-                       .enabled = 1,
-               },
-       },
-};
-
-static struct regulator_init_data aquila_buck4_data = {
-       .constraints    = {
-               .name           = "CAM_CORE_1.2V",
-               .min_uV         = 1200000,
-               .max_uV         = 1200000,
-               .apply_uV       = 1,
-               .always_on      = 1,
-       },
-};
-
-static struct max8998_regulator_data aquila_regulators[] = {
-       { MAX8998_LDO2,  &aquila_ldo2_data },
-       { MAX8998_LDO3,  &aquila_ldo3_data },
-       { MAX8998_LDO4,  &aquila_ldo4_data },
-       { MAX8998_LDO5,  &aquila_ldo5_data },
-       { MAX8998_LDO6,  &aquila_ldo6_data },
-       { MAX8998_LDO7,  &aquila_ldo7_data },
-       { MAX8998_LDO8,  &aquila_ldo8_data },
-       { MAX8998_LDO9,  &aquila_ldo9_data },
-       { MAX8998_LDO10, &aquila_ldo10_data },
-       { MAX8998_LDO11, &aquila_ldo11_data },
-       { MAX8998_LDO12, &aquila_ldo12_data },
-       { MAX8998_LDO13, &aquila_ldo13_data },
-       { MAX8998_LDO14, &aquila_ldo14_data },
-       { MAX8998_LDO15, &aquila_ldo15_data },
-       { MAX8998_LDO16, &aquila_ldo16_data },
-       { MAX8998_LDO17, &aquila_ldo17_data },
-       { MAX8998_BUCK1, &aquila_buck1_data },
-       { MAX8998_BUCK2, &aquila_buck2_data },
-       { MAX8998_BUCK3, &aquila_buck3_data },
-       { MAX8998_BUCK4, &aquila_buck4_data },
-};
-
-static struct max8998_platform_data aquila_max8998_pdata = {
-       .num_regulators = ARRAY_SIZE(aquila_regulators),
-       .regulators     = aquila_regulators,
-       .buck1_set1     = S5PV210_GPH0(3),
-       .buck1_set2     = S5PV210_GPH0(4),
-       .buck2_set3     = S5PV210_GPH0(5),
-       .buck1_voltage  = { 1200000, 1200000, 1200000, 1200000 },
-       .buck2_voltage  = { 1200000, 1200000 },
-};
-#endif
-
-static struct regulator_consumer_supply wm8994_fixed_voltage0_supplies[] = {
-       REGULATOR_SUPPLY("DBVDD", "5-001a"),
-       REGULATOR_SUPPLY("AVDD2", "5-001a"),
-       REGULATOR_SUPPLY("CPVDD", "5-001a"),
-};
-
-static struct regulator_consumer_supply wm8994_fixed_voltage1_supplies[] = {
-       REGULATOR_SUPPLY("SPKVDD1", "5-001a"),
-       REGULATOR_SUPPLY("SPKVDD2", "5-001a"),
-};
-
-static struct regulator_init_data wm8994_fixed_voltage0_init_data = {
-       .constraints = {
-               .always_on = 1,
-       },
-       .num_consumer_supplies  = ARRAY_SIZE(wm8994_fixed_voltage0_supplies),
-       .consumer_supplies      = wm8994_fixed_voltage0_supplies,
-};
-
-static struct regulator_init_data wm8994_fixed_voltage1_init_data = {
-       .constraints = {
-               .always_on = 1,
-       },
-       .num_consumer_supplies  = ARRAY_SIZE(wm8994_fixed_voltage1_supplies),
-       .consumer_supplies      = wm8994_fixed_voltage1_supplies,
-};
-
-static struct fixed_voltage_config wm8994_fixed_voltage0_config = {
-       .supply_name    = "VCC_1.8V_PDA",
-       .microvolts     = 1800000,
-       .gpio           = -EINVAL,
-       .init_data      = &wm8994_fixed_voltage0_init_data,
-};
-
-static struct fixed_voltage_config wm8994_fixed_voltage1_config = {
-       .supply_name    = "V_BAT",
-       .microvolts     = 3700000,
-       .gpio           = -EINVAL,
-       .init_data      = &wm8994_fixed_voltage1_init_data,
-};
-
-static struct platform_device wm8994_fixed_voltage0 = {
-       .name           = "reg-fixed-voltage",
-       .id             = 0,
-       .dev            = {
-               .platform_data  = &wm8994_fixed_voltage0_config,
-       },
-};
-
-static struct platform_device wm8994_fixed_voltage1 = {
-       .name           = "reg-fixed-voltage",
-       .id             = 1,
-       .dev            = {
-               .platform_data  = &wm8994_fixed_voltage1_config,
-       },
-};
-
-static struct regulator_consumer_supply wm8994_avdd1_supply =
-       REGULATOR_SUPPLY("AVDD1", "5-001a");
-
-static struct regulator_consumer_supply wm8994_dcvdd_supply =
-       REGULATOR_SUPPLY("DCVDD", "5-001a");
-
-static struct regulator_init_data wm8994_ldo1_data = {
-       .constraints    = {
-               .name           = "AVDD1_3.0V",
-               .valid_ops_mask = REGULATOR_CHANGE_STATUS,
-       },
-       .num_consumer_supplies  = 1,
-       .consumer_supplies      = &wm8994_avdd1_supply,
-};
-
-static struct regulator_init_data wm8994_ldo2_data = {
-       .constraints    = {
-               .name           = "DCVDD_1.0V",
-       },
-       .num_consumer_supplies  = 1,
-       .consumer_supplies      = &wm8994_dcvdd_supply,
-};
-
-static struct wm8994_pdata wm8994_platform_data = {
-       /* configure gpio1 function: 0x0001(Logic level input/output) */
-       .gpio_defaults[0] = 0x0001,
-       /* configure gpio3/4/5/7 function for AIF2 voice */
-       .gpio_defaults[2] = 0x8100,
-       .gpio_defaults[3] = 0x8100,
-       .gpio_defaults[4] = 0x8100,
-       .gpio_defaults[6] = 0x0100,
-       /* configure gpio8/9/10/11 function for AIF3 BT */
-       .gpio_defaults[7] = 0x8100,
-       .gpio_defaults[8] = 0x0100,
-       .gpio_defaults[9] = 0x0100,
-       .gpio_defaults[10] = 0x0100,
-       .ldo[0] = { S5PV210_MP03(6), &wm8994_ldo1_data },       /* XM0FRNB_2 */
-       .ldo[1] = { 0, &wm8994_ldo2_data },
-};
-
-/* GPIO I2C PMIC */
-#define AP_I2C_GPIO_PMIC_BUS_4 4
-static struct i2c_gpio_platform_data aquila_i2c_gpio_pmic_data = {
-       .sda_pin        = S5PV210_GPJ4(0),      /* XMSMCSN */
-       .scl_pin        = S5PV210_GPJ4(3),      /* XMSMIRQN */
-};
-
-static struct platform_device aquila_i2c_gpio_pmic = {
-       .name           = "i2c-gpio",
-       .id             = AP_I2C_GPIO_PMIC_BUS_4,
-       .dev            = {
-               .platform_data = &aquila_i2c_gpio_pmic_data,
-       },
-};
-
-static struct i2c_board_info i2c_gpio_pmic_devs[] __initdata = {
-#if defined(CONFIG_REGULATOR_MAX8998) || defined(CONFIG_REGULATOR_MAX8998_MODULE)
-       {
-               /* 0xCC when SRAD = 0 */
-               I2C_BOARD_INFO("max8998", 0xCC >> 1),
-               .platform_data = &aquila_max8998_pdata,
-       },
-#endif
-};
-
-/* GPIO I2C AP 1.8V */
-#define AP_I2C_GPIO_BUS_5      5
-static struct i2c_gpio_platform_data aquila_i2c_gpio5_data = {
-       .sda_pin        = S5PV210_MP05(3),      /* XM0ADDR_11 */
-       .scl_pin        = S5PV210_MP05(2),      /* XM0ADDR_10 */
-};
-
-static struct platform_device aquila_i2c_gpio5 = {
-       .name           = "i2c-gpio",
-       .id             = AP_I2C_GPIO_BUS_5,
-       .dev            = {
-               .platform_data  = &aquila_i2c_gpio5_data,
-       },
-};
-
-static struct i2c_board_info i2c_gpio5_devs[] __initdata = {
-       {
-               /* CS/ADDR = low 0x34 (FYI: high = 0x36) */
-               I2C_BOARD_INFO("wm8994", 0x1a),
-               .platform_data  = &wm8994_platform_data,
-       },
-};
-
-/* PMIC Power button */
-static struct gpio_keys_button aquila_gpio_keys_table[] = {
-       {
-               .code           = KEY_POWER,
-               .gpio           = S5PV210_GPH2(6),
-               .desc           = "gpio-keys: KEY_POWER",
-               .type           = EV_KEY,
-               .active_low     = 1,
-               .wakeup         = 1,
-               .debounce_interval = 1,
-       },
-};
-
-static struct gpio_keys_platform_data aquila_gpio_keys_data = {
-       .buttons        = aquila_gpio_keys_table,
-       .nbuttons       = ARRAY_SIZE(aquila_gpio_keys_table),
-};
-
-static struct platform_device aquila_device_gpiokeys = {
-       .name = "gpio-keys",
-       .dev = {
-               .platform_data = &aquila_gpio_keys_data,
-       },
-};
-
-static void __init aquila_pmic_init(void)
-{
-       /* AP_PMIC_IRQ: EINT7 */
-       s3c_gpio_cfgpin(S5PV210_GPH0(7), S3C_GPIO_SFN(0xf));
-       s3c_gpio_setpull(S5PV210_GPH0(7), S3C_GPIO_PULL_UP);
-
-       /* nPower: EINT22 */
-       s3c_gpio_cfgpin(S5PV210_GPH2(6), S3C_GPIO_SFN(0xf));
-       s3c_gpio_setpull(S5PV210_GPH2(6), S3C_GPIO_PULL_UP);
-}
-
-/* MoviNAND */
-static struct s3c_sdhci_platdata aquila_hsmmc0_data __initdata = {
-       .max_width              = 4,
-       .cd_type                = S3C_SDHCI_CD_PERMANENT,
-};
-
-/* Wireless LAN */
-static struct s3c_sdhci_platdata aquila_hsmmc1_data __initdata = {
-       .max_width              = 4,
-       .cd_type                = S3C_SDHCI_CD_EXTERNAL,
-       /* ext_cd_{init,cleanup} callbacks will be added later */
-};
-
-/* External Flash */
-#define AQUILA_EXT_FLASH_EN    S5PV210_MP05(4)
-#define AQUILA_EXT_FLASH_CD    S5PV210_GPH3(4)
-static struct s3c_sdhci_platdata aquila_hsmmc2_data __initdata = {
-       .max_width              = 4,
-       .cd_type                = S3C_SDHCI_CD_GPIO,
-       .ext_cd_gpio            = AQUILA_EXT_FLASH_CD,
-       .ext_cd_gpio_invert     = 1,
-};
-
-static void aquila_setup_sdhci(void)
-{
-       gpio_request_one(AQUILA_EXT_FLASH_EN, GPIOF_OUT_INIT_HIGH, "FLASH_EN");
-
-       s3c_sdhci0_set_platdata(&aquila_hsmmc0_data);
-       s3c_sdhci1_set_platdata(&aquila_hsmmc1_data);
-       s3c_sdhci2_set_platdata(&aquila_hsmmc2_data);
-};
-
-/* Audio device */
-static struct platform_device aquila_device_audio = {
-       .name = "smdk-audio",
-       .id = -1,
-};
-
-static struct platform_device *aquila_devices[] __initdata = {
-       &aquila_i2c_gpio_pmic,
-       &aquila_i2c_gpio5,
-       &aquila_device_gpiokeys,
-       &aquila_device_audio,
-       &s3c_device_fb,
-       &s5p_device_onenand,
-       &s3c_device_hsmmc0,
-       &s3c_device_hsmmc1,
-       &s3c_device_hsmmc2,
-       &s5p_device_fimc0,
-       &s5p_device_fimc1,
-       &s5p_device_fimc2,
-       &s5p_device_fimc_md,
-       &s5pv210_device_iis0,
-       &wm8994_fixed_voltage0,
-       &wm8994_fixed_voltage1,
-};
-
-static void __init aquila_sound_init(void)
-{
-       unsigned int gpio;
-
-       /* CODEC_XTAL_EN
-        *
-        * The Aquila board have a oscillator which provide main clock
-        * to WM8994 codec. The oscillator provide 24MHz clock to WM8994
-        * clock. Set gpio setting of "CODEC_XTAL_EN" to enable a oscillator.
-        * */
-       gpio = S5PV210_GPH3(2);         /* XEINT_26 */
-       gpio_request(gpio, "CODEC_XTAL_EN");
-       s3c_gpio_cfgpin(gpio, S3C_GPIO_OUTPUT);
-       s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
-
-       /* Ths main clock of WM8994 codec uses the output of CLKOUT pin.
-        * The CLKOUT[9:8] set to 0x3(XUSBXTI) of 0xE010E000(OTHERS)
-        * because it needs 24MHz clock to operate WM8994 codec.
-        */
-       __raw_writel(__raw_readl(S5P_OTHERS) | (0x3 << 8), S5P_OTHERS);
-}
-
-static void __init aquila_map_io(void)
-{
-       s5pv210_init_io(NULL, 0);
-       s3c24xx_init_clocks(24000000);
-       s3c24xx_init_uarts(aquila_uartcfgs, ARRAY_SIZE(aquila_uartcfgs));
-       samsung_set_timer_source(SAMSUNG_PWM3, SAMSUNG_PWM4);
-}
-
-static void __init aquila_machine_init(void)
-{
-       /* PMIC */
-       aquila_pmic_init();
-       i2c_register_board_info(AP_I2C_GPIO_PMIC_BUS_4, i2c_gpio_pmic_devs,
-                       ARRAY_SIZE(i2c_gpio_pmic_devs));
-       /* SDHCI */
-       aquila_setup_sdhci();
-
-       s3c_fimc_setname(0, "s5p-fimc");
-       s3c_fimc_setname(1, "s5p-fimc");
-       s3c_fimc_setname(2, "s5p-fimc");
-
-       /* SOUND */
-       aquila_sound_init();
-       i2c_register_board_info(AP_I2C_GPIO_BUS_5, i2c_gpio5_devs,
-                       ARRAY_SIZE(i2c_gpio5_devs));
-
-       /* FB */
-       s3c_fb_set_platdata(&aquila_lcd_pdata);
-
-       platform_add_devices(aquila_devices, ARRAY_SIZE(aquila_devices));
-}
-
-MACHINE_START(AQUILA, "Aquila")
-       /* Maintainers:
-          Marek Szyprowski <m.szyprowski@samsung.com>
-          Kyungmin Park <kyungmin.park@samsung.com> */
-       .atag_offset    = 0x100,
-       .init_irq       = s5pv210_init_irq,
-       .map_io         = aquila_map_io,
-       .init_machine   = aquila_machine_init,
-       .init_time      = samsung_timer_init,
-       .restart        = s5pv210_restart,
-MACHINE_END
diff --git a/arch/arm/mach-s5pv210/mach-goni.c b/arch/arm/mach-s5pv210/mach-goni.c
deleted file mode 100644 (file)
index c1ce921..0000000
+++ /dev/null
@@ -1,916 +0,0 @@
-/* linux/arch/arm/mach-s5pv210/mach-goni.c
- *
- * Copyright (c) 2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/init.h>
-#include <linux/serial_core.h>
-#include <linux/serial_s3c.h>
-#include <linux/fb.h>
-#include <linux/i2c.h>
-#include <linux/i2c-gpio.h>
-#include <linux/i2c/atmel_mxt_ts.h>
-#include <linux/mfd/max8998.h>
-#include <linux/mfd/wm8994/pdata.h>
-#include <linux/regulator/fixed.h>
-#include <linux/spi/spi.h>
-#include <linux/spi/spi_gpio.h>
-#include <linux/lcd.h>
-#include <linux/gpio_keys.h>
-#include <linux/input.h>
-#include <linux/gpio.h>
-#include <linux/mmc/host.h>
-#include <linux/interrupt.h>
-#include <linux/platform_data/s3c-hsotg.h>
-
-#include <asm/mach/arch.h>
-#include <asm/mach/map.h>
-#include <asm/setup.h>
-#include <asm/mach-types.h>
-
-#include <video/samsung_fimd.h>
-#include <mach/map.h>
-#include <mach/regs-clock.h>
-
-#include <plat/gpio-cfg.h>
-#include <plat/devs.h>
-#include <plat/cpu.h>
-#include <plat/fb.h>
-#include <linux/platform_data/i2c-s3c2410.h>
-#include <plat/keypad.h>
-#include <plat/sdhci.h>
-#include <plat/clock.h>
-#include <plat/samsung-time.h>
-#include <plat/mfc.h>
-
-#include "common.h"
-
-/* Following are default values for UCON, ULCON and UFCON UART registers */
-#define GONI_UCON_DEFAULT      (S3C2410_UCON_TXILEVEL |        \
-                                S3C2410_UCON_RXILEVEL |        \
-                                S3C2410_UCON_TXIRQMODE |       \
-                                S3C2410_UCON_RXIRQMODE |       \
-                                S3C2410_UCON_RXFIFO_TOI |      \
-                                S3C2443_UCON_RXERR_IRQEN)
-
-#define GONI_ULCON_DEFAULT     S3C2410_LCON_CS8
-
-#define GONI_UFCON_DEFAULT     S3C2410_UFCON_FIFOMODE
-
-static struct s3c2410_uartcfg goni_uartcfgs[] __initdata = {
-       [0] = {
-               .hwport         = 0,
-               .flags          = 0,
-               .ucon           = GONI_UCON_DEFAULT,
-               .ulcon          = GONI_ULCON_DEFAULT,
-               .ufcon          = GONI_UFCON_DEFAULT |
-                       S5PV210_UFCON_TXTRIG256 | S5PV210_UFCON_RXTRIG256,
-       },
-       [1] = {
-               .hwport         = 1,
-               .flags          = 0,
-               .ucon           = GONI_UCON_DEFAULT,
-               .ulcon          = GONI_ULCON_DEFAULT,
-               .ufcon          = GONI_UFCON_DEFAULT |
-                       S5PV210_UFCON_TXTRIG64 | S5PV210_UFCON_RXTRIG64,
-       },
-       [2] = {
-               .hwport         = 2,
-               .flags          = 0,
-               .ucon           = GONI_UCON_DEFAULT,
-               .ulcon          = GONI_ULCON_DEFAULT,
-               .ufcon          = GONI_UFCON_DEFAULT |
-                       S5PV210_UFCON_TXTRIG16 | S5PV210_UFCON_RXTRIG16,
-       },
-       [3] = {
-               .hwport         = 3,
-               .flags          = 0,
-               .ucon           = GONI_UCON_DEFAULT,
-               .ulcon          = GONI_ULCON_DEFAULT,
-               .ufcon          = GONI_UFCON_DEFAULT |
-                       S5PV210_UFCON_TXTRIG16 | S5PV210_UFCON_RXTRIG16,
-       },
-};
-
-/* Frame Buffer */
-static struct s3c_fb_pd_win goni_fb_win0 = {
-       .max_bpp        = 32,
-       .default_bpp    = 16,
-       .xres           = 480,
-       .yres           = 800,
-       .virtual_x      = 480,
-       .virtual_y      = 2 * 800,
-};
-
-static struct fb_videomode goni_lcd_timing = {
-       .left_margin    = 16,
-       .right_margin   = 16,
-       .upper_margin   = 2,
-       .lower_margin   = 28,
-       .hsync_len      = 2,
-       .vsync_len      = 1,
-       .xres           = 480,
-       .yres           = 800,
-       .refresh        = 55,
-};
-
-static struct s3c_fb_platdata goni_lcd_pdata __initdata = {
-       .win[0]         = &goni_fb_win0,
-       .vtiming        = &goni_lcd_timing,
-       .vidcon0        = VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB |
-                         VIDCON0_CLKSEL_LCD,
-       .vidcon1        = VIDCON1_INV_VCLK | VIDCON1_INV_VDEN
-                         | VIDCON1_INV_HSYNC | VIDCON1_INV_VSYNC,
-       .setup_gpio     = s5pv210_fb_gpio_setup_24bpp,
-};
-
-static int lcd_power_on(struct lcd_device *ld, int enable)
-{
-       return 1;
-}
-
-static int reset_lcd(struct lcd_device *ld)
-{
-       static unsigned int first = 1;
-       int reset_gpio = -1;
-
-       reset_gpio = S5PV210_MP05(5);
-
-       if (first) {
-               gpio_request(reset_gpio, "MLCD_RST");
-               first = 0;
-       }
-
-       gpio_direction_output(reset_gpio, 1);
-       return 1;
-}
-
-static struct lcd_platform_data goni_lcd_platform_data = {
-       .reset                  = reset_lcd,
-       .power_on               = lcd_power_on,
-       .lcd_enabled            = 0,
-       .reset_delay            = 120,  /* 120ms */
-       .power_on_delay         = 25,   /* 25ms */
-       .power_off_delay        = 200,  /* 200ms */
-};
-
-#define LCD_BUS_NUM    3
-static struct spi_board_info spi_board_info[] __initdata = {
-       {
-               .modalias       = "s6e63m0",
-               .platform_data  = &goni_lcd_platform_data,
-               .max_speed_hz   = 1200000,
-               .bus_num        = LCD_BUS_NUM,
-               .chip_select    = 0,
-               .mode           = SPI_MODE_3,
-               .controller_data = (void *)S5PV210_MP01(1), /* DISPLAY_CS */
-       },
-};
-
-static struct spi_gpio_platform_data lcd_spi_gpio_data = {
-       .sck    = S5PV210_MP04(1), /* DISPLAY_CLK */
-       .mosi   = S5PV210_MP04(3), /* DISPLAY_SI */
-       .miso   = SPI_GPIO_NO_MISO,
-       .num_chipselect = 1,
-};
-
-static struct platform_device goni_spi_gpio = {
-       .name   = "spi_gpio",
-       .id     = LCD_BUS_NUM,
-       .dev    = {
-               .parent         = &s3c_device_fb.dev,
-               .platform_data  = &lcd_spi_gpio_data,
-       },
-};
-
-/* KEYPAD */
-static uint32_t keymap[] __initdata = {
-       /* KEY(row, col, keycode) */
-       KEY(0, 1, KEY_MENU),            /* Send */
-       KEY(0, 2, KEY_BACK),            /* End */
-       KEY(1, 1, KEY_CONFIG),          /* Half shot */
-       KEY(1, 2, KEY_VOLUMEUP),
-       KEY(2, 1, KEY_CAMERA),          /* Full shot */
-       KEY(2, 2, KEY_VOLUMEDOWN),
-};
-
-static struct matrix_keymap_data keymap_data __initdata = {
-       .keymap         = keymap,
-       .keymap_size    = ARRAY_SIZE(keymap),
-};
-
-static struct samsung_keypad_platdata keypad_data __initdata = {
-       .keymap_data    = &keymap_data,
-       .rows           = 3,
-       .cols           = 3,
-};
-
-/* Radio */
-static struct i2c_board_info i2c1_devs[] __initdata = {
-       {
-               I2C_BOARD_INFO("si470x", 0x10),
-       },
-};
-
-static void __init goni_radio_init(void)
-{
-       int gpio;
-
-       gpio = S5PV210_GPJ2(4);                 /* XMSMDATA_4 */
-       gpio_request(gpio, "FM_INT");
-       s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(0xf));
-       i2c1_devs[0].irq = gpio_to_irq(gpio);
-
-       gpio = S5PV210_GPJ2(5);                 /* XMSMDATA_5 */
-       gpio_request_one(gpio, GPIOF_OUT_INIT_HIGH, "FM_RST");
-}
-
-/* TSP */
-static struct mxt_platform_data qt602240_platform_data = {
-       .irqflags       = IRQF_TRIGGER_FALLING,
-};
-
-static struct s3c2410_platform_i2c i2c2_data __initdata = {
-       .flags          = 0,
-       .bus_num        = 2,
-       .slave_addr     = 0x10,
-       .frequency      = 400 * 1000,
-       .sda_delay      = 100,
-};
-
-static struct i2c_board_info i2c2_devs[] __initdata = {
-       {
-               I2C_BOARD_INFO("qt602240_ts", 0x4a),
-               .platform_data = &qt602240_platform_data,
-       },
-};
-
-static void __init goni_tsp_init(void)
-{
-       int gpio;
-
-       gpio = S5PV210_GPJ1(3);         /* XMSMADDR_11 */
-       gpio_request_one(gpio, GPIOF_OUT_INIT_HIGH, "TSP_LDO_ON");
-       gpio_export(gpio, 0);
-
-       gpio = S5PV210_GPJ0(5);         /* XMSMADDR_5 */
-       gpio_request(gpio, "TSP_INT");
-
-       s5p_register_gpio_interrupt(gpio);
-       s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(0xf));
-       s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP);
-       i2c2_devs[0].irq = gpio_to_irq(gpio);
-}
-
-/* USB OTG */
-static struct s3c_hsotg_plat goni_hsotg_pdata;
-
-/* MAX8998 regulators */
-#if defined(CONFIG_REGULATOR_MAX8998) || defined(CONFIG_REGULATOR_MAX8998_MODULE)
-
-static struct regulator_consumer_supply goni_ldo3_consumers[] = {
-       REGULATOR_SUPPLY("vusb_a", "s3c-hsotg"),
-};
-
-static struct regulator_consumer_supply goni_ldo5_consumers[] = {
-       REGULATOR_SUPPLY("vmmc", "s3c-sdhci.0"),
-};
-
-static struct regulator_consumer_supply goni_ldo8_consumers[] = {
-       REGULATOR_SUPPLY("vusb_d", "s3c-hsotg"),
-       REGULATOR_SUPPLY("vdd33a_dac", "s5p-sdo"),
-};
-
-static struct regulator_consumer_supply goni_ldo11_consumers[] = {
-       REGULATOR_SUPPLY("vddio", "0-0030"), /* "CAM_IO_2.8V" */
-};
-
-static struct regulator_consumer_supply goni_ldo13_consumers[] = {
-       REGULATOR_SUPPLY("vdda", "0-0030"), /* "CAM_A_2.8V" */
-};
-
-static struct regulator_consumer_supply goni_ldo14_consumers[] = {
-       REGULATOR_SUPPLY("vdd_core", "0-0030"), /* "CAM_CIF_1.8V" */
-};
-
-static struct regulator_init_data goni_ldo2_data = {
-       .constraints    = {
-               .name           = "VALIVE_1.1V",
-               .min_uV         = 1100000,
-               .max_uV         = 1100000,
-               .apply_uV       = 1,
-               .always_on      = 1,
-               .state_mem      = {
-                       .enabled = 1,
-               },
-       },
-};
-
-static struct regulator_init_data goni_ldo3_data = {
-       .constraints    = {
-               .name           = "VUSB+MIPI_1.1V",
-               .min_uV         = 1100000,
-               .max_uV         = 1100000,
-               .apply_uV       = 1,
-               .valid_ops_mask = REGULATOR_CHANGE_STATUS,
-       },
-       .num_consumer_supplies = ARRAY_SIZE(goni_ldo3_consumers),
-       .consumer_supplies = goni_ldo3_consumers,
-};
-
-static struct regulator_init_data goni_ldo4_data = {
-       .constraints    = {
-               .name           = "VDAC_3.3V",
-               .min_uV         = 3300000,
-               .max_uV         = 3300000,
-               .apply_uV       = 1,
-       },
-};
-
-static struct regulator_init_data goni_ldo5_data = {
-       .constraints    = {
-               .name           = "VTF_2.8V",
-               .min_uV         = 2800000,
-               .max_uV         = 2800000,
-               .apply_uV       = 1,
-               .valid_ops_mask = REGULATOR_CHANGE_STATUS,
-       },
-       .num_consumer_supplies = ARRAY_SIZE(goni_ldo5_consumers),
-       .consumer_supplies = goni_ldo5_consumers,
-};
-
-static struct regulator_init_data goni_ldo6_data = {
-       .constraints    = {
-               .name           = "VCC_3.3V",
-               .min_uV         = 3300000,
-               .max_uV         = 3300000,
-               .apply_uV       = 1,
-       },
-};
-
-static struct regulator_init_data goni_ldo7_data = {
-       .constraints    = {
-               .name           = "VLCD_1.8V",
-               .min_uV         = 1800000,
-               .max_uV         = 1800000,
-               .apply_uV       = 1,
-               .always_on      = 1,
-       },
-};
-
-static struct regulator_init_data goni_ldo8_data = {
-       .constraints    = {
-               .name           = "VUSB+VADC_3.3V",
-               .min_uV         = 3300000,
-               .max_uV         = 3300000,
-               .apply_uV       = 1,
-               .valid_ops_mask = REGULATOR_CHANGE_STATUS,
-       },
-       .num_consumer_supplies = ARRAY_SIZE(goni_ldo8_consumers),
-       .consumer_supplies = goni_ldo8_consumers,
-};
-
-static struct regulator_init_data goni_ldo9_data = {
-       .constraints    = {
-               .name           = "VCC+VCAM_2.8V",
-               .min_uV         = 2800000,
-               .max_uV         = 2800000,
-               .apply_uV       = 1,
-       },
-};
-
-static struct regulator_init_data goni_ldo10_data = {
-       .constraints    = {
-               .name           = "VPLL_1.1V",
-               .min_uV         = 1100000,
-               .max_uV         = 1100000,
-               .apply_uV       = 1,
-               .boot_on        = 1,
-       },
-};
-
-static struct regulator_init_data goni_ldo11_data = {
-       .constraints    = {
-               .name           = "CAM_IO_2.8V",
-               .min_uV         = 2800000,
-               .max_uV         = 2800000,
-               .apply_uV       = 1,
-               .valid_ops_mask = REGULATOR_CHANGE_STATUS,
-       },
-       .num_consumer_supplies  = ARRAY_SIZE(goni_ldo11_consumers),
-       .consumer_supplies      = goni_ldo11_consumers,
-};
-
-static struct regulator_init_data goni_ldo12_data = {
-       .constraints    = {
-               .name           = "CAM_ISP_1.2V",
-               .min_uV         = 1200000,
-               .max_uV         = 1200000,
-               .apply_uV       = 1,
-       },
-};
-
-static struct regulator_init_data goni_ldo13_data = {
-       .constraints    = {
-               .name           = "CAM_A_2.8V",
-               .min_uV         = 2800000,
-               .max_uV         = 2800000,
-               .apply_uV       = 1,
-               .valid_ops_mask = REGULATOR_CHANGE_STATUS,
-       },
-       .num_consumer_supplies  = ARRAY_SIZE(goni_ldo13_consumers),
-       .consumer_supplies      = goni_ldo13_consumers,
-};
-
-static struct regulator_init_data goni_ldo14_data = {
-       .constraints    = {
-               .name           = "CAM_CIF_1.8V",
-               .min_uV         = 1800000,
-               .max_uV         = 1800000,
-               .apply_uV       = 1,
-               .valid_ops_mask = REGULATOR_CHANGE_STATUS,
-       },
-       .num_consumer_supplies  = ARRAY_SIZE(goni_ldo14_consumers),
-       .consumer_supplies      = goni_ldo14_consumers,
-};
-
-static struct regulator_init_data goni_ldo15_data = {
-       .constraints    = {
-               .name           = "CAM_AF_3.3V",
-               .min_uV         = 3300000,
-               .max_uV         = 3300000,
-               .apply_uV       = 1,
-       },
-};
-
-static struct regulator_init_data goni_ldo16_data = {
-       .constraints    = {
-               .name           = "VMIPI_1.8V",
-               .min_uV         = 1800000,
-               .max_uV         = 1800000,
-               .apply_uV       = 1,
-       },
-};
-
-static struct regulator_init_data goni_ldo17_data = {
-       .constraints    = {
-               .name           = "VCC_3.0V_LCD",
-               .min_uV         = 3000000,
-               .max_uV         = 3000000,
-               .apply_uV       = 1,
-               .always_on      = 1,
-       },
-};
-
-/* BUCK */
-static struct regulator_consumer_supply buck1_consumer =
-       REGULATOR_SUPPLY("vddarm", NULL);
-
-static struct regulator_consumer_supply buck2_consumer =
-       REGULATOR_SUPPLY("vddint", NULL);
-
-static struct regulator_consumer_supply buck3_consumer =
-       REGULATOR_SUPPLY("vdet", "s5p-sdo");
-
-
-static struct regulator_init_data goni_buck1_data = {
-       .constraints    = {
-               .name           = "VARM_1.2V",
-               .min_uV         = 1200000,
-               .max_uV         = 1200000,
-               .apply_uV       = 1,
-               .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
-                                 REGULATOR_CHANGE_STATUS,
-       },
-       .num_consumer_supplies  = 1,
-       .consumer_supplies      = &buck1_consumer,
-};
-
-static struct regulator_init_data goni_buck2_data = {
-       .constraints    = {
-               .name           = "VINT_1.2V",
-               .min_uV         = 1200000,
-               .max_uV         = 1200000,
-               .apply_uV       = 1,
-               .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
-                                 REGULATOR_CHANGE_STATUS,
-       },
-       .num_consumer_supplies  = 1,
-       .consumer_supplies      = &buck2_consumer,
-};
-
-static struct regulator_init_data goni_buck3_data = {
-       .constraints    = {
-               .name           = "VCC_1.8V",
-               .min_uV         = 1800000,
-               .max_uV         = 1800000,
-               .apply_uV       = 1,
-               .state_mem      = {
-                       .enabled = 1,
-               },
-       },
-       .num_consumer_supplies  = 1,
-       .consumer_supplies      = &buck3_consumer,
-};
-
-static struct regulator_init_data goni_buck4_data = {
-       .constraints    = {
-               .name           = "CAM_CORE_1.2V",
-               .min_uV         = 1200000,
-               .max_uV         = 1200000,
-               .apply_uV       = 1,
-               .always_on      = 1,
-       },
-};
-
-static struct max8998_regulator_data goni_regulators[] = {
-       { MAX8998_LDO2,  &goni_ldo2_data },
-       { MAX8998_LDO3,  &goni_ldo3_data },
-       { MAX8998_LDO4,  &goni_ldo4_data },
-       { MAX8998_LDO5,  &goni_ldo5_data },
-       { MAX8998_LDO6,  &goni_ldo6_data },
-       { MAX8998_LDO7,  &goni_ldo7_data },
-       { MAX8998_LDO8,  &goni_ldo8_data },
-       { MAX8998_LDO9,  &goni_ldo9_data },
-       { MAX8998_LDO10, &goni_ldo10_data },
-       { MAX8998_LDO11, &goni_ldo11_data },
-       { MAX8998_LDO12, &goni_ldo12_data },
-       { MAX8998_LDO13, &goni_ldo13_data },
-       { MAX8998_LDO14, &goni_ldo14_data },
-       { MAX8998_LDO15, &goni_ldo15_data },
-       { MAX8998_LDO16, &goni_ldo16_data },
-       { MAX8998_LDO17, &goni_ldo17_data },
-       { MAX8998_BUCK1, &goni_buck1_data },
-       { MAX8998_BUCK2, &goni_buck2_data },
-       { MAX8998_BUCK3, &goni_buck3_data },
-       { MAX8998_BUCK4, &goni_buck4_data },
-};
-
-static struct max8998_platform_data goni_max8998_pdata = {
-       .num_regulators = ARRAY_SIZE(goni_regulators),
-       .regulators     = goni_regulators,
-       .buck1_set1     = S5PV210_GPH0(3),
-       .buck1_set2     = S5PV210_GPH0(4),
-       .buck2_set3     = S5PV210_GPH0(5),
-       .buck1_voltage  = { 1200000, 1200000, 1200000, 1200000 },
-       .buck2_voltage  = { 1200000, 1200000 },
-};
-#endif
-
-static struct regulator_consumer_supply wm8994_fixed_voltage0_supplies[] = {
-       REGULATOR_SUPPLY("DBVDD", "5-001a"),
-       REGULATOR_SUPPLY("AVDD2", "5-001a"),
-       REGULATOR_SUPPLY("CPVDD", "5-001a"),
-};
-
-static struct regulator_consumer_supply wm8994_fixed_voltage1_supplies[] = {
-       REGULATOR_SUPPLY("SPKVDD1", "5-001a"),
-       REGULATOR_SUPPLY("SPKVDD2", "5-001a"),
-};
-
-static struct regulator_init_data wm8994_fixed_voltage0_init_data = {
-       .constraints = {
-               .always_on = 1,
-       },
-       .num_consumer_supplies  = ARRAY_SIZE(wm8994_fixed_voltage0_supplies),
-       .consumer_supplies      = wm8994_fixed_voltage0_supplies,
-};
-
-static struct regulator_init_data wm8994_fixed_voltage1_init_data = {
-       .constraints = {
-               .always_on = 1,
-       },
-       .num_consumer_supplies  = ARRAY_SIZE(wm8994_fixed_voltage1_supplies),
-       .consumer_supplies      = wm8994_fixed_voltage1_supplies,
-};
-
-static struct fixed_voltage_config wm8994_fixed_voltage0_config = {
-       .supply_name    = "VCC_1.8V_PDA",
-       .microvolts     = 1800000,
-       .gpio           = -EINVAL,
-       .init_data      = &wm8994_fixed_voltage0_init_data,
-};
-
-static struct fixed_voltage_config wm8994_fixed_voltage1_config = {
-       .supply_name    = "V_BAT",
-       .microvolts     = 3700000,
-       .gpio           = -EINVAL,
-       .init_data      = &wm8994_fixed_voltage1_init_data,
-};
-
-static struct platform_device wm8994_fixed_voltage0 = {
-       .name           = "reg-fixed-voltage",
-       .id             = 0,
-       .dev            = {
-               .platform_data  = &wm8994_fixed_voltage0_config,
-       },
-};
-
-static struct platform_device wm8994_fixed_voltage1 = {
-       .name           = "reg-fixed-voltage",
-       .id             = 1,
-       .dev            = {
-               .platform_data  = &wm8994_fixed_voltage1_config,
-       },
-};
-
-static struct regulator_consumer_supply wm8994_avdd1_supply =
-       REGULATOR_SUPPLY("AVDD1", "5-001a");
-
-static struct regulator_consumer_supply wm8994_dcvdd_supply =
-       REGULATOR_SUPPLY("DCVDD", "5-001a");
-
-static struct regulator_init_data wm8994_ldo1_data = {
-       .constraints    = {
-               .name           = "AVDD1_3.0V",
-               .valid_ops_mask = REGULATOR_CHANGE_STATUS,
-       },
-       .num_consumer_supplies  = 1,
-       .consumer_supplies      = &wm8994_avdd1_supply,
-};
-
-static struct regulator_init_data wm8994_ldo2_data = {
-       .constraints    = {
-               .name           = "DCVDD_1.0V",
-       },
-       .num_consumer_supplies  = 1,
-       .consumer_supplies      = &wm8994_dcvdd_supply,
-};
-
-static struct wm8994_pdata wm8994_platform_data = {
-       /* configure gpio1 function: 0x0001(Logic level input/output) */
-       .gpio_defaults[0] = 0x0001,
-       /* configure gpio3/4/5/7 function for AIF2 voice */
-       .gpio_defaults[2] = 0x8100,
-       .gpio_defaults[3] = 0x8100,
-       .gpio_defaults[4] = 0x8100,
-       .gpio_defaults[6] = 0x0100,
-       /* configure gpio8/9/10/11 function for AIF3 BT */
-       .gpio_defaults[7] = 0x8100,
-       .gpio_defaults[8] = 0x0100,
-       .gpio_defaults[9] = 0x0100,
-       .gpio_defaults[10] = 0x0100,
-       .ldo[0] = { S5PV210_MP03(6), &wm8994_ldo1_data },       /* XM0FRNB_2 */
-       .ldo[1] = { 0, &wm8994_ldo2_data },
-};
-
-/* GPIO I2C PMIC */
-#define AP_I2C_GPIO_PMIC_BUS_4 4
-static struct i2c_gpio_platform_data goni_i2c_gpio_pmic_data = {
-       .sda_pin        = S5PV210_GPJ4(0),      /* XMSMCSN */
-       .scl_pin        = S5PV210_GPJ4(3),      /* XMSMIRQN */
-};
-
-static struct platform_device goni_i2c_gpio_pmic = {
-       .name           = "i2c-gpio",
-       .id             = AP_I2C_GPIO_PMIC_BUS_4,
-       .dev            = {
-               .platform_data  = &goni_i2c_gpio_pmic_data,
-       },
-};
-
-static struct i2c_board_info i2c_gpio_pmic_devs[] __initdata = {
-#if defined(CONFIG_REGULATOR_MAX8998) || defined(CONFIG_REGULATOR_MAX8998_MODULE)
-       {
-               /* 0xCC when SRAD = 0 */
-               I2C_BOARD_INFO("max8998", 0xCC >> 1),
-               .platform_data = &goni_max8998_pdata,
-       },
-#endif
-};
-
-/* GPIO I2C AP 1.8V */
-#define AP_I2C_GPIO_BUS_5      5
-static struct i2c_gpio_platform_data goni_i2c_gpio5_data = {
-       .sda_pin        = S5PV210_MP05(3),      /* XM0ADDR_11 */
-       .scl_pin        = S5PV210_MP05(2),      /* XM0ADDR_10 */
-};
-
-static struct platform_device goni_i2c_gpio5 = {
-       .name           = "i2c-gpio",
-       .id             = AP_I2C_GPIO_BUS_5,
-       .dev            = {
-               .platform_data  = &goni_i2c_gpio5_data,
-       },
-};
-
-static struct i2c_board_info i2c_gpio5_devs[] __initdata = {
-       {
-               /* CS/ADDR = low 0x34 (FYI: high = 0x36) */
-               I2C_BOARD_INFO("wm8994", 0x1a),
-               .platform_data  = &wm8994_platform_data,
-       },
-};
-
-/* PMIC Power button */
-static struct gpio_keys_button goni_gpio_keys_table[] = {
-       {
-               .code           = KEY_POWER,
-               .gpio           = S5PV210_GPH2(6),
-               .desc           = "gpio-keys: KEY_POWER",
-               .type           = EV_KEY,
-               .active_low     = 1,
-               .wakeup         = 1,
-               .debounce_interval = 1,
-       },
-};
-
-static struct gpio_keys_platform_data goni_gpio_keys_data = {
-       .buttons        = goni_gpio_keys_table,
-       .nbuttons       = ARRAY_SIZE(goni_gpio_keys_table),
-};
-
-static struct platform_device goni_device_gpiokeys = {
-       .name = "gpio-keys",
-       .dev = {
-               .platform_data = &goni_gpio_keys_data,
-       },
-};
-
-static void __init goni_pmic_init(void)
-{
-       /* AP_PMIC_IRQ: EINT7 */
-       s3c_gpio_cfgpin(S5PV210_GPH0(7), S3C_GPIO_SFN(0xf));
-       s3c_gpio_setpull(S5PV210_GPH0(7), S3C_GPIO_PULL_UP);
-
-       /* nPower: EINT22 */
-       s3c_gpio_cfgpin(S5PV210_GPH2(6), S3C_GPIO_SFN(0xf));
-       s3c_gpio_setpull(S5PV210_GPH2(6), S3C_GPIO_PULL_UP);
-}
-
-/* MoviNAND */
-static struct s3c_sdhci_platdata goni_hsmmc0_data __initdata = {
-       .max_width              = 4,
-       .cd_type                = S3C_SDHCI_CD_PERMANENT,
-};
-
-/* Wireless LAN */
-static struct s3c_sdhci_platdata goni_hsmmc1_data __initdata = {
-       .max_width              = 4,
-       .cd_type                = S3C_SDHCI_CD_EXTERNAL,
-       /* ext_cd_{init,cleanup} callbacks will be added later */
-};
-
-/* External Flash */
-#define GONI_EXT_FLASH_EN      S5PV210_MP05(4)
-#define GONI_EXT_FLASH_CD      S5PV210_GPH3(4)
-static struct s3c_sdhci_platdata goni_hsmmc2_data __initdata = {
-       .max_width              = 4,
-       .cd_type                = S3C_SDHCI_CD_GPIO,
-       .ext_cd_gpio            = GONI_EXT_FLASH_CD,
-       .ext_cd_gpio_invert     = 1,
-};
-
-static struct regulator_consumer_supply mmc2_supplies[] = {
-       REGULATOR_SUPPLY("vmmc", "s3c-sdhci.2"),
-};
-
-static struct regulator_init_data mmc2_fixed_voltage_init_data = {
-       .constraints            = {
-               .name           = "V_TF_2.8V",
-               .valid_ops_mask = REGULATOR_CHANGE_STATUS,
-       },
-       .num_consumer_supplies  = ARRAY_SIZE(mmc2_supplies),
-       .consumer_supplies      = mmc2_supplies,
-};
-
-static struct fixed_voltage_config mmc2_fixed_voltage_config = {
-       .supply_name            = "EXT_FLASH_EN",
-       .microvolts             = 2800000,
-       .gpio                   = GONI_EXT_FLASH_EN,
-       .enable_high            = true,
-       .init_data              = &mmc2_fixed_voltage_init_data,
-};
-
-static struct platform_device mmc2_fixed_voltage = {
-       .name           = "reg-fixed-voltage",
-       .id             = 2,
-       .dev            = {
-               .platform_data  = &mmc2_fixed_voltage_config,
-       },
-};
-
-static void goni_setup_sdhci(void)
-{
-       s3c_sdhci0_set_platdata(&goni_hsmmc0_data);
-       s3c_sdhci1_set_platdata(&goni_hsmmc1_data);
-       s3c_sdhci2_set_platdata(&goni_hsmmc2_data);
-};
-
-/* Audio device */
-static struct platform_device goni_device_audio = {
-       .name = "smdk-audio",
-       .id = -1,
-};
-
-static struct platform_device *goni_devices[] __initdata = {
-       &s3c_device_fb,
-       &s5p_device_onenand,
-       &goni_spi_gpio,
-       &goni_i2c_gpio_pmic,
-       &goni_i2c_gpio5,
-       &goni_device_audio,
-       &mmc2_fixed_voltage,
-       &goni_device_gpiokeys,
-       &s5p_device_mfc,
-       &s5p_device_mfc_l,
-       &s5p_device_mfc_r,
-       &s5p_device_mixer,
-       &s5p_device_sdo,
-       &s3c_device_i2c0,
-       &s3c_device_hsmmc0,
-       &s3c_device_hsmmc1,
-       &s3c_device_hsmmc2,
-       &s5pv210_device_iis0,
-       &s3c_device_usb_hsotg,
-       &samsung_device_keypad,
-       &s3c_device_i2c1,
-       &s3c_device_i2c2,
-       &wm8994_fixed_voltage0,
-       &wm8994_fixed_voltage1,
-};
-
-static void __init goni_sound_init(void)
-{
-       /* Ths main clock of WM8994 codec uses the output of CLKOUT pin.
-        * The CLKOUT[9:8] set to 0x3(XUSBXTI) of 0xE010E000(OTHERS)
-        * because it needs 24MHz clock to operate WM8994 codec.
-        */
-       __raw_writel(__raw_readl(S5P_OTHERS) | (0x3 << 8), S5P_OTHERS);
-}
-
-static void __init goni_map_io(void)
-{
-       s5pv210_init_io(NULL, 0);
-       s3c24xx_init_clocks(clk_xusbxti.rate);
-       s3c24xx_init_uarts(goni_uartcfgs, ARRAY_SIZE(goni_uartcfgs));
-       samsung_set_timer_source(SAMSUNG_PWM3, SAMSUNG_PWM4);
-}
-
-static void __init goni_reserve(void)
-{
-       s5p_mfc_reserve_mem(0x43000000, 8 << 20, 0x51000000, 8 << 20);
-}
-
-static void __init goni_machine_init(void)
-{
-       /* Radio: call before I2C 1 registeration */
-       goni_radio_init();
-
-       /* I2C0 */
-       s3c_i2c0_set_platdata(NULL);
-
-       /* I2C1 */
-       s3c_i2c1_set_platdata(NULL);
-       i2c_register_board_info(1, i2c1_devs, ARRAY_SIZE(i2c1_devs));
-
-       /* TSP: call before I2C 2 registeration */
-       goni_tsp_init();
-
-       /* I2C2 */
-       s3c_i2c2_set_platdata(&i2c2_data);
-       i2c_register_board_info(2, i2c2_devs, ARRAY_SIZE(i2c2_devs));
-
-       /* PMIC */
-       goni_pmic_init();
-       i2c_register_board_info(AP_I2C_GPIO_PMIC_BUS_4, i2c_gpio_pmic_devs,
-                       ARRAY_SIZE(i2c_gpio_pmic_devs));
-       /* SDHCI */
-       goni_setup_sdhci();
-
-       /* SOUND */
-       goni_sound_init();
-       i2c_register_board_info(AP_I2C_GPIO_BUS_5, i2c_gpio5_devs,
-                       ARRAY_SIZE(i2c_gpio5_devs));
-
-       /* FB */
-       s3c_fb_set_platdata(&goni_lcd_pdata);
-
-       s3c_hsotg_set_platdata(&goni_hsotg_pdata);
-
-       /* SPI */
-       spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info));
-
-       /* KEYPAD */
-       samsung_keypad_set_platdata(&keypad_data);
-
-       platform_add_devices(goni_devices, ARRAY_SIZE(goni_devices));
-}
-
-MACHINE_START(GONI, "GONI")
-       /* Maintainers: Kyungmin Park <kyungmin.park@samsung.com> */
-       .atag_offset    = 0x100,
-       .init_irq       = s5pv210_init_irq,
-       .map_io         = goni_map_io,
-       .init_machine   = goni_machine_init,
-       .init_time      = samsung_timer_init,
-       .reserve        = &goni_reserve,
-       .restart        = s5pv210_restart,
-MACHINE_END
diff --git a/arch/arm/mach-s5pv210/mach-smdkc110.c b/arch/arm/mach-s5pv210/mach-smdkc110.c
deleted file mode 100644 (file)
index 448e1d2..0000000
+++ /dev/null
@@ -1,159 +0,0 @@
-/* linux/arch/arm/mach-s5pv210/mach-smdkc110.c
- *
- * Copyright (c) 2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/init.h>
-#include <linux/serial_core.h>
-#include <linux/serial_s3c.h>
-#include <linux/i2c.h>
-#include <linux/device.h>
-
-#include <asm/mach/arch.h>
-#include <asm/mach/map.h>
-#include <asm/setup.h>
-#include <asm/mach-types.h>
-
-#include <mach/map.h>
-#include <mach/regs-clock.h>
-
-#include <plat/devs.h>
-#include <plat/cpu.h>
-#include <linux/platform_data/ata-samsung_cf.h>
-#include <linux/platform_data/i2c-s3c2410.h>
-#include <plat/pm.h>
-#include <plat/samsung-time.h>
-#include <plat/mfc.h>
-
-#include "common.h"
-
-/* Following are default values for UCON, ULCON and UFCON UART registers */
-#define SMDKC110_UCON_DEFAULT  (S3C2410_UCON_TXILEVEL |        \
-                                S3C2410_UCON_RXILEVEL |        \
-                                S3C2410_UCON_TXIRQMODE |       \
-                                S3C2410_UCON_RXIRQMODE |       \
-                                S3C2410_UCON_RXFIFO_TOI |      \
-                                S3C2443_UCON_RXERR_IRQEN)
-
-#define SMDKC110_ULCON_DEFAULT S3C2410_LCON_CS8
-
-#define SMDKC110_UFCON_DEFAULT (S3C2410_UFCON_FIFOMODE |       \
-                                S5PV210_UFCON_TXTRIG4 |        \
-                                S5PV210_UFCON_RXTRIG4)
-
-static struct s3c2410_uartcfg smdkv210_uartcfgs[] __initdata = {
-       [0] = {
-               .hwport         = 0,
-               .flags          = 0,
-               .ucon           = SMDKC110_UCON_DEFAULT,
-               .ulcon          = SMDKC110_ULCON_DEFAULT,
-               .ufcon          = SMDKC110_UFCON_DEFAULT,
-       },
-       [1] = {
-               .hwport         = 1,
-               .flags          = 0,
-               .ucon           = SMDKC110_UCON_DEFAULT,
-               .ulcon          = SMDKC110_ULCON_DEFAULT,
-               .ufcon          = SMDKC110_UFCON_DEFAULT,
-       },
-       [2] = {
-               .hwport         = 2,
-               .flags          = 0,
-               .ucon           = SMDKC110_UCON_DEFAULT,
-               .ulcon          = SMDKC110_ULCON_DEFAULT,
-               .ufcon          = SMDKC110_UFCON_DEFAULT,
-       },
-       [3] = {
-               .hwport         = 3,
-               .flags          = 0,
-               .ucon           = SMDKC110_UCON_DEFAULT,
-               .ulcon          = SMDKC110_ULCON_DEFAULT,
-               .ufcon          = SMDKC110_UFCON_DEFAULT,
-       },
-};
-
-static struct s3c_ide_platdata smdkc110_ide_pdata __initdata = {
-       .setup_gpio     = s5pv210_ide_setup_gpio,
-};
-
-static struct platform_device *smdkc110_devices[] __initdata = {
-       &s5pv210_device_iis0,
-       &s5pv210_device_ac97,
-       &s5pv210_device_spdif,
-       &s3c_device_cfcon,
-       &s3c_device_i2c0,
-       &s3c_device_i2c1,
-       &s3c_device_i2c2,
-       &s3c_device_rtc,
-       &s3c_device_wdt,
-       &s5p_device_fimc0,
-       &s5p_device_fimc1,
-       &s5p_device_fimc2,
-       &s5p_device_fimc_md,
-       &s5p_device_mfc,
-       &s5p_device_mfc_l,
-       &s5p_device_mfc_r,
-};
-
-static struct i2c_board_info smdkc110_i2c_devs0[] __initdata = {
-       { I2C_BOARD_INFO("24c08", 0x50), },     /* Samsung S524AD0XD1 */
-       { I2C_BOARD_INFO("wm8580", 0x1b), },
-};
-
-static struct i2c_board_info smdkc110_i2c_devs1[] __initdata = {
-       /* To Be Updated */
-};
-
-static struct i2c_board_info smdkc110_i2c_devs2[] __initdata = {
-       /* To Be Updated */
-};
-
-static void __init smdkc110_map_io(void)
-{
-       s5pv210_init_io(NULL, 0);
-       s3c24xx_init_clocks(24000000);
-       s3c24xx_init_uarts(smdkv210_uartcfgs, ARRAY_SIZE(smdkv210_uartcfgs));
-       samsung_set_timer_source(SAMSUNG_PWM3, SAMSUNG_PWM4);
-}
-
-static void __init smdkc110_reserve(void)
-{
-       s5p_mfc_reserve_mem(0x43000000, 8 << 20, 0x51000000, 8 << 20);
-}
-
-static void __init smdkc110_machine_init(void)
-{
-       s3c_pm_init();
-
-       s3c_i2c0_set_platdata(NULL);
-       s3c_i2c1_set_platdata(NULL);
-       s3c_i2c2_set_platdata(NULL);
-       i2c_register_board_info(0, smdkc110_i2c_devs0,
-                       ARRAY_SIZE(smdkc110_i2c_devs0));
-       i2c_register_board_info(1, smdkc110_i2c_devs1,
-                       ARRAY_SIZE(smdkc110_i2c_devs1));
-       i2c_register_board_info(2, smdkc110_i2c_devs2,
-                       ARRAY_SIZE(smdkc110_i2c_devs2));
-
-       s3c_ide_set_platdata(&smdkc110_ide_pdata);
-
-       platform_add_devices(smdkc110_devices, ARRAY_SIZE(smdkc110_devices));
-}
-
-MACHINE_START(SMDKC110, "SMDKC110")
-       /* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */
-       .atag_offset    = 0x100,
-       .init_irq       = s5pv210_init_irq,
-       .map_io         = smdkc110_map_io,
-       .init_machine   = smdkc110_machine_init,
-       .init_time      = samsung_timer_init,
-       .restart        = s5pv210_restart,
-       .reserve        = &smdkc110_reserve,
-MACHINE_END
diff --git a/arch/arm/mach-s5pv210/mach-smdkv210.c b/arch/arm/mach-s5pv210/mach-smdkv210.c
deleted file mode 100644 (file)
index 2a6655f..0000000
+++ /dev/null
@@ -1,337 +0,0 @@
-/* linux/arch/arm/mach-s5pv210/mach-smdkv210.c
- *
- * Copyright (c) 2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/i2c.h>
-#include <linux/init.h>
-#include <linux/serial_core.h>
-#include <linux/serial_s3c.h>
-#include <linux/device.h>
-#include <linux/dm9000.h>
-#include <linux/fb.h>
-#include <linux/gpio.h>
-#include <linux/delay.h>
-#include <linux/pwm_backlight.h>
-#include <linux/platform_data/s3c-hsotg.h>
-
-#include <asm/mach/arch.h>
-#include <asm/mach/map.h>
-#include <asm/setup.h>
-#include <asm/mach-types.h>
-
-#include <video/platform_lcd.h>
-#include <video/samsung_fimd.h>
-
-#include <mach/map.h>
-#include <mach/regs-clock.h>
-
-#include <plat/regs-srom.h>
-#include <plat/gpio-cfg.h>
-#include <plat/devs.h>
-#include <plat/cpu.h>
-#include <plat/adc.h>
-#include <linux/platform_data/touchscreen-s3c2410.h>
-#include <linux/platform_data/ata-samsung_cf.h>
-#include <linux/platform_data/i2c-s3c2410.h>
-#include <plat/keypad.h>
-#include <plat/pm.h>
-#include <plat/fb.h>
-#include <plat/samsung-time.h>
-#include <plat/backlight.h>
-#include <plat/mfc.h>
-#include <plat/clock.h>
-
-#include "common.h"
-
-/* Following are default values for UCON, ULCON and UFCON UART registers */
-#define SMDKV210_UCON_DEFAULT  (S3C2410_UCON_TXILEVEL |        \
-                                S3C2410_UCON_RXILEVEL |        \
-                                S3C2410_UCON_TXIRQMODE |       \
-                                S3C2410_UCON_RXIRQMODE |       \
-                                S3C2410_UCON_RXFIFO_TOI |      \
-                                S3C2443_UCON_RXERR_IRQEN)
-
-#define SMDKV210_ULCON_DEFAULT S3C2410_LCON_CS8
-
-#define SMDKV210_UFCON_DEFAULT (S3C2410_UFCON_FIFOMODE |       \
-                                S5PV210_UFCON_TXTRIG4 |        \
-                                S5PV210_UFCON_RXTRIG4)
-
-static struct s3c2410_uartcfg smdkv210_uartcfgs[] __initdata = {
-       [0] = {
-               .hwport         = 0,
-               .flags          = 0,
-               .ucon           = SMDKV210_UCON_DEFAULT,
-               .ulcon          = SMDKV210_ULCON_DEFAULT,
-               .ufcon          = SMDKV210_UFCON_DEFAULT,
-       },
-       [1] = {
-               .hwport         = 1,
-               .flags          = 0,
-               .ucon           = SMDKV210_UCON_DEFAULT,
-               .ulcon          = SMDKV210_ULCON_DEFAULT,
-               .ufcon          = SMDKV210_UFCON_DEFAULT,
-       },
-       [2] = {
-               .hwport         = 2,
-               .flags          = 0,
-               .ucon           = SMDKV210_UCON_DEFAULT,
-               .ulcon          = SMDKV210_ULCON_DEFAULT,
-               .ufcon          = SMDKV210_UFCON_DEFAULT,
-       },
-       [3] = {
-               .hwport         = 3,
-               .flags          = 0,
-               .ucon           = SMDKV210_UCON_DEFAULT,
-               .ulcon          = SMDKV210_ULCON_DEFAULT,
-               .ufcon          = SMDKV210_UFCON_DEFAULT,
-       },
-};
-
-static struct s3c_ide_platdata smdkv210_ide_pdata __initdata = {
-       .setup_gpio     = s5pv210_ide_setup_gpio,
-};
-
-static uint32_t smdkv210_keymap[] __initdata = {
-       /* KEY(row, col, keycode) */
-       KEY(0, 3, KEY_1), KEY(0, 4, KEY_2), KEY(0, 5, KEY_3),
-       KEY(0, 6, KEY_4), KEY(0, 7, KEY_5),
-       KEY(1, 3, KEY_A), KEY(1, 4, KEY_B), KEY(1, 5, KEY_C),
-       KEY(1, 6, KEY_D), KEY(1, 7, KEY_E)
-};
-
-static struct matrix_keymap_data smdkv210_keymap_data __initdata = {
-       .keymap         = smdkv210_keymap,
-       .keymap_size    = ARRAY_SIZE(smdkv210_keymap),
-};
-
-static struct samsung_keypad_platdata smdkv210_keypad_data __initdata = {
-       .keymap_data    = &smdkv210_keymap_data,
-       .rows           = 8,
-       .cols           = 8,
-};
-
-static struct resource smdkv210_dm9000_resources[] = {
-       [0] = DEFINE_RES_MEM(S5PV210_PA_SROM_BANK5, 1),
-       [1] = DEFINE_RES_MEM(S5PV210_PA_SROM_BANK5 + 2, 1),
-       [2] = DEFINE_RES_NAMED(IRQ_EINT(9), 1, NULL, IORESOURCE_IRQ \
-                               | IORESOURCE_IRQ_HIGHLEVEL),
-};
-
-static struct dm9000_plat_data smdkv210_dm9000_platdata = {
-       .flags          = DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM,
-       .dev_addr       = { 0x00, 0x09, 0xc0, 0xff, 0xec, 0x48 },
-};
-
-static struct platform_device smdkv210_dm9000 = {
-       .name           = "dm9000",
-       .id             = -1,
-       .num_resources  = ARRAY_SIZE(smdkv210_dm9000_resources),
-       .resource       = smdkv210_dm9000_resources,
-       .dev            = {
-               .platform_data  = &smdkv210_dm9000_platdata,
-       },
-};
-
-static void smdkv210_lte480wv_set_power(struct plat_lcd_data *pd,
-                                       unsigned int power)
-{
-       if (power) {
-#if !defined(CONFIG_BACKLIGHT_PWM)
-               gpio_request_one(S5PV210_GPD0(3), GPIOF_OUT_INIT_HIGH, "GPD0");
-               gpio_free(S5PV210_GPD0(3));
-#endif
-
-               /* fire nRESET on power up */
-               gpio_request_one(S5PV210_GPH0(6), GPIOF_OUT_INIT_HIGH, "GPH0");
-
-               gpio_set_value(S5PV210_GPH0(6), 0);
-               mdelay(10);
-
-               gpio_set_value(S5PV210_GPH0(6), 1);
-               mdelay(10);
-
-               gpio_free(S5PV210_GPH0(6));
-       } else {
-#if !defined(CONFIG_BACKLIGHT_PWM)
-               gpio_request_one(S5PV210_GPD0(3), GPIOF_OUT_INIT_LOW, "GPD0");
-               gpio_free(S5PV210_GPD0(3));
-#endif
-       }
-}
-
-static struct plat_lcd_data smdkv210_lcd_lte480wv_data = {
-       .set_power      = smdkv210_lte480wv_set_power,
-};
-
-static struct platform_device smdkv210_lcd_lte480wv = {
-       .name                   = "platform-lcd",
-       .dev.parent             = &s3c_device_fb.dev,
-       .dev.platform_data      = &smdkv210_lcd_lte480wv_data,
-};
-
-static struct s3c_fb_pd_win smdkv210_fb_win0 = {
-       .max_bpp        = 32,
-       .default_bpp    = 24,
-       .xres           = 800,
-       .yres           = 480,
-};
-
-static struct fb_videomode smdkv210_lcd_timing = {
-       .left_margin    = 13,
-       .right_margin   = 8,
-       .upper_margin   = 7,
-       .lower_margin   = 5,
-       .hsync_len      = 3,
-       .vsync_len      = 1,
-       .xres           = 800,
-       .yres           = 480,
-};
-
-static struct s3c_fb_platdata smdkv210_lcd0_pdata __initdata = {
-       .win[0]         = &smdkv210_fb_win0,
-       .vtiming        = &smdkv210_lcd_timing,
-       .vidcon0        = VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB,
-       .vidcon1        = VIDCON1_INV_HSYNC | VIDCON1_INV_VSYNC,
-       .setup_gpio     = s5pv210_fb_gpio_setup_24bpp,
-};
-
-/* USB OTG */
-static struct s3c_hsotg_plat smdkv210_hsotg_pdata;
-
-static struct platform_device *smdkv210_devices[] __initdata = {
-       &s3c_device_adc,
-       &s3c_device_cfcon,
-       &s3c_device_fb,
-       &s3c_device_hsmmc0,
-       &s3c_device_hsmmc1,
-       &s3c_device_hsmmc2,
-       &s3c_device_hsmmc3,
-       &s3c_device_i2c0,
-       &s3c_device_i2c1,
-       &s3c_device_i2c2,
-       &samsung_device_pwm,
-       &s3c_device_rtc,
-       &s3c_device_ts,
-       &s3c_device_usb_hsotg,
-       &s3c_device_wdt,
-       &s5p_device_fimc0,
-       &s5p_device_fimc1,
-       &s5p_device_fimc2,
-       &s5p_device_fimc_md,
-       &s5p_device_jpeg,
-       &s5p_device_mfc,
-       &s5p_device_mfc_l,
-       &s5p_device_mfc_r,
-       &s5pv210_device_ac97,
-       &s5pv210_device_iis0,
-       &s5pv210_device_spdif,
-       &samsung_asoc_idma,
-       &samsung_device_keypad,
-       &smdkv210_dm9000,
-       &smdkv210_lcd_lte480wv,
-};
-
-static void __init smdkv210_dm9000_init(void)
-{
-       unsigned int tmp;
-
-       gpio_request(S5PV210_MP01(5), "nCS5");
-       s3c_gpio_cfgpin(S5PV210_MP01(5), S3C_GPIO_SFN(2));
-       gpio_free(S5PV210_MP01(5));
-
-       tmp = (5 << S5P_SROM_BCX__TACC__SHIFT);
-       __raw_writel(tmp, S5P_SROM_BC5);
-
-       tmp = __raw_readl(S5P_SROM_BW);
-       tmp &= (S5P_SROM_BW__CS_MASK << S5P_SROM_BW__NCS5__SHIFT);
-       tmp |= (1 << S5P_SROM_BW__NCS5__SHIFT);
-       __raw_writel(tmp, S5P_SROM_BW);
-}
-
-static struct i2c_board_info smdkv210_i2c_devs0[] __initdata = {
-       { I2C_BOARD_INFO("24c08", 0x50), },     /* Samsung S524AD0XD1 */
-       { I2C_BOARD_INFO("wm8580", 0x1b), },
-};
-
-static struct i2c_board_info smdkv210_i2c_devs1[] __initdata = {
-       /* To Be Updated */
-};
-
-static struct i2c_board_info smdkv210_i2c_devs2[] __initdata = {
-       /* To Be Updated */
-};
-
-/* LCD Backlight data */
-static struct samsung_bl_gpio_info smdkv210_bl_gpio_info = {
-       .no = S5PV210_GPD0(3),
-       .func = S3C_GPIO_SFN(2),
-};
-
-static struct platform_pwm_backlight_data smdkv210_bl_data = {
-       .pwm_id = 3,
-       .pwm_period_ns = 1000,
-       .enable_gpio = -1,
-};
-
-static void __init smdkv210_map_io(void)
-{
-       s5pv210_init_io(NULL, 0);
-       s3c24xx_init_clocks(clk_xusbxti.rate);
-       s3c24xx_init_uarts(smdkv210_uartcfgs, ARRAY_SIZE(smdkv210_uartcfgs));
-       samsung_set_timer_source(SAMSUNG_PWM2, SAMSUNG_PWM4);
-}
-
-static void __init smdkv210_reserve(void)
-{
-       s5p_mfc_reserve_mem(0x43000000, 8 << 20, 0x51000000, 8 << 20);
-}
-
-static void __init smdkv210_machine_init(void)
-{
-       s3c_pm_init();
-
-       smdkv210_dm9000_init();
-
-       samsung_keypad_set_platdata(&smdkv210_keypad_data);
-       s3c24xx_ts_set_platdata(NULL);
-
-       s3c_i2c0_set_platdata(NULL);
-       s3c_i2c1_set_platdata(NULL);
-       s3c_i2c2_set_platdata(NULL);
-       i2c_register_board_info(0, smdkv210_i2c_devs0,
-                       ARRAY_SIZE(smdkv210_i2c_devs0));
-       i2c_register_board_info(1, smdkv210_i2c_devs1,
-                       ARRAY_SIZE(smdkv210_i2c_devs1));
-       i2c_register_board_info(2, smdkv210_i2c_devs2,
-                       ARRAY_SIZE(smdkv210_i2c_devs2));
-
-       s3c_ide_set_platdata(&smdkv210_ide_pdata);
-
-       s3c_fb_set_platdata(&smdkv210_lcd0_pdata);
-
-       s3c_hsotg_set_platdata(&smdkv210_hsotg_pdata);
-
-       platform_add_devices(smdkv210_devices, ARRAY_SIZE(smdkv210_devices));
-
-       samsung_bl_set(&smdkv210_bl_gpio_info, &smdkv210_bl_data);
-}
-
-MACHINE_START(SMDKV210, "SMDKV210")
-       /* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */
-       .atag_offset    = 0x100,
-       .init_irq       = s5pv210_init_irq,
-       .map_io         = smdkv210_map_io,
-       .init_machine   = smdkv210_machine_init,
-       .init_time      = samsung_timer_init,
-       .restart        = s5pv210_restart,
-       .reserve        = &smdkv210_reserve,
-MACHINE_END
diff --git a/arch/arm/mach-s5pv210/mach-torbreck.c b/arch/arm/mach-s5pv210/mach-torbreck.c
deleted file mode 100644 (file)
index 1578055..0000000
+++ /dev/null
@@ -1,135 +0,0 @@
-/* linux/arch/arm/mach-s5pv210/mach-torbreck.c
- *
- * Copyright (c) 2010 aESOP Community
- *             http://www.aesop.or.kr/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/i2c.h>
-#include <linux/init.h>
-#include <linux/serial_core.h>
-#include <linux/serial_s3c.h>
-
-#include <asm/mach/arch.h>
-#include <asm/mach/map.h>
-#include <asm/setup.h>
-#include <asm/mach-types.h>
-
-#include <mach/map.h>
-#include <mach/regs-clock.h>
-
-#include <plat/devs.h>
-#include <plat/cpu.h>
-#include <linux/platform_data/i2c-s3c2410.h>
-#include <plat/samsung-time.h>
-
-#include "common.h"
-
-/* Following are default values for UCON, ULCON and UFCON UART registers */
-#define TORBRECK_UCON_DEFAULT  (S3C2410_UCON_TXILEVEL |        \
-                                S3C2410_UCON_RXILEVEL |        \
-                                S3C2410_UCON_TXIRQMODE |       \
-                                S3C2410_UCON_RXIRQMODE |       \
-                                S3C2410_UCON_RXFIFO_TOI |      \
-                                S3C2443_UCON_RXERR_IRQEN)
-
-#define TORBRECK_ULCON_DEFAULT S3C2410_LCON_CS8
-
-#define TORBRECK_UFCON_DEFAULT (S3C2410_UFCON_FIFOMODE |       \
-                                S5PV210_UFCON_TXTRIG4 |        \
-                                S5PV210_UFCON_RXTRIG4)
-
-static struct s3c2410_uartcfg torbreck_uartcfgs[] __initdata = {
-       [0] = {
-               .hwport         = 0,
-               .flags          = 0,
-               .ucon           = TORBRECK_UCON_DEFAULT,
-               .ulcon          = TORBRECK_ULCON_DEFAULT,
-               .ufcon          = TORBRECK_UFCON_DEFAULT,
-       },
-       [1] = {
-               .hwport         = 1,
-               .flags          = 0,
-               .ucon           = TORBRECK_UCON_DEFAULT,
-               .ulcon          = TORBRECK_ULCON_DEFAULT,
-               .ufcon          = TORBRECK_UFCON_DEFAULT,
-       },
-       [2] = {
-               .hwport         = 2,
-               .flags          = 0,
-               .ucon           = TORBRECK_UCON_DEFAULT,
-               .ulcon          = TORBRECK_ULCON_DEFAULT,
-               .ufcon          = TORBRECK_UFCON_DEFAULT,
-       },
-       [3] = {
-               .hwport         = 3,
-               .flags          = 0,
-               .ucon           = TORBRECK_UCON_DEFAULT,
-               .ulcon          = TORBRECK_ULCON_DEFAULT,
-               .ufcon          = TORBRECK_UFCON_DEFAULT,
-       },
-};
-
-static struct platform_device *torbreck_devices[] __initdata = {
-       &s5pv210_device_iis0,
-       &s3c_device_cfcon,
-       &s3c_device_hsmmc0,
-       &s3c_device_hsmmc1,
-       &s3c_device_hsmmc2,
-       &s3c_device_hsmmc3,
-       &s3c_device_i2c0,
-       &s3c_device_i2c1,
-       &s3c_device_i2c2,
-       &s3c_device_rtc,
-       &s3c_device_wdt,
-};
-
-static struct i2c_board_info torbreck_i2c_devs0[] __initdata = {
-       /* To Be Updated */
-};
-
-static struct i2c_board_info torbreck_i2c_devs1[] __initdata = {
-       /* To Be Updated */
-};
-
-static struct i2c_board_info torbreck_i2c_devs2[] __initdata = {
-       /* To Be Updated */
-};
-
-static void __init torbreck_map_io(void)
-{
-       s5pv210_init_io(NULL, 0);
-       s3c24xx_init_clocks(24000000);
-       s3c24xx_init_uarts(torbreck_uartcfgs, ARRAY_SIZE(torbreck_uartcfgs));
-       samsung_set_timer_source(SAMSUNG_PWM3, SAMSUNG_PWM4);
-}
-
-static void __init torbreck_machine_init(void)
-{
-       s3c_i2c0_set_platdata(NULL);
-       s3c_i2c1_set_platdata(NULL);
-       s3c_i2c2_set_platdata(NULL);
-       i2c_register_board_info(0, torbreck_i2c_devs0,
-                       ARRAY_SIZE(torbreck_i2c_devs0));
-       i2c_register_board_info(1, torbreck_i2c_devs1,
-                       ARRAY_SIZE(torbreck_i2c_devs1));
-       i2c_register_board_info(2, torbreck_i2c_devs2,
-                       ARRAY_SIZE(torbreck_i2c_devs2));
-
-       platform_add_devices(torbreck_devices, ARRAY_SIZE(torbreck_devices));
-}
-
-MACHINE_START(TORBRECK, "TORBRECK")
-       /* Maintainer: Hyunchul Ko <ghcstop@gmail.com> */
-       .atag_offset    = 0x100,
-       .init_irq       = s5pv210_init_irq,
-       .map_io         = torbreck_map_io,
-       .init_machine   = torbreck_machine_init,
-       .init_time      = samsung_timer_init,
-       .restart        = s5pv210_restart,
-MACHINE_END
index 3cf3f9c8ddd124e84e7124514544377cfcc4d430..123163dd2ab0b394c100eda6c828cf644fb3e495 100644 (file)
@@ -1,6 +1,6 @@
 /* linux/arch/arm/mach-s5pv210/pm.c
  *
- * Copyright (c) 2010 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2010-2014 Samsung Electronics Co., Ltd.
  *             http://www.samsung.com
  *
  * S5PV210 - Power Management support
 #include <linux/syscore_ops.h>
 #include <linux/io.h>
 
-#include <plat/cpu.h>
-#include <plat/pm.h>
+#include <asm/cacheflush.h>
+#include <asm/suspend.h>
+
+#include <plat/pm-common.h>
 
-#include <mach/regs-irq.h>
 #include <mach/regs-clock.h>
 
-static struct sleep_save s5pv210_core_save[] = {
-       /* Clock source */
-       SAVE_ITEM(S5P_CLK_SRC0),
-       SAVE_ITEM(S5P_CLK_SRC1),
-       SAVE_ITEM(S5P_CLK_SRC2),
-       SAVE_ITEM(S5P_CLK_SRC3),
-       SAVE_ITEM(S5P_CLK_SRC4),
-       SAVE_ITEM(S5P_CLK_SRC5),
-       SAVE_ITEM(S5P_CLK_SRC6),
-
-       /* Clock source Mask */
-       SAVE_ITEM(S5P_CLK_SRC_MASK0),
-       SAVE_ITEM(S5P_CLK_SRC_MASK1),
-
-       /* Clock Divider */
-       SAVE_ITEM(S5P_CLK_DIV0),
-       SAVE_ITEM(S5P_CLK_DIV1),
-       SAVE_ITEM(S5P_CLK_DIV2),
-       SAVE_ITEM(S5P_CLK_DIV3),
-       SAVE_ITEM(S5P_CLK_DIV4),
-       SAVE_ITEM(S5P_CLK_DIV5),
-       SAVE_ITEM(S5P_CLK_DIV6),
-       SAVE_ITEM(S5P_CLK_DIV7),
-
-       /* Clock Main Gate */
-       SAVE_ITEM(S5P_CLKGATE_MAIN0),
-       SAVE_ITEM(S5P_CLKGATE_MAIN1),
-       SAVE_ITEM(S5P_CLKGATE_MAIN2),
-
-       /* Clock source Peri Gate */
-       SAVE_ITEM(S5P_CLKGATE_PERI0),
-       SAVE_ITEM(S5P_CLKGATE_PERI1),
-
-       /* Clock source SCLK Gate */
-       SAVE_ITEM(S5P_CLKGATE_SCLK0),
-       SAVE_ITEM(S5P_CLKGATE_SCLK1),
-
-       /* Clock IP Clock gate */
-       SAVE_ITEM(S5P_CLKGATE_IP0),
-       SAVE_ITEM(S5P_CLKGATE_IP1),
-       SAVE_ITEM(S5P_CLKGATE_IP2),
-       SAVE_ITEM(S5P_CLKGATE_IP3),
-       SAVE_ITEM(S5P_CLKGATE_IP4),
-
-       /* Clock Blcok and Bus gate */
-       SAVE_ITEM(S5P_CLKGATE_BLOCK),
-       SAVE_ITEM(S5P_CLKGATE_BUS0),
+#include "common.h"
 
+static struct sleep_save s5pv210_core_save[] = {
        /* Clock ETC */
-       SAVE_ITEM(S5P_CLK_OUT),
        SAVE_ITEM(S5P_MDNIE_SEL),
 };
 
+/*
+ * VIC wake-up support (TODO)
+ */
+static u32 s5pv210_irqwake_intmask = 0xffffffff;
+
+/*
+ * Suspend helpers.
+ */
 static int s5pv210_cpu_suspend(unsigned long arg)
 {
        unsigned long tmp;
@@ -102,8 +65,12 @@ static void s5pv210_pm_prepare(void)
 {
        unsigned int tmp;
 
+       /* Set wake-up mask registers */
+       __raw_writel(exynos_get_eint_wake_mask(), S5P_EINT_WAKEUP_MASK);
+       __raw_writel(s5pv210_irqwake_intmask, S5P_WAKEUP_MASK);
+
        /* ensure at least INFORM0 has the resume address */
-       __raw_writel(virt_to_phys(s3c_cpu_resume), S5P_INFORM0);
+       __raw_writel(virt_to_phys(s5pv210_cpu_resume), S5P_INFORM0);
 
        tmp = __raw_readl(S5P_SLEEP_CFG);
        tmp &= ~(S5P_SLEEP_CFG_OSC_EN | S5P_SLEEP_CFG_USBOSC_EN);
@@ -123,26 +90,70 @@ static void s5pv210_pm_prepare(void)
        s3c_pm_do_save(s5pv210_core_save, ARRAY_SIZE(s5pv210_core_save));
 }
 
-static int s5pv210_pm_add(struct device *dev, struct subsys_interface *sif)
+/*
+ * Suspend operations.
+ */
+static int s5pv210_suspend_enter(suspend_state_t state)
 {
-       pm_cpu_prep = s5pv210_pm_prepare;
-       pm_cpu_sleep = s5pv210_cpu_suspend;
+       int ret;
+
+       s3c_pm_debug_init();
+
+       S3C_PMDBG("%s: suspending the system...\n", __func__);
+
+       S3C_PMDBG("%s: wakeup masks: %08x,%08x\n", __func__,
+                       s5pv210_irqwake_intmask, exynos_get_eint_wake_mask());
+
+       if (s5pv210_irqwake_intmask == -1U
+           && exynos_get_eint_wake_mask() == -1U) {
+               pr_err("%s: No wake-up sources!\n", __func__);
+               pr_err("%s: Aborting sleep\n", __func__);
+               return -EINVAL;
+       }
+
+       s3c_pm_save_uarts();
+       s5pv210_pm_prepare();
+       flush_cache_all();
+       s3c_pm_check_store();
+
+       ret = cpu_suspend(0, s5pv210_cpu_suspend);
+       if (ret)
+               return ret;
+
+       s3c_pm_restore_uarts();
+
+       S3C_PMDBG("%s: wakeup stat: %08x\n", __func__,
+                       __raw_readl(S5P_WAKEUP_STAT));
+
+       s3c_pm_check_restore();
+
+       S3C_PMDBG("%s: resuming the system...\n", __func__);
 
        return 0;
 }
 
-static struct subsys_interface s5pv210_pm_interface = {
-       .name           = "s5pv210_pm",
-       .subsys         = &s5pv210_subsys,
-       .add_dev        = s5pv210_pm_add,
-};
+static int s5pv210_suspend_prepare(void)
+{
+       s3c_pm_check_prepare();
 
-static __init int s5pv210_pm_drvinit(void)
+       return 0;
+}
+
+static void s5pv210_suspend_finish(void)
 {
-       return subsys_interface_register(&s5pv210_pm_interface);
+       s3c_pm_check_cleanup();
 }
-arch_initcall(s5pv210_pm_drvinit);
 
+static const struct platform_suspend_ops s5pv210_suspend_ops = {
+       .enter          = s5pv210_suspend_enter,
+       .prepare        = s5pv210_suspend_prepare,
+       .finish         = s5pv210_suspend_finish,
+       .valid          = suspend_valid_only_mem,
+};
+
+/*
+ * Syscore operations used to delay restore of certain registers.
+ */
 static void s5pv210_pm_resume(void)
 {
        u32 tmp;
@@ -159,9 +170,11 @@ static struct syscore_ops s5pv210_pm_syscore_ops = {
        .resume         = s5pv210_pm_resume,
 };
 
-static __init int s5pv210_pm_syscore_init(void)
+/*
+ * Initialization entry point.
+ */
+void __init s5pv210_pm_init(void)
 {
        register_syscore_ops(&s5pv210_pm_syscore_ops);
-       return 0;
+       suspend_set_ops(&s5pv210_suspend_ops);
 }
-arch_initcall(s5pv210_pm_syscore_init);
diff --git a/arch/arm/mach-s5pv210/s5pv210.c b/arch/arm/mach-s5pv210/s5pv210.c
new file mode 100644 (file)
index 0000000..53feff3
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ * Samsung's S5PC110/S5PV210 flattened device tree enabled machine.
+ *
+ * Copyright (c) 2013-2014 Samsung Electronics Co., Ltd.
+ * Mateusz Krawczuk <m.krawczuk@partner.samsung.com>
+ * Tomasz Figa <t.figa@samsung.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/of_fdt.h>
+#include <linux/of_platform.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/system_misc.h>
+
+#include <plat/map-base.h>
+#include <mach/regs-clock.h>
+
+#include "common.h"
+
+static int __init s5pv210_fdt_map_sys(unsigned long node, const char *uname,
+                                       int depth, void *data)
+{
+       struct map_desc iodesc;
+       const __be32 *reg;
+       int len;
+
+       if (!of_flat_dt_is_compatible(node, "samsung,s5pv210-clock"))
+               return 0;
+
+       reg = of_get_flat_dt_prop(node, "reg", &len);
+       if (reg == NULL || len != (sizeof(unsigned long) * 2))
+               return 0;
+
+       iodesc.pfn = __phys_to_pfn(be32_to_cpu(reg[0]));
+       iodesc.length = be32_to_cpu(reg[1]) - 1;
+       iodesc.virtual = (unsigned long)S3C_VA_SYS;
+       iodesc.type = MT_DEVICE;
+       iotable_init(&iodesc, 1);
+
+       return 1;
+}
+
+static void __init s5pv210_dt_map_io(void)
+{
+       debug_ll_io_init();
+
+       of_scan_flat_dt(s5pv210_fdt_map_sys, NULL);
+}
+
+static void s5pv210_dt_restart(enum reboot_mode mode, const char *cmd)
+{
+       __raw_writel(0x1, S5P_SWRESET);
+}
+
+static void __init s5pv210_dt_init_late(void)
+{
+       platform_device_register_simple("s5pv210-cpufreq", -1, NULL, 0);
+       s5pv210_pm_init();
+}
+
+static char const *s5pv210_dt_compat[] __initconst = {
+       "samsung,s5pc110",
+       "samsung,s5pv210",
+       NULL
+};
+
+DT_MACHINE_START(S5PV210_DT, "Samsung S5PC110/S5PV210-based board")
+       .dt_compat = s5pv210_dt_compat,
+       .map_io = s5pv210_dt_map_io,
+       .restart = s5pv210_dt_restart,
+       .init_late = s5pv210_dt_init_late,
+MACHINE_END
diff --git a/arch/arm/mach-s5pv210/setup-fb-24bpp.c b/arch/arm/mach-s5pv210/setup-fb-24bpp.c
deleted file mode 100644 (file)
index 55103c8..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-/* linux/arch/arm/plat-s5pv210/setup-fb-24bpp.c
- *
- * Copyright (c) 2009-2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com/
- *
- * Base s5pv210 setup information for 24bpp LCD framebuffer
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/fb.h>
-#include <linux/gpio.h>
-
-#include <mach/map.h>
-#include <plat/fb.h>
-#include <mach/regs-clock.h>
-#include <plat/gpio-cfg.h>
-
-static void s5pv210_fb_cfg_gpios(unsigned int base, unsigned int nr)
-{
-       s3c_gpio_cfgrange_nopull(base, nr, S3C_GPIO_SFN(2));
-
-       for (; nr > 0; nr--, base++)
-               s5p_gpio_set_drvstr(base, S5P_GPIO_DRVSTR_LV4);
-}
-
-
-void s5pv210_fb_gpio_setup_24bpp(void)
-{
-       s5pv210_fb_cfg_gpios(S5PV210_GPF0(0), 8);
-       s5pv210_fb_cfg_gpios(S5PV210_GPF1(0), 8);
-       s5pv210_fb_cfg_gpios(S5PV210_GPF2(0), 8);
-       s5pv210_fb_cfg_gpios(S5PV210_GPF3(0), 4);
-
-       /* Set DISPLAY_CONTROL register for Display path selection.
-        *
-        * ouput   |   RGB   |   I80   |   ITU
-        * -----------------------------------
-        *  00     |   MIE   |  FIMD   |  FIMD
-        *  01     | MDNIE   | MDNIE   |  FIMD
-        *  10     |  FIMD   |  FIMD   |  FIMD
-        *  11     |  FIMD   |  FIMD   |  FIMD
-        */
-       writel(0x2, S5P_MDNIE_SEL);
-}
diff --git a/arch/arm/mach-s5pv210/setup-fimc.c b/arch/arm/mach-s5pv210/setup-fimc.c
deleted file mode 100644 (file)
index 54cc5b1..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2011 Samsung Electronics Co., Ltd.
- *
- * S5PV210 camera interface GPIO configuration.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#include <linux/gpio.h>
-#include <plat/gpio-cfg.h>
-#include <plat/camport.h>
-
-int s5pv210_fimc_setup_gpio(enum s5p_camport_id id)
-{
-       u32 gpio8, gpio5;
-       int ret;
-
-       switch (id) {
-       case S5P_CAMPORT_A:
-               gpio8 = S5PV210_GPE0(0);
-               gpio5 = S5PV210_GPE1(0);
-               break;
-
-       case S5P_CAMPORT_B:
-               gpio8 = S5PV210_GPJ0(0);
-               gpio5 = S5PV210_GPJ1(0);
-               break;
-
-       default:
-               WARN(1, "Wrong camport id: %d\n", id);
-               return -EINVAL;
-       }
-
-       ret = s3c_gpio_cfgall_range(gpio8, 8, S3C_GPIO_SFN(2),
-                                   S3C_GPIO_PULL_UP);
-       if (ret)
-               return ret;
-
-       return s3c_gpio_cfgall_range(gpio5, 5, S3C_GPIO_SFN(2),
-                                    S3C_GPIO_PULL_UP);
-}
diff --git a/arch/arm/mach-s5pv210/setup-i2c0.c b/arch/arm/mach-s5pv210/setup-i2c0.c
deleted file mode 100644 (file)
index 4a15849..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-/* linux/arch/arm/mach-s5pv210/setup-i2c0.c
- *
- * Copyright (c) 2009-2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com/
- *
- * I2C0 GPIO configuration.
- *
- * Based on plat-s3c64xx/setup-i2c0.c
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/gpio.h>
-
-struct platform_device; /* don't need the contents */
-
-#include <linux/platform_data/i2c-s3c2410.h>
-#include <plat/gpio-cfg.h>
-
-void s3c_i2c0_cfg_gpio(struct platform_device *dev)
-{
-       s3c_gpio_cfgall_range(S5PV210_GPD1(0), 2,
-                             S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP);
-}
diff --git a/arch/arm/mach-s5pv210/setup-i2c1.c b/arch/arm/mach-s5pv210/setup-i2c1.c
deleted file mode 100644 (file)
index 4777f6b..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-/* linux/arch/arm/mach-s5pv210/setup-i2c1.c
- *
- * Copyright (c) 2009-2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com/
- *
- * I2C1 GPIO configuration.
- *
- * Based on plat-s3c64xx/setup-i2c1.c
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/gpio.h>
-
-struct platform_device; /* don't need the contents */
-
-#include <linux/platform_data/i2c-s3c2410.h>
-#include <plat/gpio-cfg.h>
-
-void s3c_i2c1_cfg_gpio(struct platform_device *dev)
-{
-       s3c_gpio_cfgall_range(S5PV210_GPD1(2), 2,
-                             S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP);
-}
diff --git a/arch/arm/mach-s5pv210/setup-i2c2.c b/arch/arm/mach-s5pv210/setup-i2c2.c
deleted file mode 100644 (file)
index bbce6c7..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-/* linux/arch/arm/mach-s5pv210/setup-i2c2.c
- *
- * Copyright (c) 2009-2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com/
- *
- * I2C2 GPIO configuration.
- *
- * Based on plat-s3c64xx/setup-i2c0.c
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/gpio.h>
-
-struct platform_device; /* don't need the contents */
-
-#include <linux/platform_data/i2c-s3c2410.h>
-#include <plat/gpio-cfg.h>
-
-void s3c_i2c2_cfg_gpio(struct platform_device *dev)
-{
-       s3c_gpio_cfgall_range(S5PV210_GPD1(4), 2,
-                             S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP);
-}
diff --git a/arch/arm/mach-s5pv210/setup-ide.c b/arch/arm/mach-s5pv210/setup-ide.c
deleted file mode 100644 (file)
index ea123d5..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-/* linux/arch/arm/mach-s5pv210/setup-ide.c
- *
- * Copyright (c) 2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * S5PV210 setup information for IDE
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#include <linux/kernel.h>
-#include <linux/gpio.h>
-
-#include <plat/gpio-cfg.h>
-
-static void s5pv210_ide_cfg_gpios(unsigned int base, unsigned int nr)
-{
-       s3c_gpio_cfgrange_nopull(base, nr, S3C_GPIO_SFN(4));
-
-       for (; nr > 0; nr--, base++)
-               s5p_gpio_set_drvstr(base, S5P_GPIO_DRVSTR_LV4);
-}
-
-void s5pv210_ide_setup_gpio(void)
-{
-       /* CF_Add[0 - 2], CF_IORDY, CF_INTRQ, CF_DMARQ, CF_DMARST, CF_DMACK */
-       s5pv210_ide_cfg_gpios(S5PV210_GPJ0(0), 8);
-
-       /* CF_Data[0 - 7] */
-       s5pv210_ide_cfg_gpios(S5PV210_GPJ2(0), 8);
-
-       /* CF_Data[8 - 15] */
-       s5pv210_ide_cfg_gpios(S5PV210_GPJ3(0), 8);
-
-       /* CF_CS0, CF_CS1, CF_IORD, CF_IOWR */
-       s5pv210_ide_cfg_gpios(S5PV210_GPJ4(0), 4);
-}
diff --git a/arch/arm/mach-s5pv210/setup-keypad.c b/arch/arm/mach-s5pv210/setup-keypad.c
deleted file mode 100644 (file)
index c56420a..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * linux/arch/arm/mach-s5pv210/setup-keypad.c
- *
- * Copyright (C) 2010 Samsung Electronics Co.Ltd
- * Author: Joonyoung Shim <jy0922.shim@samsung.com>
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- */
-
-#include <linux/gpio.h>
-#include <plat/gpio-cfg.h>
-
-void samsung_keypad_cfg_gpio(unsigned int rows, unsigned int cols)
-{
-       /* Set all the necessary GPH3 pins to special-function 3: KP_ROW[x] */
-       s3c_gpio_cfgrange_nopull(S5PV210_GPH3(0), rows, S3C_GPIO_SFN(3));
-
-       /* Set all the necessary GPH2 pins to special-function 3: KP_COL[x] */
-       s3c_gpio_cfgrange_nopull(S5PV210_GPH2(0), cols, S3C_GPIO_SFN(3));
-}
diff --git a/arch/arm/mach-s5pv210/setup-sdhci-gpio.c b/arch/arm/mach-s5pv210/setup-sdhci-gpio.c
deleted file mode 100644 (file)
index 0512ada..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-/* linux/arch/arm/plat-s5pc1xx/setup-sdhci-gpio.c
- *
- * Copyright (c) 2009-2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com/
- *
- * S5PV210 - Helper functions for setting up SDHCI device(s) GPIO (HSMMC)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/interrupt.h>
-#include <linux/platform_device.h>
-#include <linux/io.h>
-#include <linux/gpio.h>
-#include <linux/mmc/host.h>
-#include <linux/mmc/card.h>
-
-#include <plat/gpio-cfg.h>
-#include <plat/sdhci.h>
-
-void s5pv210_setup_sdhci0_cfg_gpio(struct platform_device *dev, int width)
-{
-       struct s3c_sdhci_platdata *pdata = dev->dev.platform_data;
-
-       /* Set all the necessary GPG0/GPG1 pins to special-function 2 */
-       s3c_gpio_cfgrange_nopull(S5PV210_GPG0(0), 2, S3C_GPIO_SFN(2));
-
-       switch (width) {
-       case 8:
-               /* GPG1[3:6] special-function 3 */
-               s3c_gpio_cfgrange_nopull(S5PV210_GPG1(3), 4, S3C_GPIO_SFN(3));
-       case 4:
-               /* GPG0[3:6] special-function 2 */
-               s3c_gpio_cfgrange_nopull(S5PV210_GPG0(3), 4, S3C_GPIO_SFN(2));
-       default:
-               break;
-       }
-
-       if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) {
-               s3c_gpio_setpull(S5PV210_GPG0(2), S3C_GPIO_PULL_UP);
-               s3c_gpio_cfgpin(S5PV210_GPG0(2), S3C_GPIO_SFN(2));
-       }
-}
-
-void s5pv210_setup_sdhci1_cfg_gpio(struct platform_device *dev, int width)
-{
-       struct s3c_sdhci_platdata *pdata = dev->dev.platform_data;
-
-       /* Set all the necessary GPG1[0:1] pins to special-function 2 */
-       s3c_gpio_cfgrange_nopull(S5PV210_GPG1(0), 2, S3C_GPIO_SFN(2));
-
-       /* Data pin GPG1[3:6] to special-function 2 */
-       s3c_gpio_cfgrange_nopull(S5PV210_GPG1(3), 4, S3C_GPIO_SFN(2));
-
-       if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) {
-               s3c_gpio_setpull(S5PV210_GPG1(2), S3C_GPIO_PULL_UP);
-               s3c_gpio_cfgpin(S5PV210_GPG1(2), S3C_GPIO_SFN(2));
-       }
-}
-
-void s5pv210_setup_sdhci2_cfg_gpio(struct platform_device *dev, int width)
-{
-       struct s3c_sdhci_platdata *pdata = dev->dev.platform_data;
-
-       /* Set all the necessary GPG2[0:1] pins to special-function 2 */
-       s3c_gpio_cfgrange_nopull(S5PV210_GPG2(0), 2, S3C_GPIO_SFN(2));
-
-       switch (width) {
-       case 8:
-               /* Data pin GPG3[3:6] to special-function 3 */
-               s3c_gpio_cfgrange_nopull(S5PV210_GPG3(3), 4, S3C_GPIO_SFN(3));
-       case 4:
-               /* Data pin GPG2[3:6] to special-function 2 */
-               s3c_gpio_cfgrange_nopull(S5PV210_GPG2(3), 4, S3C_GPIO_SFN(2));
-       default:
-               break;
-       }
-
-       if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) {
-               s3c_gpio_setpull(S5PV210_GPG2(2), S3C_GPIO_PULL_UP);
-               s3c_gpio_cfgpin(S5PV210_GPG2(2), S3C_GPIO_SFN(2));
-       }
-}
-
-void s5pv210_setup_sdhci3_cfg_gpio(struct platform_device *dev, int width)
-{
-       struct s3c_sdhci_platdata *pdata = dev->dev.platform_data;
-
-       /* Set all the necessary GPG3[0:1] pins to special-function 2 */
-       s3c_gpio_cfgrange_nopull(S5PV210_GPG3(0), 2, S3C_GPIO_SFN(2));
-
-       /* Data pin GPG3[3:6] to special-function 2 */
-       s3c_gpio_cfgrange_nopull(S5PV210_GPG3(3), 4, S3C_GPIO_SFN(2));
-
-       if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) {
-               s3c_gpio_setpull(S5PV210_GPG3(2), S3C_GPIO_PULL_UP);
-               s3c_gpio_cfgpin(S5PV210_GPG3(2), S3C_GPIO_SFN(2));
-       }
-}
diff --git a/arch/arm/mach-s5pv210/setup-spi.c b/arch/arm/mach-s5pv210/setup-spi.c
deleted file mode 100644 (file)
index 81aecc1..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-/* linux/arch/arm/mach-s5pv210/setup-spi.c
- *
- * Copyright (C) 2011 Samsung Electronics Ltd.
- *             http://www.samsung.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#include <linux/gpio.h>
-#include <plat/gpio-cfg.h>
-
-#ifdef CONFIG_S3C64XX_DEV_SPI0
-int s3c64xx_spi0_cfg_gpio(void)
-{
-       s3c_gpio_cfgpin(S5PV210_GPB(0), S3C_GPIO_SFN(2));
-       s3c_gpio_setpull(S5PV210_GPB(0), S3C_GPIO_PULL_UP);
-       s3c_gpio_cfgall_range(S5PV210_GPB(2), 2,
-                               S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP);
-       return 0;
-}
-#endif
-
-#ifdef CONFIG_S3C64XX_DEV_SPI1
-int s3c64xx_spi1_cfg_gpio(void)
-{
-       s3c_gpio_cfgpin(S5PV210_GPB(4), S3C_GPIO_SFN(2));
-       s3c_gpio_setpull(S5PV210_GPB(4), S3C_GPIO_PULL_UP);
-       s3c_gpio_cfgall_range(S5PV210_GPB(6), 2,
-                               S3C_GPIO_SFN(2), S3C_GPIO_PULL_UP);
-       return 0;
-}
-#endif
diff --git a/arch/arm/mach-s5pv210/setup-usb-phy.c b/arch/arm/mach-s5pv210/setup-usb-phy.c
deleted file mode 100644 (file)
index b2ee533..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (C) 2012 Samsung Electronics Co.Ltd
- * Author: Joonyoung Shim <jy0922.shim@samsung.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundationr
- */
-
-#include <linux/clk.h>
-#include <linux/delay.h>
-#include <linux/err.h>
-#include <linux/io.h>
-#include <linux/platform_device.h>
-
-#include <mach/map.h>
-
-#include <plat/cpu.h>
-#include <plat/regs-usb-hsotg-phy.h>
-#include <plat/usb-phy.h>
-
-#define S5PV210_USB_PHY_CON    (S3C_VA_SYS + 0xE80C)
-#define S5PV210_USB_PHY0_EN    (1 << 0)
-#define S5PV210_USB_PHY1_EN    (1 << 1)
-
-static int s5pv210_usb_otgphy_init(struct platform_device *pdev)
-{
-       struct clk *xusbxti;
-       u32 phyclk;
-
-       writel(readl(S5PV210_USB_PHY_CON) | S5PV210_USB_PHY0_EN,
-                       S5PV210_USB_PHY_CON);
-
-       /* set clock frequency for PLL */
-       phyclk = readl(S3C_PHYCLK) & ~S3C_PHYCLK_CLKSEL_MASK;
-
-       xusbxti = clk_get(&pdev->dev, "xusbxti");
-       if (xusbxti && !IS_ERR(xusbxti)) {
-               switch (clk_get_rate(xusbxti)) {
-               case 12 * MHZ:
-                       phyclk |= S3C_PHYCLK_CLKSEL_12M;
-                       break;
-               case 24 * MHZ:
-                       phyclk |= S3C_PHYCLK_CLKSEL_24M;
-                       break;
-               default:
-               case 48 * MHZ:
-                       /* default reference clock */
-                       break;
-               }
-               clk_put(xusbxti);
-       }
-
-       /* TODO: select external clock/oscillator */
-       writel(phyclk | S3C_PHYCLK_CLK_FORCE, S3C_PHYCLK);
-
-       /* set to normal OTG PHY */
-       writel((readl(S3C_PHYPWR) & ~S3C_PHYPWR_NORMAL_MASK), S3C_PHYPWR);
-       mdelay(1);
-
-       /* reset OTG PHY and Link */
-       writel(S3C_RSTCON_PHY | S3C_RSTCON_HCLK | S3C_RSTCON_PHYCLK,
-                       S3C_RSTCON);
-       udelay(20);     /* at-least 10uS */
-       writel(0, S3C_RSTCON);
-
-       return 0;
-}
-
-static int s5pv210_usb_otgphy_exit(struct platform_device *pdev)
-{
-       writel((readl(S3C_PHYPWR) | S3C_PHYPWR_ANALOG_POWERDOWN |
-                               S3C_PHYPWR_OTG_DISABLE), S3C_PHYPWR);
-
-       writel(readl(S5PV210_USB_PHY_CON) & ~S5PV210_USB_PHY0_EN,
-                       S5PV210_USB_PHY_CON);
-
-       return 0;
-}
-
-int s5p_usb_phy_init(struct platform_device *pdev, int type)
-{
-       if (type == USB_PHY_TYPE_DEVICE)
-               return s5pv210_usb_otgphy_init(pdev);
-
-       return -EINVAL;
-}
-
-int s5p_usb_phy_exit(struct platform_device *pdev, int type)
-{
-       if (type == USB_PHY_TYPE_DEVICE)
-               return s5pv210_usb_otgphy_exit(pdev);
-
-       return -EINVAL;
-}
diff --git a/arch/arm/mach-s5pv210/sleep.S b/arch/arm/mach-s5pv210/sleep.S
new file mode 100644 (file)
index 0000000..7c43ddd
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2011-2014 Samsung Electronics Co., Ltd.
+ *             http://www.samsung.com
+ *
+ * S5PV210 Sleep Code
+ * Based on S3C64XX sleep code by:
+ *     Ben Dooks, (c) 2008 Simtec Electronics
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#include <linux/linkage.h>
+
+       .data
+       .align
+
+       /*
+        * sleep magic, to allow the bootloader to check for an valid
+        * image to resume to. Must be the first word before the
+        * s3c_cpu_resume entry.
+        */
+
+       .word   0x2bedf00d
+
+       /*
+        * s3c_cpu_resume
+        *
+        * resume code entry for bootloader to call
+        */
+
+ENTRY(s5pv210_cpu_resume)
+       b       cpu_resume
+ENDPROC(s5pv210_cpu_resume)
index 3a6e3c20a86d898d91e2762fb88a39837d20910f..e15dff790dbbbdc4aaa9937bbff18072828369b9 100644 (file)
@@ -12,6 +12,7 @@ menuconfig ARCH_SHMOBILE_MULTI
        select NO_IOPORT_MAP
        select PINCTRL
        select ARCH_REQUIRE_GPIOLIB
+       select ARCH_HAS_OPP
 
 if ARCH_SHMOBILE_MULTI
 
@@ -25,6 +26,11 @@ config ARCH_R7S72100
        bool "RZ/A1H (R7S72100)"
        select SYS_SUPPORTS_SH_MTU2
 
+config ARCH_R8A7779
+       bool "R-Car H1 (R8A77790)"
+       select RENESAS_INTC_IRQPIN
+       select SYS_SUPPORTS_SH_TMU
+
 config ARCH_R8A7790
        bool "R-Car H2 (R8A77900)"
        select RENESAS_IRQC
@@ -51,6 +57,11 @@ config MACH_LAGER
        depends on ARCH_R8A7790
        select MICREL_PHY if SH_ETH
 
+config MACH_MARZEN
+       bool "MARZEN board"
+       depends on ARCH_R8A7779
+       select REGULATOR_FIXED_VOLTAGE if REGULATOR
+
 comment "Renesas ARM SoCs System Configuration"
 endif
 
@@ -233,19 +244,6 @@ config MACH_MARZEN
        select REGULATOR_FIXED_VOLTAGE if REGULATOR
        select USE_OF
 
-config MACH_MARZEN_REFERENCE
-       bool "MARZEN board - Reference Device Tree Implementation"
-       depends on ARCH_R8A7779
-       select ARCH_REQUIRE_GPIOLIB
-       select REGULATOR_FIXED_VOLTAGE if REGULATOR
-       select USE_OF
-       ---help---
-          Use reference implementation of Marzen board support
-          which makes use of device tree at the expense
-          of not supporting a number of devices.
-
-          This is intended to aid developers
-
 config MACH_LAGER
        bool "Lager board"
        depends on ARCH_R8A7790
index 38d5fe825e934688b2ef51fadc97ed1a7bdaf060..fe3878a1a69a04a063ac7c4c129d93d0193ff987 100644 (file)
@@ -34,31 +34,39 @@ obj-$(CONFIG_ARCH_R8A7791)  += clock-r8a7791.o
 obj-$(CONFIG_ARCH_R7S72100)    += clock-r7s72100.o
 endif
 
+# CPU reset vector handling objects
+cpu-y                          := platsmp.o headsmp.o
+cpu-$(CONFIG_ARCH_R8A7790)     += platsmp-apmu.o
+cpu-$(CONFIG_ARCH_R8A7791)     += platsmp-apmu.o
+
 # SMP objects
-smp-y                          := platsmp.o headsmp.o
+smp-y                          := $(cpu-y)
 smp-$(CONFIG_ARCH_SH73A0)      += smp-sh73a0.o headsmp-scu.o platsmp-scu.o
 smp-$(CONFIG_ARCH_R8A7779)     += smp-r8a7779.o headsmp-scu.o platsmp-scu.o
-smp-$(CONFIG_ARCH_R8A7790)     += smp-r8a7790.o platsmp-apmu.o
-smp-$(CONFIG_ARCH_R8A7791)     += smp-r8a7791.o platsmp-apmu.o
+smp-$(CONFIG_ARCH_R8A7790)     += smp-r8a7790.o
+smp-$(CONFIG_ARCH_R8A7791)     += smp-r8a7791.o
 smp-$(CONFIG_ARCH_EMEV2)       += smp-emev2.o headsmp-scu.o platsmp-scu.o
 
-# IRQ objects
-obj-$(CONFIG_ARCH_SH7372)      += entry-intc.o
-
 # PM objects
 obj-$(CONFIG_SUSPEND)          += suspend.o
 obj-$(CONFIG_CPU_IDLE)         += cpuidle.o
+obj-$(CONFIG_CPU_FREQ)         += cpufreq.o
 obj-$(CONFIG_ARCH_SH7372)      += pm-sh7372.o sleep-sh7372.o pm-rmobile.o
 obj-$(CONFIG_ARCH_SH73A0)      += pm-sh73a0.o
 obj-$(CONFIG_ARCH_R8A7740)     += pm-r8a7740.o pm-rmobile.o
 obj-$(CONFIG_ARCH_R8A7779)     += pm-r8a7779.o pm-rcar.o
-obj-$(CONFIG_ARCH_R8A7790)     += pm-r8a7790.o pm-rcar.o
+obj-$(CONFIG_ARCH_R8A7790)     += pm-r8a7790.o pm-rcar.o $(cpu-y)
+obj-$(CONFIG_ARCH_R8A7791)     += pm-r8a7791.o pm-rcar.o $(cpu-y)
+
+# IRQ objects
+obj-$(CONFIG_ARCH_SH7372)      += entry-intc.o
 
 # Board objects
 ifdef CONFIG_ARCH_SHMOBILE_MULTI
 obj-$(CONFIG_MACH_GENMAI)      += board-genmai-reference.o
 obj-$(CONFIG_MACH_KOELSCH)     += board-koelsch-reference.o
 obj-$(CONFIG_MACH_LAGER)       += board-lager-reference.o
+obj-$(CONFIG_MACH_MARZEN)      += board-marzen-reference.o
 else
 obj-$(CONFIG_MACH_APE6EVM)     += board-ape6evm.o
 obj-$(CONFIG_MACH_APE6EVM_REFERENCE)   += board-ape6evm-reference.o
@@ -67,7 +75,6 @@ obj-$(CONFIG_MACH_BOCKW)      += board-bockw.o
 obj-$(CONFIG_MACH_BOCKW_REFERENCE)     += board-bockw-reference.o
 obj-$(CONFIG_MACH_GENMAI)      += board-genmai.o
 obj-$(CONFIG_MACH_MARZEN)      += board-marzen.o
-obj-$(CONFIG_MACH_MARZEN_REFERENCE)    += board-marzen-reference.o
 obj-$(CONFIG_MACH_LAGER)       += board-lager.o
 obj-$(CONFIG_MACH_ARMADILLO800EVA)     += board-armadillo800eva.o
 obj-$(CONFIG_MACH_ARMADILLO800EVA_REFERENCE)   += board-armadillo800eva-reference.o
index 918fccffa1b6211b8ea3bd0dc8a5c341f3b538f7..ebf97d4bcfd88b6931ca25e8e24f8adfc5904ffb 100644 (file)
@@ -13,7 +13,6 @@ loadaddr-$(CONFIG_MACH_KZM9G_REFERENCE) += 0x41008000
 loadaddr-$(CONFIG_MACH_LAGER) += 0x40008000
 loadaddr-$(CONFIG_MACH_MACKEREL) += 0x40008000
 loadaddr-$(CONFIG_MACH_MARZEN) += 0x60008000
-loadaddr-$(CONFIG_MACH_MARZEN_REFERENCE) += 0x60008000
 
 __ZRELADDR     := $(sort $(loadaddr-y))
    zreladdr-y   += $(__ZRELADDR)
index 3276afcf3cc92de2c0ab94548a7f9d6bac039e37..2f7723e5fe91ba1f7adb5e10d38e342277a9fd10 100644 (file)
 #include <linux/pinctrl/machine.h>
 #include <linux/platform_device.h>
 #include <linux/sh_clk.h>
-#include <mach/common.h>
-#include <mach/r8a73a4.h>
+
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 
+#include "common.h"
+#include "r8a73a4.h"
+
 static void __init ape6evm_add_standard_devices(void)
 {
 
index 7ab99a4972a053be4dd3009376ce8699b0469f3d..1585b8830b13b79a0908050e9a90fbb6489df674 100644 (file)
 #include <linux/regulator/machine.h>
 #include <linux/sh_clk.h>
 #include <linux/smsc911x.h>
-#include <mach/common.h>
-#include <mach/irqs.h>
-#include <mach/r8a73a4.h>
+
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 
+#include "common.h"
+#include "irqs.h"
+#include "r8a73a4.h"
+
 /* LEDS */
 static struct gpio_led ape6evm_leds[] = {
        {
index f660fbb96e0b4b3d0dc5bf9a3901e0039a324888..84bc6cb6d5aa7860d83d9ff930022e1b39b4c851 100644 (file)
 #include <linux/kernel.h>
 #include <linux/gpio.h>
 #include <linux/io.h>
-#include <mach/common.h>
-#include <mach/r8a7740.h>
+
 #include <asm/mach/arch.h>
 #include <asm/hardware/cache-l2x0.h>
 
+#include "common.h"
+#include "r8a7740.h"
+
 /*
  * CON1                Camera Module
  * CON2                Extension Bus
  * CON22       Serial
  * CON23       LAN
  * CON24       USB3
- * LED1                Camera LED(Yellow)
+ * LED1                Camera LED (Yellow)
  * LED2                Power LED (Green)
- * ED3-LED6    User LED(Yellow)
- * LED7                LAN link LED(Green)
- * LED8                LAN activity LED(Yellow)
+ * LED3-LED6   User LED (Yellow)
+ * LED7                LAN link LED (Green)
+ * LED8                LAN activity LED (Yellow)
  */
 
 /*
index 689c121157ec3a2722f0c3c4c7540a6085fbec51..6dbaad611a92897020b7aa4cc9cbe28933934922 100644 (file)
@@ -45,9 +45,7 @@
 #include <linux/mmc/sh_mobile_sdhi.h>
 #include <linux/i2c-gpio.h>
 #include <linux/reboot.h>
-#include <mach/common.h>
-#include <mach/irqs.h>
-#include <mach/r8a7740.h>
+
 #include <media/mt9t112.h>
 #include <media/sh_mobile_ceu.h>
 #include <media/soc_camera.h>
 #include <sound/sh_fsi.h>
 #include <sound/simple_card.h>
 
+#include "common.h"
+#include "irqs.h"
+#include "pm-rmobile.h"
+#include "r8a7740.h"
 #include "sh-gpio.h"
 
 /*
@@ -578,6 +580,40 @@ static struct platform_device hdmi_lcdc_device = {
        },
 };
 
+/* LEDS */
+static struct gpio_led gpio_leds[] = {
+       {
+               .name           = "LED3",
+               .gpio           = 102,
+               .default_state  = LEDS_GPIO_DEFSTATE_ON,
+       }, {
+               .name           = "LED4",
+               .gpio           = 111,
+               .default_state  = LEDS_GPIO_DEFSTATE_ON,
+       }, {
+               .name           = "LED5",
+               .gpio           = 110,
+               .default_state  = LEDS_GPIO_DEFSTATE_ON,
+       }, {
+               .name           = "LED6",
+               .gpio           = 177,
+               .default_state  = LEDS_GPIO_DEFSTATE_ON,
+       },
+};
+
+static struct gpio_led_platform_data leds_gpio_info = {
+       .leds           = gpio_leds,
+       .num_leds       = ARRAY_SIZE(gpio_leds),
+};
+
+static struct platform_device leds_gpio_device = {
+       .name   = "leds-gpio",
+       .id     = -1,
+       .dev    = {
+               .platform_data  = &leds_gpio_info,
+       },
+};
+
 /* GPIO KEY */
 #define GPIO_KEY(c, g, d, ...) \
        { .code = c, .gpio = g, .desc = d, .active_low = 1, __VA_ARGS__ }
@@ -1073,6 +1109,7 @@ static struct platform_device *eva_devices[] __initdata = {
        &lcdc0_device,
        &pwm_device,
        &pwm_backlight_device,
+       &leds_gpio_device,
        &gpio_keys_device,
        &sh_eth_device,
        &vcc_sdhi0,
index 027373f8de8215a74dc2b757e25d6e638416e7c8..ba840cd333b9d2dd25fbfeff9a723bb3aa14f980 100644 (file)
  */
 
 #include <linux/of_platform.h>
-#include <mach/common.h>
-#include <mach/r8a7778.h>
+
 #include <asm/mach/arch.h>
 
+#include "common.h"
+#include "r8a7778.h"
+
 /*
  *     see board-bock.c for checking detail of dip-switch
  */
index 3ec82a4c35c56fc07472a21c77a2077f50ba24e2..8a83eb39d3f1548ce85bcf3c2dfcea13b5c4e73c 100644 (file)
 #include <linux/spi/spi.h>
 #include <linux/spi/flash.h>
 #include <linux/usb/renesas_usbhs.h>
+
 #include <media/soc_camera.h>
-#include <mach/common.h>
-#include <mach/irqs.h>
-#include <mach/r8a7778.h>
 #include <asm/mach/arch.h>
 #include <sound/rcar_snd.h>
 #include <sound/simple_card.h>
 
+#include "common.h"
+#include "irqs.h"
+#include "r8a7778.h"
+
 #define FPGA   0x18200000
 #define IRQ0MR 0x30
 #define COMCTLR        0x101c
index 2ff6ad6e608edff34c9b98c6883f451eb4e7afec..e5448f7b868ad7bb5bed67fbd743a14a2d422548 100644 (file)
 
 #include <linux/kernel.h>
 #include <linux/of_platform.h>
-#include <mach/clock.h>
-#include <mach/common.h>
-#include <mach/r7s72100.h>
+
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 
+#include "clock.h"
+#include "common.h"
+#include "r7s72100.h"
+
 /*
  * This is a really crude hack to provide clkdev support to platform
  * devices until they get moved to DT.
@@ -47,7 +49,7 @@ static const char * const genmai_boards_compat_dt[] __initconst = {
 };
 
 DT_MACHINE_START(GENMAI_DT, "genmai")
-       .init_early     = r7s72100_init_early,
+       .init_early     = shmobile_init_delay,
        .init_machine   = genmai_add_standard_devices,
        .dt_compat      = genmai_boards_compat_dt,
 MACHINE_END
index 37184ff8c5c25be7ab4c5e60dd0b1d2aa498eb02..7bf2d805753562e9968362184575053c4b31af6e 100644 (file)
 #include <linux/sh_eth.h>
 #include <linux/spi/rspi.h>
 #include <linux/spi/spi.h>
-#include <mach/common.h>
-#include <mach/irqs.h>
-#include <mach/r7s72100.h>
+
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 
+#include "common.h"
+#include "irqs.h"
+#include "r7s72100.h"
+
 /* Ether */
 static const struct sh_eth_plat_data ether_pdata __initconst = {
        .phy                    = 0x00, /* PD60610 */
@@ -153,7 +155,7 @@ static const char * const genmai_boards_compat_dt[] __initconst = {
 };
 
 DT_MACHINE_START(GENMAI_DT, "genmai")
-       .init_early     = r7s72100_init_early,
+       .init_early     = shmobile_init_delay,
        .init_machine   = genmai_add_standard_devices,
        .dt_compat      = genmai_boards_compat_dt,
 MACHINE_END
index d322a162b4b01f75ad52a92a496f9f43cdf8ac2c..3ff88c138896ad996652df6aec110355ac7f30cf 100644 (file)
 #include <linux/kernel.h>
 #include <linux/of_platform.h>
 #include <linux/platform_data/rcar-du.h>
-#include <mach/clock.h>
-#include <mach/common.h>
-#include <mach/irqs.h>
-#include <mach/rcar-gen2.h>
-#include <mach/r8a7791.h>
+
 #include <asm/mach/arch.h>
 
+#include "clock.h"
+#include "common.h"
+#include "irqs.h"
+#include "r8a7791.h"
+#include "rcar-gen2.h"
+
 /* DU */
 static struct rcar_du_encoder_data koelsch_du_encoders[] = {
        {
@@ -92,24 +94,9 @@ static const struct clk_name clk_names[] __initconst = {
        { "lvds0", "lvds.0", "rcar-du-r8a7791" },
 };
 
-/*
- * This is a really crude hack to work around core platform clock issues
- */
-static const struct clk_name clk_enables[] __initconst = {
-       { "ether", NULL, "ee700000.ethernet" },
-       { "i2c2", NULL, "e6530000.i2c" },
-       { "msiof0", NULL, "e6e20000.spi" },
-       { "qspi_mod", NULL, "e6b10000.spi" },
-       { "sdhi0", NULL, "ee100000.sd" },
-       { "sdhi1", NULL, "ee140000.sd" },
-       { "sdhi2", NULL, "ee160000.sd" },
-       { "thermal", NULL, "e61f0000.thermal" },
-};
-
 static void __init koelsch_add_standard_devices(void)
 {
        shmobile_clk_workaround(clk_names, ARRAY_SIZE(clk_names), false);
-       shmobile_clk_workaround(clk_enables, ARRAY_SIZE(clk_enables), true);
        r8a7791_add_dt_devices();
        of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
 
@@ -128,5 +115,6 @@ DT_MACHINE_START(KOELSCH_DT, "koelsch")
        .init_time      = rcar_gen2_timer_init,
        .init_machine   = koelsch_add_standard_devices,
        .init_late      = shmobile_init_late,
+       .reserve        = rcar_gen2_reserve,
        .dt_compat      = koelsch_boards_compat_dt,
 MACHINE_END
index d3aa6ae05eebeac71b32970ffd6f3afb2ae7271e..b7d5bc7659cda13537707ecbb4e39f43f6e76c61 100644 (file)
 #include <linux/spi/flash.h>
 #include <linux/spi/rspi.h>
 #include <linux/spi/spi.h>
-#include <mach/common.h>
-#include <mach/irqs.h>
-#include <mach/r8a7791.h>
-#include <mach/rcar-gen2.h>
+
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 
+#include "common.h"
+#include "irqs.h"
+#include "r8a7791.h"
+#include "rcar-gen2.h"
+
 /* DU */
 static struct rcar_du_encoder_data koelsch_du_encoders[] = {
        {
@@ -524,5 +526,6 @@ DT_MACHINE_START(KOELSCH_DT, "koelsch")
        .init_time      = rcar_gen2_timer_init,
        .init_machine   = koelsch_init,
        .init_late      = shmobile_init_late,
+       .reserve        = rcar_gen2_reserve,
        .dt_compat      = koelsch_boards_compat_dt,
 MACHINE_END
index a735a1d80c285b95a097ef6128c8e54a2d022cee..5d2621f202d1b483a6ed530f8adc22a487a6db1a 100644 (file)
 #include <linux/irq.h>
 #include <linux/input.h>
 #include <linux/of_platform.h>
-#include <mach/sh73a0.h>
-#include <mach/common.h>
+
 #include <asm/hardware/cache-l2x0.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 
+#include "common.h"
+#include "sh73a0.h"
+
 static void __init kzm_init(void)
 {
        sh73a0_add_standard_devices_dt();
index 01e0d1386db75477e22cb5d39fc4c6ca95fdce36..f8bc7f8f86ad262ab8229eb7a246fb2126b5f3f2 100644 (file)
 #include <linux/usb/r8a66597.h>
 #include <linux/usb/renesas_usbhs.h>
 #include <linux/videodev2.h>
+
 #include <sound/sh_fsi.h>
 #include <sound/simple_card.h>
-#include <mach/irqs.h>
-#include <mach/sh73a0.h>
-#include <mach/common.h>
 #include <asm/hardware/cache-l2x0.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <video/sh_mobile_lcdc.h>
 
+#include "common.h"
+#include "irqs.h"
+#include "sh73a0.h"
+
 /*
  * external GPIO
  */
index 749832e3f33c64aa52ad1d5295297a8f7120938a..41c808e5600563570bd35f87a54bea990934279d 100644 (file)
 #include <linux/init.h>
 #include <linux/of_platform.h>
 #include <linux/platform_data/rcar-du.h>
-#include <mach/clock.h>
-#include <mach/common.h>
-#include <mach/irqs.h>
-#include <mach/rcar-gen2.h>
-#include <mach/r8a7790.h>
+
 #include <asm/mach/arch.h>
 
+#include "clock.h"
+#include "common.h"
+#include "irqs.h"
+#include "r8a7790.h"
+#include "rcar-gen2.h"
+
 /* DU */
 static struct rcar_du_encoder_data lager_du_encoders[] = {
        {
@@ -98,23 +100,9 @@ static const struct clk_name clk_names[] __initconst = {
        { "lvds1", "lvds.1", "rcar-du-r8a7790" },
 };
 
-/*
- * This is a really crude hack to work around core platform clock issues
- */
-static const struct clk_name clk_enables[] __initconst = {
-       { "ether", NULL, "ee700000.ethernet" },
-       { "msiof1", NULL, "e6e10000.spi" },
-       { "mmcif1", NULL, "ee220000.mmc" },
-       { "qspi_mod", NULL, "e6b10000.spi" },
-       { "sdhi0", NULL, "ee100000.sd" },
-       { "sdhi2", NULL, "ee140000.sd" },
-       { "thermal", NULL, "e61f0000.thermal" },
-};
-
 static void __init lager_add_standard_devices(void)
 {
        shmobile_clk_workaround(clk_names, ARRAY_SIZE(clk_names), false);
-       shmobile_clk_workaround(clk_enables, ARRAY_SIZE(clk_enables), true);
        r8a7790_add_dt_devices();
        of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
 
@@ -129,9 +117,10 @@ static const char *lager_boards_compat_dt[] __initdata = {
 
 DT_MACHINE_START(LAGER_DT, "lager")
        .smp            = smp_ops(r8a7790_smp_ops),
-       .init_early     = r8a7790_init_early,
+       .init_early     = shmobile_init_delay,
        .init_time      = rcar_gen2_timer_init,
        .init_machine   = lager_add_standard_devices,
        .init_late      = shmobile_init_late,
+       .reserve        = rcar_gen2_reserve,
        .dt_compat      = lager_boards_compat_dt,
 MACHINE_END
index d18296164e892e5505e0bdcb1ea5e21d78187f6f..e1d8215da0b050cb47512bbcdb24818ec8750674 100644 (file)
@@ -31,6 +31,8 @@
 #include <linux/mmc/host.h>
 #include <linux/mmc/sh_mmcif.h>
 #include <linux/mmc/sh_mobile_sdhi.h>
+#include <linux/mtd/partitions.h>
+#include <linux/mtd/mtd.h>
 #include <linux/pinctrl/machine.h>
 #include <linux/platform_data/camera-rcar.h>
 #include <linux/platform_data/gpio-rcar.h>
 #include <linux/regulator/gpio-regulator.h>
 #include <linux/regulator/machine.h>
 #include <linux/sh_eth.h>
+#include <linux/spi/flash.h>
+#include <linux/spi/rspi.h>
+#include <linux/spi/spi.h>
 #include <linux/usb/phy.h>
 #include <linux/usb/renesas_usbhs.h>
-#include <mach/common.h>
-#include <mach/irqs.h>
-#include <mach/r8a7790.h>
+
 #include <media/soc_camera.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
-#include <linux/mtd/partitions.h>
-#include <linux/mtd/mtd.h>
-#include <linux/spi/flash.h>
-#include <linux/spi/rspi.h>
-#include <linux/spi/spi.h>
 #include <sound/rcar_snd.h>
 #include <sound/simple_card.h>
 
+#include "common.h"
+#include "irqs.h"
+#include "r8a7790.h"
+#include "rcar-gen2.h"
+
 /*
  * SSI-AK4643
  *
@@ -880,9 +883,10 @@ static const char * const lager_boards_compat_dt[] __initconst = {
 
 DT_MACHINE_START(LAGER_DT, "lager")
        .smp            = smp_ops(r8a7790_smp_ops),
-       .init_early     = r8a7790_init_early,
+       .init_early     = shmobile_init_delay,
        .init_time      = rcar_gen2_timer_init,
        .init_machine   = lager_init,
        .init_late      = shmobile_init_late,
+       .reserve        = rcar_gen2_reserve,
        .dt_compat      = lager_boards_compat_dt,
 MACHINE_END
index 112553f0f9bfab6558b73326d59885079aef5456..79f448e93abbfbad9908b1e18604ea83f446c65e 100644 (file)
 #include <linux/regulator/fixed.h>
 #include <linux/regulator/machine.h>
 #include <linux/smsc911x.h>
-#include <linux/sh_intc.h>
+#include <linux/sh_clk.h>
 #include <linux/tca6416_keypad.h>
 #include <linux/usb/renesas_usbhs.h>
 #include <linux/dma-mapping.h>
+
 #include <video/sh_mobile_hdmi.h>
 #include <video/sh_mobile_lcdc.h>
 #include <media/sh_mobile_ceu.h>
 #include <media/soc_camera_platform.h>
 #include <sound/sh_fsi.h>
 #include <sound/simple_card.h>
-
-#include <mach/common.h>
-#include <mach/irqs.h>
-#include <mach/sh7372.h>
-
 #include <asm/mach/arch.h>
 #include <asm/mach-types.h>
 
+#include "common.h"
+#include "irqs.h"
+#include "pm-rmobile.h"
 #include "sh-gpio.h"
+#include "sh7372.h"
 
 /*
  * Address     Interface               BusWidth        note
index 2773936bf7dcffab9be79f2c8e7deed9c12e8093..21b3e1ca226159e7a87e5ddd71565a7278dd2db6 100644 (file)
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#include <mach/r8a7779.h>
-#include <mach/common.h>
-#include <mach/irqs.h>
+#include <linux/clk/shmobile.h>
+#include <linux/clocksource.h>
+#include <linux/of_platform.h>
+
 #include <asm/irq.h>
 #include <asm/mach/arch.h>
 
+#include "clock.h"
+#include "common.h"
+#include "irqs.h"
+#include "r8a7779.h"
+
+static void __init marzen_init_timer(void)
+{
+       r8a7779_clocks_init(r8a7779_read_mode_pins());
+       clocksource_of_init();
+}
+
+/*
+ * This is a really crude hack to provide clkdev support to platform
+ * devices until they get moved to DT.
+ */
+static const struct clk_name clk_names[] __initconst = {
+       { "tmu0", "fck", "sh-tmu.0" },
+};
+
 static void __init marzen_init(void)
 {
+       shmobile_clk_workaround(clk_names, ARRAY_SIZE(clk_names), false);
        r8a7779_add_standard_devices_dt();
+       of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
        r8a7779_init_irq_extpin_dt(1); /* IRQ1 as individual interrupt */
 }
 
 static const char *marzen_boards_compat_dt[] __initdata = {
+       "renesas,marzen",
        "renesas,marzen-reference",
        NULL,
 };
@@ -39,7 +62,8 @@ static const char *marzen_boards_compat_dt[] __initdata = {
 DT_MACHINE_START(MARZEN, "marzen")
        .smp            = smp_ops(r8a7779_smp_ops),
        .map_io         = r8a7779_map_io,
-       .init_early     = r8a7779_init_delay,
+       .init_early     = shmobile_init_delay,
+       .init_time      = marzen_init_timer,
        .nr_irqs        = NR_IRQS_LEGACY,
        .init_irq       = r8a7779_init_irq_dt,
        .init_machine   = marzen_init,
index 6ed324ce848fca04b3caebb59e78bf402b64bf71..e5cf4201e769645829a6c78b1c28b35b55a65085 100644 (file)
 #include <linux/mmc/host.h>
 #include <linux/mmc/sh_mobile_sdhi.h>
 #include <linux/mfd/tmio.h>
+
 #include <media/soc_camera.h>
-#include <mach/r8a7779.h>
-#include <mach/common.h>
-#include <mach/irqs.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/traps.h>
 
+#include "common.h"
+#include "irqs.h"
+#include "r8a7779.h"
+
 /* Fixed 3.3V regulator to be used by SDHI0 */
 static struct regulator_consumer_supply fixed3v3_power_consumers[] = {
        REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.0"),
index df187484de5d52289ecbe9dc0fa23f6fa1e16886..3eb2ec401e0cb13329d1c4e33abf1f8a7f175758 100644 (file)
@@ -19,8 +19,9 @@
 #include <linux/io.h>
 #include <linux/sh_clk.h>
 #include <linux/clkdev.h>
-#include <mach/common.h>
-#include <mach/r7s72100.h>
+
+#include "common.h"
+#include "r7s72100.h"
 
 /* Frequency Control Registers */
 #define FRQCR          0xfcfe0010
index b5bc22c6a8589815c5b47df9b4576c3c7a273bf8..c2330ea1802c6142dc4319836afe1490a7f4d5aa 100644 (file)
@@ -22,8 +22,8 @@
 #include <linux/kernel.h>
 #include <linux/sh_clk.h>
 #include <linux/clkdev.h>
-#include <mach/clock.h>
-#include <mach/common.h>
+#include "common.h"
+#include "clock.h"
 
 #define CPG_BASE 0xe6150000
 #define CPG_LEN 0x270
@@ -574,11 +574,17 @@ static struct clk_lookup lookups[] = {
 
        /* MSTP */
        CLKDEV_DEV_ID("sh-sci.0", &mstp_clks[MSTP204]),
+       CLKDEV_DEV_ID("e6c40000.serial", &mstp_clks[MSTP204]),
        CLKDEV_DEV_ID("sh-sci.1", &mstp_clks[MSTP203]),
+       CLKDEV_DEV_ID("e6c50000.serial", &mstp_clks[MSTP203]),
        CLKDEV_DEV_ID("sh-sci.2", &mstp_clks[MSTP206]),
+       CLKDEV_DEV_ID("e6c20000.serial", &mstp_clks[MSTP206]),
        CLKDEV_DEV_ID("sh-sci.3", &mstp_clks[MSTP207]),
+       CLKDEV_DEV_ID("e6c30000.serial", &mstp_clks[MSTP207]),
        CLKDEV_DEV_ID("sh-sci.4", &mstp_clks[MSTP216]),
+       CLKDEV_DEV_ID("e6ce0000.serial", &mstp_clks[MSTP216]),
        CLKDEV_DEV_ID("sh-sci.5", &mstp_clks[MSTP217]),
+       CLKDEV_DEV_ID("e6cf0000.serial", &mstp_clks[MSTP217]),
        CLKDEV_DEV_ID("sh-dma-engine.0", &mstp_clks[MSTP218]),
        CLKDEV_DEV_ID("e6700020.dma-controller", &mstp_clks[MSTP218]),
        CLKDEV_DEV_ID("rcar_thermal", &mstp_clks[MSTP522]),
@@ -598,6 +604,7 @@ static struct clk_lookup lookups[] = {
        CLKDEV_DEV_ID("e6500000.i2c", &mstp_clks[MSTP318]),
        CLKDEV_DEV_ID("e6510000.i2c", &mstp_clks[MSTP323]),
        CLKDEV_ICK_ID("fck", "sh-cmt-48-gen2.1", &mstp_clks[MSTP329]),
+       CLKDEV_ICK_ID("fck", "e6130000.timer", &mstp_clks[MSTP329]),
        CLKDEV_DEV_ID("e60b0000.i2c", &mstp_clks[MSTP409]),
        CLKDEV_DEV_ID("e6540000.i2c", &mstp_clks[MSTP410]),
        CLKDEV_DEV_ID("e6530000.i2c", &mstp_clks[MSTP411]),
index 50931e3c97c776b07c627584cfd206295dbbc52d..0794f0426e7044810ec46d695c4a9e0c87abd38b 100644 (file)
 #include <linux/io.h>
 #include <linux/sh_clk.h>
 #include <linux/clkdev.h>
-#include <mach/clock.h>
-#include <mach/common.h>
-#include <mach/r8a7740.h>
+
+#include "clock.h"
+#include "common.h"
+#include "r8a7740.h"
 
 /*
  *        |  MDx  |  XTAL1/EXTAL1   |  System   | EXTALR |
@@ -555,27 +556,27 @@ static struct clk_lookup lookups[] = {
        CLKDEV_DEV_ID("sh_mobile_ceu.1",        &mstp_clks[MSTP128]),
 
        CLKDEV_DEV_ID("sh-sci.4",               &mstp_clks[MSTP200]),
-       CLKDEV_DEV_ID("e6c80000.sci",           &mstp_clks[MSTP200]),
+       CLKDEV_DEV_ID("e6c80000.serial",        &mstp_clks[MSTP200]),
        CLKDEV_DEV_ID("sh-sci.3",               &mstp_clks[MSTP201]),
-       CLKDEV_DEV_ID("e6c70000.sci",           &mstp_clks[MSTP201]),
+       CLKDEV_DEV_ID("e6c70000.serial",        &mstp_clks[MSTP201]),
        CLKDEV_DEV_ID("sh-sci.2",               &mstp_clks[MSTP202]),
-       CLKDEV_DEV_ID("e6c60000.sci",           &mstp_clks[MSTP202]),
+       CLKDEV_DEV_ID("e6c60000.serial",        &mstp_clks[MSTP202]),
        CLKDEV_DEV_ID("sh-sci.1",               &mstp_clks[MSTP203]),
-       CLKDEV_DEV_ID("e6c50000.sci",           &mstp_clks[MSTP203]),
+       CLKDEV_DEV_ID("e6c50000.serial",        &mstp_clks[MSTP203]),
        CLKDEV_DEV_ID("sh-sci.0",               &mstp_clks[MSTP204]),
-       CLKDEV_DEV_ID("e6c40000.sci",           &mstp_clks[MSTP204]),
+       CLKDEV_DEV_ID("e6c40000.serial",        &mstp_clks[MSTP204]),
        CLKDEV_DEV_ID("sh-sci.8",               &mstp_clks[MSTP206]),
-       CLKDEV_DEV_ID("e6c30000.sci",           &mstp_clks[MSTP206]),
+       CLKDEV_DEV_ID("e6c30000.serial",        &mstp_clks[MSTP206]),
        CLKDEV_DEV_ID("sh-sci.5",               &mstp_clks[MSTP207]),
-       CLKDEV_DEV_ID("e6cb0000.sci",           &mstp_clks[MSTP207]),
+       CLKDEV_DEV_ID("e6cb0000.serial",        &mstp_clks[MSTP207]),
        CLKDEV_DEV_ID("sh-dma-engine.3",        &mstp_clks[MSTP214]),
        CLKDEV_DEV_ID("sh-dma-engine.2",        &mstp_clks[MSTP216]),
        CLKDEV_DEV_ID("sh-dma-engine.1",        &mstp_clks[MSTP217]),
        CLKDEV_DEV_ID("sh-dma-engine.0",        &mstp_clks[MSTP218]),
        CLKDEV_DEV_ID("sh-sci.7",               &mstp_clks[MSTP222]),
-       CLKDEV_DEV_ID("e6cd0000.sci",           &mstp_clks[MSTP222]),
+       CLKDEV_DEV_ID("e6cd0000.serial",        &mstp_clks[MSTP222]),
        CLKDEV_DEV_ID("sh-sci.6",               &mstp_clks[MSTP230]),
-       CLKDEV_DEV_ID("e6cc0000.sci",           &mstp_clks[MSTP230]),
+       CLKDEV_DEV_ID("e6cc0000.serial",        &mstp_clks[MSTP230]),
 
        CLKDEV_DEV_ID("sh_fsi2",                &mstp_clks[MSTP328]),
        CLKDEV_DEV_ID("fe1f0000.sound",         &mstp_clks[MSTP328]),
@@ -598,8 +599,11 @@ static struct clk_lookup lookups[] = {
 
        /* ICK */
        CLKDEV_ICK_ID("fck",    "sh-tmu.1",             &mstp_clks[MSTP111]),
+       CLKDEV_ICK_ID("fck",    "fff90000.timer",       &mstp_clks[MSTP111]),
        CLKDEV_ICK_ID("fck",    "sh-tmu.0",             &mstp_clks[MSTP125]),
+       CLKDEV_ICK_ID("fck",    "fff80000.timer",       &mstp_clks[MSTP125]),
        CLKDEV_ICK_ID("fck",    "sh-cmt-48.1",          &mstp_clks[MSTP329]),
+       CLKDEV_ICK_ID("fck",    "e6138000.timer",       &mstp_clks[MSTP329]),
        CLKDEV_ICK_ID("host",   "renesas_usbhs",        &mstp_clks[MSTP416]),
        CLKDEV_ICK_ID("func",   "renesas_usbhs",        &mstp_clks[MSTP407]),
        CLKDEV_ICK_ID("phy",    "renesas_usbhs",        &mstp_clks[MSTP406]),
index 13f8f3ab884021d30dbaa10b1daab4200aefe5e1..67980a08a601bfee89430fa48be2141ab3d82bb5 100644 (file)
@@ -39,8 +39,8 @@
 #include <linux/io.h>
 #include <linux/sh_clk.h>
 #include <linux/clkdev.h>
-#include <mach/clock.h>
-#include <mach/common.h>
+#include "clock.h"
+#include "common.h"
 
 #define MSTPCR0                IOMEM(0xffc80030)
 #define MSTPCR1                IOMEM(0xffc80034)
@@ -202,11 +202,17 @@ static struct clk_lookup lookups[] = {
        CLKDEV_DEV_ID("i2c-rcar.3", &mstp_clks[MSTP027]), /* I2C3 */
        CLKDEV_DEV_ID("ffc73000.i2c", &mstp_clks[MSTP027]), /* I2C3 */
        CLKDEV_DEV_ID("sh-sci.0", &mstp_clks[MSTP026]), /* SCIF0 */
+       CLKDEV_DEV_ID("ffe40000.serial", &mstp_clks[MSTP026]), /* SCIF0 */
        CLKDEV_DEV_ID("sh-sci.1", &mstp_clks[MSTP025]), /* SCIF1 */
+       CLKDEV_DEV_ID("ffe41000.serial", &mstp_clks[MSTP025]), /* SCIF1 */
        CLKDEV_DEV_ID("sh-sci.2", &mstp_clks[MSTP024]), /* SCIF2 */
+       CLKDEV_DEV_ID("ffe42000.serial", &mstp_clks[MSTP024]), /* SCIF2 */
        CLKDEV_DEV_ID("sh-sci.3", &mstp_clks[MSTP023]), /* SCIF3 */
+       CLKDEV_DEV_ID("ffe43000.serial", &mstp_clks[MSTP023]), /* SCIF3 */
        CLKDEV_DEV_ID("sh-sci.4", &mstp_clks[MSTP022]), /* SCIF4 */
+       CLKDEV_DEV_ID("ffe44000.serial", &mstp_clks[MSTP022]), /* SCIF4 */
        CLKDEV_DEV_ID("sh-sci.5", &mstp_clks[MSTP021]), /* SCIF6 */
+       CLKDEV_DEV_ID("ffe45000.serial", &mstp_clks[MSTP021]), /* SCIF5 */
        CLKDEV_DEV_ID("sh-hspi.0", &mstp_clks[MSTP007]), /* HSPI0 */
        CLKDEV_DEV_ID("fffc7000.spi", &mstp_clks[MSTP007]), /* HSPI0 */
        CLKDEV_DEV_ID("sh-hspi.1", &mstp_clks[MSTP007]), /* HSPI1 */
@@ -238,7 +244,9 @@ static struct clk_lookup lookups[] = {
        CLKDEV_ICK_ID("src.7", "rcar_sound", &mstp_clks[MSTP524]),
        CLKDEV_ICK_ID("src.8", "rcar_sound", &mstp_clks[MSTP523]),
        CLKDEV_ICK_ID("fck", "sh-tmu.0", &mstp_clks[MSTP016]),
+       CLKDEV_ICK_ID("fck", "ffd80000.timer", &mstp_clks[MSTP016]),
        CLKDEV_ICK_ID("fck", "sh-tmu.1", &mstp_clks[MSTP015]),
+       CLKDEV_ICK_ID("fck", "ffd81000.timer", &mstp_clks[MSTP015]),
 };
 
 void __init r8a7778_clock_init(void)
index a13298bd37a85777ea6135eaa451cebc7105898d..c51f9db3f66fb2f9408094cc112b52c3d716d534 100644 (file)
 #include <linux/io.h>
 #include <linux/sh_clk.h>
 #include <linux/clkdev.h>
-#include <mach/clock.h>
-#include <mach/common.h>
+#include <linux/sh_timer.h>
+
+#include "clock.h"
+#include "common.h"
+#include "r8a7779.h"
 
 /*
  *             MD1 = 1                 MD1 = 0
@@ -52,9 +55,6 @@
 #define MSTPCR3                IOMEM(0xffc8003c)
 #define MSTPSR1                IOMEM(0xffc80044)
 
-#define MODEMR         0xffcc0020
-
-
 /* ioremap() through clock mapping mandatory to avoid
  * collision with ARM coherent DMA virtual memory range.
  */
@@ -207,14 +207,9 @@ static struct clk_lookup lookups[] = {
 
 void __init r8a7779_clock_init(void)
 {
-       void __iomem *modemr = ioremap_nocache(MODEMR, PAGE_SIZE);
-       u32 mode;
+       u32 mode = r8a7779_read_mode_pins();
        int k, ret = 0;
 
-       BUG_ON(!modemr);
-       mode = ioread32(modemr);
-       iounmap(modemr);
-
        if (mode & MD(1)) {
                plla_clk.rate = 1500000000;
 
@@ -268,3 +263,13 @@ void __init r8a7779_clock_init(void)
        else
                panic("failed to setup r8a7779 clocks\n");
 }
+
+/* do nothing for !CONFIG_SMP or !CONFIG_HAVE_TWD */
+void __init __weak r8a7779_register_twd(void) { }
+
+void __init r8a7779_earlytimer_init(void)
+{
+       r8a7779_clock_init();
+       r8a7779_register_twd();
+       shmobile_earlytimer_init();
+}
index 296a057109e42b7ad621843b44d7f525b9ddcfe0..17435c1aa2fe318ceeb4692632bd986ce5484655 100644 (file)
 #include <linux/kernel.h>
 #include <linux/sh_clk.h>
 #include <linux/clkdev.h>
-#include <mach/clock.h>
-#include <mach/common.h>
-#include <mach/r8a7790.h>
+
+#include "clock.h"
+#include "common.h"
+#include "r8a7790.h"
+#include "rcar-gen2.h"
 
 /*
  *   MD                EXTAL           PLL0    PLL1    PLL3
index e2fdfcc14436a109946413e9855cafad27fdff38..10e193d707f531216776695b5da2cf0c65de418a 100644 (file)
@@ -23,9 +23,9 @@
 #include <linux/kernel.h>
 #include <linux/sh_clk.h>
 #include <linux/clkdev.h>
-#include <mach/clock.h>
-#include <mach/common.h>
-#include <mach/rcar-gen2.h>
+#include "clock.h"
+#include "common.h"
+#include "rcar-gen2.h"
 
 /*
  *   MD                EXTAL           PLL0    PLL1    PLL3
index d16d9ca7f79ea958716f0f4ce65c4351556adddf..7071676145c497ae911fd7199b721692c71c2b8e 100644 (file)
@@ -21,8 +21,8 @@
 #include <linux/io.h>
 #include <linux/sh_clk.h>
 #include <linux/clkdev.h>
-#include <mach/clock.h>
-#include <mach/common.h>
+#include "clock.h"
+#include "common.h"
 
 /* SH7372 registers */
 #define FRQCRA         IOMEM(0xe6150000)
index 0d9cd1fe02124fdb8573bf66da0cbc8b5a33e9c7..d8c4048b9e338d345bb5e5ceb682e3ded7df09ce 100644 (file)
@@ -22,8 +22,8 @@
 #include <linux/sh_clk.h>
 #include <linux/clkdev.h>
 #include <asm/processor.h>
-#include <mach/clock.h>
-#include <mach/common.h>
+#include "clock.h"
+#include "common.h"
 
 #define FRQCRA         IOMEM(0xe6150000)
 #define FRQCRB         IOMEM(0xe6150004)
@@ -638,16 +638,25 @@ static struct clk_lookup lookups[] = {
        CLKDEV_DEV_ID("e6820000.i2c", &mstp_clks[MSTP116]), /* I2C0 */
        CLKDEV_DEV_ID("sh_mobile_lcdc_fb.0", &mstp_clks[MSTP100]), /* LCDC0 */
        CLKDEV_DEV_ID("sh-sci.7", &mstp_clks[MSTP219]), /* SCIFA7 */
+       CLKDEV_DEV_ID("e6cd0000.serial", &mstp_clks[MSTP219]), /* SCIFA7 */
        CLKDEV_DEV_ID("sh-dma-engine.0", &mstp_clks[MSTP218]), /* SY-DMAC */
        CLKDEV_DEV_ID("sh-dma-engine.1", &mstp_clks[MSTP217]), /* MP-DMAC */
        CLKDEV_DEV_ID("sh-sci.5", &mstp_clks[MSTP207]), /* SCIFA5 */
+       CLKDEV_DEV_ID("e6cb0000.serial", &mstp_clks[MSTP207]), /* SCIFA5 */
        CLKDEV_DEV_ID("sh-sci.8", &mstp_clks[MSTP206]), /* SCIFB */
+       CLKDEV_DEV_ID("0xe6c3000.serial", &mstp_clks[MSTP206]), /* SCIFB */
        CLKDEV_DEV_ID("sh-sci.0", &mstp_clks[MSTP204]), /* SCIFA0 */
+       CLKDEV_DEV_ID("e6c40000.serial", &mstp_clks[MSTP204]), /* SCIFA0 */
        CLKDEV_DEV_ID("sh-sci.1", &mstp_clks[MSTP203]), /* SCIFA1 */
+       CLKDEV_DEV_ID("e6c50000.serial", &mstp_clks[MSTP203]), /* SCIFA1 */
        CLKDEV_DEV_ID("sh-sci.2", &mstp_clks[MSTP202]), /* SCIFA2 */
+       CLKDEV_DEV_ID("e6c60000.serial", &mstp_clks[MSTP202]), /* SCIFA2 */
        CLKDEV_DEV_ID("sh-sci.3", &mstp_clks[MSTP201]), /* SCIFA3 */
+       CLKDEV_DEV_ID("e6c70000.serial", &mstp_clks[MSTP201]), /* SCIFA3 */
        CLKDEV_DEV_ID("sh-sci.4", &mstp_clks[MSTP200]), /* SCIFA4 */
+       CLKDEV_DEV_ID("e6c80000.serial", &mstp_clks[MSTP200]), /* SCIFA4 */
        CLKDEV_DEV_ID("sh-sci.6", &mstp_clks[MSTP331]), /* SCIFA6 */
+       CLKDEV_DEV_ID("e6cc0000.serial", &mstp_clks[MSTP331]), /* SCIFA6 */
        CLKDEV_DEV_ID("sh_fsi2", &mstp_clks[MSTP328]), /* FSI */
        CLKDEV_DEV_ID("ec230000.sound", &mstp_clks[MSTP328]), /* FSI */
        CLKDEV_DEV_ID("sh_irda.0", &mstp_clks[MSTP325]), /* IrDA */
@@ -681,6 +690,7 @@ static struct clk_lookup lookups[] = {
        CLKDEV_ICK_ID("dsiphy_clk", "sh-mipi-dsi.0", &dsi0phy_clk),
        CLKDEV_ICK_ID("dsiphy_clk", "sh-mipi-dsi.1", &dsi1phy_clk),
        CLKDEV_ICK_ID("fck", "sh-cmt-48.1", &mstp_clks[MSTP329]), /* CMT1 */
+       CLKDEV_ICK_ID("fck", "e6138000.timer", &mstp_clks[MSTP329]), /* CMT1 */
        CLKDEV_ICK_ID("fck", "sh-tmu.0", &mstp_clks[MSTP125]), /* TMU0 */
 };
 
index e7232a0373b9f51719f8391bff63d0bb40e1ab65..806f94038cc49a8421f85d305a018113a59009b8 100644 (file)
@@ -25,7 +25,7 @@
 #ifdef CONFIG_COMMON_CLK
 #include <linux/clk.h>
 #include <linux/clkdev.h>
-#include <mach/clock.h>
+#include "clock.h"
 
 void __init shmobile_clk_workaround(const struct clk_name *clks,
                                    int nr_clks, bool enable)
@@ -49,8 +49,8 @@ void __init shmobile_clk_workaround(const struct clk_name *clks,
 #else /* CONFIG_COMMON_CLK */
 #include <linux/sh_clk.h>
 #include <linux/export.h>
-#include <mach/clock.h>
-#include <mach/common.h>
+#include "clock.h"
+#include "common.h"
 
 unsigned long shmobile_fixed_ratio_clk_recalc(struct clk *clk)
 {
diff --git a/arch/arm/mach-shmobile/clock.h b/arch/arm/mach-shmobile/clock.h
new file mode 100644 (file)
index 0000000..31b6417
--- /dev/null
@@ -0,0 +1,56 @@
+#ifndef CLOCK_H
+#define CLOCK_H
+
+#ifdef CONFIG_COMMON_CLK
+/* temporary clock configuration helper for platform devices */
+
+struct clk_name {
+       const char *clk;
+       const char *con_id;
+       const char *dev_id;
+};
+
+void shmobile_clk_workaround(const struct clk_name *clks, int nr_clks,
+                            bool enable);
+
+#else /* CONFIG_COMMON_CLK */
+/* legacy clock implementation */
+
+struct clk;
+unsigned long shmobile_fixed_ratio_clk_recalc(struct clk *clk);
+extern struct sh_clk_ops shmobile_fixed_ratio_clk_ops;
+
+/* clock ratio */
+struct clk_ratio {
+       int mul;
+       int div;
+};
+
+#define SH_CLK_RATIO(name, m, d)               \
+static struct clk_ratio name ##_ratio = {      \
+       .mul = m,                               \
+       .div = d,                               \
+}
+
+#define SH_FIXED_RATIO_CLKg(name, p, r)        \
+struct clk name = {                    \
+       .parent = &p,                           \
+       .ops    = &shmobile_fixed_ratio_clk_ops,\
+       .priv   = &r ## _ratio,                 \
+}
+
+#define SH_FIXED_RATIO_CLK(name, p, r)         \
+static SH_FIXED_RATIO_CLKg(name, p, r)
+
+#define SH_FIXED_RATIO_CLK_SET(name, p, m, d)  \
+       SH_CLK_RATIO(name, m, d);               \
+       SH_FIXED_RATIO_CLK(name, p, name)
+
+#define SH_CLK_SET_RATIO(p, m, d)      \
+do {                   \
+       (p)->mul = m;   \
+       (p)->div = d;   \
+} while (0)
+
+#endif /* CONFIG_COMMON_CLK */
+#endif
diff --git a/arch/arm/mach-shmobile/common.h b/arch/arm/mach-shmobile/common.h
new file mode 100644 (file)
index 0000000..9805608
--- /dev/null
@@ -0,0 +1,65 @@
+#ifndef __ARCH_MACH_COMMON_H
+#define __ARCH_MACH_COMMON_H
+
+extern void shmobile_earlytimer_init(void);
+extern void shmobile_setup_delay(unsigned int max_cpu_core_mhz,
+                        unsigned int mult, unsigned int div);
+extern void shmobile_init_delay(void);
+struct twd_local_timer;
+extern void shmobile_setup_console(void);
+extern void shmobile_boot_vector(void);
+extern unsigned long shmobile_boot_fn;
+extern unsigned long shmobile_boot_arg;
+extern unsigned long shmobile_boot_size;
+extern void shmobile_smp_boot(void);
+extern void shmobile_smp_sleep(void);
+extern void shmobile_smp_hook(unsigned int cpu, unsigned long fn,
+                             unsigned long arg);
+extern int shmobile_smp_cpu_disable(unsigned int cpu);
+extern void shmobile_invalidate_start(void);
+extern void shmobile_boot_scu(void);
+extern void shmobile_smp_scu_prepare_cpus(unsigned int max_cpus);
+extern void shmobile_smp_scu_cpu_die(unsigned int cpu);
+extern int shmobile_smp_scu_cpu_kill(unsigned int cpu);
+extern void shmobile_smp_apmu_prepare_cpus(unsigned int max_cpus);
+extern int shmobile_smp_apmu_boot_secondary(unsigned int cpu,
+                                           struct task_struct *idle);
+extern void shmobile_smp_apmu_cpu_die(unsigned int cpu);
+extern int shmobile_smp_apmu_cpu_kill(unsigned int cpu);
+struct clk;
+extern int shmobile_clk_init(void);
+extern void shmobile_handle_irq_intc(struct pt_regs *);
+extern struct platform_suspend_ops shmobile_suspend_ops;
+struct cpuidle_driver;
+extern void shmobile_cpuidle_set_driver(struct cpuidle_driver *drv);
+
+#ifdef CONFIG_SUSPEND
+int shmobile_suspend_init(void);
+void shmobile_smp_apmu_suspend_init(void);
+#else
+static inline int shmobile_suspend_init(void) { return 0; }
+static inline void shmobile_smp_apmu_suspend_init(void) { }
+#endif
+
+#ifdef CONFIG_CPU_IDLE
+int shmobile_cpuidle_init(void);
+#else
+static inline int shmobile_cpuidle_init(void) { return 0; }
+#endif
+
+#ifdef CONFIG_CPU_FREQ
+int shmobile_cpufreq_init(void);
+#else
+static inline int shmobile_cpufreq_init(void) { return 0; }
+#endif
+
+extern void __iomem *shmobile_scu_base;
+
+static inline void __init shmobile_init_late(void)
+{
+       shmobile_suspend_init();
+       shmobile_cpuidle_init();
+       shmobile_cpufreq_init();
+}
+
+#endif /* __ARCH_MACH_COMMON_H */
index 9411a5bf4fd6ede59d8f939b9074727c23543aa8..f2e79f2376e19f6f0a227af94bf2e4fc3be76409 100644 (file)
@@ -19,8 +19,8 @@
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/platform_device.h>
-#include <mach/common.h>
 #include <asm/mach/map.h>
+#include "common.h"
 
 void __init shmobile_setup_console(void)
 {
diff --git a/arch/arm/mach-shmobile/cpufreq.c b/arch/arm/mach-shmobile/cpufreq.c
new file mode 100644 (file)
index 0000000..8a24b2b
--- /dev/null
@@ -0,0 +1,17 @@
+/*
+ * CPUFreq support code for SH-Mobile ARM
+ *
+ *  Copyright (C) 2014 Gaku Inami
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ */
+
+#include <linux/platform_device.h>
+
+int __init shmobile_cpufreq_init(void)
+{
+       platform_device_register_simple("cpufreq-cpu0", -1, NULL, 0);
+       return 0;
+}
diff --git a/arch/arm/mach-shmobile/dma-register.h b/arch/arm/mach-shmobile/dma-register.h
new file mode 100644 (file)
index 0000000..97c40bd
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * SH-ARM CPU-specific DMA definitions, used by both DMA drivers
+ *
+ * Copyright (C) 2012 Renesas Solutions Corp
+ *
+ * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+ *
+ * Based on arch/sh/include/cpu-sh4/cpu/dma-register.h
+ * Copyright (C) 2010 Guennadi Liakhovetski <g.liakhovetski@gmx.de>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef DMA_REGISTER_H
+#define DMA_REGISTER_H
+
+/*
+ *             Direct Memory Access Controller
+ */
+
+/* Transmit sizes and respective CHCR register values */
+enum {
+       XMIT_SZ_8BIT            = 0,
+       XMIT_SZ_16BIT           = 1,
+       XMIT_SZ_32BIT           = 2,
+       XMIT_SZ_64BIT           = 7,
+       XMIT_SZ_128BIT          = 3,
+       XMIT_SZ_256BIT          = 4,
+       XMIT_SZ_512BIT          = 5,
+};
+
+/* log2(size / 8) - used to calculate number of transfers */
+static const unsigned int dma_ts_shift[] = {
+       [XMIT_SZ_8BIT]          = 0,
+       [XMIT_SZ_16BIT]         = 1,
+       [XMIT_SZ_32BIT]         = 2,
+       [XMIT_SZ_64BIT]         = 3,
+       [XMIT_SZ_128BIT]        = 4,
+       [XMIT_SZ_256BIT]        = 5,
+       [XMIT_SZ_512BIT]        = 6,
+};
+
+#define TS_LOW_BIT     0x3 /* --xx */
+#define TS_HI_BIT      0xc /* xx-- */
+
+#define TS_LOW_SHIFT   (3)
+#define TS_HI_SHIFT    (20 - 2)        /* 2 bits for shifted low TS */
+
+#define TS_INDEX2VAL(i) \
+       ((((i) & TS_LOW_BIT) << TS_LOW_SHIFT) |\
+        (((i) & TS_HI_BIT)  << TS_HI_SHIFT))
+
+#define CHCR_TX(xmit_sz) (DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL((xmit_sz)))
+#define CHCR_RX(xmit_sz) (DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL((xmit_sz)))
+
+
+/*
+ *             USB High-Speed DMAC
+ */
+/* Transmit sizes and respective CHCR register values */
+enum {
+       USBTS_XMIT_SZ_8BYTE             = 0,
+       USBTS_XMIT_SZ_16BYTE            = 1,
+       USBTS_XMIT_SZ_32BYTE            = 2,
+};
+
+/* log2(size / 8) - used to calculate number of transfers */
+static const unsigned int dma_usbts_shift[] = {
+       [USBTS_XMIT_SZ_8BYTE]   = 3,
+       [USBTS_XMIT_SZ_16BYTE]  = 4,
+       [USBTS_XMIT_SZ_32BYTE]  = 5,
+};
+
+#define USBTS_LOW_BIT  0x3 /* --xx */
+#define USBTS_HI_BIT   0x0 /* ---- */
+
+#define USBTS_LOW_SHIFT        6
+#define USBTS_HI_SHIFT 0
+
+#define USBTS_INDEX2VAL(i) (((i) & 3) << 6)
+
+#endif /* DMA_REGISTER_H */
index 293007579b8ef67332ecb1c5c600f3c5565bccc1..50c491567e11c2a43c6d86940f186299624e3f1a 100644 (file)
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  */
-#include <linux/linkage.h>
 #include <linux/init.h>
+#include <linux/linkage.h>
+#include <linux/threads.h>
 #include <asm/assembler.h>
 #include <asm/memory.h>
 
+#ifdef CONFIG_SMP
 ENTRY(shmobile_invalidate_start)
        bl      v7_invalidate_l1
        b       secondary_startup
 ENDPROC(shmobile_invalidate_start)
+#endif
 
 /*
  * Reset vector for secondary CPUs.
@@ -69,7 +72,7 @@ shmobile_smp_boot_find_mpidr:
 
 shmobile_smp_boot_next:
        add     r1, r1, #1
-       cmp     r1, #CONFIG_NR_CPUS
+       cmp     r1, #NR_CPUS
        blo     shmobile_smp_boot_find_mpidr
 
        b       shmobile_smp_sleep
@@ -86,10 +89,10 @@ ENDPROC(shmobile_smp_sleep)
 
        .globl  shmobile_smp_mpidr
 shmobile_smp_mpidr:
-1:     .space  CONFIG_NR_CPUS * 4
+1:     .space  NR_CPUS * 4
        .globl  shmobile_smp_fn
 shmobile_smp_fn:
-2:     .space  CONFIG_NR_CPUS * 4
+2:     .space  NR_CPUS * 4
        .globl  shmobile_smp_arg
 shmobile_smp_arg:
-3:     .space  CONFIG_NR_CPUS * 4
+3:     .space  NR_CPUS * 4
diff --git a/arch/arm/mach-shmobile/include/mach/clock.h b/arch/arm/mach-shmobile/include/mach/clock.h
deleted file mode 100644 (file)
index 31b6417..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-#ifndef CLOCK_H
-#define CLOCK_H
-
-#ifdef CONFIG_COMMON_CLK
-/* temporary clock configuration helper for platform devices */
-
-struct clk_name {
-       const char *clk;
-       const char *con_id;
-       const char *dev_id;
-};
-
-void shmobile_clk_workaround(const struct clk_name *clks, int nr_clks,
-                            bool enable);
-
-#else /* CONFIG_COMMON_CLK */
-/* legacy clock implementation */
-
-struct clk;
-unsigned long shmobile_fixed_ratio_clk_recalc(struct clk *clk);
-extern struct sh_clk_ops shmobile_fixed_ratio_clk_ops;
-
-/* clock ratio */
-struct clk_ratio {
-       int mul;
-       int div;
-};
-
-#define SH_CLK_RATIO(name, m, d)               \
-static struct clk_ratio name ##_ratio = {      \
-       .mul = m,                               \
-       .div = d,                               \
-}
-
-#define SH_FIXED_RATIO_CLKg(name, p, r)        \
-struct clk name = {                    \
-       .parent = &p,                           \
-       .ops    = &shmobile_fixed_ratio_clk_ops,\
-       .priv   = &r ## _ratio,                 \
-}
-
-#define SH_FIXED_RATIO_CLK(name, p, r)         \
-static SH_FIXED_RATIO_CLKg(name, p, r)
-
-#define SH_FIXED_RATIO_CLK_SET(name, p, m, d)  \
-       SH_CLK_RATIO(name, m, d);               \
-       SH_FIXED_RATIO_CLK(name, p, name)
-
-#define SH_CLK_SET_RATIO(p, m, d)      \
-do {                   \
-       (p)->mul = m;   \
-       (p)->div = d;   \
-} while (0)
-
-#endif /* CONFIG_COMMON_CLK */
-#endif
diff --git a/arch/arm/mach-shmobile/include/mach/common.h b/arch/arm/mach-shmobile/include/mach/common.h
deleted file mode 100644 (file)
index f7a360e..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-#ifndef __ARCH_MACH_COMMON_H
-#define __ARCH_MACH_COMMON_H
-
-extern void shmobile_earlytimer_init(void);
-extern void shmobile_setup_delay(unsigned int max_cpu_core_mhz,
-                        unsigned int mult, unsigned int div);
-extern void shmobile_init_delay(void);
-struct twd_local_timer;
-extern void shmobile_setup_console(void);
-extern void shmobile_boot_vector(void);
-extern unsigned long shmobile_boot_fn;
-extern unsigned long shmobile_boot_arg;
-extern unsigned long shmobile_boot_size;
-extern void shmobile_smp_boot(void);
-extern void shmobile_smp_sleep(void);
-extern void shmobile_smp_hook(unsigned int cpu, unsigned long fn,
-                             unsigned long arg);
-extern int shmobile_smp_cpu_disable(unsigned int cpu);
-extern void shmobile_invalidate_start(void);
-extern void shmobile_boot_scu(void);
-extern void shmobile_smp_scu_prepare_cpus(unsigned int max_cpus);
-extern void shmobile_smp_scu_cpu_die(unsigned int cpu);
-extern int shmobile_smp_scu_cpu_kill(unsigned int cpu);
-extern void shmobile_smp_apmu_prepare_cpus(unsigned int max_cpus);
-extern int shmobile_smp_apmu_boot_secondary(unsigned int cpu,
-                                           struct task_struct *idle);
-extern void shmobile_smp_apmu_cpu_die(unsigned int cpu);
-extern int shmobile_smp_apmu_cpu_kill(unsigned int cpu);
-struct clk;
-extern int shmobile_clk_init(void);
-extern void shmobile_handle_irq_intc(struct pt_regs *);
-extern struct platform_suspend_ops shmobile_suspend_ops;
-struct cpuidle_driver;
-extern void shmobile_cpuidle_set_driver(struct cpuidle_driver *drv);
-
-#ifdef CONFIG_SUSPEND
-int shmobile_suspend_init(void);
-#else
-static inline int shmobile_suspend_init(void) { return 0; }
-#endif
-
-#ifdef CONFIG_CPU_IDLE
-int shmobile_cpuidle_init(void);
-#else
-static inline int shmobile_cpuidle_init(void) { return 0; }
-#endif
-
-extern void __iomem *shmobile_scu_base;
-
-static inline void __init shmobile_init_late(void)
-{
-       shmobile_suspend_init();
-       shmobile_cpuidle_init();
-}
-
-#endif /* __ARCH_MACH_COMMON_H */
diff --git a/arch/arm/mach-shmobile/include/mach/dma-register.h b/arch/arm/mach-shmobile/include/mach/dma-register.h
deleted file mode 100644 (file)
index 97c40bd..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * SH-ARM CPU-specific DMA definitions, used by both DMA drivers
- *
- * Copyright (C) 2012 Renesas Solutions Corp
- *
- * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
- *
- * Based on arch/sh/include/cpu-sh4/cpu/dma-register.h
- * Copyright (C) 2010 Guennadi Liakhovetski <g.liakhovetski@gmx.de>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#ifndef DMA_REGISTER_H
-#define DMA_REGISTER_H
-
-/*
- *             Direct Memory Access Controller
- */
-
-/* Transmit sizes and respective CHCR register values */
-enum {
-       XMIT_SZ_8BIT            = 0,
-       XMIT_SZ_16BIT           = 1,
-       XMIT_SZ_32BIT           = 2,
-       XMIT_SZ_64BIT           = 7,
-       XMIT_SZ_128BIT          = 3,
-       XMIT_SZ_256BIT          = 4,
-       XMIT_SZ_512BIT          = 5,
-};
-
-/* log2(size / 8) - used to calculate number of transfers */
-static const unsigned int dma_ts_shift[] = {
-       [XMIT_SZ_8BIT]          = 0,
-       [XMIT_SZ_16BIT]         = 1,
-       [XMIT_SZ_32BIT]         = 2,
-       [XMIT_SZ_64BIT]         = 3,
-       [XMIT_SZ_128BIT]        = 4,
-       [XMIT_SZ_256BIT]        = 5,
-       [XMIT_SZ_512BIT]        = 6,
-};
-
-#define TS_LOW_BIT     0x3 /* --xx */
-#define TS_HI_BIT      0xc /* xx-- */
-
-#define TS_LOW_SHIFT   (3)
-#define TS_HI_SHIFT    (20 - 2)        /* 2 bits for shifted low TS */
-
-#define TS_INDEX2VAL(i) \
-       ((((i) & TS_LOW_BIT) << TS_LOW_SHIFT) |\
-        (((i) & TS_HI_BIT)  << TS_HI_SHIFT))
-
-#define CHCR_TX(xmit_sz) (DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL((xmit_sz)))
-#define CHCR_RX(xmit_sz) (DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL((xmit_sz)))
-
-
-/*
- *             USB High-Speed DMAC
- */
-/* Transmit sizes and respective CHCR register values */
-enum {
-       USBTS_XMIT_SZ_8BYTE             = 0,
-       USBTS_XMIT_SZ_16BYTE            = 1,
-       USBTS_XMIT_SZ_32BYTE            = 2,
-};
-
-/* log2(size / 8) - used to calculate number of transfers */
-static const unsigned int dma_usbts_shift[] = {
-       [USBTS_XMIT_SZ_8BYTE]   = 3,
-       [USBTS_XMIT_SZ_16BYTE]  = 4,
-       [USBTS_XMIT_SZ_32BYTE]  = 5,
-};
-
-#define USBTS_LOW_BIT  0x3 /* --xx */
-#define USBTS_HI_BIT   0x0 /* ---- */
-
-#define USBTS_LOW_SHIFT        6
-#define USBTS_HI_SHIFT 0
-
-#define USBTS_INDEX2VAL(i) (((i) & 3) << 6)
-
-#endif /* DMA_REGISTER_H */
diff --git a/arch/arm/mach-shmobile/include/mach/intc.h b/arch/arm/mach-shmobile/include/mach/intc.h
deleted file mode 100644 (file)
index a5603c7..0000000
+++ /dev/null
@@ -1,290 +0,0 @@
-#ifndef __ASM_MACH_INTC_H
-#define __ASM_MACH_INTC_H
-#include <linux/sh_intc.h>
-
-#define INTC_IRQ_PINS_ENUM_16L(p)                              \
-       p ## _IRQ0, p ## _IRQ1, p ## _IRQ2, p ## _IRQ3,         \
-       p ## _IRQ4, p ## _IRQ5, p ## _IRQ6, p ## _IRQ7,         \
-       p ## _IRQ8, p ## _IRQ9, p ## _IRQ10, p ## _IRQ11,       \
-       p ## _IRQ12, p ## _IRQ13, p ## _IRQ14, p ## _IRQ15
-
-#define INTC_IRQ_PINS_ENUM_16H(p)                              \
-       p ## _IRQ16, p ## _IRQ17, p ## _IRQ18, p ## _IRQ19,     \
-       p ## _IRQ20, p ## _IRQ21, p ## _IRQ22, p ## _IRQ23,     \
-       p ## _IRQ24, p ## _IRQ25, p ## _IRQ26, p ## _IRQ27,     \
-       p ## _IRQ28, p ## _IRQ29, p ## _IRQ30, p ## _IRQ31
-
-#define INTC_IRQ_PINS_VECT_16L(p, vect)                                \
-       vect(p ## _IRQ0, 0x0200), vect(p ## _IRQ1, 0x0220),     \
-       vect(p ## _IRQ2, 0x0240), vect(p ## _IRQ3, 0x0260),     \
-       vect(p ## _IRQ4, 0x0280), vect(p ## _IRQ5, 0x02a0),     \
-       vect(p ## _IRQ6, 0x02c0), vect(p ## _IRQ7, 0x02e0),     \
-       vect(p ## _IRQ8, 0x0300), vect(p ## _IRQ9, 0x0320),     \
-       vect(p ## _IRQ10, 0x0340), vect(p ## _IRQ11, 0x0360),   \
-       vect(p ## _IRQ12, 0x0380), vect(p ## _IRQ13, 0x03a0),   \
-       vect(p ## _IRQ14, 0x03c0), vect(p ## _IRQ15, 0x03e0)
-
-#define INTC_IRQ_PINS_VECT_16H(p, vect)                                \
-       vect(p ## _IRQ16, 0x3200), vect(p ## _IRQ17, 0x3220),   \
-       vect(p ## _IRQ18, 0x3240), vect(p ## _IRQ19, 0x3260),   \
-       vect(p ## _IRQ20, 0x3280), vect(p ## _IRQ21, 0x32a0),   \
-       vect(p ## _IRQ22, 0x32c0), vect(p ## _IRQ23, 0x32e0),   \
-       vect(p ## _IRQ24, 0x3300), vect(p ## _IRQ25, 0x3320),   \
-       vect(p ## _IRQ26, 0x3340), vect(p ## _IRQ27, 0x3360),   \
-       vect(p ## _IRQ28, 0x3380), vect(p ## _IRQ29, 0x33a0),   \
-       vect(p ## _IRQ30, 0x33c0), vect(p ## _IRQ31, 0x33e0)
-
-#define INTC_IRQ_PINS_MASK_16L(p, base)                                        \
-       { base + 0x40, base + 0x60, 8, /* INTMSK00A / INTMSKCLR00A */   \
-         { p ## _IRQ0, p ## _IRQ1, p ## _IRQ2, p ## _IRQ3,             \
-           p ## _IRQ4, p ## _IRQ5, p ## _IRQ6, p ## _IRQ7 } },         \
-       { base + 0x44, base + 0x64, 8, /* INTMSK10A / INTMSKCLR10A */   \
-         { p ## _IRQ8, p ## _IRQ9, p ## _IRQ10, p ## _IRQ11,           \
-           p ## _IRQ12, p ## _IRQ13, p ## _IRQ14, p ## _IRQ15 } }
-
-#define INTC_IRQ_PINS_MASK_16H(p, base)                                        \
-       { base + 0x48, base + 0x68, 8, /* INTMSK20A / INTMSKCLR20A */   \
-         { p ## _IRQ16, p ## _IRQ17, p ## _IRQ18, p ## _IRQ19,         \
-           p ## _IRQ20, p ## _IRQ21, p ## _IRQ22, p ## _IRQ23 } },     \
-       { base + 0x4c, base + 0x6c, 8, /* INTMSK30A / INTMSKCLR30A */   \
-         { p ## _IRQ24, p ## _IRQ25, p ## _IRQ26, p ## _IRQ27,         \
-           p ## _IRQ28, p ## _IRQ29, p ## _IRQ30, p ## _IRQ31 } }
-
-#define INTC_IRQ_PINS_PRIO_16L(p, base)                                        \
-       { base + 0x10, 0, 32, 4, /* INTPRI00A */                        \
-         { p ## _IRQ0, p ## _IRQ1, p ## _IRQ2, p ## _IRQ3,             \
-           p ## _IRQ4, p ## _IRQ5, p ## _IRQ6, p ## _IRQ7 } },         \
-       { base + 0x14, 0, 32, 4, /* INTPRI10A */                        \
-         { p ## _IRQ8, p ## _IRQ9, p ## _IRQ10, p ## _IRQ11,           \
-           p ## _IRQ12, p ## _IRQ13, p ## _IRQ14, p ## _IRQ15 } }
-
-#define INTC_IRQ_PINS_PRIO_16H(p, base)                                        \
-       { base + 0x18, 0, 32, 4, /* INTPRI20A */                        \
-         { p ## _IRQ16, p ## _IRQ17, p ## _IRQ18, p ## _IRQ19,         \
-           p ## _IRQ20, p ## _IRQ21, p ## _IRQ22, p ## _IRQ23 } },     \
-       { base + 0x1c, 0, 32, 4, /* INTPRI30A */                        \
-         { p ## _IRQ24, p ## _IRQ25, p ## _IRQ26, p ## _IRQ27,         \
-           p ## _IRQ28, p ## _IRQ29, p ## _IRQ30, p ## _IRQ31 } }
-
-#define INTC_IRQ_PINS_SENSE_16L(p, base)                               \
-       { base + 0x00, 32, 4, /* ICR1A */                               \
-         { p ## _IRQ0, p ## _IRQ1, p ## _IRQ2, p ## _IRQ3,             \
-           p ## _IRQ4, p ## _IRQ5, p ## _IRQ6, p ## _IRQ7 } },         \
-       { base + 0x04, 32, 4, /* ICR2A */                               \
-         { p ## _IRQ8, p ## _IRQ9, p ## _IRQ10, p ## _IRQ11,           \
-           p ## _IRQ12, p ## _IRQ13, p ## _IRQ14, p ## _IRQ15 } }
-
-#define INTC_IRQ_PINS_SENSE_16H(p, base)                               \
-       { base + 0x08, 32, 4, /* ICR3A */                               \
-         { p ## _IRQ16, p ## _IRQ17, p ## _IRQ18, p ## _IRQ19,         \
-           p ## _IRQ20, p ## _IRQ21, p ## _IRQ22, p ## _IRQ23 } },     \
-       { base + 0x0c, 32, 4, /* ICR4A */                               \
-         { p ## _IRQ24, p ## _IRQ25, p ## _IRQ26, p ## _IRQ27,         \
-           p ## _IRQ28, p ## _IRQ29, p ## _IRQ30, p ## _IRQ31 } }
-
-#define INTC_IRQ_PINS_ACK_16L(p, base)                                 \
-       { base + 0x20, 0, 8, /* INTREQ00A */                            \
-         { p ## _IRQ0, p ## _IRQ1, p ## _IRQ2, p ## _IRQ3,             \
-           p ## _IRQ4, p ## _IRQ5, p ## _IRQ6, p ## _IRQ7 } },         \
-       { base + 0x24, 0, 8, /* INTREQ10A */                            \
-         { p ## _IRQ8, p ## _IRQ9, p ## _IRQ10, p ## _IRQ11,           \
-           p ## _IRQ12, p ## _IRQ13, p ## _IRQ14, p ## _IRQ15 } }
-
-#define INTC_IRQ_PINS_ACK_16H(p, base)                                 \
-       { base + 0x28, 0, 8, /* INTREQ20A */                            \
-         { p ## _IRQ16, p ## _IRQ17, p ## _IRQ18, p ## _IRQ19,         \
-           p ## _IRQ20, p ## _IRQ21, p ## _IRQ22, p ## _IRQ23 } },     \
-       { base + 0x2c, 0, 8, /* INTREQ30A */                            \
-         { p ## _IRQ24, p ## _IRQ25, p ## _IRQ26, p ## _IRQ27,         \
-           p ## _IRQ28, p ## _IRQ29, p ## _IRQ30, p ## _IRQ31 } }
-
-#define INTC_IRQ_PINS_16(p, base, vect, str)                           \
-                                                                       \
-static struct resource p ## _resources[] __initdata = {                        \
-       [0] = {                                                         \
-               .start  = base,                                         \
-               .end    = base + 0x64,                                  \
-               .flags  = IORESOURCE_MEM,                               \
-       },                                                              \
-};                                                                     \
-                                                                       \
-enum {                                                                 \
-       p ## _UNUSED = 0,                                               \
-       INTC_IRQ_PINS_ENUM_16L(p),                                      \
-};                                                                     \
-                                                                       \
-static struct intc_vect p ## _vectors[] __initdata = {                 \
-       INTC_IRQ_PINS_VECT_16L(p, vect),                                \
-};                                                                     \
-                                                                       \
-static struct intc_mask_reg p ## _mask_registers[] __initdata = {      \
-       INTC_IRQ_PINS_MASK_16L(p, base),                                \
-};                                                                     \
-                                                                       \
-static struct intc_prio_reg p ## _prio_registers[] __initdata = {      \
-       INTC_IRQ_PINS_PRIO_16L(p, base),                                \
-};                                                                     \
-                                                                       \
-static struct intc_sense_reg p ## _sense_registers[] __initdata = {    \
-       INTC_IRQ_PINS_SENSE_16L(p, base),                               \
-};                                                                     \
-                                                                       \
-static struct intc_mask_reg p ## _ack_registers[] __initdata = {       \
-       INTC_IRQ_PINS_ACK_16L(p, base),                                 \
-};                                                                     \
-                                                                       \
-static struct intc_desc p ## _desc __initdata = {                      \
-       .name = str,                                                    \
-       .resource = p ## _resources,                                    \
-       .num_resources = ARRAY_SIZE(p ## _resources),                   \
-       .hw = INTC_HW_DESC(p ## _vectors, NULL,                         \
-                            p ## _mask_registers, p ## _prio_registers, \
-                            p ## _sense_registers, p ## _ack_registers) \
-}
-
-#define INTC_IRQ_PINS_16H(p, base, vect, str)                          \
-                                                                       \
-static struct resource p ## _resources[] __initdata = {                        \
-       [0] = {                                                         \
-               .start  = base,                                         \
-               .end    = base + 0x64,                                  \
-               .flags  = IORESOURCE_MEM,                               \
-       },                                                              \
-};                                                                     \
-                                                                       \
-enum {                                                                 \
-       p ## _UNUSED = 0,                                               \
-       INTC_IRQ_PINS_ENUM_16H(p),                                      \
-};                                                                     \
-                                                                       \
-static struct intc_vect p ## _vectors[] __initdata = {                 \
-       INTC_IRQ_PINS_VECT_16H(p, vect),                                \
-};                                                                     \
-                                                                       \
-static struct intc_mask_reg p ## _mask_registers[] __initdata = {      \
-       INTC_IRQ_PINS_MASK_16H(p, base),                                \
-};                                                                     \
-                                                                       \
-static struct intc_prio_reg p ## _prio_registers[] __initdata = {      \
-       INTC_IRQ_PINS_PRIO_16H(p, base),                                \
-};                                                                     \
-                                                                       \
-static struct intc_sense_reg p ## _sense_registers[] __initdata = {    \
-       INTC_IRQ_PINS_SENSE_16H(p, base),                               \
-};                                                                     \
-                                                                       \
-static struct intc_mask_reg p ## _ack_registers[] __initdata = {       \
-       INTC_IRQ_PINS_ACK_16H(p, base),                                 \
-};                                                                     \
-                                                                       \
-static struct intc_desc p ## _desc __initdata = {                      \
-       .name = str,                                                    \
-       .resource = p ## _resources,                                    \
-       .num_resources = ARRAY_SIZE(p ## _resources),                   \
-       .hw = INTC_HW_DESC(p ## _vectors, NULL,                         \
-                            p ## _mask_registers, p ## _prio_registers, \
-                            p ## _sense_registers, p ## _ack_registers) \
-}
-
-#define INTC_IRQ_PINS_32(p, base, vect, str)                           \
-                                                                       \
-static struct resource p ## _resources[] __initdata = {                        \
-       [0] = {                                                         \
-               .start  = base,                                         \
-               .end    = base + 0x6c,                                  \
-               .flags  = IORESOURCE_MEM,                               \
-       },                                                              \
-};                                                                     \
-                                                                       \
-enum {                                                                 \
-       p ## _UNUSED = 0,                                               \
-       INTC_IRQ_PINS_ENUM_16L(p),                                      \
-       INTC_IRQ_PINS_ENUM_16H(p),                                      \
-};                                                                     \
-                                                                       \
-static struct intc_vect p ## _vectors[] __initdata = {                 \
-       INTC_IRQ_PINS_VECT_16L(p, vect),                                \
-       INTC_IRQ_PINS_VECT_16H(p, vect),                                \
-};                                                                     \
-                                                                       \
-static struct intc_mask_reg p ## _mask_registers[] __initdata = {      \
-       INTC_IRQ_PINS_MASK_16L(p, base),                                \
-       INTC_IRQ_PINS_MASK_16H(p, base),                                \
-};                                                                     \
-                                                                       \
-static struct intc_prio_reg p ## _prio_registers[] __initdata = {      \
-       INTC_IRQ_PINS_PRIO_16L(p, base),                                \
-       INTC_IRQ_PINS_PRIO_16H(p, base),                                \
-};                                                                     \
-                                                                       \
-static struct intc_sense_reg p ## _sense_registers[] __initdata = {    \
-       INTC_IRQ_PINS_SENSE_16L(p, base),                               \
-       INTC_IRQ_PINS_SENSE_16H(p, base),                               \
-};                                                                     \
-                                                                       \
-static struct intc_mask_reg p ## _ack_registers[] __initdata = {       \
-       INTC_IRQ_PINS_ACK_16L(p, base),                                 \
-       INTC_IRQ_PINS_ACK_16H(p, base),                                 \
-};                                                                     \
-                                                                       \
-static struct intc_desc p ## _desc __initdata = {                      \
-       .name = str,                                                    \
-       .resource = p ## _resources,                                    \
-       .num_resources = ARRAY_SIZE(p ## _resources),                   \
-       .hw = INTC_HW_DESC(p ## _vectors, NULL,                         \
-                            p ## _mask_registers, p ## _prio_registers, \
-                            p ## _sense_registers, p ## _ack_registers) \
-}
-
-#define INTC_PINT_E_EMPTY
-#define INTC_PINT_E_NONE 0, 0, 0, 0, 0, 0, 0, 0,
-#define INTC_PINT_E(p)                                                 \
-       PINT ## p ## 0, PINT ## p ## 1, PINT ## p ## 2, PINT ## p ## 3, \
-       PINT ## p ## 4, PINT ## p ## 5, PINT ## p ## 6, PINT ## p ## 7,
-
-#define INTC_PINT_V_NONE
-#define INTC_PINT_V(p, vect)                                   \
-       vect(PINT ## p ## 0, 0), vect(PINT ## p ## 1, 1),       \
-       vect(PINT ## p ## 2, 2), vect(PINT ## p ## 3, 3),       \
-       vect(PINT ## p ## 4, 4), vect(PINT ## p ## 5, 5),       \
-       vect(PINT ## p ## 6, 6), vect(PINT ## p ## 7, 7),
-
-#define INTC_PINT(p, mask_reg, sense_base, str,                                \
-       enums_1, enums_2, enums_3, enums_4,                             \
-       vect_1, vect_2, vect_3, vect_4,                                 \
-       mask_a, mask_b, mask_c, mask_d,                                 \
-       sense_a, sense_b, sense_c, sense_d)                             \
-                                                                       \
-enum {                                                                 \
-       PINT ## p ## _UNUSED = 0,                                       \
-       enums_1 enums_2 enums_3 enums_4                                 \
-};                                                                     \
-                                                                       \
-static struct intc_vect p ## _vectors[] __initdata = {                 \
-       vect_1 vect_2 vect_3 vect_4                                     \
-};                                                                     \
-                                                                       \
-static struct intc_mask_reg p ## _mask_registers[] __initdata = {      \
-       { mask_reg, 0, 32, /* PINTER */                                 \
-         { mask_a mask_b mask_c mask_d } }                             \
-};                                                                     \
-                                                                       \
-static struct intc_sense_reg p ## _sense_registers[] __initdata = {    \
-       { sense_base + 0x00, 16, 2, /* PINTCR */                        \
-         { sense_a } },                                                \
-       { sense_base + 0x04, 16, 2, /* PINTCR */                        \
-         { sense_b } },                                                \
-       { sense_base + 0x08, 16, 2, /* PINTCR */                        \
-         { sense_c } },                                                \
-       { sense_base + 0x0c, 16, 2, /* PINTCR */                        \
-         { sense_d } },                                                \
-};                                                                     \
-                                                                       \
-static struct intc_desc p ## _desc __initdata = {                      \
-       .name = str,                                                    \
-       .hw = INTC_HW_DESC(p ## _vectors, NULL,                         \
-                            p ## _mask_registers, NULL,                \
-                            p ## _sense_registers, NULL),              \
-}
-
-#endif  /* __ASM_MACH_INTC_H */
index d241bfd6926de3d4f9fddaed6aa6ab19e9158383..5aee83f079e2251e1b0c7df3d6b1c4692ef7b93c 100644 (file)
@@ -1,24 +1,10 @@
 #ifndef __ASM_MACH_IRQS_H
 #define __ASM_MACH_IRQS_H
 
-#include <linux/sh_intc.h>
-
-/* GIC */
-#define gic_spi(nr)            ((nr) + 32)
-#define gic_iid(nr)            (nr) /* ICCIAR / interrupt ID */
-
-/* INTCS */
-#define INTCS_VECT_BASE                0x3400
-#define INTCS_VECT(n, vect)    INTC_VECT((n), INTCS_VECT_BASE + (vect))
-#define intcs_evt2irq(evt)     evt2irq(INTCS_VECT_BASE + (evt))
+/* Stuck here until drivers/pinctl/sh-pfc gets rid of legacy code */
 
 /* External IRQ pins */
 #define IRQPIN_BASE            2000
 #define irq_pin(nr)            ((nr) + IRQPIN_BASE)
 
-/* GPIO IRQ */
-#define _GPIO_IRQ_BASE         2500
-#define GPIO_IRQ_BASE(x)       (_GPIO_IRQ_BASE + (32 * x))
-#define GPIO_IRQ(x, y)         (_GPIO_IRQ_BASE + (32 * x) + y)
-
 #endif /* __ASM_MACH_IRQS_H */
diff --git a/arch/arm/mach-shmobile/include/mach/pm-rcar.h b/arch/arm/mach-shmobile/include/mach/pm-rcar.h
deleted file mode 100644 (file)
index ef3a1ef..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef PM_RCAR_H
-#define PM_RCAR_H
-
-struct rcar_sysc_ch {
-       unsigned long chan_offs;
-       unsigned int chan_bit;
-       unsigned int isr_bit;
-};
-
-int rcar_sysc_power_down(struct rcar_sysc_ch *sysc_ch);
-int rcar_sysc_power_up(struct rcar_sysc_ch *sysc_ch);
-bool rcar_sysc_power_is_off(struct rcar_sysc_ch *sysc_ch);
-void __iomem *rcar_sysc_init(phys_addr_t base);
-
-#endif /* PM_RCAR_H */
diff --git a/arch/arm/mach-shmobile/include/mach/pm-rmobile.h b/arch/arm/mach-shmobile/include/mach/pm-rmobile.h
deleted file mode 100644 (file)
index 690553a..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2012 Renesas Solutions Corp.
- *
- * Kuninori Morimoto <morimoto.kuninori@renesas.com>
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License.  See the file "COPYING" in the main directory of this archive
- * for more details.
- */
-#ifndef PM_RMOBILE_H
-#define PM_RMOBILE_H
-
-#include <linux/pm_domain.h>
-
-#define DEFAULT_DEV_LATENCY_NS 250000
-
-struct platform_device;
-
-struct rmobile_pm_domain {
-       struct generic_pm_domain genpd;
-       struct dev_power_governor *gov;
-       int (*suspend)(void);
-       void (*resume)(void);
-       unsigned int bit_shift;
-       bool no_debug;
-};
-
-static inline
-struct rmobile_pm_domain *to_rmobile_pd(struct generic_pm_domain *d)
-{
-       return container_of(d, struct rmobile_pm_domain, genpd);
-}
-
-struct pm_domain_device {
-       const char *domain_name;
-       struct platform_device *pdev;
-};
-
-#ifdef CONFIG_PM
-extern void rmobile_init_domains(struct rmobile_pm_domain domains[], int num);
-extern void rmobile_add_device_to_domain_td(const char *domain_name,
-                                           struct platform_device *pdev,
-                                           struct gpd_timing_data *td);
-
-static inline void rmobile_add_device_to_domain(const char *domain_name,
-                                               struct platform_device *pdev)
-{
-       rmobile_add_device_to_domain_td(domain_name, pdev, NULL);
-}
-
-extern void rmobile_add_devices_to_domains(struct pm_domain_device data[],
-                                          int size);
-#else
-
-#define rmobile_init_domains(domains, num) do { } while (0)
-#define rmobile_add_device_to_domain_td(name, pdev, td) do { } while (0)
-#define rmobile_add_device_to_domain(name, pdev) do { } while (0)
-
-static inline void rmobile_add_devices_to_domains(struct pm_domain_device d[],
-                                                 int size) {}
-#endif /* CONFIG_PM */
-
-#endif /* PM_RMOBILE_H */
diff --git a/arch/arm/mach-shmobile/include/mach/r7s72100.h b/arch/arm/mach-shmobile/include/mach/r7s72100.h
deleted file mode 100644 (file)
index 5f34b20..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#ifndef __ASM_R7S72100_H__
-#define __ASM_R7S72100_H__
-
-void r7s72100_add_dt_devices(void);
-void r7s72100_clock_init(void);
-void r7s72100_init_early(void);
-
-#endif /* __ASM_R7S72100_H__ */
diff --git a/arch/arm/mach-shmobile/include/mach/r8a73a4.h b/arch/arm/mach-shmobile/include/mach/r8a73a4.h
deleted file mode 100644 (file)
index ce8bdd1..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-#ifndef __ASM_R8A73A4_H__
-#define __ASM_R8A73A4_H__
-
-/* DMA slave IDs */
-enum {
-       SHDMA_SLAVE_INVALID,
-       SHDMA_SLAVE_MMCIF0_TX,
-       SHDMA_SLAVE_MMCIF0_RX,
-       SHDMA_SLAVE_MMCIF1_TX,
-       SHDMA_SLAVE_MMCIF1_RX,
-};
-
-void r8a73a4_add_standard_devices(void);
-void r8a73a4_add_dt_devices(void);
-void r8a73a4_clock_init(void);
-void r8a73a4_pinmux_init(void);
-void r8a73a4_init_early(void);
-
-#endif /* __ASM_R8A73A4_H__ */
diff --git a/arch/arm/mach-shmobile/include/mach/r8a7740.h b/arch/arm/mach-shmobile/include/mach/r8a7740.h
deleted file mode 100644 (file)
index 5e3c9ec..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2011  Renesas Solutions Corp.
- * Copyright (C) 2011  Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-#ifndef __ASM_R8A7740_H__
-#define __ASM_R8A7740_H__
-
-#include <mach/pm-rmobile.h>
-
-/*
- * MD_CKx pin
- */
-#define MD_CK2 (1 << 2)
-#define MD_CK1 (1 << 1)
-#define MD_CK0 (1 << 0)
-
-/* DMA slave IDs */
-enum {
-       SHDMA_SLAVE_INVALID,
-       SHDMA_SLAVE_SDHI0_RX,
-       SHDMA_SLAVE_SDHI0_TX,
-       SHDMA_SLAVE_SDHI1_RX,
-       SHDMA_SLAVE_SDHI1_TX,
-       SHDMA_SLAVE_SDHI2_RX,
-       SHDMA_SLAVE_SDHI2_TX,
-       SHDMA_SLAVE_FSIA_RX,
-       SHDMA_SLAVE_FSIA_TX,
-       SHDMA_SLAVE_FSIB_TX,
-       SHDMA_SLAVE_USBHS_TX,
-       SHDMA_SLAVE_USBHS_RX,
-       SHDMA_SLAVE_MMCIF_TX,
-       SHDMA_SLAVE_MMCIF_RX,
-};
-
-extern void r8a7740_meram_workaround(void);
-extern void r8a7740_init_irq_of(void);
-extern void r8a7740_map_io(void);
-extern void r8a7740_add_early_devices(void);
-extern void r8a7740_add_standard_devices(void);
-extern void r8a7740_add_standard_devices_dt(void);
-extern void r8a7740_clock_init(u8 md_ck);
-extern void r8a7740_pinmux_init(void);
-extern void r8a7740_pm_init(void);
-
-#ifdef CONFIG_PM
-extern void __init r8a7740_init_pm_domains(void);
-#else
-static inline void r8a7740_init_pm_domains(void) {}
-#endif /* CONFIG_PM */
-
-#endif /* __ASM_R8A7740_H__ */
diff --git a/arch/arm/mach-shmobile/include/mach/r8a7778.h b/arch/arm/mach-shmobile/include/mach/r8a7778.h
deleted file mode 100644 (file)
index f4076a5..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2013  Renesas Solutions Corp.
- * Copyright (C) 2013  Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
- * Copyright (C) 2013  Cogent Embedded, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- */
-#ifndef __ASM_R8A7778_H__
-#define __ASM_R8A7778_H__
-
-#include <linux/sh_eth.h>
-
-/* HPB-DMA slave IDs */
-enum {
-       HPBDMA_SLAVE_DUMMY,
-       HPBDMA_SLAVE_SDHI0_TX,
-       HPBDMA_SLAVE_SDHI0_RX,
-       HPBDMA_SLAVE_SSI0_TX,
-       HPBDMA_SLAVE_SSI0_RX,
-       HPBDMA_SLAVE_SSI1_TX,
-       HPBDMA_SLAVE_SSI1_RX,
-       HPBDMA_SLAVE_SSI2_TX,
-       HPBDMA_SLAVE_SSI2_RX,
-       HPBDMA_SLAVE_SSI3_TX,
-       HPBDMA_SLAVE_SSI3_RX,
-       HPBDMA_SLAVE_SSI4_TX,
-       HPBDMA_SLAVE_SSI4_RX,
-       HPBDMA_SLAVE_SSI5_TX,
-       HPBDMA_SLAVE_SSI5_RX,
-       HPBDMA_SLAVE_SSI6_TX,
-       HPBDMA_SLAVE_SSI6_RX,
-       HPBDMA_SLAVE_SSI7_TX,
-       HPBDMA_SLAVE_SSI7_RX,
-       HPBDMA_SLAVE_SSI8_TX,
-       HPBDMA_SLAVE_SSI8_RX,
-       HPBDMA_SLAVE_HPBIF0_TX,
-       HPBDMA_SLAVE_HPBIF0_RX,
-       HPBDMA_SLAVE_HPBIF1_TX,
-       HPBDMA_SLAVE_HPBIF1_RX,
-       HPBDMA_SLAVE_HPBIF2_TX,
-       HPBDMA_SLAVE_HPBIF2_RX,
-       HPBDMA_SLAVE_HPBIF3_TX,
-       HPBDMA_SLAVE_HPBIF3_RX,
-       HPBDMA_SLAVE_HPBIF4_TX,
-       HPBDMA_SLAVE_HPBIF4_RX,
-       HPBDMA_SLAVE_HPBIF5_TX,
-       HPBDMA_SLAVE_HPBIF5_RX,
-       HPBDMA_SLAVE_HPBIF6_TX,
-       HPBDMA_SLAVE_HPBIF6_RX,
-       HPBDMA_SLAVE_HPBIF7_TX,
-       HPBDMA_SLAVE_HPBIF7_RX,
-       HPBDMA_SLAVE_HPBIF8_TX,
-       HPBDMA_SLAVE_HPBIF8_RX,
-       HPBDMA_SLAVE_USBFUNC_TX,
-       HPBDMA_SLAVE_USBFUNC_RX,
-};
-
-extern void r8a7778_add_standard_devices(void);
-extern void r8a7778_add_standard_devices_dt(void);
-extern void r8a7778_add_dt_devices(void);
-
-extern void r8a7778_init_late(void);
-extern void r8a7778_init_delay(void);
-extern void r8a7778_init_irq_dt(void);
-extern void r8a7778_clock_init(void);
-extern void r8a7778_init_irq_extpin(int irlm);
-extern void r8a7778_init_irq_extpin_dt(int irlm);
-extern void r8a7778_pinmux_init(void);
-
-extern int r8a7778_usb_phy_power(bool enable);
-
-#endif /* __ASM_R8A7778_H__ */
diff --git a/arch/arm/mach-shmobile/include/mach/r8a7779.h b/arch/arm/mach-shmobile/include/mach/r8a7779.h
deleted file mode 100644 (file)
index 88eecea..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-#ifndef __ASM_R8A7779_H__
-#define __ASM_R8A7779_H__
-
-#include <linux/sh_clk.h>
-#include <linux/pm_domain.h>
-#include <mach/pm-rcar.h>
-
-/* HPB-DMA slave IDs */
-enum {
-       HPBDMA_SLAVE_DUMMY,
-       HPBDMA_SLAVE_SDHI0_TX,
-       HPBDMA_SLAVE_SDHI0_RX,
-};
-
-struct r8a7779_pm_domain {
-       struct generic_pm_domain genpd;
-       struct rcar_sysc_ch ch;
-};
-
-static inline struct rcar_sysc_ch *to_r8a7779_ch(struct generic_pm_domain *d)
-{
-       return &container_of(d, struct r8a7779_pm_domain, genpd)->ch;
-}
-
-extern void r8a7779_init_delay(void);
-extern void r8a7779_init_irq_extpin(int irlm);
-extern void r8a7779_init_irq_extpin_dt(int irlm);
-extern void r8a7779_init_irq_dt(void);
-extern void r8a7779_map_io(void);
-extern void r8a7779_earlytimer_init(void);
-extern void r8a7779_add_early_devices(void);
-extern void r8a7779_add_standard_devices(void);
-extern void r8a7779_add_standard_devices_dt(void);
-extern void r8a7779_init_late(void);
-extern void r8a7779_clock_init(void);
-extern void r8a7779_pinmux_init(void);
-extern void r8a7779_pm_init(void);
-extern void r8a7779_register_twd(void);
-
-#ifdef CONFIG_PM
-extern void __init r8a7779_init_pm_domains(void);
-#else
-static inline void r8a7779_init_pm_domains(void) {}
-#endif /* CONFIG_PM */
-
-extern struct smp_operations r8a7779_smp_ops;
-
-#endif /* __ASM_R8A7779_H__ */
diff --git a/arch/arm/mach-shmobile/include/mach/r8a7790.h b/arch/arm/mach-shmobile/include/mach/r8a7790.h
deleted file mode 100644 (file)
index 0b95bab..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef __ASM_R8A7790_H__
-#define __ASM_R8A7790_H__
-
-#include <mach/rcar-gen2.h>
-
-/* DMA slave IDs */
-enum {
-       RCAR_DMA_SLAVE_INVALID,
-       AUDIO_DMAC_SLAVE_SSI0_TX,
-       AUDIO_DMAC_SLAVE_SSI0_RX,
-       AUDIO_DMAC_SLAVE_SSI1_TX,
-       AUDIO_DMAC_SLAVE_SSI1_RX,
-       AUDIO_DMAC_SLAVE_SSI2_TX,
-       AUDIO_DMAC_SLAVE_SSI2_RX,
-       AUDIO_DMAC_SLAVE_SSI3_TX,
-       AUDIO_DMAC_SLAVE_SSI3_RX,
-       AUDIO_DMAC_SLAVE_SSI4_TX,
-       AUDIO_DMAC_SLAVE_SSI4_RX,
-       AUDIO_DMAC_SLAVE_SSI5_TX,
-       AUDIO_DMAC_SLAVE_SSI5_RX,
-       AUDIO_DMAC_SLAVE_SSI6_TX,
-       AUDIO_DMAC_SLAVE_SSI6_RX,
-       AUDIO_DMAC_SLAVE_SSI7_TX,
-       AUDIO_DMAC_SLAVE_SSI7_RX,
-       AUDIO_DMAC_SLAVE_SSI8_TX,
-       AUDIO_DMAC_SLAVE_SSI8_RX,
-       AUDIO_DMAC_SLAVE_SSI9_TX,
-       AUDIO_DMAC_SLAVE_SSI9_RX,
-};
-
-void r8a7790_add_standard_devices(void);
-void r8a7790_add_dt_devices(void);
-void r8a7790_clock_init(void);
-void r8a7790_pinmux_init(void);
-void r8a7790_pm_init(void);
-void r8a7790_init_early(void);
-extern struct smp_operations r8a7790_smp_ops;
-
-#endif /* __ASM_R8A7790_H__ */
diff --git a/arch/arm/mach-shmobile/include/mach/r8a7791.h b/arch/arm/mach-shmobile/include/mach/r8a7791.h
deleted file mode 100644 (file)
index 664274c..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-#ifndef __ASM_R8A7791_H__
-#define __ASM_R8A7791_H__
-
-void r8a7791_add_standard_devices(void);
-void r8a7791_add_dt_devices(void);
-void r8a7791_clock_init(void);
-void r8a7791_pinmux_init(void);
-extern struct smp_operations r8a7791_smp_ops;
-
-#endif /* __ASM_R8A7791_H__ */
diff --git a/arch/arm/mach-shmobile/include/mach/rcar-gen2.h b/arch/arm/mach-shmobile/include/mach/rcar-gen2.h
deleted file mode 100644 (file)
index 43f606e..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#ifndef __ASM_RCAR_GEN2_H__
-#define __ASM_RCAR_GEN2_H__
-
-void rcar_gen2_timer_init(void);
-#define MD(nr) BIT(nr)
-u32 rcar_gen2_read_mode_pins(void);
-
-#endif /* __ASM_RCAR_GEN2_H__ */
diff --git a/arch/arm/mach-shmobile/include/mach/sh7372.h b/arch/arm/mach-shmobile/include/mach/sh7372.h
deleted file mode 100644 (file)
index 854a9f0..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright (C) 2010 Renesas Solutions Corp.
- *
- * Kuninori Morimoto <morimoto.kuninori@renesas.com>
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License.  See the file "COPYING" in the main directory of this archive
- * for more details.
- */
-
-#ifndef __ASM_SH7372_H__
-#define __ASM_SH7372_H__
-
-#include <linux/sh_clk.h>
-#include <linux/pm_domain.h>
-#include <mach/pm-rmobile.h>
-
-/* DMA slave IDs */
-enum {
-       SHDMA_SLAVE_INVALID,
-       SHDMA_SLAVE_SCIF0_TX,
-       SHDMA_SLAVE_SCIF0_RX,
-       SHDMA_SLAVE_SCIF1_TX,
-       SHDMA_SLAVE_SCIF1_RX,
-       SHDMA_SLAVE_SCIF2_TX,
-       SHDMA_SLAVE_SCIF2_RX,
-       SHDMA_SLAVE_SCIF3_TX,
-       SHDMA_SLAVE_SCIF3_RX,
-       SHDMA_SLAVE_SCIF4_TX,
-       SHDMA_SLAVE_SCIF4_RX,
-       SHDMA_SLAVE_SCIF5_TX,
-       SHDMA_SLAVE_SCIF5_RX,
-       SHDMA_SLAVE_SCIF6_TX,
-       SHDMA_SLAVE_SCIF6_RX,
-       SHDMA_SLAVE_FLCTL0_TX,
-       SHDMA_SLAVE_FLCTL0_RX,
-       SHDMA_SLAVE_FLCTL1_TX,
-       SHDMA_SLAVE_FLCTL1_RX,
-       SHDMA_SLAVE_SDHI0_RX,
-       SHDMA_SLAVE_SDHI0_TX,
-       SHDMA_SLAVE_SDHI1_RX,
-       SHDMA_SLAVE_SDHI1_TX,
-       SHDMA_SLAVE_SDHI2_RX,
-       SHDMA_SLAVE_SDHI2_TX,
-       SHDMA_SLAVE_FSIA_RX,
-       SHDMA_SLAVE_FSIA_TX,
-       SHDMA_SLAVE_MMCIF_RX,
-       SHDMA_SLAVE_MMCIF_TX,
-       SHDMA_SLAVE_USB0_TX,
-       SHDMA_SLAVE_USB0_RX,
-       SHDMA_SLAVE_USB1_TX,
-       SHDMA_SLAVE_USB1_RX,
-};
-
-extern struct clk sh7372_extal1_clk;
-extern struct clk sh7372_extal2_clk;
-extern struct clk sh7372_dv_clki_clk;
-extern struct clk sh7372_dv_clki_div2_clk;
-extern struct clk sh7372_pllc2_clk;
-
-extern void sh7372_init_irq(void);
-extern void sh7372_map_io(void);
-extern void sh7372_earlytimer_init(void);
-extern void sh7372_add_early_devices(void);
-extern void sh7372_add_standard_devices(void);
-extern void sh7372_add_early_devices_dt(void);
-extern void sh7372_add_standard_devices_dt(void);
-extern void sh7372_clock_init(void);
-extern void sh7372_pinmux_init(void);
-extern void sh7372_pm_init(void);
-extern void sh7372_resume_core_standby_sysc(void);
-extern int  sh7372_do_idle_sysc(unsigned long sleep_mode);
-extern void sh7372_intcs_suspend(void);
-extern void sh7372_intcs_resume(void);
-extern void sh7372_intca_suspend(void);
-extern void sh7372_intca_resume(void);
-
-extern unsigned long sh7372_cpu_resume;
-
-#ifdef CONFIG_PM
-extern void __init sh7372_init_pm_domains(void);
-#else
-static inline void sh7372_init_pm_domains(void) {}
-#endif
-
-extern void __init sh7372_pm_init_late(void);
-
-#endif /* __ASM_SH7372_H__ */
diff --git a/arch/arm/mach-shmobile/include/mach/sh73a0.h b/arch/arm/mach-shmobile/include/mach/sh73a0.h
deleted file mode 100644 (file)
index 359b582..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-#ifndef __ASM_SH73A0_H__
-#define __ASM_SH73A0_H__
-
-/* DMA slave IDs */
-enum {
-       SHDMA_SLAVE_INVALID,
-       SHDMA_SLAVE_SCIF0_TX,
-       SHDMA_SLAVE_SCIF0_RX,
-       SHDMA_SLAVE_SCIF1_TX,
-       SHDMA_SLAVE_SCIF1_RX,
-       SHDMA_SLAVE_SCIF2_TX,
-       SHDMA_SLAVE_SCIF2_RX,
-       SHDMA_SLAVE_SCIF3_TX,
-       SHDMA_SLAVE_SCIF3_RX,
-       SHDMA_SLAVE_SCIF4_TX,
-       SHDMA_SLAVE_SCIF4_RX,
-       SHDMA_SLAVE_SCIF5_TX,
-       SHDMA_SLAVE_SCIF5_RX,
-       SHDMA_SLAVE_SCIF6_TX,
-       SHDMA_SLAVE_SCIF6_RX,
-       SHDMA_SLAVE_SCIF7_TX,
-       SHDMA_SLAVE_SCIF7_RX,
-       SHDMA_SLAVE_SCIF8_TX,
-       SHDMA_SLAVE_SCIF8_RX,
-       SHDMA_SLAVE_SDHI0_TX,
-       SHDMA_SLAVE_SDHI0_RX,
-       SHDMA_SLAVE_SDHI1_TX,
-       SHDMA_SLAVE_SDHI1_RX,
-       SHDMA_SLAVE_SDHI2_TX,
-       SHDMA_SLAVE_SDHI2_RX,
-       SHDMA_SLAVE_MMCIF_TX,
-       SHDMA_SLAVE_MMCIF_RX,
-       SHDMA_SLAVE_FSI2A_TX,
-       SHDMA_SLAVE_FSI2A_RX,
-       SHDMA_SLAVE_FSI2B_TX,
-       SHDMA_SLAVE_FSI2B_RX,
-       SHDMA_SLAVE_FSI2C_TX,
-       SHDMA_SLAVE_FSI2C_RX,
-       SHDMA_SLAVE_FSI2D_RX,
-};
-
-/*
- *             SH73A0 IRQ LOCATION TABLE
- *
- * 416 -----------------------------------------
- *             IRQ0-IRQ15
- * 431 -----------------------------------------
- * ...
- * 448 -----------------------------------------
- *             sh73a0-intcs
- *             sh73a0-intca-irq-pins
- * 680 -----------------------------------------
- * ...
- * 700 -----------------------------------------
- *             sh73a0-pint0
- * 731 -----------------------------------------
- * 732 -----------------------------------------
- *             sh73a0-pint1
- * 739 -----------------------------------------
- * ...
- * 800 -----------------------------------------
- *             IRQ16-IRQ31
- * 815 -----------------------------------------
- * ...
- * 928 -----------------------------------------
- *             sh73a0-intca-irq-pins
- * 943 -----------------------------------------
- */
-
-/* PINT interrupts are located at Linux IRQ 700 and up */
-#define SH73A0_PINT0_IRQ(irq) ((irq) + 700)
-#define SH73A0_PINT1_IRQ(irq) ((irq) + 732)
-
-extern void sh73a0_init_delay(void);
-extern void sh73a0_init_irq(void);
-extern void sh73a0_init_irq_dt(void);
-extern void sh73a0_map_io(void);
-extern void sh73a0_earlytimer_init(void);
-extern void sh73a0_add_early_devices(void);
-extern void sh73a0_add_standard_devices(void);
-extern void sh73a0_add_standard_devices_dt(void);
-extern void sh73a0_clock_init(void);
-extern void sh73a0_pinmux_init(void);
-extern void sh73a0_pm_init(void);
-extern struct clk sh73a0_extal1_clk;
-extern struct clk sh73a0_extal2_clk;
-extern struct clk sh73a0_extcki_clk;
-extern struct clk sh73a0_extalr_clk;
-extern struct smp_operations sh73a0_smp_ops;
-
-#endif /* __ASM_SH73A0_H__ */
index a91caad7db7c9bb18b340744634b73e423a1fad7..e2af00b1bd9dc465eefec06ad84398b41dda1657 100644 (file)
 #include <linux/module.h>
 #include <linux/irq.h>
 #include <linux/io.h>
-#include <linux/sh_intc.h>
-#include <mach/intc.h>
-#include <mach/irqs.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
+#include "intc.h"
+#include "irqs.h"
 
 enum {
        UNUSED_INTCA = 0,
index 19a26f4579b31e47b2437b2fe4128c7dc7dd6a3d..44457a94897b28708c83cbb12a394ab857b860f1 100644 (file)
 #include <linux/module.h>
 #include <linux/irq.h>
 #include <linux/io.h>
-#include <linux/sh_intc.h>
 #include <linux/irqchip.h>
 #include <linux/irqchip/arm-gic.h>
-#include <mach/intc.h>
-#include <mach/irqs.h>
-#include <mach/sh73a0.h>
+
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 
+#include "intc.h"
+#include "irqs.h"
+#include "sh73a0.h"
+
 enum {
        UNUSED = 0,
 
diff --git a/arch/arm/mach-shmobile/intc.h b/arch/arm/mach-shmobile/intc.h
new file mode 100644 (file)
index 0000000..a5603c7
--- /dev/null
@@ -0,0 +1,290 @@
+#ifndef __ASM_MACH_INTC_H
+#define __ASM_MACH_INTC_H
+#include <linux/sh_intc.h>
+
+#define INTC_IRQ_PINS_ENUM_16L(p)                              \
+       p ## _IRQ0, p ## _IRQ1, p ## _IRQ2, p ## _IRQ3,         \
+       p ## _IRQ4, p ## _IRQ5, p ## _IRQ6, p ## _IRQ7,         \
+       p ## _IRQ8, p ## _IRQ9, p ## _IRQ10, p ## _IRQ11,       \
+       p ## _IRQ12, p ## _IRQ13, p ## _IRQ14, p ## _IRQ15
+
+#define INTC_IRQ_PINS_ENUM_16H(p)                              \
+       p ## _IRQ16, p ## _IRQ17, p ## _IRQ18, p ## _IRQ19,     \
+       p ## _IRQ20, p ## _IRQ21, p ## _IRQ22, p ## _IRQ23,     \
+       p ## _IRQ24, p ## _IRQ25, p ## _IRQ26, p ## _IRQ27,     \
+       p ## _IRQ28, p ## _IRQ29, p ## _IRQ30, p ## _IRQ31
+
+#define INTC_IRQ_PINS_VECT_16L(p, vect)                                \
+       vect(p ## _IRQ0, 0x0200), vect(p ## _IRQ1, 0x0220),     \
+       vect(p ## _IRQ2, 0x0240), vect(p ## _IRQ3, 0x0260),     \
+       vect(p ## _IRQ4, 0x0280), vect(p ## _IRQ5, 0x02a0),     \
+       vect(p ## _IRQ6, 0x02c0), vect(p ## _IRQ7, 0x02e0),     \
+       vect(p ## _IRQ8, 0x0300), vect(p ## _IRQ9, 0x0320),     \
+       vect(p ## _IRQ10, 0x0340), vect(p ## _IRQ11, 0x0360),   \
+       vect(p ## _IRQ12, 0x0380), vect(p ## _IRQ13, 0x03a0),   \
+       vect(p ## _IRQ14, 0x03c0), vect(p ## _IRQ15, 0x03e0)
+
+#define INTC_IRQ_PINS_VECT_16H(p, vect)                                \
+       vect(p ## _IRQ16, 0x3200), vect(p ## _IRQ17, 0x3220),   \
+       vect(p ## _IRQ18, 0x3240), vect(p ## _IRQ19, 0x3260),   \
+       vect(p ## _IRQ20, 0x3280), vect(p ## _IRQ21, 0x32a0),   \
+       vect(p ## _IRQ22, 0x32c0), vect(p ## _IRQ23, 0x32e0),   \
+       vect(p ## _IRQ24, 0x3300), vect(p ## _IRQ25, 0x3320),   \
+       vect(p ## _IRQ26, 0x3340), vect(p ## _IRQ27, 0x3360),   \
+       vect(p ## _IRQ28, 0x3380), vect(p ## _IRQ29, 0x33a0),   \
+       vect(p ## _IRQ30, 0x33c0), vect(p ## _IRQ31, 0x33e0)
+
+#define INTC_IRQ_PINS_MASK_16L(p, base)                                        \
+       { base + 0x40, base + 0x60, 8, /* INTMSK00A / INTMSKCLR00A */   \
+         { p ## _IRQ0, p ## _IRQ1, p ## _IRQ2, p ## _IRQ3,             \
+           p ## _IRQ4, p ## _IRQ5, p ## _IRQ6, p ## _IRQ7 } },         \
+       { base + 0x44, base + 0x64, 8, /* INTMSK10A / INTMSKCLR10A */   \
+         { p ## _IRQ8, p ## _IRQ9, p ## _IRQ10, p ## _IRQ11,           \
+           p ## _IRQ12, p ## _IRQ13, p ## _IRQ14, p ## _IRQ15 } }
+
+#define INTC_IRQ_PINS_MASK_16H(p, base)                                        \
+       { base + 0x48, base + 0x68, 8, /* INTMSK20A / INTMSKCLR20A */   \
+         { p ## _IRQ16, p ## _IRQ17, p ## _IRQ18, p ## _IRQ19,         \
+           p ## _IRQ20, p ## _IRQ21, p ## _IRQ22, p ## _IRQ23 } },     \
+       { base + 0x4c, base + 0x6c, 8, /* INTMSK30A / INTMSKCLR30A */   \
+         { p ## _IRQ24, p ## _IRQ25, p ## _IRQ26, p ## _IRQ27,         \
+           p ## _IRQ28, p ## _IRQ29, p ## _IRQ30, p ## _IRQ31 } }
+
+#define INTC_IRQ_PINS_PRIO_16L(p, base)                                        \
+       { base + 0x10, 0, 32, 4, /* INTPRI00A */                        \
+         { p ## _IRQ0, p ## _IRQ1, p ## _IRQ2, p ## _IRQ3,             \
+           p ## _IRQ4, p ## _IRQ5, p ## _IRQ6, p ## _IRQ7 } },         \
+       { base + 0x14, 0, 32, 4, /* INTPRI10A */                        \
+         { p ## _IRQ8, p ## _IRQ9, p ## _IRQ10, p ## _IRQ11,           \
+           p ## _IRQ12, p ## _IRQ13, p ## _IRQ14, p ## _IRQ15 } }
+
+#define INTC_IRQ_PINS_PRIO_16H(p, base)                                        \
+       { base + 0x18, 0, 32, 4, /* INTPRI20A */                        \
+         { p ## _IRQ16, p ## _IRQ17, p ## _IRQ18, p ## _IRQ19,         \
+           p ## _IRQ20, p ## _IRQ21, p ## _IRQ22, p ## _IRQ23 } },     \
+       { base + 0x1c, 0, 32, 4, /* INTPRI30A */                        \
+         { p ## _IRQ24, p ## _IRQ25, p ## _IRQ26, p ## _IRQ27,         \
+           p ## _IRQ28, p ## _IRQ29, p ## _IRQ30, p ## _IRQ31 } }
+
+#define INTC_IRQ_PINS_SENSE_16L(p, base)                               \
+       { base + 0x00, 32, 4, /* ICR1A */                               \
+         { p ## _IRQ0, p ## _IRQ1, p ## _IRQ2, p ## _IRQ3,             \
+           p ## _IRQ4, p ## _IRQ5, p ## _IRQ6, p ## _IRQ7 } },         \
+       { base + 0x04, 32, 4, /* ICR2A */                               \
+         { p ## _IRQ8, p ## _IRQ9, p ## _IRQ10, p ## _IRQ11,           \
+           p ## _IRQ12, p ## _IRQ13, p ## _IRQ14, p ## _IRQ15 } }
+
+#define INTC_IRQ_PINS_SENSE_16H(p, base)                               \
+       { base + 0x08, 32, 4, /* ICR3A */                               \
+         { p ## _IRQ16, p ## _IRQ17, p ## _IRQ18, p ## _IRQ19,         \
+           p ## _IRQ20, p ## _IRQ21, p ## _IRQ22, p ## _IRQ23 } },     \
+       { base + 0x0c, 32, 4, /* ICR4A */                               \
+         { p ## _IRQ24, p ## _IRQ25, p ## _IRQ26, p ## _IRQ27,         \
+           p ## _IRQ28, p ## _IRQ29, p ## _IRQ30, p ## _IRQ31 } }
+
+#define INTC_IRQ_PINS_ACK_16L(p, base)                                 \
+       { base + 0x20, 0, 8, /* INTREQ00A */                            \
+         { p ## _IRQ0, p ## _IRQ1, p ## _IRQ2, p ## _IRQ3,             \
+           p ## _IRQ4, p ## _IRQ5, p ## _IRQ6, p ## _IRQ7 } },         \
+       { base + 0x24, 0, 8, /* INTREQ10A */                            \
+         { p ## _IRQ8, p ## _IRQ9, p ## _IRQ10, p ## _IRQ11,           \
+           p ## _IRQ12, p ## _IRQ13, p ## _IRQ14, p ## _IRQ15 } }
+
+#define INTC_IRQ_PINS_ACK_16H(p, base)                                 \
+       { base + 0x28, 0, 8, /* INTREQ20A */                            \
+         { p ## _IRQ16, p ## _IRQ17, p ## _IRQ18, p ## _IRQ19,         \
+           p ## _IRQ20, p ## _IRQ21, p ## _IRQ22, p ## _IRQ23 } },     \
+       { base + 0x2c, 0, 8, /* INTREQ30A */                            \
+         { p ## _IRQ24, p ## _IRQ25, p ## _IRQ26, p ## _IRQ27,         \
+           p ## _IRQ28, p ## _IRQ29, p ## _IRQ30, p ## _IRQ31 } }
+
+#define INTC_IRQ_PINS_16(p, base, vect, str)                           \
+                                                                       \
+static struct resource p ## _resources[] __initdata = {                        \
+       [0] = {                                                         \
+               .start  = base,                                         \
+               .end    = base + 0x64,                                  \
+               .flags  = IORESOURCE_MEM,                               \
+       },                                                              \
+};                                                                     \
+                                                                       \
+enum {                                                                 \
+       p ## _UNUSED = 0,                                               \
+       INTC_IRQ_PINS_ENUM_16L(p),                                      \
+};                                                                     \
+                                                                       \
+static struct intc_vect p ## _vectors[] __initdata = {                 \
+       INTC_IRQ_PINS_VECT_16L(p, vect),                                \
+};                                                                     \
+                                                                       \
+static struct intc_mask_reg p ## _mask_registers[] __initdata = {      \
+       INTC_IRQ_PINS_MASK_16L(p, base),                                \
+};                                                                     \
+                                                                       \
+static struct intc_prio_reg p ## _prio_registers[] __initdata = {      \
+       INTC_IRQ_PINS_PRIO_16L(p, base),                                \
+};                                                                     \
+                                                                       \
+static struct intc_sense_reg p ## _sense_registers[] __initdata = {    \
+       INTC_IRQ_PINS_SENSE_16L(p, base),                               \
+};                                                                     \
+                                                                       \
+static struct intc_mask_reg p ## _ack_registers[] __initdata = {       \
+       INTC_IRQ_PINS_ACK_16L(p, base),                                 \
+};                                                                     \
+                                                                       \
+static struct intc_desc p ## _desc __initdata = {                      \
+       .name = str,                                                    \
+       .resource = p ## _resources,                                    \
+       .num_resources = ARRAY_SIZE(p ## _resources),                   \
+       .hw = INTC_HW_DESC(p ## _vectors, NULL,                         \
+                            p ## _mask_registers, p ## _prio_registers, \
+                            p ## _sense_registers, p ## _ack_registers) \
+}
+
+#define INTC_IRQ_PINS_16H(p, base, vect, str)                          \
+                                                                       \
+static struct resource p ## _resources[] __initdata = {                        \
+       [0] = {                                                         \
+               .start  = base,                                         \
+               .end    = base + 0x64,                                  \
+               .flags  = IORESOURCE_MEM,                               \
+       },                                                              \
+};                                                                     \
+                                                                       \
+enum {                                                                 \
+       p ## _UNUSED = 0,                                               \
+       INTC_IRQ_PINS_ENUM_16H(p),                                      \
+};                                                                     \
+                                                                       \
+static struct intc_vect p ## _vectors[] __initdata = {                 \
+       INTC_IRQ_PINS_VECT_16H(p, vect),                                \
+};                                                                     \
+                                                                       \
+static struct intc_mask_reg p ## _mask_registers[] __initdata = {      \
+       INTC_IRQ_PINS_MASK_16H(p, base),                                \
+};                                                                     \
+                                                                       \
+static struct intc_prio_reg p ## _prio_registers[] __initdata = {      \
+       INTC_IRQ_PINS_PRIO_16H(p, base),                                \
+};                                                                     \
+                                                                       \
+static struct intc_sense_reg p ## _sense_registers[] __initdata = {    \
+       INTC_IRQ_PINS_SENSE_16H(p, base),                               \
+};                                                                     \
+                                                                       \
+static struct intc_mask_reg p ## _ack_registers[] __initdata = {       \
+       INTC_IRQ_PINS_ACK_16H(p, base),                                 \
+};                                                                     \
+                                                                       \
+static struct intc_desc p ## _desc __initdata = {                      \
+       .name = str,                                                    \
+       .resource = p ## _resources,                                    \
+       .num_resources = ARRAY_SIZE(p ## _resources),                   \
+       .hw = INTC_HW_DESC(p ## _vectors, NULL,                         \
+                            p ## _mask_registers, p ## _prio_registers, \
+                            p ## _sense_registers, p ## _ack_registers) \
+}
+
+#define INTC_IRQ_PINS_32(p, base, vect, str)                           \
+                                                                       \
+static struct resource p ## _resources[] __initdata = {                        \
+       [0] = {                                                         \
+               .start  = base,                                         \
+               .end    = base + 0x6c,                                  \
+               .flags  = IORESOURCE_MEM,                               \
+       },                                                              \
+};                                                                     \
+                                                                       \
+enum {                                                                 \
+       p ## _UNUSED = 0,                                               \
+       INTC_IRQ_PINS_ENUM_16L(p),                                      \
+       INTC_IRQ_PINS_ENUM_16H(p),                                      \
+};                                                                     \
+                                                                       \
+static struct intc_vect p ## _vectors[] __initdata = {                 \
+       INTC_IRQ_PINS_VECT_16L(p, vect),                                \
+       INTC_IRQ_PINS_VECT_16H(p, vect),                                \
+};                                                                     \
+                                                                       \
+static struct intc_mask_reg p ## _mask_registers[] __initdata = {      \
+       INTC_IRQ_PINS_MASK_16L(p, base),                                \
+       INTC_IRQ_PINS_MASK_16H(p, base),                                \
+};                                                                     \
+                                                                       \
+static struct intc_prio_reg p ## _prio_registers[] __initdata = {      \
+       INTC_IRQ_PINS_PRIO_16L(p, base),                                \
+       INTC_IRQ_PINS_PRIO_16H(p, base),                                \
+};                                                                     \
+                                                                       \
+static struct intc_sense_reg p ## _sense_registers[] __initdata = {    \
+       INTC_IRQ_PINS_SENSE_16L(p, base),                               \
+       INTC_IRQ_PINS_SENSE_16H(p, base),                               \
+};                                                                     \
+                                                                       \
+static struct intc_mask_reg p ## _ack_registers[] __initdata = {       \
+       INTC_IRQ_PINS_ACK_16L(p, base),                                 \
+       INTC_IRQ_PINS_ACK_16H(p, base),                                 \
+};                                                                     \
+                                                                       \
+static struct intc_desc p ## _desc __initdata = {                      \
+       .name = str,                                                    \
+       .resource = p ## _resources,                                    \
+       .num_resources = ARRAY_SIZE(p ## _resources),                   \
+       .hw = INTC_HW_DESC(p ## _vectors, NULL,                         \
+                            p ## _mask_registers, p ## _prio_registers, \
+                            p ## _sense_registers, p ## _ack_registers) \
+}
+
+#define INTC_PINT_E_EMPTY
+#define INTC_PINT_E_NONE 0, 0, 0, 0, 0, 0, 0, 0,
+#define INTC_PINT_E(p)                                                 \
+       PINT ## p ## 0, PINT ## p ## 1, PINT ## p ## 2, PINT ## p ## 3, \
+       PINT ## p ## 4, PINT ## p ## 5, PINT ## p ## 6, PINT ## p ## 7,
+
+#define INTC_PINT_V_NONE
+#define INTC_PINT_V(p, vect)                                   \
+       vect(PINT ## p ## 0, 0), vect(PINT ## p ## 1, 1),       \
+       vect(PINT ## p ## 2, 2), vect(PINT ## p ## 3, 3),       \
+       vect(PINT ## p ## 4, 4), vect(PINT ## p ## 5, 5),       \
+       vect(PINT ## p ## 6, 6), vect(PINT ## p ## 7, 7),
+
+#define INTC_PINT(p, mask_reg, sense_base, str,                                \
+       enums_1, enums_2, enums_3, enums_4,                             \
+       vect_1, vect_2, vect_3, vect_4,                                 \
+       mask_a, mask_b, mask_c, mask_d,                                 \
+       sense_a, sense_b, sense_c, sense_d)                             \
+                                                                       \
+enum {                                                                 \
+       PINT ## p ## _UNUSED = 0,                                       \
+       enums_1 enums_2 enums_3 enums_4                                 \
+};                                                                     \
+                                                                       \
+static struct intc_vect p ## _vectors[] __initdata = {                 \
+       vect_1 vect_2 vect_3 vect_4                                     \
+};                                                                     \
+                                                                       \
+static struct intc_mask_reg p ## _mask_registers[] __initdata = {      \
+       { mask_reg, 0, 32, /* PINTER */                                 \
+         { mask_a mask_b mask_c mask_d } }                             \
+};                                                                     \
+                                                                       \
+static struct intc_sense_reg p ## _sense_registers[] __initdata = {    \
+       { sense_base + 0x00, 16, 2, /* PINTCR */                        \
+         { sense_a } },                                                \
+       { sense_base + 0x04, 16, 2, /* PINTCR */                        \
+         { sense_b } },                                                \
+       { sense_base + 0x08, 16, 2, /* PINTCR */                        \
+         { sense_c } },                                                \
+       { sense_base + 0x0c, 16, 2, /* PINTCR */                        \
+         { sense_d } },                                                \
+};                                                                     \
+                                                                       \
+static struct intc_desc p ## _desc __initdata = {                      \
+       .name = str,                                                    \
+       .hw = INTC_HW_DESC(p ## _vectors, NULL,                         \
+                            p ## _mask_registers, NULL,                \
+                            p ## _sense_registers, NULL),              \
+}
+
+#endif  /* __ASM_MACH_INTC_H */
diff --git a/arch/arm/mach-shmobile/irqs.h b/arch/arm/mach-shmobile/irqs.h
new file mode 100644 (file)
index 0000000..4ff2d2a
--- /dev/null
@@ -0,0 +1,21 @@
+#ifndef __SHMOBILE_IRQS_H
+#define __SHMOBILE_IRQS_H
+
+#include <linux/sh_intc.h>
+#include <mach/irqs.h>
+
+/* GIC */
+#define gic_spi(nr)            ((nr) + 32)
+#define gic_iid(nr)            (nr) /* ICCIAR / interrupt ID */
+
+/* INTCS */
+#define INTCS_VECT_BASE                0x3400
+#define INTCS_VECT(n, vect)    INTC_VECT((n), INTCS_VECT_BASE + (vect))
+#define intcs_evt2irq(evt)     evt2irq(INTCS_VECT_BASE + (evt))
+
+/* GPIO IRQ */
+#define _GPIO_IRQ_BASE         2500
+#define GPIO_IRQ_BASE(x)       (_GPIO_IRQ_BASE + (32 * x))
+#define GPIO_IRQ(x, y)         (_GPIO_IRQ_BASE + (32 * x) + y)
+
+#endif /* __SHMOBILE_IRQS_H */
index 8cb641c00fdb1f68b4ddd4cc3ad516a3bb994699..2c06810d3a70e5af46dc8adc06dea0d66d19114f 100644 (file)
@@ -7,27 +7,32 @@
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  */
+#include <linux/cpu_pm.h>
 #include <linux/delay.h>
 #include <linux/init.h>
 #include <linux/io.h>
 #include <linux/ioport.h>
 #include <linux/of_address.h>
 #include <linux/smp.h>
+#include <linux/suspend.h>
+#include <linux/threads.h>
 #include <asm/cacheflush.h>
 #include <asm/cp15.h>
+#include <asm/proc-fns.h>
 #include <asm/smp_plat.h>
-#include <mach/common.h>
+#include <asm/suspend.h>
+#include "common.h"
 
 static struct {
        void __iomem *iomem;
        int bit;
-} apmu_cpus[CONFIG_NR_CPUS];
+} apmu_cpus[NR_CPUS];
 
 #define WUPCR_OFFS 0x10
 #define PSTR_OFFS 0x40
 #define CPUNCR_OFFS(n) (0x100 + (0x10 * (n)))
 
-static int apmu_power_on(void __iomem *p, int bit)
+static int __maybe_unused apmu_power_on(void __iomem *p, int bit)
 {
        /* request power on */
        writel_relaxed(BIT(bit), p + WUPCR_OFFS);
@@ -46,7 +51,7 @@ static int apmu_power_off(void __iomem *p, int bit)
        return 0;
 }
 
-static int apmu_power_off_poll(void __iomem *p, int bit)
+static int __maybe_unused apmu_power_off_poll(void __iomem *p, int bit)
 {
        int k;
 
@@ -69,7 +74,7 @@ static int apmu_wrap(int cpu, int (*fn)(void __iomem *p, int cpu))
 
 static void apmu_init_cpu(struct resource *res, int cpu, int bit)
 {
-       if (apmu_cpus[cpu].iomem)
+       if ((cpu >= ARRAY_SIZE(apmu_cpus)) || apmu_cpus[cpu].iomem)
                return;
 
        apmu_cpus[cpu].iomem = ioremap_nocache(res->start, resource_size(res));
@@ -133,6 +138,7 @@ void __init shmobile_smp_apmu_prepare_cpus(unsigned int max_cpus)
        apmu_parse_cfg(apmu_init_cpu);
 }
 
+#ifdef CONFIG_SMP
 int shmobile_smp_apmu_boot_secondary(unsigned int cpu, struct task_struct *idle)
 {
        /* For this particular CPU register boot vector */
@@ -140,8 +146,9 @@ int shmobile_smp_apmu_boot_secondary(unsigned int cpu, struct task_struct *idle)
 
        return apmu_wrap(cpu, apmu_power_on);
 }
+#endif
 
-#ifdef CONFIG_HOTPLUG_CPU
+#if defined(CONFIG_HOTPLUG_CPU) || defined(CONFIG_SUSPEND)
 /* nicked from arch/arm/mach-exynos/hotplug.c */
 static inline void cpu_enter_lowpower_a15(void)
 {
@@ -172,16 +179,40 @@ static inline void cpu_enter_lowpower_a15(void)
        dsb();
 }
 
-void shmobile_smp_apmu_cpu_die(unsigned int cpu)
+void shmobile_smp_apmu_cpu_shutdown(unsigned int cpu)
 {
-       /* For this particular CPU deregister boot vector */
-       shmobile_smp_hook(cpu, 0, 0);
 
        /* Select next sleep mode using the APMU */
        apmu_wrap(cpu, apmu_power_off);
 
        /* Do ARM specific CPU shutdown */
        cpu_enter_lowpower_a15();
+}
+
+static inline void cpu_leave_lowpower(void)
+{
+       unsigned int v;
+
+       asm volatile("mrc    p15, 0, %0, c1, c0, 0\n"
+                    "       orr     %0, %0, %1\n"
+                    "       mcr     p15, 0, %0, c1, c0, 0\n"
+                    "       mrc     p15, 0, %0, c1, c0, 1\n"
+                    "       orr     %0, %0, %2\n"
+                    "       mcr     p15, 0, %0, c1, c0, 1\n"
+                    : "=&r" (v)
+                    : "Ir" (CR_C), "Ir" (0x40)
+                    : "cc");
+}
+#endif
+
+#if defined(CONFIG_HOTPLUG_CPU)
+void shmobile_smp_apmu_cpu_die(unsigned int cpu)
+{
+       /* For this particular CPU deregister boot vector */
+       shmobile_smp_hook(cpu, 0, 0);
+
+       /* Shutdown CPU core */
+       shmobile_smp_apmu_cpu_shutdown(cpu);
 
        /* jump to shared mach-shmobile sleep / reset code */
        shmobile_smp_sleep();
@@ -192,3 +223,25 @@ int shmobile_smp_apmu_cpu_kill(unsigned int cpu)
        return apmu_wrap(cpu, apmu_power_off_poll);
 }
 #endif
+
+#if defined(CONFIG_SUSPEND)
+static int shmobile_smp_apmu_do_suspend(unsigned long cpu)
+{
+       shmobile_smp_hook(cpu, virt_to_phys(cpu_resume), 0);
+       shmobile_smp_apmu_cpu_shutdown(cpu);
+       cpu_do_idle(); /* WFI selects Core Standby */
+       return 1;
+}
+
+static int shmobile_smp_apmu_enter_suspend(suspend_state_t state)
+{
+       cpu_suspend(smp_processor_id(), shmobile_smp_apmu_do_suspend);
+       cpu_leave_lowpower();
+       return 0;
+}
+
+void __init shmobile_smp_apmu_suspend_init(void)
+{
+       shmobile_suspend_ops.enter = shmobile_smp_apmu_enter_suspend;
+}
+#endif
index 673ad6e808694f1cab787fe6430090900efc8150..64663110ab6ca0e1d8f06cc04e69175165e2cace 100644 (file)
@@ -15,7 +15,7 @@
 #include <asm/cacheflush.h>
 #include <asm/smp_plat.h>
 #include <asm/smp_scu.h>
-#include <mach/common.h>
+#include "common.h"
 
 static int shmobile_smp_scu_notifier_call(struct notifier_block *nfb,
                                          unsigned long action, void *hcpu)
index 9ebc246b8d7dd7fc46505ba40691a0ff8e4dbb4f..3923e09e966d5031cab8aa82fb304305c284e9ce 100644 (file)
@@ -13,7 +13,7 @@
 #include <linux/init.h>
 #include <asm/cacheflush.h>
 #include <asm/smp_plat.h>
-#include <mach/common.h>
+#include "common.h"
 
 extern unsigned long shmobile_smp_fn[];
 extern unsigned long shmobile_smp_arg[];
index 40b87aa1d44859e1295451a944254254b77823c7..a0d44d537fa0bc87327e662cf74e3e8de0a02be0 100644 (file)
@@ -10,8 +10,8 @@
  */
 #include <linux/console.h>
 #include <linux/suspend.h>
-#include <mach/pm-rmobile.h>
-#include <mach/common.h>
+#include "common.h"
+#include "pm-rmobile.h"
 
 #ifdef CONFIG_PM
 static int r8a7740_pd_a4s_suspend(void)
index d6fe189b2df6e4176d343b33630085bff7d071c7..69f70b7f7fb2ee406bcf0b0d75fd16c7378aabf8 100644 (file)
 #include <linux/suspend.h>
 #include <linux/err.h>
 #include <linux/pm_clock.h>
+#include <linux/pm_domain.h>
 #include <linux/platform_device.h>
 #include <linux/delay.h>
 #include <linux/irq.h>
 #include <linux/interrupt.h>
 #include <linux/console.h>
+
 #include <asm/io.h>
-#include <mach/common.h>
-#include <mach/pm-rcar.h>
-#include <mach/r8a7779.h>
+
+#include "common.h"
+#include "pm-rcar.h"
+#include "r8a7779.h"
 
 /* SYSC */
 #define SYSCIER 0x0c
 #define SYSCIMR 0x10
 
+struct r8a7779_pm_domain {
+       struct generic_pm_domain genpd;
+       struct rcar_sysc_ch ch;
+};
+
+static inline struct rcar_sysc_ch *to_r8a7779_ch(struct generic_pm_domain *d)
+{
+       return &container_of(d, struct r8a7779_pm_domain, genpd)->ch;
+}
+
 #if defined(CONFIG_PM) || defined(CONFIG_SMP)
 
 static void __init r8a7779_sysc_init(void)
index fc82839e2c2a1b68e4adaa31f1fe5db1b68cc963..80e8d95e54d3b8846c52f91c0d2d89f1907d6a39 100644 (file)
  */
 
 #include <linux/kernel.h>
+#include <linux/smp.h>
 #include <asm/io.h>
-#include <mach/pm-rcar.h>
-#include <mach/r8a7790.h>
+#include "common.h"
+#include "pm-rcar.h"
+#include "r8a7790.h"
+
+/* RST */
+#define RST            0xe6160000
+#define CA15BAR                0x0020
+#define CA7BAR         0x0030
+#define CA15RESCNT     0x0040
+#define CA7RESCNT      0x0044
+
+/* On-chip RAM */
+#define MERAM          0xe8080000
 
 /* SYSC */
 #define SYSCIER 0x0c
@@ -38,8 +50,33 @@ static inline void r8a7790_sysc_init(void) {}
 
 void __init r8a7790_pm_init(void)
 {
+       void __iomem *p;
+       u32 bar;
        static int once;
 
-       if (!once++)
-               r8a7790_sysc_init();
+       if (once++)
+               return;
+
+       /* MERAM for jump stub, because BAR requires 256KB aligned address */
+       p = ioremap_nocache(MERAM, shmobile_boot_size);
+       memcpy_toio(p, shmobile_boot_vector, shmobile_boot_size);
+       iounmap(p);
+
+       /* setup reset vectors */
+       p = ioremap_nocache(RST, 0x63);
+       bar = (MERAM >> 8) & 0xfffffc00;
+       writel_relaxed(bar, p + CA15BAR);
+       writel_relaxed(bar, p + CA7BAR);
+       writel_relaxed(bar | 0x10, p + CA15BAR);
+       writel_relaxed(bar | 0x10, p + CA7BAR);
+
+       /* de-assert reset for all CPUs */
+       writel_relaxed((readl_relaxed(p + CA15RESCNT) & ~0x0f) | 0xa5a50000,
+                      p + CA15RESCNT);
+       writel_relaxed((readl_relaxed(p + CA7RESCNT) & ~0x0f) | 0x5a5a0000,
+                      p + CA7RESCNT);
+       iounmap(p);
+
+       r8a7790_sysc_init();
+       shmobile_smp_apmu_suspend_init();
 }
diff --git a/arch/arm/mach-shmobile/pm-r8a7791.c b/arch/arm/mach-shmobile/pm-r8a7791.c
new file mode 100644 (file)
index 0000000..25f107b
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * r8a7791 Power management support
+ *
+ * Copyright (C) 2014  Renesas Electronics Corporation
+ * Copyright (C) 2011  Renesas Solutions Corp.
+ * Copyright (C) 2011  Magnus Damm
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ */
+
+#include <linux/kernel.h>
+#include <linux/smp.h>
+#include <asm/io.h>
+#include "common.h"
+#include "pm-rcar.h"
+#include "r8a7791.h"
+
+#define RST            0xe6160000
+#define CA15BAR                0x0020
+#define CA15RESCNT     0x0040
+#define RAM            0xe6300000
+
+/* SYSC */
+#define SYSCIER 0x0c
+#define SYSCIMR 0x10
+
+#if defined(CONFIG_SMP)
+
+static void __init r8a7791_sysc_init(void)
+{
+       void __iomem *base = rcar_sysc_init(0xe6180000);
+
+       /* enable all interrupt sources, but do not use interrupt handler */
+       iowrite32(0x0131000e, base + SYSCIER);
+       iowrite32(0, base + SYSCIMR);
+}
+
+#else /* CONFIG_SMP */
+
+static inline void r8a7791_sysc_init(void) {}
+
+#endif /* CONFIG_SMP */
+
+void __init r8a7791_pm_init(void)
+{
+       void __iomem *p;
+       u32 bar;
+       static int once;
+
+       if (once++)
+               return;
+
+       /* RAM for jump stub, because BAR requires 256KB aligned address */
+       p = ioremap_nocache(RAM, shmobile_boot_size);
+       memcpy_toio(p, shmobile_boot_vector, shmobile_boot_size);
+       iounmap(p);
+
+       /* setup reset vectors */
+       p = ioremap_nocache(RST, 0x63);
+       bar = (RAM >> 8) & 0xfffffc00;
+       writel_relaxed(bar, p + CA15BAR);
+       writel_relaxed(bar | 0x10, p + CA15BAR);
+
+       /* enable clocks to all CPUs */
+       writel_relaxed((readl_relaxed(p + CA15RESCNT) & ~0x0f) | 0xa5a50000,
+                      p + CA15RESCNT);
+       iounmap(p);
+
+       r8a7791_sysc_init();
+       shmobile_smp_apmu_suspend_init();
+}
index 1f465a12d1b1932422935e35a1c8f3f7bb2a4b1b..34b8a5674f85e9d9c7437be76f243026269b2857 100644 (file)
@@ -13,7 +13,7 @@
 #include <linux/mm.h>
 #include <linux/spinlock.h>
 #include <asm/io.h>
-#include <mach/pm-rcar.h>
+#include "pm-rcar.h"
 
 /* SYSC */
 #define SYSCSR 0x00
diff --git a/arch/arm/mach-shmobile/pm-rcar.h b/arch/arm/mach-shmobile/pm-rcar.h
new file mode 100644 (file)
index 0000000..ef3a1ef
--- /dev/null
@@ -0,0 +1,15 @@
+#ifndef PM_RCAR_H
+#define PM_RCAR_H
+
+struct rcar_sysc_ch {
+       unsigned long chan_offs;
+       unsigned int chan_bit;
+       unsigned int isr_bit;
+};
+
+int rcar_sysc_power_down(struct rcar_sysc_ch *sysc_ch);
+int rcar_sysc_power_up(struct rcar_sysc_ch *sysc_ch);
+bool rcar_sysc_power_is_off(struct rcar_sysc_ch *sysc_ch);
+void __iomem *rcar_sysc_init(phys_addr_t base);
+
+#endif /* PM_RCAR_H */
index f710235aff2fad5addfb2f0a65363ccf26bfa93f..ebdd16e94a84f5d674f691edfc99e6712d7cee28 100644 (file)
@@ -17,7 +17,7 @@
 #include <linux/pm.h>
 #include <linux/pm_clock.h>
 #include <asm/io.h>
-#include <mach/pm-rmobile.h>
+#include "pm-rmobile.h"
 
 /* SYSC */
 #define SPDCR          IOMEM(0xe6180008)
diff --git a/arch/arm/mach-shmobile/pm-rmobile.h b/arch/arm/mach-shmobile/pm-rmobile.h
new file mode 100644 (file)
index 0000000..690553a
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2012 Renesas Solutions Corp.
+ *
+ * Kuninori Morimoto <morimoto.kuninori@renesas.com>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ */
+#ifndef PM_RMOBILE_H
+#define PM_RMOBILE_H
+
+#include <linux/pm_domain.h>
+
+#define DEFAULT_DEV_LATENCY_NS 250000
+
+struct platform_device;
+
+struct rmobile_pm_domain {
+       struct generic_pm_domain genpd;
+       struct dev_power_governor *gov;
+       int (*suspend)(void);
+       void (*resume)(void);
+       unsigned int bit_shift;
+       bool no_debug;
+};
+
+static inline
+struct rmobile_pm_domain *to_rmobile_pd(struct generic_pm_domain *d)
+{
+       return container_of(d, struct rmobile_pm_domain, genpd);
+}
+
+struct pm_domain_device {
+       const char *domain_name;
+       struct platform_device *pdev;
+};
+
+#ifdef CONFIG_PM
+extern void rmobile_init_domains(struct rmobile_pm_domain domains[], int num);
+extern void rmobile_add_device_to_domain_td(const char *domain_name,
+                                           struct platform_device *pdev,
+                                           struct gpd_timing_data *td);
+
+static inline void rmobile_add_device_to_domain(const char *domain_name,
+                                               struct platform_device *pdev)
+{
+       rmobile_add_device_to_domain_td(domain_name, pdev, NULL);
+}
+
+extern void rmobile_add_devices_to_domains(struct pm_domain_device data[],
+                                          int size);
+#else
+
+#define rmobile_init_domains(domains, num) do { } while (0)
+#define rmobile_add_device_to_domain_td(name, pdev, td) do { } while (0)
+#define rmobile_add_device_to_domain(name, pdev) do { } while (0)
+
+static inline void rmobile_add_devices_to_domains(struct pm_domain_device d[],
+                                                 int size) {}
+#endif /* CONFIG_PM */
+
+#endif /* PM_RMOBILE_H */
index 0de75fd394b9cb654470a591dbb9ec08d0c6d361..7e5c2676c48902f17138c242c0cd097a28d4044c 100644 (file)
 #include <linux/irq.h>
 #include <linux/bitrev.h>
 #include <linux/console.h>
+
 #include <asm/cpuidle.h>
 #include <asm/io.h>
 #include <asm/tlbflush.h>
 #include <asm/suspend.h>
-#include <mach/common.h>
-#include <mach/sh7372.h>
-#include <mach/pm-rmobile.h>
+
+#include "common.h"
+#include "pm-rmobile.h"
+#include "sh7372.h"
 
 /* DBG */
 #define DBGREG1 IOMEM(0xe6100020)
index 99086e98fbbc66d621132cb3a6dcd07dee36bc51..a7e466817965e3b8d974ccc5af166226bef7e048 100644 (file)
@@ -9,7 +9,7 @@
  */
 
 #include <linux/suspend.h>
-#include <mach/common.h>
+#include "common.h"
 
 #ifdef CONFIG_SUSPEND
 static int sh73a0_enter_suspend(suspend_state_t suspend_state)
diff --git a/arch/arm/mach-shmobile/r7s72100.h b/arch/arm/mach-shmobile/r7s72100.h
new file mode 100644 (file)
index 0000000..efb723c
--- /dev/null
@@ -0,0 +1,7 @@
+#ifndef __ASM_R7S72100_H__
+#define __ASM_R7S72100_H__
+
+void r7s72100_add_dt_devices(void);
+void r7s72100_clock_init(void);
+
+#endif /* __ASM_R7S72100_H__ */
diff --git a/arch/arm/mach-shmobile/r8a73a4.h b/arch/arm/mach-shmobile/r8a73a4.h
new file mode 100644 (file)
index 0000000..ce8bdd1
--- /dev/null
@@ -0,0 +1,19 @@
+#ifndef __ASM_R8A73A4_H__
+#define __ASM_R8A73A4_H__
+
+/* DMA slave IDs */
+enum {
+       SHDMA_SLAVE_INVALID,
+       SHDMA_SLAVE_MMCIF0_TX,
+       SHDMA_SLAVE_MMCIF0_RX,
+       SHDMA_SLAVE_MMCIF1_TX,
+       SHDMA_SLAVE_MMCIF1_RX,
+};
+
+void r8a73a4_add_standard_devices(void);
+void r8a73a4_add_dt_devices(void);
+void r8a73a4_clock_init(void);
+void r8a73a4_pinmux_init(void);
+void r8a73a4_init_early(void);
+
+#endif /* __ASM_R8A73A4_H__ */
diff --git a/arch/arm/mach-shmobile/r8a7740.h b/arch/arm/mach-shmobile/r8a7740.h
new file mode 100644 (file)
index 0000000..1d1a5fd
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2011  Renesas Solutions Corp.
+ * Copyright (C) 2011  Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#ifndef __ASM_R8A7740_H__
+#define __ASM_R8A7740_H__
+
+/*
+ * MD_CKx pin
+ */
+#define MD_CK2 (1 << 2)
+#define MD_CK1 (1 << 1)
+#define MD_CK0 (1 << 0)
+
+/* DMA slave IDs */
+enum {
+       SHDMA_SLAVE_INVALID,
+       SHDMA_SLAVE_SDHI0_RX,
+       SHDMA_SLAVE_SDHI0_TX,
+       SHDMA_SLAVE_SDHI1_RX,
+       SHDMA_SLAVE_SDHI1_TX,
+       SHDMA_SLAVE_SDHI2_RX,
+       SHDMA_SLAVE_SDHI2_TX,
+       SHDMA_SLAVE_FSIA_RX,
+       SHDMA_SLAVE_FSIA_TX,
+       SHDMA_SLAVE_FSIB_TX,
+       SHDMA_SLAVE_USBHS_TX,
+       SHDMA_SLAVE_USBHS_RX,
+       SHDMA_SLAVE_MMCIF_TX,
+       SHDMA_SLAVE_MMCIF_RX,
+};
+
+extern void r8a7740_meram_workaround(void);
+extern void r8a7740_init_irq_of(void);
+extern void r8a7740_map_io(void);
+extern void r8a7740_add_early_devices(void);
+extern void r8a7740_add_standard_devices(void);
+extern void r8a7740_add_standard_devices_dt(void);
+extern void r8a7740_clock_init(u8 md_ck);
+extern void r8a7740_pinmux_init(void);
+extern void r8a7740_pm_init(void);
+
+#ifdef CONFIG_PM
+extern void __init r8a7740_init_pm_domains(void);
+#else
+static inline void r8a7740_init_pm_domains(void) {}
+#endif /* CONFIG_PM */
+
+#endif /* __ASM_R8A7740_H__ */
diff --git a/arch/arm/mach-shmobile/r8a7778.h b/arch/arm/mach-shmobile/r8a7778.h
new file mode 100644 (file)
index 0000000..f4076a5
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2013  Renesas Solutions Corp.
+ * Copyright (C) 2013  Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+ * Copyright (C) 2013  Cogent Embedded, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+#ifndef __ASM_R8A7778_H__
+#define __ASM_R8A7778_H__
+
+#include <linux/sh_eth.h>
+
+/* HPB-DMA slave IDs */
+enum {
+       HPBDMA_SLAVE_DUMMY,
+       HPBDMA_SLAVE_SDHI0_TX,
+       HPBDMA_SLAVE_SDHI0_RX,
+       HPBDMA_SLAVE_SSI0_TX,
+       HPBDMA_SLAVE_SSI0_RX,
+       HPBDMA_SLAVE_SSI1_TX,
+       HPBDMA_SLAVE_SSI1_RX,
+       HPBDMA_SLAVE_SSI2_TX,
+       HPBDMA_SLAVE_SSI2_RX,
+       HPBDMA_SLAVE_SSI3_TX,
+       HPBDMA_SLAVE_SSI3_RX,
+       HPBDMA_SLAVE_SSI4_TX,
+       HPBDMA_SLAVE_SSI4_RX,
+       HPBDMA_SLAVE_SSI5_TX,
+       HPBDMA_SLAVE_SSI5_RX,
+       HPBDMA_SLAVE_SSI6_TX,
+       HPBDMA_SLAVE_SSI6_RX,
+       HPBDMA_SLAVE_SSI7_TX,
+       HPBDMA_SLAVE_SSI7_RX,
+       HPBDMA_SLAVE_SSI8_TX,
+       HPBDMA_SLAVE_SSI8_RX,
+       HPBDMA_SLAVE_HPBIF0_TX,
+       HPBDMA_SLAVE_HPBIF0_RX,
+       HPBDMA_SLAVE_HPBIF1_TX,
+       HPBDMA_SLAVE_HPBIF1_RX,
+       HPBDMA_SLAVE_HPBIF2_TX,
+       HPBDMA_SLAVE_HPBIF2_RX,
+       HPBDMA_SLAVE_HPBIF3_TX,
+       HPBDMA_SLAVE_HPBIF3_RX,
+       HPBDMA_SLAVE_HPBIF4_TX,
+       HPBDMA_SLAVE_HPBIF4_RX,
+       HPBDMA_SLAVE_HPBIF5_TX,
+       HPBDMA_SLAVE_HPBIF5_RX,
+       HPBDMA_SLAVE_HPBIF6_TX,
+       HPBDMA_SLAVE_HPBIF6_RX,
+       HPBDMA_SLAVE_HPBIF7_TX,
+       HPBDMA_SLAVE_HPBIF7_RX,
+       HPBDMA_SLAVE_HPBIF8_TX,
+       HPBDMA_SLAVE_HPBIF8_RX,
+       HPBDMA_SLAVE_USBFUNC_TX,
+       HPBDMA_SLAVE_USBFUNC_RX,
+};
+
+extern void r8a7778_add_standard_devices(void);
+extern void r8a7778_add_standard_devices_dt(void);
+extern void r8a7778_add_dt_devices(void);
+
+extern void r8a7778_init_late(void);
+extern void r8a7778_init_delay(void);
+extern void r8a7778_init_irq_dt(void);
+extern void r8a7778_clock_init(void);
+extern void r8a7778_init_irq_extpin(int irlm);
+extern void r8a7778_init_irq_extpin_dt(int irlm);
+extern void r8a7778_pinmux_init(void);
+
+extern int r8a7778_usb_phy_power(bool enable);
+
+#endif /* __ASM_R8A7778_H__ */
diff --git a/arch/arm/mach-shmobile/r8a7779.h b/arch/arm/mach-shmobile/r8a7779.h
new file mode 100644 (file)
index 0000000..5415c71
--- /dev/null
@@ -0,0 +1,36 @@
+#ifndef __ASM_R8A7779_H__
+#define __ASM_R8A7779_H__
+
+#include <linux/sh_clk.h>
+
+/* HPB-DMA slave IDs */
+enum {
+       HPBDMA_SLAVE_DUMMY,
+       HPBDMA_SLAVE_SDHI0_TX,
+       HPBDMA_SLAVE_SDHI0_RX,
+};
+
+extern void r8a7779_init_irq_extpin(int irlm);
+extern void r8a7779_init_irq_extpin_dt(int irlm);
+extern void r8a7779_init_irq_dt(void);
+extern void r8a7779_map_io(void);
+extern void r8a7779_earlytimer_init(void);
+extern void r8a7779_add_early_devices(void);
+extern void r8a7779_add_standard_devices(void);
+extern void r8a7779_add_standard_devices_dt(void);
+extern void r8a7779_init_late(void);
+extern u32 r8a7779_read_mode_pins(void);
+extern void r8a7779_clock_init(void);
+extern void r8a7779_pinmux_init(void);
+extern void r8a7779_pm_init(void);
+extern void r8a7779_register_twd(void);
+
+#ifdef CONFIG_PM
+extern void __init r8a7779_init_pm_domains(void);
+#else
+static inline void r8a7779_init_pm_domains(void) {}
+#endif /* CONFIG_PM */
+
+extern struct smp_operations r8a7779_smp_ops;
+
+#endif /* __ASM_R8A7779_H__ */
diff --git a/arch/arm/mach-shmobile/r8a7790.h b/arch/arm/mach-shmobile/r8a7790.h
new file mode 100644 (file)
index 0000000..459827f
--- /dev/null
@@ -0,0 +1,36 @@
+#ifndef __ASM_R8A7790_H__
+#define __ASM_R8A7790_H__
+
+/* DMA slave IDs */
+enum {
+       RCAR_DMA_SLAVE_INVALID,
+       AUDIO_DMAC_SLAVE_SSI0_TX,
+       AUDIO_DMAC_SLAVE_SSI0_RX,
+       AUDIO_DMAC_SLAVE_SSI1_TX,
+       AUDIO_DMAC_SLAVE_SSI1_RX,
+       AUDIO_DMAC_SLAVE_SSI2_TX,
+       AUDIO_DMAC_SLAVE_SSI2_RX,
+       AUDIO_DMAC_SLAVE_SSI3_TX,
+       AUDIO_DMAC_SLAVE_SSI3_RX,
+       AUDIO_DMAC_SLAVE_SSI4_TX,
+       AUDIO_DMAC_SLAVE_SSI4_RX,
+       AUDIO_DMAC_SLAVE_SSI5_TX,
+       AUDIO_DMAC_SLAVE_SSI5_RX,
+       AUDIO_DMAC_SLAVE_SSI6_TX,
+       AUDIO_DMAC_SLAVE_SSI6_RX,
+       AUDIO_DMAC_SLAVE_SSI7_TX,
+       AUDIO_DMAC_SLAVE_SSI7_RX,
+       AUDIO_DMAC_SLAVE_SSI8_TX,
+       AUDIO_DMAC_SLAVE_SSI8_RX,
+       AUDIO_DMAC_SLAVE_SSI9_TX,
+       AUDIO_DMAC_SLAVE_SSI9_RX,
+};
+
+void r8a7790_add_standard_devices(void);
+void r8a7790_add_dt_devices(void);
+void r8a7790_clock_init(void);
+void r8a7790_pinmux_init(void);
+void r8a7790_pm_init(void);
+extern struct smp_operations r8a7790_smp_ops;
+
+#endif /* __ASM_R8A7790_H__ */
diff --git a/arch/arm/mach-shmobile/r8a7791.h b/arch/arm/mach-shmobile/r8a7791.h
new file mode 100644 (file)
index 0000000..86eae7b
--- /dev/null
@@ -0,0 +1,11 @@
+#ifndef __ASM_R8A7791_H__
+#define __ASM_R8A7791_H__
+
+void r8a7791_add_standard_devices(void);
+void r8a7791_add_dt_devices(void);
+void r8a7791_clock_init(void);
+void r8a7791_pinmux_init(void);
+void r8a7791_pm_init(void);
+extern struct smp_operations r8a7791_smp_ops;
+
+#endif /* __ASM_R8A7791_H__ */
diff --git a/arch/arm/mach-shmobile/rcar-gen2.h b/arch/arm/mach-shmobile/rcar-gen2.h
new file mode 100644 (file)
index 0000000..ce53cb5
--- /dev/null
@@ -0,0 +1,9 @@
+#ifndef __ASM_RCAR_GEN2_H__
+#define __ASM_RCAR_GEN2_H__
+
+void rcar_gen2_timer_init(void);
+#define MD(nr) BIT(nr)
+u32 rcar_gen2_read_mode_pins(void);
+void rcar_gen2_reserve(void);
+
+#endif /* __ASM_RCAR_GEN2_H__ */
index d953ff6e78a29d884754548f9ea6af974ae74b20..b06a9e8f59a5fb7a232f00a747e1715bc23b5a71 100644 (file)
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  */
-#include <linux/clk-provider.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
-#include <linux/of_platform.h>
-#include <mach/common.h>
+#include <linux/mm.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
+#include "common.h"
 
 static struct map_desc emev2_io_desc[] __initdata = {
 #ifdef CONFIG_SMP
@@ -42,17 +41,6 @@ static void __init emev2_map_io(void)
        iotable_init(emev2_io_desc, ARRAY_SIZE(emev2_io_desc));
 }
 
-static void __init emev2_init_delay(void)
-{
-       shmobile_setup_delay(533, 1, 3); /* Cortex-A9 @ 533MHz */
-}
-
-static void __init emev2_add_standard_devices_dt(void)
-{
-       of_clk_init(NULL);
-       of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
-}
-
 static const char *emev2_boards_compat_dt[] __initconst = {
        "renesas,emev2",
        NULL,
@@ -63,8 +51,7 @@ extern struct smp_operations emev2_smp_ops;
 DT_MACHINE_START(EMEV2_DT, "Generic Emma Mobile EV2 (Flattened Device Tree)")
        .smp            = smp_ops(emev2_smp_ops),
        .map_io         = emev2_map_io,
-       .init_early     = emev2_init_delay,
-       .init_machine   = emev2_add_standard_devices_dt,
+       .init_early     = shmobile_init_delay,
        .init_late      = shmobile_init_late,
        .dt_compat      = emev2_boards_compat_dt,
 MACHINE_END
index 3885a598c66b45293159467c974f70ae70f74ae7..f3b3b14ba9726ffe7a0a45cc4c0c6208a318878a 100644 (file)
 #include <linux/kernel.h>
 #include <linux/of_platform.h>
 #include <linux/sh_timer.h>
-#include <mach/common.h>
-#include <mach/irqs.h>
-#include <mach/r7s72100.h>
+
 #include <asm/mach/arch.h>
 
+#include "common.h"
+#include "irqs.h"
+#include "r7s72100.h"
+
 static struct resource mtu2_resources[] __initdata = {
        DEFINE_RES_MEM(0xfcff0000, 0x400),
        DEFINE_RES_IRQ_NAMED(gic_iid(139), "tgi0a"),
@@ -43,11 +45,6 @@ void __init r7s72100_add_dt_devices(void)
        r7s72100_register_mtu2();
 }
 
-void __init r7s72100_init_early(void)
-{
-       shmobile_setup_delay(400, 1, 3); /* Cortex-A9 @ 400MHz */
-}
-
 #ifdef CONFIG_USE_OF
 static const char *r7s72100_boards_compat_dt[] __initdata = {
        "renesas,r7s72100",
@@ -55,7 +52,7 @@ static const char *r7s72100_boards_compat_dt[] __initdata = {
 };
 
 DT_MACHINE_START(R7S72100_DT, "Generic R7S72100 (Flattened Device Tree)")
-       .init_early     = r7s72100_init_early,
+       .init_early     = shmobile_init_delay,
        .dt_compat      = r7s72100_boards_compat_dt,
 MACHINE_END
 #endif /* CONFIG_USE_OF */
index aaaaf6e8b70691b54f8d06ba5d0b1e7a79b5d315..6683072a9d982777e0ae2b439e57dfdd177d8671 100644 (file)
 #include <linux/serial_sci.h>
 #include <linux/sh_dma.h>
 #include <linux/sh_timer.h>
-#include <mach/common.h>
-#include <mach/dma-register.h>
-#include <mach/irqs.h>
-#include <mach/r8a73a4.h>
+
 #include <asm/mach/arch.h>
 
+#include "common.h"
+#include "dma-register.h"
+#include "irqs.h"
+#include "r8a73a4.h"
+
 static const struct resource pfc_resources[] = {
        DEFINE_RES_MEM(0xe6050000, 0x9000),
 };
@@ -187,12 +189,6 @@ static struct resource cmt1_resources[] = {
 
 void __init r8a73a4_add_dt_devices(void)
 {
-       r8a73a4_register_scif(0);
-       r8a73a4_register_scif(1);
-       r8a73a4_register_scif(2);
-       r8a73a4_register_scif(3);
-       r8a73a4_register_scif(4);
-       r8a73a4_register_scif(5);
        r8a7790_register_cmt(1);
 }
 
@@ -287,6 +283,12 @@ static struct resource dma_resources[] = {
 void __init r8a73a4_add_standard_devices(void)
 {
        r8a73a4_add_dt_devices();
+       r8a73a4_register_scif(0);
+       r8a73a4_register_scif(1);
+       r8a73a4_register_scif(2);
+       r8a73a4_register_scif(3);
+       r8a73a4_register_scif(4);
+       r8a73a4_register_scif(5);
        r8a73a4_register_irqc(0);
        r8a73a4_register_irqc(1);
        r8a73a4_register_thermal();
index 35dec233301e9711e7a612e537c8a85aa260307c..3d5eacaba3e6109db5e033ed362af7f987ec40de 100644 (file)
 #include <linux/sh_dma.h>
 #include <linux/sh_timer.h>
 #include <linux/platform_data/sh_ipmmu.h>
-#include <mach/dma-register.h>
-#include <mach/r8a7740.h>
-#include <mach/pm-rmobile.h>
-#include <mach/common.h>
-#include <mach/irqs.h>
+
 #include <asm/mach-types.h>
 #include <asm/mach/map.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/time.h>
 
+#include "common.h"
+#include "dma-register.h"
+#include "irqs.h"
+#include "pm-rmobile.h"
+#include "r8a7740.h"
+
 static struct map_desc r8a7740_io_desc[] __initdata = {
         /*
          * for CPGA/INTC/PFC
@@ -310,6 +312,10 @@ static struct platform_device ipmmu_device = {
 };
 
 static struct platform_device *r8a7740_devices_dt[] __initdata = {
+       &cmt1_device,
+};
+
+static struct platform_device *r8a7740_early_devices[] __initdata = {
        &scif0_device,
        &scif1_device,
        &scif2_device,
@@ -319,10 +325,6 @@ static struct platform_device *r8a7740_devices_dt[] __initdata = {
        &scif6_device,
        &scif7_device,
        &scif8_device,
-       &cmt1_device,
-};
-
-static struct platform_device *r8a7740_early_devices[] __initdata = {
        &irqpin0_device,
        &irqpin1_device,
        &irqpin2_device,
index 5de7b33295d4c5364546b65964f677c29dfecb6b..f00a488dcf4385345331ff54efd332dce29354cf 100644 (file)
 #include <linux/usb/ehci_pdriver.h>
 #include <linux/usb/ohci_pdriver.h>
 #include <linux/dma-mapping.h>
-#include <mach/irqs.h>
-#include <mach/r8a7778.h>
-#include <mach/common.h>
+
 #include <asm/mach/arch.h>
 #include <asm/hardware/cache-l2x0.h>
 
+#include "common.h"
+#include "irqs.h"
+#include "r8a7778.h"
+
 /* SCIF */
 #define R8A7778_SCIF(index, baseaddr, irq)                     \
 static struct plat_sci_port scif##index##_platform_data = {    \
@@ -291,12 +293,6 @@ void __init r8a7778_add_dt_devices(void)
        }
 #endif
 
-       r8a7778_register_scif(0);
-       r8a7778_register_scif(1);
-       r8a7778_register_scif(2);
-       r8a7778_register_scif(3);
-       r8a7778_register_scif(4);
-       r8a7778_register_scif(5);
        r8a7778_register_tmu(0);
 }
 
@@ -505,6 +501,12 @@ static void __init r8a7778_register_hpb_dmae(void)
 void __init r8a7778_add_standard_devices(void)
 {
        r8a7778_add_dt_devices();
+       r8a7778_register_scif(0);
+       r8a7778_register_scif(1);
+       r8a7778_register_scif(2);
+       r8a7778_register_scif(3);
+       r8a7778_register_scif(4);
+       r8a7778_register_scif(5);
        r8a7778_register_i2c(0);
        r8a7778_register_i2c(1);
        r8a7778_register_i2c(2);
index 9c79182d056819d6057cd5f9f6d06284e4fab220..236c1befb9e3740a91842b834e96eb0dcee9fcd7 100644 (file)
 #include <linux/usb/ehci_pdriver.h>
 #include <linux/usb/ohci_pdriver.h>
 #include <linux/pm_runtime.h>
-#include <mach/irqs.h>
-#include <mach/r8a7779.h>
-#include <mach/common.h>
+
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/time.h>
 #include <asm/mach/map.h>
 #include <asm/hardware/cache-l2x0.h>
 
+#include "common.h"
+#include "irqs.h"
+#include "r8a7779.h"
+
 static struct map_desc r8a7779_io_desc[] __initdata = {
        /* 2M entity map for 0xf0000000 (MPCORE) */
        {
@@ -640,16 +642,16 @@ static void __init r8a7779_register_hpb_dmae(void)
 }
 
 static struct platform_device *r8a7779_devices_dt[] __initdata = {
+       &tmu0_device,
+};
+
+static struct platform_device *r8a7779_standard_devices[] __initdata = {
        &scif0_device,
        &scif1_device,
        &scif2_device,
        &scif3_device,
        &scif4_device,
        &scif5_device,
-       &tmu0_device,
-};
-
-static struct platform_device *r8a7779_standard_devices[] __initdata = {
        &i2c0_device,
        &i2c1_device,
        &i2c2_device,
@@ -674,16 +676,6 @@ void __init r8a7779_add_standard_devices(void)
        r8a7779_register_hpb_dmae();
 }
 
-/* do nothing for !CONFIG_SMP or !CONFIG_HAVE_TWD */
-void __init __weak r8a7779_register_twd(void) { }
-
-void __init r8a7779_earlytimer_init(void)
-{
-       r8a7779_clock_init();
-       r8a7779_register_twd();
-       shmobile_earlytimer_init();
-}
-
 void __init r8a7779_add_early_devices(void)
 {
        early_platform_add_devices(r8a7779_devices_dt,
@@ -747,19 +739,28 @@ void __init r8a7779_init_irq_dt(void)
        __raw_writel(0x003fee3f, INT2SMSKCR4);
 }
 
-void __init r8a7779_init_delay(void)
+void __init r8a7779_add_standard_devices_dt(void)
 {
-       shmobile_setup_delay(1000, 2, 4); /* Cortex-A9 @ 1000MHz */
+       platform_add_devices(r8a7779_devices_dt,
+                            ARRAY_SIZE(r8a7779_devices_dt));
 }
 
-void __init r8a7779_add_standard_devices_dt(void)
+#define MODEMR         0xffcc0020
+
+u32 __init r8a7779_read_mode_pins(void)
 {
-       /* clocks are setup late during boot in the case of DT */
-       r8a7779_clock_init();
+       static u32 mode;
+       static bool mode_valid;
+
+       if (!mode_valid) {
+               void __iomem *modemr = ioremap_nocache(MODEMR, PAGE_SIZE);
+               BUG_ON(!modemr);
+               mode = ioread32(modemr);
+               iounmap(modemr);
+               mode_valid = true;
+       }
 
-       platform_add_devices(r8a7779_devices_dt,
-                            ARRAY_SIZE(r8a7779_devices_dt));
-       of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
+       return mode;
 }
 
 static const char *r8a7779_compat_dt[] __initdata = {
@@ -769,7 +770,7 @@ static const char *r8a7779_compat_dt[] __initdata = {
 
 DT_MACHINE_START(R8A7779_DT, "Generic R8A7779 (Flattened Device Tree)")
        .map_io         = r8a7779_map_io,
-       .init_early     = r8a7779_init_delay,
+       .init_early     = shmobile_init_delay,
        .nr_irqs        = NR_IRQS_LEGACY,
        .init_irq       = r8a7779_init_irq_dt,
        .init_machine   = r8a7779_add_standard_devices_dt,
index 10e6768968f7833cbb9904345e79aa51af5fcee8..0c12b01bb9e33c387c959b2f61cb371360d6470c 100644 (file)
 #include <linux/serial_sci.h>
 #include <linux/sh_dma.h>
 #include <linux/sh_timer.h>
-#include <mach/common.h>
-#include <mach/dma-register.h>
-#include <mach/irqs.h>
-#include <mach/r8a7790.h>
+
 #include <asm/mach/arch.h>
 
+#include "common.h"
+#include "dma-register.h"
+#include "irqs.h"
+#include "r8a7790.h"
+#include "rcar-gen2.h"
+
 /* Audio-DMAC */
 #define AUDIO_DMAC_SLAVE(_id, _addr, t, r)                     \
 {                                                              \
@@ -307,13 +310,6 @@ void __init r8a7790_add_standard_devices(void)
        r8a7790_register_audio_dmac(1);
 }
 
-void __init r8a7790_init_early(void)
-{
-#ifndef CONFIG_ARM_ARCH_TIMER
-       shmobile_setup_delay(1300, 2, 4); /* Cortex-A15 @ 1300MHz */
-#endif
-}
-
 #ifdef CONFIG_USE_OF
 
 static const char * const r8a7790_boards_compat_dt[] __initconst = {
@@ -323,8 +319,10 @@ static const char * const r8a7790_boards_compat_dt[] __initconst = {
 
 DT_MACHINE_START(R8A7790_DT, "Generic R8A7790 (Flattened Device Tree)")
        .smp            = smp_ops(r8a7790_smp_ops),
-       .init_early     = r8a7790_init_early,
+       .init_early     = shmobile_init_delay,
        .init_time      = rcar_gen2_timer_init,
+       .init_late      = shmobile_init_late,
+       .reserve        = rcar_gen2_reserve,
        .dt_compat      = r8a7790_boards_compat_dt,
 MACHINE_END
 #endif /* CONFIG_USE_OF */
index fd5443715b8d13bc47faaa6984362c3b6325c9ff..d47d8b16a43f6606ae07dc0291582539ba805fe9 100644 (file)
 #include <linux/platform_data/irq-renesas-irqc.h>
 #include <linux/serial_sci.h>
 #include <linux/sh_timer.h>
-#include <mach/common.h>
-#include <mach/irqs.h>
-#include <mach/r8a7791.h>
-#include <mach/rcar-gen2.h>
+
 #include <asm/mach/arch.h>
 
+#include "common.h"
+#include "irqs.h"
+#include "r8a7791.h"
+#include "rcar-gen2.h"
+
 static const struct resource pfc_resources[] __initconst = {
        DEFINE_RES_MEM(0xe6060000, 0x250),
 };
@@ -217,6 +219,8 @@ DT_MACHINE_START(R8A7791_DT, "Generic R8A7791 (Flattened Device Tree)")
        .smp            = smp_ops(r8a7791_smp_ops),
        .init_early     = shmobile_init_delay,
        .init_time      = rcar_gen2_timer_init,
+       .init_late      = shmobile_init_late,
+       .reserve        = rcar_gen2_reserve,
        .dt_compat      = r8a7791_boards_compat_dt,
 MACHINE_END
 #endif /* CONFIG_USE_OF */
index 542c5a47173f9e8a9794a07d39b765704b9c0d75..42d5b43089235375e1a1d75b440a32d8940ac1ed 100644 (file)
 
 #include <linux/clk/shmobile.h>
 #include <linux/clocksource.h>
+#include <linux/device.h>
+#include <linux/dma-contiguous.h>
 #include <linux/io.h>
 #include <linux/kernel.h>
-#include <mach/common.h>
-#include <mach/rcar-gen2.h>
+#include <linux/of_fdt.h>
 #include <asm/mach/arch.h>
+#include "common.h"
+#include "rcar-gen2.h"
 
 #define MODEMR 0xe6160060
 
@@ -110,3 +113,72 @@ void __init rcar_gen2_timer_init(void)
 #endif
        clocksource_of_init();
 }
+
+struct memory_reserve_config {
+       u64 reserved;
+       u64 base, size;
+};
+
+static int __init rcar_gen2_scan_mem(unsigned long node, const char *uname,
+                                    int depth, void *data)
+{
+       const char *type = of_get_flat_dt_prop(node, "device_type", NULL);
+       const __be32 *reg, *endp;
+       int l;
+       struct memory_reserve_config *mrc = data;
+       u64 lpae_start = 1ULL << 32;
+
+       /* We are scanning "memory" nodes only */
+       if (type == NULL || strcmp(type, "memory"))
+               return 0;
+
+       reg = of_get_flat_dt_prop(node, "linux,usable-memory", &l);
+       if (reg == NULL)
+               reg = of_get_flat_dt_prop(node, "reg", &l);
+       if (reg == NULL)
+               return 0;
+
+       endp = reg + (l / sizeof(__be32));
+       while ((endp - reg) >= (dt_root_addr_cells + dt_root_size_cells)) {
+               u64 base, size;
+
+               base = dt_mem_next_cell(dt_root_addr_cells, &reg);
+               size = dt_mem_next_cell(dt_root_size_cells, &reg);
+
+               if (base >= lpae_start)
+                       continue;
+
+               if ((base + size) >= lpae_start)
+                       size = lpae_start - base;
+
+               if (size < mrc->reserved)
+                       continue;
+
+               if (base < mrc->base)
+                       continue;
+
+               /* keep the area at top near the 32-bit legacy limit */
+               mrc->base = base + size - mrc->reserved;
+               mrc->size = mrc->reserved;
+       }
+
+       return 0;
+}
+
+struct cma *rcar_gen2_dma_contiguous;
+
+void __init rcar_gen2_reserve(void)
+{
+       struct memory_reserve_config mrc;
+
+       /* reserve 256 MiB at the top of the physical legacy 32-bit space */
+       memset(&mrc, 0, sizeof(mrc));
+       mrc.reserved = SZ_256M;
+
+       of_scan_flat_dt(rcar_gen2_scan_mem, &mrc);
+#ifdef CONFIG_DMA_CMA
+       if (mrc.size)
+               dma_contiguous_reserve_area(mrc.size, mrc.base, 0,
+                                           &rcar_gen2_dma_contiguous, true);
+#endif
+}
index 2a8b9f2a2f549e1737aa8040e9ce5e4e90ac7b80..9cdfcdfd38fc4b6625a96f1515e7ce0e9834f988 100644 (file)
 #include <linux/io.h>
 #include <linux/serial_sci.h>
 #include <linux/sh_dma.h>
-#include <linux/sh_intc.h>
 #include <linux/sh_timer.h>
 #include <linux/pm_domain.h>
 #include <linux/dma-mapping.h>
 #include <linux/platform_data/sh_ipmmu.h>
-#include <mach/dma-register.h>
-#include <mach/irqs.h>
-#include <mach/sh7372.h>
-#include <mach/common.h>
+
 #include <asm/mach/map.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/time.h>
 
+#include "common.h"
+#include "dma-register.h"
+#include "irqs.h"
+#include "pm-rmobile.h"
+#include "sh7372.h"
+
 static struct map_desc sh7372_io_desc[] __initdata = {
        /* create a 1:1 entity map for 0xe6xxxxxx
         * used by CPGA, INTC and PFC.
index ad00724a2269ffd5ce8daa68c5a829a5473bf7b1..2c802ae9b241332f11d120b2dd188e6c21fc1e92 100644 (file)
 #include <linux/io.h>
 #include <linux/serial_sci.h>
 #include <linux/sh_dma.h>
-#include <linux/sh_intc.h>
 #include <linux/sh_timer.h>
 #include <linux/platform_data/sh_ipmmu.h>
 #include <linux/platform_data/irq-renesas-intc-irqpin.h>
-#include <mach/dma-register.h>
-#include <mach/irqs.h>
-#include <mach/sh73a0.h>
-#include <mach/common.h>
+
 #include <asm/mach-types.h>
 #include <asm/mach/map.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/time.h>
 
+#include "common.h"
+#include "dma-register.h"
+#include "irqs.h"
+#include "sh73a0.h"
+
 static struct map_desc sh73a0_io_desc[] __initdata = {
        /* create a 1:1 entity map for 0xe6xxxxxx
         * used by CPGA, INTC and PFC.
@@ -696,6 +697,10 @@ static struct platform_device irqpin3_device = {
 };
 
 static struct platform_device *sh73a0_devices_dt[] __initdata = {
+       &cmt1_device,
+};
+
+static struct platform_device *sh73a0_early_devices[] __initdata = {
        &scif0_device,
        &scif1_device,
        &scif2_device,
@@ -705,10 +710,6 @@ static struct platform_device *sh73a0_devices_dt[] __initdata = {
        &scif6_device,
        &scif7_device,
        &scif8_device,
-       &cmt1_device,
-};
-
-static struct platform_device *sh73a0_early_devices[] __initdata = {
        &tmu0_device,
        &ipmmu_device,
 };
diff --git a/arch/arm/mach-shmobile/sh7372.h b/arch/arm/mach-shmobile/sh7372.h
new file mode 100644 (file)
index 0000000..4ad960d
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2010 Renesas Solutions Corp.
+ *
+ * Kuninori Morimoto <morimoto.kuninori@renesas.com>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ */
+
+#ifndef __ASM_SH7372_H__
+#define __ASM_SH7372_H__
+
+/* DMA slave IDs */
+enum {
+       SHDMA_SLAVE_INVALID,
+       SHDMA_SLAVE_SCIF0_TX,
+       SHDMA_SLAVE_SCIF0_RX,
+       SHDMA_SLAVE_SCIF1_TX,
+       SHDMA_SLAVE_SCIF1_RX,
+       SHDMA_SLAVE_SCIF2_TX,
+       SHDMA_SLAVE_SCIF2_RX,
+       SHDMA_SLAVE_SCIF3_TX,
+       SHDMA_SLAVE_SCIF3_RX,
+       SHDMA_SLAVE_SCIF4_TX,
+       SHDMA_SLAVE_SCIF4_RX,
+       SHDMA_SLAVE_SCIF5_TX,
+       SHDMA_SLAVE_SCIF5_RX,
+       SHDMA_SLAVE_SCIF6_TX,
+       SHDMA_SLAVE_SCIF6_RX,
+       SHDMA_SLAVE_FLCTL0_TX,
+       SHDMA_SLAVE_FLCTL0_RX,
+       SHDMA_SLAVE_FLCTL1_TX,
+       SHDMA_SLAVE_FLCTL1_RX,
+       SHDMA_SLAVE_SDHI0_RX,
+       SHDMA_SLAVE_SDHI0_TX,
+       SHDMA_SLAVE_SDHI1_RX,
+       SHDMA_SLAVE_SDHI1_TX,
+       SHDMA_SLAVE_SDHI2_RX,
+       SHDMA_SLAVE_SDHI2_TX,
+       SHDMA_SLAVE_FSIA_RX,
+       SHDMA_SLAVE_FSIA_TX,
+       SHDMA_SLAVE_MMCIF_RX,
+       SHDMA_SLAVE_MMCIF_TX,
+       SHDMA_SLAVE_USB0_TX,
+       SHDMA_SLAVE_USB0_RX,
+       SHDMA_SLAVE_USB1_TX,
+       SHDMA_SLAVE_USB1_RX,
+};
+
+extern struct clk sh7372_extal1_clk;
+extern struct clk sh7372_extal2_clk;
+extern struct clk sh7372_dv_clki_clk;
+extern struct clk sh7372_dv_clki_div2_clk;
+extern struct clk sh7372_pllc2_clk;
+
+extern void sh7372_init_irq(void);
+extern void sh7372_map_io(void);
+extern void sh7372_earlytimer_init(void);
+extern void sh7372_add_early_devices(void);
+extern void sh7372_add_standard_devices(void);
+extern void sh7372_add_early_devices_dt(void);
+extern void sh7372_add_standard_devices_dt(void);
+extern void sh7372_clock_init(void);
+extern void sh7372_pinmux_init(void);
+extern void sh7372_pm_init(void);
+extern void sh7372_resume_core_standby_sysc(void);
+extern int  sh7372_do_idle_sysc(unsigned long sleep_mode);
+extern void sh7372_intcs_suspend(void);
+extern void sh7372_intcs_resume(void);
+extern void sh7372_intca_suspend(void);
+extern void sh7372_intca_resume(void);
+
+extern unsigned long sh7372_cpu_resume;
+
+#ifdef CONFIG_PM
+extern void __init sh7372_init_pm_domains(void);
+#else
+static inline void sh7372_init_pm_domains(void) {}
+#endif
+
+extern void __init sh7372_pm_init_late(void);
+
+#endif /* __ASM_SH7372_H__ */
diff --git a/arch/arm/mach-shmobile/sh73a0.h b/arch/arm/mach-shmobile/sh73a0.h
new file mode 100644 (file)
index 0000000..359b582
--- /dev/null
@@ -0,0 +1,91 @@
+#ifndef __ASM_SH73A0_H__
+#define __ASM_SH73A0_H__
+
+/* DMA slave IDs */
+enum {
+       SHDMA_SLAVE_INVALID,
+       SHDMA_SLAVE_SCIF0_TX,
+       SHDMA_SLAVE_SCIF0_RX,
+       SHDMA_SLAVE_SCIF1_TX,
+       SHDMA_SLAVE_SCIF1_RX,
+       SHDMA_SLAVE_SCIF2_TX,
+       SHDMA_SLAVE_SCIF2_RX,
+       SHDMA_SLAVE_SCIF3_TX,
+       SHDMA_SLAVE_SCIF3_RX,
+       SHDMA_SLAVE_SCIF4_TX,
+       SHDMA_SLAVE_SCIF4_RX,
+       SHDMA_SLAVE_SCIF5_TX,
+       SHDMA_SLAVE_SCIF5_RX,
+       SHDMA_SLAVE_SCIF6_TX,
+       SHDMA_SLAVE_SCIF6_RX,
+       SHDMA_SLAVE_SCIF7_TX,
+       SHDMA_SLAVE_SCIF7_RX,
+       SHDMA_SLAVE_SCIF8_TX,
+       SHDMA_SLAVE_SCIF8_RX,
+       SHDMA_SLAVE_SDHI0_TX,
+       SHDMA_SLAVE_SDHI0_RX,
+       SHDMA_SLAVE_SDHI1_TX,
+       SHDMA_SLAVE_SDHI1_RX,
+       SHDMA_SLAVE_SDHI2_TX,
+       SHDMA_SLAVE_SDHI2_RX,
+       SHDMA_SLAVE_MMCIF_TX,
+       SHDMA_SLAVE_MMCIF_RX,
+       SHDMA_SLAVE_FSI2A_TX,
+       SHDMA_SLAVE_FSI2A_RX,
+       SHDMA_SLAVE_FSI2B_TX,
+       SHDMA_SLAVE_FSI2B_RX,
+       SHDMA_SLAVE_FSI2C_TX,
+       SHDMA_SLAVE_FSI2C_RX,
+       SHDMA_SLAVE_FSI2D_RX,
+};
+
+/*
+ *             SH73A0 IRQ LOCATION TABLE
+ *
+ * 416 -----------------------------------------
+ *             IRQ0-IRQ15
+ * 431 -----------------------------------------
+ * ...
+ * 448 -----------------------------------------
+ *             sh73a0-intcs
+ *             sh73a0-intca-irq-pins
+ * 680 -----------------------------------------
+ * ...
+ * 700 -----------------------------------------
+ *             sh73a0-pint0
+ * 731 -----------------------------------------
+ * 732 -----------------------------------------
+ *             sh73a0-pint1
+ * 739 -----------------------------------------
+ * ...
+ * 800 -----------------------------------------
+ *             IRQ16-IRQ31
+ * 815 -----------------------------------------
+ * ...
+ * 928 -----------------------------------------
+ *             sh73a0-intca-irq-pins
+ * 943 -----------------------------------------
+ */
+
+/* PINT interrupts are located at Linux IRQ 700 and up */
+#define SH73A0_PINT0_IRQ(irq) ((irq) + 700)
+#define SH73A0_PINT1_IRQ(irq) ((irq) + 732)
+
+extern void sh73a0_init_delay(void);
+extern void sh73a0_init_irq(void);
+extern void sh73a0_init_irq_dt(void);
+extern void sh73a0_map_io(void);
+extern void sh73a0_earlytimer_init(void);
+extern void sh73a0_add_early_devices(void);
+extern void sh73a0_add_standard_devices(void);
+extern void sh73a0_add_standard_devices_dt(void);
+extern void sh73a0_clock_init(void);
+extern void sh73a0_pinmux_init(void);
+extern void sh73a0_pm_init(void);
+extern struct clk sh73a0_extal1_clk;
+extern struct clk sh73a0_extal2_clk;
+extern struct clk sh73a0_extcki_clk;
+extern struct clk sh73a0_extalr_clk;
+extern struct smp_operations sh73a0_smp_ops;
+
+#endif /* __ASM_SH73A0_H__ */
index 2dfd748da7f374156e13374251bcdd9fe4a65f31..6ff1df1df9a752c313514284a09a0e747e906c4c 100644 (file)
@@ -23,9 +23,9 @@
 #include <linux/spinlock.h>
 #include <linux/io.h>
 #include <linux/delay.h>
-#include <mach/common.h>
 #include <asm/smp_plat.h>
 #include <asm/smp_scu.h>
+#include "common.h"
 
 #define EMEV2_SCU_BASE 0x1e000000
 #define EMEV2_SMU_BASE 0xe0110000
index e7a3201473d0733579e57475886624343125727a..3100e355c3fde4e589aa015a50a68e7b1f57da85 100644 (file)
 #include <linux/spinlock.h>
 #include <linux/io.h>
 #include <linux/delay.h>
-#include <mach/common.h>
-#include <mach/pm-rcar.h>
-#include <mach/r8a7779.h>
+
 #include <asm/cacheflush.h>
 #include <asm/smp_plat.h>
 #include <asm/smp_scu.h>
 #include <asm/smp_twd.h>
 
+#include "common.h"
+#include "pm-rcar.h"
+#include "r8a7779.h"
+
 #define AVECR IOMEM(0xfe700040)
 #define R8A7779_SCU_BASE 0xf0000000
 
index 591052799e8f31fa3dcd7c73360a874a9db2b791..2311694636e123a984fe8f1480d2a9efb7c9a412 100644 (file)
 #include <linux/init.h>
 #include <linux/smp.h>
 #include <linux/io.h>
+
 #include <asm/smp_plat.h>
-#include <mach/common.h>
-#include <mach/pm-rcar.h>
-#include <mach/r8a7790.h>
 
-#define RST            0xe6160000
-#define CA15BAR                0x0020
-#define CA7BAR         0x0030
-#define CA15RESCNT     0x0040
-#define CA7RESCNT      0x0044
-#define MERAM          0xe8080000
+#include "common.h"
+#include "pm-rcar.h"
+#include "r8a7790.h"
 
 static struct rcar_sysc_ch r8a7790_ca15_scu = {
        .chan_offs = 0x180, /* PWRSR5 .. PWRER5 */
@@ -41,32 +36,9 @@ static struct rcar_sysc_ch r8a7790_ca7_scu = {
 
 static void __init r8a7790_smp_prepare_cpus(unsigned int max_cpus)
 {
-       void __iomem *p;
-       u32 bar;
-
        /* let APMU code install data related to shmobile_boot_vector */
        shmobile_smp_apmu_prepare_cpus(max_cpus);
 
-       /* MERAM for jump stub, because BAR requires 256KB aligned address */
-       p = ioremap_nocache(MERAM, shmobile_boot_size);
-       memcpy_toio(p, shmobile_boot_vector, shmobile_boot_size);
-       iounmap(p);
-
-       /* setup reset vectors */
-       p = ioremap_nocache(RST, 0x63);
-       bar = (MERAM >> 8) & 0xfffffc00;
-       writel_relaxed(bar, p + CA15BAR);
-       writel_relaxed(bar, p + CA7BAR);
-       writel_relaxed(bar | 0x10, p + CA15BAR);
-       writel_relaxed(bar | 0x10, p + CA7BAR);
-
-       /* enable clocks to all CPUs */
-       writel_relaxed((readl_relaxed(p + CA15RESCNT) & ~0x0f) | 0xa5a50000,
-                      p + CA15RESCNT);
-       writel_relaxed((readl_relaxed(p + CA7RESCNT) & ~0x0f) | 0x5a5a0000,
-                      p + CA7RESCNT);
-       iounmap(p);
-
        /* turn on power to SCU */
        r8a7790_pm_init();
        rcar_sysc_power_up(&r8a7790_ca15_scu);
index ec979529f30f5b00c3cc94030d67fb5b27efb9c8..f743386166fb72608e69049610f52c9b96a93103 100644 (file)
 #include <linux/init.h>
 #include <linux/smp.h>
 #include <linux/io.h>
+
 #include <asm/smp_plat.h>
-#include <mach/common.h>
-#include <mach/r8a7791.h>
-#include <mach/rcar-gen2.h>
 
-#define RST            0xe6160000
-#define CA15BAR                0x0020
-#define CA15RESCNT     0x0040
-#define RAM            0xe6300000
+#include "common.h"
+#include "r8a7791.h"
+#include "rcar-gen2.h"
 
 static void __init r8a7791_smp_prepare_cpus(unsigned int max_cpus)
 {
-       void __iomem *p;
-       u32 bar;
-
        /* let APMU code install data related to shmobile_boot_vector */
        shmobile_smp_apmu_prepare_cpus(max_cpus);
 
-       /* RAM for jump stub, because BAR requires 256KB aligned address */
-       p = ioremap_nocache(RAM, shmobile_boot_size);
-       memcpy_toio(p, shmobile_boot_vector, shmobile_boot_size);
-       iounmap(p);
-
-       /* setup reset vectors */
-       p = ioremap_nocache(RST, 0x63);
-       bar = (RAM >> 8) & 0xfffffc00;
-       writel_relaxed(bar, p + CA15BAR);
-       writel_relaxed(bar | 0x10, p + CA15BAR);
-
-       /* enable clocks to all CPUs */
-       writel_relaxed((readl_relaxed(p + CA15RESCNT) & ~0x0f) | 0xa5a50000,
-                      p + CA15RESCNT);
-       iounmap(p);
+       r8a7791_pm_init();
 }
 
 static int r8a7791_smp_boot_secondary(unsigned int cpu,
index 13ba36a6831fb2374ff62dcfc967cf426b98ae3c..22d8f87b23e9006b206a3c04fe9720a384926c81 100644 (file)
 #include <linux/smp.h>
 #include <linux/io.h>
 #include <linux/delay.h>
-#include <mach/common.h>
-#include <mach/sh73a0.h>
+
 #include <asm/smp_plat.h>
 #include <asm/smp_twd.h>
 
+#include "common.h"
+#include "sh73a0.h"
+
 #define WUPCR          IOMEM(0xe6151010)
 #define SRESCR         IOMEM(0xe6151018)
 #define PSTR           IOMEM(0xe6151040)
index 68bc0b82226d18f3af3448010d2e3cc653420972..942efdc82a620e72f93046c7c61ca0f0713d5e55 100644 (file)
@@ -59,29 +59,37 @@ void __init shmobile_setup_delay(unsigned int max_cpu_core_mhz,
 
 void __init shmobile_init_delay(void)
 {
-       struct device_node *np, *parent;
-       u32 max_freq, freq;
-
-       max_freq = 0;
-
-       parent = of_find_node_by_path("/cpus");
-       if (parent) {
-               for_each_child_of_node(parent, np) {
-                       if (!of_property_read_u32(np, "clock-frequency", &freq))
-                               max_freq = max(max_freq, freq);
-               }
-               of_node_put(parent);
-       }
+       struct device_node *np, *cpus;
+       bool is_a8_a9 = false;
+       bool is_a15 = false;
+       u32 max_freq = 0;
+
+       cpus = of_find_node_by_path("/cpus");
+       if (!cpus)
+               return;
+
+       for_each_child_of_node(cpus, np) {
+               u32 freq;
+
+               if (!of_property_read_u32(np, "clock-frequency", &freq))
+                       max_freq = max(max_freq, freq);
 
-       if (max_freq) {
-               if (of_find_compatible_node(NULL, NULL, "arm,cortex-a8"))
-                       shmobile_setup_delay_hz(max_freq, 1, 3);
-               else if (of_find_compatible_node(NULL, NULL, "arm,cortex-a9"))
-                       shmobile_setup_delay_hz(max_freq, 1, 3);
-               else if (of_find_compatible_node(NULL, NULL, "arm,cortex-a15"))
-                       if (!IS_ENABLED(CONFIG_ARM_ARCH_TIMER))
-                               shmobile_setup_delay_hz(max_freq, 2, 4);
+               if (of_device_is_compatible(np, "arm,cortex-a8") ||
+                   of_device_is_compatible(np, "arm,cortex-a9"))
+                       is_a8_a9 = true;
+               else if (of_device_is_compatible(np, "arm,cortex-a15"))
+                       is_a15 = true;
        }
+
+       of_node_put(cpus);
+
+       if (!max_freq)
+               return;
+
+       if (is_a8_a9)
+               shmobile_setup_delay_hz(max_freq, 1, 3);
+       else if (is_a15 && !IS_ENABLED(CONFIG_ARM_ARCH_TIMER))
+               shmobile_setup_delay_hz(max_freq, 2, 4);
 }
 
 static void __init shmobile_late_time_init(void)
index 90df2022276a75910b7563b3fa0b838fbe50398c..6fd4dc88160b2645ce78b67527776d4ba03c3720 100644 (file)
@@ -19,6 +19,8 @@ config ARCH_SPEAR13XX
        select HAVE_ARM_SCU if SMP
        select HAVE_ARM_TWD if SMP
        select PINCTRL
+       select MFD_SYSCON
+       select MIGHT_HAVE_PCI
        help
          Supports for ARM's SPEAR13XX family
 
@@ -27,12 +29,14 @@ if ARCH_SPEAR13XX
 config MACH_SPEAR1310
        bool "SPEAr1310 Machine support with Device Tree"
        select PINCTRL_SPEAR1310
+       select PHY_ST_SPEAR1310_MIPHY
        help
          Supports ST SPEAr1310 machine configured via the device-tree
 
 config MACH_SPEAR1340
        bool "SPEAr1340 Machine support with Device Tree"
        select PINCTRL_SPEAR1340
+       select PHY_ST_SPEAR1340_MIPHY
        help
          Supports ST SPEAr1340 machine configured via the device-tree
 
index 5cdc53d9b6533cc914471b2c09588e0d96210be5..f2d6a01765754b2bce876b41748eb8fe14f6f1bf 100644 (file)
 #ifdef CONFIG_ARCH_SPEAR13XX
 
 #define PERIP_GRP2_BASE                                UL(0xB3000000)
-#define VA_PERIP_GRP2_BASE                     IOMEM(0xFE000000)
+#define VA_PERIP_GRP2_BASE                     IOMEM(0xF9000000)
 #define MCIF_SDHCI_BASE                                UL(0xB3000000)
 #define SYSRAM0_BASE                           UL(0xB3800000)
-#define VA_SYSRAM0_BASE                                IOMEM(0xFE800000)
+#define VA_SYSRAM0_BASE                                IOMEM(0xF9800000)
 #define SYS_LOCATION                           (VA_SYSRAM0_BASE + 0x600)
 
 #define PERIP_GRP1_BASE                                UL(0xE0000000)
index 824b12a56a422dc8c6b941b16746027305b80a98..d9ce4d8000f092eb005b2624f87b467a69c996b4 100644 (file)
@@ -42,7 +42,7 @@ static const char * const spear1310_dt_board_compat[] = {
  * PHYSICAL            VIRTUAL
  * 0xD8000000          0xFA000000
  */
-struct map_desc spear1310_io_desc[] __initdata = {
+static struct map_desc spear1310_io_desc[] __initdata = {
        {
                .virtual        = VA_SPEAR1310_RAS_GRP1_BASE,
                .pfn            = __phys_to_pfn(SPEAR1310_RAS_GRP1_BASE),
index 7b6bff7154e11ee81f6f5be1e962df81665e888c..3f3c0f124bd384fb7f00860e404f8df77c6c6392 100644 (file)
 
 #define pr_fmt(fmt) "SPEAr1340: " fmt
 
-#include <linux/ahci_platform.h>
-#include <linux/amba/serial.h>
-#include <linux/delay.h>
 #include <linux/of_platform.h>
 #include <asm/mach/arch.h>
 #include "generic.h"
-#include <mach/spear.h>
-
-/* FIXME: Move SATA PHY code into a standalone driver */
-
-/* Base addresses */
-#define SPEAR1340_SATA_BASE                    UL(0xB1000000)
-
-/* Power Management Registers */
-#define SPEAR1340_PCM_CFG                      (VA_MISC_BASE + 0x100)
-#define SPEAR1340_PCM_WKUP_CFG                 (VA_MISC_BASE + 0x104)
-#define SPEAR1340_SWITCH_CTR                   (VA_MISC_BASE + 0x108)
-
-#define SPEAR1340_PERIP1_SW_RST                        (VA_MISC_BASE + 0x318)
-#define SPEAR1340_PERIP2_SW_RST                        (VA_MISC_BASE + 0x31C)
-#define SPEAR1340_PERIP3_SW_RST                        (VA_MISC_BASE + 0x320)
-
-/* PCIE - SATA configuration registers */
-#define SPEAR1340_PCIE_SATA_CFG                        (VA_MISC_BASE + 0x424)
-       /* PCIE CFG MASks */
-       #define SPEAR1340_PCIE_CFG_DEVICE_PRESENT       (1 << 11)
-       #define SPEAR1340_PCIE_CFG_POWERUP_RESET        (1 << 10)
-       #define SPEAR1340_PCIE_CFG_CORE_CLK_EN          (1 << 9)
-       #define SPEAR1340_PCIE_CFG_AUX_CLK_EN           (1 << 8)
-       #define SPEAR1340_SATA_CFG_TX_CLK_EN            (1 << 4)
-       #define SPEAR1340_SATA_CFG_RX_CLK_EN            (1 << 3)
-       #define SPEAR1340_SATA_CFG_POWERUP_RESET        (1 << 2)
-       #define SPEAR1340_SATA_CFG_PM_CLK_EN            (1 << 1)
-       #define SPEAR1340_PCIE_SATA_SEL_PCIE            (0)
-       #define SPEAR1340_PCIE_SATA_SEL_SATA            (1)
-       #define SPEAR1340_SATA_PCIE_CFG_MASK            0xF1F
-       #define SPEAR1340_PCIE_CFG_VAL  (SPEAR1340_PCIE_SATA_SEL_PCIE | \
-                       SPEAR1340_PCIE_CFG_AUX_CLK_EN | \
-                       SPEAR1340_PCIE_CFG_CORE_CLK_EN | \
-                       SPEAR1340_PCIE_CFG_POWERUP_RESET | \
-                       SPEAR1340_PCIE_CFG_DEVICE_PRESENT)
-       #define SPEAR1340_SATA_CFG_VAL  (SPEAR1340_PCIE_SATA_SEL_SATA | \
-                       SPEAR1340_SATA_CFG_PM_CLK_EN | \
-                       SPEAR1340_SATA_CFG_POWERUP_RESET | \
-                       SPEAR1340_SATA_CFG_RX_CLK_EN | \
-                       SPEAR1340_SATA_CFG_TX_CLK_EN)
-
-#define SPEAR1340_PCIE_MIPHY_CFG               (VA_MISC_BASE + 0x428)
-       #define SPEAR1340_MIPHY_OSC_BYPASS_EXT          (1 << 31)
-       #define SPEAR1340_MIPHY_CLK_REF_DIV2            (1 << 27)
-       #define SPEAR1340_MIPHY_CLK_REF_DIV4            (2 << 27)
-       #define SPEAR1340_MIPHY_CLK_REF_DIV8            (3 << 27)
-       #define SPEAR1340_MIPHY_PLL_RATIO_TOP(x)        (x << 0)
-       #define SPEAR1340_PCIE_SATA_MIPHY_CFG_SATA \
-                       (SPEAR1340_MIPHY_OSC_BYPASS_EXT | \
-                       SPEAR1340_MIPHY_CLK_REF_DIV2 | \
-                       SPEAR1340_MIPHY_PLL_RATIO_TOP(60))
-       #define SPEAR1340_PCIE_SATA_MIPHY_CFG_SATA_25M_CRYSTAL_CLK \
-                       (SPEAR1340_MIPHY_PLL_RATIO_TOP(120))
-       #define SPEAR1340_PCIE_SATA_MIPHY_CFG_PCIE \
-                       (SPEAR1340_MIPHY_OSC_BYPASS_EXT | \
-                       SPEAR1340_MIPHY_PLL_RATIO_TOP(25))
-
-/* SATA device registration */
-static int sata_miphy_init(struct device *dev, void __iomem *addr)
-{
-       writel(SPEAR1340_SATA_CFG_VAL, SPEAR1340_PCIE_SATA_CFG);
-       writel(SPEAR1340_PCIE_SATA_MIPHY_CFG_SATA_25M_CRYSTAL_CLK,
-                       SPEAR1340_PCIE_MIPHY_CFG);
-       /* Switch on sata power domain */
-       writel((readl(SPEAR1340_PCM_CFG) | (0x800)), SPEAR1340_PCM_CFG);
-       msleep(20);
-       /* Disable PCIE SATA Controller reset */
-       writel((readl(SPEAR1340_PERIP1_SW_RST) & (~0x1000)),
-                       SPEAR1340_PERIP1_SW_RST);
-       msleep(20);
-
-       return 0;
-}
-
-void sata_miphy_exit(struct device *dev)
-{
-       writel(0, SPEAR1340_PCIE_SATA_CFG);
-       writel(0, SPEAR1340_PCIE_MIPHY_CFG);
-
-       /* Enable PCIE SATA Controller reset */
-       writel((readl(SPEAR1340_PERIP1_SW_RST) | (0x1000)),
-                       SPEAR1340_PERIP1_SW_RST);
-       msleep(20);
-       /* Switch off sata power domain */
-       writel((readl(SPEAR1340_PCM_CFG) & (~0x800)), SPEAR1340_PCM_CFG);
-       msleep(20);
-}
-
-int sata_suspend(struct device *dev)
-{
-       if (dev->power.power_state.event == PM_EVENT_FREEZE)
-               return 0;
-
-       sata_miphy_exit(dev);
-
-       return 0;
-}
-
-int sata_resume(struct device *dev)
-{
-       if (dev->power.power_state.event == PM_EVENT_THAW)
-               return 0;
-
-       return sata_miphy_init(dev, NULL);
-}
-
-static struct ahci_platform_data sata_pdata = {
-       .init = sata_miphy_init,
-       .exit = sata_miphy_exit,
-       .suspend = sata_suspend,
-       .resume = sata_resume,
-};
-
-/* Add SPEAr1340 auxdata to pass platform data */
-static struct of_dev_auxdata spear1340_auxdata_lookup[] __initdata = {
-       OF_DEV_AUXDATA("snps,spear-ahci", SPEAR1340_SATA_BASE, NULL,
-                       &sata_pdata),
-       {}
-};
 
 static void __init spear1340_dt_init(void)
 {
-       of_platform_populate(NULL, of_default_bus_match_table,
-                       spear1340_auxdata_lookup, NULL);
+       of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
        platform_device_register_simple("spear-cpufreq", -1, NULL, 0);
 }
 
index c9897ea3898005b28eb2ca52d647c408186337a6..2e463a93468d2da133f4f311cd935946eb79e585 100644 (file)
@@ -52,12 +52,12 @@ void __init spear13xx_l2x0_init(void)
 /*
  * Following will create 16MB static virtual/physical mappings
  * PHYSICAL            VIRTUAL
- * 0xB3000000          0xFE000000
+ * 0xB3000000          0xF9000000
  * 0xE0000000          0xFD000000
  * 0xEC000000          0xFC000000
  * 0xED000000          0xFB000000
  */
-struct map_desc spear13xx_io_desc[] __initdata = {
+static struct map_desc spear13xx_io_desc[] __initdata = {
        {
                .virtual        = (unsigned long)VA_PERIP_GRP2_BASE,
                .pfn            = __phys_to_pfn(PERIP_GRP2_BASE),
index fa2c33ffac044e45ec0e2d88ecbb2f146cbbbc85..d4b624f8dfcb0dc1bcf2f9342983faa079d33b4a 100644 (file)
@@ -36,7 +36,7 @@ static void write_pen_release(int val)
 
 static DEFINE_SPINLOCK(boot_lock);
 
-void sti_secondary_init(unsigned int cpu)
+static void sti_secondary_init(unsigned int cpu)
 {
        trace_hardirqs_off();
 
@@ -53,7 +53,7 @@ void sti_secondary_init(unsigned int cpu)
        spin_unlock(&boot_lock);
 }
 
-int sti_boot_secondary(unsigned int cpu, struct task_struct *idle)
+static int sti_boot_secondary(unsigned int cpu, struct task_struct *idle)
 {
        unsigned long timeout;
 
@@ -97,7 +97,7 @@ int sti_boot_secondary(unsigned int cpu, struct task_struct *idle)
        return pen_release != -1 ? -ENOSYS : 0;
 }
 
-void __init sti_smp_prepare_cpus(unsigned int max_cpus)
+static void __init sti_smp_prepare_cpus(unsigned int max_cpus)
 {
        void __iomem *scu_base = NULL;
        struct device_node *np = of_find_compatible_node(
index 0fbd4f156bfa9035ff2eb5a9aa8056c72781e35a..1aaa1e15ef70193b93f8afa402980957ad83d3ad 100644 (file)
@@ -4,7 +4,6 @@ menuconfig ARCH_SUNXI
        select CLKSRC_MMIO
        select GENERIC_IRQ_CHIP
        select PINCTRL
-       select PINCTRL_SUNXI
        select SUN4I_TIMER
 
 if ARCH_SUNXI
@@ -35,4 +34,12 @@ config MACH_SUN7I
        select HAVE_ARM_ARCH_TIMER
        select SUN5I_HSTIMER
 
+config MACH_SUN8I
+       bool "Allwinner A23 (sun8i) SoCs support"
+       default ARCH_SUNXI
+       select ARCH_HAS_RESET_CONTROLLER
+       select ARM_GIC
+       select MFD_SUN6I_PRCM
+       select RESET_CONTROLLER
+
 endif
index b6085084e0ff6332de10d7b72ec5fa0c1c3668c0..42d4753683ce6857fb118d256f13c81f88e6063b 100644 (file)
@@ -130,3 +130,12 @@ DT_MACHINE_START(SUN7I_DT, "Allwinner sun7i (A20) Family")
        .dt_compat      = sun7i_board_dt_compat,
        .restart        = sun4i_restart,
 MACHINE_END
+
+static const char * const sun8i_board_dt_compat[] = {
+       "allwinner,sun8i-a23",
+       NULL,
+};
+
+DT_MACHINE_START(SUN8I_DT, "Allwinner sun8i (A23) Family")
+       .dt_compat      = sun8i_board_dt_compat,
+MACHINE_END
index 6fbfbb77dcd991f496da168542e4f703dd950203..e48a74458c258908ae7a6751ce005df21b1f624c 100644 (file)
@@ -2,24 +2,18 @@ asflags-y                             += -march=armv7-a
 
 obj-y                                   += io.o
 obj-y                                   += irq.o
-obj-y                                  += fuse.o
-obj-y                                  += pmc.o
 obj-y                                  += flowctrl.o
-obj-y                                  += powergate.o
-obj-y                                  += apbio.o
 obj-y                                  += pm.o
 obj-y                                  += reset.o
 obj-y                                  += reset-handler.o
 obj-y                                  += sleep.o
 obj-y                                  += tegra.o
 obj-$(CONFIG_CPU_IDLE)                 += cpuidle.o
-obj-$(CONFIG_ARCH_TEGRA_2x_SOC)                += tegra20_speedo.o
 obj-$(CONFIG_ARCH_TEGRA_2x_SOC)                += sleep-tegra20.o
 obj-$(CONFIG_ARCH_TEGRA_2x_SOC)                += pm-tegra20.o
 ifeq ($(CONFIG_CPU_IDLE),y)
 obj-$(CONFIG_ARCH_TEGRA_2x_SOC)                += cpuidle-tegra20.o
 endif
-obj-$(CONFIG_ARCH_TEGRA_3x_SOC)                += tegra30_speedo.o
 obj-$(CONFIG_ARCH_TEGRA_3x_SOC)                += sleep-tegra30.o
 obj-$(CONFIG_ARCH_TEGRA_3x_SOC)                += pm-tegra30.o
 ifeq ($(CONFIG_CPU_IDLE),y)
@@ -28,7 +22,6 @@ endif
 obj-$(CONFIG_SMP)                      += platsmp.o headsmp.o
 obj-$(CONFIG_HOTPLUG_CPU)               += hotplug.o
 
-obj-$(CONFIG_ARCH_TEGRA_114_SOC)       += tegra114_speedo.o
 obj-$(CONFIG_ARCH_TEGRA_114_SOC)       += sleep-tegra30.o
 obj-$(CONFIG_ARCH_TEGRA_114_SOC)       += pm-tegra30.o
 ifeq ($(CONFIG_CPU_IDLE),y)
diff --git a/arch/arm/mach-tegra/apbio.c b/arch/arm/mach-tegra/apbio.c
deleted file mode 100644 (file)
index bc47197..0000000
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Copyright (C) 2010 NVIDIA Corporation.
- * Copyright (C) 2010 Google, Inc.
- *
- * This software is licensed under the terms of the GNU General Public
- * License version 2, as published by the Free Software Foundation, and
- * may be copied, distributed, and modified under those terms.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- */
-
-#include <linux/kernel.h>
-#include <linux/io.h>
-#include <linux/of.h>
-#include <linux/dmaengine.h>
-#include <linux/dma-mapping.h>
-#include <linux/spinlock.h>
-#include <linux/completion.h>
-#include <linux/sched.h>
-#include <linux/mutex.h>
-
-#include "apbio.h"
-#include "iomap.h"
-
-#if defined(CONFIG_TEGRA20_APB_DMA)
-static DEFINE_MUTEX(tegra_apb_dma_lock);
-static u32 *tegra_apb_bb;
-static dma_addr_t tegra_apb_bb_phys;
-static DECLARE_COMPLETION(tegra_apb_wait);
-
-static u32 tegra_apb_readl_direct(unsigned long offset);
-static void tegra_apb_writel_direct(u32 value, unsigned long offset);
-
-static struct dma_chan *tegra_apb_dma_chan;
-static struct dma_slave_config dma_sconfig;
-
-static bool tegra_apb_dma_init(void)
-{
-       dma_cap_mask_t mask;
-
-       mutex_lock(&tegra_apb_dma_lock);
-
-       /* Check to see if we raced to setup */
-       if (tegra_apb_dma_chan)
-               goto skip_init;
-
-       dma_cap_zero(mask);
-       dma_cap_set(DMA_SLAVE, mask);
-       tegra_apb_dma_chan = dma_request_channel(mask, NULL, NULL);
-       if (!tegra_apb_dma_chan) {
-               /*
-                * This is common until the device is probed, so don't
-                * shout about it.
-                */
-               pr_debug("%s: can not allocate dma channel\n", __func__);
-               goto err_dma_alloc;
-       }
-
-       tegra_apb_bb = dma_alloc_coherent(NULL, sizeof(u32),
-               &tegra_apb_bb_phys, GFP_KERNEL);
-       if (!tegra_apb_bb) {
-               pr_err("%s: can not allocate bounce buffer\n", __func__);
-               goto err_buff_alloc;
-       }
-
-       dma_sconfig.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
-       dma_sconfig.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
-       dma_sconfig.src_maxburst = 1;
-       dma_sconfig.dst_maxburst = 1;
-
-skip_init:
-       mutex_unlock(&tegra_apb_dma_lock);
-       return true;
-
-err_buff_alloc:
-       dma_release_channel(tegra_apb_dma_chan);
-       tegra_apb_dma_chan = NULL;
-
-err_dma_alloc:
-       mutex_unlock(&tegra_apb_dma_lock);
-       return false;
-}
-
-static void apb_dma_complete(void *args)
-{
-       complete(&tegra_apb_wait);
-}
-
-static int do_dma_transfer(unsigned long apb_add,
-               enum dma_transfer_direction dir)
-{
-       struct dma_async_tx_descriptor *dma_desc;
-       int ret;
-
-       if (dir == DMA_DEV_TO_MEM)
-               dma_sconfig.src_addr = apb_add;
-       else
-               dma_sconfig.dst_addr = apb_add;
-
-       ret = dmaengine_slave_config(tegra_apb_dma_chan, &dma_sconfig);
-       if (ret)
-               return ret;
-
-       dma_desc = dmaengine_prep_slave_single(tegra_apb_dma_chan,
-                       tegra_apb_bb_phys, sizeof(u32), dir,
-                       DMA_PREP_INTERRUPT |  DMA_CTRL_ACK);
-       if (!dma_desc)
-               return -EINVAL;
-
-       dma_desc->callback = apb_dma_complete;
-       dma_desc->callback_param = NULL;
-
-       reinit_completion(&tegra_apb_wait);
-
-       dmaengine_submit(dma_desc);
-       dma_async_issue_pending(tegra_apb_dma_chan);
-       ret = wait_for_completion_timeout(&tegra_apb_wait,
-               msecs_to_jiffies(50));
-
-       if (WARN(ret == 0, "apb read dma timed out")) {
-               dmaengine_terminate_all(tegra_apb_dma_chan);
-               return -EFAULT;
-       }
-       return 0;
-}
-
-static u32 tegra_apb_readl_using_dma(unsigned long offset)
-{
-       int ret;
-
-       if (!tegra_apb_dma_chan && !tegra_apb_dma_init())
-               return tegra_apb_readl_direct(offset);
-
-       mutex_lock(&tegra_apb_dma_lock);
-       ret = do_dma_transfer(offset, DMA_DEV_TO_MEM);
-       if (ret < 0) {
-               pr_err("error in reading offset 0x%08lx using dma\n", offset);
-               *(u32 *)tegra_apb_bb = 0;
-       }
-       mutex_unlock(&tegra_apb_dma_lock);
-       return *((u32 *)tegra_apb_bb);
-}
-
-static void tegra_apb_writel_using_dma(u32 value, unsigned long offset)
-{
-       int ret;
-
-       if (!tegra_apb_dma_chan && !tegra_apb_dma_init()) {
-               tegra_apb_writel_direct(value, offset);
-               return;
-       }
-
-       mutex_lock(&tegra_apb_dma_lock);
-       *((u32 *)tegra_apb_bb) = value;
-       ret = do_dma_transfer(offset, DMA_MEM_TO_DEV);
-       if (ret < 0)
-               pr_err("error in writing offset 0x%08lx using dma\n", offset);
-       mutex_unlock(&tegra_apb_dma_lock);
-}
-#else
-#define tegra_apb_readl_using_dma tegra_apb_readl_direct
-#define tegra_apb_writel_using_dma tegra_apb_writel_direct
-#endif
-
-typedef u32 (*apbio_read_fptr)(unsigned long offset);
-typedef void (*apbio_write_fptr)(u32 value, unsigned long offset);
-
-static apbio_read_fptr apbio_read;
-static apbio_write_fptr apbio_write;
-
-static u32 tegra_apb_readl_direct(unsigned long offset)
-{
-       return readl(IO_ADDRESS(offset));
-}
-
-static void tegra_apb_writel_direct(u32 value, unsigned long offset)
-{
-       writel(value, IO_ADDRESS(offset));
-}
-
-void tegra_apb_io_init(void)
-{
-       /* Need to use dma only when it is Tegra20 based platform */
-       if (of_machine_is_compatible("nvidia,tegra20") ||
-                       !of_have_populated_dt()) {
-               apbio_read = tegra_apb_readl_using_dma;
-               apbio_write = tegra_apb_writel_using_dma;
-       } else {
-               apbio_read = tegra_apb_readl_direct;
-               apbio_write = tegra_apb_writel_direct;
-       }
-}
-
-u32 tegra_apb_readl(unsigned long offset)
-{
-       return apbio_read(offset);
-}
-
-void tegra_apb_writel(u32 value, unsigned long offset)
-{
-       apbio_write(value, offset);
-}
diff --git a/arch/arm/mach-tegra/apbio.h b/arch/arm/mach-tegra/apbio.h
deleted file mode 100644 (file)
index f05d71c..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2010 NVIDIA Corporation.
- * Copyright (C) 2010 Google, Inc.
- *
- * This software is licensed under the terms of the GNU General Public
- * License version 2, as published by the Free Software Foundation, and
- * may be copied, distributed, and modified under those terms.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- */
-
-#ifndef __MACH_TEGRA_APBIO_H
-#define __MACH_TEGRA_APBIO_H
-
-void tegra_apb_io_init(void);
-u32 tegra_apb_readl(unsigned long offset);
-void tegra_apb_writel(u32 value, unsigned long offset);
-#endif
index 9c6029ba526fff85005d8195c311138be7074a94..bb4782a32713132fc09675fc7450e98ef6f66c51 100644 (file)
  *
  */
 
-#include <linux/platform_device.h>
 #include <linux/gpio/driver.h>
+#include <linux/platform_device.h>
 #include <linux/rfkill-gpio.h>
+
 #include "board.h"
 
 static struct rfkill_gpio_platform_data wifi_rfkill_platform_data = {
index bcf5dbf69d5891edde4df4f202b7c93cab9f24d7..da90c89296b9538da9fd35a4da6a9cb0f8d0695f 100644 (file)
 void __init tegra_map_common_io(void);
 void __init tegra_init_irq(void);
 
-int __init tegra_powergate_init(void);
-#if defined(CONFIG_ARCH_TEGRA_2x_SOC) && defined(CONFIG_DEBUG_FS)
-int __init tegra_powergate_debugfs_init(void);
-#else
-static inline int tegra_powergate_debugfs_init(void) { return 0; }
-#endif
-
 void __init tegra_paz00_wifikill_init(void);
 
 #endif
index b5fb7c110c64314f2e9b11c218b760d6e9d9e09c..e3ebdce3e71f62c48099191bf18cb00892c05aca 100644 (file)
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include <linux/kernel.h>
-#include <linux/module.h>
+#include <asm/firmware.h>
+#include <linux/clockchips.h>
 #include <linux/cpuidle.h>
 #include <linux/cpu_pm.h>
-#include <linux/clockchips.h>
-#include <asm/firmware.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
 
 #include <asm/cpuidle.h>
-#include <asm/suspend.h>
 #include <asm/smp_plat.h>
+#include <asm/suspend.h>
 
 #include "pm.h"
 #include "sleep.h"
index b82dcaee2ef4eb80ae215bf3d0dbe4ceb1cc8ba0..b30bf5cba65b033b5f6a7f75a29657db746d7cd4 100644 (file)
  * more details.
  */
 
-#include <linux/kernel.h>
-#include <linux/module.h>
+#include <linux/clk/tegra.h>
+#include <linux/clockchips.h>
 #include <linux/cpuidle.h>
 #include <linux/cpu_pm.h>
-#include <linux/clockchips.h>
-#include <linux/clk/tegra.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
 
 #include <asm/cpuidle.h>
 #include <asm/proc-fns.h>
-#include <asm/suspend.h>
 #include <asm/smp_plat.h>
+#include <asm/suspend.h>
 
-#include "pm.h"
-#include "sleep.h"
+#include "flowctrl.h"
 #include "iomap.h"
 #include "irq.h"
-#include "flowctrl.h"
+#include "pm.h"
+#include "sleep.h"
 
 #ifdef CONFIG_PM_SLEEP
 static bool abort_flag;
index ed2a2a7bae4d00ef1107b15681612b663c99bf67..35561274f6cf64d36a25886415c0aa3d50282ecb 100644 (file)
  * more details.
  */
 
-#include <linux/kernel.h>
-#include <linux/module.h>
+#include <linux/clk/tegra.h>
+#include <linux/clockchips.h>
 #include <linux/cpuidle.h>
 #include <linux/cpu_pm.h>
-#include <linux/clockchips.h>
-#include <linux/clk/tegra.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
 
 #include <asm/cpuidle.h>
 #include <asm/proc-fns.h>
-#include <asm/suspend.h>
 #include <asm/smp_plat.h>
+#include <asm/suspend.h>
 
 #include "pm.h"
 #include "sleep.h"
index 7bc5d8d667fe166e119ae797f5f4eb04007096cc..316563141add95eccd1b8075efa0b4bc519f07db 100644 (file)
 #include <linux/kernel.h>
 #include <linux/module.h>
 
-#include "fuse.h"
+#include <soc/tegra/fuse.h>
+
 #include "cpuidle.h"
 
 void __init tegra_cpuidle_init(void)
 {
-       switch (tegra_chip_id) {
+       switch (tegra_get_chip_id()) {
        case TEGRA20:
                if (IS_ENABLED(CONFIG_ARCH_TEGRA_2x_SOC))
                        tegra20_cpuidle_init();
@@ -49,7 +50,7 @@ void __init tegra_cpuidle_init(void)
 
 void tegra_cpuidle_pcie_irqs_in_use(void)
 {
-       switch (tegra_chip_id) {
+       switch (tegra_get_chip_id()) {
        case TEGRA20:
                if (IS_ENABLED(CONFIG_ARCH_TEGRA_2x_SOC))
                        tegra20_cpuidle_pcie_irqs_in_use();
index ce8ab8abf0616551416f5becbe8fcbd9317f6e18..ec55d1de1b55ec061490838658a8b87d603a86d0 100644 (file)
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <linux/cpumask.h>
 #include <linux/init.h>
-#include <linux/kernel.h>
 #include <linux/io.h>
-#include <linux/cpumask.h>
+#include <linux/kernel.h>
+
+#include <soc/tegra/fuse.h>
 
 #include "flowctrl.h"
 #include "iomap.h"
-#include "fuse.h"
 
 static u8 flowctrl_offset_halt_cpu[] = {
        FLOW_CTRL_HALT_CPU0_EVENTS,
@@ -76,7 +77,7 @@ void flowctrl_cpu_suspend_enter(unsigned int cpuid)
        int i;
 
        reg = flowctrl_read_cpu_csr(cpuid);
-       switch (tegra_chip_id) {
+       switch (tegra_get_chip_id()) {
        case TEGRA20:
                /* clear wfe bitmap */
                reg &= ~TEGRA20_FLOW_CTRL_CSR_WFE_BITMAP;
@@ -117,7 +118,7 @@ void flowctrl_cpu_suspend_exit(unsigned int cpuid)
 
        /* Disable powergating via flow controller for CPU0 */
        reg = flowctrl_read_cpu_csr(cpuid);
-       switch (tegra_chip_id) {
+       switch (tegra_get_chip_id()) {
        case TEGRA20:
                /* clear wfe bitmap */
                reg &= ~TEGRA20_FLOW_CTRL_CSR_WFE_BITMAP;
diff --git a/arch/arm/mach-tegra/fuse.c b/arch/arm/mach-tegra/fuse.c
deleted file mode 100644 (file)
index c9ac23b..0000000
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- * arch/arm/mach-tegra/fuse.c
- *
- * Copyright (C) 2010 Google, Inc.
- * Copyright (c) 2013, NVIDIA CORPORATION.  All rights reserved.
- *
- * Author:
- *     Colin Cross <ccross@android.com>
- *
- * This software is licensed under the terms of the GNU General Public
- * License version 2, as published by the Free Software Foundation, and
- * may be copied, distributed, and modified under those terms.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- */
-
-#include <linux/kernel.h>
-#include <linux/io.h>
-#include <linux/export.h>
-#include <linux/random.h>
-#include <linux/clk.h>
-#include <linux/tegra-soc.h>
-
-#include "fuse.h"
-#include "iomap.h"
-#include "apbio.h"
-
-/* Tegra20 only */
-#define FUSE_UID_LOW           0x108
-#define FUSE_UID_HIGH          0x10c
-
-/* Tegra30 and later */
-#define FUSE_VENDOR_CODE       0x200
-#define FUSE_FAB_CODE          0x204
-#define FUSE_LOT_CODE_0                0x208
-#define FUSE_LOT_CODE_1                0x20c
-#define FUSE_WAFER_ID          0x210
-#define FUSE_X_COORDINATE      0x214
-#define FUSE_Y_COORDINATE      0x218
-
-#define FUSE_SKU_INFO          0x110
-
-#define TEGRA20_FUSE_SPARE_BIT         0x200
-#define TEGRA30_FUSE_SPARE_BIT         0x244
-
-int tegra_sku_id;
-int tegra_cpu_process_id;
-int tegra_core_process_id;
-int tegra_chip_id;
-int tegra_cpu_speedo_id;               /* only exist in Tegra30 and later */
-int tegra_soc_speedo_id;
-enum tegra_revision tegra_revision;
-
-static struct clk *fuse_clk;
-static int tegra_fuse_spare_bit;
-static void (*tegra_init_speedo_data)(void);
-
-/* The BCT to use at boot is specified by board straps that can be read
- * through a APB misc register and decoded. 2 bits, i.e. 4 possible BCTs.
- */
-int tegra_bct_strapping;
-
-#define STRAP_OPT 0x008
-#define GMI_AD0 (1 << 4)
-#define GMI_AD1 (1 << 5)
-#define RAM_ID_MASK (GMI_AD0 | GMI_AD1)
-#define RAM_CODE_SHIFT 4
-
-static const char *tegra_revision_name[TEGRA_REVISION_MAX] = {
-       [TEGRA_REVISION_UNKNOWN] = "unknown",
-       [TEGRA_REVISION_A01]     = "A01",
-       [TEGRA_REVISION_A02]     = "A02",
-       [TEGRA_REVISION_A03]     = "A03",
-       [TEGRA_REVISION_A03p]    = "A03 prime",
-       [TEGRA_REVISION_A04]     = "A04",
-};
-
-static void tegra_fuse_enable_clk(void)
-{
-       if (IS_ERR(fuse_clk))
-               fuse_clk = clk_get_sys(NULL, "fuse");
-       if (IS_ERR(fuse_clk))
-               return;
-       clk_prepare_enable(fuse_clk);
-}
-
-static void tegra_fuse_disable_clk(void)
-{
-       if (IS_ERR(fuse_clk))
-               return;
-       clk_disable_unprepare(fuse_clk);
-}
-
-u32 tegra_fuse_readl(unsigned long offset)
-{
-       return tegra_apb_readl(TEGRA_FUSE_BASE + offset);
-}
-
-bool tegra_spare_fuse(int bit)
-{
-       bool ret;
-
-       tegra_fuse_enable_clk();
-
-       ret = tegra_fuse_readl(tegra_fuse_spare_bit + bit * 4);
-
-       tegra_fuse_disable_clk();
-
-       return ret;
-}
-
-static enum tegra_revision tegra_get_revision(u32 id)
-{
-       u32 minor_rev = (id >> 16) & 0xf;
-
-       switch (minor_rev) {
-       case 1:
-               return TEGRA_REVISION_A01;
-       case 2:
-               return TEGRA_REVISION_A02;
-       case 3:
-               if (tegra_chip_id == TEGRA20 &&
-                       (tegra_spare_fuse(18) || tegra_spare_fuse(19)))
-                       return TEGRA_REVISION_A03p;
-               else
-                       return TEGRA_REVISION_A03;
-       case 4:
-               return TEGRA_REVISION_A04;
-       default:
-               return TEGRA_REVISION_UNKNOWN;
-       }
-}
-
-static void tegra_get_process_id(void)
-{
-       u32 reg;
-
-       tegra_fuse_enable_clk();
-
-       reg = tegra_fuse_readl(tegra_fuse_spare_bit);
-       tegra_cpu_process_id = (reg >> 6) & 3;
-       reg = tegra_fuse_readl(tegra_fuse_spare_bit);
-       tegra_core_process_id = (reg >> 12) & 3;
-
-       tegra_fuse_disable_clk();
-}
-
-u32 tegra_read_chipid(void)
-{
-       return readl_relaxed(IO_ADDRESS(TEGRA_APB_MISC_BASE) + 0x804);
-}
-
-static void __init tegra20_fuse_init_randomness(void)
-{
-       u32 randomness[2];
-
-       randomness[0] = tegra_fuse_readl(FUSE_UID_LOW);
-       randomness[1] = tegra_fuse_readl(FUSE_UID_HIGH);
-
-       add_device_randomness(randomness, sizeof(randomness));
-}
-
-/* Applies to Tegra30 or later */
-static void __init tegra30_fuse_init_randomness(void)
-{
-       u32 randomness[7];
-
-       randomness[0] = tegra_fuse_readl(FUSE_VENDOR_CODE);
-       randomness[1] = tegra_fuse_readl(FUSE_FAB_CODE);
-       randomness[2] = tegra_fuse_readl(FUSE_LOT_CODE_0);
-       randomness[3] = tegra_fuse_readl(FUSE_LOT_CODE_1);
-       randomness[4] = tegra_fuse_readl(FUSE_WAFER_ID);
-       randomness[5] = tegra_fuse_readl(FUSE_X_COORDINATE);
-       randomness[6] = tegra_fuse_readl(FUSE_Y_COORDINATE);
-
-       add_device_randomness(randomness, sizeof(randomness));
-}
-
-void __init tegra_init_fuse(void)
-{
-       u32 id;
-       u32 randomness[5];
-
-       u32 reg = readl(IO_ADDRESS(TEGRA_CLK_RESET_BASE + 0x48));
-       reg |= 1 << 28;
-       writel(reg, IO_ADDRESS(TEGRA_CLK_RESET_BASE + 0x48));
-
-       /*
-        * Enable FUSE clock. This needs to be hardcoded because the clock
-        * subsystem is not active during early boot.
-        */
-       reg = readl(IO_ADDRESS(TEGRA_CLK_RESET_BASE + 0x14));
-       reg |= 1 << 7;
-       writel(reg, IO_ADDRESS(TEGRA_CLK_RESET_BASE + 0x14));
-       fuse_clk = ERR_PTR(-EINVAL);
-
-       reg = tegra_fuse_readl(FUSE_SKU_INFO);
-       randomness[0] = reg;
-       tegra_sku_id = reg & 0xFF;
-
-       reg = tegra_apb_readl(TEGRA_APB_MISC_BASE + STRAP_OPT);
-       randomness[1] = reg;
-       tegra_bct_strapping = (reg & RAM_ID_MASK) >> RAM_CODE_SHIFT;
-
-       id = tegra_read_chipid();
-       randomness[2] = id;
-       tegra_chip_id = (id >> 8) & 0xff;
-
-       switch (tegra_chip_id) {
-       case TEGRA20:
-               tegra_fuse_spare_bit = TEGRA20_FUSE_SPARE_BIT;
-               tegra_init_speedo_data = &tegra20_init_speedo_data;
-               break;
-       case TEGRA30:
-               tegra_fuse_spare_bit = TEGRA30_FUSE_SPARE_BIT;
-               tegra_init_speedo_data = &tegra30_init_speedo_data;
-               break;
-       case TEGRA114:
-               tegra_init_speedo_data = &tegra114_init_speedo_data;
-               break;
-       default:
-               pr_warn("Tegra: unknown chip id %d\n", tegra_chip_id);
-               tegra_fuse_spare_bit = TEGRA20_FUSE_SPARE_BIT;
-               tegra_init_speedo_data = &tegra_get_process_id;
-       }
-
-       tegra_revision = tegra_get_revision(id);
-       tegra_init_speedo_data();
-       randomness[3] = (tegra_cpu_process_id << 16) | tegra_core_process_id;
-       randomness[4] = (tegra_cpu_speedo_id << 16) | tegra_soc_speedo_id;
-
-       add_device_randomness(randomness, sizeof(randomness));
-       switch (tegra_chip_id) {
-       case TEGRA20:
-               tegra20_fuse_init_randomness();
-               break;
-       case TEGRA30:
-       case TEGRA114:
-       default:
-               tegra30_fuse_init_randomness();
-               break;
-       }
-
-       pr_info("Tegra Revision: %s SKU: %d CPU Process: %d Core Process: %d\n",
-               tegra_revision_name[tegra_revision],
-               tegra_sku_id, tegra_cpu_process_id,
-               tegra_core_process_id);
-}
diff --git a/arch/arm/mach-tegra/fuse.h b/arch/arm/mach-tegra/fuse.h
deleted file mode 100644 (file)
index c01d047..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2010 Google, Inc.
- * Copyright (c) 2013, NVIDIA CORPORATION.  All rights reserved.
- *
- * Author:
- *     Colin Cross <ccross@android.com>
- *
- * This software is licensed under the terms of the GNU General Public
- * License version 2, as published by the Free Software Foundation, and
- * may be copied, distributed, and modified under those terms.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- */
-
-#ifndef __MACH_TEGRA_FUSE_H
-#define __MACH_TEGRA_FUSE_H
-
-#define SKU_ID_T20     8
-#define SKU_ID_T25SE   20
-#define SKU_ID_AP25    23
-#define SKU_ID_T25     24
-#define SKU_ID_AP25E   27
-#define SKU_ID_T25E    28
-
-#define TEGRA20                0x20
-#define TEGRA30                0x30
-#define TEGRA114       0x35
-#define TEGRA124       0x40
-
-#ifndef __ASSEMBLY__
-enum tegra_revision {
-       TEGRA_REVISION_UNKNOWN = 0,
-       TEGRA_REVISION_A01,
-       TEGRA_REVISION_A02,
-       TEGRA_REVISION_A03,
-       TEGRA_REVISION_A03p,
-       TEGRA_REVISION_A04,
-       TEGRA_REVISION_MAX,
-};
-
-extern int tegra_sku_id;
-extern int tegra_cpu_process_id;
-extern int tegra_core_process_id;
-extern int tegra_chip_id;
-extern int tegra_cpu_speedo_id;                /* only exist in Tegra30 and later */
-extern int tegra_soc_speedo_id;
-extern enum tegra_revision tegra_revision;
-
-extern int tegra_bct_strapping;
-
-unsigned long long tegra_chip_uid(void);
-void tegra_init_fuse(void);
-bool tegra_spare_fuse(int bit);
-u32 tegra_fuse_readl(unsigned long offset);
-
-#ifdef CONFIG_ARCH_TEGRA_2x_SOC
-void tegra20_init_speedo_data(void);
-#else
-static inline void tegra20_init_speedo_data(void) {}
-#endif
-
-#ifdef CONFIG_ARCH_TEGRA_3x_SOC
-void tegra30_init_speedo_data(void);
-#else
-static inline void tegra30_init_speedo_data(void) {}
-#endif
-
-#ifdef CONFIG_ARCH_TEGRA_114_SOC
-void tegra114_init_speedo_data(void);
-#else
-static inline void tegra114_init_speedo_data(void) {}
-#endif
-#endif /* __ASSEMBLY__ */
-
-#endif
index ff26af26bd0ce7b15d7a9308f3a36d240ec0a8a1..6fc71f1534b069f9f8d28e0283e6a37812c3802d 100644 (file)
@@ -7,13 +7,16 @@
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  */
+
+#include <linux/clk/tegra.h>
 #include <linux/kernel.h>
 #include <linux/smp.h>
-#include <linux/clk/tegra.h>
+
+#include <soc/tegra/common.h>
+#include <soc/tegra/fuse.h>
 
 #include <asm/smp_plat.h>
 
-#include "fuse.h"
 #include "sleep.h"
 
 static void (*tegra_hotplug_shutdown)(void);
@@ -36,6 +39,11 @@ int tegra_cpu_kill(unsigned cpu)
  */
 void __ref tegra_cpu_die(unsigned int cpu)
 {
+       if (!tegra_hotplug_shutdown) {
+               WARN(1, "hotplug is not yet initialized\n");
+               return;
+       }
+
        /* Clean L1 data cache */
        tegra_disable_clean_inv_dcache(TEGRA_FLUSH_CACHE_LOUIS);
 
@@ -46,17 +54,23 @@ void __ref tegra_cpu_die(unsigned int cpu)
        BUG();
 }
 
-void __init tegra_hotplug_init(void)
+static int __init tegra_hotplug_init(void)
 {
        if (!IS_ENABLED(CONFIG_HOTPLUG_CPU))
-               return;
+               return 0;
 
-       if (IS_ENABLED(CONFIG_ARCH_TEGRA_2x_SOC) && tegra_chip_id == TEGRA20)
+       if (!soc_is_tegra())
+               return 0;
+
+       if (IS_ENABLED(CONFIG_ARCH_TEGRA_2x_SOC) && tegra_get_chip_id() == TEGRA20)
                tegra_hotplug_shutdown = tegra20_hotplug_shutdown;
-       if (IS_ENABLED(CONFIG_ARCH_TEGRA_3x_SOC) && tegra_chip_id == TEGRA30)
+       if (IS_ENABLED(CONFIG_ARCH_TEGRA_3x_SOC) && tegra_get_chip_id() == TEGRA30)
                tegra_hotplug_shutdown = tegra30_hotplug_shutdown;
-       if (IS_ENABLED(CONFIG_ARCH_TEGRA_114_SOC) && tegra_chip_id == TEGRA114)
+       if (IS_ENABLED(CONFIG_ARCH_TEGRA_114_SOC) && tegra_get_chip_id() == TEGRA114)
                tegra_hotplug_shutdown = tegra30_hotplug_shutdown;
-       if (IS_ENABLED(CONFIG_ARCH_TEGRA_124_SOC) && tegra_chip_id == TEGRA124)
+       if (IS_ENABLED(CONFIG_ARCH_TEGRA_124_SOC) && tegra_get_chip_id() == TEGRA124)
                tegra_hotplug_shutdown = tegra30_hotplug_shutdown;
+
+       return 0;
 }
+pure_initcall(tegra_hotplug_init);
index bb9c9c29d1811026f2ac15d5fee2154ce0095fa9..352de159d2c51686da50b19adb81410739454ef9 100644 (file)
  *
  */
 
-#include <linux/kernel.h>
-#include <linux/module.h>
 #include <linux/init.h>
-#include <linux/mm.h>
 #include <linux/io.h>
+#include <linux/kernel.h>
+#include <linux/mm.h>
+#include <linux/module.h>
 
-#include <asm/page.h>
 #include <asm/mach/map.h>
+#include <asm/page.h>
 
 #include "board.h"
 #include "iomap.h"
index 1a74d562dca1645be1ed1aa6d678c25ff331a26c..da7be13aecce3cd8d12de9b64c10b6e3facf252b 100644 (file)
  *
  */
 
-#include <linux/kernel.h>
 #include <linux/cpu_pm.h>
 #include <linux/interrupt.h>
-#include <linux/irq.h>
 #include <linux/io.h>
-#include <linux/of.h>
-#include <linux/of_address.h>
 #include <linux/irqchip/arm-gic.h>
+#include <linux/irq.h>
+#include <linux/kernel.h>
+#include <linux/of_address.h>
+#include <linux/of.h>
 #include <linux/syscore_ops.h>
 
 #include "board.h"
index 929d1046e2b413b05987b929746fe645be992655..b45086666648b893b2ca622abe16c629893b1858 100644 (file)
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  */
-#include <linux/init.h>
-#include <linux/errno.h>
+
+#include <linux/clk/tegra.h>
 #include <linux/delay.h>
 #include <linux/device.h>
+#include <linux/errno.h>
+#include <linux/init.h>
+#include <linux/io.h>
 #include <linux/jiffies.h>
 #include <linux/smp.h>
-#include <linux/io.h>
-#include <linux/clk/tegra.h>
+
+#include <soc/tegra/fuse.h>
+#include <soc/tegra/pmc.h>
 
 #include <asm/cacheflush.h>
 #include <asm/mach-types.h>
-#include <asm/smp_scu.h>
 #include <asm/smp_plat.h>
-
-#include "fuse.h"
-#include "flowctrl.h"
-#include "reset.h"
-#include "pmc.h"
+#include <asm/smp_scu.h>
 
 #include "common.h"
+#include "flowctrl.h"
 #include "iomap.h"
+#include "reset.h"
 
 static cpumask_t tegra_cpu_init_mask;
 
@@ -170,13 +171,13 @@ static int tegra114_boot_secondary(unsigned int cpu, struct task_struct *idle)
 static int tegra_boot_secondary(unsigned int cpu,
                                          struct task_struct *idle)
 {
-       if (IS_ENABLED(CONFIG_ARCH_TEGRA_2x_SOC) && tegra_chip_id == TEGRA20)
+       if (IS_ENABLED(CONFIG_ARCH_TEGRA_2x_SOC) && tegra_get_chip_id() == TEGRA20)
                return tegra20_boot_secondary(cpu, idle);
-       if (IS_ENABLED(CONFIG_ARCH_TEGRA_3x_SOC) && tegra_chip_id == TEGRA30)
+       if (IS_ENABLED(CONFIG_ARCH_TEGRA_3x_SOC) && tegra_get_chip_id() == TEGRA30)
                return tegra30_boot_secondary(cpu, idle);
-       if (IS_ENABLED(CONFIG_ARCH_TEGRA_114_SOC) && tegra_chip_id == TEGRA114)
+       if (IS_ENABLED(CONFIG_ARCH_TEGRA_114_SOC) && tegra_get_chip_id() == TEGRA114)
                return tegra114_boot_secondary(cpu, idle);
-       if (IS_ENABLED(CONFIG_ARCH_TEGRA_124_SOC) && tegra_chip_id == TEGRA124)
+       if (IS_ENABLED(CONFIG_ARCH_TEGRA_124_SOC) && tegra_get_chip_id() == TEGRA124)
                return tegra114_boot_secondary(cpu, idle);
 
        return -EINVAL;
index d65e1d786400249d6312d9a9d6569d90a0282f23..39ac2b723f2efa4f7de9db5a2145e8599a9f4955 100644 (file)
@@ -13,6 +13,7 @@
  * You should have received a copy of the GNU General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
+
 #include <linux/kernel.h>
 
 #include "pm.h"
index 8fa326d6ff1a50e6ceaa7e36b8b6a493e5ebe7a6..46cc19de99163644d8a5fef5d5284173e3495791 100644 (file)
@@ -13,6 +13,7 @@
  * You should have received a copy of the GNU General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
+
 #include <linux/kernel.h>
 
 #include "pm.h"
index f55b05a29b55f3ed655b36b1edf1f93f85d09c9d..b0f48a3946fae27277dd8ca49f9432896e89cfb0 100644 (file)
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include <linux/kernel.h>
-#include <linux/spinlock.h>
-#include <linux/io.h>
+#include <linux/clk/tegra.h>
 #include <linux/cpumask.h>
-#include <linux/delay.h>
 #include <linux/cpu_pm.h>
-#include <linux/suspend.h>
+#include <linux/delay.h>
 #include <linux/err.h>
+#include <linux/io.h>
+#include <linux/kernel.h>
 #include <linux/slab.h>
-#include <linux/clk/tegra.h>
+#include <linux/spinlock.h>
+#include <linux/suspend.h>
+
+#include <soc/tegra/fuse.h>
+#include <soc/tegra/pm.h>
+#include <soc/tegra/pmc.h>
 
-#include <asm/smp_plat.h>
 #include <asm/cacheflush.h>
-#include <asm/suspend.h>
 #include <asm/idmap.h>
 #include <asm/proc-fns.h>
+#include <asm/smp_plat.h>
+#include <asm/suspend.h>
 #include <asm/tlbflush.h>
 
-#include "iomap.h"
-#include "reset.h"
 #include "flowctrl.h"
-#include "fuse.h"
+#include "iomap.h"
 #include "pm.h"
-#include "pmc.h"
+#include "reset.h"
 #include "sleep.h"
 
 #ifdef CONFIG_PM_SLEEP
@@ -53,7 +55,7 @@ static int (*tegra_sleep_func)(unsigned long v2p);
 
 static void tegra_tear_down_cpu_init(void)
 {
-       switch (tegra_chip_id) {
+       switch (tegra_get_chip_id()) {
        case TEGRA20:
                if (IS_ENABLED(CONFIG_ARCH_TEGRA_2x_SOC))
                        tegra_tear_down_cpu = tegra20_tear_down_cpu;
@@ -143,7 +145,7 @@ bool tegra_set_cpu_in_lp2(void)
 
        if ((phy_cpu_id == 0) && cpumask_equal(cpu_lp2_mask, cpu_online_mask))
                last_cpu = true;
-       else if (tegra_chip_id == TEGRA20 && phy_cpu_id == 1)
+       else if (tegra_get_chip_id() == TEGRA20 && phy_cpu_id == 1)
                tegra20_cpu_set_resettable_soon();
 
        spin_unlock(&tegra_lp2_lock);
@@ -166,9 +168,29 @@ static int tegra_sleep_cpu(unsigned long v2p)
        return 0;
 }
 
+static void tegra_pm_set(enum tegra_suspend_mode mode)
+{
+       u32 value;
+
+       switch (tegra_get_chip_id()) {
+       case TEGRA20:
+       case TEGRA30:
+               break;
+       default:
+               /* Turn off CRAIL */
+               value = flowctrl_read_cpu_csr(0);
+               value &= ~FLOW_CTRL_CSR_ENABLE_EXT_MASK;
+               value |= FLOW_CTRL_CSR_ENABLE_EXT_CRAIL;
+               flowctrl_write_cpu_csr(0, value);
+               break;
+       }
+
+       tegra_pmc_enter_suspend_mode(mode);
+}
+
 void tegra_idle_lp2_last(void)
 {
-       tegra_pmc_pm_set(TEGRA_SUSPEND_LP2);
+       tegra_pm_set(TEGRA_SUSPEND_LP2);
 
        cpu_cluster_pm_enter();
        suspend_cpu_complex();
@@ -212,7 +234,7 @@ static int tegra_sleep_core(unsigned long v2p)
  */
 static bool tegra_lp1_iram_hook(void)
 {
-       switch (tegra_chip_id) {
+       switch (tegra_get_chip_id()) {
        case TEGRA20:
                if (IS_ENABLED(CONFIG_ARCH_TEGRA_2x_SOC))
                        tegra20_lp1_iram_hook();
@@ -242,7 +264,7 @@ static bool tegra_lp1_iram_hook(void)
 
 static bool tegra_sleep_core_init(void)
 {
-       switch (tegra_chip_id) {
+       switch (tegra_get_chip_id()) {
        case TEGRA20:
                if (IS_ENABLED(CONFIG_ARCH_TEGRA_2x_SOC))
                        tegra20_sleep_core_init();
@@ -267,8 +289,6 @@ static bool tegra_sleep_core_init(void)
 
 static void tegra_suspend_enter_lp1(void)
 {
-       tegra_pmc_suspend();
-
        /* copy the reset vector & SDRAM shutdown code into IRAM */
        memcpy(iram_save_addr, IO_ADDRESS(TEGRA_IRAM_LPx_RESUME_AREA),
                iram_save_size);
@@ -280,8 +300,6 @@ static void tegra_suspend_enter_lp1(void)
 
 static void tegra_suspend_exit_lp1(void)
 {
-       tegra_pmc_resume();
-
        /* restore IRAM */
        memcpy(IO_ADDRESS(TEGRA_IRAM_LPx_RESUME_AREA), iram_save_addr,
                iram_save_size);
@@ -306,7 +324,7 @@ static int tegra_suspend_enter(suspend_state_t state)
 
        pr_info("Entering suspend state %s\n", lp_state[mode]);
 
-       tegra_pmc_pm_set(mode);
+       tegra_pm_set(mode);
 
        local_fiq_disable();
 
@@ -354,7 +372,6 @@ void __init tegra_init_suspend(void)
                return;
 
        tegra_tear_down_cpu_init();
-       tegra_pmc_suspend_init();
 
        if (mode >= TEGRA_SUSPEND_LP1) {
                if (!tegra_lp1_iram_hook() || !tegra_sleep_core_init()) {
index f4a89698e5b009e5a0c852ee58588fa69650a319..83bc875834464bbde39b304c87348b3b9b3ea400 100644 (file)
 #ifndef _MACH_TEGRA_PM_H_
 #define _MACH_TEGRA_PM_H_
 
-#include "pmc.h"
-
 struct tegra_lp1_iram {
        void    *start_addr;
        void    *end_addr;
 };
+
 extern struct tegra_lp1_iram tegra_lp1_iram;
 extern void (*tegra_sleep_core_finish)(unsigned long v2p);
 
@@ -42,15 +41,8 @@ void tegra_idle_lp2_last(void);
 extern void (*tegra_tear_down_cpu)(void);
 
 #ifdef CONFIG_PM_SLEEP
-enum tegra_suspend_mode tegra_pm_validate_suspend_mode(
-                               enum tegra_suspend_mode mode);
 void tegra_init_suspend(void);
 #else
-static inline enum tegra_suspend_mode tegra_pm_validate_suspend_mode(
-                               enum tegra_suspend_mode mode)
-{
-       return TEGRA_SUSPEND_NONE;
-}
 static inline void tegra_init_suspend(void) {}
 #endif
 
diff --git a/arch/arm/mach-tegra/pmc.c b/arch/arm/mach-tegra/pmc.c
deleted file mode 100644 (file)
index 7c7123e..0000000
+++ /dev/null
@@ -1,413 +0,0 @@
-/*
- * Copyright (C) 2012,2013 NVIDIA CORPORATION. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#include <linux/kernel.h>
-#include <linux/clk.h>
-#include <linux/io.h>
-#include <linux/of.h>
-#include <linux/of_address.h>
-#include <linux/tegra-powergate.h>
-
-#include "flowctrl.h"
-#include "fuse.h"
-#include "pm.h"
-#include "pmc.h"
-#include "sleep.h"
-
-#define TEGRA_POWER_SYSCLK_POLARITY    (1 << 10)  /* sys clk polarity */
-#define TEGRA_POWER_SYSCLK_OE          (1 << 11)  /* system clock enable */
-#define TEGRA_POWER_EFFECT_LP0         (1 << 14)  /* LP0 when CPU pwr gated */
-#define TEGRA_POWER_CPU_PWRREQ_POLARITY        (1 << 15)  /* CPU pwr req polarity */
-#define TEGRA_POWER_CPU_PWRREQ_OE      (1 << 16)  /* CPU pwr req enable */
-
-#define PMC_CTRL                       0x0
-#define PMC_CTRL_INTR_LOW              (1 << 17)
-#define PMC_PWRGATE_TOGGLE             0x30
-#define PMC_PWRGATE_TOGGLE_START       (1 << 8)
-#define PMC_REMOVE_CLAMPING            0x34
-#define PMC_PWRGATE_STATUS             0x38
-
-#define PMC_SCRATCH0                   0x50
-#define PMC_SCRATCH0_MODE_RECOVERY     (1 << 31)
-#define PMC_SCRATCH0_MODE_BOOTLOADER   (1 << 30)
-#define PMC_SCRATCH0_MODE_RCM          (1 << 1)
-#define PMC_SCRATCH0_MODE_MASK         (PMC_SCRATCH0_MODE_RECOVERY | \
-                                        PMC_SCRATCH0_MODE_BOOTLOADER | \
-                                        PMC_SCRATCH0_MODE_RCM)
-
-#define PMC_CPUPWRGOOD_TIMER   0xc8
-#define PMC_CPUPWROFF_TIMER    0xcc
-
-static u8 tegra_cpu_domains[] = {
-       0xFF,                   /* not available for CPU0 */
-       TEGRA_POWERGATE_CPU1,
-       TEGRA_POWERGATE_CPU2,
-       TEGRA_POWERGATE_CPU3,
-};
-static DEFINE_SPINLOCK(tegra_powergate_lock);
-
-static void __iomem *tegra_pmc_base;
-static bool tegra_pmc_invert_interrupt;
-static struct clk *tegra_pclk;
-
-struct pmc_pm_data {
-       u32 cpu_good_time;      /* CPU power good time in uS */
-       u32 cpu_off_time;       /* CPU power off time in uS */
-       u32 core_osc_time;      /* Core power good osc time in uS */
-       u32 core_pmu_time;      /* Core power good pmu time in uS */
-       u32 core_off_time;      /* Core power off time in uS */
-       bool corereq_high;      /* Core power request active-high */
-       bool sysclkreq_high;    /* System clock request active-high */
-       bool combined_req;      /* Combined pwr req for CPU & Core */
-       bool cpu_pwr_good_en;   /* CPU power good signal is enabled */
-       u32 lp0_vec_phy_addr;   /* The phy addr of LP0 warm boot code */
-       u32 lp0_vec_size;       /* The size of LP0 warm boot code */
-       enum tegra_suspend_mode suspend_mode;
-};
-static struct pmc_pm_data pmc_pm_data;
-
-static inline u32 tegra_pmc_readl(u32 reg)
-{
-       return readl(tegra_pmc_base + reg);
-}
-
-static inline void tegra_pmc_writel(u32 val, u32 reg)
-{
-       writel(val, tegra_pmc_base + reg);
-}
-
-static int tegra_pmc_get_cpu_powerdomain_id(int cpuid)
-{
-       if (cpuid <= 0 || cpuid >= num_possible_cpus())
-               return -EINVAL;
-       return tegra_cpu_domains[cpuid];
-}
-
-static bool tegra_pmc_powergate_is_powered(int id)
-{
-       return (tegra_pmc_readl(PMC_PWRGATE_STATUS) >> id) & 1;
-}
-
-static int tegra_pmc_powergate_set(int id, bool new_state)
-{
-       bool old_state;
-       unsigned long flags;
-
-       spin_lock_irqsave(&tegra_powergate_lock, flags);
-
-       old_state = tegra_pmc_powergate_is_powered(id);
-       WARN_ON(old_state == new_state);
-
-       tegra_pmc_writel(PMC_PWRGATE_TOGGLE_START | id, PMC_PWRGATE_TOGGLE);
-
-       spin_unlock_irqrestore(&tegra_powergate_lock, flags);
-
-       return 0;
-}
-
-static int tegra_pmc_powergate_remove_clamping(int id)
-{
-       u32 mask;
-
-       /*
-        * Tegra has a bug where PCIE and VDE clamping masks are
-        * swapped relatively to the partition ids.
-        */
-       if (id ==  TEGRA_POWERGATE_VDEC)
-               mask = (1 << TEGRA_POWERGATE_PCIE);
-       else if (id == TEGRA_POWERGATE_PCIE)
-               mask = (1 << TEGRA_POWERGATE_VDEC);
-       else
-               mask = (1 << id);
-
-       tegra_pmc_writel(mask, PMC_REMOVE_CLAMPING);
-
-       return 0;
-}
-
-bool tegra_pmc_cpu_is_powered(int cpuid)
-{
-       int id;
-
-       id = tegra_pmc_get_cpu_powerdomain_id(cpuid);
-       if (id < 0)
-               return false;
-       return tegra_pmc_powergate_is_powered(id);
-}
-
-int tegra_pmc_cpu_power_on(int cpuid)
-{
-       int id;
-
-       id = tegra_pmc_get_cpu_powerdomain_id(cpuid);
-       if (id < 0)
-               return id;
-       return tegra_pmc_powergate_set(id, true);
-}
-
-int tegra_pmc_cpu_remove_clamping(int cpuid)
-{
-       int id;
-
-       id = tegra_pmc_get_cpu_powerdomain_id(cpuid);
-       if (id < 0)
-               return id;
-       return tegra_pmc_powergate_remove_clamping(id);
-}
-
-void tegra_pmc_restart(enum reboot_mode mode, const char *cmd)
-{
-       u32 val;
-
-       val = tegra_pmc_readl(PMC_SCRATCH0);
-       val &= ~PMC_SCRATCH0_MODE_MASK;
-
-       if (cmd) {
-               if (strcmp(cmd, "recovery") == 0)
-                       val |= PMC_SCRATCH0_MODE_RECOVERY;
-
-               if (strcmp(cmd, "bootloader") == 0)
-                       val |= PMC_SCRATCH0_MODE_BOOTLOADER;
-
-               if (strcmp(cmd, "forced-recovery") == 0)
-                       val |= PMC_SCRATCH0_MODE_RCM;
-       }
-
-       tegra_pmc_writel(val, PMC_SCRATCH0);
-
-       val = tegra_pmc_readl(0);
-       val |= 0x10;
-       tegra_pmc_writel(val, 0);
-}
-
-#ifdef CONFIG_PM_SLEEP
-static void set_power_timers(u32 us_on, u32 us_off, unsigned long rate)
-{
-       unsigned long long ticks;
-       unsigned long long pclk;
-       static unsigned long tegra_last_pclk;
-
-       if (WARN_ON_ONCE(rate <= 0))
-               pclk = 100000000;
-       else
-               pclk = rate;
-
-       if ((rate != tegra_last_pclk)) {
-               ticks = (us_on * pclk) + 999999ull;
-               do_div(ticks, 1000000);
-               tegra_pmc_writel((unsigned long)ticks, PMC_CPUPWRGOOD_TIMER);
-
-               ticks = (us_off * pclk) + 999999ull;
-               do_div(ticks, 1000000);
-               tegra_pmc_writel((unsigned long)ticks, PMC_CPUPWROFF_TIMER);
-               wmb();
-       }
-       tegra_last_pclk = pclk;
-}
-
-enum tegra_suspend_mode tegra_pmc_get_suspend_mode(void)
-{
-       return pmc_pm_data.suspend_mode;
-}
-
-void tegra_pmc_set_suspend_mode(enum tegra_suspend_mode mode)
-{
-       if (mode < TEGRA_SUSPEND_NONE || mode >= TEGRA_MAX_SUSPEND_MODE)
-               return;
-
-       pmc_pm_data.suspend_mode = mode;
-}
-
-void tegra_pmc_suspend(void)
-{
-       tegra_pmc_writel(virt_to_phys(tegra_resume), PMC_SCRATCH41);
-}
-
-void tegra_pmc_resume(void)
-{
-       tegra_pmc_writel(0x0, PMC_SCRATCH41);
-}
-
-void tegra_pmc_pm_set(enum tegra_suspend_mode mode)
-{
-       u32 reg, csr_reg;
-       unsigned long rate = 0;
-
-       reg = tegra_pmc_readl(PMC_CTRL);
-       reg |= TEGRA_POWER_CPU_PWRREQ_OE;
-       reg &= ~TEGRA_POWER_EFFECT_LP0;
-
-       switch (tegra_chip_id) {
-       case TEGRA20:
-       case TEGRA30:
-               break;
-       default:
-               /* Turn off CRAIL */
-               csr_reg = flowctrl_read_cpu_csr(0);
-               csr_reg &= ~FLOW_CTRL_CSR_ENABLE_EXT_MASK;
-               csr_reg |= FLOW_CTRL_CSR_ENABLE_EXT_CRAIL;
-               flowctrl_write_cpu_csr(0, csr_reg);
-               break;
-       }
-
-       switch (mode) {
-       case TEGRA_SUSPEND_LP1:
-               rate = 32768;
-               break;
-       case TEGRA_SUSPEND_LP2:
-               rate = clk_get_rate(tegra_pclk);
-               break;
-       default:
-               break;
-       }
-
-       set_power_timers(pmc_pm_data.cpu_good_time, pmc_pm_data.cpu_off_time,
-                        rate);
-
-       tegra_pmc_writel(reg, PMC_CTRL);
-}
-
-void tegra_pmc_suspend_init(void)
-{
-       u32 reg;
-
-       /* Always enable CPU power request */
-       reg = tegra_pmc_readl(PMC_CTRL);
-       reg |= TEGRA_POWER_CPU_PWRREQ_OE;
-       tegra_pmc_writel(reg, PMC_CTRL);
-
-       reg = tegra_pmc_readl(PMC_CTRL);
-
-       if (!pmc_pm_data.sysclkreq_high)
-               reg |= TEGRA_POWER_SYSCLK_POLARITY;
-       else
-               reg &= ~TEGRA_POWER_SYSCLK_POLARITY;
-
-       /* configure the output polarity while the request is tristated */
-       tegra_pmc_writel(reg, PMC_CTRL);
-
-       /* now enable the request */
-       reg |= TEGRA_POWER_SYSCLK_OE;
-       tegra_pmc_writel(reg, PMC_CTRL);
-}
-#endif
-
-static const struct of_device_id matches[] __initconst = {
-       { .compatible = "nvidia,tegra124-pmc" },
-       { .compatible = "nvidia,tegra114-pmc" },
-       { .compatible = "nvidia,tegra30-pmc" },
-       { .compatible = "nvidia,tegra20-pmc" },
-       { }
-};
-
-void __init tegra_pmc_init_irq(void)
-{
-       struct device_node *np;
-       u32 val;
-
-       np = of_find_matching_node(NULL, matches);
-       BUG_ON(!np);
-
-       tegra_pmc_base = of_iomap(np, 0);
-
-       tegra_pmc_invert_interrupt = of_property_read_bool(np,
-                                    "nvidia,invert-interrupt");
-
-       val = tegra_pmc_readl(PMC_CTRL);
-       if (tegra_pmc_invert_interrupt)
-               val |= PMC_CTRL_INTR_LOW;
-       else
-               val &= ~PMC_CTRL_INTR_LOW;
-       tegra_pmc_writel(val, PMC_CTRL);
-}
-
-void __init tegra_pmc_init(void)
-{
-       struct device_node *np;
-       u32 prop;
-       enum tegra_suspend_mode suspend_mode;
-       u32 core_good_time[2] = {0, 0};
-       u32 lp0_vec[2] = {0, 0};
-
-       np = of_find_matching_node(NULL, matches);
-       BUG_ON(!np);
-
-       tegra_pclk = of_clk_get_by_name(np, "pclk");
-       WARN_ON(IS_ERR(tegra_pclk));
-
-       /* Grabbing the power management configurations */
-       if (of_property_read_u32(np, "nvidia,suspend-mode", &prop)) {
-               suspend_mode = TEGRA_SUSPEND_NONE;
-       } else {
-               switch (prop) {
-               case 0:
-                       suspend_mode = TEGRA_SUSPEND_LP0;
-                       break;
-               case 1:
-                       suspend_mode = TEGRA_SUSPEND_LP1;
-                       break;
-               case 2:
-                       suspend_mode = TEGRA_SUSPEND_LP2;
-                       break;
-               default:
-                       suspend_mode = TEGRA_SUSPEND_NONE;
-                       break;
-               }
-       }
-       suspend_mode = tegra_pm_validate_suspend_mode(suspend_mode);
-
-       if (of_property_read_u32(np, "nvidia,cpu-pwr-good-time", &prop))
-               suspend_mode = TEGRA_SUSPEND_NONE;
-       pmc_pm_data.cpu_good_time = prop;
-
-       if (of_property_read_u32(np, "nvidia,cpu-pwr-off-time", &prop))
-               suspend_mode = TEGRA_SUSPEND_NONE;
-       pmc_pm_data.cpu_off_time = prop;
-
-       if (of_property_read_u32_array(np, "nvidia,core-pwr-good-time",
-                       core_good_time, ARRAY_SIZE(core_good_time)))
-               suspend_mode = TEGRA_SUSPEND_NONE;
-       pmc_pm_data.core_osc_time = core_good_time[0];
-       pmc_pm_data.core_pmu_time = core_good_time[1];
-
-       if (of_property_read_u32(np, "nvidia,core-pwr-off-time",
-                                &prop))
-               suspend_mode = TEGRA_SUSPEND_NONE;
-       pmc_pm_data.core_off_time = prop;
-
-       pmc_pm_data.corereq_high = of_property_read_bool(np,
-                               "nvidia,core-power-req-active-high");
-
-       pmc_pm_data.sysclkreq_high = of_property_read_bool(np,
-                               "nvidia,sys-clock-req-active-high");
-
-       pmc_pm_data.combined_req = of_property_read_bool(np,
-                               "nvidia,combined-power-req");
-
-       pmc_pm_data.cpu_pwr_good_en = of_property_read_bool(np,
-                               "nvidia,cpu-pwr-good-en");
-
-       if (of_property_read_u32_array(np, "nvidia,lp0-vec", lp0_vec,
-                                      ARRAY_SIZE(lp0_vec)))
-               if (suspend_mode == TEGRA_SUSPEND_LP0)
-                       suspend_mode = TEGRA_SUSPEND_LP1;
-
-       pmc_pm_data.lp0_vec_phy_addr = lp0_vec[0];
-       pmc_pm_data.lp0_vec_size = lp0_vec[1];
-
-       pmc_pm_data.suspend_mode = suspend_mode;
-}
diff --git a/arch/arm/mach-tegra/pmc.h b/arch/arm/mach-tegra/pmc.h
deleted file mode 100644 (file)
index 59e19c3..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2012 NVIDIA CORPORATION. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifndef __MACH_TEGRA_PMC_H
-#define __MACH_TEGRA_PMC_H
-
-#include <linux/reboot.h>
-
-enum tegra_suspend_mode {
-       TEGRA_SUSPEND_NONE = 0,
-       TEGRA_SUSPEND_LP2,      /* CPU voltage off */
-       TEGRA_SUSPEND_LP1,      /* CPU voltage off, DRAM self-refresh */
-       TEGRA_SUSPEND_LP0,      /* CPU + core voltage off, DRAM self-refresh */
-       TEGRA_MAX_SUSPEND_MODE,
-};
-
-#ifdef CONFIG_PM_SLEEP
-enum tegra_suspend_mode tegra_pmc_get_suspend_mode(void);
-void tegra_pmc_set_suspend_mode(enum tegra_suspend_mode mode);
-void tegra_pmc_suspend(void);
-void tegra_pmc_resume(void);
-void tegra_pmc_pm_set(enum tegra_suspend_mode mode);
-void tegra_pmc_suspend_init(void);
-#endif
-
-bool tegra_pmc_cpu_is_powered(int cpuid);
-int tegra_pmc_cpu_power_on(int cpuid);
-int tegra_pmc_cpu_remove_clamping(int cpuid);
-
-void tegra_pmc_restart(enum reboot_mode mode, const char *cmd);
-
-void tegra_pmc_init_irq(void);
-void tegra_pmc_init(void);
-
-#endif
diff --git a/arch/arm/mach-tegra/powergate.c b/arch/arm/mach-tegra/powergate.c
deleted file mode 100644 (file)
index 4cefc5c..0000000
+++ /dev/null
@@ -1,515 +0,0 @@
-/*
- * drivers/powergate/tegra-powergate.c
- *
- * Copyright (c) 2010 Google, Inc
- *
- * Author:
- *     Colin Cross <ccross@google.com>
- *
- * This software is licensed under the terms of the GNU General Public
- * License version 2, as published by the Free Software Foundation, and
- * may be copied, distributed, and modified under those terms.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- */
-
-#include <linux/kernel.h>
-#include <linux/clk.h>
-#include <linux/debugfs.h>
-#include <linux/delay.h>
-#include <linux/err.h>
-#include <linux/export.h>
-#include <linux/init.h>
-#include <linux/io.h>
-#include <linux/reset.h>
-#include <linux/seq_file.h>
-#include <linux/spinlock.h>
-#include <linux/clk/tegra.h>
-#include <linux/tegra-powergate.h>
-
-#include "fuse.h"
-#include "iomap.h"
-
-#define DPD_SAMPLE             0x020
-#define  DPD_SAMPLE_ENABLE     (1 << 0)
-#define  DPD_SAMPLE_DISABLE    (0 << 0)
-
-#define PWRGATE_TOGGLE         0x30
-#define  PWRGATE_TOGGLE_START  (1 << 8)
-
-#define REMOVE_CLAMPING                0x34
-
-#define PWRGATE_STATUS         0x38
-
-#define IO_DPD_REQ             0x1b8
-#define  IO_DPD_REQ_CODE_IDLE  (0 << 30)
-#define  IO_DPD_REQ_CODE_OFF   (1 << 30)
-#define  IO_DPD_REQ_CODE_ON    (2 << 30)
-#define  IO_DPD_REQ_CODE_MASK  (3 << 30)
-
-#define IO_DPD_STATUS          0x1bc
-#define IO_DPD2_REQ            0x1c0
-#define IO_DPD2_STATUS         0x1c4
-#define SEL_DPD_TIM            0x1c8
-
-#define GPU_RG_CNTRL           0x2d4
-
-static int tegra_num_powerdomains;
-static int tegra_num_cpu_domains;
-static const u8 *tegra_cpu_domains;
-
-static const u8 tegra30_cpu_domains[] = {
-       TEGRA_POWERGATE_CPU,
-       TEGRA_POWERGATE_CPU1,
-       TEGRA_POWERGATE_CPU2,
-       TEGRA_POWERGATE_CPU3,
-};
-
-static const u8 tegra114_cpu_domains[] = {
-       TEGRA_POWERGATE_CPU0,
-       TEGRA_POWERGATE_CPU1,
-       TEGRA_POWERGATE_CPU2,
-       TEGRA_POWERGATE_CPU3,
-};
-
-static const u8 tegra124_cpu_domains[] = {
-       TEGRA_POWERGATE_CPU0,
-       TEGRA_POWERGATE_CPU1,
-       TEGRA_POWERGATE_CPU2,
-       TEGRA_POWERGATE_CPU3,
-};
-
-static DEFINE_SPINLOCK(tegra_powergate_lock);
-
-static void __iomem *pmc = IO_ADDRESS(TEGRA_PMC_BASE);
-
-static u32 pmc_read(unsigned long reg)
-{
-       return readl(pmc + reg);
-}
-
-static void pmc_write(u32 val, unsigned long reg)
-{
-       writel(val, pmc + reg);
-}
-
-static int tegra_powergate_set(int id, bool new_state)
-{
-       bool status;
-       unsigned long flags;
-
-       spin_lock_irqsave(&tegra_powergate_lock, flags);
-
-       status = pmc_read(PWRGATE_STATUS) & (1 << id);
-
-       if (status == new_state) {
-               spin_unlock_irqrestore(&tegra_powergate_lock, flags);
-               return 0;
-       }
-
-       pmc_write(PWRGATE_TOGGLE_START | id, PWRGATE_TOGGLE);
-
-       spin_unlock_irqrestore(&tegra_powergate_lock, flags);
-
-       return 0;
-}
-
-int tegra_powergate_power_on(int id)
-{
-       if (id < 0 || id >= tegra_num_powerdomains)
-               return -EINVAL;
-
-       return tegra_powergate_set(id, true);
-}
-
-int tegra_powergate_power_off(int id)
-{
-       if (id < 0 || id >= tegra_num_powerdomains)
-               return -EINVAL;
-
-       return tegra_powergate_set(id, false);
-}
-EXPORT_SYMBOL(tegra_powergate_power_off);
-
-int tegra_powergate_is_powered(int id)
-{
-       u32 status;
-
-       if (id < 0 || id >= tegra_num_powerdomains)
-               return -EINVAL;
-
-       status = pmc_read(PWRGATE_STATUS) & (1 << id);
-       return !!status;
-}
-
-int tegra_powergate_remove_clamping(int id)
-{
-       u32 mask;
-
-       if (id < 0 || id >= tegra_num_powerdomains)
-               return -EINVAL;
-
-       /*
-        * The Tegra124 GPU has a separate register (with different semantics)
-        * to remove clamps.
-        */
-       if (tegra_chip_id == TEGRA124) {
-               if (id == TEGRA_POWERGATE_3D) {
-                       pmc_write(0, GPU_RG_CNTRL);
-                       return 0;
-               }
-       }
-
-       /*
-        * Tegra 2 has a bug where PCIE and VDE clamping masks are
-        * swapped relatively to the partition ids
-        */
-       if (id == TEGRA_POWERGATE_VDEC)
-               mask = (1 << TEGRA_POWERGATE_PCIE);
-       else if (id == TEGRA_POWERGATE_PCIE)
-               mask = (1 << TEGRA_POWERGATE_VDEC);
-       else
-               mask = (1 << id);
-
-       pmc_write(mask, REMOVE_CLAMPING);
-
-       return 0;
-}
-EXPORT_SYMBOL(tegra_powergate_remove_clamping);
-
-/* Must be called with clk disabled, and returns with clk enabled */
-int tegra_powergate_sequence_power_up(int id, struct clk *clk,
-                                       struct reset_control *rst)
-{
-       int ret;
-
-       reset_control_assert(rst);
-
-       ret = tegra_powergate_power_on(id);
-       if (ret)
-               goto err_power;
-
-       ret = clk_prepare_enable(clk);
-       if (ret)
-               goto err_clk;
-
-       udelay(10);
-
-       ret = tegra_powergate_remove_clamping(id);
-       if (ret)
-               goto err_clamp;
-
-       udelay(10);
-       reset_control_deassert(rst);
-
-       return 0;
-
-err_clamp:
-       clk_disable_unprepare(clk);
-err_clk:
-       tegra_powergate_power_off(id);
-err_power:
-       return ret;
-}
-EXPORT_SYMBOL(tegra_powergate_sequence_power_up);
-
-int tegra_cpu_powergate_id(int cpuid)
-{
-       if (cpuid > 0 && cpuid < tegra_num_cpu_domains)
-               return tegra_cpu_domains[cpuid];
-
-       return -EINVAL;
-}
-
-int __init tegra_powergate_init(void)
-{
-       switch (tegra_chip_id) {
-       case TEGRA20:
-               tegra_num_powerdomains = 7;
-               break;
-       case TEGRA30:
-               tegra_num_powerdomains = 14;
-               tegra_num_cpu_domains = 4;
-               tegra_cpu_domains = tegra30_cpu_domains;
-               break;
-       case TEGRA114:
-               tegra_num_powerdomains = 23;
-               tegra_num_cpu_domains = 4;
-               tegra_cpu_domains = tegra114_cpu_domains;
-               break;
-       case TEGRA124:
-               tegra_num_powerdomains = 25;
-               tegra_num_cpu_domains = 4;
-               tegra_cpu_domains = tegra124_cpu_domains;
-               break;
-       default:
-               /* Unknown Tegra variant. Disable powergating */
-               tegra_num_powerdomains = 0;
-               break;
-       }
-
-       return 0;
-}
-
-#ifdef CONFIG_DEBUG_FS
-
-static const char * const *powergate_name;
-
-static const char * const powergate_name_t20[] = {
-       [TEGRA_POWERGATE_CPU]   = "cpu",
-       [TEGRA_POWERGATE_3D]    = "3d",
-       [TEGRA_POWERGATE_VENC]  = "venc",
-       [TEGRA_POWERGATE_VDEC]  = "vdec",
-       [TEGRA_POWERGATE_PCIE]  = "pcie",
-       [TEGRA_POWERGATE_L2]    = "l2",
-       [TEGRA_POWERGATE_MPE]   = "mpe",
-};
-
-static const char * const powergate_name_t30[] = {
-       [TEGRA_POWERGATE_CPU]   = "cpu0",
-       [TEGRA_POWERGATE_3D]    = "3d0",
-       [TEGRA_POWERGATE_VENC]  = "venc",
-       [TEGRA_POWERGATE_VDEC]  = "vdec",
-       [TEGRA_POWERGATE_PCIE]  = "pcie",
-       [TEGRA_POWERGATE_L2]    = "l2",
-       [TEGRA_POWERGATE_MPE]   = "mpe",
-       [TEGRA_POWERGATE_HEG]   = "heg",
-       [TEGRA_POWERGATE_SATA]  = "sata",
-       [TEGRA_POWERGATE_CPU1]  = "cpu1",
-       [TEGRA_POWERGATE_CPU2]  = "cpu2",
-       [TEGRA_POWERGATE_CPU3]  = "cpu3",
-       [TEGRA_POWERGATE_CELP]  = "celp",
-       [TEGRA_POWERGATE_3D1]   = "3d1",
-};
-
-static const char * const powergate_name_t114[] = {
-       [TEGRA_POWERGATE_CPU]   = "crail",
-       [TEGRA_POWERGATE_3D]    = "3d",
-       [TEGRA_POWERGATE_VENC]  = "venc",
-       [TEGRA_POWERGATE_VDEC]  = "vdec",
-       [TEGRA_POWERGATE_MPE]   = "mpe",
-       [TEGRA_POWERGATE_HEG]   = "heg",
-       [TEGRA_POWERGATE_CPU1]  = "cpu1",
-       [TEGRA_POWERGATE_CPU2]  = "cpu2",
-       [TEGRA_POWERGATE_CPU3]  = "cpu3",
-       [TEGRA_POWERGATE_CELP]  = "celp",
-       [TEGRA_POWERGATE_CPU0]  = "cpu0",
-       [TEGRA_POWERGATE_C0NC]  = "c0nc",
-       [TEGRA_POWERGATE_C1NC]  = "c1nc",
-       [TEGRA_POWERGATE_DIS]   = "dis",
-       [TEGRA_POWERGATE_DISB]  = "disb",
-       [TEGRA_POWERGATE_XUSBA] = "xusba",
-       [TEGRA_POWERGATE_XUSBB] = "xusbb",
-       [TEGRA_POWERGATE_XUSBC] = "xusbc",
-};
-
-static const char * const powergate_name_t124[] = {
-       [TEGRA_POWERGATE_CPU]   = "crail",
-       [TEGRA_POWERGATE_3D]    = "3d",
-       [TEGRA_POWERGATE_VENC]  = "venc",
-       [TEGRA_POWERGATE_PCIE]  = "pcie",
-       [TEGRA_POWERGATE_VDEC]  = "vdec",
-       [TEGRA_POWERGATE_L2]    = "l2",
-       [TEGRA_POWERGATE_MPE]   = "mpe",
-       [TEGRA_POWERGATE_HEG]   = "heg",
-       [TEGRA_POWERGATE_SATA]  = "sata",
-       [TEGRA_POWERGATE_CPU1]  = "cpu1",
-       [TEGRA_POWERGATE_CPU2]  = "cpu2",
-       [TEGRA_POWERGATE_CPU3]  = "cpu3",
-       [TEGRA_POWERGATE_CELP]  = "celp",
-       [TEGRA_POWERGATE_CPU0]  = "cpu0",
-       [TEGRA_POWERGATE_C0NC]  = "c0nc",
-       [TEGRA_POWERGATE_C1NC]  = "c1nc",
-       [TEGRA_POWERGATE_SOR]   = "sor",
-       [TEGRA_POWERGATE_DIS]   = "dis",
-       [TEGRA_POWERGATE_DISB]  = "disb",
-       [TEGRA_POWERGATE_XUSBA] = "xusba",
-       [TEGRA_POWERGATE_XUSBB] = "xusbb",
-       [TEGRA_POWERGATE_XUSBC] = "xusbc",
-       [TEGRA_POWERGATE_VIC]   = "vic",
-       [TEGRA_POWERGATE_IRAM]  = "iram",
-};
-
-static int powergate_show(struct seq_file *s, void *data)
-{
-       int i;
-
-       seq_printf(s, " powergate powered\n");
-       seq_printf(s, "------------------\n");
-
-       for (i = 0; i < tegra_num_powerdomains; i++) {
-               if (!powergate_name[i])
-                       continue;
-
-               seq_printf(s, " %9s %7s\n", powergate_name[i],
-                       tegra_powergate_is_powered(i) ? "yes" : "no");
-       }
-
-       return 0;
-}
-
-static int powergate_open(struct inode *inode, struct file *file)
-{
-       return single_open(file, powergate_show, inode->i_private);
-}
-
-static const struct file_operations powergate_fops = {
-       .open           = powergate_open,
-       .read           = seq_read,
-       .llseek         = seq_lseek,
-       .release        = single_release,
-};
-
-int __init tegra_powergate_debugfs_init(void)
-{
-       struct dentry *d;
-
-       switch (tegra_chip_id) {
-       case TEGRA20:
-               powergate_name = powergate_name_t20;
-               break;
-       case TEGRA30:
-               powergate_name = powergate_name_t30;
-               break;
-       case TEGRA114:
-               powergate_name = powergate_name_t114;
-               break;
-       case TEGRA124:
-               powergate_name = powergate_name_t124;
-               break;
-       }
-
-       if (powergate_name) {
-               d = debugfs_create_file("powergate", S_IRUGO, NULL, NULL,
-                       &powergate_fops);
-               if (!d)
-                       return -ENOMEM;
-       }
-
-       return 0;
-}
-
-#endif
-
-static int tegra_io_rail_prepare(int id, unsigned long *request,
-                                unsigned long *status, unsigned int *bit)
-{
-       unsigned long rate, value;
-       struct clk *clk;
-
-       *bit = id % 32;
-
-       /*
-        * There are two sets of 30 bits to select IO rails, but bits 30 and
-        * 31 are control bits rather than IO rail selection bits.
-        */
-       if (id > 63 || *bit == 30 || *bit == 31)
-               return -EINVAL;
-
-       if (id < 32) {
-               *status = IO_DPD_STATUS;
-               *request = IO_DPD_REQ;
-       } else {
-               *status = IO_DPD2_STATUS;
-               *request = IO_DPD2_REQ;
-       }
-
-       clk = clk_get_sys(NULL, "pclk");
-       if (IS_ERR(clk))
-               return PTR_ERR(clk);
-
-       rate = clk_get_rate(clk);
-       clk_put(clk);
-
-       pmc_write(DPD_SAMPLE_ENABLE, DPD_SAMPLE);
-
-       /* must be at least 200 ns, in APB (PCLK) clock cycles */
-       value = DIV_ROUND_UP(1000000000, rate);
-       value = DIV_ROUND_UP(200, value);
-       pmc_write(value, SEL_DPD_TIM);
-
-       return 0;
-}
-
-static int tegra_io_rail_poll(unsigned long offset, unsigned long mask,
-                             unsigned long val, unsigned long timeout)
-{
-       unsigned long value;
-
-       timeout = jiffies + msecs_to_jiffies(timeout);
-
-       while (time_after(timeout, jiffies)) {
-               value = pmc_read(offset);
-               if ((value & mask) == val)
-                       return 0;
-
-               usleep_range(250, 1000);
-       }
-
-       return -ETIMEDOUT;
-}
-
-static void tegra_io_rail_unprepare(void)
-{
-       pmc_write(DPD_SAMPLE_DISABLE, DPD_SAMPLE);
-}
-
-int tegra_io_rail_power_on(int id)
-{
-       unsigned long request, status, value;
-       unsigned int bit, mask;
-       int err;
-
-       err = tegra_io_rail_prepare(id, &request, &status, &bit);
-       if (err < 0)
-               return err;
-
-       mask = 1 << bit;
-
-       value = pmc_read(request);
-       value |= mask;
-       value &= ~IO_DPD_REQ_CODE_MASK;
-       value |= IO_DPD_REQ_CODE_OFF;
-       pmc_write(value, request);
-
-       err = tegra_io_rail_poll(status, mask, 0, 250);
-       if (err < 0)
-               return err;
-
-       tegra_io_rail_unprepare();
-
-       return 0;
-}
-EXPORT_SYMBOL(tegra_io_rail_power_on);
-
-int tegra_io_rail_power_off(int id)
-{
-       unsigned long request, status, value;
-       unsigned int bit, mask;
-       int err;
-
-       err = tegra_io_rail_prepare(id, &request, &status, &bit);
-       if (err < 0)
-               return err;
-
-       mask = 1 << bit;
-
-       value = pmc_read(request);
-       value |= mask;
-       value &= ~IO_DPD_REQ_CODE_MASK;
-       value |= IO_DPD_REQ_CODE_ON;
-       pmc_write(value, request);
-
-       err = tegra_io_rail_poll(status, mask, mask, 250);
-       if (err < 0)
-               return err;
-
-       tegra_io_rail_unprepare();
-
-       return 0;
-}
-EXPORT_SYMBOL(tegra_io_rail_power_off);
index 578d4d1ad64882dbc27052b4741560ba6e15ecfa..7b2baab0f0bd38751bd4065e67a47b93ac010668 100644 (file)
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include <linux/linkage.h>
 #include <linux/init.h>
+#include <linux/linkage.h>
+
+#include <soc/tegra/fuse.h>
 
-#include <asm/cache.h>
 #include <asm/asm-offsets.h>
+#include <asm/cache.h>
 
 #include "flowctrl.h"
-#include "fuse.h"
 #include "iomap.h"
 #include "reset.h"
 #include "sleep.h"
index 146fe8e0ae7ce52eea0e960c3c508ebb0a35f3b6..894c5c472184f9cf9c08f34966b83ff982766939 100644 (file)
  *
  */
 
+#include <linux/bitops.h>
+#include <linux/cpumask.h>
 #include <linux/init.h>
 #include <linux/io.h>
-#include <linux/cpumask.h>
-#include <linux/bitops.h>
+
+#include <soc/tegra/fuse.h>
 
 #include <asm/cacheflush.h>
-#include <asm/hardware/cache-l2x0.h>
 #include <asm/firmware.h>
+#include <asm/hardware/cache-l2x0.h>
 
 #include "iomap.h"
 #include "irammap.h"
 #include "reset.h"
 #include "sleep.h"
-#include "fuse.h"
 
 #define TEGRA_IRAM_RESET_BASE (TEGRA_IRAM_BASE + \
                                TEGRA_IRAM_RESET_HANDLER_OFFSET)
@@ -53,12 +54,10 @@ static void __init tegra_cpu_reset_handler_set(const u32 reset_address)
         * Prevent further modifications to the physical reset vector.
         *  NOTE: Has no effect on chips prior to Tegra30.
         */
-       if (tegra_chip_id != TEGRA20) {
-               reg = readl(sb_ctrl);
-               reg |= 2;
-               writel(reg, sb_ctrl);
-               wmb();
-       }
+       reg = readl(sb_ctrl);
+       reg |= 2;
+       writel(reg, sb_ctrl);
+       wmb();
 }
 
 static void __init tegra_cpu_reset_handler_enable(void)
index 09cad9b071debe6f6569c1841021bc31e81819b2..5d8d13aeab937f0f9fd5348cd34cf5e638035769 100644 (file)
 
 #include <linux/linkage.h>
 
-#include <asm/assembler.h>
+#include <soc/tegra/fuse.h>
+
 #include <asm/asm-offsets.h>
+#include <asm/assembler.h>
 #include <asm/cache.h>
 
+#include "flowctrl.h"
 #include "irammap.h"
-#include "fuse.h"
 #include "sleep.h"
-#include "flowctrl.h"
 
 #define EMC_CFG                                0xc
 #define EMC_ADR_CFG                    0x10
index 339fe42cd6fb2635f37c1f34f4b6530a5f86daeb..92d46ec1361abba6f8beb6130d753ea634c8933a 100644 (file)
@@ -130,9 +130,6 @@ void tegra_disable_clean_inv_dcache(u32 flag);
 #ifdef CONFIG_HOTPLUG_CPU
 void tegra20_hotplug_shutdown(void);
 void tegra30_hotplug_shutdown(void);
-void tegra_hotplug_init(void);
-#else
-static inline void tegra_hotplug_init(void) {}
 #endif
 
 void tegra20_cpu_shutdown(int cpu);
index 15ac9fcc96b1ce034565dd5ec2ae44e2b5844134..5ef5173dec83bf32b68ea0c5931a9aa03547ad84 100644 (file)
  *
  */
 
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/platform_device.h>
-#include <linux/serial_8250.h>
 #include <linux/clk.h>
+#include <linux/clk/tegra.h>
 #include <linux/dma-mapping.h>
+#include <linux/init.h>
+#include <linux/io.h>
+#include <linux/irqchip.h>
 #include <linux/irqdomain.h>
-#include <linux/of.h>
+#include <linux/kernel.h>
 #include <linux/of_address.h>
 #include <linux/of_fdt.h>
+#include <linux/of.h>
 #include <linux/of_platform.h>
 #include <linux/pda_power.h>
-#include <linux/io.h>
+#include <linux/platform_device.h>
+#include <linux/serial_8250.h>
 #include <linux/slab.h>
 #include <linux/sys_soc.h>
 #include <linux/usb/tegra_usb_phy.h>
-#include <linux/clk/tegra.h>
-#include <linux/irqchip.h>
+
+#include <soc/tegra/fuse.h>
+#include <soc/tegra/pmc.h>
 
 #include <asm/hardware/cache-l2x0.h>
-#include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/time.h>
+#include <asm/mach-types.h>
 #include <asm/setup.h>
 #include <asm/trusted_foundations.h>
 
-#include "apbio.h"
 #include "board.h"
 #include "common.h"
 #include "cpuidle.h"
-#include "fuse.h"
 #include "iomap.h"
 #include "irq.h"
-#include "pmc.h"
 #include "pm.h"
 #include "reset.h"
 #include "sleep.h"
@@ -73,16 +73,11 @@ u32 tegra_uart_config[3] = {
 static void __init tegra_init_early(void)
 {
        of_register_trusted_foundations();
-       tegra_apb_io_init();
-       tegra_init_fuse();
        tegra_cpu_reset_handler_init();
-       tegra_powergate_init();
-       tegra_hotplug_init();
 }
 
 static void __init tegra_dt_init_irq(void)
 {
-       tegra_pmc_init_irq();
        tegra_init_irq();
        irqchip_init();
        tegra_legacy_irq_syscore_init();
@@ -94,8 +89,6 @@ static void __init tegra_dt_init(void)
        struct soc_device *soc_dev;
        struct device *parent = NULL;
 
-       tegra_pmc_init();
-
        tegra_clocks_apply_init_table();
 
        soc_dev_attr = kzalloc(sizeof(*soc_dev_attr), GFP_KERNEL);
@@ -103,8 +96,9 @@ static void __init tegra_dt_init(void)
                goto out;
 
        soc_dev_attr->family = kasprintf(GFP_KERNEL, "Tegra");
-       soc_dev_attr->revision = kasprintf(GFP_KERNEL, "%d", tegra_revision);
-       soc_dev_attr->soc_id = kasprintf(GFP_KERNEL, "%d", tegra_chip_id);
+       soc_dev_attr->revision = kasprintf(GFP_KERNEL, "%d",
+                                          tegra_sku_info.revision);
+       soc_dev_attr->soc_id = kasprintf(GFP_KERNEL, "%u", tegra_get_chip_id());
 
        soc_dev = soc_device_register(soc_dev_attr);
        if (IS_ERR(soc_dev)) {
@@ -144,7 +138,6 @@ static void __init tegra_dt_init_late(void)
 
        tegra_init_suspend();
        tegra_cpuidle_init();
-       tegra_powergate_debugfs_init();
 
        for (i = 0; i < ARRAY_SIZE(board_init_funcs); i++) {
                if (of_machine_is_compatible(board_init_funcs[i].machine)) {
diff --git a/arch/arm/mach-tegra/tegra114_speedo.c b/arch/arm/mach-tegra/tegra114_speedo.c
deleted file mode 100644 (file)
index 5218d48..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright (c) 2013, NVIDIA CORPORATION.  All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <linux/kernel.h>
-#include <linux/bug.h>
-
-#include "fuse.h"
-
-#define CORE_PROCESS_CORNERS_NUM       2
-#define CPU_PROCESS_CORNERS_NUM                2
-
-enum {
-       THRESHOLD_INDEX_0,
-       THRESHOLD_INDEX_1,
-       THRESHOLD_INDEX_COUNT,
-};
-
-static const u32 core_process_speedos[][CORE_PROCESS_CORNERS_NUM] = {
-       {1123,     UINT_MAX},
-       {0,        UINT_MAX},
-};
-
-static const u32 cpu_process_speedos[][CPU_PROCESS_CORNERS_NUM] = {
-       {1695,     UINT_MAX},
-       {0,        UINT_MAX},
-};
-
-static void rev_sku_to_speedo_ids(int rev, int sku, int *threshold)
-{
-       u32 tmp;
-
-       switch (sku) {
-       case 0x00:
-       case 0x10:
-       case 0x05:
-       case 0x06:
-               tegra_cpu_speedo_id = 1;
-               tegra_soc_speedo_id = 0;
-               *threshold = THRESHOLD_INDEX_0;
-               break;
-
-       case 0x03:
-       case 0x04:
-               tegra_cpu_speedo_id = 2;
-               tegra_soc_speedo_id = 1;
-               *threshold = THRESHOLD_INDEX_1;
-               break;
-
-       default:
-               pr_err("Tegra114 Unknown SKU %d\n", sku);
-               tegra_cpu_speedo_id = 0;
-               tegra_soc_speedo_id = 0;
-               *threshold = THRESHOLD_INDEX_0;
-               break;
-       }
-
-       if (rev == TEGRA_REVISION_A01) {
-               tmp = tegra_fuse_readl(0x270) << 1;
-               tmp |= tegra_fuse_readl(0x26c);
-               if (!tmp)
-                       tegra_cpu_speedo_id = 0;
-       }
-}
-
-void tegra114_init_speedo_data(void)
-{
-       u32 cpu_speedo_val;
-       u32 core_speedo_val;
-       int threshold;
-       int i;
-
-       BUILD_BUG_ON(ARRAY_SIZE(cpu_process_speedos) !=
-                       THRESHOLD_INDEX_COUNT);
-       BUILD_BUG_ON(ARRAY_SIZE(core_process_speedos) !=
-                       THRESHOLD_INDEX_COUNT);
-
-       rev_sku_to_speedo_ids(tegra_revision, tegra_sku_id, &threshold);
-
-       cpu_speedo_val = tegra_fuse_readl(0x12c) + 1024;
-       core_speedo_val = tegra_fuse_readl(0x134);
-
-       for (i = 0; i < CPU_PROCESS_CORNERS_NUM; i++)
-               if (cpu_speedo_val < cpu_process_speedos[threshold][i])
-                       break;
-       tegra_cpu_process_id = i;
-
-       for (i = 0; i < CORE_PROCESS_CORNERS_NUM; i++)
-               if (core_speedo_val < core_process_speedos[threshold][i])
-                       break;
-       tegra_core_process_id = i;
-}
diff --git a/arch/arm/mach-tegra/tegra20_speedo.c b/arch/arm/mach-tegra/tegra20_speedo.c
deleted file mode 100644 (file)
index fa6eb57..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <linux/kernel.h>
-#include <linux/bug.h>
-
-#include "fuse.h"
-
-#define CPU_SPEEDO_LSBIT               20
-#define CPU_SPEEDO_MSBIT               29
-#define CPU_SPEEDO_REDUND_LSBIT                30
-#define CPU_SPEEDO_REDUND_MSBIT                39
-#define CPU_SPEEDO_REDUND_OFFS (CPU_SPEEDO_REDUND_MSBIT - CPU_SPEEDO_MSBIT)
-
-#define CORE_SPEEDO_LSBIT              40
-#define CORE_SPEEDO_MSBIT              47
-#define CORE_SPEEDO_REDUND_LSBIT       48
-#define CORE_SPEEDO_REDUND_MSBIT       55
-#define CORE_SPEEDO_REDUND_OFFS        (CORE_SPEEDO_REDUND_MSBIT - CORE_SPEEDO_MSBIT)
-
-#define SPEEDO_MULT                    4
-
-#define PROCESS_CORNERS_NUM            4
-
-#define SPEEDO_ID_SELECT_0(rev)                ((rev) <= 2)
-#define SPEEDO_ID_SELECT_1(sku)                \
-       (((sku) != 20) && ((sku) != 23) && ((sku) != 24) && \
-        ((sku) != 27) && ((sku) != 28))
-
-enum {
-       SPEEDO_ID_0,
-       SPEEDO_ID_1,
-       SPEEDO_ID_2,
-       SPEEDO_ID_COUNT,
-};
-
-static const u32 cpu_process_speedos[][PROCESS_CORNERS_NUM] = {
-       {315, 366, 420, UINT_MAX},
-       {303, 368, 419, UINT_MAX},
-       {316, 331, 383, UINT_MAX},
-};
-
-static const u32 core_process_speedos[][PROCESS_CORNERS_NUM] = {
-       {165, 195, 224, UINT_MAX},
-       {165, 195, 224, UINT_MAX},
-       {165, 195, 224, UINT_MAX},
-};
-
-void tegra20_init_speedo_data(void)
-{
-       u32 reg;
-       u32 val;
-       int i;
-
-       BUILD_BUG_ON(ARRAY_SIZE(cpu_process_speedos) != SPEEDO_ID_COUNT);
-       BUILD_BUG_ON(ARRAY_SIZE(core_process_speedos) != SPEEDO_ID_COUNT);
-
-       if (SPEEDO_ID_SELECT_0(tegra_revision))
-               tegra_soc_speedo_id = SPEEDO_ID_0;
-       else if (SPEEDO_ID_SELECT_1(tegra_sku_id))
-               tegra_soc_speedo_id = SPEEDO_ID_1;
-       else
-               tegra_soc_speedo_id = SPEEDO_ID_2;
-
-       val = 0;
-       for (i = CPU_SPEEDO_MSBIT; i >= CPU_SPEEDO_LSBIT; i--) {
-               reg = tegra_spare_fuse(i) |
-                       tegra_spare_fuse(i + CPU_SPEEDO_REDUND_OFFS);
-               val = (val << 1) | (reg & 0x1);
-       }
-       val = val * SPEEDO_MULT;
-       pr_debug("%s CPU speedo value %u\n", __func__, val);
-
-       for (i = 0; i < (PROCESS_CORNERS_NUM - 1); i++) {
-               if (val <= cpu_process_speedos[tegra_soc_speedo_id][i])
-                       break;
-       }
-       tegra_cpu_process_id = i;
-
-       val = 0;
-       for (i = CORE_SPEEDO_MSBIT; i >= CORE_SPEEDO_LSBIT; i--) {
-               reg = tegra_spare_fuse(i) |
-                       tegra_spare_fuse(i + CORE_SPEEDO_REDUND_OFFS);
-               val = (val << 1) | (reg & 0x1);
-       }
-       val = val * SPEEDO_MULT;
-       pr_debug("%s Core speedo value %u\n", __func__, val);
-
-       for (i = 0; i < (PROCESS_CORNERS_NUM - 1); i++) {
-               if (val <= core_process_speedos[tegra_soc_speedo_id][i])
-                       break;
-       }
-       tegra_core_process_id = i;
-
-       pr_info("Tegra20 Soc Speedo ID %d", tegra_soc_speedo_id);
-}
diff --git a/arch/arm/mach-tegra/tegra30_speedo.c b/arch/arm/mach-tegra/tegra30_speedo.c
deleted file mode 100644 (file)
index 125cb16..0000000
+++ /dev/null
@@ -1,292 +0,0 @@
-/*
- * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <linux/kernel.h>
-#include <linux/bug.h>
-
-#include "fuse.h"
-
-#define CORE_PROCESS_CORNERS_NUM       1
-#define CPU_PROCESS_CORNERS_NUM                6
-
-#define FUSE_SPEEDO_CALIB_0    0x114
-#define FUSE_PACKAGE_INFO      0X1FC
-#define FUSE_TEST_PROG_VER     0X128
-
-#define G_SPEEDO_BIT_MINUS1    58
-#define G_SPEEDO_BIT_MINUS1_R  59
-#define G_SPEEDO_BIT_MINUS2    60
-#define G_SPEEDO_BIT_MINUS2_R  61
-#define LP_SPEEDO_BIT_MINUS1   62
-#define LP_SPEEDO_BIT_MINUS1_R 63
-#define LP_SPEEDO_BIT_MINUS2   64
-#define LP_SPEEDO_BIT_MINUS2_R 65
-
-enum {
-       THRESHOLD_INDEX_0,
-       THRESHOLD_INDEX_1,
-       THRESHOLD_INDEX_2,
-       THRESHOLD_INDEX_3,
-       THRESHOLD_INDEX_4,
-       THRESHOLD_INDEX_5,
-       THRESHOLD_INDEX_6,
-       THRESHOLD_INDEX_7,
-       THRESHOLD_INDEX_8,
-       THRESHOLD_INDEX_9,
-       THRESHOLD_INDEX_10,
-       THRESHOLD_INDEX_11,
-       THRESHOLD_INDEX_COUNT,
-};
-
-static const u32 core_process_speedos[][CORE_PROCESS_CORNERS_NUM] = {
-       {180},
-       {170},
-       {195},
-       {180},
-       {168},
-       {192},
-       {180},
-       {170},
-       {195},
-       {180},
-       {180},
-       {180},
-};
-
-static const u32 cpu_process_speedos[][CPU_PROCESS_CORNERS_NUM] = {
-       {306, 338, 360, 376, UINT_MAX},
-       {295, 336, 358, 375, UINT_MAX},
-       {325, 325, 358, 375, UINT_MAX},
-       {325, 325, 358, 375, UINT_MAX},
-       {292, 324, 348, 364, UINT_MAX},
-       {324, 324, 348, 364, UINT_MAX},
-       {324, 324, 348, 364, UINT_MAX},
-       {295, 336, 358, 375, UINT_MAX},
-       {358, 358, 358, 358, 397, UINT_MAX},
-       {364, 364, 364, 364, 397, UINT_MAX},
-       {295, 336, 358, 375, 391, UINT_MAX},
-       {295, 336, 358, 375, 391, UINT_MAX},
-};
-
-static int threshold_index;
-static int package_id;
-
-static void fuse_speedo_calib(u32 *speedo_g, u32 *speedo_lp)
-{
-       u32 reg;
-       int ate_ver;
-       int bit_minus1;
-       int bit_minus2;
-
-       reg = tegra_fuse_readl(FUSE_SPEEDO_CALIB_0);
-
-       *speedo_lp = (reg & 0xFFFF) * 4;
-       *speedo_g = ((reg >> 16) & 0xFFFF) * 4;
-
-       ate_ver = tegra_fuse_readl(FUSE_TEST_PROG_VER);
-       pr_info("%s: ATE prog ver %d.%d\n", __func__, ate_ver/10, ate_ver%10);
-
-       if (ate_ver >= 26) {
-               bit_minus1 = tegra_spare_fuse(LP_SPEEDO_BIT_MINUS1);
-               bit_minus1 |= tegra_spare_fuse(LP_SPEEDO_BIT_MINUS1_R);
-               bit_minus2 = tegra_spare_fuse(LP_SPEEDO_BIT_MINUS2);
-               bit_minus2 |= tegra_spare_fuse(LP_SPEEDO_BIT_MINUS2_R);
-               *speedo_lp |= (bit_minus1 << 1) | bit_minus2;
-
-               bit_minus1 = tegra_spare_fuse(G_SPEEDO_BIT_MINUS1);
-               bit_minus1 |= tegra_spare_fuse(G_SPEEDO_BIT_MINUS1_R);
-               bit_minus2 = tegra_spare_fuse(G_SPEEDO_BIT_MINUS2);
-               bit_minus2 |= tegra_spare_fuse(G_SPEEDO_BIT_MINUS2_R);
-               *speedo_g |= (bit_minus1 << 1) | bit_minus2;
-       } else {
-               *speedo_lp |= 0x3;
-               *speedo_g |= 0x3;
-       }
-}
-
-static void rev_sku_to_speedo_ids(int rev, int sku)
-{
-       switch (rev) {
-       case TEGRA_REVISION_A01:
-               tegra_cpu_speedo_id = 0;
-               tegra_soc_speedo_id = 0;
-               threshold_index = THRESHOLD_INDEX_0;
-               break;
-       case TEGRA_REVISION_A02:
-       case TEGRA_REVISION_A03:
-               switch (sku) {
-               case 0x87:
-               case 0x82:
-                       tegra_cpu_speedo_id = 1;
-                       tegra_soc_speedo_id = 1;
-                       threshold_index = THRESHOLD_INDEX_1;
-                       break;
-               case 0x81:
-                       switch (package_id) {
-                       case 1:
-                               tegra_cpu_speedo_id = 2;
-                               tegra_soc_speedo_id = 2;
-                               threshold_index = THRESHOLD_INDEX_2;
-                               break;
-                       case 2:
-                               tegra_cpu_speedo_id = 4;
-                               tegra_soc_speedo_id = 1;
-                               threshold_index = THRESHOLD_INDEX_7;
-                               break;
-                       default:
-                               pr_err("Tegra30: Unknown pkg %d\n", package_id);
-                               BUG();
-                               break;
-                       }
-                       break;
-               case 0x80:
-                       switch (package_id) {
-                       case 1:
-                               tegra_cpu_speedo_id = 5;
-                               tegra_soc_speedo_id = 2;
-                               threshold_index = THRESHOLD_INDEX_8;
-                               break;
-                       case 2:
-                               tegra_cpu_speedo_id = 6;
-                               tegra_soc_speedo_id = 2;
-                               threshold_index = THRESHOLD_INDEX_9;
-                               break;
-                       default:
-                               pr_err("Tegra30: Unknown pkg %d\n", package_id);
-                               BUG();
-                               break;
-                       }
-                       break;
-               case 0x83:
-                       switch (package_id) {
-                       case 1:
-                               tegra_cpu_speedo_id = 7;
-                               tegra_soc_speedo_id = 1;
-                               threshold_index = THRESHOLD_INDEX_10;
-                               break;
-                       case 2:
-                               tegra_cpu_speedo_id = 3;
-                               tegra_soc_speedo_id = 2;
-                               threshold_index = THRESHOLD_INDEX_3;
-                               break;
-                       default:
-                               pr_err("Tegra30: Unknown pkg %d\n", package_id);
-                               BUG();
-                               break;
-                       }
-                       break;
-               case 0x8F:
-                       tegra_cpu_speedo_id = 8;
-                       tegra_soc_speedo_id = 1;
-                       threshold_index = THRESHOLD_INDEX_11;
-                       break;
-               case 0x08:
-                       tegra_cpu_speedo_id = 1;
-                       tegra_soc_speedo_id = 1;
-                       threshold_index = THRESHOLD_INDEX_4;
-                       break;
-               case 0x02:
-                       tegra_cpu_speedo_id = 2;
-                       tegra_soc_speedo_id = 2;
-                       threshold_index = THRESHOLD_INDEX_5;
-                       break;
-               case 0x04:
-                       tegra_cpu_speedo_id = 3;
-                       tegra_soc_speedo_id = 2;
-                       threshold_index = THRESHOLD_INDEX_6;
-                       break;
-               case 0:
-                       switch (package_id) {
-                       case 1:
-                               tegra_cpu_speedo_id = 2;
-                               tegra_soc_speedo_id = 2;
-                               threshold_index = THRESHOLD_INDEX_2;
-                               break;
-                       case 2:
-                               tegra_cpu_speedo_id = 3;
-                               tegra_soc_speedo_id = 2;
-                               threshold_index = THRESHOLD_INDEX_3;
-                               break;
-                       default:
-                               pr_err("Tegra30: Unknown pkg %d\n", package_id);
-                               BUG();
-                               break;
-                       }
-                       break;
-               default:
-                       pr_warn("Tegra30: Unknown SKU %d\n", sku);
-                       tegra_cpu_speedo_id = 0;
-                       tegra_soc_speedo_id = 0;
-                       threshold_index = THRESHOLD_INDEX_0;
-                       break;
-               }
-               break;
-       default:
-               pr_warn("Tegra30: Unknown chip rev %d\n", rev);
-               tegra_cpu_speedo_id = 0;
-               tegra_soc_speedo_id = 0;
-               threshold_index = THRESHOLD_INDEX_0;
-               break;
-       }
-}
-
-void tegra30_init_speedo_data(void)
-{
-       u32 cpu_speedo_val;
-       u32 core_speedo_val;
-       int i;
-
-       BUILD_BUG_ON(ARRAY_SIZE(cpu_process_speedos) !=
-                       THRESHOLD_INDEX_COUNT);
-       BUILD_BUG_ON(ARRAY_SIZE(core_process_speedos) !=
-                       THRESHOLD_INDEX_COUNT);
-
-       package_id = tegra_fuse_readl(FUSE_PACKAGE_INFO) & 0x0F;
-
-       rev_sku_to_speedo_ids(tegra_revision, tegra_sku_id);
-       fuse_speedo_calib(&cpu_speedo_val, &core_speedo_val);
-       pr_debug("%s CPU speedo value %u\n", __func__, cpu_speedo_val);
-       pr_debug("%s Core speedo value %u\n", __func__, core_speedo_val);
-
-       for (i = 0; i < CPU_PROCESS_CORNERS_NUM; i++) {
-               if (cpu_speedo_val < cpu_process_speedos[threshold_index][i])
-                       break;
-       }
-       tegra_cpu_process_id = i - 1;
-
-       if (tegra_cpu_process_id == -1) {
-               pr_warn("Tegra30: CPU speedo value %3d out of range",
-                      cpu_speedo_val);
-               tegra_cpu_process_id = 0;
-               tegra_cpu_speedo_id = 1;
-       }
-
-       for (i = 0; i < CORE_PROCESS_CORNERS_NUM; i++) {
-               if (core_speedo_val < core_process_speedos[threshold_index][i])
-                       break;
-       }
-       tegra_core_process_id = i - 1;
-
-       if (tegra_core_process_id == -1) {
-               pr_warn("Tegra30: CORE speedo value %3d out of range",
-                      core_speedo_val);
-               tegra_core_process_id = 0;
-               tegra_soc_speedo_id = 1;
-       }
-
-       pr_info("Tegra30: CPU Speedo ID %d, Soc Speedo ID %d",
-               tegra_cpu_speedo_id, tegra_soc_speedo_id);
-}
index a4e139aa244125431a838990320937f2d7d40c77..32d744e91ec2164d498ee986349af598f4ae20e2 100644 (file)
@@ -796,7 +796,7 @@ static struct ab8500_regulator_reg_init ab8505_reg_init[] = {
        INIT_REGULATOR_REGISTER(AB8505_CTRLVAUX6,              0x00, 0x00),
 };
 
-struct regulator_init_data ab8505_regulators[AB8505_NUM_REGULATORS] = {
+static struct regulator_init_data ab8505_regulators[AB8505_NUM_REGULATORS] = {
        /* supplies to the display/camera */
        [AB8505_LDO_AUX1] = {
                .constraints = {
index 842ebedbdd1c3dee176fb06df4f52c377c9cf530..e97ee556f92f8535e5f29f4cc5b369bfe73c3ab8 100644 (file)
@@ -7,17 +7,15 @@
 #include <linux/io.h>
 #include <linux/of.h>
 
-#include <asm/cacheflush.h>
 #include <asm/hardware/cache-l2x0.h>
 
 #include "db8500-regs.h"
 #include "id.h"
 
-static void __iomem *l2x0_base;
-
 static int __init ux500_l2x0_unlock(void)
 {
        int i;
+       void __iomem *l2x0_base = __io_address(U8500_L2CC_BASE);
 
        /*
         * Unlock Data and Instruction Lock if locked. Ux500 U-Boot versions
@@ -45,23 +43,15 @@ static void ux500_l2c310_write_sec(unsigned long val, unsigned reg)
 
 static int __init ux500_l2x0_init(void)
 {
-       if (cpu_is_u8500_family() || cpu_is_ux540_family())
-               l2x0_base = __io_address(U8500_L2CC_BASE);
-       else
-               /* Non-Ux500 platform */
+       /* Multiplatform guard */
+       if (!((cpu_is_u8500_family() || cpu_is_ux540_family())))
                return -ENODEV;
 
        /* Unlock before init */
        ux500_l2x0_unlock();
-
        outer_cache.write_sec = ux500_l2c310_write_sec;
-
-       if (of_have_populated_dt())
-               l2x0_of_init(0, ~0);
-       else
-               l2x0_init(l2x0_base, 0, ~0);
+       l2x0_of_init(0, ~0);
 
        return 0;
 }
-
 early_initcall(ux500_l2x0_init);
index fa308f07fae563b69c8aeb726f31ad641bc29167..6f63954c8bded70698bb3a1cd7b88800856f3bd2 100644 (file)
 #include "db8500-regs.h"
 #include "id.h"
 
-struct ab8500_platform_data ab8500_platdata = {
+static struct ab8500_platform_data ab8500_platdata = {
        .regulator      = &ab8500_regulator_plat_data,
 };
 
-struct prcmu_pdata db8500_prcmu_pdata = {
+static struct prcmu_pdata db8500_prcmu_pdata = {
        .ab_platdata    = &ab8500_platdata,
        .version_offset = DB8500_PRCMU_FW_VERSION_OFFSET,
        .legacy_offset  = DB8500_PRCMU_LEGACY_OFFSET,
@@ -82,7 +82,7 @@ static struct map_desc u9540_io_desc[] __initdata = {
        __IO_DEV_DESC(U8500_PRCMU_TCDM_BASE, SZ_4K + SZ_8K),
 };
 
-void __init u8500_map_io(void)
+static void __init u8500_map_io(void)
 {
        /*
         * Map the UARTs early so that the DEBUG_LL stuff continues to work.
@@ -119,7 +119,7 @@ static irqreturn_t db8500_pmu_handler(int irq, void *dev, irq_handler_t handler)
        return ret;
 }
 
-struct arm_pmu_platdata db8500_pmu_platdata = {
+static struct arm_pmu_platdata db8500_pmu_platdata = {
        .handle_irq             = db8500_pmu_handler,
 };
 
index db16b5a04ad5c773f63c58ed422059c3c885f5ff..dbb2970ee7da31e256b5394a79eacd2f53bf991b 100644 (file)
@@ -125,7 +125,7 @@ static void __init soc_info_populate(struct soc_device_attribute *soc_dev_attr,
        soc_dev_attr->revision = ux500_get_revision();
 }
 
-struct device_attribute ux500_soc_attr =
+static const struct device_attribute ux500_soc_attr =
        __ATTR(process,  S_IRUGO, ux500_get_process,  NULL);
 
 struct device * __init ux500_soc_device_init(const char *soc_id)
index 87efda0aa348fc5c9165047cde0163195818d76a..ff28d8ad1ed7347dec1928ca0d2bb1ac118d7c47 100644 (file)
@@ -16,7 +16,7 @@
 #include "db8500-regs.h"
 #include "id.h"
 
-const static struct of_device_id prcmu_timer_of_match[] __initconst = {
+static const struct of_device_id prcmu_timer_of_match[] __initconst = {
        { .compatible = "stericsson,db8500-prcmu-timer-4", },
        { },
 };
index be83ba25f81b7e75064befef4dd4b599d63d91e2..08fb8c89f414f548775b7b0ec18a77069e71ffce 100644 (file)
@@ -28,6 +28,7 @@
 #include <linux/of_platform.h>
 #include <linux/amba/bus.h>
 #include <linux/amba/clcd.h>
+#include <linux/platform_data/video-clcd-versatile.h>
 #include <linux/amba/pl061.h>
 #include <linux/amba/mmci.h>
 #include <linux/amba/pl022.h>
@@ -53,7 +54,6 @@
 #include <mach/platform.h>
 #include <asm/hardware/timer-sp.h>
 
-#include <plat/clcd.h>
 #include <plat/sched_clock.h>
 
 #include "core.h"
index 3621b000a0f6ea04ce2d0de62ed5ffde114003d0..9f9bc61ca64bc6af4ddf2e7bfe7e2d6ccac3fe55 100644 (file)
@@ -44,7 +44,6 @@ static const char *versatile_dt_match[] __initconst = {
 DT_MACHINE_START(VERSATILE_PB, "ARM-Versatile (Device Tree Support)")
        .map_io         = versatile_map_io,
        .init_early     = versatile_init_early,
-       .init_irq       = versatile_init_irq,
        .init_machine   = versatile_dt_init,
        .dt_compat      = versatile_dt_match,
        .restart        = versatile_restart,
index 1af70329b88d069ef8c3278e450d4a46bf54b45c..b2cfba16c4e8ffcdcb1c649fc287fcaaab01573e 100644 (file)
@@ -13,7 +13,6 @@ menuconfig ARCH_VEXPRESS
        select ICST
        select NO_IOPORT_MAP
        select PLAT_VERSATILE
-       select PLAT_VERSATILE_CLCD
        select POWER_RESET
        select POWER_RESET_VEXPRESS
        select POWER_SUPPLY
index 86150d7a2e7d977c1767795cfd3da082efae0013..27bea049380a67fa1c16684b1c9cab354ca98407 100644 (file)
@@ -8,6 +8,7 @@
 #include <linux/platform_device.h>
 #include <linux/amba/bus.h>
 #include <linux/amba/clcd.h>
+#include <linux/platform_data/video-clcd-versatile.h>
 #include <linux/clkdev.h>
 #include <linux/vexpress.h>
 #include <linux/irqchip/arm-gic.h>
@@ -29,8 +30,6 @@
 #include <mach/motherboard.h>
 #include <mach/irqs.h>
 
-#include <plat/clcd.h>
-
 static struct map_desc ct_ca9x4_io_desc[] __initdata = {
        {
                .virtual        = V2T_PERIPH,
index 4a73464cb11b4f449aa15c55628a0f35bab06d3a..2da7be31e7e2668c12b15b8763d576ba0a1bf6c5 100644 (file)
@@ -44,7 +44,7 @@
 
 static void __iomem *pmc_base;
 
-void vt8500_restart(enum reboot_mode mode, const char *cmd)
+static void vt8500_restart(enum reboot_mode mode, const char *cmd)
 {
        if (pmc_base)
                writel(1, pmc_base + VT8500_PMSR_REG);
@@ -60,7 +60,7 @@ static struct map_desc vt8500_io_desc[] __initdata = {
        },
 };
 
-void __init vt8500_map_io(void)
+static void __init vt8500_map_io(void)
 {
        iotable_init(vt8500_io_desc, ARRAY_SIZE(vt8500_io_desc));
 }
@@ -72,7 +72,7 @@ static void vt8500_power_off(void)
        asm("mcr%? p15, 0, %0, c7, c0, 4" : : "r" (0));
 }
 
-void __init vt8500_init(void)
+static void __init vt8500_init(void)
 {
        struct device_node *np;
 #if defined(CONFIG_FB_VT8500) || defined(CONFIG_FB_WM8505)
index 577039a3f6e5ae394779e43d524759d521eab8b6..ae69809a9e479bef7617e41627b082452c93d09e 100644 (file)
@@ -854,7 +854,7 @@ config OUTER_CACHE_SYNC
 
 config CACHE_FEROCEON_L2
        bool "Enable the Feroceon L2 cache controller"
-       depends on ARCH_KIRKWOOD || ARCH_MV78XX0 || ARCH_MVEBU
+       depends on ARCH_MV78XX0 || ARCH_MVEBU
        default y
        select OUTER_CACHE
        help
index 1c98659bbf89e03168e65c22ac2e5836fa3c982f..c2baa8ede54316e5cb79f16c565a48c9c45ab1cd 100644 (file)
@@ -2102,7 +2102,7 @@ static int omap_system_dma_probe(struct platform_device *pdev)
                omap_dma_set_global_params(DMA_DEFAULT_ARB_RATE,
                                DMA_DEFAULT_FIFO_DEPTH, 0);
 
-       if (dma_omap2plus()) {
+       if (dma_omap2plus() && !(d->dev_caps & DMA_ENGINE_HANDLE_IRQ)) {
                strcpy(irq_name, "0");
                dma_irq = platform_get_irq_byname(pdev, irq_name);
                if (dma_irq < 0) {
@@ -2147,7 +2147,8 @@ static int omap_system_dma_remove(struct platform_device *pdev)
                char irq_name[4];
                strcpy(irq_name, "0");
                dma_irq = platform_get_irq_byname(pdev, irq_name);
-               remove_irq(dma_irq, &omap24xx_dma_irq);
+               if (dma_irq >= 0)
+                       remove_irq(dma_irq, &omap24xx_dma_irq);
        } else {
                int irq_rel = 0;
                for ( ; irq_rel < dma_chan_count; irq_rel++) {
index 301b892d97d948d192ac4ceae04d2a0eb6e8b76a..c87aefbf3a13e80467fc6b9326eeceed24f2e5c3 100644 (file)
@@ -6,30 +6,16 @@
 
 config PLAT_SAMSUNG
        bool
-       depends on PLAT_S3C24XX || ARCH_S3C64XX || PLAT_S5P || ARCH_EXYNOS
+       depends on PLAT_S3C24XX || ARCH_S3C64XX || ARCH_EXYNOS || ARCH_S5PV210
        default y
        select GENERIC_IRQ_CHIP
        select NO_IOPORT_MAP
        help
          Base platform code for all Samsung SoC based systems
 
-config PLAT_S5P
-       bool
-       depends on (ARCH_S5P64X0 || ARCH_S5PC100 || ARCH_S5PV210)
-       default y
-       select ARCH_REQUIRE_GPIOLIB
-       select ARM_VIC
-       select NO_IOPORT_MAP
-       select PLAT_SAMSUNG
-       select S3C_GPIO_TRACK
-       select S5P_GPIO_DRVSTR
-       select SAMSUNG_CLKSRC if !COMMON_CLK
-       help
-         Base platform code for Samsung's S5P series SoC.
-
 config SAMSUNG_PM
        bool
-       depends on PM && (PLAT_S3C24XX || ARCH_S3C64XX || ARCH_S5P64X0 || S5P_PM)
+       depends on PM && (PLAT_S3C24XX || ARCH_S3C64XX)
        default y
        help
          Base platform power management code for samsung code
@@ -65,65 +51,6 @@ config SAMSUNG_ATAGS
 
 if SAMSUNG_ATAGS
 
-# clock options
-
-config SAMSUNG_CLOCK
-       bool
-       default y if !COMMON_CLK
-
-config SAMSUNG_CLKSRC
-       bool
-       help
-         Select the clock code for the clksrc implementation
-         used by newer systems such as the S3C64XX.
-
-config S5P_CLOCK
-       def_bool (ARCH_S5P64X0 || ARCH_S5PC100 || ARCH_S5PV210)
-       help
-         Support common clock part for ARCH_S5P and ARCH_EXYNOS SoCs
-
-# options for IRQ support
-
-config S5P_IRQ
-       def_bool (ARCH_S5P64X0 || ARCH_S5PC100 || ARCH_S5PV210)
-       help
-         Support common interrupt part for ARCH_S5P SoCs
-
-config S5P_EXT_INT
-       bool
-       help
-         Use the external interrupts (other than GPIO interrupts.)
-         Note: Do not choose this for S5P6440 and S5P6450.
-
-config S5P_GPIO_INT
-       bool
-       help
-         Common code for the GPIO interrupts (other than external interrupts.)
-
-# options for gpio configuration support
-
-config S5P_GPIO_DRVSTR
-       bool
-       help
-         Internal configuration to get and set correct GPIO driver strength
-         helper
-
-config SAMSUNG_GPIO_EXTRA
-       int "Number of additional GPIO pins"
-       default 128 if SAMSUNG_GPIO_EXTRA128
-       default 64 if SAMSUNG_GPIO_EXTRA64
-       default 0
-       help
-         Use additional GPIO space in addition to the GPIO's the SOC
-         provides. This allows expanding the GPIO space for use with
-         GPIO expanders.
-
-config SAMSUNG_GPIO_EXTRA64
-       bool
-
-config SAMSUNG_GPIO_EXTRA128
-       bool
-
 config S3C_GPIO_SPACE
        int "Space between gpio banks"
        default 0
@@ -139,12 +66,6 @@ config S3C_GPIO_TRACK
          Internal configuration option to enable the s3c specific gpio
          chip tracking if the platform requires it.
 
-# uart options
-
-config S5P_DEV_UART
-       def_bool y
-       depends on (ARCH_S5P64X0 || ARCH_S5PC100 || ARCH_S5PV210)
-
 # ADC driver
 
 config S3C_ADC
@@ -302,66 +223,6 @@ config SAMSUNG_DEV_BACKLIGHT
        help
          Compile in platform device definition LCD backlight with PWM Timer
 
-config S5P_DEV_CSIS0
-       bool
-       help
-         Compile in platform device definitions for MIPI-CSIS channel 0
-
-config S5P_DEV_CSIS1
-       bool
-       help
-         Compile in platform device definitions for MIPI-CSIS channel 1
-
-config S5P_DEV_FIMC0
-       bool
-       help
-         Compile in platform device definitions for FIMC controller 0
-
-config S5P_DEV_FIMC1
-       bool
-       help
-         Compile in platform device definitions for FIMC controller 1
-
-config S5P_DEV_FIMC2
-       bool
-       help
-         Compile in platform device definitions for FIMC controller 2
-
-config S5P_DEV_FIMC3
-       bool
-       help
-         Compile in platform device definitions for FIMC controller 3
-
-config S5P_DEV_FIMD0
-       bool
-       help
-         Compile in platform device definitions for FIMD controller 0
-
-config S5P_DEV_G2D
-       bool
-       help
-         Compile in platform device definitions for G2D device
-
-config S5P_DEV_I2C_HDMIPHY
-       bool
-       help
-         Compile in platform device definitions for I2C HDMIPHY controller
-
-config S5P_DEV_JPEG
-       bool
-       help
-         Compile in platform device definitions for JPEG codec
-
-config S5P_DEV_ONENAND
-       bool
-       help
-         Compile in platform device definition for OneNAND controller
-
-config S5P_DEV_TV
-       bool
-       help
-         Compile in platform device definition for TV interface
-
 config S3C24XX_PWM
        bool "PWM device support"
        select PWM
@@ -382,12 +243,6 @@ config S3C_DMA
        help
          Internal configuration for S3C DMA core
 
-config S5P_IRQ_PM
-       bool
-       default y if S5P_PM
-       help
-         Legacy IRQ power management for S5P platforms
-
 config SAMSUNG_PM_GPIO
        bool
        default y if GPIO_SAMSUNG && PM
@@ -397,7 +252,7 @@ config SAMSUNG_PM_GPIO
 
 config SAMSUNG_DMADEV
        bool "Use legacy Samsung DMA abstraction"
-       depends on CPU_S5PV210 || CPU_S5PC100 || ARCH_S5P64X0 || ARCH_S3C64XX
+       depends on CPU_S5PV210 || ARCH_S3C64XX
        select DMADEVICES
        default y
        help
@@ -470,18 +325,6 @@ config SAMSUNG_WDT_RESET
          Compile support for system restart by triggering watchdog reset.
          Used on SoCs that do not provide dedicated reset control.
 
-config S5P_PM
-       bool
-       help
-         Common code for power management support on S5P and newer SoCs
-         Note: Do not select this for S5P6440 and S5P6450.
-
-config S5P_SLEEP
-       bool
-       help
-         Internal config node to apply common S5P sleep management code.
-         Can be selected by S5P and newer SoCs with similar sleep procedure.
-
 config DEBUG_S3C_UART
        depends on PLAT_SAMSUNG
        int
index 5e5beaa9ae15332483adef679078c0fe49cf5121..5fe175017f07bad4d698ad226e38b2c41cec0bb4 100644 (file)
@@ -5,7 +5,6 @@
 # Licensed under GPLv2
 
 ccflags-$(CONFIG_ARCH_MULTI_V7) += -I$(srctree)/$(src)/include
-ccflags-$(CONFIG_ARCH_EXYNOS)  += -I$(srctree)/arch/arm/mach-exynos/include
 
 obj-y                          :=
 obj-m                          :=
@@ -16,15 +15,6 @@ obj-                         :=
 
 obj-y                          += init.o cpu.o
 
-obj-$(CONFIG_SAMSUNG_CLOCK)    += clock.o
-
-obj-$(CONFIG_SAMSUNG_CLKSRC)   += clock-clksrc.o
-obj-$(CONFIG_S5P_CLOCK)                += s5p-clock.o
-
-obj-$(CONFIG_S5P_IRQ)          += s5p-irq.o
-obj-$(CONFIG_S5P_EXT_INT)      += s5p-irq-eint.o
-obj-$(CONFIG_S5P_GPIO_INT)     += s5p-irq-gpioint.o
-
 # ADC
 
 obj-$(CONFIG_S3C_ADC)  += adc.o
@@ -36,7 +26,6 @@ obj-$(CONFIG_SAMSUNG_ATAGS)   += platformdata.o
 obj-$(CONFIG_SAMSUNG_ATAGS)    += devs.o
 obj-$(CONFIG_SAMSUNG_ATAGS)    += dev-uart.o
 obj-$(CONFIG_S5P_DEV_MFC)      += s5p-dev-mfc.o
-obj-$(CONFIG_S5P_DEV_UART)     += s5p-dev-uart.o
 
 obj-$(CONFIG_SAMSUNG_DEV_BACKLIGHT)    += dev-backlight.o
 
@@ -58,7 +47,3 @@ obj-$(CONFIG_SAMSUNG_PM_DEBUG)        += pm-debug.o
 
 obj-$(CONFIG_SAMSUNG_WAKEMASK) += wakeup-mask.o
 obj-$(CONFIG_SAMSUNG_WDT_RESET)        += watchdog-reset.o
-
-obj-$(CONFIG_S5P_PM)           += s5p-pm.o
-obj-$(CONFIG_S5P_IRQ_PM)       += s5p-irq-pm.o
-obj-$(CONFIG_S5P_SLEEP)                += s5p-sleep.o
index 79690f2f6d3f8a5164495c7758b392cc43bae268..46835263310114cf3f3bac22b295629ce81a6a20 100644 (file)
@@ -43,7 +43,7 @@ enum s3c_cpu_type {
        TYPE_ADCV1, /* S3C24XX */
        TYPE_ADCV11, /* S3C2443 */
        TYPE_ADCV12, /* S3C2416, S3C2450 */
-       TYPE_ADCV2, /* S3C64XX, S5P64X0, S5PC100 */
+       TYPE_ADCV2, /* S3C64XX */
        TYPE_ADCV3, /* S5PV210, S5PC110, EXYNOS4210 */
 };
 
diff --git a/arch/arm/plat-samsung/clock-clksrc.c b/arch/arm/plat-samsung/clock-clksrc.c
deleted file mode 100644 (file)
index 786a410..0000000
+++ /dev/null
@@ -1,212 +0,0 @@
-/* linux/arch/arm/plat-samsung/clock-clksrc.c
- *
- * Copyright 2008 Simtec Electronics
- *     Ben Dooks <ben@simtec.co.uk>
- *     http://armlinux.simtec.co.uk/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#include <linux/init.h>
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/list.h>
-#include <linux/errno.h>
-#include <linux/err.h>
-#include <linux/clk.h>
-#include <linux/device.h>
-#include <linux/io.h>
-
-#include <plat/clock.h>
-#include <plat/clock-clksrc.h>
-#include <plat/cpu-freq.h>
-
-static inline struct clksrc_clk *to_clksrc(struct clk *clk)
-{
-       return container_of(clk, struct clksrc_clk, clk);
-}
-
-static inline u32 bit_mask(u32 shift, u32 nr_bits)
-{
-       u32 mask = 0xffffffff >> (32 - nr_bits);
-
-       return mask << shift;
-}
-
-static unsigned long s3c_getrate_clksrc(struct clk *clk)
-{
-       struct clksrc_clk *sclk = to_clksrc(clk);
-       unsigned long rate = clk_get_rate(clk->parent);
-       u32 clkdiv = __raw_readl(sclk->reg_div.reg);
-       u32 mask = bit_mask(sclk->reg_div.shift, sclk->reg_div.size);
-
-       clkdiv &= mask;
-       clkdiv >>= sclk->reg_div.shift;
-       clkdiv++;
-
-       rate /= clkdiv;
-       return rate;
-}
-
-static int s3c_setrate_clksrc(struct clk *clk, unsigned long rate)
-{
-       struct clksrc_clk *sclk = to_clksrc(clk);
-       void __iomem *reg = sclk->reg_div.reg;
-       unsigned int div;
-       u32 mask = bit_mask(sclk->reg_div.shift, sclk->reg_div.size);
-       u32 val;
-
-       rate = clk_round_rate(clk, rate);
-       div = clk_get_rate(clk->parent) / rate;
-       if (div > (1 << sclk->reg_div.size))
-               return -EINVAL;
-
-       val = __raw_readl(reg);
-       val &= ~mask;
-       val |= (div - 1) << sclk->reg_div.shift;
-       __raw_writel(val, reg);
-
-       return 0;
-}
-
-static int s3c_setparent_clksrc(struct clk *clk, struct clk *parent)
-{
-       struct clksrc_clk *sclk = to_clksrc(clk);
-       struct clksrc_sources *srcs = sclk->sources;
-       u32 clksrc = __raw_readl(sclk->reg_src.reg);
-       u32 mask = bit_mask(sclk->reg_src.shift, sclk->reg_src.size);
-       int src_nr = -1;
-       int ptr;
-
-       for (ptr = 0; ptr < srcs->nr_sources; ptr++)
-               if (srcs->sources[ptr] == parent) {
-                       src_nr = ptr;
-                       break;
-               }
-
-       if (src_nr >= 0) {
-               clk->parent = parent;
-
-               clksrc &= ~mask;
-               clksrc |= src_nr << sclk->reg_src.shift;
-
-               __raw_writel(clksrc, sclk->reg_src.reg);
-               return 0;
-       }
-
-       return -EINVAL;
-}
-
-static unsigned long s3c_roundrate_clksrc(struct clk *clk,
-                                             unsigned long rate)
-{
-       struct clksrc_clk *sclk = to_clksrc(clk);
-       unsigned long parent_rate = clk_get_rate(clk->parent);
-       int max_div = 1 << sclk->reg_div.size;
-       int div;
-
-       if (rate >= parent_rate)
-               rate = parent_rate;
-       else {
-               div = parent_rate / rate;
-               if (parent_rate % rate)
-                       div++;
-
-               if (div == 0)
-                       div = 1;
-               if (div > max_div)
-                       div = max_div;
-
-               rate = parent_rate / div;
-       }
-
-       return rate;
-}
-
-/* Clock initialisation code */
-
-void __init_or_cpufreq s3c_set_clksrc(struct clksrc_clk *clk, bool announce)
-{
-       struct clksrc_sources *srcs = clk->sources;
-       u32 mask = bit_mask(clk->reg_src.shift, clk->reg_src.size);
-       u32 clksrc;
-
-       if (!clk->reg_src.reg) {
-               if (!clk->clk.parent)
-                       printk(KERN_ERR "%s: no parent clock specified\n",
-                               clk->clk.name);
-               return;
-       }
-
-       clksrc = __raw_readl(clk->reg_src.reg);
-       clksrc &= mask;
-       clksrc >>= clk->reg_src.shift;
-
-       if (clksrc > srcs->nr_sources || !srcs->sources[clksrc]) {
-               printk(KERN_ERR "%s: bad source %d\n",
-                      clk->clk.name, clksrc);
-               return;
-       }
-
-       clk->clk.parent = srcs->sources[clksrc];
-
-       if (announce)
-               printk(KERN_INFO "%s: source is %s (%d), rate is %ld\n",
-                      clk->clk.name, clk->clk.parent->name, clksrc,
-                      clk_get_rate(&clk->clk));
-}
-
-static struct clk_ops clksrc_ops = {
-       .set_parent     = s3c_setparent_clksrc,
-       .get_rate       = s3c_getrate_clksrc,
-       .set_rate       = s3c_setrate_clksrc,
-       .round_rate     = s3c_roundrate_clksrc,
-};
-
-static struct clk_ops clksrc_ops_nodiv = {
-       .set_parent     = s3c_setparent_clksrc,
-};
-
-static struct clk_ops clksrc_ops_nosrc = {
-       .get_rate       = s3c_getrate_clksrc,
-       .set_rate       = s3c_setrate_clksrc,
-       .round_rate     = s3c_roundrate_clksrc,
-};
-
-void __init s3c_register_clksrc(struct clksrc_clk *clksrc, int size)
-{
-       int ret;
-
-       for (; size > 0; size--, clksrc++) {
-               if (!clksrc->reg_div.reg && !clksrc->reg_src.reg)
-                       printk(KERN_ERR "%s: clock %s has no registers set\n",
-                              __func__, clksrc->clk.name);
-
-               /* fill in the default functions */
-
-               if (!clksrc->clk.ops) {
-                       if (!clksrc->reg_div.reg)
-                               clksrc->clk.ops = &clksrc_ops_nodiv;
-                       else if (!clksrc->reg_src.reg)
-                               clksrc->clk.ops = &clksrc_ops_nosrc;
-                       else
-                               clksrc->clk.ops = &clksrc_ops;
-               }
-
-               /* setup the clocksource, but do not announce it
-                * as it may be re-set by the setup routines
-                * called after the rest of the clocks have been
-                * registered
-                */
-               s3c_set_clksrc(clksrc, false);
-
-               ret = s3c24xx_register_clock(&clksrc->clk);
-
-               if (ret < 0) {
-                       printk(KERN_ERR "%s: failed to register %s (%d)\n",
-                              __func__, clksrc->clk.name, ret);
-               }
-       }
-}
diff --git a/arch/arm/plat-samsung/clock.c b/arch/arm/plat-samsung/clock.c
deleted file mode 100644 (file)
index d103ac1..0000000
+++ /dev/null
@@ -1,539 +0,0 @@
-/* linux/arch/arm/plat-s3c24xx/clock.c
- *
- * Copyright 2004-2005 Simtec Electronics
- *     Ben Dooks <ben@simtec.co.uk>
- *
- * S3C24XX Core clock control support
- *
- * Based on, and code from linux/arch/arm/mach-versatile/clock.c
- **
- **  Copyright (C) 2004 ARM Limited.
- **  Written by Deep Blue Solutions Limited.
- *
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-*/
-
-#include <linux/init.h>
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/list.h>
-#include <linux/errno.h>
-#include <linux/err.h>
-#include <linux/platform_device.h>
-#include <linux/device.h>
-#include <linux/interrupt.h>
-#include <linux/ioport.h>
-#include <linux/clk.h>
-#include <linux/spinlock.h>
-#include <linux/io.h>
-#if defined(CONFIG_DEBUG_FS)
-#include <linux/debugfs.h>
-#endif
-
-#include <asm/irq.h>
-
-#include <plat/cpu-freq.h>
-
-#include <plat/clock.h>
-#include <plat/cpu.h>
-
-#include <linux/serial_core.h>
-#include <linux/serial_s3c.h> /* for s3c24xx_uart_devs */
-
-/* clock information */
-
-static LIST_HEAD(clocks);
-
-/* We originally used an mutex here, but some contexts (see resume)
- * are calling functions such as clk_set_parent() with IRQs disabled
- * causing an BUG to be triggered.
- */
-DEFINE_SPINLOCK(clocks_lock);
-
-/* Global watchdog clock used by arch_wtd_reset() callback */
-struct clk *s3c2410_wdtclk;
-static int __init s3c_wdt_reset_init(void)
-{
-       s3c2410_wdtclk = clk_get(NULL, "watchdog");
-       if (IS_ERR(s3c2410_wdtclk))
-               printk(KERN_WARNING "%s: warning: cannot get watchdog clock\n", __func__);
-       return 0;
-}
-arch_initcall(s3c_wdt_reset_init);
-
-/* enable and disable calls for use with the clk struct */
-
-static int clk_null_enable(struct clk *clk, int enable)
-{
-       return 0;
-}
-
-int clk_enable(struct clk *clk)
-{
-       unsigned long flags;
-
-       if (IS_ERR(clk) || clk == NULL)
-               return -EINVAL;
-
-       clk_enable(clk->parent);
-
-       spin_lock_irqsave(&clocks_lock, flags);
-
-       if ((clk->usage++) == 0)
-               (clk->enable)(clk, 1);
-
-       spin_unlock_irqrestore(&clocks_lock, flags);
-       return 0;
-}
-
-void clk_disable(struct clk *clk)
-{
-       unsigned long flags;
-
-       if (IS_ERR(clk) || clk == NULL)
-               return;
-
-       spin_lock_irqsave(&clocks_lock, flags);
-
-       if ((--clk->usage) == 0)
-               (clk->enable)(clk, 0);
-
-       spin_unlock_irqrestore(&clocks_lock, flags);
-       clk_disable(clk->parent);
-}
-
-
-unsigned long clk_get_rate(struct clk *clk)
-{
-       if (IS_ERR_OR_NULL(clk))
-               return 0;
-
-       if (clk->rate != 0)
-               return clk->rate;
-
-       if (clk->ops != NULL && clk->ops->get_rate != NULL)
-               return (clk->ops->get_rate)(clk);
-
-       if (clk->parent != NULL)
-               return clk_get_rate(clk->parent);
-
-       return clk->rate;
-}
-
-long clk_round_rate(struct clk *clk, unsigned long rate)
-{
-       if (!IS_ERR_OR_NULL(clk) && clk->ops && clk->ops->round_rate)
-               return (clk->ops->round_rate)(clk, rate);
-
-       return rate;
-}
-
-int clk_set_rate(struct clk *clk, unsigned long rate)
-{
-       unsigned long flags;
-       int ret;
-
-       if (IS_ERR_OR_NULL(clk))
-               return -EINVAL;
-
-       /* We do not default just do a clk->rate = rate as
-        * the clock may have been made this way by choice.
-        */
-
-       WARN_ON(clk->ops == NULL);
-       WARN_ON(clk->ops && clk->ops->set_rate == NULL);
-
-       if (clk->ops == NULL || clk->ops->set_rate == NULL)
-               return -EINVAL;
-
-       spin_lock_irqsave(&clocks_lock, flags);
-       ret = (clk->ops->set_rate)(clk, rate);
-       spin_unlock_irqrestore(&clocks_lock, flags);
-
-       return ret;
-}
-
-struct clk *clk_get_parent(struct clk *clk)
-{
-       return clk->parent;
-}
-
-int clk_set_parent(struct clk *clk, struct clk *parent)
-{
-       unsigned long flags;
-       int ret = 0;
-
-       if (IS_ERR_OR_NULL(clk) || IS_ERR_OR_NULL(parent))
-               return -EINVAL;
-
-       spin_lock_irqsave(&clocks_lock, flags);
-
-       if (clk->ops && clk->ops->set_parent)
-               ret = (clk->ops->set_parent)(clk, parent);
-
-       spin_unlock_irqrestore(&clocks_lock, flags);
-
-       return ret;
-}
-
-EXPORT_SYMBOL(clk_enable);
-EXPORT_SYMBOL(clk_disable);
-EXPORT_SYMBOL(clk_get_rate);
-EXPORT_SYMBOL(clk_round_rate);
-EXPORT_SYMBOL(clk_set_rate);
-EXPORT_SYMBOL(clk_get_parent);
-EXPORT_SYMBOL(clk_set_parent);
-
-/* base clocks */
-
-int clk_default_setrate(struct clk *clk, unsigned long rate)
-{
-       clk->rate = rate;
-       return 0;
-}
-
-struct clk_ops clk_ops_def_setrate = {
-       .set_rate       = clk_default_setrate,
-};
-
-struct clk clk_xtal = {
-       .name           = "xtal",
-       .rate           = 0,
-       .parent         = NULL,
-       .ctrlbit        = 0,
-};
-
-struct clk clk_ext = {
-       .name           = "ext",
-};
-
-struct clk clk_epll = {
-       .name           = "epll",
-};
-
-struct clk clk_mpll = {
-       .name           = "mpll",
-       .ops            = &clk_ops_def_setrate,
-};
-
-struct clk clk_upll = {
-       .name           = "upll",
-       .parent         = NULL,
-       .ctrlbit        = 0,
-};
-
-struct clk clk_f = {
-       .name           = "fclk",
-       .rate           = 0,
-       .parent         = &clk_mpll,
-       .ctrlbit        = 0,
-};
-
-struct clk clk_h = {
-       .name           = "hclk",
-       .rate           = 0,
-       .parent         = NULL,
-       .ctrlbit        = 0,
-       .ops            = &clk_ops_def_setrate,
-};
-
-struct clk clk_p = {
-       .name           = "pclk",
-       .rate           = 0,
-       .parent         = NULL,
-       .ctrlbit        = 0,
-       .ops            = &clk_ops_def_setrate,
-};
-
-struct clk clk_usb_bus = {
-       .name           = "usb-bus",
-       .rate           = 0,
-       .parent         = &clk_upll,
-};
-
-
-struct clk s3c24xx_uclk = {
-       .name           = "uclk",
-};
-
-/* initialise the clock system */
-
-/**
- * s3c24xx_register_clock() - register a clock
- * @clk: The clock to register
- *
- * Add the specified clock to the list of clocks known by the system.
- */
-int s3c24xx_register_clock(struct clk *clk)
-{
-       if (clk->enable == NULL)
-               clk->enable = clk_null_enable;
-
-       /* fill up the clk_lookup structure and register it*/
-       clk->lookup.dev_id = clk->devname;
-       clk->lookup.con_id = clk->name;
-       clk->lookup.clk = clk;
-       clkdev_add(&clk->lookup);
-
-       return 0;
-}
-
-/**
- * s3c24xx_register_clocks() - register an array of clock pointers
- * @clks: Pointer to an array of struct clk pointers
- * @nr_clks: The number of clocks in the @clks array.
- *
- * Call s3c24xx_register_clock() for all the clock pointers contained
- * in the @clks list. Returns the number of failures.
- */
-int s3c24xx_register_clocks(struct clk **clks, int nr_clks)
-{
-       int fails = 0;
-
-       for (; nr_clks > 0; nr_clks--, clks++) {
-               if (s3c24xx_register_clock(*clks) < 0) {
-                       struct clk *clk = *clks;
-                       printk(KERN_ERR "%s: failed to register %p: %s\n",
-                              __func__, clk, clk->name);
-                       fails++;
-               }
-       }
-
-       return fails;
-}
-
-/**
- * s3c_register_clocks() - register an array of clocks
- * @clkp: Pointer to the first clock in the array.
- * @nr_clks: Number of clocks to register.
- *
- * Call s3c24xx_register_clock() on the @clkp array given, printing an
- * error if it fails to register the clock (unlikely).
- */
-void __init s3c_register_clocks(struct clk *clkp, int nr_clks)
-{
-       int ret;
-
-       for (; nr_clks > 0; nr_clks--, clkp++) {
-               ret = s3c24xx_register_clock(clkp);
-
-               if (ret < 0) {
-                       printk(KERN_ERR "Failed to register clock %s (%d)\n",
-                              clkp->name, ret);
-               }
-       }
-}
-
-/**
- * s3c_disable_clocks() - disable an array of clocks
- * @clkp: Pointer to the first clock in the array.
- * @nr_clks: Number of clocks to register.
- *
- * for internal use only at initialisation time. disable the clocks in the
- * @clkp array.
- */
-
-void __init s3c_disable_clocks(struct clk *clkp, int nr_clks)
-{
-       for (; nr_clks > 0; nr_clks--, clkp++)
-               (clkp->enable)(clkp, 0);
-}
-
-/* initialise all the clocks */
-
-int __init s3c24xx_register_baseclocks(unsigned long xtal)
-{
-       printk(KERN_INFO "S3C24XX Clocks, Copyright 2004 Simtec Electronics\n");
-
-       clk_xtal.rate = xtal;
-
-       /* register our clocks */
-
-       if (s3c24xx_register_clock(&clk_xtal) < 0)
-               printk(KERN_ERR "failed to register master xtal\n");
-
-       if (s3c24xx_register_clock(&clk_mpll) < 0)
-               printk(KERN_ERR "failed to register mpll clock\n");
-
-       if (s3c24xx_register_clock(&clk_upll) < 0)
-               printk(KERN_ERR "failed to register upll clock\n");
-
-       if (s3c24xx_register_clock(&clk_f) < 0)
-               printk(KERN_ERR "failed to register cpu fclk\n");
-
-       if (s3c24xx_register_clock(&clk_h) < 0)
-               printk(KERN_ERR "failed to register cpu hclk\n");
-
-       if (s3c24xx_register_clock(&clk_p) < 0)
-               printk(KERN_ERR "failed to register cpu pclk\n");
-
-       return 0;
-}
-
-#if defined(CONFIG_PM_DEBUG) && defined(CONFIG_DEBUG_FS)
-/* debugfs support to trace clock tree hierarchy and attributes */
-
-static struct dentry *clk_debugfs_root;
-
-static void clock_tree_show_one(struct seq_file *s, struct clk *c, int level)
-{
-       struct clk *child;
-       const char *state;
-       char buf[255] = { 0 };
-       int n = 0;
-
-       if (c->name)
-               n = snprintf(buf, sizeof(buf) - 1, "%s", c->name);
-
-       if (c->devname)
-               n += snprintf(buf + n, sizeof(buf) - 1 - n, ":%s", c->devname);
-
-       state = (c->usage > 0) ? "on" : "off";
-
-       seq_printf(s, "%*s%-*s %-6s %-3d %-10lu\n",
-                  level * 3 + 1, "",
-                  50 - level * 3, buf,
-                  state, c->usage, clk_get_rate(c));
-
-       list_for_each_entry(child, &clocks, list) {
-               if (child->parent != c)
-                       continue;
-
-               clock_tree_show_one(s, child, level + 1);
-       }
-}
-
-static int clock_tree_show(struct seq_file *s, void *data)
-{
-       struct clk *c;
-       unsigned long flags;
-
-       seq_printf(s, " clock state ref rate\n");
-       seq_printf(s, "----------------------------------------------------\n");
-
-       spin_lock_irqsave(&clocks_lock, flags);
-
-       list_for_each_entry(c, &clocks, list)
-               if (c->parent == NULL)
-                       clock_tree_show_one(s, c, 0);
-
-       spin_unlock_irqrestore(&clocks_lock, flags);
-       return 0;
-}
-
-static int clock_tree_open(struct inode *inode, struct file *file)
-{
-       return single_open(file, clock_tree_show, inode->i_private);
-}
-
-static const struct file_operations clock_tree_fops = {
-       .open           = clock_tree_open,
-       .read           = seq_read,
-       .llseek         = seq_lseek,
-       .release        = single_release,
-};
-
-static int clock_rate_show(void *data, u64 *val)
-{
-       struct clk *c = data;
-       *val = clk_get_rate(c);
-       return 0;
-}
-DEFINE_SIMPLE_ATTRIBUTE(clock_rate_fops, clock_rate_show, NULL, "%llu\n");
-
-static int clk_debugfs_register_one(struct clk *c)
-{
-       int err;
-       struct dentry *d;
-       struct clk *pa = c->parent;
-       char s[255];
-       char *p = s;
-
-       p += sprintf(p, "%s", c->devname);
-
-       d = debugfs_create_dir(s, pa ? pa->dent : clk_debugfs_root);
-       if (!d)
-               return -ENOMEM;
-
-       c->dent = d;
-
-       d = debugfs_create_u8("usecount", S_IRUGO, c->dent, (u8 *)&c->usage);
-       if (!d) {
-               err = -ENOMEM;
-               goto err_out;
-       }
-
-       d = debugfs_create_file("rate", S_IRUGO, c->dent, c, &clock_rate_fops);
-       if (!d) {
-               err = -ENOMEM;
-               goto err_out;
-       }
-       return 0;
-
-err_out:
-       debugfs_remove_recursive(c->dent);
-       return err;
-}
-
-static int clk_debugfs_register(struct clk *c)
-{
-       int err;
-       struct clk *pa = c->parent;
-
-       if (pa && !pa->dent) {
-               err = clk_debugfs_register(pa);
-               if (err)
-                       return err;
-       }
-
-       if (!c->dent) {
-               err = clk_debugfs_register_one(c);
-               if (err)
-                       return err;
-       }
-       return 0;
-}
-
-static int __init clk_debugfs_init(void)
-{
-       struct clk *c;
-       struct dentry *d;
-       int err = -ENOMEM;
-
-       d = debugfs_create_dir("clock", NULL);
-       if (!d)
-               return -ENOMEM;
-       clk_debugfs_root = d;
-
-       d = debugfs_create_file("clock_tree", S_IRUGO, clk_debugfs_root, NULL,
-                                &clock_tree_fops);
-       if (!d)
-               goto err_out;
-
-       list_for_each_entry(c, &clocks, list) {
-               err = clk_debugfs_register(c);
-               if (err)
-                       goto err_out;
-       }
-       return 0;
-
-err_out:
-       debugfs_remove_recursive(clk_debugfs_root);
-       return err;
-}
-late_initcall(clk_debugfs_init);
-
-#endif /* defined(CONFIG_PM_DEBUG) && defined(CONFIG_DEBUG_FS) */
index 364963a0a34486ec92975888442650da491a7d9b..360618ee39e50df432f85acaeb8091ad6c3f1e0c 100644 (file)
@@ -15,8 +15,7 @@
 #include <linux/init.h>
 #include <linux/io.h>
 
-
-#include <mach/map.h>
+#include <plat/map-base.h>
 #include <plat/cpu.h>
 
 unsigned long samsung_cpu_id;
index ead4f1c94058e1ffff2f5a56a4e650510dc56ec8..83c7d154bde0971a3b9abeadeb6fb8bfaa93143a 100644 (file)
@@ -53,7 +53,6 @@
 #include <linux/platform_data/ata-samsung_cf.h>
 #include <plat/fb.h>
 #include <plat/fb-s3c2410.h>
-#include <plat/hdmi.h>
 #include <linux/platform_data/hwmon-s3c.h>
 #include <linux/platform_data/i2c-s3c2410.h>
 #include <plat/keypad.h>
@@ -145,23 +144,6 @@ struct platform_device s3c_device_camif = {
 };
 #endif /* CONFIG_CPU_S3C2440 */
 
-/* ASOC DMA */
-
-#ifdef CONFIG_PLAT_S5P 
-static struct resource samsung_asoc_idma_resource = DEFINE_RES_IRQ(IRQ_I2S0);
-
-struct platform_device samsung_asoc_idma = {
-       .name           = "samsung-idma",
-       .id             = -1,
-       .num_resources  = 1,
-       .resource       = &samsung_asoc_idma_resource,
-       .dev            = {
-               .dma_mask               = &samsung_device_dma_mask,
-               .coherent_dma_mask      = DMA_BIT_MASK(32),
-       }
-};
-#endif
-
 /* FB */
 
 #ifdef CONFIG_S3C_DEV_FB
@@ -190,151 +172,6 @@ void __init s3c_fb_set_platdata(struct s3c_fb_platdata *pd)
 }
 #endif /* CONFIG_S3C_DEV_FB */
 
-/* FIMC */
-
-#ifdef CONFIG_S5P_DEV_FIMC0
-static struct resource s5p_fimc0_resource[] = {
-       [0] = DEFINE_RES_MEM(S5P_PA_FIMC0, SZ_4K),
-       [1] = DEFINE_RES_IRQ(IRQ_FIMC0),
-};
-
-struct platform_device s5p_device_fimc0 = {
-       .name           = "s5p-fimc",
-       .id             = 0,
-       .num_resources  = ARRAY_SIZE(s5p_fimc0_resource),
-       .resource       = s5p_fimc0_resource,
-       .dev            = {
-               .dma_mask               = &samsung_device_dma_mask,
-               .coherent_dma_mask      = DMA_BIT_MASK(32),
-       },
-};
-
-struct platform_device s5p_device_fimc_md = {
-       .name   = "s5p-fimc-md",
-       .id     = -1,
-};
-#endif /* CONFIG_S5P_DEV_FIMC0 */
-
-#ifdef CONFIG_S5P_DEV_FIMC1
-static struct resource s5p_fimc1_resource[] = {
-       [0] = DEFINE_RES_MEM(S5P_PA_FIMC1, SZ_4K),
-       [1] = DEFINE_RES_IRQ(IRQ_FIMC1),
-};
-
-struct platform_device s5p_device_fimc1 = {
-       .name           = "s5p-fimc",
-       .id             = 1,
-       .num_resources  = ARRAY_SIZE(s5p_fimc1_resource),
-       .resource       = s5p_fimc1_resource,
-       .dev            = {
-               .dma_mask               = &samsung_device_dma_mask,
-               .coherent_dma_mask      = DMA_BIT_MASK(32),
-       },
-};
-#endif /* CONFIG_S5P_DEV_FIMC1 */
-
-#ifdef CONFIG_S5P_DEV_FIMC2
-static struct resource s5p_fimc2_resource[] = {
-       [0] = DEFINE_RES_MEM(S5P_PA_FIMC2, SZ_4K),
-       [1] = DEFINE_RES_IRQ(IRQ_FIMC2),
-};
-
-struct platform_device s5p_device_fimc2 = {
-       .name           = "s5p-fimc",
-       .id             = 2,
-       .num_resources  = ARRAY_SIZE(s5p_fimc2_resource),
-       .resource       = s5p_fimc2_resource,
-       .dev            = {
-               .dma_mask               = &samsung_device_dma_mask,
-               .coherent_dma_mask      = DMA_BIT_MASK(32),
-       },
-};
-#endif /* CONFIG_S5P_DEV_FIMC2 */
-
-#ifdef CONFIG_S5P_DEV_FIMC3
-static struct resource s5p_fimc3_resource[] = {
-       [0] = DEFINE_RES_MEM(S5P_PA_FIMC3, SZ_4K),
-       [1] = DEFINE_RES_IRQ(IRQ_FIMC3),
-};
-
-struct platform_device s5p_device_fimc3 = {
-       .name           = "s5p-fimc",
-       .id             = 3,
-       .num_resources  = ARRAY_SIZE(s5p_fimc3_resource),
-       .resource       = s5p_fimc3_resource,
-       .dev            = {
-               .dma_mask               = &samsung_device_dma_mask,
-               .coherent_dma_mask      = DMA_BIT_MASK(32),
-       },
-};
-#endif /* CONFIG_S5P_DEV_FIMC3 */
-
-/* G2D */
-
-#ifdef CONFIG_S5P_DEV_G2D
-static struct resource s5p_g2d_resource[] = {
-       [0] = DEFINE_RES_MEM(S5P_PA_G2D, SZ_4K),
-       [1] = DEFINE_RES_IRQ(IRQ_2D),
-};
-
-struct platform_device s5p_device_g2d = {
-       .name           = "s5p-g2d",
-       .id             = 0,
-       .num_resources  = ARRAY_SIZE(s5p_g2d_resource),
-       .resource       = s5p_g2d_resource,
-       .dev            = {
-               .dma_mask               = &samsung_device_dma_mask,
-               .coherent_dma_mask      = DMA_BIT_MASK(32),
-       },
-};
-#endif /* CONFIG_S5P_DEV_G2D */
-
-#ifdef CONFIG_S5P_DEV_JPEG
-static struct resource s5p_jpeg_resource[] = {
-       [0] = DEFINE_RES_MEM(S5P_PA_JPEG, SZ_4K),
-       [1] = DEFINE_RES_IRQ(IRQ_JPEG),
-};
-
-struct platform_device s5p_device_jpeg = {
-       .name           = "s5p-jpeg",
-       .id             = 0,
-       .num_resources  = ARRAY_SIZE(s5p_jpeg_resource),
-       .resource       = s5p_jpeg_resource,
-       .dev            = {
-               .dma_mask               = &samsung_device_dma_mask,
-               .coherent_dma_mask      = DMA_BIT_MASK(32),
-       },
-};
-#endif /*  CONFIG_S5P_DEV_JPEG */
-
-/* FIMD0 */
-
-#ifdef CONFIG_S5P_DEV_FIMD0
-static struct resource s5p_fimd0_resource[] = {
-       [0] = DEFINE_RES_MEM(S5P_PA_FIMD0, SZ_32K),
-       [1] = DEFINE_RES_IRQ_NAMED(IRQ_FIMD0_VSYNC, "vsync"),
-       [2] = DEFINE_RES_IRQ_NAMED(IRQ_FIMD0_FIFO, "fifo"),
-       [3] = DEFINE_RES_IRQ_NAMED(IRQ_FIMD0_SYSTEM, "lcd_sys"),
-};
-
-struct platform_device s5p_device_fimd0 = {
-       .name           = "s5p-fb",
-       .id             = 0,
-       .num_resources  = ARRAY_SIZE(s5p_fimd0_resource),
-       .resource       = s5p_fimd0_resource,
-       .dev            = {
-               .dma_mask               = &samsung_device_dma_mask,
-               .coherent_dma_mask      = DMA_BIT_MASK(32),
-       },
-};
-
-void __init s5p_fimd0_set_platdata(struct s3c_fb_platdata *pd)
-{
-       s3c_set_platdata(pd, sizeof(struct s3c_fb_platdata),
-                        &s5p_device_fimd0);
-}
-#endif /* CONFIG_S5P_DEV_FIMD0 */
-
 /* HWMON */
 
 #ifdef CONFIG_S3C_DEV_HWMON
@@ -722,60 +559,6 @@ void __init s3c_i2c7_set_platdata(struct s3c2410_platform_i2c *pd)
 }
 #endif /* CONFIG_S3C_DEV_I2C7 */
 
-/* I2C HDMIPHY */
-
-#ifdef CONFIG_S5P_DEV_I2C_HDMIPHY
-static struct resource s5p_i2c_resource[] = {
-       [0] = DEFINE_RES_MEM(S5P_PA_IIC_HDMIPHY, SZ_4K),
-       [1] = DEFINE_RES_IRQ(IRQ_IIC_HDMIPHY),
-};
-
-struct platform_device s5p_device_i2c_hdmiphy = {
-       .name           = "s3c2440-hdmiphy-i2c",
-       .id             = -1,
-       .num_resources  = ARRAY_SIZE(s5p_i2c_resource),
-       .resource       = s5p_i2c_resource,
-};
-
-void __init s5p_i2c_hdmiphy_set_platdata(struct s3c2410_platform_i2c *pd)
-{
-       struct s3c2410_platform_i2c *npd;
-
-       if (!pd) {
-               pd = &default_i2c_data;
-
-               if (soc_is_s5pv210())
-                       pd->bus_num = 3;
-               else
-                       pd->bus_num = 0;
-       }
-
-       npd = s3c_set_platdata(pd, sizeof(struct s3c2410_platform_i2c),
-                              &s5p_device_i2c_hdmiphy);
-}
-
-static struct s5p_hdmi_platform_data s5p_hdmi_def_platdata;
-
-void __init s5p_hdmi_set_platdata(struct i2c_board_info *hdmiphy_info,
-                                 struct i2c_board_info *mhl_info, int mhl_bus)
-{
-       struct s5p_hdmi_platform_data *pd = &s5p_hdmi_def_platdata;
-
-       if (soc_is_s5pv210())
-               pd->hdmiphy_bus = 3;
-       else
-               pd->hdmiphy_bus = 0;
-
-       pd->hdmiphy_info = hdmiphy_info;
-       pd->mhl_info = mhl_info;
-       pd->mhl_bus = mhl_bus;
-
-       s3c_set_platdata(pd, sizeof(struct s5p_hdmi_platform_data),
-                        &s5p_device_hdmi);
-}
-
-#endif /* CONFIG_S5P_DEV_I2C_HDMIPHY */
-
 /* I2S */
 
 #ifdef CONFIG_PLAT_S3C24XX
@@ -879,36 +662,6 @@ void __init s3c24xx_fb_set_platdata(struct s3c2410fb_mach_info *pd)
 }
 #endif /* CONFIG_PLAT_S3C24XX */
 
-/* MIPI CSIS */
-
-#ifdef CONFIG_S5P_DEV_CSIS0
-static struct resource s5p_mipi_csis0_resource[] = {
-       [0] = DEFINE_RES_MEM(S5P_PA_MIPI_CSIS0, SZ_16K),
-       [1] = DEFINE_RES_IRQ(IRQ_MIPI_CSIS0),
-};
-
-struct platform_device s5p_device_mipi_csis0 = {
-       .name           = "s5p-mipi-csis",
-       .id             = 0,
-       .num_resources  = ARRAY_SIZE(s5p_mipi_csis0_resource),
-       .resource       = s5p_mipi_csis0_resource,
-};
-#endif /* CONFIG_S5P_DEV_CSIS0 */
-
-#ifdef CONFIG_S5P_DEV_CSIS1
-static struct resource s5p_mipi_csis1_resource[] = {
-       [0] = DEFINE_RES_MEM(S5P_PA_MIPI_CSIS1, SZ_16K),
-       [1] = DEFINE_RES_IRQ(IRQ_MIPI_CSIS1),
-};
-
-struct platform_device s5p_device_mipi_csis1 = {
-       .name           = "s5p-mipi-csis",
-       .id             = 1,
-       .num_resources  = ARRAY_SIZE(s5p_mipi_csis1_resource),
-       .resource       = s5p_mipi_csis1_resource,
-};
-#endif
-
 /* NAND */
 
 #ifdef CONFIG_S3C_DEV_NAND
@@ -1052,43 +805,6 @@ void __init s3c64xx_onenand1_set_platdata(struct onenand_platform_data *pdata)
 }
 #endif /* CONFIG_S3C64XX_DEV_ONENAND1 */
 
-#ifdef CONFIG_S5P_DEV_ONENAND
-static struct resource s5p_onenand_resources[] = {
-       [0] = DEFINE_RES_MEM(S5P_PA_ONENAND, SZ_128K),
-       [1] = DEFINE_RES_MEM(S5P_PA_ONENAND_DMA, SZ_8K),
-       [2] = DEFINE_RES_IRQ(IRQ_ONENAND_AUDI),
-};
-
-struct platform_device s5p_device_onenand = {
-       .name           = "s5pc110-onenand",
-       .id             = -1,
-       .num_resources  = ARRAY_SIZE(s5p_onenand_resources),
-       .resource       = s5p_onenand_resources,
-};
-#endif /* CONFIG_S5P_DEV_ONENAND */
-
-/* PMU */
-
-#if defined(CONFIG_PLAT_S5P) && !defined(CONFIG_ARCH_EXYNOS)
-static struct resource s5p_pmu_resource[] = {
-       DEFINE_RES_IRQ(IRQ_PMU)
-};
-
-static struct platform_device s5p_device_pmu = {
-       .name           = "arm-pmu",
-       .id             = -1,
-       .num_resources  = ARRAY_SIZE(s5p_pmu_resource),
-       .resource       = s5p_pmu_resource,
-};
-
-static int __init s5p_pmu_init(void)
-{
-       platform_device_register(&s5p_device_pmu);
-       return 0;
-}
-arch_initcall(s5p_pmu_init);
-#endif /* CONFIG_PLAT_S5P */
-
 /* PWM Timer */
 
 #ifdef CONFIG_SAMSUNG_DEV_PWM
@@ -1251,52 +967,6 @@ void __init s3c24xx_ts_set_platdata(struct s3c2410_ts_mach_info *pd)
 }
 #endif /* CONFIG_SAMSUNG_DEV_TS */
 
-/* TV */
-
-#ifdef CONFIG_S5P_DEV_TV
-
-static struct resource s5p_hdmi_resources[] = {
-       [0] = DEFINE_RES_MEM(S5P_PA_HDMI, SZ_1M),
-       [1] = DEFINE_RES_IRQ(IRQ_HDMI),
-};
-
-struct platform_device s5p_device_hdmi = {
-       .name           = "s5p-hdmi",
-       .id             = -1,
-       .num_resources  = ARRAY_SIZE(s5p_hdmi_resources),
-       .resource       = s5p_hdmi_resources,
-};
-
-static struct resource s5p_sdo_resources[] = {
-       [0] = DEFINE_RES_MEM(S5P_PA_SDO, SZ_64K),
-       [1] = DEFINE_RES_IRQ(IRQ_SDO),
-};
-
-struct platform_device s5p_device_sdo = {
-       .name           = "s5p-sdo",
-       .id             = -1,
-       .num_resources  = ARRAY_SIZE(s5p_sdo_resources),
-       .resource       = s5p_sdo_resources,
-};
-
-static struct resource s5p_mixer_resources[] = {
-       [0] = DEFINE_RES_MEM_NAMED(S5P_PA_MIXER, SZ_64K, "mxr"),
-       [1] = DEFINE_RES_MEM_NAMED(S5P_PA_VP, SZ_64K, "vp"),
-       [2] = DEFINE_RES_IRQ_NAMED(IRQ_MIXER, "irq"),
-};
-
-struct platform_device s5p_device_mixer = {
-       .name           = "s5p-mixer",
-       .id             = -1,
-       .num_resources  = ARRAY_SIZE(s5p_mixer_resources),
-       .resource       = s5p_mixer_resources,
-       .dev            = {
-               .dma_mask               = &samsung_device_dma_mask,
-               .coherent_dma_mask      = DMA_BIT_MASK(32),
-       }
-};
-#endif /* CONFIG_S5P_DEV_TV */
-
 /* USB */
 
 #ifdef CONFIG_S3C_DEV_USB_HOST
diff --git a/arch/arm/plat-samsung/include/plat/camport.h b/arch/arm/plat-samsung/include/plat/camport.h
deleted file mode 100644 (file)
index a5708bf..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2011 Samsung Electronics Co., Ltd.
- *
- * S5P series camera interface helper functions
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#ifndef __PLAT_SAMSUNG_CAMPORT_H_
-#define __PLAT_SAMSUNG_CAMPORT_H_ __FILE__
-
-enum s5p_camport_id {
-       S5P_CAMPORT_A,
-       S5P_CAMPORT_B,
-};
-
-/*
- * The helper functions to configure GPIO for the camera parallel bus.
- * The camera port can be multiplexed with any FIMC entity, even multiple
- * FIMC entities are allowed to be attached to a single port simultaneously.
- * These functions are to be used in the board setup code.
- */
-int s5pv210_fimc_setup_gpio(enum s5p_camport_id id);
-int exynos4_fimc_setup_gpio(enum s5p_camport_id id);
-
-#endif /* __PLAT_SAMSUNG_CAMPORT_H */
diff --git a/arch/arm/plat-samsung/include/plat/clock-clksrc.h b/arch/arm/plat-samsung/include/plat/clock-clksrc.h
deleted file mode 100644 (file)
index 50a8ca7..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-/* linux/arch/arm/plat-samsung/include/plat/clock-clksrc.h
- *
- * Parts taken from arch/arm/plat-s3c64xx/clock.c
- *     Copyright 2008 Openmoko, Inc.
- *     Copyright 2008 Simtec Electronics
- *             Ben Dooks <ben@simtec.co.uk>
- *             http://armlinux.simtec.co.uk/
- *
- * Copyright 2009 Ben Dooks <ben-linux@fluff.org>
- * Copyright 2009 Harald Welte
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-/**
- * struct clksrc_sources - list of sources for a given clock
- * @sources: array of pointers to clocks
- * @nr_sources: The size of @sources
- */
-struct clksrc_sources {
-       unsigned int    nr_sources;
-       struct clk      **sources;
-};
-
-/**
- * struct clksrc_reg - register definition for clock control bits
- * @reg: pointer to the register in virtual memory.
- * @shift: the shift in bits to where the bitfield is.
- * @size: the size in bits of the bitfield.
- *
- * This specifies the size and position of the bits we are interested
- * in within the register specified by @reg.
- */
-struct clksrc_reg {
-       void __iomem            *reg;
-       unsigned short          shift;
-       unsigned short          size;
-};
-
-/**
- * struct clksrc_clk - class of clock for newer style samsung devices.
- * @clk: the standard clock representation
- * @sources: the sources for this clock
- * @reg_src: the register definition for selecting the clock's source
- * @reg_div: the register definition for the clock's output divisor
- *
- * This clock implements the features required by the newer SoCs where
- * the standard clock block provides an input mux and a post-mux divisor
- * to provide the periperhal's clock.
- *
- * The array of @sources provides the mapping of mux position to the
- * clock, and @reg_src shows the code where to modify to change the mux
- * position. The @reg_div defines how to change the divider settings on
- * the output.
- */
-struct clksrc_clk {
-       struct clk              clk;
-       struct clksrc_sources   *sources;
-
-       struct clksrc_reg       reg_src;
-       struct clksrc_reg       reg_div;
-};
-
-/**
- * s3c_set_clksrc() - setup the clock from the register settings
- * @clk: The clock to setup.
- * @announce: true to announce the setting to printk().
- *
- * Setup the clock from the current register settings, for when the
- * kernel boots or if it is resuming from a possibly unknown state.
- */
-extern void s3c_set_clksrc(struct clksrc_clk *clk, bool announce);
-
-/**
- * s3c_register_clksrc() register clocks from an array of clksrc clocks
- * @srcs: The array of clocks to register
- * @size: The size of the @srcs array.
- *
- * Initialise and register the array of clocks described by @srcs.
- */
-extern void s3c_register_clksrc(struct clksrc_clk *srcs, int size);
diff --git a/arch/arm/plat-samsung/include/plat/clock.h b/arch/arm/plat-samsung/include/plat/clock.h
deleted file mode 100644 (file)
index 63239f4..0000000
+++ /dev/null
@@ -1,152 +0,0 @@
-/* linux/arch/arm/plat-s3c/include/plat/clock.h
- *
- * Copyright (c) 2004-2005 Simtec Electronics
- *     http://www.simtec.co.uk/products/SWLINUX/
- *     Written by Ben Dooks, <ben@simtec.co.uk>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#ifndef __ASM_PLAT_CLOCK_H
-#define __ASM_PLAT_CLOCK_H __FILE__
-
-#include <linux/spinlock.h>
-#include <linux/clkdev.h>
-
-struct clk;
-
-/**
- * struct clk_ops - standard clock operations
- * @set_rate: set the clock rate, see clk_set_rate().
- * @get_rate: get the clock rate, see clk_get_rate().
- * @round_rate: round a given clock rate, see clk_round_rate().
- * @set_parent: set the clock's parent, see clk_set_parent().
- *
- * Group the common clock implementations together so that we
- * don't have to keep setting the same fields again. We leave
- * enable in struct clk.
- *
- * Adding an extra layer of indirection into the process should
- * not be a problem as it is unlikely these operations are going
- * to need to be called quickly.
- */
-struct clk_ops {
-       int                 (*set_rate)(struct clk *c, unsigned long rate);
-       unsigned long       (*get_rate)(struct clk *c);
-       unsigned long       (*round_rate)(struct clk *c, unsigned long rate);
-       int                 (*set_parent)(struct clk *c, struct clk *parent);
-};
-
-struct clk {
-       struct list_head      list;
-       struct module        *owner;
-       struct clk           *parent;
-       const char           *name;
-       const char              *devname;
-       int                   id;
-       int                   usage;
-       unsigned long         rate;
-       unsigned long         ctrlbit;
-
-       struct clk_ops          *ops;
-       int                 (*enable)(struct clk *, int enable);
-       struct clk_lookup       lookup;
-#if defined(CONFIG_PM_DEBUG) && defined(CONFIG_DEBUG_FS)
-       struct dentry           *dent;  /* For visible tree hierarchy */
-#endif
-};
-
-/* other clocks which may be registered by board support */
-
-extern struct clk s3c24xx_dclk0;
-extern struct clk s3c24xx_dclk1;
-extern struct clk s3c24xx_clkout0;
-extern struct clk s3c24xx_clkout1;
-extern struct clk s3c24xx_uclk;
-
-extern struct clk clk_usb_bus;
-
-/* core clock support */
-
-extern struct clk clk_f;
-extern struct clk clk_h;
-extern struct clk clk_p;
-extern struct clk clk_mpll;
-extern struct clk clk_upll;
-extern struct clk clk_epll;
-extern struct clk clk_xtal;
-extern struct clk clk_ext;
-
-/* S3C2443/S3C2416 specific clocks */
-extern struct clksrc_clk clk_epllref;
-extern struct clksrc_clk clk_esysclk;
-
-/* S3C24XX UART clocks */
-extern struct clk s3c24xx_clk_uart0;
-extern struct clk s3c24xx_clk_uart1;
-extern struct clk s3c24xx_clk_uart2;
-
-/* S3C64XX specific clocks */
-extern struct clk clk_h2;
-extern struct clk clk_27m;
-extern struct clk clk_48m;
-extern struct clk clk_xusbxti;
-
-extern int clk_default_setrate(struct clk *clk, unsigned long rate);
-extern struct clk_ops clk_ops_def_setrate;
-
-/* exports for arch/arm/mach-s3c2410
- *
- * Please DO NOT use these outside of arch/arm/mach-s3c2410
-*/
-
-extern spinlock_t clocks_lock;
-
-extern int s3c2410_clkcon_enable(struct clk *clk, int enable);
-
-extern int s3c24xx_register_clock(struct clk *clk);
-extern int s3c24xx_register_clocks(struct clk **clk, int nr_clks);
-
-extern void s3c_register_clocks(struct clk *clk, int nr_clks);
-extern void s3c_disable_clocks(struct clk *clkp, int nr_clks);
-
-extern int s3c24xx_register_baseclocks(unsigned long xtal);
-
-extern void s5p_register_clocks(unsigned long xtal_freq);
-
-extern void s3c24xx_setup_clocks(unsigned long fclk,
-                                unsigned long hclk,
-                                unsigned long pclk);
-
-extern void s3c2410_setup_clocks(void);
-extern void s3c2412_setup_clocks(void);
-extern void s3c244x_setup_clocks(void);
-
-/* S3C2410 specific clock functions */
-
-extern int s3c2410_baseclk_add(void);
-
-/* S3C2443/S3C2416 specific clock functions */
-
-typedef unsigned int (*pll_fn)(unsigned int reg, unsigned int base);
-
-extern void s3c2443_common_setup_clocks(pll_fn get_mpll);
-extern void s3c2443_common_init_clocks(int xtal, pll_fn get_mpll,
-                                      unsigned int *divs, int nr_divs,
-                                      int divmask);
-
-extern int s3c2443_clkcon_enable_h(struct clk *clk, int enable);
-extern int s3c2443_clkcon_enable_p(struct clk *clk, int enable);
-extern int s3c2443_clkcon_enable_s(struct clk *clk, int enable);
-
-/* S3C64XX specific functions and clocks */
-
-extern int s3c64xx_sclk_ctrl(struct clk *clk, int enable);
-
-/* Global watchdog clock used by arch_wtd_reset() callback */
-
-extern struct clk *s3c2410_wdtclk;
-
-#endif /* __ASM_PLAT_CLOCK_H */
index 72d4178ad23b1d29b4dc0667aa367598f4536b33..317c523032888690bb4fb9832c13908edd47204a 100644 (file)
@@ -140,7 +140,6 @@ struct s3c_cpufreq_config {
  *     any frequency changes. This is really only need by devices like the
  *     S3C2410 where there is no or limited divider between the PLL and the
  *     ARMCLK.
- * @resume_clocks: Update the clocks on resume.
  * @get_iotiming: Get the current IO timing data, mainly for use at start.
  * @set_iotiming: Update the IO timings from the cached copies calculated
  *     from the @calc_iotiming entry when changing the frequency.
@@ -169,8 +168,6 @@ struct s3c_cpufreq_info {
 
        /* driver routines */
 
-       void            (*resume_clocks)(void);
-
        int             (*get_iotiming)(struct s3c_cpufreq_config *cfg,
                                        struct s3c_iotimings *timings);
 
index 5a237db9f9eb299742528140e91a0da904b376f9..61d14f3a0426f3c16f6de24c5641b781a75161a3 100644 (file)
@@ -33,13 +33,6 @@ extern unsigned long samsung_cpu_id;
 #define S3C6410_CPU_ID         0x36410000
 #define S3C64XX_CPU_MASK       0xFFFFF000
 
-#define S5P6440_CPU_ID         0x56440000
-#define S5P6450_CPU_ID         0x36450000
-#define S5P64XX_CPU_MASK       0xFFFFF000
-
-#define S5PC100_CPU_ID         0x43100000
-#define S5PC100_CPU_MASK       0xFFFFF000
-
 #define S5PV210_CPU_ID         0x43110000
 #define S5PV210_CPU_MASK       0xFFFFF000
 
@@ -54,10 +47,6 @@ IS_SAMSUNG_CPU(s3c24xx, S3C24XX_CPU_ID, S3C24XX_CPU_MASK)
 IS_SAMSUNG_CPU(s3c2412, S3C2412_CPU_ID, S3C2412_CPU_MASK)
 IS_SAMSUNG_CPU(s3c6400, S3C6400_CPU_ID, S3C64XX_CPU_MASK)
 IS_SAMSUNG_CPU(s3c6410, S3C6410_CPU_ID, S3C64XX_CPU_MASK)
-IS_SAMSUNG_CPU(s5p6440, S5P6440_CPU_ID, S5P64XX_CPU_MASK)
-IS_SAMSUNG_CPU(s5p6450, S5P6450_CPU_ID, S5P64XX_CPU_MASK)
-IS_SAMSUNG_CPU(s5pc100, S5PC100_CPU_ID, S5PC100_CPU_MASK)
-IS_SAMSUNG_CPU(s5pv210, S5PV210_CPU_ID, S5PV210_CPU_MASK)
 
 #if defined(CONFIG_CPU_S3C2410) || defined(CONFIG_CPU_S3C2412) || \
     defined(CONFIG_CPU_S3C2416) || defined(CONFIG_CPU_S3C2440) || \
@@ -86,30 +75,6 @@ IS_SAMSUNG_CPU(s5pv210, S5PV210_CPU_ID, S5PV210_CPU_MASK)
 # define soc_is_s3c64xx()      0
 #endif
 
-#if defined(CONFIG_CPU_S5P6440)
-# define soc_is_s5p6440()      is_samsung_s5p6440()
-#else
-# define soc_is_s5p6440()      0
-#endif
-
-#if defined(CONFIG_CPU_S5P6450)
-# define soc_is_s5p6450()      is_samsung_s5p6450()
-#else
-# define soc_is_s5p6450()      0
-#endif
-
-#if defined(CONFIG_CPU_S5PC100)
-# define soc_is_s5pc100()      is_samsung_s5pc100()
-#else
-# define soc_is_s5pc100()      0
-#endif
-
-#if defined(CONFIG_CPU_S5PV210)
-# define soc_is_s5pv210()      is_samsung_s5pv210()
-#else
-# define soc_is_s5pv210()      0
-#endif
-
 #define IODESC_ENT(x) { (unsigned long)S3C24XX_VA_##x, __phys_to_pfn(S3C24XX_PA_##x), S3C24XX_SZ_##x, MT_DEVICE }
 
 #ifndef KHZ
@@ -145,12 +110,9 @@ extern void s3c_init_cpu(unsigned long idcode,
 
 /* core initialisation functions */
 
-extern void s5p_init_irq(u32 *vic, u32 num_vic);
-
 extern void s3c24xx_init_io(struct map_desc *mach_desc, int size);
 
 extern void s3c64xx_init_cpu(void);
-extern void s5p_init_cpu(void __iomem *cpuid_addr);
 
 extern unsigned int samsung_rev(void);
 
@@ -177,9 +139,5 @@ extern struct bus_type s3c2440_subsys;
 extern struct bus_type s3c2442_subsys;
 extern struct bus_type s3c2443_subsys;
 extern struct bus_type s3c6410_subsys;
-extern struct bus_type s5p64x0_subsys;
-extern struct bus_type s5pv210_subsys;
-
-extern void (*s5pc1xx_idle)(void);
 
 #endif
index eece188ed18826db7a6079f4ce18041752a98918..e23fed311e5f95246f2d0a04c91a8af32ab039e4 100644 (file)
@@ -25,9 +25,6 @@ struct s3c24xx_uart_resources {
 
 extern struct s3c24xx_uart_resources s3c2410_uart_resources[];
 extern struct s3c24xx_uart_resources s3c64xx_uart_resources[];
-extern struct s3c24xx_uart_resources s5p_uart_resources[];
-extern struct s3c24xx_uart_resources exynos4_uart_resources[];
-extern struct s3c24xx_uart_resources exynos5_uart_resources[];
 
 extern struct platform_device *s3c24xx_uart_devs[];
 extern struct platform_device *s3c24xx_uart_src[];
@@ -75,62 +72,6 @@ extern struct platform_device s3c_device_usb_hsotg;
 extern struct platform_device s3c_device_usb_hsudc;
 extern struct platform_device s3c_device_wdt;
 
-extern struct platform_device s5p_device_fimc0;
-extern struct platform_device s5p_device_fimc1;
-extern struct platform_device s5p_device_fimc2;
-extern struct platform_device s5p_device_fimc3;
-extern struct platform_device s5p_device_fimc_md;
-extern struct platform_device s5p_device_jpeg;
-extern struct platform_device s5p_device_g2d;
-extern struct platform_device s5p_device_fimd0;
-extern struct platform_device s5p_device_hdmi;
-extern struct platform_device s5p_device_i2c_hdmiphy;
-extern struct platform_device s5p_device_mfc;
-extern struct platform_device s5p_device_mfc_l;
-extern struct platform_device s5p_device_mfc_r;
-extern struct platform_device s5p_device_mipi_csis0;
-extern struct platform_device s5p_device_mipi_csis1;
-extern struct platform_device s5p_device_mixer;
-extern struct platform_device s5p_device_onenand;
-extern struct platform_device s5p_device_sdo;
-
-extern struct platform_device s5p6440_device_iis;
-extern struct platform_device s5p6440_device_pcm;
-
-extern struct platform_device s5p6450_device_iis0;
-extern struct platform_device s5p6450_device_iis1;
-extern struct platform_device s5p6450_device_iis2;
-extern struct platform_device s5p6450_device_pcm0;
-
-
-extern struct platform_device s5pc100_device_ac97;
-extern struct platform_device s5pc100_device_iis0;
-extern struct platform_device s5pc100_device_iis1;
-extern struct platform_device s5pc100_device_iis2;
-extern struct platform_device s5pc100_device_pcm0;
-extern struct platform_device s5pc100_device_pcm1;
-extern struct platform_device s5pc100_device_spdif;
-
-extern struct platform_device s5pv210_device_ac97;
-extern struct platform_device s5pv210_device_iis0;
-extern struct platform_device s5pv210_device_iis1;
-extern struct platform_device s5pv210_device_iis2;
-extern struct platform_device s5pv210_device_pcm0;
-extern struct platform_device s5pv210_device_pcm1;
-extern struct platform_device s5pv210_device_pcm2;
-extern struct platform_device s5pv210_device_spdif;
-
-extern struct platform_device exynos4_device_ac97;
-extern struct platform_device exynos4_device_ahci;
-extern struct platform_device exynos4_device_i2s0;
-extern struct platform_device exynos4_device_i2s1;
-extern struct platform_device exynos4_device_i2s2;
-extern struct platform_device exynos4_device_ohci;
-extern struct platform_device exynos4_device_pcm0;
-extern struct platform_device exynos4_device_pcm1;
-extern struct platform_device exynos4_device_pcm2;
-extern struct platform_device exynos4_device_spdif;
-
 extern struct platform_device samsung_asoc_idma;
 extern struct platform_device samsung_device_keypad;
 extern struct platform_device samsung_device_pwm;
index 6abcbf139ceedf5976cf657d1da73e93b4d8d8c2..bca383efcf6deb03fbd8786e2d6851796be38c0a 100644 (file)
@@ -26,19 +26,4 @@ static inline void s3c_fb_setname(char *name)
 #endif
 }
 
-/* Re-define device name depending on support. */
-static inline void s5p_fb_setname(int id, char *name)
-{
-       switch (id) {
-#ifdef CONFIG_S5P_DEV_FIMD0
-       case 0:
-               s5p_device_fimd0.name = name;
-       break;
-#endif
-       default:
-               printk(KERN_ERR "%s: invalid device id(%d)\n", __func__, id);
-       break;
-       }
-}
-
 #endif /* __ASM_PLAT_FB_CORE_H */
index 9ae507270785ed0ce803844d724043a5d87b7407..b89f8f2085157d3fb55dc23874b43c4ee74c4c64 100644 (file)
  */
 extern void s3c_fb_set_platdata(struct s3c_fb_platdata *pd);
 
-/**
- * s5p_fimd0_set_platdata() - Setup the FB device with platform data.
- * @pd: The platform data to set. The data is copied from the passed structure
- *      so the machine data can mark the data __initdata so that any unused
- *      machines will end up dumping their data at runtime.
- */
-extern void s5p_fimd0_set_platdata(struct s3c_fb_platdata *pd);
-
 /**
  * s3c64xx_fb_gpio_setup_24bpp() - S3C64XX setup function for 24bpp LCD
  *
@@ -40,32 +32,4 @@ extern void s5p_fimd0_set_platdata(struct s3c_fb_platdata *pd);
  */
 extern void s3c64xx_fb_gpio_setup_24bpp(void);
 
-/**
- * s5pc100_fb_gpio_setup_24bpp() - S5PC100 setup function for 24bpp LCD
- *
- * Initialise the GPIO for an 24bpp LCD display on the RGB interface.
- */
-extern void s5pc100_fb_gpio_setup_24bpp(void);
-
-/**
- * s5pv210_fb_gpio_setup_24bpp() - S5PV210/S5PC110 setup function for 24bpp LCD
- *
- * Initialise the GPIO for an 24bpp LCD display on the RGB interface.
- */
-extern void s5pv210_fb_gpio_setup_24bpp(void);
-
-/**
- * exynos4_fimd0_gpio_setup_24bpp() - Exynos4 setup function for 24bpp LCD0
- *
- * Initialise the GPIO for an 24bpp LCD display on the RGB interface 0.
- */
-extern void exynos4_fimd0_gpio_setup_24bpp(void);
-
-/**
- * s5p64x0_fb_gpio_setup_24bpp() - S5P6440/S5P6450 setup function for 24bpp LCD
- *
- * Initialise the GPIO for an 24bpp LCD display on the RGB interface.
- */
-extern void s5p64x0_fb_gpio_setup_24bpp(void);
-
 #endif /* __PLAT_S3C_FB_H */
diff --git a/arch/arm/plat-samsung/include/plat/fimc-core.h b/arch/arm/plat-samsung/include/plat/fimc-core.h
deleted file mode 100644 (file)
index 1d6cb2b..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * arch/arm/plat-samsung/include/plat/fimc-core.h
- *
- * Copyright 2010 Samsung Electronics Co., Ltd.
- *     Sylwester Nawrocki <s.nawrocki@samsung.com>
- *
- * Samsung camera interface driver core functions
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#ifndef __ASM_PLAT_FIMC_CORE_H
-#define __ASM_PLAT_FIMC_CORE_H __FILE__
-
-/*
- * These functions are only for use with the core support code, such as
- * the CPU-specific initialization code.
- */
-
-/* Re-define device name to differentiate the subsystem in various SoCs. */
-static inline void s3c_fimc_setname(int id, char *name)
-{
-       switch (id) {
-#ifdef CONFIG_S5P_DEV_FIMC0
-       case 0:
-               s5p_device_fimc0.name = name;
-               break;
-#endif
-#ifdef CONFIG_S5P_DEV_FIMC1
-       case 1:
-               s5p_device_fimc1.name = name;
-               break;
-#endif
-#ifdef CONFIG_S5P_DEV_FIMC2
-       case 2:
-               s5p_device_fimc2.name = name;
-               break;
-#endif
-#ifdef CONFIG_S5P_DEV_FIMC3
-       case 3:
-               s5p_device_fimc3.name = name;
-               break;
-#endif
-       default:
-               break;
-       }
-}
-
-#endif /* __ASM_PLAT_FIMC_CORE_H */
index 08740eed050c46907c21314df3b830408e7f6b6f..b5294eff18b5c7f7decd9cb842a7cf4adaa208f3 100644 (file)
@@ -27,7 +27,6 @@
 #include <linux/types.h>
 
 typedef unsigned int __bitwise__ samsung_gpio_pull_t;
-typedef unsigned int __bitwise__ s5p_gpio_drvstr_t;
 
 /* forward declaration if gpio-core.h hasn't been included */
 struct samsung_gpio_chip;
@@ -180,67 +179,4 @@ static inline int s3c_gpio_cfgrange_nopull(unsigned int pin, unsigned int size,
        return s3c_gpio_cfgall_range(pin, size, cfg, S3C_GPIO_PULL_NONE);
 }
 
-/* Define values for the drvstr available for each gpio pin.
- *
- * These values control the value of the output signal driver strength,
- * configurable on most pins on the S5P series.
- */
-#define S5P_GPIO_DRVSTR_LV1    ((__force s5p_gpio_drvstr_t)0x0)
-#define S5P_GPIO_DRVSTR_LV2    ((__force s5p_gpio_drvstr_t)0x2)
-#define S5P_GPIO_DRVSTR_LV3    ((__force s5p_gpio_drvstr_t)0x1)
-#define S5P_GPIO_DRVSTR_LV4    ((__force s5p_gpio_drvstr_t)0x3)
-
-/**
- * s5c_gpio_get_drvstr() - get the driver streght value of a gpio pin
- * @pin: The pin number to get the settings for
- *
- * Read the driver streght value for the specified pin.
-*/
-extern s5p_gpio_drvstr_t s5p_gpio_get_drvstr(unsigned int pin);
-
-/**
- * s3c_gpio_set_drvstr() - set the driver streght value of a gpio pin
- * @pin: The pin number to configure the driver streght value
- * @drvstr: The new value of the driver strength
- *
- * This function sets the driver strength value for the specified pin.
- * It will return 0 if successful, or a negative error code if the pin
- * cannot support the requested setting.
-*/
-extern int s5p_gpio_set_drvstr(unsigned int pin, s5p_gpio_drvstr_t drvstr);
-
-/**
- * s5p_register_gpio_interrupt() - register interrupt support for a gpio group
- * @pin: The pin number from the group to be registered
- *
- * This function registers gpio interrupt support for the group that the
- * specified pin belongs to.
- *
- * The total number of gpio pins is quite large ob s5p series. Registering
- * irq support for all of them would be a resource waste. Because of that the
- * interrupt support for standard gpio pins is registered dynamically.
- *
- * It will return the irq number of the interrupt that has been registered
- * or -ENOMEM if no more gpio interrupts can be registered. It is allowed
- * to call this function more than once for the same gpio group (the group
- * will be registered only once).
- */
-extern int s5p_register_gpio_interrupt(int pin);
-
-/** s5p_register_gpioint_bank() - add gpio bank for further gpio interrupt
- * registration (see s5p_register_gpio_interrupt function)
- * @chain_irq: chained irq number for the gpio int handler for this bank
- * @start: start gpio group number of this bank
- * @nr_groups: number of gpio groups handled by this bank
- *
- * This functions registers initial information about gpio banks that
- * can be later used by the s5p_register_gpio_interrupt() function to
- * enable support for gpio interrupt for particular gpio group.
- */
-#ifdef CONFIG_S5P_GPIO_INT
-extern int s5p_register_gpioint_bank(int chain_irq, int start, int nr_groups);
-#else
-#define s5p_register_gpioint_bank(chain_irq, start, nr_groups) do { } while (0)
-#endif
-
 #endif /* __PLAT_GPIO_CFG_H */
index cf5aae5b0975299d33ea71fec7fa47c93d9eea71..6ce11bfdc37e36bf15d06794363ca3395bec81e7 100644 (file)
@@ -14,6 +14,9 @@
 #ifndef __PLAT_SAMSUNG_GPIO_CORE_H
 #define __PLAT_SAMSUNG_GPIO_CORE_H
 
+/* Bring in machine-local definitions, especially S3C_GPIO_END */
+#include <mach/gpio-samsung.h>
+
 #define GPIOCON_OFF    (0x00)
 #define GPIODAT_OFF    (0x04)
 
diff --git a/arch/arm/plat-samsung/include/plat/hdmi.h b/arch/arm/plat-samsung/include/plat/hdmi.h
deleted file mode 100644 (file)
index 331d046..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * Copyright (C) 2012 Samsung Electronics Co.Ltd
- *
- * This program is free software; you can redistribute  it and/or modify it
- * under  the terms of  the GNU General  Public License as published by the
- * Free Software Foundation;  either version 2 of the  License, or (at your
- * option) any later version.
- */
-
-#ifndef __PLAT_SAMSUNG_HDMI_H
-#define __PLAT_SAMSUNG_HDMI_H __FILE__
-
-extern void s5p_hdmi_set_platdata(struct i2c_board_info *hdmiphy_info,
-                                 struct i2c_board_info *mhl_info, int mhl_bus);
-
-#endif /* __PLAT_SAMSUNG_HDMI_H */
diff --git a/arch/arm/plat-samsung/include/plat/irqs.h b/arch/arm/plat-samsung/include/plat/irqs.h
deleted file mode 100644 (file)
index 039001c..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-/* linux/arch/arm/plat-samsung/include/plat/irqs.h
- *
- * Copyright (c) 2009 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com/
- *
- * S5P Common IRQ support
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#ifndef __PLAT_SAMSUNG_IRQS_H
-#define __PLAT_SAMSUNG_IRQS_H __FILE__
-
-/* we keep the first set of CPU IRQs out of the range of
- * the ISA space, so that the PC104 has them to itself
- * and we don't end up having to do horrible things to the
- * standard ISA drivers....
- *
- * note, since we're using the VICs, our start must be a
- * mulitple of 32 to allow the common code to work
- */
-
-#define S5P_IRQ_OFFSET         (32)
-
-#define S5P_IRQ(x)             ((x) + S5P_IRQ_OFFSET)
-
-#define S5P_VIC0_BASE          S5P_IRQ(0)
-#define S5P_VIC1_BASE          S5P_IRQ(32)
-#define S5P_VIC2_BASE          S5P_IRQ(64)
-#define S5P_VIC3_BASE          S5P_IRQ(96)
-
-#define VIC_BASE(x)            (S5P_VIC0_BASE + ((x)*32))
-
-#define IRQ_VIC0_BASE          S5P_VIC0_BASE
-#define IRQ_VIC1_BASE          S5P_VIC1_BASE
-#define IRQ_VIC2_BASE          S5P_VIC2_BASE
-
-/* VIC based IRQs */
-
-#define S5P_IRQ_VIC0(x)                (S5P_VIC0_BASE + (x))
-#define S5P_IRQ_VIC1(x)                (S5P_VIC1_BASE + (x))
-#define S5P_IRQ_VIC2(x)                (S5P_VIC2_BASE + (x))
-#define S5P_IRQ_VIC3(x)                (S5P_VIC3_BASE + (x))
-
-#define IRQ_EINT(x)            ((x) < 16 ? ((x) + S5P_EINT_BASE1) \
-                                       : ((x) - 16 + S5P_EINT_BASE2))
-
-#define EINT_OFFSET(irq)       ((irq) < S5P_EINT_BASE2 ? \
-                                               ((irq) - S5P_EINT_BASE1) : \
-                                               ((irq) + 16 - S5P_EINT_BASE2))
-
-#define IRQ_EINT_BIT(x)                EINT_OFFSET(x)
-
-/* Typically only a few gpio chips require gpio interrupt support.
-   To avoid memory waste irq descriptors are allocated only for
-   S5P_GPIOINT_GROUP_COUNT chips, each with total number of
-   S5P_GPIOINT_GROUP_SIZE pins/irqs. Each GPIOINT group can be assiged
-   to any gpio chip with the s5p_register_gpio_interrupt() function */
-#define S5P_GPIOINT_GROUP_COUNT 4
-#define S5P_GPIOINT_GROUP_SIZE 8
-#define S5P_GPIOINT_COUNT      (S5P_GPIOINT_GROUP_COUNT * S5P_GPIOINT_GROUP_SIZE)
-
-/* IRQ types common for all s5p platforms */
-#define S5P_IRQ_TYPE_LEVEL_LOW         (0x00)
-#define S5P_IRQ_TYPE_LEVEL_HIGH                (0x01)
-#define S5P_IRQ_TYPE_EDGE_FALLING      (0x02)
-#define S5P_IRQ_TYPE_EDGE_RISING       (0x03)
-#define S5P_IRQ_TYPE_EDGE_BOTH         (0x04)
-
-#endif /* __PLAT_SAMSUNG_IRQS_H */
index c18678610bc0ad952eba51726ef9f3d198caf44c..f5b9d3ff9cd4bed7fe4573df30f1adb4d0476990 100644 (file)
@@ -15,7 +15,6 @@
 
 #define S5P_VA_CHIPID          S3C_ADDR(0x02000000)
 #define S5P_VA_CMU             S3C_ADDR(0x02100000)
-#define S5P_VA_PMU             S3C_ADDR(0x02180000)
 #define S5P_VA_GPIO            S3C_ADDR(0x02200000)
 #define S5P_VA_GPIO1           S5P_VA_GPIO
 #define S5P_VA_GPIO2           S3C_ADDR(0x02240000)
diff --git a/arch/arm/plat-samsung/include/plat/mfc.h b/arch/arm/plat-samsung/include/plat/mfc.h
deleted file mode 100644 (file)
index 033654e..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2011 Samsung Electronics Co.Ltd
- *
- * This program is free software; you can redistribute  it and/or modify it
- * under  the terms of  the GNU General  Public License as published by the
- * Free Software Foundation;  either version 2 of the  License, or (at your
- * option) any later version.
- */
-
-#ifndef __PLAT_SAMSUNG_MFC_H
-#define __PLAT_SAMSUNG_MFC_H __FILE__
-
-struct s5p_mfc_dt_meminfo {
-       unsigned long   loff;
-       unsigned long   lsize;
-       unsigned long   roff;
-       unsigned long   rsize;
-       char            *compatible;
-};
-
-/**
- * s5p_mfc_reserve_mem - function to early reserve memory for MFC driver
- * @rbase:     base address for MFC 'right' memory interface
- * @rsize:     size of the memory reserved for MFC 'right' interface
- * @lbase:     base address for MFC 'left' memory interface
- * @lsize:     size of the memory reserved for MFC 'left' interface
- *
- * This function reserves system memory for both MFC device memory
- * interfaces and registers it to respective struct device entries as
- * coherent memory.
- */
-void __init s5p_mfc_reserve_mem(phys_addr_t rbase, unsigned int rsize,
-                               phys_addr_t lbase, unsigned int lsize);
-
-#endif /* __PLAT_SAMSUNG_MFC_H */
diff --git a/arch/arm/plat-samsung/include/plat/pll.h b/arch/arm/plat-samsung/include/plat/pll.h
deleted file mode 100644 (file)
index 357af7c..0000000
+++ /dev/null
@@ -1,323 +0,0 @@
-/* linux/arch/arm/plat-samsung/include/plat/pll.h
- *
- * Copyright (c) 2009-2011 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com/
- *
- * Copyright 2008 Openmoko, Inc.
- * Copyright 2008 Simtec Electronics
- *     Ben Dooks <ben@simtec.co.uk>
- *     http://armlinux.simtec.co.uk/
- *
- * Samsung PLL codes
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#include <asm/div64.h>
-
-#define S3C24XX_PLL_MDIV_MASK          (0xFF)
-#define S3C24XX_PLL_PDIV_MASK          (0x1F)
-#define S3C24XX_PLL_SDIV_MASK          (0x3)
-#define S3C24XX_PLL_MDIV_SHIFT         (12)
-#define S3C24XX_PLL_PDIV_SHIFT         (4)
-#define S3C24XX_PLL_SDIV_SHIFT         (0)
-
-static inline unsigned int s3c24xx_get_pll(unsigned int pllval,
-                                          unsigned int baseclk)
-{
-       unsigned int mdiv, pdiv, sdiv;
-       uint64_t fvco;
-
-       mdiv = (pllval >> S3C24XX_PLL_MDIV_SHIFT) & S3C24XX_PLL_MDIV_MASK;
-       pdiv = (pllval >> S3C24XX_PLL_PDIV_SHIFT) & S3C24XX_PLL_PDIV_MASK;
-       sdiv = (pllval >> S3C24XX_PLL_SDIV_SHIFT) & S3C24XX_PLL_SDIV_MASK;
-
-       fvco = (uint64_t)baseclk * (mdiv + 8);
-       do_div(fvco, (pdiv + 2) << sdiv);
-
-       return (unsigned int)fvco;
-}
-
-#define S3C2416_PLL_MDIV_MASK          (0x3FF)
-#define S3C2416_PLL_PDIV_MASK          (0x3F)
-#define S3C2416_PLL_SDIV_MASK          (0x7)
-#define S3C2416_PLL_MDIV_SHIFT         (14)
-#define S3C2416_PLL_PDIV_SHIFT         (5)
-#define S3C2416_PLL_SDIV_SHIFT         (0)
-
-static inline unsigned int s3c2416_get_pll(unsigned int pllval,
-                                          unsigned int baseclk)
-{
-       unsigned int mdiv, pdiv, sdiv;
-       uint64_t fvco;
-
-       mdiv = (pllval >> S3C2416_PLL_MDIV_SHIFT) & S3C2416_PLL_MDIV_MASK;
-       pdiv = (pllval >> S3C2416_PLL_PDIV_SHIFT) & S3C2416_PLL_PDIV_MASK;
-       sdiv = (pllval >> S3C2416_PLL_SDIV_SHIFT) & S3C2416_PLL_SDIV_MASK;
-
-       fvco = (uint64_t)baseclk * mdiv;
-       do_div(fvco, (pdiv << sdiv));
-
-       return (unsigned int)fvco;
-}
-
-#define S3C6400_PLL_MDIV_MASK          (0x3FF)
-#define S3C6400_PLL_PDIV_MASK          (0x3F)
-#define S3C6400_PLL_SDIV_MASK          (0x7)
-#define S3C6400_PLL_MDIV_SHIFT         (16)
-#define S3C6400_PLL_PDIV_SHIFT         (8)
-#define S3C6400_PLL_SDIV_SHIFT         (0)
-
-static inline unsigned long s3c6400_get_pll(unsigned long baseclk,
-                                           u32 pllcon)
-{
-       u32 mdiv, pdiv, sdiv;
-       u64 fvco = baseclk;
-
-       mdiv = (pllcon >> S3C6400_PLL_MDIV_SHIFT) & S3C6400_PLL_MDIV_MASK;
-       pdiv = (pllcon >> S3C6400_PLL_PDIV_SHIFT) & S3C6400_PLL_PDIV_MASK;
-       sdiv = (pllcon >> S3C6400_PLL_SDIV_SHIFT) & S3C6400_PLL_SDIV_MASK;
-
-       fvco *= mdiv;
-       do_div(fvco, (pdiv << sdiv));
-
-       return (unsigned long)fvco;
-}
-
-#define PLL6553X_MDIV_MASK     (0x7F)
-#define PLL6553X_PDIV_MASK     (0x1F)
-#define PLL6553X_SDIV_MASK     (0x3)
-#define PLL6553X_KDIV_MASK     (0xFFFF)
-#define PLL6553X_MDIV_SHIFT    (16)
-#define PLL6553X_PDIV_SHIFT    (8)
-#define PLL6553X_SDIV_SHIFT    (0)
-
-static inline unsigned long s3c_get_pll6553x(unsigned long baseclk,
-                                            u32 pll_con0, u32 pll_con1)
-{
-       unsigned long result;
-       u32 mdiv, pdiv, sdiv, kdiv;
-       u64 tmp;
-
-       mdiv = (pll_con0 >> PLL6553X_MDIV_SHIFT) & PLL6553X_MDIV_MASK;
-       pdiv = (pll_con0 >> PLL6553X_PDIV_SHIFT) & PLL6553X_PDIV_MASK;
-       sdiv = (pll_con0 >> PLL6553X_SDIV_SHIFT) & PLL6553X_SDIV_MASK;
-       kdiv = pll_con1 & PLL6553X_KDIV_MASK;
-
-       /*
-        * We need to multiple baseclk by mdiv (the integer part) and kdiv
-        * which is in 2^16ths, so shift mdiv up (does not overflow) and
-        * add kdiv before multiplying. The use of tmp is to avoid any
-        * overflows before shifting bac down into result when multipling
-        * by the mdiv and kdiv pair.
-        */
-
-       tmp = baseclk;
-       tmp *= (mdiv << 16) + kdiv;
-       do_div(tmp, (pdiv << sdiv));
-       result = tmp >> 16;
-
-       return result;
-}
-
-#define PLL35XX_MDIV_MASK      (0x3FF)
-#define PLL35XX_PDIV_MASK      (0x3F)
-#define PLL35XX_SDIV_MASK      (0x7)
-#define PLL35XX_MDIV_SHIFT     (16)
-#define PLL35XX_PDIV_SHIFT     (8)
-#define PLL35XX_SDIV_SHIFT     (0)
-
-static inline unsigned long s5p_get_pll35xx(unsigned long baseclk, u32 pll_con)
-{
-       u32 mdiv, pdiv, sdiv;
-       u64 fvco = baseclk;
-
-       mdiv = (pll_con >> PLL35XX_MDIV_SHIFT) & PLL35XX_MDIV_MASK;
-       pdiv = (pll_con >> PLL35XX_PDIV_SHIFT) & PLL35XX_PDIV_MASK;
-       sdiv = (pll_con >> PLL35XX_SDIV_SHIFT) & PLL35XX_SDIV_MASK;
-
-       fvco *= mdiv;
-       do_div(fvco, (pdiv << sdiv));
-
-       return (unsigned long)fvco;
-}
-
-#define PLL36XX_KDIV_MASK      (0xFFFF)
-#define PLL36XX_MDIV_MASK      (0x1FF)
-#define PLL36XX_PDIV_MASK      (0x3F)
-#define PLL36XX_SDIV_MASK      (0x7)
-#define PLL36XX_MDIV_SHIFT     (16)
-#define PLL36XX_PDIV_SHIFT     (8)
-#define PLL36XX_SDIV_SHIFT     (0)
-
-static inline unsigned long s5p_get_pll36xx(unsigned long baseclk,
-                                           u32 pll_con0, u32 pll_con1)
-{
-       unsigned long result;
-       u32 mdiv, pdiv, sdiv, kdiv;
-       u64 tmp;
-
-       mdiv = (pll_con0 >> PLL36XX_MDIV_SHIFT) & PLL36XX_MDIV_MASK;
-       pdiv = (pll_con0 >> PLL36XX_PDIV_SHIFT) & PLL36XX_PDIV_MASK;
-       sdiv = (pll_con0 >> PLL36XX_SDIV_SHIFT) & PLL36XX_SDIV_MASK;
-       kdiv = pll_con1 & PLL36XX_KDIV_MASK;
-
-       tmp = baseclk;
-
-       tmp *= (mdiv << 16) + kdiv;
-       do_div(tmp, (pdiv << sdiv));
-       result = tmp >> 16;
-
-       return result;
-}
-
-#define PLL45XX_MDIV_MASK      (0x3FF)
-#define PLL45XX_PDIV_MASK      (0x3F)
-#define PLL45XX_SDIV_MASK      (0x7)
-#define PLL45XX_MDIV_SHIFT     (16)
-#define PLL45XX_PDIV_SHIFT     (8)
-#define PLL45XX_SDIV_SHIFT     (0)
-
-enum pll45xx_type_t {
-       pll_4500,
-       pll_4502,
-       pll_4508
-};
-
-static inline unsigned long s5p_get_pll45xx(unsigned long baseclk, u32 pll_con,
-                                           enum pll45xx_type_t pll_type)
-{
-       u32 mdiv, pdiv, sdiv;
-       u64 fvco = baseclk;
-
-       mdiv = (pll_con >> PLL45XX_MDIV_SHIFT) & PLL45XX_MDIV_MASK;
-       pdiv = (pll_con >> PLL45XX_PDIV_SHIFT) & PLL45XX_PDIV_MASK;
-       sdiv = (pll_con >> PLL45XX_SDIV_SHIFT) & PLL45XX_SDIV_MASK;
-
-       if (pll_type == pll_4508)
-               sdiv = sdiv - 1;
-
-       fvco *= mdiv;
-       do_div(fvco, (pdiv << sdiv));
-
-       return (unsigned long)fvco;
-}
-
-/* CON0 bit-fields */
-#define PLL46XX_MDIV_MASK      (0x1FF)
-#define PLL46XX_PDIV_MASK      (0x3F)
-#define PLL46XX_SDIV_MASK      (0x7)
-#define PLL46XX_LOCKED_SHIFT   (29)
-#define PLL46XX_MDIV_SHIFT     (16)
-#define PLL46XX_PDIV_SHIFT     (8)
-#define PLL46XX_SDIV_SHIFT     (0)
-
-/* CON1 bit-fields */
-#define PLL46XX_MRR_MASK       (0x1F)
-#define PLL46XX_MFR_MASK       (0x3F)
-#define PLL46XX_KDIV_MASK      (0xFFFF)
-#define PLL4650C_KDIV_MASK     (0xFFF)
-#define PLL46XX_MRR_SHIFT      (24)
-#define PLL46XX_MFR_SHIFT      (16)
-#define PLL46XX_KDIV_SHIFT     (0)
-
-enum pll46xx_type_t {
-       pll_4600,
-       pll_4650,
-       pll_4650c,
-};
-
-static inline unsigned long s5p_get_pll46xx(unsigned long baseclk,
-                                           u32 pll_con0, u32 pll_con1,
-                                           enum pll46xx_type_t pll_type)
-{
-       unsigned long result;
-       u32 mdiv, pdiv, sdiv, kdiv;
-       u64 tmp;
-
-       mdiv = (pll_con0 >> PLL46XX_MDIV_SHIFT) & PLL46XX_MDIV_MASK;
-       pdiv = (pll_con0 >> PLL46XX_PDIV_SHIFT) & PLL46XX_PDIV_MASK;
-       sdiv = (pll_con0 >> PLL46XX_SDIV_SHIFT) & PLL46XX_SDIV_MASK;
-       kdiv = pll_con1 & PLL46XX_KDIV_MASK;
-
-       if (pll_type == pll_4650c)
-               kdiv = pll_con1 & PLL4650C_KDIV_MASK;
-       else
-               kdiv = pll_con1 & PLL46XX_KDIV_MASK;
-
-       tmp = baseclk;
-
-       if (pll_type == pll_4600) {
-               tmp *= (mdiv << 16) + kdiv;
-               do_div(tmp, (pdiv << sdiv));
-               result = tmp >> 16;
-       } else {
-               tmp *= (mdiv << 10) + kdiv;
-               do_div(tmp, (pdiv << sdiv));
-               result = tmp >> 10;
-       }
-
-       return result;
-}
-
-#define PLL90XX_MDIV_MASK      (0xFF)
-#define PLL90XX_PDIV_MASK      (0x3F)
-#define PLL90XX_SDIV_MASK      (0x7)
-#define PLL90XX_KDIV_MASK      (0xffff)
-#define PLL90XX_LOCKED_SHIFT   (29)
-#define PLL90XX_MDIV_SHIFT     (16)
-#define PLL90XX_PDIV_SHIFT     (8)
-#define PLL90XX_SDIV_SHIFT     (0)
-#define PLL90XX_KDIV_SHIFT     (0)
-
-static inline unsigned long s5p_get_pll90xx(unsigned long baseclk,
-                                           u32 pll_con, u32 pll_conk)
-{
-       unsigned long result;
-       u32 mdiv, pdiv, sdiv, kdiv;
-       u64 tmp;
-
-       mdiv = (pll_con >> PLL90XX_MDIV_SHIFT) & PLL90XX_MDIV_MASK;
-       pdiv = (pll_con >> PLL90XX_PDIV_SHIFT) & PLL90XX_PDIV_MASK;
-       sdiv = (pll_con >> PLL90XX_SDIV_SHIFT) & PLL90XX_SDIV_MASK;
-       kdiv = pll_conk & PLL90XX_KDIV_MASK;
-
-       /*
-        * We need to multiple baseclk by mdiv (the integer part) and kdiv
-        * which is in 2^16ths, so shift mdiv up (does not overflow) and
-        * add kdiv before multiplying. The use of tmp is to avoid any
-        * overflows before shifting bac down into result when multipling
-        * by the mdiv and kdiv pair.
-        */
-
-       tmp = baseclk;
-       tmp *= (mdiv << 16) + kdiv;
-       do_div(tmp, (pdiv << sdiv));
-       result = tmp >> 16;
-
-       return result;
-}
-
-#define PLL65XX_MDIV_MASK      (0x3FF)
-#define PLL65XX_PDIV_MASK      (0x3F)
-#define PLL65XX_SDIV_MASK      (0x7)
-#define PLL65XX_MDIV_SHIFT     (16)
-#define PLL65XX_PDIV_SHIFT     (8)
-#define PLL65XX_SDIV_SHIFT     (0)
-
-static inline unsigned long s5p_get_pll65xx(unsigned long baseclk, u32 pll_con)
-{
-       u32 mdiv, pdiv, sdiv;
-       u64 fvco = baseclk;
-
-       mdiv = (pll_con >> PLL65XX_MDIV_SHIFT) & PLL65XX_MDIV_MASK;
-       pdiv = (pll_con >> PLL65XX_PDIV_SHIFT) & PLL65XX_PDIV_MASK;
-       sdiv = (pll_con >> PLL65XX_SDIV_SHIFT) & PLL65XX_SDIV_MASK;
-
-       fvco *= mdiv;
-       do_div(fvco, (pdiv << sdiv));
-
-       return (unsigned long)fvco;
-}
diff --git a/arch/arm/plat-samsung/include/plat/s5p-clock.h b/arch/arm/plat-samsung/include/plat/s5p-clock.h
deleted file mode 100644 (file)
index 8364b4b..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-/* linux/arch/arm/plat-samsung/include/plat/s5p-clock.h
- *
- * Copyright (c) 2009-2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * Header file for s5p clock support
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#ifndef __ASM_PLAT_S5P_CLOCK_H
-#define __ASM_PLAT_S5P_CLOCK_H __FILE__
-
-#include <linux/clk.h>
-
-#define GET_DIV(clk, field) ((((clk) & field##_MASK) >> field##_SHIFT) + 1)
-
-#define clk_fin_apll clk_ext_xtal_mux
-#define clk_fin_bpll clk_ext_xtal_mux
-#define clk_fin_cpll clk_ext_xtal_mux
-#define clk_fin_mpll clk_ext_xtal_mux
-#define clk_fin_epll clk_ext_xtal_mux
-#define clk_fin_dpll clk_ext_xtal_mux
-#define clk_fin_vpll clk_ext_xtal_mux
-#define clk_fin_hpll clk_ext_xtal_mux
-
-extern struct clk clk_ext_xtal_mux;
-extern struct clk clk_xusbxti;
-extern struct clk clk_48m;
-extern struct clk s5p_clk_27m;
-extern struct clk clk_fout_apll;
-extern struct clk clk_fout_bpll;
-extern struct clk clk_fout_bpll_div2;
-extern struct clk clk_fout_cpll;
-extern struct clk clk_fout_mpll;
-extern struct clk clk_fout_mpll_div2;
-extern struct clk clk_fout_epll;
-extern struct clk clk_fout_dpll;
-extern struct clk clk_fout_vpll;
-extern struct clk clk_arm;
-extern struct clk clk_vpll;
-
-extern struct clksrc_sources clk_src_apll;
-extern struct clksrc_sources clk_src_bpll;
-extern struct clksrc_sources clk_src_bpll_fout;
-extern struct clksrc_sources clk_src_cpll;
-extern struct clksrc_sources clk_src_mpll;
-extern struct clksrc_sources clk_src_mpll_fout;
-extern struct clksrc_sources clk_src_epll;
-extern struct clksrc_sources clk_src_dpll;
-
-extern int s5p_gatectrl(void __iomem *reg, struct clk *clk, int enable);
-
-/* Common EPLL operations for S5P platform */
-extern int s5p_epll_enable(struct clk *clk, int enable);
-extern unsigned long s5p_epll_get_rate(struct clk *clk);
-
-/* SPDIF clk operations common for S5PC100/V210/C110 and Exynos4 */
-extern int s5p_spdif_set_rate(struct clk *clk, unsigned long rate);
-extern unsigned long s5p_spdif_get_rate(struct clk *clk);
-
-extern struct clk_ops s5p_sclk_spdif_ops;
-#endif /* __ASM_PLAT_S5P_CLOCK_H */
index bf650218b40eeb72bfc81778b4843a520329dda5..2787553c3ae2656cda4ec74db512970ce945d296 100644 (file)
@@ -56,22 +56,7 @@ extern void s3c2416_setup_sdhci0_cfg_gpio(struct platform_device *, int w);
 extern void s3c2416_setup_sdhci1_cfg_gpio(struct platform_device *, int w);
 extern void s3c64xx_setup_sdhci0_cfg_gpio(struct platform_device *, int w);
 extern void s3c64xx_setup_sdhci1_cfg_gpio(struct platform_device *, int w);
-extern void s5pc100_setup_sdhci0_cfg_gpio(struct platform_device *, int w);
-extern void s5pc100_setup_sdhci1_cfg_gpio(struct platform_device *, int w);
-extern void s5pc100_setup_sdhci2_cfg_gpio(struct platform_device *, int w);
 extern void s3c64xx_setup_sdhci2_cfg_gpio(struct platform_device *, int w);
-extern void s5pv210_setup_sdhci0_cfg_gpio(struct platform_device *, int w);
-extern void s5pv210_setup_sdhci1_cfg_gpio(struct platform_device *, int w);
-extern void s5pv210_setup_sdhci2_cfg_gpio(struct platform_device *, int w);
-extern void s5pv210_setup_sdhci3_cfg_gpio(struct platform_device *, int w);
-extern void exynos4_setup_sdhci0_cfg_gpio(struct platform_device *, int w);
-extern void exynos4_setup_sdhci1_cfg_gpio(struct platform_device *, int w);
-extern void exynos4_setup_sdhci2_cfg_gpio(struct platform_device *, int w);
-extern void exynos4_setup_sdhci3_cfg_gpio(struct platform_device *, int w);
-extern void s5p64x0_setup_sdhci0_cfg_gpio(struct platform_device *, int w);
-extern void s5p64x0_setup_sdhci1_cfg_gpio(struct platform_device *, int w);
-extern void s5p6440_setup_sdhci2_cfg_gpio(struct platform_device *, int w);
-extern void s5p6450_setup_sdhci2_cfg_gpio(struct platform_device *, int w);
 
 /* S3C2416 SDHCI setup */
 
@@ -151,115 +136,6 @@ static inline void s3c6400_default_sdhci2(void) { }
 
 #endif /* CONFIG_S3C64XX_SETUP_SDHCI */
 
-/* S5P64X0 SDHCI setup */
-
-#ifdef CONFIG_S5P64X0_SETUP_SDHCI_GPIO
-static inline void s5p64x0_default_sdhci0(void)
-{
-#ifdef CONFIG_S3C_DEV_HSMMC
-       s3c_hsmmc0_def_platdata.cfg_gpio = s5p64x0_setup_sdhci0_cfg_gpio;
-#endif
-}
-
-static inline void s5p64x0_default_sdhci1(void)
-{
-#ifdef CONFIG_S3C_DEV_HSMMC1
-       s3c_hsmmc1_def_platdata.cfg_gpio = s5p64x0_setup_sdhci1_cfg_gpio;
-#endif
-}
-
-static inline void s5p6440_default_sdhci2(void)
-{
-#ifdef CONFIG_S3C_DEV_HSMMC2
-       s3c_hsmmc2_def_platdata.cfg_gpio = s5p6440_setup_sdhci2_cfg_gpio;
-#endif
-}
-
-static inline void s5p6450_default_sdhci2(void)
-{
-#ifdef CONFIG_S3C_DEV_HSMMC2
-       s3c_hsmmc2_def_platdata.cfg_gpio = s5p6450_setup_sdhci2_cfg_gpio;
-#endif
-}
-
-#else
-static inline void s5p64x0_default_sdhci0(void) { }
-static inline void s5p64x0_default_sdhci1(void) { }
-static inline void s5p6440_default_sdhci2(void) { }
-static inline void s5p6450_default_sdhci2(void) { }
-
-#endif /* CONFIG_S5P64X0_SETUP_SDHCI_GPIO */
-
-/* S5PC100 SDHCI setup */
-
-#ifdef CONFIG_S5PC100_SETUP_SDHCI
-static inline void s5pc100_default_sdhci0(void)
-{
-#ifdef CONFIG_S3C_DEV_HSMMC
-       s3c_hsmmc0_def_platdata.cfg_gpio = s5pc100_setup_sdhci0_cfg_gpio;
-#endif
-}
-
-static inline void s5pc100_default_sdhci1(void)
-{
-#ifdef CONFIG_S3C_DEV_HSMMC1
-       s3c_hsmmc1_def_platdata.cfg_gpio = s5pc100_setup_sdhci1_cfg_gpio;
-#endif
-}
-
-static inline void s5pc100_default_sdhci2(void)
-{
-#ifdef CONFIG_S3C_DEV_HSMMC2
-       s3c_hsmmc2_def_platdata.cfg_gpio = s5pc100_setup_sdhci2_cfg_gpio;
-#endif
-}
-
-#else
-static inline void s5pc100_default_sdhci0(void) { }
-static inline void s5pc100_default_sdhci1(void) { }
-static inline void s5pc100_default_sdhci2(void) { }
-
-#endif /* CONFIG_S5PC100_SETUP_SDHCI */
-
-/* S5PV210 SDHCI setup */
-
-#ifdef CONFIG_S5PV210_SETUP_SDHCI
-static inline void s5pv210_default_sdhci0(void)
-{
-#ifdef CONFIG_S3C_DEV_HSMMC
-       s3c_hsmmc0_def_platdata.cfg_gpio = s5pv210_setup_sdhci0_cfg_gpio;
-#endif
-}
-
-static inline void s5pv210_default_sdhci1(void)
-{
-#ifdef CONFIG_S3C_DEV_HSMMC1
-       s3c_hsmmc1_def_platdata.cfg_gpio = s5pv210_setup_sdhci1_cfg_gpio;
-#endif
-}
-
-static inline void s5pv210_default_sdhci2(void)
-{
-#ifdef CONFIG_S3C_DEV_HSMMC2
-       s3c_hsmmc2_def_platdata.cfg_gpio = s5pv210_setup_sdhci2_cfg_gpio;
-#endif
-}
-
-static inline void s5pv210_default_sdhci3(void)
-{
-#ifdef CONFIG_S3C_DEV_HSMMC3
-       s3c_hsmmc3_def_platdata.cfg_gpio = s5pv210_setup_sdhci3_cfg_gpio;
-#endif
-}
-
-#else
-static inline void s5pv210_default_sdhci0(void) { }
-static inline void s5pv210_default_sdhci1(void) { }
-static inline void s5pv210_default_sdhci2(void) { }
-static inline void s5pv210_default_sdhci3(void) { }
-
-#endif /* CONFIG_S5PV210_SETUP_SDHCI */
-
 static inline void s3c_sdhci_setname(int id, char *name)
 {
        switch (id) {
diff --git a/arch/arm/plat-samsung/include/plat/tv-core.h b/arch/arm/plat-samsung/include/plat/tv-core.h
deleted file mode 100644 (file)
index 3bc34f3..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * arch/arm/plat-samsung/include/plat/tv.h
- *
- * Copyright 2011 Samsung Electronics Co., Ltd.
- *     Tomasz Stanislawski <t.stanislaws@samsung.com>
- *
- * Samsung TV driver core functions
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#ifndef __SAMSUNG_PLAT_TV_H
-#define __SAMSUNG_PLAT_TV_H __FILE__
-
-/*
- * These functions are only for use with the core support code, such as
- * the CPU-specific initialization code.
- */
-
-/* Re-define device name to differentiate the subsystem in various SoCs. */
-static inline void s5p_hdmi_setname(char *name)
-{
-#ifdef CONFIG_S5P_DEV_TV
-       s5p_device_hdmi.name = name;
-#endif
-}
-
-static inline void s5p_mixer_setname(char *name)
-{
-#ifdef CONFIG_S5P_DEV_TV
-       s5p_device_mixer.name = name;
-#endif
-}
-
-static inline void s5p_sdo_setname(char *name)
-{
-#ifdef CONFIG_S5P_DEV_TV
-       s5p_device_sdo.name = name;
-#endif
-}
-
-#endif /* __SAMSUNG_PLAT_TV_H */
index a1f925f3121f19fe5d14da8d5184b5423eb3d9b5..11fbbc26e49fdd85273edc996504a189065d94cf 100644 (file)
@@ -30,7 +30,6 @@
 
 #include <plat/cpu.h>
 #include <plat/devs.h>
-#include <plat/clock.h>
 
 static struct cpu_table *cpu;
 
index da268813901bf21cdfdc1ee23c01a43ddcf574ff..f9a09262f2faabb7d721722df9e9f1e0107ddc1b 100644 (file)
@@ -19,9 +19,7 @@
 #include <linux/io.h>
 #include <linux/gpio.h>
 
-#if defined(CONFIG_ARCH_S3C24XX) || defined(CONFIG_ARCH_S3C64XX)
 #include <mach/gpio-samsung.h>
-#endif
 
 #include <plat/gpio-core.h>
 #include <plat/pm.h>
@@ -196,7 +194,7 @@ struct samsung_gpio_pm samsung_gpio_pm_2bit = {
        .resume = samsung_gpio_pm_2bit_resume,
 };
 
-#if defined(CONFIG_ARCH_S3C64XX) || defined(CONFIG_PLAT_S5P)
+#if defined(CONFIG_ARCH_S3C64XX)
 static void samsung_gpio_pm_4bit_save(struct samsung_gpio_chip *chip)
 {
        chip->pm_save[1] = __raw_readl(chip->base + OFFS_CON);
@@ -306,7 +304,7 @@ struct samsung_gpio_pm samsung_gpio_pm_4bit = {
        .save   = samsung_gpio_pm_4bit_save,
        .resume = samsung_gpio_pm_4bit_resume,
 };
-#endif /* CONFIG_ARCH_S3C64XX || CONFIG_PLAT_S5P */
+#endif /* CONFIG_ARCH_S3C64XX */
 
 /**
  * samsung_pm_save_gpio() - save gpio chip data for suspend
diff --git a/arch/arm/plat-samsung/s5p-clock.c b/arch/arm/plat-samsung/s5p-clock.c
deleted file mode 100644 (file)
index 48a1599..0000000
+++ /dev/null
@@ -1,294 +0,0 @@
-/*
- * Copyright 2009 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com/
- *
- * S5P - Common clock support
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#include <linux/init.h>
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/list.h>
-#include <linux/errno.h>
-#include <linux/err.h>
-#include <linux/clk.h>
-#include <linux/device.h>
-#include <linux/io.h>
-#include <asm/div64.h>
-
-#include <mach/regs-clock.h>
-
-#include <plat/clock.h>
-#include <plat/clock-clksrc.h>
-#include <plat/s5p-clock.h>
-
-/* fin_apll, fin_mpll and fin_epll are all the same clock, which we call
- * clk_ext_xtal_mux.
-*/
-struct clk clk_ext_xtal_mux = {
-       .name           = "ext_xtal",
-       .id             = -1,
-};
-
-struct clk clk_xusbxti = {
-       .name           = "xusbxti",
-       .id             = -1,
-       .rate           = 24000000,
-};
-
-struct clk s5p_clk_27m = {
-       .name           = "clk_27m",
-       .id             = -1,
-       .rate           = 27000000,
-};
-
-/* 48MHz USB Phy clock output */
-struct clk clk_48m = {
-       .name           = "clk_48m",
-       .id             = -1,
-       .rate           = 48000000,
-};
-
-/* APLL clock output
- * No need .ctrlbit, this is always on
-*/
-struct clk clk_fout_apll = {
-       .name           = "fout_apll",
-       .id             = -1,
-};
-
-/* BPLL clock output */
-
-struct clk clk_fout_bpll = {
-       .name           = "fout_bpll",
-       .id             = -1,
-};
-
-struct clk clk_fout_bpll_div2 = {
-       .name           = "fout_bpll_div2",
-       .id             = -1,
-};
-
-/* CPLL clock output */
-
-struct clk clk_fout_cpll = {
-       .name           = "fout_cpll",
-       .id             = -1,
-};
-
-/* MPLL clock output
- * No need .ctrlbit, this is always on
-*/
-struct clk clk_fout_mpll = {
-       .name           = "fout_mpll",
-       .id             = -1,
-};
-
-struct clk clk_fout_mpll_div2 = {
-       .name           = "fout_mpll_div2",
-       .id             = -1,
-};
-
-/* EPLL clock output */
-struct clk clk_fout_epll = {
-       .name           = "fout_epll",
-       .id             = -1,
-       .ctrlbit        = (1 << 31),
-};
-
-/* DPLL clock output */
-struct clk clk_fout_dpll = {
-       .name           = "fout_dpll",
-       .id             = -1,
-       .ctrlbit        = (1 << 31),
-};
-
-/* VPLL clock output */
-struct clk clk_fout_vpll = {
-       .name           = "fout_vpll",
-       .id             = -1,
-       .ctrlbit        = (1 << 31),
-};
-
-/* Possible clock sources for APLL Mux */
-static struct clk *clk_src_apll_list[] = {
-       [0] = &clk_fin_apll,
-       [1] = &clk_fout_apll,
-};
-
-struct clksrc_sources clk_src_apll = {
-       .sources        = clk_src_apll_list,
-       .nr_sources     = ARRAY_SIZE(clk_src_apll_list),
-};
-
-/* Possible clock sources for BPLL Mux */
-static struct clk *clk_src_bpll_list[] = {
-       [0] = &clk_fin_bpll,
-       [1] = &clk_fout_bpll,
-};
-
-struct clksrc_sources clk_src_bpll = {
-       .sources        = clk_src_bpll_list,
-       .nr_sources     = ARRAY_SIZE(clk_src_bpll_list),
-};
-
-static struct clk *clk_src_bpll_fout_list[] = {
-       [0] = &clk_fout_bpll_div2,
-       [1] = &clk_fout_bpll,
-};
-
-struct clksrc_sources clk_src_bpll_fout = {
-       .sources        = clk_src_bpll_fout_list,
-       .nr_sources     = ARRAY_SIZE(clk_src_bpll_fout_list),
-};
-
-/* Possible clock sources for CPLL Mux */
-static struct clk *clk_src_cpll_list[] = {
-       [0] = &clk_fin_cpll,
-       [1] = &clk_fout_cpll,
-};
-
-struct clksrc_sources clk_src_cpll = {
-       .sources        = clk_src_cpll_list,
-       .nr_sources     = ARRAY_SIZE(clk_src_cpll_list),
-};
-
-/* Possible clock sources for MPLL Mux */
-static struct clk *clk_src_mpll_list[] = {
-       [0] = &clk_fin_mpll,
-       [1] = &clk_fout_mpll,
-};
-
-struct clksrc_sources clk_src_mpll = {
-       .sources        = clk_src_mpll_list,
-       .nr_sources     = ARRAY_SIZE(clk_src_mpll_list),
-};
-
-static struct clk *clk_src_mpll_fout_list[] = {
-       [0] = &clk_fout_mpll_div2,
-       [1] = &clk_fout_mpll,
-};
-
-struct clksrc_sources clk_src_mpll_fout = {
-       .sources        = clk_src_mpll_fout_list,
-       .nr_sources     = ARRAY_SIZE(clk_src_mpll_fout_list),
-};
-
-/* Possible clock sources for EPLL Mux */
-static struct clk *clk_src_epll_list[] = {
-       [0] = &clk_fin_epll,
-       [1] = &clk_fout_epll,
-};
-
-struct clksrc_sources clk_src_epll = {
-       .sources        = clk_src_epll_list,
-       .nr_sources     = ARRAY_SIZE(clk_src_epll_list),
-};
-
-/* Possible clock sources for DPLL Mux */
-static struct clk *clk_src_dpll_list[] = {
-       [0] = &clk_fin_dpll,
-       [1] = &clk_fout_dpll,
-};
-
-struct clksrc_sources clk_src_dpll = {
-       .sources        = clk_src_dpll_list,
-       .nr_sources     = ARRAY_SIZE(clk_src_dpll_list),
-};
-
-struct clk clk_vpll = {
-       .name           = "vpll",
-       .id             = -1,
-};
-
-int s5p_gatectrl(void __iomem *reg, struct clk *clk, int enable)
-{
-       unsigned int ctrlbit = clk->ctrlbit;
-       u32 con;
-
-       con = __raw_readl(reg);
-       con = enable ? (con | ctrlbit) : (con & ~ctrlbit);
-       __raw_writel(con, reg);
-       return 0;
-}
-
-int s5p_epll_enable(struct clk *clk, int enable)
-{
-       unsigned int ctrlbit = clk->ctrlbit;
-       unsigned int epll_con = __raw_readl(S5P_EPLL_CON) & ~ctrlbit;
-
-       if (enable)
-               __raw_writel(epll_con | ctrlbit, S5P_EPLL_CON);
-       else
-               __raw_writel(epll_con, S5P_EPLL_CON);
-
-       return 0;
-}
-
-unsigned long s5p_epll_get_rate(struct clk *clk)
-{
-       return clk->rate;
-}
-
-int s5p_spdif_set_rate(struct clk *clk, unsigned long rate)
-{
-       struct clk *pclk;
-       int ret;
-
-       pclk = clk_get_parent(clk);
-       if (IS_ERR(pclk))
-               return -EINVAL;
-
-       ret = pclk->ops->set_rate(pclk, rate);
-       clk_put(pclk);
-
-       return ret;
-}
-
-unsigned long s5p_spdif_get_rate(struct clk *clk)
-{
-       struct clk *pclk;
-       int rate;
-
-       pclk = clk_get_parent(clk);
-       if (IS_ERR(pclk))
-               return -EINVAL;
-
-       rate = pclk->ops->get_rate(pclk);
-       clk_put(pclk);
-
-       return rate;
-}
-
-struct clk_ops s5p_sclk_spdif_ops = {
-       .set_rate       = s5p_spdif_set_rate,
-       .get_rate       = s5p_spdif_get_rate,
-};
-
-static struct clk *s5p_clks[] __initdata = {
-       &clk_ext_xtal_mux,
-       &clk_48m,
-       &s5p_clk_27m,
-       &clk_fout_apll,
-       &clk_fout_mpll,
-       &clk_fout_epll,
-       &clk_fout_dpll,
-       &clk_fout_vpll,
-       &clk_vpll,
-       &clk_xusbxti,
-};
-
-void __init s5p_register_clocks(unsigned long xtal_freq)
-{
-       int ret;
-
-       clk_ext_xtal_mux.rate = xtal_freq;
-
-       ret = s3c24xx_register_clocks(s5p_clks, ARRAY_SIZE(s5p_clks));
-       if (ret > 0)
-               printk(KERN_ERR "Failed to register s5p clocks\n");
-}
index 469b86260fe3f75e97987dafb1d557ebdf4b0fb1..0b04b6b0fa302f97fef4996de97efe59ca572be4 100644 (file)
 #include <linux/of_fdt.h>
 #include <linux/of.h>
 
-#include <plat/mfc.h>
-
-#ifdef CONFIG_SAMSUNG_ATAGS
-#include <mach/map.h>
-#include <mach/irqs.h>
-#include <plat/devs.h>
-
-static struct resource s5p_mfc_resource[] = {
-       [0] = DEFINE_RES_MEM(S5P_PA_MFC, SZ_64K),
-       [1] = DEFINE_RES_IRQ(IRQ_MFC),
-};
-
-struct platform_device s5p_device_mfc = {
-       .name           = "s5p-mfc",
-       .id             = -1,
-       .num_resources  = ARRAY_SIZE(s5p_mfc_resource),
-       .resource       = s5p_mfc_resource,
-};
-
-/*
- * MFC hardware has 2 memory interfaces which are modelled as two separate
- * platform devices to let dma-mapping distinguish between them.
- *
- * MFC parent device (s5p_device_mfc) must be registered before memory
- * interface specific devices (s5p_device_mfc_l and s5p_device_mfc_r).
- */
-
-struct platform_device s5p_device_mfc_l = {
-       .name           = "s5p-mfc-l",
-       .id             = -1,
-       .dev            = {
-               .parent                 = &s5p_device_mfc.dev,
-               .dma_mask               = &s5p_device_mfc_l.dev.coherent_dma_mask,
-               .coherent_dma_mask      = DMA_BIT_MASK(32),
-       },
-};
-
-struct platform_device s5p_device_mfc_r = {
-       .name           = "s5p-mfc-r",
-       .id             = -1,
-       .dev            = {
-               .parent                 = &s5p_device_mfc.dev,
-               .dma_mask               = &s5p_device_mfc_r.dev.coherent_dma_mask,
-               .coherent_dma_mask      = DMA_BIT_MASK(32),
-       },
-};
-#else
 static struct platform_device s5p_device_mfc_l;
 static struct platform_device s5p_device_mfc_r;
-#endif
+
+struct s5p_mfc_dt_meminfo {
+       unsigned long   loff;
+       unsigned long   lsize;
+       unsigned long   roff;
+       unsigned long   rsize;
+       char            *compatible;
+};
 
 struct s5p_mfc_reserved_mem {
        phys_addr_t     base;
@@ -77,7 +37,7 @@ struct s5p_mfc_reserved_mem {
 static struct s5p_mfc_reserved_mem s5p_mfc_mem[2] __initdata;
 
 
-void __init s5p_mfc_reserve_mem(phys_addr_t rbase, unsigned int rsize,
+static void __init s5p_mfc_reserve_mem(phys_addr_t rbase, unsigned int rsize,
                                phys_addr_t lbase, unsigned int lsize)
 {
        int i;
@@ -100,28 +60,6 @@ void __init s5p_mfc_reserve_mem(phys_addr_t rbase, unsigned int rsize,
        }
 }
 
-#ifdef CONFIG_SAMSUNG_ATAGS
-static int __init s5p_mfc_memory_init(void)
-{
-       int i;
-
-       for (i = 0; i < ARRAY_SIZE(s5p_mfc_mem); i++) {
-               struct s5p_mfc_reserved_mem *area = &s5p_mfc_mem[i];
-               if (!area->base)
-                       continue;
-
-               if (dma_declare_coherent_memory(area->dev, area->base,
-                               area->base, area->size,
-                               DMA_MEMORY_MAP | DMA_MEMORY_EXCLUSIVE) == 0)
-                       printk(KERN_ERR "Failed to declare coherent memory for MFC device (%ld bytes at 0x%08lx)\n",
-                              area->size, (unsigned long) area->base);
-       }
-       return 0;
-}
-device_initcall(s5p_mfc_memory_init);
-#endif
-
-#ifdef CONFIG_OF
 int __init s5p_fdt_alloc_mfc_mem(unsigned long node, const char *uname,
                                int depth, void *data)
 {
@@ -154,4 +92,3 @@ int __init s5p_fdt_alloc_mfc_mem(unsigned long node, const char *uname,
 
        return 1;
 }
-#endif
diff --git a/arch/arm/plat-samsung/s5p-dev-uart.c b/arch/arm/plat-samsung/s5p-dev-uart.c
deleted file mode 100644 (file)
index 8c4487a..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright (c) 2009,2012 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com/
- *
- * Base S5P UART resource and device definitions
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/interrupt.h>
-#include <linux/list.h>
-#include <linux/ioport.h>
-#include <linux/platform_device.h>
-
-#include <asm/mach/arch.h>
-#include <asm/mach/irq.h>
-#include <mach/map.h>
-
-#include <plat/devs.h>
-
- /* Serial port registrations */
-
-static struct resource s5p_uart0_resource[] = {
-       [0] = DEFINE_RES_MEM(S5P_PA_UART0, S5P_SZ_UART),
-       [1] = DEFINE_RES_IRQ(IRQ_UART0),
-};
-
-static struct resource s5p_uart1_resource[] = {
-       [0] = DEFINE_RES_MEM(S5P_PA_UART1, S5P_SZ_UART),
-       [1] = DEFINE_RES_IRQ(IRQ_UART1),
-};
-
-static struct resource s5p_uart2_resource[] = {
-       [0] = DEFINE_RES_MEM(S5P_PA_UART2, S5P_SZ_UART),
-       [1] = DEFINE_RES_IRQ(IRQ_UART2),
-};
-
-static struct resource s5p_uart3_resource[] = {
-#if CONFIG_SERIAL_SAMSUNG_UARTS > 3
-       [0] = DEFINE_RES_MEM(S5P_PA_UART3, S5P_SZ_UART),
-       [1] = DEFINE_RES_IRQ(IRQ_UART3),
-#endif
-};
-
-static struct resource s5p_uart4_resource[] = {
-#if CONFIG_SERIAL_SAMSUNG_UARTS > 4
-       [0] = DEFINE_RES_MEM(S5P_PA_UART4, S5P_SZ_UART),
-       [1] = DEFINE_RES_IRQ(IRQ_UART4),
-#endif
-};
-
-static struct resource s5p_uart5_resource[] = {
-#if CONFIG_SERIAL_SAMSUNG_UARTS > 5
-       [0] = DEFINE_RES_MEM(S5P_PA_UART5, S5P_SZ_UART),
-       [1] = DEFINE_RES_IRQ(IRQ_UART5),
-#endif
-};
-
-struct s3c24xx_uart_resources s5p_uart_resources[] __initdata = {
-       [0] = {
-               .resources      = s5p_uart0_resource,
-               .nr_resources   = ARRAY_SIZE(s5p_uart0_resource),
-       },
-       [1] = {
-               .resources      = s5p_uart1_resource,
-               .nr_resources   = ARRAY_SIZE(s5p_uart1_resource),
-       },
-       [2] = {
-               .resources      = s5p_uart2_resource,
-               .nr_resources   = ARRAY_SIZE(s5p_uart2_resource),
-       },
-       [3] = {
-               .resources      = s5p_uart3_resource,
-               .nr_resources   = ARRAY_SIZE(s5p_uart3_resource),
-       },
-       [4] = {
-               .resources      = s5p_uart4_resource,
-               .nr_resources   = ARRAY_SIZE(s5p_uart4_resource),
-       },
-       [5] = {
-               .resources      = s5p_uart5_resource,
-               .nr_resources   = ARRAY_SIZE(s5p_uart5_resource),
-       },
-};
diff --git a/arch/arm/plat-samsung/s5p-irq-eint.c b/arch/arm/plat-samsung/s5p-irq-eint.c
deleted file mode 100644 (file)
index ebee4dc..0000000
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- * Copyright (c) 2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * S5P - IRQ EINT support
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#include <linux/kernel.h>
-#include <linux/interrupt.h>
-#include <linux/irq.h>
-#include <linux/io.h>
-#include <linux/device.h>
-#include <linux/gpio.h>
-#include <linux/irqchip/arm-vic.h>
-#include <linux/of.h>
-
-#include <plat/regs-irqtype.h>
-
-#include <mach/map.h>
-#include <plat/cpu.h>
-#include <plat/pm.h>
-
-#include <plat/gpio-cfg.h>
-#include <mach/regs-gpio.h>
-
-static inline void s5p_irq_eint_mask(struct irq_data *data)
-{
-       u32 mask;
-
-       mask = __raw_readl(S5P_EINT_MASK(EINT_REG_NR(data->irq)));
-       mask |= eint_irq_to_bit(data->irq);
-       __raw_writel(mask, S5P_EINT_MASK(EINT_REG_NR(data->irq)));
-}
-
-static void s5p_irq_eint_unmask(struct irq_data *data)
-{
-       u32 mask;
-
-       mask = __raw_readl(S5P_EINT_MASK(EINT_REG_NR(data->irq)));
-       mask &= ~(eint_irq_to_bit(data->irq));
-       __raw_writel(mask, S5P_EINT_MASK(EINT_REG_NR(data->irq)));
-}
-
-static inline void s5p_irq_eint_ack(struct irq_data *data)
-{
-       __raw_writel(eint_irq_to_bit(data->irq),
-                    S5P_EINT_PEND(EINT_REG_NR(data->irq)));
-}
-
-static void s5p_irq_eint_maskack(struct irq_data *data)
-{
-       /* compiler should in-line these */
-       s5p_irq_eint_mask(data);
-       s5p_irq_eint_ack(data);
-}
-
-static int s5p_irq_eint_set_type(struct irq_data *data, unsigned int type)
-{
-       int offs = EINT_OFFSET(data->irq);
-       int shift;
-       u32 ctrl, mask;
-       u32 newvalue = 0;
-
-       switch (type) {
-       case IRQ_TYPE_EDGE_RISING:
-               newvalue = S5P_IRQ_TYPE_EDGE_RISING;
-               break;
-
-       case IRQ_TYPE_EDGE_FALLING:
-               newvalue = S5P_IRQ_TYPE_EDGE_FALLING;
-               break;
-
-       case IRQ_TYPE_EDGE_BOTH:
-               newvalue = S5P_IRQ_TYPE_EDGE_BOTH;
-               break;
-
-       case IRQ_TYPE_LEVEL_LOW:
-               newvalue = S5P_IRQ_TYPE_LEVEL_LOW;
-               break;
-
-       case IRQ_TYPE_LEVEL_HIGH:
-               newvalue = S5P_IRQ_TYPE_LEVEL_HIGH;
-               break;
-
-       default:
-               printk(KERN_ERR "No such irq type %d", type);
-               return -EINVAL;
-       }
-
-       shift = (offs & 0x7) * 4;
-       mask = 0x7 << shift;
-
-       ctrl = __raw_readl(S5P_EINT_CON(EINT_REG_NR(data->irq)));
-       ctrl &= ~mask;
-       ctrl |= newvalue << shift;
-       __raw_writel(ctrl, S5P_EINT_CON(EINT_REG_NR(data->irq)));
-
-       if ((0 <= offs) && (offs < 8))
-               s3c_gpio_cfgpin(EINT_GPIO_0(offs & 0x7), EINT_MODE);
-
-       else if ((8 <= offs) && (offs < 16))
-               s3c_gpio_cfgpin(EINT_GPIO_1(offs & 0x7), EINT_MODE);
-
-       else if ((16 <= offs) && (offs < 24))
-               s3c_gpio_cfgpin(EINT_GPIO_2(offs & 0x7), EINT_MODE);
-
-       else if ((24 <= offs) && (offs < 32))
-               s3c_gpio_cfgpin(EINT_GPIO_3(offs & 0x7), EINT_MODE);
-
-       else
-               printk(KERN_ERR "No such irq number %d", offs);
-
-       return 0;
-}
-
-static struct irq_chip s5p_irq_eint = {
-       .name           = "s5p-eint",
-       .irq_mask       = s5p_irq_eint_mask,
-       .irq_unmask     = s5p_irq_eint_unmask,
-       .irq_mask_ack   = s5p_irq_eint_maskack,
-       .irq_ack        = s5p_irq_eint_ack,
-       .irq_set_type   = s5p_irq_eint_set_type,
-#ifdef CONFIG_PM
-       .irq_set_wake   = s3c_irqext_wake,
-#endif
-};
-
-/* s5p_irq_demux_eint
- *
- * This function demuxes the IRQ from the group0 external interrupts,
- * from EINTs 16 to 31. It is designed to be inlined into the specific
- * handler s5p_irq_demux_eintX_Y.
- *
- * Each EINT pend/mask registers handle eight of them.
- */
-static inline void s5p_irq_demux_eint(unsigned int start)
-{
-       u32 status = __raw_readl(S5P_EINT_PEND(EINT_REG_NR(start)));
-       u32 mask = __raw_readl(S5P_EINT_MASK(EINT_REG_NR(start)));
-       unsigned int irq;
-
-       status &= ~mask;
-       status &= 0xff;
-
-       while (status) {
-               irq = fls(status) - 1;
-               generic_handle_irq(irq + start);
-               status &= ~(1 << irq);
-       }
-}
-
-static void s5p_irq_demux_eint16_31(unsigned int irq, struct irq_desc *desc)
-{
-       s5p_irq_demux_eint(IRQ_EINT(16));
-       s5p_irq_demux_eint(IRQ_EINT(24));
-}
-
-static inline void s5p_irq_vic_eint_mask(struct irq_data *data)
-{
-       void __iomem *base = irq_data_get_irq_chip_data(data);
-
-       s5p_irq_eint_mask(data);
-       writel(1 << EINT_OFFSET(data->irq), base + VIC_INT_ENABLE_CLEAR);
-}
-
-static void s5p_irq_vic_eint_unmask(struct irq_data *data)
-{
-       void __iomem *base = irq_data_get_irq_chip_data(data);
-
-       s5p_irq_eint_unmask(data);
-       writel(1 << EINT_OFFSET(data->irq), base + VIC_INT_ENABLE);
-}
-
-static inline void s5p_irq_vic_eint_ack(struct irq_data *data)
-{
-       __raw_writel(eint_irq_to_bit(data->irq),
-                    S5P_EINT_PEND(EINT_REG_NR(data->irq)));
-}
-
-static void s5p_irq_vic_eint_maskack(struct irq_data *data)
-{
-       s5p_irq_vic_eint_mask(data);
-       s5p_irq_vic_eint_ack(data);
-}
-
-static struct irq_chip s5p_irq_vic_eint = {
-       .name           = "s5p_vic_eint",
-       .irq_mask       = s5p_irq_vic_eint_mask,
-       .irq_unmask     = s5p_irq_vic_eint_unmask,
-       .irq_mask_ack   = s5p_irq_vic_eint_maskack,
-       .irq_ack        = s5p_irq_vic_eint_ack,
-       .irq_set_type   = s5p_irq_eint_set_type,
-#ifdef CONFIG_PM
-       .irq_set_wake   = s3c_irqext_wake,
-#endif
-};
-
-static int __init s5p_init_irq_eint(void)
-{
-       int irq;
-
-       if (of_have_populated_dt())
-               return -ENODEV;
-
-       for (irq = IRQ_EINT(0); irq <= IRQ_EINT(15); irq++)
-               irq_set_chip(irq, &s5p_irq_vic_eint);
-
-       for (irq = IRQ_EINT(16); irq <= IRQ_EINT(31); irq++) {
-               irq_set_chip_and_handler(irq, &s5p_irq_eint, handle_level_irq);
-               set_irq_flags(irq, IRQF_VALID);
-       }
-
-       irq_set_chained_handler(IRQ_EINT16_31, s5p_irq_demux_eint16_31);
-       return 0;
-}
-
-arch_initcall(s5p_init_irq_eint);
diff --git a/arch/arm/plat-samsung/s5p-irq-gpioint.c b/arch/arm/plat-samsung/s5p-irq-gpioint.c
deleted file mode 100644 (file)
index fafdb05..0000000
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- * Copyright (c) 2010 Samsung Electronics Co., Ltd.
- * Author: Kyungmin Park <kyungmin.park@samsung.com>
- * Author: Joonyoung Shim <jy0922.shim@samsung.com>
- * Author: Marek Szyprowski <m.szyprowski@samsung.com>
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- */
-
-#include <linux/kernel.h>
-#include <linux/interrupt.h>
-#include <linux/irq.h>
-#include <linux/irqchip/chained_irq.h>
-#include <linux/io.h>
-#include <linux/gpio.h>
-#include <linux/slab.h>
-
-#include <mach/map.h>
-#include <plat/gpio-core.h>
-#include <plat/gpio-cfg.h>
-
-#define GPIO_BASE(chip)                ((void __iomem *)((unsigned long)((chip)->base) & 0xFFFFF000u))
-
-#define CON_OFFSET             0x700
-#define MASK_OFFSET            0x900
-#define PEND_OFFSET            0xA00
-#define REG_OFFSET(x)          ((x) << 2)
-
-struct s5p_gpioint_bank {
-       struct list_head        list;
-       int                     start;
-       int                     nr_groups;
-       int                     irq;
-       struct samsung_gpio_chip        **chips;
-       void                    (*handler)(unsigned int, struct irq_desc *);
-};
-
-static LIST_HEAD(banks);
-
-static int s5p_gpioint_set_type(struct irq_data *d, unsigned int type)
-{
-       struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
-       struct irq_chip_type *ct = gc->chip_types;
-       unsigned int shift = (d->irq - gc->irq_base) << 2;
-
-       switch (type) {
-       case IRQ_TYPE_EDGE_RISING:
-               type = S5P_IRQ_TYPE_EDGE_RISING;
-               break;
-       case IRQ_TYPE_EDGE_FALLING:
-               type = S5P_IRQ_TYPE_EDGE_FALLING;
-               break;
-       case IRQ_TYPE_EDGE_BOTH:
-               type = S5P_IRQ_TYPE_EDGE_BOTH;
-               break;
-       case IRQ_TYPE_LEVEL_HIGH:
-               type = S5P_IRQ_TYPE_LEVEL_HIGH;
-               break;
-       case IRQ_TYPE_LEVEL_LOW:
-               type = S5P_IRQ_TYPE_LEVEL_LOW;
-               break;
-       case IRQ_TYPE_NONE:
-       default:
-               printk(KERN_WARNING "No irq type\n");
-               return -EINVAL;
-       }
-
-       gc->type_cache &= ~(0x7 << shift);
-       gc->type_cache |= type << shift;
-       writel(gc->type_cache, gc->reg_base + ct->regs.type);
-       return 0;
-}
-
-static void s5p_gpioint_handler(unsigned int irq, struct irq_desc *desc)
-{
-       struct s5p_gpioint_bank *bank = irq_get_handler_data(irq);
-       int group, pend_offset, mask_offset;
-       unsigned int pend, mask;
-
-       struct irq_chip *chip = irq_get_chip(irq);
-       chained_irq_enter(chip, desc);
-
-       for (group = 0; group < bank->nr_groups; group++) {
-               struct samsung_gpio_chip *chip = bank->chips[group];
-               if (!chip)
-                       continue;
-
-               pend_offset = REG_OFFSET(group);
-               pend = __raw_readl(GPIO_BASE(chip) + PEND_OFFSET + pend_offset);
-               if (!pend)
-                       continue;
-
-               mask_offset = REG_OFFSET(group);
-               mask = __raw_readl(GPIO_BASE(chip) + MASK_OFFSET + mask_offset);
-               pend &= ~mask;
-
-               while (pend) {
-                       int offset = fls(pend) - 1;
-                       int real_irq = chip->irq_base + offset;
-                       generic_handle_irq(real_irq);
-                       pend &= ~BIT(offset);
-               }
-       }
-       chained_irq_exit(chip, desc);
-}
-
-static __init int s5p_gpioint_add(struct samsung_gpio_chip *chip)
-{
-       static int used_gpioint_groups = 0;
-       int group = chip->group;
-       struct s5p_gpioint_bank *b, *bank = NULL;
-       struct irq_chip_generic *gc;
-       struct irq_chip_type *ct;
-
-       if (used_gpioint_groups >= S5P_GPIOINT_GROUP_COUNT)
-               return -ENOMEM;
-
-       list_for_each_entry(b, &banks, list) {
-               if (group >= b->start && group < b->start + b->nr_groups) {
-                       bank = b;
-                       break;
-               }
-       }
-       if (!bank)
-               return -EINVAL;
-
-       if (!bank->handler) {
-               bank->chips = kzalloc(sizeof(struct samsung_gpio_chip *) *
-                                     bank->nr_groups, GFP_KERNEL);
-               if (!bank->chips)
-                       return -ENOMEM;
-
-               irq_set_chained_handler(bank->irq, s5p_gpioint_handler);
-               irq_set_handler_data(bank->irq, bank);
-               bank->handler = s5p_gpioint_handler;
-               printk(KERN_INFO "Registered chained gpio int handler for interrupt %d.\n",
-                      bank->irq);
-       }
-
-       /*
-        * chained GPIO irq has been successfully registered, allocate new gpio
-        * int group and assign irq nubmers
-        */
-       chip->irq_base = S5P_GPIOINT_BASE +
-                        used_gpioint_groups * S5P_GPIOINT_GROUP_SIZE;
-       used_gpioint_groups++;
-
-       bank->chips[group - bank->start] = chip;
-
-       gc = irq_alloc_generic_chip("s5p_gpioint", 1, chip->irq_base,
-                                   GPIO_BASE(chip),
-                                   handle_level_irq);
-       if (!gc)
-               return -ENOMEM;
-       ct = gc->chip_types;
-       ct->chip.irq_ack = irq_gc_ack_set_bit;
-       ct->chip.irq_mask = irq_gc_mask_set_bit;
-       ct->chip.irq_unmask = irq_gc_mask_clr_bit;
-       ct->chip.irq_set_type = s5p_gpioint_set_type,
-       ct->regs.ack = PEND_OFFSET + REG_OFFSET(group - bank->start);
-       ct->regs.mask = MASK_OFFSET + REG_OFFSET(group - bank->start);
-       ct->regs.type = CON_OFFSET + REG_OFFSET(group - bank->start);
-       irq_setup_generic_chip(gc, IRQ_MSK(chip->chip.ngpio),
-                              IRQ_GC_INIT_MASK_CACHE,
-                              IRQ_NOREQUEST | IRQ_NOPROBE, 0);
-       return 0;
-}
-
-int __init s5p_register_gpio_interrupt(int pin)
-{
-       struct samsung_gpio_chip *my_chip = samsung_gpiolib_getchip(pin);
-       int offset, group;
-       int ret;
-
-       if (!my_chip)
-               return -EINVAL;
-
-       offset = pin - my_chip->chip.base;
-       group = my_chip->group;
-
-       /* check if the group has been already registered */
-       if (my_chip->irq_base)
-               goto success;
-
-       /* register gpio group */
-       ret = s5p_gpioint_add(my_chip);
-       if (ret == 0) {
-               my_chip->chip.to_irq = samsung_gpiolib_to_irq;
-               printk(KERN_INFO "Registered interrupt support for gpio group %d.\n",
-                      group);
-               goto success;
-       }
-       return ret;
-success:
-       my_chip->bitmap_gpio_int |= BIT(offset);
-
-       return my_chip->irq_base + offset;
-}
-
-int __init s5p_register_gpioint_bank(int chain_irq, int start, int nr_groups)
-{
-       struct s5p_gpioint_bank *bank;
-
-       bank = kzalloc(sizeof(*bank), GFP_KERNEL);
-       if (!bank)
-               return -ENOMEM;
-
-       bank->start = start;
-       bank->nr_groups = nr_groups;
-       bank->irq = chain_irq;
-
-       list_add_tail(&bank->list, &banks);
-       return 0;
-}
diff --git a/arch/arm/plat-samsung/s5p-irq-pm.c b/arch/arm/plat-samsung/s5p-irq-pm.c
deleted file mode 100644 (file)
index 52b1694..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (c) 2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * Based on arch/arm/plat-s3c24xx/irq-pm.c,
- * Copyright (c) 2003,2004 Simtec Electronics
- *     Ben Dooks <ben@simtec.co.uk>
- *     http://armlinux.simtec.co.uk/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#include <linux/init.h>
-#include <linux/module.h>
-#include <linux/interrupt.h>
-
-#include <plat/cpu.h>
-#include <plat/irqs.h>
-#include <plat/pm.h>
-#include <mach/map.h>
-
-#include <mach/regs-gpio.h>
-#include <mach/regs-irq.h>
-
-/* state for IRQs over sleep */
-
-/* default is to allow for EINT0..EINT31, and IRQ_RTC_TIC, IRQ_RTC_ALARM,
- * as wakeup sources
- *
- * set bit to 1 in allow bitfield to enable the wakeup settings on it
-*/
-
-unsigned long s3c_irqwake_intallow     = 0x00000006L;
-unsigned long s3c_irqwake_eintallow    = 0xffffffffL;
-
-int s3c_irq_wake(struct irq_data *data, unsigned int state)
-{
-       unsigned long irqbit;
-       unsigned int irq_rtc_tic, irq_rtc_alarm;
-
-       irq_rtc_tic = IRQ_RTC_TIC;
-       irq_rtc_alarm = IRQ_RTC_ALARM;
-
-       if (data->irq == irq_rtc_tic || data->irq == irq_rtc_alarm) {
-               irqbit = 1 << (data->irq + 1 - irq_rtc_alarm);
-
-               if (!state)
-                       s3c_irqwake_intmask |= irqbit;
-               else
-                       s3c_irqwake_intmask &= ~irqbit;
-       } else {
-               return -ENOENT;
-       }
-
-       return 0;
-}
-
-static struct sleep_save eint_save[] = {
-       SAVE_ITEM(S5P_EINT_CON(0)),
-       SAVE_ITEM(S5P_EINT_CON(1)),
-       SAVE_ITEM(S5P_EINT_CON(2)),
-       SAVE_ITEM(S5P_EINT_CON(3)),
-
-       SAVE_ITEM(S5P_EINT_FLTCON(0)),
-       SAVE_ITEM(S5P_EINT_FLTCON(1)),
-       SAVE_ITEM(S5P_EINT_FLTCON(2)),
-       SAVE_ITEM(S5P_EINT_FLTCON(3)),
-       SAVE_ITEM(S5P_EINT_FLTCON(4)),
-       SAVE_ITEM(S5P_EINT_FLTCON(5)),
-       SAVE_ITEM(S5P_EINT_FLTCON(6)),
-       SAVE_ITEM(S5P_EINT_FLTCON(7)),
-
-       SAVE_ITEM(S5P_EINT_MASK(0)),
-       SAVE_ITEM(S5P_EINT_MASK(1)),
-       SAVE_ITEM(S5P_EINT_MASK(2)),
-       SAVE_ITEM(S5P_EINT_MASK(3)),
-};
-
-int s3c24xx_irq_suspend(void)
-{
-       s3c_pm_do_save(eint_save, ARRAY_SIZE(eint_save));
-
-       return 0;
-}
-
-void s3c24xx_irq_resume(void)
-{
-       s3c_pm_do_restore(eint_save, ARRAY_SIZE(eint_save));
-}
-
diff --git a/arch/arm/plat-samsung/s5p-irq.c b/arch/arm/plat-samsung/s5p-irq.c
deleted file mode 100644 (file)
index ddfaca9..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (c) 2009 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com/
- *
- * S5P - Interrupt handling
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#include <linux/kernel.h>
-#include <linux/interrupt.h>
-#include <linux/irq.h>
-#include <linux/io.h>
-#include <linux/irqchip/arm-vic.h>
-
-#include <mach/irqs.h>
-#include <mach/map.h>
-#include <plat/cpu.h>
-
-void __init s5p_init_irq(u32 *vic, u32 num_vic)
-{
-#ifdef CONFIG_ARM_VIC
-       int irq;
-
-       /* initialize the VICs */
-       for (irq = 0; irq < num_vic; irq++)
-               vic_init(VA_VIC(irq), VIC_BASE(irq), vic[irq], 0);
-#endif
-}
diff --git a/arch/arm/plat-samsung/s5p-pm.c b/arch/arm/plat-samsung/s5p-pm.c
deleted file mode 100644 (file)
index 0747468..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (c) 2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * S5P Power Manager (Suspend-To-RAM) support
- *
- * Based on arch/arm/plat-s3c24xx/pm.c
- * Copyright (c) 2004,2006 Simtec Electronics
- *     Ben Dooks <ben@simtec.co.uk>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#include <linux/suspend.h>
-#include <plat/pm.h>
-
-#define PFX "s5p pm: "
-
-/* s3c_pm_configure_extint
- *
- * configure all external interrupt pins
-*/
-
-void s3c_pm_configure_extint(void)
-{
-       /* nothing here yet */
-}
-
-void s3c_pm_restore_core(void)
-{
-       /* nothing here yet */
-}
-
-void s3c_pm_save_core(void)
-{
-       /* nothing here yet */
-}
-
diff --git a/arch/arm/plat-samsung/s5p-sleep.S b/arch/arm/plat-samsung/s5p-sleep.S
deleted file mode 100644 (file)
index 25c68ce..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (c) 2011 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * Common S5P Sleep Code
- * Based on S3C64XX sleep code by:
- *     Ben Dooks, (c) 2008 Simtec Electronics
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-*/
-
-#include <linux/linkage.h>
-
-       .data
-       .align
-
-       /*
-        * sleep magic, to allow the bootloader to check for an valid
-        * image to resume to. Must be the first word before the
-        * s3c_cpu_resume entry.
-        */
-
-       .word   0x2bedf00d
-
-       /*
-        * s3c_cpu_resume
-        *
-        * resume code entry for bootloader to call
-        */
-
-ENTRY(s3c_cpu_resume)
-       b       cpu_resume
-ENDPROC(s3c_cpu_resume)
index fce41e93b6a4e74d9b4fb7622d12a80b1734dc36..a301ca2c7d00e4b47b7e9b6316f9fa57a8f738be 100644 (file)
@@ -3,9 +3,6 @@ if PLAT_VERSATILE
 config PLAT_VERSATILE_CLOCK
        bool
 
-config PLAT_VERSATILE_CLCD
-       bool
-
 config PLAT_VERSATILE_SCHED_CLOCK
        def_bool y
 
index 2e0c472958ae42b0e175a65ea566f793ef07cd3d..03c4900ac3f4df1000f62d014e2ac22e7ad474ab 100644 (file)
@@ -1,6 +1,5 @@
 ccflags-$(CONFIG_ARCH_MULTIPLATFORM) := -I$(srctree)/$(src)/include
 
 obj-$(CONFIG_PLAT_VERSATILE_CLOCK) += clock.o
-obj-$(CONFIG_PLAT_VERSATILE_CLCD) += clcd.o
 obj-$(CONFIG_PLAT_VERSATILE_SCHED_CLOCK) += sched-clock.o
 obj-$(CONFIG_SMP) += headsmp.o platsmp.o
diff --git a/arch/arm/plat-versatile/clcd.c b/arch/arm/plat-versatile/clcd.c
deleted file mode 100644 (file)
index 6628cc2..0000000
+++ /dev/null
@@ -1,182 +0,0 @@
-#include <linux/device.h>
-#include <linux/dma-mapping.h>
-#include <linux/amba/bus.h>
-#include <linux/amba/clcd.h>
-#include <plat/clcd.h>
-
-static struct clcd_panel vga = {
-       .mode           = {
-               .name           = "VGA",
-               .refresh        = 60,
-               .xres           = 640,
-               .yres           = 480,
-               .pixclock       = 39721,
-               .left_margin    = 40,
-               .right_margin   = 24,
-               .upper_margin   = 32,
-               .lower_margin   = 11,
-               .hsync_len      = 96,
-               .vsync_len      = 2,
-               .sync           = 0,
-               .vmode          = FB_VMODE_NONINTERLACED,
-       },
-       .width          = -1,
-       .height         = -1,
-       .tim2           = TIM2_BCD | TIM2_IPC,
-       .cntl           = CNTL_LCDTFT | CNTL_BGR | CNTL_LCDVCOMP(1),
-       .caps           = CLCD_CAP_5551 | CLCD_CAP_565 | CLCD_CAP_888,
-       .bpp            = 16,
-};
-
-static struct clcd_panel xvga = {
-       .mode           = {
-               .name           = "XVGA",
-               .refresh        = 60,
-               .xres           = 1024,
-               .yres           = 768,
-               .pixclock       = 15748,
-               .left_margin    = 152,
-               .right_margin   = 48,
-               .upper_margin   = 23,
-               .lower_margin   = 3,
-               .hsync_len      = 104,
-               .vsync_len      = 4,
-               .sync           = 0,
-               .vmode          = FB_VMODE_NONINTERLACED,
-       },
-       .width          = -1,
-       .height         = -1,
-       .tim2           = TIM2_BCD | TIM2_IPC,
-       .cntl           = CNTL_LCDTFT | CNTL_BGR | CNTL_LCDVCOMP(1),
-       .caps           = CLCD_CAP_5551 | CLCD_CAP_565 | CLCD_CAP_888,
-       .bpp            = 16,
-};
-
-/* Sanyo TM38QV67A02A - 3.8 inch QVGA (320x240) Color TFT */
-static struct clcd_panel sanyo_tm38qv67a02a = {
-       .mode           = {
-               .name           = "Sanyo TM38QV67A02A",
-               .refresh        = 116,
-               .xres           = 320,
-               .yres           = 240,
-               .pixclock       = 100000,
-               .left_margin    = 6,
-               .right_margin   = 6,
-               .upper_margin   = 5,
-               .lower_margin   = 5,
-               .hsync_len      = 6,
-               .vsync_len      = 6,
-               .sync           = 0,
-               .vmode          = FB_VMODE_NONINTERLACED,
-       },
-       .width          = -1,
-       .height         = -1,
-       .tim2           = TIM2_BCD,
-       .cntl           = CNTL_LCDTFT | CNTL_BGR | CNTL_LCDVCOMP(1),
-       .caps           = CLCD_CAP_5551,
-       .bpp            = 16,
-};
-
-static struct clcd_panel sanyo_2_5_in = {
-       .mode           = {
-               .name           = "Sanyo QVGA Portrait",
-               .refresh        = 116,
-               .xres           = 240,
-               .yres           = 320,
-               .pixclock       = 100000,
-               .left_margin    = 20,
-               .right_margin   = 10,
-               .upper_margin   = 2,
-               .lower_margin   = 2,
-               .hsync_len      = 10,
-               .vsync_len      = 2,
-               .sync           = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
-               .vmode          = FB_VMODE_NONINTERLACED,
-       },
-       .width          = -1,
-       .height         = -1,
-       .tim2           = TIM2_IVS | TIM2_IHS | TIM2_IPC,
-       .cntl           = CNTL_LCDTFT | CNTL_BGR | CNTL_LCDVCOMP(1),
-       .caps           = CLCD_CAP_5551,
-       .bpp            = 16,
-};
-
-/* Epson L2F50113T00 - 2.2 inch 176x220 Color TFT */
-static struct clcd_panel epson_l2f50113t00 = {
-       .mode           = {
-               .name           = "Epson L2F50113T00",
-               .refresh        = 390,
-               .xres           = 176,
-               .yres           = 220,
-               .pixclock       = 62500,
-               .left_margin    = 3,
-               .right_margin   = 2,
-               .upper_margin   = 1,
-               .lower_margin   = 0,
-               .hsync_len      = 3,
-               .vsync_len      = 2,
-               .sync           = 0,
-               .vmode          = FB_VMODE_NONINTERLACED,
-       },
-       .width          = -1,
-       .height         = -1,
-       .tim2           = TIM2_BCD | TIM2_IPC,
-       .cntl           = CNTL_LCDTFT | CNTL_BGR | CNTL_LCDVCOMP(1),
-       .caps           = CLCD_CAP_5551,
-       .bpp            = 16,
-};
-
-static struct clcd_panel *panels[] = {
-       &vga,
-       &xvga,
-       &sanyo_tm38qv67a02a,
-       &sanyo_2_5_in,
-       &epson_l2f50113t00,
-};
-
-struct clcd_panel *versatile_clcd_get_panel(const char *name)
-{
-       int i;
-
-       for (i = 0; i < ARRAY_SIZE(panels); i++)
-               if (strcmp(panels[i]->mode.name, name) == 0)
-                       break;
-
-       if (i < ARRAY_SIZE(panels))
-               return panels[i];
-
-       pr_err("CLCD: couldn't get parameters for panel %s\n", name);
-
-       return NULL;
-}
-
-int versatile_clcd_setup_dma(struct clcd_fb *fb, unsigned long framesize)
-{
-       dma_addr_t dma;
-
-       fb->fb.screen_base = dma_alloc_writecombine(&fb->dev->dev, framesize,
-                                                   &dma, GFP_KERNEL);
-       if (!fb->fb.screen_base) {
-               pr_err("CLCD: unable to map framebuffer\n");
-               return -ENOMEM;
-       }
-
-       fb->fb.fix.smem_start   = dma;
-       fb->fb.fix.smem_len     = framesize;
-
-       return 0;
-}
-
-int versatile_clcd_mmap_dma(struct clcd_fb *fb, struct vm_area_struct *vma)
-{
-       return dma_mmap_writecombine(&fb->dev->dev, vma,
-                                    fb->fb.screen_base,
-                                    fb->fb.fix.smem_start,
-                                    fb->fb.fix.smem_len);
-}
-
-void versatile_clcd_remove_dma(struct clcd_fb *fb)
-{
-       dma_free_writecombine(&fb->dev->dev, fb->fb.fix.smem_len,
-                             fb->fb.screen_base, fb->fb.fix.smem_start);
-}
diff --git a/arch/arm/plat-versatile/include/plat/clcd.h b/arch/arm/plat-versatile/include/plat/clcd.h
deleted file mode 100644 (file)
index 6bb6a1d..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-#ifndef PLAT_CLCD_H
-#define PLAT_CLCD_H
-
-struct clcd_panel *versatile_clcd_get_panel(const char *);
-int versatile_clcd_setup_dma(struct clcd_fb *, unsigned long);
-int versatile_clcd_mmap_dma(struct clcd_fb *, struct vm_area_struct *);
-void versatile_clcd_remove_dma(struct clcd_fb *);
-
-#endif
index 1e632430570b1ffc5d5358b55f0c8b4b43b80098..98544c5f86e99710a7845e7a55648cdf73c14599 100644 (file)
@@ -181,8 +181,7 @@ static void xen_restart(enum reboot_mode reboot_mode, const char *cmd)
        struct sched_shutdown r = { .reason = SHUTDOWN_reboot };
        int rc;
        rc = HYPERVISOR_sched_op(SCHEDOP_shutdown, &r);
-       if (rc)
-               BUG();
+       BUG_ON(rc);
 }
 
 static void xen_power_off(void)
@@ -190,8 +189,7 @@ static void xen_power_off(void)
        struct sched_shutdown r = { .reason = SHUTDOWN_poweroff };
        int rc;
        rc = HYPERVISOR_sched_op(SCHEDOP_shutdown, &r);
-       if (rc)
-               BUG();
+       BUG_ON(rc);
 }
 
 static int xen_cpu_notification(struct notifier_block *self,
index 91cf08ba1e957d251fcb5b0028705a4cd52a7fd8..2c4041c9bac5e18e320d25b0577d034c52514b43 100644 (file)
@@ -45,11 +45,9 @@ void arch_gnttab_unmap(void *shared, unsigned long nr_gframes)
        return;
 }
 
-int arch_gnttab_map_status(uint64_t *frames, unsigned long nr_gframes,
-                          unsigned long max_nr_gframes,
-                          grant_status_t **__shared)
+int arch_gnttab_init(unsigned long nr_shared)
 {
-       return -ENOSYS;
+       return 0;
 }
 
 int arch_gnttab_init(unsigned long nr_shared, unsigned long nr_status)
index 6e9b5b36921cce2d26276d12c5379514b420f2ff..7fb343779498810d99013a3dbe42e5937838d0c0 100644 (file)
 
 #ifdef __KERNEL__
 
+/* Low-level stepping controls. */
+#define DBG_MDSCR_SS           (1 << 0)
+#define DBG_SPSR_SS            (1 << 21)
+
+/* MDSCR_EL1 enabling bits */
+#define DBG_MDSCR_KDE          (1 << 13)
+#define DBG_MDSCR_MDE          (1 << 15)
+#define DBG_MDSCR_MASK         ~(DBG_MDSCR_KDE | DBG_MDSCR_MDE)
+
 #define        DBG_ESR_EVT(x)          (((x) >> 27) & 0x7)
 
 /* AArch64 */
 
 #define CACHE_FLUSH_IS_SAFE            1
 
-enum debug_el {
-       DBG_ACTIVE_EL0 = 0,
-       DBG_ACTIVE_EL1,
-};
-
 /* AArch32 */
 #define DBG_ESR_EVT_BKPT       0x4
 #define DBG_ESR_EVT_VECC       0x5
@@ -115,6 +119,11 @@ void unregister_break_hook(struct break_hook *hook);
 
 u8 debug_monitors_arch(void);
 
+enum debug_el {
+       DBG_ACTIVE_EL0 = 0,
+       DBG_ACTIVE_EL1,
+};
+
 void enable_debug_monitors(enum debug_el el);
 void disable_debug_monitors(enum debug_el el);
 
index 3d6903006a8aacf1b6b561db1d426958844665ef..cc83520459ed4cf985cecb7d0938eef8e37a77bb 100644 (file)
  */
 #define HCR_GUEST_FLAGS (HCR_TSC | HCR_TSW | HCR_TWE | HCR_TWI | HCR_VM | \
                         HCR_TVM | HCR_BSU_IS | HCR_FB | HCR_TAC | \
-                        HCR_AMO | HCR_IMO | HCR_FMO | \
-                        HCR_SWIO | HCR_TIDCP | HCR_RW)
+                        HCR_AMO | HCR_SWIO | HCR_TIDCP | HCR_RW)
 #define HCR_VIRT_EXCP_MASK (HCR_VA | HCR_VI | HCR_VF)
+#define HCR_INT_OVERRIDE   (HCR_FMO | HCR_IMO)
+
 
 /* Hyp System Control Register (SCTLR_EL2) bits */
 #define SCTLR_EL2_EE   (1 << 25)
index 9fcd54b1e16d8800ffec64a249cb55739c88b058..483842180f8f050dbcf4e27af28671b71ec03476 100644 (file)
@@ -18,6 +18,8 @@
 #ifndef __ARM_KVM_ASM_H__
 #define __ARM_KVM_ASM_H__
 
+#include <asm/virt.h>
+
 /*
  * 0 is reserved as an invalid value.
  * Order *must* be kept in sync with the hyp switch code.
 #define        AMAIR_EL1       19      /* Aux Memory Attribute Indirection Register */
 #define        CNTKCTL_EL1     20      /* Timer Control Register (EL1) */
 #define        PAR_EL1         21      /* Physical Address Register */
+#define MDSCR_EL1      22      /* Monitor Debug System Control Register */
+#define DBGBCR0_EL1    23      /* Debug Breakpoint Control Registers (0-15) */
+#define DBGBCR15_EL1   38
+#define DBGBVR0_EL1    39      /* Debug Breakpoint Value Registers (0-15) */
+#define DBGBVR15_EL1   54
+#define DBGWCR0_EL1    55      /* Debug Watchpoint Control Registers (0-15) */
+#define DBGWCR15_EL1   70
+#define DBGWVR0_EL1    71      /* Debug Watchpoint Value Registers (0-15) */
+#define DBGWVR15_EL1   86
+#define MDCCINT_EL1    87      /* Monitor Debug Comms Channel Interrupt Enable Reg */
+
 /* 32bit specific registers. Keep them at the end of the range */
-#define        DACR32_EL2      22      /* Domain Access Control Register */
-#define        IFSR32_EL2      23      /* Instruction Fault Status Register */
-#define        FPEXC32_EL2     24      /* Floating-Point Exception Control Register */
-#define        DBGVCR32_EL2    25      /* Debug Vector Catch Register */
-#define        TEECR32_EL1     26      /* ThumbEE Configuration Register */
-#define        TEEHBR32_EL1    27      /* ThumbEE Handler Base Register */
-#define        NR_SYS_REGS     28
+#define        DACR32_EL2      88      /* Domain Access Control Register */
+#define        IFSR32_EL2      89      /* Instruction Fault Status Register */
+#define        FPEXC32_EL2     90      /* Floating-Point Exception Control Register */
+#define        DBGVCR32_EL2    91      /* Debug Vector Catch Register */
+#define        TEECR32_EL1     92      /* ThumbEE Configuration Register */
+#define        TEEHBR32_EL1    93      /* ThumbEE Handler Base Register */
+#define        NR_SYS_REGS     94
 
 /* 32bit mapping */
 #define c0_MPIDR       (MPIDR_EL1 * 2) /* MultiProcessor ID Register */
 #define c10_AMAIR0     (AMAIR_EL1 * 2) /* Aux Memory Attr Indirection Reg */
 #define c10_AMAIR1     (c10_AMAIR0 + 1)/* Aux Memory Attr Indirection Reg */
 #define c14_CNTKCTL    (CNTKCTL_EL1 * 2) /* Timer Control Register (PL1) */
-#define NR_CP15_REGS   (NR_SYS_REGS * 2)
+
+#define cp14_DBGDSCRext        (MDSCR_EL1 * 2)
+#define cp14_DBGBCR0   (DBGBCR0_EL1 * 2)
+#define cp14_DBGBVR0   (DBGBVR0_EL1 * 2)
+#define cp14_DBGBXVR0  (cp14_DBGBVR0 + 1)
+#define cp14_DBGWCR0   (DBGWCR0_EL1 * 2)
+#define cp14_DBGWVR0   (DBGWVR0_EL1 * 2)
+#define cp14_DBGDCCINT (MDCCINT_EL1 * 2)
+
+#define NR_COPRO_REGS  (NR_SYS_REGS * 2)
 
 #define ARM_EXCEPTION_IRQ        0
 #define ARM_EXCEPTION_TRAP       1
 
+#define KVM_ARM64_DEBUG_DIRTY_SHIFT    0
+#define KVM_ARM64_DEBUG_DIRTY          (1 << KVM_ARM64_DEBUG_DIRTY_SHIFT)
+
 #ifndef __ASSEMBLY__
 struct kvm;
 struct kvm_vcpu;
@@ -96,13 +121,21 @@ extern char __kvm_hyp_init_end[];
 
 extern char __kvm_hyp_vector[];
 
-extern char __kvm_hyp_code_start[];
-extern char __kvm_hyp_code_end[];
+#define        __kvm_hyp_code_start    __hyp_text_start
+#define        __kvm_hyp_code_end      __hyp_text_end
 
 extern void __kvm_flush_vm_context(void);
 extern void __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa);
 
 extern int __kvm_vcpu_run(struct kvm_vcpu *vcpu);
+
+extern u64 __vgic_v3_get_ich_vtr_el2(void);
+
+extern char __save_vgic_v2_state[];
+extern char __restore_vgic_v2_state[];
+extern char __save_vgic_v3_state[];
+extern char __restore_vgic_v3_state[];
+
 #endif
 
 #endif /* __ARM_KVM_ASM_H__ */
index 9a59301cd014133c708d337455e4c263213b564c..0b52377a6c11501940eda2d82b9a6327476f5465 100644 (file)
@@ -39,7 +39,8 @@ void kvm_register_target_sys_reg_table(unsigned int target,
                                       struct kvm_sys_reg_target_table *table);
 
 int kvm_handle_cp14_load_store(struct kvm_vcpu *vcpu, struct kvm_run *run);
-int kvm_handle_cp14_access(struct kvm_vcpu *vcpu, struct kvm_run *run);
+int kvm_handle_cp14_32(struct kvm_vcpu *vcpu, struct kvm_run *run);
+int kvm_handle_cp14_64(struct kvm_vcpu *vcpu, struct kvm_run *run);
 int kvm_handle_cp15_32(struct kvm_vcpu *vcpu, struct kvm_run *run);
 int kvm_handle_cp15_64(struct kvm_vcpu *vcpu, struct kvm_run *run);
 int kvm_handle_sys_reg(struct kvm_vcpu *vcpu, struct kvm_run *run);
index dd8ecfc3f9952fbf86e5d3dd69012ca9ab9a8385..fdc3e21abd8dddee609c7a5e49c5d6efaa3615ee 100644 (file)
@@ -213,6 +213,17 @@ static inline unsigned long vcpu_data_guest_to_host(struct kvm_vcpu *vcpu,
                default:
                        return be64_to_cpu(data);
                }
+       } else {
+               switch (len) {
+               case 1:
+                       return data & 0xff;
+               case 2:
+                       return le16_to_cpu(data & 0xffff);
+               case 4:
+                       return le32_to_cpu(data & 0xffffffff);
+               default:
+                       return le64_to_cpu(data);
+               }
        }
 
        return data;            /* Leave LE untouched */
@@ -233,6 +244,17 @@ static inline unsigned long vcpu_data_host_to_guest(struct kvm_vcpu *vcpu,
                default:
                        return cpu_to_be64(data);
                }
+       } else {
+               switch (len) {
+               case 1:
+                       return data & 0xff;
+               case 2:
+                       return cpu_to_le16(data & 0xffff);
+               case 4:
+                       return cpu_to_le32(data & 0xffffffff);
+               default:
+                       return cpu_to_le64(data);
+               }
        }
 
        return data;            /* Leave LE untouched */
index 92242ce06309c790f60ae1ec3a372ccbc673726e..e10c45a578e36278f147f0eda678587f8e285b01 100644 (file)
@@ -86,7 +86,7 @@ struct kvm_cpu_context {
        struct kvm_regs gp_regs;
        union {
                u64 sys_regs[NR_SYS_REGS];
-               u32 cp15[NR_CP15_REGS];
+               u32 copro[NR_COPRO_REGS];
        };
 };
 
@@ -101,6 +101,9 @@ struct kvm_vcpu_arch {
        /* Exception Information */
        struct kvm_vcpu_fault_info fault;
 
+       /* Debug state */
+       u64 debug_flags;
+
        /* Pointer to host CPU context */
        kvm_cpu_context_t *host_cpu_context;
 
@@ -138,7 +141,20 @@ struct kvm_vcpu_arch {
 
 #define vcpu_gp_regs(v)                (&(v)->arch.ctxt.gp_regs)
 #define vcpu_sys_reg(v,r)      ((v)->arch.ctxt.sys_regs[(r)])
-#define vcpu_cp15(v,r)         ((v)->arch.ctxt.cp15[(r)])
+/*
+ * CP14 and CP15 live in the same array, as they are backed by the
+ * same system registers.
+ */
+#define vcpu_cp14(v,r)         ((v)->arch.ctxt.copro[(r)])
+#define vcpu_cp15(v,r)         ((v)->arch.ctxt.copro[(r)])
+
+#ifdef CONFIG_CPU_BIG_ENDIAN
+#define vcpu_cp15_64_high(v,r) vcpu_cp15((v),(r))
+#define vcpu_cp15_64_low(v,r)  vcpu_cp15((v),(r) + 1)
+#else
+#define vcpu_cp15_64_high(v,r) vcpu_cp15((v),(r) + 1)
+#define vcpu_cp15_64_low(v,r)  vcpu_cp15((v),(r))
+#endif
 
 struct kvm_vm_stat {
        u32 remote_tlb_flush;
@@ -200,4 +216,32 @@ static inline void __cpu_init_hyp_mode(phys_addr_t boot_pgd_ptr,
                     hyp_stack_ptr, vector_ptr);
 }
 
+struct vgic_sr_vectors {
+       void    *save_vgic;
+       void    *restore_vgic;
+};
+
+static inline void vgic_arch_setup(const struct vgic_params *vgic)
+{
+       extern struct vgic_sr_vectors __vgic_sr_vectors;
+
+       switch(vgic->type)
+       {
+       case VGIC_V2:
+               __vgic_sr_vectors.save_vgic     = __save_vgic_v2_state;
+               __vgic_sr_vectors.restore_vgic  = __restore_vgic_v2_state;
+               break;
+
+#ifdef CONFIG_ARM_GIC_V3
+       case VGIC_V3:
+               __vgic_sr_vectors.save_vgic     = __save_vgic_v3_state;
+               __vgic_sr_vectors.restore_vgic  = __restore_vgic_v3_state;
+               break;
+#endif
+
+       default:
+               BUG();
+       }
+}
+
 #endif /* __ARM64_KVM_HOST_H__ */
index 7d29847a893b89b4edf6460599d0d9e9ff720127..8e138c7c53ac48fa8fd3eb44d8d739c2f13509ef 100644 (file)
@@ -125,6 +125,21 @@ static inline void kvm_set_s2pmd_writable(pmd_t *pmd)
 #define kvm_pud_addr_end(addr, end)    pud_addr_end(addr, end)
 #define kvm_pmd_addr_end(addr, end)    pmd_addr_end(addr, end)
 
+static inline bool kvm_page_empty(void *ptr)
+{
+       struct page *ptr_page = virt_to_page(ptr);
+       return page_count(ptr_page) == 1;
+}
+
+#define kvm_pte_table_empty(ptep) kvm_page_empty(ptep)
+#ifndef CONFIG_ARM64_64K_PAGES
+#define kvm_pmd_table_empty(pmdp) kvm_page_empty(pmdp)
+#else
+#define kvm_pmd_table_empty(pmdp) (0)
+#endif
+#define kvm_pud_table_empty(pudp) (0)
+
+
 struct kvm;
 
 #define kvm_flush_dcache_to_poc(a,l)   __flush_dcache_area((a), (l))
index 215ad4649dd7d7492c7d566fda85146359291c20..7a5df5252dd736e4038e04e40510351820056183 100644 (file)
@@ -50,6 +50,10 @@ static inline bool is_hyp_mode_mismatched(void)
        return __boot_cpu_mode[0] != __boot_cpu_mode[1];
 }
 
+/* The section containing the hypervisor text */
+extern char __hyp_text_start[];
+extern char __hyp_text_end[];
+
 #endif /* __ASSEMBLY__ */
 
 #endif /* ! __ASM__VIRT_H */
index 646f888387cd1062438e3776abec90a26ecc01ee..9a9fce090d58fd1fd8741bfabbc84672066ea448 100644 (file)
@@ -120,6 +120,7 @@ int main(void)
   DEFINE(VCPU_ESR_EL2,         offsetof(struct kvm_vcpu, arch.fault.esr_el2));
   DEFINE(VCPU_FAR_EL2,         offsetof(struct kvm_vcpu, arch.fault.far_el2));
   DEFINE(VCPU_HPFAR_EL2,       offsetof(struct kvm_vcpu, arch.fault.hpfar_el2));
+  DEFINE(VCPU_DEBUG_FLAGS,     offsetof(struct kvm_vcpu, arch.debug_flags));
   DEFINE(VCPU_HCR_EL2,         offsetof(struct kvm_vcpu, arch.hcr_el2));
   DEFINE(VCPU_IRQ_LINES,       offsetof(struct kvm_vcpu, arch.irq_lines));
   DEFINE(VCPU_HOST_CONTEXT,    offsetof(struct kvm_vcpu, arch.host_cpu_context));
@@ -129,13 +130,24 @@ int main(void)
   DEFINE(KVM_TIMER_ENABLED,    offsetof(struct kvm, arch.timer.enabled));
   DEFINE(VCPU_KVM,             offsetof(struct kvm_vcpu, kvm));
   DEFINE(VCPU_VGIC_CPU,                offsetof(struct kvm_vcpu, arch.vgic_cpu));
-  DEFINE(VGIC_CPU_HCR,         offsetof(struct vgic_cpu, vgic_hcr));
-  DEFINE(VGIC_CPU_VMCR,                offsetof(struct vgic_cpu, vgic_vmcr));
-  DEFINE(VGIC_CPU_MISR,                offsetof(struct vgic_cpu, vgic_misr));
-  DEFINE(VGIC_CPU_EISR,                offsetof(struct vgic_cpu, vgic_eisr));
-  DEFINE(VGIC_CPU_ELRSR,       offsetof(struct vgic_cpu, vgic_elrsr));
-  DEFINE(VGIC_CPU_APR,         offsetof(struct vgic_cpu, vgic_apr));
-  DEFINE(VGIC_CPU_LR,          offsetof(struct vgic_cpu, vgic_lr));
+  DEFINE(VGIC_SAVE_FN,         offsetof(struct vgic_sr_vectors, save_vgic));
+  DEFINE(VGIC_RESTORE_FN,      offsetof(struct vgic_sr_vectors, restore_vgic));
+  DEFINE(VGIC_SR_VECTOR_SZ,    sizeof(struct vgic_sr_vectors));
+  DEFINE(VGIC_V2_CPU_HCR,      offsetof(struct vgic_cpu, vgic_v2.vgic_hcr));
+  DEFINE(VGIC_V2_CPU_VMCR,     offsetof(struct vgic_cpu, vgic_v2.vgic_vmcr));
+  DEFINE(VGIC_V2_CPU_MISR,     offsetof(struct vgic_cpu, vgic_v2.vgic_misr));
+  DEFINE(VGIC_V2_CPU_EISR,     offsetof(struct vgic_cpu, vgic_v2.vgic_eisr));
+  DEFINE(VGIC_V2_CPU_ELRSR,    offsetof(struct vgic_cpu, vgic_v2.vgic_elrsr));
+  DEFINE(VGIC_V2_CPU_APR,      offsetof(struct vgic_cpu, vgic_v2.vgic_apr));
+  DEFINE(VGIC_V2_CPU_LR,       offsetof(struct vgic_cpu, vgic_v2.vgic_lr));
+  DEFINE(VGIC_V3_CPU_HCR,      offsetof(struct vgic_cpu, vgic_v3.vgic_hcr));
+  DEFINE(VGIC_V3_CPU_VMCR,     offsetof(struct vgic_cpu, vgic_v3.vgic_vmcr));
+  DEFINE(VGIC_V3_CPU_MISR,     offsetof(struct vgic_cpu, vgic_v3.vgic_misr));
+  DEFINE(VGIC_V3_CPU_EISR,     offsetof(struct vgic_cpu, vgic_v3.vgic_eisr));
+  DEFINE(VGIC_V3_CPU_ELRSR,    offsetof(struct vgic_cpu, vgic_v3.vgic_elrsr));
+  DEFINE(VGIC_V3_CPU_AP0R,     offsetof(struct vgic_cpu, vgic_v3.vgic_ap0r));
+  DEFINE(VGIC_V3_CPU_AP1R,     offsetof(struct vgic_cpu, vgic_v3.vgic_ap1r));
+  DEFINE(VGIC_V3_CPU_LR,       offsetof(struct vgic_cpu, vgic_v3.vgic_lr));
   DEFINE(VGIC_CPU_NR_LR,       offsetof(struct vgic_cpu, nr_lr));
   DEFINE(KVM_VTTBR,            offsetof(struct kvm, arch.vttbr));
   DEFINE(KVM_VGIC_VCTRL,       offsetof(struct kvm, arch.vgic.vctrl_base));
index fe5b94078d82f7dc439e72aae8a369c20ef7e4e6..b056369fd47da0b4cfa6900e61474cf07fc06ea7 100644 (file)
 #include <asm/cputype.h>
 #include <asm/system_misc.h>
 
-/* Low-level stepping controls. */
-#define DBG_MDSCR_SS           (1 << 0)
-#define DBG_SPSR_SS            (1 << 21)
-
-/* MDSCR_EL1 enabling bits */
-#define DBG_MDSCR_KDE          (1 << 13)
-#define DBG_MDSCR_MDE          (1 << 15)
-#define DBG_MDSCR_MASK         ~(DBG_MDSCR_KDE | DBG_MDSCR_MDE)
-
 /* Determine debug architecture. */
 u8 debug_monitors_arch(void)
 {
index 72a9fd583ad320e380bab0f088d0d42e4ca08720..32a096174b944bb3257399768cb605dd10797d34 100644 (file)
@@ -20,4 +20,8 @@ kvm-$(CONFIG_KVM_ARM_HOST) += hyp.o hyp-init.o handle_exit.o
 kvm-$(CONFIG_KVM_ARM_HOST) += guest.o reset.o sys_regs.o sys_regs_generic_v8.o
 
 kvm-$(CONFIG_KVM_ARM_VGIC) += $(KVM)/arm/vgic.o
+kvm-$(CONFIG_KVM_ARM_VGIC) += $(KVM)/arm/vgic-v2.o
+kvm-$(CONFIG_KVM_ARM_VGIC) += vgic-v2-switch.o
+kvm-$(CONFIG_KVM_ARM_VGIC) += $(KVM)/arm/vgic-v3.o
+kvm-$(CONFIG_KVM_ARM_VGIC) += vgic-v3-switch.o
 kvm-$(CONFIG_KVM_ARM_TIMER) += $(KVM)/arm/arch_timer.o
index 60b5c31f3c10e58e72029d8854f13f527d84a097..8d1ec2887a266b3addf62ae63adea8729a057ae7 100644 (file)
@@ -135,6 +135,59 @@ static unsigned long num_core_regs(void)
        return sizeof(struct kvm_regs) / sizeof(__u32);
 }
 
+/**
+ * ARM64 versions of the TIMER registers, always available on arm64
+ */
+
+#define NUM_TIMER_REGS 3
+
+static bool is_timer_reg(u64 index)
+{
+       switch (index) {
+       case KVM_REG_ARM_TIMER_CTL:
+       case KVM_REG_ARM_TIMER_CNT:
+       case KVM_REG_ARM_TIMER_CVAL:
+               return true;
+       }
+       return false;
+}
+
+static int copy_timer_indices(struct kvm_vcpu *vcpu, u64 __user *uindices)
+{
+       if (put_user(KVM_REG_ARM_TIMER_CTL, uindices))
+               return -EFAULT;
+       uindices++;
+       if (put_user(KVM_REG_ARM_TIMER_CNT, uindices))
+               return -EFAULT;
+       uindices++;
+       if (put_user(KVM_REG_ARM_TIMER_CVAL, uindices))
+               return -EFAULT;
+
+       return 0;
+}
+
+static int set_timer_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg)
+{
+       void __user *uaddr = (void __user *)(long)reg->addr;
+       u64 val;
+       int ret;
+
+       ret = copy_from_user(&val, uaddr, KVM_REG_SIZE(reg->id));
+       if (ret != 0)
+               return ret;
+
+       return kvm_arm_timer_set_reg(vcpu, reg->id, val);
+}
+
+static int get_timer_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg)
+{
+       void __user *uaddr = (void __user *)(long)reg->addr;
+       u64 val;
+
+       val = kvm_arm_timer_get_reg(vcpu, reg->id);
+       return copy_to_user(uaddr, &val, KVM_REG_SIZE(reg->id));
+}
+
 /**
  * kvm_arm_num_regs - how many registers do we present via KVM_GET_ONE_REG
  *
@@ -142,7 +195,8 @@ static unsigned long num_core_regs(void)
  */
 unsigned long kvm_arm_num_regs(struct kvm_vcpu *vcpu)
 {
-       return num_core_regs() + kvm_arm_num_sys_reg_descs(vcpu);
+       return num_core_regs() + kvm_arm_num_sys_reg_descs(vcpu)
+                + NUM_TIMER_REGS;
 }
 
 /**
@@ -154,6 +208,7 @@ int kvm_arm_copy_reg_indices(struct kvm_vcpu *vcpu, u64 __user *uindices)
 {
        unsigned int i;
        const u64 core_reg = KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE;
+       int ret;
 
        for (i = 0; i < sizeof(struct kvm_regs) / sizeof(__u32); i++) {
                if (put_user(core_reg | i, uindices))
@@ -161,6 +216,11 @@ int kvm_arm_copy_reg_indices(struct kvm_vcpu *vcpu, u64 __user *uindices)
                uindices++;
        }
 
+       ret = copy_timer_indices(vcpu, uindices);
+       if (ret)
+               return ret;
+       uindices += NUM_TIMER_REGS;
+
        return kvm_arm_copy_sys_reg_indices(vcpu, uindices);
 }
 
@@ -174,6 +234,9 @@ int kvm_arm_get_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg)
        if ((reg->id & KVM_REG_ARM_COPROC_MASK) == KVM_REG_ARM_CORE)
                return get_core_reg(vcpu, reg);
 
+       if (is_timer_reg(reg->id))
+               return get_timer_reg(vcpu, reg);
+
        return kvm_arm_sys_reg_get_reg(vcpu, reg);
 }
 
@@ -187,6 +250,9 @@ int kvm_arm_set_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg)
        if ((reg->id & KVM_REG_ARM_COPROC_MASK) == KVM_REG_ARM_CORE)
                return set_core_reg(vcpu, reg);
 
+       if (is_timer_reg(reg->id))
+               return set_timer_reg(vcpu, reg);
+
        return kvm_arm_sys_reg_set_reg(vcpu, reg);
 }
 
index 182415e1a952bf5e54918b14f1534faaee731bba..e28be510380ca758f8cdb76a5da57892cb02e3bf 100644 (file)
@@ -73,9 +73,9 @@ static exit_handle_fn arm_exit_handlers[] = {
        [ESR_EL2_EC_WFI]        = kvm_handle_wfx,
        [ESR_EL2_EC_CP15_32]    = kvm_handle_cp15_32,
        [ESR_EL2_EC_CP15_64]    = kvm_handle_cp15_64,
-       [ESR_EL2_EC_CP14_MR]    = kvm_handle_cp14_access,
+       [ESR_EL2_EC_CP14_MR]    = kvm_handle_cp14_32,
        [ESR_EL2_EC_CP14_LS]    = kvm_handle_cp14_load_store,
-       [ESR_EL2_EC_CP14_64]    = kvm_handle_cp14_access,
+       [ESR_EL2_EC_CP14_64]    = kvm_handle_cp14_64,
        [ESR_EL2_EC_HVC32]      = handle_hvc,
        [ESR_EL2_EC_SMC32]      = handle_smc,
        [ESR_EL2_EC_HVC64]      = handle_hvc,
index b0d1512acf08fcf57fc2e39d5305b9ffa9e46a14..b72aa9f9215ca7d658390e3a368d5be39415b834 100644 (file)
  */
 
 #include <linux/linkage.h>
-#include <linux/irqchip/arm-gic.h>
 
 #include <asm/assembler.h>
 #include <asm/memory.h>
 #include <asm/asm-offsets.h>
+#include <asm/debug-monitors.h>
 #include <asm/fpsimdmacros.h>
 #include <asm/kvm.h>
 #include <asm/kvm_asm.h>
@@ -36,9 +36,6 @@
        .pushsection    .hyp.text, "ax"
        .align  PAGE_SHIFT
 
-__kvm_hyp_code_start:
-       .globl __kvm_hyp_code_start
-
 .macro save_common_regs
        // x2: base address for cpu context
        // x3: tmp register
@@ -215,6 +212,7 @@ __kvm_hyp_code_start:
        mrs     x22,    amair_el1
        mrs     x23,    cntkctl_el1
        mrs     x24,    par_el1
+       mrs     x25,    mdscr_el1
 
        stp     x4, x5, [x3]
        stp     x6, x7, [x3, #16]
@@ -226,7 +224,202 @@ __kvm_hyp_code_start:
        stp     x18, x19, [x3, #112]
        stp     x20, x21, [x3, #128]
        stp     x22, x23, [x3, #144]
-       str     x24, [x3, #160]
+       stp     x24, x25, [x3, #160]
+.endm
+
+.macro save_debug
+       // x2: base address for cpu context
+       // x3: tmp register
+
+       mrs     x26, id_aa64dfr0_el1
+       ubfx    x24, x26, #12, #4       // Extract BRPs
+       ubfx    x25, x26, #20, #4       // Extract WRPs
+       mov     w26, #15
+       sub     w24, w26, w24           // How many BPs to skip
+       sub     w25, w26, w25           // How many WPs to skip
+
+       add     x3, x2, #CPU_SYSREG_OFFSET(DBGBCR0_EL1)
+
+       adr     x26, 1f
+       add     x26, x26, x24, lsl #2
+       br      x26
+1:
+       mrs     x20, dbgbcr15_el1
+       mrs     x19, dbgbcr14_el1
+       mrs     x18, dbgbcr13_el1
+       mrs     x17, dbgbcr12_el1
+       mrs     x16, dbgbcr11_el1
+       mrs     x15, dbgbcr10_el1
+       mrs     x14, dbgbcr9_el1
+       mrs     x13, dbgbcr8_el1
+       mrs     x12, dbgbcr7_el1
+       mrs     x11, dbgbcr6_el1
+       mrs     x10, dbgbcr5_el1
+       mrs     x9, dbgbcr4_el1
+       mrs     x8, dbgbcr3_el1
+       mrs     x7, dbgbcr2_el1
+       mrs     x6, dbgbcr1_el1
+       mrs     x5, dbgbcr0_el1
+
+       adr     x26, 1f
+       add     x26, x26, x24, lsl #2
+       br      x26
+
+1:
+       str     x20, [x3, #(15 * 8)]
+       str     x19, [x3, #(14 * 8)]
+       str     x18, [x3, #(13 * 8)]
+       str     x17, [x3, #(12 * 8)]
+       str     x16, [x3, #(11 * 8)]
+       str     x15, [x3, #(10 * 8)]
+       str     x14, [x3, #(9 * 8)]
+       str     x13, [x3, #(8 * 8)]
+       str     x12, [x3, #(7 * 8)]
+       str     x11, [x3, #(6 * 8)]
+       str     x10, [x3, #(5 * 8)]
+       str     x9, [x3, #(4 * 8)]
+       str     x8, [x3, #(3 * 8)]
+       str     x7, [x3, #(2 * 8)]
+       str     x6, [x3, #(1 * 8)]
+       str     x5, [x3, #(0 * 8)]
+
+       add     x3, x2, #CPU_SYSREG_OFFSET(DBGBVR0_EL1)
+
+       adr     x26, 1f
+       add     x26, x26, x24, lsl #2
+       br      x26
+1:
+       mrs     x20, dbgbvr15_el1
+       mrs     x19, dbgbvr14_el1
+       mrs     x18, dbgbvr13_el1
+       mrs     x17, dbgbvr12_el1
+       mrs     x16, dbgbvr11_el1
+       mrs     x15, dbgbvr10_el1
+       mrs     x14, dbgbvr9_el1
+       mrs     x13, dbgbvr8_el1
+       mrs     x12, dbgbvr7_el1
+       mrs     x11, dbgbvr6_el1
+       mrs     x10, dbgbvr5_el1
+       mrs     x9, dbgbvr4_el1
+       mrs     x8, dbgbvr3_el1
+       mrs     x7, dbgbvr2_el1
+       mrs     x6, dbgbvr1_el1
+       mrs     x5, dbgbvr0_el1
+
+       adr     x26, 1f
+       add     x26, x26, x24, lsl #2
+       br      x26
+
+1:
+       str     x20, [x3, #(15 * 8)]
+       str     x19, [x3, #(14 * 8)]
+       str     x18, [x3, #(13 * 8)]
+       str     x17, [x3, #(12 * 8)]
+       str     x16, [x3, #(11 * 8)]
+       str     x15, [x3, #(10 * 8)]
+       str     x14, [x3, #(9 * 8)]
+       str     x13, [x3, #(8 * 8)]
+       str     x12, [x3, #(7 * 8)]
+       str     x11, [x3, #(6 * 8)]
+       str     x10, [x3, #(5 * 8)]
+       str     x9, [x3, #(4 * 8)]
+       str     x8, [x3, #(3 * 8)]
+       str     x7, [x3, #(2 * 8)]
+       str     x6, [x3, #(1 * 8)]
+       str     x5, [x3, #(0 * 8)]
+
+       add     x3, x2, #CPU_SYSREG_OFFSET(DBGWCR0_EL1)
+
+       adr     x26, 1f
+       add     x26, x26, x25, lsl #2
+       br      x26
+1:
+       mrs     x20, dbgwcr15_el1
+       mrs     x19, dbgwcr14_el1
+       mrs     x18, dbgwcr13_el1
+       mrs     x17, dbgwcr12_el1
+       mrs     x16, dbgwcr11_el1
+       mrs     x15, dbgwcr10_el1
+       mrs     x14, dbgwcr9_el1
+       mrs     x13, dbgwcr8_el1
+       mrs     x12, dbgwcr7_el1
+       mrs     x11, dbgwcr6_el1
+       mrs     x10, dbgwcr5_el1
+       mrs     x9, dbgwcr4_el1
+       mrs     x8, dbgwcr3_el1
+       mrs     x7, dbgwcr2_el1
+       mrs     x6, dbgwcr1_el1
+       mrs     x5, dbgwcr0_el1
+
+       adr     x26, 1f
+       add     x26, x26, x25, lsl #2
+       br      x26
+
+1:
+       str     x20, [x3, #(15 * 8)]
+       str     x19, [x3, #(14 * 8)]
+       str     x18, [x3, #(13 * 8)]
+       str     x17, [x3, #(12 * 8)]
+       str     x16, [x3, #(11 * 8)]
+       str     x15, [x3, #(10 * 8)]
+       str     x14, [x3, #(9 * 8)]
+       str     x13, [x3, #(8 * 8)]
+       str     x12, [x3, #(7 * 8)]
+       str     x11, [x3, #(6 * 8)]
+       str     x10, [x3, #(5 * 8)]
+       str     x9, [x3, #(4 * 8)]
+       str     x8, [x3, #(3 * 8)]
+       str     x7, [x3, #(2 * 8)]
+       str     x6, [x3, #(1 * 8)]
+       str     x5, [x3, #(0 * 8)]
+
+       add     x3, x2, #CPU_SYSREG_OFFSET(DBGWVR0_EL1)
+
+       adr     x26, 1f
+       add     x26, x26, x25, lsl #2
+       br      x26
+1:
+       mrs     x20, dbgwvr15_el1
+       mrs     x19, dbgwvr14_el1
+       mrs     x18, dbgwvr13_el1
+       mrs     x17, dbgwvr12_el1
+       mrs     x16, dbgwvr11_el1
+       mrs     x15, dbgwvr10_el1
+       mrs     x14, dbgwvr9_el1
+       mrs     x13, dbgwvr8_el1
+       mrs     x12, dbgwvr7_el1
+       mrs     x11, dbgwvr6_el1
+       mrs     x10, dbgwvr5_el1
+       mrs     x9, dbgwvr4_el1
+       mrs     x8, dbgwvr3_el1
+       mrs     x7, dbgwvr2_el1
+       mrs     x6, dbgwvr1_el1
+       mrs     x5, dbgwvr0_el1
+
+       adr     x26, 1f
+       add     x26, x26, x25, lsl #2
+       br      x26
+
+1:
+       str     x20, [x3, #(15 * 8)]
+       str     x19, [x3, #(14 * 8)]
+       str     x18, [x3, #(13 * 8)]
+       str     x17, [x3, #(12 * 8)]
+       str     x16, [x3, #(11 * 8)]
+       str     x15, [x3, #(10 * 8)]
+       str     x14, [x3, #(9 * 8)]
+       str     x13, [x3, #(8 * 8)]
+       str     x12, [x3, #(7 * 8)]
+       str     x11, [x3, #(6 * 8)]
+       str     x10, [x3, #(5 * 8)]
+       str     x9, [x3, #(4 * 8)]
+       str     x8, [x3, #(3 * 8)]
+       str     x7, [x3, #(2 * 8)]
+       str     x6, [x3, #(1 * 8)]
+       str     x5, [x3, #(0 * 8)]
+
+       mrs     x21, mdccint_el1
+       str     x21, [x2, #CPU_SYSREG_OFFSET(MDCCINT_EL1)]
 .endm
 
 .macro restore_sysregs
@@ -245,7 +438,7 @@ __kvm_hyp_code_start:
        ldp     x18, x19, [x3, #112]
        ldp     x20, x21, [x3, #128]
        ldp     x22, x23, [x3, #144]
-       ldr     x24, [x3, #160]
+       ldp     x24, x25, [x3, #160]
 
        msr     vmpidr_el2,     x4
        msr     csselr_el1,     x5
@@ -268,6 +461,198 @@ __kvm_hyp_code_start:
        msr     amair_el1,      x22
        msr     cntkctl_el1,    x23
        msr     par_el1,        x24
+       msr     mdscr_el1,      x25
+.endm
+
+.macro restore_debug
+       // x2: base address for cpu context
+       // x3: tmp register
+
+       mrs     x26, id_aa64dfr0_el1
+       ubfx    x24, x26, #12, #4       // Extract BRPs
+       ubfx    x25, x26, #20, #4       // Extract WRPs
+       mov     w26, #15
+       sub     w24, w26, w24           // How many BPs to skip
+       sub     w25, w26, w25           // How many WPs to skip
+
+       add     x3, x2, #CPU_SYSREG_OFFSET(DBGBCR0_EL1)
+
+       adr     x26, 1f
+       add     x26, x26, x24, lsl #2
+       br      x26
+1:
+       ldr     x20, [x3, #(15 * 8)]
+       ldr     x19, [x3, #(14 * 8)]
+       ldr     x18, [x3, #(13 * 8)]
+       ldr     x17, [x3, #(12 * 8)]
+       ldr     x16, [x3, #(11 * 8)]
+       ldr     x15, [x3, #(10 * 8)]
+       ldr     x14, [x3, #(9 * 8)]
+       ldr     x13, [x3, #(8 * 8)]
+       ldr     x12, [x3, #(7 * 8)]
+       ldr     x11, [x3, #(6 * 8)]
+       ldr     x10, [x3, #(5 * 8)]
+       ldr     x9, [x3, #(4 * 8)]
+       ldr     x8, [x3, #(3 * 8)]
+       ldr     x7, [x3, #(2 * 8)]
+       ldr     x6, [x3, #(1 * 8)]
+       ldr     x5, [x3, #(0 * 8)]
+
+       adr     x26, 1f
+       add     x26, x26, x24, lsl #2
+       br      x26
+1:
+       msr     dbgbcr15_el1, x20
+       msr     dbgbcr14_el1, x19
+       msr     dbgbcr13_el1, x18
+       msr     dbgbcr12_el1, x17
+       msr     dbgbcr11_el1, x16
+       msr     dbgbcr10_el1, x15
+       msr     dbgbcr9_el1, x14
+       msr     dbgbcr8_el1, x13
+       msr     dbgbcr7_el1, x12
+       msr     dbgbcr6_el1, x11
+       msr     dbgbcr5_el1, x10
+       msr     dbgbcr4_el1, x9
+       msr     dbgbcr3_el1, x8
+       msr     dbgbcr2_el1, x7
+       msr     dbgbcr1_el1, x6
+       msr     dbgbcr0_el1, x5
+
+       add     x3, x2, #CPU_SYSREG_OFFSET(DBGBVR0_EL1)
+
+       adr     x26, 1f
+       add     x26, x26, x24, lsl #2
+       br      x26
+1:
+       ldr     x20, [x3, #(15 * 8)]
+       ldr     x19, [x3, #(14 * 8)]
+       ldr     x18, [x3, #(13 * 8)]
+       ldr     x17, [x3, #(12 * 8)]
+       ldr     x16, [x3, #(11 * 8)]
+       ldr     x15, [x3, #(10 * 8)]
+       ldr     x14, [x3, #(9 * 8)]
+       ldr     x13, [x3, #(8 * 8)]
+       ldr     x12, [x3, #(7 * 8)]
+       ldr     x11, [x3, #(6 * 8)]
+       ldr     x10, [x3, #(5 * 8)]
+       ldr     x9, [x3, #(4 * 8)]
+       ldr     x8, [x3, #(3 * 8)]
+       ldr     x7, [x3, #(2 * 8)]
+       ldr     x6, [x3, #(1 * 8)]
+       ldr     x5, [x3, #(0 * 8)]
+
+       adr     x26, 1f
+       add     x26, x26, x24, lsl #2
+       br      x26
+1:
+       msr     dbgbvr15_el1, x20
+       msr     dbgbvr14_el1, x19
+       msr     dbgbvr13_el1, x18
+       msr     dbgbvr12_el1, x17
+       msr     dbgbvr11_el1, x16
+       msr     dbgbvr10_el1, x15
+       msr     dbgbvr9_el1, x14
+       msr     dbgbvr8_el1, x13
+       msr     dbgbvr7_el1, x12
+       msr     dbgbvr6_el1, x11
+       msr     dbgbvr5_el1, x10
+       msr     dbgbvr4_el1, x9
+       msr     dbgbvr3_el1, x8
+       msr     dbgbvr2_el1, x7
+       msr     dbgbvr1_el1, x6
+       msr     dbgbvr0_el1, x5
+
+       add     x3, x2, #CPU_SYSREG_OFFSET(DBGWCR0_EL1)
+
+       adr     x26, 1f
+       add     x26, x26, x25, lsl #2
+       br      x26
+1:
+       ldr     x20, [x3, #(15 * 8)]
+       ldr     x19, [x3, #(14 * 8)]
+       ldr     x18, [x3, #(13 * 8)]
+       ldr     x17, [x3, #(12 * 8)]
+       ldr     x16, [x3, #(11 * 8)]
+       ldr     x15, [x3, #(10 * 8)]
+       ldr     x14, [x3, #(9 * 8)]
+       ldr     x13, [x3, #(8 * 8)]
+       ldr     x12, [x3, #(7 * 8)]
+       ldr     x11, [x3, #(6 * 8)]
+       ldr     x10, [x3, #(5 * 8)]
+       ldr     x9, [x3, #(4 * 8)]
+       ldr     x8, [x3, #(3 * 8)]
+       ldr     x7, [x3, #(2 * 8)]
+       ldr     x6, [x3, #(1 * 8)]
+       ldr     x5, [x3, #(0 * 8)]
+
+       adr     x26, 1f
+       add     x26, x26, x25, lsl #2
+       br      x26
+1:
+       msr     dbgwcr15_el1, x20
+       msr     dbgwcr14_el1, x19
+       msr     dbgwcr13_el1, x18
+       msr     dbgwcr12_el1, x17
+       msr     dbgwcr11_el1, x16
+       msr     dbgwcr10_el1, x15
+       msr     dbgwcr9_el1, x14
+       msr     dbgwcr8_el1, x13
+       msr     dbgwcr7_el1, x12
+       msr     dbgwcr6_el1, x11
+       msr     dbgwcr5_el1, x10
+       msr     dbgwcr4_el1, x9
+       msr     dbgwcr3_el1, x8
+       msr     dbgwcr2_el1, x7
+       msr     dbgwcr1_el1, x6
+       msr     dbgwcr0_el1, x5
+
+       add     x3, x2, #CPU_SYSREG_OFFSET(DBGWVR0_EL1)
+
+       adr     x26, 1f
+       add     x26, x26, x25, lsl #2
+       br      x26
+1:
+       ldr     x20, [x3, #(15 * 8)]
+       ldr     x19, [x3, #(14 * 8)]
+       ldr     x18, [x3, #(13 * 8)]
+       ldr     x17, [x3, #(12 * 8)]
+       ldr     x16, [x3, #(11 * 8)]
+       ldr     x15, [x3, #(10 * 8)]
+       ldr     x14, [x3, #(9 * 8)]
+       ldr     x13, [x3, #(8 * 8)]
+       ldr     x12, [x3, #(7 * 8)]
+       ldr     x11, [x3, #(6 * 8)]
+       ldr     x10, [x3, #(5 * 8)]
+       ldr     x9, [x3, #(4 * 8)]
+       ldr     x8, [x3, #(3 * 8)]
+       ldr     x7, [x3, #(2 * 8)]
+       ldr     x6, [x3, #(1 * 8)]
+       ldr     x5, [x3, #(0 * 8)]
+
+       adr     x26, 1f
+       add     x26, x26, x25, lsl #2
+       br      x26
+1:
+       msr     dbgwvr15_el1, x20
+       msr     dbgwvr14_el1, x19
+       msr     dbgwvr13_el1, x18
+       msr     dbgwvr12_el1, x17
+       msr     dbgwvr11_el1, x16
+       msr     dbgwvr10_el1, x15
+       msr     dbgwvr9_el1, x14
+       msr     dbgwvr8_el1, x13
+       msr     dbgwvr7_el1, x12
+       msr     dbgwvr6_el1, x11
+       msr     dbgwvr5_el1, x10
+       msr     dbgwvr4_el1, x9
+       msr     dbgwvr3_el1, x8
+       msr     dbgwvr2_el1, x7
+       msr     dbgwvr1_el1, x6
+       msr     dbgwvr0_el1, x5
+
+       ldr     x21, [x2, #CPU_SYSREG_OFFSET(MDCCINT_EL1)]
+       msr     mdccint_el1, x21
 .endm
 
 .macro skip_32bit_state tmp, target
@@ -282,6 +667,35 @@ __kvm_hyp_code_start:
        tbz     \tmp, #12, \target
 .endm
 
+.macro skip_debug_state tmp, target
+       ldr     \tmp, [x0, #VCPU_DEBUG_FLAGS]
+       tbz     \tmp, #KVM_ARM64_DEBUG_DIRTY_SHIFT, \target
+.endm
+
+.macro compute_debug_state target
+       // Compute debug state: If any of KDE, MDE or KVM_ARM64_DEBUG_DIRTY
+       // is set, we do a full save/restore cycle and disable trapping.
+       add     x25, x0, #VCPU_CONTEXT
+
+       // Check the state of MDSCR_EL1
+       ldr     x25, [x25, #CPU_SYSREG_OFFSET(MDSCR_EL1)]
+       and     x26, x25, #DBG_MDSCR_KDE
+       and     x25, x25, #DBG_MDSCR_MDE
+       adds    xzr, x25, x26
+       b.eq    9998f           // Nothing to see there
+
+       // If any interesting bits was set, we must set the flag
+       mov     x26, #KVM_ARM64_DEBUG_DIRTY
+       str     x26, [x0, #VCPU_DEBUG_FLAGS]
+       b       9999f           // Don't skip restore
+
+9998:
+       // Otherwise load the flags from memory in case we recently
+       // trapped
+       skip_debug_state x25, \target
+9999:
+.endm
+
 .macro save_guest_32bit_state
        skip_32bit_state x3, 1f
 
@@ -297,10 +711,13 @@ __kvm_hyp_code_start:
        mrs     x4, dacr32_el2
        mrs     x5, ifsr32_el2
        mrs     x6, fpexc32_el2
-       mrs     x7, dbgvcr32_el2
        stp     x4, x5, [x3]
-       stp     x6, x7, [x3, #16]
+       str     x6, [x3, #16]
 
+       skip_debug_state x8, 2f
+       mrs     x7, dbgvcr32_el2
+       str     x7, [x3, #24]
+2:
        skip_tee_state x8, 1f
 
        add     x3, x2, #CPU_SYSREG_OFFSET(TEECR32_EL1)
@@ -323,12 +740,15 @@ __kvm_hyp_code_start:
 
        add     x3, x2, #CPU_SYSREG_OFFSET(DACR32_EL2)
        ldp     x4, x5, [x3]
-       ldp     x6, x7, [x3, #16]
+       ldr     x6, [x3, #16]
        msr     dacr32_el2, x4
        msr     ifsr32_el2, x5
        msr     fpexc32_el2, x6
-       msr     dbgvcr32_el2, x7
 
+       skip_debug_state x8, 2f
+       ldr     x7, [x3, #24]
+       msr     dbgvcr32_el2, x7
+2:
        skip_tee_state x8, 1f
 
        add     x3, x2, #CPU_SYSREG_OFFSET(TEECR32_EL1)
@@ -339,11 +759,8 @@ __kvm_hyp_code_start:
 .endm
 
 .macro activate_traps
-       ldr     x2, [x0, #VCPU_IRQ_LINES]
-       ldr     x1, [x0, #VCPU_HCR_EL2]
-       orr     x2, x2, x1
-       msr     hcr_el2, x2
-
+       ldr     x2, [x0, #VCPU_HCR_EL2]
+       msr     hcr_el2, x2
        ldr     x2, =(CPTR_EL2_TTA)
        msr     cptr_el2, x2
 
@@ -353,6 +770,14 @@ __kvm_hyp_code_start:
        mrs     x2, mdcr_el2
        and     x2, x2, #MDCR_EL2_HPMN_MASK
        orr     x2, x2, #(MDCR_EL2_TPM | MDCR_EL2_TPMCR)
+       orr     x2, x2, #(MDCR_EL2_TDRA | MDCR_EL2_TDOSA)
+
+       // Check for KVM_ARM64_DEBUG_DIRTY, and set debug to trap
+       // if not dirty.
+       ldr     x3, [x0, #VCPU_DEBUG_FLAGS]
+       tbnz    x3, #KVM_ARM64_DEBUG_DIRTY_SHIFT, 1f
+       orr     x2, x2,  #MDCR_EL2_TDA
+1:
        msr     mdcr_el2, x2
 .endm
 
@@ -379,100 +804,33 @@ __kvm_hyp_code_start:
 .endm
 
 /*
- * Save the VGIC CPU state into memory
- * x0: Register pointing to VCPU struct
- * Do not corrupt x1!!!
+ * Call into the vgic backend for state saving
  */
 .macro save_vgic_state
-       /* Get VGIC VCTRL base into x2 */
-       ldr     x2, [x0, #VCPU_KVM]
-       kern_hyp_va     x2
-       ldr     x2, [x2, #KVM_VGIC_VCTRL]
-       kern_hyp_va     x2
-       cbz     x2, 2f          // disabled
-
-       /* Compute the address of struct vgic_cpu */
-       add     x3, x0, #VCPU_VGIC_CPU
-
-       /* Save all interesting registers */
-       ldr     w4, [x2, #GICH_HCR]
-       ldr     w5, [x2, #GICH_VMCR]
-       ldr     w6, [x2, #GICH_MISR]
-       ldr     w7, [x2, #GICH_EISR0]
-       ldr     w8, [x2, #GICH_EISR1]
-       ldr     w9, [x2, #GICH_ELRSR0]
-       ldr     w10, [x2, #GICH_ELRSR1]
-       ldr     w11, [x2, #GICH_APR]
-CPU_BE(        rev     w4,  w4  )
-CPU_BE(        rev     w5,  w5  )
-CPU_BE(        rev     w6,  w6  )
-CPU_BE(        rev     w7,  w7  )
-CPU_BE(        rev     w8,  w8  )
-CPU_BE(        rev     w9,  w9  )
-CPU_BE(        rev     w10, w10 )
-CPU_BE(        rev     w11, w11 )
-
-       str     w4, [x3, #VGIC_CPU_HCR]
-       str     w5, [x3, #VGIC_CPU_VMCR]
-       str     w6, [x3, #VGIC_CPU_MISR]
-       str     w7, [x3, #VGIC_CPU_EISR]
-       str     w8, [x3, #(VGIC_CPU_EISR + 4)]
-       str     w9, [x3, #VGIC_CPU_ELRSR]
-       str     w10, [x3, #(VGIC_CPU_ELRSR + 4)]
-       str     w11, [x3, #VGIC_CPU_APR]
-
-       /* Clear GICH_HCR */
-       str     wzr, [x2, #GICH_HCR]
-
-       /* Save list registers */
-       add     x2, x2, #GICH_LR0
-       ldr     w4, [x3, #VGIC_CPU_NR_LR]
-       add     x3, x3, #VGIC_CPU_LR
-1:     ldr     w5, [x2], #4
-CPU_BE(        rev     w5, w5 )
-       str     w5, [x3], #4
-       sub     w4, w4, #1
-       cbnz    w4, 1b
-2:
+       adr     x24, __vgic_sr_vectors
+       ldr     x24, [x24, VGIC_SAVE_FN]
+       kern_hyp_va     x24
+       blr     x24
+       mrs     x24, hcr_el2
+       mov     x25, #HCR_INT_OVERRIDE
+       neg     x25, x25
+       and     x24, x24, x25
+       msr     hcr_el2, x24
 .endm
 
 /*
- * Restore the VGIC CPU state from memory
- * x0: Register pointing to VCPU struct
+ * Call into the vgic backend for state restoring
  */
 .macro restore_vgic_state
-       /* Get VGIC VCTRL base into x2 */
-       ldr     x2, [x0, #VCPU_KVM]
-       kern_hyp_va     x2
-       ldr     x2, [x2, #KVM_VGIC_VCTRL]
-       kern_hyp_va     x2
-       cbz     x2, 2f          // disabled
-
-       /* Compute the address of struct vgic_cpu */
-       add     x3, x0, #VCPU_VGIC_CPU
-
-       /* We only restore a minimal set of registers */
-       ldr     w4, [x3, #VGIC_CPU_HCR]
-       ldr     w5, [x3, #VGIC_CPU_VMCR]
-       ldr     w6, [x3, #VGIC_CPU_APR]
-CPU_BE(        rev     w4, w4 )
-CPU_BE(        rev     w5, w5 )
-CPU_BE(        rev     w6, w6 )
-
-       str     w4, [x2, #GICH_HCR]
-       str     w5, [x2, #GICH_VMCR]
-       str     w6, [x2, #GICH_APR]
-
-       /* Restore list registers */
-       add     x2, x2, #GICH_LR0
-       ldr     w4, [x3, #VGIC_CPU_NR_LR]
-       add     x3, x3, #VGIC_CPU_LR
-1:     ldr     w5, [x3], #4
-CPU_BE(        rev     w5, w5 )
-       str     w5, [x2], #4
-       sub     w4, w4, #1
-       cbnz    w4, 1b
-2:
+       mrs     x24, hcr_el2
+       ldr     x25, [x0, #VCPU_IRQ_LINES]
+       orr     x24, x24, #HCR_INT_OVERRIDE
+       orr     x24, x24, x25
+       msr     hcr_el2, x24
+       adr     x24, __vgic_sr_vectors
+       ldr     x24, [x24, #VGIC_RESTORE_FN]
+       kern_hyp_va     x24
+       blr     x24
 .endm
 
 .macro save_timer_state
@@ -537,6 +895,14 @@ __restore_sysregs:
        restore_sysregs
        ret
 
+__save_debug:
+       save_debug
+       ret
+
+__restore_debug:
+       restore_debug
+       ret
+
 __save_fpsimd:
        save_fpsimd
        ret
@@ -568,6 +934,9 @@ ENTRY(__kvm_vcpu_run)
        bl __save_fpsimd
        bl __save_sysregs
 
+       compute_debug_state 1f
+       bl      __save_debug
+1:
        activate_traps
        activate_vm
 
@@ -579,6 +948,10 @@ ENTRY(__kvm_vcpu_run)
 
        bl __restore_sysregs
        bl __restore_fpsimd
+
+       skip_debug_state x3, 1f
+       bl      __restore_debug
+1:
        restore_guest_32bit_state
        restore_guest_regs
 
@@ -595,6 +968,10 @@ __kvm_vcpu_return:
        save_guest_regs
        bl __save_fpsimd
        bl __save_sysregs
+
+       skip_debug_state x3, 1f
+       bl      __save_debug
+1:
        save_guest_32bit_state
 
        save_timer_state
@@ -609,6 +986,14 @@ __kvm_vcpu_return:
 
        bl __restore_sysregs
        bl __restore_fpsimd
+
+       skip_debug_state x3, 1f
+       // Clear the dirty flag for the next run, as all the state has
+       // already been saved. Note that we nuke the whole 64bit word.
+       // If we ever add more flags, we'll have to be more careful...
+       str     xzr, [x0, #VCPU_DEBUG_FLAGS]
+       bl      __restore_debug
+1:
        restore_host_regs
 
        mov     x0, x1
@@ -653,6 +1038,12 @@ ENTRY(__kvm_flush_vm_context)
        ret
 ENDPROC(__kvm_flush_vm_context)
 
+       // struct vgic_sr_vectors __vgi_sr_vectors;
+       .align 3
+ENTRY(__vgic_sr_vectors)
+       .skip   VGIC_SR_VECTOR_SZ
+ENDPROC(__vgic_sr_vectors)
+
 __kvm_hyp_panic:
        // Guess the context by looking at VTTBR:
        // If zero, then we're already a host.
@@ -830,7 +1221,7 @@ el1_trap:
        mrs     x2, far_el2
 
 2:     mrs     x0, tpidr_el2
-       str     x1, [x0, #VCPU_ESR_EL2]
+       str     w1, [x0, #VCPU_ESR_EL2]
        str     x2, [x0, #VCPU_FAR_EL2]
        str     x3, [x0, #VCPU_HPFAR_EL2]
 
@@ -880,7 +1271,4 @@ ENTRY(__kvm_hyp_vector)
        ventry  el1_error_invalid               // Error 32-bit EL1
 ENDPROC(__kvm_hyp_vector)
 
-__kvm_hyp_code_end:
-       .globl  __kvm_hyp_code_end
-
        .popsection
index c59a1bdab5eb6f36ae9507abff72de2dc17acf14..5805e7c4a4ddf573603167c91244cf01d46813b1 100644 (file)
@@ -30,6 +30,7 @@
 #include <asm/kvm_mmu.h>
 #include <asm/cacheflush.h>
 #include <asm/cputype.h>
+#include <asm/debug-monitors.h>
 #include <trace/events/kvm.h>
 
 #include "sys_regs.h"
@@ -137,10 +138,11 @@ static bool access_vm_reg(struct kvm_vcpu *vcpu,
        if (!p->is_aarch32) {
                vcpu_sys_reg(vcpu, r->reg) = val;
        } else {
-               vcpu_cp15(vcpu, r->reg) = val & 0xffffffffUL;
                if (!p->is_32bit)
-                       vcpu_cp15(vcpu, r->reg + 1) = val >> 32;
+                       vcpu_cp15_64_high(vcpu, r->reg) = val >> 32;
+               vcpu_cp15_64_low(vcpu, r->reg) = val & 0xffffffffUL;
        }
+
        return true;
 }
 
@@ -163,18 +165,9 @@ static bool access_sctlr(struct kvm_vcpu *vcpu,
        return true;
 }
 
-/*
- * We could trap ID_DFR0 and tell the guest we don't support performance
- * monitoring.  Unfortunately the patch to make the kernel check ID_DFR0 was
- * NAKed, so it will read the PMCR anyway.
- *
- * Therefore we tell the guest we have 0 counters.  Unfortunately, we
- * must always support PMCCNTR (the cycle counter): we just RAZ/WI for
- * all PM registers, which doesn't crash the guest kernel at least.
- */
-static bool pm_fake(struct kvm_vcpu *vcpu,
-                   const struct sys_reg_params *p,
-                   const struct sys_reg_desc *r)
+static bool trap_raz_wi(struct kvm_vcpu *vcpu,
+                       const struct sys_reg_params *p,
+                       const struct sys_reg_desc *r)
 {
        if (p->is_write)
                return ignore_write(vcpu, p);
@@ -182,6 +175,73 @@ static bool pm_fake(struct kvm_vcpu *vcpu,
                return read_zero(vcpu, p);
 }
 
+static bool trap_oslsr_el1(struct kvm_vcpu *vcpu,
+                          const struct sys_reg_params *p,
+                          const struct sys_reg_desc *r)
+{
+       if (p->is_write) {
+               return ignore_write(vcpu, p);
+       } else {
+               *vcpu_reg(vcpu, p->Rt) = (1 << 3);
+               return true;
+       }
+}
+
+static bool trap_dbgauthstatus_el1(struct kvm_vcpu *vcpu,
+                                  const struct sys_reg_params *p,
+                                  const struct sys_reg_desc *r)
+{
+       if (p->is_write) {
+               return ignore_write(vcpu, p);
+       } else {
+               u32 val;
+               asm volatile("mrs %0, dbgauthstatus_el1" : "=r" (val));
+               *vcpu_reg(vcpu, p->Rt) = val;
+               return true;
+       }
+}
+
+/*
+ * We want to avoid world-switching all the DBG registers all the
+ * time:
+ * 
+ * - If we've touched any debug register, it is likely that we're
+ *   going to touch more of them. It then makes sense to disable the
+ *   traps and start doing the save/restore dance
+ * - If debug is active (DBG_MDSCR_KDE or DBG_MDSCR_MDE set), it is
+ *   then mandatory to save/restore the registers, as the guest
+ *   depends on them.
+ * 
+ * For this, we use a DIRTY bit, indicating the guest has modified the
+ * debug registers, used as follow:
+ *
+ * On guest entry:
+ * - If the dirty bit is set (because we're coming back from trapping),
+ *   disable the traps, save host registers, restore guest registers.
+ * - If debug is actively in use (DBG_MDSCR_KDE or DBG_MDSCR_MDE set),
+ *   set the dirty bit, disable the traps, save host registers,
+ *   restore guest registers.
+ * - Otherwise, enable the traps
+ *
+ * On guest exit:
+ * - If the dirty bit is set, save guest registers, restore host
+ *   registers and clear the dirty bit. This ensure that the host can
+ *   now use the debug registers.
+ */
+static bool trap_debug_regs(struct kvm_vcpu *vcpu,
+                           const struct sys_reg_params *p,
+                           const struct sys_reg_desc *r)
+{
+       if (p->is_write) {
+               vcpu_sys_reg(vcpu, r->reg) = *vcpu_reg(vcpu, p->Rt);
+               vcpu->arch.debug_flags |= KVM_ARM64_DEBUG_DIRTY;
+       } else {
+               *vcpu_reg(vcpu, p->Rt) = vcpu_sys_reg(vcpu, r->reg);
+       }
+
+       return true;
+}
+
 static void reset_amair_el1(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r)
 {
        u64 amair;
@@ -198,9 +258,39 @@ static void reset_mpidr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r)
        vcpu_sys_reg(vcpu, MPIDR_EL1) = (1UL << 31) | (vcpu->vcpu_id & 0xff);
 }
 
+/* Silly macro to expand the DBG{BCR,BVR,WVR,WCR}n_EL1 registers in one go */
+#define DBG_BCR_BVR_WCR_WVR_EL1(n)                                     \
+       /* DBGBVRn_EL1 */                                               \
+       { Op0(0b10), Op1(0b000), CRn(0b0000), CRm((n)), Op2(0b100),     \
+         trap_debug_regs, reset_val, (DBGBVR0_EL1 + (n)), 0 },         \
+       /* DBGBCRn_EL1 */                                               \
+       { Op0(0b10), Op1(0b000), CRn(0b0000), CRm((n)), Op2(0b101),     \
+         trap_debug_regs, reset_val, (DBGBCR0_EL1 + (n)), 0 },         \
+       /* DBGWVRn_EL1 */                                               \
+       { Op0(0b10), Op1(0b000), CRn(0b0000), CRm((n)), Op2(0b110),     \
+         trap_debug_regs, reset_val, (DBGWVR0_EL1 + (n)), 0 },         \
+       /* DBGWCRn_EL1 */                                               \
+       { Op0(0b10), Op1(0b000), CRn(0b0000), CRm((n)), Op2(0b111),     \
+         trap_debug_regs, reset_val, (DBGWCR0_EL1 + (n)), 0 }
+
 /*
  * Architected system registers.
  * Important: Must be sorted ascending by Op0, Op1, CRn, CRm, Op2
+ *
+ * We could trap ID_DFR0 and tell the guest we don't support performance
+ * monitoring.  Unfortunately the patch to make the kernel check ID_DFR0 was
+ * NAKed, so it will read the PMCR anyway.
+ *
+ * Therefore we tell the guest we have 0 counters.  Unfortunately, we
+ * must always support PMCCNTR (the cycle counter): we just RAZ/WI for
+ * all PM registers, which doesn't crash the guest kernel at least.
+ *
+ * Debug handling: We do trap most, if not all debug related system
+ * registers. The implementation is good enough to ensure that a guest
+ * can use these with minimal performance degradation. The drawback is
+ * that we don't implement any of the external debug, none of the
+ * OSlock protocol. This should be revisited if we ever encounter a
+ * more demanding guest...
  */
 static const struct sys_reg_desc sys_reg_descs[] = {
        /* DC ISW */
@@ -213,12 +303,71 @@ static const struct sys_reg_desc sys_reg_descs[] = {
        { Op0(0b01), Op1(0b000), CRn(0b0111), CRm(0b1110), Op2(0b010),
          access_dcsw },
 
+       DBG_BCR_BVR_WCR_WVR_EL1(0),
+       DBG_BCR_BVR_WCR_WVR_EL1(1),
+       /* MDCCINT_EL1 */
+       { Op0(0b10), Op1(0b000), CRn(0b0000), CRm(0b0010), Op2(0b000),
+         trap_debug_regs, reset_val, MDCCINT_EL1, 0 },
+       /* MDSCR_EL1 */
+       { Op0(0b10), Op1(0b000), CRn(0b0000), CRm(0b0010), Op2(0b010),
+         trap_debug_regs, reset_val, MDSCR_EL1, 0 },
+       DBG_BCR_BVR_WCR_WVR_EL1(2),
+       DBG_BCR_BVR_WCR_WVR_EL1(3),
+       DBG_BCR_BVR_WCR_WVR_EL1(4),
+       DBG_BCR_BVR_WCR_WVR_EL1(5),
+       DBG_BCR_BVR_WCR_WVR_EL1(6),
+       DBG_BCR_BVR_WCR_WVR_EL1(7),
+       DBG_BCR_BVR_WCR_WVR_EL1(8),
+       DBG_BCR_BVR_WCR_WVR_EL1(9),
+       DBG_BCR_BVR_WCR_WVR_EL1(10),
+       DBG_BCR_BVR_WCR_WVR_EL1(11),
+       DBG_BCR_BVR_WCR_WVR_EL1(12),
+       DBG_BCR_BVR_WCR_WVR_EL1(13),
+       DBG_BCR_BVR_WCR_WVR_EL1(14),
+       DBG_BCR_BVR_WCR_WVR_EL1(15),
+
+       /* MDRAR_EL1 */
+       { Op0(0b10), Op1(0b000), CRn(0b0001), CRm(0b0000), Op2(0b000),
+         trap_raz_wi },
+       /* OSLAR_EL1 */
+       { Op0(0b10), Op1(0b000), CRn(0b0001), CRm(0b0000), Op2(0b100),
+         trap_raz_wi },
+       /* OSLSR_EL1 */
+       { Op0(0b10), Op1(0b000), CRn(0b0001), CRm(0b0001), Op2(0b100),
+         trap_oslsr_el1 },
+       /* OSDLR_EL1 */
+       { Op0(0b10), Op1(0b000), CRn(0b0001), CRm(0b0011), Op2(0b100),
+         trap_raz_wi },
+       /* DBGPRCR_EL1 */
+       { Op0(0b10), Op1(0b000), CRn(0b0001), CRm(0b0100), Op2(0b100),
+         trap_raz_wi },
+       /* DBGCLAIMSET_EL1 */
+       { Op0(0b10), Op1(0b000), CRn(0b0111), CRm(0b1000), Op2(0b110),
+         trap_raz_wi },
+       /* DBGCLAIMCLR_EL1 */
+       { Op0(0b10), Op1(0b000), CRn(0b0111), CRm(0b1001), Op2(0b110),
+         trap_raz_wi },
+       /* DBGAUTHSTATUS_EL1 */
+       { Op0(0b10), Op1(0b000), CRn(0b0111), CRm(0b1110), Op2(0b110),
+         trap_dbgauthstatus_el1 },
+
        /* TEECR32_EL1 */
        { Op0(0b10), Op1(0b010), CRn(0b0000), CRm(0b0000), Op2(0b000),
          NULL, reset_val, TEECR32_EL1, 0 },
        /* TEEHBR32_EL1 */
        { Op0(0b10), Op1(0b010), CRn(0b0001), CRm(0b0000), Op2(0b000),
          NULL, reset_val, TEEHBR32_EL1, 0 },
+
+       /* MDCCSR_EL1 */
+       { Op0(0b10), Op1(0b011), CRn(0b0000), CRm(0b0001), Op2(0b000),
+         trap_raz_wi },
+       /* DBGDTR_EL0 */
+       { Op0(0b10), Op1(0b011), CRn(0b0000), CRm(0b0100), Op2(0b000),
+         trap_raz_wi },
+       /* DBGDTR[TR]X_EL0 */
+       { Op0(0b10), Op1(0b011), CRn(0b0000), CRm(0b0101), Op2(0b000),
+         trap_raz_wi },
+
        /* DBGVCR32_EL2 */
        { Op0(0b10), Op1(0b100), CRn(0b0000), CRm(0b0111), Op2(0b000),
          NULL, reset_val, DBGVCR32_EL2, 0 },
@@ -260,10 +409,10 @@ static const struct sys_reg_desc sys_reg_descs[] = {
 
        /* PMINTENSET_EL1 */
        { Op0(0b11), Op1(0b000), CRn(0b1001), CRm(0b1110), Op2(0b001),
-         pm_fake },
+         trap_raz_wi },
        /* PMINTENCLR_EL1 */
        { Op0(0b11), Op1(0b000), CRn(0b1001), CRm(0b1110), Op2(0b010),
-         pm_fake },
+         trap_raz_wi },
 
        /* MAIR_EL1 */
        { Op0(0b11), Op1(0b000), CRn(0b1010), CRm(0b0010), Op2(0b000),
@@ -292,43 +441,43 @@ static const struct sys_reg_desc sys_reg_descs[] = {
 
        /* PMCR_EL0 */
        { Op0(0b11), Op1(0b011), CRn(0b1001), CRm(0b1100), Op2(0b000),
-         pm_fake },
+         trap_raz_wi },
        /* PMCNTENSET_EL0 */
        { Op0(0b11), Op1(0b011), CRn(0b1001), CRm(0b1100), Op2(0b001),
-         pm_fake },
+         trap_raz_wi },
        /* PMCNTENCLR_EL0 */
        { Op0(0b11), Op1(0b011), CRn(0b1001), CRm(0b1100), Op2(0b010),
-         pm_fake },
+         trap_raz_wi },
        /* PMOVSCLR_EL0 */
        { Op0(0b11), Op1(0b011), CRn(0b1001), CRm(0b1100), Op2(0b011),
-         pm_fake },
+         trap_raz_wi },
        /* PMSWINC_EL0 */
        { Op0(0b11), Op1(0b011), CRn(0b1001), CRm(0b1100), Op2(0b100),
-         pm_fake },
+         trap_raz_wi },
        /* PMSELR_EL0 */
        { Op0(0b11), Op1(0b011), CRn(0b1001), CRm(0b1100), Op2(0b101),
-         pm_fake },
+         trap_raz_wi },
        /* PMCEID0_EL0 */
        { Op0(0b11), Op1(0b011), CRn(0b1001), CRm(0b1100), Op2(0b110),
-         pm_fake },
+         trap_raz_wi },
        /* PMCEID1_EL0 */
        { Op0(0b11), Op1(0b011), CRn(0b1001), CRm(0b1100), Op2(0b111),
-         pm_fake },
+         trap_raz_wi },
        /* PMCCNTR_EL0 */
        { Op0(0b11), Op1(0b011), CRn(0b1001), CRm(0b1101), Op2(0b000),
-         pm_fake },
+         trap_raz_wi },
        /* PMXEVTYPER_EL0 */
        { Op0(0b11), Op1(0b011), CRn(0b1001), CRm(0b1101), Op2(0b001),
-         pm_fake },
+         trap_raz_wi },
        /* PMXEVCNTR_EL0 */
        { Op0(0b11), Op1(0b011), CRn(0b1001), CRm(0b1101), Op2(0b010),
-         pm_fake },
+         trap_raz_wi },
        /* PMUSERENR_EL0 */
        { Op0(0b11), Op1(0b011), CRn(0b1001), CRm(0b1110), Op2(0b000),
-         pm_fake },
+         trap_raz_wi },
        /* PMOVSSET_EL0 */
        { Op0(0b11), Op1(0b011), CRn(0b1001), CRm(0b1110), Op2(0b011),
-         pm_fake },
+         trap_raz_wi },
 
        /* TPIDR_EL0 */
        { Op0(0b11), Op1(0b011), CRn(0b1101), CRm(0b0000), Op2(0b010),
@@ -348,13 +497,161 @@ static const struct sys_reg_desc sys_reg_descs[] = {
          NULL, reset_val, FPEXC32_EL2, 0x70 },
 };
 
+static bool trap_dbgidr(struct kvm_vcpu *vcpu,
+                       const struct sys_reg_params *p,
+                       const struct sys_reg_desc *r)
+{
+       if (p->is_write) {
+               return ignore_write(vcpu, p);
+       } else {
+               u64 dfr = read_cpuid(ID_AA64DFR0_EL1);
+               u64 pfr = read_cpuid(ID_AA64PFR0_EL1);
+               u32 el3 = !!((pfr >> 12) & 0xf);
+
+               *vcpu_reg(vcpu, p->Rt) = ((((dfr >> 20) & 0xf) << 28) |
+                                         (((dfr >> 12) & 0xf) << 24) |
+                                         (((dfr >> 28) & 0xf) << 20) |
+                                         (6 << 16) | (el3 << 14) | (el3 << 12));
+               return true;
+       }
+}
+
+static bool trap_debug32(struct kvm_vcpu *vcpu,
+                        const struct sys_reg_params *p,
+                        const struct sys_reg_desc *r)
+{
+       if (p->is_write) {
+               vcpu_cp14(vcpu, r->reg) = *vcpu_reg(vcpu, p->Rt);
+               vcpu->arch.debug_flags |= KVM_ARM64_DEBUG_DIRTY;
+       } else {
+               *vcpu_reg(vcpu, p->Rt) = vcpu_cp14(vcpu, r->reg);
+       }
+
+       return true;
+}
+
+#define DBG_BCR_BVR_WCR_WVR(n)                                 \
+       /* DBGBVRn */                                           \
+       { Op1( 0), CRn( 0), CRm((n)), Op2( 4), trap_debug32,    \
+         NULL, (cp14_DBGBVR0 + (n) * 2) },                     \
+       /* DBGBCRn */                                           \
+       { Op1( 0), CRn( 0), CRm((n)), Op2( 5), trap_debug32,    \
+         NULL, (cp14_DBGBCR0 + (n) * 2) },                     \
+       /* DBGWVRn */                                           \
+       { Op1( 0), CRn( 0), CRm((n)), Op2( 6), trap_debug32,    \
+         NULL, (cp14_DBGWVR0 + (n) * 2) },                     \
+       /* DBGWCRn */                                           \
+       { Op1( 0), CRn( 0), CRm((n)), Op2( 7), trap_debug32,    \
+         NULL, (cp14_DBGWCR0 + (n) * 2) }
+
+#define DBGBXVR(n)                                             \
+       { Op1( 0), CRn( 1), CRm((n)), Op2( 1), trap_debug32,    \
+         NULL, cp14_DBGBXVR0 + n * 2 }
+
+/*
+ * Trapped cp14 registers. We generally ignore most of the external
+ * debug, on the principle that they don't really make sense to a
+ * guest. Revisit this one day, whould this principle change.
+ */
+static const struct sys_reg_desc cp14_regs[] = {
+       /* DBGIDR */
+       { Op1( 0), CRn( 0), CRm( 0), Op2( 0), trap_dbgidr },
+       /* DBGDTRRXext */
+       { Op1( 0), CRn( 0), CRm( 0), Op2( 2), trap_raz_wi },
+
+       DBG_BCR_BVR_WCR_WVR(0),
+       /* DBGDSCRint */
+       { Op1( 0), CRn( 0), CRm( 1), Op2( 0), trap_raz_wi },
+       DBG_BCR_BVR_WCR_WVR(1),
+       /* DBGDCCINT */
+       { Op1( 0), CRn( 0), CRm( 2), Op2( 0), trap_debug32 },
+       /* DBGDSCRext */
+       { Op1( 0), CRn( 0), CRm( 2), Op2( 2), trap_debug32 },
+       DBG_BCR_BVR_WCR_WVR(2),
+       /* DBGDTR[RT]Xint */
+       { Op1( 0), CRn( 0), CRm( 3), Op2( 0), trap_raz_wi },
+       /* DBGDTR[RT]Xext */
+       { Op1( 0), CRn( 0), CRm( 3), Op2( 2), trap_raz_wi },
+       DBG_BCR_BVR_WCR_WVR(3),
+       DBG_BCR_BVR_WCR_WVR(4),
+       DBG_BCR_BVR_WCR_WVR(5),
+       /* DBGWFAR */
+       { Op1( 0), CRn( 0), CRm( 6), Op2( 0), trap_raz_wi },
+       /* DBGOSECCR */
+       { Op1( 0), CRn( 0), CRm( 6), Op2( 2), trap_raz_wi },
+       DBG_BCR_BVR_WCR_WVR(6),
+       /* DBGVCR */
+       { Op1( 0), CRn( 0), CRm( 7), Op2( 0), trap_debug32 },
+       DBG_BCR_BVR_WCR_WVR(7),
+       DBG_BCR_BVR_WCR_WVR(8),
+       DBG_BCR_BVR_WCR_WVR(9),
+       DBG_BCR_BVR_WCR_WVR(10),
+       DBG_BCR_BVR_WCR_WVR(11),
+       DBG_BCR_BVR_WCR_WVR(12),
+       DBG_BCR_BVR_WCR_WVR(13),
+       DBG_BCR_BVR_WCR_WVR(14),
+       DBG_BCR_BVR_WCR_WVR(15),
+
+       /* DBGDRAR (32bit) */
+       { Op1( 0), CRn( 1), CRm( 0), Op2( 0), trap_raz_wi },
+
+       DBGBXVR(0),
+       /* DBGOSLAR */
+       { Op1( 0), CRn( 1), CRm( 0), Op2( 4), trap_raz_wi },
+       DBGBXVR(1),
+       /* DBGOSLSR */
+       { Op1( 0), CRn( 1), CRm( 1), Op2( 4), trap_oslsr_el1 },
+       DBGBXVR(2),
+       DBGBXVR(3),
+       /* DBGOSDLR */
+       { Op1( 0), CRn( 1), CRm( 3), Op2( 4), trap_raz_wi },
+       DBGBXVR(4),
+       /* DBGPRCR */
+       { Op1( 0), CRn( 1), CRm( 4), Op2( 4), trap_raz_wi },
+       DBGBXVR(5),
+       DBGBXVR(6),
+       DBGBXVR(7),
+       DBGBXVR(8),
+       DBGBXVR(9),
+       DBGBXVR(10),
+       DBGBXVR(11),
+       DBGBXVR(12),
+       DBGBXVR(13),
+       DBGBXVR(14),
+       DBGBXVR(15),
+
+       /* DBGDSAR (32bit) */
+       { Op1( 0), CRn( 2), CRm( 0), Op2( 0), trap_raz_wi },
+
+       /* DBGDEVID2 */
+       { Op1( 0), CRn( 7), CRm( 0), Op2( 7), trap_raz_wi },
+       /* DBGDEVID1 */
+       { Op1( 0), CRn( 7), CRm( 1), Op2( 7), trap_raz_wi },
+       /* DBGDEVID */
+       { Op1( 0), CRn( 7), CRm( 2), Op2( 7), trap_raz_wi },
+       /* DBGCLAIMSET */
+       { Op1( 0), CRn( 7), CRm( 8), Op2( 6), trap_raz_wi },
+       /* DBGCLAIMCLR */
+       { Op1( 0), CRn( 7), CRm( 9), Op2( 6), trap_raz_wi },
+       /* DBGAUTHSTATUS */
+       { Op1( 0), CRn( 7), CRm(14), Op2( 6), trap_dbgauthstatus_el1 },
+};
+
+/* Trapped cp14 64bit registers */
+static const struct sys_reg_desc cp14_64_regs[] = {
+       /* DBGDRAR (64bit) */
+       { Op1( 0), CRm( 1), .access = trap_raz_wi },
+
+       /* DBGDSAR (64bit) */
+       { Op1( 0), CRm( 2), .access = trap_raz_wi },
+};
+
 /*
  * Trapped cp15 registers. TTBR0/TTBR1 get a double encoding,
  * depending on the way they are accessed (as a 32bit or a 64bit
  * register).
  */
 static const struct sys_reg_desc cp15_regs[] = {
-       { Op1( 0), CRn( 0), CRm( 2), Op2( 0), access_vm_reg, NULL, c2_TTBR0 },
        { Op1( 0), CRn( 1), CRm( 0), Op2( 0), access_sctlr, NULL, c1_SCTLR },
        { Op1( 0), CRn( 2), CRm( 0), Op2( 0), access_vm_reg, NULL, c2_TTBR0 },
        { Op1( 0), CRn( 2), CRm( 0), Op2( 1), access_vm_reg, NULL, c2_TTBR1 },
@@ -374,26 +671,30 @@ static const struct sys_reg_desc cp15_regs[] = {
        { Op1( 0), CRn( 7), CRm(10), Op2( 2), access_dcsw },
        { Op1( 0), CRn( 7), CRm(14), Op2( 2), access_dcsw },
 
-       { Op1( 0), CRn( 9), CRm(12), Op2( 0), pm_fake },
-       { Op1( 0), CRn( 9), CRm(12), Op2( 1), pm_fake },
-       { Op1( 0), CRn( 9), CRm(12), Op2( 2), pm_fake },
-       { Op1( 0), CRn( 9), CRm(12), Op2( 3), pm_fake },
-       { Op1( 0), CRn( 9), CRm(12), Op2( 5), pm_fake },
-       { Op1( 0), CRn( 9), CRm(12), Op2( 6), pm_fake },
-       { Op1( 0), CRn( 9), CRm(12), Op2( 7), pm_fake },
-       { Op1( 0), CRn( 9), CRm(13), Op2( 0), pm_fake },
-       { Op1( 0), CRn( 9), CRm(13), Op2( 1), pm_fake },
-       { Op1( 0), CRn( 9), CRm(13), Op2( 2), pm_fake },
-       { Op1( 0), CRn( 9), CRm(14), Op2( 0), pm_fake },
-       { Op1( 0), CRn( 9), CRm(14), Op2( 1), pm_fake },
-       { Op1( 0), CRn( 9), CRm(14), Op2( 2), pm_fake },
+       /* PMU */
+       { Op1( 0), CRn( 9), CRm(12), Op2( 0), trap_raz_wi },
+       { Op1( 0), CRn( 9), CRm(12), Op2( 1), trap_raz_wi },
+       { Op1( 0), CRn( 9), CRm(12), Op2( 2), trap_raz_wi },
+       { Op1( 0), CRn( 9), CRm(12), Op2( 3), trap_raz_wi },
+       { Op1( 0), CRn( 9), CRm(12), Op2( 5), trap_raz_wi },
+       { Op1( 0), CRn( 9), CRm(12), Op2( 6), trap_raz_wi },
+       { Op1( 0), CRn( 9), CRm(12), Op2( 7), trap_raz_wi },
+       { Op1( 0), CRn( 9), CRm(13), Op2( 0), trap_raz_wi },
+       { Op1( 0), CRn( 9), CRm(13), Op2( 1), trap_raz_wi },
+       { Op1( 0), CRn( 9), CRm(13), Op2( 2), trap_raz_wi },
+       { Op1( 0), CRn( 9), CRm(14), Op2( 0), trap_raz_wi },
+       { Op1( 0), CRn( 9), CRm(14), Op2( 1), trap_raz_wi },
+       { Op1( 0), CRn( 9), CRm(14), Op2( 2), trap_raz_wi },
 
        { Op1( 0), CRn(10), CRm( 2), Op2( 0), access_vm_reg, NULL, c10_PRRR },
        { Op1( 0), CRn(10), CRm( 2), Op2( 1), access_vm_reg, NULL, c10_NMRR },
        { Op1( 0), CRn(10), CRm( 3), Op2( 0), access_vm_reg, NULL, c10_AMAIR0 },
        { Op1( 0), CRn(10), CRm( 3), Op2( 1), access_vm_reg, NULL, c10_AMAIR1 },
        { Op1( 0), CRn(13), CRm( 0), Op2( 1), access_vm_reg, NULL, c13_CID },
+};
 
+static const struct sys_reg_desc cp15_64_regs[] = {
+       { Op1( 0), CRn( 0), CRm( 2), Op2( 0), access_vm_reg, NULL, c2_TTBR0 },
        { Op1( 1), CRn( 0), CRm( 2), Op2( 0), access_vm_reg, NULL, c2_TTBR1 },
 };
 
@@ -454,26 +755,29 @@ int kvm_handle_cp14_load_store(struct kvm_vcpu *vcpu, struct kvm_run *run)
        return 1;
 }
 
-int kvm_handle_cp14_access(struct kvm_vcpu *vcpu, struct kvm_run *run)
-{
-       kvm_inject_undefined(vcpu);
-       return 1;
-}
-
-static void emulate_cp15(struct kvm_vcpu *vcpu,
-                        const struct sys_reg_params *params)
+/*
+ * emulate_cp --  tries to match a sys_reg access in a handling table, and
+ *                call the corresponding trap handler.
+ *
+ * @params: pointer to the descriptor of the access
+ * @table: array of trap descriptors
+ * @num: size of the trap descriptor array
+ *
+ * Return 0 if the access has been handled, and -1 if not.
+ */
+static int emulate_cp(struct kvm_vcpu *vcpu,
+                     const struct sys_reg_params *params,
+                     const struct sys_reg_desc *table,
+                     size_t num)
 {
-       size_t num;
-       const struct sys_reg_desc *table, *r;
+       const struct sys_reg_desc *r;
 
-       table = get_target_table(vcpu->arch.target, false, &num);
+       if (!table)
+               return -1;      /* Not handled */
 
-       /* Search target-specific then generic table. */
        r = find_reg(params, table, num);
-       if (!r)
-               r = find_reg(params, cp15_regs, ARRAY_SIZE(cp15_regs));
 
-       if (likely(r)) {
+       if (r) {
                /*
                 * Not having an accessor means that we have
                 * configured a trap that we don't know how to
@@ -485,22 +789,51 @@ static void emulate_cp15(struct kvm_vcpu *vcpu,
                if (likely(r->access(vcpu, params, r))) {
                        /* Skip instruction, since it was emulated */
                        kvm_skip_instr(vcpu, kvm_vcpu_trap_il_is32bit(vcpu));
-                       return;
                }
-               /* If access function fails, it should complain. */
+
+               /* Handled */
+               return 0;
        }
 
-       kvm_err("Unsupported guest CP15 access at: %08lx\n", *vcpu_pc(vcpu));
+       /* Not handled */
+       return -1;
+}
+
+static void unhandled_cp_access(struct kvm_vcpu *vcpu,
+                               struct sys_reg_params *params)
+{
+       u8 hsr_ec = kvm_vcpu_trap_get_class(vcpu);
+       int cp;
+
+       switch(hsr_ec) {
+       case ESR_EL2_EC_CP15_32:
+       case ESR_EL2_EC_CP15_64:
+               cp = 15;
+               break;
+       case ESR_EL2_EC_CP14_MR:
+       case ESR_EL2_EC_CP14_64:
+               cp = 14;
+               break;
+       default:
+               WARN_ON((cp = -1));
+       }
+
+       kvm_err("Unsupported guest CP%d access at: %08lx\n",
+               cp, *vcpu_pc(vcpu));
        print_sys_reg_instr(params);
        kvm_inject_undefined(vcpu);
 }
 
 /**
- * kvm_handle_cp15_64 -- handles a mrrc/mcrr trap on a guest CP15 access
+ * kvm_handle_cp_64 -- handles a mrrc/mcrr trap on a guest CP15 access
  * @vcpu: The VCPU pointer
  * @run:  The kvm_run struct
  */
-int kvm_handle_cp15_64(struct kvm_vcpu *vcpu, struct kvm_run *run)
+static int kvm_handle_cp_64(struct kvm_vcpu *vcpu,
+                           const struct sys_reg_desc *global,
+                           size_t nr_global,
+                           const struct sys_reg_desc *target_specific,
+                           size_t nr_specific)
 {
        struct sys_reg_params params;
        u32 hsr = kvm_vcpu_get_hsr(vcpu);
@@ -529,8 +862,14 @@ int kvm_handle_cp15_64(struct kvm_vcpu *vcpu, struct kvm_run *run)
                *vcpu_reg(vcpu, params.Rt) = val;
        }
 
-       emulate_cp15(vcpu, &params);
+       if (!emulate_cp(vcpu, &params, target_specific, nr_specific))
+               goto out;
+       if (!emulate_cp(vcpu, &params, global, nr_global))
+               goto out;
 
+       unhandled_cp_access(vcpu, &params);
+
+out:
        /* Do the opposite hack for the read side */
        if (!params.is_write) {
                u64 val = *vcpu_reg(vcpu, params.Rt);
@@ -546,7 +885,11 @@ int kvm_handle_cp15_64(struct kvm_vcpu *vcpu, struct kvm_run *run)
  * @vcpu: The VCPU pointer
  * @run:  The kvm_run struct
  */
-int kvm_handle_cp15_32(struct kvm_vcpu *vcpu, struct kvm_run *run)
+static int kvm_handle_cp_32(struct kvm_vcpu *vcpu,
+                           const struct sys_reg_desc *global,
+                           size_t nr_global,
+                           const struct sys_reg_desc *target_specific,
+                           size_t nr_specific)
 {
        struct sys_reg_params params;
        u32 hsr = kvm_vcpu_get_hsr(vcpu);
@@ -561,10 +904,51 @@ int kvm_handle_cp15_32(struct kvm_vcpu *vcpu, struct kvm_run *run)
        params.Op1 = (hsr >> 14) & 0x7;
        params.Op2 = (hsr >> 17) & 0x7;
 
-       emulate_cp15(vcpu, &params);
+       if (!emulate_cp(vcpu, &params, target_specific, nr_specific))
+               return 1;
+       if (!emulate_cp(vcpu, &params, global, nr_global))
+               return 1;
+
+       unhandled_cp_access(vcpu, &params);
        return 1;
 }
 
+int kvm_handle_cp15_64(struct kvm_vcpu *vcpu, struct kvm_run *run)
+{
+       const struct sys_reg_desc *target_specific;
+       size_t num;
+
+       target_specific = get_target_table(vcpu->arch.target, false, &num);
+       return kvm_handle_cp_64(vcpu,
+                               cp15_64_regs, ARRAY_SIZE(cp15_64_regs),
+                               target_specific, num);
+}
+
+int kvm_handle_cp15_32(struct kvm_vcpu *vcpu, struct kvm_run *run)
+{
+       const struct sys_reg_desc *target_specific;
+       size_t num;
+
+       target_specific = get_target_table(vcpu->arch.target, false, &num);
+       return kvm_handle_cp_32(vcpu,
+                               cp15_regs, ARRAY_SIZE(cp15_regs),
+                               target_specific, num);
+}
+
+int kvm_handle_cp14_64(struct kvm_vcpu *vcpu, struct kvm_run *run)
+{
+       return kvm_handle_cp_64(vcpu,
+                               cp14_64_regs, ARRAY_SIZE(cp14_64_regs),
+                               NULL, 0);
+}
+
+int kvm_handle_cp14_32(struct kvm_vcpu *vcpu, struct kvm_run *run)
+{
+       return kvm_handle_cp_32(vcpu,
+                               cp14_regs, ARRAY_SIZE(cp14_regs),
+                               NULL, 0);
+}
+
 static int emulate_sys_reg(struct kvm_vcpu *vcpu,
                           const struct sys_reg_params *params)
 {
@@ -776,17 +1160,15 @@ static struct sys_reg_desc invariant_sys_regs[] = {
          NULL, get_ctr_el0 },
 };
 
-static int reg_from_user(void *val, const void __user *uaddr, u64 id)
+static int reg_from_user(u64 *val, const void __user *uaddr, u64 id)
 {
-       /* This Just Works because we are little endian. */
        if (copy_from_user(val, uaddr, KVM_REG_SIZE(id)) != 0)
                return -EFAULT;
        return 0;
 }
 
-static int reg_to_user(void __user *uaddr, const void *val, u64 id)
+static int reg_to_user(void __user *uaddr, const u64 *val, u64 id)
 {
-       /* This Just Works because we are little endian. */
        if (copy_to_user(uaddr, val, KVM_REG_SIZE(id)) != 0)
                return -EFAULT;
        return 0;
@@ -962,7 +1344,7 @@ static unsigned int num_demux_regs(void)
 
 static int write_demux_regids(u64 __user *uindices)
 {
-       u64 val = KVM_REG_ARM | KVM_REG_SIZE_U32 | KVM_REG_ARM_DEMUX;
+       u64 val = KVM_REG_ARM64 | KVM_REG_SIZE_U32 | KVM_REG_ARM_DEMUX;
        unsigned int i;
 
        val |= KVM_REG_ARM_DEMUX_ID_CCSIDR;
@@ -1069,14 +1451,32 @@ int kvm_arm_copy_sys_reg_indices(struct kvm_vcpu *vcpu, u64 __user *uindices)
        return write_demux_regids(uindices);
 }
 
+static int check_sysreg_table(const struct sys_reg_desc *table, unsigned int n)
+{
+       unsigned int i;
+
+       for (i = 1; i < n; i++) {
+               if (cmp_sys_reg(&table[i-1], &table[i]) >= 0) {
+                       kvm_err("sys_reg table %p out of order (%d)\n", table, i - 1);
+                       return 1;
+               }
+       }
+
+       return 0;
+}
+
 void kvm_sys_reg_table_init(void)
 {
        unsigned int i;
        struct sys_reg_desc clidr;
 
        /* Make sure tables are unique and in order. */
-       for (i = 1; i < ARRAY_SIZE(sys_reg_descs); i++)
-               BUG_ON(cmp_sys_reg(&sys_reg_descs[i-1], &sys_reg_descs[i]) >= 0);
+       BUG_ON(check_sysreg_table(sys_reg_descs, ARRAY_SIZE(sys_reg_descs)));
+       BUG_ON(check_sysreg_table(cp14_regs, ARRAY_SIZE(cp14_regs)));
+       BUG_ON(check_sysreg_table(cp14_64_regs, ARRAY_SIZE(cp14_64_regs)));
+       BUG_ON(check_sysreg_table(cp15_regs, ARRAY_SIZE(cp15_regs)));
+       BUG_ON(check_sysreg_table(cp15_64_regs, ARRAY_SIZE(cp15_64_regs)));
+       BUG_ON(check_sysreg_table(invariant_sys_regs, ARRAY_SIZE(invariant_sys_regs)));
 
        /* We abuse the reset function to overwrite the table itself. */
        for (i = 0; i < ARRAY_SIZE(invariant_sys_regs); i++)
diff --git a/arch/arm64/kvm/vgic-v2-switch.S b/arch/arm64/kvm/vgic-v2-switch.S
new file mode 100644 (file)
index 0000000..ae21177
--- /dev/null
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2012,2013 - ARM Ltd
+ * Author: Marc Zyngier <marc.zyngier@arm.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <linux/linkage.h>
+#include <linux/irqchip/arm-gic.h>
+
+#include <asm/assembler.h>
+#include <asm/memory.h>
+#include <asm/asm-offsets.h>
+#include <asm/kvm.h>
+#include <asm/kvm_asm.h>
+#include <asm/kvm_arm.h>
+#include <asm/kvm_mmu.h>
+
+       .text
+       .pushsection    .hyp.text, "ax"
+
+/*
+ * Save the VGIC CPU state into memory
+ * x0: Register pointing to VCPU struct
+ * Do not corrupt x1!!!
+ */
+ENTRY(__save_vgic_v2_state)
+__save_vgic_v2_state:
+       /* Get VGIC VCTRL base into x2 */
+       ldr     x2, [x0, #VCPU_KVM]
+       kern_hyp_va     x2
+       ldr     x2, [x2, #KVM_VGIC_VCTRL]
+       kern_hyp_va     x2
+       cbz     x2, 2f          // disabled
+
+       /* Compute the address of struct vgic_cpu */
+       add     x3, x0, #VCPU_VGIC_CPU
+
+       /* Save all interesting registers */
+       ldr     w4, [x2, #GICH_HCR]
+       ldr     w5, [x2, #GICH_VMCR]
+       ldr     w6, [x2, #GICH_MISR]
+       ldr     w7, [x2, #GICH_EISR0]
+       ldr     w8, [x2, #GICH_EISR1]
+       ldr     w9, [x2, #GICH_ELRSR0]
+       ldr     w10, [x2, #GICH_ELRSR1]
+       ldr     w11, [x2, #GICH_APR]
+CPU_BE(        rev     w4,  w4  )
+CPU_BE(        rev     w5,  w5  )
+CPU_BE(        rev     w6,  w6  )
+CPU_BE(        rev     w7,  w7  )
+CPU_BE(        rev     w8,  w8  )
+CPU_BE(        rev     w9,  w9  )
+CPU_BE(        rev     w10, w10 )
+CPU_BE(        rev     w11, w11 )
+
+       str     w4, [x3, #VGIC_V2_CPU_HCR]
+       str     w5, [x3, #VGIC_V2_CPU_VMCR]
+       str     w6, [x3, #VGIC_V2_CPU_MISR]
+       str     w7, [x3, #VGIC_V2_CPU_EISR]
+       str     w8, [x3, #(VGIC_V2_CPU_EISR + 4)]
+       str     w9, [x3, #VGIC_V2_CPU_ELRSR]
+       str     w10, [x3, #(VGIC_V2_CPU_ELRSR + 4)]
+       str     w11, [x3, #VGIC_V2_CPU_APR]
+
+       /* Clear GICH_HCR */
+       str     wzr, [x2, #GICH_HCR]
+
+       /* Save list registers */
+       add     x2, x2, #GICH_LR0
+       ldr     w4, [x3, #VGIC_CPU_NR_LR]
+       add     x3, x3, #VGIC_V2_CPU_LR
+1:     ldr     w5, [x2], #4
+CPU_BE(        rev     w5, w5 )
+       str     w5, [x3], #4
+       sub     w4, w4, #1
+       cbnz    w4, 1b
+2:
+       ret
+ENDPROC(__save_vgic_v2_state)
+
+/*
+ * Restore the VGIC CPU state from memory
+ * x0: Register pointing to VCPU struct
+ */
+ENTRY(__restore_vgic_v2_state)
+__restore_vgic_v2_state:
+       /* Get VGIC VCTRL base into x2 */
+       ldr     x2, [x0, #VCPU_KVM]
+       kern_hyp_va     x2
+       ldr     x2, [x2, #KVM_VGIC_VCTRL]
+       kern_hyp_va     x2
+       cbz     x2, 2f          // disabled
+
+       /* Compute the address of struct vgic_cpu */
+       add     x3, x0, #VCPU_VGIC_CPU
+
+       /* We only restore a minimal set of registers */
+       ldr     w4, [x3, #VGIC_V2_CPU_HCR]
+       ldr     w5, [x3, #VGIC_V2_CPU_VMCR]
+       ldr     w6, [x3, #VGIC_V2_CPU_APR]
+CPU_BE(        rev     w4, w4 )
+CPU_BE(        rev     w5, w5 )
+CPU_BE(        rev     w6, w6 )
+
+       str     w4, [x2, #GICH_HCR]
+       str     w5, [x2, #GICH_VMCR]
+       str     w6, [x2, #GICH_APR]
+
+       /* Restore list registers */
+       add     x2, x2, #GICH_LR0
+       ldr     w4, [x3, #VGIC_CPU_NR_LR]
+       add     x3, x3, #VGIC_V2_CPU_LR
+1:     ldr     w5, [x3], #4
+CPU_BE(        rev     w5, w5 )
+       str     w5, [x2], #4
+       sub     w4, w4, #1
+       cbnz    w4, 1b
+2:
+       ret
+ENDPROC(__restore_vgic_v2_state)
+
+       .popsection
diff --git a/arch/arm64/kvm/vgic-v3-switch.S b/arch/arm64/kvm/vgic-v3-switch.S
new file mode 100644 (file)
index 0000000..d160469
--- /dev/null
@@ -0,0 +1,267 @@
+/*
+ * Copyright (C) 2012,2013 - ARM Ltd
+ * Author: Marc Zyngier <marc.zyngier@arm.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <linux/linkage.h>
+#include <linux/irqchip/arm-gic-v3.h>
+
+#include <asm/assembler.h>
+#include <asm/memory.h>
+#include <asm/asm-offsets.h>
+#include <asm/kvm.h>
+#include <asm/kvm_asm.h>
+#include <asm/kvm_arm.h>
+
+       .text
+       .pushsection    .hyp.text, "ax"
+
+/*
+ * We store LRs in reverse order to let the CPU deal with streaming
+ * access. Use this macro to make it look saner...
+ */
+#define LR_OFFSET(n)   (VGIC_V3_CPU_LR + (15 - n) * 8)
+
+/*
+ * Save the VGIC CPU state into memory
+ * x0: Register pointing to VCPU struct
+ * Do not corrupt x1!!!
+ */
+.macro save_vgic_v3_state
+       // Compute the address of struct vgic_cpu
+       add     x3, x0, #VCPU_VGIC_CPU
+
+       // Make sure stores to the GIC via the memory mapped interface
+       // are now visible to the system register interface
+       dsb     st
+
+       // Save all interesting registers
+       mrs_s   x4, ICH_HCR_EL2
+       mrs_s   x5, ICH_VMCR_EL2
+       mrs_s   x6, ICH_MISR_EL2
+       mrs_s   x7, ICH_EISR_EL2
+       mrs_s   x8, ICH_ELSR_EL2
+
+       str     w4, [x3, #VGIC_V3_CPU_HCR]
+       str     w5, [x3, #VGIC_V3_CPU_VMCR]
+       str     w6, [x3, #VGIC_V3_CPU_MISR]
+       str     w7, [x3, #VGIC_V3_CPU_EISR]
+       str     w8, [x3, #VGIC_V3_CPU_ELRSR]
+
+       msr_s   ICH_HCR_EL2, xzr
+
+       mrs_s   x21, ICH_VTR_EL2
+       mvn     w22, w21
+       ubfiz   w23, w22, 2, 4  // w23 = (15 - ListRegs) * 4
+
+       adr     x24, 1f
+       add     x24, x24, x23
+       br      x24
+
+1:
+       mrs_s   x20, ICH_LR15_EL2
+       mrs_s   x19, ICH_LR14_EL2
+       mrs_s   x18, ICH_LR13_EL2
+       mrs_s   x17, ICH_LR12_EL2
+       mrs_s   x16, ICH_LR11_EL2
+       mrs_s   x15, ICH_LR10_EL2
+       mrs_s   x14, ICH_LR9_EL2
+       mrs_s   x13, ICH_LR8_EL2
+       mrs_s   x12, ICH_LR7_EL2
+       mrs_s   x11, ICH_LR6_EL2
+       mrs_s   x10, ICH_LR5_EL2
+       mrs_s   x9, ICH_LR4_EL2
+       mrs_s   x8, ICH_LR3_EL2
+       mrs_s   x7, ICH_LR2_EL2
+       mrs_s   x6, ICH_LR1_EL2
+       mrs_s   x5, ICH_LR0_EL2
+
+       adr     x24, 1f
+       add     x24, x24, x23
+       br      x24
+
+1:
+       str     x20, [x3, #LR_OFFSET(15)]
+       str     x19, [x3, #LR_OFFSET(14)]
+       str     x18, [x3, #LR_OFFSET(13)]
+       str     x17, [x3, #LR_OFFSET(12)]
+       str     x16, [x3, #LR_OFFSET(11)]
+       str     x15, [x3, #LR_OFFSET(10)]
+       str     x14, [x3, #LR_OFFSET(9)]
+       str     x13, [x3, #LR_OFFSET(8)]
+       str     x12, [x3, #LR_OFFSET(7)]
+       str     x11, [x3, #LR_OFFSET(6)]
+       str     x10, [x3, #LR_OFFSET(5)]
+       str     x9, [x3, #LR_OFFSET(4)]
+       str     x8, [x3, #LR_OFFSET(3)]
+       str     x7, [x3, #LR_OFFSET(2)]
+       str     x6, [x3, #LR_OFFSET(1)]
+       str     x5, [x3, #LR_OFFSET(0)]
+
+       tbnz    w21, #29, 6f    // 6 bits
+       tbz     w21, #30, 5f    // 5 bits
+                               // 7 bits
+       mrs_s   x20, ICH_AP0R3_EL2
+       str     w20, [x3, #(VGIC_V3_CPU_AP0R + 3*4)]
+       mrs_s   x19, ICH_AP0R2_EL2
+       str     w19, [x3, #(VGIC_V3_CPU_AP0R + 2*4)]
+6:     mrs_s   x18, ICH_AP0R1_EL2
+       str     w18, [x3, #(VGIC_V3_CPU_AP0R + 1*4)]
+5:     mrs_s   x17, ICH_AP0R0_EL2
+       str     w17, [x3, #VGIC_V3_CPU_AP0R]
+
+       tbnz    w21, #29, 6f    // 6 bits
+       tbz     w21, #30, 5f    // 5 bits
+                               // 7 bits
+       mrs_s   x20, ICH_AP1R3_EL2
+       str     w20, [x3, #(VGIC_V3_CPU_AP1R + 3*4)]
+       mrs_s   x19, ICH_AP1R2_EL2
+       str     w19, [x3, #(VGIC_V3_CPU_AP1R + 2*4)]
+6:     mrs_s   x18, ICH_AP1R1_EL2
+       str     w18, [x3, #(VGIC_V3_CPU_AP1R + 1*4)]
+5:     mrs_s   x17, ICH_AP1R0_EL2
+       str     w17, [x3, #VGIC_V3_CPU_AP1R]
+
+       // Restore SRE_EL1 access and re-enable SRE at EL1.
+       mrs_s   x5, ICC_SRE_EL2
+       orr     x5, x5, #ICC_SRE_EL2_ENABLE
+       msr_s   ICC_SRE_EL2, x5
+       isb
+       mov     x5, #1
+       msr_s   ICC_SRE_EL1, x5
+.endm
+
+/*
+ * Restore the VGIC CPU state from memory
+ * x0: Register pointing to VCPU struct
+ */
+.macro restore_vgic_v3_state
+       // Disable SRE_EL1 access. Necessary, otherwise
+       // ICH_VMCR_EL2.VFIQEn becomes one, and FIQ happens...
+       msr_s   ICC_SRE_EL1, xzr
+       isb
+
+       // Compute the address of struct vgic_cpu
+       add     x3, x0, #VCPU_VGIC_CPU
+
+       // Restore all interesting registers
+       ldr     w4, [x3, #VGIC_V3_CPU_HCR]
+       ldr     w5, [x3, #VGIC_V3_CPU_VMCR]
+
+       msr_s   ICH_HCR_EL2, x4
+       msr_s   ICH_VMCR_EL2, x5
+
+       mrs_s   x21, ICH_VTR_EL2
+
+       tbnz    w21, #29, 6f    // 6 bits
+       tbz     w21, #30, 5f    // 5 bits
+                               // 7 bits
+       ldr     w20, [x3, #(VGIC_V3_CPU_AP1R + 3*4)]
+       msr_s   ICH_AP1R3_EL2, x20
+       ldr     w19, [x3, #(VGIC_V3_CPU_AP1R + 2*4)]
+       msr_s   ICH_AP1R2_EL2, x19
+6:     ldr     w18, [x3, #(VGIC_V3_CPU_AP1R + 1*4)]
+       msr_s   ICH_AP1R1_EL2, x18
+5:     ldr     w17, [x3, #VGIC_V3_CPU_AP1R]
+       msr_s   ICH_AP1R0_EL2, x17
+
+       tbnz    w21, #29, 6f    // 6 bits
+       tbz     w21, #30, 5f    // 5 bits
+                               // 7 bits
+       ldr     w20, [x3, #(VGIC_V3_CPU_AP0R + 3*4)]
+       msr_s   ICH_AP0R3_EL2, x20
+       ldr     w19, [x3, #(VGIC_V3_CPU_AP0R + 2*4)]
+       msr_s   ICH_AP0R2_EL2, x19
+6:     ldr     w18, [x3, #(VGIC_V3_CPU_AP0R + 1*4)]
+       msr_s   ICH_AP0R1_EL2, x18
+5:     ldr     w17, [x3, #VGIC_V3_CPU_AP0R]
+       msr_s   ICH_AP0R0_EL2, x17
+
+       and     w22, w21, #0xf
+       mvn     w22, w21
+       ubfiz   w23, w22, 2, 4  // w23 = (15 - ListRegs) * 4
+
+       adr     x24, 1f
+       add     x24, x24, x23
+       br      x24
+
+1:
+       ldr     x20, [x3, #LR_OFFSET(15)]
+       ldr     x19, [x3, #LR_OFFSET(14)]
+       ldr     x18, [x3, #LR_OFFSET(13)]
+       ldr     x17, [x3, #LR_OFFSET(12)]
+       ldr     x16, [x3, #LR_OFFSET(11)]
+       ldr     x15, [x3, #LR_OFFSET(10)]
+       ldr     x14, [x3, #LR_OFFSET(9)]
+       ldr     x13, [x3, #LR_OFFSET(8)]
+       ldr     x12, [x3, #LR_OFFSET(7)]
+       ldr     x11, [x3, #LR_OFFSET(6)]
+       ldr     x10, [x3, #LR_OFFSET(5)]
+       ldr     x9, [x3, #LR_OFFSET(4)]
+       ldr     x8, [x3, #LR_OFFSET(3)]
+       ldr     x7, [x3, #LR_OFFSET(2)]
+       ldr     x6, [x3, #LR_OFFSET(1)]
+       ldr     x5, [x3, #LR_OFFSET(0)]
+
+       adr     x24, 1f
+       add     x24, x24, x23
+       br      x24
+
+1:
+       msr_s   ICH_LR15_EL2, x20
+       msr_s   ICH_LR14_EL2, x19
+       msr_s   ICH_LR13_EL2, x18
+       msr_s   ICH_LR12_EL2, x17
+       msr_s   ICH_LR11_EL2, x16
+       msr_s   ICH_LR10_EL2, x15
+       msr_s   ICH_LR9_EL2,  x14
+       msr_s   ICH_LR8_EL2,  x13
+       msr_s   ICH_LR7_EL2,  x12
+       msr_s   ICH_LR6_EL2,  x11
+       msr_s   ICH_LR5_EL2,  x10
+       msr_s   ICH_LR4_EL2,   x9
+       msr_s   ICH_LR3_EL2,   x8
+       msr_s   ICH_LR2_EL2,   x7
+       msr_s   ICH_LR1_EL2,   x6
+       msr_s   ICH_LR0_EL2,   x5
+
+       // Ensure that the above will have reached the
+       // (re)distributors. This ensure the guest will read
+       // the correct values from the memory-mapped interface.
+       isb
+       dsb     sy
+
+       // Prevent the guest from touching the GIC system registers
+       mrs_s   x5, ICC_SRE_EL2
+       and     x5, x5, #~ICC_SRE_EL2_ENABLE
+       msr_s   ICC_SRE_EL2, x5
+.endm
+
+ENTRY(__save_vgic_v3_state)
+       save_vgic_v3_state
+       ret
+ENDPROC(__save_vgic_v3_state)
+
+ENTRY(__restore_vgic_v3_state)
+       restore_vgic_v3_state
+       ret
+ENDPROC(__restore_vgic_v3_state)
+
+ENTRY(__vgic_v3_get_ich_vtr_el2)
+       mrs_s   x0, ICH_VTR_EL2
+       ret
+ENDPROC(__vgic_v3_get_ich_vtr_el2)
+
+       .popsection
index 1ba09e4c02b14d08c1bc0211866e43c1aec5735f..91146b416cdba5b5d76946db679849b649545742 100644 (file)
@@ -17,6 +17,8 @@
 #include <linux/types.h>
 #include <linux/fb.h>
 #include <linux/leds.h>
+#include <linux/pwm.h>
+#include <linux/leds_pwm.h>
 #include <linux/input.h>
 #include <linux/gpio_keys.h>
 #include <linux/atmel_serial.h>
@@ -155,21 +157,28 @@ static struct platform_device rmt_ts_device = {
 
 #ifdef CONFIG_BOARD_MRMT_BL_PWM
 /* PWM LEDs: LCD Backlight, etc */
-static struct gpio_led rmt_pwm_led[] = {
-       /* here the "gpio" is actually a PWM channel */
-       { .name = "backlight",  .gpio = PWM_CH_BL, },
+static struct pwm_lookup pwm_lookup[] = {
+       PWM_LOOKUP("at91sam9rl-pwm", PWM_CH_BL, "leds_pwm", "ds1",
+                  5000, PWM_POLARITY_INVERSED),
 };
 
-static struct gpio_led_platform_data rmt_pwm_led_data = {
-       .num_leds       = ARRAY_SIZE(rmt_pwm_led),
-       .leds           = rmt_pwm_led,
+static struct led_pwm pwm_leds[] = {
+       {
+               .name = "backlight",
+               .max_brightness = 255,
+       },
+};
+
+static struct led_pwm_platform_data pwm_data = {
+       .num_leds       = ARRAY_SIZE(pwm_leds),
+       .leds           = pwm_leds,
 };
 
-static struct platform_device rmt_pwm_led_dev = {
-       .name           = "leds-atmel-pwm",
-       .id             = -1,
-       .dev            = {
-               .platform_data  = &rmt_pwm_led_data,
+static struct platform_device leds_pwm = {
+       .name   = "leds_pwm",
+       .id     = -1,
+       .dev    = {
+               .platform_data = &pwm_data,
        },
 };
 #endif
@@ -325,7 +334,8 @@ static int __init mrmt1_init(void)
 #ifdef CONFIG_BOARD_MRMT_BL_PWM
        /* Use PWM for Backlight controls */
        at32_add_device_pwm(1 << PWM_CH_BL);
-       platform_device_register(&rmt_pwm_led_dev);
+       pwm_add_table(pwm_lookup, ARRAY_SIZE(pwm_lookup));
+       platform_device_register(&leds_pwm);
 #else
        /* Backlight always on */
        udelay( 1 );
index 1f121497b5177c4a3ac30d715dd98a1f623686cd..234cb071c601d67a98c0090fc8699a3066e6f1ce 100644 (file)
 #include <linux/gpio.h>
 #include <linux/leds.h>
 #include <linux/atmel-mci.h>
-#include <linux/atmel-pwm-bl.h>
+#include <linux/pwm.h>
+#include <linux/pwm_backlight.h>
+#include <linux/regulator/fixed.h>
+#include <linux/regulator/machine.h>
 #include <linux/spi/spi.h>
 #include <linux/spi/ads7846.h>
 
@@ -33,6 +36,8 @@
 #include <mach/board.h>
 #include <mach/portmux.h>
 
+#define PWM_BL_CH 2
+
 /* Oscillator frequencies. These are board-specific */
 unsigned long at32_board_osc_rates[3] = {
        [0] = 32768,    /* 32.768 kHz on RTC osc */
@@ -227,29 +232,36 @@ void __init favr32_setup_leds(void)
        platform_device_register(&favr32_led_dev);
 }
 
-static struct atmel_pwm_bl_platform_data atmel_pwm_bl_pdata = {
-       .pwm_channel            = 2,
-       .pwm_frequency          = 200000,
-       .pwm_compare_max        = 345,
-       .pwm_duty_max           = 345,
-       .pwm_duty_min           = 90,
-       .pwm_active_low         = 1,
-       .gpio_on                = GPIO_PIN_PA(28),
-       .on_active_low          = 0,
+static struct pwm_lookup pwm_lookup[] = {
+       PWM_LOOKUP("at91sam9rl-pwm", PWM_BL_CH, "pwm-backlight.0", NULL,
+                  5000, PWM_POLARITY_INVERSED),
 };
 
-static struct platform_device atmel_pwm_bl_dev = {
-       .name           = "atmel-pwm-bl",
-       .id             = 0,
-       .dev            = {
-               .platform_data = &atmel_pwm_bl_pdata,
+static struct regulator_consumer_supply fixed_power_consumers[] = {
+       REGULATOR_SUPPLY("power", "pwm-backlight.0"),
+};
+
+static struct platform_pwm_backlight_data pwm_bl_data = {
+       .enable_gpio            = GPIO_PIN_PA(28),
+       .max_brightness         = 255,
+       .dft_brightness         = 255,
+       .lth_brightness         = 50,
+};
+
+static struct platform_device pwm_bl_device = {
+       .name = "pwm-backlight",
+       .dev = {
+               .platform_data = &pwm_bl_data,
        },
 };
 
 static void __init favr32_setup_atmel_pwm_bl(void)
 {
-       platform_device_register(&atmel_pwm_bl_dev);
-       at32_select_gpio(atmel_pwm_bl_pdata.gpio_on, 0);
+       pwm_add_table(pwm_lookup, ARRAY_SIZE(pwm_lookup));
+       regulator_register_always_on(0, "fixed", fixed_power_consumers,
+                                   ARRAY_SIZE(fixed_power_consumers), 3300000);
+       platform_device_register(&pwm_bl_device);
+       at32_select_gpio(pwm_bl_data.enable_gpio, 0);
 }
 
 void __init setup_board(void)
@@ -339,7 +351,7 @@ static int __init favr32_init(void)
 
        set_abdac_rate(at32_add_device_abdac(0, &abdac0_data));
 
-       at32_add_device_pwm(1 << atmel_pwm_bl_pdata.pwm_channel);
+       at32_add_device_pwm(1 << PWM_BL_CH);
        at32_add_device_spi(1, spi1_board_info, ARRAY_SIZE(spi1_board_info));
        at32_add_device_mci(0, &mci0_data);
        at32_add_device_usba(0, NULL);
index ed137e335796e7a7e0cf881c2879037720d4200f..83d896cc2aed7f4ae1f04f2563aa09329c03affa 100644 (file)
@@ -22,6 +22,8 @@
 #include <linux/irq.h>
 #include <linux/fb.h>
 #include <linux/atmel-mci.h>
+#include <linux/pwm.h>
+#include <linux/leds_pwm.h>
 
 #include <asm/io.h>
 #include <asm/setup.h>
@@ -167,24 +169,29 @@ static struct i2c_board_info __initdata i2c_info[] = {
        },
 };
 
-#ifdef CONFIG_LEDS_ATMEL_PWM
-static struct gpio_led stk_pwm_led[] = {
+#if IS_ENABLED(CONFIG_LEDS_PWM)
+static struct pwm_lookup pwm_lookup[] = {
+       PWM_LOOKUP("at91sam9rl-pwm", 0, "leds_pwm", "backlight",
+                  5000, PWM_POLARITY_NORMAL),
+};
+
+static struct led_pwm pwm_leds[] = {
        {
                .name   = "backlight",
-               .gpio   = 0,            /* PWM channel 0 (LCD backlight) */
+               .max_brightness = 255,
        },
 };
 
-static struct gpio_led_platform_data stk_pwm_led_data = {
-       .num_leds       = ARRAY_SIZE(stk_pwm_led),
-       .leds           = stk_pwm_led,
+static struct led_pwm_platform_data pwm_data = {
+       .num_leds       = ARRAY_SIZE(pwm_leds),
+       .leds           = pwm_leds,
 };
 
-static struct platform_device stk_pwm_led_dev = {
-       .name   = "leds-atmel-pwm",
-       .id     = -1,
-       .dev    = {
-               .platform_data  = &stk_pwm_led_data,
+static struct platform_device leds_pwm = {
+       .name   = "leds_pwm",
+       .id     = -1,
+       .dev    = {
+               .platform_data = &pwm_data,
        },
 };
 #endif
@@ -278,9 +285,10 @@ static int __init merisc_init(void)
 
        at32_add_device_mci(0, &mci0_data);
 
-#ifdef CONFIG_LEDS_ATMEL_PWM
+#if IS_ENABLED(CONFIG_LEDS_PWM)
+       pwm_add_table(pwm_lookup, ARRAY_SIZE(pwm_lookup));
        at32_add_device_pwm((1 << 0) | (1 << 2));
-       platform_device_register(&stk_pwm_led_dev);
+       platform_device_register(&leds_pwm);
 #else
        at32_add_device_pwm((1 << 2));
 #endif
index 9a57da44eb6fd3390a5df2ce4d905bec1ec88c79..6838781e966fea5e91105805a9f7571ece120dd7 100644 (file)
@@ -56,7 +56,6 @@ CONFIG_MTD_CFI_AMDSTD=y
 CONFIG_MTD_PHYSMAP=y
 CONFIG_MTD_DATAFLASH=y
 CONFIG_BLK_DEV_LOOP=y
-CONFIG_ATMEL_PWM=y
 CONFIG_NETDEVICES=y
 CONFIG_NET_ETHERNET=y
 CONFIG_MACB=y
@@ -104,8 +103,8 @@ CONFIG_MMC=y
 CONFIG_MMC_ATMELMCI=y
 CONFIG_NEW_LEDS=y
 CONFIG_LEDS_CLASS=y
-CONFIG_LEDS_ATMEL_PWM=y
 CONFIG_LEDS_GPIO=y
+CONFIG_LEDS_PWM=y
 CONFIG_LEDS_TRIGGERS=y
 CONFIG_LEDS_TRIGGER_TIMER=y
 CONFIG_LEDS_TRIGGER_HEARTBEAT=y
@@ -114,6 +113,8 @@ CONFIG_RTC_DRV_S35390A=m
 CONFIG_RTC_DRV_AT32AP700X=m
 CONFIG_DMADEVICES=y
 CONFIG_UIO=y
+CONFIG_PWM=y
+CONFIG_PWM_ATMEL=y
 CONFIG_EXT2_FS=y
 CONFIG_EXT2_FS_XATTR=y
 CONFIG_EXT3_FS=y
index 2813dd2b913876b0604c31751204b16ac6eb12fe..b056820eef33f67f295c82cc9b485cd8d40ed57d 100644 (file)
@@ -64,7 +64,6 @@ CONFIG_BLK_DEV_LOOP=m
 CONFIG_BLK_DEV_NBD=m
 CONFIG_BLK_DEV_RAM=m
 CONFIG_MISC_DEVICES=y
-CONFIG_ATMEL_PWM=m
 CONFIG_ATMEL_TCLIB=y
 CONFIG_ATMEL_SSC=m
 # CONFIG_SCSI_PROC_FS is not set
@@ -133,14 +132,16 @@ CONFIG_MMC_TEST=m
 CONFIG_MMC_ATMELMCI=y
 CONFIG_NEW_LEDS=y
 CONFIG_LEDS_CLASS=y
-CONFIG_LEDS_ATMEL_PWM=m
 CONFIG_LEDS_GPIO=m
+CONFIG_LEDS_PWM=m
 CONFIG_LEDS_TRIGGERS=y
 CONFIG_LEDS_TRIGGER_TIMER=m
 CONFIG_LEDS_TRIGGER_HEARTBEAT=m
 CONFIG_RTC_CLASS=y
 CONFIG_RTC_DRV_AT32AP700X=y
 CONFIG_DMADEVICES=y
+CONFIG_PWM=y
+CONFIG_PWM_ATMEL=m
 CONFIG_EXT2_FS=y
 CONFIG_EXT3_FS=y
 # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
index f8ff3a3baad4cc702ed4b374b95c21c943b0a84f..0cd23a303da11a8c405c047b05365c5e93ea5fe2 100644 (file)
@@ -53,7 +53,6 @@ CONFIG_BLK_DEV_LOOP=m
 CONFIG_BLK_DEV_NBD=m
 CONFIG_BLK_DEV_RAM=m
 CONFIG_MISC_DEVICES=y
-CONFIG_ATMEL_PWM=m
 CONFIG_ATMEL_TCLIB=y
 CONFIG_ATMEL_SSC=m
 # CONFIG_SCSI_PROC_FS is not set
@@ -112,14 +111,16 @@ CONFIG_MMC_TEST=m
 CONFIG_MMC_ATMELMCI=y
 CONFIG_NEW_LEDS=y
 CONFIG_LEDS_CLASS=y
-CONFIG_LEDS_ATMEL_PWM=m
 CONFIG_LEDS_GPIO=m
+CONFIG_LEDS_PWM=m
 CONFIG_LEDS_TRIGGERS=y
 CONFIG_LEDS_TRIGGER_TIMER=m
 CONFIG_LEDS_TRIGGER_HEARTBEAT=m
 CONFIG_RTC_CLASS=y
 CONFIG_RTC_DRV_AT32AP700X=y
 CONFIG_DMADEVICES=y
+CONFIG_PWM=y
+CONFIG_PWM_ATMEL=m
 CONFIG_EXT2_FS=y
 CONFIG_EXT3_FS=y
 # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
index 992228e54e38cf56dc0cc1567c129d5ec907543b..ac1041f5f85a026ef8a35fcd04553829d8a8b444 100644 (file)
@@ -53,7 +53,6 @@ CONFIG_BLK_DEV_LOOP=m
 CONFIG_BLK_DEV_NBD=m
 CONFIG_BLK_DEV_RAM=m
 CONFIG_MISC_DEVICES=y
-CONFIG_ATMEL_PWM=m
 CONFIG_ATMEL_TCLIB=y
 CONFIG_ATMEL_SSC=m
 # CONFIG_SCSI_PROC_FS is not set
@@ -111,14 +110,16 @@ CONFIG_MMC_TEST=m
 CONFIG_MMC_ATMELMCI=y
 CONFIG_NEW_LEDS=y
 CONFIG_LEDS_CLASS=y
-CONFIG_LEDS_ATMEL_PWM=m
 CONFIG_LEDS_GPIO=m
+CONFIG_LEDS_PWM=m
 CONFIG_LEDS_TRIGGERS=y
 CONFIG_LEDS_TRIGGER_TIMER=m
 CONFIG_LEDS_TRIGGER_HEARTBEAT=m
 CONFIG_RTC_CLASS=y
 CONFIG_RTC_DRV_AT32AP700X=y
 CONFIG_DMADEVICES=y
+CONFIG_PWM=y
+CONFIG_PWM_ATMEL=m
 CONFIG_EXT2_FS=y
 CONFIG_EXT3_FS=y
 # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
index b8e698b0d1fa30e2563fff8e9a0792a36b8ec3a1..ea4f670cb9954c1603f28eefd404b04fdfb70d6d 100644 (file)
@@ -67,7 +67,6 @@ CONFIG_BLK_DEV_LOOP=m
 CONFIG_BLK_DEV_NBD=m
 CONFIG_BLK_DEV_RAM=m
 CONFIG_MISC_DEVICES=y
-CONFIG_ATMEL_PWM=m
 CONFIG_ATMEL_TCLIB=y
 CONFIG_ATMEL_SSC=m
 # CONFIG_SCSI_PROC_FS is not set
@@ -136,14 +135,16 @@ CONFIG_MMC_TEST=m
 CONFIG_MMC_ATMELMCI=y
 CONFIG_NEW_LEDS=y
 CONFIG_LEDS_CLASS=y
-CONFIG_LEDS_ATMEL_PWM=m
 CONFIG_LEDS_GPIO=m
+CONFIG_LEDS_PWM=m
 CONFIG_LEDS_TRIGGERS=y
 CONFIG_LEDS_TRIGGER_TIMER=m
 CONFIG_LEDS_TRIGGER_HEARTBEAT=m
 CONFIG_RTC_CLASS=y
 CONFIG_RTC_DRV_AT32AP700X=y
 CONFIG_DMADEVICES=y
+CONFIG_PWM=y
+CONFIG_PWM_ATMEL=m
 CONFIG_EXT2_FS=y
 CONFIG_EXT3_FS=y
 # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
index 07bed3f7eb5e6022372ed35b6a8e303356cbbc8a..b3eb67dc05ac71f7f3538f28dab4cfafc3305985 100644 (file)
@@ -67,7 +67,6 @@ CONFIG_MTD_PHYSMAP=y
 CONFIG_BLK_DEV_LOOP=m
 CONFIG_BLK_DEV_NBD=m
 CONFIG_BLK_DEV_RAM=m
-CONFIG_ATMEL_PWM=m
 CONFIG_ATMEL_TCLIB=y
 CONFIG_ATMEL_SSC=m
 CONFIG_NETDEVICES=y
@@ -108,7 +107,7 @@ CONFIG_FB=y
 CONFIG_FB_ATMEL=y
 CONFIG_BACKLIGHT_LCD_SUPPORT=y
 # CONFIG_LCD_CLASS_DEVICE is not set
-CONFIG_BACKLIGHT_ATMEL_PWM=m
+CONFIG_BACKLIGHT_PWM=m
 CONFIG_SOUND=m
 CONFIG_SOUND_PRIME=m
 # CONFIG_HID_SUPPORT is not set
@@ -123,7 +122,6 @@ CONFIG_MMC=y
 CONFIG_MMC_ATMELMCI=y
 CONFIG_NEW_LEDS=y
 CONFIG_LEDS_CLASS=y
-CONFIG_LEDS_ATMEL_PWM=m
 CONFIG_LEDS_GPIO=y
 CONFIG_LEDS_TRIGGERS=y
 CONFIG_LEDS_TRIGGER_TIMER=y
@@ -132,6 +130,8 @@ CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
 CONFIG_RTC_CLASS=y
 CONFIG_RTC_DRV_AT32AP700X=y
 CONFIG_DMADEVICES=y
+CONFIG_PWM=y
+CONFIG_PWM_ATMEL=y
 CONFIG_EXT2_FS=y
 CONFIG_EXT3_FS=y
 # CONFIG_EXT3_FS_XATTR is not set
index 91df6b2986be2a1691449bfe47953715e387060d..b9ef4cc85d08eb5887999e809af6480eea39af9b 100644 (file)
@@ -55,7 +55,6 @@ CONFIG_MTD_ABSENT=y
 CONFIG_MTD_PHYSMAP=y
 CONFIG_MTD_BLOCK2MTD=y
 CONFIG_BLK_DEV_LOOP=y
-CONFIG_ATMEL_PWM=y
 CONFIG_ATMEL_SSC=y
 CONFIG_SCSI=y
 CONFIG_BLK_DEV_SD=y
@@ -103,12 +102,14 @@ CONFIG_MMC=y
 CONFIG_MMC_ATMELMCI=y
 CONFIG_NEW_LEDS=y
 CONFIG_LEDS_CLASS=y
-CONFIG_LEDS_ATMEL_PWM=y
+CONFIG_LEDS_PWM=y
 CONFIG_RTC_CLASS=y
 # CONFIG_RTC_HCTOSYS is not set
 CONFIG_RTC_DRV_PCF8563=y
 CONFIG_DMADEVICES=y
 CONFIG_UIO=y
+CONFIG_PWM=y
+CONFIG_PWM_ATMEL=m
 CONFIG_EXT2_FS=y
 # CONFIG_DNOTIFY is not set
 CONFIG_FUSE_FS=y
index a1f4d1e91b522e03f486b41759a1b25a2d44e36f..db85b5ec3351bb5b937c06f0a32153aa2be31592 100644 (file)
@@ -1553,7 +1553,7 @@ static struct resource atmel_pwm0_resource[] __initdata = {
        IRQ(24),
 };
 static struct clk atmel_pwm0_mck = {
-       .name           = "pwm_clk",
+       .name           = "at91sam9rl-pwm",
        .parent         = &pbb_clk,
        .mode           = pbb_clk_mode,
        .get_rate       = pbb_clk_get_rate,
@@ -1568,7 +1568,7 @@ struct platform_device *__init at32_add_device_pwm(u32 mask)
        if (!mask)
                return NULL;
 
-       pdev = platform_device_alloc("atmel_pwm", 0);
+       pdev = platform_device_alloc("at91sam9rl-pwm", 0);
        if (!pdev)
                return NULL;
 
@@ -1576,9 +1576,6 @@ struct platform_device *__init at32_add_device_pwm(u32 mask)
                                ARRAY_SIZE(atmel_pwm0_resource)))
                goto out_free_pdev;
 
-       if (platform_device_add_data(pdev, &mask, sizeof(mask)))
-               goto out_free_pdev;
-
        pin_mask = 0;
        if (mask & (1 << 0))
                pin_mask |= (1 << 28);
index 990b86420cc64638b542b95dd6a9059ba8cd37f9..3d50ea955c4cf435674ced40d0ee98f33a6b2d96 100644 (file)
@@ -25,6 +25,7 @@ config KVM
        select PREEMPT_NOTIFIERS
        select ANON_INODES
        select HAVE_KVM_IRQCHIP
+       select HAVE_KVM_IRQFD
        select HAVE_KVM_IRQ_ROUTING
        select KVM_APIC_ARCHITECTURE
        select KVM_MMIO
index 6a4309bb821af9882d5169eeacee8638e5376bbb..0729ba6acddf11eeb948aef9b2a0bb3135f3ab67 100644 (file)
@@ -190,7 +190,7 @@ void kvm_arch_check_processor_compat(void *rtn)
        *(int *)rtn = 0;
 }
 
-int kvm_dev_ioctl_check_extension(long ext)
+int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
 {
 
        int r;
index 4fda672cb58ed5eb4eb71760aca94b51c660a7c9..cd7114147ae777f9a5bf7063acfd0cbd388cd944 100644 (file)
@@ -886,7 +886,7 @@ int kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf)
        return VM_FAULT_SIGBUS;
 }
 
-int kvm_dev_ioctl_check_extension(long ext)
+int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
 {
        int r;
 
index 35d16bd2760b745d1fa6c8d97093a8eb4a381b3e..ec2e40f2cc117c083b545129a25b634d25ec10e6 100644 (file)
@@ -202,9 +202,7 @@ config PPC_EARLY_DEBUG_BEAT
 
 config PPC_EARLY_DEBUG_44x
        bool "Early serial debugging for IBM/AMCC 44x CPUs"
-       # PPC_EARLY_DEBUG on 440 leaves AS=1 mappings above the TLB high water
-       # mark, which doesn't work with current 440 KVM.
-       depends on 44x && !KVM
+       depends on 44x
        help
          Select this to enable early debugging for IBM 44x chips via the
          inbuilt serial port.  If you enable this, ensure you set
index ccf66b9060a6036ce9eb6e6fd835d97ca1730c7a..924e10df18444b5fcedaeb47018f25d8a6a41ee5 100644 (file)
@@ -127,4 +127,3 @@ CONFIG_CRYPTO_PCBC=y
 # CONFIG_CRYPTO_ANSI_CPRNG is not set
 # CONFIG_CRYPTO_HW is not set
 CONFIG_VIRTUALIZATION=y
-CONFIG_KVM_440=y
index 4b237aa35660ffae9a8b5506fdba78cd58281a2e..21be8ae8f809747302debb8d2b8f9ae974e69613 100644 (file)
 #define PPC_MIN_STKFRM 112
 
 #ifdef __BIG_ENDIAN__
+#define LWZX_BE        stringify_in_c(lwzx)
 #define LDX_BE stringify_in_c(ldx)
+#define STWX_BE        stringify_in_c(stwx)
 #define STDX_BE        stringify_in_c(stdx)
 #else
+#define LWZX_BE        stringify_in_c(lwbrx)
 #define LDX_BE stringify_in_c(ldbrx)
+#define STWX_BE        stringify_in_c(stwbrx)
 #define STDX_BE        stringify_in_c(stdbrx)
 #endif
 
index ed0afc1e44a43324a31fb59994b42a768ecb8e33..34a05a1a990bb1337e36a1161d805dcc63efaef3 100644 (file)
@@ -3,6 +3,7 @@
 
 #ifdef __KERNEL__
 
+#include <asm/reg.h>
 
 /* bytes per L1 cache line */
 #if defined(CONFIG_8xx) || defined(CONFIG_403GCX)
@@ -39,6 +40,12 @@ struct ppc64_caches {
 };
 
 extern struct ppc64_caches ppc64_caches;
+
+static inline void logmpp(u64 x)
+{
+       asm volatile(PPC_LOGMPP(R1) : : "r" (x));
+}
+
 #endif /* __powerpc64__ && ! __ASSEMBLY__ */
 
 #if defined(__ASSEMBLY__)
index 5dbbb29f5c3e554632dd4d361a96fd4a6051a012..85bc8c0d257b700888c3a9700a5dee3ccdd66bc4 100644 (file)
 #define H_GET_24X7_DATA                0xF07C
 #define H_GET_PERF_COUNTER_INFO        0xF080
 
+/* Values for 2nd argument to H_SET_MODE */
+#define H_SET_MODE_RESOURCE_SET_CIABR          1
+#define H_SET_MODE_RESOURCE_SET_DAWR           2
+#define H_SET_MODE_RESOURCE_ADDR_TRANS_MODE    3
+#define H_SET_MODE_RESOURCE_LE                 4
+
 #ifndef __ASSEMBLY__
 
 /**
diff --git a/arch/powerpc/include/asm/kvm_44x.h b/arch/powerpc/include/asm/kvm_44x.h
deleted file mode 100644 (file)
index a0e5761..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 2, as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- *
- * Copyright IBM Corp. 2008
- *
- * Authors: Hollis Blanchard <hollisb@us.ibm.com>
- */
-
-#ifndef __ASM_44X_H__
-#define __ASM_44X_H__
-
-#include <linux/kvm_host.h>
-
-#define PPC44x_TLB_SIZE 64
-
-/* If the guest is expecting it, this can be as large as we like; we'd just
- * need to find some way of advertising it. */
-#define KVM44x_GUEST_TLB_SIZE 64
-
-struct kvmppc_44x_tlbe {
-       u32 tid; /* Only the low 8 bits are used. */
-       u32 word0;
-       u32 word1;
-       u32 word2;
-};
-
-struct kvmppc_44x_shadow_ref {
-       struct page *page;
-       u16 gtlb_index;
-       u8 writeable;
-       u8 tid;
-};
-
-struct kvmppc_vcpu_44x {
-       /* Unmodified copy of the guest's TLB. */
-       struct kvmppc_44x_tlbe guest_tlb[KVM44x_GUEST_TLB_SIZE];
-
-       /* References to guest pages in the hardware TLB. */
-       struct kvmppc_44x_shadow_ref shadow_refs[PPC44x_TLB_SIZE];
-
-       /* State of the shadow TLB at guest context switch time. */
-       struct kvmppc_44x_tlbe shadow_tlb[PPC44x_TLB_SIZE];
-       u8 shadow_tlb_mod[PPC44x_TLB_SIZE];
-
-       struct kvm_vcpu vcpu;
-};
-
-static inline struct kvmppc_vcpu_44x *to_44x(struct kvm_vcpu *vcpu)
-{
-       return container_of(vcpu, struct kvmppc_vcpu_44x, vcpu);
-}
-
-void kvmppc_44x_tlb_put(struct kvm_vcpu *vcpu);
-void kvmppc_44x_tlb_load(struct kvm_vcpu *vcpu);
-
-#endif /* __ASM_44X_H__ */
index ecf7e133a4f2e9d54298b51672a2491222075532..465dfcb82c92a809be5e13a46f7e1d6d287714c2 100644 (file)
@@ -33,7 +33,6 @@
 /* IVPR must be 64KiB-aligned. */
 #define VCPU_SIZE_ORDER 4
 #define VCPU_SIZE_LOG   (VCPU_SIZE_ORDER + 12)
-#define VCPU_TLB_PGSZ   PPC44x_TLB_64K
 #define VCPU_SIZE_BYTES (1<<VCPU_SIZE_LOG)
 
 #define BOOKE_INTERRUPT_CRITICAL 0
 #define BOOK3S_HFLAG_NATIVE_PS                 0x8
 #define BOOK3S_HFLAG_MULTI_PGSIZE              0x10
 #define BOOK3S_HFLAG_NEW_TLBIE                 0x20
+#define BOOK3S_HFLAG_SPLIT_HACK                        0x40
 
 #define RESUME_FLAG_NV          (1<<0)  /* Reload guest nonvolatile state? */
 #define RESUME_FLAG_HOST        (1<<1)  /* Resume host? */
index f52f65694527ea7b42ceb1df485039fc9abba623..6acf0c2a0f99cf82474fbf0b2798700b6984bfff 100644 (file)
@@ -83,8 +83,6 @@ struct kvmppc_vcpu_book3s {
        u64 sdr1;
        u64 hior;
        u64 msr_mask;
-       u64 purr_offset;
-       u64 spurr_offset;
 #ifdef CONFIG_PPC_BOOK3S_32
        u32 vsid_pool[VSID_POOL_SIZE];
        u32 vsid_next;
@@ -148,9 +146,10 @@ extern void kvmppc_mmu_invalidate_pte(struct kvm_vcpu *vcpu, struct hpte_cache *
 extern int kvmppc_mmu_hpte_sysinit(void);
 extern void kvmppc_mmu_hpte_sysexit(void);
 extern int kvmppc_mmu_hv_init(void);
+extern int kvmppc_book3s_hcall_implemented(struct kvm *kvm, unsigned long hc);
 
+/* XXX remove this export when load_last_inst() is generic */
 extern int kvmppc_ld(struct kvm_vcpu *vcpu, ulong *eaddr, int size, void *ptr, bool data);
-extern int kvmppc_st(struct kvm_vcpu *vcpu, ulong *eaddr, int size, void *ptr, bool data);
 extern void kvmppc_book3s_queue_irqprio(struct kvm_vcpu *vcpu, unsigned int vec);
 extern void kvmppc_book3s_dequeue_irqprio(struct kvm_vcpu *vcpu,
                                          unsigned int vec);
@@ -159,13 +158,13 @@ extern void kvmppc_set_bat(struct kvm_vcpu *vcpu, struct kvmppc_bat *bat,
                           bool upper, u32 val);
 extern void kvmppc_giveup_ext(struct kvm_vcpu *vcpu, ulong msr);
 extern int kvmppc_emulate_paired_single(struct kvm_run *run, struct kvm_vcpu *vcpu);
-extern pfn_t kvmppc_gfn_to_pfn(struct kvm_vcpu *vcpu, gfn_t gfn, bool writing,
+extern pfn_t kvmppc_gpa_to_pfn(struct kvm_vcpu *vcpu, gpa_t gpa, bool writing,
                        bool *writable);
 extern void kvmppc_add_revmap_chain(struct kvm *kvm, struct revmap_entry *rev,
                        unsigned long *rmap, long pte_index, int realmode);
-extern void kvmppc_invalidate_hpte(struct kvm *kvm, unsigned long *hptep,
+extern void kvmppc_invalidate_hpte(struct kvm *kvm, __be64 *hptep,
                        unsigned long pte_index);
-void kvmppc_clear_ref_hpte(struct kvm *kvm, unsigned long *hptep,
+void kvmppc_clear_ref_hpte(struct kvm *kvm, __be64 *hptep,
                        unsigned long pte_index);
 extern void *kvmppc_pin_guest_page(struct kvm *kvm, unsigned long addr,
                        unsigned long *nb_ret);
@@ -183,12 +182,16 @@ extern long kvmppc_hv_get_dirty_log(struct kvm *kvm,
                        struct kvm_memory_slot *memslot, unsigned long *map);
 extern void kvmppc_update_lpcr(struct kvm *kvm, unsigned long lpcr,
                        unsigned long mask);
+extern void kvmppc_set_fscr(struct kvm_vcpu *vcpu, u64 fscr);
 
 extern void kvmppc_entry_trampoline(void);
 extern void kvmppc_hv_entry_trampoline(void);
 extern u32 kvmppc_alignment_dsisr(struct kvm_vcpu *vcpu, unsigned int inst);
 extern ulong kvmppc_alignment_dar(struct kvm_vcpu *vcpu, unsigned int inst);
 extern int kvmppc_h_pr(struct kvm_vcpu *vcpu, unsigned long cmd);
+extern void kvmppc_pr_init_default_hcalls(struct kvm *kvm);
+extern int kvmppc_hcall_impl_pr(unsigned long cmd);
+extern int kvmppc_hcall_impl_hv_realmode(unsigned long cmd);
 extern void kvmppc_copy_to_svcpu(struct kvmppc_book3s_shadow_vcpu *svcpu,
                                 struct kvm_vcpu *vcpu);
 extern void kvmppc_copy_from_svcpu(struct kvm_vcpu *vcpu,
@@ -274,32 +277,6 @@ static inline bool kvmppc_need_byteswap(struct kvm_vcpu *vcpu)
        return (kvmppc_get_msr(vcpu) & MSR_LE) != (MSR_KERNEL & MSR_LE);
 }
 
-static inline u32 kvmppc_get_last_inst_internal(struct kvm_vcpu *vcpu, ulong pc)
-{
-       /* Load the instruction manually if it failed to do so in the
-        * exit path */
-       if (vcpu->arch.last_inst == KVM_INST_FETCH_FAILED)
-               kvmppc_ld(vcpu, &pc, sizeof(u32), &vcpu->arch.last_inst, false);
-
-       return kvmppc_need_byteswap(vcpu) ? swab32(vcpu->arch.last_inst) :
-               vcpu->arch.last_inst;
-}
-
-static inline u32 kvmppc_get_last_inst(struct kvm_vcpu *vcpu)
-{
-       return kvmppc_get_last_inst_internal(vcpu, kvmppc_get_pc(vcpu));
-}
-
-/*
- * Like kvmppc_get_last_inst(), but for fetching a sc instruction.
- * Because the sc instruction sets SRR0 to point to the following
- * instruction, we have to fetch from pc - 4.
- */
-static inline u32 kvmppc_get_last_sc(struct kvm_vcpu *vcpu)
-{
-       return kvmppc_get_last_inst_internal(vcpu, kvmppc_get_pc(vcpu) - 4);
-}
-
 static inline ulong kvmppc_get_fault_dar(struct kvm_vcpu *vcpu)
 {
        return vcpu->arch.fault_dar;
@@ -310,6 +287,13 @@ static inline bool is_kvmppc_resume_guest(int r)
        return (r == RESUME_GUEST || r == RESUME_GUEST_NV);
 }
 
+static inline bool is_kvmppc_hv_enabled(struct kvm *kvm);
+static inline bool kvmppc_supports_magic_page(struct kvm_vcpu *vcpu)
+{
+       /* Only PR KVM supports the magic page */
+       return !is_kvmppc_hv_enabled(vcpu->kvm);
+}
+
 /* Magic register values loaded into r3 and r4 before the 'sc' assembly
  * instruction for the OSI hypercalls */
 #define OSI_SC_MAGIC_R3                        0x113724FA
@@ -322,4 +306,7 @@ static inline bool is_kvmppc_resume_guest(int r)
 /* LPIDs we support with this build -- runtime limit may be lower */
 #define KVMPPC_NR_LPIDS                        (LPID_RSVD + 1)
 
+#define SPLIT_HACK_MASK                        0xff000000
+#define SPLIT_HACK_OFFS                        0xfb000000
+
 #endif /* __ASM_KVM_BOOK3S_H__ */
index d645428a65a411c187768bd296cc725e09fc2da6..0aa817933e6a5c1fccdd790ab33d1668a2577ceb 100644 (file)
@@ -59,20 +59,29 @@ extern unsigned long kvm_rma_pages;
 /* These bits are reserved in the guest view of the HPTE */
 #define HPTE_GR_RESERVED       HPTE_GR_MODIFIED
 
-static inline long try_lock_hpte(unsigned long *hpte, unsigned long bits)
+static inline long try_lock_hpte(__be64 *hpte, unsigned long bits)
 {
        unsigned long tmp, old;
+       __be64 be_lockbit, be_bits;
+
+       /*
+        * We load/store in native endian, but the HTAB is in big endian. If
+        * we byte swap all data we apply on the PTE we're implicitly correct
+        * again.
+        */
+       be_lockbit = cpu_to_be64(HPTE_V_HVLOCK);
+       be_bits = cpu_to_be64(bits);
 
        asm volatile("  ldarx   %0,0,%2\n"
                     "  and.    %1,%0,%3\n"
                     "  bne     2f\n"
-                    "  ori     %0,%0,%4\n"
+                    "  or      %0,%0,%4\n"
                     "  stdcx.  %0,0,%2\n"
                     "  beq+    2f\n"
                     "  mr      %1,%3\n"
                     "2:        isync"
                     : "=&r" (tmp), "=&r" (old)
-                    : "r" (hpte), "r" (bits), "i" (HPTE_V_HVLOCK)
+                    : "r" (hpte), "r" (be_bits), "r" (be_lockbit)
                     : "cc", "memory");
        return old == 0;
 }
@@ -110,16 +119,12 @@ static inline int __hpte_actual_psize(unsigned int lp, int psize)
 static inline unsigned long compute_tlbie_rb(unsigned long v, unsigned long r,
                                             unsigned long pte_index)
 {
-       int b_psize, a_psize;
+       int b_psize = MMU_PAGE_4K, a_psize = MMU_PAGE_4K;
        unsigned int penc;
        unsigned long rb = 0, va_low, sllp;
        unsigned int lp = (r >> LP_SHIFT) & ((1 << LP_BITS) - 1);
 
-       if (!(v & HPTE_V_LARGE)) {
-               /* both base and actual psize is 4k */
-               b_psize = MMU_PAGE_4K;
-               a_psize = MMU_PAGE_4K;
-       } else {
+       if (v & HPTE_V_LARGE) {
                for (b_psize = 0; b_psize < MMU_PAGE_COUNT; b_psize++) {
 
                        /* valid entries have a shift value */
@@ -142,6 +147,8 @@ static inline unsigned long compute_tlbie_rb(unsigned long v, unsigned long r,
         */
        /* This covers 14..54 bits of va*/
        rb = (v & ~0x7fUL) << 16;               /* AVA field */
+
+       rb |= v >> (62 - 8);                    /*  B field */
        /*
         * AVA in v had cleared lower 23 bits. We need to derive
         * that from pteg index
@@ -172,10 +179,10 @@ static inline unsigned long compute_tlbie_rb(unsigned long v, unsigned long r,
        {
                int aval_shift;
                /*
-                * remaining 7bits of AVA/LP fields
+                * remaining bits of AVA/LP fields
                 * Also contain the rr bits of LP
                 */
-               rb |= (va_low & 0x7f) << 16;
+               rb |= (va_low << mmu_psize_defs[b_psize].shift) & 0x7ff000;
                /*
                 * Now clear not needed LP bits based on actual psize
                 */
index c7aed6105ff98901fba31e5771ae9b6257107ee6..f7aa5cc395c405d04d68f996e0f7adf81c139703 100644 (file)
@@ -69,11 +69,6 @@ static inline bool kvmppc_need_byteswap(struct kvm_vcpu *vcpu)
        return false;
 }
 
-static inline u32 kvmppc_get_last_inst(struct kvm_vcpu *vcpu)
-{
-       return vcpu->arch.last_inst;
-}
-
 static inline void kvmppc_set_ctr(struct kvm_vcpu *vcpu, ulong val)
 {
        vcpu->arch.ctr = val;
@@ -108,4 +103,14 @@ static inline ulong kvmppc_get_fault_dar(struct kvm_vcpu *vcpu)
 {
        return vcpu->arch.fault_dear;
 }
+
+static inline bool kvmppc_supports_magic_page(struct kvm_vcpu *vcpu)
+{
+       /* Magic page is only supported on e500v2 */
+#ifdef CONFIG_KVM_E500V2
+       return true;
+#else
+       return false;
+#endif
+}
 #endif /* __ASM_KVM_BOOKE_H__ */
index bb66d8b8efdf073fb2a54c39b9d1dd984be713cd..98d9dd50d06321f61b06261e74da2ac22544d9a1 100644 (file)
@@ -34,6 +34,7 @@
 #include <asm/processor.h>
 #include <asm/page.h>
 #include <asm/cacheflush.h>
+#include <asm/hvcall.h>
 
 #define KVM_MAX_VCPUS          NR_CPUS
 #define KVM_MAX_VCORES         NR_CPUS
@@ -48,7 +49,6 @@
 #define KVM_NR_IRQCHIPS          1
 #define KVM_IRQCHIP_NUM_PINS     256
 
-#if !defined(CONFIG_KVM_440)
 #include <linux/mmu_notifier.h>
 
 #define KVM_ARCH_WANT_MMU_NOTIFIER
@@ -61,8 +61,6 @@ extern int kvm_age_hva(struct kvm *kvm, unsigned long hva);
 extern int kvm_test_age_hva(struct kvm *kvm, unsigned long hva);
 extern void kvm_set_spte_hva(struct kvm *kvm, unsigned long hva, pte_t pte);
 
-#endif
-
 #define HPTEG_CACHE_NUM                        (1 << 15)
 #define HPTEG_HASH_BITS_PTE            13
 #define HPTEG_HASH_BITS_PTE_LONG       12
@@ -96,7 +94,6 @@ struct kvm_vm_stat {
 struct kvm_vcpu_stat {
        u32 sum_exits;
        u32 mmio_exits;
-       u32 dcr_exits;
        u32 signal_exits;
        u32 light_exits;
        /* Account for special types of light exits: */
@@ -113,22 +110,21 @@ struct kvm_vcpu_stat {
        u32 halt_wakeup;
        u32 dbell_exits;
        u32 gdbell_exits;
+       u32 ld;
+       u32 st;
 #ifdef CONFIG_PPC_BOOK3S
        u32 pf_storage;
        u32 pf_instruc;
        u32 sp_storage;
        u32 sp_instruc;
        u32 queue_intr;
-       u32 ld;
        u32 ld_slow;
-       u32 st;
        u32 st_slow;
 #endif
 };
 
 enum kvm_exit_types {
        MMIO_EXITS,
-       DCR_EXITS,
        SIGNAL_EXITS,
        ITLB_REAL_MISS_EXITS,
        ITLB_VIRT_MISS_EXITS,
@@ -254,7 +250,6 @@ struct kvm_arch {
        atomic_t hpte_mod_interest;
        spinlock_t slot_phys_lock;
        cpumask_t need_tlb_flush;
-       struct kvmppc_vcore *vcores[KVM_MAX_VCORES];
        int hpt_cma_alloc;
 #endif /* CONFIG_KVM_BOOK3S_HV_POSSIBLE */
 #ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE
@@ -263,6 +258,7 @@ struct kvm_arch {
 #ifdef CONFIG_PPC_BOOK3S_64
        struct list_head spapr_tce_tables;
        struct list_head rtas_tokens;
+       DECLARE_BITMAP(enabled_hcalls, MAX_HCALL_OPCODE/4 + 1);
 #endif
 #ifdef CONFIG_KVM_MPIC
        struct openpic *mpic;
@@ -271,6 +267,10 @@ struct kvm_arch {
        struct kvmppc_xics *xics;
 #endif
        struct kvmppc_ops *kvm_ops;
+#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
+       /* This array can grow quite large, keep it at the end */
+       struct kvmppc_vcore *vcores[KVM_MAX_VCORES];
+#endif
 };
 
 /*
@@ -305,6 +305,8 @@ struct kvmppc_vcore {
        u32 arch_compat;
        ulong pcr;
        ulong dpdes;            /* doorbell state (POWER8) */
+       void *mpp_buffer; /* Micro Partition Prefetch buffer */
+       bool mpp_buffer_is_valid;
 };
 
 #define VCORE_ENTRY_COUNT(vc)  ((vc)->entry_exit_count & 0xff)
@@ -503,8 +505,10 @@ struct kvm_vcpu_arch {
 #ifdef CONFIG_BOOKE
        u32 decar;
 #endif
-       u32 tbl;
-       u32 tbu;
+       /* Time base value when we entered the guest */
+       u64 entry_tb;
+       u64 entry_vtb;
+       u64 entry_ic;
        u32 tcr;
        ulong tsr; /* we need to perform set/clr_bits() which requires ulong */
        u32 ivor[64];
@@ -580,6 +584,8 @@ struct kvm_vcpu_arch {
        u32 mmucfg;
        u32 eptcfg;
        u32 epr;
+       u64 sprg9;
+       u32 pwrmgtcr0;
        u32 crit_save;
        /* guest debug registers*/
        struct debug_reg dbg_reg;
@@ -593,8 +599,6 @@ struct kvm_vcpu_arch {
        u8 io_gpr; /* GPR used as IO source/target */
        u8 mmio_is_bigendian;
        u8 mmio_sign_extend;
-       u8 dcr_needed;
-       u8 dcr_is_write;
        u8 osi_needed;
        u8 osi_enabled;
        u8 papr_enabled;
index 9c89cdd067a643a6a0572042e90f0d77066dc1d4..fb86a2299d8afb9f635b71a92ef2e7345abdedff 100644 (file)
 enum emulation_result {
        EMULATE_DONE,         /* no further processing */
        EMULATE_DO_MMIO,      /* kvm_run filled with MMIO request */
-       EMULATE_DO_DCR,       /* kvm_run filled with DCR request */
        EMULATE_FAIL,         /* can't emulate this instruction */
        EMULATE_AGAIN,        /* something went wrong. go again */
        EMULATE_EXIT_USER,    /* emulation requires exit to user-space */
 };
 
+enum instruction_type {
+       INST_GENERIC,
+       INST_SC,                /* system call */
+};
+
+enum xlate_instdata {
+       XLATE_INST,             /* translate instruction address */
+       XLATE_DATA              /* translate data address */
+};
+
+enum xlate_readwrite {
+       XLATE_READ,             /* check for read permissions */
+       XLATE_WRITE             /* check for write permissions */
+};
+
 extern int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu);
 extern int __kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu);
 extern void kvmppc_handler_highmem(void);
@@ -62,8 +76,16 @@ extern int kvmppc_handle_store(struct kvm_run *run, struct kvm_vcpu *vcpu,
                               u64 val, unsigned int bytes,
                               int is_default_endian);
 
+extern int kvmppc_load_last_inst(struct kvm_vcpu *vcpu,
+                                enum instruction_type type, u32 *inst);
+
+extern int kvmppc_ld(struct kvm_vcpu *vcpu, ulong *eaddr, int size, void *ptr,
+                    bool data);
+extern int kvmppc_st(struct kvm_vcpu *vcpu, ulong *eaddr, int size, void *ptr,
+                    bool data);
 extern int kvmppc_emulate_instruction(struct kvm_run *run,
                                       struct kvm_vcpu *vcpu);
+extern int kvmppc_emulate_loadstore(struct kvm_vcpu *vcpu);
 extern int kvmppc_emulate_mmio(struct kvm_run *run, struct kvm_vcpu *vcpu);
 extern void kvmppc_emulate_dec(struct kvm_vcpu *vcpu);
 extern u32 kvmppc_get_dec(struct kvm_vcpu *vcpu, u64 tb);
@@ -86,6 +108,9 @@ extern gpa_t kvmppc_mmu_xlate(struct kvm_vcpu *vcpu, unsigned int gtlb_index,
                               gva_t eaddr);
 extern void kvmppc_mmu_dtlb_miss(struct kvm_vcpu *vcpu);
 extern void kvmppc_mmu_itlb_miss(struct kvm_vcpu *vcpu);
+extern int kvmppc_xlate(struct kvm_vcpu *vcpu, ulong eaddr,
+                       enum xlate_instdata xlid, enum xlate_readwrite xlrw,
+                       struct kvmppc_pte *pte);
 
 extern struct kvm_vcpu *kvmppc_core_vcpu_create(struct kvm *kvm,
                                                 unsigned int id);
@@ -106,6 +131,14 @@ extern void kvmppc_core_dequeue_dec(struct kvm_vcpu *vcpu);
 extern void kvmppc_core_queue_external(struct kvm_vcpu *vcpu,
                                        struct kvm_interrupt *irq);
 extern void kvmppc_core_dequeue_external(struct kvm_vcpu *vcpu);
+extern void kvmppc_core_queue_dtlb_miss(struct kvm_vcpu *vcpu, ulong dear_flags,
+                                       ulong esr_flags);
+extern void kvmppc_core_queue_data_storage(struct kvm_vcpu *vcpu,
+                                          ulong dear_flags,
+                                          ulong esr_flags);
+extern void kvmppc_core_queue_itlb_miss(struct kvm_vcpu *vcpu);
+extern void kvmppc_core_queue_inst_storage(struct kvm_vcpu *vcpu,
+                                          ulong esr_flags);
 extern void kvmppc_core_flush_tlb(struct kvm_vcpu *vcpu);
 extern int kvmppc_core_check_requests(struct kvm_vcpu *vcpu);
 
@@ -228,12 +261,35 @@ struct kvmppc_ops {
        void (*fast_vcpu_kick)(struct kvm_vcpu *vcpu);
        long (*arch_vm_ioctl)(struct file *filp, unsigned int ioctl,
                              unsigned long arg);
-
+       int (*hcall_implemented)(unsigned long hcall);
 };
 
 extern struct kvmppc_ops *kvmppc_hv_ops;
 extern struct kvmppc_ops *kvmppc_pr_ops;
 
+static inline int kvmppc_get_last_inst(struct kvm_vcpu *vcpu,
+                                       enum instruction_type type, u32 *inst)
+{
+       int ret = EMULATE_DONE;
+       u32 fetched_inst;
+
+       /* Load the instruction manually if it failed to do so in the
+        * exit path */
+       if (vcpu->arch.last_inst == KVM_INST_FETCH_FAILED)
+               ret = kvmppc_load_last_inst(vcpu, type, &vcpu->arch.last_inst);
+
+       /*  Write fetch_failed unswapped if the fetch failed */
+       if (ret == EMULATE_DONE)
+               fetched_inst = kvmppc_need_byteswap(vcpu) ?
+                               swab32(vcpu->arch.last_inst) :
+                               vcpu->arch.last_inst;
+       else
+               fetched_inst = vcpu->arch.last_inst;
+
+       *inst = fetched_inst;
+       return ret;
+}
+
 static inline bool is_kvmppc_hv_enabled(struct kvm *kvm)
 {
        return kvm->arch.kvm_ops == kvmppc_hv_ops;
@@ -392,6 +448,17 @@ static inline int kvmppc_xics_hcall(struct kvm_vcpu *vcpu, u32 cmd)
        { return 0; }
 #endif
 
+static inline unsigned long kvmppc_get_epr(struct kvm_vcpu *vcpu)
+{
+#ifdef CONFIG_KVM_BOOKE_HV
+       return mfspr(SPRN_GEPR);
+#elif defined(CONFIG_BOOKE)
+       return vcpu->arch.epr;
+#else
+       return 0;
+#endif
+}
+
 static inline void kvmppc_set_epr(struct kvm_vcpu *vcpu, u32 epr)
 {
 #ifdef CONFIG_KVM_BOOKE_HV
@@ -472,8 +539,20 @@ static inline bool kvmppc_shared_big_endian(struct kvm_vcpu *vcpu)
 #endif
 }
 
+#define SPRNG_WRAPPER_GET(reg, bookehv_spr)                            \
+static inline ulong kvmppc_get_##reg(struct kvm_vcpu *vcpu)            \
+{                                                                      \
+       return mfspr(bookehv_spr);                                      \
+}                                                                      \
+
+#define SPRNG_WRAPPER_SET(reg, bookehv_spr)                            \
+static inline void kvmppc_set_##reg(struct kvm_vcpu *vcpu, ulong val)  \
+{                                                                      \
+       mtspr(bookehv_spr, val);                                                \
+}                                                                      \
+
 #define SHARED_WRAPPER_GET(reg, size)                                  \
-static inline u##size kvmppc_get_##reg(struct kvm_vcpu *vcpu)  \
+static inline u##size kvmppc_get_##reg(struct kvm_vcpu *vcpu)          \
 {                                                                      \
        if (kvmppc_shared_big_endian(vcpu))                             \
               return be##size##_to_cpu(vcpu->arch.shared->reg);        \
@@ -494,14 +573,31 @@ static inline void kvmppc_set_##reg(struct kvm_vcpu *vcpu, u##size val)   \
        SHARED_WRAPPER_GET(reg, size)                                   \
        SHARED_WRAPPER_SET(reg, size)                                   \
 
+#define SPRNG_WRAPPER(reg, bookehv_spr)                                        \
+       SPRNG_WRAPPER_GET(reg, bookehv_spr)                             \
+       SPRNG_WRAPPER_SET(reg, bookehv_spr)                             \
+
+#ifdef CONFIG_KVM_BOOKE_HV
+
+#define SHARED_SPRNG_WRAPPER(reg, size, bookehv_spr)                   \
+       SPRNG_WRAPPER(reg, bookehv_spr)                                 \
+
+#else
+
+#define SHARED_SPRNG_WRAPPER(reg, size, bookehv_spr)                   \
+       SHARED_WRAPPER(reg, size)                                       \
+
+#endif
+
 SHARED_WRAPPER(critical, 64)
-SHARED_WRAPPER(sprg0, 64)
-SHARED_WRAPPER(sprg1, 64)
-SHARED_WRAPPER(sprg2, 64)
-SHARED_WRAPPER(sprg3, 64)
-SHARED_WRAPPER(srr0, 64)
-SHARED_WRAPPER(srr1, 64)
-SHARED_WRAPPER(dar, 64)
+SHARED_SPRNG_WRAPPER(sprg0, 64, SPRN_GSPRG0)
+SHARED_SPRNG_WRAPPER(sprg1, 64, SPRN_GSPRG1)
+SHARED_SPRNG_WRAPPER(sprg2, 64, SPRN_GSPRG2)
+SHARED_SPRNG_WRAPPER(sprg3, 64, SPRN_GSPRG3)
+SHARED_SPRNG_WRAPPER(srr0, 64, SPRN_GSRR0)
+SHARED_SPRNG_WRAPPER(srr1, 64, SPRN_GSRR1)
+SHARED_SPRNG_WRAPPER(dar, 64, SPRN_GDEAR)
+SHARED_SPRNG_WRAPPER(esr, 64, SPRN_GESR)
 SHARED_WRAPPER_GET(msr, 64)
 static inline void kvmppc_set_msr_fast(struct kvm_vcpu *vcpu, u64 val)
 {
index d0918e09557f95e3d09f4ed41babb7d36f4e7f70..cd4f04a7480299eff334d69eed9229e6544f8276 100644 (file)
 
 /* MAS registers bit definitions */
 
-#define MAS0_TLBSEL(x)         (((x) << 28) & 0x30000000)
+#define MAS0_TLBSEL_MASK       0x30000000
+#define MAS0_TLBSEL_SHIFT      28
+#define MAS0_TLBSEL(x)         (((x) << MAS0_TLBSEL_SHIFT) & MAS0_TLBSEL_MASK)
+#define MAS0_GET_TLBSEL(mas0)  (((mas0) & MAS0_TLBSEL_MASK) >> \
+                       MAS0_TLBSEL_SHIFT)
 #define MAS0_ESEL_MASK         0x0FFF0000
 #define MAS0_ESEL_SHIFT                16
 #define MAS0_ESEL(x)           (((x) << MAS0_ESEL_SHIFT) & MAS0_ESEL_MASK)
@@ -58,6 +62,7 @@
 #define MAS1_TSIZE_MASK                0x00000f80
 #define MAS1_TSIZE_SHIFT       7
 #define MAS1_TSIZE(x)          (((x) << MAS1_TSIZE_SHIFT) & MAS1_TSIZE_MASK)
+#define MAS1_GET_TSIZE(mas1)   (((mas1) & MAS1_TSIZE_MASK) >> MAS1_TSIZE_SHIFT)
 
 #define MAS2_EPN               (~0xFFFUL)
 #define MAS2_X0                        0x00000040
@@ -86,6 +91,7 @@
 #define MAS3_SPSIZE            0x0000003e
 #define MAS3_SPSIZE_SHIFT      1
 
+#define MAS4_TLBSEL_MASK       MAS0_TLBSEL_MASK
 #define MAS4_TLBSELD(x)        MAS0_TLBSEL(x)
 #define MAS4_INDD              0x00008000      /* Default IND */
 #define MAS4_TSIZED(x)         MAS1_TSIZE(x)
index e316dad6ba76ed17c74e3e024b77f77bdfe086a9..6f8536208049f4c8f46708e45b4153927c36658a 100644 (file)
 #define PPC_INST_ISEL                  0x7c00001e
 #define PPC_INST_ISEL_MASK             0xfc00003e
 #define PPC_INST_LDARX                 0x7c0000a8
+#define PPC_INST_LOGMPP                        0x7c0007e4
 #define PPC_INST_LSWI                  0x7c0004aa
 #define PPC_INST_LSWX                  0x7c00042a
 #define PPC_INST_LWARX                 0x7c000028
 #define __PPC_EH(eh)   0
 #endif
 
+/* POWER8 Micro Partition Prefetch (MPP) parameters */
+/* Address mask is common for LOGMPP instruction and MPPR SPR */
+#define PPC_MPPE_ADDRESS_MASK 0xffffffffc000
+
+/* Bits 60 and 61 of MPP SPR should be set to one of the following */
+/* Aborting the fetch is indeed setting 00 in the table size bits */
+#define PPC_MPPR_FETCH_ABORT (0x0ULL << 60)
+#define PPC_MPPR_FETCH_WHOLE_TABLE (0x2ULL << 60)
+
+/* Bits 54 and 55 of register for LOGMPP instruction should be set to: */
+#define PPC_LOGMPP_LOG_L2 (0x02ULL << 54)
+#define PPC_LOGMPP_LOG_L2L3 (0x01ULL << 54)
+#define PPC_LOGMPP_LOG_ABORT (0x03ULL << 54)
+
 /* Deal with instructions that older assemblers aren't aware of */
 #define        PPC_DCBAL(a, b)         stringify_in_c(.long PPC_INST_DCBAL | \
                                        __PPC_RA(a) | __PPC_RB(b))
 #define PPC_LDARX(t, a, b, eh) stringify_in_c(.long PPC_INST_LDARX | \
                                        ___PPC_RT(t) | ___PPC_RA(a) | \
                                        ___PPC_RB(b) | __PPC_EH(eh))
+#define PPC_LOGMPP(b)          stringify_in_c(.long PPC_INST_LOGMPP | \
+                                       __PPC_RB(b))
 #define PPC_LWARX(t, a, b, eh) stringify_in_c(.long PPC_INST_LWARX | \
                                        ___PPC_RT(t) | ___PPC_RA(a) | \
                                        ___PPC_RB(b) | __PPC_EH(eh))
index f7b97b89570872e4729f05368178f582542db238..1c987bf794ef9454e359095a8db012443f913a45 100644 (file)
 #define   CTRL_TE      0x00c00000      /* thread enable */
 #define   CTRL_RUNLATCH        0x1
 #define SPRN_DAWR      0xB4
+#define SPRN_MPPR      0xB8    /* Micro Partition Prefetch Register */
 #define SPRN_RPR       0xBA    /* Relative Priority Register */
 #define SPRN_CIABR     0xBB
 #define   CIABR_PRIV           0x3
  *      readable variant for reads, which can avoid a fault
  *      with KVM type virtualization.
  *
- *      (*) Under KVM, the host SPRG1 is used to point to
- *      the current VCPU data structure
- *
  * 32-bit 8xx:
  *     - SPRG0 scratch for exception vectors
  *     - SPRG1 scratch for exception vectors
                                     : "r" ((unsigned long)(v)) \
                                     : "memory")
 
+static inline unsigned long mfvtb (void)
+{
+#ifdef CONFIG_PPC_BOOK3S_64
+       if (cpu_has_feature(CPU_FTR_ARCH_207S))
+               return mfspr(SPRN_VTB);
+#endif
+       return 0;
+}
+
 #ifdef __powerpc64__
 #if defined(CONFIG_PPC_CELL) || defined(CONFIG_PPC_FSL_BOOK3E)
 #define mftb()         ({unsigned long rval;                           \
index 1d428e6007caa64de18efcd0f5c5291ad53b9f94..03cbada59d3afaff427ca59dab3475426ef16304 100644 (file)
@@ -102,6 +102,15 @@ static inline u64 get_rtc(void)
        return (u64)hi * 1000000000 + lo;
 }
 
+static inline u64 get_vtb(void)
+{
+#ifdef CONFIG_PPC_BOOK3S_64
+       if (cpu_has_feature(CPU_FTR_ARCH_207S))
+               return mfvtb();
+#endif
+       return 0;
+}
+
 #ifdef CONFIG_PPC64
 static inline u64 get_tb(void)
 {
index 2bc4a9409a934e4e7416e5a058191eca9dfe2e72..e0e49dbb145de5d0601aac18099eea223a2e919d 100644 (file)
@@ -548,6 +548,7 @@ struct kvm_get_htab_header {
 
 #define KVM_REG_PPC_VRSAVE     (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0xb4)
 #define KVM_REG_PPC_LPCR       (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0xb5)
+#define KVM_REG_PPC_LPCR_64    (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xb5)
 #define KVM_REG_PPC_PPR                (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xb6)
 
 /* Architecture compatibility level */
@@ -555,6 +556,7 @@ struct kvm_get_htab_header {
 
 #define KVM_REG_PPC_DABRX      (KVM_REG_PPC | KVM_REG_SIZE_U32 | 0xb8)
 #define KVM_REG_PPC_WORT       (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xb9)
+#define KVM_REG_PPC_SPRG9      (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xba)
 
 /* Transactional Memory checkpointed state:
  * This is all GPRs, all VSX regs and a subset of SPRs
index e35054054c326e9c018102c5aefc69f2a99ac131..9d7dede2847cd0618a21e3ca99c4835041efe1df 100644 (file)
@@ -491,6 +491,7 @@ int main(void)
        DEFINE(KVM_HOST_SDR1, offsetof(struct kvm, arch.host_sdr1));
        DEFINE(KVM_TLBIE_LOCK, offsetof(struct kvm, arch.tlbie_lock));
        DEFINE(KVM_NEED_FLUSH, offsetof(struct kvm, arch.need_tlb_flush.bits));
+       DEFINE(KVM_ENABLED_HCALLS, offsetof(struct kvm, arch.enabled_hcalls));
        DEFINE(KVM_LPCR, offsetof(struct kvm, arch.lpcr));
        DEFINE(KVM_RMOR, offsetof(struct kvm, arch.rmor));
        DEFINE(KVM_VRMA_SLB_V, offsetof(struct kvm, arch.vrma_slb_v));
@@ -665,6 +666,7 @@ int main(void)
        DEFINE(VCPU_LR, offsetof(struct kvm_vcpu, arch.lr));
        DEFINE(VCPU_CTR, offsetof(struct kvm_vcpu, arch.ctr));
        DEFINE(VCPU_PC, offsetof(struct kvm_vcpu, arch.pc));
+       DEFINE(VCPU_SPRG9, offsetof(struct kvm_vcpu, arch.sprg9));
        DEFINE(VCPU_LAST_INST, offsetof(struct kvm_vcpu, arch.last_inst));
        DEFINE(VCPU_FAULT_DEAR, offsetof(struct kvm_vcpu, arch.fault_dear));
        DEFINE(VCPU_FAULT_ESR, offsetof(struct kvm_vcpu, arch.fault_esr));
diff --git a/arch/powerpc/kvm/44x.c b/arch/powerpc/kvm/44x.c
deleted file mode 100644 (file)
index 9cb4b0a..0000000
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 2, as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- *
- * Copyright IBM Corp. 2008
- *
- * Authors: Hollis Blanchard <hollisb@us.ibm.com>
- */
-
-#include <linux/kvm_host.h>
-#include <linux/slab.h>
-#include <linux/err.h>
-#include <linux/export.h>
-#include <linux/module.h>
-#include <linux/miscdevice.h>
-
-#include <asm/reg.h>
-#include <asm/cputable.h>
-#include <asm/tlbflush.h>
-#include <asm/kvm_44x.h>
-#include <asm/kvm_ppc.h>
-
-#include "44x_tlb.h"
-#include "booke.h"
-
-static void kvmppc_core_vcpu_load_44x(struct kvm_vcpu *vcpu, int cpu)
-{
-       kvmppc_booke_vcpu_load(vcpu, cpu);
-       kvmppc_44x_tlb_load(vcpu);
-}
-
-static void kvmppc_core_vcpu_put_44x(struct kvm_vcpu *vcpu)
-{
-       kvmppc_44x_tlb_put(vcpu);
-       kvmppc_booke_vcpu_put(vcpu);
-}
-
-int kvmppc_core_check_processor_compat(void)
-{
-       int r;
-
-       if (strncmp(cur_cpu_spec->platform, "ppc440", 6) == 0)
-               r = 0;
-       else
-               r = -ENOTSUPP;
-
-       return r;
-}
-
-int kvmppc_core_vcpu_setup(struct kvm_vcpu *vcpu)
-{
-       struct kvmppc_vcpu_44x *vcpu_44x = to_44x(vcpu);
-       struct kvmppc_44x_tlbe *tlbe = &vcpu_44x->guest_tlb[0];
-       int i;
-
-       tlbe->tid = 0;
-       tlbe->word0 = PPC44x_TLB_16M | PPC44x_TLB_VALID;
-       tlbe->word1 = 0;
-       tlbe->word2 = PPC44x_TLB_SX | PPC44x_TLB_SW | PPC44x_TLB_SR;
-
-       tlbe++;
-       tlbe->tid = 0;
-       tlbe->word0 = 0xef600000 | PPC44x_TLB_4K | PPC44x_TLB_VALID;
-       tlbe->word1 = 0xef600000;
-       tlbe->word2 = PPC44x_TLB_SX | PPC44x_TLB_SW | PPC44x_TLB_SR
-                     | PPC44x_TLB_I | PPC44x_TLB_G;
-
-       /* Since the guest can directly access the timebase, it must know the
-        * real timebase frequency. Accordingly, it must see the state of
-        * CCR1[TCS]. */
-       /* XXX CCR1 doesn't exist on all 440 SoCs. */
-       vcpu->arch.ccr1 = mfspr(SPRN_CCR1);
-
-       for (i = 0; i < ARRAY_SIZE(vcpu_44x->shadow_refs); i++)
-               vcpu_44x->shadow_refs[i].gtlb_index = -1;
-
-       vcpu->arch.cpu_type = KVM_CPU_440;
-       vcpu->arch.pvr = mfspr(SPRN_PVR);
-
-       return 0;
-}
-
-/* 'linear_address' is actually an encoding of AS|PID|EADDR . */
-int kvmppc_core_vcpu_translate(struct kvm_vcpu *vcpu,
-                               struct kvm_translation *tr)
-{
-       int index;
-       gva_t eaddr;
-       u8 pid;
-       u8 as;
-
-       eaddr = tr->linear_address;
-       pid = (tr->linear_address >> 32) & 0xff;
-       as = (tr->linear_address >> 40) & 0x1;
-
-       index = kvmppc_44x_tlb_index(vcpu, eaddr, pid, as);
-       if (index == -1) {
-               tr->valid = 0;
-               return 0;
-       }
-
-       tr->physical_address = kvmppc_mmu_xlate(vcpu, index, eaddr);
-       /* XXX what does "writeable" and "usermode" even mean? */
-       tr->valid = 1;
-
-       return 0;
-}
-
-static int kvmppc_core_get_sregs_44x(struct kvm_vcpu *vcpu,
-                                     struct kvm_sregs *sregs)
-{
-       return kvmppc_get_sregs_ivor(vcpu, sregs);
-}
-
-static int kvmppc_core_set_sregs_44x(struct kvm_vcpu *vcpu,
-                                    struct kvm_sregs *sregs)
-{
-       return kvmppc_set_sregs_ivor(vcpu, sregs);
-}
-
-static int kvmppc_get_one_reg_44x(struct kvm_vcpu *vcpu, u64 id,
-                                 union kvmppc_one_reg *val)
-{
-       return -EINVAL;
-}
-
-static int kvmppc_set_one_reg_44x(struct kvm_vcpu *vcpu, u64 id,
-                                 union kvmppc_one_reg *val)
-{
-       return -EINVAL;
-}
-
-static struct kvm_vcpu *kvmppc_core_vcpu_create_44x(struct kvm *kvm,
-                                                   unsigned int id)
-{
-       struct kvmppc_vcpu_44x *vcpu_44x;
-       struct kvm_vcpu *vcpu;
-       int err;
-
-       vcpu_44x = kmem_cache_zalloc(kvm_vcpu_cache, GFP_KERNEL);
-       if (!vcpu_44x) {
-               err = -ENOMEM;
-               goto out;
-       }
-
-       vcpu = &vcpu_44x->vcpu;
-       err = kvm_vcpu_init(vcpu, kvm, id);
-       if (err)
-               goto free_vcpu;
-
-       vcpu->arch.shared = (void*)__get_free_page(GFP_KERNEL|__GFP_ZERO);
-       if (!vcpu->arch.shared)
-               goto uninit_vcpu;
-
-       return vcpu;
-
-uninit_vcpu:
-       kvm_vcpu_uninit(vcpu);
-free_vcpu:
-       kmem_cache_free(kvm_vcpu_cache, vcpu_44x);
-out:
-       return ERR_PTR(err);
-}
-
-static void kvmppc_core_vcpu_free_44x(struct kvm_vcpu *vcpu)
-{
-       struct kvmppc_vcpu_44x *vcpu_44x = to_44x(vcpu);
-
-       free_page((unsigned long)vcpu->arch.shared);
-       kvm_vcpu_uninit(vcpu);
-       kmem_cache_free(kvm_vcpu_cache, vcpu_44x);
-}
-
-static int kvmppc_core_init_vm_44x(struct kvm *kvm)
-{
-       return 0;
-}
-
-static void kvmppc_core_destroy_vm_44x(struct kvm *kvm)
-{
-}
-
-static struct kvmppc_ops kvm_ops_44x = {
-       .get_sregs = kvmppc_core_get_sregs_44x,
-       .set_sregs = kvmppc_core_set_sregs_44x,
-       .get_one_reg = kvmppc_get_one_reg_44x,
-       .set_one_reg = kvmppc_set_one_reg_44x,
-       .vcpu_load   = kvmppc_core_vcpu_load_44x,
-       .vcpu_put    = kvmppc_core_vcpu_put_44x,
-       .vcpu_create = kvmppc_core_vcpu_create_44x,
-       .vcpu_free   = kvmppc_core_vcpu_free_44x,
-       .mmu_destroy  = kvmppc_mmu_destroy_44x,
-       .init_vm = kvmppc_core_init_vm_44x,
-       .destroy_vm = kvmppc_core_destroy_vm_44x,
-       .emulate_op = kvmppc_core_emulate_op_44x,
-       .emulate_mtspr = kvmppc_core_emulate_mtspr_44x,
-       .emulate_mfspr = kvmppc_core_emulate_mfspr_44x,
-};
-
-static int __init kvmppc_44x_init(void)
-{
-       int r;
-
-       r = kvmppc_booke_init();
-       if (r)
-               goto err_out;
-
-       r = kvm_init(NULL, sizeof(struct kvmppc_vcpu_44x), 0, THIS_MODULE);
-       if (r)
-               goto err_out;
-       kvm_ops_44x.owner = THIS_MODULE;
-       kvmppc_pr_ops = &kvm_ops_44x;
-
-err_out:
-       return r;
-}
-
-static void __exit kvmppc_44x_exit(void)
-{
-       kvmppc_pr_ops = NULL;
-       kvmppc_booke_exit();
-}
-
-module_init(kvmppc_44x_init);
-module_exit(kvmppc_44x_exit);
-MODULE_ALIAS_MISCDEV(KVM_MINOR);
-MODULE_ALIAS("devname:kvm");
diff --git a/arch/powerpc/kvm/44x_emulate.c b/arch/powerpc/kvm/44x_emulate.c
deleted file mode 100644 (file)
index 92c9ab4..0000000
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 2, as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- *
- * Copyright IBM Corp. 2008
- *
- * Authors: Hollis Blanchard <hollisb@us.ibm.com>
- */
-
-#include <asm/kvm_ppc.h>
-#include <asm/dcr.h>
-#include <asm/dcr-regs.h>
-#include <asm/disassemble.h>
-#include <asm/kvm_44x.h>
-#include "timing.h"
-
-#include "booke.h"
-#include "44x_tlb.h"
-
-#define XOP_MFDCRX  259
-#define XOP_MFDCR   323
-#define XOP_MTDCRX  387
-#define XOP_MTDCR   451
-#define XOP_TLBSX   914
-#define XOP_ICCCI   966
-#define XOP_TLBWE   978
-
-static int emulate_mtdcr(struct kvm_vcpu *vcpu, int rs, int dcrn)
-{
-       /* emulate some access in kernel */
-       switch (dcrn) {
-       case DCRN_CPR0_CONFIG_ADDR:
-               vcpu->arch.cpr0_cfgaddr = kvmppc_get_gpr(vcpu, rs);
-               return EMULATE_DONE;
-       default:
-               vcpu->run->dcr.dcrn = dcrn;
-               vcpu->run->dcr.data = kvmppc_get_gpr(vcpu, rs);
-               vcpu->run->dcr.is_write = 1;
-               vcpu->arch.dcr_is_write = 1;
-               vcpu->arch.dcr_needed = 1;
-               kvmppc_account_exit(vcpu, DCR_EXITS);
-               return EMULATE_DO_DCR;
-       }
-}
-
-static int emulate_mfdcr(struct kvm_vcpu *vcpu, int rt, int dcrn)
-{
-       /* The guest may access CPR0 registers to determine the timebase
-        * frequency, and it must know the real host frequency because it
-        * can directly access the timebase registers.
-        *
-        * It would be possible to emulate those accesses in userspace,
-        * but userspace can really only figure out the end frequency.
-        * We could decompose that into the factors that compute it, but
-        * that's tricky math, and it's easier to just report the real
-        * CPR0 values.
-        */
-       switch (dcrn) {
-       case DCRN_CPR0_CONFIG_ADDR:
-               kvmppc_set_gpr(vcpu, rt, vcpu->arch.cpr0_cfgaddr);
-               break;
-       case DCRN_CPR0_CONFIG_DATA:
-               local_irq_disable();
-               mtdcr(DCRN_CPR0_CONFIG_ADDR,
-                         vcpu->arch.cpr0_cfgaddr);
-               kvmppc_set_gpr(vcpu, rt,
-                              mfdcr(DCRN_CPR0_CONFIG_DATA));
-               local_irq_enable();
-               break;
-       default:
-               vcpu->run->dcr.dcrn = dcrn;
-               vcpu->run->dcr.data =  0;
-               vcpu->run->dcr.is_write = 0;
-               vcpu->arch.dcr_is_write = 0;
-               vcpu->arch.io_gpr = rt;
-               vcpu->arch.dcr_needed = 1;
-               kvmppc_account_exit(vcpu, DCR_EXITS);
-               return EMULATE_DO_DCR;
-       }
-
-       return EMULATE_DONE;
-}
-
-int kvmppc_core_emulate_op_44x(struct kvm_run *run, struct kvm_vcpu *vcpu,
-                              unsigned int inst, int *advance)
-{
-       int emulated = EMULATE_DONE;
-       int dcrn = get_dcrn(inst);
-       int ra = get_ra(inst);
-       int rb = get_rb(inst);
-       int rc = get_rc(inst);
-       int rs = get_rs(inst);
-       int rt = get_rt(inst);
-       int ws = get_ws(inst);
-
-       switch (get_op(inst)) {
-       case 31:
-               switch (get_xop(inst)) {
-
-               case XOP_MFDCR:
-                       emulated = emulate_mfdcr(vcpu, rt, dcrn);
-                       break;
-
-               case XOP_MFDCRX:
-                       emulated = emulate_mfdcr(vcpu, rt,
-                                       kvmppc_get_gpr(vcpu, ra));
-                       break;
-
-               case XOP_MTDCR:
-                       emulated = emulate_mtdcr(vcpu, rs, dcrn);
-                       break;
-
-               case XOP_MTDCRX:
-                       emulated = emulate_mtdcr(vcpu, rs,
-                                       kvmppc_get_gpr(vcpu, ra));
-                       break;
-
-               case XOP_TLBWE:
-                       emulated = kvmppc_44x_emul_tlbwe(vcpu, ra, rs, ws);
-                       break;
-
-               case XOP_TLBSX:
-                       emulated = kvmppc_44x_emul_tlbsx(vcpu, rt, ra, rb, rc);
-                       break;
-
-               case XOP_ICCCI:
-                       break;
-
-               default:
-                       emulated = EMULATE_FAIL;
-               }
-
-               break;
-
-       default:
-               emulated = EMULATE_FAIL;
-       }
-
-       if (emulated == EMULATE_FAIL)
-               emulated = kvmppc_booke_emulate_op(run, vcpu, inst, advance);
-
-       return emulated;
-}
-
-int kvmppc_core_emulate_mtspr_44x(struct kvm_vcpu *vcpu, int sprn, ulong spr_val)
-{
-       int emulated = EMULATE_DONE;
-
-       switch (sprn) {
-       case SPRN_PID:
-               kvmppc_set_pid(vcpu, spr_val); break;
-       case SPRN_MMUCR:
-               vcpu->arch.mmucr = spr_val; break;
-       case SPRN_CCR0:
-               vcpu->arch.ccr0 = spr_val; break;
-       case SPRN_CCR1:
-               vcpu->arch.ccr1 = spr_val; break;
-       default:
-               emulated = kvmppc_booke_emulate_mtspr(vcpu, sprn, spr_val);
-       }
-
-       return emulated;
-}
-
-int kvmppc_core_emulate_mfspr_44x(struct kvm_vcpu *vcpu, int sprn, ulong *spr_val)
-{
-       int emulated = EMULATE_DONE;
-
-       switch (sprn) {
-       case SPRN_PID:
-               *spr_val = vcpu->arch.pid; break;
-       case SPRN_MMUCR:
-               *spr_val = vcpu->arch.mmucr; break;
-       case SPRN_CCR0:
-               *spr_val = vcpu->arch.ccr0; break;
-       case SPRN_CCR1:
-               *spr_val = vcpu->arch.ccr1; break;
-       default:
-               emulated = kvmppc_booke_emulate_mfspr(vcpu, sprn, spr_val);
-       }
-
-       return emulated;
-}
-
diff --git a/arch/powerpc/kvm/44x_tlb.c b/arch/powerpc/kvm/44x_tlb.c
deleted file mode 100644 (file)
index 0deef10..0000000
+++ /dev/null
@@ -1,528 +0,0 @@
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 2, as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- *
- * Copyright IBM Corp. 2007
- *
- * Authors: Hollis Blanchard <hollisb@us.ibm.com>
- */
-
-#include <linux/types.h>
-#include <linux/string.h>
-#include <linux/kvm.h>
-#include <linux/kvm_host.h>
-#include <linux/highmem.h>
-
-#include <asm/tlbflush.h>
-#include <asm/mmu-44x.h>
-#include <asm/kvm_ppc.h>
-#include <asm/kvm_44x.h>
-#include "timing.h"
-
-#include "44x_tlb.h"
-#include "trace.h"
-
-#ifndef PPC44x_TLBE_SIZE
-#define PPC44x_TLBE_SIZE       PPC44x_TLB_4K
-#endif
-
-#define PAGE_SIZE_4K (1<<12)
-#define PAGE_MASK_4K (~(PAGE_SIZE_4K - 1))
-
-#define PPC44x_TLB_UATTR_MASK \
-       (PPC44x_TLB_U0|PPC44x_TLB_U1|PPC44x_TLB_U2|PPC44x_TLB_U3)
-#define PPC44x_TLB_USER_PERM_MASK (PPC44x_TLB_UX|PPC44x_TLB_UR|PPC44x_TLB_UW)
-#define PPC44x_TLB_SUPER_PERM_MASK (PPC44x_TLB_SX|PPC44x_TLB_SR|PPC44x_TLB_SW)
-
-#ifdef DEBUG
-void kvmppc_dump_tlbs(struct kvm_vcpu *vcpu)
-{
-       struct kvmppc_vcpu_44x *vcpu_44x = to_44x(vcpu);
-       struct kvmppc_44x_tlbe *tlbe;
-       int i;
-
-       printk("vcpu %d TLB dump:\n", vcpu->vcpu_id);
-       printk("| %2s | %3s | %8s | %8s | %8s |\n",
-                       "nr", "tid", "word0", "word1", "word2");
-
-       for (i = 0; i < ARRAY_SIZE(vcpu_44x->guest_tlb); i++) {
-               tlbe = &vcpu_44x->guest_tlb[i];
-               if (tlbe->word0 & PPC44x_TLB_VALID)
-                       printk(" G%2d |  %02X | %08X | %08X | %08X |\n",
-                              i, tlbe->tid, tlbe->word0, tlbe->word1,
-                              tlbe->word2);
-       }
-}
-#endif
-
-static inline void kvmppc_44x_tlbie(unsigned int index)
-{
-       /* 0 <= index < 64, so the V bit is clear and we can use the index as
-        * word0. */
-       asm volatile(
-               "tlbwe %[index], %[index], 0\n"
-       :
-       : [index] "r"(index)
-       );
-}
-
-static inline void kvmppc_44x_tlbre(unsigned int index,
-                                    struct kvmppc_44x_tlbe *tlbe)
-{
-       asm volatile(
-               "tlbre %[word0], %[index], 0\n"
-               "mfspr %[tid], %[sprn_mmucr]\n"
-               "andi. %[tid], %[tid], 0xff\n"
-               "tlbre %[word1], %[index], 1\n"
-               "tlbre %[word2], %[index], 2\n"
-               : [word0] "=r"(tlbe->word0),
-                 [word1] "=r"(tlbe->word1),
-                 [word2] "=r"(tlbe->word2),
-                 [tid]   "=r"(tlbe->tid)
-               : [index] "r"(index),
-                 [sprn_mmucr] "i"(SPRN_MMUCR)
-               : "cc"
-       );
-}
-
-static inline void kvmppc_44x_tlbwe(unsigned int index,
-                                    struct kvmppc_44x_tlbe *stlbe)
-{
-       unsigned long tmp;
-
-       asm volatile(
-               "mfspr %[tmp], %[sprn_mmucr]\n"
-               "rlwimi %[tmp], %[tid], 0, 0xff\n"
-               "mtspr %[sprn_mmucr], %[tmp]\n"
-               "tlbwe %[word0], %[index], 0\n"
-               "tlbwe %[word1], %[index], 1\n"
-               "tlbwe %[word2], %[index], 2\n"
-               : [tmp]   "=&r"(tmp)
-               : [word0] "r"(stlbe->word0),
-                 [word1] "r"(stlbe->word1),
-                 [word2] "r"(stlbe->word2),
-                 [tid]   "r"(stlbe->tid),
-                 [index] "r"(index),
-                 [sprn_mmucr] "i"(SPRN_MMUCR)
-       );
-}
-
-static u32 kvmppc_44x_tlb_shadow_attrib(u32 attrib, int usermode)
-{
-       /* We only care about the guest's permission and user bits. */
-       attrib &= PPC44x_TLB_PERM_MASK|PPC44x_TLB_UATTR_MASK;
-
-       if (!usermode) {
-               /* Guest is in supervisor mode, so we need to translate guest
-                * supervisor permissions into user permissions. */
-               attrib &= ~PPC44x_TLB_USER_PERM_MASK;
-               attrib |= (attrib & PPC44x_TLB_SUPER_PERM_MASK) << 3;
-       }
-
-       /* Make sure host can always access this memory. */
-       attrib |= PPC44x_TLB_SX|PPC44x_TLB_SR|PPC44x_TLB_SW;
-
-       /* WIMGE = 0b00100 */
-       attrib |= PPC44x_TLB_M;
-
-       return attrib;
-}
-
-/* Load shadow TLB back into hardware. */
-void kvmppc_44x_tlb_load(struct kvm_vcpu *vcpu)
-{
-       struct kvmppc_vcpu_44x *vcpu_44x = to_44x(vcpu);
-       int i;
-
-       for (i = 0; i <= tlb_44x_hwater; i++) {
-               struct kvmppc_44x_tlbe *stlbe = &vcpu_44x->shadow_tlb[i];
-
-               if (get_tlb_v(stlbe) && get_tlb_ts(stlbe))
-                       kvmppc_44x_tlbwe(i, stlbe);
-       }
-}
-
-static void kvmppc_44x_tlbe_set_modified(struct kvmppc_vcpu_44x *vcpu_44x,
-                                         unsigned int i)
-{
-       vcpu_44x->shadow_tlb_mod[i] = 1;
-}
-
-/* Save hardware TLB to the vcpu, and invalidate all guest mappings. */
-void kvmppc_44x_tlb_put(struct kvm_vcpu *vcpu)
-{
-       struct kvmppc_vcpu_44x *vcpu_44x = to_44x(vcpu);
-       int i;
-
-       for (i = 0; i <= tlb_44x_hwater; i++) {
-               struct kvmppc_44x_tlbe *stlbe = &vcpu_44x->shadow_tlb[i];
-
-               if (vcpu_44x->shadow_tlb_mod[i])
-                       kvmppc_44x_tlbre(i, stlbe);
-
-               if (get_tlb_v(stlbe) && get_tlb_ts(stlbe))
-                       kvmppc_44x_tlbie(i);
-       }
-}
-
-
-/* Search the guest TLB for a matching entry. */
-int kvmppc_44x_tlb_index(struct kvm_vcpu *vcpu, gva_t eaddr, unsigned int pid,
-                         unsigned int as)
-{
-       struct kvmppc_vcpu_44x *vcpu_44x = to_44x(vcpu);
-       int i;
-
-       /* XXX Replace loop with fancy data structures. */
-       for (i = 0; i < ARRAY_SIZE(vcpu_44x->guest_tlb); i++) {
-               struct kvmppc_44x_tlbe *tlbe = &vcpu_44x->guest_tlb[i];
-               unsigned int tid;
-
-               if (eaddr < get_tlb_eaddr(tlbe))
-                       continue;
-
-               if (eaddr > get_tlb_end(tlbe))
-                       continue;
-
-               tid = get_tlb_tid(tlbe);
-               if (tid && (tid != pid))
-                       continue;
-
-               if (!get_tlb_v(tlbe))
-                       continue;
-
-               if (get_tlb_ts(tlbe) != as)
-                       continue;
-
-               return i;
-       }
-
-       return -1;
-}
-
-gpa_t kvmppc_mmu_xlate(struct kvm_vcpu *vcpu, unsigned int gtlb_index,
-                       gva_t eaddr)
-{
-       struct kvmppc_vcpu_44x *vcpu_44x = to_44x(vcpu);
-       struct kvmppc_44x_tlbe *gtlbe = &vcpu_44x->guest_tlb[gtlb_index];
-       unsigned int pgmask = get_tlb_bytes(gtlbe) - 1;
-
-       return get_tlb_raddr(gtlbe) | (eaddr & pgmask);
-}
-
-int kvmppc_mmu_itlb_index(struct kvm_vcpu *vcpu, gva_t eaddr)
-{
-       unsigned int as = !!(vcpu->arch.shared->msr & MSR_IS);
-
-       return kvmppc_44x_tlb_index(vcpu, eaddr, vcpu->arch.pid, as);
-}
-
-int kvmppc_mmu_dtlb_index(struct kvm_vcpu *vcpu, gva_t eaddr)
-{
-       unsigned int as = !!(vcpu->arch.shared->msr & MSR_DS);
-
-       return kvmppc_44x_tlb_index(vcpu, eaddr, vcpu->arch.pid, as);
-}
-
-void kvmppc_mmu_itlb_miss(struct kvm_vcpu *vcpu)
-{
-}
-
-void kvmppc_mmu_dtlb_miss(struct kvm_vcpu *vcpu)
-{
-}
-
-static void kvmppc_44x_shadow_release(struct kvmppc_vcpu_44x *vcpu_44x,
-                                      unsigned int stlb_index)
-{
-       struct kvmppc_44x_shadow_ref *ref = &vcpu_44x->shadow_refs[stlb_index];
-
-       if (!ref->page)
-               return;
-
-       /* Discard from the TLB. */
-       /* Note: we could actually invalidate a host mapping, if the host overwrote
-        * this TLB entry since we inserted a guest mapping. */
-       kvmppc_44x_tlbie(stlb_index);
-
-       /* Now release the page. */
-       if (ref->writeable)
-               kvm_release_page_dirty(ref->page);
-       else
-               kvm_release_page_clean(ref->page);
-
-       ref->page = NULL;
-
-       /* XXX set tlb_44x_index to stlb_index? */
-
-       trace_kvm_stlb_inval(stlb_index);
-}
-
-void kvmppc_mmu_destroy_44x(struct kvm_vcpu *vcpu)
-{
-       struct kvmppc_vcpu_44x *vcpu_44x = to_44x(vcpu);
-       int i;
-
-       for (i = 0; i <= tlb_44x_hwater; i++)
-               kvmppc_44x_shadow_release(vcpu_44x, i);
-}
-
-/**
- * kvmppc_mmu_map -- create a host mapping for guest memory
- *
- * If the guest wanted a larger page than the host supports, only the first
- * host page is mapped here and the rest are demand faulted.
- *
- * If the guest wanted a smaller page than the host page size, we map only the
- * guest-size page (i.e. not a full host page mapping).
- *
- * Caller must ensure that the specified guest TLB entry is safe to insert into
- * the shadow TLB.
- */
-void kvmppc_mmu_map(struct kvm_vcpu *vcpu, u64 gvaddr, gpa_t gpaddr,
-                    unsigned int gtlb_index)
-{
-       struct kvmppc_44x_tlbe stlbe;
-       struct kvmppc_vcpu_44x *vcpu_44x = to_44x(vcpu);
-       struct kvmppc_44x_tlbe *gtlbe = &vcpu_44x->guest_tlb[gtlb_index];
-       struct kvmppc_44x_shadow_ref *ref;
-       struct page *new_page;
-       hpa_t hpaddr;
-       gfn_t gfn;
-       u32 asid = gtlbe->tid;
-       u32 flags = gtlbe->word2;
-       u32 max_bytes = get_tlb_bytes(gtlbe);
-       unsigned int victim;
-
-       /* Select TLB entry to clobber. Indirectly guard against races with the TLB
-        * miss handler by disabling interrupts. */
-       local_irq_disable();
-       victim = ++tlb_44x_index;
-       if (victim > tlb_44x_hwater)
-               victim = 0;
-       tlb_44x_index = victim;
-       local_irq_enable();
-
-       /* Get reference to new page. */
-       gfn = gpaddr >> PAGE_SHIFT;
-       new_page = gfn_to_page(vcpu->kvm, gfn);
-       if (is_error_page(new_page)) {
-               printk(KERN_ERR "Couldn't get guest page for gfn %llx!\n",
-                       (unsigned long long)gfn);
-               return;
-       }
-       hpaddr = page_to_phys(new_page);
-
-       /* Invalidate any previous shadow mappings. */
-       kvmppc_44x_shadow_release(vcpu_44x, victim);
-
-       /* XXX Make sure (va, size) doesn't overlap any other
-        * entries. 440x6 user manual says the result would be
-        * "undefined." */
-
-       /* XXX what about AS? */
-
-       /* Force TS=1 for all guest mappings. */
-       stlbe.word0 = PPC44x_TLB_VALID | PPC44x_TLB_TS;
-
-       if (max_bytes >= PAGE_SIZE) {
-               /* Guest mapping is larger than or equal to host page size. We can use
-                * a "native" host mapping. */
-               stlbe.word0 |= (gvaddr & PAGE_MASK) | PPC44x_TLBE_SIZE;
-       } else {
-               /* Guest mapping is smaller than host page size. We must restrict the
-                * size of the mapping to be at most the smaller of the two, but for
-                * simplicity we fall back to a 4K mapping (this is probably what the
-                * guest is using anyways). */
-               stlbe.word0 |= (gvaddr & PAGE_MASK_4K) | PPC44x_TLB_4K;
-
-               /* 'hpaddr' is a host page, which is larger than the mapping we're
-                * inserting here. To compensate, we must add the in-page offset to the
-                * sub-page. */
-               hpaddr |= gpaddr & (PAGE_MASK ^ PAGE_MASK_4K);
-       }
-
-       stlbe.word1 = (hpaddr & 0xfffffc00) | ((hpaddr >> 32) & 0xf);
-       stlbe.word2 = kvmppc_44x_tlb_shadow_attrib(flags,
-                                                   vcpu->arch.shared->msr & MSR_PR);
-       stlbe.tid = !(asid & 0xff);
-
-       /* Keep track of the reference so we can properly release it later. */
-       ref = &vcpu_44x->shadow_refs[victim];
-       ref->page = new_page;
-       ref->gtlb_index = gtlb_index;
-       ref->writeable = !!(stlbe.word2 & PPC44x_TLB_UW);
-       ref->tid = stlbe.tid;
-
-       /* Insert shadow mapping into hardware TLB. */
-       kvmppc_44x_tlbe_set_modified(vcpu_44x, victim);
-       kvmppc_44x_tlbwe(victim, &stlbe);
-       trace_kvm_stlb_write(victim, stlbe.tid, stlbe.word0, stlbe.word1,
-                            stlbe.word2);
-}
-
-/* For a particular guest TLB entry, invalidate the corresponding host TLB
- * mappings and release the host pages. */
-static void kvmppc_44x_invalidate(struct kvm_vcpu *vcpu,
-                                  unsigned int gtlb_index)
-{
-       struct kvmppc_vcpu_44x *vcpu_44x = to_44x(vcpu);
-       int i;
-
-       for (i = 0; i < ARRAY_SIZE(vcpu_44x->shadow_refs); i++) {
-               struct kvmppc_44x_shadow_ref *ref = &vcpu_44x->shadow_refs[i];
-               if (ref->gtlb_index == gtlb_index)
-                       kvmppc_44x_shadow_release(vcpu_44x, i);
-       }
-}
-
-void kvmppc_mmu_msr_notify(struct kvm_vcpu *vcpu, u32 old_msr)
-{
-       int usermode = vcpu->arch.shared->msr & MSR_PR;
-
-       vcpu->arch.shadow_pid = !usermode;
-}
-
-void kvmppc_set_pid(struct kvm_vcpu *vcpu, u32 new_pid)
-{
-       struct kvmppc_vcpu_44x *vcpu_44x = to_44x(vcpu);
-       int i;
-
-       if (unlikely(vcpu->arch.pid == new_pid))
-               return;
-
-       vcpu->arch.pid = new_pid;
-
-       /* Guest userspace runs with TID=0 mappings and PID=0, to make sure it
-        * can't access guest kernel mappings (TID=1). When we switch to a new
-        * guest PID, which will also use host PID=0, we must discard the old guest
-        * userspace mappings. */
-       for (i = 0; i < ARRAY_SIZE(vcpu_44x->shadow_refs); i++) {
-               struct kvmppc_44x_shadow_ref *ref = &vcpu_44x->shadow_refs[i];
-
-               if (ref->tid == 0)
-                       kvmppc_44x_shadow_release(vcpu_44x, i);
-       }
-}
-
-static int tlbe_is_host_safe(const struct kvm_vcpu *vcpu,
-                             const struct kvmppc_44x_tlbe *tlbe)
-{
-       gpa_t gpa;
-
-       if (!get_tlb_v(tlbe))
-               return 0;
-
-       /* Does it match current guest AS? */
-       /* XXX what about IS != DS? */
-       if (get_tlb_ts(tlbe) != !!(vcpu->arch.shared->msr & MSR_IS))
-               return 0;
-
-       gpa = get_tlb_raddr(tlbe);
-       if (!gfn_to_memslot(vcpu->kvm, gpa >> PAGE_SHIFT))
-               /* Mapping is not for RAM. */
-               return 0;
-
-       return 1;
-}
-
-int kvmppc_44x_emul_tlbwe(struct kvm_vcpu *vcpu, u8 ra, u8 rs, u8 ws)
-{
-       struct kvmppc_vcpu_44x *vcpu_44x = to_44x(vcpu);
-       struct kvmppc_44x_tlbe *tlbe;
-       unsigned int gtlb_index;
-       int idx;
-
-       gtlb_index = kvmppc_get_gpr(vcpu, ra);
-       if (gtlb_index >= KVM44x_GUEST_TLB_SIZE) {
-               printk("%s: index %d\n", __func__, gtlb_index);
-               kvmppc_dump_vcpu(vcpu);
-               return EMULATE_FAIL;
-       }
-
-       tlbe = &vcpu_44x->guest_tlb[gtlb_index];
-
-       /* Invalidate shadow mappings for the about-to-be-clobbered TLB entry. */
-       if (tlbe->word0 & PPC44x_TLB_VALID)
-               kvmppc_44x_invalidate(vcpu, gtlb_index);
-
-       switch (ws) {
-       case PPC44x_TLB_PAGEID:
-               tlbe->tid = get_mmucr_stid(vcpu);
-               tlbe->word0 = kvmppc_get_gpr(vcpu, rs);
-               break;
-
-       case PPC44x_TLB_XLAT:
-               tlbe->word1 = kvmppc_get_gpr(vcpu, rs);
-               break;
-
-       case PPC44x_TLB_ATTRIB:
-               tlbe->word2 = kvmppc_get_gpr(vcpu, rs);
-               break;
-
-       default:
-               return EMULATE_FAIL;
-       }
-
-       idx = srcu_read_lock(&vcpu->kvm->srcu);
-
-       if (tlbe_is_host_safe(vcpu, tlbe)) {
-               gva_t eaddr;
-               gpa_t gpaddr;
-               u32 bytes;
-
-               eaddr = get_tlb_eaddr(tlbe);
-               gpaddr = get_tlb_raddr(tlbe);
-
-               /* Use the advertised page size to mask effective and real addrs. */
-               bytes = get_tlb_bytes(tlbe);
-               eaddr &= ~(bytes - 1);
-               gpaddr &= ~(bytes - 1);
-
-               kvmppc_mmu_map(vcpu, eaddr, gpaddr, gtlb_index);
-       }
-
-       srcu_read_unlock(&vcpu->kvm->srcu, idx);
-
-       trace_kvm_gtlb_write(gtlb_index, tlbe->tid, tlbe->word0, tlbe->word1,
-                            tlbe->word2);
-
-       kvmppc_set_exit_type(vcpu, EMULATED_TLBWE_EXITS);
-       return EMULATE_DONE;
-}
-
-int kvmppc_44x_emul_tlbsx(struct kvm_vcpu *vcpu, u8 rt, u8 ra, u8 rb, u8 rc)
-{
-       u32 ea;
-       int gtlb_index;
-       unsigned int as = get_mmucr_sts(vcpu);
-       unsigned int pid = get_mmucr_stid(vcpu);
-
-       ea = kvmppc_get_gpr(vcpu, rb);
-       if (ra)
-               ea += kvmppc_get_gpr(vcpu, ra);
-
-       gtlb_index = kvmppc_44x_tlb_index(vcpu, ea, pid, as);
-       if (rc) {
-               u32 cr = kvmppc_get_cr(vcpu);
-
-               if (gtlb_index < 0)
-                       kvmppc_set_cr(vcpu, cr & ~0x20000000);
-               else
-                       kvmppc_set_cr(vcpu, cr | 0x20000000);
-       }
-       kvmppc_set_gpr(vcpu, rt, gtlb_index);
-
-       kvmppc_set_exit_type(vcpu, EMULATED_TLBSX_EXITS);
-       return EMULATE_DONE;
-}
diff --git a/arch/powerpc/kvm/44x_tlb.h b/arch/powerpc/kvm/44x_tlb.h
deleted file mode 100644 (file)
index a9ff80e..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 2, as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- *
- * Copyright IBM Corp. 2007
- *
- * Authors: Hollis Blanchard <hollisb@us.ibm.com>
- */
-
-#ifndef __KVM_POWERPC_TLB_H__
-#define __KVM_POWERPC_TLB_H__
-
-#include <linux/kvm_host.h>
-#include <asm/mmu-44x.h>
-
-extern int kvmppc_44x_tlb_index(struct kvm_vcpu *vcpu, gva_t eaddr,
-                                unsigned int pid, unsigned int as);
-
-extern int kvmppc_44x_emul_tlbsx(struct kvm_vcpu *vcpu, u8 rt, u8 ra, u8 rb,
-                                 u8 rc);
-extern int kvmppc_44x_emul_tlbwe(struct kvm_vcpu *vcpu, u8 ra, u8 rs, u8 ws);
-
-/* TLB helper functions */
-static inline unsigned int get_tlb_size(const struct kvmppc_44x_tlbe *tlbe)
-{
-       return (tlbe->word0 >> 4) & 0xf;
-}
-
-static inline gva_t get_tlb_eaddr(const struct kvmppc_44x_tlbe *tlbe)
-{
-       return tlbe->word0 & 0xfffffc00;
-}
-
-static inline gva_t get_tlb_bytes(const struct kvmppc_44x_tlbe *tlbe)
-{
-       unsigned int pgsize = get_tlb_size(tlbe);
-       return 1 << 10 << (pgsize << 1);
-}
-
-static inline gva_t get_tlb_end(const struct kvmppc_44x_tlbe *tlbe)
-{
-       return get_tlb_eaddr(tlbe) + get_tlb_bytes(tlbe) - 1;
-}
-
-static inline u64 get_tlb_raddr(const struct kvmppc_44x_tlbe *tlbe)
-{
-       u64 word1 = tlbe->word1;
-       return ((word1 & 0xf) << 32) | (word1 & 0xfffffc00);
-}
-
-static inline unsigned int get_tlb_tid(const struct kvmppc_44x_tlbe *tlbe)
-{
-       return tlbe->tid & 0xff;
-}
-
-static inline unsigned int get_tlb_ts(const struct kvmppc_44x_tlbe *tlbe)
-{
-       return (tlbe->word0 >> 8) & 0x1;
-}
-
-static inline unsigned int get_tlb_v(const struct kvmppc_44x_tlbe *tlbe)
-{
-       return (tlbe->word0 >> 9) & 0x1;
-}
-
-static inline unsigned int get_mmucr_stid(const struct kvm_vcpu *vcpu)
-{
-       return vcpu->arch.mmucr & 0xff;
-}
-
-static inline unsigned int get_mmucr_sts(const struct kvm_vcpu *vcpu)
-{
-       return (vcpu->arch.mmucr >> 16) & 0x1;
-}
-
-#endif /* __KVM_POWERPC_TLB_H__ */
index d6a53b95de94a2afe544293e6f3a12ef37acee03..602eb51d20bc67a0b608551825e6be93758d299c 100644 (file)
@@ -75,7 +75,6 @@ config KVM_BOOK3S_64
 config KVM_BOOK3S_64_HV
        tristate "KVM support for POWER7 and PPC970 using hypervisor mode in host"
        depends on KVM_BOOK3S_64
-       depends on !CPU_LITTLE_ENDIAN
        select KVM_BOOK3S_HV_POSSIBLE
        select MMU_NOTIFIER
        select CMA
@@ -113,23 +112,9 @@ config KVM_BOOK3S_64_PR
 config KVM_BOOKE_HV
        bool
 
-config KVM_440
-       bool "KVM support for PowerPC 440 processors"
-       depends on 44x
-       select KVM
-       select KVM_MMIO
-       ---help---
-         Support running unmodified 440 guest kernels in virtual machines on
-         440 host processors.
-
-         This module provides access to the hardware capabilities through
-         a character device node named /dev/kvm.
-
-         If unsure, say N.
-
 config KVM_EXIT_TIMING
        bool "Detailed exit timing"
-       depends on KVM_440 || KVM_E500V2 || KVM_E500MC
+       depends on KVM_E500V2 || KVM_E500MC
        ---help---
          Calculate elapsed time for every exit/enter cycle. A per-vcpu
          report is available in debugfs kvm/vm#_vcpu#_timing.
@@ -173,6 +158,7 @@ config KVM_MPIC
        bool "KVM in-kernel MPIC emulation"
        depends on KVM && E500
        select HAVE_KVM_IRQCHIP
+       select HAVE_KVM_IRQFD
        select HAVE_KVM_IRQ_ROUTING
        select HAVE_KVM_MSI
        help
@@ -184,6 +170,8 @@ config KVM_MPIC
 config KVM_XICS
        bool "KVM in-kernel XICS emulation"
        depends on KVM_BOOK3S_64 && !KVM_MPIC
+       select HAVE_KVM_IRQCHIP
+       select HAVE_KVM_IRQFD
        ---help---
          Include support for the XICS (eXternal Interrupt Controller
          Specification) interrupt controller architecture used on
index 72905c30082e65a025398a69561d96728ae2714b..0570eef83fba59f2e1613c0db8571bd92e2da992 100644 (file)
@@ -10,27 +10,17 @@ KVM := ../../../virt/kvm
 common-objs-y = $(KVM)/kvm_main.o $(KVM)/coalesced_mmio.o \
                $(KVM)/eventfd.o
 
-CFLAGS_44x_tlb.o  := -I.
 CFLAGS_e500_mmu.o := -I.
 CFLAGS_e500_mmu_host.o := -I.
 CFLAGS_emulate.o  := -I.
+CFLAGS_emulate_loadstore.o  := -I.
 
-common-objs-y += powerpc.o emulate.o
+common-objs-y += powerpc.o emulate.o emulate_loadstore.o
 obj-$(CONFIG_KVM_EXIT_TIMING) += timing.o
 obj-$(CONFIG_KVM_BOOK3S_HANDLER) += book3s_exports.o
 
 AFLAGS_booke_interrupts.o := -I$(obj)
 
-kvm-440-objs := \
-       $(common-objs-y) \
-       booke.o \
-       booke_emulate.o \
-       booke_interrupts.o \
-       44x.o \
-       44x_tlb.o \
-       44x_emulate.o
-kvm-objs-$(CONFIG_KVM_440) := $(kvm-440-objs)
-
 kvm-e500-objs := \
        $(common-objs-y) \
        booke.o \
@@ -58,6 +48,7 @@ kvm-book3s_64-builtin-objs-$(CONFIG_KVM_BOOK3S_64_HANDLER) := \
 
 kvm-pr-y := \
        fpu.o \
+       emulate.o \
        book3s_paired_singles.o \
        book3s_pr.o \
        book3s_pr_papr.o \
@@ -100,7 +91,7 @@ kvm-book3s_64-module-objs += \
        $(KVM)/kvm_main.o \
        $(KVM)/eventfd.o \
        powerpc.o \
-       emulate.o \
+       emulate_loadstore.o \
        book3s.o \
        book3s_64_vio.o \
        book3s_rtas.o \
@@ -126,7 +117,6 @@ kvm-objs-$(CONFIG_HAVE_KVM_IRQ_ROUTING) += $(KVM)/irqchip.o
 
 kvm-objs := $(kvm-objs-m) $(kvm-objs-y)
 
-obj-$(CONFIG_KVM_440) += kvm.o
 obj-$(CONFIG_KVM_E500V2) += kvm.o
 obj-$(CONFIG_KVM_E500MC) += kvm.o
 obj-$(CONFIG_KVM_BOOK3S_64) += kvm.o
index c254c27f240e11d2d245cf938a5f104c61b3d2f4..dd03f6b299ba13a38a28cd1c3b69e28041360ce1 100644 (file)
@@ -72,6 +72,17 @@ void kvmppc_core_load_guest_debugstate(struct kvm_vcpu *vcpu)
 {
 }
 
+void kvmppc_unfixup_split_real(struct kvm_vcpu *vcpu)
+{
+       if (vcpu->arch.hflags & BOOK3S_HFLAG_SPLIT_HACK) {
+               ulong pc = kvmppc_get_pc(vcpu);
+               if ((pc & SPLIT_HACK_MASK) == SPLIT_HACK_OFFS)
+                       kvmppc_set_pc(vcpu, pc & ~SPLIT_HACK_MASK);
+               vcpu->arch.hflags &= ~BOOK3S_HFLAG_SPLIT_HACK;
+       }
+}
+EXPORT_SYMBOL_GPL(kvmppc_unfixup_split_real);
+
 static inline unsigned long kvmppc_interrupt_offset(struct kvm_vcpu *vcpu)
 {
        if (!is_kvmppc_hv_enabled(vcpu->kvm))
@@ -118,6 +129,7 @@ static inline bool kvmppc_critical_section(struct kvm_vcpu *vcpu)
 
 void kvmppc_inject_interrupt(struct kvm_vcpu *vcpu, int vec, u64 flags)
 {
+       kvmppc_unfixup_split_real(vcpu);
        kvmppc_set_srr0(vcpu, kvmppc_get_pc(vcpu));
        kvmppc_set_srr1(vcpu, kvmppc_get_msr(vcpu) | flags);
        kvmppc_set_pc(vcpu, kvmppc_interrupt_offset(vcpu) + vec);
@@ -218,6 +230,23 @@ void kvmppc_core_dequeue_external(struct kvm_vcpu *vcpu)
        kvmppc_book3s_dequeue_irqprio(vcpu, BOOK3S_INTERRUPT_EXTERNAL_LEVEL);
 }
 
+void kvmppc_core_queue_data_storage(struct kvm_vcpu *vcpu, ulong dar,
+                                   ulong flags)
+{
+       kvmppc_set_dar(vcpu, dar);
+       kvmppc_set_dsisr(vcpu, flags);
+       kvmppc_book3s_queue_irqprio(vcpu, BOOK3S_INTERRUPT_DATA_STORAGE);
+}
+
+void kvmppc_core_queue_inst_storage(struct kvm_vcpu *vcpu, ulong flags)
+{
+       u64 msr = kvmppc_get_msr(vcpu);
+       msr &= ~(SRR1_ISI_NOPT | SRR1_ISI_N_OR_G | SRR1_ISI_PROT);
+       msr |= flags & (SRR1_ISI_NOPT | SRR1_ISI_N_OR_G | SRR1_ISI_PROT);
+       kvmppc_set_msr_fast(vcpu, msr);
+       kvmppc_book3s_queue_irqprio(vcpu, BOOK3S_INTERRUPT_INST_STORAGE);
+}
+
 int kvmppc_book3s_irqprio_deliver(struct kvm_vcpu *vcpu, unsigned int priority)
 {
        int deliver = 1;
@@ -342,18 +371,18 @@ int kvmppc_core_prepare_to_enter(struct kvm_vcpu *vcpu)
 }
 EXPORT_SYMBOL_GPL(kvmppc_core_prepare_to_enter);
 
-pfn_t kvmppc_gfn_to_pfn(struct kvm_vcpu *vcpu, gfn_t gfn, bool writing,
+pfn_t kvmppc_gpa_to_pfn(struct kvm_vcpu *vcpu, gpa_t gpa, bool writing,
                        bool *writable)
 {
-       ulong mp_pa = vcpu->arch.magic_page_pa;
+       ulong mp_pa = vcpu->arch.magic_page_pa & KVM_PAM;
+       gfn_t gfn = gpa >> PAGE_SHIFT;
 
        if (!(kvmppc_get_msr(vcpu) & MSR_SF))
                mp_pa = (uint32_t)mp_pa;
 
        /* Magic page override */
-       if (unlikely(mp_pa) &&
-           unlikely(((gfn << PAGE_SHIFT) & KVM_PAM) ==
-                    ((mp_pa & PAGE_MASK) & KVM_PAM))) {
+       gpa &= ~0xFFFULL;
+       if (unlikely(mp_pa) && unlikely((gpa & KVM_PAM) == mp_pa)) {
                ulong shared_page = ((ulong)vcpu->arch.shared) & PAGE_MASK;
                pfn_t pfn;
 
@@ -366,11 +395,13 @@ pfn_t kvmppc_gfn_to_pfn(struct kvm_vcpu *vcpu, gfn_t gfn, bool writing,
 
        return gfn_to_pfn_prot(vcpu->kvm, gfn, writing, writable);
 }
-EXPORT_SYMBOL_GPL(kvmppc_gfn_to_pfn);
+EXPORT_SYMBOL_GPL(kvmppc_gpa_to_pfn);
 
-static int kvmppc_xlate(struct kvm_vcpu *vcpu, ulong eaddr, bool data,
-                       bool iswrite, struct kvmppc_pte *pte)
+int kvmppc_xlate(struct kvm_vcpu *vcpu, ulong eaddr, enum xlate_instdata xlid,
+                enum xlate_readwrite xlrw, struct kvmppc_pte *pte)
 {
+       bool data = (xlid == XLATE_DATA);
+       bool iswrite = (xlrw == XLATE_WRITE);
        int relocated = (kvmppc_get_msr(vcpu) & (data ? MSR_DR : MSR_IR));
        int r;
 
@@ -384,88 +415,34 @@ static int kvmppc_xlate(struct kvm_vcpu *vcpu, ulong eaddr, bool data,
                pte->may_write = true;
                pte->may_execute = true;
                r = 0;
+
+               if ((kvmppc_get_msr(vcpu) & (MSR_IR | MSR_DR)) == MSR_DR &&
+                   !data) {
+                       if ((vcpu->arch.hflags & BOOK3S_HFLAG_SPLIT_HACK) &&
+                           ((eaddr & SPLIT_HACK_MASK) == SPLIT_HACK_OFFS))
+                       pte->raddr &= ~SPLIT_HACK_MASK;
+               }
        }
 
        return r;
 }
 
-static hva_t kvmppc_bad_hva(void)
-{
-       return PAGE_OFFSET;
-}
-
-static hva_t kvmppc_pte_to_hva(struct kvm_vcpu *vcpu, struct kvmppc_pte *pte,
-                              bool read)
-{
-       hva_t hpage;
-
-       if (read && !pte->may_read)
-               goto err;
-
-       if (!read && !pte->may_write)
-               goto err;
-
-       hpage = gfn_to_hva(vcpu->kvm, pte->raddr >> PAGE_SHIFT);
-       if (kvm_is_error_hva(hpage))
-               goto err;
-
-       return hpage | (pte->raddr & ~PAGE_MASK);
-err:
-       return kvmppc_bad_hva();
-}
-
-int kvmppc_st(struct kvm_vcpu *vcpu, ulong *eaddr, int size, void *ptr,
-             bool data)
-{
-       struct kvmppc_pte pte;
-
-       vcpu->stat.st++;
-
-       if (kvmppc_xlate(vcpu, *eaddr, data, true, &pte))
-               return -ENOENT;
-
-       *eaddr = pte.raddr;
-
-       if (!pte.may_write)
-               return -EPERM;
-
-       if (kvm_write_guest(vcpu->kvm, pte.raddr, ptr, size))
-               return EMULATE_DO_MMIO;
-
-       return EMULATE_DONE;
-}
-EXPORT_SYMBOL_GPL(kvmppc_st);
-
-int kvmppc_ld(struct kvm_vcpu *vcpu, ulong *eaddr, int size, void *ptr,
-                     bool data)
+int kvmppc_load_last_inst(struct kvm_vcpu *vcpu, enum instruction_type type,
+                                        u32 *inst)
 {
-       struct kvmppc_pte pte;
-       hva_t hva = *eaddr;
-
-       vcpu->stat.ld++;
-
-       if (kvmppc_xlate(vcpu, *eaddr, data, false, &pte))
-               goto nopte;
-
-       *eaddr = pte.raddr;
-
-       hva = kvmppc_pte_to_hva(vcpu, &pte, true);
-       if (kvm_is_error_hva(hva))
-               goto mmio;
-
-       if (copy_from_user(ptr, (void __user *)hva, size)) {
-               printk(KERN_INFO "kvmppc_ld at 0x%lx failed\n", hva);
-               goto mmio;
-       }
+       ulong pc = kvmppc_get_pc(vcpu);
+       int r;
 
-       return EMULATE_DONE;
+       if (type == INST_SC)
+               pc -= 4;
 
-nopte:
-       return -ENOENT;
-mmio:
-       return EMULATE_DO_MMIO;
+       r = kvmppc_ld(vcpu, &pc, sizeof(u32), inst, false);
+       if (r == EMULATE_DONE)
+               return r;
+       else
+               return EMULATE_AGAIN;
 }
-EXPORT_SYMBOL_GPL(kvmppc_ld);
+EXPORT_SYMBOL_GPL(kvmppc_load_last_inst);
 
 int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu)
 {
@@ -646,6 +623,12 @@ int kvm_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg)
                case KVM_REG_PPC_BESCR:
                        val = get_reg_val(reg->id, vcpu->arch.bescr);
                        break;
+               case KVM_REG_PPC_VTB:
+                       val = get_reg_val(reg->id, vcpu->arch.vtb);
+                       break;
+               case KVM_REG_PPC_IC:
+                       val = get_reg_val(reg->id, vcpu->arch.ic);
+                       break;
                default:
                        r = -EINVAL;
                        break;
@@ -750,6 +733,12 @@ int kvm_vcpu_ioctl_set_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg)
                case KVM_REG_PPC_BESCR:
                        vcpu->arch.bescr = set_reg_val(reg->id, val);
                        break;
+               case KVM_REG_PPC_VTB:
+                       vcpu->arch.vtb = set_reg_val(reg->id, val);
+                       break;
+               case KVM_REG_PPC_IC:
+                       vcpu->arch.ic = set_reg_val(reg->id, val);
+                       break;
                default:
                        r = -EINVAL;
                        break;
@@ -913,6 +902,11 @@ int kvmppc_core_check_processor_compat(void)
        return 0;
 }
 
+int kvmppc_book3s_hcall_implemented(struct kvm *kvm, unsigned long hcall)
+{
+       return kvm->arch.kvm_ops->hcall_implemented(hcall);
+}
+
 static int kvmppc_book3s_init(void)
 {
        int r;
index 93503bbdae43df28efe2b0ab90f52352e0600898..cd0b0730e29e511f1eb4654e7087ccd0ace4bc3b 100644 (file)
@@ -335,7 +335,7 @@ static int kvmppc_mmu_book3s_32_xlate(struct kvm_vcpu *vcpu, gva_t eaddr,
        if (r < 0)
                r = kvmppc_mmu_book3s_32_xlate_pte(vcpu, eaddr, pte,
                                                   data, iswrite, true);
-       if (r < 0)
+       if (r == -ENOENT)
                r = kvmppc_mmu_book3s_32_xlate_pte(vcpu, eaddr, pte,
                                                   data, iswrite, false);
 
index 678e753704959775d85054293f10280843dd2339..2035d16a9262ac5e547bacc0cbcb4fc862706aa5 100644 (file)
@@ -156,11 +156,10 @@ int kvmppc_mmu_map_page(struct kvm_vcpu *vcpu, struct kvmppc_pte *orig_pte,
        bool writable;
 
        /* Get host physical address for gpa */
-       hpaddr = kvmppc_gfn_to_pfn(vcpu, orig_pte->raddr >> PAGE_SHIFT,
-                                  iswrite, &writable);
+       hpaddr = kvmppc_gpa_to_pfn(vcpu, orig_pte->raddr, iswrite, &writable);
        if (is_error_noslot_pfn(hpaddr)) {
-               printk(KERN_INFO "Couldn't get guest page for gfn %lx!\n",
-                                orig_pte->eaddr);
+               printk(KERN_INFO "Couldn't get guest page for gpa %lx!\n",
+                                orig_pte->raddr);
                r = -EINVAL;
                goto out;
        }
index 0ac98392f3635f82152405f48af891a3ce27b3dc..b982d925c7105f910003ed3e53b5a595558f67ef 100644 (file)
@@ -104,9 +104,10 @@ int kvmppc_mmu_map_page(struct kvm_vcpu *vcpu, struct kvmppc_pte *orig_pte,
        smp_rmb();
 
        /* Get host physical address for gpa */
-       pfn = kvmppc_gfn_to_pfn(vcpu, gfn, iswrite, &writable);
+       pfn = kvmppc_gpa_to_pfn(vcpu, orig_pte->raddr, iswrite, &writable);
        if (is_error_noslot_pfn(pfn)) {
-               printk(KERN_INFO "Couldn't get guest page for gfn %lx!\n", gfn);
+               printk(KERN_INFO "Couldn't get guest page for gpa %lx!\n",
+                      orig_pte->raddr);
                r = -EINVAL;
                goto out;
        }
index a01744fc3483160092d45c26764daeeaf2bfb041..72c20bb16d266b4ed0aa2160382414f161ad0663 100644 (file)
@@ -448,7 +448,7 @@ static int kvmppc_mmu_book3s_64_hv_xlate(struct kvm_vcpu *vcpu, gva_t eaddr,
        unsigned long slb_v;
        unsigned long pp, key;
        unsigned long v, gr;
-       unsigned long *hptep;
+       __be64 *hptep;
        int index;
        int virtmode = vcpu->arch.shregs.msr & (data ? MSR_DR : MSR_IR);
 
@@ -471,13 +471,13 @@ static int kvmppc_mmu_book3s_64_hv_xlate(struct kvm_vcpu *vcpu, gva_t eaddr,
                preempt_enable();
                return -ENOENT;
        }
-       hptep = (unsigned long *)(kvm->arch.hpt_virt + (index << 4));
-       v = hptep[0] & ~HPTE_V_HVLOCK;
+       hptep = (__be64 *)(kvm->arch.hpt_virt + (index << 4));
+       v = be64_to_cpu(hptep[0]) & ~HPTE_V_HVLOCK;
        gr = kvm->arch.revmap[index].guest_rpte;
 
        /* Unlock the HPTE */
        asm volatile("lwsync" : : : "memory");
-       hptep[0] = v;
+       hptep[0] = cpu_to_be64(v);
        preempt_enable();
 
        gpte->eaddr = eaddr;
@@ -528,21 +528,14 @@ static int instruction_is_store(unsigned int instr)
 static int kvmppc_hv_emulate_mmio(struct kvm_run *run, struct kvm_vcpu *vcpu,
                                  unsigned long gpa, gva_t ea, int is_store)
 {
-       int ret;
        u32 last_inst;
-       unsigned long srr0 = kvmppc_get_pc(vcpu);
 
-       /* We try to load the last instruction.  We don't let
-        * emulate_instruction do it as it doesn't check what
-        * kvmppc_ld returns.
+       /*
         * If we fail, we just return to the guest and try executing it again.
         */
-       if (vcpu->arch.last_inst == KVM_INST_FETCH_FAILED) {
-               ret = kvmppc_ld(vcpu, &srr0, sizeof(u32), &last_inst, false);
-               if (ret != EMULATE_DONE || last_inst == KVM_INST_FETCH_FAILED)
-                       return RESUME_GUEST;
-               vcpu->arch.last_inst = last_inst;
-       }
+       if (kvmppc_get_last_inst(vcpu, INST_GENERIC, &last_inst) !=
+               EMULATE_DONE)
+               return RESUME_GUEST;
 
        /*
         * WARNING: We do not know for sure whether the instruction we just
@@ -556,7 +549,7 @@ static int kvmppc_hv_emulate_mmio(struct kvm_run *run, struct kvm_vcpu *vcpu,
         * we just return and retry the instruction.
         */
 
-       if (instruction_is_store(kvmppc_get_last_inst(vcpu)) != !!is_store)
+       if (instruction_is_store(last_inst) != !!is_store)
                return RESUME_GUEST;
 
        /*
@@ -581,7 +574,8 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu,
                                unsigned long ea, unsigned long dsisr)
 {
        struct kvm *kvm = vcpu->kvm;
-       unsigned long *hptep, hpte[3], r;
+       unsigned long hpte[3], r;
+       __be64 *hptep;
        unsigned long mmu_seq, psize, pte_size;
        unsigned long gpa_base, gfn_base;
        unsigned long gpa, gfn, hva, pfn;
@@ -604,16 +598,16 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu,
        if (ea != vcpu->arch.pgfault_addr)
                return RESUME_GUEST;
        index = vcpu->arch.pgfault_index;
-       hptep = (unsigned long *)(kvm->arch.hpt_virt + (index << 4));
+       hptep = (__be64 *)(kvm->arch.hpt_virt + (index << 4));
        rev = &kvm->arch.revmap[index];
        preempt_disable();
        while (!try_lock_hpte(hptep, HPTE_V_HVLOCK))
                cpu_relax();
-       hpte[0] = hptep[0] & ~HPTE_V_HVLOCK;
-       hpte[1] = hptep[1];
+       hpte[0] = be64_to_cpu(hptep[0]) & ~HPTE_V_HVLOCK;
+       hpte[1] = be64_to_cpu(hptep[1]);
        hpte[2] = r = rev->guest_rpte;
        asm volatile("lwsync" : : : "memory");
-       hptep[0] = hpte[0];
+       hptep[0] = cpu_to_be64(hpte[0]);
        preempt_enable();
 
        if (hpte[0] != vcpu->arch.pgfault_hpte[0] ||
@@ -729,8 +723,9 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu,
        preempt_disable();
        while (!try_lock_hpte(hptep, HPTE_V_HVLOCK))
                cpu_relax();
-       if ((hptep[0] & ~HPTE_V_HVLOCK) != hpte[0] || hptep[1] != hpte[1] ||
-           rev->guest_rpte != hpte[2])
+       if ((be64_to_cpu(hptep[0]) & ~HPTE_V_HVLOCK) != hpte[0] ||
+               be64_to_cpu(hptep[1]) != hpte[1] ||
+               rev->guest_rpte != hpte[2])
                /* HPTE has been changed under us; let the guest retry */
                goto out_unlock;
        hpte[0] = (hpte[0] & ~HPTE_V_ABSENT) | HPTE_V_VALID;
@@ -750,20 +745,20 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu,
        rcbits = *rmap >> KVMPPC_RMAP_RC_SHIFT;
        r &= rcbits | ~(HPTE_R_R | HPTE_R_C);
 
-       if (hptep[0] & HPTE_V_VALID) {
+       if (be64_to_cpu(hptep[0]) & HPTE_V_VALID) {
                /* HPTE was previously valid, so we need to invalidate it */
                unlock_rmap(rmap);
-               hptep[0] |= HPTE_V_ABSENT;
+               hptep[0] |= cpu_to_be64(HPTE_V_ABSENT);
                kvmppc_invalidate_hpte(kvm, hptep, index);
                /* don't lose previous R and C bits */
-               r |= hptep[1] & (HPTE_R_R | HPTE_R_C);
+               r |= be64_to_cpu(hptep[1]) & (HPTE_R_R | HPTE_R_C);
        } else {
                kvmppc_add_revmap_chain(kvm, rev, rmap, index, 0);
        }
 
-       hptep[1] = r;
+       hptep[1] = cpu_to_be64(r);
        eieio();
-       hptep[0] = hpte[0];
+       hptep[0] = cpu_to_be64(hpte[0]);
        asm volatile("ptesync" : : : "memory");
        preempt_enable();
        if (page && hpte_is_writable(r))
@@ -782,7 +777,7 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu,
        return ret;
 
  out_unlock:
-       hptep[0] &= ~HPTE_V_HVLOCK;
+       hptep[0] &= ~cpu_to_be64(HPTE_V_HVLOCK);
        preempt_enable();
        goto out_put;
 }
@@ -858,7 +853,7 @@ static int kvm_unmap_rmapp(struct kvm *kvm, unsigned long *rmapp,
 {
        struct revmap_entry *rev = kvm->arch.revmap;
        unsigned long h, i, j;
-       unsigned long *hptep;
+       __be64 *hptep;
        unsigned long ptel, psize, rcbits;
 
        for (;;) {
@@ -874,11 +869,11 @@ static int kvm_unmap_rmapp(struct kvm *kvm, unsigned long *rmapp,
                 * rmap chain lock.
                 */
                i = *rmapp & KVMPPC_RMAP_INDEX;
-               hptep = (unsigned long *) (kvm->arch.hpt_virt + (i << 4));
+               hptep = (__be64 *) (kvm->arch.hpt_virt + (i << 4));
                if (!try_lock_hpte(hptep, HPTE_V_HVLOCK)) {
                        /* unlock rmap before spinning on the HPTE lock */
                        unlock_rmap(rmapp);
-                       while (hptep[0] & HPTE_V_HVLOCK)
+                       while (be64_to_cpu(hptep[0]) & HPTE_V_HVLOCK)
                                cpu_relax();
                        continue;
                }
@@ -897,14 +892,14 @@ static int kvm_unmap_rmapp(struct kvm *kvm, unsigned long *rmapp,
 
                /* Now check and modify the HPTE */
                ptel = rev[i].guest_rpte;
-               psize = hpte_page_size(hptep[0], ptel);
-               if ((hptep[0] & HPTE_V_VALID) &&
+               psize = hpte_page_size(be64_to_cpu(hptep[0]), ptel);
+               if ((be64_to_cpu(hptep[0]) & HPTE_V_VALID) &&
                    hpte_rpn(ptel, psize) == gfn) {
                        if (kvm->arch.using_mmu_notifiers)
-                               hptep[0] |= HPTE_V_ABSENT;
+                               hptep[0] |= cpu_to_be64(HPTE_V_ABSENT);
                        kvmppc_invalidate_hpte(kvm, hptep, i);
                        /* Harvest R and C */
-                       rcbits = hptep[1] & (HPTE_R_R | HPTE_R_C);
+                       rcbits = be64_to_cpu(hptep[1]) & (HPTE_R_R | HPTE_R_C);
                        *rmapp |= rcbits << KVMPPC_RMAP_RC_SHIFT;
                        if (rcbits & ~rev[i].guest_rpte) {
                                rev[i].guest_rpte = ptel | rcbits;
@@ -912,7 +907,7 @@ static int kvm_unmap_rmapp(struct kvm *kvm, unsigned long *rmapp,
                        }
                }
                unlock_rmap(rmapp);
-               hptep[0] &= ~HPTE_V_HVLOCK;
+               hptep[0] &= ~cpu_to_be64(HPTE_V_HVLOCK);
        }
        return 0;
 }
@@ -959,7 +954,7 @@ static int kvm_age_rmapp(struct kvm *kvm, unsigned long *rmapp,
 {
        struct revmap_entry *rev = kvm->arch.revmap;
        unsigned long head, i, j;
-       unsigned long *hptep;
+       __be64 *hptep;
        int ret = 0;
 
  retry:
@@ -975,23 +970,24 @@ static int kvm_age_rmapp(struct kvm *kvm, unsigned long *rmapp,
 
        i = head = *rmapp & KVMPPC_RMAP_INDEX;
        do {
-               hptep = (unsigned long *) (kvm->arch.hpt_virt + (i << 4));
+               hptep = (__be64 *) (kvm->arch.hpt_virt + (i << 4));
                j = rev[i].forw;
 
                /* If this HPTE isn't referenced, ignore it */
-               if (!(hptep[1] & HPTE_R_R))
+               if (!(be64_to_cpu(hptep[1]) & HPTE_R_R))
                        continue;
 
                if (!try_lock_hpte(hptep, HPTE_V_HVLOCK)) {
                        /* unlock rmap before spinning on the HPTE lock */
                        unlock_rmap(rmapp);
-                       while (hptep[0] & HPTE_V_HVLOCK)
+                       while (be64_to_cpu(hptep[0]) & HPTE_V_HVLOCK)
                                cpu_relax();
                        goto retry;
                }
 
                /* Now check and modify the HPTE */
-               if ((hptep[0] & HPTE_V_VALID) && (hptep[1] & HPTE_R_R)) {
+               if ((be64_to_cpu(hptep[0]) & HPTE_V_VALID) &&
+                   (be64_to_cpu(hptep[1]) & HPTE_R_R)) {
                        kvmppc_clear_ref_hpte(kvm, hptep, i);
                        if (!(rev[i].guest_rpte & HPTE_R_R)) {
                                rev[i].guest_rpte |= HPTE_R_R;
@@ -999,7 +995,7 @@ static int kvm_age_rmapp(struct kvm *kvm, unsigned long *rmapp,
                        }
                        ret = 1;
                }
-               hptep[0] &= ~HPTE_V_HVLOCK;
+               hptep[0] &= ~cpu_to_be64(HPTE_V_HVLOCK);
        } while ((i = j) != head);
 
        unlock_rmap(rmapp);
@@ -1033,7 +1029,7 @@ static int kvm_test_age_rmapp(struct kvm *kvm, unsigned long *rmapp,
                do {
                        hp = (unsigned long *)(kvm->arch.hpt_virt + (i << 4));
                        j = rev[i].forw;
-                       if (hp[1] & HPTE_R_R)
+                       if (be64_to_cpu(hp[1]) & HPTE_R_R)
                                goto out;
                } while ((i = j) != head);
        }
@@ -1073,7 +1069,7 @@ static int kvm_test_clear_dirty_npages(struct kvm *kvm, unsigned long *rmapp)
        unsigned long head, i, j;
        unsigned long n;
        unsigned long v, r;
-       unsigned long *hptep;
+       __be64 *hptep;
        int npages_dirty = 0;
 
  retry:
@@ -1089,7 +1085,8 @@ static int kvm_test_clear_dirty_npages(struct kvm *kvm, unsigned long *rmapp)
 
        i = head = *rmapp & KVMPPC_RMAP_INDEX;
        do {
-               hptep = (unsigned long *) (kvm->arch.hpt_virt + (i << 4));
+               unsigned long hptep1;
+               hptep = (__be64 *) (kvm->arch.hpt_virt + (i << 4));
                j = rev[i].forw;
 
                /*
@@ -1106,29 +1103,30 @@ static int kvm_test_clear_dirty_npages(struct kvm *kvm, unsigned long *rmapp)
                 * Otherwise we need to do the tlbie even if C==0 in
                 * order to pick up any delayed writeback of C.
                 */
-               if (!(hptep[1] & HPTE_R_C) &&
-                   (!hpte_is_writable(hptep[1]) || vcpus_running(kvm)))
+               hptep1 = be64_to_cpu(hptep[1]);
+               if (!(hptep1 & HPTE_R_C) &&
+                   (!hpte_is_writable(hptep1) || vcpus_running(kvm)))
                        continue;
 
                if (!try_lock_hpte(hptep, HPTE_V_HVLOCK)) {
                        /* unlock rmap before spinning on the HPTE lock */
                        unlock_rmap(rmapp);
-                       while (hptep[0] & HPTE_V_HVLOCK)
+                       while (hptep[0] & cpu_to_be64(HPTE_V_HVLOCK))
                                cpu_relax();
                        goto retry;
                }
 
                /* Now check and modify the HPTE */
-               if (!(hptep[0] & HPTE_V_VALID))
+               if (!(hptep[0] & cpu_to_be64(HPTE_V_VALID)))
                        continue;
 
                /* need to make it temporarily absent so C is stable */
-               hptep[0] |= HPTE_V_ABSENT;
+               hptep[0] |= cpu_to_be64(HPTE_V_ABSENT);
                kvmppc_invalidate_hpte(kvm, hptep, i);
-               v = hptep[0];
-               r = hptep[1];
+               v = be64_to_cpu(hptep[0]);
+               r = be64_to_cpu(hptep[1]);
                if (r & HPTE_R_C) {
-                       hptep[1] = r & ~HPTE_R_C;
+                       hptep[1] = cpu_to_be64(r & ~HPTE_R_C);
                        if (!(rev[i].guest_rpte & HPTE_R_C)) {
                                rev[i].guest_rpte |= HPTE_R_C;
                                note_hpte_modification(kvm, &rev[i]);
@@ -1141,7 +1139,7 @@ static int kvm_test_clear_dirty_npages(struct kvm *kvm, unsigned long *rmapp)
                }
                v &= ~(HPTE_V_ABSENT | HPTE_V_HVLOCK);
                v |= HPTE_V_VALID;
-               hptep[0] = v;
+               hptep[0] = cpu_to_be64(v);
        } while ((i = j) != head);
 
        unlock_rmap(rmapp);
@@ -1305,7 +1303,7 @@ struct kvm_htab_ctx {
  * Returns 1 if this HPT entry has been modified or has pending
  * R/C bit changes.
  */
-static int hpte_dirty(struct revmap_entry *revp, unsigned long *hptp)
+static int hpte_dirty(struct revmap_entry *revp, __be64 *hptp)
 {
        unsigned long rcbits_unset;
 
@@ -1314,13 +1312,14 @@ static int hpte_dirty(struct revmap_entry *revp, unsigned long *hptp)
 
        /* Also need to consider changes in reference and changed bits */
        rcbits_unset = ~revp->guest_rpte & (HPTE_R_R | HPTE_R_C);
-       if ((hptp[0] & HPTE_V_VALID) && (hptp[1] & rcbits_unset))
+       if ((be64_to_cpu(hptp[0]) & HPTE_V_VALID) &&
+           (be64_to_cpu(hptp[1]) & rcbits_unset))
                return 1;
 
        return 0;
 }
 
-static long record_hpte(unsigned long flags, unsigned long *hptp,
+static long record_hpte(unsigned long flags, __be64 *hptp,
                        unsigned long *hpte, struct revmap_entry *revp,
                        int want_valid, int first_pass)
 {
@@ -1335,10 +1334,10 @@ static long record_hpte(unsigned long flags, unsigned long *hptp,
                return 0;
 
        valid = 0;
-       if (hptp[0] & (HPTE_V_VALID | HPTE_V_ABSENT)) {
+       if (be64_to_cpu(hptp[0]) & (HPTE_V_VALID | HPTE_V_ABSENT)) {
                valid = 1;
                if ((flags & KVM_GET_HTAB_BOLTED_ONLY) &&
-                   !(hptp[0] & HPTE_V_BOLTED))
+                   !(be64_to_cpu(hptp[0]) & HPTE_V_BOLTED))
                        valid = 0;
        }
        if (valid != want_valid)
@@ -1350,7 +1349,7 @@ static long record_hpte(unsigned long flags, unsigned long *hptp,
                preempt_disable();
                while (!try_lock_hpte(hptp, HPTE_V_HVLOCK))
                        cpu_relax();
-               v = hptp[0];
+               v = be64_to_cpu(hptp[0]);
 
                /* re-evaluate valid and dirty from synchronized HPTE value */
                valid = !!(v & HPTE_V_VALID);
@@ -1358,9 +1357,9 @@ static long record_hpte(unsigned long flags, unsigned long *hptp,
 
                /* Harvest R and C into guest view if necessary */
                rcbits_unset = ~revp->guest_rpte & (HPTE_R_R | HPTE_R_C);
-               if (valid && (rcbits_unset & hptp[1])) {
-                       revp->guest_rpte |= (hptp[1] & (HPTE_R_R | HPTE_R_C)) |
-                               HPTE_GR_MODIFIED;
+               if (valid && (rcbits_unset & be64_to_cpu(hptp[1]))) {
+                       revp->guest_rpte |= (be64_to_cpu(hptp[1]) &
+                               (HPTE_R_R | HPTE_R_C)) | HPTE_GR_MODIFIED;
                        dirty = 1;
                }
 
@@ -1379,13 +1378,13 @@ static long record_hpte(unsigned long flags, unsigned long *hptp,
                        revp->guest_rpte = r;
                }
                asm volatile(PPC_RELEASE_BARRIER "" : : : "memory");
-               hptp[0] &= ~HPTE_V_HVLOCK;
+               hptp[0] &= ~cpu_to_be64(HPTE_V_HVLOCK);
                preempt_enable();
                if (!(valid == want_valid && (first_pass || dirty)))
                        ok = 0;
        }
-       hpte[0] = v;
-       hpte[1] = r;
+       hpte[0] = cpu_to_be64(v);
+       hpte[1] = cpu_to_be64(r);
        return ok;
 }
 
@@ -1395,7 +1394,7 @@ static ssize_t kvm_htab_read(struct file *file, char __user *buf,
        struct kvm_htab_ctx *ctx = file->private_data;
        struct kvm *kvm = ctx->kvm;
        struct kvm_get_htab_header hdr;
-       unsigned long *hptp;
+       __be64 *hptp;
        struct revmap_entry *revp;
        unsigned long i, nb, nw;
        unsigned long __user *lbuf;
@@ -1411,7 +1410,7 @@ static ssize_t kvm_htab_read(struct file *file, char __user *buf,
        flags = ctx->flags;
 
        i = ctx->index;
-       hptp = (unsigned long *)(kvm->arch.hpt_virt + (i * HPTE_SIZE));
+       hptp = (__be64 *)(kvm->arch.hpt_virt + (i * HPTE_SIZE));
        revp = kvm->arch.revmap + i;
        lbuf = (unsigned long __user *)buf;
 
@@ -1495,7 +1494,7 @@ static ssize_t kvm_htab_write(struct file *file, const char __user *buf,
        unsigned long i, j;
        unsigned long v, r;
        unsigned long __user *lbuf;
-       unsigned long *hptp;
+       __be64 *hptp;
        unsigned long tmp[2];
        ssize_t nb;
        long int err, ret;
@@ -1537,7 +1536,7 @@ static ssize_t kvm_htab_write(struct file *file, const char __user *buf,
                    i + hdr.n_valid + hdr.n_invalid > kvm->arch.hpt_npte)
                        break;
 
-               hptp = (unsigned long *)(kvm->arch.hpt_virt + (i * HPTE_SIZE));
+               hptp = (__be64 *)(kvm->arch.hpt_virt + (i * HPTE_SIZE));
                lbuf = (unsigned long __user *)buf;
                for (j = 0; j < hdr.n_valid; ++j) {
                        err = -EFAULT;
@@ -1549,7 +1548,7 @@ static ssize_t kvm_htab_write(struct file *file, const char __user *buf,
                        lbuf += 2;
                        nb += HPTE_SIZE;
 
-                       if (hptp[0] & (HPTE_V_VALID | HPTE_V_ABSENT))
+                       if (be64_to_cpu(hptp[0]) & (HPTE_V_VALID | HPTE_V_ABSENT))
                                kvmppc_do_h_remove(kvm, 0, i, 0, tmp);
                        err = -EIO;
                        ret = kvmppc_virtmode_do_h_enter(kvm, H_EXACT, i, v, r,
@@ -1575,7 +1574,7 @@ static ssize_t kvm_htab_write(struct file *file, const char __user *buf,
                }
 
                for (j = 0; j < hdr.n_invalid; ++j) {
-                       if (hptp[0] & (HPTE_V_VALID | HPTE_V_ABSENT))
+                       if (be64_to_cpu(hptp[0]) & (HPTE_V_VALID | HPTE_V_ABSENT))
                                kvmppc_do_h_remove(kvm, 0, i, 0, tmp);
                        ++i;
                        hptp += 2;
index 3f295269af37e7625869d677241c3f12cf6e0d22..5a2bc4b0dfe5a9b83c4d5be3b820bda90e57a641 100644 (file)
@@ -439,12 +439,6 @@ int kvmppc_core_emulate_mtspr_pr(struct kvm_vcpu *vcpu, int sprn, ulong spr_val)
                    (mfmsr() & MSR_HV))
                        vcpu->arch.hflags |= BOOK3S_HFLAG_DCBZ32;
                break;
-       case SPRN_PURR:
-               to_book3s(vcpu)->purr_offset = spr_val - get_tb();
-               break;
-       case SPRN_SPURR:
-               to_book3s(vcpu)->spurr_offset = spr_val - get_tb();
-               break;
        case SPRN_GQR0:
        case SPRN_GQR1:
        case SPRN_GQR2:
@@ -455,10 +449,10 @@ int kvmppc_core_emulate_mtspr_pr(struct kvm_vcpu *vcpu, int sprn, ulong spr_val)
        case SPRN_GQR7:
                to_book3s(vcpu)->gqr[sprn - SPRN_GQR0] = spr_val;
                break;
+#ifdef CONFIG_PPC_BOOK3S_64
        case SPRN_FSCR:
-               vcpu->arch.fscr = spr_val;
+               kvmppc_set_fscr(vcpu, spr_val);
                break;
-#ifdef CONFIG_PPC_BOOK3S_64
        case SPRN_BESCR:
                vcpu->arch.bescr = spr_val;
                break;
@@ -572,10 +566,22 @@ int kvmppc_core_emulate_mfspr_pr(struct kvm_vcpu *vcpu, int sprn, ulong *spr_val
                *spr_val = 0;
                break;
        case SPRN_PURR:
-               *spr_val = get_tb() + to_book3s(vcpu)->purr_offset;
+               /*
+                * On exit we would have updated purr
+                */
+               *spr_val = vcpu->arch.purr;
                break;
        case SPRN_SPURR:
-               *spr_val = get_tb() + to_book3s(vcpu)->purr_offset;
+               /*
+                * On exit we would have updated spurr
+                */
+               *spr_val = vcpu->arch.spurr;
+               break;
+       case SPRN_VTB:
+               *spr_val = vcpu->arch.vtb;
+               break;
+       case SPRN_IC:
+               *spr_val = vcpu->arch.ic;
                break;
        case SPRN_GQR0:
        case SPRN_GQR1:
@@ -587,10 +593,10 @@ int kvmppc_core_emulate_mfspr_pr(struct kvm_vcpu *vcpu, int sprn, ulong *spr_val
        case SPRN_GQR7:
                *spr_val = to_book3s(vcpu)->gqr[sprn - SPRN_GQR0];
                break;
+#ifdef CONFIG_PPC_BOOK3S_64
        case SPRN_FSCR:
                *spr_val = vcpu->arch.fscr;
                break;
-#ifdef CONFIG_PPC_BOOK3S_64
        case SPRN_BESCR:
                *spr_val = vcpu->arch.bescr;
                break;
index 7a12edbb61e7c2c9f6851bc0ef01e6b0b398ed83..27cced9c7249e32ef0660fd14d9ace591e11eba6 100644 (file)
@@ -35,6 +35,7 @@
 
 #include <asm/reg.h>
 #include <asm/cputable.h>
+#include <asm/cache.h>
 #include <asm/cacheflush.h>
 #include <asm/tlbflush.h>
 #include <asm/uaccess.h>
 /* Used as a "null" value for timebase values */
 #define TB_NIL (~(u64)0)
 
+static DECLARE_BITMAP(default_enabled_hcalls, MAX_HCALL_OPCODE/4 + 1);
+
+#if defined(CONFIG_PPC_64K_PAGES)
+#define MPP_BUFFER_ORDER       0
+#elif defined(CONFIG_PPC_4K_PAGES)
+#define MPP_BUFFER_ORDER       3
+#endif
+
+
 static void kvmppc_end_cede(struct kvm_vcpu *vcpu);
 static int kvmppc_hv_setup_htab_rma(struct kvm_vcpu *vcpu);
 
@@ -270,7 +280,7 @@ struct kvm_vcpu *kvmppc_find_vcpu(struct kvm *kvm, int id)
 static void init_vpa(struct kvm_vcpu *vcpu, struct lppaca *vpa)
 {
        vpa->__old_status |= LPPACA_OLD_SHARED_PROC;
-       vpa->yield_count = 1;
+       vpa->yield_count = cpu_to_be32(1);
 }
 
 static int set_vpa(struct kvm_vcpu *vcpu, struct kvmppc_vpa *v,
@@ -293,8 +303,8 @@ static int set_vpa(struct kvm_vcpu *vcpu, struct kvmppc_vpa *v,
 struct reg_vpa {
        u32 dummy;
        union {
-               u16 hword;
-               u32 word;
+               __be16 hword;
+               __be32 word;
        } length;
 };
 
@@ -333,9 +343,9 @@ static unsigned long do_h_register_vpa(struct kvm_vcpu *vcpu,
                if (va == NULL)
                        return H_PARAMETER;
                if (subfunc == H_VPA_REG_VPA)
-                       len = ((struct reg_vpa *)va)->length.hword;
+                       len = be16_to_cpu(((struct reg_vpa *)va)->length.hword);
                else
-                       len = ((struct reg_vpa *)va)->length.word;
+                       len = be32_to_cpu(((struct reg_vpa *)va)->length.word);
                kvmppc_unpin_guest_page(kvm, va, vpa, false);
 
                /* Check length */
@@ -540,21 +550,63 @@ static void kvmppc_create_dtl_entry(struct kvm_vcpu *vcpu,
                return;
        memset(dt, 0, sizeof(struct dtl_entry));
        dt->dispatch_reason = 7;
-       dt->processor_id = vc->pcpu + vcpu->arch.ptid;
-       dt->timebase = now + vc->tb_offset;
-       dt->enqueue_to_dispatch_time = stolen;
-       dt->srr0 = kvmppc_get_pc(vcpu);
-       dt->srr1 = vcpu->arch.shregs.msr;
+       dt->processor_id = cpu_to_be16(vc->pcpu + vcpu->arch.ptid);
+       dt->timebase = cpu_to_be64(now + vc->tb_offset);
+       dt->enqueue_to_dispatch_time = cpu_to_be32(stolen);
+       dt->srr0 = cpu_to_be64(kvmppc_get_pc(vcpu));
+       dt->srr1 = cpu_to_be64(vcpu->arch.shregs.msr);
        ++dt;
        if (dt == vcpu->arch.dtl.pinned_end)
                dt = vcpu->arch.dtl.pinned_addr;
        vcpu->arch.dtl_ptr = dt;
        /* order writing *dt vs. writing vpa->dtl_idx */
        smp_wmb();
-       vpa->dtl_idx = ++vcpu->arch.dtl_index;
+       vpa->dtl_idx = cpu_to_be64(++vcpu->arch.dtl_index);
        vcpu->arch.dtl.dirty = true;
 }
 
+static bool kvmppc_power8_compatible(struct kvm_vcpu *vcpu)
+{
+       if (vcpu->arch.vcore->arch_compat >= PVR_ARCH_207)
+               return true;
+       if ((!vcpu->arch.vcore->arch_compat) &&
+           cpu_has_feature(CPU_FTR_ARCH_207S))
+               return true;
+       return false;
+}
+
+static int kvmppc_h_set_mode(struct kvm_vcpu *vcpu, unsigned long mflags,
+                            unsigned long resource, unsigned long value1,
+                            unsigned long value2)
+{
+       switch (resource) {
+       case H_SET_MODE_RESOURCE_SET_CIABR:
+               if (!kvmppc_power8_compatible(vcpu))
+                       return H_P2;
+               if (value2)
+                       return H_P4;
+               if (mflags)
+                       return H_UNSUPPORTED_FLAG_START;
+               /* Guests can't breakpoint the hypervisor */
+               if ((value1 & CIABR_PRIV) == CIABR_PRIV_HYPER)
+                       return H_P3;
+               vcpu->arch.ciabr  = value1;
+               return H_SUCCESS;
+       case H_SET_MODE_RESOURCE_SET_DAWR:
+               if (!kvmppc_power8_compatible(vcpu))
+                       return H_P2;
+               if (mflags)
+                       return H_UNSUPPORTED_FLAG_START;
+               if (value2 & DABRX_HYP)
+                       return H_P4;
+               vcpu->arch.dawr  = value1;
+               vcpu->arch.dawrx = value2;
+               return H_SUCCESS;
+       default:
+               return H_TOO_HARD;
+       }
+}
+
 int kvmppc_pseries_do_hcall(struct kvm_vcpu *vcpu)
 {
        unsigned long req = kvmppc_get_gpr(vcpu, 3);
@@ -562,6 +614,10 @@ int kvmppc_pseries_do_hcall(struct kvm_vcpu *vcpu)
        struct kvm_vcpu *tvcpu;
        int idx, rc;
 
+       if (req <= MAX_HCALL_OPCODE &&
+           !test_bit(req/4, vcpu->kvm->arch.enabled_hcalls))
+               return RESUME_HOST;
+
        switch (req) {
        case H_ENTER:
                idx = srcu_read_lock(&vcpu->kvm->srcu);
@@ -620,7 +676,14 @@ int kvmppc_pseries_do_hcall(struct kvm_vcpu *vcpu)
 
                /* Send the error out to userspace via KVM_RUN */
                return rc;
-
+       case H_SET_MODE:
+               ret = kvmppc_h_set_mode(vcpu, kvmppc_get_gpr(vcpu, 4),
+                                       kvmppc_get_gpr(vcpu, 5),
+                                       kvmppc_get_gpr(vcpu, 6),
+                                       kvmppc_get_gpr(vcpu, 7));
+               if (ret == H_TOO_HARD)
+                       return RESUME_HOST;
+               break;
        case H_XIRR:
        case H_CPPR:
        case H_EOI:
@@ -639,6 +702,29 @@ int kvmppc_pseries_do_hcall(struct kvm_vcpu *vcpu)
        return RESUME_GUEST;
 }
 
+static int kvmppc_hcall_impl_hv(unsigned long cmd)
+{
+       switch (cmd) {
+       case H_CEDE:
+       case H_PROD:
+       case H_CONFER:
+       case H_REGISTER_VPA:
+       case H_SET_MODE:
+#ifdef CONFIG_KVM_XICS
+       case H_XIRR:
+       case H_CPPR:
+       case H_EOI:
+       case H_IPI:
+       case H_IPOLL:
+       case H_XIRR_X:
+#endif
+               return 1;
+       }
+
+       /* See if it's in the real-mode table */
+       return kvmppc_hcall_impl_hv_realmode(cmd);
+}
+
 static int kvmppc_handle_exit_hv(struct kvm_run *run, struct kvm_vcpu *vcpu,
                                 struct task_struct *tsk)
 {
@@ -785,7 +871,8 @@ static int kvm_arch_vcpu_ioctl_set_sregs_hv(struct kvm_vcpu *vcpu,
        return 0;
 }
 
-static void kvmppc_set_lpcr(struct kvm_vcpu *vcpu, u64 new_lpcr)
+static void kvmppc_set_lpcr(struct kvm_vcpu *vcpu, u64 new_lpcr,
+               bool preserve_top32)
 {
        struct kvmppc_vcore *vc = vcpu->arch.vcore;
        u64 mask;
@@ -820,6 +907,10 @@ static void kvmppc_set_lpcr(struct kvm_vcpu *vcpu, u64 new_lpcr)
        mask = LPCR_DPFD | LPCR_ILE | LPCR_TC;
        if (cpu_has_feature(CPU_FTR_ARCH_207S))
                mask |= LPCR_AIL;
+
+       /* Broken 32-bit version of LPCR must not clear top bits */
+       if (preserve_top32)
+               mask &= 0xFFFFFFFF;
        vc->lpcr = (vc->lpcr & ~mask) | (new_lpcr & mask);
        spin_unlock(&vc->lock);
 }
@@ -894,12 +985,6 @@ static int kvmppc_get_one_reg_hv(struct kvm_vcpu *vcpu, u64 id,
        case KVM_REG_PPC_CIABR:
                *val = get_reg_val(id, vcpu->arch.ciabr);
                break;
-       case KVM_REG_PPC_IC:
-               *val = get_reg_val(id, vcpu->arch.ic);
-               break;
-       case KVM_REG_PPC_VTB:
-               *val = get_reg_val(id, vcpu->arch.vtb);
-               break;
        case KVM_REG_PPC_CSIGR:
                *val = get_reg_val(id, vcpu->arch.csigr);
                break;
@@ -939,6 +1024,7 @@ static int kvmppc_get_one_reg_hv(struct kvm_vcpu *vcpu, u64 id,
                *val = get_reg_val(id, vcpu->arch.vcore->tb_offset);
                break;
        case KVM_REG_PPC_LPCR:
+       case KVM_REG_PPC_LPCR_64:
                *val = get_reg_val(id, vcpu->arch.vcore->lpcr);
                break;
        case KVM_REG_PPC_PPR:
@@ -1094,12 +1180,6 @@ static int kvmppc_set_one_reg_hv(struct kvm_vcpu *vcpu, u64 id,
                if ((vcpu->arch.ciabr & CIABR_PRIV) == CIABR_PRIV_HYPER)
                        vcpu->arch.ciabr &= ~CIABR_PRIV;        /* disable */
                break;
-       case KVM_REG_PPC_IC:
-               vcpu->arch.ic = set_reg_val(id, *val);
-               break;
-       case KVM_REG_PPC_VTB:
-               vcpu->arch.vtb = set_reg_val(id, *val);
-               break;
        case KVM_REG_PPC_CSIGR:
                vcpu->arch.csigr = set_reg_val(id, *val);
                break;
@@ -1150,7 +1230,10 @@ static int kvmppc_set_one_reg_hv(struct kvm_vcpu *vcpu, u64 id,
                        ALIGN(set_reg_val(id, *val), 1UL << 24);
                break;
        case KVM_REG_PPC_LPCR:
-               kvmppc_set_lpcr(vcpu, set_reg_val(id, *val));
+               kvmppc_set_lpcr(vcpu, set_reg_val(id, *val), true);
+               break;
+       case KVM_REG_PPC_LPCR_64:
+               kvmppc_set_lpcr(vcpu, set_reg_val(id, *val), false);
                break;
        case KVM_REG_PPC_PPR:
                vcpu->arch.ppr = set_reg_val(id, *val);
@@ -1228,6 +1311,33 @@ static int kvmppc_set_one_reg_hv(struct kvm_vcpu *vcpu, u64 id,
        return r;
 }
 
+static struct kvmppc_vcore *kvmppc_vcore_create(struct kvm *kvm, int core)
+{
+       struct kvmppc_vcore *vcore;
+
+       vcore = kzalloc(sizeof(struct kvmppc_vcore), GFP_KERNEL);
+
+       if (vcore == NULL)
+               return NULL;
+
+       INIT_LIST_HEAD(&vcore->runnable_threads);
+       spin_lock_init(&vcore->lock);
+       init_waitqueue_head(&vcore->wq);
+       vcore->preempt_tb = TB_NIL;
+       vcore->lpcr = kvm->arch.lpcr;
+       vcore->first_vcpuid = core * threads_per_subcore;
+       vcore->kvm = kvm;
+
+       vcore->mpp_buffer_is_valid = false;
+
+       if (cpu_has_feature(CPU_FTR_ARCH_207S))
+               vcore->mpp_buffer = (void *)__get_free_pages(
+                       GFP_KERNEL|__GFP_ZERO,
+                       MPP_BUFFER_ORDER);
+
+       return vcore;
+}
+
 static struct kvm_vcpu *kvmppc_core_vcpu_create_hv(struct kvm *kvm,
                                                   unsigned int id)
 {
@@ -1279,16 +1389,7 @@ static struct kvm_vcpu *kvmppc_core_vcpu_create_hv(struct kvm *kvm,
        mutex_lock(&kvm->lock);
        vcore = kvm->arch.vcores[core];
        if (!vcore) {
-               vcore = kzalloc(sizeof(struct kvmppc_vcore), GFP_KERNEL);
-               if (vcore) {
-                       INIT_LIST_HEAD(&vcore->runnable_threads);
-                       spin_lock_init(&vcore->lock);
-                       init_waitqueue_head(&vcore->wq);
-                       vcore->preempt_tb = TB_NIL;
-                       vcore->lpcr = kvm->arch.lpcr;
-                       vcore->first_vcpuid = core * threads_per_subcore;
-                       vcore->kvm = kvm;
-               }
+               vcore = kvmppc_vcore_create(kvm, core);
                kvm->arch.vcores[core] = vcore;
                kvm->arch.online_vcores++;
        }
@@ -1500,6 +1601,33 @@ static int on_primary_thread(void)
        return 1;
 }
 
+static void kvmppc_start_saving_l2_cache(struct kvmppc_vcore *vc)
+{
+       phys_addr_t phy_addr, mpp_addr;
+
+       phy_addr = (phys_addr_t)virt_to_phys(vc->mpp_buffer);
+       mpp_addr = phy_addr & PPC_MPPE_ADDRESS_MASK;
+
+       mtspr(SPRN_MPPR, mpp_addr | PPC_MPPR_FETCH_ABORT);
+       logmpp(mpp_addr | PPC_LOGMPP_LOG_L2);
+
+       vc->mpp_buffer_is_valid = true;
+}
+
+static void kvmppc_start_restoring_l2_cache(const struct kvmppc_vcore *vc)
+{
+       phys_addr_t phy_addr, mpp_addr;
+
+       phy_addr = virt_to_phys(vc->mpp_buffer);
+       mpp_addr = phy_addr & PPC_MPPE_ADDRESS_MASK;
+
+       /* We must abort any in-progress save operations to ensure
+        * the table is valid so that prefetch engine knows when to
+        * stop prefetching. */
+       logmpp(mpp_addr | PPC_LOGMPP_LOG_ABORT);
+       mtspr(SPRN_MPPR, mpp_addr | PPC_MPPR_FETCH_WHOLE_TABLE);
+}
+
 /*
  * Run a set of guest threads on a physical core.
  * Called with vc->lock held.
@@ -1577,9 +1705,16 @@ static void kvmppc_run_core(struct kvmppc_vcore *vc)
 
        srcu_idx = srcu_read_lock(&vc->kvm->srcu);
 
+       if (vc->mpp_buffer_is_valid)
+               kvmppc_start_restoring_l2_cache(vc);
+
        __kvmppc_vcore_entry();
 
        spin_lock(&vc->lock);
+
+       if (vc->mpp_buffer)
+               kvmppc_start_saving_l2_cache(vc);
+
        /* disable sending of IPIs on virtual external irqs */
        list_for_each_entry(vcpu, &vc->runnable_threads, arch.run_list)
                vcpu->cpu = -1;
@@ -1929,12 +2064,6 @@ static void kvmppc_add_seg_page_size(struct kvm_ppc_one_seg_page_size **sps,
        (*sps)->page_shift = def->shift;
        (*sps)->slb_enc = def->sllp;
        (*sps)->enc[0].page_shift = def->shift;
-       /*
-        * Only return base page encoding. We don't want to return
-        * all the supporting pte_enc, because our H_ENTER doesn't
-        * support MPSS yet. Once they do, we can start passing all
-        * support pte_enc here
-        */
        (*sps)->enc[0].pte_enc = def->penc[linux_psize];
        /*
         * Add 16MB MPSS support if host supports it
@@ -2281,6 +2410,10 @@ static int kvmppc_core_init_vm_hv(struct kvm *kvm)
         */
        cpumask_setall(&kvm->arch.need_tlb_flush);
 
+       /* Start out with the default set of hcalls enabled */
+       memcpy(kvm->arch.enabled_hcalls, default_enabled_hcalls,
+              sizeof(kvm->arch.enabled_hcalls));
+
        kvm->arch.rma = NULL;
 
        kvm->arch.host_sdr1 = mfspr(SPRN_SDR1);
@@ -2323,8 +2456,14 @@ static void kvmppc_free_vcores(struct kvm *kvm)
 {
        long int i;
 
-       for (i = 0; i < KVM_MAX_VCORES; ++i)
+       for (i = 0; i < KVM_MAX_VCORES; ++i) {
+               if (kvm->arch.vcores[i] && kvm->arch.vcores[i]->mpp_buffer) {
+                       struct kvmppc_vcore *vc = kvm->arch.vcores[i];
+                       free_pages((unsigned long)vc->mpp_buffer,
+                                  MPP_BUFFER_ORDER);
+               }
                kfree(kvm->arch.vcores[i]);
+       }
        kvm->arch.online_vcores = 0;
 }
 
@@ -2419,6 +2558,49 @@ static long kvm_arch_vm_ioctl_hv(struct file *filp,
        return r;
 }
 
+/*
+ * List of hcall numbers to enable by default.
+ * For compatibility with old userspace, we enable by default
+ * all hcalls that were implemented before the hcall-enabling
+ * facility was added.  Note this list should not include H_RTAS.
+ */
+static unsigned int default_hcall_list[] = {
+       H_REMOVE,
+       H_ENTER,
+       H_READ,
+       H_PROTECT,
+       H_BULK_REMOVE,
+       H_GET_TCE,
+       H_PUT_TCE,
+       H_SET_DABR,
+       H_SET_XDABR,
+       H_CEDE,
+       H_PROD,
+       H_CONFER,
+       H_REGISTER_VPA,
+#ifdef CONFIG_KVM_XICS
+       H_EOI,
+       H_CPPR,
+       H_IPI,
+       H_IPOLL,
+       H_XIRR,
+       H_XIRR_X,
+#endif
+       0
+};
+
+static void init_default_hcalls(void)
+{
+       int i;
+       unsigned int hcall;
+
+       for (i = 0; default_hcall_list[i]; ++i) {
+               hcall = default_hcall_list[i];
+               WARN_ON(!kvmppc_hcall_impl_hv(hcall));
+               __set_bit(hcall / 4, default_enabled_hcalls);
+       }
+}
+
 static struct kvmppc_ops kvm_ops_hv = {
        .get_sregs = kvm_arch_vcpu_ioctl_get_sregs_hv,
        .set_sregs = kvm_arch_vcpu_ioctl_set_sregs_hv,
@@ -2451,6 +2633,7 @@ static struct kvmppc_ops kvm_ops_hv = {
        .emulate_mfspr = kvmppc_core_emulate_mfspr_hv,
        .fast_vcpu_kick = kvmppc_fast_vcpu_kick_hv,
        .arch_vm_ioctl  = kvm_arch_vm_ioctl_hv,
+       .hcall_implemented = kvmppc_hcall_impl_hv,
 };
 
 static int kvmppc_book3s_init_hv(void)
@@ -2466,6 +2649,8 @@ static int kvmppc_book3s_init_hv(void)
        kvm_ops_hv.owner = THIS_MODULE;
        kvmppc_hv_ops = &kvm_ops_hv;
 
+       init_default_hcalls();
+
        r = kvmppc_mmu_hv_init();
        return r;
 }
index 6cf498a9bc987d62ba335c2e10aabe00dc3f4384..329d7fdd0a6ab7be8b9e203ac53b1870c1d37b0c 100644 (file)
@@ -219,3 +219,16 @@ bool kvm_hv_mode_active(void)
 {
        return atomic_read(&hv_vm_count) != 0;
 }
+
+extern int hcall_real_table[], hcall_real_table_end[];
+
+int kvmppc_hcall_impl_hv_realmode(unsigned long cmd)
+{
+       cmd /= 4;
+       if (cmd < hcall_real_table_end - hcall_real_table &&
+           hcall_real_table[cmd])
+               return 1;
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(kvmppc_hcall_impl_hv_realmode);
index 3a5c568b1e89f43210c9cd2ee0ec9e9d70c62e24..d562c8e2bc30cba62e463588a2cabf9757bebf64 100644 (file)
@@ -45,14 +45,14 @@ static void reload_slb(struct kvm_vcpu *vcpu)
                return;
 
        /* Sanity check */
-       n = min_t(u32, slb->persistent, SLB_MIN_SIZE);
+       n = min_t(u32, be32_to_cpu(slb->persistent), SLB_MIN_SIZE);
        if ((void *) &slb->save_area[n] > vcpu->arch.slb_shadow.pinned_end)
                return;
 
        /* Load up the SLB from that */
        for (i = 0; i < n; ++i) {
-               unsigned long rb = slb->save_area[i].esid;
-               unsigned long rs = slb->save_area[i].vsid;
+               unsigned long rb = be64_to_cpu(slb->save_area[i].esid);
+               unsigned long rs = be64_to_cpu(slb->save_area[i].vsid);
 
                rb = (rb & ~0xFFFul) | i;       /* insert entry number */
                asm volatile("slbmte %0,%1" : : "r" (rs), "r" (rb));
index 5a24d3c2b6b8ce9bb39f59f4c69733b00ca068f6..084ad54c73cd6e9918a73f8a6da2be9abda65311 100644 (file)
@@ -154,10 +154,10 @@ static pte_t lookup_linux_pte_and_update(pgd_t *pgdir, unsigned long hva,
        return kvmppc_read_update_linux_pte(ptep, writing, hugepage_shift);
 }
 
-static inline void unlock_hpte(unsigned long *hpte, unsigned long hpte_v)
+static inline void unlock_hpte(__be64 *hpte, unsigned long hpte_v)
 {
        asm volatile(PPC_RELEASE_BARRIER "" : : : "memory");
-       hpte[0] = hpte_v;
+       hpte[0] = cpu_to_be64(hpte_v);
 }
 
 long kvmppc_do_h_enter(struct kvm *kvm, unsigned long flags,
@@ -166,7 +166,7 @@ long kvmppc_do_h_enter(struct kvm *kvm, unsigned long flags,
 {
        unsigned long i, pa, gpa, gfn, psize;
        unsigned long slot_fn, hva;
-       unsigned long *hpte;
+       __be64 *hpte;
        struct revmap_entry *rev;
        unsigned long g_ptel;
        struct kvm_memory_slot *memslot;
@@ -275,9 +275,9 @@ long kvmppc_do_h_enter(struct kvm *kvm, unsigned long flags,
                return H_PARAMETER;
        if (likely((flags & H_EXACT) == 0)) {
                pte_index &= ~7UL;
-               hpte = (unsigned long *)(kvm->arch.hpt_virt + (pte_index << 4));
+               hpte = (__be64 *)(kvm->arch.hpt_virt + (pte_index << 4));
                for (i = 0; i < 8; ++i) {
-                       if ((*hpte & HPTE_V_VALID) == 0 &&
+                       if ((be64_to_cpu(*hpte) & HPTE_V_VALID) == 0 &&
                            try_lock_hpte(hpte, HPTE_V_HVLOCK | HPTE_V_VALID |
                                          HPTE_V_ABSENT))
                                break;
@@ -292,11 +292,13 @@ long kvmppc_do_h_enter(struct kvm *kvm, unsigned long flags,
                         */
                        hpte -= 16;
                        for (i = 0; i < 8; ++i) {
+                               u64 pte;
                                while (!try_lock_hpte(hpte, HPTE_V_HVLOCK))
                                        cpu_relax();
-                               if (!(*hpte & (HPTE_V_VALID | HPTE_V_ABSENT)))
+                               pte = be64_to_cpu(*hpte);
+                               if (!(pte & (HPTE_V_VALID | HPTE_V_ABSENT)))
                                        break;
-                               *hpte &= ~HPTE_V_HVLOCK;
+                               *hpte &= ~cpu_to_be64(HPTE_V_HVLOCK);
                                hpte += 2;
                        }
                        if (i == 8)
@@ -304,14 +306,17 @@ long kvmppc_do_h_enter(struct kvm *kvm, unsigned long flags,
                }
                pte_index += i;
        } else {
-               hpte = (unsigned long *)(kvm->arch.hpt_virt + (pte_index << 4));
+               hpte = (__be64 *)(kvm->arch.hpt_virt + (pte_index << 4));
                if (!try_lock_hpte(hpte, HPTE_V_HVLOCK | HPTE_V_VALID |
                                   HPTE_V_ABSENT)) {
                        /* Lock the slot and check again */
+                       u64 pte;
+
                        while (!try_lock_hpte(hpte, HPTE_V_HVLOCK))
                                cpu_relax();
-                       if (*hpte & (HPTE_V_VALID | HPTE_V_ABSENT)) {
-                               *hpte &= ~HPTE_V_HVLOCK;
+                       pte = be64_to_cpu(*hpte);
+                       if (pte & (HPTE_V_VALID | HPTE_V_ABSENT)) {
+                               *hpte &= ~cpu_to_be64(HPTE_V_HVLOCK);
                                return H_PTEG_FULL;
                        }
                }
@@ -347,11 +352,11 @@ long kvmppc_do_h_enter(struct kvm *kvm, unsigned long flags,
                }
        }
 
-       hpte[1] = ptel;
+       hpte[1] = cpu_to_be64(ptel);
 
        /* Write the first HPTE dword, unlocking the HPTE and making it valid */
        eieio();
-       hpte[0] = pteh;
+       hpte[0] = cpu_to_be64(pteh);
        asm volatile("ptesync" : : : "memory");
 
        *pte_idx_ret = pte_index;
@@ -468,30 +473,35 @@ long kvmppc_do_h_remove(struct kvm *kvm, unsigned long flags,
                        unsigned long pte_index, unsigned long avpn,
                        unsigned long *hpret)
 {
-       unsigned long *hpte;
+       __be64 *hpte;
        unsigned long v, r, rb;
        struct revmap_entry *rev;
+       u64 pte;
 
        if (pte_index >= kvm->arch.hpt_npte)
                return H_PARAMETER;
-       hpte = (unsigned long *)(kvm->arch.hpt_virt + (pte_index << 4));
+       hpte = (__be64 *)(kvm->arch.hpt_virt + (pte_index << 4));
        while (!try_lock_hpte(hpte, HPTE_V_HVLOCK))
                cpu_relax();
-       if ((hpte[0] & (HPTE_V_ABSENT | HPTE_V_VALID)) == 0 ||
-           ((flags & H_AVPN) && (hpte[0] & ~0x7fUL) != avpn) ||
-           ((flags & H_ANDCOND) && (hpte[0] & avpn) != 0)) {
-               hpte[0] &= ~HPTE_V_HVLOCK;
+       pte = be64_to_cpu(hpte[0]);
+       if ((pte & (HPTE_V_ABSENT | HPTE_V_VALID)) == 0 ||
+           ((flags & H_AVPN) && (pte & ~0x7fUL) != avpn) ||
+           ((flags & H_ANDCOND) && (pte & avpn) != 0)) {
+               hpte[0] &= ~cpu_to_be64(HPTE_V_HVLOCK);
                return H_NOT_FOUND;
        }
 
        rev = real_vmalloc_addr(&kvm->arch.revmap[pte_index]);
-       v = hpte[0] & ~HPTE_V_HVLOCK;
+       v = pte & ~HPTE_V_HVLOCK;
        if (v & HPTE_V_VALID) {
-               hpte[0] &= ~HPTE_V_VALID;
-               rb = compute_tlbie_rb(v, hpte[1], pte_index);
+               u64 pte1;
+
+               pte1 = be64_to_cpu(hpte[1]);
+               hpte[0] &= ~cpu_to_be64(HPTE_V_VALID);
+               rb = compute_tlbie_rb(v, pte1, pte_index);
                do_tlbies(kvm, &rb, 1, global_invalidates(kvm, flags), true);
                /* Read PTE low word after tlbie to get final R/C values */
-               remove_revmap_chain(kvm, pte_index, rev, v, hpte[1]);
+               remove_revmap_chain(kvm, pte_index, rev, v, pte1);
        }
        r = rev->guest_rpte & ~HPTE_GR_RESERVED;
        note_hpte_modification(kvm, rev);
@@ -514,12 +524,14 @@ long kvmppc_h_bulk_remove(struct kvm_vcpu *vcpu)
 {
        struct kvm *kvm = vcpu->kvm;
        unsigned long *args = &vcpu->arch.gpr[4];
-       unsigned long *hp, *hptes[4], tlbrb[4];
+       __be64 *hp, *hptes[4];
+       unsigned long tlbrb[4];
        long int i, j, k, n, found, indexes[4];
        unsigned long flags, req, pte_index, rcbits;
        int global;
        long int ret = H_SUCCESS;
        struct revmap_entry *rev, *revs[4];
+       u64 hp0;
 
        global = global_invalidates(kvm, 0);
        for (i = 0; i < 4 && ret == H_SUCCESS; ) {
@@ -542,8 +554,7 @@ long kvmppc_h_bulk_remove(struct kvm_vcpu *vcpu)
                                ret = H_PARAMETER;
                                break;
                        }
-                       hp = (unsigned long *)
-                               (kvm->arch.hpt_virt + (pte_index << 4));
+                       hp = (__be64 *) (kvm->arch.hpt_virt + (pte_index << 4));
                        /* to avoid deadlock, don't spin except for first */
                        if (!try_lock_hpte(hp, HPTE_V_HVLOCK)) {
                                if (n)
@@ -552,23 +563,24 @@ long kvmppc_h_bulk_remove(struct kvm_vcpu *vcpu)
                                        cpu_relax();
                        }
                        found = 0;
-                       if (hp[0] & (HPTE_V_ABSENT | HPTE_V_VALID)) {
+                       hp0 = be64_to_cpu(hp[0]);
+                       if (hp0 & (HPTE_V_ABSENT | HPTE_V_VALID)) {
                                switch (flags & 3) {
                                case 0:         /* absolute */
                                        found = 1;
                                        break;
                                case 1:         /* andcond */
-                                       if (!(hp[0] & args[j + 1]))
+                                       if (!(hp0 & args[j + 1]))
                                                found = 1;
                                        break;
                                case 2:         /* AVPN */
-                                       if ((hp[0] & ~0x7fUL) == args[j + 1])
+                                       if ((hp0 & ~0x7fUL) == args[j + 1])
                                                found = 1;
                                        break;
                                }
                        }
                        if (!found) {
-                               hp[0] &= ~HPTE_V_HVLOCK;
+                               hp[0] &= ~cpu_to_be64(HPTE_V_HVLOCK);
                                args[j] = ((0x90 | flags) << 56) + pte_index;
                                continue;
                        }
@@ -577,7 +589,7 @@ long kvmppc_h_bulk_remove(struct kvm_vcpu *vcpu)
                        rev = real_vmalloc_addr(&kvm->arch.revmap[pte_index]);
                        note_hpte_modification(kvm, rev);
 
-                       if (!(hp[0] & HPTE_V_VALID)) {
+                       if (!(hp0 & HPTE_V_VALID)) {
                                /* insert R and C bits from PTE */
                                rcbits = rev->guest_rpte & (HPTE_R_R|HPTE_R_C);
                                args[j] |= rcbits << (56 - 5);
@@ -585,8 +597,10 @@ long kvmppc_h_bulk_remove(struct kvm_vcpu *vcpu)
                                continue;
                        }
 
-                       hp[0] &= ~HPTE_V_VALID;         /* leave it locked */
-                       tlbrb[n] = compute_tlbie_rb(hp[0], hp[1], pte_index);
+                       /* leave it locked */
+                       hp[0] &= ~cpu_to_be64(HPTE_V_VALID);
+                       tlbrb[n] = compute_tlbie_rb(be64_to_cpu(hp[0]),
+                               be64_to_cpu(hp[1]), pte_index);
                        indexes[n] = j;
                        hptes[n] = hp;
                        revs[n] = rev;
@@ -605,7 +619,8 @@ long kvmppc_h_bulk_remove(struct kvm_vcpu *vcpu)
                        pte_index = args[j] & ((1ul << 56) - 1);
                        hp = hptes[k];
                        rev = revs[k];
-                       remove_revmap_chain(kvm, pte_index, rev, hp[0], hp[1]);
+                       remove_revmap_chain(kvm, pte_index, rev,
+                               be64_to_cpu(hp[0]), be64_to_cpu(hp[1]));
                        rcbits = rev->guest_rpte & (HPTE_R_R|HPTE_R_C);
                        args[j] |= rcbits << (56 - 5);
                        hp[0] = 0;
@@ -620,23 +635,25 @@ long kvmppc_h_protect(struct kvm_vcpu *vcpu, unsigned long flags,
                      unsigned long va)
 {
        struct kvm *kvm = vcpu->kvm;
-       unsigned long *hpte;
+       __be64 *hpte;
        struct revmap_entry *rev;
        unsigned long v, r, rb, mask, bits;
+       u64 pte;
 
        if (pte_index >= kvm->arch.hpt_npte)
                return H_PARAMETER;
 
-       hpte = (unsigned long *)(kvm->arch.hpt_virt + (pte_index << 4));
+       hpte = (__be64 *)(kvm->arch.hpt_virt + (pte_index << 4));
        while (!try_lock_hpte(hpte, HPTE_V_HVLOCK))
                cpu_relax();
-       if ((hpte[0] & (HPTE_V_ABSENT | HPTE_V_VALID)) == 0 ||
-           ((flags & H_AVPN) && (hpte[0] & ~0x7fUL) != avpn)) {
-               hpte[0] &= ~HPTE_V_HVLOCK;
+       pte = be64_to_cpu(hpte[0]);
+       if ((pte & (HPTE_V_ABSENT | HPTE_V_VALID)) == 0 ||
+           ((flags & H_AVPN) && (pte & ~0x7fUL) != avpn)) {
+               hpte[0] &= ~cpu_to_be64(HPTE_V_HVLOCK);
                return H_NOT_FOUND;
        }
 
-       v = hpte[0];
+       v = pte;
        bits = (flags << 55) & HPTE_R_PP0;
        bits |= (flags << 48) & HPTE_R_KEY_HI;
        bits |= flags & (HPTE_R_PP | HPTE_R_N | HPTE_R_KEY_LO);
@@ -650,12 +667,12 @@ long kvmppc_h_protect(struct kvm_vcpu *vcpu, unsigned long flags,
                rev->guest_rpte = r;
                note_hpte_modification(kvm, rev);
        }
-       r = (hpte[1] & ~mask) | bits;
+       r = (be64_to_cpu(hpte[1]) & ~mask) | bits;
 
        /* Update HPTE */
        if (v & HPTE_V_VALID) {
                rb = compute_tlbie_rb(v, r, pte_index);
-               hpte[0] = v & ~HPTE_V_VALID;
+               hpte[0] = cpu_to_be64(v & ~HPTE_V_VALID);
                do_tlbies(kvm, &rb, 1, global_invalidates(kvm, flags), true);
                /*
                 * If the host has this page as readonly but the guest
@@ -681,9 +698,9 @@ long kvmppc_h_protect(struct kvm_vcpu *vcpu, unsigned long flags,
                        }
                }
        }
-       hpte[1] = r;
+       hpte[1] = cpu_to_be64(r);
        eieio();
-       hpte[0] = v & ~HPTE_V_HVLOCK;
+       hpte[0] = cpu_to_be64(v & ~HPTE_V_HVLOCK);
        asm volatile("ptesync" : : : "memory");
        return H_SUCCESS;
 }
@@ -692,7 +709,8 @@ long kvmppc_h_read(struct kvm_vcpu *vcpu, unsigned long flags,
                   unsigned long pte_index)
 {
        struct kvm *kvm = vcpu->kvm;
-       unsigned long *hpte, v, r;
+       __be64 *hpte;
+       unsigned long v, r;
        int i, n = 1;
        struct revmap_entry *rev = NULL;
 
@@ -704,9 +722,9 @@ long kvmppc_h_read(struct kvm_vcpu *vcpu, unsigned long flags,
        }
        rev = real_vmalloc_addr(&kvm->arch.revmap[pte_index]);
        for (i = 0; i < n; ++i, ++pte_index) {
-               hpte = (unsigned long *)(kvm->arch.hpt_virt + (pte_index << 4));
-               v = hpte[0] & ~HPTE_V_HVLOCK;
-               r = hpte[1];
+               hpte = (__be64 *)(kvm->arch.hpt_virt + (pte_index << 4));
+               v = be64_to_cpu(hpte[0]) & ~HPTE_V_HVLOCK;
+               r = be64_to_cpu(hpte[1]);
                if (v & HPTE_V_ABSENT) {
                        v &= ~HPTE_V_ABSENT;
                        v |= HPTE_V_VALID;
@@ -721,25 +739,27 @@ long kvmppc_h_read(struct kvm_vcpu *vcpu, unsigned long flags,
        return H_SUCCESS;
 }
 
-void kvmppc_invalidate_hpte(struct kvm *kvm, unsigned long *hptep,
+void kvmppc_invalidate_hpte(struct kvm *kvm, __be64 *hptep,
                        unsigned long pte_index)
 {
        unsigned long rb;
 
-       hptep[0] &= ~HPTE_V_VALID;
-       rb = compute_tlbie_rb(hptep[0], hptep[1], pte_index);
+       hptep[0] &= ~cpu_to_be64(HPTE_V_VALID);
+       rb = compute_tlbie_rb(be64_to_cpu(hptep[0]), be64_to_cpu(hptep[1]),
+                             pte_index);
        do_tlbies(kvm, &rb, 1, 1, true);
 }
 EXPORT_SYMBOL_GPL(kvmppc_invalidate_hpte);
 
-void kvmppc_clear_ref_hpte(struct kvm *kvm, unsigned long *hptep,
+void kvmppc_clear_ref_hpte(struct kvm *kvm, __be64 *hptep,
                           unsigned long pte_index)
 {
        unsigned long rb;
        unsigned char rbyte;
 
-       rb = compute_tlbie_rb(hptep[0], hptep[1], pte_index);
-       rbyte = (hptep[1] & ~HPTE_R_R) >> 8;
+       rb = compute_tlbie_rb(be64_to_cpu(hptep[0]), be64_to_cpu(hptep[1]),
+                             pte_index);
+       rbyte = (be64_to_cpu(hptep[1]) & ~HPTE_R_R) >> 8;
        /* modify only the second-last byte, which contains the ref bit */
        *((char *)hptep + 14) = rbyte;
        do_tlbies(kvm, &rb, 1, 1, false);
@@ -765,7 +785,7 @@ long kvmppc_hv_find_lock_hpte(struct kvm *kvm, gva_t eaddr, unsigned long slb_v,
        unsigned long somask;
        unsigned long vsid, hash;
        unsigned long avpn;
-       unsigned long *hpte;
+       __be64 *hpte;
        unsigned long mask, val;
        unsigned long v, r;
 
@@ -797,11 +817,11 @@ long kvmppc_hv_find_lock_hpte(struct kvm *kvm, gva_t eaddr, unsigned long slb_v,
        val |= avpn;
 
        for (;;) {
-               hpte = (unsigned long *)(kvm->arch.hpt_virt + (hash << 7));
+               hpte = (__be64 *)(kvm->arch.hpt_virt + (hash << 7));
 
                for (i = 0; i < 16; i += 2) {
                        /* Read the PTE racily */
-                       v = hpte[i] & ~HPTE_V_HVLOCK;
+                       v = be64_to_cpu(hpte[i]) & ~HPTE_V_HVLOCK;
 
                        /* Check valid/absent, hash, segment size and AVPN */
                        if (!(v & valid) || (v & mask) != val)
@@ -810,8 +830,8 @@ long kvmppc_hv_find_lock_hpte(struct kvm *kvm, gva_t eaddr, unsigned long slb_v,
                        /* Lock the PTE and read it under the lock */
                        while (!try_lock_hpte(&hpte[i], HPTE_V_HVLOCK))
                                cpu_relax();
-                       v = hpte[i] & ~HPTE_V_HVLOCK;
-                       r = hpte[i+1];
+                       v = be64_to_cpu(hpte[i]) & ~HPTE_V_HVLOCK;
+                       r = be64_to_cpu(hpte[i+1]);
 
                        /*
                         * Check the HPTE again, including base page size
@@ -822,7 +842,7 @@ long kvmppc_hv_find_lock_hpte(struct kvm *kvm, gva_t eaddr, unsigned long slb_v,
                                return (hash << 3) + (i >> 1);
 
                        /* Unlock and move on */
-                       hpte[i] = v;
+                       hpte[i] = cpu_to_be64(v);
                }
 
                if (val & HPTE_V_SECONDARY)
@@ -851,7 +871,7 @@ long kvmppc_hpte_hv_fault(struct kvm_vcpu *vcpu, unsigned long addr,
        struct kvm *kvm = vcpu->kvm;
        long int index;
        unsigned long v, r, gr;
-       unsigned long *hpte;
+       __be64 *hpte;
        unsigned long valid;
        struct revmap_entry *rev;
        unsigned long pp, key;
@@ -867,9 +887,9 @@ long kvmppc_hpte_hv_fault(struct kvm_vcpu *vcpu, unsigned long addr,
                        return status;  /* there really was no HPTE */
                return 0;               /* for prot fault, HPTE disappeared */
        }
-       hpte = (unsigned long *)(kvm->arch.hpt_virt + (index << 4));
-       v = hpte[0] & ~HPTE_V_HVLOCK;
-       r = hpte[1];
+       hpte = (__be64 *)(kvm->arch.hpt_virt + (index << 4));
+       v = be64_to_cpu(hpte[0]) & ~HPTE_V_HVLOCK;
+       r = be64_to_cpu(hpte[1]);
        rev = real_vmalloc_addr(&kvm->arch.revmap[index]);
        gr = rev->guest_rpte;
 
index b4b0082f761c4a25dc66ec278e8d3ed990a90151..3ee38e6e884f5e786df84500d0912ff4454f5ef2 100644 (file)
@@ -401,6 +401,11 @@ int kvmppc_rm_h_eoi(struct kvm_vcpu *vcpu, unsigned long xirr)
                icp->rm_action |= XICS_RM_REJECT;
                icp->rm_reject = irq;
        }
+
+       if (!hlist_empty(&vcpu->kvm->irq_ack_notifier_list)) {
+               icp->rm_action |= XICS_RM_NOTIFY_EOI;
+               icp->rm_eoied_irq = irq;
+       }
  bail:
        return check_too_hard(xics, icp);
 }
index 7faf8fd057389298074e8f4a783ef152d0d5f9be..f0c4db7704c37d13a2a4a2ef82a7a69ec673f2f7 100644 (file)
 
 #define VCPU_GPRS_TM(reg) (((reg) * ULONG_SIZE) + VCPU_GPR_TM)
 
-#ifdef __LITTLE_ENDIAN__
-#error Need to fix lppaca and SLB shadow accesses in little endian mode
-#endif
-
 /* Values in HSTATE_NAPPING(r13) */
 #define NAPPING_CEDE   1
 #define NAPPING_NOVCPU 2
@@ -601,9 +597,10 @@ kvmppc_got_guest:
        ld      r3, VCPU_VPA(r4)
        cmpdi   r3, 0
        beq     25f
-       lwz     r5, LPPACA_YIELDCOUNT(r3)
+       li      r6, LPPACA_YIELDCOUNT
+       LWZX_BE r5, r3, r6
        addi    r5, r5, 1
-       stw     r5, LPPACA_YIELDCOUNT(r3)
+       STWX_BE r5, r3, r6
        li      r6, 1
        stb     r6, VCPU_VPA_DIRTY(r4)
 25:
@@ -677,9 +674,9 @@ END_FTR_SECTION_IFCLR(CPU_FTR_TM)
 
        mr      r31, r4
        addi    r3, r31, VCPU_FPRS_TM
-       bl      .load_fp_state
+       bl      load_fp_state
        addi    r3, r31, VCPU_VRS_TM
-       bl      .load_vr_state
+       bl      load_vr_state
        mr      r4, r31
        lwz     r7, VCPU_VRSAVE_TM(r4)
        mtspr   SPRN_VRSAVE, r7
@@ -1423,9 +1420,9 @@ END_FTR_SECTION_IFCLR(CPU_FTR_TM)
 
        /* Save FP/VSX. */
        addi    r3, r9, VCPU_FPRS_TM
-       bl      .store_fp_state
+       bl      store_fp_state
        addi    r3, r9, VCPU_VRS_TM
-       bl      .store_vr_state
+       bl      store_vr_state
        mfspr   r6, SPRN_VRSAVE
        stw     r6, VCPU_VRSAVE_TM(r9)
 1:
@@ -1448,9 +1445,10 @@ END_FTR_SECTION_IFCLR(CPU_FTR_TM)
        ld      r8, VCPU_VPA(r9)        /* do they have a VPA? */
        cmpdi   r8, 0
        beq     25f
-       lwz     r3, LPPACA_YIELDCOUNT(r8)
+       li      r4, LPPACA_YIELDCOUNT
+       LWZX_BE r3, r8, r4
        addi    r3, r3, 1
-       stw     r3, LPPACA_YIELDCOUNT(r8)
+       STWX_BE r3, r8, r4
        li      r3, 1
        stb     r3, VCPU_VPA_DIRTY(r9)
 25:
@@ -1763,8 +1761,10 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
 33:    ld      r8,PACA_SLBSHADOWPTR(r13)
 
        .rept   SLB_NUM_BOLTED
-       ld      r5,SLBSHADOW_SAVEAREA(r8)
-       ld      r6,SLBSHADOW_SAVEAREA+8(r8)
+       li      r3, SLBSHADOW_SAVEAREA
+       LDX_BE  r5, r8, r3
+       addi    r3, r3, 8
+       LDX_BE  r6, r8, r3
        andis.  r7,r5,SLB_ESID_V@h
        beq     1f
        slbmte  r6,r5
@@ -1915,12 +1915,23 @@ hcall_try_real_mode:
        clrrdi  r3,r3,2
        cmpldi  r3,hcall_real_table_end - hcall_real_table
        bge     guest_exit_cont
+       /* See if this hcall is enabled for in-kernel handling */
+       ld      r4, VCPU_KVM(r9)
+       srdi    r0, r3, 8       /* r0 = (r3 / 4) >> 6 */
+       sldi    r0, r0, 3       /* index into kvm->arch.enabled_hcalls[] */
+       add     r4, r4, r0
+       ld      r0, KVM_ENABLED_HCALLS(r4)
+       rlwinm  r4, r3, 32-2, 0x3f      /* r4 = (r3 / 4) & 0x3f */
+       srd     r0, r0, r4
+       andi.   r0, r0, 1
+       beq     guest_exit_cont
+       /* Get pointer to handler, if any, and call it */
        LOAD_REG_ADDR(r4, hcall_real_table)
        lwax    r3,r3,r4
        cmpwi   r3,0
        beq     guest_exit_cont
-       add     r3,r3,r4
-       mtctr   r3
+       add     r12,r3,r4
+       mtctr   r12
        mr      r3,r9           /* get vcpu pointer */
        ld      r4,VCPU_GPR(R4)(r9)
        bctrl
@@ -2037,6 +2048,7 @@ hcall_real_table:
        .long   0               /* 0x12c */
        .long   0               /* 0x130 */
        .long   DOTSYM(kvmppc_h_set_xdabr) - hcall_real_table
+       .globl  hcall_real_table_end
 hcall_real_table_end:
 
 ignore_hdec:
@@ -2344,7 +2356,18 @@ kvmppc_read_intr:
        cmpdi   r6, 0
        beq-    1f
        lwzcix  r0, r6, r7
-       rlwinm. r3, r0, 0, 0xffffff
+       /*
+        * Save XIRR for later. Since we get in in reverse endian on LE
+        * systems, save it byte reversed and fetch it back in host endian.
+        */
+       li      r3, HSTATE_SAVED_XIRR
+       STWX_BE r0, r3, r13
+#ifdef __LITTLE_ENDIAN__
+       lwz     r3, HSTATE_SAVED_XIRR(r13)
+#else
+       mr      r3, r0
+#endif
+       rlwinm. r3, r3, 0, 0xffffff
        sync
        beq     1f                      /* if nothing pending in the ICP */
 
@@ -2376,10 +2399,9 @@ kvmppc_read_intr:
        li      r3, -1
 1:     blr
 
-42:    /* It's not an IPI and it's for the host, stash it in the PACA
-        * before exit, it will be picked up by the host ICP driver
+42:    /* It's not an IPI and it's for the host. We saved a copy of XIRR in
+        * the PACA earlier, it will be picked up by the host ICP driver
         */
-       stw     r0, HSTATE_SAVED_XIRR(r13)
        li      r3, 1
        b       1b
 
@@ -2414,11 +2436,11 @@ END_FTR_SECTION_IFSET(CPU_FTR_VSX)
        mtmsrd  r8
        isync
        addi    r3,r3,VCPU_FPRS
-       bl      .store_fp_state
+       bl      store_fp_state
 #ifdef CONFIG_ALTIVEC
 BEGIN_FTR_SECTION
        addi    r3,r31,VCPU_VRS
-       bl      .store_vr_state
+       bl      store_vr_state
 END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
 #endif
        mfspr   r6,SPRN_VRSAVE
@@ -2450,11 +2472,11 @@ END_FTR_SECTION_IFSET(CPU_FTR_VSX)
        mtmsrd  r8
        isync
        addi    r3,r4,VCPU_FPRS
-       bl      .load_fp_state
+       bl      load_fp_state
 #ifdef CONFIG_ALTIVEC
 BEGIN_FTR_SECTION
        addi    r3,r31,VCPU_VRS
-       bl      .load_vr_state
+       bl      load_vr_state
 END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
 #endif
        lwz     r7,VCPU_VRSAVE(r31)
index 6c8011fd57e621fd702dfd5bb1259d81e9718ada..bfb8035314e3c312f90daa56bc391ff90d0bd816 100644 (file)
@@ -639,26 +639,36 @@ static int kvmppc_ps_one_in(struct kvm_vcpu *vcpu, bool rc,
 
 int kvmppc_emulate_paired_single(struct kvm_run *run, struct kvm_vcpu *vcpu)
 {
-       u32 inst = kvmppc_get_last_inst(vcpu);
+       u32 inst;
        enum emulation_result emulated = EMULATE_DONE;
+       int ax_rd, ax_ra, ax_rb, ax_rc;
+       short full_d;
+       u64 *fpr_d, *fpr_a, *fpr_b, *fpr_c;
 
-       int ax_rd = inst_get_field(inst, 6, 10);
-       int ax_ra = inst_get_field(inst, 11, 15);
-       int ax_rb = inst_get_field(inst, 16, 20);
-       int ax_rc = inst_get_field(inst, 21, 25);
-       short full_d = inst_get_field(inst, 16, 31);
-
-       u64 *fpr_d = &VCPU_FPR(vcpu, ax_rd);
-       u64 *fpr_a = &VCPU_FPR(vcpu, ax_ra);
-       u64 *fpr_b = &VCPU_FPR(vcpu, ax_rb);
-       u64 *fpr_c = &VCPU_FPR(vcpu, ax_rc);
-
-       bool rcomp = (inst & 1) ? true : false;
-       u32 cr = kvmppc_get_cr(vcpu);
+       bool rcomp;
+       u32 cr;
 #ifdef DEBUG
        int i;
 #endif
 
+       emulated = kvmppc_get_last_inst(vcpu, INST_GENERIC, &inst);
+       if (emulated != EMULATE_DONE)
+               return emulated;
+
+       ax_rd = inst_get_field(inst, 6, 10);
+       ax_ra = inst_get_field(inst, 11, 15);
+       ax_rb = inst_get_field(inst, 16, 20);
+       ax_rc = inst_get_field(inst, 21, 25);
+       full_d = inst_get_field(inst, 16, 31);
+
+       fpr_d = &VCPU_FPR(vcpu, ax_rd);
+       fpr_a = &VCPU_FPR(vcpu, ax_ra);
+       fpr_b = &VCPU_FPR(vcpu, ax_rb);
+       fpr_c = &VCPU_FPR(vcpu, ax_rc);
+
+       rcomp = (inst & 1) ? true : false;
+       cr = kvmppc_get_cr(vcpu);
+
        if (!kvmppc_inst_is_paired_single(vcpu, inst))
                return EMULATE_FAIL;
 
index 8eef1e5190773c9c290bf46581e7fd025f7dfaeb..faffb27badd9de362465c6a8ea12052cb7ab53ef 100644 (file)
@@ -62,6 +62,35 @@ static void kvmppc_giveup_fac(struct kvm_vcpu *vcpu, ulong fac);
 #define HW_PAGE_SIZE PAGE_SIZE
 #endif
 
+static bool kvmppc_is_split_real(struct kvm_vcpu *vcpu)
+{
+       ulong msr = kvmppc_get_msr(vcpu);
+       return (msr & (MSR_IR|MSR_DR)) == MSR_DR;
+}
+
+static void kvmppc_fixup_split_real(struct kvm_vcpu *vcpu)
+{
+       ulong msr = kvmppc_get_msr(vcpu);
+       ulong pc = kvmppc_get_pc(vcpu);
+
+       /* We are in DR only split real mode */
+       if ((msr & (MSR_IR|MSR_DR)) != MSR_DR)
+               return;
+
+       /* We have not fixed up the guest already */
+       if (vcpu->arch.hflags & BOOK3S_HFLAG_SPLIT_HACK)
+               return;
+
+       /* The code is in fixupable address space */
+       if (pc & SPLIT_HACK_MASK)
+               return;
+
+       vcpu->arch.hflags |= BOOK3S_HFLAG_SPLIT_HACK;
+       kvmppc_set_pc(vcpu, pc | SPLIT_HACK_OFFS);
+}
+
+void kvmppc_unfixup_split_real(struct kvm_vcpu *vcpu);
+
 static void kvmppc_core_vcpu_load_pr(struct kvm_vcpu *vcpu, int cpu)
 {
 #ifdef CONFIG_PPC_BOOK3S_64
@@ -71,10 +100,19 @@ static void kvmppc_core_vcpu_load_pr(struct kvm_vcpu *vcpu, int cpu)
        svcpu->in_use = 0;
        svcpu_put(svcpu);
 #endif
+
+       /* Disable AIL if supported */
+       if (cpu_has_feature(CPU_FTR_HVMODE) &&
+           cpu_has_feature(CPU_FTR_ARCH_207S))
+               mtspr(SPRN_LPCR, mfspr(SPRN_LPCR) & ~LPCR_AIL);
+
        vcpu->cpu = smp_processor_id();
 #ifdef CONFIG_PPC_BOOK3S_32
        current->thread.kvm_shadow_vcpu = vcpu->arch.shadow_vcpu;
 #endif
+
+       if (kvmppc_is_split_real(vcpu))
+               kvmppc_fixup_split_real(vcpu);
 }
 
 static void kvmppc_core_vcpu_put_pr(struct kvm_vcpu *vcpu)
@@ -89,8 +127,17 @@ static void kvmppc_core_vcpu_put_pr(struct kvm_vcpu *vcpu)
        svcpu_put(svcpu);
 #endif
 
+       if (kvmppc_is_split_real(vcpu))
+               kvmppc_unfixup_split_real(vcpu);
+
        kvmppc_giveup_ext(vcpu, MSR_FP | MSR_VEC | MSR_VSX);
        kvmppc_giveup_fac(vcpu, FSCR_TAR_LG);
+
+       /* Enable AIL if supported */
+       if (cpu_has_feature(CPU_FTR_HVMODE) &&
+           cpu_has_feature(CPU_FTR_ARCH_207S))
+               mtspr(SPRN_LPCR, mfspr(SPRN_LPCR) | LPCR_AIL_3);
+
        vcpu->cpu = -1;
 }
 
@@ -120,6 +167,14 @@ void kvmppc_copy_to_svcpu(struct kvmppc_book3s_shadow_vcpu *svcpu,
 #ifdef CONFIG_PPC_BOOK3S_64
        svcpu->shadow_fscr = vcpu->arch.shadow_fscr;
 #endif
+       /*
+        * Now also save the current time base value. We use this
+        * to find the guest purr and spurr value.
+        */
+       vcpu->arch.entry_tb = get_tb();
+       vcpu->arch.entry_vtb = get_vtb();
+       if (cpu_has_feature(CPU_FTR_ARCH_207S))
+               vcpu->arch.entry_ic = mfspr(SPRN_IC);
        svcpu->in_use = true;
 }
 
@@ -166,6 +221,14 @@ void kvmppc_copy_from_svcpu(struct kvm_vcpu *vcpu,
 #ifdef CONFIG_PPC_BOOK3S_64
        vcpu->arch.shadow_fscr = svcpu->shadow_fscr;
 #endif
+       /*
+        * Update purr and spurr using time base on exit.
+        */
+       vcpu->arch.purr += get_tb() - vcpu->arch.entry_tb;
+       vcpu->arch.spurr += get_tb() - vcpu->arch.entry_tb;
+       vcpu->arch.vtb += get_vtb() - vcpu->arch.entry_vtb;
+       if (cpu_has_feature(CPU_FTR_ARCH_207S))
+               vcpu->arch.ic += mfspr(SPRN_IC) - vcpu->arch.entry_ic;
        svcpu->in_use = false;
 
 out:
@@ -294,6 +357,11 @@ static void kvmppc_set_msr_pr(struct kvm_vcpu *vcpu, u64 msr)
                }
        }
 
+       if (kvmppc_is_split_real(vcpu))
+               kvmppc_fixup_split_real(vcpu);
+       else
+               kvmppc_unfixup_split_real(vcpu);
+
        if ((kvmppc_get_msr(vcpu) & (MSR_PR|MSR_IR|MSR_DR)) !=
                   (old_msr & (MSR_PR|MSR_IR|MSR_DR))) {
                kvmppc_mmu_flush_segments(vcpu);
@@ -443,19 +511,19 @@ static void kvmppc_patch_dcbz(struct kvm_vcpu *vcpu, struct kvmppc_pte *pte)
        put_page(hpage);
 }
 
-static int kvmppc_visible_gfn(struct kvm_vcpu *vcpu, gfn_t gfn)
+static int kvmppc_visible_gpa(struct kvm_vcpu *vcpu, gpa_t gpa)
 {
        ulong mp_pa = vcpu->arch.magic_page_pa;
 
        if (!(kvmppc_get_msr(vcpu) & MSR_SF))
                mp_pa = (uint32_t)mp_pa;
 
-       if (unlikely(mp_pa) &&
-           unlikely((mp_pa & KVM_PAM) >> PAGE_SHIFT == gfn)) {
+       gpa &= ~0xFFFULL;
+       if (unlikely(mp_pa) && unlikely((mp_pa & KVM_PAM) == (gpa & KVM_PAM))) {
                return 1;
        }
 
-       return kvm_is_visible_gfn(vcpu->kvm, gfn);
+       return kvm_is_visible_gfn(vcpu->kvm, gpa >> PAGE_SHIFT);
 }
 
 int kvmppc_handle_pagefault(struct kvm_run *run, struct kvm_vcpu *vcpu,
@@ -494,6 +562,11 @@ int kvmppc_handle_pagefault(struct kvm_run *run, struct kvm_vcpu *vcpu,
                pte.vpage |= ((u64)VSID_REAL << (SID_SHIFT - 12));
                break;
        case MSR_DR:
+               if (!data &&
+                   (vcpu->arch.hflags & BOOK3S_HFLAG_SPLIT_HACK) &&
+                   ((pte.raddr & SPLIT_HACK_MASK) == SPLIT_HACK_OFFS))
+                       pte.raddr &= ~SPLIT_HACK_MASK;
+               /* fall through */
        case MSR_IR:
                vcpu->arch.mmu.esid_to_vsid(vcpu, eaddr >> SID_SHIFT, &vsid);
 
@@ -541,7 +614,7 @@ int kvmppc_handle_pagefault(struct kvm_run *run, struct kvm_vcpu *vcpu,
                kvmppc_set_dar(vcpu, kvmppc_get_fault_dar(vcpu));
                kvmppc_book3s_queue_irqprio(vcpu, vec + 0x80);
        } else if (!is_mmio &&
-                  kvmppc_visible_gfn(vcpu, pte.raddr >> PAGE_SHIFT)) {
+                  kvmppc_visible_gpa(vcpu, pte.raddr)) {
                if (data && !(vcpu->arch.fault_dsisr & DSISR_NOHPTE)) {
                        /*
                         * There is already a host HPTE there, presumably
@@ -637,42 +710,6 @@ static void kvmppc_giveup_fac(struct kvm_vcpu *vcpu, ulong fac)
 #endif
 }
 
-static int kvmppc_read_inst(struct kvm_vcpu *vcpu)
-{
-       ulong srr0 = kvmppc_get_pc(vcpu);
-       u32 last_inst = kvmppc_get_last_inst(vcpu);
-       int ret;
-
-       ret = kvmppc_ld(vcpu, &srr0, sizeof(u32), &last_inst, false);
-       if (ret == -ENOENT) {
-               ulong msr = kvmppc_get_msr(vcpu);
-
-               msr = kvmppc_set_field(msr, 33, 33, 1);
-               msr = kvmppc_set_field(msr, 34, 36, 0);
-               msr = kvmppc_set_field(msr, 42, 47, 0);
-               kvmppc_set_msr_fast(vcpu, msr);
-               kvmppc_book3s_queue_irqprio(vcpu, BOOK3S_INTERRUPT_INST_STORAGE);
-               return EMULATE_AGAIN;
-       }
-
-       return EMULATE_DONE;
-}
-
-static int kvmppc_check_ext(struct kvm_vcpu *vcpu, unsigned int exit_nr)
-{
-
-       /* Need to do paired single emulation? */
-       if (!(vcpu->arch.hflags & BOOK3S_HFLAG_PAIRED_SINGLE))
-               return EMULATE_DONE;
-
-       /* Read out the instruction */
-       if (kvmppc_read_inst(vcpu) == EMULATE_DONE)
-               /* Need to emulate */
-               return EMULATE_FAIL;
-
-       return EMULATE_AGAIN;
-}
-
 /* Handle external providers (FPU, Altivec, VSX) */
 static int kvmppc_handle_ext(struct kvm_vcpu *vcpu, unsigned int exit_nr,
                             ulong msr)
@@ -834,6 +871,15 @@ static int kvmppc_handle_fac(struct kvm_vcpu *vcpu, ulong fac)
 
        return RESUME_GUEST;
 }
+
+void kvmppc_set_fscr(struct kvm_vcpu *vcpu, u64 fscr)
+{
+       if ((vcpu->arch.fscr & FSCR_TAR) && !(fscr & FSCR_TAR)) {
+               /* TAR got dropped, drop it in shadow too */
+               kvmppc_giveup_fac(vcpu, FSCR_TAR_LG);
+       }
+       vcpu->arch.fscr = fscr;
+}
 #endif
 
 int kvmppc_handle_exit_pr(struct kvm_run *run, struct kvm_vcpu *vcpu,
@@ -858,6 +904,9 @@ int kvmppc_handle_exit_pr(struct kvm_run *run, struct kvm_vcpu *vcpu,
                ulong shadow_srr1 = vcpu->arch.shadow_srr1;
                vcpu->stat.pf_instruc++;
 
+               if (kvmppc_is_split_real(vcpu))
+                       kvmppc_fixup_split_real(vcpu);
+
 #ifdef CONFIG_PPC_BOOK3S_32
                /* We set segments as unused segments when invalidating them. So
                 * treat the respective fault as segment fault. */
@@ -960,6 +1009,7 @@ int kvmppc_handle_exit_pr(struct kvm_run *run, struct kvm_vcpu *vcpu,
        case BOOK3S_INTERRUPT_DECREMENTER:
        case BOOK3S_INTERRUPT_HV_DECREMENTER:
        case BOOK3S_INTERRUPT_DOORBELL:
+       case BOOK3S_INTERRUPT_H_DOORBELL:
                vcpu->stat.dec_exits++;
                r = RESUME_GUEST;
                break;
@@ -977,15 +1027,24 @@ int kvmppc_handle_exit_pr(struct kvm_run *run, struct kvm_vcpu *vcpu,
        {
                enum emulation_result er;
                ulong flags;
+               u32 last_inst;
+               int emul;
 
 program_interrupt:
                flags = vcpu->arch.shadow_srr1 & 0x1f0000ull;
 
+               emul = kvmppc_get_last_inst(vcpu, INST_GENERIC, &last_inst);
+               if (emul != EMULATE_DONE) {
+                       r = RESUME_GUEST;
+                       break;
+               }
+
                if (kvmppc_get_msr(vcpu) & MSR_PR) {
 #ifdef EXIT_DEBUG
-                       printk(KERN_INFO "Userspace triggered 0x700 exception at 0x%lx (0x%x)\n", kvmppc_get_pc(vcpu), kvmppc_get_last_inst(vcpu));
+                       pr_info("Userspace triggered 0x700 exception at\n 0x%lx (0x%x)\n",
+                               kvmppc_get_pc(vcpu), last_inst);
 #endif
-                       if ((kvmppc_get_last_inst(vcpu) & 0xff0007ff) !=
+                       if ((last_inst & 0xff0007ff) !=
                            (INS_DCBZ & 0xfffffff7)) {
                                kvmppc_core_queue_program(vcpu, flags);
                                r = RESUME_GUEST;
@@ -1004,7 +1063,7 @@ program_interrupt:
                        break;
                case EMULATE_FAIL:
                        printk(KERN_CRIT "%s: emulation at %lx failed (%08x)\n",
-                              __func__, kvmppc_get_pc(vcpu), kvmppc_get_last_inst(vcpu));
+                              __func__, kvmppc_get_pc(vcpu), last_inst);
                        kvmppc_core_queue_program(vcpu, flags);
                        r = RESUME_GUEST;
                        break;
@@ -1021,8 +1080,23 @@ program_interrupt:
                break;
        }
        case BOOK3S_INTERRUPT_SYSCALL:
+       {
+               u32 last_sc;
+               int emul;
+
+               /* Get last sc for papr */
+               if (vcpu->arch.papr_enabled) {
+                       /* The sc instuction points SRR0 to the next inst */
+                       emul = kvmppc_get_last_inst(vcpu, INST_SC, &last_sc);
+                       if (emul != EMULATE_DONE) {
+                               kvmppc_set_pc(vcpu, kvmppc_get_pc(vcpu) - 4);
+                               r = RESUME_GUEST;
+                               break;
+                       }
+               }
+
                if (vcpu->arch.papr_enabled &&
-                   (kvmppc_get_last_sc(vcpu) == 0x44000022) &&
+                   (last_sc == 0x44000022) &&
                    !(kvmppc_get_msr(vcpu) & MSR_PR)) {
                        /* SC 1 papr hypercalls */
                        ulong cmd = kvmppc_get_gpr(vcpu, 3);
@@ -1067,36 +1141,51 @@ program_interrupt:
                        r = RESUME_GUEST;
                }
                break;
+       }
        case BOOK3S_INTERRUPT_FP_UNAVAIL:
        case BOOK3S_INTERRUPT_ALTIVEC:
        case BOOK3S_INTERRUPT_VSX:
        {
                int ext_msr = 0;
+               int emul;
+               u32 last_inst;
+
+               if (vcpu->arch.hflags & BOOK3S_HFLAG_PAIRED_SINGLE) {
+                       /* Do paired single instruction emulation */
+                       emul = kvmppc_get_last_inst(vcpu, INST_GENERIC,
+                                                   &last_inst);
+                       if (emul == EMULATE_DONE)
+                               goto program_interrupt;
+                       else
+                               r = RESUME_GUEST;
 
-               switch (exit_nr) {
-               case BOOK3S_INTERRUPT_FP_UNAVAIL: ext_msr = MSR_FP;  break;
-               case BOOK3S_INTERRUPT_ALTIVEC:    ext_msr = MSR_VEC; break;
-               case BOOK3S_INTERRUPT_VSX:        ext_msr = MSR_VSX; break;
+                       break;
                }
 
-               switch (kvmppc_check_ext(vcpu, exit_nr)) {
-               case EMULATE_DONE:
-                       /* everything ok - let's enable the ext */
-                       r = kvmppc_handle_ext(vcpu, exit_nr, ext_msr);
+               /* Enable external provider */
+               switch (exit_nr) {
+               case BOOK3S_INTERRUPT_FP_UNAVAIL:
+                       ext_msr = MSR_FP;
                        break;
-               case EMULATE_FAIL:
-                       /* we need to emulate this instruction */
-                       goto program_interrupt;
+
+               case BOOK3S_INTERRUPT_ALTIVEC:
+                       ext_msr = MSR_VEC;
                        break;
-               default:
-                       /* nothing to worry about - go again */
+
+               case BOOK3S_INTERRUPT_VSX:
+                       ext_msr = MSR_VSX;
                        break;
                }
+
+               r = kvmppc_handle_ext(vcpu, exit_nr, ext_msr);
                break;
        }
        case BOOK3S_INTERRUPT_ALIGNMENT:
-               if (kvmppc_read_inst(vcpu) == EMULATE_DONE) {
-                       u32 last_inst = kvmppc_get_last_inst(vcpu);
+       {
+               u32 last_inst;
+               int emul = kvmppc_get_last_inst(vcpu, INST_GENERIC, &last_inst);
+
+               if (emul == EMULATE_DONE) {
                        u32 dsisr;
                        u64 dar;
 
@@ -1110,6 +1199,7 @@ program_interrupt:
                }
                r = RESUME_GUEST;
                break;
+       }
 #ifdef CONFIG_PPC_BOOK3S_64
        case BOOK3S_INTERRUPT_FAC_UNAVAIL:
                kvmppc_handle_fac(vcpu, vcpu->arch.shadow_fscr >> 56);
@@ -1233,6 +1323,7 @@ static int kvmppc_get_one_reg_pr(struct kvm_vcpu *vcpu, u64 id,
                *val = get_reg_val(id, to_book3s(vcpu)->hior);
                break;
        case KVM_REG_PPC_LPCR:
+       case KVM_REG_PPC_LPCR_64:
                /*
                 * We are only interested in the LPCR_ILE bit
                 */
@@ -1268,6 +1359,7 @@ static int kvmppc_set_one_reg_pr(struct kvm_vcpu *vcpu, u64 id,
                to_book3s(vcpu)->hior_explicit = true;
                break;
        case KVM_REG_PPC_LPCR:
+       case KVM_REG_PPC_LPCR_64:
                kvmppc_set_lpcr_pr(vcpu, set_reg_val(id, *val));
                break;
        default:
@@ -1310,8 +1402,7 @@ static struct kvm_vcpu *kvmppc_core_vcpu_create_pr(struct kvm *kvm,
        p = __get_free_page(GFP_KERNEL|__GFP_ZERO);
        if (!p)
                goto uninit_vcpu;
-       /* the real shared page fills the last 4k of our page */
-       vcpu->arch.shared = (void *)(p + PAGE_SIZE - 4096);
+       vcpu->arch.shared = (void *)p;
 #ifdef CONFIG_PPC_BOOK3S_64
        /* Always start the shared struct in native endian mode */
 #ifdef __BIG_ENDIAN__
@@ -1568,6 +1659,11 @@ static int kvmppc_core_init_vm_pr(struct kvm *kvm)
 {
        mutex_init(&kvm->arch.hpt_mutex);
 
+#ifdef CONFIG_PPC_BOOK3S_64
+       /* Start out with the default set of hcalls enabled */
+       kvmppc_pr_init_default_hcalls(kvm);
+#endif
+
        if (firmware_has_feature(FW_FEATURE_SET_MODE)) {
                spin_lock(&kvm_global_user_count_lock);
                if (++kvm_global_user_count == 1)
@@ -1636,6 +1732,9 @@ static struct kvmppc_ops kvm_ops_pr = {
        .emulate_mfspr = kvmppc_core_emulate_mfspr_pr,
        .fast_vcpu_kick = kvm_vcpu_kick,
        .arch_vm_ioctl  = kvm_arch_vm_ioctl_pr,
+#ifdef CONFIG_PPC_BOOK3S_64
+       .hcall_implemented = kvmppc_hcall_impl_pr,
+#endif
 };
 
 
index 52a63bfe3f071b60018e87f3e78b61895a0c5c6b..ce3c893d509b17b3611e6fe5050a50424ba5d83d 100644 (file)
@@ -40,8 +40,9 @@ static int kvmppc_h_pr_enter(struct kvm_vcpu *vcpu)
 {
        long flags = kvmppc_get_gpr(vcpu, 4);
        long pte_index = kvmppc_get_gpr(vcpu, 5);
-       unsigned long pteg[2 * 8];
-       unsigned long pteg_addr, i, *hpte;
+       __be64 pteg[2 * 8];
+       __be64 *hpte;
+       unsigned long pteg_addr, i;
        long int ret;
 
        i = pte_index & 7;
@@ -93,8 +94,8 @@ static int kvmppc_h_pr_remove(struct kvm_vcpu *vcpu)
        pteg = get_pteg_addr(vcpu, pte_index);
        mutex_lock(&vcpu->kvm->arch.hpt_mutex);
        copy_from_user(pte, (void __user *)pteg, sizeof(pte));
-       pte[0] = be64_to_cpu(pte[0]);
-       pte[1] = be64_to_cpu(pte[1]);
+       pte[0] = be64_to_cpu((__force __be64)pte[0]);
+       pte[1] = be64_to_cpu((__force __be64)pte[1]);
 
        ret = H_NOT_FOUND;
        if ((pte[0] & HPTE_V_VALID) == 0 ||
@@ -171,8 +172,8 @@ static int kvmppc_h_pr_bulk_remove(struct kvm_vcpu *vcpu)
 
                pteg = get_pteg_addr(vcpu, tsh & H_BULK_REMOVE_PTEX);
                copy_from_user(pte, (void __user *)pteg, sizeof(pte));
-               pte[0] = be64_to_cpu(pte[0]);
-               pte[1] = be64_to_cpu(pte[1]);
+               pte[0] = be64_to_cpu((__force __be64)pte[0]);
+               pte[1] = be64_to_cpu((__force __be64)pte[1]);
 
                /* tsl = AVPN */
                flags = (tsh & H_BULK_REMOVE_FLAGS) >> 26;
@@ -211,8 +212,8 @@ static int kvmppc_h_pr_protect(struct kvm_vcpu *vcpu)
        pteg = get_pteg_addr(vcpu, pte_index);
        mutex_lock(&vcpu->kvm->arch.hpt_mutex);
        copy_from_user(pte, (void __user *)pteg, sizeof(pte));
-       pte[0] = be64_to_cpu(pte[0]);
-       pte[1] = be64_to_cpu(pte[1]);
+       pte[0] = be64_to_cpu((__force __be64)pte[0]);
+       pte[1] = be64_to_cpu((__force __be64)pte[1]);
 
        ret = H_NOT_FOUND;
        if ((pte[0] & HPTE_V_VALID) == 0 ||
@@ -231,8 +232,8 @@ static int kvmppc_h_pr_protect(struct kvm_vcpu *vcpu)
 
        rb = compute_tlbie_rb(v, r, pte_index);
        vcpu->arch.mmu.tlbie(vcpu, rb, rb & 1 ? true : false);
-       pte[0] = cpu_to_be64(pte[0]);
-       pte[1] = cpu_to_be64(pte[1]);
+       pte[0] = (__force u64)cpu_to_be64(pte[0]);
+       pte[1] = (__force u64)cpu_to_be64(pte[1]);
        copy_to_user((void __user *)pteg, pte, sizeof(pte));
        ret = H_SUCCESS;
 
@@ -266,6 +267,12 @@ static int kvmppc_h_pr_xics_hcall(struct kvm_vcpu *vcpu, u32 cmd)
 
 int kvmppc_h_pr(struct kvm_vcpu *vcpu, unsigned long cmd)
 {
+       int rc, idx;
+
+       if (cmd <= MAX_HCALL_OPCODE &&
+           !test_bit(cmd/4, vcpu->kvm->arch.enabled_hcalls))
+               return EMULATE_FAIL;
+
        switch (cmd) {
        case H_ENTER:
                return kvmppc_h_pr_enter(vcpu);
@@ -294,8 +301,11 @@ int kvmppc_h_pr(struct kvm_vcpu *vcpu, unsigned long cmd)
                break;
        case H_RTAS:
                if (list_empty(&vcpu->kvm->arch.rtas_tokens))
-                       return RESUME_HOST;
-               if (kvmppc_rtas_hcall(vcpu))
+                       break;
+               idx = srcu_read_lock(&vcpu->kvm->srcu);
+               rc = kvmppc_rtas_hcall(vcpu);
+               srcu_read_unlock(&vcpu->kvm->srcu, idx);
+               if (rc)
                        break;
                kvmppc_set_gpr(vcpu, 3, 0);
                return EMULATE_DONE;
@@ -303,3 +313,61 @@ int kvmppc_h_pr(struct kvm_vcpu *vcpu, unsigned long cmd)
 
        return EMULATE_FAIL;
 }
+
+int kvmppc_hcall_impl_pr(unsigned long cmd)
+{
+       switch (cmd) {
+       case H_ENTER:
+       case H_REMOVE:
+       case H_PROTECT:
+       case H_BULK_REMOVE:
+       case H_PUT_TCE:
+       case H_CEDE:
+#ifdef CONFIG_KVM_XICS
+       case H_XIRR:
+       case H_CPPR:
+       case H_EOI:
+       case H_IPI:
+       case H_IPOLL:
+       case H_XIRR_X:
+#endif
+               return 1;
+       }
+       return 0;
+}
+
+/*
+ * List of hcall numbers to enable by default.
+ * For compatibility with old userspace, we enable by default
+ * all hcalls that were implemented before the hcall-enabling
+ * facility was added.  Note this list should not include H_RTAS.
+ */
+static unsigned int default_hcall_list[] = {
+       H_ENTER,
+       H_REMOVE,
+       H_PROTECT,
+       H_BULK_REMOVE,
+       H_PUT_TCE,
+       H_CEDE,
+#ifdef CONFIG_KVM_XICS
+       H_XIRR,
+       H_CPPR,
+       H_EOI,
+       H_IPI,
+       H_IPOLL,
+       H_XIRR_X,
+#endif
+       0
+};
+
+void kvmppc_pr_init_default_hcalls(struct kvm *kvm)
+{
+       int i;
+       unsigned int hcall;
+
+       for (i = 0; default_hcall_list[i]; ++i) {
+               hcall = default_hcall_list[i];
+               WARN_ON(!kvmppc_hcall_impl_pr(hcall));
+               __set_bit(hcall / 4, kvm->arch.enabled_hcalls);
+       }
+}
index d1acd32a64c034649447413fcde90b15826c86cd..eaeb78047fb87d4694661fc2083ef3d1f161eac5 100644 (file)
 static void icp_deliver_irq(struct kvmppc_xics *xics, struct kvmppc_icp *icp,
                            u32 new_irq);
 
-static int ics_deliver_irq(struct kvmppc_xics *xics, u32 irq, u32 level,
-                          bool report_status)
+/*
+ * Return value ideally indicates how the interrupt was handled, but no
+ * callers look at it (given that we don't implement KVM_IRQ_LINE_STATUS),
+ * so just return 0.
+ */
+static int ics_deliver_irq(struct kvmppc_xics *xics, u32 irq, u32 level)
 {
        struct ics_irq_state *state;
        struct kvmppc_ics *ics;
@@ -82,17 +86,14 @@ static int ics_deliver_irq(struct kvmppc_xics *xics, u32 irq, u32 level,
        if (!state->exists)
                return -EINVAL;
 
-       if (report_status)
-               return state->asserted;
-
        /*
         * We set state->asserted locklessly. This should be fine as
         * we are the only setter, thus concurrent access is undefined
         * to begin with.
         */
-       if (level == KVM_INTERRUPT_SET_LEVEL)
+       if (level == 1 || level == KVM_INTERRUPT_SET_LEVEL)
                state->asserted = 1;
-       else if (level == KVM_INTERRUPT_UNSET) {
+       else if (level == 0 || level == KVM_INTERRUPT_UNSET) {
                state->asserted = 0;
                return 0;
        }
@@ -100,7 +101,7 @@ static int ics_deliver_irq(struct kvmppc_xics *xics, u32 irq, u32 level,
        /* Attempt delivery */
        icp_deliver_irq(xics, NULL, irq);
 
-       return state->asserted;
+       return 0;
 }
 
 static void ics_check_resend(struct kvmppc_xics *xics, struct kvmppc_ics *ics,
@@ -772,6 +773,8 @@ static noinline int kvmppc_h_eoi(struct kvm_vcpu *vcpu, unsigned long xirr)
        if (state->asserted)
                icp_deliver_irq(xics, icp, irq);
 
+       kvm_notify_acked_irq(vcpu->kvm, 0, irq);
+
        return H_SUCCESS;
 }
 
@@ -789,6 +792,8 @@ static noinline int kvmppc_xics_rm_complete(struct kvm_vcpu *vcpu, u32 hcall)
                icp_check_resend(xics, icp);
        if (icp->rm_action & XICS_RM_REJECT)
                icp_deliver_irq(xics, icp, icp->rm_reject);
+       if (icp->rm_action & XICS_RM_NOTIFY_EOI)
+               kvm_notify_acked_irq(vcpu->kvm, 0, icp->rm_eoied_irq);
 
        icp->rm_action = 0;
 
@@ -1170,7 +1175,16 @@ int kvm_set_irq(struct kvm *kvm, int irq_source_id, u32 irq, int level,
 {
        struct kvmppc_xics *xics = kvm->arch.xics;
 
-       return ics_deliver_irq(xics, irq, level, line_status);
+       return ics_deliver_irq(xics, irq, level);
+}
+
+int kvm_set_msi(struct kvm_kernel_irq_routing_entry *irq_entry, struct kvm *kvm,
+               int irq_source_id, int level, bool line_status)
+{
+       if (!level)
+               return -1;
+       return kvm_set_irq(kvm, irq_source_id, irq_entry->gsi,
+                          level, line_status);
 }
 
 static int xics_set_attr(struct kvm_device *dev, struct kvm_device_attr *attr)
@@ -1301,3 +1315,26 @@ void kvmppc_xics_free_icp(struct kvm_vcpu *vcpu)
        vcpu->arch.icp = NULL;
        vcpu->arch.irq_type = KVMPPC_IRQ_DEFAULT;
 }
+
+static int xics_set_irq(struct kvm_kernel_irq_routing_entry *e,
+                       struct kvm *kvm, int irq_source_id, int level,
+                       bool line_status)
+{
+       return kvm_set_irq(kvm, irq_source_id, e->gsi, level, line_status);
+}
+
+int kvm_irq_map_gsi(struct kvm *kvm,
+                   struct kvm_kernel_irq_routing_entry *entries, int gsi)
+{
+       entries->gsi = gsi;
+       entries->type = KVM_IRQ_ROUTING_IRQCHIP;
+       entries->set = xics_set_irq;
+       entries->irqchip.irqchip = 0;
+       entries->irqchip.pin = gsi;
+       return 1;
+}
+
+int kvm_irq_map_chip_pin(struct kvm *kvm, unsigned irqchip, unsigned pin)
+{
+       return pin;
+}
index dd9326c5c19bfc1fb3ac0191fb199eb7899c4478..e8aaa7a3f209cc2ac6fdb5aa65f9bf4dd1c6d98f 100644 (file)
@@ -71,9 +71,11 @@ struct kvmppc_icp {
 #define XICS_RM_KICK_VCPU      0x1
 #define XICS_RM_CHECK_RESEND   0x2
 #define XICS_RM_REJECT         0x4
+#define XICS_RM_NOTIFY_EOI     0x8
        u32 rm_action;
        struct kvm_vcpu *rm_kick_target;
        u32  rm_reject;
+       u32  rm_eoied_irq;
 
        /* Debug stuff for real mode */
        union kvmppc_icp_state rm_dbgstate;
index ab62109fdfa3f71a43701c7d08220db2cb826066..b4c89fa6f109ec0502380ce2f1e749aa21fb8049 100644 (file)
@@ -51,7 +51,6 @@ unsigned long kvmppc_booke_handlers;
 
 struct kvm_stats_debugfs_item debugfs_entries[] = {
        { "mmio",       VCPU_STAT(mmio_exits) },
-       { "dcr",        VCPU_STAT(dcr_exits) },
        { "sig",        VCPU_STAT(signal_exits) },
        { "itlb_r",     VCPU_STAT(itlb_real_miss_exits) },
        { "itlb_v",     VCPU_STAT(itlb_virt_miss_exits) },
@@ -185,24 +184,28 @@ static void kvmppc_booke_queue_irqprio(struct kvm_vcpu *vcpu,
        set_bit(priority, &vcpu->arch.pending_exceptions);
 }
 
-static void kvmppc_core_queue_dtlb_miss(struct kvm_vcpu *vcpu,
-                                        ulong dear_flags, ulong esr_flags)
+void kvmppc_core_queue_dtlb_miss(struct kvm_vcpu *vcpu,
+                                ulong dear_flags, ulong esr_flags)
 {
        vcpu->arch.queued_dear = dear_flags;
        vcpu->arch.queued_esr = esr_flags;
        kvmppc_booke_queue_irqprio(vcpu, BOOKE_IRQPRIO_DTLB_MISS);
 }
 
-static void kvmppc_core_queue_data_storage(struct kvm_vcpu *vcpu,
-                                           ulong dear_flags, ulong esr_flags)
+void kvmppc_core_queue_data_storage(struct kvm_vcpu *vcpu,
+                                   ulong dear_flags, ulong esr_flags)
 {
        vcpu->arch.queued_dear = dear_flags;
        vcpu->arch.queued_esr = esr_flags;
        kvmppc_booke_queue_irqprio(vcpu, BOOKE_IRQPRIO_DATA_STORAGE);
 }
 
-static void kvmppc_core_queue_inst_storage(struct kvm_vcpu *vcpu,
-                                           ulong esr_flags)
+void kvmppc_core_queue_itlb_miss(struct kvm_vcpu *vcpu)
+{
+       kvmppc_booke_queue_irqprio(vcpu, BOOKE_IRQPRIO_ITLB_MISS);
+}
+
+void kvmppc_core_queue_inst_storage(struct kvm_vcpu *vcpu, ulong esr_flags)
 {
        vcpu->arch.queued_esr = esr_flags;
        kvmppc_booke_queue_irqprio(vcpu, BOOKE_IRQPRIO_INST_STORAGE);
@@ -266,13 +269,8 @@ static void kvmppc_core_dequeue_watchdog(struct kvm_vcpu *vcpu)
 
 static void set_guest_srr(struct kvm_vcpu *vcpu, unsigned long srr0, u32 srr1)
 {
-#ifdef CONFIG_KVM_BOOKE_HV
-       mtspr(SPRN_GSRR0, srr0);
-       mtspr(SPRN_GSRR1, srr1);
-#else
-       vcpu->arch.shared->srr0 = srr0;
-       vcpu->arch.shared->srr1 = srr1;
-#endif
+       kvmppc_set_srr0(vcpu, srr0);
+       kvmppc_set_srr1(vcpu, srr1);
 }
 
 static void set_guest_csrr(struct kvm_vcpu *vcpu, unsigned long srr0, u32 srr1)
@@ -297,51 +295,6 @@ static void set_guest_mcsrr(struct kvm_vcpu *vcpu, unsigned long srr0, u32 srr1)
        vcpu->arch.mcsrr1 = srr1;
 }
 
-static unsigned long get_guest_dear(struct kvm_vcpu *vcpu)
-{
-#ifdef CONFIG_KVM_BOOKE_HV
-       return mfspr(SPRN_GDEAR);
-#else
-       return vcpu->arch.shared->dar;
-#endif
-}
-
-static void set_guest_dear(struct kvm_vcpu *vcpu, unsigned long dear)
-{
-#ifdef CONFIG_KVM_BOOKE_HV
-       mtspr(SPRN_GDEAR, dear);
-#else
-       vcpu->arch.shared->dar = dear;
-#endif
-}
-
-static unsigned long get_guest_esr(struct kvm_vcpu *vcpu)
-{
-#ifdef CONFIG_KVM_BOOKE_HV
-       return mfspr(SPRN_GESR);
-#else
-       return vcpu->arch.shared->esr;
-#endif
-}
-
-static void set_guest_esr(struct kvm_vcpu *vcpu, u32 esr)
-{
-#ifdef CONFIG_KVM_BOOKE_HV
-       mtspr(SPRN_GESR, esr);
-#else
-       vcpu->arch.shared->esr = esr;
-#endif
-}
-
-static unsigned long get_guest_epr(struct kvm_vcpu *vcpu)
-{
-#ifdef CONFIG_KVM_BOOKE_HV
-       return mfspr(SPRN_GEPR);
-#else
-       return vcpu->arch.epr;
-#endif
-}
-
 /* Deliver the interrupt of the corresponding priority, if possible. */
 static int kvmppc_booke_irqprio_deliver(struct kvm_vcpu *vcpu,
                                         unsigned int priority)
@@ -450,9 +403,9 @@ static int kvmppc_booke_irqprio_deliver(struct kvm_vcpu *vcpu,
 
                vcpu->arch.pc = vcpu->arch.ivpr | vcpu->arch.ivor[priority];
                if (update_esr == true)
-                       set_guest_esr(vcpu, vcpu->arch.queued_esr);
+                       kvmppc_set_esr(vcpu, vcpu->arch.queued_esr);
                if (update_dear == true)
-                       set_guest_dear(vcpu, vcpu->arch.queued_dear);
+                       kvmppc_set_dar(vcpu, vcpu->arch.queued_dear);
                if (update_epr == true) {
                        if (vcpu->arch.epr_flags & KVMPPC_EPR_USER)
                                kvm_make_request(KVM_REQ_EPR_EXIT, vcpu);
@@ -752,9 +705,8 @@ static int emulation_exit(struct kvm_run *run, struct kvm_vcpu *vcpu)
                 * they were actually modified by emulation. */
                return RESUME_GUEST_NV;
 
-       case EMULATE_DO_DCR:
-               run->exit_reason = KVM_EXIT_DCR;
-               return RESUME_HOST;
+       case EMULATE_AGAIN:
+               return RESUME_GUEST;
 
        case EMULATE_FAIL:
                printk(KERN_CRIT "%s: emulation at %lx failed (%08x)\n",
@@ -866,6 +818,28 @@ static void kvmppc_restart_interrupt(struct kvm_vcpu *vcpu,
        }
 }
 
+static int kvmppc_resume_inst_load(struct kvm_run *run, struct kvm_vcpu *vcpu,
+                                 enum emulation_result emulated, u32 last_inst)
+{
+       switch (emulated) {
+       case EMULATE_AGAIN:
+               return RESUME_GUEST;
+
+       case EMULATE_FAIL:
+               pr_debug("%s: load instruction from guest address %lx failed\n",
+                      __func__, vcpu->arch.pc);
+               /* For debugging, encode the failing instruction and
+                * report it to userspace. */
+               run->hw.hardware_exit_reason = ~0ULL << 32;
+               run->hw.hardware_exit_reason |= last_inst;
+               kvmppc_core_queue_program(vcpu, ESR_PIL);
+               return RESUME_HOST;
+
+       default:
+               BUG();
+       }
+}
+
 /**
  * kvmppc_handle_exit
  *
@@ -877,6 +851,8 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu,
        int r = RESUME_HOST;
        int s;
        int idx;
+       u32 last_inst = KVM_INST_FETCH_FAILED;
+       enum emulation_result emulated = EMULATE_DONE;
 
        /* update before a new last_exit_type is rewritten */
        kvmppc_update_timing_stats(vcpu);
@@ -884,6 +860,20 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu,
        /* restart interrupts if they were meant for the host */
        kvmppc_restart_interrupt(vcpu, exit_nr);
 
+       /*
+        * get last instruction before beeing preempted
+        * TODO: for e6500 check also BOOKE_INTERRUPT_LRAT_ERROR & ESR_DATA
+        */
+       switch (exit_nr) {
+       case BOOKE_INTERRUPT_DATA_STORAGE:
+       case BOOKE_INTERRUPT_DTLB_MISS:
+       case BOOKE_INTERRUPT_HV_PRIV:
+               emulated = kvmppc_get_last_inst(vcpu, false, &last_inst);
+               break;
+       default:
+               break;
+       }
+
        local_irq_enable();
 
        trace_kvm_exit(exit_nr, vcpu);
@@ -892,6 +882,11 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu,
        run->exit_reason = KVM_EXIT_UNKNOWN;
        run->ready_for_interrupt_injection = 1;
 
+       if (emulated != EMULATE_DONE) {
+               r = kvmppc_resume_inst_load(run, vcpu, emulated, last_inst);
+               goto out;
+       }
+
        switch (exit_nr) {
        case BOOKE_INTERRUPT_MACHINE_CHECK:
                printk("MACHINE CHECK: %lx\n", mfspr(SPRN_MCSR));
@@ -1181,6 +1176,7 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu,
                BUG();
        }
 
+out:
        /*
         * To avoid clobbering exit_reason, only check for signals if we
         * aren't already exiting to userspace for some other reason.
@@ -1265,17 +1261,17 @@ int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
        regs->lr = vcpu->arch.lr;
        regs->xer = kvmppc_get_xer(vcpu);
        regs->msr = vcpu->arch.shared->msr;
-       regs->srr0 = vcpu->arch.shared->srr0;
-       regs->srr1 = vcpu->arch.shared->srr1;
+       regs->srr0 = kvmppc_get_srr0(vcpu);
+       regs->srr1 = kvmppc_get_srr1(vcpu);
        regs->pid = vcpu->arch.pid;
-       regs->sprg0 = vcpu->arch.shared->sprg0;
-       regs->sprg1 = vcpu->arch.shared->sprg1;
-       regs->sprg2 = vcpu->arch.shared->sprg2;
-       regs->sprg3 = vcpu->arch.shared->sprg3;
-       regs->sprg4 = vcpu->arch.shared->sprg4;
-       regs->sprg5 = vcpu->arch.shared->sprg5;
-       regs->sprg6 = vcpu->arch.shared->sprg6;
-       regs->sprg7 = vcpu->arch.shared->sprg7;
+       regs->sprg0 = kvmppc_get_sprg0(vcpu);
+       regs->sprg1 = kvmppc_get_sprg1(vcpu);
+       regs->sprg2 = kvmppc_get_sprg2(vcpu);
+       regs->sprg3 = kvmppc_get_sprg3(vcpu);
+       regs->sprg4 = kvmppc_get_sprg4(vcpu);
+       regs->sprg5 = kvmppc_get_sprg5(vcpu);
+       regs->sprg6 = kvmppc_get_sprg6(vcpu);
+       regs->sprg7 = kvmppc_get_sprg7(vcpu);
 
        for (i = 0; i < ARRAY_SIZE(regs->gpr); i++)
                regs->gpr[i] = kvmppc_get_gpr(vcpu, i);
@@ -1293,17 +1289,17 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
        vcpu->arch.lr = regs->lr;
        kvmppc_set_xer(vcpu, regs->xer);
        kvmppc_set_msr(vcpu, regs->msr);
-       vcpu->arch.shared->srr0 = regs->srr0;
-       vcpu->arch.shared->srr1 = regs->srr1;
+       kvmppc_set_srr0(vcpu, regs->srr0);
+       kvmppc_set_srr1(vcpu, regs->srr1);
        kvmppc_set_pid(vcpu, regs->pid);
-       vcpu->arch.shared->sprg0 = regs->sprg0;
-       vcpu->arch.shared->sprg1 = regs->sprg1;
-       vcpu->arch.shared->sprg2 = regs->sprg2;
-       vcpu->arch.shared->sprg3 = regs->sprg3;
-       vcpu->arch.shared->sprg4 = regs->sprg4;
-       vcpu->arch.shared->sprg5 = regs->sprg5;
-       vcpu->arch.shared->sprg6 = regs->sprg6;
-       vcpu->arch.shared->sprg7 = regs->sprg7;
+       kvmppc_set_sprg0(vcpu, regs->sprg0);
+       kvmppc_set_sprg1(vcpu, regs->sprg1);
+       kvmppc_set_sprg2(vcpu, regs->sprg2);
+       kvmppc_set_sprg3(vcpu, regs->sprg3);
+       kvmppc_set_sprg4(vcpu, regs->sprg4);
+       kvmppc_set_sprg5(vcpu, regs->sprg5);
+       kvmppc_set_sprg6(vcpu, regs->sprg6);
+       kvmppc_set_sprg7(vcpu, regs->sprg7);
 
        for (i = 0; i < ARRAY_SIZE(regs->gpr); i++)
                kvmppc_set_gpr(vcpu, i, regs->gpr[i]);
@@ -1321,8 +1317,8 @@ static void get_sregs_base(struct kvm_vcpu *vcpu,
        sregs->u.e.csrr0 = vcpu->arch.csrr0;
        sregs->u.e.csrr1 = vcpu->arch.csrr1;
        sregs->u.e.mcsr = vcpu->arch.mcsr;
-       sregs->u.e.esr = get_guest_esr(vcpu);
-       sregs->u.e.dear = get_guest_dear(vcpu);
+       sregs->u.e.esr = kvmppc_get_esr(vcpu);
+       sregs->u.e.dear = kvmppc_get_dar(vcpu);
        sregs->u.e.tsr = vcpu->arch.tsr;
        sregs->u.e.tcr = vcpu->arch.tcr;
        sregs->u.e.dec = kvmppc_get_dec(vcpu, tb);
@@ -1339,8 +1335,8 @@ static int set_sregs_base(struct kvm_vcpu *vcpu,
        vcpu->arch.csrr0 = sregs->u.e.csrr0;
        vcpu->arch.csrr1 = sregs->u.e.csrr1;
        vcpu->arch.mcsr = sregs->u.e.mcsr;
-       set_guest_esr(vcpu, sregs->u.e.esr);
-       set_guest_dear(vcpu, sregs->u.e.dear);
+       kvmppc_set_esr(vcpu, sregs->u.e.esr);
+       kvmppc_set_dar(vcpu, sregs->u.e.dear);
        vcpu->arch.vrsave = sregs->u.e.vrsave;
        kvmppc_set_tcr(vcpu, sregs->u.e.tcr);
 
@@ -1493,7 +1489,7 @@ int kvm_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg)
                val = get_reg_val(reg->id, vcpu->arch.dbg_reg.dac2);
                break;
        case KVM_REG_PPC_EPR: {
-               u32 epr = get_guest_epr(vcpu);
+               u32 epr = kvmppc_get_epr(vcpu);
                val = get_reg_val(reg->id, epr);
                break;
        }
@@ -1788,6 +1784,57 @@ void kvm_guest_protect_msr(struct kvm_vcpu *vcpu, ulong prot_bitmap, bool set)
 #endif
 }
 
+int kvmppc_xlate(struct kvm_vcpu *vcpu, ulong eaddr, enum xlate_instdata xlid,
+                enum xlate_readwrite xlrw, struct kvmppc_pte *pte)
+{
+       int gtlb_index;
+       gpa_t gpaddr;
+
+#ifdef CONFIG_KVM_E500V2
+       if (!(vcpu->arch.shared->msr & MSR_PR) &&
+           (eaddr & PAGE_MASK) == vcpu->arch.magic_page_ea) {
+               pte->eaddr = eaddr;
+               pte->raddr = (vcpu->arch.magic_page_pa & PAGE_MASK) |
+                            (eaddr & ~PAGE_MASK);
+               pte->vpage = eaddr >> PAGE_SHIFT;
+               pte->may_read = true;
+               pte->may_write = true;
+               pte->may_execute = true;
+
+               return 0;
+       }
+#endif
+
+       /* Check the guest TLB. */
+       switch (xlid) {
+       case XLATE_INST:
+               gtlb_index = kvmppc_mmu_itlb_index(vcpu, eaddr);
+               break;
+       case XLATE_DATA:
+               gtlb_index = kvmppc_mmu_dtlb_index(vcpu, eaddr);
+               break;
+       default:
+               BUG();
+       }
+
+       /* Do we have a TLB entry at all? */
+       if (gtlb_index < 0)
+               return -ENOENT;
+
+       gpaddr = kvmppc_mmu_xlate(vcpu, gtlb_index, eaddr);
+
+       pte->eaddr = eaddr;
+       pte->raddr = (gpaddr & PAGE_MASK) | (eaddr & ~PAGE_MASK);
+       pte->vpage = eaddr >> PAGE_SHIFT;
+
+       /* XXX read permissions from the guest TLB */
+       pte->may_read = true;
+       pte->may_write = true;
+       pte->may_execute = true;
+
+       return 0;
+}
+
 int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,
                                         struct kvm_guest_debug *dbg)
 {
index b632cd35919b1b32460abd2d4f6c4d9c579627b7..f753543c56fa4aff28f1ba81cc24a6b1593dc114 100644 (file)
@@ -99,13 +99,6 @@ enum int_class {
 
 void kvmppc_set_pending_interrupt(struct kvm_vcpu *vcpu, enum int_class type);
 
-extern void kvmppc_mmu_destroy_44x(struct kvm_vcpu *vcpu);
-extern int kvmppc_core_emulate_op_44x(struct kvm_run *run, struct kvm_vcpu *vcpu,
-                                     unsigned int inst, int *advance);
-extern int kvmppc_core_emulate_mtspr_44x(struct kvm_vcpu *vcpu, int sprn,
-                                        ulong spr_val);
-extern int kvmppc_core_emulate_mfspr_44x(struct kvm_vcpu *vcpu, int sprn,
-                                        ulong *spr_val);
 extern void kvmppc_mmu_destroy_e500(struct kvm_vcpu *vcpu);
 extern int kvmppc_core_emulate_op_e500(struct kvm_run *run,
                                       struct kvm_vcpu *vcpu,
index 27a4b2877c10b79f6764600b01f3d196ea585fb5..28c158881d23f7f87daf87e7c2ce8731775d5630 100644 (file)
@@ -165,16 +165,16 @@ int kvmppc_booke_emulate_mtspr(struct kvm_vcpu *vcpu, int sprn, ulong spr_val)
         * guest (PR-mode only).
         */
        case SPRN_SPRG4:
-               vcpu->arch.shared->sprg4 = spr_val;
+               kvmppc_set_sprg4(vcpu, spr_val);
                break;
        case SPRN_SPRG5:
-               vcpu->arch.shared->sprg5 = spr_val;
+               kvmppc_set_sprg5(vcpu, spr_val);
                break;
        case SPRN_SPRG6:
-               vcpu->arch.shared->sprg6 = spr_val;
+               kvmppc_set_sprg6(vcpu, spr_val);
                break;
        case SPRN_SPRG7:
-               vcpu->arch.shared->sprg7 = spr_val;
+               kvmppc_set_sprg7(vcpu, spr_val);
                break;
 
        case SPRN_IVPR:
index 2c6deb5ef2fe89237ae9fdcadaa62e786085d842..84c308a9a371a79a25ab3be92a510e72c4c2a4f9 100644 (file)
@@ -21,7 +21,6 @@
 #include <asm/ppc_asm.h>
 #include <asm/kvm_asm.h>
 #include <asm/reg.h>
-#include <asm/mmu-44x.h>
 #include <asm/page.h>
 #include <asm/asm-offsets.h>
 
@@ -424,10 +423,6 @@ lightweight_exit:
        mtspr   SPRN_PID1, r3
 #endif
 
-#ifdef CONFIG_44x
-       iccci   0, 0 /* XXX hack */
-#endif
-
        /* Load some guest volatiles. */
        lwz     r0, VCPU_GPR(R0)(r4)
        lwz     r2, VCPU_GPR(R2)(r4)
index a1712b818a5f7ee0d6e9172c035a573ff2343fc9..e9fa56a911fdb2fec27ef9d6b90d9f7a3591ed9b 100644 (file)
 #include <asm/ppc_asm.h>
 #include <asm/kvm_asm.h>
 #include <asm/reg.h>
-#include <asm/mmu-44x.h>
 #include <asm/page.h>
 #include <asm/asm-compat.h>
 #include <asm/asm-offsets.h>
 #include <asm/bitsperlong.h>
-#include <asm/thread_info.h>
 
 #ifdef CONFIG_64BIT
 #include <asm/exception-64e.h>
 1:
 
        .if     \flags & NEED_EMU
-       /*
-        * This assumes you have external PID support.
-        * To support a bookehv CPU without external PID, you'll
-        * need to look up the TLB entry and create a temporary mapping.
-        *
-        * FIXME: we don't currently handle if the lwepx faults.  PR-mode
-        * booke doesn't handle it either.  Since Linux doesn't use
-        * broadcast tlbivax anymore, the only way this should happen is
-        * if the guest maps its memory execute-but-not-read, or if we
-        * somehow take a TLB miss in the middle of this entry code and
-        * evict the relevant entry.  On e500mc, all kernel lowmem is
-        * bolted into TLB1 large page mappings, and we don't use
-        * broadcast invalidates, so we should not take a TLB miss here.
-        *
-        * Later we'll need to deal with faults here.  Disallowing guest
-        * mappings that are execute-but-not-read could be an option on
-        * e500mc, but not on chips with an LRAT if it is used.
-        */
-
-       mfspr   r3, SPRN_EPLC   /* will already have correct ELPID and EGS */
        PPC_STL r15, VCPU_GPR(R15)(r4)
        PPC_STL r16, VCPU_GPR(R16)(r4)
        PPC_STL r17, VCPU_GPR(R17)(r4)
        PPC_STL r18, VCPU_GPR(R18)(r4)
        PPC_STL r19, VCPU_GPR(R19)(r4)
-       mr      r8, r3
        PPC_STL r20, VCPU_GPR(R20)(r4)
-       rlwimi  r8, r6, EPC_EAS_SHIFT - MSR_IR_LG, EPC_EAS
        PPC_STL r21, VCPU_GPR(R21)(r4)
-       rlwimi  r8, r6, EPC_EPR_SHIFT - MSR_PR_LG, EPC_EPR
        PPC_STL r22, VCPU_GPR(R22)(r4)
-       rlwimi  r8, r10, EPC_EPID_SHIFT, EPC_EPID
        PPC_STL r23, VCPU_GPR(R23)(r4)
        PPC_STL r24, VCPU_GPR(R24)(r4)
        PPC_STL r25, VCPU_GPR(R25)(r4)
        PPC_STL r29, VCPU_GPR(R29)(r4)
        PPC_STL r30, VCPU_GPR(R30)(r4)
        PPC_STL r31, VCPU_GPR(R31)(r4)
-       mtspr   SPRN_EPLC, r8
-
-       /* disable preemption, so we are sure we hit the fixup handler */
-       CURRENT_THREAD_INFO(r8, r1)
-       li      r7, 1
-       stw     r7, TI_PREEMPT(r8)
-
-       isync
 
        /*
-        * In case the read goes wrong, we catch it and write an invalid value
-        * in LAST_INST instead.
+        * We don't use external PID support. lwepx faults would need to be
+        * handled by KVM and this implies aditional code in DO_KVM (for
+        * DTB_MISS, DSI and LRAT) to check ESR[EPID] and EPLC[EGS] which
+        * is too intrusive for the host. Get last instuction in
+        * kvmppc_get_last_inst().
         */
-1:     lwepx   r9, 0, r5
-2:
-.section .fixup, "ax"
-3:     li      r9, KVM_INST_FETCH_FAILED
-       b       2b
-.previous
-.section __ex_table,"a"
-       PPC_LONG_ALIGN
-       PPC_LONG 1b,3b
-.previous
-
-       mtspr   SPRN_EPLC, r3
-       li      r7, 0
-       stw     r7, TI_PREEMPT(r8)
+       li      r9, KVM_INST_FETCH_FAILED
        stw     r9, VCPU_LAST_INST(r4)
        .endif
 
@@ -441,6 +397,7 @@ _GLOBAL(kvmppc_resume_host)
 #ifdef CONFIG_64BIT
        PPC_LL  r3, PACA_SPRG_VDSO(r13)
 #endif
+       mfspr   r5, SPRN_SPRG9
        PPC_STD(r6, VCPU_SHARED_SPRG4, r11)
        mfspr   r8, SPRN_SPRG6
        PPC_STD(r7, VCPU_SHARED_SPRG5, r11)
@@ -448,6 +405,7 @@ _GLOBAL(kvmppc_resume_host)
 #ifdef CONFIG_64BIT
        mtspr   SPRN_SPRG_VDSO_WRITE, r3
 #endif
+       PPC_STD(r5, VCPU_SPRG9, r4)
        PPC_STD(r8, VCPU_SHARED_SPRG6, r11)
        mfxer   r3
        PPC_STD(r9, VCPU_SHARED_SPRG7, r11)
@@ -682,7 +640,9 @@ lightweight_exit:
        mtspr   SPRN_SPRG5W, r6
        PPC_LD(r8, VCPU_SHARED_SPRG7, r11)
        mtspr   SPRN_SPRG6W, r7
+       PPC_LD(r5, VCPU_SPRG9, r4)
        mtspr   SPRN_SPRG7W, r8
+       mtspr   SPRN_SPRG9, r5
 
        /* Load some guest volatiles. */
        PPC_LL  r3, VCPU_LR(r4)
index 002d51764143b7a8b0275ae0b3590a5d82932385..c99c40e9182a2abee92627360fc4290190ac63ca 100644 (file)
@@ -250,6 +250,14 @@ int kvmppc_core_emulate_mtspr_e500(struct kvm_vcpu *vcpu, int sprn, ulong spr_va
                                spr_val);
                break;
 
+       case SPRN_PWRMGTCR0:
+               /*
+                * Guest relies on host power management configurations
+                * Treat the request as a general store
+                */
+               vcpu->arch.pwrmgtcr0 = spr_val;
+               break;
+
        /* extra exceptions */
        case SPRN_IVOR32:
                vcpu->arch.ivor[BOOKE_IRQPRIO_SPE_UNAVAIL] = spr_val;
@@ -368,6 +376,10 @@ int kvmppc_core_emulate_mfspr_e500(struct kvm_vcpu *vcpu, int sprn, ulong *spr_v
                *spr_val = vcpu->arch.eptcfg;
                break;
 
+       case SPRN_PWRMGTCR0:
+               *spr_val = vcpu->arch.pwrmgtcr0;
+               break;
+
        /* extra exceptions */
        case SPRN_IVOR32:
                *spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_SPE_UNAVAIL];
index 86903d3f5a033d215b3857f979fcea2cb68a3de6..08f14bb57897ea530f8ebc128c6e5cf204eadcd9 100644 (file)
@@ -107,11 +107,15 @@ static u32 get_host_mas0(unsigned long eaddr)
 {
        unsigned long flags;
        u32 mas0;
+       u32 mas4;
 
        local_irq_save(flags);
        mtspr(SPRN_MAS6, 0);
+       mas4 = mfspr(SPRN_MAS4);
+       mtspr(SPRN_MAS4, mas4 & ~MAS4_TLBSEL_MASK);
        asm volatile("tlbsx 0, %0" : : "b" (eaddr & ~CONFIG_PAGE_OFFSET));
        mas0 = mfspr(SPRN_MAS0);
+       mtspr(SPRN_MAS4, mas4);
        local_irq_restore(flags);
 
        return mas0;
@@ -607,6 +611,104 @@ void kvmppc_mmu_map(struct kvm_vcpu *vcpu, u64 eaddr, gpa_t gpaddr,
        }
 }
 
+#ifdef CONFIG_KVM_BOOKE_HV
+int kvmppc_load_last_inst(struct kvm_vcpu *vcpu, enum instruction_type type,
+                         u32 *instr)
+{
+       gva_t geaddr;
+       hpa_t addr;
+       hfn_t pfn;
+       hva_t eaddr;
+       u32 mas1, mas2, mas3;
+       u64 mas7_mas3;
+       struct page *page;
+       unsigned int addr_space, psize_shift;
+       bool pr;
+       unsigned long flags;
+
+       /* Search TLB for guest pc to get the real address */
+       geaddr = kvmppc_get_pc(vcpu);
+
+       addr_space = (vcpu->arch.shared->msr & MSR_IS) >> MSR_IR_LG;
+
+       local_irq_save(flags);
+       mtspr(SPRN_MAS6, (vcpu->arch.pid << MAS6_SPID_SHIFT) | addr_space);
+       mtspr(SPRN_MAS5, MAS5_SGS | vcpu->kvm->arch.lpid);
+       asm volatile("tlbsx 0, %[geaddr]\n" : :
+                    [geaddr] "r" (geaddr));
+       mtspr(SPRN_MAS5, 0);
+       mtspr(SPRN_MAS8, 0);
+       mas1 = mfspr(SPRN_MAS1);
+       mas2 = mfspr(SPRN_MAS2);
+       mas3 = mfspr(SPRN_MAS3);
+#ifdef CONFIG_64BIT
+       mas7_mas3 = mfspr(SPRN_MAS7_MAS3);
+#else
+       mas7_mas3 = ((u64)mfspr(SPRN_MAS7) << 32) | mas3;
+#endif
+       local_irq_restore(flags);
+
+       /*
+        * If the TLB entry for guest pc was evicted, return to the guest.
+        * There are high chances to find a valid TLB entry next time.
+        */
+       if (!(mas1 & MAS1_VALID))
+               return EMULATE_AGAIN;
+
+       /*
+        * Another thread may rewrite the TLB entry in parallel, don't
+        * execute from the address if the execute permission is not set
+        */
+       pr = vcpu->arch.shared->msr & MSR_PR;
+       if (unlikely((pr && !(mas3 & MAS3_UX)) ||
+                    (!pr && !(mas3 & MAS3_SX)))) {
+               pr_err_ratelimited(
+                       "%s: Instuction emulation from guest addres %08lx without execute permission\n",
+                       __func__, geaddr);
+               return EMULATE_AGAIN;
+       }
+
+       /*
+        * The real address will be mapped by a cacheable, memory coherent,
+        * write-back page. Check for mismatches when LRAT is used.
+        */
+       if (has_feature(vcpu, VCPU_FTR_MMU_V2) &&
+           unlikely((mas2 & MAS2_I) || (mas2 & MAS2_W) || !(mas2 & MAS2_M))) {
+               pr_err_ratelimited(
+                       "%s: Instuction emulation from guest addres %08lx mismatches storage attributes\n",
+                       __func__, geaddr);
+               return EMULATE_AGAIN;
+       }
+
+       /* Get pfn */
+       psize_shift = MAS1_GET_TSIZE(mas1) + 10;
+       addr = (mas7_mas3 & (~0ULL << psize_shift)) |
+              (geaddr & ((1ULL << psize_shift) - 1ULL));
+       pfn = addr >> PAGE_SHIFT;
+
+       /* Guard against emulation from devices area */
+       if (unlikely(!page_is_ram(pfn))) {
+               pr_err_ratelimited("%s: Instruction emulation from non-RAM host addres %08llx is not supported\n",
+                        __func__, addr);
+               return EMULATE_AGAIN;
+       }
+
+       /* Map a page and get guest's instruction */
+       page = pfn_to_page(pfn);
+       eaddr = (unsigned long)kmap_atomic(page);
+       *instr = *(u32 *)(eaddr | (unsigned long)(addr & ~PAGE_MASK));
+       kunmap_atomic((u32 *)eaddr);
+
+       return EMULATE_DONE;
+}
+#else
+int kvmppc_load_last_inst(struct kvm_vcpu *vcpu, enum instruction_type type,
+                         u32 *instr)
+{
+       return EMULATE_AGAIN;
+}
+#endif
+
 /************* MMU Notifiers *************/
 
 int kvm_unmap_hva(struct kvm *kvm, unsigned long hva)
index 17e456279224652ce86c5c404130bdc45a702fe7..164bad2a19bf6c715f771d76ac1f8289a2daa3e5 100644 (file)
@@ -110,7 +110,7 @@ void kvmppc_mmu_msr_notify(struct kvm_vcpu *vcpu, u32 old_msr)
 {
 }
 
-static DEFINE_PER_CPU(struct kvm_vcpu *, last_vcpu_on_cpu);
+static DEFINE_PER_CPU(struct kvm_vcpu *[KVMPPC_NR_LPIDS], last_vcpu_of_lpid);
 
 static void kvmppc_core_vcpu_load_e500mc(struct kvm_vcpu *vcpu, int cpu)
 {
@@ -141,9 +141,9 @@ static void kvmppc_core_vcpu_load_e500mc(struct kvm_vcpu *vcpu, int cpu)
        mtspr(SPRN_GESR, vcpu->arch.shared->esr);
 
        if (vcpu->arch.oldpir != mfspr(SPRN_PIR) ||
-           __get_cpu_var(last_vcpu_on_cpu) != vcpu) {
+           __get_cpu_var(last_vcpu_of_lpid)[vcpu->kvm->arch.lpid] != vcpu) {
                kvmppc_e500_tlbil_all(vcpu_e500);
-               __get_cpu_var(last_vcpu_on_cpu) = vcpu;
+               __get_cpu_var(last_vcpu_of_lpid)[vcpu->kvm->arch.lpid] = vcpu;
        }
 
        kvmppc_load_guest_fp(vcpu);
@@ -267,14 +267,32 @@ static int kvmppc_core_set_sregs_e500mc(struct kvm_vcpu *vcpu,
 static int kvmppc_get_one_reg_e500mc(struct kvm_vcpu *vcpu, u64 id,
                              union kvmppc_one_reg *val)
 {
-       int r = kvmppc_get_one_reg_e500_tlb(vcpu, id, val);
+       int r = 0;
+
+       switch (id) {
+       case KVM_REG_PPC_SPRG9:
+               *val = get_reg_val(id, vcpu->arch.sprg9);
+               break;
+       default:
+               r = kvmppc_get_one_reg_e500_tlb(vcpu, id, val);
+       }
+
        return r;
 }
 
 static int kvmppc_set_one_reg_e500mc(struct kvm_vcpu *vcpu, u64 id,
                              union kvmppc_one_reg *val)
 {
-       int r = kvmppc_set_one_reg_e500_tlb(vcpu, id, val);
+       int r = 0;
+
+       switch (id) {
+       case KVM_REG_PPC_SPRG9:
+               vcpu->arch.sprg9 = set_reg_val(id, *val);
+               break;
+       default:
+               r = kvmppc_set_one_reg_e500_tlb(vcpu, id, val);
+       }
+
        return r;
 }
 
index da86d9ba34761d27af1714ecacbb5badc312696a..e96b50d0bdab1f80f3374b35a7c9462a9fcc8a51 100644 (file)
@@ -207,36 +207,28 @@ static int kvmppc_emulate_mfspr(struct kvm_vcpu *vcpu, int sprn, int rt)
        return emulated;
 }
 
-/* XXX to do:
- * lhax
- * lhaux
- * lswx
- * lswi
- * stswx
- * stswi
- * lha
- * lhau
- * lmw
- * stmw
- *
- */
 /* XXX Should probably auto-generate instruction decoding for a particular core
  * from opcode tables in the future. */
 int kvmppc_emulate_instruction(struct kvm_run *run, struct kvm_vcpu *vcpu)
 {
-       u32 inst = kvmppc_get_last_inst(vcpu);
-       int ra = get_ra(inst);
-       int rs = get_rs(inst);
-       int rt = get_rt(inst);
-       int sprn = get_sprn(inst);
-       enum emulation_result emulated = EMULATE_DONE;
+       u32 inst;
+       int rs, rt, sprn;
+       enum emulation_result emulated;
        int advance = 1;
 
        /* this default type might be overwritten by subcategories */
        kvmppc_set_exit_type(vcpu, EMULATED_INST_EXITS);
 
+       emulated = kvmppc_get_last_inst(vcpu, false, &inst);
+       if (emulated != EMULATE_DONE)
+               return emulated;
+
        pr_debug("Emulating opcode %d / %d\n", get_op(inst), get_xop(inst));
 
+       rs = get_rs(inst);
+       rt = get_rt(inst);
+       sprn = get_sprn(inst);
+
        switch (get_op(inst)) {
        case OP_TRAP:
 #ifdef CONFIG_PPC_BOOK3S
@@ -264,200 +256,24 @@ int kvmppc_emulate_instruction(struct kvm_run *run, struct kvm_vcpu *vcpu)
 #endif
                        advance = 0;
                        break;
-               case OP_31_XOP_LWZX:
-                       emulated = kvmppc_handle_load(run, vcpu, rt, 4, 1);
-                       break;
-
-               case OP_31_XOP_LBZX:
-                       emulated = kvmppc_handle_load(run, vcpu, rt, 1, 1);
-                       break;
-
-               case OP_31_XOP_LBZUX:
-                       emulated = kvmppc_handle_load(run, vcpu, rt, 1, 1);
-                       kvmppc_set_gpr(vcpu, ra, vcpu->arch.vaddr_accessed);
-                       break;
-
-               case OP_31_XOP_STWX:
-                       emulated = kvmppc_handle_store(run, vcpu,
-                                                      kvmppc_get_gpr(vcpu, rs),
-                                                      4, 1);
-                       break;
-
-               case OP_31_XOP_STBX:
-                       emulated = kvmppc_handle_store(run, vcpu,
-                                                      kvmppc_get_gpr(vcpu, rs),
-                                                      1, 1);
-                       break;
-
-               case OP_31_XOP_STBUX:
-                       emulated = kvmppc_handle_store(run, vcpu,
-                                                      kvmppc_get_gpr(vcpu, rs),
-                                                      1, 1);
-                       kvmppc_set_gpr(vcpu, ra, vcpu->arch.vaddr_accessed);
-                       break;
-
-               case OP_31_XOP_LHAX:
-                       emulated = kvmppc_handle_loads(run, vcpu, rt, 2, 1);
-                       break;
-
-               case OP_31_XOP_LHZX:
-                       emulated = kvmppc_handle_load(run, vcpu, rt, 2, 1);
-                       break;
-
-               case OP_31_XOP_LHZUX:
-                       emulated = kvmppc_handle_load(run, vcpu, rt, 2, 1);
-                       kvmppc_set_gpr(vcpu, ra, vcpu->arch.vaddr_accessed);
-                       break;
 
                case OP_31_XOP_MFSPR:
                        emulated = kvmppc_emulate_mfspr(vcpu, sprn, rt);
                        break;
 
-               case OP_31_XOP_STHX:
-                       emulated = kvmppc_handle_store(run, vcpu,
-                                                      kvmppc_get_gpr(vcpu, rs),
-                                                      2, 1);
-                       break;
-
-               case OP_31_XOP_STHUX:
-                       emulated = kvmppc_handle_store(run, vcpu,
-                                                      kvmppc_get_gpr(vcpu, rs),
-                                                      2, 1);
-                       kvmppc_set_gpr(vcpu, ra, vcpu->arch.vaddr_accessed);
-                       break;
-
                case OP_31_XOP_MTSPR:
                        emulated = kvmppc_emulate_mtspr(vcpu, sprn, rs);
                        break;
 
-               case OP_31_XOP_DCBST:
-               case OP_31_XOP_DCBF:
-               case OP_31_XOP_DCBI:
-                       /* Do nothing. The guest is performing dcbi because
-                        * hardware DMA is not snooped by the dcache, but
-                        * emulated DMA either goes through the dcache as
-                        * normal writes, or the host kernel has handled dcache
-                        * coherence. */
-                       break;
-
-               case OP_31_XOP_LWBRX:
-                       emulated = kvmppc_handle_load(run, vcpu, rt, 4, 0);
-                       break;
-
                case OP_31_XOP_TLBSYNC:
                        break;
 
-               case OP_31_XOP_STWBRX:
-                       emulated = kvmppc_handle_store(run, vcpu,
-                                                      kvmppc_get_gpr(vcpu, rs),
-                                                      4, 0);
-                       break;
-
-               case OP_31_XOP_LHBRX:
-                       emulated = kvmppc_handle_load(run, vcpu, rt, 2, 0);
-                       break;
-
-               case OP_31_XOP_STHBRX:
-                       emulated = kvmppc_handle_store(run, vcpu,
-                                                      kvmppc_get_gpr(vcpu, rs),
-                                                      2, 0);
-                       break;
-
                default:
                        /* Attempt core-specific emulation below. */
                        emulated = EMULATE_FAIL;
                }
                break;
 
-       case OP_LWZ:
-               emulated = kvmppc_handle_load(run, vcpu, rt, 4, 1);
-               break;
-
-       /* TBD: Add support for other 64 bit load variants like ldu, ldux, ldx etc. */
-       case OP_LD:
-               rt = get_rt(inst);
-               emulated = kvmppc_handle_load(run, vcpu, rt, 8, 1);
-               break;
-
-       case OP_LWZU:
-               emulated = kvmppc_handle_load(run, vcpu, rt, 4, 1);
-               kvmppc_set_gpr(vcpu, ra, vcpu->arch.vaddr_accessed);
-               break;
-
-       case OP_LBZ:
-               emulated = kvmppc_handle_load(run, vcpu, rt, 1, 1);
-               break;
-
-       case OP_LBZU:
-               emulated = kvmppc_handle_load(run, vcpu, rt, 1, 1);
-               kvmppc_set_gpr(vcpu, ra, vcpu->arch.vaddr_accessed);
-               break;
-
-       case OP_STW:
-               emulated = kvmppc_handle_store(run, vcpu,
-                                              kvmppc_get_gpr(vcpu, rs),
-                                              4, 1);
-               break;
-
-       /* TBD: Add support for other 64 bit store variants like stdu, stdux, stdx etc. */
-       case OP_STD:
-               rs = get_rs(inst);
-               emulated = kvmppc_handle_store(run, vcpu,
-                                              kvmppc_get_gpr(vcpu, rs),
-                                              8, 1);
-               break;
-
-       case OP_STWU:
-               emulated = kvmppc_handle_store(run, vcpu,
-                                              kvmppc_get_gpr(vcpu, rs),
-                                              4, 1);
-               kvmppc_set_gpr(vcpu, ra, vcpu->arch.vaddr_accessed);
-               break;
-
-       case OP_STB:
-               emulated = kvmppc_handle_store(run, vcpu,
-                                              kvmppc_get_gpr(vcpu, rs),
-                                              1, 1);
-               break;
-
-       case OP_STBU:
-               emulated = kvmppc_handle_store(run, vcpu,
-                                              kvmppc_get_gpr(vcpu, rs),
-                                              1, 1);
-               kvmppc_set_gpr(vcpu, ra, vcpu->arch.vaddr_accessed);
-               break;
-
-       case OP_LHZ:
-               emulated = kvmppc_handle_load(run, vcpu, rt, 2, 1);
-               break;
-
-       case OP_LHZU:
-               emulated = kvmppc_handle_load(run, vcpu, rt, 2, 1);
-               kvmppc_set_gpr(vcpu, ra, vcpu->arch.vaddr_accessed);
-               break;
-
-       case OP_LHA:
-               emulated = kvmppc_handle_loads(run, vcpu, rt, 2, 1);
-               break;
-
-       case OP_LHAU:
-               emulated = kvmppc_handle_loads(run, vcpu, rt, 2, 1);
-               kvmppc_set_gpr(vcpu, ra, vcpu->arch.vaddr_accessed);
-               break;
-
-       case OP_STH:
-               emulated = kvmppc_handle_store(run, vcpu,
-                                              kvmppc_get_gpr(vcpu, rs),
-                                              2, 1);
-               break;
-
-       case OP_STHU:
-               emulated = kvmppc_handle_store(run, vcpu,
-                                              kvmppc_get_gpr(vcpu, rs),
-                                              2, 1);
-               kvmppc_set_gpr(vcpu, ra, vcpu->arch.vaddr_accessed);
-               break;
-
        default:
                emulated = EMULATE_FAIL;
        }
diff --git a/arch/powerpc/kvm/emulate_loadstore.c b/arch/powerpc/kvm/emulate_loadstore.c
new file mode 100644 (file)
index 0000000..0de4ffa
--- /dev/null
@@ -0,0 +1,272 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ * Copyright IBM Corp. 2007
+ * Copyright 2011 Freescale Semiconductor, Inc.
+ *
+ * Authors: Hollis Blanchard <hollisb@us.ibm.com>
+ */
+
+#include <linux/jiffies.h>
+#include <linux/hrtimer.h>
+#include <linux/types.h>
+#include <linux/string.h>
+#include <linux/kvm_host.h>
+#include <linux/clockchips.h>
+
+#include <asm/reg.h>
+#include <asm/time.h>
+#include <asm/byteorder.h>
+#include <asm/kvm_ppc.h>
+#include <asm/disassemble.h>
+#include <asm/ppc-opcode.h>
+#include "timing.h"
+#include "trace.h"
+
+/* XXX to do:
+ * lhax
+ * lhaux
+ * lswx
+ * lswi
+ * stswx
+ * stswi
+ * lha
+ * lhau
+ * lmw
+ * stmw
+ *
+ */
+int kvmppc_emulate_loadstore(struct kvm_vcpu *vcpu)
+{
+       struct kvm_run *run = vcpu->run;
+       u32 inst;
+       int ra, rs, rt;
+       enum emulation_result emulated;
+       int advance = 1;
+
+       /* this default type might be overwritten by subcategories */
+       kvmppc_set_exit_type(vcpu, EMULATED_INST_EXITS);
+
+       emulated = kvmppc_get_last_inst(vcpu, false, &inst);
+       if (emulated != EMULATE_DONE)
+               return emulated;
+
+       ra = get_ra(inst);
+       rs = get_rs(inst);
+       rt = get_rt(inst);
+
+       switch (get_op(inst)) {
+       case 31:
+               switch (get_xop(inst)) {
+               case OP_31_XOP_LWZX:
+                       emulated = kvmppc_handle_load(run, vcpu, rt, 4, 1);
+                       break;
+
+               case OP_31_XOP_LBZX:
+                       emulated = kvmppc_handle_load(run, vcpu, rt, 1, 1);
+                       break;
+
+               case OP_31_XOP_LBZUX:
+                       emulated = kvmppc_handle_load(run, vcpu, rt, 1, 1);
+                       kvmppc_set_gpr(vcpu, ra, vcpu->arch.vaddr_accessed);
+                       break;
+
+               case OP_31_XOP_STWX:
+                       emulated = kvmppc_handle_store(run, vcpu,
+                                                      kvmppc_get_gpr(vcpu, rs),
+                                                      4, 1);
+                       break;
+
+               case OP_31_XOP_STBX:
+                       emulated = kvmppc_handle_store(run, vcpu,
+                                                      kvmppc_get_gpr(vcpu, rs),
+                                                      1, 1);
+                       break;
+
+               case OP_31_XOP_STBUX:
+                       emulated = kvmppc_handle_store(run, vcpu,
+                                                      kvmppc_get_gpr(vcpu, rs),
+                                                      1, 1);
+                       kvmppc_set_gpr(vcpu, ra, vcpu->arch.vaddr_accessed);
+                       break;
+
+               case OP_31_XOP_LHAX:
+                       emulated = kvmppc_handle_loads(run, vcpu, rt, 2, 1);
+                       break;
+
+               case OP_31_XOP_LHZX:
+                       emulated = kvmppc_handle_load(run, vcpu, rt, 2, 1);
+                       break;
+
+               case OP_31_XOP_LHZUX:
+                       emulated = kvmppc_handle_load(run, vcpu, rt, 2, 1);
+                       kvmppc_set_gpr(vcpu, ra, vcpu->arch.vaddr_accessed);
+                       break;
+
+               case OP_31_XOP_STHX:
+                       emulated = kvmppc_handle_store(run, vcpu,
+                                                      kvmppc_get_gpr(vcpu, rs),
+                                                      2, 1);
+                       break;
+
+               case OP_31_XOP_STHUX:
+                       emulated = kvmppc_handle_store(run, vcpu,
+                                                      kvmppc_get_gpr(vcpu, rs),
+                                                      2, 1);
+                       kvmppc_set_gpr(vcpu, ra, vcpu->arch.vaddr_accessed);
+                       break;
+
+               case OP_31_XOP_DCBST:
+               case OP_31_XOP_DCBF:
+               case OP_31_XOP_DCBI:
+                       /* Do nothing. The guest is performing dcbi because
+                        * hardware DMA is not snooped by the dcache, but
+                        * emulated DMA either goes through the dcache as
+                        * normal writes, or the host kernel has handled dcache
+                        * coherence. */
+                       break;
+
+               case OP_31_XOP_LWBRX:
+                       emulated = kvmppc_handle_load(run, vcpu, rt, 4, 0);
+                       break;
+
+               case OP_31_XOP_STWBRX:
+                       emulated = kvmppc_handle_store(run, vcpu,
+                                                      kvmppc_get_gpr(vcpu, rs),
+                                                      4, 0);
+                       break;
+
+               case OP_31_XOP_LHBRX:
+                       emulated = kvmppc_handle_load(run, vcpu, rt, 2, 0);
+                       break;
+
+               case OP_31_XOP_STHBRX:
+                       emulated = kvmppc_handle_store(run, vcpu,
+                                                      kvmppc_get_gpr(vcpu, rs),
+                                                      2, 0);
+                       break;
+
+               default:
+                       emulated = EMULATE_FAIL;
+                       break;
+               }
+               break;
+
+       case OP_LWZ:
+               emulated = kvmppc_handle_load(run, vcpu, rt, 4, 1);
+               break;
+
+       /* TBD: Add support for other 64 bit load variants like ldu, ldux, ldx etc. */
+       case OP_LD:
+               rt = get_rt(inst);
+               emulated = kvmppc_handle_load(run, vcpu, rt, 8, 1);
+               break;
+
+       case OP_LWZU:
+               emulated = kvmppc_handle_load(run, vcpu, rt, 4, 1);
+               kvmppc_set_gpr(vcpu, ra, vcpu->arch.vaddr_accessed);
+               break;
+
+       case OP_LBZ:
+               emulated = kvmppc_handle_load(run, vcpu, rt, 1, 1);
+               break;
+
+       case OP_LBZU:
+               emulated = kvmppc_handle_load(run, vcpu, rt, 1, 1);
+               kvmppc_set_gpr(vcpu, ra, vcpu->arch.vaddr_accessed);
+               break;
+
+       case OP_STW:
+               emulated = kvmppc_handle_store(run, vcpu,
+                                              kvmppc_get_gpr(vcpu, rs),
+                                              4, 1);
+               break;
+
+       /* TBD: Add support for other 64 bit store variants like stdu, stdux, stdx etc. */
+       case OP_STD:
+               rs = get_rs(inst);
+               emulated = kvmppc_handle_store(run, vcpu,
+                                              kvmppc_get_gpr(vcpu, rs),
+                                              8, 1);
+               break;
+
+       case OP_STWU:
+               emulated = kvmppc_handle_store(run, vcpu,
+                                              kvmppc_get_gpr(vcpu, rs),
+                                              4, 1);
+               kvmppc_set_gpr(vcpu, ra, vcpu->arch.vaddr_accessed);
+               break;
+
+       case OP_STB:
+               emulated = kvmppc_handle_store(run, vcpu,
+                                              kvmppc_get_gpr(vcpu, rs),
+                                              1, 1);
+               break;
+
+       case OP_STBU:
+               emulated = kvmppc_handle_store(run, vcpu,
+                                              kvmppc_get_gpr(vcpu, rs),
+                                              1, 1);
+               kvmppc_set_gpr(vcpu, ra, vcpu->arch.vaddr_accessed);
+               break;
+
+       case OP_LHZ:
+               emulated = kvmppc_handle_load(run, vcpu, rt, 2, 1);
+               break;
+
+       case OP_LHZU:
+               emulated = kvmppc_handle_load(run, vcpu, rt, 2, 1);
+               kvmppc_set_gpr(vcpu, ra, vcpu->arch.vaddr_accessed);
+               break;
+
+       case OP_LHA:
+               emulated = kvmppc_handle_loads(run, vcpu, rt, 2, 1);
+               break;
+
+       case OP_LHAU:
+               emulated = kvmppc_handle_loads(run, vcpu, rt, 2, 1);
+               kvmppc_set_gpr(vcpu, ra, vcpu->arch.vaddr_accessed);
+               break;
+
+       case OP_STH:
+               emulated = kvmppc_handle_store(run, vcpu,
+                                              kvmppc_get_gpr(vcpu, rs),
+                                              2, 1);
+               break;
+
+       case OP_STHU:
+               emulated = kvmppc_handle_store(run, vcpu,
+                                              kvmppc_get_gpr(vcpu, rs),
+                                              2, 1);
+               kvmppc_set_gpr(vcpu, ra, vcpu->arch.vaddr_accessed);
+               break;
+
+       default:
+               emulated = EMULATE_FAIL;
+               break;
+       }
+
+       if (emulated == EMULATE_FAIL) {
+               advance = 0;
+               kvmppc_core_queue_program(vcpu, 0);
+       }
+
+       trace_kvm_ppc_instr(inst, kvmppc_get_pc(vcpu), emulated);
+
+       /* Advance past emulated instruction. */
+       if (advance)
+               kvmppc_set_pc(vcpu, kvmppc_get_pc(vcpu) + 4);
+
+       return emulated;
+}
index b68d0dc9479a820dd469a36c3c21bc5f6b7e8188..39b3a8f816f28d0ecd61ca8a110d22bb99fb4507 100644 (file)
@@ -1826,8 +1826,7 @@ int kvm_set_msi(struct kvm_kernel_irq_routing_entry *e,
        return 0;
 }
 
-int kvm_set_routing_entry(struct kvm_irq_routing_table *rt,
-                         struct kvm_kernel_irq_routing_entry *e,
+int kvm_set_routing_entry(struct kvm_kernel_irq_routing_entry *e,
                          const struct kvm_irq_routing_entry *ue)
 {
        int r = -EINVAL;
@@ -1839,7 +1838,6 @@ int kvm_set_routing_entry(struct kvm_irq_routing_table *rt,
                e->irqchip.pin = ue->u.irqchip.pin;
                if (e->irqchip.pin >= KVM_IRQCHIP_NUM_PINS)
                        goto out;
-               rt->chip[ue->u.irqchip.irqchip][e->irqchip.pin] = ue->gsi;
                break;
        case KVM_IRQ_ROUTING_MSI:
                e->set = kvm_set_msi;
index 61c738ab128383064f86d159cb6bd2dacbcc17b9..4c79284b58be9d0870eebbf62a772dbdf701598c 100644 (file)
@@ -190,6 +190,25 @@ int kvmppc_kvm_pv(struct kvm_vcpu *vcpu)
                vcpu->arch.magic_page_pa = param1 & ~0xfffULL;
                vcpu->arch.magic_page_ea = param2 & ~0xfffULL;
 
+#ifdef CONFIG_PPC_64K_PAGES
+               /*
+                * Make sure our 4k magic page is in the same window of a 64k
+                * page within the guest and within the host's page.
+                */
+               if ((vcpu->arch.magic_page_pa & 0xf000) !=
+                   ((ulong)vcpu->arch.shared & 0xf000)) {
+                       void *old_shared = vcpu->arch.shared;
+                       ulong shared = (ulong)vcpu->arch.shared;
+                       void *new_shared;
+
+                       shared &= PAGE_MASK;
+                       shared |= vcpu->arch.magic_page_pa & 0xf000;
+                       new_shared = (void*)shared;
+                       memcpy(new_shared, old_shared, 0x1000);
+                       vcpu->arch.shared = new_shared;
+               }
+#endif
+
                r2 = KVM_MAGIC_FEAT_SR | KVM_MAGIC_FEAT_MAS0_TO_SPRG7;
 
                r = EV_SUCCESS;
@@ -198,7 +217,6 @@ int kvmppc_kvm_pv(struct kvm_vcpu *vcpu)
        case KVM_HCALL_TOKEN(KVM_HC_FEATURES):
                r = EV_SUCCESS;
 #if defined(CONFIG_PPC_BOOK3S) || defined(CONFIG_KVM_E500V2)
-               /* XXX Missing magic page on 44x */
                r2 |= (1 << KVM_FEATURE_MAGIC_PAGE);
 #endif
 
@@ -254,13 +272,16 @@ int kvmppc_emulate_mmio(struct kvm_run *run, struct kvm_vcpu *vcpu)
        enum emulation_result er;
        int r;
 
-       er = kvmppc_emulate_instruction(run, vcpu);
+       er = kvmppc_emulate_loadstore(vcpu);
        switch (er) {
        case EMULATE_DONE:
                /* Future optimization: only reload non-volatiles if they were
                 * actually modified. */
                r = RESUME_GUEST_NV;
                break;
+       case EMULATE_AGAIN:
+               r = RESUME_GUEST;
+               break;
        case EMULATE_DO_MMIO:
                run->exit_reason = KVM_EXIT_MMIO;
                /* We must reload nonvolatiles because "update" load/store
@@ -270,11 +291,15 @@ int kvmppc_emulate_mmio(struct kvm_run *run, struct kvm_vcpu *vcpu)
                r = RESUME_HOST_NV;
                break;
        case EMULATE_FAIL:
+       {
+               u32 last_inst;
+
+               kvmppc_get_last_inst(vcpu, false, &last_inst);
                /* XXX Deliver Program interrupt to guest. */
-               printk(KERN_EMERG "%s: emulation failed (%08x)\n", __func__,
-                      kvmppc_get_last_inst(vcpu));
+               pr_emerg("%s: emulation failed (%08x)\n", __func__, last_inst);
                r = RESUME_HOST;
                break;
+       }
        default:
                WARN_ON(1);
                r = RESUME_GUEST;
@@ -284,6 +309,81 @@ int kvmppc_emulate_mmio(struct kvm_run *run, struct kvm_vcpu *vcpu)
 }
 EXPORT_SYMBOL_GPL(kvmppc_emulate_mmio);
 
+int kvmppc_st(struct kvm_vcpu *vcpu, ulong *eaddr, int size, void *ptr,
+             bool data)
+{
+       ulong mp_pa = vcpu->arch.magic_page_pa & KVM_PAM & PAGE_MASK;
+       struct kvmppc_pte pte;
+       int r;
+
+       vcpu->stat.st++;
+
+       r = kvmppc_xlate(vcpu, *eaddr, data ? XLATE_DATA : XLATE_INST,
+                        XLATE_WRITE, &pte);
+       if (r < 0)
+               return r;
+
+       *eaddr = pte.raddr;
+
+       if (!pte.may_write)
+               return -EPERM;
+
+       /* Magic page override */
+       if (kvmppc_supports_magic_page(vcpu) && mp_pa &&
+           ((pte.raddr & KVM_PAM & PAGE_MASK) == mp_pa) &&
+           !(kvmppc_get_msr(vcpu) & MSR_PR)) {
+               void *magic = vcpu->arch.shared;
+               magic += pte.eaddr & 0xfff;
+               memcpy(magic, ptr, size);
+               return EMULATE_DONE;
+       }
+
+       if (kvm_write_guest(vcpu->kvm, pte.raddr, ptr, size))
+               return EMULATE_DO_MMIO;
+
+       return EMULATE_DONE;
+}
+EXPORT_SYMBOL_GPL(kvmppc_st);
+
+int kvmppc_ld(struct kvm_vcpu *vcpu, ulong *eaddr, int size, void *ptr,
+                     bool data)
+{
+       ulong mp_pa = vcpu->arch.magic_page_pa & KVM_PAM & PAGE_MASK;
+       struct kvmppc_pte pte;
+       int rc;
+
+       vcpu->stat.ld++;
+
+       rc = kvmppc_xlate(vcpu, *eaddr, data ? XLATE_DATA : XLATE_INST,
+                         XLATE_READ, &pte);
+       if (rc)
+               return rc;
+
+       *eaddr = pte.raddr;
+
+       if (!pte.may_read)
+               return -EPERM;
+
+       if (!data && !pte.may_execute)
+               return -ENOEXEC;
+
+       /* Magic page override */
+       if (kvmppc_supports_magic_page(vcpu) && mp_pa &&
+           ((pte.raddr & KVM_PAM & PAGE_MASK) == mp_pa) &&
+           !(kvmppc_get_msr(vcpu) & MSR_PR)) {
+               void *magic = vcpu->arch.shared;
+               magic += pte.eaddr & 0xfff;
+               memcpy(ptr, magic, size);
+               return EMULATE_DONE;
+       }
+
+       if (kvm_read_guest(vcpu->kvm, pte.raddr, ptr, size))
+               return EMULATE_DO_MMIO;
+
+       return EMULATE_DONE;
+}
+EXPORT_SYMBOL_GPL(kvmppc_ld);
+
 int kvm_arch_hardware_enable(void *garbage)
 {
        return 0;
@@ -366,14 +466,20 @@ void kvm_arch_sync_events(struct kvm *kvm)
 {
 }
 
-int kvm_dev_ioctl_check_extension(long ext)
+int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
 {
        int r;
-       /* FIXME!!
-        * Should some of this be vm ioctl ? is it possible now ?
-        */
+       /* Assume we're using HV mode when the HV module is loaded */
        int hv_enabled = kvmppc_hv_ops ? 1 : 0;
 
+       if (kvm) {
+               /*
+                * Hooray - we know which VM type we're running on. Depend on
+                * that rather than the guess above.
+                */
+               hv_enabled = is_kvmppc_hv_enabled(kvm);
+       }
+
        switch (ext) {
 #ifdef CONFIG_BOOKE
        case KVM_CAP_PPC_BOOKE_SREGS:
@@ -387,6 +493,7 @@ int kvm_dev_ioctl_check_extension(long ext)
        case KVM_CAP_PPC_UNSET_IRQ:
        case KVM_CAP_PPC_IRQ_LEVEL:
        case KVM_CAP_ENABLE_CAP:
+       case KVM_CAP_ENABLE_CAP_VM:
        case KVM_CAP_ONE_REG:
        case KVM_CAP_IOEVENTFD:
        case KVM_CAP_DEVICE_CTRL:
@@ -417,6 +524,7 @@ int kvm_dev_ioctl_check_extension(long ext)
        case KVM_CAP_PPC_ALLOC_HTAB:
        case KVM_CAP_PPC_RTAS:
        case KVM_CAP_PPC_FIXUP_HCALL:
+       case KVM_CAP_PPC_ENABLE_HCALL:
 #ifdef CONFIG_KVM_XICS
        case KVM_CAP_IRQ_XICS:
 #endif
@@ -635,12 +743,6 @@ void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu)
 #endif
 }
 
-static void kvmppc_complete_dcr_load(struct kvm_vcpu *vcpu,
-                                     struct kvm_run *run)
-{
-       kvmppc_set_gpr(vcpu, vcpu->arch.io_gpr, run->dcr.data);
-}
-
 static void kvmppc_complete_mmio_load(struct kvm_vcpu *vcpu,
                                       struct kvm_run *run)
 {
@@ -837,10 +939,6 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)
                if (!vcpu->mmio_is_write)
                        kvmppc_complete_mmio_load(vcpu, run);
                vcpu->mmio_needed = 0;
-       } else if (vcpu->arch.dcr_needed) {
-               if (!vcpu->arch.dcr_is_write)
-                       kvmppc_complete_dcr_load(vcpu, run);
-               vcpu->arch.dcr_needed = 0;
        } else if (vcpu->arch.osi_needed) {
                u64 *gprs = run->osi.gprs;
                int i;
@@ -1099,6 +1197,42 @@ int kvm_vm_ioctl_irq_line(struct kvm *kvm, struct kvm_irq_level *irq_event,
        return 0;
 }
 
+
+static int kvm_vm_ioctl_enable_cap(struct kvm *kvm,
+                                  struct kvm_enable_cap *cap)
+{
+       int r;
+
+       if (cap->flags)
+               return -EINVAL;
+
+       switch (cap->cap) {
+#ifdef CONFIG_KVM_BOOK3S_64_HANDLER
+       case KVM_CAP_PPC_ENABLE_HCALL: {
+               unsigned long hcall = cap->args[0];
+
+               r = -EINVAL;
+               if (hcall > MAX_HCALL_OPCODE || (hcall & 3) ||
+                   cap->args[1] > 1)
+                       break;
+               if (!kvmppc_book3s_hcall_implemented(kvm, hcall))
+                       break;
+               if (cap->args[1])
+                       set_bit(hcall / 4, kvm->arch.enabled_hcalls);
+               else
+                       clear_bit(hcall / 4, kvm->arch.enabled_hcalls);
+               r = 0;
+               break;
+       }
+#endif
+       default:
+               r = -EINVAL;
+               break;
+       }
+
+       return r;
+}
+
 long kvm_arch_vm_ioctl(struct file *filp,
                        unsigned int ioctl, unsigned long arg)
 {
@@ -1118,6 +1252,15 @@ long kvm_arch_vm_ioctl(struct file *filp,
 
                break;
        }
+       case KVM_ENABLE_CAP:
+       {
+               struct kvm_enable_cap cap;
+               r = -EFAULT;
+               if (copy_from_user(&cap, argp, sizeof(cap)))
+                       goto out;
+               r = kvm_vm_ioctl_enable_cap(kvm, &cap);
+               break;
+       }
 #ifdef CONFIG_PPC_BOOK3S_64
        case KVM_CREATE_SPAPR_TCE: {
                struct kvm_create_spapr_tce create_tce;
@@ -1204,3 +1347,5 @@ void kvm_arch_exit(void)
 {
 
 }
+
+EXPORT_TRACEPOINT_SYMBOL_GPL(kvm_ppc_instr);
index 07b6110a4bb74b17ab07b8b3b237d004d2376c16..e44d2b2ea97e34a2dd7538ab8b484757513a6c8e 100644 (file)
@@ -110,7 +110,6 @@ void kvmppc_update_timing_stats(struct kvm_vcpu *vcpu)
 
 static const char *kvm_exit_names[__NUMBER_OF_KVM_EXIT_TYPES] = {
        [MMIO_EXITS] =              "MMIO",
-       [DCR_EXITS] =               "DCR",
        [SIGNAL_EXITS] =            "SIGNAL",
        [ITLB_REAL_MISS_EXITS] =    "ITLBREAL",
        [ITLB_VIRT_MISS_EXITS] =    "ITLBVIRT",
index bf191e72b2d88ce3b0c66b7e39470bc033145a43..3123690c82dc11a1f1c36b43687e554d96f93892 100644 (file)
@@ -63,9 +63,6 @@ static inline void kvmppc_account_exit_stat(struct kvm_vcpu *vcpu, int type)
        case EMULATED_INST_EXITS:
                vcpu->stat.emulated_inst_exits++;
                break;
-       case DCR_EXITS:
-               vcpu->stat.dcr_exits++;
-               break;
        case DSI_EXITS:
                vcpu->stat.dsi_exits++;
                break;
index 10d529ac9821e93f7212fd6a4670c3357f96c7df..646db9c467d136d211650b0d6cdaea63ff85d2a1 100644 (file)
@@ -26,6 +26,7 @@ config KVM
        select KVM_ASYNC_PF
        select KVM_ASYNC_PF_SYNC
        select HAVE_KVM_IRQCHIP
+       select HAVE_KVM_IRQFD
        select HAVE_KVM_IRQ_ROUTING
        ---help---
          Support hosting paravirtualized guest machines using the SIE
index 92528a0bdda6c0063de80e4a5d22fdefef7edd25..f4c819bfc1930933bbe9f10f38b4167ef96340e8 100644 (file)
@@ -1556,8 +1556,7 @@ static int set_adapter_int(struct kvm_kernel_irq_routing_entry *e,
        return ret;
 }
 
-int kvm_set_routing_entry(struct kvm_irq_routing_table *rt,
-                         struct kvm_kernel_irq_routing_entry *e,
+int kvm_set_routing_entry(struct kvm_kernel_irq_routing_entry *e,
                          const struct kvm_irq_routing_entry *ue)
 {
        int ret;
index 339b34a02fb8bde7b4a3dad72ceada710a675590..ce81eb2ab76a207128069119acaac4e92918fa99 100644 (file)
@@ -146,7 +146,7 @@ long kvm_arch_dev_ioctl(struct file *filp,
        return -EINVAL;
 }
 
-int kvm_dev_ioctl_check_extension(long ext)
+int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
 {
        int r;
 
index 287e4c85fff9f8f8acef22bb79502e28641a8d2d..f9d16ff56c6b18df942da02b08aa6fc20fbc6068 100644 (file)
@@ -27,6 +27,7 @@ config KVM
        select MMU_NOTIFIER
        select ANON_INODES
        select HAVE_KVM_IRQCHIP
+       select HAVE_KVM_IRQFD
        select HAVE_KVM_IRQ_ROUTING
        select HAVE_KVM_EVENTFD
        select KVM_APIC_ARCHITECTURE
index bd0da433e6d72471b259616980cfeac8748bd5cf..a1ec6a50a05a989f21d9de173f342907d45de699 100644 (file)
@@ -108,7 +108,7 @@ int kvm_cpu_get_interrupt(struct kvm_vcpu *v)
 
        vector = kvm_cpu_get_extint(v);
 
-       if (kvm_apic_vid_enabled(v->kvm) || vector != -1)
+       if (vector != -1)
                return vector;                  /* PIC */
 
        return kvm_get_apic_interrupt(v);       /* APIC */
index 3855103f71fdac09469d48469b6eed530c52c29b..08e8a899e005be109bc0fec7f342968179b80cc1 100644 (file)
@@ -352,25 +352,46 @@ static inline int apic_find_highest_irr(struct kvm_lapic *apic)
 
 static inline void apic_clear_irr(int vec, struct kvm_lapic *apic)
 {
-       apic->irr_pending = false;
+       struct kvm_vcpu *vcpu;
+
+       vcpu = apic->vcpu;
+
        apic_clear_vector(vec, apic->regs + APIC_IRR);
-       if (apic_search_irr(apic) != -1)
-               apic->irr_pending = true;
+       if (unlikely(kvm_apic_vid_enabled(vcpu->kvm)))
+               /* try to update RVI */
+               kvm_make_request(KVM_REQ_EVENT, vcpu);
+       else {
+               vec = apic_search_irr(apic);
+               apic->irr_pending = (vec != -1);
+       }
 }
 
 static inline void apic_set_isr(int vec, struct kvm_lapic *apic)
 {
-       /* Note that we never get here with APIC virtualization enabled.  */
+       struct kvm_vcpu *vcpu;
+
+       if (__apic_test_and_set_vector(vec, apic->regs + APIC_ISR))
+               return;
+
+       vcpu = apic->vcpu;
 
-       if (!__apic_test_and_set_vector(vec, apic->regs + APIC_ISR))
-               ++apic->isr_count;
-       BUG_ON(apic->isr_count > MAX_APIC_VECTOR);
        /*
-        * ISR (in service register) bit is set when injecting an interrupt.
-        * The highest vector is injected. Thus the latest bit set matches
-        * the highest bit in ISR.
+        * With APIC virtualization enabled, all caching is disabled
+        * because the processor can modify ISR under the hood.  Instead
+        * just set SVI.
         */
-       apic->highest_isr_cache = vec;
+       if (unlikely(kvm_apic_vid_enabled(vcpu->kvm)))
+               kvm_x86_ops->hwapic_isr_update(vcpu->kvm, vec);
+       else {
+               ++apic->isr_count;
+               BUG_ON(apic->isr_count > MAX_APIC_VECTOR);
+               /*
+                * ISR (in service register) bit is set when injecting an interrupt.
+                * The highest vector is injected. Thus the latest bit set matches
+                * the highest bit in ISR.
+                */
+               apic->highest_isr_cache = vec;
+       }
 }
 
 static inline int apic_find_highest_isr(struct kvm_lapic *apic)
@@ -1627,11 +1648,16 @@ int kvm_get_apic_interrupt(struct kvm_vcpu *vcpu)
        int vector = kvm_apic_has_interrupt(vcpu);
        struct kvm_lapic *apic = vcpu->arch.apic;
 
-       /* Note that we never get here with APIC virtualization enabled.  */
-
        if (vector == -1)
                return -1;
 
+       /*
+        * We get here even with APIC virtualization enabled, if doing
+        * nested virtualization and L1 runs with the "acknowledge interrupt
+        * on exit" mode.  Then we cannot inject the interrupt via RVI,
+        * because the process would deliver it through the IDT.
+        */
+
        apic_set_isr(vector, apic);
        apic_update_ppr(apic);
        apic_clear_irr(vector, apic);
index e618f34bde2d795a8a86b4072df085b781d982ac..bfe11cf124a1ea26cfa8513ceac83d450e13c7ef 100644 (file)
@@ -8754,6 +8754,8 @@ static void nested_vmx_vmexit(struct kvm_vcpu *vcpu, u32 exit_reason,
        prepare_vmcs12(vcpu, vmcs12, exit_reason, exit_intr_info,
                       exit_qualification);
 
+       vmx_load_vmcs01(vcpu);
+
        if ((exit_reason == EXIT_REASON_EXTERNAL_INTERRUPT)
            && nested_exit_intr_ack_set(vcpu)) {
                int irq = kvm_cpu_get_interrupt(vcpu);
@@ -8769,8 +8771,6 @@ static void nested_vmx_vmexit(struct kvm_vcpu *vcpu, u32 exit_reason,
                                       vmcs12->vm_exit_intr_error_code,
                                       KVM_ISA_VMX);
 
-       vmx_load_vmcs01(vcpu);
-
        vm_entry_controls_init(vmx, vmcs_read32(VM_ENTRY_CONTROLS));
        vm_exit_controls_init(vmx, vmcs_read32(VM_EXIT_CONTROLS));
        vmx_segment_cache_clear(vmx);
index ca3d760dd5817f45ab6ea87a33fa075105095e2d..8f1e22d3b286ccf03c90dc3bc28f120fe27a244b 100644 (file)
@@ -2636,7 +2636,7 @@ out:
        return r;
 }
 
-int kvm_dev_ioctl_check_extension(long ext)
+int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
 {
        int r;
 
index 94813515fdd66f4685a5dc632b346551536dd125..c0cb11fb500895f60b91e8ad1af679d878d40903 100644 (file)
@@ -1828,8 +1828,19 @@ static void __init xen_hvm_guest_init(void)
        xen_hvm_init_mmu_ops();
 }
 
+static bool xen_nopv = false;
+static __init int xen_parse_nopv(char *arg)
+{
+       xen_nopv = true;
+       return 0;
+}
+early_param("xen_nopv", xen_parse_nopv);
+
 static uint32_t __init xen_hvm_platform(void)
 {
+       if (xen_nopv)
+               return 0;
+
        if (xen_pv_domain())
                return 0;
 
@@ -1838,6 +1849,8 @@ static uint32_t __init xen_hvm_platform(void)
 
 bool xen_hvm_need_lapic(void)
 {
+       if (xen_nopv)
+               return false;
        if (xen_pv_domain())
                return false;
        if (!xen_hvm_domain())
index ebfa9b2c871db56a2a6a631e5502acdf96e2032e..c0413046483ae9862c1d487348b3a701a2045e3a 100644 (file)
@@ -49,7 +49,7 @@
 static struct gnttab_vm_area {
        struct vm_struct *area;
        pte_t **ptes;
-} gnttab_shared_vm_area, gnttab_status_vm_area;
+} gnttab_shared_vm_area;
 
 int arch_gnttab_map_shared(unsigned long *frames, unsigned long nr_gframes,
                           unsigned long max_nr_gframes,
@@ -73,43 +73,16 @@ int arch_gnttab_map_shared(unsigned long *frames, unsigned long nr_gframes,
        return 0;
 }
 
-int arch_gnttab_map_status(uint64_t *frames, unsigned long nr_gframes,
-                          unsigned long max_nr_gframes,
-                          grant_status_t **__shared)
-{
-       grant_status_t *shared = *__shared;
-       unsigned long addr;
-       unsigned long i;
-
-       if (shared == NULL)
-               *__shared = shared = gnttab_status_vm_area.area->addr;
-
-       addr = (unsigned long)shared;
-
-       for (i = 0; i < nr_gframes; i++) {
-               set_pte_at(&init_mm, addr, gnttab_status_vm_area.ptes[i],
-                          mfn_pte(frames[i], PAGE_KERNEL));
-               addr += PAGE_SIZE;
-       }
-
-       return 0;
-}
-
 void arch_gnttab_unmap(void *shared, unsigned long nr_gframes)
 {
-       pte_t **ptes;
        unsigned long addr;
        unsigned long i;
 
-       if (shared == gnttab_status_vm_area.area->addr)
-               ptes = gnttab_status_vm_area.ptes;
-       else
-               ptes = gnttab_shared_vm_area.ptes;
-
        addr = (unsigned long)shared;
 
        for (i = 0; i < nr_gframes; i++) {
-               set_pte_at(&init_mm, addr, ptes[i], __pte(0));
+               set_pte_at(&init_mm, addr, gnttab_shared_vm_area.ptes[i],
+                          __pte(0));
                addr += PAGE_SIZE;
        }
 }
@@ -129,35 +102,12 @@ static int arch_gnttab_valloc(struct gnttab_vm_area *area, unsigned nr_frames)
        return 0;
 }
 
-static void arch_gnttab_vfree(struct gnttab_vm_area *area)
+int arch_gnttab_init(unsigned long nr_shared)
 {
-       free_vm_area(area->area);
-       kfree(area->ptes);
-}
-
-int arch_gnttab_init(unsigned long nr_shared, unsigned long nr_status)
-{
-       int ret;
-
        if (!xen_pv_domain())
                return 0;
 
-       ret = arch_gnttab_valloc(&gnttab_shared_vm_area, nr_shared);
-       if (ret < 0)
-               return ret;
-
-       /*
-        * Always allocate the space for the status frames in case
-        * we're migrated to a host with V2 support.
-        */
-       ret = arch_gnttab_valloc(&gnttab_status_vm_area, nr_status);
-       if (ret < 0)
-               goto err;
-
-       return 0;
-  err:
-       arch_gnttab_vfree(&gnttab_shared_vm_area);
-       return -ENOMEM;
+       return arch_gnttab_valloc(&gnttab_shared_vm_area, nr_shared);
 }
 
 #ifdef CONFIG_XEN_PVH
index 9bb3d82ffec8f8de8c0fb4f9db920ea260543171..3172692381aec4bb5dade9851fa7fa7715d58e46 100644 (file)
@@ -841,10 +841,9 @@ unsigned long __init set_phys_range_identity(unsigned long pfn_s,
                        pfn = ALIGN(pfn, P2M_PER_PAGE);
        }
 
-       if (!WARN((pfn - pfn_s) != (pfn_e - pfn_s),
+       WARN((pfn - pfn_s) != (pfn_e - pfn_s),
                "Identity mapping failed. We are %ld short of 1-1 mappings!\n",
-               (pfn_e - pfn_s) - (pfn - pfn_s)))
-               printk(KERN_DEBUG "1-1 mapping on %lx->%lx\n", pfn_s, pfn);
+               (pfn_e - pfn_s) - (pfn - pfn_s));
 
        return pfn - pfn_s;
 }
index 558a239954e84813bb73de6826416341649d64d3..d8961ef4d2e70ddf33f123905700f3772c82c2aa 100644 (file)
@@ -25,7 +25,8 @@
 #include <linux/module.h>
 #include <linux/platform_device.h>
 #include <linux/io.h>
-#include <linux/tegra-ahb.h>
+
+#include <soc/tegra/ahb.h>
 
 #define DRV_NAME "tegra-ahb"
 
index 1f37d9870e7a034fce68cc80efd4ab5bb1aed1e8..603eb1be4f6aa6bc79e0d3b9aeb31d92356018ff 100644 (file)
@@ -50,6 +50,14 @@ config ARM_CCI
          Driver supporting the CCI cache coherent interconnect for ARM
          platforms.
 
+config ARM_CCN
+       bool "ARM CCN driver support"
+       depends on ARM || ARM64
+       depends on PERF_EVENTS
+       help
+         PMU (perf) driver supporting the ARM CCN (Cache Coherent Network)
+         interconnect.
+
 config VEXPRESS_CONFIG
        bool "Versatile Express configuration bus"
        default y if ARCH_VEXPRESS
index 6a4ea7e4af1a9d8f46bb6ebaf0521f2df252db29..2973c18cbcc2781626645ec02434393baf0b2e1b 100644 (file)
@@ -9,7 +9,9 @@ obj-$(CONFIG_OMAP_OCP2SCP)      += omap-ocp2scp.o
 
 # Interconnect bus driver for OMAP SoCs.
 obj-$(CONFIG_OMAP_INTERCONNECT)        += omap_l3_smx.o omap_l3_noc.o
-# CCI cache coherent interconnect for ARM platforms
+
+# Interconnect bus drivers for ARM platforms
 obj-$(CONFIG_ARM_CCI)          += arm-cci.o
+obj-$(CONFIG_ARM_CCN)          += arm-ccn.o
 
 obj-$(CONFIG_VEXPRESS_CONFIG)  += vexpress-config.o
index 5a86da97a70be0ba58b15a387a6cbd2a0999611a..7af78df241f2199d20bd692599027493a30dde6b 100644 (file)
@@ -397,7 +397,8 @@ static irqreturn_t pmu_handle_irq(int irq_num, void *dev)
                hw_counter = &event->hw;
 
                /* Did this counter overflow? */
-               if (!pmu_read_register(idx, CCI_PMU_OVRFLW) & CCI_PMU_OVRFLW_FLAG)
+               if (!(pmu_read_register(idx, CCI_PMU_OVRFLW) &
+                     CCI_PMU_OVRFLW_FLAG))
                        continue;
 
                pmu_write_register(CCI_PMU_OVRFLW_FLAG, idx, CCI_PMU_OVRFLW);
diff --git a/drivers/bus/arm-ccn.c b/drivers/bus/arm-ccn.c
new file mode 100644 (file)
index 0000000..3266f8f
--- /dev/null
@@ -0,0 +1,1391 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * Copyright (C) 2014 ARM Limited
+ */
+
+#include <linux/ctype.h>
+#include <linux/hrtimer.h>
+#include <linux/idr.h>
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/module.h>
+#include <linux/perf_event.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+
+#define CCN_NUM_XP_PORTS 2
+#define CCN_NUM_VCS 4
+#define CCN_NUM_REGIONS        256
+#define CCN_REGION_SIZE        0x10000
+
+#define CCN_ALL_OLY_ID                 0xff00
+#define CCN_ALL_OLY_ID__OLY_ID__SHIFT                  0
+#define CCN_ALL_OLY_ID__OLY_ID__MASK                   0x1f
+#define CCN_ALL_OLY_ID__NODE_ID__SHIFT                 8
+#define CCN_ALL_OLY_ID__NODE_ID__MASK                  0x3f
+
+#define CCN_MN_ERRINT_STATUS           0x0008
+#define CCN_MN_ERRINT_STATUS__INTREQ__DESSERT          0x11
+#define CCN_MN_ERRINT_STATUS__ALL_ERRORS__ENABLE       0x02
+#define CCN_MN_ERRINT_STATUS__ALL_ERRORS__DISABLED     0x20
+#define CCN_MN_ERRINT_STATUS__ALL_ERRORS__DISABLE      0x22
+#define CCN_MN_ERRINT_STATUS__CORRECTED_ERRORS_ENABLE  0x04
+#define CCN_MN_ERRINT_STATUS__CORRECTED_ERRORS_DISABLED        0x40
+#define CCN_MN_ERRINT_STATUS__CORRECTED_ERRORS_DISABLE 0x44
+#define CCN_MN_ERRINT_STATUS__PMU_EVENTS__ENABLE       0x08
+#define CCN_MN_ERRINT_STATUS__PMU_EVENTS__DISABLED     0x80
+#define CCN_MN_ERRINT_STATUS__PMU_EVENTS__DISABLE      0x88
+#define CCN_MN_OLY_COMP_LIST_63_0      0x01e0
+#define CCN_MN_ERR_SIG_VAL_63_0                0x0300
+#define CCN_MN_ERR_SIG_VAL_63_0__DT                    (1 << 1)
+
+#define CCN_DT_ACTIVE_DSM              0x0000
+#define CCN_DT_ACTIVE_DSM__DSM_ID__SHIFT(n)            ((n) * 8)
+#define CCN_DT_ACTIVE_DSM__DSM_ID__MASK                        0xff
+#define CCN_DT_CTL                     0x0028
+#define CCN_DT_CTL__DT_EN                              (1 << 0)
+#define CCN_DT_PMEVCNT(n)              (0x0100 + (n) * 0x8)
+#define CCN_DT_PMCCNTR                 0x0140
+#define CCN_DT_PMCCNTRSR               0x0190
+#define CCN_DT_PMOVSR                  0x0198
+#define CCN_DT_PMOVSR_CLR              0x01a0
+#define CCN_DT_PMCR                    0x01a8
+#define CCN_DT_PMCR__OVFL_INTR_EN                      (1 << 6)
+#define CCN_DT_PMCR__PMU_EN                            (1 << 0)
+#define CCN_DT_PMSR                    0x01b0
+#define CCN_DT_PMSR_REQ                        0x01b8
+#define CCN_DT_PMSR_CLR                        0x01c0
+
+#define CCN_HNF_PMU_EVENT_SEL          0x0600
+#define CCN_HNF_PMU_EVENT_SEL__ID__SHIFT(n)            ((n) * 4)
+#define CCN_HNF_PMU_EVENT_SEL__ID__MASK                        0xf
+
+#define CCN_XP_DT_CONFIG               0x0300
+#define CCN_XP_DT_CONFIG__DT_CFG__SHIFT(n)             ((n) * 4)
+#define CCN_XP_DT_CONFIG__DT_CFG__MASK                 0xf
+#define CCN_XP_DT_CONFIG__DT_CFG__PASS_THROUGH         0x0
+#define CCN_XP_DT_CONFIG__DT_CFG__WATCHPOINT_0_OR_1    0x1
+#define CCN_XP_DT_CONFIG__DT_CFG__WATCHPOINT(n)                (0x2 + (n))
+#define CCN_XP_DT_CONFIG__DT_CFG__XP_PMU_EVENT(n)      (0x4 + (n))
+#define CCN_XP_DT_CONFIG__DT_CFG__DEVICE_PMU_EVENT(d, n) (0x8 + (d) * 4 + (n))
+#define CCN_XP_DT_INTERFACE_SEL                0x0308
+#define CCN_XP_DT_INTERFACE_SEL__DT_IO_SEL__SHIFT(n)   (0 + (n) * 8)
+#define CCN_XP_DT_INTERFACE_SEL__DT_IO_SEL__MASK       0x1
+#define CCN_XP_DT_INTERFACE_SEL__DT_DEV_SEL__SHIFT(n)  (1 + (n) * 8)
+#define CCN_XP_DT_INTERFACE_SEL__DT_DEV_SEL__MASK      0x1
+#define CCN_XP_DT_INTERFACE_SEL__DT_VC_SEL__SHIFT(n)   (2 + (n) * 8)
+#define CCN_XP_DT_INTERFACE_SEL__DT_VC_SEL__MASK       0x3
+#define CCN_XP_DT_CMP_VAL_L(n)         (0x0310 + (n) * 0x40)
+#define CCN_XP_DT_CMP_VAL_H(n)         (0x0318 + (n) * 0x40)
+#define CCN_XP_DT_CMP_MASK_L(n)                (0x0320 + (n) * 0x40)
+#define CCN_XP_DT_CMP_MASK_H(n)                (0x0328 + (n) * 0x40)
+#define CCN_XP_DT_CONTROL              0x0370
+#define CCN_XP_DT_CONTROL__DT_ENABLE                   (1 << 0)
+#define CCN_XP_DT_CONTROL__WP_ARM_SEL__SHIFT(n)                (12 + (n) * 4)
+#define CCN_XP_DT_CONTROL__WP_ARM_SEL__MASK            0xf
+#define CCN_XP_DT_CONTROL__WP_ARM_SEL__ALWAYS          0xf
+#define CCN_XP_PMU_EVENT_SEL           0x0600
+#define CCN_XP_PMU_EVENT_SEL__ID__SHIFT(n)             ((n) * 7)
+#define CCN_XP_PMU_EVENT_SEL__ID__MASK                 0x3f
+
+#define CCN_SBAS_PMU_EVENT_SEL         0x0600
+#define CCN_SBAS_PMU_EVENT_SEL__ID__SHIFT(n)           ((n) * 4)
+#define CCN_SBAS_PMU_EVENT_SEL__ID__MASK               0xf
+
+#define CCN_RNI_PMU_EVENT_SEL          0x0600
+#define CCN_RNI_PMU_EVENT_SEL__ID__SHIFT(n)            ((n) * 4)
+#define CCN_RNI_PMU_EVENT_SEL__ID__MASK                        0xf
+
+#define CCN_TYPE_MN    0x01
+#define CCN_TYPE_DT    0x02
+#define CCN_TYPE_HNF   0x04
+#define CCN_TYPE_HNI   0x05
+#define CCN_TYPE_XP    0x08
+#define CCN_TYPE_SBSX  0x0c
+#define CCN_TYPE_SBAS  0x10
+#define CCN_TYPE_RNI_1P        0x14
+#define CCN_TYPE_RNI_2P        0x15
+#define CCN_TYPE_RNI_3P        0x16
+#define CCN_TYPE_RND_1P        0x18 /* RN-D = RN-I + DVM */
+#define CCN_TYPE_RND_2P        0x19
+#define CCN_TYPE_RND_3P        0x1a
+#define CCN_TYPE_CYCLES        0xff /* Pseudotype */
+
+#define CCN_EVENT_WATCHPOINT 0xfe /* Pseudoevent */
+
+#define CCN_NUM_PMU_EVENTS             4
+#define CCN_NUM_XP_WATCHPOINTS         2 /* See DT.dbg_id.num_watchpoints */
+#define CCN_NUM_PMU_EVENT_COUNTERS     8 /* See DT.dbg_id.num_pmucntr */
+#define CCN_IDX_PMU_CYCLE_COUNTER      CCN_NUM_PMU_EVENT_COUNTERS
+
+#define CCN_NUM_PREDEFINED_MASKS       4
+#define CCN_IDX_MASK_ANY               (CCN_NUM_PMU_EVENT_COUNTERS + 0)
+#define CCN_IDX_MASK_EXACT             (CCN_NUM_PMU_EVENT_COUNTERS + 1)
+#define CCN_IDX_MASK_ORDER             (CCN_NUM_PMU_EVENT_COUNTERS + 2)
+#define CCN_IDX_MASK_OPCODE            (CCN_NUM_PMU_EVENT_COUNTERS + 3)
+
+struct arm_ccn_component {
+       void __iomem *base;
+       u32 type;
+
+       DECLARE_BITMAP(pmu_events_mask, CCN_NUM_PMU_EVENTS);
+       union {
+               struct {
+                       DECLARE_BITMAP(dt_cmp_mask, CCN_NUM_XP_WATCHPOINTS);
+               } xp;
+       };
+};
+
+#define pmu_to_arm_ccn(_pmu) container_of(container_of(_pmu, \
+       struct arm_ccn_dt, pmu), struct arm_ccn, dt)
+
+struct arm_ccn_dt {
+       int id;
+       void __iomem *base;
+
+       spinlock_t config_lock;
+
+       DECLARE_BITMAP(pmu_counters_mask, CCN_NUM_PMU_EVENT_COUNTERS + 1);
+       struct {
+               struct arm_ccn_component *source;
+               struct perf_event *event;
+       } pmu_counters[CCN_NUM_PMU_EVENT_COUNTERS + 1];
+
+       struct {
+              u64 l, h;
+       } cmp_mask[CCN_NUM_PMU_EVENT_COUNTERS + CCN_NUM_PREDEFINED_MASKS];
+
+       struct hrtimer hrtimer;
+
+       struct pmu pmu;
+};
+
+struct arm_ccn {
+       struct device *dev;
+       void __iomem *base;
+       unsigned irq_used:1;
+       unsigned sbas_present:1;
+       unsigned sbsx_present:1;
+
+       int num_nodes;
+       struct arm_ccn_component *node;
+
+       int num_xps;
+       struct arm_ccn_component *xp;
+
+       struct arm_ccn_dt dt;
+};
+
+
+static int arm_ccn_node_to_xp(int node)
+{
+       return node / CCN_NUM_XP_PORTS;
+}
+
+static int arm_ccn_node_to_xp_port(int node)
+{
+       return node % CCN_NUM_XP_PORTS;
+}
+
+
+/*
+ * Bit shifts and masks in these defines must be kept in sync with
+ * arm_ccn_pmu_config_set() and CCN_FORMAT_ATTRs below!
+ */
+#define CCN_CONFIG_NODE(_config)       (((_config) >> 0) & 0xff)
+#define CCN_CONFIG_XP(_config)         (((_config) >> 0) & 0xff)
+#define CCN_CONFIG_TYPE(_config)       (((_config) >> 8) & 0xff)
+#define CCN_CONFIG_EVENT(_config)      (((_config) >> 16) & 0xff)
+#define CCN_CONFIG_PORT(_config)       (((_config) >> 24) & 0x3)
+#define CCN_CONFIG_VC(_config)         (((_config) >> 26) & 0x7)
+#define CCN_CONFIG_DIR(_config)                (((_config) >> 29) & 0x1)
+#define CCN_CONFIG_MASK(_config)       (((_config) >> 30) & 0xf)
+
+static void arm_ccn_pmu_config_set(u64 *config, u32 node_xp, u32 type, u32 port)
+{
+       *config &= ~((0xff << 0) | (0xff << 8) | (0xff << 24));
+       *config |= (node_xp << 0) | (type << 8) | (port << 24);
+}
+
+static ssize_t arm_ccn_pmu_format_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct dev_ext_attribute *ea = container_of(attr,
+                       struct dev_ext_attribute, attr);
+
+       return snprintf(buf, PAGE_SIZE, "%s\n", (char *)ea->var);
+}
+
+#define CCN_FORMAT_ATTR(_name, _config) \
+       struct dev_ext_attribute arm_ccn_pmu_format_attr_##_name = \
+                       { __ATTR(_name, S_IRUGO, arm_ccn_pmu_format_show, \
+                       NULL), _config }
+
+static CCN_FORMAT_ATTR(node, "config:0-7");
+static CCN_FORMAT_ATTR(xp, "config:0-7");
+static CCN_FORMAT_ATTR(type, "config:8-15");
+static CCN_FORMAT_ATTR(event, "config:16-23");
+static CCN_FORMAT_ATTR(port, "config:24-25");
+static CCN_FORMAT_ATTR(vc, "config:26-28");
+static CCN_FORMAT_ATTR(dir, "config:29-29");
+static CCN_FORMAT_ATTR(mask, "config:30-33");
+static CCN_FORMAT_ATTR(cmp_l, "config1:0-62");
+static CCN_FORMAT_ATTR(cmp_h, "config2:0-59");
+
+static struct attribute *arm_ccn_pmu_format_attrs[] = {
+       &arm_ccn_pmu_format_attr_node.attr.attr,
+       &arm_ccn_pmu_format_attr_xp.attr.attr,
+       &arm_ccn_pmu_format_attr_type.attr.attr,
+       &arm_ccn_pmu_format_attr_event.attr.attr,
+       &arm_ccn_pmu_format_attr_port.attr.attr,
+       &arm_ccn_pmu_format_attr_vc.attr.attr,
+       &arm_ccn_pmu_format_attr_dir.attr.attr,
+       &arm_ccn_pmu_format_attr_mask.attr.attr,
+       &arm_ccn_pmu_format_attr_cmp_l.attr.attr,
+       &arm_ccn_pmu_format_attr_cmp_h.attr.attr,
+       NULL
+};
+
+static struct attribute_group arm_ccn_pmu_format_attr_group = {
+       .name = "format",
+       .attrs = arm_ccn_pmu_format_attrs,
+};
+
+
+struct arm_ccn_pmu_event {
+       struct device_attribute attr;
+       u32 type;
+       u32 event;
+       int num_ports;
+       int num_vcs;
+       const char *def;
+       int mask;
+};
+
+#define CCN_EVENT_ATTR(_name) \
+       __ATTR(_name, S_IRUGO, arm_ccn_pmu_event_show, NULL)
+
+/*
+ * Events defined in TRM for MN, HN-I and SBSX are actually watchpoints set on
+ * their ports in XP they are connected to. For the sake of usability they are
+ * explicitly defined here (and translated into a relevant watchpoint in
+ * arm_ccn_pmu_event_init()) so the user can easily request them without deep
+ * knowledge of the flit format.
+ */
+
+#define CCN_EVENT_MN(_name, _def, _mask) { .attr = CCN_EVENT_ATTR(mn_##_name), \
+               .type = CCN_TYPE_MN, .event = CCN_EVENT_WATCHPOINT, \
+               .num_ports = CCN_NUM_XP_PORTS, .num_vcs = CCN_NUM_VCS, \
+               .def = _def, .mask = _mask, }
+
+#define CCN_EVENT_HNI(_name, _def, _mask) { \
+               .attr = CCN_EVENT_ATTR(hni_##_name), .type = CCN_TYPE_HNI, \
+               .event = CCN_EVENT_WATCHPOINT, .num_ports = CCN_NUM_XP_PORTS, \
+               .num_vcs = CCN_NUM_VCS, .def = _def, .mask = _mask, }
+
+#define CCN_EVENT_SBSX(_name, _def, _mask) { \
+               .attr = CCN_EVENT_ATTR(sbsx_##_name), .type = CCN_TYPE_SBSX, \
+               .event = CCN_EVENT_WATCHPOINT, .num_ports = CCN_NUM_XP_PORTS, \
+               .num_vcs = CCN_NUM_VCS, .def = _def, .mask = _mask, }
+
+#define CCN_EVENT_HNF(_name, _event) { .attr = CCN_EVENT_ATTR(hnf_##_name), \
+               .type = CCN_TYPE_HNF, .event = _event, }
+
+#define CCN_EVENT_XP(_name, _event) { .attr = CCN_EVENT_ATTR(xp_##_name), \
+               .type = CCN_TYPE_XP, .event = _event, \
+               .num_ports = CCN_NUM_XP_PORTS, .num_vcs = CCN_NUM_VCS, }
+
+/*
+ * RN-I & RN-D (RN-D = RN-I + DVM) nodes have different type ID depending
+ * on configuration. One of them is picked to represent the whole group,
+ * as they all share the same event types.
+ */
+#define CCN_EVENT_RNI(_name, _event) { .attr = CCN_EVENT_ATTR(rni_##_name), \
+               .type = CCN_TYPE_RNI_3P, .event = _event, }
+
+#define CCN_EVENT_SBAS(_name, _event) { .attr = CCN_EVENT_ATTR(sbas_##_name), \
+               .type = CCN_TYPE_SBAS, .event = _event, }
+
+#define CCN_EVENT_CYCLES(_name) { .attr = CCN_EVENT_ATTR(_name), \
+               .type = CCN_TYPE_CYCLES }
+
+
+static ssize_t arm_ccn_pmu_event_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct arm_ccn_pmu_event *event = container_of(attr,
+                       struct arm_ccn_pmu_event, attr);
+       ssize_t res;
+
+       res = snprintf(buf, PAGE_SIZE, "type=0x%x", event->type);
+       if (event->event)
+               res += snprintf(buf + res, PAGE_SIZE - res, ",event=0x%x",
+                               event->event);
+       if (event->def)
+               res += snprintf(buf + res, PAGE_SIZE - res, ",%s",
+                               event->def);
+       if (event->mask)
+               res += snprintf(buf + res, PAGE_SIZE - res, ",mask=0x%x",
+                               event->mask);
+       res += snprintf(buf + res, PAGE_SIZE - res, "\n");
+
+       return res;
+}
+
+static umode_t arm_ccn_pmu_events_is_visible(struct kobject *kobj,
+                                    struct attribute *attr, int index)
+{
+       struct device *dev = kobj_to_dev(kobj);
+       struct arm_ccn *ccn = pmu_to_arm_ccn(dev_get_drvdata(dev));
+       struct device_attribute *dev_attr = container_of(attr,
+                       struct device_attribute, attr);
+       struct arm_ccn_pmu_event *event = container_of(dev_attr,
+                       struct arm_ccn_pmu_event, attr);
+
+       if (event->type == CCN_TYPE_SBAS && !ccn->sbas_present)
+               return 0;
+       if (event->type == CCN_TYPE_SBSX && !ccn->sbsx_present)
+               return 0;
+
+       return attr->mode;
+}
+
+static struct arm_ccn_pmu_event arm_ccn_pmu_events[] = {
+       CCN_EVENT_MN(eobarrier, "dir=0,vc=0,cmp_h=0x1c00", CCN_IDX_MASK_OPCODE),
+       CCN_EVENT_MN(ecbarrier, "dir=0,vc=0,cmp_h=0x1e00", CCN_IDX_MASK_OPCODE),
+       CCN_EVENT_MN(dvmop, "dir=0,vc=0,cmp_h=0x2800", CCN_IDX_MASK_OPCODE),
+       CCN_EVENT_HNI(txdatflits, "dir=1,vc=3", CCN_IDX_MASK_ANY),
+       CCN_EVENT_HNI(rxdatflits, "dir=0,vc=3", CCN_IDX_MASK_ANY),
+       CCN_EVENT_HNI(txreqflits, "dir=1,vc=0", CCN_IDX_MASK_ANY),
+       CCN_EVENT_HNI(rxreqflits, "dir=0,vc=0", CCN_IDX_MASK_ANY),
+       CCN_EVENT_HNI(rxreqflits_order, "dir=0,vc=0,cmp_h=0x8000",
+                       CCN_IDX_MASK_ORDER),
+       CCN_EVENT_SBSX(txdatflits, "dir=1,vc=3", CCN_IDX_MASK_ANY),
+       CCN_EVENT_SBSX(rxdatflits, "dir=0,vc=3", CCN_IDX_MASK_ANY),
+       CCN_EVENT_SBSX(txreqflits, "dir=1,vc=0", CCN_IDX_MASK_ANY),
+       CCN_EVENT_SBSX(rxreqflits, "dir=0,vc=0", CCN_IDX_MASK_ANY),
+       CCN_EVENT_SBSX(rxreqflits_order, "dir=0,vc=0,cmp_h=0x8000",
+                       CCN_IDX_MASK_ORDER),
+       CCN_EVENT_HNF(cache_miss, 0x1),
+       CCN_EVENT_HNF(l3_sf_cache_access, 0x02),
+       CCN_EVENT_HNF(cache_fill, 0x3),
+       CCN_EVENT_HNF(pocq_retry, 0x4),
+       CCN_EVENT_HNF(pocq_reqs_recvd, 0x5),
+       CCN_EVENT_HNF(sf_hit, 0x6),
+       CCN_EVENT_HNF(sf_evictions, 0x7),
+       CCN_EVENT_HNF(snoops_sent, 0x8),
+       CCN_EVENT_HNF(snoops_broadcast, 0x9),
+       CCN_EVENT_HNF(l3_eviction, 0xa),
+       CCN_EVENT_HNF(l3_fill_invalid_way, 0xb),
+       CCN_EVENT_HNF(mc_retries, 0xc),
+       CCN_EVENT_HNF(mc_reqs, 0xd),
+       CCN_EVENT_HNF(qos_hh_retry, 0xe),
+       CCN_EVENT_RNI(rdata_beats_p0, 0x1),
+       CCN_EVENT_RNI(rdata_beats_p1, 0x2),
+       CCN_EVENT_RNI(rdata_beats_p2, 0x3),
+       CCN_EVENT_RNI(rxdat_flits, 0x4),
+       CCN_EVENT_RNI(txdat_flits, 0x5),
+       CCN_EVENT_RNI(txreq_flits, 0x6),
+       CCN_EVENT_RNI(txreq_flits_retried, 0x7),
+       CCN_EVENT_RNI(rrt_full, 0x8),
+       CCN_EVENT_RNI(wrt_full, 0x9),
+       CCN_EVENT_RNI(txreq_flits_replayed, 0xa),
+       CCN_EVENT_XP(upload_starvation, 0x1),
+       CCN_EVENT_XP(download_starvation, 0x2),
+       CCN_EVENT_XP(respin, 0x3),
+       CCN_EVENT_XP(valid_flit, 0x4),
+       CCN_EVENT_XP(watchpoint, CCN_EVENT_WATCHPOINT),
+       CCN_EVENT_SBAS(rdata_beats_p0, 0x1),
+       CCN_EVENT_SBAS(rxdat_flits, 0x4),
+       CCN_EVENT_SBAS(txdat_flits, 0x5),
+       CCN_EVENT_SBAS(txreq_flits, 0x6),
+       CCN_EVENT_SBAS(txreq_flits_retried, 0x7),
+       CCN_EVENT_SBAS(rrt_full, 0x8),
+       CCN_EVENT_SBAS(wrt_full, 0x9),
+       CCN_EVENT_SBAS(txreq_flits_replayed, 0xa),
+       CCN_EVENT_CYCLES(cycles),
+};
+
+/* Populated in arm_ccn_init() */
+static struct attribute
+               *arm_ccn_pmu_events_attrs[ARRAY_SIZE(arm_ccn_pmu_events) + 1];
+
+static struct attribute_group arm_ccn_pmu_events_attr_group = {
+       .name = "events",
+       .is_visible = arm_ccn_pmu_events_is_visible,
+       .attrs = arm_ccn_pmu_events_attrs,
+};
+
+
+static u64 *arm_ccn_pmu_get_cmp_mask(struct arm_ccn *ccn, const char *name)
+{
+       unsigned long i;
+
+       if (WARN_ON(!name || !name[0] || !isxdigit(name[0]) || !name[1]))
+               return NULL;
+       i = isdigit(name[0]) ? name[0] - '0' : 0xa + tolower(name[0]) - 'a';
+
+       switch (name[1]) {
+       case 'l':
+               return &ccn->dt.cmp_mask[i].l;
+       case 'h':
+               return &ccn->dt.cmp_mask[i].h;
+       default:
+               return NULL;
+       }
+}
+
+static ssize_t arm_ccn_pmu_cmp_mask_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct arm_ccn *ccn = pmu_to_arm_ccn(dev_get_drvdata(dev));
+       u64 *mask = arm_ccn_pmu_get_cmp_mask(ccn, attr->attr.name);
+
+       return mask ? snprintf(buf, PAGE_SIZE, "0x%016llx\n", *mask) : -EINVAL;
+}
+
+static ssize_t arm_ccn_pmu_cmp_mask_store(struct device *dev,
+               struct device_attribute *attr, const char *buf, size_t count)
+{
+       struct arm_ccn *ccn = pmu_to_arm_ccn(dev_get_drvdata(dev));
+       u64 *mask = arm_ccn_pmu_get_cmp_mask(ccn, attr->attr.name);
+       int err = -EINVAL;
+
+       if (mask)
+               err = kstrtoull(buf, 0, mask);
+
+       return err ? err : count;
+}
+
+#define CCN_CMP_MASK_ATTR(_name) \
+       struct device_attribute arm_ccn_pmu_cmp_mask_attr_##_name = \
+                       __ATTR(_name, S_IRUGO | S_IWUSR, \
+                       arm_ccn_pmu_cmp_mask_show, arm_ccn_pmu_cmp_mask_store)
+
+#define CCN_CMP_MASK_ATTR_RO(_name) \
+       struct device_attribute arm_ccn_pmu_cmp_mask_attr_##_name = \
+                       __ATTR(_name, S_IRUGO, arm_ccn_pmu_cmp_mask_show, NULL)
+
+static CCN_CMP_MASK_ATTR(0l);
+static CCN_CMP_MASK_ATTR(0h);
+static CCN_CMP_MASK_ATTR(1l);
+static CCN_CMP_MASK_ATTR(1h);
+static CCN_CMP_MASK_ATTR(2l);
+static CCN_CMP_MASK_ATTR(2h);
+static CCN_CMP_MASK_ATTR(3l);
+static CCN_CMP_MASK_ATTR(3h);
+static CCN_CMP_MASK_ATTR(4l);
+static CCN_CMP_MASK_ATTR(4h);
+static CCN_CMP_MASK_ATTR(5l);
+static CCN_CMP_MASK_ATTR(5h);
+static CCN_CMP_MASK_ATTR(6l);
+static CCN_CMP_MASK_ATTR(6h);
+static CCN_CMP_MASK_ATTR(7l);
+static CCN_CMP_MASK_ATTR(7h);
+static CCN_CMP_MASK_ATTR_RO(8l);
+static CCN_CMP_MASK_ATTR_RO(8h);
+static CCN_CMP_MASK_ATTR_RO(9l);
+static CCN_CMP_MASK_ATTR_RO(9h);
+static CCN_CMP_MASK_ATTR_RO(al);
+static CCN_CMP_MASK_ATTR_RO(ah);
+static CCN_CMP_MASK_ATTR_RO(bl);
+static CCN_CMP_MASK_ATTR_RO(bh);
+
+static struct attribute *arm_ccn_pmu_cmp_mask_attrs[] = {
+       &arm_ccn_pmu_cmp_mask_attr_0l.attr, &arm_ccn_pmu_cmp_mask_attr_0h.attr,
+       &arm_ccn_pmu_cmp_mask_attr_1l.attr, &arm_ccn_pmu_cmp_mask_attr_1h.attr,
+       &arm_ccn_pmu_cmp_mask_attr_2l.attr, &arm_ccn_pmu_cmp_mask_attr_2h.attr,
+       &arm_ccn_pmu_cmp_mask_attr_3l.attr, &arm_ccn_pmu_cmp_mask_attr_3h.attr,
+       &arm_ccn_pmu_cmp_mask_attr_4l.attr, &arm_ccn_pmu_cmp_mask_attr_4h.attr,
+       &arm_ccn_pmu_cmp_mask_attr_5l.attr, &arm_ccn_pmu_cmp_mask_attr_5h.attr,
+       &arm_ccn_pmu_cmp_mask_attr_6l.attr, &arm_ccn_pmu_cmp_mask_attr_6h.attr,
+       &arm_ccn_pmu_cmp_mask_attr_7l.attr, &arm_ccn_pmu_cmp_mask_attr_7h.attr,
+       &arm_ccn_pmu_cmp_mask_attr_8l.attr, &arm_ccn_pmu_cmp_mask_attr_8h.attr,
+       &arm_ccn_pmu_cmp_mask_attr_9l.attr, &arm_ccn_pmu_cmp_mask_attr_9h.attr,
+       &arm_ccn_pmu_cmp_mask_attr_al.attr, &arm_ccn_pmu_cmp_mask_attr_ah.attr,
+       &arm_ccn_pmu_cmp_mask_attr_bl.attr, &arm_ccn_pmu_cmp_mask_attr_bh.attr,
+       NULL
+};
+
+static struct attribute_group arm_ccn_pmu_cmp_mask_attr_group = {
+       .name = "cmp_mask",
+       .attrs = arm_ccn_pmu_cmp_mask_attrs,
+};
+
+
+/*
+ * Default poll period is 10ms, which is way over the top anyway,
+ * as in the worst case scenario (an event every cycle), with 1GHz
+ * clocked bus, the smallest, 32 bit counter will overflow in
+ * more than 4s.
+ */
+static unsigned int arm_ccn_pmu_poll_period_us = 10000;
+module_param_named(pmu_poll_period_us, arm_ccn_pmu_poll_period_us, uint,
+               S_IRUGO | S_IWUSR);
+
+static ktime_t arm_ccn_pmu_timer_period(void)
+{
+       return ns_to_ktime((u64)arm_ccn_pmu_poll_period_us * 1000);
+}
+
+
+static const struct attribute_group *arm_ccn_pmu_attr_groups[] = {
+       &arm_ccn_pmu_events_attr_group,
+       &arm_ccn_pmu_format_attr_group,
+       &arm_ccn_pmu_cmp_mask_attr_group,
+       NULL
+};
+
+
+static int arm_ccn_pmu_alloc_bit(unsigned long *bitmap, unsigned long size)
+{
+       int bit;
+
+       do {
+               bit = find_first_zero_bit(bitmap, size);
+               if (bit >= size)
+                       return -EAGAIN;
+       } while (test_and_set_bit(bit, bitmap));
+
+       return bit;
+}
+
+/* All RN-I and RN-D nodes have identical PMUs */
+static int arm_ccn_pmu_type_eq(u32 a, u32 b)
+{
+       if (a == b)
+               return 1;
+
+       switch (a) {
+       case CCN_TYPE_RNI_1P:
+       case CCN_TYPE_RNI_2P:
+       case CCN_TYPE_RNI_3P:
+       case CCN_TYPE_RND_1P:
+       case CCN_TYPE_RND_2P:
+       case CCN_TYPE_RND_3P:
+               switch (b) {
+               case CCN_TYPE_RNI_1P:
+               case CCN_TYPE_RNI_2P:
+               case CCN_TYPE_RNI_3P:
+               case CCN_TYPE_RND_1P:
+               case CCN_TYPE_RND_2P:
+               case CCN_TYPE_RND_3P:
+                       return 1;
+               }
+               break;
+       }
+
+       return 0;
+}
+
+static int arm_ccn_pmu_event_init(struct perf_event *event)
+{
+       struct arm_ccn *ccn;
+       struct hw_perf_event *hw = &event->hw;
+       u32 node_xp, type, event_id;
+       int valid, bit;
+       struct arm_ccn_component *source;
+       int i;
+
+       if (event->attr.type != event->pmu->type)
+               return -ENOENT;
+
+       ccn = pmu_to_arm_ccn(event->pmu);
+
+       if (hw->sample_period) {
+               dev_warn(ccn->dev, "Sampling not supported!\n");
+               return -EOPNOTSUPP;
+       }
+
+       if (has_branch_stack(event) || event->attr.exclude_user ||
+                       event->attr.exclude_kernel || event->attr.exclude_hv ||
+                       event->attr.exclude_idle) {
+               dev_warn(ccn->dev, "Can't exclude execution levels!\n");
+               return -EOPNOTSUPP;
+       }
+
+       if (event->cpu < 0) {
+               dev_warn(ccn->dev, "Can't provide per-task data!\n");
+               return -EOPNOTSUPP;
+       }
+
+       node_xp = CCN_CONFIG_NODE(event->attr.config);
+       type = CCN_CONFIG_TYPE(event->attr.config);
+       event_id = CCN_CONFIG_EVENT(event->attr.config);
+
+       /* Validate node/xp vs topology */
+       switch (type) {
+       case CCN_TYPE_XP:
+               if (node_xp >= ccn->num_xps) {
+                       dev_warn(ccn->dev, "Invalid XP ID %d!\n", node_xp);
+                       return -EINVAL;
+               }
+               break;
+       case CCN_TYPE_CYCLES:
+               break;
+       default:
+               if (node_xp >= ccn->num_nodes) {
+                       dev_warn(ccn->dev, "Invalid node ID %d!\n", node_xp);
+                       return -EINVAL;
+               }
+               if (!arm_ccn_pmu_type_eq(type, ccn->node[node_xp].type)) {
+                       dev_warn(ccn->dev, "Invalid type 0x%x for node %d!\n",
+                                       type, node_xp);
+                       return -EINVAL;
+               }
+               break;
+       }
+
+       /* Validate event ID vs available for the type */
+       for (i = 0, valid = 0; i < ARRAY_SIZE(arm_ccn_pmu_events) && !valid;
+                       i++) {
+               struct arm_ccn_pmu_event *e = &arm_ccn_pmu_events[i];
+               u32 port = CCN_CONFIG_PORT(event->attr.config);
+               u32 vc = CCN_CONFIG_VC(event->attr.config);
+
+               if (!arm_ccn_pmu_type_eq(type, e->type))
+                       continue;
+               if (event_id != e->event)
+                       continue;
+               if (e->num_ports && port >= e->num_ports) {
+                       dev_warn(ccn->dev, "Invalid port %d for node/XP %d!\n",
+                                       port, node_xp);
+                       return -EINVAL;
+               }
+               if (e->num_vcs && vc >= e->num_vcs) {
+                       dev_warn(ccn->dev, "Invalid vc %d for node/XP %d!\n",
+                                       port, node_xp);
+                       return -EINVAL;
+               }
+               valid = 1;
+       }
+       if (!valid) {
+               dev_warn(ccn->dev, "Invalid event 0x%x for node/XP %d!\n",
+                               event_id, node_xp);
+               return -EINVAL;
+       }
+
+       /* Watchpoint-based event for a node is actually set on XP */
+       if (event_id == CCN_EVENT_WATCHPOINT && type != CCN_TYPE_XP) {
+               u32 port;
+
+               type = CCN_TYPE_XP;
+               port = arm_ccn_node_to_xp_port(node_xp);
+               node_xp = arm_ccn_node_to_xp(node_xp);
+
+               arm_ccn_pmu_config_set(&event->attr.config,
+                               node_xp, type, port);
+       }
+
+       /* Allocate the cycle counter */
+       if (type == CCN_TYPE_CYCLES) {
+               if (test_and_set_bit(CCN_IDX_PMU_CYCLE_COUNTER,
+                               ccn->dt.pmu_counters_mask))
+                       return -EAGAIN;
+
+               hw->idx = CCN_IDX_PMU_CYCLE_COUNTER;
+               ccn->dt.pmu_counters[CCN_IDX_PMU_CYCLE_COUNTER].event = event;
+
+               return 0;
+       }
+
+       /* Allocate an event counter */
+       hw->idx = arm_ccn_pmu_alloc_bit(ccn->dt.pmu_counters_mask,
+                       CCN_NUM_PMU_EVENT_COUNTERS);
+       if (hw->idx < 0) {
+               dev_warn(ccn->dev, "No more counters available!\n");
+               return -EAGAIN;
+       }
+
+       if (type == CCN_TYPE_XP)
+               source = &ccn->xp[node_xp];
+       else
+               source = &ccn->node[node_xp];
+       ccn->dt.pmu_counters[hw->idx].source = source;
+
+       /* Allocate an event source or a watchpoint */
+       if (type == CCN_TYPE_XP && event_id == CCN_EVENT_WATCHPOINT)
+               bit = arm_ccn_pmu_alloc_bit(source->xp.dt_cmp_mask,
+                               CCN_NUM_XP_WATCHPOINTS);
+       else
+               bit = arm_ccn_pmu_alloc_bit(source->pmu_events_mask,
+                               CCN_NUM_PMU_EVENTS);
+       if (bit < 0) {
+               dev_warn(ccn->dev, "No more event sources/watchpoints on node/XP %d!\n",
+                               node_xp);
+               clear_bit(hw->idx, ccn->dt.pmu_counters_mask);
+               return -EAGAIN;
+       }
+       hw->config_base = bit;
+
+       ccn->dt.pmu_counters[hw->idx].event = event;
+
+       return 0;
+}
+
+static void arm_ccn_pmu_event_free(struct perf_event *event)
+{
+       struct arm_ccn *ccn = pmu_to_arm_ccn(event->pmu);
+       struct hw_perf_event *hw = &event->hw;
+
+       if (hw->idx == CCN_IDX_PMU_CYCLE_COUNTER) {
+               clear_bit(CCN_IDX_PMU_CYCLE_COUNTER, ccn->dt.pmu_counters_mask);
+       } else {
+               struct arm_ccn_component *source =
+                               ccn->dt.pmu_counters[hw->idx].source;
+
+               if (CCN_CONFIG_TYPE(event->attr.config) == CCN_TYPE_XP &&
+                               CCN_CONFIG_EVENT(event->attr.config) ==
+                               CCN_EVENT_WATCHPOINT)
+                       clear_bit(hw->config_base, source->xp.dt_cmp_mask);
+               else
+                       clear_bit(hw->config_base, source->pmu_events_mask);
+               clear_bit(hw->idx, ccn->dt.pmu_counters_mask);
+       }
+
+       ccn->dt.pmu_counters[hw->idx].source = NULL;
+       ccn->dt.pmu_counters[hw->idx].event = NULL;
+}
+
+static u64 arm_ccn_pmu_read_counter(struct arm_ccn *ccn, int idx)
+{
+       u64 res;
+
+       if (idx == CCN_IDX_PMU_CYCLE_COUNTER) {
+#ifdef readq
+               res = readq(ccn->dt.base + CCN_DT_PMCCNTR);
+#else
+               /* 40 bit counter, can do snapshot and read in two parts */
+               writel(0x1, ccn->dt.base + CCN_DT_PMSR_REQ);
+               while (!(readl(ccn->dt.base + CCN_DT_PMSR) & 0x1))
+                       ;
+               writel(0x1, ccn->dt.base + CCN_DT_PMSR_CLR);
+               res = readl(ccn->dt.base + CCN_DT_PMCCNTRSR + 4) & 0xff;
+               res <<= 32;
+               res |= readl(ccn->dt.base + CCN_DT_PMCCNTRSR);
+#endif
+       } else {
+               res = readl(ccn->dt.base + CCN_DT_PMEVCNT(idx));
+       }
+
+       return res;
+}
+
+static void arm_ccn_pmu_event_update(struct perf_event *event)
+{
+       struct arm_ccn *ccn = pmu_to_arm_ccn(event->pmu);
+       struct hw_perf_event *hw = &event->hw;
+       u64 prev_count, new_count, mask;
+
+       do {
+               prev_count = local64_read(&hw->prev_count);
+               new_count = arm_ccn_pmu_read_counter(ccn, hw->idx);
+       } while (local64_xchg(&hw->prev_count, new_count) != prev_count);
+
+       mask = (1LLU << (hw->idx == CCN_IDX_PMU_CYCLE_COUNTER ? 40 : 32)) - 1;
+
+       local64_add((new_count - prev_count) & mask, &event->count);
+}
+
+static void arm_ccn_pmu_xp_dt_config(struct perf_event *event, int enable)
+{
+       struct arm_ccn *ccn = pmu_to_arm_ccn(event->pmu);
+       struct hw_perf_event *hw = &event->hw;
+       struct arm_ccn_component *xp;
+       u32 val, dt_cfg;
+
+       if (CCN_CONFIG_TYPE(event->attr.config) == CCN_TYPE_XP)
+               xp = &ccn->xp[CCN_CONFIG_XP(event->attr.config)];
+       else
+               xp = &ccn->xp[arm_ccn_node_to_xp(
+                               CCN_CONFIG_NODE(event->attr.config))];
+
+       if (enable)
+               dt_cfg = hw->event_base;
+       else
+               dt_cfg = CCN_XP_DT_CONFIG__DT_CFG__PASS_THROUGH;
+
+       spin_lock(&ccn->dt.config_lock);
+
+       val = readl(xp->base + CCN_XP_DT_CONFIG);
+       val &= ~(CCN_XP_DT_CONFIG__DT_CFG__MASK <<
+                       CCN_XP_DT_CONFIG__DT_CFG__SHIFT(hw->idx));
+       val |= dt_cfg << CCN_XP_DT_CONFIG__DT_CFG__SHIFT(hw->idx);
+       writel(val, xp->base + CCN_XP_DT_CONFIG);
+
+       spin_unlock(&ccn->dt.config_lock);
+}
+
+static void arm_ccn_pmu_event_start(struct perf_event *event, int flags)
+{
+       struct arm_ccn *ccn = pmu_to_arm_ccn(event->pmu);
+       struct hw_perf_event *hw = &event->hw;
+
+       local64_set(&event->hw.prev_count,
+                       arm_ccn_pmu_read_counter(ccn, hw->idx));
+       hw->state = 0;
+
+       if (!ccn->irq_used)
+               hrtimer_start(&ccn->dt.hrtimer, arm_ccn_pmu_timer_period(),
+                               HRTIMER_MODE_REL);
+
+       /* Set the DT bus input, engaging the counter */
+       arm_ccn_pmu_xp_dt_config(event, 1);
+}
+
+static void arm_ccn_pmu_event_stop(struct perf_event *event, int flags)
+{
+       struct arm_ccn *ccn = pmu_to_arm_ccn(event->pmu);
+       struct hw_perf_event *hw = &event->hw;
+       u64 timeout;
+
+       /* Disable counting, setting the DT bus to pass-through mode */
+       arm_ccn_pmu_xp_dt_config(event, 0);
+
+       if (!ccn->irq_used)
+               hrtimer_cancel(&ccn->dt.hrtimer);
+
+       /* Let the DT bus drain */
+       timeout = arm_ccn_pmu_read_counter(ccn, CCN_IDX_PMU_CYCLE_COUNTER) +
+                       ccn->num_xps;
+       while (arm_ccn_pmu_read_counter(ccn, CCN_IDX_PMU_CYCLE_COUNTER) <
+                       timeout)
+               cpu_relax();
+
+       if (flags & PERF_EF_UPDATE)
+               arm_ccn_pmu_event_update(event);
+
+       hw->state |= PERF_HES_STOPPED;
+}
+
+static void arm_ccn_pmu_xp_watchpoint_config(struct perf_event *event)
+{
+       struct arm_ccn *ccn = pmu_to_arm_ccn(event->pmu);
+       struct hw_perf_event *hw = &event->hw;
+       struct arm_ccn_component *source =
+                       ccn->dt.pmu_counters[hw->idx].source;
+       unsigned long wp = hw->config_base;
+       u32 val;
+       u64 cmp_l = event->attr.config1;
+       u64 cmp_h = event->attr.config2;
+       u64 mask_l = ccn->dt.cmp_mask[CCN_CONFIG_MASK(event->attr.config)].l;
+       u64 mask_h = ccn->dt.cmp_mask[CCN_CONFIG_MASK(event->attr.config)].h;
+
+       hw->event_base = CCN_XP_DT_CONFIG__DT_CFG__WATCHPOINT(wp);
+
+       /* Direction (RX/TX), device (port) & virtual channel */
+       val = readl(source->base + CCN_XP_DT_INTERFACE_SEL);
+       val &= ~(CCN_XP_DT_INTERFACE_SEL__DT_IO_SEL__MASK <<
+                       CCN_XP_DT_INTERFACE_SEL__DT_IO_SEL__SHIFT(wp));
+       val |= CCN_CONFIG_DIR(event->attr.config) <<
+                       CCN_XP_DT_INTERFACE_SEL__DT_IO_SEL__SHIFT(wp);
+       val &= ~(CCN_XP_DT_INTERFACE_SEL__DT_DEV_SEL__MASK <<
+                       CCN_XP_DT_INTERFACE_SEL__DT_DEV_SEL__SHIFT(wp));
+       val |= CCN_CONFIG_PORT(event->attr.config) <<
+                       CCN_XP_DT_INTERFACE_SEL__DT_DEV_SEL__SHIFT(wp);
+       val &= ~(CCN_XP_DT_INTERFACE_SEL__DT_VC_SEL__MASK <<
+                       CCN_XP_DT_INTERFACE_SEL__DT_VC_SEL__SHIFT(wp));
+       val |= CCN_CONFIG_VC(event->attr.config) <<
+                       CCN_XP_DT_INTERFACE_SEL__DT_VC_SEL__SHIFT(wp);
+       writel(val, source->base + CCN_XP_DT_INTERFACE_SEL);
+
+       /* Comparison values */
+       writel(cmp_l & 0xffffffff, source->base + CCN_XP_DT_CMP_VAL_L(wp));
+       writel((cmp_l >> 32) & 0xefffffff,
+                       source->base + CCN_XP_DT_CMP_VAL_L(wp) + 4);
+       writel(cmp_h & 0xffffffff, source->base + CCN_XP_DT_CMP_VAL_H(wp));
+       writel((cmp_h >> 32) & 0x0fffffff,
+                       source->base + CCN_XP_DT_CMP_VAL_H(wp) + 4);
+
+       /* Mask */
+       writel(mask_l & 0xffffffff, source->base + CCN_XP_DT_CMP_MASK_L(wp));
+       writel((mask_l >> 32) & 0xefffffff,
+                       source->base + CCN_XP_DT_CMP_MASK_L(wp) + 4);
+       writel(mask_h & 0xffffffff, source->base + CCN_XP_DT_CMP_MASK_H(wp));
+       writel((mask_h >> 32) & 0x0fffffff,
+                       source->base + CCN_XP_DT_CMP_MASK_H(wp) + 4);
+}
+
+static void arm_ccn_pmu_xp_event_config(struct perf_event *event)
+{
+       struct arm_ccn *ccn = pmu_to_arm_ccn(event->pmu);
+       struct hw_perf_event *hw = &event->hw;
+       struct arm_ccn_component *source =
+                       ccn->dt.pmu_counters[hw->idx].source;
+       u32 val, id;
+
+       hw->event_base = CCN_XP_DT_CONFIG__DT_CFG__XP_PMU_EVENT(hw->config_base);
+
+       id = (CCN_CONFIG_VC(event->attr.config) << 4) |
+                       (CCN_CONFIG_PORT(event->attr.config) << 3) |
+                       (CCN_CONFIG_EVENT(event->attr.config) << 0);
+
+       val = readl(source->base + CCN_XP_PMU_EVENT_SEL);
+       val &= ~(CCN_XP_PMU_EVENT_SEL__ID__MASK <<
+                       CCN_XP_PMU_EVENT_SEL__ID__SHIFT(hw->config_base));
+       val |= id << CCN_XP_PMU_EVENT_SEL__ID__SHIFT(hw->config_base);
+       writel(val, source->base + CCN_XP_PMU_EVENT_SEL);
+}
+
+static void arm_ccn_pmu_node_event_config(struct perf_event *event)
+{
+       struct arm_ccn *ccn = pmu_to_arm_ccn(event->pmu);
+       struct hw_perf_event *hw = &event->hw;
+       struct arm_ccn_component *source =
+                       ccn->dt.pmu_counters[hw->idx].source;
+       u32 type = CCN_CONFIG_TYPE(event->attr.config);
+       u32 val, port;
+
+       port = arm_ccn_node_to_xp_port(CCN_CONFIG_NODE(event->attr.config));
+       hw->event_base = CCN_XP_DT_CONFIG__DT_CFG__DEVICE_PMU_EVENT(port,
+                       hw->config_base);
+
+       /* These *_event_sel regs should be identical, but let's make sure... */
+       BUILD_BUG_ON(CCN_HNF_PMU_EVENT_SEL != CCN_SBAS_PMU_EVENT_SEL);
+       BUILD_BUG_ON(CCN_SBAS_PMU_EVENT_SEL != CCN_RNI_PMU_EVENT_SEL);
+       BUILD_BUG_ON(CCN_HNF_PMU_EVENT_SEL__ID__SHIFT(1) !=
+                       CCN_SBAS_PMU_EVENT_SEL__ID__SHIFT(1));
+       BUILD_BUG_ON(CCN_SBAS_PMU_EVENT_SEL__ID__SHIFT(1) !=
+                       CCN_RNI_PMU_EVENT_SEL__ID__SHIFT(1));
+       BUILD_BUG_ON(CCN_HNF_PMU_EVENT_SEL__ID__MASK !=
+                       CCN_SBAS_PMU_EVENT_SEL__ID__MASK);
+       BUILD_BUG_ON(CCN_SBAS_PMU_EVENT_SEL__ID__MASK !=
+                       CCN_RNI_PMU_EVENT_SEL__ID__MASK);
+       if (WARN_ON(type != CCN_TYPE_HNF && type != CCN_TYPE_SBAS &&
+                       !arm_ccn_pmu_type_eq(type, CCN_TYPE_RNI_3P)))
+               return;
+
+       /* Set the event id for the pre-allocated counter */
+       val = readl(source->base + CCN_HNF_PMU_EVENT_SEL);
+       val &= ~(CCN_HNF_PMU_EVENT_SEL__ID__MASK <<
+               CCN_HNF_PMU_EVENT_SEL__ID__SHIFT(hw->config_base));
+       val |= CCN_CONFIG_EVENT(event->attr.config) <<
+               CCN_HNF_PMU_EVENT_SEL__ID__SHIFT(hw->config_base);
+       writel(val, source->base + CCN_HNF_PMU_EVENT_SEL);
+}
+
+static void arm_ccn_pmu_event_config(struct perf_event *event)
+{
+       struct arm_ccn *ccn = pmu_to_arm_ccn(event->pmu);
+       struct hw_perf_event *hw = &event->hw;
+       u32 xp, offset, val;
+
+       /* Cycle counter requires no setup */
+       if (hw->idx == CCN_IDX_PMU_CYCLE_COUNTER)
+               return;
+
+       if (CCN_CONFIG_TYPE(event->attr.config) == CCN_TYPE_XP)
+               xp = CCN_CONFIG_XP(event->attr.config);
+       else
+               xp = arm_ccn_node_to_xp(CCN_CONFIG_NODE(event->attr.config));
+
+       spin_lock(&ccn->dt.config_lock);
+
+       /* Set the DT bus "distance" register */
+       offset = (hw->idx / 4) * 4;
+       val = readl(ccn->dt.base + CCN_DT_ACTIVE_DSM + offset);
+       val &= ~(CCN_DT_ACTIVE_DSM__DSM_ID__MASK <<
+                       CCN_DT_ACTIVE_DSM__DSM_ID__SHIFT(hw->idx % 4));
+       val |= xp << CCN_DT_ACTIVE_DSM__DSM_ID__SHIFT(hw->idx % 4);
+       writel(val, ccn->dt.base + CCN_DT_ACTIVE_DSM + offset);
+
+       if (CCN_CONFIG_TYPE(event->attr.config) == CCN_TYPE_XP) {
+               if (CCN_CONFIG_EVENT(event->attr.config) ==
+                               CCN_EVENT_WATCHPOINT)
+                       arm_ccn_pmu_xp_watchpoint_config(event);
+               else
+                       arm_ccn_pmu_xp_event_config(event);
+       } else {
+               arm_ccn_pmu_node_event_config(event);
+       }
+
+       spin_unlock(&ccn->dt.config_lock);
+}
+
+static int arm_ccn_pmu_event_add(struct perf_event *event, int flags)
+{
+       struct hw_perf_event *hw = &event->hw;
+
+       arm_ccn_pmu_event_config(event);
+
+       hw->state = PERF_HES_STOPPED;
+
+       if (flags & PERF_EF_START)
+               arm_ccn_pmu_event_start(event, PERF_EF_UPDATE);
+
+       return 0;
+}
+
+static void arm_ccn_pmu_event_del(struct perf_event *event, int flags)
+{
+       arm_ccn_pmu_event_stop(event, PERF_EF_UPDATE);
+
+       arm_ccn_pmu_event_free(event);
+}
+
+static void arm_ccn_pmu_event_read(struct perf_event *event)
+{
+       arm_ccn_pmu_event_update(event);
+}
+
+static irqreturn_t arm_ccn_pmu_overflow_handler(struct arm_ccn_dt *dt)
+{
+       u32 pmovsr = readl(dt->base + CCN_DT_PMOVSR);
+       int idx;
+
+       if (!pmovsr)
+               return IRQ_NONE;
+
+       writel(pmovsr, dt->base + CCN_DT_PMOVSR_CLR);
+
+       BUILD_BUG_ON(CCN_IDX_PMU_CYCLE_COUNTER != CCN_NUM_PMU_EVENT_COUNTERS);
+
+       for (idx = 0; idx < CCN_NUM_PMU_EVENT_COUNTERS + 1; idx++) {
+               struct perf_event *event = dt->pmu_counters[idx].event;
+               int overflowed = pmovsr & BIT(idx);
+
+               WARN_ON_ONCE(overflowed && !event);
+
+               if (!event || !overflowed)
+                       continue;
+
+               arm_ccn_pmu_event_update(event);
+       }
+
+       return IRQ_HANDLED;
+}
+
+static enum hrtimer_restart arm_ccn_pmu_timer_handler(struct hrtimer *hrtimer)
+{
+       struct arm_ccn_dt *dt = container_of(hrtimer, struct arm_ccn_dt,
+                       hrtimer);
+       unsigned long flags;
+
+       local_irq_save(flags);
+       arm_ccn_pmu_overflow_handler(dt);
+       local_irq_restore(flags);
+
+       hrtimer_forward_now(hrtimer, arm_ccn_pmu_timer_period());
+       return HRTIMER_RESTART;
+}
+
+
+static DEFINE_IDA(arm_ccn_pmu_ida);
+
+static int arm_ccn_pmu_init(struct arm_ccn *ccn)
+{
+       int i;
+       char *name;
+
+       /* Initialize DT subsystem */
+       ccn->dt.base = ccn->base + CCN_REGION_SIZE;
+       spin_lock_init(&ccn->dt.config_lock);
+       writel(CCN_DT_CTL__DT_EN, ccn->dt.base + CCN_DT_CTL);
+       writel(CCN_DT_PMCR__OVFL_INTR_EN | CCN_DT_PMCR__PMU_EN,
+                       ccn->dt.base + CCN_DT_PMCR);
+       writel(0x1, ccn->dt.base + CCN_DT_PMSR_CLR);
+       for (i = 0; i < ccn->num_xps; i++) {
+               writel(0, ccn->xp[i].base + CCN_XP_DT_CONFIG);
+               writel((CCN_XP_DT_CONTROL__WP_ARM_SEL__ALWAYS <<
+                               CCN_XP_DT_CONTROL__WP_ARM_SEL__SHIFT(0)) |
+                               (CCN_XP_DT_CONTROL__WP_ARM_SEL__ALWAYS <<
+                               CCN_XP_DT_CONTROL__WP_ARM_SEL__SHIFT(1)) |
+                               CCN_XP_DT_CONTROL__DT_ENABLE,
+                               ccn->xp[i].base + CCN_XP_DT_CONTROL);
+       }
+       ccn->dt.cmp_mask[CCN_IDX_MASK_ANY].l = ~0;
+       ccn->dt.cmp_mask[CCN_IDX_MASK_ANY].h = ~0;
+       ccn->dt.cmp_mask[CCN_IDX_MASK_EXACT].l = 0;
+       ccn->dt.cmp_mask[CCN_IDX_MASK_EXACT].h = 0;
+       ccn->dt.cmp_mask[CCN_IDX_MASK_ORDER].l = ~0;
+       ccn->dt.cmp_mask[CCN_IDX_MASK_ORDER].h = ~(0x1 << 15);
+       ccn->dt.cmp_mask[CCN_IDX_MASK_OPCODE].l = ~0;
+       ccn->dt.cmp_mask[CCN_IDX_MASK_OPCODE].h = ~(0x1f << 9);
+
+       /* Get a convenient /sys/event_source/devices/ name */
+       ccn->dt.id = ida_simple_get(&arm_ccn_pmu_ida, 0, 0, GFP_KERNEL);
+       if (ccn->dt.id == 0) {
+               name = "ccn";
+       } else {
+               int len = snprintf(NULL, 0, "ccn_%d", ccn->dt.id);
+
+               name = devm_kzalloc(ccn->dev, len + 1, GFP_KERNEL);
+               snprintf(name, len + 1, "ccn_%d", ccn->dt.id);
+       }
+
+       /* Perf driver registration */
+       ccn->dt.pmu = (struct pmu) {
+               .attr_groups = arm_ccn_pmu_attr_groups,
+               .task_ctx_nr = perf_invalid_context,
+               .event_init = arm_ccn_pmu_event_init,
+               .add = arm_ccn_pmu_event_add,
+               .del = arm_ccn_pmu_event_del,
+               .start = arm_ccn_pmu_event_start,
+               .stop = arm_ccn_pmu_event_stop,
+               .read = arm_ccn_pmu_event_read,
+       };
+
+       /* No overflow interrupt? Have to use a timer instead. */
+       if (!ccn->irq_used) {
+               dev_info(ccn->dev, "No access to interrupts, using timer.\n");
+               hrtimer_init(&ccn->dt.hrtimer, CLOCK_MONOTONIC,
+                               HRTIMER_MODE_REL);
+               ccn->dt.hrtimer.function = arm_ccn_pmu_timer_handler;
+       }
+
+       return perf_pmu_register(&ccn->dt.pmu, name, -1);
+}
+
+static void arm_ccn_pmu_cleanup(struct arm_ccn *ccn)
+{
+       int i;
+
+       for (i = 0; i < ccn->num_xps; i++)
+               writel(0, ccn->xp[i].base + CCN_XP_DT_CONTROL);
+       writel(0, ccn->dt.base + CCN_DT_PMCR);
+       perf_pmu_unregister(&ccn->dt.pmu);
+       ida_simple_remove(&arm_ccn_pmu_ida, ccn->dt.id);
+}
+
+
+static int arm_ccn_for_each_valid_region(struct arm_ccn *ccn,
+               int (*callback)(struct arm_ccn *ccn, int region,
+               void __iomem *base, u32 type, u32 id))
+{
+       int region;
+
+       for (region = 0; region < CCN_NUM_REGIONS; region++) {
+               u32 val, type, id;
+               void __iomem *base;
+               int err;
+
+               val = readl(ccn->base + CCN_MN_OLY_COMP_LIST_63_0 +
+                               4 * (region / 32));
+               if (!(val & (1 << (region % 32))))
+                       continue;
+
+               base = ccn->base + region * CCN_REGION_SIZE;
+               val = readl(base + CCN_ALL_OLY_ID);
+               type = (val >> CCN_ALL_OLY_ID__OLY_ID__SHIFT) &
+                               CCN_ALL_OLY_ID__OLY_ID__MASK;
+               id = (val >> CCN_ALL_OLY_ID__NODE_ID__SHIFT) &
+                               CCN_ALL_OLY_ID__NODE_ID__MASK;
+
+               err = callback(ccn, region, base, type, id);
+               if (err)
+                       return err;
+       }
+
+       return 0;
+}
+
+static int arm_ccn_get_nodes_num(struct arm_ccn *ccn, int region,
+               void __iomem *base, u32 type, u32 id)
+{
+
+       if (type == CCN_TYPE_XP && id >= ccn->num_xps)
+               ccn->num_xps = id + 1;
+       else if (id >= ccn->num_nodes)
+               ccn->num_nodes = id + 1;
+
+       return 0;
+}
+
+static int arm_ccn_init_nodes(struct arm_ccn *ccn, int region,
+               void __iomem *base, u32 type, u32 id)
+{
+       struct arm_ccn_component *component;
+
+       dev_dbg(ccn->dev, "Region %d: id=%u, type=0x%02x\n", region, id, type);
+
+       switch (type) {
+       case CCN_TYPE_MN:
+       case CCN_TYPE_DT:
+               return 0;
+       case CCN_TYPE_XP:
+               component = &ccn->xp[id];
+               break;
+       case CCN_TYPE_SBSX:
+               ccn->sbsx_present = 1;
+               component = &ccn->node[id];
+               break;
+       case CCN_TYPE_SBAS:
+               ccn->sbas_present = 1;
+               /* Fall-through */
+       default:
+               component = &ccn->node[id];
+               break;
+       }
+
+       component->base = base;
+       component->type = type;
+
+       return 0;
+}
+
+
+static irqreturn_t arm_ccn_error_handler(struct arm_ccn *ccn,
+               const u32 *err_sig_val)
+{
+       /* This should be really handled by firmware... */
+       dev_err(ccn->dev, "Error reported in %08x%08x%08x%08x%08x%08x.\n",
+                       err_sig_val[5], err_sig_val[4], err_sig_val[3],
+                       err_sig_val[2], err_sig_val[1], err_sig_val[0]);
+       dev_err(ccn->dev, "Disabling interrupt generation for all errors.\n");
+       writel(CCN_MN_ERRINT_STATUS__ALL_ERRORS__DISABLE,
+                       ccn->base + CCN_MN_ERRINT_STATUS);
+
+       return IRQ_HANDLED;
+}
+
+
+static irqreturn_t arm_ccn_irq_handler(int irq, void *dev_id)
+{
+       irqreturn_t res = IRQ_NONE;
+       struct arm_ccn *ccn = dev_id;
+       u32 err_sig_val[6];
+       u32 err_or;
+       int i;
+
+       /* PMU overflow is a special case */
+       err_or = err_sig_val[0] = readl(ccn->base + CCN_MN_ERR_SIG_VAL_63_0);
+       if (err_or & CCN_MN_ERR_SIG_VAL_63_0__DT) {
+               err_or &= ~CCN_MN_ERR_SIG_VAL_63_0__DT;
+               res = arm_ccn_pmu_overflow_handler(&ccn->dt);
+       }
+
+       /* Have to read all err_sig_vals to clear them */
+       for (i = 1; i < ARRAY_SIZE(err_sig_val); i++) {
+               err_sig_val[i] = readl(ccn->base +
+                               CCN_MN_ERR_SIG_VAL_63_0 + i * 4);
+               err_or |= err_sig_val[i];
+       }
+       if (err_or)
+               res |= arm_ccn_error_handler(ccn, err_sig_val);
+
+       if (res != IRQ_NONE)
+               writel(CCN_MN_ERRINT_STATUS__INTREQ__DESSERT,
+                               ccn->base + CCN_MN_ERRINT_STATUS);
+
+       return res;
+}
+
+
+static int arm_ccn_probe(struct platform_device *pdev)
+{
+       struct arm_ccn *ccn;
+       struct resource *res;
+       int err;
+
+       ccn = devm_kzalloc(&pdev->dev, sizeof(*ccn), GFP_KERNEL);
+       if (!ccn)
+               return -ENOMEM;
+       ccn->dev = &pdev->dev;
+       platform_set_drvdata(pdev, ccn);
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!res)
+               return -EINVAL;
+
+       if (!devm_request_mem_region(ccn->dev, res->start,
+                       resource_size(res), pdev->name))
+               return -EBUSY;
+
+       ccn->base = devm_ioremap(ccn->dev, res->start,
+                               resource_size(res));
+       if (!ccn->base)
+               return -EFAULT;
+
+       res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
+       if (!res)
+               return -EINVAL;
+
+       /* Check if we can use the interrupt */
+       writel(CCN_MN_ERRINT_STATUS__PMU_EVENTS__DISABLE,
+                       ccn->base + CCN_MN_ERRINT_STATUS);
+       if (readl(ccn->base + CCN_MN_ERRINT_STATUS) &
+                       CCN_MN_ERRINT_STATUS__PMU_EVENTS__DISABLED) {
+               /* Can set 'disable' bits, so can acknowledge interrupts */
+               writel(CCN_MN_ERRINT_STATUS__PMU_EVENTS__ENABLE,
+                               ccn->base + CCN_MN_ERRINT_STATUS);
+               err = devm_request_irq(ccn->dev, res->start,
+                               arm_ccn_irq_handler, 0, dev_name(ccn->dev),
+                               ccn);
+               if (err)
+                       return err;
+
+               ccn->irq_used = 1;
+       }
+
+
+       /* Build topology */
+
+       err = arm_ccn_for_each_valid_region(ccn, arm_ccn_get_nodes_num);
+       if (err)
+               return err;
+
+       ccn->node = devm_kzalloc(ccn->dev, sizeof(*ccn->node) * ccn->num_nodes,
+               GFP_KERNEL);
+       ccn->xp = devm_kzalloc(ccn->dev, sizeof(*ccn->node) * ccn->num_xps,
+               GFP_KERNEL);
+       if (!ccn->node || !ccn->xp)
+               return -ENOMEM;
+
+       err = arm_ccn_for_each_valid_region(ccn, arm_ccn_init_nodes);
+       if (err)
+               return err;
+
+       return arm_ccn_pmu_init(ccn);
+}
+
+static int arm_ccn_remove(struct platform_device *pdev)
+{
+       struct arm_ccn *ccn = platform_get_drvdata(pdev);
+
+       arm_ccn_pmu_cleanup(ccn);
+
+       return 0;
+}
+
+static const struct of_device_id arm_ccn_match[] = {
+       { .compatible = "arm,ccn-504", },
+       {},
+};
+
+static struct platform_driver arm_ccn_driver = {
+       .driver = {
+               .name = "arm-ccn",
+               .of_match_table = arm_ccn_match,
+       },
+       .probe = arm_ccn_probe,
+       .remove = arm_ccn_remove,
+};
+
+static int __init arm_ccn_init(void)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(arm_ccn_pmu_events); i++)
+               arm_ccn_pmu_events_attrs[i] = &arm_ccn_pmu_events[i].attr.attr;
+
+       return platform_driver_register(&arm_ccn_driver);
+}
+
+static void __exit arm_ccn_exit(void)
+{
+       platform_driver_unregister(&arm_ccn_driver);
+}
+
+module_init(arm_ccn_init);
+module_exit(arm_ccn_exit);
+
+MODULE_AUTHOR("Pawel Moll <pawel.moll@arm.com>");
+MODULE_LICENSE("GPL");
index f8ee13c7bf7b83efca1eebfd5241017e2ae8df57..75c9681f8021dba12b5a6305b1e5744449d2f52f 100644 (file)
@@ -162,7 +162,9 @@ static int __init weim_parse_dt(struct platform_device *pdev,
                }
        }
 
-       ret = of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev);
+       ret = of_platform_populate(pdev->dev.of_node,
+                                  of_default_bus_match_table,
+                                  NULL, &pdev->dev);
        if (ret)
                dev_err(&pdev->dev, "%s fail to create devices.\n",
                        pdev->dev.of_node->full_name);
index b29703324e9431d24c5c0b588efbae14d8d2d5ba..09f17eb734863fd0dfc6d69fc6f7716906391424 100644 (file)
@@ -710,19 +710,6 @@ static int agp_open(struct inode *inode, struct file *file)
        return 0;
 }
 
-
-static ssize_t agp_read(struct file *file, char __user *buf,
-                       size_t count, loff_t * ppos)
-{
-       return -EINVAL;
-}
-
-static ssize_t agp_write(struct file *file, const char __user *buf,
-                        size_t count, loff_t * ppos)
-{
-       return -EINVAL;
-}
-
 static int agpioc_info_wrap(struct agp_file_private *priv, void __user *arg)
 {
        struct agp_info userinfo;
@@ -1047,8 +1034,6 @@ static const struct file_operations agp_fops =
 {
        .owner          = THIS_MODULE,
        .llseek         = no_llseek,
-       .read           = agp_read,
-       .write          = agp_write,
        .unlocked_ioctl = agp_ioctl,
 #ifdef CONFIG_COMPAT
        .compat_ioctl   = compat_agp_ioctl,
index 8ebf757d29e2d0885791442bfbac5efd586db22b..3821a88077eaf5489f4d6e3be3d293fd6f0ca5f8 100644 (file)
 #include <linux/io.h>
 #include <linux/of.h>
 #include <linux/delay.h>
+#include <linux/mvebu-pmsu.h>
+#include <asm/smp_plat.h>
 
-#define SYS_CTRL_CLK_DIVIDER_CTRL_OFFSET    0x0
-#define SYS_CTRL_CLK_DIVIDER_VALUE_OFFSET   0xC
-#define SYS_CTRL_CLK_DIVIDER_MASK          0x3F
+#define SYS_CTRL_CLK_DIVIDER_CTRL_OFFSET               0x0
+#define   SYS_CTRL_CLK_DIVIDER_CTRL_RESET_ALL          0xff
+#define   SYS_CTRL_CLK_DIVIDER_CTRL_RESET_SHIFT        8
+#define SYS_CTRL_CLK_DIVIDER_CTRL2_OFFSET              0x8
+#define   SYS_CTRL_CLK_DIVIDER_CTRL2_NBCLK_RATIO_SHIFT 16
+#define SYS_CTRL_CLK_DIVIDER_VALUE_OFFSET              0xC
+#define SYS_CTRL_CLK_DIVIDER_MASK                      0x3F
+
+#define PMU_DFS_RATIO_SHIFT 16
+#define PMU_DFS_RATIO_MASK  0x3F
 
 #define MAX_CPU            4
 struct cpu_clk {
@@ -28,6 +37,7 @@ struct cpu_clk {
        const char *clk_name;
        const char *parent_name;
        void __iomem *reg_base;
+       void __iomem *pmu_dfs;
 };
 
 static struct clk **clks;
@@ -62,8 +72,9 @@ static long clk_cpu_round_rate(struct clk_hw *hwclk, unsigned long rate,
        return *parent_rate / div;
 }
 
-static int clk_cpu_set_rate(struct clk_hw *hwclk, unsigned long rate,
-                           unsigned long parent_rate)
+static int clk_cpu_off_set_rate(struct clk_hw *hwclk, unsigned long rate,
+                               unsigned long parent_rate)
+
 {
        struct cpu_clk *cpuclk = to_cpu_clk(hwclk);
        u32 reg, div;
@@ -95,6 +106,58 @@ static int clk_cpu_set_rate(struct clk_hw *hwclk, unsigned long rate,
        return 0;
 }
 
+static int clk_cpu_on_set_rate(struct clk_hw *hwclk, unsigned long rate,
+                              unsigned long parent_rate)
+{
+       u32 reg;
+       unsigned long fabric_div, target_div, cur_rate;
+       struct cpu_clk *cpuclk = to_cpu_clk(hwclk);
+
+       /*
+        * PMU DFS registers are not mapped, Device Tree does not
+        * describes them. We cannot change the frequency dynamically.
+        */
+       if (!cpuclk->pmu_dfs)
+               return -ENODEV;
+
+       cur_rate = __clk_get_rate(hwclk->clk);
+
+       reg = readl(cpuclk->reg_base + SYS_CTRL_CLK_DIVIDER_CTRL2_OFFSET);
+       fabric_div = (reg >> SYS_CTRL_CLK_DIVIDER_CTRL2_NBCLK_RATIO_SHIFT) &
+               SYS_CTRL_CLK_DIVIDER_MASK;
+
+       /* Frequency is going up */
+       if (rate == 2 * cur_rate)
+               target_div = fabric_div / 2;
+       /* Frequency is going down */
+       else
+               target_div = fabric_div;
+
+       if (target_div == 0)
+               target_div = 1;
+
+       reg = readl(cpuclk->pmu_dfs);
+       reg &= ~(PMU_DFS_RATIO_MASK << PMU_DFS_RATIO_SHIFT);
+       reg |= (target_div << PMU_DFS_RATIO_SHIFT);
+       writel(reg, cpuclk->pmu_dfs);
+
+       reg = readl(cpuclk->reg_base + SYS_CTRL_CLK_DIVIDER_CTRL_OFFSET);
+       reg |= (SYS_CTRL_CLK_DIVIDER_CTRL_RESET_ALL <<
+               SYS_CTRL_CLK_DIVIDER_CTRL_RESET_SHIFT);
+       writel(reg, cpuclk->reg_base + SYS_CTRL_CLK_DIVIDER_CTRL_OFFSET);
+
+       return mvebu_pmsu_dfs_request(cpuclk->cpu);
+}
+
+static int clk_cpu_set_rate(struct clk_hw *hwclk, unsigned long rate,
+                           unsigned long parent_rate)
+{
+       if (__clk_is_enabled(hwclk->clk))
+               return clk_cpu_on_set_rate(hwclk, rate, parent_rate);
+       else
+               return clk_cpu_off_set_rate(hwclk, rate, parent_rate);
+}
+
 static const struct clk_ops cpu_ops = {
        .recalc_rate = clk_cpu_recalc_rate,
        .round_rate = clk_cpu_round_rate,
@@ -105,6 +168,7 @@ static void __init of_cpu_clk_setup(struct device_node *node)
 {
        struct cpu_clk *cpuclk;
        void __iomem *clock_complex_base = of_iomap(node, 0);
+       void __iomem *pmu_dfs_base = of_iomap(node, 1);
        int ncpus = 0;
        struct device_node *dn;
 
@@ -114,6 +178,10 @@ static void __init of_cpu_clk_setup(struct device_node *node)
                return;
        }
 
+       if (pmu_dfs_base == NULL)
+               pr_warn("%s: pmu-dfs base register not set, dynamic frequency scaling not available\n",
+                       __func__);
+
        for_each_node_by_type(dn, "cpu")
                ncpus++;
 
@@ -146,6 +214,8 @@ static void __init of_cpu_clk_setup(struct device_node *node)
                cpuclk[cpu].clk_name = clk_name;
                cpuclk[cpu].cpu = cpu;
                cpuclk[cpu].reg_base = clock_complex_base;
+               if (pmu_dfs_base)
+                       cpuclk[cpu].pmu_dfs = pmu_dfs_base + 4 * cpu;
                cpuclk[cpu].hw.init = &init;
 
                init.name = cpuclk[cpu].clk_name;
index 2949a556af8f3e183ec101d382ddd7a0ac90c03f..6fb4bc602e8ac467d4489e51f30b642e5771dda7 100644 (file)
@@ -17,3 +17,4 @@ obj-$(CONFIG_S3C2410_COMMON_DCLK)+= clk-s3c2410-dclk.o
 obj-$(CONFIG_S3C2412_COMMON_CLK)+= clk-s3c2412.o
 obj-$(CONFIG_S3C2443_COMMON_CLK)+= clk-s3c2443.o
 obj-$(CONFIG_ARCH_S3C64XX)     += clk-s3c64xx.o
+obj-$(CONFIG_ARCH_S5PV210)     += clk-s5pv210.o clk-s5pv210-audss.o
diff --git a/drivers/clk/samsung/clk-s5pv210-audss.c b/drivers/clk/samsung/clk-s5pv210-audss.c
new file mode 100644 (file)
index 0000000..a8053b4
--- /dev/null
@@ -0,0 +1,241 @@
+/*
+ * Copyright (c) 2014 Tomasz Figa <t.figa@samsung.com>
+ *
+ * Based on Exynos Audio Subsystem Clock Controller driver:
+ *
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd.
+ * Author: Padmavathi Venna <padma.v@samsung.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Driver for Audio Subsystem Clock Controller of S5PV210-compatible SoCs.
+*/
+
+#include <linux/clkdev.h>
+#include <linux/io.h>
+#include <linux/clk-provider.h>
+#include <linux/of_address.h>
+#include <linux/syscore_ops.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+
+#include <dt-bindings/clock/s5pv210-audss.h>
+
+static DEFINE_SPINLOCK(lock);
+static struct clk **clk_table;
+static void __iomem *reg_base;
+static struct clk_onecell_data clk_data;
+
+#define ASS_CLK_SRC 0x0
+#define ASS_CLK_DIV 0x4
+#define ASS_CLK_GATE 0x8
+
+#ifdef CONFIG_PM_SLEEP
+static unsigned long reg_save[][2] = {
+       {ASS_CLK_SRC,  0},
+       {ASS_CLK_DIV,  0},
+       {ASS_CLK_GATE, 0},
+};
+
+static int s5pv210_audss_clk_suspend(void)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(reg_save); i++)
+               reg_save[i][1] = readl(reg_base + reg_save[i][0]);
+
+       return 0;
+}
+
+static void s5pv210_audss_clk_resume(void)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(reg_save); i++)
+               writel(reg_save[i][1], reg_base + reg_save[i][0]);
+}
+
+static struct syscore_ops s5pv210_audss_clk_syscore_ops = {
+       .suspend        = s5pv210_audss_clk_suspend,
+       .resume         = s5pv210_audss_clk_resume,
+};
+#endif /* CONFIG_PM_SLEEP */
+
+/* register s5pv210_audss clocks */
+static int s5pv210_audss_clk_probe(struct platform_device *pdev)
+{
+       int i, ret = 0;
+       struct resource *res;
+       const char *mout_audss_p[2];
+       const char *mout_i2s_p[3];
+       const char *hclk_p;
+       struct clk *hclk, *pll_ref, *pll_in, *cdclk, *sclk_audio;
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       reg_base = devm_ioremap_resource(&pdev->dev, res);
+       if (IS_ERR(reg_base)) {
+               dev_err(&pdev->dev, "failed to map audss registers\n");
+               return PTR_ERR(reg_base);
+       }
+
+       clk_table = devm_kzalloc(&pdev->dev,
+                               sizeof(struct clk *) * AUDSS_MAX_CLKS,
+                               GFP_KERNEL);
+       if (!clk_table)
+               return -ENOMEM;
+
+       clk_data.clks = clk_table;
+       clk_data.clk_num = AUDSS_MAX_CLKS;
+
+       hclk = devm_clk_get(&pdev->dev, "hclk");
+       if (IS_ERR(hclk)) {
+               dev_err(&pdev->dev, "failed to get hclk clock\n");
+               return PTR_ERR(hclk);
+       }
+
+       pll_in = devm_clk_get(&pdev->dev, "fout_epll");
+       if (IS_ERR(pll_in)) {
+               dev_err(&pdev->dev, "failed to get fout_epll clock\n");
+               return PTR_ERR(pll_in);
+       }
+
+       sclk_audio = devm_clk_get(&pdev->dev, "sclk_audio0");
+       if (IS_ERR(sclk_audio)) {
+               dev_err(&pdev->dev, "failed to get sclk_audio0 clock\n");
+               return PTR_ERR(sclk_audio);
+       }
+
+       /* iiscdclk0 is an optional external I2S codec clock */
+       cdclk = devm_clk_get(&pdev->dev, "iiscdclk0");
+       pll_ref = devm_clk_get(&pdev->dev, "xxti");
+
+       if (!IS_ERR(pll_ref))
+               mout_audss_p[0] = __clk_get_name(pll_ref);
+       else
+               mout_audss_p[0] = "xxti";
+       mout_audss_p[1] = __clk_get_name(pll_in);
+       clk_table[CLK_MOUT_AUDSS] = clk_register_mux(NULL, "mout_audss",
+                               mout_audss_p, ARRAY_SIZE(mout_audss_p),
+                               CLK_SET_RATE_NO_REPARENT,
+                               reg_base + ASS_CLK_SRC, 0, 1, 0, &lock);
+
+       mout_i2s_p[0] = "mout_audss";
+       if (!IS_ERR(cdclk))
+               mout_i2s_p[1] = __clk_get_name(cdclk);
+       else
+               mout_i2s_p[1] = "iiscdclk0";
+       mout_i2s_p[2] = __clk_get_name(sclk_audio);
+       clk_table[CLK_MOUT_I2S_A] = clk_register_mux(NULL, "mout_i2s_audss",
+                               mout_i2s_p, ARRAY_SIZE(mout_i2s_p),
+                               CLK_SET_RATE_NO_REPARENT,
+                               reg_base + ASS_CLK_SRC, 2, 2, 0, &lock);
+
+       clk_table[CLK_DOUT_AUD_BUS] = clk_register_divider(NULL,
+                               "dout_aud_bus", "mout_audss", 0,
+                               reg_base + ASS_CLK_DIV, 0, 4, 0, &lock);
+       clk_table[CLK_DOUT_I2S_A] = clk_register_divider(NULL, "dout_i2s_audss",
+                               "mout_i2s_audss", 0, reg_base + ASS_CLK_DIV,
+                               4, 4, 0, &lock);
+
+       clk_table[CLK_I2S] = clk_register_gate(NULL, "i2s_audss",
+                               "dout_i2s_audss", CLK_SET_RATE_PARENT,
+                               reg_base + ASS_CLK_GATE, 6, 0, &lock);
+
+       hclk_p = __clk_get_name(hclk);
+
+       clk_table[CLK_HCLK_I2S] = clk_register_gate(NULL, "hclk_i2s_audss",
+                               hclk_p, CLK_IGNORE_UNUSED,
+                               reg_base + ASS_CLK_GATE, 5, 0, &lock);
+       clk_table[CLK_HCLK_UART] = clk_register_gate(NULL, "hclk_uart_audss",
+                               hclk_p, CLK_IGNORE_UNUSED,
+                               reg_base + ASS_CLK_GATE, 4, 0, &lock);
+       clk_table[CLK_HCLK_HWA] = clk_register_gate(NULL, "hclk_hwa_audss",
+                               hclk_p, CLK_IGNORE_UNUSED,
+                               reg_base + ASS_CLK_GATE, 3, 0, &lock);
+       clk_table[CLK_HCLK_DMA] = clk_register_gate(NULL, "hclk_dma_audss",
+                               hclk_p, CLK_IGNORE_UNUSED,
+                               reg_base + ASS_CLK_GATE, 2, 0, &lock);
+       clk_table[CLK_HCLK_BUF] = clk_register_gate(NULL, "hclk_buf_audss",
+                               hclk_p, CLK_IGNORE_UNUSED,
+                               reg_base + ASS_CLK_GATE, 1, 0, &lock);
+       clk_table[CLK_HCLK_RP] = clk_register_gate(NULL, "hclk_rp_audss",
+                               hclk_p, CLK_IGNORE_UNUSED,
+                               reg_base + ASS_CLK_GATE, 0, 0, &lock);
+
+       for (i = 0; i < clk_data.clk_num; i++) {
+               if (IS_ERR(clk_table[i])) {
+                       dev_err(&pdev->dev, "failed to register clock %d\n", i);
+                       ret = PTR_ERR(clk_table[i]);
+                       goto unregister;
+               }
+       }
+
+       ret = of_clk_add_provider(pdev->dev.of_node, of_clk_src_onecell_get,
+                                       &clk_data);
+       if (ret) {
+               dev_err(&pdev->dev, "failed to add clock provider\n");
+               goto unregister;
+       }
+
+#ifdef CONFIG_PM_SLEEP
+       register_syscore_ops(&s5pv210_audss_clk_syscore_ops);
+#endif
+
+       return 0;
+
+unregister:
+       for (i = 0; i < clk_data.clk_num; i++) {
+               if (!IS_ERR(clk_table[i]))
+                       clk_unregister(clk_table[i]);
+       }
+
+       return ret;
+}
+
+static int s5pv210_audss_clk_remove(struct platform_device *pdev)
+{
+       int i;
+
+       of_clk_del_provider(pdev->dev.of_node);
+
+       for (i = 0; i < clk_data.clk_num; i++) {
+               if (!IS_ERR(clk_table[i]))
+                       clk_unregister(clk_table[i]);
+       }
+
+       return 0;
+}
+
+static const struct of_device_id s5pv210_audss_clk_of_match[] = {
+       { .compatible = "samsung,s5pv210-audss-clock", },
+       {},
+};
+
+static struct platform_driver s5pv210_audss_clk_driver = {
+       .driver = {
+               .name = "s5pv210-audss-clk",
+               .owner = THIS_MODULE,
+               .of_match_table = s5pv210_audss_clk_of_match,
+       },
+       .probe = s5pv210_audss_clk_probe,
+       .remove = s5pv210_audss_clk_remove,
+};
+
+static int __init s5pv210_audss_clk_init(void)
+{
+       return platform_driver_register(&s5pv210_audss_clk_driver);
+}
+core_initcall(s5pv210_audss_clk_init);
+
+static void __exit s5pv210_audss_clk_exit(void)
+{
+       platform_driver_unregister(&s5pv210_audss_clk_driver);
+}
+module_exit(s5pv210_audss_clk_exit);
+
+MODULE_AUTHOR("Tomasz Figa <t.figa@samsung.com>");
+MODULE_DESCRIPTION("S5PV210 Audio Subsystem Clock Controller");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:s5pv210-audss-clk");
diff --git a/drivers/clk/samsung/clk-s5pv210.c b/drivers/clk/samsung/clk-s5pv210.c
new file mode 100644 (file)
index 0000000..d270a20
--- /dev/null
@@ -0,0 +1,856 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd.
+ * Author: Mateusz Krawczuk <m.krawczuk@partner.samsung.com>
+ *
+ * Based on clock drivers for S3C64xx and Exynos4 SoCs.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Common Clock Framework support for all S5PC110/S5PV210 SoCs.
+ */
+
+#include <linux/clk.h>
+#include <linux/clkdev.h>
+#include <linux/clk-provider.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/syscore_ops.h>
+
+#include "clk.h"
+#include "clk-pll.h"
+
+#include <dt-bindings/clock/s5pv210.h>
+
+/* S5PC110/S5PV210 clock controller register offsets */
+#define APLL_LOCK              0x0000
+#define MPLL_LOCK              0x0008
+#define EPLL_LOCK              0x0010
+#define VPLL_LOCK              0x0020
+#define APLL_CON0              0x0100
+#define APLL_CON1              0x0104
+#define MPLL_CON               0x0108
+#define EPLL_CON0              0x0110
+#define EPLL_CON1              0x0114
+#define VPLL_CON               0x0120
+#define CLK_SRC0               0x0200
+#define CLK_SRC1               0x0204
+#define CLK_SRC2               0x0208
+#define CLK_SRC3               0x020c
+#define CLK_SRC4               0x0210
+#define CLK_SRC5               0x0214
+#define CLK_SRC6               0x0218
+#define CLK_SRC_MASK0          0x0280
+#define CLK_SRC_MASK1          0x0284
+#define CLK_DIV0               0x0300
+#define CLK_DIV1               0x0304
+#define CLK_DIV2               0x0308
+#define CLK_DIV3               0x030c
+#define CLK_DIV4               0x0310
+#define CLK_DIV5               0x0314
+#define CLK_DIV6               0x0318
+#define CLK_DIV7               0x031c
+#define CLK_GATE_MAIN0         0x0400
+#define CLK_GATE_MAIN1         0x0404
+#define CLK_GATE_MAIN2         0x0408
+#define CLK_GATE_PERI0         0x0420
+#define CLK_GATE_PERI1         0x0424
+#define CLK_GATE_SCLK0         0x0440
+#define CLK_GATE_SCLK1         0x0444
+#define CLK_GATE_IP0           0x0460
+#define CLK_GATE_IP1           0x0464
+#define CLK_GATE_IP2           0x0468
+#define CLK_GATE_IP3           0x046c
+#define CLK_GATE_IP4           0x0470
+#define CLK_GATE_BLOCK         0x0480
+#define CLK_GATE_IP5           0x0484
+#define CLK_OUT                        0x0500
+#define MISC                   0xe000
+#define OM_STAT                        0xe100
+
+/* IDs of PLLs available on S5PV210/S5P6442 SoCs */
+enum {
+       apll,
+       mpll,
+       epll,
+       vpll,
+};
+
+/* IDs of external clocks (used for legacy boards) */
+enum {
+       xxti,
+       xusbxti,
+};
+
+static void __iomem *reg_base;
+
+#ifdef CONFIG_PM_SLEEP
+static struct samsung_clk_reg_dump *s5pv210_clk_dump;
+
+/* List of registers that need to be preserved across suspend/resume. */
+static unsigned long s5pv210_clk_regs[] __initdata = {
+       CLK_SRC0,
+       CLK_SRC1,
+       CLK_SRC2,
+       CLK_SRC3,
+       CLK_SRC4,
+       CLK_SRC5,
+       CLK_SRC6,
+       CLK_SRC_MASK0,
+       CLK_SRC_MASK1,
+       CLK_DIV0,
+       CLK_DIV1,
+       CLK_DIV2,
+       CLK_DIV3,
+       CLK_DIV4,
+       CLK_DIV5,
+       CLK_DIV6,
+       CLK_DIV7,
+       CLK_GATE_MAIN0,
+       CLK_GATE_MAIN1,
+       CLK_GATE_MAIN2,
+       CLK_GATE_PERI0,
+       CLK_GATE_PERI1,
+       CLK_GATE_SCLK0,
+       CLK_GATE_SCLK1,
+       CLK_GATE_IP0,
+       CLK_GATE_IP1,
+       CLK_GATE_IP2,
+       CLK_GATE_IP3,
+       CLK_GATE_IP4,
+       CLK_GATE_IP5,
+       CLK_GATE_BLOCK,
+       APLL_LOCK,
+       MPLL_LOCK,
+       EPLL_LOCK,
+       VPLL_LOCK,
+       APLL_CON0,
+       APLL_CON1,
+       MPLL_CON,
+       EPLL_CON0,
+       EPLL_CON1,
+       VPLL_CON,
+       CLK_OUT,
+};
+
+static int s5pv210_clk_suspend(void)
+{
+       samsung_clk_save(reg_base, s5pv210_clk_dump,
+                               ARRAY_SIZE(s5pv210_clk_regs));
+       return 0;
+}
+
+static void s5pv210_clk_resume(void)
+{
+       samsung_clk_restore(reg_base, s5pv210_clk_dump,
+                               ARRAY_SIZE(s5pv210_clk_regs));
+}
+
+static struct syscore_ops s5pv210_clk_syscore_ops = {
+       .suspend = s5pv210_clk_suspend,
+       .resume = s5pv210_clk_resume,
+};
+
+static void s5pv210_clk_sleep_init(void)
+{
+       s5pv210_clk_dump =
+               samsung_clk_alloc_reg_dump(s5pv210_clk_regs,
+                                          ARRAY_SIZE(s5pv210_clk_regs));
+       if (!s5pv210_clk_dump) {
+               pr_warn("%s: Failed to allocate sleep save data\n", __func__);
+               return;
+       }
+
+       register_syscore_ops(&s5pv210_clk_syscore_ops);
+}
+#else
+static inline void s5pv210_clk_sleep_init(void) { }
+#endif
+
+/* Mux parent lists. */
+static const char *fin_pll_p[] __initconst = {
+       "xxti",
+       "xusbxti"
+};
+
+static const char *mout_apll_p[] __initconst = {
+       "fin_pll",
+       "fout_apll"
+};
+
+static const char *mout_mpll_p[] __initconst = {
+       "fin_pll",
+       "fout_mpll"
+};
+
+static const char *mout_epll_p[] __initconst = {
+       "fin_pll",
+       "fout_epll"
+};
+
+static const char *mout_vpllsrc_p[] __initconst = {
+       "fin_pll",
+       "sclk_hdmi27m"
+};
+
+static const char *mout_vpll_p[] __initconst = {
+       "mout_vpllsrc",
+       "fout_vpll"
+};
+
+static const char *mout_group1_p[] __initconst = {
+       "dout_a2m",
+       "mout_mpll",
+       "mout_epll",
+       "mout_vpll"
+};
+
+static const char *mout_group2_p[] __initconst = {
+       "xxti",
+       "xusbxti",
+       "sclk_hdmi27m",
+       "sclk_usbphy0",
+       "sclk_usbphy1",
+       "sclk_hdmiphy",
+       "mout_mpll",
+       "mout_epll",
+       "mout_vpll",
+};
+
+static const char *mout_audio0_p[] __initconst = {
+       "xxti",
+       "pcmcdclk0",
+       "sclk_hdmi27m",
+       "sclk_usbphy0",
+       "sclk_usbphy1",
+       "sclk_hdmiphy",
+       "mout_mpll",
+       "mout_epll",
+       "mout_vpll",
+};
+
+static const char *mout_audio1_p[] __initconst = {
+       "i2scdclk1",
+       "pcmcdclk1",
+       "sclk_hdmi27m",
+       "sclk_usbphy0",
+       "sclk_usbphy1",
+       "sclk_hdmiphy",
+       "mout_mpll",
+       "mout_epll",
+       "mout_vpll",
+};
+
+static const char *mout_audio2_p[] __initconst = {
+       "i2scdclk2",
+       "pcmcdclk2",
+       "sclk_hdmi27m",
+       "sclk_usbphy0",
+       "sclk_usbphy1",
+       "sclk_hdmiphy",
+       "mout_mpll",
+       "mout_epll",
+       "mout_vpll",
+};
+
+static const char *mout_spdif_p[] __initconst = {
+       "dout_audio0",
+       "dout_audio1",
+       "dout_audio3",
+};
+
+static const char *mout_group3_p[] __initconst = {
+       "mout_apll",
+       "mout_mpll"
+};
+
+static const char *mout_group4_p[] __initconst = {
+       "mout_mpll",
+       "dout_a2m"
+};
+
+static const char *mout_flash_p[] __initconst = {
+       "dout_hclkd",
+       "dout_hclkp"
+};
+
+static const char *mout_dac_p[] __initconst = {
+       "mout_vpll",
+       "sclk_hdmiphy"
+};
+
+static const char *mout_hdmi_p[] __initconst = {
+       "sclk_hdmiphy",
+       "dout_tblk"
+};
+
+static const char *mout_mixer_p[] __initconst = {
+       "mout_dac",
+       "mout_hdmi"
+};
+
+static const char *mout_vpll_6442_p[] __initconst = {
+       "fin_pll",
+       "fout_vpll"
+};
+
+static const char *mout_mixer_6442_p[] __initconst = {
+       "mout_vpll",
+       "dout_mixer"
+};
+
+static const char *mout_d0sync_6442_p[] __initconst = {
+       "mout_dsys",
+       "div_apll"
+};
+
+static const char *mout_d1sync_6442_p[] __initconst = {
+       "mout_psys",
+       "div_apll"
+};
+
+static const char *mout_group2_6442_p[] __initconst = {
+       "fin_pll",
+       "none",
+       "none",
+       "sclk_usbphy0",
+       "none",
+       "none",
+       "mout_mpll",
+       "mout_epll",
+       "mout_vpll",
+};
+
+static const char *mout_audio0_6442_p[] __initconst = {
+       "fin_pll",
+       "pcmcdclk0",
+       "none",
+       "sclk_usbphy0",
+       "none",
+       "none",
+       "mout_mpll",
+       "mout_epll",
+       "mout_vpll",
+};
+
+static const char *mout_audio1_6442_p[] __initconst = {
+       "i2scdclk1",
+       "pcmcdclk1",
+       "none",
+       "sclk_usbphy0",
+       "none",
+       "none",
+       "mout_mpll",
+       "mout_epll",
+       "mout_vpll",
+       "fin_pll",
+};
+
+static const char *mout_clksel_p[] __initconst = {
+       "fout_apll_clkout",
+       "fout_mpll_clkout",
+       "fout_epll",
+       "fout_vpll",
+       "sclk_usbphy0",
+       "sclk_usbphy1",
+       "sclk_hdmiphy",
+       "rtc",
+       "rtc_tick",
+       "dout_hclkm",
+       "dout_pclkm",
+       "dout_hclkd",
+       "dout_pclkd",
+       "dout_hclkp",
+       "dout_pclkp",
+       "dout_apll_clkout",
+       "dout_hpm",
+       "xxti",
+       "xusbxti",
+       "div_dclk"
+};
+
+static const char *mout_clksel_6442_p[] __initconst = {
+       "fout_apll_clkout",
+       "fout_mpll_clkout",
+       "fout_epll",
+       "fout_vpll",
+       "sclk_usbphy0",
+       "none",
+       "none",
+       "rtc",
+       "rtc_tick",
+       "none",
+       "none",
+       "dout_hclkd",
+       "dout_pclkd",
+       "dout_hclkp",
+       "dout_pclkp",
+       "dout_apll_clkout",
+       "none",
+       "fin_pll",
+       "none",
+       "div_dclk"
+};
+
+static const char *mout_clkout_p[] __initconst = {
+       "dout_clkout",
+       "none",
+       "xxti",
+       "xusbxti"
+};
+
+/* Common fixed factor clocks. */
+static struct samsung_fixed_factor_clock ffactor_clks[] __initdata = {
+       FFACTOR(FOUT_APLL_CLKOUT, "fout_apll_clkout", "fout_apll", 1, 4, 0),
+       FFACTOR(FOUT_MPLL_CLKOUT, "fout_mpll_clkout", "fout_mpll", 1, 2, 0),
+       FFACTOR(DOUT_APLL_CLKOUT, "dout_apll_clkout", "dout_apll", 1, 4, 0),
+};
+
+/* PLL input mux (fin_pll), which needs to be registered before PLLs. */
+static struct samsung_mux_clock early_mux_clks[] __initdata = {
+       MUX_F(FIN_PLL, "fin_pll", fin_pll_p, OM_STAT, 0, 1,
+                                       CLK_MUX_READ_ONLY, 0),
+};
+
+/* Common clock muxes. */
+static struct samsung_mux_clock mux_clks[] __initdata = {
+       MUX(MOUT_FLASH, "mout_flash", mout_flash_p, CLK_SRC0, 28, 1),
+       MUX(MOUT_PSYS, "mout_psys", mout_group4_p, CLK_SRC0, 24, 1),
+       MUX(MOUT_DSYS, "mout_dsys", mout_group4_p, CLK_SRC0, 20, 1),
+       MUX(MOUT_MSYS, "mout_msys", mout_group3_p, CLK_SRC0, 16, 1),
+       MUX(MOUT_EPLL, "mout_epll", mout_epll_p, CLK_SRC0, 8, 1),
+       MUX(MOUT_MPLL, "mout_mpll", mout_mpll_p, CLK_SRC0, 4, 1),
+       MUX(MOUT_APLL, "mout_apll", mout_apll_p, CLK_SRC0, 0, 1),
+
+       MUX(MOUT_CLKOUT, "mout_clkout", mout_clkout_p, MISC, 8, 2),
+};
+
+/* S5PV210-specific clock muxes. */
+static struct samsung_mux_clock s5pv210_mux_clks[] __initdata = {
+       MUX(MOUT_VPLL, "mout_vpll", mout_vpll_p, CLK_SRC0, 12, 1),
+
+       MUX(MOUT_VPLLSRC, "mout_vpllsrc", mout_vpllsrc_p, CLK_SRC1, 28, 1),
+       MUX(MOUT_CSIS, "mout_csis", mout_group2_p, CLK_SRC1, 24, 4),
+       MUX(MOUT_FIMD, "mout_fimd", mout_group2_p, CLK_SRC1, 20, 4),
+       MUX(MOUT_CAM1, "mout_cam1", mout_group2_p, CLK_SRC1, 16, 4),
+       MUX(MOUT_CAM0, "mout_cam0", mout_group2_p, CLK_SRC1, 12, 4),
+       MUX(MOUT_DAC, "mout_dac", mout_dac_p, CLK_SRC1, 8, 1),
+       MUX(MOUT_MIXER, "mout_mixer", mout_mixer_p, CLK_SRC1, 4, 1),
+       MUX(MOUT_HDMI, "mout_hdmi", mout_hdmi_p, CLK_SRC1, 0, 1),
+
+       MUX(MOUT_G2D, "mout_g2d", mout_group1_p, CLK_SRC2, 8, 2),
+       MUX(MOUT_MFC, "mout_mfc", mout_group1_p, CLK_SRC2, 4, 2),
+       MUX(MOUT_G3D, "mout_g3d", mout_group1_p, CLK_SRC2, 0, 2),
+
+       MUX(MOUT_FIMC2, "mout_fimc2", mout_group2_p, CLK_SRC3, 20, 4),
+       MUX(MOUT_FIMC1, "mout_fimc1", mout_group2_p, CLK_SRC3, 16, 4),
+       MUX(MOUT_FIMC0, "mout_fimc0", mout_group2_p, CLK_SRC3, 12, 4),
+
+       MUX(MOUT_UART3, "mout_uart3", mout_group2_p, CLK_SRC4, 28, 4),
+       MUX(MOUT_UART2, "mout_uart2", mout_group2_p, CLK_SRC4, 24, 4),
+       MUX(MOUT_UART1, "mout_uart1", mout_group2_p, CLK_SRC4, 20, 4),
+       MUX(MOUT_UART0, "mout_uart0", mout_group2_p, CLK_SRC4, 16, 4),
+       MUX(MOUT_MMC3, "mout_mmc3", mout_group2_p, CLK_SRC4, 12, 4),
+       MUX(MOUT_MMC2, "mout_mmc2", mout_group2_p, CLK_SRC4, 8, 4),
+       MUX(MOUT_MMC1, "mout_mmc1", mout_group2_p, CLK_SRC4, 4, 4),
+       MUX(MOUT_MMC0, "mout_mmc0", mout_group2_p, CLK_SRC4, 0, 4),
+
+       MUX(MOUT_PWM, "mout_pwm", mout_group2_p, CLK_SRC5, 12, 4),
+       MUX(MOUT_SPI1, "mout_spi1", mout_group2_p, CLK_SRC5, 4, 4),
+       MUX(MOUT_SPI0, "mout_spi0", mout_group2_p, CLK_SRC5, 0, 4),
+
+       MUX(MOUT_DMC0, "mout_dmc0", mout_group1_p, CLK_SRC6, 24, 2),
+       MUX(MOUT_PWI, "mout_pwi", mout_group2_p, CLK_SRC6, 20, 4),
+       MUX(MOUT_HPM, "mout_hpm", mout_group3_p, CLK_SRC6, 16, 1),
+       MUX(MOUT_SPDIF, "mout_spdif", mout_spdif_p, CLK_SRC6, 12, 2),
+       MUX(MOUT_AUDIO2, "mout_audio2", mout_audio2_p, CLK_SRC6, 8, 4),
+       MUX(MOUT_AUDIO1, "mout_audio1", mout_audio1_p, CLK_SRC6, 4, 4),
+       MUX(MOUT_AUDIO0, "mout_audio0", mout_audio0_p, CLK_SRC6, 0, 4),
+
+       MUX(MOUT_CLKSEL, "mout_clksel", mout_clksel_p, CLK_OUT, 12, 5),
+};
+
+/* S5P6442-specific clock muxes. */
+static struct samsung_mux_clock s5p6442_mux_clks[] __initdata = {
+       MUX(MOUT_VPLL, "mout_vpll", mout_vpll_6442_p, CLK_SRC0, 12, 1),
+
+       MUX(MOUT_FIMD, "mout_fimd", mout_group2_6442_p, CLK_SRC1, 20, 4),
+       MUX(MOUT_CAM1, "mout_cam1", mout_group2_6442_p, CLK_SRC1, 16, 4),
+       MUX(MOUT_CAM0, "mout_cam0", mout_group2_6442_p, CLK_SRC1, 12, 4),
+       MUX(MOUT_MIXER, "mout_mixer", mout_mixer_6442_p, CLK_SRC1, 4, 1),
+
+       MUX(MOUT_D0SYNC, "mout_d0sync", mout_d0sync_6442_p, CLK_SRC2, 28, 1),
+       MUX(MOUT_D1SYNC, "mout_d1sync", mout_d1sync_6442_p, CLK_SRC2, 24, 1),
+
+       MUX(MOUT_FIMC2, "mout_fimc2", mout_group2_6442_p, CLK_SRC3, 20, 4),
+       MUX(MOUT_FIMC1, "mout_fimc1", mout_group2_6442_p, CLK_SRC3, 16, 4),
+       MUX(MOUT_FIMC0, "mout_fimc0", mout_group2_6442_p, CLK_SRC3, 12, 4),
+
+       MUX(MOUT_UART2, "mout_uart2", mout_group2_6442_p, CLK_SRC4, 24, 4),
+       MUX(MOUT_UART1, "mout_uart1", mout_group2_6442_p, CLK_SRC4, 20, 4),
+       MUX(MOUT_UART0, "mout_uart0", mout_group2_6442_p, CLK_SRC4, 16, 4),
+       MUX(MOUT_MMC2, "mout_mmc2", mout_group2_6442_p, CLK_SRC4, 8, 4),
+       MUX(MOUT_MMC1, "mout_mmc1", mout_group2_6442_p, CLK_SRC4, 4, 4),
+       MUX(MOUT_MMC0, "mout_mmc0", mout_group2_6442_p, CLK_SRC4, 0, 4),
+
+       MUX(MOUT_PWM, "mout_pwm", mout_group2_6442_p, CLK_SRC5, 12, 4),
+       MUX(MOUT_SPI0, "mout_spi0", mout_group2_6442_p, CLK_SRC5, 0, 4),
+
+       MUX(MOUT_AUDIO1, "mout_audio1", mout_audio1_6442_p, CLK_SRC6, 4, 4),
+       MUX(MOUT_AUDIO0, "mout_audio0", mout_audio0_6442_p, CLK_SRC6, 0, 4),
+
+       MUX(MOUT_CLKSEL, "mout_clksel", mout_clksel_6442_p, CLK_OUT, 12, 5),
+};
+
+/* S5PV210-specific fixed rate clocks generated inside the SoC. */
+static struct samsung_fixed_rate_clock s5pv210_frate_clks[] __initdata = {
+       FRATE(SCLK_HDMI27M, "sclk_hdmi27m", NULL, CLK_IS_ROOT, 27000000),
+       FRATE(SCLK_HDMIPHY, "sclk_hdmiphy", NULL, CLK_IS_ROOT, 27000000),
+       FRATE(SCLK_USBPHY0, "sclk_usbphy0", NULL, CLK_IS_ROOT, 48000000),
+       FRATE(SCLK_USBPHY1, "sclk_usbphy1", NULL, CLK_IS_ROOT, 48000000),
+};
+
+/* S5P6442-specific fixed rate clocks generated inside the SoC. */
+static struct samsung_fixed_rate_clock s5p6442_frate_clks[] __initdata = {
+       FRATE(SCLK_USBPHY0, "sclk_usbphy0", NULL, CLK_IS_ROOT, 30000000),
+};
+
+/* Common clock dividers. */
+static struct samsung_div_clock div_clks[] __initdata = {
+       DIV(DOUT_PCLKP, "dout_pclkp", "dout_hclkp", CLK_DIV0, 28, 3),
+       DIV(DOUT_PCLKD, "dout_pclkd", "dout_hclkd", CLK_DIV0, 20, 3),
+       DIV(DOUT_A2M, "dout_a2m", "mout_apll", CLK_DIV0, 4, 3),
+       DIV(DOUT_APLL, "dout_apll", "mout_msys", CLK_DIV0, 0, 3),
+
+       DIV(DOUT_FIMD, "dout_fimd", "mout_fimd", CLK_DIV1, 20, 4),
+       DIV(DOUT_CAM1, "dout_cam1", "mout_cam1", CLK_DIV1, 16, 4),
+       DIV(DOUT_CAM0, "dout_cam0", "mout_cam0", CLK_DIV1, 12, 4),
+
+       DIV(DOUT_FIMC2, "dout_fimc2", "mout_fimc2", CLK_DIV3, 20, 4),
+       DIV(DOUT_FIMC1, "dout_fimc1", "mout_fimc1", CLK_DIV3, 16, 4),
+       DIV(DOUT_FIMC0, "dout_fimc0", "mout_fimc0", CLK_DIV3, 12, 4),
+
+       DIV(DOUT_UART2, "dout_uart2", "mout_uart2", CLK_DIV4, 24, 4),
+       DIV(DOUT_UART1, "dout_uart1", "mout_uart1", CLK_DIV4, 20, 4),
+       DIV(DOUT_UART0, "dout_uart0", "mout_uart0", CLK_DIV4, 16, 4),
+       DIV(DOUT_MMC2, "dout_mmc2", "mout_mmc2", CLK_DIV4, 8, 4),
+       DIV(DOUT_MMC1, "dout_mmc1", "mout_mmc1", CLK_DIV4, 4, 4),
+       DIV(DOUT_MMC0, "dout_mmc0", "mout_mmc0", CLK_DIV4, 0, 4),
+
+       DIV(DOUT_PWM, "dout_pwm", "mout_pwm", CLK_DIV5, 12, 4),
+       DIV(DOUT_SPI0, "dout_spi0", "mout_spi0", CLK_DIV5, 0, 4),
+
+       DIV(DOUT_FLASH, "dout_flash", "mout_flash", CLK_DIV6, 12, 3),
+       DIV(DOUT_AUDIO1, "dout_audio1", "mout_audio1", CLK_DIV6, 4, 4),
+       DIV(DOUT_AUDIO0, "dout_audio0", "mout_audio0", CLK_DIV6, 0, 4),
+
+       DIV(DOUT_CLKOUT, "dout_clkout", "mout_clksel", CLK_OUT, 20, 4),
+};
+
+/* S5PV210-specific clock dividers. */
+static struct samsung_div_clock s5pv210_div_clks[] __initdata = {
+       DIV(DOUT_HCLKP, "dout_hclkp", "mout_psys", CLK_DIV0, 24, 4),
+       DIV(DOUT_HCLKD, "dout_hclkd", "mout_dsys", CLK_DIV0, 16, 4),
+       DIV(DOUT_PCLKM, "dout_pclkm", "dout_hclkm", CLK_DIV0, 12, 3),
+       DIV(DOUT_HCLKM, "dout_hclkm", "dout_apll", CLK_DIV0, 8, 3),
+
+       DIV(DOUT_CSIS, "dout_csis", "mout_csis", CLK_DIV1, 28, 4),
+       DIV(DOUT_TBLK, "dout_tblk", "mout_vpll", CLK_DIV1, 0, 4),
+
+       DIV(DOUT_G2D, "dout_g2d", "mout_g2d", CLK_DIV2, 8, 4),
+       DIV(DOUT_MFC, "dout_mfc", "mout_mfc", CLK_DIV2, 4, 4),
+       DIV(DOUT_G3D, "dout_g3d", "mout_g3d", CLK_DIV2, 0, 4),
+
+       DIV(DOUT_UART3, "dout_uart3", "mout_uart3", CLK_DIV4, 28, 4),
+       DIV(DOUT_MMC3, "dout_mmc3", "mout_mmc3", CLK_DIV4, 12, 4),
+
+       DIV(DOUT_SPI1, "dout_spi1", "mout_spi1", CLK_DIV5, 4, 4),
+
+       DIV(DOUT_DMC0, "dout_dmc0", "mout_dmc0", CLK_DIV6, 28, 4),
+       DIV(DOUT_PWI, "dout_pwi", "mout_pwi", CLK_DIV6, 24, 4),
+       DIV(DOUT_HPM, "dout_hpm", "dout_copy", CLK_DIV6, 20, 3),
+       DIV(DOUT_COPY, "dout_copy", "mout_hpm", CLK_DIV6, 16, 3),
+       DIV(DOUT_AUDIO2, "dout_audio2", "mout_audio2", CLK_DIV6, 8, 4),
+
+       DIV(DOUT_DPM, "dout_dpm", "dout_pclkp", CLK_DIV7, 8, 7),
+       DIV(DOUT_DVSEM, "dout_dvsem", "dout_pclkp", CLK_DIV7, 0, 7),
+};
+
+/* S5P6442-specific clock dividers. */
+static struct samsung_div_clock s5p6442_div_clks[] __initdata = {
+       DIV(DOUT_HCLKP, "dout_hclkp", "mout_d1sync", CLK_DIV0, 24, 4),
+       DIV(DOUT_HCLKD, "dout_hclkd", "mout_d0sync", CLK_DIV0, 16, 4),
+
+       DIV(DOUT_MIXER, "dout_mixer", "mout_vpll", CLK_DIV1, 0, 4),
+};
+
+/* Common clock gates. */
+static struct samsung_gate_clock gate_clks[] __initdata = {
+       GATE(CLK_ROTATOR, "rotator", "dout_hclkd", CLK_GATE_IP0, 29, 0, 0),
+       GATE(CLK_FIMC2, "fimc2", "dout_hclkd", CLK_GATE_IP0, 26, 0, 0),
+       GATE(CLK_FIMC1, "fimc1", "dout_hclkd", CLK_GATE_IP0, 25, 0, 0),
+       GATE(CLK_FIMC0, "fimc0", "dout_hclkd", CLK_GATE_IP0, 24, 0, 0),
+       GATE(CLK_PDMA0, "pdma0", "dout_hclkp", CLK_GATE_IP0, 3, 0, 0),
+       GATE(CLK_MDMA, "mdma", "dout_hclkd", CLK_GATE_IP0, 2, 0, 0),
+
+       GATE(CLK_SROMC, "sromc", "dout_hclkp", CLK_GATE_IP1, 26, 0, 0),
+       GATE(CLK_NANDXL, "nandxl", "dout_hclkp", CLK_GATE_IP1, 24, 0, 0),
+       GATE(CLK_USB_OTG, "usb_otg", "dout_hclkp", CLK_GATE_IP1, 16, 0, 0),
+       GATE(CLK_TVENC, "tvenc", "dout_hclkd", CLK_GATE_IP1, 10, 0, 0),
+       GATE(CLK_MIXER, "mixer", "dout_hclkd", CLK_GATE_IP1, 9, 0, 0),
+       GATE(CLK_VP, "vp", "dout_hclkd", CLK_GATE_IP1, 8, 0, 0),
+       GATE(CLK_FIMD, "fimd", "dout_hclkd", CLK_GATE_IP1, 0, 0, 0),
+
+       GATE(CLK_HSMMC2, "hsmmc2", "dout_hclkp", CLK_GATE_IP2, 18, 0, 0),
+       GATE(CLK_HSMMC1, "hsmmc1", "dout_hclkp", CLK_GATE_IP2, 17, 0, 0),
+       GATE(CLK_HSMMC0, "hsmmc0", "dout_hclkp", CLK_GATE_IP2, 16, 0, 0),
+       GATE(CLK_MODEMIF, "modemif", "dout_hclkp", CLK_GATE_IP2, 9, 0, 0),
+       GATE(CLK_SECSS, "secss", "dout_hclkp", CLK_GATE_IP2, 0, 0, 0),
+
+       GATE(CLK_PCM1, "pcm1", "dout_pclkp", CLK_GATE_IP3, 29, 0, 0),
+       GATE(CLK_PCM0, "pcm0", "dout_pclkp", CLK_GATE_IP3, 28, 0, 0),
+       GATE(CLK_TSADC, "tsadc", "dout_pclkp", CLK_GATE_IP3, 24, 0, 0),
+       GATE(CLK_PWM, "pwm", "dout_pclkp", CLK_GATE_IP3, 23, 0, 0),
+       GATE(CLK_WDT, "watchdog", "dout_pclkp", CLK_GATE_IP3, 22, 0, 0),
+       GATE(CLK_KEYIF, "keyif", "dout_pclkp", CLK_GATE_IP3, 21, 0, 0),
+       GATE(CLK_UART2, "uart2", "dout_pclkp", CLK_GATE_IP3, 19, 0, 0),
+       GATE(CLK_UART1, "uart1", "dout_pclkp", CLK_GATE_IP3, 18, 0, 0),
+       GATE(CLK_UART0, "uart0", "dout_pclkp", CLK_GATE_IP3, 17, 0, 0),
+       GATE(CLK_SYSTIMER, "systimer", "dout_pclkp", CLK_GATE_IP3, 16, 0, 0),
+       GATE(CLK_RTC, "rtc", "dout_pclkp", CLK_GATE_IP3, 15, 0, 0),
+       GATE(CLK_SPI0, "spi0", "dout_pclkp", CLK_GATE_IP3, 12, 0, 0),
+       GATE(CLK_I2C2, "i2c2", "dout_pclkp", CLK_GATE_IP3, 9, 0, 0),
+       GATE(CLK_I2C0, "i2c0", "dout_pclkp", CLK_GATE_IP3, 7, 0, 0),
+       GATE(CLK_I2S1, "i2s1", "dout_pclkp", CLK_GATE_IP3, 5, 0, 0),
+       GATE(CLK_I2S0, "i2s0", "dout_pclkp", CLK_GATE_IP3, 4, 0, 0),
+
+       GATE(CLK_SECKEY, "seckey", "dout_pclkp", CLK_GATE_IP4, 3, 0, 0),
+       GATE(CLK_CHIPID, "chipid", "dout_pclkp", CLK_GATE_IP4, 0, 0, 0),
+
+       GATE(SCLK_AUDIO1, "sclk_audio1", "dout_audio1", CLK_SRC_MASK0, 25,
+                       CLK_SET_RATE_PARENT, 0),
+       GATE(SCLK_AUDIO0, "sclk_audio0", "dout_audio0", CLK_SRC_MASK0, 24,
+                       CLK_SET_RATE_PARENT, 0),
+       GATE(SCLK_PWM, "sclk_pwm", "dout_pwm", CLK_SRC_MASK0, 19,
+                       CLK_SET_RATE_PARENT, 0),
+       GATE(SCLK_SPI0, "sclk_spi0", "dout_spi0", CLK_SRC_MASK0, 16,
+                       CLK_SET_RATE_PARENT, 0),
+       GATE(SCLK_UART2, "sclk_uart2", "dout_uart2", CLK_SRC_MASK0, 14,
+                       CLK_SET_RATE_PARENT, 0),
+       GATE(SCLK_UART1, "sclk_uart1", "dout_uart1", CLK_SRC_MASK0, 13,
+                       CLK_SET_RATE_PARENT, 0),
+       GATE(SCLK_UART0, "sclk_uart0", "dout_uart0", CLK_SRC_MASK0, 12,
+                       CLK_SET_RATE_PARENT, 0),
+       GATE(SCLK_MMC2, "sclk_mmc2", "dout_mmc2", CLK_SRC_MASK0, 10,
+                       CLK_SET_RATE_PARENT, 0),
+       GATE(SCLK_MMC1, "sclk_mmc1", "dout_mmc1", CLK_SRC_MASK0, 9,
+                       CLK_SET_RATE_PARENT, 0),
+       GATE(SCLK_MMC0, "sclk_mmc0", "dout_mmc0", CLK_SRC_MASK0, 8,
+                       CLK_SET_RATE_PARENT, 0),
+       GATE(SCLK_FIMD, "sclk_fimd", "dout_fimd", CLK_SRC_MASK0, 5,
+                       CLK_SET_RATE_PARENT, 0),
+       GATE(SCLK_CAM1, "sclk_cam1", "dout_cam1", CLK_SRC_MASK0, 4,
+                       CLK_SET_RATE_PARENT, 0),
+       GATE(SCLK_CAM0, "sclk_cam0", "dout_cam0", CLK_SRC_MASK0, 3,
+                       CLK_SET_RATE_PARENT, 0),
+       GATE(SCLK_MIXER, "sclk_mixer", "mout_mixer", CLK_SRC_MASK0, 1,
+                       CLK_SET_RATE_PARENT, 0),
+
+       GATE(SCLK_FIMC2, "sclk_fimc2", "dout_fimc2", CLK_SRC_MASK1, 4,
+                       CLK_SET_RATE_PARENT, 0),
+       GATE(SCLK_FIMC1, "sclk_fimc1", "dout_fimc1", CLK_SRC_MASK1, 3,
+                       CLK_SET_RATE_PARENT, 0),
+       GATE(SCLK_FIMC0, "sclk_fimc0", "dout_fimc0", CLK_SRC_MASK1, 2,
+                       CLK_SET_RATE_PARENT, 0),
+};
+
+/* S5PV210-specific clock gates. */
+static struct samsung_gate_clock s5pv210_gate_clks[] __initdata = {
+       GATE(CLK_CSIS, "clk_csis", "dout_hclkd", CLK_GATE_IP0, 31, 0, 0),
+       GATE(CLK_MFC, "mfc", "dout_hclkm", CLK_GATE_IP0, 16, 0, 0),
+       GATE(CLK_G2D, "g2d", "dout_hclkd", CLK_GATE_IP0, 12, 0, 0),
+       GATE(CLK_G3D, "g3d", "dout_hclkm", CLK_GATE_IP0, 8, 0, 0),
+       GATE(CLK_IMEM, "imem", "dout_hclkm", CLK_GATE_IP0, 5, 0, 0),
+       GATE(CLK_PDMA1, "pdma1", "dout_hclkp", CLK_GATE_IP0, 4, 0, 0),
+
+       GATE(CLK_NFCON, "nfcon", "dout_hclkp", CLK_GATE_IP1, 28, 0, 0),
+       GATE(CLK_CFCON, "cfcon", "dout_hclkp", CLK_GATE_IP1, 25, 0, 0),
+       GATE(CLK_USB_HOST, "usb_host", "dout_hclkp", CLK_GATE_IP1, 17, 0, 0),
+       GATE(CLK_HDMI, "hdmi", "dout_hclkd", CLK_GATE_IP1, 11, 0, 0),
+       GATE(CLK_DSIM, "dsim", "dout_pclkd", CLK_GATE_IP1, 2, 0, 0),
+
+       GATE(CLK_TZIC3, "tzic3", "dout_hclkm", CLK_GATE_IP2, 31, 0, 0),
+       GATE(CLK_TZIC2, "tzic2", "dout_hclkm", CLK_GATE_IP2, 30, 0, 0),
+       GATE(CLK_TZIC1, "tzic1", "dout_hclkm", CLK_GATE_IP2, 29, 0, 0),
+       GATE(CLK_TZIC0, "tzic0", "dout_hclkm", CLK_GATE_IP2, 28, 0, 0),
+       GATE(CLK_TSI, "tsi", "dout_hclkd", CLK_GATE_IP2, 20, 0, 0),
+       GATE(CLK_HSMMC3, "hsmmc3", "dout_hclkp", CLK_GATE_IP2, 19, 0, 0),
+       GATE(CLK_JTAG, "jtag", "dout_hclkp", CLK_GATE_IP2, 11, 0, 0),
+       GATE(CLK_CORESIGHT, "coresight", "dout_pclkp", CLK_GATE_IP2, 8, 0, 0),
+       GATE(CLK_SDM, "sdm", "dout_pclkm", CLK_GATE_IP2, 1, 0, 0),
+
+       GATE(CLK_PCM2, "pcm2", "dout_pclkp", CLK_GATE_IP3, 30, 0, 0),
+       GATE(CLK_UART3, "uart3", "dout_pclkp", CLK_GATE_IP3, 20, 0, 0),
+       GATE(CLK_SPI1, "spi1", "dout_pclkp", CLK_GATE_IP3, 13, 0, 0),
+       GATE(CLK_I2C_HDMI_PHY, "i2c_hdmi_phy", "dout_pclkd",
+                       CLK_GATE_IP3, 11, 0, 0),
+       GATE(CLK_I2C1, "i2c1", "dout_pclkd", CLK_GATE_IP3, 10, 0, 0),
+       GATE(CLK_I2S2, "i2s2", "dout_pclkp", CLK_GATE_IP3, 6, 0, 0),
+       GATE(CLK_AC97, "ac97", "dout_pclkp", CLK_GATE_IP3, 1, 0, 0),
+       GATE(CLK_SPDIF, "spdif", "dout_pclkp", CLK_GATE_IP3, 0, 0, 0),
+
+       GATE(CLK_TZPC3, "tzpc.3", "dout_pclkd", CLK_GATE_IP4, 8, 0, 0),
+       GATE(CLK_TZPC2, "tzpc.2", "dout_pclkd", CLK_GATE_IP4, 7, 0, 0),
+       GATE(CLK_TZPC1, "tzpc.1", "dout_pclkp", CLK_GATE_IP4, 6, 0, 0),
+       GATE(CLK_TZPC0, "tzpc.0", "dout_pclkm", CLK_GATE_IP4, 5, 0, 0),
+       GATE(CLK_IEM_APC, "iem_apc", "dout_pclkp", CLK_GATE_IP4, 2, 0, 0),
+       GATE(CLK_IEM_IEC, "iem_iec", "dout_pclkp", CLK_GATE_IP4, 1, 0, 0),
+
+       GATE(CLK_JPEG, "jpeg", "dout_hclkd", CLK_GATE_IP5, 29, 0, 0),
+
+       GATE(SCLK_SPDIF, "sclk_spdif", "mout_spdif", CLK_SRC_MASK0, 27,
+                       CLK_SET_RATE_PARENT, 0),
+       GATE(SCLK_AUDIO2, "sclk_audio2", "dout_audio2", CLK_SRC_MASK0, 26,
+                       CLK_SET_RATE_PARENT, 0),
+       GATE(SCLK_SPI1, "sclk_spi1", "dout_spi1", CLK_SRC_MASK0, 17,
+                       CLK_SET_RATE_PARENT, 0),
+       GATE(SCLK_UART3, "sclk_uart3", "dout_uart3", CLK_SRC_MASK0, 15,
+                       CLK_SET_RATE_PARENT, 0),
+       GATE(SCLK_MMC3, "sclk_mmc3", "dout_mmc3", CLK_SRC_MASK0, 11,
+                       CLK_SET_RATE_PARENT, 0),
+       GATE(SCLK_CSIS, "sclk_csis", "dout_csis", CLK_SRC_MASK0, 6,
+                       CLK_SET_RATE_PARENT, 0),
+       GATE(SCLK_DAC, "sclk_dac", "mout_dac", CLK_SRC_MASK0, 2,
+                       CLK_SET_RATE_PARENT, 0),
+       GATE(SCLK_HDMI, "sclk_hdmi", "mout_hdmi", CLK_SRC_MASK0, 0,
+                       CLK_SET_RATE_PARENT, 0),
+};
+
+/* S5P6442-specific clock gates. */
+static struct samsung_gate_clock s5p6442_gate_clks[] __initdata = {
+       GATE(CLK_JPEG, "jpeg", "dout_hclkd", CLK_GATE_IP0, 28, 0, 0),
+       GATE(CLK_MFC, "mfc", "dout_hclkd", CLK_GATE_IP0, 16, 0, 0),
+       GATE(CLK_G2D, "g2d", "dout_hclkd", CLK_GATE_IP0, 12, 0, 0),
+       GATE(CLK_G3D, "g3d", "dout_hclkd", CLK_GATE_IP0, 8, 0, 0),
+       GATE(CLK_IMEM, "imem", "dout_hclkd", CLK_GATE_IP0, 5, 0, 0),
+
+       GATE(CLK_ETB, "etb", "dout_hclkd", CLK_GATE_IP1, 31, 0, 0),
+       GATE(CLK_ETM, "etm", "dout_hclkd", CLK_GATE_IP1, 30, 0, 0),
+
+       GATE(CLK_I2C1, "i2c1", "dout_pclkp", CLK_GATE_IP3, 8, 0, 0),
+
+       GATE(SCLK_DAC, "sclk_dac", "mout_vpll", CLK_SRC_MASK0, 2,
+                       CLK_SET_RATE_PARENT, 0),
+};
+
+/*
+ * Clock aliases for legacy clkdev look-up.
+ * NOTE: Needed only to support legacy board files.
+ */
+static struct samsung_clock_alias s5pv210_aliases[] = {
+       ALIAS(DOUT_APLL, NULL, "armclk"),
+       ALIAS(DOUT_HCLKM, NULL, "hclk_msys"),
+       ALIAS(MOUT_DMC0, NULL, "sclk_dmc0"),
+};
+
+/* S5PV210-specific PLLs. */
+static struct samsung_pll_clock s5pv210_pll_clks[] __initdata = {
+       [apll] = PLL(pll_4508, FOUT_APLL, "fout_apll", "fin_pll",
+                                               APLL_LOCK, APLL_CON0, NULL),
+       [mpll] = PLL(pll_4502, FOUT_MPLL, "fout_mpll", "fin_pll",
+                                               MPLL_LOCK, MPLL_CON, NULL),
+       [epll] = PLL(pll_4600, FOUT_EPLL, "fout_epll", "fin_pll",
+                                               EPLL_LOCK, EPLL_CON0, NULL),
+       [vpll] = PLL(pll_4502, FOUT_VPLL, "fout_vpll", "mout_vpllsrc",
+                                               VPLL_LOCK, VPLL_CON, NULL),
+};
+
+/* S5P6442-specific PLLs. */
+static struct samsung_pll_clock s5p6442_pll_clks[] __initdata = {
+       [apll] = PLL(pll_4502, FOUT_APLL, "fout_apll", "fin_pll",
+                                               APLL_LOCK, APLL_CON0, NULL),
+       [mpll] = PLL(pll_4502, FOUT_MPLL, "fout_mpll", "fin_pll",
+                                               MPLL_LOCK, MPLL_CON, NULL),
+       [epll] = PLL(pll_4500, FOUT_EPLL, "fout_epll", "fin_pll",
+                                               EPLL_LOCK, EPLL_CON0, NULL),
+       [vpll] = PLL(pll_4500, FOUT_VPLL, "fout_vpll", "fin_pll",
+                                               VPLL_LOCK, VPLL_CON, NULL),
+};
+
+static void __init __s5pv210_clk_init(struct device_node *np,
+                                     unsigned long xxti_f,
+                                     unsigned long xusbxti_f,
+                                     bool is_s5p6442)
+{
+       struct samsung_clk_provider *ctx;
+
+       ctx = samsung_clk_init(np, reg_base, NR_CLKS);
+       if (!ctx)
+               panic("%s: unable to allocate context.\n", __func__);
+
+       samsung_clk_register_mux(ctx, early_mux_clks,
+                                       ARRAY_SIZE(early_mux_clks));
+
+       if (is_s5p6442) {
+               samsung_clk_register_fixed_rate(ctx, s5p6442_frate_clks,
+                       ARRAY_SIZE(s5p6442_frate_clks));
+               samsung_clk_register_pll(ctx, s5p6442_pll_clks,
+                       ARRAY_SIZE(s5p6442_pll_clks), reg_base);
+               samsung_clk_register_mux(ctx, s5p6442_mux_clks,
+                               ARRAY_SIZE(s5p6442_mux_clks));
+               samsung_clk_register_div(ctx, s5p6442_div_clks,
+                               ARRAY_SIZE(s5p6442_div_clks));
+               samsung_clk_register_gate(ctx, s5p6442_gate_clks,
+                               ARRAY_SIZE(s5p6442_gate_clks));
+       } else {
+               samsung_clk_register_fixed_rate(ctx, s5pv210_frate_clks,
+                       ARRAY_SIZE(s5pv210_frate_clks));
+               samsung_clk_register_pll(ctx, s5pv210_pll_clks,
+                       ARRAY_SIZE(s5pv210_pll_clks), reg_base);
+               samsung_clk_register_mux(ctx, s5pv210_mux_clks,
+                               ARRAY_SIZE(s5pv210_mux_clks));
+               samsung_clk_register_div(ctx, s5pv210_div_clks,
+                               ARRAY_SIZE(s5pv210_div_clks));
+               samsung_clk_register_gate(ctx, s5pv210_gate_clks,
+                               ARRAY_SIZE(s5pv210_gate_clks));
+       }
+
+       samsung_clk_register_mux(ctx, mux_clks, ARRAY_SIZE(mux_clks));
+       samsung_clk_register_div(ctx, div_clks, ARRAY_SIZE(div_clks));
+       samsung_clk_register_gate(ctx, gate_clks, ARRAY_SIZE(gate_clks));
+
+       samsung_clk_register_fixed_factor(ctx, ffactor_clks,
+                                               ARRAY_SIZE(ffactor_clks));
+
+       samsung_clk_register_alias(ctx, s5pv210_aliases,
+                                               ARRAY_SIZE(s5pv210_aliases));
+
+       s5pv210_clk_sleep_init();
+
+       pr_info("%s clocks: mout_apll = %ld, mout_mpll = %ld\n"
+               "\tmout_epll = %ld, mout_vpll = %ld\n",
+               is_s5p6442 ? "S5P6442" : "S5PV210",
+               _get_rate("mout_apll"), _get_rate("mout_mpll"),
+               _get_rate("mout_epll"), _get_rate("mout_vpll"));
+}
+
+static void __init s5pv210_clk_dt_init(struct device_node *np)
+{
+       reg_base = of_iomap(np, 0);
+       if (!reg_base)
+               panic("%s: failed to map registers\n", __func__);
+
+       __s5pv210_clk_init(np, 0, 0, false);
+}
+CLK_OF_DECLARE(s5pv210_clk, "samsung,s5pv210-clock", s5pv210_clk_dt_init);
+
+static void __init s5p6442_clk_dt_init(struct device_node *np)
+{
+       reg_base = of_iomap(np, 0);
+       if (!reg_base)
+               panic("%s: failed to map registers\n", __func__);
+
+       __s5pv210_clk_init(np, 0, 0, true);
+}
+CLK_OF_DECLARE(s5p6442_clk, "samsung,s5p6442-clock", s5p6442_clk_dt_init);
index 507015314827b079577dd85e1bd8e8faab54d628..0aa8830ae7cc76c5fd1335ce8149a981ec0612d8 100644 (file)
@@ -20,7 +20,8 @@
 #include <linux/io.h>
 #include <linux/delay.h>
 #include <linux/err.h>
-#include <linux/tegra-soc.h>
+
+#include <soc/tegra/fuse.h>
 
 #include "clk.h"
 
index 8b10c38b6e3c677a19be8253ca11629a3a145445..5bbacd01094f3770fcd3161e733070ea3412b97c 100644 (file)
 #include <linux/of.h>
 #include <linux/of_address.h>
 #include <linux/clk/tegra.h>
-#include <linux/tegra-powergate.h>
+
+#include <soc/tegra/pmc.h>
+
 #include <dt-bindings/clock/tegra30-car.h>
+
 #include "clk.h"
 #include "clk-id.h"
 
index bf452b62beb85dcd4493d41cee7841acbc802b43..f87c609e8f727149c5402e55508815801f9e186c 100644 (file)
@@ -19,7 +19,8 @@
 #include <linux/of.h>
 #include <linux/clk/tegra.h>
 #include <linux/reset-controller.h>
-#include <linux/tegra-soc.h>
+
+#include <soc/tegra/fuse.h>
 
 #include "clk.h"
 
index fd449f9b006dc96b9747f354827e8f5c9541bdcb..162e519cb0f98aa664fd3363300ddeda68be35ef 100644 (file)
@@ -1,6 +1,5 @@
 # Makefile for Versatile-specific clocks
-obj-$(CONFIG_ICST)             += clk-icst.o
-obj-$(CONFIG_ARCH_INTEGRATOR)  += clk-integrator.o
+obj-$(CONFIG_ICST)             += clk-icst.o clk-versatile.o
 obj-$(CONFIG_INTEGRATOR_IMPD1) += clk-impd1.o
 obj-$(CONFIG_ARCH_REALVIEW)    += clk-realview.o
 obj-$(CONFIG_ARCH_VEXPRESS)    += clk-vexpress.o
diff --git a/drivers/clk/versatile/clk-integrator.c b/drivers/clk/versatile/clk-integrator.c
deleted file mode 100644 (file)
index 734c4b8..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Clock driver for the ARM Integrator/AP and Integrator/CP boards
- * Copyright (C) 2012 Linus Walleij
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-#include <linux/clk-provider.h>
-#include <linux/clk.h>
-#include <linux/clkdev.h>
-#include <linux/err.h>
-#include <linux/of.h>
-#include <linux/of_address.h>
-
-#include "clk-icst.h"
-
-#define INTEGRATOR_HDR_LOCK_OFFSET     0x14
-
-/* Base offset for the core module */
-static void __iomem *cm_base;
-
-static const struct icst_params cp_auxosc_params = {
-       .vco_max        = ICST525_VCO_MAX_5V,
-       .vco_min        = ICST525_VCO_MIN,
-       .vd_min         = 8,
-       .vd_max         = 263,
-       .rd_min         = 3,
-       .rd_max         = 65,
-       .s2div          = icst525_s2div,
-       .idx2s          = icst525_idx2s,
-};
-
-static const struct clk_icst_desc __initdata cm_auxosc_desc = {
-       .params = &cp_auxosc_params,
-       .vco_offset = 0x1c,
-       .lock_offset = INTEGRATOR_HDR_LOCK_OFFSET,
-};
-
-static void __init of_integrator_cm_osc_setup(struct device_node *np)
-{
-       struct clk *clk = ERR_PTR(-EINVAL);
-       const char *clk_name = np->name;
-       const struct clk_icst_desc *desc = &cm_auxosc_desc;
-       const char *parent_name;
-
-       if (!cm_base) {
-               /* Remap the core module base if not done yet */
-               struct device_node *parent;
-
-               parent = of_get_parent(np);
-               if (!np) {
-                       pr_err("no parent on core module clock\n");
-                       return;
-               }
-               cm_base = of_iomap(parent, 0);
-               if (!cm_base) {
-                       pr_err("could not remap core module base\n");
-                       return;
-               }
-       }
-
-       parent_name = of_clk_get_parent_name(np, 0);
-       clk = icst_clk_register(NULL, desc, clk_name, parent_name, cm_base);
-       if (!IS_ERR(clk))
-               of_clk_add_provider(np, of_clk_src_simple_get, clk);
-}
-CLK_OF_DECLARE(integrator_cm_auxosc_clk,
-       "arm,integrator-cm-auxosc", of_integrator_cm_osc_setup);
diff --git a/drivers/clk/versatile/clk-versatile.c b/drivers/clk/versatile/clk-versatile.c
new file mode 100644 (file)
index 0000000..a76981e
--- /dev/null
@@ -0,0 +1,101 @@
+/*
+ * Clock driver for the ARM Integrator/AP, Integrator/CP, Versatile AB and
+ * Versatile PB boards.
+ * Copyright (C) 2012 Linus Walleij
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+#include <linux/clk-provider.h>
+#include <linux/clk.h>
+#include <linux/clkdev.h>
+#include <linux/err.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+
+#include "clk-icst.h"
+
+#define INTEGRATOR_HDR_LOCK_OFFSET     0x14
+
+#define VERSATILE_SYS_OSCCLCD_OFFSET   0x1c
+#define VERSATILE_SYS_LOCK_OFFSET      0x20
+
+/* Base offset for the core module */
+static void __iomem *cm_base;
+
+static const struct icst_params cp_auxosc_params = {
+       .vco_max        = ICST525_VCO_MAX_5V,
+       .vco_min        = ICST525_VCO_MIN,
+       .vd_min         = 8,
+       .vd_max         = 263,
+       .rd_min         = 3,
+       .rd_max         = 65,
+       .s2div          = icst525_s2div,
+       .idx2s          = icst525_idx2s,
+};
+
+static const struct clk_icst_desc __initdata cm_auxosc_desc = {
+       .params = &cp_auxosc_params,
+       .vco_offset = 0x1c,
+       .lock_offset = INTEGRATOR_HDR_LOCK_OFFSET,
+};
+
+static const struct icst_params versatile_auxosc_params = {
+       .vco_max        = ICST307_VCO_MAX,
+       .vco_min        = ICST307_VCO_MIN,
+       .vd_min         = 4 + 8,
+       .vd_max         = 511 + 8,
+       .rd_min         = 1 + 2,
+       .rd_max         = 127 + 2,
+       .s2div          = icst307_s2div,
+       .idx2s          = icst307_idx2s,
+};
+
+static const struct clk_icst_desc versatile_auxosc_desc __initconst = {
+       .params = &versatile_auxosc_params,
+       .vco_offset = VERSATILE_SYS_OSCCLCD_OFFSET,
+       .lock_offset = VERSATILE_SYS_LOCK_OFFSET,
+};
+static void __init cm_osc_setup(struct device_node *np,
+                               const struct clk_icst_desc *desc)
+{
+       struct clk *clk = ERR_PTR(-EINVAL);
+       const char *clk_name = np->name;
+       const char *parent_name;
+
+       if (!cm_base) {
+               /* Remap the core module base if not done yet */
+               struct device_node *parent;
+
+               parent = of_get_parent(np);
+               if (!np) {
+                       pr_err("no parent on core module clock\n");
+                       return;
+               }
+               cm_base = of_iomap(parent, 0);
+               if (!cm_base) {
+                       pr_err("could not remap core module base\n");
+                       return;
+               }
+       }
+
+       parent_name = of_clk_get_parent_name(np, 0);
+       clk = icst_clk_register(NULL, desc, clk_name, parent_name, cm_base);
+       if (!IS_ERR(clk))
+               of_clk_add_provider(np, of_clk_src_simple_get, clk);
+}
+
+static void __init of_integrator_cm_osc_setup(struct device_node *np)
+{
+       cm_osc_setup(np, &cm_auxosc_desc);
+}
+CLK_OF_DECLARE(integrator_cm_auxosc_clk,
+       "arm,integrator-cm-auxosc", of_integrator_cm_osc_setup);
+
+static void __init of_versatile_cm_osc_setup(struct device_node *np)
+{
+       cm_osc_setup(np, &versatile_auxosc_desc);
+}
+CLK_OF_DECLARE(versatile_cm_auxosc_clk,
+              "arm,versatile-cm-auxosc", of_versatile_cm_osc_setup);
index d1869f02051cbe9ccfa23a0dec7d235d5d0d3f02..d2616ef167701526a13efe7ef896f3cca2c8668a 100644 (file)
@@ -27,6 +27,7 @@
 #include <linux/of_address.h>
 #include <linux/of_irq.h>
 #include <linux/sched_clock.h>
+#include <linux/delay.h>
 
 #include <asm/mach/time.h>
 #include <asm/smp_twd.h>
@@ -53,6 +54,8 @@ static void __iomem *rtc_base;
 static struct timespec persistent_ts;
 static u64 persistent_ms, last_persistent_ms;
 
+static struct delay_timer tegra_delay_timer;
+
 #define timer_writel(value, reg) \
        __raw_writel(value, timer_reg_base + (reg))
 #define timer_readl(reg) \
@@ -139,6 +142,11 @@ static void tegra_read_persistent_clock(struct timespec *ts)
        *ts = *tsp;
 }
 
+static unsigned long tegra_delay_timer_read_counter_long(void)
+{
+       return readl(timer_reg_base + TIMERUS_CNTR_1US);
+}
+
 static irqreturn_t tegra_timer_interrupt(int irq, void *dev_id)
 {
        struct clock_event_device *evt = (struct clock_event_device *)dev_id;
@@ -206,6 +214,11 @@ static void __init tegra20_init_timer(struct device_node *np)
                BUG();
        }
 
+       tegra_delay_timer.read_current_timer =
+                       tegra_delay_timer_read_counter_long;
+       tegra_delay_timer.freq = 1000000;
+       register_current_timer_delay(&tegra_delay_timer);
+
        ret = setup_irq(tegra_timer_irq.irq, &tegra_timer_irq);
        if (ret) {
                pr_err("Failed to register timer IRQ: %d\n", ret);
index cfa0dd8723ec1fd34aa13d664a6485d9313aa8a4..b8e5da8e188b57eecdc13eb569143f94f3a8b4cc 100644 (file)
@@ -26,7 +26,6 @@
 #include <mach/regs-clock.h>
 
 #include <plat/cpu.h>
-#include <plat/clock.h>
 #include <plat/cpu-freq-core.h>
 
 /* Note, 2410A has an extra mode for 1:4:4 ratio, bit 2 of CLKDIV */
@@ -104,7 +103,6 @@ static struct s3c_cpufreq_info s3c2410_cpufreq_info = {
        .calc_iotiming  = s3c2410_iotiming_calc,
        .set_iotiming   = s3c2410_iotiming_set,
        .get_iotiming   = s3c2410_iotiming_get,
-       .resume_clocks  = s3c2410_setup_clocks,
 
        .set_fvco       = s3c2410_set_fvco,
        .set_refresh    = s3c2410_cpufreq_setrefresh,
index 4645b4898996bc38df1dff6a23a4f9d12176fa8c..eb262133fef25e31b261edeaf19725a34746759d 100644 (file)
@@ -28,7 +28,6 @@
 #include <mach/s3c2412.h>
 
 #include <plat/cpu.h>
-#include <plat/clock.h>
 #include <plat/cpu-freq-core.h>
 
 /* our clock resources. */
@@ -188,8 +187,6 @@ static struct s3c_cpufreq_info s3c2412_cpufreq_info = {
        .set_iotiming   = s3c2412_iotiming_set,
        .get_iotiming   = s3c2412_iotiming_get,
 
-       .resume_clocks  = s3c2412_setup_clocks,
-
        .debug_io_show  = s3c_cpufreq_debugfs_call(s3c2412_iotiming_debugfs),
 };
 
index f84ed10755b57b7af8cfaa8acb5c212afac7c156..0129f5c70a610b941e14bc5f8912681b0f7bc3f7 100644 (file)
@@ -29,7 +29,6 @@
 
 #include <plat/cpu.h>
 #include <plat/cpu-freq-core.h>
-#include <plat/clock.h>
 
 static struct clk *xtal;
 static struct clk *fclk;
@@ -262,8 +261,6 @@ static struct s3c_cpufreq_info s3c2440_cpufreq_info = {
        .calc_divs      = s3c2440_cpufreq_calcdivs,
        .calc_freqtable = s3c2440_cpufreq_calctable,
 
-       .resume_clocks  = s3c244x_setup_clocks,
-
        .debug_io_show  = s3c_cpufreq_debugfs_call(s3c2410_iotiming_debugfs),
 };
 
index 227ebf7c1eeab087b6e799a2e6e779d3439cd52f..d00f1cee45094a6c01e004934de6e2928d4e9222 100644 (file)
@@ -27,7 +27,6 @@
 #include <asm/mach/map.h>
 
 #include <plat/cpu.h>
-#include <plat/clock.h>
 #include <plat/cpu-freq-core.h>
 
 #include <mach/regs-clock.h>
index 19a10b89fef7af44a86df0699a7c90490346e5e7..9a68225a757e44edd2554f9672197ee64363a5ad 100644 (file)
 #include <linux/clk.h>
 #include <linux/io.h>
 #include <linux/cpufreq.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/platform_device.h>
 #include <linux/reboot.h>
 #include <linux/regulator/consumer.h>
 
-#include <mach/map.h>
-#include <mach/regs-clock.h>
+static void __iomem *clk_base;
+static void __iomem *dmc_base[2];
+
+#define S5P_CLKREG(x)          (clk_base + (x))
+
+#define S5P_APLL_LOCK          S5P_CLKREG(0x00)
+#define S5P_APLL_CON           S5P_CLKREG(0x100)
+#define S5P_CLK_SRC0           S5P_CLKREG(0x200)
+#define S5P_CLK_SRC2           S5P_CLKREG(0x208)
+#define S5P_CLK_DIV0           S5P_CLKREG(0x300)
+#define S5P_CLK_DIV2           S5P_CLKREG(0x308)
+#define S5P_CLK_DIV6           S5P_CLKREG(0x318)
+#define S5P_CLKDIV_STAT0       S5P_CLKREG(0x1000)
+#define S5P_CLKDIV_STAT1       S5P_CLKREG(0x1004)
+#define S5P_CLKMUX_STAT0       S5P_CLKREG(0x1100)
+#define S5P_CLKMUX_STAT1       S5P_CLKREG(0x1104)
+
+#define S5P_ARM_MCS_CON                S5P_CLKREG(0x6100)
+
+/* CLKSRC0 */
+#define S5P_CLKSRC0_MUX200_SHIFT       (16)
+#define S5P_CLKSRC0_MUX200_MASK                (0x1 << S5P_CLKSRC0_MUX200_SHIFT)
+#define S5P_CLKSRC0_MUX166_MASK                (0x1<<20)
+#define S5P_CLKSRC0_MUX133_MASK                (0x1<<24)
+
+/* CLKSRC2 */
+#define S5P_CLKSRC2_G3D_SHIFT           (0)
+#define S5P_CLKSRC2_G3D_MASK            (0x3 << S5P_CLKSRC2_G3D_SHIFT)
+#define S5P_CLKSRC2_MFC_SHIFT           (4)
+#define S5P_CLKSRC2_MFC_MASK            (0x3 << S5P_CLKSRC2_MFC_SHIFT)
+
+/* CLKDIV0 */
+#define S5P_CLKDIV0_APLL_SHIFT         (0)
+#define S5P_CLKDIV0_APLL_MASK          (0x7 << S5P_CLKDIV0_APLL_SHIFT)
+#define S5P_CLKDIV0_A2M_SHIFT          (4)
+#define S5P_CLKDIV0_A2M_MASK           (0x7 << S5P_CLKDIV0_A2M_SHIFT)
+#define S5P_CLKDIV0_HCLK200_SHIFT      (8)
+#define S5P_CLKDIV0_HCLK200_MASK       (0x7 << S5P_CLKDIV0_HCLK200_SHIFT)
+#define S5P_CLKDIV0_PCLK100_SHIFT      (12)
+#define S5P_CLKDIV0_PCLK100_MASK       (0x7 << S5P_CLKDIV0_PCLK100_SHIFT)
+#define S5P_CLKDIV0_HCLK166_SHIFT      (16)
+#define S5P_CLKDIV0_HCLK166_MASK       (0xF << S5P_CLKDIV0_HCLK166_SHIFT)
+#define S5P_CLKDIV0_PCLK83_SHIFT       (20)
+#define S5P_CLKDIV0_PCLK83_MASK                (0x7 << S5P_CLKDIV0_PCLK83_SHIFT)
+#define S5P_CLKDIV0_HCLK133_SHIFT      (24)
+#define S5P_CLKDIV0_HCLK133_MASK       (0xF << S5P_CLKDIV0_HCLK133_SHIFT)
+#define S5P_CLKDIV0_PCLK66_SHIFT       (28)
+#define S5P_CLKDIV0_PCLK66_MASK                (0x7 << S5P_CLKDIV0_PCLK66_SHIFT)
+
+/* CLKDIV2 */
+#define S5P_CLKDIV2_G3D_SHIFT           (0)
+#define S5P_CLKDIV2_G3D_MASK            (0xF << S5P_CLKDIV2_G3D_SHIFT)
+#define S5P_CLKDIV2_MFC_SHIFT           (4)
+#define S5P_CLKDIV2_MFC_MASK            (0xF << S5P_CLKDIV2_MFC_SHIFT)
+
+/* CLKDIV6 */
+#define S5P_CLKDIV6_ONEDRAM_SHIFT       (28)
+#define S5P_CLKDIV6_ONEDRAM_MASK        (0xF << S5P_CLKDIV6_ONEDRAM_SHIFT)
 
 static struct clk *dmc0_clk;
 static struct clk *dmc1_clk;
@@ -142,9 +201,9 @@ static void s5pv210_set_refresh(enum s5pv210_dmc_port ch, unsigned long freq)
        void __iomem *reg = NULL;
 
        if (ch == DMC0) {
-               reg = (S5P_VA_DMC0 + 0x30);
+               reg = (dmc_base[0] + 0x30);
        } else if (ch == DMC1) {
-               reg = (S5P_VA_DMC1 + 0x30);
+               reg = (dmc_base[1] + 0x30);
        } else {
                printk(KERN_ERR "Cannot find DMC port\n");
                return;
@@ -472,7 +531,7 @@ static int __init s5pv210_cpu_init(struct cpufreq_policy *policy)
         * check_mem_type : This driver only support LPDDR & LPDDR2.
         * other memory type is not supported.
         */
-       mem_type = check_mem_type(S5P_VA_DMC0);
+       mem_type = check_mem_type(dmc_base[0]);
 
        if ((mem_type != LPDDR) && (mem_type != LPDDR2)) {
                printk(KERN_ERR "CPUFreq doesn't support this memory type\n");
@@ -481,10 +540,10 @@ static int __init s5pv210_cpu_init(struct cpufreq_policy *policy)
        }
 
        /* Find current refresh counter and frequency each DMC */
-       s5pv210_dram_conf[0].refresh = (__raw_readl(S5P_VA_DMC0 + 0x30) * 1000);
+       s5pv210_dram_conf[0].refresh = (__raw_readl(dmc_base[0] + 0x30) * 1000);
        s5pv210_dram_conf[0].freq = clk_get_rate(dmc0_clk);
 
-       s5pv210_dram_conf[1].refresh = (__raw_readl(S5P_VA_DMC1 + 0x30) * 1000);
+       s5pv210_dram_conf[1].refresh = (__raw_readl(dmc_base[1] + 0x30) * 1000);
        s5pv210_dram_conf[1].freq = clk_get_rate(dmc1_clk);
 
        policy->suspend_freq = SLEEP_FREQ;
@@ -527,8 +586,55 @@ static struct notifier_block s5pv210_cpufreq_reboot_notifier = {
        .notifier_call = s5pv210_cpufreq_reboot_notifier_event,
 };
 
-static int __init s5pv210_cpufreq_init(void)
+static int s5pv210_cpufreq_probe(struct platform_device *pdev)
 {
+       struct device_node *np;
+       int id;
+
+       /*
+        * HACK: This is a temporary workaround to get access to clock
+        * and DMC controller registers directly and remove static mappings
+        * and dependencies on platform headers. It is necessary to enable
+        * S5PV210 multi-platform support and will be removed together with
+        * this whole driver as soon as S5PV210 gets migrated to use
+        * cpufreq-cpu0 driver.
+        */
+       np = of_find_compatible_node(NULL, NULL, "samsung,s5pv210-clock");
+       if (!np) {
+               pr_err("%s: failed to find clock controller DT node\n",
+                       __func__);
+               return -ENODEV;
+       }
+
+       clk_base = of_iomap(np, 0);
+       if (!clk_base) {
+               pr_err("%s: failed to map clock registers\n", __func__);
+               return -EFAULT;
+       }
+
+       for_each_compatible_node(np, NULL, "samsung,s5pv210-dmc") {
+               id = of_alias_get_id(np, "dmc");
+               if (id < 0 || id >= ARRAY_SIZE(dmc_base)) {
+                       pr_err("%s: failed to get alias of dmc node '%s'\n",
+                               __func__, np->name);
+                       return id;
+               }
+
+               dmc_base[id] = of_iomap(np, 0);
+               if (!dmc_base[id]) {
+                       pr_err("%s: failed to map dmc%d registers\n",
+                               __func__, id);
+                       return -EFAULT;
+               }
+       }
+
+       for (id = 0; id < ARRAY_SIZE(dmc_base); ++id) {
+               if (!dmc_base[id]) {
+                       pr_err("%s: failed to find dmc%d node\n", __func__, id);
+                       return -ENODEV;
+               }
+       }
+
        arm_regulator = regulator_get(NULL, "vddarm");
        if (IS_ERR(arm_regulator)) {
                pr_err("failed to get regulator vddarm");
@@ -547,4 +653,11 @@ static int __init s5pv210_cpufreq_init(void)
        return cpufreq_register_driver(&s5pv210_driver);
 }
 
-late_initcall(s5pv210_cpufreq_init);
+static struct platform_driver s5pv210_cpufreq_platdrv = {
+       .driver = {
+               .name   = "s5pv210-cpufreq",
+               .owner  = THIS_MODULE,
+       },
+       .probe = s5pv210_cpufreq_probe,
+};
+module_platform_driver(s5pv210_cpufreq_platdrv);
index a186dec8e5df5ec1b0b7d935fbea3f65d180a1e3..38cff69ffe06bfeace68468f9f9cdca88a0dbaf5 100644 (file)
@@ -1,15 +1,9 @@
 #
 # ARM CPU Idle drivers
 #
-config ARM_ARMADA_370_XP_CPUIDLE
-       bool "CPU Idle Driver for Armada 370/XP family processors"
-       depends on ARCH_MVEBU
-       help
-         Select this to enable cpuidle on Armada 370/XP processors.
-
 config ARM_BIG_LITTLE_CPUIDLE
        bool "Support for ARM big.LITTLE processors"
-       depends on ARCH_VEXPRESS_TC2_PM
+       depends on ARCH_VEXPRESS_TC2_PM || ARCH_EXYNOS
        depends on MCPM
        select ARM_CPU_SUSPEND
        select CPU_IDLE_MULTIPLE_DRIVERS
@@ -62,3 +56,9 @@ config ARM_EXYNOS_CPUIDLE
        depends on ARCH_EXYNOS
        help
          Select this to enable cpuidle for Exynos processors
+
+config ARM_MVEBU_V7_CPUIDLE
+       bool "CPU Idle Driver for mvebu v7 family processors"
+       depends on ARCH_MVEBU
+       help
+         Select this to enable cpuidle on Armada 370, 38x and XP processors.
index d8bb1ff72561ace55a9832e314b28450a625a25b..11edb31c55e9862aa2e21e0df073f2d7dd49b721 100644 (file)
@@ -7,7 +7,7 @@ obj-$(CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED) += coupled.o
 
 ##################################################################################
 # ARM SoC drivers
-obj-$(CONFIG_ARM_ARMADA_370_XP_CPUIDLE) += cpuidle-armada-370-xp.o
+obj-$(CONFIG_ARM_MVEBU_V7_CPUIDLE) += cpuidle-mvebu-v7.o
 obj-$(CONFIG_ARM_BIG_LITTLE_CPUIDLE)   += cpuidle-big_little.o
 obj-$(CONFIG_ARM_CLPS711X_CPUIDLE)     += cpuidle-clps711x.o
 obj-$(CONFIG_ARM_HIGHBANK_CPUIDLE)     += cpuidle-calxeda.o
diff --git a/drivers/cpuidle/cpuidle-armada-370-xp.c b/drivers/cpuidle/cpuidle-armada-370-xp.c
deleted file mode 100644 (file)
index a5fba02..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Marvell Armada 370 and Armada XP SoC cpuidle driver
- *
- * Copyright (C) 2014 Marvell
- *
- * Nadav Haklai <nadavh@marvell.com>
- * Gregory CLEMENT <gregory.clement@free-electrons.com>
- *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
- *
- * Maintainer: Gregory CLEMENT <gregory.clement@free-electrons.com>
- */
-
-#include <linux/cpu_pm.h>
-#include <linux/cpuidle.h>
-#include <linux/module.h>
-#include <linux/of.h>
-#include <linux/suspend.h>
-#include <linux/platform_device.h>
-#include <asm/cpuidle.h>
-
-#define ARMADA_370_XP_MAX_STATES       3
-#define ARMADA_370_XP_FLAG_DEEP_IDLE   0x10000
-
-static int (*armada_370_xp_cpu_suspend)(int);
-
-static int armada_370_xp_enter_idle(struct cpuidle_device *dev,
-                               struct cpuidle_driver *drv,
-                               int index)
-{
-       int ret;
-       bool deepidle = false;
-       cpu_pm_enter();
-
-       if (drv->states[index].flags & ARMADA_370_XP_FLAG_DEEP_IDLE)
-               deepidle = true;
-
-       ret = armada_370_xp_cpu_suspend(deepidle);
-       if (ret)
-               return ret;
-
-       cpu_pm_exit();
-
-       return index;
-}
-
-static struct cpuidle_driver armada_370_xp_idle_driver = {
-       .name                   = "armada_370_xp_idle",
-       .states[0]              = ARM_CPUIDLE_WFI_STATE,
-       .states[1]              = {
-               .enter                  = armada_370_xp_enter_idle,
-               .exit_latency           = 10,
-               .power_usage            = 50,
-               .target_residency       = 100,
-               .flags                  = CPUIDLE_FLAG_TIME_VALID,
-               .name                   = "Idle",
-               .desc                   = "CPU power down",
-       },
-       .states[2]              = {
-               .enter                  = armada_370_xp_enter_idle,
-               .exit_latency           = 100,
-               .power_usage            = 5,
-               .target_residency       = 1000,
-               .flags                  = CPUIDLE_FLAG_TIME_VALID |
-                                               ARMADA_370_XP_FLAG_DEEP_IDLE,
-               .name                   = "Deep idle",
-               .desc                   = "CPU and L2 Fabric power down",
-       },
-       .state_count = ARMADA_370_XP_MAX_STATES,
-};
-
-static int armada_370_xp_cpuidle_probe(struct platform_device *pdev)
-{
-
-       armada_370_xp_cpu_suspend = (void *)(pdev->dev.platform_data);
-       return cpuidle_register(&armada_370_xp_idle_driver, NULL);
-}
-
-static struct platform_driver armada_370_xp_cpuidle_plat_driver = {
-       .driver = {
-               .name = "cpuidle-armada-370-xp",
-               .owner = THIS_MODULE,
-       },
-       .probe = armada_370_xp_cpuidle_probe,
-};
-
-module_platform_driver(armada_370_xp_cpuidle_plat_driver);
-
-MODULE_AUTHOR("Gregory CLEMENT <gregory.clement@free-electrons.com>");
-MODULE_DESCRIPTION("Armada 370/XP cpu idle driver");
-MODULE_LICENSE("GPL");
index b45fc6249041b124b0600c1b4c5fc597d98389a9..344d79fa34078166694d1301b4c93e939a94e76b 100644 (file)
@@ -163,14 +163,24 @@ static int __init bl_idle_driver_init(struct cpuidle_driver *drv, int cpu_id)
        return 0;
 }
 
+static const struct of_device_id compatible_machine_match[] = {
+       { .compatible = "arm,vexpress,v2p-ca15_a7" },
+       { .compatible = "samsung,exynos5420" },
+       {},
+};
+
 static int __init bl_idle_init(void)
 {
        int ret;
+       struct device_node *root = of_find_node_by_path("/");
+
+       if (!root)
+               return -ENODEV;
 
        /*
         * Initialize the driver just for a compliant set of machines
         */
-       if (!of_machine_is_compatible("arm,vexpress,v2p-ca15_a7"))
+       if (!of_match_node(compatible_machine_match, root))
                return -ENODEV;
        /*
         * For now the differentiation between little and big cores
diff --git a/drivers/cpuidle/cpuidle-mvebu-v7.c b/drivers/cpuidle/cpuidle-mvebu-v7.c
new file mode 100644 (file)
index 0000000..45371bb
--- /dev/null
@@ -0,0 +1,150 @@
+/*
+ * Marvell Armada 370, 38x and XP SoC cpuidle driver
+ *
+ * Copyright (C) 2014 Marvell
+ *
+ * Nadav Haklai <nadavh@marvell.com>
+ * Gregory CLEMENT <gregory.clement@free-electrons.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2.  This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ *
+ * Maintainer: Gregory CLEMENT <gregory.clement@free-electrons.com>
+ */
+
+#include <linux/cpu_pm.h>
+#include <linux/cpuidle.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/suspend.h>
+#include <linux/platform_device.h>
+#include <asm/cpuidle.h>
+
+#define MVEBU_V7_FLAG_DEEP_IDLE        0x10000
+
+static int (*mvebu_v7_cpu_suspend)(int);
+
+static int mvebu_v7_enter_idle(struct cpuidle_device *dev,
+                               struct cpuidle_driver *drv,
+                               int index)
+{
+       int ret;
+       bool deepidle = false;
+       cpu_pm_enter();
+
+       if (drv->states[index].flags & MVEBU_V7_FLAG_DEEP_IDLE)
+               deepidle = true;
+
+       ret = mvebu_v7_cpu_suspend(deepidle);
+       if (ret)
+               return ret;
+
+       cpu_pm_exit();
+
+       return index;
+}
+
+static struct cpuidle_driver armadaxp_idle_driver = {
+       .name                   = "armada_xp_idle",
+       .states[0]              = ARM_CPUIDLE_WFI_STATE,
+       .states[1]              = {
+               .enter                  = mvebu_v7_enter_idle,
+               .exit_latency           = 10,
+               .power_usage            = 50,
+               .target_residency       = 100,
+               .flags                  = CPUIDLE_FLAG_TIME_VALID,
+               .name                   = "MV CPU IDLE",
+               .desc                   = "CPU power down",
+       },
+       .states[2]              = {
+               .enter                  = mvebu_v7_enter_idle,
+               .exit_latency           = 100,
+               .power_usage            = 5,
+               .target_residency       = 1000,
+               .flags                  = CPUIDLE_FLAG_TIME_VALID |
+                                               MVEBU_V7_FLAG_DEEP_IDLE,
+               .name                   = "MV CPU DEEP IDLE",
+               .desc                   = "CPU and L2 Fabric power down",
+       },
+       .state_count = 3,
+};
+
+static struct cpuidle_driver armada370_idle_driver = {
+       .name                   = "armada_370_idle",
+       .states[0]              = ARM_CPUIDLE_WFI_STATE,
+       .states[1]              = {
+               .enter                  = mvebu_v7_enter_idle,
+               .exit_latency           = 100,
+               .power_usage            = 5,
+               .target_residency       = 1000,
+               .flags                  = (CPUIDLE_FLAG_TIME_VALID |
+                                          MVEBU_V7_FLAG_DEEP_IDLE),
+               .name                   = "Deep Idle",
+               .desc                   = "CPU and L2 Fabric power down",
+       },
+       .state_count = 2,
+};
+
+static struct cpuidle_driver armada38x_idle_driver = {
+       .name                   = "armada_38x_idle",
+       .states[0]              = ARM_CPUIDLE_WFI_STATE,
+       .states[1]              = {
+               .enter                  = mvebu_v7_enter_idle,
+               .exit_latency           = 10,
+               .power_usage            = 5,
+               .target_residency       = 100,
+               .flags                  = CPUIDLE_FLAG_TIME_VALID,
+               .name                   = "Idle",
+               .desc                   = "CPU and SCU power down",
+       },
+       .state_count = 2,
+};
+
+static int mvebu_v7_cpuidle_probe(struct platform_device *pdev)
+{
+       mvebu_v7_cpu_suspend = pdev->dev.platform_data;
+
+       if (!strcmp(pdev->dev.driver->name, "cpuidle-armada-xp"))
+               return cpuidle_register(&armadaxp_idle_driver, NULL);
+       else if (!strcmp(pdev->dev.driver->name, "cpuidle-armada-370"))
+               return cpuidle_register(&armada370_idle_driver, NULL);
+       else if (!strcmp(pdev->dev.driver->name, "cpuidle-armada-38x"))
+               return cpuidle_register(&armada38x_idle_driver, NULL);
+       else
+               return -EINVAL;
+}
+
+static struct platform_driver armadaxp_cpuidle_plat_driver = {
+       .driver = {
+               .name = "cpuidle-armada-xp",
+               .owner = THIS_MODULE,
+       },
+       .probe = mvebu_v7_cpuidle_probe,
+};
+
+module_platform_driver(armadaxp_cpuidle_plat_driver);
+
+static struct platform_driver armada370_cpuidle_plat_driver = {
+       .driver = {
+               .name = "cpuidle-armada-370",
+               .owner = THIS_MODULE,
+       },
+       .probe = mvebu_v7_cpuidle_probe,
+};
+
+module_platform_driver(armada370_cpuidle_plat_driver);
+
+static struct platform_driver armada38x_cpuidle_plat_driver = {
+       .driver = {
+               .name = "cpuidle-armada-38x",
+               .owner = THIS_MODULE,
+       },
+       .probe = mvebu_v7_cpuidle_probe,
+};
+
+module_platform_driver(armada38x_cpuidle_plat_driver);
+
+MODULE_AUTHOR("Gregory CLEMENT <gregory.clement@free-electrons.com>");
+MODULE_DESCRIPTION("Marvell EBU v7 cpuidle driver");
+MODULE_LICENSE("GPL");
index 4a1b5113e52778f895e2c31130b838da55fb7beb..4a065b45330f01d4e77f0734d5b4d7ae089772fb 100644 (file)
@@ -450,6 +450,19 @@ config GPIO_ARIZONA
        help
          Support for GPIOs on Wolfson Arizona class devices.
 
+config GPIO_CRYSTAL_COVE
+       tristate "GPIO support for Crystal Cove PMIC"
+       depends on INTEL_SOC_PMIC
+       select GPIOLIB_IRQCHIP
+       help
+         Support for GPIO pins on Crystal Cove PMIC.
+
+         Say Yes if you have a Intel SoC based tablet with Crystal Cove PMIC
+         inside.
+
+         This driver can also be built as a module. If so, the module will be
+         called gpio-crystalcove.
+
 config GPIO_LP3943
        tristate "TI/National Semiconductor LP3943 GPIO expander"
        depends on MFD_LP3943
index d10f6a9d875a2b626bc5a94a8d4bb83efef61a9f..e18e9564b073c86246140a9b84ed8f8993f6042d 100644 (file)
@@ -20,6 +20,7 @@ obj-$(CONFIG_GPIO_BCM_KONA)   += gpio-bcm-kona.o
 obj-$(CONFIG_GPIO_BT8XX)       += gpio-bt8xx.o
 obj-$(CONFIG_GPIO_CLPS711X)    += gpio-clps711x.o
 obj-$(CONFIG_GPIO_CS5535)      += gpio-cs5535.o
+obj-$(CONFIG_GPIO_CRYSTAL_COVE)        += gpio-crystalcove.o
 obj-$(CONFIG_GPIO_DA9052)      += gpio-da9052.o
 obj-$(CONFIG_GPIO_DA9055)      += gpio-da9055.o
 obj-$(CONFIG_GPIO_DAVINCI)     += gpio-davinci.o
diff --git a/drivers/gpio/gpio-crystalcove.c b/drivers/gpio/gpio-crystalcove.c
new file mode 100644 (file)
index 0000000..934462f
--- /dev/null
@@ -0,0 +1,380 @@
+/*
+ * gpio-crystalcove.c - Intel Crystal Cove GPIO Driver
+ *
+ * Copyright (C) 2012, 2014 Intel Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version
+ * 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * Author: Yang, Bin <bin.yang@intel.com>
+ */
+
+#include <linux/interrupt.h>
+#include <linux/platform_device.h>
+#include <linux/gpio.h>
+#include <linux/seq_file.h>
+#include <linux/bitops.h>
+#include <linux/regmap.h>
+#include <linux/mfd/intel_soc_pmic.h>
+
+#define CRYSTALCOVE_GPIO_NUM   16
+
+#define UPDATE_IRQ_TYPE                BIT(0)
+#define UPDATE_IRQ_MASK                BIT(1)
+
+#define GPIO0IRQ               0x0b
+#define GPIO1IRQ               0x0c
+#define MGPIO0IRQS0            0x19
+#define MGPIO1IRQS0            0x1a
+#define MGPIO0IRQSX            0x1b
+#define MGPIO1IRQSX            0x1c
+#define GPIO0P0CTLO            0x2b
+#define GPIO0P0CTLI            0x33
+#define GPIO1P0CTLO            0x3b
+#define GPIO1P0CTLI            0x43
+
+#define CTLI_INTCNT_DIS                (0)
+#define CTLI_INTCNT_NE         (1 << 1)
+#define CTLI_INTCNT_PE         (2 << 1)
+#define CTLI_INTCNT_BE         (3 << 1)
+
+#define CTLO_DIR_IN            (0)
+#define CTLO_DIR_OUT           (1 << 5)
+
+#define CTLO_DRV_CMOS          (0)
+#define CTLO_DRV_OD            (1 << 4)
+
+#define CTLO_DRV_REN           (1 << 3)
+
+#define CTLO_RVAL_2KDW         (0)
+#define CTLO_RVAL_2KUP         (1 << 1)
+#define CTLO_RVAL_50KDW                (2 << 1)
+#define CTLO_RVAL_50KUP                (3 << 1)
+
+#define CTLO_INPUT_SET (CTLO_DRV_CMOS | CTLO_DRV_REN | CTLO_RVAL_2KUP)
+#define CTLO_OUTPUT_SET        (CTLO_DIR_OUT | CTLO_INPUT_SET)
+
+enum ctrl_register {
+       CTRL_IN,
+       CTRL_OUT,
+};
+
+/**
+ * struct crystalcove_gpio - Crystal Cove GPIO controller
+ * @buslock: for bus lock/sync and unlock.
+ * @chip: the abstract gpio_chip structure.
+ * @regmap: the regmap from the parent device.
+ * @update: pending IRQ setting update, to be written to the chip upon unlock.
+ * @intcnt_value: the Interrupt Detect value to be written.
+ * @set_irq_mask: true if the IRQ mask needs to be set, false to clear.
+ */
+struct crystalcove_gpio {
+       struct mutex buslock; /* irq_bus_lock */
+       struct gpio_chip chip;
+       struct regmap *regmap;
+       int update;
+       int intcnt_value;
+       bool set_irq_mask;
+};
+
+static inline struct crystalcove_gpio *to_cg(struct gpio_chip *gc)
+{
+       return container_of(gc, struct crystalcove_gpio, chip);
+}
+
+static inline int to_reg(int gpio, enum ctrl_register reg_type)
+{
+       int reg;
+
+       if (reg_type == CTRL_IN) {
+               if (gpio < 8)
+                       reg = GPIO0P0CTLI;
+               else
+                       reg = GPIO1P0CTLI;
+       } else {
+               if (gpio < 8)
+                       reg = GPIO0P0CTLO;
+               else
+                       reg = GPIO1P0CTLO;
+       }
+
+       return reg + gpio % 8;
+}
+
+static void crystalcove_update_irq_mask(struct crystalcove_gpio *cg,
+                                       int gpio)
+{
+       u8 mirqs0 = gpio < 8 ? MGPIO0IRQS0 : MGPIO1IRQS0;
+       int mask = BIT(gpio % 8);
+
+       if (cg->set_irq_mask)
+               regmap_update_bits(cg->regmap, mirqs0, mask, mask);
+       else
+               regmap_update_bits(cg->regmap, mirqs0, mask, 0);
+}
+
+static void crystalcove_update_irq_ctrl(struct crystalcove_gpio *cg, int gpio)
+{
+       int reg = to_reg(gpio, CTRL_IN);
+
+       regmap_update_bits(cg->regmap, reg, CTLI_INTCNT_BE, cg->intcnt_value);
+}
+
+static int crystalcove_gpio_dir_in(struct gpio_chip *chip, unsigned gpio)
+{
+       struct crystalcove_gpio *cg = to_cg(chip);
+
+       return regmap_write(cg->regmap, to_reg(gpio, CTRL_OUT),
+                           CTLO_INPUT_SET);
+}
+
+static int crystalcove_gpio_dir_out(struct gpio_chip *chip, unsigned gpio,
+                                   int value)
+{
+       struct crystalcove_gpio *cg = to_cg(chip);
+
+       return regmap_write(cg->regmap, to_reg(gpio, CTRL_OUT),
+                           CTLO_OUTPUT_SET | value);
+}
+
+static int crystalcove_gpio_get(struct gpio_chip *chip, unsigned gpio)
+{
+       struct crystalcove_gpio *cg = to_cg(chip);
+       int ret;
+       unsigned int val;
+
+       ret = regmap_read(cg->regmap, to_reg(gpio, CTRL_IN), &val);
+       if (ret)
+               return ret;
+
+       return val & 0x1;
+}
+
+static void crystalcove_gpio_set(struct gpio_chip *chip,
+                                unsigned gpio, int value)
+{
+       struct crystalcove_gpio *cg = to_cg(chip);
+
+       if (value)
+               regmap_update_bits(cg->regmap, to_reg(gpio, CTRL_OUT), 1, 1);
+       else
+               regmap_update_bits(cg->regmap, to_reg(gpio, CTRL_OUT), 1, 0);
+}
+
+static int crystalcove_irq_type(struct irq_data *data, unsigned type)
+{
+       struct crystalcove_gpio *cg = to_cg(irq_data_get_irq_chip_data(data));
+
+       switch (type) {
+       case IRQ_TYPE_NONE:
+               cg->intcnt_value = CTLI_INTCNT_DIS;
+               break;
+       case IRQ_TYPE_EDGE_BOTH:
+               cg->intcnt_value = CTLI_INTCNT_BE;
+               break;
+       case IRQ_TYPE_EDGE_RISING:
+               cg->intcnt_value = CTLI_INTCNT_PE;
+               break;
+       case IRQ_TYPE_EDGE_FALLING:
+               cg->intcnt_value = CTLI_INTCNT_NE;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       cg->update |= UPDATE_IRQ_TYPE;
+
+       return 0;
+}
+
+static void crystalcove_bus_lock(struct irq_data *data)
+{
+       struct crystalcove_gpio *cg = to_cg(irq_data_get_irq_chip_data(data));
+
+       mutex_lock(&cg->buslock);
+}
+
+static void crystalcove_bus_sync_unlock(struct irq_data *data)
+{
+       struct crystalcove_gpio *cg = to_cg(irq_data_get_irq_chip_data(data));
+       int gpio = data->hwirq;
+
+       if (cg->update & UPDATE_IRQ_TYPE)
+               crystalcove_update_irq_ctrl(cg, gpio);
+       if (cg->update & UPDATE_IRQ_MASK)
+               crystalcove_update_irq_mask(cg, gpio);
+       cg->update = 0;
+
+       mutex_unlock(&cg->buslock);
+}
+
+static void crystalcove_irq_unmask(struct irq_data *data)
+{
+       struct crystalcove_gpio *cg = to_cg(irq_data_get_irq_chip_data(data));
+
+       cg->set_irq_mask = false;
+       cg->update |= UPDATE_IRQ_MASK;
+}
+
+static void crystalcove_irq_mask(struct irq_data *data)
+{
+       struct crystalcove_gpio *cg = to_cg(irq_data_get_irq_chip_data(data));
+
+       cg->set_irq_mask = true;
+       cg->update |= UPDATE_IRQ_MASK;
+}
+
+static struct irq_chip crystalcove_irqchip = {
+       .name                   = "Crystal Cove",
+       .irq_mask               = crystalcove_irq_mask,
+       .irq_unmask             = crystalcove_irq_unmask,
+       .irq_set_type           = crystalcove_irq_type,
+       .irq_bus_lock           = crystalcove_bus_lock,
+       .irq_bus_sync_unlock    = crystalcove_bus_sync_unlock,
+};
+
+static irqreturn_t crystalcove_gpio_irq_handler(int irq, void *data)
+{
+       struct crystalcove_gpio *cg = data;
+       unsigned int p0, p1;
+       int pending;
+       int gpio;
+       unsigned int virq;
+
+       if (regmap_read(cg->regmap, GPIO0IRQ, &p0) ||
+           regmap_read(cg->regmap, GPIO1IRQ, &p1))
+               return IRQ_NONE;
+
+       regmap_write(cg->regmap, GPIO0IRQ, p0);
+       regmap_write(cg->regmap, GPIO1IRQ, p1);
+
+       pending = p0 | p1 << 8;
+
+       for (gpio = 0; gpio < cg->chip.ngpio; gpio++) {
+               if (pending & BIT(gpio)) {
+                       virq = irq_find_mapping(cg->chip.irqdomain, gpio);
+                       generic_handle_irq(virq);
+               }
+       }
+
+       return IRQ_HANDLED;
+}
+
+static void crystalcove_gpio_dbg_show(struct seq_file *s,
+                                     struct gpio_chip *chip)
+{
+       struct crystalcove_gpio *cg = to_cg(chip);
+       int gpio, offset;
+       unsigned int ctlo, ctli, mirqs0, mirqsx, irq;
+
+       for (gpio = 0; gpio < cg->chip.ngpio; gpio++) {
+               regmap_read(cg->regmap, to_reg(gpio, CTRL_OUT), &ctlo);
+               regmap_read(cg->regmap, to_reg(gpio, CTRL_IN), &ctli);
+               regmap_read(cg->regmap, gpio < 8 ? MGPIO0IRQS0 : MGPIO1IRQS0,
+                           &mirqs0);
+               regmap_read(cg->regmap, gpio < 8 ? MGPIO0IRQSX : MGPIO1IRQSX,
+                           &mirqsx);
+               regmap_read(cg->regmap, gpio < 8 ? GPIO0IRQ : GPIO1IRQ,
+                           &irq);
+
+               offset = gpio % 8;
+               seq_printf(s, " gpio-%-2d %s %s %s %s ctlo=%2x,%s %s %s\n",
+                          gpio, ctlo & CTLO_DIR_OUT ? "out" : "in ",
+                          ctli & 0x1 ? "hi" : "lo",
+                          ctli & CTLI_INTCNT_NE ? "fall" : "    ",
+                          ctli & CTLI_INTCNT_PE ? "rise" : "    ",
+                          ctlo,
+                          mirqs0 & BIT(offset) ? "s0 mask  " : "s0 unmask",
+                          mirqsx & BIT(offset) ? "sx mask  " : "sx unmask",
+                          irq & BIT(offset) ? "pending" : "       ");
+       }
+}
+
+static int crystalcove_gpio_probe(struct platform_device *pdev)
+{
+       int irq = platform_get_irq(pdev, 0);
+       struct crystalcove_gpio *cg;
+       int retval;
+       struct device *dev = pdev->dev.parent;
+       struct intel_soc_pmic *pmic = dev_get_drvdata(dev);
+
+       if (irq < 0)
+               return irq;
+
+       cg = devm_kzalloc(&pdev->dev, sizeof(*cg), GFP_KERNEL);
+       if (!cg)
+               return -ENOMEM;
+
+       platform_set_drvdata(pdev, cg);
+
+       mutex_init(&cg->buslock);
+       cg->chip.label = KBUILD_MODNAME;
+       cg->chip.direction_input = crystalcove_gpio_dir_in;
+       cg->chip.direction_output = crystalcove_gpio_dir_out;
+       cg->chip.get = crystalcove_gpio_get;
+       cg->chip.set = crystalcove_gpio_set;
+       cg->chip.base = -1;
+       cg->chip.ngpio = CRYSTALCOVE_GPIO_NUM;
+       cg->chip.can_sleep = true;
+       cg->chip.dev = dev;
+       cg->chip.dbg_show = crystalcove_gpio_dbg_show;
+       cg->regmap = pmic->regmap;
+
+       retval = gpiochip_add(&cg->chip);
+       if (retval) {
+               dev_warn(&pdev->dev, "add gpio chip error: %d\n", retval);
+               return retval;
+       }
+
+       gpiochip_irqchip_add(&cg->chip, &crystalcove_irqchip, 0,
+                            handle_simple_irq, IRQ_TYPE_NONE);
+
+       retval = request_threaded_irq(irq, NULL, crystalcove_gpio_irq_handler,
+                                     IRQF_ONESHOT, KBUILD_MODNAME, cg);
+
+       if (retval) {
+               dev_warn(&pdev->dev, "request irq failed: %d\n", retval);
+               goto out_remove_gpio;
+       }
+
+       return 0;
+
+out_remove_gpio:
+       WARN_ON(gpiochip_remove(&cg->chip));
+       return retval;
+}
+
+static int crystalcove_gpio_remove(struct platform_device *pdev)
+{
+       struct crystalcove_gpio *cg = platform_get_drvdata(pdev);
+       int irq = platform_get_irq(pdev, 0);
+       int err;
+
+       err = gpiochip_remove(&cg->chip);
+
+       if (irq >= 0)
+               free_irq(irq, cg);
+
+       return err;
+}
+
+static struct platform_driver crystalcove_gpio_driver = {
+       .probe = crystalcove_gpio_probe,
+       .remove = crystalcove_gpio_remove,
+       .driver = {
+               .name = "crystal_cove_gpio",
+               .owner = THIS_MODULE,
+       },
+};
+
+module_platform_driver(crystalcove_gpio_driver);
+
+MODULE_AUTHOR("Yang, Bin <bin.yang@intel.com>");
+MODULE_DESCRIPTION("Intel Crystal Cove GPIO Driver");
+MODULE_LICENSE("GPL v2");
index 07105ee5c9aea53dfb76e49096e0911dad36f5e4..3810da47043f5f0c8c155e98341de5825e3d77b7 100644 (file)
 
 #include <mach/map.h>
 #include <mach/regs-gpio.h>
-
-#if defined(CONFIG_ARCH_S3C24XX) || defined(CONFIG_ARCH_S3C64XX)
 #include <mach/gpio-samsung.h>
-#endif
 
 #include <plat/cpu.h>
 #include <plat/gpio-core.h>
@@ -358,47 +355,6 @@ static unsigned s3c24xx_gpio_getcfg_abank(struct samsung_gpio_chip *chip,
 }
 #endif
 
-#if defined(CONFIG_CPU_S5P6440) || defined(CONFIG_CPU_S5P6450)
-static int s5p64x0_gpio_setcfg_rbank(struct samsung_gpio_chip *chip,
-                                    unsigned int off, unsigned int cfg)
-{
-       void __iomem *reg = chip->base;
-       unsigned int shift;
-       u32 con;
-
-       switch (off) {
-       case 0:
-       case 1:
-       case 2:
-       case 3:
-       case 4:
-       case 5:
-               shift = (off & 7) * 4;
-               reg -= 4;
-               break;
-       case 6:
-               shift = ((off + 1) & 7) * 4;
-               reg -= 4;
-               break;
-       default:
-               shift = ((off + 1) & 7) * 4;
-               break;
-       }
-
-       if (samsung_gpio_is_cfg_special(cfg)) {
-               cfg &= 0xf;
-               cfg <<= shift;
-       }
-
-       con = __raw_readl(reg);
-       con &= ~(0xf << shift);
-       con |= cfg;
-       __raw_writel(con, reg);
-
-       return 0;
-}
-#endif
-
 static void __init samsung_gpiolib_set_cfg(struct samsung_gpio_cfg *chipcfg,
                                           int nr_chips)
 {
@@ -426,16 +382,6 @@ static struct samsung_gpio_cfg s3c24xx_gpiocfg_banka = {
 };
 #endif
 
-#if defined(CONFIG_CPU_S5P6440) || defined(CONFIG_CPU_S5P6450)
-static struct samsung_gpio_cfg s5p64x0_gpio_cfg_rbank = {
-       .cfg_eint       = 0x3,
-       .set_config     = s5p64x0_gpio_setcfg_rbank,
-       .get_config     = samsung_gpio_getcfg_4bit,
-       .set_pull       = samsung_gpio_setpull_updown,
-       .get_pull       = samsung_gpio_getpull_updown,
-};
-#endif
-
 static struct samsung_gpio_cfg samsung_gpio_cfgs[] = {
        [0] = {
                .cfg_eint       = 0x0,
@@ -708,91 +654,6 @@ static int s3c24xx_gpiolib_banka_output(struct gpio_chip *chip,
 }
 #endif
 
-/* The next set of routines are for the case of s5p64x0 bank r */
-
-static int s5p64x0_gpiolib_rbank_input(struct gpio_chip *chip,
-                                      unsigned int offset)
-{
-       struct samsung_gpio_chip *ourchip = to_samsung_gpio(chip);
-       void __iomem *base = ourchip->base;
-       void __iomem *regcon = base;
-       unsigned long con;
-       unsigned long flags;
-
-       switch (offset) {
-       case 6:
-               offset += 1;
-       case 0:
-       case 1:
-       case 2:
-       case 3:
-       case 4:
-       case 5:
-               regcon -= 4;
-               break;
-       default:
-               offset -= 7;
-               break;
-       }
-
-       samsung_gpio_lock(ourchip, flags);
-
-       con = __raw_readl(regcon);
-       con &= ~(0xf << con_4bit_shift(offset));
-       __raw_writel(con, regcon);
-
-       samsung_gpio_unlock(ourchip, flags);
-
-       return 0;
-}
-
-static int s5p64x0_gpiolib_rbank_output(struct gpio_chip *chip,
-                                       unsigned int offset, int value)
-{
-       struct samsung_gpio_chip *ourchip = to_samsung_gpio(chip);
-       void __iomem *base = ourchip->base;
-       void __iomem *regcon = base;
-       unsigned long con;
-       unsigned long dat;
-       unsigned long flags;
-       unsigned con_offset  = offset;
-
-       switch (con_offset) {
-       case 6:
-               con_offset += 1;
-       case 0:
-       case 1:
-       case 2:
-       case 3:
-       case 4:
-       case 5:
-               regcon -= 4;
-               break;
-       default:
-               con_offset -= 7;
-               break;
-       }
-
-       samsung_gpio_lock(ourchip, flags);
-
-       con = __raw_readl(regcon);
-       con &= ~(0xf << con_4bit_shift(con_offset));
-       con |= 0x1 << con_4bit_shift(con_offset);
-
-       dat = __raw_readl(base + GPIODAT_OFF);
-       if (value)
-               dat |= 1 << offset;
-       else
-               dat &= ~(1 << offset);
-
-       __raw_writel(con, regcon);
-       __raw_writel(dat, base + GPIODAT_OFF);
-
-       samsung_gpio_unlock(ourchip, flags);
-
-       return 0;
-}
-
 static void samsung_gpiolib_set(struct gpio_chip *chip,
                                unsigned offset, int value)
 {
@@ -999,20 +860,6 @@ static void __init samsung_gpiolib_add_4bit2_chips(struct samsung_gpio_chip *chi
        }
 }
 
-static void __init s5p64x0_gpiolib_add_rbank(struct samsung_gpio_chip *chip,
-                                            int nr_chips)
-{
-       for (; nr_chips > 0; nr_chips--, chip++) {
-               chip->chip.direction_input = s5p64x0_gpiolib_rbank_input;
-               chip->chip.direction_output = s5p64x0_gpiolib_rbank_output;
-
-               if (!chip->pm)
-                       chip->pm = __gpio_pm(&samsung_gpio_pm_4bit);
-
-               samsung_gpiolib_add(chip);
-       }
-}
-
 int samsung_gpiolib_to_irq(struct gpio_chip *chip, unsigned int offset)
 {
        struct samsung_gpio_chip *samsung_chip = container_of(chip, struct samsung_gpio_chip, chip);
@@ -1319,773 +1166,9 @@ static struct samsung_gpio_chip s3c64xx_gpios_2bit[] = {
 #endif
 };
 
-/*
- * S5P6440 GPIO bank summary:
- *
- * Bank        GPIOs   Style   SlpCon  ExtInt Group
- * A   6       4Bit    Yes     1
- * B   7       4Bit    Yes     1
- * C   8       4Bit    Yes     2
- * F   2       2Bit    Yes     4 [1]
- * G   7       4Bit    Yes     5
- * H   10      4Bit[2] Yes     6
- * I   16      2Bit    Yes     None
- * J   12      2Bit    Yes     None
- * N   16      2Bit    No      IRQ_EINT
- * P   8       2Bit    Yes     8
- * R   15      4Bit[2] Yes     8
- */
-
-static struct samsung_gpio_chip s5p6440_gpios_4bit[] = {
-#ifdef CONFIG_CPU_S5P6440
-       {
-               .chip   = {
-                       .base   = S5P6440_GPA(0),
-                       .ngpio  = S5P6440_GPIO_A_NR,
-                       .label  = "GPA",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5P6440_GPB(0),
-                       .ngpio  = S5P6440_GPIO_B_NR,
-                       .label  = "GPB",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5P6440_GPC(0),
-                       .ngpio  = S5P6440_GPIO_C_NR,
-                       .label  = "GPC",
-               },
-       }, {
-               .base   = S5P64X0_GPG_BASE,
-               .chip   = {
-                       .base   = S5P6440_GPG(0),
-                       .ngpio  = S5P6440_GPIO_G_NR,
-                       .label  = "GPG",
-               },
-       },
-#endif
-};
-
-static struct samsung_gpio_chip s5p6440_gpios_4bit2[] = {
-#ifdef CONFIG_CPU_S5P6440
-       {
-               .base   = S5P64X0_GPH_BASE + 0x4,
-               .chip   = {
-                       .base   = S5P6440_GPH(0),
-                       .ngpio  = S5P6440_GPIO_H_NR,
-                       .label  = "GPH",
-               },
-       },
-#endif
-};
-
-static struct samsung_gpio_chip s5p6440_gpios_rbank[] = {
-#ifdef CONFIG_CPU_S5P6440
-       {
-               .base   = S5P64X0_GPR_BASE + 0x4,
-               .config = &s5p64x0_gpio_cfg_rbank,
-               .chip   = {
-                       .base   = S5P6440_GPR(0),
-                       .ngpio  = S5P6440_GPIO_R_NR,
-                       .label  = "GPR",
-               },
-       },
-#endif
-};
-
-static struct samsung_gpio_chip s5p6440_gpios_2bit[] = {
-#ifdef CONFIG_CPU_S5P6440
-       {
-               .base   = S5P64X0_GPF_BASE,
-               .config = &samsung_gpio_cfgs[6],
-               .chip   = {
-                       .base   = S5P6440_GPF(0),
-                       .ngpio  = S5P6440_GPIO_F_NR,
-                       .label  = "GPF",
-               },
-       }, {
-               .base   = S5P64X0_GPI_BASE,
-               .config = &samsung_gpio_cfgs[4],
-               .chip   = {
-                       .base   = S5P6440_GPI(0),
-                       .ngpio  = S5P6440_GPIO_I_NR,
-                       .label  = "GPI",
-               },
-       }, {
-               .base   = S5P64X0_GPJ_BASE,
-               .config = &samsung_gpio_cfgs[4],
-               .chip   = {
-                       .base   = S5P6440_GPJ(0),
-                       .ngpio  = S5P6440_GPIO_J_NR,
-                       .label  = "GPJ",
-               },
-       }, {
-               .base   = S5P64X0_GPN_BASE,
-               .config = &samsung_gpio_cfgs[5],
-               .chip   = {
-                       .base   = S5P6440_GPN(0),
-                       .ngpio  = S5P6440_GPIO_N_NR,
-                       .label  = "GPN",
-               },
-       }, {
-               .base   = S5P64X0_GPP_BASE,
-               .config = &samsung_gpio_cfgs[6],
-               .chip   = {
-                       .base   = S5P6440_GPP(0),
-                       .ngpio  = S5P6440_GPIO_P_NR,
-                       .label  = "GPP",
-               },
-       },
-#endif
-};
-
-/*
- * S5P6450 GPIO bank summary:
- *
- * Bank        GPIOs   Style   SlpCon  ExtInt Group
- * A   6       4Bit    Yes     1
- * B   7       4Bit    Yes     1
- * C   8       4Bit    Yes     2
- * D   8       4Bit    Yes     None
- * F   2       2Bit    Yes     None
- * G   14      4Bit[2] Yes     5
- * H   10      4Bit[2] Yes     6
- * I   16      2Bit    Yes     None
- * J   12      2Bit    Yes     None
- * K   5       4Bit    Yes     None
- * N   16      2Bit    No      IRQ_EINT
- * P   11      2Bit    Yes     8
- * Q   14      2Bit    Yes     None
- * R   15      4Bit[2] Yes     None
- * S   8       2Bit    Yes     None
- *
- * [1] BANKF pins 14,15 do not form part of the external interrupt sources
- * [2] BANK has two control registers, GPxCON0 and GPxCON1
- */
-
-static struct samsung_gpio_chip s5p6450_gpios_4bit[] = {
-#ifdef CONFIG_CPU_S5P6450
-       {
-               .chip   = {
-                       .base   = S5P6450_GPA(0),
-                       .ngpio  = S5P6450_GPIO_A_NR,
-                       .label  = "GPA",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5P6450_GPB(0),
-                       .ngpio  = S5P6450_GPIO_B_NR,
-                       .label  = "GPB",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5P6450_GPC(0),
-                       .ngpio  = S5P6450_GPIO_C_NR,
-                       .label  = "GPC",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5P6450_GPD(0),
-                       .ngpio  = S5P6450_GPIO_D_NR,
-                       .label  = "GPD",
-               },
-       }, {
-               .base   = S5P6450_GPK_BASE,
-               .chip   = {
-                       .base   = S5P6450_GPK(0),
-                       .ngpio  = S5P6450_GPIO_K_NR,
-                       .label  = "GPK",
-               },
-       },
-#endif
-};
-
-static struct samsung_gpio_chip s5p6450_gpios_4bit2[] = {
-#ifdef CONFIG_CPU_S5P6450
-       {
-               .base   = S5P64X0_GPG_BASE + 0x4,
-               .chip   = {
-                       .base   = S5P6450_GPG(0),
-                       .ngpio  = S5P6450_GPIO_G_NR,
-                       .label  = "GPG",
-               },
-       }, {
-               .base   = S5P64X0_GPH_BASE + 0x4,
-               .chip   = {
-                       .base   = S5P6450_GPH(0),
-                       .ngpio  = S5P6450_GPIO_H_NR,
-                       .label  = "GPH",
-               },
-       },
-#endif
-};
-
-static struct samsung_gpio_chip s5p6450_gpios_rbank[] = {
-#ifdef CONFIG_CPU_S5P6450
-       {
-               .base   = S5P64X0_GPR_BASE + 0x4,
-               .config = &s5p64x0_gpio_cfg_rbank,
-               .chip   = {
-                       .base   = S5P6450_GPR(0),
-                       .ngpio  = S5P6450_GPIO_R_NR,
-                       .label  = "GPR",
-               },
-       },
-#endif
-};
-
-static struct samsung_gpio_chip s5p6450_gpios_2bit[] = {
-#ifdef CONFIG_CPU_S5P6450
-       {
-               .base   = S5P64X0_GPF_BASE,
-               .config = &samsung_gpio_cfgs[6],
-               .chip   = {
-                       .base   = S5P6450_GPF(0),
-                       .ngpio  = S5P6450_GPIO_F_NR,
-                       .label  = "GPF",
-               },
-       }, {
-               .base   = S5P64X0_GPI_BASE,
-               .config = &samsung_gpio_cfgs[4],
-               .chip   = {
-                       .base   = S5P6450_GPI(0),
-                       .ngpio  = S5P6450_GPIO_I_NR,
-                       .label  = "GPI",
-               },
-       }, {
-               .base   = S5P64X0_GPJ_BASE,
-               .config = &samsung_gpio_cfgs[4],
-               .chip   = {
-                       .base   = S5P6450_GPJ(0),
-                       .ngpio  = S5P6450_GPIO_J_NR,
-                       .label  = "GPJ",
-               },
-       }, {
-               .base   = S5P64X0_GPN_BASE,
-               .config = &samsung_gpio_cfgs[5],
-               .chip   = {
-                       .base   = S5P6450_GPN(0),
-                       .ngpio  = S5P6450_GPIO_N_NR,
-                       .label  = "GPN",
-               },
-       }, {
-               .base   = S5P64X0_GPP_BASE,
-               .config = &samsung_gpio_cfgs[6],
-               .chip   = {
-                       .base   = S5P6450_GPP(0),
-                       .ngpio  = S5P6450_GPIO_P_NR,
-                       .label  = "GPP",
-               },
-       }, {
-               .base   = S5P6450_GPQ_BASE,
-               .config = &samsung_gpio_cfgs[5],
-               .chip   = {
-                       .base   = S5P6450_GPQ(0),
-                       .ngpio  = S5P6450_GPIO_Q_NR,
-                       .label  = "GPQ",
-               },
-       }, {
-               .base   = S5P6450_GPS_BASE,
-               .config = &samsung_gpio_cfgs[6],
-               .chip   = {
-                       .base   = S5P6450_GPS(0),
-                       .ngpio  = S5P6450_GPIO_S_NR,
-                       .label  = "GPS",
-               },
-       },
-#endif
-};
-
-/*
- * S5PC100 GPIO bank summary:
- *
- * Bank        GPIOs   Style   INT Type
- * A0  8       4Bit    GPIO_INT0
- * A1  5       4Bit    GPIO_INT1
- * B   8       4Bit    GPIO_INT2
- * C   5       4Bit    GPIO_INT3
- * D   7       4Bit    GPIO_INT4
- * E0  8       4Bit    GPIO_INT5
- * E1  6       4Bit    GPIO_INT6
- * F0  8       4Bit    GPIO_INT7
- * F1  8       4Bit    GPIO_INT8
- * F2  8       4Bit    GPIO_INT9
- * F3  4       4Bit    GPIO_INT10
- * G0  8       4Bit    GPIO_INT11
- * G1  3       4Bit    GPIO_INT12
- * G2  7       4Bit    GPIO_INT13
- * G3  7       4Bit    GPIO_INT14
- * H0  8       4Bit    WKUP_INT
- * H1  8       4Bit    WKUP_INT
- * H2  8       4Bit    WKUP_INT
- * H3  8       4Bit    WKUP_INT
- * I   8       4Bit    GPIO_INT15
- * J0  8       4Bit    GPIO_INT16
- * J1  5       4Bit    GPIO_INT17
- * J2  8       4Bit    GPIO_INT18
- * J3  8       4Bit    GPIO_INT19
- * J4  4       4Bit    GPIO_INT20
- * K0  8       4Bit    None
- * K1  6       4Bit    None
- * K2  8       4Bit    None
- * K3  8       4Bit    None
- * L0  8       4Bit    None
- * L1  8       4Bit    None
- * L2  8       4Bit    None
- * L3  8       4Bit    None
- */
-
-static struct samsung_gpio_chip s5pc100_gpios_4bit[] = {
-#ifdef CONFIG_CPU_S5PC100
-       {
-               .chip   = {
-                       .base   = S5PC100_GPA0(0),
-                       .ngpio  = S5PC100_GPIO_A0_NR,
-                       .label  = "GPA0",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PC100_GPA1(0),
-                       .ngpio  = S5PC100_GPIO_A1_NR,
-                       .label  = "GPA1",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PC100_GPB(0),
-                       .ngpio  = S5PC100_GPIO_B_NR,
-                       .label  = "GPB",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PC100_GPC(0),
-                       .ngpio  = S5PC100_GPIO_C_NR,
-                       .label  = "GPC",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PC100_GPD(0),
-                       .ngpio  = S5PC100_GPIO_D_NR,
-                       .label  = "GPD",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PC100_GPE0(0),
-                       .ngpio  = S5PC100_GPIO_E0_NR,
-                       .label  = "GPE0",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PC100_GPE1(0),
-                       .ngpio  = S5PC100_GPIO_E1_NR,
-                       .label  = "GPE1",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PC100_GPF0(0),
-                       .ngpio  = S5PC100_GPIO_F0_NR,
-                       .label  = "GPF0",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PC100_GPF1(0),
-                       .ngpio  = S5PC100_GPIO_F1_NR,
-                       .label  = "GPF1",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PC100_GPF2(0),
-                       .ngpio  = S5PC100_GPIO_F2_NR,
-                       .label  = "GPF2",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PC100_GPF3(0),
-                       .ngpio  = S5PC100_GPIO_F3_NR,
-                       .label  = "GPF3",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PC100_GPG0(0),
-                       .ngpio  = S5PC100_GPIO_G0_NR,
-                       .label  = "GPG0",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PC100_GPG1(0),
-                       .ngpio  = S5PC100_GPIO_G1_NR,
-                       .label  = "GPG1",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PC100_GPG2(0),
-                       .ngpio  = S5PC100_GPIO_G2_NR,
-                       .label  = "GPG2",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PC100_GPG3(0),
-                       .ngpio  = S5PC100_GPIO_G3_NR,
-                       .label  = "GPG3",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PC100_GPI(0),
-                       .ngpio  = S5PC100_GPIO_I_NR,
-                       .label  = "GPI",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PC100_GPJ0(0),
-                       .ngpio  = S5PC100_GPIO_J0_NR,
-                       .label  = "GPJ0",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PC100_GPJ1(0),
-                       .ngpio  = S5PC100_GPIO_J1_NR,
-                       .label  = "GPJ1",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PC100_GPJ2(0),
-                       .ngpio  = S5PC100_GPIO_J2_NR,
-                       .label  = "GPJ2",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PC100_GPJ3(0),
-                       .ngpio  = S5PC100_GPIO_J3_NR,
-                       .label  = "GPJ3",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PC100_GPJ4(0),
-                       .ngpio  = S5PC100_GPIO_J4_NR,
-                       .label  = "GPJ4",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PC100_GPK0(0),
-                       .ngpio  = S5PC100_GPIO_K0_NR,
-                       .label  = "GPK0",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PC100_GPK1(0),
-                       .ngpio  = S5PC100_GPIO_K1_NR,
-                       .label  = "GPK1",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PC100_GPK2(0),
-                       .ngpio  = S5PC100_GPIO_K2_NR,
-                       .label  = "GPK2",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PC100_GPK3(0),
-                       .ngpio  = S5PC100_GPIO_K3_NR,
-                       .label  = "GPK3",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PC100_GPL0(0),
-                       .ngpio  = S5PC100_GPIO_L0_NR,
-                       .label  = "GPL0",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PC100_GPL1(0),
-                       .ngpio  = S5PC100_GPIO_L1_NR,
-                       .label  = "GPL1",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PC100_GPL2(0),
-                       .ngpio  = S5PC100_GPIO_L2_NR,
-                       .label  = "GPL2",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PC100_GPL3(0),
-                       .ngpio  = S5PC100_GPIO_L3_NR,
-                       .label  = "GPL3",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PC100_GPL4(0),
-                       .ngpio  = S5PC100_GPIO_L4_NR,
-                       .label  = "GPL4",
-               },
-       }, {
-               .base   = (S5P_VA_GPIO + 0xC00),
-               .irq_base = IRQ_EINT(0),
-               .chip   = {
-                       .base   = S5PC100_GPH0(0),
-                       .ngpio  = S5PC100_GPIO_H0_NR,
-                       .label  = "GPH0",
-                       .to_irq = samsung_gpiolib_to_irq,
-               },
-       }, {
-               .base   = (S5P_VA_GPIO + 0xC20),
-               .irq_base = IRQ_EINT(8),
-               .chip   = {
-                       .base   = S5PC100_GPH1(0),
-                       .ngpio  = S5PC100_GPIO_H1_NR,
-                       .label  = "GPH1",
-                       .to_irq = samsung_gpiolib_to_irq,
-               },
-       }, {
-               .base   = (S5P_VA_GPIO + 0xC40),
-               .irq_base = IRQ_EINT(16),
-               .chip   = {
-                       .base   = S5PC100_GPH2(0),
-                       .ngpio  = S5PC100_GPIO_H2_NR,
-                       .label  = "GPH2",
-                       .to_irq = samsung_gpiolib_to_irq,
-               },
-       }, {
-               .base   = (S5P_VA_GPIO + 0xC60),
-               .irq_base = IRQ_EINT(24),
-               .chip   = {
-                       .base   = S5PC100_GPH3(0),
-                       .ngpio  = S5PC100_GPIO_H3_NR,
-                       .label  = "GPH3",
-                       .to_irq = samsung_gpiolib_to_irq,
-               },
-       },
-#endif
-};
-
-/*
- * Followings are the gpio banks in S5PV210/S5PC110
- *
- * The 'config' member when left to NULL, is initialized to the default
- * structure samsung_gpio_cfgs[3] in the init function below.
- *
- * The 'base' member is also initialized in the init function below.
- * Note: The initialization of 'base' member of samsung_gpio_chip structure
- * uses the above macro and depends on the banks being listed in order here.
- */
-
-static struct samsung_gpio_chip s5pv210_gpios_4bit[] = {
-#ifdef CONFIG_CPU_S5PV210
-       {
-               .chip   = {
-                       .base   = S5PV210_GPA0(0),
-                       .ngpio  = S5PV210_GPIO_A0_NR,
-                       .label  = "GPA0",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PV210_GPA1(0),
-                       .ngpio  = S5PV210_GPIO_A1_NR,
-                       .label  = "GPA1",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PV210_GPB(0),
-                       .ngpio  = S5PV210_GPIO_B_NR,
-                       .label  = "GPB",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PV210_GPC0(0),
-                       .ngpio  = S5PV210_GPIO_C0_NR,
-                       .label  = "GPC0",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PV210_GPC1(0),
-                       .ngpio  = S5PV210_GPIO_C1_NR,
-                       .label  = "GPC1",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PV210_GPD0(0),
-                       .ngpio  = S5PV210_GPIO_D0_NR,
-                       .label  = "GPD0",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PV210_GPD1(0),
-                       .ngpio  = S5PV210_GPIO_D1_NR,
-                       .label  = "GPD1",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PV210_GPE0(0),
-                       .ngpio  = S5PV210_GPIO_E0_NR,
-                       .label  = "GPE0",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PV210_GPE1(0),
-                       .ngpio  = S5PV210_GPIO_E1_NR,
-                       .label  = "GPE1",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PV210_GPF0(0),
-                       .ngpio  = S5PV210_GPIO_F0_NR,
-                       .label  = "GPF0",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PV210_GPF1(0),
-                       .ngpio  = S5PV210_GPIO_F1_NR,
-                       .label  = "GPF1",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PV210_GPF2(0),
-                       .ngpio  = S5PV210_GPIO_F2_NR,
-                       .label  = "GPF2",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PV210_GPF3(0),
-                       .ngpio  = S5PV210_GPIO_F3_NR,
-                       .label  = "GPF3",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PV210_GPG0(0),
-                       .ngpio  = S5PV210_GPIO_G0_NR,
-                       .label  = "GPG0",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PV210_GPG1(0),
-                       .ngpio  = S5PV210_GPIO_G1_NR,
-                       .label  = "GPG1",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PV210_GPG2(0),
-                       .ngpio  = S5PV210_GPIO_G2_NR,
-                       .label  = "GPG2",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PV210_GPG3(0),
-                       .ngpio  = S5PV210_GPIO_G3_NR,
-                       .label  = "GPG3",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PV210_GPI(0),
-                       .ngpio  = S5PV210_GPIO_I_NR,
-                       .label  = "GPI",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PV210_GPJ0(0),
-                       .ngpio  = S5PV210_GPIO_J0_NR,
-                       .label  = "GPJ0",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PV210_GPJ1(0),
-                       .ngpio  = S5PV210_GPIO_J1_NR,
-                       .label  = "GPJ1",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PV210_GPJ2(0),
-                       .ngpio  = S5PV210_GPIO_J2_NR,
-                       .label  = "GPJ2",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PV210_GPJ3(0),
-                       .ngpio  = S5PV210_GPIO_J3_NR,
-                       .label  = "GPJ3",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PV210_GPJ4(0),
-                       .ngpio  = S5PV210_GPIO_J4_NR,
-                       .label  = "GPJ4",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PV210_MP01(0),
-                       .ngpio  = S5PV210_GPIO_MP01_NR,
-                       .label  = "MP01",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PV210_MP02(0),
-                       .ngpio  = S5PV210_GPIO_MP02_NR,
-                       .label  = "MP02",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PV210_MP03(0),
-                       .ngpio  = S5PV210_GPIO_MP03_NR,
-                       .label  = "MP03",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PV210_MP04(0),
-                       .ngpio  = S5PV210_GPIO_MP04_NR,
-                       .label  = "MP04",
-               },
-       }, {
-               .chip   = {
-                       .base   = S5PV210_MP05(0),
-                       .ngpio  = S5PV210_GPIO_MP05_NR,
-                       .label  = "MP05",
-               },
-       }, {
-               .base   = (S5P_VA_GPIO + 0xC00),
-               .irq_base = IRQ_EINT(0),
-               .chip   = {
-                       .base   = S5PV210_GPH0(0),
-                       .ngpio  = S5PV210_GPIO_H0_NR,
-                       .label  = "GPH0",
-                       .to_irq = samsung_gpiolib_to_irq,
-               },
-       }, {
-               .base   = (S5P_VA_GPIO + 0xC20),
-               .irq_base = IRQ_EINT(8),
-               .chip   = {
-                       .base   = S5PV210_GPH1(0),
-                       .ngpio  = S5PV210_GPIO_H1_NR,
-                       .label  = "GPH1",
-                       .to_irq = samsung_gpiolib_to_irq,
-               },
-       }, {
-               .base   = (S5P_VA_GPIO + 0xC40),
-               .irq_base = IRQ_EINT(16),
-               .chip   = {
-                       .base   = S5PV210_GPH2(0),
-                       .ngpio  = S5PV210_GPIO_H2_NR,
-                       .label  = "GPH2",
-                       .to_irq = samsung_gpiolib_to_irq,
-               },
-       }, {
-               .base   = (S5P_VA_GPIO + 0xC60),
-               .irq_base = IRQ_EINT(24),
-               .chip   = {
-                       .base   = S5PV210_GPH3(0),
-                       .ngpio  = S5PV210_GPIO_H3_NR,
-                       .label  = "GPH3",
-                       .to_irq = samsung_gpiolib_to_irq,
-               },
-       },
-#endif
-};
-
 /* TODO: cleanup soc_is_* */
 static __init int samsung_gpiolib_init(void)
 {
-       struct samsung_gpio_chip *chip;
-       int i, nr_chips;
-       int group = 0;
-
        /*
         * Currently there are two drivers that can provide GPIO support for
         * Samsung SoCs. For device tree enabled platforms, the new
@@ -2109,54 +1192,6 @@ static __init int samsung_gpiolib_init(void)
                                S3C64XX_VA_GPIO);
                samsung_gpiolib_add_4bit2_chips(s3c64xx_gpios_4bit2,
                                ARRAY_SIZE(s3c64xx_gpios_4bit2));
-       } else if (soc_is_s5p6440()) {
-               samsung_gpiolib_add_2bit_chips(s5p6440_gpios_2bit,
-                               ARRAY_SIZE(s5p6440_gpios_2bit), NULL, 0x0);
-               samsung_gpiolib_add_4bit_chips(s5p6440_gpios_4bit,
-                               ARRAY_SIZE(s5p6440_gpios_4bit), S5P_VA_GPIO);
-               samsung_gpiolib_add_4bit2_chips(s5p6440_gpios_4bit2,
-                               ARRAY_SIZE(s5p6440_gpios_4bit2));
-               s5p64x0_gpiolib_add_rbank(s5p6440_gpios_rbank,
-                               ARRAY_SIZE(s5p6440_gpios_rbank));
-       } else if (soc_is_s5p6450()) {
-               samsung_gpiolib_add_2bit_chips(s5p6450_gpios_2bit,
-                               ARRAY_SIZE(s5p6450_gpios_2bit), NULL, 0x0);
-               samsung_gpiolib_add_4bit_chips(s5p6450_gpios_4bit,
-                               ARRAY_SIZE(s5p6450_gpios_4bit), S5P_VA_GPIO);
-               samsung_gpiolib_add_4bit2_chips(s5p6450_gpios_4bit2,
-                               ARRAY_SIZE(s5p6450_gpios_4bit2));
-               s5p64x0_gpiolib_add_rbank(s5p6450_gpios_rbank,
-                               ARRAY_SIZE(s5p6450_gpios_rbank));
-       } else if (soc_is_s5pc100()) {
-               group = 0;
-               chip = s5pc100_gpios_4bit;
-               nr_chips = ARRAY_SIZE(s5pc100_gpios_4bit);
-
-               for (i = 0; i < nr_chips; i++, chip++) {
-                       if (!chip->config) {
-                               chip->config = &samsung_gpio_cfgs[3];
-                               chip->group = group++;
-                       }
-               }
-               samsung_gpiolib_add_4bit_chips(s5pc100_gpios_4bit, nr_chips, S5P_VA_GPIO);
-#if defined(CONFIG_CPU_S5PC100) && defined(CONFIG_S5P_GPIO_INT)
-               s5p_register_gpioint_bank(IRQ_GPIOINT, 0, S5P_GPIOINT_GROUP_MAXNR);
-#endif
-       } else if (soc_is_s5pv210()) {
-               group = 0;
-               chip = s5pv210_gpios_4bit;
-               nr_chips = ARRAY_SIZE(s5pv210_gpios_4bit);
-
-               for (i = 0; i < nr_chips; i++, chip++) {
-                       if (!chip->config) {
-                               chip->config = &samsung_gpio_cfgs[3];
-                               chip->group = group++;
-                       }
-               }
-               samsung_gpiolib_add_4bit_chips(s5pv210_gpios_4bit, nr_chips, S5P_VA_GPIO);
-#if defined(CONFIG_CPU_S5PV210) && defined(CONFIG_S5P_GPIO_INT)
-               s5p_register_gpioint_bank(IRQ_GPIOINT, 0, S5P_GPIOINT_GROUP_MAXNR);
-#endif
        } else {
                WARN(1, "Unknown SoC in gpio-samsung, no GPIOs added\n");
                return -ENODEV;
index f5120046ff800a5433df4d52bce57ff589286ddf..b066bb3ca01ace734e16abd61fccfb88cdd46c0c 100644 (file)
@@ -114,6 +114,7 @@ config DRM_RADEON
        select POWER_SUPPLY
        select HWMON
        select BACKLIGHT_CLASS_DEVICE
+       select INTERVAL_TREE
        help
          Choose this option if you have an ATI Radeon graphics card.  There
          are both PCI and AGP versions.  You don't need to choose this to
@@ -201,3 +202,5 @@ source "drivers/gpu/drm/msm/Kconfig"
 source "drivers/gpu/drm/tegra/Kconfig"
 
 source "drivers/gpu/drm/panel/Kconfig"
+
+source "drivers/gpu/drm/sti/Kconfig"
index dd2ba4269740f563ac29eecadbe62b40bf55ade3..4a55d59ccd22f21ed3c11f13bc92ab9761f22eae 100644 (file)
@@ -6,8 +6,8 @@ ccflags-y := -Iinclude/drm
 
 drm-y       := drm_auth.o drm_buffer.o drm_bufs.o drm_cache.o \
                drm_context.o drm_dma.o \
-               drm_drv.o drm_fops.o drm_gem.o drm_ioctl.o drm_irq.o \
-               drm_lock.o drm_memory.o drm_stub.o drm_vm.o \
+               drm_fops.o drm_gem.o drm_ioctl.o drm_irq.o \
+               drm_lock.o drm_memory.o drm_drv.o drm_vm.o \
                drm_agpsupport.o drm_scatter.o drm_pci.o \
                drm_platform.o drm_sysfs.o drm_hashtab.o drm_mm.o \
                drm_crtc.o drm_modes.o drm_edid.o \
@@ -20,11 +20,12 @@ drm-$(CONFIG_COMPAT) += drm_ioc32.o
 drm-$(CONFIG_DRM_GEM_CMA_HELPER) += drm_gem_cma_helper.o
 drm-$(CONFIG_PCI) += ati_pcigart.o
 drm-$(CONFIG_DRM_PANEL) += drm_panel.o
+drm-$(CONFIG_OF) += drm_of.o
 
 drm-usb-y   := drm_usb.o
 
 drm_kms_helper-y := drm_crtc_helper.o drm_dp_helper.o drm_probe_helper.o \
-               drm_plane_helper.o
+               drm_plane_helper.o drm_dp_mst_topology.o
 drm_kms_helper-$(CONFIG_DRM_LOAD_EDID_FIRMWARE) += drm_edid_load.o
 drm_kms_helper-$(CONFIG_DRM_KMS_FB_HELPER) += drm_fb_helper.o
 drm_kms_helper-$(CONFIG_DRM_KMS_CMA_HELPER) += drm_fb_cma_helper.o
@@ -63,6 +64,7 @@ obj-$(CONFIG_DRM_QXL) += qxl/
 obj-$(CONFIG_DRM_BOCHS) += bochs/
 obj-$(CONFIG_DRM_MSM) += msm/
 obj-$(CONFIG_DRM_TEGRA) += tegra/
+obj-$(CONFIG_DRM_STI) += sti/
 obj-y                  += i2c/
 obj-y                  += panel/
 obj-y                  += bridge/
index 59948eff6095ae50aaab476dc572681c1e114a2f..ad3d2ebf95c9444fac1ec1f5cfdb8f0029e2fda3 100644 (file)
 #include "armada_drm.h"
 #include "armada_hw.h"
 
-static int armada510_init(struct armada_private *priv, struct device *dev)
+static int armada510_crtc_init(struct armada_crtc *dcrtc, struct device *dev)
 {
-       priv->extclk[0] = devm_clk_get(dev, "ext_ref_clk_1");
+       struct clk *clk;
 
-       if (IS_ERR(priv->extclk[0]) && PTR_ERR(priv->extclk[0]) == -ENOENT)
-               priv->extclk[0] = ERR_PTR(-EPROBE_DEFER);
+       clk = devm_clk_get(dev, "ext_ref_clk1");
+       if (IS_ERR(clk))
+               return PTR_ERR(clk) == -ENOENT ? -EPROBE_DEFER : PTR_ERR(clk);
 
-       return PTR_RET(priv->extclk[0]);
-}
+       dcrtc->extclk[0] = clk;
 
-static int armada510_crtc_init(struct armada_crtc *dcrtc)
-{
        /* Lower the watermark so to eliminate jitter at higher bandwidths */
        armada_updatel(0x20, (1 << 11) | 0xff, dcrtc->base + LCD_CFG_RDREG4F);
+
        return 0;
 }
 
@@ -45,8 +44,7 @@ static int armada510_crtc_init(struct armada_crtc *dcrtc)
 static int armada510_crtc_compute_clock(struct armada_crtc *dcrtc,
        const struct drm_display_mode *mode, uint32_t *sclk)
 {
-       struct armada_private *priv = dcrtc->crtc.dev->dev_private;
-       struct clk *clk = priv->extclk[0];
+       struct clk *clk = dcrtc->extclk[0];
        int ret;
 
        if (dcrtc->num == 1)
@@ -81,7 +79,6 @@ static int armada510_crtc_compute_clock(struct armada_crtc *dcrtc,
 const struct armada_variant armada510_ops = {
        .has_spu_adv_reg = true,
        .spu_adv_reg = ADV_HWC32ENABLE | ADV_HWC32ARGB | ADV_HWC32BLEND,
-       .init = armada510_init,
-       .crtc_init = armada510_crtc_init,
-       .crtc_compute_clock = armada510_crtc_compute_clock,
+       .init = armada510_crtc_init,
+       .compute_clock = armada510_crtc_compute_clock,
 };
index 3aedf9e993e65d8d3b8d67c8241d2e7a34b22990..9a0cc09e665308bd6d6a7c7b518b455f5acd050d 100644 (file)
@@ -7,6 +7,9 @@
  * published by the Free Software Foundation.
  */
 #include <linux/clk.h>
+#include <linux/component.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
 #include <drm/drmP.h>
 #include <drm/drm_crtc_helper.h>
 #include "armada_crtc.h"
@@ -332,24 +335,23 @@ static void armada_drm_crtc_commit(struct drm_crtc *crtc)
 static bool armada_drm_crtc_mode_fixup(struct drm_crtc *crtc,
        const struct drm_display_mode *mode, struct drm_display_mode *adj)
 {
-       struct armada_private *priv = crtc->dev->dev_private;
        struct armada_crtc *dcrtc = drm_to_armada_crtc(crtc);
        int ret;
 
        /* We can't do interlaced modes if we don't have the SPU_ADV_REG */
-       if (!priv->variant->has_spu_adv_reg &&
+       if (!dcrtc->variant->has_spu_adv_reg &&
            adj->flags & DRM_MODE_FLAG_INTERLACE)
                return false;
 
        /* Check whether the display mode is possible */
-       ret = priv->variant->crtc_compute_clock(dcrtc, adj, NULL);
+       ret = dcrtc->variant->compute_clock(dcrtc, adj, NULL);
        if (ret)
                return false;
 
        return true;
 }
 
-void armada_drm_crtc_irq(struct armada_crtc *dcrtc, u32 stat)
+static void armada_drm_crtc_irq(struct armada_crtc *dcrtc, u32 stat)
 {
        struct armada_vbl_event *e, *n;
        void __iomem *base = dcrtc->base;
@@ -410,6 +412,27 @@ void armada_drm_crtc_irq(struct armada_crtc *dcrtc, u32 stat)
        }
 }
 
+static irqreturn_t armada_drm_irq(int irq, void *arg)
+{
+       struct armada_crtc *dcrtc = arg;
+       u32 v, stat = readl_relaxed(dcrtc->base + LCD_SPU_IRQ_ISR);
+
+       /*
+        * This is rediculous - rather than writing bits to clear, we
+        * have to set the actual status register value.  This is racy.
+        */
+       writel_relaxed(0, dcrtc->base + LCD_SPU_IRQ_ISR);
+
+       /* Mask out those interrupts we haven't enabled */
+       v = stat & dcrtc->irq_ena;
+
+       if (v & (VSYNC_IRQ|GRA_FRAME_IRQ|DUMB_FRAMEDONE)) {
+               armada_drm_crtc_irq(dcrtc, stat);
+               return IRQ_HANDLED;
+       }
+       return IRQ_NONE;
+}
+
 /* These are locked by dev->vbl_lock */
 void armada_drm_crtc_disable_irq(struct armada_crtc *dcrtc, u32 mask)
 {
@@ -470,7 +493,6 @@ static int armada_drm_crtc_mode_set(struct drm_crtc *crtc,
        struct drm_display_mode *mode, struct drm_display_mode *adj,
        int x, int y, struct drm_framebuffer *old_fb)
 {
-       struct armada_private *priv = crtc->dev->dev_private;
        struct armada_crtc *dcrtc = drm_to_armada_crtc(crtc);
        struct armada_regs regs[17];
        uint32_t lm, rm, tm, bm, val, sclk;
@@ -515,7 +537,7 @@ static int armada_drm_crtc_mode_set(struct drm_crtc *crtc,
        }
 
        /* Now compute the divider for real */
-       priv->variant->crtc_compute_clock(dcrtc, adj, &sclk);
+       dcrtc->variant->compute_clock(dcrtc, adj, &sclk);
 
        /* Ensure graphic fifo is enabled */
        armada_reg_queue_mod(regs, i, 0, CFG_PDWN64x66, LCD_SPU_SRAM_PARA1);
@@ -537,7 +559,7 @@ static int armada_drm_crtc_mode_set(struct drm_crtc *crtc,
        dcrtc->v[1].spu_v_porch = tm << 16 | bm;
        val = adj->crtc_hsync_start;
        dcrtc->v[1].spu_adv_reg = val << 20 | val | ADV_VSYNCOFFEN |
-               priv->variant->spu_adv_reg;
+               dcrtc->variant->spu_adv_reg;
 
        if (interlaced) {
                /* Odd interlaced frame */
@@ -546,7 +568,7 @@ static int armada_drm_crtc_mode_set(struct drm_crtc *crtc,
                dcrtc->v[0].spu_v_porch = dcrtc->v[1].spu_v_porch + 1;
                val = adj->crtc_hsync_start - adj->crtc_htotal / 2;
                dcrtc->v[0].spu_adv_reg = val << 20 | val | ADV_VSYNCOFFEN |
-                       priv->variant->spu_adv_reg;
+                       dcrtc->variant->spu_adv_reg;
        } else {
                dcrtc->v[0] = dcrtc->v[1];
        }
@@ -561,7 +583,7 @@ static int armada_drm_crtc_mode_set(struct drm_crtc *crtc,
        armada_reg_queue_set(regs, i, dcrtc->v[0].spu_v_h_total,
                           LCD_SPUT_V_H_TOTAL);
 
-       if (priv->variant->has_spu_adv_reg) {
+       if (dcrtc->variant->has_spu_adv_reg) {
                armada_reg_queue_mod(regs, i, dcrtc->v[0].spu_adv_reg,
                                     ADV_VSYNC_L_OFF | ADV_VSYNC_H_OFF |
                                     ADV_VSYNCOFFEN, LCD_SPU_ADV_REG);
@@ -805,12 +827,11 @@ static int armada_drm_crtc_cursor_set(struct drm_crtc *crtc,
 {
        struct drm_device *dev = crtc->dev;
        struct armada_crtc *dcrtc = drm_to_armada_crtc(crtc);
-       struct armada_private *priv = crtc->dev->dev_private;
        struct armada_gem_object *obj = NULL;
        int ret;
 
        /* If no cursor support, replicate drm's return value */
-       if (!priv->variant->has_spu_adv_reg)
+       if (!dcrtc->variant->has_spu_adv_reg)
                return -ENXIO;
 
        if (handle && w > 0 && h > 0) {
@@ -858,11 +879,10 @@ static int armada_drm_crtc_cursor_move(struct drm_crtc *crtc, int x, int y)
 {
        struct drm_device *dev = crtc->dev;
        struct armada_crtc *dcrtc = drm_to_armada_crtc(crtc);
-       struct armada_private *priv = crtc->dev->dev_private;
        int ret;
 
        /* If no cursor support, replicate drm's return value */
-       if (!priv->variant->has_spu_adv_reg)
+       if (!dcrtc->variant->has_spu_adv_reg)
                return -EFAULT;
 
        mutex_lock(&dev->struct_mutex);
@@ -888,6 +908,10 @@ static void armada_drm_crtc_destroy(struct drm_crtc *crtc)
        if (!IS_ERR(dcrtc->clk))
                clk_disable_unprepare(dcrtc->clk);
 
+       writel_relaxed(0, dcrtc->base + LCD_SPU_IRQ_ENA);
+
+       of_node_put(dcrtc->crtc.port);
+
        kfree(dcrtc);
 }
 
@@ -1027,19 +1051,20 @@ static int armada_drm_crtc_create_properties(struct drm_device *dev)
        return 0;
 }
 
-int armada_drm_crtc_create(struct drm_device *dev, unsigned num,
-       struct resource *res)
+int armada_drm_crtc_create(struct drm_device *drm, struct device *dev,
+       struct resource *res, int irq, const struct armada_variant *variant,
+       struct device_node *port)
 {
-       struct armada_private *priv = dev->dev_private;
+       struct armada_private *priv = drm->dev_private;
        struct armada_crtc *dcrtc;
        void __iomem *base;
        int ret;
 
-       ret = armada_drm_crtc_create_properties(dev);
+       ret = armada_drm_crtc_create_properties(drm);
        if (ret)
                return ret;
 
-       base = devm_ioremap_resource(dev->dev, res);
+       base = devm_ioremap_resource(dev, res);
        if (IS_ERR(base))
                return PTR_ERR(base);
 
@@ -1049,8 +1074,12 @@ int armada_drm_crtc_create(struct drm_device *dev, unsigned num,
                return -ENOMEM;
        }
 
+       if (dev != drm->dev)
+               dev_set_drvdata(dev, dcrtc);
+
+       dcrtc->variant = variant;
        dcrtc->base = base;
-       dcrtc->num = num;
+       dcrtc->num = drm->mode_config.num_crtc;
        dcrtc->clk = ERR_PTR(-EINVAL);
        dcrtc->csc_yuv_mode = CSC_AUTO;
        dcrtc->csc_rgb_mode = CSC_AUTO;
@@ -1072,9 +1101,18 @@ int armada_drm_crtc_create(struct drm_device *dev, unsigned num,
                       CFG_PDWN64x66, dcrtc->base + LCD_SPU_SRAM_PARA1);
        writel_relaxed(0x2032ff81, dcrtc->base + LCD_SPU_DMA_CTRL1);
        writel_relaxed(0x00000000, dcrtc->base + LCD_SPU_GRA_OVSA_HPXL_VLN);
+       writel_relaxed(dcrtc->irq_ena, dcrtc->base + LCD_SPU_IRQ_ENA);
+       writel_relaxed(0, dcrtc->base + LCD_SPU_IRQ_ISR);
+
+       ret = devm_request_irq(dev, irq, armada_drm_irq, 0, "armada_drm_crtc",
+                              dcrtc);
+       if (ret < 0) {
+               kfree(dcrtc);
+               return ret;
+       }
 
-       if (priv->variant->crtc_init) {
-               ret = priv->variant->crtc_init(dcrtc);
+       if (dcrtc->variant->init) {
+               ret = dcrtc->variant->init(dcrtc, dev);
                if (ret) {
                        kfree(dcrtc);
                        return ret;
@@ -1086,7 +1124,8 @@ int armada_drm_crtc_create(struct drm_device *dev, unsigned num,
 
        priv->dcrtc[dcrtc->num] = dcrtc;
 
-       drm_crtc_init(dev, &dcrtc->crtc, &armada_crtc_funcs);
+       dcrtc->crtc.port = port;
+       drm_crtc_init(drm, &dcrtc->crtc, &armada_crtc_funcs);
        drm_crtc_helper_add(&dcrtc->crtc, &armada_crtc_helper_funcs);
 
        drm_object_attach_property(&dcrtc->crtc.base, priv->csc_yuv_prop,
@@ -1094,5 +1133,107 @@ int armada_drm_crtc_create(struct drm_device *dev, unsigned num,
        drm_object_attach_property(&dcrtc->crtc.base, priv->csc_rgb_prop,
                                   dcrtc->csc_rgb_mode);
 
-       return armada_overlay_plane_create(dev, 1 << dcrtc->num);
+       return armada_overlay_plane_create(drm, 1 << dcrtc->num);
+}
+
+static int
+armada_lcd_bind(struct device *dev, struct device *master, void *data)
+{
+       struct platform_device *pdev = to_platform_device(dev);
+       struct drm_device *drm = data;
+       struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       int irq = platform_get_irq(pdev, 0);
+       const struct armada_variant *variant;
+       struct device_node *port = NULL;
+
+       if (irq < 0)
+               return irq;
+
+       if (!dev->of_node) {
+               const struct platform_device_id *id;
+
+               id = platform_get_device_id(pdev);
+               if (!id)
+                       return -ENXIO;
+
+               variant = (const struct armada_variant *)id->driver_data;
+       } else {
+               const struct of_device_id *match;
+               struct device_node *np, *parent = dev->of_node;
+
+               match = of_match_device(dev->driver->of_match_table, dev);
+               if (!match)
+                       return -ENXIO;
+
+               np = of_get_child_by_name(parent, "ports");
+               if (np)
+                       parent = np;
+               port = of_get_child_by_name(parent, "port");
+               of_node_put(np);
+               if (!port) {
+                       dev_err(dev, "no port node found in %s\n",
+                               parent->full_name);
+                       return -ENXIO;
+               }
+
+               variant = match->data;
+       }
+
+       return armada_drm_crtc_create(drm, dev, res, irq, variant, port);
+}
+
+static void
+armada_lcd_unbind(struct device *dev, struct device *master, void *data)
+{
+       struct armada_crtc *dcrtc = dev_get_drvdata(dev);
+
+       armada_drm_crtc_destroy(&dcrtc->crtc);
 }
+
+static const struct component_ops armada_lcd_ops = {
+       .bind = armada_lcd_bind,
+       .unbind = armada_lcd_unbind,
+};
+
+static int armada_lcd_probe(struct platform_device *pdev)
+{
+       return component_add(&pdev->dev, &armada_lcd_ops);
+}
+
+static int armada_lcd_remove(struct platform_device *pdev)
+{
+       component_del(&pdev->dev, &armada_lcd_ops);
+       return 0;
+}
+
+static struct of_device_id armada_lcd_of_match[] = {
+       {
+               .compatible     = "marvell,dove-lcd",
+               .data           = &armada510_ops,
+       },
+       {}
+};
+MODULE_DEVICE_TABLE(of, armada_lcd_of_match);
+
+static const struct platform_device_id armada_lcd_platform_ids[] = {
+       {
+               .name           = "armada-lcd",
+               .driver_data    = (unsigned long)&armada510_ops,
+       }, {
+               .name           = "armada-510-lcd",
+               .driver_data    = (unsigned long)&armada510_ops,
+       },
+       { },
+};
+MODULE_DEVICE_TABLE(platform, armada_lcd_platform_ids);
+
+struct platform_driver armada_lcd_platform_driver = {
+       .probe  = armada_lcd_probe,
+       .remove = armada_lcd_remove,
+       .driver = {
+               .name   = "armada-lcd",
+               .owner  =  THIS_MODULE,
+               .of_match_table = armada_lcd_of_match,
+       },
+       .id_table = armada_lcd_platform_ids,
+};
index 9c10a07e74922e05195ec58425371131822d53a5..98102a5a9af578c510dcec186b67dbf6f279007c 100644 (file)
@@ -32,12 +32,15 @@ struct armada_regs {
        armada_reg_queue_mod(_r, _i, 0, 0, ~0)
 
 struct armada_frame_work;
+struct armada_variant;
 
 struct armada_crtc {
        struct drm_crtc         crtc;
+       const struct armada_variant *variant;
        unsigned                num;
        void __iomem            *base;
        struct clk              *clk;
+       struct clk              *extclk[2];
        struct {
                uint32_t        spu_v_h_total;
                uint32_t        spu_v_porch;
@@ -72,12 +75,16 @@ struct armada_crtc {
 };
 #define drm_to_armada_crtc(c) container_of(c, struct armada_crtc, crtc)
 
-int armada_drm_crtc_create(struct drm_device *, unsigned, struct resource *);
+struct device_node;
+int armada_drm_crtc_create(struct drm_device *, struct device *,
+       struct resource *, int, const struct armada_variant *,
+       struct device_node *);
 void armada_drm_crtc_gamma_set(struct drm_crtc *, u16, u16, u16, int);
 void armada_drm_crtc_gamma_get(struct drm_crtc *, u16 *, u16 *, u16 *, int);
-void armada_drm_crtc_irq(struct armada_crtc *, u32);
 void armada_drm_crtc_disable_irq(struct armada_crtc *, u32);
 void armada_drm_crtc_enable_irq(struct armada_crtc *, u32);
 void armada_drm_crtc_update_regs(struct armada_crtc *, struct armada_regs *);
 
+extern struct platform_driver armada_lcd_platform_driver;
+
 #endif
index a72cae03b99b781d7becf0987c91317c3777a65c..ea63c6c7c66f61a36dc9c866f85298d8865cd6bf 100644 (file)
@@ -59,26 +59,23 @@ void armada_drm_vbl_event_remove_unlocked(struct armada_crtc *,
 struct armada_private;
 
 struct armada_variant {
-       bool    has_spu_adv_reg;
+       bool has_spu_adv_reg;
        uint32_t spu_adv_reg;
-       int (*init)(struct armada_private *, struct device *);
-       int (*crtc_init)(struct armada_crtc *);
-       int (*crtc_compute_clock)(struct armada_crtc *,
-                                 const struct drm_display_mode *,
-                                 uint32_t *);
+       int (*init)(struct armada_crtc *, struct device *);
+       int (*compute_clock)(struct armada_crtc *,
+                            const struct drm_display_mode *,
+                            uint32_t *);
 };
 
 /* Variant ops */
 extern const struct armada_variant armada510_ops;
 
 struct armada_private {
-       const struct armada_variant *variant;
        struct work_struct      fb_unref_work;
        DECLARE_KFIFO(fb_unref, struct drm_framebuffer *, 8);
        struct drm_fb_helper    *fbdev;
        struct armada_crtc      *dcrtc[2];
        struct drm_mm           linear;
-       struct clk              *extclk[2];
        struct drm_property     *csc_yuv_prop;
        struct drm_property     *csc_rgb_prop;
        struct drm_property     *colorkey_prop;
index 8ab3cd1a8cdbdad1385a9c9042582e9fff05c855..e2d5792b140fb41069713661612e0853da0e5854 100644 (file)
@@ -6,7 +6,9 @@
  * published by the Free Software Foundation.
  */
 #include <linux/clk.h>
+#include <linux/component.h>
 #include <linux/module.h>
+#include <linux/of_graph.h>
 #include <drm/drmP.h>
 #include <drm/drm_crtc_helper.h>
 #include "armada_crtc.h"
@@ -52,6 +54,11 @@ static const struct armada_drm_slave_config tda19988_config = {
 };
 #endif
 
+static bool is_componentized(struct device *dev)
+{
+       return dev->of_node || dev->platform_data;
+}
+
 static void armada_drm_unref_work(struct work_struct *work)
 {
        struct armada_private *priv =
@@ -85,6 +92,7 @@ void armada_drm_queue_unref_work(struct drm_device *dev,
 static int armada_drm_load(struct drm_device *dev, unsigned long flags)
 {
        const struct platform_device_id *id;
+       const struct armada_variant *variant;
        struct armada_private *priv;
        struct resource *res[ARRAY_SIZE(priv->dcrtc)];
        struct resource *mem = NULL;
@@ -107,7 +115,7 @@ static int armada_drm_load(struct drm_device *dev, unsigned long flags)
                        return -EINVAL;
        }
 
-       if (!res[0] || !mem)
+       if (!mem)
                return -ENXIO;
 
        if (!devm_request_mem_region(dev->dev, mem->start,
@@ -128,11 +136,7 @@ static int armada_drm_load(struct drm_device *dev, unsigned long flags)
        if (!id)
                return -ENXIO;
 
-       priv->variant = (struct armada_variant *)id->driver_data;
-
-       ret = priv->variant->init(priv, dev->dev);
-       if (ret)
-               return ret;
+       variant = (const struct armada_variant *)id->driver_data;
 
        INIT_WORK(&priv->fb_unref_work, armada_drm_unref_work);
        INIT_KFIFO(priv->fb_unref);
@@ -155,40 +159,50 @@ static int armada_drm_load(struct drm_device *dev, unsigned long flags)
 
        /* Create all LCD controllers */
        for (n = 0; n < ARRAY_SIZE(priv->dcrtc); n++) {
+               int irq;
+
                if (!res[n])
                        break;
 
-               ret = armada_drm_crtc_create(dev, n, res[n]);
+               irq = platform_get_irq(dev->platformdev, n);
+               if (irq < 0)
+                       goto err_kms;
+
+               ret = armada_drm_crtc_create(dev, dev->dev, res[n], irq,
+                                            variant, NULL);
                if (ret)
                        goto err_kms;
        }
 
+       if (is_componentized(dev->dev)) {
+               ret = component_bind_all(dev->dev, dev);
+               if (ret)
+                       goto err_kms;
+       } else {
 #ifdef CONFIG_DRM_ARMADA_TDA1998X
-       ret = armada_drm_connector_slave_create(dev, &tda19988_config);
-       if (ret)
-               goto err_kms;
+               ret = armada_drm_connector_slave_create(dev, &tda19988_config);
+               if (ret)
+                       goto err_kms;
 #endif
+       }
 
-       ret = drm_vblank_init(dev, n);
-       if (ret)
-               goto err_kms;
-
-       ret = drm_irq_install(dev, platform_get_irq(dev->platformdev, 0));
+       ret = drm_vblank_init(dev, dev->mode_config.num_crtc);
        if (ret)
-               goto err_kms;
+               goto err_comp;
 
        dev->vblank_disable_allowed = 1;
 
        ret = armada_fbdev_init(dev);
        if (ret)
-               goto err_irq;
+               goto err_comp;
 
        drm_kms_helper_poll_init(dev);
 
        return 0;
 
- err_irq:
-       drm_irq_uninstall(dev);
+ err_comp:
+       if (is_componentized(dev->dev))
+               component_unbind_all(dev->dev, dev);
  err_kms:
        drm_mode_config_cleanup(dev);
        drm_mm_takedown(&priv->linear);
@@ -203,7 +217,10 @@ static int armada_drm_unload(struct drm_device *dev)
 
        drm_kms_helper_poll_fini(dev);
        armada_fbdev_fini(dev);
-       drm_irq_uninstall(dev);
+
+       if (is_componentized(dev->dev))
+               component_unbind_all(dev->dev, dev);
+
        drm_mode_config_cleanup(dev);
        drm_mm_takedown(&priv->linear);
        flush_work(&priv->fb_unref_work);
@@ -259,52 +276,6 @@ static void armada_drm_disable_vblank(struct drm_device *dev, int crtc)
        armada_drm_crtc_disable_irq(priv->dcrtc[crtc], VSYNC_IRQ_ENA);
 }
 
-static irqreturn_t armada_drm_irq_handler(int irq, void *arg)
-{
-       struct drm_device *dev = arg;
-       struct armada_private *priv = dev->dev_private;
-       struct armada_crtc *dcrtc = priv->dcrtc[0];
-       uint32_t v, stat = readl_relaxed(dcrtc->base + LCD_SPU_IRQ_ISR);
-       irqreturn_t handled = IRQ_NONE;
-
-       /*
-        * This is rediculous - rather than writing bits to clear, we
-        * have to set the actual status register value.  This is racy.
-        */
-       writel_relaxed(0, dcrtc->base + LCD_SPU_IRQ_ISR);
-
-       /* Mask out those interrupts we haven't enabled */
-       v = stat & dcrtc->irq_ena;
-
-       if (v & (VSYNC_IRQ|GRA_FRAME_IRQ|DUMB_FRAMEDONE)) {
-               armada_drm_crtc_irq(dcrtc, stat);
-               handled = IRQ_HANDLED;
-       }
-
-       return handled;
-}
-
-static int armada_drm_irq_postinstall(struct drm_device *dev)
-{
-       struct armada_private *priv = dev->dev_private;
-       struct armada_crtc *dcrtc = priv->dcrtc[0];
-
-       spin_lock_irq(&dev->vbl_lock);
-       writel_relaxed(dcrtc->irq_ena, dcrtc->base + LCD_SPU_IRQ_ENA);
-       writel(0, dcrtc->base + LCD_SPU_IRQ_ISR);
-       spin_unlock_irq(&dev->vbl_lock);
-
-       return 0;
-}
-
-static void armada_drm_irq_uninstall(struct drm_device *dev)
-{
-       struct armada_private *priv = dev->dev_private;
-       struct armada_crtc *dcrtc = priv->dcrtc[0];
-
-       writel(0, dcrtc->base + LCD_SPU_IRQ_ENA);
-}
-
 static struct drm_ioctl_desc armada_ioctls[] = {
        DRM_IOCTL_DEF_DRV(ARMADA_GEM_CREATE, armada_gem_create_ioctl,
                DRM_UNLOCKED),
@@ -340,9 +311,6 @@ static struct drm_driver armada_drm_driver = {
        .get_vblank_counter     = drm_vblank_count,
        .enable_vblank          = armada_drm_enable_vblank,
        .disable_vblank         = armada_drm_disable_vblank,
-       .irq_handler            = armada_drm_irq_handler,
-       .irq_postinstall        = armada_drm_irq_postinstall,
-       .irq_uninstall          = armada_drm_irq_uninstall,
 #ifdef CONFIG_DEBUG_FS
        .debugfs_init           = armada_drm_debugfs_init,
        .debugfs_cleanup        = armada_drm_debugfs_cleanup,
@@ -362,19 +330,140 @@ static struct drm_driver armada_drm_driver = {
        .desc                   = "Armada SoC DRM",
        .date                   = "20120730",
        .driver_features        = DRIVER_GEM | DRIVER_MODESET |
-                                 DRIVER_HAVE_IRQ | DRIVER_PRIME,
+                                 DRIVER_PRIME,
        .ioctls                 = armada_ioctls,
        .fops                   = &armada_drm_fops,
 };
 
+static int armada_drm_bind(struct device *dev)
+{
+       return drm_platform_init(&armada_drm_driver, to_platform_device(dev));
+}
+
+static void armada_drm_unbind(struct device *dev)
+{
+       drm_put_dev(dev_get_drvdata(dev));
+}
+
+static int compare_of(struct device *dev, void *data)
+{
+       return dev->of_node == data;
+}
+
+static int compare_dev_name(struct device *dev, void *data)
+{
+       const char *name = data;
+       return !strcmp(dev_name(dev), name);
+}
+
+static void armada_add_endpoints(struct device *dev,
+       struct component_match **match, struct device_node *port)
+{
+       struct device_node *ep, *remote;
+
+       for_each_child_of_node(port, ep) {
+               remote = of_graph_get_remote_port_parent(ep);
+               if (!remote || !of_device_is_available(remote)) {
+                       of_node_put(remote);
+                       continue;
+               } else if (!of_device_is_available(remote->parent)) {
+                       dev_warn(dev, "parent device of %s is not available\n",
+                                remote->full_name);
+                       of_node_put(remote);
+                       continue;
+               }
+
+               component_match_add(dev, match, compare_of, remote);
+               of_node_put(remote);
+       }
+}
+
+static int armada_drm_find_components(struct device *dev,
+       struct component_match **match)
+{
+       struct device_node *port;
+       int i;
+
+       if (dev->of_node) {
+               struct device_node *np = dev->of_node;
+
+               for (i = 0; ; i++) {
+                       port = of_parse_phandle(np, "ports", i);
+                       if (!port)
+                               break;
+
+                       component_match_add(dev, match, compare_of, port);
+                       of_node_put(port);
+               }
+
+               if (i == 0) {
+                       dev_err(dev, "missing 'ports' property\n");
+                       return -ENODEV;
+               }
+
+               for (i = 0; ; i++) {
+                       port = of_parse_phandle(np, "ports", i);
+                       if (!port)
+                               break;
+
+                       armada_add_endpoints(dev, match, port);
+                       of_node_put(port);
+               }
+       } else if (dev->platform_data) {
+               char **devices = dev->platform_data;
+               struct device *d;
+
+               for (i = 0; devices[i]; i++)
+                       component_match_add(dev, match, compare_dev_name,
+                                           devices[i]);
+
+               if (i == 0) {
+                       dev_err(dev, "missing 'ports' property\n");
+                       return -ENODEV;
+               }
+
+               for (i = 0; devices[i]; i++) {
+                       d = bus_find_device_by_name(&platform_bus_type, NULL,
+                                       devices[i]);
+                       if (d && d->of_node) {
+                               for_each_child_of_node(d->of_node, port)
+                                       armada_add_endpoints(dev, match, port);
+                       }
+                       put_device(d);
+               }
+       }
+
+       return 0;
+}
+
+static const struct component_master_ops armada_master_ops = {
+       .bind = armada_drm_bind,
+       .unbind = armada_drm_unbind,
+};
+
 static int armada_drm_probe(struct platform_device *pdev)
 {
-       return drm_platform_init(&armada_drm_driver, pdev);
+       if (is_componentized(&pdev->dev)) {
+               struct component_match *match = NULL;
+               int ret;
+
+               ret = armada_drm_find_components(&pdev->dev, &match);
+               if (ret < 0)
+                       return ret;
+
+               return component_master_add_with_match(&pdev->dev,
+                               &armada_master_ops, match);
+       } else {
+               return drm_platform_init(&armada_drm_driver, pdev);
+       }
 }
 
 static int armada_drm_remove(struct platform_device *pdev)
 {
-       drm_put_dev(platform_get_drvdata(pdev));
+       if (is_componentized(&pdev->dev))
+               component_master_del(&pdev->dev, &armada_master_ops);
+       else
+               drm_put_dev(platform_get_drvdata(pdev));
        return 0;
 }
 
@@ -402,14 +491,24 @@ static struct platform_driver armada_drm_platform_driver = {
 
 static int __init armada_drm_init(void)
 {
+       int ret;
+
        armada_drm_driver.num_ioctls = ARRAY_SIZE(armada_ioctls);
-       return platform_driver_register(&armada_drm_platform_driver);
+
+       ret = platform_driver_register(&armada_lcd_platform_driver);
+       if (ret)
+               return ret;
+       ret = platform_driver_register(&armada_drm_platform_driver);
+       if (ret)
+               platform_driver_unregister(&armada_lcd_platform_driver);
+       return ret;
 }
 module_init(armada_drm_init);
 
 static void __exit armada_drm_exit(void)
 {
        platform_driver_unregister(&armada_drm_platform_driver);
+       platform_driver_unregister(&armada_lcd_platform_driver);
 }
 module_exit(armada_drm_exit);
 
index fd166f532ab94f30f2bc3b0d9eff226ea9a07fd7..7838e731b0de1be856af431aa3848013a3492e09 100644 (file)
@@ -131,7 +131,7 @@ static int armada_fb_probe(struct drm_fb_helper *fbh,
        return ret;
 }
 
-static struct drm_fb_helper_funcs armada_fb_helper_funcs = {
+static const struct drm_fb_helper_funcs armada_fb_helper_funcs = {
        .gamma_set      = armada_drm_crtc_gamma_set,
        .gamma_get      = armada_drm_crtc_gamma_get,
        .fb_probe       = armada_fb_probe,
@@ -149,7 +149,7 @@ int armada_fbdev_init(struct drm_device *dev)
 
        priv->fbdev = fbh;
 
-       fbh->funcs = &armada_fb_helper_funcs;
+       drm_fb_helper_prepare(dev, fbh, &armada_fb_helper_funcs);
 
        ret = drm_fb_helper_init(dev, fbh, 1, 1);
        if (ret) {
index d685a5421485fde0280b3ad5db8eab90a7f5ab3f..abbc309fe539e9d917464980b344e30ed3a1d58f 100644 (file)
@@ -48,7 +48,7 @@ static void armada_drm_connector_destroy(struct drm_connector *conn)
 {
        struct armada_connector *dconn = drm_to_armada_conn(conn);
 
-       drm_sysfs_connector_remove(conn);
+       drm_connector_unregister(conn);
        drm_connector_cleanup(conn);
        kfree(dconn);
 }
@@ -141,7 +141,7 @@ int armada_output_create(struct drm_device *dev,
        if (ret)
                goto err_conn;
 
-       ret = drm_sysfs_connector_add(&dconn->conn);
+       ret = drm_connector_register(&dconn->conn);
        if (ret)
                goto err_sysfs;
 
index 5d6a87573c339d14eef728ae3edf690b096c6ddc..957d4fabf1e1c2c8e58348a9af7f6ba6fcdd63c6 100644 (file)
@@ -362,7 +362,7 @@ static inline int ast_bo_reserve(struct ast_bo *bo, bool no_wait)
 {
        int ret;
 
-       ret = ttm_bo_reserve(&bo->bo, true, no_wait, false, 0);
+       ret = ttm_bo_reserve(&bo->bo, true, no_wait, false, NULL);
        if (ret) {
                if (ret != -ERESTARTSYS && ret != -EBUSY)
                        DRM_ERROR("reserve failed %p\n", bo);
index a28640f47c2749e5848d129af85673fd8ccbc973..cba45c77455279ff0aaaad8974e815b06e9b9f5c 100644 (file)
@@ -287,7 +287,7 @@ static void ast_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green,
        *blue = ast_crtc->lut_b[regno] << 8;
 }
 
-static struct drm_fb_helper_funcs ast_fb_helper_funcs = {
+static const struct drm_fb_helper_funcs ast_fb_helper_funcs = {
        .gamma_set = ast_fb_gamma_set,
        .gamma_get = ast_fb_gamma_get,
        .fb_probe = astfb_create,
@@ -328,8 +328,10 @@ int ast_fbdev_init(struct drm_device *dev)
                return -ENOMEM;
 
        ast->fbdev = afbdev;
-       afbdev->helper.funcs = &ast_fb_helper_funcs;
        spin_lock_init(&afbdev->dirty_lock);
+
+       drm_fb_helper_prepare(dev, &afbdev->helper, &ast_fb_helper_funcs);
+
        ret = drm_fb_helper_init(dev, &afbdev->helper,
                                 1, 1);
        if (ret) {
index 114aee941d46b417f87a7aad1c20502374873ef8..5389350244f216fac07c5d98723ee2632c627e89 100644 (file)
@@ -667,17 +667,9 @@ static void ast_encoder_destroy(struct drm_encoder *encoder)
 static struct drm_encoder *ast_best_single_encoder(struct drm_connector *connector)
 {
        int enc_id = connector->encoder_ids[0];
-       struct drm_mode_object *obj;
-       struct drm_encoder *encoder;
-
        /* pick the encoder ids */
-       if (enc_id) {
-               obj = drm_mode_object_find(connector->dev, enc_id, DRM_MODE_OBJECT_ENCODER);
-               if (!obj)
-                       return NULL;
-               encoder = obj_to_encoder(obj);
-               return encoder;
-       }
+       if (enc_id)
+               return drm_encoder_find(connector->dev, enc_id);
        return NULL;
 }
 
@@ -829,7 +821,7 @@ static void ast_connector_destroy(struct drm_connector *connector)
 {
        struct ast_connector *ast_connector = to_ast_connector(connector);
        ast_i2c_destroy(ast_connector->i2c);
-       drm_sysfs_connector_remove(connector);
+       drm_connector_unregister(connector);
        drm_connector_cleanup(connector);
        kfree(connector);
 }
@@ -871,7 +863,7 @@ static int ast_connector_init(struct drm_device *dev)
        connector->interlace_allowed = 0;
        connector->doublescan_allowed = 0;
 
-       drm_sysfs_connector_add(connector);
+       drm_connector_register(connector);
 
        connector->polled = DRM_CONNECTOR_POLL_CONNECT;
 
index 9c13df29fd20ea2306f3d4b57369d9ce971566ec..f5e0ead974a638af3b997ecff8eb146740dc5bb9 100644 (file)
@@ -97,6 +97,7 @@ static struct drm_driver bochs_driver = {
 /* ---------------------------------------------------------------------- */
 /* pm interface                                                           */
 
+#ifdef CONFIG_PM_SLEEP
 static int bochs_pm_suspend(struct device *dev)
 {
        struct pci_dev *pdev = to_pci_dev(dev);
@@ -131,6 +132,7 @@ static int bochs_pm_resume(struct device *dev)
        drm_kms_helper_poll_enable(drm_dev);
        return 0;
 }
+#endif
 
 static const struct dev_pm_ops bochs_pm_ops = {
        SET_SYSTEM_SLEEP_PM_OPS(bochs_pm_suspend,
index 561b84474122a05e112ffafde7341e8a85f284ad..fe95d31cd1101118ab8be6174621fbd4692526f9 100644 (file)
@@ -72,7 +72,7 @@ static int bochsfb_create(struct drm_fb_helper *helper,
 
        bo = gem_to_bochs_bo(gobj);
 
-       ret = ttm_bo_reserve(&bo->bo, true, false, false, 0);
+       ret = ttm_bo_reserve(&bo->bo, true, false, false, NULL);
        if (ret)
                return ret;
 
@@ -179,7 +179,7 @@ void bochs_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green,
        *blue  = regno;
 }
 
-static struct drm_fb_helper_funcs bochs_fb_helper_funcs = {
+static const struct drm_fb_helper_funcs bochs_fb_helper_funcs = {
        .gamma_set = bochs_fb_gamma_set,
        .gamma_get = bochs_fb_gamma_get,
        .fb_probe = bochsfb_create,
@@ -189,7 +189,8 @@ int bochs_fbdev_init(struct bochs_device *bochs)
 {
        int ret;
 
-       bochs->fb.helper.funcs = &bochs_fb_helper_funcs;
+       drm_fb_helper_prepare(bochs->dev, &bochs->fb.helper,
+                             &bochs_fb_helper_funcs);
 
        ret = drm_fb_helper_init(bochs->dev, &bochs->fb.helper,
                                 1, 1);
index dcf2e55f4ae91e2ded094d156899c2815c0a00bf..9d7346b92653436ab6e753a2802c4ad6652279aa 100644 (file)
@@ -53,7 +53,7 @@ static int bochs_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
        if (old_fb) {
                bochs_fb = to_bochs_framebuffer(old_fb);
                bo = gem_to_bochs_bo(bochs_fb->obj);
-               ret = ttm_bo_reserve(&bo->bo, true, false, false, 0);
+               ret = ttm_bo_reserve(&bo->bo, true, false, false, NULL);
                if (ret) {
                        DRM_ERROR("failed to reserve old_fb bo\n");
                } else {
@@ -67,7 +67,7 @@ static int bochs_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
 
        bochs_fb = to_bochs_framebuffer(crtc->primary->fb);
        bo = gem_to_bochs_bo(bochs_fb->obj);
-       ret = ttm_bo_reserve(&bo->bo, true, false, false, 0);
+       ret = ttm_bo_reserve(&bo->bo, true, false, false, NULL);
        if (ret)
                return ret;
 
@@ -216,18 +216,9 @@ static struct drm_encoder *
 bochs_connector_best_encoder(struct drm_connector *connector)
 {
        int enc_id = connector->encoder_ids[0];
-       struct drm_mode_object *obj;
-       struct drm_encoder *encoder;
-
        /* pick the encoder ids */
-       if (enc_id) {
-               obj = drm_mode_object_find(connector->dev, enc_id,
-                                          DRM_MODE_OBJECT_ENCODER);
-               if (!obj)
-                       return NULL;
-               encoder = obj_to_encoder(obj);
-               return encoder;
-       }
+       if (enc_id)
+               return drm_encoder_find(connector->dev, enc_id);
        return NULL;
 }
 
index b9a695d92792ee224868d3f9f9ce32e0475d48c8..1728a1b0b81376ed43e7f39fb5f863cba7563166 100644 (file)
@@ -387,7 +387,7 @@ int bochs_gem_create(struct drm_device *dev, u32 size, bool iskernel,
 
        *obj = NULL;
 
-       size = ALIGN(size, PAGE_SIZE);
+       size = PAGE_ALIGN(size);
        if (size == 0)
                return -EINVAL;
 
index 98fd17ae491690b3f63de688dae611bf617b529a..d466696ed5e8ca00211988e3952c4d872ba2150b 100644 (file)
@@ -328,7 +328,7 @@ int ptn3460_init(struct drm_device *dev, struct drm_encoder *encoder,
        }
        drm_connector_helper_add(&ptn_bridge->connector,
                        &ptn3460_connector_helper_funcs);
-       drm_sysfs_connector_add(&ptn_bridge->connector);
+       drm_connector_register(&ptn_bridge->connector);
        drm_mode_connector_attach_encoder(&ptn_bridge->connector, encoder);
 
        return 0;
index 08ce520f61a5aa4f43823a3cc8fa30ce47315067..4516b052cc67f7e1b7f09452efdeb19a561880db 100644 (file)
@@ -76,6 +76,7 @@ static void cirrus_pci_remove(struct pci_dev *pdev)
        drm_put_dev(dev);
 }
 
+#ifdef CONFIG_PM_SLEEP
 static int cirrus_pm_suspend(struct device *dev)
 {
        struct pci_dev *pdev = to_pci_dev(dev);
@@ -110,6 +111,7 @@ static int cirrus_pm_resume(struct device *dev)
        drm_kms_helper_poll_enable(drm_dev);
        return 0;
 }
+#endif
 
 static const struct file_operations cirrus_driver_fops = {
        .owner = THIS_MODULE,
index 117d3eca5e3782e5db3571a968d8e92111c1da4c..401c890b6c6a817011923215706a9f2e259d4d71 100644 (file)
@@ -241,7 +241,7 @@ static inline int cirrus_bo_reserve(struct cirrus_bo *bo, bool no_wait)
 {
        int ret;
 
-       ret = ttm_bo_reserve(&bo->bo, true, no_wait, false, 0);
+       ret = ttm_bo_reserve(&bo->bo, true, no_wait, false, NULL);
        if (ret) {
                if (ret != -ERESTARTSYS && ret != -EBUSY)
                        DRM_ERROR("reserve failed %p\n", bo);
index 32bbba0a787bc9e85d68556756c62771b06c5adb..2a135f253e2930dd4d06da29b1a6a0da166969a6 100644 (file)
@@ -288,7 +288,7 @@ static int cirrus_fbdev_destroy(struct drm_device *dev,
        return 0;
 }
 
-static struct drm_fb_helper_funcs cirrus_fb_helper_funcs = {
+static const struct drm_fb_helper_funcs cirrus_fb_helper_funcs = {
        .gamma_set = cirrus_crtc_fb_gamma_set,
        .gamma_get = cirrus_crtc_fb_gamma_get,
        .fb_probe = cirrusfb_create,
@@ -306,9 +306,11 @@ int cirrus_fbdev_init(struct cirrus_device *cdev)
                return -ENOMEM;
 
        cdev->mode_info.gfbdev = gfbdev;
-       gfbdev->helper.funcs = &cirrus_fb_helper_funcs;
        spin_lock_init(&gfbdev->dirty_lock);
 
+       drm_fb_helper_prepare(cdev->dev, &gfbdev->helper,
+                             &cirrus_fb_helper_funcs);
+
        ret = drm_fb_helper_init(cdev->dev, &gfbdev->helper,
                                 cdev->num_crtc, CIRRUSFB_CONN_LIMIT);
        if (ret) {
index 49332c5fe35b04a763923f3c44376276ec989338..e1c5c322212901beb63cc8757305fc18efd9a4ef 100644 (file)
@@ -509,19 +509,9 @@ static struct drm_encoder *cirrus_connector_best_encoder(struct drm_connector
                                                  *connector)
 {
        int enc_id = connector->encoder_ids[0];
-       struct drm_mode_object *obj;
-       struct drm_encoder *encoder;
-
        /* pick the encoder ids */
-       if (enc_id) {
-               obj =
-                   drm_mode_object_find(connector->dev, enc_id,
-                                        DRM_MODE_OBJECT_ENCODER);
-               if (!obj)
-                       return NULL;
-               encoder = obj_to_encoder(obj);
-               return encoder;
-       }
+       if (enc_id)
+               return drm_encoder_find(connector->dev, enc_id);
        return NULL;
 }
 
index 0406110f83edd2ac3f607fe575c8e7b6c491e88a..86a4a4a60afcd79a052856275690ac088a4ff7c2 100644 (file)
@@ -80,11 +80,7 @@ int drm_buffer_alloc(struct drm_buffer **buf, int size)
 
 error_out:
 
-       /* Only last element can be null pointer so check for it first. */
-       if ((*buf)->data[idx])
-               kfree((*buf)->data[idx]);
-
-       for (--idx; idx >= 0; --idx)
+       for (; idx >= 0; --idx)
                kfree((*buf)->data[idx]);
 
        kfree(*buf);
index 68175b54504bf1518b294402b824666c19c60b6f..61acb8f6756d1f14caca006cd48e88ab8c6786c6 100644 (file)
@@ -1217,7 +1217,6 @@ int drm_infobufs(struct drm_device *dev, void *data,
                                struct drm_buf_desc __user *to =
                                    &request->list[count];
                                struct drm_buf_entry *from = &dma->bufs[i];
-                               struct drm_freelist *list = &dma->bufs[i].freelist;
                                if (copy_to_user(&to->count,
                                                 &from->buf_count,
                                                 sizeof(from->buf_count)) ||
@@ -1225,19 +1224,19 @@ int drm_infobufs(struct drm_device *dev, void *data,
                                                 &from->buf_size,
                                                 sizeof(from->buf_size)) ||
                                    copy_to_user(&to->low_mark,
-                                                &list->low_mark,
-                                                sizeof(list->low_mark)) ||
+                                                &from->low_mark,
+                                                sizeof(from->low_mark)) ||
                                    copy_to_user(&to->high_mark,
-                                                &list->high_mark,
-                                                sizeof(list->high_mark)))
+                                                &from->high_mark,
+                                                sizeof(from->high_mark)))
                                        return -EFAULT;
 
                                DRM_DEBUG("%d %d %d %d %d\n",
                                          i,
                                          dma->bufs[i].buf_count,
                                          dma->bufs[i].buf_size,
-                                         dma->bufs[i].freelist.low_mark,
-                                         dma->bufs[i].freelist.high_mark);
+                                         dma->bufs[i].low_mark,
+                                         dma->bufs[i].high_mark);
                                ++count;
                        }
                }
@@ -1290,8 +1289,8 @@ int drm_markbufs(struct drm_device *dev, void *data,
        if (request->high_mark < 0 || request->high_mark > entry->buf_count)
                return -EINVAL;
 
-       entry->freelist.low_mark = request->low_mark;
-       entry->freelist.high_mark = request->high_mark;
+       entry->low_mark = request->low_mark;
+       entry->high_mark = request->high_mark;
 
        return 0;
 }
index a4b017b6849efd79686693e0e5cad7b5edf9ae09..9b23525c0ed043f0220760010c2584e86ed163f6 100644 (file)
@@ -1,18 +1,13 @@
-/**
- * \file drm_context.c
- * IOCTLs for generic contexts
- *
- * \author Rickard E. (Rik) Faith <faith@valinux.com>
- * \author Gareth Hughes <gareth@valinux.com>
- */
-
 /*
- * Created: Fri Nov 24 18:31:37 2000 by gareth@valinux.com
+ * Legacy: Generic DRM Contexts
  *
  * Copyright 1999, 2000 Precision Insight, Inc., Cedar Park, Texas.
  * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
  * All Rights Reserved.
  *
+ * Author: Rickard E. (Rik) Faith <faith@valinux.com>
+ * Author: Gareth Hughes <gareth@valinux.com>
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
  * OTHER DEALINGS IN THE SOFTWARE.
  */
 
-/*
- * ChangeLog:
- *  2001-11-16 Torsten Duwe <duwe@caldera.de>
- *             added context constructor/destructor hooks,
- *             needed by SiS driver's memory management.
- */
-
 #include <drm/drmP.h>
+#include "drm_legacy.h"
+
+struct drm_ctx_list {
+       struct list_head head;
+       drm_context_t handle;
+       struct drm_file *tag;
+};
 
 /******************************************************************/
 /** \name Context bitmap support */
@@ -56,7 +51,7 @@
  * in drm_device::ctx_idr, while holding the drm_device::struct_mutex
  * lock.
  */
-void drm_ctxbitmap_free(struct drm_device * dev, int ctx_handle)
+void drm_legacy_ctxbitmap_free(struct drm_device * dev, int ctx_handle)
 {
        mutex_lock(&dev->struct_mutex);
        idr_remove(&dev->ctx_idr, ctx_handle);
@@ -72,7 +67,7 @@ void drm_ctxbitmap_free(struct drm_device * dev, int ctx_handle)
  * Allocate a new idr from drm_device::ctx_idr while holding the
  * drm_device::struct_mutex lock.
  */
-static int drm_ctxbitmap_next(struct drm_device * dev)
+static int drm_legacy_ctxbitmap_next(struct drm_device * dev)
 {
        int ret;
 
@@ -90,7 +85,7 @@ static int drm_ctxbitmap_next(struct drm_device * dev)
  *
  * Initialise the drm_device::ctx_idr
  */
-int drm_ctxbitmap_init(struct drm_device * dev)
+int drm_legacy_ctxbitmap_init(struct drm_device * dev)
 {
        idr_init(&dev->ctx_idr);
        return 0;
@@ -104,13 +99,43 @@ int drm_ctxbitmap_init(struct drm_device * dev)
  * Free all idr members using drm_ctx_sarea_free helper function
  * while holding the drm_device::struct_mutex lock.
  */
-void drm_ctxbitmap_cleanup(struct drm_device * dev)
+void drm_legacy_ctxbitmap_cleanup(struct drm_device * dev)
 {
        mutex_lock(&dev->struct_mutex);
        idr_destroy(&dev->ctx_idr);
        mutex_unlock(&dev->struct_mutex);
 }
 
+/**
+ * drm_ctxbitmap_flush() - Flush all contexts owned by a file
+ * @dev: DRM device to operate on
+ * @file: Open file to flush contexts for
+ *
+ * This iterates over all contexts on @dev and drops them if they're owned by
+ * @file. Note that after this call returns, new contexts might be added if
+ * the file is still alive.
+ */
+void drm_legacy_ctxbitmap_flush(struct drm_device *dev, struct drm_file *file)
+{
+       struct drm_ctx_list *pos, *tmp;
+
+       mutex_lock(&dev->ctxlist_mutex);
+
+       list_for_each_entry_safe(pos, tmp, &dev->ctxlist, head) {
+               if (pos->tag == file &&
+                   pos->handle != DRM_KERNEL_CONTEXT) {
+                       if (dev->driver->context_dtor)
+                               dev->driver->context_dtor(dev, pos->handle);
+
+                       drm_legacy_ctxbitmap_free(dev, pos->handle);
+                       list_del(&pos->head);
+                       kfree(pos);
+               }
+       }
+
+       mutex_unlock(&dev->ctxlist_mutex);
+}
+
 /*@}*/
 
 /******************************************************************/
@@ -129,8 +154,8 @@ void drm_ctxbitmap_cleanup(struct drm_device * dev)
  * Gets the map from drm_device::ctx_idr with the handle specified and
  * returns its handle.
  */
-int drm_getsareactx(struct drm_device *dev, void *data,
-                   struct drm_file *file_priv)
+int drm_legacy_getsareactx(struct drm_device *dev, void *data,
+                          struct drm_file *file_priv)
 {
        struct drm_ctx_priv_map *request = data;
        struct drm_local_map *map;
@@ -173,8 +198,8 @@ int drm_getsareactx(struct drm_device *dev, void *data,
  * Searches the mapping specified in \p arg and update the entry in
  * drm_device::ctx_idr with it.
  */
-int drm_setsareactx(struct drm_device *dev, void *data,
-                   struct drm_file *file_priv)
+int drm_legacy_setsareactx(struct drm_device *dev, void *data,
+                          struct drm_file *file_priv)
 {
        struct drm_ctx_priv_map *request = data;
        struct drm_local_map *map = NULL;
@@ -273,8 +298,8 @@ static int drm_context_switch_complete(struct drm_device *dev,
  * \param arg user argument pointing to a drm_ctx_res structure.
  * \return zero on success or a negative number on failure.
  */
-int drm_resctx(struct drm_device *dev, void *data,
-              struct drm_file *file_priv)
+int drm_legacy_resctx(struct drm_device *dev, void *data,
+                     struct drm_file *file_priv)
 {
        struct drm_ctx_res *res = data;
        struct drm_ctx ctx;
@@ -304,16 +329,16 @@ int drm_resctx(struct drm_device *dev, void *data,
  *
  * Get a new handle for the context and copy to userspace.
  */
-int drm_addctx(struct drm_device *dev, void *data,
-              struct drm_file *file_priv)
+int drm_legacy_addctx(struct drm_device *dev, void *data,
+                     struct drm_file *file_priv)
 {
        struct drm_ctx_list *ctx_entry;
        struct drm_ctx *ctx = data;
 
-       ctx->handle = drm_ctxbitmap_next(dev);
+       ctx->handle = drm_legacy_ctxbitmap_next(dev);
        if (ctx->handle == DRM_KERNEL_CONTEXT) {
                /* Skip kernel's context and get a new one. */
-               ctx->handle = drm_ctxbitmap_next(dev);
+               ctx->handle = drm_legacy_ctxbitmap_next(dev);
        }
        DRM_DEBUG("%d\n", ctx->handle);
        if (ctx->handle == -1) {
@@ -348,7 +373,8 @@ int drm_addctx(struct drm_device *dev, void *data,
  * \param arg user argument pointing to a drm_ctx structure.
  * \return zero on success or a negative number on failure.
  */
-int drm_getctx(struct drm_device *dev, void *data, struct drm_file *file_priv)
+int drm_legacy_getctx(struct drm_device *dev, void *data,
+                     struct drm_file *file_priv)
 {
        struct drm_ctx *ctx = data;
 
@@ -369,8 +395,8 @@ int drm_getctx(struct drm_device *dev, void *data, struct drm_file *file_priv)
  *
  * Calls context_switch().
  */
-int drm_switchctx(struct drm_device *dev, void *data,
-                 struct drm_file *file_priv)
+int drm_legacy_switchctx(struct drm_device *dev, void *data,
+                        struct drm_file *file_priv)
 {
        struct drm_ctx *ctx = data;
 
@@ -389,8 +415,8 @@ int drm_switchctx(struct drm_device *dev, void *data,
  *
  * Calls context_switch_complete().
  */
-int drm_newctx(struct drm_device *dev, void *data,
-              struct drm_file *file_priv)
+int drm_legacy_newctx(struct drm_device *dev, void *data,
+                     struct drm_file *file_priv)
 {
        struct drm_ctx *ctx = data;
 
@@ -411,8 +437,8 @@ int drm_newctx(struct drm_device *dev, void *data,
  *
  * If not the special kernel context, calls ctxbitmap_free() to free the specified context.
  */
-int drm_rmctx(struct drm_device *dev, void *data,
-             struct drm_file *file_priv)
+int drm_legacy_rmctx(struct drm_device *dev, void *data,
+                    struct drm_file *file_priv)
 {
        struct drm_ctx *ctx = data;
 
@@ -420,7 +446,7 @@ int drm_rmctx(struct drm_device *dev, void *data,
        if (ctx->handle != DRM_KERNEL_CONTEXT) {
                if (dev->driver->context_dtor)
                        dev->driver->context_dtor(dev, ctx->handle);
-               drm_ctxbitmap_free(dev, ctx->handle);
+               drm_legacy_ctxbitmap_free(dev, ctx->handle);
        }
 
        mutex_lock(&dev->ctxlist_mutex);
index fe94cc10cd350f8dcf06f989f7f131fb392771a9..fa2be249999c70711e1b19cbe0df92fd5e081631 100644 (file)
 
 #include "drm_crtc_internal.h"
 
+static struct drm_framebuffer *add_framebuffer_internal(struct drm_device *dev,
+                                                       struct drm_mode_fb_cmd2 *r,
+                                                       struct drm_file *file_priv);
+
 /**
  * drm_modeset_lock_all - take all modeset locks
  * @dev: drm device
@@ -178,6 +182,12 @@ static const struct drm_prop_enum_list drm_scaling_mode_enum_list[] =
        { DRM_MODE_SCALE_ASPECT, "Full aspect" },
 };
 
+static const struct drm_prop_enum_list drm_aspect_ratio_enum_list[] = {
+       { DRM_MODE_PICTURE_ASPECT_NONE, "Automatic" },
+       { DRM_MODE_PICTURE_ASPECT_4_3, "4:3" },
+       { DRM_MODE_PICTURE_ASPECT_16_9, "16:9" },
+};
+
 /*
  * Non-global properties, but "required" for certain connectors.
  */
@@ -357,6 +367,32 @@ const char *drm_get_format_name(uint32_t format)
 }
 EXPORT_SYMBOL(drm_get_format_name);
 
+/*
+ * Internal function to assign a slot in the object idr and optionally
+ * register the object into the idr.
+ */
+static int drm_mode_object_get_reg(struct drm_device *dev,
+                                  struct drm_mode_object *obj,
+                                  uint32_t obj_type,
+                                  bool register_obj)
+{
+       int ret;
+
+       mutex_lock(&dev->mode_config.idr_mutex);
+       ret = idr_alloc(&dev->mode_config.crtc_idr, register_obj ? obj : NULL, 1, 0, GFP_KERNEL);
+       if (ret >= 0) {
+               /*
+                * Set up the object linking under the protection of the idr
+                * lock so that other users can't see inconsistent state.
+                */
+               obj->id = ret;
+               obj->type = obj_type;
+       }
+       mutex_unlock(&dev->mode_config.idr_mutex);
+
+       return ret < 0 ? ret : 0;
+}
+
 /**
  * drm_mode_object_get - allocate a new modeset identifier
  * @dev: DRM device
@@ -375,21 +411,15 @@ EXPORT_SYMBOL(drm_get_format_name);
 int drm_mode_object_get(struct drm_device *dev,
                        struct drm_mode_object *obj, uint32_t obj_type)
 {
-       int ret;
+       return drm_mode_object_get_reg(dev, obj, obj_type, true);
+}
 
+static void drm_mode_object_register(struct drm_device *dev,
+                                    struct drm_mode_object *obj)
+{
        mutex_lock(&dev->mode_config.idr_mutex);
-       ret = idr_alloc(&dev->mode_config.crtc_idr, obj, 1, 0, GFP_KERNEL);
-       if (ret >= 0) {
-               /*
-                * Set up the object linking under the protection of the idr
-                * lock so that other users can't see inconsistent state.
-                */
-               obj->id = ret;
-               obj->type = obj_type;
-       }
+       idr_replace(&dev->mode_config.crtc_idr, obj, obj->id);
        mutex_unlock(&dev->mode_config.idr_mutex);
-
-       return ret < 0 ? ret : 0;
 }
 
 /**
@@ -416,8 +446,12 @@ static struct drm_mode_object *_object_find(struct drm_device *dev,
 
        mutex_lock(&dev->mode_config.idr_mutex);
        obj = idr_find(&dev->mode_config.crtc_idr, id);
-       if (!obj || (type != DRM_MODE_OBJECT_ANY && obj->type != type) ||
-           (obj->id != id))
+       if (obj && type != DRM_MODE_OBJECT_ANY && obj->type != type)
+               obj = NULL;
+       if (obj && obj->id != id)
+               obj = NULL;
+       /* don't leak out unref'd fb's */
+       if (obj && (obj->type == DRM_MODE_OBJECT_FB))
                obj = NULL;
        mutex_unlock(&dev->mode_config.idr_mutex);
 
@@ -444,9 +478,6 @@ struct drm_mode_object *drm_mode_object_find(struct drm_device *dev,
         * function.*/
        WARN_ON(type == DRM_MODE_OBJECT_FB);
        obj = _object_find(dev, id, type);
-       /* don't leak out unref'd fb's */
-       if (obj && (obj->type == DRM_MODE_OBJECT_FB))
-               obj = NULL;
        return obj;
 }
 EXPORT_SYMBOL(drm_mode_object_find);
@@ -723,7 +754,7 @@ DEFINE_WW_CLASS(crtc_ww_class);
  */
 int drm_crtc_init_with_planes(struct drm_device *dev, struct drm_crtc *crtc,
                              struct drm_plane *primary,
-                             void *cursor,
+                             struct drm_plane *cursor,
                              const struct drm_crtc_funcs *funcs)
 {
        struct drm_mode_config *config = &dev->mode_config;
@@ -748,8 +779,11 @@ int drm_crtc_init_with_planes(struct drm_device *dev, struct drm_crtc *crtc,
        config->num_crtc++;
 
        crtc->primary = primary;
+       crtc->cursor = cursor;
        if (primary)
                primary->possible_crtcs = 1 << drm_crtc_index(crtc);
+       if (cursor)
+               cursor->possible_crtcs = 1 << drm_crtc_index(crtc);
 
  out:
        drm_modeset_unlock_all(dev);
@@ -842,7 +876,7 @@ int drm_connector_init(struct drm_device *dev,
 
        drm_modeset_lock_all(dev);
 
-       ret = drm_mode_object_get(dev, &connector->base, DRM_MODE_OBJECT_CONNECTOR);
+       ret = drm_mode_object_get_reg(dev, &connector->base, DRM_MODE_OBJECT_CONNECTOR, false);
        if (ret)
                goto out_unlock;
 
@@ -881,6 +915,8 @@ int drm_connector_init(struct drm_device *dev,
        drm_object_attach_property(&connector->base,
                                      dev->mode_config.dpms_property, 0);
 
+       connector->debugfs_entry = NULL;
+
 out_put:
        if (ret)
                drm_mode_object_put(dev, &connector->base);
@@ -920,6 +956,49 @@ void drm_connector_cleanup(struct drm_connector *connector)
 }
 EXPORT_SYMBOL(drm_connector_cleanup);
 
+/**
+ * drm_connector_register - register a connector
+ * @connector: the connector to register
+ *
+ * Register userspace interfaces for a connector
+ *
+ * Returns:
+ * Zero on success, error code on failure.
+ */
+int drm_connector_register(struct drm_connector *connector)
+{
+       int ret;
+
+       drm_mode_object_register(connector->dev, &connector->base);
+
+       ret = drm_sysfs_connector_add(connector);
+       if (ret)
+               return ret;
+
+       ret = drm_debugfs_connector_add(connector);
+       if (ret) {
+               drm_sysfs_connector_remove(connector);
+               return ret;
+       }
+
+       return 0;
+}
+EXPORT_SYMBOL(drm_connector_register);
+
+/**
+ * drm_connector_unregister - unregister a connector
+ * @connector: the connector to unregister
+ *
+ * Unregister userspace interfaces for a connector
+ */
+void drm_connector_unregister(struct drm_connector *connector)
+{
+       drm_sysfs_connector_remove(connector);
+       drm_debugfs_connector_remove(connector);
+}
+EXPORT_SYMBOL(drm_connector_unregister);
+
+
 /**
  * drm_connector_unplug_all - unregister connector userspace interfaces
  * @dev: drm device
@@ -934,7 +1013,7 @@ void drm_connector_unplug_all(struct drm_device *dev)
 
        /* taking the mode config mutex ends up in a clash with sysfs */
        list_for_each_entry(connector, &dev->mode_config.connector_list, head)
-               drm_sysfs_connector_remove(connector);
+               drm_connector_unregister(connector);
 
 }
 EXPORT_SYMBOL(drm_connector_unplug_all);
@@ -1214,6 +1293,7 @@ static int drm_mode_create_standard_connector_properties(struct drm_device *dev)
 {
        struct drm_property *edid;
        struct drm_property *dpms;
+       struct drm_property *dev_path;
 
        /*
         * Standard properties (apply to all connectors)
@@ -1228,6 +1308,12 @@ static int drm_mode_create_standard_connector_properties(struct drm_device *dev)
                                   ARRAY_SIZE(drm_dpms_enum_list));
        dev->mode_config.dpms_property = dpms;
 
+       dev_path = drm_property_create(dev,
+                                      DRM_MODE_PROP_BLOB |
+                                      DRM_MODE_PROP_IMMUTABLE,
+                                      "PATH", 0);
+       dev->mode_config.path_property = dev_path;
+
        return 0;
 }
 
@@ -1383,6 +1469,33 @@ int drm_mode_create_scaling_mode_property(struct drm_device *dev)
 }
 EXPORT_SYMBOL(drm_mode_create_scaling_mode_property);
 
+/**
+ * drm_mode_create_aspect_ratio_property - create aspect ratio property
+ * @dev: DRM device
+ *
+ * Called by a driver the first time it's needed, must be attached to desired
+ * connectors.
+ *
+ * Returns:
+ * Zero on success, errno on failure.
+ */
+int drm_mode_create_aspect_ratio_property(struct drm_device *dev)
+{
+       if (dev->mode_config.aspect_ratio_property)
+               return 0;
+
+       dev->mode_config.aspect_ratio_property =
+               drm_property_create_enum(dev, 0, "aspect ratio",
+                               drm_aspect_ratio_enum_list,
+                               ARRAY_SIZE(drm_aspect_ratio_enum_list));
+
+       if (dev->mode_config.aspect_ratio_property == NULL)
+               return -ENOMEM;
+
+       return 0;
+}
+EXPORT_SYMBOL(drm_mode_create_aspect_ratio_property);
+
 /**
  * drm_mode_create_dirty_property - create dirty property
  * @dev: DRM device
@@ -1470,6 +1583,15 @@ int drm_mode_group_init_legacy_group(struct drm_device *dev,
 }
 EXPORT_SYMBOL(drm_mode_group_init_legacy_group);
 
+void drm_reinit_primary_mode_group(struct drm_device *dev)
+{
+       drm_modeset_lock_all(dev);
+       drm_mode_group_destroy(&dev->primary->mode_group);
+       drm_mode_group_init_legacy_group(dev, &dev->primary->mode_group);
+       drm_modeset_unlock_all(dev);
+}
+EXPORT_SYMBOL(drm_reinit_primary_mode_group);
+
 /**
  * drm_crtc_convert_to_umode - convert a drm_display_mode into a modeinfo
  * @out: drm_mode_modeinfo struct to return to the user
@@ -2118,45 +2240,32 @@ out:
        return ret;
 }
 
-/**
- * drm_mode_setplane - configure a plane's configuration
- * @dev: DRM device
- * @data: ioctl data*
- * @file_priv: DRM file info
+/*
+ * setplane_internal - setplane handler for internal callers
  *
- * Set plane configuration, including placement, fb, scaling, and other factors.
- * Or pass a NULL fb to disable.
+ * Note that we assume an extra reference has already been taken on fb.  If the
+ * update fails, this reference will be dropped before return; if it succeeds,
+ * the previous framebuffer (if any) will be unreferenced instead.
  *
- * Returns:
- * Zero on success, errno on failure.
+ * src_{x,y,w,h} are provided in 16.16 fixed point format
  */
-int drm_mode_setplane(struct drm_device *dev, void *data,
-                     struct drm_file *file_priv)
+static int setplane_internal(struct drm_plane *plane,
+                            struct drm_crtc *crtc,
+                            struct drm_framebuffer *fb,
+                            int32_t crtc_x, int32_t crtc_y,
+                            uint32_t crtc_w, uint32_t crtc_h,
+                            /* src_{x,y,w,h} values are 16.16 fixed point */
+                            uint32_t src_x, uint32_t src_y,
+                            uint32_t src_w, uint32_t src_h)
 {
-       struct drm_mode_set_plane *plane_req = data;
-       struct drm_plane *plane;
-       struct drm_crtc *crtc;
-       struct drm_framebuffer *fb = NULL, *old_fb = NULL;
+       struct drm_device *dev = plane->dev;
+       struct drm_framebuffer *old_fb = NULL;
        int ret = 0;
        unsigned int fb_width, fb_height;
        int i;
 
-       if (!drm_core_check_feature(dev, DRIVER_MODESET))
-               return -EINVAL;
-
-       /*
-        * First, find the plane, crtc, and fb objects.  If not available,
-        * we don't bother to call the driver.
-        */
-       plane = drm_plane_find(dev, plane_req->plane_id);
-       if (!plane) {
-               DRM_DEBUG_KMS("Unknown plane ID %d\n",
-                             plane_req->plane_id);
-               return -ENOENT;
-       }
-
        /* No fb means shut it down */
-       if (!plane_req->fb_id) {
+       if (!fb) {
                drm_modeset_lock_all(dev);
                old_fb = plane->fb;
                ret = plane->funcs->disable_plane(plane);
@@ -2170,14 +2279,6 @@ int drm_mode_setplane(struct drm_device *dev, void *data,
                goto out;
        }
 
-       crtc = drm_crtc_find(dev, plane_req->crtc_id);
-       if (!crtc) {
-               DRM_DEBUG_KMS("Unknown crtc ID %d\n",
-                             plane_req->crtc_id);
-               ret = -ENOENT;
-               goto out;
-       }
-
        /* Check whether this plane is usable on this CRTC */
        if (!(plane->possible_crtcs & drm_crtc_mask(crtc))) {
                DRM_DEBUG_KMS("Invalid crtc for plane\n");
@@ -2185,14 +2286,6 @@ int drm_mode_setplane(struct drm_device *dev, void *data,
                goto out;
        }
 
-       fb = drm_framebuffer_lookup(dev, plane_req->fb_id);
-       if (!fb) {
-               DRM_DEBUG_KMS("Unknown framebuffer ID %d\n",
-                             plane_req->fb_id);
-               ret = -ENOENT;
-               goto out;
-       }
-
        /* Check whether this plane supports the fb pixel format. */
        for (i = 0; i < plane->format_count; i++)
                if (fb->pixel_format == plane->format_types[i])
@@ -2208,43 +2301,25 @@ int drm_mode_setplane(struct drm_device *dev, void *data,
        fb_height = fb->height << 16;
 
        /* Make sure source coordinates are inside the fb. */
-       if (plane_req->src_w > fb_width ||
-           plane_req->src_x > fb_width - plane_req->src_w ||
-           plane_req->src_h > fb_height ||
-           plane_req->src_y > fb_height - plane_req->src_h) {
+       if (src_w > fb_width ||
+           src_x > fb_width - src_w ||
+           src_h > fb_height ||
+           src_y > fb_height - src_h) {
                DRM_DEBUG_KMS("Invalid source coordinates "
                              "%u.%06ux%u.%06u+%u.%06u+%u.%06u\n",
-                             plane_req->src_w >> 16,
-                             ((plane_req->src_w & 0xffff) * 15625) >> 10,
-                             plane_req->src_h >> 16,
-                             ((plane_req->src_h & 0xffff) * 15625) >> 10,
-                             plane_req->src_x >> 16,
-                             ((plane_req->src_x & 0xffff) * 15625) >> 10,
-                             plane_req->src_y >> 16,
-                             ((plane_req->src_y & 0xffff) * 15625) >> 10);
+                             src_w >> 16, ((src_w & 0xffff) * 15625) >> 10,
+                             src_h >> 16, ((src_h & 0xffff) * 15625) >> 10,
+                             src_x >> 16, ((src_x & 0xffff) * 15625) >> 10,
+                             src_y >> 16, ((src_y & 0xffff) * 15625) >> 10);
                ret = -ENOSPC;
                goto out;
        }
 
-       /* Give drivers some help against integer overflows */
-       if (plane_req->crtc_w > INT_MAX ||
-           plane_req->crtc_x > INT_MAX - (int32_t) plane_req->crtc_w ||
-           plane_req->crtc_h > INT_MAX ||
-           plane_req->crtc_y > INT_MAX - (int32_t) plane_req->crtc_h) {
-               DRM_DEBUG_KMS("Invalid CRTC coordinates %ux%u+%d+%d\n",
-                             plane_req->crtc_w, plane_req->crtc_h,
-                             plane_req->crtc_x, plane_req->crtc_y);
-               ret = -ERANGE;
-               goto out;
-       }
-
        drm_modeset_lock_all(dev);
        old_fb = plane->fb;
        ret = plane->funcs->update_plane(plane, crtc, fb,
-                                        plane_req->crtc_x, plane_req->crtc_y,
-                                        plane_req->crtc_w, plane_req->crtc_h,
-                                        plane_req->src_x, plane_req->src_y,
-                                        plane_req->src_w, plane_req->src_h);
+                                        crtc_x, crtc_y, crtc_w, crtc_h,
+                                        src_x, src_y, src_w, src_h);
        if (!ret) {
                plane->crtc = crtc;
                plane->fb = fb;
@@ -2261,6 +2336,85 @@ out:
                drm_framebuffer_unreference(old_fb);
 
        return ret;
+
+}
+
+/**
+ * drm_mode_setplane - configure a plane's configuration
+ * @dev: DRM device
+ * @data: ioctl data*
+ * @file_priv: DRM file info
+ *
+ * Set plane configuration, including placement, fb, scaling, and other factors.
+ * Or pass a NULL fb to disable (planes may be disabled without providing a
+ * valid crtc).
+ *
+ * Returns:
+ * Zero on success, errno on failure.
+ */
+int drm_mode_setplane(struct drm_device *dev, void *data,
+                     struct drm_file *file_priv)
+{
+       struct drm_mode_set_plane *plane_req = data;
+       struct drm_mode_object *obj;
+       struct drm_plane *plane;
+       struct drm_crtc *crtc = NULL;
+       struct drm_framebuffer *fb = NULL;
+
+       if (!drm_core_check_feature(dev, DRIVER_MODESET))
+               return -EINVAL;
+
+       /* Give drivers some help against integer overflows */
+       if (plane_req->crtc_w > INT_MAX ||
+           plane_req->crtc_x > INT_MAX - (int32_t) plane_req->crtc_w ||
+           plane_req->crtc_h > INT_MAX ||
+           plane_req->crtc_y > INT_MAX - (int32_t) plane_req->crtc_h) {
+               DRM_DEBUG_KMS("Invalid CRTC coordinates %ux%u+%d+%d\n",
+                             plane_req->crtc_w, plane_req->crtc_h,
+                             plane_req->crtc_x, plane_req->crtc_y);
+               return -ERANGE;
+       }
+
+       /*
+        * First, find the plane, crtc, and fb objects.  If not available,
+        * we don't bother to call the driver.
+        */
+       obj = drm_mode_object_find(dev, plane_req->plane_id,
+                                  DRM_MODE_OBJECT_PLANE);
+       if (!obj) {
+               DRM_DEBUG_KMS("Unknown plane ID %d\n",
+                             plane_req->plane_id);
+               return -ENOENT;
+       }
+       plane = obj_to_plane(obj);
+
+       if (plane_req->fb_id) {
+               fb = drm_framebuffer_lookup(dev, plane_req->fb_id);
+               if (!fb) {
+                       DRM_DEBUG_KMS("Unknown framebuffer ID %d\n",
+                                     plane_req->fb_id);
+                       return -ENOENT;
+               }
+
+               obj = drm_mode_object_find(dev, plane_req->crtc_id,
+                                          DRM_MODE_OBJECT_CRTC);
+               if (!obj) {
+                       DRM_DEBUG_KMS("Unknown crtc ID %d\n",
+                                     plane_req->crtc_id);
+                       return -ENOENT;
+               }
+               crtc = obj_to_crtc(obj);
+       }
+
+       /*
+        * setplane_internal will take care of deref'ing either the old or new
+        * framebuffer depending on success.
+        */
+       return setplane_internal(plane, crtc, fb,
+                                plane_req->crtc_x, plane_req->crtc_y,
+                                plane_req->crtc_w, plane_req->crtc_h,
+                                plane_req->src_x, plane_req->src_y,
+                                plane_req->src_w, plane_req->src_h);
 }
 
 /**
@@ -2509,6 +2663,102 @@ out:
        return ret;
 }
 
+/**
+ * drm_mode_cursor_universal - translate legacy cursor ioctl call into a
+ *     universal plane handler call
+ * @crtc: crtc to update cursor for
+ * @req: data pointer for the ioctl
+ * @file_priv: drm file for the ioctl call
+ *
+ * Legacy cursor ioctl's work directly with driver buffer handles.  To
+ * translate legacy ioctl calls into universal plane handler calls, we need to
+ * wrap the native buffer handle in a drm_framebuffer.
+ *
+ * Note that we assume any handle passed to the legacy ioctls was a 32-bit ARGB
+ * buffer with a pitch of 4*width; the universal plane interface should be used
+ * directly in cases where the hardware can support other buffer settings and
+ * userspace wants to make use of these capabilities.
+ *
+ * Returns:
+ * Zero on success, errno on failure.
+ */
+static int drm_mode_cursor_universal(struct drm_crtc *crtc,
+                                    struct drm_mode_cursor2 *req,
+                                    struct drm_file *file_priv)
+{
+       struct drm_device *dev = crtc->dev;
+       struct drm_framebuffer *fb = NULL;
+       struct drm_mode_fb_cmd2 fbreq = {
+               .width = req->width,
+               .height = req->height,
+               .pixel_format = DRM_FORMAT_ARGB8888,
+               .pitches = { req->width * 4 },
+               .handles = { req->handle },
+       };
+       int32_t crtc_x, crtc_y;
+       uint32_t crtc_w = 0, crtc_h = 0;
+       uint32_t src_w = 0, src_h = 0;
+       int ret = 0;
+
+       BUG_ON(!crtc->cursor);
+
+       /*
+        * Obtain fb we'll be using (either new or existing) and take an extra
+        * reference to it if fb != null.  setplane will take care of dropping
+        * the reference if the plane update fails.
+        */
+       if (req->flags & DRM_MODE_CURSOR_BO) {
+               if (req->handle) {
+                       fb = add_framebuffer_internal(dev, &fbreq, file_priv);
+                       if (IS_ERR(fb)) {
+                               DRM_DEBUG_KMS("failed to wrap cursor buffer in drm framebuffer\n");
+                               return PTR_ERR(fb);
+                       }
+
+                       drm_framebuffer_reference(fb);
+               } else {
+                       fb = NULL;
+               }
+       } else {
+               mutex_lock(&dev->mode_config.mutex);
+               fb = crtc->cursor->fb;
+               if (fb)
+                       drm_framebuffer_reference(fb);
+               mutex_unlock(&dev->mode_config.mutex);
+       }
+
+       if (req->flags & DRM_MODE_CURSOR_MOVE) {
+               crtc_x = req->x;
+               crtc_y = req->y;
+       } else {
+               crtc_x = crtc->cursor_x;
+               crtc_y = crtc->cursor_y;
+       }
+
+       if (fb) {
+               crtc_w = fb->width;
+               crtc_h = fb->height;
+               src_w = fb->width << 16;
+               src_h = fb->height << 16;
+       }
+
+       /*
+        * setplane_internal will take care of deref'ing either the old or new
+        * framebuffer depending on success.
+        */
+       ret = setplane_internal(crtc->cursor, crtc, fb,
+                               crtc_x, crtc_y, crtc_w, crtc_h,
+                               0, 0, src_w, src_h);
+
+       /* Update successful; save new cursor position, if necessary */
+       if (ret == 0 && req->flags & DRM_MODE_CURSOR_MOVE) {
+               crtc->cursor_x = req->x;
+               crtc->cursor_y = req->y;
+       }
+
+       return ret;
+}
+
 static int drm_mode_cursor_common(struct drm_device *dev,
                                  struct drm_mode_cursor2 *req,
                                  struct drm_file *file_priv)
@@ -2528,6 +2778,13 @@ static int drm_mode_cursor_common(struct drm_device *dev,
                return -ENOENT;
        }
 
+       /*
+        * If this crtc has a universal cursor plane, call that plane's update
+        * handler rather than using legacy cursor handlers.
+        */
+       if (crtc->cursor)
+               return drm_mode_cursor_universal(crtc, req, file_priv);
+
        drm_modeset_lock(&crtc->mutex, NULL);
        if (req->flags & DRM_MODE_CURSOR_BO) {
                if (!crtc->funcs->cursor_set && !crtc->funcs->cursor_set2) {
@@ -2827,56 +3084,38 @@ static int framebuffer_check(const struct drm_mode_fb_cmd2 *r)
        return 0;
 }
 
-/**
- * drm_mode_addfb2 - add an FB to the graphics configuration
- * @dev: drm device for the ioctl
- * @data: data pointer for the ioctl
- * @file_priv: drm file for the ioctl call
- *
- * Add a new FB to the specified CRTC, given a user request with format. This is
- * the 2nd version of the addfb ioctl, which supports multi-planar framebuffers
- * and uses fourcc codes as pixel format specifiers.
- *
- * Called by the user via ioctl.
- *
- * Returns:
- * Zero on success, errno on failure.
- */
-int drm_mode_addfb2(struct drm_device *dev,
-                   void *data, struct drm_file *file_priv)
+static struct drm_framebuffer *add_framebuffer_internal(struct drm_device *dev,
+                                                       struct drm_mode_fb_cmd2 *r,
+                                                       struct drm_file *file_priv)
 {
-       struct drm_mode_fb_cmd2 *r = data;
        struct drm_mode_config *config = &dev->mode_config;
        struct drm_framebuffer *fb;
        int ret;
 
-       if (!drm_core_check_feature(dev, DRIVER_MODESET))
-               return -EINVAL;
-
        if (r->flags & ~DRM_MODE_FB_INTERLACED) {
                DRM_DEBUG_KMS("bad framebuffer flags 0x%08x\n", r->flags);
-               return -EINVAL;
+               return ERR_PTR(-EINVAL);
        }
 
        if ((config->min_width > r->width) || (r->width > config->max_width)) {
                DRM_DEBUG_KMS("bad framebuffer width %d, should be >= %d && <= %d\n",
                          r->width, config->min_width, config->max_width);
-               return -EINVAL;
+               return ERR_PTR(-EINVAL);
        }
        if ((config->min_height > r->height) || (r->height > config->max_height)) {
                DRM_DEBUG_KMS("bad framebuffer height %d, should be >= %d && <= %d\n",
                          r->height, config->min_height, config->max_height);
-               return -EINVAL;
+               return ERR_PTR(-EINVAL);
        }
 
        ret = framebuffer_check(r);
        if (ret)
-               return ret;
+               return ERR_PTR(ret);
 
        fb = dev->mode_config.funcs->fb_create(dev, file_priv, r);
        if (IS_ERR(fb)) {
                DRM_DEBUG_KMS("could not create framebuffer\n");
-               return PTR_ERR(fb);
+               return fb;
        }
 
        mutex_lock(&file_priv->fbs_lock);
@@ -2885,8 +3124,37 @@ int drm_mode_addfb2(struct drm_device *dev,
        DRM_DEBUG_KMS("[FB:%d]\n", fb->base.id);
        mutex_unlock(&file_priv->fbs_lock);
 
+       return fb;
+}
 
-       return ret;
+/**
+ * drm_mode_addfb2 - add an FB to the graphics configuration
+ * @dev: drm device for the ioctl
+ * @data: data pointer for the ioctl
+ * @file_priv: drm file for the ioctl call
+ *
+ * Add a new FB to the specified CRTC, given a user request with format. This is
+ * the 2nd version of the addfb ioctl, which supports multi-planar framebuffers
+ * and uses fourcc codes as pixel format specifiers.
+ *
+ * Called by the user via ioctl.
+ *
+ * Returns:
+ * Zero on success, errno on failure.
+ */
+int drm_mode_addfb2(struct drm_device *dev,
+                   void *data, struct drm_file *file_priv)
+{
+       struct drm_framebuffer *fb;
+
+       if (!drm_core_check_feature(dev, DRIVER_MODESET))
+               return -EINVAL;
+
+       fb = add_framebuffer_internal(dev, data, file_priv);
+       if (IS_ERR(fb))
+               return PTR_ERR(fb);
+
+       return 0;
 }
 
 /**
@@ -3176,7 +3444,7 @@ fail:
 EXPORT_SYMBOL(drm_property_create);
 
 /**
- * drm_property_create - create a new enumeration property type
+ * drm_property_create_enum - create a new enumeration property type
  * @dev: drm device
  * @flags: flags specifying the property type
  * @name: name of the property
@@ -3222,7 +3490,7 @@ struct drm_property *drm_property_create_enum(struct drm_device *dev, int flags,
 EXPORT_SYMBOL(drm_property_create_enum);
 
 /**
- * drm_property_create - create a new bitmask property type
+ * drm_property_create_bitmask - create a new bitmask property type
  * @dev: drm device
  * @flags: flags specifying the property type
  * @name: name of the property
@@ -3242,19 +3510,28 @@ EXPORT_SYMBOL(drm_property_create_enum);
 struct drm_property *drm_property_create_bitmask(struct drm_device *dev,
                                         int flags, const char *name,
                                         const struct drm_prop_enum_list *props,
-                                        int num_values)
+                                        int num_props,
+                                        uint64_t supported_bits)
 {
        struct drm_property *property;
-       int i, ret;
+       int i, ret, index = 0;
+       int num_values = hweight64(supported_bits);
 
        flags |= DRM_MODE_PROP_BITMASK;
 
        property = drm_property_create(dev, flags, name, num_values);
        if (!property)
                return NULL;
+       for (i = 0; i < num_props; i++) {
+               if (!(supported_bits & (1ULL << props[i].type)))
+                       continue;
 
-       for (i = 0; i < num_values; i++) {
-               ret = drm_property_add_enum(property, i,
+               if (WARN_ON(index >= num_values)) {
+                       drm_property_destroy(dev, property);
+                       return NULL;
+               }
+
+               ret = drm_property_add_enum(property, index++,
                                      props[i].type,
                                      props[i].name);
                if (ret) {
@@ -3284,7 +3561,7 @@ static struct drm_property *property_create_range(struct drm_device *dev,
 }
 
 /**
- * drm_property_create - create a new ranged property type
+ * drm_property_create_range - create a new ranged property type
  * @dev: drm device
  * @flags: flags specifying the property type
  * @name: name of the property
@@ -3703,6 +3980,25 @@ done:
        return ret;
 }
 
+int drm_mode_connector_set_path_property(struct drm_connector *connector,
+                                        char *path)
+{
+       struct drm_device *dev = connector->dev;
+       int ret, size;
+       size = strlen(path) + 1;
+
+       connector->path_blob_ptr = drm_property_create_blob(connector->dev,
+                                                           size, path);
+       if (!connector->path_blob_ptr)
+               return -EINVAL;
+
+       ret = drm_object_property_set_value(&connector->base,
+                                           dev->mode_config.path_property,
+                                           connector->path_blob_ptr->base.id);
+       return ret;
+}
+EXPORT_SYMBOL(drm_mode_connector_set_path_property);
+
 /**
  * drm_mode_connector_update_edid_property - update the edid property of a connector
  * @connector: drm connector
@@ -3720,6 +4016,10 @@ int drm_mode_connector_update_edid_property(struct drm_connector *connector,
        struct drm_device *dev = connector->dev;
        int ret, size;
 
+       /* ignore requests to set edid when overridden */
+       if (connector->override_edid)
+               return 0;
+
        if (connector->edid_blob_ptr)
                drm_property_destroy_blob(dev, connector->edid_blob_ptr);
 
@@ -4679,6 +4979,36 @@ int drm_format_vert_chroma_subsampling(uint32_t format)
 }
 EXPORT_SYMBOL(drm_format_vert_chroma_subsampling);
 
+/**
+ * drm_rotation_simplify() - Try to simplify the rotation
+ * @rotation: Rotation to be simplified
+ * @supported_rotations: Supported rotations
+ *
+ * Attempt to simplify the rotation to a form that is supported.
+ * Eg. if the hardware supports everything except DRM_REFLECT_X
+ * one could call this function like this:
+ *
+ * drm_rotation_simplify(rotation, BIT(DRM_ROTATE_0) |
+ *                       BIT(DRM_ROTATE_90) | BIT(DRM_ROTATE_180) |
+ *                       BIT(DRM_ROTATE_270) | BIT(DRM_REFLECT_Y));
+ *
+ * to eliminate the DRM_ROTATE_X flag. Depending on what kind of
+ * transforms the hardware supports, this function may not
+ * be able to produce a supported transform, so the caller should
+ * check the result afterwards.
+ */
+unsigned int drm_rotation_simplify(unsigned int rotation,
+                                  unsigned int supported_rotations)
+{
+       if (rotation & ~supported_rotations) {
+               rotation ^= BIT(DRM_REFLECT_X) | BIT(DRM_REFLECT_Y);
+               rotation = (rotation & ~0xf) | BIT((ffs(rotation & 0xf) + 1) % 4);
+       }
+
+       return rotation;
+}
+EXPORT_SYMBOL(drm_rotation_simplify);
+
 /**
  * drm_mode_config_init - initialize DRM mode_configuration structure
  * @dev: DRM device
@@ -4797,3 +5127,21 @@ void drm_mode_config_cleanup(struct drm_device *dev)
        drm_modeset_lock_fini(&dev->mode_config.connection_mutex);
 }
 EXPORT_SYMBOL(drm_mode_config_cleanup);
+
+struct drm_property *drm_mode_create_rotation_property(struct drm_device *dev,
+                                                      unsigned int supported_rotations)
+{
+       static const struct drm_prop_enum_list props[] = {
+               { DRM_ROTATE_0,   "rotate-0" },
+               { DRM_ROTATE_90,  "rotate-90" },
+               { DRM_ROTATE_180, "rotate-180" },
+               { DRM_ROTATE_270, "rotate-270" },
+               { DRM_REFLECT_X,  "reflect-x" },
+               { DRM_REFLECT_Y,  "reflect-y" },
+       };
+
+       return drm_property_create_bitmask(dev, 0, "rotation",
+                                          props, ARRAY_SIZE(props),
+                                          supported_rotations);
+}
+EXPORT_SYMBOL(drm_mode_create_rotation_property);
index 78b37f3febd37cb288b529a0136c14a05e4c96f8..6c65a0a28fbde3e0efbee9ccd9541cccef7aeaa6 100644 (file)
@@ -818,6 +818,7 @@ void drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb,
        drm_fb_get_bpp_depth(mode_cmd->pixel_format, &fb->depth,
                                    &fb->bits_per_pixel);
        fb->pixel_format = mode_cmd->pixel_format;
+       fb->flags = mode_cmd->flags;
 }
 EXPORT_SYMBOL(drm_helper_mode_fill_fb_struct);
 
index b4b51d46f3397ed2983a4e6d3a1be796e5402443..13bd42923dd4e2b4ca018e3ee2b1cb09a30b4677 100644 (file)
@@ -35,6 +35,7 @@
 #include <linux/slab.h>
 #include <linux/export.h>
 #include <drm/drmP.h>
+#include <drm/drm_edid.h>
 
 #if defined(CONFIG_DEBUG_FS)
 
@@ -237,5 +238,186 @@ int drm_debugfs_cleanup(struct drm_minor *minor)
        return 0;
 }
 
+static int connector_show(struct seq_file *m, void *data)
+{
+       struct drm_connector *connector = m->private;
+       const char *status;
+
+       switch (connector->force) {
+       case DRM_FORCE_ON:
+               status = "on\n";
+               break;
+
+       case DRM_FORCE_ON_DIGITAL:
+               status = "digital\n";
+               break;
+
+       case DRM_FORCE_OFF:
+               status = "off\n";
+               break;
+
+       case DRM_FORCE_UNSPECIFIED:
+               status = "unspecified\n";
+               break;
+
+       default:
+               return 0;
+       }
+
+       seq_puts(m, status);
+
+       return 0;
+}
+
+static int connector_open(struct inode *inode, struct file *file)
+{
+       struct drm_connector *dev = inode->i_private;
+
+       return single_open(file, connector_show, dev);
+}
+
+static ssize_t connector_write(struct file *file, const char __user *ubuf,
+                              size_t len, loff_t *offp)
+{
+       struct seq_file *m = file->private_data;
+       struct drm_connector *connector = m->private;
+       char buf[12];
+
+       if (len > sizeof(buf) - 1)
+               return -EINVAL;
+
+       if (copy_from_user(buf, ubuf, len))
+               return -EFAULT;
+
+       buf[len] = '\0';
+
+       if (!strcmp(buf, "on"))
+               connector->force = DRM_FORCE_ON;
+       else if (!strcmp(buf, "digital"))
+               connector->force = DRM_FORCE_ON_DIGITAL;
+       else if (!strcmp(buf, "off"))
+               connector->force = DRM_FORCE_OFF;
+       else if (!strcmp(buf, "unspecified"))
+               connector->force = DRM_FORCE_UNSPECIFIED;
+       else
+               return -EINVAL;
+
+       return len;
+}
+
+static int edid_show(struct seq_file *m, void *data)
+{
+       struct drm_connector *connector = m->private;
+       struct drm_property_blob *edid = connector->edid_blob_ptr;
+
+       if (connector->override_edid && edid)
+               seq_write(m, edid->data, edid->length);
+
+       return 0;
+}
+
+static int edid_open(struct inode *inode, struct file *file)
+{
+       struct drm_connector *dev = inode->i_private;
+
+       return single_open(file, edid_show, dev);
+}
+
+static ssize_t edid_write(struct file *file, const char __user *ubuf,
+                         size_t len, loff_t *offp)
+{
+       struct seq_file *m = file->private_data;
+       struct drm_connector *connector = m->private;
+       char *buf;
+       struct edid *edid;
+       int ret;
+
+       buf = memdup_user(ubuf, len);
+       if (IS_ERR(buf))
+               return PTR_ERR(buf);
+
+       edid = (struct edid *) buf;
+
+       if (len == 5 && !strncmp(buf, "reset", 5)) {
+               connector->override_edid = false;
+               ret = drm_mode_connector_update_edid_property(connector, NULL);
+       } else if (len < EDID_LENGTH ||
+                  EDID_LENGTH * (1 + edid->extensions) > len)
+               ret = -EINVAL;
+       else {
+               connector->override_edid = false;
+               ret = drm_mode_connector_update_edid_property(connector, edid);
+               if (!ret)
+                       connector->override_edid = true;
+       }
+
+       kfree(buf);
+
+       return (ret) ? ret : len;
+}
+
+static const struct file_operations drm_edid_fops = {
+       .owner = THIS_MODULE,
+       .open = edid_open,
+       .read = seq_read,
+       .llseek = seq_lseek,
+       .release = single_release,
+       .write = edid_write
+};
+
+
+static const struct file_operations drm_connector_fops = {
+       .owner = THIS_MODULE,
+       .open = connector_open,
+       .read = seq_read,
+       .llseek = seq_lseek,
+       .release = single_release,
+       .write = connector_write
+};
+
+int drm_debugfs_connector_add(struct drm_connector *connector)
+{
+       struct drm_minor *minor = connector->dev->primary;
+       struct dentry *root, *ent;
+
+       if (!minor->debugfs_root)
+               return -1;
+
+       root = debugfs_create_dir(connector->name, minor->debugfs_root);
+       if (!root)
+               return -ENOMEM;
+
+       connector->debugfs_entry = root;
+
+       /* force */
+       ent = debugfs_create_file("force", S_IRUGO | S_IWUSR, root, connector,
+                                 &drm_connector_fops);
+       if (!ent)
+               goto error;
+
+       /* edid */
+       ent = debugfs_create_file("edid_override", S_IRUGO | S_IWUSR, root,
+                                 connector, &drm_edid_fops);
+       if (!ent)
+               goto error;
+
+       return 0;
+
+error:
+       debugfs_remove_recursive(connector->debugfs_entry);
+       connector->debugfs_entry = NULL;
+       return -ENOMEM;
+}
+
+void drm_debugfs_connector_remove(struct drm_connector *connector)
+{
+       if (!connector->debugfs_entry)
+               return;
+
+       debugfs_remove_recursive(connector->debugfs_entry);
+
+       connector->debugfs_entry = NULL;
+}
+
 #endif /* CONFIG_DEBUG_FS */
 
diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c
new file mode 100644 (file)
index 0000000..ac3c273
--- /dev/null
@@ -0,0 +1,2715 @@
+/*
+ * Copyright © 2014 Red Hat
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  The copyright holders make no representations
+ * about the suitability of this software for any purpose.  It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include <linux/kernel.h>
+#include <linux/delay.h>
+#include <linux/init.h>
+#include <linux/errno.h>
+#include <linux/sched.h>
+#include <linux/seq_file.h>
+#include <linux/i2c.h>
+#include <drm/drm_dp_mst_helper.h>
+#include <drm/drmP.h>
+
+#include <drm/drm_fixed.h>
+
+/**
+ * DOC: dp mst helper
+ *
+ * These functions contain parts of the DisplayPort 1.2a MultiStream Transport
+ * protocol. The helpers contain a topology manager and bandwidth manager.
+ * The helpers encapsulate the sending and received of sideband msgs.
+ */
+static bool dump_dp_payload_table(struct drm_dp_mst_topology_mgr *mgr,
+                                 char *buf);
+static int test_calc_pbn_mode(void);
+
+static void drm_dp_put_port(struct drm_dp_mst_port *port);
+
+static int drm_dp_dpcd_write_payload(struct drm_dp_mst_topology_mgr *mgr,
+                                    int id,
+                                    struct drm_dp_payload *payload);
+
+static int drm_dp_send_dpcd_write(struct drm_dp_mst_topology_mgr *mgr,
+                                 struct drm_dp_mst_port *port,
+                                 int offset, int size, u8 *bytes);
+
+static int drm_dp_send_link_address(struct drm_dp_mst_topology_mgr *mgr,
+                                   struct drm_dp_mst_branch *mstb);
+static int drm_dp_send_enum_path_resources(struct drm_dp_mst_topology_mgr *mgr,
+                                          struct drm_dp_mst_branch *mstb,
+                                          struct drm_dp_mst_port *port);
+static bool drm_dp_validate_guid(struct drm_dp_mst_topology_mgr *mgr,
+                                u8 *guid);
+
+static int drm_dp_mst_register_i2c_bus(struct drm_dp_aux *aux);
+static void drm_dp_mst_unregister_i2c_bus(struct drm_dp_aux *aux);
+static void drm_dp_mst_kick_tx(struct drm_dp_mst_topology_mgr *mgr);
+/* sideband msg handling */
+static u8 drm_dp_msg_header_crc4(const uint8_t *data, size_t num_nibbles)
+{
+       u8 bitmask = 0x80;
+       u8 bitshift = 7;
+       u8 array_index = 0;
+       int number_of_bits = num_nibbles * 4;
+       u8 remainder = 0;
+
+       while (number_of_bits != 0) {
+               number_of_bits--;
+               remainder <<= 1;
+               remainder |= (data[array_index] & bitmask) >> bitshift;
+               bitmask >>= 1;
+               bitshift--;
+               if (bitmask == 0) {
+                       bitmask = 0x80;
+                       bitshift = 7;
+                       array_index++;
+               }
+               if ((remainder & 0x10) == 0x10)
+                       remainder ^= 0x13;
+       }
+
+       number_of_bits = 4;
+       while (number_of_bits != 0) {
+               number_of_bits--;
+               remainder <<= 1;
+               if ((remainder & 0x10) != 0)
+                       remainder ^= 0x13;
+       }
+
+       return remainder;
+}
+
+static u8 drm_dp_msg_data_crc4(const uint8_t *data, u8 number_of_bytes)
+{
+       u8 bitmask = 0x80;
+       u8 bitshift = 7;
+       u8 array_index = 0;
+       int number_of_bits = number_of_bytes * 8;
+       u16 remainder = 0;
+
+       while (number_of_bits != 0) {
+               number_of_bits--;
+               remainder <<= 1;
+               remainder |= (data[array_index] & bitmask) >> bitshift;
+               bitmask >>= 1;
+               bitshift--;
+               if (bitmask == 0) {
+                       bitmask = 0x80;
+                       bitshift = 7;
+                       array_index++;
+               }
+               if ((remainder & 0x100) == 0x100)
+                       remainder ^= 0xd5;
+       }
+
+       number_of_bits = 8;
+       while (number_of_bits != 0) {
+               number_of_bits--;
+               remainder <<= 1;
+               if ((remainder & 0x100) != 0)
+                       remainder ^= 0xd5;
+       }
+
+       return remainder & 0xff;
+}
+static inline u8 drm_dp_calc_sb_hdr_size(struct drm_dp_sideband_msg_hdr *hdr)
+{
+       u8 size = 3;
+       size += (hdr->lct / 2);
+       return size;
+}
+
+static void drm_dp_encode_sideband_msg_hdr(struct drm_dp_sideband_msg_hdr *hdr,
+                                          u8 *buf, int *len)
+{
+       int idx = 0;
+       int i;
+       u8 crc4;
+       buf[idx++] = ((hdr->lct & 0xf) << 4) | (hdr->lcr & 0xf);
+       for (i = 0; i < (hdr->lct / 2); i++)
+               buf[idx++] = hdr->rad[i];
+       buf[idx++] = (hdr->broadcast << 7) | (hdr->path_msg << 6) |
+               (hdr->msg_len & 0x3f);
+       buf[idx++] = (hdr->somt << 7) | (hdr->eomt << 6) | (hdr->seqno << 4);
+
+       crc4 = drm_dp_msg_header_crc4(buf, (idx * 2) - 1);
+       buf[idx - 1] |= (crc4 & 0xf);
+
+       *len = idx;
+}
+
+static bool drm_dp_decode_sideband_msg_hdr(struct drm_dp_sideband_msg_hdr *hdr,
+                                          u8 *buf, int buflen, u8 *hdrlen)
+{
+       u8 crc4;
+       u8 len;
+       int i;
+       u8 idx;
+       if (buf[0] == 0)
+               return false;
+       len = 3;
+       len += ((buf[0] & 0xf0) >> 4) / 2;
+       if (len > buflen)
+               return false;
+       crc4 = drm_dp_msg_header_crc4(buf, (len * 2) - 1);
+
+       if ((crc4 & 0xf) != (buf[len - 1] & 0xf)) {
+               DRM_DEBUG_KMS("crc4 mismatch 0x%x 0x%x\n", crc4, buf[len - 1]);
+               return false;
+       }
+
+       hdr->lct = (buf[0] & 0xf0) >> 4;
+       hdr->lcr = (buf[0] & 0xf);
+       idx = 1;
+       for (i = 0; i < (hdr->lct / 2); i++)
+               hdr->rad[i] = buf[idx++];
+       hdr->broadcast = (buf[idx] >> 7) & 0x1;
+       hdr->path_msg = (buf[idx] >> 6) & 0x1;
+       hdr->msg_len = buf[idx] & 0x3f;
+       idx++;
+       hdr->somt = (buf[idx] >> 7) & 0x1;
+       hdr->eomt = (buf[idx] >> 6) & 0x1;
+       hdr->seqno = (buf[idx] >> 4) & 0x1;
+       idx++;
+       *hdrlen = idx;
+       return true;
+}
+
+static void drm_dp_encode_sideband_req(struct drm_dp_sideband_msg_req_body *req,
+                                      struct drm_dp_sideband_msg_tx *raw)
+{
+       int idx = 0;
+       int i;
+       u8 *buf = raw->msg;
+       buf[idx++] = req->req_type & 0x7f;
+
+       switch (req->req_type) {
+       case DP_ENUM_PATH_RESOURCES:
+               buf[idx] = (req->u.port_num.port_number & 0xf) << 4;
+               idx++;
+               break;
+       case DP_ALLOCATE_PAYLOAD:
+               buf[idx] = (req->u.allocate_payload.port_number & 0xf) << 4 |
+                       (req->u.allocate_payload.number_sdp_streams & 0xf);
+               idx++;
+               buf[idx] = (req->u.allocate_payload.vcpi & 0x7f);
+               idx++;
+               buf[idx] = (req->u.allocate_payload.pbn >> 8);
+               idx++;
+               buf[idx] = (req->u.allocate_payload.pbn & 0xff);
+               idx++;
+               for (i = 0; i < req->u.allocate_payload.number_sdp_streams / 2; i++) {
+                       buf[idx] = ((req->u.allocate_payload.sdp_stream_sink[i * 2] & 0xf) << 4) |
+                               (req->u.allocate_payload.sdp_stream_sink[i * 2 + 1] & 0xf);
+                       idx++;
+               }
+               if (req->u.allocate_payload.number_sdp_streams & 1) {
+                       i = req->u.allocate_payload.number_sdp_streams - 1;
+                       buf[idx] = (req->u.allocate_payload.sdp_stream_sink[i] & 0xf) << 4;
+                       idx++;
+               }
+               break;
+       case DP_QUERY_PAYLOAD:
+               buf[idx] = (req->u.query_payload.port_number & 0xf) << 4;
+               idx++;
+               buf[idx] = (req->u.query_payload.vcpi & 0x7f);
+               idx++;
+               break;
+       case DP_REMOTE_DPCD_READ:
+               buf[idx] = (req->u.dpcd_read.port_number & 0xf) << 4;
+               buf[idx] |= ((req->u.dpcd_read.dpcd_address & 0xf0000) >> 16) & 0xf;
+               idx++;
+               buf[idx] = (req->u.dpcd_read.dpcd_address & 0xff00) >> 8;
+               idx++;
+               buf[idx] = (req->u.dpcd_read.dpcd_address & 0xff);
+               idx++;
+               buf[idx] = (req->u.dpcd_read.num_bytes);
+               idx++;
+               break;
+
+       case DP_REMOTE_DPCD_WRITE:
+               buf[idx] = (req->u.dpcd_write.port_number & 0xf) << 4;
+               buf[idx] |= ((req->u.dpcd_write.dpcd_address & 0xf0000) >> 16) & 0xf;
+               idx++;
+               buf[idx] = (req->u.dpcd_write.dpcd_address & 0xff00) >> 8;
+               idx++;
+               buf[idx] = (req->u.dpcd_write.dpcd_address & 0xff);
+               idx++;
+               buf[idx] = (req->u.dpcd_write.num_bytes);
+               idx++;
+               memcpy(&buf[idx], req->u.dpcd_write.bytes, req->u.dpcd_write.num_bytes);
+               idx += req->u.dpcd_write.num_bytes;
+               break;
+       case DP_REMOTE_I2C_READ:
+               buf[idx] = (req->u.i2c_read.port_number & 0xf) << 4;
+               buf[idx] |= (req->u.i2c_read.num_transactions & 0x3);
+               idx++;
+               for (i = 0; i < (req->u.i2c_read.num_transactions & 0x3); i++) {
+                       buf[idx] = req->u.i2c_read.transactions[i].i2c_dev_id & 0x7f;
+                       idx++;
+                       buf[idx] = req->u.i2c_read.transactions[i].num_bytes;
+                       idx++;
+                       memcpy(&buf[idx], req->u.i2c_read.transactions[i].bytes, req->u.i2c_read.transactions[i].num_bytes);
+                       idx += req->u.i2c_read.transactions[i].num_bytes;
+
+                       buf[idx] = (req->u.i2c_read.transactions[i].no_stop_bit & 0x1) << 5;
+                       buf[idx] |= (req->u.i2c_read.transactions[i].i2c_transaction_delay & 0xf);
+                       idx++;
+               }
+               buf[idx] = (req->u.i2c_read.read_i2c_device_id) & 0x7f;
+               idx++;
+               buf[idx] = (req->u.i2c_read.num_bytes_read);
+               idx++;
+               break;
+
+       case DP_REMOTE_I2C_WRITE:
+               buf[idx] = (req->u.i2c_write.port_number & 0xf) << 4;
+               idx++;
+               buf[idx] = (req->u.i2c_write.write_i2c_device_id) & 0x7f;
+               idx++;
+               buf[idx] = (req->u.i2c_write.num_bytes);
+               idx++;
+               memcpy(&buf[idx], req->u.i2c_write.bytes, req->u.i2c_write.num_bytes);
+               idx += req->u.i2c_write.num_bytes;
+               break;
+       }
+       raw->cur_len = idx;
+}
+
+static void drm_dp_crc_sideband_chunk_req(u8 *msg, u8 len)
+{
+       u8 crc4;
+       crc4 = drm_dp_msg_data_crc4(msg, len);
+       msg[len] = crc4;
+}
+
+static void drm_dp_encode_sideband_reply(struct drm_dp_sideband_msg_reply_body *rep,
+                                        struct drm_dp_sideband_msg_tx *raw)
+{
+       int idx = 0;
+       u8 *buf = raw->msg;
+
+       buf[idx++] = (rep->reply_type & 0x1) << 7 | (rep->req_type & 0x7f);
+
+       raw->cur_len = idx;
+}
+
+/* this adds a chunk of msg to the builder to get the final msg */
+static bool drm_dp_sideband_msg_build(struct drm_dp_sideband_msg_rx *msg,
+                                     u8 *replybuf, u8 replybuflen, bool hdr)
+{
+       int ret;
+       u8 crc4;
+
+       if (hdr) {
+               u8 hdrlen;
+               struct drm_dp_sideband_msg_hdr recv_hdr;
+               ret = drm_dp_decode_sideband_msg_hdr(&recv_hdr, replybuf, replybuflen, &hdrlen);
+               if (ret == false) {
+                       print_hex_dump(KERN_DEBUG, "failed hdr", DUMP_PREFIX_NONE, 16, 1, replybuf, replybuflen, false);
+                       return false;
+               }
+
+               /* get length contained in this portion */
+               msg->curchunk_len = recv_hdr.msg_len;
+               msg->curchunk_hdrlen = hdrlen;
+
+               /* we have already gotten an somt - don't bother parsing */
+               if (recv_hdr.somt && msg->have_somt)
+                       return false;
+
+               if (recv_hdr.somt) {
+                       memcpy(&msg->initial_hdr, &recv_hdr, sizeof(struct drm_dp_sideband_msg_hdr));
+                       msg->have_somt = true;
+               }
+               if (recv_hdr.eomt)
+                       msg->have_eomt = true;
+
+               /* copy the bytes for the remainder of this header chunk */
+               msg->curchunk_idx = min(msg->curchunk_len, (u8)(replybuflen - hdrlen));
+               memcpy(&msg->chunk[0], replybuf + hdrlen, msg->curchunk_idx);
+       } else {
+               memcpy(&msg->chunk[msg->curchunk_idx], replybuf, replybuflen);
+               msg->curchunk_idx += replybuflen;
+       }
+
+       if (msg->curchunk_idx >= msg->curchunk_len) {
+               /* do CRC */
+               crc4 = drm_dp_msg_data_crc4(msg->chunk, msg->curchunk_len - 1);
+               /* copy chunk into bigger msg */
+               memcpy(&msg->msg[msg->curlen], msg->chunk, msg->curchunk_len - 1);
+               msg->curlen += msg->curchunk_len - 1;
+       }
+       return true;
+}
+
+static bool drm_dp_sideband_parse_link_address(struct drm_dp_sideband_msg_rx *raw,
+                                              struct drm_dp_sideband_msg_reply_body *repmsg)
+{
+       int idx = 1;
+       int i;
+       memcpy(repmsg->u.link_addr.guid, &raw->msg[idx], 16);
+       idx += 16;
+       repmsg->u.link_addr.nports = raw->msg[idx] & 0xf;
+       idx++;
+       if (idx > raw->curlen)
+               goto fail_len;
+       for (i = 0; i < repmsg->u.link_addr.nports; i++) {
+               if (raw->msg[idx] & 0x80)
+                       repmsg->u.link_addr.ports[i].input_port = 1;
+
+               repmsg->u.link_addr.ports[i].peer_device_type = (raw->msg[idx] >> 4) & 0x7;
+               repmsg->u.link_addr.ports[i].port_number = (raw->msg[idx] & 0xf);
+
+               idx++;
+               if (idx > raw->curlen)
+                       goto fail_len;
+               repmsg->u.link_addr.ports[i].mcs = (raw->msg[idx] >> 7) & 0x1;
+               repmsg->u.link_addr.ports[i].ddps = (raw->msg[idx] >> 6) & 0x1;
+               if (repmsg->u.link_addr.ports[i].input_port == 0)
+                       repmsg->u.link_addr.ports[i].legacy_device_plug_status = (raw->msg[idx] >> 5) & 0x1;
+               idx++;
+               if (idx > raw->curlen)
+                       goto fail_len;
+               if (repmsg->u.link_addr.ports[i].input_port == 0) {
+                       repmsg->u.link_addr.ports[i].dpcd_revision = (raw->msg[idx]);
+                       idx++;
+                       if (idx > raw->curlen)
+                               goto fail_len;
+                       memcpy(repmsg->u.link_addr.ports[i].peer_guid, &raw->msg[idx], 16);
+                       idx += 16;
+                       if (idx > raw->curlen)
+                               goto fail_len;
+                       repmsg->u.link_addr.ports[i].num_sdp_streams = (raw->msg[idx] >> 4) & 0xf;
+                       repmsg->u.link_addr.ports[i].num_sdp_stream_sinks = (raw->msg[idx] & 0xf);
+                       idx++;
+
+               }
+               if (idx > raw->curlen)
+                       goto fail_len;
+       }
+
+       return true;
+fail_len:
+       DRM_DEBUG_KMS("link address reply parse length fail %d %d\n", idx, raw->curlen);
+       return false;
+}
+
+static bool drm_dp_sideband_parse_remote_dpcd_read(struct drm_dp_sideband_msg_rx *raw,
+                                                  struct drm_dp_sideband_msg_reply_body *repmsg)
+{
+       int idx = 1;
+       repmsg->u.remote_dpcd_read_ack.port_number = raw->msg[idx] & 0xf;
+       idx++;
+       if (idx > raw->curlen)
+               goto fail_len;
+       repmsg->u.remote_dpcd_read_ack.num_bytes = raw->msg[idx];
+       if (idx > raw->curlen)
+               goto fail_len;
+
+       memcpy(repmsg->u.remote_dpcd_read_ack.bytes, &raw->msg[idx], repmsg->u.remote_dpcd_read_ack.num_bytes);
+       return true;
+fail_len:
+       DRM_DEBUG_KMS("link address reply parse length fail %d %d\n", idx, raw->curlen);
+       return false;
+}
+
+static bool drm_dp_sideband_parse_remote_dpcd_write(struct drm_dp_sideband_msg_rx *raw,
+                                                     struct drm_dp_sideband_msg_reply_body *repmsg)
+{
+       int idx = 1;
+       repmsg->u.remote_dpcd_write_ack.port_number = raw->msg[idx] & 0xf;
+       idx++;
+       if (idx > raw->curlen)
+               goto fail_len;
+       return true;
+fail_len:
+       DRM_DEBUG_KMS("parse length fail %d %d\n", idx, raw->curlen);
+       return false;
+}
+
+static bool drm_dp_sideband_parse_remote_i2c_read_ack(struct drm_dp_sideband_msg_rx *raw,
+                                                     struct drm_dp_sideband_msg_reply_body *repmsg)
+{
+       int idx = 1;
+
+       repmsg->u.remote_i2c_read_ack.port_number = (raw->msg[idx] & 0xf);
+       idx++;
+       if (idx > raw->curlen)
+               goto fail_len;
+       repmsg->u.remote_i2c_read_ack.num_bytes = raw->msg[idx];
+       idx++;
+       /* TODO check */
+       memcpy(repmsg->u.remote_i2c_read_ack.bytes, &raw->msg[idx], repmsg->u.remote_i2c_read_ack.num_bytes);
+       return true;
+fail_len:
+       DRM_DEBUG_KMS("remote i2c reply parse length fail %d %d\n", idx, raw->curlen);
+       return false;
+}
+
+static bool drm_dp_sideband_parse_enum_path_resources_ack(struct drm_dp_sideband_msg_rx *raw,
+                                                         struct drm_dp_sideband_msg_reply_body *repmsg)
+{
+       int idx = 1;
+       repmsg->u.path_resources.port_number = (raw->msg[idx] >> 4) & 0xf;
+       idx++;
+       if (idx > raw->curlen)
+               goto fail_len;
+       repmsg->u.path_resources.full_payload_bw_number = (raw->msg[idx] << 8) | (raw->msg[idx+1]);
+       idx += 2;
+       if (idx > raw->curlen)
+               goto fail_len;
+       repmsg->u.path_resources.avail_payload_bw_number = (raw->msg[idx] << 8) | (raw->msg[idx+1]);
+       idx += 2;
+       if (idx > raw->curlen)
+               goto fail_len;
+       return true;
+fail_len:
+       DRM_DEBUG_KMS("enum resource parse length fail %d %d\n", idx, raw->curlen);
+       return false;
+}
+
+static bool drm_dp_sideband_parse_allocate_payload_ack(struct drm_dp_sideband_msg_rx *raw,
+                                                         struct drm_dp_sideband_msg_reply_body *repmsg)
+{
+       int idx = 1;
+       repmsg->u.allocate_payload.port_number = (raw->msg[idx] >> 4) & 0xf;
+       idx++;
+       if (idx > raw->curlen)
+               goto fail_len;
+       repmsg->u.allocate_payload.vcpi = raw->msg[idx];
+       idx++;
+       if (idx > raw->curlen)
+               goto fail_len;
+       repmsg->u.allocate_payload.allocated_pbn = (raw->msg[idx] << 8) | (raw->msg[idx+1]);
+       idx += 2;
+       if (idx > raw->curlen)
+               goto fail_len;
+       return true;
+fail_len:
+       DRM_DEBUG_KMS("allocate payload parse length fail %d %d\n", idx, raw->curlen);
+       return false;
+}
+
+static bool drm_dp_sideband_parse_query_payload_ack(struct drm_dp_sideband_msg_rx *raw,
+                                                   struct drm_dp_sideband_msg_reply_body *repmsg)
+{
+       int idx = 1;
+       repmsg->u.query_payload.port_number = (raw->msg[idx] >> 4) & 0xf;
+       idx++;
+       if (idx > raw->curlen)
+               goto fail_len;
+       repmsg->u.query_payload.allocated_pbn = (raw->msg[idx] << 8) | (raw->msg[idx + 1]);
+       idx += 2;
+       if (idx > raw->curlen)
+               goto fail_len;
+       return true;
+fail_len:
+       DRM_DEBUG_KMS("query payload parse length fail %d %d\n", idx, raw->curlen);
+       return false;
+}
+
+static bool drm_dp_sideband_parse_reply(struct drm_dp_sideband_msg_rx *raw,
+                                       struct drm_dp_sideband_msg_reply_body *msg)
+{
+       memset(msg, 0, sizeof(*msg));
+       msg->reply_type = (raw->msg[0] & 0x80) >> 7;
+       msg->req_type = (raw->msg[0] & 0x7f);
+
+       if (msg->reply_type) {
+               memcpy(msg->u.nak.guid, &raw->msg[1], 16);
+               msg->u.nak.reason = raw->msg[17];
+               msg->u.nak.nak_data = raw->msg[18];
+               return false;
+       }
+
+       switch (msg->req_type) {
+       case DP_LINK_ADDRESS:
+               return drm_dp_sideband_parse_link_address(raw, msg);
+       case DP_QUERY_PAYLOAD:
+               return drm_dp_sideband_parse_query_payload_ack(raw, msg);
+       case DP_REMOTE_DPCD_READ:
+               return drm_dp_sideband_parse_remote_dpcd_read(raw, msg);
+       case DP_REMOTE_DPCD_WRITE:
+               return drm_dp_sideband_parse_remote_dpcd_write(raw, msg);
+       case DP_REMOTE_I2C_READ:
+               return drm_dp_sideband_parse_remote_i2c_read_ack(raw, msg);
+       case DP_ENUM_PATH_RESOURCES:
+               return drm_dp_sideband_parse_enum_path_resources_ack(raw, msg);
+       case DP_ALLOCATE_PAYLOAD:
+               return drm_dp_sideband_parse_allocate_payload_ack(raw, msg);
+       default:
+               DRM_ERROR("Got unknown reply 0x%02x\n", msg->req_type);
+               return false;
+       }
+}
+
+static bool drm_dp_sideband_parse_connection_status_notify(struct drm_dp_sideband_msg_rx *raw,
+                                                          struct drm_dp_sideband_msg_req_body *msg)
+{
+       int idx = 1;
+
+       msg->u.conn_stat.port_number = (raw->msg[idx] & 0xf0) >> 4;
+       idx++;
+       if (idx > raw->curlen)
+               goto fail_len;
+
+       memcpy(msg->u.conn_stat.guid, &raw->msg[idx], 16);
+       idx += 16;
+       if (idx > raw->curlen)
+               goto fail_len;
+
+       msg->u.conn_stat.legacy_device_plug_status = (raw->msg[idx] >> 6) & 0x1;
+       msg->u.conn_stat.displayport_device_plug_status = (raw->msg[idx] >> 5) & 0x1;
+       msg->u.conn_stat.message_capability_status = (raw->msg[idx] >> 4) & 0x1;
+       msg->u.conn_stat.input_port = (raw->msg[idx] >> 3) & 0x1;
+       msg->u.conn_stat.peer_device_type = (raw->msg[idx] & 0x7);
+       idx++;
+       return true;
+fail_len:
+       DRM_DEBUG_KMS("connection status reply parse length fail %d %d\n", idx, raw->curlen);
+       return false;
+}
+
+static bool drm_dp_sideband_parse_resource_status_notify(struct drm_dp_sideband_msg_rx *raw,
+                                                          struct drm_dp_sideband_msg_req_body *msg)
+{
+       int idx = 1;
+
+       msg->u.resource_stat.port_number = (raw->msg[idx] & 0xf0) >> 4;
+       idx++;
+       if (idx > raw->curlen)
+               goto fail_len;
+
+       memcpy(msg->u.resource_stat.guid, &raw->msg[idx], 16);
+       idx += 16;
+       if (idx > raw->curlen)
+               goto fail_len;
+
+       msg->u.resource_stat.available_pbn = (raw->msg[idx] << 8) | (raw->msg[idx + 1]);
+       idx++;
+       return true;
+fail_len:
+       DRM_DEBUG_KMS("resource status reply parse length fail %d %d\n", idx, raw->curlen);
+       return false;
+}
+
+static bool drm_dp_sideband_parse_req(struct drm_dp_sideband_msg_rx *raw,
+                                     struct drm_dp_sideband_msg_req_body *msg)
+{
+       memset(msg, 0, sizeof(*msg));
+       msg->req_type = (raw->msg[0] & 0x7f);
+
+       switch (msg->req_type) {
+       case DP_CONNECTION_STATUS_NOTIFY:
+               return drm_dp_sideband_parse_connection_status_notify(raw, msg);
+       case DP_RESOURCE_STATUS_NOTIFY:
+               return drm_dp_sideband_parse_resource_status_notify(raw, msg);
+       default:
+               DRM_ERROR("Got unknown request 0x%02x\n", msg->req_type);
+               return false;
+       }
+}
+
+static int build_dpcd_write(struct drm_dp_sideband_msg_tx *msg, u8 port_num, u32 offset, u8 num_bytes, u8 *bytes)
+{
+       struct drm_dp_sideband_msg_req_body req;
+
+       req.req_type = DP_REMOTE_DPCD_WRITE;
+       req.u.dpcd_write.port_number = port_num;
+       req.u.dpcd_write.dpcd_address = offset;
+       req.u.dpcd_write.num_bytes = num_bytes;
+       req.u.dpcd_write.bytes = bytes;
+       drm_dp_encode_sideband_req(&req, msg);
+
+       return 0;
+}
+
+static int build_link_address(struct drm_dp_sideband_msg_tx *msg)
+{
+       struct drm_dp_sideband_msg_req_body req;
+
+       req.req_type = DP_LINK_ADDRESS;
+       drm_dp_encode_sideband_req(&req, msg);
+       return 0;
+}
+
+static int build_enum_path_resources(struct drm_dp_sideband_msg_tx *msg, int port_num)
+{
+       struct drm_dp_sideband_msg_req_body req;
+
+       req.req_type = DP_ENUM_PATH_RESOURCES;
+       req.u.port_num.port_number = port_num;
+       drm_dp_encode_sideband_req(&req, msg);
+       msg->path_msg = true;
+       return 0;
+}
+
+static int build_allocate_payload(struct drm_dp_sideband_msg_tx *msg, int port_num,
+                                 u8 vcpi, uint16_t pbn)
+{
+       struct drm_dp_sideband_msg_req_body req;
+       memset(&req, 0, sizeof(req));
+       req.req_type = DP_ALLOCATE_PAYLOAD;
+       req.u.allocate_payload.port_number = port_num;
+       req.u.allocate_payload.vcpi = vcpi;
+       req.u.allocate_payload.pbn = pbn;
+       drm_dp_encode_sideband_req(&req, msg);
+       msg->path_msg = true;
+       return 0;
+}
+
+static int drm_dp_mst_assign_payload_id(struct drm_dp_mst_topology_mgr *mgr,
+                                       struct drm_dp_vcpi *vcpi)
+{
+       int ret;
+
+       mutex_lock(&mgr->payload_lock);
+       ret = find_first_zero_bit(&mgr->payload_mask, mgr->max_payloads + 1);
+       if (ret > mgr->max_payloads) {
+               ret = -EINVAL;
+               DRM_DEBUG_KMS("out of payload ids %d\n", ret);
+               goto out_unlock;
+       }
+
+       set_bit(ret, &mgr->payload_mask);
+       vcpi->vcpi = ret;
+       mgr->proposed_vcpis[ret - 1] = vcpi;
+out_unlock:
+       mutex_unlock(&mgr->payload_lock);
+       return ret;
+}
+
+static void drm_dp_mst_put_payload_id(struct drm_dp_mst_topology_mgr *mgr,
+                                     int id)
+{
+       if (id == 0)
+               return;
+
+       mutex_lock(&mgr->payload_lock);
+       DRM_DEBUG_KMS("putting payload %d\n", id);
+       clear_bit(id, &mgr->payload_mask);
+       mgr->proposed_vcpis[id - 1] = NULL;
+       mutex_unlock(&mgr->payload_lock);
+}
+
+static bool check_txmsg_state(struct drm_dp_mst_topology_mgr *mgr,
+                             struct drm_dp_sideband_msg_tx *txmsg)
+{
+       bool ret;
+       mutex_lock(&mgr->qlock);
+       ret = (txmsg->state == DRM_DP_SIDEBAND_TX_RX ||
+              txmsg->state == DRM_DP_SIDEBAND_TX_TIMEOUT);
+       mutex_unlock(&mgr->qlock);
+       return ret;
+}
+
+static int drm_dp_mst_wait_tx_reply(struct drm_dp_mst_branch *mstb,
+                                   struct drm_dp_sideband_msg_tx *txmsg)
+{
+       struct drm_dp_mst_topology_mgr *mgr = mstb->mgr;
+       int ret;
+
+       ret = wait_event_timeout(mgr->tx_waitq,
+                                check_txmsg_state(mgr, txmsg),
+                                (4 * HZ));
+       mutex_lock(&mstb->mgr->qlock);
+       if (ret > 0) {
+               if (txmsg->state == DRM_DP_SIDEBAND_TX_TIMEOUT) {
+                       ret = -EIO;
+                       goto out;
+               }
+       } else {
+               DRM_DEBUG_KMS("timedout msg send %p %d %d\n", txmsg, txmsg->state, txmsg->seqno);
+
+               /* dump some state */
+               ret = -EIO;
+
+               /* remove from q */
+               if (txmsg->state == DRM_DP_SIDEBAND_TX_QUEUED ||
+                   txmsg->state == DRM_DP_SIDEBAND_TX_START_SEND) {
+                       list_del(&txmsg->next);
+               }
+
+               if (txmsg->state == DRM_DP_SIDEBAND_TX_START_SEND ||
+                   txmsg->state == DRM_DP_SIDEBAND_TX_SENT) {
+                       mstb->tx_slots[txmsg->seqno] = NULL;
+               }
+       }
+out:
+       mutex_unlock(&mgr->qlock);
+
+       return ret;
+}
+
+static struct drm_dp_mst_branch *drm_dp_add_mst_branch_device(u8 lct, u8 *rad)
+{
+       struct drm_dp_mst_branch *mstb;
+
+       mstb = kzalloc(sizeof(*mstb), GFP_KERNEL);
+       if (!mstb)
+               return NULL;
+
+       mstb->lct = lct;
+       if (lct > 1)
+               memcpy(mstb->rad, rad, lct / 2);
+       INIT_LIST_HEAD(&mstb->ports);
+       kref_init(&mstb->kref);
+       return mstb;
+}
+
+static void drm_dp_destroy_mst_branch_device(struct kref *kref)
+{
+       struct drm_dp_mst_branch *mstb = container_of(kref, struct drm_dp_mst_branch, kref);
+       struct drm_dp_mst_port *port, *tmp;
+       bool wake_tx = false;
+
+       cancel_work_sync(&mstb->mgr->work);
+
+       /*
+        * destroy all ports - don't need lock
+        * as there are no more references to the mst branch
+        * device at this point.
+        */
+       list_for_each_entry_safe(port, tmp, &mstb->ports, next) {
+               list_del(&port->next);
+               drm_dp_put_port(port);
+       }
+
+       /* drop any tx slots msg */
+       mutex_lock(&mstb->mgr->qlock);
+       if (mstb->tx_slots[0]) {
+               mstb->tx_slots[0]->state = DRM_DP_SIDEBAND_TX_TIMEOUT;
+               mstb->tx_slots[0] = NULL;
+               wake_tx = true;
+       }
+       if (mstb->tx_slots[1]) {
+               mstb->tx_slots[1]->state = DRM_DP_SIDEBAND_TX_TIMEOUT;
+               mstb->tx_slots[1] = NULL;
+               wake_tx = true;
+       }
+       mutex_unlock(&mstb->mgr->qlock);
+
+       if (wake_tx)
+               wake_up(&mstb->mgr->tx_waitq);
+       kfree(mstb);
+}
+
+static void drm_dp_put_mst_branch_device(struct drm_dp_mst_branch *mstb)
+{
+       kref_put(&mstb->kref, drm_dp_destroy_mst_branch_device);
+}
+
+
+static void drm_dp_port_teardown_pdt(struct drm_dp_mst_port *port, int old_pdt)
+{
+       switch (old_pdt) {
+       case DP_PEER_DEVICE_DP_LEGACY_CONV:
+       case DP_PEER_DEVICE_SST_SINK:
+               /* remove i2c over sideband */
+               drm_dp_mst_unregister_i2c_bus(&port->aux);
+               break;
+       case DP_PEER_DEVICE_MST_BRANCHING:
+               drm_dp_put_mst_branch_device(port->mstb);
+               port->mstb = NULL;
+               break;
+       }
+}
+
+static void drm_dp_destroy_port(struct kref *kref)
+{
+       struct drm_dp_mst_port *port = container_of(kref, struct drm_dp_mst_port, kref);
+       struct drm_dp_mst_topology_mgr *mgr = port->mgr;
+       if (!port->input) {
+               port->vcpi.num_slots = 0;
+               if (port->connector)
+                       (*port->mgr->cbs->destroy_connector)(mgr, port->connector);
+               drm_dp_port_teardown_pdt(port, port->pdt);
+
+               if (!port->input && port->vcpi.vcpi > 0)
+                       drm_dp_mst_put_payload_id(mgr, port->vcpi.vcpi);
+       }
+       kfree(port);
+
+       (*mgr->cbs->hotplug)(mgr);
+}
+
+static void drm_dp_put_port(struct drm_dp_mst_port *port)
+{
+       kref_put(&port->kref, drm_dp_destroy_port);
+}
+
+static struct drm_dp_mst_branch *drm_dp_mst_get_validated_mstb_ref_locked(struct drm_dp_mst_branch *mstb, struct drm_dp_mst_branch *to_find)
+{
+       struct drm_dp_mst_port *port;
+       struct drm_dp_mst_branch *rmstb;
+       if (to_find == mstb) {
+               kref_get(&mstb->kref);
+               return mstb;
+       }
+       list_for_each_entry(port, &mstb->ports, next) {
+               if (port->mstb) {
+                       rmstb = drm_dp_mst_get_validated_mstb_ref_locked(port->mstb, to_find);
+                       if (rmstb)
+                               return rmstb;
+               }
+       }
+       return NULL;
+}
+
+static struct drm_dp_mst_branch *drm_dp_get_validated_mstb_ref(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_branch *mstb)
+{
+       struct drm_dp_mst_branch *rmstb = NULL;
+       mutex_lock(&mgr->lock);
+       if (mgr->mst_primary)
+               rmstb = drm_dp_mst_get_validated_mstb_ref_locked(mgr->mst_primary, mstb);
+       mutex_unlock(&mgr->lock);
+       return rmstb;
+}
+
+static struct drm_dp_mst_port *drm_dp_mst_get_port_ref_locked(struct drm_dp_mst_branch *mstb, struct drm_dp_mst_port *to_find)
+{
+       struct drm_dp_mst_port *port, *mport;
+
+       list_for_each_entry(port, &mstb->ports, next) {
+               if (port == to_find) {
+                       kref_get(&port->kref);
+                       return port;
+               }
+               if (port->mstb) {
+                       mport = drm_dp_mst_get_port_ref_locked(port->mstb, to_find);
+                       if (mport)
+                               return mport;
+               }
+       }
+       return NULL;
+}
+
+static struct drm_dp_mst_port *drm_dp_get_validated_port_ref(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port)
+{
+       struct drm_dp_mst_port *rport = NULL;
+       mutex_lock(&mgr->lock);
+       if (mgr->mst_primary)
+               rport = drm_dp_mst_get_port_ref_locked(mgr->mst_primary, port);
+       mutex_unlock(&mgr->lock);
+       return rport;
+}
+
+static struct drm_dp_mst_port *drm_dp_get_port(struct drm_dp_mst_branch *mstb, u8 port_num)
+{
+       struct drm_dp_mst_port *port;
+
+       list_for_each_entry(port, &mstb->ports, next) {
+               if (port->port_num == port_num) {
+                       kref_get(&port->kref);
+                       return port;
+               }
+       }
+
+       return NULL;
+}
+
+/*
+ * calculate a new RAD for this MST branch device
+ * if parent has an LCT of 2 then it has 1 nibble of RAD,
+ * if parent has an LCT of 3 then it has 2 nibbles of RAD,
+ */
+static u8 drm_dp_calculate_rad(struct drm_dp_mst_port *port,
+                                u8 *rad)
+{
+       int lct = port->parent->lct;
+       int shift = 4;
+       int idx = lct / 2;
+       if (lct > 1) {
+               memcpy(rad, port->parent->rad, idx);
+               shift = (lct % 2) ? 4 : 0;
+       } else
+               rad[0] = 0;
+
+       rad[idx] |= port->port_num << shift;
+       return lct + 1;
+}
+
+/*
+ * return sends link address for new mstb
+ */
+static bool drm_dp_port_setup_pdt(struct drm_dp_mst_port *port)
+{
+       int ret;
+       u8 rad[6], lct;
+       bool send_link = false;
+       switch (port->pdt) {
+       case DP_PEER_DEVICE_DP_LEGACY_CONV:
+       case DP_PEER_DEVICE_SST_SINK:
+               /* add i2c over sideband */
+               ret = drm_dp_mst_register_i2c_bus(&port->aux);
+               break;
+       case DP_PEER_DEVICE_MST_BRANCHING:
+               lct = drm_dp_calculate_rad(port, rad);
+
+               port->mstb = drm_dp_add_mst_branch_device(lct, rad);
+               port->mstb->mgr = port->mgr;
+               port->mstb->port_parent = port;
+
+               send_link = true;
+               break;
+       }
+       return send_link;
+}
+
+static void drm_dp_check_port_guid(struct drm_dp_mst_branch *mstb,
+                                  struct drm_dp_mst_port *port)
+{
+       int ret;
+       if (port->dpcd_rev >= 0x12) {
+               port->guid_valid = drm_dp_validate_guid(mstb->mgr, port->guid);
+               if (!port->guid_valid) {
+                       ret = drm_dp_send_dpcd_write(mstb->mgr,
+                                                    port,
+                                                    DP_GUID,
+                                                    16, port->guid);
+                       port->guid_valid = true;
+               }
+       }
+}
+
+static void build_mst_prop_path(struct drm_dp_mst_port *port,
+                               struct drm_dp_mst_branch *mstb,
+                               char *proppath)
+{
+       int i;
+       char temp[8];
+       snprintf(proppath, 255, "mst:%d", mstb->mgr->conn_base_id);
+       for (i = 0; i < (mstb->lct - 1); i++) {
+               int shift = (i % 2) ? 0 : 4;
+               int port_num = mstb->rad[i / 2] >> shift;
+               snprintf(temp, 8, "-%d", port_num);
+               strncat(proppath, temp, 255);
+       }
+       snprintf(temp, 8, "-%d", port->port_num);
+       strncat(proppath, temp, 255);
+}
+
+static void drm_dp_add_port(struct drm_dp_mst_branch *mstb,
+                           struct device *dev,
+                           struct drm_dp_link_addr_reply_port *port_msg)
+{
+       struct drm_dp_mst_port *port;
+       bool ret;
+       bool created = false;
+       int old_pdt = 0;
+       int old_ddps = 0;
+       port = drm_dp_get_port(mstb, port_msg->port_number);
+       if (!port) {
+               port = kzalloc(sizeof(*port), GFP_KERNEL);
+               if (!port)
+                       return;
+               kref_init(&port->kref);
+               port->parent = mstb;
+               port->port_num = port_msg->port_number;
+               port->mgr = mstb->mgr;
+               port->aux.name = "DPMST";
+               port->aux.dev = dev;
+               created = true;
+       } else {
+               old_pdt = port->pdt;
+               old_ddps = port->ddps;
+       }
+
+       port->pdt = port_msg->peer_device_type;
+       port->input = port_msg->input_port;
+       port->mcs = port_msg->mcs;
+       port->ddps = port_msg->ddps;
+       port->ldps = port_msg->legacy_device_plug_status;
+       port->dpcd_rev = port_msg->dpcd_revision;
+       port->num_sdp_streams = port_msg->num_sdp_streams;
+       port->num_sdp_stream_sinks = port_msg->num_sdp_stream_sinks;
+       memcpy(port->guid, port_msg->peer_guid, 16);
+
+       /* manage mstb port lists with mgr lock - take a reference
+          for this list */
+       if (created) {
+               mutex_lock(&mstb->mgr->lock);
+               kref_get(&port->kref);
+               list_add(&port->next, &mstb->ports);
+               mutex_unlock(&mstb->mgr->lock);
+       }
+
+       if (old_ddps != port->ddps) {
+               if (port->ddps) {
+                       drm_dp_check_port_guid(mstb, port);
+                       if (!port->input)
+                               drm_dp_send_enum_path_resources(mstb->mgr, mstb, port);
+               } else {
+                       port->guid_valid = false;
+                       port->available_pbn = 0;
+                       }
+       }
+
+       if (old_pdt != port->pdt && !port->input) {
+               drm_dp_port_teardown_pdt(port, old_pdt);
+
+               ret = drm_dp_port_setup_pdt(port);
+               if (ret == true) {
+                       drm_dp_send_link_address(mstb->mgr, port->mstb);
+                       port->mstb->link_address_sent = true;
+               }
+       }
+
+       if (created && !port->input) {
+               char proppath[255];
+               build_mst_prop_path(port, mstb, proppath);
+               port->connector = (*mstb->mgr->cbs->add_connector)(mstb->mgr, port, proppath);
+       }
+
+       /* put reference to this port */
+       drm_dp_put_port(port);
+}
+
+static void drm_dp_update_port(struct drm_dp_mst_branch *mstb,
+                              struct drm_dp_connection_status_notify *conn_stat)
+{
+       struct drm_dp_mst_port *port;
+       int old_pdt;
+       int old_ddps;
+       bool dowork = false;
+       port = drm_dp_get_port(mstb, conn_stat->port_number);
+       if (!port)
+               return;
+
+       old_ddps = port->ddps;
+       old_pdt = port->pdt;
+       port->pdt = conn_stat->peer_device_type;
+       port->mcs = conn_stat->message_capability_status;
+       port->ldps = conn_stat->legacy_device_plug_status;
+       port->ddps = conn_stat->displayport_device_plug_status;
+
+       if (old_ddps != port->ddps) {
+               if (port->ddps) {
+                       drm_dp_check_port_guid(mstb, port);
+                       dowork = true;
+               } else {
+                       port->guid_valid = false;
+                       port->available_pbn = 0;
+               }
+       }
+       if (old_pdt != port->pdt && !port->input) {
+               drm_dp_port_teardown_pdt(port, old_pdt);
+
+               if (drm_dp_port_setup_pdt(port))
+                       dowork = true;
+       }
+
+       drm_dp_put_port(port);
+       if (dowork)
+               queue_work(system_long_wq, &mstb->mgr->work);
+
+}
+
+static struct drm_dp_mst_branch *drm_dp_get_mst_branch_device(struct drm_dp_mst_topology_mgr *mgr,
+                                                              u8 lct, u8 *rad)
+{
+       struct drm_dp_mst_branch *mstb;
+       struct drm_dp_mst_port *port;
+       int i;
+       /* find the port by iterating down */
+       mstb = mgr->mst_primary;
+
+       for (i = 0; i < lct - 1; i++) {
+               int shift = (i % 2) ? 0 : 4;
+               int port_num = rad[i / 2] >> shift;
+
+               list_for_each_entry(port, &mstb->ports, next) {
+                       if (port->port_num == port_num) {
+                               if (!port->mstb) {
+                                       DRM_ERROR("failed to lookup MSTB with lct %d, rad %02x\n", lct, rad[0]);
+                                       return NULL;
+                               }
+
+                               mstb = port->mstb;
+                               break;
+                       }
+               }
+       }
+       kref_get(&mstb->kref);
+       return mstb;
+}
+
+static void drm_dp_check_and_send_link_address(struct drm_dp_mst_topology_mgr *mgr,
+                                              struct drm_dp_mst_branch *mstb)
+{
+       struct drm_dp_mst_port *port;
+
+       if (!mstb->link_address_sent) {
+               drm_dp_send_link_address(mgr, mstb);
+               mstb->link_address_sent = true;
+       }
+       list_for_each_entry(port, &mstb->ports, next) {
+               if (port->input)
+                       continue;
+
+               if (!port->ddps)
+                       continue;
+
+               if (!port->available_pbn)
+                       drm_dp_send_enum_path_resources(mgr, mstb, port);
+
+               if (port->mstb)
+                       drm_dp_check_and_send_link_address(mgr, port->mstb);
+       }
+}
+
+static void drm_dp_mst_link_probe_work(struct work_struct *work)
+{
+       struct drm_dp_mst_topology_mgr *mgr = container_of(work, struct drm_dp_mst_topology_mgr, work);
+
+       drm_dp_check_and_send_link_address(mgr, mgr->mst_primary);
+
+}
+
+static bool drm_dp_validate_guid(struct drm_dp_mst_topology_mgr *mgr,
+                                u8 *guid)
+{
+       static u8 zero_guid[16];
+
+       if (!memcmp(guid, zero_guid, 16)) {
+               u64 salt = get_jiffies_64();
+               memcpy(&guid[0], &salt, sizeof(u64));
+               memcpy(&guid[8], &salt, sizeof(u64));
+               return false;
+       }
+       return true;
+}
+
+#if 0
+static int build_dpcd_read(struct drm_dp_sideband_msg_tx *msg, u8 port_num, u32 offset, u8 num_bytes)
+{
+       struct drm_dp_sideband_msg_req_body req;
+
+       req.req_type = DP_REMOTE_DPCD_READ;
+       req.u.dpcd_read.port_number = port_num;
+       req.u.dpcd_read.dpcd_address = offset;
+       req.u.dpcd_read.num_bytes = num_bytes;
+       drm_dp_encode_sideband_req(&req, msg);
+
+       return 0;
+}
+#endif
+
+static int drm_dp_send_sideband_msg(struct drm_dp_mst_topology_mgr *mgr,
+                                   bool up, u8 *msg, int len)
+{
+       int ret;
+       int regbase = up ? DP_SIDEBAND_MSG_UP_REP_BASE : DP_SIDEBAND_MSG_DOWN_REQ_BASE;
+       int tosend, total, offset;
+       int retries = 0;
+
+retry:
+       total = len;
+       offset = 0;
+       do {
+               tosend = min3(mgr->max_dpcd_transaction_bytes, 16, total);
+
+               ret = drm_dp_dpcd_write(mgr->aux, regbase + offset,
+                                       &msg[offset],
+                                       tosend);
+               if (ret != tosend) {
+                       if (ret == -EIO && retries < 5) {
+                               retries++;
+                               goto retry;
+                       }
+                       DRM_DEBUG_KMS("failed to dpcd write %d %d\n", tosend, ret);
+                       WARN(1, "fail\n");
+
+                       return -EIO;
+               }
+               offset += tosend;
+               total -= tosend;
+       } while (total > 0);
+       return 0;
+}
+
+static int set_hdr_from_dst_qlock(struct drm_dp_sideband_msg_hdr *hdr,
+                                 struct drm_dp_sideband_msg_tx *txmsg)
+{
+       struct drm_dp_mst_branch *mstb = txmsg->dst;
+
+       /* both msg slots are full */
+       if (txmsg->seqno == -1) {
+               if (mstb->tx_slots[0] && mstb->tx_slots[1]) {
+                       DRM_DEBUG_KMS("%s: failed to find slot\n", __func__);
+                       return -EAGAIN;
+               }
+               if (mstb->tx_slots[0] == NULL && mstb->tx_slots[1] == NULL) {
+                       txmsg->seqno = mstb->last_seqno;
+                       mstb->last_seqno ^= 1;
+               } else if (mstb->tx_slots[0] == NULL)
+                       txmsg->seqno = 0;
+               else
+                       txmsg->seqno = 1;
+               mstb->tx_slots[txmsg->seqno] = txmsg;
+       }
+       hdr->broadcast = 0;
+       hdr->path_msg = txmsg->path_msg;
+       hdr->lct = mstb->lct;
+       hdr->lcr = mstb->lct - 1;
+       if (mstb->lct > 1)
+               memcpy(hdr->rad, mstb->rad, mstb->lct / 2);
+       hdr->seqno = txmsg->seqno;
+       return 0;
+}
+/*
+ * process a single block of the next message in the sideband queue
+ */
+static int process_single_tx_qlock(struct drm_dp_mst_topology_mgr *mgr,
+                                  struct drm_dp_sideband_msg_tx *txmsg,
+                                  bool up)
+{
+       u8 chunk[48];
+       struct drm_dp_sideband_msg_hdr hdr;
+       int len, space, idx, tosend;
+       int ret;
+
+       memset(&hdr, 0, sizeof(struct drm_dp_sideband_msg_hdr));
+
+       if (txmsg->state == DRM_DP_SIDEBAND_TX_QUEUED) {
+               txmsg->seqno = -1;
+               txmsg->state = DRM_DP_SIDEBAND_TX_START_SEND;
+       }
+
+       /* make hdr from dst mst - for replies use seqno
+          otherwise assign one */
+       ret = set_hdr_from_dst_qlock(&hdr, txmsg);
+       if (ret < 0)
+               return ret;
+
+       /* amount left to send in this message */
+       len = txmsg->cur_len - txmsg->cur_offset;
+
+       /* 48 - sideband msg size - 1 byte for data CRC, x header bytes */
+       space = 48 - 1 - drm_dp_calc_sb_hdr_size(&hdr);
+
+       tosend = min(len, space);
+       if (len == txmsg->cur_len)
+               hdr.somt = 1;
+       if (space >= len)
+               hdr.eomt = 1;
+
+
+       hdr.msg_len = tosend + 1;
+       drm_dp_encode_sideband_msg_hdr(&hdr, chunk, &idx);
+       memcpy(&chunk[idx], &txmsg->msg[txmsg->cur_offset], tosend);
+       /* add crc at end */
+       drm_dp_crc_sideband_chunk_req(&chunk[idx], tosend);
+       idx += tosend + 1;
+
+       ret = drm_dp_send_sideband_msg(mgr, up, chunk, idx);
+       if (ret) {
+               DRM_DEBUG_KMS("sideband msg failed to send\n");
+               return ret;
+       }
+
+       txmsg->cur_offset += tosend;
+       if (txmsg->cur_offset == txmsg->cur_len) {
+               txmsg->state = DRM_DP_SIDEBAND_TX_SENT;
+               return 1;
+       }
+       return 0;
+}
+
+/* must be called holding qlock */
+static void process_single_down_tx_qlock(struct drm_dp_mst_topology_mgr *mgr)
+{
+       struct drm_dp_sideband_msg_tx *txmsg;
+       int ret;
+
+       /* construct a chunk from the first msg in the tx_msg queue */
+       if (list_empty(&mgr->tx_msg_downq)) {
+               mgr->tx_down_in_progress = false;
+               return;
+       }
+       mgr->tx_down_in_progress = true;
+
+       txmsg = list_first_entry(&mgr->tx_msg_downq, struct drm_dp_sideband_msg_tx, next);
+       ret = process_single_tx_qlock(mgr, txmsg, false);
+       if (ret == 1) {
+               /* txmsg is sent it should be in the slots now */
+               list_del(&txmsg->next);
+       } else if (ret) {
+               DRM_DEBUG_KMS("failed to send msg in q %d\n", ret);
+               list_del(&txmsg->next);
+               if (txmsg->seqno != -1)
+                       txmsg->dst->tx_slots[txmsg->seqno] = NULL;
+               txmsg->state = DRM_DP_SIDEBAND_TX_TIMEOUT;
+               wake_up(&mgr->tx_waitq);
+       }
+       if (list_empty(&mgr->tx_msg_downq)) {
+               mgr->tx_down_in_progress = false;
+               return;
+       }
+}
+
+/* called holding qlock */
+static void process_single_up_tx_qlock(struct drm_dp_mst_topology_mgr *mgr)
+{
+       struct drm_dp_sideband_msg_tx *txmsg;
+       int ret;
+
+       /* construct a chunk from the first msg in the tx_msg queue */
+       if (list_empty(&mgr->tx_msg_upq)) {
+               mgr->tx_up_in_progress = false;
+               return;
+       }
+
+       txmsg = list_first_entry(&mgr->tx_msg_upq, struct drm_dp_sideband_msg_tx, next);
+       ret = process_single_tx_qlock(mgr, txmsg, true);
+       if (ret == 1) {
+               /* up txmsgs aren't put in slots - so free after we send it */
+               list_del(&txmsg->next);
+               kfree(txmsg);
+       } else if (ret)
+               DRM_DEBUG_KMS("failed to send msg in q %d\n", ret);
+       mgr->tx_up_in_progress = true;
+}
+
+static void drm_dp_queue_down_tx(struct drm_dp_mst_topology_mgr *mgr,
+                                struct drm_dp_sideband_msg_tx *txmsg)
+{
+       mutex_lock(&mgr->qlock);
+       list_add_tail(&txmsg->next, &mgr->tx_msg_downq);
+       if (!mgr->tx_down_in_progress)
+               process_single_down_tx_qlock(mgr);
+       mutex_unlock(&mgr->qlock);
+}
+
+static int drm_dp_send_link_address(struct drm_dp_mst_topology_mgr *mgr,
+                                   struct drm_dp_mst_branch *mstb)
+{
+       int len;
+       struct drm_dp_sideband_msg_tx *txmsg;
+       int ret;
+
+       txmsg = kzalloc(sizeof(*txmsg), GFP_KERNEL);
+       if (!txmsg)
+               return -ENOMEM;
+
+       txmsg->dst = mstb;
+       len = build_link_address(txmsg);
+
+       drm_dp_queue_down_tx(mgr, txmsg);
+
+       ret = drm_dp_mst_wait_tx_reply(mstb, txmsg);
+       if (ret > 0) {
+               int i;
+
+               if (txmsg->reply.reply_type == 1)
+                       DRM_DEBUG_KMS("link address nak received\n");
+               else {
+                       DRM_DEBUG_KMS("link address reply: %d\n", txmsg->reply.u.link_addr.nports);
+                       for (i = 0; i < txmsg->reply.u.link_addr.nports; i++) {
+                               DRM_DEBUG_KMS("port %d: input %d, pdt: %d, pn: %d, dpcd_rev: %02x, mcs: %d, ddps: %d, ldps %d, sdp %d/%d\n", i,
+                                      txmsg->reply.u.link_addr.ports[i].input_port,
+                                      txmsg->reply.u.link_addr.ports[i].peer_device_type,
+                                      txmsg->reply.u.link_addr.ports[i].port_number,
+                                      txmsg->reply.u.link_addr.ports[i].dpcd_revision,
+                                      txmsg->reply.u.link_addr.ports[i].mcs,
+                                      txmsg->reply.u.link_addr.ports[i].ddps,
+                                      txmsg->reply.u.link_addr.ports[i].legacy_device_plug_status,
+                                      txmsg->reply.u.link_addr.ports[i].num_sdp_streams,
+                                      txmsg->reply.u.link_addr.ports[i].num_sdp_stream_sinks);
+                       }
+                       for (i = 0; i < txmsg->reply.u.link_addr.nports; i++) {
+                               drm_dp_add_port(mstb, mgr->dev, &txmsg->reply.u.link_addr.ports[i]);
+                       }
+                       (*mgr->cbs->hotplug)(mgr);
+               }
+       } else
+               DRM_DEBUG_KMS("link address failed %d\n", ret);
+
+       kfree(txmsg);
+       return 0;
+}
+
+static int drm_dp_send_enum_path_resources(struct drm_dp_mst_topology_mgr *mgr,
+                                          struct drm_dp_mst_branch *mstb,
+                                          struct drm_dp_mst_port *port)
+{
+       int len;
+       struct drm_dp_sideband_msg_tx *txmsg;
+       int ret;
+
+       txmsg = kzalloc(sizeof(*txmsg), GFP_KERNEL);
+       if (!txmsg)
+               return -ENOMEM;
+
+       txmsg->dst = mstb;
+       len = build_enum_path_resources(txmsg, port->port_num);
+
+       drm_dp_queue_down_tx(mgr, txmsg);
+
+       ret = drm_dp_mst_wait_tx_reply(mstb, txmsg);
+       if (ret > 0) {
+               if (txmsg->reply.reply_type == 1)
+                       DRM_DEBUG_KMS("enum path resources nak received\n");
+               else {
+                       if (port->port_num != txmsg->reply.u.path_resources.port_number)
+                               DRM_ERROR("got incorrect port in response\n");
+                       DRM_DEBUG_KMS("enum path resources %d: %d %d\n", txmsg->reply.u.path_resources.port_number, txmsg->reply.u.path_resources.full_payload_bw_number,
+                              txmsg->reply.u.path_resources.avail_payload_bw_number);
+                       port->available_pbn = txmsg->reply.u.path_resources.avail_payload_bw_number;
+               }
+       }
+
+       kfree(txmsg);
+       return 0;
+}
+
+static int drm_dp_payload_send_msg(struct drm_dp_mst_topology_mgr *mgr,
+                                  struct drm_dp_mst_port *port,
+                                  int id,
+                                  int pbn)
+{
+       struct drm_dp_sideband_msg_tx *txmsg;
+       struct drm_dp_mst_branch *mstb;
+       int len, ret;
+
+       mstb = drm_dp_get_validated_mstb_ref(mgr, port->parent);
+       if (!mstb)
+               return -EINVAL;
+
+       txmsg = kzalloc(sizeof(*txmsg), GFP_KERNEL);
+       if (!txmsg) {
+               ret = -ENOMEM;
+               goto fail_put;
+       }
+
+       txmsg->dst = mstb;
+       len = build_allocate_payload(txmsg, port->port_num,
+                                    id,
+                                    pbn);
+
+       drm_dp_queue_down_tx(mgr, txmsg);
+
+       ret = drm_dp_mst_wait_tx_reply(mstb, txmsg);
+       if (ret > 0) {
+               if (txmsg->reply.reply_type == 1) {
+                       ret = -EINVAL;
+               } else
+                       ret = 0;
+       }
+       kfree(txmsg);
+fail_put:
+       drm_dp_put_mst_branch_device(mstb);
+       return ret;
+}
+
+static int drm_dp_create_payload_step1(struct drm_dp_mst_topology_mgr *mgr,
+                                      int id,
+                                      struct drm_dp_payload *payload)
+{
+       int ret;
+
+       ret = drm_dp_dpcd_write_payload(mgr, id, payload);
+       if (ret < 0) {
+               payload->payload_state = 0;
+               return ret;
+       }
+       payload->payload_state = DP_PAYLOAD_LOCAL;
+       return 0;
+}
+
+static int drm_dp_create_payload_step2(struct drm_dp_mst_topology_mgr *mgr,
+                                      struct drm_dp_mst_port *port,
+                                      int id,
+                                      struct drm_dp_payload *payload)
+{
+       int ret;
+       ret = drm_dp_payload_send_msg(mgr, port, id, port->vcpi.pbn);
+       if (ret < 0)
+               return ret;
+       payload->payload_state = DP_PAYLOAD_REMOTE;
+       return ret;
+}
+
+static int drm_dp_destroy_payload_step1(struct drm_dp_mst_topology_mgr *mgr,
+                                       struct drm_dp_mst_port *port,
+                                       int id,
+                                       struct drm_dp_payload *payload)
+{
+       DRM_DEBUG_KMS("\n");
+       /* its okay for these to fail */
+       if (port) {
+               drm_dp_payload_send_msg(mgr, port, id, 0);
+       }
+
+       drm_dp_dpcd_write_payload(mgr, id, payload);
+       payload->payload_state = 0;
+       return 0;
+}
+
+static int drm_dp_destroy_payload_step2(struct drm_dp_mst_topology_mgr *mgr,
+                                       int id,
+                                       struct drm_dp_payload *payload)
+{
+       payload->payload_state = 0;
+       return 0;
+}
+
+/**
+ * drm_dp_update_payload_part1() - Execute payload update part 1
+ * @mgr: manager to use.
+ *
+ * This iterates over all proposed virtual channels, and tries to
+ * allocate space in the link for them. For 0->slots transitions,
+ * this step just writes the VCPI to the MST device. For slots->0
+ * transitions, this writes the updated VCPIs and removes the
+ * remote VC payloads.
+ *
+ * after calling this the driver should generate ACT and payload
+ * packets.
+ */
+int drm_dp_update_payload_part1(struct drm_dp_mst_topology_mgr *mgr)
+{
+       int i;
+       int cur_slots = 1;
+       struct drm_dp_payload req_payload;
+       struct drm_dp_mst_port *port;
+
+       mutex_lock(&mgr->payload_lock);
+       for (i = 0; i < mgr->max_payloads; i++) {
+               /* solve the current payloads - compare to the hw ones
+                  - update the hw view */
+               req_payload.start_slot = cur_slots;
+               if (mgr->proposed_vcpis[i]) {
+                       port = container_of(mgr->proposed_vcpis[i], struct drm_dp_mst_port, vcpi);
+                       req_payload.num_slots = mgr->proposed_vcpis[i]->num_slots;
+               } else {
+                       port = NULL;
+                       req_payload.num_slots = 0;
+               }
+               /* work out what is required to happen with this payload */
+               if (mgr->payloads[i].start_slot != req_payload.start_slot ||
+                   mgr->payloads[i].num_slots != req_payload.num_slots) {
+
+                       /* need to push an update for this payload */
+                       if (req_payload.num_slots) {
+                               drm_dp_create_payload_step1(mgr, i + 1, &req_payload);
+                               mgr->payloads[i].num_slots = req_payload.num_slots;
+                       } else if (mgr->payloads[i].num_slots) {
+                               mgr->payloads[i].num_slots = 0;
+                               drm_dp_destroy_payload_step1(mgr, port, i + 1, &mgr->payloads[i]);
+                               req_payload.payload_state = mgr->payloads[i].payload_state;
+                       } else
+                               req_payload.payload_state = 0;
+
+                       mgr->payloads[i].start_slot = req_payload.start_slot;
+                       mgr->payloads[i].payload_state = req_payload.payload_state;
+               }
+               cur_slots += req_payload.num_slots;
+       }
+       mutex_unlock(&mgr->payload_lock);
+
+       return 0;
+}
+EXPORT_SYMBOL(drm_dp_update_payload_part1);
+
+/**
+ * drm_dp_update_payload_part2() - Execute payload update part 2
+ * @mgr: manager to use.
+ *
+ * This iterates over all proposed virtual channels, and tries to
+ * allocate space in the link for them. For 0->slots transitions,
+ * this step writes the remote VC payload commands. For slots->0
+ * this just resets some internal state.
+ */
+int drm_dp_update_payload_part2(struct drm_dp_mst_topology_mgr *mgr)
+{
+       struct drm_dp_mst_port *port;
+       int i;
+       int ret = 0;
+       mutex_lock(&mgr->payload_lock);
+       for (i = 0; i < mgr->max_payloads; i++) {
+
+               if (!mgr->proposed_vcpis[i])
+                       continue;
+
+               port = container_of(mgr->proposed_vcpis[i], struct drm_dp_mst_port, vcpi);
+
+               DRM_DEBUG_KMS("payload %d %d\n", i, mgr->payloads[i].payload_state);
+               if (mgr->payloads[i].payload_state == DP_PAYLOAD_LOCAL) {
+                       ret = drm_dp_create_payload_step2(mgr, port, i + 1, &mgr->payloads[i]);
+               } else if (mgr->payloads[i].payload_state == DP_PAYLOAD_DELETE_LOCAL) {
+                       ret = drm_dp_destroy_payload_step2(mgr, i + 1, &mgr->payloads[i]);
+               }
+               if (ret) {
+                       mutex_unlock(&mgr->payload_lock);
+                       return ret;
+               }
+       }
+       mutex_unlock(&mgr->payload_lock);
+       return 0;
+}
+EXPORT_SYMBOL(drm_dp_update_payload_part2);
+
+#if 0 /* unused as of yet */
+static int drm_dp_send_dpcd_read(struct drm_dp_mst_topology_mgr *mgr,
+                                struct drm_dp_mst_port *port,
+                                int offset, int size)
+{
+       int len;
+       struct drm_dp_sideband_msg_tx *txmsg;
+
+       txmsg = kzalloc(sizeof(*txmsg), GFP_KERNEL);
+       if (!txmsg)
+               return -ENOMEM;
+
+       len = build_dpcd_read(txmsg, port->port_num, 0, 8);
+       txmsg->dst = port->parent;
+
+       drm_dp_queue_down_tx(mgr, txmsg);
+
+       return 0;
+}
+#endif
+
+static int drm_dp_send_dpcd_write(struct drm_dp_mst_topology_mgr *mgr,
+                                 struct drm_dp_mst_port *port,
+                                 int offset, int size, u8 *bytes)
+{
+       int len;
+       int ret;
+       struct drm_dp_sideband_msg_tx *txmsg;
+       struct drm_dp_mst_branch *mstb;
+
+       mstb = drm_dp_get_validated_mstb_ref(mgr, port->parent);
+       if (!mstb)
+               return -EINVAL;
+
+       txmsg = kzalloc(sizeof(*txmsg), GFP_KERNEL);
+       if (!txmsg) {
+               ret = -ENOMEM;
+               goto fail_put;
+       }
+
+       len = build_dpcd_write(txmsg, port->port_num, offset, size, bytes);
+       txmsg->dst = mstb;
+
+       drm_dp_queue_down_tx(mgr, txmsg);
+
+       ret = drm_dp_mst_wait_tx_reply(mstb, txmsg);
+       if (ret > 0) {
+               if (txmsg->reply.reply_type == 1) {
+                       ret = -EINVAL;
+               } else
+                       ret = 0;
+       }
+       kfree(txmsg);
+fail_put:
+       drm_dp_put_mst_branch_device(mstb);
+       return ret;
+}
+
+static int drm_dp_encode_up_ack_reply(struct drm_dp_sideband_msg_tx *msg, u8 req_type)
+{
+       struct drm_dp_sideband_msg_reply_body reply;
+
+       reply.reply_type = 1;
+       reply.req_type = req_type;
+       drm_dp_encode_sideband_reply(&reply, msg);
+       return 0;
+}
+
+static int drm_dp_send_up_ack_reply(struct drm_dp_mst_topology_mgr *mgr,
+                                   struct drm_dp_mst_branch *mstb,
+                                   int req_type, int seqno, bool broadcast)
+{
+       struct drm_dp_sideband_msg_tx *txmsg;
+
+       txmsg = kzalloc(sizeof(*txmsg), GFP_KERNEL);
+       if (!txmsg)
+               return -ENOMEM;
+
+       txmsg->dst = mstb;
+       txmsg->seqno = seqno;
+       drm_dp_encode_up_ack_reply(txmsg, req_type);
+
+       mutex_lock(&mgr->qlock);
+       list_add_tail(&txmsg->next, &mgr->tx_msg_upq);
+       if (!mgr->tx_up_in_progress) {
+               process_single_up_tx_qlock(mgr);
+       }
+       mutex_unlock(&mgr->qlock);
+       return 0;
+}
+
+static int drm_dp_get_vc_payload_bw(int dp_link_bw, int dp_link_count)
+{
+       switch (dp_link_bw) {
+       case DP_LINK_BW_1_62:
+               return 3 * dp_link_count;
+       case DP_LINK_BW_2_7:
+               return 5 * dp_link_count;
+       case DP_LINK_BW_5_4:
+               return 10 * dp_link_count;
+       }
+       return 0;
+}
+
+/**
+ * drm_dp_mst_topology_mgr_set_mst() - Set the MST state for a topology manager
+ * @mgr: manager to set state for
+ * @mst_state: true to enable MST on this connector - false to disable.
+ *
+ * This is called by the driver when it detects an MST capable device plugged
+ * into a DP MST capable port, or when a DP MST capable device is unplugged.
+ */
+int drm_dp_mst_topology_mgr_set_mst(struct drm_dp_mst_topology_mgr *mgr, bool mst_state)
+{
+       int ret = 0;
+       struct drm_dp_mst_branch *mstb = NULL;
+
+       mutex_lock(&mgr->lock);
+       if (mst_state == mgr->mst_state)
+               goto out_unlock;
+
+       mgr->mst_state = mst_state;
+       /* set the device into MST mode */
+       if (mst_state) {
+               WARN_ON(mgr->mst_primary);
+
+               /* get dpcd info */
+               ret = drm_dp_dpcd_read(mgr->aux, DP_DPCD_REV, mgr->dpcd, DP_RECEIVER_CAP_SIZE);
+               if (ret != DP_RECEIVER_CAP_SIZE) {
+                       DRM_DEBUG_KMS("failed to read DPCD\n");
+                       goto out_unlock;
+               }
+
+               mgr->pbn_div = drm_dp_get_vc_payload_bw(mgr->dpcd[1], mgr->dpcd[2] & DP_MAX_LANE_COUNT_MASK);
+               mgr->total_pbn = 2560;
+               mgr->total_slots = DIV_ROUND_UP(mgr->total_pbn, mgr->pbn_div);
+               mgr->avail_slots = mgr->total_slots;
+
+               /* add initial branch device at LCT 1 */
+               mstb = drm_dp_add_mst_branch_device(1, NULL);
+               if (mstb == NULL) {
+                       ret = -ENOMEM;
+                       goto out_unlock;
+               }
+               mstb->mgr = mgr;
+
+               /* give this the main reference */
+               mgr->mst_primary = mstb;
+               kref_get(&mgr->mst_primary->kref);
+
+               {
+                       struct drm_dp_payload reset_pay;
+                       reset_pay.start_slot = 0;
+                       reset_pay.num_slots = 0x3f;
+                       drm_dp_dpcd_write_payload(mgr, 0, &reset_pay);
+               }
+
+               ret = drm_dp_dpcd_writeb(mgr->aux, DP_MSTM_CTRL,
+                                        DP_MST_EN | DP_UP_REQ_EN | DP_UPSTREAM_IS_SRC);
+               if (ret < 0) {
+                       goto out_unlock;
+               }
+
+
+               /* sort out guid */
+               ret = drm_dp_dpcd_read(mgr->aux, DP_GUID, mgr->guid, 16);
+               if (ret != 16) {
+                       DRM_DEBUG_KMS("failed to read DP GUID %d\n", ret);
+                       goto out_unlock;
+               }
+
+               mgr->guid_valid = drm_dp_validate_guid(mgr, mgr->guid);
+               if (!mgr->guid_valid) {
+                       ret = drm_dp_dpcd_write(mgr->aux, DP_GUID, mgr->guid, 16);
+                       mgr->guid_valid = true;
+               }
+
+               queue_work(system_long_wq, &mgr->work);
+
+               ret = 0;
+       } else {
+               /* disable MST on the device */
+               mstb = mgr->mst_primary;
+               mgr->mst_primary = NULL;
+               /* this can fail if the device is gone */
+               drm_dp_dpcd_writeb(mgr->aux, DP_MSTM_CTRL, 0);
+               ret = 0;
+               memset(mgr->payloads, 0, mgr->max_payloads * sizeof(struct drm_dp_payload));
+               mgr->payload_mask = 0;
+               set_bit(0, &mgr->payload_mask);
+       }
+
+out_unlock:
+       mutex_unlock(&mgr->lock);
+       if (mstb)
+               drm_dp_put_mst_branch_device(mstb);
+       return ret;
+
+}
+EXPORT_SYMBOL(drm_dp_mst_topology_mgr_set_mst);
+
+/**
+ * drm_dp_mst_topology_mgr_suspend() - suspend the MST manager
+ * @mgr: manager to suspend
+ *
+ * This function tells the MST device that we can't handle UP messages
+ * anymore. This should stop it from sending any since we are suspended.
+ */
+void drm_dp_mst_topology_mgr_suspend(struct drm_dp_mst_topology_mgr *mgr)
+{
+       mutex_lock(&mgr->lock);
+       drm_dp_dpcd_writeb(mgr->aux, DP_MSTM_CTRL,
+                          DP_MST_EN | DP_UPSTREAM_IS_SRC);
+       mutex_unlock(&mgr->lock);
+}
+EXPORT_SYMBOL(drm_dp_mst_topology_mgr_suspend);
+
+/**
+ * drm_dp_mst_topology_mgr_resume() - resume the MST manager
+ * @mgr: manager to resume
+ *
+ * This will fetch DPCD and see if the device is still there,
+ * if it is, it will rewrite the MSTM control bits, and return.
+ *
+ * if the device fails this returns -1, and the driver should do
+ * a full MST reprobe, in case we were undocked.
+ */
+int drm_dp_mst_topology_mgr_resume(struct drm_dp_mst_topology_mgr *mgr)
+{
+       int ret = 0;
+
+       mutex_lock(&mgr->lock);
+
+       if (mgr->mst_primary) {
+               int sret;
+               sret = drm_dp_dpcd_read(mgr->aux, DP_DPCD_REV, mgr->dpcd, DP_RECEIVER_CAP_SIZE);
+               if (sret != DP_RECEIVER_CAP_SIZE) {
+                       DRM_DEBUG_KMS("dpcd read failed - undocked during suspend?\n");
+                       ret = -1;
+                       goto out_unlock;
+               }
+
+               ret = drm_dp_dpcd_writeb(mgr->aux, DP_MSTM_CTRL,
+                                        DP_MST_EN | DP_UP_REQ_EN | DP_UPSTREAM_IS_SRC);
+               if (ret < 0) {
+                       DRM_DEBUG_KMS("mst write failed - undocked during suspend?\n");
+                       ret = -1;
+                       goto out_unlock;
+               }
+               ret = 0;
+       } else
+               ret = -1;
+
+out_unlock:
+       mutex_unlock(&mgr->lock);
+       return ret;
+}
+EXPORT_SYMBOL(drm_dp_mst_topology_mgr_resume);
+
+static void drm_dp_get_one_sb_msg(struct drm_dp_mst_topology_mgr *mgr, bool up)
+{
+       int len;
+       u8 replyblock[32];
+       int replylen, origlen, curreply;
+       int ret;
+       struct drm_dp_sideband_msg_rx *msg;
+       int basereg = up ? DP_SIDEBAND_MSG_UP_REQ_BASE : DP_SIDEBAND_MSG_DOWN_REP_BASE;
+       msg = up ? &mgr->up_req_recv : &mgr->down_rep_recv;
+
+       len = min(mgr->max_dpcd_transaction_bytes, 16);
+       ret = drm_dp_dpcd_read(mgr->aux, basereg,
+                              replyblock, len);
+       if (ret != len) {
+               DRM_DEBUG_KMS("failed to read DPCD down rep %d %d\n", len, ret);
+               return;
+       }
+       ret = drm_dp_sideband_msg_build(msg, replyblock, len, true);
+       if (!ret) {
+               DRM_DEBUG_KMS("sideband msg build failed %d\n", replyblock[0]);
+               return;
+       }
+       replylen = msg->curchunk_len + msg->curchunk_hdrlen;
+
+       origlen = replylen;
+       replylen -= len;
+       curreply = len;
+       while (replylen > 0) {
+               len = min3(replylen, mgr->max_dpcd_transaction_bytes, 16);
+               ret = drm_dp_dpcd_read(mgr->aux, basereg + curreply,
+                                   replyblock, len);
+               if (ret != len) {
+                       DRM_DEBUG_KMS("failed to read a chunk\n");
+               }
+               ret = drm_dp_sideband_msg_build(msg, replyblock, len, false);
+               if (ret == false)
+                       DRM_DEBUG_KMS("failed to build sideband msg\n");
+               curreply += len;
+               replylen -= len;
+       }
+}
+
+static int drm_dp_mst_handle_down_rep(struct drm_dp_mst_topology_mgr *mgr)
+{
+       int ret = 0;
+
+       drm_dp_get_one_sb_msg(mgr, false);
+
+       if (mgr->down_rep_recv.have_eomt) {
+               struct drm_dp_sideband_msg_tx *txmsg;
+               struct drm_dp_mst_branch *mstb;
+               int slot = -1;
+               mstb = drm_dp_get_mst_branch_device(mgr,
+                                                   mgr->down_rep_recv.initial_hdr.lct,
+                                                   mgr->down_rep_recv.initial_hdr.rad);
+
+               if (!mstb) {
+                       DRM_DEBUG_KMS("Got MST reply from unknown device %d\n", mgr->down_rep_recv.initial_hdr.lct);
+                       memset(&mgr->down_rep_recv, 0, sizeof(struct drm_dp_sideband_msg_rx));
+                       return 0;
+               }
+
+               /* find the message */
+               slot = mgr->down_rep_recv.initial_hdr.seqno;
+               mutex_lock(&mgr->qlock);
+               txmsg = mstb->tx_slots[slot];
+               /* remove from slots */
+               mutex_unlock(&mgr->qlock);
+
+               if (!txmsg) {
+                       DRM_DEBUG_KMS("Got MST reply with no msg %p %d %d %02x %02x\n",
+                              mstb,
+                              mgr->down_rep_recv.initial_hdr.seqno,
+                              mgr->down_rep_recv.initial_hdr.lct,
+                                     mgr->down_rep_recv.initial_hdr.rad[0],
+                                     mgr->down_rep_recv.msg[0]);
+                       drm_dp_put_mst_branch_device(mstb);
+                       memset(&mgr->down_rep_recv, 0, sizeof(struct drm_dp_sideband_msg_rx));
+                       return 0;
+               }
+
+               drm_dp_sideband_parse_reply(&mgr->down_rep_recv, &txmsg->reply);
+               if (txmsg->reply.reply_type == 1) {
+                       DRM_DEBUG_KMS("Got NAK reply: req 0x%02x, reason 0x%02x, nak data 0x%02x\n", txmsg->reply.req_type, txmsg->reply.u.nak.reason, txmsg->reply.u.nak.nak_data);
+               }
+
+               memset(&mgr->down_rep_recv, 0, sizeof(struct drm_dp_sideband_msg_rx));
+               drm_dp_put_mst_branch_device(mstb);
+
+               mutex_lock(&mgr->qlock);
+               txmsg->state = DRM_DP_SIDEBAND_TX_RX;
+               mstb->tx_slots[slot] = NULL;
+               mutex_unlock(&mgr->qlock);
+
+               wake_up(&mgr->tx_waitq);
+       }
+       return ret;
+}
+
+static int drm_dp_mst_handle_up_req(struct drm_dp_mst_topology_mgr *mgr)
+{
+       int ret = 0;
+       drm_dp_get_one_sb_msg(mgr, true);
+
+       if (mgr->up_req_recv.have_eomt) {
+               struct drm_dp_sideband_msg_req_body msg;
+               struct drm_dp_mst_branch *mstb;
+               bool seqno;
+               mstb = drm_dp_get_mst_branch_device(mgr,
+                                                   mgr->up_req_recv.initial_hdr.lct,
+                                                   mgr->up_req_recv.initial_hdr.rad);
+               if (!mstb) {
+                       DRM_DEBUG_KMS("Got MST reply from unknown device %d\n", mgr->up_req_recv.initial_hdr.lct);
+                       memset(&mgr->up_req_recv, 0, sizeof(struct drm_dp_sideband_msg_rx));
+                       return 0;
+               }
+
+               seqno = mgr->up_req_recv.initial_hdr.seqno;
+               drm_dp_sideband_parse_req(&mgr->up_req_recv, &msg);
+
+               if (msg.req_type == DP_CONNECTION_STATUS_NOTIFY) {
+                       drm_dp_send_up_ack_reply(mgr, mstb, msg.req_type, seqno, false);
+                       drm_dp_update_port(mstb, &msg.u.conn_stat);
+                       DRM_DEBUG_KMS("Got CSN: pn: %d ldps:%d ddps: %d mcs: %d ip: %d pdt: %d\n", msg.u.conn_stat.port_number, msg.u.conn_stat.legacy_device_plug_status, msg.u.conn_stat.displayport_device_plug_status, msg.u.conn_stat.message_capability_status, msg.u.conn_stat.input_port, msg.u.conn_stat.peer_device_type);
+                       (*mgr->cbs->hotplug)(mgr);
+
+               } else if (msg.req_type == DP_RESOURCE_STATUS_NOTIFY) {
+                       drm_dp_send_up_ack_reply(mgr, mstb, msg.req_type, seqno, false);
+                       DRM_DEBUG_KMS("Got RSN: pn: %d avail_pbn %d\n", msg.u.resource_stat.port_number, msg.u.resource_stat.available_pbn);
+               }
+
+               drm_dp_put_mst_branch_device(mstb);
+               memset(&mgr->up_req_recv, 0, sizeof(struct drm_dp_sideband_msg_rx));
+       }
+       return ret;
+}
+
+/**
+ * drm_dp_mst_hpd_irq() - MST hotplug IRQ notify
+ * @mgr: manager to notify irq for.
+ * @esi: 4 bytes from SINK_COUNT_ESI
+ *
+ * This should be called from the driver when it detects a short IRQ,
+ * along with the value of the DEVICE_SERVICE_IRQ_VECTOR_ESI0. The
+ * topology manager will process the sideband messages received as a result
+ * of this.
+ */
+int drm_dp_mst_hpd_irq(struct drm_dp_mst_topology_mgr *mgr, u8 *esi, bool *handled)
+{
+       int ret = 0;
+       int sc;
+       *handled = false;
+       sc = esi[0] & 0x3f;
+
+       if (sc != mgr->sink_count) {
+               mgr->sink_count = sc;
+               *handled = true;
+       }
+
+       if (esi[1] & DP_DOWN_REP_MSG_RDY) {
+               ret = drm_dp_mst_handle_down_rep(mgr);
+               *handled = true;
+       }
+
+       if (esi[1] & DP_UP_REQ_MSG_RDY) {
+               ret |= drm_dp_mst_handle_up_req(mgr);
+               *handled = true;
+       }
+
+       drm_dp_mst_kick_tx(mgr);
+       return ret;
+}
+EXPORT_SYMBOL(drm_dp_mst_hpd_irq);
+
+/**
+ * drm_dp_mst_detect_port() - get connection status for an MST port
+ * @mgr: manager for this port
+ * @port: unverified pointer to a port
+ *
+ * This returns the current connection state for a port. It validates the
+ * port pointer still exists so the caller doesn't require a reference
+ */
+enum drm_connector_status drm_dp_mst_detect_port(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port)
+{
+       enum drm_connector_status status = connector_status_disconnected;
+
+       /* we need to search for the port in the mgr in case its gone */
+       port = drm_dp_get_validated_port_ref(mgr, port);
+       if (!port)
+               return connector_status_disconnected;
+
+       if (!port->ddps)
+               goto out;
+
+       switch (port->pdt) {
+       case DP_PEER_DEVICE_NONE:
+       case DP_PEER_DEVICE_MST_BRANCHING:
+               break;
+
+       case DP_PEER_DEVICE_SST_SINK:
+               status = connector_status_connected;
+               break;
+       case DP_PEER_DEVICE_DP_LEGACY_CONV:
+               if (port->ldps)
+                       status = connector_status_connected;
+               break;
+       }
+out:
+       drm_dp_put_port(port);
+       return status;
+}
+EXPORT_SYMBOL(drm_dp_mst_detect_port);
+
+/**
+ * drm_dp_mst_get_edid() - get EDID for an MST port
+ * @connector: toplevel connector to get EDID for
+ * @mgr: manager for this port
+ * @port: unverified pointer to a port.
+ *
+ * This returns an EDID for the port connected to a connector,
+ * It validates the pointer still exists so the caller doesn't require a
+ * reference.
+ */
+struct edid *drm_dp_mst_get_edid(struct drm_connector *connector, struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port)
+{
+       struct edid *edid = NULL;
+
+       /* we need to search for the port in the mgr in case its gone */
+       port = drm_dp_get_validated_port_ref(mgr, port);
+       if (!port)
+               return NULL;
+
+       edid = drm_get_edid(connector, &port->aux.ddc);
+       drm_dp_put_port(port);
+       return edid;
+}
+EXPORT_SYMBOL(drm_dp_mst_get_edid);
+
+/**
+ * drm_dp_find_vcpi_slots() - find slots for this PBN value
+ * @mgr: manager to use
+ * @pbn: payload bandwidth to convert into slots.
+ */
+int drm_dp_find_vcpi_slots(struct drm_dp_mst_topology_mgr *mgr,
+                          int pbn)
+{
+       int num_slots;
+
+       num_slots = DIV_ROUND_UP(pbn, mgr->pbn_div);
+
+       if (num_slots > mgr->avail_slots)
+               return -ENOSPC;
+       return num_slots;
+}
+EXPORT_SYMBOL(drm_dp_find_vcpi_slots);
+
+static int drm_dp_init_vcpi(struct drm_dp_mst_topology_mgr *mgr,
+                           struct drm_dp_vcpi *vcpi, int pbn)
+{
+       int num_slots;
+       int ret;
+
+       num_slots = DIV_ROUND_UP(pbn, mgr->pbn_div);
+
+       if (num_slots > mgr->avail_slots)
+               return -ENOSPC;
+
+       vcpi->pbn = pbn;
+       vcpi->aligned_pbn = num_slots * mgr->pbn_div;
+       vcpi->num_slots = num_slots;
+
+       ret = drm_dp_mst_assign_payload_id(mgr, vcpi);
+       if (ret < 0)
+               return ret;
+       return 0;
+}
+
+/**
+ * drm_dp_mst_allocate_vcpi() - Allocate a virtual channel
+ * @mgr: manager for this port
+ * @port: port to allocate a virtual channel for.
+ * @pbn: payload bandwidth number to request
+ * @slots: returned number of slots for this PBN.
+ */
+bool drm_dp_mst_allocate_vcpi(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port, int pbn, int *slots)
+{
+       int ret;
+
+       port = drm_dp_get_validated_port_ref(mgr, port);
+       if (!port)
+               return false;
+
+       if (port->vcpi.vcpi > 0) {
+               DRM_DEBUG_KMS("payload: vcpi %d already allocated for pbn %d - requested pbn %d\n", port->vcpi.vcpi, port->vcpi.pbn, pbn);
+               if (pbn == port->vcpi.pbn) {
+                       *slots = port->vcpi.num_slots;
+                       return true;
+               }
+       }
+
+       ret = drm_dp_init_vcpi(mgr, &port->vcpi, pbn);
+       if (ret) {
+               DRM_DEBUG_KMS("failed to init vcpi %d %d %d\n", DIV_ROUND_UP(pbn, mgr->pbn_div), mgr->avail_slots, ret);
+               goto out;
+       }
+       DRM_DEBUG_KMS("initing vcpi for %d %d\n", pbn, port->vcpi.num_slots);
+       *slots = port->vcpi.num_slots;
+
+       drm_dp_put_port(port);
+       return true;
+out:
+       return false;
+}
+EXPORT_SYMBOL(drm_dp_mst_allocate_vcpi);
+
+/**
+ * drm_dp_mst_reset_vcpi_slots() - Reset number of slots to 0 for VCPI
+ * @mgr: manager for this port
+ * @port: unverified pointer to a port.
+ *
+ * This just resets the number of slots for the ports VCPI for later programming.
+ */
+void drm_dp_mst_reset_vcpi_slots(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port)
+{
+       port = drm_dp_get_validated_port_ref(mgr, port);
+       if (!port)
+               return;
+       port->vcpi.num_slots = 0;
+       drm_dp_put_port(port);
+}
+EXPORT_SYMBOL(drm_dp_mst_reset_vcpi_slots);
+
+/**
+ * drm_dp_mst_deallocate_vcpi() - deallocate a VCPI
+ * @mgr: manager for this port
+ * @port: unverified port to deallocate vcpi for
+ */
+void drm_dp_mst_deallocate_vcpi(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port)
+{
+       port = drm_dp_get_validated_port_ref(mgr, port);
+       if (!port)
+               return;
+
+       drm_dp_mst_put_payload_id(mgr, port->vcpi.vcpi);
+       port->vcpi.num_slots = 0;
+       port->vcpi.pbn = 0;
+       port->vcpi.aligned_pbn = 0;
+       port->vcpi.vcpi = 0;
+       drm_dp_put_port(port);
+}
+EXPORT_SYMBOL(drm_dp_mst_deallocate_vcpi);
+
+static int drm_dp_dpcd_write_payload(struct drm_dp_mst_topology_mgr *mgr,
+                                    int id, struct drm_dp_payload *payload)
+{
+       u8 payload_alloc[3], status;
+       int ret;
+       int retries = 0;
+
+       drm_dp_dpcd_writeb(mgr->aux, DP_PAYLOAD_TABLE_UPDATE_STATUS,
+                          DP_PAYLOAD_TABLE_UPDATED);
+
+       payload_alloc[0] = id;
+       payload_alloc[1] = payload->start_slot;
+       payload_alloc[2] = payload->num_slots;
+
+       ret = drm_dp_dpcd_write(mgr->aux, DP_PAYLOAD_ALLOCATE_SET, payload_alloc, 3);
+       if (ret != 3) {
+               DRM_DEBUG_KMS("failed to write payload allocation %d\n", ret);
+               goto fail;
+       }
+
+retry:
+       ret = drm_dp_dpcd_readb(mgr->aux, DP_PAYLOAD_TABLE_UPDATE_STATUS, &status);
+       if (ret < 0) {
+               DRM_DEBUG_KMS("failed to read payload table status %d\n", ret);
+               goto fail;
+       }
+
+       if (!(status & DP_PAYLOAD_TABLE_UPDATED)) {
+               retries++;
+               if (retries < 20) {
+                       usleep_range(10000, 20000);
+                       goto retry;
+               }
+               DRM_DEBUG_KMS("status not set after read payload table status %d\n", status);
+               ret = -EINVAL;
+               goto fail;
+       }
+       ret = 0;
+fail:
+       return ret;
+}
+
+
+/**
+ * drm_dp_check_act_status() - Check ACT handled status.
+ * @mgr: manager to use
+ *
+ * Check the payload status bits in the DPCD for ACT handled completion.
+ */
+int drm_dp_check_act_status(struct drm_dp_mst_topology_mgr *mgr)
+{
+       u8 status;
+       int ret;
+       int count = 0;
+
+       do {
+               ret = drm_dp_dpcd_readb(mgr->aux, DP_PAYLOAD_TABLE_UPDATE_STATUS, &status);
+
+               if (ret < 0) {
+                       DRM_DEBUG_KMS("failed to read payload table status %d\n", ret);
+                       goto fail;
+               }
+
+               if (status & DP_PAYLOAD_ACT_HANDLED)
+                       break;
+               count++;
+               udelay(100);
+
+       } while (count < 30);
+
+       if (!(status & DP_PAYLOAD_ACT_HANDLED)) {
+               DRM_DEBUG_KMS("failed to get ACT bit %d after %d retries\n", status, count);
+               ret = -EINVAL;
+               goto fail;
+       }
+       return 0;
+fail:
+       return ret;
+}
+EXPORT_SYMBOL(drm_dp_check_act_status);
+
+/**
+ * drm_dp_calc_pbn_mode() - Calculate the PBN for a mode.
+ * @clock: dot clock for the mode
+ * @bpp: bpp for the mode.
+ *
+ * This uses the formula in the spec to calculate the PBN value for a mode.
+ */
+int drm_dp_calc_pbn_mode(int clock, int bpp)
+{
+       fixed20_12 pix_bw;
+       fixed20_12 fbpp;
+       fixed20_12 result;
+       fixed20_12 margin, tmp;
+       u32 res;
+
+       pix_bw.full = dfixed_const(clock);
+       fbpp.full = dfixed_const(bpp);
+       tmp.full = dfixed_const(8);
+       fbpp.full = dfixed_div(fbpp, tmp);
+
+       result.full = dfixed_mul(pix_bw, fbpp);
+       margin.full = dfixed_const(54);
+       tmp.full = dfixed_const(64);
+       margin.full = dfixed_div(margin, tmp);
+       result.full = dfixed_div(result, margin);
+
+       margin.full = dfixed_const(1006);
+       tmp.full = dfixed_const(1000);
+       margin.full = dfixed_div(margin, tmp);
+       result.full = dfixed_mul(result, margin);
+
+       result.full = dfixed_div(result, tmp);
+       result.full = dfixed_ceil(result);
+       res = dfixed_trunc(result);
+       return res;
+}
+EXPORT_SYMBOL(drm_dp_calc_pbn_mode);
+
+static int test_calc_pbn_mode(void)
+{
+       int ret;
+       ret = drm_dp_calc_pbn_mode(154000, 30);
+       if (ret != 689)
+               return -EINVAL;
+       ret = drm_dp_calc_pbn_mode(234000, 30);
+       if (ret != 1047)
+               return -EINVAL;
+       return 0;
+}
+
+/* we want to kick the TX after we've ack the up/down IRQs. */
+static void drm_dp_mst_kick_tx(struct drm_dp_mst_topology_mgr *mgr)
+{
+       queue_work(system_long_wq, &mgr->tx_work);
+}
+
+static void drm_dp_mst_dump_mstb(struct seq_file *m,
+                                struct drm_dp_mst_branch *mstb)
+{
+       struct drm_dp_mst_port *port;
+       int tabs = mstb->lct;
+       char prefix[10];
+       int i;
+
+       for (i = 0; i < tabs; i++)
+               prefix[i] = '\t';
+       prefix[i] = '\0';
+
+       seq_printf(m, "%smst: %p, %d\n", prefix, mstb, mstb->num_ports);
+       list_for_each_entry(port, &mstb->ports, next) {
+               seq_printf(m, "%sport: %d: ddps: %d ldps: %d, %p, conn: %p\n", prefix, port->port_num, port->ddps, port->ldps, port, port->connector);
+               if (port->mstb)
+                       drm_dp_mst_dump_mstb(m, port->mstb);
+       }
+}
+
+static bool dump_dp_payload_table(struct drm_dp_mst_topology_mgr *mgr,
+                                 char *buf)
+{
+       int ret;
+       int i;
+       for (i = 0; i < 4; i++) {
+               ret = drm_dp_dpcd_read(mgr->aux, DP_PAYLOAD_TABLE_UPDATE_STATUS + (i * 16), &buf[i * 16], 16);
+               if (ret != 16)
+                       break;
+       }
+       if (i == 4)
+               return true;
+       return false;
+}
+
+/**
+ * drm_dp_mst_dump_topology(): dump topology to seq file.
+ * @m: seq_file to dump output to
+ * @mgr: manager to dump current topology for.
+ *
+ * helper to dump MST topology to a seq file for debugfs.
+ */
+void drm_dp_mst_dump_topology(struct seq_file *m,
+                             struct drm_dp_mst_topology_mgr *mgr)
+{
+       int i;
+       struct drm_dp_mst_port *port;
+       mutex_lock(&mgr->lock);
+       if (mgr->mst_primary)
+               drm_dp_mst_dump_mstb(m, mgr->mst_primary);
+
+       /* dump VCPIs */
+       mutex_unlock(&mgr->lock);
+
+       mutex_lock(&mgr->payload_lock);
+       seq_printf(m, "vcpi: %lx\n", mgr->payload_mask);
+
+       for (i = 0; i < mgr->max_payloads; i++) {
+               if (mgr->proposed_vcpis[i]) {
+                       port = container_of(mgr->proposed_vcpis[i], struct drm_dp_mst_port, vcpi);
+                       seq_printf(m, "vcpi %d: %d %d %d\n", i, port->port_num, port->vcpi.vcpi, port->vcpi.num_slots);
+               } else
+                       seq_printf(m, "vcpi %d:unsed\n", i);
+       }
+       for (i = 0; i < mgr->max_payloads; i++) {
+               seq_printf(m, "payload %d: %d, %d, %d\n",
+                          i,
+                          mgr->payloads[i].payload_state,
+                          mgr->payloads[i].start_slot,
+                          mgr->payloads[i].num_slots);
+
+
+       }
+       mutex_unlock(&mgr->payload_lock);
+
+       mutex_lock(&mgr->lock);
+       if (mgr->mst_primary) {
+               u8 buf[64];
+               bool bret;
+               int ret;
+               ret = drm_dp_dpcd_read(mgr->aux, DP_DPCD_REV, buf, DP_RECEIVER_CAP_SIZE);
+               seq_printf(m, "dpcd: ");
+               for (i = 0; i < DP_RECEIVER_CAP_SIZE; i++)
+                       seq_printf(m, "%02x ", buf[i]);
+               seq_printf(m, "\n");
+               ret = drm_dp_dpcd_read(mgr->aux, DP_FAUX_CAP, buf, 2);
+               seq_printf(m, "faux/mst: ");
+               for (i = 0; i < 2; i++)
+                       seq_printf(m, "%02x ", buf[i]);
+               seq_printf(m, "\n");
+               ret = drm_dp_dpcd_read(mgr->aux, DP_MSTM_CTRL, buf, 1);
+               seq_printf(m, "mst ctrl: ");
+               for (i = 0; i < 1; i++)
+                       seq_printf(m, "%02x ", buf[i]);
+               seq_printf(m, "\n");
+
+               bret = dump_dp_payload_table(mgr, buf);
+               if (bret == true) {
+                       seq_printf(m, "payload table: ");
+                       for (i = 0; i < 63; i++)
+                               seq_printf(m, "%02x ", buf[i]);
+                       seq_printf(m, "\n");
+               }
+
+       }
+
+       mutex_unlock(&mgr->lock);
+
+}
+EXPORT_SYMBOL(drm_dp_mst_dump_topology);
+
+static void drm_dp_tx_work(struct work_struct *work)
+{
+       struct drm_dp_mst_topology_mgr *mgr = container_of(work, struct drm_dp_mst_topology_mgr, tx_work);
+
+       mutex_lock(&mgr->qlock);
+       if (mgr->tx_down_in_progress)
+               process_single_down_tx_qlock(mgr);
+       mutex_unlock(&mgr->qlock);
+}
+
+/**
+ * drm_dp_mst_topology_mgr_init - initialise a topology manager
+ * @mgr: manager struct to initialise
+ * @dev: device providing this structure - for i2c addition.
+ * @aux: DP helper aux channel to talk to this device
+ * @max_dpcd_transaction_bytes: hw specific DPCD transaction limit
+ * @max_payloads: maximum number of payloads this GPU can source
+ * @conn_base_id: the connector object ID the MST device is connected to.
+ *
+ * Return 0 for success, or negative error code on failure
+ */
+int drm_dp_mst_topology_mgr_init(struct drm_dp_mst_topology_mgr *mgr,
+                                struct device *dev, struct drm_dp_aux *aux,
+                                int max_dpcd_transaction_bytes,
+                                int max_payloads, int conn_base_id)
+{
+       mutex_init(&mgr->lock);
+       mutex_init(&mgr->qlock);
+       mutex_init(&mgr->payload_lock);
+       INIT_LIST_HEAD(&mgr->tx_msg_upq);
+       INIT_LIST_HEAD(&mgr->tx_msg_downq);
+       INIT_WORK(&mgr->work, drm_dp_mst_link_probe_work);
+       INIT_WORK(&mgr->tx_work, drm_dp_tx_work);
+       init_waitqueue_head(&mgr->tx_waitq);
+       mgr->dev = dev;
+       mgr->aux = aux;
+       mgr->max_dpcd_transaction_bytes = max_dpcd_transaction_bytes;
+       mgr->max_payloads = max_payloads;
+       mgr->conn_base_id = conn_base_id;
+       mgr->payloads = kcalloc(max_payloads, sizeof(struct drm_dp_payload), GFP_KERNEL);
+       if (!mgr->payloads)
+               return -ENOMEM;
+       mgr->proposed_vcpis = kcalloc(max_payloads, sizeof(struct drm_dp_vcpi *), GFP_KERNEL);
+       if (!mgr->proposed_vcpis)
+               return -ENOMEM;
+       set_bit(0, &mgr->payload_mask);
+       test_calc_pbn_mode();
+       return 0;
+}
+EXPORT_SYMBOL(drm_dp_mst_topology_mgr_init);
+
+/**
+ * drm_dp_mst_topology_mgr_destroy() - destroy topology manager.
+ * @mgr: manager to destroy
+ */
+void drm_dp_mst_topology_mgr_destroy(struct drm_dp_mst_topology_mgr *mgr)
+{
+       mutex_lock(&mgr->payload_lock);
+       kfree(mgr->payloads);
+       mgr->payloads = NULL;
+       kfree(mgr->proposed_vcpis);
+       mgr->proposed_vcpis = NULL;
+       mutex_unlock(&mgr->payload_lock);
+       mgr->dev = NULL;
+       mgr->aux = NULL;
+}
+EXPORT_SYMBOL(drm_dp_mst_topology_mgr_destroy);
+
+/* I2C device */
+static int drm_dp_mst_i2c_xfer(struct i2c_adapter *adapter, struct i2c_msg *msgs,
+                              int num)
+{
+       struct drm_dp_aux *aux = adapter->algo_data;
+       struct drm_dp_mst_port *port = container_of(aux, struct drm_dp_mst_port, aux);
+       struct drm_dp_mst_branch *mstb;
+       struct drm_dp_mst_topology_mgr *mgr = port->mgr;
+       unsigned int i;
+       bool reading = false;
+       struct drm_dp_sideband_msg_req_body msg;
+       struct drm_dp_sideband_msg_tx *txmsg = NULL;
+       int ret;
+
+       mstb = drm_dp_get_validated_mstb_ref(mgr, port->parent);
+       if (!mstb)
+               return -EREMOTEIO;
+
+       /* construct i2c msg */
+       /* see if last msg is a read */
+       if (msgs[num - 1].flags & I2C_M_RD)
+               reading = true;
+
+       if (!reading) {
+               DRM_DEBUG_KMS("Unsupported I2C transaction for MST device\n");
+               ret = -EIO;
+               goto out;
+       }
+
+       msg.req_type = DP_REMOTE_I2C_READ;
+       msg.u.i2c_read.num_transactions = num - 1;
+       msg.u.i2c_read.port_number = port->port_num;
+       for (i = 0; i < num - 1; i++) {
+               msg.u.i2c_read.transactions[i].i2c_dev_id = msgs[i].addr;
+               msg.u.i2c_read.transactions[i].num_bytes = msgs[i].len;
+               msg.u.i2c_read.transactions[i].bytes = msgs[i].buf;
+       }
+       msg.u.i2c_read.read_i2c_device_id = msgs[num - 1].addr;
+       msg.u.i2c_read.num_bytes_read = msgs[num - 1].len;
+
+       txmsg = kzalloc(sizeof(*txmsg), GFP_KERNEL);
+       if (!txmsg) {
+               ret = -ENOMEM;
+               goto out;
+       }
+
+       txmsg->dst = mstb;
+       drm_dp_encode_sideband_req(&msg, txmsg);
+
+       drm_dp_queue_down_tx(mgr, txmsg);
+
+       ret = drm_dp_mst_wait_tx_reply(mstb, txmsg);
+       if (ret > 0) {
+
+               if (txmsg->reply.reply_type == 1) { /* got a NAK back */
+                       ret = -EREMOTEIO;
+                       goto out;
+               }
+               if (txmsg->reply.u.remote_i2c_read_ack.num_bytes != msgs[num - 1].len) {
+                       ret = -EIO;
+                       goto out;
+               }
+               memcpy(msgs[num - 1].buf, txmsg->reply.u.remote_i2c_read_ack.bytes, msgs[num - 1].len);
+               ret = num;
+       }
+out:
+       kfree(txmsg);
+       drm_dp_put_mst_branch_device(mstb);
+       return ret;
+}
+
+static u32 drm_dp_mst_i2c_functionality(struct i2c_adapter *adapter)
+{
+       return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL |
+              I2C_FUNC_SMBUS_READ_BLOCK_DATA |
+              I2C_FUNC_SMBUS_BLOCK_PROC_CALL |
+              I2C_FUNC_10BIT_ADDR;
+}
+
+static const struct i2c_algorithm drm_dp_mst_i2c_algo = {
+       .functionality = drm_dp_mst_i2c_functionality,
+       .master_xfer = drm_dp_mst_i2c_xfer,
+};
+
+/**
+ * drm_dp_mst_register_i2c_bus() - register an I2C adapter for I2C-over-AUX
+ * @aux: DisplayPort AUX channel
+ *
+ * Returns 0 on success or a negative error code on failure.
+ */
+static int drm_dp_mst_register_i2c_bus(struct drm_dp_aux *aux)
+{
+       aux->ddc.algo = &drm_dp_mst_i2c_algo;
+       aux->ddc.algo_data = aux;
+       aux->ddc.retries = 3;
+
+       aux->ddc.class = I2C_CLASS_DDC;
+       aux->ddc.owner = THIS_MODULE;
+       aux->ddc.dev.parent = aux->dev;
+       aux->ddc.dev.of_node = aux->dev->of_node;
+
+       strlcpy(aux->ddc.name, aux->name ? aux->name : dev_name(aux->dev),
+               sizeof(aux->ddc.name));
+
+       return i2c_add_adapter(&aux->ddc);
+}
+
+/**
+ * drm_dp_mst_unregister_i2c_bus() - unregister an I2C-over-AUX adapter
+ * @aux: DisplayPort AUX channel
+ */
+static void drm_dp_mst_unregister_i2c_bus(struct drm_dp_aux *aux)
+{
+       i2c_del_adapter(&aux->ddc);
+}
index 8218078b61333134d1b3fb2de3d273e75245c5ef..3242e208c0d0db205498df5e1ac371d30c488988 100644 (file)
@@ -1,31 +1,11 @@
-/**
- * \file drm_drv.c
- * Generic driver template
- *
- * \author Rickard E. (Rik) Faith <faith@valinux.com>
- * \author Gareth Hughes <gareth@valinux.com>
- *
- * To use this template, you must at least define the following (samples
- * given for the MGA driver):
- *
- * \code
- * #define DRIVER_AUTHOR       "VA Linux Systems, Inc."
- *
- * #define DRIVER_NAME         "mga"
- * #define DRIVER_DESC         "Matrox G200/G400"
- * #define DRIVER_DATE         "20001127"
- *
- * #define drm_x               mga_##x
- * \endcode
- */
-
 /*
- * Created: Thu Nov 23 03:10:50 2000 by gareth@valinux.com
+ * Created: Fri Jan 19 10:48:35 2001 by faith@acm.org
  *
- * Copyright 1999, 2000 Precision Insight, Inc., Cedar Park, Texas.
- * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
+ * Copyright 2001 VA Linux Systems, Inc., Sunnyvale, California.
  * All Rights Reserved.
  *
+ * Author Rickard E. (Rik) Faith <faith@valinux.com>
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
  */
 
 #include <linux/debugfs.h>
+#include <linux/fs.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/mount.h>
 #include <linux/slab.h>
-#include <linux/export.h>
 #include <drm/drmP.h>
 #include <drm/drm_core.h>
+#include "drm_legacy.h"
 
+unsigned int drm_debug = 0;    /* 1 to enable debug output */
+EXPORT_SYMBOL(drm_debug);
 
-static int drm_version(struct drm_device *dev, void *data,
-                      struct drm_file *file_priv);
-
-#define DRM_IOCTL_DEF(ioctl, _func, _flags) \
-       [DRM_IOCTL_NR(ioctl)] = {.cmd = ioctl, .func = _func, .flags = _flags, .cmd_drv = 0, .name = #ioctl}
-
-/** Ioctl table */
-static const struct drm_ioctl_desc drm_ioctls[] = {
-       DRM_IOCTL_DEF(DRM_IOCTL_VERSION, drm_version, DRM_UNLOCKED|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF(DRM_IOCTL_GET_UNIQUE, drm_getunique, 0),
-       DRM_IOCTL_DEF(DRM_IOCTL_GET_MAGIC, drm_getmagic, 0),
-       DRM_IOCTL_DEF(DRM_IOCTL_IRQ_BUSID, drm_irq_by_busid, DRM_MASTER|DRM_ROOT_ONLY),
-       DRM_IOCTL_DEF(DRM_IOCTL_GET_MAP, drm_getmap, DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_GET_CLIENT, drm_getclient, DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_GET_STATS, drm_getstats, DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_GET_CAP, drm_getcap, DRM_UNLOCKED|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF(DRM_IOCTL_SET_CLIENT_CAP, drm_setclientcap, 0),
-       DRM_IOCTL_DEF(DRM_IOCTL_SET_VERSION, drm_setversion, DRM_MASTER),
-
-       DRM_IOCTL_DEF(DRM_IOCTL_SET_UNIQUE, drm_setunique, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
-       DRM_IOCTL_DEF(DRM_IOCTL_BLOCK, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
-       DRM_IOCTL_DEF(DRM_IOCTL_UNBLOCK, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
-       DRM_IOCTL_DEF(DRM_IOCTL_AUTH_MAGIC, drm_authmagic, DRM_AUTH|DRM_MASTER),
-
-       DRM_IOCTL_DEF(DRM_IOCTL_ADD_MAP, drm_addmap_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
-       DRM_IOCTL_DEF(DRM_IOCTL_RM_MAP, drm_rmmap_ioctl, DRM_AUTH),
-
-       DRM_IOCTL_DEF(DRM_IOCTL_SET_SAREA_CTX, drm_setsareactx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
-       DRM_IOCTL_DEF(DRM_IOCTL_GET_SAREA_CTX, drm_getsareactx, DRM_AUTH),
-
-       DRM_IOCTL_DEF(DRM_IOCTL_SET_MASTER, drm_setmaster_ioctl, DRM_ROOT_ONLY),
-       DRM_IOCTL_DEF(DRM_IOCTL_DROP_MASTER, drm_dropmaster_ioctl, DRM_ROOT_ONLY),
-
-       DRM_IOCTL_DEF(DRM_IOCTL_ADD_CTX, drm_addctx, DRM_AUTH|DRM_ROOT_ONLY),
-       DRM_IOCTL_DEF(DRM_IOCTL_RM_CTX, drm_rmctx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
-       DRM_IOCTL_DEF(DRM_IOCTL_MOD_CTX, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
-       DRM_IOCTL_DEF(DRM_IOCTL_GET_CTX, drm_getctx, DRM_AUTH),
-       DRM_IOCTL_DEF(DRM_IOCTL_SWITCH_CTX, drm_switchctx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
-       DRM_IOCTL_DEF(DRM_IOCTL_NEW_CTX, drm_newctx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
-       DRM_IOCTL_DEF(DRM_IOCTL_RES_CTX, drm_resctx, DRM_AUTH),
-
-       DRM_IOCTL_DEF(DRM_IOCTL_ADD_DRAW, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
-       DRM_IOCTL_DEF(DRM_IOCTL_RM_DRAW, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
-
-       DRM_IOCTL_DEF(DRM_IOCTL_LOCK, drm_lock, DRM_AUTH),
-       DRM_IOCTL_DEF(DRM_IOCTL_UNLOCK, drm_unlock, DRM_AUTH),
-
-       DRM_IOCTL_DEF(DRM_IOCTL_FINISH, drm_noop, DRM_AUTH),
-
-       DRM_IOCTL_DEF(DRM_IOCTL_ADD_BUFS, drm_addbufs, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
-       DRM_IOCTL_DEF(DRM_IOCTL_MARK_BUFS, drm_markbufs, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
-       DRM_IOCTL_DEF(DRM_IOCTL_INFO_BUFS, drm_infobufs, DRM_AUTH),
-       DRM_IOCTL_DEF(DRM_IOCTL_MAP_BUFS, drm_mapbufs, DRM_AUTH),
-       DRM_IOCTL_DEF(DRM_IOCTL_FREE_BUFS, drm_freebufs, DRM_AUTH),
-       DRM_IOCTL_DEF(DRM_IOCTL_DMA, drm_dma_ioctl, DRM_AUTH),
-
-       DRM_IOCTL_DEF(DRM_IOCTL_CONTROL, drm_control, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
-
-#if __OS_HAS_AGP
-       DRM_IOCTL_DEF(DRM_IOCTL_AGP_ACQUIRE, drm_agp_acquire_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
-       DRM_IOCTL_DEF(DRM_IOCTL_AGP_RELEASE, drm_agp_release_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
-       DRM_IOCTL_DEF(DRM_IOCTL_AGP_ENABLE, drm_agp_enable_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
-       DRM_IOCTL_DEF(DRM_IOCTL_AGP_INFO, drm_agp_info_ioctl, DRM_AUTH),
-       DRM_IOCTL_DEF(DRM_IOCTL_AGP_ALLOC, drm_agp_alloc_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
-       DRM_IOCTL_DEF(DRM_IOCTL_AGP_FREE, drm_agp_free_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
-       DRM_IOCTL_DEF(DRM_IOCTL_AGP_BIND, drm_agp_bind_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
-       DRM_IOCTL_DEF(DRM_IOCTL_AGP_UNBIND, drm_agp_unbind_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
-#endif
-
-       DRM_IOCTL_DEF(DRM_IOCTL_SG_ALLOC, drm_sg_alloc, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
-       DRM_IOCTL_DEF(DRM_IOCTL_SG_FREE, drm_sg_free, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
-
-       DRM_IOCTL_DEF(DRM_IOCTL_WAIT_VBLANK, drm_wait_vblank, DRM_UNLOCKED),
-
-       DRM_IOCTL_DEF(DRM_IOCTL_MODESET_CTL, drm_modeset_ctl, 0),
-
-       DRM_IOCTL_DEF(DRM_IOCTL_UPDATE_DRAW, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
-
-       DRM_IOCTL_DEF(DRM_IOCTL_GEM_CLOSE, drm_gem_close_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF(DRM_IOCTL_GEM_FLINK, drm_gem_flink_ioctl, DRM_AUTH|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_GEM_OPEN, drm_gem_open_ioctl, DRM_AUTH|DRM_UNLOCKED),
-
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETRESOURCES, drm_mode_getresources, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
-
-       DRM_IOCTL_DEF(DRM_IOCTL_PRIME_HANDLE_TO_FD, drm_prime_handle_to_fd_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW),
-       DRM_IOCTL_DEF(DRM_IOCTL_PRIME_FD_TO_HANDLE, drm_prime_fd_to_handle_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW),
-
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPLANERESOURCES, drm_mode_getplane_res, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETCRTC, drm_mode_getcrtc, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETCRTC, drm_mode_setcrtc, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPLANE, drm_mode_getplane, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETPLANE, drm_mode_setplane, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_CURSOR, drm_mode_cursor_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETGAMMA, drm_mode_gamma_get_ioctl, DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETGAMMA, drm_mode_gamma_set_ioctl, DRM_MASTER|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETENCODER, drm_mode_getencoder, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETCONNECTOR, drm_mode_getconnector, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_ATTACHMODE, drm_noop, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_DETACHMODE, drm_noop, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPROPERTY, drm_mode_getproperty_ioctl, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETPROPERTY, drm_mode_connector_property_set_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPROPBLOB, drm_mode_getblob_ioctl, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETFB, drm_mode_getfb, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB, drm_mode_addfb, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB2, drm_mode_addfb2, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_RMFB, drm_mode_rmfb, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_PAGE_FLIP, drm_mode_page_flip_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_DIRTYFB, drm_mode_dirtyfb_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_CREATE_DUMB, drm_mode_create_dumb_ioctl, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_MAP_DUMB, drm_mode_mmap_dumb_ioctl, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_DESTROY_DUMB, drm_mode_destroy_dumb_ioctl, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_OBJ_GETPROPERTIES, drm_mode_obj_get_properties_ioctl, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_OBJ_SETPROPERTY, drm_mode_obj_set_property_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
-       DRM_IOCTL_DEF(DRM_IOCTL_MODE_CURSOR2, drm_mode_cursor2_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
-};
+unsigned int drm_vblank_offdelay = 5000;    /* Default to 5000 msecs. */
 
-#define DRM_CORE_IOCTL_COUNT   ARRAY_SIZE( drm_ioctls )
+unsigned int drm_timestamp_precision = 20;  /* Default to 20 usecs. */
 
-/** File operations structure */
-static const struct file_operations drm_stub_fops = {
-       .owner = THIS_MODULE,
-       .open = drm_stub_open,
-       .llseek = noop_llseek,
-};
+/*
+ * Default to use monotonic timestamps for wait-for-vblank and page-flip
+ * complete events.
+ */
+unsigned int drm_timestamp_monotonic = 1;
 
-static int __init drm_core_init(void)
+MODULE_AUTHOR(CORE_AUTHOR);
+MODULE_DESCRIPTION(CORE_DESC);
+MODULE_LICENSE("GPL and additional rights");
+MODULE_PARM_DESC(debug, "Enable debug output");
+MODULE_PARM_DESC(vblankoffdelay, "Delay until vblank irq auto-disable [msecs]");
+MODULE_PARM_DESC(timestamp_precision_usec, "Max. error on timestamps [usecs]");
+MODULE_PARM_DESC(timestamp_monotonic, "Use monotonic timestamps");
+
+module_param_named(debug, drm_debug, int, 0600);
+module_param_named(vblankoffdelay, drm_vblank_offdelay, int, 0600);
+module_param_named(timestamp_precision_usec, drm_timestamp_precision, int, 0600);
+module_param_named(timestamp_monotonic, drm_timestamp_monotonic, int, 0600);
+
+static DEFINE_SPINLOCK(drm_minor_lock);
+static struct idr drm_minors_idr;
+
+struct class *drm_class;
+static struct dentry *drm_debugfs_root;
+
+int drm_err(const char *func, const char *format, ...)
 {
-       int ret = -ENOMEM;
+       struct va_format vaf;
+       va_list args;
+       int r;
 
-       drm_global_init();
-       drm_connector_ida_init();
-       idr_init(&drm_minors_idr);
+       va_start(args, format);
 
-       if (register_chrdev(DRM_MAJOR, "drm", &drm_stub_fops))
-               goto err_p1;
+       vaf.fmt = format;
+       vaf.va = &args;
 
-       drm_class = drm_sysfs_create(THIS_MODULE, "drm");
-       if (IS_ERR(drm_class)) {
-               printk(KERN_ERR "DRM: Error creating drm class.\n");
-               ret = PTR_ERR(drm_class);
-               goto err_p2;
+       r = printk(KERN_ERR "[" DRM_NAME ":%s] *ERROR* %pV", func, &vaf);
+
+       va_end(args);
+
+       return r;
+}
+EXPORT_SYMBOL(drm_err);
+
+void drm_ut_debug_printk(const char *function_name, const char *format, ...)
+{
+       struct va_format vaf;
+       va_list args;
+
+       va_start(args, format);
+       vaf.fmt = format;
+       vaf.va = &args;
+
+       printk(KERN_DEBUG "[" DRM_NAME ":%s] %pV", function_name, &vaf);
+
+       va_end(args);
+}
+EXPORT_SYMBOL(drm_ut_debug_printk);
+
+struct drm_master *drm_master_create(struct drm_minor *minor)
+{
+       struct drm_master *master;
+
+       master = kzalloc(sizeof(*master), GFP_KERNEL);
+       if (!master)
+               return NULL;
+
+       kref_init(&master->refcount);
+       spin_lock_init(&master->lock.spinlock);
+       init_waitqueue_head(&master->lock.lock_queue);
+       if (drm_ht_create(&master->magiclist, DRM_MAGIC_HASH_ORDER)) {
+               kfree(master);
+               return NULL;
        }
+       INIT_LIST_HEAD(&master->magicfree);
+       master->minor = minor;
 
-       drm_debugfs_root = debugfs_create_dir("dri", NULL);
-       if (!drm_debugfs_root) {
-               DRM_ERROR("Cannot create /sys/kernel/debug/dri\n");
-               ret = -1;
-               goto err_p3;
+       return master;
+}
+
+struct drm_master *drm_master_get(struct drm_master *master)
+{
+       kref_get(&master->refcount);
+       return master;
+}
+EXPORT_SYMBOL(drm_master_get);
+
+static void drm_master_destroy(struct kref *kref)
+{
+       struct drm_master *master = container_of(kref, struct drm_master, refcount);
+       struct drm_magic_entry *pt, *next;
+       struct drm_device *dev = master->minor->dev;
+       struct drm_map_list *r_list, *list_temp;
+
+       mutex_lock(&dev->struct_mutex);
+       if (dev->driver->master_destroy)
+               dev->driver->master_destroy(dev, master);
+
+       list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head) {
+               if (r_list->master == master) {
+                       drm_rmmap_locked(dev, r_list->map);
+                       r_list = NULL;
+               }
        }
 
-       DRM_INFO("Initialized %s %d.%d.%d %s\n",
-                CORE_NAME, CORE_MAJOR, CORE_MINOR, CORE_PATCHLEVEL, CORE_DATE);
-       return 0;
-err_p3:
-       drm_sysfs_destroy();
-err_p2:
-       unregister_chrdev(DRM_MAJOR, "drm");
+       if (master->unique) {
+               kfree(master->unique);
+               master->unique = NULL;
+               master->unique_len = 0;
+       }
 
-       idr_destroy(&drm_minors_idr);
-err_p1:
-       return ret;
+       list_for_each_entry_safe(pt, next, &master->magicfree, head) {
+               list_del(&pt->head);
+               drm_ht_remove_item(&master->magiclist, &pt->hash_item);
+               kfree(pt);
+       }
+
+       drm_ht_remove(&master->magiclist);
+
+       mutex_unlock(&dev->struct_mutex);
+       kfree(master);
 }
 
-static void __exit drm_core_exit(void)
+void drm_master_put(struct drm_master **master)
 {
-       debugfs_remove(drm_debugfs_root);
-       drm_sysfs_destroy();
+       kref_put(&(*master)->refcount, drm_master_destroy);
+       *master = NULL;
+}
+EXPORT_SYMBOL(drm_master_put);
 
-       unregister_chrdev(DRM_MAJOR, "drm");
+int drm_setmaster_ioctl(struct drm_device *dev, void *data,
+                       struct drm_file *file_priv)
+{
+       int ret = 0;
 
-       drm_connector_ida_destroy();
-       idr_destroy(&drm_minors_idr);
+       mutex_lock(&dev->master_mutex);
+       if (file_priv->is_master)
+               goto out_unlock;
+
+       if (file_priv->minor->master) {
+               ret = -EINVAL;
+               goto out_unlock;
+       }
+
+       if (!file_priv->master) {
+               ret = -EINVAL;
+               goto out_unlock;
+       }
+
+       file_priv->minor->master = drm_master_get(file_priv->master);
+       file_priv->is_master = 1;
+       if (dev->driver->master_set) {
+               ret = dev->driver->master_set(dev, file_priv, false);
+               if (unlikely(ret != 0)) {
+                       file_priv->is_master = 0;
+                       drm_master_put(&file_priv->minor->master);
+               }
+       }
+
+out_unlock:
+       mutex_unlock(&dev->master_mutex);
+       return ret;
 }
 
-module_init(drm_core_init);
-module_exit(drm_core_exit);
+int drm_dropmaster_ioctl(struct drm_device *dev, void *data,
+                        struct drm_file *file_priv)
+{
+       int ret = -EINVAL;
 
-/**
- * Copy and IOCTL return string to user space
+       mutex_lock(&dev->master_mutex);
+       if (!file_priv->is_master)
+               goto out_unlock;
+
+       if (!file_priv->minor->master)
+               goto out_unlock;
+
+       ret = 0;
+       if (dev->driver->master_drop)
+               dev->driver->master_drop(dev, file_priv, false);
+       drm_master_put(&file_priv->minor->master);
+       file_priv->is_master = 0;
+
+out_unlock:
+       mutex_unlock(&dev->master_mutex);
+       return ret;
+}
+
+/*
+ * DRM Minors
+ * A DRM device can provide several char-dev interfaces on the DRM-Major. Each
+ * of them is represented by a drm_minor object. Depending on the capabilities
+ * of the device-driver, different interfaces are registered.
+ *
+ * Minors can be accessed via dev->$minor_name. This pointer is either
+ * NULL or a valid drm_minor pointer and stays valid as long as the device is
+ * valid. This means, DRM minors have the same life-time as the underlying
+ * device. However, this doesn't mean that the minor is active. Minors are
+ * registered and unregistered dynamically according to device-state.
  */
-static int drm_copy_field(char *buf, size_t *buf_len, const char *value)
+
+static struct drm_minor **drm_minor_get_slot(struct drm_device *dev,
+                                            unsigned int type)
 {
-       int len;
+       switch (type) {
+       case DRM_MINOR_LEGACY:
+               return &dev->primary;
+       case DRM_MINOR_RENDER:
+               return &dev->render;
+       case DRM_MINOR_CONTROL:
+               return &dev->control;
+       default:
+               return NULL;
+       }
+}
 
-       /* don't overflow userbuf */
-       len = strlen(value);
-       if (len > *buf_len)
-               len = *buf_len;
+static int drm_minor_alloc(struct drm_device *dev, unsigned int type)
+{
+       struct drm_minor *minor;
+       unsigned long flags;
+       int r;
+
+       minor = kzalloc(sizeof(*minor), GFP_KERNEL);
+       if (!minor)
+               return -ENOMEM;
+
+       minor->type = type;
+       minor->dev = dev;
+
+       idr_preload(GFP_KERNEL);
+       spin_lock_irqsave(&drm_minor_lock, flags);
+       r = idr_alloc(&drm_minors_idr,
+                     NULL,
+                     64 * type,
+                     64 * (type + 1),
+                     GFP_NOWAIT);
+       spin_unlock_irqrestore(&drm_minor_lock, flags);
+       idr_preload_end();
+
+       if (r < 0)
+               goto err_free;
+
+       minor->index = r;
+
+       minor->kdev = drm_sysfs_minor_alloc(minor);
+       if (IS_ERR(minor->kdev)) {
+               r = PTR_ERR(minor->kdev);
+               goto err_index;
+       }
 
-       /* let userspace know exact length of driver value (which could be
-        * larger than the userspace-supplied buffer) */
-       *buf_len = strlen(value);
+       *drm_minor_get_slot(dev, type) = minor;
+       return 0;
+
+err_index:
+       spin_lock_irqsave(&drm_minor_lock, flags);
+       idr_remove(&drm_minors_idr, minor->index);
+       spin_unlock_irqrestore(&drm_minor_lock, flags);
+err_free:
+       kfree(minor);
+       return r;
+}
+
+static void drm_minor_free(struct drm_device *dev, unsigned int type)
+{
+       struct drm_minor **slot, *minor;
+       unsigned long flags;
+
+       slot = drm_minor_get_slot(dev, type);
+       minor = *slot;
+       if (!minor)
+               return;
+
+       drm_mode_group_destroy(&minor->mode_group);
+       put_device(minor->kdev);
+
+       spin_lock_irqsave(&drm_minor_lock, flags);
+       idr_remove(&drm_minors_idr, minor->index);
+       spin_unlock_irqrestore(&drm_minor_lock, flags);
+
+       kfree(minor);
+       *slot = NULL;
+}
 
-       /* finally, try filling in the userbuf */
-       if (len && buf)
-               if (copy_to_user(buf, value, len))
-                       return -EFAULT;
+static int drm_minor_register(struct drm_device *dev, unsigned int type)
+{
+       struct drm_minor *minor;
+       unsigned long flags;
+       int ret;
+
+       DRM_DEBUG("\n");
+
+       minor = *drm_minor_get_slot(dev, type);
+       if (!minor)
+               return 0;
+
+       ret = drm_debugfs_init(minor, minor->index, drm_debugfs_root);
+       if (ret) {
+               DRM_ERROR("DRM: Failed to initialize /sys/kernel/debug/dri.\n");
+               return ret;
+       }
+
+       ret = device_add(minor->kdev);
+       if (ret)
+               goto err_debugfs;
+
+       /* replace NULL with @minor so lookups will succeed from now on */
+       spin_lock_irqsave(&drm_minor_lock, flags);
+       idr_replace(&drm_minors_idr, minor, minor->index);
+       spin_unlock_irqrestore(&drm_minor_lock, flags);
+
+       DRM_DEBUG("new minor registered %d\n", minor->index);
        return 0;
+
+err_debugfs:
+       drm_debugfs_cleanup(minor);
+       return ret;
+}
+
+static void drm_minor_unregister(struct drm_device *dev, unsigned int type)
+{
+       struct drm_minor *minor;
+       unsigned long flags;
+
+       minor = *drm_minor_get_slot(dev, type);
+       if (!minor || !device_is_registered(minor->kdev))
+               return;
+
+       /* replace @minor with NULL so lookups will fail from now on */
+       spin_lock_irqsave(&drm_minor_lock, flags);
+       idr_replace(&drm_minors_idr, NULL, minor->index);
+       spin_unlock_irqrestore(&drm_minor_lock, flags);
+
+       device_del(minor->kdev);
+       dev_set_drvdata(minor->kdev, NULL); /* safety belt */
+       drm_debugfs_cleanup(minor);
 }
 
 /**
- * Get version information
+ * drm_minor_acquire - Acquire a DRM minor
+ * @minor_id: Minor ID of the DRM-minor
+ *
+ * Looks up the given minor-ID and returns the respective DRM-minor object. The
+ * refence-count of the underlying device is increased so you must release this
+ * object with drm_minor_release().
  *
- * \param inode device inode.
- * \param filp file pointer.
- * \param cmd command.
- * \param arg user argument, pointing to a drm_version structure.
- * \return zero on success or negative number on failure.
+ * As long as you hold this minor, it is guaranteed that the object and the
+ * minor->dev pointer will stay valid! However, the device may get unplugged and
+ * unregistered while you hold the minor.
  *
- * Fills in the version information in \p arg.
+ * Returns:
+ * Pointer to minor-object with increased device-refcount, or PTR_ERR on
+ * failure.
  */
-static int drm_version(struct drm_device *dev, void *data,
-                      struct drm_file *file_priv)
+struct drm_minor *drm_minor_acquire(unsigned int minor_id)
 {
-       struct drm_version *version = data;
-       int err;
+       struct drm_minor *minor;
+       unsigned long flags;
+
+       spin_lock_irqsave(&drm_minor_lock, flags);
+       minor = idr_find(&drm_minors_idr, minor_id);
+       if (minor)
+               drm_dev_ref(minor->dev);
+       spin_unlock_irqrestore(&drm_minor_lock, flags);
+
+       if (!minor) {
+               return ERR_PTR(-ENODEV);
+       } else if (drm_device_is_unplugged(minor->dev)) {
+               drm_dev_unref(minor->dev);
+               return ERR_PTR(-ENODEV);
+       }
 
-       version->version_major = dev->driver->major;
-       version->version_minor = dev->driver->minor;
-       version->version_patchlevel = dev->driver->patchlevel;
-       err = drm_copy_field(version->name, &version->name_len,
-                       dev->driver->name);
-       if (!err)
-               err = drm_copy_field(version->date, &version->date_len,
-                               dev->driver->date);
-       if (!err)
-               err = drm_copy_field(version->desc, &version->desc_len,
-                               dev->driver->desc);
+       return minor;
+}
 
-       return err;
+/**
+ * drm_minor_release - Release DRM minor
+ * @minor: Pointer to DRM minor object
+ *
+ * Release a minor that was previously acquired via drm_minor_acquire().
+ */
+void drm_minor_release(struct drm_minor *minor)
+{
+       drm_dev_unref(minor->dev);
 }
 
 /**
- * drm_ioctl_permit - Check ioctl permissions against caller
+ * drm_put_dev - Unregister and release a DRM device
+ * @dev: DRM device
+ *
+ * Called at module unload time or when a PCI device is unplugged.
  *
- * @flags: ioctl permission flags.
- * @file_priv: Pointer to struct drm_file identifying the caller.
+ * Use of this function is discouraged. It will eventually go away completely.
+ * Please use drm_dev_unregister() and drm_dev_unref() explicitly instead.
  *
- * Checks whether the caller is allowed to run an ioctl with the
- * indicated permissions. If so, returns zero. Otherwise returns an
- * error code suitable for ioctl return.
+ * Cleans up all DRM device, calling drm_lastclose().
  */
-static int drm_ioctl_permit(u32 flags, struct drm_file *file_priv)
+void drm_put_dev(struct drm_device *dev)
 {
-       /* ROOT_ONLY is only for CAP_SYS_ADMIN */
-       if (unlikely((flags & DRM_ROOT_ONLY) && !capable(CAP_SYS_ADMIN)))
-               return -EACCES;
-
-       /* AUTH is only for authenticated or render client */
-       if (unlikely((flags & DRM_AUTH) && !drm_is_render_client(file_priv) &&
-                    !file_priv->authenticated))
-               return -EACCES;
-
-       /* MASTER is only for master or control clients */
-       if (unlikely((flags & DRM_MASTER) && !file_priv->is_master &&
-                    !drm_is_control_client(file_priv)))
-               return -EACCES;
-
-       /* Control clients must be explicitly allowed */
-       if (unlikely(!(flags & DRM_CONTROL_ALLOW) &&
-                    drm_is_control_client(file_priv)))
-               return -EACCES;
-
-       /* Render clients must be explicitly allowed */
-       if (unlikely(!(flags & DRM_RENDER_ALLOW) &&
-                    drm_is_render_client(file_priv)))
-               return -EACCES;
+       DRM_DEBUG("\n");
 
-       return 0;
+       if (!dev) {
+               DRM_ERROR("cleanup called no dev\n");
+               return;
+       }
+
+       drm_dev_unregister(dev);
+       drm_dev_unref(dev);
+}
+EXPORT_SYMBOL(drm_put_dev);
+
+void drm_unplug_dev(struct drm_device *dev)
+{
+       /* for a USB device */
+       drm_minor_unregister(dev, DRM_MINOR_LEGACY);
+       drm_minor_unregister(dev, DRM_MINOR_RENDER);
+       drm_minor_unregister(dev, DRM_MINOR_CONTROL);
+
+       mutex_lock(&drm_global_mutex);
+
+       drm_device_set_unplugged(dev);
+
+       if (dev->open_count == 0) {
+               drm_put_dev(dev);
+       }
+       mutex_unlock(&drm_global_mutex);
+}
+EXPORT_SYMBOL(drm_unplug_dev);
+
+/*
+ * DRM internal mount
+ * We want to be able to allocate our own "struct address_space" to control
+ * memory-mappings in VRAM (or stolen RAM, ...). However, core MM does not allow
+ * stand-alone address_space objects, so we need an underlying inode. As there
+ * is no way to allocate an independent inode easily, we need a fake internal
+ * VFS mount-point.
+ *
+ * The drm_fs_inode_new() function allocates a new inode, drm_fs_inode_free()
+ * frees it again. You are allowed to use iget() and iput() to get references to
+ * the inode. But each drm_fs_inode_new() call must be paired with exactly one
+ * drm_fs_inode_free() call (which does not have to be the last iput()).
+ * We use drm_fs_inode_*() to manage our internal VFS mount-point and share it
+ * between multiple inode-users. You could, technically, call
+ * iget() + drm_fs_inode_free() directly after alloc and sometime later do an
+ * iput(), but this way you'd end up with a new vfsmount for each inode.
+ */
+
+static int drm_fs_cnt;
+static struct vfsmount *drm_fs_mnt;
+
+static const struct dentry_operations drm_fs_dops = {
+       .d_dname        = simple_dname,
+};
+
+static const struct super_operations drm_fs_sops = {
+       .statfs         = simple_statfs,
+};
+
+static struct dentry *drm_fs_mount(struct file_system_type *fs_type, int flags,
+                                  const char *dev_name, void *data)
+{
+       return mount_pseudo(fs_type,
+                           "drm:",
+                           &drm_fs_sops,
+                           &drm_fs_dops,
+                           0x010203ff);
+}
+
+static struct file_system_type drm_fs_type = {
+       .name           = "drm",
+       .owner          = THIS_MODULE,
+       .mount          = drm_fs_mount,
+       .kill_sb        = kill_anon_super,
+};
+
+static struct inode *drm_fs_inode_new(void)
+{
+       struct inode *inode;
+       int r;
+
+       r = simple_pin_fs(&drm_fs_type, &drm_fs_mnt, &drm_fs_cnt);
+       if (r < 0) {
+               DRM_ERROR("Cannot mount pseudo fs: %d\n", r);
+               return ERR_PTR(r);
+       }
+
+       inode = alloc_anon_inode(drm_fs_mnt->mnt_sb);
+       if (IS_ERR(inode))
+               simple_release_fs(&drm_fs_mnt, &drm_fs_cnt);
+
+       return inode;
+}
+
+static void drm_fs_inode_free(struct inode *inode)
+{
+       if (inode) {
+               iput(inode);
+               simple_release_fs(&drm_fs_mnt, &drm_fs_cnt);
+       }
 }
 
 /**
- * Called whenever a process performs an ioctl on /dev/drm.
+ * drm_dev_alloc - Allocate new DRM device
+ * @driver: DRM driver to allocate device for
+ * @parent: Parent device object
  *
- * \param inode device inode.
- * \param file_priv DRM file private.
- * \param cmd command.
- * \param arg user argument.
- * \return zero on success or negative number on failure.
+ * Allocate and initialize a new DRM device. No device registration is done.
+ * Call drm_dev_register() to advertice the device to user space and register it
+ * with other core subsystems.
  *
- * Looks up the ioctl function in the ::ioctls table, checking for root
- * previleges if so required, and dispatches to the respective function.
+ * The initial ref-count of the object is 1. Use drm_dev_ref() and
+ * drm_dev_unref() to take and drop further ref-counts.
+ *
+ * RETURNS:
+ * Pointer to new DRM device, or NULL if out of memory.
  */
-long drm_ioctl(struct file *filp,
-             unsigned int cmd, unsigned long arg)
+struct drm_device *drm_dev_alloc(struct drm_driver *driver,
+                                struct device *parent)
 {
-       struct drm_file *file_priv = filp->private_data;
        struct drm_device *dev;
-       const struct drm_ioctl_desc *ioctl = NULL;
-       drm_ioctl_t *func;
-       unsigned int nr = DRM_IOCTL_NR(cmd);
-       int retcode = -EINVAL;
-       char stack_kdata[128];
-       char *kdata = NULL;
-       unsigned int usize, asize;
-
-       dev = file_priv->minor->dev;
-
-       if (drm_device_is_unplugged(dev))
-               return -ENODEV;
-
-       if ((nr >= DRM_CORE_IOCTL_COUNT) &&
-           ((nr < DRM_COMMAND_BASE) || (nr >= DRM_COMMAND_END)))
-               goto err_i1;
-       if ((nr >= DRM_COMMAND_BASE) && (nr < DRM_COMMAND_END) &&
-           (nr < DRM_COMMAND_BASE + dev->driver->num_ioctls)) {
-               u32 drv_size;
-               ioctl = &dev->driver->ioctls[nr - DRM_COMMAND_BASE];
-               drv_size = _IOC_SIZE(ioctl->cmd_drv);
-               usize = asize = _IOC_SIZE(cmd);
-               if (drv_size > asize)
-                       asize = drv_size;
-               cmd = ioctl->cmd_drv;
+       int ret;
+
+       dev = kzalloc(sizeof(*dev), GFP_KERNEL);
+       if (!dev)
+               return NULL;
+
+       kref_init(&dev->ref);
+       dev->dev = parent;
+       dev->driver = driver;
+
+       INIT_LIST_HEAD(&dev->filelist);
+       INIT_LIST_HEAD(&dev->ctxlist);
+       INIT_LIST_HEAD(&dev->vmalist);
+       INIT_LIST_HEAD(&dev->maplist);
+       INIT_LIST_HEAD(&dev->vblank_event_list);
+
+       spin_lock_init(&dev->buf_lock);
+       spin_lock_init(&dev->event_lock);
+       mutex_init(&dev->struct_mutex);
+       mutex_init(&dev->ctxlist_mutex);
+       mutex_init(&dev->master_mutex);
+
+       dev->anon_inode = drm_fs_inode_new();
+       if (IS_ERR(dev->anon_inode)) {
+               ret = PTR_ERR(dev->anon_inode);
+               DRM_ERROR("Cannot allocate anonymous inode: %d\n", ret);
+               goto err_free;
        }
-       else if ((nr >= DRM_COMMAND_END) || (nr < DRM_COMMAND_BASE)) {
-               u32 drv_size;
-
-               ioctl = &drm_ioctls[nr];
 
-               drv_size = _IOC_SIZE(ioctl->cmd);
-               usize = asize = _IOC_SIZE(cmd);
-               if (drv_size > asize)
-                       asize = drv_size;
+       if (drm_core_check_feature(dev, DRIVER_MODESET)) {
+               ret = drm_minor_alloc(dev, DRM_MINOR_CONTROL);
+               if (ret)
+                       goto err_minors;
+       }
 
-               cmd = ioctl->cmd;
-       } else
-               goto err_i1;
+       if (drm_core_check_feature(dev, DRIVER_RENDER)) {
+               ret = drm_minor_alloc(dev, DRM_MINOR_RENDER);
+               if (ret)
+                       goto err_minors;
+       }
 
-       DRM_DEBUG("pid=%d, dev=0x%lx, auth=%d, %s\n",
-                 task_pid_nr(current),
-                 (long)old_encode_dev(file_priv->minor->kdev->devt),
-                 file_priv->authenticated, ioctl->name);
+       ret = drm_minor_alloc(dev, DRM_MINOR_LEGACY);
+       if (ret)
+               goto err_minors;
 
-       /* Do not trust userspace, use our own definition */
-       func = ioctl->func;
+       if (drm_ht_create(&dev->map_hash, 12))
+               goto err_minors;
 
-       if (unlikely(!func)) {
-               DRM_DEBUG("no function\n");
-               retcode = -EINVAL;
-               goto err_i1;
+       ret = drm_legacy_ctxbitmap_init(dev);
+       if (ret) {
+               DRM_ERROR("Cannot allocate memory for context bitmap.\n");
+               goto err_ht;
        }
 
-       retcode = drm_ioctl_permit(ioctl->flags, file_priv);
-       if (unlikely(retcode))
-               goto err_i1;
-
-       if (cmd & (IOC_IN | IOC_OUT)) {
-               if (asize <= sizeof(stack_kdata)) {
-                       kdata = stack_kdata;
-               } else {
-                       kdata = kmalloc(asize, GFP_KERNEL);
-                       if (!kdata) {
-                               retcode = -ENOMEM;
-                               goto err_i1;
-                       }
+       if (driver->driver_features & DRIVER_GEM) {
+               ret = drm_gem_init(dev);
+               if (ret) {
+                       DRM_ERROR("Cannot initialize graphics execution manager (GEM)\n");
+                       goto err_ctxbitmap;
                }
-               if (asize > usize)
-                       memset(kdata + usize, 0, asize - usize);
        }
 
-       if (cmd & IOC_IN) {
-               if (copy_from_user(kdata, (void __user *)arg,
-                                  usize) != 0) {
-                       retcode = -EFAULT;
-                       goto err_i1;
-               }
-       } else if (cmd & IOC_OUT) {
-               memset(kdata, 0, usize);
-       }
+       return dev;
+
+err_ctxbitmap:
+       drm_legacy_ctxbitmap_cleanup(dev);
+err_ht:
+       drm_ht_remove(&dev->map_hash);
+err_minors:
+       drm_minor_free(dev, DRM_MINOR_LEGACY);
+       drm_minor_free(dev, DRM_MINOR_RENDER);
+       drm_minor_free(dev, DRM_MINOR_CONTROL);
+       drm_fs_inode_free(dev->anon_inode);
+err_free:
+       mutex_destroy(&dev->master_mutex);
+       kfree(dev);
+       return NULL;
+}
+EXPORT_SYMBOL(drm_dev_alloc);
+
+static void drm_dev_release(struct kref *ref)
+{
+       struct drm_device *dev = container_of(ref, struct drm_device, ref);
+
+       if (dev->driver->driver_features & DRIVER_GEM)
+               drm_gem_destroy(dev);
+
+       drm_legacy_ctxbitmap_cleanup(dev);
+       drm_ht_remove(&dev->map_hash);
+       drm_fs_inode_free(dev->anon_inode);
+
+       drm_minor_free(dev, DRM_MINOR_LEGACY);
+       drm_minor_free(dev, DRM_MINOR_RENDER);
+       drm_minor_free(dev, DRM_MINOR_CONTROL);
+
+       mutex_destroy(&dev->master_mutex);
+       kfree(dev->unique);
+       kfree(dev);
+}
 
-       if (ioctl->flags & DRM_UNLOCKED)
-               retcode = func(dev, kdata, file_priv);
-       else {
-               mutex_lock(&drm_global_mutex);
-               retcode = func(dev, kdata, file_priv);
-               mutex_unlock(&drm_global_mutex);
+/**
+ * drm_dev_ref - Take reference of a DRM device
+ * @dev: device to take reference of or NULL
+ *
+ * This increases the ref-count of @dev by one. You *must* already own a
+ * reference when calling this. Use drm_dev_unref() to drop this reference
+ * again.
+ *
+ * This function never fails. However, this function does not provide *any*
+ * guarantee whether the device is alive or running. It only provides a
+ * reference to the object and the memory associated with it.
+ */
+void drm_dev_ref(struct drm_device *dev)
+{
+       if (dev)
+               kref_get(&dev->ref);
+}
+EXPORT_SYMBOL(drm_dev_ref);
+
+/**
+ * drm_dev_unref - Drop reference of a DRM device
+ * @dev: device to drop reference of or NULL
+ *
+ * This decreases the ref-count of @dev by one. The device is destroyed if the
+ * ref-count drops to zero.
+ */
+void drm_dev_unref(struct drm_device *dev)
+{
+       if (dev)
+               kref_put(&dev->ref, drm_dev_release);
+}
+EXPORT_SYMBOL(drm_dev_unref);
+
+/**
+ * drm_dev_register - Register DRM device
+ * @dev: Device to register
+ * @flags: Flags passed to the driver's .load() function
+ *
+ * Register the DRM device @dev with the system, advertise device to user-space
+ * and start normal device operation. @dev must be allocated via drm_dev_alloc()
+ * previously.
+ *
+ * Never call this twice on any device!
+ *
+ * RETURNS:
+ * 0 on success, negative error code on failure.
+ */
+int drm_dev_register(struct drm_device *dev, unsigned long flags)
+{
+       int ret;
+
+       mutex_lock(&drm_global_mutex);
+
+       ret = drm_minor_register(dev, DRM_MINOR_CONTROL);
+       if (ret)
+               goto err_minors;
+
+       ret = drm_minor_register(dev, DRM_MINOR_RENDER);
+       if (ret)
+               goto err_minors;
+
+       ret = drm_minor_register(dev, DRM_MINOR_LEGACY);
+       if (ret)
+               goto err_minors;
+
+       if (dev->driver->load) {
+               ret = dev->driver->load(dev, flags);
+               if (ret)
+                       goto err_minors;
        }
 
-       if (cmd & IOC_OUT) {
-               if (copy_to_user((void __user *)arg, kdata,
-                                usize) != 0)
-                       retcode = -EFAULT;
+       /* setup grouping for legacy outputs */
+       if (drm_core_check_feature(dev, DRIVER_MODESET)) {
+               ret = drm_mode_group_init_legacy_group(dev,
+                               &dev->primary->mode_group);
+               if (ret)
+                       goto err_unload;
        }
 
-      err_i1:
-       if (!ioctl)
-               DRM_DEBUG("invalid ioctl: pid=%d, dev=0x%lx, auth=%d, cmd=0x%02x, nr=0x%02x\n",
-                         task_pid_nr(current),
-                         (long)old_encode_dev(file_priv->minor->kdev->devt),
-                         file_priv->authenticated, cmd, nr);
-
-       if (kdata != stack_kdata)
-               kfree(kdata);
-       if (retcode)
-               DRM_DEBUG("ret = %d\n", retcode);
-       return retcode;
+       ret = 0;
+       goto out_unlock;
+
+err_unload:
+       if (dev->driver->unload)
+               dev->driver->unload(dev);
+err_minors:
+       drm_minor_unregister(dev, DRM_MINOR_LEGACY);
+       drm_minor_unregister(dev, DRM_MINOR_RENDER);
+       drm_minor_unregister(dev, DRM_MINOR_CONTROL);
+out_unlock:
+       mutex_unlock(&drm_global_mutex);
+       return ret;
 }
-EXPORT_SYMBOL(drm_ioctl);
+EXPORT_SYMBOL(drm_dev_register);
 
 /**
- * drm_ioctl_flags - Check for core ioctl and return ioctl permission flags
+ * drm_dev_unregister - Unregister DRM device
+ * @dev: Device to unregister
+ *
+ * Unregister the DRM device from the system. This does the reverse of
+ * drm_dev_register() but does not deallocate the device. The caller must call
+ * drm_dev_unref() to drop their final reference.
+ */
+void drm_dev_unregister(struct drm_device *dev)
+{
+       struct drm_map_list *r_list, *list_temp;
+
+       drm_lastclose(dev);
+
+       if (dev->driver->unload)
+               dev->driver->unload(dev);
+
+       if (dev->agp)
+               drm_pci_agp_destroy(dev);
+
+       drm_vblank_cleanup(dev);
+
+       list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head)
+               drm_rmmap(dev, r_list->map);
+
+       drm_minor_unregister(dev, DRM_MINOR_LEGACY);
+       drm_minor_unregister(dev, DRM_MINOR_RENDER);
+       drm_minor_unregister(dev, DRM_MINOR_CONTROL);
+}
+EXPORT_SYMBOL(drm_dev_unregister);
+
+/**
+ * drm_dev_set_unique - Set the unique name of a DRM device
+ * @dev: device of which to set the unique name
+ * @fmt: format string for unique name
+ *
+ * Sets the unique name of a DRM device using the specified format string and
+ * a variable list of arguments. Drivers can use this at driver probe time if
+ * the unique name of the devices they drive is static.
  *
- * @nr: Ioctl number.
- * @flags: Where to return the ioctl permission flags
+ * Return: 0 on success or a negative error code on failure.
  */
-bool drm_ioctl_flags(unsigned int nr, unsigned int *flags)
+int drm_dev_set_unique(struct drm_device *dev, const char *fmt, ...)
 {
-       if ((nr >= DRM_COMMAND_END && nr < DRM_CORE_IOCTL_COUNT) ||
-           (nr < DRM_COMMAND_BASE)) {
-               *flags = drm_ioctls[nr].flags;
-               return true;
+       va_list ap;
+
+       kfree(dev->unique);
+
+       va_start(ap, fmt);
+       dev->unique = kvasprintf(GFP_KERNEL, fmt, ap);
+       va_end(ap);
+
+       return dev->unique ? 0 : -ENOMEM;
+}
+EXPORT_SYMBOL(drm_dev_set_unique);
+
+/*
+ * DRM Core
+ * The DRM core module initializes all global DRM objects and makes them
+ * available to drivers. Once setup, drivers can probe their respective
+ * devices.
+ * Currently, core management includes:
+ *  - The "DRM-Global" key/value database
+ *  - Global ID management for connectors
+ *  - DRM major number allocation
+ *  - DRM minor management
+ *  - DRM sysfs class
+ *  - DRM debugfs root
+ *
+ * Furthermore, the DRM core provides dynamic char-dev lookups. For each
+ * interface registered on a DRM device, you can request minor numbers from DRM
+ * core. DRM core takes care of major-number management and char-dev
+ * registration. A stub ->open() callback forwards any open() requests to the
+ * registered minor.
+ */
+
+static int drm_stub_open(struct inode *inode, struct file *filp)
+{
+       const struct file_operations *new_fops;
+       struct drm_minor *minor;
+       int err;
+
+       DRM_DEBUG("\n");
+
+       mutex_lock(&drm_global_mutex);
+       minor = drm_minor_acquire(iminor(inode));
+       if (IS_ERR(minor)) {
+               err = PTR_ERR(minor);
+               goto out_unlock;
+       }
+
+       new_fops = fops_get(minor->dev->driver->fops);
+       if (!new_fops) {
+               err = -ENODEV;
+               goto out_release;
        }
 
-       return false;
+       replace_fops(filp, new_fops);
+       if (filp->f_op->open)
+               err = filp->f_op->open(inode, filp);
+       else
+               err = 0;
+
+out_release:
+       drm_minor_release(minor);
+out_unlock:
+       mutex_unlock(&drm_global_mutex);
+       return err;
 }
-EXPORT_SYMBOL(drm_ioctl_flags);
+
+static const struct file_operations drm_stub_fops = {
+       .owner = THIS_MODULE,
+       .open = drm_stub_open,
+       .llseek = noop_llseek,
+};
+
+static int __init drm_core_init(void)
+{
+       int ret = -ENOMEM;
+
+       drm_global_init();
+       drm_connector_ida_init();
+       idr_init(&drm_minors_idr);
+
+       if (register_chrdev(DRM_MAJOR, "drm", &drm_stub_fops))
+               goto err_p1;
+
+       drm_class = drm_sysfs_create(THIS_MODULE, "drm");
+       if (IS_ERR(drm_class)) {
+               printk(KERN_ERR "DRM: Error creating drm class.\n");
+               ret = PTR_ERR(drm_class);
+               goto err_p2;
+       }
+
+       drm_debugfs_root = debugfs_create_dir("dri", NULL);
+       if (!drm_debugfs_root) {
+               DRM_ERROR("Cannot create /sys/kernel/debug/dri\n");
+               ret = -1;
+               goto err_p3;
+       }
+
+       DRM_INFO("Initialized %s %d.%d.%d %s\n",
+                CORE_NAME, CORE_MAJOR, CORE_MINOR, CORE_PATCHLEVEL, CORE_DATE);
+       return 0;
+err_p3:
+       drm_sysfs_destroy();
+err_p2:
+       unregister_chrdev(DRM_MAJOR, "drm");
+
+       idr_destroy(&drm_minors_idr);
+err_p1:
+       return ret;
+}
+
+static void __exit drm_core_exit(void)
+{
+       debugfs_remove(drm_debugfs_root);
+       drm_sysfs_destroy();
+
+       unregister_chrdev(DRM_MAJOR, "drm");
+
+       drm_connector_ida_destroy();
+       idr_destroy(&drm_minors_idr);
+}
+
+module_init(drm_core_init);
+module_exit(drm_core_exit);
index dfa9769b26b5c57db0731361478639a9600b65b3..1dbf3bc4c6a3cdd580d00706052976aed01b94c9 100644 (file)
@@ -3305,6 +3305,7 @@ struct drm_connector *drm_select_eld(struct drm_encoder *encoder,
        struct drm_device *dev = encoder->dev;
 
        WARN_ON(!mutex_is_locked(&dev->mode_config.mutex));
+       WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex));
 
        list_for_each_entry(connector, &dev->mode_config.connector_list, head)
                if (connector->encoder == encoder && connector->eld[0])
@@ -3775,8 +3776,14 @@ drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame,
 
        frame->picture_aspect = HDMI_PICTURE_ASPECT_NONE;
 
-       /* Populate picture aspect ratio from CEA mode list */
-       if (frame->video_code > 0)
+       /*
+        * Populate picture aspect ratio from either
+        * user input (if specified) or from the CEA mode list.
+        */
+       if (mode->picture_aspect_ratio == HDMI_PICTURE_ASPECT_4_3 ||
+               mode->picture_aspect_ratio == HDMI_PICTURE_ASPECT_16_9)
+               frame->picture_aspect = mode->picture_aspect_ratio;
+       else if (frame->video_code > 0)
                frame->picture_aspect = drm_get_cea_aspect_ratio(
                                                frame->video_code);
 
index f27c883be391f51dfe0ef41e9cada8ed76ee67dc..cc0ae047ed3bd8fcc265e38a06d8ec86207deb55 100644 (file)
@@ -327,7 +327,7 @@ err_drm_gem_cma_free_object:
        return ret;
 }
 
-static struct drm_fb_helper_funcs drm_fb_cma_helper_funcs = {
+static const struct drm_fb_helper_funcs drm_fb_cma_helper_funcs = {
        .fb_probe = drm_fbdev_cma_create,
 };
 
@@ -354,9 +354,10 @@ struct drm_fbdev_cma *drm_fbdev_cma_init(struct drm_device *dev,
                return ERR_PTR(-ENOMEM);
        }
 
-       fbdev_cma->fb_helper.funcs = &drm_fb_cma_helper_funcs;
        helper = &fbdev_cma->fb_helper;
 
+       drm_fb_helper_prepare(dev, helper, &drm_fb_cma_helper_funcs);
+
        ret = drm_fb_helper_init(dev, helper, num_crtc, max_conn_count);
        if (ret < 0) {
                dev_err(dev->dev, "Failed to initialize drm fb helper.\n");
index d5d8cea1a67996a4a3e61ebc657e68ec7ae6d9b6..3144db9dc0f1f0bf3b0ea7ca8d42665fb47a37f6 100644 (file)
@@ -49,10 +49,11 @@ static LIST_HEAD(kernel_fb_helper_list);
  * helper functions used by many drivers to implement the kernel mode setting
  * interfaces.
  *
- * Initialization is done as a three-step process with drm_fb_helper_init(),
- * drm_fb_helper_single_add_all_connectors() and drm_fb_helper_initial_config().
- * Drivers with fancier requirements than the default behaviour can override the
- * second step with their own code.  Teardown is done with drm_fb_helper_fini().
+ * Initialization is done as a four-step process with drm_fb_helper_prepare(),
+ * drm_fb_helper_init(), drm_fb_helper_single_add_all_connectors() and
+ * drm_fb_helper_initial_config(). Drivers with fancier requirements than the
+ * default behaviour can override the third step with their own code.
+ * Teardown is done with drm_fb_helper_fini().
  *
  * At runtime drivers should restore the fbdev console by calling
  * drm_fb_helper_restore_fbdev_mode() from their ->lastclose callback. They
@@ -63,6 +64,19 @@ static LIST_HEAD(kernel_fb_helper_list);
  *
  * All other functions exported by the fb helper library can be used to
  * implement the fbdev driver interface by the driver.
+ *
+ * It is possible, though perhaps somewhat tricky, to implement race-free
+ * hotplug detection using the fbdev helpers. The drm_fb_helper_prepare()
+ * helper must be called first to initialize the minimum required to make
+ * hotplug detection work. Drivers also need to make sure to properly set up
+ * the dev->mode_config.funcs member. After calling drm_kms_helper_poll_init()
+ * it is safe to enable interrupts and start processing hotplug events. At the
+ * same time, drivers should initialize all modeset objects such as CRTCs,
+ * encoders and connectors. To finish up the fbdev helper initialization, the
+ * drm_fb_helper_init() function is called. To probe for all attached displays
+ * and set up an initial configuration using the detected hardware, drivers
+ * should call drm_fb_helper_single_add_all_connectors() followed by
+ * drm_fb_helper_initial_config().
  */
 
 /**
@@ -105,6 +119,58 @@ fail:
 }
 EXPORT_SYMBOL(drm_fb_helper_single_add_all_connectors);
 
+int drm_fb_helper_add_one_connector(struct drm_fb_helper *fb_helper, struct drm_connector *connector)
+{
+       struct drm_fb_helper_connector **temp;
+       struct drm_fb_helper_connector *fb_helper_connector;
+
+       WARN_ON(!mutex_is_locked(&fb_helper->dev->mode_config.mutex));
+       if (fb_helper->connector_count + 1 > fb_helper->connector_info_alloc_count) {
+               temp = krealloc(fb_helper->connector_info, sizeof(struct drm_fb_helper_connector) * (fb_helper->connector_count + 1), GFP_KERNEL);
+               if (!temp)
+                       return -ENOMEM;
+
+               fb_helper->connector_info_alloc_count = fb_helper->connector_count + 1;
+               fb_helper->connector_info = temp;
+       }
+
+
+       fb_helper_connector = kzalloc(sizeof(struct drm_fb_helper_connector), GFP_KERNEL);
+       if (!fb_helper_connector)
+               return -ENOMEM;
+
+       fb_helper_connector->connector = connector;
+       fb_helper->connector_info[fb_helper->connector_count++] = fb_helper_connector;
+       return 0;
+}
+EXPORT_SYMBOL(drm_fb_helper_add_one_connector);
+
+int drm_fb_helper_remove_one_connector(struct drm_fb_helper *fb_helper,
+                                      struct drm_connector *connector)
+{
+       struct drm_fb_helper_connector *fb_helper_connector;
+       int i, j;
+
+       WARN_ON(!mutex_is_locked(&fb_helper->dev->mode_config.mutex));
+
+       for (i = 0; i < fb_helper->connector_count; i++) {
+               if (fb_helper->connector_info[i]->connector == connector)
+                       break;
+       }
+
+       if (i == fb_helper->connector_count)
+               return -EINVAL;
+       fb_helper_connector = fb_helper->connector_info[i];
+
+       for (j = i + 1; j < fb_helper->connector_count; j++) {
+               fb_helper->connector_info[j - 1] = fb_helper->connector_info[j];
+       }
+       fb_helper->connector_count--;
+       kfree(fb_helper_connector);
+       return 0;
+}
+EXPORT_SYMBOL(drm_fb_helper_remove_one_connector);
+
 static int drm_fb_helper_parse_command_line(struct drm_fb_helper *fb_helper)
 {
        struct drm_fb_helper_connector *fb_helper_conn;
@@ -199,9 +265,6 @@ int drm_fb_helper_debug_enter(struct fb_info *info)
        struct drm_crtc_helper_funcs *funcs;
        int i;
 
-       if (list_empty(&kernel_fb_helper_list))
-               return false;
-
        list_for_each_entry(helper, &kernel_fb_helper_list, kernel_fb_list) {
                for (i = 0; i < helper->crtc_count; i++) {
                        struct drm_mode_set *mode_set =
@@ -530,6 +593,24 @@ static void drm_fb_helper_crtc_free(struct drm_fb_helper *helper)
        kfree(helper->crtc_info);
 }
 
+/**
+ * drm_fb_helper_prepare - setup a drm_fb_helper structure
+ * @dev: DRM device
+ * @helper: driver-allocated fbdev helper structure to set up
+ * @funcs: pointer to structure of functions associate with this helper
+ *
+ * Sets up the bare minimum to make the framebuffer helper usable. This is
+ * useful to implement race-free initialization of the polling helpers.
+ */
+void drm_fb_helper_prepare(struct drm_device *dev, struct drm_fb_helper *helper,
+                          const struct drm_fb_helper_funcs *funcs)
+{
+       INIT_LIST_HEAD(&helper->kernel_fb_list);
+       helper->funcs = funcs;
+       helper->dev = dev;
+}
+EXPORT_SYMBOL(drm_fb_helper_prepare);
+
 /**
  * drm_fb_helper_init - initialize a drm_fb_helper structure
  * @dev: drm device
@@ -542,8 +623,7 @@ static void drm_fb_helper_crtc_free(struct drm_fb_helper *helper)
  * nor register the fbdev. This is only done in drm_fb_helper_initial_config()
  * to allow driver writes more control over the exact init sequence.
  *
- * Drivers must set fb_helper->funcs before calling
- * drm_fb_helper_initial_config().
+ * Drivers must call drm_fb_helper_prepare() before calling this function.
  *
  * RETURNS:
  * Zero if everything went ok, nonzero otherwise.
@@ -558,10 +638,6 @@ int drm_fb_helper_init(struct drm_device *dev,
        if (!max_conn_count)
                return -EINVAL;
 
-       fb_helper->dev = dev;
-
-       INIT_LIST_HEAD(&fb_helper->kernel_fb_list);
-
        fb_helper->crtc_info = kcalloc(crtc_count, sizeof(struct drm_fb_helper_crtc), GFP_KERNEL);
        if (!fb_helper->crtc_info)
                return -ENOMEM;
@@ -572,6 +648,7 @@ int drm_fb_helper_init(struct drm_device *dev,
                kfree(fb_helper->crtc_info);
                return -ENOMEM;
        }
+       fb_helper->connector_info_alloc_count = dev->mode_config.num_connector;
        fb_helper->connector_count = 0;
 
        for (i = 0; i < crtc_count; i++) {
@@ -1056,7 +1133,6 @@ void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch,
        info->fix.ypanstep = 1; /* doing it in hw */
        info->fix.ywrapstep = 0;
        info->fix.accel = FB_ACCEL_NONE;
-       info->fix.type_aux = 0;
 
        info->fix.line_length = pitch;
        return;
@@ -1613,8 +1689,10 @@ EXPORT_SYMBOL(drm_fb_helper_initial_config);
  * either the output polling work or a work item launched from the driver's
  * hotplug interrupt).
  *
- * Note that the driver must ensure that this is only called _after_ the fb has
- * been fully set up, i.e. after the call to drm_fb_helper_initial_config.
+ * Note that drivers may call this even before calling
+ * drm_fb_helper_initial_config but only aftert drm_fb_helper_init. This allows
+ * for a race-free fbcon setup and will make sure that the fbdev emulation will
+ * not miss any hotplug events.
  *
  * RETURNS:
  * 0 on success and a non-zero error code otherwise.
@@ -1624,11 +1702,8 @@ int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper)
        struct drm_device *dev = fb_helper->dev;
        u32 max_width, max_height;
 
-       if (!fb_helper->fb)
-               return 0;
-
        mutex_lock(&fb_helper->dev->mode_config.mutex);
-       if (!drm_fb_helper_is_bound(fb_helper)) {
+       if (!fb_helper->fb || !drm_fb_helper_is_bound(fb_helper)) {
                fb_helper->delayed_hotplug = true;
                mutex_unlock(&fb_helper->dev->mode_config.mutex);
                return 0;
index 021fe5d11df51111629739da5fc12665839768ca..79d5221c6e41c9880b5620623c9653799c1044ed 100644 (file)
@@ -38,6 +38,7 @@
 #include <linux/poll.h>
 #include <linux/slab.h>
 #include <linux/module.h>
+#include "drm_legacy.h"
 
 /* from BKL pushdown */
 DEFINE_MUTEX(drm_global_mutex);
@@ -111,45 +112,6 @@ err_undo:
 }
 EXPORT_SYMBOL(drm_open);
 
-/**
- * File \c open operation.
- *
- * \param inode device inode.
- * \param filp file pointer.
- *
- * Puts the dev->fops corresponding to the device minor number into
- * \p filp, call the \c open method, and restore the file operations.
- */
-int drm_stub_open(struct inode *inode, struct file *filp)
-{
-       struct drm_device *dev;
-       struct drm_minor *minor;
-       int err = -ENODEV;
-       const struct file_operations *new_fops;
-
-       DRM_DEBUG("\n");
-
-       mutex_lock(&drm_global_mutex);
-       minor = drm_minor_acquire(iminor(inode));
-       if (IS_ERR(minor))
-               goto out_unlock;
-
-       dev = minor->dev;
-       new_fops = fops_get(dev->driver->fops);
-       if (!new_fops)
-               goto out_release;
-
-       replace_fops(filp, new_fops);
-       if (filp->f_op->open)
-               err = filp->f_op->open(inode, filp);
-
-out_release:
-       drm_minor_release(minor);
-out_unlock:
-       mutex_unlock(&drm_global_mutex);
-       return err;
-}
-
 /**
  * Check whether DRI will run on this CPU.
  *
@@ -157,10 +119,6 @@ out_unlock:
  */
 static int drm_cpu_valid(void)
 {
-#if defined(__i386__)
-       if (boot_cpu_data.x86 == 3)
-               return 0;       /* No cmpxchg on a 386 */
-#endif
 #if defined(__sparc__) && !defined(__sparc_v9__)
        return 0;               /* No cmpxchg before v9 sparc. */
 #endif
@@ -203,8 +161,7 @@ static int drm_open_helper(struct file *filp, struct drm_minor *minor)
        priv->minor = minor;
 
        /* for compatibility root is always authenticated */
-       priv->always_authenticated = capable(CAP_SYS_ADMIN);
-       priv->authenticated = priv->always_authenticated;
+       priv->authenticated = capable(CAP_SYS_ADMIN);
        priv->lock_count = 0;
 
        INIT_LIST_HEAD(&priv->lhead);
@@ -429,6 +386,10 @@ int drm_release(struct inode *inode, struct file *filp)
 
        DRM_DEBUG("open_count = %d\n", dev->open_count);
 
+       mutex_lock(&dev->struct_mutex);
+       list_del(&file_priv->lhead);
+       mutex_unlock(&dev->struct_mutex);
+
        if (dev->driver->preclose)
                dev->driver->preclose(dev, file_priv);
 
@@ -461,44 +422,18 @@ int drm_release(struct inode *inode, struct file *filp)
        if (dev->driver->driver_features & DRIVER_GEM)
                drm_gem_release(dev, file_priv);
 
-       mutex_lock(&dev->ctxlist_mutex);
-       if (!list_empty(&dev->ctxlist)) {
-               struct drm_ctx_list *pos, *n;
-
-               list_for_each_entry_safe(pos, n, &dev->ctxlist, head) {
-                       if (pos->tag == file_priv &&
-                           pos->handle != DRM_KERNEL_CONTEXT) {
-                               if (dev->driver->context_dtor)
-                                       dev->driver->context_dtor(dev,
-                                                                 pos->handle);
-
-                               drm_ctxbitmap_free(dev, pos->handle);
-
-                               list_del(&pos->head);
-                               kfree(pos);
-                       }
-               }
-       }
-       mutex_unlock(&dev->ctxlist_mutex);
+       drm_legacy_ctxbitmap_flush(dev, file_priv);
 
        mutex_lock(&dev->master_mutex);
 
        if (file_priv->is_master) {
                struct drm_master *master = file_priv->master;
-               struct drm_file *temp;
-
-               mutex_lock(&dev->struct_mutex);
-               list_for_each_entry(temp, &dev->filelist, lhead) {
-                       if ((temp->master == file_priv->master) &&
-                           (temp != file_priv))
-                               temp->authenticated = temp->always_authenticated;
-               }
 
                /**
                 * Since the master is disappearing, so is the
                 * possibility to lock.
                 */
-
+               mutex_lock(&dev->struct_mutex);
                if (master->lock.hw_lock) {
                        if (dev->sigdata.lock == master->lock.hw_lock)
                                dev->sigdata.lock = NULL;
@@ -522,10 +457,6 @@ int drm_release(struct inode *inode, struct file *filp)
        file_priv->is_master = 0;
        mutex_unlock(&dev->master_mutex);
 
-       mutex_lock(&dev->struct_mutex);
-       list_del(&file_priv->lhead);
-       mutex_unlock(&dev->struct_mutex);
-
        if (dev->driver->postclose)
                dev->driver->postclose(dev, file_priv);
 
index f7d71190aad5c0c07495bd26e841b46dd959cd72..6adee4c2afc0870c6fb3bcbb07387f923d32eb1d 100644 (file)
@@ -441,18 +441,31 @@ EXPORT_SYMBOL(drm_gem_create_mmap_offset);
  * drm_gem_get_pages - helper to allocate backing pages for a GEM object
  * from shmem
  * @obj: obj in question
- * @gfpmask: gfp mask of requested pages
+ *
+ * This reads the page-array of the shmem-backing storage of the given gem
+ * object. An array of pages is returned. If a page is not allocated or
+ * swapped-out, this will allocate/swap-in the required pages. Note that the
+ * whole object is covered by the page-array and pinned in memory.
+ *
+ * Use drm_gem_put_pages() to release the array and unpin all pages.
+ *
+ * This uses the GFP-mask set on the shmem-mapping (see mapping_set_gfp_mask()).
+ * If you require other GFP-masks, you have to do those allocations yourself.
+ *
+ * Note that you are not allowed to change gfp-zones during runtime. That is,
+ * shmem_read_mapping_page_gfp() must be called with the same gfp_zone(gfp) as
+ * set during initialization. If you have special zone constraints, set them
+ * after drm_gem_init_object() via mapping_set_gfp_mask(). shmem-core takes care
+ * to keep pages in the required zone during swap-in.
  */
-struct page **drm_gem_get_pages(struct drm_gem_object *obj, gfp_t gfpmask)
+struct page **drm_gem_get_pages(struct drm_gem_object *obj)
 {
-       struct inode *inode;
        struct address_space *mapping;
        struct page *p, **pages;
        int i, npages;
 
        /* This is the shared memory object that backs the GEM resource */
-       inode = file_inode(obj->filp);
-       mapping = inode->i_mapping;
+       mapping = file_inode(obj->filp)->i_mapping;
 
        /* We already BUG_ON() for non-page-aligned sizes in
         * drm_gem_object_init(), so we should never hit this unless
@@ -466,10 +479,8 @@ struct page **drm_gem_get_pages(struct drm_gem_object *obj, gfp_t gfpmask)
        if (pages == NULL)
                return ERR_PTR(-ENOMEM);
 
-       gfpmask |= mapping_gfp_mask(mapping);
-
        for (i = 0; i < npages; i++) {
-               p = shmem_read_mapping_page_gfp(mapping, i, gfpmask);
+               p = shmem_read_mapping_page(mapping, i);
                if (IS_ERR(p))
                        goto fail;
                pages[i] = p;
@@ -479,7 +490,7 @@ struct page **drm_gem_get_pages(struct drm_gem_object *obj, gfp_t gfpmask)
                 * __GFP_DMA32 to be set in mapping_gfp_mask(inode->i_mapping)
                 * so shmem can relocate pages during swapin if required.
                 */
-               BUG_ON((gfpmask & __GFP_DMA32) &&
+               BUG_ON((mapping_gfp_mask(mapping) & __GFP_DMA32) &&
                                (page_to_pfn(p) >= 0x00100000UL));
        }
 
index 05c97c5350a1b3fde396ed7a0a17d0af7d85e755..e467e67af6e7111c69b96cb792380b5727500650 100644 (file)
@@ -327,7 +327,7 @@ drm_gem_cma_prime_import_sg_table(struct drm_device *dev, size_t size,
        /* Create a CMA GEM buffer. */
        cma_obj = __drm_gem_cma_create(dev, size);
        if (IS_ERR(cma_obj))
-               return ERR_PTR(PTR_ERR(cma_obj));
+               return ERR_CAST(cma_obj);
 
        cma_obj->paddr = sg_dma_address(sgt->sgl);
        cma_obj->sgt = sgt;
index 86feedd5e6f696f521e5fa0619c2f86b64598f60..ecaf0fa2eec8fe5d3c95ea324b6d6e0510003dec 100644 (file)
@@ -132,7 +132,7 @@ int drm_bufs_info(struct seq_file *m, void *data)
                                   i,
                                   dma->bufs[i].buf_size,
                                   dma->bufs[i].buf_count,
-                                  atomic_read(&dma->bufs[i].freelist.count),
+                                  0,
                                   dma->bufs[i].seg_count,
                                   seg_pages,
                                   seg_pages * PAGE_SIZE / 1024);
index 69c61f392e663995466c75550fbb5f6992bb4d77..40be746b7e685ef2d205e700f15ca5c3c38a8afe 100644 (file)
@@ -1,11 +1,3 @@
-/**
- * \file drm_ioctl.c
- * IOCTL processing for DRM
- *
- * \author Rickard E. (Rik) Faith <faith@valinux.com>
- * \author Gareth Hughes <gareth@valinux.com>
- */
-
 /*
  * Created: Fri Jan  8 09:01:26 1999 by faith@valinux.com
  *
@@ -13,6 +5,9 @@
  * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
  * All Rights Reserved.
  *
+ * Author Rickard E. (Rik) Faith <faith@valinux.com>
+ * Author Gareth Hughes <gareth@valinux.com>
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
@@ -35,6 +30,7 @@
 
 #include <drm/drmP.h>
 #include <drm/drm_core.h>
+#include "drm_legacy.h"
 
 #include <linux/pci.h>
 #include <linux/export.h>
 #include <asm/mtrr.h>
 #endif
 
+static int drm_version(struct drm_device *dev, void *data,
+                      struct drm_file *file_priv);
+
+#define DRM_IOCTL_DEF(ioctl, _func, _flags) \
+       [DRM_IOCTL_NR(ioctl)] = {.cmd = ioctl, .func = _func, .flags = _flags, .cmd_drv = 0, .name = #ioctl}
+
+/** Ioctl table */
+static const struct drm_ioctl_desc drm_ioctls[] = {
+       DRM_IOCTL_DEF(DRM_IOCTL_VERSION, drm_version, DRM_UNLOCKED|DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF(DRM_IOCTL_GET_UNIQUE, drm_getunique, 0),
+       DRM_IOCTL_DEF(DRM_IOCTL_GET_MAGIC, drm_getmagic, 0),
+       DRM_IOCTL_DEF(DRM_IOCTL_IRQ_BUSID, drm_irq_by_busid, DRM_MASTER|DRM_ROOT_ONLY),
+       DRM_IOCTL_DEF(DRM_IOCTL_GET_MAP, drm_getmap, DRM_UNLOCKED),
+       DRM_IOCTL_DEF(DRM_IOCTL_GET_CLIENT, drm_getclient, DRM_UNLOCKED),
+       DRM_IOCTL_DEF(DRM_IOCTL_GET_STATS, drm_getstats, DRM_UNLOCKED),
+       DRM_IOCTL_DEF(DRM_IOCTL_GET_CAP, drm_getcap, DRM_UNLOCKED|DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF(DRM_IOCTL_SET_CLIENT_CAP, drm_setclientcap, 0),
+       DRM_IOCTL_DEF(DRM_IOCTL_SET_VERSION, drm_setversion, DRM_MASTER),
+
+       DRM_IOCTL_DEF(DRM_IOCTL_SET_UNIQUE, drm_setunique, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
+       DRM_IOCTL_DEF(DRM_IOCTL_BLOCK, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
+       DRM_IOCTL_DEF(DRM_IOCTL_UNBLOCK, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
+       DRM_IOCTL_DEF(DRM_IOCTL_AUTH_MAGIC, drm_authmagic, DRM_AUTH|DRM_MASTER),
+
+       DRM_IOCTL_DEF(DRM_IOCTL_ADD_MAP, drm_addmap_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
+       DRM_IOCTL_DEF(DRM_IOCTL_RM_MAP, drm_rmmap_ioctl, DRM_AUTH),
+
+       DRM_IOCTL_DEF(DRM_IOCTL_SET_SAREA_CTX, drm_legacy_setsareactx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
+       DRM_IOCTL_DEF(DRM_IOCTL_GET_SAREA_CTX, drm_legacy_getsareactx, DRM_AUTH),
+
+       DRM_IOCTL_DEF(DRM_IOCTL_SET_MASTER, drm_setmaster_ioctl, DRM_ROOT_ONLY),
+       DRM_IOCTL_DEF(DRM_IOCTL_DROP_MASTER, drm_dropmaster_ioctl, DRM_ROOT_ONLY),
+
+       DRM_IOCTL_DEF(DRM_IOCTL_ADD_CTX, drm_legacy_addctx, DRM_AUTH|DRM_ROOT_ONLY),
+       DRM_IOCTL_DEF(DRM_IOCTL_RM_CTX, drm_legacy_rmctx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
+       DRM_IOCTL_DEF(DRM_IOCTL_MOD_CTX, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
+       DRM_IOCTL_DEF(DRM_IOCTL_GET_CTX, drm_legacy_getctx, DRM_AUTH),
+       DRM_IOCTL_DEF(DRM_IOCTL_SWITCH_CTX, drm_legacy_switchctx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
+       DRM_IOCTL_DEF(DRM_IOCTL_NEW_CTX, drm_legacy_newctx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
+       DRM_IOCTL_DEF(DRM_IOCTL_RES_CTX, drm_legacy_resctx, DRM_AUTH),
+
+       DRM_IOCTL_DEF(DRM_IOCTL_ADD_DRAW, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
+       DRM_IOCTL_DEF(DRM_IOCTL_RM_DRAW, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
+
+       DRM_IOCTL_DEF(DRM_IOCTL_LOCK, drm_lock, DRM_AUTH),
+       DRM_IOCTL_DEF(DRM_IOCTL_UNLOCK, drm_unlock, DRM_AUTH),
+
+       DRM_IOCTL_DEF(DRM_IOCTL_FINISH, drm_noop, DRM_AUTH),
+
+       DRM_IOCTL_DEF(DRM_IOCTL_ADD_BUFS, drm_addbufs, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
+       DRM_IOCTL_DEF(DRM_IOCTL_MARK_BUFS, drm_markbufs, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
+       DRM_IOCTL_DEF(DRM_IOCTL_INFO_BUFS, drm_infobufs, DRM_AUTH),
+       DRM_IOCTL_DEF(DRM_IOCTL_MAP_BUFS, drm_mapbufs, DRM_AUTH),
+       DRM_IOCTL_DEF(DRM_IOCTL_FREE_BUFS, drm_freebufs, DRM_AUTH),
+       DRM_IOCTL_DEF(DRM_IOCTL_DMA, drm_dma_ioctl, DRM_AUTH),
+
+       DRM_IOCTL_DEF(DRM_IOCTL_CONTROL, drm_control, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
+
+#if __OS_HAS_AGP
+       DRM_IOCTL_DEF(DRM_IOCTL_AGP_ACQUIRE, drm_agp_acquire_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
+       DRM_IOCTL_DEF(DRM_IOCTL_AGP_RELEASE, drm_agp_release_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
+       DRM_IOCTL_DEF(DRM_IOCTL_AGP_ENABLE, drm_agp_enable_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
+       DRM_IOCTL_DEF(DRM_IOCTL_AGP_INFO, drm_agp_info_ioctl, DRM_AUTH),
+       DRM_IOCTL_DEF(DRM_IOCTL_AGP_ALLOC, drm_agp_alloc_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
+       DRM_IOCTL_DEF(DRM_IOCTL_AGP_FREE, drm_agp_free_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
+       DRM_IOCTL_DEF(DRM_IOCTL_AGP_BIND, drm_agp_bind_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
+       DRM_IOCTL_DEF(DRM_IOCTL_AGP_UNBIND, drm_agp_unbind_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
+#endif
+
+       DRM_IOCTL_DEF(DRM_IOCTL_SG_ALLOC, drm_sg_alloc, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
+       DRM_IOCTL_DEF(DRM_IOCTL_SG_FREE, drm_sg_free, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
+
+       DRM_IOCTL_DEF(DRM_IOCTL_WAIT_VBLANK, drm_wait_vblank, DRM_UNLOCKED),
+
+       DRM_IOCTL_DEF(DRM_IOCTL_MODESET_CTL, drm_modeset_ctl, 0),
+
+       DRM_IOCTL_DEF(DRM_IOCTL_UPDATE_DRAW, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
+
+       DRM_IOCTL_DEF(DRM_IOCTL_GEM_CLOSE, drm_gem_close_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF(DRM_IOCTL_GEM_FLINK, drm_gem_flink_ioctl, DRM_AUTH|DRM_UNLOCKED),
+       DRM_IOCTL_DEF(DRM_IOCTL_GEM_OPEN, drm_gem_open_ioctl, DRM_AUTH|DRM_UNLOCKED),
+
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETRESOURCES, drm_mode_getresources, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
+
+       DRM_IOCTL_DEF(DRM_IOCTL_PRIME_HANDLE_TO_FD, drm_prime_handle_to_fd_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF(DRM_IOCTL_PRIME_FD_TO_HANDLE, drm_prime_fd_to_handle_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW),
+
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPLANERESOURCES, drm_mode_getplane_res, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETCRTC, drm_mode_getcrtc, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETCRTC, drm_mode_setcrtc, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPLANE, drm_mode_getplane, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETPLANE, drm_mode_setplane, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_CURSOR, drm_mode_cursor_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETGAMMA, drm_mode_gamma_get_ioctl, DRM_UNLOCKED),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETGAMMA, drm_mode_gamma_set_ioctl, DRM_MASTER|DRM_UNLOCKED),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETENCODER, drm_mode_getencoder, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETCONNECTOR, drm_mode_getconnector, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_ATTACHMODE, drm_noop, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_DETACHMODE, drm_noop, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPROPERTY, drm_mode_getproperty_ioctl, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETPROPERTY, drm_mode_connector_property_set_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPROPBLOB, drm_mode_getblob_ioctl, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETFB, drm_mode_getfb, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB, drm_mode_addfb, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB2, drm_mode_addfb2, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_RMFB, drm_mode_rmfb, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_PAGE_FLIP, drm_mode_page_flip_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_DIRTYFB, drm_mode_dirtyfb_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_CREATE_DUMB, drm_mode_create_dumb_ioctl, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_MAP_DUMB, drm_mode_mmap_dumb_ioctl, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_DESTROY_DUMB, drm_mode_destroy_dumb_ioctl, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_OBJ_GETPROPERTIES, drm_mode_obj_get_properties_ioctl, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_OBJ_SETPROPERTY, drm_mode_obj_set_property_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
+       DRM_IOCTL_DEF(DRM_IOCTL_MODE_CURSOR2, drm_mode_cursor2_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
+};
+
+#define DRM_CORE_IOCTL_COUNT   ARRAY_SIZE( drm_ioctls )
+
 /**
  * Get the bus id.
  *
@@ -342,8 +456,6 @@ drm_setclientcap(struct drm_device *dev, void *data, struct drm_file *file_priv)
                file_priv->stereo_allowed = req->value;
                break;
        case DRM_CLIENT_CAP_UNIVERSAL_PLANES:
-               if (!drm_universal_planes)
-                       return -EINVAL;
                if (req->value > 1)
                        return -EINVAL;
                file_priv->universal_planes = req->value;
@@ -417,3 +529,243 @@ int drm_noop(struct drm_device *dev, void *data,
        return 0;
 }
 EXPORT_SYMBOL(drm_noop);
+
+/**
+ * Copy and IOCTL return string to user space
+ */
+static int drm_copy_field(char __user *buf, size_t *buf_len, const char *value)
+{
+       int len;
+
+       /* don't overflow userbuf */
+       len = strlen(value);
+       if (len > *buf_len)
+               len = *buf_len;
+
+       /* let userspace know exact length of driver value (which could be
+        * larger than the userspace-supplied buffer) */
+       *buf_len = strlen(value);
+
+       /* finally, try filling in the userbuf */
+       if (len && buf)
+               if (copy_to_user(buf, value, len))
+                       return -EFAULT;
+       return 0;
+}
+
+/**
+ * Get version information
+ *
+ * \param inode device inode.
+ * \param filp file pointer.
+ * \param cmd command.
+ * \param arg user argument, pointing to a drm_version structure.
+ * \return zero on success or negative number on failure.
+ *
+ * Fills in the version information in \p arg.
+ */
+static int drm_version(struct drm_device *dev, void *data,
+                      struct drm_file *file_priv)
+{
+       struct drm_version *version = data;
+       int err;
+
+       version->version_major = dev->driver->major;
+       version->version_minor = dev->driver->minor;
+       version->version_patchlevel = dev->driver->patchlevel;
+       err = drm_copy_field(version->name, &version->name_len,
+                       dev->driver->name);
+       if (!err)
+               err = drm_copy_field(version->date, &version->date_len,
+                               dev->driver->date);
+       if (!err)
+               err = drm_copy_field(version->desc, &version->desc_len,
+                               dev->driver->desc);
+
+       return err;
+}
+
+/**
+ * drm_ioctl_permit - Check ioctl permissions against caller
+ *
+ * @flags: ioctl permission flags.
+ * @file_priv: Pointer to struct drm_file identifying the caller.
+ *
+ * Checks whether the caller is allowed to run an ioctl with the
+ * indicated permissions. If so, returns zero. Otherwise returns an
+ * error code suitable for ioctl return.
+ */
+static int drm_ioctl_permit(u32 flags, struct drm_file *file_priv)
+{
+       /* ROOT_ONLY is only for CAP_SYS_ADMIN */
+       if (unlikely((flags & DRM_ROOT_ONLY) && !capable(CAP_SYS_ADMIN)))
+               return -EACCES;
+
+       /* AUTH is only for authenticated or render client */
+       if (unlikely((flags & DRM_AUTH) && !drm_is_render_client(file_priv) &&
+                    !file_priv->authenticated))
+               return -EACCES;
+
+       /* MASTER is only for master or control clients */
+       if (unlikely((flags & DRM_MASTER) && !file_priv->is_master &&
+                    !drm_is_control_client(file_priv)))
+               return -EACCES;
+
+       /* Control clients must be explicitly allowed */
+       if (unlikely(!(flags & DRM_CONTROL_ALLOW) &&
+                    drm_is_control_client(file_priv)))
+               return -EACCES;
+
+       /* Render clients must be explicitly allowed */
+       if (unlikely(!(flags & DRM_RENDER_ALLOW) &&
+                    drm_is_render_client(file_priv)))
+               return -EACCES;
+
+       return 0;
+}
+
+/**
+ * Called whenever a process performs an ioctl on /dev/drm.
+ *
+ * \param inode device inode.
+ * \param file_priv DRM file private.
+ * \param cmd command.
+ * \param arg user argument.
+ * \return zero on success or negative number on failure.
+ *
+ * Looks up the ioctl function in the ::ioctls table, checking for root
+ * previleges if so required, and dispatches to the respective function.
+ */
+long drm_ioctl(struct file *filp,
+             unsigned int cmd, unsigned long arg)
+{
+       struct drm_file *file_priv = filp->private_data;
+       struct drm_device *dev;
+       const struct drm_ioctl_desc *ioctl = NULL;
+       drm_ioctl_t *func;
+       unsigned int nr = DRM_IOCTL_NR(cmd);
+       int retcode = -EINVAL;
+       char stack_kdata[128];
+       char *kdata = NULL;
+       unsigned int usize, asize;
+
+       dev = file_priv->minor->dev;
+
+       if (drm_device_is_unplugged(dev))
+               return -ENODEV;
+
+       if ((nr >= DRM_CORE_IOCTL_COUNT) &&
+           ((nr < DRM_COMMAND_BASE) || (nr >= DRM_COMMAND_END)))
+               goto err_i1;
+       if ((nr >= DRM_COMMAND_BASE) && (nr < DRM_COMMAND_END) &&
+           (nr < DRM_COMMAND_BASE + dev->driver->num_ioctls)) {
+               u32 drv_size;
+               ioctl = &dev->driver->ioctls[nr - DRM_COMMAND_BASE];
+               drv_size = _IOC_SIZE(ioctl->cmd_drv);
+               usize = asize = _IOC_SIZE(cmd);
+               if (drv_size > asize)
+                       asize = drv_size;
+               cmd = ioctl->cmd_drv;
+       }
+       else if ((nr >= DRM_COMMAND_END) || (nr < DRM_COMMAND_BASE)) {
+               u32 drv_size;
+
+               ioctl = &drm_ioctls[nr];
+
+               drv_size = _IOC_SIZE(ioctl->cmd);
+               usize = asize = _IOC_SIZE(cmd);
+               if (drv_size > asize)
+                       asize = drv_size;
+
+               cmd = ioctl->cmd;
+       } else
+               goto err_i1;
+
+       DRM_DEBUG("pid=%d, dev=0x%lx, auth=%d, %s\n",
+                 task_pid_nr(current),
+                 (long)old_encode_dev(file_priv->minor->kdev->devt),
+                 file_priv->authenticated, ioctl->name);
+
+       /* Do not trust userspace, use our own definition */
+       func = ioctl->func;
+
+       if (unlikely(!func)) {
+               DRM_DEBUG("no function\n");
+               retcode = -EINVAL;
+               goto err_i1;
+       }
+
+       retcode = drm_ioctl_permit(ioctl->flags, file_priv);
+       if (unlikely(retcode))
+               goto err_i1;
+
+       if (cmd & (IOC_IN | IOC_OUT)) {
+               if (asize <= sizeof(stack_kdata)) {
+                       kdata = stack_kdata;
+               } else {
+                       kdata = kmalloc(asize, GFP_KERNEL);
+                       if (!kdata) {
+                               retcode = -ENOMEM;
+                               goto err_i1;
+                       }
+               }
+               if (asize > usize)
+                       memset(kdata + usize, 0, asize - usize);
+       }
+
+       if (cmd & IOC_IN) {
+               if (copy_from_user(kdata, (void __user *)arg,
+                                  usize) != 0) {
+                       retcode = -EFAULT;
+                       goto err_i1;
+               }
+       } else if (cmd & IOC_OUT) {
+               memset(kdata, 0, usize);
+       }
+
+       if (ioctl->flags & DRM_UNLOCKED)
+               retcode = func(dev, kdata, file_priv);
+       else {
+               mutex_lock(&drm_global_mutex);
+               retcode = func(dev, kdata, file_priv);
+               mutex_unlock(&drm_global_mutex);
+       }
+
+       if (cmd & IOC_OUT) {
+               if (copy_to_user((void __user *)arg, kdata,
+                                usize) != 0)
+                       retcode = -EFAULT;
+       }
+
+      err_i1:
+       if (!ioctl)
+               DRM_DEBUG("invalid ioctl: pid=%d, dev=0x%lx, auth=%d, cmd=0x%02x, nr=0x%02x\n",
+                         task_pid_nr(current),
+                         (long)old_encode_dev(file_priv->minor->kdev->devt),
+                         file_priv->authenticated, cmd, nr);
+
+       if (kdata != stack_kdata)
+               kfree(kdata);
+       if (retcode)
+               DRM_DEBUG("ret = %d\n", retcode);
+       return retcode;
+}
+EXPORT_SYMBOL(drm_ioctl);
+
+/**
+ * drm_ioctl_flags - Check for core ioctl and return ioctl permission flags
+ *
+ * @nr: Ioctl number.
+ * @flags: Where to return the ioctl permission flags
+ */
+bool drm_ioctl_flags(unsigned int nr, unsigned int *flags)
+{
+       if ((nr >= DRM_COMMAND_END && nr < DRM_CORE_IOCTL_COUNT) ||
+           (nr < DRM_COMMAND_BASE)) {
+               *flags = drm_ioctls[nr].flags;
+               return true;
+       }
+
+       return false;
+}
+EXPORT_SYMBOL(drm_ioctl_flags);
diff --git a/drivers/gpu/drm/drm_legacy.h b/drivers/gpu/drm/drm_legacy.h
new file mode 100644 (file)
index 0000000..d34f20a
--- /dev/null
@@ -0,0 +1,51 @@
+#ifndef __DRM_LEGACY_H__
+#define __DRM_LEGACY_H__
+
+/*
+ * Copyright (c) 2014 David Herrmann <dh.herrmann@gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+struct drm_device;
+struct drm_file;
+
+/*
+ * Generic DRM Contexts
+ */
+
+#define DRM_KERNEL_CONTEXT             0
+#define DRM_RESERVED_CONTEXTS          1
+
+int drm_legacy_ctxbitmap_init(struct drm_device *dev);
+void drm_legacy_ctxbitmap_cleanup(struct drm_device *dev);
+void drm_legacy_ctxbitmap_free(struct drm_device *dev, int ctx_handle);
+void drm_legacy_ctxbitmap_flush(struct drm_device *dev, struct drm_file *file);
+
+int drm_legacy_resctx(struct drm_device *d, void *v, struct drm_file *f);
+int drm_legacy_addctx(struct drm_device *d, void *v, struct drm_file *f);
+int drm_legacy_getctx(struct drm_device *d, void *v, struct drm_file *f);
+int drm_legacy_switchctx(struct drm_device *d, void *v, struct drm_file *f);
+int drm_legacy_newctx(struct drm_device *d, void *v, struct drm_file *f);
+int drm_legacy_rmctx(struct drm_device *d, void *v, struct drm_file *f);
+
+int drm_legacy_setsareactx(struct drm_device *d, void *v, struct drm_file *f);
+int drm_legacy_getsareactx(struct drm_device *d, void *v, struct drm_file *f);
+
+#endif /* __DRM_LEGACY_H__ */
index f6452682141b5fd25773153233fb97983dafbc40..e26b59e385ff151116f5af63bf47626c2839f8eb 100644 (file)
@@ -35,6 +35,7 @@
 
 #include <linux/export.h>
 #include <drm/drmP.h>
+#include "drm_legacy.h"
 
 static int drm_notifier(void *priv);
 
index e633df2f68d896622b56a946dd0b649826cf05bc..6aa6a9e95570690360d191953d1566ad55227809 100644 (file)
@@ -201,16 +201,15 @@ EXPORT_SYMBOL(mipi_dsi_detach);
 /**
  * mipi_dsi_dcs_write - send DCS write command
  * @dsi: DSI device
- * @channel: virtual channel
  * @data: pointer to the command followed by parameters
  * @len: length of @data
  */
-int mipi_dsi_dcs_write(struct mipi_dsi_device *dsi, unsigned int channel,
-                      const void *data, size_t len)
+ssize_t mipi_dsi_dcs_write(struct mipi_dsi_device *dsi, const void *data,
+                           size_t len)
 {
        const struct mipi_dsi_host_ops *ops = dsi->host->ops;
        struct mipi_dsi_msg msg = {
-               .channel = channel,
+               .channel = dsi->channel,
                .tx_buf = data,
                .tx_len = len
        };
@@ -239,19 +238,18 @@ EXPORT_SYMBOL(mipi_dsi_dcs_write);
 /**
  * mipi_dsi_dcs_read - send DCS read request command
  * @dsi: DSI device
- * @channel: virtual channel
  * @cmd: DCS read command
  * @data: pointer to read buffer
  * @len: length of @data
  *
  * Function returns number of read bytes or error code.
  */
-ssize_t mipi_dsi_dcs_read(struct mipi_dsi_device *dsi, unsigned int channel,
-                         u8 cmd, void *data, size_t len)
+ssize_t mipi_dsi_dcs_read(struct mipi_dsi_device *dsi, u8 cmd, void *data,
+                         size_t len)
 {
        const struct mipi_dsi_host_ops *ops = dsi->host->ops;
        struct mipi_dsi_msg msg = {
-               .channel = channel,
+               .channel = dsi->channel,
                .type = MIPI_DSI_DCS_READ,
                .tx_buf = &cmd,
                .tx_len = 1,
diff --git a/drivers/gpu/drm/drm_of.c b/drivers/gpu/drm/drm_of.c
new file mode 100644 (file)
index 0000000..16150a0
--- /dev/null
@@ -0,0 +1,67 @@
+#include <linux/export.h>
+#include <linux/list.h>
+#include <linux/of_graph.h>
+#include <drm/drmP.h>
+#include <drm/drm_crtc.h>
+#include <drm/drm_of.h>
+
+/**
+ * drm_crtc_port_mask - find the mask of a registered CRTC by port OF node
+ * @dev: DRM device
+ * @port: port OF node
+ *
+ * Given a port OF node, return the possible mask of the corresponding
+ * CRTC within a device's list of CRTCs.  Returns zero if not found.
+ */
+static uint32_t drm_crtc_port_mask(struct drm_device *dev,
+                                  struct device_node *port)
+{
+       unsigned int index = 0;
+       struct drm_crtc *tmp;
+
+       list_for_each_entry(tmp, &dev->mode_config.crtc_list, head) {
+               if (tmp->port == port)
+                       return 1 << index;
+
+               index++;
+       }
+
+       return 0;
+}
+
+/**
+ * drm_of_find_possible_crtcs - find the possible CRTCs for an encoder port
+ * @dev: DRM device
+ * @port: encoder port to scan for endpoints
+ *
+ * Scan all endpoints attached to a port, locate their attached CRTCs,
+ * and generate the DRM mask of CRTCs which may be attached to this
+ * encoder.
+ *
+ * See Documentation/devicetree/bindings/graph.txt for the bindings.
+ */
+uint32_t drm_of_find_possible_crtcs(struct drm_device *dev,
+                                   struct device_node *port)
+{
+       struct device_node *remote_port, *ep = NULL;
+       uint32_t possible_crtcs = 0;
+
+       do {
+               ep = of_graph_get_next_endpoint(port, ep);
+               if (!ep)
+                       break;
+
+               remote_port = of_graph_get_remote_port(ep);
+               if (!remote_port) {
+                       of_node_put(ep);
+                       return 0;
+               }
+
+               possible_crtcs |= drm_crtc_port_mask(dev, remote_port);
+
+               of_node_put(remote_port);
+       } while (1);
+
+       return possible_crtcs;
+}
+EXPORT_SYMBOL(drm_of_find_possible_crtcs);
index 6d133149cc74873fd593aff0ae1aaa9362c29c31..827ec1a3040b202fc025a9d1b8af54e32b67726f 100644 (file)
@@ -335,9 +335,10 @@ struct drm_plane *drm_primary_helper_create_plane(struct drm_device *dev,
        }
 
        /* possible_crtc's will be filled in later by crtc_init */
-       ret = drm_plane_init(dev, primary, 0, &drm_primary_helper_funcs,
-                            formats, num_formats,
-                            DRM_PLANE_TYPE_PRIMARY);
+       ret = drm_universal_plane_init(dev, primary, 0,
+                                      &drm_primary_helper_funcs,
+                                      formats, num_formats,
+                                      DRM_PLANE_TYPE_PRIMARY);
        if (ret) {
                kfree(primary);
                primary = NULL;
index d22676b89cbb337147ec319fe5af4963e5e9f1d8..db7d250f7ac753dd244307d49217726e101df51e 100644 (file)
@@ -130,7 +130,14 @@ static int drm_helper_probe_single_connector_modes_merge_bits(struct drm_connect
        count = drm_load_edid_firmware(connector);
        if (count == 0)
 #endif
-               count = (*connector_funcs->get_modes)(connector);
+       {
+               if (connector->override_edid) {
+                       struct edid *edid = (struct edid *) connector->edid_blob_ptr->data;
+
+                       count = drm_add_edid_modes(connector, edid);
+               } else
+                       count = (*connector_funcs->get_modes)(connector);
+       }
 
        if (count == 0 && connector->status == connector_status_connected)
                count = drm_add_modes_noedid(connector, 1024, 768);
index 7047ca02578775e2a228a04dfc09992399c431f3..631f5afd451c2bed39e94bde3e2ad71483c6e0ae 100644 (file)
@@ -293,3 +293,143 @@ void drm_rect_debug_print(const struct drm_rect *r, bool fixed_point)
                DRM_DEBUG_KMS("%dx%d%+d%+d\n", w, h, r->x1, r->y1);
 }
 EXPORT_SYMBOL(drm_rect_debug_print);
+
+/**
+ * drm_rect_rotate - Rotate the rectangle
+ * @r: rectangle to be rotated
+ * @width: Width of the coordinate space
+ * @height: Height of the coordinate space
+ * @rotation: Transformation to be applied
+ *
+ * Apply @rotation to the coordinates of rectangle @r.
+ *
+ * @width and @height combined with @rotation define
+ * the location of the new origin.
+ *
+ * @width correcsponds to the horizontal and @height
+ * to the vertical axis of the untransformed coordinate
+ * space.
+ */
+void drm_rect_rotate(struct drm_rect *r,
+                    int width, int height,
+                    unsigned int rotation)
+{
+       struct drm_rect tmp;
+
+       if (rotation & (BIT(DRM_REFLECT_X) | BIT(DRM_REFLECT_Y))) {
+               tmp = *r;
+
+               if (rotation & BIT(DRM_REFLECT_X)) {
+                       r->x1 = width - tmp.x2;
+                       r->x2 = width - tmp.x1;
+               }
+
+               if (rotation & BIT(DRM_REFLECT_Y)) {
+                       r->y1 = height - tmp.y2;
+                       r->y2 = height - tmp.y1;
+               }
+       }
+
+       switch (rotation & 0xf) {
+       case BIT(DRM_ROTATE_0):
+               break;
+       case BIT(DRM_ROTATE_90):
+               tmp = *r;
+               r->x1 = tmp.y1;
+               r->x2 = tmp.y2;
+               r->y1 = width - tmp.x2;
+               r->y2 = width - tmp.x1;
+               break;
+       case BIT(DRM_ROTATE_180):
+               tmp = *r;
+               r->x1 = width - tmp.x2;
+               r->x2 = width - tmp.x1;
+               r->y1 = height - tmp.y2;
+               r->y2 = height - tmp.y1;
+               break;
+       case BIT(DRM_ROTATE_270):
+               tmp = *r;
+               r->x1 = height - tmp.y2;
+               r->x2 = height - tmp.y1;
+               r->y1 = tmp.x1;
+               r->y2 = tmp.x2;
+               break;
+       default:
+               break;
+       }
+}
+EXPORT_SYMBOL(drm_rect_rotate);
+
+/**
+ * drm_rect_rotate_inv - Inverse rotate the rectangle
+ * @r: rectangle to be rotated
+ * @width: Width of the coordinate space
+ * @height: Height of the coordinate space
+ * @rotation: Transformation whose inverse is to be applied
+ *
+ * Apply the inverse of @rotation to the coordinates
+ * of rectangle @r.
+ *
+ * @width and @height combined with @rotation define
+ * the location of the new origin.
+ *
+ * @width correcsponds to the horizontal and @height
+ * to the vertical axis of the original untransformed
+ * coordinate space, so that you never have to flip
+ * them when doing a rotatation and its inverse.
+ * That is, if you do:
+ *
+ * drm_rotate(&r, width, height, rotation);
+ * drm_rotate_inv(&r, width, height, rotation);
+ *
+ * you will always get back the original rectangle.
+ */
+void drm_rect_rotate_inv(struct drm_rect *r,
+                        int width, int height,
+                        unsigned int rotation)
+{
+       struct drm_rect tmp;
+
+       switch (rotation & 0xf) {
+       case BIT(DRM_ROTATE_0):
+               break;
+       case BIT(DRM_ROTATE_90):
+               tmp = *r;
+               r->x1 = width - tmp.y2;
+               r->x2 = width - tmp.y1;
+               r->y1 = tmp.x1;
+               r->y2 = tmp.x2;
+               break;
+       case BIT(DRM_ROTATE_180):
+               tmp = *r;
+               r->x1 = width - tmp.x2;
+               r->x2 = width - tmp.x1;
+               r->y1 = height - tmp.y2;
+               r->y2 = height - tmp.y1;
+               break;
+       case BIT(DRM_ROTATE_270):
+               tmp = *r;
+               r->x1 = tmp.y1;
+               r->x2 = tmp.y2;
+               r->y1 = height - tmp.x2;
+               r->y2 = height - tmp.x1;
+               break;
+       default:
+               break;
+       }
+
+       if (rotation & (BIT(DRM_REFLECT_X) | BIT(DRM_REFLECT_Y))) {
+               tmp = *r;
+
+               if (rotation & BIT(DRM_REFLECT_X)) {
+                       r->x1 = width - tmp.x2;
+                       r->x2 = width - tmp.x1;
+               }
+
+               if (rotation & BIT(DRM_REFLECT_Y)) {
+                       r->y1 = height - tmp.y2;
+                       r->y2 = height - tmp.y1;
+               }
+       }
+}
+EXPORT_SYMBOL(drm_rect_rotate_inv);
diff --git a/drivers/gpu/drm/drm_stub.c b/drivers/gpu/drm/drm_stub.c
deleted file mode 100644 (file)
index 14d1646..0000000
+++ /dev/null
@@ -1,805 +0,0 @@
-/*
- * Created: Fri Jan 19 10:48:35 2001 by faith@acm.org
- *
- * Copyright 2001 VA Linux Systems, Inc., Sunnyvale, California.
- * All Rights Reserved.
- *
- * Author Rickard E. (Rik) Faith <faith@valinux.com>
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-#include <linux/fs.h>
-#include <linux/module.h>
-#include <linux/moduleparam.h>
-#include <linux/mount.h>
-#include <linux/slab.h>
-#include <drm/drmP.h>
-#include <drm/drm_core.h>
-
-unsigned int drm_debug = 0;    /* 1 to enable debug output */
-EXPORT_SYMBOL(drm_debug);
-
-unsigned int drm_rnodes = 0;   /* 1 to enable experimental render nodes API */
-EXPORT_SYMBOL(drm_rnodes);
-
-/* 1 to allow user space to request universal planes (experimental) */
-unsigned int drm_universal_planes = 0;
-EXPORT_SYMBOL(drm_universal_planes);
-
-unsigned int drm_vblank_offdelay = 5000;    /* Default to 5000 msecs. */
-EXPORT_SYMBOL(drm_vblank_offdelay);
-
-unsigned int drm_timestamp_precision = 20;  /* Default to 20 usecs. */
-EXPORT_SYMBOL(drm_timestamp_precision);
-
-/*
- * Default to use monotonic timestamps for wait-for-vblank and page-flip
- * complete events.
- */
-unsigned int drm_timestamp_monotonic = 1;
-
-MODULE_AUTHOR(CORE_AUTHOR);
-MODULE_DESCRIPTION(CORE_DESC);
-MODULE_LICENSE("GPL and additional rights");
-MODULE_PARM_DESC(debug, "Enable debug output");
-MODULE_PARM_DESC(rnodes, "Enable experimental render nodes API");
-MODULE_PARM_DESC(vblankoffdelay, "Delay until vblank irq auto-disable [msecs]");
-MODULE_PARM_DESC(timestamp_precision_usec, "Max. error on timestamps [usecs]");
-MODULE_PARM_DESC(timestamp_monotonic, "Use monotonic timestamps");
-
-module_param_named(debug, drm_debug, int, 0600);
-module_param_named(rnodes, drm_rnodes, int, 0600);
-module_param_named(universal_planes, drm_universal_planes, int, 0600);
-module_param_named(vblankoffdelay, drm_vblank_offdelay, int, 0600);
-module_param_named(timestamp_precision_usec, drm_timestamp_precision, int, 0600);
-module_param_named(timestamp_monotonic, drm_timestamp_monotonic, int, 0600);
-
-static DEFINE_SPINLOCK(drm_minor_lock);
-struct idr drm_minors_idr;
-
-struct class *drm_class;
-struct dentry *drm_debugfs_root;
-
-int drm_err(const char *func, const char *format, ...)
-{
-       struct va_format vaf;
-       va_list args;
-       int r;
-
-       va_start(args, format);
-
-       vaf.fmt = format;
-       vaf.va = &args;
-
-       r = printk(KERN_ERR "[" DRM_NAME ":%s] *ERROR* %pV", func, &vaf);
-
-       va_end(args);
-
-       return r;
-}
-EXPORT_SYMBOL(drm_err);
-
-void drm_ut_debug_printk(const char *function_name, const char *format, ...)
-{
-       struct va_format vaf;
-       va_list args;
-
-       va_start(args, format);
-       vaf.fmt = format;
-       vaf.va = &args;
-
-       printk(KERN_DEBUG "[" DRM_NAME ":%s] %pV", function_name, &vaf);
-
-       va_end(args);
-}
-EXPORT_SYMBOL(drm_ut_debug_printk);
-
-struct drm_master *drm_master_create(struct drm_minor *minor)
-{
-       struct drm_master *master;
-
-       master = kzalloc(sizeof(*master), GFP_KERNEL);
-       if (!master)
-               return NULL;
-
-       kref_init(&master->refcount);
-       spin_lock_init(&master->lock.spinlock);
-       init_waitqueue_head(&master->lock.lock_queue);
-       if (drm_ht_create(&master->magiclist, DRM_MAGIC_HASH_ORDER)) {
-               kfree(master);
-               return NULL;
-       }
-       INIT_LIST_HEAD(&master->magicfree);
-       master->minor = minor;
-
-       return master;
-}
-
-struct drm_master *drm_master_get(struct drm_master *master)
-{
-       kref_get(&master->refcount);
-       return master;
-}
-EXPORT_SYMBOL(drm_master_get);
-
-static void drm_master_destroy(struct kref *kref)
-{
-       struct drm_master *master = container_of(kref, struct drm_master, refcount);
-       struct drm_magic_entry *pt, *next;
-       struct drm_device *dev = master->minor->dev;
-       struct drm_map_list *r_list, *list_temp;
-
-       mutex_lock(&dev->struct_mutex);
-       if (dev->driver->master_destroy)
-               dev->driver->master_destroy(dev, master);
-
-       list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head) {
-               if (r_list->master == master) {
-                       drm_rmmap_locked(dev, r_list->map);
-                       r_list = NULL;
-               }
-       }
-
-       if (master->unique) {
-               kfree(master->unique);
-               master->unique = NULL;
-               master->unique_len = 0;
-       }
-
-       list_for_each_entry_safe(pt, next, &master->magicfree, head) {
-               list_del(&pt->head);
-               drm_ht_remove_item(&master->magiclist, &pt->hash_item);
-               kfree(pt);
-       }
-
-       drm_ht_remove(&master->magiclist);
-
-       mutex_unlock(&dev->struct_mutex);
-       kfree(master);
-}
-
-void drm_master_put(struct drm_master **master)
-{
-       kref_put(&(*master)->refcount, drm_master_destroy);
-       *master = NULL;
-}
-EXPORT_SYMBOL(drm_master_put);
-
-int drm_setmaster_ioctl(struct drm_device *dev, void *data,
-                       struct drm_file *file_priv)
-{
-       int ret = 0;
-
-       mutex_lock(&dev->master_mutex);
-       if (file_priv->is_master)
-               goto out_unlock;
-
-       if (file_priv->minor->master) {
-               ret = -EINVAL;
-               goto out_unlock;
-       }
-
-       if (!file_priv->master) {
-               ret = -EINVAL;
-               goto out_unlock;
-       }
-
-       file_priv->minor->master = drm_master_get(file_priv->master);
-       file_priv->is_master = 1;
-       if (dev->driver->master_set) {
-               ret = dev->driver->master_set(dev, file_priv, false);
-               if (unlikely(ret != 0)) {
-                       file_priv->is_master = 0;
-                       drm_master_put(&file_priv->minor->master);
-               }
-       }
-
-out_unlock:
-       mutex_unlock(&dev->master_mutex);
-       return ret;
-}
-
-int drm_dropmaster_ioctl(struct drm_device *dev, void *data,
-                        struct drm_file *file_priv)
-{
-       int ret = -EINVAL;
-
-       mutex_lock(&dev->master_mutex);
-       if (!file_priv->is_master)
-               goto out_unlock;
-
-       if (!file_priv->minor->master)
-               goto out_unlock;
-
-       ret = 0;
-       if (dev->driver->master_drop)
-               dev->driver->master_drop(dev, file_priv, false);
-       drm_master_put(&file_priv->minor->master);
-       file_priv->is_master = 0;
-
-out_unlock:
-       mutex_unlock(&dev->master_mutex);
-       return ret;
-}
-
-/*
- * DRM Minors
- * A DRM device can provide several char-dev interfaces on the DRM-Major. Each
- * of them is represented by a drm_minor object. Depending on the capabilities
- * of the device-driver, different interfaces are registered.
- *
- * Minors can be accessed via dev->$minor_name. This pointer is either
- * NULL or a valid drm_minor pointer and stays valid as long as the device is
- * valid. This means, DRM minors have the same life-time as the underlying
- * device. However, this doesn't mean that the minor is active. Minors are
- * registered and unregistered dynamically according to device-state.
- */
-
-static struct drm_minor **drm_minor_get_slot(struct drm_device *dev,
-                                            unsigned int type)
-{
-       switch (type) {
-       case DRM_MINOR_LEGACY:
-               return &dev->primary;
-       case DRM_MINOR_RENDER:
-               return &dev->render;
-       case DRM_MINOR_CONTROL:
-               return &dev->control;
-       default:
-               return NULL;
-       }
-}
-
-static int drm_minor_alloc(struct drm_device *dev, unsigned int type)
-{
-       struct drm_minor *minor;
-
-       minor = kzalloc(sizeof(*minor), GFP_KERNEL);
-       if (!minor)
-               return -ENOMEM;
-
-       minor->type = type;
-       minor->dev = dev;
-
-       *drm_minor_get_slot(dev, type) = minor;
-       return 0;
-}
-
-static void drm_minor_free(struct drm_device *dev, unsigned int type)
-{
-       struct drm_minor **slot;
-
-       slot = drm_minor_get_slot(dev, type);
-       if (*slot) {
-               drm_mode_group_destroy(&(*slot)->mode_group);
-               kfree(*slot);
-               *slot = NULL;
-       }
-}
-
-static int drm_minor_register(struct drm_device *dev, unsigned int type)
-{
-       struct drm_minor *new_minor;
-       unsigned long flags;
-       int ret;
-       int minor_id;
-
-       DRM_DEBUG("\n");
-
-       new_minor = *drm_minor_get_slot(dev, type);
-       if (!new_minor)
-               return 0;
-
-       idr_preload(GFP_KERNEL);
-       spin_lock_irqsave(&drm_minor_lock, flags);
-       minor_id = idr_alloc(&drm_minors_idr,
-                            NULL,
-                            64 * type,
-                            64 * (type + 1),
-                            GFP_NOWAIT);
-       spin_unlock_irqrestore(&drm_minor_lock, flags);
-       idr_preload_end();
-
-       if (minor_id < 0)
-               return minor_id;
-
-       new_minor->index = minor_id;
-
-       ret = drm_debugfs_init(new_minor, minor_id, drm_debugfs_root);
-       if (ret) {
-               DRM_ERROR("DRM: Failed to initialize /sys/kernel/debug/dri.\n");
-               goto err_id;
-       }
-
-       ret = drm_sysfs_device_add(new_minor);
-       if (ret) {
-               DRM_ERROR("DRM: Error sysfs_device_add.\n");
-               goto err_debugfs;
-       }
-
-       /* replace NULL with @minor so lookups will succeed from now on */
-       spin_lock_irqsave(&drm_minor_lock, flags);
-       idr_replace(&drm_minors_idr, new_minor, new_minor->index);
-       spin_unlock_irqrestore(&drm_minor_lock, flags);
-
-       DRM_DEBUG("new minor assigned %d\n", minor_id);
-       return 0;
-
-err_debugfs:
-       drm_debugfs_cleanup(new_minor);
-err_id:
-       spin_lock_irqsave(&drm_minor_lock, flags);
-       idr_remove(&drm_minors_idr, minor_id);
-       spin_unlock_irqrestore(&drm_minor_lock, flags);
-       new_minor->index = 0;
-       return ret;
-}
-
-static void drm_minor_unregister(struct drm_device *dev, unsigned int type)
-{
-       struct drm_minor *minor;
-       unsigned long flags;
-
-       minor = *drm_minor_get_slot(dev, type);
-       if (!minor || !minor->kdev)
-               return;
-
-       spin_lock_irqsave(&drm_minor_lock, flags);
-       idr_remove(&drm_minors_idr, minor->index);
-       spin_unlock_irqrestore(&drm_minor_lock, flags);
-       minor->index = 0;
-
-       drm_debugfs_cleanup(minor);
-       drm_sysfs_device_remove(minor);
-}
-
-/**
- * drm_minor_acquire - Acquire a DRM minor
- * @minor_id: Minor ID of the DRM-minor
- *
- * Looks up the given minor-ID and returns the respective DRM-minor object. The
- * refence-count of the underlying device is increased so you must release this
- * object with drm_minor_release().
- *
- * As long as you hold this minor, it is guaranteed that the object and the
- * minor->dev pointer will stay valid! However, the device may get unplugged and
- * unregistered while you hold the minor.
- *
- * Returns:
- * Pointer to minor-object with increased device-refcount, or PTR_ERR on
- * failure.
- */
-struct drm_minor *drm_minor_acquire(unsigned int minor_id)
-{
-       struct drm_minor *minor;
-       unsigned long flags;
-
-       spin_lock_irqsave(&drm_minor_lock, flags);
-       minor = idr_find(&drm_minors_idr, minor_id);
-       if (minor)
-               drm_dev_ref(minor->dev);
-       spin_unlock_irqrestore(&drm_minor_lock, flags);
-
-       if (!minor) {
-               return ERR_PTR(-ENODEV);
-       } else if (drm_device_is_unplugged(minor->dev)) {
-               drm_dev_unref(minor->dev);
-               return ERR_PTR(-ENODEV);
-       }
-
-       return minor;
-}
-
-/**
- * drm_minor_release - Release DRM minor
- * @minor: Pointer to DRM minor object
- *
- * Release a minor that was previously acquired via drm_minor_acquire().
- */
-void drm_minor_release(struct drm_minor *minor)
-{
-       drm_dev_unref(minor->dev);
-}
-
-/**
- * drm_put_dev - Unregister and release a DRM device
- * @dev: DRM device
- *
- * Called at module unload time or when a PCI device is unplugged.
- *
- * Use of this function is discouraged. It will eventually go away completely.
- * Please use drm_dev_unregister() and drm_dev_unref() explicitly instead.
- *
- * Cleans up all DRM device, calling drm_lastclose().
- */
-void drm_put_dev(struct drm_device *dev)
-{
-       DRM_DEBUG("\n");
-
-       if (!dev) {
-               DRM_ERROR("cleanup called no dev\n");
-               return;
-       }
-
-       drm_dev_unregister(dev);
-       drm_dev_unref(dev);
-}
-EXPORT_SYMBOL(drm_put_dev);
-
-void drm_unplug_dev(struct drm_device *dev)
-{
-       /* for a USB device */
-       drm_minor_unregister(dev, DRM_MINOR_LEGACY);
-       drm_minor_unregister(dev, DRM_MINOR_RENDER);
-       drm_minor_unregister(dev, DRM_MINOR_CONTROL);
-
-       mutex_lock(&drm_global_mutex);
-
-       drm_device_set_unplugged(dev);
-
-       if (dev->open_count == 0) {
-               drm_put_dev(dev);
-       }
-       mutex_unlock(&drm_global_mutex);
-}
-EXPORT_SYMBOL(drm_unplug_dev);
-
-/*
- * DRM internal mount
- * We want to be able to allocate our own "struct address_space" to control
- * memory-mappings in VRAM (or stolen RAM, ...). However, core MM does not allow
- * stand-alone address_space objects, so we need an underlying inode. As there
- * is no way to allocate an independent inode easily, we need a fake internal
- * VFS mount-point.
- *
- * The drm_fs_inode_new() function allocates a new inode, drm_fs_inode_free()
- * frees it again. You are allowed to use iget() and iput() to get references to
- * the inode. But each drm_fs_inode_new() call must be paired with exactly one
- * drm_fs_inode_free() call (which does not have to be the last iput()).
- * We use drm_fs_inode_*() to manage our internal VFS mount-point and share it
- * between multiple inode-users. You could, technically, call
- * iget() + drm_fs_inode_free() directly after alloc and sometime later do an
- * iput(), but this way you'd end up with a new vfsmount for each inode.
- */
-
-static int drm_fs_cnt;
-static struct vfsmount *drm_fs_mnt;
-
-static const struct dentry_operations drm_fs_dops = {
-       .d_dname        = simple_dname,
-};
-
-static const struct super_operations drm_fs_sops = {
-       .statfs         = simple_statfs,
-};
-
-static struct dentry *drm_fs_mount(struct file_system_type *fs_type, int flags,
-                                  const char *dev_name, void *data)
-{
-       return mount_pseudo(fs_type,
-                           "drm:",
-                           &drm_fs_sops,
-                           &drm_fs_dops,
-                           0x010203ff);
-}
-
-static struct file_system_type drm_fs_type = {
-       .name           = "drm",
-       .owner          = THIS_MODULE,
-       .mount          = drm_fs_mount,
-       .kill_sb        = kill_anon_super,
-};
-
-static struct inode *drm_fs_inode_new(void)
-{
-       struct inode *inode;
-       int r;
-
-       r = simple_pin_fs(&drm_fs_type, &drm_fs_mnt, &drm_fs_cnt);
-       if (r < 0) {
-               DRM_ERROR("Cannot mount pseudo fs: %d\n", r);
-               return ERR_PTR(r);
-       }
-
-       inode = alloc_anon_inode(drm_fs_mnt->mnt_sb);
-       if (IS_ERR(inode))
-               simple_release_fs(&drm_fs_mnt, &drm_fs_cnt);
-
-       return inode;
-}
-
-static void drm_fs_inode_free(struct inode *inode)
-{
-       if (inode) {
-               iput(inode);
-               simple_release_fs(&drm_fs_mnt, &drm_fs_cnt);
-       }
-}
-
-/**
- * drm_dev_alloc - Allocate new DRM device
- * @driver: DRM driver to allocate device for
- * @parent: Parent device object
- *
- * Allocate and initialize a new DRM device. No device registration is done.
- * Call drm_dev_register() to advertice the device to user space and register it
- * with other core subsystems.
- *
- * The initial ref-count of the object is 1. Use drm_dev_ref() and
- * drm_dev_unref() to take and drop further ref-counts.
- *
- * RETURNS:
- * Pointer to new DRM device, or NULL if out of memory.
- */
-struct drm_device *drm_dev_alloc(struct drm_driver *driver,
-                                struct device *parent)
-{
-       struct drm_device *dev;
-       int ret;
-
-       dev = kzalloc(sizeof(*dev), GFP_KERNEL);
-       if (!dev)
-               return NULL;
-
-       kref_init(&dev->ref);
-       dev->dev = parent;
-       dev->driver = driver;
-
-       INIT_LIST_HEAD(&dev->filelist);
-       INIT_LIST_HEAD(&dev->ctxlist);
-       INIT_LIST_HEAD(&dev->vmalist);
-       INIT_LIST_HEAD(&dev->maplist);
-       INIT_LIST_HEAD(&dev->vblank_event_list);
-
-       spin_lock_init(&dev->buf_lock);
-       spin_lock_init(&dev->event_lock);
-       mutex_init(&dev->struct_mutex);
-       mutex_init(&dev->ctxlist_mutex);
-       mutex_init(&dev->master_mutex);
-
-       dev->anon_inode = drm_fs_inode_new();
-       if (IS_ERR(dev->anon_inode)) {
-               ret = PTR_ERR(dev->anon_inode);
-               DRM_ERROR("Cannot allocate anonymous inode: %d\n", ret);
-               goto err_free;
-       }
-
-       if (drm_core_check_feature(dev, DRIVER_MODESET)) {
-               ret = drm_minor_alloc(dev, DRM_MINOR_CONTROL);
-               if (ret)
-                       goto err_minors;
-       }
-
-       if (drm_core_check_feature(dev, DRIVER_RENDER) && drm_rnodes) {
-               ret = drm_minor_alloc(dev, DRM_MINOR_RENDER);
-               if (ret)
-                       goto err_minors;
-       }
-
-       ret = drm_minor_alloc(dev, DRM_MINOR_LEGACY);
-       if (ret)
-               goto err_minors;
-
-       if (drm_ht_create(&dev->map_hash, 12))
-               goto err_minors;
-
-       ret = drm_ctxbitmap_init(dev);
-       if (ret) {
-               DRM_ERROR("Cannot allocate memory for context bitmap.\n");
-               goto err_ht;
-       }
-
-       if (driver->driver_features & DRIVER_GEM) {
-               ret = drm_gem_init(dev);
-               if (ret) {
-                       DRM_ERROR("Cannot initialize graphics execution manager (GEM)\n");
-                       goto err_ctxbitmap;
-               }
-       }
-
-       return dev;
-
-err_ctxbitmap:
-       drm_ctxbitmap_cleanup(dev);
-err_ht:
-       drm_ht_remove(&dev->map_hash);
-err_minors:
-       drm_minor_free(dev, DRM_MINOR_LEGACY);
-       drm_minor_free(dev, DRM_MINOR_RENDER);
-       drm_minor_free(dev, DRM_MINOR_CONTROL);
-       drm_fs_inode_free(dev->anon_inode);
-err_free:
-       mutex_destroy(&dev->master_mutex);
-       kfree(dev);
-       return NULL;
-}
-EXPORT_SYMBOL(drm_dev_alloc);
-
-static void drm_dev_release(struct kref *ref)
-{
-       struct drm_device *dev = container_of(ref, struct drm_device, ref);
-
-       if (dev->driver->driver_features & DRIVER_GEM)
-               drm_gem_destroy(dev);
-
-       drm_ctxbitmap_cleanup(dev);
-       drm_ht_remove(&dev->map_hash);
-       drm_fs_inode_free(dev->anon_inode);
-
-       drm_minor_free(dev, DRM_MINOR_LEGACY);
-       drm_minor_free(dev, DRM_MINOR_RENDER);
-       drm_minor_free(dev, DRM_MINOR_CONTROL);
-
-       mutex_destroy(&dev->master_mutex);
-       kfree(dev->unique);
-       kfree(dev);
-}
-
-/**
- * drm_dev_ref - Take reference of a DRM device
- * @dev: device to take reference of or NULL
- *
- * This increases the ref-count of @dev by one. You *must* already own a
- * reference when calling this. Use drm_dev_unref() to drop this reference
- * again.
- *
- * This function never fails. However, this function does not provide *any*
- * guarantee whether the device is alive or running. It only provides a
- * reference to the object and the memory associated with it.
- */
-void drm_dev_ref(struct drm_device *dev)
-{
-       if (dev)
-               kref_get(&dev->ref);
-}
-EXPORT_SYMBOL(drm_dev_ref);
-
-/**
- * drm_dev_unref - Drop reference of a DRM device
- * @dev: device to drop reference of or NULL
- *
- * This decreases the ref-count of @dev by one. The device is destroyed if the
- * ref-count drops to zero.
- */
-void drm_dev_unref(struct drm_device *dev)
-{
-       if (dev)
-               kref_put(&dev->ref, drm_dev_release);
-}
-EXPORT_SYMBOL(drm_dev_unref);
-
-/**
- * drm_dev_register - Register DRM device
- * @dev: Device to register
- * @flags: Flags passed to the driver's .load() function
- *
- * Register the DRM device @dev with the system, advertise device to user-space
- * and start normal device operation. @dev must be allocated via drm_dev_alloc()
- * previously.
- *
- * Never call this twice on any device!
- *
- * RETURNS:
- * 0 on success, negative error code on failure.
- */
-int drm_dev_register(struct drm_device *dev, unsigned long flags)
-{
-       int ret;
-
-       mutex_lock(&drm_global_mutex);
-
-       ret = drm_minor_register(dev, DRM_MINOR_CONTROL);
-       if (ret)
-               goto err_minors;
-
-       ret = drm_minor_register(dev, DRM_MINOR_RENDER);
-       if (ret)
-               goto err_minors;
-
-       ret = drm_minor_register(dev, DRM_MINOR_LEGACY);
-       if (ret)
-               goto err_minors;
-
-       if (dev->driver->load) {
-               ret = dev->driver->load(dev, flags);
-               if (ret)
-                       goto err_minors;
-       }
-
-       /* setup grouping for legacy outputs */
-       if (drm_core_check_feature(dev, DRIVER_MODESET)) {
-               ret = drm_mode_group_init_legacy_group(dev,
-                               &dev->primary->mode_group);
-               if (ret)
-                       goto err_unload;
-       }
-
-       ret = 0;
-       goto out_unlock;
-
-err_unload:
-       if (dev->driver->unload)
-               dev->driver->unload(dev);
-err_minors:
-       drm_minor_unregister(dev, DRM_MINOR_LEGACY);
-       drm_minor_unregister(dev, DRM_MINOR_RENDER);
-       drm_minor_unregister(dev, DRM_MINOR_CONTROL);
-out_unlock:
-       mutex_unlock(&drm_global_mutex);
-       return ret;
-}
-EXPORT_SYMBOL(drm_dev_register);
-
-/**
- * drm_dev_unregister - Unregister DRM device
- * @dev: Device to unregister
- *
- * Unregister the DRM device from the system. This does the reverse of
- * drm_dev_register() but does not deallocate the device. The caller must call
- * drm_dev_unref() to drop their final reference.
- */
-void drm_dev_unregister(struct drm_device *dev)
-{
-       struct drm_map_list *r_list, *list_temp;
-
-       drm_lastclose(dev);
-
-       if (dev->driver->unload)
-               dev->driver->unload(dev);
-
-       if (dev->agp)
-               drm_pci_agp_destroy(dev);
-
-       drm_vblank_cleanup(dev);
-
-       list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head)
-               drm_rmmap(dev, r_list->map);
-
-       drm_minor_unregister(dev, DRM_MINOR_LEGACY);
-       drm_minor_unregister(dev, DRM_MINOR_RENDER);
-       drm_minor_unregister(dev, DRM_MINOR_CONTROL);
-}
-EXPORT_SYMBOL(drm_dev_unregister);
-
-/**
- * drm_dev_set_unique - Set the unique name of a DRM device
- * @dev: device of which to set the unique name
- * @fmt: format string for unique name
- *
- * Sets the unique name of a DRM device using the specified format string and
- * a variable list of arguments. Drivers can use this at driver probe time if
- * the unique name of the devices they drive is static.
- *
- * Return: 0 on success or a negative error code on failure.
- */
-int drm_dev_set_unique(struct drm_device *dev, const char *fmt, ...)
-{
-       va_list ap;
-
-       kfree(dev->unique);
-
-       va_start(ap, fmt);
-       dev->unique = kvasprintf(GFP_KERNEL, fmt, ap);
-       va_end(ap);
-
-       return dev->unique ? 0 : -ENOMEM;
-}
-EXPORT_SYMBOL(drm_dev_set_unique);
index 369b26278e76601b519f19ef82fe771d297ea250..ab1a5f6dde8afd40a58987d4faa2f5f2f54828cb 100644 (file)
@@ -438,7 +438,6 @@ err_out_files:
 out:
        return ret;
 }
-EXPORT_SYMBOL(drm_sysfs_connector_add);
 
 /**
  * drm_sysfs_connector_remove - remove an connector device from sysfs
@@ -468,7 +467,6 @@ void drm_sysfs_connector_remove(struct drm_connector *connector)
        device_unregister(connector->kdev);
        connector->kdev = NULL;
 }
-EXPORT_SYMBOL(drm_sysfs_connector_remove);
 
 /**
  * drm_sysfs_hotplug_event - generate a DRM uevent
@@ -495,71 +493,55 @@ static void drm_sysfs_release(struct device *dev)
 }
 
 /**
- * drm_sysfs_device_add - adds a class device to sysfs for a character driver
- * @dev: DRM device to be added
- * @head: DRM head in question
+ * drm_sysfs_minor_alloc() - Allocate sysfs device for given minor
+ * @minor: minor to allocate sysfs device for
  *
- * Add a DRM device to the DRM's device model class.  We use @dev's PCI device
- * as the parent for the Linux device, and make sure it has a file containing
- * the driver we're using (for userspace compatibility).
+ * This allocates a new sysfs device for @minor and returns it. The device is
+ * not registered nor linked. The caller has to use device_add() and
+ * device_del() to register and unregister it.
+ *
+ * Note that dev_get_drvdata() on the new device will return the minor.
+ * However, the device does not hold a ref-count to the minor nor to the
+ * underlying drm_device. This is unproblematic as long as you access the
+ * private data only in sysfs callbacks. device_del() disables those
+ * synchronously, so they cannot be called after you cleanup a minor.
  */
-int drm_sysfs_device_add(struct drm_minor *minor)
+struct device *drm_sysfs_minor_alloc(struct drm_minor *minor)
 {
-       char *minor_str;
+       const char *minor_str;
+       struct device *kdev;
        int r;
 
        if (minor->type == DRM_MINOR_CONTROL)
                minor_str = "controlD%d";
-        else if (minor->type == DRM_MINOR_RENDER)
-                minor_str = "renderD%d";
-        else
-                minor_str = "card%d";
-
-       minor->kdev = kzalloc(sizeof(*minor->kdev), GFP_KERNEL);
-       if (!minor->kdev) {
-               r = -ENOMEM;
-               goto error;
-       }
-
-       device_initialize(minor->kdev);
-       minor->kdev->devt = MKDEV(DRM_MAJOR, minor->index);
-       minor->kdev->class = drm_class;
-       minor->kdev->type = &drm_sysfs_device_minor;
-       minor->kdev->parent = minor->dev->dev;
-       minor->kdev->release = drm_sysfs_release;
-       dev_set_drvdata(minor->kdev, minor);
-
-       r = dev_set_name(minor->kdev, minor_str, minor->index);
+       else if (minor->type == DRM_MINOR_RENDER)
+               minor_str = "renderD%d";
+       else
+               minor_str = "card%d";
+
+       kdev = kzalloc(sizeof(*kdev), GFP_KERNEL);
+       if (!kdev)
+               return ERR_PTR(-ENOMEM);
+
+       device_initialize(kdev);
+       kdev->devt = MKDEV(DRM_MAJOR, minor->index);
+       kdev->class = drm_class;
+       kdev->type = &drm_sysfs_device_minor;
+       kdev->parent = minor->dev->dev;
+       kdev->release = drm_sysfs_release;
+       dev_set_drvdata(kdev, minor);
+
+       r = dev_set_name(kdev, minor_str, minor->index);
        if (r < 0)
-               goto error;
-
-       r = device_add(minor->kdev);
-       if (r < 0)
-               goto error;
-
-       return 0;
+               goto err_free;
 
-error:
-       DRM_ERROR("device create failed %d\n", r);
-       put_device(minor->kdev);
-       return r;
-}
+       return kdev;
 
-/**
- * drm_sysfs_device_remove - remove DRM device
- * @dev: DRM device to remove
- *
- * This call unregisters and cleans up a class device that was created with a
- * call to drm_sysfs_device_add()
- */
-void drm_sysfs_device_remove(struct drm_minor *minor)
-{
-       if (minor->kdev)
-               device_unregister(minor->kdev);
-       minor->kdev = NULL;
+err_free:
+       put_device(kdev);
+       return ERR_PTR(r);
 }
 
-
 /**
  * drm_class_device_register - Register a struct device in the drm class.
  *
index 178d2a9672a8245020f39f0059f013483a5a5169..7f9f6f9e9b7e79926ab1ed791c6fbef8defb3a02 100644 (file)
@@ -28,6 +28,7 @@ config DRM_EXYNOS_FIMD
        bool "Exynos DRM FIMD"
        depends on DRM_EXYNOS && !FB_S3C
        select FB_MODE_HELPERS
+       select MFD_SYSCON
        help
          Choose this option if you want to use Exynos FIMD for DRM.
 
@@ -52,6 +53,7 @@ config DRM_EXYNOS_DP
        bool "EXYNOS DRM DP driver support"
        depends on DRM_EXYNOS_FIMD && ARCH_EXYNOS && (DRM_PTN3460=n || DRM_PTN3460=y || DRM_PTN3460=DRM_EXYNOS)
        default DRM_EXYNOS
+       select DRM_PANEL
        help
          This enables support for DP device.
 
index a8ffc8c1477b07e2ac4d90936872c0d1694818e7..4f3c7eb2d37d49a5aadc3d27ea401d3dcc430e20 100644 (file)
@@ -16,7 +16,6 @@
 #include <linux/clk.h>
 #include <linux/io.h>
 #include <linux/interrupt.h>
-#include <linux/delay.h>
 #include <linux/of.h>
 #include <linux/of_gpio.h>
 #include <linux/gpio.h>
@@ -28,6 +27,7 @@
 #include <drm/drmP.h>
 #include <drm/drm_crtc.h>
 #include <drm/drm_crtc_helper.h>
+#include <drm/drm_panel.h>
 #include <drm/bridge/ptn3460.h>
 
 #include "exynos_drm_drv.h"
@@ -41,7 +41,7 @@ struct bridge_init {
        struct device_node *node;
 };
 
-static int exynos_dp_init_dp(struct exynos_dp_device *dp)
+static void exynos_dp_init_dp(struct exynos_dp_device *dp)
 {
        exynos_dp_reset(dp);
 
@@ -58,8 +58,6 @@ static int exynos_dp_init_dp(struct exynos_dp_device *dp)
 
        exynos_dp_init_hpd(dp);
        exynos_dp_init_aux(dp);
-
-       return 0;
 }
 
 static int exynos_dp_detect_hpd(struct exynos_dp_device *dp)
@@ -875,10 +873,24 @@ static irqreturn_t exynos_dp_irq_handler(int irq, void *arg)
 static void exynos_dp_hotplug(struct work_struct *work)
 {
        struct exynos_dp_device *dp;
-       int ret;
 
        dp = container_of(work, struct exynos_dp_device, hotplug_work);
 
+       if (dp->drm_dev)
+               drm_helper_hpd_irq_event(dp->drm_dev);
+}
+
+static void exynos_dp_commit(struct exynos_drm_display *display)
+{
+       struct exynos_dp_device *dp = display->ctx;
+       int ret;
+
+       /* Keep the panel disabled while we configure video */
+       if (dp->panel) {
+               if (drm_panel_disable(dp->panel))
+                       DRM_ERROR("failed to disable the panel\n");
+       }
+
        ret = exynos_dp_detect_hpd(dp);
        if (ret) {
                /* Cable has been disconnected, we're done */
@@ -909,6 +921,12 @@ static void exynos_dp_hotplug(struct work_struct *work)
        ret = exynos_dp_config_video(dp);
        if (ret)
                dev_err(dp->dev, "unable to config video\n");
+
+       /* Safe to enable the panel now */
+       if (dp->panel) {
+               if (drm_panel_enable(dp->panel))
+                       DRM_ERROR("failed to enable the panel\n");
+       }
 }
 
 static enum drm_connector_status exynos_dp_detect(
@@ -933,15 +951,18 @@ static int exynos_dp_get_modes(struct drm_connector *connector)
        struct exynos_dp_device *dp = ctx_from_connector(connector);
        struct drm_display_mode *mode;
 
+       if (dp->panel)
+               return drm_panel_get_modes(dp->panel);
+
        mode = drm_mode_create(connector->dev);
        if (!mode) {
                DRM_ERROR("failed to create a new display mode.\n");
                return 0;
        }
 
-       drm_display_mode_from_videomode(&dp->panel.vm, mode);
-       mode->width_mm = dp->panel.width_mm;
-       mode->height_mm = dp->panel.height_mm;
+       drm_display_mode_from_videomode(&dp->priv.vm, mode);
+       mode->width_mm = dp->priv.width_mm;
+       mode->height_mm = dp->priv.height_mm;
        connector->display_info.width_mm = mode->width_mm;
        connector->display_info.height_mm = mode->height_mm;
 
@@ -1018,10 +1039,13 @@ static int exynos_dp_create_connector(struct exynos_drm_display *display,
        }
 
        drm_connector_helper_add(connector, &exynos_dp_connector_helper_funcs);
-       drm_sysfs_connector_add(connector);
+       drm_connector_register(connector);
        drm_mode_connector_attach_encoder(connector, encoder);
 
-       return 0;
+       if (dp->panel)
+               ret = drm_panel_attach(dp->panel, &dp->connector);
+
+       return ret;
 }
 
 static void exynos_dp_phy_init(struct exynos_dp_device *dp)
@@ -1050,26 +1074,50 @@ static void exynos_dp_phy_exit(struct exynos_dp_device *dp)
        }
 }
 
-static void exynos_dp_poweron(struct exynos_dp_device *dp)
+static void exynos_dp_poweron(struct exynos_drm_display *display)
 {
+       struct exynos_dp_device *dp = display->ctx;
+
        if (dp->dpms_mode == DRM_MODE_DPMS_ON)
                return;
 
+       if (dp->panel) {
+               if (drm_panel_prepare(dp->panel)) {
+                       DRM_ERROR("failed to setup the panel\n");
+                       return;
+               }
+       }
+
        clk_prepare_enable(dp->clock);
        exynos_dp_phy_init(dp);
        exynos_dp_init_dp(dp);
        enable_irq(dp->irq);
+       exynos_dp_commit(display);
 }
 
-static void exynos_dp_poweroff(struct exynos_dp_device *dp)
+static void exynos_dp_poweroff(struct exynos_drm_display *display)
 {
+       struct exynos_dp_device *dp = display->ctx;
+
        if (dp->dpms_mode != DRM_MODE_DPMS_ON)
                return;
 
+       if (dp->panel) {
+               if (drm_panel_disable(dp->panel)) {
+                       DRM_ERROR("failed to disable the panel\n");
+                       return;
+               }
+       }
+
        disable_irq(dp->irq);
        flush_work(&dp->hotplug_work);
        exynos_dp_phy_exit(dp);
        clk_disable_unprepare(dp->clock);
+
+       if (dp->panel) {
+               if (drm_panel_unprepare(dp->panel))
+                       DRM_ERROR("failed to turnoff the panel\n");
+       }
 }
 
 static void exynos_dp_dpms(struct exynos_drm_display *display, int mode)
@@ -1078,12 +1126,12 @@ static void exynos_dp_dpms(struct exynos_drm_display *display, int mode)
 
        switch (mode) {
        case DRM_MODE_DPMS_ON:
-               exynos_dp_poweron(dp);
+               exynos_dp_poweron(display);
                break;
        case DRM_MODE_DPMS_STANDBY:
        case DRM_MODE_DPMS_SUSPEND:
        case DRM_MODE_DPMS_OFF:
-               exynos_dp_poweroff(dp);
+               exynos_dp_poweroff(display);
                break;
        default:
                break;
@@ -1094,6 +1142,7 @@ static void exynos_dp_dpms(struct exynos_drm_display *display, int mode)
 static struct exynos_drm_display_ops exynos_dp_display_ops = {
        .create_connector = exynos_dp_create_connector,
        .dpms = exynos_dp_dpms,
+       .commit = exynos_dp_commit,
 };
 
 static struct exynos_drm_display exynos_dp_display = {
@@ -1201,7 +1250,7 @@ static int exynos_dp_dt_parse_panel(struct exynos_dp_device *dp)
 {
        int ret;
 
-       ret = of_get_videomode(dp->dev->of_node, &dp->panel.vm,
+       ret = of_get_videomode(dp->dev->of_node, &dp->priv.vm,
                        OF_USE_NATIVE_MODE);
        if (ret) {
                DRM_ERROR("failed: of_get_videomode() : %d\n", ret);
@@ -1215,16 +1264,10 @@ static int exynos_dp_bind(struct device *dev, struct device *master, void *data)
        struct platform_device *pdev = to_platform_device(dev);
        struct drm_device *drm_dev = data;
        struct resource *res;
-       struct exynos_dp_device *dp;
+       struct exynos_dp_device *dp = exynos_dp_display.ctx;
        unsigned int irq_flags;
-
        int ret = 0;
 
-       dp = devm_kzalloc(&pdev->dev, sizeof(struct exynos_dp_device),
-                               GFP_KERNEL);
-       if (!dp)
-               return -ENOMEM;
-
        dp->dev = &pdev->dev;
        dp->dpms_mode = DRM_MODE_DPMS_OFF;
 
@@ -1236,9 +1279,11 @@ static int exynos_dp_bind(struct device *dev, struct device *master, void *data)
        if (ret)
                return ret;
 
-       ret = exynos_dp_dt_parse_panel(dp);
-       if (ret)
-               return ret;
+       if (!dp->panel) {
+               ret = exynos_dp_dt_parse_panel(dp);
+               if (ret)
+                       return ret;
+       }
 
        dp->clock = devm_clk_get(&pdev->dev, "dp");
        if (IS_ERR(dp->clock)) {
@@ -1298,7 +1343,6 @@ static int exynos_dp_bind(struct device *dev, struct device *master, void *data)
        disable_irq(dp->irq);
 
        dp->drm_dev = drm_dev;
-       exynos_dp_display.ctx = dp;
 
        platform_set_drvdata(pdev, &exynos_dp_display);
 
@@ -1325,6 +1369,9 @@ static const struct component_ops exynos_dp_ops = {
 
 static int exynos_dp_probe(struct platform_device *pdev)
 {
+       struct device *dev = &pdev->dev;
+       struct device_node *panel_node;
+       struct exynos_dp_device *dp;
        int ret;
 
        ret = exynos_drm_component_add(&pdev->dev, EXYNOS_DEVICE_TYPE_CONNECTOR,
@@ -1332,6 +1379,21 @@ static int exynos_dp_probe(struct platform_device *pdev)
        if (ret)
                return ret;
 
+       dp = devm_kzalloc(&pdev->dev, sizeof(struct exynos_dp_device),
+                               GFP_KERNEL);
+       if (!dp)
+               return -ENOMEM;
+
+       panel_node = of_parse_phandle(dev->of_node, "panel", 0);
+       if (panel_node) {
+               dp->panel = of_drm_find_panel(panel_node);
+               of_node_put(panel_node);
+               if (!dp->panel)
+                       return -EPROBE_DEFER;
+       }
+
+       exynos_dp_display.ctx = dp;
+
        ret = component_add(&pdev->dev, &exynos_dp_ops);
        if (ret)
                exynos_drm_component_del(&pdev->dev,
@@ -1376,6 +1438,7 @@ static const struct of_device_id exynos_dp_match[] = {
        { .compatible = "samsung,exynos5-dp" },
        {},
 };
+MODULE_DEVICE_TABLE(of, exynos_dp_match);
 
 struct platform_driver dp_driver = {
        .probe          = exynos_dp_probe,
@@ -1390,4 +1453,4 @@ struct platform_driver dp_driver = {
 
 MODULE_AUTHOR("Jingoo Han <jg1.han@samsung.com>");
 MODULE_DESCRIPTION("Samsung SoC DP Driver");
-MODULE_LICENSE("GPL");
+MODULE_LICENSE("GPL v2");
index 02cc4f9ab9034f1324b2b52ec92fc04713198c0b..a1aee6931bd74afb54928b3b40be150a4dba8483 100644 (file)
@@ -149,6 +149,7 @@ struct exynos_dp_device {
        struct drm_device       *drm_dev;
        struct drm_connector    connector;
        struct drm_encoder      *encoder;
+       struct drm_panel        *panel;
        struct clk              *clock;
        unsigned int            irq;
        void __iomem            *reg_base;
@@ -162,7 +163,7 @@ struct exynos_dp_device {
        int                     dpms_mode;
        int                     hpd_gpio;
 
-       struct exynos_drm_panel_info panel;
+       struct exynos_drm_panel_info priv;
 };
 
 /* exynos_dp_reg.c */
index 9a16dbe121d11e3a24c7f72b6c55ca5db50319fb..ba9b3d5ed6720855faf02bf21f8cd3173095ea5f 100644 (file)
@@ -117,20 +117,7 @@ static struct drm_encoder *exynos_drm_best_encoder(
        struct drm_device *dev = connector->dev;
        struct exynos_drm_connector *exynos_connector =
                                        to_exynos_connector(connector);
-       struct drm_mode_object *obj;
-       struct drm_encoder *encoder;
-
-       obj = drm_mode_object_find(dev, exynos_connector->encoder_id,
-                                  DRM_MODE_OBJECT_ENCODER);
-       if (!obj) {
-               DRM_DEBUG_KMS("Unknown ENCODER ID %d\n",
-                               exynos_connector->encoder_id);
-               return NULL;
-       }
-
-       encoder = obj_to_encoder(obj);
-
-       return encoder;
+       return drm_encoder_find(dev, exynos_connector->encoder_id);
 }
 
 static struct drm_connector_helper_funcs exynos_connector_helper_funcs = {
@@ -185,7 +172,7 @@ static void exynos_drm_connector_destroy(struct drm_connector *connector)
        struct exynos_drm_connector *exynos_connector =
                to_exynos_connector(connector);
 
-       drm_sysfs_connector_remove(connector);
+       drm_connector_unregister(connector);
        drm_connector_cleanup(connector);
        kfree(exynos_connector);
 }
@@ -230,7 +217,7 @@ struct drm_connector *exynos_drm_connector_create(struct drm_device *dev,
        drm_connector_init(dev, connector, &exynos_connector_funcs, type);
        drm_connector_helper_add(connector, &exynos_connector_helper_funcs);
 
-       err = drm_sysfs_connector_add(connector);
+       err = drm_connector_register(connector);
        if (err)
                goto err_connector;
 
@@ -250,7 +237,7 @@ struct drm_connector *exynos_drm_connector_create(struct drm_device *dev,
        return connector;
 
 err_sysfs:
-       drm_sysfs_connector_remove(connector);
+       drm_connector_unregister(connector);
 err_connector:
        drm_connector_cleanup(connector);
        kfree(exynos_connector);
index 95c9435d02668213921ba9a0cf98441ec8bd5628..b68e58f78cd12f15c639b443c62a3f94431dd093 100644 (file)
@@ -69,8 +69,10 @@ static void exynos_drm_crtc_dpms(struct drm_crtc *crtc, int mode)
 
        if (mode > DRM_MODE_DPMS_ON) {
                /* wait for the completion of page flip. */
-               wait_event(exynos_crtc->pending_flip_queue,
-                               atomic_read(&exynos_crtc->pending_flip) == 0);
+               if (!wait_event_timeout(exynos_crtc->pending_flip_queue,
+                               !atomic_read(&exynos_crtc->pending_flip),
+                               HZ/20))
+                       atomic_set(&exynos_crtc->pending_flip, 0);
                drm_vblank_off(crtc->dev, exynos_crtc->pipe);
        }
 
@@ -259,6 +261,7 @@ static int exynos_drm_crtc_page_flip(struct drm_crtc *crtc,
                        spin_lock_irq(&dev->event_lock);
                        drm_vblank_put(dev, exynos_crtc->pipe);
                        list_del(&event->base.link);
+                       atomic_set(&exynos_crtc->pending_flip, 0);
                        spin_unlock_irq(&dev->event_lock);
 
                        goto out;
@@ -508,3 +511,11 @@ int exynos_drm_crtc_get_pipe_from_type(struct drm_device *drm_dev,
 
        return -EPERM;
 }
+
+void exynos_drm_crtc_te_handler(struct drm_crtc *crtc)
+{
+       struct exynos_drm_manager *manager = to_exynos_crtc(crtc)->manager;
+
+       if (manager->ops->te_handler)
+               manager->ops->te_handler(manager);
+}
index 9f74b10a8a01de0fcadc9990a30fa2193cdb51d6..690dcddab725658528aa3936298204db206c317c 100644 (file)
@@ -36,4 +36,11 @@ void exynos_drm_crtc_plane_disable(struct drm_crtc *crtc, int zpos);
 int exynos_drm_crtc_get_pipe_from_type(struct drm_device *drm_dev,
                                        unsigned int out_type);
 
+/*
+ * This function calls the crtc device(manager)'s te_handler() callback
+ * to trigger to transfer video image at the tearing effect synchronization
+ * signal.
+ */
+void exynos_drm_crtc_te_handler(struct drm_crtc *crtc);
+
 #endif
index 9e530f205ad2244f13fdea07e6ec1b322f94550a..fa08f05e3e340be433fd399127bdd821d3b198df 100644 (file)
@@ -48,7 +48,7 @@ exynos_dpi_detect(struct drm_connector *connector, bool force)
 
 static void exynos_dpi_connector_destroy(struct drm_connector *connector)
 {
-       drm_sysfs_connector_remove(connector);
+       drm_connector_unregister(connector);
        drm_connector_cleanup(connector);
 }
 
@@ -117,7 +117,7 @@ static int exynos_dpi_create_connector(struct exynos_drm_display *display,
        }
 
        drm_connector_helper_add(connector, &exynos_dpi_connector_helper_funcs);
-       drm_sysfs_connector_add(connector);
+       drm_connector_register(connector);
        drm_mode_connector_attach_encoder(connector, encoder);
 
        return 0;
@@ -125,14 +125,18 @@ static int exynos_dpi_create_connector(struct exynos_drm_display *display,
 
 static void exynos_dpi_poweron(struct exynos_dpi *ctx)
 {
-       if (ctx->panel)
+       if (ctx->panel) {
+               drm_panel_prepare(ctx->panel);
                drm_panel_enable(ctx->panel);
+       }
 }
 
 static void exynos_dpi_poweroff(struct exynos_dpi *ctx)
 {
-       if (ctx->panel)
+       if (ctx->panel) {
                drm_panel_disable(ctx->panel);
+               drm_panel_unprepare(ctx->panel);
+       }
 }
 
 static void exynos_dpi_dpms(struct exynos_drm_display *display, int mode)
index ab7d182063c3aef8699e0d3322cd9af5dbeeaacd..0d74e9b99c4ec672aa413bf6489cbb3a17898832 100644 (file)
@@ -39,8 +39,6 @@
 #define DRIVER_MAJOR   1
 #define DRIVER_MINOR   0
 
-#define VBLANK_OFF_DELAY       50000
-
 static struct platform_device *exynos_drm_pdev;
 
 static DEFINE_MUTEX(drm_component_lock);
@@ -103,8 +101,6 @@ static int exynos_drm_load(struct drm_device *dev, unsigned long flags)
        /* setup possible_clones. */
        exynos_drm_encoder_setup(dev);
 
-       drm_vblank_offdelay = VBLANK_OFF_DELAY;
-
        platform_set_drvdata(dev->platformdev, dev);
 
        /* Try to bind all sub drivers. */
@@ -362,7 +358,7 @@ static int exynos_drm_sys_suspend(struct device *dev)
        struct drm_device *drm_dev = dev_get_drvdata(dev);
        pm_message_t message;
 
-       if (pm_runtime_suspended(dev))
+       if (pm_runtime_suspended(dev) || !drm_dev)
                return 0;
 
        message.event = PM_EVENT_SUSPEND;
@@ -373,7 +369,7 @@ static int exynos_drm_sys_resume(struct device *dev)
 {
        struct drm_device *drm_dev = dev_get_drvdata(dev);
 
-       if (pm_runtime_suspended(dev))
+       if (pm_runtime_suspended(dev) || !drm_dev)
                return 0;
 
        return exynos_drm_resume(drm_dev);
index 06cde4506278504fa3cbca2d1bb4ddc91abb5c77..69a6fa397d75b604174810f71a5aa0304789ac9b 100644 (file)
@@ -40,8 +40,6 @@ struct drm_device;
 struct exynos_drm_overlay;
 struct drm_connector;
 
-extern unsigned int drm_vblank_offdelay;
-
 /* This enumerates device type. */
 enum exynos_drm_device_type {
        EXYNOS_DEVICE_TYPE_NONE,
@@ -188,6 +186,8 @@ struct exynos_drm_display {
  * @win_commit: apply hardware specific overlay data to registers.
  * @win_enable: enable hardware specific overlay.
  * @win_disable: disable hardware specific overlay.
+ * @te_handler: trigger to transfer video image at the tearing effect
+ *     synchronization signal if there is a page flip request.
  */
 struct exynos_drm_manager;
 struct exynos_drm_manager_ops {
@@ -206,6 +206,7 @@ struct exynos_drm_manager_ops {
        void (*win_commit)(struct exynos_drm_manager *mgr, int zpos);
        void (*win_enable)(struct exynos_drm_manager *mgr, int zpos);
        void (*win_disable)(struct exynos_drm_manager *mgr, int zpos);
+       void (*te_handler)(struct exynos_drm_manager *mgr);
 };
 
 /*
@@ -236,14 +237,9 @@ struct exynos_drm_g2d_private {
        struct list_head        userptr_list;
 };
 
-struct exynos_drm_ipp_private {
-       struct device   *dev;
-       struct list_head        event_list;
-};
-
 struct drm_exynos_file_private {
        struct exynos_drm_g2d_private   *g2d_priv;
-       struct exynos_drm_ipp_private   *ipp_priv;
+       struct device                   *ipp_dev;
        struct file                     *anon_filp;
 };
 
index 6302aa64f6c1e328bb315a8ccd70e07e3489d17a..442aa2d0013217b500ebddad0ef63429f6dd1e00 100644 (file)
 #include <drm/drm_panel.h>
 
 #include <linux/clk.h>
+#include <linux/gpio/consumer.h>
 #include <linux/irq.h>
+#include <linux/of_device.h>
+#include <linux/of_gpio.h>
 #include <linux/phy/phy.h>
 #include <linux/regulator/consumer.h>
 #include <linux/component.h>
@@ -24,6 +27,7 @@
 #include <video/mipi_display.h>
 #include <video/videomode.h>
 
+#include "exynos_drm_crtc.h"
 #include "exynos_drm_drv.h"
 
 /* returns true iff both arguments logically differs */
 
 /* FIFO memory AC characteristic register */
 #define DSIM_PLLCTRL_REG       0x4c    /* PLL control register */
-#define DSIM_PLLTMR_REG                0x50    /* PLL timer register */
 #define DSIM_PHYACCHR_REG      0x54    /* D-PHY AC characteristic register */
 #define DSIM_PHYACCHR1_REG     0x58    /* D-PHY AC characteristic register1 */
+#define DSIM_PHYCTRL_REG       0x5c
+#define DSIM_PHYTIMING_REG     0x64
+#define DSIM_PHYTIMING1_REG    0x68
+#define DSIM_PHYTIMING2_REG    0x6c
 
 /* DSIM_STATUS */
 #define DSIM_STOP_STATE_DAT(x)         (((x) & 0xf) << 0)
 #define DSIM_PLL_M(x)                  ((x) << 4)
 #define DSIM_PLL_S(x)                  ((x) << 1)
 
+/* DSIM_PHYCTRL */
+#define DSIM_PHYCTRL_ULPS_EXIT(x)      (((x) & 0x1ff) << 0)
+
+/* DSIM_PHYTIMING */
+#define DSIM_PHYTIMING_LPX(x)          ((x) << 8)
+#define DSIM_PHYTIMING_HS_EXIT(x)      ((x) << 0)
+
+/* DSIM_PHYTIMING1 */
+#define DSIM_PHYTIMING1_CLK_PREPARE(x) ((x) << 24)
+#define DSIM_PHYTIMING1_CLK_ZERO(x)    ((x) << 16)
+#define DSIM_PHYTIMING1_CLK_POST(x)    ((x) << 8)
+#define DSIM_PHYTIMING1_CLK_TRAIL(x)   ((x) << 0)
+
+/* DSIM_PHYTIMING2 */
+#define DSIM_PHYTIMING2_HS_PREPARE(x)  ((x) << 16)
+#define DSIM_PHYTIMING2_HS_ZERO(x)     ((x) << 8)
+#define DSIM_PHYTIMING2_HS_TRAIL(x)    ((x) << 0)
+
 #define DSI_MAX_BUS_WIDTH              4
 #define DSI_NUM_VIRTUAL_CHANNELS       4
 #define DSI_TX_FIFO_SIZE               2048
@@ -233,6 +258,12 @@ struct exynos_dsi_transfer {
 #define DSIM_STATE_INITIALIZED         BIT(1)
 #define DSIM_STATE_CMD_LPM             BIT(2)
 
+struct exynos_dsi_driver_data {
+       unsigned int plltmr_reg;
+
+       unsigned int has_freqband:1;
+};
+
 struct exynos_dsi {
        struct mipi_dsi_host dsi_host;
        struct drm_connector connector;
@@ -247,6 +278,7 @@ struct exynos_dsi {
        struct clk *bus_clk;
        struct regulator_bulk_data supplies[2];
        int irq;
+       int te_gpio;
 
        u32 pll_clk_rate;
        u32 burst_clk_rate;
@@ -262,11 +294,39 @@ struct exynos_dsi {
 
        spinlock_t transfer_lock; /* protects transfer_list */
        struct list_head transfer_list;
+
+       struct exynos_dsi_driver_data *driver_data;
 };
 
 #define host_to_dsi(host) container_of(host, struct exynos_dsi, dsi_host)
 #define connector_to_dsi(c) container_of(c, struct exynos_dsi, connector)
 
+static struct exynos_dsi_driver_data exynos4_dsi_driver_data = {
+       .plltmr_reg = 0x50,
+       .has_freqband = 1,
+};
+
+static struct exynos_dsi_driver_data exynos5_dsi_driver_data = {
+       .plltmr_reg = 0x58,
+};
+
+static struct of_device_id exynos_dsi_of_match[] = {
+       { .compatible = "samsung,exynos4210-mipi-dsi",
+         .data = &exynos4_dsi_driver_data },
+       { .compatible = "samsung,exynos5410-mipi-dsi",
+         .data = &exynos5_dsi_driver_data },
+       { }
+};
+
+static inline struct exynos_dsi_driver_data *exynos_dsi_get_driver_data(
+                                               struct platform_device *pdev)
+{
+       const struct of_device_id *of_id =
+                       of_match_device(exynos_dsi_of_match, &pdev->dev);
+
+       return (struct exynos_dsi_driver_data *)of_id->data;
+}
+
 static void exynos_dsi_wait_for_reset(struct exynos_dsi *dsi)
 {
        if (wait_for_completion_timeout(&dsi->completed, msecs_to_jiffies(300)))
@@ -340,14 +400,9 @@ static unsigned long exynos_dsi_pll_find_pms(struct exynos_dsi *dsi,
 static unsigned long exynos_dsi_set_pll(struct exynos_dsi *dsi,
                                        unsigned long freq)
 {
-       static const unsigned long freq_bands[] = {
-               100 * MHZ, 120 * MHZ, 160 * MHZ, 200 * MHZ,
-               270 * MHZ, 320 * MHZ, 390 * MHZ, 450 * MHZ,
-               510 * MHZ, 560 * MHZ, 640 * MHZ, 690 * MHZ,
-               770 * MHZ, 870 * MHZ, 950 * MHZ,
-       };
+       struct exynos_dsi_driver_data *driver_data = dsi->driver_data;
        unsigned long fin, fout;
-       int timeout, band;
+       int timeout;
        u8 p, s;
        u16 m;
        u32 reg;
@@ -368,18 +423,30 @@ static unsigned long exynos_dsi_set_pll(struct exynos_dsi *dsi,
                        "failed to find PLL PMS for requested frequency\n");
                return -EFAULT;
        }
+       dev_dbg(dsi->dev, "PLL freq %lu, (p %d, m %d, s %d)\n", fout, p, m, s);
 
-       for (band = 0; band < ARRAY_SIZE(freq_bands); ++band)
-               if (fout < freq_bands[band])
-                       break;
+       writel(500, dsi->reg_base + driver_data->plltmr_reg);
+
+       reg = DSIM_PLL_EN | DSIM_PLL_P(p) | DSIM_PLL_M(m) | DSIM_PLL_S(s);
 
-       dev_dbg(dsi->dev, "PLL freq %lu, (p %d, m %d, s %d), band %d\n", fout,
-               p, m, s, band);
+       if (driver_data->has_freqband) {
+               static const unsigned long freq_bands[] = {
+                       100 * MHZ, 120 * MHZ, 160 * MHZ, 200 * MHZ,
+                       270 * MHZ, 320 * MHZ, 390 * MHZ, 450 * MHZ,
+                       510 * MHZ, 560 * MHZ, 640 * MHZ, 690 * MHZ,
+                       770 * MHZ, 870 * MHZ, 950 * MHZ,
+               };
+               int band;
 
-       writel(500, dsi->reg_base + DSIM_PLLTMR_REG);
+               for (band = 0; band < ARRAY_SIZE(freq_bands); ++band)
+                       if (fout < freq_bands[band])
+                               break;
+
+               dev_dbg(dsi->dev, "band %d\n", band);
+
+               reg |= DSIM_FREQ_BAND(band);
+       }
 
-       reg = DSIM_FREQ_BAND(band) | DSIM_PLL_EN
-                       | DSIM_PLL_P(p) | DSIM_PLL_M(m) | DSIM_PLL_S(s);
        writel(reg, dsi->reg_base + DSIM_PLLCTRL_REG);
 
        timeout = 1000;
@@ -433,6 +500,59 @@ static int exynos_dsi_enable_clock(struct exynos_dsi *dsi)
        return 0;
 }
 
+static void exynos_dsi_set_phy_ctrl(struct exynos_dsi *dsi)
+{
+       struct exynos_dsi_driver_data *driver_data = dsi->driver_data;
+       u32 reg;
+
+       if (driver_data->has_freqband)
+               return;
+
+       /* B D-PHY: D-PHY Master & Slave Analog Block control */
+       reg = DSIM_PHYCTRL_ULPS_EXIT(0x0af);
+       writel(reg, dsi->reg_base + DSIM_PHYCTRL_REG);
+
+       /*
+        * T LPX: Transmitted length of any Low-Power state period
+        * T HS-EXIT: Time that the transmitter drives LP-11 following a HS
+        *      burst
+        */
+       reg = DSIM_PHYTIMING_LPX(0x06) | DSIM_PHYTIMING_HS_EXIT(0x0b);
+       writel(reg, dsi->reg_base + DSIM_PHYTIMING_REG);
+
+       /*
+        * T CLK-PREPARE: Time that the transmitter drives the Clock Lane LP-00
+        *      Line state immediately before the HS-0 Line state starting the
+        *      HS transmission
+        * T CLK-ZERO: Time that the transmitter drives the HS-0 state prior to
+        *      transmitting the Clock.
+        * T CLK_POST: Time that the transmitter continues to send HS clock
+        *      after the last associated Data Lane has transitioned to LP Mode
+        *      Interval is defined as the period from the end of T HS-TRAIL to
+        *      the beginning of T CLK-TRAIL
+        * T CLK-TRAIL: Time that the transmitter drives the HS-0 state after
+        *      the last payload clock bit of a HS transmission burst
+        */
+       reg = DSIM_PHYTIMING1_CLK_PREPARE(0x07) |
+                       DSIM_PHYTIMING1_CLK_ZERO(0x27) |
+                       DSIM_PHYTIMING1_CLK_POST(0x0d) |
+                       DSIM_PHYTIMING1_CLK_TRAIL(0x08);
+       writel(reg, dsi->reg_base + DSIM_PHYTIMING1_REG);
+
+       /*
+        * T HS-PREPARE: Time that the transmitter drives the Data Lane LP-00
+        *      Line state immediately before the HS-0 Line state starting the
+        *      HS transmission
+        * T HS-ZERO: Time that the transmitter drives the HS-0 state prior to
+        *      transmitting the Sync sequence.
+        * T HS-TRAIL: Time that the transmitter drives the flipped differential
+        *      state after last payload data bit of a HS transmission burst
+        */
+       reg = DSIM_PHYTIMING2_HS_PREPARE(0x09) | DSIM_PHYTIMING2_HS_ZERO(0x0d) |
+                       DSIM_PHYTIMING2_HS_TRAIL(0x0b);
+       writel(reg, dsi->reg_base + DSIM_PHYTIMING2_REG);
+}
+
 static void exynos_dsi_disable_clock(struct exynos_dsi *dsi)
 {
        u32 reg;
@@ -468,13 +588,20 @@ static int exynos_dsi_init_link(struct exynos_dsi *dsi)
        /* DSI configuration */
        reg = 0;
 
+       /*
+        * The first bit of mode_flags specifies display configuration.
+        * If this bit is set[= MIPI_DSI_MODE_VIDEO], dsi will support video
+        * mode, otherwise it will support command mode.
+        */
        if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO) {
                reg |= DSIM_VIDEO_MODE;
 
+               /*
+                * The user manual describes that following bits are ignored in
+                * command mode.
+                */
                if (!(dsi->mode_flags & MIPI_DSI_MODE_VSYNC_FLUSH))
                        reg |= DSIM_MFLUSH_VS;
-               if (!(dsi->mode_flags & MIPI_DSI_MODE_EOT_PACKET))
-                       reg |= DSIM_EOT_DISABLE;
                if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE)
                        reg |= DSIM_SYNC_INFORM;
                if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_BURST)
@@ -491,6 +618,9 @@ static int exynos_dsi_init_link(struct exynos_dsi *dsi)
                        reg |= DSIM_HSA_MODE;
        }
 
+       if (!(dsi->mode_flags & MIPI_DSI_MODE_EOT_PACKET))
+               reg |= DSIM_EOT_DISABLE;
+
        switch (dsi->format) {
        case MIPI_DSI_FMT_RGB888:
                reg |= DSIM_MAIN_PIX_FORMAT_RGB888;
@@ -944,17 +1074,90 @@ static irqreturn_t exynos_dsi_irq(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
+static irqreturn_t exynos_dsi_te_irq_handler(int irq, void *dev_id)
+{
+       struct exynos_dsi *dsi = (struct exynos_dsi *)dev_id;
+       struct drm_encoder *encoder = dsi->encoder;
+
+       if (dsi->state & DSIM_STATE_ENABLED)
+               exynos_drm_crtc_te_handler(encoder->crtc);
+
+       return IRQ_HANDLED;
+}
+
+static void exynos_dsi_enable_irq(struct exynos_dsi *dsi)
+{
+       enable_irq(dsi->irq);
+
+       if (gpio_is_valid(dsi->te_gpio))
+               enable_irq(gpio_to_irq(dsi->te_gpio));
+}
+
+static void exynos_dsi_disable_irq(struct exynos_dsi *dsi)
+{
+       if (gpio_is_valid(dsi->te_gpio))
+               disable_irq(gpio_to_irq(dsi->te_gpio));
+
+       disable_irq(dsi->irq);
+}
+
 static int exynos_dsi_init(struct exynos_dsi *dsi)
 {
-       exynos_dsi_enable_clock(dsi);
        exynos_dsi_reset(dsi);
-       enable_irq(dsi->irq);
+       exynos_dsi_enable_irq(dsi);
+       exynos_dsi_enable_clock(dsi);
        exynos_dsi_wait_for_reset(dsi);
+       exynos_dsi_set_phy_ctrl(dsi);
        exynos_dsi_init_link(dsi);
 
        return 0;
 }
 
+static int exynos_dsi_register_te_irq(struct exynos_dsi *dsi)
+{
+       int ret;
+
+       dsi->te_gpio = of_get_named_gpio(dsi->panel_node, "te-gpios", 0);
+       if (!gpio_is_valid(dsi->te_gpio)) {
+               dev_err(dsi->dev, "no te-gpios specified\n");
+               ret = dsi->te_gpio;
+               goto out;
+       }
+
+       ret = gpio_request_one(dsi->te_gpio, GPIOF_IN, "te_gpio");
+       if (ret) {
+               dev_err(dsi->dev, "gpio request failed with %d\n", ret);
+               goto out;
+       }
+
+       /*
+        * This TE GPIO IRQ should not be set to IRQ_NOAUTOEN, because panel
+        * calls drm_panel_init() first then calls mipi_dsi_attach() in probe().
+        * It means that te_gpio is invalid when exynos_dsi_enable_irq() is
+        * called by drm_panel_init() before panel is attached.
+        */
+       ret = request_threaded_irq(gpio_to_irq(dsi->te_gpio),
+                                       exynos_dsi_te_irq_handler, NULL,
+                                       IRQF_TRIGGER_RISING, "TE", dsi);
+       if (ret) {
+               dev_err(dsi->dev, "request interrupt failed with %d\n", ret);
+               gpio_free(dsi->te_gpio);
+               goto out;
+       }
+
+out:
+       return ret;
+}
+
+static void exynos_dsi_unregister_te_irq(struct exynos_dsi *dsi)
+{
+       if (gpio_is_valid(dsi->te_gpio)) {
+               free_irq(gpio_to_irq(dsi->te_gpio), dsi);
+               gpio_free(dsi->te_gpio);
+               dsi->te_gpio = -ENOENT;
+       }
+}
+
 static int exynos_dsi_host_attach(struct mipi_dsi_host *host,
                                  struct mipi_dsi_device *device)
 {
@@ -968,6 +1171,19 @@ static int exynos_dsi_host_attach(struct mipi_dsi_host *host,
        if (dsi->connector.dev)
                drm_helper_hpd_irq_event(dsi->connector.dev);
 
+       /*
+        * This is a temporary solution and should be made by more generic way.
+        *
+        * If attached panel device is for command mode one, dsi should register
+        * TE interrupt handler.
+        */
+       if (!(dsi->mode_flags & MIPI_DSI_MODE_VIDEO)) {
+               int ret = exynos_dsi_register_te_irq(dsi);
+
+               if (ret)
+                       return ret;
+       }
+
        return 0;
 }
 
@@ -976,6 +1192,8 @@ static int exynos_dsi_host_detach(struct mipi_dsi_host *host,
 {
        struct exynos_dsi *dsi = host_to_dsi(host);
 
+       exynos_dsi_unregister_te_irq(dsi);
+
        dsi->panel_node = NULL;
 
        if (dsi->connector.dev)
@@ -1089,7 +1307,7 @@ static void exynos_dsi_poweroff(struct exynos_dsi *dsi)
 
                exynos_dsi_disable_clock(dsi);
 
-               disable_irq(dsi->irq);
+               exynos_dsi_disable_irq(dsi);
        }
 
        dsi->state &= ~DSIM_STATE_CMD_LPM;
@@ -1115,7 +1333,7 @@ static int exynos_dsi_enable(struct exynos_dsi *dsi)
        if (ret < 0)
                return ret;
 
-       ret = drm_panel_enable(dsi->panel);
+       ret = drm_panel_prepare(dsi->panel);
        if (ret < 0) {
                exynos_dsi_poweroff(dsi);
                return ret;
@@ -1124,6 +1342,14 @@ static int exynos_dsi_enable(struct exynos_dsi *dsi)
        exynos_dsi_set_display_mode(dsi);
        exynos_dsi_set_display_enable(dsi, true);
 
+       ret = drm_panel_enable(dsi->panel);
+       if (ret < 0) {
+               exynos_dsi_set_display_enable(dsi, false);
+               drm_panel_unprepare(dsi->panel);
+               exynos_dsi_poweroff(dsi);
+               return ret;
+       }
+
        dsi->state |= DSIM_STATE_ENABLED;
 
        return 0;
@@ -1134,8 +1360,9 @@ static void exynos_dsi_disable(struct exynos_dsi *dsi)
        if (!(dsi->state & DSIM_STATE_ENABLED))
                return;
 
-       exynos_dsi_set_display_enable(dsi, false);
        drm_panel_disable(dsi->panel);
+       exynos_dsi_set_display_enable(dsi, false);
+       drm_panel_unprepare(dsi->panel);
        exynos_dsi_poweroff(dsi);
 
        dsi->state &= ~DSIM_STATE_ENABLED;
@@ -1246,7 +1473,7 @@ static int exynos_dsi_create_connector(struct exynos_drm_display *display,
        }
 
        drm_connector_helper_add(connector, &exynos_dsi_connector_helper_funcs);
-       drm_sysfs_connector_add(connector);
+       drm_connector_register(connector);
        drm_mode_connector_attach_encoder(connector, encoder);
 
        return 0;
@@ -1278,6 +1505,7 @@ static struct exynos_drm_display exynos_dsi_display = {
        .type = EXYNOS_DISPLAY_TYPE_LCD,
        .ops = &exynos_dsi_display_ops,
 };
+MODULE_DEVICE_TABLE(of, exynos_dsi_of_match);
 
 /* of_* functions will be removed after merge of of_graph patches */
 static struct device_node *
@@ -1435,6 +1663,9 @@ static int exynos_dsi_probe(struct platform_device *pdev)
                goto err_del_component;
        }
 
+       /* To be checked as invalid one */
+       dsi->te_gpio = -ENOENT;
+
        init_completion(&dsi->completed);
        spin_lock_init(&dsi->transfer_lock);
        INIT_LIST_HEAD(&dsi->transfer_list);
@@ -1443,6 +1674,7 @@ static int exynos_dsi_probe(struct platform_device *pdev)
        dsi->dsi_host.dev = &pdev->dev;
 
        dsi->dev = &pdev->dev;
+       dsi->driver_data = exynos_dsi_get_driver_data(pdev);
 
        ret = exynos_dsi_parse_dt(dsi);
        if (ret)
@@ -1525,11 +1757,6 @@ static int exynos_dsi_remove(struct platform_device *pdev)
        return 0;
 }
 
-static struct of_device_id exynos_dsi_of_match[] = {
-       { .compatible = "samsung,exynos4210-mipi-dsi" },
-       { }
-};
-
 struct platform_driver dsi_driver = {
        .probe = exynos_dsi_probe,
        .remove = exynos_dsi_remove,
index d771b467cf0c03c70446f58bc68d3029dd5f6305..32e63f60e1d15a14deef0d11365201e2476e5d3c 100644 (file)
@@ -225,7 +225,7 @@ out:
        return ret;
 }
 
-static struct drm_fb_helper_funcs exynos_drm_fb_helper_funcs = {
+static const struct drm_fb_helper_funcs exynos_drm_fb_helper_funcs = {
        .fb_probe =     exynos_drm_fbdev_create,
 };
 
@@ -266,7 +266,8 @@ int exynos_drm_fbdev_init(struct drm_device *dev)
                return -ENOMEM;
 
        private->fb_helper = helper = &fbdev->drm_fb_helper;
-       helper->funcs = &exynos_drm_fb_helper_funcs;
+
+       drm_fb_helper_prepare(dev, helper, &exynos_drm_fb_helper_funcs);
 
        num_crtc = dev->mode_config.num_crtc;
 
index 831dde9034c6270436946e59bb4a6a3b1adb3008..ec7cc9ea50df692db90293319a3f8fe2465d5107 100644 (file)
@@ -1887,6 +1887,7 @@ static const struct of_device_id fimc_of_match[] = {
        { .compatible = "samsung,exynos4212-fimc" },
        { },
 };
+MODULE_DEVICE_TABLE(of, fimc_of_match);
 
 struct platform_driver fimc_driver = {
        .probe          = fimc_probe,
index 33161ad382016bac8ad5a6515432c935cd102583..5d09e33fef8716084a169bee2afb63e429187b48 100644 (file)
@@ -20,6 +20,8 @@
 #include <linux/of_device.h>
 #include <linux/pm_runtime.h>
 #include <linux/component.h>
+#include <linux/mfd/syscon.h>
+#include <linux/regmap.h>
 
 #include <video/of_display_timing.h>
 #include <video/of_videomode.h>
 /* color key value register for hardware window 1 ~ 4. */
 #define WKEYCON1_BASE(x)               ((WKEYCON1 + 0x140) + ((x - 1) * 8))
 
+/* I80 / RGB trigger control register */
+#define TRIGCON                                0x1A4
+#define TRGMODE_I80_RGB_ENABLE_I80     (1 << 0)
+#define SWTRGCMD_I80_RGB_ENABLE                (1 << 1)
+
+/* display mode change control register except exynos4 */
+#define VIDOUT_CON                     0x000
+#define VIDOUT_CON_F_I80_LDI0          (0x2 << 8)
+
+/* I80 interface control for main LDI register */
+#define I80IFCONFAx(x)                 (0x1B0 + (x) * 4)
+#define I80IFCONFBx(x)                 (0x1B8 + (x) * 4)
+#define LCD_CS_SETUP(x)                        ((x) << 16)
+#define LCD_WR_SETUP(x)                        ((x) << 12)
+#define LCD_WR_ACTIVE(x)               ((x) << 8)
+#define LCD_WR_HOLD(x)                 ((x) << 4)
+#define I80IFEN_ENABLE                 (1 << 0)
+
 /* FIMD has totally five hardware windows. */
 #define WINDOWS_NR     5
 
 
 struct fimd_driver_data {
        unsigned int timing_base;
+       unsigned int lcdblk_offset;
+       unsigned int lcdblk_vt_shift;
+       unsigned int lcdblk_bypass_shift;
 
        unsigned int has_shadowcon:1;
        unsigned int has_clksel:1;
        unsigned int has_limited_fmt:1;
+       unsigned int has_vidoutcon:1;
 };
 
 static struct fimd_driver_data s3c64xx_fimd_driver_data = {
@@ -82,12 +106,19 @@ static struct fimd_driver_data s3c64xx_fimd_driver_data = {
 
 static struct fimd_driver_data exynos4_fimd_driver_data = {
        .timing_base = 0x0,
+       .lcdblk_offset = 0x210,
+       .lcdblk_vt_shift = 10,
+       .lcdblk_bypass_shift = 1,
        .has_shadowcon = 1,
 };
 
 static struct fimd_driver_data exynos5_fimd_driver_data = {
        .timing_base = 0x20000,
+       .lcdblk_offset = 0x214,
+       .lcdblk_vt_shift = 24,
+       .lcdblk_bypass_shift = 15,
        .has_shadowcon = 1,
+       .has_vidoutcon = 1,
 };
 
 struct fimd_win_data {
@@ -112,15 +143,22 @@ struct fimd_context {
        struct clk                      *bus_clk;
        struct clk                      *lcd_clk;
        void __iomem                    *regs;
+       struct regmap                   *sysreg;
        struct drm_display_mode         mode;
        struct fimd_win_data            win_data[WINDOWS_NR];
        unsigned int                    default_win;
        unsigned long                   irq_flags;
+       u32                             vidcon0;
        u32                             vidcon1;
+       u32                             vidout_con;
+       u32                             i80ifcon;
+       bool                            i80_if;
        bool                            suspended;
        int                             pipe;
        wait_queue_head_t               wait_vsync_queue;
        atomic_t                        wait_vsync_event;
+       atomic_t                        win_updated;
+       atomic_t                        triggering;
 
        struct exynos_drm_panel_info panel;
        struct fimd_driver_data *driver_data;
@@ -136,6 +174,7 @@ static const struct of_device_id fimd_driver_dt_match[] = {
          .data = &exynos5_fimd_driver_data },
        {},
 };
+MODULE_DEVICE_TABLE(of, fimd_driver_dt_match);
 
 static inline struct fimd_driver_data *drm_fimd_get_driver_data(
        struct platform_device *pdev)
@@ -243,6 +282,14 @@ static u32 fimd_calc_clkdiv(struct fimd_context *ctx,
        unsigned long ideal_clk = mode->htotal * mode->vtotal * mode->vrefresh;
        u32 clkdiv;
 
+       if (ctx->i80_if) {
+               /*
+                * The frame done interrupt should be occurred prior to the
+                * next TE signal.
+                */
+               ideal_clk *= 2;
+       }
+
        /* Find the clock divider value that gets us closest to ideal_clk */
        clkdiv = DIV_ROUND_UP(clk_get_rate(ctx->lcd_clk), ideal_clk);
 
@@ -271,11 +318,10 @@ static void fimd_commit(struct exynos_drm_manager *mgr)
 {
        struct fimd_context *ctx = mgr->ctx;
        struct drm_display_mode *mode = &ctx->mode;
-       struct fimd_driver_data *driver_data;
-       u32 val, clkdiv, vidcon1;
-       int vsync_len, vbpd, vfpd, hsync_len, hbpd, hfpd;
+       struct fimd_driver_data *driver_data = ctx->driver_data;
+       void *timing_base = ctx->regs + driver_data->timing_base;
+       u32 val, clkdiv;
 
-       driver_data = ctx->driver_data;
        if (ctx->suspended)
                return;
 
@@ -283,33 +329,65 @@ static void fimd_commit(struct exynos_drm_manager *mgr)
        if (mode->htotal == 0 || mode->vtotal == 0)
                return;
 
-       /* setup polarity values */
-       vidcon1 = ctx->vidcon1;
-       if (mode->flags & DRM_MODE_FLAG_NVSYNC)
-               vidcon1 |= VIDCON1_INV_VSYNC;
-       if (mode->flags & DRM_MODE_FLAG_NHSYNC)
-               vidcon1 |= VIDCON1_INV_HSYNC;
-       writel(vidcon1, ctx->regs + driver_data->timing_base + VIDCON1);
-
-       /* setup vertical timing values. */
-       vsync_len = mode->crtc_vsync_end - mode->crtc_vsync_start;
-       vbpd = mode->crtc_vtotal - mode->crtc_vsync_end;
-       vfpd = mode->crtc_vsync_start - mode->crtc_vdisplay;
-
-       val = VIDTCON0_VBPD(vbpd - 1) |
-               VIDTCON0_VFPD(vfpd - 1) |
-               VIDTCON0_VSPW(vsync_len - 1);
-       writel(val, ctx->regs + driver_data->timing_base + VIDTCON0);
-
-       /* setup horizontal timing values.  */
-       hsync_len = mode->crtc_hsync_end - mode->crtc_hsync_start;
-       hbpd = mode->crtc_htotal - mode->crtc_hsync_end;
-       hfpd = mode->crtc_hsync_start - mode->crtc_hdisplay;
-
-       val = VIDTCON1_HBPD(hbpd - 1) |
-               VIDTCON1_HFPD(hfpd - 1) |
-               VIDTCON1_HSPW(hsync_len - 1);
-       writel(val, ctx->regs + driver_data->timing_base + VIDTCON1);
+       if (ctx->i80_if) {
+               val = ctx->i80ifcon | I80IFEN_ENABLE;
+               writel(val, timing_base + I80IFCONFAx(0));
+
+               /* disable auto frame rate */
+               writel(0, timing_base + I80IFCONFBx(0));
+
+               /* set video type selection to I80 interface */
+               if (ctx->sysreg && regmap_update_bits(ctx->sysreg,
+                                       driver_data->lcdblk_offset,
+                                       0x3 << driver_data->lcdblk_vt_shift,
+                                       0x1 << driver_data->lcdblk_vt_shift)) {
+                       DRM_ERROR("Failed to update sysreg for I80 i/f.\n");
+                       return;
+               }
+       } else {
+               int vsync_len, vbpd, vfpd, hsync_len, hbpd, hfpd;
+               u32 vidcon1;
+
+               /* setup polarity values */
+               vidcon1 = ctx->vidcon1;
+               if (mode->flags & DRM_MODE_FLAG_NVSYNC)
+                       vidcon1 |= VIDCON1_INV_VSYNC;
+               if (mode->flags & DRM_MODE_FLAG_NHSYNC)
+                       vidcon1 |= VIDCON1_INV_HSYNC;
+               writel(vidcon1, ctx->regs + driver_data->timing_base + VIDCON1);
+
+               /* setup vertical timing values. */
+               vsync_len = mode->crtc_vsync_end - mode->crtc_vsync_start;
+               vbpd = mode->crtc_vtotal - mode->crtc_vsync_end;
+               vfpd = mode->crtc_vsync_start - mode->crtc_vdisplay;
+
+               val = VIDTCON0_VBPD(vbpd - 1) |
+                       VIDTCON0_VFPD(vfpd - 1) |
+                       VIDTCON0_VSPW(vsync_len - 1);
+               writel(val, ctx->regs + driver_data->timing_base + VIDTCON0);
+
+               /* setup horizontal timing values.  */
+               hsync_len = mode->crtc_hsync_end - mode->crtc_hsync_start;
+               hbpd = mode->crtc_htotal - mode->crtc_hsync_end;
+               hfpd = mode->crtc_hsync_start - mode->crtc_hdisplay;
+
+               val = VIDTCON1_HBPD(hbpd - 1) |
+                       VIDTCON1_HFPD(hfpd - 1) |
+                       VIDTCON1_HSPW(hsync_len - 1);
+               writel(val, ctx->regs + driver_data->timing_base + VIDTCON1);
+       }
+
+       if (driver_data->has_vidoutcon)
+               writel(ctx->vidout_con, timing_base + VIDOUT_CON);
+
+       /* set bypass selection */
+       if (ctx->sysreg && regmap_update_bits(ctx->sysreg,
+                               driver_data->lcdblk_offset,
+                               0x1 << driver_data->lcdblk_bypass_shift,
+                               0x1 << driver_data->lcdblk_bypass_shift)) {
+               DRM_ERROR("Failed to update sysreg for bypass setting.\n");
+               return;
+       }
 
        /* setup horizontal and vertical display size. */
        val = VIDTCON2_LINEVAL(mode->vdisplay - 1) |
@@ -322,7 +400,8 @@ static void fimd_commit(struct exynos_drm_manager *mgr)
         * fields of register with prefix '_F' would be updated
         * at vsync(same as dma start)
         */
-       val = VIDCON0_ENVID | VIDCON0_ENVID_F;
+       val = ctx->vidcon0;
+       val |= VIDCON0_ENVID | VIDCON0_ENVID_F;
 
        if (ctx->driver_data->has_clksel)
                val |= VIDCON0_CLKSEL_LCD;
@@ -660,6 +739,9 @@ static void fimd_win_commit(struct exynos_drm_manager *mgr, int zpos)
        }
 
        win_data->enabled = true;
+
+       if (ctx->i80_if)
+               atomic_set(&ctx->win_updated, 1);
 }
 
 static void fimd_win_disable(struct exynos_drm_manager *mgr, int zpos)
@@ -838,6 +920,58 @@ static void fimd_dpms(struct exynos_drm_manager *mgr, int mode)
        }
 }
 
+static void fimd_trigger(struct device *dev)
+{
+       struct exynos_drm_manager *mgr = get_fimd_manager(dev);
+       struct fimd_context *ctx = mgr->ctx;
+       struct fimd_driver_data *driver_data = ctx->driver_data;
+       void *timing_base = ctx->regs + driver_data->timing_base;
+       u32 reg;
+
+       atomic_set(&ctx->triggering, 1);
+
+       reg = readl(ctx->regs + VIDINTCON0);
+       reg |= (VIDINTCON0_INT_ENABLE | VIDINTCON0_INT_I80IFDONE |
+                                               VIDINTCON0_INT_SYSMAINCON);
+       writel(reg, ctx->regs + VIDINTCON0);
+
+       reg = readl(timing_base + TRIGCON);
+       reg |= (TRGMODE_I80_RGB_ENABLE_I80 | SWTRGCMD_I80_RGB_ENABLE);
+       writel(reg, timing_base + TRIGCON);
+}
+
+static void fimd_te_handler(struct exynos_drm_manager *mgr)
+{
+       struct fimd_context *ctx = mgr->ctx;
+
+       /* Checks the crtc is detached already from encoder */
+       if (ctx->pipe < 0 || !ctx->drm_dev)
+               return;
+
+        /*
+        * Skips to trigger if in triggering state, because multiple triggering
+        * requests can cause panel reset.
+        */
+       if (atomic_read(&ctx->triggering))
+               return;
+
+       /*
+        * If there is a page flip request, triggers and handles the page flip
+        * event so that current fb can be updated into panel GRAM.
+        */
+       if (atomic_add_unless(&ctx->win_updated, -1, 0))
+               fimd_trigger(ctx->dev);
+
+       /* Wakes up vsync event queue */
+       if (atomic_read(&ctx->wait_vsync_event)) {
+               atomic_set(&ctx->wait_vsync_event, 0);
+               wake_up(&ctx->wait_vsync_queue);
+
+               if (!atomic_read(&ctx->triggering))
+                       drm_handle_vblank(ctx->drm_dev, ctx->pipe);
+       }
+}
+
 static struct exynos_drm_manager_ops fimd_manager_ops = {
        .dpms = fimd_dpms,
        .mode_fixup = fimd_mode_fixup,
@@ -849,6 +983,7 @@ static struct exynos_drm_manager_ops fimd_manager_ops = {
        .win_mode_set = fimd_win_mode_set,
        .win_commit = fimd_win_commit,
        .win_disable = fimd_win_disable,
+       .te_handler = fimd_te_handler,
 };
 
 static struct exynos_drm_manager fimd_manager = {
@@ -859,26 +994,40 @@ static struct exynos_drm_manager fimd_manager = {
 static irqreturn_t fimd_irq_handler(int irq, void *dev_id)
 {
        struct fimd_context *ctx = (struct fimd_context *)dev_id;
-       u32 val;
+       u32 val, clear_bit;
 
        val = readl(ctx->regs + VIDINTCON1);
 
-       if (val & VIDINTCON1_INT_FRAME)
-               /* VSYNC interrupt */
-               writel(VIDINTCON1_INT_FRAME, ctx->regs + VIDINTCON1);
+       clear_bit = ctx->i80_if ? VIDINTCON1_INT_I80 : VIDINTCON1_INT_FRAME;
+       if (val & clear_bit)
+               writel(clear_bit, ctx->regs + VIDINTCON1);
 
        /* check the crtc is detached already from encoder */
        if (ctx->pipe < 0 || !ctx->drm_dev)
                goto out;
 
-       drm_handle_vblank(ctx->drm_dev, ctx->pipe);
-       exynos_drm_crtc_finish_pageflip(ctx->drm_dev, ctx->pipe);
+       if (ctx->i80_if) {
+               /* unset I80 frame done interrupt */
+               val = readl(ctx->regs + VIDINTCON0);
+               val &= ~(VIDINTCON0_INT_I80IFDONE | VIDINTCON0_INT_SYSMAINCON);
+               writel(val, ctx->regs + VIDINTCON0);
 
-       /* set wait vsync event to zero and wake up queue. */
-       if (atomic_read(&ctx->wait_vsync_event)) {
-               atomic_set(&ctx->wait_vsync_event, 0);
-               wake_up(&ctx->wait_vsync_queue);
+               /* exit triggering mode */
+               atomic_set(&ctx->triggering, 0);
+
+               drm_handle_vblank(ctx->drm_dev, ctx->pipe);
+               exynos_drm_crtc_finish_pageflip(ctx->drm_dev, ctx->pipe);
+       } else {
+               drm_handle_vblank(ctx->drm_dev, ctx->pipe);
+               exynos_drm_crtc_finish_pageflip(ctx->drm_dev, ctx->pipe);
+
+               /* set wait vsync event to zero and wake up queue. */
+               if (atomic_read(&ctx->wait_vsync_event)) {
+                       atomic_set(&ctx->wait_vsync_event, 0);
+                       wake_up(&ctx->wait_vsync_queue);
+               }
        }
+
 out:
        return IRQ_HANDLED;
 }
@@ -923,6 +1072,7 @@ static int fimd_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct fimd_context *ctx;
+       struct device_node *i80_if_timings;
        struct resource *res;
        int ret = -EINVAL;
 
@@ -944,12 +1094,51 @@ static int fimd_probe(struct platform_device *pdev)
 
        ctx->dev = dev;
        ctx->suspended = true;
+       ctx->driver_data = drm_fimd_get_driver_data(pdev);
 
        if (of_property_read_bool(dev->of_node, "samsung,invert-vden"))
                ctx->vidcon1 |= VIDCON1_INV_VDEN;
        if (of_property_read_bool(dev->of_node, "samsung,invert-vclk"))
                ctx->vidcon1 |= VIDCON1_INV_VCLK;
 
+       i80_if_timings = of_get_child_by_name(dev->of_node, "i80-if-timings");
+       if (i80_if_timings) {
+               u32 val;
+
+               ctx->i80_if = true;
+
+               if (ctx->driver_data->has_vidoutcon)
+                       ctx->vidout_con |= VIDOUT_CON_F_I80_LDI0;
+               else
+                       ctx->vidcon0 |= VIDCON0_VIDOUT_I80_LDI0;
+               /*
+                * The user manual describes that this "DSI_EN" bit is required
+                * to enable I80 24-bit data interface.
+                */
+               ctx->vidcon0 |= VIDCON0_DSI_EN;
+
+               if (of_property_read_u32(i80_if_timings, "cs-setup", &val))
+                       val = 0;
+               ctx->i80ifcon = LCD_CS_SETUP(val);
+               if (of_property_read_u32(i80_if_timings, "wr-setup", &val))
+                       val = 0;
+               ctx->i80ifcon |= LCD_WR_SETUP(val);
+               if (of_property_read_u32(i80_if_timings, "wr-active", &val))
+                       val = 1;
+               ctx->i80ifcon |= LCD_WR_ACTIVE(val);
+               if (of_property_read_u32(i80_if_timings, "wr-hold", &val))
+                       val = 0;
+               ctx->i80ifcon |= LCD_WR_HOLD(val);
+       }
+       of_node_put(i80_if_timings);
+
+       ctx->sysreg = syscon_regmap_lookup_by_phandle(dev->of_node,
+                                                       "samsung,sysreg");
+       if (IS_ERR(ctx->sysreg)) {
+               dev_warn(dev, "failed to get system register.\n");
+               ctx->sysreg = NULL;
+       }
+
        ctx->bus_clk = devm_clk_get(dev, "fimd");
        if (IS_ERR(ctx->bus_clk)) {
                dev_err(dev, "failed to get bus clock\n");
@@ -972,7 +1161,8 @@ static int fimd_probe(struct platform_device *pdev)
                goto err_del_component;
        }
 
-       res = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "vsync");
+       res = platform_get_resource_byname(pdev, IORESOURCE_IRQ,
+                                          ctx->i80_if ? "lcd_sys" : "vsync");
        if (!res) {
                dev_err(dev, "irq request failed.\n");
                ret = -ENXIO;
@@ -986,7 +1176,6 @@ static int fimd_probe(struct platform_device *pdev)
                goto err_del_component;
        }
 
-       ctx->driver_data = drm_fimd_get_driver_data(pdev);
        init_waitqueue_head(&ctx->wait_vsync_queue);
        atomic_set(&ctx->wait_vsync_event, 0);
 
index 80015871447366f8780d3563ab5aeebca9ad2211..df7a77d3eff84b769342f04114a31a040a843769 100644 (file)
@@ -1042,8 +1042,23 @@ err:
 int exynos_g2d_get_ver_ioctl(struct drm_device *drm_dev, void *data,
                             struct drm_file *file)
 {
+       struct drm_exynos_file_private *file_priv = file->driver_priv;
+       struct exynos_drm_g2d_private *g2d_priv = file_priv->g2d_priv;
+       struct device *dev;
+       struct g2d_data *g2d;
        struct drm_exynos_g2d_get_ver *ver = data;
 
+       if (!g2d_priv)
+               return -ENODEV;
+
+       dev = g2d_priv->dev;
+       if (!dev)
+               return -ENODEV;
+
+       g2d = dev_get_drvdata(dev);
+       if (!g2d)
+               return -EFAULT;
+
        ver->major = G2D_HW_MAJOR_VER;
        ver->minor = G2D_HW_MINOR_VER;
 
@@ -1056,7 +1071,7 @@ int exynos_g2d_set_cmdlist_ioctl(struct drm_device *drm_dev, void *data,
 {
        struct drm_exynos_file_private *file_priv = file->driver_priv;
        struct exynos_drm_g2d_private *g2d_priv = file_priv->g2d_priv;
-       struct device *dev = g2d_priv->dev;
+       struct device *dev;
        struct g2d_data *g2d;
        struct drm_exynos_g2d_set_cmdlist *req = data;
        struct drm_exynos_g2d_cmd *cmd;
@@ -1067,6 +1082,10 @@ int exynos_g2d_set_cmdlist_ioctl(struct drm_device *drm_dev, void *data,
        int size;
        int ret;
 
+       if (!g2d_priv)
+               return -ENODEV;
+
+       dev = g2d_priv->dev;
        if (!dev)
                return -ENODEV;
 
@@ -1223,13 +1242,17 @@ int exynos_g2d_exec_ioctl(struct drm_device *drm_dev, void *data,
 {
        struct drm_exynos_file_private *file_priv = file->driver_priv;
        struct exynos_drm_g2d_private *g2d_priv = file_priv->g2d_priv;
-       struct device *dev = g2d_priv->dev;
+       struct device *dev;
        struct g2d_data *g2d;
        struct drm_exynos_g2d_exec *req = data;
        struct g2d_runqueue_node *runqueue_node;
        struct list_head *run_cmdlist;
        struct list_head *event_list;
 
+       if (!g2d_priv)
+               return -ENODEV;
+
+       dev = g2d_priv->dev;
        if (!dev)
                return -ENODEV;
 
@@ -1544,8 +1567,10 @@ static const struct dev_pm_ops g2d_pm_ops = {
 
 static const struct of_device_id exynos_g2d_match[] = {
        { .compatible = "samsung,exynos5250-g2d" },
+       { .compatible = "samsung,exynos4212-g2d" },
        {},
 };
+MODULE_DEVICE_TABLE(of, exynos_g2d_match);
 
 struct platform_driver g2d_driver = {
        .probe          = g2d_probe,
index 163a054922cb89f1845e2fe23c4d46b6c442f0f2..15db80138382f7d7fd58875663f0448f1312b284 100644 (file)
@@ -301,7 +301,6 @@ void exynos_drm_gem_put_dma_addr(struct drm_device *dev,
                                        unsigned int gem_handle,
                                        struct drm_file *filp)
 {
-       struct exynos_drm_gem_obj *exynos_gem_obj;
        struct drm_gem_object *obj;
 
        obj = drm_gem_object_lookup(dev, filp, gem_handle);
@@ -310,8 +309,6 @@ void exynos_drm_gem_put_dma_addr(struct drm_device *dev,
                return;
        }
 
-       exynos_gem_obj = to_exynos_gem_obj(obj);
-
        drm_gem_object_unreference_unlocked(obj);
 
        /*
index a1888e128f1d306e0c10934cb6042c83f4ce10e7..c411399070d671d1d79075230280dbf22949c267 100644 (file)
@@ -129,9 +129,6 @@ void exynos_platform_device_ipp_unregister(void)
 
 int exynos_drm_ippdrv_register(struct exynos_drm_ippdrv *ippdrv)
 {
-       if (!ippdrv)
-               return -EINVAL;
-
        mutex_lock(&exynos_drm_ippdrv_lock);
        list_add_tail(&ippdrv->drv_list, &exynos_drm_ippdrv_list);
        mutex_unlock(&exynos_drm_ippdrv_lock);
@@ -141,9 +138,6 @@ int exynos_drm_ippdrv_register(struct exynos_drm_ippdrv *ippdrv)
 
 int exynos_drm_ippdrv_unregister(struct exynos_drm_ippdrv *ippdrv)
 {
-       if (!ippdrv)
-               return -EINVAL;
-
        mutex_lock(&exynos_drm_ippdrv_lock);
        list_del(&ippdrv->drv_list);
        mutex_unlock(&exynos_drm_ippdrv_lock);
@@ -151,20 +145,15 @@ int exynos_drm_ippdrv_unregister(struct exynos_drm_ippdrv *ippdrv)
        return 0;
 }
 
-static int ipp_create_id(struct idr *id_idr, struct mutex *lock, void *obj,
-               u32 *idp)
+static int ipp_create_id(struct idr *id_idr, struct mutex *lock, void *obj)
 {
        int ret;
 
-       /* do the allocation under our mutexlock */
        mutex_lock(lock);
        ret = idr_alloc(id_idr, obj, 1, 0, GFP_KERNEL);
        mutex_unlock(lock);
-       if (ret < 0)
-               return ret;
 
-       *idp = ret;
-       return 0;
+       return ret;
 }
 
 static void ipp_remove_id(struct idr *id_idr, struct mutex *lock, u32 id)
@@ -178,35 +167,25 @@ static void *ipp_find_obj(struct idr *id_idr, struct mutex *lock, u32 id)
 {
        void *obj;
 
-       DRM_DEBUG_KMS("id[%d]\n", id);
-
        mutex_lock(lock);
-
-       /* find object using handle */
        obj = idr_find(id_idr, id);
-       if (!obj) {
-               DRM_ERROR("failed to find object.\n");
-               mutex_unlock(lock);
-               return ERR_PTR(-ENODEV);
-       }
-
        mutex_unlock(lock);
 
        return obj;
 }
 
-static inline bool ipp_check_dedicated(struct exynos_drm_ippdrv *ippdrv,
-               enum drm_exynos_ipp_cmd cmd)
+static int ipp_check_driver(struct exynos_drm_ippdrv *ippdrv,
+                           struct drm_exynos_ipp_property *property)
 {
-       /*
-        * check dedicated flag and WB, OUTPUT operation with
-        * power on state.
-        */
-       if (ippdrv->dedicated || (!ipp_is_m2m_cmd(cmd) &&
-           !pm_runtime_suspended(ippdrv->dev)))
-               return true;
+       if (ippdrv->dedicated || (!ipp_is_m2m_cmd(property->cmd) &&
+                                 !pm_runtime_suspended(ippdrv->dev)))
+               return -EBUSY;
 
-       return false;
+       if (ippdrv->check_property &&
+           ippdrv->check_property(ippdrv->dev, property))
+               return -EINVAL;
+
+       return 0;
 }
 
 static struct exynos_drm_ippdrv *ipp_find_driver(struct ipp_context *ctx,
@@ -214,62 +193,30 @@ static struct exynos_drm_ippdrv *ipp_find_driver(struct ipp_context *ctx,
 {
        struct exynos_drm_ippdrv *ippdrv;
        u32 ipp_id = property->ipp_id;
-
-       DRM_DEBUG_KMS("ipp_id[%d]\n", ipp_id);
+       int ret;
 
        if (ipp_id) {
-               /* find ipp driver using idr */
-               ippdrv = ipp_find_obj(&ctx->ipp_idr, &ctx->ipp_lock,
-                       ipp_id);
-               if (IS_ERR(ippdrv)) {
-                       DRM_ERROR("not found ipp%d driver.\n", ipp_id);
-                       return ippdrv;
+               ippdrv = ipp_find_obj(&ctx->ipp_idr, &ctx->ipp_lock, ipp_id);
+               if (!ippdrv) {
+                       DRM_DEBUG("ipp%d driver not found\n", ipp_id);
+                       return ERR_PTR(-ENODEV);
                }
 
-               /*
-                * WB, OUTPUT opertion not supported multi-operation.
-                * so, make dedicated state at set property ioctl.
-                * when ipp driver finished operations, clear dedicated flags.
-                */
-               if (ipp_check_dedicated(ippdrv, property->cmd)) {
-                       DRM_ERROR("already used choose device.\n");
-                       return ERR_PTR(-EBUSY);
-               }
-
-               /*
-                * This is necessary to find correct device in ipp drivers.
-                * ipp drivers have different abilities,
-                * so need to check property.
-                */
-               if (ippdrv->check_property &&
-                   ippdrv->check_property(ippdrv->dev, property)) {
-                       DRM_ERROR("not support property.\n");
-                       return ERR_PTR(-EINVAL);
+               ret = ipp_check_driver(ippdrv, property);
+               if (ret < 0) {
+                       DRM_DEBUG("ipp%d driver check error %d\n", ipp_id, ret);
+                       return ERR_PTR(ret);
                }
 
                return ippdrv;
        } else {
-               /*
-                * This case is search all ipp driver for finding.
-                * user application don't set ipp_id in this case,
-                * so ipp subsystem search correct driver in driver list.
-                */
                list_for_each_entry(ippdrv, &exynos_drm_ippdrv_list, drv_list) {
-                       if (ipp_check_dedicated(ippdrv, property->cmd)) {
-                               DRM_DEBUG_KMS("used device.\n");
-                               continue;
-                       }
-
-                       if (ippdrv->check_property &&
-                           ippdrv->check_property(ippdrv->dev, property)) {
-                               DRM_DEBUG_KMS("not support property.\n");
-                               continue;
-                       }
-
-                       return ippdrv;
+                       ret = ipp_check_driver(ippdrv, property);
+                       if (ret == 0)
+                               return ippdrv;
                }
 
-               DRM_ERROR("not support ipp driver operations.\n");
+               DRM_DEBUG("cannot find driver suitable for given property.\n");
        }
 
        return ERR_PTR(-ENODEV);
@@ -308,8 +255,7 @@ int exynos_drm_ipp_get_property(struct drm_device *drm_dev, void *data,
                struct drm_file *file)
 {
        struct drm_exynos_file_private *file_priv = file->driver_priv;
-       struct exynos_drm_ipp_private *priv = file_priv->ipp_priv;
-       struct device *dev = priv->dev;
+       struct device *dev = file_priv->ipp_dev;
        struct ipp_context *ctx = get_ipp_context(dev);
        struct drm_exynos_ipp_prop_list *prop_list = data;
        struct exynos_drm_ippdrv *ippdrv;
@@ -346,10 +292,10 @@ int exynos_drm_ipp_get_property(struct drm_device *drm_dev, void *data,
                 */
                ippdrv = ipp_find_obj(&ctx->ipp_idr, &ctx->ipp_lock,
                                                prop_list->ipp_id);
-               if (IS_ERR(ippdrv)) {
+               if (!ippdrv) {
                        DRM_ERROR("not found ipp%d driver.\n",
                                        prop_list->ipp_id);
-                       return PTR_ERR(ippdrv);
+                       return -ENODEV;
                }
 
                *prop_list = ippdrv->prop_list;
@@ -432,7 +378,7 @@ static struct drm_exynos_ipp_event_work *ipp_create_event_work(void)
        if (!event_work)
                return ERR_PTR(-ENOMEM);
 
-       INIT_WORK((struct work_struct *)event_work, ipp_sched_event);
+       INIT_WORK(&event_work->work, ipp_sched_event);
 
        return event_work;
 }
@@ -441,8 +387,7 @@ int exynos_drm_ipp_set_property(struct drm_device *drm_dev, void *data,
                struct drm_file *file)
 {
        struct drm_exynos_file_private *file_priv = file->driver_priv;
-       struct exynos_drm_ipp_private *priv = file_priv->ipp_priv;
-       struct device *dev = priv->dev;
+       struct device *dev = file_priv->ipp_dev;
        struct ipp_context *ctx = get_ipp_context(dev);
        struct drm_exynos_ipp_property *property = data;
        struct exynos_drm_ippdrv *ippdrv;
@@ -489,19 +434,18 @@ int exynos_drm_ipp_set_property(struct drm_device *drm_dev, void *data,
        if (!c_node)
                return -ENOMEM;
 
-       /* create property id */
-       ret = ipp_create_id(&ctx->prop_idr, &ctx->prop_lock, c_node,
-               &property->prop_id);
-       if (ret) {
+       ret = ipp_create_id(&ctx->prop_idr, &ctx->prop_lock, c_node);
+       if (ret < 0) {
                DRM_ERROR("failed to create id.\n");
                goto err_clear;
        }
+       property->prop_id = ret;
 
        DRM_DEBUG_KMS("created prop_id[%d]cmd[%d]ippdrv[0x%x]\n",
                property->prop_id, property->cmd, (int)ippdrv);
 
        /* stored property information and ippdrv in private data */
-       c_node->priv = priv;
+       c_node->dev = dev;
        c_node->property = *property;
        c_node->state = IPP_STATE_IDLE;
 
@@ -534,7 +478,6 @@ int exynos_drm_ipp_set_property(struct drm_device *drm_dev, void *data,
                INIT_LIST_HEAD(&c_node->mem_list[i]);
 
        INIT_LIST_HEAD(&c_node->event_list);
-       list_splice_init(&priv->event_list, &c_node->event_list);
        mutex_lock(&ippdrv->cmd_lock);
        list_add_tail(&c_node->list, &ippdrv->cmd_list);
        mutex_unlock(&ippdrv->cmd_lock);
@@ -577,42 +520,18 @@ static void ipp_clean_cmd_node(struct ipp_context *ctx,
        kfree(c_node);
 }
 
-static int ipp_check_mem_list(struct drm_exynos_ipp_cmd_node *c_node)
+static bool ipp_check_mem_list(struct drm_exynos_ipp_cmd_node *c_node)
 {
-       struct drm_exynos_ipp_property *property = &c_node->property;
-       struct drm_exynos_ipp_mem_node *m_node;
-       struct list_head *head;
-       int ret, i, count[EXYNOS_DRM_OPS_MAX] = { 0, };
-
-       for_each_ipp_ops(i) {
-               /* source/destination memory list */
-               head = &c_node->mem_list[i];
-
-               /* find memory node entry */
-               list_for_each_entry(m_node, head, list) {
-                       DRM_DEBUG_KMS("%s,count[%d]m_node[0x%x]\n",
-                               i ? "dst" : "src", count[i], (int)m_node);
-                       count[i]++;
-               }
+       switch (c_node->property.cmd) {
+       case IPP_CMD_WB:
+               return !list_empty(&c_node->mem_list[EXYNOS_DRM_OPS_DST]);
+       case IPP_CMD_OUTPUT:
+               return !list_empty(&c_node->mem_list[EXYNOS_DRM_OPS_SRC]);
+       case IPP_CMD_M2M:
+       default:
+               return !list_empty(&c_node->mem_list[EXYNOS_DRM_OPS_SRC]) &&
+                      !list_empty(&c_node->mem_list[EXYNOS_DRM_OPS_DST]);
        }
-
-       DRM_DEBUG_KMS("min[%d]max[%d]\n",
-               min(count[EXYNOS_DRM_OPS_SRC], count[EXYNOS_DRM_OPS_DST]),
-               max(count[EXYNOS_DRM_OPS_SRC], count[EXYNOS_DRM_OPS_DST]));
-
-       /*
-        * M2M operations should be need paired memory address.
-        * so, need to check minimum count about src, dst.
-        * other case not use paired memory, so use maximum count
-        */
-       if (ipp_is_m2m_cmd(property->cmd))
-               ret = min(count[EXYNOS_DRM_OPS_SRC],
-                       count[EXYNOS_DRM_OPS_DST]);
-       else
-               ret = max(count[EXYNOS_DRM_OPS_SRC],
-                       count[EXYNOS_DRM_OPS_DST]);
-
-       return ret;
 }
 
 static struct drm_exynos_ipp_mem_node
@@ -683,16 +602,14 @@ static struct drm_exynos_ipp_mem_node
                struct drm_exynos_ipp_queue_buf *qbuf)
 {
        struct drm_exynos_ipp_mem_node *m_node;
-       struct drm_exynos_ipp_buf_info buf_info;
-       void *addr;
+       struct drm_exynos_ipp_buf_info *buf_info;
        int i;
 
        m_node = kzalloc(sizeof(*m_node), GFP_KERNEL);
        if (!m_node)
                return ERR_PTR(-ENOMEM);
 
-       /* clear base address for error handling */
-       memset(&buf_info, 0x0, sizeof(buf_info));
+       buf_info = &m_node->buf_info;
 
        /* operations, buffer id */
        m_node->ops_id = qbuf->ops_id;
@@ -707,6 +624,8 @@ static struct drm_exynos_ipp_mem_node
 
                /* get dma address by handle */
                if (qbuf->handle[i]) {
+                       dma_addr_t *addr;
+
                        addr = exynos_drm_gem_get_dma_addr(drm_dev,
                                        qbuf->handle[i], file);
                        if (IS_ERR(addr)) {
@@ -714,15 +633,14 @@ static struct drm_exynos_ipp_mem_node
                                goto err_clear;
                        }
 
-                       buf_info.handles[i] = qbuf->handle[i];
-                       buf_info.base[i] = *(dma_addr_t *) addr;
-                       DRM_DEBUG_KMS("i[%d]base[0x%x]hd[0x%x]\n",
-                               i, buf_info.base[i], (int)buf_info.handles[i]);
+                       buf_info->handles[i] = qbuf->handle[i];
+                       buf_info->base[i] = *addr;
+                       DRM_DEBUG_KMS("i[%d]base[0x%x]hd[0x%lx]\n", i,
+                                     buf_info->base[i], buf_info->handles[i]);
                }
        }
 
        m_node->filp = file;
-       m_node->buf_info = buf_info;
        mutex_lock(&c_node->mem_lock);
        list_add_tail(&m_node->list, &c_node->mem_list[qbuf->ops_id]);
        mutex_unlock(&c_node->mem_lock);
@@ -930,8 +848,7 @@ int exynos_drm_ipp_queue_buf(struct drm_device *drm_dev, void *data,
                struct drm_file *file)
 {
        struct drm_exynos_file_private *file_priv = file->driver_priv;
-       struct exynos_drm_ipp_private *priv = file_priv->ipp_priv;
-       struct device *dev = priv->dev;
+       struct device *dev = file_priv->ipp_dev;
        struct ipp_context *ctx = get_ipp_context(dev);
        struct drm_exynos_ipp_queue_buf *qbuf = data;
        struct drm_exynos_ipp_cmd_node *c_node;
@@ -955,9 +872,9 @@ int exynos_drm_ipp_queue_buf(struct drm_device *drm_dev, void *data,
        /* find command node */
        c_node = ipp_find_obj(&ctx->prop_idr, &ctx->prop_lock,
                qbuf->prop_id);
-       if (IS_ERR(c_node)) {
+       if (!c_node) {
                DRM_ERROR("failed to get command node.\n");
-               return PTR_ERR(c_node);
+               return -ENODEV;
        }
 
        /* buffer control */
@@ -1062,9 +979,8 @@ int exynos_drm_ipp_cmd_ctrl(struct drm_device *drm_dev, void *data,
                struct drm_file *file)
 {
        struct drm_exynos_file_private *file_priv = file->driver_priv;
-       struct exynos_drm_ipp_private *priv = file_priv->ipp_priv;
        struct exynos_drm_ippdrv *ippdrv = NULL;
-       struct device *dev = priv->dev;
+       struct device *dev = file_priv->ipp_dev;
        struct ipp_context *ctx = get_ipp_context(dev);
        struct drm_exynos_ipp_cmd_ctrl *cmd_ctrl = data;
        struct drm_exynos_ipp_cmd_work *cmd_work;
@@ -1091,9 +1007,9 @@ int exynos_drm_ipp_cmd_ctrl(struct drm_device *drm_dev, void *data,
 
        c_node = ipp_find_obj(&ctx->prop_idr, &ctx->prop_lock,
                cmd_ctrl->prop_id);
-       if (IS_ERR(c_node)) {
+       if (!c_node) {
                DRM_ERROR("invalid command node list.\n");
-               return PTR_ERR(c_node);
+               return -ENODEV;
        }
 
        if (!exynos_drm_ipp_check_valid(ippdrv->dev, cmd_ctrl->ctrl,
@@ -1198,7 +1114,6 @@ static int ipp_set_property(struct exynos_drm_ippdrv *ippdrv,
        /* reset h/w block */
        if (ippdrv->reset &&
            ippdrv->reset(ippdrv->dev)) {
-               DRM_ERROR("failed to reset.\n");
                return -EINVAL;
        }
 
@@ -1216,30 +1131,24 @@ static int ipp_set_property(struct exynos_drm_ippdrv *ippdrv,
                /* set format */
                if (ops->set_fmt) {
                        ret = ops->set_fmt(ippdrv->dev, config->fmt);
-                       if (ret) {
-                               DRM_ERROR("not support format.\n");
+                       if (ret)
                                return ret;
-                       }
                }
 
                /* set transform for rotation, flip */
                if (ops->set_transf) {
                        ret = ops->set_transf(ippdrv->dev, config->degree,
                                config->flip, &swap);
-                       if (ret) {
-                               DRM_ERROR("not support tranf.\n");
-                               return -EINVAL;
-                       }
+                       if (ret)
+                               return ret;
                }
 
                /* set size */
                if (ops->set_size) {
                        ret = ops->set_size(ippdrv->dev, swap, &config->pos,
                                &config->sz);
-                       if (ret) {
-                               DRM_ERROR("not support size.\n");
+                       if (ret)
                                return ret;
-                       }
                }
        }
 
@@ -1283,11 +1192,6 @@ static int ipp_start_property(struct exynos_drm_ippdrv *ippdrv,
 
                        m_node = list_first_entry(head,
                                struct drm_exynos_ipp_mem_node, list);
-                       if (!m_node) {
-                               DRM_ERROR("failed to get node.\n");
-                               ret = -EFAULT;
-                               goto err_unlock;
-                       }
 
                        DRM_DEBUG_KMS("m_node[0x%x]\n", (int)m_node);
 
@@ -1545,11 +1449,6 @@ static int ipp_send_event(struct exynos_drm_ippdrv *ippdrv,
 
                        m_node = list_first_entry(head,
                                struct drm_exynos_ipp_mem_node, list);
-                       if (!m_node) {
-                               DRM_ERROR("empty memory node.\n");
-                               ret = -ENOMEM;
-                               goto err_mem_unlock;
-                       }
 
                        tbuf_id[i] = m_node->buf_id;
                        DRM_DEBUG_KMS("%s buf_id[%d]\n",
@@ -1586,11 +1485,6 @@ static int ipp_send_event(struct exynos_drm_ippdrv *ippdrv,
 
                m_node = list_first_entry(head,
                        struct drm_exynos_ipp_mem_node, list);
-               if (!m_node) {
-                       DRM_ERROR("empty memory node.\n");
-                       ret = -ENOMEM;
-                       goto err_mem_unlock;
-               }
 
                tbuf_id[EXYNOS_DRM_OPS_SRC] = m_node->buf_id;
 
@@ -1704,21 +1598,17 @@ static int ipp_subdrv_probe(struct drm_device *drm_dev, struct device *dev)
 
        /* get ipp driver entry */
        list_for_each_entry(ippdrv, &exynos_drm_ippdrv_list, drv_list) {
-               u32 ipp_id;
-
                ippdrv->drm_dev = drm_dev;
 
-               ret = ipp_create_id(&ctx->ipp_idr, &ctx->ipp_lock, ippdrv,
-                                   &ipp_id);
-               if (ret || ipp_id == 0) {
+               ret = ipp_create_id(&ctx->ipp_idr, &ctx->ipp_lock, ippdrv);
+               if (ret < 0) {
                        DRM_ERROR("failed to create id.\n");
                        goto err;
                }
+               ippdrv->prop_list.ipp_id = ret;
 
                DRM_DEBUG_KMS("count[%d]ippdrv[0x%x]ipp_id[%d]\n",
-                       count++, (int)ippdrv, ipp_id);
-
-               ippdrv->prop_list.ipp_id = ipp_id;
+                       count++, (int)ippdrv, ret);
 
                /* store parent device for node */
                ippdrv->parent_dev = dev;
@@ -1776,17 +1666,10 @@ static int ipp_subdrv_open(struct drm_device *drm_dev, struct device *dev,
                struct drm_file *file)
 {
        struct drm_exynos_file_private *file_priv = file->driver_priv;
-       struct exynos_drm_ipp_private *priv;
-
-       priv = kzalloc(sizeof(*priv), GFP_KERNEL);
-       if (!priv)
-               return -ENOMEM;
-       priv->dev = dev;
-       file_priv->ipp_priv = priv;
 
-       INIT_LIST_HEAD(&priv->event_list);
+       file_priv->ipp_dev = dev;
 
-       DRM_DEBUG_KMS("done priv[0x%x]\n", (int)priv);
+       DRM_DEBUG_KMS("done priv[0x%x]\n", (int)dev);
 
        return 0;
 }
@@ -1795,13 +1678,12 @@ static void ipp_subdrv_close(struct drm_device *drm_dev, struct device *dev,
                struct drm_file *file)
 {
        struct drm_exynos_file_private *file_priv = file->driver_priv;
-       struct exynos_drm_ipp_private *priv = file_priv->ipp_priv;
        struct exynos_drm_ippdrv *ippdrv = NULL;
        struct ipp_context *ctx = get_ipp_context(dev);
        struct drm_exynos_ipp_cmd_node *c_node, *tc_node;
        int count = 0;
 
-       DRM_DEBUG_KMS("for priv[0x%x]\n", (int)priv);
+       DRM_DEBUG_KMS("for priv[0x%x]\n", (int)file_priv->ipp_dev);
 
        list_for_each_entry(ippdrv, &exynos_drm_ippdrv_list, drv_list) {
                mutex_lock(&ippdrv->cmd_lock);
@@ -1810,7 +1692,7 @@ static void ipp_subdrv_close(struct drm_device *drm_dev, struct device *dev,
                        DRM_DEBUG_KMS("count[%d]ippdrv[0x%x]\n",
                                count++, (int)ippdrv);
 
-                       if (c_node->priv == priv) {
+                       if (c_node->dev == file_priv->ipp_dev) {
                                /*
                                 * userland goto unnormal state. process killed.
                                 * and close the file.
@@ -1832,7 +1714,6 @@ static void ipp_subdrv_close(struct drm_device *drm_dev, struct device *dev,
                mutex_unlock(&ippdrv->cmd_lock);
        }
 
-       kfree(priv);
        return;
 }
 
index 7aaeaae757c2cc0bdfa3ee6cad874ecf21630ddd..6f48d62aeb30742636bea0b88d2edc8442d3e247 100644 (file)
@@ -48,7 +48,7 @@ struct drm_exynos_ipp_cmd_work {
 /*
  * A structure of command node.
  *
- * @priv: IPP private information.
+ * @dev: IPP device.
  * @list: list head to command queue information.
  * @event_list: list head of event.
  * @mem_list: list head to source,destination memory queue information.
@@ -64,7 +64,7 @@ struct drm_exynos_ipp_cmd_work {
  * @state: state of command node.
  */
 struct drm_exynos_ipp_cmd_node {
-       struct exynos_drm_ipp_private *priv;
+       struct device           *dev;
        struct list_head        list;
        struct list_head        event_list;
        struct list_head        mem_list[EXYNOS_DRM_OPS_MAX];
index f01fbb6dc1f06249f7c3947f14a378a7a8651f95..55af6b41c1dfa3f0da4be362245212838371ff1a 100644 (file)
@@ -691,6 +691,7 @@ static const struct of_device_id exynos_rotator_match[] = {
        },
        {},
 };
+MODULE_DEVICE_TABLE(of, exynos_rotator_match);
 
 static int rotator_probe(struct platform_device *pdev)
 {
index 2fb8705d6461f68457f476cd7d231b0c776eabdc..9528d81d8004d70bcd9f395a68f37ab12de5d9d5 100644 (file)
@@ -562,7 +562,7 @@ static int vidi_create_connector(struct exynos_drm_display *display,
        }
 
        drm_connector_helper_add(connector, &vidi_connector_helper_funcs);
-       drm_sysfs_connector_add(connector);
+       drm_connector_register(connector);
        drm_mode_connector_attach_encoder(connector, encoder);
 
        return 0;
index aa259b0a873a18e09701ad7b44391199fb8e4bec..562966db2aa13eec90a5dbf588666675f8674892 100644 (file)
@@ -84,6 +84,7 @@ struct hdmi_resources {
        struct clk                      *sclk_hdmiphy;
        struct clk                      *mout_hdmi;
        struct regulator_bulk_data      *regul_bulk;
+       struct regulator                *reg_hdmi_en;
        int                             regul_count;
 };
 
@@ -592,6 +593,13 @@ static struct hdmi_driver_data exynos4212_hdmi_driver_data = {
        .is_apb_phy     = 0,
 };
 
+static struct hdmi_driver_data exynos4210_hdmi_driver_data = {
+       .type           = HDMI_TYPE13,
+       .phy_confs      = hdmiphy_v13_configs,
+       .phy_conf_count = ARRAY_SIZE(hdmiphy_v13_configs),
+       .is_apb_phy     = 0,
+};
+
 static struct hdmi_driver_data exynos5_hdmi_driver_data = {
        .type           = HDMI_TYPE14,
        .phy_confs      = hdmiphy_v13_configs,
@@ -1129,7 +1137,7 @@ static int hdmi_create_connector(struct exynos_drm_display *display,
        }
 
        drm_connector_helper_add(connector, &hdmi_connector_helper_funcs);
-       drm_sysfs_connector_add(connector);
+       drm_connector_register(connector);
        drm_mode_connector_attach_encoder(connector, encoder);
 
        return 0;
@@ -1241,14 +1249,13 @@ static void hdmi_reg_acr(struct hdmi_context *hdata, u8 *acr)
 
 static void hdmi_audio_init(struct hdmi_context *hdata)
 {
-       u32 sample_rate, bits_per_sample, frame_size_code;
+       u32 sample_rate, bits_per_sample;
        u32 data_num, bit_ch, sample_frq;
        u32 val;
        u8 acr[7];
 
        sample_rate = 44100;
        bits_per_sample = 16;
-       frame_size_code = 0;
 
        switch (bits_per_sample) {
        case 20:
@@ -2168,7 +2175,6 @@ static int hdmi_resources_init(struct hdmi_context *hdata)
        struct device *dev = hdata->dev;
        struct hdmi_resources *res = &hdata->res;
        static char *supply[] = {
-               "hdmi-en",
                "vdd",
                "vdd_osc",
                "vdd_pll",
@@ -2228,6 +2234,20 @@ static int hdmi_resources_init(struct hdmi_context *hdata)
        }
        res->regul_count = ARRAY_SIZE(supply);
 
+       res->reg_hdmi_en = devm_regulator_get(dev, "hdmi-en");
+       if (IS_ERR(res->reg_hdmi_en) && PTR_ERR(res->reg_hdmi_en) != -ENOENT) {
+               DRM_ERROR("failed to get hdmi-en regulator\n");
+               return PTR_ERR(res->reg_hdmi_en);
+       }
+       if (!IS_ERR(res->reg_hdmi_en)) {
+               ret = regulator_enable(res->reg_hdmi_en);
+               if (ret) {
+                       DRM_ERROR("failed to enable hdmi-en regulator\n");
+                       return ret;
+               }
+       } else
+               res->reg_hdmi_en = NULL;
+
        return ret;
 fail:
        DRM_ERROR("HDMI resource init - failed\n");
@@ -2262,6 +2282,9 @@ static struct of_device_id hdmi_match_types[] = {
        {
                .compatible = "samsung,exynos5-hdmi",
                .data = &exynos5_hdmi_driver_data,
+       }, {
+               .compatible = "samsung,exynos4210-hdmi",
+               .data = &exynos4210_hdmi_driver_data,
        }, {
                .compatible = "samsung,exynos4212-hdmi",
                .data = &exynos4212_hdmi_driver_data,
@@ -2272,6 +2295,7 @@ static struct of_device_id hdmi_match_types[] = {
                /* end node */
        }
 };
+MODULE_DEVICE_TABLE (of, hdmi_match_types);
 
 static int hdmi_bind(struct device *dev, struct device *master, void *data)
 {
@@ -2494,7 +2518,11 @@ static int hdmi_remove(struct platform_device *pdev)
 
        cancel_delayed_work_sync(&hdata->hotplug_work);
 
-       put_device(&hdata->hdmiphy_port->dev);
+       if (hdata->res.reg_hdmi_en)
+               regulator_disable(hdata->res.reg_hdmi_en);
+
+       if (hdata->hdmiphy_port)
+               put_device(&hdata->hdmiphy_port->dev);
        put_device(&hdata->ddc_adpt->dev);
 
        pm_runtime_disable(&pdev->dev);
index 7529946d0a7427a00548705dc1f2c20c405081e6..e8b4ec84b312cc412351b08ab6e09f0626d5cc05 100644 (file)
@@ -76,7 +76,7 @@ struct mixer_resources {
        struct clk              *vp;
        struct clk              *sclk_mixer;
        struct clk              *sclk_hdmi;
-       struct clk              *sclk_dac;
+       struct clk              *mout_mixer;
 };
 
 enum mixer_version_id {
@@ -93,6 +93,7 @@ struct mixer_context {
        bool                    interlace;
        bool                    powered;
        bool                    vp_enabled;
+       bool                    has_sclk;
        u32                     int_en;
 
        struct mutex            mixer_mutex;
@@ -106,6 +107,7 @@ struct mixer_context {
 struct mixer_drv_data {
        enum mixer_version_id   version;
        bool                                    is_vp_enabled;
+       bool                                    has_sclk;
 };
 
 static const u8 filter_y_horiz_tap8[] = {
@@ -363,6 +365,11 @@ static void mixer_cfg_layer(struct mixer_context *ctx, int win, bool enable)
                        vp_reg_writemask(res, VP_ENABLE, val, VP_ENABLE_ON);
                        mixer_reg_writemask(res, MXR_CFG, val,
                                MXR_CFG_VP_ENABLE);
+
+                       /* control blending of graphic layer 0 */
+                       mixer_reg_writemask(res, MXR_GRAPHIC_CFG(0), val,
+                                       MXR_GRP_CFG_BLEND_PRE_MUL |
+                                       MXR_GRP_CFG_PIXEL_BLEND_EN);
                }
                break;
        }
@@ -809,19 +816,23 @@ static int vp_resources_init(struct mixer_context *mixer_ctx)
                dev_err(dev, "failed to get clock 'vp'\n");
                return -ENODEV;
        }
-       mixer_res->sclk_mixer = devm_clk_get(dev, "sclk_mixer");
-       if (IS_ERR(mixer_res->sclk_mixer)) {
-               dev_err(dev, "failed to get clock 'sclk_mixer'\n");
-               return -ENODEV;
-       }
-       mixer_res->sclk_dac = devm_clk_get(dev, "sclk_dac");
-       if (IS_ERR(mixer_res->sclk_dac)) {
-               dev_err(dev, "failed to get clock 'sclk_dac'\n");
-               return -ENODEV;
-       }
 
-       if (mixer_res->sclk_hdmi)
-               clk_set_parent(mixer_res->sclk_mixer, mixer_res->sclk_hdmi);
+       if (mixer_ctx->has_sclk) {
+               mixer_res->sclk_mixer = devm_clk_get(dev, "sclk_mixer");
+               if (IS_ERR(mixer_res->sclk_mixer)) {
+                       dev_err(dev, "failed to get clock 'sclk_mixer'\n");
+                       return -ENODEV;
+               }
+               mixer_res->mout_mixer = devm_clk_get(dev, "mout_mixer");
+               if (IS_ERR(mixer_res->mout_mixer)) {
+                       dev_err(dev, "failed to get clock 'mout_mixer'\n");
+                       return -ENODEV;
+               }
+
+               if (mixer_res->sclk_hdmi && mixer_res->mout_mixer)
+                       clk_set_parent(mixer_res->mout_mixer,
+                                      mixer_res->sclk_hdmi);
+       }
 
        res = platform_get_resource(mixer_ctx->pdev, IORESOURCE_MEM, 1);
        if (res == NULL) {
@@ -1082,7 +1093,8 @@ static void mixer_poweron(struct exynos_drm_manager *mgr)
        clk_prepare_enable(res->mixer);
        if (ctx->vp_enabled) {
                clk_prepare_enable(res->vp);
-               clk_prepare_enable(res->sclk_mixer);
+               if (ctx->has_sclk)
+                       clk_prepare_enable(res->sclk_mixer);
        }
 
        mutex_lock(&ctx->mixer_mutex);
@@ -1121,7 +1133,8 @@ static void mixer_poweroff(struct exynos_drm_manager *mgr)
        clk_disable_unprepare(res->mixer);
        if (ctx->vp_enabled) {
                clk_disable_unprepare(res->vp);
-               clk_disable_unprepare(res->sclk_mixer);
+               if (ctx->has_sclk)
+                       clk_disable_unprepare(res->sclk_mixer);
        }
 
        pm_runtime_put_sync(ctx->dev);
@@ -1189,9 +1202,15 @@ static struct mixer_drv_data exynos5250_mxr_drv_data = {
        .is_vp_enabled = 0,
 };
 
+static struct mixer_drv_data exynos4212_mxr_drv_data = {
+       .version = MXR_VER_0_0_0_16,
+       .is_vp_enabled = 1,
+};
+
 static struct mixer_drv_data exynos4210_mxr_drv_data = {
        .version = MXR_VER_0_0_0_16,
        .is_vp_enabled = 1,
+       .has_sclk = 1,
 };
 
 static struct platform_device_id mixer_driver_types[] = {
@@ -1208,6 +1227,12 @@ static struct platform_device_id mixer_driver_types[] = {
 
 static struct of_device_id mixer_match_types[] = {
        {
+               .compatible = "samsung,exynos4210-mixer",
+               .data   = &exynos4210_mxr_drv_data,
+       }, {
+               .compatible = "samsung,exynos4212-mixer",
+               .data   = &exynos4212_mxr_drv_data,
+       }, {
                .compatible = "samsung,exynos5-mixer",
                .data   = &exynos5250_mxr_drv_data,
        }, {
@@ -1220,6 +1245,7 @@ static struct of_device_id mixer_match_types[] = {
                /* end node */
        }
 };
+MODULE_DEVICE_TABLE(of, mixer_match_types);
 
 static int mixer_bind(struct device *dev, struct device *manager, void *data)
 {
@@ -1251,6 +1277,7 @@ static int mixer_bind(struct device *dev, struct device *manager, void *data)
        ctx->pdev = pdev;
        ctx->dev = dev;
        ctx->vp_enabled = drv->is_vp_enabled;
+       ctx->has_sclk = drv->has_sclk;
        ctx->mxr_ver = drv->version;
        init_waitqueue_head(&ctx->wait_vsync_queue);
        atomic_set(&ctx->wait_vsync_event, 0);
index c18268cd516ef5798d06824a6b0b436011ef3438..248c33a35ebf116c6b574b284b2c0a2848750a12 100644 (file)
@@ -192,7 +192,7 @@ static void cdv_intel_crt_destroy(struct drm_connector *connector)
        struct gma_encoder *gma_encoder = gma_attached_encoder(connector);
 
        psb_intel_i2c_destroy(gma_encoder->ddc_bus);
-       drm_sysfs_connector_remove(connector);
+       drm_connector_unregister(connector);
        drm_connector_cleanup(connector);
        kfree(connector);
 }
@@ -304,7 +304,7 @@ void cdv_intel_crt_init(struct drm_device *dev,
        drm_connector_helper_add(connector,
                                        &cdv_intel_crt_connector_helper_funcs);
 
-       drm_sysfs_connector_add(connector);
+       drm_connector_register(connector);
 
        return;
 failed_ddc:
index 9ff30c2efadbf99c8901bf0fe26f22cea73f63b5..a4cc0e60a1be732c035c06754571dafa09e4d0c8 100644 (file)
@@ -1713,7 +1713,7 @@ cdv_intel_dp_destroy(struct drm_connector *connector)
                }
        }
        i2c_del_adapter(&intel_dp->adapter);
-       drm_sysfs_connector_remove(connector);
+       drm_connector_unregister(connector);
        drm_connector_cleanup(connector);
        kfree(connector);
 }
@@ -1847,7 +1847,7 @@ cdv_intel_dp_init(struct drm_device *dev, struct psb_intel_mode_device *mode_dev
        connector->interlace_allowed = false;
        connector->doublescan_allowed = false;
 
-       drm_sysfs_connector_add(connector);
+       drm_connector_register(connector);
 
        /* Set up the DDC bus. */
        switch (output_reg) {
index b99084b3f706e0e50d35330ab6accc9a0fcaf08f..4268bf2100344167243ff9f7bbb20c0370658eb6 100644 (file)
@@ -248,7 +248,7 @@ static void cdv_hdmi_destroy(struct drm_connector *connector)
 
        if (gma_encoder->i2c_bus)
                psb_intel_i2c_destroy(gma_encoder->i2c_bus);
-       drm_sysfs_connector_remove(connector);
+       drm_connector_unregister(connector);
        drm_connector_cleanup(connector);
        kfree(connector);
 }
@@ -356,7 +356,7 @@ void cdv_hdmi_init(struct drm_device *dev,
 
        hdmi_priv->hdmi_i2c_adapter = &(gma_encoder->i2c_bus->adapter);
        hdmi_priv->dev = dev;
-       drm_sysfs_connector_add(connector);
+       drm_connector_register(connector);
        return;
 
 failed_ddc:
index 8ecc920fc26d1c3f8f331004305180aab88413d4..0b770396548c6674c88d3b2802695b703189ae7b 100644 (file)
@@ -446,7 +446,7 @@ static void cdv_intel_lvds_destroy(struct drm_connector *connector)
 
        if (gma_encoder->i2c_bus)
                psb_intel_i2c_destroy(gma_encoder->i2c_bus);
-       drm_sysfs_connector_remove(connector);
+       drm_connector_unregister(connector);
        drm_connector_cleanup(connector);
        kfree(connector);
 }
@@ -774,7 +774,7 @@ void cdv_intel_lvds_init(struct drm_device *dev,
 
 out:
        mutex_unlock(&dev->mode_config.mutex);
-       drm_sysfs_connector_add(connector);
+       drm_connector_register(connector);
        return;
 
 failed_find:
index e7fcc148f333ed56de86a92b14bcc0297fd798ff..d0dd3bea8aa5a1a2d98b2505139f07dc1db57715 100644 (file)
@@ -561,7 +561,7 @@ static int psbfb_probe(struct drm_fb_helper *helper,
        return psbfb_create(psb_fbdev, sizes);
 }
 
-static struct drm_fb_helper_funcs psb_fb_helper_funcs = {
+static const struct drm_fb_helper_funcs psb_fb_helper_funcs = {
        .gamma_set = psbfb_gamma_set,
        .gamma_get = psbfb_gamma_get,
        .fb_probe = psbfb_probe,
@@ -600,7 +600,8 @@ int psb_fbdev_init(struct drm_device *dev)
        }
 
        dev_priv->fbdev = fbdev;
-       fbdev->psb_fb_helper.funcs = &psb_fb_helper_funcs;
+
+       drm_fb_helper_prepare(dev, &fbdev->psb_fb_helper, &psb_fb_helper_funcs);
 
        drm_fb_helper_init(dev, &fbdev->psb_fb_helper, dev_priv->ops->crtcs,
                                                        INTELFB_CONN_LIMIT);
index 592d205a0089c0b71922a8453914b5b26aa2ec35..ce015db59dc6f594c55deb94479cd10c4fef2d00 100644 (file)
@@ -206,7 +206,7 @@ static int psb_gtt_attach_pages(struct gtt_range *gt)
 
        WARN_ON(gt->pages);
 
-       pages = drm_gem_get_pages(&gt->gem, 0);
+       pages = drm_gem_get_pages(&gt->gem);
        if (IS_ERR(pages))
                return PTR_ERR(pages);
 
index 6e91b20ce2e500fd766103ce1d11403a4257f383..abf2248da61ecffec15d80fc0d07f0137f7418c0 100644 (file)
@@ -318,7 +318,7 @@ static void mdfld_dsi_connector_destroy(struct drm_connector *connector)
 
        if (!dsi_connector)
                return;
-       drm_sysfs_connector_remove(connector);
+       drm_connector_unregister(connector);
        drm_connector_cleanup(connector);
        sender = dsi_connector->pkg_sender;
        mdfld_dsi_pkg_sender_destroy(sender);
@@ -597,7 +597,7 @@ void mdfld_dsi_output_init(struct drm_device *dev,
        dsi_config->encoder = encoder;
        encoder->base.type = (pipe == 0) ? INTEL_OUTPUT_MIPI :
                INTEL_OUTPUT_MIPI2;
-       drm_sysfs_connector_add(connector);
+       drm_connector_register(connector);
        return;
 
        /*TODO: add code to destroy outputs on error*/
index cf018ddcc5a646caf91d027d4cd79343d6e7c124..e6f5c620a0a21c1a1110d6638db5098b65abada4 100644 (file)
@@ -665,7 +665,7 @@ void oaktrail_hdmi_init(struct drm_device *dev,
        connector->display_info.subpixel_order = SubPixelHorizontalRGB;
        connector->interlace_allowed = false;
        connector->doublescan_allowed = false;
-       drm_sysfs_connector_add(connector);
+       drm_connector_register(connector);
        dev_info(dev->dev, "HDMI initialised.\n");
 
        return;
index 9b099468a5dbb496d0892f8c465131522aae7d9a..0d39da6e8b7a0627d7923d70b795a3f31db69e04 100644 (file)
@@ -404,7 +404,7 @@ void oaktrail_lvds_init(struct drm_device *dev,
 out:
        mutex_unlock(&dev->mode_config.mutex);
 
-       drm_sysfs_connector_add(connector);
+       drm_connector_register(connector);
        return;
 
 failed_find:
index d7778d0472c18569cbd89fbd9c70b5aa3f3a913b..88aad95bde091ab82e0f5461361cbe682ec8ab10 100644 (file)
@@ -563,7 +563,7 @@ void psb_intel_lvds_destroy(struct drm_connector *connector)
 
        if (lvds_priv->ddc_bus)
                psb_intel_i2c_destroy(lvds_priv->ddc_bus);
-       drm_sysfs_connector_remove(connector);
+       drm_connector_unregister(connector);
        drm_connector_cleanup(connector);
        kfree(connector);
 }
@@ -829,7 +829,7 @@ void psb_intel_lvds_init(struct drm_device *dev,
         */
 out:
        mutex_unlock(&dev->mode_config.mutex);
-       drm_sysfs_connector_add(connector);
+       drm_connector_register(connector);
        return;
 
 failed_find:
index deeb0829b1298d29130f51e7bad4bf4a415c6adc..0be96fdb5e28ba4e63ae51b6eb2b2d9a947028d4 100644 (file)
@@ -1682,7 +1682,7 @@ static void psb_intel_sdvo_destroy(struct drm_connector *connector)
                                     psb_intel_sdvo_connector->tv_format);
 
        psb_intel_sdvo_destroy_enhance_property(connector);
-       drm_sysfs_connector_remove(connector);
+       drm_connector_unregister(connector);
        drm_connector_cleanup(connector);
        kfree(connector);
 }
@@ -2071,7 +2071,7 @@ psb_intel_sdvo_connector_init(struct psb_intel_sdvo_connector *connector,
        connector->base.base.display_info.subpixel_order = SubPixelHorizontalRGB;
 
        gma_connector_attach_encoder(&connector->base, &encoder->base);
-       drm_sysfs_connector_add(&connector->base.base);
+       drm_connector_register(&connector->base.base);
 }
 
 static void
index ac357b02bd35c16862f3325b5c51be62ccf2465f..d4762799351d9d5e67efbce0987e10c0e974939c 100644 (file)
@@ -15,8 +15,7 @@
  * this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-
-
+#include <linux/component.h>
 #include <linux/hdmi.h>
 #include <linux/module.h>
 #include <linux/irq.h>
@@ -730,12 +729,9 @@ tda998x_configure_audio(struct tda998x_priv *priv,
 
 /* DRM encoder functions */
 
-static void
-tda998x_encoder_set_config(struct drm_encoder *encoder, void *params)
+static void tda998x_encoder_set_config(struct tda998x_priv *priv,
+                                      const struct tda998x_encoder_params *p)
 {
-       struct tda998x_priv *priv = to_tda998x_priv(encoder);
-       struct tda998x_encoder_params *p = params;
-
        priv->vip_cntrl_0 = VIP_CNTRL_0_SWAP_A(p->swap_a) |
                            (p->mirr_a ? VIP_CNTRL_0_MIRR_A : 0) |
                            VIP_CNTRL_0_SWAP_B(p->swap_b) |
@@ -752,11 +748,8 @@ tda998x_encoder_set_config(struct drm_encoder *encoder, void *params)
        priv->params = *p;
 }
 
-static void
-tda998x_encoder_dpms(struct drm_encoder *encoder, int mode)
+static void tda998x_encoder_dpms(struct tda998x_priv *priv, int mode)
 {
-       struct tda998x_priv *priv = to_tda998x_priv(encoder);
-
        /* we only care about on or off: */
        if (mode != DRM_MODE_DPMS_ON)
                mode = DRM_MODE_DPMS_OFF;
@@ -806,9 +799,8 @@ tda998x_encoder_mode_fixup(struct drm_encoder *encoder,
        return true;
 }
 
-static int
-tda998x_encoder_mode_valid(struct drm_encoder *encoder,
-                         struct drm_display_mode *mode)
+static int tda998x_encoder_mode_valid(struct tda998x_priv *priv,
+                                     struct drm_display_mode *mode)
 {
        if (mode->clock > 150000)
                return MODE_CLOCK_HIGH;
@@ -820,11 +812,10 @@ tda998x_encoder_mode_valid(struct drm_encoder *encoder,
 }
 
 static void
-tda998x_encoder_mode_set(struct drm_encoder *encoder,
-                       struct drm_display_mode *mode,
-                       struct drm_display_mode *adjusted_mode)
+tda998x_encoder_mode_set(struct tda998x_priv *priv,
+                        struct drm_display_mode *mode,
+                        struct drm_display_mode *adjusted_mode)
 {
-       struct tda998x_priv *priv = to_tda998x_priv(encoder);
        uint16_t ref_pix, ref_line, n_pix, n_line;
        uint16_t hs_pix_s, hs_pix_e;
        uint16_t vs1_pix_s, vs1_pix_e, vs1_line_s, vs1_line_e;
@@ -1012,20 +1003,16 @@ tda998x_encoder_mode_set(struct drm_encoder *encoder,
 }
 
 static enum drm_connector_status
-tda998x_encoder_detect(struct drm_encoder *encoder,
-                     struct drm_connector *connector)
+tda998x_encoder_detect(struct tda998x_priv *priv)
 {
-       struct tda998x_priv *priv = to_tda998x_priv(encoder);
        uint8_t val = cec_read(priv, REG_CEC_RXSHPDLEV);
 
        return (val & CEC_RXSHPDLEV_HPD) ? connector_status_connected :
                        connector_status_disconnected;
 }
 
-static int
-read_edid_block(struct drm_encoder *encoder, uint8_t *buf, int blk)
+static int read_edid_block(struct tda998x_priv *priv, uint8_t *buf, int blk)
 {
-       struct tda998x_priv *priv = to_tda998x_priv(encoder);
        uint8_t offset, segptr;
        int ret, i;
 
@@ -1079,10 +1066,8 @@ read_edid_block(struct drm_encoder *encoder, uint8_t *buf, int blk)
        return 0;
 }
 
-static uint8_t *
-do_get_edid(struct drm_encoder *encoder)
+static uint8_t *do_get_edid(struct tda998x_priv *priv)
 {
-       struct tda998x_priv *priv = to_tda998x_priv(encoder);
        int j, valid_extensions = 0;
        uint8_t *block, *new;
        bool print_bad_edid = drm_debug & DRM_UT_KMS;
@@ -1094,7 +1079,7 @@ do_get_edid(struct drm_encoder *encoder)
                reg_clear(priv, REG_TX4, TX4_PD_RAM);
 
        /* base block fetch */
-       if (read_edid_block(encoder, block, 0))
+       if (read_edid_block(priv, block, 0))
                goto fail;
 
        if (!drm_edid_block_valid(block, 0, print_bad_edid))
@@ -1111,7 +1096,7 @@ do_get_edid(struct drm_encoder *encoder)
 
        for (j = 1; j <= block[0x7e]; j++) {
                uint8_t *ext_block = block + (valid_extensions + 1) * EDID_LENGTH;
-               if (read_edid_block(encoder, ext_block, j))
+               if (read_edid_block(priv, ext_block, j))
                        goto fail;
 
                if (!drm_edid_block_valid(ext_block, j, print_bad_edid))
@@ -1144,11 +1129,10 @@ fail:
 }
 
 static int
-tda998x_encoder_get_modes(struct drm_encoder *encoder,
-                        struct drm_connector *connector)
+tda998x_encoder_get_modes(struct tda998x_priv *priv,
+                         struct drm_connector *connector)
 {
-       struct tda998x_priv *priv = to_tda998x_priv(encoder);
-       struct edid *edid = (struct edid *)do_get_edid(encoder);
+       struct edid *edid = (struct edid *)do_get_edid(priv);
        int n = 0;
 
        if (edid) {
@@ -1161,18 +1145,14 @@ tda998x_encoder_get_modes(struct drm_encoder *encoder,
        return n;
 }
 
-static int
-tda998x_encoder_create_resources(struct drm_encoder *encoder,
-                               struct drm_connector *connector)
+static void tda998x_encoder_set_polling(struct tda998x_priv *priv,
+                                       struct drm_connector *connector)
 {
-       struct tda998x_priv *priv = to_tda998x_priv(encoder);
-
        if (priv->hdmi->irq)
                connector->polled = DRM_CONNECTOR_POLL_HPD;
        else
                connector->polled = DRM_CONNECTOR_POLL_CONNECT |
                        DRM_CONNECTOR_POLL_DISCONNECT;
-       return 0;
 }
 
 static int
@@ -1185,66 +1165,97 @@ tda998x_encoder_set_property(struct drm_encoder *encoder,
        return 0;
 }
 
-static void
-tda998x_encoder_destroy(struct drm_encoder *encoder)
+static void tda998x_destroy(struct tda998x_priv *priv)
 {
-       struct tda998x_priv *priv = to_tda998x_priv(encoder);
-
        /* disable all IRQs and free the IRQ handler */
        cec_write(priv, REG_CEC_RXSHPDINTENA, 0);
        reg_clear(priv, REG_INT_FLAGS_2, INT_FLAGS_2_EDID_BLK_RD);
        if (priv->hdmi->irq)
                free_irq(priv->hdmi->irq, priv);
 
-       if (priv->cec)
-               i2c_unregister_device(priv->cec);
+       i2c_unregister_device(priv->cec);
+}
+
+/* Slave encoder support */
+
+static void
+tda998x_encoder_slave_set_config(struct drm_encoder *encoder, void *params)
+{
+       tda998x_encoder_set_config(to_tda998x_priv(encoder), params);
+}
+
+static void tda998x_encoder_slave_destroy(struct drm_encoder *encoder)
+{
+       struct tda998x_priv *priv = to_tda998x_priv(encoder);
+
+       tda998x_destroy(priv);
        drm_i2c_encoder_destroy(encoder);
        kfree(priv);
 }
 
-static struct drm_encoder_slave_funcs tda998x_encoder_funcs = {
-       .set_config = tda998x_encoder_set_config,
-       .destroy = tda998x_encoder_destroy,
-       .dpms = tda998x_encoder_dpms,
-       .save = tda998x_encoder_save,
-       .restore = tda998x_encoder_restore,
-       .mode_fixup = tda998x_encoder_mode_fixup,
-       .mode_valid = tda998x_encoder_mode_valid,
-       .mode_set = tda998x_encoder_mode_set,
-       .detect = tda998x_encoder_detect,
-       .get_modes = tda998x_encoder_get_modes,
-       .create_resources = tda998x_encoder_create_resources,
-       .set_property = tda998x_encoder_set_property,
-};
+static void tda998x_encoder_slave_dpms(struct drm_encoder *encoder, int mode)
+{
+       tda998x_encoder_dpms(to_tda998x_priv(encoder), mode);
+}
 
-/* I2C driver functions */
+static int tda998x_encoder_slave_mode_valid(struct drm_encoder *encoder,
+                                           struct drm_display_mode *mode)
+{
+       return tda998x_encoder_mode_valid(to_tda998x_priv(encoder), mode);
+}
 
-static int
-tda998x_probe(struct i2c_client *client, const struct i2c_device_id *id)
+static void
+tda998x_encoder_slave_mode_set(struct drm_encoder *encoder,
+                              struct drm_display_mode *mode,
+                              struct drm_display_mode *adjusted_mode)
 {
-       return 0;
+       tda998x_encoder_mode_set(to_tda998x_priv(encoder), mode, adjusted_mode);
+}
+
+static enum drm_connector_status
+tda998x_encoder_slave_detect(struct drm_encoder *encoder,
+                            struct drm_connector *connector)
+{
+       return tda998x_encoder_detect(to_tda998x_priv(encoder));
+}
+
+static int tda998x_encoder_slave_get_modes(struct drm_encoder *encoder,
+                                          struct drm_connector *connector)
+{
+       return tda998x_encoder_get_modes(to_tda998x_priv(encoder), connector);
 }
 
 static int
-tda998x_remove(struct i2c_client *client)
+tda998x_encoder_slave_create_resources(struct drm_encoder *encoder,
+                                      struct drm_connector *connector)
 {
+       tda998x_encoder_set_polling(to_tda998x_priv(encoder), connector);
        return 0;
 }
 
-static int
-tda998x_encoder_init(struct i2c_client *client,
-                   struct drm_device *dev,
-                   struct drm_encoder_slave *encoder_slave)
+static struct drm_encoder_slave_funcs tda998x_encoder_slave_funcs = {
+       .set_config = tda998x_encoder_slave_set_config,
+       .destroy = tda998x_encoder_slave_destroy,
+       .dpms = tda998x_encoder_slave_dpms,
+       .save = tda998x_encoder_save,
+       .restore = tda998x_encoder_restore,
+       .mode_fixup = tda998x_encoder_mode_fixup,
+       .mode_valid = tda998x_encoder_slave_mode_valid,
+       .mode_set = tda998x_encoder_slave_mode_set,
+       .detect = tda998x_encoder_slave_detect,
+       .get_modes = tda998x_encoder_slave_get_modes,
+       .create_resources = tda998x_encoder_slave_create_resources,
+       .set_property = tda998x_encoder_set_property,
+};
+
+/* I2C driver functions */
+
+static int tda998x_create(struct i2c_client *client, struct tda998x_priv *priv)
 {
-       struct tda998x_priv *priv;
        struct device_node *np = client->dev.of_node;
        u32 video;
        int rev_lo, rev_hi, ret;
 
-       priv = kzalloc(sizeof(*priv), GFP_KERNEL);
-       if (!priv)
-               return -ENOMEM;
-
        priv->vip_cntrl_0 = VIP_CNTRL_0_SWAP_A(2) | VIP_CNTRL_0_SWAP_B(3);
        priv->vip_cntrl_1 = VIP_CNTRL_1_SWAP_C(0) | VIP_CNTRL_1_SWAP_D(1);
        priv->vip_cntrl_2 = VIP_CNTRL_2_SWAP_E(4) | VIP_CNTRL_2_SWAP_F(5);
@@ -1252,17 +1263,11 @@ tda998x_encoder_init(struct i2c_client *client,
        priv->current_page = 0xff;
        priv->hdmi = client;
        priv->cec = i2c_new_dummy(client->adapter, 0x34);
-       if (!priv->cec) {
-               kfree(priv);
+       if (!priv->cec)
                return -ENODEV;
-       }
 
-       priv->encoder = &encoder_slave->base;
        priv->dpms = DRM_MODE_DPMS_OFF;
 
-       encoder_slave->slave_priv = priv;
-       encoder_slave->slave_funcs = &tda998x_encoder_funcs;
-
        /* wake up the device: */
        cec_write(priv, REG_CEC_ENAMODS,
                        CEC_ENAMODS_EN_RXSENS | CEC_ENAMODS_EN_HDMI);
@@ -1365,12 +1370,231 @@ fail:
         */
        if (priv->cec)
                i2c_unregister_device(priv->cec);
-       kfree(priv);
-       encoder_slave->slave_priv = NULL;
-       encoder_slave->slave_funcs = NULL;
        return -ENXIO;
 }
 
+static int tda998x_encoder_init(struct i2c_client *client,
+                               struct drm_device *dev,
+                               struct drm_encoder_slave *encoder_slave)
+{
+       struct tda998x_priv *priv;
+       int ret;
+
+       priv = kzalloc(sizeof(*priv), GFP_KERNEL);
+       if (!priv)
+               return -ENOMEM;
+
+       priv->encoder = &encoder_slave->base;
+
+       ret = tda998x_create(client, priv);
+       if (ret) {
+               kfree(priv);
+               return ret;
+       }
+
+       encoder_slave->slave_priv = priv;
+       encoder_slave->slave_funcs = &tda998x_encoder_slave_funcs;
+
+       return 0;
+}
+
+struct tda998x_priv2 {
+       struct tda998x_priv base;
+       struct drm_encoder encoder;
+       struct drm_connector connector;
+};
+
+#define conn_to_tda998x_priv2(x) \
+       container_of(x, struct tda998x_priv2, connector);
+
+#define enc_to_tda998x_priv2(x) \
+       container_of(x, struct tda998x_priv2, encoder);
+
+static void tda998x_encoder2_dpms(struct drm_encoder *encoder, int mode)
+{
+       struct tda998x_priv2 *priv = enc_to_tda998x_priv2(encoder);
+
+       tda998x_encoder_dpms(&priv->base, mode);
+}
+
+static void tda998x_encoder_prepare(struct drm_encoder *encoder)
+{
+       tda998x_encoder2_dpms(encoder, DRM_MODE_DPMS_OFF);
+}
+
+static void tda998x_encoder_commit(struct drm_encoder *encoder)
+{
+       tda998x_encoder2_dpms(encoder, DRM_MODE_DPMS_ON);
+}
+
+static void tda998x_encoder2_mode_set(struct drm_encoder *encoder,
+                                     struct drm_display_mode *mode,
+                                     struct drm_display_mode *adjusted_mode)
+{
+       struct tda998x_priv2 *priv = enc_to_tda998x_priv2(encoder);
+
+       tda998x_encoder_mode_set(&priv->base, mode, adjusted_mode);
+}
+
+static const struct drm_encoder_helper_funcs tda998x_encoder_helper_funcs = {
+       .dpms = tda998x_encoder2_dpms,
+       .save = tda998x_encoder_save,
+       .restore = tda998x_encoder_restore,
+       .mode_fixup = tda998x_encoder_mode_fixup,
+       .prepare = tda998x_encoder_prepare,
+       .commit = tda998x_encoder_commit,
+       .mode_set = tda998x_encoder2_mode_set,
+};
+
+static void tda998x_encoder_destroy(struct drm_encoder *encoder)
+{
+       struct tda998x_priv2 *priv = enc_to_tda998x_priv2(encoder);
+
+       tda998x_destroy(&priv->base);
+       drm_encoder_cleanup(encoder);
+}
+
+static const struct drm_encoder_funcs tda998x_encoder_funcs = {
+       .destroy = tda998x_encoder_destroy,
+};
+
+static int tda998x_connector_get_modes(struct drm_connector *connector)
+{
+       struct tda998x_priv2 *priv = conn_to_tda998x_priv2(connector);
+
+       return tda998x_encoder_get_modes(&priv->base, connector);
+}
+
+static int tda998x_connector_mode_valid(struct drm_connector *connector,
+                                       struct drm_display_mode *mode)
+{
+       struct tda998x_priv2 *priv = conn_to_tda998x_priv2(connector);
+
+       return tda998x_encoder_mode_valid(&priv->base, mode);
+}
+
+static struct drm_encoder *
+tda998x_connector_best_encoder(struct drm_connector *connector)
+{
+       struct tda998x_priv2 *priv = conn_to_tda998x_priv2(connector);
+
+       return &priv->encoder;
+}
+
+static
+const struct drm_connector_helper_funcs tda998x_connector_helper_funcs = {
+       .get_modes = tda998x_connector_get_modes,
+       .mode_valid = tda998x_connector_mode_valid,
+       .best_encoder = tda998x_connector_best_encoder,
+};
+
+static enum drm_connector_status
+tda998x_connector_detect(struct drm_connector *connector, bool force)
+{
+       struct tda998x_priv2 *priv = conn_to_tda998x_priv2(connector);
+
+       return tda998x_encoder_detect(&priv->base);
+}
+
+static void tda998x_connector_destroy(struct drm_connector *connector)
+{
+       drm_connector_unregister(connector);
+       drm_connector_cleanup(connector);
+}
+
+static const struct drm_connector_funcs tda998x_connector_funcs = {
+       .dpms = drm_helper_connector_dpms,
+       .fill_modes = drm_helper_probe_single_connector_modes,
+       .detect = tda998x_connector_detect,
+       .destroy = tda998x_connector_destroy,
+};
+
+static int tda998x_bind(struct device *dev, struct device *master, void *data)
+{
+       struct tda998x_encoder_params *params = dev->platform_data;
+       struct i2c_client *client = to_i2c_client(dev);
+       struct drm_device *drm = data;
+       struct tda998x_priv2 *priv;
+       int ret;
+
+       priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
+       if (!priv)
+               return -ENOMEM;
+
+       dev_set_drvdata(dev, priv);
+
+       priv->base.encoder = &priv->encoder;
+       priv->connector.interlace_allowed = 1;
+       priv->encoder.possible_crtcs = 1 << 0;
+
+       ret = tda998x_create(client, &priv->base);
+       if (ret)
+               return ret;
+
+       if (!dev->of_node && params)
+               tda998x_encoder_set_config(&priv->base, params);
+
+       tda998x_encoder_set_polling(&priv->base, &priv->connector);
+
+       drm_encoder_helper_add(&priv->encoder, &tda998x_encoder_helper_funcs);
+       ret = drm_encoder_init(drm, &priv->encoder, &tda998x_encoder_funcs,
+                              DRM_MODE_ENCODER_TMDS);
+       if (ret)
+               goto err_encoder;
+
+       drm_connector_helper_add(&priv->connector,
+                                &tda998x_connector_helper_funcs);
+       ret = drm_connector_init(drm, &priv->connector,
+                                &tda998x_connector_funcs,
+                                DRM_MODE_CONNECTOR_HDMIA);
+       if (ret)
+               goto err_connector;
+
+       ret = drm_connector_register(&priv->connector);
+       if (ret)
+               goto err_sysfs;
+
+       priv->connector.encoder = &priv->encoder;
+       drm_mode_connector_attach_encoder(&priv->connector, &priv->encoder);
+
+       return 0;
+
+err_sysfs:
+       drm_connector_cleanup(&priv->connector);
+err_connector:
+       drm_encoder_cleanup(&priv->encoder);
+err_encoder:
+       tda998x_destroy(&priv->base);
+       return ret;
+}
+
+static void tda998x_unbind(struct device *dev, struct device *master,
+                          void *data)
+{
+       struct tda998x_priv2 *priv = dev_get_drvdata(dev);
+
+       drm_connector_cleanup(&priv->connector);
+       drm_encoder_cleanup(&priv->encoder);
+       tda998x_destroy(&priv->base);
+}
+
+static const struct component_ops tda998x_ops = {
+       .bind = tda998x_bind,
+       .unbind = tda998x_unbind,
+};
+
+static int
+tda998x_probe(struct i2c_client *client, const struct i2c_device_id *id)
+{
+       return component_add(&client->dev, &tda998x_ops);
+}
+
+static int tda998x_remove(struct i2c_client *client)
+{
+       component_del(&client->dev, &tda998x_ops);
+       return 0;
+}
+
 #ifdef CONFIG_OF
 static const struct of_device_id tda998x_dt_ids[] = {
        { .compatible = "nxp,tda998x", },
index 437e1824d0bf1762db64587833269a7ebeec78e6..4e39ab34eb1cdf7ca72292e615950b7ce5506e68 100644 (file)
@@ -69,15 +69,3 @@ config DRM_I915_PRELIMINARY_HW_SUPPORT
          option changes the default for that module option.
 
          If in doubt, say "N".
-
-config DRM_I915_UMS
-       bool "Enable userspace modesetting on Intel hardware (DEPRECATED)"
-       depends on DRM_I915 && BROKEN
-       default n
-       help
-         Choose this option if you still need userspace modesetting.
-
-         Userspace modesetting is deprecated for quite some time now, so
-         enable this only if you have ancient versions of the DDX drivers.
-
-         If in doubt, say "N".
index cad1683d8bb527cc3c5e3fe9b163d581ff42ec53..91bd167e1cb70322998d92050d01f43eae7d0888 100644 (file)
@@ -59,6 +59,7 @@ i915-y += dvo_ch7017.o \
          intel_crt.o \
          intel_ddi.o \
          intel_dp.o \
+         intel_dp_mst.o \
          intel_dsi_cmd.o \
          intel_dsi.o \
          intel_dsi_pll.o \
index 9d7954366bd28ea9300ddfe321219f35f8c9726e..dea99d92fb4a195784c288f3fbc236c00a8188c2 100644 (file)
@@ -426,6 +426,9 @@ static const u32 gen7_render_regs[] = {
        GEN7_SO_WRITE_OFFSET(1),
        GEN7_SO_WRITE_OFFSET(2),
        GEN7_SO_WRITE_OFFSET(3),
+       GEN7_L3SQCREG1,
+       GEN7_L3CNTLREG2,
+       GEN7_L3CNTLREG3,
 };
 
 static const u32 gen7_blt_regs[] = {
index b8c689202c4041c4e22dc63d7415ffb2232e94a9..9e737b771c40ea2472f3e9f098cb91f363d75c23 100644 (file)
@@ -170,11 +170,13 @@ describe_obj(struct seq_file *m, struct drm_i915_gem_object *obj)
        }
        if (obj->ring != NULL)
                seq_printf(m, " (%s)", obj->ring->name);
+       if (obj->frontbuffer_bits)
+               seq_printf(m, " (frontbuffer: 0x%03x)", obj->frontbuffer_bits);
 }
 
 static void describe_ctx(struct seq_file *m, struct intel_context *ctx)
 {
-       seq_putc(m, ctx->is_initialized ? 'I' : 'i');
+       seq_putc(m, ctx->legacy_hw_ctx.initialized ? 'I' : 'i');
        seq_putc(m, ctx->remap_slice ? 'R' : 'r');
        seq_putc(m, ' ');
 }
@@ -515,6 +517,11 @@ static int i915_gem_pageflip_info(struct seq_file *m, void *data)
        struct drm_device *dev = node->minor->dev;
        unsigned long flags;
        struct intel_crtc *crtc;
+       int ret;
+
+       ret = mutex_lock_interruptible(&dev->struct_mutex);
+       if (ret)
+               return ret;
 
        for_each_intel_crtc(dev, crtc) {
                const char pipe = pipe_name(crtc->pipe);
@@ -556,6 +563,8 @@ static int i915_gem_pageflip_info(struct seq_file *m, void *data)
                spin_unlock_irqrestore(&dev->event_lock, flags);
        }
 
+       mutex_unlock(&dev->struct_mutex);
+
        return 0;
 }
 
@@ -985,29 +994,6 @@ DEFINE_SIMPLE_ATTRIBUTE(i915_next_seqno_fops,
                        i915_next_seqno_get, i915_next_seqno_set,
                        "0x%llx\n");
 
-static int i915_rstdby_delays(struct seq_file *m, void *unused)
-{
-       struct drm_info_node *node = m->private;
-       struct drm_device *dev = node->minor->dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
-       u16 crstanddelay;
-       int ret;
-
-       ret = mutex_lock_interruptible(&dev->struct_mutex);
-       if (ret)
-               return ret;
-       intel_runtime_pm_get(dev_priv);
-
-       crstanddelay = I915_READ16(CRSTANDVID);
-
-       intel_runtime_pm_put(dev_priv);
-       mutex_unlock(&dev->struct_mutex);
-
-       seq_printf(m, "w/ctx: %d, w/o ctx: %d\n", (crstanddelay >> 8) & 0x3f, (crstanddelay & 0x3f));
-
-       return 0;
-}
-
 static int i915_frequency_info(struct seq_file *m, void *unused)
 {
        struct drm_info_node *node = m->private;
@@ -1029,7 +1015,8 @@ static int i915_frequency_info(struct seq_file *m, void *unused)
                           MEMSTAT_VID_SHIFT);
                seq_printf(m, "Current P-state: %d\n",
                           (rgvstat & MEMSTAT_PSTATE_MASK) >> MEMSTAT_PSTATE_SHIFT);
-       } else if ((IS_GEN6(dev) || IS_GEN7(dev)) && !IS_VALLEYVIEW(dev)) {
+       } else if (IS_GEN6(dev) || (IS_GEN7(dev) && !IS_VALLEYVIEW(dev)) ||
+                  IS_BROADWELL(dev)) {
                u32 gt_perf_status = I915_READ(GEN6_GT_PERF_STATUS);
                u32 rp_state_limits = I915_READ(GEN6_RP_STATE_LIMITS);
                u32 rp_state_cap = I915_READ(GEN6_RP_STATE_CAP);
@@ -1048,7 +1035,7 @@ static int i915_frequency_info(struct seq_file *m, void *unused)
 
                reqf = I915_READ(GEN6_RPNSWREQ);
                reqf &= ~GEN6_TURBO_DISABLE;
-               if (IS_HASWELL(dev))
+               if (IS_HASWELL(dev) || IS_BROADWELL(dev))
                        reqf >>= 24;
                else
                        reqf >>= 25;
@@ -1065,7 +1052,7 @@ static int i915_frequency_info(struct seq_file *m, void *unused)
                rpdownei = I915_READ(GEN6_RP_CUR_DOWN_EI);
                rpcurdown = I915_READ(GEN6_RP_CUR_DOWN);
                rpprevdown = I915_READ(GEN6_RP_PREV_DOWN);
-               if (IS_HASWELL(dev))
+               if (IS_HASWELL(dev) || IS_BROADWELL(dev))
                        cagf = (rpstat & HSW_CAGF_MASK) >> HSW_CAGF_SHIFT;
                else
                        cagf = (rpstat & GEN6_CAGF_MASK) >> GEN6_CAGF_SHIFT;
@@ -1121,20 +1108,21 @@ static int i915_frequency_info(struct seq_file *m, void *unused)
                seq_printf(m, "Max overclocked frequency: %dMHz\n",
                           dev_priv->rps.max_freq * GT_FREQUENCY_MULTIPLIER);
        } else if (IS_VALLEYVIEW(dev)) {
-               u32 freq_sts, val;
+               u32 freq_sts;
 
                mutex_lock(&dev_priv->rps.hw_lock);
                freq_sts = vlv_punit_read(dev_priv, PUNIT_REG_GPU_FREQ_STS);
                seq_printf(m, "PUNIT_REG_GPU_FREQ_STS: 0x%08x\n", freq_sts);
                seq_printf(m, "DDR freq: %d MHz\n", dev_priv->mem_freq);
 
-               val = valleyview_rps_max_freq(dev_priv);
                seq_printf(m, "max GPU freq: %d MHz\n",
-                          vlv_gpu_freq(dev_priv, val));
+                          vlv_gpu_freq(dev_priv, dev_priv->rps.max_freq));
 
-               val = valleyview_rps_min_freq(dev_priv);
                seq_printf(m, "min GPU freq: %d MHz\n",
-                          vlv_gpu_freq(dev_priv, val));
+                          vlv_gpu_freq(dev_priv, dev_priv->rps.min_freq));
+
+               seq_printf(m, "efficient (RPe) frequency: %d MHz\n",
+                          vlv_gpu_freq(dev_priv, dev_priv->rps.efficient_freq));
 
                seq_printf(m, "current GPU freq: %d MHz\n",
                           vlv_gpu_freq(dev_priv, (freq_sts >> 8) & 0xff));
@@ -1148,61 +1136,6 @@ out:
        return ret;
 }
 
-static int i915_delayfreq_table(struct seq_file *m, void *unused)
-{
-       struct drm_info_node *node = m->private;
-       struct drm_device *dev = node->minor->dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
-       u32 delayfreq;
-       int ret, i;
-
-       ret = mutex_lock_interruptible(&dev->struct_mutex);
-       if (ret)
-               return ret;
-       intel_runtime_pm_get(dev_priv);
-
-       for (i = 0; i < 16; i++) {
-               delayfreq = I915_READ(PXVFREQ_BASE + i * 4);
-               seq_printf(m, "P%02dVIDFREQ: 0x%08x (VID: %d)\n", i, delayfreq,
-                          (delayfreq & PXVFREQ_PX_MASK) >> PXVFREQ_PX_SHIFT);
-       }
-
-       intel_runtime_pm_put(dev_priv);
-
-       mutex_unlock(&dev->struct_mutex);
-
-       return 0;
-}
-
-static inline int MAP_TO_MV(int map)
-{
-       return 1250 - (map * 25);
-}
-
-static int i915_inttoext_table(struct seq_file *m, void *unused)
-{
-       struct drm_info_node *node = m->private;
-       struct drm_device *dev = node->minor->dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
-       u32 inttoext;
-       int ret, i;
-
-       ret = mutex_lock_interruptible(&dev->struct_mutex);
-       if (ret)
-               return ret;
-       intel_runtime_pm_get(dev_priv);
-
-       for (i = 1; i <= 32; i++) {
-               inttoext = I915_READ(INTTOEXT_BASE_ILK + i * 4);
-               seq_printf(m, "INTTOEXT%02d: 0x%08x\n", i, inttoext);
-       }
-
-       intel_runtime_pm_put(dev_priv);
-       mutex_unlock(&dev->struct_mutex);
-
-       return 0;
-}
-
 static int ironlake_drpc_info(struct seq_file *m)
 {
        struct drm_info_node *node = m->private;
@@ -1513,10 +1446,17 @@ static int i915_ips_status(struct seq_file *m, void *unused)
 
        intel_runtime_pm_get(dev_priv);
 
-       if (IS_BROADWELL(dev) || I915_READ(IPS_CTL) & IPS_ENABLE)
-               seq_puts(m, "enabled\n");
-       else
-               seq_puts(m, "disabled\n");
+       seq_printf(m, "Enabled by kernel parameter: %s\n",
+                  yesno(i915.enable_ips));
+
+       if (INTEL_INFO(dev)->gen >= 8) {
+               seq_puts(m, "Currently: unknown\n");
+       } else {
+               if (I915_READ(IPS_CTL) & IPS_ENABLE)
+                       seq_puts(m, "Currently: enabled\n");
+               else
+                       seq_puts(m, "Currently: disabled\n");
+       }
 
        intel_runtime_pm_put(dev_priv);
 
@@ -1620,26 +1560,6 @@ out:
        return ret;
 }
 
-static int i915_gfxec(struct seq_file *m, void *unused)
-{
-       struct drm_info_node *node = m->private;
-       struct drm_device *dev = node->minor->dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
-       int ret;
-
-       ret = mutex_lock_interruptible(&dev->struct_mutex);
-       if (ret)
-               return ret;
-       intel_runtime_pm_get(dev_priv);
-
-       seq_printf(m, "GFXEC: %ld\n", (unsigned long)I915_READ(0x112f4));
-       intel_runtime_pm_put(dev_priv);
-
-       mutex_unlock(&dev->struct_mutex);
-
-       return 0;
-}
-
 static int i915_opregion(struct seq_file *m, void *unused)
 {
        struct drm_info_node *node = m->private;
@@ -1677,9 +1597,6 @@ static int i915_gem_framebuffer_info(struct seq_file *m, void *data)
 
 #ifdef CONFIG_DRM_I915_FBDEV
        struct drm_i915_private *dev_priv = dev->dev_private;
-       int ret = mutex_lock_interruptible(&dev->mode_config.mutex);
-       if (ret)
-               return ret;
 
        ifbdev = dev_priv->fbdev;
        fb = to_intel_framebuffer(ifbdev->helper.fb);
@@ -1692,7 +1609,6 @@ static int i915_gem_framebuffer_info(struct seq_file *m, void *data)
                   atomic_read(&fb->base.refcount.refcount));
        describe_obj(m, fb->obj);
        seq_putc(m, '\n');
-       mutex_unlock(&dev->mode_config.mutex);
 #endif
 
        mutex_lock(&dev->mode_config.fb_lock);
@@ -1723,7 +1639,7 @@ static int i915_context_status(struct seq_file *m, void *unused)
        struct intel_context *ctx;
        int ret, i;
 
-       ret = mutex_lock_interruptible(&dev->mode_config.mutex);
+       ret = mutex_lock_interruptible(&dev->struct_mutex);
        if (ret)
                return ret;
 
@@ -1740,7 +1656,7 @@ static int i915_context_status(struct seq_file *m, void *unused)
        }
 
        list_for_each_entry(ctx, &dev_priv->context_list, link) {
-               if (ctx->obj == NULL)
+               if (ctx->legacy_hw_ctx.rcs_state == NULL)
                        continue;
 
                seq_puts(m, "HW context ");
@@ -1749,11 +1665,11 @@ static int i915_context_status(struct seq_file *m, void *unused)
                        if (ring->default_context == ctx)
                                seq_printf(m, "(default context %s) ", ring->name);
 
-               describe_obj(m, ctx->obj);
+               describe_obj(m, ctx->legacy_hw_ctx.rcs_state);
                seq_putc(m, '\n');
        }
 
-       mutex_unlock(&dev->mode_config.mutex);
+       mutex_unlock(&dev->struct_mutex);
 
        return 0;
 }
@@ -1863,7 +1779,7 @@ static int per_file_ctx(int id, void *ptr, void *data)
        if (i915_gem_context_is_default(ctx))
                seq_puts(m, "  default context:\n");
        else
-               seq_printf(m, "  context %d:\n", ctx->id);
+               seq_printf(m, "  context %d:\n", ctx->user_handle);
        ppgtt->debug_dump(ppgtt, m);
 
        return 0;
@@ -1976,17 +1892,25 @@ static int i915_edp_psr_status(struct seq_file *m, void *data)
 
        intel_runtime_pm_get(dev_priv);
 
+       mutex_lock(&dev_priv->psr.lock);
        seq_printf(m, "Sink_Support: %s\n", yesno(dev_priv->psr.sink_support));
        seq_printf(m, "Source_OK: %s\n", yesno(dev_priv->psr.source_ok));
+       seq_printf(m, "Enabled: %s\n", yesno((bool)dev_priv->psr.enabled));
+       seq_printf(m, "Active: %s\n", yesno(dev_priv->psr.active));
+       seq_printf(m, "Busy frontbuffer bits: 0x%03x\n",
+                  dev_priv->psr.busy_frontbuffer_bits);
+       seq_printf(m, "Re-enable work scheduled: %s\n",
+                  yesno(work_busy(&dev_priv->psr.work.work)));
 
        enabled = HAS_PSR(dev) &&
                I915_READ(EDP_PSR_CTL(dev)) & EDP_PSR_ENABLE;
-       seq_printf(m, "Enabled: %s\n", yesno(enabled));
+       seq_printf(m, "HW Enabled & Active bit: %s\n", yesno(enabled));
 
        if (HAS_PSR(dev))
                psrperf = I915_READ(EDP_PSR_PERF_CNT(dev)) &
                        EDP_PSR_PERF_CNT_MASK;
        seq_printf(m, "Performance_Counter: %u\n", psrperf);
+       mutex_unlock(&dev_priv->psr.lock);
 
        intel_runtime_pm_put(dev_priv);
        return 0;
@@ -2072,7 +1996,7 @@ static int i915_pc8_status(struct seq_file *m, void *unused)
 
        seq_printf(m, "GPU idle: %s\n", yesno(!dev_priv->mm.busy));
        seq_printf(m, "IRQs disabled: %s\n",
-                  yesno(dev_priv->pm.irqs_disabled));
+                  yesno(!intel_irqs_enabled(dev_priv)));
 
        return 0;
 }
@@ -2126,6 +2050,8 @@ static const char *power_domain_str(enum intel_display_power_domain domain)
                return "VGA";
        case POWER_DOMAIN_AUDIO:
                return "AUDIO";
+       case POWER_DOMAIN_PLLS:
+               return "PLLS";
        case POWER_DOMAIN_INIT:
                return "INIT";
        default:
@@ -2223,9 +2149,12 @@ static void intel_crtc_info(struct seq_file *m, struct intel_crtc *intel_crtc)
        struct drm_crtc *crtc = &intel_crtc->base;
        struct intel_encoder *intel_encoder;
 
-       seq_printf(m, "\tfb: %d, pos: %dx%d, size: %dx%d\n",
-                  crtc->primary->fb->base.id, crtc->x, crtc->y,
-                  crtc->primary->fb->width, crtc->primary->fb->height);
+       if (crtc->primary->fb)
+               seq_printf(m, "\tfb: %d, pos: %dx%d, size: %dx%d\n",
+                          crtc->primary->fb->base.id, crtc->x, crtc->y,
+                          crtc->primary->fb->width, crtc->primary->fb->height);
+       else
+               seq_puts(m, "\tprimary plane disabled\n");
        for_each_encoder_on_crtc(dev, crtc, intel_encoder)
                intel_encoder_info(m, intel_crtc, intel_encoder);
 }
@@ -2287,13 +2216,15 @@ static void intel_connector_info(struct seq_file *m,
                seq_printf(m, "\tCEA rev: %d\n",
                           connector->display_info.cea_rev);
        }
-       if (intel_encoder->type == INTEL_OUTPUT_DISPLAYPORT ||
-           intel_encoder->type == INTEL_OUTPUT_EDP)
-               intel_dp_info(m, intel_connector);
-       else if (intel_encoder->type == INTEL_OUTPUT_HDMI)
-               intel_hdmi_info(m, intel_connector);
-       else if (intel_encoder->type == INTEL_OUTPUT_LVDS)
-               intel_lvds_info(m, intel_connector);
+       if (intel_encoder) {
+               if (intel_encoder->type == INTEL_OUTPUT_DISPLAYPORT ||
+                   intel_encoder->type == INTEL_OUTPUT_EDP)
+                       intel_dp_info(m, intel_connector);
+               else if (intel_encoder->type == INTEL_OUTPUT_HDMI)
+                       intel_hdmi_info(m, intel_connector);
+               else if (intel_encoder->type == INTEL_OUTPUT_LVDS)
+                       intel_lvds_info(m, intel_connector);
+       }
 
        seq_printf(m, "\tmodes:\n");
        list_for_each_entry(mode, &connector->modes, head)
@@ -2347,17 +2278,17 @@ static int i915_display_info(struct seq_file *m, void *unused)
                bool active;
                int x, y;
 
-               seq_printf(m, "CRTC %d: pipe: %c, active: %s\n",
+               seq_printf(m, "CRTC %d: pipe: %c, active=%s (size=%dx%d)\n",
                           crtc->base.base.id, pipe_name(crtc->pipe),
-                          yesno(crtc->active));
+                          yesno(crtc->active), crtc->config.pipe_src_w, crtc->config.pipe_src_h);
                if (crtc->active) {
                        intel_crtc_info(m, crtc);
 
                        active = cursor_position(dev, crtc->pipe, &x, &y);
-                       seq_printf(m, "\tcursor visible? %s, position (%d, %d), addr 0x%08x, active? %s\n",
+                       seq_printf(m, "\tcursor visible? %s, position (%d, %d), size %dx%d, addr 0x%08x, active? %s\n",
                                   yesno(crtc->cursor_base),
-                                  x, y, crtc->cursor_addr,
-                                  yesno(active));
+                                  x, y, crtc->cursor_width, crtc->cursor_height,
+                                  crtc->cursor_addr, yesno(active));
                }
 
                seq_printf(m, "\tunderrun reporting: cpu=%s pch=%s \n",
@@ -2377,12 +2308,132 @@ static int i915_display_info(struct seq_file *m, void *unused)
        return 0;
 }
 
+static int i915_semaphore_status(struct seq_file *m, void *unused)
+{
+       struct drm_info_node *node = (struct drm_info_node *) m->private;
+       struct drm_device *dev = node->minor->dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct intel_engine_cs *ring;
+       int num_rings = hweight32(INTEL_INFO(dev)->ring_mask);
+       int i, j, ret;
+
+       if (!i915_semaphore_is_enabled(dev)) {
+               seq_puts(m, "Semaphores are disabled\n");
+               return 0;
+       }
+
+       ret = mutex_lock_interruptible(&dev->struct_mutex);
+       if (ret)
+               return ret;
+       intel_runtime_pm_get(dev_priv);
+
+       if (IS_BROADWELL(dev)) {
+               struct page *page;
+               uint64_t *seqno;
+
+               page = i915_gem_object_get_page(dev_priv->semaphore_obj, 0);
+
+               seqno = (uint64_t *)kmap_atomic(page);
+               for_each_ring(ring, dev_priv, i) {
+                       uint64_t offset;
+
+                       seq_printf(m, "%s\n", ring->name);
+
+                       seq_puts(m, "  Last signal:");
+                       for (j = 0; j < num_rings; j++) {
+                               offset = i * I915_NUM_RINGS + j;
+                               seq_printf(m, "0x%08llx (0x%02llx) ",
+                                          seqno[offset], offset * 8);
+                       }
+                       seq_putc(m, '\n');
+
+                       seq_puts(m, "  Last wait:  ");
+                       for (j = 0; j < num_rings; j++) {
+                               offset = i + (j * I915_NUM_RINGS);
+                               seq_printf(m, "0x%08llx (0x%02llx) ",
+                                          seqno[offset], offset * 8);
+                       }
+                       seq_putc(m, '\n');
+
+               }
+               kunmap_atomic(seqno);
+       } else {
+               seq_puts(m, "  Last signal:");
+               for_each_ring(ring, dev_priv, i)
+                       for (j = 0; j < num_rings; j++)
+                               seq_printf(m, "0x%08x\n",
+                                          I915_READ(ring->semaphore.mbox.signal[j]));
+               seq_putc(m, '\n');
+       }
+
+       seq_puts(m, "\nSync seqno:\n");
+       for_each_ring(ring, dev_priv, i) {
+               for (j = 0; j < num_rings; j++) {
+                       seq_printf(m, "  0x%08x ", ring->semaphore.sync_seqno[j]);
+               }
+               seq_putc(m, '\n');
+       }
+       seq_putc(m, '\n');
+
+       intel_runtime_pm_put(dev_priv);
+       mutex_unlock(&dev->struct_mutex);
+       return 0;
+}
+
+static int i915_shared_dplls_info(struct seq_file *m, void *unused)
+{
+       struct drm_info_node *node = (struct drm_info_node *) m->private;
+       struct drm_device *dev = node->minor->dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       int i;
+
+       drm_modeset_lock_all(dev);
+       for (i = 0; i < dev_priv->num_shared_dpll; i++) {
+               struct intel_shared_dpll *pll = &dev_priv->shared_dplls[i];
+
+               seq_printf(m, "DPLL%i: %s, id: %i\n", i, pll->name, pll->id);
+               seq_printf(m, " refcount: %i, active: %i, on: %s\n", pll->refcount,
+                          pll->active, yesno(pll->on));
+               seq_printf(m, " tracked hardware state:\n");
+               seq_printf(m, " dpll:    0x%08x\n", pll->hw_state.dpll);
+               seq_printf(m, " dpll_md: 0x%08x\n", pll->hw_state.dpll_md);
+               seq_printf(m, " fp0:     0x%08x\n", pll->hw_state.fp0);
+               seq_printf(m, " fp1:     0x%08x\n", pll->hw_state.fp1);
+               seq_printf(m, " wrpll:   0x%08x\n", pll->hw_state.wrpll);
+       }
+       drm_modeset_unlock_all(dev);
+
+       return 0;
+}
+
 struct pipe_crc_info {
        const char *name;
        struct drm_device *dev;
        enum pipe pipe;
 };
 
+static int i915_dp_mst_info(struct seq_file *m, void *unused)
+{
+       struct drm_info_node *node = (struct drm_info_node *) m->private;
+       struct drm_device *dev = node->minor->dev;
+       struct drm_encoder *encoder;
+       struct intel_encoder *intel_encoder;
+       struct intel_digital_port *intel_dig_port;
+       drm_modeset_lock_all(dev);
+       list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
+               intel_encoder = to_intel_encoder(encoder);
+               if (intel_encoder->type != INTEL_OUTPUT_DISPLAYPORT)
+                       continue;
+               intel_dig_port = enc_to_dig_port(encoder);
+               if (!intel_dig_port->dp.can_mst)
+                       continue;
+
+               drm_dp_mst_dump_topology(m, &intel_dig_port->dp.mst_mgr);
+       }
+       drm_modeset_unlock_all(dev);
+       return 0;
+}
+
 static int i915_pipe_crc_open(struct inode *inode, struct file *filep)
 {
        struct pipe_crc_info *info = inode->i_private;
@@ -2849,7 +2900,60 @@ static int ilk_pipe_crc_ctl_reg(enum intel_pipe_crc_source *source,
        return 0;
 }
 
-static int ivb_pipe_crc_ctl_reg(enum intel_pipe_crc_source *source,
+static void hsw_trans_edp_pipe_A_crc_wa(struct drm_device *dev)
+{
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct intel_crtc *crtc =
+               to_intel_crtc(dev_priv->pipe_to_crtc_mapping[PIPE_A]);
+
+       drm_modeset_lock_all(dev);
+       /*
+        * If we use the eDP transcoder we need to make sure that we don't
+        * bypass the pfit, since otherwise the pipe CRC source won't work. Only
+        * relevant on hsw with pipe A when using the always-on power well
+        * routing.
+        */
+       if (crtc->config.cpu_transcoder == TRANSCODER_EDP &&
+           !crtc->config.pch_pfit.enabled) {
+               crtc->config.pch_pfit.force_thru = true;
+
+               intel_display_power_get(dev_priv,
+                                       POWER_DOMAIN_PIPE_PANEL_FITTER(PIPE_A));
+
+               dev_priv->display.crtc_disable(&crtc->base);
+               dev_priv->display.crtc_enable(&crtc->base);
+       }
+       drm_modeset_unlock_all(dev);
+}
+
+static void hsw_undo_trans_edp_pipe_A_crc_wa(struct drm_device *dev)
+{
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct intel_crtc *crtc =
+               to_intel_crtc(dev_priv->pipe_to_crtc_mapping[PIPE_A]);
+
+       drm_modeset_lock_all(dev);
+       /*
+        * If we use the eDP transcoder we need to make sure that we don't
+        * bypass the pfit, since otherwise the pipe CRC source won't work. Only
+        * relevant on hsw with pipe A when using the always-on power well
+        * routing.
+        */
+       if (crtc->config.pch_pfit.force_thru) {
+               crtc->config.pch_pfit.force_thru = false;
+
+               dev_priv->display.crtc_disable(&crtc->base);
+               dev_priv->display.crtc_enable(&crtc->base);
+
+               intel_display_power_put(dev_priv,
+                                       POWER_DOMAIN_PIPE_PANEL_FITTER(PIPE_A));
+       }
+       drm_modeset_unlock_all(dev);
+}
+
+static int ivb_pipe_crc_ctl_reg(struct drm_device *dev,
+                               enum pipe pipe,
+                               enum intel_pipe_crc_source *source,
                                uint32_t *val)
 {
        if (*source == INTEL_PIPE_CRC_SOURCE_AUTO)
@@ -2863,6 +2967,9 @@ static int ivb_pipe_crc_ctl_reg(enum intel_pipe_crc_source *source,
                *val = PIPE_CRC_ENABLE | PIPE_CRC_SOURCE_SPRITE_IVB;
                break;
        case INTEL_PIPE_CRC_SOURCE_PF:
+               if (IS_HASWELL(dev) && pipe == PIPE_A)
+                       hsw_trans_edp_pipe_A_crc_wa(dev);
+
                *val = PIPE_CRC_ENABLE | PIPE_CRC_SOURCE_PF_IVB;
                break;
        case INTEL_PIPE_CRC_SOURCE_NONE:
@@ -2895,11 +3002,11 @@ static int pipe_crc_set_source(struct drm_device *dev, enum pipe pipe,
        else if (INTEL_INFO(dev)->gen < 5)
                ret = i9xx_pipe_crc_ctl_reg(dev, pipe, &source, &val);
        else if (IS_VALLEYVIEW(dev))
-               ret = vlv_pipe_crc_ctl_reg(dev,pipe, &source, &val);
+               ret = vlv_pipe_crc_ctl_reg(dev, pipe, &source, &val);
        else if (IS_GEN5(dev) || IS_GEN6(dev))
                ret = ilk_pipe_crc_ctl_reg(&source, &val);
        else
-               ret = ivb_pipe_crc_ctl_reg(&source, &val);
+               ret = ivb_pipe_crc_ctl_reg(dev, pipe, &source, &val);
 
        if (ret != 0)
                return ret;
@@ -2929,11 +3036,16 @@ static int pipe_crc_set_source(struct drm_device *dev, enum pipe pipe,
        /* real source -> none transition */
        if (source == INTEL_PIPE_CRC_SOURCE_NONE) {
                struct intel_pipe_crc_entry *entries;
+               struct intel_crtc *crtc =
+                       to_intel_crtc(dev_priv->pipe_to_crtc_mapping[pipe]);
 
                DRM_DEBUG_DRIVER("stopping CRCs for pipe %c\n",
                                 pipe_name(pipe));
 
-               intel_wait_for_vblank(dev, pipe);
+               drm_modeset_lock(&crtc->base.mutex, NULL);
+               if (crtc->active)
+                       intel_wait_for_vblank(dev, pipe);
+               drm_modeset_unlock(&crtc->base.mutex);
 
                spin_lock_irq(&pipe_crc->lock);
                entries = pipe_crc->entries;
@@ -2946,6 +3058,8 @@ static int pipe_crc_set_source(struct drm_device *dev, enum pipe pipe,
                        g4x_undo_pipe_scramble_reset(dev, pipe);
                else if (IS_VALLEYVIEW(dev))
                        vlv_undo_pipe_scramble_reset(dev, pipe);
+               else if (IS_HASWELL(dev) && pipe == PIPE_A)
+                       hsw_undo_trans_edp_pipe_A_crc_wa(dev);
        }
 
        return 0;
@@ -3177,7 +3291,7 @@ static int pri_wm_latency_open(struct inode *inode, struct file *file)
 {
        struct drm_device *dev = inode->i_private;
 
-       if (!HAS_PCH_SPLIT(dev))
+       if (HAS_GMCH_DISPLAY(dev))
                return -ENODEV;
 
        return single_open(file, pri_wm_latency_show, dev);
@@ -3187,7 +3301,7 @@ static int spr_wm_latency_open(struct inode *inode, struct file *file)
 {
        struct drm_device *dev = inode->i_private;
 
-       if (!HAS_PCH_SPLIT(dev))
+       if (HAS_GMCH_DISPLAY(dev))
                return -ENODEV;
 
        return single_open(file, spr_wm_latency_show, dev);
@@ -3197,7 +3311,7 @@ static int cur_wm_latency_open(struct inode *inode, struct file *file)
 {
        struct drm_device *dev = inode->i_private;
 
-       if (!HAS_PCH_SPLIT(dev))
+       if (HAS_GMCH_DISPLAY(dev))
                return -ENODEV;
 
        return single_open(file, cur_wm_latency_show, dev);
@@ -3506,7 +3620,7 @@ i915_max_freq_get(void *data, u64 *val)
        struct drm_i915_private *dev_priv = dev->dev_private;
        int ret;
 
-       if (!(IS_GEN6(dev) || IS_GEN7(dev)))
+       if (INTEL_INFO(dev)->gen < 6)
                return -ENODEV;
 
        flush_delayed_work(&dev_priv->rps.delayed_resume_work);
@@ -3532,7 +3646,7 @@ i915_max_freq_set(void *data, u64 val)
        u32 rp_state_cap, hw_max, hw_min;
        int ret;
 
-       if (!(IS_GEN6(dev) || IS_GEN7(dev)))
+       if (INTEL_INFO(dev)->gen < 6)
                return -ENODEV;
 
        flush_delayed_work(&dev_priv->rps.delayed_resume_work);
@@ -3549,8 +3663,8 @@ i915_max_freq_set(void *data, u64 val)
        if (IS_VALLEYVIEW(dev)) {
                val = vlv_freq_opcode(dev_priv, val);
 
-               hw_max = valleyview_rps_max_freq(dev_priv);
-               hw_min = valleyview_rps_min_freq(dev_priv);
+               hw_max = dev_priv->rps.max_freq;
+               hw_min = dev_priv->rps.min_freq;
        } else {
                do_div(val, GT_FREQUENCY_MULTIPLIER);
 
@@ -3587,7 +3701,7 @@ i915_min_freq_get(void *data, u64 *val)
        struct drm_i915_private *dev_priv = dev->dev_private;
        int ret;
 
-       if (!(IS_GEN6(dev) || IS_GEN7(dev)))
+       if (INTEL_INFO(dev)->gen < 6)
                return -ENODEV;
 
        flush_delayed_work(&dev_priv->rps.delayed_resume_work);
@@ -3613,7 +3727,7 @@ i915_min_freq_set(void *data, u64 val)
        u32 rp_state_cap, hw_max, hw_min;
        int ret;
 
-       if (!(IS_GEN6(dev) || IS_GEN7(dev)))
+       if (INTEL_INFO(dev)->gen < 6)
                return -ENODEV;
 
        flush_delayed_work(&dev_priv->rps.delayed_resume_work);
@@ -3630,8 +3744,8 @@ i915_min_freq_set(void *data, u64 val)
        if (IS_VALLEYVIEW(dev)) {
                val = vlv_freq_opcode(dev_priv, val);
 
-               hw_max = valleyview_rps_max_freq(dev_priv);
-               hw_min = valleyview_rps_min_freq(dev_priv);
+               hw_max = dev_priv->rps.max_freq;
+               hw_min = dev_priv->rps.min_freq;
        } else {
                do_div(val, GT_FREQUENCY_MULTIPLIER);
 
@@ -3799,14 +3913,10 @@ static const struct drm_info_list i915_debugfs_list[] = {
        {"i915_gem_hws_blt", i915_hws_info, 0, (void *)BCS},
        {"i915_gem_hws_bsd", i915_hws_info, 0, (void *)VCS},
        {"i915_gem_hws_vebox", i915_hws_info, 0, (void *)VECS},
-       {"i915_rstdby_delays", i915_rstdby_delays, 0},
        {"i915_frequency_info", i915_frequency_info, 0},
-       {"i915_delayfreq_table", i915_delayfreq_table, 0},
-       {"i915_inttoext_table", i915_inttoext_table, 0},
        {"i915_drpc_info", i915_drpc_info, 0},
        {"i915_emon_status", i915_emon_status, 0},
        {"i915_ring_freq_table", i915_ring_freq_table, 0},
-       {"i915_gfxec", i915_gfxec, 0},
        {"i915_fbc_status", i915_fbc_status, 0},
        {"i915_ips_status", i915_ips_status, 0},
        {"i915_sr_status", i915_sr_status, 0},
@@ -3823,6 +3933,9 @@ static const struct drm_info_list i915_debugfs_list[] = {
        {"i915_pc8_status", i915_pc8_status, 0},
        {"i915_power_domain_info", i915_power_domain_info, 0},
        {"i915_display_info", i915_display_info, 0},
+       {"i915_semaphore_status", i915_semaphore_status, 0},
+       {"i915_shared_dplls_info", i915_shared_dplls_info, 0},
+       {"i915_dp_mst_info", i915_dp_mst_info, 0},
 };
 #define I915_DEBUGFS_ENTRIES ARRAY_SIZE(i915_debugfs_list)
 
index d44344140627176b493ca354c12665d4183736cf..2e7f03ad5ee2e9e84e9de0588ce78d8ad67f86f2 100644 (file)
@@ -138,7 +138,7 @@ static void i915_free_hws(struct drm_device *dev)
        I915_WRITE(HWS_PGA, 0x1ffff000);
 }
 
-void i915_kernel_lost_context(struct drm_device * dev)
+void i915_kernel_lost_context(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct drm_i915_master_private *master_priv;
@@ -166,7 +166,7 @@ void i915_kernel_lost_context(struct drm_device * dev)
                master_priv->sarea_priv->perf_boxes |= I915_BOX_RING_EMPTY;
 }
 
-static int i915_dma_cleanup(struct drm_device * dev)
+static int i915_dma_cleanup(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        int i;
@@ -190,7 +190,7 @@ static int i915_dma_cleanup(struct drm_device * dev)
        return 0;
 }
 
-static int i915_initialize(struct drm_device * dev, drm_i915_init_t * init)
+static int i915_initialize(struct drm_device *dev, drm_i915_init_t *init)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
@@ -235,7 +235,7 @@ static int i915_initialize(struct drm_device * dev, drm_i915_init_t * init)
        return 0;
 }
 
-static int i915_dma_resume(struct drm_device * dev)
+static int i915_dma_resume(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_engine_cs *ring = LP_RING(dev_priv);
@@ -359,7 +359,7 @@ static int validate_cmd(int cmd)
        return 0;
 }
 
-static int i915_emit_cmds(struct drm_device * dev, int *buffer, int dwords)
+static int i915_emit_cmds(struct drm_device *dev, int *buffer, int dwords)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        int i, ret;
@@ -369,6 +369,7 @@ static int i915_emit_cmds(struct drm_device * dev, int *buffer, int dwords)
 
        for (i = 0; i < dwords;) {
                int sz = validate_cmd(buffer[i]);
+
                if (sz == 0 || i + sz > dwords)
                        return -EINVAL;
                i += sz;
@@ -453,7 +454,7 @@ static void i915_emit_breadcrumb(struct drm_device *dev)
        }
 }
 
-static int i915_dispatch_cmdbuffer(struct drm_device * dev,
+static int i915_dispatch_cmdbuffer(struct drm_device *dev,
                                   drm_i915_cmdbuffer_t *cmd,
                                   struct drm_clip_rect *cliprects,
                                   void *cmdbuf)
@@ -487,8 +488,8 @@ static int i915_dispatch_cmdbuffer(struct drm_device * dev,
        return 0;
 }
 
-static int i915_dispatch_batchbuffer(struct drm_device * dev,
-                                    drm_i915_batchbuffer_t * batch,
+static int i915_dispatch_batchbuffer(struct drm_device *dev,
+                                    drm_i915_batchbuffer_t *batch,
                                     struct drm_clip_rect *cliprects)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
@@ -549,7 +550,7 @@ static int i915_dispatch_batchbuffer(struct drm_device * dev,
        return 0;
 }
 
-static int i915_dispatch_flip(struct drm_device * dev)
+static int i915_dispatch_flip(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct drm_i915_master_private *master_priv =
@@ -755,7 +756,7 @@ fail_batch_free:
        return ret;
 }
 
-static int i915_emit_irq(struct drm_device * dev)
+static int i915_emit_irq(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
@@ -781,7 +782,7 @@ static int i915_emit_irq(struct drm_device * dev)
        return dev_priv->dri1.counter;
 }
 
-static int i915_wait_irq(struct drm_device * dev, int irq_nr)
+static int i915_wait_irq(struct drm_device *dev, int irq_nr)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
@@ -1266,6 +1267,7 @@ static void i915_switcheroo_set_state(struct pci_dev *pdev, enum vga_switcheroo_
 {
        struct drm_device *dev = pci_get_drvdata(pdev);
        pm_message_t pmm = { .event = PM_EVENT_SUSPEND };
+
        if (state == VGA_SWITCHEROO_ON) {
                pr_info("switched on\n");
                dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
@@ -1338,6 +1340,8 @@ static int i915_load_modeset_init(struct drm_device *dev)
        if (ret)
                goto cleanup_gem_stolen;
 
+       dev_priv->pm._irqs_disabled = false;
+
        /* Important: The output setup functions called by modeset_init need
         * working irqs for e.g. gmbus and dp aux transfers. */
        intel_modeset_init(dev);
@@ -1375,9 +1379,6 @@ static int i915_load_modeset_init(struct drm_device *dev)
         */
        intel_fbdev_initial_config(dev);
 
-       /* Only enable hotplug handling once the fbdev is fully set up. */
-       dev_priv->enable_hotplug_processing = true;
-
        drm_kms_helper_poll_init(dev);
 
        return 0;
@@ -1425,15 +1426,16 @@ void i915_master_destroy(struct drm_device *dev, struct drm_master *master)
 }
 
 #if IS_ENABLED(CONFIG_FB)
-static void i915_kick_out_firmware_fb(struct drm_i915_private *dev_priv)
+static int i915_kick_out_firmware_fb(struct drm_i915_private *dev_priv)
 {
        struct apertures_struct *ap;
        struct pci_dev *pdev = dev_priv->dev->pdev;
        bool primary;
+       int ret;
 
        ap = alloc_apertures(1);
        if (!ap)
-               return;
+               return -ENOMEM;
 
        ap->ranges[0].base = dev_priv->gtt.mappable_base;
        ap->ranges[0].size = dev_priv->gtt.mappable_end;
@@ -1441,13 +1443,16 @@ static void i915_kick_out_firmware_fb(struct drm_i915_private *dev_priv)
        primary =
                pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW;
 
-       remove_conflicting_framebuffers(ap, "inteldrmfb", primary);
+       ret = remove_conflicting_framebuffers(ap, "inteldrmfb", primary);
 
        kfree(ap);
+
+       return ret;
 }
 #else
-static void i915_kick_out_firmware_fb(struct drm_i915_private *dev_priv)
+static int i915_kick_out_firmware_fb(struct drm_i915_private *dev_priv)
 {
+       return 0;
 }
 #endif
 
@@ -1492,10 +1497,11 @@ static void i915_dump_device_info(struct drm_i915_private *dev_priv)
 #define SEP_EMPTY
 #define PRINT_FLAG(name) info->name ? #name "," : ""
 #define SEP_COMMA ,
-       DRM_DEBUG_DRIVER("i915 device info: gen=%i, pciid=0x%04x flags="
+       DRM_DEBUG_DRIVER("i915 device info: gen=%i, pciid=0x%04x rev=0x%02x flags="
                         DEV_INFO_FOR_EACH_FLAG(PRINT_S, SEP_EMPTY),
                         info->gen,
                         dev_priv->dev->pdev->device,
+                        dev_priv->dev->pdev->revision,
                         DEV_INFO_FOR_EACH_FLAG(PRINT_FLAG, SEP_COMMA));
 #undef PRINT_S
 #undef SEP_EMPTY
@@ -1594,7 +1600,7 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
        if (dev_priv == NULL)
                return -ENOMEM;
 
-       dev->dev_private = (void *)dev_priv;
+       dev->dev_private = dev_priv;
        dev_priv->dev = dev;
 
        /* copy initial configuration to dev_priv->info */
@@ -1606,6 +1612,7 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
        spin_lock_init(&dev_priv->backlight_lock);
        spin_lock_init(&dev_priv->uncore.lock);
        spin_lock_init(&dev_priv->mm.object_stat_lock);
+       spin_lock_init(&dev_priv->mmio_flip_lock);
        mutex_init(&dev_priv->dpio_lock);
        mutex_init(&dev_priv->modeset_restore_lock);
 
@@ -1664,7 +1671,11 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
                        goto out_gtt;
                }
 
-               i915_kick_out_firmware_fb(dev_priv);
+               ret = i915_kick_out_firmware_fb(dev_priv);
+               if (ret) {
+                       DRM_ERROR("failed to remove conflicting framebuffer drivers\n");
+                       goto out_gtt;
+               }
        }
 
        pci_set_master(dev->pdev);
@@ -1717,6 +1728,13 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
                goto out_mtrrfree;
        }
 
+       dev_priv->dp_wq = alloc_ordered_workqueue("i915-dp", 0);
+       if (dev_priv->dp_wq == NULL) {
+               DRM_ERROR("Failed to create our dp workqueue.\n");
+               ret = -ENOMEM;
+               goto out_freewq;
+       }
+
        intel_irq_init(dev);
        intel_uncore_sanitize(dev);
 
@@ -1792,6 +1810,8 @@ out_gem_unload:
        intel_teardown_gmbus(dev);
        intel_teardown_mchbar(dev);
        pm_qos_remove_request(&dev_priv->pm_qos);
+       destroy_workqueue(dev_priv->dp_wq);
+out_freewq:
        destroy_workqueue(dev_priv->wq);
 out_mtrrfree:
        arch_phys_wc_del(dev_priv->gtt.mtrr);
@@ -1892,6 +1912,7 @@ int i915_driver_unload(struct drm_device *dev)
        intel_teardown_gmbus(dev);
        intel_teardown_mchbar(dev);
 
+       destroy_workqueue(dev_priv->dp_wq);
        destroy_workqueue(dev_priv->wq);
        pm_qos_remove_request(&dev_priv->pm_qos);
 
@@ -1933,7 +1954,7 @@ int i915_driver_open(struct drm_device *dev, struct drm_file *file)
  * and DMA structures, since the kernel won't be using them, and clea
  * up any GEM state.
  */
-void i915_driver_lastclose(struct drm_device * dev)
+void i915_driver_lastclose(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
 
@@ -1954,11 +1975,11 @@ void i915_driver_lastclose(struct drm_device * dev)
        i915_dma_cleanup(dev);
 }
 
-void i915_driver_preclose(struct drm_device * dev, struct drm_file *file_priv)
+void i915_driver_preclose(struct drm_device *dev, struct drm_file *file)
 {
        mutex_lock(&dev->struct_mutex);
-       i915_gem_context_close(dev, file_priv);
-       i915_gem_release(dev, file_priv);
+       i915_gem_context_close(dev, file);
+       i915_gem_release(dev, file);
        mutex_unlock(&dev->struct_mutex);
 }
 
@@ -2031,7 +2052,7 @@ int i915_max_ioctl = ARRAY_SIZE(i915_ioctls);
  * manage the gtt, we need to claim that all intel devices are agp.  For
  * otherwise the drm core refuses to initialize the agp support code.
  */
-int i915_driver_device_is_agp(struct drm_device * dev)
+int i915_driver_device_is_agp(struct drm_device *dev)
 {
        return 1;
 }
index 651e65e051c08a8e25189719aa38f6226f699271..ec96f9a9724c809363cd2cd88baf2cd7a31b9a3e 100644 (file)
@@ -28,6 +28,7 @@
  */
 
 #include <linux/device.h>
+#include <linux/acpi.h>
 #include <drm/drmP.h>
 #include <drm/i915_drm.h>
 #include "i915_drv.h"
@@ -46,8 +47,6 @@ static struct drm_driver driver;
                          PIPE_C_OFFSET, PIPE_EDP_OFFSET }, \
        .trans_offsets = { TRANSCODER_A_OFFSET, TRANSCODER_B_OFFSET, \
                           TRANSCODER_C_OFFSET, TRANSCODER_EDP_OFFSET }, \
-       .dpll_offsets = { DPLL_A_OFFSET, DPLL_B_OFFSET }, \
-       .dpll_md_offsets = { DPLL_A_MD_OFFSET, DPLL_B_MD_OFFSET }, \
        .palette_offsets = { PALETTE_A_OFFSET, PALETTE_B_OFFSET }
 
 #define GEN_CHV_PIPEOFFSETS \
@@ -55,10 +54,6 @@ static struct drm_driver driver;
                          CHV_PIPE_C_OFFSET }, \
        .trans_offsets = { TRANSCODER_A_OFFSET, TRANSCODER_B_OFFSET, \
                           CHV_TRANSCODER_C_OFFSET, }, \
-       .dpll_offsets = { DPLL_A_OFFSET, DPLL_B_OFFSET, \
-                         CHV_DPLL_C_OFFSET }, \
-       .dpll_md_offsets = { DPLL_A_MD_OFFSET, DPLL_B_MD_OFFSET, \
-                            CHV_DPLL_C_MD_OFFSET }, \
        .palette_offsets = { PALETTE_A_OFFSET, PALETTE_B_OFFSET, \
                             CHV_PALETTE_C_OFFSET }
 
@@ -308,6 +303,7 @@ static const struct intel_device_info intel_broadwell_d_info = {
        .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING,
        .has_llc = 1,
        .has_ddi = 1,
+       .has_fpga_dbg = 1,
        .has_fbc = 1,
        GEN_DEFAULT_PIPEOFFSETS,
        IVB_CURSOR_OFFSETS,
@@ -319,6 +315,7 @@ static const struct intel_device_info intel_broadwell_m_info = {
        .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING,
        .has_llc = 1,
        .has_ddi = 1,
+       .has_fpga_dbg = 1,
        .has_fbc = 1,
        GEN_DEFAULT_PIPEOFFSETS,
        IVB_CURSOR_OFFSETS,
@@ -330,6 +327,7 @@ static const struct intel_device_info intel_broadwell_gt3d_info = {
        .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING | BSD2_RING,
        .has_llc = 1,
        .has_ddi = 1,
+       .has_fpga_dbg = 1,
        .has_fbc = 1,
        GEN_DEFAULT_PIPEOFFSETS,
        IVB_CURSOR_OFFSETS,
@@ -341,6 +339,7 @@ static const struct intel_device_info intel_broadwell_gt3m_info = {
        .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING | BSD2_RING,
        .has_llc = 1,
        .has_ddi = 1,
+       .has_fpga_dbg = 1,
        .has_fbc = 1,
        GEN_DEFAULT_PIPEOFFSETS,
        IVB_CURSOR_OFFSETS,
@@ -499,8 +498,7 @@ static int i915_drm_freeze(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct drm_crtc *crtc;
-
-       intel_runtime_pm_get(dev_priv);
+       pci_power_t opregion_target_state;
 
        /* ignore lid events during suspend */
        mutex_lock(&dev_priv->modeset_restore_lock);
@@ -526,21 +524,23 @@ static int i915_drm_freeze(struct drm_device *dev)
                        return error;
                }
 
-               drm_irq_uninstall(dev);
-               dev_priv->enable_hotplug_processing = false;
-
-               intel_disable_gt_powersave(dev);
-
                /*
                 * Disable CRTCs directly since we want to preserve sw state
-                * for _thaw.
+                * for _thaw. Also, power gate the CRTC power wells.
                 */
                drm_modeset_lock_all(dev);
-               for_each_crtc(dev, crtc) {
-                       dev_priv->display.crtc_disable(crtc);
-               }
+               for_each_crtc(dev, crtc)
+                       intel_crtc_control(crtc, false);
                drm_modeset_unlock_all(dev);
 
+               intel_dp_mst_suspend(dev);
+
+               flush_delayed_work(&dev_priv->rps.delayed_resume_work);
+
+               intel_runtime_pm_disable_interrupts(dev);
+
+               intel_suspend_gt_powersave(dev);
+
                intel_modeset_suspend_hw(dev);
        }
 
@@ -548,8 +548,15 @@ static int i915_drm_freeze(struct drm_device *dev)
 
        i915_save_state(dev);
 
+       opregion_target_state = PCI_D3cold;
+#if IS_ENABLED(CONFIG_ACPI_SLEEP)
+       if (acpi_target_system_state() < ACPI_STATE_S3)
+               opregion_target_state = PCI_D1;
+#endif
+       intel_opregion_notify_adapter(dev, opregion_target_state);
+
+       intel_uncore_forcewake_reset(dev, false);
        intel_opregion_fini(dev);
-       intel_uncore_fini(dev);
 
        console_lock();
        intel_fbdev_set_suspend(dev, FBINFO_STATE_SUSPENDED);
@@ -557,6 +564,8 @@ static int i915_drm_freeze(struct drm_device *dev)
 
        dev_priv->suspend_count++;
 
+       intel_display_set_init_power(dev_priv, false);
+
        return 0;
 }
 
@@ -606,7 +615,10 @@ static int i915_drm_thaw_early(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
 
-       intel_uncore_early_sanitize(dev);
+       if (IS_HASWELL(dev) || IS_BROADWELL(dev))
+               hsw_disable_pc8(dev_priv);
+
+       intel_uncore_early_sanitize(dev, true);
        intel_uncore_sanitize(dev);
        intel_power_domains_init_hw(dev_priv);
 
@@ -639,11 +651,19 @@ static int __i915_drm_thaw(struct drm_device *dev, bool restore_gtt_mappings)
                }
                mutex_unlock(&dev->struct_mutex);
 
-               /* We need working interrupts for modeset enabling ... */
-               drm_irq_install(dev, dev->pdev->irq);
+               intel_runtime_pm_restore_interrupts(dev);
 
                intel_modeset_init_hw(dev);
 
+               {
+                       unsigned long irqflags;
+                       spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
+                       if (dev_priv->display.hpd_irq_setup)
+                               dev_priv->display.hpd_irq_setup(dev);
+                       spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
+               }
+
+               intel_dp_mst_resume(dev);
                drm_modeset_lock_all(dev);
                intel_modeset_setup_hw_state(dev, true);
                drm_modeset_unlock_all(dev);
@@ -655,7 +675,6 @@ static int __i915_drm_thaw(struct drm_device *dev, bool restore_gtt_mappings)
                 * notifications.
                 * */
                intel_hpd_init(dev);
-               dev_priv->enable_hotplug_processing = true;
                /* Config may have changed between suspend and resume */
                drm_helper_hpd_irq_event(dev);
        }
@@ -678,7 +697,8 @@ static int __i915_drm_thaw(struct drm_device *dev, bool restore_gtt_mappings)
        dev_priv->modeset_restore = MODESET_DONE;
        mutex_unlock(&dev_priv->modeset_restore_lock);
 
-       intel_runtime_pm_put(dev_priv);
+       intel_opregion_notify_adapter(dev, PCI_D0);
+
        return 0;
 }
 
@@ -887,6 +907,7 @@ static int i915_pm_suspend_late(struct device *dev)
 {
        struct pci_dev *pdev = to_pci_dev(dev);
        struct drm_device *drm_dev = pci_get_drvdata(pdev);
+       struct drm_i915_private *dev_priv = drm_dev->dev_private;
 
        /*
         * We have a suspedn ordering issue with the snd-hda driver also
@@ -900,6 +921,9 @@ static int i915_pm_suspend_late(struct device *dev)
        if (drm_dev->switch_power_state == DRM_SWITCH_POWER_OFF)
                return 0;
 
+       if (IS_HASWELL(drm_dev) || IS_BROADWELL(drm_dev))
+               hsw_enable_pc8(dev_priv);
+
        pci_disable_device(pdev);
        pci_set_power_state(pdev, PCI_D3hot);
 
index 1f7700897dfc1e1c98908d2b39bc0adefc5bd36d..4412f6a4383bd2af5df6d5119e3f0f044bed59e5 100644 (file)
@@ -53,7 +53,7 @@
 
 #define DRIVER_NAME            "i915"
 #define DRIVER_DESC            "Intel Graphics"
-#define DRIVER_DATE            "20080730"
+#define DRIVER_DATE            "20140725"
 
 enum pipe {
        INVALID_PIPE = -1,
@@ -129,6 +129,7 @@ enum intel_display_power_domain {
        POWER_DOMAIN_PORT_OTHER,
        POWER_DOMAIN_VGA,
        POWER_DOMAIN_AUDIO,
+       POWER_DOMAIN_PLLS,
        POWER_DOMAIN_INIT,
 
        POWER_DOMAIN_NUM,
@@ -178,14 +179,20 @@ enum hpd_pin {
        list_for_each_entry((intel_connector), &(dev)->mode_config.connector_list, base.head) \
                if ((intel_connector)->base.encoder == (__encoder))
 
+#define for_each_power_domain(domain, mask)                            \
+       for ((domain) = 0; (domain) < POWER_DOMAIN_NUM; (domain)++)     \
+               if ((1 << (domain)) & (mask))
+
 struct drm_i915_private;
 struct i915_mmu_object;
 
 enum intel_dpll_id {
        DPLL_ID_PRIVATE = -1, /* non-shared dpll in use */
        /* real shared dpll ids must be >= 0 */
-       DPLL_ID_PCH_PLL_A,
-       DPLL_ID_PCH_PLL_B,
+       DPLL_ID_PCH_PLL_A = 0,
+       DPLL_ID_PCH_PLL_B = 1,
+       DPLL_ID_WRPLL1 = 0,
+       DPLL_ID_WRPLL2 = 1,
 };
 #define I915_NUM_PLLS 2
 
@@ -194,6 +201,7 @@ struct intel_dpll_hw_state {
        uint32_t dpll_md;
        uint32_t fp0;
        uint32_t fp1;
+       uint32_t wrpll;
 };
 
 struct intel_shared_dpll {
@@ -204,6 +212,8 @@ struct intel_shared_dpll {
        /* should match the index in the dev_priv->shared_dplls array */
        enum intel_dpll_id id;
        struct intel_dpll_hw_state hw_state;
+       /* The mode_set hook is optional and should be used together with the
+        * intel_prepare_shared_dpll function. */
        void (*mode_set)(struct drm_i915_private *dev_priv,
                         struct intel_shared_dpll *pll);
        void (*enable)(struct drm_i915_private *dev_priv,
@@ -228,12 +238,6 @@ void intel_link_compute_m_n(int bpp, int nlanes,
                            int pixel_clock, int link_clock,
                            struct intel_link_m_n *m_n);
 
-struct intel_ddi_plls {
-       int spll_refcount;
-       int wrpll1_refcount;
-       int wrpll2_refcount;
-};
-
 /* Interface history:
  *
  * 1.1: Original.
@@ -310,6 +314,7 @@ struct drm_i915_error_state {
        u32 eir;
        u32 pgtbl_er;
        u32 ier;
+       u32 gtier[4];
        u32 ccid;
        u32 derrmr;
        u32 forcewake;
@@ -324,6 +329,7 @@ struct drm_i915_error_state {
        u64 fence[I915_MAX_NUM_FENCES];
        struct intel_overlay_error_state *overlay;
        struct intel_display_error_state *display;
+       struct drm_i915_error_object *semaphore_obj;
 
        struct drm_i915_error_ring {
                bool valid;
@@ -435,8 +441,8 @@ struct drm_i915_display_funcs {
        void (*update_wm)(struct drm_crtc *crtc);
        void (*update_sprite_wm)(struct drm_plane *plane,
                                 struct drm_crtc *crtc,
-                                uint32_t sprite_width, int pixel_size,
-                                bool enable, bool scaled);
+                                uint32_t sprite_width, uint32_t sprite_height,
+                                int pixel_size, bool enable, bool scaled);
        void (*modeset_global_resources)(struct drm_device *dev);
        /* Returns the active state of the crtc, and if the crtc is active,
         * fills out the pipe-config with the hw state. */
@@ -552,8 +558,6 @@ struct intel_device_info {
        /* Register offsets for the various display pipes and transcoders */
        int pipe_offsets[I915_MAX_TRANSCODERS];
        int trans_offsets[I915_MAX_TRANSCODERS];
-       int dpll_offsets[I915_MAX_PIPES];
-       int dpll_md_offsets[I915_MAX_PIPES];
        int palette_offsets[I915_MAX_PIPES];
        int cursor_offsets[I915_MAX_PIPES];
 };
@@ -586,28 +590,48 @@ struct i915_ctx_hang_stats {
 };
 
 /* This must match up with the value previously used for execbuf2.rsvd1. */
-#define DEFAULT_CONTEXT_ID 0
+#define DEFAULT_CONTEXT_HANDLE 0
+/**
+ * struct intel_context - as the name implies, represents a context.
+ * @ref: reference count.
+ * @user_handle: userspace tracking identity for this context.
+ * @remap_slice: l3 row remapping information.
+ * @file_priv: filp associated with this context (NULL for global default
+ *            context).
+ * @hang_stats: information about the role of this context in possible GPU
+ *             hangs.
+ * @vm: virtual memory space used by this context.
+ * @legacy_hw_ctx: render context backing object and whether it is correctly
+ *                initialized (legacy ring submission mechanism only).
+ * @link: link in the global list of contexts.
+ *
+ * Contexts are memory images used by the hardware to store copies of their
+ * internal state.
+ */
 struct intel_context {
        struct kref ref;
-       int id;
-       bool is_initialized;
+       int user_handle;
        uint8_t remap_slice;
        struct drm_i915_file_private *file_priv;
-       struct intel_engine_cs *last_ring;
-       struct drm_i915_gem_object *obj;
        struct i915_ctx_hang_stats hang_stats;
        struct i915_address_space *vm;
 
+       struct {
+               struct drm_i915_gem_object *rcs_state;
+               bool initialized;
+       } legacy_hw_ctx;
+
        struct list_head link;
 };
 
 struct i915_fbc {
        unsigned long size;
+       unsigned threshold;
        unsigned int fb_id;
        enum plane plane;
        int y;
 
-       struct drm_mm_node *compressed_fb;
+       struct drm_mm_node compressed_fb;
        struct drm_mm_node *compressed_llb;
 
        struct intel_fbc_work {
@@ -635,9 +659,15 @@ struct i915_drrs {
        struct intel_connector *connector;
 };
 
+struct intel_dp;
 struct i915_psr {
+       struct mutex lock;
        bool sink_support;
        bool source_ok;
+       struct intel_dp *enabled;
+       bool active;
+       struct delayed_work work;
+       unsigned busy_frontbuffer_bits;
 };
 
 enum intel_pch {
@@ -880,6 +910,12 @@ struct vlv_s0ix_state {
        u32 clock_gate_dis2;
 };
 
+struct intel_rps_ei {
+       u32 cz_clock;
+       u32 render_c0;
+       u32 media_c0;
+};
+
 struct intel_gen6_power_mgmt {
        /* work and pm_iir are protected by dev_priv->irq_lock */
        struct work_struct work;
@@ -903,6 +939,9 @@ struct intel_gen6_power_mgmt {
        u8 efficient_freq;      /* AKA RPe. Pre-determined balanced frequency */
        u8 rp1_freq;            /* "less than" RP0 power/freqency */
        u8 rp0_freq;            /* Non-overclocked max frequency. */
+       u32 cz_freq;
+
+       u32 ei_interrupt_count;
 
        int last_adj;
        enum { LOW_POWER, BETWEEN, HIGH_POWER } power;
@@ -910,6 +949,9 @@ struct intel_gen6_power_mgmt {
        bool enabled;
        struct delayed_work delayed_resume_work;
 
+       /* manual wa residency calculations */
+       struct intel_rps_ei up_ei, down_ei;
+
        /*
         * Protects RPS/RC6 register access and PCU communication.
         * Must be taken after struct_mutex if nested.
@@ -1230,6 +1272,7 @@ struct intel_vbt_data {
                u16 pwm_freq_hz;
                bool present;
                bool active_low_pwm;
+               u8 min_brightness;      /* min_brightness/255 of max */
        } backlight;
 
        /* MIPI DSI */
@@ -1299,7 +1342,7 @@ struct ilk_wm_values {
  */
 struct i915_runtime_pm {
        bool suspended;
-       bool irqs_disabled;
+       bool _irqs_disabled;
 };
 
 enum intel_pipe_crc_source {
@@ -1332,6 +1375,17 @@ struct intel_pipe_crc {
        wait_queue_head_t wq;
 };
 
+struct i915_frontbuffer_tracking {
+       struct mutex lock;
+
+       /*
+        * Tracking bits for delayed frontbuffer flushing du to gpu activity or
+        * scheduled flips.
+        */
+       unsigned busy_bits;
+       unsigned flip_bits;
+};
+
 struct drm_i915_private {
        struct drm_device *dev;
        struct kmem_cache *slab;
@@ -1363,6 +1417,7 @@ struct drm_i915_private {
 
        struct pci_dev *bridge_dev;
        struct intel_engine_cs ring[I915_NUM_RINGS];
+       struct drm_i915_gem_object *semaphore_obj;
        uint32_t last_seqno, next_seqno;
 
        drm_dma_handle_t *status_page_dmah;
@@ -1371,6 +1426,9 @@ struct drm_i915_private {
        /* protects the irq masks */
        spinlock_t irq_lock;
 
+       /* protects the mmio flip data */
+       spinlock_t mmio_flip_lock;
+
        bool display_irqs_enabled;
 
        /* To control wakeup latency, e.g. for irq-driven dp aux transfers. */
@@ -1390,7 +1448,6 @@ struct drm_i915_private {
        u32 pipestat_irq_mask[I915_MAX_PIPES];
 
        struct work_struct hotplug_work;
-       bool enable_hotplug_processing;
        struct {
                unsigned long hpd_last_jiffies;
                int hpd_cnt;
@@ -1467,7 +1524,6 @@ struct drm_i915_private {
 
        int num_shared_dpll;
        struct intel_shared_dpll shared_dplls[I915_NUM_PLLS];
-       struct intel_ddi_plls ddi_plls;
        int dpio_phy_iosf_port[I915_NUM_PHYS_VLV];
 
        /* Reclocking support */
@@ -1475,6 +1531,9 @@ struct drm_i915_private {
        bool lvds_downclock_avail;
        /* indicates the reduced downclock for LVDS*/
        int lvds_downclock;
+
+       struct i915_frontbuffer_tracking fb_tracking;
+
        u16 orig_clock;
 
        bool mchbar_need_disable;
@@ -1541,6 +1600,20 @@ struct drm_i915_private {
 
        struct i915_runtime_pm pm;
 
+       struct intel_digital_port *hpd_irq_port[I915_MAX_PORTS];
+       u32 long_hpd_port_mask;
+       u32 short_hpd_port_mask;
+       struct work_struct dig_port_work;
+
+       /*
+        * if we get a HPD irq from DP and a HPD irq from non-DP
+        * the non-DP HPD could block the workqueue on a mode config
+        * mutex getting, that userspace may have taken. However
+        * userspace is waiting on the DP workqueue to run which is
+        * blocked behind the non-DP one.
+        */
+       struct workqueue_struct *dp_wq;
+
        /* Old dri1 support infrastructure, beware the dragons ya fools entering
         * here! */
        struct i915_dri1_state dri1;
@@ -1592,6 +1665,28 @@ struct drm_i915_gem_object_ops {
        void (*release)(struct drm_i915_gem_object *);
 };
 
+/*
+ * Frontbuffer tracking bits. Set in obj->frontbuffer_bits while a gem bo is
+ * considered to be the frontbuffer for the given plane interface-vise. This
+ * doesn't mean that the hw necessarily already scans it out, but that any
+ * rendering (by the cpu or gpu) will land in the frontbuffer eventually.
+ *
+ * We have one bit per pipe and per scanout plane type.
+ */
+#define INTEL_FRONTBUFFER_BITS_PER_PIPE 4
+#define INTEL_FRONTBUFFER_BITS \
+       (INTEL_FRONTBUFFER_BITS_PER_PIPE * I915_MAX_PIPES)
+#define INTEL_FRONTBUFFER_PRIMARY(pipe) \
+       (1 << (INTEL_FRONTBUFFER_BITS_PER_PIPE * (pipe)))
+#define INTEL_FRONTBUFFER_CURSOR(pipe) \
+       (1 << (1 +(INTEL_FRONTBUFFER_BITS_PER_PIPE * (pipe))))
+#define INTEL_FRONTBUFFER_SPRITE(pipe) \
+       (1 << (2 +(INTEL_FRONTBUFFER_BITS_PER_PIPE * (pipe))))
+#define INTEL_FRONTBUFFER_OVERLAY(pipe) \
+       (1 << (3 +(INTEL_FRONTBUFFER_BITS_PER_PIPE * (pipe))))
+#define INTEL_FRONTBUFFER_ALL_MASK(pipe) \
+       (0xf << (INTEL_FRONTBUFFER_BITS_PER_PIPE * (pipe)))
+
 struct drm_i915_gem_object {
        struct drm_gem_object base;
 
@@ -1661,6 +1756,12 @@ struct drm_i915_gem_object {
        unsigned int pin_mappable:1;
        unsigned int pin_display:1;
 
+       /*
+        * Is the object to be mapped as read-only to the GPU
+        * Only honoured if hardware has relevant pte bit
+        */
+       unsigned long gt_ro:1;
+
        /*
         * Is the GPU currently using a fence to access this buffer,
         */
@@ -1673,6 +1774,8 @@ struct drm_i915_gem_object {
        unsigned int has_global_gtt_mapping:1;
        unsigned int has_dma_mapping:1;
 
+       unsigned int frontbuffer_bits:INTEL_FRONTBUFFER_BITS;
+
        struct sg_table *pages;
        int pages_pin_count;
 
@@ -1719,6 +1822,10 @@ struct drm_i915_gem_object {
 };
 #define to_intel_bo(x) container_of(x, struct drm_i915_gem_object, base)
 
+void i915_gem_track_fb(struct drm_i915_gem_object *old,
+                      struct drm_i915_gem_object *new,
+                      unsigned frontbuffer_bits);
+
 /**
  * Request queue structure.
  *
@@ -1940,10 +2047,8 @@ struct drm_i915_cmd_table {
 #define I915_NEED_GFX_HWS(dev) (INTEL_INFO(dev)->need_gfx_hws)
 
 #define HAS_HW_CONTEXTS(dev)   (INTEL_INFO(dev)->gen >= 6)
-#define HAS_ALIASING_PPGTT(dev)        (INTEL_INFO(dev)->gen >= 6 && \
-                                (!IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev)))
-#define HAS_PPGTT(dev)         (INTEL_INFO(dev)->gen >= 7 \
-                                && !IS_GEN8(dev))
+#define HAS_ALIASING_PPGTT(dev)        (INTEL_INFO(dev)->gen >= 6)
+#define HAS_PPGTT(dev)         (INTEL_INFO(dev)->gen >= 7 && !IS_GEN8(dev))
 #define USES_PPGTT(dev)                intel_enable_ppgtt(dev, false)
 #define USES_FULL_PPGTT(dev)   intel_enable_ppgtt(dev, true)
 
@@ -1998,6 +2103,8 @@ struct drm_i915_cmd_table {
 #define HAS_PCH_NOP(dev) (INTEL_PCH_TYPE(dev) == PCH_NOP)
 #define HAS_PCH_SPLIT(dev) (INTEL_PCH_TYPE(dev) != PCH_NONE)
 
+#define HAS_GMCH_DISPLAY(dev) (INTEL_INFO(dev)->gen < 5 || IS_VALLEYVIEW(dev))
+
 /* DPF == dynamic parity feature */
 #define HAS_L3_DPF(dev) (IS_IVYBRIDGE(dev) || IS_HASWELL(dev))
 #define NUM_L3_SLICES(dev) (IS_HSW_GT3(dev) ? 2 : HAS_L3_DPF(dev))
@@ -2040,6 +2147,8 @@ struct i915_params {
        bool reset;
        bool disable_display;
        bool disable_vtd_wa;
+       int use_mmio_flip;
+       bool mmio_debug;
 };
 extern struct i915_params i915 __read_mostly;
 
@@ -2048,12 +2157,12 @@ void i915_update_dri1_breadcrumb(struct drm_device *dev);
 extern void i915_kernel_lost_context(struct drm_device * dev);
 extern int i915_driver_load(struct drm_device *, unsigned long flags);
 extern int i915_driver_unload(struct drm_device *);
-extern int i915_driver_open(struct drm_device *dev, struct drm_file *file_priv);
+extern int i915_driver_open(struct drm_device *dev, struct drm_file *file);
 extern void i915_driver_lastclose(struct drm_device * dev);
 extern void i915_driver_preclose(struct drm_device *dev,
-                                struct drm_file *file_priv);
+                                struct drm_file *file);
 extern void i915_driver_postclose(struct drm_device *dev,
-                                 struct drm_file *file_priv);
+                                 struct drm_file *file);
 extern int i915_driver_device_is_agp(struct drm_device * dev);
 #ifdef CONFIG_COMPAT
 extern long i915_compat_ioctl(struct file *filp, unsigned int cmd,
@@ -2084,10 +2193,12 @@ extern void intel_irq_init(struct drm_device *dev);
 extern void intel_hpd_init(struct drm_device *dev);
 
 extern void intel_uncore_sanitize(struct drm_device *dev);
-extern void intel_uncore_early_sanitize(struct drm_device *dev);
+extern void intel_uncore_early_sanitize(struct drm_device *dev,
+                                       bool restore_forcewake);
 extern void intel_uncore_init(struct drm_device *dev);
 extern void intel_uncore_check_errors(struct drm_device *dev);
 extern void intel_uncore_fini(struct drm_device *dev);
+extern void intel_uncore_forcewake_reset(struct drm_device *dev, bool restore);
 
 void
 i915_enable_pipestat(struct drm_i915_private *dev_priv, enum pipe pipe,
@@ -2235,6 +2346,8 @@ bool i915_gem_retire_requests(struct drm_device *dev);
 void i915_gem_retire_requests_ring(struct intel_engine_cs *ring);
 int __must_check i915_gem_check_wedge(struct i915_gpu_error *error,
                                      bool interruptible);
+int __must_check i915_gem_check_olr(struct intel_engine_cs *ring, u32 seqno);
+
 static inline bool i915_reset_in_progress(struct i915_gpu_error *error)
 {
        return unlikely(atomic_read(&error->reset_counter)
@@ -2404,7 +2517,7 @@ static inline void i915_gem_context_unreference(struct intel_context *ctx)
 
 static inline bool i915_gem_context_is_default(const struct intel_context *c)
 {
-       return c->id == DEFAULT_CONTEXT_ID;
+       return c->user_handle == DEFAULT_CONTEXT_HANDLE;
 }
 
 int i915_gem_context_create_ioctl(struct drm_device *dev, void *data,
@@ -2435,7 +2548,7 @@ static inline void i915_gem_chipset_flush(struct drm_device *dev)
 
 /* i915_gem_stolen.c */
 int i915_gem_init_stolen(struct drm_device *dev);
-int i915_gem_stolen_setup_compression(struct drm_device *dev, int size);
+int i915_gem_stolen_setup_compression(struct drm_device *dev, int size, int fb_cpp);
 void i915_gem_stolen_cleanup_compression(struct drm_device *dev);
 void i915_gem_cleanup_stolen(struct drm_device *dev);
 struct drm_i915_gem_object *
@@ -2445,7 +2558,6 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_device *dev,
                                               u32 stolen_offset,
                                               u32 gtt_offset,
                                               u32 size);
-void i915_gem_object_release_stolen(struct drm_i915_gem_object *obj);
 
 /* i915_gem_tiling.c */
 static inline bool i915_gem_object_needs_bit17_swizzle(struct drm_i915_gem_object *obj)
@@ -2593,8 +2705,8 @@ extern bool ironlake_set_drps(struct drm_device *dev, u8 val);
 extern void intel_init_pch_refclk(struct drm_device *dev);
 extern void gen6_set_rps(struct drm_device *dev, u8 val);
 extern void valleyview_set_rps(struct drm_device *dev, u8 val);
-extern int valleyview_rps_max_freq(struct drm_i915_private *dev_priv);
-extern int valleyview_rps_min_freq(struct drm_i915_private *dev_priv);
+extern void intel_set_memory_cxsr(struct drm_i915_private *dev_priv,
+                                 bool enable);
 extern void intel_detect_pch(struct drm_device *dev);
 extern int intel_trans_dp_port_sel(struct drm_crtc *crtc);
 extern int intel_enable_rc6(const struct drm_device *dev);
@@ -2605,6 +2717,8 @@ int i915_reg_read_ioctl(struct drm_device *dev, void *data,
 int i915_get_reset_stats_ioctl(struct drm_device *dev, void *data,
                               struct drm_file *file);
 
+void intel_notify_mmio_flip(struct intel_engine_cs *ring);
+
 /* overlay */
 extern struct intel_overlay_error_state *intel_overlay_capture_error_state(struct drm_device *dev);
 extern void intel_overlay_print_error_state(struct drm_i915_error_state_buf *e,
@@ -2700,10 +2814,10 @@ int vlv_freq_opcode(struct drm_i915_private *dev_priv, int val);
 
 static inline uint32_t i915_vgacntrl_reg(struct drm_device *dev)
 {
-       if (HAS_PCH_SPLIT(dev))
-               return CPU_VGACNTRL;
-       else if (IS_VALLEYVIEW(dev))
+       if (IS_VALLEYVIEW(dev))
                return VLV_VGACNTRL;
+       else if (INTEL_INFO(dev)->gen >= 5)
+               return CPU_VGACNTRL;
        else
                return VGACNTRL;
 }
index f247d922e44a3dfaf1669e3a4d67814b82e62934..ba7f5c6bb50d1f7e5b886ea20e74ed58a9ae5247 100644 (file)
@@ -1095,7 +1095,7 @@ i915_gem_check_wedge(struct i915_gpu_error *error,
  * Compare seqno against outstanding lazy request. Emit a request if they are
  * equal.
  */
-static int
+int
 i915_gem_check_olr(struct intel_engine_cs *ring, u32 seqno)
 {
        int ret;
@@ -1161,14 +1161,14 @@ static int __wait_seqno(struct intel_engine_cs *ring, u32 seqno,
        s64 before, now;
        int ret;
 
-       WARN(dev_priv->pm.irqs_disabled, "IRQs disabled\n");
+       WARN(!intel_irqs_enabled(dev_priv), "IRQs disabled");
 
        if (i915_seqno_passed(ring->get_seqno(ring, true), seqno))
                return 0;
 
        timeout_expire = timeout ? jiffies + nsecs_to_jiffies((u64)*timeout) : 0;
 
-       if (INTEL_INFO(dev)->gen >= 6 && can_wait_boost(file_priv)) {
+       if (INTEL_INFO(dev)->gen >= 6 && ring->id == RCS && can_wait_boost(file_priv)) {
                gen6_rps_boost(dev_priv);
                if (file_priv)
                        mod_delayed_work(dev_priv->wq,
@@ -1560,14 +1560,29 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
        if (ret)
                goto unpin;
 
-       obj->fault_mappable = true;
-
+       /* Finally, remap it using the new GTT offset */
        pfn = dev_priv->gtt.mappable_base + i915_gem_obj_ggtt_offset(obj);
        pfn >>= PAGE_SHIFT;
-       pfn += page_offset;
 
-       /* Finally, remap it using the new GTT offset */
-       ret = vm_insert_pfn(vma, (unsigned long)vmf->virtual_address, pfn);
+       if (!obj->fault_mappable) {
+               unsigned long size = min_t(unsigned long,
+                                          vma->vm_end - vma->vm_start,
+                                          obj->base.size);
+               int i;
+
+               for (i = 0; i < size >> PAGE_SHIFT; i++) {
+                       ret = vm_insert_pfn(vma,
+                                           (unsigned long)vma->vm_start + i * PAGE_SIZE,
+                                           pfn + i);
+                       if (ret)
+                               break;
+               }
+
+               obj->fault_mappable = true;
+       } else
+               ret = vm_insert_pfn(vma,
+                                   (unsigned long)vmf->virtual_address,
+                                   pfn + page_offset);
 unpin:
        i915_gem_object_ggtt_unpin(obj);
 unlock:
@@ -2051,16 +2066,10 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj)
                         * our own buffer, now let the real VM do its job and
                         * go down in flames if truly OOM.
                         */
-                       gfp &= ~(__GFP_NORETRY | __GFP_NOWARN | __GFP_NO_KSWAPD);
-                       gfp |= __GFP_IO | __GFP_WAIT;
-
                        i915_gem_shrink_all(dev_priv);
-                       page = shmem_read_mapping_page_gfp(mapping, i, gfp);
+                       page = shmem_read_mapping_page(mapping, i);
                        if (IS_ERR(page))
                                goto err_pages;
-
-                       gfp |= __GFP_NORETRY | __GFP_NOWARN | __GFP_NO_KSWAPD;
-                       gfp &= ~(__GFP_IO | __GFP_WAIT);
                }
 #ifdef CONFIG_SWIOTLB
                if (swiotlb_nr_tbl()) {
@@ -2209,6 +2218,8 @@ i915_gem_object_move_to_inactive(struct drm_i915_gem_object *obj)
                        list_move_tail(&vma->mm_list, &vm->inactive_list);
        }
 
+       intel_fb_obj_flush(obj, true);
+
        list_del_init(&obj->ring_list);
        obj->ring = NULL;
 
@@ -2318,7 +2329,7 @@ int __i915_add_request(struct intel_engine_cs *ring,
        u32 request_ring_position, request_start;
        int ret;
 
-       request_start = intel_ring_get_tail(ring);
+       request_start = intel_ring_get_tail(ring->buffer);
        /*
         * Emit any outstanding flushes - execbuf can fail to emit the flush
         * after having emitted the batchbuffer command. Hence we need to fix
@@ -2339,7 +2350,7 @@ int __i915_add_request(struct intel_engine_cs *ring,
         * GPU processing the request, we never over-estimate the
         * position of the head.
         */
-       request_ring_position = intel_ring_get_tail(ring);
+       request_ring_position = intel_ring_get_tail(ring->buffer);
 
        ret = ring->add_request(ring);
        if (ret)
@@ -2822,6 +2833,8 @@ i915_gem_object_sync(struct drm_i915_gem_object *obj,
        idx = intel_ring_sync_index(from, to);
 
        seqno = obj->last_read_seqno;
+       /* Optimization: Avoid semaphore sync when we are sure we already
+        * waited for an object with higher seqno */
        if (seqno <= from->semaphore.sync_seqno[idx])
                return 0;
 
@@ -2905,8 +2918,6 @@ int i915_vma_unbind(struct i915_vma *vma)
 
        vma->unbind_vma(vma);
 
-       i915_gem_gtt_finish_object(obj);
-
        list_del_init(&vma->mm_list);
        /* Avoid an unnecessary call to unbind on rebind. */
        if (i915_is_ggtt(vma->vm))
@@ -2917,8 +2928,10 @@ int i915_vma_unbind(struct i915_vma *vma)
 
        /* Since the unbound list is global, only move to that list if
         * no more VMAs exist. */
-       if (list_empty(&obj->vma_list))
+       if (list_empty(&obj->vma_list)) {
+               i915_gem_gtt_finish_object(obj);
                list_move_tail(&obj->global_list, &dev_priv->mm.unbound_list);
+       }
 
        /* And finally now the object is completely decoupled from this vma,
         * we can drop its hold on the backing storage and allow it to be
@@ -3530,6 +3543,8 @@ i915_gem_object_flush_gtt_write_domain(struct drm_i915_gem_object *obj)
        old_write_domain = obj->base.write_domain;
        obj->base.write_domain = 0;
 
+       intel_fb_obj_flush(obj, false);
+
        trace_i915_gem_object_change_domain(obj,
                                            obj->base.read_domains,
                                            old_write_domain);
@@ -3551,6 +3566,8 @@ i915_gem_object_flush_cpu_write_domain(struct drm_i915_gem_object *obj,
        old_write_domain = obj->base.write_domain;
        obj->base.write_domain = 0;
 
+       intel_fb_obj_flush(obj, false);
+
        trace_i915_gem_object_change_domain(obj,
                                            obj->base.read_domains,
                                            old_write_domain);
@@ -3604,6 +3621,9 @@ i915_gem_object_set_to_gtt_domain(struct drm_i915_gem_object *obj, bool write)
                obj->dirty = 1;
        }
 
+       if (write)
+               intel_fb_obj_invalidate(obj, NULL);
+
        trace_i915_gem_object_change_domain(obj,
                                            old_read_domains,
                                            old_write_domain);
@@ -3940,6 +3960,9 @@ i915_gem_object_set_to_cpu_domain(struct drm_i915_gem_object *obj, bool write)
                obj->base.write_domain = I915_GEM_DOMAIN_CPU;
        }
 
+       if (write)
+               intel_fb_obj_invalidate(obj, NULL);
+
        trace_i915_gem_object_change_domain(obj,
                                            old_read_domains,
                                            old_write_domain);
@@ -4428,13 +4451,14 @@ void i915_gem_free_object(struct drm_gem_object *gem_obj)
        if (obj->stolen)
                i915_gem_object_unpin_pages(obj);
 
+       WARN_ON(obj->frontbuffer_bits);
+
        if (WARN_ON(obj->pages_pin_count))
                obj->pages_pin_count = 0;
        if (discard_backing_storage(obj))
                obj->madv = I915_MADV_DONTNEED;
        i915_gem_object_put_pages(obj);
        i915_gem_object_free_mmap_offset(obj);
-       i915_gem_object_release_stolen(obj);
 
        BUG_ON(obj->pages);
 
@@ -4521,7 +4545,7 @@ i915_gem_suspend(struct drm_device *dev)
 
        del_timer_sync(&dev_priv->gpu_error.hangcheck_timer);
        cancel_delayed_work_sync(&dev_priv->mm.retire_work);
-       cancel_delayed_work_sync(&dev_priv->mm.idle_work);
+       flush_delayed_work(&dev_priv->mm.idle_work);
 
        return 0;
 
@@ -4912,6 +4936,8 @@ i915_gem_load(struct drm_device *dev)
 
        dev_priv->mm.oom_notifier.notifier_call = i915_gem_shrinker_oom;
        register_oom_notifier(&dev_priv->mm.oom_notifier);
+
+       mutex_init(&dev_priv->fb_tracking.lock);
 }
 
 void i915_gem_release(struct drm_device *dev, struct drm_file *file)
@@ -4973,6 +4999,23 @@ int i915_gem_open(struct drm_device *dev, struct drm_file *file)
        return ret;
 }
 
+void i915_gem_track_fb(struct drm_i915_gem_object *old,
+                      struct drm_i915_gem_object *new,
+                      unsigned frontbuffer_bits)
+{
+       if (old) {
+               WARN_ON(!mutex_is_locked(&old->base.dev->struct_mutex));
+               WARN_ON(!(old->frontbuffer_bits & frontbuffer_bits));
+               old->frontbuffer_bits &= ~frontbuffer_bits;
+       }
+
+       if (new) {
+               WARN_ON(!mutex_is_locked(&new->base.dev->struct_mutex));
+               WARN_ON(new->frontbuffer_bits & frontbuffer_bits);
+               new->frontbuffer_bits |= frontbuffer_bits;
+       }
+}
+
 static bool mutex_is_locked_by(struct mutex *mutex, struct task_struct *task)
 {
        if (!mutex_is_locked(mutex))
@@ -5055,12 +5098,13 @@ unsigned long i915_gem_obj_offset(struct drm_i915_gem_object *o,
            vm == &dev_priv->mm.aliasing_ppgtt->base)
                vm = &dev_priv->gtt.base;
 
-       BUG_ON(list_empty(&o->vma_list));
        list_for_each_entry(vma, &o->vma_list, vma_link) {
                if (vma->vm == vm)
                        return vma->node.start;
 
        }
+       WARN(1, "%s vma for this object not found.\n",
+            i915_is_ggtt(vm) ? "global" : "ppgtt");
        return -1;
 }
 
@@ -5141,8 +5185,11 @@ i915_gem_shrinker_oom(struct notifier_block *nb, unsigned long event, void *ptr)
        bool was_interruptible;
        bool unlock;
 
-       while (!i915_gem_shrinker_lock(dev, &unlock) && --timeout)
+       while (!i915_gem_shrinker_lock(dev, &unlock) && --timeout) {
                schedule_timeout_killable(1);
+               if (fatal_signal_pending(current))
+                       return NOTIFY_DONE;
+       }
        if (timeout == 0) {
                pr_err("Unable to purge GPU memory due lock contention.\n");
                return NOTIFY_DONE;
index a5ddf3bce9c3fe06e3338b8b1c15e86405f312df..3b99390e467aa3bfabcfb99438d66981ec2509c0 100644 (file)
@@ -182,22 +182,50 @@ void i915_gem_context_free(struct kref *ctx_ref)
                                                   typeof(*ctx), ref);
        struct i915_hw_ppgtt *ppgtt = NULL;
 
-       if (ctx->obj) {
+       if (ctx->legacy_hw_ctx.rcs_state) {
                /* We refcount even the aliasing PPGTT to keep the code symmetric */
-               if (USES_PPGTT(ctx->obj->base.dev))
+               if (USES_PPGTT(ctx->legacy_hw_ctx.rcs_state->base.dev))
                        ppgtt = ctx_to_ppgtt(ctx);
-
-               /* XXX: Free up the object before tearing down the address space, in
-                * case we're bound in the PPGTT */
-               drm_gem_object_unreference(&ctx->obj->base);
        }
 
        if (ppgtt)
                kref_put(&ppgtt->ref, ppgtt_release);
+       if (ctx->legacy_hw_ctx.rcs_state)
+               drm_gem_object_unreference(&ctx->legacy_hw_ctx.rcs_state->base);
        list_del(&ctx->link);
        kfree(ctx);
 }
 
+static struct drm_i915_gem_object *
+i915_gem_alloc_context_obj(struct drm_device *dev, size_t size)
+{
+       struct drm_i915_gem_object *obj;
+       int ret;
+
+       obj = i915_gem_alloc_object(dev, size);
+       if (obj == NULL)
+               return ERR_PTR(-ENOMEM);
+
+       /*
+        * Try to make the context utilize L3 as well as LLC.
+        *
+        * On VLV we don't have L3 controls in the PTEs so we
+        * shouldn't touch the cache level, especially as that
+        * would make the object snooped which might have a
+        * negative performance impact.
+        */
+       if (INTEL_INFO(dev)->gen >= 7 && !IS_VALLEYVIEW(dev)) {
+               ret = i915_gem_object_set_cache_level(obj, I915_CACHE_L3_LLC);
+               /* Failure shouldn't ever happen this early */
+               if (WARN_ON(ret)) {
+                       drm_gem_object_unreference(&obj->base);
+                       return ERR_PTR(ret);
+               }
+       }
+
+       return obj;
+}
+
 static struct i915_hw_ppgtt *
 create_vm_for_ctx(struct drm_device *dev, struct intel_context *ctx)
 {
@@ -234,40 +262,26 @@ __create_hw_context(struct drm_device *dev,
        list_add_tail(&ctx->link, &dev_priv->context_list);
 
        if (dev_priv->hw_context_size) {
-               ctx->obj = i915_gem_alloc_object(dev, dev_priv->hw_context_size);
-               if (ctx->obj == NULL) {
-                       ret = -ENOMEM;
+               struct drm_i915_gem_object *obj =
+                               i915_gem_alloc_context_obj(dev, dev_priv->hw_context_size);
+               if (IS_ERR(obj)) {
+                       ret = PTR_ERR(obj);
                        goto err_out;
                }
-
-               /*
-                * Try to make the context utilize L3 as well as LLC.
-                *
-                * On VLV we don't have L3 controls in the PTEs so we
-                * shouldn't touch the cache level, especially as that
-                * would make the object snooped which might have a
-                * negative performance impact.
-                */
-               if (INTEL_INFO(dev)->gen >= 7 && !IS_VALLEYVIEW(dev)) {
-                       ret = i915_gem_object_set_cache_level(ctx->obj,
-                                                             I915_CACHE_L3_LLC);
-                       /* Failure shouldn't ever happen this early */
-                       if (WARN_ON(ret))
-                               goto err_out;
-               }
+               ctx->legacy_hw_ctx.rcs_state = obj;
        }
 
        /* Default context will never have a file_priv */
        if (file_priv != NULL) {
                ret = idr_alloc(&file_priv->context_idr, ctx,
-                               DEFAULT_CONTEXT_ID, 0, GFP_KERNEL);
+                               DEFAULT_CONTEXT_HANDLE, 0, GFP_KERNEL);
                if (ret < 0)
                        goto err_out;
        } else
-               ret = DEFAULT_CONTEXT_ID;
+               ret = DEFAULT_CONTEXT_HANDLE;
 
        ctx->file_priv = file_priv;
-       ctx->id = ret;
+       ctx->user_handle = ret;
        /* NB: Mark all slices as needing a remap so that when the context first
         * loads it will restore whatever remap state already exists. If there
         * is no remap info, it will be a NOP. */
@@ -301,7 +315,7 @@ i915_gem_create_context(struct drm_device *dev,
        if (IS_ERR(ctx))
                return ctx;
 
-       if (is_global_default_ctx && ctx->obj) {
+       if (is_global_default_ctx && ctx->legacy_hw_ctx.rcs_state) {
                /* We may need to do things with the shrinker which
                 * require us to immediately switch back to the default
                 * context. This can cause a problem as pinning the
@@ -309,7 +323,7 @@ i915_gem_create_context(struct drm_device *dev,
                 * be available. To avoid this we always pin the default
                 * context.
                 */
-               ret = i915_gem_obj_ggtt_pin(ctx->obj,
+               ret = i915_gem_obj_ggtt_pin(ctx->legacy_hw_ctx.rcs_state,
                                            get_context_alignment(dev), 0);
                if (ret) {
                        DRM_DEBUG_DRIVER("Couldn't pin %d\n", ret);
@@ -349,8 +363,8 @@ i915_gem_create_context(struct drm_device *dev,
        return ctx;
 
 err_unpin:
-       if (is_global_default_ctx && ctx->obj)
-               i915_gem_object_ggtt_unpin(ctx->obj);
+       if (is_global_default_ctx && ctx->legacy_hw_ctx.rcs_state)
+               i915_gem_object_ggtt_unpin(ctx->legacy_hw_ctx.rcs_state);
 err_destroy:
        i915_gem_context_unreference(ctx);
        return ERR_PTR(ret);
@@ -366,23 +380,27 @@ void i915_gem_context_reset(struct drm_device *dev)
        for (i = 0; i < I915_NUM_RINGS; i++) {
                struct intel_engine_cs *ring = &dev_priv->ring[i];
                struct intel_context *dctx = ring->default_context;
+               struct intel_context *lctx = ring->last_context;
 
                /* Do a fake switch to the default context */
-               if (ring->last_context == dctx)
+               if (lctx == dctx)
                        continue;
 
-               if (!ring->last_context)
+               if (!lctx)
                        continue;
 
-               if (dctx->obj && i == RCS) {
-                       WARN_ON(i915_gem_obj_ggtt_pin(dctx->obj,
+               if (dctx->legacy_hw_ctx.rcs_state && i == RCS) {
+                       WARN_ON(i915_gem_obj_ggtt_pin(dctx->legacy_hw_ctx.rcs_state,
                                                      get_context_alignment(dev), 0));
                        /* Fake a finish/inactive */
-                       dctx->obj->base.write_domain = 0;
-                       dctx->obj->active = 0;
+                       dctx->legacy_hw_ctx.rcs_state->base.write_domain = 0;
+                       dctx->legacy_hw_ctx.rcs_state->active = 0;
                }
 
-               i915_gem_context_unreference(ring->last_context);
+               if (lctx->legacy_hw_ctx.rcs_state && i == RCS)
+                       i915_gem_object_ggtt_unpin(lctx->legacy_hw_ctx.rcs_state);
+
+               i915_gem_context_unreference(lctx);
                i915_gem_context_reference(dctx);
                ring->last_context = dctx;
        }
@@ -429,7 +447,7 @@ void i915_gem_context_fini(struct drm_device *dev)
        struct intel_context *dctx = dev_priv->ring[RCS].default_context;
        int i;
 
-       if (dctx->obj) {
+       if (dctx->legacy_hw_ctx.rcs_state) {
                /* The only known way to stop the gpu from accessing the hw context is
                 * to reset it. Do this as the very last operation to avoid confusing
                 * other code, leading to spurious errors. */
@@ -444,13 +462,13 @@ void i915_gem_context_fini(struct drm_device *dev)
                WARN_ON(!dev_priv->ring[RCS].last_context);
                if (dev_priv->ring[RCS].last_context == dctx) {
                        /* Fake switch to NULL context */
-                       WARN_ON(dctx->obj->active);
-                       i915_gem_object_ggtt_unpin(dctx->obj);
+                       WARN_ON(dctx->legacy_hw_ctx.rcs_state->active);
+                       i915_gem_object_ggtt_unpin(dctx->legacy_hw_ctx.rcs_state);
                        i915_gem_context_unreference(dctx);
                        dev_priv->ring[RCS].last_context = NULL;
                }
 
-               i915_gem_object_ggtt_unpin(dctx->obj);
+               i915_gem_object_ggtt_unpin(dctx->legacy_hw_ctx.rcs_state);
        }
 
        for (i = 0; i < I915_NUM_RINGS; i++) {
@@ -570,7 +588,7 @@ mi_set_context(struct intel_engine_cs *ring,
 
        intel_ring_emit(ring, MI_NOOP);
        intel_ring_emit(ring, MI_SET_CONTEXT);
-       intel_ring_emit(ring, i915_gem_obj_ggtt_offset(new_context->obj) |
+       intel_ring_emit(ring, i915_gem_obj_ggtt_offset(new_context->legacy_hw_ctx.rcs_state) |
                        MI_MM_SPACE_GTT |
                        MI_SAVE_EXT_STATE_EN |
                        MI_RESTORE_EXT_STATE_EN |
@@ -602,16 +620,16 @@ static int do_switch(struct intel_engine_cs *ring,
        int ret, i;
 
        if (from != NULL && ring == &dev_priv->ring[RCS]) {
-               BUG_ON(from->obj == NULL);
-               BUG_ON(!i915_gem_obj_is_pinned(from->obj));
+               BUG_ON(from->legacy_hw_ctx.rcs_state == NULL);
+               BUG_ON(!i915_gem_obj_is_pinned(from->legacy_hw_ctx.rcs_state));
        }
 
-       if (from == to && from->last_ring == ring && !to->remap_slice)
+       if (from == to && !to->remap_slice)
                return 0;
 
        /* Trying to pin first makes error handling easier. */
        if (ring == &dev_priv->ring[RCS]) {
-               ret = i915_gem_obj_ggtt_pin(to->obj,
+               ret = i915_gem_obj_ggtt_pin(to->legacy_hw_ctx.rcs_state,
                                            get_context_alignment(ring->dev), 0);
                if (ret)
                        return ret;
@@ -644,17 +662,17 @@ static int do_switch(struct intel_engine_cs *ring,
         *
         * XXX: We need a real interface to do this instead of trickery.
         */
-       ret = i915_gem_object_set_to_gtt_domain(to->obj, false);
+       ret = i915_gem_object_set_to_gtt_domain(to->legacy_hw_ctx.rcs_state, false);
        if (ret)
                goto unpin_out;
 
-       if (!to->obj->has_global_gtt_mapping) {
-               struct i915_vma *vma = i915_gem_obj_to_vma(to->obj,
+       if (!to->legacy_hw_ctx.rcs_state->has_global_gtt_mapping) {
+               struct i915_vma *vma = i915_gem_obj_to_vma(to->legacy_hw_ctx.rcs_state,
                                                           &dev_priv->gtt.base);
-               vma->bind_vma(vma, to->obj->cache_level, GLOBAL_BIND);
+               vma->bind_vma(vma, to->legacy_hw_ctx.rcs_state->cache_level, GLOBAL_BIND);
        }
 
-       if (!to->is_initialized || i915_gem_context_is_default(to))
+       if (!to->legacy_hw_ctx.initialized || i915_gem_context_is_default(to))
                hw_flags |= MI_RESTORE_INHIBIT;
 
        ret = mi_set_context(ring, to, hw_flags);
@@ -680,8 +698,8 @@ static int do_switch(struct intel_engine_cs *ring,
         * MI_SET_CONTEXT instead of when the next seqno has completed.
         */
        if (from != NULL) {
-               from->obj->base.read_domains = I915_GEM_DOMAIN_INSTRUCTION;
-               i915_vma_move_to_active(i915_gem_obj_to_ggtt(from->obj), ring);
+               from->legacy_hw_ctx.rcs_state->base.read_domains = I915_GEM_DOMAIN_INSTRUCTION;
+               i915_vma_move_to_active(i915_gem_obj_to_ggtt(from->legacy_hw_ctx.rcs_state), ring);
                /* As long as MI_SET_CONTEXT is serializing, ie. it flushes the
                 * whole damn pipeline, we don't need to explicitly mark the
                 * object dirty. The only exception is that the context must be
@@ -689,21 +707,20 @@ static int do_switch(struct intel_engine_cs *ring,
                 * able to defer doing this until we know the object would be
                 * swapped, but there is no way to do that yet.
                 */
-               from->obj->dirty = 1;
-               BUG_ON(from->obj->ring != ring);
+               from->legacy_hw_ctx.rcs_state->dirty = 1;
+               BUG_ON(from->legacy_hw_ctx.rcs_state->ring != ring);
 
                /* obj is kept alive until the next request by its active ref */
-               i915_gem_object_ggtt_unpin(from->obj);
+               i915_gem_object_ggtt_unpin(from->legacy_hw_ctx.rcs_state);
                i915_gem_context_unreference(from);
        }
 
-       uninitialized = !to->is_initialized && from == NULL;
-       to->is_initialized = true;
+       uninitialized = !to->legacy_hw_ctx.initialized && from == NULL;
+       to->legacy_hw_ctx.initialized = true;
 
 done:
        i915_gem_context_reference(to);
        ring->last_context = to;
-       to->last_ring = ring;
 
        if (uninitialized) {
                ret = i915_gem_render_state_init(ring);
@@ -715,7 +732,7 @@ done:
 
 unpin_out:
        if (ring->id == RCS)
-               i915_gem_object_ggtt_unpin(to->obj);
+               i915_gem_object_ggtt_unpin(to->legacy_hw_ctx.rcs_state);
        return ret;
 }
 
@@ -736,7 +753,7 @@ int i915_switch_context(struct intel_engine_cs *ring,
 
        WARN_ON(!mutex_is_locked(&dev_priv->dev->struct_mutex));
 
-       if (to->obj == NULL) { /* We have the fake context */
+       if (to->legacy_hw_ctx.rcs_state == NULL) { /* We have the fake context */
                if (to != ring->last_context) {
                        i915_gem_context_reference(to);
                        if (ring->last_context)
@@ -774,7 +791,7 @@ int i915_gem_context_create_ioctl(struct drm_device *dev, void *data,
        if (IS_ERR(ctx))
                return PTR_ERR(ctx);
 
-       args->ctx_id = ctx->id;
+       args->ctx_id = ctx->user_handle;
        DRM_DEBUG_DRIVER("HW context %d created\n", args->ctx_id);
 
        return 0;
@@ -788,7 +805,7 @@ int i915_gem_context_destroy_ioctl(struct drm_device *dev, void *data,
        struct intel_context *ctx;
        int ret;
 
-       if (args->ctx_id == DEFAULT_CONTEXT_ID)
+       if (args->ctx_id == DEFAULT_CONTEXT_HANDLE)
                return -ENOENT;
 
        ret = i915_mutex_lock_interruptible(dev);
@@ -801,7 +818,7 @@ int i915_gem_context_destroy_ioctl(struct drm_device *dev, void *data,
                return PTR_ERR(ctx);
        }
 
-       idr_remove(&ctx->file_priv->context_idr, ctx->id);
+       idr_remove(&ctx->file_priv->context_idr, ctx->user_handle);
        i915_gem_context_unreference(ctx);
        mutex_unlock(&dev->struct_mutex);
 
index 3a30133f93e858a449366727c266a4093485e085..60998fc4e5b22147687db554a4c80f27d08e1bea 100644 (file)
@@ -938,7 +938,7 @@ i915_gem_validate_context(struct drm_device *dev, struct drm_file *file,
        struct intel_context *ctx = NULL;
        struct i915_ctx_hang_stats *hs;
 
-       if (ring->id != RCS && ctx_id != DEFAULT_CONTEXT_ID)
+       if (ring->id != RCS && ctx_id != DEFAULT_CONTEXT_HANDLE)
                return ERR_PTR(-EINVAL);
 
        ctx = i915_gem_context_get(file->driver_priv, ctx_id);
@@ -975,10 +975,8 @@ i915_gem_execbuffer_move_to_active(struct list_head *vmas,
                if (obj->base.write_domain) {
                        obj->dirty = 1;
                        obj->last_write_seqno = intel_ring_get_seqno(ring);
-                       /* check for potential scanout */
-                       if (i915_gem_obj_ggtt_bound(obj) &&
-                           i915_gem_obj_to_ggtt(obj)->pin_count)
-                               intel_mark_fb_busy(obj, ring);
+
+                       intel_fb_obj_invalidate(obj, ring);
 
                        /* update for the implicit flush after a batch */
                        obj->base.write_domain &= ~I915_GEM_GPU_DOMAINS;
@@ -1028,6 +1026,163 @@ i915_reset_gen7_sol_offsets(struct drm_device *dev,
        return 0;
 }
 
+static int
+legacy_ringbuffer_submission(struct drm_device *dev, struct drm_file *file,
+                            struct intel_engine_cs *ring,
+                            struct intel_context *ctx,
+                            struct drm_i915_gem_execbuffer2 *args,
+                            struct list_head *vmas,
+                            struct drm_i915_gem_object *batch_obj,
+                            u64 exec_start, u32 flags)
+{
+       struct drm_clip_rect *cliprects = NULL;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       u64 exec_len;
+       int instp_mode;
+       u32 instp_mask;
+       int i, ret = 0;
+
+       if (args->num_cliprects != 0) {
+               if (ring != &dev_priv->ring[RCS]) {
+                       DRM_DEBUG("clip rectangles are only valid with the render ring\n");
+                       return -EINVAL;
+               }
+
+               if (INTEL_INFO(dev)->gen >= 5) {
+                       DRM_DEBUG("clip rectangles are only valid on pre-gen5\n");
+                       return -EINVAL;
+               }
+
+               if (args->num_cliprects > UINT_MAX / sizeof(*cliprects)) {
+                       DRM_DEBUG("execbuf with %u cliprects\n",
+                                 args->num_cliprects);
+                       return -EINVAL;
+               }
+
+               cliprects = kcalloc(args->num_cliprects,
+                                   sizeof(*cliprects),
+                                   GFP_KERNEL);
+               if (cliprects == NULL) {
+                       ret = -ENOMEM;
+                       goto error;
+               }
+
+               if (copy_from_user(cliprects,
+                                  to_user_ptr(args->cliprects_ptr),
+                                  sizeof(*cliprects)*args->num_cliprects)) {
+                       ret = -EFAULT;
+                       goto error;
+               }
+       } else {
+               if (args->DR4 == 0xffffffff) {
+                       DRM_DEBUG("UXA submitting garbage DR4, fixing up\n");
+                       args->DR4 = 0;
+               }
+
+               if (args->DR1 || args->DR4 || args->cliprects_ptr) {
+                       DRM_DEBUG("0 cliprects but dirt in cliprects fields\n");
+                       return -EINVAL;
+               }
+       }
+
+       ret = i915_gem_execbuffer_move_to_gpu(ring, vmas);
+       if (ret)
+               goto error;
+
+       ret = i915_switch_context(ring, ctx);
+       if (ret)
+               goto error;
+
+       instp_mode = args->flags & I915_EXEC_CONSTANTS_MASK;
+       instp_mask = I915_EXEC_CONSTANTS_MASK;
+       switch (instp_mode) {
+       case I915_EXEC_CONSTANTS_REL_GENERAL:
+       case I915_EXEC_CONSTANTS_ABSOLUTE:
+       case I915_EXEC_CONSTANTS_REL_SURFACE:
+               if (instp_mode != 0 && ring != &dev_priv->ring[RCS]) {
+                       DRM_DEBUG("non-0 rel constants mode on non-RCS\n");
+                       ret = -EINVAL;
+                       goto error;
+               }
+
+               if (instp_mode != dev_priv->relative_constants_mode) {
+                       if (INTEL_INFO(dev)->gen < 4) {
+                               DRM_DEBUG("no rel constants on pre-gen4\n");
+                               ret = -EINVAL;
+                               goto error;
+                       }
+
+                       if (INTEL_INFO(dev)->gen > 5 &&
+                           instp_mode == I915_EXEC_CONSTANTS_REL_SURFACE) {
+                               DRM_DEBUG("rel surface constants mode invalid on gen5+\n");
+                               ret = -EINVAL;
+                               goto error;
+                       }
+
+                       /* The HW changed the meaning on this bit on gen6 */
+                       if (INTEL_INFO(dev)->gen >= 6)
+                               instp_mask &= ~I915_EXEC_CONSTANTS_REL_SURFACE;
+               }
+               break;
+       default:
+               DRM_DEBUG("execbuf with unknown constants: %d\n", instp_mode);
+               ret = -EINVAL;
+               goto error;
+       }
+
+       if (ring == &dev_priv->ring[RCS] &&
+                       instp_mode != dev_priv->relative_constants_mode) {
+               ret = intel_ring_begin(ring, 4);
+               if (ret)
+                       goto error;
+
+               intel_ring_emit(ring, MI_NOOP);
+               intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1));
+               intel_ring_emit(ring, INSTPM);
+               intel_ring_emit(ring, instp_mask << 16 | instp_mode);
+               intel_ring_advance(ring);
+
+               dev_priv->relative_constants_mode = instp_mode;
+       }
+
+       if (args->flags & I915_EXEC_GEN7_SOL_RESET) {
+               ret = i915_reset_gen7_sol_offsets(dev, ring);
+               if (ret)
+                       goto error;
+       }
+
+       exec_len = args->batch_len;
+       if (cliprects) {
+               for (i = 0; i < args->num_cliprects; i++) {
+                       ret = i915_emit_box(dev, &cliprects[i],
+                                           args->DR1, args->DR4);
+                       if (ret)
+                               goto error;
+
+                       ret = ring->dispatch_execbuffer(ring,
+                                                       exec_start, exec_len,
+                                                       flags);
+                       if (ret)
+                               goto error;
+               }
+       } else {
+               ret = ring->dispatch_execbuffer(ring,
+                                               exec_start, exec_len,
+                                               flags);
+               if (ret)
+                       return ret;
+       }
+
+       trace_i915_gem_ring_dispatch(ring, intel_ring_get_seqno(ring), flags);
+
+       i915_gem_execbuffer_move_to_active(vmas, ring);
+       i915_gem_execbuffer_retire_commands(dev, file, ring, batch_obj);
+
+error:
+       kfree(cliprects);
+       return ret;
+}
+
 /**
  * Find one BSD ring to dispatch the corresponding BSD command.
  * The Ring ID is returned.
@@ -1087,14 +1242,13 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct eb_vmas *eb;
        struct drm_i915_gem_object *batch_obj;
-       struct drm_clip_rect *cliprects = NULL;
        struct intel_engine_cs *ring;
        struct intel_context *ctx;
        struct i915_address_space *vm;
        const u32 ctx_id = i915_execbuffer2_get_context_id(*args);
-       u64 exec_start = args->batch_start_offset, exec_len;
-       u32 mask, flags;
-       int ret, mode, i;
+       u64 exec_start = args->batch_start_offset;
+       u32 flags;
+       int ret;
        bool need_relocs;
 
        if (!i915_gem_check_execbuffer(args))
@@ -1138,87 +1292,11 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
                return -EINVAL;
        }
 
-       mode = args->flags & I915_EXEC_CONSTANTS_MASK;
-       mask = I915_EXEC_CONSTANTS_MASK;
-       switch (mode) {
-       case I915_EXEC_CONSTANTS_REL_GENERAL:
-       case I915_EXEC_CONSTANTS_ABSOLUTE:
-       case I915_EXEC_CONSTANTS_REL_SURFACE:
-               if (mode != 0 && ring != &dev_priv->ring[RCS]) {
-                       DRM_DEBUG("non-0 rel constants mode on non-RCS\n");
-                       return -EINVAL;
-               }
-
-               if (mode != dev_priv->relative_constants_mode) {
-                       if (INTEL_INFO(dev)->gen < 4) {
-                               DRM_DEBUG("no rel constants on pre-gen4\n");
-                               return -EINVAL;
-                       }
-
-                       if (INTEL_INFO(dev)->gen > 5 &&
-                           mode == I915_EXEC_CONSTANTS_REL_SURFACE) {
-                               DRM_DEBUG("rel surface constants mode invalid on gen5+\n");
-                               return -EINVAL;
-                       }
-
-                       /* The HW changed the meaning on this bit on gen6 */
-                       if (INTEL_INFO(dev)->gen >= 6)
-                               mask &= ~I915_EXEC_CONSTANTS_REL_SURFACE;
-               }
-               break;
-       default:
-               DRM_DEBUG("execbuf with unknown constants: %d\n", mode);
-               return -EINVAL;
-       }
-
        if (args->buffer_count < 1) {
                DRM_DEBUG("execbuf with %d buffers\n", args->buffer_count);
                return -EINVAL;
        }
 
-       if (args->num_cliprects != 0) {
-               if (ring != &dev_priv->ring[RCS]) {
-                       DRM_DEBUG("clip rectangles are only valid with the render ring\n");
-                       return -EINVAL;
-               }
-
-               if (INTEL_INFO(dev)->gen >= 5) {
-                       DRM_DEBUG("clip rectangles are only valid on pre-gen5\n");
-                       return -EINVAL;
-               }
-
-               if (args->num_cliprects > UINT_MAX / sizeof(*cliprects)) {
-                       DRM_DEBUG("execbuf with %u cliprects\n",
-                                 args->num_cliprects);
-                       return -EINVAL;
-               }
-
-               cliprects = kcalloc(args->num_cliprects,
-                                   sizeof(*cliprects),
-                                   GFP_KERNEL);
-               if (cliprects == NULL) {
-                       ret = -ENOMEM;
-                       goto pre_mutex_err;
-               }
-
-               if (copy_from_user(cliprects,
-                                  to_user_ptr(args->cliprects_ptr),
-                                  sizeof(*cliprects)*args->num_cliprects)) {
-                       ret = -EFAULT;
-                       goto pre_mutex_err;
-               }
-       } else {
-               if (args->DR4 == 0xffffffff) {
-                       DRM_DEBUG("UXA submitting garbage DR4, fixing up\n");
-                       args->DR4 = 0;
-               }
-
-               if (args->DR1 || args->DR4 || args->cliprects_ptr) {
-                       DRM_DEBUG("0 cliprects but dirt in cliprects fields\n");
-                       return -EINVAL;
-               }
-       }
-
        intel_runtime_pm_get(dev_priv);
 
        ret = i915_mutex_lock_interruptible(dev);
@@ -1322,63 +1400,11 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
        else
                exec_start += i915_gem_obj_offset(batch_obj, vm);
 
-       ret = i915_gem_execbuffer_move_to_gpu(ring, &eb->vmas);
+       ret = legacy_ringbuffer_submission(dev, file, ring, ctx,
+                       args, &eb->vmas, batch_obj, exec_start, flags);
        if (ret)
                goto err;
 
-       ret = i915_switch_context(ring, ctx);
-       if (ret)
-               goto err;
-
-       if (ring == &dev_priv->ring[RCS] &&
-           mode != dev_priv->relative_constants_mode) {
-               ret = intel_ring_begin(ring, 4);
-               if (ret)
-                               goto err;
-
-               intel_ring_emit(ring, MI_NOOP);
-               intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1));
-               intel_ring_emit(ring, INSTPM);
-               intel_ring_emit(ring, mask << 16 | mode);
-               intel_ring_advance(ring);
-
-               dev_priv->relative_constants_mode = mode;
-       }
-
-       if (args->flags & I915_EXEC_GEN7_SOL_RESET) {
-               ret = i915_reset_gen7_sol_offsets(dev, ring);
-               if (ret)
-                       goto err;
-       }
-
-
-       exec_len = args->batch_len;
-       if (cliprects) {
-               for (i = 0; i < args->num_cliprects; i++) {
-                       ret = i915_emit_box(dev, &cliprects[i],
-                                           args->DR1, args->DR4);
-                       if (ret)
-                               goto err;
-
-                       ret = ring->dispatch_execbuffer(ring,
-                                                       exec_start, exec_len,
-                                                       flags);
-                       if (ret)
-                               goto err;
-               }
-       } else {
-               ret = ring->dispatch_execbuffer(ring,
-                                               exec_start, exec_len,
-                                               flags);
-               if (ret)
-                       goto err;
-       }
-
-       trace_i915_gem_ring_dispatch(ring, intel_ring_get_seqno(ring), flags);
-
-       i915_gem_execbuffer_move_to_active(&eb->vmas, ring);
-       i915_gem_execbuffer_retire_commands(dev, file, ring, batch_obj);
-
 err:
        /* the request owns the ref now */
        i915_gem_context_unreference(ctx);
@@ -1387,8 +1413,6 @@ err:
        mutex_unlock(&dev->struct_mutex);
 
 pre_mutex_err:
-       kfree(cliprects);
-
        /* intel_gpu_busy should also get a ref, so it will free when the device
         * is really idle. */
        intel_runtime_pm_put(dev_priv);
@@ -1525,7 +1549,7 @@ i915_gem_execbuffer2(struct drm_device *dev, void *data,
        ret = i915_gem_do_execbuffer(dev, data, file, args, exec2_list);
        if (!ret) {
                /* Copy the new buffer offsets back to the user's exec list. */
-               struct drm_i915_gem_exec_object2 *user_exec_list =
+               struct drm_i915_gem_exec_object2 __user *user_exec_list =
                                   to_user_ptr(args->buffers_ptr);
                int i;
 
index 8b3cde7033640e2450ab0b911c5cedb39172a003..1411613f2174cf67280e12127327e880e8772275 100644 (file)
@@ -63,6 +63,13 @@ static int sanitize_enable_ppgtt(struct drm_device *dev, int enable_ppgtt)
        }
 #endif
 
+       /* Early VLV doesn't have this */
+       if (IS_VALLEYVIEW(dev) && !IS_CHERRYVIEW(dev) &&
+           dev->pdev->revision < 0xb) {
+               DRM_DEBUG_DRIVER("disabling PPGTT on pre-B3 step VLV\n");
+               return 0;
+       }
+
        return HAS_ALIASING_PPGTT(dev) ? 1 : 0;
 }
 
@@ -110,7 +117,7 @@ static inline gen8_ppgtt_pde_t gen8_pde_encode(struct drm_device *dev,
 
 static gen6_gtt_pte_t snb_pte_encode(dma_addr_t addr,
                                     enum i915_cache_level level,
-                                    bool valid)
+                                    bool valid, u32 unused)
 {
        gen6_gtt_pte_t pte = valid ? GEN6_PTE_VALID : 0;
        pte |= GEN6_PTE_ADDR_ENCODE(addr);
@@ -132,7 +139,7 @@ static gen6_gtt_pte_t snb_pte_encode(dma_addr_t addr,
 
 static gen6_gtt_pte_t ivb_pte_encode(dma_addr_t addr,
                                     enum i915_cache_level level,
-                                    bool valid)
+                                    bool valid, u32 unused)
 {
        gen6_gtt_pte_t pte = valid ? GEN6_PTE_VALID : 0;
        pte |= GEN6_PTE_ADDR_ENCODE(addr);
@@ -156,7 +163,7 @@ static gen6_gtt_pte_t ivb_pte_encode(dma_addr_t addr,
 
 static gen6_gtt_pte_t byt_pte_encode(dma_addr_t addr,
                                     enum i915_cache_level level,
-                                    bool valid)
+                                    bool valid, u32 flags)
 {
        gen6_gtt_pte_t pte = valid ? GEN6_PTE_VALID : 0;
        pte |= GEN6_PTE_ADDR_ENCODE(addr);
@@ -164,7 +171,8 @@ static gen6_gtt_pte_t byt_pte_encode(dma_addr_t addr,
        /* Mark the page as writeable.  Other platforms don't have a
         * setting for read-only/writable, so this matches that behavior.
         */
-       pte |= BYT_PTE_WRITEABLE;
+       if (!(flags & PTE_READ_ONLY))
+               pte |= BYT_PTE_WRITEABLE;
 
        if (level != I915_CACHE_NONE)
                pte |= BYT_PTE_SNOOPED_BY_CPU_CACHES;
@@ -174,7 +182,7 @@ static gen6_gtt_pte_t byt_pte_encode(dma_addr_t addr,
 
 static gen6_gtt_pte_t hsw_pte_encode(dma_addr_t addr,
                                     enum i915_cache_level level,
-                                    bool valid)
+                                    bool valid, u32 unused)
 {
        gen6_gtt_pte_t pte = valid ? GEN6_PTE_VALID : 0;
        pte |= HSW_PTE_ADDR_ENCODE(addr);
@@ -187,7 +195,7 @@ static gen6_gtt_pte_t hsw_pte_encode(dma_addr_t addr,
 
 static gen6_gtt_pte_t iris_pte_encode(dma_addr_t addr,
                                      enum i915_cache_level level,
-                                     bool valid)
+                                     bool valid, u32 unused)
 {
        gen6_gtt_pte_t pte = valid ? GEN6_PTE_VALID : 0;
        pte |= HSW_PTE_ADDR_ENCODE(addr);
@@ -301,7 +309,7 @@ static void gen8_ppgtt_clear_range(struct i915_address_space *vm,
 static void gen8_ppgtt_insert_entries(struct i915_address_space *vm,
                                      struct sg_table *pages,
                                      uint64_t start,
-                                     enum i915_cache_level cache_level)
+                                     enum i915_cache_level cache_level, u32 unused)
 {
        struct i915_hw_ppgtt *ppgtt =
                container_of(vm, struct i915_hw_ppgtt, base);
@@ -639,7 +647,7 @@ static void gen6_dump_ppgtt(struct i915_hw_ppgtt *ppgtt, struct seq_file *m)
        uint32_t pd_entry;
        int pte, pde;
 
-       scratch_pte = vm->pte_encode(vm->scratch.addr, I915_CACHE_LLC, true);
+       scratch_pte = vm->pte_encode(vm->scratch.addr, I915_CACHE_LLC, true, 0);
 
        pd_addr = (gen6_gtt_pte_t __iomem *)dev_priv->gtt.gsm +
                ppgtt->pd_offset / sizeof(gen6_gtt_pte_t);
@@ -941,7 +949,7 @@ static void gen6_ppgtt_clear_range(struct i915_address_space *vm,
        unsigned first_pte = first_entry % I915_PPGTT_PT_ENTRIES;
        unsigned last_pte, i;
 
-       scratch_pte = vm->pte_encode(vm->scratch.addr, I915_CACHE_LLC, true);
+       scratch_pte = vm->pte_encode(vm->scratch.addr, I915_CACHE_LLC, true, 0);
 
        while (num_entries) {
                last_pte = first_pte + num_entries;
@@ -964,7 +972,7 @@ static void gen6_ppgtt_clear_range(struct i915_address_space *vm,
 static void gen6_ppgtt_insert_entries(struct i915_address_space *vm,
                                      struct sg_table *pages,
                                      uint64_t start,
-                                     enum i915_cache_level cache_level)
+                                     enum i915_cache_level cache_level, u32 flags)
 {
        struct i915_hw_ppgtt *ppgtt =
                container_of(vm, struct i915_hw_ppgtt, base);
@@ -981,7 +989,8 @@ static void gen6_ppgtt_insert_entries(struct i915_address_space *vm,
 
                pt_vaddr[act_pte] =
                        vm->pte_encode(sg_page_iter_dma_address(&sg_iter),
-                                      cache_level, true);
+                                      cache_level, true, flags);
+
                if (++act_pte == I915_PPGTT_PT_ENTRIES) {
                        kunmap_atomic(pt_vaddr);
                        pt_vaddr = NULL;
@@ -1218,8 +1227,12 @@ ppgtt_bind_vma(struct i915_vma *vma,
               enum i915_cache_level cache_level,
               u32 flags)
 {
+       /* Currently applicable only to VLV */
+       if (vma->obj->gt_ro)
+               flags |= PTE_READ_ONLY;
+
        vma->vm->insert_entries(vma->vm, vma->obj->pages, vma->node.start,
-                               cache_level);
+                               cache_level, flags);
 }
 
 static void ppgtt_unbind_vma(struct i915_vma *vma)
@@ -1394,7 +1407,7 @@ static inline void gen8_set_pte(void __iomem *addr, gen8_gtt_pte_t pte)
 static void gen8_ggtt_insert_entries(struct i915_address_space *vm,
                                     struct sg_table *st,
                                     uint64_t start,
-                                    enum i915_cache_level level)
+                                    enum i915_cache_level level, u32 unused)
 {
        struct drm_i915_private *dev_priv = vm->dev->dev_private;
        unsigned first_entry = start >> PAGE_SHIFT;
@@ -1402,7 +1415,7 @@ static void gen8_ggtt_insert_entries(struct i915_address_space *vm,
                (gen8_gtt_pte_t __iomem *)dev_priv->gtt.gsm + first_entry;
        int i = 0;
        struct sg_page_iter sg_iter;
-       dma_addr_t addr = 0;
+       dma_addr_t addr = 0; /* shut up gcc */
 
        for_each_sg_page(st->sgl, &sg_iter, st->nents, 0) {
                addr = sg_dma_address(sg_iter.sg) +
@@ -1440,7 +1453,7 @@ static void gen8_ggtt_insert_entries(struct i915_address_space *vm,
 static void gen6_ggtt_insert_entries(struct i915_address_space *vm,
                                     struct sg_table *st,
                                     uint64_t start,
-                                    enum i915_cache_level level)
+                                    enum i915_cache_level level, u32 flags)
 {
        struct drm_i915_private *dev_priv = vm->dev->dev_private;
        unsigned first_entry = start >> PAGE_SHIFT;
@@ -1448,11 +1461,11 @@ static void gen6_ggtt_insert_entries(struct i915_address_space *vm,
                (gen6_gtt_pte_t __iomem *)dev_priv->gtt.gsm + first_entry;
        int i = 0;
        struct sg_page_iter sg_iter;
-       dma_addr_t addr;
+       dma_addr_t addr = 0;
 
        for_each_sg_page(st->sgl, &sg_iter, st->nents, 0) {
                addr = sg_page_iter_dma_address(&sg_iter);
-               iowrite32(vm->pte_encode(addr, level, true), &gtt_entries[i]);
+               iowrite32(vm->pte_encode(addr, level, true, flags), &gtt_entries[i]);
                i++;
        }
 
@@ -1462,9 +1475,10 @@ static void gen6_ggtt_insert_entries(struct i915_address_space *vm,
         * of NUMA access patterns. Therefore, even with the way we assume
         * hardware should work, we must keep this posting read for paranoia.
         */
-       if (i != 0)
-               WARN_ON(readl(&gtt_entries[i-1]) !=
-                       vm->pte_encode(addr, level, true));
+       if (i != 0) {
+               unsigned long gtt = readl(&gtt_entries[i-1]);
+               WARN_ON(gtt != vm->pte_encode(addr, level, true, flags));
+       }
 
        /* This next bit makes the above posting read even more important. We
         * want to flush the TLBs only after we're certain all the PTE updates
@@ -1518,7 +1532,7 @@ static void gen6_ggtt_clear_range(struct i915_address_space *vm,
                 first_entry, num_entries, max_entries))
                num_entries = max_entries;
 
-       scratch_pte = vm->pte_encode(vm->scratch.addr, I915_CACHE_LLC, use_scratch);
+       scratch_pte = vm->pte_encode(vm->scratch.addr, I915_CACHE_LLC, use_scratch, 0);
 
        for (i = 0; i < num_entries; i++)
                iowrite32(scratch_pte, &gtt_base[i]);
@@ -1567,6 +1581,10 @@ static void ggtt_bind_vma(struct i915_vma *vma,
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct drm_i915_gem_object *obj = vma->obj;
 
+       /* Currently applicable only to VLV */
+       if (obj->gt_ro)
+               flags |= PTE_READ_ONLY;
+
        /* If there is no aliasing PPGTT, or the caller needs a global mapping,
         * or we have a global mapping already but the cacheability flags have
         * changed, set the global PTEs.
@@ -1583,7 +1601,7 @@ static void ggtt_bind_vma(struct i915_vma *vma,
                    (cache_level != obj->cache_level)) {
                        vma->vm->insert_entries(vma->vm, obj->pages,
                                                vma->node.start,
-                                               cache_level);
+                                               cache_level, flags);
                        obj->has_global_gtt_mapping = 1;
                }
        }
@@ -1595,7 +1613,7 @@ static void ggtt_bind_vma(struct i915_vma *vma,
                appgtt->base.insert_entries(&appgtt->base,
                                            vma->obj->pages,
                                            vma->node.start,
-                                           cache_level);
+                                           cache_level, flags);
                vma->obj->has_aliasing_ppgtt_mapping = 1;
        }
 }
index 1b96a06be3cb4f4872103c04d437e966c7b10f4f..8d6f7c18c40413bf46288bec1144d26b5fc652dc 100644 (file)
@@ -154,6 +154,7 @@ struct i915_vma {
        void (*unbind_vma)(struct i915_vma *vma);
        /* Map an object into an address space with the given cache flags. */
 #define GLOBAL_BIND (1<<0)
+#define PTE_READ_ONLY (1<<1)
        void (*bind_vma)(struct i915_vma *vma,
                         enum i915_cache_level cache_level,
                         u32 flags);
@@ -197,7 +198,7 @@ struct i915_address_space {
        /* FIXME: Need a more generic return type */
        gen6_gtt_pte_t (*pte_encode)(dma_addr_t addr,
                                     enum i915_cache_level level,
-                                    bool valid); /* Create a valid PTE */
+                                    bool valid, u32 flags); /* Create a valid PTE */
        void (*clear_range)(struct i915_address_space *vm,
                            uint64_t start,
                            uint64_t length,
@@ -205,7 +206,7 @@ struct i915_address_space {
        void (*insert_entries)(struct i915_address_space *vm,
                               struct sg_table *st,
                               uint64_t start,
-                              enum i915_cache_level cache_level);
+                              enum i915_cache_level cache_level, u32 flags);
        void (*cleanup)(struct i915_address_space *vm);
 };
 
index 34894b57306401645a2184d48d99ed2966c8c9f1..e60be3f552a6b1aed14770bef853a1eab2ddf5aa 100644 (file)
 #include "i915_drv.h"
 #include "intel_renderstate.h"
 
-struct i915_render_state {
+struct render_state {
+       const struct intel_renderstate_rodata *rodata;
        struct drm_i915_gem_object *obj;
-       unsigned long ggtt_offset;
-       u32 *batch;
-       u32 size;
-       u32 len;
+       u64 ggtt_offset;
+       int gen;
 };
 
-static struct i915_render_state *render_state_alloc(struct drm_device *dev)
-{
-       struct i915_render_state *so;
-       struct page *page;
-       int ret;
-
-       so = kzalloc(sizeof(*so), GFP_KERNEL);
-       if (!so)
-               return ERR_PTR(-ENOMEM);
-
-       so->obj = i915_gem_alloc_object(dev, 4096);
-       if (so->obj == NULL) {
-               ret = -ENOMEM;
-               goto free;
-       }
-       so->size = 4096;
-
-       ret = i915_gem_obj_ggtt_pin(so->obj, 4096, 0);
-       if (ret)
-               goto free_gem;
-
-       BUG_ON(so->obj->pages->nents != 1);
-       page = sg_page(so->obj->pages->sgl);
-
-       so->batch = kmap(page);
-       if (!so->batch) {
-               ret = -ENOMEM;
-               goto unpin;
-       }
-
-       so->ggtt_offset = i915_gem_obj_ggtt_offset(so->obj);
-
-       return so;
-unpin:
-       i915_gem_object_ggtt_unpin(so->obj);
-free_gem:
-       drm_gem_object_unreference(&so->obj->base);
-free:
-       kfree(so);
-       return ERR_PTR(ret);
-}
-
-static void render_state_free(struct i915_render_state *so)
-{
-       kunmap(kmap_to_page(so->batch));
-       i915_gem_object_ggtt_unpin(so->obj);
-       drm_gem_object_unreference(&so->obj->base);
-       kfree(so);
-}
-
 static const struct intel_renderstate_rodata *
 render_state_get_rodata(struct drm_device *dev, const int gen)
 {
@@ -101,98 +50,120 @@ render_state_get_rodata(struct drm_device *dev, const int gen)
        return NULL;
 }
 
-static int render_state_setup(const int gen,
-                             const struct intel_renderstate_rodata *rodata,
-                             struct i915_render_state *so)
+static int render_state_init(struct render_state *so, struct drm_device *dev)
 {
-       const u64 goffset = i915_gem_obj_ggtt_offset(so->obj);
-       u32 reloc_index = 0;
-       u32 * const d = so->batch;
-       unsigned int i = 0;
        int ret;
 
-       if (!rodata || rodata->batch_items * 4 > so->size)
+       so->gen = INTEL_INFO(dev)->gen;
+       so->rodata = render_state_get_rodata(dev, so->gen);
+       if (so->rodata == NULL)
+               return 0;
+
+       if (so->rodata->batch_items * 4 > 4096)
                return -EINVAL;
 
+       so->obj = i915_gem_alloc_object(dev, 4096);
+       if (so->obj == NULL)
+               return -ENOMEM;
+
+       ret = i915_gem_obj_ggtt_pin(so->obj, 4096, 0);
+       if (ret)
+               goto free_gem;
+
+       so->ggtt_offset = i915_gem_obj_ggtt_offset(so->obj);
+       return 0;
+
+free_gem:
+       drm_gem_object_unreference(&so->obj->base);
+       return ret;
+}
+
+static int render_state_setup(struct render_state *so)
+{
+       const struct intel_renderstate_rodata *rodata = so->rodata;
+       unsigned int i = 0, reloc_index = 0;
+       struct page *page;
+       u32 *d;
+       int ret;
+
        ret = i915_gem_object_set_to_cpu_domain(so->obj, true);
        if (ret)
                return ret;
 
+       page = sg_page(so->obj->pages->sgl);
+       d = kmap(page);
+
        while (i < rodata->batch_items) {
                u32 s = rodata->batch[i];
 
-               if (reloc_index < rodata->reloc_items &&
-                   i * 4  == rodata->reloc[reloc_index]) {
-
-                       s += goffset & 0xffffffff;
-
-                       /* We keep batch offsets max 32bit */
-                       if (gen >= 8) {
+               if (i * 4  == rodata->reloc[reloc_index]) {
+                       u64 r = s + so->ggtt_offset;
+                       s = lower_32_bits(r);
+                       if (so->gen >= 8) {
                                if (i + 1 >= rodata->batch_items ||
                                    rodata->batch[i + 1] != 0)
                                        return -EINVAL;
 
-                               d[i] = s;
-                               i++;
-                               s = (goffset & 0xffffffff00000000ull) >> 32;
+                               d[i++] = s;
+                               s = upper_32_bits(r);
                        }
 
                        reloc_index++;
                }
 
-               d[i] = s;
-               i++;
+               d[i++] = s;
        }
+       kunmap(page);
 
        ret = i915_gem_object_set_to_gtt_domain(so->obj, false);
        if (ret)
                return ret;
 
-       if (rodata->reloc_items != reloc_index) {
-               DRM_ERROR("not all relocs resolved, %d out of %d\n",
-                         reloc_index, rodata->reloc_items);
+       if (rodata->reloc[reloc_index] != -1) {
+               DRM_ERROR("only %d relocs resolved\n", reloc_index);
                return -EINVAL;
        }
 
-       so->len = rodata->batch_items * 4;
-
        return 0;
 }
 
+static void render_state_fini(struct render_state *so)
+{
+       i915_gem_object_ggtt_unpin(so->obj);
+       drm_gem_object_unreference(&so->obj->base);
+}
+
 int i915_gem_render_state_init(struct intel_engine_cs *ring)
 {
-       const int gen = INTEL_INFO(ring->dev)->gen;
-       struct i915_render_state *so;
-       const struct intel_renderstate_rodata *rodata;
+       struct render_state so;
        int ret;
 
        if (WARN_ON(ring->id != RCS))
                return -ENOENT;
 
-       rodata = render_state_get_rodata(ring->dev, gen);
-       if (rodata == NULL)
-               return 0;
+       ret = render_state_init(&so, ring->dev);
+       if (ret)
+               return ret;
 
-       so = render_state_alloc(ring->dev);
-       if (IS_ERR(so))
-               return PTR_ERR(so);
+       if (so.rodata == NULL)
+               return 0;
 
-       ret = render_state_setup(gen, rodata, so);
+       ret = render_state_setup(&so);
        if (ret)
                goto out;
 
        ret = ring->dispatch_execbuffer(ring,
-                                       i915_gem_obj_ggtt_offset(so->obj),
-                                       so->len,
+                                       so.ggtt_offset,
+                                       so.rodata->batch_items * 4,
                                        I915_DISPATCH_SECURE);
        if (ret)
                goto out;
 
-       i915_vma_move_to_active(i915_gem_obj_to_ggtt(so->obj), ring);
+       i915_vma_move_to_active(i915_gem_obj_to_ggtt(so.obj), ring);
 
-       ret = __i915_add_request(ring, NULL, so->obj, NULL);
+       ret = __i915_add_request(ring, NULL, so.obj, NULL);
        /* __i915_add_request moves object to inactive if it fails */
 out:
-       render_state_free(so);
+       render_state_fini(&so);
        return ret;
 }
index 7465ab0fd396885cadca882f37bf7bb88ff5105a..21c025a209c079a88095fa8bd0de6c6d2926aa66 100644 (file)
@@ -147,30 +147,68 @@ static unsigned long i915_stolen_to_physical(struct drm_device *dev)
        return base;
 }
 
-static int i915_setup_compression(struct drm_device *dev, int size)
+static int find_compression_threshold(struct drm_device *dev,
+                                     struct drm_mm_node *node,
+                                     int size,
+                                     int fb_cpp)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct drm_mm_node *compressed_fb, *uninitialized_var(compressed_llb);
+       int compression_threshold = 1;
        int ret;
 
-       compressed_fb = kzalloc(sizeof(*compressed_fb), GFP_KERNEL);
-       if (!compressed_fb)
-               goto err_llb;
+       /* HACK: This code depends on what we will do in *_enable_fbc. If that
+        * code changes, this code needs to change as well.
+        *
+        * The enable_fbc code will attempt to use one of our 2 compression
+        * thresholds, therefore, in that case, we only have 1 resort.
+        */
 
-       /* Try to over-allocate to reduce reallocations and fragmentation */
-       ret = drm_mm_insert_node(&dev_priv->mm.stolen, compressed_fb,
+       /* Try to over-allocate to reduce reallocations and fragmentation. */
+       ret = drm_mm_insert_node(&dev_priv->mm.stolen, node,
                                 size <<= 1, 4096, DRM_MM_SEARCH_DEFAULT);
-       if (ret)
-               ret = drm_mm_insert_node(&dev_priv->mm.stolen, compressed_fb,
-                                        size >>= 1, 4096,
-                                        DRM_MM_SEARCH_DEFAULT);
-       if (ret)
+       if (ret == 0)
+               return compression_threshold;
+
+again:
+       /* HW's ability to limit the CFB is 1:4 */
+       if (compression_threshold > 4 ||
+           (fb_cpp == 2 && compression_threshold == 2))
+               return 0;
+
+       ret = drm_mm_insert_node(&dev_priv->mm.stolen, node,
+                                size >>= 1, 4096,
+                                DRM_MM_SEARCH_DEFAULT);
+       if (ret && INTEL_INFO(dev)->gen <= 4) {
+               return 0;
+       } else if (ret) {
+               compression_threshold <<= 1;
+               goto again;
+       } else {
+               return compression_threshold;
+       }
+}
+
+static int i915_setup_compression(struct drm_device *dev, int size, int fb_cpp)
+{
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_mm_node *uninitialized_var(compressed_llb);
+       int ret;
+
+       ret = find_compression_threshold(dev, &dev_priv->fbc.compressed_fb,
+                                        size, fb_cpp);
+       if (!ret)
                goto err_llb;
+       else if (ret > 1) {
+               DRM_INFO("Reducing the compressed framebuffer size. This may lead to less power savings than a non-reduced-size. Try to increase stolen memory size if available in BIOS.\n");
+
+       }
+
+       dev_priv->fbc.threshold = ret;
 
        if (HAS_PCH_SPLIT(dev))
-               I915_WRITE(ILK_DPFC_CB_BASE, compressed_fb->start);
+               I915_WRITE(ILK_DPFC_CB_BASE, dev_priv->fbc.compressed_fb.start);
        else if (IS_GM45(dev)) {
-               I915_WRITE(DPFC_CB_BASE, compressed_fb->start);
+               I915_WRITE(DPFC_CB_BASE, dev_priv->fbc.compressed_fb.start);
        } else {
                compressed_llb = kzalloc(sizeof(*compressed_llb), GFP_KERNEL);
                if (!compressed_llb)
@@ -184,13 +222,12 @@ static int i915_setup_compression(struct drm_device *dev, int size)
                dev_priv->fbc.compressed_llb = compressed_llb;
 
                I915_WRITE(FBC_CFB_BASE,
-                          dev_priv->mm.stolen_base + compressed_fb->start);
+                          dev_priv->mm.stolen_base + dev_priv->fbc.compressed_fb.start);
                I915_WRITE(FBC_LL_BASE,
                           dev_priv->mm.stolen_base + compressed_llb->start);
        }
 
-       dev_priv->fbc.compressed_fb = compressed_fb;
-       dev_priv->fbc.size = size;
+       dev_priv->fbc.size = size / dev_priv->fbc.threshold;
 
        DRM_DEBUG_KMS("reserved %d bytes of contiguous stolen space for FBC\n",
                      size);
@@ -199,14 +236,13 @@ static int i915_setup_compression(struct drm_device *dev, int size)
 
 err_fb:
        kfree(compressed_llb);
-       drm_mm_remove_node(compressed_fb);
+       drm_mm_remove_node(&dev_priv->fbc.compressed_fb);
 err_llb:
-       kfree(compressed_fb);
        pr_info_once("drm: not enough stolen space for compressed buffer (need %d more bytes), disabling. Hint: you may be able to increase stolen memory size in the BIOS to avoid this.\n", size);
        return -ENOSPC;
 }
 
-int i915_gem_stolen_setup_compression(struct drm_device *dev, int size)
+int i915_gem_stolen_setup_compression(struct drm_device *dev, int size, int fb_cpp)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
 
@@ -219,7 +255,7 @@ int i915_gem_stolen_setup_compression(struct drm_device *dev, int size)
        /* Release any current block */
        i915_gem_stolen_cleanup_compression(dev);
 
-       return i915_setup_compression(dev, size);
+       return i915_setup_compression(dev, size, fb_cpp);
 }
 
 void i915_gem_stolen_cleanup_compression(struct drm_device *dev)
@@ -229,10 +265,7 @@ void i915_gem_stolen_cleanup_compression(struct drm_device *dev)
        if (dev_priv->fbc.size == 0)
                return;
 
-       if (dev_priv->fbc.compressed_fb) {
-               drm_mm_remove_node(dev_priv->fbc.compressed_fb);
-               kfree(dev_priv->fbc.compressed_fb);
-       }
+       drm_mm_remove_node(&dev_priv->fbc.compressed_fb);
 
        if (dev_priv->fbc.compressed_llb) {
                drm_mm_remove_node(dev_priv->fbc.compressed_llb);
@@ -336,9 +369,20 @@ static void i915_gem_object_put_pages_stolen(struct drm_i915_gem_object *obj)
        kfree(obj->pages);
 }
 
+
+static void
+i915_gem_object_release_stolen(struct drm_i915_gem_object *obj)
+{
+       if (obj->stolen) {
+               drm_mm_remove_node(obj->stolen);
+               kfree(obj->stolen);
+               obj->stolen = NULL;
+       }
+}
 static const struct drm_i915_gem_object_ops i915_gem_object_stolen_ops = {
        .get_pages = i915_gem_object_get_pages_stolen,
        .put_pages = i915_gem_object_put_pages_stolen,
+       .release = i915_gem_object_release_stolen,
 };
 
 static struct drm_i915_gem_object *
@@ -496,13 +540,3 @@ err_out:
        drm_gem_object_unreference(&obj->base);
        return NULL;
 }
-
-void
-i915_gem_object_release_stolen(struct drm_i915_gem_object *obj)
-{
-       if (obj->stolen) {
-               drm_mm_remove_node(obj->stolen);
-               kfree(obj->stolen);
-               obj->stolen = NULL;
-       }
-}
index 21ea92886a56e7f9fd2242020a4365623f9c0371..fe69fc837d9ee25f33b3dbd15664c2c33b9ca721 100644 (file)
@@ -40,19 +40,87 @@ struct i915_mmu_notifier {
        struct hlist_node node;
        struct mmu_notifier mn;
        struct rb_root objects;
+       struct list_head linear;
        struct drm_device *dev;
        struct mm_struct *mm;
        struct work_struct work;
        unsigned long count;
        unsigned long serial;
+       bool has_linear;
 };
 
 struct i915_mmu_object {
        struct i915_mmu_notifier *mmu;
        struct interval_tree_node it;
+       struct list_head link;
        struct drm_i915_gem_object *obj;
+       bool is_linear;
 };
 
+static unsigned long cancel_userptr(struct drm_i915_gem_object *obj)
+{
+       struct drm_device *dev = obj->base.dev;
+       unsigned long end;
+
+       mutex_lock(&dev->struct_mutex);
+       /* Cancel any active worker and force us to re-evaluate gup */
+       obj->userptr.work = NULL;
+
+       if (obj->pages != NULL) {
+               struct drm_i915_private *dev_priv = to_i915(dev);
+               struct i915_vma *vma, *tmp;
+               bool was_interruptible;
+
+               was_interruptible = dev_priv->mm.interruptible;
+               dev_priv->mm.interruptible = false;
+
+               list_for_each_entry_safe(vma, tmp, &obj->vma_list, vma_link) {
+                       int ret = i915_vma_unbind(vma);
+                       WARN_ON(ret && ret != -EIO);
+               }
+               WARN_ON(i915_gem_object_put_pages(obj));
+
+               dev_priv->mm.interruptible = was_interruptible;
+       }
+
+       end = obj->userptr.ptr + obj->base.size;
+
+       drm_gem_object_unreference(&obj->base);
+       mutex_unlock(&dev->struct_mutex);
+
+       return end;
+}
+
+static void *invalidate_range__linear(struct i915_mmu_notifier *mn,
+                                     struct mm_struct *mm,
+                                     unsigned long start,
+                                     unsigned long end)
+{
+       struct i915_mmu_object *mmu;
+       unsigned long serial;
+
+restart:
+       serial = mn->serial;
+       list_for_each_entry(mmu, &mn->linear, link) {
+               struct drm_i915_gem_object *obj;
+
+               if (mmu->it.last < start || mmu->it.start > end)
+                       continue;
+
+               obj = mmu->obj;
+               drm_gem_object_reference(&obj->base);
+               spin_unlock(&mn->lock);
+
+               cancel_userptr(obj);
+
+               spin_lock(&mn->lock);
+               if (serial != mn->serial)
+                       goto restart;
+       }
+
+       return NULL;
+}
+
 static void i915_gem_userptr_mn_invalidate_range_start(struct mmu_notifier *_mn,
                                                       struct mm_struct *mm,
                                                       unsigned long start,
@@ -60,16 +128,18 @@ static void i915_gem_userptr_mn_invalidate_range_start(struct mmu_notifier *_mn,
 {
        struct i915_mmu_notifier *mn = container_of(_mn, struct i915_mmu_notifier, mn);
        struct interval_tree_node *it = NULL;
+       unsigned long next = start;
        unsigned long serial = 0;
 
        end--; /* interval ranges are inclusive, but invalidate range is exclusive */
-       while (start < end) {
-               struct drm_i915_gem_object *obj;
+       while (next < end) {
+               struct drm_i915_gem_object *obj = NULL;
 
-               obj = NULL;
                spin_lock(&mn->lock);
-               if (serial == mn->serial)
-                       it = interval_tree_iter_next(it, start, end);
+               if (mn->has_linear)
+                       it = invalidate_range__linear(mn, mm, start, end);
+               else if (serial == mn->serial)
+                       it = interval_tree_iter_next(it, next, end);
                else
                        it = interval_tree_iter_first(&mn->objects, start, end);
                if (it != NULL) {
@@ -81,31 +151,7 @@ static void i915_gem_userptr_mn_invalidate_range_start(struct mmu_notifier *_mn,
                if (obj == NULL)
                        return;
 
-               mutex_lock(&mn->dev->struct_mutex);
-               /* Cancel any active worker and force us to re-evaluate gup */
-               obj->userptr.work = NULL;
-
-               if (obj->pages != NULL) {
-                       struct drm_i915_private *dev_priv = to_i915(mn->dev);
-                       struct i915_vma *vma, *tmp;
-                       bool was_interruptible;
-
-                       was_interruptible = dev_priv->mm.interruptible;
-                       dev_priv->mm.interruptible = false;
-
-                       list_for_each_entry_safe(vma, tmp, &obj->vma_list, vma_link) {
-                               int ret = i915_vma_unbind(vma);
-                               WARN_ON(ret && ret != -EIO);
-                       }
-                       WARN_ON(i915_gem_object_put_pages(obj));
-
-                       dev_priv->mm.interruptible = was_interruptible;
-               }
-
-               start = obj->userptr.ptr + obj->base.size;
-
-               drm_gem_object_unreference(&obj->base);
-               mutex_unlock(&mn->dev->struct_mutex);
+               next = cancel_userptr(obj);
        }
 }
 
@@ -150,7 +196,9 @@ i915_mmu_notifier_get(struct drm_device *dev, struct mm_struct *mm)
        mmu->mm = mm;
        mmu->objects = RB_ROOT;
        mmu->count = 0;
-       mmu->serial = 0;
+       mmu->serial = 1;
+       INIT_LIST_HEAD(&mmu->linear);
+       mmu->has_linear = false;
 
        /* Protected by mmap_sem (write-lock) */
        ret = __mmu_notifier_register(&mmu->mn, mm);
@@ -197,6 +245,17 @@ static void __i915_mmu_notifier_update_serial(struct i915_mmu_notifier *mmu)
                mmu->serial = 1;
 }
 
+static bool i915_mmu_notifier_has_linear(struct i915_mmu_notifier *mmu)
+{
+       struct i915_mmu_object *mn;
+
+       list_for_each_entry(mn, &mmu->linear, link)
+               if (mn->is_linear)
+                       return true;
+
+       return false;
+}
+
 static void
 i915_mmu_notifier_del(struct i915_mmu_notifier *mmu,
                      struct i915_mmu_object *mn)
@@ -204,7 +263,11 @@ i915_mmu_notifier_del(struct i915_mmu_notifier *mmu,
        lockdep_assert_held(&mmu->dev->struct_mutex);
 
        spin_lock(&mmu->lock);
-       interval_tree_remove(&mn->it, &mmu->objects);
+       list_del(&mn->link);
+       if (mn->is_linear)
+               mmu->has_linear = i915_mmu_notifier_has_linear(mmu);
+       else
+               interval_tree_remove(&mn->it, &mmu->objects);
        __i915_mmu_notifier_update_serial(mmu);
        spin_unlock(&mmu->lock);
 
@@ -230,7 +293,6 @@ i915_mmu_notifier_add(struct i915_mmu_notifier *mmu,
         */
        i915_gem_retire_requests(mmu->dev);
 
-       /* Disallow overlapping userptr objects */
        spin_lock(&mmu->lock);
        it = interval_tree_iter_first(&mmu->objects,
                                      mn->it.start, mn->it.last);
@@ -243,14 +305,22 @@ i915_mmu_notifier_add(struct i915_mmu_notifier *mmu,
                 * to flush their object references upon which the object will
                 * be removed from the interval-tree, or the the range is
                 * still in use by another client and the overlap is invalid.
+                *
+                * If we do have an overlap, we cannot use the interval tree
+                * for fast range invalidation.
                 */
 
                obj = container_of(it, struct i915_mmu_object, it)->obj;
-               ret = obj->userptr.workers ? -EAGAIN : -EINVAL;
-       } else {
+               if (!obj->userptr.workers)
+                       mmu->has_linear = mn->is_linear = true;
+               else
+                       ret = -EAGAIN;
+       } else
                interval_tree_insert(&mn->it, &mmu->objects);
+
+       if (ret == 0) {
+               list_add(&mn->link, &mmu->linear);
                __i915_mmu_notifier_update_serial(mmu);
-               ret = 0;
        }
        spin_unlock(&mmu->lock);
        mutex_unlock(&mmu->dev->struct_mutex);
@@ -611,12 +681,11 @@ static const struct drm_i915_gem_object_ops i915_gem_userptr_ops = {
  * We impose several restrictions upon the memory being mapped
  * into the GPU.
  * 1. It must be page aligned (both start/end addresses, i.e ptr and size).
- * 2. It cannot overlap any other userptr object in the same address space.
- * 3. It must be normal system memory, not a pointer into another map of IO
+ * 2. It must be normal system memory, not a pointer into another map of IO
  *    space (e.g. it must not be a GTT mmapping of another object).
- * 4. We only allow a bo as large as we could in theory map into the GTT,
+ * 3. We only allow a bo as large as we could in theory map into the GTT,
  *    that is we limit the size to the total size of the GTT.
- * 5. The bo is marked as being snoopable. The backing pages are left
+ * 4. The bo is marked as being snoopable. The backing pages are left
  *    accessible directly by the CPU, but reads and writes by the GPU may
  *    incur the cost of a snoop (unless you have an LLC architecture).
  *
index 66cf41765bf94eafdf6cd5f50e11e347c77003bf..eab41f9390f8c3bd1907c7625488c977a910ead3 100644 (file)
@@ -229,6 +229,8 @@ static const char *hangcheck_action_to_str(enum intel_ring_hangcheck_action a)
                return "wait";
        case HANGCHECK_ACTIVE:
                return "active";
+       case HANGCHECK_ACTIVE_LOOP:
+               return "active (loop)";
        case HANGCHECK_KICK:
                return "kick";
        case HANGCHECK_HUNG:
@@ -327,6 +329,7 @@ int i915_error_state_to_str(struct drm_i915_error_state_buf *m,
        struct drm_device *dev = error_priv->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct drm_i915_error_state *error = error_priv->error;
+       struct drm_i915_error_object *obj;
        int i, j, offset, elt;
        int max_hangcheck_score;
 
@@ -358,6 +361,12 @@ int i915_error_state_to_str(struct drm_i915_error_state_buf *m,
        err_printf(m, "PCI ID: 0x%04x\n", dev->pdev->device);
        err_printf(m, "EIR: 0x%08x\n", error->eir);
        err_printf(m, "IER: 0x%08x\n", error->ier);
+       if (INTEL_INFO(dev)->gen >= 8) {
+               for (i = 0; i < 4; i++)
+                       err_printf(m, "GTIER gt %d: 0x%08x\n", i,
+                                  error->gtier[i]);
+       } else if (HAS_PCH_SPLIT(dev) || IS_VALLEYVIEW(dev))
+               err_printf(m, "GTIER: 0x%08x\n", error->gtier[0]);
        err_printf(m, "PGTBL_ER: 0x%08x\n", error->pgtbl_er);
        err_printf(m, "FORCEWAKE: 0x%08x\n", error->forcewake);
        err_printf(m, "DERRMR: 0x%08x\n", error->derrmr);
@@ -395,8 +404,6 @@ int i915_error_state_to_str(struct drm_i915_error_state_buf *m,
                                    error->pinned_bo_count[0]);
 
        for (i = 0; i < ARRAY_SIZE(error->ring); i++) {
-               struct drm_i915_error_object *obj;
-
                obj = error->ring[i].batchbuffer;
                if (obj) {
                        err_puts(m, dev_priv->ring[i].name);
@@ -459,6 +466,18 @@ int i915_error_state_to_str(struct drm_i915_error_state_buf *m,
                }
        }
 
+       if ((obj = error->semaphore_obj)) {
+               err_printf(m, "Semaphore page = 0x%08x\n", obj->gtt_offset);
+               for (elt = 0; elt < PAGE_SIZE/16; elt += 4) {
+                       err_printf(m, "[%04x] %08x %08x %08x %08x\n",
+                                  elt * 4,
+                                  obj->pages[0][elt],
+                                  obj->pages[0][elt+1],
+                                  obj->pages[0][elt+2],
+                                  obj->pages[0][elt+3]);
+               }
+       }
+
        if (error->overlay)
                intel_overlay_print_error_state(m, error->overlay);
 
@@ -529,6 +548,7 @@ static void i915_error_state_free(struct kref *error_ref)
                kfree(error->ring[i].requests);
        }
 
+       i915_error_object_free(error->semaphore_obj);
        kfree(error->active_bo);
        kfree(error->overlay);
        kfree(error->display);
@@ -746,7 +766,60 @@ static void i915_gem_record_fences(struct drm_device *dev,
        }
 }
 
+
+static void gen8_record_semaphore_state(struct drm_i915_private *dev_priv,
+                                       struct drm_i915_error_state *error,
+                                       struct intel_engine_cs *ring,
+                                       struct drm_i915_error_ring *ering)
+{
+       struct intel_engine_cs *to;
+       int i;
+
+       if (!i915_semaphore_is_enabled(dev_priv->dev))
+               return;
+
+       if (!error->semaphore_obj)
+               error->semaphore_obj =
+                       i915_error_object_create(dev_priv,
+                                                dev_priv->semaphore_obj,
+                                                &dev_priv->gtt.base);
+
+       for_each_ring(to, dev_priv, i) {
+               int idx;
+               u16 signal_offset;
+               u32 *tmp;
+
+               if (ring == to)
+                       continue;
+
+               signal_offset = (GEN8_SIGNAL_OFFSET(ring, i) & (PAGE_SIZE - 1))
+                               / 4;
+               tmp = error->semaphore_obj->pages[0];
+               idx = intel_ring_sync_index(ring, to);
+
+               ering->semaphore_mboxes[idx] = tmp[signal_offset];
+               ering->semaphore_seqno[idx] = ring->semaphore.sync_seqno[idx];
+       }
+}
+
+static void gen6_record_semaphore_state(struct drm_i915_private *dev_priv,
+                                       struct intel_engine_cs *ring,
+                                       struct drm_i915_error_ring *ering)
+{
+       ering->semaphore_mboxes[0] = I915_READ(RING_SYNC_0(ring->mmio_base));
+       ering->semaphore_mboxes[1] = I915_READ(RING_SYNC_1(ring->mmio_base));
+       ering->semaphore_seqno[0] = ring->semaphore.sync_seqno[0];
+       ering->semaphore_seqno[1] = ring->semaphore.sync_seqno[1];
+
+       if (HAS_VEBOX(dev_priv->dev)) {
+               ering->semaphore_mboxes[2] =
+                       I915_READ(RING_SYNC_2(ring->mmio_base));
+               ering->semaphore_seqno[2] = ring->semaphore.sync_seqno[2];
+       }
+}
+
 static void i915_record_ring_state(struct drm_device *dev,
+                                  struct drm_i915_error_state *error,
                                   struct intel_engine_cs *ring,
                                   struct drm_i915_error_ring *ering)
 {
@@ -755,18 +828,10 @@ static void i915_record_ring_state(struct drm_device *dev,
        if (INTEL_INFO(dev)->gen >= 6) {
                ering->rc_psmi = I915_READ(ring->mmio_base + 0x50);
                ering->fault_reg = I915_READ(RING_FAULT_REG(ring));
-               ering->semaphore_mboxes[0]
-                       = I915_READ(RING_SYNC_0(ring->mmio_base));
-               ering->semaphore_mboxes[1]
-                       = I915_READ(RING_SYNC_1(ring->mmio_base));
-               ering->semaphore_seqno[0] = ring->semaphore.sync_seqno[0];
-               ering->semaphore_seqno[1] = ring->semaphore.sync_seqno[1];
-       }
-
-       if (HAS_VEBOX(dev)) {
-               ering->semaphore_mboxes[2] =
-                       I915_READ(RING_SYNC_2(ring->mmio_base));
-               ering->semaphore_seqno[2] = ring->semaphore.sync_seqno[2];
+               if (INTEL_INFO(dev)->gen >= 8)
+                       gen8_record_semaphore_state(dev_priv, error, ring, ering);
+               else
+                       gen6_record_semaphore_state(dev_priv, ring, ering);
        }
 
        if (INTEL_INFO(dev)->gen >= 4) {
@@ -871,6 +936,9 @@ static void i915_gem_record_active_context(struct intel_engine_cs *ring,
                return;
 
        list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list) {
+               if (!i915_gem_obj_ggtt_bound(obj))
+                       continue;
+
                if ((error->ccid & PAGE_MASK) == i915_gem_obj_ggtt_offset(obj)) {
                        ering->ctx = i915_error_ggtt_object_create(dev_priv, obj);
                        break;
@@ -895,7 +963,7 @@ static void i915_gem_record_rings(struct drm_device *dev,
 
                error->ring[i].valid = true;
 
-               i915_record_ring_state(dev, ring, &error->ring[i]);
+               i915_record_ring_state(dev, error, ring, &error->ring[i]);
 
                request = i915_gem_find_active_request(ring);
                if (request) {
@@ -1032,6 +1100,7 @@ static void i915_capture_reg_state(struct drm_i915_private *dev_priv,
                                   struct drm_i915_error_state *error)
 {
        struct drm_device *dev = dev_priv->dev;
+       int i;
 
        /* General organization
         * 1. Registers specific to a single generation
@@ -1043,7 +1112,8 @@ static void i915_capture_reg_state(struct drm_i915_private *dev_priv,
 
        /* 1: Registers specific to a single generation */
        if (IS_VALLEYVIEW(dev)) {
-               error->ier = I915_READ(GTIER) | I915_READ(VLV_IER);
+               error->gtier[0] = I915_READ(GTIER);
+               error->ier = I915_READ(VLV_IER);
                error->forcewake = I915_READ(FORCEWAKE_VLV);
        }
 
@@ -1076,16 +1146,18 @@ static void i915_capture_reg_state(struct drm_i915_private *dev_priv,
        if (HAS_HW_CONTEXTS(dev))
                error->ccid = I915_READ(CCID);
 
-       if (HAS_PCH_SPLIT(dev))
-               error->ier = I915_READ(DEIER) | I915_READ(GTIER);
-       else {
-               if (IS_GEN2(dev))
-                       error->ier = I915_READ16(IER);
-               else
-                       error->ier = I915_READ(IER);
+       if (INTEL_INFO(dev)->gen >= 8) {
+               error->ier = I915_READ(GEN8_DE_MISC_IER);
+               for (i = 0; i < 4; i++)
+                       error->gtier[i] = I915_READ(GEN8_GT_IER(i));
+       } else if (HAS_PCH_SPLIT(dev)) {
+               error->ier = I915_READ(DEIER);
+               error->gtier[0] = I915_READ(GTIER);
+       } else if (IS_GEN2(dev)) {
+               error->ier = I915_READ16(IER);
+       } else if (!IS_VALLEYVIEW(dev)) {
+               error->ier = I915_READ(IER);
        }
-
-       /* 4: Everything else */
        error->eir = I915_READ(EIR);
        error->pgtbl_er = I915_READ(PGTBL_ER);
 
index c05c84f3f091382729b5cfcfa867471faed06a83..390ccc2a3096670d636af14a0164dd237a43d66c 100644 (file)
@@ -136,7 +136,7 @@ ironlake_enable_display_irq(struct drm_i915_private *dev_priv, u32 mask)
 {
        assert_spin_locked(&dev_priv->irq_lock);
 
-       if (WARN_ON(dev_priv->pm.irqs_disabled))
+       if (WARN_ON(!intel_irqs_enabled(dev_priv)))
                return;
 
        if ((dev_priv->irq_mask & mask) != 0) {
@@ -151,7 +151,7 @@ ironlake_disable_display_irq(struct drm_i915_private *dev_priv, u32 mask)
 {
        assert_spin_locked(&dev_priv->irq_lock);
 
-       if (WARN_ON(dev_priv->pm.irqs_disabled))
+       if (!intel_irqs_enabled(dev_priv))
                return;
 
        if ((dev_priv->irq_mask & mask) != mask) {
@@ -173,7 +173,7 @@ static void ilk_update_gt_irq(struct drm_i915_private *dev_priv,
 {
        assert_spin_locked(&dev_priv->irq_lock);
 
-       if (WARN_ON(dev_priv->pm.irqs_disabled))
+       if (WARN_ON(!intel_irqs_enabled(dev_priv)))
                return;
 
        dev_priv->gt_irq_mask &= ~interrupt_mask;
@@ -182,12 +182,12 @@ static void ilk_update_gt_irq(struct drm_i915_private *dev_priv,
        POSTING_READ(GTIMR);
 }
 
-void ilk_enable_gt_irq(struct drm_i915_private *dev_priv, uint32_t mask)
+void gen5_enable_gt_irq(struct drm_i915_private *dev_priv, uint32_t mask)
 {
        ilk_update_gt_irq(dev_priv, mask, mask);
 }
 
-void ilk_disable_gt_irq(struct drm_i915_private *dev_priv, uint32_t mask)
+void gen5_disable_gt_irq(struct drm_i915_private *dev_priv, uint32_t mask)
 {
        ilk_update_gt_irq(dev_priv, mask, 0);
 }
@@ -206,7 +206,7 @@ static void snb_update_pm_irq(struct drm_i915_private *dev_priv,
 
        assert_spin_locked(&dev_priv->irq_lock);
 
-       if (WARN_ON(dev_priv->pm.irqs_disabled))
+       if (WARN_ON(!intel_irqs_enabled(dev_priv)))
                return;
 
        new_val = dev_priv->pm_irq_mask;
@@ -220,12 +220,12 @@ static void snb_update_pm_irq(struct drm_i915_private *dev_priv,
        }
 }
 
-void snb_enable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask)
+void gen6_enable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask)
 {
        snb_update_pm_irq(dev_priv, mask, mask);
 }
 
-void snb_disable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask)
+void gen6_disable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask)
 {
        snb_update_pm_irq(dev_priv, mask, 0);
 }
@@ -264,7 +264,7 @@ static void bdw_update_pm_irq(struct drm_i915_private *dev_priv,
 
        assert_spin_locked(&dev_priv->irq_lock);
 
-       if (WARN_ON(dev_priv->pm.irqs_disabled))
+       if (WARN_ON(!intel_irqs_enabled(dev_priv)))
                return;
 
        new_val = dev_priv->pm_irq_mask;
@@ -278,12 +278,12 @@ static void bdw_update_pm_irq(struct drm_i915_private *dev_priv,
        }
 }
 
-void bdw_enable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask)
+void gen8_enable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask)
 {
        bdw_update_pm_irq(dev_priv, mask, mask);
 }
 
-void bdw_disable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask)
+void gen8_disable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask)
 {
        bdw_update_pm_irq(dev_priv, mask, 0);
 }
@@ -420,7 +420,7 @@ static void ibx_display_interrupt_update(struct drm_i915_private *dev_priv,
 
        assert_spin_locked(&dev_priv->irq_lock);
 
-       if (WARN_ON(dev_priv->pm.irqs_disabled))
+       if (WARN_ON(!intel_irqs_enabled(dev_priv)))
                return;
 
        I915_WRITE(SDEIMR, sdeimr);
@@ -1090,6 +1090,53 @@ static bool intel_hpd_irq_event(struct drm_device *dev,
        return true;
 }
 
+static void i915_digport_work_func(struct work_struct *work)
+{
+       struct drm_i915_private *dev_priv =
+               container_of(work, struct drm_i915_private, dig_port_work);
+       unsigned long irqflags;
+       u32 long_port_mask, short_port_mask;
+       struct intel_digital_port *intel_dig_port;
+       int i, ret;
+       u32 old_bits = 0;
+
+       spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
+       long_port_mask = dev_priv->long_hpd_port_mask;
+       dev_priv->long_hpd_port_mask = 0;
+       short_port_mask = dev_priv->short_hpd_port_mask;
+       dev_priv->short_hpd_port_mask = 0;
+       spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
+
+       for (i = 0; i < I915_MAX_PORTS; i++) {
+               bool valid = false;
+               bool long_hpd = false;
+               intel_dig_port = dev_priv->hpd_irq_port[i];
+               if (!intel_dig_port || !intel_dig_port->hpd_pulse)
+                       continue;
+
+               if (long_port_mask & (1 << i))  {
+                       valid = true;
+                       long_hpd = true;
+               } else if (short_port_mask & (1 << i))
+                       valid = true;
+
+               if (valid) {
+                       ret = intel_dig_port->hpd_pulse(intel_dig_port, long_hpd);
+                       if (ret == true) {
+                               /* if we get true fallback to old school hpd */
+                               old_bits |= (1 << intel_dig_port->base.hpd_pin);
+                       }
+               }
+       }
+
+       if (old_bits) {
+               spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
+               dev_priv->hpd_event_bits |= old_bits;
+               spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
+               schedule_work(&dev_priv->hotplug_work);
+       }
+}
+
 /*
  * Handle hotplug events outside the interrupt handler proper.
  */
@@ -1109,10 +1156,6 @@ static void i915_hotplug_work_func(struct work_struct *work)
        bool changed = false;
        u32 hpd_event_bits;
 
-       /* HPD irq before everything is fully set up. */
-       if (!dev_priv->enable_hotplug_processing)
-               return;
-
        mutex_lock(&mode_config->mutex);
        DRM_DEBUG_KMS("running encoder hotplug functions\n");
 
@@ -1122,6 +1165,8 @@ static void i915_hotplug_work_func(struct work_struct *work)
        dev_priv->hpd_event_bits = 0;
        list_for_each_entry(connector, &mode_config->connector_list, head) {
                intel_connector = to_intel_connector(connector);
+               if (!intel_connector->encoder)
+                       continue;
                intel_encoder = intel_connector->encoder;
                if (intel_encoder->hpd_pin > HPD_NONE &&
                    dev_priv->hpd_stats[intel_encoder->hpd_pin].hpd_mark == HPD_MARK_DISABLED &&
@@ -1152,6 +1197,8 @@ static void i915_hotplug_work_func(struct work_struct *work)
 
        list_for_each_entry(connector, &mode_config->connector_list, head) {
                intel_connector = to_intel_connector(connector);
+               if (!intel_connector->encoder)
+                       continue;
                intel_encoder = intel_connector->encoder;
                if (hpd_event_bits & (1 << intel_encoder->hpd_pin)) {
                        if (intel_encoder->hot_plug)
@@ -1218,10 +1265,138 @@ static void notify_ring(struct drm_device *dev,
 
        trace_i915_gem_request_complete(ring);
 
+       if (drm_core_check_feature(dev, DRIVER_MODESET))
+               intel_notify_mmio_flip(ring);
+
        wake_up_all(&ring->irq_queue);
        i915_queue_hangcheck(dev);
 }
 
+static u32 vlv_c0_residency(struct drm_i915_private *dev_priv,
+                           struct intel_rps_ei *rps_ei)
+{
+       u32 cz_ts, cz_freq_khz;
+       u32 render_count, media_count;
+       u32 elapsed_render, elapsed_media, elapsed_time;
+       u32 residency = 0;
+
+       cz_ts = vlv_punit_read(dev_priv, PUNIT_REG_CZ_TIMESTAMP);
+       cz_freq_khz = DIV_ROUND_CLOSEST(dev_priv->mem_freq * 1000, 4);
+
+       render_count = I915_READ(VLV_RENDER_C0_COUNT_REG);
+       media_count = I915_READ(VLV_MEDIA_C0_COUNT_REG);
+
+       if (rps_ei->cz_clock == 0) {
+               rps_ei->cz_clock = cz_ts;
+               rps_ei->render_c0 = render_count;
+               rps_ei->media_c0 = media_count;
+
+               return dev_priv->rps.cur_freq;
+       }
+
+       elapsed_time = cz_ts - rps_ei->cz_clock;
+       rps_ei->cz_clock = cz_ts;
+
+       elapsed_render = render_count - rps_ei->render_c0;
+       rps_ei->render_c0 = render_count;
+
+       elapsed_media = media_count - rps_ei->media_c0;
+       rps_ei->media_c0 = media_count;
+
+       /* Convert all the counters into common unit of milli sec */
+       elapsed_time /= VLV_CZ_CLOCK_TO_MILLI_SEC;
+       elapsed_render /=  cz_freq_khz;
+       elapsed_media /= cz_freq_khz;
+
+       /*
+        * Calculate overall C0 residency percentage
+        * only if elapsed time is non zero
+        */
+       if (elapsed_time) {
+               residency =
+                       ((max(elapsed_render, elapsed_media) * 100)
+                               / elapsed_time);
+       }
+
+       return residency;
+}
+
+/**
+ * vlv_calc_delay_from_C0_counters - Increase/Decrease freq based on GPU
+ * busy-ness calculated from C0 counters of render & media power wells
+ * @dev_priv: DRM device private
+ *
+ */
+static u32 vlv_calc_delay_from_C0_counters(struct drm_i915_private *dev_priv)
+{
+       u32 residency_C0_up = 0, residency_C0_down = 0;
+       u8 new_delay, adj;
+
+       dev_priv->rps.ei_interrupt_count++;
+
+       WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock));
+
+
+       if (dev_priv->rps.up_ei.cz_clock == 0) {
+               vlv_c0_residency(dev_priv, &dev_priv->rps.up_ei);
+               vlv_c0_residency(dev_priv, &dev_priv->rps.down_ei);
+               return dev_priv->rps.cur_freq;
+       }
+
+
+       /*
+        * To down throttle, C0 residency should be less than down threshold
+        * for continous EI intervals. So calculate down EI counters
+        * once in VLV_INT_COUNT_FOR_DOWN_EI
+        */
+       if (dev_priv->rps.ei_interrupt_count == VLV_INT_COUNT_FOR_DOWN_EI) {
+
+               dev_priv->rps.ei_interrupt_count = 0;
+
+               residency_C0_down = vlv_c0_residency(dev_priv,
+                                                    &dev_priv->rps.down_ei);
+       } else {
+               residency_C0_up = vlv_c0_residency(dev_priv,
+                                                  &dev_priv->rps.up_ei);
+       }
+
+       new_delay = dev_priv->rps.cur_freq;
+
+       adj = dev_priv->rps.last_adj;
+       /* C0 residency is greater than UP threshold. Increase Frequency */
+       if (residency_C0_up >= VLV_RP_UP_EI_THRESHOLD) {
+               if (adj > 0)
+                       adj *= 2;
+               else
+                       adj = 1;
+
+               if (dev_priv->rps.cur_freq < dev_priv->rps.max_freq_softlimit)
+                       new_delay = dev_priv->rps.cur_freq + adj;
+
+               /*
+                * For better performance, jump directly
+                * to RPe if we're below it.
+                */
+               if (new_delay < dev_priv->rps.efficient_freq)
+                       new_delay = dev_priv->rps.efficient_freq;
+
+       } else if (!dev_priv->rps.ei_interrupt_count &&
+                       (residency_C0_down < VLV_RP_DOWN_EI_THRESHOLD)) {
+               if (adj < 0)
+                       adj *= 2;
+               else
+                       adj = -1;
+               /*
+                * This means, C0 residency is less than down threshold over
+                * a period of VLV_INT_COUNT_FOR_DOWN_EI. So, reduce the freq
+                */
+               if (dev_priv->rps.cur_freq > dev_priv->rps.min_freq_softlimit)
+                       new_delay = dev_priv->rps.cur_freq + adj;
+       }
+
+       return new_delay;
+}
+
 static void gen6_pm_rps_work(struct work_struct *work)
 {
        struct drm_i915_private *dev_priv =
@@ -1232,11 +1407,11 @@ static void gen6_pm_rps_work(struct work_struct *work)
        spin_lock_irq(&dev_priv->irq_lock);
        pm_iir = dev_priv->rps.pm_iir;
        dev_priv->rps.pm_iir = 0;
-       if (IS_BROADWELL(dev_priv->dev))
-               bdw_enable_pm_irq(dev_priv, dev_priv->pm_rps_events);
+       if (INTEL_INFO(dev_priv->dev)->gen >= 8)
+               gen8_enable_pm_irq(dev_priv, dev_priv->pm_rps_events);
        else {
                /* Make sure not to corrupt PMIMR state used by ringbuffer */
-               snb_enable_pm_irq(dev_priv, dev_priv->pm_rps_events);
+               gen6_enable_pm_irq(dev_priv, dev_priv->pm_rps_events);
        }
        spin_unlock_irq(&dev_priv->irq_lock);
 
@@ -1252,8 +1427,10 @@ static void gen6_pm_rps_work(struct work_struct *work)
        if (pm_iir & GEN6_PM_RP_UP_THRESHOLD) {
                if (adj > 0)
                        adj *= 2;
-               else
-                       adj = 1;
+               else {
+                       /* CHV needs even encode values */
+                       adj = IS_CHERRYVIEW(dev_priv->dev) ? 2 : 1;
+               }
                new_delay = dev_priv->rps.cur_freq + adj;
 
                /*
@@ -1268,11 +1445,15 @@ static void gen6_pm_rps_work(struct work_struct *work)
                else
                        new_delay = dev_priv->rps.min_freq_softlimit;
                adj = 0;
+       } else if (pm_iir & GEN6_PM_RP_UP_EI_EXPIRED) {
+               new_delay = vlv_calc_delay_from_C0_counters(dev_priv);
        } else if (pm_iir & GEN6_PM_RP_DOWN_THRESHOLD) {
                if (adj < 0)
                        adj *= 2;
-               else
-                       adj = -1;
+               else {
+                       /* CHV needs even encode values */
+                       adj = IS_CHERRYVIEW(dev_priv->dev) ? -2 : -1;
+               }
                new_delay = dev_priv->rps.cur_freq + adj;
        } else { /* unknown event */
                new_delay = dev_priv->rps.cur_freq;
@@ -1372,7 +1553,7 @@ static void ivybridge_parity_work(struct work_struct *work)
 out:
        WARN_ON(dev_priv->l3_parity.which_slice);
        spin_lock_irqsave(&dev_priv->irq_lock, flags);
-       ilk_enable_gt_irq(dev_priv, GT_PARITY_ERROR(dev_priv->dev));
+       gen5_enable_gt_irq(dev_priv, GT_PARITY_ERROR(dev_priv->dev));
        spin_unlock_irqrestore(&dev_priv->irq_lock, flags);
 
        mutex_unlock(&dev_priv->dev->struct_mutex);
@@ -1386,7 +1567,7 @@ static void ivybridge_parity_error_irq_handler(struct drm_device *dev, u32 iir)
                return;
 
        spin_lock(&dev_priv->irq_lock);
-       ilk_disable_gt_irq(dev_priv, GT_PARITY_ERROR(dev));
+       gen5_disable_gt_irq(dev_priv, GT_PARITY_ERROR(dev));
        spin_unlock(&dev_priv->irq_lock);
 
        iir &= GT_PARITY_ERROR(dev);
@@ -1441,7 +1622,7 @@ static void gen8_rps_irq_handler(struct drm_i915_private *dev_priv, u32 pm_iir)
 
        spin_lock(&dev_priv->irq_lock);
        dev_priv->rps.pm_iir |= pm_iir & dev_priv->pm_rps_events;
-       bdw_disable_pm_irq(dev_priv, pm_iir & dev_priv->pm_rps_events);
+       gen8_disable_pm_irq(dev_priv, pm_iir & dev_priv->pm_rps_events);
        spin_unlock(&dev_priv->irq_lock);
 
        queue_work(dev_priv->wq, &dev_priv->rps.work);
@@ -1458,6 +1639,7 @@ static irqreturn_t gen8_gt_irq_handler(struct drm_device *dev,
        if (master_ctl & (GEN8_GT_RCS_IRQ | GEN8_GT_BCS_IRQ)) {
                tmp = I915_READ(GEN8_GT_IIR(0));
                if (tmp) {
+                       I915_WRITE(GEN8_GT_IIR(0), tmp);
                        ret = IRQ_HANDLED;
                        rcs = tmp >> GEN8_RCS_IRQ_SHIFT;
                        bcs = tmp >> GEN8_BCS_IRQ_SHIFT;
@@ -1465,7 +1647,6 @@ static irqreturn_t gen8_gt_irq_handler(struct drm_device *dev,
                                notify_ring(dev, &dev_priv->ring[RCS]);
                        if (bcs & GT_RENDER_USER_INTERRUPT)
                                notify_ring(dev, &dev_priv->ring[BCS]);
-                       I915_WRITE(GEN8_GT_IIR(0), tmp);
                } else
                        DRM_ERROR("The master control interrupt lied (GT0)!\n");
        }
@@ -1473,6 +1654,7 @@ static irqreturn_t gen8_gt_irq_handler(struct drm_device *dev,
        if (master_ctl & (GEN8_GT_VCS1_IRQ | GEN8_GT_VCS2_IRQ)) {
                tmp = I915_READ(GEN8_GT_IIR(1));
                if (tmp) {
+                       I915_WRITE(GEN8_GT_IIR(1), tmp);
                        ret = IRQ_HANDLED;
                        vcs = tmp >> GEN8_VCS1_IRQ_SHIFT;
                        if (vcs & GT_RENDER_USER_INTERRUPT)
@@ -1480,7 +1662,6 @@ static irqreturn_t gen8_gt_irq_handler(struct drm_device *dev,
                        vcs = tmp >> GEN8_VCS2_IRQ_SHIFT;
                        if (vcs & GT_RENDER_USER_INTERRUPT)
                                notify_ring(dev, &dev_priv->ring[VCS2]);
-                       I915_WRITE(GEN8_GT_IIR(1), tmp);
                } else
                        DRM_ERROR("The master control interrupt lied (GT1)!\n");
        }
@@ -1488,10 +1669,10 @@ static irqreturn_t gen8_gt_irq_handler(struct drm_device *dev,
        if (master_ctl & GEN8_GT_PM_IRQ) {
                tmp = I915_READ(GEN8_GT_IIR(2));
                if (tmp & dev_priv->pm_rps_events) {
-                       ret = IRQ_HANDLED;
-                       gen8_rps_irq_handler(dev_priv, tmp);
                        I915_WRITE(GEN8_GT_IIR(2),
                                   tmp & dev_priv->pm_rps_events);
+                       ret = IRQ_HANDLED;
+                       gen8_rps_irq_handler(dev_priv, tmp);
                } else
                        DRM_ERROR("The master control interrupt lied (PM)!\n");
        }
@@ -1499,11 +1680,11 @@ static irqreturn_t gen8_gt_irq_handler(struct drm_device *dev,
        if (master_ctl & GEN8_GT_VECS_IRQ) {
                tmp = I915_READ(GEN8_GT_IIR(3));
                if (tmp) {
+                       I915_WRITE(GEN8_GT_IIR(3), tmp);
                        ret = IRQ_HANDLED;
                        vcs = tmp >> GEN8_VECS_IRQ_SHIFT;
                        if (vcs & GT_RENDER_USER_INTERRUPT)
                                notify_ring(dev, &dev_priv->ring[VECS]);
-                       I915_WRITE(GEN8_GT_IIR(3), tmp);
                } else
                        DRM_ERROR("The master control interrupt lied (GT3)!\n");
        }
@@ -1514,23 +1695,104 @@ static irqreturn_t gen8_gt_irq_handler(struct drm_device *dev,
 #define HPD_STORM_DETECT_PERIOD 1000
 #define HPD_STORM_THRESHOLD 5
 
+static int ilk_port_to_hotplug_shift(enum port port)
+{
+       switch (port) {
+       case PORT_A:
+       case PORT_E:
+       default:
+               return -1;
+       case PORT_B:
+               return 0;
+       case PORT_C:
+               return 8;
+       case PORT_D:
+               return 16;
+       }
+}
+
+static int g4x_port_to_hotplug_shift(enum port port)
+{
+       switch (port) {
+       case PORT_A:
+       case PORT_E:
+       default:
+               return -1;
+       case PORT_B:
+               return 17;
+       case PORT_C:
+               return 19;
+       case PORT_D:
+               return 21;
+       }
+}
+
+static inline enum port get_port_from_pin(enum hpd_pin pin)
+{
+       switch (pin) {
+       case HPD_PORT_B:
+               return PORT_B;
+       case HPD_PORT_C:
+               return PORT_C;
+       case HPD_PORT_D:
+               return PORT_D;
+       default:
+               return PORT_A; /* no hpd */
+       }
+}
+
 static inline void intel_hpd_irq_handler(struct drm_device *dev,
                                         u32 hotplug_trigger,
+                                        u32 dig_hotplug_reg,
                                         const u32 *hpd)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        int i;
+       enum port port;
        bool storm_detected = false;
+       bool queue_dig = false, queue_hp = false;
+       u32 dig_shift;
+       u32 dig_port_mask = 0;
 
        if (!hotplug_trigger)
                return;
 
-       DRM_DEBUG_DRIVER("hotplug event received, stat 0x%08x\n",
-                         hotplug_trigger);
+       DRM_DEBUG_DRIVER("hotplug event received, stat 0x%08x, dig 0x%08x\n",
+                        hotplug_trigger, dig_hotplug_reg);
 
        spin_lock(&dev_priv->irq_lock);
        for (i = 1; i < HPD_NUM_PINS; i++) {
+               if (!(hpd[i] & hotplug_trigger))
+                       continue;
+
+               port = get_port_from_pin(i);
+               if (port && dev_priv->hpd_irq_port[port]) {
+                       bool long_hpd;
+
+                       if (IS_G4X(dev)) {
+                               dig_shift = g4x_port_to_hotplug_shift(port);
+                               long_hpd = (hotplug_trigger >> dig_shift) & PORTB_HOTPLUG_LONG_DETECT;
+                       } else {
+                               dig_shift = ilk_port_to_hotplug_shift(port);
+                               long_hpd = (dig_hotplug_reg >> dig_shift) & PORTB_HOTPLUG_LONG_DETECT;
+                       }
+
+                       DRM_DEBUG_DRIVER("digital hpd port %d %d\n", port, long_hpd);
+                       /* for long HPD pulses we want to have the digital queue happen,
+                          but we still want HPD storm detection to function. */
+                       if (long_hpd) {
+                               dev_priv->long_hpd_port_mask |= (1 << port);
+                               dig_port_mask |= hpd[i];
+                       } else {
+                               /* for short HPD just trigger the digital queue */
+                               dev_priv->short_hpd_port_mask |= (1 << port);
+                               hotplug_trigger &= ~hpd[i];
+                       }
+                       queue_dig = true;
+               }
+       }
 
+       for (i = 1; i < HPD_NUM_PINS; i++) {
                if (hpd[i] & hotplug_trigger &&
                    dev_priv->hpd_stats[i].hpd_mark == HPD_DISABLED) {
                        /*
@@ -1550,7 +1812,11 @@ static inline void intel_hpd_irq_handler(struct drm_device *dev,
                    dev_priv->hpd_stats[i].hpd_mark != HPD_ENABLED)
                        continue;
 
-               dev_priv->hpd_event_bits |= (1 << i);
+               if (!(dig_port_mask & hpd[i])) {
+                       dev_priv->hpd_event_bits |= (1 << i);
+                       queue_hp = true;
+               }
+
                if (!time_in_range(jiffies, dev_priv->hpd_stats[i].hpd_last_jiffies,
                                   dev_priv->hpd_stats[i].hpd_last_jiffies
                                   + msecs_to_jiffies(HPD_STORM_DETECT_PERIOD))) {
@@ -1579,7 +1845,10 @@ static inline void intel_hpd_irq_handler(struct drm_device *dev,
         * queue for otherwise the flush_work in the pageflip code will
         * deadlock.
         */
-       schedule_work(&dev_priv->hotplug_work);
+       if (queue_dig)
+               queue_work(dev_priv->dp_wq, &dev_priv->dig_port_work);
+       if (queue_hp)
+               schedule_work(&dev_priv->hotplug_work);
 }
 
 static void gmbus_irq_handler(struct drm_device *dev)
@@ -1700,7 +1969,7 @@ static void gen6_rps_irq_handler(struct drm_i915_private *dev_priv, u32 pm_iir)
        if (pm_iir & dev_priv->pm_rps_events) {
                spin_lock(&dev_priv->irq_lock);
                dev_priv->rps.pm_iir |= pm_iir & dev_priv->pm_rps_events;
-               snb_disable_pm_irq(dev_priv, pm_iir & dev_priv->pm_rps_events);
+               gen6_disable_pm_irq(dev_priv, pm_iir & dev_priv->pm_rps_events);
                spin_unlock(&dev_priv->irq_lock);
 
                queue_work(dev_priv->wq, &dev_priv->rps.work);
@@ -1809,26 +2078,28 @@ static void i9xx_hpd_irq_handler(struct drm_device *dev)
        struct drm_i915_private *dev_priv = dev->dev_private;
        u32 hotplug_status = I915_READ(PORT_HOTPLUG_STAT);
 
-       if (IS_G4X(dev)) {
-               u32 hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_G4X;
+       if (hotplug_status) {
+               I915_WRITE(PORT_HOTPLUG_STAT, hotplug_status);
+               /*
+                * Make sure hotplug status is cleared before we clear IIR, or else we
+                * may miss hotplug events.
+                */
+               POSTING_READ(PORT_HOTPLUG_STAT);
 
-               intel_hpd_irq_handler(dev, hotplug_trigger, hpd_status_g4x);
-       } else {
-               u32 hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_I915;
+               if (IS_G4X(dev)) {
+                       u32 hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_G4X;
 
-               intel_hpd_irq_handler(dev, hotplug_trigger, hpd_status_i915);
-       }
+                       intel_hpd_irq_handler(dev, hotplug_trigger, 0, hpd_status_g4x);
+               } else {
+                       u32 hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_I915;
 
-       if ((IS_G4X(dev) || IS_VALLEYVIEW(dev)) &&
-           hotplug_status & DP_AUX_CHANNEL_MASK_INT_STATUS_G4X)
-               dp_aux_irq_handler(dev);
+                       intel_hpd_irq_handler(dev, hotplug_trigger, 0, hpd_status_i915);
+               }
 
-       I915_WRITE(PORT_HOTPLUG_STAT, hotplug_status);
-       /*
-        * Make sure hotplug status is cleared before we clear IIR, or else we
-        * may miss hotplug events.
-        */
-       POSTING_READ(PORT_HOTPLUG_STAT);
+               if ((IS_G4X(dev) || IS_VALLEYVIEW(dev)) &&
+                   hotplug_status & DP_AUX_CHANNEL_MASK_INT_STATUS_G4X)
+                       dp_aux_irq_handler(dev);
+       }
 }
 
 static irqreturn_t valleyview_irq_handler(int irq, void *arg)
@@ -1839,29 +2110,36 @@ static irqreturn_t valleyview_irq_handler(int irq, void *arg)
        irqreturn_t ret = IRQ_NONE;
 
        while (true) {
-               iir = I915_READ(VLV_IIR);
+               /* Find, clear, then process each source of interrupt */
+
                gt_iir = I915_READ(GTIIR);
+               if (gt_iir)
+                       I915_WRITE(GTIIR, gt_iir);
+
                pm_iir = I915_READ(GEN6_PMIIR);
+               if (pm_iir)
+                       I915_WRITE(GEN6_PMIIR, pm_iir);
+
+               iir = I915_READ(VLV_IIR);
+               if (iir) {
+                       /* Consume port before clearing IIR or we'll miss events */
+                       if (iir & I915_DISPLAY_PORT_INTERRUPT)
+                               i9xx_hpd_irq_handler(dev);
+                       I915_WRITE(VLV_IIR, iir);
+               }
 
                if (gt_iir == 0 && pm_iir == 0 && iir == 0)
                        goto out;
 
                ret = IRQ_HANDLED;
 
-               snb_gt_irq_handler(dev, dev_priv, gt_iir);
-
-               valleyview_pipestat_irq_handler(dev, iir);
-
-               /* Consume port.  Then clear IIR or we'll miss events */
-               if (iir & I915_DISPLAY_PORT_INTERRUPT)
-                       i9xx_hpd_irq_handler(dev);
-
+               if (gt_iir)
+                       snb_gt_irq_handler(dev, dev_priv, gt_iir);
                if (pm_iir)
                        gen6_rps_irq_handler(dev_priv, pm_iir);
-
-               I915_WRITE(GTIIR, gt_iir);
-               I915_WRITE(GEN6_PMIIR, pm_iir);
-               I915_WRITE(VLV_IIR, iir);
+               /* Call regardless, as some status bits might not be
+                * signalled in iir */
+               valleyview_pipestat_irq_handler(dev, iir);
        }
 
 out:
@@ -1882,21 +2160,27 @@ static irqreturn_t cherryview_irq_handler(int irq, void *arg)
                if (master_ctl == 0 && iir == 0)
                        break;
 
+               ret = IRQ_HANDLED;
+
                I915_WRITE(GEN8_MASTER_IRQ, 0);
 
-               gen8_gt_irq_handler(dev, dev_priv, master_ctl);
+               /* Find, clear, then process each source of interrupt */
 
-               valleyview_pipestat_irq_handler(dev, iir);
+               if (iir) {
+                       /* Consume port before clearing IIR or we'll miss events */
+                       if (iir & I915_DISPLAY_PORT_INTERRUPT)
+                               i9xx_hpd_irq_handler(dev);
+                       I915_WRITE(VLV_IIR, iir);
+               }
 
-               /* Consume port.  Then clear IIR or we'll miss events */
-               i9xx_hpd_irq_handler(dev);
+               gen8_gt_irq_handler(dev, dev_priv, master_ctl);
 
-               I915_WRITE(VLV_IIR, iir);
+               /* Call regardless, as some status bits might not be
+                * signalled in iir */
+               valleyview_pipestat_irq_handler(dev, iir);
 
                I915_WRITE(GEN8_MASTER_IRQ, DE_MASTER_IRQ_CONTROL);
                POSTING_READ(GEN8_MASTER_IRQ);
-
-               ret = IRQ_HANDLED;
        }
 
        return ret;
@@ -1907,8 +2191,12 @@ static void ibx_irq_handler(struct drm_device *dev, u32 pch_iir)
        struct drm_i915_private *dev_priv = dev->dev_private;
        int pipe;
        u32 hotplug_trigger = pch_iir & SDE_HOTPLUG_MASK;
+       u32 dig_hotplug_reg;
 
-       intel_hpd_irq_handler(dev, hotplug_trigger, hpd_ibx);
+       dig_hotplug_reg = I915_READ(PCH_PORT_HOTPLUG);
+       I915_WRITE(PCH_PORT_HOTPLUG, dig_hotplug_reg);
+
+       intel_hpd_irq_handler(dev, hotplug_trigger, dig_hotplug_reg, hpd_ibx);
 
        if (pch_iir & SDE_AUDIO_POWER_MASK) {
                int port = ffs((pch_iir & SDE_AUDIO_POWER_MASK) >>
@@ -2014,8 +2302,12 @@ static void cpt_irq_handler(struct drm_device *dev, u32 pch_iir)
        struct drm_i915_private *dev_priv = dev->dev_private;
        int pipe;
        u32 hotplug_trigger = pch_iir & SDE_HOTPLUG_MASK_CPT;
+       u32 dig_hotplug_reg;
+
+       dig_hotplug_reg = I915_READ(PCH_PORT_HOTPLUG);
+       I915_WRITE(PCH_PORT_HOTPLUG, dig_hotplug_reg);
 
-       intel_hpd_irq_handler(dev, hotplug_trigger, hpd_cpt);
+       intel_hpd_irq_handler(dev, hotplug_trigger, dig_hotplug_reg, hpd_cpt);
 
        if (pch_iir & SDE_AUDIO_POWER_MASK_CPT) {
                int port = ffs((pch_iir & SDE_AUDIO_POWER_MASK_CPT) >>
@@ -2132,6 +2424,14 @@ static void ivb_display_irq_handler(struct drm_device *dev, u32 de_iir)
        }
 }
 
+/*
+ * To handle irqs with the minimum potential races with fresh interrupts, we:
+ * 1 - Disable Master Interrupt Control.
+ * 2 - Find the source(s) of the interrupt.
+ * 3 - Clear the Interrupt Identity bits (IIR).
+ * 4 - Process the interrupt(s) that had bits set in the IIRs.
+ * 5 - Re-enable Master Interrupt Control.
+ */
 static irqreturn_t ironlake_irq_handler(int irq, void *arg)
 {
        struct drm_device *dev = arg;
@@ -2159,32 +2459,34 @@ static irqreturn_t ironlake_irq_handler(int irq, void *arg)
                POSTING_READ(SDEIER);
        }
 
+       /* Find, clear, then process each source of interrupt */
+
        gt_iir = I915_READ(GTIIR);
        if (gt_iir) {
+               I915_WRITE(GTIIR, gt_iir);
+               ret = IRQ_HANDLED;
                if (INTEL_INFO(dev)->gen >= 6)
                        snb_gt_irq_handler(dev, dev_priv, gt_iir);
                else
                        ilk_gt_irq_handler(dev, dev_priv, gt_iir);
-               I915_WRITE(GTIIR, gt_iir);
-               ret = IRQ_HANDLED;
        }
 
        de_iir = I915_READ(DEIIR);
        if (de_iir) {
+               I915_WRITE(DEIIR, de_iir);
+               ret = IRQ_HANDLED;
                if (INTEL_INFO(dev)->gen >= 7)
                        ivb_display_irq_handler(dev, de_iir);
                else
                        ilk_display_irq_handler(dev, de_iir);
-               I915_WRITE(DEIIR, de_iir);
-               ret = IRQ_HANDLED;
        }
 
        if (INTEL_INFO(dev)->gen >= 6) {
                u32 pm_iir = I915_READ(GEN6_PMIIR);
                if (pm_iir) {
-                       gen6_rps_irq_handler(dev_priv, pm_iir);
                        I915_WRITE(GEN6_PMIIR, pm_iir);
                        ret = IRQ_HANDLED;
+                       gen6_rps_irq_handler(dev_priv, pm_iir);
                }
        }
 
@@ -2215,36 +2517,36 @@ static irqreturn_t gen8_irq_handler(int irq, void *arg)
        I915_WRITE(GEN8_MASTER_IRQ, 0);
        POSTING_READ(GEN8_MASTER_IRQ);
 
+       /* Find, clear, then process each source of interrupt */
+
        ret = gen8_gt_irq_handler(dev, dev_priv, master_ctl);
 
        if (master_ctl & GEN8_DE_MISC_IRQ) {
                tmp = I915_READ(GEN8_DE_MISC_IIR);
-               if (tmp & GEN8_DE_MISC_GSE)
-                       intel_opregion_asle_intr(dev);
-               else if (tmp)
-                       DRM_ERROR("Unexpected DE Misc interrupt\n");
-               else
-                       DRM_ERROR("The master control interrupt lied (DE MISC)!\n");
-
                if (tmp) {
                        I915_WRITE(GEN8_DE_MISC_IIR, tmp);
                        ret = IRQ_HANDLED;
+                       if (tmp & GEN8_DE_MISC_GSE)
+                               intel_opregion_asle_intr(dev);
+                       else
+                               DRM_ERROR("Unexpected DE Misc interrupt\n");
                }
+               else
+                       DRM_ERROR("The master control interrupt lied (DE MISC)!\n");
        }
 
        if (master_ctl & GEN8_DE_PORT_IRQ) {
                tmp = I915_READ(GEN8_DE_PORT_IIR);
-               if (tmp & GEN8_AUX_CHANNEL_A)
-                       dp_aux_irq_handler(dev);
-               else if (tmp)
-                       DRM_ERROR("Unexpected DE Port interrupt\n");
-               else
-                       DRM_ERROR("The master control interrupt lied (DE PORT)!\n");
-
                if (tmp) {
                        I915_WRITE(GEN8_DE_PORT_IIR, tmp);
                        ret = IRQ_HANDLED;
+                       if (tmp & GEN8_AUX_CHANNEL_A)
+                               dp_aux_irq_handler(dev);
+                       else
+                               DRM_ERROR("Unexpected DE Port interrupt\n");
                }
+               else
+                       DRM_ERROR("The master control interrupt lied (DE PORT)!\n");
        }
 
        for_each_pipe(pipe) {
@@ -2254,33 +2556,32 @@ static irqreturn_t gen8_irq_handler(int irq, void *arg)
                        continue;
 
                pipe_iir = I915_READ(GEN8_DE_PIPE_IIR(pipe));
-               if (pipe_iir & GEN8_PIPE_VBLANK)
-                       intel_pipe_handle_vblank(dev, pipe);
-
-               if (pipe_iir & GEN8_PIPE_PRIMARY_FLIP_DONE) {
-                       intel_prepare_page_flip(dev, pipe);
-                       intel_finish_page_flip_plane(dev, pipe);
-               }
+               if (pipe_iir) {
+                       ret = IRQ_HANDLED;
+                       I915_WRITE(GEN8_DE_PIPE_IIR(pipe), pipe_iir);
+                       if (pipe_iir & GEN8_PIPE_VBLANK)
+                               intel_pipe_handle_vblank(dev, pipe);
 
-               if (pipe_iir & GEN8_PIPE_CDCLK_CRC_DONE)
-                       hsw_pipe_crc_irq_handler(dev, pipe);
+                       if (pipe_iir & GEN8_PIPE_PRIMARY_FLIP_DONE) {
+                               intel_prepare_page_flip(dev, pipe);
+                               intel_finish_page_flip_plane(dev, pipe);
+                       }
 
-               if (pipe_iir & GEN8_PIPE_FIFO_UNDERRUN) {
-                       if (intel_set_cpu_fifo_underrun_reporting(dev, pipe,
-                                                                 false))
-                               DRM_ERROR("Pipe %c FIFO underrun\n",
-                                         pipe_name(pipe));
-               }
+                       if (pipe_iir & GEN8_PIPE_CDCLK_CRC_DONE)
+                               hsw_pipe_crc_irq_handler(dev, pipe);
 
-               if (pipe_iir & GEN8_DE_PIPE_IRQ_FAULT_ERRORS) {
-                       DRM_ERROR("Fault errors on pipe %c\n: 0x%08x",
-                                 pipe_name(pipe),
-                                 pipe_iir & GEN8_DE_PIPE_IRQ_FAULT_ERRORS);
-               }
+                       if (pipe_iir & GEN8_PIPE_FIFO_UNDERRUN) {
+                               if (intel_set_cpu_fifo_underrun_reporting(dev, pipe,
+                                                                         false))
+                                       DRM_ERROR("Pipe %c FIFO underrun\n",
+                                                 pipe_name(pipe));
+                       }
 
-               if (pipe_iir) {
-                       ret = IRQ_HANDLED;
-                       I915_WRITE(GEN8_DE_PIPE_IIR(pipe), pipe_iir);
+                       if (pipe_iir & GEN8_DE_PIPE_IRQ_FAULT_ERRORS) {
+                               DRM_ERROR("Fault errors on pipe %c\n: 0x%08x",
+                                         pipe_name(pipe),
+                                         pipe_iir & GEN8_DE_PIPE_IRQ_FAULT_ERRORS);
+                       }
                } else
                        DRM_ERROR("The master control interrupt lied (DE PIPE)!\n");
        }
@@ -2292,13 +2593,13 @@ static irqreturn_t gen8_irq_handler(int irq, void *arg)
                 * on older pch-split platforms. But this needs testing.
                 */
                u32 pch_iir = I915_READ(SDEIIR);
-
-               cpt_irq_handler(dev, pch_iir);
-
                if (pch_iir) {
                        I915_WRITE(SDEIIR, pch_iir);
                        ret = IRQ_HANDLED;
-               }
+                       cpt_irq_handler(dev, pch_iir);
+               } else
+                       DRM_ERROR("The master control interrupt lied (SDE)!\n");
+
        }
 
        I915_WRITE(GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL);
@@ -2753,12 +3054,7 @@ static bool
 ipehr_is_semaphore_wait(struct drm_device *dev, u32 ipehr)
 {
        if (INTEL_INFO(dev)->gen >= 8) {
-               /*
-                * FIXME: gen8 semaphore support - currently we don't emit
-                * semaphores on bdw anyway, but this needs to be addressed when
-                * we merge that code.
-                */
-               return false;
+               return (ipehr >> 23) == 0x1c;
        } else {
                ipehr &= ~MI_SEMAPHORE_SYNC_MASK;
                return ipehr == (MI_SEMAPHORE_MBOX | MI_SEMAPHORE_COMPARE |
@@ -2767,19 +3063,20 @@ ipehr_is_semaphore_wait(struct drm_device *dev, u32 ipehr)
 }
 
 static struct intel_engine_cs *
-semaphore_wait_to_signaller_ring(struct intel_engine_cs *ring, u32 ipehr)
+semaphore_wait_to_signaller_ring(struct intel_engine_cs *ring, u32 ipehr, u64 offset)
 {
        struct drm_i915_private *dev_priv = ring->dev->dev_private;
        struct intel_engine_cs *signaller;
        int i;
 
        if (INTEL_INFO(dev_priv->dev)->gen >= 8) {
-               /*
-                * FIXME: gen8 semaphore support - currently we don't emit
-                * semaphores on bdw anyway, but this needs to be addressed when
-                * we merge that code.
-                */
-               return NULL;
+               for_each_ring(signaller, dev_priv, i) {
+                       if (ring == signaller)
+                               continue;
+
+                       if (offset == signaller->semaphore.signal_ggtt[ring->id])
+                               return signaller;
+               }
        } else {
                u32 sync_bits = ipehr & MI_SEMAPHORE_SYNC_MASK;
 
@@ -2792,8 +3089,8 @@ semaphore_wait_to_signaller_ring(struct intel_engine_cs *ring, u32 ipehr)
                }
        }
 
-       DRM_ERROR("No signaller ring found for ring %i, ipehr 0x%08x\n",
-                 ring->id, ipehr);
+       DRM_ERROR("No signaller ring found for ring %i, ipehr 0x%08x, offset 0x%016llx\n",
+                 ring->id, ipehr, offset);
 
        return NULL;
 }
@@ -2803,7 +3100,8 @@ semaphore_waits_for(struct intel_engine_cs *ring, u32 *seqno)
 {
        struct drm_i915_private *dev_priv = ring->dev->dev_private;
        u32 cmd, ipehr, head;
-       int i;
+       u64 offset = 0;
+       int i, backwards;
 
        ipehr = I915_READ(RING_IPEHR(ring->mmio_base));
        if (!ipehr_is_semaphore_wait(ring->dev, ipehr))
@@ -2812,13 +3110,15 @@ semaphore_waits_for(struct intel_engine_cs *ring, u32 *seqno)
        /*
         * HEAD is likely pointing to the dword after the actual command,
         * so scan backwards until we find the MBOX. But limit it to just 3
-        * dwords. Note that we don't care about ACTHD here since that might
+        * or 4 dwords depending on the semaphore wait command size.
+        * Note that we don't care about ACTHD here since that might
         * point at at batch, and semaphores are always emitted into the
         * ringbuffer itself.
         */
        head = I915_READ_HEAD(ring) & HEAD_ADDR;
+       backwards = (INTEL_INFO(ring->dev)->gen >= 8) ? 5 : 4;
 
-       for (i = 4; i; --i) {
+       for (i = backwards; i; --i) {
                /*
                 * Be paranoid and presume the hw has gone off into the wild -
                 * our ring is smaller than what the hardware (and hence
@@ -2838,7 +3138,12 @@ semaphore_waits_for(struct intel_engine_cs *ring, u32 *seqno)
                return NULL;
 
        *seqno = ioread32(ring->buffer->virtual_start + head + 4) + 1;
-       return semaphore_wait_to_signaller_ring(ring, ipehr);
+       if (INTEL_INFO(ring->dev)->gen >= 8) {
+               offset = ioread32(ring->buffer->virtual_start + head + 12);
+               offset <<= 32;
+               offset = ioread32(ring->buffer->virtual_start + head + 8);
+       }
+       return semaphore_wait_to_signaller_ring(ring, ipehr, offset);
 }
 
 static int semaphore_passed(struct intel_engine_cs *ring)
@@ -2884,8 +3189,14 @@ ring_stuck(struct intel_engine_cs *ring, u64 acthd)
        struct drm_i915_private *dev_priv = dev->dev_private;
        u32 tmp;
 
-       if (ring->hangcheck.acthd != acthd)
-               return HANGCHECK_ACTIVE;
+       if (acthd != ring->hangcheck.acthd) {
+               if (acthd > ring->hangcheck.max_acthd) {
+                       ring->hangcheck.max_acthd = acthd;
+                       return HANGCHECK_ACTIVE;
+               }
+
+               return HANGCHECK_ACTIVE_LOOP;
+       }
 
        if (IS_GEN2(dev))
                return HANGCHECK_HUNG;
@@ -2996,8 +3307,9 @@ static void i915_hangcheck_elapsed(unsigned long data)
                                switch (ring->hangcheck.action) {
                                case HANGCHECK_IDLE:
                                case HANGCHECK_WAIT:
-                                       break;
                                case HANGCHECK_ACTIVE:
+                                       break;
+                               case HANGCHECK_ACTIVE_LOOP:
                                        ring->hangcheck.score += BUSY;
                                        break;
                                case HANGCHECK_KICK:
@@ -3017,6 +3329,8 @@ static void i915_hangcheck_elapsed(unsigned long data)
                         */
                        if (ring->hangcheck.score > 0)
                                ring->hangcheck.score--;
+
+                       ring->hangcheck.acthd = ring->hangcheck.max_acthd = 0;
                }
 
                ring->hangcheck.seqno = seqno;
@@ -3159,7 +3473,9 @@ static void gen8_irq_reset(struct drm_device *dev)
        gen8_gt_irq_reset(dev_priv);
 
        for_each_pipe(pipe)
-               GEN8_IRQ_RESET_NDX(DE_PIPE, pipe);
+               if (intel_display_power_enabled(dev_priv,
+                                               POWER_DOMAIN_PIPE(pipe)))
+                       GEN8_IRQ_RESET_NDX(DE_PIPE, pipe);
 
        GEN5_IRQ_RESET(GEN8_DE_PORT_);
        GEN5_IRQ_RESET(GEN8_DE_MISC_);
@@ -3168,6 +3484,18 @@ static void gen8_irq_reset(struct drm_device *dev)
        ibx_irq_reset(dev);
 }
 
+void gen8_irq_power_well_post_enable(struct drm_i915_private *dev_priv)
+{
+       unsigned long irqflags;
+
+       spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
+       GEN8_IRQ_INIT_NDX(DE_PIPE, PIPE_B, dev_priv->de_irq_mask[PIPE_B],
+                         ~dev_priv->de_irq_mask[PIPE_B]);
+       GEN8_IRQ_INIT_NDX(DE_PIPE, PIPE_C, dev_priv->de_irq_mask[PIPE_C],
+                         ~dev_priv->de_irq_mask[PIPE_C]);
+       spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
+}
+
 static void cherryview_irq_preinstall(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
@@ -3492,8 +3820,11 @@ static void gen8_de_irq_postinstall(struct drm_i915_private *dev_priv)
        dev_priv->de_irq_mask[PIPE_C] = ~de_pipe_masked;
 
        for_each_pipe(pipe)
-               GEN8_IRQ_INIT_NDX(DE_PIPE, pipe, dev_priv->de_irq_mask[pipe],
-                                 de_pipe_enables);
+               if (intel_display_power_enabled(dev_priv,
+                               POWER_DOMAIN_PIPE(pipe)))
+                       GEN8_IRQ_INIT_NDX(DE_PIPE, pipe,
+                                         dev_priv->de_irq_mask[pipe],
+                                         de_pipe_enables);
 
        GEN5_IRQ_INIT(GEN8_DE_PORT_, ~GEN8_AUX_CHANNEL_A, GEN8_AUX_CHANNEL_A);
 }
@@ -4324,12 +4655,17 @@ void intel_irq_init(struct drm_device *dev)
        struct drm_i915_private *dev_priv = dev->dev_private;
 
        INIT_WORK(&dev_priv->hotplug_work, i915_hotplug_work_func);
+       INIT_WORK(&dev_priv->dig_port_work, i915_digport_work_func);
        INIT_WORK(&dev_priv->gpu_error.work, i915_error_work_func);
        INIT_WORK(&dev_priv->rps.work, gen6_pm_rps_work);
        INIT_WORK(&dev_priv->l3_parity.error_work, ivybridge_parity_work);
 
        /* Let's track the enabled rps events */
-       dev_priv->pm_rps_events = GEN6_PM_RPS_EVENTS;
+       if (IS_VALLEYVIEW(dev))
+               /* WaGsvRC0ResidenncyMethod:VLV */
+               dev_priv->pm_rps_events = GEN6_PM_RP_UP_EI_EXPIRED;
+       else
+               dev_priv->pm_rps_events = GEN6_PM_RPS_EVENTS;
 
        setup_timer(&dev_priv->gpu_error.hangcheck_timer,
                    i915_hangcheck_elapsed,
@@ -4339,6 +4675,9 @@ void intel_irq_init(struct drm_device *dev)
 
        pm_qos_add_request(&dev_priv->pm_qos, PM_QOS_CPU_DMA_LATENCY, PM_QOS_DEFAULT_VALUE);
 
+       /* Haven't installed the IRQ handler yet */
+       dev_priv->pm._irqs_disabled = true;
+
        if (IS_GEN2(dev)) {
                dev->max_vblank_count = 0;
                dev->driver->get_vblank_counter = i8xx_get_vblank_counter;
@@ -4426,7 +4765,9 @@ void intel_hpd_init(struct drm_device *dev)
        list_for_each_entry(connector, &mode_config->connector_list, head) {
                struct intel_connector *intel_connector = to_intel_connector(connector);
                connector->polled = intel_connector->polled;
-               if (!connector->polled && I915_HAS_HOTPLUG(dev) && intel_connector->encoder->hpd_pin > HPD_NONE)
+               if (connector->encoder && !connector->polled && I915_HAS_HOTPLUG(dev) && intel_connector->encoder->hpd_pin > HPD_NONE)
+                       connector->polled = DRM_CONNECTOR_POLL_HPD;
+               if (intel_connector->mst_port)
                        connector->polled = DRM_CONNECTOR_POLL_HPD;
        }
 
@@ -4444,7 +4785,7 @@ void intel_runtime_pm_disable_interrupts(struct drm_device *dev)
        struct drm_i915_private *dev_priv = dev->dev_private;
 
        dev->driver->irq_uninstall(dev);
-       dev_priv->pm.irqs_disabled = true;
+       dev_priv->pm._irqs_disabled = true;
 }
 
 /* Restore interrupts so we can recover from runtime PM. */
@@ -4452,7 +4793,7 @@ void intel_runtime_pm_restore_interrupts(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
 
-       dev_priv->pm.irqs_disabled = false;
+       dev_priv->pm._irqs_disabled = false;
        dev->driver->irq_preinstall(dev);
        dev->driver->irq_postinstall(dev);
 }
index d05a2afa17dc605acc294e0e15ae88ac200b5093..7f84dd263ee8966d414341a4d6471d52ca0578c3 100644 (file)
@@ -48,6 +48,8 @@ struct i915_params i915 __read_mostly = {
        .disable_display = 0,
        .enable_cmd_parser = 1,
        .disable_vtd_wa = 0,
+       .use_mmio_flip = 0,
+       .mmio_debug = 0,
 };
 
 module_param_named(modeset, i915.modeset, int, 0400);
@@ -156,3 +158,12 @@ MODULE_PARM_DESC(disable_vtd_wa, "Disable all VT-d workarounds (default: false)"
 module_param_named(enable_cmd_parser, i915.enable_cmd_parser, int, 0600);
 MODULE_PARM_DESC(enable_cmd_parser,
                 "Enable command parsing (1=enabled [default], 0=disabled)");
+
+module_param_named(use_mmio_flip, i915.use_mmio_flip, int, 0600);
+MODULE_PARM_DESC(use_mmio_flip,
+                "use MMIO flips (-1=never, 0=driver discretion [default], 1=always)");
+
+module_param_named(mmio_debug, i915.mmio_debug, bool, 0600);
+MODULE_PARM_DESC(mmio_debug,
+       "Enable the MMIO debug code (default: false). This may negatively "
+       "affect performance.");
index a5bab61bfc00354afbfe08c2a0a43d10425e52f4..e4d7607da2c482ee6e31576e746de5ca71b6e28a 100644 (file)
@@ -29,8 +29,8 @@
 #define _TRANSCODER(tran, a, b) ((a) + (tran)*((b)-(a)))
 
 #define _PORT(port, a, b) ((a) + (port)*((b)-(a)))
-#define _PIPE3(pipe, a, b, c) (pipe < 2 ? _PIPE(pipe, a, b) : c)
-#define _PORT3(port, a, b, c) (port < 2 ? _PORT(port, a, b) : c)
+#define _PIPE3(pipe, a, b, c) ((pipe) == PIPE_A ? (a) : \
+                              (pipe) == PIPE_B ? (b) : (c))
 
 #define _MASKED_BIT_ENABLE(a) (((a) << 16) | (a))
 #define _MASKED_BIT_DISABLE(a) ((a) << 16)
 #define   MI_DISPLAY_FLIP_IVB_SPRITE_B (3 << 19)
 #define   MI_DISPLAY_FLIP_IVB_PLANE_C  (4 << 19)
 #define   MI_DISPLAY_FLIP_IVB_SPRITE_C (5 << 19)
-#define MI_SEMAPHORE_MBOX      MI_INSTR(0x16, 1) /* gen6+ */
+#define MI_SEMAPHORE_MBOX      MI_INSTR(0x16, 1) /* gen6, gen7 */
 #define   MI_SEMAPHORE_GLOBAL_GTT    (1<<22)
 #define   MI_SEMAPHORE_UPDATE      (1<<21)
 #define   MI_SEMAPHORE_COMPARE     (1<<20)
 #define   MI_RESTORE_EXT_STATE_EN      (1<<2)
 #define   MI_FORCE_RESTORE             (1<<1)
 #define   MI_RESTORE_INHIBIT           (1<<0)
+#define MI_SEMAPHORE_SIGNAL    MI_INSTR(0x1b, 0) /* GEN8+ */
+#define   MI_SEMAPHORE_TARGET(engine)  ((engine)<<15)
+#define MI_SEMAPHORE_WAIT      MI_INSTR(0x1c, 2) /* GEN8+ */
+#define   MI_SEMAPHORE_POLL            (1<<15)
+#define   MI_SEMAPHORE_SAD_GTE_SDD     (1<<12)
 #define MI_STORE_DWORD_IMM     MI_INSTR(0x20, 1)
 #define   MI_MEM_VIRTUAL       (1 << 22) /* 965+ only */
 #define MI_STORE_DWORD_INDEX   MI_INSTR(0x21, 1)
 #define   PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE                (1<<10) /* GM45+ only */
 #define   PIPE_CONTROL_INDIRECT_STATE_DISABLE          (1<<9)
 #define   PIPE_CONTROL_NOTIFY                          (1<<8)
+#define   PIPE_CONTROL_FLUSH_ENABLE                    (1<<7) /* gen7+ */
 #define   PIPE_CONTROL_VF_CACHE_INVALIDATE             (1<<4)
 #define   PIPE_CONTROL_CONST_CACHE_INVALIDATE          (1<<3)
 #define   PIPE_CONTROL_STATE_CACHE_INVALIDATE          (1<<2)
@@ -525,10 +531,21 @@ enum punit_power_well {
 #define PUNIT_REG_GPU_FREQ_STS                 0xd8
 #define   GENFREQSTATUS                                (1<<0)
 #define PUNIT_REG_MEDIA_TURBO_FREQ_REQ         0xdc
+#define PUNIT_REG_CZ_TIMESTAMP                 0xce
 
 #define PUNIT_FUSE_BUS2                                0xf6 /* bits 47:40 */
 #define PUNIT_FUSE_BUS1                                0xf5 /* bits 55:48 */
 
+#define PUNIT_GPU_STATUS_REG                   0xdb
+#define PUNIT_GPU_STATUS_MAX_FREQ_SHIFT        16
+#define PUNIT_GPU_STATUS_MAX_FREQ_MASK         0xff
+#define PUNIT_GPU_STATIS_GFX_MIN_FREQ_SHIFT    8
+#define PUNIT_GPU_STATUS_GFX_MIN_FREQ_MASK     0xff
+
+#define PUNIT_GPU_DUTYCYCLE_REG                0xdf
+#define PUNIT_GPU_DUTYCYCLE_RPE_FREQ_SHIFT     8
+#define PUNIT_GPU_DUTYCYCLE_RPE_FREQ_MASK      0xff
+
 #define IOSF_NC_FB_GFX_FREQ_FUSE               0x1c
 #define   FB_GFX_MAX_FREQ_FUSE_SHIFT           3
 #define   FB_GFX_MAX_FREQ_FUSE_MASK            0x000007f8
@@ -540,6 +557,11 @@ enum punit_power_well {
 #define   FB_FMAX_VMIN_FREQ_LO_SHIFT           27
 #define   FB_FMAX_VMIN_FREQ_LO_MASK            0xf8000000
 
+#define VLV_CZ_CLOCK_TO_MILLI_SEC              100000
+#define VLV_RP_UP_EI_THRESHOLD                 90
+#define VLV_RP_DOWN_EI_THRESHOLD               70
+#define VLV_INT_COUNT_FOR_DOWN_EI              5
+
 /* vlv2 north clock has */
 #define CCK_FUSE_REG                           0x8
 #define  CCK_FUSE_HPLL_FREQ_MASK               0x3
@@ -574,6 +596,11 @@ enum punit_power_well {
 #define  DSI_PLL_M1_DIV_SHIFT                  0
 #define  DSI_PLL_M1_DIV_MASK                   (0x1ff << 0)
 #define CCK_DISPLAY_CLOCK_CONTROL              0x6b
+#define  DISPLAY_TRUNK_FORCE_ON                        (1 << 17)
+#define  DISPLAY_TRUNK_FORCE_OFF               (1 << 16)
+#define  DISPLAY_FREQUENCY_STATUS              (0x1f << 8)
+#define  DISPLAY_FREQUENCY_STATUS_SHIFT                8
+#define  DISPLAY_FREQUENCY_VALUES              (0x1f << 0)
 
 /**
  * DOC: DPIO
@@ -761,6 +788,8 @@ enum punit_power_well {
 
 #define _VLV_PCS_DW8_CH0               0x8220
 #define _VLV_PCS_DW8_CH1               0x8420
+#define   CHV_PCS_USEDCLKCHANNEL_OVRRIDE       (1 << 20)
+#define   CHV_PCS_USEDCLKCHANNEL               (1 << 21)
 #define VLV_PCS_DW8(ch) _PORT(ch, _VLV_PCS_DW8_CH0, _VLV_PCS_DW8_CH1)
 
 #define _VLV_PCS01_DW8_CH0             0x0220
@@ -869,6 +898,16 @@ enum punit_power_well {
 #define   DPIO_CHV_PROP_COEFF_SHIFT    0
 #define CHV_PLL_DW6(ch) _PIPE(ch, _CHV_PLL_DW6_CH0, _CHV_PLL_DW6_CH1)
 
+#define _CHV_CMN_DW5_CH0               0x8114
+#define   CHV_BUFRIGHTENA1_DISABLE     (0 << 20)
+#define   CHV_BUFRIGHTENA1_NORMAL      (1 << 20)
+#define   CHV_BUFRIGHTENA1_FORCE       (3 << 20)
+#define   CHV_BUFRIGHTENA1_MASK                (3 << 20)
+#define   CHV_BUFLEFTENA1_DISABLE      (0 << 22)
+#define   CHV_BUFLEFTENA1_NORMAL       (1 << 22)
+#define   CHV_BUFLEFTENA1_FORCE                (3 << 22)
+#define   CHV_BUFLEFTENA1_MASK         (3 << 22)
+
 #define _CHV_CMN_DW13_CH0              0x8134
 #define _CHV_CMN_DW0_CH1               0x8080
 #define   DPIO_CHV_S1_DIV_SHIFT                21
@@ -883,8 +922,21 @@ enum punit_power_well {
 #define _CHV_CMN_DW1_CH1               0x8084
 #define   DPIO_AFC_RECAL               (1 << 14)
 #define   DPIO_DCLKP_EN                        (1 << 13)
+#define   CHV_BUFLEFTENA2_DISABLE      (0 << 17) /* CL2 DW1 only */
+#define   CHV_BUFLEFTENA2_NORMAL       (1 << 17) /* CL2 DW1 only */
+#define   CHV_BUFLEFTENA2_FORCE                (3 << 17) /* CL2 DW1 only */
+#define   CHV_BUFLEFTENA2_MASK         (3 << 17) /* CL2 DW1 only */
+#define   CHV_BUFRIGHTENA2_DISABLE     (0 << 19) /* CL2 DW1 only */
+#define   CHV_BUFRIGHTENA2_NORMAL      (1 << 19) /* CL2 DW1 only */
+#define   CHV_BUFRIGHTENA2_FORCE       (3 << 19) /* CL2 DW1 only */
+#define   CHV_BUFRIGHTENA2_MASK                (3 << 19) /* CL2 DW1 only */
 #define CHV_CMN_DW14(ch) _PIPE(ch, _CHV_CMN_DW14_CH0, _CHV_CMN_DW1_CH1)
 
+#define _CHV_CMN_DW19_CH0              0x814c
+#define _CHV_CMN_DW6_CH1               0x8098
+#define   CHV_CMN_USEDCLKCHANNEL       (1 << 13)
+#define CHV_CMN_DW19(ch) _PIPE(ch, _CHV_CMN_DW19_CH0, _CHV_CMN_DW6_CH1)
+
 #define CHV_CMN_DW30                   0x8178
 #define   DPIO_LRC_BYPASS              (1 << 3)
 
@@ -933,6 +985,7 @@ enum punit_power_well {
 #define   SANDYBRIDGE_FENCE_PITCH_SHIFT        32
 #define   GEN7_FENCE_MAX_PITCH_VAL     0x0800
 
+
 /* control register for cpu gtt access */
 #define TILECTL                                0x101000
 #define   TILECTL_SWZCTL                       (1 << 0)
@@ -1170,6 +1223,8 @@ enum punit_power_well {
 #define VLV_IMR                (VLV_DISPLAY_BASE + 0x20a8)
 #define VLV_ISR                (VLV_DISPLAY_BASE + 0x20ac)
 #define VLV_PCBR       (VLV_DISPLAY_BASE + 0x2120)
+#define VLV_PCBR_ADDR_SHIFT    12
+
 #define   DISPLAY_PLANE_FLIP_PENDING(plane) (1<<(11-(plane))) /* A and B only */
 #define EIR            0x020b0
 #define EMR            0x020b4
@@ -1570,11 +1625,10 @@ enum punit_power_well {
 /*
  * Clock control & power management
  */
-#define DPLL_A_OFFSET 0x6014
-#define DPLL_B_OFFSET 0x6018
-#define CHV_DPLL_C_OFFSET 0x6030
-#define DPLL(pipe) (dev_priv->info.dpll_offsets[pipe] + \
-                   dev_priv->info.display_mmio_offset)
+#define _DPLL_A (dev_priv->info.display_mmio_offset + 0x6014)
+#define _DPLL_B (dev_priv->info.display_mmio_offset + 0x6018)
+#define _CHV_DPLL_C (dev_priv->info.display_mmio_offset + 0x6030)
+#define DPLL(pipe) _PIPE3((pipe), _DPLL_A, _DPLL_B, _CHV_DPLL_C)
 
 #define VGA0   0x6000
 #define VGA1   0x6004
@@ -1662,11 +1716,10 @@ enum punit_power_well {
 #define   SDVO_MULTIPLIER_SHIFT_HIRES          4
 #define   SDVO_MULTIPLIER_SHIFT_VGA            0
 
-#define DPLL_A_MD_OFFSET 0x601c /* 965+ only */
-#define DPLL_B_MD_OFFSET 0x6020 /* 965+ only */
-#define CHV_DPLL_C_MD_OFFSET 0x603c
-#define DPLL_MD(pipe) (dev_priv->info.dpll_md_offsets[pipe] + \
-                      dev_priv->info.display_mmio_offset)
+#define _DPLL_A_MD (dev_priv->info.display_mmio_offset + 0x601c)
+#define _DPLL_B_MD (dev_priv->info.display_mmio_offset + 0x6020)
+#define _CHV_DPLL_C_MD (dev_priv->info.display_mmio_offset + 0x603c)
+#define DPLL_MD(pipe) _PIPE3((pipe), _DPLL_A_MD, _DPLL_B_MD, _CHV_DPLL_C_MD)
 
 /*
  * UDI pixel divider, controlling how many pixels are stuffed into a packet.
@@ -2231,7 +2284,7 @@ enum punit_power_well {
 /* Same as Haswell, but 72064 bytes now. */
 #define GEN8_CXT_TOTAL_SIZE            (18 * PAGE_SIZE)
 
-
+#define CHV_CLK_CTL1                   0x101100
 #define VLV_CLK_CTL2                   0x101104
 #define   CLK_CTL2_CZCOUNT_30NS_SHIFT  28
 
@@ -2376,6 +2429,7 @@ enum punit_power_well {
 #define EDP_PSR_BASE(dev)                       (IS_HASWELL(dev) ? 0x64800 : 0x6f800)
 #define EDP_PSR_CTL(dev)                       (EDP_PSR_BASE(dev) + 0)
 #define   EDP_PSR_ENABLE                       (1<<31)
+#define   BDW_PSR_SINGLE_FRAME                 (1<<30)
 #define   EDP_PSR_LINK_DISABLE                 (0<<27)
 #define   EDP_PSR_LINK_STANDBY                 (1<<27)
 #define   EDP_PSR_MIN_LINK_ENTRY_TIME_MASK     (3<<25)
@@ -2533,8 +2587,14 @@ enum punit_power_well {
 #define   PORTC_HOTPLUG_LIVE_STATUS_VLV                (1 << 28)
 #define   PORTB_HOTPLUG_LIVE_STATUS_VLV                (1 << 29)
 #define   PORTD_HOTPLUG_INT_STATUS             (3 << 21)
+#define   PORTD_HOTPLUG_INT_LONG_PULSE         (2 << 21)
+#define   PORTD_HOTPLUG_INT_SHORT_PULSE                (1 << 21)
 #define   PORTC_HOTPLUG_INT_STATUS             (3 << 19)
+#define   PORTC_HOTPLUG_INT_LONG_PULSE         (2 << 19)
+#define   PORTC_HOTPLUG_INT_SHORT_PULSE                (1 << 19)
 #define   PORTB_HOTPLUG_INT_STATUS             (3 << 17)
+#define   PORTB_HOTPLUG_INT_LONG_PULSE         (2 << 17)
+#define   PORTB_HOTPLUG_INT_SHORT_PLUSE                (1 << 17)
 /* CRT/TV common between gen3+ */
 #define   CRT_HOTPLUG_INT_STATUS               (1 << 11)
 #define   TV_HOTPLUG_INT_STATUS                        (1 << 10)
@@ -2588,7 +2648,7 @@ enum punit_power_well {
 
 #define PORT_DFT_I9XX                          0x61150
 #define   DC_BALANCE_RESET                     (1 << 25)
-#define PORT_DFT2_G4X                          0x61154
+#define PORT_DFT2_G4X          (dev_priv->info.display_mmio_offset + 0x61154)
 #define   DC_BALANCE_RESET_VLV                 (1 << 31)
 #define   PIPE_SCRAMBLE_RESET_MASK             (0x3 << 0)
 #define   PIPE_B_SCRAMBLE_RESET                        (1 << 1)
@@ -3803,47 +3863,47 @@ enum punit_power_well {
 
 /* drain latency register values*/
 #define DRAIN_LATENCY_PRECISION_32     32
-#define DRAIN_LATENCY_PRECISION_16     16
+#define DRAIN_LATENCY_PRECISION_64     64
 #define VLV_DDL1                       (VLV_DISPLAY_BASE + 0x70050)
-#define DDL_CURSORA_PRECISION_32       (1<<31)
-#define DDL_CURSORA_PRECISION_16       (0<<31)
+#define DDL_CURSORA_PRECISION_64       (1<<31)
+#define DDL_CURSORA_PRECISION_32       (0<<31)
 #define DDL_CURSORA_SHIFT              24
-#define DDL_SPRITEB_PRECISION_32       (1<<23)
-#define DDL_SPRITEB_PRECISION_16       (0<<23)
+#define DDL_SPRITEB_PRECISION_64       (1<<23)
+#define DDL_SPRITEB_PRECISION_32       (0<<23)
 #define DDL_SPRITEB_SHIFT              16
-#define DDL_SPRITEA_PRECISION_32       (1<<15)
-#define DDL_SPRITEA_PRECISION_16       (0<<15)
+#define DDL_SPRITEA_PRECISION_64       (1<<15)
+#define DDL_SPRITEA_PRECISION_32       (0<<15)
 #define DDL_SPRITEA_SHIFT              8
-#define DDL_PLANEA_PRECISION_32                (1<<7)
-#define DDL_PLANEA_PRECISION_16                (0<<7)
+#define DDL_PLANEA_PRECISION_64                (1<<7)
+#define DDL_PLANEA_PRECISION_32                (0<<7)
 #define DDL_PLANEA_SHIFT               0
 
 #define VLV_DDL2                       (VLV_DISPLAY_BASE + 0x70054)
-#define DDL_CURSORB_PRECISION_32       (1<<31)
-#define DDL_CURSORB_PRECISION_16       (0<<31)
+#define DDL_CURSORB_PRECISION_64       (1<<31)
+#define DDL_CURSORB_PRECISION_32       (0<<31)
 #define DDL_CURSORB_SHIFT              24
-#define DDL_SPRITED_PRECISION_32       (1<<23)
-#define DDL_SPRITED_PRECISION_16       (0<<23)
+#define DDL_SPRITED_PRECISION_64       (1<<23)
+#define DDL_SPRITED_PRECISION_32       (0<<23)
 #define DDL_SPRITED_SHIFT              16
-#define DDL_SPRITEC_PRECISION_32       (1<<15)
-#define DDL_SPRITEC_PRECISION_16       (0<<15)
+#define DDL_SPRITEC_PRECISION_64       (1<<15)
+#define DDL_SPRITEC_PRECISION_32       (0<<15)
 #define DDL_SPRITEC_SHIFT              8
-#define DDL_PLANEB_PRECISION_32                (1<<7)
-#define DDL_PLANEB_PRECISION_16                (0<<7)
+#define DDL_PLANEB_PRECISION_64                (1<<7)
+#define DDL_PLANEB_PRECISION_32                (0<<7)
 #define DDL_PLANEB_SHIFT               0
 
 #define VLV_DDL3                       (VLV_DISPLAY_BASE + 0x70058)
-#define DDL_CURSORC_PRECISION_32       (1<<31)
-#define DDL_CURSORC_PRECISION_16       (0<<31)
+#define DDL_CURSORC_PRECISION_64       (1<<31)
+#define DDL_CURSORC_PRECISION_32       (0<<31)
 #define DDL_CURSORC_SHIFT              24
-#define DDL_SPRITEF_PRECISION_32       (1<<23)
-#define DDL_SPRITEF_PRECISION_16       (0<<23)
+#define DDL_SPRITEF_PRECISION_64       (1<<23)
+#define DDL_SPRITEF_PRECISION_32       (0<<23)
 #define DDL_SPRITEF_SHIFT              16
-#define DDL_SPRITEE_PRECISION_32       (1<<15)
-#define DDL_SPRITEE_PRECISION_16       (0<<15)
+#define DDL_SPRITEE_PRECISION_64       (1<<15)
+#define DDL_SPRITEE_PRECISION_32       (0<<15)
 #define DDL_SPRITEE_SHIFT              8
-#define DDL_PLANEC_PRECISION_32                (1<<7)
-#define DDL_PLANEC_PRECISION_16                (0<<7)
+#define DDL_PLANEC_PRECISION_64                (1<<7)
+#define DDL_PLANEC_PRECISION_32                (0<<7)
 #define DDL_PLANEC_SHIFT               0
 
 /* FIFO watermark sizes etc */
@@ -4630,6 +4690,8 @@ enum punit_power_well {
 #define GEN7_L3CNTLREG1                                0xB01C
 #define  GEN7_WA_FOR_GEN7_L3_CONTROL                   0x3C47FF8C
 #define  GEN7_L3AGDIS                          (1<<19)
+#define GEN7_L3CNTLREG2                                0xB020
+#define GEN7_L3CNTLREG3                                0xB024
 
 #define GEN7_L3_CHICKEN_MODE_REGISTER          0xB030
 #define  GEN7_WA_L3_CHICKEN_MODE                               0x20000000
@@ -4876,8 +4938,7 @@ enum punit_power_well {
 #define _PCH_TRANSA_LINK_M2    0xe0048
 #define _PCH_TRANSA_LINK_N2    0xe004c
 
-/* Per-transcoder DIP controls */
-
+/* Per-transcoder DIP controls (PCH) */
 #define _VIDEO_DIP_CTL_A         0xe0200
 #define _VIDEO_DIP_DATA_A        0xe0208
 #define _VIDEO_DIP_GCP_A         0xe0210
@@ -4890,6 +4951,7 @@ enum punit_power_well {
 #define TVIDEO_DIP_DATA(pipe) _PIPE(pipe, _VIDEO_DIP_DATA_A, _VIDEO_DIP_DATA_B)
 #define TVIDEO_DIP_GCP(pipe) _PIPE(pipe, _VIDEO_DIP_GCP_A, _VIDEO_DIP_GCP_B)
 
+/* Per-transcoder DIP controls (VLV) */
 #define VLV_VIDEO_DIP_CTL_A            (VLV_DISPLAY_BASE + 0x60200)
 #define VLV_VIDEO_DIP_DATA_A           (VLV_DISPLAY_BASE + 0x60208)
 #define VLV_VIDEO_DIP_GDCP_PAYLOAD_A   (VLV_DISPLAY_BASE + 0x60210)
@@ -4898,12 +4960,19 @@ enum punit_power_well {
 #define VLV_VIDEO_DIP_DATA_B           (VLV_DISPLAY_BASE + 0x61174)
 #define VLV_VIDEO_DIP_GDCP_PAYLOAD_B   (VLV_DISPLAY_BASE + 0x61178)
 
+#define CHV_VIDEO_DIP_CTL_C            (VLV_DISPLAY_BASE + 0x611f0)
+#define CHV_VIDEO_DIP_DATA_C           (VLV_DISPLAY_BASE + 0x611f4)
+#define CHV_VIDEO_DIP_GDCP_PAYLOAD_C   (VLV_DISPLAY_BASE + 0x611f8)
+
 #define VLV_TVIDEO_DIP_CTL(pipe) \
-        _PIPE(pipe, VLV_VIDEO_DIP_CTL_A, VLV_VIDEO_DIP_CTL_B)
+       _PIPE3((pipe), VLV_VIDEO_DIP_CTL_A, \
+              VLV_VIDEO_DIP_CTL_B, CHV_VIDEO_DIP_CTL_C)
 #define VLV_TVIDEO_DIP_DATA(pipe) \
-        _PIPE(pipe, VLV_VIDEO_DIP_DATA_A, VLV_VIDEO_DIP_DATA_B)
+       _PIPE3((pipe), VLV_VIDEO_DIP_DATA_A, \
+              VLV_VIDEO_DIP_DATA_B, CHV_VIDEO_DIP_DATA_C)
 #define VLV_TVIDEO_DIP_GCP(pipe) \
-       _PIPE(pipe, VLV_VIDEO_DIP_GDCP_PAYLOAD_A, VLV_VIDEO_DIP_GDCP_PAYLOAD_B)
+       _PIPE3((pipe), VLV_VIDEO_DIP_GDCP_PAYLOAD_A, \
+               VLV_VIDEO_DIP_GDCP_PAYLOAD_B, CHV_VIDEO_DIP_GDCP_PAYLOAD_C)
 
 /* Haswell DIP controls */
 #define HSW_VIDEO_DIP_CTL_A            0x60200
@@ -5334,6 +5403,7 @@ enum punit_power_well {
 #define   VLV_GTLC_ALLOWWAKEERR                        (1 << 1)
 #define   VLV_GTLC_PW_MEDIA_STATUS_MASK                (1 << 5)
 #define   VLV_GTLC_PW_RENDER_STATUS_MASK       (1 << 7)
+#define VLV_GTLC_SURVIVABILITY_REG              0x130098
 #define  FORCEWAKE_MT                          0xa188 /* multi-threaded */
 #define   FORCEWAKE_KERNEL                     0x1
 #define   FORCEWAKE_USER                       0x2
@@ -5471,6 +5541,12 @@ enum punit_power_well {
                                                 GEN6_PM_RP_DOWN_THRESHOLD | \
                                                 GEN6_PM_RP_DOWN_TIMEOUT)
 
+#define CHV_CZ_CLOCK_FREQ_MODE_200                     200
+#define CHV_CZ_CLOCK_FREQ_MODE_267                     267
+#define CHV_CZ_CLOCK_FREQ_MODE_320                     320
+#define CHV_CZ_CLOCK_FREQ_MODE_333                     333
+#define CHV_CZ_CLOCK_FREQ_MODE_400                     400
+
 #define GEN7_GT_SCRATCH_BASE                   0x4F100
 #define GEN7_GT_SCRATCH_REG_NUM                        8
 
@@ -5481,6 +5557,8 @@ enum punit_power_well {
 #define GEN6_GT_GFX_RC6_LOCKED                 0x138104
 #define VLV_COUNTER_CONTROL                    0x138104
 #define   VLV_COUNT_RANGE_HIGH                 (1<<15)
+#define   VLV_MEDIA_RC0_COUNT_EN               (1<<5)
+#define   VLV_RENDER_RC0_COUNT_EN              (1<<4)
 #define   VLV_MEDIA_RC6_COUNT_EN               (1<<1)
 #define   VLV_RENDER_RC6_COUNT_EN              (1<<0)
 #define GEN6_GT_GFX_RC6                                0x138108
@@ -5489,6 +5567,8 @@ enum punit_power_well {
 
 #define GEN6_GT_GFX_RC6p                       0x13810C
 #define GEN6_GT_GFX_RC6pp                      0x138110
+#define VLV_RENDER_C0_COUNT_REG                0x138118
+#define VLV_MEDIA_C0_COUNT_REG                 0x13811C
 
 #define GEN6_PCODE_MAILBOX                     0x138124
 #define   GEN6_PCODE_READY                     (1<<31)
@@ -5723,6 +5803,7 @@ enum punit_power_well {
 #define  TRANS_DDI_FUNC_ENABLE         (1<<31)
 /* Those bits are ignored by pipe EDP since it can only connect to DDI A */
 #define  TRANS_DDI_PORT_MASK           (7<<28)
+#define  TRANS_DDI_PORT_SHIFT          28
 #define  TRANS_DDI_SELECT_PORT(x)      ((x)<<28)
 #define  TRANS_DDI_PORT_NONE           (0<<28)
 #define  TRANS_DDI_MODE_SELECT_MASK    (7<<24)
@@ -5743,6 +5824,7 @@ enum punit_power_well {
 #define  TRANS_DDI_EDP_INPUT_A_ONOFF   (4<<12)
 #define  TRANS_DDI_EDP_INPUT_B_ONOFF   (5<<12)
 #define  TRANS_DDI_EDP_INPUT_C_ONOFF   (6<<12)
+#define  TRANS_DDI_DP_VC_PAYLOAD_ALLOC (1<<8)
 #define  TRANS_DDI_BFI_ENABLE          (1<<4)
 
 /* DisplayPort Transport Control */
@@ -5752,6 +5834,7 @@ enum punit_power_well {
 #define  DP_TP_CTL_ENABLE                      (1<<31)
 #define  DP_TP_CTL_MODE_SST                    (0<<27)
 #define  DP_TP_CTL_MODE_MST                    (1<<27)
+#define  DP_TP_CTL_FORCE_ACT                   (1<<25)
 #define  DP_TP_CTL_ENHANCED_FRAME_ENABLE       (1<<18)
 #define  DP_TP_CTL_FDI_AUTOTRAIN               (1<<15)
 #define  DP_TP_CTL_LINK_TRAIN_MASK             (7<<8)
@@ -5766,15 +5849,19 @@ enum punit_power_well {
 #define DP_TP_STATUS_A                 0x64044
 #define DP_TP_STATUS_B                 0x64144
 #define DP_TP_STATUS(port) _PORT(port, DP_TP_STATUS_A, DP_TP_STATUS_B)
-#define  DP_TP_STATUS_IDLE_DONE                (1<<25)
-#define  DP_TP_STATUS_AUTOTRAIN_DONE   (1<<12)
+#define  DP_TP_STATUS_IDLE_DONE                        (1<<25)
+#define  DP_TP_STATUS_ACT_SENT                 (1<<24)
+#define  DP_TP_STATUS_MODE_STATUS_MST          (1<<23)
+#define  DP_TP_STATUS_AUTOTRAIN_DONE           (1<<12)
+#define  DP_TP_STATUS_PAYLOAD_MAPPING_VC2      (3 << 8)
+#define  DP_TP_STATUS_PAYLOAD_MAPPING_VC1      (3 << 4)
+#define  DP_TP_STATUS_PAYLOAD_MAPPING_VC0      (3 << 0)
 
 /* DDI Buffer Control */
 #define DDI_BUF_CTL_A                          0x64000
 #define DDI_BUF_CTL_B                          0x64100
 #define DDI_BUF_CTL(port) _PORT(port, DDI_BUF_CTL_A, DDI_BUF_CTL_B)
 #define  DDI_BUF_CTL_ENABLE                    (1<<31)
-/* Haswell */
 #define  DDI_BUF_EMP_400MV_0DB_HSW             (0<<24)   /* Sel0 */
 #define  DDI_BUF_EMP_400MV_3_5DB_HSW           (1<<24)   /* Sel1 */
 #define  DDI_BUF_EMP_400MV_6DB_HSW             (2<<24)   /* Sel2 */
@@ -5784,16 +5871,6 @@ enum punit_power_well {
 #define  DDI_BUF_EMP_600MV_6DB_HSW             (6<<24)   /* Sel6 */
 #define  DDI_BUF_EMP_800MV_0DB_HSW             (7<<24)   /* Sel7 */
 #define  DDI_BUF_EMP_800MV_3_5DB_HSW           (8<<24)   /* Sel8 */
-/* Broadwell */
-#define  DDI_BUF_EMP_400MV_0DB_BDW             (0<<24)   /* Sel0 */
-#define  DDI_BUF_EMP_400MV_3_5DB_BDW           (1<<24)   /* Sel1 */
-#define  DDI_BUF_EMP_400MV_6DB_BDW             (2<<24)   /* Sel2 */
-#define  DDI_BUF_EMP_600MV_0DB_BDW             (3<<24)   /* Sel3 */
-#define  DDI_BUF_EMP_600MV_3_5DB_BDW           (4<<24)   /* Sel4 */
-#define  DDI_BUF_EMP_600MV_6DB_BDW             (5<<24)   /* Sel5 */
-#define  DDI_BUF_EMP_800MV_0DB_BDW             (6<<24)   /* Sel6 */
-#define  DDI_BUF_EMP_800MV_3_5DB_BDW           (7<<24)   /* Sel7 */
-#define  DDI_BUF_EMP_1200MV_0DB_BDW            (8<<24)   /* Sel8 */
 #define  DDI_BUF_EMP_MASK                      (0xf<<24)
 #define  DDI_BUF_PORT_REVERSAL                 (1<<16)
 #define  DDI_BUF_IS_IDLE                       (1<<7)
@@ -5861,10 +5938,12 @@ enum punit_power_well {
 /* WRPLL */
 #define WRPLL_CTL1                     0x46040
 #define WRPLL_CTL2                     0x46060
+#define WRPLL_CTL(pll)                 (pll == 0 ? WRPLL_CTL1 : WRPLL_CTL2)
 #define  WRPLL_PLL_ENABLE              (1<<31)
-#define  WRPLL_PLL_SELECT_SSC          (0x01<<28)
-#define  WRPLL_PLL_SELECT_NON_SSC      (0x02<<28)
-#define  WRPLL_PLL_SELECT_LCPLL_2700   (0x03<<28)
+#define  WRPLL_PLL_SSC                 (1<<28)
+#define  WRPLL_PLL_NON_SSC             (2<<28)
+#define  WRPLL_PLL_LCPLL               (3<<28)
+#define  WRPLL_PLL_REF_MASK            (3<<28)
 /* WRPLL divider programming */
 #define  WRPLL_DIVIDER_REFERENCE(x)    ((x)<<0)
 #define  WRPLL_DIVIDER_REF_MASK                (0xff)
@@ -5883,6 +5962,7 @@ enum punit_power_well {
 #define  PORT_CLK_SEL_LCPLL_1350       (1<<29)
 #define  PORT_CLK_SEL_LCPLL_810                (2<<29)
 #define  PORT_CLK_SEL_SPLL             (3<<29)
+#define  PORT_CLK_SEL_WRPLL(pll)       (((pll)+4)<<29)
 #define  PORT_CLK_SEL_WRPLL1           (4<<29)
 #define  PORT_CLK_SEL_WRPLL2           (5<<29)
 #define  PORT_CLK_SEL_NONE             (7<<29)
@@ -5924,7 +6004,10 @@ enum punit_power_well {
 #define  LCPLL_CD_SOURCE_FCLK          (1<<21)
 #define  LCPLL_CD_SOURCE_FCLK_DONE     (1<<19)
 
-#define D_COMP                         (MCHBAR_MIRROR_BASE_SNB + 0x5F0C)
+/* Please see hsw_read_dcomp() and hsw_write_dcomp() before using this register,
+ * since on HSW we can't write to it using I915_WRITE. */
+#define D_COMP_HSW                     (MCHBAR_MIRROR_BASE_SNB + 0x5F0C)
+#define D_COMP_BDW                     0x138144
 #define  D_COMP_RCOMP_IN_PROGRESS      (1<<9)
 #define  D_COMP_COMP_FORCE             (1<<8)
 #define  D_COMP_COMP_DISABLE           (1<<0)
@@ -6005,7 +6088,8 @@ enum punit_power_well {
 
 #define _MIPIA_PORT_CTRL                       (VLV_DISPLAY_BASE + 0x61190)
 #define _MIPIB_PORT_CTRL                       (VLV_DISPLAY_BASE + 0x61700)
-#define MIPI_PORT_CTRL(pipe)           _PIPE(pipe, _MIPIA_PORT_CTRL, _MIPIB_PORT_CTRL)
+#define MIPI_PORT_CTRL(tc)             _TRANSCODER(tc, _MIPIA_PORT_CTRL, \
+                                               _MIPIB_PORT_CTRL)
 #define  DPI_ENABLE                                    (1 << 31) /* A + B */
 #define  MIPIA_MIPI4DPHY_DELAY_COUNT_SHIFT             27
 #define  MIPIA_MIPI4DPHY_DELAY_COUNT_MASK              (0xf << 27)
@@ -6047,18 +6131,20 @@ enum punit_power_well {
 
 #define _MIPIA_TEARING_CTRL                    (VLV_DISPLAY_BASE + 0x61194)
 #define _MIPIB_TEARING_CTRL                    (VLV_DISPLAY_BASE + 0x61704)
-#define MIPI_TEARING_CTRL(pipe)                _PIPE(pipe, _MIPIA_TEARING_CTRL, _MIPIB_TEARING_CTRL)
+#define MIPI_TEARING_CTRL(tc)                  _TRANSCODER(tc, \
+                               _MIPIA_TEARING_CTRL, _MIPIB_TEARING_CTRL)
 #define  TEARING_EFFECT_DELAY_SHIFT                    0
 #define  TEARING_EFFECT_DELAY_MASK                     (0xffff << 0)
 
 /* XXX: all bits reserved */
-#define _MIPIA_AUTOPWG                         (VLV_DISPLAY_BASE + 0x611a0)
+#define _MIPIA_AUTOPWG                 (VLV_DISPLAY_BASE + 0x611a0)
 
 /* MIPI DSI Controller and D-PHY registers */
 
-#define _MIPIA_DEVICE_READY                    (VLV_DISPLAY_BASE + 0xb000)
-#define _MIPIB_DEVICE_READY                    (VLV_DISPLAY_BASE + 0xb800)
-#define MIPI_DEVICE_READY(pipe)                _PIPE(pipe, _MIPIA_DEVICE_READY, _MIPIB_DEVICE_READY)
+#define _MIPIA_DEVICE_READY            (dev_priv->mipi_mmio_base + 0xb000)
+#define _MIPIB_DEVICE_READY            (dev_priv->mipi_mmio_base + 0xb800)
+#define MIPI_DEVICE_READY(tc)          _TRANSCODER(tc, _MIPIA_DEVICE_READY, \
+                                               _MIPIB_DEVICE_READY)
 #define  BUS_POSSESSION                                        (1 << 3) /* set to give bus to receiver */
 #define  ULPS_STATE_MASK                               (3 << 1)
 #define  ULPS_STATE_ENTER                              (2 << 1)
@@ -6066,12 +6152,14 @@ enum punit_power_well {
 #define  ULPS_STATE_NORMAL_OPERATION                   (0 << 1)
 #define  DEVICE_READY                                  (1 << 0)
 
-#define _MIPIA_INTR_STAT                       (VLV_DISPLAY_BASE + 0xb004)
-#define _MIPIB_INTR_STAT                       (VLV_DISPLAY_BASE + 0xb804)
-#define MIPI_INTR_STAT(pipe)           _PIPE(pipe, _MIPIA_INTR_STAT, _MIPIB_INTR_STAT)
-#define _MIPIA_INTR_EN                         (VLV_DISPLAY_BASE + 0xb008)
-#define _MIPIB_INTR_EN                         (VLV_DISPLAY_BASE + 0xb808)
-#define MIPI_INTR_EN(pipe)             _PIPE(pipe, _MIPIA_INTR_EN, _MIPIB_INTR_EN)
+#define _MIPIA_INTR_STAT               (dev_priv->mipi_mmio_base + 0xb004)
+#define _MIPIB_INTR_STAT               (dev_priv->mipi_mmio_base + 0xb804)
+#define MIPI_INTR_STAT(tc)             _TRANSCODER(tc, _MIPIA_INTR_STAT, \
+                                       _MIPIB_INTR_STAT)
+#define _MIPIA_INTR_EN                 (dev_priv->mipi_mmio_base + 0xb008)
+#define _MIPIB_INTR_EN                 (dev_priv->mipi_mmio_base + 0xb808)
+#define MIPI_INTR_EN(tc)               _TRANSCODER(tc, _MIPIA_INTR_EN, \
+                                       _MIPIB_INTR_EN)
 #define  TEARING_EFFECT                                        (1 << 31)
 #define  SPL_PKT_SENT_INTERRUPT                                (1 << 30)
 #define  GEN_READ_DATA_AVAIL                           (1 << 29)
@@ -6105,9 +6193,10 @@ enum punit_power_well {
 #define  RXSOT_SYNC_ERROR                              (1 << 1)
 #define  RXSOT_ERROR                                   (1 << 0)
 
-#define _MIPIA_DSI_FUNC_PRG                    (VLV_DISPLAY_BASE + 0xb00c)
-#define _MIPIB_DSI_FUNC_PRG                    (VLV_DISPLAY_BASE + 0xb80c)
-#define MIPI_DSI_FUNC_PRG(pipe)                _PIPE(pipe, _MIPIA_DSI_FUNC_PRG, _MIPIB_DSI_FUNC_PRG)
+#define _MIPIA_DSI_FUNC_PRG            (dev_priv->mipi_mmio_base + 0xb00c)
+#define _MIPIB_DSI_FUNC_PRG            (dev_priv->mipi_mmio_base + 0xb80c)
+#define MIPI_DSI_FUNC_PRG(tc)          _TRANSCODER(tc, _MIPIA_DSI_FUNC_PRG, \
+                                               _MIPIB_DSI_FUNC_PRG)
 #define  CMD_MODE_DATA_WIDTH_MASK                      (7 << 13)
 #define  CMD_MODE_NOT_SUPPORTED                                (0 << 13)
 #define  CMD_MODE_DATA_WIDTH_16_BIT                    (1 << 13)
@@ -6128,78 +6217,94 @@ enum punit_power_well {
 #define  DATA_LANES_PRG_REG_SHIFT                      0
 #define  DATA_LANES_PRG_REG_MASK                       (7 << 0)
 
-#define _MIPIA_HS_TX_TIMEOUT                   (VLV_DISPLAY_BASE + 0xb010)
-#define _MIPIB_HS_TX_TIMEOUT                   (VLV_DISPLAY_BASE + 0xb810)
-#define MIPI_HS_TX_TIMEOUT(pipe)       _PIPE(pipe, _MIPIA_HS_TX_TIMEOUT, _MIPIB_HS_TX_TIMEOUT)
+#define _MIPIA_HS_TX_TIMEOUT           (dev_priv->mipi_mmio_base + 0xb010)
+#define _MIPIB_HS_TX_TIMEOUT           (dev_priv->mipi_mmio_base + 0xb810)
+#define MIPI_HS_TX_TIMEOUT(tc) _TRANSCODER(tc, _MIPIA_HS_TX_TIMEOUT, \
+                                       _MIPIB_HS_TX_TIMEOUT)
 #define  HIGH_SPEED_TX_TIMEOUT_COUNTER_MASK            0xffffff
 
-#define _MIPIA_LP_RX_TIMEOUT                   (VLV_DISPLAY_BASE + 0xb014)
-#define _MIPIB_LP_RX_TIMEOUT                   (VLV_DISPLAY_BASE + 0xb814)
-#define MIPI_LP_RX_TIMEOUT(pipe)       _PIPE(pipe, _MIPIA_LP_RX_TIMEOUT, _MIPIB_LP_RX_TIMEOUT)
+#define _MIPIA_LP_RX_TIMEOUT           (dev_priv->mipi_mmio_base + 0xb014)
+#define _MIPIB_LP_RX_TIMEOUT           (dev_priv->mipi_mmio_base + 0xb814)
+#define MIPI_LP_RX_TIMEOUT(tc) _TRANSCODER(tc, _MIPIA_LP_RX_TIMEOUT, \
+                                       _MIPIB_LP_RX_TIMEOUT)
 #define  LOW_POWER_RX_TIMEOUT_COUNTER_MASK             0xffffff
 
-#define _MIPIA_TURN_AROUND_TIMEOUT             (VLV_DISPLAY_BASE + 0xb018)
-#define _MIPIB_TURN_AROUND_TIMEOUT             (VLV_DISPLAY_BASE + 0xb818)
-#define MIPI_TURN_AROUND_TIMEOUT(pipe) _PIPE(pipe, _MIPIA_TURN_AROUND_TIMEOUT, _MIPIB_TURN_AROUND_TIMEOUT)
+#define _MIPIA_TURN_AROUND_TIMEOUT     (dev_priv->mipi_mmio_base + 0xb018)
+#define _MIPIB_TURN_AROUND_TIMEOUT     (dev_priv->mipi_mmio_base + 0xb818)
+#define MIPI_TURN_AROUND_TIMEOUT(tc)   _TRANSCODER(tc, \
+                       _MIPIA_TURN_AROUND_TIMEOUT, _MIPIB_TURN_AROUND_TIMEOUT)
 #define  TURN_AROUND_TIMEOUT_MASK                      0x3f
 
-#define _MIPIA_DEVICE_RESET_TIMER              (VLV_DISPLAY_BASE + 0xb01c)
-#define _MIPIB_DEVICE_RESET_TIMER              (VLV_DISPLAY_BASE + 0xb81c)
-#define MIPI_DEVICE_RESET_TIMER(pipe)  _PIPE(pipe, _MIPIA_DEVICE_RESET_TIMER, _MIPIB_DEVICE_RESET_TIMER)
+#define _MIPIA_DEVICE_RESET_TIMER      (dev_priv->mipi_mmio_base + 0xb01c)
+#define _MIPIB_DEVICE_RESET_TIMER      (dev_priv->mipi_mmio_base + 0xb81c)
+#define MIPI_DEVICE_RESET_TIMER(tc)    _TRANSCODER(tc, \
+                       _MIPIA_DEVICE_RESET_TIMER, _MIPIB_DEVICE_RESET_TIMER)
 #define  DEVICE_RESET_TIMER_MASK                       0xffff
 
-#define _MIPIA_DPI_RESOLUTION                  (VLV_DISPLAY_BASE + 0xb020)
-#define _MIPIB_DPI_RESOLUTION                  (VLV_DISPLAY_BASE + 0xb820)
-#define MIPI_DPI_RESOLUTION(pipe)      _PIPE(pipe, _MIPIA_DPI_RESOLUTION, _MIPIB_DPI_RESOLUTION)
+#define _MIPIA_DPI_RESOLUTION          (dev_priv->mipi_mmio_base + 0xb020)
+#define _MIPIB_DPI_RESOLUTION          (dev_priv->mipi_mmio_base + 0xb820)
+#define MIPI_DPI_RESOLUTION(tc)        _TRANSCODER(tc, _MIPIA_DPI_RESOLUTION, \
+                                       _MIPIB_DPI_RESOLUTION)
 #define  VERTICAL_ADDRESS_SHIFT                                16
 #define  VERTICAL_ADDRESS_MASK                         (0xffff << 16)
 #define  HORIZONTAL_ADDRESS_SHIFT                      0
 #define  HORIZONTAL_ADDRESS_MASK                       0xffff
 
-#define _MIPIA_DBI_FIFO_THROTTLE               (VLV_DISPLAY_BASE + 0xb024)
-#define _MIPIB_DBI_FIFO_THROTTLE               (VLV_DISPLAY_BASE + 0xb824)
-#define MIPI_DBI_FIFO_THROTTLE(pipe)   _PIPE(pipe, _MIPIA_DBI_FIFO_THROTTLE, _MIPIB_DBI_FIFO_THROTTLE)
+#define _MIPIA_DBI_FIFO_THROTTLE       (dev_priv->mipi_mmio_base + 0xb024)
+#define _MIPIB_DBI_FIFO_THROTTLE       (dev_priv->mipi_mmio_base + 0xb824)
+#define MIPI_DBI_FIFO_THROTTLE(tc)     _TRANSCODER(tc, \
+                       _MIPIA_DBI_FIFO_THROTTLE, _MIPIB_DBI_FIFO_THROTTLE)
 #define  DBI_FIFO_EMPTY_HALF                           (0 << 0)
 #define  DBI_FIFO_EMPTY_QUARTER                                (1 << 0)
 #define  DBI_FIFO_EMPTY_7_LOCATIONS                    (2 << 0)
 
 /* regs below are bits 15:0 */
-#define _MIPIA_HSYNC_PADDING_COUNT             (VLV_DISPLAY_BASE + 0xb028)
-#define _MIPIB_HSYNC_PADDING_COUNT             (VLV_DISPLAY_BASE + 0xb828)
-#define MIPI_HSYNC_PADDING_COUNT(pipe) _PIPE(pipe, _MIPIA_HSYNC_PADDING_COUNT, _MIPIB_HSYNC_PADDING_COUNT)
-
-#define _MIPIA_HBP_COUNT                       (VLV_DISPLAY_BASE + 0xb02c)
-#define _MIPIB_HBP_COUNT                       (VLV_DISPLAY_BASE + 0xb82c)
-#define MIPI_HBP_COUNT(pipe)           _PIPE(pipe, _MIPIA_HBP_COUNT, _MIPIB_HBP_COUNT)
-
-#define _MIPIA_HFP_COUNT                       (VLV_DISPLAY_BASE + 0xb030)
-#define _MIPIB_HFP_COUNT                       (VLV_DISPLAY_BASE + 0xb830)
-#define MIPI_HFP_COUNT(pipe)           _PIPE(pipe, _MIPIA_HFP_COUNT, _MIPIB_HFP_COUNT)
-
-#define _MIPIA_HACTIVE_AREA_COUNT              (VLV_DISPLAY_BASE + 0xb034)
-#define _MIPIB_HACTIVE_AREA_COUNT              (VLV_DISPLAY_BASE + 0xb834)
-#define MIPI_HACTIVE_AREA_COUNT(pipe)  _PIPE(pipe, _MIPIA_HACTIVE_AREA_COUNT, _MIPIB_HACTIVE_AREA_COUNT)
-
-#define _MIPIA_VSYNC_PADDING_COUNT             (VLV_DISPLAY_BASE + 0xb038)
-#define _MIPIB_VSYNC_PADDING_COUNT             (VLV_DISPLAY_BASE + 0xb838)
-#define MIPI_VSYNC_PADDING_COUNT(pipe) _PIPE(pipe, _MIPIA_VSYNC_PADDING_COUNT, _MIPIB_VSYNC_PADDING_COUNT)
+#define _MIPIA_HSYNC_PADDING_COUNT     (dev_priv->mipi_mmio_base + 0xb028)
+#define _MIPIB_HSYNC_PADDING_COUNT     (dev_priv->mipi_mmio_base + 0xb828)
+#define MIPI_HSYNC_PADDING_COUNT(tc)   _TRANSCODER(tc, \
+                       _MIPIA_HSYNC_PADDING_COUNT, _MIPIB_HSYNC_PADDING_COUNT)
+
+#define _MIPIA_HBP_COUNT               (dev_priv->mipi_mmio_base + 0xb02c)
+#define _MIPIB_HBP_COUNT               (dev_priv->mipi_mmio_base + 0xb82c)
+#define MIPI_HBP_COUNT(tc)             _TRANSCODER(tc, _MIPIA_HBP_COUNT, \
+                                       _MIPIB_HBP_COUNT)
+
+#define _MIPIA_HFP_COUNT               (dev_priv->mipi_mmio_base + 0xb030)
+#define _MIPIB_HFP_COUNT               (dev_priv->mipi_mmio_base + 0xb830)
+#define MIPI_HFP_COUNT(tc)             _TRANSCODER(tc, _MIPIA_HFP_COUNT, \
+                                       _MIPIB_HFP_COUNT)
+
+#define _MIPIA_HACTIVE_AREA_COUNT      (dev_priv->mipi_mmio_base + 0xb034)
+#define _MIPIB_HACTIVE_AREA_COUNT      (dev_priv->mipi_mmio_base + 0xb834)
+#define MIPI_HACTIVE_AREA_COUNT(tc)    _TRANSCODER(tc, \
+                       _MIPIA_HACTIVE_AREA_COUNT, _MIPIB_HACTIVE_AREA_COUNT)
+
+#define _MIPIA_VSYNC_PADDING_COUNT     (dev_priv->mipi_mmio_base + 0xb038)
+#define _MIPIB_VSYNC_PADDING_COUNT     (dev_priv->mipi_mmio_base + 0xb838)
+#define MIPI_VSYNC_PADDING_COUNT(tc)   _TRANSCODER(tc, \
+                       _MIPIA_VSYNC_PADDING_COUNT, _MIPIB_VSYNC_PADDING_COUNT)
+
+#define _MIPIA_VBP_COUNT               (dev_priv->mipi_mmio_base + 0xb03c)
+#define _MIPIB_VBP_COUNT               (dev_priv->mipi_mmio_base + 0xb83c)
+#define MIPI_VBP_COUNT(tc)             _TRANSCODER(tc, _MIPIA_VBP_COUNT, \
+                                       _MIPIB_VBP_COUNT)
+
+#define _MIPIA_VFP_COUNT               (dev_priv->mipi_mmio_base + 0xb040)
+#define _MIPIB_VFP_COUNT               (dev_priv->mipi_mmio_base + 0xb840)
+#define MIPI_VFP_COUNT(tc)             _TRANSCODER(tc, _MIPIA_VFP_COUNT, \
+                                       _MIPIB_VFP_COUNT)
+
+#define _MIPIA_HIGH_LOW_SWITCH_COUNT   (dev_priv->mipi_mmio_base + 0xb044)
+#define _MIPIB_HIGH_LOW_SWITCH_COUNT   (dev_priv->mipi_mmio_base + 0xb844)
+#define MIPI_HIGH_LOW_SWITCH_COUNT(tc) _TRANSCODER(tc, \
+               _MIPIA_HIGH_LOW_SWITCH_COUNT, _MIPIB_HIGH_LOW_SWITCH_COUNT)
 
-#define _MIPIA_VBP_COUNT                       (VLV_DISPLAY_BASE + 0xb03c)
-#define _MIPIB_VBP_COUNT                       (VLV_DISPLAY_BASE + 0xb83c)
-#define MIPI_VBP_COUNT(pipe)           _PIPE(pipe, _MIPIA_VBP_COUNT, _MIPIB_VBP_COUNT)
-
-#define _MIPIA_VFP_COUNT                       (VLV_DISPLAY_BASE + 0xb040)
-#define _MIPIB_VFP_COUNT                       (VLV_DISPLAY_BASE + 0xb840)
-#define MIPI_VFP_COUNT(pipe)           _PIPE(pipe, _MIPIA_VFP_COUNT, _MIPIB_VFP_COUNT)
-
-#define _MIPIA_HIGH_LOW_SWITCH_COUNT           (VLV_DISPLAY_BASE + 0xb044)
-#define _MIPIB_HIGH_LOW_SWITCH_COUNT           (VLV_DISPLAY_BASE + 0xb844)
-#define MIPI_HIGH_LOW_SWITCH_COUNT(pipe)       _PIPE(pipe, _MIPIA_HIGH_LOW_SWITCH_COUNT, _MIPIB_HIGH_LOW_SWITCH_COUNT)
 /* regs above are bits 15:0 */
 
-#define _MIPIA_DPI_CONTROL                     (VLV_DISPLAY_BASE + 0xb048)
-#define _MIPIB_DPI_CONTROL                     (VLV_DISPLAY_BASE + 0xb848)
-#define MIPI_DPI_CONTROL(pipe)         _PIPE(pipe, _MIPIA_DPI_CONTROL, _MIPIB_DPI_CONTROL)
+#define _MIPIA_DPI_CONTROL             (dev_priv->mipi_mmio_base + 0xb048)
+#define _MIPIB_DPI_CONTROL             (dev_priv->mipi_mmio_base + 0xb848)
+#define MIPI_DPI_CONTROL(tc)           _TRANSCODER(tc, _MIPIA_DPI_CONTROL, \
+                                       _MIPIB_DPI_CONTROL)
 #define  DPI_LP_MODE                                   (1 << 6)
 #define  BACKLIGHT_OFF                                 (1 << 5)
 #define  BACKLIGHT_ON                                  (1 << 4)
@@ -6208,27 +6313,31 @@ enum punit_power_well {
 #define  TURN_ON                                       (1 << 1)
 #define  SHUTDOWN                                      (1 << 0)
 
-#define _MIPIA_DPI_DATA                                (VLV_DISPLAY_BASE + 0xb04c)
-#define _MIPIB_DPI_DATA                                (VLV_DISPLAY_BASE + 0xb84c)
-#define MIPI_DPI_DATA(pipe)            _PIPE(pipe, _MIPIA_DPI_DATA, _MIPIB_DPI_DATA)
+#define _MIPIA_DPI_DATA                        (dev_priv->mipi_mmio_base + 0xb04c)
+#define _MIPIB_DPI_DATA                        (dev_priv->mipi_mmio_base + 0xb84c)
+#define MIPI_DPI_DATA(tc)              _TRANSCODER(tc, _MIPIA_DPI_DATA, \
+                                       _MIPIB_DPI_DATA)
 #define  COMMAND_BYTE_SHIFT                            0
 #define  COMMAND_BYTE_MASK                             (0x3f << 0)
 
-#define _MIPIA_INIT_COUNT                      (VLV_DISPLAY_BASE + 0xb050)
-#define _MIPIB_INIT_COUNT                      (VLV_DISPLAY_BASE + 0xb850)
-#define MIPI_INIT_COUNT(pipe)          _PIPE(pipe, _MIPIA_INIT_COUNT, _MIPIB_INIT_COUNT)
+#define _MIPIA_INIT_COUNT              (dev_priv->mipi_mmio_base + 0xb050)
+#define _MIPIB_INIT_COUNT              (dev_priv->mipi_mmio_base + 0xb850)
+#define MIPI_INIT_COUNT(tc)            _TRANSCODER(tc, _MIPIA_INIT_COUNT, \
+                                       _MIPIB_INIT_COUNT)
 #define  MASTER_INIT_TIMER_SHIFT                       0
 #define  MASTER_INIT_TIMER_MASK                                (0xffff << 0)
 
-#define _MIPIA_MAX_RETURN_PKT_SIZE             (VLV_DISPLAY_BASE + 0xb054)
-#define _MIPIB_MAX_RETURN_PKT_SIZE             (VLV_DISPLAY_BASE + 0xb854)
-#define MIPI_MAX_RETURN_PKT_SIZE(pipe) _PIPE(pipe, _MIPIA_MAX_RETURN_PKT_SIZE, _MIPIB_MAX_RETURN_PKT_SIZE)
+#define _MIPIA_MAX_RETURN_PKT_SIZE     (dev_priv->mipi_mmio_base + 0xb054)
+#define _MIPIB_MAX_RETURN_PKT_SIZE     (dev_priv->mipi_mmio_base + 0xb854)
+#define MIPI_MAX_RETURN_PKT_SIZE(tc)   _TRANSCODER(tc, \
+                       _MIPIA_MAX_RETURN_PKT_SIZE, _MIPIB_MAX_RETURN_PKT_SIZE)
 #define  MAX_RETURN_PKT_SIZE_SHIFT                     0
 #define  MAX_RETURN_PKT_SIZE_MASK                      (0x3ff << 0)
 
-#define _MIPIA_VIDEO_MODE_FORMAT               (VLV_DISPLAY_BASE + 0xb058)
-#define _MIPIB_VIDEO_MODE_FORMAT               (VLV_DISPLAY_BASE + 0xb858)
-#define MIPI_VIDEO_MODE_FORMAT(pipe)   _PIPE(pipe, _MIPIA_VIDEO_MODE_FORMAT, _MIPIB_VIDEO_MODE_FORMAT)
+#define _MIPIA_VIDEO_MODE_FORMAT       (dev_priv->mipi_mmio_base + 0xb058)
+#define _MIPIB_VIDEO_MODE_FORMAT       (dev_priv->mipi_mmio_base + 0xb858)
+#define MIPI_VIDEO_MODE_FORMAT(tc)     _TRANSCODER(tc, \
+                       _MIPIA_VIDEO_MODE_FORMAT, _MIPIB_VIDEO_MODE_FORMAT)
 #define  RANDOM_DPI_DISPLAY_RESOLUTION                 (1 << 4)
 #define  DISABLE_VIDEO_BTA                             (1 << 3)
 #define  IP_TG_CONFIG                                  (1 << 2)
@@ -6236,9 +6345,10 @@ enum punit_power_well {
 #define  VIDEO_MODE_NON_BURST_WITH_SYNC_EVENTS         (2 << 0)
 #define  VIDEO_MODE_BURST                              (3 << 0)
 
-#define _MIPIA_EOT_DISABLE                     (VLV_DISPLAY_BASE + 0xb05c)
-#define _MIPIB_EOT_DISABLE                     (VLV_DISPLAY_BASE + 0xb85c)
-#define MIPI_EOT_DISABLE(pipe)         _PIPE(pipe, _MIPIA_EOT_DISABLE, _MIPIB_EOT_DISABLE)
+#define _MIPIA_EOT_DISABLE             (dev_priv->mipi_mmio_base + 0xb05c)
+#define _MIPIB_EOT_DISABLE             (dev_priv->mipi_mmio_base + 0xb85c)
+#define MIPI_EOT_DISABLE(tc)           _TRANSCODER(tc, _MIPIA_EOT_DISABLE, \
+                                       _MIPIB_EOT_DISABLE)
 #define  LP_RX_TIMEOUT_ERROR_RECOVERY_DISABLE          (1 << 7)
 #define  HS_RX_TIMEOUT_ERROR_RECOVERY_DISABLE          (1 << 6)
 #define  LOW_CONTENTION_RECOVERY_DISABLE               (1 << 5)
@@ -6248,28 +6358,33 @@ enum punit_power_well {
 #define  CLOCKSTOP                                     (1 << 1)
 #define  EOT_DISABLE                                   (1 << 0)
 
-#define _MIPIA_LP_BYTECLK                      (VLV_DISPLAY_BASE + 0xb060)
-#define _MIPIB_LP_BYTECLK                      (VLV_DISPLAY_BASE + 0xb860)
-#define MIPI_LP_BYTECLK(pipe)          _PIPE(pipe, _MIPIA_LP_BYTECLK, _MIPIB_LP_BYTECLK)
+#define _MIPIA_LP_BYTECLK              (dev_priv->mipi_mmio_base + 0xb060)
+#define _MIPIB_LP_BYTECLK              (dev_priv->mipi_mmio_base + 0xb860)
+#define MIPI_LP_BYTECLK(tc)            _TRANSCODER(tc, _MIPIA_LP_BYTECLK, \
+                                       _MIPIB_LP_BYTECLK)
 #define  LP_BYTECLK_SHIFT                              0
 #define  LP_BYTECLK_MASK                               (0xffff << 0)
 
 /* bits 31:0 */
-#define _MIPIA_LP_GEN_DATA                     (VLV_DISPLAY_BASE + 0xb064)
-#define _MIPIB_LP_GEN_DATA                     (VLV_DISPLAY_BASE + 0xb864)
-#define MIPI_LP_GEN_DATA(pipe)         _PIPE(pipe, _MIPIA_LP_GEN_DATA, _MIPIB_LP_GEN_DATA)
+#define _MIPIA_LP_GEN_DATA             (dev_priv->mipi_mmio_base + 0xb064)
+#define _MIPIB_LP_GEN_DATA             (dev_priv->mipi_mmio_base + 0xb864)
+#define MIPI_LP_GEN_DATA(tc)           _TRANSCODER(tc, _MIPIA_LP_GEN_DATA, \
+                                       _MIPIB_LP_GEN_DATA)
 
 /* bits 31:0 */
-#define _MIPIA_HS_GEN_DATA                     (VLV_DISPLAY_BASE + 0xb068)
-#define _MIPIB_HS_GEN_DATA                     (VLV_DISPLAY_BASE + 0xb868)
-#define MIPI_HS_GEN_DATA(pipe)         _PIPE(pipe, _MIPIA_HS_GEN_DATA, _MIPIB_HS_GEN_DATA)
-
-#define _MIPIA_LP_GEN_CTRL                     (VLV_DISPLAY_BASE + 0xb06c)
-#define _MIPIB_LP_GEN_CTRL                     (VLV_DISPLAY_BASE + 0xb86c)
-#define MIPI_LP_GEN_CTRL(pipe)         _PIPE(pipe, _MIPIA_LP_GEN_CTRL, _MIPIB_LP_GEN_CTRL)
-#define _MIPIA_HS_GEN_CTRL                     (VLV_DISPLAY_BASE + 0xb070)
-#define _MIPIB_HS_GEN_CTRL                     (VLV_DISPLAY_BASE + 0xb870)
-#define MIPI_HS_GEN_CTRL(pipe)         _PIPE(pipe, _MIPIA_HS_GEN_CTRL, _MIPIB_HS_GEN_CTRL)
+#define _MIPIA_HS_GEN_DATA             (dev_priv->mipi_mmio_base + 0xb068)
+#define _MIPIB_HS_GEN_DATA             (dev_priv->mipi_mmio_base + 0xb868)
+#define MIPI_HS_GEN_DATA(tc)           _TRANSCODER(tc, _MIPIA_HS_GEN_DATA, \
+                                       _MIPIB_HS_GEN_DATA)
+
+#define _MIPIA_LP_GEN_CTRL             (dev_priv->mipi_mmio_base + 0xb06c)
+#define _MIPIB_LP_GEN_CTRL             (dev_priv->mipi_mmio_base + 0xb86c)
+#define MIPI_LP_GEN_CTRL(tc)           _TRANSCODER(tc, _MIPIA_LP_GEN_CTRL, \
+                                       _MIPIB_LP_GEN_CTRL)
+#define _MIPIA_HS_GEN_CTRL             (dev_priv->mipi_mmio_base + 0xb070)
+#define _MIPIB_HS_GEN_CTRL             (dev_priv->mipi_mmio_base + 0xb870)
+#define MIPI_HS_GEN_CTRL(tc)           _TRANSCODER(tc, _MIPIA_HS_GEN_CTRL, \
+                                       _MIPIB_HS_GEN_CTRL)
 #define  LONG_PACKET_WORD_COUNT_SHIFT                  8
 #define  LONG_PACKET_WORD_COUNT_MASK                   (0xffff << 8)
 #define  SHORT_PACKET_PARAM_SHIFT                      8
@@ -6280,9 +6395,10 @@ enum punit_power_well {
 #define  DATA_TYPE_MASK                                        (3f << 0)
 /* data type values, see include/video/mipi_display.h */
 
-#define _MIPIA_GEN_FIFO_STAT                   (VLV_DISPLAY_BASE + 0xb074)
-#define _MIPIB_GEN_FIFO_STAT                   (VLV_DISPLAY_BASE + 0xb874)
-#define MIPI_GEN_FIFO_STAT(pipe)       _PIPE(pipe, _MIPIA_GEN_FIFO_STAT, _MIPIB_GEN_FIFO_STAT)
+#define _MIPIA_GEN_FIFO_STAT           (dev_priv->mipi_mmio_base + 0xb074)
+#define _MIPIB_GEN_FIFO_STAT           (dev_priv->mipi_mmio_base + 0xb874)
+#define MIPI_GEN_FIFO_STAT(tc) _TRANSCODER(tc, _MIPIA_GEN_FIFO_STAT, \
+                                       _MIPIB_GEN_FIFO_STAT)
 #define  DPI_FIFO_EMPTY                                        (1 << 28)
 #define  DBI_FIFO_EMPTY                                        (1 << 27)
 #define  LP_CTRL_FIFO_EMPTY                            (1 << 26)
@@ -6298,16 +6414,18 @@ enum punit_power_well {
 #define  HS_DATA_FIFO_HALF_EMPTY                       (1 << 1)
 #define  HS_DATA_FIFO_FULL                             (1 << 0)
 
-#define _MIPIA_HS_LS_DBI_ENABLE                        (VLV_DISPLAY_BASE + 0xb078)
-#define _MIPIB_HS_LS_DBI_ENABLE                        (VLV_DISPLAY_BASE + 0xb878)
-#define MIPI_HS_LP_DBI_ENABLE(pipe)    _PIPE(pipe, _MIPIA_HS_LS_DBI_ENABLE, _MIPIB_HS_LS_DBI_ENABLE)
+#define _MIPIA_HS_LS_DBI_ENABLE                (dev_priv->mipi_mmio_base + 0xb078)
+#define _MIPIB_HS_LS_DBI_ENABLE                (dev_priv->mipi_mmio_base + 0xb878)
+#define MIPI_HS_LP_DBI_ENABLE(tc)      _TRANSCODER(tc, \
+                       _MIPIA_HS_LS_DBI_ENABLE, _MIPIB_HS_LS_DBI_ENABLE)
 #define  DBI_HS_LP_MODE_MASK                           (1 << 0)
 #define  DBI_LP_MODE                                   (1 << 0)
 #define  DBI_HS_MODE                                   (0 << 0)
 
-#define _MIPIA_DPHY_PARAM                      (VLV_DISPLAY_BASE + 0xb080)
-#define _MIPIB_DPHY_PARAM                      (VLV_DISPLAY_BASE + 0xb880)
-#define MIPI_DPHY_PARAM(pipe)          _PIPE(pipe, _MIPIA_DPHY_PARAM, _MIPIB_DPHY_PARAM)
+#define _MIPIA_DPHY_PARAM              (dev_priv->mipi_mmio_base + 0xb080)
+#define _MIPIB_DPHY_PARAM              (dev_priv->mipi_mmio_base + 0xb880)
+#define MIPI_DPHY_PARAM(tc)            _TRANSCODER(tc, _MIPIA_DPHY_PARAM, \
+                                       _MIPIB_DPHY_PARAM)
 #define  EXIT_ZERO_COUNT_SHIFT                         24
 #define  EXIT_ZERO_COUNT_MASK                          (0x3f << 24)
 #define  TRAIL_COUNT_SHIFT                             16
@@ -6318,34 +6436,41 @@ enum punit_power_well {
 #define  PREPARE_COUNT_MASK                            (0x3f << 0)
 
 /* bits 31:0 */
-#define _MIPIA_DBI_BW_CTRL                     (VLV_DISPLAY_BASE + 0xb084)
-#define _MIPIB_DBI_BW_CTRL                     (VLV_DISPLAY_BASE + 0xb884)
-#define MIPI_DBI_BW_CTRL(pipe)         _PIPE(pipe, _MIPIA_DBI_BW_CTRL, _MIPIB_DBI_BW_CTRL)
-
-#define _MIPIA_CLK_LANE_SWITCH_TIME_CNT                (VLV_DISPLAY_BASE + 0xb088)
-#define _MIPIB_CLK_LANE_SWITCH_TIME_CNT                (VLV_DISPLAY_BASE + 0xb888)
-#define MIPI_CLK_LANE_SWITCH_TIME_CNT(pipe)    _PIPE(pipe, _MIPIA_CLK_LANE_SWITCH_TIME_CNT, _MIPIB_CLK_LANE_SWITCH_TIME_CNT)
+#define _MIPIA_DBI_BW_CTRL             (dev_priv->mipi_mmio_base + 0xb084)
+#define _MIPIB_DBI_BW_CTRL             (dev_priv->mipi_mmio_base + 0xb884)
+#define MIPI_DBI_BW_CTRL(tc)           _TRANSCODER(tc, _MIPIA_DBI_BW_CTRL, \
+                                       _MIPIB_DBI_BW_CTRL)
+
+#define _MIPIA_CLK_LANE_SWITCH_TIME_CNT                (dev_priv->mipi_mmio_base \
+                                                       + 0xb088)
+#define _MIPIB_CLK_LANE_SWITCH_TIME_CNT                (dev_priv->mipi_mmio_base \
+                                                       + 0xb888)
+#define MIPI_CLK_LANE_SWITCH_TIME_CNT(tc)      _TRANSCODER(tc, \
+       _MIPIA_CLK_LANE_SWITCH_TIME_CNT, _MIPIB_CLK_LANE_SWITCH_TIME_CNT)
 #define  LP_HS_SSW_CNT_SHIFT                           16
 #define  LP_HS_SSW_CNT_MASK                            (0xffff << 16)
 #define  HS_LP_PWR_SW_CNT_SHIFT                                0
 #define  HS_LP_PWR_SW_CNT_MASK                         (0xffff << 0)
 
-#define _MIPIA_STOP_STATE_STALL                        (VLV_DISPLAY_BASE + 0xb08c)
-#define _MIPIB_STOP_STATE_STALL                        (VLV_DISPLAY_BASE + 0xb88c)
-#define MIPI_STOP_STATE_STALL(pipe)    _PIPE(pipe, _MIPIA_STOP_STATE_STALL, _MIPIB_STOP_STATE_STALL)
+#define _MIPIA_STOP_STATE_STALL                (dev_priv->mipi_mmio_base + 0xb08c)
+#define _MIPIB_STOP_STATE_STALL                (dev_priv->mipi_mmio_base + 0xb88c)
+#define MIPI_STOP_STATE_STALL(tc)      _TRANSCODER(tc, \
+                       _MIPIA_STOP_STATE_STALL, _MIPIB_STOP_STATE_STALL)
 #define  STOP_STATE_STALL_COUNTER_SHIFT                        0
 #define  STOP_STATE_STALL_COUNTER_MASK                 (0xff << 0)
 
-#define _MIPIA_INTR_STAT_REG_1                 (VLV_DISPLAY_BASE + 0xb090)
-#define _MIPIB_INTR_STAT_REG_1                 (VLV_DISPLAY_BASE + 0xb890)
-#define MIPI_INTR_STAT_REG_1(pipe)     _PIPE(pipe, _MIPIA_INTR_STAT_REG_1, _MIPIB_INTR_STAT_REG_1)
-#define _MIPIA_INTR_EN_REG_1                   (VLV_DISPLAY_BASE + 0xb094)
-#define _MIPIB_INTR_EN_REG_1                   (VLV_DISPLAY_BASE + 0xb894)
-#define MIPI_INTR_EN_REG_1(pipe)       _PIPE(pipe, _MIPIA_INTR_EN_REG_1, _MIPIB_INTR_EN_REG_1)
+#define _MIPIA_INTR_STAT_REG_1         (dev_priv->mipi_mmio_base + 0xb090)
+#define _MIPIB_INTR_STAT_REG_1         (dev_priv->mipi_mmio_base + 0xb890)
+#define MIPI_INTR_STAT_REG_1(tc)       _TRANSCODER(tc, \
+                               _MIPIA_INTR_STAT_REG_1, _MIPIB_INTR_STAT_REG_1)
+#define _MIPIA_INTR_EN_REG_1           (dev_priv->mipi_mmio_base + 0xb094)
+#define _MIPIB_INTR_EN_REG_1           (dev_priv->mipi_mmio_base + 0xb894)
+#define MIPI_INTR_EN_REG_1(tc) _TRANSCODER(tc, _MIPIA_INTR_EN_REG_1, \
+                                       _MIPIB_INTR_EN_REG_1)
 #define  RX_CONTENTION_DETECTED                                (1 << 0)
 
 /* XXX: only pipe A ?!? */
-#define MIPIA_DBI_TYPEC_CTRL                   (VLV_DISPLAY_BASE + 0xb100)
+#define MIPIA_DBI_TYPEC_CTRL           (dev_priv->mipi_mmio_base + 0xb100)
 #define  DBI_TYPEC_ENABLE                              (1 << 31)
 #define  DBI_TYPEC_WIP                                 (1 << 30)
 #define  DBI_TYPEC_OPTION_SHIFT                                28
@@ -6359,9 +6484,10 @@ enum punit_power_well {
 
 /* MIPI adapter registers */
 
-#define _MIPIA_CTRL                            (VLV_DISPLAY_BASE + 0xb104)
-#define _MIPIB_CTRL                            (VLV_DISPLAY_BASE + 0xb904)
-#define MIPI_CTRL(pipe)                        _PIPE(pipe, _MIPIA_CTRL, _MIPIB_CTRL)
+#define _MIPIA_CTRL                    (dev_priv->mipi_mmio_base + 0xb104)
+#define _MIPIB_CTRL                    (dev_priv->mipi_mmio_base + 0xb904)
+#define MIPI_CTRL(tc)                  _TRANSCODER(tc, _MIPIA_CTRL, \
+                                       _MIPIB_CTRL)
 #define  ESCAPE_CLOCK_DIVIDER_SHIFT                    5 /* A only */
 #define  ESCAPE_CLOCK_DIVIDER_MASK                     (3 << 5)
 #define  ESCAPE_CLOCK_DIVIDER_1                                (0 << 5)
@@ -6373,50 +6499,52 @@ enum punit_power_well {
 #define  READ_REQUEST_PRIORITY_HIGH                    (3 << 3)
 #define  RGB_FLIP_TO_BGR                               (1 << 2)
 
-#define _MIPIA_DATA_ADDRESS                    (VLV_DISPLAY_BASE + 0xb108)
-#define _MIPIB_DATA_ADDRESS                    (VLV_DISPLAY_BASE + 0xb908)
-#define MIPI_DATA_ADDRESS(pipe)                _PIPE(pipe, _MIPIA_DATA_ADDRESS, _MIPIB_DATA_ADDRESS)
+#define _MIPIA_DATA_ADDRESS            (dev_priv->mipi_mmio_base + 0xb108)
+#define _MIPIB_DATA_ADDRESS            (dev_priv->mipi_mmio_base + 0xb908)
+#define MIPI_DATA_ADDRESS(tc)          _TRANSCODER(tc, _MIPIA_DATA_ADDRESS, \
+                                       _MIPIB_DATA_ADDRESS)
 #define  DATA_MEM_ADDRESS_SHIFT                                5
 #define  DATA_MEM_ADDRESS_MASK                         (0x7ffffff << 5)
 #define  DATA_VALID                                    (1 << 0)
 
-#define _MIPIA_DATA_LENGTH                     (VLV_DISPLAY_BASE + 0xb10c)
-#define _MIPIB_DATA_LENGTH                     (VLV_DISPLAY_BASE + 0xb90c)
-#define MIPI_DATA_LENGTH(pipe)         _PIPE(pipe, _MIPIA_DATA_LENGTH, _MIPIB_DATA_LENGTH)
+#define _MIPIA_DATA_LENGTH             (dev_priv->mipi_mmio_base + 0xb10c)
+#define _MIPIB_DATA_LENGTH             (dev_priv->mipi_mmio_base + 0xb90c)
+#define MIPI_DATA_LENGTH(tc)           _TRANSCODER(tc, _MIPIA_DATA_LENGTH, \
+                                       _MIPIB_DATA_LENGTH)
 #define  DATA_LENGTH_SHIFT                             0
 #define  DATA_LENGTH_MASK                              (0xfffff << 0)
 
-#define _MIPIA_COMMAND_ADDRESS                 (VLV_DISPLAY_BASE + 0xb110)
-#define _MIPIB_COMMAND_ADDRESS                 (VLV_DISPLAY_BASE + 0xb910)
-#define MIPI_COMMAND_ADDRESS(pipe)     _PIPE(pipe, _MIPIA_COMMAND_ADDRESS, _MIPIB_COMMAND_ADDRESS)
+#define _MIPIA_COMMAND_ADDRESS         (dev_priv->mipi_mmio_base + 0xb110)
+#define _MIPIB_COMMAND_ADDRESS         (dev_priv->mipi_mmio_base + 0xb910)
+#define MIPI_COMMAND_ADDRESS(tc)       _TRANSCODER(tc, \
+                               _MIPIA_COMMAND_ADDRESS, _MIPIB_COMMAND_ADDRESS)
 #define  COMMAND_MEM_ADDRESS_SHIFT                     5
 #define  COMMAND_MEM_ADDRESS_MASK                      (0x7ffffff << 5)
 #define  AUTO_PWG_ENABLE                               (1 << 2)
 #define  MEMORY_WRITE_DATA_FROM_PIPE_RENDERING         (1 << 1)
 #define  COMMAND_VALID                                 (1 << 0)
 
-#define _MIPIA_COMMAND_LENGTH                  (VLV_DISPLAY_BASE + 0xb114)
-#define _MIPIB_COMMAND_LENGTH                  (VLV_DISPLAY_BASE + 0xb914)
-#define MIPI_COMMAND_LENGTH(pipe)      _PIPE(pipe, _MIPIA_COMMAND_LENGTH, _MIPIB_COMMAND_LENGTH)
+#define _MIPIA_COMMAND_LENGTH          (dev_priv->mipi_mmio_base + 0xb114)
+#define _MIPIB_COMMAND_LENGTH          (dev_priv->mipi_mmio_base + 0xb914)
+#define MIPI_COMMAND_LENGTH(tc)        _TRANSCODER(tc, _MIPIA_COMMAND_LENGTH, \
+                                       _MIPIB_COMMAND_LENGTH)
 #define  COMMAND_LENGTH_SHIFT(n)                       (8 * (n)) /* n: 0...3 */
 #define  COMMAND_LENGTH_MASK(n)                                (0xff << (8 * (n)))
 
-#define _MIPIA_READ_DATA_RETURN0               (VLV_DISPLAY_BASE + 0xb118)
-#define _MIPIB_READ_DATA_RETURN0               (VLV_DISPLAY_BASE + 0xb918)
-#define MIPI_READ_DATA_RETURN(pipe, n) \
-       (_PIPE(pipe, _MIPIA_READ_DATA_RETURN0, _MIPIB_READ_DATA_RETURN0) + 4 * (n)) /* n: 0...7 */
+#define _MIPIA_READ_DATA_RETURN0       (dev_priv->mipi_mmio_base + 0xb118)
+#define _MIPIB_READ_DATA_RETURN0       (dev_priv->mipi_mmio_base + 0xb918)
+#define MIPI_READ_DATA_RETURN(tc, n) \
+       (_TRANSCODER(tc, _MIPIA_READ_DATA_RETURN0, _MIPIB_READ_DATA_RETURN0) \
+                                       + 4 * (n)) /* n: 0...7 */
 
-#define _MIPIA_READ_DATA_VALID                 (VLV_DISPLAY_BASE + 0xb138)
-#define _MIPIB_READ_DATA_VALID                 (VLV_DISPLAY_BASE + 0xb938)
-#define MIPI_READ_DATA_VALID(pipe)     _PIPE(pipe, _MIPIA_READ_DATA_VALID, _MIPIB_READ_DATA_VALID)
+#define _MIPIA_READ_DATA_VALID         (dev_priv->mipi_mmio_base + 0xb138)
+#define _MIPIB_READ_DATA_VALID         (dev_priv->mipi_mmio_base + 0xb938)
+#define MIPI_READ_DATA_VALID(tc)       _TRANSCODER(tc, \
+                               _MIPIA_READ_DATA_VALID, _MIPIB_READ_DATA_VALID)
 #define  READ_DATA_VALID(n)                            (1 << (n))
 
 /* For UMS only (deprecated): */
 #define _PALETTE_A (dev_priv->info.display_mmio_offset + 0xa000)
 #define _PALETTE_B (dev_priv->info.display_mmio_offset + 0xa800)
-#define _DPLL_A (dev_priv->info.display_mmio_offset + 0x6014)
-#define _DPLL_B (dev_priv->info.display_mmio_offset + 0x6018)
-#define _DPLL_A_MD (dev_priv->info.display_mmio_offset + 0x601c)
-#define _DPLL_B_MD (dev_priv->info.display_mmio_offset + 0x6020)
 
 #endif /* _I915_REG_H_ */
index 86ce39aad0ffd25e5502bf616f1349b387922f3e..ae7fd8fc27f05cab33eea39739c96f816f156fe9 100644 (file)
@@ -47,22 +47,45 @@ static u32 calc_residency(struct drm_device *dev, const u32 reg)
 
        intel_runtime_pm_get(dev_priv);
 
-       /* On VLV, residency time is in CZ units rather than 1.28us */
+       /* On VLV and CHV, residency time is in CZ units rather than 1.28us */
        if (IS_VALLEYVIEW(dev)) {
-               u32 clkctl2;
+               u32 reg, czcount_30ns;
 
-               clkctl2 = I915_READ(VLV_CLK_CTL2) >>
-                       CLK_CTL2_CZCOUNT_30NS_SHIFT;
-               if (!clkctl2) {
-                       WARN(!clkctl2, "bogus CZ count value");
+               if (IS_CHERRYVIEW(dev))
+                       reg = CHV_CLK_CTL1;
+               else
+                       reg = VLV_CLK_CTL2;
+
+               czcount_30ns = I915_READ(reg) >> CLK_CTL2_CZCOUNT_30NS_SHIFT;
+
+               if (!czcount_30ns) {
+                       WARN(!czcount_30ns, "bogus CZ count value");
                        ret = 0;
                        goto out;
                }
-               units = DIV_ROUND_UP_ULL(30ULL * bias, (u64)clkctl2);
+
+               units = 0;
+               div = 1000000ULL;
+
+               if (IS_CHERRYVIEW(dev)) {
+                       /* Special case for 320Mhz */
+                       if (czcount_30ns == 1) {
+                               div = 10000000ULL;
+                               units = 3125ULL;
+                       } else {
+                               /* chv counts are one less */
+                               czcount_30ns += 1;
+                       }
+               }
+
+               if (units == 0)
+                       units = DIV_ROUND_UP_ULL(30ULL * bias,
+                                                (u64)czcount_30ns);
+
                if (I915_READ(VLV_COUNTER_CONTROL) & VLV_COUNT_RANGE_HIGH)
                        units <<= 8;
 
-               div = 1000000ULL * bias;
+               div = div * bias;
        }
 
        raw_time = I915_READ(reg) * units;
@@ -461,11 +484,20 @@ static ssize_t gt_rp_mhz_show(struct device *kdev, struct device_attribute *attr
        mutex_unlock(&dev->struct_mutex);
 
        if (attr == &dev_attr_gt_RP0_freq_mhz) {
-               val = ((rp_state_cap & 0x0000ff) >> 0) * GT_FREQUENCY_MULTIPLIER;
+               if (IS_VALLEYVIEW(dev))
+                       val = vlv_gpu_freq(dev_priv, dev_priv->rps.rp0_freq);
+               else
+                       val = ((rp_state_cap & 0x0000ff) >> 0) * GT_FREQUENCY_MULTIPLIER;
        } else if (attr == &dev_attr_gt_RP1_freq_mhz) {
-               val = ((rp_state_cap & 0x00ff00) >> 8) * GT_FREQUENCY_MULTIPLIER;
+               if (IS_VALLEYVIEW(dev))
+                       val = vlv_gpu_freq(dev_priv, dev_priv->rps.rp1_freq);
+               else
+                       val = ((rp_state_cap & 0x00ff00) >> 8) * GT_FREQUENCY_MULTIPLIER;
        } else if (attr == &dev_attr_gt_RPn_freq_mhz) {
-               val = ((rp_state_cap & 0xff0000) >> 16) * GT_FREQUENCY_MULTIPLIER;
+               if (IS_VALLEYVIEW(dev))
+                       val = vlv_gpu_freq(dev_priv, dev_priv->rps.min_freq);
+               else
+                       val = ((rp_state_cap & 0xff0000) >> 16) * GT_FREQUENCY_MULTIPLIER;
        } else {
                BUG();
        }
@@ -486,6 +518,9 @@ static const struct attribute *vlv_attrs[] = {
        &dev_attr_gt_cur_freq_mhz.attr,
        &dev_attr_gt_max_freq_mhz.attr,
        &dev_attr_gt_min_freq_mhz.attr,
+       &dev_attr_gt_RP0_freq_mhz.attr,
+       &dev_attr_gt_RP1_freq_mhz.attr,
+       &dev_attr_gt_RPn_freq_mhz.attr,
        &dev_attr_vlv_rpe_freq_mhz.attr,
        NULL,
 };
index 827498e081df545df16ecbe308f93210ae05582c..a66955037e4e2f30bb9662fed0be12a02d5deaf2 100644 (file)
@@ -336,11 +336,12 @@ parse_lfp_backlight(struct drm_i915_private *dev_priv, struct bdb_header *bdb)
 
        dev_priv->vbt.backlight.pwm_freq_hz = entry->pwm_freq_hz;
        dev_priv->vbt.backlight.active_low_pwm = entry->active_low_pwm;
+       dev_priv->vbt.backlight.min_brightness = entry->min_brightness;
        DRM_DEBUG_KMS("VBT backlight PWM modulation frequency %u Hz, "
                      "active %s, min brightness %u, level %u\n",
                      dev_priv->vbt.backlight.pwm_freq_hz,
                      dev_priv->vbt.backlight.active_low_pwm ? "low" : "high",
-                     entry->min_brightness,
+                     dev_priv->vbt.backlight.min_brightness,
                      backlight_data->level[panel_type]);
 }
 
@@ -877,7 +878,7 @@ err:
 
        /* error during parsing so set all pointers to null
         * because of partial parsing */
-       memset(dev_priv->vbt.dsi.sequence, 0, MIPI_SEQ_MAX);
+       memset(dev_priv->vbt.dsi.sequence, 0, sizeof(dev_priv->vbt.dsi.sequence));
 }
 
 static void parse_ddi_port(struct drm_i915_private *dev_priv, enum port port,
index 5a045d3bd77e7c7f77c7e8fc55292d37714eab3a..2efaf8e8d9c49b6ca47491e8d5693f2072c8a333 100644 (file)
@@ -137,6 +137,18 @@ static void hsw_crt_get_config(struct intel_encoder *encoder,
        pipe_config->adjusted_mode.flags |= intel_crt_get_flags(encoder);
 }
 
+static void hsw_crt_pre_enable(struct intel_encoder *encoder)
+{
+       struct drm_device *dev = encoder->base.dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+
+       WARN(I915_READ(SPLL_CTL) & SPLL_PLL_ENABLE, "SPLL already enabled\n");
+       I915_WRITE(SPLL_CTL,
+                  SPLL_PLL_ENABLE | SPLL_PLL_FREQ_1350MHz | SPLL_PLL_SSC);
+       POSTING_READ(SPLL_CTL);
+       udelay(20);
+}
+
 /* Note: The caller is required to filter out dpms modes not supported by the
  * platform. */
 static void intel_crt_set_dpms(struct intel_encoder *encoder, int mode)
@@ -194,6 +206,20 @@ static void intel_disable_crt(struct intel_encoder *encoder)
        intel_crt_set_dpms(encoder, DRM_MODE_DPMS_OFF);
 }
 
+
+static void hsw_crt_post_disable(struct intel_encoder *encoder)
+{
+       struct drm_device *dev = encoder->base.dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       uint32_t val;
+
+       DRM_DEBUG_KMS("Disabling SPLL\n");
+       val = I915_READ(SPLL_CTL);
+       WARN_ON(!(val & SPLL_PLL_ENABLE));
+       I915_WRITE(SPLL_CTL, val & ~SPLL_PLL_ENABLE);
+       POSTING_READ(SPLL_CTL);
+}
+
 static void intel_enable_crt(struct intel_encoder *encoder)
 {
        struct intel_crt *crt = intel_encoder_to_crt(encoder);
@@ -289,8 +315,10 @@ static bool intel_crt_compute_config(struct intel_encoder *encoder,
                pipe_config->pipe_bpp = 24;
 
        /* FDI must always be 2.7 GHz */
-       if (HAS_DDI(dev))
+       if (HAS_DDI(dev)) {
+               pipe_config->ddi_pll_sel = PORT_CLK_SEL_SPLL;
                pipe_config->port_clock = 135000 * 2;
+       }
 
        return true;
 }
@@ -632,8 +660,6 @@ intel_crt_detect(struct drm_connector *connector, bool force)
        struct intel_load_detect_pipe tmp;
        struct drm_modeset_acquire_ctx ctx;
 
-       intel_runtime_pm_get(dev_priv);
-
        DRM_DEBUG_KMS("[CONNECTOR:%d:%s] force=%d\n",
                      connector->base.id, connector->name,
                      force);
@@ -685,8 +711,6 @@ intel_crt_detect(struct drm_connector *connector, bool force)
 
 out:
        intel_display_power_put(dev_priv, power_domain);
-       intel_runtime_pm_put(dev_priv);
-
        return status;
 }
 
@@ -860,6 +884,8 @@ void intel_crt_init(struct drm_device *dev)
        if (HAS_DDI(dev)) {
                crt->base.get_config = hsw_crt_get_config;
                crt->base.get_hw_state = intel_ddi_get_hw_state;
+               crt->base.pre_enable = hsw_crt_pre_enable;
+               crt->base.post_disable = hsw_crt_post_disable;
        } else {
                crt->base.get_config = intel_crt_get_config;
                crt->base.get_hw_state = intel_crt_get_hw_state;
@@ -869,7 +895,7 @@ void intel_crt_init(struct drm_device *dev)
 
        drm_connector_helper_add(connector, &intel_crt_connector_helper_funcs);
 
-       drm_sysfs_connector_add(connector);
+       drm_connector_register(connector);
 
        if (!I915_HAS_HOTPLUG(dev))
                intel_connector->polled = DRM_CONNECTOR_POLL_CONNECT;
index b17b9c7c769f92eca6497a938db2f40310cd0b10..5db0b5552e39a5005f1c9e1dde74fe7216bb5037 100644 (file)
@@ -76,12 +76,12 @@ static const u32 bdw_ddi_translations_edp[] = {
        0x00FFFFFF, 0x00000012,         /* eDP parameters */
        0x00EBAFFF, 0x00020011,
        0x00C71FFF, 0x0006000F,
+       0x00AAAFFF, 0x000E000A,
        0x00FFFFFF, 0x00020011,
        0x00DB6FFF, 0x0005000F,
        0x00BEEFFF, 0x000A000C,
        0x00FFFFFF, 0x0005000F,
        0x00DB6FFF, 0x000A000C,
-       0x00FFFFFF, 0x000A000C,
        0x00FFFFFF, 0x00140006          /* HDMI parameters 800mV 0dB*/
 };
 
@@ -89,12 +89,12 @@ static const u32 bdw_ddi_translations_dp[] = {
        0x00FFFFFF, 0x0007000E,         /* DP parameters */
        0x00D75FFF, 0x000E000A,
        0x00BEFFFF, 0x00140006,
+       0x80B2CFFF, 0x001B0002,
        0x00FFFFFF, 0x000E000A,
        0x00D75FFF, 0x00180004,
        0x80CB2FFF, 0x001B0002,
        0x00F7DFFF, 0x00180004,
        0x80D75FFF, 0x001B0002,
-       0x80FFFFFF, 0x001B0002,
        0x00FFFFFF, 0x00140006          /* HDMI parameters 800mV 0dB*/
 };
 
@@ -116,7 +116,10 @@ enum port intel_ddi_get_encoder_port(struct intel_encoder *intel_encoder)
        struct drm_encoder *encoder = &intel_encoder->base;
        int type = intel_encoder->type;
 
-       if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP ||
+       if (type == INTEL_OUTPUT_DP_MST) {
+               struct intel_digital_port *intel_dig_port = enc_to_mst(encoder)->primary;
+               return intel_dig_port->port;
+       } else if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP ||
            type == INTEL_OUTPUT_HDMI || type == INTEL_OUTPUT_UNKNOWN) {
                struct intel_digital_port *intel_dig_port =
                        enc_to_dig_port(encoder);
@@ -277,7 +280,8 @@ void hsw_fdi_link_train(struct drm_crtc *crtc)
        I915_WRITE(_FDI_RXA_CTL, rx_ctl_val);
 
        /* Configure Port Clock Select */
-       I915_WRITE(PORT_CLK_SEL(PORT_E), intel_crtc->ddi_pll_sel);
+       I915_WRITE(PORT_CLK_SEL(PORT_E), intel_crtc->config.ddi_pll_sel);
+       WARN_ON(intel_crtc->config.ddi_pll_sel != PORT_CLK_SEL_SPLL);
 
        /* Start the training iterating through available voltages and emphasis,
         * testing each value twice. */
@@ -364,6 +368,18 @@ void hsw_fdi_link_train(struct drm_crtc *crtc)
        DRM_ERROR("FDI link training failed!\n");
 }
 
+void intel_ddi_init_dp_buf_reg(struct intel_encoder *encoder)
+{
+       struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
+       struct intel_digital_port *intel_dig_port =
+               enc_to_dig_port(&encoder->base);
+
+       intel_dp->DP = intel_dig_port->saved_port_bits |
+               DDI_BUF_CTL_ENABLE | DDI_BUF_EMP_400MV_0DB_HSW;
+       intel_dp->DP |= DDI_PORT_WIDTH(intel_dp->lane_count);
+
+}
+
 static struct intel_encoder *
 intel_ddi_get_crtc_encoder(struct drm_crtc *crtc)
 {
@@ -385,53 +401,6 @@ intel_ddi_get_crtc_encoder(struct drm_crtc *crtc)
        return ret;
 }
 
-void intel_ddi_put_crtc_pll(struct drm_crtc *crtc)
-{
-       struct drm_i915_private *dev_priv = crtc->dev->dev_private;
-       struct intel_ddi_plls *plls = &dev_priv->ddi_plls;
-       struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
-       uint32_t val;
-
-       switch (intel_crtc->ddi_pll_sel) {
-       case PORT_CLK_SEL_SPLL:
-               plls->spll_refcount--;
-               if (plls->spll_refcount == 0) {
-                       DRM_DEBUG_KMS("Disabling SPLL\n");
-                       val = I915_READ(SPLL_CTL);
-                       WARN_ON(!(val & SPLL_PLL_ENABLE));
-                       I915_WRITE(SPLL_CTL, val & ~SPLL_PLL_ENABLE);
-                       POSTING_READ(SPLL_CTL);
-               }
-               break;
-       case PORT_CLK_SEL_WRPLL1:
-               plls->wrpll1_refcount--;
-               if (plls->wrpll1_refcount == 0) {
-                       DRM_DEBUG_KMS("Disabling WRPLL 1\n");
-                       val = I915_READ(WRPLL_CTL1);
-                       WARN_ON(!(val & WRPLL_PLL_ENABLE));
-                       I915_WRITE(WRPLL_CTL1, val & ~WRPLL_PLL_ENABLE);
-                       POSTING_READ(WRPLL_CTL1);
-               }
-               break;
-       case PORT_CLK_SEL_WRPLL2:
-               plls->wrpll2_refcount--;
-               if (plls->wrpll2_refcount == 0) {
-                       DRM_DEBUG_KMS("Disabling WRPLL 2\n");
-                       val = I915_READ(WRPLL_CTL2);
-                       WARN_ON(!(val & WRPLL_PLL_ENABLE));
-                       I915_WRITE(WRPLL_CTL2, val & ~WRPLL_PLL_ENABLE);
-                       POSTING_READ(WRPLL_CTL2);
-               }
-               break;
-       }
-
-       WARN(plls->spll_refcount < 0, "Invalid SPLL refcount\n");
-       WARN(plls->wrpll1_refcount < 0, "Invalid WRPLL1 refcount\n");
-       WARN(plls->wrpll2_refcount < 0, "Invalid WRPLL2 refcount\n");
-
-       intel_crtc->ddi_pll_sel = PORT_CLK_SEL_NONE;
-}
-
 #define LC_FREQ 2700
 #define LC_FREQ_2K (LC_FREQ * 2000)
 
@@ -592,9 +561,9 @@ static int intel_ddi_calc_wrpll_link(struct drm_i915_private *dev_priv,
        u32 wrpll;
 
        wrpll = I915_READ(reg);
-       switch (wrpll & SPLL_PLL_REF_MASK) {
-       case SPLL_PLL_SSC:
-       case SPLL_PLL_NON_SSC:
+       switch (wrpll & WRPLL_PLL_REF_MASK) {
+       case WRPLL_PLL_SSC:
+       case WRPLL_PLL_NON_SSC:
                /*
                 * We could calculate spread here, but our checking
                 * code only cares about 5% accuracy, and spread is a max of
@@ -602,7 +571,7 @@ static int intel_ddi_calc_wrpll_link(struct drm_i915_private *dev_priv,
                 */
                refclk = 135;
                break;
-       case SPLL_PLL_LCPLL:
+       case WRPLL_PLL_LCPLL:
                refclk = LC_FREQ;
                break;
        default:
@@ -618,15 +587,14 @@ static int intel_ddi_calc_wrpll_link(struct drm_i915_private *dev_priv,
        return (refclk * n * 100) / (p * r);
 }
 
-static void intel_ddi_clock_get(struct intel_encoder *encoder,
-                               struct intel_crtc_config *pipe_config)
+void intel_ddi_clock_get(struct intel_encoder *encoder,
+                        struct intel_crtc_config *pipe_config)
 {
        struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
-       enum port port = intel_ddi_get_encoder_port(encoder);
        int link_clock = 0;
        u32 val, pll;
 
-       val = I915_READ(PORT_CLK_SEL(port));
+       val = pipe_config->ddi_pll_sel;
        switch (val & PORT_CLK_SEL_MASK) {
        case PORT_CLK_SEL_LCPLL_810:
                link_clock = 81000;
@@ -750,173 +718,37 @@ bool intel_ddi_pll_select(struct intel_crtc *intel_crtc)
 {
        struct drm_crtc *crtc = &intel_crtc->base;
        struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
-       struct drm_encoder *encoder = &intel_encoder->base;
-       struct drm_i915_private *dev_priv = crtc->dev->dev_private;
-       struct intel_ddi_plls *plls = &dev_priv->ddi_plls;
        int type = intel_encoder->type;
-       enum pipe pipe = intel_crtc->pipe;
        int clock = intel_crtc->config.port_clock;
 
-       intel_ddi_put_crtc_pll(crtc);
-
-       if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP) {
-               struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
+       intel_put_shared_dpll(intel_crtc);
 
-               switch (intel_dp->link_bw) {
-               case DP_LINK_BW_1_62:
-                       intel_crtc->ddi_pll_sel = PORT_CLK_SEL_LCPLL_810;
-                       break;
-               case DP_LINK_BW_2_7:
-                       intel_crtc->ddi_pll_sel = PORT_CLK_SEL_LCPLL_1350;
-                       break;
-               case DP_LINK_BW_5_4:
-                       intel_crtc->ddi_pll_sel = PORT_CLK_SEL_LCPLL_2700;
-                       break;
-               default:
-                       DRM_ERROR("Link bandwidth %d unsupported\n",
-                                 intel_dp->link_bw);
-                       return false;
-               }
-
-       } else if (type == INTEL_OUTPUT_HDMI) {
-               uint32_t reg, val;
+       if (type == INTEL_OUTPUT_HDMI) {
+               struct intel_shared_dpll *pll;
+               uint32_t val;
                unsigned p, n2, r2;
 
                intel_ddi_calculate_wrpll(clock * 1000, &r2, &n2, &p);
 
-               val = WRPLL_PLL_ENABLE | WRPLL_PLL_SELECT_LCPLL_2700 |
+               val = WRPLL_PLL_ENABLE | WRPLL_PLL_LCPLL |
                      WRPLL_DIVIDER_REFERENCE(r2) | WRPLL_DIVIDER_FEEDBACK(n2) |
                      WRPLL_DIVIDER_POST(p);
 
-               if (val == I915_READ(WRPLL_CTL1)) {
-                       DRM_DEBUG_KMS("Reusing WRPLL 1 on pipe %c\n",
-                                     pipe_name(pipe));
-                       reg = WRPLL_CTL1;
-               } else if (val == I915_READ(WRPLL_CTL2)) {
-                       DRM_DEBUG_KMS("Reusing WRPLL 2 on pipe %c\n",
-                                     pipe_name(pipe));
-                       reg = WRPLL_CTL2;
-               } else if (plls->wrpll1_refcount == 0) {
-                       DRM_DEBUG_KMS("Using WRPLL 1 on pipe %c\n",
-                                     pipe_name(pipe));
-                       reg = WRPLL_CTL1;
-               } else if (plls->wrpll2_refcount == 0) {
-                       DRM_DEBUG_KMS("Using WRPLL 2 on pipe %c\n",
-                                     pipe_name(pipe));
-                       reg = WRPLL_CTL2;
-               } else {
-                       DRM_ERROR("No WRPLLs available!\n");
-                       return false;
-               }
-
-               DRM_DEBUG_KMS("WRPLL: %dKHz refresh rate with p=%d, n2=%d r2=%d\n",
-                             clock, p, n2, r2);
-
-               if (reg == WRPLL_CTL1) {
-                       plls->wrpll1_refcount++;
-                       intel_crtc->ddi_pll_sel = PORT_CLK_SEL_WRPLL1;
-               } else {
-                       plls->wrpll2_refcount++;
-                       intel_crtc->ddi_pll_sel = PORT_CLK_SEL_WRPLL2;
-               }
+               intel_crtc->config.dpll_hw_state.wrpll = val;
 
-       } else if (type == INTEL_OUTPUT_ANALOG) {
-               if (plls->spll_refcount == 0) {
-                       DRM_DEBUG_KMS("Using SPLL on pipe %c\n",
-                                     pipe_name(pipe));
-                       plls->spll_refcount++;
-                       intel_crtc->ddi_pll_sel = PORT_CLK_SEL_SPLL;
-               } else {
-                       DRM_ERROR("SPLL already in use\n");
+               pll = intel_get_shared_dpll(intel_crtc);
+               if (pll == NULL) {
+                       DRM_DEBUG_DRIVER("failed to find PLL for pipe %c\n",
+                                        pipe_name(intel_crtc->pipe));
                        return false;
                }
 
-       } else {
-               WARN(1, "Invalid DDI encoder type %d\n", type);
-               return false;
+               intel_crtc->config.ddi_pll_sel = PORT_CLK_SEL_WRPLL(pll->id);
        }
 
        return true;
 }
 
-/*
- * To be called after intel_ddi_pll_select(). That one selects the PLL to be
- * used, this one actually enables the PLL.
- */
-void intel_ddi_pll_enable(struct intel_crtc *crtc)
-{
-       struct drm_device *dev = crtc->base.dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_ddi_plls *plls = &dev_priv->ddi_plls;
-       int clock = crtc->config.port_clock;
-       uint32_t reg, cur_val, new_val;
-       int refcount;
-       const char *pll_name;
-       uint32_t enable_bit = (1 << 31);
-       unsigned int p, n2, r2;
-
-       BUILD_BUG_ON(enable_bit != SPLL_PLL_ENABLE);
-       BUILD_BUG_ON(enable_bit != WRPLL_PLL_ENABLE);
-
-       switch (crtc->ddi_pll_sel) {
-       case PORT_CLK_SEL_LCPLL_2700:
-       case PORT_CLK_SEL_LCPLL_1350:
-       case PORT_CLK_SEL_LCPLL_810:
-               /*
-                * LCPLL should always be enabled at this point of the mode set
-                * sequence, so nothing to do.
-                */
-               return;
-
-       case PORT_CLK_SEL_SPLL:
-               pll_name = "SPLL";
-               reg = SPLL_CTL;
-               refcount = plls->spll_refcount;
-               new_val = SPLL_PLL_ENABLE | SPLL_PLL_FREQ_1350MHz |
-                         SPLL_PLL_SSC;
-               break;
-
-       case PORT_CLK_SEL_WRPLL1:
-       case PORT_CLK_SEL_WRPLL2:
-               if (crtc->ddi_pll_sel == PORT_CLK_SEL_WRPLL1) {
-                       pll_name = "WRPLL1";
-                       reg = WRPLL_CTL1;
-                       refcount = plls->wrpll1_refcount;
-               } else {
-                       pll_name = "WRPLL2";
-                       reg = WRPLL_CTL2;
-                       refcount = plls->wrpll2_refcount;
-               }
-
-               intel_ddi_calculate_wrpll(clock * 1000, &r2, &n2, &p);
-
-               new_val = WRPLL_PLL_ENABLE | WRPLL_PLL_SELECT_LCPLL_2700 |
-                         WRPLL_DIVIDER_REFERENCE(r2) |
-                         WRPLL_DIVIDER_FEEDBACK(n2) | WRPLL_DIVIDER_POST(p);
-
-               break;
-
-       case PORT_CLK_SEL_NONE:
-               WARN(1, "Bad selected pll: PORT_CLK_SEL_NONE\n");
-               return;
-       default:
-               WARN(1, "Bad selected pll: 0x%08x\n", crtc->ddi_pll_sel);
-               return;
-       }
-
-       cur_val = I915_READ(reg);
-
-       WARN(refcount < 1, "Bad %s refcount: %d\n", pll_name, refcount);
-       if (refcount == 1) {
-               WARN(cur_val & enable_bit, "%s already enabled\n", pll_name);
-               I915_WRITE(reg, new_val);
-               POSTING_READ(reg);
-               udelay(20);
-       } else {
-               WARN((cur_val & enable_bit) == 0, "%s disabled\n", pll_name);
-       }
-}
-
 void intel_ddi_set_pipe_settings(struct drm_crtc *crtc)
 {
        struct drm_i915_private *dev_priv = crtc->dev->dev_private;
@@ -926,8 +758,7 @@ void intel_ddi_set_pipe_settings(struct drm_crtc *crtc)
        int type = intel_encoder->type;
        uint32_t temp;
 
-       if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP) {
-
+       if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP || type == INTEL_OUTPUT_DP_MST) {
                temp = TRANS_MSA_SYNC_CLK;
                switch (intel_crtc->config.pipe_bpp) {
                case 18:
@@ -949,6 +780,21 @@ void intel_ddi_set_pipe_settings(struct drm_crtc *crtc)
        }
 }
 
+void intel_ddi_set_vc_payload_alloc(struct drm_crtc *crtc, bool state)
+{
+       struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
+       struct drm_device *dev = crtc->dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
+       uint32_t temp;
+       temp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
+       if (state == true)
+               temp |= TRANS_DDI_DP_VC_PAYLOAD_ALLOC;
+       else
+               temp &= ~TRANS_DDI_DP_VC_PAYLOAD_ALLOC;
+       I915_WRITE(TRANS_DDI_FUNC_CTL(cpu_transcoder), temp);
+}
+
 void intel_ddi_enable_transcoder_func(struct drm_crtc *crtc)
 {
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
@@ -995,7 +841,9 @@ void intel_ddi_enable_transcoder_func(struct drm_crtc *crtc)
                         * eDP when not using the panel fitter, and when not
                         * using motion blur mitigation (which we don't
                         * support). */
-                       if (IS_HASWELL(dev) && intel_crtc->config.pch_pfit.enabled)
+                       if (IS_HASWELL(dev) &&
+                           (intel_crtc->config.pch_pfit.enabled ||
+                            intel_crtc->config.pch_pfit.force_thru))
                                temp |= TRANS_DDI_EDP_INPUT_A_ONOFF;
                        else
                                temp |= TRANS_DDI_EDP_INPUT_A_ON;
@@ -1026,7 +874,19 @@ void intel_ddi_enable_transcoder_func(struct drm_crtc *crtc)
                   type == INTEL_OUTPUT_EDP) {
                struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
 
-               temp |= TRANS_DDI_MODE_SELECT_DP_SST;
+               if (intel_dp->is_mst) {
+                       temp |= TRANS_DDI_MODE_SELECT_DP_MST;
+               } else
+                       temp |= TRANS_DDI_MODE_SELECT_DP_SST;
+
+               temp |= DDI_PORT_WIDTH(intel_dp->lane_count);
+       } else if (type == INTEL_OUTPUT_DP_MST) {
+               struct intel_dp *intel_dp = &enc_to_mst(encoder)->primary->dp;
+
+               if (intel_dp->is_mst) {
+                       temp |= TRANS_DDI_MODE_SELECT_DP_MST;
+               } else
+                       temp |= TRANS_DDI_MODE_SELECT_DP_SST;
 
                temp |= DDI_PORT_WIDTH(intel_dp->lane_count);
        } else {
@@ -1043,7 +903,7 @@ void intel_ddi_disable_transcoder_func(struct drm_i915_private *dev_priv,
        uint32_t reg = TRANS_DDI_FUNC_CTL(cpu_transcoder);
        uint32_t val = I915_READ(reg);
 
-       val &= ~(TRANS_DDI_FUNC_ENABLE | TRANS_DDI_PORT_MASK);
+       val &= ~(TRANS_DDI_FUNC_ENABLE | TRANS_DDI_PORT_MASK | TRANS_DDI_DP_VC_PAYLOAD_ALLOC);
        val |= TRANS_DDI_PORT_NONE;
        I915_WRITE(reg, val);
 }
@@ -1082,8 +942,11 @@ bool intel_ddi_connector_get_hw_state(struct intel_connector *intel_connector)
        case TRANS_DDI_MODE_SELECT_DP_SST:
                if (type == DRM_MODE_CONNECTOR_eDP)
                        return true;
-       case TRANS_DDI_MODE_SELECT_DP_MST:
                return (type == DRM_MODE_CONNECTOR_DisplayPort);
+       case TRANS_DDI_MODE_SELECT_DP_MST:
+               /* if the transcoder is in MST state then
+                * connector isn't connected */
+               return false;
 
        case TRANS_DDI_MODE_SELECT_FDI:
                return (type == DRM_MODE_CONNECTOR_VGA);
@@ -1135,6 +998,9 @@ bool intel_ddi_get_hw_state(struct intel_encoder *encoder,
 
                        if ((tmp & TRANS_DDI_PORT_MASK)
                            == TRANS_DDI_SELECT_PORT(port)) {
+                               if ((tmp & TRANS_DDI_MODE_SELECT_MASK) == TRANS_DDI_MODE_SELECT_DP_MST)
+                                       return false;
+
                                *pipe = i;
                                return true;
                        }
@@ -1146,76 +1012,6 @@ bool intel_ddi_get_hw_state(struct intel_encoder *encoder,
        return false;
 }
 
-static uint32_t intel_ddi_get_crtc_pll(struct drm_i915_private *dev_priv,
-                                      enum pipe pipe)
-{
-       uint32_t temp, ret;
-       enum port port = I915_MAX_PORTS;
-       enum transcoder cpu_transcoder = intel_pipe_to_cpu_transcoder(dev_priv,
-                                                                     pipe);
-       int i;
-
-       if (cpu_transcoder == TRANSCODER_EDP) {
-               port = PORT_A;
-       } else {
-               temp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
-               temp &= TRANS_DDI_PORT_MASK;
-
-               for (i = PORT_B; i <= PORT_E; i++)
-                       if (temp == TRANS_DDI_SELECT_PORT(i))
-                               port = i;
-       }
-
-       if (port == I915_MAX_PORTS) {
-               WARN(1, "Pipe %c enabled on an unknown port\n",
-                    pipe_name(pipe));
-               ret = PORT_CLK_SEL_NONE;
-       } else {
-               ret = I915_READ(PORT_CLK_SEL(port));
-               DRM_DEBUG_KMS("Pipe %c connected to port %c using clock "
-                             "0x%08x\n", pipe_name(pipe), port_name(port),
-                             ret);
-       }
-
-       return ret;
-}
-
-void intel_ddi_setup_hw_pll_state(struct drm_device *dev)
-{
-       struct drm_i915_private *dev_priv = dev->dev_private;
-       enum pipe pipe;
-       struct intel_crtc *intel_crtc;
-
-       dev_priv->ddi_plls.spll_refcount = 0;
-       dev_priv->ddi_plls.wrpll1_refcount = 0;
-       dev_priv->ddi_plls.wrpll2_refcount = 0;
-
-       for_each_pipe(pipe) {
-               intel_crtc =
-                       to_intel_crtc(dev_priv->pipe_to_crtc_mapping[pipe]);
-
-               if (!intel_crtc->active) {
-                       intel_crtc->ddi_pll_sel = PORT_CLK_SEL_NONE;
-                       continue;
-               }
-
-               intel_crtc->ddi_pll_sel = intel_ddi_get_crtc_pll(dev_priv,
-                                                                pipe);
-
-               switch (intel_crtc->ddi_pll_sel) {
-               case PORT_CLK_SEL_SPLL:
-                       dev_priv->ddi_plls.spll_refcount++;
-                       break;
-               case PORT_CLK_SEL_WRPLL1:
-                       dev_priv->ddi_plls.wrpll1_refcount++;
-                       break;
-               case PORT_CLK_SEL_WRPLL2:
-                       dev_priv->ddi_plls.wrpll2_refcount++;
-                       break;
-               }
-       }
-}
-
 void intel_ddi_enable_pipe_clock(struct intel_crtc *intel_crtc)
 {
        struct drm_crtc *crtc = &intel_crtc->base;
@@ -1261,17 +1057,13 @@ static void intel_ddi_pre_enable(struct intel_encoder *intel_encoder)
                intel_edp_panel_on(intel_dp);
        }
 
-       WARN_ON(crtc->ddi_pll_sel == PORT_CLK_SEL_NONE);
-       I915_WRITE(PORT_CLK_SEL(port), crtc->ddi_pll_sel);
+       WARN_ON(crtc->config.ddi_pll_sel == PORT_CLK_SEL_NONE);
+       I915_WRITE(PORT_CLK_SEL(port), crtc->config.ddi_pll_sel);
 
        if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP) {
                struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
-               struct intel_digital_port *intel_dig_port =
-                       enc_to_dig_port(encoder);
 
-               intel_dp->DP = intel_dig_port->saved_port_bits |
-                              DDI_BUF_CTL_ENABLE | DDI_BUF_EMP_400MV_0DB_HSW;
-               intel_dp->DP |= DDI_PORT_WIDTH(intel_dp->lane_count);
+               intel_ddi_init_dp_buf_reg(intel_encoder);
 
                intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_ON);
                intel_dp_start_link_train(intel_dp);
@@ -1418,10 +1210,60 @@ int intel_ddi_get_cdclk_freq(struct drm_i915_private *dev_priv)
        }
 }
 
+static void hsw_ddi_pll_enable(struct drm_i915_private *dev_priv,
+                              struct intel_shared_dpll *pll)
+{
+       I915_WRITE(WRPLL_CTL(pll->id), pll->hw_state.wrpll);
+       POSTING_READ(WRPLL_CTL(pll->id));
+       udelay(20);
+}
+
+static void hsw_ddi_pll_disable(struct drm_i915_private *dev_priv,
+                               struct intel_shared_dpll *pll)
+{
+       uint32_t val;
+
+       val = I915_READ(WRPLL_CTL(pll->id));
+       I915_WRITE(WRPLL_CTL(pll->id), val & ~WRPLL_PLL_ENABLE);
+       POSTING_READ(WRPLL_CTL(pll->id));
+}
+
+static bool hsw_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
+                                    struct intel_shared_dpll *pll,
+                                    struct intel_dpll_hw_state *hw_state)
+{
+       uint32_t val;
+
+       if (!intel_display_power_enabled(dev_priv, POWER_DOMAIN_PLLS))
+               return false;
+
+       val = I915_READ(WRPLL_CTL(pll->id));
+       hw_state->wrpll = val;
+
+       return val & WRPLL_PLL_ENABLE;
+}
+
+static const char * const hsw_ddi_pll_names[] = {
+       "WRPLL 1",
+       "WRPLL 2",
+};
+
 void intel_ddi_pll_init(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        uint32_t val = I915_READ(LCPLL_CTL);
+       int i;
+
+       dev_priv->num_shared_dpll = 2;
+
+       for (i = 0; i < dev_priv->num_shared_dpll; i++) {
+               dev_priv->shared_dplls[i].id = i;
+               dev_priv->shared_dplls[i].name = hsw_ddi_pll_names[i];
+               dev_priv->shared_dplls[i].disable = hsw_ddi_pll_disable;
+               dev_priv->shared_dplls[i].enable = hsw_ddi_pll_enable;
+               dev_priv->shared_dplls[i].get_hw_state =
+                       hsw_ddi_pll_get_hw_state;
+       }
 
        /* The LCPLL register should be turned on by the BIOS. For now let's
         * just check its state and print errors in case something is wrong.
@@ -1465,10 +1307,15 @@ void intel_ddi_prepare_link_retrain(struct drm_encoder *encoder)
                        intel_wait_ddi_buf_idle(dev_priv, port);
        }
 
-       val = DP_TP_CTL_ENABLE | DP_TP_CTL_MODE_SST |
+       val = DP_TP_CTL_ENABLE |
              DP_TP_CTL_LINK_TRAIN_PAT1 | DP_TP_CTL_SCRAMBLE_DISABLE;
-       if (drm_dp_enhanced_frame_cap(intel_dp->dpcd))
-               val |= DP_TP_CTL_ENHANCED_FRAME_ENABLE;
+       if (intel_dp->is_mst)
+               val |= DP_TP_CTL_MODE_MST;
+       else {
+               val |= DP_TP_CTL_MODE_SST;
+               if (drm_dp_enhanced_frame_cap(intel_dp->dpcd))
+                       val |= DP_TP_CTL_ENHANCED_FRAME_ENABLE;
+       }
        I915_WRITE(DP_TP_CTL(port), val);
        POSTING_READ(DP_TP_CTL(port));
 
@@ -1507,11 +1354,16 @@ void intel_ddi_fdi_disable(struct drm_crtc *crtc)
 
 static void intel_ddi_hot_plug(struct intel_encoder *intel_encoder)
 {
-       struct intel_dp *intel_dp = enc_to_intel_dp(&intel_encoder->base);
-       int type = intel_encoder->type;
+       struct intel_digital_port *intel_dig_port = enc_to_dig_port(&intel_encoder->base);
+       int type = intel_dig_port->base.type;
+
+       if (type != INTEL_OUTPUT_DISPLAYPORT &&
+           type != INTEL_OUTPUT_EDP &&
+           type != INTEL_OUTPUT_UNKNOWN) {
+               return;
+       }
 
-       if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP)
-               intel_dp_check_link_status(intel_dp);
+       intel_dp_hot_plug(intel_encoder);
 }
 
 void intel_ddi_get_config(struct intel_encoder *encoder,
@@ -1663,15 +1515,13 @@ void intel_ddi_init(struct drm_device *dev, enum port port)
        struct intel_digital_port *intel_dig_port;
        struct intel_encoder *intel_encoder;
        struct drm_encoder *encoder;
-       struct intel_connector *hdmi_connector = NULL;
-       struct intel_connector *dp_connector = NULL;
        bool init_hdmi, init_dp;
 
        init_hdmi = (dev_priv->vbt.ddi_port_info[port].supports_dvi ||
                     dev_priv->vbt.ddi_port_info[port].supports_hdmi);
        init_dp = dev_priv->vbt.ddi_port_info[port].supports_dp;
        if (!init_dp && !init_hdmi) {
-               DRM_DEBUG_KMS("VBT says port %c is not DVI/HDMI/DP compatible\n",
+               DRM_DEBUG_KMS("VBT says port %c is not DVI/HDMI/DP compatible, assuming it is\n",
                              port_name(port));
                init_hdmi = true;
                init_dp = true;
@@ -1701,20 +1551,28 @@ void intel_ddi_init(struct drm_device *dev, enum port port)
                                           DDI_A_4_LANES);
 
        intel_encoder->type = INTEL_OUTPUT_UNKNOWN;
-       intel_encoder->crtc_mask =  (1 << 0) | (1 << 1) | (1 << 2);
+       intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
        intel_encoder->cloneable = 0;
        intel_encoder->hot_plug = intel_ddi_hot_plug;
 
-       if (init_dp)
-               dp_connector = intel_ddi_init_dp_connector(intel_dig_port);
+       if (init_dp) {
+               if (!intel_ddi_init_dp_connector(intel_dig_port))
+                       goto err;
+
+               intel_dig_port->hpd_pulse = intel_dp_hpd_pulse;
+               dev_priv->hpd_irq_port[port] = intel_dig_port;
+       }
 
        /* In theory we don't need the encoder->type check, but leave it just in
         * case we have some really bad VBTs... */
-       if (intel_encoder->type != INTEL_OUTPUT_EDP && init_hdmi)
-               hdmi_connector = intel_ddi_init_hdmi_connector(intel_dig_port);
-
-       if (!dp_connector && !hdmi_connector) {
-               drm_encoder_cleanup(encoder);
-               kfree(intel_dig_port);
+       if (intel_encoder->type != INTEL_OUTPUT_EDP && init_hdmi) {
+               if (!intel_ddi_init_hdmi_connector(intel_dig_port))
+                       goto err;
        }
+
+       return;
+
+err:
+       drm_encoder_cleanup(encoder);
+       kfree(intel_dig_port);
 }
index f0be855ddf45c5b817edd0efb7b28eb658fe032c..018fb7222f60ecee10fcb0f2db65e89d29c42e0f 100644 (file)
 #include "i915_trace.h"
 #include <drm/drm_dp_helper.h>
 #include <drm/drm_crtc_helper.h>
+#include <drm/drm_plane_helper.h>
+#include <drm/drm_rect.h>
 #include <linux/dma_remapping.h>
 
+/* Primary plane formats supported by all gen */
+#define COMMON_PRIMARY_FORMATS \
+       DRM_FORMAT_C8, \
+       DRM_FORMAT_RGB565, \
+       DRM_FORMAT_XRGB8888, \
+       DRM_FORMAT_ARGB8888
+
+/* Primary plane formats for gen <= 3 */
+static const uint32_t intel_primary_formats_gen2[] = {
+       COMMON_PRIMARY_FORMATS,
+       DRM_FORMAT_XRGB1555,
+       DRM_FORMAT_ARGB1555,
+};
+
+/* Primary plane formats for gen >= 4 */
+static const uint32_t intel_primary_formats_gen4[] = {
+       COMMON_PRIMARY_FORMATS, \
+       DRM_FORMAT_XBGR8888,
+       DRM_FORMAT_ABGR8888,
+       DRM_FORMAT_XRGB2101010,
+       DRM_FORMAT_ARGB2101010,
+       DRM_FORMAT_XBGR2101010,
+       DRM_FORMAT_ABGR2101010,
+};
+
+/* Cursor formats */
+static const uint32_t intel_cursor_formats[] = {
+       DRM_FORMAT_ARGB8888,
+};
+
 #define DIV_ROUND_CLOSEST_ULL(ll, d)   \
-       ({ unsigned long long _tmp = (ll)+(d)/2; do_div(_tmp, d); _tmp; })
+({ unsigned long long _tmp = (ll)+(d)/2; do_div(_tmp, d); _tmp; })
 
-static void intel_increase_pllclock(struct drm_crtc *crtc);
+static void intel_increase_pllclock(struct drm_device *dev,
+                                   enum pipe pipe);
 static void intel_crtc_update_cursor(struct drm_crtc *crtc, bool on);
 
 static void i9xx_crtc_clock_get(struct intel_crtc *crtc,
@@ -68,6 +101,14 @@ static void haswell_set_pipeconf(struct drm_crtc *crtc);
 static void intel_set_pipe_csc(struct drm_crtc *crtc);
 static void vlv_prepare_pll(struct intel_crtc *crtc);
 
+static struct intel_encoder *intel_find_encoder(struct intel_connector *connector, int pipe)
+{
+       if (!connector->mst_port)
+               return connector->encoder;
+       else
+               return &connector->mst_port->mst_encoders[pipe]->base;
+}
+
 typedef struct {
        int     min, max;
 } intel_range_t;
@@ -1061,11 +1102,6 @@ void assert_shared_dpll(struct drm_i915_private *dev_priv,
        bool cur_state;
        struct intel_dpll_hw_state hw_state;
 
-       if (HAS_PCH_LPT(dev_priv->dev)) {
-               DRM_DEBUG_DRIVER("LPT detected: skipping PCH PLL test\n");
-               return;
-       }
-
        if (WARN (!pll,
                  "asserting DPLL %s with no DPLL\n", state_string(state)))
                return;
@@ -1481,9 +1517,6 @@ static void intel_reset_dpio(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
 
-       if (!IS_VALLEYVIEW(dev))
-               return;
-
        if (IS_CHERRYVIEW(dev)) {
                enum dpio_phy phy;
                u32 val;
@@ -1505,26 +1538,6 @@ static void intel_reset_dpio(struct drm_device *dev)
                        I915_WRITE(DISPLAY_PHY_CONTROL,
                                PHY_COM_LANE_RESET_DEASSERT(phy, val));
                }
-
-       } else {
-               /*
-                * If DPIO has already been reset, e.g. by BIOS, just skip all
-                * this.
-                */
-               if (I915_READ(DPIO_CTL) & DPIO_CMNRST)
-                       return;
-
-               /*
-                * From VLV2A0_DP_eDP_HDMI_DPIO_driver_vbios_notes_11.docx:
-                * Need to assert and de-assert PHY SB reset by gating the
-                * common lane power, then un-gating it.
-                * Simply ungating isn't enough to reset the PHY enough to get
-                * ports and lanes running.
-                */
-               __vlv_set_power_well(dev_priv, PUNIT_POWER_WELL_DPIO_CMN_BC,
-                                    false);
-               __vlv_set_power_well(dev_priv, PUNIT_POWER_WELL_DPIO_CMN_BC,
-                                    true);
        }
 }
 
@@ -1712,6 +1725,17 @@ static void chv_disable_pll(struct drm_i915_private *dev_priv, enum pipe pipe)
        val &= ~DPIO_DCLKP_EN;
        vlv_dpio_write(dev_priv, pipe, CHV_CMN_DW14(port), val);
 
+       /* disable left/right clock distribution */
+       if (pipe != PIPE_B) {
+               val = vlv_dpio_read(dev_priv, pipe, _CHV_CMN_DW5_CH0);
+               val &= ~(CHV_BUFLEFTENA1_MASK | CHV_BUFRIGHTENA1_MASK);
+               vlv_dpio_write(dev_priv, pipe, _CHV_CMN_DW5_CH0, val);
+       } else {
+               val = vlv_dpio_read(dev_priv, pipe, _CHV_CMN_DW1_CH1);
+               val &= ~(CHV_BUFLEFTENA2_MASK | CHV_BUFRIGHTENA2_MASK);
+               vlv_dpio_write(dev_priv, pipe, _CHV_CMN_DW1_CH1, val);
+       }
+
        mutex_unlock(&dev_priv->dpio_lock);
 }
 
@@ -1749,6 +1773,9 @@ static void intel_prepare_shared_dpll(struct intel_crtc *crtc)
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_shared_dpll *pll = intel_crtc_to_shared_dpll(crtc);
 
+       if (WARN_ON(pll == NULL))
+               return;
+
        WARN_ON(!pll->refcount);
        if (pll->active == 0) {
                DRM_DEBUG_DRIVER("setting up %s\n", pll->name);
@@ -1790,12 +1817,14 @@ static void intel_enable_shared_dpll(struct intel_crtc *crtc)
        }
        WARN_ON(pll->on);
 
+       intel_display_power_get(dev_priv, POWER_DOMAIN_PLLS);
+
        DRM_DEBUG_KMS("enabling %s\n", pll->name);
        pll->enable(dev_priv, pll);
        pll->on = true;
 }
 
-static void intel_disable_shared_dpll(struct intel_crtc *crtc)
+void intel_disable_shared_dpll(struct intel_crtc *crtc)
 {
        struct drm_device *dev = crtc->base.dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
@@ -1826,6 +1855,8 @@ static void intel_disable_shared_dpll(struct intel_crtc *crtc)
        DRM_DEBUG_KMS("disabling %s\n", pll->name);
        pll->disable(dev_priv, pll);
        pll->on = false;
+
+       intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
 }
 
 static void ironlake_enable_pch_transcoder(struct drm_i915_private *dev_priv,
@@ -2172,6 +2203,8 @@ intel_pin_and_fence_fb_obj(struct drm_device *dev,
        u32 alignment;
        int ret;
 
+       WARN_ON(!mutex_is_locked(&dev->struct_mutex));
+
        switch (obj->tiling_mode) {
        case I915_TILING_NONE:
                if (IS_BROADWATER(dev) || IS_CRESTLINE(dev))
@@ -2228,6 +2261,8 @@ err_interruptible:
 
 void intel_unpin_fb_obj(struct drm_i915_gem_object *obj)
 {
+       WARN_ON(!mutex_is_locked(&obj->base.dev->struct_mutex));
+
        i915_gem_object_unpin_fence(obj);
        i915_gem_object_unpin_from_display_plane(obj);
 }
@@ -2314,6 +2349,7 @@ static bool intel_alloc_plane_obj(struct intel_crtc *crtc,
                goto out_unref_obj;
        }
 
+       obj->frontbuffer_bits = INTEL_FRONTBUFFER_PRIMARY(crtc->pipe);
        mutex_unlock(&dev->struct_mutex);
 
        DRM_DEBUG_KMS("plane fb obj %p\n", obj);
@@ -2331,7 +2367,7 @@ static void intel_find_plane_obj(struct intel_crtc *intel_crtc,
        struct drm_device *dev = intel_crtc->base.dev;
        struct drm_crtc *c;
        struct intel_crtc *i;
-       struct intel_framebuffer *fb;
+       struct drm_i915_gem_object *obj;
 
        if (!intel_crtc->base.primary->fb)
                return;
@@ -2352,13 +2388,17 @@ static void intel_find_plane_obj(struct intel_crtc *intel_crtc,
                if (c == &intel_crtc->base)
                        continue;
 
-               if (!i->active || !c->primary->fb)
+               if (!i->active)
                        continue;
 
-               fb = to_intel_framebuffer(c->primary->fb);
-               if (i915_gem_obj_ggtt_offset(fb->obj) == plane_config->base) {
+               obj = intel_fb_obj(c->primary->fb);
+               if (obj == NULL)
+                       continue;
+
+               if (i915_gem_obj_ggtt_offset(obj) == plane_config->base) {
                        drm_framebuffer_reference(c->primary->fb);
                        intel_crtc->base.primary->fb = c->primary->fb;
+                       obj->frontbuffer_bits |= INTEL_FRONTBUFFER_PRIMARY(intel_crtc->pipe);
                        break;
                }
        }
@@ -2371,16 +2411,12 @@ static void i9xx_update_primary_plane(struct drm_crtc *crtc,
        struct drm_device *dev = crtc->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
-       struct intel_framebuffer *intel_fb;
-       struct drm_i915_gem_object *obj;
+       struct drm_i915_gem_object *obj = intel_fb_obj(fb);
        int plane = intel_crtc->plane;
        unsigned long linear_offset;
        u32 dspcntr;
        u32 reg;
 
-       intel_fb = to_intel_framebuffer(fb);
-       obj = intel_fb->obj;
-
        reg = DSPCNTR(plane);
        dspcntr = I915_READ(reg);
        /* Mask out pixel format bits in case we change it */
@@ -2461,16 +2497,12 @@ static void ironlake_update_primary_plane(struct drm_crtc *crtc,
        struct drm_device *dev = crtc->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
-       struct intel_framebuffer *intel_fb;
-       struct drm_i915_gem_object *obj;
+       struct drm_i915_gem_object *obj = intel_fb_obj(fb);
        int plane = intel_crtc->plane;
        unsigned long linear_offset;
        u32 dspcntr;
        u32 reg;
 
-       intel_fb = to_intel_framebuffer(fb);
-       obj = intel_fb->obj;
-
        reg = DSPCNTR(plane);
        dspcntr = I915_READ(reg);
        /* Mask out pixel format bits in case we change it */
@@ -2546,7 +2578,7 @@ intel_pipe_set_base_atomic(struct drm_crtc *crtc, struct drm_framebuffer *fb,
 
        if (dev_priv->display.disable_fbc)
                dev_priv->display.disable_fbc(dev);
-       intel_increase_pllclock(crtc);
+       intel_increase_pllclock(dev, to_intel_crtc(crtc)->pipe);
 
        dev_priv->display.update_primary_plane(crtc, fb, x, y);
 
@@ -2601,7 +2633,7 @@ void intel_display_handle_reset(struct drm_device *dev)
 static int
 intel_finish_fb(struct drm_framebuffer *old_fb)
 {
-       struct drm_i915_gem_object *obj = to_intel_framebuffer(old_fb)->obj;
+       struct drm_i915_gem_object *obj = intel_fb_obj(old_fb);
        struct drm_i915_private *dev_priv = obj->base.dev->dev_private;
        bool was_interruptible = dev_priv->mm.interruptible;
        int ret;
@@ -2647,7 +2679,10 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y,
        struct drm_device *dev = crtc->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
-       struct drm_framebuffer *old_fb;
+       enum pipe pipe = intel_crtc->pipe;
+       struct drm_framebuffer *old_fb = crtc->primary->fb;
+       struct drm_i915_gem_object *obj = intel_fb_obj(fb);
+       struct drm_i915_gem_object *old_obj = intel_fb_obj(old_fb);
        int ret;
 
        if (intel_crtc_has_pending_flip(crtc)) {
@@ -2669,9 +2704,10 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y,
        }
 
        mutex_lock(&dev->struct_mutex);
-       ret = intel_pin_and_fence_fb_obj(dev,
-                                        to_intel_framebuffer(fb)->obj,
-                                        NULL);
+       ret = intel_pin_and_fence_fb_obj(dev, obj, NULL);
+       if (ret == 0)
+               i915_gem_track_fb(old_obj, obj,
+                                 INTEL_FRONTBUFFER_PRIMARY(pipe));
        mutex_unlock(&dev->struct_mutex);
        if (ret != 0) {
                DRM_ERROR("pin & fence failed\n");
@@ -2711,7 +2747,9 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y,
 
        dev_priv->display.update_primary_plane(crtc, fb, x, y);
 
-       old_fb = crtc->primary->fb;
+       if (intel_crtc->active)
+               intel_frontbuffer_flip(dev, INTEL_FRONTBUFFER_PRIMARY(pipe));
+
        crtc->primary->fb = fb;
        crtc->x = x;
        crtc->y = y;
@@ -2720,13 +2758,12 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y,
                if (intel_crtc->active && old_fb != fb)
                        intel_wait_for_vblank(dev, intel_crtc->pipe);
                mutex_lock(&dev->struct_mutex);
-               intel_unpin_fb_obj(to_intel_framebuffer(old_fb)->obj);
+               intel_unpin_fb_obj(old_obj);
                mutex_unlock(&dev->struct_mutex);
        }
 
        mutex_lock(&dev->struct_mutex);
        intel_update_fbc(dev);
-       intel_edp_psr_update(dev);
        mutex_unlock(&dev->struct_mutex);
 
        return 0;
@@ -3587,7 +3624,7 @@ static void lpt_pch_enable(struct drm_crtc *crtc)
        lpt_enable_pch_transcoder(dev_priv, cpu_transcoder);
 }
 
-static void intel_put_shared_dpll(struct intel_crtc *crtc)
+void intel_put_shared_dpll(struct intel_crtc *crtc)
 {
        struct intel_shared_dpll *pll = intel_crtc_to_shared_dpll(crtc);
 
@@ -3607,7 +3644,7 @@ static void intel_put_shared_dpll(struct intel_crtc *crtc)
        crtc->config.shared_dpll = DPLL_ID_PRIVATE;
 }
 
-static struct intel_shared_dpll *intel_get_shared_dpll(struct intel_crtc *crtc)
+struct intel_shared_dpll *intel_get_shared_dpll(struct intel_crtc *crtc)
 {
        struct drm_i915_private *dev_priv = crtc->base.dev->dev_private;
        struct intel_shared_dpll *pll = intel_crtc_to_shared_dpll(crtc);
@@ -3818,7 +3855,7 @@ static void intel_crtc_load_lut(struct drm_crtc *crtc)
        }
 
        /* use legacy palette for Ironlake */
-       if (HAS_PCH_SPLIT(dev))
+       if (!HAS_GMCH_DISPLAY(dev))
                palreg = LGC_PALETTE(pipe);
 
        /* Workaround : Do not read or write the pipe palette/gamma data while
@@ -3860,30 +3897,6 @@ static void intel_crtc_dpms_overlay(struct intel_crtc *intel_crtc, bool enable)
         */
 }
 
-/**
- * i9xx_fixup_plane - ugly workaround for G45 to fire up the hardware
- * cursor plane briefly if not already running after enabling the display
- * plane.
- * This workaround avoids occasional blank screens when self refresh is
- * enabled.
- */
-static void
-g4x_fixup_plane(struct drm_i915_private *dev_priv, enum pipe pipe)
-{
-       u32 cntl = I915_READ(CURCNTR(pipe));
-
-       if ((cntl & CURSOR_MODE) == 0) {
-               u32 fw_bcl_self = I915_READ(FW_BLC_SELF);
-
-               I915_WRITE(FW_BLC_SELF, fw_bcl_self & ~FW_BLC_SELF_EN);
-               I915_WRITE(CURCNTR(pipe), CURSOR_MODE_64_ARGB_AX);
-               intel_wait_for_vblank(dev_priv->dev, pipe);
-               I915_WRITE(CURCNTR(pipe), cntl);
-               I915_WRITE(CURBASE(pipe), I915_READ(CURBASE(pipe)));
-               I915_WRITE(FW_BLC_SELF, fw_bcl_self);
-       }
-}
-
 static void intel_crtc_enable_planes(struct drm_crtc *crtc)
 {
        struct drm_device *dev = crtc->dev;
@@ -3892,11 +3905,10 @@ static void intel_crtc_enable_planes(struct drm_crtc *crtc)
        int pipe = intel_crtc->pipe;
        int plane = intel_crtc->plane;
 
+       drm_vblank_on(dev, pipe);
+
        intel_enable_primary_hw_plane(dev_priv, plane, pipe);
        intel_enable_planes(crtc);
-       /* The fixup needs to happen before cursor is enabled */
-       if (IS_G4X(dev))
-               g4x_fixup_plane(dev_priv, pipe);
        intel_crtc_update_cursor(crtc, true);
        intel_crtc_dpms_overlay(intel_crtc, true);
 
@@ -3904,8 +3916,14 @@ static void intel_crtc_enable_planes(struct drm_crtc *crtc)
 
        mutex_lock(&dev->struct_mutex);
        intel_update_fbc(dev);
-       intel_edp_psr_update(dev);
        mutex_unlock(&dev->struct_mutex);
+
+       /*
+        * FIXME: Once we grow proper nuclear flip support out of this we need
+        * to compute the mask of flip planes precisely. For the time being
+        * consider this a flip from a NULL plane.
+        */
+       intel_frontbuffer_flip(dev, INTEL_FRONTBUFFER_ALL_MASK(pipe));
 }
 
 static void intel_crtc_disable_planes(struct drm_crtc *crtc)
@@ -3917,7 +3935,6 @@ static void intel_crtc_disable_planes(struct drm_crtc *crtc)
        int plane = intel_crtc->plane;
 
        intel_crtc_wait_for_pending_flips(crtc);
-       drm_crtc_vblank_off(crtc);
 
        if (dev_priv->fbc.plane == plane)
                intel_disable_fbc(dev);
@@ -3928,6 +3945,15 @@ static void intel_crtc_disable_planes(struct drm_crtc *crtc)
        intel_crtc_update_cursor(crtc, false);
        intel_disable_planes(crtc);
        intel_disable_primary_hw_plane(dev_priv, plane, pipe);
+
+       /*
+        * FIXME: Once we grow proper nuclear flip support out of this we need
+        * to compute the mask of flip planes precisely. For the time being
+        * consider this a flip to a NULL plane.
+        */
+       intel_frontbuffer_flip(dev, INTEL_FRONTBUFFER_ALL_MASK(pipe));
+
+       drm_vblank_off(dev, pipe);
 }
 
 static void ironlake_crtc_enable(struct drm_crtc *crtc)
@@ -4006,8 +4032,6 @@ static void ironlake_crtc_enable(struct drm_crtc *crtc)
                cpt_verify_modeset(dev, intel_crtc->pipe);
 
        intel_crtc_enable_planes(crtc);
-
-       drm_crtc_vblank_on(crtc);
 }
 
 /* IPS only exists on ULT machines and is tied to pipe A. */
@@ -4059,6 +4083,9 @@ static void haswell_crtc_enable(struct drm_crtc *crtc)
        if (intel_crtc->active)
                return;
 
+       if (intel_crtc_to_shared_dpll(intel_crtc))
+               intel_enable_shared_dpll(intel_crtc);
+
        if (intel_crtc->config.has_dp_encoder)
                intel_dp_set_m_n(intel_crtc);
 
@@ -4083,16 +4110,15 @@ static void haswell_crtc_enable(struct drm_crtc *crtc)
        intel_crtc->active = true;
 
        intel_set_cpu_fifo_underrun_reporting(dev, pipe, true);
-       if (intel_crtc->config.has_pch_encoder)
-               intel_set_pch_fifo_underrun_reporting(dev, TRANSCODER_A, true);
-
-       if (intel_crtc->config.has_pch_encoder)
-               dev_priv->display.fdi_link_train(crtc);
-
        for_each_encoder_on_crtc(dev, crtc, encoder)
                if (encoder->pre_enable)
                        encoder->pre_enable(encoder);
 
+       if (intel_crtc->config.has_pch_encoder) {
+               intel_set_pch_fifo_underrun_reporting(dev, TRANSCODER_A, true);
+               dev_priv->display.fdi_link_train(crtc);
+       }
+
        intel_ddi_enable_pipe_clock(intel_crtc);
 
        ironlake_pfit_enable(intel_crtc);
@@ -4112,6 +4138,9 @@ static void haswell_crtc_enable(struct drm_crtc *crtc)
        if (intel_crtc->config.has_pch_encoder)
                lpt_pch_enable(crtc);
 
+       if (intel_crtc->config.dp_encoder_is_mst)
+               intel_ddi_set_vc_payload_alloc(crtc, true);
+
        for_each_encoder_on_crtc(dev, crtc, encoder) {
                encoder->enable(encoder);
                intel_opregion_notify_encoder(encoder, true);
@@ -4121,8 +4150,6 @@ static void haswell_crtc_enable(struct drm_crtc *crtc)
         * to change the workaround. */
        haswell_mode_set_planes_workaround(intel_crtc);
        intel_crtc_enable_planes(crtc);
-
-       drm_crtc_vblank_on(crtc);
 }
 
 static void ironlake_pfit_disable(struct intel_crtc *crtc)
@@ -4162,6 +4189,9 @@ static void ironlake_crtc_disable(struct drm_crtc *crtc)
 
        intel_disable_pipe(dev_priv, pipe);
 
+       if (intel_crtc->config.dp_encoder_is_mst)
+               intel_ddi_set_vc_payload_alloc(crtc, false);
+
        ironlake_pfit_disable(intel_crtc);
 
        for_each_encoder_on_crtc(dev, crtc, encoder)
@@ -4200,7 +4230,6 @@ static void ironlake_crtc_disable(struct drm_crtc *crtc)
 
        mutex_lock(&dev->struct_mutex);
        intel_update_fbc(dev);
-       intel_edp_psr_update(dev);
        mutex_unlock(&dev->struct_mutex);
 }
 
@@ -4233,23 +4262,25 @@ static void haswell_crtc_disable(struct drm_crtc *crtc)
 
        intel_ddi_disable_pipe_clock(intel_crtc);
 
-       for_each_encoder_on_crtc(dev, crtc, encoder)
-               if (encoder->post_disable)
-                       encoder->post_disable(encoder);
-
        if (intel_crtc->config.has_pch_encoder) {
                lpt_disable_pch_transcoder(dev_priv);
                intel_set_pch_fifo_underrun_reporting(dev, TRANSCODER_A, true);
                intel_ddi_fdi_disable(crtc);
        }
 
+       for_each_encoder_on_crtc(dev, crtc, encoder)
+               if (encoder->post_disable)
+                       encoder->post_disable(encoder);
+
        intel_crtc->active = false;
        intel_update_watermarks(crtc);
 
        mutex_lock(&dev->struct_mutex);
        intel_update_fbc(dev);
-       intel_edp_psr_update(dev);
        mutex_unlock(&dev->struct_mutex);
+
+       if (intel_crtc_to_shared_dpll(intel_crtc))
+               intel_disable_shared_dpll(intel_crtc);
 }
 
 static void ironlake_crtc_off(struct drm_crtc *crtc)
@@ -4258,10 +4289,6 @@ static void ironlake_crtc_off(struct drm_crtc *crtc)
        intel_put_shared_dpll(intel_crtc);
 }
 
-static void haswell_crtc_off(struct drm_crtc *crtc)
-{
-       intel_ddi_put_crtc_pll(crtc);
-}
 
 static void i9xx_pfit_enable(struct intel_crtc *crtc)
 {
@@ -4287,6 +4314,23 @@ static void i9xx_pfit_enable(struct intel_crtc *crtc)
        I915_WRITE(BCLRPAT(crtc->pipe), 0);
 }
 
+static enum intel_display_power_domain port_to_power_domain(enum port port)
+{
+       switch (port) {
+       case PORT_A:
+               return POWER_DOMAIN_PORT_DDI_A_4_LANES;
+       case PORT_B:
+               return POWER_DOMAIN_PORT_DDI_B_4_LANES;
+       case PORT_C:
+               return POWER_DOMAIN_PORT_DDI_C_4_LANES;
+       case PORT_D:
+               return POWER_DOMAIN_PORT_DDI_D_4_LANES;
+       default:
+               WARN_ON_ONCE(1);
+               return POWER_DOMAIN_PORT_OTHER;
+       }
+}
+
 #define for_each_power_domain(domain, mask)                            \
        for ((domain) = 0; (domain) < POWER_DOMAIN_NUM; (domain)++)     \
                if ((1 << (domain)) & (mask))
@@ -4305,19 +4349,10 @@ intel_display_port_power_domain(struct intel_encoder *intel_encoder)
        case INTEL_OUTPUT_HDMI:
        case INTEL_OUTPUT_EDP:
                intel_dig_port = enc_to_dig_port(&intel_encoder->base);
-               switch (intel_dig_port->port) {
-               case PORT_A:
-                       return POWER_DOMAIN_PORT_DDI_A_4_LANES;
-               case PORT_B:
-                       return POWER_DOMAIN_PORT_DDI_B_4_LANES;
-               case PORT_C:
-                       return POWER_DOMAIN_PORT_DDI_C_4_LANES;
-               case PORT_D:
-                       return POWER_DOMAIN_PORT_DDI_D_4_LANES;
-               default:
-                       WARN_ON_ONCE(1);
-                       return POWER_DOMAIN_PORT_OTHER;
-               }
+               return port_to_power_domain(intel_dig_port->port);
+       case INTEL_OUTPUT_DP_MST:
+               intel_dig_port = enc_to_mst(&intel_encoder->base)->primary;
+               return port_to_power_domain(intel_dig_port->port);
        case INTEL_OUTPUT_ANALOG:
                return POWER_DOMAIN_PORT_CRT;
        case INTEL_OUTPUT_DSI:
@@ -4333,7 +4368,6 @@ static unsigned long get_crtc_power_domains(struct drm_crtc *crtc)
        struct intel_encoder *intel_encoder;
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        enum pipe pipe = intel_crtc->pipe;
-       bool pfit_enabled = intel_crtc->config.pch_pfit.enabled;
        unsigned long mask;
        enum transcoder transcoder;
 
@@ -4341,7 +4375,8 @@ static unsigned long get_crtc_power_domains(struct drm_crtc *crtc)
 
        mask = BIT(POWER_DOMAIN_PIPE(pipe));
        mask |= BIT(POWER_DOMAIN_TRANSCODER(transcoder));
-       if (pfit_enabled)
+       if (intel_crtc->config.pch_pfit.enabled ||
+           intel_crtc->config.pch_pfit.force_thru)
                mask |= BIT(POWER_DOMAIN_PIPE_PANEL_FITTER(pipe));
 
        for_each_encoder_on_crtc(dev, crtc, intel_encoder)
@@ -4398,7 +4433,8 @@ static void modeset_update_crtc_power_domains(struct drm_device *dev)
        intel_display_set_init_power(dev_priv, false);
 }
 
-int valleyview_get_vco(struct drm_i915_private *dev_priv)
+/* returns HPLL frequency in kHz */
+static int valleyview_get_vco(struct drm_i915_private *dev_priv)
 {
        int hpll_freq, vco_freq[] = { 800, 1600, 2000, 2400 };
 
@@ -4408,7 +4444,23 @@ int valleyview_get_vco(struct drm_i915_private *dev_priv)
                CCK_FUSE_HPLL_FREQ_MASK;
        mutex_unlock(&dev_priv->dpio_lock);
 
-       return vco_freq[hpll_freq];
+       return vco_freq[hpll_freq] * 1000;
+}
+
+static void vlv_update_cdclk(struct drm_device *dev)
+{
+       struct drm_i915_private *dev_priv = dev->dev_private;
+
+       dev_priv->vlv_cdclk_freq = dev_priv->display.get_display_clock_speed(dev);
+       DRM_DEBUG_DRIVER("Current CD clock rate: %d kHz",
+                        dev_priv->vlv_cdclk_freq);
+
+       /*
+        * Program the gmbus_freq based on the cdclk frequency.
+        * BSpec erroneously claims we should aim for 4MHz, but
+        * in fact 1MHz is the correct frequency.
+        */
+       I915_WRITE(GMBUSFREQ_VLV, dev_priv->vlv_cdclk_freq);
 }
 
 /* Adjust CDclk dividers to allow high res or save power if possible */
@@ -4417,12 +4469,11 @@ static void valleyview_set_cdclk(struct drm_device *dev, int cdclk)
        struct drm_i915_private *dev_priv = dev->dev_private;
        u32 val, cmd;
 
-       WARN_ON(valleyview_cur_cdclk(dev_priv) != dev_priv->vlv_cdclk_freq);
-       dev_priv->vlv_cdclk_freq = cdclk;
+       WARN_ON(dev_priv->display.get_display_clock_speed(dev) != dev_priv->vlv_cdclk_freq);
 
-       if (cdclk >= 320) /* jump to highest voltage for 400MHz too */
+       if (cdclk >= 320000) /* jump to highest voltage for 400MHz too */
                cmd = 2;
-       else if (cdclk == 266)
+       else if (cdclk == 266667)
                cmd = 1;
        else
                cmd = 0;
@@ -4439,18 +4490,23 @@ static void valleyview_set_cdclk(struct drm_device *dev, int cdclk)
        }
        mutex_unlock(&dev_priv->rps.hw_lock);
 
-       if (cdclk == 400) {
+       if (cdclk == 400000) {
                u32 divider, vco;
 
                vco = valleyview_get_vco(dev_priv);
-               divider = ((vco << 1) / cdclk) - 1;
+               divider = DIV_ROUND_CLOSEST(vco << 1, cdclk) - 1;
 
                mutex_lock(&dev_priv->dpio_lock);
                /* adjust cdclk divider */
                val = vlv_cck_read(dev_priv, CCK_DISPLAY_CLOCK_CONTROL);
-               val &= ~0xf;
+               val &= ~DISPLAY_FREQUENCY_VALUES;
                val |= divider;
                vlv_cck_write(dev_priv, CCK_DISPLAY_CLOCK_CONTROL, val);
+
+               if (wait_for((vlv_cck_read(dev_priv, CCK_DISPLAY_CLOCK_CONTROL) &
+                             DISPLAY_FREQUENCY_STATUS) == (divider << DISPLAY_FREQUENCY_STATUS_SHIFT),
+                            50))
+                       DRM_ERROR("timed out waiting for CDclk change\n");
                mutex_unlock(&dev_priv->dpio_lock);
        }
 
@@ -4463,54 +4519,43 @@ static void valleyview_set_cdclk(struct drm_device *dev, int cdclk)
         * For high bandwidth configs, we set a higher latency in the bunit
         * so that the core display fetch happens in time to avoid underruns.
         */
-       if (cdclk == 400)
+       if (cdclk == 400000)
                val |= 4500 / 250; /* 4.5 usec */
        else
                val |= 3000 / 250; /* 3.0 usec */
        vlv_bunit_write(dev_priv, BUNIT_REG_BISOC, val);
        mutex_unlock(&dev_priv->dpio_lock);
 
-       /* Since we changed the CDclk, we need to update the GMBUSFREQ too */
-       intel_i2c_reset(dev);
-}
-
-int valleyview_cur_cdclk(struct drm_i915_private *dev_priv)
-{
-       int cur_cdclk, vco;
-       int divider;
-
-       vco = valleyview_get_vco(dev_priv);
-
-       mutex_lock(&dev_priv->dpio_lock);
-       divider = vlv_cck_read(dev_priv, CCK_DISPLAY_CLOCK_CONTROL);
-       mutex_unlock(&dev_priv->dpio_lock);
-
-       divider &= 0xf;
-
-       cur_cdclk = (vco << 1) / (divider + 1);
-
-       return cur_cdclk;
+       vlv_update_cdclk(dev);
 }
 
 static int valleyview_calc_cdclk(struct drm_i915_private *dev_priv,
                                 int max_pixclk)
 {
+       int vco = valleyview_get_vco(dev_priv);
+       int freq_320 = (vco <<  1) % 320000 != 0 ? 333333 : 320000;
+
        /*
         * Really only a few cases to deal with, as only 4 CDclks are supported:
         *   200MHz
         *   267MHz
-        *   320MHz
+        *   320/333MHz (depends on HPLL freq)
         *   400MHz
         * So we check to see whether we're above 90% of the lower bin and
         * adjust if needed.
+        *
+        * We seem to get an unstable or solid color picture at 200MHz.
+        * Not sure what's wrong. For now use 200MHz only when all pipes
+        * are off.
         */
-       if (max_pixclk > 288000) {
-               return 400;
-       } else if (max_pixclk > 240000) {
-               return 320;
-       } else
-               return 266;
-       /* Looks like the 200MHz CDclk freq doesn't work on some configs */
+       if (max_pixclk > freq_320*9/10)
+               return 400000;
+       else if (max_pixclk > 266667*9/10)
+               return freq_320;
+       else if (max_pixclk > 0)
+               return 266667;
+       else
+               return 200000;
 }
 
 /* compute the max pixel clock for new configuration */
@@ -4633,8 +4678,6 @@ static void valleyview_crtc_enable(struct drm_crtc *crtc)
 
        intel_crtc_enable_planes(crtc);
 
-       drm_crtc_vblank_on(crtc);
-
        /* Underruns don't raise interrupts, so check manually. */
        i9xx_check_fifo_underruns(dev);
 }
@@ -4727,8 +4770,6 @@ static void i9xx_crtc_enable(struct drm_crtc *crtc)
        if (IS_GEN2(dev))
                intel_set_cpu_fifo_underrun_reporting(dev, pipe, true);
 
-       drm_crtc_vblank_on(crtc);
-
        /* Underruns don't raise interrupts, so check manually. */
        i9xx_check_fifo_underruns(dev);
 }
@@ -4768,6 +4809,16 @@ static void i9xx_crtc_disable(struct drm_crtc *crtc)
        if (IS_GEN2(dev))
                intel_set_cpu_fifo_underrun_reporting(dev, pipe, false);
 
+       /*
+        * Vblank time updates from the shadow to live plane control register
+        * are blocked if the memory self-refresh mode is active at that
+        * moment. So to make sure the plane gets truly disabled, disable
+        * first the self-refresh mode. The self-refresh enable bit in turn
+        * will be checked/applied by the HW only at the next frame start
+        * event which is after the vblank start event, so we need to have a
+        * wait-for-vblank between disabling the plane and the pipe.
+        */
+       intel_set_memory_cxsr(dev_priv, false);
        intel_crtc_disable_planes(crtc);
 
        for_each_encoder_on_crtc(dev, crtc, encoder)
@@ -4776,9 +4827,10 @@ static void i9xx_crtc_disable(struct drm_crtc *crtc)
        /*
         * On gen2 planes are double buffered but the pipe isn't, so we must
         * wait for planes to fully turn off before disabling the pipe.
+        * We also need to wait on all gmch platforms because of the
+        * self-refresh mode constraint explained above.
         */
-       if (IS_GEN2(dev))
-               intel_wait_for_vblank(dev, pipe);
+       intel_wait_for_vblank(dev, pipe);
 
        intel_disable_pipe(dev_priv, pipe);
 
@@ -4805,7 +4857,6 @@ static void i9xx_crtc_disable(struct drm_crtc *crtc)
 
        mutex_lock(&dev->struct_mutex);
        intel_update_fbc(dev);
-       intel_edp_psr_update(dev);
        mutex_unlock(&dev->struct_mutex);
 }
 
@@ -4843,23 +4894,49 @@ static void intel_crtc_update_sarea(struct drm_crtc *crtc,
        }
 }
 
+/* Master function to enable/disable CRTC and corresponding power wells */
+void intel_crtc_control(struct drm_crtc *crtc, bool enable)
+{
+       struct drm_device *dev = crtc->dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
+       enum intel_display_power_domain domain;
+       unsigned long domains;
+
+       if (enable) {
+               if (!intel_crtc->active) {
+                       domains = get_crtc_power_domains(crtc);
+                       for_each_power_domain(domain, domains)
+                               intel_display_power_get(dev_priv, domain);
+                       intel_crtc->enabled_power_domains = domains;
+
+                       dev_priv->display.crtc_enable(crtc);
+               }
+       } else {
+               if (intel_crtc->active) {
+                       dev_priv->display.crtc_disable(crtc);
+
+                       domains = intel_crtc->enabled_power_domains;
+                       for_each_power_domain(domain, domains)
+                               intel_display_power_put(dev_priv, domain);
+                       intel_crtc->enabled_power_domains = 0;
+               }
+       }
+}
+
 /**
  * Sets the power management mode of the pipe and plane.
  */
 void intel_crtc_update_dpms(struct drm_crtc *crtc)
 {
        struct drm_device *dev = crtc->dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_encoder *intel_encoder;
        bool enable = false;
 
        for_each_encoder_on_crtc(dev, crtc, intel_encoder)
                enable |= intel_encoder->connectors_active;
 
-       if (enable)
-               dev_priv->display.crtc_enable(crtc);
-       else
-               dev_priv->display.crtc_disable(crtc);
+       intel_crtc_control(crtc, enable);
 
        intel_crtc_update_sarea(crtc, enable);
 }
@@ -4869,6 +4946,8 @@ static void intel_crtc_disable(struct drm_crtc *crtc)
        struct drm_device *dev = crtc->dev;
        struct drm_connector *connector;
        struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_i915_gem_object *old_obj = intel_fb_obj(crtc->primary->fb);
+       enum pipe pipe = to_intel_crtc(crtc)->pipe;
 
        /* crtc should still be enabled when we disable it. */
        WARN_ON(!crtc->enabled);
@@ -4877,13 +4956,11 @@ static void intel_crtc_disable(struct drm_crtc *crtc)
        intel_crtc_update_sarea(crtc, false);
        dev_priv->display.off(crtc);
 
-       assert_plane_disabled(dev->dev_private, to_intel_crtc(crtc)->plane);
-       assert_cursor_disabled(dev_priv, to_intel_crtc(crtc)->pipe);
-       assert_pipe_disabled(dev->dev_private, to_intel_crtc(crtc)->pipe);
-
        if (crtc->primary->fb) {
                mutex_lock(&dev->struct_mutex);
-               intel_unpin_fb_obj(to_intel_framebuffer(crtc->primary->fb)->obj);
+               intel_unpin_fb_obj(old_obj);
+               i915_gem_track_fb(old_obj, NULL,
+                                 INTEL_FRONTBUFFER_PRIMARY(pipe));
                mutex_unlock(&dev->struct_mutex);
                crtc->primary->fb = NULL;
        }
@@ -4939,24 +5016,31 @@ static void intel_connector_check_state(struct intel_connector *connector)
                              connector->base.base.id,
                              connector->base.name);
 
+               /* there is no real hw state for MST connectors */
+               if (connector->mst_port)
+                       return;
+
                WARN(connector->base.dpms == DRM_MODE_DPMS_OFF,
                     "wrong connector dpms state\n");
                WARN(connector->base.encoder != &encoder->base,
                     "active connector not linked to encoder\n");
-               WARN(!encoder->connectors_active,
-                    "encoder->connectors_active not set\n");
 
-               encoder_enabled = encoder->get_hw_state(encoder, &pipe);
-               WARN(!encoder_enabled, "encoder not enabled\n");
-               if (WARN_ON(!encoder->base.crtc))
-                       return;
+               if (encoder) {
+                       WARN(!encoder->connectors_active,
+                            "encoder->connectors_active not set\n");
+
+                       encoder_enabled = encoder->get_hw_state(encoder, &pipe);
+                       WARN(!encoder_enabled, "encoder not enabled\n");
+                       if (WARN_ON(!encoder->base.crtc))
+                               return;
 
-               crtc = encoder->base.crtc;
+                       crtc = encoder->base.crtc;
 
-               WARN(!crtc->enabled, "crtc not enabled\n");
-               WARN(!to_intel_crtc(crtc)->active, "crtc not active\n");
-               WARN(pipe != to_intel_crtc(crtc)->pipe,
-                    "encoder active on the wrong pipe\n");
+                       WARN(!crtc->enabled, "crtc not enabled\n");
+                       WARN(!to_intel_crtc(crtc)->active, "crtc not active\n");
+                       WARN(pipe != to_intel_crtc(crtc)->pipe,
+                            "encoder active on the wrong pipe\n");
+               }
        }
 }
 
@@ -5161,9 +5245,11 @@ static int intel_crtc_compute_config(struct intel_crtc *crtc,
        if (HAS_IPS(dev))
                hsw_compute_ips_config(crtc, pipe_config);
 
-       /* XXX: PCH clock sharing is done in ->mode_set, so make sure the old
-        * clock survives for now. */
-       if (HAS_PCH_IBX(dev) || HAS_PCH_CPT(dev))
+       /*
+        * XXX: PCH/WRPLL clock sharing is done in ->mode_set, so make sure the
+        * old clock survives for now.
+        */
+       if (HAS_PCH_IBX(dev) || HAS_PCH_CPT(dev) || HAS_DDI(dev))
                pipe_config->shared_dpll = crtc->config.shared_dpll;
 
        if (pipe_config->has_pch_encoder)
@@ -5174,7 +5260,22 @@ static int intel_crtc_compute_config(struct intel_crtc *crtc,
 
 static int valleyview_get_display_clock_speed(struct drm_device *dev)
 {
-       return 400000; /* FIXME */
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       int vco = valleyview_get_vco(dev_priv);
+       u32 val;
+       int divider;
+
+       mutex_lock(&dev_priv->dpio_lock);
+       val = vlv_cck_read(dev_priv, CCK_DISPLAY_CLOCK_CONTROL);
+       mutex_unlock(&dev_priv->dpio_lock);
+
+       divider = val & DISPLAY_FREQUENCY_VALUES;
+
+       WARN((val & DISPLAY_FREQUENCY_STATUS) !=
+            (divider << DISPLAY_FREQUENCY_STATUS_SHIFT),
+            "cdclk change in progress\n");
+
+       return DIV_ROUND_CLOSEST(vco << 1, divider + 1);
 }
 
 static int i945_get_display_clock_speed(struct drm_device *dev)
@@ -6060,6 +6161,10 @@ static void vlv_crtc_clock_get(struct intel_crtc *crtc,
        u32 mdiv;
        int refclk = 100000;
 
+       /* In case of MIPI DPLL will not even be used */
+       if (!(pipe_config->dpll_hw_state.dpll & DPLL_VCO_ENABLE))
+               return;
+
        mutex_lock(&dev_priv->dpio_lock);
        mdiv = vlv_dpio_read(dev_priv, pipe, VLV_PLL_DW3(pipe));
        mutex_unlock(&dev_priv->dpio_lock);
@@ -6125,8 +6230,8 @@ static void i9xx_get_plane_config(struct intel_crtc *crtc,
        aligned_height = intel_align_height(dev, crtc->base.primary->fb->height,
                                            plane_config->tiled);
 
-       plane_config->size = ALIGN(crtc->base.primary->fb->pitches[0] *
-                                  aligned_height, PAGE_SIZE);
+       plane_config->size = PAGE_ALIGN(crtc->base.primary->fb->pitches[0] *
+                                       aligned_height);
 
        DRM_DEBUG_KMS("pipe/plane %d/%d with fb: size=%dx%d@%d, offset=%x, pitch %d, size 0x%x\n",
                      pipe, plane, crtc->base.primary->fb->width,
@@ -7145,8 +7250,8 @@ static void ironlake_get_plane_config(struct intel_crtc *crtc,
        aligned_height = intel_align_height(dev, crtc->base.primary->fb->height,
                                            plane_config->tiled);
 
-       plane_config->size = ALIGN(crtc->base.primary->fb->pitches[0] *
-                                  aligned_height, PAGE_SIZE);
+       plane_config->size = PAGE_ALIGN(crtc->base.primary->fb->pitches[0] *
+                                       aligned_height);
 
        DRM_DEBUG_KMS("pipe/plane %d/%d with fb: size=%dx%d@%d, offset=%x, pitch %d, size 0x%x\n",
                      pipe, plane, crtc->base.primary->fb->width,
@@ -7163,6 +7268,10 @@ static bool ironlake_get_pipe_config(struct intel_crtc *crtc,
        struct drm_i915_private *dev_priv = dev->dev_private;
        uint32_t tmp;
 
+       if (!intel_display_power_enabled(dev_priv,
+                                        POWER_DOMAIN_PIPE(crtc->pipe)))
+               return false;
+
        pipe_config->cpu_transcoder = (enum transcoder) crtc->pipe;
        pipe_config->shared_dpll = DPLL_ID_PRIVATE;
 
@@ -7237,7 +7346,6 @@ static bool ironlake_get_pipe_config(struct intel_crtc *crtc,
 static void assert_can_disable_lcpll(struct drm_i915_private *dev_priv)
 {
        struct drm_device *dev = dev_priv->dev;
-       struct intel_ddi_plls *plls = &dev_priv->ddi_plls;
        struct intel_crtc *crtc;
 
        for_each_intel_crtc(dev, crtc)
@@ -7245,14 +7353,15 @@ static void assert_can_disable_lcpll(struct drm_i915_private *dev_priv)
                     pipe_name(crtc->pipe));
 
        WARN(I915_READ(HSW_PWR_WELL_DRIVER), "Power well on\n");
-       WARN(plls->spll_refcount, "SPLL enabled\n");
-       WARN(plls->wrpll1_refcount, "WRPLL1 enabled\n");
-       WARN(plls->wrpll2_refcount, "WRPLL2 enabled\n");
+       WARN(I915_READ(SPLL_CTL) & SPLL_PLL_ENABLE, "SPLL enabled\n");
+       WARN(I915_READ(WRPLL_CTL1) & WRPLL_PLL_ENABLE, "WRPLL1 enabled\n");
+       WARN(I915_READ(WRPLL_CTL2) & WRPLL_PLL_ENABLE, "WRPLL2 enabled\n");
        WARN(I915_READ(PCH_PP_STATUS) & PP_ON, "Panel power on\n");
        WARN(I915_READ(BLC_PWM_CPU_CTL2) & BLM_PWM_ENABLE,
             "CPU PWM1 enabled\n");
-       WARN(I915_READ(HSW_BLC_PWM2_CTL) & BLM_PWM_ENABLE,
-            "CPU PWM2 enabled\n");
+       if (IS_HASWELL(dev))
+               WARN(I915_READ(HSW_BLC_PWM2_CTL) & BLM_PWM_ENABLE,
+                    "CPU PWM2 enabled\n");
        WARN(I915_READ(BLC_PWM_PCH_CTL1) & BLM_PCH_PWM_ENABLE,
             "PCH PWM1 enabled\n");
        WARN(I915_READ(UTIL_PIN_CTL) & UTIL_PIN_ENABLE,
@@ -7265,7 +7374,17 @@ static void assert_can_disable_lcpll(struct drm_i915_private *dev_priv)
         * gen-specific and since we only disable LCPLL after we fully disable
         * the interrupts, the check below should be enough.
         */
-       WARN(!dev_priv->pm.irqs_disabled, "IRQs enabled\n");
+       WARN(intel_irqs_enabled(dev_priv), "IRQs enabled\n");
+}
+
+static uint32_t hsw_read_dcomp(struct drm_i915_private *dev_priv)
+{
+       struct drm_device *dev = dev_priv->dev;
+
+       if (IS_HASWELL(dev))
+               return I915_READ(D_COMP_HSW);
+       else
+               return I915_READ(D_COMP_BDW);
 }
 
 static void hsw_write_dcomp(struct drm_i915_private *dev_priv, uint32_t val)
@@ -7276,12 +7395,12 @@ static void hsw_write_dcomp(struct drm_i915_private *dev_priv, uint32_t val)
                mutex_lock(&dev_priv->rps.hw_lock);
                if (sandybridge_pcode_write(dev_priv, GEN6_PCODE_WRITE_D_COMP,
                                            val))
-                       DRM_ERROR("Failed to disable D_COMP\n");
+                       DRM_ERROR("Failed to write to D_COMP\n");
                mutex_unlock(&dev_priv->rps.hw_lock);
        } else {
-               I915_WRITE(D_COMP, val);
+               I915_WRITE(D_COMP_BDW, val);
+               POSTING_READ(D_COMP_BDW);
        }
-       POSTING_READ(D_COMP);
 }
 
 /*
@@ -7319,12 +7438,13 @@ static void hsw_disable_lcpll(struct drm_i915_private *dev_priv,
        if (wait_for((I915_READ(LCPLL_CTL) & LCPLL_PLL_LOCK) == 0, 1))
                DRM_ERROR("LCPLL still locked\n");
 
-       val = I915_READ(D_COMP);
+       val = hsw_read_dcomp(dev_priv);
        val |= D_COMP_COMP_DISABLE;
        hsw_write_dcomp(dev_priv, val);
        ndelay(100);
 
-       if (wait_for((I915_READ(D_COMP) & D_COMP_RCOMP_IN_PROGRESS) == 0, 1))
+       if (wait_for((hsw_read_dcomp(dev_priv) & D_COMP_RCOMP_IN_PROGRESS) == 0,
+                    1))
                DRM_ERROR("D_COMP RCOMP still in progress\n");
 
        if (allow_power_down) {
@@ -7373,7 +7493,7 @@ static void hsw_restore_lcpll(struct drm_i915_private *dev_priv)
                POSTING_READ(LCPLL_CTL);
        }
 
-       val = I915_READ(D_COMP);
+       val = hsw_read_dcomp(dev_priv);
        val |= D_COMP_COMP_FORCE;
        val &= ~D_COMP_COMP_DISABLE;
        hsw_write_dcomp(dev_priv, val);
@@ -7479,13 +7599,59 @@ static int haswell_crtc_mode_set(struct drm_crtc *crtc,
 
        if (!intel_ddi_pll_select(intel_crtc))
                return -EINVAL;
-       intel_ddi_pll_enable(intel_crtc);
 
        intel_crtc->lowfreq_avail = false;
 
        return 0;
 }
 
+static void haswell_get_ddi_port_state(struct intel_crtc *crtc,
+                                      struct intel_crtc_config *pipe_config)
+{
+       struct drm_device *dev = crtc->base.dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct intel_shared_dpll *pll;
+       enum port port;
+       uint32_t tmp;
+
+       tmp = I915_READ(TRANS_DDI_FUNC_CTL(pipe_config->cpu_transcoder));
+
+       port = (tmp & TRANS_DDI_PORT_MASK) >> TRANS_DDI_PORT_SHIFT;
+
+       pipe_config->ddi_pll_sel = I915_READ(PORT_CLK_SEL(port));
+
+       switch (pipe_config->ddi_pll_sel) {
+       case PORT_CLK_SEL_WRPLL1:
+               pipe_config->shared_dpll = DPLL_ID_WRPLL1;
+               break;
+       case PORT_CLK_SEL_WRPLL2:
+               pipe_config->shared_dpll = DPLL_ID_WRPLL2;
+               break;
+       }
+
+       if (pipe_config->shared_dpll >= 0) {
+               pll = &dev_priv->shared_dplls[pipe_config->shared_dpll];
+
+               WARN_ON(!pll->get_hw_state(dev_priv, pll,
+                                          &pipe_config->dpll_hw_state));
+       }
+
+       /*
+        * Haswell has only FDI/PCH transcoder A. It is which is connected to
+        * DDI E. So just check whether this pipe is wired to DDI E and whether
+        * the PCH transcoder is on.
+        */
+       if ((port == PORT_E) && I915_READ(LPT_TRANSCONF) & TRANS_ENABLE) {
+               pipe_config->has_pch_encoder = true;
+
+               tmp = I915_READ(FDI_RX_CTL(PIPE_A));
+               pipe_config->fdi_lanes = ((FDI_DP_PORT_WIDTH_MASK & tmp) >>
+                                         FDI_DP_PORT_WIDTH_SHIFT) + 1;
+
+               ironlake_get_fdi_m_n_config(crtc, pipe_config);
+       }
+}
+
 static bool haswell_get_pipe_config(struct intel_crtc *crtc,
                                    struct intel_crtc_config *pipe_config)
 {
@@ -7531,22 +7697,7 @@ static bool haswell_get_pipe_config(struct intel_crtc *crtc,
        if (!(tmp & PIPECONF_ENABLE))
                return false;
 
-       /*
-        * Haswell has only FDI/PCH transcoder A. It is which is connected to
-        * DDI E. So just check whether this pipe is wired to DDI E and whether
-        * the PCH transcoder is on.
-        */
-       tmp = I915_READ(TRANS_DDI_FUNC_CTL(pipe_config->cpu_transcoder));
-       if ((tmp & TRANS_DDI_PORT_MASK) == TRANS_DDI_SELECT_PORT(PORT_E) &&
-           I915_READ(LPT_TRANSCONF) & TRANS_ENABLE) {
-               pipe_config->has_pch_encoder = true;
-
-               tmp = I915_READ(FDI_RX_CTL(PIPE_A));
-               pipe_config->fdi_lanes = ((FDI_DP_PORT_WIDTH_MASK & tmp) >>
-                                         FDI_DP_PORT_WIDTH_SHIFT) + 1;
-
-               ironlake_get_fdi_m_n_config(crtc, pipe_config);
-       }
+       haswell_get_ddi_port_state(crtc, pipe_config);
 
        intel_get_pipe_timings(crtc, pipe_config);
 
@@ -7991,8 +8142,8 @@ static void intel_crtc_update_cursor(struct drm_crtc *crtc,
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        int pipe = intel_crtc->pipe;
-       int x = intel_crtc->cursor_x;
-       int y = intel_crtc->cursor_y;
+       int x = crtc->cursor_x;
+       int y = crtc->cursor_y;
        u32 base = 0, pos = 0;
 
        if (on)
@@ -8036,21 +8187,27 @@ static void intel_crtc_update_cursor(struct drm_crtc *crtc,
        intel_crtc->cursor_base = base;
 }
 
-static int intel_crtc_cursor_set(struct drm_crtc *crtc,
-                                struct drm_file *file,
-                                uint32_t handle,
-                                uint32_t width, uint32_t height)
+/*
+ * intel_crtc_cursor_set_obj - Set cursor to specified GEM object
+ *
+ * Note that the object's reference will be consumed if the update fails.  If
+ * the update succeeds, the reference of the old object (if any) will be
+ * consumed.
+ */
+static int intel_crtc_cursor_set_obj(struct drm_crtc *crtc,
+                                    struct drm_i915_gem_object *obj,
+                                    uint32_t width, uint32_t height)
 {
        struct drm_device *dev = crtc->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
-       struct drm_i915_gem_object *obj;
+       enum pipe pipe = intel_crtc->pipe;
        unsigned old_width;
        uint32_t addr;
        int ret;
 
        /* if we want to turn off the cursor ignore width and height */
-       if (!handle) {
+       if (!obj) {
                DRM_DEBUG_KMS("cursor off\n");
                addr = 0;
                obj = NULL;
@@ -8066,12 +8223,8 @@ static int intel_crtc_cursor_set(struct drm_crtc *crtc,
                return -EINVAL;
        }
 
-       obj = to_intel_bo(drm_gem_object_lookup(dev, file, handle));
-       if (&obj->base == NULL)
-               return -ENOENT;
-
        if (obj->base.size < width * height * 4) {
-               DRM_DEBUG_KMS("buffer is to small\n");
+               DRM_DEBUG_KMS("buffer is too small\n");
                ret = -ENOMEM;
                goto fail;
        }
@@ -8126,9 +8279,10 @@ static int intel_crtc_cursor_set(struct drm_crtc *crtc,
        if (intel_crtc->cursor_bo) {
                if (!INTEL_INFO(dev)->cursor_needs_physical)
                        i915_gem_object_unpin_from_display_plane(intel_crtc->cursor_bo);
-               drm_gem_object_unreference(&intel_crtc->cursor_bo->base);
        }
 
+       i915_gem_track_fb(intel_crtc->cursor_bo, obj,
+                         INTEL_FRONTBUFFER_CURSOR(pipe));
        mutex_unlock(&dev->struct_mutex);
 
        old_width = intel_crtc->cursor_width;
@@ -8144,6 +8298,8 @@ static int intel_crtc_cursor_set(struct drm_crtc *crtc,
                intel_crtc_update_cursor(crtc, intel_crtc->cursor_bo != NULL);
        }
 
+       intel_frontbuffer_flip(dev, INTEL_FRONTBUFFER_CURSOR(pipe));
+
        return 0;
 fail_unpin:
        i915_gem_object_unpin_from_display_plane(obj);
@@ -8154,23 +8310,10 @@ fail:
        return ret;
 }
 
-static int intel_crtc_cursor_move(struct drm_crtc *crtc, int x, int y)
+static void intel_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green,
+                                u16 *blue, uint32_t start, uint32_t size)
 {
-       struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
-
-       intel_crtc->cursor_x = clamp_t(int, x, SHRT_MIN, SHRT_MAX);
-       intel_crtc->cursor_y = clamp_t(int, y, SHRT_MIN, SHRT_MAX);
-
-       if (intel_crtc->active)
-               intel_crtc_update_cursor(crtc, intel_crtc->cursor_bo != NULL);
-
-       return 0;
-}
-
-static void intel_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green,
-                                u16 *blue, uint32_t start, uint32_t size)
-{
-       int end = (start + size > 256) ? 256 : start + size, i;
+       int end = (start + size > 256) ? 256 : start + size, i;
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
 
        for (i = start; i < end; i++) {
@@ -8242,7 +8385,7 @@ static u32
 intel_framebuffer_size_for_mode(struct drm_display_mode *mode, int bpp)
 {
        u32 pitch = intel_framebuffer_pitch_for_width(mode->hdisplay, bpp);
-       return ALIGN(pitch * mode->vdisplay, PAGE_SIZE);
+       return PAGE_ALIGN(pitch * mode->vdisplay);
 }
 
 static struct drm_framebuffer *
@@ -8667,16 +8810,14 @@ struct drm_display_mode *intel_crtc_mode_get(struct drm_device *dev,
        return mode;
 }
 
-static void intel_increase_pllclock(struct drm_crtc *crtc)
+static void intel_increase_pllclock(struct drm_device *dev,
+                                   enum pipe pipe)
 {
-       struct drm_device *dev = crtc->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
-       int pipe = intel_crtc->pipe;
        int dpll_reg = DPLL(pipe);
        int dpll;
 
-       if (HAS_PCH_SPLIT(dev))
+       if (!HAS_GMCH_DISPLAY(dev))
                return;
 
        if (!dev_priv->lvds_downclock_avail)
@@ -8704,7 +8845,7 @@ static void intel_decrease_pllclock(struct drm_crtc *crtc)
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
 
-       if (HAS_PCH_SPLIT(dev))
+       if (!HAS_GMCH_DISPLAY(dev))
                return;
 
        if (!dev_priv->lvds_downclock_avail)
@@ -8773,28 +8914,179 @@ out:
        intel_runtime_pm_put(dev_priv);
 }
 
-void intel_mark_fb_busy(struct drm_i915_gem_object *obj,
-                       struct intel_engine_cs *ring)
+
+/**
+ * intel_mark_fb_busy - mark given planes as busy
+ * @dev: DRM device
+ * @frontbuffer_bits: bits for the affected planes
+ * @ring: optional ring for asynchronous commands
+ *
+ * This function gets called every time the screen contents change. It can be
+ * used to keep e.g. the update rate at the nominal refresh rate with DRRS.
+ */
+static void intel_mark_fb_busy(struct drm_device *dev,
+                              unsigned frontbuffer_bits,
+                              struct intel_engine_cs *ring)
 {
-       struct drm_device *dev = obj->base.dev;
-       struct drm_crtc *crtc;
+       enum pipe pipe;
 
        if (!i915.powersave)
                return;
 
-       for_each_crtc(dev, crtc) {
-               if (!crtc->primary->fb)
-                       continue;
-
-               if (to_intel_framebuffer(crtc->primary->fb)->obj != obj)
+       for_each_pipe(pipe) {
+               if (!(frontbuffer_bits & INTEL_FRONTBUFFER_ALL_MASK(pipe)))
                        continue;
 
-               intel_increase_pllclock(crtc);
+               intel_increase_pllclock(dev, pipe);
                if (ring && intel_fbc_enabled(dev))
                        ring->fbc_dirty = true;
        }
 }
 
+/**
+ * intel_fb_obj_invalidate - invalidate frontbuffer object
+ * @obj: GEM object to invalidate
+ * @ring: set for asynchronous rendering
+ *
+ * This function gets called every time rendering on the given object starts and
+ * frontbuffer caching (fbc, low refresh rate for DRRS, panel self refresh) must
+ * be invalidated. If @ring is non-NULL any subsequent invalidation will be delayed
+ * until the rendering completes or a flip on this frontbuffer plane is
+ * scheduled.
+ */
+void intel_fb_obj_invalidate(struct drm_i915_gem_object *obj,
+                            struct intel_engine_cs *ring)
+{
+       struct drm_device *dev = obj->base.dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+
+       WARN_ON(!mutex_is_locked(&dev->struct_mutex));
+
+       if (!obj->frontbuffer_bits)
+               return;
+
+       if (ring) {
+               mutex_lock(&dev_priv->fb_tracking.lock);
+               dev_priv->fb_tracking.busy_bits
+                       |= obj->frontbuffer_bits;
+               dev_priv->fb_tracking.flip_bits
+                       &= ~obj->frontbuffer_bits;
+               mutex_unlock(&dev_priv->fb_tracking.lock);
+       }
+
+       intel_mark_fb_busy(dev, obj->frontbuffer_bits, ring);
+
+       intel_edp_psr_invalidate(dev, obj->frontbuffer_bits);
+}
+
+/**
+ * intel_frontbuffer_flush - flush frontbuffer
+ * @dev: DRM device
+ * @frontbuffer_bits: frontbuffer plane tracking bits
+ *
+ * This function gets called every time rendering on the given planes has
+ * completed and frontbuffer caching can be started again. Flushes will get
+ * delayed if they're blocked by some oustanding asynchronous rendering.
+ *
+ * Can be called without any locks held.
+ */
+void intel_frontbuffer_flush(struct drm_device *dev,
+                            unsigned frontbuffer_bits)
+{
+       struct drm_i915_private *dev_priv = dev->dev_private;
+
+       /* Delay flushing when rings are still busy.*/
+       mutex_lock(&dev_priv->fb_tracking.lock);
+       frontbuffer_bits &= ~dev_priv->fb_tracking.busy_bits;
+       mutex_unlock(&dev_priv->fb_tracking.lock);
+
+       intel_mark_fb_busy(dev, frontbuffer_bits, NULL);
+
+       intel_edp_psr_flush(dev, frontbuffer_bits);
+}
+
+/**
+ * intel_fb_obj_flush - flush frontbuffer object
+ * @obj: GEM object to flush
+ * @retire: set when retiring asynchronous rendering
+ *
+ * This function gets called every time rendering on the given object has
+ * completed and frontbuffer caching can be started again. If @retire is true
+ * then any delayed flushes will be unblocked.
+ */
+void intel_fb_obj_flush(struct drm_i915_gem_object *obj,
+                       bool retire)
+{
+       struct drm_device *dev = obj->base.dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       unsigned frontbuffer_bits;
+
+       WARN_ON(!mutex_is_locked(&dev->struct_mutex));
+
+       if (!obj->frontbuffer_bits)
+               return;
+
+       frontbuffer_bits = obj->frontbuffer_bits;
+
+       if (retire) {
+               mutex_lock(&dev_priv->fb_tracking.lock);
+               /* Filter out new bits since rendering started. */
+               frontbuffer_bits &= dev_priv->fb_tracking.busy_bits;
+
+               dev_priv->fb_tracking.busy_bits &= ~frontbuffer_bits;
+               mutex_unlock(&dev_priv->fb_tracking.lock);
+       }
+
+       intel_frontbuffer_flush(dev, frontbuffer_bits);
+}
+
+/**
+ * intel_frontbuffer_flip_prepare - prepare asnychronous frontbuffer flip
+ * @dev: DRM device
+ * @frontbuffer_bits: frontbuffer plane tracking bits
+ *
+ * This function gets called after scheduling a flip on @obj. The actual
+ * frontbuffer flushing will be delayed until completion is signalled with
+ * intel_frontbuffer_flip_complete. If an invalidate happens in between this
+ * flush will be cancelled.
+ *
+ * Can be called without any locks held.
+ */
+void intel_frontbuffer_flip_prepare(struct drm_device *dev,
+                                   unsigned frontbuffer_bits)
+{
+       struct drm_i915_private *dev_priv = dev->dev_private;
+
+       mutex_lock(&dev_priv->fb_tracking.lock);
+       dev_priv->fb_tracking.flip_bits
+               |= frontbuffer_bits;
+       mutex_unlock(&dev_priv->fb_tracking.lock);
+}
+
+/**
+ * intel_frontbuffer_flip_complete - complete asynchronous frontbuffer flush
+ * @dev: DRM device
+ * @frontbuffer_bits: frontbuffer plane tracking bits
+ *
+ * This function gets called after the flip has been latched and will complete
+ * on the next vblank. It will execute the fush if it hasn't been cancalled yet.
+ *
+ * Can be called without any locks held.
+ */
+void intel_frontbuffer_flip_complete(struct drm_device *dev,
+                                    unsigned frontbuffer_bits)
+{
+       struct drm_i915_private *dev_priv = dev->dev_private;
+
+       mutex_lock(&dev_priv->fb_tracking.lock);
+       /* Mask any cancelled flips. */
+       frontbuffer_bits &= dev_priv->fb_tracking.flip_bits;
+       dev_priv->fb_tracking.flip_bits &= ~frontbuffer_bits;
+       mutex_unlock(&dev_priv->fb_tracking.lock);
+
+       intel_frontbuffer_flush(dev, frontbuffer_bits);
+}
+
 static void intel_crtc_destroy(struct drm_crtc *crtc)
 {
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
@@ -8812,8 +9104,6 @@ static void intel_crtc_destroy(struct drm_crtc *crtc)
                kfree(work);
        }
 
-       intel_crtc_cursor_set(crtc, NULL, 0, 0, 0);
-
        drm_crtc_cleanup(crtc);
 
        kfree(intel_crtc);
@@ -8824,6 +9114,7 @@ static void intel_unpin_work_fn(struct work_struct *__work)
        struct intel_unpin_work *work =
                container_of(__work, struct intel_unpin_work, work);
        struct drm_device *dev = work->crtc->dev;
+       enum pipe pipe = to_intel_crtc(work->crtc)->pipe;
 
        mutex_lock(&dev->struct_mutex);
        intel_unpin_fb_obj(work->old_fb_obj);
@@ -8833,6 +9124,8 @@ static void intel_unpin_work_fn(struct work_struct *__work)
        intel_update_fbc(dev);
        mutex_unlock(&dev->struct_mutex);
 
+       intel_frontbuffer_flip_complete(dev, INTEL_FRONTBUFFER_PRIMARY(pipe));
+
        BUG_ON(atomic_read(&to_intel_crtc(work->crtc)->unpin_work_count) == 0);
        atomic_dec(&to_intel_crtc(work->crtc)->unpin_work_count);
 
@@ -9202,6 +9495,150 @@ static int intel_gen7_queue_flip(struct drm_device *dev,
        return 0;
 }
 
+static bool use_mmio_flip(struct intel_engine_cs *ring,
+                         struct drm_i915_gem_object *obj)
+{
+       /*
+        * This is not being used for older platforms, because
+        * non-availability of flip done interrupt forces us to use
+        * CS flips. Older platforms derive flip done using some clever
+        * tricks involving the flip_pending status bits and vblank irqs.
+        * So using MMIO flips there would disrupt this mechanism.
+        */
+
+       if (ring == NULL)
+               return true;
+
+       if (INTEL_INFO(ring->dev)->gen < 5)
+               return false;
+
+       if (i915.use_mmio_flip < 0)
+               return false;
+       else if (i915.use_mmio_flip > 0)
+               return true;
+       else
+               return ring != obj->ring;
+}
+
+static void intel_do_mmio_flip(struct intel_crtc *intel_crtc)
+{
+       struct drm_device *dev = intel_crtc->base.dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct intel_framebuffer *intel_fb =
+               to_intel_framebuffer(intel_crtc->base.primary->fb);
+       struct drm_i915_gem_object *obj = intel_fb->obj;
+       u32 dspcntr;
+       u32 reg;
+
+       intel_mark_page_flip_active(intel_crtc);
+
+       reg = DSPCNTR(intel_crtc->plane);
+       dspcntr = I915_READ(reg);
+
+       if (INTEL_INFO(dev)->gen >= 4) {
+               if (obj->tiling_mode != I915_TILING_NONE)
+                       dspcntr |= DISPPLANE_TILED;
+               else
+                       dspcntr &= ~DISPPLANE_TILED;
+       }
+       I915_WRITE(reg, dspcntr);
+
+       I915_WRITE(DSPSURF(intel_crtc->plane),
+                  intel_crtc->unpin_work->gtt_offset);
+       POSTING_READ(DSPSURF(intel_crtc->plane));
+}
+
+static int intel_postpone_flip(struct drm_i915_gem_object *obj)
+{
+       struct intel_engine_cs *ring;
+       int ret;
+
+       lockdep_assert_held(&obj->base.dev->struct_mutex);
+
+       if (!obj->last_write_seqno)
+               return 0;
+
+       ring = obj->ring;
+
+       if (i915_seqno_passed(ring->get_seqno(ring, true),
+                             obj->last_write_seqno))
+               return 0;
+
+       ret = i915_gem_check_olr(ring, obj->last_write_seqno);
+       if (ret)
+               return ret;
+
+       if (WARN_ON(!ring->irq_get(ring)))
+               return 0;
+
+       return 1;
+}
+
+void intel_notify_mmio_flip(struct intel_engine_cs *ring)
+{
+       struct drm_i915_private *dev_priv = to_i915(ring->dev);
+       struct intel_crtc *intel_crtc;
+       unsigned long irq_flags;
+       u32 seqno;
+
+       seqno = ring->get_seqno(ring, false);
+
+       spin_lock_irqsave(&dev_priv->mmio_flip_lock, irq_flags);
+       for_each_intel_crtc(ring->dev, intel_crtc) {
+               struct intel_mmio_flip *mmio_flip;
+
+               mmio_flip = &intel_crtc->mmio_flip;
+               if (mmio_flip->seqno == 0)
+                       continue;
+
+               if (ring->id != mmio_flip->ring_id)
+                       continue;
+
+               if (i915_seqno_passed(seqno, mmio_flip->seqno)) {
+                       intel_do_mmio_flip(intel_crtc);
+                       mmio_flip->seqno = 0;
+                       ring->irq_put(ring);
+               }
+       }
+       spin_unlock_irqrestore(&dev_priv->mmio_flip_lock, irq_flags);
+}
+
+static int intel_queue_mmio_flip(struct drm_device *dev,
+                                struct drm_crtc *crtc,
+                                struct drm_framebuffer *fb,
+                                struct drm_i915_gem_object *obj,
+                                struct intel_engine_cs *ring,
+                                uint32_t flags)
+{
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
+       unsigned long irq_flags;
+       int ret;
+
+       if (WARN_ON(intel_crtc->mmio_flip.seqno))
+               return -EBUSY;
+
+       ret = intel_postpone_flip(obj);
+       if (ret < 0)
+               return ret;
+       if (ret == 0) {
+               intel_do_mmio_flip(intel_crtc);
+               return 0;
+       }
+
+       spin_lock_irqsave(&dev_priv->mmio_flip_lock, irq_flags);
+       intel_crtc->mmio_flip.seqno = obj->last_write_seqno;
+       intel_crtc->mmio_flip.ring_id = obj->ring->id;
+       spin_unlock_irqrestore(&dev_priv->mmio_flip_lock, irq_flags);
+
+       /*
+        * Double check to catch cases where irq fired before
+        * mmio flip data was ready
+        */
+       intel_notify_mmio_flip(obj->ring);
+       return 0;
+}
+
 static int intel_default_queue_flip(struct drm_device *dev,
                                    struct drm_crtc *crtc,
                                    struct drm_framebuffer *fb,
@@ -9220,13 +9657,22 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
        struct drm_device *dev = crtc->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct drm_framebuffer *old_fb = crtc->primary->fb;
-       struct drm_i915_gem_object *obj = to_intel_framebuffer(fb)->obj;
+       struct drm_i915_gem_object *obj = intel_fb_obj(fb);
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
+       enum pipe pipe = intel_crtc->pipe;
        struct intel_unpin_work *work;
        struct intel_engine_cs *ring;
        unsigned long flags;
        int ret;
 
+       /*
+        * drm_mode_page_flip_ioctl() should already catch this, but double
+        * check to be safe.  In the future we may enable pageflipping from
+        * a disabled primary plane.
+        */
+       if (WARN_ON(intel_fb_obj(old_fb) == NULL))
+               return -EBUSY;
+
        /* Can't change pixel format via MI display flips. */
        if (fb->pixel_format != crtc->primary->fb->pixel_format)
                return -EINVAL;
@@ -9249,7 +9695,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
 
        work->event = event;
        work->crtc = crtc;
-       work->old_fb_obj = to_intel_framebuffer(old_fb)->obj;
+       work->old_fb_obj = intel_fb_obj(old_fb);
        INIT_WORK(&work->work, intel_unpin_work_fn);
 
        ret = drm_crtc_vblank_get(crtc);
@@ -9290,10 +9736,15 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
        intel_crtc->reset_counter = atomic_read(&dev_priv->gpu_error.reset_counter);
 
        if (INTEL_INFO(dev)->gen >= 5 || IS_G4X(dev))
-               work->flip_count = I915_READ(PIPE_FLIPCOUNT_GM45(intel_crtc->pipe)) + 1;
+               work->flip_count = I915_READ(PIPE_FLIPCOUNT_GM45(pipe)) + 1;
 
        if (IS_VALLEYVIEW(dev)) {
                ring = &dev_priv->ring[BCS];
+               if (obj->tiling_mode != work->old_fb_obj->tiling_mode)
+                       /* vlv: DISPLAY_FLIP fails to change tiling */
+                       ring = NULL;
+       } else if (IS_IVYBRIDGE(dev)) {
+               ring = &dev_priv->ring[BCS];
        } else if (INTEL_INFO(dev)->gen >= 7) {
                ring = obj->ring;
                if (ring == NULL || ring->id != RCS)
@@ -9309,12 +9760,20 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
        work->gtt_offset =
                i915_gem_obj_ggtt_offset(obj) + intel_crtc->dspaddr_offset;
 
-       ret = dev_priv->display.queue_flip(dev, crtc, fb, obj, ring, page_flip_flags);
+       if (use_mmio_flip(ring, obj))
+               ret = intel_queue_mmio_flip(dev, crtc, fb, obj, ring,
+                                           page_flip_flags);
+       else
+               ret = dev_priv->display.queue_flip(dev, crtc, fb, obj, ring,
+                               page_flip_flags);
        if (ret)
                goto cleanup_unpin;
 
+       i915_gem_track_fb(work->old_fb_obj, obj,
+                         INTEL_FRONTBUFFER_PRIMARY(pipe));
+
        intel_disable_fbc(dev);
-       intel_mark_fb_busy(obj, NULL);
+       intel_frontbuffer_flip_prepare(dev, INTEL_FRONTBUFFER_PRIMARY(pipe));
        mutex_unlock(&dev->struct_mutex);
 
        trace_i915_flip_request(intel_crtc->plane, obj);
@@ -9344,7 +9803,7 @@ out_hang:
                intel_crtc_wait_for_pending_flips(crtc);
                ret = intel_pipe_set_base(crtc, crtc->x, crtc->y, fb);
                if (ret == 0 && event)
-                       drm_send_vblank_event(dev, intel_crtc->pipe, event);
+                       drm_send_vblank_event(dev, pipe, event);
        }
        return ret;
 }
@@ -10017,11 +10476,14 @@ intel_pipe_config_compare(struct drm_device *dev,
 
        PIPE_CONF_CHECK_I(double_wide);
 
+       PIPE_CONF_CHECK_X(ddi_pll_sel);
+
        PIPE_CONF_CHECK_I(shared_dpll);
        PIPE_CONF_CHECK_X(dpll_hw_state.dpll);
        PIPE_CONF_CHECK_X(dpll_hw_state.dpll_md);
        PIPE_CONF_CHECK_X(dpll_hw_state.fp0);
        PIPE_CONF_CHECK_X(dpll_hw_state.fp1);
+       PIPE_CONF_CHECK_X(dpll_hw_state.wrpll);
 
        if (IS_G4X(dev) || INTEL_INFO(dev)->gen >= 5)
                PIPE_CONF_CHECK_I(pipe_bpp);
@@ -10083,6 +10545,14 @@ check_encoder_state(struct drm_device *dev)
                        if (connector->base.dpms != DRM_MODE_DPMS_OFF)
                                active = true;
                }
+               /*
+                * for MST connectors if we unplug the connector is gone
+                * away but the encoder is still connected to a crtc
+                * until a modeset happens in response to the hotplug.
+                */
+               if (!enabled && encoder->base.encoder_type == DRM_MODE_ENCODER_DPMST)
+                       continue;
+
                WARN(!!encoder->base.crtc != enabled,
                     "encoder's enabled state mismatch "
                     "(expected %i, found %i)\n",
@@ -10378,20 +10848,23 @@ static int __intel_set_mode(struct drm_crtc *crtc,
         * on the DPLL.
         */
        for_each_intel_crtc_masked(dev, modeset_pipes, intel_crtc) {
-               struct drm_framebuffer *old_fb;
+               struct drm_framebuffer *old_fb = crtc->primary->fb;
+               struct drm_i915_gem_object *old_obj = intel_fb_obj(old_fb);
+               struct drm_i915_gem_object *obj = intel_fb_obj(fb);
 
                mutex_lock(&dev->struct_mutex);
                ret = intel_pin_and_fence_fb_obj(dev,
-                                                to_intel_framebuffer(fb)->obj,
+                                                obj,
                                                 NULL);
                if (ret != 0) {
                        DRM_ERROR("pin & fence failed\n");
                        mutex_unlock(&dev->struct_mutex);
                        goto done;
                }
-               old_fb = crtc->primary->fb;
                if (old_fb)
-                       intel_unpin_fb_obj(to_intel_framebuffer(old_fb)->obj);
+                       intel_unpin_fb_obj(old_obj);
+               i915_gem_track_fb(old_obj, obj,
+                                 INTEL_FRONTBUFFER_PRIMARY(intel_crtc->pipe));
                mutex_unlock(&dev->struct_mutex);
 
                crtc->primary->fb = fb;
@@ -10563,12 +11036,17 @@ intel_set_config_compute_mode_changes(struct drm_mode_set *set,
        if (is_crtc_connector_off(set)) {
                config->mode_changed = true;
        } else if (set->crtc->primary->fb != set->fb) {
-               /* If we have no fb then treat it as a full mode set */
+               /*
+                * If we have no fb, we can only flip as long as the crtc is
+                * active, otherwise we need a full mode set.  The crtc may
+                * be active if we've only disabled the primary plane, or
+                * in fastboot situations.
+                */
                if (set->crtc->primary->fb == NULL) {
                        struct intel_crtc *intel_crtc =
                                to_intel_crtc(set->crtc);
 
-                       if (intel_crtc->active && i915.fastboot) {
+                       if (intel_crtc->active) {
                                DRM_DEBUG_KMS("crtc has no fb, will flip\n");
                                config->fb_changed = true;
                        } else {
@@ -10620,7 +11098,7 @@ intel_modeset_stage_output_state(struct drm_device *dev,
                 * for them. */
                for (ro = 0; ro < set->num_connectors; ro++) {
                        if (set->connectors[ro] == &connector->base) {
-                               connector->new_encoder = connector->encoder;
+                               connector->new_encoder = intel_find_encoder(connector, to_intel_crtc(set->crtc)->pipe);
                                break;
                        }
                }
@@ -10666,7 +11144,7 @@ intel_modeset_stage_output_state(struct drm_device *dev,
                                         new_crtc)) {
                        return -EINVAL;
                }
-               connector->encoder->new_crtc = to_intel_crtc(new_crtc);
+               connector->new_encoder->new_crtc = to_intel_crtc(new_crtc);
 
                DRM_DEBUG_KMS("[CONNECTOR:%d:%s] to [CRTC:%d]\n",
                        connector->base.base.id,
@@ -10700,7 +11178,12 @@ intel_modeset_stage_output_state(struct drm_device *dev,
                }
        }
        /* Now we've also updated encoder->new_crtc for all encoders. */
-
+       list_for_each_entry(connector, &dev->mode_config.connector_list,
+                           base.head) {
+               if (connector->new_encoder)
+                       if (connector->new_encoder != connector->encoder)
+                               connector->encoder = connector->new_encoder;
+       }
        for_each_intel_crtc(dev, crtc) {
                crtc->new_enabled = false;
 
@@ -10806,10 +11289,24 @@ static int intel_crtc_set_config(struct drm_mode_set *set)
                ret = intel_set_mode(set->crtc, set->mode,
                                     set->x, set->y, set->fb);
        } else if (config->fb_changed) {
+               struct drm_i915_private *dev_priv = dev->dev_private;
+               struct intel_crtc *intel_crtc = to_intel_crtc(set->crtc);
+
                intel_crtc_wait_for_pending_flips(set->crtc);
 
                ret = intel_pipe_set_base(set->crtc,
                                          set->x, set->y, set->fb);
+
+               /*
+                * We need to make sure the primary plane is re-enabled if it
+                * has previously been turned off.
+                */
+               if (!intel_crtc->primary_enabled && ret == 0) {
+                       WARN_ON(!intel_crtc->active);
+                       intel_enable_primary_hw_plane(dev_priv, intel_crtc->plane,
+                                                     intel_crtc->pipe);
+               }
+
                /*
                 * In the fastboot case this may be our only check of the
                 * state after boot.  It would be better to only do it on
@@ -10850,26 +11347,21 @@ out_config:
 }
 
 static const struct drm_crtc_funcs intel_crtc_funcs = {
-       .cursor_set = intel_crtc_cursor_set,
-       .cursor_move = intel_crtc_cursor_move,
        .gamma_set = intel_crtc_gamma_set,
        .set_config = intel_crtc_set_config,
        .destroy = intel_crtc_destroy,
        .page_flip = intel_crtc_page_flip,
 };
 
-static void intel_cpu_pll_init(struct drm_device *dev)
-{
-       if (HAS_DDI(dev))
-               intel_ddi_pll_init(dev);
-}
-
 static bool ibx_pch_dpll_get_hw_state(struct drm_i915_private *dev_priv,
                                      struct intel_shared_dpll *pll,
                                      struct intel_dpll_hw_state *hw_state)
 {
        uint32_t val;
 
+       if (!intel_display_power_enabled(dev_priv, POWER_DOMAIN_PLLS))
+               return false;
+
        val = I915_READ(PCH_DPLL(pll->id));
        hw_state->dpll = val;
        hw_state->fp0 = I915_READ(PCH_FP0(pll->id));
@@ -10951,7 +11443,9 @@ static void intel_shared_dpll_init(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
 
-       if (HAS_PCH_IBX(dev) || HAS_PCH_CPT(dev))
+       if (HAS_DDI(dev))
+               intel_ddi_pll_init(dev);
+       else if (HAS_PCH_IBX(dev) || HAS_PCH_CPT(dev))
                ibx_pch_dpll_init(dev);
        else
                dev_priv->num_shared_dpll = 0;
@@ -10959,17 +11453,328 @@ static void intel_shared_dpll_init(struct drm_device *dev)
        BUG_ON(dev_priv->num_shared_dpll > I915_NUM_PLLS);
 }
 
+static int
+intel_primary_plane_disable(struct drm_plane *plane)
+{
+       struct drm_device *dev = plane->dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct intel_plane *intel_plane = to_intel_plane(plane);
+       struct intel_crtc *intel_crtc;
+
+       if (!plane->fb)
+               return 0;
+
+       BUG_ON(!plane->crtc);
+
+       intel_crtc = to_intel_crtc(plane->crtc);
+
+       /*
+        * Even though we checked plane->fb above, it's still possible that
+        * the primary plane has been implicitly disabled because the crtc
+        * coordinates given weren't visible, or because we detected
+        * that it was 100% covered by a sprite plane.  Or, the CRTC may be
+        * off and we've set a fb, but haven't actually turned on the CRTC yet.
+        * In either case, we need to unpin the FB and let the fb pointer get
+        * updated, but otherwise we don't need to touch the hardware.
+        */
+       if (!intel_crtc->primary_enabled)
+               goto disable_unpin;
+
+       intel_crtc_wait_for_pending_flips(plane->crtc);
+       intel_disable_primary_hw_plane(dev_priv, intel_plane->plane,
+                                      intel_plane->pipe);
+disable_unpin:
+       mutex_lock(&dev->struct_mutex);
+       i915_gem_track_fb(intel_fb_obj(plane->fb), NULL,
+                         INTEL_FRONTBUFFER_PRIMARY(intel_crtc->pipe));
+       intel_unpin_fb_obj(intel_fb_obj(plane->fb));
+       mutex_unlock(&dev->struct_mutex);
+       plane->fb = NULL;
+
+       return 0;
+}
+
+static int
+intel_primary_plane_setplane(struct drm_plane *plane, struct drm_crtc *crtc,
+                            struct drm_framebuffer *fb, int crtc_x, int crtc_y,
+                            unsigned int crtc_w, unsigned int crtc_h,
+                            uint32_t src_x, uint32_t src_y,
+                            uint32_t src_w, uint32_t src_h)
+{
+       struct drm_device *dev = crtc->dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
+       struct intel_plane *intel_plane = to_intel_plane(plane);
+       struct drm_i915_gem_object *obj = intel_fb_obj(fb);
+       struct drm_i915_gem_object *old_obj = intel_fb_obj(plane->fb);
+       struct drm_rect dest = {
+               /* integer pixels */
+               .x1 = crtc_x,
+               .y1 = crtc_y,
+               .x2 = crtc_x + crtc_w,
+               .y2 = crtc_y + crtc_h,
+       };
+       struct drm_rect src = {
+               /* 16.16 fixed point */
+               .x1 = src_x,
+               .y1 = src_y,
+               .x2 = src_x + src_w,
+               .y2 = src_y + src_h,
+       };
+       const struct drm_rect clip = {
+               /* integer pixels */
+               .x2 = intel_crtc->active ? intel_crtc->config.pipe_src_w : 0,
+               .y2 = intel_crtc->active ? intel_crtc->config.pipe_src_h : 0,
+       };
+       bool visible;
+       int ret;
+
+       ret = drm_plane_helper_check_update(plane, crtc, fb,
+                                           &src, &dest, &clip,
+                                           DRM_PLANE_HELPER_NO_SCALING,
+                                           DRM_PLANE_HELPER_NO_SCALING,
+                                           false, true, &visible);
+
+       if (ret)
+               return ret;
+
+       /*
+        * If the CRTC isn't enabled, we're just pinning the framebuffer,
+        * updating the fb pointer, and returning without touching the
+        * hardware.  This allows us to later do a drmModeSetCrtc with fb=-1 to
+        * turn on the display with all planes setup as desired.
+        */
+       if (!crtc->enabled) {
+               mutex_lock(&dev->struct_mutex);
+
+               /*
+                * If we already called setplane while the crtc was disabled,
+                * we may have an fb pinned; unpin it.
+                */
+               if (plane->fb)
+                       intel_unpin_fb_obj(old_obj);
+
+               i915_gem_track_fb(old_obj, obj,
+                                 INTEL_FRONTBUFFER_PRIMARY(intel_crtc->pipe));
+
+               /* Pin and return without programming hardware */
+               ret = intel_pin_and_fence_fb_obj(dev, obj, NULL);
+               mutex_unlock(&dev->struct_mutex);
+
+               return ret;
+       }
+
+       intel_crtc_wait_for_pending_flips(crtc);
+
+       /*
+        * If clipping results in a non-visible primary plane, we'll disable
+        * the primary plane.  Note that this is a bit different than what
+        * happens if userspace explicitly disables the plane by passing fb=0
+        * because plane->fb still gets set and pinned.
+        */
+       if (!visible) {
+               mutex_lock(&dev->struct_mutex);
+
+               /*
+                * Try to pin the new fb first so that we can bail out if we
+                * fail.
+                */
+               if (plane->fb != fb) {
+                       ret = intel_pin_and_fence_fb_obj(dev, obj, NULL);
+                       if (ret) {
+                               mutex_unlock(&dev->struct_mutex);
+                               return ret;
+                       }
+               }
+
+               i915_gem_track_fb(old_obj, obj,
+                                 INTEL_FRONTBUFFER_PRIMARY(intel_crtc->pipe));
+
+               if (intel_crtc->primary_enabled)
+                       intel_disable_primary_hw_plane(dev_priv,
+                                                      intel_plane->plane,
+                                                      intel_plane->pipe);
+
+
+               if (plane->fb != fb)
+                       if (plane->fb)
+                               intel_unpin_fb_obj(old_obj);
+
+               mutex_unlock(&dev->struct_mutex);
+
+               return 0;
+       }
+
+       ret = intel_pipe_set_base(crtc, src.x1, src.y1, fb);
+       if (ret)
+               return ret;
+
+       if (!intel_crtc->primary_enabled)
+               intel_enable_primary_hw_plane(dev_priv, intel_crtc->plane,
+                                             intel_crtc->pipe);
+
+       return 0;
+}
+
+/* Common destruction function for both primary and cursor planes */
+static void intel_plane_destroy(struct drm_plane *plane)
+{
+       struct intel_plane *intel_plane = to_intel_plane(plane);
+       drm_plane_cleanup(plane);
+       kfree(intel_plane);
+}
+
+static const struct drm_plane_funcs intel_primary_plane_funcs = {
+       .update_plane = intel_primary_plane_setplane,
+       .disable_plane = intel_primary_plane_disable,
+       .destroy = intel_plane_destroy,
+};
+
+static struct drm_plane *intel_primary_plane_create(struct drm_device *dev,
+                                                   int pipe)
+{
+       struct intel_plane *primary;
+       const uint32_t *intel_primary_formats;
+       int num_formats;
+
+       primary = kzalloc(sizeof(*primary), GFP_KERNEL);
+       if (primary == NULL)
+               return NULL;
+
+       primary->can_scale = false;
+       primary->max_downscale = 1;
+       primary->pipe = pipe;
+       primary->plane = pipe;
+       if (HAS_FBC(dev) && INTEL_INFO(dev)->gen < 4)
+               primary->plane = !pipe;
+
+       if (INTEL_INFO(dev)->gen <= 3) {
+               intel_primary_formats = intel_primary_formats_gen2;
+               num_formats = ARRAY_SIZE(intel_primary_formats_gen2);
+       } else {
+               intel_primary_formats = intel_primary_formats_gen4;
+               num_formats = ARRAY_SIZE(intel_primary_formats_gen4);
+       }
+
+       drm_universal_plane_init(dev, &primary->base, 0,
+                                &intel_primary_plane_funcs,
+                                intel_primary_formats, num_formats,
+                                DRM_PLANE_TYPE_PRIMARY);
+       return &primary->base;
+}
+
+static int
+intel_cursor_plane_disable(struct drm_plane *plane)
+{
+       if (!plane->fb)
+               return 0;
+
+       BUG_ON(!plane->crtc);
+
+       return intel_crtc_cursor_set_obj(plane->crtc, NULL, 0, 0);
+}
+
+static int
+intel_cursor_plane_update(struct drm_plane *plane, struct drm_crtc *crtc,
+                         struct drm_framebuffer *fb, int crtc_x, int crtc_y,
+                         unsigned int crtc_w, unsigned int crtc_h,
+                         uint32_t src_x, uint32_t src_y,
+                         uint32_t src_w, uint32_t src_h)
+{
+       struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
+       struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
+       struct drm_i915_gem_object *obj = intel_fb->obj;
+       struct drm_rect dest = {
+               /* integer pixels */
+               .x1 = crtc_x,
+               .y1 = crtc_y,
+               .x2 = crtc_x + crtc_w,
+               .y2 = crtc_y + crtc_h,
+       };
+       struct drm_rect src = {
+               /* 16.16 fixed point */
+               .x1 = src_x,
+               .y1 = src_y,
+               .x2 = src_x + src_w,
+               .y2 = src_y + src_h,
+       };
+       const struct drm_rect clip = {
+               /* integer pixels */
+               .x2 = intel_crtc->config.pipe_src_w,
+               .y2 = intel_crtc->config.pipe_src_h,
+       };
+       bool visible;
+       int ret;
+
+       ret = drm_plane_helper_check_update(plane, crtc, fb,
+                                           &src, &dest, &clip,
+                                           DRM_PLANE_HELPER_NO_SCALING,
+                                           DRM_PLANE_HELPER_NO_SCALING,
+                                           true, true, &visible);
+       if (ret)
+               return ret;
+
+       crtc->cursor_x = crtc_x;
+       crtc->cursor_y = crtc_y;
+       if (fb != crtc->cursor->fb) {
+               return intel_crtc_cursor_set_obj(crtc, obj, crtc_w, crtc_h);
+       } else {
+               intel_crtc_update_cursor(crtc, visible);
+               return 0;
+       }
+}
+static const struct drm_plane_funcs intel_cursor_plane_funcs = {
+       .update_plane = intel_cursor_plane_update,
+       .disable_plane = intel_cursor_plane_disable,
+       .destroy = intel_plane_destroy,
+};
+
+static struct drm_plane *intel_cursor_plane_create(struct drm_device *dev,
+                                                  int pipe)
+{
+       struct intel_plane *cursor;
+
+       cursor = kzalloc(sizeof(*cursor), GFP_KERNEL);
+       if (cursor == NULL)
+               return NULL;
+
+       cursor->can_scale = false;
+       cursor->max_downscale = 1;
+       cursor->pipe = pipe;
+       cursor->plane = pipe;
+
+       drm_universal_plane_init(dev, &cursor->base, 0,
+                                &intel_cursor_plane_funcs,
+                                intel_cursor_formats,
+                                ARRAY_SIZE(intel_cursor_formats),
+                                DRM_PLANE_TYPE_CURSOR);
+       return &cursor->base;
+}
+
 static void intel_crtc_init(struct drm_device *dev, int pipe)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_crtc *intel_crtc;
-       int i;
+       struct drm_plane *primary = NULL;
+       struct drm_plane *cursor = NULL;
+       int i, ret;
 
        intel_crtc = kzalloc(sizeof(*intel_crtc), GFP_KERNEL);
        if (intel_crtc == NULL)
                return;
 
-       drm_crtc_init(dev, &intel_crtc->base, &intel_crtc_funcs);
+       primary = intel_primary_plane_create(dev, pipe);
+       if (!primary)
+               goto fail;
+
+       cursor = intel_cursor_plane_create(dev, pipe);
+       if (!cursor)
+               goto fail;
+
+       ret = drm_crtc_init_with_planes(dev, &intel_crtc->base, primary,
+                                       cursor, &intel_crtc_funcs);
+       if (ret)
+               goto fail;
 
        drm_mode_crtc_set_gamma_size(&intel_crtc->base, 256);
        for (i = 0; i < 256; i++) {
@@ -10980,7 +11785,7 @@ static void intel_crtc_init(struct drm_device *dev, int pipe)
 
        /*
         * On gen2/3 only plane A can do fbc, but the panel fitter and lvds port
-        * is hooked to plane B. Hence we want plane A feeding pipe B.
+        * is hooked to pipe B. Hence we want plane A feeding pipe B.
         */
        intel_crtc->pipe = pipe;
        intel_crtc->plane = pipe;
@@ -11002,6 +11807,14 @@ static void intel_crtc_init(struct drm_device *dev, int pipe)
        drm_crtc_helper_add(&intel_crtc->base, &intel_helper_funcs);
 
        WARN_ON(drm_crtc_index(&intel_crtc->base) != intel_crtc->pipe);
+       return;
+
+fail:
+       if (primary)
+               drm_plane_cleanup(primary);
+       if (cursor)
+               drm_plane_cleanup(cursor);
+       kfree(intel_crtc);
 }
 
 enum pipe intel_get_pipe_from_connector(struct intel_connector *connector)
@@ -11021,21 +11834,20 @@ int intel_get_pipe_from_crtc_id(struct drm_device *dev, void *data,
                                struct drm_file *file)
 {
        struct drm_i915_get_pipe_from_crtc_id *pipe_from_crtc_id = data;
-       struct drm_mode_object *drmmode_obj;
+       struct drm_crtc *drmmode_crtc;
        struct intel_crtc *crtc;
 
        if (!drm_core_check_feature(dev, DRIVER_MODESET))
                return -ENODEV;
 
-       drmmode_obj = drm_mode_object_find(dev, pipe_from_crtc_id->crtc_id,
-                       DRM_MODE_OBJECT_CRTC);
+       drmmode_crtc = drm_crtc_find(dev, pipe_from_crtc_id->crtc_id);
 
-       if (!drmmode_obj) {
+       if (!drmmode_crtc) {
                DRM_ERROR("no such CRTC id\n");
                return -ENOENT;
        }
 
-       crtc = to_intel_crtc(obj_to_crtc(drmmode_obj));
+       crtc = to_intel_crtc(drmmode_crtc);
        pipe_from_crtc_id->pipe = crtc->pipe;
 
        return 0;
@@ -11236,6 +12048,8 @@ static void intel_setup_outputs(struct drm_device *dev)
        if (SUPPORTS_TV(dev))
                intel_tv_init(dev);
 
+       intel_edp_psr_init(dev);
+
        list_for_each_entry(encoder, &dev->mode_config.encoder_list, base.head) {
                encoder->base.possible_crtcs = encoder->crtc_mask;
                encoder->base.possible_clones =
@@ -11249,11 +12063,14 @@ static void intel_setup_outputs(struct drm_device *dev)
 
 static void intel_user_framebuffer_destroy(struct drm_framebuffer *fb)
 {
+       struct drm_device *dev = fb->dev;
        struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
 
        drm_framebuffer_cleanup(fb);
+       mutex_lock(&dev->struct_mutex);
        WARN_ON(!intel_fb->obj->framebuffer_references--);
-       drm_gem_object_unreference_unlocked(&intel_fb->obj->base);
+       drm_gem_object_unreference(&intel_fb->obj->base);
+       mutex_unlock(&dev->struct_mutex);
        kfree(intel_fb);
 }
 
@@ -11438,7 +12255,7 @@ static void intel_init_display(struct drm_device *dev)
                dev_priv->display.crtc_mode_set = haswell_crtc_mode_set;
                dev_priv->display.crtc_enable = haswell_crtc_enable;
                dev_priv->display.crtc_disable = haswell_crtc_disable;
-               dev_priv->display.off = haswell_crtc_off;
+               dev_priv->display.off = ironlake_crtc_off;
                dev_priv->display.update_primary_plane =
                        ironlake_update_primary_plane;
        } else if (HAS_PCH_SPLIT(dev)) {
@@ -11722,6 +12539,9 @@ void intel_modeset_init_hw(struct drm_device *dev)
 {
        intel_prepare_ddi(dev);
 
+       if (IS_VALLEYVIEW(dev))
+               vlv_update_cdclk(dev);
+
        intel_init_clock_gating(dev);
 
        intel_reset_dpio(dev);
@@ -11798,7 +12618,6 @@ void intel_modeset_init(struct drm_device *dev)
        intel_init_dpio(dev);
        intel_reset_dpio(dev);
 
-       intel_cpu_pll_init(dev);
        intel_shared_dpll_init(dev);
 
        /* Just disable it once at startup */
@@ -12024,6 +12843,8 @@ static void intel_sanitize_encoder(struct intel_encoder *encoder)
                                      encoder->base.base.id,
                                      encoder->base.name);
                        encoder->disable(encoder);
+                       if (encoder->post_disable)
+                               encoder->post_disable(encoder);
                }
                encoder->base.crtc = NULL;
                encoder->connectors_active = false;
@@ -12108,10 +12929,6 @@ static void intel_modeset_readout_hw_state(struct drm_device *dev)
                              crtc->active ? "enabled" : "disabled");
        }
 
-       /* FIXME: Smash this into the new shared dpll infrastructure. */
-       if (HAS_DDI(dev))
-               intel_ddi_setup_hw_pll_state(dev);
-
        for (i = 0; i < dev_priv->num_shared_dpll; i++) {
                struct intel_shared_dpll *pll = &dev_priv->shared_dplls[i];
 
@@ -12125,6 +12942,9 @@ static void intel_modeset_readout_hw_state(struct drm_device *dev)
 
                DRM_DEBUG_KMS("%s hw state readout: refcount %i, on %i\n",
                              pll->name, pll->refcount, pll->on);
+
+               if (pll->refcount)
+                       intel_display_power_get(dev_priv, POWER_DOMAIN_PLLS);
        }
 
        list_for_each_entry(encoder, &dev->mode_config.encoder_list,
@@ -12242,7 +13062,7 @@ void intel_modeset_setup_hw_state(struct drm_device *dev,
 void intel_modeset_gem_init(struct drm_device *dev)
 {
        struct drm_crtc *c;
-       struct intel_framebuffer *fb;
+       struct drm_i915_gem_object *obj;
 
        mutex_lock(&dev->struct_mutex);
        intel_init_gt_powersave(dev);
@@ -12259,11 +13079,11 @@ void intel_modeset_gem_init(struct drm_device *dev)
         */
        mutex_lock(&dev->struct_mutex);
        for_each_crtc(dev, c) {
-               if (!c->primary->fb)
+               obj = intel_fb_obj(c->primary->fb);
+               if (obj == NULL)
                        continue;
 
-               fb = to_intel_framebuffer(c->primary->fb);
-               if (intel_pin_and_fence_fb_obj(dev, fb->obj, NULL)) {
+               if (intel_pin_and_fence_fb_obj(dev, obj, NULL)) {
                        DRM_ERROR("failed to pin boot fb on pipe %d\n",
                                  to_intel_crtc(c)->pipe);
                        drm_framebuffer_unreference(c->primary->fb);
@@ -12278,13 +13098,12 @@ void intel_connector_unregister(struct intel_connector *intel_connector)
        struct drm_connector *connector = &intel_connector->base;
 
        intel_panel_destroy_backlight(connector);
-       drm_sysfs_connector_remove(connector);
+       drm_connector_unregister(connector);
 }
 
 void intel_modeset_cleanup(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct drm_crtc *crtc;
        struct drm_connector *connector;
 
        /*
@@ -12294,6 +13113,8 @@ void intel_modeset_cleanup(struct drm_device *dev)
         */
        drm_irq_uninstall(dev);
        cancel_work_sync(&dev_priv->hotplug_work);
+       dev_priv->pm._irqs_disabled = true;
+
        /*
         * Due to the hpd irq storm handling the hotplug work can re-arm the
         * poll handlers. Hence disable polling after hpd handling is shut down.
@@ -12304,14 +13125,6 @@ void intel_modeset_cleanup(struct drm_device *dev)
 
        intel_unregister_dsm_handler();
 
-       for_each_crtc(dev, crtc) {
-               /* Skip inactive CRTCs */
-               if (!crtc->primary->fb)
-                       continue;
-
-               intel_increase_pllclock(crtc);
-       }
-
        intel_disable_fbc(dev);
 
        intel_disable_gt_powersave(dev);
@@ -12479,7 +13292,7 @@ intel_display_capture_error_state(struct drm_device *dev)
 
                error->pipe[i].source = I915_READ(PIPESRC(i));
 
-               if (!HAS_PCH_SPLIT(dev))
+               if (HAS_GMCH_DISPLAY(dev))
                        error->pipe[i].stat = I915_READ(PIPESTAT(i));
        }
 
index 8a1a4fbc06ac85c5c41b58750d44219777c37d6b..ee3942f0b0683f5747c53842cb7f9ae0dc6745fa 100644 (file)
@@ -114,7 +114,7 @@ static void intel_dp_link_down(struct intel_dp *intel_dp);
 static bool _edp_panel_vdd_on(struct intel_dp *intel_dp);
 static void edp_panel_vdd_off(struct intel_dp *intel_dp, bool sync);
 
-static int
+int
 intel_dp_max_link_bw(struct intel_dp *intel_dp)
 {
        int max_link_bw = intel_dp->dpcd[DP_MAX_LINK_RATE];
@@ -773,11 +773,28 @@ intel_dp_connector_unregister(struct intel_connector *intel_connector)
 {
        struct intel_dp *intel_dp = intel_attached_dp(&intel_connector->base);
 
-       sysfs_remove_link(&intel_connector->base.kdev->kobj,
-                         intel_dp->aux.ddc.dev.kobj.name);
+       if (!intel_connector->mst_port)
+               sysfs_remove_link(&intel_connector->base.kdev->kobj,
+                                 intel_dp->aux.ddc.dev.kobj.name);
        intel_connector_unregister(intel_connector);
 }
 
+static void
+hsw_dp_set_ddi_pll_sel(struct intel_crtc_config *pipe_config, int link_bw)
+{
+       switch (link_bw) {
+       case DP_LINK_BW_1_62:
+               pipe_config->ddi_pll_sel = PORT_CLK_SEL_LCPLL_810;
+               break;
+       case DP_LINK_BW_2_7:
+               pipe_config->ddi_pll_sel = PORT_CLK_SEL_LCPLL_1350;
+               break;
+       case DP_LINK_BW_5_4:
+               pipe_config->ddi_pll_sel = PORT_CLK_SEL_LCPLL_2700;
+               break;
+       }
+}
+
 static void
 intel_dp_set_clock(struct intel_encoder *encoder,
                   struct intel_crtc_config *pipe_config, int link_bw)
@@ -789,8 +806,6 @@ intel_dp_set_clock(struct intel_encoder *encoder,
        if (IS_G4X(dev)) {
                divisor = gen4_dpll;
                count = ARRAY_SIZE(gen4_dpll);
-       } else if (IS_HASWELL(dev)) {
-               /* Haswell has special-purpose DP DDI clocks. */
        } else if (HAS_PCH_SPLIT(dev)) {
                divisor = pch_dpll;
                count = ARRAY_SIZE(pch_dpll);
@@ -961,7 +976,10 @@ found:
                                &pipe_config->dp_m2_n2);
        }
 
-       intel_dp_set_clock(encoder, pipe_config, intel_dp->link_bw);
+       if (HAS_DDI(dev))
+               hsw_dp_set_ddi_pll_sel(pipe_config, intel_dp->link_bw);
+       else
+               intel_dp_set_clock(encoder, pipe_config, intel_dp->link_bw);
 
        return true;
 }
@@ -1267,6 +1285,19 @@ static void edp_panel_vdd_work(struct work_struct *__work)
        drm_modeset_unlock(&dev->mode_config.connection_mutex);
 }
 
+static void edp_panel_vdd_schedule_off(struct intel_dp *intel_dp)
+{
+       unsigned long delay;
+
+       /*
+        * Queue the timer to fire a long time from now (relative to the power
+        * down delay) to keep the panel power up across a sequence of
+        * operations.
+        */
+       delay = msecs_to_jiffies(intel_dp->panel_power_cycle_delay * 5);
+       schedule_delayed_work(&intel_dp->panel_vdd_work, delay);
+}
+
 static void edp_panel_vdd_off(struct intel_dp *intel_dp, bool sync)
 {
        if (!is_edp(intel_dp))
@@ -1276,17 +1307,10 @@ static void edp_panel_vdd_off(struct intel_dp *intel_dp, bool sync)
 
        intel_dp->want_panel_vdd = false;
 
-       if (sync) {
+       if (sync)
                edp_panel_vdd_off_sync(intel_dp);
-       } else {
-               /*
-                * Queue the timer to fire a long
-                * time from now (relative to the power down delay)
-                * to keep the panel power up across a sequence of operations
-                */
-               schedule_delayed_work(&intel_dp->panel_vdd_work,
-                                     msecs_to_jiffies(intel_dp->panel_power_cycle_delay * 5));
-       }
+       else
+               edp_panel_vdd_schedule_off(intel_dp);
 }
 
 void intel_edp_panel_on(struct intel_dp *intel_dp)
@@ -1349,8 +1373,6 @@ void intel_edp_panel_off(struct intel_dp *intel_dp)
 
        DRM_DEBUG_KMS("Turn eDP power off\n");
 
-       edp_wait_backlight_off(intel_dp);
-
        WARN(!intel_dp->want_panel_vdd, "Need VDD to turn off panel\n");
 
        pp = ironlake_get_pp_control(intel_dp);
@@ -1386,6 +1408,9 @@ void intel_edp_backlight_on(struct intel_dp *intel_dp)
                return;
 
        DRM_DEBUG_KMS("\n");
+
+       intel_panel_enable_backlight(intel_dp->attached_connector);
+
        /*
         * If we enable the backlight right away following a panel power
         * on, we may see slight flicker as the panel syncs with the eDP
@@ -1400,8 +1425,6 @@ void intel_edp_backlight_on(struct intel_dp *intel_dp)
 
        I915_WRITE(pp_ctrl_reg, pp);
        POSTING_READ(pp_ctrl_reg);
-
-       intel_panel_enable_backlight(intel_dp->attached_connector);
 }
 
 void intel_edp_backlight_off(struct intel_dp *intel_dp)
@@ -1414,8 +1437,6 @@ void intel_edp_backlight_off(struct intel_dp *intel_dp)
        if (!is_edp(intel_dp))
                return;
 
-       intel_panel_disable_backlight(intel_dp->attached_connector);
-
        DRM_DEBUG_KMS("\n");
        pp = ironlake_get_pp_control(intel_dp);
        pp &= ~EDP_BLC_ENABLE;
@@ -1425,6 +1446,10 @@ void intel_edp_backlight_off(struct intel_dp *intel_dp)
        I915_WRITE(pp_ctrl_reg, pp);
        POSTING_READ(pp_ctrl_reg);
        intel_dp->last_backlight_off = jiffies;
+
+       edp_wait_backlight_off(intel_dp);
+
+       intel_panel_disable_backlight(intel_dp->attached_connector);
 }
 
 static void ironlake_edp_pll_on(struct intel_dp *intel_dp)
@@ -1646,11 +1671,9 @@ static void intel_dp_get_config(struct intel_encoder *encoder,
        }
 }
 
-static bool is_edp_psr(struct drm_device *dev)
+static bool is_edp_psr(struct intel_dp *intel_dp)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
-
-       return dev_priv->psr.sink_support;
+       return intel_dp->psr_dpcd[0] & DP_PSR_IS_SUPPORTED;
 }
 
 static bool intel_edp_is_psr_enabled(struct drm_device *dev)
@@ -1698,9 +1721,6 @@ static void intel_edp_psr_setup(struct intel_dp *intel_dp)
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct edp_vsc_psr psr_vsc;
 
-       if (intel_dp->psr_setup_done)
-               return;
-
        /* Prepare VSC packet as per EDP 1.3 spec, Table 3.10 */
        memset(&psr_vsc, 0, sizeof(psr_vsc));
        psr_vsc.sdp_header.HB0 = 0;
@@ -1712,22 +1732,25 @@ static void intel_edp_psr_setup(struct intel_dp *intel_dp)
        /* Avoid continuous PSR exit by masking memup and hpd */
        I915_WRITE(EDP_PSR_DEBUG_CTL(dev), EDP_PSR_DEBUG_MASK_MEMUP |
                   EDP_PSR_DEBUG_MASK_HPD | EDP_PSR_DEBUG_MASK_LPSP);
-
-       intel_dp->psr_setup_done = true;
 }
 
 static void intel_edp_psr_enable_sink(struct intel_dp *intel_dp)
 {
-       struct drm_device *dev = intel_dp_to_dev(intel_dp);
+       struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
+       struct drm_device *dev = dig_port->base.base.dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        uint32_t aux_clock_divider;
        int precharge = 0x3;
        int msg_size = 5;       /* Header(4) + Message(1) */
+       bool only_standby = false;
 
        aux_clock_divider = intel_dp->get_aux_clock_divider(intel_dp, 0);
 
+       if (IS_BROADWELL(dev) && dig_port->port != PORT_A)
+               only_standby = true;
+
        /* Enable PSR in sink */
-       if (intel_dp->psr_dpcd[1] & DP_PSR_NO_TRAIN_ON_EXIT)
+       if (intel_dp->psr_dpcd[1] & DP_PSR_NO_TRAIN_ON_EXIT || only_standby)
                drm_dp_dpcd_writeb(&intel_dp->aux, DP_PSR_EN_CFG,
                                   DP_PSR_ENABLE & ~DP_PSR_MAIN_LINK_ACTIVE);
        else
@@ -1746,18 +1769,24 @@ static void intel_edp_psr_enable_sink(struct intel_dp *intel_dp)
 
 static void intel_edp_psr_enable_source(struct intel_dp *intel_dp)
 {
-       struct drm_device *dev = intel_dp_to_dev(intel_dp);
+       struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
+       struct drm_device *dev = dig_port->base.base.dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        uint32_t max_sleep_time = 0x1f;
        uint32_t idle_frames = 1;
        uint32_t val = 0x0;
        const uint32_t link_entry_time = EDP_PSR_MIN_LINK_ENTRY_TIME_8_LINES;
+       bool only_standby = false;
 
-       if (intel_dp->psr_dpcd[1] & DP_PSR_NO_TRAIN_ON_EXIT) {
+       if (IS_BROADWELL(dev) && dig_port->port != PORT_A)
+               only_standby = true;
+
+       if (intel_dp->psr_dpcd[1] & DP_PSR_NO_TRAIN_ON_EXIT || only_standby) {
                val |= EDP_PSR_LINK_STANDBY;
                val |= EDP_PSR_TP2_TP3_TIME_0us;
                val |= EDP_PSR_TP1_TIME_0us;
                val |= EDP_PSR_SKIP_AUX_EXIT;
+               val |= IS_BROADWELL(dev) ? BDW_PSR_SINGLE_FRAME : 0;
        } else
                val |= EDP_PSR_LINK_DISABLE;
 
@@ -1775,18 +1804,14 @@ static bool intel_edp_psr_match_conditions(struct intel_dp *intel_dp)
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct drm_crtc *crtc = dig_port->base.base.crtc;
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
-       struct drm_i915_gem_object *obj = to_intel_framebuffer(crtc->primary->fb)->obj;
-       struct intel_encoder *intel_encoder = &dp_to_dig_port(intel_dp)->base;
 
-       dev_priv->psr.source_ok = false;
+       lockdep_assert_held(&dev_priv->psr.lock);
+       WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex));
+       WARN_ON(!drm_modeset_is_locked(&crtc->mutex));
 
-       if (!HAS_PSR(dev)) {
-               DRM_DEBUG_KMS("PSR not supported on this platform\n");
-               return false;
-       }
+       dev_priv->psr.source_ok = false;
 
-       if ((intel_encoder->type != INTEL_OUTPUT_EDP) ||
-           (dig_port->port != PORT_A)) {
+       if (IS_HASWELL(dev) && dig_port->port != PORT_A) {
                DRM_DEBUG_KMS("HSW ties PSR to DDI A (eDP)\n");
                return false;
        }
@@ -1796,29 +1821,9 @@ static bool intel_edp_psr_match_conditions(struct intel_dp *intel_dp)
                return false;
        }
 
-       crtc = dig_port->base.base.crtc;
-       if (crtc == NULL) {
-               DRM_DEBUG_KMS("crtc not active for PSR\n");
-               return false;
-       }
-
-       intel_crtc = to_intel_crtc(crtc);
-       if (!intel_crtc_active(crtc)) {
-               DRM_DEBUG_KMS("crtc not active for PSR\n");
-               return false;
-       }
-
-       obj = to_intel_framebuffer(crtc->primary->fb)->obj;
-       if (obj->tiling_mode != I915_TILING_X ||
-           obj->fence_reg == I915_FENCE_REG_NONE) {
-               DRM_DEBUG_KMS("PSR condition failed: fb not tiled or fenced\n");
-               return false;
-       }
-
-       if (I915_READ(SPRCTL(intel_crtc->pipe)) & SPRITE_ENABLE) {
-               DRM_DEBUG_KMS("PSR condition failed: Sprite is Enabled\n");
-               return false;
-       }
+       /* Below limitations aren't valid for Broadwell */
+       if (IS_BROADWELL(dev))
+               goto out;
 
        if (I915_READ(HSW_STEREO_3D_CTL(intel_crtc->config.cpu_transcoder)) &
            S3D_ENABLE) {
@@ -1831,35 +1836,60 @@ static bool intel_edp_psr_match_conditions(struct intel_dp *intel_dp)
                return false;
        }
 
+ out:
        dev_priv->psr.source_ok = true;
        return true;
 }
 
 static void intel_edp_psr_do_enable(struct intel_dp *intel_dp)
 {
-       struct drm_device *dev = intel_dp_to_dev(intel_dp);
+       struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
+       struct drm_device *dev = intel_dig_port->base.base.dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
 
-       if (!intel_edp_psr_match_conditions(intel_dp) ||
-           intel_edp_is_psr_enabled(dev))
-               return;
-
-       /* Setup PSR once */
-       intel_edp_psr_setup(intel_dp);
+       WARN_ON(I915_READ(EDP_PSR_CTL(dev)) & EDP_PSR_ENABLE);
+       WARN_ON(dev_priv->psr.active);
+       lockdep_assert_held(&dev_priv->psr.lock);
 
        /* Enable PSR on the panel */
        intel_edp_psr_enable_sink(intel_dp);
 
        /* Enable PSR on the host */
        intel_edp_psr_enable_source(intel_dp);
+
+       dev_priv->psr.active = true;
 }
 
 void intel_edp_psr_enable(struct intel_dp *intel_dp)
 {
        struct drm_device *dev = intel_dp_to_dev(intel_dp);
+       struct drm_i915_private *dev_priv = dev->dev_private;
+
+       if (!HAS_PSR(dev)) {
+               DRM_DEBUG_KMS("PSR not supported on this platform\n");
+               return;
+       }
 
-       if (intel_edp_psr_match_conditions(intel_dp) &&
-           !intel_edp_is_psr_enabled(dev))
-               intel_edp_psr_do_enable(intel_dp);
+       if (!is_edp_psr(intel_dp)) {
+               DRM_DEBUG_KMS("PSR not supported by this panel\n");
+               return;
+       }
+
+       mutex_lock(&dev_priv->psr.lock);
+       if (dev_priv->psr.enabled) {
+               DRM_DEBUG_KMS("PSR already in use\n");
+               mutex_unlock(&dev_priv->psr.lock);
+               return;
+       }
+
+       dev_priv->psr.busy_frontbuffer_bits = 0;
+
+       /* Setup PSR once */
+       intel_edp_psr_setup(intel_dp);
+
+       if (intel_edp_psr_match_conditions(intel_dp))
+               dev_priv->psr.enabled = intel_dp;
+       mutex_unlock(&dev_priv->psr.lock);
 }
 
 void intel_edp_psr_disable(struct intel_dp *intel_dp)
@@ -1867,36 +1897,136 @@ void intel_edp_psr_disable(struct intel_dp *intel_dp)
        struct drm_device *dev = intel_dp_to_dev(intel_dp);
        struct drm_i915_private *dev_priv = dev->dev_private;
 
-       if (!intel_edp_is_psr_enabled(dev))
+       mutex_lock(&dev_priv->psr.lock);
+       if (!dev_priv->psr.enabled) {
+               mutex_unlock(&dev_priv->psr.lock);
                return;
+       }
+
+       if (dev_priv->psr.active) {
+               I915_WRITE(EDP_PSR_CTL(dev),
+                          I915_READ(EDP_PSR_CTL(dev)) & ~EDP_PSR_ENABLE);
 
-       I915_WRITE(EDP_PSR_CTL(dev),
-                  I915_READ(EDP_PSR_CTL(dev)) & ~EDP_PSR_ENABLE);
+               /* Wait till PSR is idle */
+               if (_wait_for((I915_READ(EDP_PSR_STATUS_CTL(dev)) &
+                              EDP_PSR_STATUS_STATE_MASK) == 0, 2000, 10))
+                       DRM_ERROR("Timed out waiting for PSR Idle State\n");
 
-       /* Wait till PSR is idle */
-       if (_wait_for((I915_READ(EDP_PSR_STATUS_CTL(dev)) &
-                      EDP_PSR_STATUS_STATE_MASK) == 0, 2000, 10))
-               DRM_ERROR("Timed out waiting for PSR Idle State\n");
+               dev_priv->psr.active = false;
+       } else {
+               WARN_ON(I915_READ(EDP_PSR_CTL(dev)) & EDP_PSR_ENABLE);
+       }
+
+       dev_priv->psr.enabled = NULL;
+       mutex_unlock(&dev_priv->psr.lock);
+
+       cancel_delayed_work_sync(&dev_priv->psr.work);
 }
 
-void intel_edp_psr_update(struct drm_device *dev)
+static void intel_edp_psr_work(struct work_struct *work)
 {
-       struct intel_encoder *encoder;
-       struct intel_dp *intel_dp = NULL;
+       struct drm_i915_private *dev_priv =
+               container_of(work, typeof(*dev_priv), psr.work.work);
+       struct intel_dp *intel_dp = dev_priv->psr.enabled;
 
-       list_for_each_entry(encoder, &dev->mode_config.encoder_list, base.head)
-               if (encoder->type == INTEL_OUTPUT_EDP) {
-                       intel_dp = enc_to_intel_dp(&encoder->base);
+       mutex_lock(&dev_priv->psr.lock);
+       intel_dp = dev_priv->psr.enabled;
 
-                       if (!is_edp_psr(dev))
-                               return;
+       if (!intel_dp)
+               goto unlock;
 
-                       if (!intel_edp_psr_match_conditions(intel_dp))
-                               intel_edp_psr_disable(intel_dp);
-                       else
-                               if (!intel_edp_is_psr_enabled(dev))
-                                       intel_edp_psr_do_enable(intel_dp);
-               }
+       /*
+        * The delayed work can race with an invalidate hence we need to
+        * recheck. Since psr_flush first clears this and then reschedules we
+        * won't ever miss a flush when bailing out here.
+        */
+       if (dev_priv->psr.busy_frontbuffer_bits)
+               goto unlock;
+
+       intel_edp_psr_do_enable(intel_dp);
+unlock:
+       mutex_unlock(&dev_priv->psr.lock);
+}
+
+static void intel_edp_psr_do_exit(struct drm_device *dev)
+{
+       struct drm_i915_private *dev_priv = dev->dev_private;
+
+       if (dev_priv->psr.active) {
+               u32 val = I915_READ(EDP_PSR_CTL(dev));
+
+               WARN_ON(!(val & EDP_PSR_ENABLE));
+
+               I915_WRITE(EDP_PSR_CTL(dev), val & ~EDP_PSR_ENABLE);
+
+               dev_priv->psr.active = false;
+       }
+
+}
+
+void intel_edp_psr_invalidate(struct drm_device *dev,
+                             unsigned frontbuffer_bits)
+{
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_crtc *crtc;
+       enum pipe pipe;
+
+       mutex_lock(&dev_priv->psr.lock);
+       if (!dev_priv->psr.enabled) {
+               mutex_unlock(&dev_priv->psr.lock);
+               return;
+       }
+
+       crtc = dp_to_dig_port(dev_priv->psr.enabled)->base.base.crtc;
+       pipe = to_intel_crtc(crtc)->pipe;
+
+       intel_edp_psr_do_exit(dev);
+
+       frontbuffer_bits &= INTEL_FRONTBUFFER_ALL_MASK(pipe);
+
+       dev_priv->psr.busy_frontbuffer_bits |= frontbuffer_bits;
+       mutex_unlock(&dev_priv->psr.lock);
+}
+
+void intel_edp_psr_flush(struct drm_device *dev,
+                        unsigned frontbuffer_bits)
+{
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_crtc *crtc;
+       enum pipe pipe;
+
+       mutex_lock(&dev_priv->psr.lock);
+       if (!dev_priv->psr.enabled) {
+               mutex_unlock(&dev_priv->psr.lock);
+               return;
+       }
+
+       crtc = dp_to_dig_port(dev_priv->psr.enabled)->base.base.crtc;
+       pipe = to_intel_crtc(crtc)->pipe;
+       dev_priv->psr.busy_frontbuffer_bits &= ~frontbuffer_bits;
+
+       /*
+        * On Haswell sprite plane updates don't result in a psr invalidating
+        * signal in the hardware. Which means we need to manually fake this in
+        * software for all flushes, not just when we've seen a preceding
+        * invalidation through frontbuffer rendering.
+        */
+       if (IS_HASWELL(dev) &&
+           (frontbuffer_bits & INTEL_FRONTBUFFER_SPRITE(pipe)))
+               intel_edp_psr_do_exit(dev);
+
+       if (!dev_priv->psr.active && !dev_priv->psr.busy_frontbuffer_bits)
+               schedule_delayed_work(&dev_priv->psr.work,
+                                     msecs_to_jiffies(100));
+       mutex_unlock(&dev_priv->psr.lock);
+}
+
+void intel_edp_psr_init(struct drm_device *dev)
+{
+       struct drm_i915_private *dev_priv = dev->dev_private;
+
+       INIT_DELAYED_WORK(&dev_priv->psr.work, intel_edp_psr_work);
+       mutex_init(&dev_priv->psr.lock);
 }
 
 static void intel_disable_dp(struct intel_encoder *encoder)
@@ -2152,6 +2282,70 @@ static void chv_pre_enable_dp(struct intel_encoder *encoder)
        vlv_wait_port_ready(dev_priv, dport);
 }
 
+static void chv_dp_pre_pll_enable(struct intel_encoder *encoder)
+{
+       struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
+       struct drm_device *dev = encoder->base.dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct intel_crtc *intel_crtc =
+               to_intel_crtc(encoder->base.crtc);
+       enum dpio_channel ch = vlv_dport_to_channel(dport);
+       enum pipe pipe = intel_crtc->pipe;
+       u32 val;
+
+       mutex_lock(&dev_priv->dpio_lock);
+
+       /* program left/right clock distribution */
+       if (pipe != PIPE_B) {
+               val = vlv_dpio_read(dev_priv, pipe, _CHV_CMN_DW5_CH0);
+               val &= ~(CHV_BUFLEFTENA1_MASK | CHV_BUFRIGHTENA1_MASK);
+               if (ch == DPIO_CH0)
+                       val |= CHV_BUFLEFTENA1_FORCE;
+               if (ch == DPIO_CH1)
+                       val |= CHV_BUFRIGHTENA1_FORCE;
+               vlv_dpio_write(dev_priv, pipe, _CHV_CMN_DW5_CH0, val);
+       } else {
+               val = vlv_dpio_read(dev_priv, pipe, _CHV_CMN_DW1_CH1);
+               val &= ~(CHV_BUFLEFTENA2_MASK | CHV_BUFRIGHTENA2_MASK);
+               if (ch == DPIO_CH0)
+                       val |= CHV_BUFLEFTENA2_FORCE;
+               if (ch == DPIO_CH1)
+                       val |= CHV_BUFRIGHTENA2_FORCE;
+               vlv_dpio_write(dev_priv, pipe, _CHV_CMN_DW1_CH1, val);
+       }
+
+       /* program clock channel usage */
+       val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW8(ch));
+       val |= CHV_PCS_USEDCLKCHANNEL_OVRRIDE;
+       if (pipe != PIPE_B)
+               val &= ~CHV_PCS_USEDCLKCHANNEL;
+       else
+               val |= CHV_PCS_USEDCLKCHANNEL;
+       vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW8(ch), val);
+
+       val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW8(ch));
+       val |= CHV_PCS_USEDCLKCHANNEL_OVRRIDE;
+       if (pipe != PIPE_B)
+               val &= ~CHV_PCS_USEDCLKCHANNEL;
+       else
+               val |= CHV_PCS_USEDCLKCHANNEL;
+       vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW8(ch), val);
+
+       /*
+        * This a a bit weird since generally CL
+        * matches the pipe, but here we need to
+        * pick the CL based on the port.
+        */
+       val = vlv_dpio_read(dev_priv, pipe, CHV_CMN_DW19(ch));
+       if (pipe != PIPE_B)
+               val &= ~CHV_CMN_USEDCLKCHANNEL;
+       else
+               val |= CHV_CMN_USEDCLKCHANNEL;
+       vlv_dpio_write(dev_priv, pipe, CHV_CMN_DW19(ch), val);
+
+       mutex_unlock(&dev_priv->dpio_lock);
+}
+
 /*
  * Native read with retry for link status and receiver capability reads for
  * cases where the sink may still be asleep.
@@ -2189,18 +2383,14 @@ intel_dp_get_link_status(struct intel_dp *intel_dp, uint8_t link_status[DP_LINK_
                                       DP_LINK_STATUS_SIZE) == DP_LINK_STATUS_SIZE;
 }
 
-/*
- * These are source-specific values; current Intel hardware supports
- * a maximum voltage of 800mV and a maximum pre-emphasis of 6dB
- */
-
+/* These are source-specific values. */
 static uint8_t
 intel_dp_voltage_max(struct intel_dp *intel_dp)
 {
        struct drm_device *dev = intel_dp_to_dev(intel_dp);
        enum port port = dp_to_dig_port(intel_dp)->port;
 
-       if (IS_VALLEYVIEW(dev) || IS_BROADWELL(dev))
+       if (IS_VALLEYVIEW(dev))
                return DP_TRAIN_VOLTAGE_SWING_1200;
        else if (IS_GEN7(dev) && port == PORT_A)
                return DP_TRAIN_VOLTAGE_SWING_800;
@@ -2216,18 +2406,7 @@ intel_dp_pre_emphasis_max(struct intel_dp *intel_dp, uint8_t voltage_swing)
        struct drm_device *dev = intel_dp_to_dev(intel_dp);
        enum port port = dp_to_dig_port(intel_dp)->port;
 
-       if (IS_BROADWELL(dev)) {
-               switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) {
-               case DP_TRAIN_VOLTAGE_SWING_400:
-               case DP_TRAIN_VOLTAGE_SWING_600:
-                       return DP_TRAIN_PRE_EMPHASIS_6;
-               case DP_TRAIN_VOLTAGE_SWING_800:
-                       return DP_TRAIN_PRE_EMPHASIS_3_5;
-               case DP_TRAIN_VOLTAGE_SWING_1200:
-               default:
-                       return DP_TRAIN_PRE_EMPHASIS_0;
-               }
-       } else if (IS_HASWELL(dev)) {
+       if (IS_HASWELL(dev) || IS_BROADWELL(dev)) {
                switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) {
                case DP_TRAIN_VOLTAGE_SWING_400:
                        return DP_TRAIN_PRE_EMPHASIS_9_5;
@@ -2699,41 +2878,6 @@ intel_hsw_signal_levels(uint8_t train_set)
        }
 }
 
-static uint32_t
-intel_bdw_signal_levels(uint8_t train_set)
-{
-       int signal_levels = train_set & (DP_TRAIN_VOLTAGE_SWING_MASK |
-                                        DP_TRAIN_PRE_EMPHASIS_MASK);
-       switch (signal_levels) {
-       case DP_TRAIN_VOLTAGE_SWING_400 | DP_TRAIN_PRE_EMPHASIS_0:
-               return DDI_BUF_EMP_400MV_0DB_BDW;       /* Sel0 */
-       case DP_TRAIN_VOLTAGE_SWING_400 | DP_TRAIN_PRE_EMPHASIS_3_5:
-               return DDI_BUF_EMP_400MV_3_5DB_BDW;     /* Sel1 */
-       case DP_TRAIN_VOLTAGE_SWING_400 | DP_TRAIN_PRE_EMPHASIS_6:
-               return DDI_BUF_EMP_400MV_6DB_BDW;       /* Sel2 */
-
-       case DP_TRAIN_VOLTAGE_SWING_600 | DP_TRAIN_PRE_EMPHASIS_0:
-               return DDI_BUF_EMP_600MV_0DB_BDW;       /* Sel3 */
-       case DP_TRAIN_VOLTAGE_SWING_600 | DP_TRAIN_PRE_EMPHASIS_3_5:
-               return DDI_BUF_EMP_600MV_3_5DB_BDW;     /* Sel4 */
-       case DP_TRAIN_VOLTAGE_SWING_600 | DP_TRAIN_PRE_EMPHASIS_6:
-               return DDI_BUF_EMP_600MV_6DB_BDW;       /* Sel5 */
-
-       case DP_TRAIN_VOLTAGE_SWING_800 | DP_TRAIN_PRE_EMPHASIS_0:
-               return DDI_BUF_EMP_800MV_0DB_BDW;       /* Sel6 */
-       case DP_TRAIN_VOLTAGE_SWING_800 | DP_TRAIN_PRE_EMPHASIS_3_5:
-               return DDI_BUF_EMP_800MV_3_5DB_BDW;     /* Sel7 */
-
-       case DP_TRAIN_VOLTAGE_SWING_1200 | DP_TRAIN_PRE_EMPHASIS_0:
-               return DDI_BUF_EMP_1200MV_0DB_BDW;      /* Sel8 */
-
-       default:
-               DRM_DEBUG_KMS("Unsupported voltage swing/pre-emphasis level:"
-                             "0x%x\n", signal_levels);
-               return DDI_BUF_EMP_400MV_0DB_BDW;       /* Sel0 */
-       }
-}
-
 /* Properly updates "DP" with the correct signal levels. */
 static void
 intel_dp_set_signal_levels(struct intel_dp *intel_dp, uint32_t *DP)
@@ -2744,10 +2888,7 @@ intel_dp_set_signal_levels(struct intel_dp *intel_dp, uint32_t *DP)
        uint32_t signal_levels, mask;
        uint8_t train_set = intel_dp->train_set[0];
 
-       if (IS_BROADWELL(dev)) {
-               signal_levels = intel_bdw_signal_levels(train_set);
-               mask = DDI_BUF_EMP_MASK;
-       } else if (IS_HASWELL(dev)) {
+       if (IS_HASWELL(dev) || IS_BROADWELL(dev)) {
                signal_levels = intel_hsw_signal_levels(train_set);
                mask = DDI_BUF_EMP_MASK;
        } else if (IS_CHERRYVIEW(dev)) {
@@ -3246,6 +3387,33 @@ intel_dp_probe_oui(struct intel_dp *intel_dp)
        edp_panel_vdd_off(intel_dp, false);
 }
 
+static bool
+intel_dp_probe_mst(struct intel_dp *intel_dp)
+{
+       u8 buf[1];
+
+       if (!intel_dp->can_mst)
+               return false;
+
+       if (intel_dp->dpcd[DP_DPCD_REV] < 0x12)
+               return false;
+
+       _edp_panel_vdd_on(intel_dp);
+       if (intel_dp_dpcd_read_wake(&intel_dp->aux, DP_MSTM_CAP, buf, 1)) {
+               if (buf[0] & DP_MST_CAP) {
+                       DRM_DEBUG_KMS("Sink is MST capable\n");
+                       intel_dp->is_mst = true;
+               } else {
+                       DRM_DEBUG_KMS("Sink is not MST capable\n");
+                       intel_dp->is_mst = false;
+               }
+       }
+       edp_panel_vdd_off(intel_dp, false);
+
+       drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr, intel_dp->is_mst);
+       return intel_dp->is_mst;
+}
+
 int intel_dp_sink_crc(struct intel_dp *intel_dp, u8 *crc)
 {
        struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
@@ -3283,6 +3451,20 @@ intel_dp_get_sink_irq(struct intel_dp *intel_dp, u8 *sink_irq_vector)
                                       sink_irq_vector, 1) == 1;
 }
 
+static bool
+intel_dp_get_sink_irq_esi(struct intel_dp *intel_dp, u8 *sink_irq_vector)
+{
+       int ret;
+
+       ret = intel_dp_dpcd_read_wake(&intel_dp->aux,
+                                            DP_SINK_COUNT_ESI,
+                                            sink_irq_vector, 14);
+       if (ret != 14)
+               return false;
+
+       return true;
+}
+
 static void
 intel_dp_handle_test_request(struct intel_dp *intel_dp)
 {
@@ -3290,6 +3472,63 @@ intel_dp_handle_test_request(struct intel_dp *intel_dp)
        drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_RESPONSE, DP_TEST_NAK);
 }
 
+static int
+intel_dp_check_mst_status(struct intel_dp *intel_dp)
+{
+       bool bret;
+
+       if (intel_dp->is_mst) {
+               u8 esi[16] = { 0 };
+               int ret = 0;
+               int retry;
+               bool handled;
+               bret = intel_dp_get_sink_irq_esi(intel_dp, esi);
+go_again:
+               if (bret == true) {
+
+                       /* check link status - esi[10] = 0x200c */
+                       if (intel_dp->active_mst_links && !drm_dp_channel_eq_ok(&esi[10], intel_dp->lane_count)) {
+                               DRM_DEBUG_KMS("channel EQ not ok, retraining\n");
+                               intel_dp_start_link_train(intel_dp);
+                               intel_dp_complete_link_train(intel_dp);
+                               intel_dp_stop_link_train(intel_dp);
+                       }
+
+                       DRM_DEBUG_KMS("got esi %02x %02x %02x\n", esi[0], esi[1], esi[2]);
+                       ret = drm_dp_mst_hpd_irq(&intel_dp->mst_mgr, esi, &handled);
+
+                       if (handled) {
+                               for (retry = 0; retry < 3; retry++) {
+                                       int wret;
+                                       wret = drm_dp_dpcd_write(&intel_dp->aux,
+                                                                DP_SINK_COUNT_ESI+1,
+                                                                &esi[1], 3);
+                                       if (wret == 3) {
+                                               break;
+                                       }
+                               }
+
+                               bret = intel_dp_get_sink_irq_esi(intel_dp, esi);
+                               if (bret == true) {
+                                       DRM_DEBUG_KMS("got esi2 %02x %02x %02x\n", esi[0], esi[1], esi[2]);
+                                       goto go_again;
+                               }
+                       } else
+                               ret = 0;
+
+                       return ret;
+               } else {
+                       struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
+                       DRM_DEBUG_KMS("failed to get ESI - device may have failed\n");
+                       intel_dp->is_mst = false;
+                       drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr, intel_dp->is_mst);
+                       /* send a hotplug event */
+                       drm_kms_helper_hotplug_event(intel_dig_port->base.base.dev);
+               }
+       }
+       return -EINVAL;
+}
+
 /*
  * According to DP spec
  * 5.1.2:
@@ -3298,15 +3537,16 @@ intel_dp_handle_test_request(struct intel_dp *intel_dp)
  *  3. Use Link Training from 2.5.3.3 and 3.5.1.3
  *  4. Check link status on receipt of hot-plug interrupt
  */
-
 void
 intel_dp_check_link_status(struct intel_dp *intel_dp)
 {
+       struct drm_device *dev = intel_dp_to_dev(intel_dp);
        struct intel_encoder *intel_encoder = &dp_to_dig_port(intel_dp)->base;
        u8 sink_irq_vector;
        u8 link_status[DP_LINK_STATUS_SIZE];
 
-       /* FIXME: This access isn't protected by any locks. */
+       WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex));
+
        if (!intel_encoder->connectors_active)
                return;
 
@@ -3518,8 +3758,7 @@ intel_dp_detect(struct drm_connector *connector, bool force)
        enum drm_connector_status status;
        enum intel_display_power_domain power_domain;
        struct edid *edid = NULL;
-
-       intel_runtime_pm_get(dev_priv);
+       bool ret;
 
        power_domain = intel_display_port_power_domain(intel_encoder);
        intel_display_power_get(dev_priv, power_domain);
@@ -3527,6 +3766,14 @@ intel_dp_detect(struct drm_connector *connector, bool force)
        DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
                      connector->base.id, connector->name);
 
+       if (intel_dp->is_mst) {
+               /* MST devices are disconnected from a monitor POV */
+               if (intel_encoder->type != INTEL_OUTPUT_EDP)
+                       intel_encoder->type = INTEL_OUTPUT_DISPLAYPORT;
+               status = connector_status_disconnected;
+               goto out;
+       }
+
        intel_dp->has_audio = false;
 
        if (HAS_PCH_SPLIT(dev))
@@ -3539,6 +3786,16 @@ intel_dp_detect(struct drm_connector *connector, bool force)
 
        intel_dp_probe_oui(intel_dp);
 
+       ret = intel_dp_probe_mst(intel_dp);
+       if (ret) {
+               /* if we are in MST mode then this connector
+                  won't appear connected or have anything with EDID on it */
+               if (intel_encoder->type != INTEL_OUTPUT_EDP)
+                       intel_encoder->type = INTEL_OUTPUT_DISPLAYPORT;
+               status = connector_status_disconnected;
+               goto out;
+       }
+
        if (intel_dp->force_audio != HDMI_AUDIO_AUTO) {
                intel_dp->has_audio = (intel_dp->force_audio == HDMI_AUDIO_ON);
        } else {
@@ -3555,9 +3812,6 @@ intel_dp_detect(struct drm_connector *connector, bool force)
 
 out:
        intel_display_power_put(dev_priv, power_domain);
-
-       intel_runtime_pm_put(dev_priv);
-
        return status;
 }
 
@@ -3734,6 +3988,7 @@ void intel_dp_encoder_destroy(struct drm_encoder *encoder)
        struct drm_device *dev = intel_dp_to_dev(intel_dp);
 
        drm_dp_aux_unregister(&intel_dp->aux);
+       intel_dp_mst_encoder_cleanup(intel_dig_port);
        drm_encoder_cleanup(encoder);
        if (is_edp(intel_dp)) {
                cancel_delayed_work_sync(&intel_dp->panel_vdd_work);
@@ -3748,6 +4003,11 @@ void intel_dp_encoder_destroy(struct drm_encoder *encoder)
        kfree(intel_dig_port);
 }
 
+static void intel_dp_encoder_reset(struct drm_encoder *encoder)
+{
+       intel_edp_panel_vdd_sanitize(to_intel_encoder(encoder));
+}
+
 static const struct drm_connector_funcs intel_dp_connector_funcs = {
        .dpms = intel_connector_dpms,
        .detect = intel_dp_detect,
@@ -3763,15 +4023,68 @@ static const struct drm_connector_helper_funcs intel_dp_connector_helper_funcs =
 };
 
 static const struct drm_encoder_funcs intel_dp_enc_funcs = {
+       .reset = intel_dp_encoder_reset,
        .destroy = intel_dp_encoder_destroy,
 };
 
-static void
+void
 intel_dp_hot_plug(struct intel_encoder *intel_encoder)
 {
-       struct intel_dp *intel_dp = enc_to_intel_dp(&intel_encoder->base);
+       return;
+}
+
+bool
+intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port, bool long_hpd)
+{
+       struct intel_dp *intel_dp = &intel_dig_port->dp;
+       struct drm_device *dev = intel_dig_port->base.base.dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       int ret;
+       if (intel_dig_port->base.type != INTEL_OUTPUT_EDP)
+               intel_dig_port->base.type = INTEL_OUTPUT_DISPLAYPORT;
+
+       DRM_DEBUG_KMS("got hpd irq on port %d - %s\n", intel_dig_port->port,
+                     long_hpd ? "long" : "short");
+
+       if (long_hpd) {
+               if (!ibx_digital_port_connected(dev_priv, intel_dig_port))
+                       goto mst_fail;
+
+               if (!intel_dp_get_dpcd(intel_dp)) {
+                       goto mst_fail;
+               }
+
+               intel_dp_probe_oui(intel_dp);
+
+               if (!intel_dp_probe_mst(intel_dp))
+                       goto mst_fail;
 
-       intel_dp_check_link_status(intel_dp);
+       } else {
+               if (intel_dp->is_mst) {
+                       ret = intel_dp_check_mst_status(intel_dp);
+                       if (ret == -EINVAL)
+                               goto mst_fail;
+               }
+
+               if (!intel_dp->is_mst) {
+                       /*
+                        * we'll check the link status via the normal hot plug path later -
+                        * but for short hpds we should check it now
+                        */
+                       drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
+                       intel_dp_check_link_status(intel_dp);
+                       drm_modeset_unlock(&dev->mode_config.connection_mutex);
+               }
+       }
+       return false;
+mst_fail:
+       /* if we were in MST mode, and device is not there get out of MST mode */
+       if (intel_dp->is_mst) {
+               DRM_DEBUG_KMS("MST device may have disappeared %d vs %d\n", intel_dp->is_mst, intel_dp->mst_mgr.mst_state);
+               intel_dp->is_mst = false;
+               drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr, intel_dp->is_mst);
+       }
+       return true;
 }
 
 /* Return which DP Port should be selected for Transcoder DP control */
@@ -3822,7 +4135,7 @@ bool intel_dp_is_edp(struct drm_device *dev, enum port port)
        return false;
 }
 
-static void
+void
 intel_dp_add_properties(struct intel_dp *intel_dp, struct drm_connector *connector)
 {
        struct intel_connector *intel_connector = to_intel_connector(connector);
@@ -4035,6 +4348,11 @@ void intel_dp_set_drrs_state(struct drm_device *dev, int refresh_rate)
                return;
        }
 
+       /*
+        * FIXME: This needs proper synchronization with psr state. But really
+        * hard to tell without seeing the user of this function of this code.
+        * Check locking and ordering once that lands.
+        */
        if (INTEL_INFO(dev)->gen < 8 && intel_edp_is_psr_enabled(dev)) {
                DRM_DEBUG_KMS("DRRS is disabled as PSR is enabled\n");
                return;
@@ -4138,6 +4456,32 @@ intel_dp_drrs_init(struct intel_digital_port *intel_dig_port,
        return downclock_mode;
 }
 
+void intel_edp_panel_vdd_sanitize(struct intel_encoder *intel_encoder)
+{
+       struct drm_device *dev = intel_encoder->base.dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct intel_dp *intel_dp;
+       enum intel_display_power_domain power_domain;
+
+       if (intel_encoder->type != INTEL_OUTPUT_EDP)
+               return;
+
+       intel_dp = enc_to_intel_dp(&intel_encoder->base);
+       if (!edp_have_panel_vdd(intel_dp))
+               return;
+       /*
+        * The VDD bit needs a power domain reference, so if the bit is
+        * already enabled when we boot or resume, grab this reference and
+        * schedule a vdd off, so we don't hold on to the reference
+        * indefinitely.
+        */
+       DRM_DEBUG_KMS("VDD left on by BIOS, adjusting state tracking\n");
+       power_domain = intel_display_port_power_domain(intel_encoder);
+       intel_display_power_get(dev_priv, power_domain);
+
+       edp_panel_vdd_schedule_off(intel_dp);
+}
+
 static bool intel_edp_init_connector(struct intel_dp *intel_dp,
                                     struct intel_connector *intel_connector,
                                     struct edp_power_seq *power_seq)
@@ -4158,13 +4502,7 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
        if (!is_edp(intel_dp))
                return true;
 
-       /* The VDD bit needs a power domain reference, so if the bit is already
-        * enabled when we boot, grab this reference. */
-       if (edp_have_panel_vdd(intel_dp)) {
-               enum intel_display_power_domain power_domain;
-               power_domain = intel_display_port_power_domain(intel_encoder);
-               intel_display_power_get(dev_priv, power_domain);
-       }
+       intel_edp_panel_vdd_sanitize(intel_encoder);
 
        /* Cache DPCD and EDID for edp. */
        intel_edp_panel_vdd_on(intel_dp);
@@ -4288,7 +4626,7 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
                          edp_panel_vdd_work);
 
        intel_connector_attach_encoder(intel_connector, intel_encoder);
-       drm_sysfs_connector_add(connector);
+       drm_connector_register(connector);
 
        if (HAS_DDI(dev))
                intel_connector->get_hw_state = intel_ddi_connector_get_hw_state;
@@ -4321,7 +4659,12 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
 
        intel_dp_aux_init(intel_dp, intel_connector);
 
-       intel_dp->psr_setup_done = false;
+       /* init MST on ports that can support it */
+       if (IS_HASWELL(dev) || IS_BROADWELL(dev)) {
+               if (port == PORT_B || port == PORT_C || port == PORT_D) {
+                       intel_dp_mst_encoder_init(intel_dig_port, intel_connector->base.base.id);
+               }
+       }
 
        if (!intel_edp_init_connector(intel_dp, intel_connector, &power_seq)) {
                drm_dp_aux_unregister(&intel_dp->aux);
@@ -4331,7 +4674,7 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
                        edp_panel_vdd_off_sync(intel_dp);
                        drm_modeset_unlock(&dev->mode_config.connection_mutex);
                }
-               drm_sysfs_connector_remove(connector);
+               drm_connector_unregister(connector);
                drm_connector_cleanup(connector);
                return false;
        }
@@ -4353,6 +4696,7 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
 void
 intel_dp_init(struct drm_device *dev, int output_reg, enum port port)
 {
+       struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_digital_port *intel_dig_port;
        struct intel_encoder *intel_encoder;
        struct drm_encoder *encoder;
@@ -4379,6 +4723,7 @@ intel_dp_init(struct drm_device *dev, int output_reg, enum port port)
        intel_encoder->get_hw_state = intel_dp_get_hw_state;
        intel_encoder->get_config = intel_dp_get_config;
        if (IS_CHERRYVIEW(dev)) {
+               intel_encoder->pre_pll_enable = chv_dp_pre_pll_enable;
                intel_encoder->pre_enable = chv_pre_enable_dp;
                intel_encoder->enable = vlv_enable_dp;
                intel_encoder->post_disable = chv_post_disable_dp;
@@ -4408,9 +4753,55 @@ intel_dp_init(struct drm_device *dev, int output_reg, enum port port)
        intel_encoder->cloneable = 0;
        intel_encoder->hot_plug = intel_dp_hot_plug;
 
+       intel_dig_port->hpd_pulse = intel_dp_hpd_pulse;
+       dev_priv->hpd_irq_port[port] = intel_dig_port;
+
        if (!intel_dp_init_connector(intel_dig_port, intel_connector)) {
                drm_encoder_cleanup(encoder);
                kfree(intel_dig_port);
                kfree(intel_connector);
        }
 }
+
+void intel_dp_mst_suspend(struct drm_device *dev)
+{
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       int i;
+
+       /* disable MST */
+       for (i = 0; i < I915_MAX_PORTS; i++) {
+               struct intel_digital_port *intel_dig_port = dev_priv->hpd_irq_port[i];
+               if (!intel_dig_port)
+                       continue;
+
+               if (intel_dig_port->base.type == INTEL_OUTPUT_DISPLAYPORT) {
+                       if (!intel_dig_port->dp.can_mst)
+                               continue;
+                       if (intel_dig_port->dp.is_mst)
+                               drm_dp_mst_topology_mgr_suspend(&intel_dig_port->dp.mst_mgr);
+               }
+       }
+}
+
+void intel_dp_mst_resume(struct drm_device *dev)
+{
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       int i;
+
+       for (i = 0; i < I915_MAX_PORTS; i++) {
+               struct intel_digital_port *intel_dig_port = dev_priv->hpd_irq_port[i];
+               if (!intel_dig_port)
+                       continue;
+               if (intel_dig_port->base.type == INTEL_OUTPUT_DISPLAYPORT) {
+                       int ret;
+
+                       if (!intel_dig_port->dp.can_mst)
+                               continue;
+
+                       ret = drm_dp_mst_topology_mgr_resume(&intel_dig_port->dp.mst_mgr);
+                       if (ret != 0) {
+                               intel_dp_check_mst_status(&intel_dig_port->dp);
+                       }
+               }
+       }
+}
diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c b/drivers/gpu/drm/i915/intel_dp_mst.c
new file mode 100644 (file)
index 0000000..d9a7a78
--- /dev/null
@@ -0,0 +1,548 @@
+/*
+ * Copyright © 2008 Intel Corporation
+ *             2014 Red Hat Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ *
+ */
+
+#include <drm/drmP.h>
+#include "i915_drv.h"
+#include "intel_drv.h"
+#include <drm/drm_crtc_helper.h>
+#include <drm/drm_edid.h>
+
+static bool intel_dp_mst_compute_config(struct intel_encoder *encoder,
+                                       struct intel_crtc_config *pipe_config)
+{
+       struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base);
+       struct intel_digital_port *intel_dig_port = intel_mst->primary;
+       struct intel_dp *intel_dp = &intel_dig_port->dp;
+       struct drm_device *dev = encoder->base.dev;
+       int bpp;
+       int lane_count, slots;
+       struct drm_display_mode *adjusted_mode = &pipe_config->adjusted_mode;
+       struct intel_connector *found = NULL, *intel_connector;
+       int mst_pbn;
+
+       pipe_config->dp_encoder_is_mst = true;
+       pipe_config->has_pch_encoder = false;
+       pipe_config->has_dp_encoder = true;
+       bpp = 24;
+       /*
+        * for MST we always configure max link bw - the spec doesn't
+        * seem to suggest we should do otherwise.
+        */
+       lane_count = drm_dp_max_lane_count(intel_dp->dpcd);
+       intel_dp->link_bw = intel_dp_max_link_bw(intel_dp);
+       intel_dp->lane_count = lane_count;
+
+       pipe_config->pipe_bpp = 24;
+       pipe_config->port_clock = drm_dp_bw_code_to_link_rate(intel_dp->link_bw);
+
+       list_for_each_entry(intel_connector, &dev->mode_config.connector_list, base.head) {
+               if (intel_connector->new_encoder == encoder) {
+                       found = intel_connector;
+                       break;
+               }
+       }
+
+       if (!found) {
+               DRM_ERROR("can't find connector\n");
+               return false;
+       }
+
+       mst_pbn = drm_dp_calc_pbn_mode(adjusted_mode->clock, bpp);
+
+       pipe_config->pbn = mst_pbn;
+       slots = drm_dp_find_vcpi_slots(&intel_dp->mst_mgr, mst_pbn);
+
+       intel_link_compute_m_n(bpp, lane_count,
+                              adjusted_mode->crtc_clock,
+                              pipe_config->port_clock,
+                              &pipe_config->dp_m_n);
+
+       pipe_config->dp_m_n.tu = slots;
+       return true;
+
+}
+
+static void intel_mst_disable_dp(struct intel_encoder *encoder)
+{
+       struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base);
+       struct intel_digital_port *intel_dig_port = intel_mst->primary;
+       struct intel_dp *intel_dp = &intel_dig_port->dp;
+       int ret;
+
+       DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links);
+
+       drm_dp_mst_reset_vcpi_slots(&intel_dp->mst_mgr, intel_mst->port);
+
+       ret = drm_dp_update_payload_part1(&intel_dp->mst_mgr);
+       if (ret) {
+               DRM_ERROR("failed to update payload %d\n", ret);
+       }
+}
+
+static void intel_mst_post_disable_dp(struct intel_encoder *encoder)
+{
+       struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base);
+       struct intel_digital_port *intel_dig_port = intel_mst->primary;
+       struct intel_dp *intel_dp = &intel_dig_port->dp;
+
+       DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links);
+
+       /* this can fail */
+       drm_dp_check_act_status(&intel_dp->mst_mgr);
+       /* and this can also fail */
+       drm_dp_update_payload_part2(&intel_dp->mst_mgr);
+
+       drm_dp_mst_deallocate_vcpi(&intel_dp->mst_mgr, intel_mst->port);
+
+       intel_dp->active_mst_links--;
+       intel_mst->port = NULL;
+       if (intel_dp->active_mst_links == 0) {
+               intel_dig_port->base.post_disable(&intel_dig_port->base);
+               intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_OFF);
+       }
+}
+
+static void intel_mst_pre_enable_dp(struct intel_encoder *encoder)
+{
+       struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base);
+       struct intel_digital_port *intel_dig_port = intel_mst->primary;
+       struct intel_dp *intel_dp = &intel_dig_port->dp;
+       struct drm_device *dev = encoder->base.dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       enum port port = intel_dig_port->port;
+       int ret;
+       uint32_t temp;
+       struct intel_connector *found = NULL, *intel_connector;
+       int slots;
+       struct drm_crtc *crtc = encoder->base.crtc;
+       struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
+
+       list_for_each_entry(intel_connector, &dev->mode_config.connector_list, base.head) {
+               if (intel_connector->new_encoder == encoder) {
+                       found = intel_connector;
+                       break;
+               }
+       }
+
+       if (!found) {
+               DRM_ERROR("can't find connector\n");
+               return;
+       }
+
+       DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links);
+       intel_mst->port = found->port;
+
+       if (intel_dp->active_mst_links == 0) {
+               enum port port = intel_ddi_get_encoder_port(encoder);
+
+               I915_WRITE(PORT_CLK_SEL(port), intel_crtc->config.ddi_pll_sel);
+
+               intel_ddi_init_dp_buf_reg(&intel_dig_port->base);
+
+               intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_ON);
+
+
+               intel_dp_start_link_train(intel_dp);
+               intel_dp_complete_link_train(intel_dp);
+               intel_dp_stop_link_train(intel_dp);
+       }
+
+       ret = drm_dp_mst_allocate_vcpi(&intel_dp->mst_mgr,
+                                      intel_mst->port, intel_crtc->config.pbn, &slots);
+       if (ret == false) {
+               DRM_ERROR("failed to allocate vcpi\n");
+               return;
+       }
+
+
+       intel_dp->active_mst_links++;
+       temp = I915_READ(DP_TP_STATUS(port));
+       I915_WRITE(DP_TP_STATUS(port), temp);
+
+       ret = drm_dp_update_payload_part1(&intel_dp->mst_mgr);
+}
+
+static void intel_mst_enable_dp(struct intel_encoder *encoder)
+{
+       struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base);
+       struct intel_digital_port *intel_dig_port = intel_mst->primary;
+       struct intel_dp *intel_dp = &intel_dig_port->dp;
+       struct drm_device *dev = intel_dig_port->base.base.dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       enum port port = intel_dig_port->port;
+       int ret;
+
+       DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links);
+
+       if (wait_for((I915_READ(DP_TP_STATUS(port)) & DP_TP_STATUS_ACT_SENT),
+                    1))
+               DRM_ERROR("Timed out waiting for ACT sent\n");
+
+       ret = drm_dp_check_act_status(&intel_dp->mst_mgr);
+
+       ret = drm_dp_update_payload_part2(&intel_dp->mst_mgr);
+}
+
+static bool intel_dp_mst_enc_get_hw_state(struct intel_encoder *encoder,
+                                     enum pipe *pipe)
+{
+       struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base);
+       *pipe = intel_mst->pipe;
+       if (intel_mst->port)
+               return true;
+       return false;
+}
+
+static void intel_dp_mst_enc_get_config(struct intel_encoder *encoder,
+                                       struct intel_crtc_config *pipe_config)
+{
+       struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base);
+       struct intel_digital_port *intel_dig_port = intel_mst->primary;
+       struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
+       struct drm_device *dev = encoder->base.dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       enum transcoder cpu_transcoder = crtc->config.cpu_transcoder;
+       u32 temp, flags = 0;
+
+       pipe_config->has_dp_encoder = true;
+
+       temp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
+       if (temp & TRANS_DDI_PHSYNC)
+               flags |= DRM_MODE_FLAG_PHSYNC;
+       else
+               flags |= DRM_MODE_FLAG_NHSYNC;
+       if (temp & TRANS_DDI_PVSYNC)
+               flags |= DRM_MODE_FLAG_PVSYNC;
+       else
+               flags |= DRM_MODE_FLAG_NVSYNC;
+
+       switch (temp & TRANS_DDI_BPC_MASK) {
+       case TRANS_DDI_BPC_6:
+               pipe_config->pipe_bpp = 18;
+               break;
+       case TRANS_DDI_BPC_8:
+               pipe_config->pipe_bpp = 24;
+               break;
+       case TRANS_DDI_BPC_10:
+               pipe_config->pipe_bpp = 30;
+               break;
+       case TRANS_DDI_BPC_12:
+               pipe_config->pipe_bpp = 36;
+               break;
+       default:
+               break;
+       }
+       pipe_config->adjusted_mode.flags |= flags;
+       intel_dp_get_m_n(crtc, pipe_config);
+
+       intel_ddi_clock_get(&intel_dig_port->base, pipe_config);
+}
+
+static int intel_dp_mst_get_ddc_modes(struct drm_connector *connector)
+{
+       struct intel_connector *intel_connector = to_intel_connector(connector);
+       struct intel_dp *intel_dp = intel_connector->mst_port;
+       struct edid *edid;
+       int ret;
+
+       edid = drm_dp_mst_get_edid(connector, &intel_dp->mst_mgr, intel_connector->port);
+       if (!edid)
+               return 0;
+
+       ret = intel_connector_update_modes(connector, edid);
+       kfree(edid);
+
+       return ret;
+}
+
+static enum drm_connector_status
+intel_mst_port_dp_detect(struct drm_connector *connector)
+{
+       struct intel_connector *intel_connector = to_intel_connector(connector);
+       struct intel_dp *intel_dp = intel_connector->mst_port;
+
+       return drm_dp_mst_detect_port(&intel_dp->mst_mgr, intel_connector->port);
+}
+
+static enum drm_connector_status
+intel_dp_mst_detect(struct drm_connector *connector, bool force)
+{
+       enum drm_connector_status status;
+       status = intel_mst_port_dp_detect(connector);
+       return status;
+}
+
+static int
+intel_dp_mst_set_property(struct drm_connector *connector,
+                         struct drm_property *property,
+                         uint64_t val)
+{
+       return 0;
+}
+
+static void
+intel_dp_mst_connector_destroy(struct drm_connector *connector)
+{
+       struct intel_connector *intel_connector = to_intel_connector(connector);
+
+       if (!IS_ERR_OR_NULL(intel_connector->edid))
+               kfree(intel_connector->edid);
+
+       drm_connector_cleanup(connector);
+       kfree(connector);
+}
+
+static const struct drm_connector_funcs intel_dp_mst_connector_funcs = {
+       .dpms = intel_connector_dpms,
+       .detect = intel_dp_mst_detect,
+       .fill_modes = drm_helper_probe_single_connector_modes,
+       .set_property = intel_dp_mst_set_property,
+       .destroy = intel_dp_mst_connector_destroy,
+};
+
+static int intel_dp_mst_get_modes(struct drm_connector *connector)
+{
+       return intel_dp_mst_get_ddc_modes(connector);
+}
+
+static enum drm_mode_status
+intel_dp_mst_mode_valid(struct drm_connector *connector,
+                       struct drm_display_mode *mode)
+{
+       /* TODO - validate mode against available PBN for link */
+       if (mode->clock < 10000)
+               return MODE_CLOCK_LOW;
+
+       if (mode->flags & DRM_MODE_FLAG_DBLCLK)
+               return MODE_H_ILLEGAL;
+
+       return MODE_OK;
+}
+
+static struct drm_encoder *intel_mst_best_encoder(struct drm_connector *connector)
+{
+       struct intel_connector *intel_connector = to_intel_connector(connector);
+       struct intel_dp *intel_dp = intel_connector->mst_port;
+       return &intel_dp->mst_encoders[0]->base.base;
+}
+
+static const struct drm_connector_helper_funcs intel_dp_mst_connector_helper_funcs = {
+       .get_modes = intel_dp_mst_get_modes,
+       .mode_valid = intel_dp_mst_mode_valid,
+       .best_encoder = intel_mst_best_encoder,
+};
+
+static void intel_dp_mst_encoder_destroy(struct drm_encoder *encoder)
+{
+       struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
+
+       drm_encoder_cleanup(encoder);
+       kfree(intel_mst);
+}
+
+static const struct drm_encoder_funcs intel_dp_mst_enc_funcs = {
+       .destroy = intel_dp_mst_encoder_destroy,
+};
+
+static bool intel_dp_mst_get_hw_state(struct intel_connector *connector)
+{
+       if (connector->encoder) {
+               enum pipe pipe;
+               if (!connector->encoder->get_hw_state(connector->encoder, &pipe))
+                       return false;
+               return true;
+       }
+       return false;
+}
+
+static void intel_connector_add_to_fbdev(struct intel_connector *connector)
+{
+#ifdef CONFIG_DRM_I915_FBDEV
+       struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
+       drm_fb_helper_add_one_connector(&dev_priv->fbdev->helper, &connector->base);
+#endif
+}
+
+static void intel_connector_remove_from_fbdev(struct intel_connector *connector)
+{
+#ifdef CONFIG_DRM_I915_FBDEV
+       struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
+       drm_fb_helper_remove_one_connector(&dev_priv->fbdev->helper, &connector->base);
+#endif
+}
+
+static struct drm_connector *intel_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port, char *pathprop)
+{
+       struct intel_dp *intel_dp = container_of(mgr, struct intel_dp, mst_mgr);
+       struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
+       struct drm_device *dev = intel_dig_port->base.base.dev;
+       struct intel_connector *intel_connector;
+       struct drm_connector *connector;
+       int i;
+
+       intel_connector = kzalloc(sizeof(*intel_connector), GFP_KERNEL);
+       if (!intel_connector)
+               return NULL;
+
+       connector = &intel_connector->base;
+       drm_connector_init(dev, connector, &intel_dp_mst_connector_funcs, DRM_MODE_CONNECTOR_DisplayPort);
+       drm_connector_helper_add(connector, &intel_dp_mst_connector_helper_funcs);
+
+       intel_connector->unregister = intel_connector_unregister;
+       intel_connector->get_hw_state = intel_dp_mst_get_hw_state;
+       intel_connector->mst_port = intel_dp;
+       intel_connector->port = port;
+
+       for (i = PIPE_A; i <= PIPE_C; i++) {
+               drm_mode_connector_attach_encoder(&intel_connector->base,
+                                                 &intel_dp->mst_encoders[i]->base.base);
+       }
+       intel_dp_add_properties(intel_dp, connector);
+
+       drm_object_attach_property(&connector->base, dev->mode_config.path_property, 0);
+       drm_mode_connector_set_path_property(connector, pathprop);
+       drm_reinit_primary_mode_group(dev);
+       mutex_lock(&dev->mode_config.mutex);
+       intel_connector_add_to_fbdev(intel_connector);
+       mutex_unlock(&dev->mode_config.mutex);
+       drm_connector_register(&intel_connector->base);
+       return connector;
+}
+
+static void intel_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
+                                          struct drm_connector *connector)
+{
+       struct intel_connector *intel_connector = to_intel_connector(connector);
+       struct drm_device *dev = connector->dev;
+       /* need to nuke the connector */
+       mutex_lock(&dev->mode_config.mutex);
+       intel_connector_dpms(connector, DRM_MODE_DPMS_OFF);
+       mutex_unlock(&dev->mode_config.mutex);
+
+       intel_connector->unregister(intel_connector);
+
+       mutex_lock(&dev->mode_config.mutex);
+       intel_connector_remove_from_fbdev(intel_connector);
+       drm_connector_cleanup(connector);
+       mutex_unlock(&dev->mode_config.mutex);
+
+       drm_reinit_primary_mode_group(dev);
+
+       kfree(intel_connector);
+       DRM_DEBUG_KMS("\n");
+}
+
+static void intel_dp_mst_hotplug(struct drm_dp_mst_topology_mgr *mgr)
+{
+       struct intel_dp *intel_dp = container_of(mgr, struct intel_dp, mst_mgr);
+       struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
+       struct drm_device *dev = intel_dig_port->base.base.dev;
+
+       drm_kms_helper_hotplug_event(dev);
+}
+
+static struct drm_dp_mst_topology_cbs mst_cbs = {
+       .add_connector = intel_dp_add_mst_connector,
+       .destroy_connector = intel_dp_destroy_mst_connector,
+       .hotplug = intel_dp_mst_hotplug,
+};
+
+static struct intel_dp_mst_encoder *
+intel_dp_create_fake_mst_encoder(struct intel_digital_port *intel_dig_port, enum pipe pipe)
+{
+       struct intel_dp_mst_encoder *intel_mst;
+       struct intel_encoder *intel_encoder;
+       struct drm_device *dev = intel_dig_port->base.base.dev;
+
+       intel_mst = kzalloc(sizeof(*intel_mst), GFP_KERNEL);
+
+       if (!intel_mst)
+               return NULL;
+
+       intel_mst->pipe = pipe;
+       intel_encoder = &intel_mst->base;
+       intel_mst->primary = intel_dig_port;
+
+       drm_encoder_init(dev, &intel_encoder->base, &intel_dp_mst_enc_funcs,
+                        DRM_MODE_ENCODER_DPMST);
+
+       intel_encoder->type = INTEL_OUTPUT_DP_MST;
+       intel_encoder->crtc_mask = 0x7;
+       intel_encoder->cloneable = 0;
+
+       intel_encoder->compute_config = intel_dp_mst_compute_config;
+       intel_encoder->disable = intel_mst_disable_dp;
+       intel_encoder->post_disable = intel_mst_post_disable_dp;
+       intel_encoder->pre_enable = intel_mst_pre_enable_dp;
+       intel_encoder->enable = intel_mst_enable_dp;
+       intel_encoder->get_hw_state = intel_dp_mst_enc_get_hw_state;
+       intel_encoder->get_config = intel_dp_mst_enc_get_config;
+
+       return intel_mst;
+
+}
+
+static bool
+intel_dp_create_fake_mst_encoders(struct intel_digital_port *intel_dig_port)
+{
+       int i;
+       struct intel_dp *intel_dp = &intel_dig_port->dp;
+
+       for (i = PIPE_A; i <= PIPE_C; i++)
+               intel_dp->mst_encoders[i] = intel_dp_create_fake_mst_encoder(intel_dig_port, i);
+       return true;
+}
+
+int
+intel_dp_mst_encoder_init(struct intel_digital_port *intel_dig_port, int conn_base_id)
+{
+       struct intel_dp *intel_dp = &intel_dig_port->dp;
+       struct drm_device *dev = intel_dig_port->base.base.dev;
+       int ret;
+
+       intel_dp->can_mst = true;
+       intel_dp->mst_mgr.cbs = &mst_cbs;
+
+       /* create encoders */
+       intel_dp_create_fake_mst_encoders(intel_dig_port);
+       ret = drm_dp_mst_topology_mgr_init(&intel_dp->mst_mgr, dev->dev, &intel_dp->aux, 16, 3, conn_base_id);
+       if (ret) {
+               intel_dp->can_mst = false;
+               return ret;
+       }
+       return 0;
+}
+
+void
+intel_dp_mst_encoder_cleanup(struct intel_digital_port *intel_dig_port)
+{
+       struct intel_dp *intel_dp = &intel_dig_port->dp;
+
+       if (!intel_dp->can_mst)
+               return;
+
+       drm_dp_mst_topology_mgr_destroy(&intel_dp->mst_mgr);
+       /* encoders will get killed by normal cleanup */
+}
index f67340ed2c12e57e5704c433cc70b5a495d4e08c..4b2664bd5b81d0afa2b59ae403c850549e2e5b10 100644 (file)
@@ -32,7 +32,7 @@
 #include <drm/drm_crtc.h>
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_fb_helper.h>
-#include <drm/drm_dp_helper.h>
+#include <drm/drm_dp_mst_helper.h>
 
 /**
  * _wait_for - magic (register) wait macro
 #define INTEL_OUTPUT_EDP 8
 #define INTEL_OUTPUT_DSI 9
 #define INTEL_OUTPUT_UNKNOWN 10
+#define INTEL_OUTPUT_DP_MST 11
 
 #define INTEL_DVO_CHIP_NONE 0
 #define INTEL_DVO_CHIP_LVDS 1
@@ -165,6 +166,7 @@ struct intel_panel {
        struct {
                bool present;
                u32 level;
+               u32 min;
                u32 max;
                bool enabled;
                bool combination_mode;  /* gen 2/4 only */
@@ -207,6 +209,10 @@ struct intel_connector {
        /* since POLL and HPD connectors may use the same HPD line keep the native
           state of connector->polled in case hotplug storm detection changes it */
        u8 polled;
+
+       void *port; /* store this opaque as its illegal to dereference it */
+
+       struct intel_dp *mst_port;
 };
 
 typedef struct dpll {
@@ -307,6 +313,9 @@ struct intel_crtc_config {
        /* Selected dpll when shared or DPLL_ID_PRIVATE. */
        enum intel_dpll_id shared_dpll;
 
+       /* PORT_CLK_SEL for DDI ports. */
+       uint32_t ddi_pll_sel;
+
        /* Actual register state of the dpll, for shared dpll cross-checking. */
        struct intel_dpll_hw_state dpll_hw_state;
 
@@ -338,6 +347,7 @@ struct intel_crtc_config {
                u32 pos;
                u32 size;
                bool enabled;
+               bool force_thru;
        } pch_pfit;
 
        /* FDI configuration, only valid if has_pch_encoder is set. */
@@ -347,6 +357,9 @@ struct intel_crtc_config {
        bool ips_enabled;
 
        bool double_wide;
+
+       bool dp_encoder_is_mst;
+       int pbn;
 };
 
 struct intel_pipe_wm {
@@ -358,6 +371,11 @@ struct intel_pipe_wm {
        bool sprites_scaled;
 };
 
+struct intel_mmio_flip {
+       u32 seqno;
+       u32 ring_id;
+};
+
 struct intel_crtc {
        struct drm_crtc base;
        enum pipe pipe;
@@ -384,7 +402,6 @@ struct intel_crtc {
 
        struct drm_i915_gem_object *cursor_bo;
        uint32_t cursor_addr;
-       int16_t cursor_x, cursor_y;
        int16_t cursor_width, cursor_height;
        uint32_t cursor_cntl;
        uint32_t cursor_base;
@@ -394,8 +411,6 @@ struct intel_crtc {
        struct intel_crtc_config *new_config;
        bool new_enabled;
 
-       uint32_t ddi_pll_sel;
-
        /* reset counter value when the last flip was submitted */
        unsigned int reset_counter;
 
@@ -412,10 +427,12 @@ struct intel_crtc {
        wait_queue_head_t vbl_wait;
 
        int scanline_offset;
+       struct intel_mmio_flip mmio_flip;
 };
 
 struct intel_plane_wm_parameters {
        uint32_t horiz_pixels;
+       uint32_t vert_pixels;
        uint8_t bytes_per_pixel;
        bool enabled;
        bool scaled;
@@ -428,7 +445,6 @@ struct intel_plane {
        struct drm_i915_gem_object *obj;
        bool can_scale;
        int max_downscale;
-       u32 lut_r[1024], lut_g[1024], lut_b[1024];
        int crtc_x, crtc_y;
        unsigned int crtc_w, crtc_h;
        uint32_t src_x, src_y;
@@ -481,6 +497,7 @@ struct cxsr_latency {
 #define to_intel_encoder(x) container_of(x, struct intel_encoder, base)
 #define to_intel_framebuffer(x) container_of(x, struct intel_framebuffer, base)
 #define to_intel_plane(x) container_of(x, struct intel_plane, base)
+#define intel_fb_obj(x) (x ? to_intel_framebuffer(x)->obj : NULL)
 
 struct intel_hdmi {
        u32 hdmi_reg;
@@ -491,6 +508,7 @@ struct intel_hdmi {
        bool has_audio;
        enum hdmi_force_audio force_audio;
        bool rgb_quant_range_selectable;
+       enum hdmi_picture_aspect aspect_ratio;
        void (*write_infoframe)(struct drm_encoder *encoder,
                                enum hdmi_infoframe_type type,
                                const void *frame, ssize_t len);
@@ -499,6 +517,7 @@ struct intel_hdmi {
                               struct drm_display_mode *adjusted_mode);
 };
 
+struct intel_dp_mst_encoder;
 #define DP_MAX_DOWNSTREAM_PORTS                0x10
 
 /**
@@ -537,12 +556,20 @@ struct intel_dp {
        unsigned long last_power_cycle;
        unsigned long last_power_on;
        unsigned long last_backlight_off;
-       bool psr_setup_done;
+
        struct notifier_block edp_notifier;
 
        bool use_tps3;
+       bool can_mst; /* this port supports mst */
+       bool is_mst;
+       int active_mst_links;
+       /* connector directly attached - won't be use for modeset in mst world */
        struct intel_connector *attached_connector;
 
+       /* mst connector list */
+       struct intel_dp_mst_encoder *mst_encoders[I915_MAX_PIPES];
+       struct drm_dp_mst_topology_mgr mst_mgr;
+
        uint32_t (*get_aux_clock_divider)(struct intel_dp *dp, int index);
        /*
         * This function returns the value we have to program the AUX_CTL
@@ -566,6 +593,14 @@ struct intel_digital_port {
        u32 saved_port_bits;
        struct intel_dp dp;
        struct intel_hdmi hdmi;
+       bool (*hpd_pulse)(struct intel_digital_port *, bool);
+};
+
+struct intel_dp_mst_encoder {
+       struct intel_encoder base;
+       enum pipe pipe;
+       struct intel_digital_port *primary;
+       void *port; /* store this opaque as its illegal to dereference it */
 };
 
 static inline int
@@ -652,6 +687,12 @@ enc_to_dig_port(struct drm_encoder *encoder)
        return container_of(encoder, struct intel_digital_port, base.base);
 }
 
+static inline struct intel_dp_mst_encoder *
+enc_to_mst(struct drm_encoder *encoder)
+{
+       return container_of(encoder, struct intel_dp_mst_encoder, base.base);
+}
+
 static inline struct intel_dp *enc_to_intel_dp(struct drm_encoder *encoder)
 {
        return &enc_to_dig_port(encoder)->dp;
@@ -676,17 +717,26 @@ bool intel_set_cpu_fifo_underrun_reporting(struct drm_device *dev,
 bool intel_set_pch_fifo_underrun_reporting(struct drm_device *dev,
                                           enum transcoder pch_transcoder,
                                           bool enable);
-void ilk_enable_gt_irq(struct drm_i915_private *dev_priv, uint32_t mask);
-void ilk_disable_gt_irq(struct drm_i915_private *dev_priv, uint32_t mask);
-void snb_enable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask);
-void snb_disable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask);
-void bdw_enable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask);
-void bdw_disable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask);
+void gen5_enable_gt_irq(struct drm_i915_private *dev_priv, uint32_t mask);
+void gen5_disable_gt_irq(struct drm_i915_private *dev_priv, uint32_t mask);
+void gen6_enable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask);
+void gen6_disable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask);
+void gen8_enable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask);
+void gen8_disable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask);
 void intel_runtime_pm_disable_interrupts(struct drm_device *dev);
 void intel_runtime_pm_restore_interrupts(struct drm_device *dev);
+static inline bool intel_irqs_enabled(struct drm_i915_private *dev_priv)
+{
+       /*
+        * We only use drm_irq_uninstall() at unload and VT switch, so
+        * this is the only thing we need to check.
+        */
+       return !dev_priv->pm._irqs_disabled;
+}
+
 int intel_get_crtc_scanline(struct intel_crtc *crtc);
 void i9xx_check_fifo_underruns(struct drm_device *dev);
-
+void gen8_irq_power_well_post_enable(struct drm_i915_private *dev_priv);
 
 /* intel_crt.c */
 void intel_crt_init(struct drm_device *dev);
@@ -705,10 +755,7 @@ void intel_ddi_disable_transcoder_func(struct drm_i915_private *dev_priv,
                                       enum transcoder cpu_transcoder);
 void intel_ddi_enable_pipe_clock(struct intel_crtc *intel_crtc);
 void intel_ddi_disable_pipe_clock(struct intel_crtc *intel_crtc);
-void intel_ddi_setup_hw_pll_state(struct drm_device *dev);
 bool intel_ddi_pll_select(struct intel_crtc *crtc);
-void intel_ddi_pll_enable(struct intel_crtc *crtc);
-void intel_ddi_put_crtc_pll(struct drm_crtc *crtc);
 void intel_ddi_set_pipe_settings(struct drm_crtc *crtc);
 void intel_ddi_prepare_link_retrain(struct drm_encoder *encoder);
 bool intel_ddi_connector_get_hw_state(struct intel_connector *intel_connector);
@@ -716,17 +763,46 @@ void intel_ddi_fdi_disable(struct drm_crtc *crtc);
 void intel_ddi_get_config(struct intel_encoder *encoder,
                          struct intel_crtc_config *pipe_config);
 
+void intel_ddi_init_dp_buf_reg(struct intel_encoder *encoder);
+void intel_ddi_clock_get(struct intel_encoder *encoder,
+                        struct intel_crtc_config *pipe_config);
+void intel_ddi_set_vc_payload_alloc(struct drm_crtc *crtc, bool state);
 
 /* intel_display.c */
 const char *intel_output_name(int output);
 bool intel_has_pending_fb_unpin(struct drm_device *dev);
 int intel_pch_rawclk(struct drm_device *dev);
-int valleyview_cur_cdclk(struct drm_i915_private *dev_priv);
 void intel_mark_busy(struct drm_device *dev);
-void intel_mark_fb_busy(struct drm_i915_gem_object *obj,
-                       struct intel_engine_cs *ring);
+void intel_fb_obj_invalidate(struct drm_i915_gem_object *obj,
+                            struct intel_engine_cs *ring);
+void intel_frontbuffer_flip_prepare(struct drm_device *dev,
+                                   unsigned frontbuffer_bits);
+void intel_frontbuffer_flip_complete(struct drm_device *dev,
+                                    unsigned frontbuffer_bits);
+void intel_frontbuffer_flush(struct drm_device *dev,
+                            unsigned frontbuffer_bits);
+/**
+ * intel_frontbuffer_flip - prepare frontbuffer flip
+ * @dev: DRM device
+ * @frontbuffer_bits: frontbuffer plane tracking bits
+ *
+ * This function gets called after scheduling a flip on @obj. This is for
+ * synchronous plane updates which will happen on the next vblank and which will
+ * not get delayed by pending gpu rendering.
+ *
+ * Can be called without any locks held.
+ */
+static inline
+void intel_frontbuffer_flip(struct drm_device *dev,
+                           unsigned frontbuffer_bits)
+{
+       intel_frontbuffer_flush(dev, frontbuffer_bits);
+}
+
+void intel_fb_obj_flush(struct drm_i915_gem_object *obj, bool retire);
 void intel_mark_idle(struct drm_device *dev);
 void intel_crtc_restore_mode(struct drm_crtc *crtc);
+void intel_crtc_control(struct drm_crtc *crtc, bool enable);
 void intel_crtc_update_dpms(struct drm_crtc *crtc);
 void intel_encoder_destroy(struct drm_encoder *encoder);
 void intel_connector_dpms(struct drm_connector *, int mode);
@@ -767,12 +843,18 @@ __intel_framebuffer_create(struct drm_device *dev,
 void intel_prepare_page_flip(struct drm_device *dev, int plane);
 void intel_finish_page_flip(struct drm_device *dev, int pipe);
 void intel_finish_page_flip_plane(struct drm_device *dev, int plane);
+
+/* shared dpll functions */
 struct intel_shared_dpll *intel_crtc_to_shared_dpll(struct intel_crtc *crtc);
 void assert_shared_dpll(struct drm_i915_private *dev_priv,
                        struct intel_shared_dpll *pll,
                        bool state);
 #define assert_shared_dpll_enabled(d, p) assert_shared_dpll(d, p, true)
 #define assert_shared_dpll_disabled(d, p) assert_shared_dpll(d, p, false)
+struct intel_shared_dpll *intel_get_shared_dpll(struct intel_crtc *crtc);
+void intel_put_shared_dpll(struct intel_crtc *crtc);
+
+/* modesetting asserts */
 void assert_pll(struct drm_i915_private *dev_priv,
                enum pipe pipe, bool state);
 #define assert_pll_enabled(d, p) assert_pll(d, p, true)
@@ -805,7 +887,6 @@ void hsw_disable_ips(struct intel_crtc *crtc);
 void intel_display_set_init_power(struct drm_i915_private *dev, bool enable);
 enum intel_display_power_domain
 intel_display_port_power_domain(struct intel_encoder *intel_encoder);
-int valleyview_get_vco(struct drm_i915_private *dev_priv);
 void intel_mode_from_pipe_config(struct drm_display_mode *mode,
                                 struct intel_crtc_config *pipe_config);
 int intel_format_to_fourcc(int format);
@@ -826,18 +907,34 @@ int intel_dp_sink_crc(struct intel_dp *intel_dp, u8 *crc);
 bool intel_dp_compute_config(struct intel_encoder *encoder,
                             struct intel_crtc_config *pipe_config);
 bool intel_dp_is_edp(struct drm_device *dev, enum port port);
+bool intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port,
+                       bool long_hpd);
 void intel_edp_backlight_on(struct intel_dp *intel_dp);
 void intel_edp_backlight_off(struct intel_dp *intel_dp);
 void intel_edp_panel_vdd_on(struct intel_dp *intel_dp);
+void intel_edp_panel_vdd_sanitize(struct intel_encoder *intel_encoder);
 void intel_edp_panel_on(struct intel_dp *intel_dp);
 void intel_edp_panel_off(struct intel_dp *intel_dp);
 void intel_edp_psr_enable(struct intel_dp *intel_dp);
 void intel_edp_psr_disable(struct intel_dp *intel_dp);
-void intel_edp_psr_update(struct drm_device *dev);
 void intel_dp_set_drrs_state(struct drm_device *dev, int refresh_rate);
-
+void intel_edp_psr_invalidate(struct drm_device *dev,
+                             unsigned frontbuffer_bits);
+void intel_edp_psr_flush(struct drm_device *dev,
+                        unsigned frontbuffer_bits);
+void intel_edp_psr_init(struct drm_device *dev);
+
+int intel_dp_handle_hpd_irq(struct intel_digital_port *digport, bool long_hpd);
+void intel_dp_add_properties(struct intel_dp *intel_dp, struct drm_connector *connector);
+void intel_dp_mst_suspend(struct drm_device *dev);
+void intel_dp_mst_resume(struct drm_device *dev);
+int intel_dp_max_link_bw(struct intel_dp *intel_dp);
+void intel_dp_hot_plug(struct intel_encoder *intel_encoder);
+/* intel_dp_mst.c */
+int intel_dp_mst_encoder_init(struct intel_digital_port *intel_dig_port, int conn_id);
+void intel_dp_mst_encoder_cleanup(struct intel_digital_port *intel_dig_port);
 /* intel_dsi.c */
-bool intel_dsi_init(struct drm_device *dev);
+void intel_dsi_init(struct drm_device *dev);
 
 
 /* intel_dvo.c */
@@ -920,8 +1017,8 @@ void intel_pch_panel_fitting(struct intel_crtc *crtc,
 void intel_gmch_panel_fitting(struct intel_crtc *crtc,
                              struct intel_crtc_config *pipe_config,
                              int fitting_mode);
-void intel_panel_set_backlight(struct intel_connector *connector, u32 level,
-                              u32 max);
+void intel_panel_set_backlight_acpi(struct intel_connector *connector,
+                                   u32 level, u32 max);
 int intel_panel_setup_backlight(struct drm_connector *connector);
 void intel_panel_enable_backlight(struct intel_connector *connector);
 void intel_panel_disable_backlight(struct intel_connector *connector);
@@ -940,7 +1037,9 @@ int ilk_wm_max_level(const struct drm_device *dev);
 void intel_update_watermarks(struct drm_crtc *crtc);
 void intel_update_sprite_watermarks(struct drm_plane *plane,
                                    struct drm_crtc *crtc,
-                                   uint32_t sprite_width, int pixel_size,
+                                   uint32_t sprite_width,
+                                   uint32_t sprite_height,
+                                   int pixel_size,
                                    bool enabled, bool scaled);
 void intel_init_pm(struct drm_device *dev);
 void intel_pm_setup(struct drm_device *dev);
@@ -963,6 +1062,7 @@ void intel_init_gt_powersave(struct drm_device *dev);
 void intel_cleanup_gt_powersave(struct drm_device *dev);
 void intel_enable_gt_powersave(struct drm_device *dev);
 void intel_disable_gt_powersave(struct drm_device *dev);
+void intel_suspend_gt_powersave(struct drm_device *dev);
 void intel_reset_gt_powersave(struct drm_device *dev);
 void ironlake_teardown_rc6(struct drm_device *dev);
 void gen6_update_ring_freq(struct drm_device *dev);
@@ -976,8 +1076,7 @@ void intel_runtime_pm_put(struct drm_i915_private *dev_priv);
 void intel_init_runtime_pm(struct drm_i915_private *dev_priv);
 void intel_fini_runtime_pm(struct drm_i915_private *dev_priv);
 void ilk_wm_get_hw_state(struct drm_device *dev);
-void __vlv_set_power_well(struct drm_i915_private *dev_priv,
-                         enum punit_power_well power_well_id, bool enable);
+
 
 /* intel_sdvo.c */
 bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, bool is_sdvob);
index 3fd082933c8795d986a1ed9e8339798a7b5c6282..670c29a7b5dd8e2a10867be9d742ace0e6ad3e11 100644 (file)
@@ -92,6 +92,9 @@ static bool intel_dsi_compute_config(struct intel_encoder *encoder,
        if (fixed_mode)
                intel_fixed_panel_mode(fixed_mode, adjusted_mode);
 
+       /* DSI uses short packets for sync events, so clear mode flags for DSI */
+       adjusted_mode->flags = 0;
+
        if (intel_dsi->dev.dev_ops->mode_fixup)
                return intel_dsi->dev.dev_ops->mode_fixup(&intel_dsi->dev,
                                                          mode, adjusted_mode);
@@ -152,6 +155,8 @@ static void intel_dsi_enable(struct intel_encoder *encoder)
                if (intel_dsi->dev.dev_ops->enable)
                        intel_dsi->dev.dev_ops->enable(&intel_dsi->dev);
 
+               wait_for_dsi_fifo_empty(intel_dsi);
+
                /* assert ip_tg_enable signal */
                temp = I915_READ(MIPI_PORT_CTRL(pipe)) & ~LANE_CONFIGURATION_MASK;
                temp = temp | intel_dsi->port_bits;
@@ -177,6 +182,10 @@ static void intel_dsi_pre_enable(struct intel_encoder *encoder)
        tmp |= DPLL_REFA_CLK_ENABLE_VLV;
        I915_WRITE(DPLL(pipe), tmp);
 
+       /* update the hw state for DPLL */
+       intel_crtc->config.dpll_hw_state.dpll = DPLL_INTEGRATED_CLOCK_VLV |
+                                               DPLL_REFA_CLK_ENABLE_VLV;
+
        tmp = I915_READ(DSPCLK_GATE_D);
        tmp |= DPOUNIT_CLOCK_GATE_DISABLE;
        I915_WRITE(DSPCLK_GATE_D, tmp);
@@ -192,6 +201,8 @@ static void intel_dsi_pre_enable(struct intel_encoder *encoder)
        if (intel_dsi->dev.dev_ops->send_otp_cmds)
                intel_dsi->dev.dev_ops->send_otp_cmds(&intel_dsi->dev);
 
+       wait_for_dsi_fifo_empty(intel_dsi);
+
        /* Enable port in pre-enable phase itself because as per hw team
         * recommendation, port should be enabled befor plane & pipe */
        intel_dsi_enable(encoder);
@@ -232,6 +243,8 @@ static void intel_dsi_disable(struct intel_encoder *encoder)
        DRM_DEBUG_KMS("\n");
 
        if (is_vid_mode(intel_dsi)) {
+               wait_for_dsi_fifo_empty(intel_dsi);
+
                /* de-assert ip_tg_enable signal */
                temp = I915_READ(MIPI_PORT_CTRL(pipe));
                I915_WRITE(MIPI_PORT_CTRL(pipe), temp & ~DPI_ENABLE);
@@ -261,6 +274,8 @@ static void intel_dsi_disable(struct intel_encoder *encoder)
         * some next enable sequence send turn on packet error is observed */
        if (intel_dsi->dev.dev_ops->disable)
                intel_dsi->dev.dev_ops->disable(&intel_dsi->dev);
+
+       wait_for_dsi_fifo_empty(intel_dsi);
 }
 
 static void intel_dsi_clear_device_ready(struct intel_encoder *encoder)
@@ -351,9 +366,21 @@ static bool intel_dsi_get_hw_state(struct intel_encoder *encoder,
 static void intel_dsi_get_config(struct intel_encoder *encoder,
                                 struct intel_crtc_config *pipe_config)
 {
+       u32 pclk;
        DRM_DEBUG_KMS("\n");
 
-       /* XXX: read flags, set to adjusted_mode */
+       /*
+        * DPLL_MD is not used in case of DSI, reading will get some default value
+        * set dpll_md = 0
+        */
+       pipe_config->dpll_hw_state.dpll_md = 0;
+
+       pclk = vlv_get_dsi_pclk(encoder, pipe_config->pipe_bpp);
+       if (!pclk)
+               return;
+
+       pipe_config->adjusted_mode.crtc_clock = pclk;
+       pipe_config->port_clock = pclk;
 }
 
 static enum drm_mode_status
@@ -658,7 +685,7 @@ static const struct drm_connector_funcs intel_dsi_connector_funcs = {
        .fill_modes = drm_helper_probe_single_connector_modes,
 };
 
-bool intel_dsi_init(struct drm_device *dev)
+void intel_dsi_init(struct drm_device *dev)
 {
        struct intel_dsi *intel_dsi;
        struct intel_encoder *intel_encoder;
@@ -674,29 +701,29 @@ bool intel_dsi_init(struct drm_device *dev)
 
        /* There is no detection method for MIPI so rely on VBT */
        if (!dev_priv->vbt.has_mipi)
-               return false;
+               return;
+
+       if (IS_VALLEYVIEW(dev)) {
+               dev_priv->mipi_mmio_base = VLV_MIPI_BASE;
+       } else {
+               DRM_ERROR("Unsupported Mipi device to reg base");
+               return;
+       }
 
        intel_dsi = kzalloc(sizeof(*intel_dsi), GFP_KERNEL);
        if (!intel_dsi)
-               return false;
+               return;
 
        intel_connector = kzalloc(sizeof(*intel_connector), GFP_KERNEL);
        if (!intel_connector) {
                kfree(intel_dsi);
-               return false;
+               return;
        }
 
        intel_encoder = &intel_dsi->base;
        encoder = &intel_encoder->base;
        intel_dsi->attached_connector = intel_connector;
 
-       if (IS_VALLEYVIEW(dev)) {
-               dev_priv->mipi_mmio_base = VLV_MIPI_BASE;
-       } else {
-               DRM_ERROR("Unsupported Mipi device to reg base");
-               return false;
-       }
-
        connector = &intel_connector->base;
 
        drm_encoder_init(dev, encoder, &intel_dsi_funcs, DRM_MODE_ENCODER_DSI);
@@ -743,7 +770,7 @@ bool intel_dsi_init(struct drm_device *dev)
 
        intel_connector_attach_encoder(intel_connector, intel_encoder);
 
-       drm_sysfs_connector_add(connector);
+       drm_connector_register(connector);
 
        fixed_mode = dsi->dev_ops->get_modes(&intel_dsi->dev);
        if (!fixed_mode) {
@@ -754,12 +781,10 @@ bool intel_dsi_init(struct drm_device *dev)
        fixed_mode->type |= DRM_MODE_TYPE_PREFERRED;
        intel_panel_init(&intel_connector->panel, fixed_mode, NULL);
 
-       return true;
+       return;
 
 err:
        drm_encoder_cleanup(&intel_encoder->base);
        kfree(intel_dsi);
        kfree(intel_connector);
-
-       return false;
 }
index 31db33d3e5cc5d0616d36d69a6230ba7fe496d40..fd51867fd0d3157ef849f4f50367e92865932f77 100644 (file)
@@ -132,6 +132,7 @@ static inline struct intel_dsi *enc_to_intel_dsi(struct drm_encoder *encoder)
 
 extern void vlv_enable_dsi_pll(struct intel_encoder *encoder);
 extern void vlv_disable_dsi_pll(struct intel_encoder *encoder);
+extern u32 vlv_get_dsi_pclk(struct intel_encoder *encoder, int pipe_bpp);
 
 extern struct intel_dsi_dev_ops vbt_generic_dsi_display_ops;
 
index 933c86305237bb4319dd1e689c2e8c05f7da1c65..7f1430ac8543617e5cc1788c98be97836ef85771 100644 (file)
@@ -419,3 +419,19 @@ int dpi_send_cmd(struct intel_dsi *intel_dsi, u32 cmd, bool hs)
 
        return 0;
 }
+
+void wait_for_dsi_fifo_empty(struct intel_dsi *intel_dsi)
+{
+       struct drm_encoder *encoder = &intel_dsi->base.base;
+       struct drm_device *dev = encoder->dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
+       enum pipe pipe = intel_crtc->pipe;
+       u32 mask;
+
+       mask = LP_CTRL_FIFO_EMPTY | HS_CTRL_FIFO_EMPTY |
+                                       LP_DATA_FIFO_EMPTY | HS_DATA_FIFO_EMPTY;
+
+       if (wait_for((I915_READ(MIPI_GEN_FIFO_STAT(pipe)) & mask) == mask, 100))
+               DRM_ERROR("DPI FIFOs are not empty\n");
+}
index 9a18cbfa546010320826013c956f53c8c9eb0d02..46aa1acc00eba5587f9e1cd2c3e1228a6a6c7d5b 100644 (file)
@@ -51,6 +51,7 @@ int dsi_vc_generic_read(struct intel_dsi *intel_dsi, int channel,
                        u8 *reqdata, int reqlen, u8 *buf, int buflen);
 
 int dpi_send_cmd(struct intel_dsi *intel_dsi, u32 cmd, bool hs);
+void wait_for_dsi_fifo_empty(struct intel_dsi *intel_dsi);
 
 /* XXX: questionable write helpers */
 static inline int dsi_vc_dcs_write_0(struct intel_dsi *intel_dsi,
index 21a0d348cedc2a716e79105557215a1736d2ac76..47c7584a4aa0336938bb1150cc141e0e1063bfee 100644 (file)
@@ -143,7 +143,7 @@ static u8 *mipi_exec_send_packet(struct intel_dsi *intel_dsi, u8 *data)
        case MIPI_DSI_DCS_LONG_WRITE:
                dsi_vc_dcs_write(intel_dsi, vc, data, len);
                break;
-       };
+       }
 
        data += len;
 
@@ -294,7 +294,8 @@ static bool generic_init(struct intel_dsi_device *dsi)
        intel_dsi->rst_timer_val = mipi_config->device_reset_timer;
        intel_dsi->init_count = mipi_config->master_init_timer;
        intel_dsi->bw_timer = mipi_config->dbi_bw_timer;
-       intel_dsi->video_frmt_cfg_bits = mipi_config->bta_enabled ? DISABLE_VIDEO_BTA : 0;
+       intel_dsi->video_frmt_cfg_bits =
+               mipi_config->bta_enabled ? DISABLE_VIDEO_BTA : 0;
 
        switch (intel_dsi->escape_clk_div) {
        case 0:
@@ -351,7 +352,8 @@ static bool generic_init(struct intel_dsi_device *dsi)
         *
         * prepare count
         */
-       ths_prepare_ns = max(mipi_config->ths_prepare, mipi_config->tclk_prepare);
+       ths_prepare_ns = max(mipi_config->ths_prepare,
+                            mipi_config->tclk_prepare);
        prepare_cnt = DIV_ROUND_UP(ths_prepare_ns * ui_den, ui_num * 2);
 
        /* exit zero count */
index ba79ec19da3b8ce8d4379df2545c1ea54c3a8f3e..d8bb1ea2f0da5a4be3a7b097cfe9b79bad954795 100644 (file)
@@ -298,3 +298,84 @@ void vlv_disable_dsi_pll(struct intel_encoder *encoder)
 
        mutex_unlock(&dev_priv->dpio_lock);
 }
+
+static void assert_bpp_mismatch(int pixel_format, int pipe_bpp)
+{
+       int bpp;
+
+       switch (pixel_format) {
+       default:
+       case VID_MODE_FORMAT_RGB888:
+       case VID_MODE_FORMAT_RGB666_LOOSE:
+               bpp = 24;
+               break;
+       case VID_MODE_FORMAT_RGB666:
+               bpp = 18;
+               break;
+       case VID_MODE_FORMAT_RGB565:
+               bpp = 16;
+               break;
+       }
+
+       WARN(bpp != pipe_bpp,
+               "bpp match assertion failure (expected %d, current %d)\n",
+               bpp, pipe_bpp);
+}
+
+u32 vlv_get_dsi_pclk(struct intel_encoder *encoder, int pipe_bpp)
+{
+       struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
+       struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
+       u32 dsi_clock, pclk;
+       u32 pll_ctl, pll_div;
+       u32 m = 0, p = 0;
+       int refclk = 25000;
+       int i;
+
+       DRM_DEBUG_KMS("\n");
+
+       mutex_lock(&dev_priv->dpio_lock);
+       pll_ctl = vlv_cck_read(dev_priv, CCK_REG_DSI_PLL_CONTROL);
+       pll_div = vlv_cck_read(dev_priv, CCK_REG_DSI_PLL_DIVIDER);
+       mutex_unlock(&dev_priv->dpio_lock);
+
+       /* mask out other bits and extract the P1 divisor */
+       pll_ctl &= DSI_PLL_P1_POST_DIV_MASK;
+       pll_ctl = pll_ctl >> (DSI_PLL_P1_POST_DIV_SHIFT - 2);
+
+       /* mask out the other bits and extract the M1 divisor */
+       pll_div &= DSI_PLL_M1_DIV_MASK;
+       pll_div = pll_div >> DSI_PLL_M1_DIV_SHIFT;
+
+       while (pll_ctl) {
+               pll_ctl = pll_ctl >> 1;
+               p++;
+       }
+       p--;
+
+       if (!p) {
+               DRM_ERROR("wrong P1 divisor\n");
+               return 0;
+       }
+
+       for (i = 0; i < ARRAY_SIZE(lfsr_converts); i++) {
+               if (lfsr_converts[i] == pll_div)
+                       break;
+       }
+
+       if (i == ARRAY_SIZE(lfsr_converts)) {
+               DRM_ERROR("wrong m_seed programmed\n");
+               return 0;
+       }
+
+       m = i + 62;
+
+       dsi_clock = (m * refclk) / p;
+
+       /* pixel_format and pipe_bpp should agree */
+       assert_bpp_mismatch(intel_dsi->pixel_format, pipe_bpp);
+
+       pclk = DIV_ROUND_CLOSEST(dsi_clock * intel_dsi->lane_count, pipe_bpp);
+
+       return pclk;
+}
index a3631c0a5c283695ac75147dda830618f3ad55cc..56b47d2ffaf7ea0227fced60ee4ae8979e9803ec 100644 (file)
@@ -112,7 +112,15 @@ static struct intel_dvo *intel_attached_dvo(struct drm_connector *connector)
 
 static bool intel_dvo_connector_get_hw_state(struct intel_connector *connector)
 {
+       struct drm_device *dev = connector->base.dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_dvo *intel_dvo = intel_attached_dvo(&connector->base);
+       u32 tmp;
+
+       tmp = I915_READ(intel_dvo->dev.dvo_reg);
+
+       if (!(tmp & DVO_ENABLE))
+               return false;
 
        return intel_dvo->dev.dev_ops->get_hw_state(&intel_dvo->dev);
 }
@@ -558,7 +566,7 @@ void intel_dvo_init(struct drm_device *dev)
                        intel_dvo->panel_wants_dither = true;
                }
 
-               drm_sysfs_connector_add(connector);
+               drm_connector_register(connector);
                return;
        }
 
index 088fe9378a4cbec751cd927142b48827a0b23226..f475414671d8bdd5752a41fa8f4f6339470e365c 100644 (file)
 #include <drm/i915_drm.h>
 #include "i915_drv.h"
 
+static int intel_fbdev_set_par(struct fb_info *info)
+{
+       struct drm_fb_helper *fb_helper = info->par;
+       struct intel_fbdev *ifbdev =
+               container_of(fb_helper, struct intel_fbdev, helper);
+       int ret;
+
+       ret = drm_fb_helper_set_par(info);
+
+       if (ret == 0) {
+               /*
+                * FIXME: fbdev presumes that all callbacks also work from
+                * atomic contexts and relies on that for emergency oops
+                * printing. KMS totally doesn't do that and the locking here is
+                * by far not the only place this goes wrong.  Ignore this for
+                * now until we solve this for real.
+                */
+               mutex_lock(&fb_helper->dev->struct_mutex);
+               ret = i915_gem_object_set_to_gtt_domain(ifbdev->fb->obj,
+                                                       true);
+               mutex_unlock(&fb_helper->dev->struct_mutex);
+       }
+
+       return ret;
+}
+
 static struct fb_ops intelfb_ops = {
        .owner = THIS_MODULE,
        .fb_check_var = drm_fb_helper_check_var,
-       .fb_set_par = drm_fb_helper_set_par,
+       .fb_set_par = intel_fbdev_set_par,
        .fb_fillrect = cfb_fillrect,
        .fb_copyarea = cfb_copyarea,
        .fb_imageblit = cfb_imageblit,
@@ -81,7 +107,7 @@ static int intelfb_alloc(struct drm_fb_helper *helper,
                                                          sizes->surface_depth);
 
        size = mode_cmd.pitches[0] * mode_cmd.height;
-       size = ALIGN(size, PAGE_SIZE);
+       size = PAGE_ALIGN(size);
        obj = i915_gem_object_create_stolen(dev, size);
        if (obj == NULL)
                obj = i915_gem_alloc_object(dev, size);
@@ -417,7 +443,7 @@ static bool intel_fb_initial_config(struct drm_fb_helper *fb_helper,
                }
                crtcs[i] = new_crtc;
 
-               DRM_DEBUG_KMS("connector %s on pipe %d [CRTC:%d]: %dx%d%s\n",
+               DRM_DEBUG_KMS("connector %s on pipe %c [CRTC:%d]: %dx%d%s\n",
                              connector->name,
                              pipe_name(to_intel_crtc(encoder->crtc)->pipe),
                              encoder->crtc->base.id,
@@ -452,7 +478,7 @@ out:
        return true;
 }
 
-static struct drm_fb_helper_funcs intel_fb_helper_funcs = {
+static const struct drm_fb_helper_funcs intel_fb_helper_funcs = {
        .initial_config = intel_fb_initial_config,
        .gamma_set = intel_crtc_fb_gamma_set,
        .gamma_get = intel_crtc_fb_gamma_get,
@@ -623,7 +649,8 @@ int intel_fbdev_init(struct drm_device *dev)
        if (ifbdev == NULL)
                return -ENOMEM;
 
-       ifbdev->helper.funcs = &intel_fb_helper_funcs;
+       drm_fb_helper_prepare(dev, &ifbdev->helper, &intel_fb_helper_funcs);
+
        if (!intel_fbdev_init_bios(dev, ifbdev))
                ifbdev->preferred_bpp = 32;
 
index eee2bbec2958d4d569dcc67c1c293b51fc9e5c34..f9151f6641d9ba5b2ad6ebd341853378a2132fa2 100644 (file)
@@ -367,6 +367,9 @@ static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder,
        union hdmi_infoframe frame;
        int ret;
 
+       /* Set user selected PAR to incoming mode's member */
+       adjusted_mode->picture_aspect_ratio = intel_hdmi->aspect_ratio;
+
        ret = drm_hdmi_avi_infoframe_from_display_mode(&frame.avi,
                                                       adjusted_mode);
        if (ret < 0) {
@@ -879,7 +882,7 @@ static bool hdmi_12bpc_possible(struct intel_crtc *crtc)
        struct intel_encoder *encoder;
        int count = 0, count_hdmi = 0;
 
-       if (!HAS_PCH_SPLIT(dev))
+       if (HAS_GMCH_DISPLAY(dev))
                return false;
 
        list_for_each_entry(encoder, &dev->mode_config.encoder_list, base.head) {
@@ -1124,6 +1127,23 @@ intel_hdmi_set_property(struct drm_connector *connector,
                goto done;
        }
 
+       if (property == connector->dev->mode_config.aspect_ratio_property) {
+               switch (val) {
+               case DRM_MODE_PICTURE_ASPECT_NONE:
+                       intel_hdmi->aspect_ratio = HDMI_PICTURE_ASPECT_NONE;
+                       break;
+               case DRM_MODE_PICTURE_ASPECT_4_3:
+                       intel_hdmi->aspect_ratio = HDMI_PICTURE_ASPECT_4_3;
+                       break;
+               case DRM_MODE_PICTURE_ASPECT_16_9:
+                       intel_hdmi->aspect_ratio = HDMI_PICTURE_ASPECT_16_9;
+                       break;
+               default:
+                       return -EINVAL;
+               }
+               goto done;
+       }
+
        return -EINVAL;
 
 done:
@@ -1229,6 +1249,70 @@ static void vlv_hdmi_pre_pll_enable(struct intel_encoder *encoder)
        mutex_unlock(&dev_priv->dpio_lock);
 }
 
+static void chv_hdmi_pre_pll_enable(struct intel_encoder *encoder)
+{
+       struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
+       struct drm_device *dev = encoder->base.dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct intel_crtc *intel_crtc =
+               to_intel_crtc(encoder->base.crtc);
+       enum dpio_channel ch = vlv_dport_to_channel(dport);
+       enum pipe pipe = intel_crtc->pipe;
+       u32 val;
+
+       mutex_lock(&dev_priv->dpio_lock);
+
+       /* program left/right clock distribution */
+       if (pipe != PIPE_B) {
+               val = vlv_dpio_read(dev_priv, pipe, _CHV_CMN_DW5_CH0);
+               val &= ~(CHV_BUFLEFTENA1_MASK | CHV_BUFRIGHTENA1_MASK);
+               if (ch == DPIO_CH0)
+                       val |= CHV_BUFLEFTENA1_FORCE;
+               if (ch == DPIO_CH1)
+                       val |= CHV_BUFRIGHTENA1_FORCE;
+               vlv_dpio_write(dev_priv, pipe, _CHV_CMN_DW5_CH0, val);
+       } else {
+               val = vlv_dpio_read(dev_priv, pipe, _CHV_CMN_DW1_CH1);
+               val &= ~(CHV_BUFLEFTENA2_MASK | CHV_BUFRIGHTENA2_MASK);
+               if (ch == DPIO_CH0)
+                       val |= CHV_BUFLEFTENA2_FORCE;
+               if (ch == DPIO_CH1)
+                       val |= CHV_BUFRIGHTENA2_FORCE;
+               vlv_dpio_write(dev_priv, pipe, _CHV_CMN_DW1_CH1, val);
+       }
+
+       /* program clock channel usage */
+       val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW8(ch));
+       val |= CHV_PCS_USEDCLKCHANNEL_OVRRIDE;
+       if (pipe != PIPE_B)
+               val &= ~CHV_PCS_USEDCLKCHANNEL;
+       else
+               val |= CHV_PCS_USEDCLKCHANNEL;
+       vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW8(ch), val);
+
+       val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW8(ch));
+       val |= CHV_PCS_USEDCLKCHANNEL_OVRRIDE;
+       if (pipe != PIPE_B)
+               val &= ~CHV_PCS_USEDCLKCHANNEL;
+       else
+               val |= CHV_PCS_USEDCLKCHANNEL;
+       vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW8(ch), val);
+
+       /*
+        * This a a bit weird since generally CL
+        * matches the pipe, but here we need to
+        * pick the CL based on the port.
+        */
+       val = vlv_dpio_read(dev_priv, pipe, CHV_CMN_DW19(ch));
+       if (pipe != PIPE_B)
+               val &= ~CHV_CMN_USEDCLKCHANNEL;
+       else
+               val |= CHV_CMN_USEDCLKCHANNEL;
+       vlv_dpio_write(dev_priv, pipe, CHV_CMN_DW19(ch), val);
+
+       mutex_unlock(&dev_priv->dpio_lock);
+}
+
 static void vlv_hdmi_post_disable(struct intel_encoder *encoder)
 {
        struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
@@ -1415,12 +1499,23 @@ static const struct drm_encoder_funcs intel_hdmi_enc_funcs = {
        .destroy = intel_encoder_destroy,
 };
 
+static void
+intel_attach_aspect_ratio_property(struct drm_connector *connector)
+{
+       if (!drm_mode_create_aspect_ratio_property(connector->dev))
+               drm_object_attach_property(&connector->base,
+                       connector->dev->mode_config.aspect_ratio_property,
+                       DRM_MODE_PICTURE_ASPECT_NONE);
+}
+
 static void
 intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *connector)
 {
        intel_attach_force_audio_property(connector);
        intel_attach_broadcast_rgb_property(connector);
        intel_hdmi->color_range_auto = true;
+       intel_attach_aspect_ratio_property(connector);
+       intel_hdmi->aspect_ratio = HDMI_PICTURE_ASPECT_NONE;
 }
 
 void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
@@ -1467,7 +1562,7 @@ void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
        if (IS_VALLEYVIEW(dev)) {
                intel_hdmi->write_infoframe = vlv_write_infoframe;
                intel_hdmi->set_infoframes = vlv_set_infoframes;
-       } else if (!HAS_PCH_SPLIT(dev)) {
+       } else if (IS_G4X(dev)) {
                intel_hdmi->write_infoframe = g4x_write_infoframe;
                intel_hdmi->set_infoframes = g4x_set_infoframes;
        } else if (HAS_DDI(dev)) {
@@ -1490,7 +1585,7 @@ void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
        intel_hdmi_add_properties(intel_hdmi, connector);
 
        intel_connector_attach_encoder(intel_connector, intel_encoder);
-       drm_sysfs_connector_add(connector);
+       drm_connector_register(connector);
 
        /* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written
         * 0xd.  Failure to do so will result in spurious interrupts being
@@ -1528,6 +1623,7 @@ void intel_hdmi_init(struct drm_device *dev, int hdmi_reg, enum port port)
        intel_encoder->get_hw_state = intel_hdmi_get_hw_state;
        intel_encoder->get_config = intel_hdmi_get_config;
        if (IS_CHERRYVIEW(dev)) {
+               intel_encoder->pre_pll_enable = chv_hdmi_pre_pll_enable;
                intel_encoder->pre_enable = chv_hdmi_pre_enable;
                intel_encoder->enable = vlv_enable_hdmi;
                intel_encoder->post_disable = chv_hdmi_post_disable;
index d33b61d0dd3331b6bd073806d0482b19aeb0eb08..b31088a551f20ffc376d5e65a14d257164ec1afe 100644 (file)
 #include <drm/i915_drm.h>
 #include "i915_drv.h"
 
-enum disp_clk {
-       CDCLK,
-       CZCLK
-};
-
 struct gmbus_port {
        const char *name;
        int reg;
@@ -63,60 +58,11 @@ to_intel_gmbus(struct i2c_adapter *i2c)
        return container_of(i2c, struct intel_gmbus, adapter);
 }
 
-static int get_disp_clk_div(struct drm_i915_private *dev_priv,
-                           enum disp_clk clk)
-{
-       u32 reg_val;
-       int clk_ratio;
-
-       reg_val = I915_READ(CZCLK_CDCLK_FREQ_RATIO);
-
-       if (clk == CDCLK)
-               clk_ratio =
-                       ((reg_val & CDCLK_FREQ_MASK) >> CDCLK_FREQ_SHIFT) + 1;
-       else
-               clk_ratio = (reg_val & CZCLK_FREQ_MASK) + 1;
-
-       return clk_ratio;
-}
-
-static void gmbus_set_freq(struct drm_i915_private *dev_priv)
-{
-       int vco, gmbus_freq = 0, cdclk_div;
-
-       BUG_ON(!IS_VALLEYVIEW(dev_priv->dev));
-
-       vco = valleyview_get_vco(dev_priv);
-
-       /* Get the CDCLK divide ratio */
-       cdclk_div = get_disp_clk_div(dev_priv, CDCLK);
-
-       /*
-        * Program the gmbus_freq based on the cdclk frequency.
-        * BSpec erroneously claims we should aim for 4MHz, but
-        * in fact 1MHz is the correct frequency.
-        */
-       if (cdclk_div)
-               gmbus_freq = (vco << 1) / cdclk_div;
-
-       if (WARN_ON(gmbus_freq == 0))
-               return;
-
-       I915_WRITE(GMBUSFREQ_VLV, gmbus_freq);
-}
-
 void
 intel_i2c_reset(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
 
-       /*
-        * In BIOS-less system, program the correct gmbus frequency
-        * before reading edid.
-        */
-       if (IS_VALLEYVIEW(dev))
-               gmbus_set_freq(dev_priv);
-
        I915_WRITE(dev_priv->gpio_mmio_base + GMBUS0, 0);
        I915_WRITE(dev_priv->gpio_mmio_base + GMBUS4, 0);
 }
index 5e5a72fca5fbcf51fcf8f925fbb3f2508f508911..881361c0f27e746097414a5ddc30448227175602 100644 (file)
@@ -51,6 +51,7 @@ struct intel_lvds_encoder {
 
        bool is_dual_link;
        u32 reg;
+       u32 a3_power;
 
        struct intel_lvds_connector *attached_connector;
 };
@@ -71,8 +72,13 @@ static bool intel_lvds_get_hw_state(struct intel_encoder *encoder,
        struct drm_device *dev = encoder->base.dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(&encoder->base);
+       enum intel_display_power_domain power_domain;
        u32 tmp;
 
+       power_domain = intel_display_port_power_domain(encoder);
+       if (!intel_display_power_enabled(dev_priv, power_domain))
+               return false;
+
        tmp = I915_READ(lvds_encoder->reg);
 
        if (!(tmp & LVDS_PORT_EN))
@@ -172,8 +178,11 @@ static void intel_pre_enable_lvds(struct intel_encoder *encoder)
 
        /* It would be nice to set 24 vs 18-bit mode (LVDS_A3_POWER_UP)
         * appropriately here, but we need to look more thoroughly into how
-        * panels behave in the two modes.
+        * panels behave in the two modes. For now, let's just maintain the
+        * value we got from the BIOS.
         */
+        temp &= ~LVDS_A3_POWER_MASK;
+        temp |= lvds_encoder->a3_power;
 
        /* Set the dithering flag on LVDS as needed, note that there is no
         * special lvds dither control bit on pch-split platforms, dithering is
@@ -271,7 +280,6 @@ static bool intel_lvds_compute_config(struct intel_encoder *intel_encoder,
                                      struct intel_crtc_config *pipe_config)
 {
        struct drm_device *dev = intel_encoder->base.dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_lvds_encoder *lvds_encoder =
                to_lvds_encoder(&intel_encoder->base);
        struct intel_connector *intel_connector =
@@ -286,8 +294,7 @@ static bool intel_lvds_compute_config(struct intel_encoder *intel_encoder,
                return false;
        }
 
-       if ((I915_READ(lvds_encoder->reg) & LVDS_A3_POWER_MASK) ==
-           LVDS_A3_POWER_UP)
+       if (lvds_encoder->a3_power == LVDS_A3_POWER_UP)
                lvds_bpp = 8*3;
        else
                lvds_bpp = 6*3;
@@ -1088,6 +1095,9 @@ out:
        DRM_DEBUG_KMS("detected %s-link lvds configuration\n",
                      lvds_encoder->is_dual_link ? "dual" : "single");
 
+       lvds_encoder->a3_power = I915_READ(lvds_encoder->reg) &
+                                LVDS_A3_POWER_MASK;
+
        /*
         * Unlock registers and just
         * leave them unlocked
@@ -1104,7 +1114,7 @@ out:
                DRM_DEBUG_KMS("lid notifier registration failed\n");
                lvds_connector->lid_notifier.notifier_call = NULL;
        }
-       drm_sysfs_connector_add(connector);
+       drm_connector_register(connector);
 
        intel_panel_init(&intel_connector->panel, fixed_mode, downclock_mode);
        intel_panel_setup_backlight(connector);
index 4f6b53998d79652dafca7ea7e7f609a1d35eaca6..ca52ad2ae7d12928b8304f54f9f06de8a00f8511 100644 (file)
@@ -352,6 +352,7 @@ int intel_opregion_notify_encoder(struct intel_encoder *intel_encoder,
        case INTEL_OUTPUT_UNKNOWN:
        case INTEL_OUTPUT_DISPLAYPORT:
        case INTEL_OUTPUT_HDMI:
+       case INTEL_OUTPUT_DP_MST:
                type = DISPLAY_TYPE_EXTERNAL_FLAT_PANEL;
                break;
        case INTEL_OUTPUT_EDP:
@@ -427,7 +428,7 @@ static u32 asle_set_backlight(struct drm_device *dev, u32 bclp)
         */
        DRM_DEBUG_KMS("updating opregion backlight %d/255\n", bclp);
        list_for_each_entry(intel_connector, &dev->mode_config.connector_list, base.head)
-               intel_panel_set_backlight(intel_connector, bclp, 255);
+               intel_panel_set_backlight_acpi(intel_connector, bclp, 255);
        iowrite32(DIV_ROUND_UP(bclp * 100, 255) | ASLE_CBLV_VALID, &asle->cblv);
 
        drm_modeset_unlock(&dev->mode_config.connection_mutex);
index daa118978eec725b471d1c3dbb3933f52f85c1b5..dc2f4f26c961e0849c19551ad3cf4385ee76b599 100644 (file)
@@ -415,6 +415,10 @@ static int intel_overlay_release_old_vid(struct intel_overlay *overlay)
        }
 
        intel_overlay_release_old_vid_tail(overlay);
+
+
+       i915_gem_track_fb(overlay->old_vid_bo, NULL,
+                         INTEL_FRONTBUFFER_OVERLAY(overlay->crtc->pipe));
        return 0;
 }
 
@@ -686,6 +690,7 @@ static int intel_overlay_do_put_image(struct intel_overlay *overlay,
        bool scale_changed = false;
        struct drm_device *dev = overlay->dev;
        u32 swidth, swidthsw, sheight, ostride;
+       enum pipe pipe = overlay->crtc->pipe;
 
        BUG_ON(!mutex_is_locked(&dev->struct_mutex));
        BUG_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex));
@@ -713,7 +718,7 @@ static int intel_overlay_do_put_image(struct intel_overlay *overlay,
                oconfig = OCONF_CC_OUT_8BIT;
                if (IS_GEN4(overlay->dev))
                        oconfig |= OCONF_CSC_MODE_BT709;
-               oconfig |= overlay->crtc->pipe == 0 ?
+               oconfig |= pipe == 0 ?
                        OCONF_PIPE_A : OCONF_PIPE_B;
                iowrite32(oconfig, &regs->OCONFIG);
                intel_overlay_unmap_regs(overlay, regs);
@@ -776,9 +781,15 @@ static int intel_overlay_do_put_image(struct intel_overlay *overlay,
        if (ret)
                goto out_unpin;
 
+       i915_gem_track_fb(overlay->vid_bo, new_bo,
+                         INTEL_FRONTBUFFER_OVERLAY(pipe));
+
        overlay->old_vid_bo = overlay->vid_bo;
        overlay->vid_bo = new_bo;
 
+       intel_frontbuffer_flip(dev,
+                              INTEL_FRONTBUFFER_OVERLAY(pipe));
+
        return 0;
 
 out_unpin:
@@ -1028,7 +1039,7 @@ int intel_overlay_put_image(struct drm_device *dev, void *data,
        struct drm_intel_overlay_put_image *put_image_rec = data;
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_overlay *overlay;
-       struct drm_mode_object *drmmode_obj;
+       struct drm_crtc *drmmode_crtc;
        struct intel_crtc *crtc;
        struct drm_i915_gem_object *new_bo;
        struct put_image_params *params;
@@ -1057,13 +1068,12 @@ int intel_overlay_put_image(struct drm_device *dev, void *data,
        if (!params)
                return -ENOMEM;
 
-       drmmode_obj = drm_mode_object_find(dev, put_image_rec->crtc_id,
-                                          DRM_MODE_OBJECT_CRTC);
-       if (!drmmode_obj) {
+       drmmode_crtc = drm_crtc_find(dev, put_image_rec->crtc_id);
+       if (!drmmode_crtc) {
                ret = -ENOENT;
                goto out_free;
        }
-       crtc = to_intel_crtc(obj_to_crtc(drmmode_obj));
+       crtc = to_intel_crtc(drmmode_crtc);
 
        new_bo = to_intel_bo(drm_gem_object_lookup(dev, file_priv,
                                                   put_image_rec->bo_handle));
index 12b02fe1d0aed7349662932bad8c38b53d914ac3..59b028f0b1e8c7a652cc174c17373b90a4782077 100644 (file)
@@ -398,6 +398,69 @@ intel_panel_detect(struct drm_device *dev)
        }
 }
 
+/**
+ * scale - scale values from one range to another
+ *
+ * @source_val: value in range [@source_min..@source_max]
+ *
+ * Return @source_val in range [@source_min..@source_max] scaled to range
+ * [@target_min..@target_max].
+ */
+static uint32_t scale(uint32_t source_val,
+                     uint32_t source_min, uint32_t source_max,
+                     uint32_t target_min, uint32_t target_max)
+{
+       uint64_t target_val;
+
+       WARN_ON(source_min > source_max);
+       WARN_ON(target_min > target_max);
+
+       /* defensive */
+       source_val = clamp(source_val, source_min, source_max);
+
+       /* avoid overflows */
+       target_val = (uint64_t)(source_val - source_min) *
+               (target_max - target_min);
+       do_div(target_val, source_max - source_min);
+       target_val += target_min;
+
+       return target_val;
+}
+
+/* Scale user_level in range [0..user_max] to [hw_min..hw_max]. */
+static inline u32 scale_user_to_hw(struct intel_connector *connector,
+                                  u32 user_level, u32 user_max)
+{
+       struct intel_panel *panel = &connector->panel;
+
+       return scale(user_level, 0, user_max,
+                    panel->backlight.min, panel->backlight.max);
+}
+
+/* Scale user_level in range [0..user_max] to [0..hw_max], clamping the result
+ * to [hw_min..hw_max]. */
+static inline u32 clamp_user_to_hw(struct intel_connector *connector,
+                                  u32 user_level, u32 user_max)
+{
+       struct intel_panel *panel = &connector->panel;
+       u32 hw_level;
+
+       hw_level = scale(user_level, 0, user_max, 0, panel->backlight.max);
+       hw_level = clamp(hw_level, panel->backlight.min, panel->backlight.max);
+
+       return hw_level;
+}
+
+/* Scale hw_level in range [hw_min..hw_max] to [0..user_max]. */
+static inline u32 scale_hw_to_user(struct intel_connector *connector,
+                                  u32 hw_level, u32 user_max)
+{
+       struct intel_panel *panel = &connector->panel;
+
+       return scale(hw_level, panel->backlight.min, panel->backlight.max,
+                    0, user_max);
+}
+
 static u32 intel_panel_compute_brightness(struct intel_connector *connector,
                                          u32 val)
 {
@@ -557,17 +620,16 @@ intel_panel_actually_set_backlight(struct intel_connector *connector, u32 level)
        dev_priv->display.set_backlight(connector, level);
 }
 
-/* set backlight brightness to level in range [0..max] */
-void intel_panel_set_backlight(struct intel_connector *connector, u32 level,
-                              u32 max)
+/* set backlight brightness to level in range [0..max], scaling wrt hw min */
+static void intel_panel_set_backlight(struct intel_connector *connector,
+                                     u32 user_level, u32 user_max)
 {
        struct drm_device *dev = connector->base.dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_panel *panel = &connector->panel;
        enum pipe pipe = intel_get_pipe_from_connector(connector);
-       u32 freq;
+       u32 hw_level;
        unsigned long flags;
-       u64 n;
 
        if (!panel->backlight.present || pipe == INVALID_PIPE)
                return;
@@ -576,18 +638,46 @@ void intel_panel_set_backlight(struct intel_connector *connector, u32 level,
 
        WARN_ON(panel->backlight.max == 0);
 
-       /* scale to hardware max, but be careful to not overflow */
-       freq = panel->backlight.max;
-       n = (u64)level * freq;
-       do_div(n, max);
-       level = n;
+       hw_level = scale_user_to_hw(connector, user_level, user_max);
+       panel->backlight.level = hw_level;
+
+       if (panel->backlight.enabled)
+               intel_panel_actually_set_backlight(connector, hw_level);
+
+       spin_unlock_irqrestore(&dev_priv->backlight_lock, flags);
+}
+
+/* set backlight brightness to level in range [0..max], assuming hw min is
+ * respected.
+ */
+void intel_panel_set_backlight_acpi(struct intel_connector *connector,
+                                   u32 user_level, u32 user_max)
+{
+       struct drm_device *dev = connector->base.dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct intel_panel *panel = &connector->panel;
+       enum pipe pipe = intel_get_pipe_from_connector(connector);
+       u32 hw_level;
+       unsigned long flags;
+
+       if (!panel->backlight.present || pipe == INVALID_PIPE)
+               return;
+
+       spin_lock_irqsave(&dev_priv->backlight_lock, flags);
+
+       WARN_ON(panel->backlight.max == 0);
+
+       hw_level = clamp_user_to_hw(connector, user_level, user_max);
+       panel->backlight.level = hw_level;
 
-       panel->backlight.level = level;
        if (panel->backlight.device)
-               panel->backlight.device->props.brightness = level;
+               panel->backlight.device->props.brightness =
+                       scale_hw_to_user(connector,
+                                        panel->backlight.level,
+                                        panel->backlight.device->props.max_brightness);
 
        if (panel->backlight.enabled)
-               intel_panel_actually_set_backlight(connector, level);
+               intel_panel_actually_set_backlight(connector, hw_level);
 
        spin_unlock_irqrestore(&dev_priv->backlight_lock, flags);
 }
@@ -860,7 +950,9 @@ void intel_panel_enable_backlight(struct intel_connector *connector)
                panel->backlight.level = panel->backlight.max;
                if (panel->backlight.device)
                        panel->backlight.device->props.brightness =
-                               panel->backlight.level;
+                               scale_hw_to_user(connector,
+                                                panel->backlight.level,
+                                                panel->backlight.device->props.max_brightness);
        }
 
        dev_priv->display.enable_backlight(connector);
@@ -889,11 +981,15 @@ static int intel_backlight_device_get_brightness(struct backlight_device *bd)
        struct intel_connector *connector = bl_get_data(bd);
        struct drm_device *dev = connector->base.dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
+       u32 hw_level;
        int ret;
 
        intel_runtime_pm_get(dev_priv);
        drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
-       ret = intel_panel_get_backlight(connector);
+
+       hw_level = intel_panel_get_backlight(connector);
+       ret = scale_hw_to_user(connector, hw_level, bd->props.max_brightness);
+
        drm_modeset_unlock(&dev->mode_config.connection_mutex);
        intel_runtime_pm_put(dev_priv);
 
@@ -913,12 +1009,19 @@ static int intel_backlight_device_register(struct intel_connector *connector)
        if (WARN_ON(panel->backlight.device))
                return -ENODEV;
 
-       BUG_ON(panel->backlight.max == 0);
+       WARN_ON(panel->backlight.max == 0);
 
        memset(&props, 0, sizeof(props));
        props.type = BACKLIGHT_RAW;
-       props.brightness = panel->backlight.level;
+
+       /*
+        * Note: Everything should work even if the backlight device max
+        * presented to the userspace is arbitrarily chosen.
+        */
        props.max_brightness = panel->backlight.max;
+       props.brightness = scale_hw_to_user(connector,
+                                           panel->backlight.level,
+                                           props.max_brightness);
 
        /*
         * Note: using the same name independent of the connector prevents
@@ -964,6 +1067,19 @@ static void intel_backlight_device_unregister(struct intel_connector *connector)
  * XXX: Query mode clock or hardware clock and program PWM modulation frequency
  * appropriately when it's 0. Use VBT and/or sane defaults.
  */
+static u32 get_backlight_min_vbt(struct intel_connector *connector)
+{
+       struct drm_device *dev = connector->base.dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct intel_panel *panel = &connector->panel;
+
+       WARN_ON(panel->backlight.max == 0);
+
+       /* vbt value is a coefficient in range [0..255] */
+       return scale(dev_priv->vbt.backlight.min_brightness, 0, 255,
+                    0, panel->backlight.max);
+}
+
 static int bdw_setup_backlight(struct intel_connector *connector)
 {
        struct drm_device *dev = connector->base.dev;
@@ -979,6 +1095,8 @@ static int bdw_setup_backlight(struct intel_connector *connector)
        if (!panel->backlight.max)
                return -ENODEV;
 
+       panel->backlight.min = get_backlight_min_vbt(connector);
+
        val = bdw_get_backlight(connector);
        panel->backlight.level = intel_panel_compute_brightness(connector, val);
 
@@ -1003,6 +1121,8 @@ static int pch_setup_backlight(struct intel_connector *connector)
        if (!panel->backlight.max)
                return -ENODEV;
 
+       panel->backlight.min = get_backlight_min_vbt(connector);
+
        val = pch_get_backlight(connector);
        panel->backlight.level = intel_panel_compute_brightness(connector, val);
 
@@ -1035,6 +1155,8 @@ static int i9xx_setup_backlight(struct intel_connector *connector)
        if (!panel->backlight.max)
                return -ENODEV;
 
+       panel->backlight.min = get_backlight_min_vbt(connector);
+
        val = i9xx_get_backlight(connector);
        panel->backlight.level = intel_panel_compute_brightness(connector, val);
 
@@ -1062,6 +1184,8 @@ static int i965_setup_backlight(struct intel_connector *connector)
        if (!panel->backlight.max)
                return -ENODEV;
 
+       panel->backlight.min = get_backlight_min_vbt(connector);
+
        val = i9xx_get_backlight(connector);
        panel->backlight.level = intel_panel_compute_brightness(connector, val);
 
@@ -1099,6 +1223,8 @@ static int vlv_setup_backlight(struct intel_connector *connector)
        if (!panel->backlight.max)
                return -ENODEV;
 
+       panel->backlight.min = get_backlight_min_vbt(connector);
+
        val = _vlv_get_backlight(dev, PIPE_A);
        panel->backlight.level = intel_panel_compute_brightness(connector, val);
 
index f1233f544f3ee7d5dbb77891a55d58f0c3c77788..40c12295c0bde4648d319f3da48205ab131fc92a 100644 (file)
@@ -93,8 +93,7 @@ static void i8xx_enable_fbc(struct drm_crtc *crtc)
        struct drm_device *dev = crtc->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct drm_framebuffer *fb = crtc->primary->fb;
-       struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
-       struct drm_i915_gem_object *obj = intel_fb->obj;
+       struct drm_i915_gem_object *obj = intel_fb_obj(fb);
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        int cfb_pitch;
        int i;
@@ -150,8 +149,7 @@ static void g4x_enable_fbc(struct drm_crtc *crtc)
        struct drm_device *dev = crtc->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct drm_framebuffer *fb = crtc->primary->fb;
-       struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
-       struct drm_i915_gem_object *obj = intel_fb->obj;
+       struct drm_i915_gem_object *obj = intel_fb_obj(fb);
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        u32 dpfc_ctl;
 
@@ -222,16 +220,26 @@ static void ironlake_enable_fbc(struct drm_crtc *crtc)
        struct drm_device *dev = crtc->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct drm_framebuffer *fb = crtc->primary->fb;
-       struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
-       struct drm_i915_gem_object *obj = intel_fb->obj;
+       struct drm_i915_gem_object *obj = intel_fb_obj(fb);
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        u32 dpfc_ctl;
 
        dpfc_ctl = DPFC_CTL_PLANE(intel_crtc->plane);
        if (drm_format_plane_cpp(fb->pixel_format, 0) == 2)
+               dev_priv->fbc.threshold++;
+
+       switch (dev_priv->fbc.threshold) {
+       case 4:
+       case 3:
+               dpfc_ctl |= DPFC_CTL_LIMIT_4X;
+               break;
+       case 2:
                dpfc_ctl |= DPFC_CTL_LIMIT_2X;
-       else
+               break;
+       case 1:
                dpfc_ctl |= DPFC_CTL_LIMIT_1X;
+               break;
+       }
        dpfc_ctl |= DPFC_CTL_FENCE_EN;
        if (IS_GEN5(dev))
                dpfc_ctl |= obj->fence_reg;
@@ -278,16 +286,27 @@ static void gen7_enable_fbc(struct drm_crtc *crtc)
        struct drm_device *dev = crtc->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct drm_framebuffer *fb = crtc->primary->fb;
-       struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
-       struct drm_i915_gem_object *obj = intel_fb->obj;
+       struct drm_i915_gem_object *obj = intel_fb_obj(fb);
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        u32 dpfc_ctl;
 
        dpfc_ctl = IVB_DPFC_CTL_PLANE(intel_crtc->plane);
        if (drm_format_plane_cpp(fb->pixel_format, 0) == 2)
+               dev_priv->fbc.threshold++;
+
+       switch (dev_priv->fbc.threshold) {
+       case 4:
+       case 3:
+               dpfc_ctl |= DPFC_CTL_LIMIT_4X;
+               break;
+       case 2:
                dpfc_ctl |= DPFC_CTL_LIMIT_2X;
-       else
+               break;
+       case 1:
                dpfc_ctl |= DPFC_CTL_LIMIT_1X;
+               break;
+       }
+
        dpfc_ctl |= IVB_DPFC_CTL_FENCE_EN;
 
        I915_WRITE(ILK_DPFC_CONTROL, dpfc_ctl | DPFC_CTL_EN);
@@ -462,7 +481,6 @@ void intel_update_fbc(struct drm_device *dev)
        struct drm_crtc *crtc = NULL, *tmp_crtc;
        struct intel_crtc *intel_crtc;
        struct drm_framebuffer *fb;
-       struct intel_framebuffer *intel_fb;
        struct drm_i915_gem_object *obj;
        const struct drm_display_mode *adjusted_mode;
        unsigned int max_width, max_height;
@@ -507,8 +525,7 @@ void intel_update_fbc(struct drm_device *dev)
 
        intel_crtc = to_intel_crtc(crtc);
        fb = crtc->primary->fb;
-       intel_fb = to_intel_framebuffer(fb);
-       obj = intel_fb->obj;
+       obj = intel_fb_obj(fb);
        adjusted_mode = &intel_crtc->config.adjusted_mode;
 
        if (i915.enable_fbc < 0) {
@@ -529,7 +546,10 @@ void intel_update_fbc(struct drm_device *dev)
                goto out_disable;
        }
 
-       if (IS_G4X(dev) || INTEL_INFO(dev)->gen >= 5) {
+       if (INTEL_INFO(dev)->gen >= 8 || IS_HASWELL(dev)) {
+               max_width = 4096;
+               max_height = 4096;
+       } else if (IS_G4X(dev) || INTEL_INFO(dev)->gen >= 5) {
                max_width = 4096;
                max_height = 2048;
        } else {
@@ -563,7 +583,8 @@ void intel_update_fbc(struct drm_device *dev)
        if (in_dbg_master())
                goto out_disable;
 
-       if (i915_gem_stolen_setup_compression(dev, intel_fb->obj->base.size)) {
+       if (i915_gem_stolen_setup_compression(dev, obj->base.size,
+                                             drm_format_plane_cpp(fb->pixel_format, 0))) {
                if (set_no_fbc_reason(dev_priv, FBC_STOLEN_TOO_SMALL))
                        DRM_DEBUG_KMS("framebuffer too large, disabling compression\n");
                goto out_disable;
@@ -789,12 +810,33 @@ static const struct cxsr_latency *intel_get_cxsr_latency(int is_desktop,
        return NULL;
 }
 
-static void pineview_disable_cxsr(struct drm_device *dev)
+void intel_set_memory_cxsr(struct drm_i915_private *dev_priv, bool enable)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_device *dev = dev_priv->dev;
+       u32 val;
+
+       if (IS_VALLEYVIEW(dev)) {
+               I915_WRITE(FW_BLC_SELF_VLV, enable ? FW_CSPWRDWNEN : 0);
+       } else if (IS_G4X(dev) || IS_CRESTLINE(dev)) {
+               I915_WRITE(FW_BLC_SELF, enable ? FW_BLC_SELF_EN : 0);
+       } else if (IS_PINEVIEW(dev)) {
+               val = I915_READ(DSPFW3) & ~PINEVIEW_SELF_REFRESH_EN;
+               val |= enable ? PINEVIEW_SELF_REFRESH_EN : 0;
+               I915_WRITE(DSPFW3, val);
+       } else if (IS_I945G(dev) || IS_I945GM(dev)) {
+               val = enable ? _MASKED_BIT_ENABLE(FW_BLC_SELF_EN) :
+                              _MASKED_BIT_DISABLE(FW_BLC_SELF_EN);
+               I915_WRITE(FW_BLC_SELF, val);
+       } else if (IS_I915GM(dev)) {
+               val = enable ? _MASKED_BIT_ENABLE(INSTPM_SELF_EN) :
+                              _MASKED_BIT_DISABLE(INSTPM_SELF_EN);
+               I915_WRITE(INSTPM, val);
+       } else {
+               return;
+       }
 
-       /* deactivate cxsr */
-       I915_WRITE(DSPFW3, I915_READ(DSPFW3) & ~PINEVIEW_SELF_REFRESH_EN);
+       DRM_DEBUG_KMS("memory self-refresh is %s\n",
+                     enable ? "enabled" : "disabled");
 }
 
 /*
@@ -864,95 +906,95 @@ static int i845_get_fifo_size(struct drm_device *dev, int plane)
 
 /* Pineview has different values for various configs */
 static const struct intel_watermark_params pineview_display_wm = {
-       PINEVIEW_DISPLAY_FIFO,
-       PINEVIEW_MAX_WM,
-       PINEVIEW_DFT_WM,
-       PINEVIEW_GUARD_WM,
-       PINEVIEW_FIFO_LINE_SIZE
+       .fifo_size = PINEVIEW_DISPLAY_FIFO,
+       .max_wm = PINEVIEW_MAX_WM,
+       .default_wm = PINEVIEW_DFT_WM,
+       .guard_size = PINEVIEW_GUARD_WM,
+       .cacheline_size = PINEVIEW_FIFO_LINE_SIZE,
 };
 static const struct intel_watermark_params pineview_display_hplloff_wm = {
-       PINEVIEW_DISPLAY_FIFO,
-       PINEVIEW_MAX_WM,
-       PINEVIEW_DFT_HPLLOFF_WM,
-       PINEVIEW_GUARD_WM,
-       PINEVIEW_FIFO_LINE_SIZE
+       .fifo_size = PINEVIEW_DISPLAY_FIFO,
+       .max_wm = PINEVIEW_MAX_WM,
+       .default_wm = PINEVIEW_DFT_HPLLOFF_WM,
+       .guard_size = PINEVIEW_GUARD_WM,
+       .cacheline_size = PINEVIEW_FIFO_LINE_SIZE,
 };
 static const struct intel_watermark_params pineview_cursor_wm = {
-       PINEVIEW_CURSOR_FIFO,
-       PINEVIEW_CURSOR_MAX_WM,
-       PINEVIEW_CURSOR_DFT_WM,
-       PINEVIEW_CURSOR_GUARD_WM,
-       PINEVIEW_FIFO_LINE_SIZE,
+       .fifo_size = PINEVIEW_CURSOR_FIFO,
+       .max_wm = PINEVIEW_CURSOR_MAX_WM,
+       .default_wm = PINEVIEW_CURSOR_DFT_WM,
+       .guard_size = PINEVIEW_CURSOR_GUARD_WM,
+       .cacheline_size = PINEVIEW_FIFO_LINE_SIZE,
 };
 static const struct intel_watermark_params pineview_cursor_hplloff_wm = {
-       PINEVIEW_CURSOR_FIFO,
-       PINEVIEW_CURSOR_MAX_WM,
-       PINEVIEW_CURSOR_DFT_WM,
-       PINEVIEW_CURSOR_GUARD_WM,
-       PINEVIEW_FIFO_LINE_SIZE
+       .fifo_size = PINEVIEW_CURSOR_FIFO,
+       .max_wm = PINEVIEW_CURSOR_MAX_WM,
+       .default_wm = PINEVIEW_CURSOR_DFT_WM,
+       .guard_size = PINEVIEW_CURSOR_GUARD_WM,
+       .cacheline_size = PINEVIEW_FIFO_LINE_SIZE,
 };
 static const struct intel_watermark_params g4x_wm_info = {
-       G4X_FIFO_SIZE,
-       G4X_MAX_WM,
-       G4X_MAX_WM,
-       2,
-       G4X_FIFO_LINE_SIZE,
+       .fifo_size = G4X_FIFO_SIZE,
+       .max_wm = G4X_MAX_WM,
+       .default_wm = G4X_MAX_WM,
+       .guard_size = 2,
+       .cacheline_size = G4X_FIFO_LINE_SIZE,
 };
 static const struct intel_watermark_params g4x_cursor_wm_info = {
-       I965_CURSOR_FIFO,
-       I965_CURSOR_MAX_WM,
-       I965_CURSOR_DFT_WM,
-       2,
-       G4X_FIFO_LINE_SIZE,
+       .fifo_size = I965_CURSOR_FIFO,
+       .max_wm = I965_CURSOR_MAX_WM,
+       .default_wm = I965_CURSOR_DFT_WM,
+       .guard_size = 2,
+       .cacheline_size = G4X_FIFO_LINE_SIZE,
 };
 static const struct intel_watermark_params valleyview_wm_info = {
-       VALLEYVIEW_FIFO_SIZE,
-       VALLEYVIEW_MAX_WM,
-       VALLEYVIEW_MAX_WM,
-       2,
-       G4X_FIFO_LINE_SIZE,
+       .fifo_size = VALLEYVIEW_FIFO_SIZE,
+       .max_wm = VALLEYVIEW_MAX_WM,
+       .default_wm = VALLEYVIEW_MAX_WM,
+       .guard_size = 2,
+       .cacheline_size = G4X_FIFO_LINE_SIZE,
 };
 static const struct intel_watermark_params valleyview_cursor_wm_info = {
-       I965_CURSOR_FIFO,
-       VALLEYVIEW_CURSOR_MAX_WM,
-       I965_CURSOR_DFT_WM,
-       2,
-       G4X_FIFO_LINE_SIZE,
+       .fifo_size = I965_CURSOR_FIFO,
+       .max_wm = VALLEYVIEW_CURSOR_MAX_WM,
+       .default_wm = I965_CURSOR_DFT_WM,
+       .guard_size = 2,
+       .cacheline_size = G4X_FIFO_LINE_SIZE,
 };
 static const struct intel_watermark_params i965_cursor_wm_info = {
-       I965_CURSOR_FIFO,
-       I965_CURSOR_MAX_WM,
-       I965_CURSOR_DFT_WM,
-       2,
-       I915_FIFO_LINE_SIZE,
+       .fifo_size = I965_CURSOR_FIFO,
+       .max_wm = I965_CURSOR_MAX_WM,
+       .default_wm = I965_CURSOR_DFT_WM,
+       .guard_size = 2,
+       .cacheline_size = I915_FIFO_LINE_SIZE,
 };
 static const struct intel_watermark_params i945_wm_info = {
-       I945_FIFO_SIZE,
-       I915_MAX_WM,
-       1,
-       2,
-       I915_FIFO_LINE_SIZE
+       .fifo_size = I945_FIFO_SIZE,
+       .max_wm = I915_MAX_WM,
+       .default_wm = 1,
+       .guard_size = 2,
+       .cacheline_size = I915_FIFO_LINE_SIZE,
 };
 static const struct intel_watermark_params i915_wm_info = {
-       I915_FIFO_SIZE,
-       I915_MAX_WM,
-       1,
-       2,
-       I915_FIFO_LINE_SIZE
+       .fifo_size = I915_FIFO_SIZE,
+       .max_wm = I915_MAX_WM,
+       .default_wm = 1,
+       .guard_size = 2,
+       .cacheline_size = I915_FIFO_LINE_SIZE,
 };
 static const struct intel_watermark_params i830_wm_info = {
-       I855GM_FIFO_SIZE,
-       I915_MAX_WM,
-       1,
-       2,
-       I830_FIFO_LINE_SIZE
+       .fifo_size = I855GM_FIFO_SIZE,
+       .max_wm = I915_MAX_WM,
+       .default_wm = 1,
+       .guard_size = 2,
+       .cacheline_size = I830_FIFO_LINE_SIZE,
 };
 static const struct intel_watermark_params i845_wm_info = {
-       I830_FIFO_SIZE,
-       I915_MAX_WM,
-       1,
-       2,
-       I830_FIFO_LINE_SIZE
+       .fifo_size = I830_FIFO_SIZE,
+       .max_wm = I915_MAX_WM,
+       .default_wm = 1,
+       .guard_size = 2,
+       .cacheline_size = I830_FIFO_LINE_SIZE,
 };
 
 /**
@@ -1033,7 +1075,7 @@ static void pineview_update_wm(struct drm_crtc *unused_crtc)
                                         dev_priv->fsb_freq, dev_priv->mem_freq);
        if (!latency) {
                DRM_DEBUG_KMS("Unknown FSB/MEM found, disable CxSR\n");
-               pineview_disable_cxsr(dev);
+               intel_set_memory_cxsr(dev_priv, false);
                return;
        }
 
@@ -1084,13 +1126,9 @@ static void pineview_update_wm(struct drm_crtc *unused_crtc)
                I915_WRITE(DSPFW3, reg);
                DRM_DEBUG_KMS("DSPFW3 register is %x\n", reg);
 
-               /* activate cxsr */
-               I915_WRITE(DSPFW3,
-                          I915_READ(DSPFW3) | PINEVIEW_SELF_REFRESH_EN);
-               DRM_DEBUG_KMS("Self-refresh is enabled\n");
+               intel_set_memory_cxsr(dev_priv, true);
        } else {
-               pineview_disable_cxsr(dev);
-               DRM_DEBUG_KMS("Self-refresh is disabled\n");
+               intel_set_memory_cxsr(dev_priv, false);
        }
 }
 
@@ -1249,15 +1287,14 @@ static bool vlv_compute_drain_latency(struct drm_device *dev,
        pixel_size = crtc->primary->fb->bits_per_pixel / 8;     /* BPP */
 
        entries = (clock / 1000) * pixel_size;
-       *plane_prec_mult = (entries > 256) ?
-               DRAIN_LATENCY_PRECISION_32 : DRAIN_LATENCY_PRECISION_16;
-       *plane_dl = (64 * (*plane_prec_mult) * 4) / ((clock / 1000) *
-                                                    pixel_size);
+       *plane_prec_mult = (entries > 128) ?
+               DRAIN_LATENCY_PRECISION_64 : DRAIN_LATENCY_PRECISION_32;
+       *plane_dl = (64 * (*plane_prec_mult) * 4) / entries;
 
        entries = (clock / 1000) * 4;   /* BPP is always 4 for cursor */
-       *cursor_prec_mult = (entries > 256) ?
-               DRAIN_LATENCY_PRECISION_32 : DRAIN_LATENCY_PRECISION_16;
-       *cursor_dl = (64 * (*cursor_prec_mult) * 4) / ((clock / 1000) * 4);
+       *cursor_prec_mult = (entries > 128) ?
+               DRAIN_LATENCY_PRECISION_64 : DRAIN_LATENCY_PRECISION_32;
+       *cursor_dl = (64 * (*cursor_prec_mult) * 4) / entries;
 
        return true;
 }
@@ -1282,9 +1319,9 @@ static void vlv_update_drain_latency(struct drm_device *dev)
        if (vlv_compute_drain_latency(dev, 0, &plane_prec_mult, &planea_dl,
                                      &cursor_prec_mult, &cursora_dl)) {
                cursora_prec = (cursor_prec_mult == DRAIN_LATENCY_PRECISION_32) ?
-                       DDL_CURSORA_PRECISION_32 : DDL_CURSORA_PRECISION_16;
+                       DDL_CURSORA_PRECISION_32 : DDL_CURSORA_PRECISION_64;
                planea_prec = (plane_prec_mult == DRAIN_LATENCY_PRECISION_32) ?
-                       DDL_PLANEA_PRECISION_32 : DDL_PLANEA_PRECISION_16;
+                       DDL_PLANEA_PRECISION_32 : DDL_PLANEA_PRECISION_64;
 
                I915_WRITE(VLV_DDL1, cursora_prec |
                                (cursora_dl << DDL_CURSORA_SHIFT) |
@@ -1295,9 +1332,9 @@ static void vlv_update_drain_latency(struct drm_device *dev)
        if (vlv_compute_drain_latency(dev, 1, &plane_prec_mult, &planeb_dl,
                                      &cursor_prec_mult, &cursorb_dl)) {
                cursorb_prec = (cursor_prec_mult == DRAIN_LATENCY_PRECISION_32) ?
-                       DDL_CURSORB_PRECISION_32 : DDL_CURSORB_PRECISION_16;
+                       DDL_CURSORB_PRECISION_32 : DDL_CURSORB_PRECISION_64;
                planeb_prec = (plane_prec_mult == DRAIN_LATENCY_PRECISION_32) ?
-                       DDL_PLANEB_PRECISION_32 : DDL_PLANEB_PRECISION_16;
+                       DDL_PLANEB_PRECISION_32 : DDL_PLANEB_PRECISION_64;
 
                I915_WRITE(VLV_DDL2, cursorb_prec |
                                (cursorb_dl << DDL_CURSORB_SHIFT) |
@@ -1316,6 +1353,7 @@ static void valleyview_update_wm(struct drm_crtc *crtc)
        int plane_sr, cursor_sr;
        int ignore_plane_sr, ignore_cursor_sr;
        unsigned int enabled = 0;
+       bool cxsr_enabled;
 
        vlv_update_drain_latency(dev);
 
@@ -1342,10 +1380,10 @@ static void valleyview_update_wm(struct drm_crtc *crtc)
                             &valleyview_wm_info,
                             &valleyview_cursor_wm_info,
                             &ignore_plane_sr, &cursor_sr)) {
-               I915_WRITE(FW_BLC_SELF_VLV, FW_CSPWRDWNEN);
+               cxsr_enabled = true;
        } else {
-               I915_WRITE(FW_BLC_SELF_VLV,
-                          I915_READ(FW_BLC_SELF_VLV) & ~FW_CSPWRDWNEN);
+               cxsr_enabled = false;
+               intel_set_memory_cxsr(dev_priv, false);
                plane_sr = cursor_sr = 0;
        }
 
@@ -1365,6 +1403,9 @@ static void valleyview_update_wm(struct drm_crtc *crtc)
        I915_WRITE(DSPFW3,
                   (I915_READ(DSPFW3) & ~DSPFW_CURSOR_SR_MASK) |
                   (cursor_sr << DSPFW_CURSOR_SR_SHIFT));
+
+       if (cxsr_enabled)
+               intel_set_memory_cxsr(dev_priv, true);
 }
 
 static void g4x_update_wm(struct drm_crtc *crtc)
@@ -1375,6 +1416,7 @@ static void g4x_update_wm(struct drm_crtc *crtc)
        int planea_wm, planeb_wm, cursora_wm, cursorb_wm;
        int plane_sr, cursor_sr;
        unsigned int enabled = 0;
+       bool cxsr_enabled;
 
        if (g4x_compute_wm0(dev, PIPE_A,
                            &g4x_wm_info, latency_ns,
@@ -1394,10 +1436,10 @@ static void g4x_update_wm(struct drm_crtc *crtc)
                             &g4x_wm_info,
                             &g4x_cursor_wm_info,
                             &plane_sr, &cursor_sr)) {
-               I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN);
+               cxsr_enabled = true;
        } else {
-               I915_WRITE(FW_BLC_SELF,
-                          I915_READ(FW_BLC_SELF) & ~FW_BLC_SELF_EN);
+               cxsr_enabled = false;
+               intel_set_memory_cxsr(dev_priv, false);
                plane_sr = cursor_sr = 0;
        }
 
@@ -1418,6 +1460,9 @@ static void g4x_update_wm(struct drm_crtc *crtc)
        I915_WRITE(DSPFW3,
                   (I915_READ(DSPFW3) & ~(DSPFW_HPLL_SR_EN | DSPFW_CURSOR_SR_MASK)) |
                   (cursor_sr << DSPFW_CURSOR_SR_SHIFT));
+
+       if (cxsr_enabled)
+               intel_set_memory_cxsr(dev_priv, true);
 }
 
 static void i965_update_wm(struct drm_crtc *unused_crtc)
@@ -1427,6 +1472,7 @@ static void i965_update_wm(struct drm_crtc *unused_crtc)
        struct drm_crtc *crtc;
        int srwm = 1;
        int cursor_sr = 16;
+       bool cxsr_enabled;
 
        /* Calc sr entries for one plane configs */
        crtc = single_enabled_crtc(dev);
@@ -1468,13 +1514,11 @@ static void i965_update_wm(struct drm_crtc *unused_crtc)
                DRM_DEBUG_KMS("self-refresh watermark: display plane %d "
                              "cursor %d\n", srwm, cursor_sr);
 
-               if (IS_CRESTLINE(dev))
-                       I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN);
+               cxsr_enabled = true;
        } else {
+               cxsr_enabled = false;
                /* Turn off self refresh if both pipes are enabled */
-               if (IS_CRESTLINE(dev))
-                       I915_WRITE(FW_BLC_SELF, I915_READ(FW_BLC_SELF)
-                                  & ~FW_BLC_SELF_EN);
+               intel_set_memory_cxsr(dev_priv, false);
        }
 
        DRM_DEBUG_KMS("Setting FIFO watermarks - A: 8, B: 8, C: 8, SR %d\n",
@@ -1486,6 +1530,9 @@ static void i965_update_wm(struct drm_crtc *unused_crtc)
        I915_WRITE(DSPFW2, (8 << 8) | (8 << 0));
        /* update cursor SR watermark */
        I915_WRITE(DSPFW3, (cursor_sr << DSPFW_CURSOR_SR_SHIFT));
+
+       if (cxsr_enabled)
+               intel_set_memory_cxsr(dev_priv, true);
 }
 
 static void i9xx_update_wm(struct drm_crtc *unused_crtc)
@@ -1545,12 +1592,12 @@ static void i9xx_update_wm(struct drm_crtc *unused_crtc)
        DRM_DEBUG_KMS("FIFO watermarks - A: %d, B: %d\n", planea_wm, planeb_wm);
 
        if (IS_I915GM(dev) && enabled) {
-               struct intel_framebuffer *fb;
+               struct drm_i915_gem_object *obj;
 
-               fb = to_intel_framebuffer(enabled->primary->fb);
+               obj = intel_fb_obj(enabled->primary->fb);
 
                /* self-refresh seems busted with untiled */
-               if (fb->obj->tiling_mode == I915_TILING_NONE)
+               if (obj->tiling_mode == I915_TILING_NONE)
                        enabled = NULL;
        }
 
@@ -1560,10 +1607,7 @@ static void i9xx_update_wm(struct drm_crtc *unused_crtc)
        cwm = 2;
 
        /* Play safe and disable self-refresh before adjusting watermarks. */
-       if (IS_I945G(dev) || IS_I945GM(dev))
-               I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN_MASK | 0);
-       else if (IS_I915GM(dev))
-               I915_WRITE(INSTPM, _MASKED_BIT_DISABLE(INSTPM_SELF_EN));
+       intel_set_memory_cxsr(dev_priv, false);
 
        /* Calc sr entries for one plane configs */
        if (HAS_FW_BLC(dev) && enabled) {
@@ -1609,17 +1653,8 @@ static void i9xx_update_wm(struct drm_crtc *unused_crtc)
        I915_WRITE(FW_BLC, fwater_lo);
        I915_WRITE(FW_BLC2, fwater_hi);
 
-       if (HAS_FW_BLC(dev)) {
-               if (enabled) {
-                       if (IS_I945G(dev) || IS_I945GM(dev))
-                               I915_WRITE(FW_BLC_SELF,
-                                          FW_BLC_SELF_EN_MASK | FW_BLC_SELF_EN);
-                       else if (IS_I915GM(dev))
-                               I915_WRITE(INSTPM, _MASKED_BIT_ENABLE(INSTPM_SELF_EN));
-                       DRM_DEBUG_KMS("memory self refresh enabled\n");
-               } else
-                       DRM_DEBUG_KMS("memory self refresh disabled\n");
-       }
+       if (enabled)
+               intel_set_memory_cxsr(dev_priv, true);
 }
 
 static void i845_update_wm(struct drm_crtc *unused_crtc)
@@ -2707,10 +2742,11 @@ static void ilk_update_wm(struct drm_crtc *crtc)
        ilk_write_wm_values(dev_priv, &results);
 }
 
-static void ilk_update_sprite_wm(struct drm_plane *plane,
-                                    struct drm_crtc *crtc,
-                                    uint32_t sprite_width, int pixel_size,
-                                    bool enabled, bool scaled)
+static void
+ilk_update_sprite_wm(struct drm_plane *plane,
+                    struct drm_crtc *crtc,
+                    uint32_t sprite_width, uint32_t sprite_height,
+                    int pixel_size, bool enabled, bool scaled)
 {
        struct drm_device *dev = plane->dev;
        struct intel_plane *intel_plane = to_intel_plane(plane);
@@ -2718,6 +2754,7 @@ static void ilk_update_sprite_wm(struct drm_plane *plane,
        intel_plane->wm.enabled = enabled;
        intel_plane->wm.scaled = scaled;
        intel_plane->wm.horiz_pixels = sprite_width;
+       intel_plane->wm.vert_pixels = sprite_width;
        intel_plane->wm.bytes_per_pixel = pixel_size;
 
        /*
@@ -2852,13 +2889,16 @@ void intel_update_watermarks(struct drm_crtc *crtc)
 
 void intel_update_sprite_watermarks(struct drm_plane *plane,
                                    struct drm_crtc *crtc,
-                                   uint32_t sprite_width, int pixel_size,
+                                   uint32_t sprite_width,
+                                   uint32_t sprite_height,
+                                   int pixel_size,
                                    bool enabled, bool scaled)
 {
        struct drm_i915_private *dev_priv = plane->dev->dev_private;
 
        if (dev_priv->display.update_sprite_wm)
-               dev_priv->display.update_sprite_wm(plane, crtc, sprite_width,
+               dev_priv->display.update_sprite_wm(plane, crtc,
+                                                  sprite_width, sprite_height,
                                                   pixel_size, enabled, scaled);
 }
 
@@ -3147,6 +3187,9 @@ static u32 gen6_rps_pm_mask(struct drm_i915_private *dev_priv, u8 val)
        if (val < dev_priv->rps.max_freq_softlimit)
                mask |= GEN6_PM_RP_UP_THRESHOLD;
 
+       mask |= dev_priv->pm_rps_events & (GEN6_PM_RP_DOWN_EI_EXPIRED | GEN6_PM_RP_UP_EI_EXPIRED);
+       mask &= dev_priv->pm_rps_events;
+
        /* IVB and SNB hard hangs on looping batchbuffer
         * if GEN6_PM_UP_EI_EXPIRED is masked.
         */
@@ -3250,7 +3293,9 @@ void gen6_rps_idle(struct drm_i915_private *dev_priv)
 
        mutex_lock(&dev_priv->rps.hw_lock);
        if (dev_priv->rps.enabled) {
-               if (IS_VALLEYVIEW(dev))
+               if (IS_CHERRYVIEW(dev))
+                       valleyview_set_rps(dev_priv->dev, dev_priv->rps.min_freq_softlimit);
+               else if (IS_VALLEYVIEW(dev))
                        vlv_set_rps_idle(dev_priv);
                else
                        gen6_set_rps(dev_priv->dev, dev_priv->rps.min_freq_softlimit);
@@ -3348,6 +3393,15 @@ static void gen6_disable_rps(struct drm_device *dev)
                gen6_disable_rps_interrupts(dev);
 }
 
+static void cherryview_disable_rps(struct drm_device *dev)
+{
+       struct drm_i915_private *dev_priv = dev->dev_private;
+
+       I915_WRITE(GEN6_RC_CONTROL, 0);
+
+       gen8_disable_rps_interrupts(dev);
+}
+
 static void valleyview_disable_rps(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
@@ -3365,10 +3419,10 @@ static void intel_print_rc6_info(struct drm_device *dev, u32 mode)
                else
                        mode = 0;
        }
-       DRM_INFO("Enabling RC6 states: RC6 %s, RC6p %s, RC6pp %s\n",
-                (mode & GEN6_RC_CTL_RC6_ENABLE) ? "on" : "off",
-                (mode & GEN6_RC_CTL_RC6p_ENABLE) ? "on" : "off",
-                (mode & GEN6_RC_CTL_RC6pp_ENABLE) ? "on" : "off");
+       DRM_DEBUG_KMS("Enabling RC6 states: RC6 %s, RC6p %s, RC6pp %s\n",
+                     (mode & GEN6_RC_CTL_RC6_ENABLE) ? "on" : "off",
+                     (mode & GEN6_RC_CTL_RC6p_ENABLE) ? "on" : "off",
+                     (mode & GEN6_RC_CTL_RC6pp_ENABLE) ? "on" : "off");
 }
 
 static int sanitize_rc6_option(const struct drm_device *dev, int enable_rc6)
@@ -3392,8 +3446,8 @@ static int sanitize_rc6_option(const struct drm_device *dev, int enable_rc6)
                        mask = INTEL_RC6_ENABLE;
 
                if ((enable_rc6 & mask) != enable_rc6)
-                       DRM_INFO("Adjusting RC6 mask to %d (requested %d, valid %d)\n",
-                                enable_rc6 & mask, enable_rc6, mask);
+                       DRM_DEBUG_KMS("Adjusting RC6 mask to %d (requested %d, valid %d)\n",
+                                     enable_rc6 & mask, enable_rc6, mask);
 
                return enable_rc6 & mask;
        }
@@ -3419,7 +3473,7 @@ static void gen8_enable_rps_interrupts(struct drm_device *dev)
 
        spin_lock_irq(&dev_priv->irq_lock);
        WARN_ON(dev_priv->rps.pm_iir);
-       bdw_enable_pm_irq(dev_priv, dev_priv->pm_rps_events);
+       gen8_enable_pm_irq(dev_priv, dev_priv->pm_rps_events);
        I915_WRITE(GEN8_GT_IIR(2), dev_priv->pm_rps_events);
        spin_unlock_irq(&dev_priv->irq_lock);
 }
@@ -3430,7 +3484,7 @@ static void gen6_enable_rps_interrupts(struct drm_device *dev)
 
        spin_lock_irq(&dev_priv->irq_lock);
        WARN_ON(dev_priv->rps.pm_iir);
-       snb_enable_pm_irq(dev_priv, dev_priv->pm_rps_events);
+       gen6_enable_pm_irq(dev_priv, dev_priv->pm_rps_events);
        I915_WRITE(GEN6_PMIIR, dev_priv->pm_rps_events);
        spin_unlock_irq(&dev_priv->irq_lock);
 }
@@ -3483,15 +3537,23 @@ static void gen8_enable_rps(struct drm_device *dev)
        for_each_ring(ring, dev_priv, unused)
                I915_WRITE(RING_MAX_IDLE(ring->mmio_base), 10);
        I915_WRITE(GEN6_RC_SLEEP, 0);
-       I915_WRITE(GEN6_RC6_THRESHOLD, 50000); /* 50/125ms per EI */
+       if (IS_BROADWELL(dev))
+               I915_WRITE(GEN6_RC6_THRESHOLD, 625); /* 800us/1.28 for TO */
+       else
+               I915_WRITE(GEN6_RC6_THRESHOLD, 50000); /* 50/125ms per EI */
 
        /* 3: Enable RC6 */
        if (intel_enable_rc6(dev) & INTEL_RC6_ENABLE)
                rc6_mask = GEN6_RC_CTL_RC6_ENABLE;
        intel_print_rc6_info(dev, rc6_mask);
-       I915_WRITE(GEN6_RC_CONTROL, GEN6_RC_CTL_HW_ENABLE |
-                                   GEN6_RC_CTL_EI_MODE(1) |
-                                   rc6_mask);
+       if (IS_BROADWELL(dev))
+               I915_WRITE(GEN6_RC_CONTROL, GEN6_RC_CTL_HW_ENABLE |
+                               GEN7_RC_CTL_TO_MODE |
+                               rc6_mask);
+       else
+               I915_WRITE(GEN6_RC_CONTROL, GEN6_RC_CTL_HW_ENABLE |
+                               GEN6_RC_CTL_EI_MODE(1) |
+                               rc6_mask);
 
        /* 4 Program defaults and thresholds for RPS*/
        I915_WRITE(GEN6_RPNSWREQ,
@@ -3727,7 +3789,57 @@ void gen6_update_ring_freq(struct drm_device *dev)
        mutex_unlock(&dev_priv->rps.hw_lock);
 }
 
-int valleyview_rps_max_freq(struct drm_i915_private *dev_priv)
+static int cherryview_rps_max_freq(struct drm_i915_private *dev_priv)
+{
+       u32 val, rp0;
+
+       val = vlv_punit_read(dev_priv, PUNIT_GPU_STATUS_REG);
+       rp0 = (val >> PUNIT_GPU_STATUS_MAX_FREQ_SHIFT) & PUNIT_GPU_STATUS_MAX_FREQ_MASK;
+
+       return rp0;
+}
+
+static int cherryview_rps_rpe_freq(struct drm_i915_private *dev_priv)
+{
+       u32 val, rpe;
+
+       val = vlv_punit_read(dev_priv, PUNIT_GPU_DUTYCYCLE_REG);
+       rpe = (val >> PUNIT_GPU_DUTYCYCLE_RPE_FREQ_SHIFT) & PUNIT_GPU_DUTYCYCLE_RPE_FREQ_MASK;
+
+       return rpe;
+}
+
+static int cherryview_rps_guar_freq(struct drm_i915_private *dev_priv)
+{
+       u32 val, rp1;
+
+       val = vlv_punit_read(dev_priv, PUNIT_REG_GPU_FREQ_STS);
+       rp1 = (val >> PUNIT_GPU_STATUS_MAX_FREQ_SHIFT) & PUNIT_GPU_STATUS_MAX_FREQ_MASK;
+
+       return rp1;
+}
+
+static int cherryview_rps_min_freq(struct drm_i915_private *dev_priv)
+{
+       u32 val, rpn;
+
+       val = vlv_punit_read(dev_priv, PUNIT_GPU_STATUS_REG);
+       rpn = (val >> PUNIT_GPU_STATIS_GFX_MIN_FREQ_SHIFT) & PUNIT_GPU_STATUS_GFX_MIN_FREQ_MASK;
+       return rpn;
+}
+
+static int valleyview_rps_guar_freq(struct drm_i915_private *dev_priv)
+{
+       u32 val, rp1;
+
+       val = vlv_nc_read(dev_priv, IOSF_NC_FB_GFX_FREQ_FUSE);
+
+       rp1 = (val & FB_GFX_FGUARANTEED_FREQ_FUSE_MASK) >> FB_GFX_FGUARANTEED_FREQ_FUSE_SHIFT;
+
+       return rp1;
+}
+
+static int valleyview_rps_max_freq(struct drm_i915_private *dev_priv)
 {
        u32 val, rp0;
 
@@ -3752,7 +3864,7 @@ static int valleyview_rps_rpe_freq(struct drm_i915_private *dev_priv)
        return rpe;
 }
 
-int valleyview_rps_min_freq(struct drm_i915_private *dev_priv)
+static int valleyview_rps_min_freq(struct drm_i915_private *dev_priv)
 {
        return vlv_punit_read(dev_priv, PUNIT_REG_GPU_LFM) & 0xff;
 }
@@ -3766,6 +3878,35 @@ static void valleyview_check_pctx(struct drm_i915_private *dev_priv)
                             dev_priv->vlv_pctx->stolen->start);
 }
 
+
+/* Check that the pcbr address is not empty. */
+static void cherryview_check_pctx(struct drm_i915_private *dev_priv)
+{
+       unsigned long pctx_addr = I915_READ(VLV_PCBR) & ~4095;
+
+       WARN_ON((pctx_addr >> VLV_PCBR_ADDR_SHIFT) == 0);
+}
+
+static void cherryview_setup_pctx(struct drm_device *dev)
+{
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       unsigned long pctx_paddr, paddr;
+       struct i915_gtt *gtt = &dev_priv->gtt;
+       u32 pcbr;
+       int pctx_size = 32*1024;
+
+       WARN_ON(!mutex_is_locked(&dev->struct_mutex));
+
+       pcbr = I915_READ(VLV_PCBR);
+       if ((pcbr >> VLV_PCBR_ADDR_SHIFT) == 0) {
+               paddr = (dev_priv->mm.stolen_base +
+                        (gtt->stolen_size - pctx_size));
+
+               pctx_paddr = (paddr & (~4095));
+               I915_WRITE(VLV_PCBR, pctx_paddr);
+       }
+}
+
 static void valleyview_setup_pctx(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
@@ -3840,6 +3981,11 @@ static void valleyview_init_gt_powersave(struct drm_device *dev)
                         vlv_gpu_freq(dev_priv, dev_priv->rps.efficient_freq),
                         dev_priv->rps.efficient_freq);
 
+       dev_priv->rps.rp1_freq = valleyview_rps_guar_freq(dev_priv);
+       DRM_DEBUG_DRIVER("RP1(Guar Freq) GPU freq: %d MHz (%u)\n",
+                        vlv_gpu_freq(dev_priv, dev_priv->rps.rp1_freq),
+                        dev_priv->rps.rp1_freq);
+
        dev_priv->rps.min_freq = valleyview_rps_min_freq(dev_priv);
        DRM_DEBUG_DRIVER("min GPU freq: %d MHz (%u)\n",
                         vlv_gpu_freq(dev_priv, dev_priv->rps.min_freq),
@@ -3855,11 +4001,142 @@ static void valleyview_init_gt_powersave(struct drm_device *dev)
        mutex_unlock(&dev_priv->rps.hw_lock);
 }
 
+static void cherryview_init_gt_powersave(struct drm_device *dev)
+{
+       struct drm_i915_private *dev_priv = dev->dev_private;
+
+       cherryview_setup_pctx(dev);
+
+       mutex_lock(&dev_priv->rps.hw_lock);
+
+       dev_priv->rps.max_freq = cherryview_rps_max_freq(dev_priv);
+       dev_priv->rps.rp0_freq = dev_priv->rps.max_freq;
+       DRM_DEBUG_DRIVER("max GPU freq: %d MHz (%u)\n",
+                        vlv_gpu_freq(dev_priv, dev_priv->rps.max_freq),
+                        dev_priv->rps.max_freq);
+
+       dev_priv->rps.efficient_freq = cherryview_rps_rpe_freq(dev_priv);
+       DRM_DEBUG_DRIVER("RPe GPU freq: %d MHz (%u)\n",
+                        vlv_gpu_freq(dev_priv, dev_priv->rps.efficient_freq),
+                        dev_priv->rps.efficient_freq);
+
+       dev_priv->rps.rp1_freq = cherryview_rps_guar_freq(dev_priv);
+       DRM_DEBUG_DRIVER("RP1(Guar) GPU freq: %d MHz (%u)\n",
+                        vlv_gpu_freq(dev_priv, dev_priv->rps.rp1_freq),
+                        dev_priv->rps.rp1_freq);
+
+       dev_priv->rps.min_freq = cherryview_rps_min_freq(dev_priv);
+       DRM_DEBUG_DRIVER("min GPU freq: %d MHz (%u)\n",
+                        vlv_gpu_freq(dev_priv, dev_priv->rps.min_freq),
+                        dev_priv->rps.min_freq);
+
+       /* Preserve min/max settings in case of re-init */
+       if (dev_priv->rps.max_freq_softlimit == 0)
+               dev_priv->rps.max_freq_softlimit = dev_priv->rps.max_freq;
+
+       if (dev_priv->rps.min_freq_softlimit == 0)
+               dev_priv->rps.min_freq_softlimit = dev_priv->rps.min_freq;
+
+       mutex_unlock(&dev_priv->rps.hw_lock);
+}
+
 static void valleyview_cleanup_gt_powersave(struct drm_device *dev)
 {
        valleyview_cleanup_pctx(dev);
 }
 
+static void cherryview_enable_rps(struct drm_device *dev)
+{
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct intel_engine_cs *ring;
+       u32 gtfifodbg, val, rc6_mode = 0, pcbr;
+       int i;
+
+       WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock));
+
+       gtfifodbg = I915_READ(GTFIFODBG);
+       if (gtfifodbg) {
+               DRM_DEBUG_DRIVER("GT fifo had a previous error %x\n",
+                                gtfifodbg);
+               I915_WRITE(GTFIFODBG, gtfifodbg);
+       }
+
+       cherryview_check_pctx(dev_priv);
+
+       /* 1a & 1b: Get forcewake during program sequence. Although the driver
+        * hasn't enabled a state yet where we need forcewake, BIOS may have.*/
+       gen6_gt_force_wake_get(dev_priv, FORCEWAKE_ALL);
+
+       /* 2a: Program RC6 thresholds.*/
+       I915_WRITE(GEN6_RC6_WAKE_RATE_LIMIT, 40 << 16);
+       I915_WRITE(GEN6_RC_EVALUATION_INTERVAL, 125000); /* 12500 * 1280ns */
+       I915_WRITE(GEN6_RC_IDLE_HYSTERSIS, 25); /* 25 * 1280ns */
+
+       for_each_ring(ring, dev_priv, i)
+               I915_WRITE(RING_MAX_IDLE(ring->mmio_base), 10);
+       I915_WRITE(GEN6_RC_SLEEP, 0);
+
+       I915_WRITE(GEN6_RC6_THRESHOLD, 50000); /* 50/125ms per EI */
+
+       /* allows RC6 residency counter to work */
+       I915_WRITE(VLV_COUNTER_CONTROL,
+                  _MASKED_BIT_ENABLE(VLV_COUNT_RANGE_HIGH |
+                                     VLV_MEDIA_RC6_COUNT_EN |
+                                     VLV_RENDER_RC6_COUNT_EN));
+
+       /* For now we assume BIOS is allocating and populating the PCBR  */
+       pcbr = I915_READ(VLV_PCBR);
+
+       DRM_DEBUG_DRIVER("PCBR offset : 0x%x\n", pcbr);
+
+       /* 3: Enable RC6 */
+       if ((intel_enable_rc6(dev) & INTEL_RC6_ENABLE) &&
+                                               (pcbr >> VLV_PCBR_ADDR_SHIFT))
+               rc6_mode = GEN6_RC_CTL_EI_MODE(1);
+
+       I915_WRITE(GEN6_RC_CONTROL, rc6_mode);
+
+       /* 4 Program defaults and thresholds for RPS*/
+       I915_WRITE(GEN6_RP_UP_THRESHOLD, 59400);
+       I915_WRITE(GEN6_RP_DOWN_THRESHOLD, 245000);
+       I915_WRITE(GEN6_RP_UP_EI, 66000);
+       I915_WRITE(GEN6_RP_DOWN_EI, 350000);
+
+       I915_WRITE(GEN6_RP_IDLE_HYSTERSIS, 10);
+
+       /* WaDisablePwrmtrEvent:chv (pre-production hw) */
+       I915_WRITE(0xA80C, I915_READ(0xA80C) & 0x00ffffff);
+       I915_WRITE(0xA810, I915_READ(0xA810) & 0xffffff00);
+
+       /* 5: Enable RPS */
+       I915_WRITE(GEN6_RP_CONTROL,
+                  GEN6_RP_MEDIA_HW_NORMAL_MODE |
+                  GEN6_RP_MEDIA_IS_GFX | /* WaSetMaskForGfxBusyness:chv (pre-production hw ?) */
+                  GEN6_RP_ENABLE |
+                  GEN6_RP_UP_BUSY_AVG |
+                  GEN6_RP_DOWN_IDLE_AVG);
+
+       val = vlv_punit_read(dev_priv, PUNIT_REG_GPU_FREQ_STS);
+
+       DRM_DEBUG_DRIVER("GPLL enabled? %s\n", val & 0x10 ? "yes" : "no");
+       DRM_DEBUG_DRIVER("GPU status: 0x%08x\n", val);
+
+       dev_priv->rps.cur_freq = (val >> 8) & 0xff;
+       DRM_DEBUG_DRIVER("current GPU freq: %d MHz (%u)\n",
+                        vlv_gpu_freq(dev_priv, dev_priv->rps.cur_freq),
+                        dev_priv->rps.cur_freq);
+
+       DRM_DEBUG_DRIVER("setting GPU freq to %d MHz (%u)\n",
+                        vlv_gpu_freq(dev_priv, dev_priv->rps.efficient_freq),
+                        dev_priv->rps.efficient_freq);
+
+       valleyview_set_rps(dev_priv->dev, dev_priv->rps.efficient_freq);
+
+       gen8_enable_rps_interrupts(dev);
+
+       gen6_gt_force_wake_put(dev_priv, FORCEWAKE_ALL);
+}
+
 static void valleyview_enable_rps(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
@@ -3886,6 +4163,7 @@ static void valleyview_enable_rps(struct drm_device *dev)
        I915_WRITE(GEN6_RP_DOWN_EI, 350000);
 
        I915_WRITE(GEN6_RP_IDLE_HYSTERSIS, 10);
+       I915_WRITE(GEN6_RP_DOWN_TIMEOUT, 0xf4240);
 
        I915_WRITE(GEN6_RP_CONTROL,
                   GEN6_RP_MEDIA_TURBO |
@@ -3906,9 +4184,11 @@ static void valleyview_enable_rps(struct drm_device *dev)
 
        /* allows RC6 residency counter to work */
        I915_WRITE(VLV_COUNTER_CONTROL,
-                  _MASKED_BIT_ENABLE(VLV_COUNT_RANGE_HIGH |
+                  _MASKED_BIT_ENABLE(VLV_MEDIA_RC0_COUNT_EN |
+                                     VLV_RENDER_RC0_COUNT_EN |
                                      VLV_MEDIA_RC6_COUNT_EN |
                                      VLV_RENDER_RC6_COUNT_EN));
+
        if (intel_enable_rc6(dev) & INTEL_RC6_ENABLE)
                rc6_mode = GEN7_RC_CTL_TO_MODE | VLV_RC_CTL_CTX_RST_PARALLEL;
 
@@ -4666,33 +4946,60 @@ void intel_init_gt_powersave(struct drm_device *dev)
 {
        i915.enable_rc6 = sanitize_rc6_option(dev, i915.enable_rc6);
 
-       if (IS_VALLEYVIEW(dev))
+       if (IS_CHERRYVIEW(dev))
+               cherryview_init_gt_powersave(dev);
+       else if (IS_VALLEYVIEW(dev))
                valleyview_init_gt_powersave(dev);
 }
 
 void intel_cleanup_gt_powersave(struct drm_device *dev)
 {
-       if (IS_VALLEYVIEW(dev))
+       if (IS_CHERRYVIEW(dev))
+               return;
+       else if (IS_VALLEYVIEW(dev))
                valleyview_cleanup_gt_powersave(dev);
 }
 
+/**
+ * intel_suspend_gt_powersave - suspend PM work and helper threads
+ * @dev: drm device
+ *
+ * We don't want to disable RC6 or other features here, we just want
+ * to make sure any work we've queued has finished and won't bother
+ * us while we're suspended.
+ */
+void intel_suspend_gt_powersave(struct drm_device *dev)
+{
+       struct drm_i915_private *dev_priv = dev->dev_private;
+
+       /* Interrupts should be disabled already to avoid re-arming. */
+       WARN_ON(intel_irqs_enabled(dev_priv));
+
+       flush_delayed_work(&dev_priv->rps.delayed_resume_work);
+
+       cancel_work_sync(&dev_priv->rps.work);
+
+       /* Force GPU to min freq during suspend */
+       gen6_rps_idle(dev_priv);
+}
+
 void intel_disable_gt_powersave(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
 
        /* Interrupts should be disabled already to avoid re-arming. */
-       WARN_ON(dev->irq_enabled);
+       WARN_ON(intel_irqs_enabled(dev_priv));
 
        if (IS_IRONLAKE_M(dev)) {
                ironlake_disable_drps(dev);
                ironlake_disable_rc6(dev);
-       } else if (IS_GEN6(dev) || IS_GEN7(dev) || IS_BROADWELL(dev)) {
-               if (cancel_delayed_work_sync(&dev_priv->rps.delayed_resume_work))
-                       intel_runtime_pm_put(dev_priv);
+       } else if (INTEL_INFO(dev)->gen >= 6) {
+               intel_suspend_gt_powersave(dev);
 
-               cancel_work_sync(&dev_priv->rps.work);
                mutex_lock(&dev_priv->rps.hw_lock);
-               if (IS_VALLEYVIEW(dev))
+               if (IS_CHERRYVIEW(dev))
+                       cherryview_disable_rps(dev);
+               else if (IS_VALLEYVIEW(dev))
                        valleyview_disable_rps(dev);
                else
                        gen6_disable_rps(dev);
@@ -4710,7 +5017,9 @@ static void intel_gen6_powersave_work(struct work_struct *work)
 
        mutex_lock(&dev_priv->rps.hw_lock);
 
-       if (IS_VALLEYVIEW(dev)) {
+       if (IS_CHERRYVIEW(dev)) {
+               cherryview_enable_rps(dev);
+       } else if (IS_VALLEYVIEW(dev)) {
                valleyview_enable_rps(dev);
        } else if (IS_BROADWELL(dev)) {
                gen8_enable_rps(dev);
@@ -4735,7 +5044,7 @@ void intel_enable_gt_powersave(struct drm_device *dev)
                ironlake_enable_rc6(dev);
                intel_init_emon(dev);
                mutex_unlock(&dev->struct_mutex);
-       } else if (IS_GEN6(dev) || IS_GEN7(dev) || IS_BROADWELL(dev)) {
+       } else if (INTEL_INFO(dev)->gen >= 6) {
                /*
                 * PCU communication is slow and this doesn't need to be
                 * done at any specific time, so do this out of our fast path
@@ -4918,11 +5227,9 @@ static void gen6_check_mch_setup(struct drm_device *dev)
        uint32_t tmp;
 
        tmp = I915_READ(MCH_SSKPD);
-       if ((tmp & MCH_SSKPD_WM0_MASK) != MCH_SSKPD_WM0_VAL) {
-               DRM_INFO("Wrong MCH_SSKPD value: 0x%08x\n", tmp);
-               DRM_INFO("This can cause pipe underruns and display issues.\n");
-               DRM_INFO("Please upgrade your BIOS to fix this.\n");
-       }
+       if ((tmp & MCH_SSKPD_WM0_MASK) != MCH_SSKPD_WM0_VAL)
+               DRM_DEBUG_KMS("Wrong MCH_SSKPD value: 0x%08x This can cause underruns.\n",
+                             tmp);
 }
 
 static void gen6_init_clock_gating(struct drm_device *dev)
@@ -5108,7 +5415,7 @@ static void gen8_init_clock_gating(struct drm_device *dev)
        I915_WRITE(GAMTARBMODE, _MASKED_BIT_ENABLE(ARB_MODE_BWGTLB_DISABLE));
 
        I915_WRITE(_3D_CHICKEN3,
-                  _3D_CHICKEN_SDE_LIMIT_FIFO_POLY_DEPTH(2));
+                  _MASKED_BIT_ENABLE(_3D_CHICKEN_SDE_LIMIT_FIFO_POLY_DEPTH(2)));
 
        I915_WRITE(COMMON_SLICE_CHICKEN2,
                   _MASKED_BIT_ENABLE(GEN8_CSC2_SBE_VUE_CACHE_CONSERVATIVE));
@@ -5343,10 +5650,6 @@ static void valleyview_init_clock_gating(struct drm_device *dev)
        }
        DRM_DEBUG_DRIVER("DDR speed: %d MHz", dev_priv->mem_freq);
 
-       dev_priv->vlv_cdclk_freq = valleyview_cur_cdclk(dev_priv);
-       DRM_DEBUG_DRIVER("Current CD clock rate: %d MHz",
-                        dev_priv->vlv_cdclk_freq);
-
        I915_WRITE(DSPCLK_GATE_D, VRHUNIT_CLOCK_GATE_DISABLE);
 
        /* WaDisableEarlyCull:vlv */
@@ -5421,6 +5724,35 @@ static void valleyview_init_clock_gating(struct drm_device *dev)
 static void cherryview_init_clock_gating(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
+       u32 val;
+
+       mutex_lock(&dev_priv->rps.hw_lock);
+       val = vlv_punit_read(dev_priv, CCK_FUSE_REG);
+       mutex_unlock(&dev_priv->rps.hw_lock);
+       switch ((val >> 2) & 0x7) {
+       case 0:
+       case 1:
+                       dev_priv->rps.cz_freq = CHV_CZ_CLOCK_FREQ_MODE_200;
+                       dev_priv->mem_freq = 1600;
+                       break;
+       case 2:
+                       dev_priv->rps.cz_freq = CHV_CZ_CLOCK_FREQ_MODE_267;
+                       dev_priv->mem_freq = 1600;
+                       break;
+       case 3:
+                       dev_priv->rps.cz_freq = CHV_CZ_CLOCK_FREQ_MODE_333;
+                       dev_priv->mem_freq = 2000;
+                       break;
+       case 4:
+                       dev_priv->rps.cz_freq = CHV_CZ_CLOCK_FREQ_MODE_320;
+                       dev_priv->mem_freq = 1600;
+                       break;
+       case 5:
+                       dev_priv->rps.cz_freq = CHV_CZ_CLOCK_FREQ_MODE_400;
+                       dev_priv->mem_freq = 1600;
+                       break;
+       }
+       DRM_DEBUG_DRIVER("DDR speed: %d MHz", dev_priv->mem_freq);
 
        I915_WRITE(DSPCLK_GATE_D, VRHUNIT_CLOCK_GATE_DISABLE);
 
@@ -5661,7 +5993,6 @@ bool intel_display_power_enabled(struct drm_i915_private *dev_priv,
 static void hsw_power_well_post_enable(struct drm_i915_private *dev_priv)
 {
        struct drm_device *dev = dev_priv->dev;
-       unsigned long irqflags;
 
        /*
         * After we re-enable the power well, if we touch VGA register 0x3d5
@@ -5677,21 +6008,8 @@ static void hsw_power_well_post_enable(struct drm_i915_private *dev_priv)
        outb(inb(VGA_MSR_READ), VGA_MSR_WRITE);
        vga_put(dev->pdev, VGA_RSRC_LEGACY_IO);
 
-       if (IS_BROADWELL(dev)) {
-               spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
-               I915_WRITE(GEN8_DE_PIPE_IMR(PIPE_B),
-                          dev_priv->de_irq_mask[PIPE_B]);
-               I915_WRITE(GEN8_DE_PIPE_IER(PIPE_B),
-                          ~dev_priv->de_irq_mask[PIPE_B] |
-                          GEN8_PIPE_VBLANK);
-               I915_WRITE(GEN8_DE_PIPE_IMR(PIPE_C),
-                          dev_priv->de_irq_mask[PIPE_C]);
-               I915_WRITE(GEN8_DE_PIPE_IER(PIPE_C),
-                          ~dev_priv->de_irq_mask[PIPE_C] |
-                          GEN8_PIPE_VBLANK);
-               POSTING_READ(GEN8_DE_PIPE_IER(PIPE_C));
-               spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
-       }
+       if (IS_BROADWELL(dev))
+               gen8_irq_power_well_post_enable(dev_priv);
 }
 
 static void hsw_set_power_well(struct drm_i915_private *dev_priv,
@@ -5762,34 +6080,13 @@ static bool i9xx_always_on_power_well_enabled(struct drm_i915_private *dev_priv,
        return true;
 }
 
-void __vlv_set_power_well(struct drm_i915_private *dev_priv,
-                         enum punit_power_well power_well_id, bool enable)
+static void vlv_set_power_well(struct drm_i915_private *dev_priv,
+                              struct i915_power_well *power_well, bool enable)
 {
-       struct drm_device *dev = dev_priv->dev;
+       enum punit_power_well power_well_id = power_well->data;
        u32 mask;
        u32 state;
        u32 ctrl;
-       enum pipe pipe;
-
-       if (power_well_id == PUNIT_POWER_WELL_DPIO_CMN_BC) {
-               if (enable) {
-                       /*
-                        * Enable the CRI clock source so we can get at the
-                        * display and the reference clock for VGA
-                        * hotplug / manual detection.
-                        */
-                       I915_WRITE(DPLL(PIPE_B), I915_READ(DPLL(PIPE_B)) |
-                                  DPLL_REFA_CLK_ENABLE_VLV |
-                                  DPLL_INTEGRATED_CRI_CLK_VLV);
-                       udelay(1); /* >10ns for cmnreset, >0ns for sidereset */
-               } else {
-                       for_each_pipe(pipe)
-                               assert_pll_disabled(dev_priv, pipe);
-                       /* Assert common reset */
-                       I915_WRITE(DPIO_CTL, I915_READ(DPIO_CTL) &
-                                  ~DPIO_CMNRST);
-               }
-       }
 
        mask = PUNIT_PWRGT_MASK(power_well_id);
        state = enable ? PUNIT_PWRGT_PWR_ON(power_well_id) :
@@ -5817,28 +6114,6 @@ void __vlv_set_power_well(struct drm_i915_private *dev_priv,
 
 out:
        mutex_unlock(&dev_priv->rps.hw_lock);
-
-       /*
-        * From VLV2A0_DP_eDP_DPIO_driver_vbios_notes_10.docx -
-        *  6.  De-assert cmn_reset/side_reset. Same as VLV X0.
-        *   a. GUnit 0x2110 bit[0] set to 1 (def 0)
-        *   b. The other bits such as sfr settings / modesel may all
-        *      be set to 0.
-        *
-        * This should only be done on init and resume from S3 with
-        * both PLLs disabled, or we risk losing DPIO and PLL
-        * synchronization.
-        */
-       if (power_well_id == PUNIT_POWER_WELL_DPIO_CMN_BC && enable)
-               I915_WRITE(DPIO_CTL, I915_READ(DPIO_CTL) | DPIO_CMNRST);
-}
-
-static void vlv_set_power_well(struct drm_i915_private *dev_priv,
-                              struct i915_power_well *power_well, bool enable)
-{
-       enum punit_power_well power_well_id = power_well->data;
-
-       __vlv_set_power_well(dev_priv, power_well_id, enable);
 }
 
 static void vlv_power_well_sync_hw(struct drm_i915_private *dev_priv,
@@ -5930,6 +6205,53 @@ static void vlv_display_power_well_disable(struct drm_i915_private *dev_priv,
        vlv_set_power_well(dev_priv, power_well, false);
 }
 
+static void vlv_dpio_cmn_power_well_enable(struct drm_i915_private *dev_priv,
+                                          struct i915_power_well *power_well)
+{
+       WARN_ON_ONCE(power_well->data != PUNIT_POWER_WELL_DPIO_CMN_BC);
+
+       /*
+        * Enable the CRI clock source so we can get at the
+        * display and the reference clock for VGA
+        * hotplug / manual detection.
+        */
+       I915_WRITE(DPLL(PIPE_B), I915_READ(DPLL(PIPE_B)) |
+                  DPLL_REFA_CLK_ENABLE_VLV | DPLL_INTEGRATED_CRI_CLK_VLV);
+       udelay(1); /* >10ns for cmnreset, >0ns for sidereset */
+
+       vlv_set_power_well(dev_priv, power_well, true);
+
+       /*
+        * From VLV2A0_DP_eDP_DPIO_driver_vbios_notes_10.docx -
+        *  6.  De-assert cmn_reset/side_reset. Same as VLV X0.
+        *   a. GUnit 0x2110 bit[0] set to 1 (def 0)
+        *   b. The other bits such as sfr settings / modesel may all
+        *      be set to 0.
+        *
+        * This should only be done on init and resume from S3 with
+        * both PLLs disabled, or we risk losing DPIO and PLL
+        * synchronization.
+        */
+       I915_WRITE(DPIO_CTL, I915_READ(DPIO_CTL) | DPIO_CMNRST);
+}
+
+static void vlv_dpio_cmn_power_well_disable(struct drm_i915_private *dev_priv,
+                                           struct i915_power_well *power_well)
+{
+       struct drm_device *dev = dev_priv->dev;
+       enum pipe pipe;
+
+       WARN_ON_ONCE(power_well->data != PUNIT_POWER_WELL_DPIO_CMN_BC);
+
+       for_each_pipe(pipe)
+               assert_pll_disabled(dev_priv, pipe);
+
+       /* Assert common reset */
+       I915_WRITE(DPIO_CTL, I915_READ(DPIO_CTL) & ~DPIO_CMNRST);
+
+       vlv_set_power_well(dev_priv, power_well, false);
+}
+
 static void check_power_well_state(struct drm_i915_private *dev_priv,
                                   struct i915_power_well *power_well)
 {
@@ -6079,6 +6401,7 @@ EXPORT_SYMBOL_GPL(i915_get_cdclk_freq);
        BIT(POWER_DOMAIN_PORT_DDI_D_2_LANES) |          \
        BIT(POWER_DOMAIN_PORT_DDI_D_4_LANES) |          \
        BIT(POWER_DOMAIN_PORT_CRT) |                    \
+       BIT(POWER_DOMAIN_PLLS) |                        \
        BIT(POWER_DOMAIN_INIT))
 #define HSW_DISPLAY_POWER_DOMAINS (                            \
        (POWER_DOMAIN_MASK & ~HSW_ALWAYS_ON_POWER_DOMAINS) |    \
@@ -6178,6 +6501,13 @@ static const struct i915_power_well_ops vlv_display_power_well_ops = {
        .is_enabled = vlv_power_well_enabled,
 };
 
+static const struct i915_power_well_ops vlv_dpio_cmn_power_well_ops = {
+       .sync_hw = vlv_power_well_sync_hw,
+       .enable = vlv_dpio_cmn_power_well_enable,
+       .disable = vlv_dpio_cmn_power_well_disable,
+       .is_enabled = vlv_power_well_enabled,
+};
+
 static const struct i915_power_well_ops vlv_dpio_power_well_ops = {
        .sync_hw = vlv_power_well_sync_hw,
        .enable = vlv_power_well_enable,
@@ -6238,10 +6568,25 @@ static struct i915_power_well vlv_power_wells[] = {
                .name = "dpio-common",
                .domains = VLV_DPIO_CMN_BC_POWER_DOMAINS,
                .data = PUNIT_POWER_WELL_DPIO_CMN_BC,
-               .ops = &vlv_dpio_power_well_ops,
+               .ops = &vlv_dpio_cmn_power_well_ops,
        },
 };
 
+static struct i915_power_well *lookup_power_well(struct drm_i915_private *dev_priv,
+                                                enum punit_power_well power_well_id)
+{
+       struct i915_power_domains *power_domains = &dev_priv->power_domains;
+       struct i915_power_well *power_well;
+       int i;
+
+       for_each_power_well(i, power_well, POWER_DOMAIN_MASK, power_domains) {
+               if (power_well->data == power_well_id)
+                       return power_well;
+       }
+
+       return NULL;
+}
+
 #define set_power_wells(power_domains, __power_wells) ({               \
        (power_domains)->power_wells = (__power_wells);                 \
        (power_domains)->power_well_count = ARRAY_SIZE(__power_wells);  \
@@ -6292,11 +6637,50 @@ static void intel_power_domains_resume(struct drm_i915_private *dev_priv)
        mutex_unlock(&power_domains->lock);
 }
 
+static void vlv_cmnlane_wa(struct drm_i915_private *dev_priv)
+{
+       struct i915_power_well *cmn =
+               lookup_power_well(dev_priv, PUNIT_POWER_WELL_DPIO_CMN_BC);
+       struct i915_power_well *disp2d =
+               lookup_power_well(dev_priv, PUNIT_POWER_WELL_DISP2D);
+
+       /* nothing to do if common lane is already off */
+       if (!cmn->ops->is_enabled(dev_priv, cmn))
+               return;
+
+       /* If the display might be already active skip this */
+       if (disp2d->ops->is_enabled(dev_priv, disp2d) &&
+           I915_READ(DPIO_CTL) & DPIO_CMNRST)
+               return;
+
+       DRM_DEBUG_KMS("toggling display PHY side reset\n");
+
+       /* cmnlane needs DPLL registers */
+       disp2d->ops->enable(dev_priv, disp2d);
+
+       /*
+        * From VLV2A0_DP_eDP_HDMI_DPIO_driver_vbios_notes_11.docx:
+        * Need to assert and de-assert PHY SB reset by gating the
+        * common lane power, then un-gating it.
+        * Simply ungating isn't enough to reset the PHY enough to get
+        * ports and lanes running.
+        */
+       cmn->ops->disable(dev_priv, cmn);
+}
+
 void intel_power_domains_init_hw(struct drm_i915_private *dev_priv)
 {
+       struct drm_device *dev = dev_priv->dev;
        struct i915_power_domains *power_domains = &dev_priv->power_domains;
 
        power_domains->initializing = true;
+
+       if (IS_VALLEYVIEW(dev) && !IS_CHERRYVIEW(dev)) {
+               mutex_lock(&power_domains->lock);
+               vlv_cmnlane_wa(dev_priv);
+               mutex_unlock(&power_domains->lock);
+       }
+
        /* For now, we need the power well to be always enabled. */
        intel_display_set_init_power(dev_priv, true);
        intel_power_domains_resume(dev_priv);
@@ -6469,7 +6853,7 @@ void intel_init_pm(struct drm_device *dev)
                                 (dev_priv->is_ddr3 == 1) ? "3" : "2",
                                 dev_priv->fsb_freq, dev_priv->mem_freq);
                        /* Disable CxSR and never update its watermark again */
-                       pineview_disable_cxsr(dev);
+                       intel_set_memory_cxsr(dev_priv, false);
                        dev_priv->display.update_wm = NULL;
                } else
                        dev_priv->display.update_wm = pineview_update_wm;
@@ -6552,7 +6936,7 @@ int sandybridge_pcode_write(struct drm_i915_private *dev_priv, u8 mbox, u32 val)
        return 0;
 }
 
-int vlv_gpu_freq(struct drm_i915_private *dev_priv, int val)
+static int byt_gpu_freq(struct drm_i915_private *dev_priv, int val)
 {
        int div;
 
@@ -6574,7 +6958,7 @@ int vlv_gpu_freq(struct drm_i915_private *dev_priv, int val)
        return DIV_ROUND_CLOSEST(dev_priv->mem_freq * (val + 6 - 0xbd), 4 * div);
 }
 
-int vlv_freq_opcode(struct drm_i915_private *dev_priv, int val)
+static int byt_freq_opcode(struct drm_i915_private *dev_priv, int val)
 {
        int mul;
 
@@ -6596,6 +6980,80 @@ int vlv_freq_opcode(struct drm_i915_private *dev_priv, int val)
        return DIV_ROUND_CLOSEST(4 * mul * val, dev_priv->mem_freq) + 0xbd - 6;
 }
 
+static int chv_gpu_freq(struct drm_i915_private *dev_priv, int val)
+{
+       int div, freq;
+
+       switch (dev_priv->rps.cz_freq) {
+       case 200:
+               div = 5;
+               break;
+       case 267:
+               div = 6;
+               break;
+       case 320:
+       case 333:
+       case 400:
+               div = 8;
+               break;
+       default:
+               return -1;
+       }
+
+       freq = (DIV_ROUND_CLOSEST((dev_priv->rps.cz_freq * val), 2 * div) / 2);
+
+       return freq;
+}
+
+static int chv_freq_opcode(struct drm_i915_private *dev_priv, int val)
+{
+       int mul, opcode;
+
+       switch (dev_priv->rps.cz_freq) {
+       case 200:
+               mul = 5;
+               break;
+       case 267:
+               mul = 6;
+               break;
+       case 320:
+       case 333:
+       case 400:
+               mul = 8;
+               break;
+       default:
+               return -1;
+       }
+
+       opcode = (DIV_ROUND_CLOSEST((val * 2 * mul), dev_priv->rps.cz_freq) * 2);
+
+       return opcode;
+}
+
+int vlv_gpu_freq(struct drm_i915_private *dev_priv, int val)
+{
+       int ret = -1;
+
+       if (IS_CHERRYVIEW(dev_priv->dev))
+               ret = chv_gpu_freq(dev_priv, val);
+       else if (IS_VALLEYVIEW(dev_priv->dev))
+               ret = byt_gpu_freq(dev_priv, val);
+
+       return ret;
+}
+
+int vlv_freq_opcode(struct drm_i915_private *dev_priv, int val)
+{
+       int ret = -1;
+
+       if (IS_CHERRYVIEW(dev_priv->dev))
+               ret = chv_freq_opcode(dev_priv, val);
+       else if (IS_VALLEYVIEW(dev_priv->dev))
+               ret = byt_freq_opcode(dev_priv, val);
+
+       return ret;
+}
+
 void intel_pm_setup(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
@@ -6606,5 +7064,5 @@ void intel_pm_setup(struct drm_device *dev)
                          intel_gen6_powersave_work);
 
        dev_priv->pm.suspended = false;
-       dev_priv->pm.irqs_disabled = false;
+       dev_priv->pm._irqs_disabled = false;
 }
index a5e783a9928a40fff80297cf71725151fbdae30f..fd4f66231d30edec7d96236fac145e2b00b7b0c5 100644 (file)
@@ -28,7 +28,6 @@
 
 struct intel_renderstate_rodata {
        const u32 *reloc;
-       const u32 reloc_items;
        const u32 *batch;
        const u32 batch_items;
 };
@@ -40,7 +39,6 @@ extern const struct intel_renderstate_rodata gen8_null_state;
 #define RO_RENDERSTATE(_g)                                             \
        const struct intel_renderstate_rodata gen ## _g ## _null_state = { \
                .reloc = gen ## _g ## _null_state_relocs,               \
-               .reloc_items = sizeof(gen ## _g ## _null_state_relocs)/4, \
                .batch = gen ## _g ## _null_state_batch,                \
                .batch_items = sizeof(gen ## _g ## _null_state_batch)/4, \
        }
index 740538ad09771638b6a184331a0c357cdaebc8ec..56c1429d8a60d2dadaaf3b95c2e7d74b13fc1cb4 100644 (file)
@@ -6,6 +6,7 @@ static const u32 gen6_null_state_relocs[] = {
        0x0000002c,
        0x000001e0,
        0x000001e4,
+       -1,
 };
 
 static const u32 gen6_null_state_batch[] = {
index 6fa7ff2a12983d847c17380f55c22bb9fb87d477..419e35a7b0ff391289c1dff980a90ea7468b7010 100644 (file)
@@ -5,6 +5,7 @@ static const u32 gen7_null_state_relocs[] = {
        0x00000010,
        0x00000018,
        0x000001ec,
+       -1,
 };
 
 static const u32 gen7_null_state_batch[] = {
index 5c875615d42acc58deba2bf75d02a92bff8292ef..75ef1b5de45c12c33337b00db36b30d199d9eb20 100644 (file)
@@ -5,6 +5,7 @@ static const u32 gen8_null_state_relocs[] = {
        0x00000050,
        0x00000060,
        0x000003ec,
+       -1,
 };
 
 static const u32 gen8_null_state_batch[] = {
index 279488addf3f6bd7afb194bf29479a9228390460..16371a444426d190d73b4baddd38cd8abeae66b2 100644 (file)
@@ -48,9 +48,8 @@ static inline int __ring_space(int head, int tail, int size)
        return space;
 }
 
-static inline int ring_space(struct intel_engine_cs *ring)
+static inline int ring_space(struct intel_ringbuffer *ringbuf)
 {
-       struct intel_ringbuffer *ringbuf = ring->buffer;
        return __ring_space(ringbuf->head & HEAD_ADDR, ringbuf->tail, ringbuf->size);
 }
 
@@ -380,6 +379,27 @@ gen7_render_ring_flush(struct intel_engine_cs *ring,
        return 0;
 }
 
+static int
+gen8_emit_pipe_control(struct intel_engine_cs *ring,
+                      u32 flags, u32 scratch_addr)
+{
+       int ret;
+
+       ret = intel_ring_begin(ring, 6);
+       if (ret)
+               return ret;
+
+       intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(6));
+       intel_ring_emit(ring, flags);
+       intel_ring_emit(ring, scratch_addr);
+       intel_ring_emit(ring, 0);
+       intel_ring_emit(ring, 0);
+       intel_ring_emit(ring, 0);
+       intel_ring_advance(ring);
+
+       return 0;
+}
+
 static int
 gen8_render_ring_flush(struct intel_engine_cs *ring,
                       u32 invalidate_domains, u32 flush_domains)
@@ -403,22 +423,17 @@ gen8_render_ring_flush(struct intel_engine_cs *ring,
                flags |= PIPE_CONTROL_STATE_CACHE_INVALIDATE;
                flags |= PIPE_CONTROL_QW_WRITE;
                flags |= PIPE_CONTROL_GLOBAL_GTT_IVB;
-       }
-
-       ret = intel_ring_begin(ring, 6);
-       if (ret)
-               return ret;
 
-       intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(6));
-       intel_ring_emit(ring, flags);
-       intel_ring_emit(ring, scratch_addr);
-       intel_ring_emit(ring, 0);
-       intel_ring_emit(ring, 0);
-       intel_ring_emit(ring, 0);
-       intel_ring_advance(ring);
-
-       return 0;
+               /* WaCsStallBeforeStateCacheInvalidate:bdw,chv */
+               ret = gen8_emit_pipe_control(ring,
+                                            PIPE_CONTROL_CS_STALL |
+                                            PIPE_CONTROL_STALL_AT_SCOREBOARD,
+                                            0);
+               if (ret)
+                       return ret;
+       }
 
+       return gen8_emit_pipe_control(ring, flags, scratch_addr);
 }
 
 static void ring_write_tail(struct intel_engine_cs *ring,
@@ -517,6 +532,9 @@ static int init_ring_common(struct intel_engine_cs *ring)
        else
                ring_setup_phys_status_page(ring);
 
+       /* Enforce ordering by reading HEAD register back */
+       I915_READ_HEAD(ring);
+
        /* Initialize the ring. This must happen _after_ we've cleared the ring
         * registers with the above sequence (the readback of the HEAD registers
         * also enforces ordering), otherwise the hw might lose the new ring
@@ -545,7 +563,7 @@ static int init_ring_common(struct intel_engine_cs *ring)
        else {
                ringbuf->head = I915_READ_HEAD(ring);
                ringbuf->tail = I915_READ_TAIL(ring) & TAIL_ADDR;
-               ringbuf->space = ring_space(ring);
+               ringbuf->space = ring_space(ringbuf);
                ringbuf->last_retired_head = -1;
        }
 
@@ -604,6 +622,8 @@ static int init_render_ring(struct intel_engine_cs *ring)
        struct drm_device *dev = ring->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        int ret = init_ring_common(ring);
+       if (ret)
+               return ret;
 
        /* WaTimedSingleVertexDispatch:cl,bw,ctg,elk,ilk,snb */
        if (INTEL_INFO(dev)->gen >= 4 && INTEL_INFO(dev)->gen < 7)
@@ -658,6 +678,13 @@ static int init_render_ring(struct intel_engine_cs *ring)
 static void render_ring_cleanup(struct intel_engine_cs *ring)
 {
        struct drm_device *dev = ring->dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+
+       if (dev_priv->semaphore_obj) {
+               i915_gem_object_ggtt_unpin(dev_priv->semaphore_obj);
+               drm_gem_object_unreference(&dev_priv->semaphore_obj->base);
+               dev_priv->semaphore_obj = NULL;
+       }
 
        if (ring->scratch.obj == NULL)
                return;
@@ -671,29 +698,96 @@ static void render_ring_cleanup(struct intel_engine_cs *ring)
        ring->scratch.obj = NULL;
 }
 
+static int gen8_rcs_signal(struct intel_engine_cs *signaller,
+                          unsigned int num_dwords)
+{
+#define MBOX_UPDATE_DWORDS 8
+       struct drm_device *dev = signaller->dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct intel_engine_cs *waiter;
+       int i, ret, num_rings;
+
+       num_rings = hweight32(INTEL_INFO(dev)->ring_mask);
+       num_dwords += (num_rings-1) * MBOX_UPDATE_DWORDS;
+#undef MBOX_UPDATE_DWORDS
+
+       ret = intel_ring_begin(signaller, num_dwords);
+       if (ret)
+               return ret;
+
+       for_each_ring(waiter, dev_priv, i) {
+               u64 gtt_offset = signaller->semaphore.signal_ggtt[i];
+               if (gtt_offset == MI_SEMAPHORE_SYNC_INVALID)
+                       continue;
+
+               intel_ring_emit(signaller, GFX_OP_PIPE_CONTROL(6));
+               intel_ring_emit(signaller, PIPE_CONTROL_GLOBAL_GTT_IVB |
+                                          PIPE_CONTROL_QW_WRITE |
+                                          PIPE_CONTROL_FLUSH_ENABLE);
+               intel_ring_emit(signaller, lower_32_bits(gtt_offset));
+               intel_ring_emit(signaller, upper_32_bits(gtt_offset));
+               intel_ring_emit(signaller, signaller->outstanding_lazy_seqno);
+               intel_ring_emit(signaller, 0);
+               intel_ring_emit(signaller, MI_SEMAPHORE_SIGNAL |
+                                          MI_SEMAPHORE_TARGET(waiter->id));
+               intel_ring_emit(signaller, 0);
+       }
+
+       return 0;
+}
+
+static int gen8_xcs_signal(struct intel_engine_cs *signaller,
+                          unsigned int num_dwords)
+{
+#define MBOX_UPDATE_DWORDS 6
+       struct drm_device *dev = signaller->dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct intel_engine_cs *waiter;
+       int i, ret, num_rings;
+
+       num_rings = hweight32(INTEL_INFO(dev)->ring_mask);
+       num_dwords += (num_rings-1) * MBOX_UPDATE_DWORDS;
+#undef MBOX_UPDATE_DWORDS
+
+       ret = intel_ring_begin(signaller, num_dwords);
+       if (ret)
+               return ret;
+
+       for_each_ring(waiter, dev_priv, i) {
+               u64 gtt_offset = signaller->semaphore.signal_ggtt[i];
+               if (gtt_offset == MI_SEMAPHORE_SYNC_INVALID)
+                       continue;
+
+               intel_ring_emit(signaller, (MI_FLUSH_DW + 1) |
+                                          MI_FLUSH_DW_OP_STOREDW);
+               intel_ring_emit(signaller, lower_32_bits(gtt_offset) |
+                                          MI_FLUSH_DW_USE_GTT);
+               intel_ring_emit(signaller, upper_32_bits(gtt_offset));
+               intel_ring_emit(signaller, signaller->outstanding_lazy_seqno);
+               intel_ring_emit(signaller, MI_SEMAPHORE_SIGNAL |
+                                          MI_SEMAPHORE_TARGET(waiter->id));
+               intel_ring_emit(signaller, 0);
+       }
+
+       return 0;
+}
+
 static int gen6_signal(struct intel_engine_cs *signaller,
                       unsigned int num_dwords)
 {
        struct drm_device *dev = signaller->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_engine_cs *useless;
-       int i, ret;
+       int i, ret, num_rings;
 
-       /* NB: In order to be able to do semaphore MBOX updates for varying
-        * number of rings, it's easiest if we round up each individual update
-        * to a multiple of 2 (since ring updates must always be a multiple of
-        * 2) even though the actual update only requires 3 dwords.
-        */
-#define MBOX_UPDATE_DWORDS 4
-       if (i915_semaphore_is_enabled(dev))
-               num_dwords += ((I915_NUM_RINGS-1) * MBOX_UPDATE_DWORDS);
-       else
-               return intel_ring_begin(signaller, num_dwords);
+#define MBOX_UPDATE_DWORDS 3
+       num_rings = hweight32(INTEL_INFO(dev)->ring_mask);
+       num_dwords += round_up((num_rings-1) * MBOX_UPDATE_DWORDS, 2);
+#undef MBOX_UPDATE_DWORDS
 
        ret = intel_ring_begin(signaller, num_dwords);
        if (ret)
                return ret;
-#undef MBOX_UPDATE_DWORDS
 
        for_each_ring(useless, dev_priv, i) {
                u32 mbox_reg = signaller->semaphore.mbox.signal[i];
@@ -701,15 +795,13 @@ static int gen6_signal(struct intel_engine_cs *signaller,
                        intel_ring_emit(signaller, MI_LOAD_REGISTER_IMM(1));
                        intel_ring_emit(signaller, mbox_reg);
                        intel_ring_emit(signaller, signaller->outstanding_lazy_seqno);
-                       intel_ring_emit(signaller, MI_NOOP);
-               } else {
-                       intel_ring_emit(signaller, MI_NOOP);
-                       intel_ring_emit(signaller, MI_NOOP);
-                       intel_ring_emit(signaller, MI_NOOP);
-                       intel_ring_emit(signaller, MI_NOOP);
                }
        }
 
+       /* If num_dwords was rounded, make sure the tail pointer is correct */
+       if (num_rings % 2 == 0)
+               intel_ring_emit(signaller, MI_NOOP);
+
        return 0;
 }
 
@@ -727,7 +819,11 @@ gen6_add_request(struct intel_engine_cs *ring)
 {
        int ret;
 
-       ret = ring->semaphore.signal(ring, 4);
+       if (ring->semaphore.signal)
+               ret = ring->semaphore.signal(ring, 4);
+       else
+               ret = intel_ring_begin(ring, 4);
+
        if (ret)
                return ret;
 
@@ -754,6 +850,32 @@ static inline bool i915_gem_has_seqno_wrapped(struct drm_device *dev,
  * @signaller - ring which has, or will signal
  * @seqno - seqno which the waiter will block on
  */
+
+static int
+gen8_ring_sync(struct intel_engine_cs *waiter,
+              struct intel_engine_cs *signaller,
+              u32 seqno)
+{
+       struct drm_i915_private *dev_priv = waiter->dev->dev_private;
+       int ret;
+
+       ret = intel_ring_begin(waiter, 4);
+       if (ret)
+               return ret;
+
+       intel_ring_emit(waiter, MI_SEMAPHORE_WAIT |
+                               MI_SEMAPHORE_GLOBAL_GTT |
+                               MI_SEMAPHORE_POLL |
+                               MI_SEMAPHORE_SAD_GTE_SDD);
+       intel_ring_emit(waiter, seqno);
+       intel_ring_emit(waiter,
+                       lower_32_bits(GEN8_WAIT_OFFSET(waiter, signaller->id)));
+       intel_ring_emit(waiter,
+                       upper_32_bits(GEN8_WAIT_OFFSET(waiter, signaller->id)));
+       intel_ring_advance(waiter);
+       return 0;
+}
+
 static int
 gen6_ring_sync(struct intel_engine_cs *waiter,
               struct intel_engine_cs *signaller,
@@ -901,7 +1023,7 @@ gen5_ring_get_irq(struct intel_engine_cs *ring)
 
        spin_lock_irqsave(&dev_priv->irq_lock, flags);
        if (ring->irq_refcount++ == 0)
-               ilk_enable_gt_irq(dev_priv, ring->irq_enable_mask);
+               gen5_enable_gt_irq(dev_priv, ring->irq_enable_mask);
        spin_unlock_irqrestore(&dev_priv->irq_lock, flags);
 
        return true;
@@ -916,7 +1038,7 @@ gen5_ring_put_irq(struct intel_engine_cs *ring)
 
        spin_lock_irqsave(&dev_priv->irq_lock, flags);
        if (--ring->irq_refcount == 0)
-               ilk_disable_gt_irq(dev_priv, ring->irq_enable_mask);
+               gen5_disable_gt_irq(dev_priv, ring->irq_enable_mask);
        spin_unlock_irqrestore(&dev_priv->irq_lock, flags);
 }
 
@@ -1109,7 +1231,7 @@ gen6_ring_get_irq(struct intel_engine_cs *ring)
                                         GT_PARITY_ERROR(dev)));
                else
                        I915_WRITE_IMR(ring, ~ring->irq_enable_mask);
-               ilk_enable_gt_irq(dev_priv, ring->irq_enable_mask);
+               gen5_enable_gt_irq(dev_priv, ring->irq_enable_mask);
        }
        spin_unlock_irqrestore(&dev_priv->irq_lock, flags);
 
@@ -1129,7 +1251,7 @@ gen6_ring_put_irq(struct intel_engine_cs *ring)
                        I915_WRITE_IMR(ring, ~GT_PARITY_ERROR(dev));
                else
                        I915_WRITE_IMR(ring, ~0);
-               ilk_disable_gt_irq(dev_priv, ring->irq_enable_mask);
+               gen5_disable_gt_irq(dev_priv, ring->irq_enable_mask);
        }
        spin_unlock_irqrestore(&dev_priv->irq_lock, flags);
 }
@@ -1147,7 +1269,7 @@ hsw_vebox_get_irq(struct intel_engine_cs *ring)
        spin_lock_irqsave(&dev_priv->irq_lock, flags);
        if (ring->irq_refcount++ == 0) {
                I915_WRITE_IMR(ring, ~ring->irq_enable_mask);
-               snb_enable_pm_irq(dev_priv, ring->irq_enable_mask);
+               gen6_enable_pm_irq(dev_priv, ring->irq_enable_mask);
        }
        spin_unlock_irqrestore(&dev_priv->irq_lock, flags);
 
@@ -1167,7 +1289,7 @@ hsw_vebox_put_irq(struct intel_engine_cs *ring)
        spin_lock_irqsave(&dev_priv->irq_lock, flags);
        if (--ring->irq_refcount == 0) {
                I915_WRITE_IMR(ring, ~0);
-               snb_disable_pm_irq(dev_priv, ring->irq_enable_mask);
+               gen6_disable_pm_irq(dev_priv, ring->irq_enable_mask);
        }
        spin_unlock_irqrestore(&dev_priv->irq_lock, flags);
 }
@@ -1329,6 +1451,7 @@ static int init_status_page(struct intel_engine_cs *ring)
        struct drm_i915_gem_object *obj;
 
        if ((obj = ring->status_page.obj) == NULL) {
+               unsigned flags;
                int ret;
 
                obj = i915_gem_alloc_object(ring->dev, 4096);
@@ -1341,7 +1464,20 @@ static int init_status_page(struct intel_engine_cs *ring)
                if (ret)
                        goto err_unref;
 
-               ret = i915_gem_obj_ggtt_pin(obj, 4096, 0);
+               flags = 0;
+               if (!HAS_LLC(ring->dev))
+                       /* On g33, we cannot place HWS above 256MiB, so
+                        * restrict its pinning to the low mappable arena.
+                        * Though this restriction is not documented for
+                        * gen4, gen5, or byt, they also behave similarly
+                        * and hang if the HWS is placed at the top of the
+                        * GTT. To generalise, it appears that all !llc
+                        * platforms have issues with us placing the HWS
+                        * above the mappable region (even though we never
+                        * actualy map it).
+                        */
+                       flags |= PIN_MAPPABLE;
+               ret = i915_gem_obj_ggtt_pin(obj, 4096, flags);
                if (ret) {
 err_unref:
                        drm_gem_object_unreference(&obj->base);
@@ -1378,15 +1514,25 @@ static int init_phys_status_page(struct intel_engine_cs *ring)
        return 0;
 }
 
-static int allocate_ring_buffer(struct intel_engine_cs *ring)
+static void intel_destroy_ringbuffer_obj(struct intel_ringbuffer *ringbuf)
+{
+       if (!ringbuf->obj)
+               return;
+
+       iounmap(ringbuf->virtual_start);
+       i915_gem_object_ggtt_unpin(ringbuf->obj);
+       drm_gem_object_unreference(&ringbuf->obj->base);
+       ringbuf->obj = NULL;
+}
+
+static int intel_alloc_ringbuffer_obj(struct drm_device *dev,
+                                     struct intel_ringbuffer *ringbuf)
 {
-       struct drm_device *dev = ring->dev;
        struct drm_i915_private *dev_priv = to_i915(dev);
-       struct intel_ringbuffer *ringbuf = ring->buffer;
        struct drm_i915_gem_object *obj;
        int ret;
 
-       if (intel_ring_initialized(ring))
+       if (ringbuf->obj)
                return 0;
 
        obj = NULL;
@@ -1397,6 +1543,9 @@ static int allocate_ring_buffer(struct intel_engine_cs *ring)
        if (obj == NULL)
                return -ENOMEM;
 
+       /* mark ring buffers as read-only from GPU side by default */
+       obj->gt_ro = 1;
+
        ret = i915_gem_obj_ggtt_pin(obj, PAGE_SIZE, PIN_MAPPABLE);
        if (ret)
                goto err_unref;
@@ -1455,7 +1604,7 @@ static int intel_init_ring_buffer(struct drm_device *dev,
                        goto error;
        }
 
-       ret = allocate_ring_buffer(ring);
+       ret = intel_alloc_ringbuffer_obj(dev, ringbuf);
        if (ret) {
                DRM_ERROR("Failed to allocate ringbuffer %s: %d\n", ring->name, ret);
                goto error;
@@ -1496,11 +1645,7 @@ void intel_cleanup_ring_buffer(struct intel_engine_cs *ring)
        intel_stop_ring_buffer(ring);
        WARN_ON(!IS_GEN2(ring->dev) && (I915_READ_MODE(ring) & MODE_IDLE) == 0);
 
-       iounmap(ringbuf->virtual_start);
-
-       i915_gem_object_ggtt_unpin(ringbuf->obj);
-       drm_gem_object_unreference(&ringbuf->obj->base);
-       ringbuf->obj = NULL;
+       intel_destroy_ringbuffer_obj(ringbuf);
        ring->preallocated_lazy_request = NULL;
        ring->outstanding_lazy_seqno = 0;
 
@@ -1526,7 +1671,7 @@ static int intel_ring_wait_request(struct intel_engine_cs *ring, int n)
                ringbuf->head = ringbuf->last_retired_head;
                ringbuf->last_retired_head = -1;
 
-               ringbuf->space = ring_space(ring);
+               ringbuf->space = ring_space(ringbuf);
                if (ringbuf->space >= n)
                        return 0;
        }
@@ -1549,7 +1694,7 @@ static int intel_ring_wait_request(struct intel_engine_cs *ring, int n)
        ringbuf->head = ringbuf->last_retired_head;
        ringbuf->last_retired_head = -1;
 
-       ringbuf->space = ring_space(ring);
+       ringbuf->space = ring_space(ringbuf);
        return 0;
 }
 
@@ -1578,7 +1723,7 @@ static int ring_wait_for_space(struct intel_engine_cs *ring, int n)
        trace_i915_ring_wait_begin(ring);
        do {
                ringbuf->head = I915_READ_HEAD(ring);
-               ringbuf->space = ring_space(ring);
+               ringbuf->space = ring_space(ringbuf);
                if (ringbuf->space >= n) {
                        ret = 0;
                        break;
@@ -1630,7 +1775,7 @@ static int intel_wrap_ring_buffer(struct intel_engine_cs *ring)
                iowrite32(MI_NOOP, virt++);
 
        ringbuf->tail = 0;
-       ringbuf->space = ring_space(ring);
+       ringbuf->space = ring_space(ringbuf);
 
        return 0;
 }
@@ -1746,14 +1891,15 @@ int intel_ring_cacheline_align(struct intel_engine_cs *ring)
 
 void intel_ring_init_seqno(struct intel_engine_cs *ring, u32 seqno)
 {
-       struct drm_i915_private *dev_priv = ring->dev->dev_private;
+       struct drm_device *dev = ring->dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
 
        BUG_ON(ring->outstanding_lazy_seqno);
 
-       if (INTEL_INFO(ring->dev)->gen >= 6) {
+       if (INTEL_INFO(dev)->gen == 6 || INTEL_INFO(dev)->gen == 7) {
                I915_WRITE(RING_SYNC_0(ring->mmio_base), 0);
                I915_WRITE(RING_SYNC_1(ring->mmio_base), 0);
-               if (HAS_VEBOX(ring->dev))
+               if (HAS_VEBOX(dev))
                        I915_WRITE(RING_SYNC_2(ring->mmio_base), 0);
        }
 
@@ -1941,45 +2087,74 @@ int intel_init_render_ring_buffer(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_engine_cs *ring = &dev_priv->ring[RCS];
+       struct drm_i915_gem_object *obj;
+       int ret;
 
        ring->name = "render ring";
        ring->id = RCS;
        ring->mmio_base = RENDER_RING_BASE;
 
-       if (INTEL_INFO(dev)->gen >= 6) {
+       if (INTEL_INFO(dev)->gen >= 8) {
+               if (i915_semaphore_is_enabled(dev)) {
+                       obj = i915_gem_alloc_object(dev, 4096);
+                       if (obj == NULL) {
+                               DRM_ERROR("Failed to allocate semaphore bo. Disabling semaphores\n");
+                               i915.semaphores = 0;
+                       } else {
+                               i915_gem_object_set_cache_level(obj, I915_CACHE_LLC);
+                               ret = i915_gem_obj_ggtt_pin(obj, 0, PIN_NONBLOCK);
+                               if (ret != 0) {
+                                       drm_gem_object_unreference(&obj->base);
+                                       DRM_ERROR("Failed to pin semaphore bo. Disabling semaphores\n");
+                                       i915.semaphores = 0;
+                               } else
+                                       dev_priv->semaphore_obj = obj;
+                       }
+               }
+               ring->add_request = gen6_add_request;
+               ring->flush = gen8_render_ring_flush;
+               ring->irq_get = gen8_ring_get_irq;
+               ring->irq_put = gen8_ring_put_irq;
+               ring->irq_enable_mask = GT_RENDER_USER_INTERRUPT;
+               ring->get_seqno = gen6_ring_get_seqno;
+               ring->set_seqno = ring_set_seqno;
+               if (i915_semaphore_is_enabled(dev)) {
+                       WARN_ON(!dev_priv->semaphore_obj);
+                       ring->semaphore.sync_to = gen8_ring_sync;
+                       ring->semaphore.signal = gen8_rcs_signal;
+                       GEN8_RING_SEMAPHORE_INIT;
+               }
+       } else if (INTEL_INFO(dev)->gen >= 6) {
                ring->add_request = gen6_add_request;
                ring->flush = gen7_render_ring_flush;
                if (INTEL_INFO(dev)->gen == 6)
                        ring->flush = gen6_render_ring_flush;
-               if (INTEL_INFO(dev)->gen >= 8) {
-                       ring->flush = gen8_render_ring_flush;
-                       ring->irq_get = gen8_ring_get_irq;
-                       ring->irq_put = gen8_ring_put_irq;
-               } else {
-                       ring->irq_get = gen6_ring_get_irq;
-                       ring->irq_put = gen6_ring_put_irq;
-               }
+               ring->irq_get = gen6_ring_get_irq;
+               ring->irq_put = gen6_ring_put_irq;
                ring->irq_enable_mask = GT_RENDER_USER_INTERRUPT;
                ring->get_seqno = gen6_ring_get_seqno;
                ring->set_seqno = ring_set_seqno;
-               ring->semaphore.sync_to = gen6_ring_sync;
-               ring->semaphore.signal = gen6_signal;
-               /*
-                * The current semaphore is only applied on pre-gen8 platform.
-                * And there is no VCS2 ring on the pre-gen8 platform. So the
-                * semaphore between RCS and VCS2 is initialized as INVALID.
-                * Gen8 will initialize the sema between VCS2 and RCS later.
-                */
-               ring->semaphore.mbox.wait[RCS] = MI_SEMAPHORE_SYNC_INVALID;
-               ring->semaphore.mbox.wait[VCS] = MI_SEMAPHORE_SYNC_RV;
-               ring->semaphore.mbox.wait[BCS] = MI_SEMAPHORE_SYNC_RB;
-               ring->semaphore.mbox.wait[VECS] = MI_SEMAPHORE_SYNC_RVE;
-               ring->semaphore.mbox.wait[VCS2] = MI_SEMAPHORE_SYNC_INVALID;
-               ring->semaphore.mbox.signal[RCS] = GEN6_NOSYNC;
-               ring->semaphore.mbox.signal[VCS] = GEN6_VRSYNC;
-               ring->semaphore.mbox.signal[BCS] = GEN6_BRSYNC;
-               ring->semaphore.mbox.signal[VECS] = GEN6_VERSYNC;
-               ring->semaphore.mbox.signal[VCS2] = GEN6_NOSYNC;
+               if (i915_semaphore_is_enabled(dev)) {
+                       ring->semaphore.sync_to = gen6_ring_sync;
+                       ring->semaphore.signal = gen6_signal;
+                       /*
+                        * The current semaphore is only applied on pre-gen8
+                        * platform.  And there is no VCS2 ring on the pre-gen8
+                        * platform. So the semaphore between RCS and VCS2 is
+                        * initialized as INVALID.  Gen8 will initialize the
+                        * sema between VCS2 and RCS later.
+                        */
+                       ring->semaphore.mbox.wait[RCS] = MI_SEMAPHORE_SYNC_INVALID;
+                       ring->semaphore.mbox.wait[VCS] = MI_SEMAPHORE_SYNC_RV;
+                       ring->semaphore.mbox.wait[BCS] = MI_SEMAPHORE_SYNC_RB;
+                       ring->semaphore.mbox.wait[VECS] = MI_SEMAPHORE_SYNC_RVE;
+                       ring->semaphore.mbox.wait[VCS2] = MI_SEMAPHORE_SYNC_INVALID;
+                       ring->semaphore.mbox.signal[RCS] = GEN6_NOSYNC;
+                       ring->semaphore.mbox.signal[VCS] = GEN6_VRSYNC;
+                       ring->semaphore.mbox.signal[BCS] = GEN6_BRSYNC;
+                       ring->semaphore.mbox.signal[VECS] = GEN6_VERSYNC;
+                       ring->semaphore.mbox.signal[VCS2] = GEN6_NOSYNC;
+               }
        } else if (IS_GEN5(dev)) {
                ring->add_request = pc_render_add_request;
                ring->flush = gen4_render_ring_flush;
@@ -2007,6 +2182,7 @@ int intel_init_render_ring_buffer(struct drm_device *dev)
                ring->irq_enable_mask = I915_USER_INTERRUPT;
        }
        ring->write_tail = ring_write_tail;
+
        if (IS_HASWELL(dev))
                ring->dispatch_execbuffer = hsw_ring_dispatch_execbuffer;
        else if (IS_GEN8(dev))
@@ -2024,9 +2200,6 @@ int intel_init_render_ring_buffer(struct drm_device *dev)
 
        /* Workaround batchbuffer to combat CS tlb bug. */
        if (HAS_BROKEN_CS_TLB(dev)) {
-               struct drm_i915_gem_object *obj;
-               int ret;
-
                obj = i915_gem_alloc_object(dev, I830_BATCH_LIMIT);
                if (obj == NULL) {
                        DRM_ERROR("Failed to allocate batch bo\n");
@@ -2157,31 +2330,32 @@ int intel_init_bsd_ring_buffer(struct drm_device *dev)
                        ring->irq_put = gen8_ring_put_irq;
                        ring->dispatch_execbuffer =
                                gen8_ring_dispatch_execbuffer;
+                       if (i915_semaphore_is_enabled(dev)) {
+                               ring->semaphore.sync_to = gen8_ring_sync;
+                               ring->semaphore.signal = gen8_xcs_signal;
+                               GEN8_RING_SEMAPHORE_INIT;
+                       }
                } else {
                        ring->irq_enable_mask = GT_BSD_USER_INTERRUPT;
                        ring->irq_get = gen6_ring_get_irq;
                        ring->irq_put = gen6_ring_put_irq;
                        ring->dispatch_execbuffer =
                                gen6_ring_dispatch_execbuffer;
+                       if (i915_semaphore_is_enabled(dev)) {
+                               ring->semaphore.sync_to = gen6_ring_sync;
+                               ring->semaphore.signal = gen6_signal;
+                               ring->semaphore.mbox.wait[RCS] = MI_SEMAPHORE_SYNC_VR;
+                               ring->semaphore.mbox.wait[VCS] = MI_SEMAPHORE_SYNC_INVALID;
+                               ring->semaphore.mbox.wait[BCS] = MI_SEMAPHORE_SYNC_VB;
+                               ring->semaphore.mbox.wait[VECS] = MI_SEMAPHORE_SYNC_VVE;
+                               ring->semaphore.mbox.wait[VCS2] = MI_SEMAPHORE_SYNC_INVALID;
+                               ring->semaphore.mbox.signal[RCS] = GEN6_RVSYNC;
+                               ring->semaphore.mbox.signal[VCS] = GEN6_NOSYNC;
+                               ring->semaphore.mbox.signal[BCS] = GEN6_BVSYNC;
+                               ring->semaphore.mbox.signal[VECS] = GEN6_VEVSYNC;
+                               ring->semaphore.mbox.signal[VCS2] = GEN6_NOSYNC;
+                       }
                }
-               ring->semaphore.sync_to = gen6_ring_sync;
-               ring->semaphore.signal = gen6_signal;
-               /*
-                * The current semaphore is only applied on pre-gen8 platform.
-                * And there is no VCS2 ring on the pre-gen8 platform. So the
-                * semaphore between VCS and VCS2 is initialized as INVALID.
-                * Gen8 will initialize the sema between VCS2 and VCS later.
-                */
-               ring->semaphore.mbox.wait[RCS] = MI_SEMAPHORE_SYNC_VR;
-               ring->semaphore.mbox.wait[VCS] = MI_SEMAPHORE_SYNC_INVALID;
-               ring->semaphore.mbox.wait[BCS] = MI_SEMAPHORE_SYNC_VB;
-               ring->semaphore.mbox.wait[VECS] = MI_SEMAPHORE_SYNC_VVE;
-               ring->semaphore.mbox.wait[VCS2] = MI_SEMAPHORE_SYNC_INVALID;
-               ring->semaphore.mbox.signal[RCS] = GEN6_RVSYNC;
-               ring->semaphore.mbox.signal[VCS] = GEN6_NOSYNC;
-               ring->semaphore.mbox.signal[BCS] = GEN6_BVSYNC;
-               ring->semaphore.mbox.signal[VECS] = GEN6_VEVSYNC;
-               ring->semaphore.mbox.signal[VCS2] = GEN6_NOSYNC;
        } else {
                ring->mmio_base = BSD_RING_BASE;
                ring->flush = bsd_ring_flush;
@@ -2218,7 +2392,7 @@ int intel_init_bsd2_ring_buffer(struct drm_device *dev)
                return -EINVAL;
        }
 
-       ring->name = "bds2_ring";
+       ring->name = "bsd2 ring";
        ring->id = VCS2;
 
        ring->write_tail = ring_write_tail;
@@ -2233,25 +2407,11 @@ int intel_init_bsd2_ring_buffer(struct drm_device *dev)
        ring->irq_put = gen8_ring_put_irq;
        ring->dispatch_execbuffer =
                        gen8_ring_dispatch_execbuffer;
-       ring->semaphore.sync_to = gen6_ring_sync;
-       ring->semaphore.signal = gen6_signal;
-       /*
-        * The current semaphore is only applied on the pre-gen8. And there
-        * is no bsd2 ring on the pre-gen8. So now the semaphore_register
-        * between VCS2 and other ring is initialized as invalid.
-        * Gen8 will initialize the sema between VCS2 and other ring later.
-        */
-       ring->semaphore.mbox.wait[RCS] = MI_SEMAPHORE_SYNC_INVALID;
-       ring->semaphore.mbox.wait[VCS] = MI_SEMAPHORE_SYNC_INVALID;
-       ring->semaphore.mbox.wait[BCS] = MI_SEMAPHORE_SYNC_INVALID;
-       ring->semaphore.mbox.wait[VECS] = MI_SEMAPHORE_SYNC_INVALID;
-       ring->semaphore.mbox.wait[VCS2] = MI_SEMAPHORE_SYNC_INVALID;
-       ring->semaphore.mbox.signal[RCS] = GEN6_NOSYNC;
-       ring->semaphore.mbox.signal[VCS] = GEN6_NOSYNC;
-       ring->semaphore.mbox.signal[BCS] = GEN6_NOSYNC;
-       ring->semaphore.mbox.signal[VECS] = GEN6_NOSYNC;
-       ring->semaphore.mbox.signal[VCS2] = GEN6_NOSYNC;
-
+       if (i915_semaphore_is_enabled(dev)) {
+               ring->semaphore.sync_to = gen8_ring_sync;
+               ring->semaphore.signal = gen8_xcs_signal;
+               GEN8_RING_SEMAPHORE_INIT;
+       }
        ring->init = init_ring_common;
 
        return intel_init_ring_buffer(dev, ring);
@@ -2277,30 +2437,38 @@ int intel_init_blt_ring_buffer(struct drm_device *dev)
                ring->irq_get = gen8_ring_get_irq;
                ring->irq_put = gen8_ring_put_irq;
                ring->dispatch_execbuffer = gen8_ring_dispatch_execbuffer;
+               if (i915_semaphore_is_enabled(dev)) {
+                       ring->semaphore.sync_to = gen8_ring_sync;
+                       ring->semaphore.signal = gen8_xcs_signal;
+                       GEN8_RING_SEMAPHORE_INIT;
+               }
        } else {
                ring->irq_enable_mask = GT_BLT_USER_INTERRUPT;
                ring->irq_get = gen6_ring_get_irq;
                ring->irq_put = gen6_ring_put_irq;
                ring->dispatch_execbuffer = gen6_ring_dispatch_execbuffer;
+               if (i915_semaphore_is_enabled(dev)) {
+                       ring->semaphore.signal = gen6_signal;
+                       ring->semaphore.sync_to = gen6_ring_sync;
+                       /*
+                        * The current semaphore is only applied on pre-gen8
+                        * platform.  And there is no VCS2 ring on the pre-gen8
+                        * platform. So the semaphore between BCS and VCS2 is
+                        * initialized as INVALID.  Gen8 will initialize the
+                        * sema between BCS and VCS2 later.
+                        */
+                       ring->semaphore.mbox.wait[RCS] = MI_SEMAPHORE_SYNC_BR;
+                       ring->semaphore.mbox.wait[VCS] = MI_SEMAPHORE_SYNC_BV;
+                       ring->semaphore.mbox.wait[BCS] = MI_SEMAPHORE_SYNC_INVALID;
+                       ring->semaphore.mbox.wait[VECS] = MI_SEMAPHORE_SYNC_BVE;
+                       ring->semaphore.mbox.wait[VCS2] = MI_SEMAPHORE_SYNC_INVALID;
+                       ring->semaphore.mbox.signal[RCS] = GEN6_RBSYNC;
+                       ring->semaphore.mbox.signal[VCS] = GEN6_VBSYNC;
+                       ring->semaphore.mbox.signal[BCS] = GEN6_NOSYNC;
+                       ring->semaphore.mbox.signal[VECS] = GEN6_VEBSYNC;
+                       ring->semaphore.mbox.signal[VCS2] = GEN6_NOSYNC;
+               }
        }
-       ring->semaphore.sync_to = gen6_ring_sync;
-       ring->semaphore.signal = gen6_signal;
-       /*
-        * The current semaphore is only applied on pre-gen8 platform. And
-        * there is no VCS2 ring on the pre-gen8 platform. So the semaphore
-        * between BCS and VCS2 is initialized as INVALID.
-        * Gen8 will initialize the sema between BCS and VCS2 later.
-        */
-       ring->semaphore.mbox.wait[RCS] = MI_SEMAPHORE_SYNC_BR;
-       ring->semaphore.mbox.wait[VCS] = MI_SEMAPHORE_SYNC_BV;
-       ring->semaphore.mbox.wait[BCS] = MI_SEMAPHORE_SYNC_INVALID;
-       ring->semaphore.mbox.wait[VECS] = MI_SEMAPHORE_SYNC_BVE;
-       ring->semaphore.mbox.wait[VCS2] = MI_SEMAPHORE_SYNC_INVALID;
-       ring->semaphore.mbox.signal[RCS] = GEN6_RBSYNC;
-       ring->semaphore.mbox.signal[VCS] = GEN6_VBSYNC;
-       ring->semaphore.mbox.signal[BCS] = GEN6_NOSYNC;
-       ring->semaphore.mbox.signal[VECS] = GEN6_VEBSYNC;
-       ring->semaphore.mbox.signal[VCS2] = GEN6_NOSYNC;
        ring->init = init_ring_common;
 
        return intel_init_ring_buffer(dev, ring);
@@ -2327,24 +2495,31 @@ int intel_init_vebox_ring_buffer(struct drm_device *dev)
                ring->irq_get = gen8_ring_get_irq;
                ring->irq_put = gen8_ring_put_irq;
                ring->dispatch_execbuffer = gen8_ring_dispatch_execbuffer;
+               if (i915_semaphore_is_enabled(dev)) {
+                       ring->semaphore.sync_to = gen8_ring_sync;
+                       ring->semaphore.signal = gen8_xcs_signal;
+                       GEN8_RING_SEMAPHORE_INIT;
+               }
        } else {
                ring->irq_enable_mask = PM_VEBOX_USER_INTERRUPT;
                ring->irq_get = hsw_vebox_get_irq;
                ring->irq_put = hsw_vebox_put_irq;
                ring->dispatch_execbuffer = gen6_ring_dispatch_execbuffer;
+               if (i915_semaphore_is_enabled(dev)) {
+                       ring->semaphore.sync_to = gen6_ring_sync;
+                       ring->semaphore.signal = gen6_signal;
+                       ring->semaphore.mbox.wait[RCS] = MI_SEMAPHORE_SYNC_VER;
+                       ring->semaphore.mbox.wait[VCS] = MI_SEMAPHORE_SYNC_VEV;
+                       ring->semaphore.mbox.wait[BCS] = MI_SEMAPHORE_SYNC_VEB;
+                       ring->semaphore.mbox.wait[VECS] = MI_SEMAPHORE_SYNC_INVALID;
+                       ring->semaphore.mbox.wait[VCS2] = MI_SEMAPHORE_SYNC_INVALID;
+                       ring->semaphore.mbox.signal[RCS] = GEN6_RVESYNC;
+                       ring->semaphore.mbox.signal[VCS] = GEN6_VVESYNC;
+                       ring->semaphore.mbox.signal[BCS] = GEN6_BVESYNC;
+                       ring->semaphore.mbox.signal[VECS] = GEN6_NOSYNC;
+                       ring->semaphore.mbox.signal[VCS2] = GEN6_NOSYNC;
+               }
        }
-       ring->semaphore.sync_to = gen6_ring_sync;
-       ring->semaphore.signal = gen6_signal;
-       ring->semaphore.mbox.wait[RCS] = MI_SEMAPHORE_SYNC_VER;
-       ring->semaphore.mbox.wait[VCS] = MI_SEMAPHORE_SYNC_VEV;
-       ring->semaphore.mbox.wait[BCS] = MI_SEMAPHORE_SYNC_VEB;
-       ring->semaphore.mbox.wait[VECS] = MI_SEMAPHORE_SYNC_INVALID;
-       ring->semaphore.mbox.wait[VCS2] = MI_SEMAPHORE_SYNC_INVALID;
-       ring->semaphore.mbox.signal[RCS] = GEN6_RVESYNC;
-       ring->semaphore.mbox.signal[VCS] = GEN6_VVESYNC;
-       ring->semaphore.mbox.signal[BCS] = GEN6_BVESYNC;
-       ring->semaphore.mbox.signal[VECS] = GEN6_NOSYNC;
-       ring->semaphore.mbox.signal[VCS2] = GEN6_NOSYNC;
        ring->init = init_ring_common;
 
        return intel_init_ring_buffer(dev, ring);
index e72017bdcd7f8e7df95a1ab75853d8351b8bbb9d..70525d0c2c74650ef780a69c797c59316cedd371 100644 (file)
@@ -40,10 +40,37 @@ struct  intel_hw_status_page {
 #define I915_READ_MODE(ring) I915_READ(RING_MI_MODE((ring)->mmio_base))
 #define I915_WRITE_MODE(ring, val) I915_WRITE(RING_MI_MODE((ring)->mmio_base), val)
 
+/* seqno size is actually only a uint32, but since we plan to use MI_FLUSH_DW to
+ * do the writes, and that must have qw aligned offsets, simply pretend it's 8b.
+ */
+#define i915_semaphore_seqno_size sizeof(uint64_t)
+#define GEN8_SIGNAL_OFFSET(__ring, to)                      \
+       (i915_gem_obj_ggtt_offset(dev_priv->semaphore_obj) + \
+       ((__ring)->id * I915_NUM_RINGS * i915_semaphore_seqno_size) +   \
+       (i915_semaphore_seqno_size * (to)))
+
+#define GEN8_WAIT_OFFSET(__ring, from)                      \
+       (i915_gem_obj_ggtt_offset(dev_priv->semaphore_obj) + \
+       ((from) * I915_NUM_RINGS * i915_semaphore_seqno_size) + \
+       (i915_semaphore_seqno_size * (__ring)->id))
+
+#define GEN8_RING_SEMAPHORE_INIT do { \
+       if (!dev_priv->semaphore_obj) { \
+               break; \
+       } \
+       ring->semaphore.signal_ggtt[RCS] = GEN8_SIGNAL_OFFSET(ring, RCS); \
+       ring->semaphore.signal_ggtt[VCS] = GEN8_SIGNAL_OFFSET(ring, VCS); \
+       ring->semaphore.signal_ggtt[BCS] = GEN8_SIGNAL_OFFSET(ring, BCS); \
+       ring->semaphore.signal_ggtt[VECS] = GEN8_SIGNAL_OFFSET(ring, VECS); \
+       ring->semaphore.signal_ggtt[VCS2] = GEN8_SIGNAL_OFFSET(ring, VCS2); \
+       ring->semaphore.signal_ggtt[ring->id] = MI_SEMAPHORE_SYNC_INVALID; \
+       } while(0)
+
 enum intel_ring_hangcheck_action {
        HANGCHECK_IDLE = 0,
        HANGCHECK_WAIT,
        HANGCHECK_ACTIVE,
+       HANGCHECK_ACTIVE_LOOP,
        HANGCHECK_KICK,
        HANGCHECK_HUNG,
 };
@@ -52,6 +79,7 @@ enum intel_ring_hangcheck_action {
 
 struct intel_ring_hangcheck {
        u64 acthd;
+       u64 max_acthd;
        u32 seqno;
        int score;
        enum intel_ring_hangcheck_action action;
@@ -127,15 +155,55 @@ struct  intel_engine_cs {
 #define I915_DISPATCH_PINNED 0x2
        void            (*cleanup)(struct intel_engine_cs *ring);
 
+       /* GEN8 signal/wait table - never trust comments!
+        *        signal to     signal to    signal to   signal to      signal to
+        *          RCS            VCS          BCS        VECS          VCS2
+        *      --------------------------------------------------------------------
+        *  RCS | NOP (0x00) | VCS (0x08) | BCS (0x10) | VECS (0x18) | VCS2 (0x20) |
+        *      |-------------------------------------------------------------------
+        *  VCS | RCS (0x28) | NOP (0x30) | BCS (0x38) | VECS (0x40) | VCS2 (0x48) |
+        *      |-------------------------------------------------------------------
+        *  BCS | RCS (0x50) | VCS (0x58) | NOP (0x60) | VECS (0x68) | VCS2 (0x70) |
+        *      |-------------------------------------------------------------------
+        * VECS | RCS (0x78) | VCS (0x80) | BCS (0x88) |  NOP (0x90) | VCS2 (0x98) |
+        *      |-------------------------------------------------------------------
+        * VCS2 | RCS (0xa0) | VCS (0xa8) | BCS (0xb0) | VECS (0xb8) | NOP  (0xc0) |
+        *      |-------------------------------------------------------------------
+        *
+        * Generalization:
+        *  f(x, y) := (x->id * NUM_RINGS * seqno_size) + (seqno_size * y->id)
+        *  ie. transpose of g(x, y)
+        *
+        *       sync from      sync from    sync from    sync from     sync from
+        *          RCS            VCS          BCS        VECS          VCS2
+        *      --------------------------------------------------------------------
+        *  RCS | NOP (0x00) | VCS (0x28) | BCS (0x50) | VECS (0x78) | VCS2 (0xa0) |
+        *      |-------------------------------------------------------------------
+        *  VCS | RCS (0x08) | NOP (0x30) | BCS (0x58) | VECS (0x80) | VCS2 (0xa8) |
+        *      |-------------------------------------------------------------------
+        *  BCS | RCS (0x10) | VCS (0x38) | NOP (0x60) | VECS (0x88) | VCS2 (0xb0) |
+        *      |-------------------------------------------------------------------
+        * VECS | RCS (0x18) | VCS (0x40) | BCS (0x68) |  NOP (0x90) | VCS2 (0xb8) |
+        *      |-------------------------------------------------------------------
+        * VCS2 | RCS (0x20) | VCS (0x48) | BCS (0x70) | VECS (0x98) |  NOP (0xc0) |
+        *      |-------------------------------------------------------------------
+        *
+        * Generalization:
+        *  g(x, y) := (y->id * NUM_RINGS * seqno_size) + (seqno_size * x->id)
+        *  ie. transpose of f(x, y)
+        */
        struct {
                u32     sync_seqno[I915_NUM_RINGS-1];
 
-               struct {
-                       /* our mbox written by others */
-                       u32             wait[I915_NUM_RINGS];
-                       /* mboxes this ring signals to */
-                       u32             signal[I915_NUM_RINGS];
-               } mbox;
+               union {
+                       struct {
+                               /* our mbox written by others */
+                               u32             wait[I915_NUM_RINGS];
+                               /* mboxes this ring signals to */
+                               u32             signal[I915_NUM_RINGS];
+                       } mbox;
+                       u64             signal_ggtt[I915_NUM_RINGS];
+               };
 
                /* AKA wait() */
                int     (*sync_to)(struct intel_engine_cs *ring,
@@ -238,9 +306,11 @@ intel_ring_sync_index(struct intel_engine_cs *ring,
        int idx;
 
        /*
-        * cs -> 0 = vcs, 1 = bcs
-        * vcs -> 0 = bcs, 1 = cs,
-        * bcs -> 0 = cs, 1 = vcs.
+        * rcs -> 0 = vcs, 1 = bcs, 2 = vecs, 3 = vcs2;
+        * vcs -> 0 = bcs, 1 = vecs, 2 = vcs2, 3 = rcs;
+        * bcs -> 0 = vecs, 1 = vcs2. 2 = rcs, 3 = vcs;
+        * vecs -> 0 = vcs2, 1 = rcs, 2 = vcs, 3 = bcs;
+        * vcs2 -> 0 = rcs, 1 = vcs, 2 = bcs, 3 = vecs;
         */
 
        idx = (other - ring) - 1;
@@ -318,9 +388,9 @@ int intel_init_vebox_ring_buffer(struct drm_device *dev);
 u64 intel_ring_get_active_head(struct intel_engine_cs *ring);
 void intel_ring_setup_status_page(struct intel_engine_cs *ring);
 
-static inline u32 intel_ring_get_tail(struct intel_engine_cs *ring)
+static inline u32 intel_ring_get_tail(struct intel_ringbuffer *ringbuf)
 {
-       return ring->buffer->tail;
+       return ringbuf->tail;
 }
 
 static inline u32 intel_ring_get_seqno(struct intel_engine_cs *ring)
index 20375cc7f82ddac3ce39e05046b02f4714988706..9350edd6728d4706b82d13f1133ad22e09a0708b 100644 (file)
@@ -2433,7 +2433,7 @@ intel_sdvo_connector_init(struct intel_sdvo_connector *connector,
        connector->base.unregister = intel_sdvo_connector_unregister;
 
        intel_connector_attach_encoder(&connector->base, &encoder->base);
-       ret = drm_sysfs_connector_add(drm_connector);
+       ret = drm_connector_register(drm_connector);
        if (ret < 0)
                goto err1;
 
@@ -2446,7 +2446,7 @@ intel_sdvo_connector_init(struct intel_sdvo_connector *connector,
        return 0;
 
 err2:
-       drm_sysfs_connector_remove(drm_connector);
+       drm_connector_unregister(drm_connector);
 err1:
        drm_connector_cleanup(drm_connector);
 
@@ -2559,7 +2559,7 @@ intel_sdvo_tv_init(struct intel_sdvo *intel_sdvo, int type)
        return true;
 
 err:
-       drm_sysfs_connector_remove(connector);
+       drm_connector_unregister(connector);
        intel_sdvo_destroy(connector);
        return false;
 }
@@ -2638,7 +2638,7 @@ intel_sdvo_lvds_init(struct intel_sdvo *intel_sdvo, int device)
        return true;
 
 err:
-       drm_sysfs_connector_remove(connector);
+       drm_connector_unregister(connector);
        intel_sdvo_destroy(connector);
        return false;
 }
@@ -2711,7 +2711,7 @@ static void intel_sdvo_output_cleanup(struct intel_sdvo *intel_sdvo)
        list_for_each_entry_safe(connector, tmp,
                                 &dev->mode_config.connector_list, head) {
                if (intel_attached_encoder(connector) == &intel_sdvo->base) {
-                       drm_sysfs_connector_remove(connector);
+                       drm_connector_unregister(connector);
                        intel_sdvo_destroy(connector);
                }
        }
index 9a17b4e92ef4f8ad3eb1e8a2a61293e6f1334175..168c6652cda198731a2afa7d2675658f86ff6023 100644 (file)
@@ -218,7 +218,8 @@ vlv_update_plane(struct drm_plane *dplane, struct drm_crtc *crtc,
 
        sprctl |= SP_ENABLE;
 
-       intel_update_sprite_watermarks(dplane, crtc, src_w, pixel_size, true,
+       intel_update_sprite_watermarks(dplane, crtc, src_w, src_h,
+                                      pixel_size, true,
                                       src_w != crtc_w || src_h != crtc_h);
 
        /* Sizes are 0 based */
@@ -283,7 +284,7 @@ vlv_disable_plane(struct drm_plane *dplane, struct drm_crtc *crtc)
        if (atomic_update)
                intel_pipe_update_end(intel_crtc, start_vbl_count);
 
-       intel_update_sprite_watermarks(dplane, crtc, 0, 0, false, false);
+       intel_update_sprite_watermarks(dplane, crtc, 0, 0, 0, false, false);
 }
 
 static int
@@ -406,7 +407,8 @@ ivb_update_plane(struct drm_plane *plane, struct drm_crtc *crtc,
        if (IS_HASWELL(dev) || IS_BROADWELL(dev))
                sprctl |= SPRITE_PIPE_CSC_ENABLE;
 
-       intel_update_sprite_watermarks(plane, crtc, src_w, pixel_size, true,
+       intel_update_sprite_watermarks(plane, crtc, src_w, src_h, pixel_size,
+                                      true,
                                       src_w != crtc_w || src_h != crtc_h);
 
        /* Sizes are 0 based */
@@ -486,7 +488,7 @@ ivb_disable_plane(struct drm_plane *plane, struct drm_crtc *crtc)
         */
        intel_wait_for_vblank(dev, pipe);
 
-       intel_update_sprite_watermarks(plane, crtc, 0, 0, false, false);
+       intel_update_sprite_watermarks(plane, crtc, 0, 0, 0, false, false);
 }
 
 static int
@@ -606,7 +608,8 @@ ilk_update_plane(struct drm_plane *plane, struct drm_crtc *crtc,
                dvscntr |= DVS_TRICKLE_FEED_DISABLE; /* must disable */
        dvscntr |= DVS_ENABLE;
 
-       intel_update_sprite_watermarks(plane, crtc, src_w, pixel_size, true,
+       intel_update_sprite_watermarks(plane, crtc, src_w, src_h,
+                                      pixel_size, true,
                                       src_w != crtc_w || src_h != crtc_h);
 
        /* Sizes are 0 based */
@@ -681,7 +684,7 @@ ilk_disable_plane(struct drm_plane *plane, struct drm_crtc *crtc)
         */
        intel_wait_for_vblank(dev, pipe);
 
-       intel_update_sprite_watermarks(plane, crtc, 0, 0, false, false);
+       intel_update_sprite_watermarks(plane, crtc, 0, 0, 0, false, false);
 }
 
 static void
@@ -819,6 +822,7 @@ intel_update_plane(struct drm_plane *plane, struct drm_crtc *crtc,
        struct drm_device *dev = plane->dev;
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        struct intel_plane *intel_plane = to_intel_plane(plane);
+       enum pipe pipe = intel_crtc->pipe;
        struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
        struct drm_i915_gem_object *obj = intel_fb->obj;
        struct drm_i915_gem_object *old_obj = intel_plane->obj;
@@ -1006,6 +1010,8 @@ intel_update_plane(struct drm_plane *plane, struct drm_crtc *crtc,
         */
        ret = intel_pin_and_fence_fb_obj(dev, obj, NULL);
 
+       i915_gem_track_fb(old_obj, obj,
+                         INTEL_FRONTBUFFER_SPRITE(pipe));
        mutex_unlock(&dev->struct_mutex);
 
        if (ret)
@@ -1039,6 +1045,8 @@ intel_update_plane(struct drm_plane *plane, struct drm_crtc *crtc,
                else
                        intel_plane->disable_plane(plane, crtc);
 
+               intel_frontbuffer_flip(dev, INTEL_FRONTBUFFER_SPRITE(pipe));
+
                if (!primary_was_enabled && primary_enabled)
                        intel_post_enable_primary(crtc);
        }
@@ -1068,6 +1076,7 @@ intel_disable_plane(struct drm_plane *plane)
        struct drm_device *dev = plane->dev;
        struct intel_plane *intel_plane = to_intel_plane(plane);
        struct intel_crtc *intel_crtc;
+       enum pipe pipe;
 
        if (!plane->fb)
                return 0;
@@ -1076,6 +1085,7 @@ intel_disable_plane(struct drm_plane *plane)
                return -EINVAL;
 
        intel_crtc = to_intel_crtc(plane->crtc);
+       pipe = intel_crtc->pipe;
 
        if (intel_crtc->active) {
                bool primary_was_enabled = intel_crtc->primary_enabled;
@@ -1094,6 +1104,8 @@ intel_disable_plane(struct drm_plane *plane)
 
                mutex_lock(&dev->struct_mutex);
                intel_unpin_fb_obj(intel_plane->obj);
+               i915_gem_track_fb(intel_plane->obj, NULL,
+                                 INTEL_FRONTBUFFER_SPRITE(pipe));
                mutex_unlock(&dev->struct_mutex);
 
                intel_plane->obj = NULL;
@@ -1114,7 +1126,6 @@ int intel_sprite_set_colorkey(struct drm_device *dev, void *data,
                              struct drm_file *file_priv)
 {
        struct drm_intel_sprite_colorkey *set = data;
-       struct drm_mode_object *obj;
        struct drm_plane *plane;
        struct intel_plane *intel_plane;
        int ret = 0;
@@ -1128,13 +1139,12 @@ int intel_sprite_set_colorkey(struct drm_device *dev, void *data,
 
        drm_modeset_lock_all(dev);
 
-       obj = drm_mode_object_find(dev, set->plane_id, DRM_MODE_OBJECT_PLANE);
-       if (!obj) {
+       plane = drm_plane_find(dev, set->plane_id);
+       if (!plane) {
                ret = -ENOENT;
                goto out_unlock;
        }
 
-       plane = obj_to_plane(obj);
        intel_plane = to_intel_plane(plane);
        ret = intel_plane->update_colorkey(plane, set);
 
@@ -1147,7 +1157,6 @@ int intel_sprite_get_colorkey(struct drm_device *dev, void *data,
                              struct drm_file *file_priv)
 {
        struct drm_intel_sprite_colorkey *get = data;
-       struct drm_mode_object *obj;
        struct drm_plane *plane;
        struct intel_plane *intel_plane;
        int ret = 0;
@@ -1157,13 +1166,12 @@ int intel_sprite_get_colorkey(struct drm_device *dev, void *data,
 
        drm_modeset_lock_all(dev);
 
-       obj = drm_mode_object_find(dev, get->plane_id, DRM_MODE_OBJECT_PLANE);
-       if (!obj) {
+       plane = drm_plane_find(dev, get->plane_id);
+       if (!plane) {
                ret = -ENOENT;
                goto out_unlock;
        }
 
-       plane = obj_to_plane(obj);
        intel_plane = to_intel_plane(plane);
        intel_plane->get_colorkey(plane, get);
 
index 67c6c9a2eb1c9f3ed3d0d6979a686b52fdabe9fe..e211eef4b7e4cac5a1eae5c88119537621f788a8 100644 (file)
@@ -1680,5 +1680,5 @@ intel_tv_init(struct drm_device *dev)
        drm_object_attach_property(&connector->base,
                                   dev->mode_config.tv_bottom_margin_property,
                                   intel_tv->margin[TV_MARGIN_BOTTOM]);
-       drm_sysfs_connector_add(connector);
+       drm_connector_register(connector);
 }
index 4f6fef7ac0699049f74abcd5edc6177ff5749f54..e81bc3bdc533b5ae60a7fae77536d1dd83caf1da 100644 (file)
@@ -231,8 +231,8 @@ static void __vlv_force_wake_get(struct drm_i915_private *dev_priv,
        }
 
        /* WaRsForcewakeWaitTC0:vlv */
-       __gen6_gt_wait_for_thread_c0(dev_priv);
-
+       if (!IS_CHERRYVIEW(dev_priv->dev))
+               __gen6_gt_wait_for_thread_c0(dev_priv);
 }
 
 static void __vlv_force_wake_put(struct drm_i915_private *dev_priv,
@@ -250,9 +250,10 @@ static void __vlv_force_wake_put(struct drm_i915_private *dev_priv,
                __raw_i915_write32(dev_priv, FORCEWAKE_MEDIA_VLV,
                                _MASKED_BIT_DISABLE(FORCEWAKE_KERNEL));
 
-       /* The below doubles as a POSTING_READ */
-       gen6_gt_check_fifodbg(dev_priv);
-
+       /* something from same cacheline, but !FORCEWAKE_VLV */
+       __raw_posting_read(dev_priv, FORCEWAKE_ACK_VLV);
+       if (!IS_CHERRYVIEW(dev_priv->dev))
+               gen6_gt_check_fifodbg(dev_priv);
 }
 
 static void vlv_force_wake_get(struct drm_i915_private *dev_priv, int fw_engine)
@@ -315,7 +316,7 @@ static void gen6_force_wake_timer(unsigned long arg)
        intel_runtime_pm_put(dev_priv);
 }
 
-static void intel_uncore_forcewake_reset(struct drm_device *dev, bool restore)
+void intel_uncore_forcewake_reset(struct drm_device *dev, bool restore)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        unsigned long irqflags;
@@ -357,16 +358,12 @@ static void intel_uncore_forcewake_reset(struct drm_device *dev, bool restore)
                        dev_priv->uncore.fifo_count =
                                __raw_i915_read32(dev_priv, GTFIFOCTL) &
                                GT_FIFO_FREE_ENTRIES_MASK;
-       } else {
-               dev_priv->uncore.forcewake_count = 0;
-               dev_priv->uncore.fw_rendercount = 0;
-               dev_priv->uncore.fw_mediacount = 0;
        }
 
        spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
 }
 
-void intel_uncore_early_sanitize(struct drm_device *dev)
+void intel_uncore_early_sanitize(struct drm_device *dev, bool restore_forcewake)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
 
@@ -389,7 +386,7 @@ void intel_uncore_early_sanitize(struct drm_device *dev)
                __raw_i915_write32(dev_priv, GTFIFODBG,
                                   __raw_i915_read32(dev_priv, GTFIFODBG));
 
-       intel_uncore_forcewake_reset(dev, false);
+       intel_uncore_forcewake_reset(dev, restore_forcewake);
 }
 
 void intel_uncore_sanitize(struct drm_device *dev)
@@ -469,16 +466,43 @@ void assert_force_wake_inactive(struct drm_i915_private *dev_priv)
 #define NEEDS_FORCE_WAKE(dev_priv, reg) \
         ((reg) < 0x40000 && (reg) != FORCEWAKE)
 
-#define FORCEWAKE_VLV_RENDER_RANGE_OFFSET(reg) \
-       (((reg) >= 0x2000 && (reg) < 0x4000) ||\
-       ((reg) >= 0x5000 && (reg) < 0x8000) ||\
-       ((reg) >= 0xB000 && (reg) < 0x12000) ||\
-       ((reg) >= 0x2E000 && (reg) < 0x30000))
+#define REG_RANGE(reg, start, end) ((reg) >= (start) && (reg) < (end))
 
-#define FORCEWAKE_VLV_MEDIA_RANGE_OFFSET(reg)\
-       (((reg) >= 0x12000 && (reg) < 0x14000) ||\
-       ((reg) >= 0x22000 && (reg) < 0x24000) ||\
-       ((reg) >= 0x30000 && (reg) < 0x40000))
+#define FORCEWAKE_VLV_RENDER_RANGE_OFFSET(reg) \
+       (REG_RANGE((reg), 0x2000, 0x4000) || \
+        REG_RANGE((reg), 0x5000, 0x8000) || \
+        REG_RANGE((reg), 0xB000, 0x12000) || \
+        REG_RANGE((reg), 0x2E000, 0x30000))
+
+#define FORCEWAKE_VLV_MEDIA_RANGE_OFFSET(reg) \
+       (REG_RANGE((reg), 0x12000, 0x14000) || \
+        REG_RANGE((reg), 0x22000, 0x24000) || \
+        REG_RANGE((reg), 0x30000, 0x40000))
+
+#define FORCEWAKE_CHV_RENDER_RANGE_OFFSET(reg) \
+       (REG_RANGE((reg), 0x2000, 0x4000) || \
+        REG_RANGE((reg), 0x5000, 0x8000) || \
+        REG_RANGE((reg), 0x8300, 0x8500) || \
+        REG_RANGE((reg), 0xB000, 0xC000) || \
+        REG_RANGE((reg), 0xE000, 0xE800))
+
+#define FORCEWAKE_CHV_MEDIA_RANGE_OFFSET(reg) \
+       (REG_RANGE((reg), 0x8800, 0x8900) || \
+        REG_RANGE((reg), 0xD000, 0xD800) || \
+        REG_RANGE((reg), 0x12000, 0x14000) || \
+        REG_RANGE((reg), 0x1A000, 0x1C000) || \
+        REG_RANGE((reg), 0x1E800, 0x1EA00) || \
+        REG_RANGE((reg), 0x30000, 0x40000))
+
+#define FORCEWAKE_CHV_COMMON_RANGE_OFFSET(reg) \
+       (REG_RANGE((reg), 0x4000, 0x5000) || \
+        REG_RANGE((reg), 0x8000, 0x8300) || \
+        REG_RANGE((reg), 0x8500, 0x8600) || \
+        REG_RANGE((reg), 0x9000, 0xB000) || \
+        REG_RANGE((reg), 0xC000, 0xC800) || \
+        REG_RANGE((reg), 0xF000, 0x10000) || \
+        REG_RANGE((reg), 0x14000, 0x14400) || \
+        REG_RANGE((reg), 0x22000, 0x24000))
 
 static void
 ilk_dummy_write(struct drm_i915_private *dev_priv)
@@ -490,20 +514,30 @@ ilk_dummy_write(struct drm_i915_private *dev_priv)
 }
 
 static void
-hsw_unclaimed_reg_clear(struct drm_i915_private *dev_priv, u32 reg)
+hsw_unclaimed_reg_debug(struct drm_i915_private *dev_priv, u32 reg, bool read,
+                       bool before)
 {
+       const char *op = read ? "reading" : "writing to";
+       const char *when = before ? "before" : "after";
+
+       if (!i915.mmio_debug)
+               return;
+
        if (__raw_i915_read32(dev_priv, FPGA_DBG) & FPGA_DBG_RM_NOCLAIM) {
-               DRM_ERROR("Unknown unclaimed register before writing to %x\n",
-                         reg);
+               WARN(1, "Unclaimed register detected %s %s register 0x%x\n",
+                    when, op, reg);
                __raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM);
        }
 }
 
 static void
-hsw_unclaimed_reg_check(struct drm_i915_private *dev_priv, u32 reg)
+hsw_unclaimed_reg_detect(struct drm_i915_private *dev_priv)
 {
+       if (i915.mmio_debug)
+               return;
+
        if (__raw_i915_read32(dev_priv, FPGA_DBG) & FPGA_DBG_RM_NOCLAIM) {
-               DRM_ERROR("Unclaimed write to %x\n", reg);
+               DRM_ERROR("Unclaimed register detected. Please use the i915.mmio_debug=1 to debug this problem.");
                __raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM);
        }
 }
@@ -540,6 +574,7 @@ gen5_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \
 static u##x \
 gen6_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \
        REG_READ_HEADER(x); \
+       hsw_unclaimed_reg_debug(dev_priv, reg, true, true); \
        if (dev_priv->uncore.forcewake_count == 0 && \
            NEEDS_FORCE_WAKE((dev_priv), (reg))) { \
                dev_priv->uncore.funcs.force_wake_get(dev_priv, \
@@ -550,6 +585,7 @@ gen6_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \
        } else { \
                val = __raw_i915_read##x(dev_priv, reg); \
        } \
+       hsw_unclaimed_reg_debug(dev_priv, reg, true, false); \
        REG_READ_FOOTER; \
 }
 
@@ -573,7 +609,35 @@ vlv_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \
        REG_READ_FOOTER; \
 }
 
+#define __chv_read(x) \
+static u##x \
+chv_read##x(struct drm_i915_private *dev_priv, off_t reg, bool trace) { \
+       unsigned fwengine = 0; \
+       REG_READ_HEADER(x); \
+       if (FORCEWAKE_CHV_RENDER_RANGE_OFFSET(reg)) { \
+               if (dev_priv->uncore.fw_rendercount == 0) \
+                       fwengine = FORCEWAKE_RENDER; \
+       } else if (FORCEWAKE_CHV_MEDIA_RANGE_OFFSET(reg)) { \
+               if (dev_priv->uncore.fw_mediacount == 0) \
+                       fwengine = FORCEWAKE_MEDIA; \
+       } else if (FORCEWAKE_CHV_COMMON_RANGE_OFFSET(reg)) { \
+               if (dev_priv->uncore.fw_rendercount == 0) \
+                       fwengine |= FORCEWAKE_RENDER; \
+               if (dev_priv->uncore.fw_mediacount == 0) \
+                       fwengine |= FORCEWAKE_MEDIA; \
+       } \
+       if (fwengine) \
+               dev_priv->uncore.funcs.force_wake_get(dev_priv, fwengine); \
+       val = __raw_i915_read##x(dev_priv, reg); \
+       if (fwengine) \
+               dev_priv->uncore.funcs.force_wake_put(dev_priv, fwengine); \
+       REG_READ_FOOTER; \
+}
 
+__chv_read(8)
+__chv_read(16)
+__chv_read(32)
+__chv_read(64)
 __vlv_read(8)
 __vlv_read(16)
 __vlv_read(32)
@@ -591,6 +655,7 @@ __gen4_read(16)
 __gen4_read(32)
 __gen4_read(64)
 
+#undef __chv_read
 #undef __vlv_read
 #undef __gen6_read
 #undef __gen5_read
@@ -647,12 +712,13 @@ hsw_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace)
        if (NEEDS_FORCE_WAKE((dev_priv), (reg))) { \
                __fifo_ret = __gen6_gt_wait_for_fifo(dev_priv); \
        } \
-       hsw_unclaimed_reg_clear(dev_priv, reg); \
+       hsw_unclaimed_reg_debug(dev_priv, reg, false, true); \
        __raw_i915_write##x(dev_priv, reg, val); \
        if (unlikely(__fifo_ret)) { \
                gen6_gt_check_fifodbg(dev_priv); \
        } \
-       hsw_unclaimed_reg_check(dev_priv, reg); \
+       hsw_unclaimed_reg_debug(dev_priv, reg, false, false); \
+       hsw_unclaimed_reg_detect(dev_priv); \
        REG_WRITE_FOOTER; \
 }
 
@@ -681,6 +747,7 @@ static bool is_gen8_shadowed(struct drm_i915_private *dev_priv, u32 reg)
 static void \
 gen8_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \
        REG_WRITE_HEADER; \
+       hsw_unclaimed_reg_debug(dev_priv, reg, false, true); \
        if (reg < 0x40000 && !is_gen8_shadowed(dev_priv, reg)) { \
                if (dev_priv->uncore.forcewake_count == 0) \
                        dev_priv->uncore.funcs.force_wake_get(dev_priv, \
@@ -692,9 +759,43 @@ gen8_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace
        } else { \
                __raw_i915_write##x(dev_priv, reg, val); \
        } \
+       hsw_unclaimed_reg_debug(dev_priv, reg, false, false); \
+       hsw_unclaimed_reg_detect(dev_priv); \
        REG_WRITE_FOOTER; \
 }
 
+#define __chv_write(x) \
+static void \
+chv_write##x(struct drm_i915_private *dev_priv, off_t reg, u##x val, bool trace) { \
+       unsigned fwengine = 0; \
+       bool shadowed = is_gen8_shadowed(dev_priv, reg); \
+       REG_WRITE_HEADER; \
+       if (!shadowed) { \
+               if (FORCEWAKE_CHV_RENDER_RANGE_OFFSET(reg)) { \
+                       if (dev_priv->uncore.fw_rendercount == 0) \
+                               fwengine = FORCEWAKE_RENDER; \
+               } else if (FORCEWAKE_CHV_MEDIA_RANGE_OFFSET(reg)) { \
+                       if (dev_priv->uncore.fw_mediacount == 0) \
+                               fwengine = FORCEWAKE_MEDIA; \
+               } else if (FORCEWAKE_CHV_COMMON_RANGE_OFFSET(reg)) { \
+                       if (dev_priv->uncore.fw_rendercount == 0) \
+                               fwengine |= FORCEWAKE_RENDER; \
+                       if (dev_priv->uncore.fw_mediacount == 0) \
+                               fwengine |= FORCEWAKE_MEDIA; \
+               } \
+       } \
+       if (fwengine) \
+               dev_priv->uncore.funcs.force_wake_get(dev_priv, fwengine); \
+       __raw_i915_write##x(dev_priv, reg, val); \
+       if (fwengine) \
+               dev_priv->uncore.funcs.force_wake_put(dev_priv, fwengine); \
+       REG_WRITE_FOOTER; \
+}
+
+__chv_write(8)
+__chv_write(16)
+__chv_write(32)
+__chv_write(64)
 __gen8_write(8)
 __gen8_write(16)
 __gen8_write(32)
@@ -716,6 +817,7 @@ __gen4_write(16)
 __gen4_write(32)
 __gen4_write(64)
 
+#undef __chv_write
 #undef __gen8_write
 #undef __hsw_write
 #undef __gen6_write
@@ -731,7 +833,7 @@ void intel_uncore_init(struct drm_device *dev)
        setup_timer(&dev_priv->uncore.force_wake_timer,
                    gen6_force_wake_timer, (unsigned long)dev_priv);
 
-       intel_uncore_early_sanitize(dev);
+       intel_uncore_early_sanitize(dev, false);
 
        if (IS_VALLEYVIEW(dev)) {
                dev_priv->uncore.funcs.force_wake_get = __vlv_force_wake_get;
@@ -779,14 +881,26 @@ void intel_uncore_init(struct drm_device *dev)
 
        switch (INTEL_INFO(dev)->gen) {
        default:
-               dev_priv->uncore.funcs.mmio_writeb  = gen8_write8;
-               dev_priv->uncore.funcs.mmio_writew  = gen8_write16;
-               dev_priv->uncore.funcs.mmio_writel  = gen8_write32;
-               dev_priv->uncore.funcs.mmio_writeq  = gen8_write64;
-               dev_priv->uncore.funcs.mmio_readb  = gen6_read8;
-               dev_priv->uncore.funcs.mmio_readw  = gen6_read16;
-               dev_priv->uncore.funcs.mmio_readl  = gen6_read32;
-               dev_priv->uncore.funcs.mmio_readq  = gen6_read64;
+               if (IS_CHERRYVIEW(dev)) {
+                       dev_priv->uncore.funcs.mmio_writeb  = chv_write8;
+                       dev_priv->uncore.funcs.mmio_writew  = chv_write16;
+                       dev_priv->uncore.funcs.mmio_writel  = chv_write32;
+                       dev_priv->uncore.funcs.mmio_writeq  = chv_write64;
+                       dev_priv->uncore.funcs.mmio_readb  = chv_read8;
+                       dev_priv->uncore.funcs.mmio_readw  = chv_read16;
+                       dev_priv->uncore.funcs.mmio_readl  = chv_read32;
+                       dev_priv->uncore.funcs.mmio_readq  = chv_read64;
+
+               } else {
+                       dev_priv->uncore.funcs.mmio_writeb  = gen8_write8;
+                       dev_priv->uncore.funcs.mmio_writew  = gen8_write16;
+                       dev_priv->uncore.funcs.mmio_writel  = gen8_write32;
+                       dev_priv->uncore.funcs.mmio_writeq  = gen8_write64;
+                       dev_priv->uncore.funcs.mmio_readb  = gen6_read8;
+                       dev_priv->uncore.funcs.mmio_readw  = gen6_read16;
+                       dev_priv->uncore.funcs.mmio_readl  = gen6_read32;
+                       dev_priv->uncore.funcs.mmio_readq  = gen6_read64;
+               }
                break;
        case 7:
        case 6:
@@ -912,7 +1026,7 @@ int i915_get_reset_stats_ioctl(struct drm_device *dev,
        if (args->flags || args->pad)
                return -EINVAL;
 
-       if (args->ctx_id == DEFAULT_CONTEXT_ID && !capable(CAP_SYS_ADMIN))
+       if (args->ctx_id == DEFAULT_CONTEXT_HANDLE && !capable(CAP_SYS_ADMIN))
                return -EPERM;
 
        ret = mutex_lock_interruptible(&dev->struct_mutex);
@@ -1053,18 +1167,16 @@ static int gen6_do_reset(struct drm_device *dev)
 
 int intel_gpu_reset(struct drm_device *dev)
 {
-       switch (INTEL_INFO(dev)->gen) {
-       case 8:
-       case 7:
-       case 6: return gen6_do_reset(dev);
-       case 5: return ironlake_do_reset(dev);
-       case 4:
-               if (IS_G4X(dev))
-                       return g4x_do_reset(dev);
-               else
-                       return i965_do_reset(dev);
-       default: return -ENODEV;
-       }
+       if (INTEL_INFO(dev)->gen >= 6)
+               return gen6_do_reset(dev);
+       else if (IS_GEN5(dev))
+               return ironlake_do_reset(dev);
+       else if (IS_G4X(dev))
+               return g4x_do_reset(dev);
+       else if (IS_GEN4(dev))
+               return i965_do_reset(dev);
+       else
+               return -ENODEV;
 }
 
 void intel_uncore_check_errors(struct drm_device *dev)
index cf11ee68a6d92bf8e982e3063d86befcaf2ced6d..80de23d9b9c9801daf630611205a2baa768a3341 100644 (file)
@@ -280,7 +280,7 @@ static inline int mgag200_bo_reserve(struct mgag200_bo *bo, bool no_wait)
 {
        int ret;
 
-       ret = ttm_bo_reserve(&bo->bo, true, no_wait, false, 0);
+       ret = ttm_bo_reserve(&bo->bo, true, no_wait, false, NULL);
        if (ret) {
                if (ret != -ERESTARTSYS && ret != -EBUSY)
                        DRM_ERROR("reserve failed %p\n", bo);
index 13b7dd83faa9ca7e6e05157d002be0199f3bd667..5451dc58eff19ccb81d2eb4780c464e314ae6b11 100644 (file)
@@ -272,7 +272,7 @@ static int mga_fbdev_destroy(struct drm_device *dev,
        return 0;
 }
 
-static struct drm_fb_helper_funcs mga_fb_helper_funcs = {
+static const struct drm_fb_helper_funcs mga_fb_helper_funcs = {
        .gamma_set = mga_crtc_fb_gamma_set,
        .gamma_get = mga_crtc_fb_gamma_get,
        .fb_probe = mgag200fb_create,
@@ -293,9 +293,10 @@ int mgag200_fbdev_init(struct mga_device *mdev)
                return -ENOMEM;
 
        mdev->mfbdev = mfbdev;
-       mfbdev->helper.funcs = &mga_fb_helper_funcs;
        spin_lock_init(&mfbdev->dirty_lock);
 
+       drm_fb_helper_prepare(mdev->dev, &mfbdev->helper, &mga_fb_helper_funcs);
+
        ret = drm_fb_helper_init(mdev->dev, &mfbdev->helper,
                                 mdev->num_crtc, MGAG200FB_CONN_LIMIT);
        if (ret)
index a034ed408252eb08e57e166ba6afed4a50931e31..45f04dea0ac2ad9f3f37847251e15b4fb0d09e80 100644 (file)
@@ -1562,19 +1562,9 @@ static struct drm_encoder *mga_connector_best_encoder(struct drm_connector
                                                  *connector)
 {
        int enc_id = connector->encoder_ids[0];
-       struct drm_mode_object *obj;
-       struct drm_encoder *encoder;
-
        /* pick the encoder ids */
-       if (enc_id) {
-               obj =
-                   drm_mode_object_find(connector->dev, enc_id,
-                                        DRM_MODE_OBJECT_ENCODER);
-               if (!obj)
-                       return NULL;
-               encoder = obj_to_encoder(obj);
-               return encoder;
-       }
+       if (enc_id)
+               return drm_encoder_find(connector->dev, enc_id);
        return NULL;
 }
 
@@ -1621,7 +1611,7 @@ static struct drm_connector *mga_vga_init(struct drm_device *dev)
 
        drm_connector_helper_add(connector, &mga_vga_connector_helper_funcs);
 
-       drm_sysfs_connector_add(connector);
+       drm_connector_register(connector);
 
        mga_connector->i2c = mgag200_i2c_create(dev);
        if (!mga_connector->i2c)
index f12388967856bfad8522814f48afd4e20b1052e3..c99c50de3226d663bea299b722faeb2691581fbe 100644 (file)
@@ -2,7 +2,6 @@
 config DRM_MSM
        tristate "MSM DRM"
        depends on DRM
-       depends on MSM_IOMMU
        depends on ARCH_QCOM || (ARM && COMPILE_TEST)
        select DRM_KMS_HELPER
        select SHMEM
index 85d615e7d62fb75789a127fcc021c111a0baa74e..a8a144b38eaabe12329f46f5ef9eea258c8f0c4b 100644 (file)
@@ -10,13 +10,13 @@ git clone https://github.com/freedreno/envytools.git
 The rules-ng-ng source files this header was generated from are:
 - /home/robclark/src/freedreno/envytools/rnndb/adreno.xml               (    364 bytes, from 2013-11-30 14:47:15)
 - /home/robclark/src/freedreno/envytools/rnndb/freedreno_copyright.xml  (   1453 bytes, from 2013-03-31 16:51:27)
-- /home/robclark/src/freedreno/envytools/rnndb/adreno/a2xx.xml          (  32814 bytes, from 2013-11-30 15:07:33)
-- /home/robclark/src/freedreno/envytools/rnndb/adreno/adreno_common.xml (   8900 bytes, from 2013-10-22 23:57:49)
-- /home/robclark/src/freedreno/envytools/rnndb/adreno/adreno_pm4.xml    (  10574 bytes, from 2013-11-13 05:44:45)
-- /home/robclark/src/freedreno/envytools/rnndb/adreno/a3xx.xml          (  53644 bytes, from 2013-11-30 15:07:33)
-- /home/robclark/src/freedreno/envytools/rnndb/adreno/a4xx.xml          (   8344 bytes, from 2013-11-30 14:49:47)
+- /home/robclark/src/freedreno/envytools/rnndb/adreno/a2xx.xml          (  32901 bytes, from 2014-06-02 15:21:30)
+- /home/robclark/src/freedreno/envytools/rnndb/adreno/adreno_common.xml (   9859 bytes, from 2014-06-02 15:21:30)
+- /home/robclark/src/freedreno/envytools/rnndb/adreno/adreno_pm4.xml    (  14477 bytes, from 2014-05-16 11:51:57)
+- /home/robclark/src/freedreno/envytools/rnndb/adreno/a3xx.xml          (  58020 bytes, from 2014-06-25 12:57:16)
+- /home/robclark/src/freedreno/envytools/rnndb/adreno/a4xx.xml          (  26602 bytes, from 2014-06-25 12:57:16)
 
-Copyright (C) 2013 by the following authors:
+Copyright (C) 2013-2014 by the following authors:
 - Rob Clark <robdclark@gmail.com> (robclark)
 
 Permission is hereby granted, free of charge, to any person obtaining
@@ -203,6 +203,15 @@ enum a2xx_rb_copy_sample_select {
        SAMPLE_0123 = 6,
 };
 
+enum a2xx_rb_blend_opcode {
+       BLEND_DST_PLUS_SRC = 0,
+       BLEND_SRC_MINUS_DST = 1,
+       BLEND_MIN_DST_SRC = 2,
+       BLEND_MAX_DST_SRC = 3,
+       BLEND_DST_MINUS_SRC = 4,
+       BLEND_DST_PLUS_SRC_BIAS = 5,
+};
+
 enum adreno_mmu_clnt_beh {
        BEH_NEVR = 0,
        BEH_TRAN_RNG = 1,
@@ -890,6 +899,39 @@ static inline uint32_t A2XX_SQ_CONTEXT_MISC_PARAM_GEN_POS(uint32_t val)
 #define REG_A2XX_VGT_EVENT_INITIATOR                           0x000021f9
 
 #define REG_A2XX_VGT_DRAW_INITIATOR                            0x000021fc
+#define A2XX_VGT_DRAW_INITIATOR_PRIM_TYPE__MASK                        0x0000003f
+#define A2XX_VGT_DRAW_INITIATOR_PRIM_TYPE__SHIFT               0
+static inline uint32_t A2XX_VGT_DRAW_INITIATOR_PRIM_TYPE(enum pc_di_primtype val)
+{
+       return ((val) << A2XX_VGT_DRAW_INITIATOR_PRIM_TYPE__SHIFT) & A2XX_VGT_DRAW_INITIATOR_PRIM_TYPE__MASK;
+}
+#define A2XX_VGT_DRAW_INITIATOR_SOURCE_SELECT__MASK            0x000000c0
+#define A2XX_VGT_DRAW_INITIATOR_SOURCE_SELECT__SHIFT           6
+static inline uint32_t A2XX_VGT_DRAW_INITIATOR_SOURCE_SELECT(enum pc_di_src_sel val)
+{
+       return ((val) << A2XX_VGT_DRAW_INITIATOR_SOURCE_SELECT__SHIFT) & A2XX_VGT_DRAW_INITIATOR_SOURCE_SELECT__MASK;
+}
+#define A2XX_VGT_DRAW_INITIATOR_VIS_CULL__MASK                 0x00000600
+#define A2XX_VGT_DRAW_INITIATOR_VIS_CULL__SHIFT                        9
+static inline uint32_t A2XX_VGT_DRAW_INITIATOR_VIS_CULL(enum pc_di_vis_cull_mode val)
+{
+       return ((val) << A2XX_VGT_DRAW_INITIATOR_VIS_CULL__SHIFT) & A2XX_VGT_DRAW_INITIATOR_VIS_CULL__MASK;
+}
+#define A2XX_VGT_DRAW_INITIATOR_INDEX_SIZE__MASK               0x00000800
+#define A2XX_VGT_DRAW_INITIATOR_INDEX_SIZE__SHIFT              11
+static inline uint32_t A2XX_VGT_DRAW_INITIATOR_INDEX_SIZE(enum pc_di_index_size val)
+{
+       return ((val) << A2XX_VGT_DRAW_INITIATOR_INDEX_SIZE__SHIFT) & A2XX_VGT_DRAW_INITIATOR_INDEX_SIZE__MASK;
+}
+#define A2XX_VGT_DRAW_INITIATOR_NOT_EOP                                0x00001000
+#define A2XX_VGT_DRAW_INITIATOR_SMALL_INDEX                    0x00002000
+#define A2XX_VGT_DRAW_INITIATOR_PRE_DRAW_INITIATOR_ENABLE      0x00004000
+#define A2XX_VGT_DRAW_INITIATOR_NUM_INDICES__MASK              0xffff0000
+#define A2XX_VGT_DRAW_INITIATOR_NUM_INDICES__SHIFT             16
+static inline uint32_t A2XX_VGT_DRAW_INITIATOR_NUM_INDICES(uint32_t val)
+{
+       return ((val) << A2XX_VGT_DRAW_INITIATOR_NUM_INDICES__SHIFT) & A2XX_VGT_DRAW_INITIATOR_NUM_INDICES__MASK;
+}
 
 #define REG_A2XX_VGT_IMMED_DATA                                        0x000021fd
 
@@ -963,7 +1005,7 @@ static inline uint32_t A2XX_RB_BLEND_CONTROL_COLOR_SRCBLEND(enum adreno_rb_blend
 }
 #define A2XX_RB_BLEND_CONTROL_COLOR_COMB_FCN__MASK             0x000000e0
 #define A2XX_RB_BLEND_CONTROL_COLOR_COMB_FCN__SHIFT            5
-static inline uint32_t A2XX_RB_BLEND_CONTROL_COLOR_COMB_FCN(enum adreno_rb_blend_opcode val)
+static inline uint32_t A2XX_RB_BLEND_CONTROL_COLOR_COMB_FCN(enum a2xx_rb_blend_opcode val)
 {
        return ((val) << A2XX_RB_BLEND_CONTROL_COLOR_COMB_FCN__SHIFT) & A2XX_RB_BLEND_CONTROL_COLOR_COMB_FCN__MASK;
 }
@@ -981,7 +1023,7 @@ static inline uint32_t A2XX_RB_BLEND_CONTROL_ALPHA_SRCBLEND(enum adreno_rb_blend
 }
 #define A2XX_RB_BLEND_CONTROL_ALPHA_COMB_FCN__MASK             0x00e00000
 #define A2XX_RB_BLEND_CONTROL_ALPHA_COMB_FCN__SHIFT            21
-static inline uint32_t A2XX_RB_BLEND_CONTROL_ALPHA_COMB_FCN(enum adreno_rb_blend_opcode val)
+static inline uint32_t A2XX_RB_BLEND_CONTROL_ALPHA_COMB_FCN(enum a2xx_rb_blend_opcode val)
 {
        return ((val) << A2XX_RB_BLEND_CONTROL_ALPHA_COMB_FCN__SHIFT) & A2XX_RB_BLEND_CONTROL_ALPHA_COMB_FCN__MASK;
 }
index a7be56163d2324f4a24ae7e4836168f95db967a2..303e8a9e91a595bf5a09075d1865319c8206cada 100644 (file)
@@ -10,13 +10,13 @@ git clone https://github.com/freedreno/envytools.git
 The rules-ng-ng source files this header was generated from are:
 - /home/robclark/src/freedreno/envytools/rnndb/adreno.xml               (    364 bytes, from 2013-11-30 14:47:15)
 - /home/robclark/src/freedreno/envytools/rnndb/freedreno_copyright.xml  (   1453 bytes, from 2013-03-31 16:51:27)
-- /home/robclark/src/freedreno/envytools/rnndb/adreno/a2xx.xml          (  32814 bytes, from 2013-11-30 15:07:33)
-- /home/robclark/src/freedreno/envytools/rnndb/adreno/adreno_common.xml (   8900 bytes, from 2013-10-22 23:57:49)
-- /home/robclark/src/freedreno/envytools/rnndb/adreno/adreno_pm4.xml    (  10574 bytes, from 2013-11-13 05:44:45)
-- /home/robclark/src/freedreno/envytools/rnndb/adreno/a3xx.xml          (  53644 bytes, from 2013-11-30 15:07:33)
-- /home/robclark/src/freedreno/envytools/rnndb/adreno/a4xx.xml          (   8344 bytes, from 2013-11-30 14:49:47)
+- /home/robclark/src/freedreno/envytools/rnndb/adreno/a2xx.xml          (  32901 bytes, from 2014-06-02 15:21:30)
+- /home/robclark/src/freedreno/envytools/rnndb/adreno/adreno_common.xml (   9859 bytes, from 2014-06-02 15:21:30)
+- /home/robclark/src/freedreno/envytools/rnndb/adreno/adreno_pm4.xml    (  14477 bytes, from 2014-05-16 11:51:57)
+- /home/robclark/src/freedreno/envytools/rnndb/adreno/a3xx.xml          (  58020 bytes, from 2014-06-25 12:57:16)
+- /home/robclark/src/freedreno/envytools/rnndb/adreno/a4xx.xml          (  26602 bytes, from 2014-06-25 12:57:16)
 
-Copyright (C) 2013 by the following authors:
+Copyright (C) 2013-2014 by the following authors:
 - Rob Clark <robdclark@gmail.com> (robclark)
 
 Permission is hereby granted, free of charge, to any person obtaining
@@ -41,31 +41,11 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */
 
 
-enum a3xx_render_mode {
-       RB_RENDERING_PASS = 0,
-       RB_TILING_PASS = 1,
-       RB_RESOLVE_PASS = 2,
-};
-
 enum a3xx_tile_mode {
        LINEAR = 0,
        TILE_32X32 = 2,
 };
 
-enum a3xx_threadmode {
-       MULTI = 0,
-       SINGLE = 1,
-};
-
-enum a3xx_instrbuffermode {
-       BUFFER = 1,
-};
-
-enum a3xx_threadsize {
-       TWO_QUADS = 0,
-       FOUR_QUADS = 1,
-};
-
 enum a3xx_state_block_id {
        HLSQ_BLOCK_ID_TP_TEX = 2,
        HLSQ_BLOCK_ID_TP_MIPMAP = 3,
@@ -169,6 +149,8 @@ enum a3xx_color_fmt {
        RB_R8G8B8A8_UNORM = 8,
        RB_Z16_UNORM = 12,
        RB_A8_UNORM = 20,
+       RB_R16G16B16A16_FLOAT = 27,
+       RB_R32G32B32A32_FLOAT = 51,
 };
 
 enum a3xx_color_swap {
@@ -178,12 +160,6 @@ enum a3xx_color_swap {
        XYZW = 3,
 };
 
-enum a3xx_msaa_samples {
-       MSAA_ONE = 0,
-       MSAA_TWO = 1,
-       MSAA_FOUR = 2,
-};
-
 enum a3xx_sp_perfcounter_select {
        SP_FS_CFLOW_INSTRUCTIONS = 12,
        SP_FS_FULL_ALU_INSTRUCTIONS = 14,
@@ -191,21 +167,45 @@ enum a3xx_sp_perfcounter_select {
        SP_ALU_ACTIVE_CYCLES = 29,
 };
 
-enum adreno_rb_copy_control_mode {
-       RB_COPY_RESOLVE = 1,
-       RB_COPY_DEPTH_STENCIL = 5,
+enum a3xx_rop_code {
+       ROP_CLEAR = 0,
+       ROP_NOR = 1,
+       ROP_AND_INVERTED = 2,
+       ROP_COPY_INVERTED = 3,
+       ROP_AND_REVERSE = 4,
+       ROP_INVERT = 5,
+       ROP_XOR = 6,
+       ROP_NAND = 7,
+       ROP_AND = 8,
+       ROP_EQUIV = 9,
+       ROP_NOOP = 10,
+       ROP_OR_INVERTED = 11,
+       ROP_COPY = 12,
+       ROP_OR_REVERSE = 13,
+       ROP_OR = 14,
+       ROP_SET = 15,
+};
+
+enum a3xx_rb_blend_opcode {
+       BLEND_DST_PLUS_SRC = 0,
+       BLEND_SRC_MINUS_DST = 1,
+       BLEND_DST_MINUS_SRC = 2,
+       BLEND_MIN_DST_SRC = 3,
+       BLEND_MAX_DST_SRC = 4,
 };
 
 enum a3xx_tex_filter {
        A3XX_TEX_NEAREST = 0,
        A3XX_TEX_LINEAR = 1,
+       A3XX_TEX_ANISO = 2,
 };
 
 enum a3xx_tex_clamp {
        A3XX_TEX_REPEAT = 0,
        A3XX_TEX_CLAMP_TO_EDGE = 1,
        A3XX_TEX_MIRROR_REPEAT = 2,
-       A3XX_TEX_CLAMP_NONE = 3,
+       A3XX_TEX_CLAMP_TO_BORDER = 3,
+       A3XX_TEX_MIRROR_CLAMP = 4,
 };
 
 enum a3xx_tex_swiz {
@@ -316,6 +316,7 @@ enum a3xx_tex_type {
 #define REG_A3XX_RBBM_INT_0_STATUS                             0x00000064
 
 #define REG_A3XX_RBBM_PERFCTR_CTL                              0x00000080
+#define A3XX_RBBM_PERFCTR_CTL_ENABLE                           0x00000001
 
 #define REG_A3XX_RBBM_PERFCTR_LOAD_CMD0                                0x00000081
 
@@ -549,6 +550,10 @@ static inline uint32_t REG_A3XX_CP_PROTECT_REG(uint32_t i0) { return 0x00000460
 
 #define REG_A3XX_CP_AHB_FAULT                                  0x0000054d
 
+#define REG_A3XX_SP_GLOBAL_MEM_SIZE                            0x00000e22
+
+#define REG_A3XX_SP_GLOBAL_MEM_ADDR                            0x00000e23
+
 #define REG_A3XX_GRAS_CL_CLIP_CNTL                             0x00002040
 #define A3XX_GRAS_CL_CLIP_CNTL_IJ_PERSP_CENTER                 0x00001000
 #define A3XX_GRAS_CL_CLIP_CNTL_CLIP_DISABLE                    0x00010000
@@ -556,6 +561,9 @@ static inline uint32_t REG_A3XX_CP_PROTECT_REG(uint32_t i0) { return 0x00000460
 #define A3XX_GRAS_CL_CLIP_CNTL_VP_CLIP_CODE_IGNORE             0x00080000
 #define A3XX_GRAS_CL_CLIP_CNTL_VP_XFORM_DISABLE                        0x00100000
 #define A3XX_GRAS_CL_CLIP_CNTL_PERSP_DIVISION_DISABLE          0x00200000
+#define A3XX_GRAS_CL_CLIP_CNTL_ZCOORD                          0x00800000
+#define A3XX_GRAS_CL_CLIP_CNTL_WCOORD                          0x01000000
+#define A3XX_GRAS_CL_CLIP_CNTL_ZCLIP_DISABLE                   0x02000000
 
 #define REG_A3XX_GRAS_CL_GB_CLIP_ADJ                           0x00002044
 #define A3XX_GRAS_CL_GB_CLIP_ADJ_HORZ__MASK                    0x000003ff
@@ -620,8 +628,26 @@ static inline uint32_t A3XX_GRAS_CL_VPORT_ZSCALE(float val)
 }
 
 #define REG_A3XX_GRAS_SU_POINT_MINMAX                          0x00002068
+#define A3XX_GRAS_SU_POINT_MINMAX_MIN__MASK                    0x0000ffff
+#define A3XX_GRAS_SU_POINT_MINMAX_MIN__SHIFT                   0
+static inline uint32_t A3XX_GRAS_SU_POINT_MINMAX_MIN(float val)
+{
+       return ((((uint32_t)(val * 8.0))) << A3XX_GRAS_SU_POINT_MINMAX_MIN__SHIFT) & A3XX_GRAS_SU_POINT_MINMAX_MIN__MASK;
+}
+#define A3XX_GRAS_SU_POINT_MINMAX_MAX__MASK                    0xffff0000
+#define A3XX_GRAS_SU_POINT_MINMAX_MAX__SHIFT                   16
+static inline uint32_t A3XX_GRAS_SU_POINT_MINMAX_MAX(float val)
+{
+       return ((((uint32_t)(val * 8.0))) << A3XX_GRAS_SU_POINT_MINMAX_MAX__SHIFT) & A3XX_GRAS_SU_POINT_MINMAX_MAX__MASK;
+}
 
 #define REG_A3XX_GRAS_SU_POINT_SIZE                            0x00002069
+#define A3XX_GRAS_SU_POINT_SIZE__MASK                          0xffffffff
+#define A3XX_GRAS_SU_POINT_SIZE__SHIFT                         0
+static inline uint32_t A3XX_GRAS_SU_POINT_SIZE(float val)
+{
+       return ((((uint32_t)(val * 8.0))) << A3XX_GRAS_SU_POINT_SIZE__SHIFT) & A3XX_GRAS_SU_POINT_SIZE__MASK;
+}
 
 #define REG_A3XX_GRAS_SU_POLY_OFFSET_SCALE                     0x0000206c
 #define A3XX_GRAS_SU_POLY_OFFSET_SCALE_VAL__MASK               0x00ffffff
@@ -743,6 +769,7 @@ static inline uint32_t A3XX_RB_MODE_CONTROL_RENDER_MODE(enum a3xx_render_mode va
 #define A3XX_RB_MODE_CONTROL_PACKER_TIMER_ENABLE               0x00010000
 
 #define REG_A3XX_RB_RENDER_CONTROL                             0x000020c1
+#define A3XX_RB_RENDER_CONTROL_FACENESS                                0x00000008
 #define A3XX_RB_RENDER_CONTROL_BIN_WIDTH__MASK                 0x00000ff0
 #define A3XX_RB_RENDER_CONTROL_BIN_WIDTH__SHIFT                        4
 static inline uint32_t A3XX_RB_RENDER_CONTROL_BIN_WIDTH(uint32_t val)
@@ -751,6 +778,10 @@ static inline uint32_t A3XX_RB_RENDER_CONTROL_BIN_WIDTH(uint32_t val)
 }
 #define A3XX_RB_RENDER_CONTROL_DISABLE_COLOR_PIPE              0x00001000
 #define A3XX_RB_RENDER_CONTROL_ENABLE_GMEM                     0x00002000
+#define A3XX_RB_RENDER_CONTROL_XCOORD                          0x00004000
+#define A3XX_RB_RENDER_CONTROL_YCOORD                          0x00008000
+#define A3XX_RB_RENDER_CONTROL_ZCOORD                          0x00010000
+#define A3XX_RB_RENDER_CONTROL_WCOORD                          0x00020000
 #define A3XX_RB_RENDER_CONTROL_ALPHA_TEST                      0x00400000
 #define A3XX_RB_RENDER_CONTROL_ALPHA_TEST_FUNC__MASK           0x07000000
 #define A3XX_RB_RENDER_CONTROL_ALPHA_TEST_FUNC__SHIFT          24
@@ -796,7 +827,7 @@ static inline uint32_t REG_A3XX_RB_MRT_CONTROL(uint32_t i0) { return 0x000020c4
 #define A3XX_RB_MRT_CONTROL_BLEND2                             0x00000020
 #define A3XX_RB_MRT_CONTROL_ROP_CODE__MASK                     0x00000f00
 #define A3XX_RB_MRT_CONTROL_ROP_CODE__SHIFT                    8
-static inline uint32_t A3XX_RB_MRT_CONTROL_ROP_CODE(uint32_t val)
+static inline uint32_t A3XX_RB_MRT_CONTROL_ROP_CODE(enum a3xx_rop_code val)
 {
        return ((val) << A3XX_RB_MRT_CONTROL_ROP_CODE__SHIFT) & A3XX_RB_MRT_CONTROL_ROP_CODE__MASK;
 }
@@ -856,7 +887,7 @@ static inline uint32_t A3XX_RB_MRT_BLEND_CONTROL_RGB_SRC_FACTOR(enum adreno_rb_b
 }
 #define A3XX_RB_MRT_BLEND_CONTROL_RGB_BLEND_OPCODE__MASK       0x000000e0
 #define A3XX_RB_MRT_BLEND_CONTROL_RGB_BLEND_OPCODE__SHIFT      5
-static inline uint32_t A3XX_RB_MRT_BLEND_CONTROL_RGB_BLEND_OPCODE(enum adreno_rb_blend_opcode val)
+static inline uint32_t A3XX_RB_MRT_BLEND_CONTROL_RGB_BLEND_OPCODE(enum a3xx_rb_blend_opcode val)
 {
        return ((val) << A3XX_RB_MRT_BLEND_CONTROL_RGB_BLEND_OPCODE__SHIFT) & A3XX_RB_MRT_BLEND_CONTROL_RGB_BLEND_OPCODE__MASK;
 }
@@ -874,7 +905,7 @@ static inline uint32_t A3XX_RB_MRT_BLEND_CONTROL_ALPHA_SRC_FACTOR(enum adreno_rb
 }
 #define A3XX_RB_MRT_BLEND_CONTROL_ALPHA_BLEND_OPCODE__MASK     0x00e00000
 #define A3XX_RB_MRT_BLEND_CONTROL_ALPHA_BLEND_OPCODE__SHIFT    21
-static inline uint32_t A3XX_RB_MRT_BLEND_CONTROL_ALPHA_BLEND_OPCODE(enum adreno_rb_blend_opcode val)
+static inline uint32_t A3XX_RB_MRT_BLEND_CONTROL_ALPHA_BLEND_OPCODE(enum a3xx_rb_blend_opcode val)
 {
        return ((val) << A3XX_RB_MRT_BLEND_CONTROL_ALPHA_BLEND_OPCODE__SHIFT) & A3XX_RB_MRT_BLEND_CONTROL_ALPHA_BLEND_OPCODE__MASK;
 }
@@ -957,17 +988,24 @@ static inline uint32_t A3XX_RB_COPY_CONTROL_MSAA_RESOLVE(enum a3xx_msaa_samples
 {
        return ((val) << A3XX_RB_COPY_CONTROL_MSAA_RESOLVE__SHIFT) & A3XX_RB_COPY_CONTROL_MSAA_RESOLVE__MASK;
 }
+#define A3XX_RB_COPY_CONTROL_DEPTHCLEAR                                0x00000008
 #define A3XX_RB_COPY_CONTROL_MODE__MASK                                0x00000070
 #define A3XX_RB_COPY_CONTROL_MODE__SHIFT                       4
 static inline uint32_t A3XX_RB_COPY_CONTROL_MODE(enum adreno_rb_copy_control_mode val)
 {
        return ((val) << A3XX_RB_COPY_CONTROL_MODE__SHIFT) & A3XX_RB_COPY_CONTROL_MODE__MASK;
 }
-#define A3XX_RB_COPY_CONTROL_GMEM_BASE__MASK                   0xfffffc00
-#define A3XX_RB_COPY_CONTROL_GMEM_BASE__SHIFT                  10
+#define A3XX_RB_COPY_CONTROL_FASTCLEAR__MASK                   0x00000f00
+#define A3XX_RB_COPY_CONTROL_FASTCLEAR__SHIFT                  8
+static inline uint32_t A3XX_RB_COPY_CONTROL_FASTCLEAR(uint32_t val)
+{
+       return ((val) << A3XX_RB_COPY_CONTROL_FASTCLEAR__SHIFT) & A3XX_RB_COPY_CONTROL_FASTCLEAR__MASK;
+}
+#define A3XX_RB_COPY_CONTROL_GMEM_BASE__MASK                   0xffffc000
+#define A3XX_RB_COPY_CONTROL_GMEM_BASE__SHIFT                  14
 static inline uint32_t A3XX_RB_COPY_CONTROL_GMEM_BASE(uint32_t val)
 {
-       return ((val >> 10) << A3XX_RB_COPY_CONTROL_GMEM_BASE__SHIFT) & A3XX_RB_COPY_CONTROL_GMEM_BASE__MASK;
+       return ((val >> 14) << A3XX_RB_COPY_CONTROL_GMEM_BASE__SHIFT) & A3XX_RB_COPY_CONTROL_GMEM_BASE__MASK;
 }
 
 #define REG_A3XX_RB_COPY_DEST_BASE                             0x000020ed
@@ -1005,6 +1043,12 @@ static inline uint32_t A3XX_RB_COPY_DEST_INFO_SWAP(enum a3xx_color_swap val)
 {
        return ((val) << A3XX_RB_COPY_DEST_INFO_SWAP__SHIFT) & A3XX_RB_COPY_DEST_INFO_SWAP__MASK;
 }
+#define A3XX_RB_COPY_DEST_INFO_DITHER_MODE__MASK               0x00000c00
+#define A3XX_RB_COPY_DEST_INFO_DITHER_MODE__SHIFT              10
+static inline uint32_t A3XX_RB_COPY_DEST_INFO_DITHER_MODE(enum adreno_rb_dither_mode val)
+{
+       return ((val) << A3XX_RB_COPY_DEST_INFO_DITHER_MODE__SHIFT) & A3XX_RB_COPY_DEST_INFO_DITHER_MODE__MASK;
+}
 #define A3XX_RB_COPY_DEST_INFO_COMPONENT_ENABLE__MASK          0x0003c000
 #define A3XX_RB_COPY_DEST_INFO_COMPONENT_ENABLE__SHIFT         14
 static inline uint32_t A3XX_RB_COPY_DEST_INFO_COMPONENT_ENABLE(uint32_t val)
@@ -1019,6 +1063,7 @@ static inline uint32_t A3XX_RB_COPY_DEST_INFO_ENDIAN(enum adreno_rb_surface_endi
 }
 
 #define REG_A3XX_RB_DEPTH_CONTROL                              0x00002100
+#define A3XX_RB_DEPTH_CONTROL_FRAG_WRITES_Z                    0x00000001
 #define A3XX_RB_DEPTH_CONTROL_Z_ENABLE                         0x00000002
 #define A3XX_RB_DEPTH_CONTROL_Z_WRITE_ENABLE                   0x00000004
 #define A3XX_RB_DEPTH_CONTROL_EARLY_Z_DISABLE                  0x00000008
@@ -1044,7 +1089,7 @@ static inline uint32_t A3XX_RB_DEPTH_INFO_DEPTH_FORMAT(enum adreno_rb_depth_form
 #define A3XX_RB_DEPTH_INFO_DEPTH_BASE__SHIFT                   11
 static inline uint32_t A3XX_RB_DEPTH_INFO_DEPTH_BASE(uint32_t val)
 {
-       return ((val >> 10) << A3XX_RB_DEPTH_INFO_DEPTH_BASE__SHIFT) & A3XX_RB_DEPTH_INFO_DEPTH_BASE__MASK;
+       return ((val >> 12) << A3XX_RB_DEPTH_INFO_DEPTH_BASE__SHIFT) & A3XX_RB_DEPTH_INFO_DEPTH_BASE__MASK;
 }
 
 #define REG_A3XX_RB_DEPTH_PITCH                                        0x00002103
@@ -1172,6 +1217,8 @@ static inline uint32_t A3XX_RB_WINDOW_OFFSET_Y(uint32_t val)
 }
 
 #define REG_A3XX_RB_SAMPLE_COUNT_CONTROL                       0x00002110
+#define A3XX_RB_SAMPLE_COUNT_CONTROL_RESET                     0x00000001
+#define A3XX_RB_SAMPLE_COUNT_CONTROL_COPY                      0x00000002
 
 #define REG_A3XX_RB_SAMPLE_COUNT_ADDR                          0x00002111
 
@@ -1179,7 +1226,23 @@ static inline uint32_t A3XX_RB_WINDOW_OFFSET_Y(uint32_t val)
 
 #define REG_A3XX_RB_Z_CLAMP_MAX                                        0x00002115
 
+#define REG_A3XX_VGT_BIN_BASE                                  0x000021e1
+
+#define REG_A3XX_VGT_BIN_SIZE                                  0x000021e2
+
 #define REG_A3XX_PC_VSTREAM_CONTROL                            0x000021e4
+#define A3XX_PC_VSTREAM_CONTROL_SIZE__MASK                     0x003f0000
+#define A3XX_PC_VSTREAM_CONTROL_SIZE__SHIFT                    16
+static inline uint32_t A3XX_PC_VSTREAM_CONTROL_SIZE(uint32_t val)
+{
+       return ((val) << A3XX_PC_VSTREAM_CONTROL_SIZE__SHIFT) & A3XX_PC_VSTREAM_CONTROL_SIZE__MASK;
+}
+#define A3XX_PC_VSTREAM_CONTROL_N__MASK                                0x07c00000
+#define A3XX_PC_VSTREAM_CONTROL_N__SHIFT                       22
+static inline uint32_t A3XX_PC_VSTREAM_CONTROL_N(uint32_t val)
+{
+       return ((val) << A3XX_PC_VSTREAM_CONTROL_N__SHIFT) & A3XX_PC_VSTREAM_CONTROL_N__MASK;
+}
 
 #define REG_A3XX_PC_VERTEX_REUSE_BLOCK_CNTL                    0x000021ea
 
@@ -1203,6 +1266,7 @@ static inline uint32_t A3XX_PC_PRIM_VTX_CNTL_POLYMODE_BACK_PTYPE(enum adreno_pa_
        return ((val) << A3XX_PC_PRIM_VTX_CNTL_POLYMODE_BACK_PTYPE__SHIFT) & A3XX_PC_PRIM_VTX_CNTL_POLYMODE_BACK_PTYPE__MASK;
 }
 #define A3XX_PC_PRIM_VTX_CNTL_PROVOKING_VTX_LAST               0x02000000
+#define A3XX_PC_PRIM_VTX_CNTL_PSIZE                            0x04000000
 
 #define REG_A3XX_PC_RESTART_INDEX                              0x000021ed
 
@@ -1232,6 +1296,7 @@ static inline uint32_t A3XX_HLSQ_CONTROL_1_REG_VSTHREADSIZE(enum a3xx_threadsize
 }
 #define A3XX_HLSQ_CONTROL_1_REG_VSSUPERTHREADENABLE            0x00000100
 #define A3XX_HLSQ_CONTROL_1_REG_RESERVED1                      0x00000200
+#define A3XX_HLSQ_CONTROL_1_REG_ZWCOORD                                0x02000000
 
 #define REG_A3XX_HLSQ_CONTROL_2_REG                            0x00002202
 #define A3XX_HLSQ_CONTROL_2_REG_PRIMALLOCTHRESHOLD__MASK       0xfc000000
@@ -1242,6 +1307,12 @@ static inline uint32_t A3XX_HLSQ_CONTROL_2_REG_PRIMALLOCTHRESHOLD(uint32_t val)
 }
 
 #define REG_A3XX_HLSQ_CONTROL_3_REG                            0x00002203
+#define A3XX_HLSQ_CONTROL_3_REG_REGID__MASK                    0x000000ff
+#define A3XX_HLSQ_CONTROL_3_REG_REGID__SHIFT                   0
+static inline uint32_t A3XX_HLSQ_CONTROL_3_REG_REGID(uint32_t val)
+{
+       return ((val) << A3XX_HLSQ_CONTROL_3_REG_REGID__SHIFT) & A3XX_HLSQ_CONTROL_3_REG_REGID__MASK;
+}
 
 #define REG_A3XX_HLSQ_VS_CONTROL_REG                           0x00002204
 #define A3XX_HLSQ_VS_CONTROL_REG_CONSTLENGTH__MASK             0x00000fff
@@ -1312,10 +1383,36 @@ static inline uint32_t A3XX_HLSQ_CONST_FSPRESV_RANGE_REG_ENDENTRY(uint32_t val)
 }
 
 #define REG_A3XX_HLSQ_CL_NDRANGE_0_REG                         0x0000220a
+#define A3XX_HLSQ_CL_NDRANGE_0_REG_WORKDIM__MASK               0x00000003
+#define A3XX_HLSQ_CL_NDRANGE_0_REG_WORKDIM__SHIFT              0
+static inline uint32_t A3XX_HLSQ_CL_NDRANGE_0_REG_WORKDIM(uint32_t val)
+{
+       return ((val) << A3XX_HLSQ_CL_NDRANGE_0_REG_WORKDIM__SHIFT) & A3XX_HLSQ_CL_NDRANGE_0_REG_WORKDIM__MASK;
+}
+#define A3XX_HLSQ_CL_NDRANGE_0_REG_LOCALSIZE0__MASK            0x00000ffc
+#define A3XX_HLSQ_CL_NDRANGE_0_REG_LOCALSIZE0__SHIFT           2
+static inline uint32_t A3XX_HLSQ_CL_NDRANGE_0_REG_LOCALSIZE0(uint32_t val)
+{
+       return ((val) << A3XX_HLSQ_CL_NDRANGE_0_REG_LOCALSIZE0__SHIFT) & A3XX_HLSQ_CL_NDRANGE_0_REG_LOCALSIZE0__MASK;
+}
+#define A3XX_HLSQ_CL_NDRANGE_0_REG_LOCALSIZE1__MASK            0x003ff000
+#define A3XX_HLSQ_CL_NDRANGE_0_REG_LOCALSIZE1__SHIFT           12
+static inline uint32_t A3XX_HLSQ_CL_NDRANGE_0_REG_LOCALSIZE1(uint32_t val)
+{
+       return ((val) << A3XX_HLSQ_CL_NDRANGE_0_REG_LOCALSIZE1__SHIFT) & A3XX_HLSQ_CL_NDRANGE_0_REG_LOCALSIZE1__MASK;
+}
+#define A3XX_HLSQ_CL_NDRANGE_0_REG_LOCALSIZE2__MASK            0xffc00000
+#define A3XX_HLSQ_CL_NDRANGE_0_REG_LOCALSIZE2__SHIFT           22
+static inline uint32_t A3XX_HLSQ_CL_NDRANGE_0_REG_LOCALSIZE2(uint32_t val)
+{
+       return ((val) << A3XX_HLSQ_CL_NDRANGE_0_REG_LOCALSIZE2__SHIFT) & A3XX_HLSQ_CL_NDRANGE_0_REG_LOCALSIZE2__MASK;
+}
+
+static inline uint32_t REG_A3XX_HLSQ_CL_GLOBAL_WORK(uint32_t i0) { return 0x0000220b + 0x2*i0; }
 
-#define REG_A3XX_HLSQ_CL_NDRANGE_1_REG                         0x0000220b
+static inline uint32_t REG_A3XX_HLSQ_CL_GLOBAL_WORK_SIZE(uint32_t i0) { return 0x0000220b + 0x2*i0; }
 
-#define REG_A3XX_HLSQ_CL_NDRANGE_2_REG                         0x0000220c
+static inline uint32_t REG_A3XX_HLSQ_CL_GLOBAL_WORK_OFFSET(uint32_t i0) { return 0x0000220c + 0x2*i0; }
 
 #define REG_A3XX_HLSQ_CL_CONTROL_0_REG                         0x00002211
 
@@ -1323,7 +1420,9 @@ static inline uint32_t A3XX_HLSQ_CONST_FSPRESV_RANGE_REG_ENDENTRY(uint32_t val)
 
 #define REG_A3XX_HLSQ_CL_KERNEL_CONST_REG                      0x00002214
 
-#define REG_A3XX_HLSQ_CL_KERNEL_GROUP_X_REG                    0x00002215
+static inline uint32_t REG_A3XX_HLSQ_CL_KERNEL_GROUP(uint32_t i0) { return 0x00002215 + 0x1*i0; }
+
+static inline uint32_t REG_A3XX_HLSQ_CL_KERNEL_GROUP_RATIO(uint32_t i0) { return 0x00002215 + 0x1*i0; }
 
 #define REG_A3XX_HLSQ_CL_KERNEL_GROUP_Y_REG                    0x00002216
 
@@ -1438,6 +1537,12 @@ static inline uint32_t A3XX_VFD_DECODE_INSTR_REGID(uint32_t val)
 {
        return ((val) << A3XX_VFD_DECODE_INSTR_REGID__SHIFT) & A3XX_VFD_DECODE_INSTR_REGID__MASK;
 }
+#define A3XX_VFD_DECODE_INSTR_SWAP__MASK                       0x00c00000
+#define A3XX_VFD_DECODE_INSTR_SWAP__SHIFT                      22
+static inline uint32_t A3XX_VFD_DECODE_INSTR_SWAP(enum a3xx_color_swap val)
+{
+       return ((val) << A3XX_VFD_DECODE_INSTR_SWAP__SHIFT) & A3XX_VFD_DECODE_INSTR_SWAP__MASK;
+}
 #define A3XX_VFD_DECODE_INSTR_SHIFTCNT__MASK                   0x1f000000
 #define A3XX_VFD_DECODE_INSTR_SHIFTCNT__SHIFT                  24
 static inline uint32_t A3XX_VFD_DECODE_INSTR_SHIFTCNT(uint32_t val)
@@ -1462,12 +1567,13 @@ static inline uint32_t A3XX_VFD_VS_THREADING_THRESHOLD_REGID_VTXCNT(uint32_t val
 }
 
 #define REG_A3XX_VPC_ATTR                                      0x00002280
-#define A3XX_VPC_ATTR_TOTALATTR__MASK                          0x00000fff
+#define A3XX_VPC_ATTR_TOTALATTR__MASK                          0x000001ff
 #define A3XX_VPC_ATTR_TOTALATTR__SHIFT                         0
 static inline uint32_t A3XX_VPC_ATTR_TOTALATTR(uint32_t val)
 {
        return ((val) << A3XX_VPC_ATTR_TOTALATTR__SHIFT) & A3XX_VPC_ATTR_TOTALATTR__MASK;
 }
+#define A3XX_VPC_ATTR_PSIZE                                    0x00000200
 #define A3XX_VPC_ATTR_THRDASSIGN__MASK                         0x0ffff000
 #define A3XX_VPC_ATTR_THRDASSIGN__SHIFT                                12
 static inline uint32_t A3XX_VPC_ATTR_THRDASSIGN(uint32_t val)
@@ -1522,11 +1628,11 @@ static inline uint32_t A3XX_SP_SP_CTRL_REG_SLEEPMODE(uint32_t val)
 {
        return ((val) << A3XX_SP_SP_CTRL_REG_SLEEPMODE__SHIFT) & A3XX_SP_SP_CTRL_REG_SLEEPMODE__MASK;
 }
-#define A3XX_SP_SP_CTRL_REG_LOMODE__MASK                       0x00c00000
-#define A3XX_SP_SP_CTRL_REG_LOMODE__SHIFT                      22
-static inline uint32_t A3XX_SP_SP_CTRL_REG_LOMODE(uint32_t val)
+#define A3XX_SP_SP_CTRL_REG_L0MODE__MASK                       0x00c00000
+#define A3XX_SP_SP_CTRL_REG_L0MODE__SHIFT                      22
+static inline uint32_t A3XX_SP_SP_CTRL_REG_L0MODE(uint32_t val)
 {
-       return ((val) << A3XX_SP_SP_CTRL_REG_LOMODE__SHIFT) & A3XX_SP_SP_CTRL_REG_LOMODE__MASK;
+       return ((val) << A3XX_SP_SP_CTRL_REG_L0MODE__SHIFT) & A3XX_SP_SP_CTRL_REG_L0MODE__MASK;
 }
 
 #define REG_A3XX_SP_VS_CTRL_REG0                               0x000022c4
@@ -1569,6 +1675,7 @@ static inline uint32_t A3XX_SP_VS_CTRL_REG0_THREADSIZE(enum a3xx_threadsize val)
 }
 #define A3XX_SP_VS_CTRL_REG0_SUPERTHREADMODE                   0x00200000
 #define A3XX_SP_VS_CTRL_REG0_PIXLODENABLE                      0x00400000
+#define A3XX_SP_VS_CTRL_REG0_COMPUTEMODE                       0x00800000
 #define A3XX_SP_VS_CTRL_REG0_LENGTH__MASK                      0xff000000
 #define A3XX_SP_VS_CTRL_REG0_LENGTH__SHIFT                     24
 static inline uint32_t A3XX_SP_VS_CTRL_REG0_LENGTH(uint32_t val)
@@ -1742,6 +1849,7 @@ static inline uint32_t A3XX_SP_FS_CTRL_REG0_THREADSIZE(enum a3xx_threadsize val)
 }
 #define A3XX_SP_FS_CTRL_REG0_SUPERTHREADMODE                   0x00200000
 #define A3XX_SP_FS_CTRL_REG0_PIXLODENABLE                      0x00400000
+#define A3XX_SP_FS_CTRL_REG0_COMPUTEMODE                       0x00800000
 #define A3XX_SP_FS_CTRL_REG0_LENGTH__MASK                      0xff000000
 #define A3XX_SP_FS_CTRL_REG0_LENGTH__SHIFT                     24
 static inline uint32_t A3XX_SP_FS_CTRL_REG0_LENGTH(uint32_t val)
@@ -1802,6 +1910,13 @@ static inline uint32_t A3XX_SP_FS_OBJ_OFFSET_REG_SHADEROBJOFFSET(uint32_t val)
 #define REG_A3XX_SP_FS_FLAT_SHAD_MODE_REG_1                    0x000022e9
 
 #define REG_A3XX_SP_FS_OUTPUT_REG                              0x000022ec
+#define A3XX_SP_FS_OUTPUT_REG_DEPTH_ENABLE                     0x00000080
+#define A3XX_SP_FS_OUTPUT_REG_DEPTH_REGID__MASK                        0x0000ff00
+#define A3XX_SP_FS_OUTPUT_REG_DEPTH_REGID__SHIFT               8
+static inline uint32_t A3XX_SP_FS_OUTPUT_REG_DEPTH_REGID(uint32_t val)
+{
+       return ((val) << A3XX_SP_FS_OUTPUT_REG_DEPTH_REGID__SHIFT) & A3XX_SP_FS_OUTPUT_REG_DEPTH_REGID__MASK;
+}
 
 static inline uint32_t REG_A3XX_SP_FS_MRT(uint32_t i0) { return 0x000022f0 + 0x1*i0; }
 
@@ -1914,6 +2029,42 @@ static inline uint32_t A3XX_TPL1_TP_FS_TEX_OFFSET_BASETABLEPTR(uint32_t val)
 
 #define REG_A3XX_VBIF_OUT_AXI_AOOO                             0x0000305f
 
+#define REG_A3XX_VBIF_PERF_CNT_EN                              0x00003070
+#define A3XX_VBIF_PERF_CNT_EN_CNT0                             0x00000001
+#define A3XX_VBIF_PERF_CNT_EN_CNT1                             0x00000002
+#define A3XX_VBIF_PERF_CNT_EN_PWRCNT0                          0x00000004
+#define A3XX_VBIF_PERF_CNT_EN_PWRCNT1                          0x00000008
+#define A3XX_VBIF_PERF_CNT_EN_PWRCNT2                          0x00000010
+
+#define REG_A3XX_VBIF_PERF_CNT_CLR                             0x00003071
+#define A3XX_VBIF_PERF_CNT_CLR_CNT0                            0x00000001
+#define A3XX_VBIF_PERF_CNT_CLR_CNT1                            0x00000002
+#define A3XX_VBIF_PERF_CNT_CLR_PWRCNT0                         0x00000004
+#define A3XX_VBIF_PERF_CNT_CLR_PWRCNT1                         0x00000008
+#define A3XX_VBIF_PERF_CNT_CLR_PWRCNT2                         0x00000010
+
+#define REG_A3XX_VBIF_PERF_CNT_SEL                             0x00003072
+
+#define REG_A3XX_VBIF_PERF_CNT0_LO                             0x00003073
+
+#define REG_A3XX_VBIF_PERF_CNT0_HI                             0x00003074
+
+#define REG_A3XX_VBIF_PERF_CNT1_LO                             0x00003075
+
+#define REG_A3XX_VBIF_PERF_CNT1_HI                             0x00003076
+
+#define REG_A3XX_VBIF_PERF_PWR_CNT0_LO                         0x00003077
+
+#define REG_A3XX_VBIF_PERF_PWR_CNT0_HI                         0x00003078
+
+#define REG_A3XX_VBIF_PERF_PWR_CNT1_LO                         0x00003079
+
+#define REG_A3XX_VBIF_PERF_PWR_CNT1_HI                         0x0000307a
+
+#define REG_A3XX_VBIF_PERF_PWR_CNT2_LO                         0x0000307b
+
+#define REG_A3XX_VBIF_PERF_PWR_CNT2_HI                         0x0000307c
+
 #define REG_A3XX_VSC_BIN_SIZE                                  0x00000c01
 #define A3XX_VSC_BIN_SIZE_WIDTH__MASK                          0x0000001f
 #define A3XX_VSC_BIN_SIZE_WIDTH__SHIFT                         0
@@ -2080,6 +2231,8 @@ static inline uint32_t A3XX_UCHE_CACHE_INVALIDATE1_REG_OPCODE(enum a3xx_cache_op
 }
 #define A3XX_UCHE_CACHE_INVALIDATE1_REG_ENTIRE_CACHE           0x80000000
 
+#define REG_A3XX_UNKNOWN_0EA6                                  0x00000ea6
+
 #define REG_A3XX_SP_PERFCOUNTER0_SELECT                                0x00000ec4
 
 #define REG_A3XX_SP_PERFCOUNTER1_SELECT                                0x00000ec5
@@ -2117,6 +2270,39 @@ static inline uint32_t A3XX_UCHE_CACHE_INVALIDATE1_REG_OPCODE(enum a3xx_cache_op
 #define REG_A3XX_VGT_EVENT_INITIATOR                           0x000021f9
 
 #define REG_A3XX_VGT_DRAW_INITIATOR                            0x000021fc
+#define A3XX_VGT_DRAW_INITIATOR_PRIM_TYPE__MASK                        0x0000003f
+#define A3XX_VGT_DRAW_INITIATOR_PRIM_TYPE__SHIFT               0
+static inline uint32_t A3XX_VGT_DRAW_INITIATOR_PRIM_TYPE(enum pc_di_primtype val)
+{
+       return ((val) << A3XX_VGT_DRAW_INITIATOR_PRIM_TYPE__SHIFT) & A3XX_VGT_DRAW_INITIATOR_PRIM_TYPE__MASK;
+}
+#define A3XX_VGT_DRAW_INITIATOR_SOURCE_SELECT__MASK            0x000000c0
+#define A3XX_VGT_DRAW_INITIATOR_SOURCE_SELECT__SHIFT           6
+static inline uint32_t A3XX_VGT_DRAW_INITIATOR_SOURCE_SELECT(enum pc_di_src_sel val)
+{
+       return ((val) << A3XX_VGT_DRAW_INITIATOR_SOURCE_SELECT__SHIFT) & A3XX_VGT_DRAW_INITIATOR_SOURCE_SELECT__MASK;
+}
+#define A3XX_VGT_DRAW_INITIATOR_VIS_CULL__MASK                 0x00000600
+#define A3XX_VGT_DRAW_INITIATOR_VIS_CULL__SHIFT                        9
+static inline uint32_t A3XX_VGT_DRAW_INITIATOR_VIS_CULL(enum pc_di_vis_cull_mode val)
+{
+       return ((val) << A3XX_VGT_DRAW_INITIATOR_VIS_CULL__SHIFT) & A3XX_VGT_DRAW_INITIATOR_VIS_CULL__MASK;
+}
+#define A3XX_VGT_DRAW_INITIATOR_INDEX_SIZE__MASK               0x00000800
+#define A3XX_VGT_DRAW_INITIATOR_INDEX_SIZE__SHIFT              11
+static inline uint32_t A3XX_VGT_DRAW_INITIATOR_INDEX_SIZE(enum pc_di_index_size val)
+{
+       return ((val) << A3XX_VGT_DRAW_INITIATOR_INDEX_SIZE__SHIFT) & A3XX_VGT_DRAW_INITIATOR_INDEX_SIZE__MASK;
+}
+#define A3XX_VGT_DRAW_INITIATOR_NOT_EOP                                0x00001000
+#define A3XX_VGT_DRAW_INITIATOR_SMALL_INDEX                    0x00002000
+#define A3XX_VGT_DRAW_INITIATOR_PRE_DRAW_INITIATOR_ENABLE      0x00004000
+#define A3XX_VGT_DRAW_INITIATOR_NUM_INDICES__MASK              0xffff0000
+#define A3XX_VGT_DRAW_INITIATOR_NUM_INDICES__SHIFT             16
+static inline uint32_t A3XX_VGT_DRAW_INITIATOR_NUM_INDICES(uint32_t val)
+{
+       return ((val) << A3XX_VGT_DRAW_INITIATOR_NUM_INDICES__SHIFT) & A3XX_VGT_DRAW_INITIATOR_NUM_INDICES__MASK;
+}
 
 #define REG_A3XX_VGT_IMMED_DATA                                        0x000021fd
 
@@ -2152,6 +2338,12 @@ static inline uint32_t A3XX_TEX_SAMP_0_WRAP_R(enum a3xx_tex_clamp val)
 {
        return ((val) << A3XX_TEX_SAMP_0_WRAP_R__SHIFT) & A3XX_TEX_SAMP_0_WRAP_R__MASK;
 }
+#define A3XX_TEX_SAMP_0_COMPARE_FUNC__MASK                     0x00700000
+#define A3XX_TEX_SAMP_0_COMPARE_FUNC__SHIFT                    20
+static inline uint32_t A3XX_TEX_SAMP_0_COMPARE_FUNC(enum adreno_compare_func val)
+{
+       return ((val) << A3XX_TEX_SAMP_0_COMPARE_FUNC__SHIFT) & A3XX_TEX_SAMP_0_COMPARE_FUNC__MASK;
+}
 #define A3XX_TEX_SAMP_0_UNNORM_COORDS                          0x80000000
 
 #define REG_A3XX_TEX_SAMP_1                                    0x00000001
@@ -2170,6 +2362,7 @@ static inline uint32_t A3XX_TEX_SAMP_1_MIN_LOD(float val)
 
 #define REG_A3XX_TEX_CONST_0                                   0x00000000
 #define A3XX_TEX_CONST_0_TILED                                 0x00000001
+#define A3XX_TEX_CONST_0_SRGB                                  0x00000004
 #define A3XX_TEX_CONST_0_SWIZ_X__MASK                          0x00000070
 #define A3XX_TEX_CONST_0_SWIZ_X__SHIFT                         4
 static inline uint32_t A3XX_TEX_CONST_0_SWIZ_X(enum a3xx_tex_swiz val)
@@ -2206,6 +2399,7 @@ static inline uint32_t A3XX_TEX_CONST_0_FMT(enum a3xx_tex_fmt val)
 {
        return ((val) << A3XX_TEX_CONST_0_FMT__SHIFT) & A3XX_TEX_CONST_0_FMT__MASK;
 }
+#define A3XX_TEX_CONST_0_NOCONVERT                             0x20000000
 #define A3XX_TEX_CONST_0_TYPE__MASK                            0xc0000000
 #define A3XX_TEX_CONST_0_TYPE__SHIFT                           30
 static inline uint32_t A3XX_TEX_CONST_0_TYPE(enum a3xx_tex_type val)
index 942e09d898a871b9b533a7dff07db703f29d5c58..2773600c94888c180c76100dd1848ad395bc596a 100644 (file)
@@ -392,13 +392,10 @@ static const unsigned int a3xx_registers[] = {
 #ifdef CONFIG_DEBUG_FS
 static void a3xx_show(struct msm_gpu *gpu, struct seq_file *m)
 {
-       struct drm_device *dev = gpu->dev;
        int i;
 
        adreno_show(gpu, m);
 
-       mutex_lock(&dev->struct_mutex);
-
        gpu->funcs->pm_resume(gpu);
 
        seq_printf(m, "status:   %08x\n",
@@ -418,8 +415,6 @@ static void a3xx_show(struct msm_gpu *gpu, struct seq_file *m)
        }
 
        gpu->funcs->pm_suspend(gpu);
-
-       mutex_unlock(&dev->struct_mutex);
 }
 #endif
 
@@ -685,6 +680,8 @@ static int a3xx_remove(struct platform_device *pdev)
 }
 
 static const struct of_device_id dt_match[] = {
+       { .compatible = "qcom,adreno-3xx" },
+       /* for backwards compat w/ downstream kgsl DT files: */
        { .compatible = "qcom,kgsl-3d0" },
        {}
 };
index bb9a8ca0507b3cdf4a16be9d59383459d6ff4c13..85ff66cbddd60b726d721a7aa8c52dfcaf7fca14 100644 (file)
 #define __A3XX_GPU_H__
 
 #include "adreno_gpu.h"
+
+/* arrg, somehow fb.h is getting pulled in: */
+#undef ROP_COPY
+#undef ROP_XOR
+
 #include "a3xx.xml.h"
 
 struct a3xx_gpu {
index d6e6ce2d1abde84742d02a0e950911fb1a401f8d..9de19ac2e86c7d7e310a4f5e55df37cdcb1d26a3 100644 (file)
@@ -10,13 +10,13 @@ git clone https://github.com/freedreno/envytools.git
 The rules-ng-ng source files this header was generated from are:
 - /home/robclark/src/freedreno/envytools/rnndb/adreno.xml               (    364 bytes, from 2013-11-30 14:47:15)
 - /home/robclark/src/freedreno/envytools/rnndb/freedreno_copyright.xml  (   1453 bytes, from 2013-03-31 16:51:27)
-- /home/robclark/src/freedreno/envytools/rnndb/adreno/a2xx.xml          (  32814 bytes, from 2013-11-30 15:07:33)
-- /home/robclark/src/freedreno/envytools/rnndb/adreno/adreno_common.xml (   8900 bytes, from 2013-10-22 23:57:49)
-- /home/robclark/src/freedreno/envytools/rnndb/adreno/adreno_pm4.xml    (  10574 bytes, from 2013-11-13 05:44:45)
-- /home/robclark/src/freedreno/envytools/rnndb/adreno/a3xx.xml          (  53644 bytes, from 2013-11-30 15:07:33)
-- /home/robclark/src/freedreno/envytools/rnndb/adreno/a4xx.xml          (   8344 bytes, from 2013-11-30 14:49:47)
+- /home/robclark/src/freedreno/envytools/rnndb/adreno/a2xx.xml          (  32901 bytes, from 2014-06-02 15:21:30)
+- /home/robclark/src/freedreno/envytools/rnndb/adreno/adreno_common.xml (   9859 bytes, from 2014-06-02 15:21:30)
+- /home/robclark/src/freedreno/envytools/rnndb/adreno/adreno_pm4.xml    (  14477 bytes, from 2014-05-16 11:51:57)
+- /home/robclark/src/freedreno/envytools/rnndb/adreno/a3xx.xml          (  58020 bytes, from 2014-06-25 12:57:16)
+- /home/robclark/src/freedreno/envytools/rnndb/adreno/a4xx.xml          (  26602 bytes, from 2014-06-25 12:57:16)
 
-Copyright (C) 2013 by the following authors:
+Copyright (C) 2013-2014 by the following authors:
 - Rob Clark <robdclark@gmail.com> (robclark)
 
 Permission is hereby granted, free of charge, to any person obtaining
@@ -87,15 +87,6 @@ enum adreno_rb_blend_factor {
        FACTOR_SRC_ALPHA_SATURATE = 16,
 };
 
-enum adreno_rb_blend_opcode {
-       BLEND_DST_PLUS_SRC = 0,
-       BLEND_SRC_MINUS_DST = 1,
-       BLEND_MIN_DST_SRC = 2,
-       BLEND_MAX_DST_SRC = 3,
-       BLEND_DST_MINUS_SRC = 4,
-       BLEND_DST_PLUS_SRC_BIAS = 5,
-};
-
 enum adreno_rb_surface_endian {
        ENDIAN_NONE = 0,
        ENDIAN_8IN16 = 1,
@@ -116,6 +107,39 @@ enum adreno_rb_depth_format {
        DEPTHX_24_8 = 1,
 };
 
+enum adreno_rb_copy_control_mode {
+       RB_COPY_RESOLVE = 1,
+       RB_COPY_CLEAR = 2,
+       RB_COPY_DEPTH_STENCIL = 5,
+};
+
+enum a3xx_render_mode {
+       RB_RENDERING_PASS = 0,
+       RB_TILING_PASS = 1,
+       RB_RESOLVE_PASS = 2,
+       RB_COMPUTE_PASS = 3,
+};
+
+enum a3xx_msaa_samples {
+       MSAA_ONE = 0,
+       MSAA_TWO = 1,
+       MSAA_FOUR = 2,
+};
+
+enum a3xx_threadmode {
+       MULTI = 0,
+       SINGLE = 1,
+};
+
+enum a3xx_instrbuffermode {
+       BUFFER = 1,
+};
+
+enum a3xx_threadsize {
+       TWO_QUADS = 0,
+       FOUR_QUADS = 1,
+};
+
 #define REG_AXXX_CP_RB_BASE                                    0x000001c0
 
 #define REG_AXXX_CP_RB_CNTL                                    0x000001c1
@@ -264,6 +288,8 @@ static inline uint32_t AXXX_SCRATCH_UMSK_SWAP(uint32_t val)
 #define REG_AXXX_CP_INT_ACK                                    0x000001f4
 
 #define REG_AXXX_CP_ME_CNTL                                    0x000001f6
+#define AXXX_CP_ME_CNTL_BUSY                                   0x20000000
+#define AXXX_CP_ME_CNTL_HALT                                   0x10000000
 
 #define REG_AXXX_CP_ME_STATUS                                  0x000001f7
 
index 28ca8cd8b09ed11766796b1dd12665cde74b8ea3..655ce5b14ad04564a5fb73e72e26b338bb3fb4e3 100644 (file)
@@ -91,9 +91,17 @@ int adreno_get_param(struct msm_gpu *gpu, uint32_t param, uint64_t *value)
 int adreno_hw_init(struct msm_gpu *gpu)
 {
        struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
+       int ret;
 
        DBG("%s", gpu->name);
 
+       ret = msm_gem_get_iova(gpu->rb->bo, gpu->id, &gpu->rb_iova);
+       if (ret) {
+               gpu->rb_iova = 0;
+               dev_err(gpu->dev->dev, "could not map ringbuffer: %d\n", ret);
+               return ret;
+       }
+
        /* Setup REG_CP_RB_CNTL: */
        gpu_write(gpu, REG_AXXX_CP_RB_CNTL,
                        /* size is log2(quad-words): */
@@ -362,8 +370,10 @@ int adreno_gpu_init(struct drm_device *drm, struct platform_device *pdev,
                        return ret;
        }
 
+       mutex_lock(&drm->struct_mutex);
        gpu->memptrs_bo = msm_gem_new(drm, sizeof(*gpu->memptrs),
                        MSM_BO_UNCACHED);
+       mutex_unlock(&drm->struct_mutex);
        if (IS_ERR(gpu->memptrs_bo)) {
                ret = PTR_ERR(gpu->memptrs_bo);
                gpu->memptrs_bo = NULL;
@@ -371,13 +381,13 @@ int adreno_gpu_init(struct drm_device *drm, struct platform_device *pdev,
                return ret;
        }
 
-       gpu->memptrs = msm_gem_vaddr_locked(gpu->memptrs_bo);
+       gpu->memptrs = msm_gem_vaddr(gpu->memptrs_bo);
        if (!gpu->memptrs) {
                dev_err(drm->dev, "could not vmap memptrs\n");
                return -ENOMEM;
        }
 
-       ret = msm_gem_get_iova_locked(gpu->memptrs_bo, gpu->base.id,
+       ret = msm_gem_get_iova(gpu->memptrs_bo, gpu->base.id,
                        &gpu->memptrs_iova);
        if (ret) {
                dev_err(drm->dev, "could not map memptrs: %d\n", ret);
index ae992c71703f1ccc5151b1cf72b904c89e1cd8ec..4eee0ec8f069108a32a94f239db78f2fda50cd9b 100644 (file)
@@ -10,13 +10,13 @@ git clone https://github.com/freedreno/envytools.git
 The rules-ng-ng source files this header was generated from are:
 - /home/robclark/src/freedreno/envytools/rnndb/adreno.xml               (    364 bytes, from 2013-11-30 14:47:15)
 - /home/robclark/src/freedreno/envytools/rnndb/freedreno_copyright.xml  (   1453 bytes, from 2013-03-31 16:51:27)
-- /home/robclark/src/freedreno/envytools/rnndb/adreno/a2xx.xml          (  32814 bytes, from 2013-11-30 15:07:33)
-- /home/robclark/src/freedreno/envytools/rnndb/adreno/adreno_common.xml (   8900 bytes, from 2013-10-22 23:57:49)
-- /home/robclark/src/freedreno/envytools/rnndb/adreno/adreno_pm4.xml    (  10574 bytes, from 2013-11-13 05:44:45)
-- /home/robclark/src/freedreno/envytools/rnndb/adreno/a3xx.xml          (  53644 bytes, from 2013-11-30 15:07:33)
-- /home/robclark/src/freedreno/envytools/rnndb/adreno/a4xx.xml          (   8344 bytes, from 2013-11-30 14:49:47)
+- /home/robclark/src/freedreno/envytools/rnndb/adreno/a2xx.xml          (  32901 bytes, from 2014-06-02 15:21:30)
+- /home/robclark/src/freedreno/envytools/rnndb/adreno/adreno_common.xml (   9859 bytes, from 2014-06-02 15:21:30)
+- /home/robclark/src/freedreno/envytools/rnndb/adreno/adreno_pm4.xml    (  14477 bytes, from 2014-05-16 11:51:57)
+- /home/robclark/src/freedreno/envytools/rnndb/adreno/a3xx.xml          (  58020 bytes, from 2014-06-25 12:57:16)
+- /home/robclark/src/freedreno/envytools/rnndb/adreno/a4xx.xml          (  26602 bytes, from 2014-06-25 12:57:16)
 
-Copyright (C) 2013 by the following authors:
+Copyright (C) 2013-2014 by the following authors:
 - Rob Clark <robdclark@gmail.com> (robclark)
 
 Permission is hereby granted, free of charge, to any person obtaining
@@ -105,6 +105,7 @@ enum pc_di_index_size {
 
 enum pc_di_vis_cull_mode {
        IGNORE_VISIBILITY = 0,
+       USE_VISIBILITY = 1,
 };
 
 enum adreno_pm4_packet_type {
@@ -163,6 +164,11 @@ enum adreno_pm4_type3_packets {
        CP_SET_BIN = 76,
        CP_TEST_TWO_MEMS = 113,
        CP_WAIT_FOR_ME = 19,
+       CP_SET_DRAW_STATE = 67,
+       CP_DRAW_INDX_OFFSET = 56,
+       CP_DRAW_INDIRECT = 40,
+       CP_DRAW_INDX_INDIRECT = 41,
+       CP_DRAW_AUTO = 36,
        IN_IB_PREFETCH_END = 23,
        IN_SUBBLK_PREFETCH = 31,
        IN_INSTR_PREFETCH = 32,
@@ -232,6 +238,211 @@ static inline uint32_t CP_LOAD_STATE_1_EXT_SRC_ADDR(uint32_t val)
        return ((val >> 2) << CP_LOAD_STATE_1_EXT_SRC_ADDR__SHIFT) & CP_LOAD_STATE_1_EXT_SRC_ADDR__MASK;
 }
 
+#define REG_CP_DRAW_INDX_0                                     0x00000000
+#define CP_DRAW_INDX_0_VIZ_QUERY__MASK                         0xffffffff
+#define CP_DRAW_INDX_0_VIZ_QUERY__SHIFT                                0
+static inline uint32_t CP_DRAW_INDX_0_VIZ_QUERY(uint32_t val)
+{
+       return ((val) << CP_DRAW_INDX_0_VIZ_QUERY__SHIFT) & CP_DRAW_INDX_0_VIZ_QUERY__MASK;
+}
+
+#define REG_CP_DRAW_INDX_1                                     0x00000001
+#define CP_DRAW_INDX_1_PRIM_TYPE__MASK                         0x0000003f
+#define CP_DRAW_INDX_1_PRIM_TYPE__SHIFT                                0
+static inline uint32_t CP_DRAW_INDX_1_PRIM_TYPE(enum pc_di_primtype val)
+{
+       return ((val) << CP_DRAW_INDX_1_PRIM_TYPE__SHIFT) & CP_DRAW_INDX_1_PRIM_TYPE__MASK;
+}
+#define CP_DRAW_INDX_1_SOURCE_SELECT__MASK                     0x000000c0
+#define CP_DRAW_INDX_1_SOURCE_SELECT__SHIFT                    6
+static inline uint32_t CP_DRAW_INDX_1_SOURCE_SELECT(enum pc_di_src_sel val)
+{
+       return ((val) << CP_DRAW_INDX_1_SOURCE_SELECT__SHIFT) & CP_DRAW_INDX_1_SOURCE_SELECT__MASK;
+}
+#define CP_DRAW_INDX_1_VIS_CULL__MASK                          0x00000600
+#define CP_DRAW_INDX_1_VIS_CULL__SHIFT                         9
+static inline uint32_t CP_DRAW_INDX_1_VIS_CULL(enum pc_di_vis_cull_mode val)
+{
+       return ((val) << CP_DRAW_INDX_1_VIS_CULL__SHIFT) & CP_DRAW_INDX_1_VIS_CULL__MASK;
+}
+#define CP_DRAW_INDX_1_INDEX_SIZE__MASK                                0x00000800
+#define CP_DRAW_INDX_1_INDEX_SIZE__SHIFT                       11
+static inline uint32_t CP_DRAW_INDX_1_INDEX_SIZE(enum pc_di_index_size val)
+{
+       return ((val) << CP_DRAW_INDX_1_INDEX_SIZE__SHIFT) & CP_DRAW_INDX_1_INDEX_SIZE__MASK;
+}
+#define CP_DRAW_INDX_1_NOT_EOP                                 0x00001000
+#define CP_DRAW_INDX_1_SMALL_INDEX                             0x00002000
+#define CP_DRAW_INDX_1_PRE_DRAW_INITIATOR_ENABLE               0x00004000
+#define CP_DRAW_INDX_1_NUM_INDICES__MASK                       0xffff0000
+#define CP_DRAW_INDX_1_NUM_INDICES__SHIFT                      16
+static inline uint32_t CP_DRAW_INDX_1_NUM_INDICES(uint32_t val)
+{
+       return ((val) << CP_DRAW_INDX_1_NUM_INDICES__SHIFT) & CP_DRAW_INDX_1_NUM_INDICES__MASK;
+}
+
+#define REG_CP_DRAW_INDX_2                                     0x00000002
+#define CP_DRAW_INDX_2_NUM_INDICES__MASK                       0xffffffff
+#define CP_DRAW_INDX_2_NUM_INDICES__SHIFT                      0
+static inline uint32_t CP_DRAW_INDX_2_NUM_INDICES(uint32_t val)
+{
+       return ((val) << CP_DRAW_INDX_2_NUM_INDICES__SHIFT) & CP_DRAW_INDX_2_NUM_INDICES__MASK;
+}
+
+#define REG_CP_DRAW_INDX_2                                     0x00000002
+#define CP_DRAW_INDX_2_INDX_BASE__MASK                         0xffffffff
+#define CP_DRAW_INDX_2_INDX_BASE__SHIFT                                0
+static inline uint32_t CP_DRAW_INDX_2_INDX_BASE(uint32_t val)
+{
+       return ((val) << CP_DRAW_INDX_2_INDX_BASE__SHIFT) & CP_DRAW_INDX_2_INDX_BASE__MASK;
+}
+
+#define REG_CP_DRAW_INDX_2                                     0x00000002
+#define CP_DRAW_INDX_2_INDX_SIZE__MASK                         0xffffffff
+#define CP_DRAW_INDX_2_INDX_SIZE__SHIFT                                0
+static inline uint32_t CP_DRAW_INDX_2_INDX_SIZE(uint32_t val)
+{
+       return ((val) << CP_DRAW_INDX_2_INDX_SIZE__SHIFT) & CP_DRAW_INDX_2_INDX_SIZE__MASK;
+}
+
+#define REG_CP_DRAW_INDX_2_0                                   0x00000000
+#define CP_DRAW_INDX_2_0_VIZ_QUERY__MASK                       0xffffffff
+#define CP_DRAW_INDX_2_0_VIZ_QUERY__SHIFT                      0
+static inline uint32_t CP_DRAW_INDX_2_0_VIZ_QUERY(uint32_t val)
+{
+       return ((val) << CP_DRAW_INDX_2_0_VIZ_QUERY__SHIFT) & CP_DRAW_INDX_2_0_VIZ_QUERY__MASK;
+}
+
+#define REG_CP_DRAW_INDX_2_1                                   0x00000001
+#define CP_DRAW_INDX_2_1_PRIM_TYPE__MASK                       0x0000003f
+#define CP_DRAW_INDX_2_1_PRIM_TYPE__SHIFT                      0
+static inline uint32_t CP_DRAW_INDX_2_1_PRIM_TYPE(enum pc_di_primtype val)
+{
+       return ((val) << CP_DRAW_INDX_2_1_PRIM_TYPE__SHIFT) & CP_DRAW_INDX_2_1_PRIM_TYPE__MASK;
+}
+#define CP_DRAW_INDX_2_1_SOURCE_SELECT__MASK                   0x000000c0
+#define CP_DRAW_INDX_2_1_SOURCE_SELECT__SHIFT                  6
+static inline uint32_t CP_DRAW_INDX_2_1_SOURCE_SELECT(enum pc_di_src_sel val)
+{
+       return ((val) << CP_DRAW_INDX_2_1_SOURCE_SELECT__SHIFT) & CP_DRAW_INDX_2_1_SOURCE_SELECT__MASK;
+}
+#define CP_DRAW_INDX_2_1_VIS_CULL__MASK                                0x00000600
+#define CP_DRAW_INDX_2_1_VIS_CULL__SHIFT                       9
+static inline uint32_t CP_DRAW_INDX_2_1_VIS_CULL(enum pc_di_vis_cull_mode val)
+{
+       return ((val) << CP_DRAW_INDX_2_1_VIS_CULL__SHIFT) & CP_DRAW_INDX_2_1_VIS_CULL__MASK;
+}
+#define CP_DRAW_INDX_2_1_INDEX_SIZE__MASK                      0x00000800
+#define CP_DRAW_INDX_2_1_INDEX_SIZE__SHIFT                     11
+static inline uint32_t CP_DRAW_INDX_2_1_INDEX_SIZE(enum pc_di_index_size val)
+{
+       return ((val) << CP_DRAW_INDX_2_1_INDEX_SIZE__SHIFT) & CP_DRAW_INDX_2_1_INDEX_SIZE__MASK;
+}
+#define CP_DRAW_INDX_2_1_NOT_EOP                               0x00001000
+#define CP_DRAW_INDX_2_1_SMALL_INDEX                           0x00002000
+#define CP_DRAW_INDX_2_1_PRE_DRAW_INITIATOR_ENABLE             0x00004000
+#define CP_DRAW_INDX_2_1_NUM_INDICES__MASK                     0xffff0000
+#define CP_DRAW_INDX_2_1_NUM_INDICES__SHIFT                    16
+static inline uint32_t CP_DRAW_INDX_2_1_NUM_INDICES(uint32_t val)
+{
+       return ((val) << CP_DRAW_INDX_2_1_NUM_INDICES__SHIFT) & CP_DRAW_INDX_2_1_NUM_INDICES__MASK;
+}
+
+#define REG_CP_DRAW_INDX_2_2                                   0x00000002
+#define CP_DRAW_INDX_2_2_NUM_INDICES__MASK                     0xffffffff
+#define CP_DRAW_INDX_2_2_NUM_INDICES__SHIFT                    0
+static inline uint32_t CP_DRAW_INDX_2_2_NUM_INDICES(uint32_t val)
+{
+       return ((val) << CP_DRAW_INDX_2_2_NUM_INDICES__SHIFT) & CP_DRAW_INDX_2_2_NUM_INDICES__MASK;
+}
+
+#define REG_CP_DRAW_INDX_OFFSET_0                              0x00000000
+#define CP_DRAW_INDX_OFFSET_0_PRIM_TYPE__MASK                  0x0000003f
+#define CP_DRAW_INDX_OFFSET_0_PRIM_TYPE__SHIFT                 0
+static inline uint32_t CP_DRAW_INDX_OFFSET_0_PRIM_TYPE(enum pc_di_primtype val)
+{
+       return ((val) << CP_DRAW_INDX_OFFSET_0_PRIM_TYPE__SHIFT) & CP_DRAW_INDX_OFFSET_0_PRIM_TYPE__MASK;
+}
+#define CP_DRAW_INDX_OFFSET_0_SOURCE_SELECT__MASK              0x000000c0
+#define CP_DRAW_INDX_OFFSET_0_SOURCE_SELECT__SHIFT             6
+static inline uint32_t CP_DRAW_INDX_OFFSET_0_SOURCE_SELECT(enum pc_di_src_sel val)
+{
+       return ((val) << CP_DRAW_INDX_OFFSET_0_SOURCE_SELECT__SHIFT) & CP_DRAW_INDX_OFFSET_0_SOURCE_SELECT__MASK;
+}
+#define CP_DRAW_INDX_OFFSET_0_VIS_CULL__MASK                   0x00000700
+#define CP_DRAW_INDX_OFFSET_0_VIS_CULL__SHIFT                  8
+static inline uint32_t CP_DRAW_INDX_OFFSET_0_VIS_CULL(enum pc_di_vis_cull_mode val)
+{
+       return ((val) << CP_DRAW_INDX_OFFSET_0_VIS_CULL__SHIFT) & CP_DRAW_INDX_OFFSET_0_VIS_CULL__MASK;
+}
+#define CP_DRAW_INDX_OFFSET_0_INDEX_SIZE__MASK                 0x00000800
+#define CP_DRAW_INDX_OFFSET_0_INDEX_SIZE__SHIFT                        11
+static inline uint32_t CP_DRAW_INDX_OFFSET_0_INDEX_SIZE(enum pc_di_index_size val)
+{
+       return ((val) << CP_DRAW_INDX_OFFSET_0_INDEX_SIZE__SHIFT) & CP_DRAW_INDX_OFFSET_0_INDEX_SIZE__MASK;
+}
+#define CP_DRAW_INDX_OFFSET_0_NOT_EOP                          0x00001000
+#define CP_DRAW_INDX_OFFSET_0_SMALL_INDEX                      0x00002000
+#define CP_DRAW_INDX_OFFSET_0_PRE_DRAW_INITIATOR_ENABLE                0x00004000
+#define CP_DRAW_INDX_OFFSET_0_NUM_INDICES__MASK                        0xffff0000
+#define CP_DRAW_INDX_OFFSET_0_NUM_INDICES__SHIFT               16
+static inline uint32_t CP_DRAW_INDX_OFFSET_0_NUM_INDICES(uint32_t val)
+{
+       return ((val) << CP_DRAW_INDX_OFFSET_0_NUM_INDICES__SHIFT) & CP_DRAW_INDX_OFFSET_0_NUM_INDICES__MASK;
+}
+
+#define REG_CP_DRAW_INDX_OFFSET_1                              0x00000001
+
+#define REG_CP_DRAW_INDX_OFFSET_2                              0x00000002
+#define CP_DRAW_INDX_OFFSET_2_NUM_INDICES__MASK                        0xffffffff
+#define CP_DRAW_INDX_OFFSET_2_NUM_INDICES__SHIFT               0
+static inline uint32_t CP_DRAW_INDX_OFFSET_2_NUM_INDICES(uint32_t val)
+{
+       return ((val) << CP_DRAW_INDX_OFFSET_2_NUM_INDICES__SHIFT) & CP_DRAW_INDX_OFFSET_2_NUM_INDICES__MASK;
+}
+
+#define REG_CP_DRAW_INDX_OFFSET_2                              0x00000002
+#define CP_DRAW_INDX_OFFSET_2_INDX_BASE__MASK                  0xffffffff
+#define CP_DRAW_INDX_OFFSET_2_INDX_BASE__SHIFT                 0
+static inline uint32_t CP_DRAW_INDX_OFFSET_2_INDX_BASE(uint32_t val)
+{
+       return ((val) << CP_DRAW_INDX_OFFSET_2_INDX_BASE__SHIFT) & CP_DRAW_INDX_OFFSET_2_INDX_BASE__MASK;
+}
+
+#define REG_CP_DRAW_INDX_OFFSET_2                              0x00000002
+#define CP_DRAW_INDX_OFFSET_2_INDX_SIZE__MASK                  0xffffffff
+#define CP_DRAW_INDX_OFFSET_2_INDX_SIZE__SHIFT                 0
+static inline uint32_t CP_DRAW_INDX_OFFSET_2_INDX_SIZE(uint32_t val)
+{
+       return ((val) << CP_DRAW_INDX_OFFSET_2_INDX_SIZE__SHIFT) & CP_DRAW_INDX_OFFSET_2_INDX_SIZE__MASK;
+}
+
+#define REG_CP_SET_DRAW_STATE_0                                        0x00000000
+#define CP_SET_DRAW_STATE_0_COUNT__MASK                                0x0000ffff
+#define CP_SET_DRAW_STATE_0_COUNT__SHIFT                       0
+static inline uint32_t CP_SET_DRAW_STATE_0_COUNT(uint32_t val)
+{
+       return ((val) << CP_SET_DRAW_STATE_0_COUNT__SHIFT) & CP_SET_DRAW_STATE_0_COUNT__MASK;
+}
+#define CP_SET_DRAW_STATE_0_DIRTY                              0x00010000
+#define CP_SET_DRAW_STATE_0_DISABLE                            0x00020000
+#define CP_SET_DRAW_STATE_0_DISABLE_ALL_GROUPS                 0x00040000
+#define CP_SET_DRAW_STATE_0_LOAD_IMMED                         0x00080000
+#define CP_SET_DRAW_STATE_0_GROUP_ID__MASK                     0x1f000000
+#define CP_SET_DRAW_STATE_0_GROUP_ID__SHIFT                    24
+static inline uint32_t CP_SET_DRAW_STATE_0_GROUP_ID(uint32_t val)
+{
+       return ((val) << CP_SET_DRAW_STATE_0_GROUP_ID__SHIFT) & CP_SET_DRAW_STATE_0_GROUP_ID__MASK;
+}
+
+#define REG_CP_SET_DRAW_STATE_1                                        0x00000001
+#define CP_SET_DRAW_STATE_1_ADDR__MASK                         0xffffffff
+#define CP_SET_DRAW_STATE_1_ADDR__SHIFT                                0
+static inline uint32_t CP_SET_DRAW_STATE_1_ADDR(uint32_t val)
+{
+       return ((val) << CP_SET_DRAW_STATE_1_ADDR__SHIFT) & CP_SET_DRAW_STATE_1_ADDR__MASK;
+}
+
 #define REG_CP_SET_BIN_0                                       0x00000000
 
 #define REG_CP_SET_BIN_1                                       0x00000001
@@ -262,5 +473,21 @@ static inline uint32_t CP_SET_BIN_2_Y2(uint32_t val)
        return ((val) << CP_SET_BIN_2_Y2__SHIFT) & CP_SET_BIN_2_Y2__MASK;
 }
 
+#define REG_CP_SET_BIN_DATA_0                                  0x00000000
+#define CP_SET_BIN_DATA_0_BIN_DATA_ADDR__MASK                  0xffffffff
+#define CP_SET_BIN_DATA_0_BIN_DATA_ADDR__SHIFT                 0
+static inline uint32_t CP_SET_BIN_DATA_0_BIN_DATA_ADDR(uint32_t val)
+{
+       return ((val) << CP_SET_BIN_DATA_0_BIN_DATA_ADDR__SHIFT) & CP_SET_BIN_DATA_0_BIN_DATA_ADDR__MASK;
+}
+
+#define REG_CP_SET_BIN_DATA_1                                  0x00000001
+#define CP_SET_BIN_DATA_1_BIN_SIZE_ADDRESS__MASK               0xffffffff
+#define CP_SET_BIN_DATA_1_BIN_SIZE_ADDRESS__SHIFT              0
+static inline uint32_t CP_SET_BIN_DATA_1_BIN_SIZE_ADDRESS(uint32_t val)
+{
+       return ((val) << CP_SET_BIN_DATA_1_BIN_SIZE_ADDRESS__SHIFT) & CP_SET_BIN_DATA_1_BIN_SIZE_ADDRESS__MASK;
+}
+
 
 #endif /* ADRENO_PM4_XML */
index 87be647e3825f0ad96491f5df5b8cf271158f848..0f1f5b9459a51de71dad5b75fbcede35762432f5 100644 (file)
@@ -12,12 +12,12 @@ The rules-ng-ng source files this header was generated from are:
 - /home/robclark/src/freedreno/envytools/rnndb/freedreno_copyright.xml (   1453 bytes, from 2013-03-31 16:51:27)
 - /home/robclark/src/freedreno/envytools/rnndb/mdp/mdp4.xml            (  17996 bytes, from 2013-12-01 19:10:31)
 - /home/robclark/src/freedreno/envytools/rnndb/mdp/mdp_common.xml      (   1615 bytes, from 2013-11-30 15:00:52)
-- /home/robclark/src/freedreno/envytools/rnndb/mdp/mdp5.xml            (  22517 bytes, from 2013-12-03 20:59:13)
+- /home/robclark/src/freedreno/envytools/rnndb/mdp/mdp5.xml            (  22517 bytes, from 2014-06-25 12:55:02)
 - /home/robclark/src/freedreno/envytools/rnndb/dsi/dsi.xml             (  11712 bytes, from 2013-08-17 17:13:43)
 - /home/robclark/src/freedreno/envytools/rnndb/dsi/sfpb.xml            (    344 bytes, from 2013-08-11 19:26:32)
 - /home/robclark/src/freedreno/envytools/rnndb/dsi/mmss_cc.xml         (   1544 bytes, from 2013-08-16 19:17:05)
 - /home/robclark/src/freedreno/envytools/rnndb/hdmi/qfprom.xml         (    600 bytes, from 2013-07-05 19:21:12)
-- /home/robclark/src/freedreno/envytools/rnndb/hdmi/hdmi.xml           (  20932 bytes, from 2013-12-01 15:13:04)
+- /home/robclark/src/freedreno/envytools/rnndb/hdmi/hdmi.xml           (  23613 bytes, from 2014-06-25 12:53:44)
 
 Copyright (C) 2013 by the following authors:
 - Rob Clark <robdclark@gmail.com> (robclark)
index 747a6ef4211f71748e759343213ce7ecdc5fb335..d468f86f637cece324dc46299bbe19022cbb484f 100644 (file)
@@ -12,12 +12,12 @@ The rules-ng-ng source files this header was generated from are:
 - /home/robclark/src/freedreno/envytools/rnndb/freedreno_copyright.xml (   1453 bytes, from 2013-03-31 16:51:27)
 - /home/robclark/src/freedreno/envytools/rnndb/mdp/mdp4.xml            (  17996 bytes, from 2013-12-01 19:10:31)
 - /home/robclark/src/freedreno/envytools/rnndb/mdp/mdp_common.xml      (   1615 bytes, from 2013-11-30 15:00:52)
-- /home/robclark/src/freedreno/envytools/rnndb/mdp/mdp5.xml            (  22517 bytes, from 2013-12-03 20:59:13)
+- /home/robclark/src/freedreno/envytools/rnndb/mdp/mdp5.xml            (  22517 bytes, from 2014-06-25 12:55:02)
 - /home/robclark/src/freedreno/envytools/rnndb/dsi/dsi.xml             (  11712 bytes, from 2013-08-17 17:13:43)
 - /home/robclark/src/freedreno/envytools/rnndb/dsi/sfpb.xml            (    344 bytes, from 2013-08-11 19:26:32)
 - /home/robclark/src/freedreno/envytools/rnndb/dsi/mmss_cc.xml         (   1544 bytes, from 2013-08-16 19:17:05)
 - /home/robclark/src/freedreno/envytools/rnndb/hdmi/qfprom.xml         (    600 bytes, from 2013-07-05 19:21:12)
-- /home/robclark/src/freedreno/envytools/rnndb/hdmi/hdmi.xml           (  20932 bytes, from 2013-12-01 15:13:04)
+- /home/robclark/src/freedreno/envytools/rnndb/hdmi/hdmi.xml           (  23613 bytes, from 2014-06-25 12:53:44)
 
 Copyright (C) 2013 by the following authors:
 - Rob Clark <robdclark@gmail.com> (robclark)
index 48e03acf19bf5bdf61659c96acd4444e6c716c73..da8740054cdf264bef41396db1e8ca09964bf6bc 100644 (file)
@@ -12,12 +12,12 @@ The rules-ng-ng source files this header was generated from are:
 - /home/robclark/src/freedreno/envytools/rnndb/freedreno_copyright.xml (   1453 bytes, from 2013-03-31 16:51:27)
 - /home/robclark/src/freedreno/envytools/rnndb/mdp/mdp4.xml            (  17996 bytes, from 2013-12-01 19:10:31)
 - /home/robclark/src/freedreno/envytools/rnndb/mdp/mdp_common.xml      (   1615 bytes, from 2013-11-30 15:00:52)
-- /home/robclark/src/freedreno/envytools/rnndb/mdp/mdp5.xml            (  22517 bytes, from 2013-12-03 20:59:13)
+- /home/robclark/src/freedreno/envytools/rnndb/mdp/mdp5.xml            (  22517 bytes, from 2014-06-25 12:55:02)
 - /home/robclark/src/freedreno/envytools/rnndb/dsi/dsi.xml             (  11712 bytes, from 2013-08-17 17:13:43)
 - /home/robclark/src/freedreno/envytools/rnndb/dsi/sfpb.xml            (    344 bytes, from 2013-08-11 19:26:32)
 - /home/robclark/src/freedreno/envytools/rnndb/dsi/mmss_cc.xml         (   1544 bytes, from 2013-08-16 19:17:05)
 - /home/robclark/src/freedreno/envytools/rnndb/hdmi/qfprom.xml         (    600 bytes, from 2013-07-05 19:21:12)
-- /home/robclark/src/freedreno/envytools/rnndb/hdmi/hdmi.xml           (  20932 bytes, from 2013-12-01 15:13:04)
+- /home/robclark/src/freedreno/envytools/rnndb/hdmi/hdmi.xml           (  23613 bytes, from 2014-06-25 12:53:44)
 
 Copyright (C) 2013 by the following authors:
 - Rob Clark <robdclark@gmail.com> (robclark)
index 7f7aadef8a8258101a63e57a14ed09b7ecc09893..a125a7e32742c3707bb3e0446a4fdd8f64fffd3e 100644 (file)
@@ -123,7 +123,8 @@ struct hdmi *hdmi_init(struct drm_device *dev, struct drm_encoder *encoder)
        for (i = 0; i < config->hpd_reg_cnt; i++) {
                struct regulator *reg;
 
-               reg = devm_regulator_get(&pdev->dev, config->hpd_reg_names[i]);
+               reg = devm_regulator_get_exclusive(&pdev->dev,
+                               config->hpd_reg_names[i]);
                if (IS_ERR(reg)) {
                        ret = PTR_ERR(reg);
                        dev_err(dev->dev, "failed to get hpd regulator: %s (%d)\n",
@@ -138,7 +139,8 @@ struct hdmi *hdmi_init(struct drm_device *dev, struct drm_encoder *encoder)
        for (i = 0; i < config->pwr_reg_cnt; i++) {
                struct regulator *reg;
 
-               reg = devm_regulator_get(&pdev->dev, config->pwr_reg_names[i]);
+               reg = devm_regulator_get_exclusive(&pdev->dev,
+                               config->pwr_reg_names[i]);
                if (IS_ERR(reg)) {
                        ret = PTR_ERR(reg);
                        dev_err(dev->dev, "failed to get pwr regulator: %s (%d)\n",
@@ -266,37 +268,56 @@ static int hdmi_bind(struct device *dev, struct device *master, void *data)
        {
                int gpio = of_get_named_gpio(of_node, name, 0);
                if (gpio < 0) {
-                       dev_err(dev, "failed to get gpio: %s (%d)\n",
-                                       name, gpio);
-                       gpio = -1;
+                       char name2[32];
+                       snprintf(name2, sizeof(name2), "%s-gpio", name);
+                       gpio = of_get_named_gpio(of_node, name2, 0);
+                       if (gpio < 0) {
+                               dev_err(dev, "failed to get gpio: %s (%d)\n",
+                                               name, gpio);
+                               gpio = -1;
+                       }
                }
                return gpio;
        }
 
-       /* TODO actually use DT.. */
-       static const char *hpd_reg_names[] = {"hpd-gdsc", "hpd-5v"};
-       static const char *pwr_reg_names[] = {"core-vdda", "core-vcc"};
-       static const char *hpd_clk_names[] = {"iface_clk", "core_clk", "mdp_core_clk"};
-       static unsigned long hpd_clk_freq[] = {0, 19200000, 0};
-       static const char *pwr_clk_names[] = {"extp_clk", "alt_iface_clk"};
+       if (of_device_is_compatible(of_node, "qcom,hdmi-tx-8074")) {
+               static const char *hpd_reg_names[] = {"hpd-gdsc", "hpd-5v"};
+               static const char *pwr_reg_names[] = {"core-vdda", "core-vcc"};
+               static const char *hpd_clk_names[] = {"iface_clk", "core_clk", "mdp_core_clk"};
+               static unsigned long hpd_clk_freq[] = {0, 19200000, 0};
+               static const char *pwr_clk_names[] = {"extp_clk", "alt_iface_clk"};
+               config.phy_init      = hdmi_phy_8x74_init;
+               config.hpd_reg_names = hpd_reg_names;
+               config.hpd_reg_cnt   = ARRAY_SIZE(hpd_reg_names);
+               config.pwr_reg_names = pwr_reg_names;
+               config.pwr_reg_cnt   = ARRAY_SIZE(pwr_reg_names);
+               config.hpd_clk_names = hpd_clk_names;
+               config.hpd_freq      = hpd_clk_freq;
+               config.hpd_clk_cnt   = ARRAY_SIZE(hpd_clk_names);
+               config.pwr_clk_names = pwr_clk_names;
+               config.pwr_clk_cnt   = ARRAY_SIZE(pwr_clk_names);
+               config.shared_irq    = true;
+       } else if (of_device_is_compatible(of_node, "qcom,hdmi-tx-8960")) {
+               static const char *hpd_clk_names[] = {"core_clk", "master_iface_clk", "slave_iface_clk"};
+               static const char *hpd_reg_names[] = {"core-vdda", "hdmi-mux"};
+               config.phy_init      = hdmi_phy_8960_init;
+               config.hpd_reg_names = hpd_reg_names;
+               config.hpd_reg_cnt   = ARRAY_SIZE(hpd_reg_names);
+               config.hpd_clk_names = hpd_clk_names;
+               config.hpd_clk_cnt   = ARRAY_SIZE(hpd_clk_names);
+       } else if (of_device_is_compatible(of_node, "qcom,hdmi-tx-8660")) {
+               config.phy_init      = hdmi_phy_8x60_init;
+       } else {
+               dev_err(dev, "unknown phy: %s\n", of_node->name);
+       }
 
-       config.phy_init      = hdmi_phy_8x74_init;
        config.mmio_name     = "core_physical";
-       config.hpd_reg_names = hpd_reg_names;
-       config.hpd_reg_cnt   = ARRAY_SIZE(hpd_reg_names);
-       config.pwr_reg_names = pwr_reg_names;
-       config.pwr_reg_cnt   = ARRAY_SIZE(pwr_reg_names);
-       config.hpd_clk_names = hpd_clk_names;
-       config.hpd_freq      = hpd_clk_freq;
-       config.hpd_clk_cnt   = ARRAY_SIZE(hpd_clk_names);
-       config.pwr_clk_names = pwr_clk_names;
-       config.pwr_clk_cnt   = ARRAY_SIZE(pwr_clk_names);
        config.ddc_clk_gpio  = get_gpio("qcom,hdmi-tx-ddc-clk");
        config.ddc_data_gpio = get_gpio("qcom,hdmi-tx-ddc-data");
        config.hpd_gpio      = get_gpio("qcom,hdmi-tx-hpd");
        config.mux_en_gpio   = get_gpio("qcom,hdmi-tx-mux-en");
        config.mux_sel_gpio  = get_gpio("qcom,hdmi-tx-mux-sel");
-       config.shared_irq    = true;
+       config.mux_lpm_gpio  = get_gpio("qcom,hdmi-tx-mux-lpm");
 
 #else
        static const char *hpd_clk_names[] = {
@@ -373,7 +394,9 @@ static int hdmi_dev_remove(struct platform_device *pdev)
 }
 
 static const struct of_device_id dt_match[] = {
-       { .compatible = "qcom,hdmi-tx" },
+       { .compatible = "qcom,hdmi-tx-8074" },
+       { .compatible = "qcom,hdmi-tx-8960" },
+       { .compatible = "qcom,hdmi-tx-8660" },
        {}
 };
 
index 9d7723c6528a646eef133d490ba1b21d82e8a696..b981995410b50a886e21f74e38589d6af415f950 100644 (file)
@@ -96,6 +96,7 @@ struct hdmi_platform_config {
 
        /* gpio's: */
        int ddc_clk_gpio, ddc_data_gpio, hpd_gpio, mux_en_gpio, mux_sel_gpio;
+       int mux_lpm_gpio;
 
        /* older devices had their own irq, mdp5+ it is shared w/ mdp: */
        bool shared_irq;
index e2636582cfd753bc2443659ee615db428530e2dc..e89fe053d375763b3252f3d6fba8e1fcad90d8f7 100644 (file)
@@ -12,14 +12,14 @@ The rules-ng-ng source files this header was generated from are:
 - /home/robclark/src/freedreno/envytools/rnndb/freedreno_copyright.xml (   1453 bytes, from 2013-03-31 16:51:27)
 - /home/robclark/src/freedreno/envytools/rnndb/mdp/mdp4.xml            (  17996 bytes, from 2013-12-01 19:10:31)
 - /home/robclark/src/freedreno/envytools/rnndb/mdp/mdp_common.xml      (   1615 bytes, from 2013-11-30 15:00:52)
-- /home/robclark/src/freedreno/envytools/rnndb/mdp/mdp5.xml            (  22517 bytes, from 2013-12-03 20:59:13)
+- /home/robclark/src/freedreno/envytools/rnndb/mdp/mdp5.xml            (  22517 bytes, from 2014-06-25 12:55:02)
 - /home/robclark/src/freedreno/envytools/rnndb/dsi/dsi.xml             (  11712 bytes, from 2013-08-17 17:13:43)
 - /home/robclark/src/freedreno/envytools/rnndb/dsi/sfpb.xml            (    344 bytes, from 2013-08-11 19:26:32)
 - /home/robclark/src/freedreno/envytools/rnndb/dsi/mmss_cc.xml         (   1544 bytes, from 2013-08-16 19:17:05)
 - /home/robclark/src/freedreno/envytools/rnndb/hdmi/qfprom.xml         (    600 bytes, from 2013-07-05 19:21:12)
-- /home/robclark/src/freedreno/envytools/rnndb/hdmi/hdmi.xml           (  20932 bytes, from 2013-12-01 15:13:04)
+- /home/robclark/src/freedreno/envytools/rnndb/hdmi/hdmi.xml           (  23613 bytes, from 2014-06-25 12:53:44)
 
-Copyright (C) 2013 by the following authors:
+Copyright (C) 2013-2014 by the following authors:
 - Rob Clark <robdclark@gmail.com> (robclark)
 
 Permission is hereby granted, free of charge, to any person obtaining
@@ -148,9 +148,9 @@ static inline uint32_t REG_HDMI_GENERIC0(uint32_t i0) { return 0x00000088 + 0x4*
 
 static inline uint32_t REG_HDMI_GENERIC1(uint32_t i0) { return 0x000000a8 + 0x4*i0; }
 
-static inline uint32_t REG_HDMI_ACR(uint32_t i0) { return 0x000000c4 + 0x8*i0; }
+static inline uint32_t REG_HDMI_ACR(enum hdmi_acr_cts i0) { return 0x000000c4 + 0x8*i0; }
 
-static inline uint32_t REG_HDMI_ACR_0(uint32_t i0) { return 0x000000c4 + 0x8*i0; }
+static inline uint32_t REG_HDMI_ACR_0(enum hdmi_acr_cts i0) { return 0x000000c4 + 0x8*i0; }
 #define HDMI_ACR_0_CTS__MASK                                   0xfffff000
 #define HDMI_ACR_0_CTS__SHIFT                                  12
 static inline uint32_t HDMI_ACR_0_CTS(uint32_t val)
@@ -158,7 +158,7 @@ static inline uint32_t HDMI_ACR_0_CTS(uint32_t val)
        return ((val) << HDMI_ACR_0_CTS__SHIFT) & HDMI_ACR_0_CTS__MASK;
 }
 
-static inline uint32_t REG_HDMI_ACR_1(uint32_t i0) { return 0x000000c8 + 0x8*i0; }
+static inline uint32_t REG_HDMI_ACR_1(enum hdmi_acr_cts i0) { return 0x000000c8 + 0x8*i0; }
 #define HDMI_ACR_1_N__MASK                                     0xffffffff
 #define HDMI_ACR_1_N__SHIFT                                    0
 static inline uint32_t HDMI_ACR_1_N(uint32_t val)
@@ -552,6 +552,103 @@ static inline uint32_t HDMI_8x60_PHY_REG1_OUTVOL_SWING_CTRL(uint32_t val)
 #define REG_HDMI_8960_PHY_REG11                                        0x0000042c
 
 #define REG_HDMI_8960_PHY_REG12                                        0x00000430
+#define HDMI_8960_PHY_REG12_SW_RESET                           0x00000020
+#define HDMI_8960_PHY_REG12_PWRDN_B                            0x00000080
+
+#define REG_HDMI_8960_PHY_REG_BIST_CFG                         0x00000434
+
+#define REG_HDMI_8960_PHY_DEBUG_BUS_SEL                                0x00000438
+
+#define REG_HDMI_8960_PHY_REG_MISC0                            0x0000043c
+
+#define REG_HDMI_8960_PHY_REG13                                        0x00000440
+
+#define REG_HDMI_8960_PHY_REG14                                        0x00000444
+
+#define REG_HDMI_8960_PHY_REG15                                        0x00000448
+
+#define REG_HDMI_8960_PHY_PLL_REFCLK_CFG                       0x00000500
+
+#define REG_HDMI_8960_PHY_PLL_CHRG_PUMP_CFG                    0x00000504
+
+#define REG_HDMI_8960_PHY_PLL_LOOP_FLT_CFG0                    0x00000508
+
+#define REG_HDMI_8960_PHY_PLL_LOOP_FLT_CFG1                    0x0000050c
+
+#define REG_HDMI_8960_PHY_PLL_IDAC_ADJ_CFG                     0x00000510
+
+#define REG_HDMI_8960_PHY_PLL_I_VI_KVCO_CFG                    0x00000514
+
+#define REG_HDMI_8960_PHY_PLL_PWRDN_B                          0x00000518
+#define HDMI_8960_PHY_PLL_PWRDN_B_PD_PLL                       0x00000002
+#define HDMI_8960_PHY_PLL_PWRDN_B_PLL_PWRDN_B                  0x00000008
+
+#define REG_HDMI_8960_PHY_PLL_SDM_CFG0                         0x0000051c
+
+#define REG_HDMI_8960_PHY_PLL_SDM_CFG1                         0x00000520
+
+#define REG_HDMI_8960_PHY_PLL_SDM_CFG2                         0x00000524
+
+#define REG_HDMI_8960_PHY_PLL_SDM_CFG3                         0x00000528
+
+#define REG_HDMI_8960_PHY_PLL_SDM_CFG4                         0x0000052c
+
+#define REG_HDMI_8960_PHY_PLL_SSC_CFG0                         0x00000530
+
+#define REG_HDMI_8960_PHY_PLL_SSC_CFG1                         0x00000534
+
+#define REG_HDMI_8960_PHY_PLL_SSC_CFG2                         0x00000538
+
+#define REG_HDMI_8960_PHY_PLL_SSC_CFG3                         0x0000053c
+
+#define REG_HDMI_8960_PHY_PLL_LOCKDET_CFG0                     0x00000540
+
+#define REG_HDMI_8960_PHY_PLL_LOCKDET_CFG1                     0x00000544
+
+#define REG_HDMI_8960_PHY_PLL_LOCKDET_CFG2                     0x00000548
+
+#define REG_HDMI_8960_PHY_PLL_VCOCAL_CFG0                      0x0000054c
+
+#define REG_HDMI_8960_PHY_PLL_VCOCAL_CFG1                      0x00000550
+
+#define REG_HDMI_8960_PHY_PLL_VCOCAL_CFG2                      0x00000554
+
+#define REG_HDMI_8960_PHY_PLL_VCOCAL_CFG3                      0x00000558
+
+#define REG_HDMI_8960_PHY_PLL_VCOCAL_CFG4                      0x0000055c
+
+#define REG_HDMI_8960_PHY_PLL_VCOCAL_CFG5                      0x00000560
+
+#define REG_HDMI_8960_PHY_PLL_VCOCAL_CFG6                      0x00000564
+
+#define REG_HDMI_8960_PHY_PLL_VCOCAL_CFG7                      0x00000568
+
+#define REG_HDMI_8960_PHY_PLL_DEBUG_SEL                                0x0000056c
+
+#define REG_HDMI_8960_PHY_PLL_MISC0                            0x00000570
+
+#define REG_HDMI_8960_PHY_PLL_MISC1                            0x00000574
+
+#define REG_HDMI_8960_PHY_PLL_MISC2                            0x00000578
+
+#define REG_HDMI_8960_PHY_PLL_MISC3                            0x0000057c
+
+#define REG_HDMI_8960_PHY_PLL_MISC4                            0x00000580
+
+#define REG_HDMI_8960_PHY_PLL_MISC5                            0x00000584
+
+#define REG_HDMI_8960_PHY_PLL_MISC6                            0x00000588
+
+#define REG_HDMI_8960_PHY_PLL_DEBUG_BUS0                       0x0000058c
+
+#define REG_HDMI_8960_PHY_PLL_DEBUG_BUS1                       0x00000590
+
+#define REG_HDMI_8960_PHY_PLL_DEBUG_BUS2                       0x00000594
+
+#define REG_HDMI_8960_PHY_PLL_STATUS0                          0x00000598
+#define HDMI_8960_PHY_PLL_STATUS0_PLL_LOCK                     0x00000001
+
+#define REG_HDMI_8960_PHY_PLL_STATUS1                          0x0000059c
 
 #define REG_HDMI_8x74_ANA_CFG0                                 0x00000000
 
index 28f7e3ec6c28939d918a86ee1bdbc2fa60c0d010..4aca2a3c667cff443495f14508c5acdf7a7b0a48 100644 (file)
@@ -63,7 +63,7 @@ static int gpio_config(struct hdmi *hdmi, bool on)
                        ret = gpio_request(config->mux_en_gpio, "HDMI_MUX_EN");
                        if (ret) {
                                dev_err(dev->dev, "'%s'(%d) gpio_request failed: %d\n",
-                                       "HDMI_MUX_SEL", config->mux_en_gpio, ret);
+                                       "HDMI_MUX_EN", config->mux_en_gpio, ret);
                                goto error4;
                        }
                        gpio_set_value_cansleep(config->mux_en_gpio, 1);
@@ -78,6 +78,19 @@ static int gpio_config(struct hdmi *hdmi, bool on)
                        }
                        gpio_set_value_cansleep(config->mux_sel_gpio, 0);
                }
+
+               if (config->mux_lpm_gpio != -1) {
+                       ret = gpio_request(config->mux_lpm_gpio,
+                                       "HDMI_MUX_LPM");
+                       if (ret) {
+                               dev_err(dev->dev,
+                                       "'%s'(%d) gpio_request failed: %d\n",
+                                       "HDMI_MUX_LPM",
+                                       config->mux_lpm_gpio, ret);
+                               goto error6;
+                       }
+                       gpio_set_value_cansleep(config->mux_lpm_gpio, 1);
+               }
                DBG("gpio on");
        } else {
                gpio_free(config->ddc_clk_gpio);
@@ -93,11 +106,19 @@ static int gpio_config(struct hdmi *hdmi, bool on)
                        gpio_set_value_cansleep(config->mux_sel_gpio, 1);
                        gpio_free(config->mux_sel_gpio);
                }
+
+               if (config->mux_lpm_gpio != -1) {
+                       gpio_set_value_cansleep(config->mux_lpm_gpio, 0);
+                       gpio_free(config->mux_lpm_gpio);
+               }
                DBG("gpio off");
        }
 
        return 0;
 
+error6:
+       if (config->mux_sel_gpio != -1)
+               gpio_free(config->mux_sel_gpio);
 error5:
        if (config->mux_en_gpio != -1)
                gpio_free(config->mux_en_gpio);
@@ -306,7 +327,7 @@ static void hdmi_connector_destroy(struct drm_connector *connector)
 
        hdp_disable(hdmi_connector);
 
-       drm_sysfs_connector_remove(connector);
+       drm_connector_unregister(connector);
        drm_connector_cleanup(connector);
 
        hdmi_unreference(hdmi_connector->hdmi);
@@ -416,7 +437,7 @@ struct drm_connector *hdmi_connector_init(struct hdmi *hdmi)
        connector->interlace_allowed = 1;
        connector->doublescan_allowed = 0;
 
-       drm_sysfs_connector_add(connector);
+       drm_connector_register(connector);
 
        ret = hpd_enable(hdmi_connector);
        if (ret) {
index e5b7ed5b8f01ca546eaf8a9270dcd47c2ab19c19..902d7685d441f7dca81096626fc6f047f29ca218 100644 (file)
  * this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <linux/clk.h>
+#include <linux/clk-provider.h>
+
 #include "hdmi.h"
 
 struct hdmi_phy_8960 {
        struct hdmi_phy base;
        struct hdmi *hdmi;
+       struct clk_hw pll_hw;
+       struct clk *pll;
+       unsigned long pixclk;
 };
 #define to_hdmi_phy_8960(x) container_of(x, struct hdmi_phy_8960, base)
+#define clk_to_phy(x) container_of(x, struct hdmi_phy_8960, pll_hw)
+
+/*
+ * HDMI PLL:
+ *
+ * To get the parent clock setup properly, we need to plug in hdmi pll
+ * configuration into common-clock-framework.
+ */
+
+struct pll_rate {
+       unsigned long rate;
+       struct {
+               uint32_t val;
+               uint32_t reg;
+       } conf[32];
+};
+
+/* NOTE: keep sorted highest freq to lowest: */
+static const struct pll_rate freqtbl[] = {
+       /* 1080p60/1080p50 case */
+       { 148500000, {
+               { 0x02, REG_HDMI_8960_PHY_PLL_REFCLK_CFG    },
+               { 0x02, REG_HDMI_8960_PHY_PLL_CHRG_PUMP_CFG },
+               { 0x01, REG_HDMI_8960_PHY_PLL_LOOP_FLT_CFG0 },
+               { 0x33, REG_HDMI_8960_PHY_PLL_LOOP_FLT_CFG1 },
+               { 0x2c, REG_HDMI_8960_PHY_PLL_IDAC_ADJ_CFG  },
+               { 0x06, REG_HDMI_8960_PHY_PLL_I_VI_KVCO_CFG },
+               { 0x0a, REG_HDMI_8960_PHY_PLL_PWRDN_B       },
+               { 0x76, REG_HDMI_8960_PHY_PLL_SDM_CFG0      },
+               { 0x01, REG_HDMI_8960_PHY_PLL_SDM_CFG1      },
+               { 0x4c, REG_HDMI_8960_PHY_PLL_SDM_CFG2      },
+               { 0xc0, REG_HDMI_8960_PHY_PLL_SDM_CFG3      },
+               { 0x00, REG_HDMI_8960_PHY_PLL_SDM_CFG4      },
+               { 0x9a, REG_HDMI_8960_PHY_PLL_SSC_CFG0      },
+               { 0x00, REG_HDMI_8960_PHY_PLL_SSC_CFG1      },
+               { 0x00, REG_HDMI_8960_PHY_PLL_SSC_CFG2      },
+               { 0x00, REG_HDMI_8960_PHY_PLL_SSC_CFG3      },
+               { 0x10, REG_HDMI_8960_PHY_PLL_LOCKDET_CFG0  },
+               { 0x1a, REG_HDMI_8960_PHY_PLL_LOCKDET_CFG1  },
+               { 0x0d, REG_HDMI_8960_PHY_PLL_LOCKDET_CFG2  },
+               { 0xe6, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG0   },
+               { 0x02, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG1   },
+               { 0x3b, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG2   },
+               { 0x00, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG3   },
+               { 0x86, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG4   },
+               { 0x00, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG5   },
+               { 0x33, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG6   },
+               { 0x00, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG7   },
+               { 0, 0 } }
+       },
+       { 108000000, {
+               { 0x08, REG_HDMI_8960_PHY_PLL_REFCLK_CFG    },
+               { 0x21, REG_HDMI_8960_PHY_PLL_LOOP_FLT_CFG0 },
+               { 0xf9, REG_HDMI_8960_PHY_PLL_LOOP_FLT_CFG1 },
+               { 0x1c, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG0   },
+               { 0x02, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG1   },
+               { 0x3b, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG2   },
+               { 0x86, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG4   },
+               { 0x00, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG5   },
+               { 0x49, REG_HDMI_8960_PHY_PLL_SDM_CFG0      },
+               { 0x49, REG_HDMI_8960_PHY_PLL_SDM_CFG1      },
+               { 0x00, REG_HDMI_8960_PHY_PLL_SDM_CFG2      },
+               { 0x00, REG_HDMI_8960_PHY_PLL_SDM_CFG3      },
+               { 0x00, REG_HDMI_8960_PHY_PLL_SDM_CFG4      },
+               { 0, 0 } }
+       },
+       /* 720p60/720p50/1080i60/1080i50/1080p24/1080p30/1080p25 */
+       { 74250000, {
+               { 0x0a, REG_HDMI_8960_PHY_PLL_PWRDN_B       },
+               { 0x12, REG_HDMI_8960_PHY_PLL_REFCLK_CFG    },
+               { 0x01, REG_HDMI_8960_PHY_PLL_LOOP_FLT_CFG0 },
+               { 0x33, REG_HDMI_8960_PHY_PLL_LOOP_FLT_CFG1 },
+               { 0x76, REG_HDMI_8960_PHY_PLL_SDM_CFG0      },
+               { 0xe6, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG0   },
+               { 0x02, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG1   },
+               { 0x3b, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG2   },
+               { 0, 0 } }
+       },
+       { 65000000, {
+               { 0x18, REG_HDMI_8960_PHY_PLL_REFCLK_CFG    },
+               { 0x20, REG_HDMI_8960_PHY_PLL_LOOP_FLT_CFG0 },
+               { 0xf9, REG_HDMI_8960_PHY_PLL_LOOP_FLT_CFG1 },
+               { 0x8a, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG0   },
+               { 0x02, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG1   },
+               { 0x3b, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG2   },
+               { 0x00, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG3   },
+               { 0x86, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG4   },
+               { 0x00, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG5   },
+               { 0x0b, REG_HDMI_8960_PHY_PLL_SDM_CFG0      },
+               { 0x4b, REG_HDMI_8960_PHY_PLL_SDM_CFG1      },
+               { 0x7b, REG_HDMI_8960_PHY_PLL_SDM_CFG2      },
+               { 0x09, REG_HDMI_8960_PHY_PLL_SDM_CFG3      },
+               { 0x00, REG_HDMI_8960_PHY_PLL_SDM_CFG4      },
+               { 0, 0 } }
+       },
+       /* 480p60/480i60 */
+       { 27030000, {
+               { 0x0a, REG_HDMI_8960_PHY_PLL_PWRDN_B       },
+               { 0x38, REG_HDMI_8960_PHY_PLL_REFCLK_CFG    },
+               { 0x02, REG_HDMI_8960_PHY_PLL_CHRG_PUMP_CFG },
+               { 0x20, REG_HDMI_8960_PHY_PLL_LOOP_FLT_CFG0 },
+               { 0xff, REG_HDMI_8960_PHY_PLL_LOOP_FLT_CFG1 },
+               { 0x00, REG_HDMI_8960_PHY_PLL_SDM_CFG0      },
+               { 0x4e, REG_HDMI_8960_PHY_PLL_SDM_CFG1      },
+               { 0xd7, REG_HDMI_8960_PHY_PLL_SDM_CFG2      },
+               { 0x03, REG_HDMI_8960_PHY_PLL_SDM_CFG3      },
+               { 0x00, REG_HDMI_8960_PHY_PLL_SDM_CFG4      },
+               { 0x2a, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG0   },
+               { 0x03, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG1   },
+               { 0x3b, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG2   },
+               { 0x00, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG3   },
+               { 0x86, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG4   },
+               { 0x00, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG5   },
+               { 0x33, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG6   },
+               { 0x00, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG7   },
+               { 0, 0 } }
+       },
+       /* 576p50/576i50 */
+       { 27000000, {
+               { 0x32, REG_HDMI_8960_PHY_PLL_REFCLK_CFG    },
+               { 0x02, REG_HDMI_8960_PHY_PLL_CHRG_PUMP_CFG },
+               { 0x01, REG_HDMI_8960_PHY_PLL_LOOP_FLT_CFG0 },
+               { 0x33, REG_HDMI_8960_PHY_PLL_LOOP_FLT_CFG1 },
+               { 0x2c, REG_HDMI_8960_PHY_PLL_IDAC_ADJ_CFG  },
+               { 0x06, REG_HDMI_8960_PHY_PLL_I_VI_KVCO_CFG },
+               { 0x0a, REG_HDMI_8960_PHY_PLL_PWRDN_B       },
+               { 0x7b, REG_HDMI_8960_PHY_PLL_SDM_CFG0      },
+               { 0x01, REG_HDMI_8960_PHY_PLL_SDM_CFG1      },
+               { 0x4c, REG_HDMI_8960_PHY_PLL_SDM_CFG2      },
+               { 0xc0, REG_HDMI_8960_PHY_PLL_SDM_CFG3      },
+               { 0x00, REG_HDMI_8960_PHY_PLL_SDM_CFG4      },
+               { 0x9a, REG_HDMI_8960_PHY_PLL_SSC_CFG0      },
+               { 0x00, REG_HDMI_8960_PHY_PLL_SSC_CFG1      },
+               { 0x00, REG_HDMI_8960_PHY_PLL_SSC_CFG2      },
+               { 0x00, REG_HDMI_8960_PHY_PLL_SSC_CFG3      },
+               { 0x10, REG_HDMI_8960_PHY_PLL_LOCKDET_CFG0  },
+               { 0x1a, REG_HDMI_8960_PHY_PLL_LOCKDET_CFG1  },
+               { 0x0d, REG_HDMI_8960_PHY_PLL_LOCKDET_CFG2  },
+               { 0x2a, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG0   },
+               { 0x03, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG1   },
+               { 0x3b, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG2   },
+               { 0x00, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG3   },
+               { 0x86, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG4   },
+               { 0x00, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG5   },
+               { 0x33, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG6   },
+               { 0x00, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG7   },
+               { 0, 0 } }
+       },
+       /* 640x480p60 */
+       { 25200000, {
+               { 0x32, REG_HDMI_8960_PHY_PLL_REFCLK_CFG    },
+               { 0x02, REG_HDMI_8960_PHY_PLL_CHRG_PUMP_CFG },
+               { 0x01, REG_HDMI_8960_PHY_PLL_LOOP_FLT_CFG0 },
+               { 0x33, REG_HDMI_8960_PHY_PLL_LOOP_FLT_CFG1 },
+               { 0x2c, REG_HDMI_8960_PHY_PLL_IDAC_ADJ_CFG  },
+               { 0x06, REG_HDMI_8960_PHY_PLL_I_VI_KVCO_CFG },
+               { 0x0a, REG_HDMI_8960_PHY_PLL_PWRDN_B       },
+               { 0x77, REG_HDMI_8960_PHY_PLL_SDM_CFG0      },
+               { 0x4c, REG_HDMI_8960_PHY_PLL_SDM_CFG1      },
+               { 0x00, REG_HDMI_8960_PHY_PLL_SDM_CFG2      },
+               { 0xc0, REG_HDMI_8960_PHY_PLL_SDM_CFG3      },
+               { 0x00, REG_HDMI_8960_PHY_PLL_SDM_CFG4      },
+               { 0x9a, REG_HDMI_8960_PHY_PLL_SSC_CFG0      },
+               { 0x00, REG_HDMI_8960_PHY_PLL_SSC_CFG1      },
+               { 0x00, REG_HDMI_8960_PHY_PLL_SSC_CFG2      },
+               { 0x20, REG_HDMI_8960_PHY_PLL_SSC_CFG3      },
+               { 0x10, REG_HDMI_8960_PHY_PLL_LOCKDET_CFG0  },
+               { 0x1a, REG_HDMI_8960_PHY_PLL_LOCKDET_CFG1  },
+               { 0x0d, REG_HDMI_8960_PHY_PLL_LOCKDET_CFG2  },
+               { 0xf4, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG0   },
+               { 0x02, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG1   },
+               { 0x3b, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG2   },
+               { 0x00, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG3   },
+               { 0x86, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG4   },
+               { 0x00, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG5   },
+               { 0x33, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG6   },
+               { 0x00, REG_HDMI_8960_PHY_PLL_VCOCAL_CFG7   },
+               { 0, 0 } }
+       },
+};
+
+static int hdmi_pll_enable(struct clk_hw *hw)
+{
+       struct hdmi_phy_8960 *phy_8960 = clk_to_phy(hw);
+       struct hdmi *hdmi = phy_8960->hdmi;
+       int timeout_count, pll_lock_retry = 10;
+       unsigned int val;
+
+       DBG("");
+
+       /* Assert PLL S/W reset */
+       hdmi_write(hdmi, REG_HDMI_8960_PHY_PLL_LOCKDET_CFG2, 0x8d);
+       hdmi_write(hdmi, REG_HDMI_8960_PHY_PLL_LOCKDET_CFG0, 0x10);
+       hdmi_write(hdmi, REG_HDMI_8960_PHY_PLL_LOCKDET_CFG1, 0x1a);
+
+       /* Wait for a short time before de-asserting
+        * to allow the hardware to complete its job.
+        * This much of delay should be fine for hardware
+        * to assert and de-assert.
+        */
+       udelay(10);
+
+       /* De-assert PLL S/W reset */
+       hdmi_write(hdmi, REG_HDMI_8960_PHY_PLL_LOCKDET_CFG2, 0x0d);
+
+       val = hdmi_read(hdmi, REG_HDMI_8960_PHY_REG12);
+       val |= HDMI_8960_PHY_REG12_SW_RESET;
+       /* Assert PHY S/W reset */
+       hdmi_write(hdmi, REG_HDMI_8960_PHY_REG12, val);
+       val &= ~HDMI_8960_PHY_REG12_SW_RESET;
+       /* Wait for a short time before de-asserting
+          to allow the hardware to complete its job.
+          This much of delay should be fine for hardware
+          to assert and de-assert. */
+       udelay(10);
+       /* De-assert PHY S/W reset */
+       hdmi_write(hdmi, REG_HDMI_8960_PHY_REG12, val);
+       hdmi_write(hdmi, REG_HDMI_8960_PHY_REG2,  0x3f);
+
+       val = hdmi_read(hdmi, REG_HDMI_8960_PHY_REG12);
+       val |= HDMI_8960_PHY_REG12_PWRDN_B;
+       hdmi_write(hdmi, REG_HDMI_8960_PHY_REG12, val);
+       /* Wait 10 us for enabling global power for PHY */
+       mb();
+       udelay(10);
+
+       val = hdmi_read(hdmi, REG_HDMI_8960_PHY_PLL_PWRDN_B);
+       val |= HDMI_8960_PHY_PLL_PWRDN_B_PLL_PWRDN_B;
+       val &= ~HDMI_8960_PHY_PLL_PWRDN_B_PD_PLL;
+       hdmi_write(hdmi, REG_HDMI_8960_PHY_PLL_PWRDN_B, val);
+       hdmi_write(hdmi, REG_HDMI_8960_PHY_REG2, 0x80);
+
+       timeout_count = 1000;
+       while (--pll_lock_retry > 0) {
+
+               /* are we there yet? */
+               val = hdmi_read(hdmi, REG_HDMI_8960_PHY_PLL_STATUS0);
+               if (val & HDMI_8960_PHY_PLL_STATUS0_PLL_LOCK)
+                       break;
+
+               udelay(1);
+
+               if (--timeout_count > 0)
+                       continue;
+
+               /*
+                * PLL has still not locked.
+                * Do a software reset and try again
+                * Assert PLL S/W reset first
+                */
+               hdmi_write(hdmi, REG_HDMI_8960_PHY_PLL_LOCKDET_CFG2, 0x8d);
+               udelay(10);
+               hdmi_write(hdmi, REG_HDMI_8960_PHY_PLL_LOCKDET_CFG2, 0x0d);
+
+               /*
+                * Wait for a short duration for the PLL calibration
+                * before checking if the PLL gets locked
+                */
+               udelay(350);
+
+               timeout_count = 1000;
+       }
+
+       return 0;
+}
+
+static void hdmi_pll_disable(struct clk_hw *hw)
+{
+       struct hdmi_phy_8960 *phy_8960 = clk_to_phy(hw);
+       struct hdmi *hdmi = phy_8960->hdmi;
+       unsigned int val;
+
+       DBG("");
+
+       val = hdmi_read(hdmi, REG_HDMI_8960_PHY_REG12);
+       val &= ~HDMI_8960_PHY_REG12_PWRDN_B;
+       hdmi_write(hdmi, REG_HDMI_8960_PHY_REG12, val);
+
+       val = hdmi_read(hdmi, REG_HDMI_8960_PHY_PLL_PWRDN_B);
+       val |= HDMI_8960_PHY_REG12_SW_RESET;
+       val &= ~HDMI_8960_PHY_REG12_PWRDN_B;
+       hdmi_write(hdmi, REG_HDMI_8960_PHY_PLL_PWRDN_B, val);
+       /* Make sure HDMI PHY/PLL are powered down */
+       mb();
+}
+
+static const struct pll_rate *find_rate(unsigned long rate)
+{
+       int i;
+       for (i = 1; i < ARRAY_SIZE(freqtbl); i++)
+               if (rate > freqtbl[i].rate)
+                       return &freqtbl[i-1];
+       return &freqtbl[i-1];
+}
+
+static unsigned long hdmi_pll_recalc_rate(struct clk_hw *hw,
+                               unsigned long parent_rate)
+{
+       struct hdmi_phy_8960 *phy_8960 = clk_to_phy(hw);
+       return phy_8960->pixclk;
+}
+
+static long hdmi_pll_round_rate(struct clk_hw *hw, unsigned long rate,
+               unsigned long *parent_rate)
+{
+       const struct pll_rate *pll_rate = find_rate(rate);
+       return pll_rate->rate;
+}
+
+static int hdmi_pll_set_rate(struct clk_hw *hw, unsigned long rate,
+               unsigned long parent_rate)
+{
+       struct hdmi_phy_8960 *phy_8960 = clk_to_phy(hw);
+       struct hdmi *hdmi = phy_8960->hdmi;
+       const struct pll_rate *pll_rate = find_rate(rate);
+       int i;
+
+       DBG("rate=%lu", rate);
+
+       for (i = 0; pll_rate->conf[i].reg; i++)
+               hdmi_write(hdmi, pll_rate->conf[i].reg, pll_rate->conf[i].val);
+
+       phy_8960->pixclk = rate;
+
+       return 0;
+}
+
+
+static const struct clk_ops hdmi_pll_ops = {
+       .enable = hdmi_pll_enable,
+       .disable = hdmi_pll_disable,
+       .recalc_rate = hdmi_pll_recalc_rate,
+       .round_rate = hdmi_pll_round_rate,
+       .set_rate = hdmi_pll_set_rate,
+};
+
+static const char *hdmi_pll_parents[] = {
+       "pxo",
+};
+
+static struct clk_init_data pll_init = {
+       .name = "hdmi_pll",
+       .ops = &hdmi_pll_ops,
+       .parent_names = hdmi_pll_parents,
+       .num_parents = ARRAY_SIZE(hdmi_pll_parents),
+};
+
+
+/*
+ * HDMI Phy:
+ */
 
 static void hdmi_phy_8960_destroy(struct hdmi_phy *phy)
 {
@@ -86,6 +443,9 @@ static void hdmi_phy_8960_powerup(struct hdmi_phy *phy,
        struct hdmi_phy_8960 *phy_8960 = to_hdmi_phy_8960(phy);
        struct hdmi *hdmi = phy_8960->hdmi;
 
+       DBG("pixclock: %lu", pixclock);
+
+       hdmi_write(hdmi, REG_HDMI_8960_PHY_REG2, 0x00);
        hdmi_write(hdmi, REG_HDMI_8960_PHY_REG0, 0x1b);
        hdmi_write(hdmi, REG_HDMI_8960_PHY_REG1, 0xf2);
        hdmi_write(hdmi, REG_HDMI_8960_PHY_REG4, 0x00);
@@ -104,6 +464,8 @@ static void hdmi_phy_8960_powerdown(struct hdmi_phy *phy)
        struct hdmi_phy_8960 *phy_8960 = to_hdmi_phy_8960(phy);
        struct hdmi *hdmi = phy_8960->hdmi;
 
+       DBG("");
+
        hdmi_write(hdmi, REG_HDMI_8960_PHY_REG2, 0x7f);
 }
 
@@ -118,7 +480,12 @@ struct hdmi_phy *hdmi_phy_8960_init(struct hdmi *hdmi)
 {
        struct hdmi_phy_8960 *phy_8960;
        struct hdmi_phy *phy = NULL;
-       int ret;
+       int ret, i;
+
+       /* sanity check: */
+       for (i = 0; i < (ARRAY_SIZE(freqtbl) - 1); i++)
+               if (WARN_ON(freqtbl[i].rate < freqtbl[i+1].rate))
+                       return ERR_PTR(-EINVAL);
 
        phy_8960 = kzalloc(sizeof(*phy_8960), GFP_KERNEL);
        if (!phy_8960) {
@@ -132,6 +499,14 @@ struct hdmi_phy *hdmi_phy_8960_init(struct hdmi *hdmi)
 
        phy_8960->hdmi = hdmi;
 
+       phy_8960->pll_hw.init = &pll_init;
+       phy_8960->pll = devm_clk_register(hdmi->dev->dev, &phy_8960->pll_hw);
+       if (IS_ERR(phy_8960->pll)) {
+               ret = PTR_ERR(phy_8960->pll);
+               phy_8960->pll = NULL;
+               goto fail;
+       }
+
        return phy;
 
 fail:
index d591567173c405226eea5fc9d06b4591887f29d1..bd81db6a7829f999fd183a096e86dea8c88d1761 100644 (file)
@@ -12,12 +12,12 @@ The rules-ng-ng source files this header was generated from are:
 - /home/robclark/src/freedreno/envytools/rnndb/freedreno_copyright.xml (   1453 bytes, from 2013-03-31 16:51:27)
 - /home/robclark/src/freedreno/envytools/rnndb/mdp/mdp4.xml            (  17996 bytes, from 2013-12-01 19:10:31)
 - /home/robclark/src/freedreno/envytools/rnndb/mdp/mdp_common.xml      (   1615 bytes, from 2013-11-30 15:00:52)
-- /home/robclark/src/freedreno/envytools/rnndb/mdp/mdp5.xml            (  22517 bytes, from 2013-12-03 20:59:13)
+- /home/robclark/src/freedreno/envytools/rnndb/mdp/mdp5.xml            (  22517 bytes, from 2014-06-25 12:55:02)
 - /home/robclark/src/freedreno/envytools/rnndb/dsi/dsi.xml             (  11712 bytes, from 2013-08-17 17:13:43)
 - /home/robclark/src/freedreno/envytools/rnndb/dsi/sfpb.xml            (    344 bytes, from 2013-08-11 19:26:32)
 - /home/robclark/src/freedreno/envytools/rnndb/dsi/mmss_cc.xml         (   1544 bytes, from 2013-08-16 19:17:05)
 - /home/robclark/src/freedreno/envytools/rnndb/hdmi/qfprom.xml         (    600 bytes, from 2013-07-05 19:21:12)
-- /home/robclark/src/freedreno/envytools/rnndb/hdmi/hdmi.xml           (  20932 bytes, from 2013-12-01 15:13:04)
+- /home/robclark/src/freedreno/envytools/rnndb/hdmi/hdmi.xml           (  23613 bytes, from 2014-06-25 12:53:44)
 
 Copyright (C) 2013 by the following authors:
 - Rob Clark <robdclark@gmail.com> (robclark)
index 416a26e1e58d1f7cdbbf401220a9928a80721a9e..122208e8a2ee205d018f9d2c55ebd92de1af756b 100644 (file)
@@ -12,12 +12,12 @@ The rules-ng-ng source files this header was generated from are:
 - /home/robclark/src/freedreno/envytools/rnndb/freedreno_copyright.xml (   1453 bytes, from 2013-03-31 16:51:27)
 - /home/robclark/src/freedreno/envytools/rnndb/mdp/mdp4.xml            (  17996 bytes, from 2013-12-01 19:10:31)
 - /home/robclark/src/freedreno/envytools/rnndb/mdp/mdp_common.xml      (   1615 bytes, from 2013-11-30 15:00:52)
-- /home/robclark/src/freedreno/envytools/rnndb/mdp/mdp5.xml            (  22517 bytes, from 2013-12-03 20:59:13)
+- /home/robclark/src/freedreno/envytools/rnndb/mdp/mdp5.xml            (  22517 bytes, from 2014-06-25 12:55:02)
 - /home/robclark/src/freedreno/envytools/rnndb/dsi/dsi.xml             (  11712 bytes, from 2013-08-17 17:13:43)
 - /home/robclark/src/freedreno/envytools/rnndb/dsi/sfpb.xml            (    344 bytes, from 2013-08-11 19:26:32)
 - /home/robclark/src/freedreno/envytools/rnndb/dsi/mmss_cc.xml         (   1544 bytes, from 2013-08-16 19:17:05)
 - /home/robclark/src/freedreno/envytools/rnndb/hdmi/qfprom.xml         (    600 bytes, from 2013-07-05 19:21:12)
-- /home/robclark/src/freedreno/envytools/rnndb/hdmi/hdmi.xml           (  20932 bytes, from 2013-12-01 15:13:04)
+- /home/robclark/src/freedreno/envytools/rnndb/hdmi/hdmi.xml           (  23613 bytes, from 2014-06-25 12:53:44)
 
 Copyright (C) 2013 by the following authors:
 - Rob Clark <robdclark@gmail.com> (robclark)
index 0bb4faa17523e0862d7f32df0939976424e82d6a..733646c0d3f871cc090efedb741fb8ae73ec790f 100644 (file)
@@ -147,7 +147,7 @@ static void mdp4_destroy(struct msm_kms *kms)
        if (mdp4_kms->blank_cursor_iova)
                msm_gem_put_iova(mdp4_kms->blank_cursor_bo, mdp4_kms->id);
        if (mdp4_kms->blank_cursor_bo)
-               drm_gem_object_unreference(mdp4_kms->blank_cursor_bo);
+               drm_gem_object_unreference_unlocked(mdp4_kms->blank_cursor_bo);
        kfree(mdp4_kms);
 }
 
@@ -176,6 +176,8 @@ int mdp4_disable(struct mdp4_kms *mdp4_kms)
        if (mdp4_kms->pclk)
                clk_disable_unprepare(mdp4_kms->pclk);
        clk_disable_unprepare(mdp4_kms->lut_clk);
+       if (mdp4_kms->axi_clk)
+               clk_disable_unprepare(mdp4_kms->axi_clk);
 
        return 0;
 }
@@ -188,6 +190,8 @@ int mdp4_enable(struct mdp4_kms *mdp4_kms)
        if (mdp4_kms->pclk)
                clk_prepare_enable(mdp4_kms->pclk);
        clk_prepare_enable(mdp4_kms->lut_clk);
+       if (mdp4_kms->axi_clk)
+               clk_prepare_enable(mdp4_kms->axi_clk);
 
        return 0;
 }
@@ -294,15 +298,17 @@ struct msm_kms *mdp4_kms_init(struct drm_device *dev)
                goto fail;
        }
 
-       mdp4_kms->dsi_pll_vdda = devm_regulator_get(&pdev->dev, "dsi_pll_vdda");
+       mdp4_kms->dsi_pll_vdda =
+                       devm_regulator_get_optional(&pdev->dev, "dsi_pll_vdda");
        if (IS_ERR(mdp4_kms->dsi_pll_vdda))
                mdp4_kms->dsi_pll_vdda = NULL;
 
-       mdp4_kms->dsi_pll_vddio = devm_regulator_get(&pdev->dev, "dsi_pll_vddio");
+       mdp4_kms->dsi_pll_vddio =
+                       devm_regulator_get_optional(&pdev->dev, "dsi_pll_vddio");
        if (IS_ERR(mdp4_kms->dsi_pll_vddio))
                mdp4_kms->dsi_pll_vddio = NULL;
 
-       mdp4_kms->vdd = devm_regulator_get(&pdev->dev, "vdd");
+       mdp4_kms->vdd = devm_regulator_get_exclusive(&pdev->dev, "vdd");
        if (IS_ERR(mdp4_kms->vdd))
                mdp4_kms->vdd = NULL;
 
@@ -333,6 +339,13 @@ struct msm_kms *mdp4_kms_init(struct drm_device *dev)
                goto fail;
        }
 
+       mdp4_kms->axi_clk = devm_clk_get(&pdev->dev, "mdp_axi_clk");
+       if (IS_ERR(mdp4_kms->axi_clk)) {
+               dev_err(dev->dev, "failed to get axi_clk\n");
+               ret = PTR_ERR(mdp4_kms->axi_clk);
+               goto fail;
+       }
+
        clk_set_rate(mdp4_kms->clk, config->max_clk);
        clk_set_rate(mdp4_kms->lut_clk, config->max_clk);
 
@@ -348,7 +361,7 @@ struct msm_kms *mdp4_kms_init(struct drm_device *dev)
        mdelay(16);
 
        if (config->iommu) {
-               mmu = msm_iommu_new(dev, config->iommu);
+               mmu = msm_iommu_new(&pdev->dev, config->iommu);
                if (IS_ERR(mmu)) {
                        ret = PTR_ERR(mmu);
                        goto fail;
@@ -406,6 +419,8 @@ static struct mdp4_platform_config *mdp4_get_config(struct platform_device *dev)
        static struct mdp4_platform_config config = {};
 #ifdef CONFIG_OF
        /* TODO */
+       config.max_clk = 266667000;
+       config.iommu = iommu_domain_alloc(&platform_bus_type);
 #else
        if (cpu_is_apq8064())
                config.max_clk = 266667000;
index 715520c54cdec48f93750da0843213878aaabf86..3225da804c613f4f9fce06960862bb6bb345b406 100644 (file)
@@ -42,6 +42,7 @@ struct mdp4_kms {
        struct clk *clk;
        struct clk *pclk;
        struct clk *lut_clk;
+       struct clk *axi_clk;
 
        struct mdp_irq error_handler;
 
index 0aa51517f82635e9bc577fe843f1cc02ca9631ef..67f4f896ba8ce99647812f28e44b54e18ec0d4ee 100644 (file)
@@ -12,14 +12,14 @@ The rules-ng-ng source files this header was generated from are:
 - /home/robclark/src/freedreno/envytools/rnndb/freedreno_copyright.xml (   1453 bytes, from 2013-03-31 16:51:27)
 - /home/robclark/src/freedreno/envytools/rnndb/mdp/mdp4.xml            (  17996 bytes, from 2013-12-01 19:10:31)
 - /home/robclark/src/freedreno/envytools/rnndb/mdp/mdp_common.xml      (   1615 bytes, from 2013-11-30 15:00:52)
-- /home/robclark/src/freedreno/envytools/rnndb/mdp/mdp5.xml            (  22517 bytes, from 2013-12-03 20:59:13)
+- /home/robclark/src/freedreno/envytools/rnndb/mdp/mdp5.xml            (  22517 bytes, from 2014-06-25 12:55:02)
 - /home/robclark/src/freedreno/envytools/rnndb/dsi/dsi.xml             (  11712 bytes, from 2013-08-17 17:13:43)
 - /home/robclark/src/freedreno/envytools/rnndb/dsi/sfpb.xml            (    344 bytes, from 2013-08-11 19:26:32)
 - /home/robclark/src/freedreno/envytools/rnndb/dsi/mmss_cc.xml         (   1544 bytes, from 2013-08-16 19:17:05)
 - /home/robclark/src/freedreno/envytools/rnndb/hdmi/qfprom.xml         (    600 bytes, from 2013-07-05 19:21:12)
-- /home/robclark/src/freedreno/envytools/rnndb/hdmi/hdmi.xml           (  20932 bytes, from 2013-12-01 15:13:04)
+- /home/robclark/src/freedreno/envytools/rnndb/hdmi/hdmi.xml           (  23613 bytes, from 2014-06-25 12:53:44)
 
-Copyright (C) 2013 by the following authors:
+Copyright (C) 2013-2014 by the following authors:
 - Rob Clark <robdclark@gmail.com> (robclark)
 
 Permission is hereby granted, free of charge, to any person obtaining
@@ -68,6 +68,8 @@ enum mdp5_pipe {
        SSPP_RGB2 = 5,
        SSPP_DMA0 = 6,
        SSPP_DMA1 = 7,
+       SSPP_VIG3 = 8,
+       SSPP_RGB3 = 9,
 };
 
 enum mdp5_ctl_mode {
@@ -126,7 +128,11 @@ enum mdp5_client_id {
        CID_RGB0 = 16,
        CID_RGB1 = 17,
        CID_RGB2 = 18,
-       CID_MAX = 19,
+       CID_VIG3_Y = 19,
+       CID_VIG3_CR = 20,
+       CID_VIG3_CB = 21,
+       CID_RGB3 = 22,
+       CID_MAX = 23,
 };
 
 enum mdp5_igc_type {
@@ -299,11 +305,34 @@ static inline uint32_t MDP5_IGC_LUT_REG_VAL(uint32_t val)
 #define MDP5_IGC_LUT_REG_DISABLE_PIPE_1                                0x20000000
 #define MDP5_IGC_LUT_REG_DISABLE_PIPE_2                                0x40000000
 
-static inline uint32_t REG_MDP5_CTL(uint32_t i0) { return 0x00000600 + 0x100*i0; }
+static inline uint32_t __offset_CTL(uint32_t idx)
+{
+       switch (idx) {
+               case 0: return (mdp5_cfg->ctl.base[0]);
+               case 1: return (mdp5_cfg->ctl.base[1]);
+               case 2: return (mdp5_cfg->ctl.base[2]);
+               case 3: return (mdp5_cfg->ctl.base[3]);
+               case 4: return (mdp5_cfg->ctl.base[4]);
+               default: return INVALID_IDX(idx);
+       }
+}
+static inline uint32_t REG_MDP5_CTL(uint32_t i0) { return 0x00000000 + __offset_CTL(i0); }
 
-static inline uint32_t REG_MDP5_CTL_LAYER(uint32_t i0, uint32_t i1) { return 0x00000600 + 0x100*i0 + 0x4*i1; }
+static inline uint32_t __offset_LAYER(uint32_t idx)
+{
+       switch (idx) {
+               case 0: return 0x00000000;
+               case 1: return 0x00000004;
+               case 2: return 0x00000008;
+               case 3: return 0x0000000c;
+               case 4: return 0x00000010;
+               case 5: return 0x00000024;
+               default: return INVALID_IDX(idx);
+       }
+}
+static inline uint32_t REG_MDP5_CTL_LAYER(uint32_t i0, uint32_t i1) { return 0x00000000 + __offset_CTL(i0) + __offset_LAYER(i1); }
 
-static inline uint32_t REG_MDP5_CTL_LAYER_REG(uint32_t i0, uint32_t i1) { return 0x00000600 + 0x100*i0 + 0x4*i1; }
+static inline uint32_t REG_MDP5_CTL_LAYER_REG(uint32_t i0, uint32_t i1) { return 0x00000000 + __offset_CTL(i0) + __offset_LAYER(i1); }
 #define MDP5_CTL_LAYER_REG_VIG0__MASK                          0x00000007
 #define MDP5_CTL_LAYER_REG_VIG0__SHIFT                         0
 static inline uint32_t MDP5_CTL_LAYER_REG_VIG0(enum mdp_mixer_stage_id val)
@@ -354,8 +383,20 @@ static inline uint32_t MDP5_CTL_LAYER_REG_DMA1(enum mdp_mixer_stage_id val)
 }
 #define MDP5_CTL_LAYER_REG_BORDER_COLOR                                0x01000000
 #define MDP5_CTL_LAYER_REG_CURSOR_OUT                          0x02000000
+#define MDP5_CTL_LAYER_REG_VIG3__MASK                          0x1c000000
+#define MDP5_CTL_LAYER_REG_VIG3__SHIFT                         26
+static inline uint32_t MDP5_CTL_LAYER_REG_VIG3(enum mdp_mixer_stage_id val)
+{
+       return ((val) << MDP5_CTL_LAYER_REG_VIG3__SHIFT) & MDP5_CTL_LAYER_REG_VIG3__MASK;
+}
+#define MDP5_CTL_LAYER_REG_RGB3__MASK                          0xe0000000
+#define MDP5_CTL_LAYER_REG_RGB3__SHIFT                         29
+static inline uint32_t MDP5_CTL_LAYER_REG_RGB3(enum mdp_mixer_stage_id val)
+{
+       return ((val) << MDP5_CTL_LAYER_REG_RGB3__SHIFT) & MDP5_CTL_LAYER_REG_RGB3__MASK;
+}
 
-static inline uint32_t REG_MDP5_CTL_OP(uint32_t i0) { return 0x00000614 + 0x100*i0; }
+static inline uint32_t REG_MDP5_CTL_OP(uint32_t i0) { return 0x00000014 + __offset_CTL(i0); }
 #define MDP5_CTL_OP_MODE__MASK                                 0x0000000f
 #define MDP5_CTL_OP_MODE__SHIFT                                        0
 static inline uint32_t MDP5_CTL_OP_MODE(enum mdp5_ctl_mode val)
@@ -377,7 +418,7 @@ static inline uint32_t MDP5_CTL_OP_PACK_3D(enum mdp5_pack_3d val)
        return ((val) << MDP5_CTL_OP_PACK_3D__SHIFT) & MDP5_CTL_OP_PACK_3D__MASK;
 }
 
-static inline uint32_t REG_MDP5_CTL_FLUSH(uint32_t i0) { return 0x00000618 + 0x100*i0; }
+static inline uint32_t REG_MDP5_CTL_FLUSH(uint32_t i0) { return 0x00000018 + __offset_CTL(i0); }
 #define MDP5_CTL_FLUSH_VIG0                                    0x00000001
 #define MDP5_CTL_FLUSH_VIG1                                    0x00000002
 #define MDP5_CTL_FLUSH_VIG2                                    0x00000004
@@ -387,26 +428,48 @@ static inline uint32_t REG_MDP5_CTL_FLUSH(uint32_t i0) { return 0x00000618 + 0x1
 #define MDP5_CTL_FLUSH_LM0                                     0x00000040
 #define MDP5_CTL_FLUSH_LM1                                     0x00000080
 #define MDP5_CTL_FLUSH_LM2                                     0x00000100
+#define MDP5_CTL_FLUSH_LM3                                     0x00000200
+#define MDP5_CTL_FLUSH_LM4                                     0x00000400
 #define MDP5_CTL_FLUSH_DMA0                                    0x00000800
 #define MDP5_CTL_FLUSH_DMA1                                    0x00001000
 #define MDP5_CTL_FLUSH_DSPP0                                   0x00002000
 #define MDP5_CTL_FLUSH_DSPP1                                   0x00004000
 #define MDP5_CTL_FLUSH_DSPP2                                   0x00008000
 #define MDP5_CTL_FLUSH_CTL                                     0x00020000
+#define MDP5_CTL_FLUSH_VIG3                                    0x00040000
+#define MDP5_CTL_FLUSH_RGB3                                    0x00080000
+#define MDP5_CTL_FLUSH_LM5                                     0x00100000
+#define MDP5_CTL_FLUSH_DSPP3                                   0x00200000
 
-static inline uint32_t REG_MDP5_CTL_START(uint32_t i0) { return 0x0000061c + 0x100*i0; }
+static inline uint32_t REG_MDP5_CTL_START(uint32_t i0) { return 0x0000001c + __offset_CTL(i0); }
 
-static inline uint32_t REG_MDP5_CTL_PACK_3D(uint32_t i0) { return 0x00000620 + 0x100*i0; }
+static inline uint32_t REG_MDP5_CTL_PACK_3D(uint32_t i0) { return 0x00000020 + __offset_CTL(i0); }
 
-static inline uint32_t REG_MDP5_PIPE(enum mdp5_pipe i0) { return 0x00001200 + 0x400*i0; }
+static inline uint32_t __offset_PIPE(enum mdp5_pipe idx)
+{
+       switch (idx) {
+               case SSPP_VIG0: return (mdp5_cfg->pipe_vig.base[0]);
+               case SSPP_VIG1: return (mdp5_cfg->pipe_vig.base[1]);
+               case SSPP_VIG2: return (mdp5_cfg->pipe_vig.base[2]);
+               case SSPP_RGB0: return (mdp5_cfg->pipe_rgb.base[0]);
+               case SSPP_RGB1: return (mdp5_cfg->pipe_rgb.base[1]);
+               case SSPP_RGB2: return (mdp5_cfg->pipe_rgb.base[2]);
+               case SSPP_DMA0: return (mdp5_cfg->pipe_dma.base[0]);
+               case SSPP_DMA1: return (mdp5_cfg->pipe_dma.base[1]);
+               case SSPP_VIG3: return (mdp5_cfg->pipe_vig.base[3]);
+               case SSPP_RGB3: return (mdp5_cfg->pipe_rgb.base[3]);
+               default: return INVALID_IDX(idx);
+       }
+}
+static inline uint32_t REG_MDP5_PIPE(enum mdp5_pipe i0) { return 0x00000000 + __offset_PIPE(i0); }
 
-static inline uint32_t REG_MDP5_PIPE_HIST_CTL_BASE(enum mdp5_pipe i0) { return 0x000014c4 + 0x400*i0; }
+static inline uint32_t REG_MDP5_PIPE_HIST_CTL_BASE(enum mdp5_pipe i0) { return 0x000002c4 + __offset_PIPE(i0); }
 
-static inline uint32_t REG_MDP5_PIPE_HIST_LUT_BASE(enum mdp5_pipe i0) { return 0x000014f0 + 0x400*i0; }
+static inline uint32_t REG_MDP5_PIPE_HIST_LUT_BASE(enum mdp5_pipe i0) { return 0x000002f0 + __offset_PIPE(i0); }
 
-static inline uint32_t REG_MDP5_PIPE_HIST_LUT_SWAP(enum mdp5_pipe i0) { return 0x00001500 + 0x400*i0; }
+static inline uint32_t REG_MDP5_PIPE_HIST_LUT_SWAP(enum mdp5_pipe i0) { return 0x00000300 + __offset_PIPE(i0); }
 
-static inline uint32_t REG_MDP5_PIPE_SRC_SIZE(enum mdp5_pipe i0) { return 0x00001200 + 0x400*i0; }
+static inline uint32_t REG_MDP5_PIPE_SRC_SIZE(enum mdp5_pipe i0) { return 0x00000000 + __offset_PIPE(i0); }
 #define MDP5_PIPE_SRC_SIZE_HEIGHT__MASK                                0xffff0000
 #define MDP5_PIPE_SRC_SIZE_HEIGHT__SHIFT                       16
 static inline uint32_t MDP5_PIPE_SRC_SIZE_HEIGHT(uint32_t val)
@@ -420,7 +483,7 @@ static inline uint32_t MDP5_PIPE_SRC_SIZE_WIDTH(uint32_t val)
        return ((val) << MDP5_PIPE_SRC_SIZE_WIDTH__SHIFT) & MDP5_PIPE_SRC_SIZE_WIDTH__MASK;
 }
 
-static inline uint32_t REG_MDP5_PIPE_SRC_IMG_SIZE(enum mdp5_pipe i0) { return 0x00001204 + 0x400*i0; }
+static inline uint32_t REG_MDP5_PIPE_SRC_IMG_SIZE(enum mdp5_pipe i0) { return 0x00000004 + __offset_PIPE(i0); }
 #define MDP5_PIPE_SRC_IMG_SIZE_HEIGHT__MASK                    0xffff0000
 #define MDP5_PIPE_SRC_IMG_SIZE_HEIGHT__SHIFT                   16
 static inline uint32_t MDP5_PIPE_SRC_IMG_SIZE_HEIGHT(uint32_t val)
@@ -434,7 +497,7 @@ static inline uint32_t MDP5_PIPE_SRC_IMG_SIZE_WIDTH(uint32_t val)
        return ((val) << MDP5_PIPE_SRC_IMG_SIZE_WIDTH__SHIFT) & MDP5_PIPE_SRC_IMG_SIZE_WIDTH__MASK;
 }
 
-static inline uint32_t REG_MDP5_PIPE_SRC_XY(enum mdp5_pipe i0) { return 0x00001208 + 0x400*i0; }
+static inline uint32_t REG_MDP5_PIPE_SRC_XY(enum mdp5_pipe i0) { return 0x00000008 + __offset_PIPE(i0); }
 #define MDP5_PIPE_SRC_XY_Y__MASK                               0xffff0000
 #define MDP5_PIPE_SRC_XY_Y__SHIFT                              16
 static inline uint32_t MDP5_PIPE_SRC_XY_Y(uint32_t val)
@@ -448,7 +511,7 @@ static inline uint32_t MDP5_PIPE_SRC_XY_X(uint32_t val)
        return ((val) << MDP5_PIPE_SRC_XY_X__SHIFT) & MDP5_PIPE_SRC_XY_X__MASK;
 }
 
-static inline uint32_t REG_MDP5_PIPE_OUT_SIZE(enum mdp5_pipe i0) { return 0x0000120c + 0x400*i0; }
+static inline uint32_t REG_MDP5_PIPE_OUT_SIZE(enum mdp5_pipe i0) { return 0x0000000c + __offset_PIPE(i0); }
 #define MDP5_PIPE_OUT_SIZE_HEIGHT__MASK                                0xffff0000
 #define MDP5_PIPE_OUT_SIZE_HEIGHT__SHIFT                       16
 static inline uint32_t MDP5_PIPE_OUT_SIZE_HEIGHT(uint32_t val)
@@ -462,7 +525,7 @@ static inline uint32_t MDP5_PIPE_OUT_SIZE_WIDTH(uint32_t val)
        return ((val) << MDP5_PIPE_OUT_SIZE_WIDTH__SHIFT) & MDP5_PIPE_OUT_SIZE_WIDTH__MASK;
 }
 
-static inline uint32_t REG_MDP5_PIPE_OUT_XY(enum mdp5_pipe i0) { return 0x00001210 + 0x400*i0; }
+static inline uint32_t REG_MDP5_PIPE_OUT_XY(enum mdp5_pipe i0) { return 0x00000010 + __offset_PIPE(i0); }
 #define MDP5_PIPE_OUT_XY_Y__MASK                               0xffff0000
 #define MDP5_PIPE_OUT_XY_Y__SHIFT                              16
 static inline uint32_t MDP5_PIPE_OUT_XY_Y(uint32_t val)
@@ -476,15 +539,15 @@ static inline uint32_t MDP5_PIPE_OUT_XY_X(uint32_t val)
        return ((val) << MDP5_PIPE_OUT_XY_X__SHIFT) & MDP5_PIPE_OUT_XY_X__MASK;
 }
 
-static inline uint32_t REG_MDP5_PIPE_SRC0_ADDR(enum mdp5_pipe i0) { return 0x00001214 + 0x400*i0; }
+static inline uint32_t REG_MDP5_PIPE_SRC0_ADDR(enum mdp5_pipe i0) { return 0x00000014 + __offset_PIPE(i0); }
 
-static inline uint32_t REG_MDP5_PIPE_SRC1_ADDR(enum mdp5_pipe i0) { return 0x00001218 + 0x400*i0; }
+static inline uint32_t REG_MDP5_PIPE_SRC1_ADDR(enum mdp5_pipe i0) { return 0x00000018 + __offset_PIPE(i0); }
 
-static inline uint32_t REG_MDP5_PIPE_SRC2_ADDR(enum mdp5_pipe i0) { return 0x0000121c + 0x400*i0; }
+static inline uint32_t REG_MDP5_PIPE_SRC2_ADDR(enum mdp5_pipe i0) { return 0x0000001c + __offset_PIPE(i0); }
 
-static inline uint32_t REG_MDP5_PIPE_SRC3_ADDR(enum mdp5_pipe i0) { return 0x00001220 + 0x400*i0; }
+static inline uint32_t REG_MDP5_PIPE_SRC3_ADDR(enum mdp5_pipe i0) { return 0x00000020 + __offset_PIPE(i0); }
 
-static inline uint32_t REG_MDP5_PIPE_SRC_STRIDE_A(enum mdp5_pipe i0) { return 0x00001224 + 0x400*i0; }
+static inline uint32_t REG_MDP5_PIPE_SRC_STRIDE_A(enum mdp5_pipe i0) { return 0x00000024 + __offset_PIPE(i0); }
 #define MDP5_PIPE_SRC_STRIDE_A_P0__MASK                                0x0000ffff
 #define MDP5_PIPE_SRC_STRIDE_A_P0__SHIFT                       0
 static inline uint32_t MDP5_PIPE_SRC_STRIDE_A_P0(uint32_t val)
@@ -498,7 +561,7 @@ static inline uint32_t MDP5_PIPE_SRC_STRIDE_A_P1(uint32_t val)
        return ((val) << MDP5_PIPE_SRC_STRIDE_A_P1__SHIFT) & MDP5_PIPE_SRC_STRIDE_A_P1__MASK;
 }
 
-static inline uint32_t REG_MDP5_PIPE_SRC_STRIDE_B(enum mdp5_pipe i0) { return 0x00001228 + 0x400*i0; }
+static inline uint32_t REG_MDP5_PIPE_SRC_STRIDE_B(enum mdp5_pipe i0) { return 0x00000028 + __offset_PIPE(i0); }
 #define MDP5_PIPE_SRC_STRIDE_B_P2__MASK                                0x0000ffff
 #define MDP5_PIPE_SRC_STRIDE_B_P2__SHIFT                       0
 static inline uint32_t MDP5_PIPE_SRC_STRIDE_B_P2(uint32_t val)
@@ -512,9 +575,9 @@ static inline uint32_t MDP5_PIPE_SRC_STRIDE_B_P3(uint32_t val)
        return ((val) << MDP5_PIPE_SRC_STRIDE_B_P3__SHIFT) & MDP5_PIPE_SRC_STRIDE_B_P3__MASK;
 }
 
-static inline uint32_t REG_MDP5_PIPE_STILE_FRAME_SIZE(enum mdp5_pipe i0) { return 0x0000122c + 0x400*i0; }
+static inline uint32_t REG_MDP5_PIPE_STILE_FRAME_SIZE(enum mdp5_pipe i0) { return 0x0000002c + __offset_PIPE(i0); }
 
-static inline uint32_t REG_MDP5_PIPE_SRC_FORMAT(enum mdp5_pipe i0) { return 0x00001230 + 0x400*i0; }
+static inline uint32_t REG_MDP5_PIPE_SRC_FORMAT(enum mdp5_pipe i0) { return 0x00000030 + __offset_PIPE(i0); }
 #define MDP5_PIPE_SRC_FORMAT_G_BPC__MASK                       0x00000003
 #define MDP5_PIPE_SRC_FORMAT_G_BPC__SHIFT                      0
 static inline uint32_t MDP5_PIPE_SRC_FORMAT_G_BPC(enum mdp_bpc val)
@@ -568,7 +631,7 @@ static inline uint32_t MDP5_PIPE_SRC_FORMAT_CHROMA_SAMP(enum mdp5_chroma_samp_ty
        return ((val) << MDP5_PIPE_SRC_FORMAT_CHROMA_SAMP__SHIFT) & MDP5_PIPE_SRC_FORMAT_CHROMA_SAMP__MASK;
 }
 
-static inline uint32_t REG_MDP5_PIPE_SRC_UNPACK(enum mdp5_pipe i0) { return 0x00001234 + 0x400*i0; }
+static inline uint32_t REG_MDP5_PIPE_SRC_UNPACK(enum mdp5_pipe i0) { return 0x00000034 + __offset_PIPE(i0); }
 #define MDP5_PIPE_SRC_UNPACK_ELEM0__MASK                       0x000000ff
 #define MDP5_PIPE_SRC_UNPACK_ELEM0__SHIFT                      0
 static inline uint32_t MDP5_PIPE_SRC_UNPACK_ELEM0(uint32_t val)
@@ -594,7 +657,7 @@ static inline uint32_t MDP5_PIPE_SRC_UNPACK_ELEM3(uint32_t val)
        return ((val) << MDP5_PIPE_SRC_UNPACK_ELEM3__SHIFT) & MDP5_PIPE_SRC_UNPACK_ELEM3__MASK;
 }
 
-static inline uint32_t REG_MDP5_PIPE_SRC_OP_MODE(enum mdp5_pipe i0) { return 0x00001238 + 0x400*i0; }
+static inline uint32_t REG_MDP5_PIPE_SRC_OP_MODE(enum mdp5_pipe i0) { return 0x00000038 + __offset_PIPE(i0); }
 #define MDP5_PIPE_SRC_OP_MODE_BWC_EN                           0x00000001
 #define MDP5_PIPE_SRC_OP_MODE_BWC__MASK                                0x00000006
 #define MDP5_PIPE_SRC_OP_MODE_BWC__SHIFT                       1
@@ -610,29 +673,29 @@ static inline uint32_t MDP5_PIPE_SRC_OP_MODE_BWC(enum mdp5_pipe_bwc val)
 #define MDP5_PIPE_SRC_OP_MODE_DEINTERLACE                      0x00400000
 #define MDP5_PIPE_SRC_OP_MODE_DEINTERLACE_ODD                  0x00800000
 
-static inline uint32_t REG_MDP5_PIPE_SRC_CONSTANT_COLOR(enum mdp5_pipe i0) { return 0x0000123c + 0x400*i0; }
+static inline uint32_t REG_MDP5_PIPE_SRC_CONSTANT_COLOR(enum mdp5_pipe i0) { return 0x0000003c + __offset_PIPE(i0); }
 
-static inline uint32_t REG_MDP5_PIPE_FETCH_CONFIG(enum mdp5_pipe i0) { return 0x00001248 + 0x400*i0; }
+static inline uint32_t REG_MDP5_PIPE_FETCH_CONFIG(enum mdp5_pipe i0) { return 0x00000048 + __offset_PIPE(i0); }
 
-static inline uint32_t REG_MDP5_PIPE_VC1_RANGE(enum mdp5_pipe i0) { return 0x0000124c + 0x400*i0; }
+static inline uint32_t REG_MDP5_PIPE_VC1_RANGE(enum mdp5_pipe i0) { return 0x0000004c + __offset_PIPE(i0); }
 
-static inline uint32_t REG_MDP5_PIPE_REQPRIO_FIFO_WM_0(enum mdp5_pipe i0) { return 0x00001250 + 0x400*i0; }
+static inline uint32_t REG_MDP5_PIPE_REQPRIO_FIFO_WM_0(enum mdp5_pipe i0) { return 0x00000050 + __offset_PIPE(i0); }
 
-static inline uint32_t REG_MDP5_PIPE_REQPRIO_FIFO_WM_1(enum mdp5_pipe i0) { return 0x00001254 + 0x400*i0; }
+static inline uint32_t REG_MDP5_PIPE_REQPRIO_FIFO_WM_1(enum mdp5_pipe i0) { return 0x00000054 + __offset_PIPE(i0); }
 
-static inline uint32_t REG_MDP5_PIPE_REQPRIO_FIFO_WM_2(enum mdp5_pipe i0) { return 0x00001258 + 0x400*i0; }
+static inline uint32_t REG_MDP5_PIPE_REQPRIO_FIFO_WM_2(enum mdp5_pipe i0) { return 0x00000058 + __offset_PIPE(i0); }
 
-static inline uint32_t REG_MDP5_PIPE_SRC_ADDR_SW_STATUS(enum mdp5_pipe i0) { return 0x00001270 + 0x400*i0; }
+static inline uint32_t REG_MDP5_PIPE_SRC_ADDR_SW_STATUS(enum mdp5_pipe i0) { return 0x00000070 + __offset_PIPE(i0); }
 
-static inline uint32_t REG_MDP5_PIPE_CURRENT_SRC0_ADDR(enum mdp5_pipe i0) { return 0x000012a4 + 0x400*i0; }
+static inline uint32_t REG_MDP5_PIPE_CURRENT_SRC0_ADDR(enum mdp5_pipe i0) { return 0x000000a4 + __offset_PIPE(i0); }
 
-static inline uint32_t REG_MDP5_PIPE_CURRENT_SRC1_ADDR(enum mdp5_pipe i0) { return 0x000012a8 + 0x400*i0; }
+static inline uint32_t REG_MDP5_PIPE_CURRENT_SRC1_ADDR(enum mdp5_pipe i0) { return 0x000000a8 + __offset_PIPE(i0); }
 
-static inline uint32_t REG_MDP5_PIPE_CURRENT_SRC2_ADDR(enum mdp5_pipe i0) { return 0x000012ac + 0x400*i0; }
+static inline uint32_t REG_MDP5_PIPE_CURRENT_SRC2_ADDR(enum mdp5_pipe i0) { return 0x000000ac + __offset_PIPE(i0); }
 
-static inline uint32_t REG_MDP5_PIPE_CURRENT_SRC3_ADDR(enum mdp5_pipe i0) { return 0x000012b0 + 0x400*i0; }
+static inline uint32_t REG_MDP5_PIPE_CURRENT_SRC3_ADDR(enum mdp5_pipe i0) { return 0x000000b0 + __offset_PIPE(i0); }
 
-static inline uint32_t REG_MDP5_PIPE_DECIMATION(enum mdp5_pipe i0) { return 0x000012b4 + 0x400*i0; }
+static inline uint32_t REG_MDP5_PIPE_DECIMATION(enum mdp5_pipe i0) { return 0x000000b4 + __offset_PIPE(i0); }
 #define MDP5_PIPE_DECIMATION_VERT__MASK                                0x000000ff
 #define MDP5_PIPE_DECIMATION_VERT__SHIFT                       0
 static inline uint32_t MDP5_PIPE_DECIMATION_VERT(uint32_t val)
@@ -646,7 +709,7 @@ static inline uint32_t MDP5_PIPE_DECIMATION_HORZ(uint32_t val)
        return ((val) << MDP5_PIPE_DECIMATION_HORZ__SHIFT) & MDP5_PIPE_DECIMATION_HORZ__MASK;
 }
 
-static inline uint32_t REG_MDP5_PIPE_SCALE_CONFIG(enum mdp5_pipe i0) { return 0x00001404 + 0x400*i0; }
+static inline uint32_t REG_MDP5_PIPE_SCALE_CONFIG(enum mdp5_pipe i0) { return 0x00000204 + __offset_PIPE(i0); }
 #define MDP5_PIPE_SCALE_CONFIG_SCALEX_EN                       0x00000001
 #define MDP5_PIPE_SCALE_CONFIG_SCALEY_EN                       0x00000002
 #define MDP5_PIPE_SCALE_CONFIG_SCALEX_MIN_FILTER__MASK         0x00000300
@@ -686,23 +749,34 @@ static inline uint32_t MDP5_PIPE_SCALE_CONFIG_SCALEY_MAX_FILTER(enum mdp5_scale_
        return ((val) << MDP5_PIPE_SCALE_CONFIG_SCALEY_MAX_FILTER__SHIFT) & MDP5_PIPE_SCALE_CONFIG_SCALEY_MAX_FILTER__MASK;
 }
 
-static inline uint32_t REG_MDP5_PIPE_SCALE_PHASE_STEP_X(enum mdp5_pipe i0) { return 0x00001410 + 0x400*i0; }
+static inline uint32_t REG_MDP5_PIPE_SCALE_PHASE_STEP_X(enum mdp5_pipe i0) { return 0x00000210 + __offset_PIPE(i0); }
 
-static inline uint32_t REG_MDP5_PIPE_SCALE_PHASE_STEP_Y(enum mdp5_pipe i0) { return 0x00001414 + 0x400*i0; }
+static inline uint32_t REG_MDP5_PIPE_SCALE_PHASE_STEP_Y(enum mdp5_pipe i0) { return 0x00000214 + __offset_PIPE(i0); }
 
-static inline uint32_t REG_MDP5_PIPE_SCALE_INIT_PHASE_X(enum mdp5_pipe i0) { return 0x00001420 + 0x400*i0; }
+static inline uint32_t REG_MDP5_PIPE_SCALE_INIT_PHASE_X(enum mdp5_pipe i0) { return 0x00000220 + __offset_PIPE(i0); }
 
-static inline uint32_t REG_MDP5_PIPE_SCALE_INIT_PHASE_Y(enum mdp5_pipe i0) { return 0x00001424 + 0x400*i0; }
+static inline uint32_t REG_MDP5_PIPE_SCALE_INIT_PHASE_Y(enum mdp5_pipe i0) { return 0x00000224 + __offset_PIPE(i0); }
 
-static inline uint32_t REG_MDP5_LM(uint32_t i0) { return 0x00003200 + 0x400*i0; }
+static inline uint32_t __offset_LM(uint32_t idx)
+{
+       switch (idx) {
+               case 0: return (mdp5_cfg->lm.base[0]);
+               case 1: return (mdp5_cfg->lm.base[1]);
+               case 2: return (mdp5_cfg->lm.base[2]);
+               case 3: return (mdp5_cfg->lm.base[3]);
+               case 4: return (mdp5_cfg->lm.base[4]);
+               default: return INVALID_IDX(idx);
+       }
+}
+static inline uint32_t REG_MDP5_LM(uint32_t i0) { return 0x00000000 + __offset_LM(i0); }
 
-static inline uint32_t REG_MDP5_LM_BLEND_COLOR_OUT(uint32_t i0) { return 0x00003200 + 0x400*i0; }
+static inline uint32_t REG_MDP5_LM_BLEND_COLOR_OUT(uint32_t i0) { return 0x00000000 + __offset_LM(i0); }
 #define MDP5_LM_BLEND_COLOR_OUT_STAGE0_FG_ALPHA                        0x00000002
 #define MDP5_LM_BLEND_COLOR_OUT_STAGE1_FG_ALPHA                        0x00000004
 #define MDP5_LM_BLEND_COLOR_OUT_STAGE2_FG_ALPHA                        0x00000008
 #define MDP5_LM_BLEND_COLOR_OUT_STAGE3_FG_ALPHA                        0x00000010
 
-static inline uint32_t REG_MDP5_LM_OUT_SIZE(uint32_t i0) { return 0x00003204 + 0x400*i0; }
+static inline uint32_t REG_MDP5_LM_OUT_SIZE(uint32_t i0) { return 0x00000004 + __offset_LM(i0); }
 #define MDP5_LM_OUT_SIZE_HEIGHT__MASK                          0xffff0000
 #define MDP5_LM_OUT_SIZE_HEIGHT__SHIFT                         16
 static inline uint32_t MDP5_LM_OUT_SIZE_HEIGHT(uint32_t val)
@@ -716,13 +790,13 @@ static inline uint32_t MDP5_LM_OUT_SIZE_WIDTH(uint32_t val)
        return ((val) << MDP5_LM_OUT_SIZE_WIDTH__SHIFT) & MDP5_LM_OUT_SIZE_WIDTH__MASK;
 }
 
-static inline uint32_t REG_MDP5_LM_BORDER_COLOR_0(uint32_t i0) { return 0x00003208 + 0x400*i0; }
+static inline uint32_t REG_MDP5_LM_BORDER_COLOR_0(uint32_t i0) { return 0x00000008 + __offset_LM(i0); }
 
-static inline uint32_t REG_MDP5_LM_BORDER_COLOR_1(uint32_t i0) { return 0x00003210 + 0x400*i0; }
+static inline uint32_t REG_MDP5_LM_BORDER_COLOR_1(uint32_t i0) { return 0x00000010 + __offset_LM(i0); }
 
-static inline uint32_t REG_MDP5_LM_BLEND(uint32_t i0, uint32_t i1) { return 0x00003220 + 0x400*i0 + 0x30*i1; }
+static inline uint32_t REG_MDP5_LM_BLEND(uint32_t i0, uint32_t i1) { return 0x00000020 + __offset_LM(i0) + 0x30*i1; }
 
-static inline uint32_t REG_MDP5_LM_BLEND_OP_MODE(uint32_t i0, uint32_t i1) { return 0x00003220 + 0x400*i0 + 0x30*i1; }
+static inline uint32_t REG_MDP5_LM_BLEND_OP_MODE(uint32_t i0, uint32_t i1) { return 0x00000020 + __offset_LM(i0) + 0x30*i1; }
 #define MDP5_LM_BLEND_OP_MODE_FG_ALPHA__MASK                   0x00000003
 #define MDP5_LM_BLEND_OP_MODE_FG_ALPHA__SHIFT                  0
 static inline uint32_t MDP5_LM_BLEND_OP_MODE_FG_ALPHA(enum mdp_alpha_type val)
@@ -744,57 +818,67 @@ static inline uint32_t MDP5_LM_BLEND_OP_MODE_BG_ALPHA(enum mdp_alpha_type val)
 #define MDP5_LM_BLEND_OP_MODE_BG_INV_MOD_ALPHA                 0x00001000
 #define MDP5_LM_BLEND_OP_MODE_BG_TRANSP_EN                     0x00002000
 
-static inline uint32_t REG_MDP5_LM_BLEND_FG_ALPHA(uint32_t i0, uint32_t i1) { return 0x00003224 + 0x400*i0 + 0x30*i1; }
+static inline uint32_t REG_MDP5_LM_BLEND_FG_ALPHA(uint32_t i0, uint32_t i1) { return 0x00000024 + __offset_LM(i0) + 0x30*i1; }
 
-static inline uint32_t REG_MDP5_LM_BLEND_BG_ALPHA(uint32_t i0, uint32_t i1) { return 0x00003228 + 0x400*i0 + 0x30*i1; }
+static inline uint32_t REG_MDP5_LM_BLEND_BG_ALPHA(uint32_t i0, uint32_t i1) { return 0x00000028 + __offset_LM(i0) + 0x30*i1; }
 
-static inline uint32_t REG_MDP5_LM_BLEND_FG_TRANSP_LOW0(uint32_t i0, uint32_t i1) { return 0x0000322c + 0x400*i0 + 0x30*i1; }
+static inline uint32_t REG_MDP5_LM_BLEND_FG_TRANSP_LOW0(uint32_t i0, uint32_t i1) { return 0x0000002c + __offset_LM(i0) + 0x30*i1; }
 
-static inline uint32_t REG_MDP5_LM_BLEND_FG_TRANSP_LOW1(uint32_t i0, uint32_t i1) { return 0x00003230 + 0x400*i0 + 0x30*i1; }
+static inline uint32_t REG_MDP5_LM_BLEND_FG_TRANSP_LOW1(uint32_t i0, uint32_t i1) { return 0x00000030 + __offset_LM(i0) + 0x30*i1; }
 
-static inline uint32_t REG_MDP5_LM_BLEND_FG_TRANSP_HIGH0(uint32_t i0, uint32_t i1) { return 0x00003234 + 0x400*i0 + 0x30*i1; }
+static inline uint32_t REG_MDP5_LM_BLEND_FG_TRANSP_HIGH0(uint32_t i0, uint32_t i1) { return 0x00000034 + __offset_LM(i0) + 0x30*i1; }
 
-static inline uint32_t REG_MDP5_LM_BLEND_FG_TRANSP_HIGH1(uint32_t i0, uint32_t i1) { return 0x00003238 + 0x400*i0 + 0x30*i1; }
+static inline uint32_t REG_MDP5_LM_BLEND_FG_TRANSP_HIGH1(uint32_t i0, uint32_t i1) { return 0x00000038 + __offset_LM(i0) + 0x30*i1; }
 
-static inline uint32_t REG_MDP5_LM_BLEND_BG_TRANSP_LOW0(uint32_t i0, uint32_t i1) { return 0x0000323c + 0x400*i0 + 0x30*i1; }
+static inline uint32_t REG_MDP5_LM_BLEND_BG_TRANSP_LOW0(uint32_t i0, uint32_t i1) { return 0x0000003c + __offset_LM(i0) + 0x30*i1; }
 
-static inline uint32_t REG_MDP5_LM_BLEND_BG_TRANSP_LOW1(uint32_t i0, uint32_t i1) { return 0x00003240 + 0x400*i0 + 0x30*i1; }
+static inline uint32_t REG_MDP5_LM_BLEND_BG_TRANSP_LOW1(uint32_t i0, uint32_t i1) { return 0x00000040 + __offset_LM(i0) + 0x30*i1; }
 
-static inline uint32_t REG_MDP5_LM_BLEND_BG_TRANSP_HIGH0(uint32_t i0, uint32_t i1) { return 0x00003244 + 0x400*i0 + 0x30*i1; }
+static inline uint32_t REG_MDP5_LM_BLEND_BG_TRANSP_HIGH0(uint32_t i0, uint32_t i1) { return 0x00000044 + __offset_LM(i0) + 0x30*i1; }
 
-static inline uint32_t REG_MDP5_LM_BLEND_BG_TRANSP_HIGH1(uint32_t i0, uint32_t i1) { return 0x00003248 + 0x400*i0 + 0x30*i1; }
+static inline uint32_t REG_MDP5_LM_BLEND_BG_TRANSP_HIGH1(uint32_t i0, uint32_t i1) { return 0x00000048 + __offset_LM(i0) + 0x30*i1; }
 
-static inline uint32_t REG_MDP5_LM_CURSOR_IMG_SIZE(uint32_t i0) { return 0x000032e0 + 0x400*i0; }
+static inline uint32_t REG_MDP5_LM_CURSOR_IMG_SIZE(uint32_t i0) { return 0x000000e0 + __offset_LM(i0); }
 
-static inline uint32_t REG_MDP5_LM_CURSOR_SIZE(uint32_t i0) { return 0x000032e4 + 0x400*i0; }
+static inline uint32_t REG_MDP5_LM_CURSOR_SIZE(uint32_t i0) { return 0x000000e4 + __offset_LM(i0); }
 
-static inline uint32_t REG_MDP5_LM_CURSOR_XY(uint32_t i0) { return 0x000032e8 + 0x400*i0; }
+static inline uint32_t REG_MDP5_LM_CURSOR_XY(uint32_t i0) { return 0x000000e8 + __offset_LM(i0); }
 
-static inline uint32_t REG_MDP5_LM_CURSOR_STRIDE(uint32_t i0) { return 0x000032dc + 0x400*i0; }
+static inline uint32_t REG_MDP5_LM_CURSOR_STRIDE(uint32_t i0) { return 0x000000dc + __offset_LM(i0); }
 
-static inline uint32_t REG_MDP5_LM_CURSOR_FORMAT(uint32_t i0) { return 0x000032ec + 0x400*i0; }
+static inline uint32_t REG_MDP5_LM_CURSOR_FORMAT(uint32_t i0) { return 0x000000ec + __offset_LM(i0); }
 
-static inline uint32_t REG_MDP5_LM_CURSOR_BASE_ADDR(uint32_t i0) { return 0x000032f0 + 0x400*i0; }
+static inline uint32_t REG_MDP5_LM_CURSOR_BASE_ADDR(uint32_t i0) { return 0x000000f0 + __offset_LM(i0); }
 
-static inline uint32_t REG_MDP5_LM_CURSOR_START_XY(uint32_t i0) { return 0x000032f4 + 0x400*i0; }
+static inline uint32_t REG_MDP5_LM_CURSOR_START_XY(uint32_t i0) { return 0x000000f4 + __offset_LM(i0); }
 
-static inline uint32_t REG_MDP5_LM_CURSOR_BLEND_CONFIG(uint32_t i0) { return 0x000032f8 + 0x400*i0; }
+static inline uint32_t REG_MDP5_LM_CURSOR_BLEND_CONFIG(uint32_t i0) { return 0x000000f8 + __offset_LM(i0); }
 
-static inline uint32_t REG_MDP5_LM_CURSOR_BLEND_PARAM(uint32_t i0) { return 0x000032fc + 0x400*i0; }
+static inline uint32_t REG_MDP5_LM_CURSOR_BLEND_PARAM(uint32_t i0) { return 0x000000fc + __offset_LM(i0); }
 
-static inline uint32_t REG_MDP5_LM_CURSOR_BLEND_TRANSP_LOW0(uint32_t i0) { return 0x00003300 + 0x400*i0; }
+static inline uint32_t REG_MDP5_LM_CURSOR_BLEND_TRANSP_LOW0(uint32_t i0) { return 0x00000100 + __offset_LM(i0); }
 
-static inline uint32_t REG_MDP5_LM_CURSOR_BLEND_TRANSP_LOW1(uint32_t i0) { return 0x00003304 + 0x400*i0; }
+static inline uint32_t REG_MDP5_LM_CURSOR_BLEND_TRANSP_LOW1(uint32_t i0) { return 0x00000104 + __offset_LM(i0); }
 
-static inline uint32_t REG_MDP5_LM_CURSOR_BLEND_TRANSP_HIGH0(uint32_t i0) { return 0x00003308 + 0x400*i0; }
+static inline uint32_t REG_MDP5_LM_CURSOR_BLEND_TRANSP_HIGH0(uint32_t i0) { return 0x00000108 + __offset_LM(i0); }
 
-static inline uint32_t REG_MDP5_LM_CURSOR_BLEND_TRANSP_HIGH1(uint32_t i0) { return 0x0000330c + 0x400*i0; }
+static inline uint32_t REG_MDP5_LM_CURSOR_BLEND_TRANSP_HIGH1(uint32_t i0) { return 0x0000010c + __offset_LM(i0); }
 
-static inline uint32_t REG_MDP5_LM_GC_LUT_BASE(uint32_t i0) { return 0x00003310 + 0x400*i0; }
+static inline uint32_t REG_MDP5_LM_GC_LUT_BASE(uint32_t i0) { return 0x00000110 + __offset_LM(i0); }
 
-static inline uint32_t REG_MDP5_DSPP(uint32_t i0) { return 0x00004600 + 0x400*i0; }
+static inline uint32_t __offset_DSPP(uint32_t idx)
+{
+       switch (idx) {
+               case 0: return (mdp5_cfg->dspp.base[0]);
+               case 1: return (mdp5_cfg->dspp.base[1]);
+               case 2: return (mdp5_cfg->dspp.base[2]);
+               case 3: return (mdp5_cfg->dspp.base[3]);
+               default: return INVALID_IDX(idx);
+       }
+}
+static inline uint32_t REG_MDP5_DSPP(uint32_t i0) { return 0x00000000 + __offset_DSPP(i0); }
 
-static inline uint32_t REG_MDP5_DSPP_OP_MODE(uint32_t i0) { return 0x00004600 + 0x400*i0; }
+static inline uint32_t REG_MDP5_DSPP_OP_MODE(uint32_t i0) { return 0x00000000 + __offset_DSPP(i0); }
 #define MDP5_DSPP_OP_MODE_IGC_LUT_EN                           0x00000001
 #define MDP5_DSPP_OP_MODE_IGC_TBL_IDX__MASK                    0x0000000e
 #define MDP5_DSPP_OP_MODE_IGC_TBL_IDX__SHIFT                   1
@@ -811,29 +895,40 @@ static inline uint32_t MDP5_DSPP_OP_MODE_IGC_TBL_IDX(uint32_t val)
 #define MDP5_DSPP_OP_MODE_GAMUT_EN                             0x00800000
 #define MDP5_DSPP_OP_MODE_GAMUT_ORDER                          0x01000000
 
-static inline uint32_t REG_MDP5_DSPP_PCC_BASE(uint32_t i0) { return 0x00004630 + 0x400*i0; }
+static inline uint32_t REG_MDP5_DSPP_PCC_BASE(uint32_t i0) { return 0x00000030 + __offset_DSPP(i0); }
 
-static inline uint32_t REG_MDP5_DSPP_DITHER_DEPTH(uint32_t i0) { return 0x00004750 + 0x400*i0; }
+static inline uint32_t REG_MDP5_DSPP_DITHER_DEPTH(uint32_t i0) { return 0x00000150 + __offset_DSPP(i0); }
 
-static inline uint32_t REG_MDP5_DSPP_HIST_CTL_BASE(uint32_t i0) { return 0x00004810 + 0x400*i0; }
+static inline uint32_t REG_MDP5_DSPP_HIST_CTL_BASE(uint32_t i0) { return 0x00000210 + __offset_DSPP(i0); }
 
-static inline uint32_t REG_MDP5_DSPP_HIST_LUT_BASE(uint32_t i0) { return 0x00004830 + 0x400*i0; }
+static inline uint32_t REG_MDP5_DSPP_HIST_LUT_BASE(uint32_t i0) { return 0x00000230 + __offset_DSPP(i0); }
 
-static inline uint32_t REG_MDP5_DSPP_HIST_LUT_SWAP(uint32_t i0) { return 0x00004834 + 0x400*i0; }
+static inline uint32_t REG_MDP5_DSPP_HIST_LUT_SWAP(uint32_t i0) { return 0x00000234 + __offset_DSPP(i0); }
 
-static inline uint32_t REG_MDP5_DSPP_PA_BASE(uint32_t i0) { return 0x00004838 + 0x400*i0; }
+static inline uint32_t REG_MDP5_DSPP_PA_BASE(uint32_t i0) { return 0x00000238 + __offset_DSPP(i0); }
 
-static inline uint32_t REG_MDP5_DSPP_GAMUT_BASE(uint32_t i0) { return 0x000048dc + 0x400*i0; }
+static inline uint32_t REG_MDP5_DSPP_GAMUT_BASE(uint32_t i0) { return 0x000002dc + __offset_DSPP(i0); }
 
-static inline uint32_t REG_MDP5_DSPP_GC_BASE(uint32_t i0) { return 0x000048b0 + 0x400*i0; }
+static inline uint32_t REG_MDP5_DSPP_GC_BASE(uint32_t i0) { return 0x000002b0 + __offset_DSPP(i0); }
 
-static inline uint32_t REG_MDP5_INTF(uint32_t i0) { return 0x00012500 + 0x200*i0; }
+static inline uint32_t __offset_INTF(uint32_t idx)
+{
+       switch (idx) {
+               case 0: return (mdp5_cfg->intf.base[0]);
+               case 1: return (mdp5_cfg->intf.base[1]);
+               case 2: return (mdp5_cfg->intf.base[2]);
+               case 3: return (mdp5_cfg->intf.base[3]);
+               case 4: return (mdp5_cfg->intf.base[4]);
+               default: return INVALID_IDX(idx);
+       }
+}
+static inline uint32_t REG_MDP5_INTF(uint32_t i0) { return 0x00000000 + __offset_INTF(i0); }
 
-static inline uint32_t REG_MDP5_INTF_TIMING_ENGINE_EN(uint32_t i0) { return 0x00012500 + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_TIMING_ENGINE_EN(uint32_t i0) { return 0x00000000 + __offset_INTF(i0); }
 
-static inline uint32_t REG_MDP5_INTF_CONFIG(uint32_t i0) { return 0x00012504 + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_CONFIG(uint32_t i0) { return 0x00000004 + __offset_INTF(i0); }
 
-static inline uint32_t REG_MDP5_INTF_HSYNC_CTL(uint32_t i0) { return 0x00012508 + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_HSYNC_CTL(uint32_t i0) { return 0x00000008 + __offset_INTF(i0); }
 #define MDP5_INTF_HSYNC_CTL_PULSEW__MASK                       0x0000ffff
 #define MDP5_INTF_HSYNC_CTL_PULSEW__SHIFT                      0
 static inline uint32_t MDP5_INTF_HSYNC_CTL_PULSEW(uint32_t val)
@@ -847,23 +942,23 @@ static inline uint32_t MDP5_INTF_HSYNC_CTL_PERIOD(uint32_t val)
        return ((val) << MDP5_INTF_HSYNC_CTL_PERIOD__SHIFT) & MDP5_INTF_HSYNC_CTL_PERIOD__MASK;
 }
 
-static inline uint32_t REG_MDP5_INTF_VSYNC_PERIOD_F0(uint32_t i0) { return 0x0001250c + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_VSYNC_PERIOD_F0(uint32_t i0) { return 0x0000000c + __offset_INTF(i0); }
 
-static inline uint32_t REG_MDP5_INTF_VSYNC_PERIOD_F1(uint32_t i0) { return 0x00012510 + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_VSYNC_PERIOD_F1(uint32_t i0) { return 0x00000010 + __offset_INTF(i0); }
 
-static inline uint32_t REG_MDP5_INTF_VSYNC_LEN_F0(uint32_t i0) { return 0x00012514 + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_VSYNC_LEN_F0(uint32_t i0) { return 0x00000014 + __offset_INTF(i0); }
 
-static inline uint32_t REG_MDP5_INTF_VSYNC_LEN_F1(uint32_t i0) { return 0x00012518 + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_VSYNC_LEN_F1(uint32_t i0) { return 0x00000018 + __offset_INTF(i0); }
 
-static inline uint32_t REG_MDP5_INTF_DISPLAY_VSTART_F0(uint32_t i0) { return 0x0001251c + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_DISPLAY_VSTART_F0(uint32_t i0) { return 0x0000001c + __offset_INTF(i0); }
 
-static inline uint32_t REG_MDP5_INTF_DISPLAY_VSTART_F1(uint32_t i0) { return 0x00012520 + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_DISPLAY_VSTART_F1(uint32_t i0) { return 0x00000020 + __offset_INTF(i0); }
 
-static inline uint32_t REG_MDP5_INTF_DISPLAY_VEND_F0(uint32_t i0) { return 0x00012524 + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_DISPLAY_VEND_F0(uint32_t i0) { return 0x00000024 + __offset_INTF(i0); }
 
-static inline uint32_t REG_MDP5_INTF_DISPLAY_VEND_F1(uint32_t i0) { return 0x00012528 + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_DISPLAY_VEND_F1(uint32_t i0) { return 0x00000028 + __offset_INTF(i0); }
 
-static inline uint32_t REG_MDP5_INTF_ACTIVE_VSTART_F0(uint32_t i0) { return 0x0001252c + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_ACTIVE_VSTART_F0(uint32_t i0) { return 0x0000002c + __offset_INTF(i0); }
 #define MDP5_INTF_ACTIVE_VSTART_F0_VAL__MASK                   0x7fffffff
 #define MDP5_INTF_ACTIVE_VSTART_F0_VAL__SHIFT                  0
 static inline uint32_t MDP5_INTF_ACTIVE_VSTART_F0_VAL(uint32_t val)
@@ -872,7 +967,7 @@ static inline uint32_t MDP5_INTF_ACTIVE_VSTART_F0_VAL(uint32_t val)
 }
 #define MDP5_INTF_ACTIVE_VSTART_F0_ACTIVE_V_ENABLE             0x80000000
 
-static inline uint32_t REG_MDP5_INTF_ACTIVE_VSTART_F1(uint32_t i0) { return 0x00012530 + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_ACTIVE_VSTART_F1(uint32_t i0) { return 0x00000030 + __offset_INTF(i0); }
 #define MDP5_INTF_ACTIVE_VSTART_F1_VAL__MASK                   0x7fffffff
 #define MDP5_INTF_ACTIVE_VSTART_F1_VAL__SHIFT                  0
 static inline uint32_t MDP5_INTF_ACTIVE_VSTART_F1_VAL(uint32_t val)
@@ -880,11 +975,11 @@ static inline uint32_t MDP5_INTF_ACTIVE_VSTART_F1_VAL(uint32_t val)
        return ((val) << MDP5_INTF_ACTIVE_VSTART_F1_VAL__SHIFT) & MDP5_INTF_ACTIVE_VSTART_F1_VAL__MASK;
 }
 
-static inline uint32_t REG_MDP5_INTF_ACTIVE_VEND_F0(uint32_t i0) { return 0x00012534 + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_ACTIVE_VEND_F0(uint32_t i0) { return 0x00000034 + __offset_INTF(i0); }
 
-static inline uint32_t REG_MDP5_INTF_ACTIVE_VEND_F1(uint32_t i0) { return 0x00012538 + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_ACTIVE_VEND_F1(uint32_t i0) { return 0x00000038 + __offset_INTF(i0); }
 
-static inline uint32_t REG_MDP5_INTF_DISPLAY_HCTL(uint32_t i0) { return 0x0001253c + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_DISPLAY_HCTL(uint32_t i0) { return 0x0000003c + __offset_INTF(i0); }
 #define MDP5_INTF_DISPLAY_HCTL_START__MASK                     0x0000ffff
 #define MDP5_INTF_DISPLAY_HCTL_START__SHIFT                    0
 static inline uint32_t MDP5_INTF_DISPLAY_HCTL_START(uint32_t val)
@@ -898,7 +993,7 @@ static inline uint32_t MDP5_INTF_DISPLAY_HCTL_END(uint32_t val)
        return ((val) << MDP5_INTF_DISPLAY_HCTL_END__SHIFT) & MDP5_INTF_DISPLAY_HCTL_END__MASK;
 }
 
-static inline uint32_t REG_MDP5_INTF_ACTIVE_HCTL(uint32_t i0) { return 0x00012540 + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_ACTIVE_HCTL(uint32_t i0) { return 0x00000040 + __offset_INTF(i0); }
 #define MDP5_INTF_ACTIVE_HCTL_START__MASK                      0x00007fff
 #define MDP5_INTF_ACTIVE_HCTL_START__SHIFT                     0
 static inline uint32_t MDP5_INTF_ACTIVE_HCTL_START(uint32_t val)
@@ -913,124 +1008,132 @@ static inline uint32_t MDP5_INTF_ACTIVE_HCTL_END(uint32_t val)
 }
 #define MDP5_INTF_ACTIVE_HCTL_ACTIVE_H_ENABLE                  0x80000000
 
-static inline uint32_t REG_MDP5_INTF_BORDER_COLOR(uint32_t i0) { return 0x00012544 + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_BORDER_COLOR(uint32_t i0) { return 0x00000044 + __offset_INTF(i0); }
 
-static inline uint32_t REG_MDP5_INTF_UNDERFLOW_COLOR(uint32_t i0) { return 0x00012548 + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_UNDERFLOW_COLOR(uint32_t i0) { return 0x00000048 + __offset_INTF(i0); }
 
-static inline uint32_t REG_MDP5_INTF_HSYNC_SKEW(uint32_t i0) { return 0x0001254c + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_HSYNC_SKEW(uint32_t i0) { return 0x0000004c + __offset_INTF(i0); }
 
-static inline uint32_t REG_MDP5_INTF_POLARITY_CTL(uint32_t i0) { return 0x00012550 + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_POLARITY_CTL(uint32_t i0) { return 0x00000050 + __offset_INTF(i0); }
 #define MDP5_INTF_POLARITY_CTL_HSYNC_LOW                       0x00000001
 #define MDP5_INTF_POLARITY_CTL_VSYNC_LOW                       0x00000002
 #define MDP5_INTF_POLARITY_CTL_DATA_EN_LOW                     0x00000004
 
-static inline uint32_t REG_MDP5_INTF_TEST_CTL(uint32_t i0) { return 0x00012554 + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_TEST_CTL(uint32_t i0) { return 0x00000054 + __offset_INTF(i0); }
 
-static inline uint32_t REG_MDP5_INTF_TP_COLOR0(uint32_t i0) { return 0x00012558 + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_TP_COLOR0(uint32_t i0) { return 0x00000058 + __offset_INTF(i0); }
 
-static inline uint32_t REG_MDP5_INTF_TP_COLOR1(uint32_t i0) { return 0x0001255c + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_TP_COLOR1(uint32_t i0) { return 0x0000005c + __offset_INTF(i0); }
 
-static inline uint32_t REG_MDP5_INTF_DSI_CMD_MODE_TRIGGER_EN(uint32_t i0) { return 0x00012584 + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_DSI_CMD_MODE_TRIGGER_EN(uint32_t i0) { return 0x00000084 + __offset_INTF(i0); }
 
-static inline uint32_t REG_MDP5_INTF_PANEL_FORMAT(uint32_t i0) { return 0x00012590 + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_PANEL_FORMAT(uint32_t i0) { return 0x00000090 + __offset_INTF(i0); }
 
-static inline uint32_t REG_MDP5_INTF_FRAME_LINE_COUNT_EN(uint32_t i0) { return 0x000125a8 + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_FRAME_LINE_COUNT_EN(uint32_t i0) { return 0x000000a8 + __offset_INTF(i0); }
 
-static inline uint32_t REG_MDP5_INTF_FRAME_COUNT(uint32_t i0) { return 0x000125ac + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_FRAME_COUNT(uint32_t i0) { return 0x000000ac + __offset_INTF(i0); }
 
-static inline uint32_t REG_MDP5_INTF_LINE_COUNT(uint32_t i0) { return 0x000125b0 + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_LINE_COUNT(uint32_t i0) { return 0x000000b0 + __offset_INTF(i0); }
 
-static inline uint32_t REG_MDP5_INTF_DEFLICKER_CONFIG(uint32_t i0) { return 0x000125f0 + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_DEFLICKER_CONFIG(uint32_t i0) { return 0x000000f0 + __offset_INTF(i0); }
 
-static inline uint32_t REG_MDP5_INTF_DEFLICKER_STRNG_COEFF(uint32_t i0) { return 0x000125f4 + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_DEFLICKER_STRNG_COEFF(uint32_t i0) { return 0x000000f4 + __offset_INTF(i0); }
 
-static inline uint32_t REG_MDP5_INTF_DEFLICKER_WEAK_COEFF(uint32_t i0) { return 0x000125f8 + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_DEFLICKER_WEAK_COEFF(uint32_t i0) { return 0x000000f8 + __offset_INTF(i0); }
 
-static inline uint32_t REG_MDP5_INTF_TPG_ENABLE(uint32_t i0) { return 0x00012600 + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_TPG_ENABLE(uint32_t i0) { return 0x00000100 + __offset_INTF(i0); }
 
-static inline uint32_t REG_MDP5_INTF_TPG_MAIN_CONTROL(uint32_t i0) { return 0x00012604 + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_TPG_MAIN_CONTROL(uint32_t i0) { return 0x00000104 + __offset_INTF(i0); }
 
-static inline uint32_t REG_MDP5_INTF_TPG_VIDEO_CONFIG(uint32_t i0) { return 0x00012608 + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_TPG_VIDEO_CONFIG(uint32_t i0) { return 0x00000108 + __offset_INTF(i0); }
 
-static inline uint32_t REG_MDP5_INTF_TPG_COMPONENT_LIMITS(uint32_t i0) { return 0x0001260c + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_TPG_COMPONENT_LIMITS(uint32_t i0) { return 0x0000010c + __offset_INTF(i0); }
 
-static inline uint32_t REG_MDP5_INTF_TPG_RECTANGLE(uint32_t i0) { return 0x00012610 + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_TPG_RECTANGLE(uint32_t i0) { return 0x00000110 + __offset_INTF(i0); }
 
-static inline uint32_t REG_MDP5_INTF_TPG_INITIAL_VALUE(uint32_t i0) { return 0x00012614 + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_TPG_INITIAL_VALUE(uint32_t i0) { return 0x00000114 + __offset_INTF(i0); }
 
-static inline uint32_t REG_MDP5_INTF_TPG_BLK_WHITE_PATTERN_FRAME(uint32_t i0) { return 0x00012618 + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_TPG_BLK_WHITE_PATTERN_FRAME(uint32_t i0) { return 0x00000118 + __offset_INTF(i0); }
 
-static inline uint32_t REG_MDP5_INTF_TPG_RGB_MAPPING(uint32_t i0) { return 0x0001261c + 0x200*i0; }
+static inline uint32_t REG_MDP5_INTF_TPG_RGB_MAPPING(uint32_t i0) { return 0x0000011c + __offset_INTF(i0); }
 
-static inline uint32_t REG_MDP5_AD(uint32_t i0) { return 0x00013100 + 0x200*i0; }
+static inline uint32_t __offset_AD(uint32_t idx)
+{
+       switch (idx) {
+               case 0: return (mdp5_cfg->ad.base[0]);
+               case 1: return (mdp5_cfg->ad.base[1]);
+               default: return INVALID_IDX(idx);
+       }
+}
+static inline uint32_t REG_MDP5_AD(uint32_t i0) { return 0x00000000 + __offset_AD(i0); }
 
-static inline uint32_t REG_MDP5_AD_BYPASS(uint32_t i0) { return 0x00013100 + 0x200*i0; }
+static inline uint32_t REG_MDP5_AD_BYPASS(uint32_t i0) { return 0x00000000 + __offset_AD(i0); }
 
-static inline uint32_t REG_MDP5_AD_CTRL_0(uint32_t i0) { return 0x00013104 + 0x200*i0; }
+static inline uint32_t REG_MDP5_AD_CTRL_0(uint32_t i0) { return 0x00000004 + __offset_AD(i0); }
 
-static inline uint32_t REG_MDP5_AD_CTRL_1(uint32_t i0) { return 0x00013108 + 0x200*i0; }
+static inline uint32_t REG_MDP5_AD_CTRL_1(uint32_t i0) { return 0x00000008 + __offset_AD(i0); }
 
-static inline uint32_t REG_MDP5_AD_FRAME_SIZE(uint32_t i0) { return 0x0001310c + 0x200*i0; }
+static inline uint32_t REG_MDP5_AD_FRAME_SIZE(uint32_t i0) { return 0x0000000c + __offset_AD(i0); }
 
-static inline uint32_t REG_MDP5_AD_CON_CTRL_0(uint32_t i0) { return 0x00013110 + 0x200*i0; }
+static inline uint32_t REG_MDP5_AD_CON_CTRL_0(uint32_t i0) { return 0x00000010 + __offset_AD(i0); }
 
-static inline uint32_t REG_MDP5_AD_CON_CTRL_1(uint32_t i0) { return 0x00013114 + 0x200*i0; }
+static inline uint32_t REG_MDP5_AD_CON_CTRL_1(uint32_t i0) { return 0x00000014 + __offset_AD(i0); }
 
-static inline uint32_t REG_MDP5_AD_STR_MAN(uint32_t i0) { return 0x00013118 + 0x200*i0; }
+static inline uint32_t REG_MDP5_AD_STR_MAN(uint32_t i0) { return 0x00000018 + __offset_AD(i0); }
 
-static inline uint32_t REG_MDP5_AD_VAR(uint32_t i0) { return 0x0001311c + 0x200*i0; }
+static inline uint32_t REG_MDP5_AD_VAR(uint32_t i0) { return 0x0000001c + __offset_AD(i0); }
 
-static inline uint32_t REG_MDP5_AD_DITH(uint32_t i0) { return 0x00013120 + 0x200*i0; }
+static inline uint32_t REG_MDP5_AD_DITH(uint32_t i0) { return 0x00000020 + __offset_AD(i0); }
 
-static inline uint32_t REG_MDP5_AD_DITH_CTRL(uint32_t i0) { return 0x00013124 + 0x200*i0; }
+static inline uint32_t REG_MDP5_AD_DITH_CTRL(uint32_t i0) { return 0x00000024 + __offset_AD(i0); }
 
-static inline uint32_t REG_MDP5_AD_AMP_LIM(uint32_t i0) { return 0x00013128 + 0x200*i0; }
+static inline uint32_t REG_MDP5_AD_AMP_LIM(uint32_t i0) { return 0x00000028 + __offset_AD(i0); }
 
-static inline uint32_t REG_MDP5_AD_SLOPE(uint32_t i0) { return 0x0001312c + 0x200*i0; }
+static inline uint32_t REG_MDP5_AD_SLOPE(uint32_t i0) { return 0x0000002c + __offset_AD(i0); }
 
-static inline uint32_t REG_MDP5_AD_BW_LVL(uint32_t i0) { return 0x00013130 + 0x200*i0; }
+static inline uint32_t REG_MDP5_AD_BW_LVL(uint32_t i0) { return 0x00000030 + __offset_AD(i0); }
 
-static inline uint32_t REG_MDP5_AD_LOGO_POS(uint32_t i0) { return 0x00013134 + 0x200*i0; }
+static inline uint32_t REG_MDP5_AD_LOGO_POS(uint32_t i0) { return 0x00000034 + __offset_AD(i0); }
 
-static inline uint32_t REG_MDP5_AD_LUT_FI(uint32_t i0) { return 0x00013138 + 0x200*i0; }
+static inline uint32_t REG_MDP5_AD_LUT_FI(uint32_t i0) { return 0x00000038 + __offset_AD(i0); }
 
-static inline uint32_t REG_MDP5_AD_LUT_CC(uint32_t i0) { return 0x0001317c + 0x200*i0; }
+static inline uint32_t REG_MDP5_AD_LUT_CC(uint32_t i0) { return 0x0000007c + __offset_AD(i0); }
 
-static inline uint32_t REG_MDP5_AD_STR_LIM(uint32_t i0) { return 0x000131c8 + 0x200*i0; }
+static inline uint32_t REG_MDP5_AD_STR_LIM(uint32_t i0) { return 0x000000c8 + __offset_AD(i0); }
 
-static inline uint32_t REG_MDP5_AD_CALIB_AB(uint32_t i0) { return 0x000131cc + 0x200*i0; }
+static inline uint32_t REG_MDP5_AD_CALIB_AB(uint32_t i0) { return 0x000000cc + __offset_AD(i0); }
 
-static inline uint32_t REG_MDP5_AD_CALIB_CD(uint32_t i0) { return 0x000131d0 + 0x200*i0; }
+static inline uint32_t REG_MDP5_AD_CALIB_CD(uint32_t i0) { return 0x000000d0 + __offset_AD(i0); }
 
-static inline uint32_t REG_MDP5_AD_MODE_SEL(uint32_t i0) { return 0x000131d4 + 0x200*i0; }
+static inline uint32_t REG_MDP5_AD_MODE_SEL(uint32_t i0) { return 0x000000d4 + __offset_AD(i0); }
 
-static inline uint32_t REG_MDP5_AD_TFILT_CTRL(uint32_t i0) { return 0x000131d8 + 0x200*i0; }
+static inline uint32_t REG_MDP5_AD_TFILT_CTRL(uint32_t i0) { return 0x000000d8 + __offset_AD(i0); }
 
-static inline uint32_t REG_MDP5_AD_BL_MINMAX(uint32_t i0) { return 0x000131dc + 0x200*i0; }
+static inline uint32_t REG_MDP5_AD_BL_MINMAX(uint32_t i0) { return 0x000000dc + __offset_AD(i0); }
 
-static inline uint32_t REG_MDP5_AD_BL(uint32_t i0) { return 0x000131e0 + 0x200*i0; }
+static inline uint32_t REG_MDP5_AD_BL(uint32_t i0) { return 0x000000e0 + __offset_AD(i0); }
 
-static inline uint32_t REG_MDP5_AD_BL_MAX(uint32_t i0) { return 0x000131e8 + 0x200*i0; }
+static inline uint32_t REG_MDP5_AD_BL_MAX(uint32_t i0) { return 0x000000e8 + __offset_AD(i0); }
 
-static inline uint32_t REG_MDP5_AD_AL(uint32_t i0) { return 0x000131ec + 0x200*i0; }
+static inline uint32_t REG_MDP5_AD_AL(uint32_t i0) { return 0x000000ec + __offset_AD(i0); }
 
-static inline uint32_t REG_MDP5_AD_AL_MIN(uint32_t i0) { return 0x000131f0 + 0x200*i0; }
+static inline uint32_t REG_MDP5_AD_AL_MIN(uint32_t i0) { return 0x000000f0 + __offset_AD(i0); }
 
-static inline uint32_t REG_MDP5_AD_AL_FILT(uint32_t i0) { return 0x000131f4 + 0x200*i0; }
+static inline uint32_t REG_MDP5_AD_AL_FILT(uint32_t i0) { return 0x000000f4 + __offset_AD(i0); }
 
-static inline uint32_t REG_MDP5_AD_CFG_BUF(uint32_t i0) { return 0x000131f8 + 0x200*i0; }
+static inline uint32_t REG_MDP5_AD_CFG_BUF(uint32_t i0) { return 0x000000f8 + __offset_AD(i0); }
 
-static inline uint32_t REG_MDP5_AD_LUT_AL(uint32_t i0) { return 0x00013200 + 0x200*i0; }
+static inline uint32_t REG_MDP5_AD_LUT_AL(uint32_t i0) { return 0x00000100 + __offset_AD(i0); }
 
-static inline uint32_t REG_MDP5_AD_TARG_STR(uint32_t i0) { return 0x00013244 + 0x200*i0; }
+static inline uint32_t REG_MDP5_AD_TARG_STR(uint32_t i0) { return 0x00000144 + __offset_AD(i0); }
 
-static inline uint32_t REG_MDP5_AD_START_CALC(uint32_t i0) { return 0x00013248 + 0x200*i0; }
+static inline uint32_t REG_MDP5_AD_START_CALC(uint32_t i0) { return 0x00000148 + __offset_AD(i0); }
 
-static inline uint32_t REG_MDP5_AD_STR_OUT(uint32_t i0) { return 0x0001324c + 0x200*i0; }
+static inline uint32_t REG_MDP5_AD_STR_OUT(uint32_t i0) { return 0x0000014c + __offset_AD(i0); }
 
-static inline uint32_t REG_MDP5_AD_BL_OUT(uint32_t i0) { return 0x00013254 + 0x200*i0; }
+static inline uint32_t REG_MDP5_AD_BL_OUT(uint32_t i0) { return 0x00000154 + __offset_AD(i0); }
 
-static inline uint32_t REG_MDP5_AD_CALC_DONE(uint32_t i0) { return 0x00013258 + 0x200*i0; }
+static inline uint32_t REG_MDP5_AD_CALC_DONE(uint32_t i0) { return 0x00000158 + __offset_AD(i0); }
 
 
 #endif /* MDP5_XML */
index 71510ee26e965ffa6af6605c23dd279333ecf4b2..31a2c6331a1d5a47c57bb36e1a30482b67615e50 100644 (file)
@@ -26,14 +26,98 @@ static const char *iommu_ports[] = {
 
 static struct mdp5_platform_config *mdp5_get_config(struct platform_device *dev);
 
-static int mdp5_hw_init(struct msm_kms *kms)
+const struct mdp5_config *mdp5_cfg;
+
+static const struct mdp5_config msm8x74_config = {
+       .name = "msm8x74",
+       .ctl = {
+               .count = 5,
+               .base = { 0x00600, 0x00700, 0x00800, 0x00900, 0x00a00 },
+       },
+       .pipe_vig = {
+               .count = 3,
+               .base = { 0x01200, 0x01600, 0x01a00 },
+       },
+       .pipe_rgb = {
+               .count = 3,
+               .base = { 0x01e00, 0x02200, 0x02600 },
+       },
+       .pipe_dma = {
+               .count = 2,
+               .base = { 0x02a00, 0x02e00 },
+       },
+       .lm = {
+               .count = 5,
+               .base = { 0x03200, 0x03600, 0x03a00, 0x03e00, 0x04200 },
+       },
+       .dspp = {
+               .count = 3,
+               .base = { 0x04600, 0x04a00, 0x04e00 },
+       },
+       .ad = {
+               .count = 2,
+               .base = { 0x13100, 0x13300 }, /* NOTE: no ad in v1.0 */
+       },
+       .intf = {
+               .count = 4,
+               .base = { 0x12500, 0x12700, 0x12900, 0x12b00 },
+       },
+};
+
+static const struct mdp5_config apq8084_config = {
+       .name = "apq8084",
+       .ctl = {
+               .count = 5,
+               .base = { 0x00600, 0x00700, 0x00800, 0x00900, 0x00a00 },
+       },
+       .pipe_vig = {
+               .count = 4,
+               .base = { 0x01200, 0x01600, 0x01a00, 0x01e00 },
+       },
+       .pipe_rgb = {
+               .count = 4,
+               .base = { 0x02200, 0x02600, 0x02a00, 0x02e00 },
+       },
+       .pipe_dma = {
+               .count = 2,
+               .base = { 0x03200, 0x03600 },
+       },
+       .lm = {
+               .count = 6,
+               .base = { 0x03a00, 0x03e00, 0x04200, 0x04600, 0x04a00, 0x04e00 },
+       },
+       .dspp = {
+               .count = 4,
+               .base = { 0x05200, 0x05600, 0x05a00, 0x05e00 },
+
+       },
+       .ad = {
+               .count = 3,
+               .base = { 0x13500, 0x13700, 0x13900 },
+       },
+       .intf = {
+               .count = 5,
+               .base = { 0x12500, 0x12700, 0x12900, 0x12b00, 0x12d00 },
+       },
+};
+
+struct mdp5_config_entry {
+       int revision;
+       const struct mdp5_config *config;
+};
+
+static const struct mdp5_config_entry mdp5_configs[] = {
+       { .revision = 0, .config = &msm8x74_config },
+       { .revision = 2, .config = &msm8x74_config },
+       { .revision = 3, .config = &apq8084_config },
+};
+
+static int mdp5_select_hw_cfg(struct msm_kms *kms)
 {
        struct mdp5_kms *mdp5_kms = to_mdp5_kms(to_mdp_kms(kms));
        struct drm_device *dev = mdp5_kms->dev;
        uint32_t version, major, minor;
-       int ret = 0;
-
-       pm_runtime_get_sync(dev->dev);
+       int i, ret = 0;
 
        mdp5_enable(mdp5_kms);
        version = mdp5_read(mdp5_kms, REG_MDP5_MDP_VERSION);
@@ -44,8 +128,8 @@ static int mdp5_hw_init(struct msm_kms *kms)
 
        DBG("found MDP5 version v%d.%d", major, minor);
 
-       if ((major != 1) || ((minor != 0) && (minor != 2))) {
-               dev_err(dev->dev, "unexpected MDP version: v%d.%d\n",
+       if (major != 1) {
+               dev_err(dev->dev, "unexpected MDP major version: v%d.%d\n",
                                major, minor);
                ret = -ENXIO;
                goto out;
@@ -53,6 +137,35 @@ static int mdp5_hw_init(struct msm_kms *kms)
 
        mdp5_kms->rev = minor;
 
+       /* only after mdp5_cfg global pointer's init can we access the hw */
+       for (i = 0; i < ARRAY_SIZE(mdp5_configs); i++) {
+               if (mdp5_configs[i].revision != minor)
+                       continue;
+               mdp5_kms->hw_cfg = mdp5_cfg = mdp5_configs[i].config;
+               break;
+       }
+       if (unlikely(!mdp5_kms->hw_cfg)) {
+               dev_err(dev->dev, "unexpected MDP minor revision: v%d.%d\n",
+                               major, minor);
+               ret = -ENXIO;
+               goto out;
+       }
+
+       DBG("MDP5: %s config selected", mdp5_kms->hw_cfg->name);
+
+       return 0;
+out:
+       return ret;
+}
+
+static int mdp5_hw_init(struct msm_kms *kms)
+{
+       struct mdp5_kms *mdp5_kms = to_mdp5_kms(to_mdp_kms(kms));
+       struct drm_device *dev = mdp5_kms->dev;
+       int i;
+
+       pm_runtime_get_sync(dev->dev);
+
        /* Magic unknown register writes:
         *
         *    W VBIF:0x004 00000001      (mdss_mdp.c:839)
@@ -78,15 +191,13 @@ static int mdp5_hw_init(struct msm_kms *kms)
         */
 
        mdp5_write(mdp5_kms, REG_MDP5_DISP_INTF_SEL, 0);
-       mdp5_write(mdp5_kms, REG_MDP5_CTL_OP(0), 0);
-       mdp5_write(mdp5_kms, REG_MDP5_CTL_OP(1), 0);
-       mdp5_write(mdp5_kms, REG_MDP5_CTL_OP(2), 0);
-       mdp5_write(mdp5_kms, REG_MDP5_CTL_OP(3), 0);
 
-out:
+       for (i = 0; i < mdp5_kms->hw_cfg->ctl.count; i++)
+               mdp5_write(mdp5_kms, REG_MDP5_CTL_OP(i), 0);
+
        pm_runtime_put_sync(dev->dev);
 
-       return ret;
+       return 0;
 }
 
 static long mdp5_round_pixclk(struct msm_kms *kms, unsigned long rate,
@@ -161,7 +272,7 @@ int mdp5_enable(struct mdp5_kms *mdp5_kms)
 static int modeset_init(struct mdp5_kms *mdp5_kms)
 {
        static const enum mdp5_pipe crtcs[] = {
-                       SSPP_RGB0, SSPP_RGB1, SSPP_RGB2,
+                       SSPP_RGB0, SSPP_RGB1, SSPP_RGB2, SSPP_RGB3,
        };
        struct drm_device *dev = mdp5_kms->dev;
        struct msm_drm_private *priv = dev->dev_private;
@@ -169,7 +280,7 @@ static int modeset_init(struct mdp5_kms *mdp5_kms)
        int i, ret;
 
        /* construct CRTCs: */
-       for (i = 0; i < ARRAY_SIZE(crtcs); i++) {
+       for (i = 0; i < mdp5_kms->hw_cfg->pipe_rgb.count; i++) {
                struct drm_plane *plane;
                struct drm_crtc *crtc;
 
@@ -246,7 +357,7 @@ struct msm_kms *mdp5_kms_init(struct drm_device *dev)
        struct mdp5_kms *mdp5_kms;
        struct msm_kms *kms = NULL;
        struct msm_mmu *mmu;
-       int ret;
+       int i, ret;
 
        mdp5_kms = kzalloc(sizeof(*mdp5_kms), GFP_KERNEL);
        if (!mdp5_kms) {
@@ -307,20 +418,22 @@ struct msm_kms *mdp5_kms_init(struct drm_device *dev)
 
        ret = clk_set_rate(mdp5_kms->src_clk, config->max_clk);
 
+       ret = mdp5_select_hw_cfg(kms);
+       if (ret)
+               goto fail;
+
        /* make sure things are off before attaching iommu (bootloader could
         * have left things on, in which case we'll start getting faults if
         * we don't disable):
         */
        mdp5_enable(mdp5_kms);
-       mdp5_write(mdp5_kms, REG_MDP5_INTF_TIMING_ENGINE_EN(0), 0);
-       mdp5_write(mdp5_kms, REG_MDP5_INTF_TIMING_ENGINE_EN(1), 0);
-       mdp5_write(mdp5_kms, REG_MDP5_INTF_TIMING_ENGINE_EN(2), 0);
-       mdp5_write(mdp5_kms, REG_MDP5_INTF_TIMING_ENGINE_EN(3), 0);
+       for (i = 0; i < mdp5_kms->hw_cfg->intf.count; i++)
+               mdp5_write(mdp5_kms, REG_MDP5_INTF_TIMING_ENGINE_EN(i), 0);
        mdp5_disable(mdp5_kms);
        mdelay(16);
 
        if (config->iommu) {
-               mmu = msm_iommu_new(dev, config->iommu);
+               mmu = msm_iommu_new(&pdev->dev, config->iommu);
                if (IS_ERR(mmu)) {
                        ret = PTR_ERR(mmu);
                        dev_err(dev->dev, "failed to init iommu: %d\n", ret);
@@ -368,5 +481,11 @@ static struct mdp5_platform_config *mdp5_get_config(struct platform_device *dev)
 #ifdef CONFIG_OF
        /* TODO */
 #endif
+       config.iommu = iommu_domain_alloc(&platform_bus_type);
+       /* TODO hard-coded in downstream mdss, but should it be? */
+       config.max_clk = 200000000;
+       /* TODO get from DT: */
+       config.smp_blk_cnt = 22;
+
        return &config;
 }
index 6e981b692d1d359dbdd37ccb550c97d37fb7cd4c..5bf340dd0f00afc05300fa0e68346acb005e59c4 100644 (file)
 #include "msm_drv.h"
 #include "msm_kms.h"
 #include "mdp/mdp_kms.h"
+/* dynamic offsets used by mdp5.xml.h (initialized in mdp5_kms.c) */
+#define MDP5_MAX_BASES         8
+struct mdp5_sub_block {
+       int     count;
+       uint32_t base[MDP5_MAX_BASES];
+};
+struct mdp5_config {
+       char  *name;
+       struct mdp5_sub_block ctl;
+       struct mdp5_sub_block pipe_vig;
+       struct mdp5_sub_block pipe_rgb;
+       struct mdp5_sub_block pipe_dma;
+       struct mdp5_sub_block lm;
+       struct mdp5_sub_block dspp;
+       struct mdp5_sub_block ad;
+       struct mdp5_sub_block intf;
+};
+extern const struct mdp5_config *mdp5_cfg;
 #include "mdp5.xml.h"
 #include "mdp5_smp.h"
 
@@ -30,6 +48,7 @@ struct mdp5_kms {
        struct drm_device *dev;
 
        int rev;
+       const struct mdp5_config *hw_cfg;
 
        /* mapper-id used to request GEM buffer mapped for scanout: */
        int id;
@@ -82,6 +101,7 @@ static inline const char *pipe2name(enum mdp5_pipe pipe)
                NAME(VIG0), NAME(VIG1), NAME(VIG2),
                NAME(RGB0), NAME(RGB1), NAME(RGB2),
                NAME(DMA0), NAME(DMA1),
+               NAME(VIG3), NAME(RGB3),
 #undef NAME
        };
        return names[pipe];
@@ -98,6 +118,8 @@ static inline uint32_t pipe2flush(enum mdp5_pipe pipe)
        case SSPP_RGB2: return MDP5_CTL_FLUSH_RGB2;
        case SSPP_DMA0: return MDP5_CTL_FLUSH_DMA0;
        case SSPP_DMA1: return MDP5_CTL_FLUSH_DMA1;
+       case SSPP_VIG3: return MDP5_CTL_FLUSH_VIG3;
+       case SSPP_RGB3: return MDP5_CTL_FLUSH_RGB3;
        default:        return 0;
        }
 }
@@ -108,6 +130,7 @@ static inline int pipe2nclients(enum mdp5_pipe pipe)
        case SSPP_RGB0:
        case SSPP_RGB1:
        case SSPP_RGB2:
+       case SSPP_RGB3:
                return 1;
        default:
                return 3;
@@ -126,6 +149,8 @@ static inline enum mdp5_client_id pipe2client(enum mdp5_pipe pipe, int plane)
        case SSPP_RGB2: return CID_RGB2;
        case SSPP_DMA0: return CID_DMA0_Y + plane;
        case SSPP_DMA1: return CID_DMA1_Y + plane;
+       case SSPP_VIG3: return CID_VIG3_Y + plane;
+       case SSPP_RGB3: return CID_RGB3;
        default:        return CID_UNUSED;
        }
 }
index a9629b85b9837bd639b81b9e4269d5c9bee4e6c9..64c1afd6030a78220da059287df22c1bd44b3433 100644 (file)
@@ -12,12 +12,12 @@ The rules-ng-ng source files this header was generated from are:
 - /home/robclark/src/freedreno/envytools/rnndb/freedreno_copyright.xml (   1453 bytes, from 2013-03-31 16:51:27)
 - /home/robclark/src/freedreno/envytools/rnndb/mdp/mdp4.xml            (  17996 bytes, from 2013-12-01 19:10:31)
 - /home/robclark/src/freedreno/envytools/rnndb/mdp/mdp_common.xml      (   1615 bytes, from 2013-11-30 15:00:52)
-- /home/robclark/src/freedreno/envytools/rnndb/mdp/mdp5.xml            (  22517 bytes, from 2013-12-03 20:59:13)
+- /home/robclark/src/freedreno/envytools/rnndb/mdp/mdp5.xml            (  22517 bytes, from 2014-06-25 12:55:02)
 - /home/robclark/src/freedreno/envytools/rnndb/dsi/dsi.xml             (  11712 bytes, from 2013-08-17 17:13:43)
 - /home/robclark/src/freedreno/envytools/rnndb/dsi/sfpb.xml            (    344 bytes, from 2013-08-11 19:26:32)
 - /home/robclark/src/freedreno/envytools/rnndb/dsi/mmss_cc.xml         (   1544 bytes, from 2013-08-16 19:17:05)
 - /home/robclark/src/freedreno/envytools/rnndb/hdmi/qfprom.xml         (    600 bytes, from 2013-07-05 19:21:12)
-- /home/robclark/src/freedreno/envytools/rnndb/hdmi/hdmi.xml           (  20932 bytes, from 2013-12-01 15:13:04)
+- /home/robclark/src/freedreno/envytools/rnndb/hdmi/hdmi.xml           (  23613 bytes, from 2014-06-25 12:53:44)
 
 Copyright (C) 2013 by the following authors:
 - Rob Clark <robdclark@gmail.com> (robclark)
index 9a5d87db5c2365722a841f990c3daca97e3354ed..b447c01ad89c86c909b92679444843989df22c9e 100644 (file)
@@ -181,7 +181,6 @@ static int msm_load(struct drm_device *dev, unsigned long flags)
        struct msm_kms *kms;
        int ret;
 
-
        priv = kzalloc(sizeof(*priv), GFP_KERNEL);
        if (!priv) {
                dev_err(dev->dev, "failed to allocate private data\n");
@@ -314,13 +313,15 @@ fail:
 
 static void load_gpu(struct drm_device *dev)
 {
+       static DEFINE_MUTEX(init_lock);
        struct msm_drm_private *priv = dev->dev_private;
        struct msm_gpu *gpu;
 
+       mutex_lock(&init_lock);
+
        if (priv->gpu)
-               return;
+               goto out;
 
-       mutex_lock(&dev->struct_mutex);
        gpu = a3xx_gpu_init(dev);
        if (IS_ERR(gpu)) {
                dev_warn(dev->dev, "failed to load a3xx gpu\n");
@@ -330,7 +331,9 @@ static void load_gpu(struct drm_device *dev)
 
        if (gpu) {
                int ret;
+               mutex_lock(&dev->struct_mutex);
                gpu->funcs->pm_resume(gpu);
+               mutex_unlock(&dev->struct_mutex);
                ret = gpu->funcs->hw_init(gpu);
                if (ret) {
                        dev_err(dev->dev, "gpu hw init failed: %d\n", ret);
@@ -340,12 +343,12 @@ static void load_gpu(struct drm_device *dev)
                        /* give inactive pm a chance to kick in: */
                        msm_gpu_retire(gpu);
                }
-
        }
 
        priv->gpu = gpu;
 
-       mutex_unlock(&dev->struct_mutex);
+out:
+       mutex_unlock(&init_lock);
 }
 
 static int msm_open(struct drm_device *dev, struct drm_file *file)
@@ -906,25 +909,22 @@ static int compare_of(struct device *dev, void *data)
        return dev->of_node == data;
 }
 
-static int msm_drm_add_components(struct device *master, struct master *m)
+static int add_components(struct device *dev, struct component_match **matchptr,
+               const char *name)
 {
-       struct device_node *np = master->of_node;
+       struct device_node *np = dev->of_node;
        unsigned i;
-       int ret;
 
        for (i = 0; ; i++) {
                struct device_node *node;
 
-               node = of_parse_phandle(np, "connectors", i);
+               node = of_parse_phandle(np, name, i);
                if (!node)
                        break;
 
-               ret = component_master_add_child(m, compare_of, node);
-               of_node_put(node);
-
-               if (ret)
-                       return ret;
+               component_match_add(dev, matchptr, compare_of, node);
        }
+
        return 0;
 }
 #else
@@ -932,9 +932,34 @@ static int compare_dev(struct device *dev, void *data)
 {
        return dev == data;
 }
+#endif
+
+static int msm_drm_bind(struct device *dev)
+{
+       return drm_platform_init(&msm_driver, to_platform_device(dev));
+}
+
+static void msm_drm_unbind(struct device *dev)
+{
+       drm_put_dev(platform_get_drvdata(to_platform_device(dev)));
+}
+
+static const struct component_master_ops msm_drm_ops = {
+       .bind = msm_drm_bind,
+       .unbind = msm_drm_unbind,
+};
+
+/*
+ * Platform driver:
+ */
 
-static int msm_drm_add_components(struct device *master, struct master *m)
+static int msm_pdev_probe(struct platform_device *pdev)
 {
+       struct component_match *match = NULL;
+#ifdef CONFIG_OF
+       add_components(&pdev->dev, &match, "connectors");
+       add_components(&pdev->dev, &match, "gpus");
+#else
        /* For non-DT case, it kinda sucks.  We don't actually have a way
         * to know whether or not we are waiting for certain devices (or if
         * they are simply not present).  But for non-DT we only need to
@@ -958,41 +983,12 @@ static int msm_drm_add_components(struct device *master, struct master *m)
                        return -EPROBE_DEFER;
                }
 
-               ret = component_master_add_child(m, compare_dev, dev);
-               if (ret) {
-                       DBG("could not add child: %d", ret);
-                       return ret;
-               }
+               component_match_add(&pdev->dev, &match, compare_dev, dev);
        }
-
-       return 0;
-}
 #endif
 
-static int msm_drm_bind(struct device *dev)
-{
-       return drm_platform_init(&msm_driver, to_platform_device(dev));
-}
-
-static void msm_drm_unbind(struct device *dev)
-{
-       drm_put_dev(platform_get_drvdata(to_platform_device(dev)));
-}
-
-static const struct component_master_ops msm_drm_ops = {
-               .add_components = msm_drm_add_components,
-               .bind = msm_drm_bind,
-               .unbind = msm_drm_unbind,
-};
-
-/*
- * Platform driver:
- */
-
-static int msm_pdev_probe(struct platform_device *pdev)
-{
        pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
-       return component_master_add(&pdev->dev, &msm_drm_ops);
+       return component_master_add_with_match(&pdev->dev, &msm_drm_ops, match);
 }
 
 static int msm_pdev_remove(struct platform_device *pdev)
@@ -1008,7 +1004,8 @@ static const struct platform_device_id msm_id[] = {
 };
 
 static const struct of_device_id dt_match[] = {
-       { .compatible = "qcom,mdss_mdp" },
+       { .compatible = "qcom,mdp" },      /* mdp4 */
+       { .compatible = "qcom,mdss_mdp" }, /* mdp5 */
        {}
 };
 MODULE_DEVICE_TABLE(of, dt_match);
index 5107fc4826bcec163100fc6152d9646df0959ca2..9c5221ce391ab063cac34ebce428e46939828649 100644 (file)
 
 #include "drm_crtc.h"
 #include "drm_fb_helper.h"
+#include "msm_gem.h"
+
+extern int msm_gem_mmap_obj(struct drm_gem_object *obj,
+                                       struct vm_area_struct *vma);
+static int msm_fbdev_mmap(struct fb_info *info, struct vm_area_struct *vma);
 
 /*
  * fbdev funcs, to implement legacy fbdev interface on top of drm driver
@@ -43,6 +48,7 @@ static struct fb_ops msm_fb_ops = {
        .fb_fillrect = sys_fillrect,
        .fb_copyarea = sys_copyarea,
        .fb_imageblit = sys_imageblit,
+       .fb_mmap = msm_fbdev_mmap,
 
        .fb_check_var = drm_fb_helper_check_var,
        .fb_set_par = drm_fb_helper_set_par,
@@ -51,6 +57,31 @@ static struct fb_ops msm_fb_ops = {
        .fb_setcmap = drm_fb_helper_setcmap,
 };
 
+static int msm_fbdev_mmap(struct fb_info *info, struct vm_area_struct *vma)
+{
+       struct drm_fb_helper *helper = (struct drm_fb_helper *)info->par;
+       struct msm_fbdev *fbdev = to_msm_fbdev(helper);
+       struct drm_gem_object *drm_obj = fbdev->bo;
+       struct drm_device *dev = helper->dev;
+       int ret = 0;
+
+       if (drm_device_is_unplugged(dev))
+               return -ENODEV;
+
+       mutex_lock(&dev->struct_mutex);
+
+       ret = drm_gem_mmap_obj(drm_obj, drm_obj->size, vma);
+
+       mutex_unlock(&dev->struct_mutex);
+
+       if (ret) {
+               pr_err("%s:drm_gem_mmap_obj fail\n", __func__);
+               return ret;
+       }
+
+       return msm_gem_mmap_obj(drm_obj, vma);
+}
+
 static int msm_fbdev_create(struct drm_fb_helper *helper,
                struct drm_fb_helper_surface_size *sizes)
 {
@@ -104,8 +135,16 @@ static int msm_fbdev_create(struct drm_fb_helper *helper,
 
        mutex_lock(&dev->struct_mutex);
 
-       /* TODO implement our own fb_mmap so we don't need this: */
-       msm_gem_get_iova_locked(fbdev->bo, 0, &paddr);
+       /*
+        * NOTE: if we can be guaranteed to be able to map buffer
+        * in panic (ie. lock-safe, etc) we could avoid pinning the
+        * buffer now:
+        */
+       ret = msm_gem_get_iova_locked(fbdev->bo, 0, &paddr);
+       if (ret) {
+               dev_err(dev->dev, "failed to get buffer obj iova: %d\n", ret);
+               goto fail;
+       }
 
        fbi = framebuffer_alloc(0, dev->dev);
        if (!fbi) {
@@ -177,7 +216,7 @@ static void msm_crtc_fb_gamma_get(struct drm_crtc *crtc,
        DBG("fbdev: get gamma");
 }
 
-static struct drm_fb_helper_funcs msm_fb_helper_funcs = {
+static const struct drm_fb_helper_funcs msm_fb_helper_funcs = {
        .gamma_set = msm_crtc_fb_gamma_set,
        .gamma_get = msm_crtc_fb_gamma_get,
        .fb_probe = msm_fbdev_create,
@@ -189,7 +228,7 @@ struct drm_fb_helper *msm_fbdev_init(struct drm_device *dev)
        struct msm_drm_private *priv = dev->dev_private;
        struct msm_fbdev *fbdev = NULL;
        struct drm_fb_helper *helper;
-       int ret = 0;
+       int ret;
 
        fbdev = kzalloc(sizeof(*fbdev), GFP_KERNEL);
        if (!fbdev)
@@ -197,7 +236,7 @@ struct drm_fb_helper *msm_fbdev_init(struct drm_device *dev)
 
        helper = &fbdev->base;
 
-       helper->funcs = &msm_fb_helper_funcs;
+       drm_fb_helper_prepare(dev, helper, &msm_fb_helper_funcs);
 
        ret = drm_fb_helper_init(dev, helper,
                        priv->num_crtcs, priv->num_connectors);
index 690d7e7b6d1e8296891dde245d871850b0631715..4b1b82adabdeaa504cd63ca290ff37f6acc223de 100644 (file)
@@ -73,7 +73,7 @@ static struct page **get_pages(struct drm_gem_object *obj)
                int npages = obj->size >> PAGE_SHIFT;
 
                if (iommu_present(&platform_bus_type))
-                       p = drm_gem_get_pages(obj, 0);
+                       p = drm_gem_get_pages(obj);
                else
                        p = get_pages_vram(obj, npages);
 
@@ -278,24 +278,23 @@ int msm_gem_get_iova_locked(struct drm_gem_object *obj, int id,
                uint32_t *iova)
 {
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
-       struct drm_device *dev = obj->dev;
        int ret = 0;
 
        if (!msm_obj->domain[id].iova) {
                struct msm_drm_private *priv = obj->dev->dev_private;
-               struct msm_mmu *mmu = priv->mmus[id];
                struct page **pages = get_pages(obj);
 
-               if (!mmu) {
-                       dev_err(dev->dev, "null MMU pointer\n");
-                       return -EINVAL;
-               }
-
                if (IS_ERR(pages))
                        return PTR_ERR(pages);
 
                if (iommu_present(&platform_bus_type)) {
-                       uint32_t offset = (uint32_t)mmap_offset(obj);
+                       struct msm_mmu *mmu = priv->mmus[id];
+                       uint32_t offset;
+
+                       if (WARN_ON(!mmu))
+                               return -EINVAL;
+
+                       offset = (uint32_t)mmap_offset(obj);
                        ret = mmu->funcs->map(mmu, offset, msm_obj->sgt,
                                        obj->size, IOMMU_READ | IOMMU_WRITE);
                        msm_obj->domain[id].iova = offset;
index c6322197db8cf15a1f9f96ea627afae5b10dc46b..4a0dce58774571bc2fb885f0e867bee58ad434d8 100644 (file)
@@ -606,14 +606,17 @@ int msm_gpu_init(struct drm_device *drm, struct platform_device *pdev,
        iommu = iommu_domain_alloc(&platform_bus_type);
        if (iommu) {
                dev_info(drm->dev, "%s: using IOMMU\n", name);
-               gpu->mmu = msm_iommu_new(drm, iommu);
+               gpu->mmu = msm_iommu_new(&pdev->dev, iommu);
        } else {
                dev_info(drm->dev, "%s: no IOMMU, fallback to VRAM carveout!\n", name);
        }
        gpu->id = msm_register_mmu(drm, gpu->mmu);
 
+
        /* Create ringbuffer: */
+       mutex_lock(&drm->struct_mutex);
        gpu->rb = msm_ringbuffer_new(gpu, ringsz);
+       mutex_unlock(&drm->struct_mutex);
        if (IS_ERR(gpu->rb)) {
                ret = PTR_ERR(gpu->rb);
                gpu->rb = NULL;
@@ -621,13 +624,6 @@ int msm_gpu_init(struct drm_device *drm, struct platform_device *pdev,
                goto fail;
        }
 
-       ret = msm_gem_get_iova_locked(gpu->rb->bo, gpu->id, &gpu->rb_iova);
-       if (ret) {
-               gpu->rb_iova = 0;
-               dev_err(drm->dev, "could not map ringbuffer: %d\n", ret);
-               goto fail;
-       }
-
        bs_init(gpu);
 
        return 0;
index 4b2ad9181edffb10239cb31c959376ecb429c689..099af483fdf0328925b23be1fc9c635a5c4c63ba 100644 (file)
@@ -33,39 +33,14 @@ static int msm_fault_handler(struct iommu_domain *iommu, struct device *dev,
 
 static int msm_iommu_attach(struct msm_mmu *mmu, const char **names, int cnt)
 {
-       struct drm_device *dev = mmu->dev;
        struct msm_iommu *iommu = to_msm_iommu(mmu);
-       int i, ret;
-
-       for (i = 0; i < cnt; i++) {
-               struct device *msm_iommu_get_ctx(const char *ctx_name);
-               struct device *ctx = msm_iommu_get_ctx(names[i]);
-               if (IS_ERR_OR_NULL(ctx)) {
-                       dev_warn(dev->dev, "couldn't get %s context", names[i]);
-                       continue;
-               }
-               ret = iommu_attach_device(iommu->domain, ctx);
-               if (ret) {
-                       dev_warn(dev->dev, "could not attach iommu to %s", names[i]);
-                       return ret;
-               }
-       }
-
-       return 0;
+       return iommu_attach_device(iommu->domain, mmu->dev);
 }
 
 static void msm_iommu_detach(struct msm_mmu *mmu, const char **names, int cnt)
 {
        struct msm_iommu *iommu = to_msm_iommu(mmu);
-       int i;
-
-       for (i = 0; i < cnt; i++) {
-               struct device *msm_iommu_get_ctx(const char *ctx_name);
-               struct device *ctx = msm_iommu_get_ctx(names[i]);
-               if (IS_ERR_OR_NULL(ctx))
-                       continue;
-               iommu_detach_device(iommu->domain, ctx);
-       }
+       iommu_detach_device(iommu->domain, mmu->dev);
 }
 
 static int msm_iommu_map(struct msm_mmu *mmu, uint32_t iova,
@@ -149,7 +124,7 @@ static const struct msm_mmu_funcs funcs = {
                .destroy = msm_iommu_destroy,
 };
 
-struct msm_mmu *msm_iommu_new(struct drm_device *dev, struct iommu_domain *domain)
+struct msm_mmu *msm_iommu_new(struct device *dev, struct iommu_domain *domain)
 {
        struct msm_iommu *iommu;
 
index 21da6d154f715395417f28a33562c2520079be9d..7cd88d9dc1555f4e4f20482c58650fdcc7689d7c 100644 (file)
@@ -32,17 +32,17 @@ struct msm_mmu_funcs {
 
 struct msm_mmu {
        const struct msm_mmu_funcs *funcs;
-       struct drm_device *dev;
+       struct device *dev;
 };
 
-static inline void msm_mmu_init(struct msm_mmu *mmu, struct drm_device *dev,
+static inline void msm_mmu_init(struct msm_mmu *mmu, struct device *dev,
                const struct msm_mmu_funcs *funcs)
 {
        mmu->dev = dev;
        mmu->funcs = funcs;
 }
 
-struct msm_mmu *msm_iommu_new(struct drm_device *dev, struct iommu_domain *domain);
-struct msm_mmu *msm_gpummu_new(struct drm_device *dev, struct msm_gpu *gpu);
+struct msm_mmu *msm_iommu_new(struct device *dev, struct iommu_domain *domain);
+struct msm_mmu *msm_gpummu_new(struct device *dev, struct msm_gpu *gpu);
 
 #endif /* __MSM_MMU_H__ */
index b6dc85c614be402ca5d6717bea842c0448ce4b39..ba29a701ca1d4eb6f9b87220588cb2ea96089395 100644 (file)
@@ -309,7 +309,7 @@ nouveau_bo_pin(struct nouveau_bo *nvbo, uint32_t memtype)
        struct ttm_buffer_object *bo = &nvbo->bo;
        int ret;
 
-       ret = ttm_bo_reserve(bo, false, false, false, 0);
+       ret = ttm_bo_reserve(bo, false, false, false, NULL);
        if (ret)
                goto out;
 
@@ -350,7 +350,7 @@ nouveau_bo_unpin(struct nouveau_bo *nvbo)
        struct ttm_buffer_object *bo = &nvbo->bo;
        int ret, ref;
 
-       ret = ttm_bo_reserve(bo, false, false, false, 0);
+       ret = ttm_bo_reserve(bo, false, false, false, NULL);
        if (ret)
                return ret;
 
@@ -385,7 +385,7 @@ nouveau_bo_map(struct nouveau_bo *nvbo)
 {
        int ret;
 
-       ret = ttm_bo_reserve(&nvbo->bo, false, false, false, 0);
+       ret = ttm_bo_reserve(&nvbo->bo, false, false, false, NULL);
        if (ret)
                return ret;
 
index 1fa222e8f007ba5e0b8f94a8bfcf911bee34a49d..dbdc9ad59546f78685e1f1d309312c18754f5a3f 100644 (file)
@@ -63,7 +63,7 @@ find_encoder(struct drm_connector *connector, int type)
 {
        struct drm_device *dev = connector->dev;
        struct nouveau_encoder *nv_encoder;
-       struct drm_mode_object *obj;
+       struct drm_encoder *enc;
        int i, id;
 
        for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
@@ -71,10 +71,10 @@ find_encoder(struct drm_connector *connector, int type)
                if (!id)
                        break;
 
-               obj = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_ENCODER);
-               if (!obj)
+               enc = drm_encoder_find(dev, id);
+               if (!enc)
                        continue;
-               nv_encoder = nouveau_encoder(obj_to_encoder(obj));
+               nv_encoder = nouveau_encoder(enc);
 
                if (type == DCB_OUTPUT_ANY ||
                    (nv_encoder->dcb && nv_encoder->dcb->type == type))
@@ -104,7 +104,7 @@ nouveau_connector_destroy(struct drm_connector *connector)
        struct nouveau_connector *nv_connector = nouveau_connector(connector);
        nouveau_event_ref(NULL, &nv_connector->hpd);
        kfree(nv_connector->edid);
-       drm_sysfs_connector_remove(connector);
+       drm_connector_unregister(connector);
        drm_connector_cleanup(connector);
        if (nv_connector->aux.transfer)
                drm_dp_aux_unregister(&nv_connector->aux);
@@ -119,7 +119,7 @@ nouveau_connector_ddc_detect(struct drm_connector *connector)
        struct nouveau_drm *drm = nouveau_drm(dev);
        struct nouveau_gpio *gpio = nouveau_gpio(drm->device);
        struct nouveau_encoder *nv_encoder;
-       struct drm_mode_object *obj;
+       struct drm_encoder *encoder;
        int i, panel = -ENODEV;
 
        /* eDP panels need powering on by us (if the VBIOS doesn't default it
@@ -139,10 +139,10 @@ nouveau_connector_ddc_detect(struct drm_connector *connector)
                if (id == 0)
                        break;
 
-               obj = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_ENCODER);
-               if (!obj)
+               encoder = drm_encoder_find(dev, id);
+               if (!encoder)
                        continue;
-               nv_encoder = nouveau_encoder(obj_to_encoder(obj));
+               nv_encoder = nouveau_encoder(encoder);
 
                if (nv_encoder->dcb->type == DCB_OUTPUT_DP) {
                        int ret = nouveau_dp_detect(nv_encoder);
@@ -1236,6 +1236,6 @@ nouveau_connector_create(struct drm_device *dev, int index)
 
        INIT_WORK(&nv_connector->work, nouveau_connector_hotplug_work);
 
-       drm_sysfs_connector_add(connector);
+       drm_connector_register(connector);
        return connector;
 }
index 191665ee7f52203ce0242d71e5b7804ff62d91c7..758c11cb9a9a8575218d5b2352b3db94b15ba71e 100644 (file)
@@ -438,7 +438,7 @@ void nouveau_fbcon_gpu_lockup(struct fb_info *info)
        info->flags |= FBINFO_HWACCEL_DISABLED;
 }
 
-static struct drm_fb_helper_funcs nouveau_fbcon_helper_funcs = {
+static const struct drm_fb_helper_funcs nouveau_fbcon_helper_funcs = {
        .gamma_set = nouveau_fbcon_gamma_set,
        .gamma_get = nouveau_fbcon_gamma_get,
        .fb_probe = nouveau_fbcon_create,
@@ -464,7 +464,8 @@ nouveau_fbcon_init(struct drm_device *dev)
 
        fbcon->dev = dev;
        drm->fbcon = fbcon;
-       fbcon->helper.funcs = &nouveau_fbcon_helper_funcs;
+
+       drm_fb_helper_prepare(dev, &fbcon->helper, &nouveau_fbcon_helper_funcs);
 
        ret = drm_fb_helper_init(dev, &fbcon->helper,
                                 dev->mode_config.num_crtc, 4);
index c90c0dc0afe8aba5c8730491b046232b8a1a574a..df9d451afdcdae6cd0f53e24b29e895e8396d6f4 100644 (file)
@@ -61,7 +61,7 @@ nouveau_gem_object_open(struct drm_gem_object *gem, struct drm_file *file_priv)
        if (!cli->base.vm)
                return 0;
 
-       ret = ttm_bo_reserve(&nvbo->bo, false, false, false, 0);
+       ret = ttm_bo_reserve(&nvbo->bo, false, false, false, NULL);
        if (ret)
                return ret;
 
@@ -132,7 +132,7 @@ nouveau_gem_object_close(struct drm_gem_object *gem, struct drm_file *file_priv)
        if (!cli->base.vm)
                return;
 
-       ret = ttm_bo_reserve(&nvbo->bo, false, false, false, 0);
+       ret = ttm_bo_reserve(&nvbo->bo, false, false, false, NULL);
        if (ret)
                return;
 
index ab0228f640a5e86f1554402bcf5816d2e8a9a986..7e185c122750347c4a214782f095cb6d3dda6b0d 100644 (file)
@@ -76,6 +76,7 @@ static int
 nouveau_vram_manager_new(struct ttm_mem_type_manager *man,
                         struct ttm_buffer_object *bo,
                         struct ttm_placement *placement,
+                        uint32_t flags,
                         struct ttm_mem_reg *mem)
 {
        struct nouveau_drm *drm = nouveau_bdev(man->bdev);
@@ -162,6 +163,7 @@ static int
 nouveau_gart_manager_new(struct ttm_mem_type_manager *man,
                         struct ttm_buffer_object *bo,
                         struct ttm_placement *placement,
+                        uint32_t flags,
                         struct ttm_mem_reg *mem)
 {
        struct nouveau_drm *drm = nouveau_bdev(bo->bdev);
@@ -242,6 +244,7 @@ static int
 nv04_gart_manager_new(struct ttm_mem_type_manager *man,
                      struct ttm_buffer_object *bo,
                      struct ttm_placement *placement,
+                     uint32_t flags,
                      struct ttm_mem_reg *mem)
 {
        struct nouveau_mem *node;
index 86f4ead0441d0d2b6e27f8441974f14dd68ed801..36bc5cc8081606e04535ef34201a31e0021ab1f9 100644 (file)
@@ -130,7 +130,7 @@ static void omap_connector_destroy(struct drm_connector *connector)
        struct omap_dss_device *dssdev = omap_connector->dssdev;
 
        DBG("%s", omap_connector->dssdev->name);
-       drm_sysfs_connector_remove(connector);
+       drm_connector_unregister(connector);
        drm_connector_cleanup(connector);
        kfree(omap_connector);
 
@@ -307,7 +307,7 @@ struct drm_connector *omap_connector_init(struct drm_device *dev,
        connector->interlace_allowed = 1;
        connector->doublescan_allowed = 0;
 
-       drm_sysfs_connector_add(connector);
+       drm_connector_register(connector);
 
        return connector;
 
index f926b4caf44989be904451c277049152cfc9b9ad..56c60552abba36bbfcc7572ebe2d986cc548141a 100644 (file)
@@ -199,7 +199,7 @@ static struct dmm_txn *dmm_txn_init(struct dmm *dmm, struct tcm *tcm)
 static void dmm_txn_append(struct dmm_txn *txn, struct pat_area *area,
                struct page **pages, uint32_t npages, uint32_t roll)
 {
-       dma_addr_t pat_pa = 0;
+       dma_addr_t pat_pa = 0, data_pa = 0;
        uint32_t *data;
        struct pat *pat;
        struct refill_engine *engine = txn->engine_handle;
@@ -223,7 +223,9 @@ static void dmm_txn_append(struct dmm_txn *txn, struct pat_area *area,
                        .lut_id = engine->tcm->lut_id,
                };
 
-       data = alloc_dma(txn, 4*i, &pat->data_pa);
+       data = alloc_dma(txn, 4*i, &data_pa);
+       /* FIXME: what if data_pa is more than 32-bit ? */
+       pat->data_pa = data_pa;
 
        while (i--) {
                int n = i + roll;
index 284b80fc3c54fc4146294656c722fb7af2485b03..b08a450d1b5d465b8213a5b2f745282b8eb88382 100644 (file)
@@ -119,13 +119,6 @@ struct omap_drm_private {
        struct omap_drm_irq error_handler;
 };
 
-/* this should probably be in drm-core to standardize amongst drivers */
-#define DRM_ROTATE_0   0
-#define DRM_ROTATE_90  1
-#define DRM_ROTATE_180 2
-#define DRM_ROTATE_270 3
-#define DRM_REFLECT_X  4
-#define DRM_REFLECT_Y  5
 
 #ifdef CONFIG_DEBUG_FS
 int omap_debugfs_init(struct drm_minor *minor);
index 1388ca7f87e84fefa07256cde5ebc07076e5087a..8436c6857cda76f2311af5d612f50315a58438ce 100644 (file)
@@ -281,7 +281,7 @@ fail:
        return ret;
 }
 
-static struct drm_fb_helper_funcs omap_fb_helper_funcs = {
+static const struct drm_fb_helper_funcs omap_fb_helper_funcs = {
        .fb_probe = omap_fbdev_create,
 };
 
@@ -325,7 +325,7 @@ struct drm_fb_helper *omap_fbdev_init(struct drm_device *dev)
 
        helper = &fbdev->base;
 
-       helper->funcs = &omap_fb_helper_funcs;
+       drm_fb_helper_prepare(dev, helper, &omap_fb_helper_funcs);
 
        ret = drm_fb_helper_init(dev, helper,
                        priv->num_crtcs, priv->num_connectors);
index 95dbce286a41347f58b5a4880b9109dea9c831f2..e4849413ee80074616d6b6239cea6f0b1b16c5a3 100644 (file)
@@ -233,11 +233,7 @@ static int omap_gem_attach_pages(struct drm_gem_object *obj)
 
        WARN_ON(omap_obj->pages);
 
-       /* TODO: __GFP_DMA32 .. but somehow GFP_HIGHMEM is coming from the
-        * mapping_gfp_mask(mapping) which conflicts w/ GFP_DMA32.. probably
-        * we actually want CMA memory for it all anyways..
-        */
-       pages = drm_gem_get_pages(obj, GFP_KERNEL);
+       pages = drm_gem_get_pages(obj);
        if (IS_ERR(pages)) {
                dev_err(obj->dev->dev, "could not get pages: %ld\n", PTR_ERR(pages));
                return PTR_ERR(pages);
@@ -791,7 +787,7 @@ int omap_gem_get_paddr(struct drm_gem_object *obj,
                        omap_obj->paddr = tiler_ssptr(block);
                        omap_obj->block = block;
 
-                       DBG("got paddr: %08x", omap_obj->paddr);
+                       DBG("got paddr: %pad", &omap_obj->paddr);
                }
 
                omap_obj->paddr_cnt++;
@@ -985,9 +981,9 @@ void omap_gem_describe(struct drm_gem_object *obj, struct seq_file *m)
 
        off = drm_vma_node_start(&obj->vma_node);
 
-       seq_printf(m, "%08x: %2d (%2d) %08llx %08Zx (%2d) %p %4d",
+       seq_printf(m, "%08x: %2d (%2d) %08llx %pad (%2d) %p %4d",
                        omap_obj->flags, obj->name, obj->refcount.refcount.counter,
-                       off, omap_obj->paddr, omap_obj->paddr_cnt,
+                       off, &omap_obj->paddr, omap_obj->paddr_cnt,
                        omap_obj->vaddr, omap_obj->roll);
 
        if (omap_obj->flags & OMAP_BO_TILED) {
@@ -1183,9 +1179,7 @@ int omap_gem_op_sync(struct drm_gem_object *obj, enum omap_gem_op op)
                        }
                }
                spin_unlock(&sync_lock);
-
-               if (waiter)
-                       kfree(waiter);
+               kfree(waiter);
        }
        return ret;
 }
@@ -1347,6 +1341,7 @@ struct drm_gem_object *omap_gem_new(struct drm_device *dev,
        struct omap_drm_private *priv = dev->dev_private;
        struct omap_gem_object *omap_obj;
        struct drm_gem_object *obj = NULL;
+       struct address_space *mapping;
        size_t size;
        int ret;
 
@@ -1404,14 +1399,16 @@ struct drm_gem_object *omap_gem_new(struct drm_device *dev,
                omap_obj->height = gsize.tiled.height;
        }
 
-       ret = 0;
-       if (flags & (OMAP_BO_DMA|OMAP_BO_EXT_MEM))
+       if (flags & (OMAP_BO_DMA|OMAP_BO_EXT_MEM)) {
                drm_gem_private_object_init(dev, obj, size);
-       else
+       } else {
                ret = drm_gem_object_init(dev, obj, size);
+               if (ret)
+                       goto fail;
 
-       if (ret)
-               goto fail;
+               mapping = file_inode(obj->filp)->i_mapping;
+               mapping_set_gfp_mask(mapping, GFP_USER | __GFP_DMA32);
+       }
 
        return obj;
 
@@ -1467,8 +1464,8 @@ void omap_gem_init(struct drm_device *dev)
                        entry->paddr = tiler_ssptr(block);
                        entry->block = block;
 
-                       DBG("%d:%d: %dx%d: paddr=%08x stride=%d", i, j, w, h,
-                                       entry->paddr,
+                       DBG("%d:%d: %dx%d: paddr=%pad stride=%d", i, j, w, h,
+                                       &entry->paddr,
                                        usergart[i].stride_pfn << PAGE_SHIFT);
                }
        }
index 3cf31ee59aac08de0573bb7c0464c0b0e7a7f0e5..891a4dc608af85f2760ced973c9cf5163743d08f 100644 (file)
@@ -142,8 +142,8 @@ static void omap_plane_pre_apply(struct omap_drm_apply *apply)
        DBG("%dx%d -> %dx%d (%d)", info->width, info->height,
                        info->out_width, info->out_height,
                        info->screen_width);
-       DBG("%d,%d %08x %08x", info->pos_x, info->pos_y,
-                       info->paddr, info->p_uv_addr);
+       DBG("%d,%d %pad %pad", info->pos_x, info->pos_y,
+                       &info->paddr, &info->p_uv_addr);
 
        /* TODO: */
        ilace = false;
@@ -308,16 +308,13 @@ void omap_plane_install_properties(struct drm_plane *plane,
        if (priv->has_dmm) {
                prop = priv->rotation_prop;
                if (!prop) {
-                       const struct drm_prop_enum_list props[] = {
-                                       { DRM_ROTATE_0,   "rotate-0" },
-                                       { DRM_ROTATE_90,  "rotate-90" },
-                                       { DRM_ROTATE_180, "rotate-180" },
-                                       { DRM_ROTATE_270, "rotate-270" },
-                                       { DRM_REFLECT_X,  "reflect-x" },
-                                       { DRM_REFLECT_Y,  "reflect-y" },
-                       };
-                       prop = drm_property_create_bitmask(dev, 0, "rotation",
-                                       props, ARRAY_SIZE(props));
+                       prop = drm_mode_create_rotation_property(dev,
+                                                                BIT(DRM_ROTATE_0) |
+                                                                BIT(DRM_ROTATE_90) |
+                                                                BIT(DRM_ROTATE_180) |
+                                                                BIT(DRM_ROTATE_270) |
+                                                                BIT(DRM_REFLECT_X) |
+                                                                BIT(DRM_REFLECT_Y));
                        if (prop == NULL)
                                return;
                        priv->rotation_prop = prop;
index 4ec874da56681f98e2bfac2584368819ed71e2d8..bee9f72b3a93a2cccb99476ac6433c53c2ed04c7 100644 (file)
@@ -5,7 +5,7 @@ config DRM_PANEL
          Panel registration and lookup framework.
 
 menu "Display Panels"
-       depends on DRM_PANEL
+       depends on DRM && DRM_PANEL
 
 config DRM_PANEL_SIMPLE
        tristate "support for simple panels"
@@ -18,14 +18,11 @@ config DRM_PANEL_SIMPLE
 
 config DRM_PANEL_LD9040
        tristate "LD9040 RGB/SPI panel"
-       depends on DRM && DRM_PANEL
-       depends on OF
-       select SPI
+       depends on OF && SPI
        select VIDEOMODE_HELPERS
 
 config DRM_PANEL_S6E8AA0
        tristate "S6E8AA0 DSI video mode panel"
-       depends on DRM && DRM_PANEL
        depends on OF
        select DRM_MIPI_DSI
        select VIDEOMODE_HELPERS
index db1601fdbe2946f581b0ec108057f94f647d1d10..42ac67b21e9fac04d9f0e0599426f0fa48abf4cb 100644 (file)
@@ -110,7 +110,10 @@ struct ld9040 {
        int error;
 };
 
-#define panel_to_ld9040(p) container_of(p, struct ld9040, panel)
+static inline struct ld9040 *panel_to_ld9040(struct drm_panel *panel)
+{
+       return container_of(panel, struct ld9040, panel);
+}
 
 static int ld9040_clear_error(struct ld9040 *ctx)
 {
@@ -215,6 +218,11 @@ static int ld9040_power_off(struct ld9040 *ctx)
 }
 
 static int ld9040_disable(struct drm_panel *panel)
+{
+       return 0;
+}
+
+static int ld9040_unprepare(struct drm_panel *panel)
 {
        struct ld9040 *ctx = panel_to_ld9040(panel);
 
@@ -228,7 +236,7 @@ static int ld9040_disable(struct drm_panel *panel)
        return ld9040_power_off(ctx);
 }
 
-static int ld9040_enable(struct drm_panel *panel)
+static int ld9040_prepare(struct drm_panel *panel)
 {
        struct ld9040 *ctx = panel_to_ld9040(panel);
        int ret;
@@ -242,11 +250,16 @@ static int ld9040_enable(struct drm_panel *panel)
        ret = ld9040_clear_error(ctx);
 
        if (ret < 0)
-               ld9040_disable(panel);
+               ld9040_unprepare(panel);
 
        return ret;
 }
 
+static int ld9040_enable(struct drm_panel *panel)
+{
+       return 0;
+}
+
 static int ld9040_get_modes(struct drm_panel *panel)
 {
        struct drm_connector *connector = panel->connector;
@@ -273,6 +286,8 @@ static int ld9040_get_modes(struct drm_panel *panel)
 
 static const struct drm_panel_funcs ld9040_drm_funcs = {
        .disable = ld9040_disable,
+       .unprepare = ld9040_unprepare,
+       .prepare = ld9040_prepare,
        .enable = ld9040_enable,
        .get_modes = ld9040_get_modes,
 };
index 06e57a26db7a5ed09561442aab1dfe840d770775..b5217fe37f02742e87df986280fb69c2097bead9 100644 (file)
@@ -120,7 +120,10 @@ struct s6e8aa0 {
        int error;
 };
 
-#define panel_to_s6e8aa0(p) container_of(p, struct s6e8aa0, panel)
+static inline struct s6e8aa0 *panel_to_s6e8aa0(struct drm_panel *panel)
+{
+       return container_of(panel, struct s6e8aa0, panel);
+}
 
 static int s6e8aa0_clear_error(struct s6e8aa0 *ctx)
 {
@@ -133,14 +136,14 @@ static int s6e8aa0_clear_error(struct s6e8aa0 *ctx)
 static void s6e8aa0_dcs_write(struct s6e8aa0 *ctx, const void *data, size_t len)
 {
        struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev);
-       int ret;
+       ssize_t ret;
 
        if (ctx->error < 0)
                return;
 
-       ret = mipi_dsi_dcs_write(dsi, dsi->channel, data, len);
+       ret = mipi_dsi_dcs_write(dsi, data, len);
        if (ret < 0) {
-               dev_err(ctx->dev, "error %d writing dcs seq: %*ph\n", ret, len,
+               dev_err(ctx->dev, "error %zd writing dcs seq: %*ph\n", ret, len,
                        data);
                ctx->error = ret;
        }
@@ -154,7 +157,7 @@ static int s6e8aa0_dcs_read(struct s6e8aa0 *ctx, u8 cmd, void *data, size_t len)
        if (ctx->error < 0)
                return ctx->error;
 
-       ret = mipi_dsi_dcs_read(dsi, dsi->channel, cmd, data, len);
+       ret = mipi_dsi_dcs_read(dsi, cmd, data, len);
        if (ret < 0) {
                dev_err(ctx->dev, "error %d reading dcs seq(%#x)\n", ret, cmd);
                ctx->error = ret;
@@ -888,6 +891,11 @@ static int s6e8aa0_power_off(struct s6e8aa0 *ctx)
 }
 
 static int s6e8aa0_disable(struct drm_panel *panel)
+{
+       return 0;
+}
+
+static int s6e8aa0_unprepare(struct drm_panel *panel)
 {
        struct s6e8aa0 *ctx = panel_to_s6e8aa0(panel);
 
@@ -900,7 +908,7 @@ static int s6e8aa0_disable(struct drm_panel *panel)
        return s6e8aa0_power_off(ctx);
 }
 
-static int s6e8aa0_enable(struct drm_panel *panel)
+static int s6e8aa0_prepare(struct drm_panel *panel)
 {
        struct s6e8aa0 *ctx = panel_to_s6e8aa0(panel);
        int ret;
@@ -913,11 +921,16 @@ static int s6e8aa0_enable(struct drm_panel *panel)
        ret = ctx->error;
 
        if (ret < 0)
-               s6e8aa0_disable(panel);
+               s6e8aa0_unprepare(panel);
 
        return ret;
 }
 
+static int s6e8aa0_enable(struct drm_panel *panel)
+{
+       return 0;
+}
+
 static int s6e8aa0_get_modes(struct drm_panel *panel)
 {
        struct drm_connector *connector = panel->connector;
@@ -944,6 +957,8 @@ static int s6e8aa0_get_modes(struct drm_panel *panel)
 
 static const struct drm_panel_funcs s6e8aa0_drm_funcs = {
        .disable = s6e8aa0_disable,
+       .unprepare = s6e8aa0_unprepare,
+       .prepare = s6e8aa0_prepare,
        .enable = s6e8aa0_enable,
        .get_modes = s6e8aa0_get_modes,
 };
index a25136132c318b3a18f9579d71de8799ffefad15..4ce1db0a68ff5754c37cb1eace4edccc6d6f03db 100644 (file)
@@ -37,14 +37,35 @@ struct panel_desc {
        const struct drm_display_mode *modes;
        unsigned int num_modes;
 
+       unsigned int bpc;
+
        struct {
                unsigned int width;
                unsigned int height;
        } size;
+
+       /**
+        * @prepare: the time (in milliseconds) that it takes for the panel to
+        *           become ready and start receiving video data
+        * @enable: the time (in milliseconds) that it takes for the panel to
+        *          display the first valid frame after starting to receive
+        *          video data
+        * @disable: the time (in milliseconds) that it takes for the panel to
+        *           turn the display off (no content is visible)
+        * @unprepare: the time (in milliseconds) that it takes for the panel
+        *             to power itself down completely
+        */
+       struct {
+               unsigned int prepare;
+               unsigned int enable;
+               unsigned int disable;
+               unsigned int unprepare;
+       } delay;
 };
 
 struct panel_simple {
        struct drm_panel base;
+       bool prepared;
        bool enabled;
 
        const struct panel_desc *desc;
@@ -87,6 +108,7 @@ static int panel_simple_get_fixed_modes(struct panel_simple *panel)
                num++;
        }
 
+       connector->display_info.bpc = panel->desc->bpc;
        connector->display_info.width_mm = panel->desc->size.width;
        connector->display_info.height_mm = panel->desc->size.height;
 
@@ -105,21 +127,40 @@ static int panel_simple_disable(struct drm_panel *panel)
                backlight_update_status(p->backlight);
        }
 
+       if (p->desc->delay.disable)
+               msleep(p->desc->delay.disable);
+
+       p->enabled = false;
+
+       return 0;
+}
+
+static int panel_simple_unprepare(struct drm_panel *panel)
+{
+       struct panel_simple *p = to_panel_simple(panel);
+
+       if (!p->prepared)
+               return 0;
+
        if (p->enable_gpio)
                gpiod_set_value_cansleep(p->enable_gpio, 0);
 
        regulator_disable(p->supply);
-       p->enabled = false;
+
+       if (p->desc->delay.unprepare)
+               msleep(p->desc->delay.unprepare);
+
+       p->prepared = false;
 
        return 0;
 }
 
-static int panel_simple_enable(struct drm_panel *panel)
+static int panel_simple_prepare(struct drm_panel *panel)
 {
        struct panel_simple *p = to_panel_simple(panel);
        int err;
 
-       if (p->enabled)
+       if (p->prepared)
                return 0;
 
        err = regulator_enable(p->supply);
@@ -131,6 +172,24 @@ static int panel_simple_enable(struct drm_panel *panel)
        if (p->enable_gpio)
                gpiod_set_value_cansleep(p->enable_gpio, 1);
 
+       if (p->desc->delay.prepare)
+               msleep(p->desc->delay.prepare);
+
+       p->prepared = true;
+
+       return 0;
+}
+
+static int panel_simple_enable(struct drm_panel *panel)
+{
+       struct panel_simple *p = to_panel_simple(panel);
+
+       if (p->enabled)
+               return 0;
+
+       if (p->desc->delay.enable)
+               msleep(p->desc->delay.enable);
+
        if (p->backlight) {
                p->backlight->props.power = FB_BLANK_UNBLANK;
                backlight_update_status(p->backlight);
@@ -164,6 +223,8 @@ static int panel_simple_get_modes(struct drm_panel *panel)
 
 static const struct drm_panel_funcs panel_simple_funcs = {
        .disable = panel_simple_disable,
+       .unprepare = panel_simple_unprepare,
+       .prepare = panel_simple_prepare,
        .enable = panel_simple_enable,
        .get_modes = panel_simple_get_modes,
 };
@@ -179,22 +240,21 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc)
                return -ENOMEM;
 
        panel->enabled = false;
+       panel->prepared = false;
        panel->desc = desc;
 
        panel->supply = devm_regulator_get(dev, "power");
        if (IS_ERR(panel->supply))
                return PTR_ERR(panel->supply);
 
-       panel->enable_gpio = devm_gpiod_get(dev, "enable");
+       panel->enable_gpio = devm_gpiod_get_optional(dev, "enable");
        if (IS_ERR(panel->enable_gpio)) {
                err = PTR_ERR(panel->enable_gpio);
-               if (err != -ENOENT) {
-                       dev_err(dev, "failed to request GPIO: %d\n", err);
-                       return err;
-               }
+               dev_err(dev, "failed to request GPIO: %d\n", err);
+               return err;
+       }
 
-               panel->enable_gpio = NULL;
-       } else {
+       if (panel->enable_gpio) {
                err = gpiod_direction_output(panel->enable_gpio, 0);
                if (err < 0) {
                        dev_err(dev, "failed to setup GPIO: %d\n", err);
@@ -285,6 +345,7 @@ static const struct drm_display_mode auo_b101aw03_mode = {
 static const struct panel_desc auo_b101aw03 = {
        .modes = &auo_b101aw03_mode,
        .num_modes = 1,
+       .bpc = 6,
        .size = {
                .width = 223,
                .height = 125,
@@ -307,12 +368,40 @@ static const struct drm_display_mode auo_b133xtn01_mode = {
 static const struct panel_desc auo_b133xtn01 = {
        .modes = &auo_b133xtn01_mode,
        .num_modes = 1,
+       .bpc = 6,
        .size = {
                .width = 293,
                .height = 165,
        },
 };
 
+static const struct drm_display_mode auo_b133htn01_mode = {
+       .clock = 150660,
+       .hdisplay = 1920,
+       .hsync_start = 1920 + 172,
+       .hsync_end = 1920 + 172 + 80,
+       .htotal = 1920 + 172 + 80 + 60,
+       .vdisplay = 1080,
+       .vsync_start = 1080 + 25,
+       .vsync_end = 1080 + 25 + 10,
+       .vtotal = 1080 + 25 + 10 + 10,
+       .vrefresh = 60,
+};
+
+static const struct panel_desc auo_b133htn01 = {
+       .modes = &auo_b133htn01_mode,
+       .num_modes = 1,
+       .size = {
+               .width = 293,
+               .height = 165,
+       },
+       .delay = {
+               .prepare = 105,
+               .enable = 20,
+               .unprepare = 50,
+       },
+};
+
 static const struct drm_display_mode chunghwa_claa101wa01a_mode = {
        .clock = 72070,
        .hdisplay = 1366,
@@ -329,6 +418,7 @@ static const struct drm_display_mode chunghwa_claa101wa01a_mode = {
 static const struct panel_desc chunghwa_claa101wa01a = {
        .modes = &chunghwa_claa101wa01a_mode,
        .num_modes = 1,
+       .bpc = 6,
        .size = {
                .width = 220,
                .height = 120,
@@ -351,6 +441,7 @@ static const struct drm_display_mode chunghwa_claa101wb01_mode = {
 static const struct panel_desc chunghwa_claa101wb01 = {
        .modes = &chunghwa_claa101wb01_mode,
        .num_modes = 1,
+       .bpc = 6,
        .size = {
                .width = 223,
                .height = 125,
@@ -374,6 +465,7 @@ static const struct drm_display_mode edt_et057090dhu_mode = {
 static const struct panel_desc edt_et057090dhu = {
        .modes = &edt_et057090dhu_mode,
        .num_modes = 1,
+       .bpc = 6,
        .size = {
                .width = 115,
                .height = 86,
@@ -397,12 +489,82 @@ static const struct drm_display_mode edt_etm0700g0dh6_mode = {
 static const struct panel_desc edt_etm0700g0dh6 = {
        .modes = &edt_etm0700g0dh6_mode,
        .num_modes = 1,
+       .bpc = 6,
        .size = {
                .width = 152,
                .height = 91,
        },
 };
 
+static const struct drm_display_mode foxlink_fl500wvr00_a0t_mode = {
+       .clock = 32260,
+       .hdisplay = 800,
+       .hsync_start = 800 + 168,
+       .hsync_end = 800 + 168 + 64,
+       .htotal = 800 + 168 + 64 + 88,
+       .vdisplay = 480,
+       .vsync_start = 480 + 37,
+       .vsync_end = 480 + 37 + 2,
+       .vtotal = 480 + 37 + 2 + 8,
+       .vrefresh = 60,
+};
+
+static const struct panel_desc foxlink_fl500wvr00_a0t = {
+       .modes = &foxlink_fl500wvr00_a0t_mode,
+       .num_modes = 1,
+       .size = {
+               .width = 108,
+               .height = 65,
+       },
+};
+
+static const struct drm_display_mode innolux_n116bge_mode = {
+       .clock = 71000,
+       .hdisplay = 1366,
+       .hsync_start = 1366 + 64,
+       .hsync_end = 1366 + 64 + 6,
+       .htotal = 1366 + 64 + 6 + 64,
+       .vdisplay = 768,
+       .vsync_start = 768 + 8,
+       .vsync_end = 768 + 8 + 4,
+       .vtotal = 768 + 8 + 4 + 8,
+       .vrefresh = 60,
+       .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
+};
+
+static const struct panel_desc innolux_n116bge = {
+       .modes = &innolux_n116bge_mode,
+       .num_modes = 1,
+       .bpc = 6,
+       .size = {
+               .width = 256,
+               .height = 144,
+       },
+};
+
+static const struct drm_display_mode innolux_n156bge_l21_mode = {
+       .clock = 69300,
+       .hdisplay = 1366,
+       .hsync_start = 1366 + 16,
+       .hsync_end = 1366 + 16 + 34,
+       .htotal = 1366 + 16 + 34 + 50,
+       .vdisplay = 768,
+       .vsync_start = 768 + 2,
+       .vsync_end = 768 + 2 + 6,
+       .vtotal = 768 + 2 + 6 + 12,
+       .vrefresh = 60,
+};
+
+static const struct panel_desc innolux_n156bge_l21 = {
+       .modes = &innolux_n156bge_l21_mode,
+       .num_modes = 1,
+       .bpc = 6,
+       .size = {
+               .width = 344,
+               .height = 193,
+       },
+};
+
 static const struct drm_display_mode lg_lp129qe_mode = {
        .clock = 285250,
        .hdisplay = 2560,
@@ -419,6 +581,7 @@ static const struct drm_display_mode lg_lp129qe_mode = {
 static const struct panel_desc lg_lp129qe = {
        .modes = &lg_lp129qe_mode,
        .num_modes = 1,
+       .bpc = 8,
        .size = {
                .width = 272,
                .height = 181,
@@ -441,6 +604,7 @@ static const struct drm_display_mode samsung_ltn101nt05_mode = {
 static const struct panel_desc samsung_ltn101nt05 = {
        .modes = &samsung_ltn101nt05_mode,
        .num_modes = 1,
+       .bpc = 6,
        .size = {
                .width = 1024,
                .height = 600,
@@ -451,6 +615,9 @@ static const struct of_device_id platform_of_match[] = {
        {
                .compatible = "auo,b101aw03",
                .data = &auo_b101aw03,
+       }, {
+               .compatible = "auo,b133htn01",
+               .data = &auo_b133htn01,
        }, {
                .compatible = "auo,b133xtn01",
                .data = &auo_b133xtn01,
@@ -469,14 +636,21 @@ static const struct of_device_id platform_of_match[] = {
        }, {
                .compatible = "edt,etm0700g0dh6",
                .data = &edt_etm0700g0dh6,
+       }, {
+               .compatible = "foxlink,fl500wvr00-a0t",
+               .data = &foxlink_fl500wvr00_a0t,
+       }, {
+               .compatible = "innolux,n116bge",
+               .data = &innolux_n116bge,
+       }, {
+               .compatible = "innolux,n156bge-l21",
+               .data = &innolux_n156bge_l21,
        }, {
                .compatible = "lg,lp129qe",
                .data = &lg_lp129qe,
        }, {
                .compatible = "samsung,ltn101nt05",
                .data = &samsung_ltn101nt05,
-       }, {
-               .compatible = "simple-panel",
        }, {
                /* sentinel */
        }
@@ -545,7 +719,7 @@ static const struct panel_desc_dsi lg_ld070wx3_sl01 = {
                        .height = 151,
                },
        },
-       .flags = MIPI_DSI_MODE_VIDEO,
+       .flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_CLOCK_NON_CONTINUOUS,
        .format = MIPI_DSI_FMT_RGB888,
        .lanes = 4,
 };
@@ -599,7 +773,8 @@ static const struct panel_desc_dsi panasonic_vvx10f004b00 = {
                        .height = 136,
                },
        },
-       .flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE,
+       .flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE |
+                MIPI_DSI_CLOCK_NON_CONTINUOUS,
        .format = MIPI_DSI_FMT_RGB888,
        .lanes = 4,
 };
index 5d7ea24618524bc0c23187a2b58e551eb96cdbc9..b8ced08b62916b643436375aa853a82c2560a947 100644 (file)
@@ -835,7 +835,7 @@ static void qxl_conn_destroy(struct drm_connector *connector)
        struct qxl_output *qxl_output =
                drm_connector_to_qxl_output(connector);
 
-       drm_sysfs_connector_remove(connector);
+       drm_connector_unregister(connector);
        drm_connector_cleanup(connector);
        kfree(qxl_output);
 }
@@ -902,7 +902,7 @@ static int qdev_output_init(struct drm_device *dev, int num_output)
 
        drm_object_attach_property(&connector->base,
                                   qdev->hotplug_mode_update_property, 0);
-       drm_sysfs_connector_add(connector);
+       drm_connector_register(connector);
        return 0;
 }
 
index f437b30ce6896736da893c2a8651ca23e0a1ed55..df567888bb1e3e04ef73b3b3f38a8a9e75e1fc5d 100644 (file)
@@ -660,7 +660,7 @@ static int qxl_fbdev_destroy(struct drm_device *dev, struct qxl_fbdev *qfbdev)
        return 0;
 }
 
-static struct drm_fb_helper_funcs qxl_fb_helper_funcs = {
+static const struct drm_fb_helper_funcs qxl_fb_helper_funcs = {
        .fb_probe = qxl_fb_find_or_create_single,
 };
 
@@ -676,9 +676,12 @@ int qxl_fbdev_init(struct qxl_device *qdev)
 
        qfbdev->qdev = qdev;
        qdev->mode_info.qfbdev = qfbdev;
-       qfbdev->helper.funcs = &qxl_fb_helper_funcs;
        spin_lock_init(&qfbdev->delayed_ops_lock);
        INIT_LIST_HEAD(&qfbdev->delayed_ops);
+
+       drm_fb_helper_prepare(qdev->ddev, &qfbdev->helper,
+                             &qxl_fb_helper_funcs);
+
        ret = drm_fb_helper_init(qdev->ddev, &qfbdev->helper,
                                 qxl_num_crtc /* num_crtc - QXL supports just 1 */,
                                 QXLFB_CONN_LIMIT);
index d458a140c02407c01858f2d7b8a212e80417db3a..83a423293afd67a66079dac61ec8bbc48f254edb 100644 (file)
@@ -31,7 +31,7 @@ static inline int qxl_bo_reserve(struct qxl_bo *bo, bool no_wait)
 {
        int r;
 
-       r = ttm_bo_reserve(&bo->tbo, true, no_wait, false, 0);
+       r = ttm_bo_reserve(&bo->tbo, true, no_wait, false, NULL);
        if (unlikely(r != 0)) {
                if (r != -ERESTARTSYS) {
                        struct qxl_device *qdev = (struct qxl_device *)bo->gem_base.dev->dev_private;
@@ -67,7 +67,7 @@ static inline int qxl_bo_wait(struct qxl_bo *bo, u32 *mem_type,
 {
        int r;
 
-       r = ttm_bo_reserve(&bo->tbo, true, no_wait, false, 0);
+       r = ttm_bo_reserve(&bo->tbo, true, no_wait, false, NULL);
        if (unlikely(r != 0)) {
                if (r != -ERESTARTSYS) {
                        struct qxl_device *qdev = (struct qxl_device *)bo->gem_base.dev->dev_private;
index dbcbfe80aac0293892259f5602256d2f559453cf..0013ad0db9efceea452959db8a3bfe12fc4440ee 100644 (file)
@@ -80,7 +80,7 @@ radeon-y += radeon_device.o radeon_asic.o radeon_kms.o \
        r600_dpm.o rs780_dpm.o rv6xx_dpm.o rv770_dpm.o rv730_dpm.o rv740_dpm.o \
        rv770_smc.o cypress_dpm.o btc_dpm.o sumo_dpm.o sumo_smc.o trinity_dpm.o \
        trinity_smc.o ni_dpm.o si_smc.o si_dpm.o kv_smc.o kv_dpm.o ci_smc.o \
-       ci_dpm.o dce6_afmt.o radeon_vm.o
+       ci_dpm.o dce6_afmt.o radeon_vm.o radeon_ucode.o radeon_ib.o
 
 # add async DMA block
 radeon-y += \
index 7d68203a3737f39d49594dc25dbdda64365a45b7..a7f2ddf09a9d20024a0cca95e70d3f3b8ff5fc12 100644 (file)
@@ -331,12 +331,10 @@ static bool radeon_atom_mode_fixup(struct drm_encoder *encoder,
            && (mode->crtc_vsync_start < (mode->crtc_vdisplay + 2)))
                adjusted_mode->crtc_vsync_start = adjusted_mode->crtc_vdisplay + 2;
 
-       /* get the native mode for LVDS */
-       if (radeon_encoder->active_device & (ATOM_DEVICE_LCD_SUPPORT))
+       /* get the native mode for scaling */
+       if (radeon_encoder->active_device & (ATOM_DEVICE_LCD_SUPPORT)) {
                radeon_panel_mode_fixup(encoder, adjusted_mode);
-
-       /* get the native mode for TV */
-       if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT)) {
+       } else if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT)) {
                struct radeon_encoder_atom_dac *tv_dac = radeon_encoder->enc_priv;
                if (tv_dac) {
                        if (tv_dac->tv_std == TV_STD_NTSC ||
@@ -346,6 +344,8 @@ static bool radeon_atom_mode_fixup(struct drm_encoder *encoder,
                        else
                                radeon_atom_get_tv_timings(rdev, 1, adjusted_mode);
                }
+       } else if (radeon_encoder->rmx_type != RMX_OFF) {
+               radeon_panel_mode_fixup(encoder, adjusted_mode);
        }
 
        if (ASIC_IS_DCE3(rdev) &&
@@ -716,7 +716,7 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)
                        if (radeon_connector->use_digital &&
                            (radeon_connector->audio == RADEON_AUDIO_ENABLE))
                                return ATOM_ENCODER_MODE_HDMI;
-                       else if (drm_detect_hdmi_monitor(radeon_connector->edid) &&
+                       else if (drm_detect_hdmi_monitor(radeon_connector_edid(connector)) &&
                                 (radeon_connector->audio == RADEON_AUDIO_AUTO))
                                return ATOM_ENCODER_MODE_HDMI;
                        else if (radeon_connector->use_digital)
@@ -735,7 +735,7 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)
                if (radeon_audio != 0) {
                        if (radeon_connector->audio == RADEON_AUDIO_ENABLE)
                                return ATOM_ENCODER_MODE_HDMI;
-                       else if (drm_detect_hdmi_monitor(radeon_connector->edid) &&
+                       else if (drm_detect_hdmi_monitor(radeon_connector_edid(connector)) &&
                                 (radeon_connector->audio == RADEON_AUDIO_AUTO))
                                return ATOM_ENCODER_MODE_HDMI;
                        else
@@ -755,7 +755,7 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)
                } else if (radeon_audio != 0) {
                        if (radeon_connector->audio == RADEON_AUDIO_ENABLE)
                                return ATOM_ENCODER_MODE_HDMI;
-                       else if (drm_detect_hdmi_monitor(radeon_connector->edid) &&
+                       else if (drm_detect_hdmi_monitor(radeon_connector_edid(connector)) &&
                                 (radeon_connector->audio == RADEON_AUDIO_AUTO))
                                return ATOM_ENCODER_MODE_HDMI;
                        else
index 584090ac3eb90dfb631d066e67afc7e18d889c24..022561e2870722bd56c22fa65ebaf5b9bf1987a8 100644 (file)
@@ -940,7 +940,18 @@ static void ci_get_leakage_voltages(struct radeon_device *rdev)
        pi->vddc_leakage.count = 0;
        pi->vddci_leakage.count = 0;
 
-       if (radeon_atom_get_leakage_id_from_vbios(rdev, &leakage_id) == 0) {
+       if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_EVV) {
+               for (i = 0; i < CISLANDS_MAX_LEAKAGE_COUNT; i++) {
+                       virtual_voltage_id = ATOM_VIRTUAL_VOLTAGE_ID0 + i;
+                       if (radeon_atom_get_voltage_evv(rdev, virtual_voltage_id, &vddc) != 0)
+                               continue;
+                       if (vddc != 0 && vddc != virtual_voltage_id) {
+                               pi->vddc_leakage.actual_voltage[pi->vddc_leakage.count] = vddc;
+                               pi->vddc_leakage.leakage_id[pi->vddc_leakage.count] = virtual_voltage_id;
+                               pi->vddc_leakage.count++;
+                       }
+               }
+       } else if (radeon_atom_get_leakage_id_from_vbios(rdev, &leakage_id) == 0) {
                for (i = 0; i < CISLANDS_MAX_LEAKAGE_COUNT; i++) {
                        virtual_voltage_id = ATOM_VIRTUAL_VOLTAGE_ID0 + i;
                        if (radeon_atom_get_leakage_vddc_based_on_leakage_params(rdev, &vddc, &vddci,
index 8debc9d473625d642243b5a1923b6725eb534387..b630edc2fd0c5d2b27c78bc8042eece5041076d5 100644 (file)
@@ -213,24 +213,37 @@ int ci_load_smc_ucode(struct radeon_device *rdev, u32 limit)
        if (!rdev->smc_fw)
                return -EINVAL;
 
-       switch (rdev->family) {
-       case CHIP_BONAIRE:
-               ucode_start_address = BONAIRE_SMC_UCODE_START;
-               ucode_size = BONAIRE_SMC_UCODE_SIZE;
-               break;
-       case CHIP_HAWAII:
-               ucode_start_address = HAWAII_SMC_UCODE_START;
-               ucode_size = HAWAII_SMC_UCODE_SIZE;
-               break;
-       default:
-               DRM_ERROR("unknown asic in smc ucode loader\n");
-               BUG();
+       if (rdev->new_fw) {
+               const struct smc_firmware_header_v1_0 *hdr =
+                       (const struct smc_firmware_header_v1_0 *)rdev->smc_fw->data;
+
+               radeon_ucode_print_smc_hdr(&hdr->header);
+
+               ucode_start_address = le32_to_cpu(hdr->ucode_start_addr);
+               ucode_size = le32_to_cpu(hdr->header.ucode_size_bytes);
+               src = (const u8 *)
+                       (rdev->smc_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
+       } else {
+               switch (rdev->family) {
+               case CHIP_BONAIRE:
+                       ucode_start_address = BONAIRE_SMC_UCODE_START;
+                       ucode_size = BONAIRE_SMC_UCODE_SIZE;
+                       break;
+               case CHIP_HAWAII:
+                       ucode_start_address = HAWAII_SMC_UCODE_START;
+                       ucode_size = HAWAII_SMC_UCODE_SIZE;
+                       break;
+               default:
+                       DRM_ERROR("unknown asic in smc ucode loader\n");
+                       BUG();
+               }
+
+               src = (const u8 *)rdev->smc_fw->data;
        }
 
        if (ucode_size & 3)
                return -EINVAL;
 
-       src = (const u8 *)rdev->smc_fw->data;
        spin_lock_irqsave(&rdev->smc_idx_lock, flags);
        WREG32(SMC_IND_INDEX_0, ucode_start_address);
        WREG32_P(SMC_IND_ACCESS_CNTL, AUTO_INCREMENT_IND_0, ~AUTO_INCREMENT_IND_0);
index c0ea66192fe03a8fe977ac0aea977a07204530c4..b625646bf3e242c11d21fd268c698a502604fae0 100644 (file)
@@ -42,6 +42,16 @@ MODULE_FIRMWARE("radeon/BONAIRE_mc2.bin");
 MODULE_FIRMWARE("radeon/BONAIRE_rlc.bin");
 MODULE_FIRMWARE("radeon/BONAIRE_sdma.bin");
 MODULE_FIRMWARE("radeon/BONAIRE_smc.bin");
+
+MODULE_FIRMWARE("radeon/bonaire_pfp.bin");
+MODULE_FIRMWARE("radeon/bonaire_me.bin");
+MODULE_FIRMWARE("radeon/bonaire_ce.bin");
+MODULE_FIRMWARE("radeon/bonaire_mec.bin");
+MODULE_FIRMWARE("radeon/bonaire_mc.bin");
+MODULE_FIRMWARE("radeon/bonaire_rlc.bin");
+MODULE_FIRMWARE("radeon/bonaire_sdma.bin");
+MODULE_FIRMWARE("radeon/bonaire_smc.bin");
+
 MODULE_FIRMWARE("radeon/HAWAII_pfp.bin");
 MODULE_FIRMWARE("radeon/HAWAII_me.bin");
 MODULE_FIRMWARE("radeon/HAWAII_ce.bin");
@@ -51,18 +61,45 @@ MODULE_FIRMWARE("radeon/HAWAII_mc2.bin");
 MODULE_FIRMWARE("radeon/HAWAII_rlc.bin");
 MODULE_FIRMWARE("radeon/HAWAII_sdma.bin");
 MODULE_FIRMWARE("radeon/HAWAII_smc.bin");
+
+MODULE_FIRMWARE("radeon/hawaii_pfp.bin");
+MODULE_FIRMWARE("radeon/hawaii_me.bin");
+MODULE_FIRMWARE("radeon/hawaii_ce.bin");
+MODULE_FIRMWARE("radeon/hawaii_mec.bin");
+MODULE_FIRMWARE("radeon/hawaii_mc.bin");
+MODULE_FIRMWARE("radeon/hawaii_rlc.bin");
+MODULE_FIRMWARE("radeon/hawaii_sdma.bin");
+MODULE_FIRMWARE("radeon/hawaii_smc.bin");
+
 MODULE_FIRMWARE("radeon/KAVERI_pfp.bin");
 MODULE_FIRMWARE("radeon/KAVERI_me.bin");
 MODULE_FIRMWARE("radeon/KAVERI_ce.bin");
 MODULE_FIRMWARE("radeon/KAVERI_mec.bin");
 MODULE_FIRMWARE("radeon/KAVERI_rlc.bin");
 MODULE_FIRMWARE("radeon/KAVERI_sdma.bin");
+
+MODULE_FIRMWARE("radeon/kaveri_pfp.bin");
+MODULE_FIRMWARE("radeon/kaveri_me.bin");
+MODULE_FIRMWARE("radeon/kaveri_ce.bin");
+MODULE_FIRMWARE("radeon/kaveri_mec.bin");
+MODULE_FIRMWARE("radeon/kaveri_mec2.bin");
+MODULE_FIRMWARE("radeon/kaveri_rlc.bin");
+MODULE_FIRMWARE("radeon/kaveri_sdma.bin");
+
 MODULE_FIRMWARE("radeon/KABINI_pfp.bin");
 MODULE_FIRMWARE("radeon/KABINI_me.bin");
 MODULE_FIRMWARE("radeon/KABINI_ce.bin");
 MODULE_FIRMWARE("radeon/KABINI_mec.bin");
 MODULE_FIRMWARE("radeon/KABINI_rlc.bin");
 MODULE_FIRMWARE("radeon/KABINI_sdma.bin");
+
+MODULE_FIRMWARE("radeon/kabini_pfp.bin");
+MODULE_FIRMWARE("radeon/kabini_me.bin");
+MODULE_FIRMWARE("radeon/kabini_ce.bin");
+MODULE_FIRMWARE("radeon/kabini_mec.bin");
+MODULE_FIRMWARE("radeon/kabini_rlc.bin");
+MODULE_FIRMWARE("radeon/kabini_sdma.bin");
+
 MODULE_FIRMWARE("radeon/MULLINS_pfp.bin");
 MODULE_FIRMWARE("radeon/MULLINS_me.bin");
 MODULE_FIRMWARE("radeon/MULLINS_ce.bin");
@@ -70,6 +107,13 @@ MODULE_FIRMWARE("radeon/MULLINS_mec.bin");
 MODULE_FIRMWARE("radeon/MULLINS_rlc.bin");
 MODULE_FIRMWARE("radeon/MULLINS_sdma.bin");
 
+MODULE_FIRMWARE("radeon/mullins_pfp.bin");
+MODULE_FIRMWARE("radeon/mullins_me.bin");
+MODULE_FIRMWARE("radeon/mullins_ce.bin");
+MODULE_FIRMWARE("radeon/mullins_mec.bin");
+MODULE_FIRMWARE("radeon/mullins_rlc.bin");
+MODULE_FIRMWARE("radeon/mullins_sdma.bin");
+
 extern int r600_ih_ring_alloc(struct radeon_device *rdev);
 extern void r600_ih_ring_fini(struct radeon_device *rdev);
 extern void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save);
@@ -1760,27 +1804,44 @@ static void cik_srbm_select(struct radeon_device *rdev,
  */
 int ci_mc_load_microcode(struct radeon_device *rdev)
 {
-       const __be32 *fw_data;
+       const __be32 *fw_data = NULL;
+       const __le32 *new_fw_data = NULL;
        u32 running, blackout = 0;
-       u32 *io_mc_regs;
+       u32 *io_mc_regs = NULL;
+       const __le32 *new_io_mc_regs = NULL;
        int i, regs_size, ucode_size;
 
        if (!rdev->mc_fw)
                return -EINVAL;
 
-       ucode_size = rdev->mc_fw->size / 4;
+       if (rdev->new_fw) {
+               const struct mc_firmware_header_v1_0 *hdr =
+                       (const struct mc_firmware_header_v1_0 *)rdev->mc_fw->data;
 
-       switch (rdev->family) {
-       case CHIP_BONAIRE:
-               io_mc_regs = (u32 *)&bonaire_io_mc_regs;
-               regs_size = BONAIRE_IO_MC_REGS_SIZE;
-               break;
-       case CHIP_HAWAII:
-               io_mc_regs = (u32 *)&hawaii_io_mc_regs;
-               regs_size = HAWAII_IO_MC_REGS_SIZE;
-               break;
-       default:
-               return -EINVAL;
+               radeon_ucode_print_mc_hdr(&hdr->header);
+
+               regs_size = le32_to_cpu(hdr->io_debug_size_bytes) / (4 * 2);
+               new_io_mc_regs = (const __le32 *)
+                       (rdev->mc_fw->data + le32_to_cpu(hdr->io_debug_array_offset_bytes));
+               ucode_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4;
+               new_fw_data = (const __le32 *)
+                       (rdev->mc_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
+       } else {
+               ucode_size = rdev->mc_fw->size / 4;
+
+               switch (rdev->family) {
+               case CHIP_BONAIRE:
+                       io_mc_regs = (u32 *)&bonaire_io_mc_regs;
+                       regs_size = BONAIRE_IO_MC_REGS_SIZE;
+                       break;
+               case CHIP_HAWAII:
+                       io_mc_regs = (u32 *)&hawaii_io_mc_regs;
+                       regs_size = HAWAII_IO_MC_REGS_SIZE;
+                       break;
+               default:
+                       return -EINVAL;
+               }
+               fw_data = (const __be32 *)rdev->mc_fw->data;
        }
 
        running = RREG32(MC_SEQ_SUP_CNTL) & RUN_MASK;
@@ -1797,13 +1858,21 @@ int ci_mc_load_microcode(struct radeon_device *rdev)
 
                /* load mc io regs */
                for (i = 0; i < regs_size; i++) {
-                       WREG32(MC_SEQ_IO_DEBUG_INDEX, io_mc_regs[(i << 1)]);
-                       WREG32(MC_SEQ_IO_DEBUG_DATA, io_mc_regs[(i << 1) + 1]);
+                       if (rdev->new_fw) {
+                               WREG32(MC_SEQ_IO_DEBUG_INDEX, le32_to_cpup(new_io_mc_regs++));
+                               WREG32(MC_SEQ_IO_DEBUG_DATA, le32_to_cpup(new_io_mc_regs++));
+                       } else {
+                               WREG32(MC_SEQ_IO_DEBUG_INDEX, io_mc_regs[(i << 1)]);
+                               WREG32(MC_SEQ_IO_DEBUG_DATA, io_mc_regs[(i << 1) + 1]);
+                       }
                }
                /* load the MC ucode */
-               fw_data = (const __be32 *)rdev->mc_fw->data;
-               for (i = 0; i < ucode_size; i++)
-                       WREG32(MC_SEQ_SUP_PGM, be32_to_cpup(fw_data++));
+               for (i = 0; i < ucode_size; i++) {
+                       if (rdev->new_fw)
+                               WREG32(MC_SEQ_SUP_PGM, le32_to_cpup(new_fw_data++));
+                       else
+                               WREG32(MC_SEQ_SUP_PGM, be32_to_cpup(fw_data++));
+               }
 
                /* put the engine back into the active state */
                WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
@@ -1841,17 +1910,21 @@ int ci_mc_load_microcode(struct radeon_device *rdev)
 static int cik_init_microcode(struct radeon_device *rdev)
 {
        const char *chip_name;
+       const char *new_chip_name;
        size_t pfp_req_size, me_req_size, ce_req_size,
                mec_req_size, rlc_req_size, mc_req_size = 0,
                sdma_req_size, smc_req_size = 0, mc2_req_size = 0;
        char fw_name[30];
+       int new_fw = 0;
        int err;
+       int num_fw;
 
        DRM_DEBUG("\n");
 
        switch (rdev->family) {
        case CHIP_BONAIRE:
                chip_name = "BONAIRE";
+               new_chip_name = "bonaire";
                pfp_req_size = CIK_PFP_UCODE_SIZE * 4;
                me_req_size = CIK_ME_UCODE_SIZE * 4;
                ce_req_size = CIK_CE_UCODE_SIZE * 4;
@@ -1861,9 +1934,11 @@ static int cik_init_microcode(struct radeon_device *rdev)
                mc2_req_size = BONAIRE_MC2_UCODE_SIZE * 4;
                sdma_req_size = CIK_SDMA_UCODE_SIZE * 4;
                smc_req_size = ALIGN(BONAIRE_SMC_UCODE_SIZE, 4);
+               num_fw = 8;
                break;
        case CHIP_HAWAII:
                chip_name = "HAWAII";
+               new_chip_name = "hawaii";
                pfp_req_size = CIK_PFP_UCODE_SIZE * 4;
                me_req_size = CIK_ME_UCODE_SIZE * 4;
                ce_req_size = CIK_CE_UCODE_SIZE * 4;
@@ -1873,142 +1948,285 @@ static int cik_init_microcode(struct radeon_device *rdev)
                mc2_req_size = HAWAII_MC2_UCODE_SIZE * 4;
                sdma_req_size = CIK_SDMA_UCODE_SIZE * 4;
                smc_req_size = ALIGN(HAWAII_SMC_UCODE_SIZE, 4);
+               num_fw = 8;
                break;
        case CHIP_KAVERI:
                chip_name = "KAVERI";
+               new_chip_name = "kaveri";
                pfp_req_size = CIK_PFP_UCODE_SIZE * 4;
                me_req_size = CIK_ME_UCODE_SIZE * 4;
                ce_req_size = CIK_CE_UCODE_SIZE * 4;
                mec_req_size = CIK_MEC_UCODE_SIZE * 4;
                rlc_req_size = KV_RLC_UCODE_SIZE * 4;
                sdma_req_size = CIK_SDMA_UCODE_SIZE * 4;
+               num_fw = 7;
                break;
        case CHIP_KABINI:
                chip_name = "KABINI";
+               new_chip_name = "kabini";
                pfp_req_size = CIK_PFP_UCODE_SIZE * 4;
                me_req_size = CIK_ME_UCODE_SIZE * 4;
                ce_req_size = CIK_CE_UCODE_SIZE * 4;
                mec_req_size = CIK_MEC_UCODE_SIZE * 4;
                rlc_req_size = KB_RLC_UCODE_SIZE * 4;
                sdma_req_size = CIK_SDMA_UCODE_SIZE * 4;
+               num_fw = 6;
                break;
        case CHIP_MULLINS:
                chip_name = "MULLINS";
+               new_chip_name = "mullins";
                pfp_req_size = CIK_PFP_UCODE_SIZE * 4;
                me_req_size = CIK_ME_UCODE_SIZE * 4;
                ce_req_size = CIK_CE_UCODE_SIZE * 4;
                mec_req_size = CIK_MEC_UCODE_SIZE * 4;
                rlc_req_size = ML_RLC_UCODE_SIZE * 4;
                sdma_req_size = CIK_SDMA_UCODE_SIZE * 4;
+               num_fw = 6;
                break;
        default: BUG();
        }
 
-       DRM_INFO("Loading %s Microcode\n", chip_name);
+       DRM_INFO("Loading %s Microcode\n", new_chip_name);
 
-       snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name);
+       snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", new_chip_name);
        err = request_firmware(&rdev->pfp_fw, fw_name, rdev->dev);
-       if (err)
-               goto out;
-       if (rdev->pfp_fw->size != pfp_req_size) {
-               printk(KERN_ERR
-                      "cik_cp: Bogus length %zu in firmware \"%s\"\n",
-                      rdev->pfp_fw->size, fw_name);
-               err = -EINVAL;
-               goto out;
+       if (err) {
+               snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name);
+               err = request_firmware(&rdev->pfp_fw, fw_name, rdev->dev);
+               if (err)
+                       goto out;
+               if (rdev->pfp_fw->size != pfp_req_size) {
+                       printk(KERN_ERR
+                              "cik_cp: Bogus length %zu in firmware \"%s\"\n",
+                              rdev->pfp_fw->size, fw_name);
+                       err = -EINVAL;
+                       goto out;
+               }
+       } else {
+               err = radeon_ucode_validate(rdev->pfp_fw);
+               if (err) {
+                       printk(KERN_ERR
+                              "cik_fw: validation failed for firmware \"%s\"\n",
+                              fw_name);
+                       goto out;
+               } else {
+                       new_fw++;
+               }
        }
 
-       snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name);
+       snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", new_chip_name);
        err = request_firmware(&rdev->me_fw, fw_name, rdev->dev);
-       if (err)
-               goto out;
-       if (rdev->me_fw->size != me_req_size) {
-               printk(KERN_ERR
-                      "cik_cp: Bogus length %zu in firmware \"%s\"\n",
-                      rdev->me_fw->size, fw_name);
-               err = -EINVAL;
+       if (err) {
+               snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name);
+               err = request_firmware(&rdev->me_fw, fw_name, rdev->dev);
+               if (err)
+                       goto out;
+               if (rdev->me_fw->size != me_req_size) {
+                       printk(KERN_ERR
+                              "cik_cp: Bogus length %zu in firmware \"%s\"\n",
+                              rdev->me_fw->size, fw_name);
+                       err = -EINVAL;
+               }
+       } else {
+               err = radeon_ucode_validate(rdev->me_fw);
+               if (err) {
+                       printk(KERN_ERR
+                              "cik_fw: validation failed for firmware \"%s\"\n",
+                              fw_name);
+                       goto out;
+               } else {
+                       new_fw++;
+               }
        }
 
-       snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", chip_name);
+       snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", new_chip_name);
        err = request_firmware(&rdev->ce_fw, fw_name, rdev->dev);
-       if (err)
-               goto out;
-       if (rdev->ce_fw->size != ce_req_size) {
-               printk(KERN_ERR
-                      "cik_cp: Bogus length %zu in firmware \"%s\"\n",
-                      rdev->ce_fw->size, fw_name);
-               err = -EINVAL;
+       if (err) {
+               snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", chip_name);
+               err = request_firmware(&rdev->ce_fw, fw_name, rdev->dev);
+               if (err)
+                       goto out;
+               if (rdev->ce_fw->size != ce_req_size) {
+                       printk(KERN_ERR
+                              "cik_cp: Bogus length %zu in firmware \"%s\"\n",
+                              rdev->ce_fw->size, fw_name);
+                       err = -EINVAL;
+               }
+       } else {
+               err = radeon_ucode_validate(rdev->ce_fw);
+               if (err) {
+                       printk(KERN_ERR
+                              "cik_fw: validation failed for firmware \"%s\"\n",
+                              fw_name);
+                       goto out;
+               } else {
+                       new_fw++;
+               }
        }
 
-       snprintf(fw_name, sizeof(fw_name), "radeon/%s_mec.bin", chip_name);
+       snprintf(fw_name, sizeof(fw_name), "radeon/%s_mec.bin", new_chip_name);
        err = request_firmware(&rdev->mec_fw, fw_name, rdev->dev);
-       if (err)
-               goto out;
-       if (rdev->mec_fw->size != mec_req_size) {
-               printk(KERN_ERR
-                      "cik_cp: Bogus length %zu in firmware \"%s\"\n",
-                      rdev->mec_fw->size, fw_name);
-               err = -EINVAL;
+       if (err) {
+               snprintf(fw_name, sizeof(fw_name), "radeon/%s_mec.bin", chip_name);
+               err = request_firmware(&rdev->mec_fw, fw_name, rdev->dev);
+               if (err)
+                       goto out;
+               if (rdev->mec_fw->size != mec_req_size) {
+                       printk(KERN_ERR
+                              "cik_cp: Bogus length %zu in firmware \"%s\"\n",
+                              rdev->mec_fw->size, fw_name);
+                       err = -EINVAL;
+               }
+       } else {
+               err = radeon_ucode_validate(rdev->mec_fw);
+               if (err) {
+                       printk(KERN_ERR
+                              "cik_fw: validation failed for firmware \"%s\"\n",
+                              fw_name);
+                       goto out;
+               } else {
+                       new_fw++;
+               }
+       }
+
+       if (rdev->family == CHIP_KAVERI) {
+               snprintf(fw_name, sizeof(fw_name), "radeon/%s_mec2.bin", new_chip_name);
+               err = request_firmware(&rdev->mec2_fw, fw_name, rdev->dev);
+               if (err) {
+                       goto out;
+               } else {
+                       err = radeon_ucode_validate(rdev->mec2_fw);
+                       if (err) {
+                               goto out;
+                       } else {
+                               new_fw++;
+                       }
+               }
        }
 
-       snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", chip_name);
+       snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", new_chip_name);
        err = request_firmware(&rdev->rlc_fw, fw_name, rdev->dev);
-       if (err)
-               goto out;
-       if (rdev->rlc_fw->size != rlc_req_size) {
-               printk(KERN_ERR
-                      "cik_rlc: Bogus length %zu in firmware \"%s\"\n",
-                      rdev->rlc_fw->size, fw_name);
-               err = -EINVAL;
+       if (err) {
+               snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", chip_name);
+               err = request_firmware(&rdev->rlc_fw, fw_name, rdev->dev);
+               if (err)
+                       goto out;
+               if (rdev->rlc_fw->size != rlc_req_size) {
+                       printk(KERN_ERR
+                              "cik_rlc: Bogus length %zu in firmware \"%s\"\n",
+                              rdev->rlc_fw->size, fw_name);
+                       err = -EINVAL;
+               }
+       } else {
+               err = radeon_ucode_validate(rdev->rlc_fw);
+               if (err) {
+                       printk(KERN_ERR
+                              "cik_fw: validation failed for firmware \"%s\"\n",
+                              fw_name);
+                       goto out;
+               } else {
+                       new_fw++;
+               }
        }
 
-       snprintf(fw_name, sizeof(fw_name), "radeon/%s_sdma.bin", chip_name);
+       snprintf(fw_name, sizeof(fw_name), "radeon/%s_sdma.bin", new_chip_name);
        err = request_firmware(&rdev->sdma_fw, fw_name, rdev->dev);
-       if (err)
-               goto out;
-       if (rdev->sdma_fw->size != sdma_req_size) {
-               printk(KERN_ERR
-                      "cik_sdma: Bogus length %zu in firmware \"%s\"\n",
-                      rdev->sdma_fw->size, fw_name);
-               err = -EINVAL;
+       if (err) {
+               snprintf(fw_name, sizeof(fw_name), "radeon/%s_sdma.bin", chip_name);
+               err = request_firmware(&rdev->sdma_fw, fw_name, rdev->dev);
+               if (err)
+                       goto out;
+               if (rdev->sdma_fw->size != sdma_req_size) {
+                       printk(KERN_ERR
+                              "cik_sdma: Bogus length %zu in firmware \"%s\"\n",
+                              rdev->sdma_fw->size, fw_name);
+                       err = -EINVAL;
+               }
+       } else {
+               err = radeon_ucode_validate(rdev->sdma_fw);
+               if (err) {
+                       printk(KERN_ERR
+                              "cik_fw: validation failed for firmware \"%s\"\n",
+                              fw_name);
+                       goto out;
+               } else {
+                       new_fw++;
+               }
        }
 
        /* No SMC, MC ucode on APUs */
        if (!(rdev->flags & RADEON_IS_IGP)) {
-               snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc2.bin", chip_name);
+               snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", new_chip_name);
                err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev);
                if (err) {
-                       snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name);
+                       snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc2.bin", chip_name);
                        err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev);
-                       if (err)
+                       if (err) {
+                               snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name);
+                               err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev);
+                               if (err)
+                                       goto out;
+                       }
+                       if ((rdev->mc_fw->size != mc_req_size) &&
+                           (rdev->mc_fw->size != mc2_req_size)){
+                               printk(KERN_ERR
+                                      "cik_mc: Bogus length %zu in firmware \"%s\"\n",
+                                      rdev->mc_fw->size, fw_name);
+                               err = -EINVAL;
+                       }
+                       DRM_INFO("%s: %zu bytes\n", fw_name, rdev->mc_fw->size);
+               } else {
+                       err = radeon_ucode_validate(rdev->mc_fw);
+                       if (err) {
+                               printk(KERN_ERR
+                                      "cik_fw: validation failed for firmware \"%s\"\n",
+                                      fw_name);
                                goto out;
+                       } else {
+                               new_fw++;
+                       }
                }
-               if ((rdev->mc_fw->size != mc_req_size) &&
-                   (rdev->mc_fw->size != mc2_req_size)){
-                       printk(KERN_ERR
-                              "cik_mc: Bogus length %zu in firmware \"%s\"\n",
-                              rdev->mc_fw->size, fw_name);
-                       err = -EINVAL;
-               }
-               DRM_INFO("%s: %zu bytes\n", fw_name, rdev->mc_fw->size);
 
-               snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name);
+               snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", new_chip_name);
                err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev);
                if (err) {
-                       printk(KERN_ERR
-                              "smc: error loading firmware \"%s\"\n",
-                              fw_name);
-                       release_firmware(rdev->smc_fw);
-                       rdev->smc_fw = NULL;
-                       err = 0;
-               } else if (rdev->smc_fw->size != smc_req_size) {
-                       printk(KERN_ERR
-                              "cik_smc: Bogus length %zu in firmware \"%s\"\n",
-                              rdev->smc_fw->size, fw_name);
-                       err = -EINVAL;
+                       snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name);
+                       err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev);
+                       if (err) {
+                               printk(KERN_ERR
+                                      "smc: error loading firmware \"%s\"\n",
+                                      fw_name);
+                               release_firmware(rdev->smc_fw);
+                               rdev->smc_fw = NULL;
+                               err = 0;
+                       } else if (rdev->smc_fw->size != smc_req_size) {
+                               printk(KERN_ERR
+                                      "cik_smc: Bogus length %zu in firmware \"%s\"\n",
+                                      rdev->smc_fw->size, fw_name);
+                               err = -EINVAL;
+                       }
+               } else {
+                       err = radeon_ucode_validate(rdev->smc_fw);
+                       if (err) {
+                               printk(KERN_ERR
+                                      "cik_fw: validation failed for firmware \"%s\"\n",
+                                      fw_name);
+                               goto out;
+                       } else {
+                               new_fw++;
+                       }
                }
        }
 
+       if (new_fw == 0) {
+               rdev->new_fw = false;
+       } else if (new_fw < num_fw) {
+               printk(KERN_ERR "ci_fw: mixing new and old firmware!\n");
+               err = -EINVAL;
+       } else {
+               rdev->new_fw = true;
+       }
+
 out:
        if (err) {
                if (err != -EINVAL)
@@ -2021,8 +2239,14 @@ out:
                rdev->me_fw = NULL;
                release_firmware(rdev->ce_fw);
                rdev->ce_fw = NULL;
+               release_firmware(rdev->mec_fw);
+               rdev->mec_fw = NULL;
+               release_firmware(rdev->mec2_fw);
+               rdev->mec2_fw = NULL;
                release_firmware(rdev->rlc_fw);
                rdev->rlc_fw = NULL;
+               release_firmware(rdev->sdma_fw);
+               rdev->sdma_fw = NULL;
                release_firmware(rdev->mc_fw);
                rdev->mc_fw = NULL;
                release_firmware(rdev->smc_fw);
@@ -3666,8 +3890,6 @@ void cik_fence_gfx_ring_emit(struct radeon_device *rdev,
        radeon_ring_write(ring, (upper_32_bits(addr) & 0xffff) | DATA_SEL(1) | INT_SEL(2));
        radeon_ring_write(ring, fence->seq);
        radeon_ring_write(ring, 0);
-       /* HDP flush */
-       cik_hdp_flush_cp_ring_emit(rdev, fence->ring);
 }
 
 /**
@@ -3696,8 +3918,6 @@ void cik_fence_compute_ring_emit(struct radeon_device *rdev,
        radeon_ring_write(ring, upper_32_bits(addr));
        radeon_ring_write(ring, fence->seq);
        radeon_ring_write(ring, 0);
-       /* HDP flush */
-       cik_hdp_flush_cp_ring_emit(rdev, fence->ring);
 }
 
 bool cik_semaphore_ring_emit(struct radeon_device *rdev,
@@ -3969,7 +4189,6 @@ static void cik_cp_gfx_enable(struct radeon_device *rdev, bool enable)
  */
 static int cik_cp_gfx_load_microcode(struct radeon_device *rdev)
 {
-       const __be32 *fw_data;
        int i;
 
        if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw)
@@ -3977,26 +4196,70 @@ static int cik_cp_gfx_load_microcode(struct radeon_device *rdev)
 
        cik_cp_gfx_enable(rdev, false);
 
-       /* PFP */
-       fw_data = (const __be32 *)rdev->pfp_fw->data;
-       WREG32(CP_PFP_UCODE_ADDR, 0);
-       for (i = 0; i < CIK_PFP_UCODE_SIZE; i++)
-               WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++));
-       WREG32(CP_PFP_UCODE_ADDR, 0);
-
-       /* CE */
-       fw_data = (const __be32 *)rdev->ce_fw->data;
-       WREG32(CP_CE_UCODE_ADDR, 0);
-       for (i = 0; i < CIK_CE_UCODE_SIZE; i++)
-               WREG32(CP_CE_UCODE_DATA, be32_to_cpup(fw_data++));
-       WREG32(CP_CE_UCODE_ADDR, 0);
-
-       /* ME */
-       fw_data = (const __be32 *)rdev->me_fw->data;
-       WREG32(CP_ME_RAM_WADDR, 0);
-       for (i = 0; i < CIK_ME_UCODE_SIZE; i++)
-               WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++));
-       WREG32(CP_ME_RAM_WADDR, 0);
+       if (rdev->new_fw) {
+               const struct gfx_firmware_header_v1_0 *pfp_hdr =
+                       (const struct gfx_firmware_header_v1_0 *)rdev->pfp_fw->data;
+               const struct gfx_firmware_header_v1_0 *ce_hdr =
+                       (const struct gfx_firmware_header_v1_0 *)rdev->ce_fw->data;
+               const struct gfx_firmware_header_v1_0 *me_hdr =
+                       (const struct gfx_firmware_header_v1_0 *)rdev->me_fw->data;
+               const __le32 *fw_data;
+               u32 fw_size;
+
+               radeon_ucode_print_gfx_hdr(&pfp_hdr->header);
+               radeon_ucode_print_gfx_hdr(&ce_hdr->header);
+               radeon_ucode_print_gfx_hdr(&me_hdr->header);
+
+               /* PFP */
+               fw_data = (const __le32 *)
+                       (rdev->pfp_fw->data + le32_to_cpu(pfp_hdr->header.ucode_array_offset_bytes));
+               fw_size = le32_to_cpu(pfp_hdr->header.ucode_size_bytes) / 4;
+               WREG32(CP_PFP_UCODE_ADDR, 0);
+               for (i = 0; i < fw_size; i++)
+                       WREG32(CP_PFP_UCODE_DATA, le32_to_cpup(fw_data++));
+               WREG32(CP_PFP_UCODE_ADDR, 0);
+
+               /* CE */
+               fw_data = (const __le32 *)
+                       (rdev->ce_fw->data + le32_to_cpu(ce_hdr->header.ucode_array_offset_bytes));
+               fw_size = le32_to_cpu(ce_hdr->header.ucode_size_bytes) / 4;
+               WREG32(CP_CE_UCODE_ADDR, 0);
+               for (i = 0; i < fw_size; i++)
+                       WREG32(CP_CE_UCODE_DATA, le32_to_cpup(fw_data++));
+               WREG32(CP_CE_UCODE_ADDR, 0);
+
+               /* ME */
+               fw_data = (const __be32 *)
+                       (rdev->me_fw->data + le32_to_cpu(me_hdr->header.ucode_array_offset_bytes));
+               fw_size = le32_to_cpu(me_hdr->header.ucode_size_bytes) / 4;
+               WREG32(CP_ME_RAM_WADDR, 0);
+               for (i = 0; i < fw_size; i++)
+                       WREG32(CP_ME_RAM_DATA, le32_to_cpup(fw_data++));
+               WREG32(CP_ME_RAM_WADDR, 0);
+       } else {
+               const __be32 *fw_data;
+
+               /* PFP */
+               fw_data = (const __be32 *)rdev->pfp_fw->data;
+               WREG32(CP_PFP_UCODE_ADDR, 0);
+               for (i = 0; i < CIK_PFP_UCODE_SIZE; i++)
+                       WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++));
+               WREG32(CP_PFP_UCODE_ADDR, 0);
+
+               /* CE */
+               fw_data = (const __be32 *)rdev->ce_fw->data;
+               WREG32(CP_CE_UCODE_ADDR, 0);
+               for (i = 0; i < CIK_CE_UCODE_SIZE; i++)
+                       WREG32(CP_CE_UCODE_DATA, be32_to_cpup(fw_data++));
+               WREG32(CP_CE_UCODE_ADDR, 0);
+
+               /* ME */
+               fw_data = (const __be32 *)rdev->me_fw->data;
+               WREG32(CP_ME_RAM_WADDR, 0);
+               for (i = 0; i < CIK_ME_UCODE_SIZE; i++)
+                       WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++));
+               WREG32(CP_ME_RAM_WADDR, 0);
+       }
 
        WREG32(CP_PFP_UCODE_ADDR, 0);
        WREG32(CP_CE_UCODE_ADDR, 0);
@@ -4261,7 +4524,6 @@ static void cik_cp_compute_enable(struct radeon_device *rdev, bool enable)
  */
 static int cik_cp_compute_load_microcode(struct radeon_device *rdev)
 {
-       const __be32 *fw_data;
        int i;
 
        if (!rdev->mec_fw)
@@ -4269,20 +4531,55 @@ static int cik_cp_compute_load_microcode(struct radeon_device *rdev)
 
        cik_cp_compute_enable(rdev, false);
 
-       /* MEC1 */
-       fw_data = (const __be32 *)rdev->mec_fw->data;
-       WREG32(CP_MEC_ME1_UCODE_ADDR, 0);
-       for (i = 0; i < CIK_MEC_UCODE_SIZE; i++)
-               WREG32(CP_MEC_ME1_UCODE_DATA, be32_to_cpup(fw_data++));
-       WREG32(CP_MEC_ME1_UCODE_ADDR, 0);
+       if (rdev->new_fw) {
+               const struct gfx_firmware_header_v1_0 *mec_hdr =
+                       (const struct gfx_firmware_header_v1_0 *)rdev->mec_fw->data;
+               const __le32 *fw_data;
+               u32 fw_size;
+
+               radeon_ucode_print_gfx_hdr(&mec_hdr->header);
+
+               /* MEC1 */
+               fw_data = (const __le32 *)
+                       (rdev->mec_fw->data + le32_to_cpu(mec_hdr->header.ucode_array_offset_bytes));
+               fw_size = le32_to_cpu(mec_hdr->header.ucode_size_bytes) / 4;
+               WREG32(CP_MEC_ME1_UCODE_ADDR, 0);
+               for (i = 0; i < fw_size; i++)
+                       WREG32(CP_MEC_ME1_UCODE_DATA, le32_to_cpup(fw_data++));
+               WREG32(CP_MEC_ME1_UCODE_ADDR, 0);
 
-       if (rdev->family == CHIP_KAVERI) {
                /* MEC2 */
+               if (rdev->family == CHIP_KAVERI) {
+                       const struct gfx_firmware_header_v1_0 *mec2_hdr =
+                               (const struct gfx_firmware_header_v1_0 *)rdev->mec2_fw->data;
+
+                       fw_data = (const __le32 *)
+                               (rdev->mec2_fw->data +
+                                le32_to_cpu(mec2_hdr->header.ucode_array_offset_bytes));
+                       fw_size = le32_to_cpu(mec2_hdr->header.ucode_size_bytes) / 4;
+                       WREG32(CP_MEC_ME2_UCODE_ADDR, 0);
+                       for (i = 0; i < fw_size; i++)
+                               WREG32(CP_MEC_ME2_UCODE_DATA, le32_to_cpup(fw_data++));
+                       WREG32(CP_MEC_ME2_UCODE_ADDR, 0);
+               }
+       } else {
+               const __be32 *fw_data;
+
+               /* MEC1 */
                fw_data = (const __be32 *)rdev->mec_fw->data;
-               WREG32(CP_MEC_ME2_UCODE_ADDR, 0);
+               WREG32(CP_MEC_ME1_UCODE_ADDR, 0);
                for (i = 0; i < CIK_MEC_UCODE_SIZE; i++)
-                       WREG32(CP_MEC_ME2_UCODE_DATA, be32_to_cpup(fw_data++));
-               WREG32(CP_MEC_ME2_UCODE_ADDR, 0);
+                       WREG32(CP_MEC_ME1_UCODE_DATA, be32_to_cpup(fw_data++));
+               WREG32(CP_MEC_ME1_UCODE_ADDR, 0);
+
+               if (rdev->family == CHIP_KAVERI) {
+                       /* MEC2 */
+                       fw_data = (const __be32 *)rdev->mec_fw->data;
+                       WREG32(CP_MEC_ME2_UCODE_ADDR, 0);
+                       for (i = 0; i < CIK_MEC_UCODE_SIZE; i++)
+                               WREG32(CP_MEC_ME2_UCODE_DATA, be32_to_cpup(fw_data++));
+                       WREG32(CP_MEC_ME2_UCODE_ADDR, 0);
+               }
        }
 
        return 0;
@@ -4375,7 +4672,7 @@ static int cik_mec_init(struct radeon_device *rdev)
                r = radeon_bo_create(rdev,
                                     rdev->mec.num_mec *rdev->mec.num_pipe * MEC_HPD_SIZE * 2,
                                     PAGE_SIZE, true,
-                                    RADEON_GEM_DOMAIN_GTT, NULL,
+                                    RADEON_GEM_DOMAIN_GTT, 0, NULL,
                                     &rdev->mec.hpd_eop_obj);
                if (r) {
                        dev_warn(rdev->dev, "(%d) create HDP EOP bo failed\n", r);
@@ -4545,7 +4842,7 @@ static int cik_cp_compute_resume(struct radeon_device *rdev)
                        r = radeon_bo_create(rdev,
                                             sizeof(struct bonaire_mqd),
                                             PAGE_SIZE, true,
-                                            RADEON_GEM_DOMAIN_GTT, NULL,
+                                            RADEON_GEM_DOMAIN_GTT, 0, NULL,
                                             &rdev->ring[idx].mqd_obj);
                        if (r) {
                                dev_warn(rdev->dev, "(%d) create MQD bo failed\n", r);
@@ -5402,7 +5699,6 @@ static int cik_pcie_gart_enable(struct radeon_device *rdev)
        r = radeon_gart_table_vram_pin(rdev);
        if (r)
                return r;
-       radeon_gart_restore(rdev);
        /* Setup TLB control */
        WREG32(MC_VM_MX_L1_TLB_CNTL,
               (0xA << 7) |
@@ -5642,12 +5938,13 @@ static void cik_vm_decode_fault(struct radeon_device *rdev,
 void cik_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm)
 {
        struct radeon_ring *ring = &rdev->ring[ridx];
+       int usepfp = (ridx == RADEON_RING_TYPE_GFX_INDEX);
 
        if (vm == NULL)
                return;
 
        radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
-       radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
+       radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) |
                                 WRITE_DATA_DST_SEL(0)));
        if (vm->id < 8) {
                radeon_ring_write(ring,
@@ -5697,7 +5994,7 @@ void cik_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm)
        radeon_ring_write(ring, 1 << vm->id);
 
        /* compute doesn't have PFP */
-       if (ridx == RADEON_RING_TYPE_GFX_INDEX) {
+       if (usepfp) {
                /* sync PFP to ME, otherwise we might get invalid PFP reads */
                radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0));
                radeon_ring_write(ring, 0x0);
@@ -5865,28 +6162,10 @@ static void cik_rlc_start(struct radeon_device *rdev)
 static int cik_rlc_resume(struct radeon_device *rdev)
 {
        u32 i, size, tmp;
-       const __be32 *fw_data;
 
        if (!rdev->rlc_fw)
                return -EINVAL;
 
-       switch (rdev->family) {
-       case CHIP_BONAIRE:
-       case CHIP_HAWAII:
-       default:
-               size = BONAIRE_RLC_UCODE_SIZE;
-               break;
-       case CHIP_KAVERI:
-               size = KV_RLC_UCODE_SIZE;
-               break;
-       case CHIP_KABINI:
-               size = KB_RLC_UCODE_SIZE;
-               break;
-       case CHIP_MULLINS:
-               size = ML_RLC_UCODE_SIZE;
-               break;
-       }
-
        cik_rlc_stop(rdev);
 
        /* disable CG */
@@ -5910,11 +6189,45 @@ static int cik_rlc_resume(struct radeon_device *rdev)
        WREG32(RLC_MC_CNTL, 0);
        WREG32(RLC_UCODE_CNTL, 0);
 
-       fw_data = (const __be32 *)rdev->rlc_fw->data;
+       if (rdev->new_fw) {
+               const struct rlc_firmware_header_v1_0 *hdr =
+                       (const struct rlc_firmware_header_v1_0 *)rdev->rlc_fw->data;
+               const __le32 *fw_data = (const __le32 *)
+                       (rdev->rlc_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
+
+               radeon_ucode_print_rlc_hdr(&hdr->header);
+
+               size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4;
                WREG32(RLC_GPM_UCODE_ADDR, 0);
-       for (i = 0; i < size; i++)
-               WREG32(RLC_GPM_UCODE_DATA, be32_to_cpup(fw_data++));
-       WREG32(RLC_GPM_UCODE_ADDR, 0);
+               for (i = 0; i < size; i++)
+                       WREG32(RLC_GPM_UCODE_DATA, le32_to_cpup(fw_data++));
+               WREG32(RLC_GPM_UCODE_ADDR, 0);
+       } else {
+               const __be32 *fw_data;
+
+               switch (rdev->family) {
+               case CHIP_BONAIRE:
+               case CHIP_HAWAII:
+               default:
+                       size = BONAIRE_RLC_UCODE_SIZE;
+                       break;
+               case CHIP_KAVERI:
+                       size = KV_RLC_UCODE_SIZE;
+                       break;
+               case CHIP_KABINI:
+                       size = KB_RLC_UCODE_SIZE;
+                       break;
+               case CHIP_MULLINS:
+                       size = ML_RLC_UCODE_SIZE;
+                       break;
+               }
+
+               fw_data = (const __be32 *)rdev->rlc_fw->data;
+               WREG32(RLC_GPM_UCODE_ADDR, 0);
+               for (i = 0; i < size; i++)
+                       WREG32(RLC_GPM_UCODE_DATA, be32_to_cpup(fw_data++));
+               WREG32(RLC_GPM_UCODE_ADDR, 0);
+       }
 
        /* XXX - find out what chips support lbpw */
        cik_enable_lbpw(rdev, false);
@@ -6348,11 +6661,10 @@ static void cik_enable_gds_pg(struct radeon_device *rdev, bool enable)
 
 void cik_init_cp_pg_table(struct radeon_device *rdev)
 {
-       const __be32 *fw_data;
        volatile u32 *dst_ptr;
        int me, i, max_me = 4;
        u32 bo_offset = 0;
-       u32 table_offset;
+       u32 table_offset, table_size;
 
        if (rdev->family == CHIP_KAVERI)
                max_me = 5;
@@ -6363,24 +6675,71 @@ void cik_init_cp_pg_table(struct radeon_device *rdev)
        /* write the cp table buffer */
        dst_ptr = rdev->rlc.cp_table_ptr;
        for (me = 0; me < max_me; me++) {
-               if (me == 0) {
-                       fw_data = (const __be32 *)rdev->ce_fw->data;
-                       table_offset = CP_ME_TABLE_OFFSET;
-               } else if (me == 1) {
-                       fw_data = (const __be32 *)rdev->pfp_fw->data;
-                       table_offset = CP_ME_TABLE_OFFSET;
-               } else if (me == 2) {
-                       fw_data = (const __be32 *)rdev->me_fw->data;
-                       table_offset = CP_ME_TABLE_OFFSET;
+               if (rdev->new_fw) {
+                       const __le32 *fw_data;
+                       const struct gfx_firmware_header_v1_0 *hdr;
+
+                       if (me == 0) {
+                               hdr = (const struct gfx_firmware_header_v1_0 *)rdev->ce_fw->data;
+                               fw_data = (const __le32 *)
+                                       (rdev->ce_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
+                               table_offset = le32_to_cpu(hdr->jt_offset);
+                               table_size = le32_to_cpu(hdr->jt_size);
+                       } else if (me == 1) {
+                               hdr = (const struct gfx_firmware_header_v1_0 *)rdev->pfp_fw->data;
+                               fw_data = (const __le32 *)
+                                       (rdev->pfp_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
+                               table_offset = le32_to_cpu(hdr->jt_offset);
+                               table_size = le32_to_cpu(hdr->jt_size);
+                       } else if (me == 2) {
+                               hdr = (const struct gfx_firmware_header_v1_0 *)rdev->me_fw->data;
+                               fw_data = (const __le32 *)
+                                       (rdev->me_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
+                               table_offset = le32_to_cpu(hdr->jt_offset);
+                               table_size = le32_to_cpu(hdr->jt_size);
+                       } else if (me == 3) {
+                               hdr = (const struct gfx_firmware_header_v1_0 *)rdev->mec_fw->data;
+                               fw_data = (const __le32 *)
+                                       (rdev->mec_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
+                               table_offset = le32_to_cpu(hdr->jt_offset);
+                               table_size = le32_to_cpu(hdr->jt_size);
+                       } else {
+                               hdr = (const struct gfx_firmware_header_v1_0 *)rdev->mec2_fw->data;
+                               fw_data = (const __le32 *)
+                                       (rdev->mec2_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
+                               table_offset = le32_to_cpu(hdr->jt_offset);
+                               table_size = le32_to_cpu(hdr->jt_size);
+                       }
+
+                       for (i = 0; i < table_size; i ++) {
+                               dst_ptr[bo_offset + i] =
+                                       cpu_to_le32(le32_to_cpu(fw_data[table_offset + i]));
+                       }
+                       bo_offset += table_size;
                } else {
-                       fw_data = (const __be32 *)rdev->mec_fw->data;
-                       table_offset = CP_MEC_TABLE_OFFSET;
-               }
+                       const __be32 *fw_data;
+                       table_size = CP_ME_TABLE_SIZE;
+
+                       if (me == 0) {
+                               fw_data = (const __be32 *)rdev->ce_fw->data;
+                               table_offset = CP_ME_TABLE_OFFSET;
+                       } else if (me == 1) {
+                               fw_data = (const __be32 *)rdev->pfp_fw->data;
+                               table_offset = CP_ME_TABLE_OFFSET;
+                       } else if (me == 2) {
+                               fw_data = (const __be32 *)rdev->me_fw->data;
+                               table_offset = CP_ME_TABLE_OFFSET;
+                       } else {
+                               fw_data = (const __be32 *)rdev->mec_fw->data;
+                               table_offset = CP_MEC_TABLE_OFFSET;
+                       }
 
-               for (i = 0; i < CP_ME_TABLE_SIZE; i ++) {
-                       dst_ptr[bo_offset + i] = cpu_to_le32(be32_to_cpu(fw_data[table_offset + i]));
+                       for (i = 0; i < table_size; i ++) {
+                               dst_ptr[bo_offset + i] =
+                                       cpu_to_le32(be32_to_cpu(fw_data[table_offset + i]));
+                       }
+                       bo_offset += table_size;
                }
-               bo_offset += CP_ME_TABLE_SIZE;
        }
 }
 
@@ -7618,7 +7977,8 @@ restart_ih:
                case 16: /* D5 page flip */
                case 18: /* D6 page flip */
                        DRM_DEBUG("IH: D%d flip\n", ((src_id - 8) >> 1) + 1);
-                       radeon_crtc_handle_flip(rdev, (src_id - 8) >> 1);
+                       if (radeon_use_pflipirq > 0)
+                               radeon_crtc_handle_flip(rdev, (src_id - 8) >> 1);
                        break;
                case 42: /* HPD hotplug */
                        switch (src_data) {
@@ -7900,6 +8260,7 @@ restart_ih:
 static int cik_startup(struct radeon_device *rdev)
 {
        struct radeon_ring *ring;
+       u32 nop;
        int r;
 
        /* enable pcie gen2/3 link */
@@ -8033,9 +8394,18 @@ static int cik_startup(struct radeon_device *rdev)
        }
        cik_irq_set(rdev);
 
+       if (rdev->family == CHIP_HAWAII) {
+               if (rdev->new_fw)
+                       nop = PACKET3(PACKET3_NOP, 0x3FFF);
+               else
+                       nop = RADEON_CP_PACKET2;
+       } else {
+               nop = PACKET3(PACKET3_NOP, 0x3FFF);
+       }
+
        ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
        r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
-                            PACKET3(PACKET3_NOP, 0x3FFF));
+                            nop);
        if (r)
                return r;
 
@@ -8043,7 +8413,7 @@ static int cik_startup(struct radeon_device *rdev)
        /* type-2 packets are deprecated on MEC, use type-3 instead */
        ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
        r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP1_RPTR_OFFSET,
-                            PACKET3(PACKET3_NOP, 0x3FFF));
+                            nop);
        if (r)
                return r;
        ring->me = 1; /* first MEC */
@@ -8054,7 +8424,7 @@ static int cik_startup(struct radeon_device *rdev)
        /* type-2 packets are deprecated on MEC, use type-3 instead */
        ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
        r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP2_RPTR_OFFSET,
-                            PACKET3(PACKET3_NOP, 0x3FFF));
+                            nop);
        if (r)
                return r;
        /* dGPU only have 1 MEC */
index 8e9d0f1d858ef56d4038ab1361f339a2ba593f8f..bcf480510ac228af4bdf6e177eb0ccfb5951b24c 100644 (file)
@@ -24,6 +24,7 @@
 #include <linux/firmware.h>
 #include <drm/drmP.h>
 #include "radeon.h"
+#include "radeon_ucode.h"
 #include "radeon_asic.h"
 #include "radeon_trace.h"
 #include "cikd.h"
@@ -118,6 +119,7 @@ void cik_sdma_set_wptr(struct radeon_device *rdev,
                reg = SDMA0_GFX_RB_WPTR + SDMA1_REGISTER_OFFSET;
 
        WREG32(reg, (ring->wptr << 2) & 0x3fffc);
+       (void)RREG32(reg);
 }
 
 /**
@@ -419,7 +421,6 @@ static int cik_sdma_rlc_resume(struct radeon_device *rdev)
  */
 static int cik_sdma_load_microcode(struct radeon_device *rdev)
 {
-       const __be32 *fw_data;
        int i;
 
        if (!rdev->sdma_fw)
@@ -428,19 +429,48 @@ static int cik_sdma_load_microcode(struct radeon_device *rdev)
        /* halt the MEs */
        cik_sdma_enable(rdev, false);
 
-       /* sdma0 */
-       fw_data = (const __be32 *)rdev->sdma_fw->data;
-       WREG32(SDMA0_UCODE_ADDR + SDMA0_REGISTER_OFFSET, 0);
-       for (i = 0; i < CIK_SDMA_UCODE_SIZE; i++)
-               WREG32(SDMA0_UCODE_DATA + SDMA0_REGISTER_OFFSET, be32_to_cpup(fw_data++));
-       WREG32(SDMA0_UCODE_DATA + SDMA0_REGISTER_OFFSET, CIK_SDMA_UCODE_VERSION);
-
-       /* sdma1 */
-       fw_data = (const __be32 *)rdev->sdma_fw->data;
-       WREG32(SDMA0_UCODE_ADDR + SDMA1_REGISTER_OFFSET, 0);
-       for (i = 0; i < CIK_SDMA_UCODE_SIZE; i++)
-               WREG32(SDMA0_UCODE_DATA + SDMA1_REGISTER_OFFSET, be32_to_cpup(fw_data++));
-       WREG32(SDMA0_UCODE_DATA + SDMA1_REGISTER_OFFSET, CIK_SDMA_UCODE_VERSION);
+       if (rdev->new_fw) {
+               const struct sdma_firmware_header_v1_0 *hdr =
+                       (const struct sdma_firmware_header_v1_0 *)rdev->sdma_fw->data;
+               const __le32 *fw_data;
+               u32 fw_size;
+
+               radeon_ucode_print_sdma_hdr(&hdr->header);
+
+               /* sdma0 */
+               fw_data = (const __le32 *)
+                       (rdev->sdma_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
+               fw_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4;
+               WREG32(SDMA0_UCODE_ADDR + SDMA0_REGISTER_OFFSET, 0);
+               for (i = 0; i < fw_size; i++)
+                       WREG32(SDMA0_UCODE_DATA + SDMA0_REGISTER_OFFSET, le32_to_cpup(fw_data++));
+               WREG32(SDMA0_UCODE_DATA + SDMA0_REGISTER_OFFSET, CIK_SDMA_UCODE_VERSION);
+
+               /* sdma1 */
+               fw_data = (const __le32 *)
+                       (rdev->sdma_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
+               fw_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4;
+               WREG32(SDMA0_UCODE_ADDR + SDMA1_REGISTER_OFFSET, 0);
+               for (i = 0; i < fw_size; i++)
+                       WREG32(SDMA0_UCODE_DATA + SDMA1_REGISTER_OFFSET, le32_to_cpup(fw_data++));
+               WREG32(SDMA0_UCODE_DATA + SDMA1_REGISTER_OFFSET, CIK_SDMA_UCODE_VERSION);
+       } else {
+               const __be32 *fw_data;
+
+               /* sdma0 */
+               fw_data = (const __be32 *)rdev->sdma_fw->data;
+               WREG32(SDMA0_UCODE_ADDR + SDMA0_REGISTER_OFFSET, 0);
+               for (i = 0; i < CIK_SDMA_UCODE_SIZE; i++)
+                       WREG32(SDMA0_UCODE_DATA + SDMA0_REGISTER_OFFSET, be32_to_cpup(fw_data++));
+               WREG32(SDMA0_UCODE_DATA + SDMA0_REGISTER_OFFSET, CIK_SDMA_UCODE_VERSION);
+
+               /* sdma1 */
+               fw_data = (const __be32 *)rdev->sdma_fw->data;
+               WREG32(SDMA0_UCODE_ADDR + SDMA1_REGISTER_OFFSET, 0);
+               for (i = 0; i < CIK_SDMA_UCODE_SIZE; i++)
+                       WREG32(SDMA0_UCODE_DATA + SDMA1_REGISTER_OFFSET, be32_to_cpup(fw_data++));
+               WREG32(SDMA0_UCODE_DATA + SDMA1_REGISTER_OFFSET, CIK_SDMA_UCODE_VERSION);
+       }
 
        WREG32(SDMA0_UCODE_ADDR + SDMA0_REGISTER_OFFSET, 0);
        WREG32(SDMA0_UCODE_ADDR + SDMA1_REGISTER_OFFSET, 0);
@@ -719,7 +749,43 @@ bool cik_sdma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
 }
 
 /**
- * cik_sdma_vm_set_page - update the page tables using sDMA
+ * cik_sdma_vm_copy_pages - update PTEs by copying them from the GART
+ *
+ * @rdev: radeon_device pointer
+ * @ib: indirect buffer to fill with commands
+ * @pe: addr of the page entry
+ * @src: src addr to copy from
+ * @count: number of page entries to update
+ *
+ * Update PTEs by copying them from the GART using sDMA (CIK).
+ */
+void cik_sdma_vm_copy_pages(struct radeon_device *rdev,
+                           struct radeon_ib *ib,
+                           uint64_t pe, uint64_t src,
+                           unsigned count)
+{
+       while (count) {
+               unsigned bytes = count * 8;
+               if (bytes > 0x1FFFF8)
+                       bytes = 0x1FFFF8;
+
+               ib->ptr[ib->length_dw++] = SDMA_PACKET(SDMA_OPCODE_COPY,
+                       SDMA_WRITE_SUB_OPCODE_LINEAR, 0);
+               ib->ptr[ib->length_dw++] = bytes;
+               ib->ptr[ib->length_dw++] = 0; /* src/dst endian swap */
+               ib->ptr[ib->length_dw++] = lower_32_bits(src);
+               ib->ptr[ib->length_dw++] = upper_32_bits(src);
+               ib->ptr[ib->length_dw++] = lower_32_bits(pe);
+               ib->ptr[ib->length_dw++] = upper_32_bits(pe);
+
+               pe += bytes;
+               src += bytes;
+               count -= bytes / 8;
+       }
+}
+
+/**
+ * cik_sdma_vm_write_pages - update PTEs by writing them manually
  *
  * @rdev: radeon_device pointer
  * @ib: indirect buffer to fill with commands
@@ -729,84 +795,103 @@ bool cik_sdma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
  * @incr: increase next addr by incr bytes
  * @flags: access flags
  *
- * Update the page tables using sDMA (CIK).
+ * Update PTEs by writing them manually using sDMA (CIK).
  */
-void cik_sdma_vm_set_page(struct radeon_device *rdev,
-                         struct radeon_ib *ib,
-                         uint64_t pe,
-                         uint64_t addr, unsigned count,
-                         uint32_t incr, uint32_t flags)
+void cik_sdma_vm_write_pages(struct radeon_device *rdev,
+                            struct radeon_ib *ib,
+                            uint64_t pe,
+                            uint64_t addr, unsigned count,
+                            uint32_t incr, uint32_t flags)
 {
        uint64_t value;
        unsigned ndw;
 
-       trace_radeon_vm_set_page(pe, addr, count, incr, flags);
-
-       if (flags == R600_PTE_GART) {
-               uint64_t src = rdev->gart.table_addr + (addr >> 12) * 8;
-               while (count) {
-                       unsigned bytes = count * 8;
-                       if (bytes > 0x1FFFF8)
-                               bytes = 0x1FFFF8;
-
-                       ib->ptr[ib->length_dw++] = SDMA_PACKET(SDMA_OPCODE_COPY, SDMA_WRITE_SUB_OPCODE_LINEAR, 0);
-                       ib->ptr[ib->length_dw++] = bytes;
-                       ib->ptr[ib->length_dw++] = 0; /* src/dst endian swap */
-                       ib->ptr[ib->length_dw++] = lower_32_bits(src);
-                       ib->ptr[ib->length_dw++] = upper_32_bits(src);
-                       ib->ptr[ib->length_dw++] = lower_32_bits(pe);
-                       ib->ptr[ib->length_dw++] = upper_32_bits(pe);
-
-                       pe += bytes;
-                       src += bytes;
-                       count -= bytes / 8;
-               }
-       } else if (flags & R600_PTE_SYSTEM) {
-               while (count) {
-                       ndw = count * 2;
-                       if (ndw > 0xFFFFE)
-                               ndw = 0xFFFFE;
-
-                       /* for non-physically contiguous pages (system) */
-                       ib->ptr[ib->length_dw++] = SDMA_PACKET(SDMA_OPCODE_WRITE, SDMA_WRITE_SUB_OPCODE_LINEAR, 0);
-                       ib->ptr[ib->length_dw++] = pe;
-                       ib->ptr[ib->length_dw++] = upper_32_bits(pe);
-                       ib->ptr[ib->length_dw++] = ndw;
-                       for (; ndw > 0; ndw -= 2, --count, pe += 8) {
+       while (count) {
+               ndw = count * 2;
+               if (ndw > 0xFFFFE)
+                       ndw = 0xFFFFE;
+
+               /* for non-physically contiguous pages (system) */
+               ib->ptr[ib->length_dw++] = SDMA_PACKET(SDMA_OPCODE_WRITE,
+                       SDMA_WRITE_SUB_OPCODE_LINEAR, 0);
+               ib->ptr[ib->length_dw++] = pe;
+               ib->ptr[ib->length_dw++] = upper_32_bits(pe);
+               ib->ptr[ib->length_dw++] = ndw;
+               for (; ndw > 0; ndw -= 2, --count, pe += 8) {
+                       if (flags & R600_PTE_SYSTEM) {
                                value = radeon_vm_map_gart(rdev, addr);
                                value &= 0xFFFFFFFFFFFFF000ULL;
-                               addr += incr;
-                               value |= flags;
-                               ib->ptr[ib->length_dw++] = value;
-                               ib->ptr[ib->length_dw++] = upper_32_bits(value);
-                       }
-               }
-       } else {
-               while (count) {
-                       ndw = count;
-                       if (ndw > 0x7FFFF)
-                               ndw = 0x7FFFF;
-
-                       if (flags & R600_PTE_VALID)
+                       } else if (flags & R600_PTE_VALID) {
                                value = addr;
-                       else
+                       } else {
                                value = 0;
-                       /* for physically contiguous pages (vram) */
-                       ib->ptr[ib->length_dw++] = SDMA_PACKET(SDMA_OPCODE_GENERATE_PTE_PDE, 0, 0);
-                       ib->ptr[ib->length_dw++] = pe; /* dst addr */
-                       ib->ptr[ib->length_dw++] = upper_32_bits(pe);
-                       ib->ptr[ib->length_dw++] = flags; /* mask */
-                       ib->ptr[ib->length_dw++] = 0;
-                       ib->ptr[ib->length_dw++] = value; /* value */
+                       }
+                       addr += incr;
+                       value |= flags;
+                       ib->ptr[ib->length_dw++] = value;
                        ib->ptr[ib->length_dw++] = upper_32_bits(value);
-                       ib->ptr[ib->length_dw++] = incr; /* increment size */
-                       ib->ptr[ib->length_dw++] = 0;
-                       ib->ptr[ib->length_dw++] = ndw; /* number of entries */
-                       pe += ndw * 8;
-                       addr += ndw * incr;
-                       count -= ndw;
                }
        }
+}
+
+/**
+ * cik_sdma_vm_set_pages - update the page tables using sDMA
+ *
+ * @rdev: radeon_device pointer
+ * @ib: indirect buffer to fill with commands
+ * @pe: addr of the page entry
+ * @addr: dst addr to write into pe
+ * @count: number of page entries to update
+ * @incr: increase next addr by incr bytes
+ * @flags: access flags
+ *
+ * Update the page tables using sDMA (CIK).
+ */
+void cik_sdma_vm_set_pages(struct radeon_device *rdev,
+                          struct radeon_ib *ib,
+                          uint64_t pe,
+                          uint64_t addr, unsigned count,
+                          uint32_t incr, uint32_t flags)
+{
+       uint64_t value;
+       unsigned ndw;
+
+       while (count) {
+               ndw = count;
+               if (ndw > 0x7FFFF)
+                       ndw = 0x7FFFF;
+
+               if (flags & R600_PTE_VALID)
+                       value = addr;
+               else
+                       value = 0;
+
+               /* for physically contiguous pages (vram) */
+               ib->ptr[ib->length_dw++] = SDMA_PACKET(SDMA_OPCODE_GENERATE_PTE_PDE, 0, 0);
+               ib->ptr[ib->length_dw++] = pe; /* dst addr */
+               ib->ptr[ib->length_dw++] = upper_32_bits(pe);
+               ib->ptr[ib->length_dw++] = flags; /* mask */
+               ib->ptr[ib->length_dw++] = 0;
+               ib->ptr[ib->length_dw++] = value; /* value */
+               ib->ptr[ib->length_dw++] = upper_32_bits(value);
+               ib->ptr[ib->length_dw++] = incr; /* increment size */
+               ib->ptr[ib->length_dw++] = 0;
+               ib->ptr[ib->length_dw++] = ndw; /* number of entries */
+
+               pe += ndw * 8;
+               addr += ndw * incr;
+               count -= ndw;
+       }
+}
+
+/**
+ * cik_sdma_vm_pad_ib - pad the IB to the required number of dw
+ *
+ * @ib: indirect buffer to fill with padding
+ *
+ */
+void cik_sdma_vm_pad_ib(struct radeon_ib *ib)
+{
        while (ib->length_dw & 0x7)
                ib->ptr[ib->length_dw++] = SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0);
 }
index 0a65dc7e93e7f8ed2fe06b4ccd07d9bfcf9e462c..ab29f953a767318c5e06de2115a9cfde017a9c82 100644 (file)
@@ -136,13 +136,13 @@ void dce6_afmt_write_latency_fields(struct drm_encoder *encoder,
                        tmp = VIDEO_LIPSYNC(connector->video_latency[1]) |
                                AUDIO_LIPSYNC(connector->audio_latency[1]);
                else
-                       tmp = VIDEO_LIPSYNC(255) | AUDIO_LIPSYNC(255);
+                       tmp = VIDEO_LIPSYNC(0) | AUDIO_LIPSYNC(0);
        } else {
                if (connector->latency_present[0])
                        tmp = VIDEO_LIPSYNC(connector->video_latency[0]) |
                                AUDIO_LIPSYNC(connector->audio_latency[0]);
                else
-                       tmp = VIDEO_LIPSYNC(255) | AUDIO_LIPSYNC(255);
+                       tmp = VIDEO_LIPSYNC(0) | AUDIO_LIPSYNC(0);
        }
        WREG32_ENDPOINT(offset, AZ_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC, tmp);
 }
@@ -164,8 +164,10 @@ void dce6_afmt_write_speaker_allocation(struct drm_encoder *encoder)
        offset = dig->afmt->pin->offset;
 
        list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
-               if (connector->encoder == encoder)
+               if (connector->encoder == encoder) {
                        radeon_connector = to_radeon_connector(connector);
+                       break;
+               }
        }
 
        if (!radeon_connector) {
@@ -173,7 +175,7 @@ void dce6_afmt_write_speaker_allocation(struct drm_encoder *encoder)
                return;
        }
 
-       sad_count = drm_edid_to_speaker_allocation(radeon_connector->edid, &sadb);
+       sad_count = drm_edid_to_speaker_allocation(radeon_connector_edid(connector), &sadb);
        if (sad_count <= 0) {
                DRM_ERROR("Couldn't read Speaker Allocation Data Block: %d\n", sad_count);
                return;
@@ -225,8 +227,10 @@ void dce6_afmt_write_sad_regs(struct drm_encoder *encoder)
        offset = dig->afmt->pin->offset;
 
        list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
-               if (connector->encoder == encoder)
+               if (connector->encoder == encoder) {
                        radeon_connector = to_radeon_connector(connector);
+                       break;
+               }
        }
 
        if (!radeon_connector) {
@@ -234,7 +238,7 @@ void dce6_afmt_write_sad_regs(struct drm_encoder *encoder)
                return;
        }
 
-       sad_count = drm_edid_to_sad(radeon_connector->edid, &sads);
+       sad_count = drm_edid_to_sad(radeon_connector_edid(connector), &sads);
        if (sad_count <= 0) {
                DRM_ERROR("Couldn't read SADs: %d\n", sad_count);
                return;
index 15e4f28015e1e74fcc0a3e6189feee1274fa1794..4fedd14e670aeb33e07fadcf5ff2564c2cc2681c 100644 (file)
@@ -2424,7 +2424,6 @@ static int evergreen_pcie_gart_enable(struct radeon_device *rdev)
        r = radeon_gart_table_vram_pin(rdev);
        if (r)
                return r;
-       radeon_gart_restore(rdev);
        /* Setup L2 cache */
        WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING |
                                ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
@@ -2677,7 +2676,7 @@ void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *s
                if (save->crtc_enabled[i]) {
                        if (ASIC_IS_DCE6(rdev)) {
                                tmp = RREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i]);
-                               tmp |= EVERGREEN_CRTC_BLANK_DATA_EN;
+                               tmp &= ~EVERGREEN_CRTC_BLANK_DATA_EN;
                                WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1);
                                WREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i], tmp);
                                WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0);
@@ -4023,7 +4022,8 @@ int sumo_rlc_init(struct radeon_device *rdev)
                /* save restore block */
                if (rdev->rlc.save_restore_obj == NULL) {
                        r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true,
-                                            RADEON_GEM_DOMAIN_VRAM, NULL, &rdev->rlc.save_restore_obj);
+                                            RADEON_GEM_DOMAIN_VRAM, 0, NULL,
+                                            &rdev->rlc.save_restore_obj);
                        if (r) {
                                dev_warn(rdev->dev, "(%d) create RLC sr bo failed\n", r);
                                return r;
@@ -4101,7 +4101,8 @@ int sumo_rlc_init(struct radeon_device *rdev)
 
                if (rdev->rlc.clear_state_obj == NULL) {
                        r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true,
-                                            RADEON_GEM_DOMAIN_VRAM, NULL, &rdev->rlc.clear_state_obj);
+                                            RADEON_GEM_DOMAIN_VRAM, 0, NULL,
+                                            &rdev->rlc.clear_state_obj);
                        if (r) {
                                dev_warn(rdev->dev, "(%d) create RLC c bo failed\n", r);
                                sumo_rlc_fini(rdev);
@@ -4175,8 +4176,10 @@ int sumo_rlc_init(struct radeon_device *rdev)
 
        if (rdev->rlc.cp_table_size) {
                if (rdev->rlc.cp_table_obj == NULL) {
-                       r = radeon_bo_create(rdev, rdev->rlc.cp_table_size, PAGE_SIZE, true,
-                                            RADEON_GEM_DOMAIN_VRAM, NULL, &rdev->rlc.cp_table_obj);
+                       r = radeon_bo_create(rdev, rdev->rlc.cp_table_size,
+                                            PAGE_SIZE, true,
+                                            RADEON_GEM_DOMAIN_VRAM, 0, NULL,
+                                            &rdev->rlc.cp_table_obj);
                        if (r) {
                                dev_warn(rdev->dev, "(%d) create RLC cp table bo failed\n", r);
                                sumo_rlc_fini(rdev);
@@ -4961,7 +4964,8 @@ restart_ih:
                case 16: /* D5 page flip */
                case 18: /* D6 page flip */
                        DRM_DEBUG("IH: D%d flip\n", ((src_id - 8) >> 1) + 1);
-                       radeon_crtc_handle_flip(rdev, (src_id - 8) >> 1);
+                       if (radeon_use_pflipirq > 0)
+                               radeon_crtc_handle_flip(rdev, (src_id - 8) >> 1);
                        break;
                case 42: /* HPD hotplug */
                        switch (src_data) {
index 1ec0e6e83f9f3492151d097c839251029996d6f6..278c7a139d748f770467a53d4cf19a920c9bb2ef 100644 (file)
@@ -117,7 +117,7 @@ static void dce4_afmt_write_speaker_allocation(struct drm_encoder *encoder)
                return;
        }
 
-       sad_count = drm_edid_to_speaker_allocation(radeon_connector->edid, &sadb);
+       sad_count = drm_edid_to_speaker_allocation(radeon_connector_edid(connector), &sadb);
        if (sad_count <= 0) {
                DRM_ERROR("Couldn't read Speaker Allocation Data Block: %d\n", sad_count);
                return;
@@ -172,7 +172,7 @@ static void evergreen_hdmi_write_sad_regs(struct drm_encoder *encoder)
                return;
        }
 
-       sad_count = drm_edid_to_sad(radeon_connector->edid, &sads);
+       sad_count = drm_edid_to_sad(radeon_connector_edid(connector), &sads);
        if (sad_count <= 0) {
                DRM_ERROR("Couldn't read SADs: %d\n", sad_count);
                return;
index 5a33ca6818677bd0e5fcc5c9564d2f789a5ae454..327b85f7fd0d45eb434a8f8232a206ac736ab0be 100644 (file)
@@ -1229,7 +1229,6 @@ static int cayman_pcie_gart_enable(struct radeon_device *rdev)
        r = radeon_gart_table_vram_pin(rdev);
        if (r)
                return r;
-       radeon_gart_restore(rdev);
        /* Setup TLB control */
        WREG32(MC_VM_MX_L1_TLB_CNTL,
               (0xA << 7) |
index 6378e0276691cadec5cc7ff7dcc56f9dc92733fc..8a3e6221cece2c9eb09ca94a2d8b749dd6ea60e1 100644 (file)
@@ -307,7 +307,43 @@ bool cayman_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
 }
 
 /**
- * cayman_dma_vm_set_page - update the page tables using the DMA
+ * cayman_dma_vm_copy_pages - update PTEs by copying them from the GART
+ *
+ * @rdev: radeon_device pointer
+ * @ib: indirect buffer to fill with commands
+ * @pe: addr of the page entry
+ * @src: src addr where to copy from
+ * @count: number of page entries to update
+ *
+ * Update PTEs by copying them from the GART using the DMA (cayman/TN).
+ */
+void cayman_dma_vm_copy_pages(struct radeon_device *rdev,
+                             struct radeon_ib *ib,
+                             uint64_t pe, uint64_t src,
+                             unsigned count)
+{
+       unsigned ndw;
+
+       while (count) {
+               ndw = count * 2;
+               if (ndw > 0xFFFFE)
+                       ndw = 0xFFFFE;
+
+               ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_COPY,
+                                                     0, 0, ndw);
+               ib->ptr[ib->length_dw++] = lower_32_bits(pe);
+               ib->ptr[ib->length_dw++] = lower_32_bits(src);
+               ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff;
+               ib->ptr[ib->length_dw++] = upper_32_bits(src) & 0xff;
+
+               pe += ndw * 4;
+               src += ndw * 4;
+               count -= ndw / 2;
+       }
+}
+
+/**
+ * cayman_dma_vm_write_pages - update PTEs by writing them manually
  *
  * @rdev: radeon_device pointer
  * @ib: indirect buffer to fill with commands
@@ -315,71 +351,103 @@ bool cayman_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
  * @addr: dst addr to write into pe
  * @count: number of page entries to update
  * @incr: increase next addr by incr bytes
- * @flags: hw access flags 
+ * @flags: hw access flags
  *
- * Update the page tables using the DMA (cayman/TN).
+ * Update PTEs by writing them manually using the DMA (cayman/TN).
  */
-void cayman_dma_vm_set_page(struct radeon_device *rdev,
-                           struct radeon_ib *ib,
-                           uint64_t pe,
-                           uint64_t addr, unsigned count,
-                           uint32_t incr, uint32_t flags)
+void cayman_dma_vm_write_pages(struct radeon_device *rdev,
+                              struct radeon_ib *ib,
+                              uint64_t pe,
+                              uint64_t addr, unsigned count,
+                              uint32_t incr, uint32_t flags)
 {
        uint64_t value;
        unsigned ndw;
 
-       trace_radeon_vm_set_page(pe, addr, count, incr, flags);
-
-       if ((flags & R600_PTE_SYSTEM) || (count == 1)) {
-               while (count) {
-                       ndw = count * 2;
-                       if (ndw > 0xFFFFE)
-                               ndw = 0xFFFFE;
-
-                       /* for non-physically contiguous pages (system) */
-                       ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_WRITE, 0, 0, ndw);
-                       ib->ptr[ib->length_dw++] = pe;
-                       ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff;
-                       for (; ndw > 0; ndw -= 2, --count, pe += 8) {
-                               if (flags & R600_PTE_SYSTEM) {
-                                       value = radeon_vm_map_gart(rdev, addr);
-                                       value &= 0xFFFFFFFFFFFFF000ULL;
-                               } else if (flags & R600_PTE_VALID) {
-                                       value = addr;
-                               } else {
-                                       value = 0;
-                               }
-                               addr += incr;
-                               value |= flags;
-                               ib->ptr[ib->length_dw++] = value;
-                               ib->ptr[ib->length_dw++] = upper_32_bits(value);
-                       }
-               }
-       } else {
-               while (count) {
-                       ndw = count * 2;
-                       if (ndw > 0xFFFFE)
-                               ndw = 0xFFFFE;
-
-                       if (flags & R600_PTE_VALID)
+       while (count) {
+               ndw = count * 2;
+               if (ndw > 0xFFFFE)
+                       ndw = 0xFFFFE;
+
+               /* for non-physically contiguous pages (system) */
+               ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_WRITE,
+                                                     0, 0, ndw);
+               ib->ptr[ib->length_dw++] = pe;
+               ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff;
+               for (; ndw > 0; ndw -= 2, --count, pe += 8) {
+                       if (flags & R600_PTE_SYSTEM) {
+                               value = radeon_vm_map_gart(rdev, addr);
+                               value &= 0xFFFFFFFFFFFFF000ULL;
+                       } else if (flags & R600_PTE_VALID) {
                                value = addr;
-                       else
+                       } else {
                                value = 0;
-                       /* for physically contiguous pages (vram) */
-                       ib->ptr[ib->length_dw++] = DMA_PTE_PDE_PACKET(ndw);
-                       ib->ptr[ib->length_dw++] = pe; /* dst addr */
-                       ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff;
-                       ib->ptr[ib->length_dw++] = flags; /* mask */
-                       ib->ptr[ib->length_dw++] = 0;
-                       ib->ptr[ib->length_dw++] = value; /* value */
+                       }
+                       addr += incr;
+                       value |= flags;
+                       ib->ptr[ib->length_dw++] = value;
                        ib->ptr[ib->length_dw++] = upper_32_bits(value);
-                       ib->ptr[ib->length_dw++] = incr; /* increment size */
-                       ib->ptr[ib->length_dw++] = 0;
-                       pe += ndw * 4;
-                       addr += (ndw / 2) * incr;
-                       count -= ndw / 2;
                }
        }
+}
+
+/**
+ * cayman_dma_vm_set_pages - update the page tables using the DMA
+ *
+ * @rdev: radeon_device pointer
+ * @ib: indirect buffer to fill with commands
+ * @pe: addr of the page entry
+ * @addr: dst addr to write into pe
+ * @count: number of page entries to update
+ * @incr: increase next addr by incr bytes
+ * @flags: hw access flags
+ *
+ * Update the page tables using the DMA (cayman/TN).
+ */
+void cayman_dma_vm_set_pages(struct radeon_device *rdev,
+                            struct radeon_ib *ib,
+                            uint64_t pe,
+                            uint64_t addr, unsigned count,
+                            uint32_t incr, uint32_t flags)
+{
+       uint64_t value;
+       unsigned ndw;
+
+       while (count) {
+               ndw = count * 2;
+               if (ndw > 0xFFFFE)
+                       ndw = 0xFFFFE;
+
+               if (flags & R600_PTE_VALID)
+                       value = addr;
+               else
+                       value = 0;
+
+               /* for physically contiguous pages (vram) */
+               ib->ptr[ib->length_dw++] = DMA_PTE_PDE_PACKET(ndw);
+               ib->ptr[ib->length_dw++] = pe; /* dst addr */
+               ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff;
+               ib->ptr[ib->length_dw++] = flags; /* mask */
+               ib->ptr[ib->length_dw++] = 0;
+               ib->ptr[ib->length_dw++] = value; /* value */
+               ib->ptr[ib->length_dw++] = upper_32_bits(value);
+               ib->ptr[ib->length_dw++] = incr; /* increment size */
+               ib->ptr[ib->length_dw++] = 0;
+
+               pe += ndw * 4;
+               addr += (ndw / 2) * incr;
+               count -= ndw / 2;
+       }
+}
+
+/**
+ * cayman_dma_vm_pad_ib - pad the IB to the required number of dw
+ *
+ * @ib: indirect buffer to fill with padding
+ *
+ */
+void cayman_dma_vm_pad_ib(struct radeon_ib *ib)
+{
        while (ib->length_dw & 0x7)
                ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0);
 }
index 1544efcf1c3a655d04b197302737a820b07d1790..04b5940b89234893f3f3042e5a00f30f97e899cf 100644 (file)
@@ -652,7 +652,6 @@ int r100_pci_gart_enable(struct radeon_device *rdev)
 {
        uint32_t tmp;
 
-       radeon_gart_restore(rdev);
        /* discard memory request outside of configured range */
        tmp = RREG32(RADEON_AIC_CNTL) | RADEON_DIS_OUT_OF_PCI_GART_ACCESS;
        WREG32(RADEON_AIC_CNTL, tmp);
@@ -683,7 +682,7 @@ void r100_pci_gart_disable(struct radeon_device *rdev)
 }
 
 void r100_pci_gart_set_page(struct radeon_device *rdev, unsigned i,
-                           uint64_t addr)
+                           uint64_t addr, uint32_t flags)
 {
        u32 *gtt = rdev->gart.ptr;
        gtt[i] = cpu_to_le32(lower_32_bits(addr));
@@ -838,11 +837,7 @@ void r100_fence_ring_emit(struct radeon_device *rdev,
        /* Wait until IDLE & CLEAN */
        radeon_ring_write(ring, PACKET0(RADEON_WAIT_UNTIL, 0));
        radeon_ring_write(ring, RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_3D_IDLECLEAN);
-       radeon_ring_write(ring, PACKET0(RADEON_HOST_PATH_CNTL, 0));
-       radeon_ring_write(ring, rdev->config.r100.hdp_cntl |
-                               RADEON_HDP_READ_BUFFER_INVALIDATE);
-       radeon_ring_write(ring, PACKET0(RADEON_HOST_PATH_CNTL, 0));
-       radeon_ring_write(ring, rdev->config.r100.hdp_cntl);
+       r100_ring_hdp_flush(rdev, ring);
        /* Emit fence sequence & fire IRQ */
        radeon_ring_write(ring, PACKET0(rdev->fence_drv[fence->ring].scratch_reg, 0));
        radeon_ring_write(ring, fence->seq);
@@ -1061,6 +1056,20 @@ void r100_gfx_set_wptr(struct radeon_device *rdev,
        (void)RREG32(RADEON_CP_RB_WPTR);
 }
 
+/**
+ * r100_ring_hdp_flush - flush Host Data Path via the ring buffer
+ * rdev: radeon device structure
+ * ring: ring buffer struct for emitting packets
+ */
+void r100_ring_hdp_flush(struct radeon_device *rdev, struct radeon_ring *ring)
+{
+       radeon_ring_write(ring, PACKET0(RADEON_HOST_PATH_CNTL, 0));
+       radeon_ring_write(ring, rdev->config.r100.hdp_cntl |
+                               RADEON_HDP_READ_BUFFER_INVALIDATE);
+       radeon_ring_write(ring, PACKET0(RADEON_HOST_PATH_CNTL, 0));
+       radeon_ring_write(ring, rdev->config.r100.hdp_cntl);
+}
+
 static void r100_cp_load_microcode(struct radeon_device *rdev)
 {
        const __be32 *fw_data;
@@ -1401,7 +1410,6 @@ int r100_cs_parse_packet0(struct radeon_cs_parser *p,
  */
 int r100_cs_packet_parse_vline(struct radeon_cs_parser *p)
 {
-       struct drm_mode_object *obj;
        struct drm_crtc *crtc;
        struct radeon_crtc *radeon_crtc;
        struct radeon_cs_packet p3reloc, waitreloc;
@@ -1441,12 +1449,11 @@ int r100_cs_packet_parse_vline(struct radeon_cs_parser *p)
        header = radeon_get_ib_value(p, h_idx);
        crtc_id = radeon_get_ib_value(p, h_idx + 5);
        reg = R100_CP_PACKET0_GET_REG(header);
-       obj = drm_mode_object_find(p->rdev->ddev, crtc_id, DRM_MODE_OBJECT_CRTC);
-       if (!obj) {
+       crtc = drm_crtc_find(p->rdev->ddev, crtc_id);
+       if (!crtc) {
                DRM_ERROR("cannot find crtc %d\n", crtc_id);
                return -ENOENT;
        }
-       crtc = obj_to_crtc(obj);
        radeon_crtc = to_radeon_crtc(crtc);
        crtc_id = radeon_crtc->crtc_id;
 
@@ -4067,39 +4074,6 @@ int r100_init(struct radeon_device *rdev)
        return 0;
 }
 
-uint32_t r100_mm_rreg(struct radeon_device *rdev, uint32_t reg,
-                     bool always_indirect)
-{
-       if (reg < rdev->rmmio_size && !always_indirect)
-               return readl(((void __iomem *)rdev->rmmio) + reg);
-       else {
-               unsigned long flags;
-               uint32_t ret;
-
-               spin_lock_irqsave(&rdev->mmio_idx_lock, flags);
-               writel(reg, ((void __iomem *)rdev->rmmio) + RADEON_MM_INDEX);
-               ret = readl(((void __iomem *)rdev->rmmio) + RADEON_MM_DATA);
-               spin_unlock_irqrestore(&rdev->mmio_idx_lock, flags);
-
-               return ret;
-       }
-}
-
-void r100_mm_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v,
-                 bool always_indirect)
-{
-       if (reg < rdev->rmmio_size && !always_indirect)
-               writel(v, ((void __iomem *)rdev->rmmio) + reg);
-       else {
-               unsigned long flags;
-
-               spin_lock_irqsave(&rdev->mmio_idx_lock, flags);
-               writel(reg, ((void __iomem *)rdev->rmmio) + RADEON_MM_INDEX);
-               writel(v, ((void __iomem *)rdev->rmmio) + RADEON_MM_DATA);
-               spin_unlock_irqrestore(&rdev->mmio_idx_lock, flags);
-       }
-}
-
 u32 r100_io_rreg(struct radeon_device *rdev, u32 reg)
 {
        if (reg < rdev->rio_mem_size)
index 3c21d77a483d3a604c6ad6392ab1370377e78423..75b30338c226f01ef263edcac893e16dec496643 100644 (file)
@@ -69,17 +69,23 @@ void rv370_pcie_gart_tlb_flush(struct radeon_device *rdev)
        mb();
 }
 
+#define R300_PTE_UNSNOOPED (1 << 0)
 #define R300_PTE_WRITEABLE (1 << 2)
 #define R300_PTE_READABLE  (1 << 3)
 
 void rv370_pcie_gart_set_page(struct radeon_device *rdev, unsigned i,
-                             uint64_t addr)
+                             uint64_t addr, uint32_t flags)
 {
        void __iomem *ptr = rdev->gart.ptr;
 
        addr = (lower_32_bits(addr) >> 8) |
-              ((upper_32_bits(addr) & 0xff) << 24) |
-              R300_PTE_WRITEABLE | R300_PTE_READABLE;
+               ((upper_32_bits(addr) & 0xff) << 24);
+       if (flags & RADEON_GART_PAGE_READ)
+               addr |= R300_PTE_READABLE;
+       if (flags & RADEON_GART_PAGE_WRITE)
+               addr |= R300_PTE_WRITEABLE;
+       if (!(flags & RADEON_GART_PAGE_SNOOP))
+               addr |= R300_PTE_UNSNOOPED;
        /* on x86 we want this to be CPU endian, on powerpc
         * on powerpc without HW swappers, it'll get swapped on way
         * into VRAM - so no need for cpu_to_le32 on VRAM tables */
@@ -120,7 +126,6 @@ int rv370_pcie_gart_enable(struct radeon_device *rdev)
        r = radeon_gart_table_vram_pin(rdev);
        if (r)
                return r;
-       radeon_gart_restore(rdev);
        /* discard memory request outside of configured range */
        tmp = RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD;
        WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp);
index 3c69f58e46efd94b02a440e15e8aad66f9241712..c70a504d96af5a8ac6f8a9f8e40dd2039917e467 100644 (file)
@@ -968,7 +968,6 @@ static int r600_pcie_gart_enable(struct radeon_device *rdev)
        r = radeon_gart_table_vram_pin(rdev);
        if (r)
                return r;
-       radeon_gart_restore(rdev);
 
        /* Setup L2 cache */
        WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING |
@@ -1339,7 +1338,7 @@ int r600_vram_scratch_init(struct radeon_device *rdev)
        if (rdev->vram_scratch.robj == NULL) {
                r = radeon_bo_create(rdev, RADEON_GPU_PAGE_SIZE,
                                     PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM,
-                                    NULL, &rdev->vram_scratch.robj);
+                                    0, NULL, &rdev->vram_scratch.robj);
                if (r) {
                        return r;
                }
@@ -3227,7 +3226,7 @@ int r600_ih_ring_alloc(struct radeon_device *rdev)
        if (rdev->ih.ring_obj == NULL) {
                r = radeon_bo_create(rdev, rdev->ih.ring_size,
                                     PAGE_SIZE, true,
-                                    RADEON_GEM_DOMAIN_GTT,
+                                    RADEON_GEM_DOMAIN_GTT, 0,
                                     NULL, &rdev->ih.ring_obj);
                if (r) {
                        DRM_ERROR("radeon: failed to create ih ring buffer (%d).\n", r);
@@ -3924,11 +3923,13 @@ restart_ih:
                        break;
                case 9: /* D1 pflip */
                        DRM_DEBUG("IH: D1 flip\n");
-                       radeon_crtc_handle_flip(rdev, 0);
+                       if (radeon_use_pflipirq > 0)
+                               radeon_crtc_handle_flip(rdev, 0);
                        break;
                case 11: /* D2 pflip */
                        DRM_DEBUG("IH: D2 flip\n");
-                       radeon_crtc_handle_flip(rdev, 1);
+                       if (radeon_use_pflipirq > 0)
+                               radeon_crtc_handle_flip(rdev, 1);
                        break;
                case 19: /* HPD/DAC hotplug */
                        switch (src_data) {
@@ -4089,16 +4090,15 @@ int r600_debugfs_mc_info_init(struct radeon_device *rdev)
 }
 
 /**
- * r600_ioctl_wait_idle - flush host path cache on wait idle ioctl
+ * r600_mmio_hdp_flush - flush Host Data Path cache via MMIO
  * rdev: radeon device structure
- * bo: buffer object struct which userspace is waiting for idle
  *
- * Some R6XX/R7XX doesn't seems to take into account HDP flush performed
- * through ring buffer, this leads to corruption in rendering, see
- * http://bugzilla.kernel.org/show_bug.cgi?id=15186 to avoid this we
- * directly perform HDP flush by writing register through MMIO.
+ * Some R6XX/R7XX don't seem to take into account HDP flushes performed
+ * through the ring buffer. This leads to corruption in rendering, see
+ * http://bugzilla.kernel.org/show_bug.cgi?id=15186 . To avoid this, we
+ * directly perform the HDP flush by writing the register through MMIO.
  */
-void r600_ioctl_wait_idle(struct radeon_device *rdev, struct radeon_bo *bo)
+void r600_mmio_hdp_flush(struct radeon_device *rdev)
 {
        /* r7xx hw bug.  write to HDP_DEBUG1 followed by fb read
         * rather than write to HDP_REG_COHERENCY_FLUSH_CNTL.
index 12511bb5fd6facea3f6b5eca1a5eaf43093274fe..c47537a1ddbad19cf49ad9cdae7cf6ef8438142d 100644 (file)
@@ -825,7 +825,6 @@ int r600_cs_common_vline_parse(struct radeon_cs_parser *p,
                               uint32_t *vline_start_end,
                               uint32_t *vline_status)
 {
-       struct drm_mode_object *obj;
        struct drm_crtc *crtc;
        struct radeon_crtc *radeon_crtc;
        struct radeon_cs_packet p3reloc, wait_reg_mem;
@@ -887,12 +886,11 @@ int r600_cs_common_vline_parse(struct radeon_cs_parser *p,
        crtc_id = radeon_get_ib_value(p, h_idx + 2 + 7 + 1);
        reg = R600_CP_PACKET0_GET_REG(header);
 
-       obj = drm_mode_object_find(p->rdev->ddev, crtc_id, DRM_MODE_OBJECT_CRTC);
-       if (!obj) {
+       crtc = drm_crtc_find(p->rdev->ddev, crtc_id);
+       if (!crtc) {
                DRM_ERROR("cannot find crtc %d\n", crtc_id);
                return -ENOENT;
        }
-       crtc = obj_to_crtc(obj);
        radeon_crtc = to_radeon_crtc(crtc);
        crtc_id = radeon_crtc->crtc_id;
 
index 60c47f8291222369f7f6070953eea7bda1a25ce9..9e1732eb402c5ec831c9bbd514084e7ce30462c2 100644 (file)
@@ -64,6 +64,7 @@
 #include <linux/wait.h>
 #include <linux/list.h>
 #include <linux/kref.h>
+#include <linux/interval_tree.h>
 
 #include <ttm/ttm_bo_api.h>
 #include <ttm/ttm_bo_driver.h>
@@ -103,6 +104,7 @@ extern int radeon_hard_reset;
 extern int radeon_vm_size;
 extern int radeon_vm_block_size;
 extern int radeon_deep_color;
+extern int radeon_use_pflipirq;
 
 /*
  * Copy from radeon_drv.h so we don't have to include both and have conflicting
@@ -304,6 +306,9 @@ int radeon_atom_get_leakage_vddc_based_on_leakage_params(struct radeon_device *r
                                                         u16 *vddc, u16 *vddci,
                                                         u16 virtual_voltage_id,
                                                         u16 vbios_voltage_id);
+int radeon_atom_get_voltage_evv(struct radeon_device *rdev,
+                               u16 virtual_voltage_id,
+                               u16 *voltage);
 int radeon_atom_round_to_true_voltage(struct radeon_device *rdev,
                                      u8 voltage_type,
                                      u16 nominal_voltage,
@@ -317,6 +322,9 @@ int radeon_atom_get_voltage_table(struct radeon_device *rdev,
                                  struct atom_voltage_table *voltage_table);
 bool radeon_atom_is_voltage_gpio(struct radeon_device *rdev,
                                 u8 voltage_type, u8 voltage_mode);
+int radeon_atom_get_svi2_info(struct radeon_device *rdev,
+                             u8 voltage_type,
+                             u8 *svd_gpio_id, u8 *svc_gpio_id);
 void radeon_atom_update_memory_dll(struct radeon_device *rdev,
                                   u32 mem_clock);
 void radeon_atom_set_ac_timing(struct radeon_device *rdev,
@@ -441,14 +449,12 @@ struct radeon_mman {
 struct radeon_bo_va {
        /* protected by bo being reserved */
        struct list_head                bo_list;
-       uint64_t                        soffset;
-       uint64_t                        eoffset;
        uint32_t                        flags;
-       bool                            valid;
+       uint64_t                        addr;
        unsigned                        ref_count;
 
        /* protected by vm mutex */
-       struct list_head                vm_list;
+       struct interval_tree_node       it;
        struct list_head                vm_status;
 
        /* constant after initialization */
@@ -465,6 +471,7 @@ struct radeon_bo {
        struct ttm_placement            placement;
        struct ttm_buffer_object        tbo;
        struct ttm_bo_kmap_obj          kmap;
+       u32                             flags;
        unsigned                        pin_count;
        void                            *kptr;
        u32                             tiling_flags;
@@ -543,9 +550,9 @@ struct radeon_gem {
 
 int radeon_gem_init(struct radeon_device *rdev);
 void radeon_gem_fini(struct radeon_device *rdev);
-int radeon_gem_object_create(struct radeon_device *rdev, int size,
+int radeon_gem_object_create(struct radeon_device *rdev, unsigned long size,
                                int alignment, int initial_domain,
-                               bool discardable, bool kernel,
+                               u32 flags, bool kernel,
                                struct drm_gem_object **obj);
 
 int radeon_mode_dumb_create(struct drm_file *file_priv,
@@ -590,6 +597,12 @@ struct radeon_mc;
 #define RADEON_GPU_PAGE_SHIFT 12
 #define RADEON_GPU_PAGE_ALIGN(a) (((a) + RADEON_GPU_PAGE_MASK) & ~RADEON_GPU_PAGE_MASK)
 
+#define RADEON_GART_PAGE_DUMMY  0
+#define RADEON_GART_PAGE_VALID (1 << 0)
+#define RADEON_GART_PAGE_READ  (1 << 1)
+#define RADEON_GART_PAGE_WRITE (1 << 2)
+#define RADEON_GART_PAGE_SNOOP (1 << 3)
+
 struct radeon_gart {
        dma_addr_t                      table_addr;
        struct radeon_bo                *robj;
@@ -614,8 +627,7 @@ void radeon_gart_unbind(struct radeon_device *rdev, unsigned offset,
                        int pages);
 int radeon_gart_bind(struct radeon_device *rdev, unsigned offset,
                     int pages, struct page **pagelist,
-                    dma_addr_t *dma_addr);
-void radeon_gart_restore(struct radeon_device *rdev);
+                    dma_addr_t *dma_addr, uint32_t flags);
 
 
 /*
@@ -855,9 +867,9 @@ struct radeon_mec {
 #define R600_PTE_FRAG_64KB     (4 << 7)
 #define R600_PTE_FRAG_256KB    (6 << 7)
 
-/* flags used for GART page table entries on R600+ */
-#define R600_PTE_GART  ( R600_PTE_VALID | R600_PTE_SYSTEM | R600_PTE_SNOOPED \
-                       | R600_PTE_READABLE | R600_PTE_WRITEABLE)
+/* flags needed to be set so we can copy directly from the GART table */
+#define R600_PTE_GART_MASK     ( R600_PTE_READABLE | R600_PTE_WRITEABLE | \
+                                 R600_PTE_SYSTEM | R600_PTE_VALID )
 
 struct radeon_vm_pt {
        struct radeon_bo                *bo;
@@ -865,9 +877,12 @@ struct radeon_vm_pt {
 };
 
 struct radeon_vm {
-       struct list_head                va;
+       struct rb_root                  va;
        unsigned                        id;
 
+       /* BOs moved, but not yet updated in the PT */
+       struct list_head                invalidated;
+
        /* BOs freed, but not yet updated in the PT */
        struct list_head                freed;
 
@@ -1740,6 +1755,7 @@ struct radeon_asic_ring {
        /* command emmit functions */
        void (*ib_execute)(struct radeon_device *rdev, struct radeon_ib *ib);
        void (*emit_fence)(struct radeon_device *rdev, struct radeon_fence *fence);
+       void (*hdp_flush)(struct radeon_device *rdev, struct radeon_ring *ring);
        bool (*emit_semaphore)(struct radeon_device *rdev, struct radeon_ring *cp,
                               struct radeon_semaphore *semaphore, bool emit_wait);
        void (*vm_flush)(struct radeon_device *rdev, int ridx, struct radeon_vm *vm);
@@ -1763,13 +1779,8 @@ struct radeon_asic {
        int (*suspend)(struct radeon_device *rdev);
        void (*vga_set_state)(struct radeon_device *rdev, bool state);
        int (*asic_reset)(struct radeon_device *rdev);
-       /* ioctl hw specific callback. Some hw might want to perform special
-        * operation on specific ioctl. For instance on wait idle some hw
-        * might want to perform and HDP flush through MMIO as it seems that
-        * some R6XX/R7XX hw doesn't take HDP flush into account if programmed
-        * through ring.
-        */
-       void (*ioctl_wait_idle)(struct radeon_device *rdev, struct radeon_bo *bo);
+       /* Flush the HDP cache via MMIO */
+       void (*mmio_hdp_flush)(struct radeon_device *rdev);
        /* check if 3D engine is idle */
        bool (*gui_idle)(struct radeon_device *rdev);
        /* wait for mc_idle */
@@ -1782,16 +1793,26 @@ struct radeon_asic {
        struct {
                void (*tlb_flush)(struct radeon_device *rdev);
                void (*set_page)(struct radeon_device *rdev, unsigned i,
-                                uint64_t addr);
+                                uint64_t addr, uint32_t flags);
        } gart;
        struct {
                int (*init)(struct radeon_device *rdev);
                void (*fini)(struct radeon_device *rdev);
-               void (*set_page)(struct radeon_device *rdev,
-                                struct radeon_ib *ib,
-                                uint64_t pe,
-                                uint64_t addr, unsigned count,
-                                uint32_t incr, uint32_t flags);
+               void (*copy_pages)(struct radeon_device *rdev,
+                                  struct radeon_ib *ib,
+                                  uint64_t pe, uint64_t src,
+                                  unsigned count);
+               void (*write_pages)(struct radeon_device *rdev,
+                                   struct radeon_ib *ib,
+                                   uint64_t pe,
+                                   uint64_t addr, unsigned count,
+                                   uint32_t incr, uint32_t flags);
+               void (*set_pages)(struct radeon_device *rdev,
+                                 struct radeon_ib *ib,
+                                 uint64_t pe,
+                                 uint64_t addr, unsigned count,
+                                 uint32_t incr, uint32_t flags);
+               void (*pad_ib)(struct radeon_ib *ib);
        } vm;
        /* ring specific callbacks */
        struct radeon_asic_ring *ring[RADEON_NUM_RINGS];
@@ -2299,10 +2320,12 @@ struct radeon_device {
        const struct firmware *mc_fw;   /* NI MC firmware */
        const struct firmware *ce_fw;   /* SI CE firmware */
        const struct firmware *mec_fw;  /* CIK MEC firmware */
+       const struct firmware *mec2_fw; /* KV MEC2 firmware */
        const struct firmware *sdma_fw; /* CIK SDMA firmware */
        const struct firmware *smc_fw;  /* SMC firmware */
        const struct firmware *uvd_fw;  /* UVD firmware */
        const struct firmware *vce_fw;  /* VCE firmware */
+       bool new_fw;
        struct r600_vram_scratch vram_scratch;
        int msi_enabled; /* msi enabled */
        struct r600_ih ih; /* r6/700 interrupt ring */
@@ -2342,6 +2365,11 @@ struct radeon_device {
 
        struct dev_pm_domain vga_pm_domain;
        bool have_disp_power_ref;
+       u32 px_quirk_flags;
+
+       /* tracking pinned memory */
+       u64 vram_pin_size;
+       u64 gart_pin_size;
 };
 
 bool radeon_is_px(struct drm_device *dev);
@@ -2352,10 +2380,42 @@ int radeon_device_init(struct radeon_device *rdev,
 void radeon_device_fini(struct radeon_device *rdev);
 int radeon_gpu_wait_for_idle(struct radeon_device *rdev);
 
-uint32_t r100_mm_rreg(struct radeon_device *rdev, uint32_t reg,
-                     bool always_indirect);
-void r100_mm_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v,
-                 bool always_indirect);
+#define RADEON_MIN_MMIO_SIZE 0x10000
+
+static inline uint32_t r100_mm_rreg(struct radeon_device *rdev, uint32_t reg,
+                                   bool always_indirect)
+{
+       /* The mmio size is 64kb at minimum. Allows the if to be optimized out. */
+       if ((reg < rdev->rmmio_size || reg < RADEON_MIN_MMIO_SIZE) && !always_indirect)
+               return readl(((void __iomem *)rdev->rmmio) + reg);
+       else {
+               unsigned long flags;
+               uint32_t ret;
+
+               spin_lock_irqsave(&rdev->mmio_idx_lock, flags);
+               writel(reg, ((void __iomem *)rdev->rmmio) + RADEON_MM_INDEX);
+               ret = readl(((void __iomem *)rdev->rmmio) + RADEON_MM_DATA);
+               spin_unlock_irqrestore(&rdev->mmio_idx_lock, flags);
+
+               return ret;
+       }
+}
+
+static inline void r100_mm_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v,
+                               bool always_indirect)
+{
+       if ((reg < rdev->rmmio_size || reg < RADEON_MIN_MMIO_SIZE) && !always_indirect)
+               writel(v, ((void __iomem *)rdev->rmmio) + reg);
+       else {
+               unsigned long flags;
+
+               spin_lock_irqsave(&rdev->mmio_idx_lock, flags);
+               writel(reg, ((void __iomem *)rdev->rmmio) + RADEON_MM_INDEX);
+               writel(v, ((void __iomem *)rdev->rmmio) + RADEON_MM_DATA);
+               spin_unlock_irqrestore(&rdev->mmio_idx_lock, flags);
+       }
+}
+
 u32 r100_io_rreg(struct radeon_device *rdev, u32 reg);
 void r100_io_wreg(struct radeon_device *rdev, u32 reg, u32 v);
 
@@ -2709,10 +2769,13 @@ void radeon_ring_write(struct radeon_ring *ring, uint32_t v);
 #define radeon_vga_set_state(rdev, state) (rdev)->asic->vga_set_state((rdev), (state))
 #define radeon_asic_reset(rdev) (rdev)->asic->asic_reset((rdev))
 #define radeon_gart_tlb_flush(rdev) (rdev)->asic->gart.tlb_flush((rdev))
-#define radeon_gart_set_page(rdev, i, p) (rdev)->asic->gart.set_page((rdev), (i), (p))
+#define radeon_gart_set_page(rdev, i, p, f) (rdev)->asic->gart.set_page((rdev), (i), (p), (f))
 #define radeon_asic_vm_init(rdev) (rdev)->asic->vm.init((rdev))
 #define radeon_asic_vm_fini(rdev) (rdev)->asic->vm.fini((rdev))
-#define radeon_asic_vm_set_page(rdev, ib, pe, addr, count, incr, flags) ((rdev)->asic->vm.set_page((rdev), (ib), (pe), (addr), (count), (incr), (flags)))
+#define radeon_asic_vm_copy_pages(rdev, ib, pe, src, count) ((rdev)->asic->vm.copy_pages((rdev), (ib), (pe), (src), (count)))
+#define radeon_asic_vm_write_pages(rdev, ib, pe, addr, count, incr, flags) ((rdev)->asic->vm.write_pages((rdev), (ib), (pe), (addr), (count), (incr), (flags)))
+#define radeon_asic_vm_set_pages(rdev, ib, pe, addr, count, incr, flags) ((rdev)->asic->vm.set_pages((rdev), (ib), (pe), (addr), (count), (incr), (flags)))
+#define radeon_asic_vm_pad_ib(rdev, ib) ((rdev)->asic->vm.pad_ib((ib)))
 #define radeon_ring_start(rdev, r, cp) (rdev)->asic->ring[(r)]->ring_start((rdev), (cp))
 #define radeon_ring_test(rdev, r, cp) (rdev)->asic->ring[(r)]->ring_test((rdev), (cp))
 #define radeon_ib_test(rdev, r, cp) (rdev)->asic->ring[(r)]->ib_test((rdev), (cp))
@@ -2840,6 +2903,8 @@ int radeon_vm_update_page_directory(struct radeon_device *rdev,
                                    struct radeon_vm *vm);
 int radeon_vm_clear_freed(struct radeon_device *rdev,
                          struct radeon_vm *vm);
+int radeon_vm_clear_invalids(struct radeon_device *rdev,
+                            struct radeon_vm *vm);
 int radeon_vm_bo_update(struct radeon_device *rdev,
                        struct radeon_bo_va *bo_va,
                        struct ttm_mem_reg *mem);
index 34b9aa9e3c0603d52589ffc89f8885c9af9a733d..eeeeabe09758ddccf2175ad48d9b9bd62e896e83 100644 (file)
@@ -185,6 +185,7 @@ static struct radeon_asic_ring r100_gfx_ring = {
        .get_rptr = &r100_gfx_get_rptr,
        .get_wptr = &r100_gfx_get_wptr,
        .set_wptr = &r100_gfx_set_wptr,
+       .hdp_flush = &r100_ring_hdp_flush,
 };
 
 static struct radeon_asic r100_asic = {
@@ -194,7 +195,7 @@ static struct radeon_asic r100_asic = {
        .resume = &r100_resume,
        .vga_set_state = &r100_vga_set_state,
        .asic_reset = &r100_asic_reset,
-       .ioctl_wait_idle = NULL,
+       .mmio_hdp_flush = NULL,
        .gui_idle = &r100_gui_idle,
        .mc_wait_for_idle = &r100_mc_wait_for_idle,
        .gart = {
@@ -260,7 +261,7 @@ static struct radeon_asic r200_asic = {
        .resume = &r100_resume,
        .vga_set_state = &r100_vga_set_state,
        .asic_reset = &r100_asic_reset,
-       .ioctl_wait_idle = NULL,
+       .mmio_hdp_flush = NULL,
        .gui_idle = &r100_gui_idle,
        .mc_wait_for_idle = &r100_mc_wait_for_idle,
        .gart = {
@@ -331,6 +332,7 @@ static struct radeon_asic_ring r300_gfx_ring = {
        .get_rptr = &r100_gfx_get_rptr,
        .get_wptr = &r100_gfx_get_wptr,
        .set_wptr = &r100_gfx_set_wptr,
+       .hdp_flush = &r100_ring_hdp_flush,
 };
 
 static struct radeon_asic r300_asic = {
@@ -340,7 +342,7 @@ static struct radeon_asic r300_asic = {
        .resume = &r300_resume,
        .vga_set_state = &r100_vga_set_state,
        .asic_reset = &r300_asic_reset,
-       .ioctl_wait_idle = NULL,
+       .mmio_hdp_flush = NULL,
        .gui_idle = &r100_gui_idle,
        .mc_wait_for_idle = &r300_mc_wait_for_idle,
        .gart = {
@@ -406,7 +408,7 @@ static struct radeon_asic r300_asic_pcie = {
        .resume = &r300_resume,
        .vga_set_state = &r100_vga_set_state,
        .asic_reset = &r300_asic_reset,
-       .ioctl_wait_idle = NULL,
+       .mmio_hdp_flush = NULL,
        .gui_idle = &r100_gui_idle,
        .mc_wait_for_idle = &r300_mc_wait_for_idle,
        .gart = {
@@ -472,7 +474,7 @@ static struct radeon_asic r420_asic = {
        .resume = &r420_resume,
        .vga_set_state = &r100_vga_set_state,
        .asic_reset = &r300_asic_reset,
-       .ioctl_wait_idle = NULL,
+       .mmio_hdp_flush = NULL,
        .gui_idle = &r100_gui_idle,
        .mc_wait_for_idle = &r300_mc_wait_for_idle,
        .gart = {
@@ -538,7 +540,7 @@ static struct radeon_asic rs400_asic = {
        .resume = &rs400_resume,
        .vga_set_state = &r100_vga_set_state,
        .asic_reset = &r300_asic_reset,
-       .ioctl_wait_idle = NULL,
+       .mmio_hdp_flush = NULL,
        .gui_idle = &r100_gui_idle,
        .mc_wait_for_idle = &rs400_mc_wait_for_idle,
        .gart = {
@@ -604,7 +606,7 @@ static struct radeon_asic rs600_asic = {
        .resume = &rs600_resume,
        .vga_set_state = &r100_vga_set_state,
        .asic_reset = &rs600_asic_reset,
-       .ioctl_wait_idle = NULL,
+       .mmio_hdp_flush = NULL,
        .gui_idle = &r100_gui_idle,
        .mc_wait_for_idle = &rs600_mc_wait_for_idle,
        .gart = {
@@ -672,7 +674,7 @@ static struct radeon_asic rs690_asic = {
        .resume = &rs690_resume,
        .vga_set_state = &r100_vga_set_state,
        .asic_reset = &rs600_asic_reset,
-       .ioctl_wait_idle = NULL,
+       .mmio_hdp_flush = NULL,
        .gui_idle = &r100_gui_idle,
        .mc_wait_for_idle = &rs690_mc_wait_for_idle,
        .gart = {
@@ -740,7 +742,7 @@ static struct radeon_asic rv515_asic = {
        .resume = &rv515_resume,
        .vga_set_state = &r100_vga_set_state,
        .asic_reset = &rs600_asic_reset,
-       .ioctl_wait_idle = NULL,
+       .mmio_hdp_flush = NULL,
        .gui_idle = &r100_gui_idle,
        .mc_wait_for_idle = &rv515_mc_wait_for_idle,
        .gart = {
@@ -806,7 +808,7 @@ static struct radeon_asic r520_asic = {
        .resume = &r520_resume,
        .vga_set_state = &r100_vga_set_state,
        .asic_reset = &rs600_asic_reset,
-       .ioctl_wait_idle = NULL,
+       .mmio_hdp_flush = NULL,
        .gui_idle = &r100_gui_idle,
        .mc_wait_for_idle = &r520_mc_wait_for_idle,
        .gart = {
@@ -898,7 +900,7 @@ static struct radeon_asic r600_asic = {
        .resume = &r600_resume,
        .vga_set_state = &r600_vga_set_state,
        .asic_reset = &r600_asic_reset,
-       .ioctl_wait_idle = r600_ioctl_wait_idle,
+       .mmio_hdp_flush = r600_mmio_hdp_flush,
        .gui_idle = &r600_gui_idle,
        .mc_wait_for_idle = &r600_mc_wait_for_idle,
        .get_xclk = &r600_get_xclk,
@@ -970,7 +972,7 @@ static struct radeon_asic rv6xx_asic = {
        .resume = &r600_resume,
        .vga_set_state = &r600_vga_set_state,
        .asic_reset = &r600_asic_reset,
-       .ioctl_wait_idle = r600_ioctl_wait_idle,
+       .mmio_hdp_flush = r600_mmio_hdp_flush,
        .gui_idle = &r600_gui_idle,
        .mc_wait_for_idle = &r600_mc_wait_for_idle,
        .get_xclk = &r600_get_xclk,
@@ -1060,7 +1062,7 @@ static struct radeon_asic rs780_asic = {
        .resume = &r600_resume,
        .vga_set_state = &r600_vga_set_state,
        .asic_reset = &r600_asic_reset,
-       .ioctl_wait_idle = r600_ioctl_wait_idle,
+       .mmio_hdp_flush = r600_mmio_hdp_flush,
        .gui_idle = &r600_gui_idle,
        .mc_wait_for_idle = &r600_mc_wait_for_idle,
        .get_xclk = &r600_get_xclk,
@@ -1163,7 +1165,7 @@ static struct radeon_asic rv770_asic = {
        .resume = &rv770_resume,
        .asic_reset = &r600_asic_reset,
        .vga_set_state = &r600_vga_set_state,
-       .ioctl_wait_idle = r600_ioctl_wait_idle,
+       .mmio_hdp_flush = r600_mmio_hdp_flush,
        .gui_idle = &r600_gui_idle,
        .mc_wait_for_idle = &r600_mc_wait_for_idle,
        .get_xclk = &rv770_get_xclk,
@@ -1281,7 +1283,7 @@ static struct radeon_asic evergreen_asic = {
        .resume = &evergreen_resume,
        .asic_reset = &evergreen_asic_reset,
        .vga_set_state = &r600_vga_set_state,
-       .ioctl_wait_idle = r600_ioctl_wait_idle,
+       .mmio_hdp_flush = r600_mmio_hdp_flush,
        .gui_idle = &r600_gui_idle,
        .mc_wait_for_idle = &evergreen_mc_wait_for_idle,
        .get_xclk = &rv770_get_xclk,
@@ -1373,7 +1375,7 @@ static struct radeon_asic sumo_asic = {
        .resume = &evergreen_resume,
        .asic_reset = &evergreen_asic_reset,
        .vga_set_state = &r600_vga_set_state,
-       .ioctl_wait_idle = r600_ioctl_wait_idle,
+       .mmio_hdp_flush = r600_mmio_hdp_flush,
        .gui_idle = &r600_gui_idle,
        .mc_wait_for_idle = &evergreen_mc_wait_for_idle,
        .get_xclk = &r600_get_xclk,
@@ -1464,7 +1466,7 @@ static struct radeon_asic btc_asic = {
        .resume = &evergreen_resume,
        .asic_reset = &evergreen_asic_reset,
        .vga_set_state = &r600_vga_set_state,
-       .ioctl_wait_idle = r600_ioctl_wait_idle,
+       .mmio_hdp_flush = r600_mmio_hdp_flush,
        .gui_idle = &r600_gui_idle,
        .mc_wait_for_idle = &evergreen_mc_wait_for_idle,
        .get_xclk = &rv770_get_xclk,
@@ -1599,7 +1601,7 @@ static struct radeon_asic cayman_asic = {
        .resume = &cayman_resume,
        .asic_reset = &cayman_asic_reset,
        .vga_set_state = &r600_vga_set_state,
-       .ioctl_wait_idle = r600_ioctl_wait_idle,
+       .mmio_hdp_flush = r600_mmio_hdp_flush,
        .gui_idle = &r600_gui_idle,
        .mc_wait_for_idle = &evergreen_mc_wait_for_idle,
        .get_xclk = &rv770_get_xclk,
@@ -1611,7 +1613,10 @@ static struct radeon_asic cayman_asic = {
        .vm = {
                .init = &cayman_vm_init,
                .fini = &cayman_vm_fini,
-               .set_page = &cayman_dma_vm_set_page,
+               .copy_pages = &cayman_dma_vm_copy_pages,
+               .write_pages = &cayman_dma_vm_write_pages,
+               .set_pages = &cayman_dma_vm_set_pages,
+               .pad_ib = &cayman_dma_vm_pad_ib,
        },
        .ring = {
                [RADEON_RING_TYPE_GFX_INDEX] = &cayman_gfx_ring,
@@ -1699,7 +1704,7 @@ static struct radeon_asic trinity_asic = {
        .resume = &cayman_resume,
        .asic_reset = &cayman_asic_reset,
        .vga_set_state = &r600_vga_set_state,
-       .ioctl_wait_idle = r600_ioctl_wait_idle,
+       .mmio_hdp_flush = r600_mmio_hdp_flush,
        .gui_idle = &r600_gui_idle,
        .mc_wait_for_idle = &evergreen_mc_wait_for_idle,
        .get_xclk = &r600_get_xclk,
@@ -1711,7 +1716,10 @@ static struct radeon_asic trinity_asic = {
        .vm = {
                .init = &cayman_vm_init,
                .fini = &cayman_vm_fini,
-               .set_page = &cayman_dma_vm_set_page,
+               .copy_pages = &cayman_dma_vm_copy_pages,
+               .write_pages = &cayman_dma_vm_write_pages,
+               .set_pages = &cayman_dma_vm_set_pages,
+               .pad_ib = &cayman_dma_vm_pad_ib,
        },
        .ring = {
                [RADEON_RING_TYPE_GFX_INDEX] = &cayman_gfx_ring,
@@ -1829,7 +1837,7 @@ static struct radeon_asic si_asic = {
        .resume = &si_resume,
        .asic_reset = &si_asic_reset,
        .vga_set_state = &r600_vga_set_state,
-       .ioctl_wait_idle = r600_ioctl_wait_idle,
+       .mmio_hdp_flush = r600_mmio_hdp_flush,
        .gui_idle = &r600_gui_idle,
        .mc_wait_for_idle = &evergreen_mc_wait_for_idle,
        .get_xclk = &si_get_xclk,
@@ -1841,7 +1849,10 @@ static struct radeon_asic si_asic = {
        .vm = {
                .init = &si_vm_init,
                .fini = &si_vm_fini,
-               .set_page = &si_dma_vm_set_page,
+               .copy_pages = &si_dma_vm_copy_pages,
+               .write_pages = &si_dma_vm_write_pages,
+               .set_pages = &si_dma_vm_set_pages,
+               .pad_ib = &cayman_dma_vm_pad_ib,
        },
        .ring = {
                [RADEON_RING_TYPE_GFX_INDEX] = &si_gfx_ring,
@@ -1987,7 +1998,7 @@ static struct radeon_asic ci_asic = {
        .resume = &cik_resume,
        .asic_reset = &cik_asic_reset,
        .vga_set_state = &r600_vga_set_state,
-       .ioctl_wait_idle = NULL,
+       .mmio_hdp_flush = &r600_mmio_hdp_flush,
        .gui_idle = &r600_gui_idle,
        .mc_wait_for_idle = &evergreen_mc_wait_for_idle,
        .get_xclk = &cik_get_xclk,
@@ -1999,7 +2010,10 @@ static struct radeon_asic ci_asic = {
        .vm = {
                .init = &cik_vm_init,
                .fini = &cik_vm_fini,
-               .set_page = &cik_sdma_vm_set_page,
+               .copy_pages = &cik_sdma_vm_copy_pages,
+               .write_pages = &cik_sdma_vm_write_pages,
+               .set_pages = &cik_sdma_vm_set_pages,
+               .pad_ib = &cik_sdma_vm_pad_ib,
        },
        .ring = {
                [RADEON_RING_TYPE_GFX_INDEX] = &ci_gfx_ring,
@@ -2091,7 +2105,7 @@ static struct radeon_asic kv_asic = {
        .resume = &cik_resume,
        .asic_reset = &cik_asic_reset,
        .vga_set_state = &r600_vga_set_state,
-       .ioctl_wait_idle = NULL,
+       .mmio_hdp_flush = &r600_mmio_hdp_flush,
        .gui_idle = &r600_gui_idle,
        .mc_wait_for_idle = &evergreen_mc_wait_for_idle,
        .get_xclk = &cik_get_xclk,
@@ -2103,7 +2117,10 @@ static struct radeon_asic kv_asic = {
        .vm = {
                .init = &cik_vm_init,
                .fini = &cik_vm_fini,
-               .set_page = &cik_sdma_vm_set_page,
+               .copy_pages = &cik_sdma_vm_copy_pages,
+               .write_pages = &cik_sdma_vm_write_pages,
+               .set_pages = &cik_sdma_vm_set_pages,
+               .pad_ib = &cik_sdma_vm_pad_ib,
        },
        .ring = {
                [RADEON_RING_TYPE_GFX_INDEX] = &ci_gfx_ring,
@@ -2457,7 +2474,7 @@ int radeon_asic_init(struct radeon_device *rdev)
                        rdev->cg_flags =
                                RADEON_CG_SUPPORT_GFX_MGCG |
                                RADEON_CG_SUPPORT_GFX_MGLS |
-                               RADEON_CG_SUPPORT_GFX_CGCG |
+                               /*RADEON_CG_SUPPORT_GFX_CGCG |*/
                                RADEON_CG_SUPPORT_GFX_CGLS |
                                RADEON_CG_SUPPORT_GFX_CGTS |
                                RADEON_CG_SUPPORT_GFX_CGTS_LS |
@@ -2476,7 +2493,7 @@ int radeon_asic_init(struct radeon_device *rdev)
                        rdev->cg_flags =
                                RADEON_CG_SUPPORT_GFX_MGCG |
                                RADEON_CG_SUPPORT_GFX_MGLS |
-                               RADEON_CG_SUPPORT_GFX_CGCG |
+                               /*RADEON_CG_SUPPORT_GFX_CGCG |*/
                                RADEON_CG_SUPPORT_GFX_CGLS |
                                RADEON_CG_SUPPORT_GFX_CGTS |
                                RADEON_CG_SUPPORT_GFX_CP_LS |
@@ -2502,7 +2519,7 @@ int radeon_asic_init(struct radeon_device *rdev)
                        rdev->cg_flags =
                                RADEON_CG_SUPPORT_GFX_MGCG |
                                RADEON_CG_SUPPORT_GFX_MGLS |
-                               RADEON_CG_SUPPORT_GFX_CGCG |
+                               /*RADEON_CG_SUPPORT_GFX_CGCG |*/
                                RADEON_CG_SUPPORT_GFX_CGLS |
                                RADEON_CG_SUPPORT_GFX_CGTS |
                                RADEON_CG_SUPPORT_GFX_CGTS_LS |
@@ -2530,7 +2547,7 @@ int radeon_asic_init(struct radeon_device *rdev)
                        rdev->cg_flags =
                                RADEON_CG_SUPPORT_GFX_MGCG |
                                RADEON_CG_SUPPORT_GFX_MGLS |
-                               RADEON_CG_SUPPORT_GFX_CGCG |
+                               /*RADEON_CG_SUPPORT_GFX_CGCG |*/
                                RADEON_CG_SUPPORT_GFX_CGLS |
                                RADEON_CG_SUPPORT_GFX_CGTS |
                                RADEON_CG_SUPPORT_GFX_CGTS_LS |
index 01e7c0ad8f0127a1a758c5c4348059927785bfdb..275a5dc01780f7bedbed2cb3486c4c3d383710eb 100644 (file)
@@ -68,7 +68,7 @@ int r100_asic_reset(struct radeon_device *rdev);
 u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc);
 void r100_pci_gart_tlb_flush(struct radeon_device *rdev);
 void r100_pci_gart_set_page(struct radeon_device *rdev, unsigned i,
-                           uint64_t addr);
+                           uint64_t addr, uint32_t flags);
 void r100_ring_start(struct radeon_device *rdev, struct radeon_ring *ring);
 int r100_irq_set(struct radeon_device *rdev);
 int r100_irq_process(struct radeon_device *rdev);
@@ -148,7 +148,8 @@ u32 r100_gfx_get_wptr(struct radeon_device *rdev,
                      struct radeon_ring *ring);
 void r100_gfx_set_wptr(struct radeon_device *rdev,
                       struct radeon_ring *ring);
-
+void r100_ring_hdp_flush(struct radeon_device *rdev,
+                        struct radeon_ring *ring);
 /*
  * r200,rv250,rs300,rv280
  */
@@ -173,7 +174,7 @@ extern void r300_fence_ring_emit(struct radeon_device *rdev,
 extern int r300_cs_parse(struct radeon_cs_parser *p);
 extern void rv370_pcie_gart_tlb_flush(struct radeon_device *rdev);
 extern void rv370_pcie_gart_set_page(struct radeon_device *rdev, unsigned i,
-                                    uint64_t addr);
+                                    uint64_t addr, uint32_t flags);
 extern void rv370_set_pcie_lanes(struct radeon_device *rdev, int lanes);
 extern int rv370_get_pcie_lanes(struct radeon_device *rdev);
 extern void r300_set_reg_safe(struct radeon_device *rdev);
@@ -209,7 +210,7 @@ extern int rs400_suspend(struct radeon_device *rdev);
 extern int rs400_resume(struct radeon_device *rdev);
 void rs400_gart_tlb_flush(struct radeon_device *rdev);
 void rs400_gart_set_page(struct radeon_device *rdev, unsigned i,
-                        uint64_t addr);
+                        uint64_t addr, uint32_t flags);
 uint32_t rs400_mc_rreg(struct radeon_device *rdev, uint32_t reg);
 void rs400_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v);
 int rs400_gart_init(struct radeon_device *rdev);
@@ -233,7 +234,7 @@ void rs600_irq_disable(struct radeon_device *rdev);
 u32 rs600_get_vblank_counter(struct radeon_device *rdev, int crtc);
 void rs600_gart_tlb_flush(struct radeon_device *rdev);
 void rs600_gart_set_page(struct radeon_device *rdev, unsigned i,
-                        uint64_t addr);
+                        uint64_t addr, uint32_t flags);
 uint32_t rs600_mc_rreg(struct radeon_device *rdev, uint32_t reg);
 void rs600_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v);
 void rs600_bandwidth_update(struct radeon_device *rdev);
@@ -351,7 +352,7 @@ void r600_hpd_fini(struct radeon_device *rdev);
 bool r600_hpd_sense(struct radeon_device *rdev, enum radeon_hpd_id hpd);
 void r600_hpd_set_polarity(struct radeon_device *rdev,
                           enum radeon_hpd_id hpd);
-extern void r600_ioctl_wait_idle(struct radeon_device *rdev, struct radeon_bo *bo);
+extern void r600_mmio_hdp_flush(struct radeon_device *rdev);
 extern bool r600_gui_idle(struct radeon_device *rdev);
 extern void r600_pm_misc(struct radeon_device *rdev);
 extern void r600_pm_init_profile(struct radeon_device *rdev);
@@ -606,11 +607,22 @@ void cayman_dma_ring_ib_execute(struct radeon_device *rdev,
                                struct radeon_ib *ib);
 bool cayman_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring);
 bool cayman_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring);
-void cayman_dma_vm_set_page(struct radeon_device *rdev,
-                           struct radeon_ib *ib,
-                           uint64_t pe,
-                           uint64_t addr, unsigned count,
-                           uint32_t incr, uint32_t flags);
+
+void cayman_dma_vm_copy_pages(struct radeon_device *rdev,
+                             struct radeon_ib *ib,
+                             uint64_t pe, uint64_t src,
+                             unsigned count);
+void cayman_dma_vm_write_pages(struct radeon_device *rdev,
+                              struct radeon_ib *ib,
+                              uint64_t pe,
+                              uint64_t addr, unsigned count,
+                              uint32_t incr, uint32_t flags);
+void cayman_dma_vm_set_pages(struct radeon_device *rdev,
+                            struct radeon_ib *ib,
+                            uint64_t pe,
+                            uint64_t addr, unsigned count,
+                            uint32_t incr, uint32_t flags);
+void cayman_dma_vm_pad_ib(struct radeon_ib *ib);
 
 void cayman_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm);
 
@@ -693,11 +705,22 @@ int si_copy_dma(struct radeon_device *rdev,
                uint64_t src_offset, uint64_t dst_offset,
                unsigned num_gpu_pages,
                struct radeon_fence **fence);
-void si_dma_vm_set_page(struct radeon_device *rdev,
-                       struct radeon_ib *ib,
-                       uint64_t pe,
-                       uint64_t addr, unsigned count,
-                       uint32_t incr, uint32_t flags);
+
+void si_dma_vm_copy_pages(struct radeon_device *rdev,
+                         struct radeon_ib *ib,
+                         uint64_t pe, uint64_t src,
+                         unsigned count);
+void si_dma_vm_write_pages(struct radeon_device *rdev,
+                          struct radeon_ib *ib,
+                          uint64_t pe,
+                          uint64_t addr, unsigned count,
+                          uint32_t incr, uint32_t flags);
+void si_dma_vm_set_pages(struct radeon_device *rdev,
+                        struct radeon_ib *ib,
+                        uint64_t pe,
+                        uint64_t addr, unsigned count,
+                        uint32_t incr, uint32_t flags);
+
 void si_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm);
 u32 si_get_xclk(struct radeon_device *rdev);
 uint64_t si_get_gpu_clock_counter(struct radeon_device *rdev);
@@ -771,11 +794,23 @@ int cik_irq_process(struct radeon_device *rdev);
 int cik_vm_init(struct radeon_device *rdev);
 void cik_vm_fini(struct radeon_device *rdev);
 void cik_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm);
-void cik_sdma_vm_set_page(struct radeon_device *rdev,
-                         struct radeon_ib *ib,
-                         uint64_t pe,
-                         uint64_t addr, unsigned count,
-                         uint32_t incr, uint32_t flags);
+
+void cik_sdma_vm_copy_pages(struct radeon_device *rdev,
+                           struct radeon_ib *ib,
+                           uint64_t pe, uint64_t src,
+                           unsigned count);
+void cik_sdma_vm_write_pages(struct radeon_device *rdev,
+                            struct radeon_ib *ib,
+                            uint64_t pe,
+                            uint64_t addr, unsigned count,
+                            uint32_t incr, uint32_t flags);
+void cik_sdma_vm_set_pages(struct radeon_device *rdev,
+                          struct radeon_ib *ib,
+                          uint64_t pe,
+                          uint64_t addr, unsigned count,
+                          uint32_t incr, uint32_t flags);
+void cik_sdma_vm_pad_ib(struct radeon_ib *ib);
+
 void cik_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm);
 int cik_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib);
 u32 cik_gfx_get_rptr(struct radeon_device *rdev,
index 173f378428a96d477eddf937e7bdd3d46fd222a6..92b2d8dd47355f7f7b601025082868d3e29e60be 100644 (file)
@@ -1963,7 +1963,7 @@ static const char *thermal_controller_names[] = {
        "adm1032",
        "adm1030",
        "max6649",
-       "lm64",
+       "lm63", /* lm64 */
        "f75375",
        "asc7xxx",
 };
@@ -1974,7 +1974,7 @@ static const char *pp_lib_thermal_controller_names[] = {
        "adm1032",
        "adm1030",
        "max6649",
-       "lm64",
+       "lm63", /* lm64 */
        "f75375",
        "RV6xx",
        "RV770",
@@ -3236,6 +3236,41 @@ int radeon_atom_get_leakage_vddc_based_on_leakage_params(struct radeon_device *r
        return 0;
 }
 
+union get_voltage_info {
+       struct  _GET_VOLTAGE_INFO_INPUT_PARAMETER_V1_2 in;
+       struct  _GET_EVV_VOLTAGE_INFO_OUTPUT_PARAMETER_V1_2 evv_out;
+};
+
+int radeon_atom_get_voltage_evv(struct radeon_device *rdev,
+                               u16 virtual_voltage_id,
+                               u16 *voltage)
+{
+       int index = GetIndexIntoMasterTable(COMMAND, GetVoltageInfo);
+       u32 entry_id;
+       u32 count = rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.count;
+       union get_voltage_info args;
+
+       for (entry_id = 0; entry_id < count; entry_id++) {
+               if (rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.entries[entry_id].v ==
+                   virtual_voltage_id)
+                       break;
+       }
+
+       if (entry_id >= count)
+               return -EINVAL;
+
+       args.in.ucVoltageType = VOLTAGE_TYPE_VDDC;
+       args.in.ucVoltageMode = ATOM_GET_VOLTAGE_EVV_VOLTAGE;
+       args.in.ulSCLKFreq =
+               cpu_to_le32(rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.entries[entry_id].clk);
+
+       atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
+
+       *voltage = le16_to_cpu(args.evv_out.usVoltageLevel);
+
+       return 0;
+}
+
 int radeon_atom_get_voltage_gpio_settings(struct radeon_device *rdev,
                                          u16 voltage_level, u8 voltage_type,
                                          u32 *gpio_value, u32 *gpio_mask)
@@ -3397,6 +3432,50 @@ radeon_atom_is_voltage_gpio(struct radeon_device *rdev,
        return false;
 }
 
+int radeon_atom_get_svi2_info(struct radeon_device *rdev,
+                             u8 voltage_type,
+                             u8 *svd_gpio_id, u8 *svc_gpio_id)
+{
+       int index = GetIndexIntoMasterTable(DATA, VoltageObjectInfo);
+       u8 frev, crev;
+       u16 data_offset, size;
+       union voltage_object_info *voltage_info;
+       union voltage_object *voltage_object = NULL;
+
+       if (atom_parse_data_header(rdev->mode_info.atom_context, index, &size,
+                                  &frev, &crev, &data_offset)) {
+               voltage_info = (union voltage_object_info *)
+                       (rdev->mode_info.atom_context->bios + data_offset);
+
+               switch (frev) {
+               case 3:
+                       switch (crev) {
+                       case 1:
+                               voltage_object = (union voltage_object *)
+                                       atom_lookup_voltage_object_v3(&voltage_info->v3,
+                                                                     voltage_type,
+                                                                     VOLTAGE_OBJ_SVID2);
+                               if (voltage_object) {
+                                       *svd_gpio_id = voltage_object->v3.asSVID2Obj.ucSVDGpioId;
+                                       *svc_gpio_id = voltage_object->v3.asSVID2Obj.ucSVCGpioId;
+                               } else {
+                                       return -EINVAL;
+                               }
+                               break;
+                       default:
+                               DRM_ERROR("unknown voltage object table\n");
+                               return -EINVAL;
+                       }
+                       break;
+               default:
+                       DRM_ERROR("unknown voltage object table\n");
+                       return -EINVAL;
+               }
+
+       }
+       return 0;
+}
+
 int radeon_atom_get_max_voltage(struct radeon_device *rdev,
                                u8 voltage_type, u16 *max_voltage)
 {
index 6e05a2e75a46c211bcd5b4236e7c094b1636c9a1..69f5695bdab9b42a3efad5332be67a9866b3336e 100644 (file)
@@ -97,7 +97,7 @@ static void radeon_benchmark_move(struct radeon_device *rdev, unsigned size,
        int time;
 
        n = RADEON_BENCHMARK_ITERATIONS;
-       r = radeon_bo_create(rdev, size, PAGE_SIZE, true, sdomain, NULL, &sobj);
+       r = radeon_bo_create(rdev, size, PAGE_SIZE, true, sdomain, 0, NULL, &sobj);
        if (r) {
                goto out_cleanup;
        }
@@ -109,7 +109,7 @@ static void radeon_benchmark_move(struct radeon_device *rdev, unsigned size,
        if (r) {
                goto out_cleanup;
        }
-       r = radeon_bo_create(rdev, size, PAGE_SIZE, true, ddomain, NULL, &dobj);
+       r = radeon_bo_create(rdev, size, PAGE_SIZE, true, ddomain, 0, NULL, &dobj);
        if (r) {
                goto out_cleanup;
        }
index 44831197e82eed7e441399818408a8599e697dde..300c4b3d4669426d5085d7e5d2e52e23321988d3 100644 (file)
@@ -107,7 +107,7 @@ int radeon_get_monitor_bpc(struct drm_connector *connector)
        case DRM_MODE_CONNECTOR_DVII:
        case DRM_MODE_CONNECTOR_HDMIB:
                if (radeon_connector->use_digital) {
-                       if (drm_detect_hdmi_monitor(radeon_connector->edid)) {
+                       if (drm_detect_hdmi_monitor(radeon_connector_edid(connector))) {
                                if (connector->display_info.bpc)
                                        bpc = connector->display_info.bpc;
                        }
@@ -115,7 +115,7 @@ int radeon_get_monitor_bpc(struct drm_connector *connector)
                break;
        case DRM_MODE_CONNECTOR_DVID:
        case DRM_MODE_CONNECTOR_HDMIA:
-               if (drm_detect_hdmi_monitor(radeon_connector->edid)) {
+               if (drm_detect_hdmi_monitor(radeon_connector_edid(connector))) {
                        if (connector->display_info.bpc)
                                bpc = connector->display_info.bpc;
                }
@@ -124,7 +124,7 @@ int radeon_get_monitor_bpc(struct drm_connector *connector)
                dig_connector = radeon_connector->con_priv;
                if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) ||
                    (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP) ||
-                   drm_detect_hdmi_monitor(radeon_connector->edid)) {
+                   drm_detect_hdmi_monitor(radeon_connector_edid(connector))) {
                        if (connector->display_info.bpc)
                                bpc = connector->display_info.bpc;
                }
@@ -148,7 +148,7 @@ int radeon_get_monitor_bpc(struct drm_connector *connector)
                break;
        }
 
-       if (drm_detect_hdmi_monitor(radeon_connector->edid)) {
+       if (drm_detect_hdmi_monitor(radeon_connector_edid(connector))) {
                /* hdmi deep color only implemented on DCE4+ */
                if ((bpc > 8) && !ASIC_IS_DCE4(rdev)) {
                        DRM_DEBUG("%s: HDMI deep color %d bpc unsupported. Using 8 bpc.\n",
@@ -197,10 +197,19 @@ int radeon_get_monitor_bpc(struct drm_connector *connector)
                                                  connector->name, bpc);
                        }
                }
+               else if (bpc > 8) {
+                       /* max_tmds_clock missing, but hdmi spec mandates it for deep color. */
+                       DRM_DEBUG("%s: Required max tmds clock for HDMI deep color missing. Using 8 bpc.\n",
+                                         connector->name);
+                       bpc = 8;
+               }
        }
 
-       if ((radeon_deep_color == 0) && (bpc > 8))
+       if ((radeon_deep_color == 0) && (bpc > 8)) {
+               DRM_DEBUG("%s: Deep color disabled. Set radeon module param deep_color=1 to enable.\n",
+                                 connector->name);
                bpc = 8;
+       }
 
        DRM_DEBUG("%s: Display bpc=%d, returned bpc=%d\n",
                          connector->name, connector->display_info.bpc, bpc);
@@ -216,7 +225,6 @@ radeon_connector_update_scratch_regs(struct drm_connector *connector, enum drm_c
        struct drm_encoder *best_encoder = NULL;
        struct drm_encoder *encoder = NULL;
        struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;
-       struct drm_mode_object *obj;
        bool connected;
        int i;
 
@@ -226,14 +234,11 @@ radeon_connector_update_scratch_regs(struct drm_connector *connector, enum drm_c
                if (connector->encoder_ids[i] == 0)
                        break;
 
-               obj = drm_mode_object_find(connector->dev,
-                                          connector->encoder_ids[i],
-                                          DRM_MODE_OBJECT_ENCODER);
-               if (!obj)
+               encoder = drm_encoder_find(connector->dev,
+                                          connector->encoder_ids[i]);
+               if (!encoder)
                        continue;
 
-               encoder = obj_to_encoder(obj);
-
                if ((encoder == best_encoder) && (status == connector_status_connected))
                        connected = true;
                else
@@ -249,7 +254,6 @@ radeon_connector_update_scratch_regs(struct drm_connector *connector, enum drm_c
 
 static struct drm_encoder *radeon_find_encoder(struct drm_connector *connector, int encoder_type)
 {
-       struct drm_mode_object *obj;
        struct drm_encoder *encoder;
        int i;
 
@@ -257,34 +261,134 @@ static struct drm_encoder *radeon_find_encoder(struct drm_connector *connector,
                if (connector->encoder_ids[i] == 0)
                        break;
 
-               obj = drm_mode_object_find(connector->dev, connector->encoder_ids[i], DRM_MODE_OBJECT_ENCODER);
-               if (!obj)
+               encoder = drm_encoder_find(connector->dev, connector->encoder_ids[i]);
+               if (!encoder)
                        continue;
 
-               encoder = obj_to_encoder(obj);
                if (encoder->encoder_type == encoder_type)
                        return encoder;
        }
        return NULL;
 }
 
+struct edid *radeon_connector_edid(struct drm_connector *connector)
+{
+       struct radeon_connector *radeon_connector = to_radeon_connector(connector);
+       struct drm_property_blob *edid_blob = connector->edid_blob_ptr;
+
+       if (radeon_connector->edid) {
+               return radeon_connector->edid;
+       } else if (edid_blob) {
+               struct edid *edid = kmemdup(edid_blob->data, edid_blob->length, GFP_KERNEL);
+               if (edid)
+                       radeon_connector->edid = edid;
+       }
+       return radeon_connector->edid;
+}
+
+static void radeon_connector_get_edid(struct drm_connector *connector)
+{
+       struct drm_device *dev = connector->dev;
+       struct radeon_device *rdev = dev->dev_private;
+       struct radeon_connector *radeon_connector = to_radeon_connector(connector);
+
+       if (radeon_connector->edid)
+               return;
+
+       /* on hw with routers, select right port */
+       if (radeon_connector->router.ddc_valid)
+               radeon_router_select_ddc_port(radeon_connector);
+
+       if ((radeon_connector_encoder_get_dp_bridge_encoder_id(connector) !=
+            ENCODER_OBJECT_ID_NONE) &&
+           radeon_connector->ddc_bus->has_aux) {
+               radeon_connector->edid = drm_get_edid(connector,
+                                                     &radeon_connector->ddc_bus->aux.ddc);
+       } else if ((connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) ||
+                  (connector->connector_type == DRM_MODE_CONNECTOR_eDP)) {
+               struct radeon_connector_atom_dig *dig = radeon_connector->con_priv;
+
+               if ((dig->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT ||
+                    dig->dp_sink_type == CONNECTOR_OBJECT_ID_eDP) &&
+                   radeon_connector->ddc_bus->has_aux)
+                       radeon_connector->edid = drm_get_edid(&radeon_connector->base,
+                                                             &radeon_connector->ddc_bus->aux.ddc);
+               else if (radeon_connector->ddc_bus)
+                       radeon_connector->edid = drm_get_edid(&radeon_connector->base,
+                                                             &radeon_connector->ddc_bus->adapter);
+       } else if (radeon_connector->ddc_bus) {
+               radeon_connector->edid = drm_get_edid(&radeon_connector->base,
+                                                     &radeon_connector->ddc_bus->adapter);
+       }
+
+       if (!radeon_connector->edid) {
+               if (rdev->is_atom_bios) {
+                       /* some laptops provide a hardcoded edid in rom for LCDs */
+                       if (((connector->connector_type == DRM_MODE_CONNECTOR_LVDS) ||
+                            (connector->connector_type == DRM_MODE_CONNECTOR_eDP)))
+                               radeon_connector->edid = radeon_bios_get_hardcoded_edid(rdev);
+               } else {
+                       /* some servers provide a hardcoded edid in rom for KVMs */
+                       radeon_connector->edid = radeon_bios_get_hardcoded_edid(rdev);
+               }
+       }
+}
+
+static void radeon_connector_free_edid(struct drm_connector *connector)
+{
+       struct radeon_connector *radeon_connector = to_radeon_connector(connector);
+
+       if (radeon_connector->edid) {
+               kfree(radeon_connector->edid);
+               radeon_connector->edid = NULL;
+       }
+}
+
+static int radeon_ddc_get_modes(struct drm_connector *connector)
+{
+       struct radeon_connector *radeon_connector = to_radeon_connector(connector);
+       int ret;
+
+       if (radeon_connector->edid) {
+               drm_mode_connector_update_edid_property(connector, radeon_connector->edid);
+               ret = drm_add_edid_modes(connector, radeon_connector->edid);
+               drm_edid_to_eld(connector, radeon_connector->edid);
+               return ret;
+       }
+       drm_mode_connector_update_edid_property(connector, NULL);
+       return 0;
+}
+
 static struct drm_encoder *radeon_best_single_encoder(struct drm_connector *connector)
 {
        int enc_id = connector->encoder_ids[0];
-       struct drm_mode_object *obj;
-       struct drm_encoder *encoder;
-
        /* pick the encoder ids */
-       if (enc_id) {
-               obj = drm_mode_object_find(connector->dev, enc_id, DRM_MODE_OBJECT_ENCODER);
-               if (!obj)
-                       return NULL;
-               encoder = obj_to_encoder(obj);
-               return encoder;
-       }
+       if (enc_id)
+               return drm_encoder_find(connector->dev, enc_id);
        return NULL;
 }
 
+static void radeon_get_native_mode(struct drm_connector *connector)
+{
+       struct drm_encoder *encoder = radeon_best_single_encoder(connector);
+       struct radeon_encoder *radeon_encoder;
+
+       if (encoder == NULL)
+               return;
+
+       radeon_encoder = to_radeon_encoder(encoder);
+
+       if (!list_empty(&connector->probed_modes)) {
+               struct drm_display_mode *preferred_mode =
+                       list_first_entry(&connector->probed_modes,
+                                        struct drm_display_mode, head);
+
+               radeon_encoder->native_mode = *preferred_mode;
+       } else {
+               radeon_encoder->native_mode.clock = 0;
+       }
+}
+
 /*
  * radeon_connector_analog_encoder_conflict_solve
  * - search for other connectors sharing this encoder
@@ -585,6 +689,35 @@ static int radeon_connector_set_property(struct drm_connector *connector, struct
                radeon_property_change_mode(&radeon_encoder->base);
        }
 
+       if (property == dev->mode_config.scaling_mode_property) {
+               enum radeon_rmx_type rmx_type;
+
+               if (connector->encoder)
+                       radeon_encoder = to_radeon_encoder(connector->encoder);
+               else {
+                       struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;
+                       radeon_encoder = to_radeon_encoder(connector_funcs->best_encoder(connector));
+               }
+
+               switch (val) {
+               default:
+               case DRM_MODE_SCALE_NONE: rmx_type = RMX_OFF; break;
+               case DRM_MODE_SCALE_CENTER: rmx_type = RMX_CENTER; break;
+               case DRM_MODE_SCALE_ASPECT: rmx_type = RMX_ASPECT; break;
+               case DRM_MODE_SCALE_FULLSCREEN: rmx_type = RMX_FULL; break;
+               }
+               if (radeon_encoder->rmx_type == rmx_type)
+                       return 0;
+
+               if ((rmx_type != DRM_MODE_SCALE_NONE) &&
+                   (radeon_encoder->native_mode.clock == 0))
+                       return 0;
+
+               radeon_encoder->rmx_type = rmx_type;
+
+               radeon_property_change_mode(&radeon_encoder->base);
+       }
+
        return 0;
 }
 
@@ -625,22 +758,20 @@ static void radeon_fixup_lvds_native_mode(struct drm_encoder *encoder,
 
 static int radeon_lvds_get_modes(struct drm_connector *connector)
 {
-       struct radeon_connector *radeon_connector = to_radeon_connector(connector);
        struct drm_encoder *encoder;
        int ret = 0;
        struct drm_display_mode *mode;
 
-       if (radeon_connector->ddc_bus) {
-               ret = radeon_ddc_get_modes(radeon_connector);
-               if (ret > 0) {
-                       encoder = radeon_best_single_encoder(connector);
-                       if (encoder) {
-                               radeon_fixup_lvds_native_mode(encoder, connector);
-                               /* add scaled modes */
-                               radeon_add_common_modes(encoder, connector);
-                       }
-                       return ret;
+       radeon_connector_get_edid(connector);
+       ret = radeon_ddc_get_modes(connector);
+       if (ret > 0) {
+               encoder = radeon_best_single_encoder(connector);
+               if (encoder) {
+                       radeon_fixup_lvds_native_mode(encoder, connector);
+                       /* add scaled modes */
+                       radeon_add_common_modes(encoder, connector);
                }
+               return ret;
        }
 
        encoder = radeon_best_single_encoder(connector);
@@ -715,16 +846,9 @@ radeon_lvds_detect(struct drm_connector *connector, bool force)
        }
 
        /* check for edid as well */
+       radeon_connector_get_edid(connector);
        if (radeon_connector->edid)
                ret = connector_status_connected;
-       else {
-               if (radeon_connector->ddc_bus) {
-                       radeon_connector->edid = drm_get_edid(&radeon_connector->base,
-                                                             &radeon_connector->ddc_bus->adapter);
-                       if (radeon_connector->edid)
-                               ret = connector_status_connected;
-               }
-       }
        /* check acpi lid status ??? */
 
        radeon_connector_update_scratch_regs(connector, ret);
@@ -737,10 +861,9 @@ static void radeon_connector_destroy(struct drm_connector *connector)
 {
        struct radeon_connector *radeon_connector = to_radeon_connector(connector);
 
-       if (radeon_connector->edid)
-               kfree(radeon_connector->edid);
+       radeon_connector_free_edid(connector);
        kfree(radeon_connector->con_priv);
-       drm_sysfs_connector_remove(connector);
+       drm_connector_unregister(connector);
        drm_connector_cleanup(connector);
        kfree(connector);
 }
@@ -797,10 +920,12 @@ static const struct drm_connector_funcs radeon_lvds_connector_funcs = {
 
 static int radeon_vga_get_modes(struct drm_connector *connector)
 {
-       struct radeon_connector *radeon_connector = to_radeon_connector(connector);
        int ret;
 
-       ret = radeon_ddc_get_modes(radeon_connector);
+       radeon_connector_get_edid(connector);
+       ret = radeon_ddc_get_modes(connector);
+
+       radeon_get_native_mode(connector);
 
        return ret;
 }
@@ -843,28 +968,26 @@ radeon_vga_detect(struct drm_connector *connector, bool force)
                dret = radeon_ddc_probe(radeon_connector, false);
        if (dret) {
                radeon_connector->detected_by_load = false;
-               if (radeon_connector->edid) {
-                       kfree(radeon_connector->edid);
-                       radeon_connector->edid = NULL;
-               }
-               radeon_connector->edid = drm_get_edid(&radeon_connector->base, &radeon_connector->ddc_bus->adapter);
+               radeon_connector_free_edid(connector);
+               radeon_connector_get_edid(connector);
 
                if (!radeon_connector->edid) {
                        DRM_ERROR("%s: probed a monitor but no|invalid EDID\n",
                                        connector->name);
                        ret = connector_status_connected;
                } else {
-                       radeon_connector->use_digital = !!(radeon_connector->edid->input & DRM_EDID_INPUT_DIGITAL);
+                       radeon_connector->use_digital =
+                               !!(radeon_connector->edid->input & DRM_EDID_INPUT_DIGITAL);
 
                        /* some oems have boards with separate digital and analog connectors
                         * with a shared ddc line (often vga + hdmi)
                         */
                        if (radeon_connector->use_digital && radeon_connector->shared_ddc) {
-                               kfree(radeon_connector->edid);
-                               radeon_connector->edid = NULL;
+                               radeon_connector_free_edid(connector);
                                ret = connector_status_disconnected;
-                       } else
+                       } else {
                                ret = connector_status_connected;
+                       }
                }
        } else {
 
@@ -999,15 +1122,6 @@ static const struct drm_connector_funcs radeon_tv_connector_funcs = {
        .set_property = radeon_connector_set_property,
 };
 
-static int radeon_dvi_get_modes(struct drm_connector *connector)
-{
-       struct radeon_connector *radeon_connector = to_radeon_connector(connector);
-       int ret;
-
-       ret = radeon_ddc_get_modes(radeon_connector);
-       return ret;
-}
-
 static bool radeon_check_hpd_status_unchanged(struct drm_connector *connector)
 {
        struct drm_device *dev = connector->dev;
@@ -1048,7 +1162,6 @@ radeon_dvi_detect(struct drm_connector *connector, bool force)
        struct radeon_connector *radeon_connector = to_radeon_connector(connector);
        struct drm_encoder *encoder = NULL;
        struct drm_encoder_helper_funcs *encoder_funcs;
-       struct drm_mode_object *obj;
        int i, r;
        enum drm_connector_status ret = connector_status_disconnected;
        bool dret = false, broken_edid = false;
@@ -1066,18 +1179,16 @@ radeon_dvi_detect(struct drm_connector *connector, bool force)
                dret = radeon_ddc_probe(radeon_connector, false);
        if (dret) {
                radeon_connector->detected_by_load = false;
-               if (radeon_connector->edid) {
-                       kfree(radeon_connector->edid);
-                       radeon_connector->edid = NULL;
-               }
-               radeon_connector->edid = drm_get_edid(&radeon_connector->base, &radeon_connector->ddc_bus->adapter);
+               radeon_connector_free_edid(connector);
+               radeon_connector_get_edid(connector);
 
                if (!radeon_connector->edid) {
                        DRM_ERROR("%s: probed a monitor but no|invalid EDID\n",
                                        connector->name);
                        /* rs690 seems to have a problem with connectors not existing and always
                         * return a block of 0's. If we see this just stop polling on this output */
-                       if ((rdev->family == CHIP_RS690 || rdev->family == CHIP_RS740) && radeon_connector->base.null_edid_counter) {
+                       if ((rdev->family == CHIP_RS690 || rdev->family == CHIP_RS740) &&
+                           radeon_connector->base.null_edid_counter) {
                                ret = connector_status_disconnected;
                                DRM_ERROR("%s: detected RS690 floating bus bug, stopping ddc detect\n",
                                          connector->name);
@@ -1087,18 +1198,18 @@ radeon_dvi_detect(struct drm_connector *connector, bool force)
                                broken_edid = true; /* defer use_digital to later */
                        }
                } else {
-                       radeon_connector->use_digital = !!(radeon_connector->edid->input & DRM_EDID_INPUT_DIGITAL);
+                       radeon_connector->use_digital =
+                               !!(radeon_connector->edid->input & DRM_EDID_INPUT_DIGITAL);
 
                        /* some oems have boards with separate digital and analog connectors
                         * with a shared ddc line (often vga + hdmi)
                         */
                        if ((!radeon_connector->use_digital) && radeon_connector->shared_ddc) {
-                               kfree(radeon_connector->edid);
-                               radeon_connector->edid = NULL;
+                               radeon_connector_free_edid(connector);
                                ret = connector_status_disconnected;
-                       } else
+                       } else {
                                ret = connector_status_connected;
-
+                       }
                        /* This gets complicated.  We have boards with VGA + HDMI with a
                         * shared DDC line and we have boards with DVI-D + HDMI with a shared
                         * DDC line.  The latter is more complex because with DVI<->HDMI adapters
@@ -1118,8 +1229,7 @@ radeon_dvi_detect(struct drm_connector *connector, bool force)
                                                if (list_connector->connector_type != DRM_MODE_CONNECTOR_VGA) {
                                                        /* hpd is our only option in this case */
                                                        if (!radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) {
-                                                               kfree(radeon_connector->edid);
-                                                               radeon_connector->edid = NULL;
+                                                               radeon_connector_free_edid(connector);
                                                                ret = connector_status_disconnected;
                                                        }
                                                }
@@ -1153,14 +1263,11 @@ radeon_dvi_detect(struct drm_connector *connector, bool force)
                        if (connector->encoder_ids[i] == 0)
                                break;
 
-                       obj = drm_mode_object_find(connector->dev,
-                                                  connector->encoder_ids[i],
-                                                  DRM_MODE_OBJECT_ENCODER);
-                       if (!obj)
+                       encoder = drm_encoder_find(connector->dev,
+                                                  connector->encoder_ids[i]);
+                       if (!encoder)
                                continue;
 
-                       encoder = obj_to_encoder(obj);
-
                        if (encoder->encoder_type != DRM_MODE_ENCODER_DAC &&
                            encoder->encoder_type != DRM_MODE_ENCODER_TVDAC)
                                continue;
@@ -1225,19 +1332,16 @@ static struct drm_encoder *radeon_dvi_encoder(struct drm_connector *connector)
 {
        int enc_id = connector->encoder_ids[0];
        struct radeon_connector *radeon_connector = to_radeon_connector(connector);
-       struct drm_mode_object *obj;
        struct drm_encoder *encoder;
        int i;
        for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
                if (connector->encoder_ids[i] == 0)
                        break;
 
-               obj = drm_mode_object_find(connector->dev, connector->encoder_ids[i], DRM_MODE_OBJECT_ENCODER);
-               if (!obj)
+               encoder = drm_encoder_find(connector->dev, connector->encoder_ids[i]);
+               if (!encoder)
                        continue;
 
-               encoder = obj_to_encoder(obj);
-
                if (radeon_connector->use_digital == true) {
                        if (encoder->encoder_type == DRM_MODE_ENCODER_TMDS)
                                return encoder;
@@ -1252,13 +1356,8 @@ static struct drm_encoder *radeon_dvi_encoder(struct drm_connector *connector)
 
        /* then check use digitial */
        /* pick the first one */
-       if (enc_id) {
-               obj = drm_mode_object_find(connector->dev, enc_id, DRM_MODE_OBJECT_ENCODER);
-               if (!obj)
-                       return NULL;
-               encoder = obj_to_encoder(obj);
-               return encoder;
-       }
+       if (enc_id)
+               return drm_encoder_find(connector->dev, enc_id);
        return NULL;
 }
 
@@ -1291,7 +1390,7 @@ static int radeon_dvi_mode_valid(struct drm_connector *connector,
                    (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D) ||
                    (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_B))
                        return MODE_OK;
-               else if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector->edid)) {
+               else if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector_edid(connector))) {
                        /* HDMI 1.3+ supports max clock of 340 Mhz */
                        if (mode->clock > 340000)
                                return MODE_CLOCK_HIGH;
@@ -1310,7 +1409,7 @@ static int radeon_dvi_mode_valid(struct drm_connector *connector,
 }
 
 static const struct drm_connector_helper_funcs radeon_dvi_connector_helper_funcs = {
-       .get_modes = radeon_dvi_get_modes,
+       .get_modes = radeon_vga_get_modes,
        .mode_valid = radeon_dvi_mode_valid,
        .best_encoder = radeon_dvi_encoder,
 };
@@ -1339,7 +1438,8 @@ static int radeon_dp_get_modes(struct drm_connector *connector)
                        if (!radeon_dig_connector->edp_on)
                                atombios_set_edp_panel_power(connector,
                                                             ATOM_TRANSMITTER_ACTION_POWER_ON);
-                       ret = radeon_ddc_get_modes(radeon_connector);
+                       radeon_connector_get_edid(connector);
+                       ret = radeon_ddc_get_modes(connector);
                        if (!radeon_dig_connector->edp_on)
                                atombios_set_edp_panel_power(connector,
                                                             ATOM_TRANSMITTER_ACTION_POWER_OFF);
@@ -1350,7 +1450,8 @@ static int radeon_dp_get_modes(struct drm_connector *connector)
                                if (encoder)
                                        radeon_atom_ext_encoder_setup_ddc(encoder);
                        }
-                       ret = radeon_ddc_get_modes(radeon_connector);
+                       radeon_connector_get_edid(connector);
+                       ret = radeon_ddc_get_modes(connector);
                }
 
                if (ret > 0) {
@@ -1383,7 +1484,10 @@ static int radeon_dp_get_modes(struct drm_connector *connector)
                        if (encoder)
                                radeon_atom_ext_encoder_setup_ddc(encoder);
                }
-               ret = radeon_ddc_get_modes(radeon_connector);
+               radeon_connector_get_edid(connector);
+               ret = radeon_ddc_get_modes(connector);
+
+               radeon_get_native_mode(connector);
        }
 
        return ret;
@@ -1391,7 +1495,6 @@ static int radeon_dp_get_modes(struct drm_connector *connector)
 
 u16 radeon_connector_encoder_get_dp_bridge_encoder_id(struct drm_connector *connector)
 {
-       struct drm_mode_object *obj;
        struct drm_encoder *encoder;
        struct radeon_encoder *radeon_encoder;
        int i;
@@ -1400,11 +1503,10 @@ u16 radeon_connector_encoder_get_dp_bridge_encoder_id(struct drm_connector *conn
                if (connector->encoder_ids[i] == 0)
                        break;
 
-               obj = drm_mode_object_find(connector->dev, connector->encoder_ids[i], DRM_MODE_OBJECT_ENCODER);
-               if (!obj)
+               encoder = drm_encoder_find(connector->dev, connector->encoder_ids[i]);
+               if (!encoder)
                        continue;
 
-               encoder = obj_to_encoder(obj);
                radeon_encoder = to_radeon_encoder(encoder);
 
                switch (radeon_encoder->encoder_id) {
@@ -1419,9 +1521,8 @@ u16 radeon_connector_encoder_get_dp_bridge_encoder_id(struct drm_connector *conn
        return ENCODER_OBJECT_ID_NONE;
 }
 
-bool radeon_connector_encoder_is_hbr2(struct drm_connector *connector)
+static bool radeon_connector_encoder_is_hbr2(struct drm_connector *connector)
 {
-       struct drm_mode_object *obj;
        struct drm_encoder *encoder;
        struct radeon_encoder *radeon_encoder;
        int i;
@@ -1431,11 +1532,10 @@ bool radeon_connector_encoder_is_hbr2(struct drm_connector *connector)
                if (connector->encoder_ids[i] == 0)
                        break;
 
-               obj = drm_mode_object_find(connector->dev, connector->encoder_ids[i], DRM_MODE_OBJECT_ENCODER);
-               if (!obj)
+               encoder = drm_encoder_find(connector->dev, connector->encoder_ids[i]);
+               if (!encoder)
                        continue;
 
-               encoder = obj_to_encoder(obj);
                radeon_encoder = to_radeon_encoder(encoder);
                if (radeon_encoder->caps & ATOM_ENCODER_CAP_RECORD_HBR2)
                        found = true;
@@ -1478,10 +1578,7 @@ radeon_dp_detect(struct drm_connector *connector, bool force)
                goto out;
        }
 
-       if (radeon_connector->edid) {
-               kfree(radeon_connector->edid);
-               radeon_connector->edid = NULL;
-       }
+       radeon_connector_free_edid(connector);
 
        if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) ||
            (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) {
@@ -1587,7 +1684,7 @@ static int radeon_dp_mode_valid(struct drm_connector *connector,
                    (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) {
                        return radeon_dp_mode_valid_helper(connector, mode);
                } else {
-                       if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector->edid)) {
+                       if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector_edid(connector))) {
                                /* HDMI 1.3+ supports max clock of 340 Mhz */
                                if (mode->clock > 340000)
                                        return MODE_CLOCK_HIGH;
@@ -1747,6 +1844,9 @@ radeon_add_atom_connector(struct drm_device *dev,
                        drm_object_attach_property(&radeon_connector->base.base,
                                                      rdev->mode_info.load_detect_property,
                                                      1);
+                       drm_object_attach_property(&radeon_connector->base.base,
+                                                  dev->mode_config.scaling_mode_property,
+                                                  DRM_MODE_SCALE_NONE);
                        break;
                case DRM_MODE_CONNECTOR_DVII:
                case DRM_MODE_CONNECTOR_DVID:
@@ -1767,6 +1867,10 @@ radeon_add_atom_connector(struct drm_device *dev,
                                                      rdev->mode_info.underscan_vborder_property,
                                                      0);
 
+                       drm_object_attach_property(&radeon_connector->base.base,
+                                                     dev->mode_config.scaling_mode_property,
+                                                     DRM_MODE_SCALE_NONE);
+
                        drm_object_attach_property(&radeon_connector->base.base,
                                                   rdev->mode_info.dither_property,
                                                   RADEON_FMT_DITHER_DISABLE);
@@ -1817,6 +1921,10 @@ radeon_add_atom_connector(struct drm_device *dev,
                        drm_object_attach_property(&radeon_connector->base.base,
                                                      rdev->mode_info.load_detect_property,
                                                      1);
+                       if (ASIC_IS_AVIVO(rdev))
+                               drm_object_attach_property(&radeon_connector->base.base,
+                                                          dev->mode_config.scaling_mode_property,
+                                                          DRM_MODE_SCALE_NONE);
                        /* no HPD on analog connectors */
                        radeon_connector->hpd.hpd = RADEON_HPD_NONE;
                        connector->polled = DRM_CONNECTOR_POLL_CONNECT;
@@ -1835,6 +1943,10 @@ radeon_add_atom_connector(struct drm_device *dev,
                        drm_object_attach_property(&radeon_connector->base.base,
                                                      rdev->mode_info.load_detect_property,
                                                      1);
+                       if (ASIC_IS_AVIVO(rdev))
+                               drm_object_attach_property(&radeon_connector->base.base,
+                                                          dev->mode_config.scaling_mode_property,
+                                                          DRM_MODE_SCALE_NONE);
                        /* no HPD on analog connectors */
                        radeon_connector->hpd.hpd = RADEON_HPD_NONE;
                        connector->interlace_allowed = true;
@@ -1868,17 +1980,18 @@ radeon_add_atom_connector(struct drm_device *dev,
                                drm_object_attach_property(&radeon_connector->base.base,
                                                              rdev->mode_info.underscan_vborder_property,
                                                              0);
+                               drm_object_attach_property(&radeon_connector->base.base,
+                                                          rdev->mode_info.dither_property,
+                                                          RADEON_FMT_DITHER_DISABLE);
+                               drm_object_attach_property(&radeon_connector->base.base,
+                                                          dev->mode_config.scaling_mode_property,
+                                                          DRM_MODE_SCALE_NONE);
                        }
                        if (ASIC_IS_DCE2(rdev) && (radeon_audio != 0)) {
                                drm_object_attach_property(&radeon_connector->base.base,
                                                           rdev->mode_info.audio_property,
                                                           RADEON_AUDIO_AUTO);
                        }
-                       if (ASIC_IS_AVIVO(rdev)) {
-                               drm_object_attach_property(&radeon_connector->base.base,
-                                                          rdev->mode_info.dither_property,
-                                                          RADEON_FMT_DITHER_DISABLE);
-                       }
                        if (connector_type == DRM_MODE_CONNECTOR_DVII) {
                                radeon_connector->dac_load_detect = true;
                                drm_object_attach_property(&radeon_connector->base.base,
@@ -1918,17 +2031,18 @@ radeon_add_atom_connector(struct drm_device *dev,
                                drm_object_attach_property(&radeon_connector->base.base,
                                                              rdev->mode_info.underscan_vborder_property,
                                                              0);
+                               drm_object_attach_property(&radeon_connector->base.base,
+                                                          rdev->mode_info.dither_property,
+                                                          RADEON_FMT_DITHER_DISABLE);
+                               drm_object_attach_property(&radeon_connector->base.base,
+                                                          dev->mode_config.scaling_mode_property,
+                                                          DRM_MODE_SCALE_NONE);
                        }
                        if (ASIC_IS_DCE2(rdev) && (radeon_audio != 0)) {
                                drm_object_attach_property(&radeon_connector->base.base,
                                                           rdev->mode_info.audio_property,
                                                           RADEON_AUDIO_AUTO);
                        }
-                       if (ASIC_IS_AVIVO(rdev)) {
-                               drm_object_attach_property(&radeon_connector->base.base,
-                                                          rdev->mode_info.dither_property,
-                                                          RADEON_FMT_DITHER_DISABLE);
-                       }
                        subpixel_order = SubPixelHorizontalRGB;
                        connector->interlace_allowed = true;
                        if (connector_type == DRM_MODE_CONNECTOR_HDMIB)
@@ -1965,18 +2079,18 @@ radeon_add_atom_connector(struct drm_device *dev,
                                drm_object_attach_property(&radeon_connector->base.base,
                                                              rdev->mode_info.underscan_vborder_property,
                                                              0);
+                               drm_object_attach_property(&radeon_connector->base.base,
+                                                          rdev->mode_info.dither_property,
+                                                          RADEON_FMT_DITHER_DISABLE);
+                               drm_object_attach_property(&radeon_connector->base.base,
+                                                          dev->mode_config.scaling_mode_property,
+                                                          DRM_MODE_SCALE_NONE);
                        }
                        if (ASIC_IS_DCE2(rdev) && (radeon_audio != 0)) {
                                drm_object_attach_property(&radeon_connector->base.base,
                                                           rdev->mode_info.audio_property,
                                                           RADEON_AUDIO_AUTO);
                        }
-                       if (ASIC_IS_AVIVO(rdev)) {
-                               drm_object_attach_property(&radeon_connector->base.base,
-                                                          rdev->mode_info.dither_property,
-                                                          RADEON_FMT_DITHER_DISABLE);
-
-                       }
                        connector->interlace_allowed = true;
                        /* in theory with a DP to VGA converter... */
                        connector->doublescan_allowed = false;
@@ -2050,7 +2164,7 @@ radeon_add_atom_connector(struct drm_device *dev,
                connector->polled = DRM_CONNECTOR_POLL_HPD;
 
        connector->display_info.subpixel_order = subpixel_order;
-       drm_sysfs_connector_add(connector);
+       drm_connector_register(connector);
 
        if (has_aux)
                radeon_dp_aux_init(radeon_connector);
@@ -2211,5 +2325,5 @@ radeon_add_legacy_connector(struct drm_device *dev,
        } else
                connector->polled = DRM_CONNECTOR_POLL_HPD;
        connector->display_info.subpixel_order = subpixel_order;
-       drm_sysfs_connector_add(connector);
+       drm_connector_register(connector);
 }
index ae763f60c8a0a23f551bffb5119770d94527931a..ee712c199b2573f5978e1a254094e35f11090af0 100644 (file)
@@ -500,7 +500,8 @@ static int radeon_bo_vm_update_pte(struct radeon_cs_parser *p,
                if (r)
                        return r;
        }
-       return 0;
+
+       return radeon_vm_clear_invalids(rdev, vm);
 }
 
 static int radeon_cs_ib_vm_chunk(struct radeon_device *rdev,
index 697add2cd4e34e89b6276659142f476ccf0c1e64..c8ea050c8fa463b8ae5fa6768a5cf67cc924f119 100644 (file)
@@ -103,6 +103,31 @@ static const char radeon_family_name[][16] = {
        "LAST",
 };
 
+#define RADEON_PX_QUIRK_DISABLE_PX  (1 << 0)
+#define RADEON_PX_QUIRK_LONG_WAKEUP (1 << 1)
+
+struct radeon_px_quirk {
+       u32 chip_vendor;
+       u32 chip_device;
+       u32 subsys_vendor;
+       u32 subsys_device;
+       u32 px_quirk_flags;
+};
+
+static struct radeon_px_quirk radeon_px_quirk_list[] = {
+       /* Acer aspire 5560g (CPU: AMD A4-3305M; GPU: AMD Radeon HD 6480g + 7470m)
+        * https://bugzilla.kernel.org/show_bug.cgi?id=74551
+        */
+       { PCI_VENDOR_ID_ATI, 0x6760, 0x1025, 0x0672, RADEON_PX_QUIRK_DISABLE_PX },
+       /* Asus K73TA laptop with AMD A6-3400M APU and Radeon 6550 GPU
+        * https://bugzilla.kernel.org/show_bug.cgi?id=51381
+        */
+       { PCI_VENDOR_ID_ATI, 0x6741, 0x1043, 0x108c, RADEON_PX_QUIRK_DISABLE_PX },
+       /* macbook pro 8.2 */
+       { PCI_VENDOR_ID_ATI, 0x6741, PCI_VENDOR_ID_APPLE, 0x00e2, RADEON_PX_QUIRK_LONG_WAKEUP },
+       { 0, 0, 0, 0, 0 },
+};
+
 bool radeon_is_px(struct drm_device *dev)
 {
        struct radeon_device *rdev = dev->dev_private;
@@ -112,6 +137,26 @@ bool radeon_is_px(struct drm_device *dev)
        return false;
 }
 
+static void radeon_device_handle_px_quirks(struct radeon_device *rdev)
+{
+       struct radeon_px_quirk *p = radeon_px_quirk_list;
+
+       /* Apply PX quirks */
+       while (p && p->chip_device != 0) {
+               if (rdev->pdev->vendor == p->chip_vendor &&
+                   rdev->pdev->device == p->chip_device &&
+                   rdev->pdev->subsystem_vendor == p->subsys_vendor &&
+                   rdev->pdev->subsystem_device == p->subsys_device) {
+                       rdev->px_quirk_flags = p->px_quirk_flags;
+                       break;
+               }
+               ++p;
+       }
+
+       if (rdev->px_quirk_flags & RADEON_PX_QUIRK_DISABLE_PX)
+               rdev->flags &= ~RADEON_IS_PX;
+}
+
 /**
  * radeon_program_register_sequence - program an array of registers.
  *
@@ -385,7 +430,8 @@ int radeon_wb_init(struct radeon_device *rdev)
 
        if (rdev->wb.wb_obj == NULL) {
                r = radeon_bo_create(rdev, RADEON_GPU_PAGE_SIZE, PAGE_SIZE, true,
-                                    RADEON_GEM_DOMAIN_GTT, NULL, &rdev->wb.wb_obj);
+                                    RADEON_GEM_DOMAIN_GTT, 0, NULL,
+                                    &rdev->wb.wb_obj);
                if (r) {
                        dev_warn(rdev->dev, "(%d) create WB bo failed\n", r);
                        return r;
@@ -1077,7 +1123,19 @@ static void radeon_check_arguments(struct radeon_device *rdev)
        /* defines number of bits in page table versus page directory,
         * a page is 4KB so we have 12 bits offset, minimum 9 bits in the
         * page table and the remaining bits are in the page directory */
-       if (radeon_vm_block_size < 9) {
+       if (radeon_vm_block_size == -1) {
+
+               /* Total bits covered by PD + PTs */
+               unsigned bits = ilog2(radeon_vm_size) + 17;
+
+               /* Make sure the PD is 4K in size up to 8GB address space.
+                  Above that split equal between PD and PTs */
+               if (radeon_vm_size <= 8)
+                       radeon_vm_block_size = bits - 9;
+               else
+                       radeon_vm_block_size = (bits + 3) / 2;
+
+       } else if (radeon_vm_block_size < 9) {
                dev_warn(rdev->dev, "VM page table size (%d) too small\n",
                         radeon_vm_block_size);
                radeon_vm_block_size = 9;
@@ -1091,25 +1149,6 @@ static void radeon_check_arguments(struct radeon_device *rdev)
        }
 }
 
-/**
- * radeon_switcheroo_quirk_long_wakeup - return true if longer d3 delay is
- * needed for waking up.
- *
- * @pdev: pci dev pointer
- */
-static bool radeon_switcheroo_quirk_long_wakeup(struct pci_dev *pdev)
-{
-
-       /* 6600m in a macbook pro */
-       if (pdev->subsystem_vendor == PCI_VENDOR_ID_APPLE &&
-           pdev->subsystem_device == 0x00e2) {
-               printk(KERN_INFO "radeon: quirking longer d3 wakeup delay\n");
-               return true;
-       }
-
-       return false;
-}
-
 /**
  * radeon_switcheroo_set_state - set switcheroo state
  *
@@ -1122,6 +1161,7 @@ static bool radeon_switcheroo_quirk_long_wakeup(struct pci_dev *pdev)
 static void radeon_switcheroo_set_state(struct pci_dev *pdev, enum vga_switcheroo_state state)
 {
        struct drm_device *dev = pci_get_drvdata(pdev);
+       struct radeon_device *rdev = dev->dev_private;
 
        if (radeon_is_px(dev) && state == VGA_SWITCHEROO_OFF)
                return;
@@ -1133,7 +1173,7 @@ static void radeon_switcheroo_set_state(struct pci_dev *pdev, enum vga_switchero
                /* don't suspend or resume card normally */
                dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
 
-               if (d3_delay < 20 && radeon_switcheroo_quirk_long_wakeup(pdev))
+               if (d3_delay < 20 && (rdev->px_quirk_flags & RADEON_PX_QUIRK_LONG_WAKEUP))
                        dev->pdev->d3_delay = 20;
 
                radeon_resume_kms(dev, true, true);
@@ -1337,6 +1377,9 @@ int radeon_device_init(struct radeon_device *rdev,
        if (rdev->rio_mem == NULL)
                DRM_ERROR("Unable to find PCI I/O BAR\n");
 
+       if (rdev->flags & RADEON_IS_PX)
+               radeon_device_handle_px_quirks(rdev);
+
        /* if we have > 1 VGA cards, then disable the radeon VGA resources */
        /* this will fail for cards that aren't VGA class devices, just
         * ignore it */
index bf25061c8ac4ee37b0f1c72b003427eb551dca22..3fdf87318069f1a6b26e1e37f9fd504641b19132 100644 (file)
@@ -293,6 +293,18 @@ void radeon_crtc_handle_vblank(struct radeon_device *rdev, int crtc_id)
        if (radeon_crtc == NULL)
                return;
 
+       /* Skip the pageflip completion check below (based on polling) on
+        * asics which reliably support hw pageflip completion irqs. pflip
+        * irqs are a reliable and race-free method of handling pageflip
+        * completion detection. A use_pflipirq module parameter < 2 allows
+        * to override this in case of asics with faulty pflip irqs.
+        * A module parameter of 0 would only use this polling based path,
+        * a parameter of 1 would use pflip irq only as a backup to this
+        * path, as in Linux 3.16.
+        */
+       if ((radeon_use_pflipirq == 2) && ASIC_IS_DCE4(rdev))
+               return;
+
        spin_lock_irqsave(&rdev->ddev->event_lock, flags);
        if (radeon_crtc->flip_status != RADEON_FLIP_SUBMITTED) {
                DRM_DEBUG_DRIVER("radeon_crtc->flip_status = %d != "
@@ -823,64 +835,6 @@ static bool radeon_setup_enc_conn(struct drm_device *dev)
        return ret;
 }
 
-int radeon_ddc_get_modes(struct radeon_connector *radeon_connector)
-{
-       struct drm_device *dev = radeon_connector->base.dev;
-       struct radeon_device *rdev = dev->dev_private;
-       int ret = 0;
-
-       /* don't leak the edid if we already fetched it in detect() */
-       if (radeon_connector->edid)
-               goto got_edid;
-
-       /* on hw with routers, select right port */
-       if (radeon_connector->router.ddc_valid)
-               radeon_router_select_ddc_port(radeon_connector);
-
-       if (radeon_connector_encoder_get_dp_bridge_encoder_id(&radeon_connector->base) !=
-           ENCODER_OBJECT_ID_NONE) {
-               if (radeon_connector->ddc_bus->has_aux)
-                       radeon_connector->edid = drm_get_edid(&radeon_connector->base,
-                                                             &radeon_connector->ddc_bus->aux.ddc);
-       } else if ((radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_DisplayPort) ||
-                  (radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_eDP)) {
-               struct radeon_connector_atom_dig *dig = radeon_connector->con_priv;
-
-               if ((dig->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT ||
-                    dig->dp_sink_type == CONNECTOR_OBJECT_ID_eDP) &&
-                   radeon_connector->ddc_bus->has_aux)
-                       radeon_connector->edid = drm_get_edid(&radeon_connector->base,
-                                                             &radeon_connector->ddc_bus->aux.ddc);
-               else if (radeon_connector->ddc_bus && !radeon_connector->edid)
-                       radeon_connector->edid = drm_get_edid(&radeon_connector->base,
-                                                             &radeon_connector->ddc_bus->adapter);
-       } else {
-               if (radeon_connector->ddc_bus && !radeon_connector->edid)
-                       radeon_connector->edid = drm_get_edid(&radeon_connector->base,
-                                                             &radeon_connector->ddc_bus->adapter);
-       }
-
-       if (!radeon_connector->edid) {
-               if (rdev->is_atom_bios) {
-                       /* some laptops provide a hardcoded edid in rom for LCDs */
-                       if (((radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_LVDS) ||
-                            (radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_eDP)))
-                               radeon_connector->edid = radeon_bios_get_hardcoded_edid(rdev);
-               } else
-                       /* some servers provide a hardcoded edid in rom for KVMs */
-                       radeon_connector->edid = radeon_bios_get_hardcoded_edid(rdev);
-       }
-       if (radeon_connector->edid) {
-got_edid:
-               drm_mode_connector_update_edid_property(&radeon_connector->base, radeon_connector->edid);
-               ret = drm_add_edid_modes(&radeon_connector->base, radeon_connector->edid);
-               drm_edid_to_eld(&radeon_connector->base, radeon_connector->edid);
-               return ret;
-       }
-       drm_mode_connector_update_edid_property(&radeon_connector->base, NULL);
-       return 0;
-}
-
 /* avivo */
 
 /**
@@ -1749,7 +1703,7 @@ bool radeon_crtc_scaling_mode_fixup(struct drm_crtc *crtc,
                            (!(mode->flags & DRM_MODE_FLAG_INTERLACE)) &&
                            ((radeon_encoder->underscan_type == UNDERSCAN_ON) ||
                             ((radeon_encoder->underscan_type == UNDERSCAN_AUTO) &&
-                             drm_detect_hdmi_monitor(radeon_connector->edid) &&
+                             drm_detect_hdmi_monitor(radeon_connector_edid(connector)) &&
                              is_hdtv_mode(mode)))) {
                                if (radeon_encoder->underscan_hborder != 0)
                                        radeon_crtc->h_border = radeon_encoder->underscan_hborder;
index 959f0866d9935f8a2a9c141684fb4ef35e79e946..092d067f93e16534aca712779ce2aa5705069395 100644 (file)
  *   2.38.0 - RADEON_GEM_OP (GET_INITIAL_DOMAIN, SET_INITIAL_DOMAIN),
  *            CIK: 1D and linear tiling modes contain valid PIPE_CONFIG
  *   2.39.0 - Add INFO query for number of active CUs
+ *   2.40.0 - Add RADEON_GEM_GTT_WC/UC, flush HDP cache before submitting
+ *            CS to GPU
  */
 #define KMS_DRIVER_MAJOR       2
-#define KMS_DRIVER_MINOR       39
+#define KMS_DRIVER_MINOR       40
 #define KMS_DRIVER_PATCHLEVEL  0
 int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags);
 int radeon_driver_unload_kms(struct drm_device *dev);
@@ -174,9 +176,10 @@ int radeon_dpm = -1;
 int radeon_aspm = -1;
 int radeon_runtime_pm = -1;
 int radeon_hard_reset = 0;
-int radeon_vm_size = 4;
-int radeon_vm_block_size = 9;
+int radeon_vm_size = 8;
+int radeon_vm_block_size = -1;
 int radeon_deep_color = 0;
+int radeon_use_pflipirq = 2;
 
 MODULE_PARM_DESC(no_wb, "Disable AGP writeback for scratch registers");
 module_param_named(no_wb, radeon_no_wb, int, 0444);
@@ -247,12 +250,15 @@ module_param_named(hard_reset, radeon_hard_reset, int, 0444);
 MODULE_PARM_DESC(vm_size, "VM address space size in gigabytes (default 4GB)");
 module_param_named(vm_size, radeon_vm_size, int, 0444);
 
-MODULE_PARM_DESC(vm_block_size, "VM page table size in bits (default 9)");
+MODULE_PARM_DESC(vm_block_size, "VM page table size in bits (default depending on vm_size)");
 module_param_named(vm_block_size, radeon_vm_block_size, int, 0444);
 
 MODULE_PARM_DESC(deep_color, "Deep Color support (1 = enable, 0 = disable (default))");
 module_param_named(deep_color, radeon_deep_color, int, 0444);
 
+MODULE_PARM_DESC(use_pflipirq, "Pflip irqs for pageflip completion (0 = disable, 1 = as fallback, 2 = exclusive (default))");
+module_param_named(use_pflipirq, radeon_use_pflipirq, int, 0444);
+
 static struct pci_device_id pciidlist[] = {
        radeon_PCI_IDS
 };
index bd4959ca23aa1a451703ce89ab0bf9a812b87fab..3c2094c25b537516a8b181e26fd2bca00dca0411 100644 (file)
@@ -343,7 +343,7 @@ bool radeon_dig_monitor_is_duallink(struct drm_encoder *encoder,
        case DRM_MODE_CONNECTOR_HDMIB:
                if (radeon_connector->use_digital) {
                        /* HDMI 1.3 supports up to 340 Mhz over single link */
-                       if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector->edid)) {
+                       if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector_edid(connector))) {
                                if (pixel_clock > 340000)
                                        return true;
                                else
@@ -365,7 +365,7 @@ bool radeon_dig_monitor_is_duallink(struct drm_encoder *encoder,
                        return false;
                else {
                        /* HDMI 1.3 supports up to 340 Mhz over single link */
-                       if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector->edid)) {
+                       if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector_edid(connector))) {
                                if (pixel_clock > 340000)
                                        return true;
                                else
index 665ced3b7313b94a9c42e3f7cf8c0922ed7b1031..94b0f2aa3d7c870b41bdf28be5d7bca5fecf4ff2 100644 (file)
@@ -127,8 +127,7 @@ static int radeonfb_create_pinned_object(struct radeon_fbdev *rfbdev,
        aligned_size = ALIGN(size, PAGE_SIZE);
        ret = radeon_gem_object_create(rdev, aligned_size, 0,
                                       RADEON_GEM_DOMAIN_VRAM,
-                                      false, true,
-                                      &gobj);
+                                      0, true, &gobj);
        if (ret) {
                printk(KERN_ERR "failed to allocate framebuffer (%d)\n",
                       aligned_size);
@@ -331,7 +330,7 @@ static int radeon_fbdev_destroy(struct drm_device *dev, struct radeon_fbdev *rfb
        return 0;
 }
 
-static struct drm_fb_helper_funcs radeon_fb_helper_funcs = {
+static const struct drm_fb_helper_funcs radeon_fb_helper_funcs = {
        .gamma_set = radeon_crtc_fb_gamma_set,
        .gamma_get = radeon_crtc_fb_gamma_get,
        .fb_probe = radeonfb_create,
@@ -353,7 +352,9 @@ int radeon_fbdev_init(struct radeon_device *rdev)
 
        rfbdev->rdev = rdev;
        rdev->mode_info.rfbdev = rfbdev;
-       rfbdev->helper.funcs = &radeon_fb_helper_funcs;
+
+       drm_fb_helper_prepare(rdev->ddev, &rfbdev->helper,
+                             &radeon_fb_helper_funcs);
 
        ret = drm_fb_helper_init(rdev->ddev, &rfbdev->helper,
                                 rdev->num_crtc,
index 2e723651069bd7d084d393e25c741f122b4c5c79..a053a0779aac35e907ab4e52ed8c71746a0c30c9 100644 (file)
@@ -128,7 +128,7 @@ int radeon_gart_table_vram_alloc(struct radeon_device *rdev)
        if (rdev->gart.robj == NULL) {
                r = radeon_bo_create(rdev, rdev->gart.table_size,
                                     PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM,
-                                    NULL, &rdev->gart.robj);
+                                    0, NULL, &rdev->gart.robj);
                if (r) {
                        return r;
                }
@@ -243,7 +243,8 @@ void radeon_gart_unbind(struct radeon_device *rdev, unsigned offset,
                        page_base = rdev->gart.pages_addr[p];
                        for (j = 0; j < (PAGE_SIZE / RADEON_GPU_PAGE_SIZE); j++, t++) {
                                if (rdev->gart.ptr) {
-                                       radeon_gart_set_page(rdev, t, page_base);
+                                       radeon_gart_set_page(rdev, t, page_base,
+                                                            RADEON_GART_PAGE_DUMMY);
                                }
                                page_base += RADEON_GPU_PAGE_SIZE;
                        }
@@ -261,13 +262,15 @@ void radeon_gart_unbind(struct radeon_device *rdev, unsigned offset,
  * @pages: number of pages to bind
  * @pagelist: pages to bind
  * @dma_addr: DMA addresses of pages
+ * @flags: RADEON_GART_PAGE_* flags
  *
  * Binds the requested pages to the gart page table
  * (all asics).
  * Returns 0 for success, -EINVAL for failure.
  */
 int radeon_gart_bind(struct radeon_device *rdev, unsigned offset,
-                    int pages, struct page **pagelist, dma_addr_t *dma_addr)
+                    int pages, struct page **pagelist, dma_addr_t *dma_addr,
+                    uint32_t flags)
 {
        unsigned t;
        unsigned p;
@@ -287,7 +290,7 @@ int radeon_gart_bind(struct radeon_device *rdev, unsigned offset,
                if (rdev->gart.ptr) {
                        page_base = rdev->gart.pages_addr[p];
                        for (j = 0; j < (PAGE_SIZE / RADEON_GPU_PAGE_SIZE); j++, t++) {
-                               radeon_gart_set_page(rdev, t, page_base);
+                               radeon_gart_set_page(rdev, t, page_base, flags);
                                page_base += RADEON_GPU_PAGE_SIZE;
                        }
                }
@@ -297,33 +300,6 @@ int radeon_gart_bind(struct radeon_device *rdev, unsigned offset,
        return 0;
 }
 
-/**
- * radeon_gart_restore - bind all pages in the gart page table
- *
- * @rdev: radeon_device pointer
- *
- * Binds all pages in the gart page table (all asics).
- * Used to rebuild the gart table on device startup or resume.
- */
-void radeon_gart_restore(struct radeon_device *rdev)
-{
-       int i, j, t;
-       u64 page_base;
-
-       if (!rdev->gart.ptr) {
-               return;
-       }
-       for (i = 0, t = 0; i < rdev->gart.num_cpu_pages; i++) {
-               page_base = rdev->gart.pages_addr[i];
-               for (j = 0; j < (PAGE_SIZE / RADEON_GPU_PAGE_SIZE); j++, t++) {
-                       radeon_gart_set_page(rdev, t, page_base);
-                       page_base += RADEON_GPU_PAGE_SIZE;
-               }
-       }
-       mb();
-       radeon_gart_tlb_flush(rdev);
-}
-
 /**
  * radeon_gart_init - init the driver info for managing the gart
  *
index d09650c1d720fc74920577fc176f41f9b076a646..bfd7e1b0ff3f88b19a6e2d4ec636c3c8dd9c95a4 100644 (file)
@@ -40,9 +40,9 @@ void radeon_gem_object_free(struct drm_gem_object *gobj)
        }
 }
 
-int radeon_gem_object_create(struct radeon_device *rdev, int size,
+int radeon_gem_object_create(struct radeon_device *rdev, unsigned long size,
                                int alignment, int initial_domain,
-                               bool discardable, bool kernel,
+                               u32 flags, bool kernel,
                                struct drm_gem_object **obj)
 {
        struct radeon_bo *robj;
@@ -55,23 +55,26 @@ int radeon_gem_object_create(struct radeon_device *rdev, int size,
                alignment = PAGE_SIZE;
        }
 
-       /* maximun bo size is the minimun btw visible vram and gtt size */
-       max_size = min(rdev->mc.visible_vram_size, rdev->mc.gtt_size);
+       /* Maximum bo size is the unpinned gtt size since we use the gtt to
+        * handle vram to system pool migrations.
+        */
+       max_size = rdev->mc.gtt_size - rdev->gart_pin_size;
        if (size > max_size) {
-               printk(KERN_WARNING "%s:%d alloc size %dMb bigger than %ldMb limit\n",
-                      __func__, __LINE__, size >> 20, max_size >> 20);
+               DRM_DEBUG("Allocation size %ldMb bigger than %ldMb limit\n",
+                         size >> 20, max_size >> 20);
                return -ENOMEM;
        }
 
 retry:
-       r = radeon_bo_create(rdev, size, alignment, kernel, initial_domain, NULL, &robj);
+       r = radeon_bo_create(rdev, size, alignment, kernel, initial_domain,
+                            flags, NULL, &robj);
        if (r) {
                if (r != -ERESTARTSYS) {
                        if (initial_domain == RADEON_GEM_DOMAIN_VRAM) {
                                initial_domain |= RADEON_GEM_DOMAIN_GTT;
                                goto retry;
                        }
-                       DRM_ERROR("Failed to allocate GEM object (%d, %d, %u, %d)\n",
+                       DRM_ERROR("Failed to allocate GEM object (%ld, %d, %u, %d)\n",
                                  size, initial_domain, alignment, r);
                }
                return r;
@@ -208,18 +211,15 @@ int radeon_gem_info_ioctl(struct drm_device *dev, void *data,
        struct radeon_device *rdev = dev->dev_private;
        struct drm_radeon_gem_info *args = data;
        struct ttm_mem_type_manager *man;
-       unsigned i;
 
        man = &rdev->mman.bdev.man[TTM_PL_VRAM];
 
        args->vram_size = rdev->mc.real_vram_size;
        args->vram_visible = (u64)man->size << PAGE_SHIFT;
-       if (rdev->stollen_vga_memory)
-               args->vram_visible -= radeon_bo_size(rdev->stollen_vga_memory);
-       args->vram_visible -= radeon_fbdev_total_size(rdev);
-       args->gart_size = rdev->mc.gtt_size - 4096 - RADEON_IB_POOL_SIZE*64*1024;
-       for(i = 0; i < RADEON_NUM_RINGS; ++i)
-               args->gart_size -= rdev->ring[i].ring_size;
+       args->vram_visible -= rdev->vram_pin_size;
+       args->gart_size = rdev->mc.gtt_size;
+       args->gart_size -= rdev->gart_pin_size;
+
        return 0;
 }
 
@@ -252,8 +252,8 @@ int radeon_gem_create_ioctl(struct drm_device *dev, void *data,
        /* create a gem object to contain this object in */
        args->size = roundup(args->size, PAGE_SIZE);
        r = radeon_gem_object_create(rdev, args->size, args->alignment,
-                                       args->initial_domain, false,
-                                       false, &gobj);
+                                    args->initial_domain, args->flags,
+                                    false, &gobj);
        if (r) {
                up_read(&rdev->exclusive_lock);
                r = radeon_gem_handle_lockup(rdev, r);
@@ -358,16 +358,18 @@ int radeon_gem_wait_idle_ioctl(struct drm_device *dev, void *data,
        struct drm_gem_object *gobj;
        struct radeon_bo *robj;
        int r;
+       uint32_t cur_placement = 0;
 
        gobj = drm_gem_object_lookup(dev, filp, args->handle);
        if (gobj == NULL) {
                return -ENOENT;
        }
        robj = gem_to_radeon_bo(gobj);
-       r = radeon_bo_wait(robj, NULL, false);
-       /* callback hw specific functions if any */
-       if (rdev->asic->ioctl_wait_idle)
-               robj->rdev->asic->ioctl_wait_idle(rdev, robj);
+       r = radeon_bo_wait(robj, &cur_placement, false);
+       /* Flush HDP cache via MMIO if necessary */
+       if (rdev->asic->mmio_hdp_flush &&
+           radeon_mem_type_to_domain(cur_placement) == RADEON_GEM_DOMAIN_VRAM)
+               robj->rdev->asic->mmio_hdp_flush(rdev);
        drm_gem_object_unreference_unlocked(gobj);
        r = radeon_gem_handle_lockup(rdev, r);
        return r;
@@ -461,11 +463,6 @@ int radeon_gem_va_ioctl(struct drm_device *dev, void *data,
                args->operation = RADEON_VA_RESULT_ERROR;
                return -EINVAL;
        }
-       if (!(args->flags & RADEON_VM_PAGE_SNOOPED)) {
-               dev_err(&dev->pdev->dev, "only supported snooped mapping for now\n");
-               args->operation = RADEON_VA_RESULT_ERROR;
-               return -EINVAL;
-       }
 
        switch (args->operation) {
        case RADEON_VA_MAP:
@@ -499,9 +496,9 @@ int radeon_gem_va_ioctl(struct drm_device *dev, void *data,
 
        switch (args->operation) {
        case RADEON_VA_MAP:
-               if (bo_va->soffset) {
+               if (bo_va->it.start) {
                        args->operation = RADEON_VA_RESULT_VA_EXIST;
-                       args->offset = bo_va->soffset;
+                       args->offset = bo_va->it.start * RADEON_GPU_PAGE_SIZE;
                        goto out;
                }
                r = radeon_vm_bo_set_addr(rdev, bo_va, args->offset, args->flags);
@@ -572,9 +569,8 @@ int radeon_mode_dumb_create(struct drm_file *file_priv,
        args->size = ALIGN(args->size, PAGE_SIZE);
 
        r = radeon_gem_object_create(rdev, args->size, 0,
-                                    RADEON_GEM_DOMAIN_VRAM,
-                                    false, ttm_bo_type_device,
-                                    &gobj);
+                                    RADEON_GEM_DOMAIN_VRAM, 0,
+                                    false, &gobj);
        if (r)
                return -ENOMEM;
 
diff --git a/drivers/gpu/drm/radeon/radeon_ib.c b/drivers/gpu/drm/radeon/radeon_ib.c
new file mode 100644 (file)
index 0000000..65b0c21
--- /dev/null
@@ -0,0 +1,319 @@
+/*
+ * Copyright 2008 Advanced Micro Devices, Inc.
+ * Copyright 2008 Red Hat Inc.
+ * Copyright 2009 Jerome Glisse.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: Dave Airlie
+ *          Alex Deucher
+ *          Jerome Glisse
+ *          Christian König
+ */
+#include <drm/drmP.h>
+#include "radeon.h"
+
+/*
+ * IB
+ * IBs (Indirect Buffers) and areas of GPU accessible memory where
+ * commands are stored.  You can put a pointer to the IB in the
+ * command ring and the hw will fetch the commands from the IB
+ * and execute them.  Generally userspace acceleration drivers
+ * produce command buffers which are send to the kernel and
+ * put in IBs for execution by the requested ring.
+ */
+static int radeon_debugfs_sa_init(struct radeon_device *rdev);
+
+/**
+ * radeon_ib_get - request an IB (Indirect Buffer)
+ *
+ * @rdev: radeon_device pointer
+ * @ring: ring index the IB is associated with
+ * @ib: IB object returned
+ * @size: requested IB size
+ *
+ * Request an IB (all asics).  IBs are allocated using the
+ * suballocator.
+ * Returns 0 on success, error on failure.
+ */
+int radeon_ib_get(struct radeon_device *rdev, int ring,
+                 struct radeon_ib *ib, struct radeon_vm *vm,
+                 unsigned size)
+{
+       int r;
+
+       r = radeon_sa_bo_new(rdev, &rdev->ring_tmp_bo, &ib->sa_bo, size, 256);
+       if (r) {
+               dev_err(rdev->dev, "failed to get a new IB (%d)\n", r);
+               return r;
+       }
+
+       r = radeon_semaphore_create(rdev, &ib->semaphore);
+       if (r) {
+               return r;
+       }
+
+       ib->ring = ring;
+       ib->fence = NULL;
+       ib->ptr = radeon_sa_bo_cpu_addr(ib->sa_bo);
+       ib->vm = vm;
+       if (vm) {
+               /* ib pool is bound at RADEON_VA_IB_OFFSET in virtual address
+                * space and soffset is the offset inside the pool bo
+                */
+               ib->gpu_addr = ib->sa_bo->soffset + RADEON_VA_IB_OFFSET;
+       } else {
+               ib->gpu_addr = radeon_sa_bo_gpu_addr(ib->sa_bo);
+       }
+       ib->is_const_ib = false;
+
+       return 0;
+}
+
+/**
+ * radeon_ib_free - free an IB (Indirect Buffer)
+ *
+ * @rdev: radeon_device pointer
+ * @ib: IB object to free
+ *
+ * Free an IB (all asics).
+ */
+void radeon_ib_free(struct radeon_device *rdev, struct radeon_ib *ib)
+{
+       radeon_semaphore_free(rdev, &ib->semaphore, ib->fence);
+       radeon_sa_bo_free(rdev, &ib->sa_bo, ib->fence);
+       radeon_fence_unref(&ib->fence);
+}
+
+/**
+ * radeon_ib_schedule - schedule an IB (Indirect Buffer) on the ring
+ *
+ * @rdev: radeon_device pointer
+ * @ib: IB object to schedule
+ * @const_ib: Const IB to schedule (SI only)
+ *
+ * Schedule an IB on the associated ring (all asics).
+ * Returns 0 on success, error on failure.
+ *
+ * On SI, there are two parallel engines fed from the primary ring,
+ * the CE (Constant Engine) and the DE (Drawing Engine).  Since
+ * resource descriptors have moved to memory, the CE allows you to
+ * prime the caches while the DE is updating register state so that
+ * the resource descriptors will be already in cache when the draw is
+ * processed.  To accomplish this, the userspace driver submits two
+ * IBs, one for the CE and one for the DE.  If there is a CE IB (called
+ * a CONST_IB), it will be put on the ring prior to the DE IB.  Prior
+ * to SI there was just a DE IB.
+ */
+int radeon_ib_schedule(struct radeon_device *rdev, struct radeon_ib *ib,
+                      struct radeon_ib *const_ib)
+{
+       struct radeon_ring *ring = &rdev->ring[ib->ring];
+       int r = 0;
+
+       if (!ib->length_dw || !ring->ready) {
+               /* TODO: Nothings in the ib we should report. */
+               dev_err(rdev->dev, "couldn't schedule ib\n");
+               return -EINVAL;
+       }
+
+       /* 64 dwords should be enough for fence too */
+       r = radeon_ring_lock(rdev, ring, 64 + RADEON_NUM_SYNCS * 8);
+       if (r) {
+               dev_err(rdev->dev, "scheduling IB failed (%d).\n", r);
+               return r;
+       }
+
+       /* grab a vm id if necessary */
+       if (ib->vm) {
+               struct radeon_fence *vm_id_fence;
+               vm_id_fence = radeon_vm_grab_id(rdev, ib->vm, ib->ring);
+               radeon_semaphore_sync_to(ib->semaphore, vm_id_fence);
+       }
+
+       /* sync with other rings */
+       r = radeon_semaphore_sync_rings(rdev, ib->semaphore, ib->ring);
+       if (r) {
+               dev_err(rdev->dev, "failed to sync rings (%d)\n", r);
+               radeon_ring_unlock_undo(rdev, ring);
+               return r;
+       }
+
+       if (ib->vm)
+               radeon_vm_flush(rdev, ib->vm, ib->ring);
+
+       if (const_ib) {
+               radeon_ring_ib_execute(rdev, const_ib->ring, const_ib);
+               radeon_semaphore_free(rdev, &const_ib->semaphore, NULL);
+       }
+       radeon_ring_ib_execute(rdev, ib->ring, ib);
+       r = radeon_fence_emit(rdev, &ib->fence, ib->ring);
+       if (r) {
+               dev_err(rdev->dev, "failed to emit fence for new IB (%d)\n", r);
+               radeon_ring_unlock_undo(rdev, ring);
+               return r;
+       }
+       if (const_ib) {
+               const_ib->fence = radeon_fence_ref(ib->fence);
+       }
+
+       if (ib->vm)
+               radeon_vm_fence(rdev, ib->vm, ib->fence);
+
+       radeon_ring_unlock_commit(rdev, ring);
+       return 0;
+}
+
+/**
+ * radeon_ib_pool_init - Init the IB (Indirect Buffer) pool
+ *
+ * @rdev: radeon_device pointer
+ *
+ * Initialize the suballocator to manage a pool of memory
+ * for use as IBs (all asics).
+ * Returns 0 on success, error on failure.
+ */
+int radeon_ib_pool_init(struct radeon_device *rdev)
+{
+       int r;
+
+       if (rdev->ib_pool_ready) {
+               return 0;
+       }
+
+       if (rdev->family >= CHIP_BONAIRE) {
+               r = radeon_sa_bo_manager_init(rdev, &rdev->ring_tmp_bo,
+                                             RADEON_IB_POOL_SIZE*64*1024,
+                                             RADEON_GPU_PAGE_SIZE,
+                                             RADEON_GEM_DOMAIN_GTT,
+                                             RADEON_GEM_GTT_WC);
+       } else {
+               /* Before CIK, it's better to stick to cacheable GTT due
+                * to the command stream checking
+                */
+               r = radeon_sa_bo_manager_init(rdev, &rdev->ring_tmp_bo,
+                                             RADEON_IB_POOL_SIZE*64*1024,
+                                             RADEON_GPU_PAGE_SIZE,
+                                             RADEON_GEM_DOMAIN_GTT, 0);
+       }
+       if (r) {
+               return r;
+       }
+
+       r = radeon_sa_bo_manager_start(rdev, &rdev->ring_tmp_bo);
+       if (r) {
+               return r;
+       }
+
+       rdev->ib_pool_ready = true;
+       if (radeon_debugfs_sa_init(rdev)) {
+               dev_err(rdev->dev, "failed to register debugfs file for SA\n");
+       }
+       return 0;
+}
+
+/**
+ * radeon_ib_pool_fini - Free the IB (Indirect Buffer) pool
+ *
+ * @rdev: radeon_device pointer
+ *
+ * Tear down the suballocator managing the pool of memory
+ * for use as IBs (all asics).
+ */
+void radeon_ib_pool_fini(struct radeon_device *rdev)
+{
+       if (rdev->ib_pool_ready) {
+               radeon_sa_bo_manager_suspend(rdev, &rdev->ring_tmp_bo);
+               radeon_sa_bo_manager_fini(rdev, &rdev->ring_tmp_bo);
+               rdev->ib_pool_ready = false;
+       }
+}
+
+/**
+ * radeon_ib_ring_tests - test IBs on the rings
+ *
+ * @rdev: radeon_device pointer
+ *
+ * Test an IB (Indirect Buffer) on each ring.
+ * If the test fails, disable the ring.
+ * Returns 0 on success, error if the primary GFX ring
+ * IB test fails.
+ */
+int radeon_ib_ring_tests(struct radeon_device *rdev)
+{
+       unsigned i;
+       int r;
+
+       for (i = 0; i < RADEON_NUM_RINGS; ++i) {
+               struct radeon_ring *ring = &rdev->ring[i];
+
+               if (!ring->ready)
+                       continue;
+
+               r = radeon_ib_test(rdev, i, ring);
+               if (r) {
+                       ring->ready = false;
+                       rdev->needs_reset = false;
+
+                       if (i == RADEON_RING_TYPE_GFX_INDEX) {
+                               /* oh, oh, that's really bad */
+                               DRM_ERROR("radeon: failed testing IB on GFX ring (%d).\n", r);
+                               rdev->accel_working = false;
+                               return r;
+
+                       } else {
+                               /* still not good, but we can live with it */
+                               DRM_ERROR("radeon: failed testing IB on ring %d (%d).\n", i, r);
+                       }
+               }
+       }
+       return 0;
+}
+
+/*
+ * Debugfs info
+ */
+#if defined(CONFIG_DEBUG_FS)
+
+static int radeon_debugfs_sa_info(struct seq_file *m, void *data)
+{
+       struct drm_info_node *node = (struct drm_info_node *) m->private;
+       struct drm_device *dev = node->minor->dev;
+       struct radeon_device *rdev = dev->dev_private;
+
+       radeon_sa_bo_dump_debug_info(&rdev->ring_tmp_bo, m);
+
+       return 0;
+
+}
+
+static struct drm_info_list radeon_debugfs_sa_list[] = {
+        {"radeon_sa_info", &radeon_debugfs_sa_info, 0, NULL},
+};
+
+#endif
+
+static int radeon_debugfs_sa_init(struct radeon_device *rdev)
+{
+#if defined(CONFIG_DEBUG_FS)
+       return radeon_debugfs_add_files(rdev, radeon_debugfs_sa_list, 1);
+#else
+       return 0;
+#endif
+}
index d25ae6acfd5a05d3bc3ab9775cc3dc604f27554a..eb7164d07985668a7c698a44d4d2e9e29668dfb8 100644 (file)
@@ -254,7 +254,18 @@ static int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file
                }
                break;
        case RADEON_INFO_ACCEL_WORKING2:
-               *value = rdev->accel_working;
+               if (rdev->family == CHIP_HAWAII) {
+                       if (rdev->accel_working) {
+                               if (rdev->new_fw)
+                                       *value = 3;
+                               else
+                                       *value = 2;
+                       } else {
+                               *value = 0;
+                       }
+               } else {
+                       *value = rdev->accel_working;
+               }
                break;
        case RADEON_INFO_TILING_CONFIG:
                if (rdev->family >= CHIP_BONAIRE)
index 0592ddb0904b732384d09f73114f4d41566c3c4a..e27608c29c112f5e8d164214ca7b56855ef15593 100644 (file)
@@ -685,10 +685,11 @@ extern bool radeon_dig_monitor_is_duallink(struct drm_encoder *encoder,
 
 extern u16 radeon_encoder_get_dp_bridge_encoder_id(struct drm_encoder *encoder);
 extern u16 radeon_connector_encoder_get_dp_bridge_encoder_id(struct drm_connector *connector);
-extern bool radeon_connector_encoder_is_hbr2(struct drm_connector *connector);
 extern bool radeon_connector_is_dp12_capable(struct drm_connector *connector);
 extern int radeon_get_monitor_bpc(struct drm_connector *connector);
 
+extern struct edid *radeon_connector_edid(struct drm_connector *connector);
+
 extern void radeon_connector_hotplug(struct drm_connector *connector);
 extern int radeon_dp_mode_valid_helper(struct drm_connector *connector,
                                       struct drm_display_mode *mode);
@@ -738,7 +739,6 @@ extern void radeon_i2c_put_byte(struct radeon_i2c_chan *i2c,
 extern void radeon_router_select_ddc_port(struct radeon_connector *radeon_connector);
 extern void radeon_router_select_cd_port(struct radeon_connector *radeon_connector);
 extern bool radeon_ddc_probe(struct radeon_connector *radeon_connector, bool use_aux);
-extern int radeon_ddc_get_modes(struct radeon_connector *radeon_connector);
 
 extern struct drm_encoder *radeon_best_encoder(struct drm_connector *connector);
 
index 6c717b257d6d5c8e683ad9cbf3e88e40e9bf5557..480c87d8edc50cc46aad4c612b1f6f4942d9a8a1 100644 (file)
@@ -46,16 +46,6 @@ static void radeon_bo_clear_surface_reg(struct radeon_bo *bo);
  * function are calling it.
  */
 
-static void radeon_bo_clear_va(struct radeon_bo *bo)
-{
-       struct radeon_bo_va *bo_va, *tmp;
-
-       list_for_each_entry_safe(bo_va, tmp, &bo->va, bo_list) {
-               /* remove from all vm address space */
-               radeon_vm_bo_rmv(bo->rdev, bo_va);
-       }
-}
-
 static void radeon_update_memory_usage(struct radeon_bo *bo,
                                       unsigned mem_type, int sign)
 {
@@ -90,7 +80,7 @@ static void radeon_ttm_bo_destroy(struct ttm_buffer_object *tbo)
        list_del_init(&bo->list);
        mutex_unlock(&bo->rdev->gem.mutex);
        radeon_bo_clear_surface_reg(bo);
-       radeon_bo_clear_va(bo);
+       WARN_ON(!list_empty(&bo->va));
        drm_gem_object_release(&bo->gem_base);
        kfree(bo);
 }
@@ -114,15 +104,23 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
                rbo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED |
                                        TTM_PL_FLAG_VRAM;
        if (domain & RADEON_GEM_DOMAIN_GTT) {
-               if (rbo->rdev->flags & RADEON_IS_AGP) {
-                       rbo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_TT;
+               if (rbo->flags & RADEON_GEM_GTT_UC) {
+                       rbo->placements[c++] = TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_TT;
+               } else if ((rbo->flags & RADEON_GEM_GTT_WC) ||
+                          (rbo->rdev->flags & RADEON_IS_AGP)) {
+                       rbo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED |
+                               TTM_PL_FLAG_TT;
                } else {
                        rbo->placements[c++] = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_TT;
                }
        }
        if (domain & RADEON_GEM_DOMAIN_CPU) {
-               if (rbo->rdev->flags & RADEON_IS_AGP) {
-                       rbo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_SYSTEM;
+               if (rbo->flags & RADEON_GEM_GTT_UC) {
+                       rbo->placements[c++] = TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_SYSTEM;
+               } else if ((rbo->flags & RADEON_GEM_GTT_WC) ||
+                   rbo->rdev->flags & RADEON_IS_AGP) {
+                       rbo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED |
+                               TTM_PL_FLAG_SYSTEM;
                } else {
                        rbo->placements[c++] = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_SYSTEM;
                }
@@ -146,7 +144,7 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
 
 int radeon_bo_create(struct radeon_device *rdev,
                     unsigned long size, int byte_align, bool kernel, u32 domain,
-                    struct sg_table *sg, struct radeon_bo **bo_ptr)
+                    u32 flags, struct sg_table *sg, struct radeon_bo **bo_ptr)
 {
        struct radeon_bo *bo;
        enum ttm_bo_type type;
@@ -183,6 +181,12 @@ int radeon_bo_create(struct radeon_device *rdev,
        bo->initial_domain = domain & (RADEON_GEM_DOMAIN_VRAM |
                                       RADEON_GEM_DOMAIN_GTT |
                                       RADEON_GEM_DOMAIN_CPU);
+
+       bo->flags = flags;
+       /* PCI GART is always snooped */
+       if (!(rdev->flags & RADEON_IS_PCIE))
+               bo->flags &= ~(RADEON_GEM_GTT_WC | RADEON_GEM_GTT_UC);
+
        radeon_ttm_placement_from_domain(bo, domain);
        /* Kernel allocation are uninterruptible */
        down_read(&rdev->pm.mclk_lock);
@@ -232,6 +236,15 @@ void radeon_bo_kunmap(struct radeon_bo *bo)
        ttm_bo_kunmap(&bo->kmap);
 }
 
+struct radeon_bo *radeon_bo_ref(struct radeon_bo *bo)
+{
+       if (bo == NULL)
+               return NULL;
+
+       ttm_bo_reference(&bo->tbo);
+       return bo;
+}
+
 void radeon_bo_unref(struct radeon_bo **bo)
 {
        struct ttm_buffer_object *tbo;
@@ -241,9 +254,7 @@ void radeon_bo_unref(struct radeon_bo **bo)
                return;
        rdev = (*bo)->rdev;
        tbo = &((*bo)->tbo);
-       down_read(&rdev->pm.mclk_lock);
        ttm_bo_unref(&tbo);
-       up_read(&rdev->pm.mclk_lock);
        if (tbo == NULL)
                *bo = NULL;
 }
@@ -292,9 +303,13 @@ int radeon_bo_pin_restricted(struct radeon_bo *bo, u32 domain, u64 max_offset,
                bo->pin_count = 1;
                if (gpu_addr != NULL)
                        *gpu_addr = radeon_bo_gpu_offset(bo);
-       }
-       if (unlikely(r != 0))
+               if (domain == RADEON_GEM_DOMAIN_VRAM)
+                       bo->rdev->vram_pin_size += radeon_bo_size(bo);
+               else
+                       bo->rdev->gart_pin_size += radeon_bo_size(bo);
+       } else {
                dev_err(bo->rdev->dev, "%p pin failed\n", bo);
+       }
        return r;
 }
 
@@ -317,8 +332,14 @@ int radeon_bo_unpin(struct radeon_bo *bo)
        for (i = 0; i < bo->placement.num_placement; i++)
                bo->placements[i] &= ~TTM_PL_FLAG_NO_EVICT;
        r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false);
-       if (unlikely(r != 0))
+       if (likely(r == 0)) {
+               if (bo->tbo.mem.mem_type == TTM_PL_VRAM)
+                       bo->rdev->vram_pin_size -= radeon_bo_size(bo);
+               else
+                       bo->rdev->gart_pin_size -= radeon_bo_size(bo);
+       } else {
                dev_err(bo->rdev->dev, "%p validate failed for unpin\n", bo);
+       }
        return r;
 }
 
index 5a873f31a17100289469fe465e53abba75addd51..98a47fdf362510284d21b864f1e5e565b5388604 100644 (file)
@@ -124,11 +124,12 @@ extern int radeon_bo_wait(struct radeon_bo *bo, u32 *mem_type,
 
 extern int radeon_bo_create(struct radeon_device *rdev,
                            unsigned long size, int byte_align,
-                           bool kernel, u32 domain,
+                           bool kernel, u32 domain, u32 flags,
                            struct sg_table *sg,
                            struct radeon_bo **bo_ptr);
 extern int radeon_bo_kmap(struct radeon_bo *bo, void **ptr);
 extern void radeon_bo_kunmap(struct radeon_bo *bo);
+extern struct radeon_bo *radeon_bo_ref(struct radeon_bo *bo);
 extern void radeon_bo_unref(struct radeon_bo **bo);
 extern int radeon_bo_pin(struct radeon_bo *bo, u32 domain, u64 *gpu_addr);
 extern int radeon_bo_pin_restricted(struct radeon_bo *bo, u32 domain,
@@ -170,7 +171,8 @@ static inline void * radeon_sa_bo_cpu_addr(struct radeon_sa_bo *sa_bo)
 
 extern int radeon_sa_bo_manager_init(struct radeon_device *rdev,
                                     struct radeon_sa_manager *sa_manager,
-                                    unsigned size, u32 align, u32 domain);
+                                    unsigned size, u32 align, u32 domain,
+                                    u32 flags);
 extern void radeon_sa_bo_manager_fini(struct radeon_device *rdev,
                                      struct radeon_sa_manager *sa_manager);
 extern int radeon_sa_bo_manager_start(struct radeon_device *rdev,
index e447e390d09a148ca7f46d11c757ebbacc3cff4d..23314be49480684c583aefffedec4587af48e524 100644 (file)
@@ -1303,10 +1303,6 @@ int radeon_pm_init(struct radeon_device *rdev)
        case CHIP_RS780:
        case CHIP_RS880:
        case CHIP_RV770:
-       case CHIP_BARTS:
-       case CHIP_TURKS:
-       case CHIP_CAICOS:
-       case CHIP_CAYMAN:
                /* DPM requires the RLC, RV770+ dGPU requires SMC */
                if (!rdev->rlc_fw)
                        rdev->pm.pm_method = PM_METHOD_PROFILE;
@@ -1330,6 +1326,10 @@ int radeon_pm_init(struct radeon_device *rdev)
        case CHIP_PALM:
        case CHIP_SUMO:
        case CHIP_SUMO2:
+       case CHIP_BARTS:
+       case CHIP_TURKS:
+       case CHIP_CAICOS:
+       case CHIP_CAYMAN:
        case CHIP_ARUBA:
        case CHIP_TAHITI:
        case CHIP_PITCAIRN:
@@ -1400,9 +1400,7 @@ static void radeon_pm_fini_old(struct radeon_device *rdev)
        }
 
        radeon_hwmon_fini(rdev);
-
-       if (rdev->pm.power_state)
-               kfree(rdev->pm.power_state);
+       kfree(rdev->pm.power_state);
 }
 
 static void radeon_pm_fini_dpm(struct radeon_device *rdev)
@@ -1421,9 +1419,7 @@ static void radeon_pm_fini_dpm(struct radeon_device *rdev)
        radeon_dpm_fini(rdev);
 
        radeon_hwmon_fini(rdev);
-
-       if (rdev->pm.power_state)
-               kfree(rdev->pm.power_state);
+       kfree(rdev->pm.power_state);
 }
 
 void radeon_pm_fini(struct radeon_device *rdev)
index 28d71070c389015e2dc003d27b2302c19d7eecca..0b16f2cbcf170b5a9a6d23b6683eedb827b890b4 100644 (file)
@@ -65,7 +65,7 @@ struct drm_gem_object *radeon_gem_prime_import_sg_table(struct drm_device *dev,
        int ret;
 
        ret = radeon_bo_create(rdev, size, PAGE_SIZE, false,
-                              RADEON_GEM_DOMAIN_GTT, sg, &bo);
+                              RADEON_GEM_DOMAIN_GTT, 0, sg, &bo);
        if (ret)
                return ERR_PTR(ret);
 
index f8050f5429e28b7b887528d3fb3ab623b6a85d32..5b4e0cf231a04d0a104868ed590f1324afe70be1 100644 (file)
  *          Jerome Glisse
  *          Christian König
  */
-#include <linux/seq_file.h>
-#include <linux/slab.h>
 #include <drm/drmP.h>
-#include <drm/radeon_drm.h>
-#include "radeon_reg.h"
 #include "radeon.h"
-#include "atom.h"
-
-/*
- * IB
- * IBs (Indirect Buffers) and areas of GPU accessible memory where
- * commands are stored.  You can put a pointer to the IB in the
- * command ring and the hw will fetch the commands from the IB
- * and execute them.  Generally userspace acceleration drivers
- * produce command buffers which are send to the kernel and
- * put in IBs for execution by the requested ring.
- */
-static int radeon_debugfs_sa_init(struct radeon_device *rdev);
-
-/**
- * radeon_ib_get - request an IB (Indirect Buffer)
- *
- * @rdev: radeon_device pointer
- * @ring: ring index the IB is associated with
- * @ib: IB object returned
- * @size: requested IB size
- *
- * Request an IB (all asics).  IBs are allocated using the
- * suballocator.
- * Returns 0 on success, error on failure.
- */
-int radeon_ib_get(struct radeon_device *rdev, int ring,
-                 struct radeon_ib *ib, struct radeon_vm *vm,
-                 unsigned size)
-{
-       int r;
-
-       r = radeon_sa_bo_new(rdev, &rdev->ring_tmp_bo, &ib->sa_bo, size, 256);
-       if (r) {
-               dev_err(rdev->dev, "failed to get a new IB (%d)\n", r);
-               return r;
-       }
-
-       r = radeon_semaphore_create(rdev, &ib->semaphore);
-       if (r) {
-               return r;
-       }
-
-       ib->ring = ring;
-       ib->fence = NULL;
-       ib->ptr = radeon_sa_bo_cpu_addr(ib->sa_bo);
-       ib->vm = vm;
-       if (vm) {
-               /* ib pool is bound at RADEON_VA_IB_OFFSET in virtual address
-                * space and soffset is the offset inside the pool bo
-                */
-               ib->gpu_addr = ib->sa_bo->soffset + RADEON_VA_IB_OFFSET;
-       } else {
-               ib->gpu_addr = radeon_sa_bo_gpu_addr(ib->sa_bo);
-       }
-       ib->is_const_ib = false;
-
-       return 0;
-}
-
-/**
- * radeon_ib_free - free an IB (Indirect Buffer)
- *
- * @rdev: radeon_device pointer
- * @ib: IB object to free
- *
- * Free an IB (all asics).
- */
-void radeon_ib_free(struct radeon_device *rdev, struct radeon_ib *ib)
-{
-       radeon_semaphore_free(rdev, &ib->semaphore, ib->fence);
-       radeon_sa_bo_free(rdev, &ib->sa_bo, ib->fence);
-       radeon_fence_unref(&ib->fence);
-}
-
-/**
- * radeon_ib_schedule - schedule an IB (Indirect Buffer) on the ring
- *
- * @rdev: radeon_device pointer
- * @ib: IB object to schedule
- * @const_ib: Const IB to schedule (SI only)
- *
- * Schedule an IB on the associated ring (all asics).
- * Returns 0 on success, error on failure.
- *
- * On SI, there are two parallel engines fed from the primary ring,
- * the CE (Constant Engine) and the DE (Drawing Engine).  Since
- * resource descriptors have moved to memory, the CE allows you to
- * prime the caches while the DE is updating register state so that
- * the resource descriptors will be already in cache when the draw is
- * processed.  To accomplish this, the userspace driver submits two
- * IBs, one for the CE and one for the DE.  If there is a CE IB (called
- * a CONST_IB), it will be put on the ring prior to the DE IB.  Prior
- * to SI there was just a DE IB.
- */
-int radeon_ib_schedule(struct radeon_device *rdev, struct radeon_ib *ib,
-                      struct radeon_ib *const_ib)
-{
-       struct radeon_ring *ring = &rdev->ring[ib->ring];
-       int r = 0;
-
-       if (!ib->length_dw || !ring->ready) {
-               /* TODO: Nothings in the ib we should report. */
-               dev_err(rdev->dev, "couldn't schedule ib\n");
-               return -EINVAL;
-       }
-
-       /* 64 dwords should be enough for fence too */
-       r = radeon_ring_lock(rdev, ring, 64 + RADEON_NUM_SYNCS * 8);
-       if (r) {
-               dev_err(rdev->dev, "scheduling IB failed (%d).\n", r);
-               return r;
-       }
-
-       /* grab a vm id if necessary */
-       if (ib->vm) {
-               struct radeon_fence *vm_id_fence;
-               vm_id_fence = radeon_vm_grab_id(rdev, ib->vm, ib->ring);
-               radeon_semaphore_sync_to(ib->semaphore, vm_id_fence);
-       }
-
-       /* sync with other rings */
-       r = radeon_semaphore_sync_rings(rdev, ib->semaphore, ib->ring);
-       if (r) {
-               dev_err(rdev->dev, "failed to sync rings (%d)\n", r);
-               radeon_ring_unlock_undo(rdev, ring);
-               return r;
-       }
-
-       if (ib->vm)
-               radeon_vm_flush(rdev, ib->vm, ib->ring);
-
-       if (const_ib) {
-               radeon_ring_ib_execute(rdev, const_ib->ring, const_ib);
-               radeon_semaphore_free(rdev, &const_ib->semaphore, NULL);
-       }
-       radeon_ring_ib_execute(rdev, ib->ring, ib);
-       r = radeon_fence_emit(rdev, &ib->fence, ib->ring);
-       if (r) {
-               dev_err(rdev->dev, "failed to emit fence for new IB (%d)\n", r);
-               radeon_ring_unlock_undo(rdev, ring);
-               return r;
-       }
-       if (const_ib) {
-               const_ib->fence = radeon_fence_ref(ib->fence);
-       }
-
-       if (ib->vm)
-               radeon_vm_fence(rdev, ib->vm, ib->fence);
-
-       radeon_ring_unlock_commit(rdev, ring);
-       return 0;
-}
-
-/**
- * radeon_ib_pool_init - Init the IB (Indirect Buffer) pool
- *
- * @rdev: radeon_device pointer
- *
- * Initialize the suballocator to manage a pool of memory
- * for use as IBs (all asics).
- * Returns 0 on success, error on failure.
- */
-int radeon_ib_pool_init(struct radeon_device *rdev)
-{
-       int r;
-
-       if (rdev->ib_pool_ready) {
-               return 0;
-       }
-       r = radeon_sa_bo_manager_init(rdev, &rdev->ring_tmp_bo,
-                                     RADEON_IB_POOL_SIZE*64*1024,
-                                     RADEON_GPU_PAGE_SIZE,
-                                     RADEON_GEM_DOMAIN_GTT);
-       if (r) {
-               return r;
-       }
-
-       r = radeon_sa_bo_manager_start(rdev, &rdev->ring_tmp_bo);
-       if (r) {
-               return r;
-       }
-
-       rdev->ib_pool_ready = true;
-       if (radeon_debugfs_sa_init(rdev)) {
-               dev_err(rdev->dev, "failed to register debugfs file for SA\n");
-       }
-       return 0;
-}
-
-/**
- * radeon_ib_pool_fini - Free the IB (Indirect Buffer) pool
- *
- * @rdev: radeon_device pointer
- *
- * Tear down the suballocator managing the pool of memory
- * for use as IBs (all asics).
- */
-void radeon_ib_pool_fini(struct radeon_device *rdev)
-{
-       if (rdev->ib_pool_ready) {
-               radeon_sa_bo_manager_suspend(rdev, &rdev->ring_tmp_bo);
-               radeon_sa_bo_manager_fini(rdev, &rdev->ring_tmp_bo);
-               rdev->ib_pool_ready = false;
-       }
-}
-
-/**
- * radeon_ib_ring_tests - test IBs on the rings
- *
- * @rdev: radeon_device pointer
- *
- * Test an IB (Indirect Buffer) on each ring.
- * If the test fails, disable the ring.
- * Returns 0 on success, error if the primary GFX ring
- * IB test fails.
- */
-int radeon_ib_ring_tests(struct radeon_device *rdev)
-{
-       unsigned i;
-       int r;
-
-       for (i = 0; i < RADEON_NUM_RINGS; ++i) {
-               struct radeon_ring *ring = &rdev->ring[i];
-
-               if (!ring->ready)
-                       continue;
-
-               r = radeon_ib_test(rdev, i, ring);
-               if (r) {
-                       ring->ready = false;
-                       rdev->needs_reset = false;
-
-                       if (i == RADEON_RING_TYPE_GFX_INDEX) {
-                               /* oh, oh, that's really bad */
-                               DRM_ERROR("radeon: failed testing IB on GFX ring (%d).\n", r);
-                               rdev->accel_working = false;
-                               return r;
-
-                       } else {
-                               /* still not good, but we can live with it */
-                               DRM_ERROR("radeon: failed testing IB on ring %d (%d).\n", i, r);
-                       }
-               }
-       }
-       return 0;
-}
 
 /*
  * Rings
@@ -433,11 +183,21 @@ int radeon_ring_lock(struct radeon_device *rdev, struct radeon_ring *ring, unsig
  */
 void radeon_ring_commit(struct radeon_device *rdev, struct radeon_ring *ring)
 {
+       /* If we are emitting the HDP flush via the ring buffer, we need to
+        * do it before padding.
+        */
+       if (rdev->asic->ring[ring->idx]->hdp_flush)
+               rdev->asic->ring[ring->idx]->hdp_flush(rdev, ring);
        /* We pad to match fetch size */
        while (ring->wptr & ring->align_mask) {
                radeon_ring_write(ring, ring->nop);
        }
        mb();
+       /* If we are emitting the HDP flush via MMIO, we need to do it after
+        * all CPU writes to VRAM finished.
+        */
+       if (rdev->asic->mmio_hdp_flush)
+               rdev->asic->mmio_hdp_flush(rdev);
        radeon_ring_set_wptr(rdev, ring);
 }
 
@@ -641,6 +401,8 @@ int radeon_ring_init(struct radeon_device *rdev, struct radeon_ring *ring, unsig
        if (ring->ring_obj == NULL) {
                r = radeon_bo_create(rdev, ring->ring_size, PAGE_SIZE, true,
                                     RADEON_GEM_DOMAIN_GTT,
+                                    (rdev->flags & RADEON_IS_PCIE) ?
+                                    RADEON_GEM_GTT_WC : 0,
                                     NULL, &ring->ring_obj);
                if (r) {
                        dev_err(rdev->dev, "(%d) ring create failed\n", r);
@@ -791,22 +553,6 @@ static struct drm_info_list radeon_debugfs_ring_info_list[] = {
        {"radeon_ring_vce2", radeon_debugfs_ring_info, 0, &si_vce2_index},
 };
 
-static int radeon_debugfs_sa_info(struct seq_file *m, void *data)
-{
-       struct drm_info_node *node = (struct drm_info_node *) m->private;
-       struct drm_device *dev = node->minor->dev;
-       struct radeon_device *rdev = dev->dev_private;
-
-       radeon_sa_bo_dump_debug_info(&rdev->ring_tmp_bo, m);
-
-       return 0;
-
-}
-
-static struct drm_info_list radeon_debugfs_sa_list[] = {
-        {"radeon_sa_info", &radeon_debugfs_sa_info, 0, NULL},
-};
-
 #endif
 
 static int radeon_debugfs_ring_init(struct radeon_device *rdev, struct radeon_ring *ring)
@@ -828,12 +574,3 @@ static int radeon_debugfs_ring_init(struct radeon_device *rdev, struct radeon_ri
 #endif
        return 0;
 }
-
-static int radeon_debugfs_sa_init(struct radeon_device *rdev)
-{
-#if defined(CONFIG_DEBUG_FS)
-       return radeon_debugfs_add_files(rdev, radeon_debugfs_sa_list, 1);
-#else
-       return 0;
-#endif
-}
index adcf3e2f07da5ac10adc84a9c6c6d85b631ff87d..b84f97c8718cd1b7b1f46137b1646af1691f8d4e 100644 (file)
@@ -49,7 +49,7 @@ static void radeon_sa_bo_try_free(struct radeon_sa_manager *sa_manager);
 
 int radeon_sa_bo_manager_init(struct radeon_device *rdev,
                              struct radeon_sa_manager *sa_manager,
-                             unsigned size, u32 align, u32 domain)
+                             unsigned size, u32 align, u32 domain, u32 flags)
 {
        int i, r;
 
@@ -65,7 +65,7 @@ int radeon_sa_bo_manager_init(struct radeon_device *rdev,
        }
 
        r = radeon_bo_create(rdev, size, align, true,
-                            domain, NULL, &sa_manager->bo);
+                            domain, flags, NULL, &sa_manager->bo);
        if (r) {
                dev_err(rdev->dev, "(%d) failed to allocate bo for manager\n", r);
                return r;
index 3a13e0d1055ce350183b1d345ef0996f27b54261..5adf4207453d7eb041f6679722283a36ae5a0931 100644 (file)
@@ -56,13 +56,7 @@ static void radeon_do_test_moves(struct radeon_device *rdev, int flag)
        /* Number of tests =
         * (Total GTT - IB pool - writeback page - ring buffers) / test size
         */
-       n = rdev->mc.gtt_size - RADEON_IB_POOL_SIZE*64*1024;
-       for (i = 0; i < RADEON_NUM_RINGS; ++i)
-               n -= rdev->ring[i].ring_size;
-       if (rdev->wb.wb_obj)
-               n -= RADEON_GPU_PAGE_SIZE;
-       if (rdev->ih.ring_obj)
-               n -= rdev->ih.ring_size;
+       n = rdev->mc.gtt_size - rdev->gart_pin_size;
        n /= size;
 
        gtt_obj = kzalloc(n * sizeof(*gtt_obj), GFP_KERNEL);
@@ -73,7 +67,7 @@ static void radeon_do_test_moves(struct radeon_device *rdev, int flag)
        }
 
        r = radeon_bo_create(rdev, size, PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM,
-                            NULL, &vram_obj);
+                            0, NULL, &vram_obj);
        if (r) {
                DRM_ERROR("Failed to create VRAM object\n");
                goto out_cleanup;
@@ -93,7 +87,7 @@ static void radeon_do_test_moves(struct radeon_device *rdev, int flag)
                struct radeon_fence *fence = NULL;
 
                r = radeon_bo_create(rdev, size, PAGE_SIZE, true,
-                                    RADEON_GEM_DOMAIN_GTT, NULL, gtt_obj + i);
+                                    RADEON_GEM_DOMAIN_GTT, 0, NULL, gtt_obj + i);
                if (r) {
                        DRM_ERROR("Failed to create GTT object %d\n", i);
                        goto out_lclean;
index f749f2c3bbdb838a63bdcd6598409387de3c790b..9db74a96ef617d7d66292023d8250ca3821e236a 100644 (file)
@@ -72,8 +72,8 @@ TRACE_EVENT(radeon_vm_bo_update,
                             ),
 
            TP_fast_assign(
-                          __entry->soffset = bo_va->soffset;
-                          __entry->eoffset = bo_va->eoffset;
+                          __entry->soffset = bo_va->it.start;
+                          __entry->eoffset = bo_va->it.last + 1;
                           __entry->flags = bo_va->flags;
                           ),
            TP_printk("soffs=%010llx, eoffs=%010llx, flags=%08x",
@@ -104,6 +104,24 @@ TRACE_EVENT(radeon_vm_set_page,
                      __entry->flags, __entry->count)
 );
 
+TRACE_EVENT(radeon_vm_flush,
+           TP_PROTO(uint64_t pd_addr, unsigned ring, unsigned id),
+           TP_ARGS(pd_addr, ring, id),
+           TP_STRUCT__entry(
+                            __field(u64, pd_addr)
+                            __field(u32, ring)
+                            __field(u32, id)
+                            ),
+
+           TP_fast_assign(
+                          __entry->pd_addr = pd_addr;
+                          __entry->ring = ring;
+                          __entry->id = id;
+                          ),
+           TP_printk("pd_addr=%010Lx, ring=%u, id=%u",
+                     __entry->pd_addr, __entry->ring, __entry->id)
+);
+
 DECLARE_EVENT_CLASS(radeon_fence_request,
 
            TP_PROTO(struct drm_device *dev, int ring, u32 seqno),
index c8a8a5144ec16a51686acf3658dd149261867ac8..72afe82a95c906f58387196390258b5ebb902b4e 100644 (file)
@@ -521,6 +521,8 @@ static int radeon_ttm_backend_bind(struct ttm_tt *ttm,
                                   struct ttm_mem_reg *bo_mem)
 {
        struct radeon_ttm_tt *gtt = (void*)ttm;
+       uint32_t flags = RADEON_GART_PAGE_VALID | RADEON_GART_PAGE_READ |
+               RADEON_GART_PAGE_WRITE;
        int r;
 
        gtt->offset = (unsigned long)(bo_mem->start << PAGE_SHIFT);
@@ -528,8 +530,10 @@ static int radeon_ttm_backend_bind(struct ttm_tt *ttm,
                WARN(1, "nothing to bind %lu pages for mreg %p back %p!\n",
                     ttm->num_pages, bo_mem, ttm);
        }
-       r = radeon_gart_bind(gtt->rdev, gtt->offset,
-                            ttm->num_pages, ttm->pages, gtt->ttm.dma_address);
+       if (ttm->caching_state == tt_cached)
+               flags |= RADEON_GART_PAGE_SNOOP;
+       r = radeon_gart_bind(gtt->rdev, gtt->offset, ttm->num_pages,
+                            ttm->pages, gtt->ttm.dma_address, flags);
        if (r) {
                DRM_ERROR("failed to bind %lu pages at 0x%08X\n",
                          ttm->num_pages, (unsigned)gtt->offset);
@@ -726,7 +730,7 @@ int radeon_ttm_init(struct radeon_device *rdev)
        radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
 
        r = radeon_bo_create(rdev, 256 * 1024, PAGE_SIZE, true,
-                            RADEON_GEM_DOMAIN_VRAM,
+                            RADEON_GEM_DOMAIN_VRAM, 0,
                             NULL, &rdev->stollen_vga_memory);
        if (r) {
                return r;
diff --git a/drivers/gpu/drm/radeon/radeon_ucode.c b/drivers/gpu/drm/radeon/radeon_ucode.c
new file mode 100644 (file)
index 0000000..6beec68
--- /dev/null
@@ -0,0 +1,167 @@
+/*
+ * Copyright 2014 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#include <linux/firmware.h>
+#include <linux/slab.h>
+#include <linux/module.h>
+#include <drm/drmP.h>
+#include "radeon.h"
+#include "radeon_ucode.h"
+
+static void radeon_ucode_print_common_hdr(const struct common_firmware_header *hdr)
+{
+       DRM_DEBUG("size_bytes: %u\n", le32_to_cpu(hdr->size_bytes));
+       DRM_DEBUG("header_size_bytes: %u\n", le32_to_cpu(hdr->header_size_bytes));
+       DRM_DEBUG("header_version_major: %u\n", le16_to_cpu(hdr->header_version_major));
+       DRM_DEBUG("header_version_minor: %u\n", le16_to_cpu(hdr->header_version_minor));
+       DRM_DEBUG("ip_version_major: %u\n", le16_to_cpu(hdr->ip_version_major));
+       DRM_DEBUG("ip_version_minor: %u\n", le16_to_cpu(hdr->ip_version_minor));
+       DRM_DEBUG("ucode_version: 0x%08x\n", le32_to_cpu(hdr->ucode_version));
+       DRM_DEBUG("ucode_size_bytes: %u\n", le32_to_cpu(hdr->ucode_size_bytes));
+       DRM_DEBUG("ucode_array_offset_bytes: %u\n",
+                 le32_to_cpu(hdr->ucode_array_offset_bytes));
+       DRM_DEBUG("crc32: 0x%08x\n", le32_to_cpu(hdr->crc32));
+}
+
+void radeon_ucode_print_mc_hdr(const struct common_firmware_header *hdr)
+{
+       uint16_t version_major = le16_to_cpu(hdr->header_version_major);
+       uint16_t version_minor = le16_to_cpu(hdr->header_version_minor);
+
+       DRM_DEBUG("MC\n");
+       radeon_ucode_print_common_hdr(hdr);
+
+       if (version_major == 1) {
+               const struct mc_firmware_header_v1_0 *mc_hdr =
+                       container_of(hdr, struct mc_firmware_header_v1_0, header);
+
+               DRM_DEBUG("io_debug_size_bytes: %u\n",
+                         le32_to_cpu(mc_hdr->io_debug_size_bytes));
+               DRM_DEBUG("io_debug_array_offset_bytes: %u\n",
+                         le32_to_cpu(mc_hdr->io_debug_array_offset_bytes));
+       } else {
+               DRM_ERROR("Unknown MC ucode version: %u.%u\n", version_major, version_minor);
+       }
+}
+
+void radeon_ucode_print_smc_hdr(const struct common_firmware_header *hdr)
+{
+       uint16_t version_major = le16_to_cpu(hdr->header_version_major);
+       uint16_t version_minor = le16_to_cpu(hdr->header_version_minor);
+
+       DRM_DEBUG("SMC\n");
+       radeon_ucode_print_common_hdr(hdr);
+
+       if (version_major == 1) {
+               const struct smc_firmware_header_v1_0 *smc_hdr =
+                       container_of(hdr, struct smc_firmware_header_v1_0, header);
+
+               DRM_DEBUG("ucode_start_addr: %u\n", le32_to_cpu(smc_hdr->ucode_start_addr));
+       } else {
+               DRM_ERROR("Unknown SMC ucode version: %u.%u\n", version_major, version_minor);
+       }
+}
+
+void radeon_ucode_print_gfx_hdr(const struct common_firmware_header *hdr)
+{
+       uint16_t version_major = le16_to_cpu(hdr->header_version_major);
+       uint16_t version_minor = le16_to_cpu(hdr->header_version_minor);
+
+       DRM_DEBUG("GFX\n");
+       radeon_ucode_print_common_hdr(hdr);
+
+       if (version_major == 1) {
+               const struct gfx_firmware_header_v1_0 *gfx_hdr =
+                       container_of(hdr, struct gfx_firmware_header_v1_0, header);
+
+               DRM_DEBUG("ucode_feature_version: %u\n",
+                         le32_to_cpu(gfx_hdr->ucode_feature_version));
+               DRM_DEBUG("jt_offset: %u\n", le32_to_cpu(gfx_hdr->jt_offset));
+               DRM_DEBUG("jt_size: %u\n", le32_to_cpu(gfx_hdr->jt_size));
+       } else {
+               DRM_ERROR("Unknown GFX ucode version: %u.%u\n", version_major, version_minor);
+       }
+}
+
+void radeon_ucode_print_rlc_hdr(const struct common_firmware_header *hdr)
+{
+       uint16_t version_major = le16_to_cpu(hdr->header_version_major);
+       uint16_t version_minor = le16_to_cpu(hdr->header_version_minor);
+
+       DRM_DEBUG("RLC\n");
+       radeon_ucode_print_common_hdr(hdr);
+
+       if (version_major == 1) {
+               const struct rlc_firmware_header_v1_0 *rlc_hdr =
+                       container_of(hdr, struct rlc_firmware_header_v1_0, header);
+
+               DRM_DEBUG("ucode_feature_version: %u\n",
+                         le32_to_cpu(rlc_hdr->ucode_feature_version));
+               DRM_DEBUG("save_and_restore_offset: %u\n",
+                         le32_to_cpu(rlc_hdr->save_and_restore_offset));
+               DRM_DEBUG("clear_state_descriptor_offset: %u\n",
+                         le32_to_cpu(rlc_hdr->clear_state_descriptor_offset));
+               DRM_DEBUG("avail_scratch_ram_locations: %u\n",
+                         le32_to_cpu(rlc_hdr->avail_scratch_ram_locations));
+               DRM_DEBUG("master_pkt_description_offset: %u\n",
+                         le32_to_cpu(rlc_hdr->master_pkt_description_offset));
+       } else {
+               DRM_ERROR("Unknown RLC ucode version: %u.%u\n", version_major, version_minor);
+       }
+}
+
+void radeon_ucode_print_sdma_hdr(const struct common_firmware_header *hdr)
+{
+       uint16_t version_major = le16_to_cpu(hdr->header_version_major);
+       uint16_t version_minor = le16_to_cpu(hdr->header_version_minor);
+
+       DRM_DEBUG("SDMA\n");
+       radeon_ucode_print_common_hdr(hdr);
+
+       if (version_major == 1) {
+               const struct sdma_firmware_header_v1_0 *sdma_hdr =
+                       container_of(hdr, struct sdma_firmware_header_v1_0, header);
+
+               DRM_DEBUG("ucode_feature_version: %u\n",
+                         le32_to_cpu(sdma_hdr->ucode_feature_version));
+               DRM_DEBUG("ucode_change_version: %u\n",
+                         le32_to_cpu(sdma_hdr->ucode_change_version));
+               DRM_DEBUG("jt_offset: %u\n", le32_to_cpu(sdma_hdr->jt_offset));
+               DRM_DEBUG("jt_size: %u\n", le32_to_cpu(sdma_hdr->jt_size));
+       } else {
+               DRM_ERROR("Unknown SDMA ucode version: %u.%u\n",
+                         version_major, version_minor);
+       }
+}
+
+int radeon_ucode_validate(const struct firmware *fw)
+{
+       const struct common_firmware_header *hdr =
+               (const struct common_firmware_header *)fw->data;
+
+       if (fw->size == le32_to_cpu(hdr->size_bytes))
+               return 0;
+
+       return -EINVAL;
+}
+
index 4e7c3269b183644ea87c4879d764eac7fb246e80..dc4576e4d8ad161e7a4d59866ac4be9b244ec5c7 100644 (file)
 #define HAWAII_SMC_UCODE_START       0x20000
 #define HAWAII_SMC_UCODE_SIZE        0x1FDEC
 
+struct common_firmware_header {
+       uint32_t size_bytes; /* size of the entire header+image(s) in bytes */
+       uint32_t header_size_bytes; /* size of just the header in bytes */
+       uint16_t header_version_major; /* header version */
+       uint16_t header_version_minor; /* header version */
+       uint16_t ip_version_major; /* IP version */
+       uint16_t ip_version_minor; /* IP version */
+       uint32_t ucode_version;
+       uint32_t ucode_size_bytes; /* size of ucode in bytes */
+       uint32_t ucode_array_offset_bytes; /* payload offset from the start of the header */
+       uint32_t crc32;  /* crc32 checksum of the payload */
+};
+
+/* version_major=1, version_minor=0 */
+struct mc_firmware_header_v1_0 {
+       struct common_firmware_header header;
+       uint32_t io_debug_size_bytes; /* size of debug array in dwords */
+       uint32_t io_debug_array_offset_bytes; /* payload offset from the start of the header */
+};
+
+/* version_major=1, version_minor=0 */
+struct smc_firmware_header_v1_0 {
+       struct common_firmware_header header;
+       uint32_t ucode_start_addr;
+};
+
+/* version_major=1, version_minor=0 */
+struct gfx_firmware_header_v1_0 {
+       struct common_firmware_header header;
+       uint32_t ucode_feature_version;
+       uint32_t jt_offset; /* jt location */
+       uint32_t jt_size;  /* size of jt */
+};
+
+/* version_major=1, version_minor=0 */
+struct rlc_firmware_header_v1_0 {
+       struct common_firmware_header header;
+       uint32_t ucode_feature_version;
+       uint32_t save_and_restore_offset;
+       uint32_t clear_state_descriptor_offset;
+       uint32_t avail_scratch_ram_locations;
+       uint32_t master_pkt_description_offset;
+};
+
+/* version_major=1, version_minor=0 */
+struct sdma_firmware_header_v1_0 {
+       struct common_firmware_header header;
+       uint32_t ucode_feature_version;
+       uint32_t ucode_change_version;
+       uint32_t jt_offset; /* jt location */
+       uint32_t jt_size; /* size of jt */
+};
+
+/* header is fixed size */
+union radeon_firmware_header {
+       struct common_firmware_header common;
+       struct mc_firmware_header_v1_0 mc;
+       struct smc_firmware_header_v1_0 smc;
+       struct gfx_firmware_header_v1_0 gfx;
+       struct rlc_firmware_header_v1_0 rlc;
+       struct sdma_firmware_header_v1_0 sdma;
+       uint8_t raw[0x100];
+};
+
+void radeon_ucode_print_mc_hdr(const struct common_firmware_header *hdr);
+void radeon_ucode_print_smc_hdr(const struct common_firmware_header *hdr);
+void radeon_ucode_print_gfx_hdr(const struct common_firmware_header *hdr);
+void radeon_ucode_print_rlc_hdr(const struct common_firmware_header *hdr);
+void radeon_ucode_print_sdma_hdr(const struct common_firmware_header *hdr);
+int radeon_ucode_validate(const struct firmware *fw);
+
 #endif
index a4ad270e82611b8078711b87df44c44ab3feef26..6bf55ec85b62f7b3ee817356c6167181938a3dc1 100644 (file)
@@ -117,7 +117,7 @@ int radeon_uvd_init(struct radeon_device *rdev)
        bo_size = RADEON_GPU_PAGE_ALIGN(rdev->uvd_fw->size + 8) +
                  RADEON_UVD_STACK_SIZE + RADEON_UVD_HEAP_SIZE;
        r = radeon_bo_create(rdev, bo_size, PAGE_SIZE, true,
-                            RADEON_GEM_DOMAIN_VRAM, NULL, &rdev->uvd.vcpu_bo);
+                            RADEON_GEM_DOMAIN_VRAM, 0, NULL, &rdev->uvd.vcpu_bo);
        if (r) {
                dev_err(rdev->dev, "(%d) failed to allocate UVD bo\n", r);
                return r;
@@ -674,7 +674,7 @@ int radeon_uvd_get_create_msg(struct radeon_device *rdev, int ring,
        int r, i;
 
        r = radeon_bo_create(rdev, 1024, PAGE_SIZE, true,
-                            RADEON_GEM_DOMAIN_VRAM, NULL, &bo);
+                            RADEON_GEM_DOMAIN_VRAM, 0, NULL, &bo);
        if (r)
                return r;
 
@@ -720,7 +720,7 @@ int radeon_uvd_get_destroy_msg(struct radeon_device *rdev, int ring,
        int r, i;
 
        r = radeon_bo_create(rdev, 1024, PAGE_SIZE, true,
-                            RADEON_GEM_DOMAIN_VRAM, NULL, &bo);
+                            RADEON_GEM_DOMAIN_VRAM, 0, NULL, &bo);
        if (r)
                return r;
 
index aa21c31a846cfa597173d308fa889d70ce1cc698..f9b70a43aa524f4ccbcff640e28e0d21573463b6 100644 (file)
@@ -126,7 +126,7 @@ int radeon_vce_init(struct radeon_device *rdev)
        size = RADEON_GPU_PAGE_ALIGN(rdev->vce_fw->size) +
               RADEON_VCE_STACK_SIZE + RADEON_VCE_HEAP_SIZE;
        r = radeon_bo_create(rdev, size, PAGE_SIZE, true,
-                            RADEON_GEM_DOMAIN_VRAM, NULL, &rdev->vce.vcpu_bo);
+                            RADEON_GEM_DOMAIN_VRAM, 0, NULL, &rdev->vce.vcpu_bo);
        if (r) {
                dev_err(rdev->dev, "(%d) failed to allocate VCE bo\n", r);
                return r;
index 725d3669014f8ef2bbd61f637d5e3e98de2772eb..ccae4d9dc3deb6aefc3f131dbd9648c5ea374f1a 100644 (file)
@@ -238,8 +238,8 @@ void radeon_vm_flush(struct radeon_device *rdev,
        uint64_t pd_addr = radeon_bo_gpu_offset(vm->page_directory);
 
        /* if we can't remember our last VM flush then flush now! */
-       /* XXX figure out why we have to flush all the time */
-       if (!vm->last_flush || true || pd_addr != vm->pd_gpu_addr) {
+       if (!vm->last_flush || pd_addr != vm->pd_gpu_addr) {
+               trace_radeon_vm_flush(pd_addr, ring, vm->id);
                vm->pd_gpu_addr = pd_addr;
                radeon_ring_vm_flush(rdev, ring, vm);
        }
@@ -325,23 +325,57 @@ struct radeon_bo_va *radeon_vm_bo_add(struct radeon_device *rdev,
        }
        bo_va->vm = vm;
        bo_va->bo = bo;
-       bo_va->soffset = 0;
-       bo_va->eoffset = 0;
+       bo_va->it.start = 0;
+       bo_va->it.last = 0;
        bo_va->flags = 0;
-       bo_va->valid = false;
+       bo_va->addr = 0;
        bo_va->ref_count = 1;
        INIT_LIST_HEAD(&bo_va->bo_list);
-       INIT_LIST_HEAD(&bo_va->vm_list);
        INIT_LIST_HEAD(&bo_va->vm_status);
 
        mutex_lock(&vm->mutex);
-       list_add(&bo_va->vm_list, &vm->va);
        list_add_tail(&bo_va->bo_list, &bo->va);
        mutex_unlock(&vm->mutex);
 
        return bo_va;
 }
 
+/**
+ * radeon_vm_set_pages - helper to call the right asic function
+ *
+ * @rdev: radeon_device pointer
+ * @ib: indirect buffer to fill with commands
+ * @pe: addr of the page entry
+ * @addr: dst addr to write into pe
+ * @count: number of page entries to update
+ * @incr: increase next addr by incr bytes
+ * @flags: hw access flags
+ *
+ * Traces the parameters and calls the right asic functions
+ * to setup the page table using the DMA.
+ */
+static void radeon_vm_set_pages(struct radeon_device *rdev,
+                               struct radeon_ib *ib,
+                               uint64_t pe,
+                               uint64_t addr, unsigned count,
+                               uint32_t incr, uint32_t flags)
+{
+       trace_radeon_vm_set_page(pe, addr, count, incr, flags);
+
+       if ((flags & R600_PTE_GART_MASK) == R600_PTE_GART_MASK) {
+               uint64_t src = rdev->gart.table_addr + (addr >> 12) * 8;
+               radeon_asic_vm_copy_pages(rdev, ib, pe, src, count);
+
+       } else if ((flags & R600_PTE_SYSTEM) || (count < 3)) {
+               radeon_asic_vm_write_pages(rdev, ib, pe, addr,
+                                          count, incr, flags);
+
+       } else {
+               radeon_asic_vm_set_pages(rdev, ib, pe, addr,
+                                        count, incr, flags);
+       }
+}
+
 /**
  * radeon_vm_clear_bo - initially clear the page dir/table
  *
@@ -376,14 +410,15 @@ static int radeon_vm_clear_bo(struct radeon_device *rdev,
        addr = radeon_bo_gpu_offset(bo);
        entries = radeon_bo_size(bo) / 8;
 
-       r = radeon_ib_get(rdev, R600_RING_TYPE_DMA_INDEX, &ib,
-                         NULL, entries * 2 + 64);
+       r = radeon_ib_get(rdev, R600_RING_TYPE_DMA_INDEX, &ib, NULL, 256);
        if (r)
                 goto error;
 
        ib.length_dw = 0;
 
-       radeon_asic_vm_set_page(rdev, &ib, addr, 0, entries, 0, 0);
+       radeon_vm_set_pages(rdev, &ib, addr, 0, entries, 0, 0);
+       radeon_asic_vm_pad_ib(rdev, &ib);
+       WARN_ON(ib.length_dw > 64);
 
        r = radeon_ib_schedule(rdev, &ib, NULL);
        if (r)
@@ -419,11 +454,9 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
                          uint32_t flags)
 {
        uint64_t size = radeon_bo_size(bo_va->bo);
-       uint64_t eoffset, last_offset = 0;
        struct radeon_vm *vm = bo_va->vm;
-       struct radeon_bo_va *tmp;
-       struct list_head *head;
        unsigned last_pfn, pt_idx;
+       uint64_t eoffset;
        int r;
 
        if (soffset) {
@@ -445,51 +478,49 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
        }
 
        mutex_lock(&vm->mutex);
-       head = &vm->va;
-       last_offset = 0;
-       list_for_each_entry(tmp, &vm->va, vm_list) {
-               if (bo_va == tmp) {
-                       /* skip over currently modified bo */
-                       continue;
+       if (bo_va->it.start || bo_va->it.last) {
+               if (bo_va->addr) {
+                       /* add a clone of the bo_va to clear the old address */
+                       struct radeon_bo_va *tmp;
+                       tmp = kzalloc(sizeof(struct radeon_bo_va), GFP_KERNEL);
+                       tmp->it.start = bo_va->it.start;
+                       tmp->it.last = bo_va->it.last;
+                       tmp->vm = vm;
+                       tmp->addr = bo_va->addr;
+                       tmp->bo = radeon_bo_ref(bo_va->bo);
+                       list_add(&tmp->vm_status, &vm->freed);
                }
 
-               if (soffset >= last_offset && eoffset <= tmp->soffset) {
-                       /* bo can be added before this one */
-                       break;
-               }
-               if (eoffset > tmp->soffset && soffset < tmp->eoffset) {
-                       /* bo and tmp overlap, invalid offset */
-                       dev_err(rdev->dev, "bo %p va 0x%08X conflict with (bo %p 0x%08X 0x%08X)\n",
-                               bo_va->bo, (unsigned)bo_va->soffset, tmp->bo,
-                               (unsigned)tmp->soffset, (unsigned)tmp->eoffset);
-                       mutex_unlock(&vm->mutex);
-                       return -EINVAL;
-               }
-               last_offset = tmp->eoffset;
-               head = &tmp->vm_list;
+               interval_tree_remove(&bo_va->it, &vm->va);
+               bo_va->it.start = 0;
+               bo_va->it.last = 0;
        }
 
-       if (bo_va->soffset) {
-               /* add a clone of the bo_va to clear the old address */
-               tmp = kzalloc(sizeof(struct radeon_bo_va), GFP_KERNEL);
-               if (!tmp) {
+       soffset /= RADEON_GPU_PAGE_SIZE;
+       eoffset /= RADEON_GPU_PAGE_SIZE;
+       if (soffset || eoffset) {
+               struct interval_tree_node *it;
+               it = interval_tree_iter_first(&vm->va, soffset, eoffset - 1);
+               if (it) {
+                       struct radeon_bo_va *tmp;
+                       tmp = container_of(it, struct radeon_bo_va, it);
+                       /* bo and tmp overlap, invalid offset */
+                       dev_err(rdev->dev, "bo %p va 0x%010Lx conflict with "
+                               "(bo %p 0x%010lx 0x%010lx)\n", bo_va->bo,
+                               soffset, tmp->bo, tmp->it.start, tmp->it.last);
                        mutex_unlock(&vm->mutex);
-                       return -ENOMEM;
+                       return -EINVAL;
                }
-               tmp->soffset = bo_va->soffset;
-               tmp->eoffset = bo_va->eoffset;
-               tmp->vm = vm;
-               list_add(&tmp->vm_status, &vm->freed);
+               bo_va->it.start = soffset;
+               bo_va->it.last = eoffset - 1;
+               interval_tree_insert(&bo_va->it, &vm->va);
        }
 
-       bo_va->soffset = soffset;
-       bo_va->eoffset = eoffset;
        bo_va->flags = flags;
-       bo_va->valid = false;
-       list_move(&bo_va->vm_list, head);
+       bo_va->addr = 0;
 
-       soffset = (soffset / RADEON_GPU_PAGE_SIZE) >> radeon_vm_block_size;
-       eoffset = (eoffset / RADEON_GPU_PAGE_SIZE) >> radeon_vm_block_size;
+       soffset >>= radeon_vm_block_size;
+       eoffset >>= radeon_vm_block_size;
 
        BUG_ON(eoffset >= radeon_vm_num_pdes(rdev));
 
@@ -510,7 +541,7 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
 
                r = radeon_bo_create(rdev, RADEON_VM_PTE_COUNT * 8,
                                     RADEON_GPU_PAGE_SIZE, true,
-                                    RADEON_GEM_DOMAIN_VRAM, NULL, &pt);
+                                    RADEON_GEM_DOMAIN_VRAM, 0, NULL, &pt);
                if (r)
                        return r;
 
@@ -611,7 +642,7 @@ int radeon_vm_update_page_directory(struct radeon_device *rdev,
        ndw = 64;
 
        /* assume the worst case */
-       ndw += vm->max_pde_used * 16;
+       ndw += vm->max_pde_used * 6;
 
        /* update too big for an IB */
        if (ndw > 0xfffff)
@@ -640,9 +671,9 @@ int radeon_vm_update_page_directory(struct radeon_device *rdev,
                    ((last_pt + incr * count) != pt)) {
 
                        if (count) {
-                               radeon_asic_vm_set_page(rdev, &ib, last_pde,
-                                                       last_pt, count, incr,
-                                                       R600_PTE_VALID);
+                               radeon_vm_set_pages(rdev, &ib, last_pde,
+                                                   last_pt, count, incr,
+                                                   R600_PTE_VALID);
                        }
 
                        count = 1;
@@ -654,12 +685,14 @@ int radeon_vm_update_page_directory(struct radeon_device *rdev,
        }
 
        if (count)
-               radeon_asic_vm_set_page(rdev, &ib, last_pde, last_pt, count,
-                                       incr, R600_PTE_VALID);
+               radeon_vm_set_pages(rdev, &ib, last_pde, last_pt, count,
+                                   incr, R600_PTE_VALID);
 
        if (ib.length_dw != 0) {
+               radeon_asic_vm_pad_ib(rdev, &ib);
                radeon_semaphore_sync_to(ib.semaphore, pd->tbo.sync_obj);
                radeon_semaphore_sync_to(ib.semaphore, vm->last_id_use);
+               WARN_ON(ib.length_dw > ndw);
                r = radeon_ib_schedule(rdev, &ib, NULL);
                if (r) {
                        radeon_ib_free(rdev, &ib);
@@ -725,30 +758,30 @@ static void radeon_vm_frag_ptes(struct radeon_device *rdev,
            (frag_start >= frag_end)) {
 
                count = (pe_end - pe_start) / 8;
-               radeon_asic_vm_set_page(rdev, ib, pe_start, addr, count,
-                                       RADEON_GPU_PAGE_SIZE, flags);
+               radeon_vm_set_pages(rdev, ib, pe_start, addr, count,
+                                   RADEON_GPU_PAGE_SIZE, flags);
                return;
        }
 
        /* handle the 4K area at the beginning */
        if (pe_start != frag_start) {
                count = (frag_start - pe_start) / 8;
-               radeon_asic_vm_set_page(rdev, ib, pe_start, addr, count,
-                                       RADEON_GPU_PAGE_SIZE, flags);
+               radeon_vm_set_pages(rdev, ib, pe_start, addr, count,
+                                   RADEON_GPU_PAGE_SIZE, flags);
                addr += RADEON_GPU_PAGE_SIZE * count;
        }
 
        /* handle the area in the middle */
        count = (frag_end - frag_start) / 8;
-       radeon_asic_vm_set_page(rdev, ib, frag_start, addr, count,
-                               RADEON_GPU_PAGE_SIZE, flags | frag_flags);
+       radeon_vm_set_pages(rdev, ib, frag_start, addr, count,
+                           RADEON_GPU_PAGE_SIZE, flags | frag_flags);
 
        /* handle the 4K area at the end */
        if (frag_end != pe_end) {
                addr += RADEON_GPU_PAGE_SIZE * count;
                count = (pe_end - frag_end) / 8;
-               radeon_asic_vm_set_page(rdev, ib, frag_end, addr, count,
-                                       RADEON_GPU_PAGE_SIZE, flags);
+               radeon_vm_set_pages(rdev, ib, frag_end, addr, count,
+                                   RADEON_GPU_PAGE_SIZE, flags);
        }
 }
 
@@ -777,9 +810,6 @@ static void radeon_vm_update_ptes(struct radeon_device *rdev,
        unsigned count = 0;
        uint64_t addr;
 
-       start = start / RADEON_GPU_PAGE_SIZE;
-       end = end / RADEON_GPU_PAGE_SIZE;
-
        /* walk over the address space and update the page tables */
        for (addr = start; addr < end; ) {
                uint64_t pt_idx = addr >> radeon_vm_block_size;
@@ -842,55 +872,73 @@ int radeon_vm_bo_update(struct radeon_device *rdev,
 {
        struct radeon_vm *vm = bo_va->vm;
        struct radeon_ib ib;
-       unsigned nptes, ndw;
+       unsigned nptes, ncmds, ndw;
        uint64_t addr;
+       uint32_t flags;
        int r;
 
-
-       if (!bo_va->soffset) {
+       if (!bo_va->it.start) {
                dev_err(rdev->dev, "bo %p don't has a mapping in vm %p\n",
                        bo_va->bo, vm);
                return -EINVAL;
        }
 
-       if ((bo_va->valid && mem) || (!bo_va->valid && mem == NULL))
-               return 0;
+       list_del_init(&bo_va->vm_status);
 
        bo_va->flags &= ~RADEON_VM_PAGE_VALID;
        bo_va->flags &= ~RADEON_VM_PAGE_SYSTEM;
+       bo_va->flags &= ~RADEON_VM_PAGE_SNOOPED;
        if (mem) {
                addr = mem->start << PAGE_SHIFT;
                if (mem->mem_type != TTM_PL_SYSTEM) {
                        bo_va->flags |= RADEON_VM_PAGE_VALID;
-                       bo_va->valid = true;
                }
                if (mem->mem_type == TTM_PL_TT) {
                        bo_va->flags |= RADEON_VM_PAGE_SYSTEM;
+                       if (!(bo_va->bo->flags & (RADEON_GEM_GTT_WC | RADEON_GEM_GTT_UC)))
+                               bo_va->flags |= RADEON_VM_PAGE_SNOOPED;
+
                } else {
                        addr += rdev->vm_manager.vram_base_offset;
                }
        } else {
                addr = 0;
-               bo_va->valid = false;
        }
 
+       if (addr == bo_va->addr)
+               return 0;
+       bo_va->addr = addr;
+
        trace_radeon_vm_bo_update(bo_va);
 
-       nptes = (bo_va->eoffset - bo_va->soffset) / RADEON_GPU_PAGE_SIZE;
+       nptes = bo_va->it.last - bo_va->it.start + 1;
+
+       /* reserve space for one command every (1 << BLOCK_SIZE) entries
+          or 2k dwords (whatever is smaller) */
+       ncmds = (nptes >> min(radeon_vm_block_size, 11)) + 1;
 
        /* padding, etc. */
        ndw = 64;
 
-       if (radeon_vm_block_size > 11)
-               /* reserve space for one header for every 2k dwords */
-               ndw += (nptes >> 11) * 4;
-       else
-               /* reserve space for one header for
-                   every (1 << BLOCK_SIZE) entries */
-               ndw += (nptes >> radeon_vm_block_size) * 4;
+       flags = radeon_vm_page_flags(bo_va->flags);
+       if ((flags & R600_PTE_GART_MASK) == R600_PTE_GART_MASK) {
+               /* only copy commands needed */
+               ndw += ncmds * 7;
 
-       /* reserve space for pte addresses */
-       ndw += nptes * 2;
+       } else if (flags & R600_PTE_SYSTEM) {
+               /* header for write data commands */
+               ndw += ncmds * 4;
+
+               /* body of write data command */
+               ndw += nptes * 2;
+
+       } else {
+               /* set page commands needed */
+               ndw += ncmds * 10;
+
+               /* two extra commands for begin/end of fragment */
+               ndw += 2 * 10;
+       }
 
        /* update too big for an IB */
        if (ndw > 0xfffff)
@@ -901,8 +949,12 @@ int radeon_vm_bo_update(struct radeon_device *rdev,
                return r;
        ib.length_dw = 0;
 
-       radeon_vm_update_ptes(rdev, vm, &ib, bo_va->soffset, bo_va->eoffset,
-                             addr, radeon_vm_page_flags(bo_va->flags));
+       radeon_vm_update_ptes(rdev, vm, &ib, bo_va->it.start,
+                             bo_va->it.last + 1, addr,
+                             radeon_vm_page_flags(bo_va->flags));
+
+       radeon_asic_vm_pad_ib(rdev, &ib);
+       WARN_ON(ib.length_dw > ndw);
 
        radeon_semaphore_sync_to(ib.semaphore, vm->fence);
        r = radeon_ib_schedule(rdev, &ib, NULL);
@@ -936,8 +988,8 @@ int radeon_vm_clear_freed(struct radeon_device *rdev,
        int r;
 
        list_for_each_entry_safe(bo_va, tmp, &vm->freed, vm_status) {
-               list_del(&bo_va->vm_status);
                r = radeon_vm_bo_update(rdev, bo_va, NULL);
+               radeon_bo_unref(&bo_va->bo);
                kfree(bo_va);
                if (r)
                        return r;
@@ -946,6 +998,31 @@ int radeon_vm_clear_freed(struct radeon_device *rdev,
 
 }
 
+/**
+ * radeon_vm_clear_invalids - clear invalidated BOs in the PT
+ *
+ * @rdev: radeon_device pointer
+ * @vm: requested vm
+ *
+ * Make sure all invalidated BOs are cleared in the PT.
+ * Returns 0 for success.
+ *
+ * PTs have to be reserved and mutex must be locked!
+ */
+int radeon_vm_clear_invalids(struct radeon_device *rdev,
+                            struct radeon_vm *vm)
+{
+       struct radeon_bo_va *bo_va, *tmp;
+       int r;
+
+       list_for_each_entry_safe(bo_va, tmp, &vm->invalidated, vm_status) {
+               r = radeon_vm_bo_update(rdev, bo_va, NULL);
+               if (r)
+                       return r;
+       }
+       return 0;
+}
+
 /**
  * radeon_vm_bo_rmv - remove a bo to a specific vm
  *
@@ -964,10 +1041,11 @@ void radeon_vm_bo_rmv(struct radeon_device *rdev,
        list_del(&bo_va->bo_list);
 
        mutex_lock(&vm->mutex);
-       list_del(&bo_va->vm_list);
+       interval_tree_remove(&bo_va->it, &vm->va);
+       list_del(&bo_va->vm_status);
 
-       if (bo_va->soffset) {
-               bo_va->bo = NULL;
+       if (bo_va->addr) {
+               bo_va->bo = radeon_bo_ref(bo_va->bo);
                list_add(&bo_va->vm_status, &vm->freed);
        } else {
                kfree(bo_va);
@@ -991,7 +1069,12 @@ void radeon_vm_bo_invalidate(struct radeon_device *rdev,
        struct radeon_bo_va *bo_va;
 
        list_for_each_entry(bo_va, &bo->va, bo_list) {
-               bo_va->valid = false;
+               if (bo_va->addr) {
+                       mutex_lock(&bo_va->vm->mutex);
+                       list_del(&bo_va->vm_status);
+                       list_add(&bo_va->vm_status, &bo_va->vm->invalidated);
+                       mutex_unlock(&bo_va->vm->mutex);
+               }
        }
 }
 
@@ -1016,7 +1099,8 @@ int radeon_vm_init(struct radeon_device *rdev, struct radeon_vm *vm)
        vm->last_flush = NULL;
        vm->last_id_use = NULL;
        mutex_init(&vm->mutex);
-       INIT_LIST_HEAD(&vm->va);
+       vm->va = RB_ROOT;
+       INIT_LIST_HEAD(&vm->invalidated);
        INIT_LIST_HEAD(&vm->freed);
 
        pd_size = radeon_vm_directory_size(rdev);
@@ -1031,7 +1115,7 @@ int radeon_vm_init(struct radeon_device *rdev, struct radeon_vm *vm)
        }
 
        r = radeon_bo_create(rdev, pd_size, align, true,
-                            RADEON_GEM_DOMAIN_VRAM, NULL,
+                            RADEON_GEM_DOMAIN_VRAM, 0, NULL,
                             &vm->page_directory);
        if (r)
                return r;
@@ -1060,11 +1144,11 @@ void radeon_vm_fini(struct radeon_device *rdev, struct radeon_vm *vm)
        struct radeon_bo_va *bo_va, *tmp;
        int i, r;
 
-       if (!list_empty(&vm->va)) {
+       if (!RB_EMPTY_ROOT(&vm->va)) {
                dev_err(rdev->dev, "still active bo inside vm\n");
        }
-       list_for_each_entry_safe(bo_va, tmp, &vm->va, vm_list) {
-               list_del_init(&bo_va->vm_list);
+       rbtree_postorder_for_each_entry_safe(bo_va, tmp, &vm->va, it.rb) {
+               interval_tree_remove(&bo_va->it, &vm->va);
                r = radeon_bo_reserve(bo_va->bo, false);
                if (!r) {
                        list_del_init(&bo_va->bo_list);
@@ -1072,8 +1156,10 @@ void radeon_vm_fini(struct radeon_device *rdev, struct radeon_vm *vm)
                        kfree(bo_va);
                }
        }
-       list_for_each_entry_safe(bo_va, tmp, &vm->freed, vm_status)
+       list_for_each_entry_safe(bo_va, tmp, &vm->freed, vm_status) {
+               radeon_bo_unref(&bo_va->bo);
                kfree(bo_va);
+       }
 
        for (i = 0; i < radeon_vm_num_pdes(rdev); i++)
                radeon_bo_unref(&vm->page_tables[i].bo);
index a0f96decece3c31def216611c9bab18fa836c464..6c1fc339d228142fe09de798a62ad4df8880959b 100644 (file)
@@ -109,7 +109,6 @@ int rs400_gart_enable(struct radeon_device *rdev)
        uint32_t size_reg;
        uint32_t tmp;
 
-       radeon_gart_restore(rdev);
        tmp = RREG32_MC(RS690_AIC_CTRL_SCRATCH);
        tmp |= RS690_DIS_OUT_OF_PCI_GART_ACCESS;
        WREG32_MC(RS690_AIC_CTRL_SCRATCH, tmp);
@@ -209,17 +208,24 @@ void rs400_gart_fini(struct radeon_device *rdev)
        radeon_gart_table_ram_free(rdev);
 }
 
+#define RS400_PTE_UNSNOOPED (1 << 0)
 #define RS400_PTE_WRITEABLE (1 << 2)
 #define RS400_PTE_READABLE  (1 << 3)
 
-void rs400_gart_set_page(struct radeon_device *rdev, unsigned i, uint64_t addr)
+void rs400_gart_set_page(struct radeon_device *rdev, unsigned i,
+                        uint64_t addr, uint32_t flags)
 {
        uint32_t entry;
        u32 *gtt = rdev->gart.ptr;
 
        entry = (lower_32_bits(addr) & PAGE_MASK) |
-               ((upper_32_bits(addr) & 0xff) << 4) |
-               RS400_PTE_WRITEABLE | RS400_PTE_READABLE;
+               ((upper_32_bits(addr) & 0xff) << 4);
+       if (flags & RADEON_GART_PAGE_READ)
+               addr |= RS400_PTE_READABLE;
+       if (flags & RADEON_GART_PAGE_WRITE)
+               addr |= RS400_PTE_WRITEABLE;
+       if (!(flags & RADEON_GART_PAGE_SNOOP))
+               entry |= RS400_PTE_UNSNOOPED;
        entry = cpu_to_le32(entry);
        gtt[i] = entry;
 }
index d1a35cb1c91d4b6bc60e18482018612a323489a3..5f6db4629aaa4c04172fe092a0375a3a2a5d354f 100644 (file)
@@ -555,7 +555,6 @@ static int rs600_gart_enable(struct radeon_device *rdev)
        r = radeon_gart_table_vram_pin(rdev);
        if (r)
                return r;
-       radeon_gart_restore(rdev);
        /* Enable bus master */
        tmp = RREG32(RADEON_BUS_CNTL) & ~RS600_BUS_MASTER_DIS;
        WREG32(RADEON_BUS_CNTL, tmp);
@@ -626,15 +625,21 @@ static void rs600_gart_fini(struct radeon_device *rdev)
        radeon_gart_table_vram_free(rdev);
 }
 
-void rs600_gart_set_page(struct radeon_device *rdev, unsigned i, uint64_t addr)
+void rs600_gart_set_page(struct radeon_device *rdev, unsigned i,
+                        uint64_t addr, uint32_t flags)
 {
        void __iomem *ptr = (void *)rdev->gart.ptr;
 
        addr = addr & 0xFFFFFFFFFFFFF000ULL;
-       if (addr == rdev->dummy_page.addr)
-               addr |= R600_PTE_SYSTEM | R600_PTE_SNOOPED;
-       else
-               addr |= R600_PTE_GART;
+       addr |= R600_PTE_SYSTEM;
+       if (flags & RADEON_GART_PAGE_VALID)
+               addr |= R600_PTE_VALID;
+       if (flags & RADEON_GART_PAGE_READ)
+               addr |= R600_PTE_READABLE;
+       if (flags & RADEON_GART_PAGE_WRITE)
+               addr |= R600_PTE_WRITEABLE;
+       if (flags & RADEON_GART_PAGE_SNOOP)
+               addr |= R600_PTE_SNOOPED;
        writeq(addr, ptr + (i * 8));
 }
 
index da8703d8d4559920dd382164bee462bddacb89c0..2983f17ea1b38399ab649dbb965cae291e6d9b82 100644 (file)
@@ -900,7 +900,6 @@ static int rv770_pcie_gart_enable(struct radeon_device *rdev)
        r = radeon_gart_table_vram_pin(rdev);
        if (r)
                return r;
-       radeon_gart_restore(rdev);
        /* Setup L2 cache */
        WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING |
                                ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
index 9e854fd016dabac99c081896209ce9f732dc34f0..011779bd2b3da677129b38709742f673bbaa3398 100644 (file)
@@ -42,6 +42,14 @@ MODULE_FIRMWARE("radeon/TAHITI_mc.bin");
 MODULE_FIRMWARE("radeon/TAHITI_mc2.bin");
 MODULE_FIRMWARE("radeon/TAHITI_rlc.bin");
 MODULE_FIRMWARE("radeon/TAHITI_smc.bin");
+
+MODULE_FIRMWARE("radeon/tahiti_pfp.bin");
+MODULE_FIRMWARE("radeon/tahiti_me.bin");
+MODULE_FIRMWARE("radeon/tahiti_ce.bin");
+MODULE_FIRMWARE("radeon/tahiti_mc.bin");
+MODULE_FIRMWARE("radeon/tahiti_rlc.bin");
+MODULE_FIRMWARE("radeon/tahiti_smc.bin");
+
 MODULE_FIRMWARE("radeon/PITCAIRN_pfp.bin");
 MODULE_FIRMWARE("radeon/PITCAIRN_me.bin");
 MODULE_FIRMWARE("radeon/PITCAIRN_ce.bin");
@@ -49,6 +57,14 @@ MODULE_FIRMWARE("radeon/PITCAIRN_mc.bin");
 MODULE_FIRMWARE("radeon/PITCAIRN_mc2.bin");
 MODULE_FIRMWARE("radeon/PITCAIRN_rlc.bin");
 MODULE_FIRMWARE("radeon/PITCAIRN_smc.bin");
+
+MODULE_FIRMWARE("radeon/pitcairn_pfp.bin");
+MODULE_FIRMWARE("radeon/pitcairn_me.bin");
+MODULE_FIRMWARE("radeon/pitcairn_ce.bin");
+MODULE_FIRMWARE("radeon/pitcairn_mc.bin");
+MODULE_FIRMWARE("radeon/pitcairn_rlc.bin");
+MODULE_FIRMWARE("radeon/pitcairn_smc.bin");
+
 MODULE_FIRMWARE("radeon/VERDE_pfp.bin");
 MODULE_FIRMWARE("radeon/VERDE_me.bin");
 MODULE_FIRMWARE("radeon/VERDE_ce.bin");
@@ -56,6 +72,14 @@ MODULE_FIRMWARE("radeon/VERDE_mc.bin");
 MODULE_FIRMWARE("radeon/VERDE_mc2.bin");
 MODULE_FIRMWARE("radeon/VERDE_rlc.bin");
 MODULE_FIRMWARE("radeon/VERDE_smc.bin");
+
+MODULE_FIRMWARE("radeon/verde_pfp.bin");
+MODULE_FIRMWARE("radeon/verde_me.bin");
+MODULE_FIRMWARE("radeon/verde_ce.bin");
+MODULE_FIRMWARE("radeon/verde_mc.bin");
+MODULE_FIRMWARE("radeon/verde_rlc.bin");
+MODULE_FIRMWARE("radeon/verde_smc.bin");
+
 MODULE_FIRMWARE("radeon/OLAND_pfp.bin");
 MODULE_FIRMWARE("radeon/OLAND_me.bin");
 MODULE_FIRMWARE("radeon/OLAND_ce.bin");
@@ -63,6 +87,14 @@ MODULE_FIRMWARE("radeon/OLAND_mc.bin");
 MODULE_FIRMWARE("radeon/OLAND_mc2.bin");
 MODULE_FIRMWARE("radeon/OLAND_rlc.bin");
 MODULE_FIRMWARE("radeon/OLAND_smc.bin");
+
+MODULE_FIRMWARE("radeon/oland_pfp.bin");
+MODULE_FIRMWARE("radeon/oland_me.bin");
+MODULE_FIRMWARE("radeon/oland_ce.bin");
+MODULE_FIRMWARE("radeon/oland_mc.bin");
+MODULE_FIRMWARE("radeon/oland_rlc.bin");
+MODULE_FIRMWARE("radeon/oland_smc.bin");
+
 MODULE_FIRMWARE("radeon/HAINAN_pfp.bin");
 MODULE_FIRMWARE("radeon/HAINAN_me.bin");
 MODULE_FIRMWARE("radeon/HAINAN_ce.bin");
@@ -71,6 +103,13 @@ MODULE_FIRMWARE("radeon/HAINAN_mc2.bin");
 MODULE_FIRMWARE("radeon/HAINAN_rlc.bin");
 MODULE_FIRMWARE("radeon/HAINAN_smc.bin");
 
+MODULE_FIRMWARE("radeon/hainan_pfp.bin");
+MODULE_FIRMWARE("radeon/hainan_me.bin");
+MODULE_FIRMWARE("radeon/hainan_ce.bin");
+MODULE_FIRMWARE("radeon/hainan_mc.bin");
+MODULE_FIRMWARE("radeon/hainan_rlc.bin");
+MODULE_FIRMWARE("radeon/hainan_smc.bin");
+
 static u32 si_get_cu_active_bitmap(struct radeon_device *rdev, u32 se, u32 sh);
 static void si_pcie_gen3_enable(struct radeon_device *rdev);
 static void si_program_aspm(struct radeon_device *rdev);
@@ -1470,38 +1509,54 @@ static const u32 hainan_io_mc_regs[TAHITI_IO_MC_REGS_SIZE][2] = {
 /* ucode loading */
 int si_mc_load_microcode(struct radeon_device *rdev)
 {
-       const __be32 *fw_data;
+       const __be32 *fw_data = NULL;
+       const __le32 *new_fw_data = NULL;
        u32 running, blackout = 0;
-       u32 *io_mc_regs;
+       u32 *io_mc_regs = NULL;
+       const __le32 *new_io_mc_regs = NULL;
        int i, regs_size, ucode_size;
 
        if (!rdev->mc_fw)
                return -EINVAL;
 
-       ucode_size = rdev->mc_fw->size / 4;
+       if (rdev->new_fw) {
+               const struct mc_firmware_header_v1_0 *hdr =
+                       (const struct mc_firmware_header_v1_0 *)rdev->mc_fw->data;
+
+               radeon_ucode_print_mc_hdr(&hdr->header);
+               regs_size = le32_to_cpu(hdr->io_debug_size_bytes) / (4 * 2);
+               new_io_mc_regs = (const __le32 *)
+                       (rdev->mc_fw->data + le32_to_cpu(hdr->io_debug_array_offset_bytes));
+               ucode_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4;
+               new_fw_data = (const __le32 *)
+                       (rdev->mc_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
+       } else {
+               ucode_size = rdev->mc_fw->size / 4;
 
-       switch (rdev->family) {
-       case CHIP_TAHITI:
-               io_mc_regs = (u32 *)&tahiti_io_mc_regs;
-               regs_size = TAHITI_IO_MC_REGS_SIZE;
-               break;
-       case CHIP_PITCAIRN:
-               io_mc_regs = (u32 *)&pitcairn_io_mc_regs;
-               regs_size = TAHITI_IO_MC_REGS_SIZE;
-               break;
-       case CHIP_VERDE:
-       default:
-               io_mc_regs = (u32 *)&verde_io_mc_regs;
-               regs_size = TAHITI_IO_MC_REGS_SIZE;
-               break;
-       case CHIP_OLAND:
-               io_mc_regs = (u32 *)&oland_io_mc_regs;
-               regs_size = TAHITI_IO_MC_REGS_SIZE;
-               break;
-       case CHIP_HAINAN:
-               io_mc_regs = (u32 *)&hainan_io_mc_regs;
-               regs_size = TAHITI_IO_MC_REGS_SIZE;
-               break;
+               switch (rdev->family) {
+               case CHIP_TAHITI:
+                       io_mc_regs = (u32 *)&tahiti_io_mc_regs;
+                       regs_size = TAHITI_IO_MC_REGS_SIZE;
+                       break;
+               case CHIP_PITCAIRN:
+                       io_mc_regs = (u32 *)&pitcairn_io_mc_regs;
+                       regs_size = TAHITI_IO_MC_REGS_SIZE;
+                       break;
+               case CHIP_VERDE:
+               default:
+                       io_mc_regs = (u32 *)&verde_io_mc_regs;
+                       regs_size = TAHITI_IO_MC_REGS_SIZE;
+                       break;
+               case CHIP_OLAND:
+                       io_mc_regs = (u32 *)&oland_io_mc_regs;
+                       regs_size = TAHITI_IO_MC_REGS_SIZE;
+                       break;
+               case CHIP_HAINAN:
+                       io_mc_regs = (u32 *)&hainan_io_mc_regs;
+                       regs_size = TAHITI_IO_MC_REGS_SIZE;
+                       break;
+               }
+               fw_data = (const __be32 *)rdev->mc_fw->data;
        }
 
        running = RREG32(MC_SEQ_SUP_CNTL) & RUN_MASK;
@@ -1518,13 +1573,21 @@ int si_mc_load_microcode(struct radeon_device *rdev)
 
                /* load mc io regs */
                for (i = 0; i < regs_size; i++) {
-                       WREG32(MC_SEQ_IO_DEBUG_INDEX, io_mc_regs[(i << 1)]);
-                       WREG32(MC_SEQ_IO_DEBUG_DATA, io_mc_regs[(i << 1) + 1]);
+                       if (rdev->new_fw) {
+                               WREG32(MC_SEQ_IO_DEBUG_INDEX, le32_to_cpup(new_io_mc_regs++));
+                               WREG32(MC_SEQ_IO_DEBUG_DATA, le32_to_cpup(new_io_mc_regs++));
+                       } else {
+                               WREG32(MC_SEQ_IO_DEBUG_INDEX, io_mc_regs[(i << 1)]);
+                               WREG32(MC_SEQ_IO_DEBUG_DATA, io_mc_regs[(i << 1) + 1]);
+                       }
                }
                /* load the MC ucode */
-               fw_data = (const __be32 *)rdev->mc_fw->data;
-               for (i = 0; i < ucode_size; i++)
-                       WREG32(MC_SEQ_SUP_PGM, be32_to_cpup(fw_data++));
+               for (i = 0; i < ucode_size; i++) {
+                       if (rdev->new_fw)
+                               WREG32(MC_SEQ_SUP_PGM, le32_to_cpup(new_fw_data++));
+                       else
+                               WREG32(MC_SEQ_SUP_PGM, be32_to_cpup(fw_data++));
+               }
 
                /* put the engine back into the active state */
                WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
@@ -1553,18 +1616,19 @@ int si_mc_load_microcode(struct radeon_device *rdev)
 static int si_init_microcode(struct radeon_device *rdev)
 {
        const char *chip_name;
-       const char *rlc_chip_name;
+       const char *new_chip_name;
        size_t pfp_req_size, me_req_size, ce_req_size, rlc_req_size, mc_req_size;
        size_t smc_req_size, mc2_req_size;
        char fw_name[30];
        int err;
+       int new_fw = 0;
 
        DRM_DEBUG("\n");
 
        switch (rdev->family) {
        case CHIP_TAHITI:
                chip_name = "TAHITI";
-               rlc_chip_name = "TAHITI";
+               new_chip_name = "tahiti";
                pfp_req_size = SI_PFP_UCODE_SIZE * 4;
                me_req_size = SI_PM4_UCODE_SIZE * 4;
                ce_req_size = SI_CE_UCODE_SIZE * 4;
@@ -1575,7 +1639,7 @@ static int si_init_microcode(struct radeon_device *rdev)
                break;
        case CHIP_PITCAIRN:
                chip_name = "PITCAIRN";
-               rlc_chip_name = "PITCAIRN";
+               new_chip_name = "pitcairn";
                pfp_req_size = SI_PFP_UCODE_SIZE * 4;
                me_req_size = SI_PM4_UCODE_SIZE * 4;
                ce_req_size = SI_CE_UCODE_SIZE * 4;
@@ -1586,7 +1650,7 @@ static int si_init_microcode(struct radeon_device *rdev)
                break;
        case CHIP_VERDE:
                chip_name = "VERDE";
-               rlc_chip_name = "VERDE";
+               new_chip_name = "verde";
                pfp_req_size = SI_PFP_UCODE_SIZE * 4;
                me_req_size = SI_PM4_UCODE_SIZE * 4;
                ce_req_size = SI_CE_UCODE_SIZE * 4;
@@ -1597,7 +1661,7 @@ static int si_init_microcode(struct radeon_device *rdev)
                break;
        case CHIP_OLAND:
                chip_name = "OLAND";
-               rlc_chip_name = "OLAND";
+               new_chip_name = "oland";
                pfp_req_size = SI_PFP_UCODE_SIZE * 4;
                me_req_size = SI_PM4_UCODE_SIZE * 4;
                ce_req_size = SI_CE_UCODE_SIZE * 4;
@@ -1607,7 +1671,7 @@ static int si_init_microcode(struct radeon_device *rdev)
                break;
        case CHIP_HAINAN:
                chip_name = "HAINAN";
-               rlc_chip_name = "HAINAN";
+               new_chip_name = "hainan";
                pfp_req_size = SI_PFP_UCODE_SIZE * 4;
                me_req_size = SI_PM4_UCODE_SIZE * 4;
                ce_req_size = SI_CE_UCODE_SIZE * 4;
@@ -1618,86 +1682,178 @@ static int si_init_microcode(struct radeon_device *rdev)
        default: BUG();
        }
 
-       DRM_INFO("Loading %s Microcode\n", chip_name);
+       DRM_INFO("Loading %s Microcode\n", new_chip_name);
 
-       snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name);
+       snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", new_chip_name);
        err = request_firmware(&rdev->pfp_fw, fw_name, rdev->dev);
-       if (err)
-               goto out;
-       if (rdev->pfp_fw->size != pfp_req_size) {
-               printk(KERN_ERR
-                      "si_cp: Bogus length %zu in firmware \"%s\"\n",
-                      rdev->pfp_fw->size, fw_name);
-               err = -EINVAL;
-               goto out;
+       if (err) {
+               snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name);
+               err = request_firmware(&rdev->pfp_fw, fw_name, rdev->dev);
+               if (err)
+                       goto out;
+               if (rdev->pfp_fw->size != pfp_req_size) {
+                       printk(KERN_ERR
+                              "si_cp: Bogus length %zu in firmware \"%s\"\n",
+                              rdev->pfp_fw->size, fw_name);
+                       err = -EINVAL;
+                       goto out;
+               }
+       } else {
+               err = radeon_ucode_validate(rdev->pfp_fw);
+               if (err) {
+                       printk(KERN_ERR
+                              "si_cp: validation failed for firmware \"%s\"\n",
+                              fw_name);
+                       goto out;
+               } else {
+                       new_fw++;
+               }
        }
 
-       snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name);
+       snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", new_chip_name);
        err = request_firmware(&rdev->me_fw, fw_name, rdev->dev);
-       if (err)
-               goto out;
-       if (rdev->me_fw->size != me_req_size) {
-               printk(KERN_ERR
-                      "si_cp: Bogus length %zu in firmware \"%s\"\n",
-                      rdev->me_fw->size, fw_name);
-               err = -EINVAL;
+       if (err) {
+               snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name);
+               err = request_firmware(&rdev->me_fw, fw_name, rdev->dev);
+               if (err)
+                       goto out;
+               if (rdev->me_fw->size != me_req_size) {
+                       printk(KERN_ERR
+                              "si_cp: Bogus length %zu in firmware \"%s\"\n",
+                              rdev->me_fw->size, fw_name);
+                       err = -EINVAL;
+               }
+       } else {
+               err = radeon_ucode_validate(rdev->me_fw);
+               if (err) {
+                       printk(KERN_ERR
+                              "si_cp: validation failed for firmware \"%s\"\n",
+                              fw_name);
+                       goto out;
+               } else {
+                       new_fw++;
+               }
        }
 
-       snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", chip_name);
+       snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", new_chip_name);
        err = request_firmware(&rdev->ce_fw, fw_name, rdev->dev);
-       if (err)
-               goto out;
-       if (rdev->ce_fw->size != ce_req_size) {
-               printk(KERN_ERR
-                      "si_cp: Bogus length %zu in firmware \"%s\"\n",
-                      rdev->ce_fw->size, fw_name);
-               err = -EINVAL;
+       if (err) {
+               snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", chip_name);
+               err = request_firmware(&rdev->ce_fw, fw_name, rdev->dev);
+               if (err)
+                       goto out;
+               if (rdev->ce_fw->size != ce_req_size) {
+                       printk(KERN_ERR
+                              "si_cp: Bogus length %zu in firmware \"%s\"\n",
+                              rdev->ce_fw->size, fw_name);
+                       err = -EINVAL;
+               }
+       } else {
+               err = radeon_ucode_validate(rdev->ce_fw);
+               if (err) {
+                       printk(KERN_ERR
+                              "si_cp: validation failed for firmware \"%s\"\n",
+                              fw_name);
+                       goto out;
+               } else {
+                       new_fw++;
+               }
        }
 
-       snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", rlc_chip_name);
+       snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", new_chip_name);
        err = request_firmware(&rdev->rlc_fw, fw_name, rdev->dev);
-       if (err)
-               goto out;
-       if (rdev->rlc_fw->size != rlc_req_size) {
-               printk(KERN_ERR
-                      "si_rlc: Bogus length %zu in firmware \"%s\"\n",
-                      rdev->rlc_fw->size, fw_name);
-               err = -EINVAL;
+       if (err) {
+               snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", chip_name);
+               err = request_firmware(&rdev->rlc_fw, fw_name, rdev->dev);
+               if (err)
+                       goto out;
+               if (rdev->rlc_fw->size != rlc_req_size) {
+                       printk(KERN_ERR
+                              "si_rlc: Bogus length %zu in firmware \"%s\"\n",
+                              rdev->rlc_fw->size, fw_name);
+                       err = -EINVAL;
+               }
+       } else {
+               err = radeon_ucode_validate(rdev->rlc_fw);
+               if (err) {
+                       printk(KERN_ERR
+                              "si_cp: validation failed for firmware \"%s\"\n",
+                              fw_name);
+                       goto out;
+               } else {
+                       new_fw++;
+               }
        }
 
-       snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc2.bin", chip_name);
+       snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", new_chip_name);
        err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev);
        if (err) {
-               snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name);
+               snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc2.bin", chip_name);
                err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev);
-               if (err)
+               if (err) {
+                       snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name);
+                       err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev);
+                       if (err)
+                               goto out;
+               }
+               if ((rdev->mc_fw->size != mc_req_size) &&
+                   (rdev->mc_fw->size != mc2_req_size)) {
+                       printk(KERN_ERR
+                              "si_mc: Bogus length %zu in firmware \"%s\"\n",
+                              rdev->mc_fw->size, fw_name);
+                       err = -EINVAL;
+               }
+               DRM_INFO("%s: %zu bytes\n", fw_name, rdev->mc_fw->size);
+       } else {
+               err = radeon_ucode_validate(rdev->mc_fw);
+               if (err) {
+                       printk(KERN_ERR
+                              "si_cp: validation failed for firmware \"%s\"\n",
+                              fw_name);
                        goto out;
+               } else {
+                       new_fw++;
+               }
        }
-       if ((rdev->mc_fw->size != mc_req_size) &&
-           (rdev->mc_fw->size != mc2_req_size)) {
-               printk(KERN_ERR
-                      "si_mc: Bogus length %zu in firmware \"%s\"\n",
-                      rdev->mc_fw->size, fw_name);
-               err = -EINVAL;
-       }
-       DRM_INFO("%s: %zu bytes\n", fw_name, rdev->mc_fw->size);
 
-       snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name);
+       snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", new_chip_name);
        err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev);
        if (err) {
-               printk(KERN_ERR
-                      "smc: error loading firmware \"%s\"\n",
-                      fw_name);
-               release_firmware(rdev->smc_fw);
-               rdev->smc_fw = NULL;
-               err = 0;
-       } else if (rdev->smc_fw->size != smc_req_size) {
-               printk(KERN_ERR
-                      "si_smc: Bogus length %zu in firmware \"%s\"\n",
-                      rdev->smc_fw->size, fw_name);
-               err = -EINVAL;
+               snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name);
+               err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev);
+               if (err) {
+                       printk(KERN_ERR
+                              "smc: error loading firmware \"%s\"\n",
+                              fw_name);
+                       release_firmware(rdev->smc_fw);
+                       rdev->smc_fw = NULL;
+                       err = 0;
+               } else if (rdev->smc_fw->size != smc_req_size) {
+                       printk(KERN_ERR
+                              "si_smc: Bogus length %zu in firmware \"%s\"\n",
+                              rdev->smc_fw->size, fw_name);
+                       err = -EINVAL;
+               }
+       } else {
+               err = radeon_ucode_validate(rdev->smc_fw);
+               if (err) {
+                       printk(KERN_ERR
+                              "si_cp: validation failed for firmware \"%s\"\n",
+                              fw_name);
+                       goto out;
+               } else {
+                       new_fw++;
+               }
        }
 
+       if (new_fw == 0) {
+               rdev->new_fw = false;
+       } else if (new_fw < 6) {
+               printk(KERN_ERR "si_fw: mixing new and old firmware!\n");
+               err = -EINVAL;
+       } else {
+               rdev->new_fw = true;
+       }
 out:
        if (err) {
                if (err != -EINVAL)
@@ -3282,34 +3438,77 @@ static void si_cp_enable(struct radeon_device *rdev, bool enable)
 
 static int si_cp_load_microcode(struct radeon_device *rdev)
 {
-       const __be32 *fw_data;
        int i;
 
-       if (!rdev->me_fw || !rdev->pfp_fw)
+       if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw)
                return -EINVAL;
 
        si_cp_enable(rdev, false);
 
-       /* PFP */
-       fw_data = (const __be32 *)rdev->pfp_fw->data;
-       WREG32(CP_PFP_UCODE_ADDR, 0);
-       for (i = 0; i < SI_PFP_UCODE_SIZE; i++)
-               WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++));
-       WREG32(CP_PFP_UCODE_ADDR, 0);
-
-       /* CE */
-       fw_data = (const __be32 *)rdev->ce_fw->data;
-       WREG32(CP_CE_UCODE_ADDR, 0);
-       for (i = 0; i < SI_CE_UCODE_SIZE; i++)
-               WREG32(CP_CE_UCODE_DATA, be32_to_cpup(fw_data++));
-       WREG32(CP_CE_UCODE_ADDR, 0);
-
-       /* ME */
-       fw_data = (const __be32 *)rdev->me_fw->data;
-       WREG32(CP_ME_RAM_WADDR, 0);
-       for (i = 0; i < SI_PM4_UCODE_SIZE; i++)
-               WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++));
-       WREG32(CP_ME_RAM_WADDR, 0);
+       if (rdev->new_fw) {
+               const struct gfx_firmware_header_v1_0 *pfp_hdr =
+                       (const struct gfx_firmware_header_v1_0 *)rdev->pfp_fw->data;
+               const struct gfx_firmware_header_v1_0 *ce_hdr =
+                       (const struct gfx_firmware_header_v1_0 *)rdev->ce_fw->data;
+               const struct gfx_firmware_header_v1_0 *me_hdr =
+                       (const struct gfx_firmware_header_v1_0 *)rdev->me_fw->data;
+               const __le32 *fw_data;
+               u32 fw_size;
+
+               radeon_ucode_print_gfx_hdr(&pfp_hdr->header);
+               radeon_ucode_print_gfx_hdr(&ce_hdr->header);
+               radeon_ucode_print_gfx_hdr(&me_hdr->header);
+
+               /* PFP */
+               fw_data = (const __le32 *)
+                       (rdev->pfp_fw->data + le32_to_cpu(pfp_hdr->header.ucode_array_offset_bytes));
+               fw_size = le32_to_cpu(pfp_hdr->header.ucode_size_bytes) / 4;
+               WREG32(CP_PFP_UCODE_ADDR, 0);
+               for (i = 0; i < fw_size; i++)
+                       WREG32(CP_PFP_UCODE_DATA, le32_to_cpup(fw_data++));
+               WREG32(CP_PFP_UCODE_ADDR, 0);
+
+               /* CE */
+               fw_data = (const __le32 *)
+                       (rdev->ce_fw->data + le32_to_cpu(ce_hdr->header.ucode_array_offset_bytes));
+               fw_size = le32_to_cpu(ce_hdr->header.ucode_size_bytes) / 4;
+               WREG32(CP_CE_UCODE_ADDR, 0);
+               for (i = 0; i < fw_size; i++)
+                       WREG32(CP_CE_UCODE_DATA, le32_to_cpup(fw_data++));
+               WREG32(CP_CE_UCODE_ADDR, 0);
+
+               /* ME */
+               fw_data = (const __be32 *)
+                       (rdev->me_fw->data + le32_to_cpu(me_hdr->header.ucode_array_offset_bytes));
+               fw_size = le32_to_cpu(me_hdr->header.ucode_size_bytes) / 4;
+               WREG32(CP_ME_RAM_WADDR, 0);
+               for (i = 0; i < fw_size; i++)
+                       WREG32(CP_ME_RAM_DATA, le32_to_cpup(fw_data++));
+               WREG32(CP_ME_RAM_WADDR, 0);
+       } else {
+               const __be32 *fw_data;
+
+               /* PFP */
+               fw_data = (const __be32 *)rdev->pfp_fw->data;
+               WREG32(CP_PFP_UCODE_ADDR, 0);
+               for (i = 0; i < SI_PFP_UCODE_SIZE; i++)
+                       WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++));
+               WREG32(CP_PFP_UCODE_ADDR, 0);
+
+               /* CE */
+               fw_data = (const __be32 *)rdev->ce_fw->data;
+               WREG32(CP_CE_UCODE_ADDR, 0);
+               for (i = 0; i < SI_CE_UCODE_SIZE; i++)
+                       WREG32(CP_CE_UCODE_DATA, be32_to_cpup(fw_data++));
+               WREG32(CP_CE_UCODE_ADDR, 0);
+
+               /* ME */
+               fw_data = (const __be32 *)rdev->me_fw->data;
+               WREG32(CP_ME_RAM_WADDR, 0);
+               for (i = 0; i < SI_PM4_UCODE_SIZE; i++)
+                       WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++));
+               WREG32(CP_ME_RAM_WADDR, 0);
+       }
 
        WREG32(CP_PFP_UCODE_ADDR, 0);
        WREG32(CP_CE_UCODE_ADDR, 0);
@@ -4048,7 +4247,6 @@ static int si_pcie_gart_enable(struct radeon_device *rdev)
        r = radeon_gart_table_vram_pin(rdev);
        if (r)
                return r;
-       radeon_gart_restore(rdev);
        /* Setup TLB control */
        WREG32(MC_VM_MX_L1_TLB_CNTL,
               (0xA << 7) |
@@ -4815,7 +5013,7 @@ void si_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm)
 
        /* write new base address */
        radeon_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
-       radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) |
+       radeon_ring_write(ring, (WRITE_DATA_ENGINE_SEL(1) |
                                 WRITE_DATA_DST_SEL(0)));
 
        if (vm->id < 8) {
@@ -5592,7 +5790,6 @@ static void si_enable_lbpw(struct radeon_device *rdev, bool enable)
 static int si_rlc_resume(struct radeon_device *rdev)
 {
        u32 i;
-       const __be32 *fw_data;
 
        if (!rdev->rlc_fw)
                return -EINVAL;
@@ -5615,10 +5812,26 @@ static int si_rlc_resume(struct radeon_device *rdev)
        WREG32(RLC_MC_CNTL, 0);
        WREG32(RLC_UCODE_CNTL, 0);
 
-       fw_data = (const __be32 *)rdev->rlc_fw->data;
-       for (i = 0; i < SI_RLC_UCODE_SIZE; i++) {
-               WREG32(RLC_UCODE_ADDR, i);
-               WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++));
+       if (rdev->new_fw) {
+               const struct rlc_firmware_header_v1_0 *hdr =
+                       (const struct rlc_firmware_header_v1_0 *)rdev->rlc_fw->data;
+               u32 fw_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4;
+               const __le32 *fw_data = (const __le32 *)
+                       (rdev->rlc_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
+
+               radeon_ucode_print_rlc_hdr(&hdr->header);
+
+               for (i = 0; i < fw_size; i++) {
+                       WREG32(RLC_UCODE_ADDR, i);
+                       WREG32(RLC_UCODE_DATA, le32_to_cpup(fw_data++));
+               }
+       } else {
+               const __be32 *fw_data =
+                       (const __be32 *)rdev->rlc_fw->data;
+               for (i = 0; i < SI_RLC_UCODE_SIZE; i++) {
+                       WREG32(RLC_UCODE_ADDR, i);
+                       WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++));
+               }
        }
        WREG32(RLC_UCODE_ADDR, 0);
 
@@ -6318,7 +6531,8 @@ restart_ih:
                case 16: /* D5 page flip */
                case 18: /* D6 page flip */
                        DRM_DEBUG("IH: D%d flip\n", ((src_id - 8) >> 1) + 1);
-                       radeon_crtc_handle_flip(rdev, (src_id - 8) >> 1);
+                       if (radeon_use_pflipirq > 0)
+                               radeon_crtc_handle_flip(rdev, (src_id - 8) >> 1);
                        break;
                case 42: /* HPD hotplug */
                        switch (src_data) {
index e24c94b6d14d133dd66acfc72593cc5d5a6eb2c7..7165051294504470c24e054b384802f05dc24de7 100644 (file)
@@ -56,7 +56,41 @@ bool si_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
 }
 
 /**
- * si_dma_vm_set_page - update the page tables using the DMA
+ * si_dma_vm_copy_pages - update PTEs by copying them from the GART
+ *
+ * @rdev: radeon_device pointer
+ * @ib: indirect buffer to fill with commands
+ * @pe: addr of the page entry
+ * @src: src addr where to copy from
+ * @count: number of page entries to update
+ *
+ * Update PTEs by copying them from the GART using the DMA (SI).
+ */
+void si_dma_vm_copy_pages(struct radeon_device *rdev,
+                         struct radeon_ib *ib,
+                         uint64_t pe, uint64_t src,
+                         unsigned count)
+{
+       while (count) {
+               unsigned bytes = count * 8;
+               if (bytes > 0xFFFF8)
+                       bytes = 0xFFFF8;
+
+               ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_COPY,
+                                                     1, 0, 0, bytes);
+               ib->ptr[ib->length_dw++] = lower_32_bits(pe);
+               ib->ptr[ib->length_dw++] = lower_32_bits(src);
+               ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff;
+               ib->ptr[ib->length_dw++] = upper_32_bits(src) & 0xff;
+
+               pe += bytes;
+               src += bytes;
+               count -= bytes / 8;
+       }
+}
+
+/**
+ * si_dma_vm_write_pages - update PTEs by writing them manually
  *
  * @rdev: radeon_device pointer
  * @ib: indirect buffer to fill with commands
@@ -66,83 +100,89 @@ bool si_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
  * @incr: increase next addr by incr bytes
  * @flags: access flags
  *
- * Update the page tables using the DMA (SI).
+ * Update PTEs by writing them manually using the DMA (SI).
  */
-void si_dma_vm_set_page(struct radeon_device *rdev,
-                       struct radeon_ib *ib,
-                       uint64_t pe,
-                       uint64_t addr, unsigned count,
-                       uint32_t incr, uint32_t flags)
+void si_dma_vm_write_pages(struct radeon_device *rdev,
+                          struct radeon_ib *ib,
+                          uint64_t pe,
+                          uint64_t addr, unsigned count,
+                          uint32_t incr, uint32_t flags)
 {
        uint64_t value;
        unsigned ndw;
 
-       trace_radeon_vm_set_page(pe, addr, count, incr, flags);
-
-       if (flags == R600_PTE_GART) {
-               uint64_t src = rdev->gart.table_addr + (addr >> 12) * 8;
-               while (count) {
-                       unsigned bytes = count * 8;
-                       if (bytes > 0xFFFF8)
-                               bytes = 0xFFFF8;
-
-                       ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_COPY,
-                                                             1, 0, 0, bytes);
-                       ib->ptr[ib->length_dw++] = lower_32_bits(pe);
-                       ib->ptr[ib->length_dw++] = lower_32_bits(src);
-                       ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff;
-                       ib->ptr[ib->length_dw++] = upper_32_bits(src) & 0xff;
-
-                       pe += bytes;
-                       src += bytes;
-                       count -= bytes / 8;
-               }
-       } else if (flags & R600_PTE_SYSTEM) {
-               while (count) {
-                       ndw = count * 2;
-                       if (ndw > 0xFFFFE)
-                               ndw = 0xFFFFE;
-
-                       /* for non-physically contiguous pages (system) */
-                       ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_WRITE, 0, 0, 0, ndw);
-                       ib->ptr[ib->length_dw++] = pe;
-                       ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff;
-                       for (; ndw > 0; ndw -= 2, --count, pe += 8) {
+       while (count) {
+               ndw = count * 2;
+               if (ndw > 0xFFFFE)
+                       ndw = 0xFFFFE;
+
+               /* for non-physically contiguous pages (system) */
+               ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_WRITE, 0, 0, 0, ndw);
+               ib->ptr[ib->length_dw++] = pe;
+               ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff;
+               for (; ndw > 0; ndw -= 2, --count, pe += 8) {
+                       if (flags & R600_PTE_SYSTEM) {
                                value = radeon_vm_map_gart(rdev, addr);
                                value &= 0xFFFFFFFFFFFFF000ULL;
-                               addr += incr;
-                               value |= flags;
-                               ib->ptr[ib->length_dw++] = value;
-                               ib->ptr[ib->length_dw++] = upper_32_bits(value);
-                       }
-               }
-       } else {
-               while (count) {
-                       ndw = count * 2;
-                       if (ndw > 0xFFFFE)
-                               ndw = 0xFFFFE;
-
-                       if (flags & R600_PTE_VALID)
+                       } else if (flags & R600_PTE_VALID) {
                                value = addr;
-                       else
+                       } else {
                                value = 0;
-                       /* for physically contiguous pages (vram) */
-                       ib->ptr[ib->length_dw++] = DMA_PTE_PDE_PACKET(ndw);
-                       ib->ptr[ib->length_dw++] = pe; /* dst addr */
-                       ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff;
-                       ib->ptr[ib->length_dw++] = flags; /* mask */
-                       ib->ptr[ib->length_dw++] = 0;
-                       ib->ptr[ib->length_dw++] = value; /* value */
+                       }
+                       addr += incr;
+                       value |= flags;
+                       ib->ptr[ib->length_dw++] = value;
                        ib->ptr[ib->length_dw++] = upper_32_bits(value);
-                       ib->ptr[ib->length_dw++] = incr; /* increment size */
-                       ib->ptr[ib->length_dw++] = 0;
-                       pe += ndw * 4;
-                       addr += (ndw / 2) * incr;
-                       count -= ndw / 2;
                }
        }
-       while (ib->length_dw & 0x7)
-               ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0, 0);
+}
+
+/**
+ * si_dma_vm_set_pages - update the page tables using the DMA
+ *
+ * @rdev: radeon_device pointer
+ * @ib: indirect buffer to fill with commands
+ * @pe: addr of the page entry
+ * @addr: dst addr to write into pe
+ * @count: number of page entries to update
+ * @incr: increase next addr by incr bytes
+ * @flags: access flags
+ *
+ * Update the page tables using the DMA (SI).
+ */
+void si_dma_vm_set_pages(struct radeon_device *rdev,
+                        struct radeon_ib *ib,
+                        uint64_t pe,
+                        uint64_t addr, unsigned count,
+                        uint32_t incr, uint32_t flags)
+{
+       uint64_t value;
+       unsigned ndw;
+
+       while (count) {
+               ndw = count * 2;
+               if (ndw > 0xFFFFE)
+                       ndw = 0xFFFFE;
+
+               if (flags & R600_PTE_VALID)
+                       value = addr;
+               else
+                       value = 0;
+
+               /* for physically contiguous pages (vram) */
+               ib->ptr[ib->length_dw++] = DMA_PTE_PDE_PACKET(ndw);
+               ib->ptr[ib->length_dw++] = pe; /* dst addr */
+               ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff;
+               ib->ptr[ib->length_dw++] = flags; /* mask */
+               ib->ptr[ib->length_dw++] = 0;
+               ib->ptr[ib->length_dw++] = value; /* value */
+               ib->ptr[ib->length_dw++] = upper_32_bits(value);
+               ib->ptr[ib->length_dw++] = incr; /* increment size */
+               ib->ptr[ib->length_dw++] = 0;
+               pe += ndw * 4;
+               addr += (ndw / 2) * incr;
+               count -= ndw / 2;
+       }
 }
 
 void si_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm)
index 58918868f894572fe9fb729023d7b33eb698e2f4..70e61ffeace245aca431cc13c4fa5f833b0580de 100644 (file)
@@ -3812,6 +3812,27 @@ void si_trim_voltage_table_to_fit_state_table(struct radeon_device *rdev,
        voltage_table->count = max_voltage_steps;
 }
 
+static int si_get_svi2_voltage_table(struct radeon_device *rdev,
+                                    struct radeon_clock_voltage_dependency_table *voltage_dependency_table,
+                                    struct atom_voltage_table *voltage_table)
+{
+       u32 i;
+
+       if (voltage_dependency_table == NULL)
+               return -EINVAL;
+
+       voltage_table->mask_low = 0;
+       voltage_table->phase_delay = 0;
+
+       voltage_table->count = voltage_dependency_table->count;
+       for (i = 0; i < voltage_table->count; i++) {
+               voltage_table->entries[i].value = voltage_dependency_table->entries[i].v;
+               voltage_table->entries[i].smio_low = 0;
+       }
+
+       return 0;
+}
+
 static int si_construct_voltage_tables(struct radeon_device *rdev)
 {
        struct rv7xx_power_info *pi = rv770_get_pi(rdev);
@@ -3819,15 +3840,25 @@ static int si_construct_voltage_tables(struct radeon_device *rdev)
        struct si_power_info *si_pi = si_get_pi(rdev);
        int ret;
 
-       ret = radeon_atom_get_voltage_table(rdev, VOLTAGE_TYPE_VDDC,
-                                           VOLTAGE_OBJ_GPIO_LUT, &eg_pi->vddc_voltage_table);
-       if (ret)
-               return ret;
+       if (pi->voltage_control) {
+               ret = radeon_atom_get_voltage_table(rdev, VOLTAGE_TYPE_VDDC,
+                                                   VOLTAGE_OBJ_GPIO_LUT, &eg_pi->vddc_voltage_table);
+               if (ret)
+                       return ret;
 
-       if (eg_pi->vddc_voltage_table.count > SISLANDS_MAX_NO_VREG_STEPS)
-               si_trim_voltage_table_to_fit_state_table(rdev,
-                                                        SISLANDS_MAX_NO_VREG_STEPS,
-                                                        &eg_pi->vddc_voltage_table);
+               if (eg_pi->vddc_voltage_table.count > SISLANDS_MAX_NO_VREG_STEPS)
+                       si_trim_voltage_table_to_fit_state_table(rdev,
+                                                                SISLANDS_MAX_NO_VREG_STEPS,
+                                                                &eg_pi->vddc_voltage_table);
+       } else if (si_pi->voltage_control_svi2) {
+               ret = si_get_svi2_voltage_table(rdev,
+                                               &rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk,
+                                               &eg_pi->vddc_voltage_table);
+               if (ret)
+                       return ret;
+       } else {
+               return -EINVAL;
+       }
 
        if (eg_pi->vddci_control) {
                ret = radeon_atom_get_voltage_table(rdev, VOLTAGE_TYPE_VDDCI,
@@ -3840,6 +3871,13 @@ static int si_construct_voltage_tables(struct radeon_device *rdev)
                                                                 SISLANDS_MAX_NO_VREG_STEPS,
                                                                 &eg_pi->vddci_voltage_table);
        }
+       if (si_pi->vddci_control_svi2) {
+               ret = si_get_svi2_voltage_table(rdev,
+                                               &rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk,
+                                               &eg_pi->vddci_voltage_table);
+               if (ret)
+                       return ret;
+       }
 
        if (pi->mvdd_control) {
                ret = radeon_atom_get_voltage_table(rdev, VOLTAGE_TYPE_MVDDC,
@@ -3893,46 +3931,55 @@ static int si_populate_smc_voltage_tables(struct radeon_device *rdev,
        struct si_power_info *si_pi = si_get_pi(rdev);
        u8 i;
 
-       if (eg_pi->vddc_voltage_table.count) {
-               si_populate_smc_voltage_table(rdev, &eg_pi->vddc_voltage_table, table);
-               table->voltageMaskTable.lowMask[SISLANDS_SMC_VOLTAGEMASK_VDDC] =
-                       cpu_to_be32(eg_pi->vddc_voltage_table.mask_low);
-
-               for (i = 0; i < eg_pi->vddc_voltage_table.count; i++) {
-                       if (pi->max_vddc_in_table <= eg_pi->vddc_voltage_table.entries[i].value) {
-                               table->maxVDDCIndexInPPTable = i;
-                               break;
+       if (si_pi->voltage_control_svi2) {
+               si_write_smc_soft_register(rdev, SI_SMC_SOFT_REGISTER_svi_rework_gpio_id_svc,
+                       si_pi->svc_gpio_id);
+               si_write_smc_soft_register(rdev, SI_SMC_SOFT_REGISTER_svi_rework_gpio_id_svd,
+                       si_pi->svd_gpio_id);
+               si_write_smc_soft_register(rdev, SI_SMC_SOFT_REGISTER_svi_rework_plat_type,
+                                          2);
+       } else {
+               if (eg_pi->vddc_voltage_table.count) {
+                       si_populate_smc_voltage_table(rdev, &eg_pi->vddc_voltage_table, table);
+                       table->voltageMaskTable.lowMask[SISLANDS_SMC_VOLTAGEMASK_VDDC] =
+                               cpu_to_be32(eg_pi->vddc_voltage_table.mask_low);
+
+                       for (i = 0; i < eg_pi->vddc_voltage_table.count; i++) {
+                               if (pi->max_vddc_in_table <= eg_pi->vddc_voltage_table.entries[i].value) {
+                                       table->maxVDDCIndexInPPTable = i;
+                                       break;
+                               }
                        }
                }
-       }
 
-       if (eg_pi->vddci_voltage_table.count) {
-               si_populate_smc_voltage_table(rdev, &eg_pi->vddci_voltage_table, table);
+               if (eg_pi->vddci_voltage_table.count) {
+                       si_populate_smc_voltage_table(rdev, &eg_pi->vddci_voltage_table, table);
 
-               table->voltageMaskTable.lowMask[SISLANDS_SMC_VOLTAGEMASK_VDDCI] =
-                       cpu_to_be32(eg_pi->vddci_voltage_table.mask_low);
-       }
+                       table->voltageMaskTable.lowMask[SISLANDS_SMC_VOLTAGEMASK_VDDCI] =
+                               cpu_to_be32(eg_pi->vddci_voltage_table.mask_low);
+               }
 
 
-       if (si_pi->mvdd_voltage_table.count) {
-               si_populate_smc_voltage_table(rdev, &si_pi->mvdd_voltage_table, table);
+               if (si_pi->mvdd_voltage_table.count) {
+                       si_populate_smc_voltage_table(rdev, &si_pi->mvdd_voltage_table, table);
 
-               table->voltageMaskTable.lowMask[SISLANDS_SMC_VOLTAGEMASK_MVDD] =
-                       cpu_to_be32(si_pi->mvdd_voltage_table.mask_low);
-       }
+                       table->voltageMaskTable.lowMask[SISLANDS_SMC_VOLTAGEMASK_MVDD] =
+                               cpu_to_be32(si_pi->mvdd_voltage_table.mask_low);
+               }
 
-       if (si_pi->vddc_phase_shed_control) {
-               if (si_validate_phase_shedding_tables(rdev, &si_pi->vddc_phase_shed_table,
-                                                     &rdev->pm.dpm.dyn_state.phase_shedding_limits_table)) {
-                       si_populate_smc_voltage_table(rdev, &si_pi->vddc_phase_shed_table, table);
+               if (si_pi->vddc_phase_shed_control) {
+                       if (si_validate_phase_shedding_tables(rdev, &si_pi->vddc_phase_shed_table,
+                                                             &rdev->pm.dpm.dyn_state.phase_shedding_limits_table)) {
+                               si_populate_smc_voltage_table(rdev, &si_pi->vddc_phase_shed_table, table);
 
-                       table->phaseMaskTable.lowMask[SISLANDS_SMC_VOLTAGEMASK_VDDC] =
-                               cpu_to_be32(si_pi->vddc_phase_shed_table.mask_low);
+                               table->phaseMaskTable.lowMask[SISLANDS_SMC_VOLTAGEMASK_VDDC] =
+                                       cpu_to_be32(si_pi->vddc_phase_shed_table.mask_low);
 
-                       si_write_smc_soft_register(rdev, SI_SMC_SOFT_REGISTER_phase_shedding_delay,
-                                                  (u32)si_pi->vddc_phase_shed_table.phase_delay);
-               } else {
-                       si_pi->vddc_phase_shed_control = false;
+                               si_write_smc_soft_register(rdev, SI_SMC_SOFT_REGISTER_phase_shedding_delay,
+                                                          (u32)si_pi->vddc_phase_shed_table.phase_delay);
+                       } else {
+                               si_pi->vddc_phase_shed_control = false;
+                       }
                }
        }
 
@@ -5798,16 +5845,17 @@ int si_dpm_enable(struct radeon_device *rdev)
 {
        struct rv7xx_power_info *pi = rv770_get_pi(rdev);
        struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
+       struct si_power_info *si_pi = si_get_pi(rdev);
        struct radeon_ps *boot_ps = rdev->pm.dpm.boot_ps;
        int ret;
 
        if (si_is_smc_running(rdev))
                return -EINVAL;
-       if (pi->voltage_control)
+       if (pi->voltage_control || si_pi->voltage_control_svi2)
                si_enable_voltage_control(rdev, true);
        if (pi->mvdd_control)
                si_get_mvdd_configuration(rdev);
-       if (pi->voltage_control) {
+       if (pi->voltage_control || si_pi->voltage_control_svi2) {
                ret = si_construct_voltage_tables(rdev);
                if (ret) {
                        DRM_ERROR("si_construct_voltage_tables failed\n");
@@ -6406,16 +6454,32 @@ int si_dpm_init(struct radeon_device *rdev)
        ni_pi->mclk_rtt_mode_threshold = eg_pi->mclk_edc_wr_enable_threshold;
 
        pi->voltage_control =
-               radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDC, VOLTAGE_OBJ_GPIO_LUT);
+               radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDC,
+                                           VOLTAGE_OBJ_GPIO_LUT);
+       if (!pi->voltage_control) {
+               si_pi->voltage_control_svi2 =
+                       radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDC,
+                                                   VOLTAGE_OBJ_SVID2);
+               if (si_pi->voltage_control_svi2)
+                       radeon_atom_get_svi2_info(rdev, SET_VOLTAGE_TYPE_ASIC_VDDC,
+                                                 &si_pi->svd_gpio_id, &si_pi->svc_gpio_id);
+       }
 
        pi->mvdd_control =
-               radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_MVDDC, VOLTAGE_OBJ_GPIO_LUT);
+               radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_MVDDC,
+                                           VOLTAGE_OBJ_GPIO_LUT);
 
        eg_pi->vddci_control =
-               radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDCI, VOLTAGE_OBJ_GPIO_LUT);
+               radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDCI,
+                                           VOLTAGE_OBJ_GPIO_LUT);
+       if (!eg_pi->vddci_control)
+               si_pi->vddci_control_svi2 =
+                       radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDCI,
+                                                   VOLTAGE_OBJ_SVID2);
 
        si_pi->vddc_phase_shed_control =
-               radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDC, VOLTAGE_OBJ_PHASE_LUT);
+               radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDC,
+                                           VOLTAGE_OBJ_PHASE_LUT);
 
        rv770_get_engine_memory_ss(rdev);
 
index 4ce5032cdf49ecbf2dc27dca6c7b19e7f315714a..8b5c06a0832df96bfc45f876398529c1f7151c10 100644 (file)
@@ -170,6 +170,8 @@ struct si_power_info {
        bool vddc_phase_shed_control;
        bool pspp_notify_required;
        bool sclk_deep_sleep_above_low;
+       bool voltage_control_svi2;
+       bool vddci_control_svi2;
        /* smc offsets */
        u32 sram_end;
        u32 state_table_start;
@@ -192,6 +194,9 @@ struct si_power_info {
        SMC_SIslands_MCRegisters smc_mc_reg_table;
        SISLANDS_SMC_STATETABLE smc_statetable;
        PP_SIslands_PAPMParameters papm_parm;
+       /* SVI2 */
+       u8 svd_gpio_id;
+       u8 svc_gpio_id;
 };
 
 #define SISLANDS_INITIAL_STATE_ARB_INDEX    0
index e80efcf0c2306e812b4462ab930464bc03c8c5b5..73dbc79c959d1f8093f035ac0dda87c561728429 100644 (file)
@@ -219,36 +219,48 @@ int si_load_smc_ucode(struct radeon_device *rdev, u32 limit)
        if (!rdev->smc_fw)
                return -EINVAL;
 
-       switch (rdev->family) {
-       case CHIP_TAHITI:
-               ucode_start_address = TAHITI_SMC_UCODE_START;
-               ucode_size = TAHITI_SMC_UCODE_SIZE;
-               break;
-       case CHIP_PITCAIRN:
-               ucode_start_address = PITCAIRN_SMC_UCODE_START;
-               ucode_size = PITCAIRN_SMC_UCODE_SIZE;
-               break;
-       case CHIP_VERDE:
-               ucode_start_address = VERDE_SMC_UCODE_START;
-               ucode_size = VERDE_SMC_UCODE_SIZE;
-               break;
-       case CHIP_OLAND:
-               ucode_start_address = OLAND_SMC_UCODE_START;
-               ucode_size = OLAND_SMC_UCODE_SIZE;
-               break;
-       case CHIP_HAINAN:
-               ucode_start_address = HAINAN_SMC_UCODE_START;
-               ucode_size = HAINAN_SMC_UCODE_SIZE;
-               break;
-       default:
-               DRM_ERROR("unknown asic in smc ucode loader\n");
-               BUG();
+       if (rdev->new_fw) {
+               const struct smc_firmware_header_v1_0 *hdr =
+                       (const struct smc_firmware_header_v1_0 *)rdev->smc_fw->data;
+
+               radeon_ucode_print_smc_hdr(&hdr->header);
+
+               ucode_start_address = le32_to_cpu(hdr->ucode_start_addr);
+               ucode_size = le32_to_cpu(hdr->header.ucode_size_bytes);
+               src = (const u8 *)
+                       (rdev->smc_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
+       } else {
+               switch (rdev->family) {
+               case CHIP_TAHITI:
+                       ucode_start_address = TAHITI_SMC_UCODE_START;
+                       ucode_size = TAHITI_SMC_UCODE_SIZE;
+                       break;
+               case CHIP_PITCAIRN:
+                       ucode_start_address = PITCAIRN_SMC_UCODE_START;
+                       ucode_size = PITCAIRN_SMC_UCODE_SIZE;
+                       break;
+               case CHIP_VERDE:
+                       ucode_start_address = VERDE_SMC_UCODE_START;
+                       ucode_size = VERDE_SMC_UCODE_SIZE;
+                       break;
+               case CHIP_OLAND:
+                       ucode_start_address = OLAND_SMC_UCODE_START;
+                       ucode_size = OLAND_SMC_UCODE_SIZE;
+                       break;
+               case CHIP_HAINAN:
+                       ucode_start_address = HAINAN_SMC_UCODE_START;
+                       ucode_size = HAINAN_SMC_UCODE_SIZE;
+                       break;
+               default:
+                       DRM_ERROR("unknown asic in smc ucode loader\n");
+                       BUG();
+               }
+               src = (const u8 *)rdev->smc_fw->data;
        }
 
        if (ucode_size & 3)
                return -EINVAL;
 
-       src = (const u8 *)rdev->smc_fw->data;
        spin_lock_irqsave(&rdev->smc_idx_lock, flags);
        WREG32(SMC_IND_INDEX_0, ucode_start_address);
        WREG32_P(SMC_IND_ACCESS_CNTL, AUTO_INCREMENT_IND_0, ~AUTO_INCREMENT_IND_0);
index 10e945a49479e3e9bb611ec98cb62b409046acf6..623a0b1e2d9dbf017b7af5218996daabc9ec2ab6 100644 (file)
@@ -241,6 +241,9 @@ typedef struct SISLANDS_SMC_STATETABLE SISLANDS_SMC_STATETABLE;
 #define SI_SMC_SOFT_REGISTER_non_ulv_pcie_link_width  0xF4
 #define SI_SMC_SOFT_REGISTER_tdr_is_about_to_happen   0xFC
 #define SI_SMC_SOFT_REGISTER_vr_hot_gpio              0x100
+#define SI_SMC_SOFT_REGISTER_svi_rework_plat_type     0x118
+#define SI_SMC_SOFT_REGISTER_svi_rework_gpio_id_svd   0x11c
+#define SI_SMC_SOFT_REGISTER_svi_rework_gpio_id_svc   0x120
 
 #define SMC_SISLANDS_LKGE_LUT_NUM_OF_TEMP_ENTRIES 16
 #define SMC_SISLANDS_LKGE_LUT_NUM_OF_VOLT_ENTRIES 32
index 792fd1d20e865df1125294dcfbf626e6a7a16524..fda64b7b73e816f80716f0a33b2764a7b4711af1 100644 (file)
@@ -187,7 +187,7 @@ static struct drm_driver rcar_du_driver = {
  * Power management
  */
 
-#if CONFIG_PM_SLEEP
+#ifdef CONFIG_PM_SLEEP
 static int rcar_du_pm_suspend(struct device *dev)
 {
        struct rcar_du_device *rcdu = dev_get_drvdata(dev);
index a87edfac111f853056e718f646a6624559fe929a..76026104d000170838fd5bf34361d30a8b1efa52 100644 (file)
@@ -135,7 +135,9 @@ rcar_du_fb_create(struct drm_device *dev, struct drm_file *file_priv,
 {
        struct rcar_du_device *rcdu = dev->dev_private;
        const struct rcar_du_format_info *format;
+       unsigned int max_pitch;
        unsigned int align;
+       unsigned int bpp;
 
        format = rcar_du_format_info(mode_cmd->pixel_format);
        if (format == NULL) {
@@ -144,13 +146,20 @@ rcar_du_fb_create(struct drm_device *dev, struct drm_file *file_priv,
                return ERR_PTR(-EINVAL);
        }
 
+       /*
+        * The pitch and alignment constraints are expressed in pixels on the
+        * hardware side and in bytes in the DRM API.
+        */
+       bpp = format->planes == 2 ? 1 : format->bpp / 8;
+       max_pitch =  4096 * bpp;
+
        if (rcar_du_needs(rcdu, RCAR_DU_QUIRK_ALIGN_128B))
                align = 128;
        else
-               align = 16 * format->bpp / 8;
+               align = 16 * bpp;
 
        if (mode_cmd->pitches[0] & (align - 1) ||
-           mode_cmd->pitches[0] >= 8192) {
+           mode_cmd->pitches[0] >= max_pitch) {
                dev_dbg(dev->dev, "invalid pitch value %u\n",
                        mode_cmd->pitches[0]);
                return ERR_PTR(-EINVAL);
index 289048d1c7b2fd590e20eb2425266b758fbfbd88..21426bd234eb1d24ac2038e8ed58fd813ac61990 100644 (file)
@@ -64,7 +64,7 @@ static const struct drm_connector_helper_funcs connector_helper_funcs = {
 
 static void rcar_du_lvds_connector_destroy(struct drm_connector *connector)
 {
-       drm_sysfs_connector_remove(connector);
+       drm_connector_unregister(connector);
        drm_connector_cleanup(connector);
 }
 
@@ -105,7 +105,7 @@ int rcar_du_lvds_connector_init(struct rcar_du_device *rcdu,
                return ret;
 
        drm_connector_helper_add(connector, &connector_helper_funcs);
-       ret = drm_sysfs_connector_add(connector);
+       ret = drm_connector_register(connector);
        if (ret < 0)
                return ret;
 
index ccfe64c7188fa902750a2fa9a05be5045baa7397..8af3944d31b9a3900afd3b86ec73b86e470a5d3c 100644 (file)
@@ -32,7 +32,7 @@ static const struct drm_connector_helper_funcs connector_helper_funcs = {
 
 static void rcar_du_vga_connector_destroy(struct drm_connector *connector)
 {
-       drm_sysfs_connector_remove(connector);
+       drm_connector_unregister(connector);
        drm_connector_cleanup(connector);
 }
 
@@ -70,7 +70,7 @@ int rcar_du_vga_connector_init(struct rcar_du_device *rcdu,
                return ret;
 
        drm_connector_helper_add(connector, &connector_helper_funcs);
-       ret = drm_sysfs_connector_add(connector);
+       ret = drm_connector_register(connector);
        if (ret < 0)
                return ret;
 
index faf176b2daf99ae628a16c862581d65b90a02943..47875de89010d7a29a5b62e3752ec40d4c201b2c 100644 (file)
@@ -692,7 +692,7 @@ static void shmob_drm_connector_destroy(struct drm_connector *connector)
        struct shmob_drm_connector *scon = to_shmob_connector(connector);
 
        shmob_drm_backlight_exit(scon);
-       drm_sysfs_connector_remove(connector);
+       drm_connector_unregister(connector);
        drm_connector_cleanup(connector);
 }
 
@@ -726,7 +726,7 @@ int shmob_drm_connector_create(struct shmob_drm_device *sdev,
                return ret;
 
        drm_connector_helper_add(connector, &connector_helper_funcs);
-       ret = drm_sysfs_connector_add(connector);
+       ret = drm_connector_register(connector);
        if (ret < 0)
                goto err_cleanup;
 
@@ -749,7 +749,7 @@ int shmob_drm_connector_create(struct shmob_drm_device *sdev,
 err_backlight:
        shmob_drm_backlight_exit(&sdev->connector);
 err_sysfs:
-       drm_sysfs_connector_remove(connector);
+       drm_connector_unregister(connector);
 err_cleanup:
        drm_connector_cleanup(connector);
        return ret;
index 82c84c7fd4f6e1c93d2872414045bed206899c9a..ff4ba483b6020798aac9dfb31254dd3067e50a22 100644 (file)
@@ -297,7 +297,7 @@ static struct drm_driver shmob_drm_driver = {
  * Power management
  */
 
-#if CONFIG_PM_SLEEP
+#ifdef CONFIG_PM_SLEEP
 static int shmob_drm_pm_suspend(struct device *dev)
 {
        struct shmob_drm_device *sdev = dev_get_drvdata(dev);
diff --git a/drivers/gpu/drm/sti/Kconfig b/drivers/gpu/drm/sti/Kconfig
new file mode 100644 (file)
index 0000000..2d9d425
--- /dev/null
@@ -0,0 +1,14 @@
+config DRM_STI
+       tristate "DRM Support for STMicroelectronics SoC stiH41x Series"
+       depends on DRM && (SOC_STIH415 || SOC_STIH416 || ARCH_MULTIPLATFORM)
+       select DRM_KMS_HELPER
+       select DRM_GEM_CMA_HELPER
+       select DRM_KMS_CMA_HELPER
+       help
+         Choose this option to enable DRM on STM stiH41x chipset
+
+config DRM_STI_FBDEV
+       bool "DRM frame buffer device for STMicroelectronics SoC stiH41x Serie"
+       depends on DRM_STI
+       help
+         Choose this option to enable FBDEV on top of DRM for STM stiH41x chipset
diff --git a/drivers/gpu/drm/sti/Makefile b/drivers/gpu/drm/sti/Makefile
new file mode 100644 (file)
index 0000000..04ac2ce
--- /dev/null
@@ -0,0 +1,21 @@
+sticompositor-y := \
+       sti_layer.o \
+       sti_mixer.o \
+       sti_gdp.o \
+       sti_vid.o \
+       sti_compositor.o \
+       sti_drm_crtc.o \
+       sti_drm_plane.o
+
+stihdmi-y := sti_hdmi.o \
+       sti_hdmi_tx3g0c55phy.o \
+       sti_hdmi_tx3g4c28phy.o \
+
+obj-$(CONFIG_DRM_STI) = \
+       sti_vtg.o \
+       sti_vtac.o \
+       stihdmi.o \
+       sti_hda.o \
+       sti_tvout.o \
+       sticompositor.o \
+       sti_drm_drv.o
\ No newline at end of file
diff --git a/drivers/gpu/drm/sti/NOTES b/drivers/gpu/drm/sti/NOTES
new file mode 100644 (file)
index 0000000..57e2579
--- /dev/null
@@ -0,0 +1,58 @@
+1. stiH display hardware IP
+---------------------------
+The STMicroelectronics stiH SoCs use a common chain of HW display IP blocks:
+- The High Quality Video Display Processor (HQVDP) gets video frames from a
+  video decoder and does high quality video processing, including scaling.
+
+- The Compositor is a multiplane, dual-mixer (Main & Aux) digital processor. It
+  has several inputs:
+  - The graphics planes are internally processed by the Generic Display
+    Pipeline (GDP).
+  - The video plug (VID) connects to the HQVDP output.
+  - The cursor handles ... a cursor.
+- The TV OUT pre-formats (convert, clip, round) the compositor output data
+- The HDMI / DVO / HD Analog / SD analog IP builds the video signals
+  - DVO (Digital Video Output) handles a 24bits parallel signal
+  - The HD analog signal is typically driven by a YCbCr cable, supporting up to
+    1080i mode.
+  - The SD analog signal is typically used for legacy TV
+- The VTG (Video Timing Generators) build Vsync signals used by the other HW IP
+Note that some stiH drivers support only a subset of thee HW IP.
+
+                  .-------------.   .-----------.   .-----------.
+GPU >-------------+GDP     Main |   |           +---+    HDMI   +--> HDMI
+GPU >-------------+GDP     mixer+---+           |   :===========:
+GPU >-------------+Cursor       |   |           +---+    DVO    +--> 24b//
+        -------   |  COMPOSITOR |   |  TV OUT   |   :===========:
+       |       |  |             |   |           +---+ HD analog +--> YCbCr
+Vid >--+ HQVDP +--+VID     Aux  +---+           |   :===========:
+dec    |       |  |        mixer|   |           +---+ SD analog +--> CVBS
+       '-------'  '-------------'   '-----------'   '-----------'
+                   .-----------.
+                   |       main+--> Vsync
+                   | VTG       |
+                   |        aux+--> Vsync
+                   '-----------'
+
+2. DRM / HW mapping
+-------------------
+These IP are mapped to the DRM objects as following:
+- The CRTCs are mapped to the Compositor Main and Aux Mixers
+- The Framebuffers and planes are mapped to the Compositor GDP (non video
+  buffers) and to HQVDP+VID (video buffers)
+- The Cursor is mapped to the Compositor Cursor
+- The Encoders are mapped to the TVOut
+- The Bridges/Connectors are mapped to the HDMI / DVO / HD Analog / SD analog
+
+FB & planes         Cursor      CRTC     Encoders    Bridges/Connectors
+   |                   |          |         |                       |
+   |                   |          |         |                       |
+   |              .-------------. | .-----------.   .-----------.   |
+   +------------> |GDP |   Main | | |       +-> |   |    HDMI   | <-+
+   +------------> |GDP v   mixer|<+ |       |   |   :===========:   |
+   |              |Cursor       | | |       +-> |   |    DVO    | <-+
+   |    -------   |  COMPOSITOR | | |TV OUT |   |   :===========:   |
+   |   |       |  |             | | |       +-> |   | HD analog | <-+
+   +-> | HQVDP |  |VID     Aux  |<+ |       |   |   :===========:   |
+       |       |  |        mixer|   |       +-> |   | SD analog | <-+
+       '-------'  '-------------'   '-----------'   '-----------'
diff --git a/drivers/gpu/drm/sti/sti_compositor.c b/drivers/gpu/drm/sti/sti_compositor.c
new file mode 100644 (file)
index 0000000..390d93e
--- /dev/null
@@ -0,0 +1,281 @@
+/*
+ * Copyright (C) STMicroelectronics SA 2014
+ * Authors: Benjamin Gaignard <benjamin.gaignard@st.com>
+ *          Fabien Dessenne <fabien.dessenne@st.com>
+ *          for STMicroelectronics.
+ * License terms:  GNU General Public License (GPL), version 2
+ */
+
+#include <linux/component.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/reset.h>
+
+#include <drm/drmP.h>
+
+#include "sti_compositor.h"
+#include "sti_drm_crtc.h"
+#include "sti_drm_drv.h"
+#include "sti_drm_plane.h"
+#include "sti_gdp.h"
+#include "sti_vtg.h"
+
+/*
+ * stiH407 compositor properties
+ */
+struct sti_compositor_data stih407_compositor_data = {
+       .nb_subdev = 6,
+       .subdev_desc = {
+                       {STI_GPD_SUBDEV, (int)STI_GDP_0, 0x100},
+                       {STI_GPD_SUBDEV, (int)STI_GDP_1, 0x200},
+                       {STI_GPD_SUBDEV, (int)STI_GDP_2, 0x300},
+                       {STI_GPD_SUBDEV, (int)STI_GDP_3, 0x400},
+                       {STI_VID_SUBDEV, (int)STI_VID_0, 0x700},
+                       {STI_MIXER_MAIN_SUBDEV, STI_MIXER_MAIN, 0xC00}
+       },
+};
+
+/*
+ * stiH416 compositor properties
+ * Note:
+ * on stih416 MIXER_AUX has a different base address from MIXER_MAIN
+ * Moreover, GDPx is different for Main and Aux Mixer. So this subdev map does
+ * not fit for stiH416 if we want to enable the MIXER_AUX.
+ */
+struct sti_compositor_data stih416_compositor_data = {
+       .nb_subdev = 3,
+       .subdev_desc = {
+                       {STI_GPD_SUBDEV, (int)STI_GDP_0, 0x100},
+                       {STI_GPD_SUBDEV, (int)STI_GDP_1, 0x200},
+                       {STI_MIXER_MAIN_SUBDEV, STI_MIXER_MAIN, 0xC00}
+       },
+};
+
+static int sti_compositor_init_subdev(struct sti_compositor *compo,
+               struct sti_compositor_subdev_descriptor *desc,
+               unsigned int array_size)
+{
+       unsigned int i, mixer_id = 0, layer_id = 0;
+
+       for (i = 0; i < array_size; i++) {
+               switch (desc[i].type) {
+               case STI_MIXER_MAIN_SUBDEV:
+               case STI_MIXER_AUX_SUBDEV:
+                       compo->mixer[mixer_id++] =
+                           sti_mixer_create(compo->dev, desc[i].id,
+                                            compo->regs + desc[i].offset);
+                       break;
+               case STI_GPD_SUBDEV:
+               case STI_VID_SUBDEV:
+                       compo->layer[layer_id++] =
+                           sti_layer_create(compo->dev, desc[i].id,
+                                            compo->regs + desc[i].offset);
+                       break;
+                       /* case STI_CURSOR_SUBDEV : TODO */
+               default:
+                       DRM_ERROR("Unknow subdev compoment type\n");
+                       return 1;
+               }
+
+       }
+       compo->nb_mixers = mixer_id;
+       compo->nb_layers = layer_id;
+
+       return 0;
+}
+
+static int sti_compositor_bind(struct device *dev, struct device *master,
+       void *data)
+{
+       struct sti_compositor *compo = dev_get_drvdata(dev);
+       struct drm_device *drm_dev = data;
+       unsigned int i, crtc = 0, plane = 0;
+       struct sti_drm_private *dev_priv = drm_dev->dev_private;
+       struct drm_plane *cursor = NULL;
+       struct drm_plane *primary = NULL;
+
+       dev_priv->compo = compo;
+
+       for (i = 0; i < compo->nb_layers; i++) {
+               if (compo->layer[i]) {
+                       enum sti_layer_desc desc = compo->layer[i]->desc;
+                       enum sti_layer_type type = desc & STI_LAYER_TYPE_MASK;
+                       enum drm_plane_type plane_type = DRM_PLANE_TYPE_OVERLAY;
+
+                       if (compo->mixer[crtc])
+                               plane_type = DRM_PLANE_TYPE_PRIMARY;
+
+                       switch (type) {
+                       case STI_CUR:
+                               cursor = sti_drm_plane_init(drm_dev,
+                                               compo->layer[i],
+                                               (1 << crtc) - 1,
+                                               DRM_PLANE_TYPE_CURSOR);
+                               break;
+                       case STI_GDP:
+                       case STI_VID:
+                               primary = sti_drm_plane_init(drm_dev,
+                                               compo->layer[i],
+                                               (1 << crtc) - 1, plane_type);
+                               plane++;
+                               break;
+                       case STI_BCK:
+                               break;
+                       }
+
+                       /* The first planes are reserved for primary planes*/
+                       if (compo->mixer[crtc]) {
+                               sti_drm_crtc_init(drm_dev, compo->mixer[crtc],
+                                               primary, cursor);
+                               crtc++;
+                               cursor = NULL;
+                       }
+               }
+       }
+
+       drm_vblank_init(drm_dev, crtc);
+       /* Allow usage of vblank without having to call drm_irq_install */
+       drm_dev->irq_enabled = 1;
+
+       DRM_DEBUG_DRIVER("Initialized %d DRM CRTC(s) and %d DRM plane(s)\n",
+                        crtc, plane);
+       DRM_DEBUG_DRIVER("DRM plane(s) for VID/VDP not created yet\n");
+
+       return 0;
+}
+
+static void sti_compositor_unbind(struct device *dev, struct device *master,
+       void *data)
+{
+       /* do nothing */
+}
+
+static const struct component_ops sti_compositor_ops = {
+       .bind   = sti_compositor_bind,
+       .unbind = sti_compositor_unbind,
+};
+
+static const struct of_device_id compositor_of_match[] = {
+       {
+               .compatible = "st,stih416-compositor",
+               .data = &stih416_compositor_data,
+       }, {
+               .compatible = "st,stih407-compositor",
+               .data = &stih407_compositor_data,
+       }, {
+               /* end node */
+       }
+};
+MODULE_DEVICE_TABLE(of, compositor_of_match);
+
+static int sti_compositor_probe(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct device_node *np = dev->of_node;
+       struct device_node *vtg_np;
+       struct sti_compositor *compo;
+       struct resource *res;
+       int err;
+
+       compo = devm_kzalloc(dev, sizeof(*compo), GFP_KERNEL);
+       if (!compo) {
+               DRM_ERROR("Failed to allocate compositor context\n");
+               return -ENOMEM;
+       }
+       compo->dev = dev;
+       compo->vtg_vblank_nb.notifier_call = sti_drm_crtc_vblank_cb;
+
+       /* populate data structure depending on compatibility */
+       BUG_ON(!of_match_node(compositor_of_match, np)->data);
+
+       memcpy(&compo->data, of_match_node(compositor_of_match, np)->data,
+              sizeof(struct sti_compositor_data));
+
+       /* Get Memory ressources */
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (res == NULL) {
+               DRM_ERROR("Get memory resource failed\n");
+               return -ENXIO;
+       }
+       compo->regs = devm_ioremap(dev, res->start, resource_size(res));
+       if (compo->regs == NULL) {
+               DRM_ERROR("Register mapping failed\n");
+               return -ENXIO;
+       }
+
+       /* Get clock resources */
+       compo->clk_compo_main = devm_clk_get(dev, "compo_main");
+       if (IS_ERR(compo->clk_compo_main)) {
+               DRM_ERROR("Cannot get compo_main clock\n");
+               return PTR_ERR(compo->clk_compo_main);
+       }
+
+       compo->clk_compo_aux = devm_clk_get(dev, "compo_aux");
+       if (IS_ERR(compo->clk_compo_aux)) {
+               DRM_ERROR("Cannot get compo_aux clock\n");
+               return PTR_ERR(compo->clk_compo_aux);
+       }
+
+       compo->clk_pix_main = devm_clk_get(dev, "pix_main");
+       if (IS_ERR(compo->clk_pix_main)) {
+               DRM_ERROR("Cannot get pix_main clock\n");
+               return PTR_ERR(compo->clk_pix_main);
+       }
+
+       compo->clk_pix_aux = devm_clk_get(dev, "pix_aux");
+       if (IS_ERR(compo->clk_pix_aux)) {
+               DRM_ERROR("Cannot get pix_aux clock\n");
+               return PTR_ERR(compo->clk_pix_aux);
+       }
+
+       /* Get reset resources */
+       compo->rst_main = devm_reset_control_get(dev, "compo-main");
+       /* Take compo main out of reset */
+       if (!IS_ERR(compo->rst_main))
+               reset_control_deassert(compo->rst_main);
+
+       compo->rst_aux = devm_reset_control_get(dev, "compo-aux");
+       /* Take compo aux out of reset */
+       if (!IS_ERR(compo->rst_aux))
+               reset_control_deassert(compo->rst_aux);
+
+       vtg_np = of_parse_phandle(pdev->dev.of_node, "st,vtg", 0);
+       if (vtg_np)
+               compo->vtg_main = of_vtg_find(vtg_np);
+
+       vtg_np = of_parse_phandle(pdev->dev.of_node, "st,vtg", 1);
+       if (vtg_np)
+               compo->vtg_aux = of_vtg_find(vtg_np);
+
+       /* Initialize compositor subdevices */
+       err = sti_compositor_init_subdev(compo, compo->data.subdev_desc,
+                                        compo->data.nb_subdev);
+       if (err)
+               return err;
+
+       platform_set_drvdata(pdev, compo);
+
+       return component_add(&pdev->dev, &sti_compositor_ops);
+}
+
+static int sti_compositor_remove(struct platform_device *pdev)
+{
+       component_del(&pdev->dev, &sti_compositor_ops);
+       return 0;
+}
+
+static struct platform_driver sti_compositor_driver = {
+       .driver = {
+               .name = "sti-compositor",
+               .owner = THIS_MODULE,
+               .of_match_table = compositor_of_match,
+       },
+       .probe = sti_compositor_probe,
+       .remove = sti_compositor_remove,
+};
+
+module_platform_driver(sti_compositor_driver);
+
+MODULE_AUTHOR("Benjamin Gaignard <benjamin.gaignard@st.com>");
+MODULE_DESCRIPTION("STMicroelectronics SoC DRM driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/gpu/drm/sti/sti_compositor.h b/drivers/gpu/drm/sti/sti_compositor.h
new file mode 100644 (file)
index 0000000..3ea19db
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) STMicroelectronics SA 2014
+ * Authors: Benjamin Gaignard <benjamin.gaignard@st.com>
+ *          Fabien Dessenne <fabien.dessenne@st.com>
+ *          for STMicroelectronics.
+ * License terms:  GNU General Public License (GPL), version 2
+ */
+
+#ifndef _STI_COMPOSITOR_H_
+#define _STI_COMPOSITOR_H_
+
+#include <linux/clk.h>
+#include <linux/kernel.h>
+
+#include "sti_layer.h"
+#include "sti_mixer.h"
+
+#define WAIT_NEXT_VSYNC_MS      50 /*ms*/
+
+#define STI_MAX_LAYER 8
+#define STI_MAX_MIXER 2
+
+enum sti_compositor_subdev_type {
+       STI_MIXER_MAIN_SUBDEV,
+       STI_MIXER_AUX_SUBDEV,
+       STI_GPD_SUBDEV,
+       STI_VID_SUBDEV,
+       STI_CURSOR_SUBDEV,
+};
+
+struct sti_compositor_subdev_descriptor {
+       enum sti_compositor_subdev_type type;
+       int id;
+       unsigned int offset;
+};
+
+/**
+ * STI Compositor data structure
+ *
+ * @nb_subdev: number of subdevices supported by the compositor
+ * @subdev_desc: subdev list description
+ */
+#define MAX_SUBDEV 9
+struct sti_compositor_data {
+       unsigned int nb_subdev;
+       struct sti_compositor_subdev_descriptor subdev_desc[MAX_SUBDEV];
+};
+
+/**
+ * STI Compositor structure
+ *
+ * @dev: driver device
+ * @regs: registers (main)
+ * @data: device data
+ * @clk_compo_main: clock for main compo
+ * @clk_compo_aux: clock for aux compo
+ * @clk_pix_main: pixel clock for main path
+ * @clk_pix_aux: pixel clock for aux path
+ * @rst_main: reset control of the main path
+ * @rst_aux: reset control of the aux path
+ * @mixer: array of mixers
+ * @vtg_main: vtg for main data path
+ * @vtg_aux: vtg for auxillary data path
+ * @layer: array of layers
+ * @nb_mixers: number of mixers for this compositor
+ * @nb_layers: number of layers (GDP,VID,...) for this compositor
+ * @enable: true if compositor is enable else false
+ * @vtg_vblank_nb: callback for VTG VSYNC notification
+ */
+struct sti_compositor {
+       struct device *dev;
+       void __iomem *regs;
+       struct sti_compositor_data data;
+       struct clk *clk_compo_main;
+       struct clk *clk_compo_aux;
+       struct clk *clk_pix_main;
+       struct clk *clk_pix_aux;
+       struct reset_control *rst_main;
+       struct reset_control *rst_aux;
+       struct sti_mixer *mixer[STI_MAX_MIXER];
+       struct sti_vtg *vtg_main;
+       struct sti_vtg *vtg_aux;
+       struct sti_layer *layer[STI_MAX_LAYER];
+       int nb_mixers;
+       int nb_layers;
+       bool enable;
+       struct notifier_block vtg_vblank_nb;
+};
+
+#endif
diff --git a/drivers/gpu/drm/sti/sti_drm_crtc.c b/drivers/gpu/drm/sti/sti_drm_crtc.c
new file mode 100644 (file)
index 0000000..d2ae0c0
--- /dev/null
@@ -0,0 +1,421 @@
+/*
+ * Copyright (C) STMicroelectronics SA 2014
+ * Authors: Benjamin Gaignard <benjamin.gaignard@st.com>
+ *          Fabien Dessenne <fabien.dessenne@st.com>
+ *          for STMicroelectronics.
+ * License terms:  GNU General Public License (GPL), version 2
+ */
+
+#include <linux/clk.h>
+
+#include <drm/drmP.h>
+#include <drm/drm_crtc_helper.h>
+
+#include "sti_compositor.h"
+#include "sti_drm_drv.h"
+#include "sti_drm_crtc.h"
+#include "sti_vtg.h"
+
+static void sti_drm_crtc_dpms(struct drm_crtc *crtc, int mode)
+{
+       DRM_DEBUG_KMS("\n");
+}
+
+static void sti_drm_crtc_prepare(struct drm_crtc *crtc)
+{
+       struct sti_mixer *mixer = to_sti_mixer(crtc);
+       struct device *dev = mixer->dev;
+       struct sti_compositor *compo = dev_get_drvdata(dev);
+
+       compo->enable = true;
+
+       /* Prepare and enable the compo IP clock */
+       if (mixer->id == STI_MIXER_MAIN) {
+               if (clk_prepare_enable(compo->clk_compo_main))
+                       DRM_INFO("Failed to prepare/enable compo_main clk\n");
+       } else {
+               if (clk_prepare_enable(compo->clk_compo_aux))
+                       DRM_INFO("Failed to prepare/enable compo_aux clk\n");
+       }
+}
+
+static void sti_drm_crtc_commit(struct drm_crtc *crtc)
+{
+       struct sti_mixer *mixer = to_sti_mixer(crtc);
+       struct device *dev = mixer->dev;
+       struct sti_compositor *compo = dev_get_drvdata(dev);
+       struct sti_layer *layer;
+
+       if ((!mixer || !compo)) {
+               DRM_ERROR("Can not find mixer or compositor)\n");
+               return;
+       }
+
+       /* get GDP which is reserved to the CRTC FB */
+       layer = to_sti_layer(crtc->primary);
+       if (layer)
+               sti_layer_commit(layer);
+       else
+               DRM_ERROR("Can not find CRTC dedicated plane (GDP0)\n");
+
+       /* Enable layer on mixer */
+       if (sti_mixer_set_layer_status(mixer, layer, true))
+               DRM_ERROR("Can not enable layer at mixer\n");
+}
+
+static bool sti_drm_crtc_mode_fixup(struct drm_crtc *crtc,
+                                   const struct drm_display_mode *mode,
+                                   struct drm_display_mode *adjusted_mode)
+{
+       /* accept the provided drm_display_mode, do not fix it up */
+       return true;
+}
+
+static int
+sti_drm_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *mode,
+                     struct drm_display_mode *adjusted_mode, int x, int y,
+                     struct drm_framebuffer *old_fb)
+{
+       struct sti_mixer *mixer = to_sti_mixer(crtc);
+       struct device *dev = mixer->dev;
+       struct sti_compositor *compo = dev_get_drvdata(dev);
+       struct sti_layer *layer;
+       struct clk *clk;
+       int rate = mode->clock * 1000;
+       int res;
+       unsigned int w, h;
+
+       DRM_DEBUG_KMS("CRTC:%d (%s) fb:%d mode:%d (%s)\n",
+                     crtc->base.id, sti_mixer_to_str(mixer),
+                     crtc->primary->fb->base.id, mode->base.id, mode->name);
+
+       DRM_DEBUG_KMS("%d %d %d %d %d %d %d %d %d %d 0x%x 0x%x\n",
+                     mode->vrefresh, mode->clock,
+                     mode->hdisplay,
+                     mode->hsync_start, mode->hsync_end,
+                     mode->htotal,
+                     mode->vdisplay,
+                     mode->vsync_start, mode->vsync_end,
+                     mode->vtotal, mode->type, mode->flags);
+
+       /* Set rate and prepare/enable pixel clock */
+       if (mixer->id == STI_MIXER_MAIN)
+               clk = compo->clk_pix_main;
+       else
+               clk = compo->clk_pix_aux;
+
+       res = clk_set_rate(clk, rate);
+       if (res < 0) {
+               DRM_ERROR("Cannot set rate (%dHz) for pix clk\n", rate);
+               return -EINVAL;
+       }
+       if (clk_prepare_enable(clk)) {
+               DRM_ERROR("Failed to prepare/enable pix clk\n");
+               return -EINVAL;
+       }
+
+       sti_vtg_set_config(mixer->id == STI_MIXER_MAIN ?
+                       compo->vtg_main : compo->vtg_aux, &crtc->mode);
+
+       /* a GDP is reserved to the CRTC FB */
+       layer = to_sti_layer(crtc->primary);
+       if (!layer) {
+               DRM_ERROR("Can not find GDP0)\n");
+               return -EINVAL;
+       }
+
+       /* copy the mode data adjusted by mode_fixup() into crtc->mode
+        * so that hardware can be set to proper mode
+        */
+       memcpy(&crtc->mode, adjusted_mode, sizeof(*adjusted_mode));
+
+       res = sti_mixer_set_layer_depth(mixer, layer);
+       if (res) {
+               DRM_ERROR("Can not set layer depth\n");
+               return -EINVAL;
+       }
+       res = sti_mixer_active_video_area(mixer, &crtc->mode);
+       if (res) {
+               DRM_ERROR("Can not set active video area\n");
+               return -EINVAL;
+       }
+
+       w = crtc->primary->fb->width - x;
+       h = crtc->primary->fb->height - y;
+
+       return sti_layer_prepare(layer, crtc->primary->fb, &crtc->mode,
+                       mixer->id, 0, 0, w, h, x, y, w, h);
+}
+
+static int sti_drm_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
+                                     struct drm_framebuffer *old_fb)
+{
+       struct sti_mixer *mixer = to_sti_mixer(crtc);
+       struct sti_layer *layer;
+       unsigned int w, h;
+       int ret;
+
+       DRM_DEBUG_KMS("CRTC:%d (%s) fb:%d (%d,%d)\n",
+                     crtc->base.id, sti_mixer_to_str(mixer),
+                     crtc->primary->fb->base.id, x, y);
+
+       /* GDP is reserved to the CRTC FB */
+       layer = to_sti_layer(crtc->primary);
+       if (!layer) {
+               DRM_ERROR("Can not find GDP0)\n");
+               ret = -EINVAL;
+               goto out;
+       }
+
+       w = crtc->primary->fb->width - crtc->x;
+       h = crtc->primary->fb->height - crtc->y;
+
+       ret = sti_layer_prepare(layer, crtc->primary->fb, &crtc->mode,
+                               mixer->id, 0, 0, w, h,
+                               crtc->x, crtc->y, w, h);
+       if (ret) {
+               DRM_ERROR("Can not prepare layer\n");
+               goto out;
+       }
+
+       sti_drm_crtc_commit(crtc);
+out:
+       return ret;
+}
+
+static void sti_drm_crtc_load_lut(struct drm_crtc *crtc)
+{
+       /* do nothing */
+}
+
+static void sti_drm_crtc_disable(struct drm_crtc *crtc)
+{
+       struct sti_mixer *mixer = to_sti_mixer(crtc);
+       struct device *dev = mixer->dev;
+       struct sti_compositor *compo = dev_get_drvdata(dev);
+       struct sti_layer *layer;
+
+       if (!compo->enable)
+               return;
+
+       DRM_DEBUG_KMS("CRTC:%d (%s)\n", crtc->base.id, sti_mixer_to_str(mixer));
+
+       /* Disable Background */
+       sti_mixer_set_background_status(mixer, false);
+
+       /* Disable GDP */
+       layer = to_sti_layer(crtc->primary);
+       if (!layer) {
+               DRM_ERROR("Cannot find GDP0\n");
+               return;
+       }
+
+       /* Disable layer at mixer level */
+       if (sti_mixer_set_layer_status(mixer, layer, false))
+               DRM_ERROR("Can not disable %s layer at mixer\n",
+                               sti_layer_to_str(layer));
+
+       /* Wait a while to be sure that a Vsync event is received */
+       msleep(WAIT_NEXT_VSYNC_MS);
+
+       /* Then disable layer itself */
+       sti_layer_disable(layer);
+
+       drm_vblank_off(crtc->dev, mixer->id);
+
+       /* Disable pixel clock and compo IP clocks */
+       if (mixer->id == STI_MIXER_MAIN) {
+               clk_disable_unprepare(compo->clk_pix_main);
+               clk_disable_unprepare(compo->clk_compo_main);
+       } else {
+               clk_disable_unprepare(compo->clk_pix_aux);
+               clk_disable_unprepare(compo->clk_compo_aux);
+       }
+
+       compo->enable = false;
+}
+
+static struct drm_crtc_helper_funcs sti_crtc_helper_funcs = {
+       .dpms = sti_drm_crtc_dpms,
+       .prepare = sti_drm_crtc_prepare,
+       .commit = sti_drm_crtc_commit,
+       .mode_fixup = sti_drm_crtc_mode_fixup,
+       .mode_set = sti_drm_crtc_mode_set,
+       .mode_set_base = sti_drm_crtc_mode_set_base,
+       .load_lut = sti_drm_crtc_load_lut,
+       .disable = sti_drm_crtc_disable,
+};
+
+static int sti_drm_crtc_page_flip(struct drm_crtc *crtc,
+                                 struct drm_framebuffer *fb,
+                                 struct drm_pending_vblank_event *event,
+                                 uint32_t page_flip_flags)
+{
+       struct drm_device *drm_dev = crtc->dev;
+       struct drm_framebuffer *old_fb;
+       struct sti_mixer *mixer = to_sti_mixer(crtc);
+       unsigned long flags;
+       int ret;
+
+       DRM_DEBUG_KMS("fb %d --> fb %d\n",
+                       crtc->primary->fb->base.id, fb->base.id);
+
+       mutex_lock(&drm_dev->struct_mutex);
+
+       old_fb = crtc->primary->fb;
+       crtc->primary->fb = fb;
+       ret = sti_drm_crtc_mode_set_base(crtc, crtc->x, crtc->y, old_fb);
+       if (ret) {
+               DRM_ERROR("failed\n");
+               crtc->primary->fb = old_fb;
+               goto out;
+       }
+
+       if (event) {
+               event->pipe = mixer->id;
+
+               ret = drm_vblank_get(drm_dev, event->pipe);
+               if (ret) {
+                       DRM_ERROR("Cannot get vblank\n");
+                       goto out;
+               }
+
+               spin_lock_irqsave(&drm_dev->event_lock, flags);
+               if (mixer->pending_event) {
+                       drm_vblank_put(drm_dev, event->pipe);
+                       ret = -EBUSY;
+               } else {
+                       mixer->pending_event = event;
+               }
+               spin_unlock_irqrestore(&drm_dev->event_lock, flags);
+       }
+out:
+       mutex_unlock(&drm_dev->struct_mutex);
+       return ret;
+}
+
+static void sti_drm_crtc_destroy(struct drm_crtc *crtc)
+{
+       DRM_DEBUG_KMS("\n");
+       drm_crtc_cleanup(crtc);
+}
+
+static int sti_drm_crtc_set_property(struct drm_crtc *crtc,
+                                    struct drm_property *property,
+                                    uint64_t val)
+{
+       DRM_DEBUG_KMS("\n");
+       return 0;
+}
+
+int sti_drm_crtc_vblank_cb(struct notifier_block *nb,
+                          unsigned long event, void *data)
+{
+       struct drm_device *drm_dev;
+       struct sti_compositor *compo =
+               container_of(nb, struct sti_compositor, vtg_vblank_nb);
+       int *crtc = data;
+       unsigned long flags;
+       struct sti_drm_private *priv;
+
+       drm_dev = compo->mixer[*crtc]->drm_crtc.dev;
+       priv = drm_dev->dev_private;
+
+       if ((event != VTG_TOP_FIELD_EVENT) &&
+           (event != VTG_BOTTOM_FIELD_EVENT)) {
+               DRM_ERROR("unknown event: %lu\n", event);
+               return -EINVAL;
+       }
+
+       drm_handle_vblank(drm_dev, *crtc);
+
+       spin_lock_irqsave(&drm_dev->event_lock, flags);
+       if (compo->mixer[*crtc]->pending_event) {
+               drm_send_vblank_event(drm_dev, -1,
+                               compo->mixer[*crtc]->pending_event);
+               drm_vblank_put(drm_dev, *crtc);
+               compo->mixer[*crtc]->pending_event = NULL;
+       }
+       spin_unlock_irqrestore(&drm_dev->event_lock, flags);
+
+       return 0;
+}
+
+int sti_drm_crtc_enable_vblank(struct drm_device *dev, int crtc)
+{
+       struct sti_drm_private *dev_priv = dev->dev_private;
+       struct sti_compositor *compo = dev_priv->compo;
+       struct notifier_block *vtg_vblank_nb = &compo->vtg_vblank_nb;
+
+       if (sti_vtg_register_client(crtc == STI_MIXER_MAIN ?
+                       compo->vtg_main : compo->vtg_aux,
+                       vtg_vblank_nb, crtc)) {
+               DRM_ERROR("Cannot register VTG notifier\n");
+               return -EINVAL;
+       }
+
+       return 0;
+}
+EXPORT_SYMBOL(sti_drm_crtc_enable_vblank);
+
+void sti_drm_crtc_disable_vblank(struct drm_device *dev, int crtc)
+{
+       struct sti_drm_private *priv = dev->dev_private;
+       struct sti_compositor *compo = priv->compo;
+       struct notifier_block *vtg_vblank_nb = &compo->vtg_vblank_nb;
+       unsigned long flags;
+
+       DRM_DEBUG_DRIVER("\n");
+
+       if (sti_vtg_unregister_client(crtc == STI_MIXER_MAIN ?
+                       compo->vtg_main : compo->vtg_aux, vtg_vblank_nb))
+               DRM_DEBUG_DRIVER("Warning: cannot unregister VTG notifier\n");
+
+       /* free the resources of the pending requests */
+       spin_lock_irqsave(&dev->event_lock, flags);
+       if (compo->mixer[crtc]->pending_event) {
+               drm_vblank_put(dev, crtc);
+               compo->mixer[crtc]->pending_event = NULL;
+       }
+       spin_unlock_irqrestore(&dev->event_lock, flags);
+
+}
+EXPORT_SYMBOL(sti_drm_crtc_disable_vblank);
+
+static struct drm_crtc_funcs sti_crtc_funcs = {
+       .set_config = drm_crtc_helper_set_config,
+       .page_flip = sti_drm_crtc_page_flip,
+       .destroy = sti_drm_crtc_destroy,
+       .set_property = sti_drm_crtc_set_property,
+};
+
+bool sti_drm_crtc_is_main(struct drm_crtc *crtc)
+{
+       struct sti_mixer *mixer = to_sti_mixer(crtc);
+
+       if (mixer->id == STI_MIXER_MAIN)
+               return true;
+
+       return false;
+}
+
+int sti_drm_crtc_init(struct drm_device *drm_dev, struct sti_mixer *mixer,
+               struct drm_plane *primary, struct drm_plane *cursor)
+{
+       struct drm_crtc *crtc = &mixer->drm_crtc;
+       int res;
+
+       res = drm_crtc_init_with_planes(drm_dev, crtc, primary, cursor,
+                       &sti_crtc_funcs);
+       if (res) {
+               DRM_ERROR("Can not initialze CRTC\n");
+               return -EINVAL;
+       }
+
+       drm_crtc_helper_add(crtc, &sti_crtc_helper_funcs);
+
+       DRM_DEBUG_DRIVER("drm CRTC:%d mapped to %s\n",
+                        crtc->base.id, sti_mixer_to_str(mixer));
+
+       return 0;
+}
diff --git a/drivers/gpu/drm/sti/sti_drm_crtc.h b/drivers/gpu/drm/sti/sti_drm_crtc.h
new file mode 100644 (file)
index 0000000..caca8b1
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) STMicroelectronics SA 2014
+ * Author: Benjamin Gaignard <benjamin.gaignard@st.com> for STMicroelectronics.
+ * License terms:  GNU General Public License (GPL), version 2
+ */
+
+#ifndef _STI_DRM_CRTC_H_
+#define _STI_DRM_CRTC_H_
+
+#include <drm/drmP.h>
+
+struct sti_mixer;
+
+int sti_drm_crtc_init(struct drm_device *drm_dev, struct sti_mixer *mixer,
+               struct drm_plane *primary, struct drm_plane *cursor);
+int sti_drm_crtc_enable_vblank(struct drm_device *dev, int crtc);
+void sti_drm_crtc_disable_vblank(struct drm_device *dev, int crtc);
+int sti_drm_crtc_vblank_cb(struct notifier_block *nb,
+               unsigned long event, void *data);
+bool sti_drm_crtc_is_main(struct drm_crtc *drm_crtc);
+
+#endif
diff --git a/drivers/gpu/drm/sti/sti_drm_drv.c b/drivers/gpu/drm/sti/sti_drm_drv.c
new file mode 100644 (file)
index 0000000..a7cc249
--- /dev/null
@@ -0,0 +1,241 @@
+/*
+ * Copyright (C) STMicroelectronics SA 2014
+ * Author: Benjamin Gaignard <benjamin.gaignard@st.com> for STMicroelectronics.
+ * License terms:  GNU General Public License (GPL), version 2
+ */
+
+#include <drm/drmP.h>
+
+#include <linux/component.h>
+#include <linux/debugfs.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/of_platform.h>
+
+#include <drm/drm_crtc_helper.h>
+#include <drm/drm_gem_cma_helper.h>
+#include <drm/drm_fb_cma_helper.h>
+
+#include "sti_drm_drv.h"
+#include "sti_drm_crtc.h"
+
+#define DRIVER_NAME    "sti"
+#define DRIVER_DESC    "STMicroelectronics SoC DRM"
+#define DRIVER_DATE    "20140601"
+#define DRIVER_MAJOR   1
+#define DRIVER_MINOR   0
+
+#define STI_MAX_FB_HEIGHT      4096
+#define STI_MAX_FB_WIDTH       4096
+
+static struct drm_mode_config_funcs sti_drm_mode_config_funcs = {
+       .fb_create = drm_fb_cma_create,
+};
+
+static void sti_drm_mode_config_init(struct drm_device *dev)
+{
+       dev->mode_config.min_width = 0;
+       dev->mode_config.min_height = 0;
+
+       /*
+        * set max width and height as default value.
+        * this value would be used to check framebuffer size limitation
+        * at drm_mode_addfb().
+        */
+       dev->mode_config.max_width = STI_MAX_FB_HEIGHT;
+       dev->mode_config.max_height = STI_MAX_FB_WIDTH;
+
+       dev->mode_config.funcs = &sti_drm_mode_config_funcs;
+}
+
+static int sti_drm_load(struct drm_device *dev, unsigned long flags)
+{
+       struct sti_drm_private *private;
+       int ret;
+
+       private = kzalloc(sizeof(struct sti_drm_private), GFP_KERNEL);
+       if (!private) {
+               DRM_ERROR("Failed to allocate private\n");
+               return -ENOMEM;
+       }
+       dev->dev_private = (void *)private;
+       private->drm_dev = dev;
+
+       drm_mode_config_init(dev);
+       drm_kms_helper_poll_init(dev);
+
+       sti_drm_mode_config_init(dev);
+
+       ret = component_bind_all(dev->dev, dev);
+       if (ret)
+               return ret;
+
+       drm_helper_disable_unused_functions(dev);
+
+#ifdef CONFIG_DRM_STI_FBDEV
+       drm_fbdev_cma_init(dev, 32,
+                  dev->mode_config.num_crtc,
+                  dev->mode_config.num_connector);
+#endif
+       return 0;
+}
+
+static const struct file_operations sti_drm_driver_fops = {
+       .owner = THIS_MODULE,
+       .open = drm_open,
+       .mmap = drm_gem_cma_mmap,
+       .poll = drm_poll,
+       .read = drm_read,
+       .unlocked_ioctl = drm_ioctl,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl = drm_compat_ioctl,
+#endif
+       .release = drm_release,
+};
+
+static struct dma_buf *sti_drm_gem_prime_export(struct drm_device *dev,
+                                               struct drm_gem_object *obj,
+                                               int flags)
+{
+       /* we want to be able to write in mmapped buffer */
+       flags |= O_RDWR;
+       return drm_gem_prime_export(dev, obj, flags);
+}
+
+static struct drm_driver sti_drm_driver = {
+       .driver_features = DRIVER_HAVE_IRQ | DRIVER_MODESET |
+           DRIVER_GEM | DRIVER_PRIME,
+       .load = sti_drm_load,
+       .gem_free_object = drm_gem_cma_free_object,
+       .gem_vm_ops = &drm_gem_cma_vm_ops,
+       .dumb_create = drm_gem_cma_dumb_create,
+       .dumb_map_offset = drm_gem_cma_dumb_map_offset,
+       .dumb_destroy = drm_gem_dumb_destroy,
+       .fops = &sti_drm_driver_fops,
+
+       .get_vblank_counter = drm_vblank_count,
+       .enable_vblank = sti_drm_crtc_enable_vblank,
+       .disable_vblank = sti_drm_crtc_disable_vblank,
+
+       .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
+       .prime_fd_to_handle = drm_gem_prime_fd_to_handle,
+       .gem_prime_export = sti_drm_gem_prime_export,
+       .gem_prime_import = drm_gem_prime_import,
+       .gem_prime_get_sg_table = drm_gem_cma_prime_get_sg_table,
+       .gem_prime_import_sg_table = drm_gem_cma_prime_import_sg_table,
+       .gem_prime_vmap = drm_gem_cma_prime_vmap,
+       .gem_prime_vunmap = drm_gem_cma_prime_vunmap,
+       .gem_prime_mmap = drm_gem_cma_prime_mmap,
+
+       .name = DRIVER_NAME,
+       .desc = DRIVER_DESC,
+       .date = DRIVER_DATE,
+       .major = DRIVER_MAJOR,
+       .minor = DRIVER_MINOR,
+};
+
+static int compare_of(struct device *dev, void *data)
+{
+       return dev->of_node == data;
+}
+
+static int sti_drm_bind(struct device *dev)
+{
+       return drm_platform_init(&sti_drm_driver, to_platform_device(dev));
+}
+
+static void sti_drm_unbind(struct device *dev)
+{
+       drm_put_dev(dev_get_drvdata(dev));
+}
+
+static const struct component_master_ops sti_drm_ops = {
+       .bind = sti_drm_bind,
+       .unbind = sti_drm_unbind,
+};
+
+static int sti_drm_master_probe(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct device_node *node = dev->parent->of_node;
+       struct device_node *child_np;
+       struct component_match *match = NULL;
+
+       dma_set_coherent_mask(dev, DMA_BIT_MASK(32));
+
+       child_np = of_get_next_available_child(node, NULL);
+
+       while (child_np) {
+               component_match_add(dev, &match, compare_of, child_np);
+               of_node_put(child_np);
+               child_np = of_get_next_available_child(node, child_np);
+       }
+
+       return component_master_add_with_match(dev, &sti_drm_ops, match);
+}
+
+static int sti_drm_master_remove(struct platform_device *pdev)
+{
+       component_master_del(&pdev->dev, &sti_drm_ops);
+       return 0;
+}
+
+static struct platform_driver sti_drm_master_driver = {
+       .probe = sti_drm_master_probe,
+       .remove = sti_drm_master_remove,
+       .driver = {
+               .owner = THIS_MODULE,
+               .name = DRIVER_NAME "__master",
+       },
+};
+
+static int sti_drm_platform_probe(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct device_node *node = dev->of_node;
+       struct platform_device *master;
+
+       of_platform_populate(node, NULL, NULL, dev);
+
+       platform_driver_register(&sti_drm_master_driver);
+       master = platform_device_register_resndata(dev,
+                       DRIVER_NAME "__master", -1,
+                       NULL, 0, NULL, 0);
+       if (!master)
+               return -EINVAL;
+
+       platform_set_drvdata(pdev, master);
+       return 0;
+}
+
+static int sti_drm_platform_remove(struct platform_device *pdev)
+{
+       struct platform_device *master = platform_get_drvdata(pdev);
+
+       of_platform_depopulate(&pdev->dev);
+       platform_device_unregister(master);
+       platform_driver_unregister(&sti_drm_master_driver);
+       return 0;
+}
+
+static const struct of_device_id sti_drm_dt_ids[] = {
+       { .compatible = "st,sti-display-subsystem", },
+       { /* end node */ },
+};
+MODULE_DEVICE_TABLE(of, sti_drm_dt_ids);
+
+static struct platform_driver sti_drm_platform_driver = {
+       .probe = sti_drm_platform_probe,
+       .remove = sti_drm_platform_remove,
+       .driver = {
+               .owner = THIS_MODULE,
+               .name = DRIVER_NAME,
+               .of_match_table = sti_drm_dt_ids,
+       },
+};
+
+module_platform_driver(sti_drm_platform_driver);
+
+MODULE_AUTHOR("Benjamin Gaignard <benjamin.gaignard@st.com>");
+MODULE_DESCRIPTION("STMicroelectronics SoC DRM driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/gpu/drm/sti/sti_drm_drv.h b/drivers/gpu/drm/sti/sti_drm_drv.h
new file mode 100644 (file)
index 0000000..ec5e2eb
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) STMicroelectronics SA 2014
+ * Author: Benjamin Gaignard <benjamin.gaignard@st.com> for STMicroelectronics.
+ * License terms:  GNU General Public License (GPL), version 2
+ */
+
+#ifndef _STI_DRM_DRV_H_
+#define _STI_DRM_DRV_H_
+
+#include <drm/drmP.h>
+
+struct sti_compositor;
+struct sti_tvout;
+
+/**
+ * STI drm private structure
+ * This structure is stored as private in the drm_device
+ *
+ * @compo:                 compositor
+ * @plane_zorder_property: z-order property for CRTC planes
+ * @drm_dev:               drm device
+ */
+struct sti_drm_private {
+       struct sti_compositor *compo;
+       struct drm_property *plane_zorder_property;
+       struct drm_device *drm_dev;
+};
+
+#endif
diff --git a/drivers/gpu/drm/sti/sti_drm_plane.c b/drivers/gpu/drm/sti/sti_drm_plane.c
new file mode 100644 (file)
index 0000000..f4118d4
--- /dev/null
@@ -0,0 +1,195 @@
+/*
+ * Copyright (C) STMicroelectronics SA 2014
+ * Authors: Benjamin Gaignard <benjamin.gaignard@st.com>
+ *          Fabien Dessenne <fabien.dessenne@st.com>
+ *          for STMicroelectronics.
+ * License terms:  GNU General Public License (GPL), version 2
+ */
+
+#include "sti_compositor.h"
+#include "sti_drm_drv.h"
+#include "sti_drm_plane.h"
+#include "sti_vtg.h"
+
+enum sti_layer_desc sti_layer_default_zorder[] = {
+       STI_GDP_0,
+       STI_VID_0,
+       STI_GDP_1,
+       STI_VID_1,
+       STI_GDP_2,
+       STI_GDP_3,
+};
+
+/* (Background) < GDP0 < VID0 < GDP1 < VID1 < GDP2 < GDP3 < (ForeGround) */
+
+static int
+sti_drm_update_plane(struct drm_plane *plane, struct drm_crtc *crtc,
+                    struct drm_framebuffer *fb, int crtc_x, int crtc_y,
+                    unsigned int crtc_w, unsigned int crtc_h,
+                    uint32_t src_x, uint32_t src_y,
+                    uint32_t src_w, uint32_t src_h)
+{
+       struct sti_layer *layer = to_sti_layer(plane);
+       struct sti_mixer *mixer = to_sti_mixer(crtc);
+       int res;
+
+       DRM_DEBUG_KMS("CRTC:%d (%s) drm plane:%d (%s) drm fb:%d\n",
+                     crtc->base.id, sti_mixer_to_str(mixer),
+                     plane->base.id, sti_layer_to_str(layer), fb->base.id);
+       DRM_DEBUG_KMS("(%dx%d)@(%d,%d)\n", crtc_w, crtc_h, crtc_x, crtc_y);
+
+       res = sti_mixer_set_layer_depth(mixer, layer);
+       if (res) {
+               DRM_ERROR("Can not set layer depth\n");
+               return res;
+       }
+
+       /* src_x are in 16.16 format. */
+       res = sti_layer_prepare(layer, fb, &crtc->mode, mixer->id,
+                       crtc_x, crtc_y, crtc_w, crtc_h,
+                       src_x >> 16, src_y >> 16,
+                       src_w >> 16, src_h >> 16);
+       if (res) {
+               DRM_ERROR("Layer prepare failed\n");
+               return res;
+       }
+
+       res = sti_layer_commit(layer);
+       if (res) {
+               DRM_ERROR("Layer commit failed\n");
+               return res;
+       }
+
+       res = sti_mixer_set_layer_status(mixer, layer, true);
+       if (res) {
+               DRM_ERROR("Can not enable layer at mixer\n");
+               return res;
+       }
+
+       return 0;
+}
+
+static int sti_drm_disable_plane(struct drm_plane *plane)
+{
+       struct sti_layer *layer;
+       struct sti_mixer *mixer;
+       int lay_res, mix_res;
+
+       if (!plane->crtc) {
+               DRM_DEBUG_DRIVER("drm plane:%d not enabled\n", plane->base.id);
+               return 0;
+       }
+       layer = to_sti_layer(plane);
+       mixer = to_sti_mixer(plane->crtc);
+
+       DRM_DEBUG_DRIVER("CRTC:%d (%s) drm plane:%d (%s)\n",
+                       plane->crtc->base.id, sti_mixer_to_str(mixer),
+                       plane->base.id, sti_layer_to_str(layer));
+
+       /* Disable layer at mixer level */
+       mix_res = sti_mixer_set_layer_status(mixer, layer, false);
+       if (mix_res)
+               DRM_ERROR("Can not disable layer at mixer\n");
+
+       /* Wait a while to be sure that a Vsync event is received */
+       msleep(WAIT_NEXT_VSYNC_MS);
+
+       /* Then disable layer itself */
+       lay_res = sti_layer_disable(layer);
+       if (lay_res)
+               DRM_ERROR("Layer disable failed\n");
+
+       if (lay_res || mix_res)
+               return -EINVAL;
+
+       return 0;
+}
+
+static void sti_drm_plane_destroy(struct drm_plane *plane)
+{
+       DRM_DEBUG_DRIVER("\n");
+
+       sti_drm_disable_plane(plane);
+       drm_plane_cleanup(plane);
+}
+
+static int sti_drm_plane_set_property(struct drm_plane *plane,
+                                     struct drm_property *property,
+                                     uint64_t val)
+{
+       struct drm_device *dev = plane->dev;
+       struct sti_drm_private *private = dev->dev_private;
+       struct sti_layer *layer = to_sti_layer(plane);
+
+       DRM_DEBUG_DRIVER("\n");
+
+       if (property == private->plane_zorder_property) {
+               layer->zorder = val;
+               return 0;
+       }
+
+       return -EINVAL;
+}
+
+static struct drm_plane_funcs sti_drm_plane_funcs = {
+       .update_plane = sti_drm_update_plane,
+       .disable_plane = sti_drm_disable_plane,
+       .destroy = sti_drm_plane_destroy,
+       .set_property = sti_drm_plane_set_property,
+};
+
+static void sti_drm_plane_attach_zorder_property(struct drm_plane *plane,
+                                                uint64_t default_val)
+{
+       struct drm_device *dev = plane->dev;
+       struct sti_drm_private *private = dev->dev_private;
+       struct drm_property *prop;
+       struct sti_layer *layer = to_sti_layer(plane);
+
+       prop = private->plane_zorder_property;
+       if (!prop) {
+               prop = drm_property_create_range(dev, 0, "zpos", 0,
+                                                GAM_MIXER_NB_DEPTH_LEVEL - 1);
+               if (!prop)
+                       return;
+
+               private->plane_zorder_property = prop;
+       }
+
+       drm_object_attach_property(&plane->base, prop, default_val);
+       layer->zorder = default_val;
+}
+
+struct drm_plane *sti_drm_plane_init(struct drm_device *dev,
+                                    struct sti_layer *layer,
+                                    unsigned int possible_crtcs,
+                                    enum drm_plane_type type)
+{
+       int err, i;
+       uint64_t default_zorder = 0;
+
+       err = drm_universal_plane_init(dev, &layer->plane, possible_crtcs,
+                            &sti_drm_plane_funcs,
+                            sti_layer_get_formats(layer),
+                            sti_layer_get_nb_formats(layer), type);
+       if (err) {
+               DRM_ERROR("Failed to initialize plane\n");
+               return NULL;
+       }
+
+       for (i = 0; i < ARRAY_SIZE(sti_layer_default_zorder); i++)
+               if (sti_layer_default_zorder[i] == layer->desc)
+                       break;
+
+       default_zorder = i;
+
+       if (type == DRM_PLANE_TYPE_OVERLAY)
+               sti_drm_plane_attach_zorder_property(&layer->plane,
+                               default_zorder);
+
+       DRM_DEBUG_DRIVER("drm plane:%d mapped to %s with zorder:%llu\n",
+                        layer->plane.base.id,
+                        sti_layer_to_str(layer), default_zorder);
+
+       return &layer->plane;
+}
diff --git a/drivers/gpu/drm/sti/sti_drm_plane.h b/drivers/gpu/drm/sti/sti_drm_plane.h
new file mode 100644 (file)
index 0000000..4f19183
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * Copyright (C) STMicroelectronics SA 2014
+ * Author: Benjamin Gaignard <benjamin.gaignard@st.com> for STMicroelectronics.
+ * License terms:  GNU General Public License (GPL), version 2
+ */
+
+#ifndef _STI_DRM_PLANE_H_
+#define _STI_DRM_PLANE_H_
+
+#include <drm/drmP.h>
+
+struct sti_layer;
+
+struct drm_plane *sti_drm_plane_init(struct drm_device *dev,
+               struct sti_layer *layer,
+               unsigned int possible_crtcs,
+               enum drm_plane_type type);
+#endif
diff --git a/drivers/gpu/drm/sti/sti_gdp.c b/drivers/gpu/drm/sti/sti_gdp.c
new file mode 100644 (file)
index 0000000..4e30b74
--- /dev/null
@@ -0,0 +1,549 @@
+/*
+ * Copyright (C) STMicroelectronics SA 2014
+ * Authors: Benjamin Gaignard <benjamin.gaignard@st.com>
+ *          Fabien Dessenne <fabien.dessenne@st.com>
+ *          for STMicroelectronics.
+ * License terms:  GNU General Public License (GPL), version 2
+ */
+
+#include <linux/clk.h>
+#include <linux/dma-mapping.h>
+
+#include "sti_compositor.h"
+#include "sti_gdp.h"
+#include "sti_layer.h"
+#include "sti_vtg.h"
+
+#define ENA_COLOR_FILL  BIT(8)
+#define WAIT_NEXT_VSYNC BIT(31)
+
+/* GDP color formats */
+#define GDP_RGB565      0x00
+#define GDP_RGB888      0x01
+#define GDP_RGB888_32   0x02
+#define GDP_ARGB8565    0x04
+#define GDP_ARGB8888    0x05
+#define GDP_ARGB1555    0x06
+#define GDP_ARGB4444    0x07
+#define GDP_CLUT8       0x0B
+#define GDP_YCBR888     0x10
+#define GDP_YCBR422R    0x12
+#define GDP_AYCBR8888   0x15
+
+#define GAM_GDP_CTL_OFFSET      0x00
+#define GAM_GDP_AGC_OFFSET      0x04
+#define GAM_GDP_VPO_OFFSET      0x0C
+#define GAM_GDP_VPS_OFFSET      0x10
+#define GAM_GDP_PML_OFFSET      0x14
+#define GAM_GDP_PMP_OFFSET      0x18
+#define GAM_GDP_SIZE_OFFSET     0x1C
+#define GAM_GDP_NVN_OFFSET      0x24
+#define GAM_GDP_KEY1_OFFSET     0x28
+#define GAM_GDP_KEY2_OFFSET     0x2C
+#define GAM_GDP_PPT_OFFSET      0x34
+#define GAM_GDP_CML_OFFSET      0x3C
+#define GAM_GDP_MST_OFFSET      0x68
+
+#define GAM_GDP_ALPHARANGE_255  BIT(5)
+#define GAM_GDP_AGC_FULL_RANGE  0x00808080
+#define GAM_GDP_PPT_IGNORE      (BIT(1) | BIT(0))
+#define GAM_GDP_SIZE_MAX        0x7FF
+
+#define GDP_NODE_NB_BANK       2
+#define GDP_NODE_PER_FIELD     2
+
+struct sti_gdp_node {
+       u32 gam_gdp_ctl;
+       u32 gam_gdp_agc;
+       u32 reserved1;
+       u32 gam_gdp_vpo;
+       u32 gam_gdp_vps;
+       u32 gam_gdp_pml;
+       u32 gam_gdp_pmp;
+       u32 gam_gdp_size;
+       u32 reserved2;
+       u32 gam_gdp_nvn;
+       u32 gam_gdp_key1;
+       u32 gam_gdp_key2;
+       u32 reserved3;
+       u32 gam_gdp_ppt;
+       u32 reserved4;
+       u32 gam_gdp_cml;
+};
+
+struct sti_gdp_node_list {
+       struct sti_gdp_node *top_field;
+       struct sti_gdp_node *btm_field;
+};
+
+/**
+ * STI GDP structure
+ *
+ * @layer:             layer structure
+ * @clk_pix:            pixel clock for the current gdp
+ * @vtg_field_nb:       callback for VTG FIELD (top or bottom) notification
+ * @is_curr_top:        true if the current node processed is the top field
+ * @node_list:         array of node list
+ */
+struct sti_gdp {
+       struct sti_layer layer;
+       struct clk *clk_pix;
+       struct notifier_block vtg_field_nb;
+       bool is_curr_top;
+       struct sti_gdp_node_list node_list[GDP_NODE_NB_BANK];
+};
+
+#define to_sti_gdp(x) container_of(x, struct sti_gdp, layer)
+
+static const uint32_t gdp_supported_formats[] = {
+       DRM_FORMAT_XRGB8888,
+       DRM_FORMAT_ARGB8888,
+       DRM_FORMAT_ARGB4444,
+       DRM_FORMAT_ARGB1555,
+       DRM_FORMAT_RGB565,
+       DRM_FORMAT_RGB888,
+       DRM_FORMAT_AYUV,
+       DRM_FORMAT_YUV444,
+       DRM_FORMAT_VYUY,
+       DRM_FORMAT_C8,
+};
+
+static const uint32_t *sti_gdp_get_formats(struct sti_layer *layer)
+{
+       return gdp_supported_formats;
+}
+
+static unsigned int sti_gdp_get_nb_formats(struct sti_layer *layer)
+{
+       return ARRAY_SIZE(gdp_supported_formats);
+}
+
+static int sti_gdp_fourcc2format(int fourcc)
+{
+       switch (fourcc) {
+       case DRM_FORMAT_XRGB8888:
+               return GDP_RGB888_32;
+       case DRM_FORMAT_ARGB8888:
+               return GDP_ARGB8888;
+       case DRM_FORMAT_ARGB4444:
+               return GDP_ARGB4444;
+       case DRM_FORMAT_ARGB1555:
+               return GDP_ARGB1555;
+       case DRM_FORMAT_RGB565:
+               return GDP_RGB565;
+       case DRM_FORMAT_RGB888:
+               return GDP_RGB888;
+       case DRM_FORMAT_AYUV:
+               return GDP_AYCBR8888;
+       case DRM_FORMAT_YUV444:
+               return GDP_YCBR888;
+       case DRM_FORMAT_VYUY:
+               return GDP_YCBR422R;
+       case DRM_FORMAT_C8:
+               return GDP_CLUT8;
+       }
+       return -1;
+}
+
+static int sti_gdp_get_alpharange(int format)
+{
+       switch (format) {
+       case GDP_ARGB8565:
+       case GDP_ARGB8888:
+       case GDP_AYCBR8888:
+               return GAM_GDP_ALPHARANGE_255;
+       }
+       return 0;
+}
+
+/**
+ * sti_gdp_get_free_nodes
+ * @layer: gdp layer
+ *
+ * Look for a GDP node list that is not currently read by the HW.
+ *
+ * RETURNS:
+ * Pointer to the free GDP node list
+ */
+static struct sti_gdp_node_list *sti_gdp_get_free_nodes(struct sti_layer *layer)
+{
+       int hw_nvn;
+       void *virt_nvn;
+       struct sti_gdp *gdp = to_sti_gdp(layer);
+       unsigned int i;
+
+       hw_nvn = readl(layer->regs + GAM_GDP_NVN_OFFSET);
+       if (!hw_nvn)
+               goto end;
+
+       virt_nvn = dma_to_virt(layer->dev, (dma_addr_t) hw_nvn);
+
+       for (i = 0; i < GDP_NODE_NB_BANK; i++)
+               if ((virt_nvn != gdp->node_list[i].btm_field) &&
+                   (virt_nvn != gdp->node_list[i].top_field))
+                       return &gdp->node_list[i];
+
+       /* in hazardious cases restart with the first node */
+       DRM_ERROR("inconsistent NVN for %s: 0x%08X\n",
+                       sti_layer_to_str(layer), hw_nvn);
+
+end:
+       return &gdp->node_list[0];
+}
+
+/**
+ * sti_gdp_get_current_nodes
+ * @layer: GDP layer
+ *
+ * Look for GDP nodes that are currently read by the HW.
+ *
+ * RETURNS:
+ * Pointer to the current GDP node list
+ */
+static
+struct sti_gdp_node_list *sti_gdp_get_current_nodes(struct sti_layer *layer)
+{
+       int hw_nvn;
+       void *virt_nvn;
+       struct sti_gdp *gdp = to_sti_gdp(layer);
+       unsigned int i;
+
+       hw_nvn = readl(layer->regs + GAM_GDP_NVN_OFFSET);
+       if (!hw_nvn)
+               goto end;
+
+       virt_nvn = dma_to_virt(layer->dev, (dma_addr_t) hw_nvn);
+
+       for (i = 0; i < GDP_NODE_NB_BANK; i++)
+               if ((virt_nvn == gdp->node_list[i].btm_field) ||
+                               (virt_nvn == gdp->node_list[i].top_field))
+                       return &gdp->node_list[i];
+
+end:
+       DRM_DEBUG_DRIVER("Warning, NVN 0x%08X for %s does not match any node\n",
+                               hw_nvn, sti_layer_to_str(layer));
+
+       return NULL;
+}
+
+/**
+ * sti_gdp_prepare_layer
+ * @lay: gdp layer
+ * @first_prepare: true if it is the first time this function is called
+ *
+ * Update the free GDP node list according to the layer properties.
+ *
+ * RETURNS:
+ * 0 on success.
+ */
+static int sti_gdp_prepare_layer(struct sti_layer *layer, bool first_prepare)
+{
+       struct sti_gdp_node_list *list;
+       struct sti_gdp_node *top_field, *btm_field;
+       struct drm_display_mode *mode = layer->mode;
+       struct device *dev = layer->dev;
+       struct sti_gdp *gdp = to_sti_gdp(layer);
+       struct sti_compositor *compo = dev_get_drvdata(dev);
+       int format;
+       unsigned int depth, bpp;
+       int rate = mode->clock * 1000;
+       int res;
+       u32 ydo, xdo, yds, xds;
+
+       list = sti_gdp_get_free_nodes(layer);
+       top_field = list->top_field;
+       btm_field = list->btm_field;
+
+       dev_dbg(dev, "%s %s top_node:0x%p btm_node:0x%p\n", __func__,
+                       sti_layer_to_str(layer), top_field, btm_field);
+
+       /* Build the top field from layer params */
+       top_field->gam_gdp_agc = GAM_GDP_AGC_FULL_RANGE;
+       top_field->gam_gdp_ctl = WAIT_NEXT_VSYNC;
+       format = sti_gdp_fourcc2format(layer->format);
+       if (format == -1) {
+               DRM_ERROR("Format not supported by GDP %.4s\n",
+                         (char *)&layer->format);
+               return 1;
+       }
+       top_field->gam_gdp_ctl |= format;
+       top_field->gam_gdp_ctl |= sti_gdp_get_alpharange(format);
+       top_field->gam_gdp_ppt &= ~GAM_GDP_PPT_IGNORE;
+
+       /* pixel memory location */
+       drm_fb_get_bpp_depth(layer->format, &depth, &bpp);
+       top_field->gam_gdp_pml = (u32) layer->paddr + layer->offsets[0];
+       top_field->gam_gdp_pml += layer->src_x * (bpp >> 3);
+       top_field->gam_gdp_pml += layer->src_y * layer->pitches[0];
+
+       /* input parameters */
+       top_field->gam_gdp_pmp = layer->pitches[0];
+       top_field->gam_gdp_size =
+           clamp_val(layer->src_h, 0, GAM_GDP_SIZE_MAX) << 16 |
+           clamp_val(layer->src_w, 0, GAM_GDP_SIZE_MAX);
+
+       /* output parameters */
+       ydo = sti_vtg_get_line_number(*mode, layer->dst_y);
+       yds = sti_vtg_get_line_number(*mode, layer->dst_y + layer->dst_h - 1);
+       xdo = sti_vtg_get_pixel_number(*mode, layer->dst_x);
+       xds = sti_vtg_get_pixel_number(*mode, layer->dst_x + layer->dst_w - 1);
+       top_field->gam_gdp_vpo = (ydo << 16) | xdo;
+       top_field->gam_gdp_vps = (yds << 16) | xds;
+
+       /* Same content and chained together */
+       memcpy(btm_field, top_field, sizeof(*btm_field));
+       top_field->gam_gdp_nvn = virt_to_dma(dev, btm_field);
+       btm_field->gam_gdp_nvn = virt_to_dma(dev, top_field);
+
+       /* Interlaced mode */
+       if (layer->mode->flags & DRM_MODE_FLAG_INTERLACE)
+               btm_field->gam_gdp_pml = top_field->gam_gdp_pml +
+                   layer->pitches[0];
+
+       if (first_prepare) {
+               /* Register gdp callback */
+               if (sti_vtg_register_client(layer->mixer_id == STI_MIXER_MAIN ?
+                               compo->vtg_main : compo->vtg_aux,
+                               &gdp->vtg_field_nb, layer->mixer_id)) {
+                       DRM_ERROR("Cannot register VTG notifier\n");
+                       return 1;
+               }
+
+               /* Set and enable gdp clock */
+               if (gdp->clk_pix) {
+                       res = clk_set_rate(gdp->clk_pix, rate);
+                       if (res < 0) {
+                               DRM_ERROR("Cannot set rate (%dHz) for gdp\n",
+                                               rate);
+                               return 1;
+                       }
+
+                       if (clk_prepare_enable(gdp->clk_pix)) {
+                               DRM_ERROR("Failed to prepare/enable gdp\n");
+                               return 1;
+                       }
+               }
+       }
+
+       return 0;
+}
+
+/**
+ * sti_gdp_commit_layer
+ * @lay: gdp layer
+ *
+ * Update the NVN field of the 'right' field of the current GDP node (being
+ * used by the HW) with the address of the updated ('free') top field GDP node.
+ * - In interlaced mode the 'right' field is the bottom field as we update
+ *   frames starting from their top field
+ * - In progressive mode, we update both bottom and top fields which are
+ *   equal nodes.
+ * At the next VSYNC, the updated node list will be used by the HW.
+ *
+ * RETURNS:
+ * 0 on success.
+ */
+static int sti_gdp_commit_layer(struct sti_layer *layer)
+{
+       struct sti_gdp_node_list *updated_list = sti_gdp_get_free_nodes(layer);
+       struct sti_gdp_node *updated_top_node = updated_list->top_field;
+       struct sti_gdp_node *updated_btm_node = updated_list->btm_field;
+       struct sti_gdp *gdp = to_sti_gdp(layer);
+       u32 dma_updated_top = virt_to_dma(layer->dev, updated_top_node);
+       u32 dma_updated_btm = virt_to_dma(layer->dev, updated_btm_node);
+       struct sti_gdp_node_list *curr_list = sti_gdp_get_current_nodes(layer);
+
+       dev_dbg(layer->dev, "%s %s top/btm_node:0x%p/0x%p\n", __func__,
+                       sti_layer_to_str(layer),
+                       updated_top_node, updated_btm_node);
+       dev_dbg(layer->dev, "Current NVN:0x%X\n",
+               readl(layer->regs + GAM_GDP_NVN_OFFSET));
+       dev_dbg(layer->dev, "Posted buff: %lx current buff: %x\n",
+               (unsigned long)layer->paddr,
+               readl(layer->regs + GAM_GDP_PML_OFFSET));
+
+       if (curr_list == NULL) {
+               /* First update or invalid node should directly write in the
+                * hw register */
+               DRM_DEBUG_DRIVER("%s first update (or invalid node)",
+                               sti_layer_to_str(layer));
+
+               writel(gdp->is_curr_top == true ?
+                               dma_updated_btm : dma_updated_top,
+                               layer->regs + GAM_GDP_NVN_OFFSET);
+               return 0;
+       }
+
+       if (layer->mode->flags & DRM_MODE_FLAG_INTERLACE) {
+               if (gdp->is_curr_top == true) {
+                       /* Do not update in the middle of the frame, but
+                        * postpone the update after the bottom field has
+                        * been displayed */
+                       curr_list->btm_field->gam_gdp_nvn = dma_updated_top;
+               } else {
+                       /* Direct update to avoid one frame delay */
+                       writel(dma_updated_top,
+                               layer->regs + GAM_GDP_NVN_OFFSET);
+               }
+       } else {
+               /* Direct update for progressive to avoid one frame delay */
+               writel(dma_updated_top, layer->regs + GAM_GDP_NVN_OFFSET);
+       }
+
+       return 0;
+}
+
+/**
+ * sti_gdp_disable_layer
+ * @lay: gdp layer
+ *
+ * Disable a GDP.
+ *
+ * RETURNS:
+ * 0 on success.
+ */
+static int sti_gdp_disable_layer(struct sti_layer *layer)
+{
+       unsigned int i;
+       struct sti_gdp *gdp = to_sti_gdp(layer);
+       struct sti_compositor *compo = dev_get_drvdata(layer->dev);
+
+       DRM_DEBUG_DRIVER("%s\n", sti_layer_to_str(layer));
+
+       /* Set the nodes as 'to be ignored on mixer' */
+       for (i = 0; i < GDP_NODE_NB_BANK; i++) {
+               gdp->node_list[i].top_field->gam_gdp_ppt |= GAM_GDP_PPT_IGNORE;
+               gdp->node_list[i].btm_field->gam_gdp_ppt |= GAM_GDP_PPT_IGNORE;
+       }
+
+       if (sti_vtg_unregister_client(layer->mixer_id == STI_MIXER_MAIN ?
+                       compo->vtg_main : compo->vtg_aux, &gdp->vtg_field_nb))
+               DRM_DEBUG_DRIVER("Warning: cannot unregister VTG notifier\n");
+
+       if (gdp->clk_pix)
+               clk_disable_unprepare(gdp->clk_pix);
+
+       return 0;
+}
+
+/**
+ * sti_gdp_field_cb
+ * @nb: notifier block
+ * @event: event message
+ * @data: private data
+ *
+ * Handle VTG top field and bottom field event.
+ *
+ * RETURNS:
+ * 0 on success.
+ */
+int sti_gdp_field_cb(struct notifier_block *nb,
+               unsigned long event, void *data)
+{
+       struct sti_gdp *gdp = container_of(nb, struct sti_gdp, vtg_field_nb);
+
+       switch (event) {
+       case VTG_TOP_FIELD_EVENT:
+               gdp->is_curr_top = true;
+               break;
+       case VTG_BOTTOM_FIELD_EVENT:
+               gdp->is_curr_top = false;
+               break;
+       default:
+               DRM_ERROR("unsupported event: %lu\n", event);
+               break;
+       }
+
+       return 0;
+}
+
+static void sti_gdp_init(struct sti_layer *layer)
+{
+       struct sti_gdp *gdp = to_sti_gdp(layer);
+       struct device_node *np = layer->dev->of_node;
+       dma_addr_t dma;
+       void *base;
+       unsigned int i, size;
+
+       /* Allocate all the nodes within a single memory page */
+       size = sizeof(struct sti_gdp_node) *
+           GDP_NODE_PER_FIELD * GDP_NODE_NB_BANK;
+
+       base = dma_alloc_writecombine(layer->dev,
+                       size, &dma, GFP_KERNEL | GFP_DMA);
+       if (!base) {
+               DRM_ERROR("Failed to allocate memory for GDP node\n");
+               return;
+       }
+       memset(base, 0, size);
+
+       for (i = 0; i < GDP_NODE_NB_BANK; i++) {
+               if (virt_to_dma(layer->dev, base) & 0xF) {
+                       DRM_ERROR("Mem alignment failed\n");
+                       return;
+               }
+               gdp->node_list[i].top_field = base;
+               DRM_DEBUG_DRIVER("node[%d].top_field=%p\n", i, base);
+               base += sizeof(struct sti_gdp_node);
+
+               if (virt_to_dma(layer->dev, base) & 0xF) {
+                       DRM_ERROR("Mem alignment failed\n");
+                       return;
+               }
+               gdp->node_list[i].btm_field = base;
+               DRM_DEBUG_DRIVER("node[%d].btm_field=%p\n", i, base);
+               base += sizeof(struct sti_gdp_node);
+       }
+
+       if (of_device_is_compatible(np, "st,stih407-compositor")) {
+               /* GDP of STiH407 chip have its own pixel clock */
+               char *clk_name;
+
+               switch (layer->desc) {
+               case STI_GDP_0:
+                       clk_name = "pix_gdp1";
+                       break;
+               case STI_GDP_1:
+                       clk_name = "pix_gdp2";
+                       break;
+               case STI_GDP_2:
+                       clk_name = "pix_gdp3";
+                       break;
+               case STI_GDP_3:
+                       clk_name = "pix_gdp4";
+                       break;
+               default:
+                       DRM_ERROR("GDP id not recognized\n");
+                       return;
+               }
+
+               gdp->clk_pix = devm_clk_get(layer->dev, clk_name);
+               if (IS_ERR(gdp->clk_pix))
+                       DRM_ERROR("Cannot get %s clock\n", clk_name);
+       }
+}
+
+static const struct sti_layer_funcs gdp_ops = {
+       .get_formats = sti_gdp_get_formats,
+       .get_nb_formats = sti_gdp_get_nb_formats,
+       .init = sti_gdp_init,
+       .prepare = sti_gdp_prepare_layer,
+       .commit = sti_gdp_commit_layer,
+       .disable = sti_gdp_disable_layer,
+};
+
+struct sti_layer *sti_gdp_create(struct device *dev, int id)
+{
+       struct sti_gdp *gdp;
+
+       gdp = devm_kzalloc(dev, sizeof(*gdp), GFP_KERNEL);
+       if (!gdp) {
+               DRM_ERROR("Failed to allocate memory for GDP\n");
+               return NULL;
+       }
+
+       gdp->layer.ops = &gdp_ops;
+       gdp->vtg_field_nb.notifier_call = sti_gdp_field_cb;
+
+       return (struct sti_layer *)gdp;
+}
diff --git a/drivers/gpu/drm/sti/sti_gdp.h b/drivers/gpu/drm/sti/sti_gdp.h
new file mode 100644 (file)
index 0000000..1dab682
--- /dev/null
@@ -0,0 +1,16 @@
+/*
+ * Copyright (C) STMicroelectronics SA 2014
+ * Authors: Benjamin Gaignard <benjamin.gaignard@st.com>
+ *          Fabien Dessenne <fabien.dessenne@st.com>
+ *          for STMicroelectronics.
+ * License terms:  GNU General Public License (GPL), version 2
+ */
+
+#ifndef _STI_GDP_H_
+#define _STI_GDP_H_
+
+#include <linux/types.h>
+
+struct sti_layer *sti_gdp_create(struct device *dev, int id);
+
+#endif
diff --git a/drivers/gpu/drm/sti/sti_hda.c b/drivers/gpu/drm/sti/sti_hda.c
new file mode 100644 (file)
index 0000000..72d957f
--- /dev/null
@@ -0,0 +1,794 @@
+/*
+ * Copyright (C) STMicroelectronics SA 2014
+ * Author: Fabien Dessenne <fabien.dessenne@st.com> for STMicroelectronics.
+ * License terms:  GNU General Public License (GPL), version 2
+ */
+
+#include <linux/clk.h>
+#include <linux/component.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+
+#include <drm/drmP.h>
+#include <drm/drm_crtc_helper.h>
+
+/* HDformatter registers */
+#define HDA_ANA_CFG                     0x0000
+#define HDA_ANA_SCALE_CTRL_Y            0x0004
+#define HDA_ANA_SCALE_CTRL_CB           0x0008
+#define HDA_ANA_SCALE_CTRL_CR           0x000C
+#define HDA_ANA_ANC_CTRL                0x0010
+#define HDA_ANA_SRC_Y_CFG               0x0014
+#define HDA_COEFF_Y_PH1_TAP123          0x0018
+#define HDA_COEFF_Y_PH1_TAP456          0x001C
+#define HDA_COEFF_Y_PH2_TAP123          0x0020
+#define HDA_COEFF_Y_PH2_TAP456          0x0024
+#define HDA_COEFF_Y_PH3_TAP123          0x0028
+#define HDA_COEFF_Y_PH3_TAP456          0x002C
+#define HDA_COEFF_Y_PH4_TAP123          0x0030
+#define HDA_COEFF_Y_PH4_TAP456          0x0034
+#define HDA_ANA_SRC_C_CFG               0x0040
+#define HDA_COEFF_C_PH1_TAP123          0x0044
+#define HDA_COEFF_C_PH1_TAP456          0x0048
+#define HDA_COEFF_C_PH2_TAP123          0x004C
+#define HDA_COEFF_C_PH2_TAP456          0x0050
+#define HDA_COEFF_C_PH3_TAP123          0x0054
+#define HDA_COEFF_C_PH3_TAP456          0x0058
+#define HDA_COEFF_C_PH4_TAP123          0x005C
+#define HDA_COEFF_C_PH4_TAP456          0x0060
+#define HDA_SYNC_AWGI                   0x0300
+
+/* HDA_ANA_CFG */
+#define CFG_AWG_ASYNC_EN                BIT(0)
+#define CFG_AWG_ASYNC_HSYNC_MTD         BIT(1)
+#define CFG_AWG_ASYNC_VSYNC_MTD         BIT(2)
+#define CFG_AWG_SYNC_DEL                BIT(3)
+#define CFG_AWG_FLTR_MODE_SHIFT         4
+#define CFG_AWG_FLTR_MODE_MASK          (0xF << CFG_AWG_FLTR_MODE_SHIFT)
+#define CFG_AWG_FLTR_MODE_SD            (0 << CFG_AWG_FLTR_MODE_SHIFT)
+#define CFG_AWG_FLTR_MODE_ED            (1 << CFG_AWG_FLTR_MODE_SHIFT)
+#define CFG_AWG_FLTR_MODE_HD            (2 << CFG_AWG_FLTR_MODE_SHIFT)
+#define CFG_SYNC_ON_PBPR_MASK           BIT(8)
+#define CFG_PREFILTER_EN_MASK           BIT(9)
+#define CFG_PBPR_SYNC_OFF_SHIFT         16
+#define CFG_PBPR_SYNC_OFF_MASK          (0x7FF << CFG_PBPR_SYNC_OFF_SHIFT)
+#define CFG_PBPR_SYNC_OFF_VAL           0x117 /* Voltage dependent. stiH416 */
+
+/* Default scaling values */
+#define SCALE_CTRL_Y_DFLT               0x00C50256
+#define SCALE_CTRL_CB_DFLT              0x00DB0249
+#define SCALE_CTRL_CR_DFLT              0x00DB0249
+
+/* Video DACs control */
+#define VIDEO_DACS_CONTROL_MASK         0x0FFF
+#define VIDEO_DACS_CONTROL_SYSCFG2535   0x085C /* for stih416 */
+#define DAC_CFG_HD_OFF_SHIFT            5
+#define DAC_CFG_HD_OFF_MASK             (0x7 << DAC_CFG_HD_OFF_SHIFT)
+#define VIDEO_DACS_CONTROL_SYSCFG5072   0x0120 /* for stih407 */
+#define DAC_CFG_HD_HZUVW_OFF_MASK       BIT(1)
+
+
+/* Upsampler values for the alternative 2X Filter */
+#define SAMPLER_COEF_NB                 8
+#define HDA_ANA_SRC_Y_CFG_ALT_2X        0x01130000
+static u32 coef_y_alt_2x[] = {
+       0x00FE83FB, 0x1F900401, 0x00000000, 0x00000000,
+       0x00F408F9, 0x055F7C25, 0x00000000, 0x00000000
+};
+
+#define HDA_ANA_SRC_C_CFG_ALT_2X        0x01750004
+static u32 coef_c_alt_2x[] = {
+       0x001305F7, 0x05274BD0, 0x00000000, 0x00000000,
+       0x0004907C, 0x09C80B9D, 0x00000000, 0x00000000
+};
+
+/* Upsampler values for the 4X Filter */
+#define HDA_ANA_SRC_Y_CFG_4X            0x01ED0005
+#define HDA_ANA_SRC_C_CFG_4X            0x01ED0004
+static u32 coef_yc_4x[] = {
+       0x00FC827F, 0x008FE20B, 0x00F684FC, 0x050F7C24,
+       0x00F4857C, 0x0A1F402E, 0x00FA027F, 0x0E076E1D
+};
+
+/* AWG instructions for some video modes */
+#define AWG_MAX_INST                    64
+
+/* 720p@50 */
+static u32 AWGi_720p_50[] = {
+       0x00000971, 0x00000C26, 0x0000013B, 0x00000CDA,
+       0x00000104, 0x00000E7E, 0x00000E7F, 0x0000013B,
+       0x00000D8E, 0x00000104, 0x00001804, 0x00000971,
+       0x00000C26, 0x0000003B, 0x00000FB4, 0x00000FB5,
+       0x00000104, 0x00001AE8
+};
+
+#define NN_720p_50 ARRAY_SIZE(AWGi_720p_50)
+
+/* 720p@60 */
+static u32 AWGi_720p_60[] = {
+       0x00000971, 0x00000C26, 0x0000013B, 0x00000CDA,
+       0x00000104, 0x00000E7E, 0x00000E7F, 0x0000013B,
+       0x00000C44, 0x00000104, 0x00001804, 0x00000971,
+       0x00000C26, 0x0000003B, 0x00000F0F, 0x00000F10,
+       0x00000104, 0x00001AE8
+};
+
+#define NN_720p_60 ARRAY_SIZE(AWGi_720p_60)
+
+/* 1080p@30 */
+static u32 AWGi_1080p_30[] = {
+       0x00000971, 0x00000C2A, 0x0000013B, 0x00000C56,
+       0x00000104, 0x00000FDC, 0x00000FDD, 0x0000013B,
+       0x00000C2A, 0x00000104, 0x00001804, 0x00000971,
+       0x00000C2A, 0x0000003B, 0x00000EBE, 0x00000EBF,
+       0x00000EBF, 0x00000104, 0x00001A2F, 0x00001C4B,
+       0x00001C52
+};
+
+#define NN_1080p_30 ARRAY_SIZE(AWGi_1080p_30)
+
+/* 1080p@25 */
+static u32 AWGi_1080p_25[] = {
+       0x00000971, 0x00000C2A, 0x0000013B, 0x00000C56,
+       0x00000104, 0x00000FDC, 0x00000FDD, 0x0000013B,
+       0x00000DE2, 0x00000104, 0x00001804, 0x00000971,
+       0x00000C2A, 0x0000003B, 0x00000F51, 0x00000F51,
+       0x00000F52, 0x00000104, 0x00001A2F, 0x00001C4B,
+       0x00001C52
+};
+
+#define NN_1080p_25 ARRAY_SIZE(AWGi_1080p_25)
+
+/* 1080p@24 */
+static u32 AWGi_1080p_24[] = {
+       0x00000971, 0x00000C2A, 0x0000013B, 0x00000C56,
+       0x00000104, 0x00000FDC, 0x00000FDD, 0x0000013B,
+       0x00000E50, 0x00000104, 0x00001804, 0x00000971,
+       0x00000C2A, 0x0000003B, 0x00000F76, 0x00000F76,
+       0x00000F76, 0x00000104, 0x00001A2F, 0x00001C4B,
+       0x00001C52
+};
+
+#define NN_1080p_24 ARRAY_SIZE(AWGi_1080p_24)
+
+/* 720x480p@60 */
+static u32 AWGi_720x480p_60[] = {
+       0x00000904, 0x00000F18, 0x0000013B, 0x00001805,
+       0x00000904, 0x00000C3D, 0x0000003B, 0x00001A06
+};
+
+#define NN_720x480p_60 ARRAY_SIZE(AWGi_720x480p_60)
+
+/* Video mode category */
+enum sti_hda_vid_cat {
+       VID_SD,
+       VID_ED,
+       VID_HD_74M,
+       VID_HD_148M
+};
+
+struct sti_hda_video_config {
+       struct drm_display_mode mode;
+       u32 *awg_instr;
+       int nb_instr;
+       enum sti_hda_vid_cat vid_cat;
+};
+
+/* HD analog supported modes
+ * Interlaced modes may be added when supported by the whole display chain
+ */
+static const struct sti_hda_video_config hda_supported_modes[] = {
+       /* 1080p30 74.250Mhz */
+       {{DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2008,
+                  2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
+                  DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC)},
+        AWGi_1080p_30, NN_1080p_30, VID_HD_74M},
+       /* 1080p30 74.176Mhz */
+       {{DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74176, 1920, 2008,
+                  2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
+                  DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC)},
+        AWGi_1080p_30, NN_1080p_30, VID_HD_74M},
+       /* 1080p24 74.250Mhz */
+       {{DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2558,
+                  2602, 2750, 0, 1080, 1084, 1089, 1125, 0,
+                  DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC)},
+        AWGi_1080p_24, NN_1080p_24, VID_HD_74M},
+       /* 1080p24 74.176Mhz */
+       {{DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74176, 1920, 2558,
+                  2602, 2750, 0, 1080, 1084, 1089, 1125, 0,
+                  DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC)},
+        AWGi_1080p_24, NN_1080p_24, VID_HD_74M},
+       /* 1080p25 74.250Mhz */
+       {{DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2448,
+                  2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
+                  DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC)},
+        AWGi_1080p_25, NN_1080p_25, VID_HD_74M},
+       /* 720p60 74.250Mhz */
+       {{DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1390,
+                  1430, 1650, 0, 720, 725, 730, 750, 0,
+                  DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC)},
+        AWGi_720p_60, NN_720p_60, VID_HD_74M},
+       /* 720p60 74.176Mhz */
+       {{DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74176, 1280, 1390,
+                  1430, 1650, 0, 720, 725, 730, 750, 0,
+                  DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC)},
+        AWGi_720p_60, NN_720p_60, VID_HD_74M},
+       /* 720p50 74.250Mhz */
+       {{DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1720,
+                  1760, 1980, 0, 720, 725, 730, 750, 0,
+                  DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC)},
+        AWGi_720p_50, NN_720p_50, VID_HD_74M},
+       /* 720x480p60 27.027Mhz */
+       {{DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 27027, 720, 736,
+                  798, 858, 0, 480, 489, 495, 525, 0,
+                  DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC)},
+        AWGi_720x480p_60, NN_720x480p_60, VID_ED},
+       /* 720x480p60 27.000Mhz */
+       {{DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 27000, 720, 736,
+                  798, 858, 0, 480, 489, 495, 525, 0,
+                  DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC)},
+        AWGi_720x480p_60, NN_720x480p_60, VID_ED}
+};
+
+/**
+ * STI hd analog structure
+ *
+ * @dev: driver device
+ * @drm_dev: pointer to drm device
+ * @mode: current display mode selected
+ * @regs: HD analog register
+ * @video_dacs_ctrl: video DACS control register
+ * @enabled: true if HD analog is enabled else false
+ */
+struct sti_hda {
+       struct device dev;
+       struct drm_device *drm_dev;
+       struct drm_display_mode mode;
+       void __iomem *regs;
+       void __iomem *video_dacs_ctrl;
+       struct clk *clk_pix;
+       struct clk *clk_hddac;
+       bool enabled;
+};
+
+struct sti_hda_connector {
+       struct drm_connector drm_connector;
+       struct drm_encoder *encoder;
+       struct sti_hda *hda;
+};
+
+#define to_sti_hda_connector(x) \
+       container_of(x, struct sti_hda_connector, drm_connector)
+
+static u32 hda_read(struct sti_hda *hda, int offset)
+{
+       return readl(hda->regs + offset);
+}
+
+static void hda_write(struct sti_hda *hda, u32 val, int offset)
+{
+       writel(val, hda->regs + offset);
+}
+
+/**
+ * Search for a video mode in the supported modes table
+ *
+ * @mode: mode being searched
+ * @idx: index of the found mode
+ *
+ * Return true if mode is found
+ */
+static bool hda_get_mode_idx(struct drm_display_mode mode, int *idx)
+{
+       unsigned int i;
+
+       for (i = 0; i < ARRAY_SIZE(hda_supported_modes); i++)
+               if (drm_mode_equal(&hda_supported_modes[i].mode, &mode)) {
+                       *idx = i;
+                       return true;
+               }
+       return false;
+}
+
+/**
+ * Enable the HD DACS
+ *
+ * @hda: pointer to HD analog structure
+ * @enable: true if HD DACS need to be enabled, else false
+ */
+static void hda_enable_hd_dacs(struct sti_hda *hda, bool enable)
+{
+       u32 mask;
+
+       if (hda->video_dacs_ctrl) {
+               u32 val;
+
+               switch ((u32)hda->video_dacs_ctrl & VIDEO_DACS_CONTROL_MASK) {
+               case VIDEO_DACS_CONTROL_SYSCFG2535:
+                       mask = DAC_CFG_HD_OFF_MASK;
+                       break;
+               case VIDEO_DACS_CONTROL_SYSCFG5072:
+                       mask = DAC_CFG_HD_HZUVW_OFF_MASK;
+                       break;
+               default:
+                       DRM_INFO("Video DACS control register not supported!");
+                       return;
+               }
+
+               val = readl(hda->video_dacs_ctrl);
+               if (enable)
+                       val &= ~mask;
+               else
+                       val |= mask;
+
+               writel(val, hda->video_dacs_ctrl);
+       }
+}
+
+/**
+ * Configure AWG, writing instructions
+ *
+ * @hda: pointer to HD analog structure
+ * @awg_instr: pointer to AWG instructions table
+ * @nb: nb of AWG instructions
+ */
+static void sti_hda_configure_awg(struct sti_hda *hda, u32 *awg_instr, int nb)
+{
+       unsigned int i;
+
+       DRM_DEBUG_DRIVER("\n");
+
+       for (i = 0; i < nb; i++)
+               hda_write(hda, awg_instr[i], HDA_SYNC_AWGI + i * 4);
+       for (i = nb; i < AWG_MAX_INST; i++)
+               hda_write(hda, 0, HDA_SYNC_AWGI + i * 4);
+}
+
+static void sti_hda_disable(struct drm_bridge *bridge)
+{
+       struct sti_hda *hda = bridge->driver_private;
+       u32 val;
+
+       if (!hda->enabled)
+               return;
+
+       DRM_DEBUG_DRIVER("\n");
+
+       /* Disable HD DAC and AWG */
+       val = hda_read(hda, HDA_ANA_CFG);
+       val &= ~CFG_AWG_ASYNC_EN;
+       hda_write(hda, val, HDA_ANA_CFG);
+       hda_write(hda, 0, HDA_ANA_ANC_CTRL);
+
+       hda_enable_hd_dacs(hda, false);
+
+       /* Disable/unprepare hda clock */
+       clk_disable_unprepare(hda->clk_hddac);
+       clk_disable_unprepare(hda->clk_pix);
+
+       hda->enabled = false;
+}
+
+static void sti_hda_pre_enable(struct drm_bridge *bridge)
+{
+       struct sti_hda *hda = bridge->driver_private;
+       u32 val, i, mode_idx;
+       u32 src_filter_y, src_filter_c;
+       u32 *coef_y, *coef_c;
+       u32 filter_mode;
+
+       DRM_DEBUG_DRIVER("\n");
+
+       if (hda->enabled)
+               return;
+
+       /* Prepare/enable clocks */
+       if (clk_prepare_enable(hda->clk_pix))
+               DRM_ERROR("Failed to prepare/enable hda_pix clk\n");
+       if (clk_prepare_enable(hda->clk_hddac))
+               DRM_ERROR("Failed to prepare/enable hda_hddac clk\n");
+
+       if (!hda_get_mode_idx(hda->mode, &mode_idx)) {
+               DRM_ERROR("Undefined mode\n");
+               return;
+       }
+
+       switch (hda_supported_modes[mode_idx].vid_cat) {
+       case VID_HD_148M:
+               DRM_ERROR("Beyond HD analog capabilities\n");
+               return;
+       case VID_HD_74M:
+               /* HD use alternate 2x filter */
+               filter_mode = CFG_AWG_FLTR_MODE_HD;
+               src_filter_y = HDA_ANA_SRC_Y_CFG_ALT_2X;
+               src_filter_c = HDA_ANA_SRC_C_CFG_ALT_2X;
+               coef_y = coef_y_alt_2x;
+               coef_c = coef_c_alt_2x;
+               break;
+       case VID_ED:
+               /* ED uses 4x filter */
+               filter_mode = CFG_AWG_FLTR_MODE_ED;
+               src_filter_y = HDA_ANA_SRC_Y_CFG_4X;
+               src_filter_c = HDA_ANA_SRC_C_CFG_4X;
+               coef_y = coef_yc_4x;
+               coef_c = coef_yc_4x;
+               break;
+       case VID_SD:
+               DRM_ERROR("Not supported\n");
+               return;
+       default:
+               DRM_ERROR("Undefined resolution\n");
+               return;
+       }
+       DRM_DEBUG_DRIVER("Using HDA mode #%d\n", mode_idx);
+
+       /* Enable HD Video DACs */
+       hda_enable_hd_dacs(hda, true);
+
+       /* Configure scaler */
+       hda_write(hda, SCALE_CTRL_Y_DFLT, HDA_ANA_SCALE_CTRL_Y);
+       hda_write(hda, SCALE_CTRL_CB_DFLT, HDA_ANA_SCALE_CTRL_CB);
+       hda_write(hda, SCALE_CTRL_CR_DFLT, HDA_ANA_SCALE_CTRL_CR);
+
+       /* Configure sampler */
+       hda_write(hda , src_filter_y, HDA_ANA_SRC_Y_CFG);
+       hda_write(hda, src_filter_c,  HDA_ANA_SRC_C_CFG);
+       for (i = 0; i < SAMPLER_COEF_NB; i++) {
+               hda_write(hda, coef_y[i], HDA_COEFF_Y_PH1_TAP123 + i * 4);
+               hda_write(hda, coef_c[i], HDA_COEFF_C_PH1_TAP123 + i * 4);
+       }
+
+       /* Configure main HDFormatter */
+       val = 0;
+       val |= (hda->mode.flags & DRM_MODE_FLAG_INTERLACE) ?
+           0 : CFG_AWG_ASYNC_VSYNC_MTD;
+       val |= (CFG_PBPR_SYNC_OFF_VAL << CFG_PBPR_SYNC_OFF_SHIFT);
+       val |= filter_mode;
+       hda_write(hda, val, HDA_ANA_CFG);
+
+       /* Configure AWG */
+       sti_hda_configure_awg(hda, hda_supported_modes[mode_idx].awg_instr,
+                             hda_supported_modes[mode_idx].nb_instr);
+
+       /* Enable AWG */
+       val = hda_read(hda, HDA_ANA_CFG);
+       val |= CFG_AWG_ASYNC_EN;
+       hda_write(hda, val, HDA_ANA_CFG);
+
+       hda->enabled = true;
+}
+
+static void sti_hda_set_mode(struct drm_bridge *bridge,
+               struct drm_display_mode *mode,
+               struct drm_display_mode *adjusted_mode)
+{
+       struct sti_hda *hda = bridge->driver_private;
+       u32 mode_idx;
+       int hddac_rate;
+       int ret;
+
+       DRM_DEBUG_DRIVER("\n");
+
+       memcpy(&hda->mode, mode, sizeof(struct drm_display_mode));
+
+       if (!hda_get_mode_idx(hda->mode, &mode_idx)) {
+               DRM_ERROR("Undefined mode\n");
+               return;
+       }
+
+       switch (hda_supported_modes[mode_idx].vid_cat) {
+       case VID_HD_74M:
+               /* HD use alternate 2x filter */
+               hddac_rate = mode->clock * 1000 * 2;
+               break;
+       case VID_ED:
+               /* ED uses 4x filter */
+               hddac_rate = mode->clock * 1000 * 4;
+               break;
+       default:
+               DRM_ERROR("Undefined mode\n");
+               return;
+       }
+
+       /* HD DAC = 148.5Mhz or 108 Mhz */
+       ret = clk_set_rate(hda->clk_hddac, hddac_rate);
+       if (ret < 0)
+               DRM_ERROR("Cannot set rate (%dHz) for hda_hddac clk\n",
+                         hddac_rate);
+
+       /* HDformatter clock = compositor clock */
+       ret = clk_set_rate(hda->clk_pix, mode->clock * 1000);
+       if (ret < 0)
+               DRM_ERROR("Cannot set rate (%dHz) for hda_pix clk\n",
+                         mode->clock * 1000);
+}
+
+static void sti_hda_bridge_nope(struct drm_bridge *bridge)
+{
+       /* do nothing */
+}
+
+static void sti_hda_brigde_destroy(struct drm_bridge *bridge)
+{
+       drm_bridge_cleanup(bridge);
+       kfree(bridge);
+}
+
+static const struct drm_bridge_funcs sti_hda_bridge_funcs = {
+       .pre_enable = sti_hda_pre_enable,
+       .enable = sti_hda_bridge_nope,
+       .disable = sti_hda_disable,
+       .post_disable = sti_hda_bridge_nope,
+       .mode_set = sti_hda_set_mode,
+       .destroy = sti_hda_brigde_destroy,
+};
+
+static int sti_hda_connector_get_modes(struct drm_connector *connector)
+{
+       unsigned int i;
+       int count = 0;
+       struct sti_hda_connector *hda_connector
+               = to_sti_hda_connector(connector);
+       struct sti_hda *hda = hda_connector->hda;
+
+       DRM_DEBUG_DRIVER("\n");
+
+       for (i = 0; i < ARRAY_SIZE(hda_supported_modes); i++) {
+               struct drm_display_mode *mode =
+                       drm_mode_duplicate(hda->drm_dev,
+                                       &hda_supported_modes[i].mode);
+               if (!mode)
+                       continue;
+               mode->vrefresh = drm_mode_vrefresh(mode);
+
+               /* the first mode is the preferred mode */
+               if (i == 0)
+                       mode->type |= DRM_MODE_TYPE_PREFERRED;
+
+               drm_mode_probed_add(connector, mode);
+               count++;
+       }
+
+       drm_mode_sort(&connector->modes);
+
+       return count;
+}
+
+#define CLK_TOLERANCE_HZ 50
+
+static int sti_hda_connector_mode_valid(struct drm_connector *connector,
+                                       struct drm_display_mode *mode)
+{
+       int target = mode->clock * 1000;
+       int target_min = target - CLK_TOLERANCE_HZ;
+       int target_max = target + CLK_TOLERANCE_HZ;
+       int result;
+       int idx;
+       struct sti_hda_connector *hda_connector
+               = to_sti_hda_connector(connector);
+       struct sti_hda *hda = hda_connector->hda;
+
+       if (!hda_get_mode_idx(*mode, &idx)) {
+               return MODE_BAD;
+       } else {
+               result = clk_round_rate(hda->clk_pix, target);
+
+               DRM_DEBUG_DRIVER("target rate = %d => available rate = %d\n",
+                                target, result);
+
+               if ((result < target_min) || (result > target_max)) {
+                       DRM_DEBUG_DRIVER("hda pixclk=%d not supported\n",
+                                        target);
+                       return MODE_BAD;
+               }
+       }
+
+       return MODE_OK;
+}
+
+struct drm_encoder *sti_hda_best_encoder(struct drm_connector *connector)
+{
+       struct sti_hda_connector *hda_connector
+               = to_sti_hda_connector(connector);
+
+       /* Best encoder is the one associated during connector creation */
+       return hda_connector->encoder;
+}
+
+static struct drm_connector_helper_funcs sti_hda_connector_helper_funcs = {
+       .get_modes = sti_hda_connector_get_modes,
+       .mode_valid = sti_hda_connector_mode_valid,
+       .best_encoder = sti_hda_best_encoder,
+};
+
+static enum drm_connector_status
+sti_hda_connector_detect(struct drm_connector *connector, bool force)
+{
+       return connector_status_connected;
+}
+
+static void sti_hda_connector_destroy(struct drm_connector *connector)
+{
+       struct sti_hda_connector *hda_connector
+               = to_sti_hda_connector(connector);
+
+       drm_connector_unregister(connector);
+       drm_connector_cleanup(connector);
+       kfree(hda_connector);
+}
+
+static struct drm_connector_funcs sti_hda_connector_funcs = {
+       .dpms = drm_helper_connector_dpms,
+       .fill_modes = drm_helper_probe_single_connector_modes,
+       .detect = sti_hda_connector_detect,
+       .destroy = sti_hda_connector_destroy,
+};
+
+static struct drm_encoder *sti_hda_find_encoder(struct drm_device *dev)
+{
+       struct drm_encoder *encoder;
+
+       list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
+               if (encoder->encoder_type == DRM_MODE_ENCODER_DAC)
+                       return encoder;
+       }
+
+       return NULL;
+}
+
+static int sti_hda_bind(struct device *dev, struct device *master, void *data)
+{
+       struct sti_hda *hda = dev_get_drvdata(dev);
+       struct drm_device *drm_dev = data;
+       struct drm_encoder *encoder;
+       struct sti_hda_connector *connector;
+       struct drm_connector *drm_connector;
+       struct drm_bridge *bridge;
+       int err;
+
+       /* Set the drm device handle */
+       hda->drm_dev = drm_dev;
+
+       encoder = sti_hda_find_encoder(drm_dev);
+       if (!encoder)
+               return -ENOMEM;
+
+       connector = devm_kzalloc(dev, sizeof(*connector), GFP_KERNEL);
+       if (!connector)
+               return -ENOMEM;
+
+       connector->hda = hda;
+
+               bridge = devm_kzalloc(dev, sizeof(*bridge), GFP_KERNEL);
+       if (!bridge)
+               return -ENOMEM;
+
+       bridge->driver_private = hda;
+       drm_bridge_init(drm_dev, bridge, &sti_hda_bridge_funcs);
+
+       encoder->bridge = bridge;
+       connector->encoder = encoder;
+
+       drm_connector = (struct drm_connector *)connector;
+
+       drm_connector->polled = DRM_CONNECTOR_POLL_HPD;
+
+       drm_connector_init(drm_dev, drm_connector,
+                       &sti_hda_connector_funcs, DRM_MODE_CONNECTOR_Component);
+       drm_connector_helper_add(drm_connector,
+                       &sti_hda_connector_helper_funcs);
+
+       err = drm_connector_register(drm_connector);
+       if (err)
+               goto err_connector;
+
+       err = drm_mode_connector_attach_encoder(drm_connector, encoder);
+       if (err) {
+               DRM_ERROR("Failed to attach a connector to a encoder\n");
+               goto err_sysfs;
+       }
+
+       return 0;
+
+err_sysfs:
+       drm_connector_unregister(drm_connector);
+err_connector:
+       drm_bridge_cleanup(bridge);
+       drm_connector_cleanup(drm_connector);
+       return -EINVAL;
+}
+
+static void sti_hda_unbind(struct device *dev,
+               struct device *master, void *data)
+{
+       /* do nothing */
+}
+
+static const struct component_ops sti_hda_ops = {
+       .bind = sti_hda_bind,
+       .unbind = sti_hda_unbind,
+};
+
+static int sti_hda_probe(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct sti_hda *hda;
+       struct resource *res;
+
+       DRM_INFO("%s\n", __func__);
+
+       hda = devm_kzalloc(dev, sizeof(*hda), GFP_KERNEL);
+       if (!hda)
+               return -ENOMEM;
+
+       hda->dev = pdev->dev;
+
+       /* Get resources */
+       res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "hda-reg");
+       if (!res) {
+               DRM_ERROR("Invalid hda resource\n");
+               return -ENOMEM;
+       }
+       hda->regs = devm_ioremap_nocache(dev, res->start, resource_size(res));
+       if (IS_ERR(hda->regs))
+               return PTR_ERR(hda->regs);
+
+       res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
+                       "video-dacs-ctrl");
+       if (res) {
+               hda->video_dacs_ctrl = devm_ioremap_nocache(dev, res->start,
+                               resource_size(res));
+               if (IS_ERR(hda->video_dacs_ctrl))
+                       return PTR_ERR(hda->video_dacs_ctrl);
+       } else {
+               /* If no existing video-dacs-ctrl resource continue the probe */
+               DRM_DEBUG_DRIVER("No video-dacs-ctrl resource\n");
+               hda->video_dacs_ctrl = NULL;
+       }
+
+       /* Get clock resources */
+       hda->clk_pix = devm_clk_get(dev, "pix");
+       if (IS_ERR(hda->clk_pix)) {
+               DRM_ERROR("Cannot get hda_pix clock\n");
+               return PTR_ERR(hda->clk_pix);
+       }
+
+       hda->clk_hddac = devm_clk_get(dev, "hddac");
+       if (IS_ERR(hda->clk_hddac)) {
+               DRM_ERROR("Cannot get hda_hddac clock\n");
+               return PTR_ERR(hda->clk_hddac);
+       }
+
+       platform_set_drvdata(pdev, hda);
+
+       return component_add(&pdev->dev, &sti_hda_ops);
+}
+
+static int sti_hda_remove(struct platform_device *pdev)
+{
+       component_del(&pdev->dev, &sti_hda_ops);
+       return 0;
+}
+
+static struct of_device_id hda_of_match[] = {
+       { .compatible = "st,stih416-hda", },
+       { .compatible = "st,stih407-hda", },
+       { /* end node */ }
+};
+MODULE_DEVICE_TABLE(of, hda_of_match);
+
+struct platform_driver sti_hda_driver = {
+       .driver = {
+               .name = "sti-hda",
+               .owner = THIS_MODULE,
+               .of_match_table = hda_of_match,
+       },
+       .probe = sti_hda_probe,
+       .remove = sti_hda_remove,
+};
+
+module_platform_driver(sti_hda_driver);
+
+MODULE_AUTHOR("Benjamin Gaignard <benjamin.gaignard@st.com>");
+MODULE_DESCRIPTION("STMicroelectronics SoC DRM driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/gpu/drm/sti/sti_hdmi.c b/drivers/gpu/drm/sti/sti_hdmi.c
new file mode 100644 (file)
index 0000000..284e541
--- /dev/null
@@ -0,0 +1,810 @@
+/*
+ * Copyright (C) STMicroelectronics SA 2014
+ * Author: Vincent Abriou <vincent.abriou@st.com> for STMicroelectronics.
+ * License terms:  GNU General Public License (GPL), version 2
+ */
+
+#include <linux/clk.h>
+#include <linux/component.h>
+#include <linux/hdmi.h>
+#include <linux/module.h>
+#include <linux/of_gpio.h>
+#include <linux/platform_device.h>
+#include <linux/reset.h>
+
+#include <drm/drmP.h>
+#include <drm/drm_crtc_helper.h>
+#include <drm/drm_edid.h>
+
+#include "sti_hdmi.h"
+#include "sti_hdmi_tx3g4c28phy.h"
+#include "sti_hdmi_tx3g0c55phy.h"
+#include "sti_vtg.h"
+
+#define HDMI_CFG                        0x0000
+#define HDMI_INT_EN                     0x0004
+#define HDMI_INT_STA                    0x0008
+#define HDMI_INT_CLR                    0x000C
+#define HDMI_STA                        0x0010
+#define HDMI_ACTIVE_VID_XMIN            0x0100
+#define HDMI_ACTIVE_VID_XMAX            0x0104
+#define HDMI_ACTIVE_VID_YMIN            0x0108
+#define HDMI_ACTIVE_VID_YMAX            0x010C
+#define HDMI_DFLT_CHL0_DAT              0x0110
+#define HDMI_DFLT_CHL1_DAT              0x0114
+#define HDMI_DFLT_CHL2_DAT              0x0118
+#define HDMI_SW_DI_1_HEAD_WORD          0x0210
+#define HDMI_SW_DI_1_PKT_WORD0          0x0214
+#define HDMI_SW_DI_1_PKT_WORD1          0x0218
+#define HDMI_SW_DI_1_PKT_WORD2          0x021C
+#define HDMI_SW_DI_1_PKT_WORD3          0x0220
+#define HDMI_SW_DI_1_PKT_WORD4          0x0224
+#define HDMI_SW_DI_1_PKT_WORD5          0x0228
+#define HDMI_SW_DI_1_PKT_WORD6          0x022C
+#define HDMI_SW_DI_CFG                  0x0230
+
+#define HDMI_IFRAME_SLOT_AVI            1
+
+#define  XCAT(prefix, x, suffix)        prefix ## x ## suffix
+#define  HDMI_SW_DI_N_HEAD_WORD(x)      XCAT(HDMI_SW_DI_, x, _HEAD_WORD)
+#define  HDMI_SW_DI_N_PKT_WORD0(x)      XCAT(HDMI_SW_DI_, x, _PKT_WORD0)
+#define  HDMI_SW_DI_N_PKT_WORD1(x)      XCAT(HDMI_SW_DI_, x, _PKT_WORD1)
+#define  HDMI_SW_DI_N_PKT_WORD2(x)      XCAT(HDMI_SW_DI_, x, _PKT_WORD2)
+#define  HDMI_SW_DI_N_PKT_WORD3(x)      XCAT(HDMI_SW_DI_, x, _PKT_WORD3)
+#define  HDMI_SW_DI_N_PKT_WORD4(x)      XCAT(HDMI_SW_DI_, x, _PKT_WORD4)
+#define  HDMI_SW_DI_N_PKT_WORD5(x)      XCAT(HDMI_SW_DI_, x, _PKT_WORD5)
+#define  HDMI_SW_DI_N_PKT_WORD6(x)      XCAT(HDMI_SW_DI_, x, _PKT_WORD6)
+
+#define HDMI_IFRAME_DISABLED            0x0
+#define HDMI_IFRAME_SINGLE_SHOT         0x1
+#define HDMI_IFRAME_FIELD               0x2
+#define HDMI_IFRAME_FRAME               0x3
+#define HDMI_IFRAME_MASK                0x3
+#define HDMI_IFRAME_CFG_DI_N(x, n)       ((x) << ((n-1)*4)) /* n from 1 to 6 */
+
+#define HDMI_CFG_DEVICE_EN              BIT(0)
+#define HDMI_CFG_HDMI_NOT_DVI           BIT(1)
+#define HDMI_CFG_HDCP_EN                BIT(2)
+#define HDMI_CFG_ESS_NOT_OESS           BIT(3)
+#define HDMI_CFG_H_SYNC_POL_NEG         BIT(4)
+#define HDMI_CFG_SINK_TERM_DET_EN       BIT(5)
+#define HDMI_CFG_V_SYNC_POL_NEG         BIT(6)
+#define HDMI_CFG_422_EN                 BIT(8)
+#define HDMI_CFG_FIFO_OVERRUN_CLR       BIT(12)
+#define HDMI_CFG_FIFO_UNDERRUN_CLR      BIT(13)
+#define HDMI_CFG_SW_RST_EN              BIT(31)
+
+#define HDMI_INT_GLOBAL                 BIT(0)
+#define HDMI_INT_SW_RST                 BIT(1)
+#define HDMI_INT_PIX_CAP                BIT(3)
+#define HDMI_INT_HOT_PLUG               BIT(4)
+#define HDMI_INT_DLL_LCK                BIT(5)
+#define HDMI_INT_NEW_FRAME              BIT(6)
+#define HDMI_INT_GENCTRL_PKT            BIT(7)
+#define HDMI_INT_SINK_TERM_PRESENT      BIT(11)
+
+#define HDMI_DEFAULT_INT (HDMI_INT_SINK_TERM_PRESENT \
+                       | HDMI_INT_DLL_LCK \
+                       | HDMI_INT_HOT_PLUG \
+                       | HDMI_INT_GLOBAL)
+
+#define HDMI_WORKING_INT (HDMI_INT_SINK_TERM_PRESENT \
+                       | HDMI_INT_GENCTRL_PKT \
+                       | HDMI_INT_NEW_FRAME \
+                       | HDMI_INT_DLL_LCK \
+                       | HDMI_INT_HOT_PLUG \
+                       | HDMI_INT_PIX_CAP \
+                       | HDMI_INT_SW_RST \
+                       | HDMI_INT_GLOBAL)
+
+#define HDMI_STA_SW_RST                 BIT(1)
+
+struct sti_hdmi_connector {
+       struct drm_connector drm_connector;
+       struct drm_encoder *encoder;
+       struct sti_hdmi *hdmi;
+};
+
+#define to_sti_hdmi_connector(x) \
+       container_of(x, struct sti_hdmi_connector, drm_connector)
+
+u32 hdmi_read(struct sti_hdmi *hdmi, int offset)
+{
+       return readl(hdmi->regs + offset);
+}
+
+void hdmi_write(struct sti_hdmi *hdmi, u32 val, int offset)
+{
+       writel(val, hdmi->regs + offset);
+}
+
+/**
+ * HDMI interrupt handler threaded
+ *
+ * @irq: irq number
+ * @arg: connector structure
+ */
+static irqreturn_t hdmi_irq_thread(int irq, void *arg)
+{
+       struct sti_hdmi *hdmi = arg;
+
+       /* Hot plug/unplug IRQ */
+       if (hdmi->irq_status & HDMI_INT_HOT_PLUG) {
+               /* read gpio to get the status */
+               hdmi->hpd = gpio_get_value(hdmi->hpd_gpio);
+               if (hdmi->drm_dev)
+                       drm_helper_hpd_irq_event(hdmi->drm_dev);
+       }
+
+       /* Sw reset and PLL lock are exclusive so we can use the same
+        * event to signal them
+        */
+       if (hdmi->irq_status & (HDMI_INT_SW_RST | HDMI_INT_DLL_LCK)) {
+               hdmi->event_received = true;
+               wake_up_interruptible(&hdmi->wait_event);
+       }
+
+       return IRQ_HANDLED;
+}
+
+/**
+ * HDMI interrupt handler
+ *
+ * @irq: irq number
+ * @arg: connector structure
+ */
+static irqreturn_t hdmi_irq(int irq, void *arg)
+{
+       struct sti_hdmi *hdmi = arg;
+
+       /* read interrupt status */
+       hdmi->irq_status = hdmi_read(hdmi, HDMI_INT_STA);
+
+       /* clear interrupt status */
+       hdmi_write(hdmi, hdmi->irq_status, HDMI_INT_CLR);
+
+       /* force sync bus write */
+       hdmi_read(hdmi, HDMI_INT_STA);
+
+       return IRQ_WAKE_THREAD;
+}
+
+/**
+ * Set hdmi active area depending on the drm display mode selected
+ *
+ * @hdmi: pointer on the hdmi internal structure
+ */
+static void hdmi_active_area(struct sti_hdmi *hdmi)
+{
+       u32 xmin, xmax;
+       u32 ymin, ymax;
+
+       xmin = sti_vtg_get_pixel_number(hdmi->mode, 0);
+       xmax = sti_vtg_get_pixel_number(hdmi->mode, hdmi->mode.hdisplay - 1);
+       ymin = sti_vtg_get_line_number(hdmi->mode, 0);
+       ymax = sti_vtg_get_line_number(hdmi->mode, hdmi->mode.vdisplay - 1);
+
+       hdmi_write(hdmi, xmin, HDMI_ACTIVE_VID_XMIN);
+       hdmi_write(hdmi, xmax, HDMI_ACTIVE_VID_XMAX);
+       hdmi_write(hdmi, ymin, HDMI_ACTIVE_VID_YMIN);
+       hdmi_write(hdmi, ymax, HDMI_ACTIVE_VID_YMAX);
+}
+
+/**
+ * Overall hdmi configuration
+ *
+ * @hdmi: pointer on the hdmi internal structure
+ */
+static void hdmi_config(struct sti_hdmi *hdmi)
+{
+       u32 conf;
+
+       DRM_DEBUG_DRIVER("\n");
+
+       /* Clear overrun and underrun fifo */
+       conf = HDMI_CFG_FIFO_OVERRUN_CLR | HDMI_CFG_FIFO_UNDERRUN_CLR;
+
+       /* Enable HDMI mode not DVI */
+       conf |= HDMI_CFG_HDMI_NOT_DVI | HDMI_CFG_ESS_NOT_OESS;
+
+       /* Enable sink term detection */
+       conf |= HDMI_CFG_SINK_TERM_DET_EN;
+
+       /* Set Hsync polarity */
+       if (hdmi->mode.flags & DRM_MODE_FLAG_NHSYNC) {
+               DRM_DEBUG_DRIVER("H Sync Negative\n");
+               conf |= HDMI_CFG_H_SYNC_POL_NEG;
+       }
+
+       /* Set Vsync polarity */
+       if (hdmi->mode.flags & DRM_MODE_FLAG_NVSYNC) {
+               DRM_DEBUG_DRIVER("V Sync Negative\n");
+               conf |= HDMI_CFG_V_SYNC_POL_NEG;
+       }
+
+       /* Enable HDMI */
+       conf |= HDMI_CFG_DEVICE_EN;
+
+       hdmi_write(hdmi, conf, HDMI_CFG);
+}
+
+/**
+ * Prepare and configure the AVI infoframe
+ *
+ * AVI infoframe are transmitted at least once per two video field and
+ * contains information about HDMI transmission mode such as color space,
+ * colorimetry, ...
+ *
+ * @hdmi: pointer on the hdmi internal structure
+ *
+ * Return negative value if error occurs
+ */
+static int hdmi_avi_infoframe_config(struct sti_hdmi *hdmi)
+{
+       struct drm_display_mode *mode = &hdmi->mode;
+       struct hdmi_avi_infoframe infoframe;
+       u8 buffer[HDMI_INFOFRAME_SIZE(AVI)];
+       u8 *frame = buffer + HDMI_INFOFRAME_HEADER_SIZE;
+       u32 val;
+       int ret;
+
+       DRM_DEBUG_DRIVER("\n");
+
+       ret = drm_hdmi_avi_infoframe_from_display_mode(&infoframe, mode);
+       if (ret < 0) {
+               DRM_ERROR("failed to setup AVI infoframe: %d\n", ret);
+               return ret;
+       }
+
+       /* fixed infoframe configuration not linked to the mode */
+       infoframe.colorspace = HDMI_COLORSPACE_RGB;
+       infoframe.quantization_range = HDMI_QUANTIZATION_RANGE_DEFAULT;
+       infoframe.colorimetry = HDMI_COLORIMETRY_NONE;
+
+       ret = hdmi_avi_infoframe_pack(&infoframe, buffer, sizeof(buffer));
+       if (ret < 0) {
+               DRM_ERROR("failed to pack AVI infoframe: %d\n", ret);
+               return ret;
+       }
+
+       /* Disable transmission slot for AVI infoframe */
+       val = hdmi_read(hdmi, HDMI_SW_DI_CFG);
+       val &= ~HDMI_IFRAME_CFG_DI_N(HDMI_IFRAME_MASK, HDMI_IFRAME_SLOT_AVI);
+       hdmi_write(hdmi, val, HDMI_SW_DI_CFG);
+
+       /* Infoframe header */
+       val = buffer[0x0];
+       val |= buffer[0x1] << 8;
+       val |= buffer[0x2] << 16;
+       hdmi_write(hdmi, val, HDMI_SW_DI_N_HEAD_WORD(HDMI_IFRAME_SLOT_AVI));
+
+       /* Infoframe packet bytes */
+       val = frame[0x0];
+       val |= frame[0x1] << 8;
+       val |= frame[0x2] << 16;
+       val |= frame[0x3] << 24;
+       hdmi_write(hdmi, val, HDMI_SW_DI_N_PKT_WORD0(HDMI_IFRAME_SLOT_AVI));
+
+       val = frame[0x4];
+       val |= frame[0x5] << 8;
+       val |= frame[0x6] << 16;
+       val |= frame[0x7] << 24;
+       hdmi_write(hdmi, val, HDMI_SW_DI_N_PKT_WORD1(HDMI_IFRAME_SLOT_AVI));
+
+       val = frame[0x8];
+       val |= frame[0x9] << 8;
+       val |= frame[0xA] << 16;
+       val |= frame[0xB] << 24;
+       hdmi_write(hdmi, val, HDMI_SW_DI_N_PKT_WORD2(HDMI_IFRAME_SLOT_AVI));
+
+       val = frame[0xC];
+       val |= frame[0xD] << 8;
+       hdmi_write(hdmi, val, HDMI_SW_DI_N_PKT_WORD3(HDMI_IFRAME_SLOT_AVI));
+
+       /* Enable transmission slot for AVI infoframe
+        * According to the hdmi specification, AVI infoframe should be
+        * transmitted at least once per two video fields
+        */
+       val = hdmi_read(hdmi, HDMI_SW_DI_CFG);
+       val |= HDMI_IFRAME_CFG_DI_N(HDMI_IFRAME_FIELD, HDMI_IFRAME_SLOT_AVI);
+       hdmi_write(hdmi, val, HDMI_SW_DI_CFG);
+
+       return 0;
+}
+
+/**
+ * Software reset of the hdmi subsystem
+ *
+ * @hdmi: pointer on the hdmi internal structure
+ *
+ */
+#define HDMI_TIMEOUT_SWRESET  100   /*milliseconds */
+static void hdmi_swreset(struct sti_hdmi *hdmi)
+{
+       u32 val;
+
+       DRM_DEBUG_DRIVER("\n");
+
+       /* Enable hdmi_audio clock only during hdmi reset */
+       if (clk_prepare_enable(hdmi->clk_audio))
+               DRM_INFO("Failed to prepare/enable hdmi_audio clk\n");
+
+       /* Sw reset */
+       hdmi->event_received = false;
+
+       val = hdmi_read(hdmi, HDMI_CFG);
+       val |= HDMI_CFG_SW_RST_EN;
+       hdmi_write(hdmi, val, HDMI_CFG);
+
+       /* Wait reset completed */
+       wait_event_interruptible_timeout(hdmi->wait_event,
+                                        hdmi->event_received == true,
+                                        msecs_to_jiffies
+                                        (HDMI_TIMEOUT_SWRESET));
+
+       /*
+        * HDMI_STA_SW_RST bit is set to '1' when SW_RST bit in HDMI_CFG is
+        * set to '1' and clk_audio is running.
+        */
+       if ((hdmi_read(hdmi, HDMI_STA) & HDMI_STA_SW_RST) == 0)
+               DRM_DEBUG_DRIVER("Warning: HDMI sw reset timeout occurs\n");
+
+       val = hdmi_read(hdmi, HDMI_CFG);
+       val &= ~HDMI_CFG_SW_RST_EN;
+       hdmi_write(hdmi, val, HDMI_CFG);
+
+       /* Disable hdmi_audio clock. Not used anymore for drm purpose */
+       clk_disable_unprepare(hdmi->clk_audio);
+}
+
+static void sti_hdmi_disable(struct drm_bridge *bridge)
+{
+       struct sti_hdmi *hdmi = bridge->driver_private;
+
+       u32 val = hdmi_read(hdmi, HDMI_CFG);
+
+       if (!hdmi->enabled)
+               return;
+
+       DRM_DEBUG_DRIVER("\n");
+
+       /* Disable HDMI */
+       val &= ~HDMI_CFG_DEVICE_EN;
+       hdmi_write(hdmi, val, HDMI_CFG);
+
+       hdmi_write(hdmi, 0xffffffff, HDMI_INT_CLR);
+
+       /* Stop the phy */
+       hdmi->phy_ops->stop(hdmi);
+
+       /* Set the default channel data to be a dark red */
+       hdmi_write(hdmi, 0x0000, HDMI_DFLT_CHL0_DAT);
+       hdmi_write(hdmi, 0x0000, HDMI_DFLT_CHL1_DAT);
+       hdmi_write(hdmi, 0x0060, HDMI_DFLT_CHL2_DAT);
+
+       /* Disable/unprepare hdmi clock */
+       clk_disable_unprepare(hdmi->clk_phy);
+       clk_disable_unprepare(hdmi->clk_tmds);
+       clk_disable_unprepare(hdmi->clk_pix);
+
+       hdmi->enabled = false;
+}
+
+static void sti_hdmi_pre_enable(struct drm_bridge *bridge)
+{
+       struct sti_hdmi *hdmi = bridge->driver_private;
+
+       DRM_DEBUG_DRIVER("\n");
+
+       if (hdmi->enabled)
+               return;
+
+       /* Prepare/enable clocks */
+       if (clk_prepare_enable(hdmi->clk_pix))
+               DRM_ERROR("Failed to prepare/enable hdmi_pix clk\n");
+       if (clk_prepare_enable(hdmi->clk_tmds))
+               DRM_ERROR("Failed to prepare/enable hdmi_tmds clk\n");
+       if (clk_prepare_enable(hdmi->clk_phy))
+               DRM_ERROR("Failed to prepare/enable hdmi_rejec_pll clk\n");
+
+       hdmi->enabled = true;
+
+       /* Program hdmi serializer and start phy */
+       if (!hdmi->phy_ops->start(hdmi)) {
+               DRM_ERROR("Unable to start hdmi phy\n");
+               return;
+       }
+
+       /* Program hdmi active area */
+       hdmi_active_area(hdmi);
+
+       /* Enable working interrupts */
+       hdmi_write(hdmi, HDMI_WORKING_INT, HDMI_INT_EN);
+
+       /* Program hdmi config */
+       hdmi_config(hdmi);
+
+       /* Program AVI infoframe */
+       if (hdmi_avi_infoframe_config(hdmi))
+               DRM_ERROR("Unable to configure AVI infoframe\n");
+
+       /* Sw reset */
+       hdmi_swreset(hdmi);
+}
+
+static void sti_hdmi_set_mode(struct drm_bridge *bridge,
+               struct drm_display_mode *mode,
+               struct drm_display_mode *adjusted_mode)
+{
+       struct sti_hdmi *hdmi = bridge->driver_private;
+       int ret;
+
+       DRM_DEBUG_DRIVER("\n");
+
+       /* Copy the drm display mode in the connector local structure */
+       memcpy(&hdmi->mode, mode, sizeof(struct drm_display_mode));
+
+       /* Update clock framerate according to the selected mode */
+       ret = clk_set_rate(hdmi->clk_pix, mode->clock * 1000);
+       if (ret < 0) {
+               DRM_ERROR("Cannot set rate (%dHz) for hdmi_pix clk\n",
+                         mode->clock * 1000);
+               return;
+       }
+       ret = clk_set_rate(hdmi->clk_phy, mode->clock * 1000);
+       if (ret < 0) {
+               DRM_ERROR("Cannot set rate (%dHz) for hdmi_rejection_pll clk\n",
+                         mode->clock * 1000);
+               return;
+       }
+}
+
+static void sti_hdmi_bridge_nope(struct drm_bridge *bridge)
+{
+       /* do nothing */
+}
+
+static void sti_hdmi_brigde_destroy(struct drm_bridge *bridge)
+{
+       drm_bridge_cleanup(bridge);
+       kfree(bridge);
+}
+
+static const struct drm_bridge_funcs sti_hdmi_bridge_funcs = {
+       .pre_enable = sti_hdmi_pre_enable,
+       .enable = sti_hdmi_bridge_nope,
+       .disable = sti_hdmi_disable,
+       .post_disable = sti_hdmi_bridge_nope,
+       .mode_set = sti_hdmi_set_mode,
+       .destroy = sti_hdmi_brigde_destroy,
+};
+
+static int sti_hdmi_connector_get_modes(struct drm_connector *connector)
+{
+       struct i2c_adapter *i2c_adap;
+       struct edid *edid;
+       int count;
+
+       DRM_DEBUG_DRIVER("\n");
+
+       i2c_adap = i2c_get_adapter(1);
+       if (!i2c_adap)
+               goto fail;
+
+       edid = drm_get_edid(connector, i2c_adap);
+       if (!edid)
+               goto fail;
+
+       count = drm_add_edid_modes(connector, edid);
+       drm_mode_connector_update_edid_property(connector, edid);
+
+       kfree(edid);
+       return count;
+
+fail:
+       DRM_ERROR("Can not read HDMI EDID\n");
+       return 0;
+}
+
+#define CLK_TOLERANCE_HZ 50
+
+static int sti_hdmi_connector_mode_valid(struct drm_connector *connector,
+                                       struct drm_display_mode *mode)
+{
+       int target = mode->clock * 1000;
+       int target_min = target - CLK_TOLERANCE_HZ;
+       int target_max = target + CLK_TOLERANCE_HZ;
+       int result;
+       struct sti_hdmi_connector *hdmi_connector
+               = to_sti_hdmi_connector(connector);
+       struct sti_hdmi *hdmi = hdmi_connector->hdmi;
+
+
+       result = clk_round_rate(hdmi->clk_pix, target);
+
+       DRM_DEBUG_DRIVER("target rate = %d => available rate = %d\n",
+                        target, result);
+
+       if ((result < target_min) || (result > target_max)) {
+               DRM_DEBUG_DRIVER("hdmi pixclk=%d not supported\n", target);
+               return MODE_BAD;
+       }
+
+       return MODE_OK;
+}
+
+struct drm_encoder *sti_hdmi_best_encoder(struct drm_connector *connector)
+{
+       struct sti_hdmi_connector *hdmi_connector
+               = to_sti_hdmi_connector(connector);
+
+       /* Best encoder is the one associated during connector creation */
+       return hdmi_connector->encoder;
+}
+
+static struct drm_connector_helper_funcs sti_hdmi_connector_helper_funcs = {
+       .get_modes = sti_hdmi_connector_get_modes,
+       .mode_valid = sti_hdmi_connector_mode_valid,
+       .best_encoder = sti_hdmi_best_encoder,
+};
+
+/* get detection status of display device */
+static enum drm_connector_status
+sti_hdmi_connector_detect(struct drm_connector *connector, bool force)
+{
+       struct sti_hdmi_connector *hdmi_connector
+               = to_sti_hdmi_connector(connector);
+       struct sti_hdmi *hdmi = hdmi_connector->hdmi;
+
+       DRM_DEBUG_DRIVER("\n");
+
+       if (hdmi->hpd) {
+               DRM_DEBUG_DRIVER("hdmi cable connected\n");
+               return connector_status_connected;
+       }
+
+       DRM_DEBUG_DRIVER("hdmi cable disconnected\n");
+       return connector_status_disconnected;
+}
+
+static void sti_hdmi_connector_destroy(struct drm_connector *connector)
+{
+       struct sti_hdmi_connector *hdmi_connector
+               = to_sti_hdmi_connector(connector);
+
+       drm_connector_unregister(connector);
+       drm_connector_cleanup(connector);
+       kfree(hdmi_connector);
+}
+
+static struct drm_connector_funcs sti_hdmi_connector_funcs = {
+       .dpms = drm_helper_connector_dpms,
+       .fill_modes = drm_helper_probe_single_connector_modes,
+       .detect = sti_hdmi_connector_detect,
+       .destroy = sti_hdmi_connector_destroy,
+};
+
+static struct drm_encoder *sti_hdmi_find_encoder(struct drm_device *dev)
+{
+       struct drm_encoder *encoder;
+
+       list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
+               if (encoder->encoder_type == DRM_MODE_ENCODER_TMDS)
+                       return encoder;
+       }
+
+       return NULL;
+}
+
+static int sti_hdmi_bind(struct device *dev, struct device *master, void *data)
+{
+       struct sti_hdmi *hdmi = dev_get_drvdata(dev);
+       struct drm_device *drm_dev = data;
+       struct drm_encoder *encoder;
+       struct sti_hdmi_connector *connector;
+       struct drm_connector *drm_connector;
+       struct drm_bridge *bridge;
+       struct i2c_adapter *i2c_adap;
+       int err;
+
+       i2c_adap = i2c_get_adapter(1);
+       if (!i2c_adap)
+               return -EPROBE_DEFER;
+
+       /* Set the drm device handle */
+       hdmi->drm_dev = drm_dev;
+
+       encoder = sti_hdmi_find_encoder(drm_dev);
+       if (!encoder)
+               return -ENOMEM;
+
+       connector = devm_kzalloc(dev, sizeof(*connector), GFP_KERNEL);
+       if (!connector)
+               return -ENOMEM;
+
+       connector->hdmi = hdmi;
+
+       bridge = devm_kzalloc(dev, sizeof(*bridge), GFP_KERNEL);
+       if (!bridge)
+               return -ENOMEM;
+
+       bridge->driver_private = hdmi;
+       drm_bridge_init(drm_dev, bridge, &sti_hdmi_bridge_funcs);
+
+       encoder->bridge = bridge;
+       connector->encoder = encoder;
+
+       drm_connector = (struct drm_connector *)connector;
+
+       drm_connector->polled = DRM_CONNECTOR_POLL_HPD;
+
+       drm_connector_init(drm_dev, drm_connector,
+                       &sti_hdmi_connector_funcs, DRM_MODE_CONNECTOR_HDMIA);
+       drm_connector_helper_add(drm_connector,
+                       &sti_hdmi_connector_helper_funcs);
+
+       err = drm_connector_register(drm_connector);
+       if (err)
+               goto err_connector;
+
+       err = drm_mode_connector_attach_encoder(drm_connector, encoder);
+       if (err) {
+               DRM_ERROR("Failed to attach a connector to a encoder\n");
+               goto err_sysfs;
+       }
+
+       /* Enable default interrupts */
+       hdmi_write(hdmi, HDMI_DEFAULT_INT, HDMI_INT_EN);
+
+       return 0;
+
+err_sysfs:
+       drm_connector_unregister(drm_connector);
+err_connector:
+       drm_bridge_cleanup(bridge);
+       drm_connector_cleanup(drm_connector);
+       return -EINVAL;
+}
+
+static void sti_hdmi_unbind(struct device *dev,
+               struct device *master, void *data)
+{
+       /* do nothing */
+}
+
+static const struct component_ops sti_hdmi_ops = {
+       .bind = sti_hdmi_bind,
+       .unbind = sti_hdmi_unbind,
+};
+
+static struct of_device_id hdmi_of_match[] = {
+       {
+               .compatible = "st,stih416-hdmi",
+               .data = &tx3g0c55phy_ops,
+       }, {
+               .compatible = "st,stih407-hdmi",
+               .data = &tx3g4c28phy_ops,
+       }, {
+               /* end node */
+       }
+};
+MODULE_DEVICE_TABLE(of, hdmi_of_match);
+
+static int sti_hdmi_probe(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct sti_hdmi *hdmi;
+       struct device_node *np = dev->of_node;
+       struct resource *res;
+       int ret;
+
+       DRM_INFO("%s\n", __func__);
+
+       hdmi = devm_kzalloc(dev, sizeof(*hdmi), GFP_KERNEL);
+       if (!hdmi)
+               return -ENOMEM;
+
+       hdmi->dev = pdev->dev;
+
+       /* Get resources */
+       res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "hdmi-reg");
+       if (!res) {
+               DRM_ERROR("Invalid hdmi resource\n");
+               return -ENOMEM;
+       }
+       hdmi->regs = devm_ioremap_nocache(dev, res->start, resource_size(res));
+       if (IS_ERR(hdmi->regs))
+               return PTR_ERR(hdmi->regs);
+
+       if (of_device_is_compatible(np, "st,stih416-hdmi")) {
+               res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
+                                                  "syscfg");
+               if (!res) {
+                       DRM_ERROR("Invalid syscfg resource\n");
+                       return -ENOMEM;
+               }
+               hdmi->syscfg = devm_ioremap_nocache(dev, res->start,
+                                                   resource_size(res));
+               if (IS_ERR(hdmi->syscfg))
+                       return PTR_ERR(hdmi->syscfg);
+
+       }
+
+       hdmi->phy_ops = (struct hdmi_phy_ops *)
+               of_match_node(hdmi_of_match, np)->data;
+
+       /* Get clock resources */
+       hdmi->clk_pix = devm_clk_get(dev, "pix");
+       if (IS_ERR(hdmi->clk_pix)) {
+               DRM_ERROR("Cannot get hdmi_pix clock\n");
+               return PTR_ERR(hdmi->clk_pix);
+       }
+
+       hdmi->clk_tmds = devm_clk_get(dev, "tmds");
+       if (IS_ERR(hdmi->clk_tmds)) {
+               DRM_ERROR("Cannot get hdmi_tmds clock\n");
+               return PTR_ERR(hdmi->clk_tmds);
+       }
+
+       hdmi->clk_phy = devm_clk_get(dev, "phy");
+       if (IS_ERR(hdmi->clk_phy)) {
+               DRM_ERROR("Cannot get hdmi_phy clock\n");
+               return PTR_ERR(hdmi->clk_phy);
+       }
+
+       hdmi->clk_audio = devm_clk_get(dev, "audio");
+       if (IS_ERR(hdmi->clk_audio)) {
+               DRM_ERROR("Cannot get hdmi_audio clock\n");
+               return PTR_ERR(hdmi->clk_audio);
+       }
+
+       hdmi->hpd_gpio = of_get_named_gpio(np, "hdmi,hpd-gpio", 0);
+       if (hdmi->hpd_gpio < 0) {
+               DRM_ERROR("Failed to get hdmi hpd-gpio\n");
+               return -EIO;
+       }
+
+       hdmi->hpd = gpio_get_value(hdmi->hpd_gpio);
+
+       init_waitqueue_head(&hdmi->wait_event);
+
+       hdmi->irq = platform_get_irq_byname(pdev, "irq");
+
+       ret = devm_request_threaded_irq(dev, hdmi->irq, hdmi_irq,
+                       hdmi_irq_thread, IRQF_ONESHOT, dev_name(dev), hdmi);
+       if (ret) {
+               DRM_ERROR("Failed to register HDMI interrupt\n");
+               return ret;
+       }
+
+       hdmi->reset = devm_reset_control_get(dev, "hdmi");
+       /* Take hdmi out of reset */
+       if (!IS_ERR(hdmi->reset))
+               reset_control_deassert(hdmi->reset);
+
+       platform_set_drvdata(pdev, hdmi);
+
+       return component_add(&pdev->dev, &sti_hdmi_ops);
+}
+
+static int sti_hdmi_remove(struct platform_device *pdev)
+{
+       component_del(&pdev->dev, &sti_hdmi_ops);
+       return 0;
+}
+
+struct platform_driver sti_hdmi_driver = {
+       .driver = {
+               .name = "sti-hdmi",
+               .owner = THIS_MODULE,
+               .of_match_table = hdmi_of_match,
+       },
+       .probe = sti_hdmi_probe,
+       .remove = sti_hdmi_remove,
+};
+
+module_platform_driver(sti_hdmi_driver);
+
+MODULE_AUTHOR("Benjamin Gaignard <benjamin.gaignard@st.com>");
+MODULE_DESCRIPTION("STMicroelectronics SoC DRM driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/gpu/drm/sti/sti_hdmi.h b/drivers/gpu/drm/sti/sti_hdmi.h
new file mode 100644 (file)
index 0000000..61bec65
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) STMicroelectronics SA 2014
+ * Author: Vincent Abriou <vincent.abriou@st.com> for STMicroelectronics.
+ * License terms:  GNU General Public License (GPL), version 2
+ */
+
+#ifndef _STI_HDMI_H_
+#define _STI_HDMI_H_
+
+#include <linux/platform_device.h>
+
+#include <drm/drmP.h>
+
+#define HDMI_STA           0x0010
+#define HDMI_STA_DLL_LCK   BIT(5)
+
+struct sti_hdmi;
+
+struct hdmi_phy_ops {
+       bool (*start)(struct sti_hdmi *hdmi);
+       void (*stop)(struct sti_hdmi *hdmi);
+};
+
+/**
+ * STI hdmi structure
+ *
+ * @dev: driver device
+ * @drm_dev: pointer to drm device
+ * @mode: current display mode selected
+ * @regs: hdmi register
+ * @syscfg: syscfg register for pll rejection configuration
+ * @clk_pix: hdmi pixel clock
+ * @clk_tmds: hdmi tmds clock
+ * @clk_phy: hdmi phy clock
+ * @clk_audio: hdmi audio clock
+ * @irq: hdmi interrupt number
+ * @irq_status: interrupt status register
+ * @phy_ops: phy start/stop operations
+ * @enabled: true if hdmi is enabled else false
+ * @hpd_gpio: hdmi hot plug detect gpio number
+ * @hpd: hot plug detect status
+ * @wait_event: wait event
+ * @event_received: wait event status
+ * @reset: reset control of the hdmi phy
+ */
+struct sti_hdmi {
+       struct device dev;
+       struct drm_device *drm_dev;
+       struct drm_display_mode mode;
+       void __iomem *regs;
+       void __iomem *syscfg;
+       struct clk *clk_pix;
+       struct clk *clk_tmds;
+       struct clk *clk_phy;
+       struct clk *clk_audio;
+       int irq;
+       u32 irq_status;
+       struct hdmi_phy_ops *phy_ops;
+       bool enabled;
+       int hpd_gpio;
+       bool hpd;
+       wait_queue_head_t wait_event;
+       bool event_received;
+       struct reset_control *reset;
+};
+
+u32 hdmi_read(struct sti_hdmi *hdmi, int offset);
+void hdmi_write(struct sti_hdmi *hdmi, u32 val, int offset);
+
+/**
+ * hdmi phy config structure
+ *
+ * A pointer to an array of these structures is passed to a TMDS (HDMI) output
+ * via the control interface to provide board and SoC specific
+ * configurations of the HDMI PHY. Each entry in the array specifies a hardware
+ * specific configuration for a given TMDS clock frequency range.
+ *
+ * @min_tmds_freq: Lower bound of TMDS clock frequency this entry applies to
+ * @max_tmds_freq: Upper bound of TMDS clock frequency this entry applies to
+ * @config: SoC specific register configuration
+ */
+struct hdmi_phy_config {
+       u32 min_tmds_freq;
+       u32 max_tmds_freq;
+       u32 config[4];
+};
+
+#endif
diff --git a/drivers/gpu/drm/sti/sti_hdmi_tx3g0c55phy.c b/drivers/gpu/drm/sti/sti_hdmi_tx3g0c55phy.c
new file mode 100644 (file)
index 0000000..49ae8e4
--- /dev/null
@@ -0,0 +1,336 @@
+/*
+ * Copyright (C) STMicroelectronics SA 2014
+ * Author: Vincent Abriou <vincent.abriou@st.com> for STMicroelectronics.
+ * License terms:  GNU General Public License (GPL), version 2
+ */
+
+#include "sti_hdmi_tx3g0c55phy.h"
+
+#define HDMI_SRZ_PLL_CFG                0x0504
+#define HDMI_SRZ_TAP_1                  0x0508
+#define HDMI_SRZ_TAP_2                  0x050C
+#define HDMI_SRZ_TAP_3                  0x0510
+#define HDMI_SRZ_CTRL                   0x0514
+
+#define HDMI_SRZ_PLL_CFG_POWER_DOWN     BIT(0)
+#define HDMI_SRZ_PLL_CFG_VCOR_SHIFT     1
+#define HDMI_SRZ_PLL_CFG_VCOR_425MHZ    0
+#define HDMI_SRZ_PLL_CFG_VCOR_850MHZ    1
+#define HDMI_SRZ_PLL_CFG_VCOR_1700MHZ   2
+#define HDMI_SRZ_PLL_CFG_VCOR_3000MHZ   3
+#define HDMI_SRZ_PLL_CFG_VCOR_MASK      3
+#define HDMI_SRZ_PLL_CFG_VCOR(x)        (x << HDMI_SRZ_PLL_CFG_VCOR_SHIFT)
+#define HDMI_SRZ_PLL_CFG_NDIV_SHIFT     8
+#define HDMI_SRZ_PLL_CFG_NDIV_MASK      (0x1F << HDMI_SRZ_PLL_CFG_NDIV_SHIFT)
+#define HDMI_SRZ_PLL_CFG_MODE_SHIFT     16
+#define HDMI_SRZ_PLL_CFG_MODE_13_5_MHZ  0x1
+#define HDMI_SRZ_PLL_CFG_MODE_25_2_MHZ  0x4
+#define HDMI_SRZ_PLL_CFG_MODE_27_MHZ    0x5
+#define HDMI_SRZ_PLL_CFG_MODE_33_75_MHZ 0x6
+#define HDMI_SRZ_PLL_CFG_MODE_40_5_MHZ  0x7
+#define HDMI_SRZ_PLL_CFG_MODE_54_MHZ    0x8
+#define HDMI_SRZ_PLL_CFG_MODE_67_5_MHZ  0x9
+#define HDMI_SRZ_PLL_CFG_MODE_74_25_MHZ 0xA
+#define HDMI_SRZ_PLL_CFG_MODE_81_MHZ    0xB
+#define HDMI_SRZ_PLL_CFG_MODE_82_5_MHZ  0xC
+#define HDMI_SRZ_PLL_CFG_MODE_108_MHZ   0xD
+#define HDMI_SRZ_PLL_CFG_MODE_148_5_MHZ 0xE
+#define HDMI_SRZ_PLL_CFG_MODE_165_MHZ   0xF
+#define HDMI_SRZ_PLL_CFG_MODE_MASK      0xF
+#define HDMI_SRZ_PLL_CFG_MODE(x)        (x << HDMI_SRZ_PLL_CFG_MODE_SHIFT)
+
+#define HDMI_SRZ_CTRL_POWER_DOWN        (1 << 0)
+#define HDMI_SRZ_CTRL_EXTERNAL_DATA_EN  (1 << 1)
+
+/* sysconf registers */
+#define HDMI_REJECTION_PLL_CONFIGURATION 0x0858        /* SYSTEM_CONFIG2534 */
+#define HDMI_REJECTION_PLL_STATUS        0x0948        /* SYSTEM_CONFIG2594 */
+
+#define REJECTION_PLL_HDMI_ENABLE_SHIFT 0
+#define REJECTION_PLL_HDMI_ENABLE_MASK  (0x1 << REJECTION_PLL_HDMI_ENABLE_SHIFT)
+#define REJECTION_PLL_HDMI_PDIV_SHIFT   24
+#define REJECTION_PLL_HDMI_PDIV_MASK    (0x7 << REJECTION_PLL_HDMI_PDIV_SHIFT)
+#define REJECTION_PLL_HDMI_NDIV_SHIFT   16
+#define REJECTION_PLL_HDMI_NDIV_MASK    (0xFF << REJECTION_PLL_HDMI_NDIV_SHIFT)
+#define REJECTION_PLL_HDMI_MDIV_SHIFT   8
+#define REJECTION_PLL_HDMI_MDIV_MASK    (0xFF << REJECTION_PLL_HDMI_MDIV_SHIFT)
+
+#define REJECTION_PLL_HDMI_REJ_PLL_LOCK BIT(0)
+
+#define HDMI_TIMEOUT_PLL_LOCK  50   /*milliseconds */
+
+/**
+ * pll mode structure
+ *
+ * A pointer to an array of these structures is passed to a TMDS (HDMI) output
+ * via the control interface to provide board and SoC specific
+ * configurations of the HDMI PHY. Each entry in the array specifies a hardware
+ * specific configuration for a given TMDS clock frequency range. The array
+ * should be terminated with an entry that has all fields set to zero.
+ *
+ * @min: Lower bound of TMDS clock frequency this entry applies to
+ * @max: Upper bound of TMDS clock frequency this entry applies to
+ * @mode: SoC specific register configuration
+ */
+struct pllmode {
+       u32 min;
+       u32 max;
+       u32 mode;
+};
+
+#define NB_PLL_MODE 7
+static struct pllmode pllmodes[NB_PLL_MODE] = {
+       {13500000, 13513500, HDMI_SRZ_PLL_CFG_MODE_13_5_MHZ},
+       {25174800, 25200000, HDMI_SRZ_PLL_CFG_MODE_25_2_MHZ},
+       {27000000, 27027000, HDMI_SRZ_PLL_CFG_MODE_27_MHZ},
+       {54000000, 54054000, HDMI_SRZ_PLL_CFG_MODE_54_MHZ},
+       {72000000, 74250000, HDMI_SRZ_PLL_CFG_MODE_74_25_MHZ},
+       {108000000, 108108000, HDMI_SRZ_PLL_CFG_MODE_108_MHZ},
+       {148351648, 297000000, HDMI_SRZ_PLL_CFG_MODE_148_5_MHZ}
+};
+
+#define NB_HDMI_PHY_CONFIG 5
+static struct hdmi_phy_config hdmiphy_config[NB_HDMI_PHY_CONFIG] = {
+       {0, 40000000, {0x00101010, 0x00101010, 0x00101010, 0x02} },
+       {40000000, 140000000, {0x00111111, 0x00111111, 0x00111111, 0x02} },
+       {140000000, 160000000, {0x00131313, 0x00101010, 0x00101010, 0x02} },
+       {160000000, 250000000, {0x00131313, 0x00111111, 0x00111111, 0x03FE} },
+       {250000000, 300000000, {0x00151515, 0x00101010, 0x00101010, 0x03FE} },
+};
+
+#define PLL_CHANGE_DELAY       1 /* ms */
+
+/**
+ * Disable the pll rejection
+ *
+ * @hdmi: pointer on the hdmi internal structure
+ *
+ * return true if the pll has been disabled
+ */
+static bool disable_pll_rejection(struct sti_hdmi *hdmi)
+{
+       u32 val;
+
+       DRM_DEBUG_DRIVER("\n");
+
+       val = readl(hdmi->syscfg + HDMI_REJECTION_PLL_CONFIGURATION);
+       val &= ~REJECTION_PLL_HDMI_ENABLE_MASK;
+       writel(val, hdmi->syscfg + HDMI_REJECTION_PLL_CONFIGURATION);
+
+       msleep(PLL_CHANGE_DELAY);
+       val = readl(hdmi->syscfg + HDMI_REJECTION_PLL_STATUS);
+
+       return !(val & REJECTION_PLL_HDMI_REJ_PLL_LOCK);
+}
+
+/**
+ * Enable the old BCH/rejection PLL is now reused to provide the CLKPXPLL
+ * clock input to the new PHY PLL that generates the serializer clock
+ * (TMDS*10) and the TMDS clock which is now fed back into the HDMI
+ * formatter instead of the TMDS clock line from ClockGenB.
+ *
+ * @hdmi: pointer on the hdmi internal structure
+ *
+ * return true if pll has been correctly set
+ */
+static bool enable_pll_rejection(struct sti_hdmi *hdmi)
+{
+       unsigned int inputclock;
+       u32 mdiv, ndiv, pdiv, val;
+
+       DRM_DEBUG_DRIVER("\n");
+
+       if (!disable_pll_rejection(hdmi))
+               return false;
+
+       inputclock = hdmi->mode.clock * 1000;
+
+       DRM_DEBUG_DRIVER("hdmi rejection pll input clock = %dHz\n", inputclock);
+
+
+       /* Power up the HDMI rejection PLL
+        * Note: On this SoC (stiH416) we are forced to have the input clock
+        * be equal to the HDMI pixel clock.
+        *
+        * The values here have been suggested by validation however they are
+        * still provisional and subject to change.
+        *
+        * PLLout = (Fin*Mdiv) / ((2 * Ndiv) / 2^Pdiv)
+        */
+       if (inputclock < 50000000) {
+               /*
+                * For slower clocks we need to multiply more to keep the
+                * internal VCO frequency within the physical specification
+                * of the PLL.
+                */
+               pdiv = 4;
+               ndiv = 240;
+               mdiv = 30;
+       } else {
+               pdiv = 2;
+               ndiv = 60;
+               mdiv = 30;
+       }
+
+       val = readl(hdmi->syscfg + HDMI_REJECTION_PLL_CONFIGURATION);
+
+       val &= ~(REJECTION_PLL_HDMI_PDIV_MASK |
+               REJECTION_PLL_HDMI_NDIV_MASK |
+               REJECTION_PLL_HDMI_MDIV_MASK |
+               REJECTION_PLL_HDMI_ENABLE_MASK);
+
+       val |=  (pdiv << REJECTION_PLL_HDMI_PDIV_SHIFT) |
+               (ndiv << REJECTION_PLL_HDMI_NDIV_SHIFT) |
+               (mdiv << REJECTION_PLL_HDMI_MDIV_SHIFT) |
+               (0x1 << REJECTION_PLL_HDMI_ENABLE_SHIFT);
+
+       writel(val, hdmi->syscfg + HDMI_REJECTION_PLL_CONFIGURATION);
+
+       msleep(PLL_CHANGE_DELAY);
+       val = readl(hdmi->syscfg + HDMI_REJECTION_PLL_STATUS);
+
+       return (val & REJECTION_PLL_HDMI_REJ_PLL_LOCK);
+}
+
+/**
+ * Start hdmi phy macro cell tx3g0c55
+ *
+ * @hdmi: pointer on the hdmi internal structure
+ *
+ * Return false if an error occur
+ */
+static bool sti_hdmi_tx3g0c55phy_start(struct sti_hdmi *hdmi)
+{
+       u32 ckpxpll = hdmi->mode.clock * 1000;
+       u32 val, tmdsck, freqvco, pllctrl = 0;
+       unsigned int i;
+
+       if (!enable_pll_rejection(hdmi))
+               return false;
+
+       DRM_DEBUG_DRIVER("ckpxpll = %dHz\n", ckpxpll);
+
+       /* Assuming no pixel repetition and 24bits color */
+       tmdsck = ckpxpll;
+       pllctrl = 2 << HDMI_SRZ_PLL_CFG_NDIV_SHIFT;
+
+       /*
+        * Setup the PLL mode parameter based on the ckpxpll. If we haven't got
+        * a clock frequency supported by one of the specific PLL modes then we
+        * will end up using the generic mode (0) which only supports a 10x
+        * multiplier, hence only 24bit color.
+        */
+       for (i = 0; i < NB_PLL_MODE; i++) {
+               if (ckpxpll >= pllmodes[i].min && ckpxpll <= pllmodes[i].max)
+                       pllctrl |= HDMI_SRZ_PLL_CFG_MODE(pllmodes[i].mode);
+       }
+
+       freqvco = tmdsck * 10;
+       if (freqvco <= 425000000UL)
+               pllctrl |= HDMI_SRZ_PLL_CFG_VCOR(HDMI_SRZ_PLL_CFG_VCOR_425MHZ);
+       else if (freqvco <= 850000000UL)
+               pllctrl |= HDMI_SRZ_PLL_CFG_VCOR(HDMI_SRZ_PLL_CFG_VCOR_850MHZ);
+       else if (freqvco <= 1700000000UL)
+               pllctrl |= HDMI_SRZ_PLL_CFG_VCOR(HDMI_SRZ_PLL_CFG_VCOR_1700MHZ);
+       else if (freqvco <= 2970000000UL)
+               pllctrl |= HDMI_SRZ_PLL_CFG_VCOR(HDMI_SRZ_PLL_CFG_VCOR_3000MHZ);
+       else {
+               DRM_ERROR("PHY serializer clock out of range\n");
+               goto err;
+       }
+
+       /*
+        * Configure and power up the PHY PLL
+        */
+       hdmi->event_received = false;
+       DRM_DEBUG_DRIVER("pllctrl = 0x%x\n", pllctrl);
+       hdmi_write(hdmi, pllctrl, HDMI_SRZ_PLL_CFG);
+
+       /* wait PLL interrupt */
+       wait_event_interruptible_timeout(hdmi->wait_event,
+                                        hdmi->event_received == true,
+                                        msecs_to_jiffies
+                                        (HDMI_TIMEOUT_PLL_LOCK));
+
+       if ((hdmi_read(hdmi, HDMI_STA) & HDMI_STA_DLL_LCK) == 0) {
+               DRM_ERROR("hdmi phy pll not locked\n");
+               goto err;
+       }
+
+       DRM_DEBUG_DRIVER("got PHY PLL Lock\n");
+
+       /*
+        * To configure the source termination and pre-emphasis appropriately
+        * for different high speed TMDS clock frequencies a phy configuration
+        * table must be provided, tailored to the SoC and board combination.
+        */
+       for (i = 0; i < NB_HDMI_PHY_CONFIG; i++) {
+               if ((hdmiphy_config[i].min_tmds_freq <= tmdsck) &&
+                   (hdmiphy_config[i].max_tmds_freq >= tmdsck)) {
+                       val = hdmiphy_config[i].config[0];
+                       hdmi_write(hdmi, val, HDMI_SRZ_TAP_1);
+                       val = hdmiphy_config[i].config[1];
+                       hdmi_write(hdmi, val, HDMI_SRZ_TAP_2);
+                       val = hdmiphy_config[i].config[2];
+                       hdmi_write(hdmi, val, HDMI_SRZ_TAP_3);
+                       val = hdmiphy_config[i].config[3];
+                       val |= HDMI_SRZ_CTRL_EXTERNAL_DATA_EN;
+                       val &= ~HDMI_SRZ_CTRL_POWER_DOWN;
+                       hdmi_write(hdmi, val, HDMI_SRZ_CTRL);
+
+                       DRM_DEBUG_DRIVER("serializer cfg 0x%x 0x%x 0x%x 0x%x\n",
+                                        hdmiphy_config[i].config[0],
+                                        hdmiphy_config[i].config[1],
+                                        hdmiphy_config[i].config[2],
+                                        hdmiphy_config[i].config[3]);
+                       return true;
+               }
+       }
+
+       /*
+        * Default, power up the serializer with no pre-emphasis or source
+        * termination.
+        */
+       hdmi_write(hdmi, 0x0, HDMI_SRZ_TAP_1);
+       hdmi_write(hdmi, 0x0, HDMI_SRZ_TAP_2);
+       hdmi_write(hdmi, 0x0, HDMI_SRZ_TAP_3);
+       hdmi_write(hdmi, HDMI_SRZ_CTRL_EXTERNAL_DATA_EN, HDMI_SRZ_CTRL);
+
+       return true;
+
+err:
+       disable_pll_rejection(hdmi);
+
+       return false;
+}
+
+/**
+ * Stop hdmi phy macro cell tx3g0c55
+ *
+ * @hdmi: pointer on the hdmi internal structure
+ */
+static void sti_hdmi_tx3g0c55phy_stop(struct sti_hdmi *hdmi)
+{
+       DRM_DEBUG_DRIVER("\n");
+
+       hdmi->event_received = false;
+
+       hdmi_write(hdmi, HDMI_SRZ_CTRL_POWER_DOWN, HDMI_SRZ_CTRL);
+       hdmi_write(hdmi, HDMI_SRZ_PLL_CFG_POWER_DOWN, HDMI_SRZ_PLL_CFG);
+
+       /* wait PLL interrupt */
+       wait_event_interruptible_timeout(hdmi->wait_event,
+                                        hdmi->event_received == true,
+                                        msecs_to_jiffies
+                                        (HDMI_TIMEOUT_PLL_LOCK));
+
+       if (hdmi_read(hdmi, HDMI_STA) & HDMI_STA_DLL_LCK)
+               DRM_ERROR("hdmi phy pll not well disabled\n");
+
+       disable_pll_rejection(hdmi);
+}
+
+struct hdmi_phy_ops tx3g0c55phy_ops = {
+       .start = sti_hdmi_tx3g0c55phy_start,
+       .stop = sti_hdmi_tx3g0c55phy_stop,
+};
diff --git a/drivers/gpu/drm/sti/sti_hdmi_tx3g0c55phy.h b/drivers/gpu/drm/sti/sti_hdmi_tx3g0c55phy.h
new file mode 100644 (file)
index 0000000..068237b
--- /dev/null
@@ -0,0 +1,14 @@
+/*
+ * Copyright (C) STMicroelectronics SA 2014
+ * Author: Benjamin Gaignard <benjamin.gaignard@st.com> for STMicroelectronics.
+ * License terms:  GNU General Public License (GPL), version 2
+ */
+
+#ifndef _STI_HDMI_TX3G0C55PHY_H_
+#define _STI_HDMI_TX3G0C55PHY_H_
+
+#include "sti_hdmi.h"
+
+extern struct hdmi_phy_ops tx3g0c55phy_ops;
+
+#endif
diff --git a/drivers/gpu/drm/sti/sti_hdmi_tx3g4c28phy.c b/drivers/gpu/drm/sti/sti_hdmi_tx3g4c28phy.c
new file mode 100644 (file)
index 0000000..8e0ceb0
--- /dev/null
@@ -0,0 +1,211 @@
+/*
+ * Copyright (C) STMicroelectronics SA 2014
+ * Author: Vincent Abriou <vincent.abriou@st.com> for STMicroelectronics.
+ * License terms:  GNU General Public License (GPL), version 2
+ */
+
+#include "sti_hdmi_tx3g4c28phy.h"
+
+#define HDMI_SRZ_CFG                             0x504
+#define HDMI_SRZ_PLL_CFG                         0x510
+#define HDMI_SRZ_ICNTL                           0x518
+#define HDMI_SRZ_CALCODE_EXT                     0x520
+
+#define HDMI_SRZ_CFG_EN                          BIT(0)
+#define HDMI_SRZ_CFG_DISABLE_BYPASS_SINK_CURRENT BIT(1)
+#define HDMI_SRZ_CFG_EXTERNAL_DATA               BIT(16)
+#define HDMI_SRZ_CFG_RBIAS_EXT                   BIT(17)
+#define HDMI_SRZ_CFG_EN_SINK_TERM_DETECTION      BIT(18)
+#define HDMI_SRZ_CFG_EN_BIASRES_DETECTION        BIT(19)
+#define HDMI_SRZ_CFG_EN_SRC_TERMINATION          BIT(24)
+
+#define HDMI_SRZ_CFG_INTERNAL_MASK  (HDMI_SRZ_CFG_EN     | \
+               HDMI_SRZ_CFG_DISABLE_BYPASS_SINK_CURRENT | \
+               HDMI_SRZ_CFG_EXTERNAL_DATA               | \
+               HDMI_SRZ_CFG_RBIAS_EXT                   | \
+               HDMI_SRZ_CFG_EN_SINK_TERM_DETECTION      | \
+               HDMI_SRZ_CFG_EN_BIASRES_DETECTION        | \
+               HDMI_SRZ_CFG_EN_SRC_TERMINATION)
+
+#define PLL_CFG_EN                               BIT(0)
+#define PLL_CFG_NDIV_SHIFT                       (8)
+#define PLL_CFG_IDF_SHIFT                        (16)
+#define PLL_CFG_ODF_SHIFT                        (24)
+
+#define ODF_DIV_1                                (0)
+#define ODF_DIV_2                                (1)
+#define ODF_DIV_4                                (2)
+#define ODF_DIV_8                                (3)
+
+#define HDMI_TIMEOUT_PLL_LOCK  50  /*milliseconds */
+
+struct plldividers_s {
+       uint32_t min;
+       uint32_t max;
+       uint32_t idf;
+       uint32_t odf;
+};
+
+/*
+ * Functional specification recommended values
+ */
+#define NB_PLL_MODE 5
+static struct plldividers_s plldividers[NB_PLL_MODE] = {
+       {0, 20000000, 1, ODF_DIV_8},
+       {20000000, 42500000, 2, ODF_DIV_8},
+       {42500000, 85000000, 4, ODF_DIV_4},
+       {85000000, 170000000, 8, ODF_DIV_2},
+       {170000000, 340000000, 16, ODF_DIV_1}
+};
+
+#define NB_HDMI_PHY_CONFIG 2
+static struct hdmi_phy_config hdmiphy_config[NB_HDMI_PHY_CONFIG] = {
+       {0, 250000000, {0x0, 0x0, 0x0, 0x0} },
+       {250000000, 300000000, {0x1110, 0x0, 0x0, 0x0} },
+};
+
+/**
+ * Start hdmi phy macro cell tx3g4c28
+ *
+ * @hdmi: pointer on the hdmi internal structure
+ *
+ * Return false if an error occur
+ */
+static bool sti_hdmi_tx3g4c28phy_start(struct sti_hdmi *hdmi)
+{
+       u32 ckpxpll = hdmi->mode.clock * 1000;
+       u32 val, tmdsck, idf, odf, pllctrl = 0;
+       bool foundplldivides = false;
+       int i;
+
+       DRM_DEBUG_DRIVER("ckpxpll = %dHz\n", ckpxpll);
+
+       for (i = 0; i < NB_PLL_MODE; i++) {
+               if (ckpxpll >= plldividers[i].min &&
+                   ckpxpll < plldividers[i].max) {
+                       idf = plldividers[i].idf;
+                       odf = plldividers[i].odf;
+                       foundplldivides = true;
+                       break;
+               }
+       }
+
+       if (!foundplldivides) {
+               DRM_ERROR("input TMDS clock speed (%d) not supported\n",
+                         ckpxpll);
+               goto err;
+       }
+
+       /* Assuming no pixel repetition and 24bits color */
+       tmdsck = ckpxpll;
+       pllctrl |= 40 << PLL_CFG_NDIV_SHIFT;
+
+       if (tmdsck > 340000000) {
+               DRM_ERROR("output TMDS clock (%d) out of range\n", tmdsck);
+               goto err;
+       }
+
+       pllctrl |= idf << PLL_CFG_IDF_SHIFT;
+       pllctrl |= odf << PLL_CFG_ODF_SHIFT;
+
+       /*
+        * Configure and power up the PHY PLL
+        */
+       hdmi->event_received = false;
+       DRM_DEBUG_DRIVER("pllctrl = 0x%x\n", pllctrl);
+       hdmi_write(hdmi, (pllctrl | PLL_CFG_EN), HDMI_SRZ_PLL_CFG);
+
+       /* wait PLL interrupt */
+       wait_event_interruptible_timeout(hdmi->wait_event,
+                                        hdmi->event_received == true,
+                                        msecs_to_jiffies
+                                        (HDMI_TIMEOUT_PLL_LOCK));
+
+       if ((hdmi_read(hdmi, HDMI_STA) & HDMI_STA_DLL_LCK) == 0) {
+               DRM_ERROR("hdmi phy pll not locked\n");
+               goto err;
+       }
+
+       DRM_DEBUG_DRIVER("got PHY PLL Lock\n");
+
+       val = (HDMI_SRZ_CFG_EN |
+              HDMI_SRZ_CFG_EXTERNAL_DATA |
+              HDMI_SRZ_CFG_EN_BIASRES_DETECTION |
+              HDMI_SRZ_CFG_EN_SINK_TERM_DETECTION);
+
+       if (tmdsck > 165000000)
+               val |= HDMI_SRZ_CFG_EN_SRC_TERMINATION;
+
+       /*
+        * To configure the source termination and pre-emphasis appropriately
+        * for different high speed TMDS clock frequencies a phy configuration
+        * table must be provided, tailored to the SoC and board combination.
+        */
+       for (i = 0; i < NB_HDMI_PHY_CONFIG; i++) {
+               if ((hdmiphy_config[i].min_tmds_freq <= tmdsck) &&
+                   (hdmiphy_config[i].max_tmds_freq >= tmdsck)) {
+                       val |= (hdmiphy_config[i].config[0]
+                               & ~HDMI_SRZ_CFG_INTERNAL_MASK);
+                       hdmi_write(hdmi, val, HDMI_SRZ_CFG);
+
+                       val = hdmiphy_config[i].config[1];
+                       hdmi_write(hdmi, val, HDMI_SRZ_ICNTL);
+
+                       val = hdmiphy_config[i].config[2];
+                       hdmi_write(hdmi, val, HDMI_SRZ_CALCODE_EXT);
+
+                       DRM_DEBUG_DRIVER("serializer cfg 0x%x 0x%x 0x%x\n",
+                                        hdmiphy_config[i].config[0],
+                                        hdmiphy_config[i].config[1],
+                                        hdmiphy_config[i].config[2]);
+                       return true;
+               }
+       }
+
+       /*
+        * Default, power up the serializer with no pre-emphasis or
+        * output swing correction
+        */
+       hdmi_write(hdmi, val,  HDMI_SRZ_CFG);
+       hdmi_write(hdmi, 0x0, HDMI_SRZ_ICNTL);
+       hdmi_write(hdmi, 0x0, HDMI_SRZ_CALCODE_EXT);
+
+       return true;
+
+err:
+       return false;
+}
+
+/**
+ * Stop hdmi phy macro cell tx3g4c28
+ *
+ * @hdmi: pointer on the hdmi internal structure
+ */
+static void sti_hdmi_tx3g4c28phy_stop(struct sti_hdmi *hdmi)
+{
+       int val = 0;
+
+       DRM_DEBUG_DRIVER("\n");
+
+       hdmi->event_received = false;
+
+       val = HDMI_SRZ_CFG_EN_SINK_TERM_DETECTION;
+       val |= HDMI_SRZ_CFG_EN_BIASRES_DETECTION;
+
+       hdmi_write(hdmi, val, HDMI_SRZ_CFG);
+       hdmi_write(hdmi, 0, HDMI_SRZ_PLL_CFG);
+
+       /* wait PLL interrupt */
+       wait_event_interruptible_timeout(hdmi->wait_event,
+                                        hdmi->event_received == true,
+                                        msecs_to_jiffies
+                                        (HDMI_TIMEOUT_PLL_LOCK));
+
+       if (hdmi_read(hdmi, HDMI_STA) & HDMI_STA_DLL_LCK)
+               DRM_ERROR("hdmi phy pll not well disabled\n");
+}
+
+struct hdmi_phy_ops tx3g4c28phy_ops = {
+       .start = sti_hdmi_tx3g4c28phy_start,
+       .stop = sti_hdmi_tx3g4c28phy_stop,
+};
diff --git a/drivers/gpu/drm/sti/sti_hdmi_tx3g4c28phy.h b/drivers/gpu/drm/sti/sti_hdmi_tx3g4c28phy.h
new file mode 100644 (file)
index 0000000..f99a7ff
--- /dev/null
@@ -0,0 +1,14 @@
+/*
+ * Copyright (C) STMicroelectronics SA 2014
+ * Author: Benjamin Gaignard <benjamin.gaignard@st.com> for STMicroelectronics.
+ * License terms:  GNU General Public License (GPL), version 2
+ */
+
+#ifndef _STI_HDMI_TX3G4C28PHY_H_
+#define _STI_HDMI_TX3G4C28PHY_H_
+
+#include "sti_hdmi.h"
+
+extern struct hdmi_phy_ops tx3g4c28phy_ops;
+
+#endif
diff --git a/drivers/gpu/drm/sti/sti_layer.c b/drivers/gpu/drm/sti/sti_layer.c
new file mode 100644 (file)
index 0000000..06a587c
--- /dev/null
@@ -0,0 +1,197 @@
+/*
+ * Copyright (C) STMicroelectronics SA 2014
+ * Authors: Benjamin Gaignard <benjamin.gaignard@st.com>
+ *          Fabien Dessenne <fabien.dessenne@st.com>
+ *          for STMicroelectronics.
+ * License terms:  GNU General Public License (GPL), version 2
+ */
+
+#include <drm/drmP.h>
+#include <drm/drm_gem_cma_helper.h>
+#include <drm/drm_fb_cma_helper.h>
+
+#include "sti_compositor.h"
+#include "sti_gdp.h"
+#include "sti_layer.h"
+#include "sti_vid.h"
+
+const char *sti_layer_to_str(struct sti_layer *layer)
+{
+       switch (layer->desc) {
+       case STI_GDP_0:
+               return "GDP0";
+       case STI_GDP_1:
+               return "GDP1";
+       case STI_GDP_2:
+               return "GDP2";
+       case STI_GDP_3:
+               return "GDP3";
+       case STI_VID_0:
+               return "VID0";
+       case STI_VID_1:
+               return "VID1";
+       case STI_CURSOR:
+               return "CURSOR";
+       default:
+               return "<UNKNOWN LAYER>";
+       }
+}
+
+struct sti_layer *sti_layer_create(struct device *dev, int desc,
+                                  void __iomem *baseaddr)
+{
+
+       struct sti_layer *layer = NULL;
+
+       switch (desc & STI_LAYER_TYPE_MASK) {
+       case STI_GDP:
+               layer = sti_gdp_create(dev, desc);
+               break;
+       case STI_VID:
+               layer = sti_vid_create(dev);
+               break;
+       }
+
+       if (!layer) {
+               DRM_ERROR("Failed to create layer\n");
+               return NULL;
+       }
+
+       layer->desc = desc;
+       layer->dev = dev;
+       layer->regs = baseaddr;
+
+       layer->ops->init(layer);
+
+       DRM_DEBUG_DRIVER("%s created\n", sti_layer_to_str(layer));
+
+       return layer;
+}
+
+int sti_layer_prepare(struct sti_layer *layer, struct drm_framebuffer *fb,
+                     struct drm_display_mode *mode, int mixer_id,
+                     int dest_x, int dest_y, int dest_w, int dest_h,
+                     int src_x, int src_y, int src_w, int src_h)
+{
+       int ret;
+       unsigned int i;
+       struct drm_gem_cma_object *cma_obj;
+
+       if (!layer || !fb || !mode) {
+               DRM_ERROR("Null fb, layer or mode\n");
+               return 1;
+       }
+
+       cma_obj = drm_fb_cma_get_gem_obj(fb, 0);
+       if (!cma_obj) {
+               DRM_ERROR("Can't get CMA GEM object for fb\n");
+               return 1;
+       }
+
+       layer->fb = fb;
+       layer->mode = mode;
+       layer->mixer_id = mixer_id;
+       layer->dst_x = dest_x;
+       layer->dst_y = dest_y;
+       layer->dst_w = clamp_val(dest_w, 0, mode->crtc_hdisplay - dest_x);
+       layer->dst_h = clamp_val(dest_h, 0, mode->crtc_vdisplay - dest_y);
+       layer->src_x = src_x;
+       layer->src_y = src_y;
+       layer->src_w = src_w;
+       layer->src_h = src_h;
+       layer->format = fb->pixel_format;
+       layer->paddr = cma_obj->paddr;
+       for (i = 0; i < 4; i++) {
+               layer->pitches[i] = fb->pitches[i];
+               layer->offsets[i] = fb->offsets[i];
+       }
+
+       DRM_DEBUG_DRIVER("%s is associated with mixer_id %d\n",
+                        sti_layer_to_str(layer),
+                        layer->mixer_id);
+       DRM_DEBUG_DRIVER("%s dst=(%dx%d)@(%d,%d) - src=(%dx%d)@(%d,%d)\n",
+                        sti_layer_to_str(layer),
+                        layer->dst_w, layer->dst_h, layer->dst_x, layer->dst_y,
+                        layer->src_w, layer->src_h, layer->src_x,
+                        layer->src_y);
+
+       DRM_DEBUG_DRIVER("drm FB:%d format:%.4s phys@:0x%lx\n", fb->base.id,
+                        (char *)&layer->format, (unsigned long)layer->paddr);
+
+       if (!layer->ops->prepare)
+               goto err_no_prepare;
+
+       ret = layer->ops->prepare(layer, !layer->enabled);
+       if (!ret)
+               layer->enabled = true;
+
+       return ret;
+
+err_no_prepare:
+       DRM_ERROR("Cannot prepare\n");
+       return 1;
+}
+
+int sti_layer_commit(struct sti_layer *layer)
+{
+       if (!layer)
+               return 1;
+
+       if (!layer->ops->commit)
+               goto err_no_commit;
+
+       return layer->ops->commit(layer);
+
+err_no_commit:
+       DRM_ERROR("Cannot commit\n");
+       return 1;
+}
+
+int sti_layer_disable(struct sti_layer *layer)
+{
+       int ret;
+
+       DRM_DEBUG_DRIVER("%s\n", sti_layer_to_str(layer));
+       if (!layer)
+               return 1;
+
+       if (!layer->enabled)
+               return 0;
+
+       if (!layer->ops->disable)
+               goto err_no_disable;
+
+       ret = layer->ops->disable(layer);
+       if (!ret)
+               layer->enabled = false;
+       else
+               DRM_ERROR("Disable failed\n");
+
+       return ret;
+
+err_no_disable:
+       DRM_ERROR("Cannot disable\n");
+       return 1;
+}
+
+const uint32_t *sti_layer_get_formats(struct sti_layer *layer)
+{
+       if (!layer)
+               return NULL;
+
+       if (!layer->ops->get_formats)
+               return NULL;
+
+       return layer->ops->get_formats(layer);
+}
+
+unsigned int sti_layer_get_nb_formats(struct sti_layer *layer)
+{
+       if (!layer)
+               return 0;
+
+       if (!layer->ops->get_nb_formats)
+               return 0;
+
+       return layer->ops->get_nb_formats(layer);
+}
diff --git a/drivers/gpu/drm/sti/sti_layer.h b/drivers/gpu/drm/sti/sti_layer.h
new file mode 100644 (file)
index 0000000..198c377
--- /dev/null
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) STMicroelectronics SA 2014
+ * Authors: Benjamin Gaignard <benjamin.gaignard@st.com>
+ *          Fabien Dessenne <fabien.dessenne@st.com>
+ *          for STMicroelectronics.
+ * License terms:  GNU General Public License (GPL), version 2
+ */
+
+#ifndef _STI_LAYER_H_
+#define _STI_LAYER_H_
+
+#include <drm/drmP.h>
+
+#define to_sti_layer(x) container_of(x, struct sti_layer, plane)
+
+#define STI_LAYER_TYPE_SHIFT 8
+#define STI_LAYER_TYPE_MASK (~((1<<STI_LAYER_TYPE_SHIFT)-1))
+
+struct sti_layer;
+
+enum sti_layer_type {
+       STI_GDP = 1 << STI_LAYER_TYPE_SHIFT,
+       STI_VID = 2 << STI_LAYER_TYPE_SHIFT,
+       STI_CUR = 3 << STI_LAYER_TYPE_SHIFT,
+       STI_BCK = 4 << STI_LAYER_TYPE_SHIFT
+};
+
+enum sti_layer_id_of_type {
+       STI_ID_0 = 0,
+       STI_ID_1 = 1,
+       STI_ID_2 = 2,
+       STI_ID_3 = 3
+};
+
+enum sti_layer_desc {
+       STI_GDP_0       = STI_GDP | STI_ID_0,
+       STI_GDP_1       = STI_GDP | STI_ID_1,
+       STI_GDP_2       = STI_GDP | STI_ID_2,
+       STI_GDP_3       = STI_GDP | STI_ID_3,
+       STI_VID_0       = STI_VID | STI_ID_0,
+       STI_VID_1       = STI_VID | STI_ID_1,
+       STI_CURSOR      = STI_CUR,
+       STI_BACK        = STI_BCK
+};
+
+/**
+ * STI layer functions structure
+ *
+ * @get_formats:       get layer supported formats
+ * @get_nb_formats:    get number of format supported
+ * @init:               initialize the layer
+ * @prepare:           prepare layer before rendering
+ * @commit:            set layer for rendering
+ * @disable:           disable layer
+ */
+struct sti_layer_funcs {
+       const uint32_t* (*get_formats)(struct sti_layer *layer);
+       unsigned int (*get_nb_formats)(struct sti_layer *layer);
+       void (*init)(struct sti_layer *layer);
+       int (*prepare)(struct sti_layer *layer, bool first_prepare);
+       int (*commit)(struct sti_layer *layer);
+       int (*disable)(struct sti_layer *layer);
+};
+
+/**
+ * STI layer structure
+ *
+ * @plane:              drm plane it is bound to (if any)
+ * @fb:                 drm fb it is bound to
+ * @mode:               display mode
+ * @desc:               layer type & id
+ * @device:            driver device
+ * @regs:              layer registers
+ * @ops:                layer functions
+ * @zorder:             layer z-order
+ * @mixer_id:           id of the mixer used to display the layer
+ * @enabled:            to know if the layer is active or not
+ * @src_x src_y:        coordinates of the input (fb) area
+ * @src_w src_h:        size of the input (fb) area
+ * @dst_x dst_y:        coordinates of the output (crtc) area
+ * @dst_w dst_h:        size of the output (crtc) area
+ * @format:             format
+ * @pitches:            pitch of 'planes' (eg: Y, U, V)
+ * @offsets:            offset of 'planes'
+ * @paddr:              physical address of the input buffer
+ */
+struct sti_layer {
+       struct drm_plane plane;
+       struct drm_framebuffer *fb;
+       struct drm_display_mode *mode;
+       enum sti_layer_desc desc;
+       struct device *dev;
+       void __iomem *regs;
+       const struct sti_layer_funcs *ops;
+       int zorder;
+       int mixer_id;
+       bool enabled;
+       int src_x, src_y;
+       int src_w, src_h;
+       int dst_x, dst_y;
+       int dst_w, dst_h;
+       uint32_t format;
+       unsigned int pitches[4];
+       unsigned int offsets[4];
+       dma_addr_t paddr;
+};
+
+struct sti_layer *sti_layer_create(struct device *dev, int desc,
+                       void __iomem *baseaddr);
+int sti_layer_prepare(struct sti_layer *layer, struct drm_framebuffer *fb,
+                       struct drm_display_mode *mode,
+                       int mixer_id,
+                       int dest_x, int dest_y,
+                       int dest_w, int dest_h,
+                       int src_x, int src_y,
+                       int src_w, int src_h);
+int sti_layer_commit(struct sti_layer *layer);
+int sti_layer_disable(struct sti_layer *layer);
+const uint32_t *sti_layer_get_formats(struct sti_layer *layer);
+unsigned int sti_layer_get_nb_formats(struct sti_layer *layer);
+const char *sti_layer_to_str(struct sti_layer *layer);
+
+#endif
diff --git a/drivers/gpu/drm/sti/sti_mixer.c b/drivers/gpu/drm/sti/sti_mixer.c
new file mode 100644 (file)
index 0000000..79f369d
--- /dev/null
@@ -0,0 +1,249 @@
+/*
+ * Copyright (C) STMicroelectronics SA 2014
+ * Authors: Benjamin Gaignard <benjamin.gaignard@st.com>
+ *          Fabien Dessenne <fabien.dessenne@st.com>
+ *          for STMicroelectronics.
+ * License terms:  GNU General Public License (GPL), version 2
+ */
+
+#include "sti_compositor.h"
+#include "sti_mixer.h"
+#include "sti_vtg.h"
+
+/* Identity: G=Y , B=Cb , R=Cr */
+static const u32 mixerColorSpaceMatIdentity[] = {
+       0x10000000, 0x00000000, 0x10000000, 0x00001000,
+       0x00000000, 0x00000000, 0x00000000, 0x00000000
+};
+
+/* regs offset */
+#define GAM_MIXER_CTL      0x00
+#define GAM_MIXER_BKC      0x04
+#define GAM_MIXER_BCO      0x0C
+#define GAM_MIXER_BCS      0x10
+#define GAM_MIXER_AVO      0x28
+#define GAM_MIXER_AVS      0x2C
+#define GAM_MIXER_CRB      0x34
+#define GAM_MIXER_ACT      0x38
+#define GAM_MIXER_MBP      0x3C
+#define GAM_MIXER_MX0      0x80
+
+/* id for depth of CRB reg */
+#define GAM_DEPTH_VID0_ID  1
+#define GAM_DEPTH_VID1_ID  2
+#define GAM_DEPTH_GDP0_ID  3
+#define GAM_DEPTH_GDP1_ID  4
+#define GAM_DEPTH_GDP2_ID  5
+#define GAM_DEPTH_GDP3_ID  6
+#define GAM_DEPTH_MASK_ID  7
+
+/* mask in CTL reg */
+#define GAM_CTL_BACK_MASK  BIT(0)
+#define GAM_CTL_VID0_MASK  BIT(1)
+#define GAM_CTL_VID1_MASK  BIT(2)
+#define GAM_CTL_GDP0_MASK  BIT(3)
+#define GAM_CTL_GDP1_MASK  BIT(4)
+#define GAM_CTL_GDP2_MASK  BIT(5)
+#define GAM_CTL_GDP3_MASK  BIT(6)
+
+const char *sti_mixer_to_str(struct sti_mixer *mixer)
+{
+       switch (mixer->id) {
+       case STI_MIXER_MAIN:
+               return "MAIN_MIXER";
+       case STI_MIXER_AUX:
+               return "AUX_MIXER";
+       default:
+               return "<UNKNOWN MIXER>";
+       }
+}
+
+static inline u32 sti_mixer_reg_read(struct sti_mixer *mixer, u32 reg_id)
+{
+       return readl(mixer->regs + reg_id);
+}
+
+static inline void sti_mixer_reg_write(struct sti_mixer *mixer,
+                                      u32 reg_id, u32 val)
+{
+       writel(val, mixer->regs + reg_id);
+}
+
+void sti_mixer_set_background_status(struct sti_mixer *mixer, bool enable)
+{
+       u32 val = sti_mixer_reg_read(mixer, GAM_MIXER_CTL);
+
+       val &= ~GAM_CTL_BACK_MASK;
+       val |= enable;
+       sti_mixer_reg_write(mixer, GAM_MIXER_CTL, val);
+}
+
+static void sti_mixer_set_background_color(struct sti_mixer *mixer,
+                                          u8 red, u8 green, u8 blue)
+{
+       u32 val = (red << 16) | (green << 8) | blue;
+
+       sti_mixer_reg_write(mixer, GAM_MIXER_BKC, val);
+}
+
+static void sti_mixer_set_background_area(struct sti_mixer *mixer,
+                                         struct drm_display_mode *mode)
+{
+       u32 ydo, xdo, yds, xds;
+
+       ydo = sti_vtg_get_line_number(*mode, 0);
+       yds = sti_vtg_get_line_number(*mode, mode->vdisplay - 1);
+       xdo = sti_vtg_get_pixel_number(*mode, 0);
+       xds = sti_vtg_get_pixel_number(*mode, mode->hdisplay - 1);
+
+       sti_mixer_reg_write(mixer, GAM_MIXER_BCO, ydo << 16 | xdo);
+       sti_mixer_reg_write(mixer, GAM_MIXER_BCS, yds << 16 | xds);
+}
+
+int sti_mixer_set_layer_depth(struct sti_mixer *mixer, struct sti_layer *layer)
+{
+       int layer_id = 0, depth = layer->zorder;
+       u32 mask, val;
+
+       if (depth >= GAM_MIXER_NB_DEPTH_LEVEL)
+               return 1;
+
+       switch (layer->desc) {
+       case STI_GDP_0:
+               layer_id = GAM_DEPTH_GDP0_ID;
+               break;
+       case STI_GDP_1:
+               layer_id = GAM_DEPTH_GDP1_ID;
+               break;
+       case STI_GDP_2:
+               layer_id = GAM_DEPTH_GDP2_ID;
+               break;
+       case STI_GDP_3:
+               layer_id = GAM_DEPTH_GDP3_ID;
+               break;
+       case STI_VID_0:
+               layer_id = GAM_DEPTH_VID0_ID;
+               break;
+       case STI_VID_1:
+               layer_id = GAM_DEPTH_VID1_ID;
+               break;
+       default:
+               DRM_ERROR("Unknown layer %d\n", layer->desc);
+               return 1;
+       }
+       mask = GAM_DEPTH_MASK_ID << (3 * depth);
+       layer_id = layer_id << (3 * depth);
+
+       DRM_DEBUG_DRIVER("%s %s depth=%d\n", sti_mixer_to_str(mixer),
+                        sti_layer_to_str(layer), depth);
+       dev_dbg(mixer->dev, "GAM_MIXER_CRB val 0x%x mask 0x%x\n",
+               layer_id, mask);
+
+       val = sti_mixer_reg_read(mixer, GAM_MIXER_CRB);
+       val &= ~mask;
+       val |= layer_id;
+       sti_mixer_reg_write(mixer, GAM_MIXER_CRB, val);
+
+       dev_dbg(mixer->dev, "Read GAM_MIXER_CRB 0x%x\n",
+               sti_mixer_reg_read(mixer, GAM_MIXER_CRB));
+       return 0;
+}
+
+int sti_mixer_active_video_area(struct sti_mixer *mixer,
+                               struct drm_display_mode *mode)
+{
+       u32 ydo, xdo, yds, xds;
+
+       ydo = sti_vtg_get_line_number(*mode, 0);
+       yds = sti_vtg_get_line_number(*mode, mode->vdisplay - 1);
+       xdo = sti_vtg_get_pixel_number(*mode, 0);
+       xds = sti_vtg_get_pixel_number(*mode, mode->hdisplay - 1);
+
+       DRM_DEBUG_DRIVER("%s active video area xdo:%d ydo:%d xds:%d yds:%d\n",
+                        sti_mixer_to_str(mixer), xdo, ydo, xds, yds);
+       sti_mixer_reg_write(mixer, GAM_MIXER_AVO, ydo << 16 | xdo);
+       sti_mixer_reg_write(mixer, GAM_MIXER_AVS, yds << 16 | xds);
+
+       sti_mixer_set_background_color(mixer, 0xFF, 0, 0);
+
+       sti_mixer_set_background_area(mixer, mode);
+       sti_mixer_set_background_status(mixer, true);
+       return 0;
+}
+
+static u32 sti_mixer_get_layer_mask(struct sti_layer *layer)
+{
+       switch (layer->desc) {
+       case STI_BACK:
+               return GAM_CTL_BACK_MASK;
+       case STI_GDP_0:
+               return GAM_CTL_GDP0_MASK;
+       case STI_GDP_1:
+               return GAM_CTL_GDP1_MASK;
+       case STI_GDP_2:
+               return GAM_CTL_GDP2_MASK;
+       case STI_GDP_3:
+               return GAM_CTL_GDP3_MASK;
+       case STI_VID_0:
+               return GAM_CTL_VID0_MASK;
+       case STI_VID_1:
+               return GAM_CTL_VID1_MASK;
+       default:
+               return 0;
+       }
+}
+
+int sti_mixer_set_layer_status(struct sti_mixer *mixer,
+                              struct sti_layer *layer, bool status)
+{
+       u32 mask, val;
+
+       DRM_DEBUG_DRIVER("%s %s %s\n", status ? "enable" : "disable",
+                        sti_mixer_to_str(mixer), sti_layer_to_str(layer));
+
+       mask = sti_mixer_get_layer_mask(layer);
+       if (!mask) {
+               DRM_ERROR("Can not find layer mask\n");
+               return -EINVAL;
+       }
+
+       val = sti_mixer_reg_read(mixer, GAM_MIXER_CTL);
+       val &= ~mask;
+       val |= status ? mask : 0;
+       sti_mixer_reg_write(mixer, GAM_MIXER_CTL, val);
+
+       return 0;
+}
+
+void sti_mixer_set_matrix(struct sti_mixer *mixer)
+{
+       unsigned int i;
+
+       for (i = 0; i < ARRAY_SIZE(mixerColorSpaceMatIdentity); i++)
+               sti_mixer_reg_write(mixer, GAM_MIXER_MX0 + (i * 4),
+                                   mixerColorSpaceMatIdentity[i]);
+}
+
+struct sti_mixer *sti_mixer_create(struct device *dev, int id,
+                                  void __iomem *baseaddr)
+{
+       struct sti_mixer *mixer = devm_kzalloc(dev, sizeof(*mixer), GFP_KERNEL);
+       struct device_node *np = dev->of_node;
+
+       dev_dbg(dev, "%s\n", __func__);
+       if (!mixer) {
+               DRM_ERROR("Failed to allocated memory for mixer\n");
+               return NULL;
+       }
+       mixer->regs = baseaddr;
+       mixer->dev = dev;
+       mixer->id = id;
+
+       if (of_device_is_compatible(np, "st,stih416-compositor"))
+               sti_mixer_set_matrix(mixer);
+
+       DRM_DEBUG_DRIVER("%s created. Regs=%p\n",
+                        sti_mixer_to_str(mixer), mixer->regs);
+
+       return mixer;
+}
diff --git a/drivers/gpu/drm/sti/sti_mixer.h b/drivers/gpu/drm/sti/sti_mixer.h
new file mode 100644 (file)
index 0000000..8743721
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) STMicroelectronics SA 2014
+ * Authors: Benjamin Gaignard <benjamin.gaignard@st.com>
+ *          Fabien Dessenne <fabien.dessenne@st.com>
+ *          for STMicroelectronics.
+ * License terms:  GNU General Public License (GPL), version 2
+ */
+
+#ifndef _STI_MIXER_H_
+#define _STI_MIXER_H_
+
+#include <drm/drmP.h>
+
+#include "sti_layer.h"
+
+#define to_sti_mixer(x) container_of(x, struct sti_mixer, drm_crtc)
+
+/**
+ * STI Mixer subdevice structure
+ *
+ * @dev: driver device
+ * @regs: mixer registers
+ * @id: id of the mixer
+ * @drm_crtc: crtc object link to the mixer
+ * @pending_event: set if a flip event is pending on crtc
+ */
+struct sti_mixer {
+       struct device *dev;
+       void __iomem *regs;
+       int id;
+       struct drm_crtc drm_crtc;
+       struct drm_pending_vblank_event *pending_event;
+};
+
+const char *sti_mixer_to_str(struct sti_mixer *mixer);
+
+struct sti_mixer *sti_mixer_create(struct device *dev, int id,
+               void __iomem *baseaddr);
+
+int sti_mixer_set_layer_status(struct sti_mixer *mixer,
+               struct sti_layer *layer, bool status);
+int sti_mixer_set_layer_depth(struct sti_mixer *mixer, struct sti_layer *layer);
+int sti_mixer_active_video_area(struct sti_mixer *mixer,
+               struct drm_display_mode *mode);
+
+void sti_mixer_set_background_status(struct sti_mixer *mixer, bool enable);
+
+/* depth in Cross-bar control = z order */
+#define GAM_MIXER_NB_DEPTH_LEVEL 7
+
+#define STI_MIXER_MAIN 0
+#define STI_MIXER_AUX  1
+
+#endif
diff --git a/drivers/gpu/drm/sti/sti_tvout.c b/drivers/gpu/drm/sti/sti_tvout.c
new file mode 100644 (file)
index 0000000..b69e26f
--- /dev/null
@@ -0,0 +1,648 @@
+/*
+ * Copyright (C) STMicroelectronics SA 2014
+ * Authors: Benjamin Gaignard <benjamin.gaignard@st.com>
+ *          Vincent Abriou <vincent.abriou@st.com>
+ *          for STMicroelectronics.
+ * License terms:  GNU General Public License (GPL), version 2
+ */
+
+#include <linux/clk.h>
+#include <linux/component.h>
+#include <linux/module.h>
+#include <linux/of_platform.h>
+#include <linux/platform_device.h>
+#include <linux/reset.h>
+
+#include <drm/drmP.h>
+#include <drm/drm_crtc_helper.h>
+
+/* glue registers */
+#define TVO_CSC_MAIN_M0                  0x000
+#define TVO_CSC_MAIN_M1                  0x004
+#define TVO_CSC_MAIN_M2                  0x008
+#define TVO_CSC_MAIN_M3                  0x00c
+#define TVO_CSC_MAIN_M4                  0x010
+#define TVO_CSC_MAIN_M5                  0x014
+#define TVO_CSC_MAIN_M6                  0x018
+#define TVO_CSC_MAIN_M7                  0x01c
+#define TVO_MAIN_IN_VID_FORMAT           0x030
+#define TVO_CSC_AUX_M0                   0x100
+#define TVO_CSC_AUX_M1                   0x104
+#define TVO_CSC_AUX_M2                   0x108
+#define TVO_CSC_AUX_M3                   0x10c
+#define TVO_CSC_AUX_M4                   0x110
+#define TVO_CSC_AUX_M5                   0x114
+#define TVO_CSC_AUX_M6                   0x118
+#define TVO_CSC_AUX_M7                   0x11c
+#define TVO_AUX_IN_VID_FORMAT            0x130
+#define TVO_VIP_HDF                      0x400
+#define TVO_HD_SYNC_SEL                  0x418
+#define TVO_HD_DAC_CFG_OFF               0x420
+#define TVO_VIP_HDMI                     0x500
+#define TVO_HDMI_FORCE_COLOR_0           0x504
+#define TVO_HDMI_FORCE_COLOR_1           0x508
+#define TVO_HDMI_CLIP_VALUE_B_CB         0x50c
+#define TVO_HDMI_CLIP_VALUE_Y_G          0x510
+#define TVO_HDMI_CLIP_VALUE_R_CR         0x514
+#define TVO_HDMI_SYNC_SEL                0x518
+#define TVO_HDMI_DFV_OBS                 0x540
+
+#define TVO_IN_FMT_SIGNED                BIT(0)
+#define TVO_SYNC_EXT                     BIT(4)
+
+#define TVO_VIP_REORDER_R_SHIFT          24
+#define TVO_VIP_REORDER_G_SHIFT          20
+#define TVO_VIP_REORDER_B_SHIFT          16
+#define TVO_VIP_REORDER_MASK             0x3
+#define TVO_VIP_REORDER_Y_G_SEL          0
+#define TVO_VIP_REORDER_CB_B_SEL         1
+#define TVO_VIP_REORDER_CR_R_SEL         2
+
+#define TVO_VIP_CLIP_SHIFT               8
+#define TVO_VIP_CLIP_MASK                0x7
+#define TVO_VIP_CLIP_DISABLED            0
+#define TVO_VIP_CLIP_EAV_SAV             1
+#define TVO_VIP_CLIP_LIMITED_RANGE_RGB_Y 2
+#define TVO_VIP_CLIP_LIMITED_RANGE_CB_CR 3
+#define TVO_VIP_CLIP_PROG_RANGE          4
+
+#define TVO_VIP_RND_SHIFT                4
+#define TVO_VIP_RND_MASK                 0x3
+#define TVO_VIP_RND_8BIT_ROUNDED         0
+#define TVO_VIP_RND_10BIT_ROUNDED        1
+#define TVO_VIP_RND_12BIT_ROUNDED        2
+
+#define TVO_VIP_SEL_INPUT_MASK           0xf
+#define TVO_VIP_SEL_INPUT_MAIN           0x0
+#define TVO_VIP_SEL_INPUT_AUX            0x8
+#define TVO_VIP_SEL_INPUT_FORCE_COLOR    0xf
+#define TVO_VIP_SEL_INPUT_BYPASS_MASK    0x1
+#define TVO_VIP_SEL_INPUT_BYPASSED       1
+
+#define TVO_SYNC_MAIN_VTG_SET_REF        0x00
+#define TVO_SYNC_MAIN_VTG_SET_1          0x01
+#define TVO_SYNC_MAIN_VTG_SET_2          0x02
+#define TVO_SYNC_MAIN_VTG_SET_3          0x03
+#define TVO_SYNC_MAIN_VTG_SET_4          0x04
+#define TVO_SYNC_MAIN_VTG_SET_5          0x05
+#define TVO_SYNC_MAIN_VTG_SET_6          0x06
+#define TVO_SYNC_AUX_VTG_SET_REF         0x10
+#define TVO_SYNC_AUX_VTG_SET_1           0x11
+#define TVO_SYNC_AUX_VTG_SET_2           0x12
+#define TVO_SYNC_AUX_VTG_SET_3           0x13
+#define TVO_SYNC_AUX_VTG_SET_4           0x14
+#define TVO_SYNC_AUX_VTG_SET_5           0x15
+#define TVO_SYNC_AUX_VTG_SET_6           0x16
+
+#define TVO_SYNC_HD_DCS_SHIFT            8
+
+#define ENCODER_MAIN_CRTC_MASK           BIT(0)
+
+/* enum listing the supported output data format */
+enum sti_tvout_video_out_type {
+       STI_TVOUT_VIDEO_OUT_RGB,
+       STI_TVOUT_VIDEO_OUT_YUV,
+};
+
+struct sti_tvout {
+       struct device *dev;
+       struct drm_device *drm_dev;
+       void __iomem *regs;
+       struct reset_control *reset;
+       struct drm_encoder *hdmi;
+       struct drm_encoder *hda;
+};
+
+struct sti_tvout_encoder {
+       struct drm_encoder encoder;
+       struct sti_tvout *tvout;
+};
+
+#define to_sti_tvout_encoder(x) \
+       container_of(x, struct sti_tvout_encoder, encoder)
+
+#define to_sti_tvout(x) to_sti_tvout_encoder(x)->tvout
+
+/* preformatter conversion matrix */
+static const u32 rgb_to_ycbcr_601[8] = {
+       0xF927082E, 0x04C9FEAB, 0x01D30964, 0xFA95FD3D,
+       0x0000082E, 0x00002000, 0x00002000, 0x00000000
+};
+
+/* 709 RGB to YCbCr */
+static const u32 rgb_to_ycbcr_709[8] = {
+       0xF891082F, 0x0367FF40, 0x01280B71, 0xF9B1FE20,
+       0x0000082F, 0x00002000, 0x00002000, 0x00000000
+};
+
+static u32 tvout_read(struct sti_tvout *tvout, int offset)
+{
+       return readl(tvout->regs + offset);
+}
+
+static void tvout_write(struct sti_tvout *tvout, u32 val, int offset)
+{
+       writel(val, tvout->regs + offset);
+}
+
+/**
+ * Set the clipping mode of a VIP
+ *
+ * @tvout: tvout structure
+ * @cr_r:
+ * @y_g:
+ * @cb_b:
+ */
+static void tvout_vip_set_color_order(struct sti_tvout *tvout,
+                                     u32 cr_r, u32 y_g, u32 cb_b)
+{
+       u32 val = tvout_read(tvout, TVO_VIP_HDMI);
+
+       val &= ~(TVO_VIP_REORDER_MASK << TVO_VIP_REORDER_R_SHIFT);
+       val &= ~(TVO_VIP_REORDER_MASK << TVO_VIP_REORDER_G_SHIFT);
+       val &= ~(TVO_VIP_REORDER_MASK << TVO_VIP_REORDER_B_SHIFT);
+       val |= cr_r << TVO_VIP_REORDER_R_SHIFT;
+       val |= y_g << TVO_VIP_REORDER_G_SHIFT;
+       val |= cb_b << TVO_VIP_REORDER_B_SHIFT;
+
+       tvout_write(tvout, val, TVO_VIP_HDMI);
+}
+
+/**
+ * Set the clipping mode of a VIP
+ *
+ * @tvout: tvout structure
+ * @range: clipping range
+ */
+static void tvout_vip_set_clip_mode(struct sti_tvout *tvout, u32 range)
+{
+       u32 val = tvout_read(tvout, TVO_VIP_HDMI);
+
+       val &= ~(TVO_VIP_CLIP_MASK << TVO_VIP_CLIP_SHIFT);
+       val |= range << TVO_VIP_CLIP_SHIFT;
+       tvout_write(tvout, val, TVO_VIP_HDMI);
+}
+
+/**
+ * Set the rounded value of a VIP
+ *
+ * @tvout: tvout structure
+ * @rnd: rounded val per component
+ */
+static void tvout_vip_set_rnd(struct sti_tvout *tvout, u32 rnd)
+{
+       u32 val = tvout_read(tvout, TVO_VIP_HDMI);
+
+       val &= ~(TVO_VIP_RND_MASK << TVO_VIP_RND_SHIFT);
+       val |= rnd << TVO_VIP_RND_SHIFT;
+       tvout_write(tvout, val, TVO_VIP_HDMI);
+}
+
+/**
+ * Select the VIP input
+ *
+ * @tvout: tvout structure
+ * @sel_input: selected_input (main/aux + conv)
+ */
+static void tvout_vip_set_sel_input(struct sti_tvout *tvout,
+                                   bool main_path,
+                                   bool sel_input_logic_inverted,
+                                   enum sti_tvout_video_out_type video_out)
+{
+       u32 sel_input;
+       u32 val = tvout_read(tvout, TVO_VIP_HDMI);
+
+       if (main_path)
+               sel_input = TVO_VIP_SEL_INPUT_MAIN;
+       else
+               sel_input = TVO_VIP_SEL_INPUT_AUX;
+
+       switch (video_out) {
+       case STI_TVOUT_VIDEO_OUT_RGB:
+               sel_input |= TVO_VIP_SEL_INPUT_BYPASSED;
+               break;
+       case STI_TVOUT_VIDEO_OUT_YUV:
+               sel_input &= ~TVO_VIP_SEL_INPUT_BYPASSED;
+               break;
+       }
+
+       /* on stih407 chip the sel_input bypass mode logic is inverted */
+       if (sel_input_logic_inverted)
+               sel_input = sel_input ^ TVO_VIP_SEL_INPUT_BYPASS_MASK;
+
+       val &= ~TVO_VIP_SEL_INPUT_MASK;
+       val |= sel_input;
+       tvout_write(tvout, val, TVO_VIP_HDMI);
+}
+
+/**
+ * Select the input video signed or unsigned
+ *
+ * @tvout: tvout structure
+ * @in_vid_signed: used video input format
+ */
+static void tvout_vip_set_in_vid_fmt(struct sti_tvout *tvout, u32 in_vid_fmt)
+{
+       u32 val = tvout_read(tvout, TVO_VIP_HDMI);
+
+       val &= ~TVO_IN_FMT_SIGNED;
+       val |= in_vid_fmt;
+       tvout_write(tvout, val, TVO_MAIN_IN_VID_FORMAT);
+}
+
+/**
+ * Start VIP block for HDMI output
+ *
+ * @tvout: pointer on tvout structure
+ * @main_path: true if main path has to be used in the vip configuration
+ *       else aux path is used.
+ */
+static void tvout_hdmi_start(struct sti_tvout *tvout, bool main_path)
+{
+       struct device_node *node = tvout->dev->of_node;
+       bool sel_input_logic_inverted = false;
+
+       dev_dbg(tvout->dev, "%s\n", __func__);
+
+       if (main_path) {
+               DRM_DEBUG_DRIVER("main vip for hdmi\n");
+               /* select the input sync for hdmi = VTG set 1 */
+               tvout_write(tvout, TVO_SYNC_MAIN_VTG_SET_1, TVO_HDMI_SYNC_SEL);
+       } else {
+               DRM_DEBUG_DRIVER("aux vip for hdmi\n");
+               /* select the input sync for hdmi = VTG set 1 */
+               tvout_write(tvout, TVO_SYNC_AUX_VTG_SET_1, TVO_HDMI_SYNC_SEL);
+       }
+
+       /* set color channel order */
+       tvout_vip_set_color_order(tvout,
+                                 TVO_VIP_REORDER_CR_R_SEL,
+                                 TVO_VIP_REORDER_Y_G_SEL,
+                                 TVO_VIP_REORDER_CB_B_SEL);
+
+       /* set clipping mode (Limited range RGB/Y) */
+       tvout_vip_set_clip_mode(tvout, TVO_VIP_CLIP_LIMITED_RANGE_RGB_Y);
+
+       /* set round mode (rounded to 8-bit per component) */
+       tvout_vip_set_rnd(tvout, TVO_VIP_RND_8BIT_ROUNDED);
+
+       if (of_device_is_compatible(node, "st,stih407-tvout")) {
+               /* set input video format */
+               tvout_vip_set_in_vid_fmt(tvout->regs + TVO_MAIN_IN_VID_FORMAT,
+                                        TVO_IN_FMT_SIGNED);
+               sel_input_logic_inverted = true;
+       }
+
+       /* input selection */
+       tvout_vip_set_sel_input(tvout, main_path,
+                       sel_input_logic_inverted, STI_TVOUT_VIDEO_OUT_RGB);
+}
+
+/**
+ * Start HDF VIP and HD DAC
+ *
+ * @tvout: pointer on tvout structure
+ * @main_path: true if main path has to be used in the vip configuration
+ *       else aux path is used.
+ */
+static void tvout_hda_start(struct sti_tvout *tvout, bool main_path)
+{
+       struct device_node *node = tvout->dev->of_node;
+       bool sel_input_logic_inverted = false;
+
+       dev_dbg(tvout->dev, "%s\n", __func__);
+
+       if (!main_path) {
+               DRM_ERROR("HD Analog on aux not implemented\n");
+               return;
+       }
+
+       DRM_DEBUG_DRIVER("main vip for HDF\n");
+
+       /* set color channel order */
+       tvout_vip_set_color_order(tvout->regs + TVO_VIP_HDF,
+                                 TVO_VIP_REORDER_CR_R_SEL,
+                                 TVO_VIP_REORDER_Y_G_SEL,
+                                 TVO_VIP_REORDER_CB_B_SEL);
+
+       /* set clipping mode (Limited range RGB/Y) */
+       tvout_vip_set_clip_mode(tvout->regs + TVO_VIP_HDF,
+                               TVO_VIP_CLIP_LIMITED_RANGE_CB_CR);
+
+       /* set round mode (rounded to 10-bit per component) */
+       tvout_vip_set_rnd(tvout->regs + TVO_VIP_HDF, TVO_VIP_RND_10BIT_ROUNDED);
+
+       if (of_device_is_compatible(node, "st,stih407-tvout")) {
+               /* set input video format */
+               tvout_vip_set_in_vid_fmt(tvout, TVO_IN_FMT_SIGNED);
+               sel_input_logic_inverted = true;
+       }
+
+       /* Input selection */
+       tvout_vip_set_sel_input(tvout->regs + TVO_VIP_HDF,
+                               main_path,
+                               sel_input_logic_inverted,
+                               STI_TVOUT_VIDEO_OUT_YUV);
+
+       /* select the input sync for HD analog = VTG set 3
+        * and HD DCS = VTG set 2 */
+       tvout_write(tvout,
+               (TVO_SYNC_MAIN_VTG_SET_2 << TVO_SYNC_HD_DCS_SHIFT)
+               | TVO_SYNC_MAIN_VTG_SET_3,
+               TVO_HD_SYNC_SEL);
+
+       /* power up HD DAC */
+       tvout_write(tvout, 0, TVO_HD_DAC_CFG_OFF);
+}
+
+static void sti_tvout_encoder_dpms(struct drm_encoder *encoder, int mode)
+{
+}
+
+static bool sti_tvout_encoder_mode_fixup(struct drm_encoder *encoder,
+                                      const struct drm_display_mode *mode,
+                                      struct drm_display_mode *adjusted_mode)
+{
+       return true;
+}
+
+static void sti_tvout_encoder_mode_set(struct drm_encoder *encoder,
+                                      struct drm_display_mode *mode,
+                                      struct drm_display_mode *adjusted_mode)
+{
+}
+
+static void sti_tvout_encoder_prepare(struct drm_encoder *encoder)
+{
+}
+
+static void sti_tvout_encoder_destroy(struct drm_encoder *encoder)
+{
+       struct sti_tvout_encoder *sti_encoder = to_sti_tvout_encoder(encoder);
+
+       drm_encoder_cleanup(encoder);
+       kfree(sti_encoder);
+}
+
+static const struct drm_encoder_funcs sti_tvout_encoder_funcs = {
+       .destroy = sti_tvout_encoder_destroy,
+};
+
+static void sti_hda_encoder_commit(struct drm_encoder *encoder)
+{
+       struct sti_tvout *tvout = to_sti_tvout(encoder);
+
+       tvout_hda_start(tvout, true);
+}
+
+static void sti_hda_encoder_disable(struct drm_encoder *encoder)
+{
+       struct sti_tvout *tvout = to_sti_tvout(encoder);
+
+       /* reset VIP register */
+       tvout_write(tvout, 0x0, TVO_VIP_HDF);
+
+       /* power down HD DAC */
+       tvout_write(tvout, 1, TVO_HD_DAC_CFG_OFF);
+}
+
+static const struct drm_encoder_helper_funcs sti_hda_encoder_helper_funcs = {
+       .dpms = sti_tvout_encoder_dpms,
+       .mode_fixup = sti_tvout_encoder_mode_fixup,
+       .mode_set = sti_tvout_encoder_mode_set,
+       .prepare = sti_tvout_encoder_prepare,
+       .commit = sti_hda_encoder_commit,
+       .disable = sti_hda_encoder_disable,
+};
+
+static struct drm_encoder *sti_tvout_create_hda_encoder(struct drm_device *dev,
+               struct sti_tvout *tvout)
+{
+       struct sti_tvout_encoder *encoder;
+       struct drm_encoder *drm_encoder;
+
+       encoder = devm_kzalloc(tvout->dev, sizeof(*encoder), GFP_KERNEL);
+       if (!encoder)
+               return NULL;
+
+       encoder->tvout = tvout;
+
+       drm_encoder = (struct drm_encoder *) encoder;
+
+       drm_encoder->possible_crtcs = ENCODER_MAIN_CRTC_MASK;
+       drm_encoder->possible_clones = 1 << 0;
+
+       drm_encoder_init(dev, drm_encoder,
+                       &sti_tvout_encoder_funcs, DRM_MODE_ENCODER_DAC);
+
+       drm_encoder_helper_add(drm_encoder, &sti_hda_encoder_helper_funcs);
+
+       return drm_encoder;
+}
+
+static void sti_hdmi_encoder_commit(struct drm_encoder *encoder)
+{
+       struct sti_tvout *tvout = to_sti_tvout(encoder);
+
+       tvout_hdmi_start(tvout, true);
+}
+
+static void sti_hdmi_encoder_disable(struct drm_encoder *encoder)
+{
+       struct sti_tvout *tvout = to_sti_tvout(encoder);
+
+       /* reset VIP register */
+       tvout_write(tvout, 0x0, TVO_VIP_HDMI);
+}
+
+static const struct drm_encoder_helper_funcs sti_hdmi_encoder_helper_funcs = {
+       .dpms = sti_tvout_encoder_dpms,
+       .mode_fixup = sti_tvout_encoder_mode_fixup,
+       .mode_set = sti_tvout_encoder_mode_set,
+       .prepare = sti_tvout_encoder_prepare,
+       .commit = sti_hdmi_encoder_commit,
+       .disable = sti_hdmi_encoder_disable,
+};
+
+static struct drm_encoder *sti_tvout_create_hdmi_encoder(struct drm_device *dev,
+               struct sti_tvout *tvout)
+{
+       struct sti_tvout_encoder *encoder;
+       struct drm_encoder *drm_encoder;
+
+       encoder = devm_kzalloc(tvout->dev, sizeof(*encoder), GFP_KERNEL);
+       if (!encoder)
+               return NULL;
+
+       encoder->tvout = tvout;
+
+       drm_encoder = (struct drm_encoder *) encoder;
+
+       drm_encoder->possible_crtcs = ENCODER_MAIN_CRTC_MASK;
+       drm_encoder->possible_clones = 1 << 1;
+
+       drm_encoder_init(dev, drm_encoder,
+                       &sti_tvout_encoder_funcs, DRM_MODE_ENCODER_TMDS);
+
+       drm_encoder_helper_add(drm_encoder, &sti_hdmi_encoder_helper_funcs);
+
+       return drm_encoder;
+}
+
+static void sti_tvout_create_encoders(struct drm_device *dev,
+               struct sti_tvout *tvout)
+{
+       tvout->hdmi = sti_tvout_create_hdmi_encoder(dev, tvout);
+       tvout->hda = sti_tvout_create_hda_encoder(dev, tvout);
+}
+
+static void sti_tvout_destroy_encoders(struct sti_tvout *tvout)
+{
+       if (tvout->hdmi)
+               drm_encoder_cleanup(tvout->hdmi);
+       tvout->hdmi = NULL;
+
+       if (tvout->hda)
+               drm_encoder_cleanup(tvout->hda);
+       tvout->hda = NULL;
+}
+
+static int sti_tvout_bind(struct device *dev, struct device *master, void *data)
+{
+       struct sti_tvout *tvout = dev_get_drvdata(dev);
+       struct drm_device *drm_dev = data;
+       unsigned int i;
+       int ret;
+
+       tvout->drm_dev = drm_dev;
+
+       /* set preformatter matrix */
+       for (i = 0; i < 8; i++) {
+               tvout_write(tvout, rgb_to_ycbcr_601[i],
+                       TVO_CSC_MAIN_M0 + (i * 4));
+               tvout_write(tvout, rgb_to_ycbcr_601[i],
+                       TVO_CSC_AUX_M0 + (i * 4));
+       }
+
+       sti_tvout_create_encoders(drm_dev, tvout);
+
+       ret = component_bind_all(dev, drm_dev);
+       if (ret)
+               sti_tvout_destroy_encoders(tvout);
+
+       return ret;
+}
+
+static void sti_tvout_unbind(struct device *dev, struct device *master,
+       void *data)
+{
+       /* do nothing */
+}
+
+static const struct component_ops sti_tvout_ops = {
+       .bind   = sti_tvout_bind,
+       .unbind = sti_tvout_unbind,
+};
+
+static int compare_of(struct device *dev, void *data)
+{
+       return dev->of_node == data;
+}
+
+static int sti_tvout_master_bind(struct device *dev)
+{
+       return 0;
+}
+
+static void sti_tvout_master_unbind(struct device *dev)
+{
+       /* do nothing */
+}
+
+static const struct component_master_ops sti_tvout_master_ops = {
+       .bind = sti_tvout_master_bind,
+       .unbind = sti_tvout_master_unbind,
+};
+
+static int sti_tvout_probe(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct device_node *node = dev->of_node;
+       struct sti_tvout *tvout;
+       struct resource *res;
+       struct device_node *child_np;
+       struct component_match *match = NULL;
+
+       DRM_INFO("%s\n", __func__);
+
+       if (!node)
+               return -ENODEV;
+
+       tvout = devm_kzalloc(dev, sizeof(*tvout), GFP_KERNEL);
+       if (!tvout)
+               return -ENOMEM;
+
+       tvout->dev = dev;
+
+       /* get Memory ressources */
+       res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "tvout-reg");
+       if (!res) {
+               DRM_ERROR("Invalid glue resource\n");
+               return -ENOMEM;
+       }
+       tvout->regs = devm_ioremap_nocache(dev, res->start, resource_size(res));
+       if (IS_ERR(tvout->regs))
+               return PTR_ERR(tvout->regs);
+
+       /* get reset resources */
+       tvout->reset = devm_reset_control_get(dev, "tvout");
+       /* take tvout out of reset */
+       if (!IS_ERR(tvout->reset))
+               reset_control_deassert(tvout->reset);
+
+       platform_set_drvdata(pdev, tvout);
+
+       of_platform_populate(node, NULL, NULL, dev);
+
+       child_np = of_get_next_available_child(node, NULL);
+
+       while (child_np) {
+               component_match_add(dev, &match, compare_of, child_np);
+               of_node_put(child_np);
+               child_np = of_get_next_available_child(node, child_np);
+       }
+
+       component_master_add_with_match(dev, &sti_tvout_master_ops, match);
+
+       return component_add(dev, &sti_tvout_ops);
+}
+
+static int sti_tvout_remove(struct platform_device *pdev)
+{
+       component_master_del(&pdev->dev, &sti_tvout_master_ops);
+       component_del(&pdev->dev, &sti_tvout_ops);
+       return 0;
+}
+
+static struct of_device_id tvout_of_match[] = {
+       { .compatible = "st,stih416-tvout", },
+       { .compatible = "st,stih407-tvout", },
+       { /* end node */ }
+};
+MODULE_DEVICE_TABLE(of, tvout_of_match);
+
+struct platform_driver sti_tvout_driver = {
+       .driver = {
+               .name = "sti-tvout",
+               .owner = THIS_MODULE,
+               .of_match_table = tvout_of_match,
+       },
+       .probe = sti_tvout_probe,
+       .remove = sti_tvout_remove,
+};
+
+module_platform_driver(sti_tvout_driver);
+
+MODULE_AUTHOR("Benjamin Gaignard <benjamin.gaignard@st.com>");
+MODULE_DESCRIPTION("STMicroelectronics SoC DRM driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/gpu/drm/sti/sti_vid.c b/drivers/gpu/drm/sti/sti_vid.c
new file mode 100644 (file)
index 0000000..10ced6a
--- /dev/null
@@ -0,0 +1,138 @@
+/*
+ * Copyright (C) STMicroelectronics SA 2014
+ * Author: Fabien Dessenne <fabien.dessenne@st.com> for STMicroelectronics.
+ * License terms:  GNU General Public License (GPL), version 2
+ */
+
+#include <drm/drmP.h>
+
+#include "sti_layer.h"
+#include "sti_vid.h"
+#include "sti_vtg.h"
+
+/* Registers */
+#define VID_CTL                 0x00
+#define VID_ALP                 0x04
+#define VID_CLF                 0x08
+#define VID_VPO                 0x0C
+#define VID_VPS                 0x10
+#define VID_KEY1                0x28
+#define VID_KEY2                0x2C
+#define VID_MPR0                0x30
+#define VID_MPR1                0x34
+#define VID_MPR2                0x38
+#define VID_MPR3                0x3C
+#define VID_MST                 0x68
+#define VID_BC                  0x70
+#define VID_TINT                0x74
+#define VID_CSAT                0x78
+
+/* Registers values */
+#define VID_CTL_IGNORE          (BIT(31) | BIT(30))
+#define VID_CTL_PSI_ENABLE      (BIT(2) | BIT(1) | BIT(0))
+#define VID_ALP_OPAQUE          0x00000080
+#define VID_BC_DFLT             0x00008000
+#define VID_TINT_DFLT           0x00000000
+#define VID_CSAT_DFLT           0x00000080
+/* YCbCr to RGB BT709:
+ * R = Y+1.5391Cr
+ * G = Y-0.4590Cr-0.1826Cb
+ * B = Y+1.8125Cb */
+#define VID_MPR0_BT709          0x0A800000
+#define VID_MPR1_BT709          0x0AC50000
+#define VID_MPR2_BT709          0x07150545
+#define VID_MPR3_BT709          0x00000AE8
+
+static int sti_vid_prepare_layer(struct sti_layer *vid, bool first_prepare)
+{
+       u32 val;
+
+       /* Unmask */
+       val = readl(vid->regs + VID_CTL);
+       val &= ~VID_CTL_IGNORE;
+       writel(val, vid->regs + VID_CTL);
+
+       return 0;
+}
+
+static int sti_vid_commit_layer(struct sti_layer *vid)
+{
+       struct drm_display_mode *mode = vid->mode;
+       u32 ydo, xdo, yds, xds;
+
+       ydo = sti_vtg_get_line_number(*mode, vid->dst_y);
+       yds = sti_vtg_get_line_number(*mode, vid->dst_y + vid->dst_h - 1);
+       xdo = sti_vtg_get_pixel_number(*mode, vid->dst_x);
+       xds = sti_vtg_get_pixel_number(*mode, vid->dst_x + vid->dst_w - 1);
+
+       writel((ydo << 16) | xdo, vid->regs + VID_VPO);
+       writel((yds << 16) | xds, vid->regs + VID_VPS);
+
+       return 0;
+}
+
+static int sti_vid_disable_layer(struct sti_layer *vid)
+{
+       u32 val;
+
+       /* Mask */
+       val = readl(vid->regs + VID_CTL);
+       val |= VID_CTL_IGNORE;
+       writel(val, vid->regs + VID_CTL);
+
+       return 0;
+}
+
+static const uint32_t *sti_vid_get_formats(struct sti_layer *layer)
+{
+       return NULL;
+}
+
+static unsigned int sti_vid_get_nb_formats(struct sti_layer *layer)
+{
+       return 0;
+}
+
+static void sti_vid_init(struct sti_layer *vid)
+{
+       /* Enable PSI, Mask layer */
+       writel(VID_CTL_PSI_ENABLE | VID_CTL_IGNORE, vid->regs + VID_CTL);
+
+       /* Opaque */
+       writel(VID_ALP_OPAQUE, vid->regs + VID_ALP);
+
+       /* Color conversion parameters */
+       writel(VID_MPR0_BT709, vid->regs + VID_MPR0);
+       writel(VID_MPR1_BT709, vid->regs + VID_MPR1);
+       writel(VID_MPR2_BT709, vid->regs + VID_MPR2);
+       writel(VID_MPR3_BT709, vid->regs + VID_MPR3);
+
+       /* Brightness, contrast, tint, saturation */
+       writel(VID_BC_DFLT, vid->regs + VID_BC);
+       writel(VID_TINT_DFLT, vid->regs + VID_TINT);
+       writel(VID_CSAT_DFLT, vid->regs + VID_CSAT);
+}
+
+static const struct sti_layer_funcs vid_ops = {
+       .get_formats = sti_vid_get_formats,
+       .get_nb_formats = sti_vid_get_nb_formats,
+       .init = sti_vid_init,
+       .prepare = sti_vid_prepare_layer,
+       .commit = sti_vid_commit_layer,
+       .disable = sti_vid_disable_layer,
+};
+
+struct sti_layer *sti_vid_create(struct device *dev)
+{
+       struct sti_layer *vid;
+
+       vid = devm_kzalloc(dev, sizeof(*vid), GFP_KERNEL);
+       if (!vid) {
+               DRM_ERROR("Failed to allocate memory for VID\n");
+               return NULL;
+       }
+
+       vid->ops = &vid_ops;
+
+       return vid;
+}
diff --git a/drivers/gpu/drm/sti/sti_vid.h b/drivers/gpu/drm/sti/sti_vid.h
new file mode 100644 (file)
index 0000000..2c0aecd
--- /dev/null
@@ -0,0 +1,12 @@
+/*
+ * Copyright (C) STMicroelectronics SA 2014
+ * Author: Fabien Dessenne <fabien.dessenne@st.com> for STMicroelectronics.
+ * License terms:  GNU General Public License (GPL), version 2
+ */
+
+#ifndef _STI_VID_H_
+#define _STI_VID_H_
+
+struct sti_layer *sti_vid_create(struct device *dev);
+
+#endif
diff --git a/drivers/gpu/drm/sti/sti_vtac.c b/drivers/gpu/drm/sti/sti_vtac.c
new file mode 100644 (file)
index 0000000..82a51d4
--- /dev/null
@@ -0,0 +1,215 @@
+/*
+ * Copyright (C) STMicroelectronics SA 2014
+ * Author: Benjamin Gaignard <benjamin.gaignard@st.com> for STMicroelectronics.
+ * License terms:  GNU General Public License (GPL), version 2
+ */
+
+#include <linux/clk.h>
+#include <linux/io.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+
+#include <drm/drmP.h>
+
+/* registers offset */
+#define VTAC_CONFIG                     0x00
+#define VTAC_RX_FIFO_CONFIG             0x04
+#define VTAC_FIFO_CONFIG_VAL            0x04
+
+#define VTAC_SYS_CFG8521                0x824
+#define VTAC_SYS_CFG8522                0x828
+
+/* Number of phyts per pixel */
+#define VTAC_2_5_PPP                    0x0005
+#define VTAC_3_PPP                      0x0006
+#define VTAC_4_PPP                      0x0008
+#define VTAC_5_PPP                      0x000A
+#define VTAC_6_PPP                      0x000C
+#define VTAC_13_PPP                     0x001A
+#define VTAC_14_PPP                     0x001C
+#define VTAC_15_PPP                     0x001E
+#define VTAC_16_PPP                     0x0020
+#define VTAC_17_PPP                     0x0022
+#define VTAC_18_PPP                     0x0024
+
+/* enable bits */
+#define VTAC_ENABLE                     0x3003
+
+#define VTAC_TX_PHY_ENABLE_CLK_PHY      BIT(0)
+#define VTAC_TX_PHY_ENABLE_CLK_DLL      BIT(1)
+#define VTAC_TX_PHY_PLL_NOT_OSC_MODE    BIT(3)
+#define VTAC_TX_PHY_RST_N_DLL_SWITCH    BIT(4)
+#define VTAC_TX_PHY_PROG_N3             BIT(9)
+
+
+/**
+ * VTAC mode structure
+ *
+ * @vid_in_width: Video Data Resolution
+ * @phyts_width: Width of phyt buses(phyt low and phyt high).
+ * @phyts_per_pixel: Number of phyts sent per pixel
+ */
+struct sti_vtac_mode {
+       u32 vid_in_width;
+       u32 phyts_width;
+       u32 phyts_per_pixel;
+};
+
+static const struct sti_vtac_mode vtac_mode_main = {0x2, 0x2, VTAC_5_PPP};
+static const struct sti_vtac_mode vtac_mode_aux = {0x1, 0x0, VTAC_17_PPP};
+
+/**
+ * VTAC structure
+ *
+ * @dev: pointer to device structure
+ * @regs: ioremapped registers for RX and TX devices
+ * @phy_regs: phy registers for TX device
+ * @clk: clock
+ * @mode: main or auxillary configuration mode
+ */
+struct sti_vtac {
+       struct device *dev;
+       void __iomem *regs;
+       void __iomem *phy_regs;
+       struct clk *clk;
+       const struct sti_vtac_mode *mode;
+};
+
+static void sti_vtac_rx_set_config(struct sti_vtac *vtac)
+{
+       u32 config;
+
+       /* Enable VTAC clock */
+       if (clk_prepare_enable(vtac->clk))
+               DRM_ERROR("Failed to prepare/enable vtac_rx clock.\n");
+
+       writel(VTAC_FIFO_CONFIG_VAL, vtac->regs + VTAC_RX_FIFO_CONFIG);
+
+       config = VTAC_ENABLE;
+       config |= vtac->mode->vid_in_width << 4;
+       config |= vtac->mode->phyts_width << 16;
+       config |= vtac->mode->phyts_per_pixel << 23;
+       writel(config, vtac->regs + VTAC_CONFIG);
+}
+
+static void sti_vtac_tx_set_config(struct sti_vtac *vtac)
+{
+       u32 phy_config;
+       u32 config;
+
+       /* Enable VTAC clock */
+       if (clk_prepare_enable(vtac->clk))
+               DRM_ERROR("Failed to prepare/enable vtac_tx clock.\n");
+
+       /* Configure vtac phy */
+       phy_config = 0x00000000;
+       writel(phy_config, vtac->phy_regs + VTAC_SYS_CFG8522);
+       phy_config = VTAC_TX_PHY_ENABLE_CLK_PHY;
+       writel(phy_config, vtac->phy_regs + VTAC_SYS_CFG8521);
+       phy_config = readl(vtac->phy_regs + VTAC_SYS_CFG8521);
+       phy_config |= VTAC_TX_PHY_PROG_N3;
+       writel(phy_config, vtac->phy_regs + VTAC_SYS_CFG8521);
+       phy_config = readl(vtac->phy_regs + VTAC_SYS_CFG8521);
+       phy_config |= VTAC_TX_PHY_ENABLE_CLK_DLL;
+       writel(phy_config, vtac->phy_regs + VTAC_SYS_CFG8521);
+       phy_config = readl(vtac->phy_regs + VTAC_SYS_CFG8521);
+       phy_config |= VTAC_TX_PHY_RST_N_DLL_SWITCH;
+       writel(phy_config, vtac->phy_regs + VTAC_SYS_CFG8521);
+       phy_config = readl(vtac->phy_regs + VTAC_SYS_CFG8521);
+       phy_config |= VTAC_TX_PHY_PLL_NOT_OSC_MODE;
+       writel(phy_config, vtac->phy_regs + VTAC_SYS_CFG8521);
+
+       /* Configure vtac tx */
+       config = VTAC_ENABLE;
+       config |= vtac->mode->vid_in_width << 4;
+       config |= vtac->mode->phyts_width << 16;
+       config |= vtac->mode->phyts_per_pixel << 23;
+       writel(config, vtac->regs + VTAC_CONFIG);
+}
+
+static const struct of_device_id vtac_of_match[] = {
+       {
+               .compatible = "st,vtac-main",
+               .data = &vtac_mode_main,
+       }, {
+               .compatible = "st,vtac-aux",
+               .data = &vtac_mode_aux,
+       }, {
+               /* end node */
+       }
+};
+MODULE_DEVICE_TABLE(of, vtac_of_match);
+
+static int sti_vtac_probe(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct device_node *np = dev->of_node;
+       const struct of_device_id *id;
+       struct sti_vtac *vtac;
+       struct resource *res;
+
+       vtac = devm_kzalloc(dev, sizeof(*vtac), GFP_KERNEL);
+       if (!vtac)
+               return -ENOMEM;
+
+       vtac->dev = dev;
+
+       id = of_match_node(vtac_of_match, np);
+       if (!id)
+               return -ENOMEM;
+
+       vtac->mode = id->data;
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!res) {
+               DRM_ERROR("Invalid resource\n");
+               return -ENOMEM;
+       }
+       vtac->regs = devm_ioremap_resource(dev, res);
+       if (IS_ERR(vtac->regs))
+               return PTR_ERR(vtac->regs);
+
+
+       vtac->clk = devm_clk_get(dev, "vtac");
+       if (IS_ERR(vtac->clk)) {
+               DRM_ERROR("Cannot get vtac clock\n");
+               return PTR_ERR(vtac->clk);
+       }
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
+       if (res) {
+               vtac->phy_regs = devm_ioremap_nocache(dev, res->start,
+                                                resource_size(res));
+               sti_vtac_tx_set_config(vtac);
+       } else {
+
+               sti_vtac_rx_set_config(vtac);
+       }
+
+       platform_set_drvdata(pdev, vtac);
+       DRM_INFO("%s %s\n", __func__, dev_name(vtac->dev));
+
+       return 0;
+}
+
+static int sti_vtac_remove(struct platform_device *pdev)
+{
+       return 0;
+}
+
+struct platform_driver sti_vtac_driver = {
+       .driver = {
+               .name = "sti-vtac",
+               .owner = THIS_MODULE,
+               .of_match_table = vtac_of_match,
+       },
+       .probe = sti_vtac_probe,
+       .remove = sti_vtac_remove,
+};
+
+module_platform_driver(sti_vtac_driver);
+
+MODULE_AUTHOR("Benjamin Gaignard <benjamin.gaignard@st.com>");
+MODULE_DESCRIPTION("STMicroelectronics SoC DRM driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/gpu/drm/sti/sti_vtg.c b/drivers/gpu/drm/sti/sti_vtg.c
new file mode 100644 (file)
index 0000000..740d6e3
--- /dev/null
@@ -0,0 +1,366 @@
+/*
+ * Copyright (C) STMicroelectronics SA 2014
+ * Authors: Benjamin Gaignard <benjamin.gaignard@st.com>
+ *          Fabien Dessenne <fabien.dessenne@st.com>
+ *          Vincent Abriou <vincent.abriou@st.com>
+ *          for STMicroelectronics.
+ * License terms:  GNU General Public License (GPL), version 2
+ */
+
+#include <linux/module.h>
+#include <linux/notifier.h>
+#include <linux/platform_device.h>
+
+#include <drm/drmP.h>
+
+#include "sti_vtg.h"
+
+#define VTG_TYPE_MASTER         0
+#define VTG_TYPE_SLAVE_BY_EXT0  1
+
+/* registers offset */
+#define VTG_MODE            0x0000
+#define VTG_CLKLN           0x0008
+#define VTG_HLFLN           0x000C
+#define VTG_DRST_AUTOC      0x0010
+#define VTG_VID_TFO         0x0040
+#define VTG_VID_TFS         0x0044
+#define VTG_VID_BFO         0x0048
+#define VTG_VID_BFS         0x004C
+
+#define VTG_HOST_ITS        0x0078
+#define VTG_HOST_ITS_BCLR   0x007C
+#define VTG_HOST_ITM_BCLR   0x0088
+#define VTG_HOST_ITM_BSET   0x008C
+
+#define VTG_H_HD_1          0x00C0
+#define VTG_TOP_V_VD_1      0x00C4
+#define VTG_BOT_V_VD_1      0x00C8
+#define VTG_TOP_V_HD_1      0x00CC
+#define VTG_BOT_V_HD_1      0x00D0
+
+#define VTG_H_HD_2          0x00E0
+#define VTG_TOP_V_VD_2      0x00E4
+#define VTG_BOT_V_VD_2      0x00E8
+#define VTG_TOP_V_HD_2      0x00EC
+#define VTG_BOT_V_HD_2      0x00F0
+
+#define VTG_H_HD_3          0x0100
+#define VTG_TOP_V_VD_3      0x0104
+#define VTG_BOT_V_VD_3      0x0108
+#define VTG_TOP_V_HD_3      0x010C
+#define VTG_BOT_V_HD_3      0x0110
+
+#define VTG_IRQ_BOTTOM      BIT(0)
+#define VTG_IRQ_TOP         BIT(1)
+#define VTG_IRQ_MASK        (VTG_IRQ_TOP | VTG_IRQ_BOTTOM)
+
+/* delay introduced by the Arbitrary Waveform Generator in nb of pixels */
+#define AWG_DELAY_HD        (-9)
+#define AWG_DELAY_ED        (-8)
+#define AWG_DELAY_SD        (-7)
+
+LIST_HEAD(vtg_lookup);
+
+/**
+ * STI VTG structure
+ *
+ * @dev: pointer to device driver
+ * @data: data associated to the device
+ * @irq: VTG irq
+ * @type: VTG type (main or aux)
+ * @notifier_list: notifier callback
+ * @crtc_id: the crtc id for vblank event
+ * @slave: slave vtg
+ * @link: List node to link the structure in lookup list
+ */
+struct sti_vtg {
+       struct device *dev;
+       struct device_node *np;
+       void __iomem *regs;
+       int irq;
+       u32 irq_status;
+       struct raw_notifier_head notifier_list;
+       int crtc_id;
+       struct sti_vtg *slave;
+       struct list_head link;
+};
+
+static void vtg_register(struct sti_vtg *vtg)
+{
+       list_add_tail(&vtg->link, &vtg_lookup);
+}
+
+struct sti_vtg *of_vtg_find(struct device_node *np)
+{
+       struct sti_vtg *vtg;
+
+       list_for_each_entry(vtg, &vtg_lookup, link) {
+               if (vtg->np == np)
+                       return vtg;
+       }
+       return NULL;
+}
+EXPORT_SYMBOL(of_vtg_find);
+
+static void vtg_reset(struct sti_vtg *vtg)
+{
+       /* reset slave and then master */
+       if (vtg->slave)
+               vtg_reset(vtg->slave);
+
+       writel(1, vtg->regs + VTG_DRST_AUTOC);
+}
+
+static void vtg_set_mode(struct sti_vtg *vtg,
+                        int type, const struct drm_display_mode *mode)
+{
+       u32 tmp;
+
+       if (vtg->slave)
+               vtg_set_mode(vtg->slave, VTG_TYPE_SLAVE_BY_EXT0, mode);
+
+       writel(mode->htotal, vtg->regs + VTG_CLKLN);
+       writel(mode->vtotal * 2, vtg->regs + VTG_HLFLN);
+
+       tmp = (mode->vtotal - mode->vsync_start + 1) << 16;
+       tmp |= mode->htotal - mode->hsync_start;
+       writel(tmp, vtg->regs + VTG_VID_TFO);
+       writel(tmp, vtg->regs + VTG_VID_BFO);
+
+       tmp = (mode->vdisplay + mode->vtotal - mode->vsync_start + 1) << 16;
+       tmp |= mode->hdisplay + mode->htotal - mode->hsync_start;
+       writel(tmp, vtg->regs + VTG_VID_TFS);
+       writel(tmp, vtg->regs + VTG_VID_BFS);
+
+       /* prepare VTG set 1 and 2 for HDMI and VTG set 3 for HD DAC */
+       tmp = (mode->hsync_end - mode->hsync_start) << 16;
+       writel(tmp, vtg->regs + VTG_H_HD_1);
+       writel(tmp, vtg->regs + VTG_H_HD_2);
+
+       tmp = (mode->vsync_end - mode->vsync_start + 1) << 16;
+       tmp |= 1;
+       writel(tmp, vtg->regs + VTG_TOP_V_VD_1);
+       writel(tmp, vtg->regs + VTG_BOT_V_VD_1);
+       writel(0, vtg->regs + VTG_TOP_V_HD_1);
+       writel(0, vtg->regs + VTG_BOT_V_HD_1);
+
+       /* prepare VTG set 2 for for HD DCS */
+       writel(tmp, vtg->regs + VTG_TOP_V_VD_2);
+       writel(tmp, vtg->regs + VTG_BOT_V_VD_2);
+       writel(0, vtg->regs + VTG_TOP_V_HD_2);
+       writel(0, vtg->regs + VTG_BOT_V_HD_2);
+
+       /* prepare VTG set 3 for HD Analog in HD mode */
+       tmp = (mode->hsync_end - mode->hsync_start + AWG_DELAY_HD) << 16;
+       tmp |= mode->htotal + AWG_DELAY_HD;
+       writel(tmp, vtg->regs + VTG_H_HD_3);
+
+       tmp = (mode->vsync_end - mode->vsync_start) << 16;
+       tmp |= mode->vtotal;
+       writel(tmp, vtg->regs + VTG_TOP_V_VD_3);
+       writel(tmp, vtg->regs + VTG_BOT_V_VD_3);
+
+       tmp = (mode->htotal + AWG_DELAY_HD) << 16;
+       tmp |= mode->htotal + AWG_DELAY_HD;
+       writel(tmp, vtg->regs + VTG_TOP_V_HD_3);
+       writel(tmp, vtg->regs + VTG_BOT_V_HD_3);
+
+       /* mode */
+       writel(type, vtg->regs + VTG_MODE);
+}
+
+static void vtg_enable_irq(struct sti_vtg *vtg)
+{
+       /* clear interrupt status and mask */
+       writel(0xFFFF, vtg->regs + VTG_HOST_ITS_BCLR);
+       writel(0xFFFF, vtg->regs + VTG_HOST_ITM_BCLR);
+       writel(VTG_IRQ_MASK, vtg->regs + VTG_HOST_ITM_BSET);
+}
+
+void sti_vtg_set_config(struct sti_vtg *vtg,
+               const struct drm_display_mode *mode)
+{
+       /* write configuration */
+       vtg_set_mode(vtg, VTG_TYPE_MASTER, mode);
+
+       vtg_reset(vtg);
+
+       /* enable irq for the vtg vblank synchro */
+       if (vtg->slave)
+               vtg_enable_irq(vtg->slave);
+       else
+               vtg_enable_irq(vtg);
+}
+EXPORT_SYMBOL(sti_vtg_set_config);
+
+/**
+ * sti_vtg_get_line_number
+ *
+ * @mode: display mode to be used
+ * @y:    line
+ *
+ * Return the line number according to the display mode taking
+ * into account the Sync and Back Porch information.
+ * Video frame line numbers start at 1, y starts at 0.
+ * In interlaced modes the start line is the field line number of the odd
+ * field, but y is still defined as a progressive frame.
+ */
+u32 sti_vtg_get_line_number(struct drm_display_mode mode, int y)
+{
+       u32 start_line = mode.vtotal - mode.vsync_start + 1;
+
+       if (mode.flags & DRM_MODE_FLAG_INTERLACE)
+               start_line *= 2;
+
+       return start_line + y;
+}
+EXPORT_SYMBOL(sti_vtg_get_line_number);
+
+/**
+ * sti_vtg_get_pixel_number
+ *
+ * @mode: display mode to be used
+ * @x:    row
+ *
+ * Return the pixel number according to the display mode taking
+ * into account the Sync and Back Porch information.
+ * Pixels are counted from 0.
+ */
+u32 sti_vtg_get_pixel_number(struct drm_display_mode mode, int x)
+{
+       return mode.htotal - mode.hsync_start + x;
+}
+EXPORT_SYMBOL(sti_vtg_get_pixel_number);
+
+int sti_vtg_register_client(struct sti_vtg *vtg,
+               struct notifier_block *nb, int crtc_id)
+{
+       if (vtg->slave)
+               return sti_vtg_register_client(vtg->slave, nb, crtc_id);
+
+       vtg->crtc_id = crtc_id;
+       return raw_notifier_chain_register(&vtg->notifier_list, nb);
+}
+EXPORT_SYMBOL(sti_vtg_register_client);
+
+int sti_vtg_unregister_client(struct sti_vtg *vtg, struct notifier_block *nb)
+{
+       if (vtg->slave)
+               return sti_vtg_unregister_client(vtg->slave, nb);
+
+       return raw_notifier_chain_unregister(&vtg->notifier_list, nb);
+}
+EXPORT_SYMBOL(sti_vtg_unregister_client);
+
+static irqreturn_t vtg_irq_thread(int irq, void *arg)
+{
+       struct sti_vtg *vtg = arg;
+       u32 event;
+
+       event = (vtg->irq_status & VTG_IRQ_TOP) ?
+               VTG_TOP_FIELD_EVENT : VTG_BOTTOM_FIELD_EVENT;
+
+       raw_notifier_call_chain(&vtg->notifier_list, event, &vtg->crtc_id);
+
+       return IRQ_HANDLED;
+}
+
+static irqreturn_t vtg_irq(int irq, void *arg)
+{
+       struct sti_vtg *vtg = arg;
+
+       vtg->irq_status = readl(vtg->regs + VTG_HOST_ITS);
+
+       writel(vtg->irq_status, vtg->regs + VTG_HOST_ITS_BCLR);
+
+       /* force sync bus write */
+       readl(vtg->regs + VTG_HOST_ITS);
+
+       return IRQ_WAKE_THREAD;
+}
+
+static int vtg_probe(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct device_node *np;
+       struct sti_vtg *vtg;
+       struct resource *res;
+       char irq_name[32];
+       int ret;
+
+       vtg = devm_kzalloc(dev, sizeof(*vtg), GFP_KERNEL);
+       if (!vtg)
+               return -ENOMEM;
+
+       vtg->dev = dev;
+       vtg->np = pdev->dev.of_node;
+
+       /* Get Memory ressources */
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!res) {
+               DRM_ERROR("Get memory resource failed\n");
+               return -ENOMEM;
+       }
+       vtg->regs = devm_ioremap_nocache(dev, res->start, resource_size(res));
+
+       np = of_parse_phandle(pdev->dev.of_node, "st,slave", 0);
+       if (np) {
+               vtg->slave = of_vtg_find(np);
+
+               if (!vtg->slave)
+                       return -EPROBE_DEFER;
+       } else {
+               vtg->irq = platform_get_irq(pdev, 0);
+               if (IS_ERR_VALUE(vtg->irq)) {
+                       DRM_ERROR("Failed to get VTG interrupt\n");
+                       return vtg->irq;
+               }
+
+               snprintf(irq_name, sizeof(irq_name), "vsync-%s",
+                               dev_name(vtg->dev));
+
+               RAW_INIT_NOTIFIER_HEAD(&vtg->notifier_list);
+
+               ret = devm_request_threaded_irq(dev, vtg->irq, vtg_irq,
+                               vtg_irq_thread, IRQF_ONESHOT, irq_name, vtg);
+               if (IS_ERR_VALUE(ret)) {
+                       DRM_ERROR("Failed to register VTG interrupt\n");
+                       return ret;
+               }
+       }
+
+       vtg_register(vtg);
+       platform_set_drvdata(pdev, vtg);
+
+       DRM_INFO("%s %s\n", __func__, dev_name(vtg->dev));
+
+       return 0;
+}
+
+static int vtg_remove(struct platform_device *pdev)
+{
+       return 0;
+}
+
+static const struct of_device_id vtg_of_match[] = {
+       { .compatible = "st,vtg", },
+       { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, vtg_of_match);
+
+struct platform_driver sti_vtg_driver = {
+       .driver = {
+               .name = "sti-vtg",
+               .owner = THIS_MODULE,
+               .of_match_table = vtg_of_match,
+       },
+       .probe  = vtg_probe,
+       .remove = vtg_remove,
+};
+
+module_platform_driver(sti_vtg_driver);
+
+MODULE_AUTHOR("Benjamin Gaignard <benjamin.gaignard@st.com>");
+MODULE_DESCRIPTION("STMicroelectronics SoC DRM driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/gpu/drm/sti/sti_vtg.h b/drivers/gpu/drm/sti/sti_vtg.h
new file mode 100644 (file)
index 0000000..e84d23f
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) STMicroelectronics SA 2014
+ * Author: Benjamin Gaignard <benjamin.gaignard@st.com> for STMicroelectronics.
+ * License terms:  GNU General Public License (GPL), version 2
+ */
+
+#ifndef _STI_VTG_H_
+#define _STI_VTG_H_
+
+#define VTG_TOP_FIELD_EVENT     1
+#define VTG_BOTTOM_FIELD_EVENT  2
+
+struct sti_vtg;
+struct drm_display_mode;
+struct notifier_block;
+
+struct sti_vtg *of_vtg_find(struct device_node *np);
+void sti_vtg_set_config(struct sti_vtg *vtg,
+               const struct drm_display_mode *mode);
+int sti_vtg_register_client(struct sti_vtg *vtg,
+               struct notifier_block *nb, int crtc_id);
+int sti_vtg_unregister_client(struct sti_vtg *vtg,
+               struct notifier_block *nb);
+
+u32 sti_vtg_get_line_number(struct drm_display_mode mode, int y);
+u32 sti_vtg_get_pixel_number(struct drm_display_mode mode, int x);
+
+#endif
index ef40381f3909e3ac20aed29eeb1266e6a8e3d5bd..6553fd238685e459deb0676114bfd9cac04f7e50 100644 (file)
@@ -18,6 +18,8 @@
 struct tegra_dc_soc_info {
        bool supports_interlacing;
        bool supports_cursor;
+       bool supports_block_linear;
+       unsigned int pitch_align;
 };
 
 struct tegra_plane {
@@ -212,15 +214,44 @@ static int tegra_dc_setup_window(struct tegra_dc *dc, unsigned int index,
        tegra_dc_writel(dc, h_offset, DC_WINBUF_ADDR_H_OFFSET);
        tegra_dc_writel(dc, v_offset, DC_WINBUF_ADDR_V_OFFSET);
 
-       if (window->tiled) {
-               value = DC_WIN_BUFFER_ADDR_MODE_TILE_UV |
-                       DC_WIN_BUFFER_ADDR_MODE_TILE;
+       if (dc->soc->supports_block_linear) {
+               unsigned long height = window->tiling.value;
+
+               switch (window->tiling.mode) {
+               case TEGRA_BO_TILING_MODE_PITCH:
+                       value = DC_WINBUF_SURFACE_KIND_PITCH;
+                       break;
+
+               case TEGRA_BO_TILING_MODE_TILED:
+                       value = DC_WINBUF_SURFACE_KIND_TILED;
+                       break;
+
+               case TEGRA_BO_TILING_MODE_BLOCK:
+                       value = DC_WINBUF_SURFACE_KIND_BLOCK_HEIGHT(height) |
+                               DC_WINBUF_SURFACE_KIND_BLOCK;
+                       break;
+               }
+
+               tegra_dc_writel(dc, value, DC_WINBUF_SURFACE_KIND);
        } else {
-               value = DC_WIN_BUFFER_ADDR_MODE_LINEAR_UV |
-                       DC_WIN_BUFFER_ADDR_MODE_LINEAR;
-       }
+               switch (window->tiling.mode) {
+               case TEGRA_BO_TILING_MODE_PITCH:
+                       value = DC_WIN_BUFFER_ADDR_MODE_LINEAR_UV |
+                               DC_WIN_BUFFER_ADDR_MODE_LINEAR;
+                       break;
 
-       tegra_dc_writel(dc, value, DC_WIN_BUFFER_ADDR_MODE);
+               case TEGRA_BO_TILING_MODE_TILED:
+                       value = DC_WIN_BUFFER_ADDR_MODE_TILE_UV |
+                               DC_WIN_BUFFER_ADDR_MODE_TILE;
+                       break;
+
+               case TEGRA_BO_TILING_MODE_BLOCK:
+                       DRM_ERROR("hardware doesn't support block linear mode\n");
+                       return -EINVAL;
+               }
+
+               tegra_dc_writel(dc, value, DC_WIN_BUFFER_ADDR_MODE);
+       }
 
        value = WIN_ENABLE;
 
@@ -288,6 +319,7 @@ static int tegra_plane_update(struct drm_plane *plane, struct drm_crtc *crtc,
        struct tegra_dc *dc = to_tegra_dc(crtc);
        struct tegra_dc_window window;
        unsigned int i;
+       int err;
 
        memset(&window, 0, sizeof(window));
        window.src.x = src_x >> 16;
@@ -301,7 +333,10 @@ static int tegra_plane_update(struct drm_plane *plane, struct drm_crtc *crtc,
        window.format = tegra_dc_format(fb->pixel_format, &window.swap);
        window.bits_per_pixel = fb->bits_per_pixel;
        window.bottom_up = tegra_fb_is_bottom_up(fb);
-       window.tiled = tegra_fb_is_tiled(fb);
+
+       err = tegra_fb_get_tiling(fb, &window.tiling);
+       if (err < 0)
+               return err;
 
        for (i = 0; i < drm_format_num_planes(fb->pixel_format); i++) {
                struct tegra_bo *bo = tegra_fb_get_plane(fb, i);
@@ -402,8 +437,14 @@ static int tegra_dc_set_base(struct tegra_dc *dc, int x, int y,
 {
        struct tegra_bo *bo = tegra_fb_get_plane(fb, 0);
        unsigned int h_offset = 0, v_offset = 0;
+       struct tegra_bo_tiling tiling;
        unsigned int format, swap;
        unsigned long value;
+       int err;
+
+       err = tegra_fb_get_tiling(fb, &tiling);
+       if (err < 0)
+               return err;
 
        tegra_dc_writel(dc, WINDOW_A_SELECT, DC_CMD_DISPLAY_WINDOW_HEADER);
 
@@ -417,15 +458,44 @@ static int tegra_dc_set_base(struct tegra_dc *dc, int x, int y,
        tegra_dc_writel(dc, format, DC_WIN_COLOR_DEPTH);
        tegra_dc_writel(dc, swap, DC_WIN_BYTE_SWAP);
 
-       if (tegra_fb_is_tiled(fb)) {
-               value = DC_WIN_BUFFER_ADDR_MODE_TILE_UV |
-                       DC_WIN_BUFFER_ADDR_MODE_TILE;
+       if (dc->soc->supports_block_linear) {
+               unsigned long height = tiling.value;
+
+               switch (tiling.mode) {
+               case TEGRA_BO_TILING_MODE_PITCH:
+                       value = DC_WINBUF_SURFACE_KIND_PITCH;
+                       break;
+
+               case TEGRA_BO_TILING_MODE_TILED:
+                       value = DC_WINBUF_SURFACE_KIND_TILED;
+                       break;
+
+               case TEGRA_BO_TILING_MODE_BLOCK:
+                       value = DC_WINBUF_SURFACE_KIND_BLOCK_HEIGHT(height) |
+                               DC_WINBUF_SURFACE_KIND_BLOCK;
+                       break;
+               }
+
+               tegra_dc_writel(dc, value, DC_WINBUF_SURFACE_KIND);
        } else {
-               value = DC_WIN_BUFFER_ADDR_MODE_LINEAR_UV |
-                       DC_WIN_BUFFER_ADDR_MODE_LINEAR;
-       }
+               switch (tiling.mode) {
+               case TEGRA_BO_TILING_MODE_PITCH:
+                       value = DC_WIN_BUFFER_ADDR_MODE_LINEAR_UV |
+                               DC_WIN_BUFFER_ADDR_MODE_LINEAR;
+                       break;
+
+               case TEGRA_BO_TILING_MODE_TILED:
+                       value = DC_WIN_BUFFER_ADDR_MODE_TILE_UV |
+                               DC_WIN_BUFFER_ADDR_MODE_TILE;
+                       break;
+
+               case TEGRA_BO_TILING_MODE_BLOCK:
+                       DRM_ERROR("hardware doesn't support block linear mode\n");
+                       return -EINVAL;
+               }
 
-       tegra_dc_writel(dc, value, DC_WIN_BUFFER_ADDR_MODE);
+               tegra_dc_writel(dc, value, DC_WIN_BUFFER_ADDR_MODE);
+       }
 
        /* make sure bottom-up buffers are properly displayed */
        if (tegra_fb_is_bottom_up(fb)) {
@@ -1214,12 +1284,20 @@ static int tegra_dc_init(struct host1x_client *client)
 {
        struct drm_device *drm = dev_get_drvdata(client->parent);
        struct tegra_dc *dc = host1x_client_to_dc(client);
+       struct tegra_drm *tegra = drm->dev_private;
        int err;
 
        drm_crtc_init(drm, &dc->base, &tegra_crtc_funcs);
        drm_mode_crtc_set_gamma_size(&dc->base, 256);
        drm_crtc_helper_add(&dc->base, &tegra_crtc_helper_funcs);
 
+       /*
+        * Keep track of the minimum pitch alignment across all display
+        * controllers.
+        */
+       if (dc->soc->pitch_align > tegra->pitch_align)
+               tegra->pitch_align = dc->soc->pitch_align;
+
        err = tegra_dc_rgb_init(drm, dc);
        if (err < 0 && err != -ENODEV) {
                dev_err(dc->dev, "failed to initialize RGB output: %d\n", err);
@@ -1277,16 +1355,29 @@ static const struct host1x_client_ops dc_client_ops = {
 static const struct tegra_dc_soc_info tegra20_dc_soc_info = {
        .supports_interlacing = false,
        .supports_cursor = false,
+       .supports_block_linear = false,
+       .pitch_align = 8,
 };
 
 static const struct tegra_dc_soc_info tegra30_dc_soc_info = {
        .supports_interlacing = false,
        .supports_cursor = false,
+       .supports_block_linear = false,
+       .pitch_align = 8,
+};
+
+static const struct tegra_dc_soc_info tegra114_dc_soc_info = {
+       .supports_interlacing = false,
+       .supports_cursor = false,
+       .supports_block_linear = false,
+       .pitch_align = 64,
 };
 
 static const struct tegra_dc_soc_info tegra124_dc_soc_info = {
        .supports_interlacing = true,
        .supports_cursor = true,
+       .supports_block_linear = true,
+       .pitch_align = 64,
 };
 
 static const struct of_device_id tegra_dc_of_match[] = {
@@ -1303,6 +1394,7 @@ static const struct of_device_id tegra_dc_of_match[] = {
                /* sentinel */
        }
 };
+MODULE_DEVICE_TABLE(of, tegra_dc_of_match);
 
 static int tegra_dc_parse_dt(struct tegra_dc *dc)
 {
@@ -1430,6 +1522,7 @@ static int tegra_dc_remove(struct platform_device *pdev)
                return err;
        }
 
+       reset_control_assert(dc->rst);
        clk_disable_unprepare(dc->clk);
 
        return 0;
index 78c5feff95d2910123c209cc212eecd1ee1d72bf..705c93b00794feb38f56a501b7546f9e6f07b1f9 100644 (file)
 #define DC_WINBUF_ADDR_V_OFFSET_NS             0x809
 
 #define DC_WINBUF_UFLOW_STATUS                 0x80a
+#define DC_WINBUF_SURFACE_KIND                 0x80b
+#define DC_WINBUF_SURFACE_KIND_PITCH   (0 << 0)
+#define DC_WINBUF_SURFACE_KIND_TILED   (1 << 0)
+#define DC_WINBUF_SURFACE_KIND_BLOCK   (2 << 0)
+#define DC_WINBUF_SURFACE_KIND_BLOCK_HEIGHT(x) (((x) & 0x7) << 4)
 
 #define DC_WINBUF_AD_UFLOW_STATUS              0xbca
 #define DC_WINBUF_BD_UFLOW_STATUS              0xdca
index 3f132e356e9cd393394bdce5a3594765be08d596..708f783ead47682f8ef76e17ebc435a1850f9eb6 100644 (file)
@@ -382,6 +382,7 @@ static const struct of_device_id tegra_dpaux_of_match[] = {
        { .compatible = "nvidia,tegra124-dpaux", },
        { },
 };
+MODULE_DEVICE_TABLE(of, tegra_dpaux_of_match);
 
 struct platform_driver tegra_dpaux_driver = {
        .driver = {
index 3396f9f6a9f76b598434f3679dbf7c0f629e4817..59736bb810cd2d4787dab77d1fea29dadcf30f9f 100644 (file)
@@ -40,6 +40,12 @@ static int tegra_drm_load(struct drm_device *drm, unsigned long flags)
 
        drm_mode_config_init(drm);
 
+       err = tegra_drm_fb_prepare(drm);
+       if (err < 0)
+               return err;
+
+       drm_kms_helper_poll_init(drm);
+
        err = host1x_device_init(device);
        if (err < 0)
                return err;
@@ -59,8 +65,6 @@ static int tegra_drm_load(struct drm_device *drm, unsigned long flags)
        if (err < 0)
                return err;
 
-       drm_kms_helper_poll_init(drm);
-
        return 0;
 }
 
@@ -128,6 +132,45 @@ host1x_bo_lookup(struct drm_device *drm, struct drm_file *file, u32 handle)
        return &bo->base;
 }
 
+static int host1x_reloc_copy_from_user(struct host1x_reloc *dest,
+                                      struct drm_tegra_reloc __user *src,
+                                      struct drm_device *drm,
+                                      struct drm_file *file)
+{
+       u32 cmdbuf, target;
+       int err;
+
+       err = get_user(cmdbuf, &src->cmdbuf.handle);
+       if (err < 0)
+               return err;
+
+       err = get_user(dest->cmdbuf.offset, &src->cmdbuf.offset);
+       if (err < 0)
+               return err;
+
+       err = get_user(target, &src->target.handle);
+       if (err < 0)
+               return err;
+
+       err = get_user(dest->target.offset, &src->cmdbuf.offset);
+       if (err < 0)
+               return err;
+
+       err = get_user(dest->shift, &src->shift);
+       if (err < 0)
+               return err;
+
+       dest->cmdbuf.bo = host1x_bo_lookup(drm, file, cmdbuf);
+       if (!dest->cmdbuf.bo)
+               return -ENOENT;
+
+       dest->target.bo = host1x_bo_lookup(drm, file, target);
+       if (!dest->target.bo)
+               return -ENOENT;
+
+       return 0;
+}
+
 int tegra_drm_submit(struct tegra_drm_context *context,
                     struct drm_tegra_submit *args, struct drm_device *drm,
                     struct drm_file *file)
@@ -180,26 +223,13 @@ int tegra_drm_submit(struct tegra_drm_context *context,
                cmdbufs++;
        }
 
-       if (copy_from_user(job->relocarray, relocs,
-                          sizeof(*relocs) * num_relocs)) {
-               err = -EFAULT;
-               goto fail;
-       }
-
+       /* copy and resolve relocations from submit */
        while (num_relocs--) {
-               struct host1x_reloc *reloc = &job->relocarray[num_relocs];
-               struct host1x_bo *cmdbuf, *target;
-
-               cmdbuf = host1x_bo_lookup(drm, file, (u32)reloc->cmdbuf);
-               target = host1x_bo_lookup(drm, file, (u32)reloc->target);
-
-               reloc->cmdbuf = cmdbuf;
-               reloc->target = target;
-
-               if (!reloc->target || !reloc->cmdbuf) {
-                       err = -ENOENT;
+               err = host1x_reloc_copy_from_user(&job->relocarray[num_relocs],
+                                                 &relocs[num_relocs], drm,
+                                                 file);
+               if (err < 0)
                        goto fail;
-               }
        }
 
        if (copy_from_user(job->waitchk, waitchks,
@@ -451,11 +481,151 @@ static int tegra_get_syncpt_base(struct drm_device *drm, void *data,
 
        return 0;
 }
+
+static int tegra_gem_set_tiling(struct drm_device *drm, void *data,
+                               struct drm_file *file)
+{
+       struct drm_tegra_gem_set_tiling *args = data;
+       enum tegra_bo_tiling_mode mode;
+       struct drm_gem_object *gem;
+       unsigned long value = 0;
+       struct tegra_bo *bo;
+
+       switch (args->mode) {
+       case DRM_TEGRA_GEM_TILING_MODE_PITCH:
+               mode = TEGRA_BO_TILING_MODE_PITCH;
+
+               if (args->value != 0)
+                       return -EINVAL;
+
+               break;
+
+       case DRM_TEGRA_GEM_TILING_MODE_TILED:
+               mode = TEGRA_BO_TILING_MODE_TILED;
+
+               if (args->value != 0)
+                       return -EINVAL;
+
+               break;
+
+       case DRM_TEGRA_GEM_TILING_MODE_BLOCK:
+               mode = TEGRA_BO_TILING_MODE_BLOCK;
+
+               if (args->value > 5)
+                       return -EINVAL;
+
+               value = args->value;
+               break;
+
+       default:
+               return -EINVAL;
+       }
+
+       gem = drm_gem_object_lookup(drm, file, args->handle);
+       if (!gem)
+               return -ENOENT;
+
+       bo = to_tegra_bo(gem);
+
+       bo->tiling.mode = mode;
+       bo->tiling.value = value;
+
+       drm_gem_object_unreference(gem);
+
+       return 0;
+}
+
+static int tegra_gem_get_tiling(struct drm_device *drm, void *data,
+                               struct drm_file *file)
+{
+       struct drm_tegra_gem_get_tiling *args = data;
+       struct drm_gem_object *gem;
+       struct tegra_bo *bo;
+       int err = 0;
+
+       gem = drm_gem_object_lookup(drm, file, args->handle);
+       if (!gem)
+               return -ENOENT;
+
+       bo = to_tegra_bo(gem);
+
+       switch (bo->tiling.mode) {
+       case TEGRA_BO_TILING_MODE_PITCH:
+               args->mode = DRM_TEGRA_GEM_TILING_MODE_PITCH;
+               args->value = 0;
+               break;
+
+       case TEGRA_BO_TILING_MODE_TILED:
+               args->mode = DRM_TEGRA_GEM_TILING_MODE_TILED;
+               args->value = 0;
+               break;
+
+       case TEGRA_BO_TILING_MODE_BLOCK:
+               args->mode = DRM_TEGRA_GEM_TILING_MODE_BLOCK;
+               args->value = bo->tiling.value;
+               break;
+
+       default:
+               err = -EINVAL;
+               break;
+       }
+
+       drm_gem_object_unreference(gem);
+
+       return err;
+}
+
+static int tegra_gem_set_flags(struct drm_device *drm, void *data,
+                              struct drm_file *file)
+{
+       struct drm_tegra_gem_set_flags *args = data;
+       struct drm_gem_object *gem;
+       struct tegra_bo *bo;
+
+       if (args->flags & ~DRM_TEGRA_GEM_FLAGS)
+               return -EINVAL;
+
+       gem = drm_gem_object_lookup(drm, file, args->handle);
+       if (!gem)
+               return -ENOENT;
+
+       bo = to_tegra_bo(gem);
+       bo->flags = 0;
+
+       if (args->flags & DRM_TEGRA_GEM_BOTTOM_UP)
+               bo->flags |= TEGRA_BO_BOTTOM_UP;
+
+       drm_gem_object_unreference(gem);
+
+       return 0;
+}
+
+static int tegra_gem_get_flags(struct drm_device *drm, void *data,
+                              struct drm_file *file)
+{
+       struct drm_tegra_gem_get_flags *args = data;
+       struct drm_gem_object *gem;
+       struct tegra_bo *bo;
+
+       gem = drm_gem_object_lookup(drm, file, args->handle);
+       if (!gem)
+               return -ENOENT;
+
+       bo = to_tegra_bo(gem);
+       args->flags = 0;
+
+       if (bo->flags & TEGRA_BO_BOTTOM_UP)
+               args->flags |= DRM_TEGRA_GEM_BOTTOM_UP;
+
+       drm_gem_object_unreference(gem);
+
+       return 0;
+}
 #endif
 
 static const struct drm_ioctl_desc tegra_drm_ioctls[] = {
 #ifdef CONFIG_DRM_TEGRA_STAGING
-       DRM_IOCTL_DEF_DRV(TEGRA_GEM_CREATE, tegra_gem_create, DRM_UNLOCKED | DRM_AUTH),
+       DRM_IOCTL_DEF_DRV(TEGRA_GEM_CREATE, tegra_gem_create, DRM_UNLOCKED),
        DRM_IOCTL_DEF_DRV(TEGRA_GEM_MMAP, tegra_gem_mmap, DRM_UNLOCKED),
        DRM_IOCTL_DEF_DRV(TEGRA_SYNCPT_READ, tegra_syncpt_read, DRM_UNLOCKED),
        DRM_IOCTL_DEF_DRV(TEGRA_SYNCPT_INCR, tegra_syncpt_incr, DRM_UNLOCKED),
@@ -465,6 +635,10 @@ static const struct drm_ioctl_desc tegra_drm_ioctls[] = {
        DRM_IOCTL_DEF_DRV(TEGRA_GET_SYNCPT, tegra_get_syncpt, DRM_UNLOCKED),
        DRM_IOCTL_DEF_DRV(TEGRA_SUBMIT, tegra_submit, DRM_UNLOCKED),
        DRM_IOCTL_DEF_DRV(TEGRA_GET_SYNCPT_BASE, tegra_get_syncpt_base, DRM_UNLOCKED),
+       DRM_IOCTL_DEF_DRV(TEGRA_GEM_SET_TILING, tegra_gem_set_tiling, DRM_UNLOCKED),
+       DRM_IOCTL_DEF_DRV(TEGRA_GEM_GET_TILING, tegra_gem_get_tiling, DRM_UNLOCKED),
+       DRM_IOCTL_DEF_DRV(TEGRA_GEM_SET_FLAGS, tegra_gem_set_flags, DRM_UNLOCKED),
+       DRM_IOCTL_DEF_DRV(TEGRA_GEM_GET_FLAGS, tegra_gem_get_flags, DRM_UNLOCKED),
 #endif
 };
 
index 6b8fe9d86ed47d22c8bc651c368820a545e633a5..e89c70fa82d554f3da8fced5ae99b840e56c985f 100644 (file)
@@ -19,6 +19,8 @@
 #include <drm/drm_fb_helper.h>
 #include <drm/drm_fixed.h>
 
+#include "gem.h"
+
 struct reset_control;
 
 struct tegra_fb {
@@ -43,6 +45,8 @@ struct tegra_drm {
 #ifdef CONFIG_DRM_TEGRA_FBDEV
        struct tegra_fbdev *fbdev;
 #endif
+
+       unsigned int pitch_align;
 };
 
 struct tegra_drm_client;
@@ -160,7 +164,8 @@ struct tegra_dc_window {
        unsigned int stride[2];
        unsigned long base[3];
        bool bottom_up;
-       bool tiled;
+
+       struct tegra_bo_tiling tiling;
 };
 
 /* from dc.c */
@@ -279,7 +284,9 @@ int tegra_dpaux_train(struct tegra_dpaux *dpaux, struct drm_dp_link *link,
 struct tegra_bo *tegra_fb_get_plane(struct drm_framebuffer *framebuffer,
                                    unsigned int index);
 bool tegra_fb_is_bottom_up(struct drm_framebuffer *framebuffer);
-bool tegra_fb_is_tiled(struct drm_framebuffer *framebuffer);
+int tegra_fb_get_tiling(struct drm_framebuffer *framebuffer,
+                       struct tegra_bo_tiling *tiling);
+int tegra_drm_fb_prepare(struct drm_device *drm);
 int tegra_drm_fb_init(struct drm_device *drm);
 void tegra_drm_fb_exit(struct drm_device *drm);
 #ifdef CONFIG_DRM_TEGRA_FBDEV
index bd56f2affa7895b2d1e0fbd556e3e811f8e78f14..f7874458926a7f289d8df1a3e46ead9f066e1a82 100644 (file)
@@ -474,7 +474,8 @@ static int tegra_output_dsi_enable(struct tegra_output *output)
        tegra_dsi_writel(dsi, value, DSI_HOST_CONTROL);
 
        value = tegra_dsi_readl(dsi, DSI_CONTROL);
-       value |= DSI_CONTROL_HS_CLK_CTRL;
+       if (dsi->flags & MIPI_DSI_CLOCK_NON_CONTINUOUS)
+               value |= DSI_CONTROL_HS_CLK_CTRL;
        value &= ~DSI_CONTROL_TX_TRIG(3);
        value &= ~DSI_CONTROL_DCS_ENABLE;
        value |= DSI_CONTROL_VIDEO_ENABLE;
@@ -982,6 +983,7 @@ static const struct of_device_id tegra_dsi_of_match[] = {
        { .compatible = "nvidia,tegra114-dsi", },
        { },
 };
+MODULE_DEVICE_TABLE(of, tegra_dsi_of_match);
 
 struct platform_driver tegra_dsi_driver = {
        .driver = {
index 9798a708032219adde9cfd6f75c75d937c704769..3513d12d5aa1447822a7ef57449799b1aff83df9 100644 (file)
@@ -46,14 +46,15 @@ bool tegra_fb_is_bottom_up(struct drm_framebuffer *framebuffer)
        return false;
 }
 
-bool tegra_fb_is_tiled(struct drm_framebuffer *framebuffer)
+int tegra_fb_get_tiling(struct drm_framebuffer *framebuffer,
+                       struct tegra_bo_tiling *tiling)
 {
        struct tegra_fb *fb = to_tegra_fb(framebuffer);
 
-       if (fb->planes[0]->flags & TEGRA_BO_TILED)
-               return true;
+       /* TODO: handle YUV formats? */
+       *tiling = fb->planes[0]->tiling;
 
-       return false;
+       return 0;
 }
 
 static void tegra_fb_destroy(struct drm_framebuffer *framebuffer)
@@ -193,6 +194,7 @@ static int tegra_fbdev_probe(struct drm_fb_helper *helper,
                             struct drm_fb_helper_surface_size *sizes)
 {
        struct tegra_fbdev *fbdev = to_tegra_fbdev(helper);
+       struct tegra_drm *tegra = helper->dev->dev_private;
        struct drm_device *drm = helper->dev;
        struct drm_mode_fb_cmd2 cmd = { 0 };
        unsigned int bytes_per_pixel;
@@ -207,7 +209,8 @@ static int tegra_fbdev_probe(struct drm_fb_helper *helper,
 
        cmd.width = sizes->surface_width;
        cmd.height = sizes->surface_height;
-       cmd.pitches[0] = sizes->surface_width * bytes_per_pixel;
+       cmd.pitches[0] = round_up(sizes->surface_width * bytes_per_pixel,
+                                 tegra->pitch_align);
        cmd.pixel_format = drm_mode_legacy_fb_format(sizes->surface_bpp,
                                                     sizes->surface_depth);
 
@@ -267,18 +270,13 @@ release:
        return err;
 }
 
-static struct drm_fb_helper_funcs tegra_fb_helper_funcs = {
+static const struct drm_fb_helper_funcs tegra_fb_helper_funcs = {
        .fb_probe = tegra_fbdev_probe,
 };
 
-static struct tegra_fbdev *tegra_fbdev_create(struct drm_device *drm,
-                                             unsigned int preferred_bpp,
-                                             unsigned int num_crtc,
-                                             unsigned int max_connectors)
+static struct tegra_fbdev *tegra_fbdev_create(struct drm_device *drm)
 {
-       struct drm_fb_helper *helper;
        struct tegra_fbdev *fbdev;
-       int err;
 
        fbdev = kzalloc(sizeof(*fbdev), GFP_KERNEL);
        if (!fbdev) {
@@ -286,13 +284,23 @@ static struct tegra_fbdev *tegra_fbdev_create(struct drm_device *drm,
                return ERR_PTR(-ENOMEM);
        }
 
-       fbdev->base.funcs = &tegra_fb_helper_funcs;
-       helper = &fbdev->base;
+       drm_fb_helper_prepare(drm, &fbdev->base, &tegra_fb_helper_funcs);
+
+       return fbdev;
+}
+
+static int tegra_fbdev_init(struct tegra_fbdev *fbdev,
+                           unsigned int preferred_bpp,
+                           unsigned int num_crtc,
+                           unsigned int max_connectors)
+{
+       struct drm_device *drm = fbdev->base.dev;
+       int err;
 
        err = drm_fb_helper_init(drm, &fbdev->base, num_crtc, max_connectors);
        if (err < 0) {
                dev_err(drm->dev, "failed to initialize DRM FB helper\n");
-               goto free;
+               return err;
        }
 
        err = drm_fb_helper_single_add_all_connectors(&fbdev->base);
@@ -301,21 +309,17 @@ static struct tegra_fbdev *tegra_fbdev_create(struct drm_device *drm,
                goto fini;
        }
 
-       drm_helper_disable_unused_functions(drm);
-
        err = drm_fb_helper_initial_config(&fbdev->base, preferred_bpp);
        if (err < 0) {
                dev_err(drm->dev, "failed to set initial configuration\n");
                goto fini;
        }
 
-       return fbdev;
+       return 0;
 
 fini:
        drm_fb_helper_fini(&fbdev->base);
-free:
-       kfree(fbdev);
-       return ERR_PTR(err);
+       return err;
 }
 
 static void tegra_fbdev_free(struct tegra_fbdev *fbdev)
@@ -366,7 +370,7 @@ static const struct drm_mode_config_funcs tegra_drm_mode_funcs = {
 #endif
 };
 
-int tegra_drm_fb_init(struct drm_device *drm)
+int tegra_drm_fb_prepare(struct drm_device *drm)
 {
 #ifdef CONFIG_DRM_TEGRA_FBDEV
        struct tegra_drm *tegra = drm->dev_private;
@@ -381,8 +385,7 @@ int tegra_drm_fb_init(struct drm_device *drm)
        drm->mode_config.funcs = &tegra_drm_mode_funcs;
 
 #ifdef CONFIG_DRM_TEGRA_FBDEV
-       tegra->fbdev = tegra_fbdev_create(drm, 32, drm->mode_config.num_crtc,
-                                         drm->mode_config.num_connector);
+       tegra->fbdev = tegra_fbdev_create(drm);
        if (IS_ERR(tegra->fbdev))
                return PTR_ERR(tegra->fbdev);
 #endif
@@ -390,6 +393,21 @@ int tegra_drm_fb_init(struct drm_device *drm)
        return 0;
 }
 
+int tegra_drm_fb_init(struct drm_device *drm)
+{
+#ifdef CONFIG_DRM_TEGRA_FBDEV
+       struct tegra_drm *tegra = drm->dev_private;
+       int err;
+
+       err = tegra_fbdev_init(tegra->fbdev, 32, drm->mode_config.num_crtc,
+                              drm->mode_config.num_connector);
+       if (err < 0)
+               return err;
+#endif
+
+       return 0;
+}
+
 void tegra_drm_fb_exit(struct drm_device *drm)
 {
 #ifdef CONFIG_DRM_TEGRA_FBDEV
index 78cc8143760ab3977e73b9e3d99d410ce0e57e20..ce023fa3e8ae14bdfc3557295d69a7d8d12f9cd3 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/dma-buf.h>
 #include <drm/tegra_drm.h>
 
+#include "drm.h"
 #include "gem.h"
 
 static inline struct tegra_bo *host1x_to_tegra_bo(struct host1x_bo *bo)
@@ -126,7 +127,7 @@ struct tegra_bo *tegra_bo_create(struct drm_device *drm, unsigned int size,
                goto err_mmap;
 
        if (flags & DRM_TEGRA_GEM_CREATE_TILED)
-               bo->flags |= TEGRA_BO_TILED;
+               bo->tiling.mode = TEGRA_BO_TILING_MODE_TILED;
 
        if (flags & DRM_TEGRA_GEM_CREATE_BOTTOM_UP)
                bo->flags |= TEGRA_BO_BOTTOM_UP;
@@ -259,8 +260,10 @@ int tegra_bo_dumb_create(struct drm_file *file, struct drm_device *drm,
                         struct drm_mode_create_dumb *args)
 {
        int min_pitch = DIV_ROUND_UP(args->width * args->bpp, 8);
+       struct tegra_drm *tegra = drm->dev_private;
        struct tegra_bo *bo;
 
+       min_pitch = round_up(min_pitch, tegra->pitch_align);
        if (args->pitch < min_pitch)
                args->pitch = min_pitch;
 
index 2f3fe96c5154da0bbd99f04c6b809c18bba03f32..43a25c853357d4e9b2d51b2049b8a12794bfc714 100644 (file)
 #include <drm/drm.h>
 #include <drm/drmP.h>
 
-#define TEGRA_BO_TILED     (1 << 0)
-#define TEGRA_BO_BOTTOM_UP (1 << 1)
+#define TEGRA_BO_BOTTOM_UP (1 << 0)
+
+enum tegra_bo_tiling_mode {
+       TEGRA_BO_TILING_MODE_PITCH,
+       TEGRA_BO_TILING_MODE_TILED,
+       TEGRA_BO_TILING_MODE_BLOCK,
+};
+
+struct tegra_bo_tiling {
+       enum tegra_bo_tiling_mode mode;
+       unsigned long value;
+};
 
 struct tegra_bo {
        struct drm_gem_object gem;
@@ -26,6 +36,8 @@ struct tegra_bo {
        struct sg_table *sgt;
        dma_addr_t paddr;
        void *vaddr;
+
+       struct tegra_bo_tiling tiling;
 };
 
 static inline struct tegra_bo *to_tegra_bo(struct drm_gem_object *gem)
index 7c53941f2a9ea347d6ff44eb1583efc629b611d7..02cd3e37a6ec3cf7d1e1d84f65387bb1c12853cc 100644 (file)
@@ -121,6 +121,7 @@ static const struct of_device_id gr2d_match[] = {
        { .compatible = "nvidia,tegra20-gr2d" },
        { },
 };
+MODULE_DEVICE_TABLE(of, gr2d_match);
 
 static const u32 gr2d_addr_regs[] = {
        GR2D_UA_BASE_ADDR,
index 30f5ba9bd6d05c508eac1306c7b1468e6c515587..0b3f2b977ba0eeb50b32991e9380b27ede33a3f7 100644 (file)
@@ -12,7 +12,8 @@
 #include <linux/module.h>
 #include <linux/platform_device.h>
 #include <linux/reset.h>
-#include <linux/tegra-powergate.h>
+
+#include <soc/tegra/pmc.h>
 
 #include "drm.h"
 #include "gem.h"
@@ -130,6 +131,7 @@ static const struct of_device_id tegra_gr3d_match[] = {
        { .compatible = "nvidia,tegra20-gr3d" },
        { }
 };
+MODULE_DEVICE_TABLE(of, tegra_gr3d_match);
 
 static const u32 gr3d_addr_regs[] = {
        GR3D_IDX_ATTRIBUTE( 0),
index ba067bb767e376ea4aaa5a7f5fe5917d1608b7c2..ffe26547328df8a352f8dca6e832912084cc7388 100644 (file)
@@ -1450,6 +1450,7 @@ static const struct of_device_id tegra_hdmi_of_match[] = {
        { .compatible = "nvidia,tegra20-hdmi", .data = &tegra20_hdmi_config },
        { },
 };
+MODULE_DEVICE_TABLE(of, tegra_hdmi_of_match);
 
 static int tegra_hdmi_probe(struct platform_device *pdev)
 {
index a3e4f1eca6f7b479796889498906c259d3faa882..0c67d7eebc94876d645fe0827485bdc13a998035 100644 (file)
@@ -105,7 +105,7 @@ static void drm_connector_clear(struct drm_connector *connector)
 
 static void tegra_connector_destroy(struct drm_connector *connector)
 {
-       drm_sysfs_connector_remove(connector);
+       drm_connector_unregister(connector);
        drm_connector_cleanup(connector);
        drm_connector_clear(connector);
 }
@@ -140,7 +140,9 @@ static void tegra_encoder_dpms(struct drm_encoder *encoder, int mode)
        if (mode != DRM_MODE_DPMS_ON) {
                drm_panel_disable(panel);
                tegra_output_disable(output);
+               drm_panel_unprepare(panel);
        } else {
+               drm_panel_prepare(panel);
                tegra_output_enable(output);
                drm_panel_enable(panel);
        }
@@ -318,7 +320,7 @@ int tegra_output_init(struct drm_device *drm, struct tegra_output *output)
        drm_encoder_helper_add(&output->encoder, &encoder_helper_funcs);
 
        drm_mode_connector_attach_encoder(&output->connector, &output->encoder);
-       drm_sysfs_connector_add(&output->connector);
+       drm_connector_register(&output->connector);
 
        output->encoder.possible_crtcs = 0x3;
 
index 27c979b5011112182226f7a1cd4d0e1e6b54c9ed..7829e81f065d17e54ee52634886d9da0b921621a 100644 (file)
@@ -11,7 +11,8 @@
 #include <linux/io.h>
 #include <linux/platform_device.h>
 #include <linux/reset.h>
-#include <linux/tegra-powergate.h>
+
+#include <soc/tegra/pmc.h>
 
 #include <drm/drm_dp_helper.h>
 
@@ -516,7 +517,7 @@ static int tegra_output_sor_enable(struct tegra_output *output)
                if (err < 0) {
                        dev_err(sor->dev, "failed to probe eDP link: %d\n",
                                err);
-                       return err;
+                       goto unlock;
                }
        }
 
@@ -525,7 +526,7 @@ static int tegra_output_sor_enable(struct tegra_output *output)
                dev_err(sor->dev, "failed to set safe parent clock: %d\n", err);
 
        memset(&config, 0, sizeof(config));
-       config.bits_per_pixel = 24; /* XXX: don't hardcode? */
+       config.bits_per_pixel = output->connector.display_info.bpc * 3;
 
        err = tegra_sor_calc_config(sor, mode, &config, &link);
        if (err < 0)
@@ -815,12 +816,22 @@ static int tegra_output_sor_enable(struct tegra_output *output)
         * configure panel (24bpp, vsync-, hsync-, DP-A protocol, complete
         * raster, associate with display controller)
         */
-       value = SOR_STATE_ASY_VSYNCPOL |
-               SOR_STATE_ASY_HSYNCPOL |
-               SOR_STATE_ASY_PROTOCOL_DP_A |
+       value = SOR_STATE_ASY_PROTOCOL_DP_A |
                SOR_STATE_ASY_CRC_MODE_COMPLETE |
                SOR_STATE_ASY_OWNER(dc->pipe + 1);
 
+       if (mode->flags & DRM_MODE_FLAG_PHSYNC)
+               value &= ~SOR_STATE_ASY_HSYNCPOL;
+
+       if (mode->flags & DRM_MODE_FLAG_NHSYNC)
+               value |= SOR_STATE_ASY_HSYNCPOL;
+
+       if (mode->flags & DRM_MODE_FLAG_PVSYNC)
+               value &= ~SOR_STATE_ASY_VSYNCPOL;
+
+       if (mode->flags & DRM_MODE_FLAG_NVSYNC)
+               value |= SOR_STATE_ASY_VSYNCPOL;
+
        switch (config.bits_per_pixel) {
        case 24:
                value |= SOR_STATE_ASY_PIXELDEPTH_BPP_24_444;
@@ -1455,6 +1466,7 @@ static const struct of_device_id tegra_sor_of_match[] = {
        { .compatible = "nvidia,tegra124-sor", },
        { },
 };
+MODULE_DEVICE_TABLE(of, tegra_sor_of_match);
 
 struct platform_driver tegra_sor_driver = {
        .driver = {
index b20b69488dc9b28d66e557578fa9ab1680984c3b..6be623b4a86fda98867ee08f1c68428b2cb35687 100644 (file)
@@ -120,8 +120,8 @@ static int cpufreq_transition(struct notifier_block *nb,
 static int tilcdc_unload(struct drm_device *dev)
 {
        struct tilcdc_drm_private *priv = dev->dev_private;
-       struct tilcdc_module *mod, *cur;
 
+       drm_fbdev_cma_fini(priv->fbdev);
        drm_kms_helper_poll_fini(dev);
        drm_mode_config_cleanup(dev);
        drm_vblank_cleanup(dev);
@@ -148,11 +148,6 @@ static int tilcdc_unload(struct drm_device *dev)
 
        pm_runtime_disable(dev->dev);
 
-       list_for_each_entry_safe(mod, cur, &module_list, list) {
-               DBG("destroying module: %s", mod->name);
-               mod->funcs->destroy(mod);
-       }
-
        kfree(priv);
 
        return 0;
@@ -628,13 +623,13 @@ static int __init tilcdc_drm_init(void)
 static void __exit tilcdc_drm_fini(void)
 {
        DBG("fini");
-       tilcdc_tfp410_fini();
-       tilcdc_slave_fini();
-       tilcdc_panel_fini();
        platform_driver_unregister(&tilcdc_platform_driver);
+       tilcdc_panel_fini();
+       tilcdc_slave_fini();
+       tilcdc_tfp410_fini();
 }
 
-late_initcall(tilcdc_drm_init);
+module_init(tilcdc_drm_init);
 module_exit(tilcdc_drm_fini);
 
 MODULE_AUTHOR("Rob Clark <robdclark@gmail.com");
index 093803683b25241dc86ff9124fed081b7b54fd81..7596c144a9fb54d45e313588cddc9ec7e1836c79 100644 (file)
@@ -98,7 +98,6 @@ struct tilcdc_module;
 struct tilcdc_module_ops {
        /* create appropriate encoders/connectors: */
        int (*modeset_init)(struct tilcdc_module *mod, struct drm_device *dev);
-       void (*destroy)(struct tilcdc_module *mod);
 #ifdef CONFIG_DEBUG_FS
        /* create debugfs nodes (can be NULL): */
        int (*debugfs_init)(struct tilcdc_module *mod, struct drm_minor *minor);
index 86c67329b6051e0a4f97b457022a1354925d1284..4c7aa1d8134fa8736c0f31ba28b0f99a9d7259ab 100644 (file)
@@ -151,6 +151,7 @@ struct panel_connector {
 static void panel_connector_destroy(struct drm_connector *connector)
 {
        struct panel_connector *panel_connector = to_panel_connector(connector);
+       drm_connector_unregister(connector);
        drm_connector_cleanup(connector);
        kfree(panel_connector);
 }
@@ -247,7 +248,7 @@ static struct drm_connector *panel_connector_create(struct drm_device *dev,
        if (ret)
                goto fail;
 
-       drm_sysfs_connector_add(connector);
+       drm_connector_register(connector);
 
        return connector;
 
@@ -281,23 +282,8 @@ static int panel_modeset_init(struct tilcdc_module *mod, struct drm_device *dev)
        return 0;
 }
 
-static void panel_destroy(struct tilcdc_module *mod)
-{
-       struct panel_module *panel_mod = to_panel_module(mod);
-
-       if (panel_mod->timings) {
-               display_timings_release(panel_mod->timings);
-               kfree(panel_mod->timings);
-       }
-
-       tilcdc_module_cleanup(mod);
-       kfree(panel_mod->info);
-       kfree(panel_mod);
-}
-
 static const struct tilcdc_module_ops panel_module_ops = {
                .modeset_init = panel_modeset_init,
-               .destroy = panel_destroy,
 };
 
 /*
@@ -373,6 +359,7 @@ static int panel_probe(struct platform_device *pdev)
                return -ENOMEM;
 
        mod = &panel_mod->base;
+       pdev->dev.platform_data = mod;
 
        tilcdc_module_init(mod, "panel", &panel_module_ops);
 
@@ -380,17 +367,16 @@ static int panel_probe(struct platform_device *pdev)
        if (IS_ERR(pinctrl))
                dev_warn(&pdev->dev, "pins are not configured\n");
 
-
        panel_mod->timings = of_get_display_timings(node);
        if (!panel_mod->timings) {
                dev_err(&pdev->dev, "could not get panel timings\n");
-               goto fail;
+               goto fail_free;
        }
 
        panel_mod->info = of_get_panel_info(node);
        if (!panel_mod->info) {
                dev_err(&pdev->dev, "could not get panel info\n");
-               goto fail;
+               goto fail_timings;
        }
 
        mod->preferred_bpp = panel_mod->info->bpp;
@@ -401,13 +387,26 @@ static int panel_probe(struct platform_device *pdev)
 
        return 0;
 
-fail:
-       panel_destroy(mod);
+fail_timings:
+       display_timings_release(panel_mod->timings);
+
+fail_free:
+       kfree(panel_mod);
+       tilcdc_module_cleanup(mod);
        return ret;
 }
 
 static int panel_remove(struct platform_device *pdev)
 {
+       struct tilcdc_module *mod = dev_get_platdata(&pdev->dev);
+       struct panel_module *panel_mod = to_panel_module(mod);
+
+       display_timings_release(panel_mod->timings);
+
+       tilcdc_module_cleanup(mod);
+       kfree(panel_mod->info);
+       kfree(panel_mod);
+
        return 0;
 }
 
index 595068ba2d5ed2322415f0ce1eb78c9b09817917..3775fd49dac486694f667f803acd34305fa8febb 100644 (file)
@@ -166,6 +166,7 @@ struct slave_connector {
 static void slave_connector_destroy(struct drm_connector *connector)
 {
        struct slave_connector *slave_connector = to_slave_connector(connector);
+       drm_connector_unregister(connector);
        drm_connector_cleanup(connector);
        kfree(slave_connector);
 }
@@ -261,7 +262,7 @@ static struct drm_connector *slave_connector_create(struct drm_device *dev,
        if (ret)
                goto fail;
 
-       drm_sysfs_connector_add(connector);
+       drm_connector_register(connector);
 
        return connector;
 
@@ -295,17 +296,8 @@ static int slave_modeset_init(struct tilcdc_module *mod, struct drm_device *dev)
        return 0;
 }
 
-static void slave_destroy(struct tilcdc_module *mod)
-{
-       struct slave_module *slave_mod = to_slave_module(mod);
-
-       tilcdc_module_cleanup(mod);
-       kfree(slave_mod);
-}
-
 static const struct tilcdc_module_ops slave_module_ops = {
                .modeset_init = slave_modeset_init,
-               .destroy = slave_destroy,
 };
 
 /*
@@ -355,10 +347,13 @@ static int slave_probe(struct platform_device *pdev)
        }
 
        slave_mod = kzalloc(sizeof(*slave_mod), GFP_KERNEL);
-       if (!slave_mod)
-               return -ENOMEM;
+       if (!slave_mod) {
+               ret = -ENOMEM;
+               goto fail_adapter;
+       }
 
        mod = &slave_mod->base;
+       pdev->dev.platform_data = mod;
 
        mod->preferred_bpp = slave_info.bpp;
 
@@ -373,10 +368,20 @@ static int slave_probe(struct platform_device *pdev)
        tilcdc_slave_probedefer(false);
 
        return 0;
+
+fail_adapter:
+       i2c_put_adapter(slavei2c);
+       return ret;
 }
 
 static int slave_remove(struct platform_device *pdev)
 {
+       struct tilcdc_module *mod = dev_get_platdata(&pdev->dev);
+       struct slave_module *slave_mod = to_slave_module(mod);
+
+       tilcdc_module_cleanup(mod);
+       kfree(slave_mod);
+
        return 0;
 }
 
index c38b56b268ac0d8ba61a8826d13ad435f9f59fb7..354c47ca637407550a9fee0490d537c47e827209 100644 (file)
@@ -167,6 +167,7 @@ struct tfp410_connector {
 static void tfp410_connector_destroy(struct drm_connector *connector)
 {
        struct tfp410_connector *tfp410_connector = to_tfp410_connector(connector);
+       drm_connector_unregister(connector);
        drm_connector_cleanup(connector);
        kfree(tfp410_connector);
 }
@@ -261,7 +262,7 @@ static struct drm_connector *tfp410_connector_create(struct drm_device *dev,
        if (ret)
                goto fail;
 
-       drm_sysfs_connector_add(connector);
+       drm_connector_register(connector);
 
        return connector;
 
@@ -295,23 +296,8 @@ static int tfp410_modeset_init(struct tilcdc_module *mod, struct drm_device *dev
        return 0;
 }
 
-static void tfp410_destroy(struct tilcdc_module *mod)
-{
-       struct tfp410_module *tfp410_mod = to_tfp410_module(mod);
-
-       if (tfp410_mod->i2c)
-               i2c_put_adapter(tfp410_mod->i2c);
-
-       if (!IS_ERR_VALUE(tfp410_mod->gpio))
-               gpio_free(tfp410_mod->gpio);
-
-       tilcdc_module_cleanup(mod);
-       kfree(tfp410_mod);
-}
-
 static const struct tilcdc_module_ops tfp410_module_ops = {
                .modeset_init = tfp410_modeset_init,
-               .destroy = tfp410_destroy,
 };
 
 /*
@@ -341,6 +327,7 @@ static int tfp410_probe(struct platform_device *pdev)
                return -ENOMEM;
 
        mod = &tfp410_mod->base;
+       pdev->dev.platform_data = mod;
 
        tilcdc_module_init(mod, "tfp410", &tfp410_module_ops);
 
@@ -364,6 +351,7 @@ static int tfp410_probe(struct platform_device *pdev)
        tfp410_mod->i2c = of_find_i2c_adapter_by_node(i2c_node);
        if (!tfp410_mod->i2c) {
                dev_err(&pdev->dev, "could not get i2c\n");
+               of_node_put(i2c_node);
                goto fail;
        }
 
@@ -377,19 +365,32 @@ static int tfp410_probe(struct platform_device *pdev)
                ret = gpio_request(tfp410_mod->gpio, "DVI_PDn");
                if (ret) {
                        dev_err(&pdev->dev, "could not get DVI_PDn gpio\n");
-                       goto fail;
+                       goto fail_adapter;
                }
        }
 
        return 0;
 
+fail_adapter:
+       i2c_put_adapter(tfp410_mod->i2c);
+
 fail:
-       tfp410_destroy(mod);
+       kfree(tfp410_mod);
+       tilcdc_module_cleanup(mod);
        return ret;
 }
 
 static int tfp410_remove(struct platform_device *pdev)
 {
+       struct tilcdc_module *mod = dev_get_platdata(&pdev->dev);
+       struct tfp410_module *tfp410_mod = to_tfp410_module(mod);
+
+       i2c_put_adapter(tfp410_mod->i2c);
+       gpio_free(tfp410_mod->gpio);
+
+       tilcdc_module_cleanup(mod);
+       kfree(tfp410_mod);
+
        return 0;
 }
 
index 4ab9f7171c4ff04a539a8bde7fc8a9dec2b9b817..3da89d5dab60493ebc0b06811cab2800c266967e 100644 (file)
@@ -412,7 +412,7 @@ static void ttm_bo_cleanup_refs_or_queue(struct ttm_buffer_object *bo)
        int ret;
 
        spin_lock(&glob->lru_lock);
-       ret = __ttm_bo_reserve(bo, false, true, false, 0);
+       ret = __ttm_bo_reserve(bo, false, true, false, NULL);
 
        spin_lock(&bdev->fence_lock);
        (void) ttm_bo_wait(bo, false, false, true);
@@ -514,7 +514,7 @@ static int ttm_bo_cleanup_refs_and_unlock(struct ttm_buffer_object *bo,
                        return ret;
 
                spin_lock(&glob->lru_lock);
-               ret = __ttm_bo_reserve(bo, false, true, false, 0);
+               ret = __ttm_bo_reserve(bo, false, true, false, NULL);
 
                /*
                 * We raced, and lost, someone else holds the reservation now,
@@ -577,11 +577,11 @@ static int ttm_bo_delayed_delete(struct ttm_bo_device *bdev, bool remove_all)
                        kref_get(&nentry->list_kref);
                }
 
-               ret = __ttm_bo_reserve(entry, false, true, false, 0);
+               ret = __ttm_bo_reserve(entry, false, true, false, NULL);
                if (remove_all && ret) {
                        spin_unlock(&glob->lru_lock);
                        ret = __ttm_bo_reserve(entry, false, false,
-                                              false, 0);
+                                              false, NULL);
                        spin_lock(&glob->lru_lock);
                }
 
@@ -726,7 +726,7 @@ static int ttm_mem_evict_first(struct ttm_bo_device *bdev,
 
        spin_lock(&glob->lru_lock);
        list_for_each_entry(bo, &man->lru, lru) {
-               ret = __ttm_bo_reserve(bo, false, true, false, 0);
+               ret = __ttm_bo_reserve(bo, false, true, false, NULL);
                if (!ret)
                        break;
        }
@@ -784,7 +784,7 @@ static int ttm_bo_mem_force_space(struct ttm_buffer_object *bo,
        int ret;
 
        do {
-               ret = (*man->func->get_node)(man, bo, placement, mem);
+               ret = (*man->func->get_node)(man, bo, placement, 0, mem);
                if (unlikely(ret != 0))
                        return ret;
                if (mem->mm_node)
@@ -897,7 +897,8 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
 
                if (man->has_type && man->use_type) {
                        type_found = true;
-                       ret = (*man->func->get_node)(man, bo, placement, mem);
+                       ret = (*man->func->get_node)(man, bo, placement,
+                                                    cur_flags, mem);
                        if (unlikely(ret))
                                return ret;
                }
@@ -937,7 +938,6 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
                ttm_flag_masked(&cur_flags, placement->busy_placement[i],
                                ~TTM_PL_MASK_MEMTYPE);
 
-
                if (mem_type == TTM_PL_SYSTEM) {
                        mem->mem_type = mem_type;
                        mem->placement = cur_flags;
@@ -1595,7 +1595,7 @@ int ttm_bo_synccpu_write_grab(struct ttm_buffer_object *bo, bool no_wait)
         * Using ttm_bo_reserve makes sure the lru lists are updated.
         */
 
-       ret = ttm_bo_reserve(bo, true, no_wait, false, 0);
+       ret = ttm_bo_reserve(bo, true, no_wait, false, NULL);
        if (unlikely(ret != 0))
                return ret;
        spin_lock(&bdev->fence_lock);
@@ -1630,7 +1630,7 @@ static int ttm_bo_swapout(struct ttm_mem_shrink *shrink)
 
        spin_lock(&glob->lru_lock);
        list_for_each_entry(bo, &glob->swap_lru, swap) {
-               ret = __ttm_bo_reserve(bo, false, true, false, 0);
+               ret = __ttm_bo_reserve(bo, false, true, false, NULL);
                if (!ret)
                        break;
        }
index bd850c9f4bca64975e38bb25e429dfa0f614882d..9e103a4875c820d07d8a99484a865e40f9ec3850 100644 (file)
@@ -50,6 +50,7 @@ struct ttm_range_manager {
 static int ttm_bo_man_get_node(struct ttm_mem_type_manager *man,
                               struct ttm_buffer_object *bo,
                               struct ttm_placement *placement,
+                              uint32_t flags,
                               struct ttm_mem_reg *mem)
 {
        struct ttm_range_manager *rman = (struct ttm_range_manager *) man->priv;
@@ -67,7 +68,7 @@ static int ttm_bo_man_get_node(struct ttm_mem_type_manager *man,
        if (!node)
                return -ENOMEM;
 
-       if (bo->mem.placement & TTM_PL_FLAG_TOPDOWN)
+       if (flags & TTM_PL_FLAG_TOPDOWN)
                aflags = DRM_MM_CREATE_TOP;
 
        spin_lock(&rman->lock);
index 1df856f7856821b31fe96e55dac5bc74bd74ed4b..30e5d90cb7bc6e17980d4da275d35416d131e012 100644 (file)
@@ -500,7 +500,7 @@ pgprot_t ttm_io_prot(uint32_t caching_flags, pgprot_t tmp)
                        pgprot_val(tmp) |= _PAGE_GUARDED;
        }
 #endif
-#if defined(__ia64__)
+#if defined(__ia64__) || defined(__arm__)
        if (caching_flags & TTM_PL_FLAG_WC)
                tmp = pgprot_writecombine(tmp);
        else
index d7f92fe9d9045a6018c94f948d756c2baa674c7c..66fc6395eb5496efc244394b29b43dbd236486d2 100644 (file)
@@ -35,7 +35,7 @@
 #include <drm/drm_sysfs.h>
 
 static DECLARE_WAIT_QUEUE_HEAD(exit_q);
-atomic_t device_released;
+static atomic_t device_released;
 
 static struct device_type ttm_drm_class_type = {
        .name = "ttm",
index 863bef9f923422e4670e3f11ff07384f568afc67..09874d695188067dca03540efd5b2f135a75b913 100644 (file)
@@ -297,8 +297,10 @@ static void ttm_pool_update_free_locked(struct ttm_page_pool *pool,
  *
  * @pool: to free the pages from
  * @free_all: If set to true will free all pages in pool
+ * @gfp: GFP flags.
  **/
-static int ttm_page_pool_free(struct ttm_page_pool *pool, unsigned nr_free)
+static int ttm_page_pool_free(struct ttm_page_pool *pool, unsigned nr_free,
+                             gfp_t gfp)
 {
        unsigned long irq_flags;
        struct page *p;
@@ -309,8 +311,7 @@ static int ttm_page_pool_free(struct ttm_page_pool *pool, unsigned nr_free)
        if (NUM_PAGES_TO_ALLOC < nr_free)
                npages_to_free = NUM_PAGES_TO_ALLOC;
 
-       pages_to_free = kmalloc(npages_to_free * sizeof(struct page *),
-                       GFP_KERNEL);
+       pages_to_free = kmalloc(npages_to_free * sizeof(struct page *), gfp);
        if (!pages_to_free) {
                pr_err("Failed to allocate memory for pool free operation\n");
                return 0;
@@ -382,32 +383,35 @@ out:
  *
  * XXX: (dchinner) Deadlock warning!
  *
- * ttm_page_pool_free() does memory allocation using GFP_KERNEL.  that means
- * this can deadlock when called a sc->gfp_mask that is not equal to
- * GFP_KERNEL.
+ * We need to pass sc->gfp_mask to ttm_page_pool_free().
  *
  * This code is crying out for a shrinker per pool....
  */
 static unsigned long
 ttm_pool_shrink_scan(struct shrinker *shrink, struct shrink_control *sc)
 {
-       static atomic_t start_pool = ATOMIC_INIT(0);
+       static DEFINE_MUTEX(lock);
+       static unsigned start_pool;
        unsigned i;
-       unsigned pool_offset = atomic_add_return(1, &start_pool);
+       unsigned pool_offset;
        struct ttm_page_pool *pool;
        int shrink_pages = sc->nr_to_scan;
        unsigned long freed = 0;
 
-       pool_offset = pool_offset % NUM_POOLS;
+       if (!mutex_trylock(&lock))
+               return SHRINK_STOP;
+       pool_offset = ++start_pool % NUM_POOLS;
        /* select start pool in round robin fashion */
        for (i = 0; i < NUM_POOLS; ++i) {
                unsigned nr_free = shrink_pages;
                if (shrink_pages == 0)
                        break;
                pool = &_manager->pools[(i + pool_offset)%NUM_POOLS];
-               shrink_pages = ttm_page_pool_free(pool, nr_free);
+               shrink_pages = ttm_page_pool_free(pool, nr_free,
+                                                 sc->gfp_mask);
                freed += nr_free - shrink_pages;
        }
+       mutex_unlock(&lock);
        return freed;
 }
 
@@ -706,7 +710,7 @@ static void ttm_put_pages(struct page **pages, unsigned npages, int flags,
        }
        spin_unlock_irqrestore(&pool->lock, irq_flags);
        if (npages)
-               ttm_page_pool_free(pool, npages);
+               ttm_page_pool_free(pool, npages, GFP_KERNEL);
 }
 
 /*
@@ -790,7 +794,7 @@ static int ttm_get_pages(struct page **pages, unsigned npages, int flags,
        return 0;
 }
 
-static void ttm_page_pool_init_locked(struct ttm_page_pool *pool, int flags,
+static void ttm_page_pool_init_locked(struct ttm_page_pool *pool, gfp_t flags,
                char *name)
 {
        spin_lock_init(&pool->lock);
@@ -846,7 +850,8 @@ void ttm_page_alloc_fini(void)
        ttm_pool_mm_shrink_fini(_manager);
 
        for (i = 0; i < NUM_POOLS; ++i)
-               ttm_page_pool_free(&_manager->pools[i], FREE_ALL_PAGES);
+               ttm_page_pool_free(&_manager->pools[i], FREE_ALL_PAGES,
+                                  GFP_KERNEL);
 
        kobject_put(&_manager->kobj);
        _manager = NULL;
index fb8259f698395a286e28fbe1053bc70e04821694..ca65df144765e530571040ff246eda61df1326fc 100644 (file)
@@ -411,8 +411,10 @@ static void ttm_dma_page_put(struct dma_pool *pool, struct dma_page *d_page)
  *
  * @pool: to free the pages from
  * @nr_free: If set to true will free all pages in pool
+ * @gfp: GFP flags.
  **/
-static unsigned ttm_dma_page_pool_free(struct dma_pool *pool, unsigned nr_free)
+static unsigned ttm_dma_page_pool_free(struct dma_pool *pool, unsigned nr_free,
+                                      gfp_t gfp)
 {
        unsigned long irq_flags;
        struct dma_page *dma_p, *tmp;
@@ -430,8 +432,7 @@ static unsigned ttm_dma_page_pool_free(struct dma_pool *pool, unsigned nr_free)
                         npages_to_free, nr_free);
        }
 #endif
-       pages_to_free = kmalloc(npages_to_free * sizeof(struct page *),
-                       GFP_KERNEL);
+       pages_to_free = kmalloc(npages_to_free * sizeof(struct page *), gfp);
 
        if (!pages_to_free) {
                pr_err("%s: Failed to allocate memory for pool free operation\n",
@@ -530,7 +531,7 @@ static void ttm_dma_free_pool(struct device *dev, enum pool_type type)
                if (pool->type != type)
                        continue;
                /* Takes a spinlock.. */
-               ttm_dma_page_pool_free(pool, FREE_ALL_PAGES);
+               ttm_dma_page_pool_free(pool, FREE_ALL_PAGES, GFP_KERNEL);
                WARN_ON(((pool->npages_in_use + pool->npages_free) != 0));
                /* This code path is called after _all_ references to the
                 * struct device has been dropped - so nobody should be
@@ -983,7 +984,7 @@ void ttm_dma_unpopulate(struct ttm_dma_tt *ttm_dma, struct device *dev)
 
        /* shrink pool if necessary (only on !is_cached pools)*/
        if (npages)
-               ttm_dma_page_pool_free(pool, npages);
+               ttm_dma_page_pool_free(pool, npages, GFP_KERNEL);
        ttm->state = tt_unpopulated;
 }
 EXPORT_SYMBOL_GPL(ttm_dma_unpopulate);
@@ -993,10 +994,7 @@ EXPORT_SYMBOL_GPL(ttm_dma_unpopulate);
  *
  * XXX: (dchinner) Deadlock warning!
  *
- * ttm_dma_page_pool_free() does GFP_KERNEL memory allocation, and so attention
- * needs to be paid to sc->gfp_mask to determine if this can be done or not.
- * GFP_KERNEL memory allocation in a GFP_ATOMIC reclaim context woul dbe really
- * bad.
+ * We need to pass sc->gfp_mask to ttm_dma_page_pool_free().
  *
  * I'm getting sadder as I hear more pathetical whimpers about needing per-pool
  * shrinkers
@@ -1004,9 +1002,9 @@ EXPORT_SYMBOL_GPL(ttm_dma_unpopulate);
 static unsigned long
 ttm_dma_pool_shrink_scan(struct shrinker *shrink, struct shrink_control *sc)
 {
-       static atomic_t start_pool = ATOMIC_INIT(0);
+       static unsigned start_pool;
        unsigned idx = 0;
-       unsigned pool_offset = atomic_add_return(1, &start_pool);
+       unsigned pool_offset;
        unsigned shrink_pages = sc->nr_to_scan;
        struct device_pools *p;
        unsigned long freed = 0;
@@ -1014,8 +1012,11 @@ ttm_dma_pool_shrink_scan(struct shrinker *shrink, struct shrink_control *sc)
        if (list_empty(&_manager->pools))
                return SHRINK_STOP;
 
-       mutex_lock(&_manager->lock);
-       pool_offset = pool_offset % _manager->npools;
+       if (!mutex_trylock(&_manager->lock))
+               return SHRINK_STOP;
+       if (!_manager->npools)
+               goto out;
+       pool_offset = ++start_pool % _manager->npools;
        list_for_each_entry(p, &_manager->pools, pools) {
                unsigned nr_free;
 
@@ -1027,13 +1028,15 @@ ttm_dma_pool_shrink_scan(struct shrinker *shrink, struct shrink_control *sc)
                if (++idx < pool_offset)
                        continue;
                nr_free = shrink_pages;
-               shrink_pages = ttm_dma_page_pool_free(p->pool, nr_free);
+               shrink_pages = ttm_dma_page_pool_free(p->pool, nr_free,
+                                                     sc->gfp_mask);
                freed += nr_free - shrink_pages;
 
                pr_debug("%s: (%s:%d) Asked to shrink %d, have %d more to go\n",
                         p->pool->dev_name, p->pool->name, current->pid,
                         nr_free, shrink_pages);
        }
+out:
        mutex_unlock(&_manager->lock);
        return freed;
 }
@@ -1044,7 +1047,8 @@ ttm_dma_pool_shrink_count(struct shrinker *shrink, struct shrink_control *sc)
        struct device_pools *p;
        unsigned long count = 0;
 
-       mutex_lock(&_manager->lock);
+       if (!mutex_trylock(&_manager->lock))
+               return 0;
        list_for_each_entry(p, &_manager->pools, pools)
                count += p->pool->npages_free;
        mutex_unlock(&_manager->lock);
index b44d548c56f8e43a3e14878622c8f8ed3507bf35..e026a9e2942a249c1e6914ae6ba12a8f9c4be37c 100644 (file)
@@ -105,14 +105,7 @@ static struct drm_encoder*
 udl_best_single_encoder(struct drm_connector *connector)
 {
        int enc_id = connector->encoder_ids[0];
-       struct drm_mode_object *obj;
-       struct drm_encoder *encoder;
-
-       obj = drm_mode_object_find(connector->dev, enc_id, DRM_MODE_OBJECT_ENCODER);
-       if (!obj)
-               return NULL;
-       encoder = obj_to_encoder(obj);
-       return encoder;
+       return drm_encoder_find(connector->dev, enc_id);
 }
 
 static int udl_connector_set_property(struct drm_connector *connector,
@@ -124,7 +117,7 @@ static int udl_connector_set_property(struct drm_connector *connector,
 
 static void udl_connector_destroy(struct drm_connector *connector)
 {
-       drm_sysfs_connector_remove(connector);
+       drm_connector_unregister(connector);
        drm_connector_cleanup(connector);
        kfree(connector);
 }
@@ -154,7 +147,7 @@ int udl_connector_init(struct drm_device *dev, struct drm_encoder *encoder)
        drm_connector_init(dev, connector, &udl_connector_funcs, DRM_MODE_CONNECTOR_DVII);
        drm_connector_helper_add(connector, &udl_connector_helper_funcs);
 
-       drm_sysfs_connector_add(connector);
+       drm_connector_register(connector);
        drm_mode_connector_attach_encoder(connector, encoder);
 
        drm_object_attach_property(&connector->base,
index 377176372da893e79b7c108b15cb73f18d8adb9a..d1da339843cafb263b21030bc546b5f3d285b394 100644 (file)
@@ -550,7 +550,7 @@ out:
        return ret;
 }
 
-static struct drm_fb_helper_funcs udl_fb_helper_funcs = {
+static const struct drm_fb_helper_funcs udl_fb_helper_funcs = {
        .fb_probe = udlfb_create,
 };
 
@@ -583,7 +583,8 @@ int udl_fbdev_init(struct drm_device *dev)
                return -ENOMEM;
 
        udl->fbdev = ufbdev;
-       ufbdev->helper.funcs = &udl_fb_helper_funcs;
+
+       drm_fb_helper_prepare(dev, &ufbdev->helper, &udl_fb_helper_funcs);
 
        ret = drm_fb_helper_init(dev, &ufbdev->helper,
                                 1, 1);
index c041cd73f3999a49234cfea09319822757f358ad..8044f5fb7c49a1f5709c6e1d62be72a798d465b8 100644 (file)
@@ -107,14 +107,14 @@ int udl_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
        }
 }
 
-static int udl_gem_get_pages(struct udl_gem_object *obj, gfp_t gfpmask)
+static int udl_gem_get_pages(struct udl_gem_object *obj)
 {
        struct page **pages;
 
        if (obj->pages)
                return 0;
 
-       pages = drm_gem_get_pages(&obj->base, gfpmask);
+       pages = drm_gem_get_pages(&obj->base);
        if (IS_ERR(pages))
                return PTR_ERR(pages);
 
@@ -147,7 +147,7 @@ int udl_gem_vmap(struct udl_gem_object *obj)
                return 0;
        }
                
-       ret = udl_gem_get_pages(obj, GFP_KERNEL);
+       ret = udl_gem_get_pages(obj);
        if (ret)
                return ret;
 
@@ -205,7 +205,7 @@ int udl_gem_mmap(struct drm_file *file, struct drm_device *dev,
        }
        gobj = to_udl_bo(obj);
 
-       ret = udl_gem_get_pages(gobj, GFP_KERNEL);
+       ret = udl_gem_get_pages(gobj);
        if (ret)
                goto out;
        ret = drm_gem_create_mmap_offset(obj);
index 7094b92d1ec78467b1600d6ec2e3fd8f080d1344..42795674bc0783d12807e76d751c27acb3b200fb 100644 (file)
@@ -306,10 +306,23 @@ int udl_driver_load(struct drm_device *dev, unsigned long flags)
 
        DRM_DEBUG("\n");
        ret = udl_modeset_init(dev);
+       if (ret)
+               goto err;
 
        ret = udl_fbdev_init(dev);
+       if (ret)
+               goto err;
+
+       ret = drm_vblank_init(dev, 1);
+       if (ret)
+               goto err_fb;
+
        return 0;
+err_fb:
+       udl_fbdev_cleanup(dev);
 err:
+       if (udl->urbs.count)
+               udl_free_urb_list(dev);
        kfree(udl);
        DRM_ERROR("%d\n", ret);
        return ret;
@@ -325,6 +338,8 @@ int udl_driver_unload(struct drm_device *dev)
 {
        struct udl_device *udl = dev->dev_private;
 
+       drm_vblank_cleanup(dev);
+
        if (udl->urbs.count)
                udl_free_urb_list(dev);
 
index cddc4fcf35cf4056e17c235b825ff87bd2e546eb..dc145d320b25abe3dab04ef9e60f75d4eddaa9ae 100644 (file)
@@ -363,6 +363,26 @@ static void udl_crtc_destroy(struct drm_crtc *crtc)
        kfree(crtc);
 }
 
+static int udl_crtc_page_flip(struct drm_crtc *crtc,
+                             struct drm_framebuffer *fb,
+                             struct drm_pending_vblank_event *event,
+                             uint32_t page_flip_flags)
+{
+       struct udl_framebuffer *ufb = to_udl_fb(fb);
+       struct drm_device *dev = crtc->dev;
+       unsigned long flags;
+
+       udl_handle_damage(ufb, 0, 0, fb->width, fb->height);
+
+       spin_lock_irqsave(&dev->event_lock, flags);
+       if (event)
+               drm_send_vblank_event(dev, 0, event);
+       spin_unlock_irqrestore(&dev->event_lock, flags);
+       crtc->primary->fb = fb;
+
+       return 0;
+}
+
 static void udl_crtc_prepare(struct drm_crtc *crtc)
 {
 }
@@ -384,6 +404,7 @@ static struct drm_crtc_helper_funcs udl_helper_funcs = {
 static const struct drm_crtc_funcs udl_crtc_funcs = {
        .set_config = drm_crtc_helper_set_config,
        .destroy = udl_crtc_destroy,
+       .page_flip = udl_crtc_page_flip,
 };
 
 static int udl_crtc_init(struct drm_device *dev)
index 458cdf6d81e8b91781af5d1c18d663c133c5f455..ce0ab951f50782606ca63359fb63f09c3aaa0923 100644 (file)
@@ -6,6 +6,7 @@ vmwgfx-y := vmwgfx_execbuf.o vmwgfx_gmr.o vmwgfx_kms.o vmwgfx_drv.o \
            vmwgfx_fifo.o vmwgfx_irq.o vmwgfx_ldu.o vmwgfx_ttm_glue.o \
            vmwgfx_overlay.o vmwgfx_marker.o vmwgfx_gmrid_manager.o \
            vmwgfx_fence.o vmwgfx_dmabuf.o vmwgfx_scrn.o vmwgfx_context.o \
-           vmwgfx_surface.o vmwgfx_prime.o vmwgfx_mob.o vmwgfx_shader.o
+           vmwgfx_surface.o vmwgfx_prime.o vmwgfx_mob.o vmwgfx_shader.o \
+           vmwgfx_cmdbuf_res.o \
 
 obj-$(CONFIG_DRM_VMWGFX) := vmwgfx.o
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf_res.c b/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf_res.c
new file mode 100644 (file)
index 0000000..bfeb4b1
--- /dev/null
@@ -0,0 +1,341 @@
+/**************************************************************************
+ *
+ * Copyright © 2014 VMware, Inc., Palo Alto, CA., USA
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ **************************************************************************/
+
+#include "vmwgfx_drv.h"
+
+#define VMW_CMDBUF_RES_MAN_HT_ORDER 12
+
+enum vmw_cmdbuf_res_state {
+       VMW_CMDBUF_RES_COMMITED,
+       VMW_CMDBUF_RES_ADD,
+       VMW_CMDBUF_RES_DEL
+};
+
+/**
+ * struct vmw_cmdbuf_res - Command buffer managed resource entry.
+ *
+ * @res: Refcounted pointer to a struct vmw_resource.
+ * @hash: Hash entry for the manager hash table.
+ * @head: List head used either by the staging list or the manager list
+ * of commited resources.
+ * @state: Staging state of this resource entry.
+ * @man: Pointer to a resource manager for this entry.
+ */
+struct vmw_cmdbuf_res {
+       struct vmw_resource *res;
+       struct drm_hash_item hash;
+       struct list_head head;
+       enum vmw_cmdbuf_res_state state;
+       struct vmw_cmdbuf_res_manager *man;
+};
+
+/**
+ * struct vmw_cmdbuf_res_manager - Command buffer resource manager.
+ *
+ * @resources: Hash table containing staged and commited command buffer
+ * resources
+ * @list: List of commited command buffer resources.
+ * @dev_priv: Pointer to a device private structure.
+ *
+ * @resources and @list are protected by the cmdbuf mutex for now.
+ */
+struct vmw_cmdbuf_res_manager {
+       struct drm_open_hash resources;
+       struct list_head list;
+       struct vmw_private *dev_priv;
+};
+
+
+/**
+ * vmw_cmdbuf_res_lookup - Look up a command buffer resource
+ *
+ * @man: Pointer to the command buffer resource manager
+ * @resource_type: The resource type, that combined with the user key
+ * identifies the resource.
+ * @user_key: The user key.
+ *
+ * Returns a valid refcounted struct vmw_resource pointer on success,
+ * an error pointer on failure.
+ */
+struct vmw_resource *
+vmw_cmdbuf_res_lookup(struct vmw_cmdbuf_res_manager *man,
+                     enum vmw_cmdbuf_res_type res_type,
+                     u32 user_key)
+{
+       struct drm_hash_item *hash;
+       int ret;
+       unsigned long key = user_key | (res_type << 24);
+
+       ret = drm_ht_find_item(&man->resources, key, &hash);
+       if (unlikely(ret != 0))
+               return ERR_PTR(ret);
+
+       return vmw_resource_reference
+               (drm_hash_entry(hash, struct vmw_cmdbuf_res, hash)->res);
+}
+
+/**
+ * vmw_cmdbuf_res_free - Free a command buffer resource.
+ *
+ * @man: Pointer to the command buffer resource manager
+ * @entry: Pointer to a struct vmw_cmdbuf_res.
+ *
+ * Frees a struct vmw_cmdbuf_res entry and drops its reference to the
+ * struct vmw_resource.
+ */
+static void vmw_cmdbuf_res_free(struct vmw_cmdbuf_res_manager *man,
+                               struct vmw_cmdbuf_res *entry)
+{
+       list_del(&entry->head);
+       WARN_ON(drm_ht_remove_item(&man->resources, &entry->hash));
+       vmw_resource_unreference(&entry->res);
+       kfree(entry);
+}
+
+/**
+ * vmw_cmdbuf_res_commit - Commit a list of command buffer resource actions
+ *
+ * @list: Caller's list of command buffer resource actions.
+ *
+ * This function commits a list of command buffer resource
+ * additions or removals.
+ * It is typically called when the execbuf ioctl call triggering these
+ * actions has commited the fifo contents to the device.
+ */
+void vmw_cmdbuf_res_commit(struct list_head *list)
+{
+       struct vmw_cmdbuf_res *entry, *next;
+
+       list_for_each_entry_safe(entry, next, list, head) {
+               list_del(&entry->head);
+               switch (entry->state) {
+               case VMW_CMDBUF_RES_ADD:
+                       entry->state = VMW_CMDBUF_RES_COMMITED;
+                       list_add_tail(&entry->head, &entry->man->list);
+                       break;
+               case VMW_CMDBUF_RES_DEL:
+                       vmw_resource_unreference(&entry->res);
+                       kfree(entry);
+                       break;
+               default:
+                       BUG();
+                       break;
+               }
+       }
+}
+
+/**
+ * vmw_cmdbuf_res_revert - Revert a list of command buffer resource actions
+ *
+ * @man: Pointer to the command buffer resource manager
+ * @list: Caller's list of command buffer resource action
+ *
+ * This function reverts a list of command buffer resource
+ * additions or removals.
+ * It is typically called when the execbuf ioctl call triggering these
+ * actions failed for some reason, and the command stream was never
+ * submitted.
+ */
+void vmw_cmdbuf_res_revert(struct list_head *list)
+{
+       struct vmw_cmdbuf_res *entry, *next;
+       int ret;
+
+       list_for_each_entry_safe(entry, next, list, head) {
+               switch (entry->state) {
+               case VMW_CMDBUF_RES_ADD:
+                       vmw_cmdbuf_res_free(entry->man, entry);
+                       break;
+               case VMW_CMDBUF_RES_DEL:
+                       ret = drm_ht_insert_item(&entry->man->resources,
+                                                &entry->hash);
+                       list_del(&entry->head);
+                       list_add_tail(&entry->head, &entry->man->list);
+                       entry->state = VMW_CMDBUF_RES_COMMITED;
+                       break;
+               default:
+                       BUG();
+                       break;
+               }
+       }
+}
+
+/**
+ * vmw_cmdbuf_res_add - Stage a command buffer managed resource for addition.
+ *
+ * @man: Pointer to the command buffer resource manager.
+ * @res_type: The resource type.
+ * @user_key: The user-space id of the resource.
+ * @res: Valid (refcount != 0) pointer to a struct vmw_resource.
+ * @list: The staging list.
+ *
+ * This function allocates a struct vmw_cmdbuf_res entry and adds the
+ * resource to the hash table of the manager identified by @man. The
+ * entry is then put on the staging list identified by @list.
+ */
+int vmw_cmdbuf_res_add(struct vmw_cmdbuf_res_manager *man,
+                      enum vmw_cmdbuf_res_type res_type,
+                      u32 user_key,
+                      struct vmw_resource *res,
+                      struct list_head *list)
+{
+       struct vmw_cmdbuf_res *cres;
+       int ret;
+
+       cres = kzalloc(sizeof(*cres), GFP_KERNEL);
+       if (unlikely(cres == NULL))
+               return -ENOMEM;
+
+       cres->hash.key = user_key | (res_type << 24);
+       ret = drm_ht_insert_item(&man->resources, &cres->hash);
+       if (unlikely(ret != 0))
+               goto out_invalid_key;
+
+       cres->state = VMW_CMDBUF_RES_ADD;
+       cres->res = vmw_resource_reference(res);
+       cres->man = man;
+       list_add_tail(&cres->head, list);
+
+out_invalid_key:
+       return ret;
+}
+
+/**
+ * vmw_cmdbuf_res_remove - Stage a command buffer managed resource for removal.
+ *
+ * @man: Pointer to the command buffer resource manager.
+ * @res_type: The resource type.
+ * @user_key: The user-space id of the resource.
+ * @list: The staging list.
+ *
+ * This function looks up the struct vmw_cmdbuf_res entry from the manager
+ * hash table and, if it exists, removes it. Depending on its current staging
+ * state it then either removes the entry from the staging list or adds it
+ * to it with a staging state of removal.
+ */
+int vmw_cmdbuf_res_remove(struct vmw_cmdbuf_res_manager *man,
+                         enum vmw_cmdbuf_res_type res_type,
+                         u32 user_key,
+                         struct list_head *list)
+{
+       struct vmw_cmdbuf_res *entry;
+       struct drm_hash_item *hash;
+       int ret;
+
+       ret = drm_ht_find_item(&man->resources, user_key, &hash);
+       if (likely(ret != 0))
+               return -EINVAL;
+
+       entry = drm_hash_entry(hash, struct vmw_cmdbuf_res, hash);
+
+       switch (entry->state) {
+       case VMW_CMDBUF_RES_ADD:
+               vmw_cmdbuf_res_free(man, entry);
+               break;
+       case VMW_CMDBUF_RES_COMMITED:
+               (void) drm_ht_remove_item(&man->resources, &entry->hash);
+               list_del(&entry->head);
+               entry->state = VMW_CMDBUF_RES_DEL;
+               list_add_tail(&entry->head, list);
+               break;
+       default:
+               BUG();
+               break;
+       }
+
+       return 0;
+}
+
+/**
+ * vmw_cmdbuf_res_man_create - Allocate a command buffer managed resource
+ * manager.
+ *
+ * @dev_priv: Pointer to a struct vmw_private
+ *
+ * Allocates and initializes a command buffer managed resource manager. Returns
+ * an error pointer on failure.
+ */
+struct vmw_cmdbuf_res_manager *
+vmw_cmdbuf_res_man_create(struct vmw_private *dev_priv)
+{
+       struct vmw_cmdbuf_res_manager *man;
+       int ret;
+
+       man = kzalloc(sizeof(*man), GFP_KERNEL);
+       if (man == NULL)
+               return ERR_PTR(-ENOMEM);
+
+       man->dev_priv = dev_priv;
+       INIT_LIST_HEAD(&man->list);
+       ret = drm_ht_create(&man->resources, VMW_CMDBUF_RES_MAN_HT_ORDER);
+       if (ret == 0)
+               return man;
+
+       kfree(man);
+       return ERR_PTR(ret);
+}
+
+/**
+ * vmw_cmdbuf_res_man_destroy - Destroy a command buffer managed resource
+ * manager.
+ *
+ * @man: Pointer to the  manager to destroy.
+ *
+ * This function destroys a command buffer managed resource manager and
+ * unreferences / frees all command buffer managed resources and -entries
+ * associated with it.
+ */
+void vmw_cmdbuf_res_man_destroy(struct vmw_cmdbuf_res_manager *man)
+{
+       struct vmw_cmdbuf_res *entry, *next;
+
+       list_for_each_entry_safe(entry, next, &man->list, head)
+               vmw_cmdbuf_res_free(man, entry);
+
+       kfree(man);
+}
+
+/**
+ *
+ * vmw_cmdbuf_res_man_size - Return the size of a command buffer managed
+ * resource manager
+ *
+ * Returns the approximate allocation size of a command buffer managed
+ * resource manager.
+ */
+size_t vmw_cmdbuf_res_man_size(void)
+{
+       static size_t res_man_size;
+
+       if (unlikely(res_man_size == 0))
+               res_man_size =
+                       ttm_round_pot(sizeof(struct vmw_cmdbuf_res_manager)) +
+                       ttm_round_pot(sizeof(struct hlist_head) <<
+                                     VMW_CMDBUF_RES_MAN_HT_ORDER);
+
+       return res_man_size;
+}
index 8bb26dcd9eaeda79742bdf5aa325d3befacb417c..5ac92874404d60a6497c423f6e200bc35b922bf9 100644 (file)
@@ -33,6 +33,7 @@ struct vmw_user_context {
        struct ttm_base_object base;
        struct vmw_resource res;
        struct vmw_ctx_binding_state cbs;
+       struct vmw_cmdbuf_res_manager *man;
 };
 
 
@@ -103,7 +104,8 @@ static const vmw_scrub_func vmw_scrub_funcs[vmw_ctx_binding_max] = {
 
 static void vmw_hw_context_destroy(struct vmw_resource *res)
 {
-
+       struct vmw_user_context *uctx =
+               container_of(res, struct vmw_user_context, res);
        struct vmw_private *dev_priv = res->dev_priv;
        struct {
                SVGA3dCmdHeader header;
@@ -113,9 +115,9 @@ static void vmw_hw_context_destroy(struct vmw_resource *res)
 
        if (res->func->destroy == vmw_gb_context_destroy) {
                mutex_lock(&dev_priv->cmdbuf_mutex);
+               vmw_cmdbuf_res_man_destroy(uctx->man);
                mutex_lock(&dev_priv->binding_mutex);
-               (void) vmw_context_binding_state_kill
-                       (&container_of(res, struct vmw_user_context, res)->cbs);
+               (void) vmw_context_binding_state_kill(&uctx->cbs);
                (void) vmw_gb_context_destroy(res);
                mutex_unlock(&dev_priv->binding_mutex);
                if (dev_priv->pinned_bo != NULL &&
@@ -152,13 +154,16 @@ static int vmw_gb_context_init(struct vmw_private *dev_priv,
        ret = vmw_resource_init(dev_priv, res, true,
                                res_free, &vmw_gb_context_func);
        res->backup_size = SVGA3D_CONTEXT_DATA_SIZE;
+       if (unlikely(ret != 0))
+               goto out_err;
 
-       if (unlikely(ret != 0)) {
-               if (res_free)
-                       res_free(res);
-               else
-                       kfree(res);
-               return ret;
+       if (dev_priv->has_mob) {
+               uctx->man = vmw_cmdbuf_res_man_create(dev_priv);
+               if (unlikely(IS_ERR(uctx->man))) {
+                       ret = PTR_ERR(uctx->man);
+                       uctx->man = NULL;
+                       goto out_err;
+               }
        }
 
        memset(&uctx->cbs, 0, sizeof(uctx->cbs));
@@ -166,6 +171,13 @@ static int vmw_gb_context_init(struct vmw_private *dev_priv,
 
        vmw_resource_activate(res, vmw_hw_context_destroy);
        return 0;
+
+out_err:
+       if (res_free)
+               res_free(res);
+       else
+               kfree(res);
+       return ret;
 }
 
 static int vmw_context_init(struct vmw_private *dev_priv,
@@ -471,7 +483,8 @@ int vmw_context_define_ioctl(struct drm_device *dev, void *data,
         */
 
        if (unlikely(vmw_user_context_size == 0))
-               vmw_user_context_size = ttm_round_pot(sizeof(*ctx)) + 128;
+               vmw_user_context_size = ttm_round_pot(sizeof(*ctx)) + 128 +
+                 ((dev_priv->has_mob) ? vmw_cmdbuf_res_man_size() : 0);
 
        ret = ttm_read_lock(&dev_priv->reservation_sem, true);
        if (unlikely(ret != 0))
@@ -901,3 +914,8 @@ struct list_head *vmw_context_binding_list(struct vmw_resource *ctx)
 {
        return &(container_of(ctx, struct vmw_user_context, res)->cbs.list);
 }
+
+struct vmw_cmdbuf_res_manager *vmw_context_res_man(struct vmw_resource *ctx)
+{
+       return container_of(ctx, struct vmw_user_context, res)->man;
+}
index 70ddce8358b0be2ff564b27599eb4cd537153483..ed1d51006ab1e3054dc8cab075db1b776d204cc7 100644 (file)
@@ -61,7 +61,7 @@ int vmw_dmabuf_to_placement(struct vmw_private *dev_priv,
 
        vmw_execbuf_release_pinned_bo(dev_priv);
 
-       ret = ttm_bo_reserve(bo, interruptible, false, false, 0);
+       ret = ttm_bo_reserve(bo, interruptible, false, false, NULL);
        if (unlikely(ret != 0))
                goto err;
 
@@ -105,7 +105,7 @@ int vmw_dmabuf_to_vram_or_gmr(struct vmw_private *dev_priv,
        if (pin)
                vmw_execbuf_release_pinned_bo(dev_priv);
 
-       ret = ttm_bo_reserve(bo, interruptible, false, false, 0);
+       ret = ttm_bo_reserve(bo, interruptible, false, false, NULL);
        if (unlikely(ret != 0))
                goto err;
 
@@ -212,7 +212,7 @@ int vmw_dmabuf_to_start_of_vram(struct vmw_private *dev_priv,
 
        if (pin)
                vmw_execbuf_release_pinned_bo(dev_priv);
-       ret = ttm_bo_reserve(bo, interruptible, false, false, 0);
+       ret = ttm_bo_reserve(bo, interruptible, false, false, NULL);
        if (unlikely(ret != 0))
                goto err_unlock;
 
index 246a62bab378d1838e5dd60cb39fa796ff0d7497..18b54acacfbb813335c00964117613a232840c94 100644 (file)
@@ -316,7 +316,7 @@ static int vmw_dummy_query_bo_create(struct vmw_private *dev_priv)
        if (unlikely(ret != 0))
                return ret;
 
-       ret = ttm_bo_reserve(bo, false, true, false, 0);
+       ret = ttm_bo_reserve(bo, false, true, false, NULL);
        BUG_ON(ret != 0);
 
        ret = ttm_bo_kmap(bo, 0, 1, &map);
@@ -946,7 +946,6 @@ static void vmw_postclose(struct drm_device *dev,
                drm_master_put(&vmw_fp->locked_master);
        }
 
-       vmw_compat_shader_man_destroy(vmw_fp->shman);
        ttm_object_file_release(&vmw_fp->tfile);
        kfree(vmw_fp);
 }
@@ -966,16 +965,10 @@ static int vmw_driver_open(struct drm_device *dev, struct drm_file *file_priv)
        if (unlikely(vmw_fp->tfile == NULL))
                goto out_no_tfile;
 
-       vmw_fp->shman = vmw_compat_shader_man_create(dev_priv);
-       if (IS_ERR(vmw_fp->shman))
-               goto out_no_shman;
-
        file_priv->driver_priv = vmw_fp;
 
        return 0;
 
-out_no_shman:
-       ttm_object_file_release(&vmw_fp->tfile);
 out_no_tfile:
        kfree(vmw_fp);
        return ret;
index c886c024c637e88053a9ccd32c660ba0984fb075..99f731757c4bf6748ec4584103a2d5527f4618eb 100644 (file)
 #include <drm/ttm/ttm_module.h>
 #include "vmwgfx_fence.h"
 
-#define VMWGFX_DRIVER_DATE "20140325"
+#define VMWGFX_DRIVER_DATE "20140704"
 #define VMWGFX_DRIVER_MAJOR 2
 #define VMWGFX_DRIVER_MINOR 6
-#define VMWGFX_DRIVER_PATCHLEVEL 0
+#define VMWGFX_DRIVER_PATCHLEVEL 1
 #define VMWGFX_FILE_PAGE_OFFSET 0x00100000
 #define VMWGFX_FIFO_STATIC_SIZE (1024*1024)
 #define VMWGFX_MAX_RELOCATIONS 2048
 #define VMW_RES_FENCE ttm_driver_type3
 #define VMW_RES_SHADER ttm_driver_type4
 
-struct vmw_compat_shader_manager;
-
 struct vmw_fpriv {
        struct drm_master *locked_master;
        struct ttm_object_file *tfile;
        struct list_head fence_events;
        bool gb_aware;
-       struct vmw_compat_shader_manager *shman;
 };
 
 struct vmw_dma_buffer {
@@ -124,6 +121,10 @@ struct vmw_resource {
        void (*hw_destroy) (struct vmw_resource *res);
 };
 
+
+/*
+ * Resources that are managed using ioctls.
+ */
 enum vmw_res_type {
        vmw_res_context,
        vmw_res_surface,
@@ -132,6 +133,15 @@ enum vmw_res_type {
        vmw_res_max
 };
 
+/*
+ * Resources that are managed using command streams.
+ */
+enum vmw_cmdbuf_res_type {
+       vmw_cmdbuf_res_compat_shader
+};
+
+struct vmw_cmdbuf_res_manager;
+
 struct vmw_cursor_snooper {
        struct drm_crtc *crtc;
        size_t age;
@@ -341,7 +351,7 @@ struct vmw_sw_context{
        bool needs_post_query_barrier;
        struct vmw_resource *error_resource;
        struct vmw_ctx_binding_state staged_bindings;
-       struct list_head staged_shaders;
+       struct list_head staged_cmd_res;
 };
 
 struct vmw_legacy_display;
@@ -974,7 +984,8 @@ extern void vmw_context_binding_res_list_kill(struct list_head *head);
 extern void vmw_context_binding_res_list_scrub(struct list_head *head);
 extern int vmw_context_rebind_all(struct vmw_resource *ctx);
 extern struct list_head *vmw_context_binding_list(struct vmw_resource *ctx);
-
+extern struct vmw_cmdbuf_res_manager *
+vmw_context_res_man(struct vmw_resource *ctx);
 /*
  * Surface management - vmwgfx_surface.c
  */
@@ -1008,27 +1019,42 @@ extern int vmw_shader_define_ioctl(struct drm_device *dev, void *data,
                                   struct drm_file *file_priv);
 extern int vmw_shader_destroy_ioctl(struct drm_device *dev, void *data,
                                    struct drm_file *file_priv);
-extern int vmw_compat_shader_lookup(struct vmw_compat_shader_manager *man,
-                                   SVGA3dShaderType shader_type,
-                                   u32 *user_key);
-extern void vmw_compat_shaders_commit(struct vmw_compat_shader_manager *man,
-                                     struct list_head *list);
-extern void vmw_compat_shaders_revert(struct vmw_compat_shader_manager *man,
-                                     struct list_head *list);
-extern int vmw_compat_shader_remove(struct vmw_compat_shader_manager *man,
-                                   u32 user_key,
-                                   SVGA3dShaderType shader_type,
-                                   struct list_head *list);
-extern int vmw_compat_shader_add(struct vmw_compat_shader_manager *man,
+extern int vmw_compat_shader_add(struct vmw_private *dev_priv,
+                                struct vmw_cmdbuf_res_manager *man,
                                 u32 user_key, const void *bytecode,
                                 SVGA3dShaderType shader_type,
                                 size_t size,
-                                struct ttm_object_file *tfile,
                                 struct list_head *list);
-extern struct vmw_compat_shader_manager *
-vmw_compat_shader_man_create(struct vmw_private *dev_priv);
-extern void
-vmw_compat_shader_man_destroy(struct vmw_compat_shader_manager *man);
+extern int vmw_compat_shader_remove(struct vmw_cmdbuf_res_manager *man,
+                                   u32 user_key, SVGA3dShaderType shader_type,
+                                   struct list_head *list);
+extern struct vmw_resource *
+vmw_compat_shader_lookup(struct vmw_cmdbuf_res_manager *man,
+                        u32 user_key, SVGA3dShaderType shader_type);
+
+/*
+ * Command buffer managed resources - vmwgfx_cmdbuf_res.c
+ */
+
+extern struct vmw_cmdbuf_res_manager *
+vmw_cmdbuf_res_man_create(struct vmw_private *dev_priv);
+extern void vmw_cmdbuf_res_man_destroy(struct vmw_cmdbuf_res_manager *man);
+extern size_t vmw_cmdbuf_res_man_size(void);
+extern struct vmw_resource *
+vmw_cmdbuf_res_lookup(struct vmw_cmdbuf_res_manager *man,
+                     enum vmw_cmdbuf_res_type res_type,
+                     u32 user_key);
+extern void vmw_cmdbuf_res_revert(struct list_head *list);
+extern void vmw_cmdbuf_res_commit(struct list_head *list);
+extern int vmw_cmdbuf_res_add(struct vmw_cmdbuf_res_manager *man,
+                             enum vmw_cmdbuf_res_type res_type,
+                             u32 user_key,
+                             struct vmw_resource *res,
+                             struct list_head *list);
+extern int vmw_cmdbuf_res_remove(struct vmw_cmdbuf_res_manager *man,
+                                enum vmw_cmdbuf_res_type res_type,
+                                u32 user_key,
+                                struct list_head *list);
 
 
 /**
index 87df0b3674fda203c96baef3ff3030a87424a800..7bfdaa163a33a19fb7ca8d775e654277aea497ea 100644 (file)
@@ -422,28 +422,91 @@ static int vmw_resources_validate(struct vmw_sw_context *sw_context)
        return 0;
 }
 
+
+/**
+ * vmw_cmd_res_reloc_add - Add a resource to a software context's
+ * relocation- and validation lists.
+ *
+ * @dev_priv: Pointer to a struct vmw_private identifying the device.
+ * @sw_context: Pointer to the software context.
+ * @res_type: Resource type.
+ * @id_loc: Pointer to where the id that needs translation is located.
+ * @res: Valid pointer to a struct vmw_resource.
+ * @p_val: If non null, a pointer to the struct vmw_resource_validate_node
+ * used for this resource is returned here.
+ */
+static int vmw_cmd_res_reloc_add(struct vmw_private *dev_priv,
+                                struct vmw_sw_context *sw_context,
+                                enum vmw_res_type res_type,
+                                uint32_t *id_loc,
+                                struct vmw_resource *res,
+                                struct vmw_resource_val_node **p_val)
+{
+       int ret;
+       struct vmw_resource_val_node *node;
+
+       *p_val = NULL;
+       ret = vmw_resource_relocation_add(&sw_context->res_relocations,
+                                         res,
+                                         id_loc - sw_context->buf_start);
+       if (unlikely(ret != 0))
+               goto out_err;
+
+       ret = vmw_resource_val_add(sw_context, res, &node);
+       if (unlikely(ret != 0))
+               goto out_err;
+
+       if (res_type == vmw_res_context && dev_priv->has_mob &&
+           node->first_usage) {
+
+               /*
+                * Put contexts first on the list to be able to exit
+                * list traversal for contexts early.
+                */
+               list_del(&node->head);
+               list_add(&node->head, &sw_context->resource_list);
+
+               ret = vmw_resource_context_res_add(dev_priv, sw_context, res);
+               if (unlikely(ret != 0))
+                       goto out_err;
+               node->staged_bindings =
+                       kzalloc(sizeof(*node->staged_bindings), GFP_KERNEL);
+               if (node->staged_bindings == NULL) {
+                       DRM_ERROR("Failed to allocate context binding "
+                                 "information.\n");
+                       goto out_err;
+               }
+               INIT_LIST_HEAD(&node->staged_bindings->list);
+       }
+
+       if (p_val)
+               *p_val = node;
+
+out_err:
+       return ret;
+}
+
+
 /**
- * vmw_cmd_compat_res_check - Check that a resource is present and if so, put it
+ * vmw_cmd_res_check - Check that a resource is present and if so, put it
  * on the resource validate list unless it's already there.
  *
  * @dev_priv: Pointer to a device private structure.
  * @sw_context: Pointer to the software context.
  * @res_type: Resource type.
  * @converter: User-space visisble type specific information.
- * @id: user-space resource id handle.
  * @id_loc: Pointer to the location in the command buffer currently being
  * parsed from where the user-space resource id handle is located.
  * @p_val: Pointer to pointer to resource validalidation node. Populated
  * on exit.
  */
 static int
-vmw_cmd_compat_res_check(struct vmw_private *dev_priv,
-                        struct vmw_sw_context *sw_context,
-                        enum vmw_res_type res_type,
-                        const struct vmw_user_resource_conv *converter,
-                        uint32_t id,
-                        uint32_t *id_loc,
-                        struct vmw_resource_val_node **p_val)
+vmw_cmd_res_check(struct vmw_private *dev_priv,
+                 struct vmw_sw_context *sw_context,
+                 enum vmw_res_type res_type,
+                 const struct vmw_user_resource_conv *converter,
+                 uint32_t *id_loc,
+                 struct vmw_resource_val_node **p_val)
 {
        struct vmw_res_cache_entry *rcache =
                &sw_context->res_cache[res_type];
@@ -451,7 +514,7 @@ vmw_cmd_compat_res_check(struct vmw_private *dev_priv,
        struct vmw_resource_val_node *node;
        int ret;
 
-       if (id == SVGA3D_INVALID_ID) {
+       if (*id_loc == SVGA3D_INVALID_ID) {
                if (p_val)
                        *p_val = NULL;
                if (res_type == vmw_res_context) {
@@ -466,7 +529,7 @@ vmw_cmd_compat_res_check(struct vmw_private *dev_priv,
         * resource
         */
 
-       if (likely(rcache->valid && id == rcache->handle)) {
+       if (likely(rcache->valid && *id_loc == rcache->handle)) {
                const struct vmw_resource *res = rcache->res;
 
                rcache->node->first_usage = false;
@@ -480,49 +543,28 @@ vmw_cmd_compat_res_check(struct vmw_private *dev_priv,
 
        ret = vmw_user_resource_lookup_handle(dev_priv,
                                              sw_context->fp->tfile,
-                                             id,
+                                             *id_loc,
                                              converter,
                                              &res);
        if (unlikely(ret != 0)) {
                DRM_ERROR("Could not find or use resource 0x%08x.\n",
-                         (unsigned) id);
+                         (unsigned) *id_loc);
                dump_stack();
                return ret;
        }
 
        rcache->valid = true;
        rcache->res = res;
-       rcache->handle = id;
-
-       ret = vmw_resource_relocation_add(&sw_context->res_relocations,
-                                         res,
-                                         id_loc - sw_context->buf_start);
-       if (unlikely(ret != 0))
-               goto out_no_reloc;
+       rcache->handle = *id_loc;
 
-       ret = vmw_resource_val_add(sw_context, res, &node);
+       ret = vmw_cmd_res_reloc_add(dev_priv, sw_context, res_type, id_loc,
+                                   res, &node);
        if (unlikely(ret != 0))
                goto out_no_reloc;
 
        rcache->node = node;
        if (p_val)
                *p_val = node;
-
-       if (dev_priv->has_mob && node->first_usage &&
-           res_type == vmw_res_context) {
-               ret = vmw_resource_context_res_add(dev_priv, sw_context, res);
-               if (unlikely(ret != 0))
-                       goto out_no_reloc;
-               node->staged_bindings =
-                       kzalloc(sizeof(*node->staged_bindings), GFP_KERNEL);
-               if (node->staged_bindings == NULL) {
-                       DRM_ERROR("Failed to allocate context binding "
-                                 "information.\n");
-                       goto out_no_reloc;
-               }
-               INIT_LIST_HEAD(&node->staged_bindings->list);
-       }
-
        vmw_resource_unreference(&res);
        return 0;
 
@@ -533,31 +575,6 @@ out_no_reloc:
        return ret;
 }
 
-/**
- * vmw_cmd_res_check - Check that a resource is present and if so, put it
- * on the resource validate list unless it's already there.
- *
- * @dev_priv: Pointer to a device private structure.
- * @sw_context: Pointer to the software context.
- * @res_type: Resource type.
- * @converter: User-space visisble type specific information.
- * @id_loc: Pointer to the location in the command buffer currently being
- * parsed from where the user-space resource id handle is located.
- * @p_val: Pointer to pointer to resource validalidation node. Populated
- * on exit.
- */
-static int
-vmw_cmd_res_check(struct vmw_private *dev_priv,
-                 struct vmw_sw_context *sw_context,
-                 enum vmw_res_type res_type,
-                 const struct vmw_user_resource_conv *converter,
-                 uint32_t *id_loc,
-                 struct vmw_resource_val_node **p_val)
-{
-       return vmw_cmd_compat_res_check(dev_priv, sw_context, res_type,
-                                       converter, *id_loc, id_loc, p_val);
-}
-
 /**
  * vmw_rebind_contexts - Rebind all resources previously bound to
  * referenced contexts.
@@ -572,8 +589,8 @@ static int vmw_rebind_contexts(struct vmw_sw_context *sw_context)
        int ret;
 
        list_for_each_entry(val, &sw_context->resource_list, head) {
-               if (likely(!val->staged_bindings))
-                       continue;
+               if (unlikely(!val->staged_bindings))
+                       break;
 
                ret = vmw_context_rebind_all(val->res);
                if (unlikely(ret != 0)) {
@@ -1626,13 +1643,14 @@ static int vmw_cmd_shader_define(struct vmw_private *dev_priv,
        } *cmd;
        int ret;
        size_t size;
+       struct vmw_resource_val_node *val;
 
        cmd = container_of(header, struct vmw_shader_define_cmd,
                           header);
 
        ret = vmw_cmd_res_check(dev_priv, sw_context, vmw_res_context,
                                user_context_converter, &cmd->body.cid,
-                               NULL);
+                               &val);
        if (unlikely(ret != 0))
                return ret;
 
@@ -1640,11 +1658,11 @@ static int vmw_cmd_shader_define(struct vmw_private *dev_priv,
                return 0;
 
        size = cmd->header.size - sizeof(cmd->body);
-       ret = vmw_compat_shader_add(sw_context->fp->shman,
+       ret = vmw_compat_shader_add(dev_priv,
+                                   vmw_context_res_man(val->res),
                                    cmd->body.shid, cmd + 1,
                                    cmd->body.type, size,
-                                   sw_context->fp->tfile,
-                                   &sw_context->staged_shaders);
+                                   &sw_context->staged_cmd_res);
        if (unlikely(ret != 0))
                return ret;
 
@@ -1672,23 +1690,24 @@ static int vmw_cmd_shader_destroy(struct vmw_private *dev_priv,
                SVGA3dCmdDestroyShader body;
        } *cmd;
        int ret;
+       struct vmw_resource_val_node *val;
 
        cmd = container_of(header, struct vmw_shader_destroy_cmd,
                           header);
 
        ret = vmw_cmd_res_check(dev_priv, sw_context, vmw_res_context,
                                user_context_converter, &cmd->body.cid,
-                               NULL);
+                               &val);
        if (unlikely(ret != 0))
                return ret;
 
        if (unlikely(!dev_priv->has_mob))
                return 0;
 
-       ret = vmw_compat_shader_remove(sw_context->fp->shman,
+       ret = vmw_compat_shader_remove(vmw_context_res_man(val->res),
                                       cmd->body.shid,
                                       cmd->body.type,
-                                      &sw_context->staged_shaders);
+                                      &sw_context->staged_cmd_res);
        if (unlikely(ret != 0))
                return ret;
 
@@ -1715,7 +1734,9 @@ static int vmw_cmd_set_shader(struct vmw_private *dev_priv,
                SVGA3dCmdHeader header;
                SVGA3dCmdSetShader body;
        } *cmd;
-       struct vmw_resource_val_node *ctx_node;
+       struct vmw_resource_val_node *ctx_node, *res_node = NULL;
+       struct vmw_ctx_bindinfo bi;
+       struct vmw_resource *res = NULL;
        int ret;
 
        cmd = container_of(header, struct vmw_set_shader_cmd,
@@ -1727,32 +1748,40 @@ static int vmw_cmd_set_shader(struct vmw_private *dev_priv,
        if (unlikely(ret != 0))
                return ret;
 
-       if (dev_priv->has_mob) {
-               struct vmw_ctx_bindinfo bi;
-               struct vmw_resource_val_node *res_node;
-               u32 shid = cmd->body.shid;
-
-               if (shid != SVGA3D_INVALID_ID)
-                       (void) vmw_compat_shader_lookup(sw_context->fp->shman,
-                                                       cmd->body.type,
-                                                       &shid);
-
-               ret = vmw_cmd_compat_res_check(dev_priv, sw_context,
-                                              vmw_res_shader,
-                                              user_shader_converter,
-                                              shid,
-                                              &cmd->body.shid, &res_node);
+       if (!dev_priv->has_mob)
+               return 0;
+
+       if (cmd->body.shid != SVGA3D_INVALID_ID) {
+               res = vmw_compat_shader_lookup
+                       (vmw_context_res_man(ctx_node->res),
+                        cmd->body.shid,
+                        cmd->body.type);
+
+               if (!IS_ERR(res)) {
+                       ret = vmw_cmd_res_reloc_add(dev_priv, sw_context,
+                                                   vmw_res_shader,
+                                                   &cmd->body.shid, res,
+                                                   &res_node);
+                       vmw_resource_unreference(&res);
+                       if (unlikely(ret != 0))
+                               return ret;
+               }
+       }
+
+       if (!res_node) {
+               ret = vmw_cmd_res_check(dev_priv, sw_context,
+                                       vmw_res_shader,
+                                       user_shader_converter,
+                                       &cmd->body.shid, &res_node);
                if (unlikely(ret != 0))
                        return ret;
-
-               bi.ctx = ctx_node->res;
-               bi.res = res_node ? res_node->res : NULL;
-               bi.bt = vmw_ctx_binding_shader;
-               bi.i1.shader_type = cmd->body.type;
-               return vmw_context_binding_add(ctx_node->staged_bindings, &bi);
        }
 
-       return 0;
+       bi.ctx = ctx_node->res;
+       bi.res = res_node ? res_node->res : NULL;
+       bi.bt = vmw_ctx_binding_shader;
+       bi.i1.shader_type = cmd->body.type;
+       return vmw_context_binding_add(ctx_node->staged_bindings, &bi);
 }
 
 /**
@@ -2394,6 +2423,8 @@ vmw_execbuf_copy_fence_user(struct vmw_private *dev_priv,
        }
 }
 
+
+
 int vmw_execbuf_process(struct drm_file *file_priv,
                        struct vmw_private *dev_priv,
                        void __user *user_commands,
@@ -2453,7 +2484,7 @@ int vmw_execbuf_process(struct drm_file *file_priv,
                        goto out_unlock;
                sw_context->res_ht_initialized = true;
        }
-       INIT_LIST_HEAD(&sw_context->staged_shaders);
+       INIT_LIST_HEAD(&sw_context->staged_cmd_res);
 
        INIT_LIST_HEAD(&resource_list);
        ret = vmw_cmd_check_all(dev_priv, sw_context, kernel_commands,
@@ -2548,8 +2579,7 @@ int vmw_execbuf_process(struct drm_file *file_priv,
        }
 
        list_splice_init(&sw_context->resource_list, &resource_list);
-       vmw_compat_shaders_commit(sw_context->fp->shman,
-                                 &sw_context->staged_shaders);
+       vmw_cmdbuf_res_commit(&sw_context->staged_cmd_res);
        mutex_unlock(&dev_priv->cmdbuf_mutex);
 
        /*
@@ -2576,8 +2606,7 @@ out_unlock:
        list_splice_init(&sw_context->resource_list, &resource_list);
        error_resource = sw_context->error_resource;
        sw_context->error_resource = NULL;
-       vmw_compat_shaders_revert(sw_context->fp->shman,
-                                 &sw_context->staged_shaders);
+       vmw_cmdbuf_res_revert(&sw_context->staged_cmd_res);
        mutex_unlock(&dev_priv->cmdbuf_mutex);
 
        /*
index b1273e8e9a6903e2d15d3b153177e9a99c806859..26f8bdde3529b8a5b222a52aa34ebc8da185232a 100644 (file)
@@ -47,6 +47,7 @@ struct vmwgfx_gmrid_man {
 static int vmw_gmrid_man_get_node(struct ttm_mem_type_manager *man,
                                  struct ttm_buffer_object *bo,
                                  struct ttm_placement *placement,
+                                 uint32_t flags,
                                  struct ttm_mem_reg *mem)
 {
        struct vmwgfx_gmrid_man *gman =
index 8f3edc4710f2869344fec29c6366caa2a1d77dc2..d2bc2b03d4c60b3f12b14720943f5a835432d58e 100644 (file)
@@ -75,7 +75,7 @@ void vmw_display_unit_cleanup(struct vmw_display_unit *du)
                vmw_surface_unreference(&du->cursor_surface);
        if (du->cursor_dmabuf)
                vmw_dmabuf_unreference(&du->cursor_dmabuf);
-       drm_sysfs_connector_remove(&du->connector);
+       drm_connector_unregister(&du->connector);
        drm_crtc_cleanup(&du->crtc);
        drm_encoder_cleanup(&du->encoder);
        drm_connector_cleanup(&du->connector);
@@ -136,7 +136,7 @@ int vmw_cursor_update_dmabuf(struct vmw_private *dev_priv,
        kmap_offset = 0;
        kmap_num = (width*height*4 + PAGE_SIZE - 1) >> PAGE_SHIFT;
 
-       ret = ttm_bo_reserve(&dmabuf->base, true, false, false, 0);
+       ret = ttm_bo_reserve(&dmabuf->base, true, false, false, NULL);
        if (unlikely(ret != 0)) {
                DRM_ERROR("reserve failed\n");
                return -EINVAL;
@@ -343,7 +343,7 @@ void vmw_kms_cursor_snoop(struct vmw_surface *srf,
        kmap_offset = cmd->dma.guest.ptr.offset >> PAGE_SHIFT;
        kmap_num = (64*64*4) >> PAGE_SHIFT;
 
-       ret = ttm_bo_reserve(bo, true, false, false, 0);
+       ret = ttm_bo_reserve(bo, true, false, false, NULL);
        if (unlikely(ret != 0)) {
                DRM_ERROR("reserve failed\n");
                return;
@@ -1501,7 +1501,6 @@ int vmw_kms_cursor_bypass_ioctl(struct drm_device *dev, void *data,
 {
        struct drm_vmw_cursor_bypass_arg *arg = data;
        struct vmw_display_unit *du;
-       struct drm_mode_object *obj;
        struct drm_crtc *crtc;
        int ret = 0;
 
@@ -1519,13 +1518,12 @@ int vmw_kms_cursor_bypass_ioctl(struct drm_device *dev, void *data,
                return 0;
        }
 
-       obj = drm_mode_object_find(dev, arg->crtc_id, DRM_MODE_OBJECT_CRTC);
-       if (!obj) {
+       crtc = drm_crtc_find(dev, arg->crtc_id);
+       if (!crtc) {
                ret = -ENOENT;
                goto out;
        }
 
-       crtc = obj_to_crtc(obj);
        du = vmw_crtc_to_du(crtc);
 
        du->hotspot_x = arg->xhot;
index b2b9bd23aeee620fee8610c490e41a6ef297997e..15e185ae4c990788af33b20b5a63042638f67ef2 100644 (file)
@@ -371,7 +371,7 @@ static int vmw_ldu_init(struct vmw_private *dev_priv, unsigned unit)
        encoder->possible_crtcs = (1 << unit);
        encoder->possible_clones = 0;
 
-       (void) drm_sysfs_connector_add(connector);
+       (void) drm_connector_register(connector);
 
        drm_crtc_init(dev, crtc, &vmw_legacy_crtc_funcs);
 
index 01d68f0a69dca74067b1dab583ab860711d6933a..a432c0db257c10aad67a7bbfad688e31b6781e86 100644 (file)
@@ -127,7 +127,7 @@ static void vmw_resource_release(struct kref *kref)
        if (res->backup) {
                struct ttm_buffer_object *bo = &res->backup->base;
 
-               ttm_bo_reserve(bo, false, false, false, 0);
+               ttm_bo_reserve(bo, false, false, false, NULL);
                if (!list_empty(&res->mob_head) &&
                    res->func->unbind != NULL) {
                        struct ttm_validate_buffer val_buf;
index a95d3a0cabe448672237b3c42bc8b182272effeb..b295463a60b3828686fb49b58d07b011ec38bdbe 100644 (file)
@@ -467,7 +467,7 @@ static int vmw_sou_init(struct vmw_private *dev_priv, unsigned unit)
        encoder->possible_crtcs = (1 << unit);
        encoder->possible_clones = 0;
 
-       (void) drm_sysfs_connector_add(connector);
+       (void) drm_connector_register(connector);
 
        drm_crtc_init(dev, crtc, &vmw_screen_object_crtc_funcs);
 
index c1559eeaffe9fe637eb2a1e31b1b070b6af29b76..8719fb3cccc93fb8b282c5022f9cdd669dc3e270 100644 (file)
@@ -29,8 +29,6 @@
 #include "vmwgfx_resource_priv.h"
 #include "ttm/ttm_placement.h"
 
-#define VMW_COMPAT_SHADER_HT_ORDER 12
-
 struct vmw_shader {
        struct vmw_resource res;
        SVGA3dShaderType type;
@@ -42,49 +40,8 @@ struct vmw_user_shader {
        struct vmw_shader shader;
 };
 
-/**
- * enum vmw_compat_shader_state - Staging state for compat shaders
- */
-enum vmw_compat_shader_state {
-       VMW_COMPAT_COMMITED,
-       VMW_COMPAT_ADD,
-       VMW_COMPAT_DEL
-};
-
-/**
- * struct vmw_compat_shader - Metadata for compat shaders.
- *
- * @handle: The TTM handle of the guest backed shader.
- * @tfile: The struct ttm_object_file the guest backed shader is registered
- * with.
- * @hash: Hash item for lookup.
- * @head: List head for staging lists or the compat shader manager list.
- * @state: Staging state.
- *
- * The structure is protected by the cmdbuf lock.
- */
-struct vmw_compat_shader {
-       u32 handle;
-       struct ttm_object_file *tfile;
-       struct drm_hash_item hash;
-       struct list_head head;
-       enum vmw_compat_shader_state state;
-};
-
-/**
- * struct vmw_compat_shader_manager - Compat shader manager.
- *
- * @shaders: Hash table containing staged and commited compat shaders
- * @list: List of commited shaders.
- * @dev_priv: Pointer to a device private structure.
- *
- * @shaders and @list are protected by the cmdbuf mutex for now.
- */
-struct vmw_compat_shader_manager {
-       struct drm_open_hash shaders;
-       struct list_head list;
-       struct vmw_private *dev_priv;
-};
+static uint64_t vmw_user_shader_size;
+static uint64_t vmw_shader_size;
 
 static void vmw_user_shader_free(struct vmw_resource *res);
 static struct vmw_resource *
@@ -98,8 +55,6 @@ static int vmw_gb_shader_unbind(struct vmw_resource *res,
                                 struct ttm_validate_buffer *val_buf);
 static int vmw_gb_shader_destroy(struct vmw_resource *res);
 
-static uint64_t vmw_user_shader_size;
-
 static const struct vmw_user_resource_conv user_shader_conv = {
        .object_type = VMW_RES_SHADER,
        .base_obj_to_res = vmw_user_shader_base_to_res,
@@ -347,6 +302,16 @@ static void vmw_user_shader_free(struct vmw_resource *res)
                            vmw_user_shader_size);
 }
 
+static void vmw_shader_free(struct vmw_resource *res)
+{
+       struct vmw_shader *shader = vmw_res_to_shader(res);
+       struct vmw_private *dev_priv = res->dev_priv;
+
+       kfree(shader);
+       ttm_mem_global_free(vmw_mem_glob(dev_priv),
+                           vmw_shader_size);
+}
+
 /**
  * This function is called when user space has no more references on the
  * base object. It releases the base-object's reference on the resource object.
@@ -371,13 +336,13 @@ int vmw_shader_destroy_ioctl(struct drm_device *dev, void *data,
                                         TTM_REF_USAGE);
 }
 
-static int vmw_shader_alloc(struct vmw_private *dev_priv,
-                           struct vmw_dma_buffer *buffer,
-                           size_t shader_size,
-                           size_t offset,
-                           SVGA3dShaderType shader_type,
-                           struct ttm_object_file *tfile,
-                           u32 *handle)
+static int vmw_user_shader_alloc(struct vmw_private *dev_priv,
+                                struct vmw_dma_buffer *buffer,
+                                size_t shader_size,
+                                size_t offset,
+                                SVGA3dShaderType shader_type,
+                                struct ttm_object_file *tfile,
+                                u32 *handle)
 {
        struct vmw_user_shader *ushader;
        struct vmw_resource *res, *tmp;
@@ -442,6 +407,56 @@ out:
 }
 
 
+struct vmw_resource *vmw_shader_alloc(struct vmw_private *dev_priv,
+                                     struct vmw_dma_buffer *buffer,
+                                     size_t shader_size,
+                                     size_t offset,
+                                     SVGA3dShaderType shader_type)
+{
+       struct vmw_shader *shader;
+       struct vmw_resource *res;
+       int ret;
+
+       /*
+        * Approximate idr memory usage with 128 bytes. It will be limited
+        * by maximum number_of shaders anyway.
+        */
+       if (unlikely(vmw_shader_size == 0))
+               vmw_shader_size =
+                       ttm_round_pot(sizeof(struct vmw_shader)) + 128;
+
+       ret = ttm_mem_global_alloc(vmw_mem_glob(dev_priv),
+                                  vmw_shader_size,
+                                  false, true);
+       if (unlikely(ret != 0)) {
+               if (ret != -ERESTARTSYS)
+                       DRM_ERROR("Out of graphics memory for shader "
+                                 "creation.\n");
+               goto out_err;
+       }
+
+       shader = kzalloc(sizeof(*shader), GFP_KERNEL);
+       if (unlikely(shader == NULL)) {
+               ttm_mem_global_free(vmw_mem_glob(dev_priv),
+                                   vmw_shader_size);
+               ret = -ENOMEM;
+               goto out_err;
+       }
+
+       res = &shader->res;
+
+       /*
+        * From here on, the destructor takes over resource freeing.
+        */
+       ret = vmw_gb_shader_init(dev_priv, res, shader_size,
+                                offset, shader_type, buffer,
+                                vmw_shader_free);
+
+out_err:
+       return ret ? ERR_PTR(ret) : res;
+}
+
+
 int vmw_shader_define_ioctl(struct drm_device *dev, void *data,
                             struct drm_file *file_priv)
 {
@@ -490,8 +505,8 @@ int vmw_shader_define_ioctl(struct drm_device *dev, void *data,
        if (unlikely(ret != 0))
                goto out_bad_arg;
 
-       ret = vmw_shader_alloc(dev_priv, buffer, arg->size, arg->offset,
-                              shader_type, tfile, &arg->shader_handle);
+       ret = vmw_user_shader_alloc(dev_priv, buffer, arg->size, arg->offset,
+                                   shader_type, tfile, &arg->shader_handle);
 
        ttm_read_unlock(&dev_priv->reservation_sem);
 out_bad_arg:
@@ -500,202 +515,83 @@ out_bad_arg:
 }
 
 /**
- * vmw_compat_shader_lookup - Look up a compat shader
- *
- * @man: Pointer to the compat shader manager.
- * @shader_type: The shader type, that combined with the user_key identifies
- * the shader.
- * @user_key: On entry, this should be a pointer to the user_key.
- * On successful exit, it will contain the guest-backed shader's TTM handle.
+ * vmw_compat_shader_id_ok - Check whether a compat shader user key and
+ * shader type are within valid bounds.
  *
- * Returns 0 on success. Non-zero on failure, in which case the value pointed
- * to by @user_key is unmodified.
- */
-int vmw_compat_shader_lookup(struct vmw_compat_shader_manager *man,
-                            SVGA3dShaderType shader_type,
-                            u32 *user_key)
-{
-       struct drm_hash_item *hash;
-       int ret;
-       unsigned long key = *user_key | (shader_type << 24);
-
-       ret = drm_ht_find_item(&man->shaders, key, &hash);
-       if (unlikely(ret != 0))
-               return ret;
-
-       *user_key = drm_hash_entry(hash, struct vmw_compat_shader,
-                                  hash)->handle;
-
-       return 0;
-}
-
-/**
- * vmw_compat_shader_free - Free a compat shader.
- *
- * @man: Pointer to the compat shader manager.
- * @entry: Pointer to a struct vmw_compat_shader.
- *
- * Frees a struct vmw_compat_shder entry and drops its reference to the
- * guest backed shader.
- */
-static void vmw_compat_shader_free(struct vmw_compat_shader_manager *man,
-                                  struct vmw_compat_shader *entry)
-{
-       list_del(&entry->head);
-       WARN_ON(drm_ht_remove_item(&man->shaders, &entry->hash));
-       WARN_ON(ttm_ref_object_base_unref(entry->tfile, entry->handle,
-                                         TTM_REF_USAGE));
-       kfree(entry);
-}
-
-/**
- * vmw_compat_shaders_commit - Commit a list of compat shader actions.
- *
- * @man: Pointer to the compat shader manager.
- * @list: Caller's list of compat shader actions.
+ * @user_key: User space id of the shader.
+ * @shader_type: Shader type.
  *
- * This function commits a list of compat shader additions or removals.
- * It is typically called when the execbuf ioctl call triggering these
- * actions has commited the fifo contents to the device.
+ * Returns true if valid false if not.
  */
-void vmw_compat_shaders_commit(struct vmw_compat_shader_manager *man,
-                              struct list_head *list)
+static bool vmw_compat_shader_id_ok(u32 user_key, SVGA3dShaderType shader_type)
 {
-       struct vmw_compat_shader *entry, *next;
-
-       list_for_each_entry_safe(entry, next, list, head) {
-               list_del(&entry->head);
-               switch (entry->state) {
-               case VMW_COMPAT_ADD:
-                       entry->state = VMW_COMPAT_COMMITED;
-                       list_add_tail(&entry->head, &man->list);
-                       break;
-               case VMW_COMPAT_DEL:
-                       ttm_ref_object_base_unref(entry->tfile, entry->handle,
-                                                 TTM_REF_USAGE);
-                       kfree(entry);
-                       break;
-               default:
-                       BUG();
-                       break;
-               }
-       }
+       return user_key <= ((1 << 20) - 1) && (unsigned) shader_type < 16;
 }
 
 /**
- * vmw_compat_shaders_revert - Revert a list of compat shader actions
+ * vmw_compat_shader_key - Compute a hash key suitable for a compat shader.
  *
- * @man: Pointer to the compat shader manager.
- * @list: Caller's list of compat shader actions.
+ * @user_key: User space id of the shader.
+ * @shader_type: Shader type.
  *
- * This function reverts a list of compat shader additions or removals.
- * It is typically called when the execbuf ioctl call triggering these
- * actions failed for some reason, and the command stream was never
- * submitted.
+ * Returns a hash key suitable for a command buffer managed resource
+ * manager hash table.
  */
-void vmw_compat_shaders_revert(struct vmw_compat_shader_manager *man,
-                              struct list_head *list)
+static u32 vmw_compat_shader_key(u32 user_key, SVGA3dShaderType shader_type)
 {
-       struct vmw_compat_shader *entry, *next;
-       int ret;
-
-       list_for_each_entry_safe(entry, next, list, head) {
-               switch (entry->state) {
-               case VMW_COMPAT_ADD:
-                       vmw_compat_shader_free(man, entry);
-                       break;
-               case VMW_COMPAT_DEL:
-                       ret = drm_ht_insert_item(&man->shaders, &entry->hash);
-                       list_del(&entry->head);
-                       list_add_tail(&entry->head, &man->list);
-                       entry->state = VMW_COMPAT_COMMITED;
-                       break;
-               default:
-                       BUG();
-                       break;
-               }
-       }
+       return user_key | (shader_type << 20);
 }
 
 /**
  * vmw_compat_shader_remove - Stage a compat shader for removal.
  *
- * @man: Pointer to the compat shader manager
+ * @man: Pointer to the compat shader manager identifying the shader namespace.
  * @user_key: The key that is used to identify the shader. The key is
  * unique to the shader type.
  * @shader_type: Shader type.
- * @list: Caller's list of staged shader actions.
- *
- * This function stages a compat shader for removal and removes the key from
- * the shader manager's hash table. If the shader was previously only staged
- * for addition it is completely removed (But the execbuf code may keep a
- * reference if it was bound to a context between addition and removal). If
- * it was previously commited to the manager, it is staged for removal.
+ * @list: Caller's list of staged command buffer resource actions.
  */
-int vmw_compat_shader_remove(struct vmw_compat_shader_manager *man,
+int vmw_compat_shader_remove(struct vmw_cmdbuf_res_manager *man,
                             u32 user_key, SVGA3dShaderType shader_type,
                             struct list_head *list)
 {
-       struct vmw_compat_shader *entry;
-       struct drm_hash_item *hash;
-       int ret;
-
-       ret = drm_ht_find_item(&man->shaders, user_key | (shader_type << 24),
-                              &hash);
-       if (likely(ret != 0))
+       if (!vmw_compat_shader_id_ok(user_key, shader_type))
                return -EINVAL;
 
-       entry = drm_hash_entry(hash, struct vmw_compat_shader, hash);
-
-       switch (entry->state) {
-       case VMW_COMPAT_ADD:
-               vmw_compat_shader_free(man, entry);
-               break;
-       case VMW_COMPAT_COMMITED:
-               (void) drm_ht_remove_item(&man->shaders, &entry->hash);
-               list_del(&entry->head);
-               entry->state = VMW_COMPAT_DEL;
-               list_add_tail(&entry->head, list);
-               break;
-       default:
-               BUG();
-               break;
-       }
-
-       return 0;
+       return vmw_cmdbuf_res_remove(man, vmw_cmdbuf_res_compat_shader,
+                                    vmw_compat_shader_key(user_key,
+                                                          shader_type),
+                                    list);
 }
 
 /**
- * vmw_compat_shader_add - Create a compat shader and add the
- * key to the manager
+ * vmw_compat_shader_add - Create a compat shader and stage it for addition
+ * as a command buffer managed resource.
  *
- * @man: Pointer to the compat shader manager
+ * @man: Pointer to the compat shader manager identifying the shader namespace.
  * @user_key: The key that is used to identify the shader. The key is
  * unique to the shader type.
  * @bytecode: Pointer to the bytecode of the shader.
  * @shader_type: Shader type.
  * @tfile: Pointer to a struct ttm_object_file that the guest-backed shader is
  * to be created with.
- * @list: Caller's list of staged shader actions.
+ * @list: Caller's list of staged command buffer resource actions.
  *
- * Note that only the key is added to the shader manager's hash table.
- * The shader is not yet added to the shader manager's list of shaders.
  */
-int vmw_compat_shader_add(struct vmw_compat_shader_manager *man,
+int vmw_compat_shader_add(struct vmw_private *dev_priv,
+                         struct vmw_cmdbuf_res_manager *man,
                          u32 user_key, const void *bytecode,
                          SVGA3dShaderType shader_type,
                          size_t size,
-                         struct ttm_object_file *tfile,
                          struct list_head *list)
 {
        struct vmw_dma_buffer *buf;
        struct ttm_bo_kmap_obj map;
        bool is_iomem;
-       struct vmw_compat_shader *compat;
-       u32 handle;
        int ret;
+       struct vmw_resource *res;
 
-       if (user_key > ((1 << 24) - 1) || (unsigned) shader_type > 16)
+       if (!vmw_compat_shader_id_ok(user_key, shader_type))
                return -EINVAL;
 
        /* Allocate and pin a DMA buffer */
@@ -703,7 +599,7 @@ int vmw_compat_shader_add(struct vmw_compat_shader_manager *man,
        if (unlikely(buf == NULL))
                return -ENOMEM;
 
-       ret = vmw_dmabuf_init(man->dev_priv, buf, size, &vmw_sys_ne_placement,
+       ret = vmw_dmabuf_init(dev_priv, buf, size, &vmw_sys_ne_placement,
                              true, vmw_dmabuf_bo_free);
        if (unlikely(ret != 0))
                goto out;
@@ -728,84 +624,40 @@ int vmw_compat_shader_add(struct vmw_compat_shader_manager *man,
        WARN_ON(ret != 0);
        ttm_bo_unreserve(&buf->base);
 
-       /* Create a guest-backed shader container backed by the dma buffer */
-       ret = vmw_shader_alloc(man->dev_priv, buf, size, 0, shader_type,
-                              tfile, &handle);
-       vmw_dmabuf_unreference(&buf);
+       res = vmw_shader_alloc(dev_priv, buf, size, 0, shader_type);
        if (unlikely(ret != 0))
                goto no_reserve;
-       /*
-        * Create a compat shader structure and stage it for insertion
-        * in the manager
-        */
-       compat = kzalloc(sizeof(*compat), GFP_KERNEL);
-       if (compat == NULL)
-               goto no_compat;
-
-       compat->hash.key = user_key |  (shader_type << 24);
-       ret = drm_ht_insert_item(&man->shaders, &compat->hash);
-       if (unlikely(ret != 0))
-               goto out_invalid_key;
-
-       compat->state = VMW_COMPAT_ADD;
-       compat->handle = handle;
-       compat->tfile = tfile;
-       list_add_tail(&compat->head, list);
-
-       return 0;
 
-out_invalid_key:
-       kfree(compat);
-no_compat:
-       ttm_ref_object_base_unref(tfile, handle, TTM_REF_USAGE);
+       ret = vmw_cmdbuf_res_add(man, vmw_cmdbuf_res_compat_shader,
+                                vmw_compat_shader_key(user_key, shader_type),
+                                res, list);
+       vmw_resource_unreference(&res);
 no_reserve:
+       vmw_dmabuf_unreference(&buf);
 out:
        return ret;
 }
 
 /**
- * vmw_compat_shader_man_create - Create a compat shader manager
- *
- * @dev_priv: Pointer to a device private structure.
- *
- * Typically done at file open time. If successful returns a pointer to a
- * compat shader manager. Otherwise returns an error pointer.
- */
-struct vmw_compat_shader_manager *
-vmw_compat_shader_man_create(struct vmw_private *dev_priv)
-{
-       struct vmw_compat_shader_manager *man;
-       int ret;
-
-       man = kzalloc(sizeof(*man), GFP_KERNEL);
-       if (man == NULL)
-               return ERR_PTR(-ENOMEM);
-
-       man->dev_priv = dev_priv;
-       INIT_LIST_HEAD(&man->list);
-       ret = drm_ht_create(&man->shaders, VMW_COMPAT_SHADER_HT_ORDER);
-       if (ret == 0)
-               return man;
-
-       kfree(man);
-       return ERR_PTR(ret);
-}
-
-/**
- * vmw_compat_shader_man_destroy - Destroy a compat shader manager
+ * vmw_compat_shader_lookup - Look up a compat shader
  *
- * @man: Pointer to the shader manager to destroy.
+ * @man: Pointer to the command buffer managed resource manager identifying
+ * the shader namespace.
+ * @user_key: The user space id of the shader.
+ * @shader_type: The shader type.
  *
- * Typically done at file close time.
+ * Returns a refcounted pointer to a struct vmw_resource if the shader was
+ * found. An error pointer otherwise.
  */
-void vmw_compat_shader_man_destroy(struct vmw_compat_shader_manager *man)
+struct vmw_resource *
+vmw_compat_shader_lookup(struct vmw_cmdbuf_res_manager *man,
+                        u32 user_key,
+                        SVGA3dShaderType shader_type)
 {
-       struct vmw_compat_shader *entry, *next;
-
-       mutex_lock(&man->dev_priv->cmdbuf_mutex);
-       list_for_each_entry_safe(entry, next, &man->list, head)
-               vmw_compat_shader_free(man, entry);
+       if (!vmw_compat_shader_id_ok(user_key, shader_type))
+               return ERR_PTR(-EINVAL);
 
-       mutex_unlock(&man->dev_priv->cmdbuf_mutex);
-       kfree(man);
+       return vmw_cmdbuf_res_lookup(man, vmw_cmdbuf_res_compat_shader,
+                                    vmw_compat_shader_key(user_key,
+                                                          shader_type));
 }
index 112f27e51bc7df81b45efcb58f7c11fc46f097e0..63bd63f3c7dfd2da2fd3d9ae58bba1473bceb70b 100644 (file)
@@ -185,16 +185,16 @@ static unsigned int pin_job(struct host1x_job *job)
                struct sg_table *sgt;
                dma_addr_t phys_addr;
 
-               reloc->target = host1x_bo_get(reloc->target);
-               if (!reloc->target)
+               reloc->target.bo = host1x_bo_get(reloc->target.bo);
+               if (!reloc->target.bo)
                        goto unpin;
 
-               phys_addr = host1x_bo_pin(reloc->target, &sgt);
+               phys_addr = host1x_bo_pin(reloc->target.bo, &sgt);
                if (!phys_addr)
                        goto unpin;
 
                job->addr_phys[job->num_unpins] = phys_addr;
-               job->unpins[job->num_unpins].bo = reloc->target;
+               job->unpins[job->num_unpins].bo = reloc->target.bo;
                job->unpins[job->num_unpins].sgt = sgt;
                job->num_unpins++;
        }
@@ -235,21 +235,21 @@ static unsigned int do_relocs(struct host1x_job *job, struct host1x_bo *cmdbuf)
        for (i = 0; i < job->num_relocs; i++) {
                struct host1x_reloc *reloc = &job->relocarray[i];
                u32 reloc_addr = (job->reloc_addr_phys[i] +
-                       reloc->target_offset) >> reloc->shift;
+                                 reloc->target.offset) >> reloc->shift;
                u32 *target;
 
                /* skip all other gathers */
-               if (cmdbuf != reloc->cmdbuf)
+               if (cmdbuf != reloc->cmdbuf.bo)
                        continue;
 
-               if (last_page != reloc->cmdbuf_offset >> PAGE_SHIFT) {
+               if (last_page != reloc->cmdbuf.offset >> PAGE_SHIFT) {
                        if (cmdbuf_page_addr)
                                host1x_bo_kunmap(cmdbuf, last_page,
                                                 cmdbuf_page_addr);
 
                        cmdbuf_page_addr = host1x_bo_kmap(cmdbuf,
-                                       reloc->cmdbuf_offset >> PAGE_SHIFT);
-                       last_page = reloc->cmdbuf_offset >> PAGE_SHIFT;
+                                       reloc->cmdbuf.offset >> PAGE_SHIFT);
+                       last_page = reloc->cmdbuf.offset >> PAGE_SHIFT;
 
                        if (unlikely(!cmdbuf_page_addr)) {
                                pr_err("Could not map cmdbuf for relocation\n");
@@ -257,7 +257,7 @@ static unsigned int do_relocs(struct host1x_job *job, struct host1x_bo *cmdbuf)
                        }
                }
 
-               target = cmdbuf_page_addr + (reloc->cmdbuf_offset & ~PAGE_MASK);
+               target = cmdbuf_page_addr + (reloc->cmdbuf.offset & ~PAGE_MASK);
                *target = reloc_addr;
        }
 
@@ -272,7 +272,7 @@ static bool check_reloc(struct host1x_reloc *reloc, struct host1x_bo *cmdbuf,
 {
        offset *= sizeof(u32);
 
-       if (reloc->cmdbuf != cmdbuf || reloc->cmdbuf_offset != offset)
+       if (reloc->cmdbuf.bo != cmdbuf || reloc->cmdbuf.offset != offset)
                return false;
 
        return true;
index af02597083586d9f6dc7df613cb825455f3f0e67..d2077f040f3ec87f0922b8eb67db413539851e53 100644 (file)
@@ -237,12 +237,10 @@ static struct vga_device *__vga_tryget(struct vga_device *vgadev,
                if (conflict->locks & lwants)
                        return conflict;
 
-               /* Ok, now check if he owns the resource we want. We don't need
-                * to check "decodes" since it should be impossible to own
-                * own legacy resources you don't decode unless I have a bug
-                * in this code...
+               /* Ok, now check if it owns the resource we want.  We can
+                * lock resources that are not decoded, therefore a device
+                * can own resources it doesn't decode.
                 */
-               WARN_ON(conflict->owns & ~conflict->decodes);
                match = lwants & conflict->owns;
                if (!match)
                        continue;
@@ -254,13 +252,19 @@ static struct vga_device *__vga_tryget(struct vga_device *vgadev,
                flags = 0;
                pci_bits = 0;
 
+               /* If we can't control legacy resources via the bridge, we
+                * also need to disable normal decoding.
+                */
                if (!conflict->bridge_has_one_vga) {
-                       vga_irq_set_state(conflict, false);
-                       flags |= PCI_VGA_STATE_CHANGE_DECODES;
-                       if (match & (VGA_RSRC_LEGACY_MEM|VGA_RSRC_NORMAL_MEM))
+                       if ((match & conflict->decodes) & VGA_RSRC_LEGACY_MEM)
                                pci_bits |= PCI_COMMAND_MEMORY;
-                       if (match & (VGA_RSRC_LEGACY_IO|VGA_RSRC_NORMAL_IO))
+                       if ((match & conflict->decodes) & VGA_RSRC_LEGACY_IO)
                                pci_bits |= PCI_COMMAND_IO;
+
+                       if (pci_bits) {
+                               vga_irq_set_state(conflict, false);
+                               flags |= PCI_VGA_STATE_CHANGE_DECODES;
+                       }
                }
 
                if (change_bridge)
@@ -268,18 +272,19 @@ static struct vga_device *__vga_tryget(struct vga_device *vgadev,
 
                pci_set_vga_state(conflict->pdev, false, pci_bits, flags);
                conflict->owns &= ~match;
-               /* If he also owned non-legacy, that is no longer the case */
-               if (match & VGA_RSRC_LEGACY_MEM)
+
+               /* If we disabled normal decoding, reflect it in owns */
+               if (pci_bits & PCI_COMMAND_MEMORY)
                        conflict->owns &= ~VGA_RSRC_NORMAL_MEM;
-               if (match & VGA_RSRC_LEGACY_IO)
+               if (pci_bits & PCI_COMMAND_IO)
                        conflict->owns &= ~VGA_RSRC_NORMAL_IO;
        }
 
 enable_them:
        /* ok dude, we got it, everybody conflicting has been disabled, let's
-        * enable us. Make sure we don't mark a bit in "owns" that we don't
-        * also have in "decodes". We can lock resources we don't decode but
-        * not own them.
+        * enable us.  Mark any bits in "owns" regardless of whether we
+        * decoded them.  We can lock resources we don't decode, therefore
+        * we must track them via "owns".
         */
        flags = 0;
        pci_bits = 0;
@@ -291,7 +296,7 @@ enable_them:
                if (wants & (VGA_RSRC_LEGACY_IO|VGA_RSRC_NORMAL_IO))
                        pci_bits |= PCI_COMMAND_IO;
        }
-       if (!!(wants & VGA_RSRC_LEGACY_MASK))
+       if (wants & VGA_RSRC_LEGACY_MASK)
                flags |= PCI_VGA_STATE_CHANGE_BRIDGE;
 
        pci_set_vga_state(vgadev->pdev, true, pci_bits, flags);
@@ -299,7 +304,7 @@ enable_them:
        if (!vgadev->bridge_has_one_vga) {
                vga_irq_set_state(vgadev, true);
        }
-       vgadev->owns |= (wants & vgadev->decodes);
+       vgadev->owns |= wants;
 lock_them:
        vgadev->locks |= (rsrc & VGA_RSRC_LEGACY_MASK);
        if (rsrc & VGA_RSRC_LEGACY_IO)
@@ -649,7 +654,6 @@ static inline void vga_update_device_decodes(struct vga_device *vgadev,
        old_decodes = vgadev->decodes;
        decodes_removed = ~new_decodes & old_decodes;
        decodes_unlocked = vgadev->locks & decodes_removed;
-       vgadev->owns &= ~decodes_removed;
        vgadev->decodes = new_decodes;
 
        pr_info("vgaarb: device changed decodes: PCI:%s,olddecodes=%s,decodes=%s:owns=%s\n",
index e02cf59b048d306c8aa21633537bcbd2c8dffcfc..ec48c823b1571e1f298f195f321c8bd287502198 100644 (file)
@@ -261,6 +261,20 @@ config HOLTEK_FF
          Say Y here if you have a Holtek On Line Grip based game controller
          and want to have force feedback support for it.
 
+config HID_GT683R
+       tristate "MSI GT68xR LED support"
+       depends on LEDS_CLASS && USB_HID
+       ---help---
+       Say Y here if you want to enable support for the three MSI GT68xR LEDs
+
+       This driver support following modes:
+         - Normal: LEDs are fully on when enabled
+         - Audio:  LEDs brightness depends on sound level
+         - Breathing: LEDs brightness varies at human breathing rate
+
+       Currently the following devices are know to be supported:
+         - MSI GT683R
+
 config HID_HUION
        tristate "Huion tablets"
        depends on USB_HID
index 5e96be3ab28044b3ea0df8ce82fecc61f6dc30b1..a69f0adb5c76ad8789884cb151d3f7315b26ea94 100644 (file)
@@ -48,6 +48,7 @@ obj-$(CONFIG_HID_EMS_FF)      += hid-emsff.o
 obj-$(CONFIG_HID_ELECOM)       += hid-elecom.o
 obj-$(CONFIG_HID_ELO)          += hid-elo.o
 obj-$(CONFIG_HID_EZKEY)                += hid-ezkey.o
+obj-$(CONFIG_HID_GT683R)       += hid-gt683r.o
 obj-$(CONFIG_HID_GYRATION)     += hid-gyration.o
 obj-$(CONFIG_HID_HOLTEK)       += hid-holtek-kbd.o
 obj-$(CONFIG_HID_HOLTEK)       += hid-holtek-mouse.o
index 6c813c6092f8ddb5caa67a043c030efd5b953b0f..b52baa120ffa88a41a93ee5f89daa4dcf9c2bf92 100644 (file)
@@ -1849,6 +1849,7 @@ static const struct hid_device_id hid_have_special_driver[] = {
        { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_WIRELESS_OPTICAL_DESKTOP_3_0) },
        { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_OFFICE_KB) },
        { HID_USB_DEVICE(USB_VENDOR_ID_MONTEREY, USB_DEVICE_ID_GENIUS_KB29E) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_MSI, USB_DEVICE_ID_MSI_GT683R_LED_PANEL) },
        { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN) },
        { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_1) },
        { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_2) },
diff --git a/drivers/hid/hid-gt683r.c b/drivers/hid/hid-gt683r.c
new file mode 100644 (file)
index 0000000..0d6f135
--- /dev/null
@@ -0,0 +1,321 @@
+/*
+ * MSI GT683R led driver
+ *
+ * Copyright (c) 2014 Janne Kanniainen <janne.kanniainen@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include <linux/device.h>
+#include <linux/hid.h>
+#include <linux/kernel.h>
+#include <linux/leds.h>
+#include <linux/module.h>
+
+#include "hid-ids.h"
+
+#define GT683R_BUFFER_SIZE                     8
+
+/*
+ * GT683R_LED_OFF: all LEDs are off
+ * GT683R_LED_AUDIO: LEDs brightness depends on sound level
+ * GT683R_LED_BREATHING: LEDs brightness varies at human breathing rate
+ * GT683R_LED_NORMAL: LEDs are fully on when enabled
+ */
+enum gt683r_led_mode {
+       GT683R_LED_OFF = 0,
+       GT683R_LED_AUDIO = 2,
+       GT683R_LED_BREATHING = 3,
+       GT683R_LED_NORMAL = 5
+};
+
+enum gt683r_panels {
+       GT683R_LED_BACK = 0,
+       GT683R_LED_SIDE = 1,
+       GT683R_LED_FRONT = 2,
+       GT683R_LED_COUNT,
+};
+
+static const char * const gt683r_panel_names[] = {
+       "back",
+       "side",
+       "front",
+};
+
+struct gt683r_led {
+       struct hid_device *hdev;
+       struct led_classdev led_devs[GT683R_LED_COUNT];
+       struct mutex lock;
+       struct work_struct work;
+       enum led_brightness brightnesses[GT683R_LED_COUNT];
+       enum gt683r_led_mode mode;
+};
+
+static const struct hid_device_id gt683r_led_id[] = {
+       { HID_USB_DEVICE(USB_VENDOR_ID_MSI, USB_DEVICE_ID_MSI_GT683R_LED_PANEL) },
+       { }
+};
+
+static void gt683r_brightness_set(struct led_classdev *led_cdev,
+                               enum led_brightness brightness)
+{
+       int i;
+       struct device *dev = led_cdev->dev->parent;
+       struct hid_device *hdev = container_of(dev, struct hid_device, dev);
+       struct gt683r_led *led = hid_get_drvdata(hdev);
+
+       for (i = 0; i < GT683R_LED_COUNT; i++) {
+               if (led_cdev == &led->led_devs[i])
+                       break;
+       }
+
+       if (i < GT683R_LED_COUNT) {
+               led->brightnesses[i] = brightness;
+               schedule_work(&led->work);
+       }
+}
+
+static ssize_t mode_show(struct device *dev,
+                               struct device_attribute *attr,
+                               char *buf)
+{
+       u8 sysfs_mode;
+       struct hid_device *hdev = container_of(dev->parent,
+                                       struct hid_device, dev);
+       struct gt683r_led *led = hid_get_drvdata(hdev);
+
+       if (led->mode == GT683R_LED_NORMAL)
+               sysfs_mode = 0;
+       else if (led->mode == GT683R_LED_AUDIO)
+               sysfs_mode = 1;
+       else
+               sysfs_mode = 2;
+
+       return scnprintf(buf, PAGE_SIZE, "%u\n", sysfs_mode);
+}
+
+static ssize_t mode_store(struct device *dev,
+                               struct device_attribute *attr,
+                               const char *buf, size_t count)
+{
+       u8 sysfs_mode;
+       struct hid_device *hdev = container_of(dev->parent,
+                                       struct hid_device, dev);
+       struct gt683r_led *led = hid_get_drvdata(hdev);
+
+
+       if (kstrtou8(buf, 10, &sysfs_mode) || sysfs_mode > 2)
+               return -EINVAL;
+
+       mutex_lock(&led->lock);
+
+       if (sysfs_mode == 0)
+               led->mode = GT683R_LED_NORMAL;
+       else if (sysfs_mode == 1)
+               led->mode = GT683R_LED_AUDIO;
+       else
+               led->mode = GT683R_LED_BREATHING;
+
+       mutex_unlock(&led->lock);
+       schedule_work(&led->work);
+
+       return count;
+}
+
+static int gt683r_led_snd_msg(struct gt683r_led *led, u8 *msg)
+{
+       int ret;
+
+       ret = hid_hw_raw_request(led->hdev, msg[0], msg, GT683R_BUFFER_SIZE,
+                               HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
+       if (ret != GT683R_BUFFER_SIZE) {
+               hid_err(led->hdev,
+                       "failed to send set report request: %i\n", ret);
+               if (ret < 0)
+                       return ret;
+               return -EIO;
+       }
+
+       return 0;
+}
+
+static int gt683r_leds_set(struct gt683r_led *led, u8 leds)
+{
+       int ret;
+       u8 *buffer;
+
+       buffer = kzalloc(GT683R_BUFFER_SIZE, GFP_KERNEL);
+       if (!buffer)
+               return -ENOMEM;
+
+       buffer[0] = 0x01;
+       buffer[1] = 0x02;
+       buffer[2] = 0x30;
+       buffer[3] = leds;
+       ret = gt683r_led_snd_msg(led, buffer);
+
+       kfree(buffer);
+       return ret;
+}
+
+static int gt683r_mode_set(struct gt683r_led *led, u8 mode)
+{
+       int ret;
+       u8 *buffer;
+
+       buffer = kzalloc(GT683R_BUFFER_SIZE, GFP_KERNEL);
+       if (!buffer)
+               return -ENOMEM;
+
+       buffer[0] = 0x01;
+       buffer[1] = 0x02;
+       buffer[2] = 0x20;
+       buffer[3] = mode;
+       buffer[4] = 0x01;
+       ret = gt683r_led_snd_msg(led, buffer);
+
+       kfree(buffer);
+       return ret;
+}
+
+static void gt683r_led_work(struct work_struct *work)
+{
+       int i;
+       u8 leds = 0;
+       u8 mode;
+       struct gt683r_led *led = container_of(work, struct gt683r_led, work);
+
+       mutex_lock(&led->lock);
+
+       for (i = 0; i < GT683R_LED_COUNT; i++) {
+               if (led->brightnesses[i])
+                       leds |= BIT(i);
+       }
+
+       if (gt683r_leds_set(led, leds))
+               goto fail;
+
+       if (leds)
+               mode = led->mode;
+       else
+               mode = GT683R_LED_OFF;
+
+       gt683r_mode_set(led, mode);
+fail:
+       mutex_unlock(&led->lock);
+}
+
+static DEVICE_ATTR_RW(mode);
+
+static struct attribute *gt683r_led_attrs[] = {
+       &dev_attr_mode.attr,
+       NULL
+};
+
+static const struct attribute_group gt683r_led_group = {
+       .name = "gt683r",
+       .attrs = gt683r_led_attrs,
+};
+
+static const struct attribute_group *gt683r_led_groups[] = {
+       &gt683r_led_group,
+       NULL
+};
+
+static int gt683r_led_probe(struct hid_device *hdev,
+                       const struct hid_device_id *id)
+{
+       int i;
+       int ret;
+       int name_sz;
+       char *name;
+       struct gt683r_led *led;
+
+       led = devm_kzalloc(&hdev->dev, sizeof(*led), GFP_KERNEL);
+       if (!led)
+               return -ENOMEM;
+
+       mutex_init(&led->lock);
+       INIT_WORK(&led->work, gt683r_led_work);
+
+       led->mode = GT683R_LED_NORMAL;
+       led->hdev = hdev;
+       hid_set_drvdata(hdev, led);
+
+       ret = hid_parse(hdev);
+       if (ret) {
+               hid_err(hdev, "hid parsing failed\n");
+               return ret;
+       }
+
+       ret = hid_hw_start(hdev, HID_CONNECT_HIDRAW);
+       if (ret) {
+               hid_err(hdev, "hw start failed\n");
+               return ret;
+       }
+
+       for (i = 0; i < GT683R_LED_COUNT; i++) {
+               name_sz = strlen(dev_name(&hdev->dev)) +
+                               strlen(gt683r_panel_names[i]) + 3;
+
+               name = devm_kzalloc(&hdev->dev, name_sz, GFP_KERNEL);
+               if (!name) {
+                       ret = -ENOMEM;
+                       goto fail;
+               }
+
+               snprintf(name, name_sz, "%s::%s",
+                               dev_name(&hdev->dev), gt683r_panel_names[i]);
+               led->led_devs[i].name = name;
+               led->led_devs[i].max_brightness = 1;
+               led->led_devs[i].brightness_set = gt683r_brightness_set;
+               led->led_devs[i].groups = gt683r_led_groups;
+
+               ret = led_classdev_register(&hdev->dev, &led->led_devs[i]);
+               if (ret) {
+                       hid_err(hdev, "could not register led device\n");
+                       goto fail;
+               }
+       }
+
+       return 0;
+
+fail:
+       for (i = i - 1; i >= 0; i--)
+               led_classdev_unregister(&led->led_devs[i]);
+       hid_hw_stop(hdev);
+       return ret;
+}
+
+static void gt683r_led_remove(struct hid_device *hdev)
+{
+       int i;
+       struct gt683r_led *led = hid_get_drvdata(hdev);
+
+       for (i = 0; i < GT683R_LED_COUNT; i++)
+               led_classdev_unregister(&led->led_devs[i]);
+       flush_work(&led->work);
+       hid_hw_stop(hdev);
+}
+
+static struct hid_driver gt683r_led_driver = {
+       .probe = gt683r_led_probe,
+       .remove = gt683r_led_remove,
+       .name = "gt683r_led",
+       .id_table = gt683r_led_id,
+};
+
+module_hid_driver(gt683r_led_driver);
+
+MODULE_AUTHOR("Janne Kanniainen");
+MODULE_DESCRIPTION("MSI GT683R led driver");
+MODULE_LICENSE("GPL");
index d53bdda26207e4fccd46f8d7eaac5cb952687950..25cd674d6064887887a795c46518ebec68a90e46 100644 (file)
 #define USB_DEVICE_ID_GENIUS_KB29E     0x3004
 
 #define USB_VENDOR_ID_MSI              0x1770
-#define USB_DEVICE_ID_MSI_GX680R_LED_PANEL     0xff00
+#define USB_DEVICE_ID_MSI_GT683R_LED_PANEL 0xff00
 
 #define USB_VENDOR_ID_NATIONAL_SEMICONDUCTOR 0x0400
 #define USB_DEVICE_ID_N_S_HARMONY      0xc359
index 0dd568170d6efc291030440d938674f6d202697d..15225f3eaed1b841974308568a02b905be952d99 100644 (file)
@@ -74,7 +74,7 @@ static const struct hid_blacklist {
        { USB_VENDOR_ID_FORMOSA, USB_DEVICE_ID_FORMOSA_IR_RECEIVER, HID_QUIRK_NO_INIT_REPORTS },
        { USB_VENDOR_ID_FREESCALE, USB_DEVICE_ID_FREESCALE_MX28, HID_QUIRK_NOGET },
        { USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS, HID_QUIRK_NOGET },
-       { USB_VENDOR_ID_MSI, USB_DEVICE_ID_MSI_GX680R_LED_PANEL, HID_QUIRK_NO_INIT_REPORTS },
+       { USB_VENDOR_ID_MSI, USB_DEVICE_ID_MSI_GT683R_LED_PANEL, HID_QUIRK_NO_INIT_REPORTS },
        { USB_VENDOR_ID_NEXIO, USB_DEVICE_ID_NEXIO_MULTITOUCH_PTI0750, HID_QUIRK_NO_INIT_REPORTS },
        { USB_VENDOR_ID_NOVATEK, USB_DEVICE_ID_NOVATEK_MOUSE, HID_QUIRK_NO_INIT_REPORTS },
        { USB_VENDOR_ID_PENMOUNT, USB_DEVICE_ID_PENMOUNT_1610, HID_QUIRK_NOGET },
index 8e7a71487bb1652ac59c36e6329f21fa0c9656d8..05e033c981151277b62628510f31814ec46ce1ee 100644 (file)
@@ -183,6 +183,7 @@ static int ec_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg i2c_msgs[],
        u8 *request = NULL;
        u8 *response = NULL;
        int result;
+       struct cros_ec_command msg;
 
        request_len = ec_i2c_count_message(i2c_msgs, num);
        if (request_len < 0) {
@@ -218,10 +219,16 @@ static int ec_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg i2c_msgs[],
        }
 
        ec_i2c_construct_message(request, i2c_msgs, num, bus_num);
-       result = bus->ec->command_sendrecv(bus->ec, EC_CMD_I2C_PASSTHRU,
-                                          request, request_len,
-                                          response, response_len);
-       if (result)
+
+       msg.version = 0;
+       msg.command = EC_CMD_I2C_PASSTHRU;
+       msg.outdata = request;
+       msg.outsize = request_len;
+       msg.indata = response;
+       msg.insize = response_len;
+
+       result = bus->ec->cmd_xfer(bus->ec, &msg);
+       if (result < 0)
                goto exit;
 
        result = ec_i2c_parse_response(response, i2c_msgs, &num);
@@ -258,7 +265,7 @@ static int ec_i2c_probe(struct platform_device *pdev)
        u32 remote_bus;
        int err;
 
-       if (!ec->command_sendrecv) {
+       if (!ec->cmd_xfer) {
                dev_err(dev, "Missing sendrecv\n");
                return -EINVAL;
        }
index 408379669d3c2016194a4184d2cb1f0a532d9cfd..791781ade4e71535027dd9ba707e295fa9df57da 100644 (file)
@@ -24,8 +24,8 @@
 #include <linux/module.h>
 #include <linux/i2c.h>
 #include <linux/input.h>
+#include <linux/interrupt.h>
 #include <linux/kernel.h>
-#include <linux/notifier.h>
 #include <linux/platform_device.h>
 #include <linux/slab.h>
 #include <linux/input/matrix_keypad.h>
@@ -42,7 +42,6 @@
  * @dev: Device pointer
  * @idev: Input device
  * @ec: Top level ChromeOS device to use to talk to EC
- * @event_notifier: interrupt event notifier for transport devices
  */
 struct cros_ec_keyb {
        unsigned int rows;
@@ -55,7 +54,6 @@ struct cros_ec_keyb {
        struct device *dev;
        struct input_dev *idev;
        struct cros_ec_device *ec;
-       struct notifier_block notifier;
 };
 
 
@@ -173,41 +171,55 @@ static void cros_ec_keyb_process(struct cros_ec_keyb *ckdev,
        input_sync(ckdev->idev);
 }
 
-static int cros_ec_keyb_open(struct input_dev *dev)
-{
-       struct cros_ec_keyb *ckdev = input_get_drvdata(dev);
-
-       return blocking_notifier_chain_register(&ckdev->ec->event_notifier,
-                                               &ckdev->notifier);
-}
-
-static void cros_ec_keyb_close(struct input_dev *dev)
-{
-       struct cros_ec_keyb *ckdev = input_get_drvdata(dev);
-
-       blocking_notifier_chain_unregister(&ckdev->ec->event_notifier,
-                                          &ckdev->notifier);
-}
-
 static int cros_ec_keyb_get_state(struct cros_ec_keyb *ckdev, uint8_t *kb_state)
 {
-       return ckdev->ec->command_recv(ckdev->ec, EC_CMD_MKBP_STATE,
-                                         kb_state, ckdev->cols);
+       struct cros_ec_command msg = {
+               .version = 0,
+               .command = EC_CMD_MKBP_STATE,
+               .outdata = NULL,
+               .outsize = 0,
+               .indata = kb_state,
+               .insize = ckdev->cols,
+       };
+
+       return ckdev->ec->cmd_xfer(ckdev->ec, &msg);
 }
 
-static int cros_ec_keyb_work(struct notifier_block *nb,
-                    unsigned long state, void *_notify)
+static irqreturn_t cros_ec_keyb_irq(int irq, void *data)
 {
+       struct cros_ec_keyb *ckdev = data;
+       struct cros_ec_device *ec = ckdev->ec;
        int ret;
-       struct cros_ec_keyb *ckdev = container_of(nb, struct cros_ec_keyb,
-                                                   notifier);
        uint8_t kb_state[ckdev->cols];
 
+       if (device_may_wakeup(ec->dev))
+               pm_wakeup_event(ec->dev, 0);
+
        ret = cros_ec_keyb_get_state(ckdev, kb_state);
        if (ret >= 0)
                cros_ec_keyb_process(ckdev, kb_state, ret);
+       else
+               dev_err(ec->dev, "failed to get keyboard state: %d\n", ret);
 
-       return NOTIFY_DONE;
+       return IRQ_HANDLED;
+}
+
+static int cros_ec_keyb_open(struct input_dev *dev)
+{
+       struct cros_ec_keyb *ckdev = input_get_drvdata(dev);
+       struct cros_ec_device *ec = ckdev->ec;
+
+       return request_threaded_irq(ec->irq, NULL, cros_ec_keyb_irq,
+                                       IRQF_TRIGGER_LOW | IRQF_ONESHOT,
+                                       "cros_ec_keyb", ckdev);
+}
+
+static void cros_ec_keyb_close(struct input_dev *dev)
+{
+       struct cros_ec_keyb *ckdev = input_get_drvdata(dev);
+       struct cros_ec_device *ec = ckdev->ec;
+
+       free_irq(ec->irq, ckdev);
 }
 
 static int cros_ec_keyb_probe(struct platform_device *pdev)
@@ -238,8 +250,12 @@ static int cros_ec_keyb_probe(struct platform_device *pdev)
        if (!idev)
                return -ENOMEM;
 
+       if (!ec->irq) {
+               dev_err(dev, "no EC IRQ specified\n");
+               return -EINVAL;
+       }
+
        ckdev->ec = ec;
-       ckdev->notifier.notifier_call = cros_ec_keyb_work;
        ckdev->dev = dev;
        dev_set_drvdata(&pdev->dev, ckdev);
 
index 0b42118cbf8f53709debac3415b9d28b5e355a77..cb32e2b506b71956e08fd1d947d0584d427f4034 100644 (file)
@@ -558,6 +558,12 @@ static ssize_t lm8323_pwm_store_time(struct device *dev,
 }
 static DEVICE_ATTR(time, 0644, lm8323_pwm_show_time, lm8323_pwm_store_time);
 
+static struct attribute *lm8323_pwm_attrs[] = {
+       &dev_attr_time.attr,
+       NULL
+};
+ATTRIBUTE_GROUPS(lm8323_pwm);
+
 static int init_pwm(struct lm8323_chip *lm, int id, struct device *dev,
                    const char *name)
 {
@@ -580,16 +586,11 @@ static int init_pwm(struct lm8323_chip *lm, int id, struct device *dev,
        if (name) {
                pwm->cdev.name = name;
                pwm->cdev.brightness_set = lm8323_pwm_set_brightness;
+               pwm->cdev.groups = lm8323_pwm_groups;
                if (led_classdev_register(dev, &pwm->cdev) < 0) {
                        dev_err(dev, "couldn't register PWM %d\n", id);
                        return -1;
                }
-               if (device_create_file(pwm->cdev.dev,
-                                       &dev_attr_time) < 0) {
-                       dev_err(dev, "couldn't register time attribute\n");
-                       led_classdev_unregister(&pwm->cdev);
-                       return -1;
-               }
                pwm->enabled = true;
        }
 
@@ -753,11 +754,8 @@ fail3:
        device_remove_file(&client->dev, &dev_attr_disable_kp);
 fail2:
        while (--pwm >= 0)
-               if (lm->pwm[pwm].enabled) {
-                       device_remove_file(lm->pwm[pwm].cdev.dev,
-                                          &dev_attr_time);
+               if (lm->pwm[pwm].enabled)
                        led_classdev_unregister(&lm->pwm[pwm].cdev);
-               }
 fail1:
        input_free_device(idev);
        kfree(lm);
@@ -777,10 +775,8 @@ static int lm8323_remove(struct i2c_client *client)
        device_remove_file(&lm->client->dev, &dev_attr_disable_kp);
 
        for (i = 0; i < 3; i++)
-               if (lm->pwm[i].enabled) {
-                       device_remove_file(lm->pwm[i].cdev.dev, &dev_attr_time);
+               if (lm->pwm[i].enabled)
                        led_classdev_unregister(&lm->pwm[i].cdev);
-               }
 
        kfree(lm);
 
index 792da5ea6d128fd1f9a63ddf9e6ab2df9ffa9145..3ded3894623c18657afce7c745f34a777111a0aa 100644 (file)
@@ -35,7 +35,8 @@
 #include <linux/of_iommu.h>
 #include <linux/debugfs.h>
 #include <linux/seq_file.h>
-#include <linux/tegra-ahb.h>
+
+#include <soc/tegra/ahb.h>
 
 #include <asm/page.h>
 #include <asm/cacheflush.h>
index 4e230e7c76ee5dfc665ed382fbb5e1c787c1b1fb..b8632bf9a7f339dd8355f97867e1b39707e2a441 100644 (file)
@@ -28,7 +28,6 @@ config ARM_VIC
 config ARM_VIC_NR
        int
        default 4 if ARCH_S5PV210
-       default 3 if ARCH_S5PC100
        default 2
        depends on ARM_VIC
        help
index 3ae2bb8d9cf22e04cc967468823133f952e5c4ea..ccf58548b1612a4012219d7873a05b89a14a5ece 100644 (file)
@@ -14,6 +14,8 @@
 #include <asm/exception.h>
 #include <asm/mach/irq.h>
 
+#include "irqchip.h"
+
 #define IRQ_STATUS             0x00
 #define IRQ_RAW_STATUS         0x04
 #define IRQ_ENABLE_SET         0x08
@@ -26,6 +28,8 @@
 #define FIQ_ENABLE_SET         0x28
 #define FIQ_ENABLE_CLEAR       0x2C
 
+#define PIC_ENABLES             0x20   /* set interrupt pass through bits */
+
 /**
  * struct fpga_irq_data - irq data container for the FPGA IRQ controller
  * @base: memory offset in virtual memory
@@ -201,14 +205,26 @@ int __init fpga_irq_of_init(struct device_node *node,
 
        /* Some chips are cascaded from a parent IRQ */
        parent_irq = irq_of_parse_and_map(node, 0);
-       if (!parent_irq)
+       if (!parent_irq) {
+               set_handle_irq(fpga_handle_irq);
                parent_irq = -1;
+       }
 
        fpga_irq_init(base, node->name, 0, parent_irq, valid_mask, node);
 
        writel(clear_mask, base + IRQ_ENABLE_CLEAR);
        writel(clear_mask, base + FIQ_ENABLE_CLEAR);
 
+       /*
+        * On Versatile AB/PB, some secondary interrupts have a direct
+        * pass-thru to the primary controller for IRQs 20 and 22-31 which need
+        * to be enabled. See section 3.10 of the Versatile AB user guide.
+        */
+       if (of_device_is_compatible(node, "arm,versatile-sic"))
+               writel(0xffd00000, base + PIC_ENABLES);
+
        return 0;
 }
+IRQCHIP_DECLARE(arm_fpga, "arm,versatile-fpga-irq", fpga_irq_of_init);
+IRQCHIP_DECLARE(arm_fpga_sic, "arm,versatile-sic", fpga_irq_of_init);
 #endif
index a1b044e7eaad3be2c0ae9ff1225ea698839b4847..8c96e2ddf43bf035ce59d4453b2aac38e151cb7f 100644 (file)
@@ -32,14 +32,6 @@ config LEDS_88PM860X
          This option enables support for on-chip LED drivers found on Marvell
          Semiconductor 88PM8606 PMIC.
 
-config LEDS_ATMEL_PWM
-       tristate "LED Support using Atmel PWM outputs"
-       depends on LEDS_CLASS
-       depends on ATMEL_PWM
-       help
-         This option enables support for LEDs driven using outputs
-         of the dedicated PWM controller found on newer Atmel SOCs.
-
 config LEDS_LM3530
        tristate "LCD Backlight driver for LM3530"
        depends on LEDS_CLASS
@@ -143,6 +135,13 @@ config LEDS_SUNFIRE
          This option enables support for the Left, Middle, and Right
          LEDs on the I/O and CPU boards of SunFire UltraSPARC servers.
 
+config LEDS_IPAQ_MICRO
+       tristate "LED Support for the Compaq iPAQ h3xxx"
+       depends on MFD_IPAQ_MICRO
+       help
+         Choose this option if you want to use the notification LED on
+         Compaq/HP iPAQ h3100 and h3600.
+
 config LEDS_HP6XX
        tristate "LED Support for the HP Jornada 6xx"
        depends on LEDS_CLASS
index 79c5155199a7d409489d13633349d460123daa9f..d8cc5f2777de94e880da92d6fdde7894cf8877c8 100644 (file)
@@ -6,7 +6,6 @@ obj-$(CONFIG_LEDS_TRIGGERS)             += led-triggers.o
 
 # LED Platform Drivers
 obj-$(CONFIG_LEDS_88PM860X)            += leds-88pm860x.o
-obj-$(CONFIG_LEDS_ATMEL_PWM)           += leds-atmel-pwm.o
 obj-$(CONFIG_LEDS_BD2802)              += leds-bd2802.o
 obj-$(CONFIG_LEDS_LOCOMO)              += leds-locomo.o
 obj-$(CONFIG_LEDS_LM3530)              += leds-lm3530.o
@@ -31,6 +30,7 @@ obj-$(CONFIG_LEDS_LP8501)             += leds-lp8501.o
 obj-$(CONFIG_LEDS_LP8788)              += leds-lp8788.o
 obj-$(CONFIG_LEDS_TCA6507)             += leds-tca6507.o
 obj-$(CONFIG_LEDS_CLEVO_MAIL)          += leds-clevo-mail.o
+obj-$(CONFIG_LEDS_IPAQ_MICRO)          += leds-ipaq-micro.o
 obj-$(CONFIG_LEDS_HP6XX)               += leds-hp6xx.o
 obj-$(CONFIG_LEDS_OT200)               += leds-ot200.o
 obj-$(CONFIG_LEDS_FSG)                 += leds-fsg.o
index f37d63cf726bd52ed80db0c1effe1d9fc33db069..129729d35478bf5934cb69c90a688a9c43399759 100644 (file)
 #include <linux/list.h>
 #include <linux/spinlock.h>
 #include <linux/device.h>
-#include <linux/timer.h>
 #include <linux/err.h>
 #include <linux/ctype.h>
 #include <linux/leds.h>
+#include <linux/workqueue.h>
 #include "leds.h"
 
 static struct class *leds_class;
@@ -97,9 +97,10 @@ static const struct attribute_group *led_groups[] = {
        NULL,
 };
 
-static void led_timer_function(unsigned long data)
+static void led_work_function(struct work_struct *ws)
 {
-       struct led_classdev *led_cdev = (void *)data;
+       struct led_classdev *led_cdev =
+               container_of(ws, struct led_classdev, blink_work.work);
        unsigned long brightness;
        unsigned long delay;
 
@@ -143,7 +144,8 @@ static void led_timer_function(unsigned long data)
                }
        }
 
-       mod_timer(&led_cdev->blink_timer, jiffies + msecs_to_jiffies(delay));
+       queue_delayed_work(system_wq, &led_cdev->blink_work,
+                          msecs_to_jiffies(delay));
 }
 
 static void set_brightness_delayed(struct work_struct *ws)
@@ -210,8 +212,9 @@ static const struct dev_pm_ops leds_class_dev_pm_ops = {
  */
 int led_classdev_register(struct device *parent, struct led_classdev *led_cdev)
 {
-       led_cdev->dev = device_create(leds_class, parent, 0, led_cdev,
-                                     "%s", led_cdev->name);
+       led_cdev->dev = device_create_with_groups(leds_class, parent, 0,
+                                       led_cdev, led_cdev->groups,
+                                       "%s", led_cdev->name);
        if (IS_ERR(led_cdev->dev))
                return PTR_ERR(led_cdev->dev);
 
@@ -230,9 +233,7 @@ int led_classdev_register(struct device *parent, struct led_classdev *led_cdev)
 
        INIT_WORK(&led_cdev->set_brightness_work, set_brightness_delayed);
 
-       init_timer(&led_cdev->blink_timer);
-       led_cdev->blink_timer.function = led_timer_function;
-       led_cdev->blink_timer.data = (unsigned long)led_cdev;
+       INIT_DELAYED_WORK(&led_cdev->blink_work, led_work_function);
 
 #ifdef CONFIG_LEDS_TRIGGERS
        led_trigger_set_default(led_cdev);
index 71b40d3bf77604e32829f391b6e804bbeefb0cf1..4bb116867b88af7249c1576e614e8ad0685f7945 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/module.h>
 #include <linux/rwsem.h>
 #include <linux/leds.h>
+#include <linux/workqueue.h>
 #include "leds.h"
 
 DECLARE_RWSEM(leds_list_lock);
@@ -51,7 +52,7 @@ static void led_set_software_blink(struct led_classdev *led_cdev,
                return;
        }
 
-       mod_timer(&led_cdev->blink_timer, jiffies + 1);
+       queue_delayed_work(system_wq, &led_cdev->blink_work, 1);
 }
 
 
@@ -75,7 +76,7 @@ void led_blink_set(struct led_classdev *led_cdev,
                   unsigned long *delay_on,
                   unsigned long *delay_off)
 {
-       del_timer_sync(&led_cdev->blink_timer);
+       cancel_delayed_work_sync(&led_cdev->blink_work);
 
        led_cdev->flags &= ~LED_BLINK_ONESHOT;
        led_cdev->flags &= ~LED_BLINK_ONESHOT_STOP;
@@ -90,7 +91,7 @@ void led_blink_set_oneshot(struct led_classdev *led_cdev,
                           int invert)
 {
        if ((led_cdev->flags & LED_BLINK_ONESHOT) &&
-            timer_pending(&led_cdev->blink_timer))
+            delayed_work_pending(&led_cdev->blink_work))
                return;
 
        led_cdev->flags |= LED_BLINK_ONESHOT;
@@ -107,7 +108,7 @@ EXPORT_SYMBOL(led_blink_set_oneshot);
 
 void led_stop_software_blink(struct led_classdev *led_cdev)
 {
-       del_timer_sync(&led_cdev->blink_timer);
+       cancel_delayed_work_sync(&led_cdev->blink_work);
        led_cdev->blink_delay_on = 0;
        led_cdev->blink_delay_off = 0;
 }
@@ -116,7 +117,7 @@ EXPORT_SYMBOL_GPL(led_stop_software_blink);
 void led_set_brightness(struct led_classdev *led_cdev,
                        enum led_brightness brightness)
 {
-       /* delay brightness setting if need to stop soft-blink timer */
+       /* delay brightness setting if need to stop soft-blink work */
        if (led_cdev->blink_delay_on || led_cdev->blink_delay_off) {
                led_cdev->delayed_set_value = brightness;
                schedule_work(&led_cdev->set_brightness_work);
diff --git a/drivers/leds/leds-atmel-pwm.c b/drivers/leds/leds-atmel-pwm.c
deleted file mode 100644 (file)
index 56cec8d..0000000
+++ /dev/null
@@ -1,149 +0,0 @@
-#include <linux/kernel.h>
-#include <linux/platform_device.h>
-#include <linux/leds.h>
-#include <linux/io.h>
-#include <linux/atmel_pwm.h>
-#include <linux/slab.h>
-#include <linux/module.h>
-
-
-struct pwmled {
-       struct led_classdev     cdev;
-       struct pwm_channel      pwmc;
-       struct gpio_led         *desc;
-       u32                     mult;
-       u8                      active_low;
-};
-
-
-/*
- * For simplicity, we use "brightness" as if it were a linear function
- * of PWM duty cycle.  However, a logarithmic function of duty cycle is
- * probably a better match for perceived brightness: two is half as bright
- * as four, four is half as bright as eight, etc
- */
-static void pwmled_brightness(struct led_classdev *cdev, enum led_brightness b)
-{
-       struct pwmled            *led;
-
-       /* update the duty cycle for the *next* period */
-       led = container_of(cdev, struct pwmled, cdev);
-       pwm_channel_writel(&led->pwmc, PWM_CUPD, led->mult * (unsigned) b);
-}
-
-/*
- * NOTE:  we reuse the platform_data structure of GPIO leds,
- * but repurpose its "gpio" number as a PWM channel number.
- */
-static int pwmled_probe(struct platform_device *pdev)
-{
-       const struct gpio_led_platform_data     *pdata;
-       struct pwmled                           *leds;
-       int                                     i;
-       int                                     status;
-
-       pdata = dev_get_platdata(&pdev->dev);
-       if (!pdata || pdata->num_leds < 1)
-               return -ENODEV;
-
-       leds = devm_kzalloc(&pdev->dev, pdata->num_leds * sizeof(*leds),
-                       GFP_KERNEL);
-       if (!leds)
-               return -ENOMEM;
-
-       for (i = 0; i < pdata->num_leds; i++) {
-               struct pwmled           *led = leds + i;
-               const struct gpio_led   *dat = pdata->leds + i;
-               u32                     tmp;
-
-               led->cdev.name = dat->name;
-               led->cdev.brightness = LED_OFF;
-               led->cdev.brightness_set = pwmled_brightness;
-               led->cdev.default_trigger = dat->default_trigger;
-
-               led->active_low = dat->active_low;
-
-               status = pwm_channel_alloc(dat->gpio, &led->pwmc);
-               if (status < 0)
-                       goto err;
-
-               /*
-                * Prescale clock by 2^x, so PWM counts in low MHz.
-                * Start each cycle with the LED active, so increasing
-                * the duty cycle gives us more time on (== brighter).
-                */
-               tmp = 5;
-               if (!led->active_low)
-                       tmp |= PWM_CPR_CPOL;
-               pwm_channel_writel(&led->pwmc, PWM_CMR, tmp);
-
-               /*
-                * Pick a period so PWM cycles at 100+ Hz; and a multiplier
-                * for scaling duty cycle:  brightness * mult.
-                */
-               tmp = (led->pwmc.mck / (1 << 5)) / 100;
-               tmp /= 255;
-               led->mult = tmp;
-               pwm_channel_writel(&led->pwmc, PWM_CDTY,
-                               led->cdev.brightness * 255);
-               pwm_channel_writel(&led->pwmc, PWM_CPRD,
-                               LED_FULL * tmp);
-
-               pwm_channel_enable(&led->pwmc);
-
-               /* Hand it over to the LED framework */
-               status = led_classdev_register(&pdev->dev, &led->cdev);
-               if (status < 0) {
-                       pwm_channel_free(&led->pwmc);
-                       goto err;
-               }
-       }
-
-       platform_set_drvdata(pdev, leds);
-       return 0;
-
-err:
-       if (i > 0) {
-               for (i = i - 1; i >= 0; i--) {
-                       led_classdev_unregister(&leds[i].cdev);
-                       pwm_channel_free(&leds[i].pwmc);
-               }
-       }
-
-       return status;
-}
-
-static int pwmled_remove(struct platform_device *pdev)
-{
-       const struct gpio_led_platform_data     *pdata;
-       struct pwmled                           *leds;
-       unsigned                                i;
-
-       pdata = dev_get_platdata(&pdev->dev);
-       leds = platform_get_drvdata(pdev);
-
-       for (i = 0; i < pdata->num_leds; i++) {
-               struct pwmled           *led = leds + i;
-
-               led_classdev_unregister(&led->cdev);
-               pwm_channel_free(&led->pwmc);
-       }
-
-       return 0;
-}
-
-static struct platform_driver pwmled_driver = {
-       .driver = {
-               .name =         "leds-atmel-pwm",
-               .owner =        THIS_MODULE,
-       },
-       /* REVISIT add suspend() and resume() methods */
-       .probe =        pwmled_probe,
-       .remove =       pwmled_remove,
-};
-
-module_platform_driver(pwmled_driver);
-
-MODULE_DESCRIPTION("Driver for LEDs with PWM-controlled brightness");
-MODULE_LICENSE("GPL");
-MODULE_ALIAS("platform:leds-atmel-pwm");
diff --git a/drivers/leds/leds-ipaq-micro.c b/drivers/leds/leds-ipaq-micro.c
new file mode 100644 (file)
index 0000000..3776f51
--- /dev/null
@@ -0,0 +1,141 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * h3xxx atmel micro companion support, notification LED subdevice
+ *
+ * Author : Linus Walleij <linus.walleij@linaro.org>
+ */
+
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/mfd/ipaq-micro.h>
+#include <linux/leds.h>
+
+#define LED_YELLOW     0x00
+#define LED_GREEN      0x01
+
+#define LED_EN          (1 << 4)        /* LED ON/OFF 0:off, 1:on                       */
+#define LED_AUTOSTOP    (1 << 5)        /* LED ON/OFF auto stop set 0:disable, 1:enable */
+#define LED_ALWAYS      (1 << 6)        /* LED Interrupt Mask 0:No mask, 1:mask         */
+
+static void micro_leds_brightness_set(struct led_classdev *led_cdev,
+                                     enum led_brightness value)
+{
+       struct ipaq_micro *micro = dev_get_drvdata(led_cdev->dev->parent->parent);
+       /*
+        * In this message:
+        * Byte 0 = LED color: 0 = yellow, 1 = green
+        *          yellow LED is always ~30 blinks per minute
+        * Byte 1 = duration (flags?) appears to be ignored
+        * Byte 2 = green ontime in 1/10 sec (deciseconds)
+        *          1 = 1/10 second
+        *          0 = 256/10 second
+        * Byte 3 = green offtime in 1/10 sec (deciseconds)
+        *          1 = 1/10 second
+        *          0 = 256/10 seconds
+        */
+       struct ipaq_micro_msg msg = {
+               .id = MSG_NOTIFY_LED,
+               .tx_len = 4,
+       };
+
+       msg.tx_data[0] = LED_GREEN;
+       msg.tx_data[1] = 0;
+       if (value) {
+               msg.tx_data[2] = 0; /* Duty cycle 256 */
+               msg.tx_data[3] = 1;
+       } else {
+               msg.tx_data[2] = 1;
+               msg.tx_data[3] = 0; /* Duty cycle 256 */
+       }
+       ipaq_micro_tx_msg_sync(micro, &msg);
+}
+
+/* Maximum duty cycle in ms 256/10 sec = 25600 ms */
+#define IPAQ_LED_MAX_DUTY 25600
+
+static int micro_leds_blink_set(struct led_classdev *led_cdev,
+                               unsigned long *delay_on,
+                               unsigned long *delay_off)
+{
+       struct ipaq_micro *micro = dev_get_drvdata(led_cdev->dev->parent->parent);
+       /*
+        * In this message:
+        * Byte 0 = LED color: 0 = yellow, 1 = green
+        *          yellow LED is always ~30 blinks per minute
+        * Byte 1 = duration (flags?) appears to be ignored
+        * Byte 2 = green ontime in 1/10 sec (deciseconds)
+        *          1 = 1/10 second
+        *          0 = 256/10 second
+        * Byte 3 = green offtime in 1/10 sec (deciseconds)
+        *          1 = 1/10 second
+        *          0 = 256/10 seconds
+        */
+       struct ipaq_micro_msg msg = {
+               .id = MSG_NOTIFY_LED,
+               .tx_len = 4,
+       };
+
+       msg.tx_data[0] = LED_GREEN;
+        if (*delay_on > IPAQ_LED_MAX_DUTY ||
+           *delay_off > IPAQ_LED_MAX_DUTY)
+                return -EINVAL;
+
+        if (*delay_on == 0 && *delay_off == 0) {
+                *delay_on = 100;
+                *delay_off = 100;
+        }
+
+       msg.tx_data[1] = 0;
+       if (*delay_on >= IPAQ_LED_MAX_DUTY)
+               msg.tx_data[2] = 0;
+       else
+               msg.tx_data[2] = (u8) DIV_ROUND_CLOSEST(*delay_on, 100);
+       if (*delay_off >= IPAQ_LED_MAX_DUTY)
+               msg.tx_data[3] = 0;
+       else
+               msg.tx_data[3] = (u8) DIV_ROUND_CLOSEST(*delay_off, 100);
+       return ipaq_micro_tx_msg_sync(micro, &msg);
+}
+
+static struct led_classdev micro_led = {
+       .name                   = "led-ipaq-micro",
+       .brightness_set         = micro_leds_brightness_set,
+       .blink_set              = micro_leds_blink_set,
+       .flags                  = LED_CORE_SUSPENDRESUME,
+};
+
+static int micro_leds_probe(struct platform_device *pdev)
+{
+       int ret;
+
+       ret = led_classdev_register(&pdev->dev, &micro_led);
+       if (ret) {
+               dev_err(&pdev->dev, "registering led failed: %d\n", ret);
+               return ret;
+       }
+       dev_info(&pdev->dev, "iPAQ micro notification LED driver\n");
+
+       return 0;
+}
+
+static int micro_leds_remove(struct platform_device *pdev)
+{
+       led_classdev_unregister(&micro_led);
+       return 0;
+}
+
+static struct platform_driver micro_leds_device_driver = {
+       .driver = {
+               .name    = "ipaq-micro-leds",
+       },
+       .probe   = micro_leds_probe,
+       .remove  = micro_leds_remove,
+};
+module_platform_driver(micro_leds_device_driver);
+
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("driver for iPAQ Atmel micro leds");
+MODULE_ALIAS("platform:ipaq-micro-leds");
index 652368c2ea9a5b9ca1d806de4057747a2c2fea0a..91325de3cd3305ad589820ff07bf44cd99e36a4a 100644 (file)
@@ -400,6 +400,12 @@ static ssize_t lm3530_mode_set(struct device *dev, struct device_attribute
 }
 static DEVICE_ATTR(mode, 0644, lm3530_mode_get, lm3530_mode_set);
 
+static struct attribute *lm3530_attrs[] = {
+       &dev_attr_mode.attr,
+       NULL
+};
+ATTRIBUTE_GROUPS(lm3530);
+
 static int lm3530_probe(struct i2c_client *client,
                           const struct i2c_device_id *id)
 {
@@ -436,6 +442,7 @@ static int lm3530_probe(struct i2c_client *client,
        drvdata->led_dev.name = LM3530_LED_DEV;
        drvdata->led_dev.brightness_set = lm3530_brightness_set;
        drvdata->led_dev.max_brightness = MAX_BRIGHTNESS;
+       drvdata->led_dev.groups = lm3530_groups;
 
        i2c_set_clientdata(client, drvdata);
 
@@ -461,26 +468,13 @@ static int lm3530_probe(struct i2c_client *client,
                return err;
        }
 
-       err = device_create_file(drvdata->led_dev.dev, &dev_attr_mode);
-       if (err < 0) {
-               dev_err(&client->dev, "File device creation failed: %d\n", err);
-               err = -ENODEV;
-               goto err_create_file;
-       }
-
        return 0;
-
-err_create_file:
-       led_classdev_unregister(&drvdata->led_dev);
-       return err;
 }
 
 static int lm3530_remove(struct i2c_client *client)
 {
        struct lm3530_data *drvdata = i2c_get_clientdata(client);
 
-       device_remove_file(drvdata->led_dev.dev, &dev_attr_mode);
-
        lm3530_led_disable(drvdata);
        led_classdev_unregister(&drvdata->led_dev);
        return 0;
index e2c642c1169b93aef41014fc0a2100bb8a7f8057..cbf61a40137da7a6f022a22eb7afa5fa0e142e12 100644 (file)
@@ -645,6 +645,11 @@ static struct attribute_group lm3533_led_attribute_group = {
        .attrs          = lm3533_led_attributes
 };
 
+static const struct attribute_group *lm3533_led_attribute_groups[] = {
+       &lm3533_led_attribute_group,
+       NULL
+};
+
 static int lm3533_led_setup(struct lm3533_led *led,
                                        struct lm3533_led_platform_data *pdata)
 {
@@ -692,6 +697,7 @@ static int lm3533_led_probe(struct platform_device *pdev)
        led->cdev.brightness_get = lm3533_led_get;
        led->cdev.blink_set = lm3533_led_blink_set;
        led->cdev.brightness = LED_OFF;
+       led->cdev.groups = lm3533_led_attribute_groups,
        led->id = pdev->id;
 
        mutex_init(&led->mutex);
@@ -715,25 +721,16 @@ static int lm3533_led_probe(struct platform_device *pdev)
 
        led->cb.dev = led->cdev.dev;
 
-       ret = sysfs_create_group(&led->cdev.dev->kobj,
-                                               &lm3533_led_attribute_group);
-       if (ret < 0) {
-               dev_err(&pdev->dev, "failed to create sysfs attributes\n");
-               goto err_unregister;
-       }
-
        ret = lm3533_led_setup(led, pdata);
        if (ret)
-               goto err_sysfs_remove;
+               goto err_unregister;
 
        ret = lm3533_ctrlbank_enable(&led->cb);
        if (ret)
-               goto err_sysfs_remove;
+               goto err_unregister;
 
        return 0;
 
-err_sysfs_remove:
-       sysfs_remove_group(&led->cdev.dev->kobj, &lm3533_led_attribute_group);
 err_unregister:
        led_classdev_unregister(&led->cdev);
        flush_work(&led->work);
@@ -748,7 +745,6 @@ static int lm3533_led_remove(struct platform_device *pdev)
        dev_dbg(&pdev->dev, "%s\n", __func__);
 
        lm3533_ctrlbank_disable(&led->cb);
-       sysfs_remove_group(&led->cdev.dev->kobj, &lm3533_led_attribute_group);
        led_classdev_unregister(&led->cdev);
        flush_work(&led->work);
 
index 591eb5e58ae3f80ad3766cee4ded90917cf167b0..f5112cb2d9915359957b2b90f432dee11918778b 100644 (file)
@@ -413,6 +413,12 @@ out:
 
 static DEVICE_ATTR(pattern, S_IWUSR, NULL, lm3556_indicator_pattern_store);
 
+static struct attribute *lm355x_indicator_attrs[] = {
+       &dev_attr_pattern.attr,
+       NULL
+};
+ATTRIBUTE_GROUPS(lm355x_indicator);
+
 static const struct regmap_config lm355x_regmap = {
        .reg_bits = 8,
        .val_bits = 8,
@@ -501,25 +507,18 @@ static int lm355x_probe(struct i2c_client *client,
        else
                chip->cdev_indicator.max_brightness = 8;
        chip->cdev_indicator.brightness_set = lm355x_indicator_brightness_set;
+       /* indicator pattern control only for LM3556 */
+       if (id->driver_data == CHIP_LM3556)
+               chip->cdev_indicator.groups = lm355x_indicator_groups;
        err = led_classdev_register((struct device *)
                                    &client->dev, &chip->cdev_indicator);
        if (err < 0)
                goto err_create_indicator_file;
-       /* indicator pattern control only for LM3554 */
-       if (id->driver_data == CHIP_LM3556) {
-               err =
-                   device_create_file(chip->cdev_indicator.dev,
-                                      &dev_attr_pattern);
-               if (err < 0)
-                       goto err_create_pattern_file;
-       }
 
        dev_info(&client->dev, "%s is initialized\n",
                 lm355x_name[id->driver_data]);
        return 0;
 
-err_create_pattern_file:
-       led_classdev_unregister(&chip->cdev_indicator);
 err_create_indicator_file:
        led_classdev_unregister(&chip->cdev_torch);
 err_create_torch_file:
@@ -534,8 +533,6 @@ static int lm355x_remove(struct i2c_client *client)
        struct lm355x_reg_data *preg = chip->regs;
 
        regmap_write(chip->regmap, preg[REG_OPMODE].regno, 0);
-       if (chip->type == CHIP_LM3556)
-               device_remove_file(chip->cdev_indicator.dev, &dev_attr_pattern);
        led_classdev_unregister(&chip->cdev_indicator);
        flush_work(&chip->work_indicator);
        led_classdev_unregister(&chip->cdev_torch);
index ceb6b3cde6fe8a3dd261d9b94a94cd0c8cebb7b3..d3dec0132769dd1d2e648a1bb69d5a78029a1461 100644 (file)
@@ -313,6 +313,18 @@ static const struct regmap_config lm3642_regmap = {
        .max_register = REG_MAX,
 };
 
+static struct attribute *lm3642_flash_attrs[] = {
+       &dev_attr_strobe_pin.attr,
+       NULL
+};
+ATTRIBUTE_GROUPS(lm3642_flash);
+
+static struct attribute *lm3642_torch_attrs[] = {
+       &dev_attr_torch_pin.attr,
+       NULL
+};
+ATTRIBUTE_GROUPS(lm3642_torch);
+
 static int lm3642_probe(struct i2c_client *client,
                                  const struct i2c_device_id *id)
 {
@@ -364,17 +376,13 @@ static int lm3642_probe(struct i2c_client *client,
        chip->cdev_flash.max_brightness = 16;
        chip->cdev_flash.brightness_set = lm3642_strobe_brightness_set;
        chip->cdev_flash.default_trigger = "flash";
+       chip->cdev_flash.groups = lm3642_flash_groups,
        err = led_classdev_register((struct device *)
                                    &client->dev, &chip->cdev_flash);
        if (err < 0) {
                dev_err(chip->dev, "failed to register flash\n");
                goto err_out;
        }
-       err = device_create_file(chip->cdev_flash.dev, &dev_attr_strobe_pin);
-       if (err < 0) {
-               dev_err(chip->dev, "failed to create strobe-pin file\n");
-               goto err_create_flash_pin_file;
-       }
 
        /* torch */
        INIT_WORK(&chip->work_torch, lm3642_deferred_torch_brightness_set);
@@ -382,17 +390,13 @@ static int lm3642_probe(struct i2c_client *client,
        chip->cdev_torch.max_brightness = 8;
        chip->cdev_torch.brightness_set = lm3642_torch_brightness_set;
        chip->cdev_torch.default_trigger = "torch";
+       chip->cdev_torch.groups = lm3642_torch_groups,
        err = led_classdev_register((struct device *)
                                    &client->dev, &chip->cdev_torch);
        if (err < 0) {
                dev_err(chip->dev, "failed to register torch\n");
                goto err_create_torch_file;
        }
-       err = device_create_file(chip->cdev_torch.dev, &dev_attr_torch_pin);
-       if (err < 0) {
-               dev_err(chip->dev, "failed to create torch-pin file\n");
-               goto err_create_torch_pin_file;
-       }
 
        /* indicator */
        INIT_WORK(&chip->work_indicator,
@@ -411,12 +415,8 @@ static int lm3642_probe(struct i2c_client *client,
        return 0;
 
 err_create_indicator_file:
-       device_remove_file(chip->cdev_torch.dev, &dev_attr_torch_pin);
-err_create_torch_pin_file:
        led_classdev_unregister(&chip->cdev_torch);
 err_create_torch_file:
-       device_remove_file(chip->cdev_flash.dev, &dev_attr_strobe_pin);
-err_create_flash_pin_file:
        led_classdev_unregister(&chip->cdev_flash);
 err_out:
        return err;
@@ -428,10 +428,8 @@ static int lm3642_remove(struct i2c_client *client)
 
        led_classdev_unregister(&chip->cdev_indicator);
        flush_work(&chip->work_indicator);
-       device_remove_file(chip->cdev_torch.dev, &dev_attr_torch_pin);
        led_classdev_unregister(&chip->cdev_torch);
        flush_work(&chip->work_torch);
-       device_remove_file(chip->cdev_flash.dev, &dev_attr_strobe_pin);
        led_classdev_unregister(&chip->cdev_flash);
        flush_work(&chip->work_flash);
        regmap_write(chip->regmap, REG_ENABLE, 0);
index 88317b4f7bf3abf70e4337a12aa682646e8a2e56..77c26bc32eed561a26c4ccb45b3238e60184d017 100644 (file)
@@ -127,15 +127,12 @@ static DEVICE_ATTR(led_current, S_IRUGO | S_IWUSR, lp55xx_show_current,
                lp55xx_store_current);
 static DEVICE_ATTR(max_current, S_IRUGO , lp55xx_show_max_current, NULL);
 
-static struct attribute *lp55xx_led_attributes[] = {
+static struct attribute *lp55xx_led_attrs[] = {
        &dev_attr_led_current.attr,
        &dev_attr_max_current.attr,
        NULL,
 };
-
-static struct attribute_group lp55xx_led_attr_group = {
-       .attrs = lp55xx_led_attributes
-};
+ATTRIBUTE_GROUPS(lp55xx_led);
 
 static void lp55xx_set_brightness(struct led_classdev *cdev,
                             enum led_brightness brightness)
@@ -176,6 +173,7 @@ static int lp55xx_init_led(struct lp55xx_led *led,
        }
 
        led->cdev.brightness_set = lp55xx_set_brightness;
+       led->cdev.groups = lp55xx_led_groups;
 
        if (pdata->led_config[chan].name) {
                led->cdev.name = pdata->led_config[chan].name;
@@ -185,24 +183,12 @@ static int lp55xx_init_led(struct lp55xx_led *led,
                led->cdev.name = name;
        }
 
-       /*
-        * register led class device for each channel and
-        * add device attributes
-        */
-
        ret = led_classdev_register(dev, &led->cdev);
        if (ret) {
                dev_err(dev, "led register err: %d\n", ret);
                return ret;
        }
 
-       ret = sysfs_create_group(&led->cdev.dev->kobj, &lp55xx_led_attr_group);
-       if (ret) {
-               dev_err(dev, "led sysfs err: %d\n", ret);
-               led_classdev_unregister(&led->cdev);
-               return ret;
-       }
-
        return 0;
 }
 
index f449a8bdddc7ced48f3408a2dde6b810dde68ce7..607bc2755aba7c6ac3ac15910c6aee8bca0104a3 100644 (file)
@@ -229,6 +229,12 @@ static ssize_t max8997_led_store_mode(struct device *dev,
 
 static DEVICE_ATTR(mode, 0644, max8997_led_show_mode, max8997_led_store_mode);
 
+static struct attribute *max8997_attrs[] = {
+       &dev_attr_mode.attr,
+       NULL
+};
+ATTRIBUTE_GROUPS(max8997);
+
 static int max8997_led_probe(struct platform_device *pdev)
 {
        struct max8997_dev *iodev = dev_get_drvdata(pdev->dev.parent);
@@ -253,6 +259,7 @@ static int max8997_led_probe(struct platform_device *pdev)
        led->cdev.brightness_set = max8997_led_brightness_set;
        led->cdev.flags |= LED_CORE_SUSPENDRESUME;
        led->cdev.brightness = 0;
+       led->cdev.groups = max8997_groups;
        led->iodev = iodev;
 
        /* initialize mode and brightness according to platform_data */
@@ -281,14 +288,6 @@ static int max8997_led_probe(struct platform_device *pdev)
        if (ret < 0)
                return ret;
 
-       ret = device_create_file(led->cdev.dev, &dev_attr_mode);
-       if (ret != 0) {
-               dev_err(&pdev->dev,
-                       "failed to create file: %d\n", ret);
-               led_classdev_unregister(&led->cdev);
-               return ret;
-       }
-
        return 0;
 }
 
@@ -296,7 +295,6 @@ static int max8997_led_remove(struct platform_device *pdev)
 {
        struct max8997_led *led = platform_get_drvdata(pdev);
 
-       device_remove_file(led->cdev.dev, &dev_attr_mode);
        led_classdev_unregister(&led->cdev);
 
        return 0;
index e97f443a6e07720f9652a1fae1dc0e25e8f36aa4..64fde485dcaa2804ee21f08a7f314fb577b8eb34 100644 (file)
@@ -293,10 +293,14 @@ static ssize_t netxbig_led_sata_show(struct device *dev,
 
 static DEVICE_ATTR(sata, 0644, netxbig_led_sata_show, netxbig_led_sata_store);
 
+static struct attribute *netxbig_led_attrs[] = {
+       &dev_attr_sata.attr,
+       NULL
+};
+ATTRIBUTE_GROUPS(netxbig_led);
+
 static void delete_netxbig_led(struct netxbig_led_data *led_dat)
 {
-       if (led_dat->mode_val[NETXBIG_LED_SATA] != NETXBIG_LED_INVALID_MODE)
-               device_remove_file(led_dat->cdev.dev, &dev_attr_sata);
        led_classdev_unregister(&led_dat->cdev);
 }
 
@@ -306,7 +310,6 @@ create_netxbig_led(struct platform_device *pdev,
                   const struct netxbig_led *template)
 {
        struct netxbig_led_platform_data *pdata = dev_get_platdata(&pdev->dev);
-       int ret;
 
        spin_lock_init(&led_dat->lock);
        led_dat->gpio_ext = pdata->gpio_ext;
@@ -327,6 +330,12 @@ create_netxbig_led(struct platform_device *pdev,
        led_dat->sata = 0;
        led_dat->cdev.brightness = LED_OFF;
        led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME;
+       /*
+        * If available, expose the SATA activity blink capability through
+        * a "sata" sysfs attribute.
+        */
+       if (led_dat->mode_val[NETXBIG_LED_SATA] != NETXBIG_LED_INVALID_MODE)
+               led_dat->cdev.groups = netxbig_led_groups;
        led_dat->mode_addr = template->mode_addr;
        led_dat->mode_val = template->mode_val;
        led_dat->bright_addr = template->bright_addr;
@@ -334,21 +343,7 @@ create_netxbig_led(struct platform_device *pdev,
        led_dat->timer = pdata->timer;
        led_dat->num_timer = pdata->num_timer;
 
-       ret = led_classdev_register(&pdev->dev, &led_dat->cdev);
-       if (ret < 0)
-               return ret;
-
-       /*
-        * If available, expose the SATA activity blink capability through
-        * a "sata" sysfs attribute.
-        */
-       if (led_dat->mode_val[NETXBIG_LED_SATA] != NETXBIG_LED_INVALID_MODE) {
-               ret = device_create_file(led_dat->cdev.dev, &dev_attr_sata);
-               if (ret)
-                       led_classdev_unregister(&led_dat->cdev);
-       }
-
-       return ret;
+       return led_classdev_register(&pdev->dev, &led_dat->cdev);
 }
 
 static int netxbig_led_probe(struct platform_device *pdev)
index efa625883c836359e42638285cdbc2d52cdb7220..231993d1fe21ad891e034c7fa22b3cbfb3e94b9a 100644 (file)
@@ -185,6 +185,12 @@ static ssize_t ns2_led_sata_show(struct device *dev,
 
 static DEVICE_ATTR(sata, 0644, ns2_led_sata_show, ns2_led_sata_store);
 
+static struct attribute *ns2_led_attrs[] = {
+       &dev_attr_sata.attr,
+       NULL
+};
+ATTRIBUTE_GROUPS(ns2_led);
+
 static int
 create_ns2_led(struct platform_device *pdev, struct ns2_led_data *led_dat,
               const struct ns2_led *template)
@@ -219,6 +225,7 @@ create_ns2_led(struct platform_device *pdev, struct ns2_led_data *led_dat,
        led_dat->cdev.blink_set = NULL;
        led_dat->cdev.brightness_set = ns2_led_set;
        led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME;
+       led_dat->cdev.groups = ns2_led_groups;
        led_dat->cmd = template->cmd;
        led_dat->slow = template->slow;
 
@@ -235,20 +242,11 @@ create_ns2_led(struct platform_device *pdev, struct ns2_led_data *led_dat,
        if (ret < 0)
                return ret;
 
-       ret = device_create_file(led_dat->cdev.dev, &dev_attr_sata);
-       if (ret < 0)
-               goto err_free_cdev;
-
        return 0;
-
-err_free_cdev:
-       led_classdev_unregister(&led_dat->cdev);
-       return ret;
 }
 
 static void delete_ns2_led(struct ns2_led_data *led_dat)
 {
-       device_remove_file(led_dat->cdev.dev, &dev_attr_sata);
        led_classdev_unregister(&led_dat->cdev);
 }
 
index 82589c0a5689ff7abd033bd73b11ab42198ea0b9..f110b4c456baa77f632c610fd8e024c94eb5b3fe 100644 (file)
@@ -12,7 +12,7 @@
  * directory of this archive for more details.
  *
  * LED driver for the PCA9633 I2C LED driver (7-bit slave address 0x62)
- * LED driver for the PCA9634 I2C LED driver (7-bit slave address set by hw.)
+ * LED driver for the PCA9634/5 I2C LED driver (7-bit slave address set by hw.)
  *
  * Note that hardware blinking violates the leds infrastructure driver
  * interface since the hardware only supports blinking all LEDs with the
@@ -52,6 +52,7 @@
 enum pca963x_type {
        pca9633,
        pca9634,
+       pca9635,
 };
 
 struct pca963x_chipdef {
@@ -74,6 +75,12 @@ static struct pca963x_chipdef pca963x_chipdefs[] = {
                .ledout_base    = 0xc,
                .n_leds         = 8,
        },
+       [pca9635] = {
+               .grppwm         = 0x12,
+               .grpfreq        = 0x13,
+               .ledout_base    = 0x14,
+               .n_leds         = 16,
+       },
 };
 
 /* Total blink period in milliseconds */
@@ -84,6 +91,7 @@ static const struct i2c_device_id pca963x_id[] = {
        { "pca9632", pca9633 },
        { "pca9633", pca9633 },
        { "pca9634", pca9634 },
+       { "pca9635", pca9635 },
        { }
 };
 MODULE_DEVICE_TABLE(i2c, pca963x_id);
@@ -107,7 +115,7 @@ struct pca963x_led {
        struct work_struct work;
        enum led_brightness brightness;
        struct led_classdev led_cdev;
-       int led_num; /* 0 .. 7 potentially */
+       int led_num; /* 0 .. 15 potentially */
        enum pca963x_cmd cmd;
        char name[32];
        u8 gdc;
@@ -321,6 +329,7 @@ static const struct of_device_id of_pca963x_match[] = {
        { .compatible = "nxp,pca9632", },
        { .compatible = "nxp,pca9633", },
        { .compatible = "nxp,pca9634", },
+       { .compatible = "nxp,pca9635", },
        {},
 };
 #else
@@ -375,9 +384,8 @@ static int pca963x_probe(struct i2c_client *client,
        pca963x_chip->leds = pca963x;
 
        /* Turn off LEDs by default*/
-       i2c_smbus_write_byte_data(client, chip->ledout_base, 0x00);
-       if (chip->n_leds > 4)
-               i2c_smbus_write_byte_data(client, chip->ledout_base + 1, 0x00);
+       for (i = 0; i < chip->n_leds / 4; i++)
+               i2c_smbus_write_byte_data(client, chip->ledout_base + i, 0x00);
 
        for (i = 0; i < chip->n_leds; i++) {
                pca963x[i].led_num = i;
@@ -415,9 +423,13 @@ static int pca963x_probe(struct i2c_client *client,
        /* Disable LED all-call address and set normal mode */
        i2c_smbus_write_byte_data(client, PCA963X_MODE1, 0x00);
 
-       /* Configure output: open-drain or totem pole (push-pull) */
-       if (pdata && pdata->outdrv == PCA963X_OPEN_DRAIN)
-               i2c_smbus_write_byte_data(client, PCA963X_MODE2, 0x01);
+       if (pdata) {
+               /* Configure output: open-drain or totem pole (push-pull) */
+               if (pdata->outdrv == PCA963X_OPEN_DRAIN)
+                       i2c_smbus_write_byte_data(client, PCA963X_MODE2, 0x01);
+               else
+                       i2c_smbus_write_byte_data(client, PCA963X_MODE2, 0x05);
+       }
 
        return 0;
 
index 2eb3ef62962b6fc510bef812dd3bc83fdecfd1ff..046cb70087452ef8cea540b073ae0fa71ceeef94 100644 (file)
@@ -469,6 +469,12 @@ static ssize_t nas_led_blink_store(struct device *dev,
 
 static DEVICE_ATTR(blink, 0644, nas_led_blink_show, nas_led_blink_store);
 
+static struct attribute *nasgpio_led_attrs[] = {
+       &dev_attr_blink.attr,
+       NULL
+};
+ATTRIBUTE_GROUPS(nasgpio_led);
+
 static int register_nasgpio_led(int led_nr)
 {
        int ret;
@@ -481,20 +487,18 @@ static int register_nasgpio_led(int led_nr)
                led->brightness = LED_FULL;
        led->brightness_set = nasgpio_led_set_brightness;
        led->blink_set = nasgpio_led_set_blink;
+       led->groups = nasgpio_led_groups;
        ret = led_classdev_register(&nas_gpio_pci_dev->dev, led);
        if (ret)
                return ret;
-       ret = device_create_file(led->dev, &dev_attr_blink);
-       if (ret)
-               led_classdev_unregister(led);
-       return ret;
+
+       return 0;
 }
 
 static void unregister_nasgpio_led(int led_nr)
 {
        struct led_classdev *led = get_classdev_for_led_nr(led_nr);
        led_classdev_unregister(led);
-       device_remove_file(led->dev, &dev_attr_blink);
 }
 /*
  * module load/initialization
index e72c974142d00e6cb1962f6c6444e6d55de8c3b1..1b71e0701002b67b1ad1896f760e33e56a15ac30 100644 (file)
@@ -219,6 +219,12 @@ static ssize_t wm831x_status_src_store(struct device *dev,
 
 static DEVICE_ATTR(src, 0644, wm831x_status_src_show, wm831x_status_src_store);
 
+static struct attribute *wm831x_status_attrs[] = {
+       &dev_attr_src.attr,
+       NULL
+};
+ATTRIBUTE_GROUPS(wm831x_status);
+
 static int wm831x_status_probe(struct platform_device *pdev)
 {
        struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
@@ -232,8 +238,7 @@ static int wm831x_status_probe(struct platform_device *pdev)
        res = platform_get_resource(pdev, IORESOURCE_REG, 0);
        if (res == NULL) {
                dev_err(&pdev->dev, "No register resource\n");
-               ret = -EINVAL;
-               goto err;
+               return -EINVAL;
        }
 
        drvdata = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_status),
@@ -284,31 +289,21 @@ static int wm831x_status_probe(struct platform_device *pdev)
        drvdata->cdev.default_trigger = pdata.default_trigger;
        drvdata->cdev.brightness_set = wm831x_status_set;
        drvdata->cdev.blink_set = wm831x_status_blink_set;
+       drvdata->cdev.groups = wm831x_status_groups;
 
        ret = led_classdev_register(wm831x->dev, &drvdata->cdev);
        if (ret < 0) {
                dev_err(&pdev->dev, "Failed to register LED: %d\n", ret);
-               goto err_led;
+               return ret;
        }
 
-       ret = device_create_file(drvdata->cdev.dev, &dev_attr_src);
-       if (ret != 0)
-               dev_err(&pdev->dev,
-                       "No source control for LED: %d\n", ret);
-
        return 0;
-
-err_led:
-       led_classdev_unregister(&drvdata->cdev);
-err:
-       return ret;
 }
 
 static int wm831x_status_remove(struct platform_device *pdev)
 {
        struct wm831x_status *drvdata = platform_get_drvdata(pdev);
 
-       device_remove_file(drvdata->cdev.dev, &dev_attr_src);
        led_classdev_unregister(&drvdata->cdev);
 
        return 0;
index b1d91170ded00eeb13d93dbdbef3117d131b224b..6f68537c93ce18ea77d593fd54eafadfb9ea10ae 100644 (file)
@@ -110,13 +110,7 @@ static int pmu_backlight_update_status(struct backlight_device *bd)
 }
 
 
-static int pmu_backlight_get_brightness(struct backlight_device *bd)
-{
-       return bd->props.brightness;
-}
-
 static const struct backlight_ops pmu_backlight_data = {
-       .get_brightness = pmu_backlight_get_brightness,
        .update_status  = pmu_backlight_update_status,
 
 };
index c8b5c13bcd05e5e526f99ed590a06d04605ee21e..9fd9c6717e0c73d1ac3831dbfb30d1f5080a3ee5 100644 (file)
@@ -16,26 +16,9 @@ config PL320_MBOX
          Management Engine, primarily for cpufreq. Say Y here if you want
          to use the PL320 IPCM support.
 
-config OMAP_MBOX
-       tristate
-       help
-         This option is selected by any OMAP architecture specific mailbox
-         driver such as CONFIG_OMAP1_MBOX or CONFIG_OMAP2PLUS_MBOX. This
-         enables the common OMAP mailbox framework code.
-
-config OMAP1_MBOX
-       tristate "OMAP1 Mailbox framework support"
-       depends on ARCH_OMAP1
-       select OMAP_MBOX
-       help
-         Mailbox implementation for OMAP chips with hardware for
-         interprocessor communication involving DSP in OMAP1. Say Y here
-         if you want to use OMAP1 Mailbox framework support.
-
 config OMAP2PLUS_MBOX
        tristate "OMAP2+ Mailbox framework support"
        depends on ARCH_OMAP2PLUS
-       select OMAP_MBOX
        help
          Mailbox implementation for OMAP family chips with hardware for
          interprocessor communication involving DSP, IVA1.0 and IVA2 in
@@ -44,7 +27,7 @@ config OMAP2PLUS_MBOX
 
 config OMAP_MBOX_KFIFO_SIZE
        int "Mailbox kfifo default buffer size (bytes)"
-       depends on OMAP2PLUS_MBOX || OMAP1_MBOX
+       depends on OMAP2PLUS_MBOX
        default 256
        help
          Specify the default size of mailbox's kfifo buffers (bytes).
index e0facb34084a440343b18eec1f91228322aead09..6d184dbcaca81cfaeef3aca1f786036b98001bdb 100644 (file)
@@ -1,7 +1,3 @@
 obj-$(CONFIG_PL320_MBOX)       += pl320-ipc.o
 
-obj-$(CONFIG_OMAP_MBOX)                += omap-mailbox.o
-obj-$(CONFIG_OMAP1_MBOX)       += mailbox_omap1.o
-mailbox_omap1-objs             := mailbox-omap1.o
-obj-$(CONFIG_OMAP2PLUS_MBOX)   += mailbox_omap2.o
-mailbox_omap2-objs             := mailbox-omap2.o
+obj-$(CONFIG_OMAP2PLUS_MBOX)   += omap-mailbox.o
diff --git a/drivers/mailbox/mailbox-omap1.c b/drivers/mailbox/mailbox-omap1.c
deleted file mode 100644 (file)
index 9001b76..0000000
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * Mailbox reservation modules for OMAP1
- *
- * Copyright (C) 2006-2009 Nokia Corporation
- * Written by: Hiroshi DOYU <Hiroshi.DOYU@nokia.com>
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License.  See the file "COPYING" in the main directory of this archive
- * for more details.
- */
-
-#include <linux/module.h>
-#include <linux/interrupt.h>
-#include <linux/platform_device.h>
-#include <linux/io.h>
-
-#include "omap-mbox.h"
-
-#define MAILBOX_ARM2DSP1               0x00
-#define MAILBOX_ARM2DSP1b              0x04
-#define MAILBOX_DSP2ARM1               0x08
-#define MAILBOX_DSP2ARM1b              0x0c
-#define MAILBOX_DSP2ARM2               0x10
-#define MAILBOX_DSP2ARM2b              0x14
-#define MAILBOX_ARM2DSP1_Flag          0x18
-#define MAILBOX_DSP2ARM1_Flag          0x1c
-#define MAILBOX_DSP2ARM2_Flag          0x20
-
-static void __iomem *mbox_base;
-
-struct omap_mbox1_fifo {
-       unsigned long cmd;
-       unsigned long data;
-       unsigned long flag;
-};
-
-struct omap_mbox1_priv {
-       struct omap_mbox1_fifo tx_fifo;
-       struct omap_mbox1_fifo rx_fifo;
-};
-
-static inline int mbox_read_reg(size_t ofs)
-{
-       return __raw_readw(mbox_base + ofs);
-}
-
-static inline void mbox_write_reg(u32 val, size_t ofs)
-{
-       __raw_writew(val, mbox_base + ofs);
-}
-
-/* msg */
-static mbox_msg_t omap1_mbox_fifo_read(struct omap_mbox *mbox)
-{
-       struct omap_mbox1_fifo *fifo =
-               &((struct omap_mbox1_priv *)mbox->priv)->rx_fifo;
-       mbox_msg_t msg;
-
-       msg = mbox_read_reg(fifo->data);
-       msg |= ((mbox_msg_t) mbox_read_reg(fifo->cmd)) << 16;
-
-       return msg;
-}
-
-static void
-omap1_mbox_fifo_write(struct omap_mbox *mbox, mbox_msg_t msg)
-{
-       struct omap_mbox1_fifo *fifo =
-               &((struct omap_mbox1_priv *)mbox->priv)->tx_fifo;
-
-       mbox_write_reg(msg & 0xffff, fifo->data);
-       mbox_write_reg(msg >> 16, fifo->cmd);
-}
-
-static int omap1_mbox_fifo_empty(struct omap_mbox *mbox)
-{
-       return 0;
-}
-
-static int omap1_mbox_fifo_full(struct omap_mbox *mbox)
-{
-       struct omap_mbox1_fifo *fifo =
-               &((struct omap_mbox1_priv *)mbox->priv)->rx_fifo;
-
-       return mbox_read_reg(fifo->flag);
-}
-
-/* irq */
-static void
-omap1_mbox_enable_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq)
-{
-       if (irq == IRQ_RX)
-               enable_irq(mbox->irq);
-}
-
-static void
-omap1_mbox_disable_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq)
-{
-       if (irq == IRQ_RX)
-               disable_irq(mbox->irq);
-}
-
-static int
-omap1_mbox_is_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq)
-{
-       if (irq == IRQ_TX)
-               return 0;
-       return 1;
-}
-
-static struct omap_mbox_ops omap1_mbox_ops = {
-       .type           = OMAP_MBOX_TYPE1,
-       .fifo_read      = omap1_mbox_fifo_read,
-       .fifo_write     = omap1_mbox_fifo_write,
-       .fifo_empty     = omap1_mbox_fifo_empty,
-       .fifo_full      = omap1_mbox_fifo_full,
-       .enable_irq     = omap1_mbox_enable_irq,
-       .disable_irq    = omap1_mbox_disable_irq,
-       .is_irq         = omap1_mbox_is_irq,
-};
-
-/* FIXME: the following struct should be created automatically by the user id */
-
-/* DSP */
-static struct omap_mbox1_priv omap1_mbox_dsp_priv = {
-       .tx_fifo = {
-               .cmd    = MAILBOX_ARM2DSP1b,
-               .data   = MAILBOX_ARM2DSP1,
-               .flag   = MAILBOX_ARM2DSP1_Flag,
-       },
-       .rx_fifo = {
-               .cmd    = MAILBOX_DSP2ARM1b,
-               .data   = MAILBOX_DSP2ARM1,
-               .flag   = MAILBOX_DSP2ARM1_Flag,
-       },
-};
-
-static struct omap_mbox mbox_dsp_info = {
-       .name   = "dsp",
-       .ops    = &omap1_mbox_ops,
-       .priv   = &omap1_mbox_dsp_priv,
-};
-
-static struct omap_mbox *omap1_mboxes[] = { &mbox_dsp_info, NULL };
-
-static int omap1_mbox_probe(struct platform_device *pdev)
-{
-       struct resource *mem;
-       int ret;
-       struct omap_mbox **list;
-
-       list = omap1_mboxes;
-       list[0]->irq = platform_get_irq_byname(pdev, "dsp");
-
-       mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!mem)
-               return -ENOENT;
-
-       mbox_base = ioremap(mem->start, resource_size(mem));
-       if (!mbox_base)
-               return -ENOMEM;
-
-       ret = omap_mbox_register(&pdev->dev, list);
-       if (ret) {
-               iounmap(mbox_base);
-               return ret;
-       }
-
-       return 0;
-}
-
-static int omap1_mbox_remove(struct platform_device *pdev)
-{
-       omap_mbox_unregister();
-       iounmap(mbox_base);
-       return 0;
-}
-
-static struct platform_driver omap1_mbox_driver = {
-       .probe  = omap1_mbox_probe,
-       .remove = omap1_mbox_remove,
-       .driver = {
-               .name   = "omap-mailbox",
-       },
-};
-
-static int __init omap1_mbox_init(void)
-{
-       return platform_driver_register(&omap1_mbox_driver);
-}
-
-static void __exit omap1_mbox_exit(void)
-{
-       platform_driver_unregister(&omap1_mbox_driver);
-}
-
-module_init(omap1_mbox_init);
-module_exit(omap1_mbox_exit);
-
-MODULE_LICENSE("GPL v2");
-MODULE_DESCRIPTION("omap mailbox: omap1 architecture specific functions");
-MODULE_AUTHOR("Hiroshi DOYU <Hiroshi.DOYU@nokia.com>");
-MODULE_ALIAS("platform:omap1-mailbox");
diff --git a/drivers/mailbox/mailbox-omap2.c b/drivers/mailbox/mailbox-omap2.c
deleted file mode 100644 (file)
index 42d2b89..0000000
+++ /dev/null
@@ -1,357 +0,0 @@
-/*
- * Mailbox reservation modules for OMAP2/3
- *
- * Copyright (C) 2006-2009 Nokia Corporation
- * Written by: Hiroshi DOYU <Hiroshi.DOYU@nokia.com>
- *        and  Paul Mundt
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License.  See the file "COPYING" in the main directory of this archive
- * for more details.
- */
-
-#include <linux/module.h>
-#include <linux/slab.h>
-#include <linux/clk.h>
-#include <linux/err.h>
-#include <linux/platform_device.h>
-#include <linux/io.h>
-#include <linux/pm_runtime.h>
-#include <linux/platform_data/mailbox-omap.h>
-
-#include "omap-mbox.h"
-
-#define MAILBOX_REVISION               0x000
-#define MAILBOX_MESSAGE(m)             (0x040 + 4 * (m))
-#define MAILBOX_FIFOSTATUS(m)          (0x080 + 4 * (m))
-#define MAILBOX_MSGSTATUS(m)           (0x0c0 + 4 * (m))
-#define MAILBOX_IRQSTATUS(u)           (0x100 + 8 * (u))
-#define MAILBOX_IRQENABLE(u)           (0x104 + 8 * (u))
-
-#define OMAP4_MAILBOX_IRQSTATUS(u)     (0x104 + 0x10 * (u))
-#define OMAP4_MAILBOX_IRQENABLE(u)     (0x108 + 0x10 * (u))
-#define OMAP4_MAILBOX_IRQENABLE_CLR(u) (0x10c + 0x10 * (u))
-
-#define MAILBOX_IRQ_NEWMSG(m)          (1 << (2 * (m)))
-#define MAILBOX_IRQ_NOTFULL(m)         (1 << (2 * (m) + 1))
-
-#define MBOX_REG_SIZE                  0x120
-
-#define OMAP4_MBOX_REG_SIZE            0x130
-
-#define MBOX_NR_REGS                   (MBOX_REG_SIZE / sizeof(u32))
-#define OMAP4_MBOX_NR_REGS             (OMAP4_MBOX_REG_SIZE / sizeof(u32))
-
-static void __iomem *mbox_base;
-
-struct omap_mbox2_fifo {
-       unsigned long msg;
-       unsigned long fifo_stat;
-       unsigned long msg_stat;
-};
-
-struct omap_mbox2_priv {
-       struct omap_mbox2_fifo tx_fifo;
-       struct omap_mbox2_fifo rx_fifo;
-       unsigned long irqenable;
-       unsigned long irqstatus;
-       u32 newmsg_bit;
-       u32 notfull_bit;
-       u32 ctx[OMAP4_MBOX_NR_REGS];
-       unsigned long irqdisable;
-       u32 intr_type;
-};
-
-static inline unsigned int mbox_read_reg(size_t ofs)
-{
-       return __raw_readl(mbox_base + ofs);
-}
-
-static inline void mbox_write_reg(u32 val, size_t ofs)
-{
-       __raw_writel(val, mbox_base + ofs);
-}
-
-/* Mailbox H/W preparations */
-static int omap2_mbox_startup(struct omap_mbox *mbox)
-{
-       u32 l;
-
-       pm_runtime_enable(mbox->dev->parent);
-       pm_runtime_get_sync(mbox->dev->parent);
-
-       l = mbox_read_reg(MAILBOX_REVISION);
-       pr_debug("omap mailbox rev %d.%d\n", (l & 0xf0) >> 4, (l & 0x0f));
-
-       return 0;
-}
-
-static void omap2_mbox_shutdown(struct omap_mbox *mbox)
-{
-       pm_runtime_put_sync(mbox->dev->parent);
-       pm_runtime_disable(mbox->dev->parent);
-}
-
-/* Mailbox FIFO handle functions */
-static mbox_msg_t omap2_mbox_fifo_read(struct omap_mbox *mbox)
-{
-       struct omap_mbox2_fifo *fifo =
-               &((struct omap_mbox2_priv *)mbox->priv)->rx_fifo;
-       return (mbox_msg_t) mbox_read_reg(fifo->msg);
-}
-
-static void omap2_mbox_fifo_write(struct omap_mbox *mbox, mbox_msg_t msg)
-{
-       struct omap_mbox2_fifo *fifo =
-               &((struct omap_mbox2_priv *)mbox->priv)->tx_fifo;
-       mbox_write_reg(msg, fifo->msg);
-}
-
-static int omap2_mbox_fifo_empty(struct omap_mbox *mbox)
-{
-       struct omap_mbox2_fifo *fifo =
-               &((struct omap_mbox2_priv *)mbox->priv)->rx_fifo;
-       return (mbox_read_reg(fifo->msg_stat) == 0);
-}
-
-static int omap2_mbox_fifo_full(struct omap_mbox *mbox)
-{
-       struct omap_mbox2_fifo *fifo =
-               &((struct omap_mbox2_priv *)mbox->priv)->tx_fifo;
-       return mbox_read_reg(fifo->fifo_stat);
-}
-
-/* Mailbox IRQ handle functions */
-static void omap2_mbox_enable_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq)
-{
-       struct omap_mbox2_priv *p = mbox->priv;
-       u32 l, bit = (irq == IRQ_TX) ? p->notfull_bit : p->newmsg_bit;
-
-       l = mbox_read_reg(p->irqenable);
-       l |= bit;
-       mbox_write_reg(l, p->irqenable);
-}
-
-static void omap2_mbox_disable_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq)
-{
-       struct omap_mbox2_priv *p = mbox->priv;
-       u32 bit = (irq == IRQ_TX) ? p->notfull_bit : p->newmsg_bit;
-
-       /*
-        * Read and update the interrupt configuration register for pre-OMAP4.
-        * OMAP4 and later SoCs have a dedicated interrupt disabling register.
-        */
-       if (!p->intr_type)
-               bit = mbox_read_reg(p->irqdisable) & ~bit;
-
-       mbox_write_reg(bit, p->irqdisable);
-}
-
-static void omap2_mbox_ack_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq)
-{
-       struct omap_mbox2_priv *p = mbox->priv;
-       u32 bit = (irq == IRQ_TX) ? p->notfull_bit : p->newmsg_bit;
-
-       mbox_write_reg(bit, p->irqstatus);
-
-       /* Flush posted write for irq status to avoid spurious interrupts */
-       mbox_read_reg(p->irqstatus);
-}
-
-static int omap2_mbox_is_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq)
-{
-       struct omap_mbox2_priv *p = mbox->priv;
-       u32 bit = (irq == IRQ_TX) ? p->notfull_bit : p->newmsg_bit;
-       u32 enable = mbox_read_reg(p->irqenable);
-       u32 status = mbox_read_reg(p->irqstatus);
-
-       return (int)(enable & status & bit);
-}
-
-static void omap2_mbox_save_ctx(struct omap_mbox *mbox)
-{
-       int i;
-       struct omap_mbox2_priv *p = mbox->priv;
-       int nr_regs;
-
-       if (p->intr_type)
-               nr_regs = OMAP4_MBOX_NR_REGS;
-       else
-               nr_regs = MBOX_NR_REGS;
-       for (i = 0; i < nr_regs; i++) {
-               p->ctx[i] = mbox_read_reg(i * sizeof(u32));
-
-               dev_dbg(mbox->dev, "%s: [%02x] %08x\n", __func__,
-                       i, p->ctx[i]);
-       }
-}
-
-static void omap2_mbox_restore_ctx(struct omap_mbox *mbox)
-{
-       int i;
-       struct omap_mbox2_priv *p = mbox->priv;
-       int nr_regs;
-
-       if (p->intr_type)
-               nr_regs = OMAP4_MBOX_NR_REGS;
-       else
-               nr_regs = MBOX_NR_REGS;
-       for (i = 0; i < nr_regs; i++) {
-               mbox_write_reg(p->ctx[i], i * sizeof(u32));
-
-               dev_dbg(mbox->dev, "%s: [%02x] %08x\n", __func__,
-                       i, p->ctx[i]);
-       }
-}
-
-static struct omap_mbox_ops omap2_mbox_ops = {
-       .type           = OMAP_MBOX_TYPE2,
-       .startup        = omap2_mbox_startup,
-       .shutdown       = omap2_mbox_shutdown,
-       .fifo_read      = omap2_mbox_fifo_read,
-       .fifo_write     = omap2_mbox_fifo_write,
-       .fifo_empty     = omap2_mbox_fifo_empty,
-       .fifo_full      = omap2_mbox_fifo_full,
-       .enable_irq     = omap2_mbox_enable_irq,
-       .disable_irq    = omap2_mbox_disable_irq,
-       .ack_irq        = omap2_mbox_ack_irq,
-       .is_irq         = omap2_mbox_is_irq,
-       .save_ctx       = omap2_mbox_save_ctx,
-       .restore_ctx    = omap2_mbox_restore_ctx,
-};
-
-static int omap2_mbox_probe(struct platform_device *pdev)
-{
-       struct resource *mem;
-       int ret;
-       struct omap_mbox **list, *mbox, *mboxblk;
-       struct omap_mbox2_priv *priv, *privblk;
-       struct omap_mbox_pdata *pdata = pdev->dev.platform_data;
-       struct omap_mbox_dev_info *info;
-       int i;
-
-       if (!pdata || !pdata->info_cnt || !pdata->info) {
-               pr_err("%s: platform not supported\n", __func__);
-               return -ENODEV;
-       }
-
-       /* allocate one extra for marking end of list */
-       list = kzalloc((pdata->info_cnt + 1) * sizeof(*list), GFP_KERNEL);
-       if (!list)
-               return -ENOMEM;
-
-       mboxblk = mbox = kzalloc(pdata->info_cnt * sizeof(*mbox), GFP_KERNEL);
-       if (!mboxblk) {
-               ret = -ENOMEM;
-               goto free_list;
-       }
-
-       privblk = priv = kzalloc(pdata->info_cnt * sizeof(*priv), GFP_KERNEL);
-       if (!privblk) {
-               ret = -ENOMEM;
-               goto free_mboxblk;
-       }
-
-       info = pdata->info;
-       for (i = 0; i < pdata->info_cnt; i++, info++, priv++) {
-               priv->tx_fifo.msg = MAILBOX_MESSAGE(info->tx_id);
-               priv->tx_fifo.fifo_stat = MAILBOX_FIFOSTATUS(info->tx_id);
-               priv->rx_fifo.msg =  MAILBOX_MESSAGE(info->rx_id);
-               priv->rx_fifo.msg_stat =  MAILBOX_MSGSTATUS(info->rx_id);
-               priv->notfull_bit = MAILBOX_IRQ_NOTFULL(info->tx_id);
-               priv->newmsg_bit = MAILBOX_IRQ_NEWMSG(info->rx_id);
-               if (pdata->intr_type) {
-                       priv->irqenable = OMAP4_MAILBOX_IRQENABLE(info->usr_id);
-                       priv->irqstatus = OMAP4_MAILBOX_IRQSTATUS(info->usr_id);
-                       priv->irqdisable =
-                               OMAP4_MAILBOX_IRQENABLE_CLR(info->usr_id);
-               } else {
-                       priv->irqenable = MAILBOX_IRQENABLE(info->usr_id);
-                       priv->irqstatus = MAILBOX_IRQSTATUS(info->usr_id);
-                       priv->irqdisable = MAILBOX_IRQENABLE(info->usr_id);
-               }
-               priv->intr_type = pdata->intr_type;
-
-               mbox->priv = priv;
-               mbox->name = info->name;
-               mbox->ops = &omap2_mbox_ops;
-               mbox->irq = platform_get_irq(pdev, info->irq_id);
-               if (mbox->irq < 0) {
-                       ret = mbox->irq;
-                       goto free_privblk;
-               }
-               list[i] = mbox++;
-       }
-
-       mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!mem) {
-               ret = -ENOENT;
-               goto free_privblk;
-       }
-
-       mbox_base = ioremap(mem->start, resource_size(mem));
-       if (!mbox_base) {
-               ret = -ENOMEM;
-               goto free_privblk;
-       }
-
-       ret = omap_mbox_register(&pdev->dev, list);
-       if (ret)
-               goto unmap_mbox;
-       platform_set_drvdata(pdev, list);
-
-       return 0;
-
-unmap_mbox:
-       iounmap(mbox_base);
-free_privblk:
-       kfree(privblk);
-free_mboxblk:
-       kfree(mboxblk);
-free_list:
-       kfree(list);
-       return ret;
-}
-
-static int omap2_mbox_remove(struct platform_device *pdev)
-{
-       struct omap_mbox2_priv *privblk;
-       struct omap_mbox **list = platform_get_drvdata(pdev);
-       struct omap_mbox *mboxblk = list[0];
-
-       privblk = mboxblk->priv;
-       omap_mbox_unregister();
-       iounmap(mbox_base);
-       kfree(privblk);
-       kfree(mboxblk);
-       kfree(list);
-
-       return 0;
-}
-
-static struct platform_driver omap2_mbox_driver = {
-       .probe  = omap2_mbox_probe,
-       .remove = omap2_mbox_remove,
-       .driver = {
-               .name = "omap-mailbox",
-       },
-};
-
-static int __init omap2_mbox_init(void)
-{
-       return platform_driver_register(&omap2_mbox_driver);
-}
-
-static void __exit omap2_mbox_exit(void)
-{
-       platform_driver_unregister(&omap2_mbox_driver);
-}
-
-module_init(omap2_mbox_init);
-module_exit(omap2_mbox_exit);
-
-MODULE_LICENSE("GPL v2");
-MODULE_DESCRIPTION("omap mailbox: omap2/3/4 architecture specific functions");
-MODULE_AUTHOR("Hiroshi DOYU <Hiroshi.DOYU@nokia.com>");
-MODULE_AUTHOR("Paul Mundt");
-MODULE_ALIAS("platform:omap2-mailbox");
index d79a646b9042cde5786e87ded1b9d51a2093feb1..a27e00e63a8a8ef66aa6c4f380b51b1dbd376e9a 100644 (file)
@@ -2,8 +2,10 @@
  * OMAP mailbox driver
  *
  * Copyright (C) 2006-2009 Nokia Corporation. All rights reserved.
+ * Copyright (C) 2013-2014 Texas Instruments Inc.
  *
  * Contact: Hiroshi DOYU <Hiroshi.DOYU@nokia.com>
+ *          Suman Anna <s-anna@ti.com>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
 #include <linux/interrupt.h>
 #include <linux/spinlock.h>
 #include <linux/mutex.h>
-#include <linux/delay.h>
 #include <linux/slab.h>
 #include <linux/kfifo.h>
 #include <linux/err.h>
 #include <linux/notifier.h>
 #include <linux/module.h>
-
-#include "omap-mbox.h"
-
-static struct omap_mbox **mboxes;
-
-static int mbox_configured;
-static DEFINE_MUTEX(mbox_configured_lock);
+#include <linux/platform_device.h>
+#include <linux/pm_runtime.h>
+#include <linux/platform_data/mailbox-omap.h>
+#include <linux/omap-mailbox.h>
+
+#define MAILBOX_REVISION               0x000
+#define MAILBOX_MESSAGE(m)             (0x040 + 4 * (m))
+#define MAILBOX_FIFOSTATUS(m)          (0x080 + 4 * (m))
+#define MAILBOX_MSGSTATUS(m)           (0x0c0 + 4 * (m))
+
+#define OMAP2_MAILBOX_IRQSTATUS(u)     (0x100 + 8 * (u))
+#define OMAP2_MAILBOX_IRQENABLE(u)     (0x104 + 8 * (u))
+
+#define OMAP4_MAILBOX_IRQSTATUS(u)     (0x104 + 0x10 * (u))
+#define OMAP4_MAILBOX_IRQENABLE(u)     (0x108 + 0x10 * (u))
+#define OMAP4_MAILBOX_IRQENABLE_CLR(u) (0x10c + 0x10 * (u))
+
+#define MAILBOX_IRQSTATUS(type, u)     (type ? OMAP4_MAILBOX_IRQSTATUS(u) : \
+                                               OMAP2_MAILBOX_IRQSTATUS(u))
+#define MAILBOX_IRQENABLE(type, u)     (type ? OMAP4_MAILBOX_IRQENABLE(u) : \
+                                               OMAP2_MAILBOX_IRQENABLE(u))
+#define MAILBOX_IRQDISABLE(type, u)    (type ? OMAP4_MAILBOX_IRQENABLE_CLR(u) \
+                                               : OMAP2_MAILBOX_IRQENABLE(u))
+
+#define MAILBOX_IRQ_NEWMSG(m)          (1 << (2 * (m)))
+#define MAILBOX_IRQ_NOTFULL(m)         (1 << (2 * (m) + 1))
+
+#define MBOX_REG_SIZE                  0x120
+
+#define OMAP4_MBOX_REG_SIZE            0x130
+
+#define MBOX_NR_REGS                   (MBOX_REG_SIZE / sizeof(u32))
+#define OMAP4_MBOX_NR_REGS             (OMAP4_MBOX_REG_SIZE / sizeof(u32))
+
+struct omap_mbox_fifo {
+       unsigned long msg;
+       unsigned long fifo_stat;
+       unsigned long msg_stat;
+       unsigned long irqenable;
+       unsigned long irqstatus;
+       unsigned long irqdisable;
+       u32 intr_bit;
+};
+
+struct omap_mbox_queue {
+       spinlock_t              lock;
+       struct kfifo            fifo;
+       struct work_struct      work;
+       struct tasklet_struct   tasklet;
+       struct omap_mbox        *mbox;
+       bool full;
+};
+
+struct omap_mbox_device {
+       struct device *dev;
+       struct mutex cfg_lock;
+       void __iomem *mbox_base;
+       u32 num_users;
+       u32 num_fifos;
+       struct omap_mbox **mboxes;
+       struct list_head elem;
+};
+
+struct omap_mbox {
+       const char              *name;
+       int                     irq;
+       struct omap_mbox_queue  *txq, *rxq;
+       struct device           *dev;
+       struct omap_mbox_device *parent;
+       struct omap_mbox_fifo   tx_fifo;
+       struct omap_mbox_fifo   rx_fifo;
+       u32                     ctx[OMAP4_MBOX_NR_REGS];
+       u32                     intr_type;
+       int                     use_count;
+       struct blocking_notifier_head   notifier;
+};
+
+/* global variables for the mailbox devices */
+static DEFINE_MUTEX(omap_mbox_devices_lock);
+static LIST_HEAD(omap_mbox_devices);
 
 static unsigned int mbox_kfifo_size = CONFIG_OMAP_MBOX_KFIFO_SIZE;
 module_param(mbox_kfifo_size, uint, S_IRUGO);
 MODULE_PARM_DESC(mbox_kfifo_size, "Size of omap's mailbox kfifo (bytes)");
 
+static inline
+unsigned int mbox_read_reg(struct omap_mbox_device *mdev, size_t ofs)
+{
+       return __raw_readl(mdev->mbox_base + ofs);
+}
+
+static inline
+void mbox_write_reg(struct omap_mbox_device *mdev, u32 val, size_t ofs)
+{
+       __raw_writel(val, mdev->mbox_base + ofs);
+}
+
 /* Mailbox FIFO handle functions */
-static inline mbox_msg_t mbox_fifo_read(struct omap_mbox *mbox)
+static mbox_msg_t mbox_fifo_read(struct omap_mbox *mbox)
 {
-       return mbox->ops->fifo_read(mbox);
+       struct omap_mbox_fifo *fifo = &mbox->rx_fifo;
+       return (mbox_msg_t) mbox_read_reg(mbox->parent, fifo->msg);
 }
-static inline void mbox_fifo_write(struct omap_mbox *mbox, mbox_msg_t msg)
+
+static void mbox_fifo_write(struct omap_mbox *mbox, mbox_msg_t msg)
 {
-       mbox->ops->fifo_write(mbox, msg);
+       struct omap_mbox_fifo *fifo = &mbox->tx_fifo;
+       mbox_write_reg(mbox->parent, msg, fifo->msg);
 }
-static inline int mbox_fifo_empty(struct omap_mbox *mbox)
+
+static int mbox_fifo_empty(struct omap_mbox *mbox)
 {
-       return mbox->ops->fifo_empty(mbox);
+       struct omap_mbox_fifo *fifo = &mbox->rx_fifo;
+       return (mbox_read_reg(mbox->parent, fifo->msg_stat) == 0);
 }
-static inline int mbox_fifo_full(struct omap_mbox *mbox)
+
+static int mbox_fifo_full(struct omap_mbox *mbox)
 {
-       return mbox->ops->fifo_full(mbox);
+       struct omap_mbox_fifo *fifo = &mbox->tx_fifo;
+       return mbox_read_reg(mbox->parent, fifo->fifo_stat);
 }
 
 /* Mailbox IRQ handle functions */
-static inline void ack_mbox_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq)
+static void ack_mbox_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq)
 {
-       if (mbox->ops->ack_irq)
-               mbox->ops->ack_irq(mbox, irq);
+       struct omap_mbox_fifo *fifo = (irq == IRQ_TX) ?
+                               &mbox->tx_fifo : &mbox->rx_fifo;
+       u32 bit = fifo->intr_bit;
+       u32 irqstatus = fifo->irqstatus;
+
+       mbox_write_reg(mbox->parent, bit, irqstatus);
+
+       /* Flush posted write for irq status to avoid spurious interrupts */
+       mbox_read_reg(mbox->parent, irqstatus);
 }
-static inline int is_mbox_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq)
+
+static int is_mbox_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq)
 {
-       return mbox->ops->is_irq(mbox, irq);
+       struct omap_mbox_fifo *fifo = (irq == IRQ_TX) ?
+                               &mbox->tx_fifo : &mbox->rx_fifo;
+       u32 bit = fifo->intr_bit;
+       u32 irqenable = fifo->irqenable;
+       u32 irqstatus = fifo->irqstatus;
+
+       u32 enable = mbox_read_reg(mbox->parent, irqenable);
+       u32 status = mbox_read_reg(mbox->parent, irqstatus);
+
+       return (int)(enable & status & bit);
 }
 
 /*
  * message sender
  */
-static int __mbox_poll_for_space(struct omap_mbox *mbox)
-{
-       int ret = 0, i = 1000;
-
-       while (mbox_fifo_full(mbox)) {
-               if (mbox->ops->type == OMAP_MBOX_TYPE2)
-                       return -1;
-               if (--i == 0)
-                       return -1;
-               udelay(1);
-       }
-       return ret;
-}
-
 int omap_mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg)
 {
        struct omap_mbox_queue *mq = mbox->txq;
@@ -100,7 +196,7 @@ int omap_mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg)
                goto out;
        }
 
-       if (kfifo_is_empty(&mq->fifo) && !__mbox_poll_for_space(mbox)) {
+       if (kfifo_is_empty(&mq->fifo) && !mbox_fifo_full(mbox)) {
                mbox_fifo_write(mbox, msg);
                goto out;
        }
@@ -118,35 +214,69 @@ EXPORT_SYMBOL(omap_mbox_msg_send);
 
 void omap_mbox_save_ctx(struct omap_mbox *mbox)
 {
-       if (!mbox->ops->save_ctx) {
-               dev_err(mbox->dev, "%s:\tno save\n", __func__);
-               return;
-       }
+       int i;
+       int nr_regs;
+
+       if (mbox->intr_type)
+               nr_regs = OMAP4_MBOX_NR_REGS;
+       else
+               nr_regs = MBOX_NR_REGS;
+       for (i = 0; i < nr_regs; i++) {
+               mbox->ctx[i] = mbox_read_reg(mbox->parent, i * sizeof(u32));
 
-       mbox->ops->save_ctx(mbox);
+               dev_dbg(mbox->dev, "%s: [%02x] %08x\n", __func__,
+                       i, mbox->ctx[i]);
+       }
 }
 EXPORT_SYMBOL(omap_mbox_save_ctx);
 
 void omap_mbox_restore_ctx(struct omap_mbox *mbox)
 {
-       if (!mbox->ops->restore_ctx) {
-               dev_err(mbox->dev, "%s:\tno restore\n", __func__);
-               return;
-       }
+       int i;
+       int nr_regs;
 
-       mbox->ops->restore_ctx(mbox);
+       if (mbox->intr_type)
+               nr_regs = OMAP4_MBOX_NR_REGS;
+       else
+               nr_regs = MBOX_NR_REGS;
+       for (i = 0; i < nr_regs; i++) {
+               mbox_write_reg(mbox->parent, mbox->ctx[i], i * sizeof(u32));
+
+               dev_dbg(mbox->dev, "%s: [%02x] %08x\n", __func__,
+                       i, mbox->ctx[i]);
+       }
 }
 EXPORT_SYMBOL(omap_mbox_restore_ctx);
 
 void omap_mbox_enable_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq)
 {
-       mbox->ops->enable_irq(mbox, irq);
+       u32 l;
+       struct omap_mbox_fifo *fifo = (irq == IRQ_TX) ?
+                               &mbox->tx_fifo : &mbox->rx_fifo;
+       u32 bit = fifo->intr_bit;
+       u32 irqenable = fifo->irqenable;
+
+       l = mbox_read_reg(mbox->parent, irqenable);
+       l |= bit;
+       mbox_write_reg(mbox->parent, l, irqenable);
 }
 EXPORT_SYMBOL(omap_mbox_enable_irq);
 
 void omap_mbox_disable_irq(struct omap_mbox *mbox, omap_mbox_irq_t irq)
 {
-       mbox->ops->disable_irq(mbox, irq);
+       struct omap_mbox_fifo *fifo = (irq == IRQ_TX) ?
+                               &mbox->tx_fifo : &mbox->rx_fifo;
+       u32 bit = fifo->intr_bit;
+       u32 irqdisable = fifo->irqdisable;
+
+       /*
+        * Read and update the interrupt configuration register for pre-OMAP4.
+        * OMAP4 and later SoCs have a dedicated interrupt disabling register.
+        */
+       if (!mbox->intr_type)
+               bit = mbox_read_reg(mbox->parent, irqdisable) & ~bit;
+
+       mbox_write_reg(mbox->parent, bit, irqdisable);
 }
 EXPORT_SYMBOL(omap_mbox_disable_irq);
 
@@ -158,7 +288,7 @@ static void mbox_tx_tasklet(unsigned long tx_data)
        int ret;
 
        while (kfifo_len(&mq->fifo)) {
-               if (__mbox_poll_for_space(mbox)) {
+               if (mbox_fifo_full(mbox)) {
                        omap_mbox_enable_irq(mbox, IRQ_TX);
                        break;
                }
@@ -223,9 +353,6 @@ static void __mbox_rx_interrupt(struct omap_mbox *mbox)
 
                len = kfifo_in(&mq->fifo, (unsigned char *)&msg, sizeof(msg));
                WARN_ON(len != sizeof(msg));
-
-               if (mbox->ops->type == OMAP_MBOX_TYPE1)
-                       break;
        }
 
        /* no more messages in the fifo. clear IRQ source. */
@@ -283,16 +410,12 @@ static int omap_mbox_startup(struct omap_mbox *mbox)
 {
        int ret = 0;
        struct omap_mbox_queue *mq;
+       struct omap_mbox_device *mdev = mbox->parent;
 
-       mutex_lock(&mbox_configured_lock);
-       if (!mbox_configured++) {
-               if (likely(mbox->ops->startup)) {
-                       ret = mbox->ops->startup(mbox);
-                       if (unlikely(ret))
-                               goto fail_startup;
-               } else
-                       goto fail_startup;
-       }
+       mutex_lock(&mdev->cfg_lock);
+       ret = pm_runtime_get_sync(mdev->dev);
+       if (unlikely(ret < 0))
+               goto fail_startup;
 
        if (!mbox->use_count++) {
                mq = mbox_queue_alloc(mbox, NULL, mbox_tx_tasklet);
@@ -319,7 +442,7 @@ static int omap_mbox_startup(struct omap_mbox *mbox)
 
                omap_mbox_enable_irq(mbox, IRQ_RX);
        }
-       mutex_unlock(&mbox_configured_lock);
+       mutex_unlock(&mdev->cfg_lock);
        return 0;
 
 fail_request_irq:
@@ -327,18 +450,18 @@ fail_request_irq:
 fail_alloc_rxq:
        mbox_queue_free(mbox->txq);
 fail_alloc_txq:
-       if (mbox->ops->shutdown)
-               mbox->ops->shutdown(mbox);
+       pm_runtime_put_sync(mdev->dev);
        mbox->use_count--;
 fail_startup:
-       mbox_configured--;
-       mutex_unlock(&mbox_configured_lock);
+       mutex_unlock(&mdev->cfg_lock);
        return ret;
 }
 
 static void omap_mbox_fini(struct omap_mbox *mbox)
 {
-       mutex_lock(&mbox_configured_lock);
+       struct omap_mbox_device *mdev = mbox->parent;
+
+       mutex_lock(&mdev->cfg_lock);
 
        if (!--mbox->use_count) {
                omap_mbox_disable_irq(mbox, IRQ_RX);
@@ -349,28 +472,43 @@ static void omap_mbox_fini(struct omap_mbox *mbox)
                mbox_queue_free(mbox->rxq);
        }
 
-       if (likely(mbox->ops->shutdown)) {
-               if (!--mbox_configured)
-                       mbox->ops->shutdown(mbox);
-       }
+       pm_runtime_put_sync(mdev->dev);
 
-       mutex_unlock(&mbox_configured_lock);
+       mutex_unlock(&mdev->cfg_lock);
 }
 
-struct omap_mbox *omap_mbox_get(const char *name, struct notifier_block *nb)
+static struct omap_mbox *omap_mbox_device_find(struct omap_mbox_device *mdev,
+                                              const char *mbox_name)
 {
        struct omap_mbox *_mbox, *mbox = NULL;
-       int i, ret;
+       struct omap_mbox **mboxes = mdev->mboxes;
+       int i;
 
        if (!mboxes)
-               return ERR_PTR(-EINVAL);
+               return NULL;
 
        for (i = 0; (_mbox = mboxes[i]); i++) {
-               if (!strcmp(_mbox->name, name)) {
+               if (!strcmp(_mbox->name, mbox_name)) {
                        mbox = _mbox;
                        break;
                }
        }
+       return mbox;
+}
+
+struct omap_mbox *omap_mbox_get(const char *name, struct notifier_block *nb)
+{
+       struct omap_mbox *mbox = NULL;
+       struct omap_mbox_device *mdev;
+       int ret;
+
+       mutex_lock(&omap_mbox_devices_lock);
+       list_for_each_entry(mdev, &omap_mbox_devices, elem) {
+               mbox = omap_mbox_device_find(mdev, name);
+               if (mbox)
+                       break;
+       }
+       mutex_unlock(&omap_mbox_devices_lock);
 
        if (!mbox)
                return ERR_PTR(-ENOENT);
@@ -397,19 +535,20 @@ EXPORT_SYMBOL(omap_mbox_put);
 
 static struct class omap_mbox_class = { .name = "mbox", };
 
-int omap_mbox_register(struct device *parent, struct omap_mbox **list)
+static int omap_mbox_register(struct omap_mbox_device *mdev)
 {
        int ret;
        int i;
+       struct omap_mbox **mboxes;
 
-       mboxes = list;
-       if (!mboxes)
+       if (!mdev || !mdev->mboxes)
                return -EINVAL;
 
+       mboxes = mdev->mboxes;
        for (i = 0; mboxes[i]; i++) {
                struct omap_mbox *mbox = mboxes[i];
                mbox->dev = device_create(&omap_mbox_class,
-                               parent, 0, mbox, "%s", mbox->name);
+                               mdev->dev, 0, mbox, "%s", mbox->name);
                if (IS_ERR(mbox->dev)) {
                        ret = PTR_ERR(mbox->dev);
                        goto err_out;
@@ -417,6 +556,11 @@ int omap_mbox_register(struct device *parent, struct omap_mbox **list)
 
                BLOCKING_INIT_NOTIFIER_HEAD(&mbox->notifier);
        }
+
+       mutex_lock(&omap_mbox_devices_lock);
+       list_add(&mdev->elem, &omap_mbox_devices);
+       mutex_unlock(&omap_mbox_devices_lock);
+
        return 0;
 
 err_out:
@@ -424,21 +568,148 @@ err_out:
                device_unregister(mboxes[i]->dev);
        return ret;
 }
-EXPORT_SYMBOL(omap_mbox_register);
 
-int omap_mbox_unregister(void)
+static int omap_mbox_unregister(struct omap_mbox_device *mdev)
 {
        int i;
+       struct omap_mbox **mboxes;
 
-       if (!mboxes)
+       if (!mdev || !mdev->mboxes)
                return -EINVAL;
 
+       mutex_lock(&omap_mbox_devices_lock);
+       list_del(&mdev->elem);
+       mutex_unlock(&omap_mbox_devices_lock);
+
+       mboxes = mdev->mboxes;
        for (i = 0; mboxes[i]; i++)
                device_unregister(mboxes[i]->dev);
-       mboxes = NULL;
        return 0;
 }
-EXPORT_SYMBOL(omap_mbox_unregister);
+
+static int omap_mbox_probe(struct platform_device *pdev)
+{
+       struct resource *mem;
+       int ret;
+       struct omap_mbox **list, *mbox, *mboxblk;
+       struct omap_mbox_pdata *pdata = pdev->dev.platform_data;
+       struct omap_mbox_dev_info *info;
+       struct omap_mbox_device *mdev;
+       struct omap_mbox_fifo *fifo;
+       u32 intr_type;
+       u32 l;
+       int i;
+
+       if (!pdata || !pdata->info_cnt || !pdata->info) {
+               pr_err("%s: platform not supported\n", __func__);
+               return -ENODEV;
+       }
+
+       mdev = devm_kzalloc(&pdev->dev, sizeof(*mdev), GFP_KERNEL);
+       if (!mdev)
+               return -ENOMEM;
+
+       mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       mdev->mbox_base = devm_ioremap_resource(&pdev->dev, mem);
+       if (IS_ERR(mdev->mbox_base))
+               return PTR_ERR(mdev->mbox_base);
+
+       /* allocate one extra for marking end of list */
+       list = devm_kzalloc(&pdev->dev, (pdata->info_cnt + 1) * sizeof(*list),
+                           GFP_KERNEL);
+       if (!list)
+               return -ENOMEM;
+
+       mboxblk = devm_kzalloc(&pdev->dev, pdata->info_cnt * sizeof(*mbox),
+                              GFP_KERNEL);
+       if (!mboxblk)
+               return -ENOMEM;
+
+       info = pdata->info;
+       intr_type = pdata->intr_type;
+       mbox = mboxblk;
+       for (i = 0; i < pdata->info_cnt; i++, info++) {
+               fifo = &mbox->tx_fifo;
+               fifo->msg = MAILBOX_MESSAGE(info->tx_id);
+               fifo->fifo_stat = MAILBOX_FIFOSTATUS(info->tx_id);
+               fifo->intr_bit = MAILBOX_IRQ_NOTFULL(info->tx_id);
+               fifo->irqenable = MAILBOX_IRQENABLE(intr_type, info->usr_id);
+               fifo->irqstatus = MAILBOX_IRQSTATUS(intr_type, info->usr_id);
+               fifo->irqdisable = MAILBOX_IRQDISABLE(intr_type, info->usr_id);
+
+               fifo = &mbox->rx_fifo;
+               fifo->msg =  MAILBOX_MESSAGE(info->rx_id);
+               fifo->msg_stat =  MAILBOX_MSGSTATUS(info->rx_id);
+               fifo->intr_bit = MAILBOX_IRQ_NEWMSG(info->rx_id);
+               fifo->irqenable = MAILBOX_IRQENABLE(intr_type, info->usr_id);
+               fifo->irqstatus = MAILBOX_IRQSTATUS(intr_type, info->usr_id);
+               fifo->irqdisable = MAILBOX_IRQDISABLE(intr_type, info->usr_id);
+
+               mbox->intr_type = intr_type;
+
+               mbox->parent = mdev;
+               mbox->name = info->name;
+               mbox->irq = platform_get_irq(pdev, info->irq_id);
+               if (mbox->irq < 0)
+                       return mbox->irq;
+               list[i] = mbox++;
+       }
+
+       mutex_init(&mdev->cfg_lock);
+       mdev->dev = &pdev->dev;
+       mdev->num_users = pdata->num_users;
+       mdev->num_fifos = pdata->num_fifos;
+       mdev->mboxes = list;
+       ret = omap_mbox_register(mdev);
+       if (ret)
+               return ret;
+
+       platform_set_drvdata(pdev, mdev);
+       pm_runtime_enable(mdev->dev);
+
+       ret = pm_runtime_get_sync(mdev->dev);
+       if (ret < 0) {
+               pm_runtime_put_noidle(mdev->dev);
+               goto unregister;
+       }
+
+       /*
+        * just print the raw revision register, the format is not
+        * uniform across all SoCs
+        */
+       l = mbox_read_reg(mdev, MAILBOX_REVISION);
+       dev_info(mdev->dev, "omap mailbox rev 0x%x\n", l);
+
+       ret = pm_runtime_put_sync(mdev->dev);
+       if (ret < 0)
+               goto unregister;
+
+       return 0;
+
+unregister:
+       pm_runtime_disable(mdev->dev);
+       omap_mbox_unregister(mdev);
+       return ret;
+}
+
+static int omap_mbox_remove(struct platform_device *pdev)
+{
+       struct omap_mbox_device *mdev = platform_get_drvdata(pdev);
+
+       pm_runtime_disable(mdev->dev);
+       omap_mbox_unregister(mdev);
+
+       return 0;
+}
+
+static struct platform_driver omap_mbox_driver = {
+       .probe  = omap_mbox_probe,
+       .remove = omap_mbox_remove,
+       .driver = {
+               .name = "omap-mailbox",
+               .owner = THIS_MODULE,
+       },
+};
 
 static int __init omap_mbox_init(void)
 {
@@ -453,12 +724,13 @@ static int __init omap_mbox_init(void)
        mbox_kfifo_size = max_t(unsigned int, mbox_kfifo_size,
                                                        sizeof(mbox_msg_t));
 
-       return 0;
+       return platform_driver_register(&omap_mbox_driver);
 }
 subsys_initcall(omap_mbox_init);
 
 static void __exit omap_mbox_exit(void)
 {
+       platform_driver_unregister(&omap_mbox_driver);
        class_unregister(&omap_mbox_class);
 }
 module_exit(omap_mbox_exit);
diff --git a/drivers/mailbox/omap-mbox.h b/drivers/mailbox/omap-mbox.h
deleted file mode 100644 (file)
index 86d7518..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * omap-mbox.h: OMAP mailbox internal definitions
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#ifndef OMAP_MBOX_H
-#define OMAP_MBOX_H
-
-#include <linux/device.h>
-#include <linux/interrupt.h>
-#include <linux/kfifo.h>
-#include <linux/spinlock.h>
-#include <linux/workqueue.h>
-#include <linux/omap-mailbox.h>
-
-typedef int __bitwise omap_mbox_type_t;
-#define OMAP_MBOX_TYPE1 ((__force omap_mbox_type_t) 1)
-#define OMAP_MBOX_TYPE2 ((__force omap_mbox_type_t) 2)
-
-struct omap_mbox_ops {
-       omap_mbox_type_t        type;
-       int             (*startup)(struct omap_mbox *mbox);
-       void            (*shutdown)(struct omap_mbox *mbox);
-       /* fifo */
-       mbox_msg_t      (*fifo_read)(struct omap_mbox *mbox);
-       void            (*fifo_write)(struct omap_mbox *mbox, mbox_msg_t msg);
-       int             (*fifo_empty)(struct omap_mbox *mbox);
-       int             (*fifo_full)(struct omap_mbox *mbox);
-       /* irq */
-       void            (*enable_irq)(struct omap_mbox *mbox,
-                                               omap_mbox_irq_t irq);
-       void            (*disable_irq)(struct omap_mbox *mbox,
-                                               omap_mbox_irq_t irq);
-       void            (*ack_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq);
-       int             (*is_irq)(struct omap_mbox *mbox, omap_mbox_irq_t irq);
-       /* ctx */
-       void            (*save_ctx)(struct omap_mbox *mbox);
-       void            (*restore_ctx)(struct omap_mbox *mbox);
-};
-
-struct omap_mbox_queue {
-       spinlock_t              lock;
-       struct kfifo            fifo;
-       struct work_struct      work;
-       struct tasklet_struct   tasklet;
-       struct omap_mbox        *mbox;
-       bool full;
-};
-
-struct omap_mbox {
-       const char              *name;
-       int                     irq;
-       struct omap_mbox_queue  *txq, *rxq;
-       struct omap_mbox_ops    *ops;
-       struct device           *dev;
-       void                    *priv;
-       int                     use_count;
-       struct blocking_notifier_head   notifier;
-};
-
-int omap_mbox_register(struct device *parent, struct omap_mbox **);
-int omap_mbox_unregister(void);
-
-#endif /* OMAP_MBOX_H */
index 64751c2a1ace8fc2f90e59c1a1ca404776aa04d0..e9d50644660ca1fafd245f037b5e868318f47174 100644 (file)
@@ -158,7 +158,7 @@ static int device_irq_init_805(struct pm80x_chip *chip)
         * PM805_INT_STATUS is under 32K clock domain, so need to
         * add proper delay before the next I2C register access.
         */
-       msleep(1);
+       usleep_range(1000, 3000);
 
        if (ret < 0)
                goto out;
index bcfc9e85b4a0d0a702bef461f81b9fb568e528ff..3a26045801645783ea6680f14b076b4a929e74e3 100644 (file)
@@ -2,7 +2,8 @@
  * Base driver for Marvell 88PM8607
  *
  * Copyright (C) 2009 Marvell International Ltd.
- *     Haojian Zhuang <haojian.zhuang@marvell.com>
+ *
+ * Author: Haojian Zhuang <haojian.zhuang@marvell.com>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
@@ -140,7 +141,8 @@ static struct resource codec_resources[] = {
        /* Headset insertion or removal */
        {PM8607_IRQ_HEADSET, PM8607_IRQ_HEADSET, "headset", IORESOURCE_IRQ,},
        /* Audio short */
-       {PM8607_IRQ_AUDIO_SHORT, PM8607_IRQ_AUDIO_SHORT, "audio-short", IORESOURCE_IRQ,},
+       {PM8607_IRQ_AUDIO_SHORT, PM8607_IRQ_AUDIO_SHORT, "audio-short",
+        IORESOURCE_IRQ,},
 };
 
 static struct resource battery_resources[] = {
@@ -150,10 +152,14 @@ static struct resource battery_resources[] = {
 
 static struct resource charger_resources[] = {
        {PM8607_IRQ_CHG,  PM8607_IRQ_CHG,  "charger detect",  IORESOURCE_IRQ,},
-       {PM8607_IRQ_CHG_DONE,  PM8607_IRQ_CHG_DONE,  "charging done",       IORESOURCE_IRQ,},
-       {PM8607_IRQ_CHG_FAIL,  PM8607_IRQ_CHG_FAIL,  "charging timeout",    IORESOURCE_IRQ,},
-       {PM8607_IRQ_CHG_FAULT, PM8607_IRQ_CHG_FAULT, "charging fault",      IORESOURCE_IRQ,},
-       {PM8607_IRQ_GPADC1,    PM8607_IRQ_GPADC1,    "battery temperature", IORESOURCE_IRQ,},
+       {PM8607_IRQ_CHG_DONE,  PM8607_IRQ_CHG_DONE,  "charging done",
+        IORESOURCE_IRQ,},
+       {PM8607_IRQ_CHG_FAIL,  PM8607_IRQ_CHG_FAIL,  "charging timeout",
+        IORESOURCE_IRQ,},
+       {PM8607_IRQ_CHG_FAULT, PM8607_IRQ_CHG_FAULT, "charging fault",
+        IORESOURCE_IRQ,},
+       {PM8607_IRQ_GPADC1,    PM8607_IRQ_GPADC1,    "battery temperature",
+        IORESOURCE_IRQ,},
        {PM8607_IRQ_VBAT, PM8607_IRQ_VBAT, "battery voltage", IORESOURCE_IRQ,},
        {PM8607_IRQ_VCHG, PM8607_IRQ_VCHG, "vchg voltage",    IORESOURCE_IRQ,},
 };
@@ -568,8 +574,8 @@ static struct irq_domain_ops pm860x_irq_domain_ops = {
 static int device_irq_init(struct pm860x_chip *chip,
                                     struct pm860x_platform_data *pdata)
 {
-       struct i2c_client *i2c = (chip->id == CHIP_PM8607) ? chip->client \
-                               : chip->companion;
+       struct i2c_client *i2c = (chip->id == CHIP_PM8607) ?
+               chip->client : chip->companion;
        unsigned char status_buf[INT_STATUS_NUM];
        unsigned long flags = IRQF_TRIGGER_FALLING | IRQF_ONESHOT;
        int data, mask, ret = -EINVAL;
@@ -631,8 +637,8 @@ static int device_irq_init(struct pm860x_chip *chip,
        if (!chip->core_irq)
                goto out;
 
-       ret = request_threaded_irq(chip->core_irq, NULL, pm860x_irq, flags | IRQF_ONESHOT,
-                                  "88pm860x", chip);
+       ret = request_threaded_irq(chip->core_irq, NULL, pm860x_irq,
+                                  flags | IRQF_ONESHOT, "88pm860x", chip);
        if (ret) {
                dev_err(chip->dev, "Failed to request IRQ: %d\n", ret);
                chip->core_irq = 0;
@@ -871,7 +877,7 @@ static void device_rtc_init(struct pm860x_chip *chip,
 {
        int ret;
 
-       if ((pdata == NULL))
+       if (!pdata)
                return;
 
        rtc_devs[0].platform_data = pdata->rtc;
@@ -997,8 +1003,9 @@ static void device_8607_init(struct pm860x_chip *chip,
                         ret);
                break;
        default:
-               dev_err(chip->dev, "Failed to detect Marvell 88PM8607. "
-                       "Chip ID: %02x\n", ret);
+               dev_err(chip->dev,
+                       "Failed to detect Marvell 88PM8607. Chip ID: %02x\n",
+                       ret);
                goto out;
        }
 
@@ -1120,8 +1127,8 @@ static int pm860x_dt_init(struct device_node *np,
        ret = of_property_read_u32(np, "marvell,88pm860x-slave-addr",
                                   &pdata->companion_addr);
        if (ret) {
-               dev_err(dev, "Not found \"marvell,88pm860x-slave-addr\" "
-                       "property\n");
+               dev_err(dev,
+                       "Not found \"marvell,88pm860x-slave-addr\" property\n");
                pdata->companion_addr = 0;
        }
        return 0;
index ff8f803ce8334d6e0bd27565601ef767b51007f0..a93b4d0134a206e035c5b368d5cac4aa19bccc92 100644 (file)
@@ -2,7 +2,8 @@
  * I2C driver for Marvell 88PM860x
  *
  * Copyright (C) 2009 Marvell International Ltd.
- *     Haojian Zhuang <haojian.zhuang@marvell.com>
+ *
+ * Author: Haojian Zhuang <haojian.zhuang@marvell.com>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
index fb824f5011979f056b9e9abf88c2590f0923d557..de5abf244746ac7dc32e99d02b61d131e4877a77 100644 (file)
@@ -13,7 +13,7 @@ config MFD_CORE
 config MFD_CS5535
        tristate "AMD CS5535 and CS5536 southbridge core functions"
        select MFD_CORE
-       depends on PCI && X86
+       depends on PCI && (X86_32 || (X86 && COMPILE_TEST))
        ---help---
          This is the core driver for CS5535/CS5536 MFD functions.  This is
           necessary for using the board's GPIO and MFGPT functionality.
@@ -187,6 +187,7 @@ config MFD_MC13XXX
        tristate
        depends on (SPI_MASTER || I2C)
        select MFD_CORE
+       select REGMAP_IRQ
        help
          Enable support for the Freescale MC13783 and MC13892 PMICs.
          This driver provides common support for accessing the device,
@@ -253,6 +254,18 @@ config LPC_SCH
          LPC bridge function of the Intel SCH provides support for
          System Management Bus and General Purpose I/O.
 
+config INTEL_SOC_PMIC
+       bool "Support for Intel Atom SoC PMIC"
+       depends on I2C=y
+       select MFD_CORE
+       select REGMAP_I2C
+       select REGMAP_IRQ
+       help
+         Select this option to enable support for the PMIC device
+         on some Intel SoC systems. The PMIC provides ADC, GPIO,
+         thermal, charger and related power management functions
+         on these systems.
+
 config MFD_INTEL_MSIC
        bool "Intel MSIC"
        depends on INTEL_SCU_IPC
@@ -367,14 +380,15 @@ config MFD_MAX14577
          of the device.
 
 config MFD_MAX77686
-       bool "Maxim Semiconductor MAX77686 PMIC Support"
+       bool "Maxim Semiconductor MAX77686/802 PMIC Support"
        depends on I2C=y
        select MFD_CORE
        select REGMAP_I2C
+       select REGMAP_IRQ
        select IRQ_DOMAIN
        help
-         Say yes here to add support for Maxim Semiconductor MAX77686.
-         This is a Power Management IC with RTC on chip.
+         Say yes here to add support for Maxim Semiconductor MAX77686 and
+         MAX77802 which are Power Management IC with an RTC on chip.
          This driver provides common support for accessing the device;
          additional drivers must be enabled in order to use the functionality
          of the device.
@@ -574,6 +588,7 @@ config MFD_SEC_CORE
        select MFD_CORE
        select REGMAP_I2C
        select REGMAP_IRQ
+       select REGULATOR
        help
         Support for the Samsung Electronics MFD series.
         This driver provides common support for accessing the device,
@@ -1057,7 +1072,7 @@ config MFD_LM3533
 config MFD_TIMBERDALE
        tristate "Timberdale FPGA"
        select MFD_CORE
-       depends on PCI && GPIOLIB
+       depends on PCI && GPIOLIB && (X86_32 || COMPILE_TEST)
        ---help---
        This is the core driver for the timberdale FPGA. This device is a
        multifunction device which exposes numerous platform devices.
index 8c6e7bba4660e42b925810553a21bf9e440ceaa3..f00148782d9b3c234609ad10827430ec84c2a56b 100644 (file)
@@ -115,7 +115,7 @@ da9063-objs                 := da9063-core.o da9063-irq.o da9063-i2c.o
 obj-$(CONFIG_MFD_DA9063)       += da9063.o
 
 obj-$(CONFIG_MFD_MAX14577)     += max14577.o
-obj-$(CONFIG_MFD_MAX77686)     += max77686.o max77686-irq.o
+obj-$(CONFIG_MFD_MAX77686)     += max77686.o
 obj-$(CONFIG_MFD_MAX77693)     += max77693.o
 obj-$(CONFIG_MFD_MAX8907)      += max8907.o
 max8925-objs                   := max8925-core.o max8925-i2c.o
@@ -169,3 +169,6 @@ obj-$(CONFIG_MFD_AS3711)    += as3711.o
 obj-$(CONFIG_MFD_AS3722)       += as3722.o
 obj-$(CONFIG_MFD_STW481X)      += stw481x.o
 obj-$(CONFIG_MFD_IPAQ_MICRO)   += ipaq-micro.o
+
+intel-soc-pmic-objs            := intel_soc_pmic_core.o intel_soc_pmic_crc.o
+obj-$(CONFIG_INTEL_SOC_PMIC)   += intel-soc-pmic.o
index 14d9542a4eed8d1408c556c781795e0c24869a9c..4e6e03d63e12bab9e228f5bbbdbc72a4a1a0f6da 100644 (file)
@@ -303,7 +303,10 @@ static ssize_t aat2870_reg_write_file(struct file *file,
        while (*start == ' ')
                start++;
 
-       addr = simple_strtoul(start, &start, 16);
+       ret = kstrtoul(start, 16, &addr);
+       if (ret)
+               return ret;
+
        if (addr >= AAT2870_REG_NUM) {
                dev_err(aat2870->dev, "Invalid address, 0x%lx\n", addr);
                return -EINVAL;
index b348ae5206297eb554e70decb2e21d216fd8a2f6..4659ac1db039b9930f7cc245b787ae01fc3d82d1 100644 (file)
@@ -91,8 +91,8 @@ static int ab3100_set_register_interruptible(struct ab3100 *ab3100,
                        err);
        } else if (err != 2) {
                dev_err(ab3100->dev,
-                       "write error (write register) "
-                       "%d bytes transferred (expected 2)\n",
+                       "write error (write register)\n"
+                       "  %d bytes transferred (expected 2)\n",
                        err);
                err = -EIO;
        } else {
@@ -135,8 +135,8 @@ static int ab3100_set_test_register_interruptible(struct ab3100 *ab3100,
                        err);
        } else if (err != 2) {
                dev_err(ab3100->dev,
-                       "write error (write test register) "
-                       "%d bytes transferred (expected 2)\n",
+                       "write error (write test register)\n"
+                       "  %d bytes transferred (expected 2)\n",
                        err);
                err = -EIO;
        } else {
@@ -171,8 +171,8 @@ static int ab3100_get_register_interruptible(struct ab3100 *ab3100,
                goto get_reg_out_unlock;
        } else if (err != 1) {
                dev_err(ab3100->dev,
-                       "write error (send register address) "
-                       "%d bytes transferred (expected 1)\n",
+                       "write error (send register address)\n"
+                       "  %d bytes transferred (expected 1)\n",
                        err);
                err = -EIO;
                goto get_reg_out_unlock;
@@ -189,8 +189,8 @@ static int ab3100_get_register_interruptible(struct ab3100 *ab3100,
                goto get_reg_out_unlock;
        } else if (err != 1) {
                dev_err(ab3100->dev,
-                       "write error (read register) "
-                       "%d bytes transferred (expected 1)\n",
+                       "write error (read register)\n"
+                       "  %d bytes transferred (expected 1)\n",
                        err);
                err = -EIO;
                goto get_reg_out_unlock;
@@ -237,8 +237,8 @@ static int ab3100_get_register_page_interruptible(struct ab3100 *ab3100,
                goto get_reg_page_out_unlock;
        } else if (err != 1) {
                dev_err(ab3100->dev,
-                       "write error (send first register address) "
-                       "%d bytes transferred (expected 1)\n",
+                       "write error (send first register address)\n"
+                       "  %d bytes transferred (expected 1)\n",
                        err);
                err = -EIO;
                goto get_reg_page_out_unlock;
@@ -252,8 +252,8 @@ static int ab3100_get_register_page_interruptible(struct ab3100 *ab3100,
                goto get_reg_page_out_unlock;
        } else if (err != numregs) {
                dev_err(ab3100->dev,
-                       "write error (read register page) "
-                       "%d bytes transferred (expected %d)\n",
+                       "write error (read register page)\n"
+                       "  %d bytes transferred (expected %d)\n",
                        err, numregs);
                err = -EIO;
                goto get_reg_page_out_unlock;
@@ -295,8 +295,8 @@ static int ab3100_mask_and_set_register_interruptible(struct ab3100 *ab3100,
                goto get_maskset_unlock;
        } else if (err != 1) {
                dev_err(ab3100->dev,
-                       "write error (maskset send address) "
-                       "%d bytes transferred (expected 1)\n",
+                       "write error (maskset send address)\n"
+                       "  %d bytes transferred (expected 1)\n",
                        err);
                err = -EIO;
                goto get_maskset_unlock;
@@ -310,8 +310,8 @@ static int ab3100_mask_and_set_register_interruptible(struct ab3100 *ab3100,
                goto get_maskset_unlock;
        } else if (err != 1) {
                dev_err(ab3100->dev,
-                       "write error (maskset read register) "
-                       "%d bytes transferred (expected 1)\n",
+                       "write error (maskset read register)\n"
+                       "  %d bytes transferred (expected 1)\n",
                        err);
                err = -EIO;
                goto get_maskset_unlock;
@@ -330,8 +330,8 @@ static int ab3100_mask_and_set_register_interruptible(struct ab3100 *ab3100,
                goto get_maskset_unlock;
        } else if (err != 2) {
                dev_err(ab3100->dev,
-                       "write error (write register) "
-                       "%d bytes transferred (expected 2)\n",
+                       "write error (write register)\n"
+                       "  %d bytes transferred (expected 2)\n",
                        err);
                err = -EIO;
                goto get_maskset_unlock;
@@ -371,7 +371,7 @@ EXPORT_SYMBOL(ab3100_event_register);
 int ab3100_event_unregister(struct ab3100 *ab3100,
                            struct notifier_block *nb)
 {
-  return blocking_notifier_chain_unregister(&ab3100->event_subscribers,
+       return blocking_notifier_chain_unregister(&ab3100->event_subscribers,
                                            nb);
 }
 EXPORT_SYMBOL(ab3100_event_unregister);
@@ -455,7 +455,7 @@ static int ab3100_registers_print(struct seq_file *s, void *p)
        u8 value;
        u8 reg;
 
-       seq_printf(s, "AB3100 registers:\n");
+       seq_puts(s, "AB3100 registers:\n");
 
        for (reg = 0; reg < 0xff; reg++) {
                ab3100_get_register_interruptible(ab3100, reg, &value);
@@ -560,8 +560,8 @@ static ssize_t ab3100_get_set_reg(struct file *file,
                ab3100_get_register_interruptible(ab3100, user_reg, &regvalue);
 
                dev_info(ab3100->dev,
-                        "debug write reg[0x%02x] with 0x%02x, "
-                        "after readback: 0x%02x\n",
+                        "debug write reg[0x%02x]\n"
+                        "  with 0x%02x, after readback: 0x%02x\n",
                         user_reg, user_value, regvalue);
        }
        return buf_size;
@@ -719,8 +719,7 @@ static int ab3100_setup(struct ab3100 *ab3100)
         */
        if (ab3100->chip_id == 0xc4) {
                dev_warn(ab3100->dev,
-                        "AB3100 P1E variant detected, "
-                        "forcing chip to 32KHz\n");
+                        "AB3100 P1E variant detected forcing chip to 32KHz\n");
                err = ab3100_set_test_register_interruptible(ab3100,
                        0x02, 0x08);
        }
@@ -878,8 +877,7 @@ static int ab3100_probe(struct i2c_client *client,
                                                &ab3100->chip_id);
        if (err) {
                dev_err(&client->dev,
-                       "could not communicate with the AB3100 analog "
-                       "baseband chip\n");
+                       "failed to communicate with AB3100 chip\n");
                goto exit_no_detect;
        }
 
@@ -902,8 +900,8 @@ static int ab3100_probe(struct i2c_client *client,
        if (ids[i].id == 0x0) {
                dev_err(&client->dev, "unknown analog baseband chip id: 0x%x\n",
                        ab3100->chip_id);
-               dev_err(&client->dev, "accepting it anyway. Please update "
-                       "the driver.\n");
+               dev_err(&client->dev,
+                       "accepting it anyway. Please update the driver.\n");
                goto exit_no_detect;
        }
 
index cf2e6a198c6bc9cea9fb814cfd4d7720955fd475..ce48aa72bb429ef724eb4f15cb695e9c70d3a8e2 100644 (file)
@@ -148,8 +148,8 @@ static const int ab9540_irq_regoffset[AB9540_NUM_IRQ_REGS] = {
 
 /* AB8540 support */
 static const int ab8540_irq_regoffset[AB8540_NUM_IRQ_REGS] = {
-       0, 1, 2, 3, 4, -1, -1, -1, -1, 11, 18, 19, 20, 21, 12, 13, 24, 5, 22, 23,
-       25, 26, 27, 28, 29, 30, 31,
+       0, 1, 2, 3, 4, -1, -1, -1, -1, 11, 18, 19, 20, 21, 12, 13, 24, 5, 22,
+       23, 25, 26, 27, 28, 29, 30, 31,
 };
 
 static const char ab8500_version_str[][7] = {
@@ -322,7 +322,7 @@ static int ab8500_mask_and_set_register(struct device *dev,
        struct ab8500 *ab8500 = dev_get_drvdata(dev->parent);
 
        atomic_inc(&ab8500->transfer_ongoing);
-       ret= mask_and_set_register_interruptible(ab8500, bank, reg,
+       ret = mask_and_set_register_interruptible(ab8500, bank, reg,
                                                 bitmask, bitvalues);
        atomic_dec(&ab8500->transfer_ongoing);
        return ret;
@@ -415,9 +415,11 @@ static void ab8500_irq_unmask(struct irq_data *data)
        if (type & IRQ_TYPE_EDGE_FALLING) {
                if (offset >= AB8500_INT_GPIO6R && offset <= AB8500_INT_GPIO41R)
                        ab8500->mask[index + 2] &= ~mask;
-               else if (offset >= AB9540_INT_GPIO50R && offset <= AB9540_INT_GPIO54R)
+               else if (offset >= AB9540_INT_GPIO50R &&
+                        offset <= AB9540_INT_GPIO54R)
                        ab8500->mask[index + 1] &= ~mask;
-               else if (offset == AB8540_INT_GPIO43R || offset == AB8540_INT_GPIO44R)
+               else if (offset == AB8540_INT_GPIO43R ||
+                        offset == AB8540_INT_GPIO44R)
                        /* Here the falling IRQ is one bit lower */
                        ab8500->mask[index] &= ~(mask << 1);
                else
@@ -451,7 +453,7 @@ static void update_latch_offset(u8 *offset, int i)
        /* Fix inconsistent ab8540 bit mapping... */
        if (unlikely(*offset == 16))
                        *offset = 25;
-       if ((i==3) && (*offset >= 24))
+       if ((i == 3) && (*offset >= 24))
                        *offset += 2;
 }
 
@@ -573,8 +575,8 @@ static int ab8500_irq_map(struct irq_domain *d, unsigned int virq,
 }
 
 static struct irq_domain_ops ab8500_irq_ops = {
-        .map    = ab8500_irq_map,
-        .xlate  = irq_domain_xlate_twocell,
+       .map    = ab8500_irq_map,
+       .xlate  = irq_domain_xlate_twocell,
 };
 
 static int ab8500_irq_init(struct ab8500 *ab8500, struct device_node *np)
@@ -607,8 +609,8 @@ int ab8500_suspend(struct ab8500 *ab8500)
 {
        if (atomic_read(&ab8500->transfer_ongoing))
                return -EINVAL;
-       else
-               return 0;
+
+       return 0;
 }
 
 static struct resource ab8500_gpadc_resources[] = {
@@ -1551,7 +1553,7 @@ static struct attribute_group ab9540_attr_group = {
 
 static int ab8500_probe(struct platform_device *pdev)
 {
-       static char *switch_off_status[] = {
+       static const char *switch_off_status[] = {
                "Swoff bit programming",
                "Thermal protection activation",
                "Vbat lower then BattOk falling threshold",
@@ -1560,7 +1562,7 @@ static int ab8500_probe(struct platform_device *pdev)
                "Battery level lower than power on reset threshold",
                "Power on key 1 pressed longer than 10 seconds",
                "DB8500 thermal shutdown"};
-       static char *turn_on_status[] = {
+       static const char *turn_on_status[] = {
                "Battery rising (Vbat)",
                "Power On Key 1 dbF",
                "Power On Key 2 dbF",
@@ -1579,7 +1581,7 @@ static int ab8500_probe(struct platform_device *pdev)
        int i;
        u8 value;
 
-       ab8500 = devm_kzalloc(&pdev->dev, sizeof *ab8500, GFP_KERNEL);
+       ab8500 = devm_kzalloc(&pdev->dev, sizeof(*ab8500), GFP_KERNEL);
        if (!ab8500)
                return -ENOMEM;
 
@@ -1636,7 +1638,7 @@ static int ab8500_probe(struct platform_device *pdev)
                ab8500->mask_size = AB8540_NUM_IRQ_REGS;
                ab8500->irq_reg_offset = ab8540_irq_regoffset;
                ab8500->it_latchhier_num = AB8540_IT_LATCHHIER_NUM;
-       }/* Configure AB8500 or AB9540 IRQ */
+       } /* Configure AB8500 or AB9540 IRQ */
        else if (is_ab9540(ab8500) || is_ab8505(ab8500)) {
                ab8500->mask_size = AB9540_NUM_IRQ_REGS;
                ab8500->irq_reg_offset = ab9540_irq_regoffset;
@@ -1646,10 +1648,12 @@ static int ab8500_probe(struct platform_device *pdev)
                ab8500->irq_reg_offset = ab8500_irq_regoffset;
                ab8500->it_latchhier_num = AB8500_IT_LATCHHIER_NUM;
        }
-       ab8500->mask = devm_kzalloc(&pdev->dev, ab8500->mask_size, GFP_KERNEL);
+       ab8500->mask = devm_kzalloc(&pdev->dev, ab8500->mask_size,
+                                   GFP_KERNEL);
        if (!ab8500->mask)
                return -ENOMEM;
-       ab8500->oldmask = devm_kzalloc(&pdev->dev, ab8500->mask_size, GFP_KERNEL);
+       ab8500->oldmask = devm_kzalloc(&pdev->dev, ab8500->mask_size,
+                                      GFP_KERNEL);
        if (!ab8500->oldmask)
                return -ENOMEM;
 
@@ -1674,14 +1678,13 @@ static int ab8500_probe(struct platform_device *pdev)
        if (value) {
                for (i = 0; i < ARRAY_SIZE(switch_off_status); i++) {
                        if (value & 1)
-                               printk(KERN_CONT " \"%s\"",
-                                      switch_off_status[i]);
+                               pr_cont(" \"%s\"", switch_off_status[i]);
                        value = value >> 1;
 
                }
-               printk(KERN_CONT "\n");
+               pr_cont("\n");
        } else {
-               printk(KERN_CONT " None\n");
+               pr_cont(" None\n");
        }
        ret = get_register_interruptible(ab8500, AB8500_SYS_CTRL1_BLOCK,
                AB8500_TURN_ON_STATUS, &value);
@@ -1692,12 +1695,12 @@ static int ab8500_probe(struct platform_device *pdev)
        if (value) {
                for (i = 0; i < ARRAY_SIZE(turn_on_status); i++) {
                        if (value & 1)
-                               printk("\"%s\" ", turn_on_status[i]);
+                               pr_cont("\"%s\" ", turn_on_status[i]);
                        value = value >> 1;
                }
-               printk("\n");
+               pr_cont("\n");
        } else {
-               printk("None\n");
+               pr_cont("None\n");
        }
 
        if (plat && plat->init)
index d1a22aae2df51cda0936a52dc58e9df66c493f7d..b2c7e3b1edfabce7500c84f3388f58ebc9344059 100644 (file)
@@ -135,10 +135,10 @@ struct ab8500_prcmu_ranges {
 /* hwreg- "mask" and "shift" entries ressources */
 struct hwreg_cfg {
        u32  bank;      /* target bank */
-       u32  addr;      /* target address */
+       unsigned long addr;      /* target address */
        uint fmt;       /* format */
-       uint mask;      /* read/write mask, applied before any bit shift */
-       int  shift;     /* bit shift (read:right shift, write:left shift */
+       unsigned long mask; /* read/write mask, applied before any bit shift */
+       long shift;     /* bit shift (read:right shift, write:left shift */
 };
 /* fmt bit #0: 0=hexa, 1=dec */
 #define REG_FMT_DEC(c) ((c)->fmt & 0x1)
@@ -1304,16 +1304,17 @@ static int ab8500_registers_print(struct device *dev, u32 bank,
                        }
 
                        if (s) {
-                               err = seq_printf(s, "  [0x%02X/0x%02X]: 0x%02X\n",
-                                       bank, reg, value);
+                               err = seq_printf(s,
+                                                "  [0x%02X/0x%02X]: 0x%02X\n",
+                                                bank, reg, value);
                                if (err < 0) {
                                        /* Error is not returned here since
                                         * the output is wanted in any case */
                                        return 0;
                                }
                        } else {
-                               printk(KERN_INFO" [0x%02X/0x%02X]: 0x%02X\n",
-                                       bank, reg, value);
+                               dev_info(dev, " [0x%02X/0x%02X]: 0x%02X\n",
+                                        bank, reg, value);
                        }
                }
        }
@@ -1325,7 +1326,7 @@ static int ab8500_print_bank_registers(struct seq_file *s, void *p)
        struct device *dev = s->private;
        u32 bank = debug_bank;
 
-       seq_printf(s, AB8500_NAME_STRING " register values:\n");
+       seq_puts(s, AB8500_NAME_STRING " register values:\n");
 
        seq_printf(s, " bank 0x%02X:\n", bank);
 
@@ -1350,12 +1351,11 @@ static int ab8500_print_all_banks(struct seq_file *s, void *p)
 {
        struct device *dev = s->private;
        unsigned int i;
-       int err;
 
-       seq_printf(s, AB8500_NAME_STRING " register values:\n");
+       seq_puts(s, AB8500_NAME_STRING " register values:\n");
 
        for (i = 0; i < AB8500_NUM_BANKS; i++) {
-               err = seq_printf(s, " bank 0x%02X:\n", i);
+               seq_printf(s, " bank 0x%02X:\n", i);
 
                ab8500_registers_print(dev, i, s);
        }
@@ -1367,10 +1367,10 @@ void ab8500_dump_all_banks(struct device *dev)
 {
        unsigned int i;
 
-       printk(KERN_INFO"ab8500 register values:\n");
+       dev_info(dev, "ab8500 register values:\n");
 
        for (i = 1; i < AB8500_NUM_BANKS; i++) {
-               printk(KERN_INFO" bank 0x%02X:\n", i);
+               dev_info(dev, " bank 0x%02X:\n", i);
                ab8500_registers_print(dev, i, NULL);
        }
 }
@@ -1384,8 +1384,6 @@ static struct ab8500_register_dump
        u8 value;
 } ab8500_complete_register_dump[DUMP_MAX_REGS];
 
-extern int prcmu_abb_read(u8 slave, u8 reg, u8 *value, u8 size);
-
 /* This shall only be called upon kernel panic! */
 void ab8500_dump_all_banks_to_mem(void)
 {
@@ -1393,8 +1391,7 @@ void ab8500_dump_all_banks_to_mem(void)
        u8 bank;
        int err = 0;
 
-       pr_info("Saving all ABB registers at \"ab8500_complete_register_dump\" "
-               "for crash analyze.\n");
+       pr_info("Saving all ABB registers for crash analysis.\n");
 
        for (bank = 0; bank < AB8500_NUM_BANKS; bank++) {
                for (i = 0; i < debug_ranges[bank].num_ranges; i++) {
@@ -1564,7 +1561,7 @@ static ssize_t ab8500_val_write(struct file *file,
        err = abx500_set_register_interruptible(dev,
                (u8)debug_bank, debug_address, (u8)user_val);
        if (err < 0) {
-               printk(KERN_ERR "abx500_set_reg failed %d, %d", err, __LINE__);
+               pr_err("abx500_set_reg failed %d, %d", err, __LINE__);
                return -EINVAL;
        }
 
@@ -1596,7 +1593,7 @@ static int ab8500_interrupts_print(struct seq_file *s, void *p)
 {
        int line;
 
-       seq_printf(s, "name: number:  number of: wake:\n");
+       seq_puts(s, "name: number:  number of: wake:\n");
 
        for (line = 0; line < num_interrupt_lines; line++) {
                struct irq_desc *desc = irq_to_desc(line + irq_first);
@@ -1722,7 +1719,8 @@ static int ab8500_print_modem_registers(struct seq_file *s, void *p)
 
 static int ab8500_modem_open(struct inode *inode, struct file *file)
 {
-       return single_open(file, ab8500_print_modem_registers, inode->i_private);
+       return single_open(file, ab8500_print_modem_registers,
+                          inode->i_private);
 }
 
 static const struct file_operations ab8500_modem_fops = {
@@ -1751,7 +1749,8 @@ static int ab8500_gpadc_bat_ctrl_print(struct seq_file *s, void *p)
 
 static int ab8500_gpadc_bat_ctrl_open(struct inode *inode, struct file *file)
 {
-       return single_open(file, ab8500_gpadc_bat_ctrl_print, inode->i_private);
+       return single_open(file, ab8500_gpadc_bat_ctrl_print,
+                          inode->i_private);
 }
 
 static const struct file_operations ab8500_gpadc_bat_ctrl_fops = {
@@ -1781,7 +1780,8 @@ static int ab8500_gpadc_btemp_ball_print(struct seq_file *s, void *p)
 static int ab8500_gpadc_btemp_ball_open(struct inode *inode,
                                        struct file *file)
 {
-       return single_open(file, ab8500_gpadc_btemp_ball_print, inode->i_private);
+       return single_open(file, ab8500_gpadc_btemp_ball_print,
+                          inode->i_private);
 }
 
 static const struct file_operations ab8500_gpadc_btemp_ball_fops = {
@@ -1962,7 +1962,8 @@ static int ab8500_gpadc_main_bat_v_print(struct seq_file *s, void *p)
 static int ab8500_gpadc_main_bat_v_open(struct inode *inode,
                                        struct file *file)
 {
-       return single_open(file, ab8500_gpadc_main_bat_v_print, inode->i_private);
+       return single_open(file, ab8500_gpadc_main_bat_v_print,
+                          inode->i_private);
 }
 
 static const struct file_operations ab8500_gpadc_main_bat_v_fops = {
@@ -2082,7 +2083,8 @@ static int ab8500_gpadc_bk_bat_v_print(struct seq_file *s, void *p)
 
 static int ab8500_gpadc_bk_bat_v_open(struct inode *inode, struct file *file)
 {
-       return single_open(file, ab8500_gpadc_bk_bat_v_print, inode->i_private);
+       return single_open(file, ab8500_gpadc_bk_bat_v_print,
+                          inode->i_private);
 }
 
 static const struct file_operations ab8500_gpadc_bk_bat_v_fops = {
@@ -2111,7 +2113,8 @@ static int ab8500_gpadc_die_temp_print(struct seq_file *s, void *p)
 
 static int ab8500_gpadc_die_temp_open(struct inode *inode, struct file *file)
 {
-       return single_open(file, ab8500_gpadc_die_temp_print, inode->i_private);
+       return single_open(file, ab8500_gpadc_die_temp_print,
+                          inode->i_private);
 }
 
 static const struct file_operations ab8500_gpadc_die_temp_fops = {
@@ -2190,8 +2193,9 @@ static int ab8540_gpadc_vbat_true_meas_print(struct seq_file *s, void *p)
        gpadc = ab8500_gpadc_get("ab8500-gpadc.0");
        vbat_true_meas_raw = ab8500_gpadc_read_raw(gpadc, VBAT_TRUE_MEAS,
                avg_sample, trig_edge, trig_timer, conv_type);
-       vbat_true_meas_convert = ab8500_gpadc_ad_to_voltage(gpadc, VBAT_TRUE_MEAS,
-               vbat_true_meas_raw);
+       vbat_true_meas_convert =
+               ab8500_gpadc_ad_to_voltage(gpadc, VBAT_TRUE_MEAS,
+                                          vbat_true_meas_raw);
 
        return seq_printf(s, "%d,0x%X\n",
                vbat_true_meas_convert, vbat_true_meas_raw);
@@ -2285,7 +2289,8 @@ static const struct file_operations ab8540_gpadc_vbat_meas_and_ibat_fops = {
        .owner = THIS_MODULE,
 };
 
-static int ab8540_gpadc_vbat_true_meas_and_ibat_print(struct seq_file *s, void *p)
+static int ab8540_gpadc_vbat_true_meas_and_ibat_print(struct seq_file *s,
+                                                     void *p)
 {
        int vbat_true_meas_raw;
        int vbat_true_meas_convert;
@@ -2314,7 +2319,8 @@ static int ab8540_gpadc_vbat_true_meas_and_ibat_open(struct inode *inode,
                inode->i_private);
 }
 
-static const struct file_operations ab8540_gpadc_vbat_true_meas_and_ibat_fops = {
+static const struct file_operations
+ab8540_gpadc_vbat_true_meas_and_ibat_fops = {
        .open = ab8540_gpadc_vbat_true_meas_and_ibat_open,
        .read = seq_read,
        .llseek = seq_lseek,
@@ -2368,14 +2374,15 @@ static int ab8540_gpadc_otp_cal_print(struct seq_file *s, void *p)
        ab8540_gpadc_get_otp(gpadc, &vmain_l, &vmain_h, &btemp_l, &btemp_h,
                        &vbat_l, &vbat_h, &ibat_l, &ibat_h);
        return seq_printf(s, "VMAIN_L:0x%X\n"
-               "VMAIN_H:0x%X\n"
-               "BTEMP_L:0x%X\n"
-               "BTEMP_H:0x%X\n"
-               "VBAT_L:0x%X\n"
-               "VBAT_H:0x%X\n"
-               "IBAT_L:0x%X\n"
-               "IBAT_H:0x%X\n",
-               vmain_l, vmain_h, btemp_l, btemp_h, vbat_l, vbat_h, ibat_l, ibat_h);
+                         "VMAIN_H:0x%X\n"
+                         "BTEMP_L:0x%X\n"
+                         "BTEMP_H:0x%X\n"
+                         "VBAT_L:0x%X\n"
+                         "VBAT_H:0x%X\n"
+                         "IBAT_L:0x%X\n"
+                         "IBAT_H:0x%X\n",
+                         vmain_l, vmain_h, btemp_l, btemp_h,
+                         vbat_l, vbat_h, ibat_l, ibat_h);
 }
 
 static int ab8540_gpadc_otp_cal_open(struct inode *inode, struct file *file)
@@ -2419,8 +2426,8 @@ static ssize_t ab8500_gpadc_avg_sample_write(struct file *file,
                        || (user_avg_sample == SAMPLE_16)) {
                avg_sample = (u8) user_avg_sample;
        } else {
-               dev_err(dev, "debugfs error input: "
-                       "should be egal to 1, 4, 8 or 16\n");
+               dev_err(dev,
+                       "debugfs err input: should be egal to 1, 4, 8 or 16\n");
                return -EINVAL;
        }
 
@@ -2504,14 +2511,14 @@ static ssize_t ab8500_gpadc_trig_timer_write(struct file *file,
        if (err)
                return err;
 
-       if ((user_trig_timer >= 0) && (user_trig_timer <= 255)) {
-               trig_timer = (u8) user_trig_timer;
-       } else {
-               dev_err(dev, "debugfs error input: "
-                       "should be beetween 0 to 255\n");
+       if (user_trig_timer & ~0xFF) {
+               dev_err(dev,
+                       "debugfs error input: should be beetween 0 to 255\n");
                return -EINVAL;
        }
 
+       trig_timer = (u8) user_trig_timer;
+
        return count;
 }
 
@@ -2579,6 +2586,7 @@ static const struct file_operations ab8500_gpadc_conv_type_fops = {
 static int strval_len(char *b)
 {
        char *s = b;
+
        if ((*s == '0') && ((*(s+1) == 'x') || (*(s+1) == 'X'))) {
                s += 2;
                for (; *s && (*s != ' ') && (*s != '\n'); s++) {
@@ -2643,13 +2651,17 @@ static ssize_t hwreg_common_write(char *b, struct hwreg_cfg *cfg,
                        b += (*(b+2) == ' ') ? 3 : 6;
                        if (strval_len(b) == 0)
                                return -EINVAL;
-                       loc.mask = simple_strtoul(b, &b, 0);
+                       ret = kstrtoul(b, 0, &loc.mask);
+                       if (ret)
+                               return ret;
                } else if ((!strncmp(b, "-s ", 3)) ||
                                (!strncmp(b, "-shift ", 7))) {
                        b += (*(b+2) == ' ') ? 3 : 7;
                        if (strval_len(b) == 0)
                                return -EINVAL;
-                       loc.shift = simple_strtol(b, &b, 0);
+                       ret = kstrtol(b, 0, &loc.shift);
+                       if (ret)
+                               return ret;
                } else {
                        return -EINVAL;
                }
@@ -2657,29 +2669,36 @@ static ssize_t hwreg_common_write(char *b, struct hwreg_cfg *cfg,
        /* get arg BANK and ADDRESS */
        if (strval_len(b) == 0)
                return -EINVAL;
-       loc.bank = simple_strtoul(b, &b, 0);
+       ret = kstrtouint(b, 0, &loc.bank);
+       if (ret)
+               return ret;
        while (*b == ' ')
                b++;
        if (strval_len(b) == 0)
                return -EINVAL;
-       loc.addr = simple_strtoul(b, &b, 0);
+       ret = kstrtoul(b, 0, &loc.addr);
+       if (ret)
+               return ret;
 
        if (write) {
                while (*b == ' ')
                        b++;
                if (strval_len(b) == 0)
                        return -EINVAL;
-               val = simple_strtoul(b, &b, 0);
+               ret = kstrtouint(b, 0, &val);
+               if (ret)
+                       return ret;
        }
 
        /* args are ok, update target cfg (mainly for read) */
        *cfg = loc;
 
 #ifdef ABB_HWREG_DEBUG
-       pr_warn("HWREG request: %s, %s, addr=0x%08X, mask=0x%X, shift=%d"
-                       "value=0x%X\n", (write) ? "write" : "read",
-                       REG_FMT_DEC(cfg) ? "decimal" : "hexa",
-                       cfg->addr, cfg->mask, cfg->shift, val);
+       pr_warn("HWREG request: %s, %s,\n"
+               "  addr=0x%08X, mask=0x%X, shift=%d" "value=0x%X\n",
+               (write) ? "write" : "read",
+               REG_FMT_DEC(cfg) ? "decimal" : "hexa",
+               cfg->addr, cfg->mask, cfg->shift, val);
 #endif
 
        if (!write)
@@ -2765,8 +2784,8 @@ static ssize_t show_irq(struct device *dev,
        irq_index = name - irq_first;
        if (irq_index >= num_irqs)
                return -EINVAL;
-       else
-               return sprintf(buf, "%u\n", irq_count[irq_index]);
+
+       return sprintf(buf, "%u\n", irq_count[irq_index]);
 }
 
 static ssize_t ab8500_subscribe_write(struct file *file,
@@ -2815,7 +2834,7 @@ static ssize_t ab8500_subscribe_write(struct file *file,
        dev_attr[irq_index]->attr.mode = S_IRUGO;
        err = sysfs_create_file(&dev->kobj, &dev_attr[irq_index]->attr);
        if (err < 0) {
-               printk(KERN_ERR "sysfs_create_file failed %d\n", err);
+               pr_info("sysfs_create_file failed %d\n", err);
                return err;
        }
 
@@ -2823,8 +2842,8 @@ static ssize_t ab8500_subscribe_write(struct file *file,
                                   IRQF_SHARED | IRQF_NO_SUSPEND,
                                   "ab8500-debug", &dev->kobj);
        if (err < 0) {
-               printk(KERN_ERR "request_threaded_irq failed %d, %lu\n",
-                       err, user_val);
+               pr_info("request_threaded_irq failed %d, %lu\n",
+                       err, user_val);
                sysfs_remove_file(&dev->kobj, &dev_attr[irq_index]->attr);
                return err;
        }
@@ -2946,6 +2965,7 @@ static int ab8500_debug_probe(struct platform_device *plf)
        struct dentry *file;
        struct ab8500 *ab8500;
        struct resource *res;
+
        debug_bank = AB8500_MISC;
        debug_address = AB8500_REV_REG & 0x00FF;
 
@@ -2958,7 +2978,7 @@ static int ab8500_debug_probe(struct platform_device *plf)
                return -ENOMEM;
 
        dev_attr = devm_kzalloc(&plf->dev,
-                               sizeof(*dev_attr)*num_irqs,GFP_KERNEL);
+                               sizeof(*dev_attr)*num_irqs, GFP_KERNEL);
        if (!dev_attr)
                return -ENOMEM;
 
@@ -2969,23 +2989,20 @@ static int ab8500_debug_probe(struct platform_device *plf)
 
        res = platform_get_resource_byname(plf, 0, "IRQ_AB8500");
        if (!res) {
-               dev_err(&plf->dev, "AB8500 irq not found, err %d\n",
-                       irq_first);
-               return ENXIO;
+               dev_err(&plf->dev, "AB8500 irq not found, err %d\n", irq_first);
+               return -ENXIO;
        }
        irq_ab8500 = res->start;
 
        irq_first = platform_get_irq_byname(plf, "IRQ_FIRST");
        if (irq_first < 0) {
-               dev_err(&plf->dev, "First irq not found, err %d\n",
-                       irq_first);
+               dev_err(&plf->dev, "First irq not found, err %d\n", irq_first);
                return irq_first;
        }
 
        irq_last = platform_get_irq_byname(plf, "IRQ_LAST");
        if (irq_last < 0) {
-               dev_err(&plf->dev, "Last irq not found, err %d\n",
-                       irq_last);
+               dev_err(&plf->dev, "Last irq not found, err %d\n", irq_last);
                return irq_last;
        }
 
@@ -2994,37 +3011,41 @@ static int ab8500_debug_probe(struct platform_device *plf)
                goto err;
 
        ab8500_gpadc_dir = debugfs_create_dir(AB8500_ADC_NAME_STRING,
-               ab8500_dir);
+                                             ab8500_dir);
        if (!ab8500_gpadc_dir)
                goto err;
 
-       file = debugfs_create_file("all-bank-registers", S_IRUGO,
-               ab8500_dir, &plf->dev, &ab8500_registers_fops);
+       file = debugfs_create_file("all-bank-registers", S_IRUGO, ab8500_dir,
+                                  &plf->dev, &ab8500_registers_fops);
        if (!file)
                goto err;
 
-       file = debugfs_create_file("all-banks", S_IRUGO,
-               ab8500_dir, &plf->dev, &ab8500_all_banks_fops);
+       file = debugfs_create_file("all-banks", S_IRUGO, ab8500_dir,
+                                  &plf->dev, &ab8500_all_banks_fops);
        if (!file)
                goto err;
 
-       file = debugfs_create_file("register-bank", (S_IRUGO | S_IWUSR | S_IWGRP),
-               ab8500_dir, &plf->dev, &ab8500_bank_fops);
+       file = debugfs_create_file("register-bank",
+                                  (S_IRUGO | S_IWUSR | S_IWGRP),
+                                  ab8500_dir, &plf->dev, &ab8500_bank_fops);
        if (!file)
                goto err;
 
-       file = debugfs_create_file("register-address", (S_IRUGO | S_IWUSR | S_IWGRP),
-               ab8500_dir, &plf->dev, &ab8500_address_fops);
+       file = debugfs_create_file("register-address",
+                                  (S_IRUGO | S_IWUSR | S_IWGRP),
+                                  ab8500_dir, &plf->dev, &ab8500_address_fops);
        if (!file)
                goto err;
 
-       file = debugfs_create_file("register-value", (S_IRUGO | S_IWUSR | S_IWGRP),
-               ab8500_dir, &plf->dev, &ab8500_val_fops);
+       file = debugfs_create_file("register-value",
+                                  (S_IRUGO | S_IWUSR | S_IWGRP),
+                                  ab8500_dir, &plf->dev, &ab8500_val_fops);
        if (!file)
                goto err;
 
-       file = debugfs_create_file("irq-subscribe", (S_IRUGO | S_IWUSR | S_IWGRP),
-               ab8500_dir, &plf->dev, &ab8500_subscribe_fops);
+       file = debugfs_create_file("irq-subscribe",
+                                  (S_IRUGO | S_IWUSR | S_IWGRP), ab8500_dir,
+                                  &plf->dev, &ab8500_subscribe_fops);
        if (!file)
                goto err;
 
@@ -3042,158 +3063,191 @@ static int ab8500_debug_probe(struct platform_device *plf)
                num_interrupt_lines = AB8540_NR_IRQS;
        }
 
-       file = debugfs_create_file("interrupts", (S_IRUGO),
-               ab8500_dir, &plf->dev, &ab8500_interrupts_fops);
+       file = debugfs_create_file("interrupts", (S_IRUGO), ab8500_dir,
+                                  &plf->dev, &ab8500_interrupts_fops);
        if (!file)
                goto err;
 
-       file = debugfs_create_file("irq-unsubscribe", (S_IRUGO | S_IWUSR | S_IWGRP),
-               ab8500_dir, &plf->dev, &ab8500_unsubscribe_fops);
+       file = debugfs_create_file("irq-unsubscribe",
+                                  (S_IRUGO | S_IWUSR | S_IWGRP), ab8500_dir,
+                                  &plf->dev, &ab8500_unsubscribe_fops);
        if (!file)
                goto err;
 
        file = debugfs_create_file("hwreg", (S_IRUGO | S_IWUSR | S_IWGRP),
-               ab8500_dir, &plf->dev, &ab8500_hwreg_fops);
+                                  ab8500_dir, &plf->dev, &ab8500_hwreg_fops);
        if (!file)
                goto err;
 
-       file = debugfs_create_file("all-modem-registers", (S_IRUGO | S_IWUSR | S_IWGRP),
-               ab8500_dir, &plf->dev, &ab8500_modem_fops);
+       file = debugfs_create_file("all-modem-registers",
+                                  (S_IRUGO | S_IWUSR | S_IWGRP),
+                                  ab8500_dir, &plf->dev, &ab8500_modem_fops);
        if (!file)
                goto err;
 
        file = debugfs_create_file("bat_ctrl", (S_IRUGO | S_IWUSR | S_IWGRP),
-               ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_bat_ctrl_fops);
+                                  ab8500_gpadc_dir, &plf->dev,
+                                  &ab8500_gpadc_bat_ctrl_fops);
        if (!file)
                goto err;
 
        file = debugfs_create_file("btemp_ball", (S_IRUGO | S_IWUSR | S_IWGRP),
-               ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_btemp_ball_fops);
+                                  ab8500_gpadc_dir,
+                                  &plf->dev, &ab8500_gpadc_btemp_ball_fops);
        if (!file)
                goto err;
 
-       file = debugfs_create_file("main_charger_v", (S_IRUGO | S_IWUSR | S_IWGRP),
-               ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_main_charger_v_fops);
+       file = debugfs_create_file("main_charger_v",
+                                  (S_IRUGO | S_IWUSR | S_IWGRP),
+                                  ab8500_gpadc_dir, &plf->dev,
+                                  &ab8500_gpadc_main_charger_v_fops);
        if (!file)
                goto err;
 
-       file = debugfs_create_file("acc_detect1", (S_IRUGO | S_IWUSR | S_IWGRP),
-               ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_acc_detect1_fops);
+       file = debugfs_create_file("acc_detect1",
+                                  (S_IRUGO | S_IWUSR | S_IWGRP),
+                                  ab8500_gpadc_dir, &plf->dev,
+                                  &ab8500_gpadc_acc_detect1_fops);
        if (!file)
                goto err;
 
-       file = debugfs_create_file("acc_detect2", (S_IRUGO | S_IWUSR | S_IWGRP),
-               ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_acc_detect2_fops);
+       file = debugfs_create_file("acc_detect2",
+                                  (S_IRUGO | S_IWUSR | S_IWGRP),
+                                  ab8500_gpadc_dir, &plf->dev,
+                                  &ab8500_gpadc_acc_detect2_fops);
        if (!file)
                goto err;
 
        file = debugfs_create_file("adc_aux1", (S_IRUGO | S_IWUSR | S_IWGRP),
-               ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_aux1_fops);
+                                  ab8500_gpadc_dir, &plf->dev,
+                                  &ab8500_gpadc_aux1_fops);
        if (!file)
                goto err;
 
        file = debugfs_create_file("adc_aux2", (S_IRUGO | S_IWUSR | S_IWGRP),
-               ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_aux2_fops);
+                                  ab8500_gpadc_dir, &plf->dev,
+                                  &ab8500_gpadc_aux2_fops);
        if (!file)
                goto err;
 
        file = debugfs_create_file("main_bat_v", (S_IRUGO | S_IWUSR | S_IWGRP),
-               ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_main_bat_v_fops);
+                                  ab8500_gpadc_dir, &plf->dev,
+                                  &ab8500_gpadc_main_bat_v_fops);
        if (!file)
                goto err;
 
        file = debugfs_create_file("vbus_v", (S_IRUGO | S_IWUSR | S_IWGRP),
-               ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_vbus_v_fops);
+                                  ab8500_gpadc_dir, &plf->dev,
+                                  &ab8500_gpadc_vbus_v_fops);
        if (!file)
                goto err;
 
-       file = debugfs_create_file("main_charger_c", (S_IRUGO | S_IWUSR | S_IWGRP),
-               ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_main_charger_c_fops);
+       file = debugfs_create_file("main_charger_c",
+                                  (S_IRUGO | S_IWUSR | S_IWGRP),
+                                  ab8500_gpadc_dir, &plf->dev,
+                                  &ab8500_gpadc_main_charger_c_fops);
        if (!file)
                goto err;
 
-       file = debugfs_create_file("usb_charger_c", (S_IRUGO | S_IWUSR | S_IWGRP),
-               ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_usb_charger_c_fops);
+       file = debugfs_create_file("usb_charger_c",
+                                  (S_IRUGO | S_IWUSR | S_IWGRP),
+                                  ab8500_gpadc_dir,
+                                  &plf->dev, &ab8500_gpadc_usb_charger_c_fops);
        if (!file)
                goto err;
 
        file = debugfs_create_file("bk_bat_v", (S_IRUGO | S_IWUSR | S_IWGRP),
-               ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_bk_bat_v_fops);
+                                  ab8500_gpadc_dir, &plf->dev,
+                                  &ab8500_gpadc_bk_bat_v_fops);
        if (!file)
                goto err;
 
        file = debugfs_create_file("die_temp", (S_IRUGO | S_IWUSR | S_IWGRP),
-               ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_die_temp_fops);
+                                  ab8500_gpadc_dir, &plf->dev,
+                                  &ab8500_gpadc_die_temp_fops);
        if (!file)
                goto err;
 
        file = debugfs_create_file("usb_id", (S_IRUGO | S_IWUSR | S_IWGRP),
-               ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_usb_id_fops);
+                                  ab8500_gpadc_dir, &plf->dev,
+                                  &ab8500_gpadc_usb_id_fops);
        if (!file)
                goto err;
 
        if (is_ab8540(ab8500)) {
-               file = debugfs_create_file("xtal_temp", (S_IRUGO | S_IWUSR | S_IWGRP),
-                       ab8500_gpadc_dir, &plf->dev, &ab8540_gpadc_xtal_temp_fops);
+               file = debugfs_create_file("xtal_temp",
+                                          (S_IRUGO | S_IWUSR | S_IWGRP),
+                                          ab8500_gpadc_dir, &plf->dev,
+                                          &ab8540_gpadc_xtal_temp_fops);
                if (!file)
                        goto err;
-               file = debugfs_create_file("vbattruemeas", (S_IRUGO | S_IWUSR | S_IWGRP),
-                       ab8500_gpadc_dir, &plf->dev,
-                       &ab8540_gpadc_vbat_true_meas_fops);
+               file = debugfs_create_file("vbattruemeas",
+                                          (S_IRUGO | S_IWUSR | S_IWGRP),
+                                          ab8500_gpadc_dir, &plf->dev,
+                                          &ab8540_gpadc_vbat_true_meas_fops);
                if (!file)
                        goto err;
                file = debugfs_create_file("batctrl_and_ibat",
-                       (S_IRUGO | S_IWUGO), ab8500_gpadc_dir,
-                       &plf->dev, &ab8540_gpadc_bat_ctrl_and_ibat_fops);
+                                       (S_IRUGO | S_IWUGO),
+                                       ab8500_gpadc_dir,
+                                       &plf->dev,
+                                       &ab8540_gpadc_bat_ctrl_and_ibat_fops);
                if (!file)
                        goto err;
                file = debugfs_create_file("vbatmeas_and_ibat",
-                       (S_IRUGO | S_IWUGO), ab8500_gpadc_dir,
-                       &plf->dev,
-                       &ab8540_gpadc_vbat_meas_and_ibat_fops);
+                                       (S_IRUGO | S_IWUGO),
+                                       ab8500_gpadc_dir, &plf->dev,
+                                       &ab8540_gpadc_vbat_meas_and_ibat_fops);
                if (!file)
                        goto err;
                file = debugfs_create_file("vbattruemeas_and_ibat",
-                       (S_IRUGO | S_IWUGO), ab8500_gpadc_dir,
-                       &plf->dev,
-                       &ab8540_gpadc_vbat_true_meas_and_ibat_fops);
+                               (S_IRUGO | S_IWUGO),
+                               ab8500_gpadc_dir,
+                               &plf->dev,
+                               &ab8540_gpadc_vbat_true_meas_and_ibat_fops);
                if (!file)
                        goto err;
                file = debugfs_create_file("battemp_and_ibat",
-                       (S_IRUGO | S_IWUGO), ab8500_gpadc_dir,
+                       (S_IRUGO | S_IWUGO),
+                       ab8500_gpadc_dir,
                        &plf->dev, &ab8540_gpadc_bat_temp_and_ibat_fops);
                if (!file)
                        goto err;
-               file = debugfs_create_file("otp_calib", (S_IRUGO | S_IWUSR | S_IWGRP),
-                       ab8500_gpadc_dir, &plf->dev, &ab8540_gpadc_otp_calib_fops);
+               file = debugfs_create_file("otp_calib",
+                               (S_IRUGO | S_IWUSR | S_IWGRP),
+                               ab8500_gpadc_dir,
+                               &plf->dev, &ab8540_gpadc_otp_calib_fops);
                if (!file)
                        goto err;
        }
        file = debugfs_create_file("avg_sample", (S_IRUGO | S_IWUSR | S_IWGRP),
-               ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_avg_sample_fops);
+                                  ab8500_gpadc_dir, &plf->dev,
+                                  &ab8500_gpadc_avg_sample_fops);
        if (!file)
                goto err;
 
        file = debugfs_create_file("trig_edge", (S_IRUGO | S_IWUSR | S_IWGRP),
-               ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_trig_edge_fops);
+                                  ab8500_gpadc_dir, &plf->dev,
+                                  &ab8500_gpadc_trig_edge_fops);
        if (!file)
                goto err;
 
        file = debugfs_create_file("trig_timer", (S_IRUGO | S_IWUSR | S_IWGRP),
-               ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_trig_timer_fops);
+                                  ab8500_gpadc_dir, &plf->dev,
+                                  &ab8500_gpadc_trig_timer_fops);
        if (!file)
                goto err;
 
        file = debugfs_create_file("conv_type", (S_IRUGO | S_IWUSR | S_IWGRP),
-               ab8500_gpadc_dir, &plf->dev, &ab8500_gpadc_conv_type_fops);
+                                  ab8500_gpadc_dir, &plf->dev,
+                                  &ab8500_gpadc_conv_type_fops);
        if (!file)
                goto err;
 
        return 0;
 
 err:
-       if (ab8500_dir)
-               debugfs_remove_recursive(ab8500_dir);
+       debugfs_remove_recursive(ab8500_dir);
        dev_err(&plf->dev, "failed to create debugfs entries.\n");
 
        return -ENOMEM;
index cfc191abae4a5d777c07e59fa26fd78ec4340287..10a0cb90619ae49c2969fe7d123bc7f45733ff8a 100644 (file)
@@ -123,6 +123,8 @@ static irqreturn_t arizona_underclocked(int irq, void *data)
                dev_err(arizona->dev, "AIF2 underclocked\n");
        if (val & ARIZONA_AIF1_UNDERCLOCKED_STS)
                dev_err(arizona->dev, "AIF1 underclocked\n");
+       if (val & ARIZONA_ISRC3_UNDERCLOCKED_STS)
+               dev_err(arizona->dev, "ISRC3 underclocked\n");
        if (val & ARIZONA_ISRC2_UNDERCLOCKED_STS)
                dev_err(arizona->dev, "ISRC2 underclocked\n");
        if (val & ARIZONA_ISRC1_UNDERCLOCKED_STS)
@@ -192,6 +194,8 @@ static irqreturn_t arizona_overclocked(int irq, void *data)
                dev_err(arizona->dev, "ASRC sync WARP overclocked\n");
        if (val[1] & ARIZONA_ADSP2_1_OVERCLOCKED_STS)
                dev_err(arizona->dev, "DSP1 overclocked\n");
+       if (val[1] & ARIZONA_ISRC3_OVERCLOCKED_STS)
+               dev_err(arizona->dev, "ISRC3 overclocked\n");
        if (val[1] & ARIZONA_ISRC2_OVERCLOCKED_STS)
                dev_err(arizona->dev, "ISRC2 overclocked\n");
        if (val[1] & ARIZONA_ISRC1_OVERCLOCKED_STS)
@@ -497,12 +501,12 @@ const struct dev_pm_ops arizona_pm_ops = {
 EXPORT_SYMBOL_GPL(arizona_pm_ops);
 
 #ifdef CONFIG_OF
-int arizona_of_get_type(struct device *dev)
+unsigned long arizona_of_get_type(struct device *dev)
 {
        const struct of_device_id *id = of_match_device(arizona_of_match, dev);
 
        if (id)
-               return (int)id->data;
+               return (unsigned long)id->data;
        else
                return 0;
 }
@@ -578,17 +582,21 @@ static const struct mfd_cell early_devs[] = {
 };
 
 static const char *wm5102_supplies[] = {
+       "MICVDD",
        "DBVDD2",
        "DBVDD3",
        "CPVDD",
        "SPKVDDL",
        "SPKVDDR",
-       "MICVDD",
 };
 
 static const struct mfd_cell wm5102_devs[] = {
        { .name = "arizona-micsupp" },
-       { .name = "arizona-extcon" },
+       {
+               .name = "arizona-extcon",
+               .parent_supplies = wm5102_supplies,
+               .num_parent_supplies = 1, /* We only need MICVDD */
+       },
        { .name = "arizona-gpio" },
        { .name = "arizona-haptics" },
        { .name = "arizona-pwm" },
@@ -601,7 +609,11 @@ static const struct mfd_cell wm5102_devs[] = {
 
 static const struct mfd_cell wm5110_devs[] = {
        { .name = "arizona-micsupp" },
-       { .name = "arizona-extcon" },
+       {
+               .name = "arizona-extcon",
+               .parent_supplies = wm5102_supplies,
+               .num_parent_supplies = 1, /* We only need MICVDD */
+       },
        { .name = "arizona-gpio" },
        { .name = "arizona-haptics" },
        { .name = "arizona-pwm" },
@@ -613,6 +625,7 @@ static const struct mfd_cell wm5110_devs[] = {
 };
 
 static const char *wm8997_supplies[] = {
+       "MICVDD",
        "DBVDD2",
        "CPVDD",
        "SPKVDD",
@@ -620,7 +633,11 @@ static const char *wm8997_supplies[] = {
 
 static const struct mfd_cell wm8997_devs[] = {
        { .name = "arizona-micsupp" },
-       { .name = "arizona-extcon" },
+       {
+               .name = "arizona-extcon",
+               .parent_supplies = wm8997_supplies,
+               .num_parent_supplies = 1, /* We only need MICVDD */
+       },
        { .name = "arizona-gpio" },
        { .name = "arizona-haptics" },
        { .name = "arizona-pwm" },
@@ -683,7 +700,13 @@ int arizona_dev_init(struct arizona *arizona)
                goto err_early;
        }
 
-       arizona->dcvdd = devm_regulator_get(arizona->dev, "DCVDD");
+       /**
+        * Don't use devres here because the only device we have to get
+        * against is the MFD device and DCVDD will likely be supplied by
+        * one of its children. Meaning that the regulator will be
+        * destroyed by the time devres calls regulator put.
+        */
+       arizona->dcvdd = regulator_get(arizona->dev, "DCVDD");
        if (IS_ERR(arizona->dcvdd)) {
                ret = PTR_ERR(arizona->dcvdd);
                dev_err(dev, "Failed to request DCVDD: %d\n", ret);
@@ -697,7 +720,7 @@ int arizona_dev_init(struct arizona *arizona)
                                       "arizona /RESET");
                if (ret != 0) {
                        dev_err(dev, "Failed to request /RESET: %d\n", ret);
-                       goto err_early;
+                       goto err_dcvdd;
                }
        }
 
@@ -706,7 +729,7 @@ int arizona_dev_init(struct arizona *arizona)
        if (ret != 0) {
                dev_err(dev, "Failed to enable core supplies: %d\n",
                        ret);
-               goto err_early;
+               goto err_dcvdd;
        }
 
        ret = regulator_enable(arizona->dcvdd);
@@ -1015,6 +1038,8 @@ err_reset:
 err_enable:
        regulator_bulk_disable(arizona->num_core_supplies,
                               arizona->core_supplies);
+err_dcvdd:
+       regulator_put(arizona->dcvdd);
 err_early:
        mfd_remove_devices(dev);
        return ret;
@@ -1023,16 +1048,20 @@ EXPORT_SYMBOL_GPL(arizona_dev_init);
 
 int arizona_dev_exit(struct arizona *arizona)
 {
+       pm_runtime_disable(arizona->dev);
+
+       regulator_disable(arizona->dcvdd);
+       regulator_put(arizona->dcvdd);
+
        mfd_remove_devices(arizona->dev);
        arizona_free_irq(arizona, ARIZONA_IRQ_UNDERCLOCKED, arizona);
        arizona_free_irq(arizona, ARIZONA_IRQ_OVERCLOCKED, arizona);
        arizona_free_irq(arizona, ARIZONA_IRQ_CLKGEN_ERR, arizona);
-       pm_runtime_disable(arizona->dev);
        arizona_irq_exit(arizona);
        if (arizona->pdata.reset)
                gpio_set_value_cansleep(arizona->pdata.reset, 0);
-       regulator_disable(arizona->dcvdd);
-       regulator_bulk_disable(ARRAY_SIZE(arizona->core_supplies),
+
+       regulator_bulk_disable(arizona->num_core_supplies,
                               arizona->core_supplies);
        return 0;
 }
index beccb790c9bab93869015044142666dc786b9508..9d4156fb082ae0b8d040e039ba17cd0aadf331d8 100644 (file)
 #include "arizona.h"
 
 static int arizona_i2c_probe(struct i2c_client *i2c,
-                                         const struct i2c_device_id *id)
+                            const struct i2c_device_id *id)
 {
        struct arizona *arizona;
        const struct regmap_config *regmap_config;
-       int ret, type;
+       unsigned long type;
+       int ret;
 
        if (i2c->dev.of_node)
                type = arizona_of_get_type(&i2c->dev);
index 17102f589100d3ef5185163d40417ff0726a236f..d420dbc0e2b0065dbb1f03d29d6e4c9c20c7abc2 100644 (file)
@@ -188,24 +188,33 @@ int arizona_irq_init(struct arizona *arizona)
        int flags = IRQF_ONESHOT;
        int ret, i;
        const struct regmap_irq_chip *aod, *irq;
-       bool ctrlif_error = true;
        struct irq_data *irq_data;
 
+       arizona->ctrlif_error = true;
+
        switch (arizona->type) {
 #ifdef CONFIG_MFD_WM5102
        case WM5102:
                aod = &wm5102_aod;
                irq = &wm5102_irq;
 
-               ctrlif_error = false;
+               arizona->ctrlif_error = false;
                break;
 #endif
 #ifdef CONFIG_MFD_WM5110
        case WM5110:
                aod = &wm5110_aod;
-               irq = &wm5110_irq;
 
-               ctrlif_error = false;
+               switch (arizona->rev) {
+               case 0 ... 2:
+                       irq = &wm5110_irq;
+                       break;
+               default:
+                       irq = &wm5110_revd_irq;
+                       break;
+               }
+
+               arizona->ctrlif_error = false;
                break;
 #endif
 #ifdef CONFIG_MFD_WM8997
@@ -213,7 +222,7 @@ int arizona_irq_init(struct arizona *arizona)
                aod = &wm8997_aod;
                irq = &wm8997_irq;
 
-               ctrlif_error = false;
+               arizona->ctrlif_error = false;
                break;
 #endif
        default:
@@ -300,7 +309,7 @@ int arizona_irq_init(struct arizona *arizona)
        }
 
        /* Handle control interface errors in the core */
-       if (ctrlif_error) {
+       if (arizona->ctrlif_error) {
                i = arizona_map_irq(arizona, ARIZONA_IRQ_CTRLIF_ERR);
                ret = request_threaded_irq(i, NULL, arizona_ctrlif_err,
                                           IRQF_ONESHOT,
@@ -345,7 +354,9 @@ int arizona_irq_init(struct arizona *arizona)
        return 0;
 
 err_main_irq:
-       free_irq(arizona_map_irq(arizona, ARIZONA_IRQ_CTRLIF_ERR), arizona);
+       if (arizona->ctrlif_error)
+               free_irq(arizona_map_irq(arizona, ARIZONA_IRQ_CTRLIF_ERR),
+                        arizona);
 err_ctrlif:
        free_irq(arizona_map_irq(arizona, ARIZONA_IRQ_BOOT_DONE), arizona);
 err_boot_done:
@@ -361,7 +372,9 @@ err:
 
 int arizona_irq_exit(struct arizona *arizona)
 {
-       free_irq(arizona_map_irq(arizona, ARIZONA_IRQ_CTRLIF_ERR), arizona);
+       if (arizona->ctrlif_error)
+               free_irq(arizona_map_irq(arizona, ARIZONA_IRQ_CTRLIF_ERR),
+                        arizona);
        free_irq(arizona_map_irq(arizona, ARIZONA_IRQ_BOOT_DONE), arizona);
        regmap_del_irq_chip(irq_create_mapping(arizona->virq, 1),
                            arizona->irq_chip);
index 1ca554b18bef76c8dd92156a2c9bf7ed87127fc3..5145d78bf07e0ddfa9556716408eb29bfcb7b132 100644 (file)
@@ -28,7 +28,8 @@ static int arizona_spi_probe(struct spi_device *spi)
        const struct spi_device_id *id = spi_get_device_id(spi);
        struct arizona *arizona;
        const struct regmap_config *regmap_config;
-       int ret, type;
+       unsigned long type;
+       int ret;
 
        if (spi->dev.of_node)
                type = arizona_of_get_type(&spi->dev);
index b4cef777df73732f451949ef6ef118c24bad387c..fbe2843271c5924a9d89821e2143380659e329c1 100644 (file)
@@ -36,6 +36,7 @@ extern const struct regmap_irq_chip wm5102_irq;
 
 extern const struct regmap_irq_chip wm5110_aod;
 extern const struct regmap_irq_chip wm5110_irq;
+extern const struct regmap_irq_chip wm5110_revd_irq;
 
 extern const struct regmap_irq_chip wm8997_aod;
 extern const struct regmap_irq_chip wm8997_irq;
@@ -46,9 +47,9 @@ int arizona_irq_init(struct arizona *arizona);
 int arizona_irq_exit(struct arizona *arizona);
 
 #ifdef CONFIG_OF
-int arizona_of_get_type(struct device *dev);
+unsigned long arizona_of_get_type(struct device *dev);
 #else
-static inline int arizona_of_get_type(struct device *dev)
+static inline unsigned long arizona_of_get_type(struct device *dev)
 {
        return 0;
 }
index 9f6294f2a0708ab6be063d4bfbc0f98ad1062fa5..9fc4186d41328af729beb99cb30488a89b64d937 100644 (file)
@@ -899,13 +899,15 @@ static int __init asic3_mfd_probe(struct platform_device *pdev,
        ds1wm_resources[0].end   >>= asic->bus_shift;
 
        /* MMC */
-       asic->tmio_cnf = ioremap((ASIC3_SD_CONFIG_BASE >> asic->bus_shift) +
+       if (mem_sdio) {
+               asic->tmio_cnf = ioremap((ASIC3_SD_CONFIG_BASE >> asic->bus_shift) +
                                 mem_sdio->start,
                                 ASIC3_SD_CONFIG_SIZE >> asic->bus_shift);
-       if (!asic->tmio_cnf) {
-               ret = -ENOMEM;
-               dev_dbg(asic->dev, "Couldn't ioremap SD_CONFIG\n");
-               goto out;
+               if (!asic->tmio_cnf) {
+                       ret = -ENOMEM;
+                       dev_dbg(asic->dev, "Couldn't ioremap SD_CONFIG\n");
+                       goto out;
+               }
        }
        asic3_mmc_resources[0].start >>= asic->bus_shift;
        asic3_mmc_resources[0].end   >>= asic->bus_shift;
index 38fe9bf0d169b32e0e5168ad8d2ac4015e48c6fe..4873f9c504526503eaef81ba97dfd640e65e3386 100644 (file)
 #include <linux/mfd/cros_ec_commands.h>
 
 int cros_ec_prepare_tx(struct cros_ec_device *ec_dev,
-                      struct cros_ec_msg *msg)
+                      struct cros_ec_command *msg)
 {
        uint8_t *out;
        int csum, i;
 
-       BUG_ON(msg->out_len > EC_PROTO2_MAX_PARAM_SIZE);
+       BUG_ON(msg->outsize > EC_PROTO2_MAX_PARAM_SIZE);
        out = ec_dev->dout;
        out[0] = EC_CMD_VERSION0 + msg->version;
-       out[1] = msg->cmd;
-       out[2] = msg->out_len;
+       out[1] = msg->command;
+       out[2] = msg->outsize;
        csum = out[0] + out[1] + out[2];
-       for (i = 0; i < msg->out_len; i++)
-               csum += out[EC_MSG_TX_HEADER_BYTES + i] = msg->out_buf[i];
-       out[EC_MSG_TX_HEADER_BYTES + msg->out_len] = (uint8_t)(csum & 0xff);
+       for (i = 0; i < msg->outsize; i++)
+               csum += out[EC_MSG_TX_HEADER_BYTES + i] = msg->outdata[i];
+       out[EC_MSG_TX_HEADER_BYTES + msg->outsize] = (uint8_t)(csum & 0xff);
 
-       return EC_MSG_TX_PROTO_BYTES + msg->out_len;
+       return EC_MSG_TX_PROTO_BYTES + msg->outsize;
 }
 EXPORT_SYMBOL(cros_ec_prepare_tx);
 
-static int cros_ec_command_sendrecv(struct cros_ec_device *ec_dev,
-               uint16_t cmd, void *out_buf, int out_len,
-               void *in_buf, int in_len)
+int cros_ec_check_result(struct cros_ec_device *ec_dev,
+                        struct cros_ec_command *msg)
 {
-       struct cros_ec_msg msg;
-
-       msg.version = cmd >> 8;
-       msg.cmd = cmd & 0xff;
-       msg.out_buf = out_buf;
-       msg.out_len = out_len;
-       msg.in_buf = in_buf;
-       msg.in_len = in_len;
-
-       return ec_dev->command_xfer(ec_dev, &msg);
-}
-
-static int cros_ec_command_recv(struct cros_ec_device *ec_dev,
-               uint16_t cmd, void *buf, int buf_len)
-{
-       return cros_ec_command_sendrecv(ec_dev, cmd, NULL, 0, buf, buf_len);
-}
-
-static int cros_ec_command_send(struct cros_ec_device *ec_dev,
-               uint16_t cmd, void *buf, int buf_len)
-{
-       return cros_ec_command_sendrecv(ec_dev, cmd, buf, buf_len, NULL, 0);
-}
-
-static irqreturn_t ec_irq_thread(int irq, void *data)
-{
-       struct cros_ec_device *ec_dev = data;
-
-       if (device_may_wakeup(ec_dev->dev))
-               pm_wakeup_event(ec_dev->dev, 0);
-
-       blocking_notifier_call_chain(&ec_dev->event_notifier, 1, ec_dev);
-
-       return IRQ_HANDLED;
+       switch (msg->result) {
+       case EC_RES_SUCCESS:
+               return 0;
+       case EC_RES_IN_PROGRESS:
+               dev_dbg(ec_dev->dev, "command 0x%02x in progress\n",
+                       msg->command);
+               return -EAGAIN;
+       default:
+               dev_dbg(ec_dev->dev, "command 0x%02x returned %d\n",
+                       msg->command, msg->result);
+               return 0;
+       }
 }
+EXPORT_SYMBOL(cros_ec_check_result);
 
 static const struct mfd_cell cros_devs[] = {
        {
@@ -102,12 +80,6 @@ int cros_ec_register(struct cros_ec_device *ec_dev)
        struct device *dev = ec_dev->dev;
        int err = 0;
 
-       BLOCKING_INIT_NOTIFIER_HEAD(&ec_dev->event_notifier);
-
-       ec_dev->command_send = cros_ec_command_send;
-       ec_dev->command_recv = cros_ec_command_recv;
-       ec_dev->command_sendrecv = cros_ec_command_sendrecv;
-
        if (ec_dev->din_size) {
                ec_dev->din = devm_kzalloc(dev, ec_dev->din_size, GFP_KERNEL);
                if (!ec_dev->din)
@@ -119,42 +91,23 @@ int cros_ec_register(struct cros_ec_device *ec_dev)
                        return -ENOMEM;
        }
 
-       if (!ec_dev->irq) {
-               dev_dbg(dev, "no valid IRQ: %d\n", ec_dev->irq);
-               return err;
-       }
-
-       err = request_threaded_irq(ec_dev->irq, NULL, ec_irq_thread,
-                                  IRQF_TRIGGER_LOW | IRQF_ONESHOT,
-                                  "chromeos-ec", ec_dev);
-       if (err) {
-               dev_err(dev, "request irq %d: error %d\n", ec_dev->irq, err);
-               return err;
-       }
-
        err = mfd_add_devices(dev, 0, cros_devs,
                              ARRAY_SIZE(cros_devs),
                              NULL, ec_dev->irq, NULL);
        if (err) {
                dev_err(dev, "failed to add mfd devices\n");
-               goto fail_mfd;
+               return err;
        }
 
-       dev_info(dev, "Chrome EC (%s)\n", ec_dev->name);
+       dev_info(dev, "Chrome EC device registered\n");
 
        return 0;
-
-fail_mfd:
-       free_irq(ec_dev->irq, ec_dev);
-
-       return err;
 }
 EXPORT_SYMBOL(cros_ec_register);
 
 int cros_ec_remove(struct cros_ec_device *ec_dev)
 {
        mfd_remove_devices(ec_dev->dev);
-       free_irq(ec_dev->irq, ec_dev);
 
        return 0;
 }
index 4f71be99a183713810c5d00e7f4eac480e006a58..c0c30f4f946f98bd5e7dbd066e3511df0bfb7f89 100644 (file)
@@ -29,12 +29,13 @@ static inline struct cros_ec_device *to_ec_dev(struct device *dev)
        return i2c_get_clientdata(client);
 }
 
-static int cros_ec_command_xfer(struct cros_ec_device *ec_dev,
-                               struct cros_ec_msg *msg)
+static int cros_ec_cmd_xfer_i2c(struct cros_ec_device *ec_dev,
+                               struct cros_ec_command *msg)
 {
        struct i2c_client *client = ec_dev->priv;
        int ret = -ENOMEM;
        int i;
+       int len;
        int packet_len;
        u8 *out_buf = NULL;
        u8 *in_buf = NULL;
@@ -50,7 +51,7 @@ static int cros_ec_command_xfer(struct cros_ec_device *ec_dev,
         * allocate larger packet (one byte for checksum, one byte for
         * length, and one for result code)
         */
-       packet_len = msg->in_len + 3;
+       packet_len = msg->insize + 3;
        in_buf = kzalloc(packet_len, GFP_KERNEL);
        if (!in_buf)
                goto done;
@@ -61,7 +62,7 @@ static int cros_ec_command_xfer(struct cros_ec_device *ec_dev,
         * allocate larger packet (one byte for checksum, one for
         * command code, one for length, and one for command version)
         */
-       packet_len = msg->out_len + 4;
+       packet_len = msg->outsize + 4;
        out_buf = kzalloc(packet_len, GFP_KERNEL);
        if (!out_buf)
                goto done;
@@ -69,16 +70,16 @@ static int cros_ec_command_xfer(struct cros_ec_device *ec_dev,
        i2c_msg[0].buf = (char *)out_buf;
 
        out_buf[0] = EC_CMD_VERSION0 + msg->version;
-       out_buf[1] = msg->cmd;
-       out_buf[2] = msg->out_len;
+       out_buf[1] = msg->command;
+       out_buf[2] = msg->outsize;
 
        /* copy message payload and compute checksum */
        sum = out_buf[0] + out_buf[1] + out_buf[2];
-       for (i = 0; i < msg->out_len; i++) {
-               out_buf[3 + i] = msg->out_buf[i];
+       for (i = 0; i < msg->outsize; i++) {
+               out_buf[3 + i] = msg->outdata[i];
                sum += out_buf[3 + i];
        }
-       out_buf[3 + msg->out_len] = sum;
+       out_buf[3 + msg->outsize] = sum;
 
        /* send command to EC and read answer */
        ret = i2c_transfer(client->adapter, i2c_msg, 2);
@@ -92,28 +93,34 @@ static int cros_ec_command_xfer(struct cros_ec_device *ec_dev,
        }
 
        /* check response error code */
-       if (i2c_msg[1].buf[0]) {
-               dev_warn(ec_dev->dev, "command 0x%02x returned an error %d\n",
-                        msg->cmd, i2c_msg[1].buf[0]);
-               ret = -EINVAL;
+       msg->result = i2c_msg[1].buf[0];
+       ret = cros_ec_check_result(ec_dev, msg);
+       if (ret)
+               goto done;
+
+       len = in_buf[1];
+       if (len > msg->insize) {
+               dev_err(ec_dev->dev, "packet too long (%d bytes, expected %d)",
+                       len, msg->insize);
+               ret = -ENOSPC;
                goto done;
        }
 
        /* copy response packet payload and compute checksum */
        sum = in_buf[0] + in_buf[1];
-       for (i = 0; i < msg->in_len; i++) {
-               msg->in_buf[i] = in_buf[2 + i];
+       for (i = 0; i < len; i++) {
+               msg->indata[i] = in_buf[2 + i];
                sum += in_buf[2 + i];
        }
        dev_dbg(ec_dev->dev, "packet: %*ph, sum = %02x\n",
                i2c_msg[1].len, in_buf, sum);
-       if (sum != in_buf[2 + msg->in_len]) {
+       if (sum != in_buf[2 + len]) {
                dev_err(ec_dev->dev, "bad packet checksum\n");
                ret = -EBADMSG;
                goto done;
        }
 
-       ret = 0;
+       ret = len;
  done:
        kfree(in_buf);
        kfree(out_buf);
@@ -132,11 +139,10 @@ static int cros_ec_i2c_probe(struct i2c_client *client,
                return -ENOMEM;
 
        i2c_set_clientdata(client, ec_dev);
-       ec_dev->name = "I2C";
        ec_dev->dev = dev;
        ec_dev->priv = client;
        ec_dev->irq = client->irq;
-       ec_dev->command_xfer = cros_ec_command_xfer;
+       ec_dev->cmd_xfer = cros_ec_cmd_xfer_i2c;
        ec_dev->ec_name = client->name;
        ec_dev->phys_name = client->adapter->name;
        ec_dev->parent = &client->dev;
index 8c1c7cc373f8fe3456ca4a14bfbb72df676c5461..588c700af39c17882fb4c8b5af9131d195427c5e 100644 (file)
@@ -73,7 +73,7 @@
  *     if no record
  * @end_of_msg_delay: used to set the delay_usecs on the spi_transfer that
  *      is sent when we want to turn off CS at the end of a transaction.
- * @lock: mutex to ensure only one user of cros_ec_command_spi_xfer at a time
+ * @lock: mutex to ensure only one user of cros_ec_cmd_xfer_spi at a time
  */
 struct cros_ec_spi {
        struct spi_device *spi;
@@ -210,13 +210,13 @@ static int cros_ec_spi_receive_response(struct cros_ec_device *ec_dev,
 }
 
 /**
- * cros_ec_command_spi_xfer - Transfer a message over SPI and receive the reply
+ * cros_ec_cmd_xfer_spi - Transfer a message over SPI and receive the reply
  *
  * @ec_dev: ChromeOS EC device
  * @ec_msg: Message to transfer
  */
-static int cros_ec_command_spi_xfer(struct cros_ec_device *ec_dev,
-                                   struct cros_ec_msg *ec_msg)
+static int cros_ec_cmd_xfer_spi(struct cros_ec_device *ec_dev,
+                               struct cros_ec_command *ec_msg)
 {
        struct cros_ec_spi *ec_spi = ec_dev->priv;
        struct spi_transfer trans;
@@ -258,23 +258,19 @@ static int cros_ec_command_spi_xfer(struct cros_ec_device *ec_dev,
        /* Get the response */
        if (!ret) {
                ret = cros_ec_spi_receive_response(ec_dev,
-                               ec_msg->in_len + EC_MSG_TX_PROTO_BYTES);
+                               ec_msg->insize + EC_MSG_TX_PROTO_BYTES);
        } else {
                dev_err(ec_dev->dev, "spi transfer failed: %d\n", ret);
        }
 
-       /* turn off CS */
+       /*
+        * Turn off CS, possibly adding a delay to ensure the rising edge
+        * doesn't come too soon after the end of the data.
+        */
        spi_message_init(&msg);
-
-       if (ec_spi->end_of_msg_delay) {
-               /*
-                * Add delay for last transaction, to ensure the rising edge
-                * doesn't come too soon after the end of the data.
-                */
-               memset(&trans, 0, sizeof(trans));
-               trans.delay_usecs = ec_spi->end_of_msg_delay;
-               spi_message_add_tail(&trans, &msg);
-       }
+       memset(&trans, 0, sizeof(trans));
+       trans.delay_usecs = ec_spi->end_of_msg_delay;
+       spi_message_add_tail(&trans, &msg);
 
        final_ret = spi_sync(ec_spi->spi, &msg);
        ec_spi->last_transfer_ns = ktime_get_ns();
@@ -285,20 +281,19 @@ static int cros_ec_command_spi_xfer(struct cros_ec_device *ec_dev,
                goto exit;
        }
 
-       /* check response error code */
        ptr = ec_dev->din;
-       if (ptr[0]) {
-               dev_warn(ec_dev->dev, "command 0x%02x returned an error %d\n",
-                        ec_msg->cmd, ptr[0]);
-               debug_packet(ec_dev->dev, "in_err", ptr, len);
-               ret = -EINVAL;
+
+       /* check response error code */
+       ec_msg->result = ptr[0];
+       ret = cros_ec_check_result(ec_dev, ec_msg);
+       if (ret)
                goto exit;
-       }
+
        len = ptr[1];
        sum = ptr[0] + ptr[1];
-       if (len > ec_msg->in_len) {
+       if (len > ec_msg->insize) {
                dev_err(ec_dev->dev, "packet too long (%d bytes, expected %d)",
-                       len, ec_msg->in_len);
+                       len, ec_msg->insize);
                ret = -ENOSPC;
                goto exit;
        }
@@ -306,8 +301,8 @@ static int cros_ec_command_spi_xfer(struct cros_ec_device *ec_dev,
        /* copy response packet payload and compute checksum */
        for (i = 0; i < len; i++) {
                sum += ptr[i + 2];
-               if (ec_msg->in_len)
-                       ec_msg->in_buf[i] = ptr[i + 2];
+               if (ec_msg->insize)
+                       ec_msg->indata[i] = ptr[i + 2];
        }
        sum &= 0xff;
 
@@ -321,7 +316,7 @@ static int cros_ec_command_spi_xfer(struct cros_ec_device *ec_dev,
                goto exit;
        }
 
-       ret = 0;
+       ret = len;
 exit:
        mutex_unlock(&ec_spi->lock);
        return ret;
@@ -364,11 +359,10 @@ static int cros_ec_spi_probe(struct spi_device *spi)
        cros_ec_spi_dt_probe(ec_spi, dev);
 
        spi_set_drvdata(spi, ec_dev);
-       ec_dev->name = "SPI";
        ec_dev->dev = dev;
        ec_dev->priv = ec_spi;
        ec_dev->irq = spi->irq;
-       ec_dev->command_xfer = cros_ec_command_spi_xfer;
+       ec_dev->cmd_xfer = cros_ec_cmd_xfer_spi;
        ec_dev->ec_name = ec_spi->spi->modalias;
        ec_dev->phys_name = dev_name(&ec_spi->spi->dev);
        ec_dev->parent = &ec_spi->spi->dev;
@@ -381,6 +375,8 @@ static int cros_ec_spi_probe(struct spi_device *spi)
                return err;
        }
 
+       device_init_wakeup(&spi->dev, true);
+
        return 0;
 }
 
index e70ae315abc775b921c6f4a5c352093867b443ca..93db8bb8c8f0fd8d4ea86a36cedd541f4ecdc45a 100644 (file)
@@ -153,9 +153,9 @@ int da9063_device_init(struct da9063 *da9063, unsigned int irq)
                 "Device detected (chip-ID: 0x%02X, var-ID: 0x%02X)\n",
                 model, variant_id);
 
-       if (variant_code != PMIC_DA9063_BB) {
-               dev_err(da9063->dev, "Unknown chip variant code: 0x%02X\n",
-                               variant_code);
+       if (variant_code < PMIC_DA9063_BB && variant_code != PMIC_DA9063_AD) {
+               dev_err(da9063->dev,
+                       "Cannot support variant code: 0x%02X\n", variant_code);
                return -ENODEV;
        }
 
index 8db5c805c64f272e661d74fe90bbc3a1c4c46520..21fd8d9a217b01d2992e1225e6dae1e3a043c376 100644 (file)
 #include <linux/mfd/da9063/pdata.h>
 #include <linux/mfd/da9063/registers.h>
 
-static const struct regmap_range da9063_readable_ranges[] = {
+static const struct regmap_range da9063_ad_readable_ranges[] = {
        {
                .range_min = DA9063_REG_PAGE_CON,
-               .range_max = DA9063_REG_SECOND_D,
+               .range_max = DA9063_AD_REG_SECOND_D,
        }, {
                .range_min = DA9063_REG_SEQ,
                .range_max = DA9063_REG_ID_32_31,
@@ -37,14 +37,14 @@ static const struct regmap_range da9063_readable_ranges[] = {
                .range_max = DA9063_REG_AUTO3_LOW,
        }, {
                .range_min = DA9063_REG_T_OFFSET,
-               .range_max = DA9063_REG_GP_ID_19,
+               .range_max = DA9063_AD_REG_GP_ID_19,
        }, {
                .range_min = DA9063_REG_CHIP_ID,
                .range_max = DA9063_REG_CHIP_VARIANT,
        },
 };
 
-static const struct regmap_range da9063_writeable_ranges[] = {
+static const struct regmap_range da9063_ad_writeable_ranges[] = {
        {
                .range_min = DA9063_REG_PAGE_CON,
                .range_max = DA9063_REG_PAGE_CON,
@@ -53,7 +53,7 @@ static const struct regmap_range da9063_writeable_ranges[] = {
                .range_max = DA9063_REG_VSYS_MON,
        }, {
                .range_min = DA9063_REG_COUNT_S,
-               .range_max = DA9063_REG_ALARM_Y,
+               .range_max = DA9063_AD_REG_ALARM_Y,
        }, {
                .range_min = DA9063_REG_SEQ,
                .range_max = DA9063_REG_ID_32_31,
@@ -62,14 +62,14 @@ static const struct regmap_range da9063_writeable_ranges[] = {
                .range_max = DA9063_REG_AUTO3_LOW,
        }, {
                .range_min = DA9063_REG_CONFIG_I,
-               .range_max = DA9063_REG_MON_REG_4,
+               .range_max = DA9063_AD_REG_MON_REG_4,
        }, {
-               .range_min = DA9063_REG_GP_ID_0,
-               .range_max = DA9063_REG_GP_ID_19,
+               .range_min = DA9063_AD_REG_GP_ID_0,
+               .range_max = DA9063_AD_REG_GP_ID_19,
        },
 };
 
-static const struct regmap_range da9063_volatile_ranges[] = {
+static const struct regmap_range da9063_ad_volatile_ranges[] = {
        {
                .range_min = DA9063_REG_STATUS_A,
                .range_max = DA9063_REG_EVENT_D,
@@ -81,26 +81,104 @@ static const struct regmap_range da9063_volatile_ranges[] = {
                .range_max = DA9063_REG_ADC_MAN,
        }, {
                .range_min = DA9063_REG_ADC_RES_L,
-               .range_max = DA9063_REG_SECOND_D,
+               .range_max = DA9063_AD_REG_SECOND_D,
        }, {
-               .range_min = DA9063_REG_MON_REG_5,
-               .range_max = DA9063_REG_MON_REG_6,
+               .range_min = DA9063_AD_REG_MON_REG_5,
+               .range_max = DA9063_AD_REG_MON_REG_6,
        },
 };
 
-static const struct regmap_access_table da9063_readable_table = {
-       .yes_ranges = da9063_readable_ranges,
-       .n_yes_ranges = ARRAY_SIZE(da9063_readable_ranges),
+static const struct regmap_access_table da9063_ad_readable_table = {
+       .yes_ranges = da9063_ad_readable_ranges,
+       .n_yes_ranges = ARRAY_SIZE(da9063_ad_readable_ranges),
 };
 
-static const struct regmap_access_table da9063_writeable_table = {
-       .yes_ranges = da9063_writeable_ranges,
-       .n_yes_ranges = ARRAY_SIZE(da9063_writeable_ranges),
+static const struct regmap_access_table da9063_ad_writeable_table = {
+       .yes_ranges = da9063_ad_writeable_ranges,
+       .n_yes_ranges = ARRAY_SIZE(da9063_ad_writeable_ranges),
 };
 
-static const struct regmap_access_table da9063_volatile_table = {
-       .yes_ranges = da9063_volatile_ranges,
-       .n_yes_ranges = ARRAY_SIZE(da9063_volatile_ranges),
+static const struct regmap_access_table da9063_ad_volatile_table = {
+       .yes_ranges = da9063_ad_volatile_ranges,
+       .n_yes_ranges = ARRAY_SIZE(da9063_ad_volatile_ranges),
+};
+
+static const struct regmap_range da9063_bb_readable_ranges[] = {
+       {
+               .range_min = DA9063_REG_PAGE_CON,
+               .range_max = DA9063_BB_REG_SECOND_D,
+       }, {
+               .range_min = DA9063_REG_SEQ,
+               .range_max = DA9063_REG_ID_32_31,
+       }, {
+               .range_min = DA9063_REG_SEQ_A,
+               .range_max = DA9063_REG_AUTO3_LOW,
+       }, {
+               .range_min = DA9063_REG_T_OFFSET,
+               .range_max = DA9063_BB_REG_GP_ID_19,
+       }, {
+               .range_min = DA9063_REG_CHIP_ID,
+               .range_max = DA9063_REG_CHIP_VARIANT,
+       },
+};
+
+static const struct regmap_range da9063_bb_writeable_ranges[] = {
+       {
+               .range_min = DA9063_REG_PAGE_CON,
+               .range_max = DA9063_REG_PAGE_CON,
+       }, {
+               .range_min = DA9063_REG_FAULT_LOG,
+               .range_max = DA9063_REG_VSYS_MON,
+       }, {
+               .range_min = DA9063_REG_COUNT_S,
+               .range_max = DA9063_BB_REG_ALARM_Y,
+       }, {
+               .range_min = DA9063_REG_SEQ,
+               .range_max = DA9063_REG_ID_32_31,
+       }, {
+               .range_min = DA9063_REG_SEQ_A,
+               .range_max = DA9063_REG_AUTO3_LOW,
+       }, {
+               .range_min = DA9063_REG_CONFIG_I,
+               .range_max = DA9063_BB_REG_MON_REG_4,
+       }, {
+               .range_min = DA9063_BB_REG_GP_ID_0,
+               .range_max = DA9063_BB_REG_GP_ID_19,
+       },
+};
+
+static const struct regmap_range da9063_bb_volatile_ranges[] = {
+       {
+               .range_min = DA9063_REG_STATUS_A,
+               .range_max = DA9063_REG_EVENT_D,
+       }, {
+               .range_min = DA9063_REG_CONTROL_F,
+               .range_max = DA9063_REG_CONTROL_F,
+       }, {
+               .range_min = DA9063_REG_ADC_MAN,
+               .range_max = DA9063_REG_ADC_MAN,
+       }, {
+               .range_min = DA9063_REG_ADC_RES_L,
+               .range_max = DA9063_BB_REG_SECOND_D,
+       }, {
+               .range_min = DA9063_BB_REG_MON_REG_5,
+               .range_max = DA9063_BB_REG_MON_REG_6,
+       },
+};
+
+static const struct regmap_access_table da9063_bb_readable_table = {
+       .yes_ranges = da9063_bb_readable_ranges,
+       .n_yes_ranges = ARRAY_SIZE(da9063_bb_readable_ranges),
+};
+
+static const struct regmap_access_table da9063_bb_writeable_table = {
+       .yes_ranges = da9063_bb_writeable_ranges,
+       .n_yes_ranges = ARRAY_SIZE(da9063_bb_writeable_ranges),
+};
+
+static const struct regmap_access_table da9063_bb_volatile_table = {
+       .yes_ranges = da9063_bb_volatile_ranges,
+       .n_yes_ranges = ARRAY_SIZE(da9063_bb_volatile_ranges),
 };
 
 static const struct regmap_range_cfg da9063_range_cfg[] = {
@@ -123,10 +201,6 @@ static struct regmap_config da9063_regmap_config = {
        .max_register = DA9063_REG_CHIP_VARIANT,
 
        .cache_type = REGCACHE_RBTREE,
-
-       .rd_table = &da9063_readable_table,
-       .wr_table = &da9063_writeable_table,
-       .volatile_table = &da9063_volatile_table,
 };
 
 static int da9063_i2c_probe(struct i2c_client *i2c,
@@ -143,6 +217,16 @@ static int da9063_i2c_probe(struct i2c_client *i2c,
        da9063->dev = &i2c->dev;
        da9063->chip_irq = i2c->irq;
 
+       if (da9063->variant_code == PMIC_DA9063_AD) {
+               da9063_regmap_config.rd_table = &da9063_ad_readable_table;
+               da9063_regmap_config.wr_table = &da9063_ad_writeable_table;
+               da9063_regmap_config.volatile_table = &da9063_ad_volatile_table;
+       } else {
+               da9063_regmap_config.rd_table = &da9063_bb_readable_table;
+               da9063_regmap_config.wr_table = &da9063_bb_writeable_table;
+               da9063_regmap_config.volatile_table = &da9063_bb_volatile_table;
+       }
+
        da9063->regmap = devm_regmap_init_i2c(i2c, &da9063_regmap_config);
        if (IS_ERR(da9063->regmap)) {
                ret = PTR_ERR(da9063->regmap);
index 7a55c0071fa8e9840b47420277673120547df191..4c826f78acd020362a5e666432df13c9e19788bf 100644 (file)
@@ -95,7 +95,7 @@ EXPORT_SYMBOL(dm355evm_msp_read);
  * Many of the msp430 pins are just used as fixed-direction GPIOs.
  * We could export a few more of them this way, if we wanted.
  */
-#define MSP_GPIO(bit,reg)      ((DM355EVM_MSP_ ## reg) << 3 | (bit))
+#define MSP_GPIO(bit, reg)     ((DM355EVM_MSP_ ## reg) << 3 | (bit))
 
 static const u8 msp_gpios[] = {
        /* eight leds */
index 2ed774e7d342c64211bf862fdcbdf0cac3e57170..5991faddd3c633aa990cc5e72a015787bea60a4d 100644 (file)
@@ -62,7 +62,7 @@ static int ezx_pcap_putget(struct pcap_chip *pcap, u32 *data)
        struct spi_message m;
        int status;
 
-       memset(&t, 0, sizeof t);
+       memset(&t, 0, sizeof(t));
        spi_message_init(&m);
        t.len = sizeof(u32);
        spi_message_add_tail(&t, &m);
@@ -211,7 +211,6 @@ static void pcap_irq_handler(unsigned int irq, struct irq_desc *desc)
 
        desc->irq_data.chip->irq_ack(&desc->irq_data);
        queue_work(pcap->workqueue, &pcap->isr_work);
-       return;
 }
 
 /* ADC */
index d7b2a75aca3e5fcd9b38de98ceb4f5c3b16f013e..b44f0203983bfb5117c02be8469074814c24a18f 100644 (file)
@@ -332,18 +332,13 @@ static int htcpld_setup_chip_irq(
                int chip_index)
 {
        struct htcpld_data *htcpld;
-       struct device *dev = &pdev->dev;
-       struct htcpld_core_platform_data *pdata;
        struct htcpld_chip *chip;
-       struct htcpld_chip_platform_data *plat_chip_data;
        unsigned int irq, irq_end;
        int ret = 0;
 
        /* Get the platform and driver data */
-       pdata = dev_get_platdata(dev);
        htcpld = platform_get_drvdata(pdev);
        chip = &htcpld->chip[chip_index];
-       plat_chip_data = &pdata->chip[chip_index];
 
        /* Setup irq handlers */
        irq_end = chip->irq_start + chip->nirqs;
diff --git a/drivers/mfd/intel_soc_pmic_core.c b/drivers/mfd/intel_soc_pmic_core.c
new file mode 100644 (file)
index 0000000..2720922
--- /dev/null
@@ -0,0 +1,170 @@
+/*
+ * intel_soc_pmic_core.c - Intel SoC PMIC MFD Driver
+ *
+ * Copyright (C) 2013, 2014 Intel Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version
+ * 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * Author: Yang, Bin <bin.yang@intel.com>
+ * Author: Zhu, Lejun <lejun.zhu@linux.intel.com>
+ */
+
+#include <linux/module.h>
+#include <linux/mfd/core.h>
+#include <linux/i2c.h>
+#include <linux/interrupt.h>
+#include <linux/gpio/consumer.h>
+#include <linux/acpi.h>
+#include <linux/regmap.h>
+#include <linux/mfd/intel_soc_pmic.h>
+#include "intel_soc_pmic_core.h"
+
+/*
+ * On some boards the PMIC interrupt may come from a GPIO line.
+ * Try to lookup the ACPI table and see if such connection exists. If not,
+ * return -ENOENT and use the IRQ provided by I2C.
+ */
+static int intel_soc_pmic_find_gpio_irq(struct device *dev)
+{
+       struct gpio_desc *desc;
+       int irq;
+
+       desc = devm_gpiod_get_index(dev, "intel_soc_pmic", 0);
+       if (IS_ERR(desc))
+               return -ENOENT;
+
+       irq = gpiod_to_irq(desc);
+       if (irq < 0)
+               dev_warn(dev, "Can't get irq: %d\n", irq);
+
+       return irq;
+}
+
+static int intel_soc_pmic_i2c_probe(struct i2c_client *i2c,
+                                   const struct i2c_device_id *i2c_id)
+{
+       struct device *dev = &i2c->dev;
+       const struct acpi_device_id *id;
+       struct intel_soc_pmic_config *config;
+       struct intel_soc_pmic *pmic;
+       int ret;
+       int irq;
+
+       id = acpi_match_device(dev->driver->acpi_match_table, dev);
+       if (!id || !id->driver_data)
+               return -ENODEV;
+
+       config = (struct intel_soc_pmic_config *)id->driver_data;
+
+       pmic = devm_kzalloc(dev, sizeof(*pmic), GFP_KERNEL);
+       dev_set_drvdata(dev, pmic);
+
+       pmic->regmap = devm_regmap_init_i2c(i2c, config->regmap_config);
+
+       irq = intel_soc_pmic_find_gpio_irq(dev);
+       pmic->irq = (irq < 0) ? i2c->irq : irq;
+
+       ret = regmap_add_irq_chip(pmic->regmap, pmic->irq,
+                                 config->irq_flags | IRQF_ONESHOT,
+                                 0, config->irq_chip,
+                                 &pmic->irq_chip_data);
+       if (ret)
+               return ret;
+
+       ret = enable_irq_wake(pmic->irq);
+       if (ret)
+               dev_warn(dev, "Can't enable IRQ as wake source: %d\n", ret);
+
+       ret = mfd_add_devices(dev, -1, config->cell_dev,
+                             config->n_cell_devs, NULL, 0,
+                             regmap_irq_get_domain(pmic->irq_chip_data));
+       if (ret)
+               goto err_del_irq_chip;
+
+       return 0;
+
+err_del_irq_chip:
+       regmap_del_irq_chip(pmic->irq, pmic->irq_chip_data);
+       return ret;
+}
+
+static int intel_soc_pmic_i2c_remove(struct i2c_client *i2c)
+{
+       struct intel_soc_pmic *pmic = dev_get_drvdata(&i2c->dev);
+
+       regmap_del_irq_chip(pmic->irq, pmic->irq_chip_data);
+
+       mfd_remove_devices(&i2c->dev);
+
+       return 0;
+}
+
+static void intel_soc_pmic_shutdown(struct i2c_client *i2c)
+{
+       struct intel_soc_pmic *pmic = dev_get_drvdata(&i2c->dev);
+
+       disable_irq(pmic->irq);
+
+       return;
+}
+
+static int intel_soc_pmic_suspend(struct device *dev)
+{
+       struct intel_soc_pmic *pmic = dev_get_drvdata(dev);
+
+       disable_irq(pmic->irq);
+
+       return 0;
+}
+
+static int intel_soc_pmic_resume(struct device *dev)
+{
+       struct intel_soc_pmic *pmic = dev_get_drvdata(dev);
+
+       enable_irq(pmic->irq);
+
+       return 0;
+}
+
+static SIMPLE_DEV_PM_OPS(intel_soc_pmic_pm_ops, intel_soc_pmic_suspend,
+                        intel_soc_pmic_resume);
+
+static const struct i2c_device_id intel_soc_pmic_i2c_id[] = {
+       { }
+};
+MODULE_DEVICE_TABLE(i2c, intel_soc_pmic_i2c_id);
+
+#if defined(CONFIG_ACPI)
+static struct acpi_device_id intel_soc_pmic_acpi_match[] = {
+       {"INT33FD", (kernel_ulong_t)&intel_soc_pmic_config_crc},
+       { },
+};
+MODULE_DEVICE_TABLE(acpi, intel_soc_pmic_acpi_match);
+#endif
+
+static struct i2c_driver intel_soc_pmic_i2c_driver = {
+       .driver = {
+               .name = "intel_soc_pmic_i2c",
+               .owner = THIS_MODULE,
+               .pm = &intel_soc_pmic_pm_ops,
+               .acpi_match_table = ACPI_PTR(intel_soc_pmic_acpi_match),
+       },
+       .probe = intel_soc_pmic_i2c_probe,
+       .remove = intel_soc_pmic_i2c_remove,
+       .id_table = intel_soc_pmic_i2c_id,
+       .shutdown = intel_soc_pmic_shutdown,
+};
+
+module_i2c_driver(intel_soc_pmic_i2c_driver);
+
+MODULE_DESCRIPTION("I2C driver for Intel SoC PMIC");
+MODULE_LICENSE("GPL v2");
+MODULE_AUTHOR("Yang, Bin <bin.yang@intel.com>");
+MODULE_AUTHOR("Zhu, Lejun <lejun.zhu@linux.intel.com>");
diff --git a/drivers/mfd/intel_soc_pmic_core.h b/drivers/mfd/intel_soc_pmic_core.h
new file mode 100644 (file)
index 0000000..33aacd9
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * intel_soc_pmic_core.h - Intel SoC PMIC MFD Driver
+ *
+ * Copyright (C) 2012-2014 Intel Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version
+ * 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * Author: Yang, Bin <bin.yang@intel.com>
+ * Author: Zhu, Lejun <lejun.zhu@linux.intel.com>
+ */
+
+#ifndef __INTEL_SOC_PMIC_CORE_H__
+#define __INTEL_SOC_PMIC_CORE_H__
+
+struct intel_soc_pmic_config {
+       unsigned long irq_flags;
+       struct mfd_cell *cell_dev;
+       int n_cell_devs;
+       struct regmap_config *regmap_config;
+       struct regmap_irq_chip *irq_chip;
+};
+
+extern struct intel_soc_pmic_config intel_soc_pmic_config_crc;
+
+#endif /* __INTEL_SOC_PMIC_CORE_H__ */
diff --git a/drivers/mfd/intel_soc_pmic_crc.c b/drivers/mfd/intel_soc_pmic_crc.c
new file mode 100644 (file)
index 0000000..7107cab
--- /dev/null
@@ -0,0 +1,158 @@
+/*
+ * intel_soc_pmic_crc.c - Device access for Crystal Cove PMIC
+ *
+ * Copyright (C) 2013, 2014 Intel Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version
+ * 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * Author: Yang, Bin <bin.yang@intel.com>
+ * Author: Zhu, Lejun <lejun.zhu@linux.intel.com>
+ */
+
+#include <linux/mfd/core.h>
+#include <linux/interrupt.h>
+#include <linux/regmap.h>
+#include <linux/mfd/intel_soc_pmic.h>
+#include "intel_soc_pmic_core.h"
+
+#define CRYSTAL_COVE_MAX_REGISTER      0xC6
+
+#define CRYSTAL_COVE_REG_IRQLVL1       0x02
+#define CRYSTAL_COVE_REG_MIRQLVL1      0x0E
+
+#define CRYSTAL_COVE_IRQ_PWRSRC                0
+#define CRYSTAL_COVE_IRQ_THRM          1
+#define CRYSTAL_COVE_IRQ_BCU           2
+#define CRYSTAL_COVE_IRQ_ADC           3
+#define CRYSTAL_COVE_IRQ_CHGR          4
+#define CRYSTAL_COVE_IRQ_GPIO          5
+#define CRYSTAL_COVE_IRQ_VHDMIOCP      6
+
+static struct resource gpio_resources[] = {
+       {
+               .name   = "GPIO",
+               .start  = CRYSTAL_COVE_IRQ_GPIO,
+               .end    = CRYSTAL_COVE_IRQ_GPIO,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct resource pwrsrc_resources[] = {
+       {
+               .name  = "PWRSRC",
+               .start = CRYSTAL_COVE_IRQ_PWRSRC,
+               .end   = CRYSTAL_COVE_IRQ_PWRSRC,
+               .flags = IORESOURCE_IRQ,
+       },
+};
+
+static struct resource adc_resources[] = {
+       {
+               .name  = "ADC",
+               .start = CRYSTAL_COVE_IRQ_ADC,
+               .end   = CRYSTAL_COVE_IRQ_ADC,
+               .flags = IORESOURCE_IRQ,
+       },
+};
+
+static struct resource thermal_resources[] = {
+       {
+               .name  = "THERMAL",
+               .start = CRYSTAL_COVE_IRQ_THRM,
+               .end   = CRYSTAL_COVE_IRQ_THRM,
+               .flags = IORESOURCE_IRQ,
+       },
+};
+
+static struct resource bcu_resources[] = {
+       {
+               .name  = "BCU",
+               .start = CRYSTAL_COVE_IRQ_BCU,
+               .end   = CRYSTAL_COVE_IRQ_BCU,
+               .flags = IORESOURCE_IRQ,
+       },
+};
+
+static struct mfd_cell crystal_cove_dev[] = {
+       {
+               .name = "crystal_cove_pwrsrc",
+               .num_resources = ARRAY_SIZE(pwrsrc_resources),
+               .resources = pwrsrc_resources,
+       },
+       {
+               .name = "crystal_cove_adc",
+               .num_resources = ARRAY_SIZE(adc_resources),
+               .resources = adc_resources,
+       },
+       {
+               .name = "crystal_cove_thermal",
+               .num_resources = ARRAY_SIZE(thermal_resources),
+               .resources = thermal_resources,
+       },
+       {
+               .name = "crystal_cove_bcu",
+               .num_resources = ARRAY_SIZE(bcu_resources),
+               .resources = bcu_resources,
+       },
+       {
+               .name = "crystal_cove_gpio",
+               .num_resources = ARRAY_SIZE(gpio_resources),
+               .resources = gpio_resources,
+       },
+};
+
+static struct regmap_config crystal_cove_regmap_config = {
+       .reg_bits = 8,
+       .val_bits = 8,
+
+       .max_register = CRYSTAL_COVE_MAX_REGISTER,
+       .cache_type = REGCACHE_NONE,
+};
+
+static const struct regmap_irq crystal_cove_irqs[] = {
+       [CRYSTAL_COVE_IRQ_PWRSRC] = {
+               .mask = BIT(CRYSTAL_COVE_IRQ_PWRSRC),
+       },
+       [CRYSTAL_COVE_IRQ_THRM] = {
+               .mask = BIT(CRYSTAL_COVE_IRQ_THRM),
+       },
+       [CRYSTAL_COVE_IRQ_BCU] = {
+               .mask = BIT(CRYSTAL_COVE_IRQ_BCU),
+       },
+       [CRYSTAL_COVE_IRQ_ADC] = {
+               .mask = BIT(CRYSTAL_COVE_IRQ_ADC),
+       },
+       [CRYSTAL_COVE_IRQ_CHGR] = {
+               .mask = BIT(CRYSTAL_COVE_IRQ_CHGR),
+       },
+       [CRYSTAL_COVE_IRQ_GPIO] = {
+               .mask = BIT(CRYSTAL_COVE_IRQ_GPIO),
+       },
+       [CRYSTAL_COVE_IRQ_VHDMIOCP] = {
+               .mask = BIT(CRYSTAL_COVE_IRQ_VHDMIOCP),
+       },
+};
+
+static struct regmap_irq_chip crystal_cove_irq_chip = {
+       .name = "Crystal Cove",
+       .irqs = crystal_cove_irqs,
+       .num_irqs = ARRAY_SIZE(crystal_cove_irqs),
+       .num_regs = 1,
+       .status_base = CRYSTAL_COVE_REG_IRQLVL1,
+       .mask_base = CRYSTAL_COVE_REG_MIRQLVL1,
+};
+
+struct intel_soc_pmic_config intel_soc_pmic_config_crc = {
+       .irq_flags = IRQF_TRIGGER_RISING,
+       .cell_dev = crystal_cove_dev,
+       .n_cell_devs = ARRAY_SIZE(crystal_cove_dev),
+       .regmap_config = &crystal_cove_regmap_config,
+       .irq_chip = &crystal_cove_irq_chip,
+};
index 7e50fe0118e39ddc0c3ec50fc83a387358a48c3b..8df3266064e4fef382d82326412090fd1f260711 100644 (file)
@@ -115,7 +115,7 @@ static void micro_rx_msg(struct ipaq_micro *micro, u8 id, int len, u8 *data)
                } else {
                        dev_err(micro->dev,
                                "out of band RX message 0x%02x\n", id);
-                       if(!micro->msg)
+                       if (!micro->msg)
                                dev_info(micro->dev, "no message queued\n");
                        else
                                dev_info(micro->dev, "expected message %02x\n",
@@ -126,13 +126,13 @@ static void micro_rx_msg(struct ipaq_micro *micro, u8 id, int len, u8 *data)
                if (micro->key)
                        micro->key(micro->key_data, len, data);
                else
-                       dev_dbg(micro->dev, "key message ignored, no handle \n");
+                       dev_dbg(micro->dev, "key message ignored, no handle\n");
                break;
        case MSG_TOUCHSCREEN:
                if (micro->ts)
                        micro->ts(micro->ts_data, len, data);
                else
-                       dev_dbg(micro->dev, "touchscreen message ignored, no handle \n");
+                       dev_dbg(micro->dev, "touchscreen message ignored, no handle\n");
                break;
        default:
                dev_err(micro->dev,
@@ -154,7 +154,7 @@ static void micro_process_char(struct ipaq_micro *micro, u8 ch)
                        rx->state = STATE_ID; /* Next byte is the id and len */
                break;
        case STATE_ID: /* Looking for id and len byte */
-               rx->id = (ch & 0xf0) >> 4 ;
+               rx->id = (ch & 0xf0) >> 4;
                rx->len = (ch & 0x0f);
                rx->index = 0;
                rx->chksum = ch;
index f7ff0188603deac34e0c872d642efd4a775e1549..bd2696136eeecf684d08fa7ee70f9d92383a96fb 100644 (file)
@@ -24,7 +24,8 @@
 
 #define MAX_ID_LEN 4
 static char force_device_id[MAX_ID_LEN + 1] = "";
-module_param_string(force_device_id, force_device_id, sizeof(force_device_id), 0);
+module_param_string(force_device_id, force_device_id,
+                   sizeof(force_device_id), 0);
 MODULE_PARM_DESC(force_device_id, "Override detected product");
 
 /*
@@ -36,7 +37,7 @@ static void kempld_get_hardware_mutex(struct kempld_device_data *pld)
 {
        /* The mutex bit will read 1 until access has been granted */
        while (ioread8(pld->io_index) & KEMPLD_MUTEX_KEY)
-               msleep(1);
+               usleep_range(1000, 3000);
 }
 
 static void kempld_release_hardware_mutex(struct kempld_device_data *pld)
@@ -499,7 +500,7 @@ static struct platform_driver kempld_driver = {
        .remove         = kempld_remove,
 };
 
-static struct dmi_system_id __initdata kempld_dmi_table[] = {
+static struct dmi_system_id kempld_dmi_table[] __initdata = {
        {
                .ident = "BHL6",
                .matches = {
@@ -736,7 +737,8 @@ static int __init kempld_init(void)
        int ret;
 
        if (force_device_id[0]) {
-               for (id = kempld_dmi_table; id->matches[0].slot != DMI_NONE; id++)
+               for (id = kempld_dmi_table;
+                    id->matches[0].slot != DMI_NONE; id++)
                        if (strstr(id->ident, force_device_id))
                                if (id->callback && id->callback(id))
                                        break;
index c84ded5f8ece0bcf0d13326eb96d137bd934a0b4..23982dbf014d8518833b6f6e8eceea0bad07ed9e 100644 (file)
@@ -66,12 +66,14 @@ static inline u8 _irq_to_val(enum lp8788_int_id id, int enable)
 static void lp8788_irq_enable(struct irq_data *data)
 {
        struct lp8788_irq_data *irqd = irq_data_get_irq_chip_data(data);
+
        irqd->enabled[data->hwirq] = 1;
 }
 
 static void lp8788_irq_disable(struct irq_data *data)
 {
        struct lp8788_irq_data *irqd = irq_data_get_irq_chip_data(data);
+
        irqd->enabled[data->hwirq] = 0;
 }
 
diff --git a/drivers/mfd/max77686-irq.c b/drivers/mfd/max77686-irq.c
deleted file mode 100644 (file)
index cdc3280..0000000
+++ /dev/null
@@ -1,319 +0,0 @@
-/*
- * max77686-irq.c - Interrupt controller support for MAX77686
- *
- * Copyright (C) 2012 Samsung Electronics Co.Ltd
- * Chiwoong Byun <woong.byun@samsung.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * This driver is based on max8997-irq.c
- */
-
-#include <linux/err.h>
-#include <linux/irq.h>
-#include <linux/interrupt.h>
-#include <linux/gpio.h>
-#include <linux/mfd/max77686.h>
-#include <linux/mfd/max77686-private.h>
-#include <linux/irqdomain.h>
-#include <linux/regmap.h>
-
-enum {
-       MAX77686_DEBUG_IRQ_INFO = 1 << 0,
-       MAX77686_DEBUG_IRQ_MASK = 1 << 1,
-       MAX77686_DEBUG_IRQ_INT = 1 << 2,
-};
-
-static int debug_mask = 0;
-module_param(debug_mask, int, 0);
-MODULE_PARM_DESC(debug_mask, "Set debug_mask : 0x0=off 0x1=IRQ_INFO  0x2=IRQ_MASK 0x4=IRQ_INI)");
-
-static const u8 max77686_mask_reg[] = {
-       [PMIC_INT1] = MAX77686_REG_INT1MSK,
-       [PMIC_INT2] = MAX77686_REG_INT2MSK,
-       [RTC_INT] = MAX77686_RTC_INTM,
-};
-
-static struct regmap *max77686_get_regmap(struct max77686_dev *max77686,
-                               enum max77686_irq_source src)
-{
-       switch (src) {
-       case PMIC_INT1 ... PMIC_INT2:
-               return max77686->regmap;
-       case RTC_INT:
-               return max77686->rtc_regmap;
-       default:
-               return ERR_PTR(-EINVAL);
-       }
-}
-
-struct max77686_irq_data {
-       int mask;
-       enum max77686_irq_source group;
-};
-
-#define DECLARE_IRQ(idx, _group, _mask)                \
-       [(idx)] = { .group = (_group), .mask = (_mask) }
-static const struct max77686_irq_data max77686_irqs[] = {
-       DECLARE_IRQ(MAX77686_PMICIRQ_PWRONF,    PMIC_INT1, 1 << 0),
-       DECLARE_IRQ(MAX77686_PMICIRQ_PWRONR,    PMIC_INT1, 1 << 1),
-       DECLARE_IRQ(MAX77686_PMICIRQ_JIGONBF,   PMIC_INT1, 1 << 2),
-       DECLARE_IRQ(MAX77686_PMICIRQ_JIGONBR,   PMIC_INT1, 1 << 3),
-       DECLARE_IRQ(MAX77686_PMICIRQ_ACOKBF,    PMIC_INT1, 1 << 4),
-       DECLARE_IRQ(MAX77686_PMICIRQ_ACOKBR,    PMIC_INT1, 1 << 5),
-       DECLARE_IRQ(MAX77686_PMICIRQ_ONKEY1S,   PMIC_INT1, 1 << 6),
-       DECLARE_IRQ(MAX77686_PMICIRQ_MRSTB,             PMIC_INT1, 1 << 7),
-       DECLARE_IRQ(MAX77686_PMICIRQ_140C,              PMIC_INT2, 1 << 0),
-       DECLARE_IRQ(MAX77686_PMICIRQ_120C,              PMIC_INT2, 1 << 1),
-       DECLARE_IRQ(MAX77686_RTCIRQ_RTC60S,             RTC_INT, 1 << 0),
-       DECLARE_IRQ(MAX77686_RTCIRQ_RTCA1,              RTC_INT, 1 << 1),
-       DECLARE_IRQ(MAX77686_RTCIRQ_RTCA2,              RTC_INT, 1 << 2),
-       DECLARE_IRQ(MAX77686_RTCIRQ_SMPL,               RTC_INT, 1 << 3),
-       DECLARE_IRQ(MAX77686_RTCIRQ_RTC1S,              RTC_INT, 1 << 4),
-       DECLARE_IRQ(MAX77686_RTCIRQ_WTSR,               RTC_INT, 1 << 5),
-};
-
-static void max77686_irq_lock(struct irq_data *data)
-{
-       struct max77686_dev *max77686 = irq_get_chip_data(data->irq);
-
-       if (debug_mask & MAX77686_DEBUG_IRQ_MASK)
-               pr_info("%s\n", __func__);
-
-       mutex_lock(&max77686->irqlock);
-}
-
-static void max77686_irq_sync_unlock(struct irq_data *data)
-{
-       struct max77686_dev *max77686 = irq_get_chip_data(data->irq);
-       int i;
-
-       for (i = 0; i < MAX77686_IRQ_GROUP_NR; i++) {
-               u8 mask_reg = max77686_mask_reg[i];
-               struct regmap *map = max77686_get_regmap(max77686, i);
-
-               if (debug_mask & MAX77686_DEBUG_IRQ_MASK)
-                       pr_debug("%s: mask_reg[%d]=0x%x, cur=0x%x\n",
-                       __func__, i, mask_reg, max77686->irq_masks_cur[i]);
-
-               if (mask_reg == MAX77686_REG_INVALID ||
-                               IS_ERR_OR_NULL(map))
-                       continue;
-
-               max77686->irq_masks_cache[i] = max77686->irq_masks_cur[i];
-
-               regmap_write(map, max77686_mask_reg[i],
-                               max77686->irq_masks_cur[i]);
-       }
-
-       mutex_unlock(&max77686->irqlock);
-}
-
-static const inline struct max77686_irq_data *to_max77686_irq(int irq)
-{
-       struct irq_data *data = irq_get_irq_data(irq);
-       return &max77686_irqs[data->hwirq];
-}
-
-static void max77686_irq_mask(struct irq_data *data)
-{
-       struct max77686_dev *max77686 = irq_get_chip_data(data->irq);
-       const struct max77686_irq_data *irq_data = to_max77686_irq(data->irq);
-
-       max77686->irq_masks_cur[irq_data->group] |= irq_data->mask;
-
-       if (debug_mask & MAX77686_DEBUG_IRQ_MASK)
-               pr_info("%s: group=%d, cur=0x%x\n",
-                       __func__, irq_data->group,
-                       max77686->irq_masks_cur[irq_data->group]);
-}
-
-static void max77686_irq_unmask(struct irq_data *data)
-{
-       struct max77686_dev *max77686 = irq_get_chip_data(data->irq);
-       const struct max77686_irq_data *irq_data = to_max77686_irq(data->irq);
-
-       max77686->irq_masks_cur[irq_data->group] &= ~irq_data->mask;
-
-       if (debug_mask & MAX77686_DEBUG_IRQ_MASK)
-               pr_info("%s: group=%d, cur=0x%x\n",
-                       __func__, irq_data->group,
-                       max77686->irq_masks_cur[irq_data->group]);
-}
-
-static struct irq_chip max77686_irq_chip = {
-       .name                   = "max77686",
-       .irq_bus_lock           = max77686_irq_lock,
-       .irq_bus_sync_unlock    = max77686_irq_sync_unlock,
-       .irq_mask               = max77686_irq_mask,
-       .irq_unmask             = max77686_irq_unmask,
-};
-
-static irqreturn_t max77686_irq_thread(int irq, void *data)
-{
-       struct max77686_dev *max77686 = data;
-       unsigned int irq_reg[MAX77686_IRQ_GROUP_NR] = {};
-       unsigned int irq_src;
-       int ret;
-       int i, cur_irq;
-
-       ret = regmap_read(max77686->regmap,  MAX77686_REG_INTSRC, &irq_src);
-       if (ret < 0) {
-               dev_err(max77686->dev, "Failed to read interrupt source: %d\n",
-                               ret);
-               return IRQ_NONE;
-       }
-
-       if (debug_mask & MAX77686_DEBUG_IRQ_INT)
-               pr_info("%s: irq_src=0x%x\n", __func__, irq_src);
-
-       if (irq_src == MAX77686_IRQSRC_PMIC) {
-               ret = regmap_bulk_read(max77686->regmap,
-                                        MAX77686_REG_INT1, irq_reg, 2);
-               if (ret < 0) {
-                       dev_err(max77686->dev, "Failed to read interrupt source: %d\n",
-                                       ret);
-                       return IRQ_NONE;
-               }
-
-               if (debug_mask & MAX77686_DEBUG_IRQ_INT)
-                       pr_info("%s: int1=0x%x, int2=0x%x\n", __func__,
-                                irq_reg[PMIC_INT1], irq_reg[PMIC_INT2]);
-       }
-
-       if (irq_src & MAX77686_IRQSRC_RTC) {
-               ret = regmap_read(max77686->rtc_regmap,
-                                       MAX77686_RTC_INT, &irq_reg[RTC_INT]);
-               if (ret < 0) {
-                       dev_err(max77686->dev, "Failed to read interrupt source: %d\n",
-                                       ret);
-                       return IRQ_NONE;
-               }
-
-               if (debug_mask & MAX77686_DEBUG_IRQ_INT)
-                       pr_info("%s: rtc int=0x%x\n", __func__,
-                                                        irq_reg[RTC_INT]);
-
-       }
-
-       for (i = 0; i < MAX77686_IRQ_GROUP_NR; i++)
-               irq_reg[i] &= ~max77686->irq_masks_cur[i];
-
-       for (i = 0; i < MAX77686_IRQ_NR; i++) {
-               if (irq_reg[max77686_irqs[i].group] & max77686_irqs[i].mask) {
-                       cur_irq = irq_find_mapping(max77686->irq_domain, i);
-                       if (cur_irq)
-                               handle_nested_irq(cur_irq);
-               }
-       }
-
-       return IRQ_HANDLED;
-}
-
-static int max77686_irq_domain_map(struct irq_domain *d, unsigned int irq,
-                                       irq_hw_number_t hw)
-{
-       struct max77686_dev *max77686 = d->host_data;
-
-       irq_set_chip_data(irq, max77686);
-       irq_set_chip_and_handler(irq, &max77686_irq_chip, handle_edge_irq);
-       irq_set_nested_thread(irq, 1);
-#ifdef CONFIG_ARM
-       set_irq_flags(irq, IRQF_VALID);
-#else
-       irq_set_noprobe(irq);
-#endif
-       return 0;
-}
-
-static struct irq_domain_ops max77686_irq_domain_ops = {
-       .map = max77686_irq_domain_map,
-};
-
-int max77686_irq_init(struct max77686_dev *max77686)
-{
-       struct irq_domain *domain;
-       int i;
-       int ret;
-       int val;
-       struct regmap *map;
-
-       mutex_init(&max77686->irqlock);
-
-       if (max77686->irq_gpio && !max77686->irq) {
-               max77686->irq = gpio_to_irq(max77686->irq_gpio);
-
-               if (debug_mask & MAX77686_DEBUG_IRQ_INT) {
-                       ret = gpio_request(max77686->irq_gpio, "pmic_irq");
-                       if (ret < 0) {
-                               dev_err(max77686->dev,
-                                       "Failed to request gpio %d with ret:"
-                                       "%d\n", max77686->irq_gpio, ret);
-                               return IRQ_NONE;
-                       }
-
-                       gpio_direction_input(max77686->irq_gpio);
-                       val = gpio_get_value(max77686->irq_gpio);
-                       gpio_free(max77686->irq_gpio);
-                       pr_info("%s: gpio_irq=%x\n", __func__, val);
-               }
-       }
-
-       if (!max77686->irq) {
-               dev_err(max77686->dev, "irq is not specified\n");
-               return -ENODEV;
-       }
-
-       /* Mask individual interrupt sources */
-       for (i = 0; i < MAX77686_IRQ_GROUP_NR; i++) {
-               max77686->irq_masks_cur[i] = 0xff;
-               max77686->irq_masks_cache[i] = 0xff;
-               map = max77686_get_regmap(max77686, i);
-
-               if (IS_ERR_OR_NULL(map))
-                       continue;
-               if (max77686_mask_reg[i] == MAX77686_REG_INVALID)
-                       continue;
-
-               regmap_write(map, max77686_mask_reg[i], 0xff);
-       }
-       domain = irq_domain_add_linear(NULL, MAX77686_IRQ_NR,
-                                       &max77686_irq_domain_ops, max77686);
-       if (!domain) {
-               dev_err(max77686->dev, "could not create irq domain\n");
-               return -ENODEV;
-       }
-       max77686->irq_domain = domain;
-
-       ret = request_threaded_irq(max77686->irq, NULL, max77686_irq_thread,
-                                  IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
-                                  "max77686-irq", max77686);
-
-       if (ret)
-               dev_err(max77686->dev, "Failed to request IRQ %d: %d\n",
-                       max77686->irq, ret);
-
-
-       if (debug_mask & MAX77686_DEBUG_IRQ_INFO)
-               pr_info("%s-\n", __func__);
-
-       return 0;
-}
-
-void max77686_irq_exit(struct max77686_dev *max77686)
-{
-       if (max77686->irq)
-               free_irq(max77686->irq, max77686);
-}
index ce869acf27aebea28dcee07465c3677727b72f43..86e552348db499a913eee239f62a93a2f4958818 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * max77686.c - mfd core driver for the Maxim 77686
+ * max77686.c - mfd core driver for the Maxim 77686/802
  *
  * Copyright (C) 2012 Samsung Electronics
  * Chiwoong Byun <woong.byun@smasung.com>
@@ -25,6 +25,8 @@
 #include <linux/export.h>
 #include <linux/slab.h>
 #include <linux/i2c.h>
+#include <linux/irq.h>
+#include <linux/interrupt.h>
 #include <linux/pm_runtime.h>
 #include <linux/module.h>
 #include <linux/mfd/core.h>
@@ -41,15 +43,166 @@ static const struct mfd_cell max77686_devs[] = {
        { .name = "max77686-clk", },
 };
 
+static const struct mfd_cell max77802_devs[] = {
+       { .name = "max77802-pmic", },
+       { .name = "max77802-clk", },
+       { .name = "max77802-rtc", },
+};
+
+static bool max77802_pmic_is_accessible_reg(struct device *dev,
+                                           unsigned int reg)
+{
+       return (reg >= MAX77802_REG_DEVICE_ID && reg < MAX77802_REG_PMIC_END);
+}
+
+static bool max77802_rtc_is_accessible_reg(struct device *dev,
+                                          unsigned int reg)
+{
+       return (reg >= MAX77802_RTC_INT && reg < MAX77802_RTC_END);
+}
+
+static bool max77802_is_accessible_reg(struct device *dev, unsigned int reg)
+{
+       return (max77802_pmic_is_accessible_reg(dev, reg) ||
+               max77802_rtc_is_accessible_reg(dev, reg));
+}
+
+static bool max77802_pmic_is_precious_reg(struct device *dev, unsigned int reg)
+{
+       return (reg == MAX77802_REG_INTSRC || reg == MAX77802_REG_INT1 ||
+               reg == MAX77802_REG_INT2);
+}
+
+static bool max77802_rtc_is_precious_reg(struct device *dev, unsigned int reg)
+{
+       return (reg == MAX77802_RTC_INT ||
+               reg == MAX77802_RTC_UPDATE0 ||
+               reg == MAX77802_RTC_UPDATE1);
+}
+
+static bool max77802_is_precious_reg(struct device *dev, unsigned int reg)
+{
+       return (max77802_pmic_is_precious_reg(dev, reg) ||
+               max77802_rtc_is_precious_reg(dev, reg));
+}
+
+static bool max77802_pmic_is_volatile_reg(struct device *dev, unsigned int reg)
+{
+       return (max77802_is_precious_reg(dev, reg) ||
+               reg == MAX77802_REG_STATUS1 || reg == MAX77802_REG_STATUS2 ||
+               reg == MAX77802_REG_PWRON);
+}
+
+static bool max77802_rtc_is_volatile_reg(struct device *dev, unsigned int reg)
+{
+       return (max77802_rtc_is_precious_reg(dev, reg) ||
+               reg == MAX77802_RTC_SEC ||
+               reg == MAX77802_RTC_MIN ||
+               reg == MAX77802_RTC_HOUR ||
+               reg == MAX77802_RTC_WEEKDAY ||
+               reg == MAX77802_RTC_MONTH ||
+               reg == MAX77802_RTC_YEAR ||
+               reg == MAX77802_RTC_DATE);
+}
+
+static bool max77802_is_volatile_reg(struct device *dev, unsigned int reg)
+{
+       return (max77802_pmic_is_volatile_reg(dev, reg) ||
+               max77802_rtc_is_volatile_reg(dev, reg));
+}
+
 static struct regmap_config max77686_regmap_config = {
        .reg_bits = 8,
        .val_bits = 8,
 };
 
-#ifdef CONFIG_OF
+static struct regmap_config max77686_rtc_regmap_config = {
+       .reg_bits = 8,
+       .val_bits = 8,
+};
+
+static struct regmap_config max77802_regmap_config = {
+       .reg_bits = 8,
+       .val_bits = 8,
+       .writeable_reg = max77802_is_accessible_reg,
+       .readable_reg = max77802_is_accessible_reg,
+       .precious_reg = max77802_is_precious_reg,
+       .volatile_reg = max77802_is_volatile_reg,
+       .name = "max77802-pmic",
+       .cache_type = REGCACHE_RBTREE,
+};
+
+static const struct regmap_irq max77686_irqs[] = {
+       /* INT1 interrupts */
+       { .reg_offset = 0, .mask = MAX77686_INT1_PWRONF_MSK, },
+       { .reg_offset = 0, .mask = MAX77686_INT1_PWRONR_MSK, },
+       { .reg_offset = 0, .mask = MAX77686_INT1_JIGONBF_MSK, },
+       { .reg_offset = 0, .mask = MAX77686_INT1_JIGONBR_MSK, },
+       { .reg_offset = 0, .mask = MAX77686_INT1_ACOKBF_MSK, },
+       { .reg_offset = 0, .mask = MAX77686_INT1_ACOKBR_MSK, },
+       { .reg_offset = 0, .mask = MAX77686_INT1_ONKEY1S_MSK, },
+       { .reg_offset = 0, .mask = MAX77686_INT1_MRSTB_MSK, },
+       /* INT2 interrupts */
+       { .reg_offset = 1, .mask = MAX77686_INT2_140C_MSK, },
+       { .reg_offset = 1, .mask = MAX77686_INT2_120C_MSK, },
+};
+
+static const struct regmap_irq_chip max77686_irq_chip = {
+       .name                   = "max77686-pmic",
+       .status_base            = MAX77686_REG_INT1,
+       .mask_base              = MAX77686_REG_INT1MSK,
+       .num_regs               = 2,
+       .irqs                   = max77686_irqs,
+       .num_irqs               = ARRAY_SIZE(max77686_irqs),
+};
+
+static const struct regmap_irq max77686_rtc_irqs[] = {
+       /* RTC interrupts */
+       { .reg_offset = 0, .mask = MAX77686_RTCINT_RTC60S_MSK, },
+       { .reg_offset = 0, .mask = MAX77686_RTCINT_RTCA1_MSK, },
+       { .reg_offset = 0, .mask = MAX77686_RTCINT_RTCA2_MSK, },
+       { .reg_offset = 0, .mask = MAX77686_RTCINT_SMPL_MSK, },
+       { .reg_offset = 0, .mask = MAX77686_RTCINT_RTC1S_MSK, },
+       { .reg_offset = 0, .mask = MAX77686_RTCINT_WTSR_MSK, },
+};
+
+static const struct regmap_irq_chip max77686_rtc_irq_chip = {
+       .name                   = "max77686-rtc",
+       .status_base            = MAX77686_RTC_INT,
+       .mask_base              = MAX77686_RTC_INTM,
+       .num_regs               = 1,
+       .irqs                   = max77686_rtc_irqs,
+       .num_irqs               = ARRAY_SIZE(max77686_rtc_irqs),
+};
+
+static const struct regmap_irq_chip max77802_irq_chip = {
+       .name                   = "max77802-pmic",
+       .status_base            = MAX77802_REG_INT1,
+       .mask_base              = MAX77802_REG_INT1MSK,
+       .num_regs               = 2,
+       .irqs                   = max77686_irqs, /* same masks as 77686 */
+       .num_irqs               = ARRAY_SIZE(max77686_irqs),
+};
+
+static const struct regmap_irq_chip max77802_rtc_irq_chip = {
+       .name                   = "max77802-rtc",
+       .status_base            = MAX77802_RTC_INT,
+       .mask_base              = MAX77802_RTC_INTM,
+       .num_regs               = 1,
+       .irqs                   = max77686_rtc_irqs, /* same masks as 77686 */
+       .num_irqs               = ARRAY_SIZE(max77686_rtc_irqs),
+};
+
 static const struct of_device_id max77686_pmic_dt_match[] = {
-       {.compatible = "maxim,max77686", .data = NULL},
-       {},
+       {
+               .compatible = "maxim,max77686",
+               .data = (void *)TYPE_MAX77686,
+       },
+       {
+               .compatible = "maxim,max77802",
+               .data = (void *)TYPE_MAX77802,
+       },
+       { },
 };
 
 static struct max77686_platform_data *max77686_i2c_parse_dt_pdata(struct device
@@ -58,53 +211,74 @@ static struct max77686_platform_data *max77686_i2c_parse_dt_pdata(struct device
        struct max77686_platform_data *pd;
 
        pd = devm_kzalloc(dev, sizeof(*pd), GFP_KERNEL);
-       if (!pd) {
-               dev_err(dev, "could not allocate memory for pdata\n");
+       if (!pd)
                return NULL;
-       }
 
        dev->platform_data = pd;
        return pd;
 }
-#else
-static struct max77686_platform_data *max77686_i2c_parse_dt_pdata(struct device
-                                                                 *dev)
-{
-       return 0;
-}
-#endif
 
 static int max77686_i2c_probe(struct i2c_client *i2c,
                              const struct i2c_device_id *id)
 {
        struct max77686_dev *max77686 = NULL;
        struct max77686_platform_data *pdata = dev_get_platdata(&i2c->dev);
+       const struct of_device_id *match;
        unsigned int data;
        int ret = 0;
+       const struct regmap_config *config;
+       const struct regmap_irq_chip *irq_chip;
+       const struct regmap_irq_chip *rtc_irq_chip;
+       struct regmap **rtc_regmap;
+       const struct mfd_cell *cells;
+       int n_devs;
 
-       if (i2c->dev.of_node)
+       if (IS_ENABLED(CONFIG_OF) && i2c->dev.of_node && !pdata)
                pdata = max77686_i2c_parse_dt_pdata(&i2c->dev);
 
        if (!pdata) {
                dev_err(&i2c->dev, "No platform data found.\n");
-               return -EIO;
+               return -EINVAL;
        }
 
        max77686 = devm_kzalloc(&i2c->dev,
                                sizeof(struct max77686_dev), GFP_KERNEL);
-       if (max77686 == NULL)
+       if (!max77686)
                return -ENOMEM;
 
+       if (i2c->dev.of_node) {
+               match = of_match_node(max77686_pmic_dt_match, i2c->dev.of_node);
+               if (!match)
+                       return -EINVAL;
+
+               max77686->type = (unsigned long)match->data;
+       } else
+               max77686->type = id->driver_data;
+
        i2c_set_clientdata(i2c, max77686);
        max77686->dev = &i2c->dev;
        max77686->i2c = i2c;
-       max77686->type = id->driver_data;
 
        max77686->wakeup = pdata->wakeup;
-       max77686->irq_gpio = pdata->irq_gpio;
        max77686->irq = i2c->irq;
 
-       max77686->regmap = devm_regmap_init_i2c(i2c, &max77686_regmap_config);
+       if (max77686->type == TYPE_MAX77686) {
+               config = &max77686_regmap_config;
+               irq_chip = &max77686_irq_chip;
+               rtc_irq_chip = &max77686_rtc_irq_chip;
+               rtc_regmap = &max77686->rtc_regmap;
+               cells =  max77686_devs;
+               n_devs = ARRAY_SIZE(max77686_devs);
+       } else {
+               config = &max77802_regmap_config;
+               irq_chip = &max77802_irq_chip;
+               rtc_irq_chip = &max77802_rtc_irq_chip;
+               rtc_regmap = &max77686->regmap;
+               cells =  max77802_devs;
+               n_devs = ARRAY_SIZE(max77802_devs);
+       }
+
+       max77686->regmap = devm_regmap_init_i2c(i2c, config);
        if (IS_ERR(max77686->regmap)) {
                ret = PTR_ERR(max77686->regmap);
                dev_err(max77686->dev, "Failed to allocate register map: %d\n",
@@ -112,30 +286,68 @@ static int max77686_i2c_probe(struct i2c_client *i2c,
                return ret;
        }
 
-       if (regmap_read(max77686->regmap,
-                        MAX77686_REG_DEVICE_ID, &data) < 0) {
+       ret = regmap_read(max77686->regmap, MAX77686_REG_DEVICE_ID, &data);
+       if (ret < 0) {
                dev_err(max77686->dev,
                        "device not found on this channel (this is not an error)\n");
                return -ENODEV;
-       } else
-               dev_info(max77686->dev, "device found\n");
+       }
 
-       max77686->rtc = i2c_new_dummy(i2c->adapter, I2C_ADDR_RTC);
-       if (!max77686->rtc) {
-               dev_err(max77686->dev, "Failed to allocate I2C device for RTC\n");
-               return -ENODEV;
+       if (max77686->type == TYPE_MAX77686) {
+               max77686->rtc = i2c_new_dummy(i2c->adapter, I2C_ADDR_RTC);
+               if (!max77686->rtc) {
+                       dev_err(max77686->dev,
+                               "Failed to allocate I2C device for RTC\n");
+                       return -ENODEV;
+               }
+               i2c_set_clientdata(max77686->rtc, max77686);
+
+               max77686->rtc_regmap =
+                       devm_regmap_init_i2c(max77686->rtc,
+                                            &max77686_rtc_regmap_config);
+               if (IS_ERR(max77686->rtc_regmap)) {
+                       ret = PTR_ERR(max77686->rtc_regmap);
+                       dev_err(max77686->dev,
+                               "failed to allocate RTC regmap: %d\n",
+                               ret);
+                       goto err_unregister_i2c;
+               }
+       }
+
+       ret = regmap_add_irq_chip(max77686->regmap, max77686->irq,
+                                 IRQF_TRIGGER_FALLING | IRQF_ONESHOT |
+                                 IRQF_SHARED, 0, irq_chip,
+                                 &max77686->irq_data);
+       if (ret) {
+               dev_err(&i2c->dev, "failed to add PMIC irq chip: %d\n", ret);
+               goto err_unregister_i2c;
        }
-       i2c_set_clientdata(max77686->rtc, max77686);
 
-       max77686_irq_init(max77686);
+       ret = regmap_add_irq_chip(*rtc_regmap, max77686->irq,
+                                 IRQF_TRIGGER_FALLING | IRQF_ONESHOT |
+                                 IRQF_SHARED, 0, rtc_irq_chip,
+                                 &max77686->rtc_irq_data);
+       if (ret) {
+               dev_err(&i2c->dev, "failed to add RTC irq chip: %d\n", ret);
+               goto err_del_irqc;
+       }
 
-       ret = mfd_add_devices(max77686->dev, -1, max77686_devs,
-                             ARRAY_SIZE(max77686_devs), NULL, 0, NULL);
+       ret = mfd_add_devices(max77686->dev, -1, cells, n_devs, NULL, 0, NULL);
        if (ret < 0) {
-               mfd_remove_devices(max77686->dev);
-               i2c_unregister_device(max77686->rtc);
+               dev_err(&i2c->dev, "failed to add MFD devices: %d\n", ret);
+               goto err_del_rtc_irqc;
        }
 
+       return 0;
+
+err_del_rtc_irqc:
+       regmap_del_irq_chip(max77686->irq, max77686->rtc_irq_data);
+err_del_irqc:
+       regmap_del_irq_chip(max77686->irq, max77686->irq_data);
+err_unregister_i2c:
+       if (max77686->type == TYPE_MAX77686)
+               i2c_unregister_device(max77686->rtc);
+
        return ret;
 }
 
@@ -144,7 +356,12 @@ static int max77686_i2c_remove(struct i2c_client *i2c)
        struct max77686_dev *max77686 = i2c_get_clientdata(i2c);
 
        mfd_remove_devices(max77686->dev);
-       i2c_unregister_device(max77686->rtc);
+
+       regmap_del_irq_chip(max77686->irq, max77686->rtc_irq_data);
+       regmap_del_irq_chip(max77686->irq, max77686->irq_data);
+
+       if (max77686->type == TYPE_MAX77686)
+               i2c_unregister_device(max77686->rtc);
 
        return 0;
 }
@@ -155,10 +372,50 @@ static const struct i2c_device_id max77686_i2c_id[] = {
 };
 MODULE_DEVICE_TABLE(i2c, max77686_i2c_id);
 
+#ifdef CONFIG_PM_SLEEP
+static int max77686_suspend(struct device *dev)
+{
+       struct i2c_client *i2c = container_of(dev, struct i2c_client, dev);
+       struct max77686_dev *max77686 = i2c_get_clientdata(i2c);
+
+       if (device_may_wakeup(dev))
+               enable_irq_wake(max77686->irq);
+
+       /*
+        * IRQ must be disabled during suspend because if it happens
+        * while suspended it will be handled before resuming I2C.
+        *
+        * When device is woken up from suspend (e.g. by RTC wake alarm),
+        * an interrupt occurs before resuming I2C bus controller.
+        * Interrupt handler tries to read registers but this read
+        * will fail because I2C is still suspended.
+        */
+       disable_irq(max77686->irq);
+
+       return 0;
+}
+
+static int max77686_resume(struct device *dev)
+{
+       struct i2c_client *i2c = container_of(dev, struct i2c_client, dev);
+       struct max77686_dev *max77686 = i2c_get_clientdata(i2c);
+
+       if (device_may_wakeup(dev))
+               disable_irq_wake(max77686->irq);
+
+       enable_irq(max77686->irq);
+
+       return 0;
+}
+#endif /* CONFIG_PM_SLEEP */
+
+static SIMPLE_DEV_PM_OPS(max77686_pm, max77686_suspend, max77686_resume);
+
 static struct i2c_driver max77686_i2c_driver = {
        .driver = {
                   .name = "max77686",
                   .owner = THIS_MODULE,
+                  .pm = &max77686_pm,
                   .of_match_table = of_match_ptr(max77686_pmic_dt_match),
        },
        .probe = max77686_i2c_probe,
@@ -179,6 +436,6 @@ static void __exit max77686_i2c_exit(void)
 }
 module_exit(max77686_i2c_exit);
 
-MODULE_DESCRIPTION("MAXIM 77686 multi-function core driver");
+MODULE_DESCRIPTION("MAXIM 77686/802 multi-function core driver");
 MODULE_AUTHOR("Chiwoong Byun <woong.byun@samsung.com>");
 MODULE_LICENSE("GPL");
index f3faf0c45dddf36d09d4b2d05641145a7ebe13f6..97a787ab3d51d051a14e4abcf8ebdf96de40bc99 100644 (file)
@@ -624,6 +624,7 @@ static void max8925_irq_sync_unlock(struct irq_data *data)
 static void max8925_irq_enable(struct irq_data *data)
 {
        struct max8925_chip *chip = irq_data_get_irq_chip_data(data);
+
        max8925_irqs[data->irq - chip->irq_base].enable
                = max8925_irqs[data->irq - chip->irq_base].offs;
 }
@@ -631,6 +632,7 @@ static void max8925_irq_enable(struct irq_data *data)
 static void max8925_irq_disable(struct irq_data *data)
 {
        struct max8925_chip *chip = irq_data_get_irq_chip_data(data);
+
        max8925_irqs[data->irq - chip->irq_base].enable = 0;
 }
 
index a83eed5c15ca8ecfdad73e09e63e7b2e1ac773fe..ecbe78ead3b6162db50d3d82be994a5667ea7c41 100644 (file)
@@ -257,9 +257,11 @@ static struct i2c_driver max8925_driver = {
 static int __init max8925_i2c_init(void)
 {
        int ret;
+
        ret = i2c_add_driver(&max8925_driver);
        if (ret != 0)
                pr_err("Failed to register MAX8925 I2C driver: %d\n", ret);
+
        return ret;
 }
 subsys_initcall(max8925_i2c_init);
index acf5dd712eb297667ea7f0814a0cedb9241e009e..2b6bc868cd3d5502c0908589e98ffa26c0eaa4a8 100644 (file)
  * Free Software Foundation.
  */
 
-#include <linux/slab.h>
 #include <linux/module.h>
-#include <linux/platform_device.h>
-#include <linux/mutex.h>
-#include <linux/interrupt.h>
-#include <linux/mfd/core.h>
-#include <linux/mfd/mc13xxx.h>
 #include <linux/of.h>
 #include <linux/of_device.h>
-#include <linux/of_gpio.h>
+#include <linux/platform_device.h>
+#include <linux/mfd/core.h>
 
 #include "mc13xxx.h"
 
 #define MC13XXX_IRQSTAT0       0
-#define MC13XXX_IRQSTAT0_ADCDONEI      (1 << 0)
-#define MC13XXX_IRQSTAT0_ADCBISDONEI   (1 << 1)
-#define MC13XXX_IRQSTAT0_TSI           (1 << 2)
-#define MC13783_IRQSTAT0_WHIGHI                (1 << 3)
-#define MC13783_IRQSTAT0_WLOWI         (1 << 4)
-#define MC13XXX_IRQSTAT0_CHGDETI       (1 << 6)
-#define MC13783_IRQSTAT0_CHGOVI                (1 << 7)
-#define MC13XXX_IRQSTAT0_CHGREVI       (1 << 8)
-#define MC13XXX_IRQSTAT0_CHGSHORTI     (1 << 9)
-#define MC13XXX_IRQSTAT0_CCCVI         (1 << 10)
-#define MC13XXX_IRQSTAT0_CHGCURRI      (1 << 11)
-#define MC13XXX_IRQSTAT0_BPONI         (1 << 12)
-#define MC13XXX_IRQSTAT0_LOBATLI       (1 << 13)
-#define MC13XXX_IRQSTAT0_LOBATHI       (1 << 14)
-#define MC13783_IRQSTAT0_UDPI          (1 << 15)
-#define MC13783_IRQSTAT0_USBI          (1 << 16)
-#define MC13783_IRQSTAT0_IDI           (1 << 19)
-#define MC13783_IRQSTAT0_SE1I          (1 << 21)
-#define MC13783_IRQSTAT0_CKDETI                (1 << 22)
-#define MC13783_IRQSTAT0_UDMI          (1 << 23)
-
 #define MC13XXX_IRQMASK0       1
-#define MC13XXX_IRQMASK0_ADCDONEM      MC13XXX_IRQSTAT0_ADCDONEI
-#define MC13XXX_IRQMASK0_ADCBISDONEM   MC13XXX_IRQSTAT0_ADCBISDONEI
-#define MC13XXX_IRQMASK0_TSM           MC13XXX_IRQSTAT0_TSI
-#define MC13783_IRQMASK0_WHIGHM                MC13783_IRQSTAT0_WHIGHI
-#define MC13783_IRQMASK0_WLOWM         MC13783_IRQSTAT0_WLOWI
-#define MC13XXX_IRQMASK0_CHGDETM       MC13XXX_IRQSTAT0_CHGDETI
-#define MC13783_IRQMASK0_CHGOVM                MC13783_IRQSTAT0_CHGOVI
-#define MC13XXX_IRQMASK0_CHGREVM       MC13XXX_IRQSTAT0_CHGREVI
-#define MC13XXX_IRQMASK0_CHGSHORTM     MC13XXX_IRQSTAT0_CHGSHORTI
-#define MC13XXX_IRQMASK0_CCCVM         MC13XXX_IRQSTAT0_CCCVI
-#define MC13XXX_IRQMASK0_CHGCURRM      MC13XXX_IRQSTAT0_CHGCURRI
-#define MC13XXX_IRQMASK0_BPONM         MC13XXX_IRQSTAT0_BPONI
-#define MC13XXX_IRQMASK0_LOBATLM       MC13XXX_IRQSTAT0_LOBATLI
-#define MC13XXX_IRQMASK0_LOBATHM       MC13XXX_IRQSTAT0_LOBATHI
-#define MC13783_IRQMASK0_UDPM          MC13783_IRQSTAT0_UDPI
-#define MC13783_IRQMASK0_USBM          MC13783_IRQSTAT0_USBI
-#define MC13783_IRQMASK0_IDM           MC13783_IRQSTAT0_IDI
-#define MC13783_IRQMASK0_SE1M          MC13783_IRQSTAT0_SE1I
-#define MC13783_IRQMASK0_CKDETM                MC13783_IRQSTAT0_CKDETI
-#define MC13783_IRQMASK0_UDMM          MC13783_IRQSTAT0_UDMI
-
 #define MC13XXX_IRQSTAT1       3
-#define MC13XXX_IRQSTAT1_1HZI          (1 << 0)
-#define MC13XXX_IRQSTAT1_TODAI         (1 << 1)
-#define MC13783_IRQSTAT1_ONOFD1I       (1 << 3)
-#define MC13783_IRQSTAT1_ONOFD2I       (1 << 4)
-#define MC13783_IRQSTAT1_ONOFD3I       (1 << 5)
-#define MC13XXX_IRQSTAT1_SYSRSTI       (1 << 6)
-#define MC13XXX_IRQSTAT1_RTCRSTI       (1 << 7)
-#define MC13XXX_IRQSTAT1_PCI           (1 << 8)
-#define MC13XXX_IRQSTAT1_WARMI         (1 << 9)
-#define MC13XXX_IRQSTAT1_MEMHLDI       (1 << 10)
-#define MC13783_IRQSTAT1_PWRRDYI       (1 << 11)
-#define MC13XXX_IRQSTAT1_THWARNLI      (1 << 12)
-#define MC13XXX_IRQSTAT1_THWARNHI      (1 << 13)
-#define MC13XXX_IRQSTAT1_CLKI          (1 << 14)
-#define MC13783_IRQSTAT1_SEMAFI                (1 << 15)
-#define MC13783_IRQSTAT1_MC2BI         (1 << 17)
-#define MC13783_IRQSTAT1_HSDETI                (1 << 18)
-#define MC13783_IRQSTAT1_HSLI          (1 << 19)
-#define MC13783_IRQSTAT1_ALSPTHI       (1 << 20)
-#define MC13783_IRQSTAT1_AHSSHORTI     (1 << 21)
-
 #define MC13XXX_IRQMASK1       4
-#define MC13XXX_IRQMASK1_1HZM          MC13XXX_IRQSTAT1_1HZI
-#define MC13XXX_IRQMASK1_TODAM         MC13XXX_IRQSTAT1_TODAI
-#define MC13783_IRQMASK1_ONOFD1M       MC13783_IRQSTAT1_ONOFD1I
-#define MC13783_IRQMASK1_ONOFD2M       MC13783_IRQSTAT1_ONOFD2I
-#define MC13783_IRQMASK1_ONOFD3M       MC13783_IRQSTAT1_ONOFD3I
-#define MC13XXX_IRQMASK1_SYSRSTM       MC13XXX_IRQSTAT1_SYSRSTI
-#define MC13XXX_IRQMASK1_RTCRSTM       MC13XXX_IRQSTAT1_RTCRSTI
-#define MC13XXX_IRQMASK1_PCM           MC13XXX_IRQSTAT1_PCI
-#define MC13XXX_IRQMASK1_WARMM         MC13XXX_IRQSTAT1_WARMI
-#define MC13XXX_IRQMASK1_MEMHLDM       MC13XXX_IRQSTAT1_MEMHLDI
-#define MC13783_IRQMASK1_PWRRDYM       MC13783_IRQSTAT1_PWRRDYI
-#define MC13XXX_IRQMASK1_THWARNLM      MC13XXX_IRQSTAT1_THWARNLI
-#define MC13XXX_IRQMASK1_THWARNHM      MC13XXX_IRQSTAT1_THWARNHI
-#define MC13XXX_IRQMASK1_CLKM          MC13XXX_IRQSTAT1_CLKI
-#define MC13783_IRQMASK1_SEMAFM                MC13783_IRQSTAT1_SEMAFI
-#define MC13783_IRQMASK1_MC2BM         MC13783_IRQSTAT1_MC2BI
-#define MC13783_IRQMASK1_HSDETM                MC13783_IRQSTAT1_HSDETI
-#define MC13783_IRQMASK1_HSLM          MC13783_IRQSTAT1_HSLI
-#define MC13783_IRQMASK1_ALSPTHM       MC13783_IRQSTAT1_ALSPTHI
-#define MC13783_IRQMASK1_AHSSHORTM     MC13783_IRQSTAT1_AHSSHORTI
 
 #define MC13XXX_REVISION       7
 #define MC13XXX_REVISION_REVMETAL      (0x07 <<  0)
@@ -189,45 +101,21 @@ EXPORT_SYMBOL(mc13xxx_reg_rmw);
 
 int mc13xxx_irq_mask(struct mc13xxx *mc13xxx, int irq)
 {
-       int ret;
-       unsigned int offmask = irq < 24 ? MC13XXX_IRQMASK0 : MC13XXX_IRQMASK1;
-       u32 irqbit = 1 << (irq < 24 ? irq : irq - 24);
-       u32 mask;
-
-       if (irq < 0 || irq >= MC13XXX_NUM_IRQ)
-               return -EINVAL;
-
-       ret = mc13xxx_reg_read(mc13xxx, offmask, &mask);
-       if (ret)
-               return ret;
+       int virq = regmap_irq_get_virq(mc13xxx->irq_data, irq);
 
-       if (mask & irqbit)
-               /* already masked */
-               return 0;
+       disable_irq_nosync(virq);
 
-       return mc13xxx_reg_write(mc13xxx, offmask, mask | irqbit);
+       return 0;
 }
 EXPORT_SYMBOL(mc13xxx_irq_mask);
 
 int mc13xxx_irq_unmask(struct mc13xxx *mc13xxx, int irq)
 {
-       int ret;
-       unsigned int offmask = irq < 24 ? MC13XXX_IRQMASK0 : MC13XXX_IRQMASK1;
-       u32 irqbit = 1 << (irq < 24 ? irq : irq - 24);
-       u32 mask;
-
-       if (irq < 0 || irq >= MC13XXX_NUM_IRQ)
-               return -EINVAL;
+       int virq = regmap_irq_get_virq(mc13xxx->irq_data, irq);
 
-       ret = mc13xxx_reg_read(mc13xxx, offmask, &mask);
-       if (ret)
-               return ret;
+       enable_irq(virq);
 
-       if (!(mask & irqbit))
-               /* already unmasked */
-               return 0;
-
-       return mc13xxx_reg_write(mc13xxx, offmask, mask & ~irqbit);
+       return 0;
 }
 EXPORT_SYMBOL(mc13xxx_irq_unmask);
 
@@ -239,7 +127,7 @@ int mc13xxx_irq_status(struct mc13xxx *mc13xxx, int irq,
        unsigned int offstat = irq < 24 ? MC13XXX_IRQSTAT0 : MC13XXX_IRQSTAT1;
        u32 irqbit = 1 << (irq < 24 ? irq : irq - 24);
 
-       if (irq < 0 || irq >= MC13XXX_NUM_IRQ)
+       if (irq < 0 || irq >= ARRAY_SIZE(mc13xxx->irqs))
                return -EINVAL;
 
        if (enabled) {
@@ -266,147 +154,26 @@ int mc13xxx_irq_status(struct mc13xxx *mc13xxx, int irq,
 }
 EXPORT_SYMBOL(mc13xxx_irq_status);
 
-int mc13xxx_irq_ack(struct mc13xxx *mc13xxx, int irq)
-{
-       unsigned int offstat = irq < 24 ? MC13XXX_IRQSTAT0 : MC13XXX_IRQSTAT1;
-       unsigned int val = 1 << (irq < 24 ? irq : irq - 24);
-
-       BUG_ON(irq < 0 || irq >= MC13XXX_NUM_IRQ);
-
-       return mc13xxx_reg_write(mc13xxx, offstat, val);
-}
-EXPORT_SYMBOL(mc13xxx_irq_ack);
-
-int mc13xxx_irq_request_nounmask(struct mc13xxx *mc13xxx, int irq,
-               irq_handler_t handler, const char *name, void *dev)
-{
-       BUG_ON(!mutex_is_locked(&mc13xxx->lock));
-       BUG_ON(!handler);
-
-       if (irq < 0 || irq >= MC13XXX_NUM_IRQ)
-               return -EINVAL;
-
-       if (mc13xxx->irqhandler[irq])
-               return -EBUSY;
-
-       mc13xxx->irqhandler[irq] = handler;
-       mc13xxx->irqdata[irq] = dev;
-
-       return 0;
-}
-EXPORT_SYMBOL(mc13xxx_irq_request_nounmask);
-
 int mc13xxx_irq_request(struct mc13xxx *mc13xxx, int irq,
                irq_handler_t handler, const char *name, void *dev)
 {
-       int ret;
+       int virq = regmap_irq_get_virq(mc13xxx->irq_data, irq);
 
-       ret = mc13xxx_irq_request_nounmask(mc13xxx, irq, handler, name, dev);
-       if (ret)
-               return ret;
-
-       ret = mc13xxx_irq_unmask(mc13xxx, irq);
-       if (ret) {
-               mc13xxx->irqhandler[irq] = NULL;
-               mc13xxx->irqdata[irq] = NULL;
-               return ret;
-       }
-
-       return 0;
+       return devm_request_threaded_irq(mc13xxx->dev, virq, NULL, handler,
+                                        0, name, dev);
 }
 EXPORT_SYMBOL(mc13xxx_irq_request);
 
 int mc13xxx_irq_free(struct mc13xxx *mc13xxx, int irq, void *dev)
 {
-       int ret;
-       BUG_ON(!mutex_is_locked(&mc13xxx->lock));
+       int virq = regmap_irq_get_virq(mc13xxx->irq_data, irq);
 
-       if (irq < 0 || irq >= MC13XXX_NUM_IRQ || !mc13xxx->irqhandler[irq] ||
-                       mc13xxx->irqdata[irq] != dev)
-               return -EINVAL;
-
-       ret = mc13xxx_irq_mask(mc13xxx, irq);
-       if (ret)
-               return ret;
-
-       mc13xxx->irqhandler[irq] = NULL;
-       mc13xxx->irqdata[irq] = NULL;
+       devm_free_irq(mc13xxx->dev, virq, dev);
 
        return 0;
 }
 EXPORT_SYMBOL(mc13xxx_irq_free);
 
-static inline irqreturn_t mc13xxx_irqhandler(struct mc13xxx *mc13xxx, int irq)
-{
-       return mc13xxx->irqhandler[irq](irq, mc13xxx->irqdata[irq]);
-}
-
-/*
- * returns: number of handled irqs or negative error
- * locking: holds mc13xxx->lock
- */
-static int mc13xxx_irq_handle(struct mc13xxx *mc13xxx,
-               unsigned int offstat, unsigned int offmask, int baseirq)
-{
-       u32 stat, mask;
-       int ret = mc13xxx_reg_read(mc13xxx, offstat, &stat);
-       int num_handled = 0;
-
-       if (ret)
-               return ret;
-
-       ret = mc13xxx_reg_read(mc13xxx, offmask, &mask);
-       if (ret)
-               return ret;
-
-       while (stat & ~mask) {
-               int irq = __ffs(stat & ~mask);
-
-               stat &= ~(1 << irq);
-
-               if (likely(mc13xxx->irqhandler[baseirq + irq])) {
-                       irqreturn_t handled;
-
-                       handled = mc13xxx_irqhandler(mc13xxx, baseirq + irq);
-                       if (handled == IRQ_HANDLED)
-                               num_handled++;
-               } else {
-                       dev_err(mc13xxx->dev,
-                                       "BUG: irq %u but no handler\n",
-                                       baseirq + irq);
-
-                       mask |= 1 << irq;
-
-                       ret = mc13xxx_reg_write(mc13xxx, offmask, mask);
-               }
-       }
-
-       return num_handled;
-}
-
-static irqreturn_t mc13xxx_irq_thread(int irq, void *data)
-{
-       struct mc13xxx *mc13xxx = data;
-       irqreturn_t ret;
-       int handled = 0;
-
-       mc13xxx_lock(mc13xxx);
-
-       ret = mc13xxx_irq_handle(mc13xxx, MC13XXX_IRQSTAT0,
-                       MC13XXX_IRQMASK0, 0);
-       if (ret > 0)
-               handled = 1;
-
-       ret = mc13xxx_irq_handle(mc13xxx, MC13XXX_IRQSTAT1,
-                       MC13XXX_IRQMASK1, 24);
-       if (ret > 0)
-               handled = 1;
-
-       mc13xxx_unlock(mc13xxx);
-
-       return IRQ_RETVAL(handled);
-}
-
 #define maskval(reg, mask)     (((reg) & (mask)) >> __ffs(mask))
 static void mc13xxx_print_revision(struct mc13xxx *mc13xxx, u32 revision)
 {
@@ -475,8 +242,6 @@ static irqreturn_t mc13xxx_handler_adcdone(int irq, void *data)
 {
        struct mc13xxx_adcdone_data *adcdone_data = data;
 
-       mc13xxx_irq_ack(adcdone_data->mc13xxx, irq);
-
        complete_all(&adcdone_data->done);
 
        return IRQ_HANDLED;
@@ -544,7 +309,6 @@ int mc13xxx_adc_do_conversion(struct mc13xxx *mc13xxx, unsigned int mode,
        dev_dbg(mc13xxx->dev, "%s: request irq\n", __func__);
        mc13xxx_irq_request(mc13xxx, MC13XXX_IRQ_ADCDONE,
                        mc13xxx_handler_adcdone, __func__, &adcdone_data);
-       mc13xxx_irq_ack(mc13xxx, MC13XXX_IRQ_ADCDONE);
 
        mc13xxx_reg_write(mc13xxx, MC13XXX_ADC0, adc0);
        mc13xxx_reg_write(mc13xxx, MC13XXX_ADC1, adc1);
@@ -599,7 +363,8 @@ static int mc13xxx_add_subdevice_pdata(struct mc13xxx *mc13xxx,
        if (!cell.name)
                return -ENOMEM;
 
-       return mfd_add_devices(mc13xxx->dev, -1, &cell, 1, NULL, 0, NULL);
+       return mfd_add_devices(mc13xxx->dev, -1, &cell, 1, NULL, 0,
+                              regmap_irq_get_domain(mc13xxx->irq_data));
 }
 
 static int mc13xxx_add_subdevice(struct mc13xxx *mc13xxx, const char *format)
@@ -640,8 +405,8 @@ int mc13xxx_common_init(struct device *dev)
 {
        struct mc13xxx_platform_data *pdata = dev_get_platdata(dev);
        struct mc13xxx *mc13xxx = dev_get_drvdata(dev);
-       int ret;
        u32 revision;
+       int i, ret;
 
        mc13xxx->dev = dev;
 
@@ -651,31 +416,32 @@ int mc13xxx_common_init(struct device *dev)
 
        mc13xxx->variant->print_revision(mc13xxx, revision);
 
-       /* mask all irqs */
-       ret = mc13xxx_reg_write(mc13xxx, MC13XXX_IRQMASK0, 0x00ffffff);
-       if (ret)
-               return ret;
+       for (i = 0; i < ARRAY_SIZE(mc13xxx->irqs); i++) {
+               mc13xxx->irqs[i].reg_offset = i / MC13XXX_IRQ_PER_REG;
+               mc13xxx->irqs[i].mask = BIT(i % MC13XXX_IRQ_PER_REG);
+       }
 
-       ret = mc13xxx_reg_write(mc13xxx, MC13XXX_IRQMASK1, 0x00ffffff);
+       mc13xxx->irq_chip.name = dev_name(dev);
+       mc13xxx->irq_chip.status_base = MC13XXX_IRQSTAT0;
+       mc13xxx->irq_chip.mask_base = MC13XXX_IRQMASK0;
+       mc13xxx->irq_chip.ack_base = MC13XXX_IRQSTAT0;
+       mc13xxx->irq_chip.irq_reg_stride = MC13XXX_IRQSTAT1 - MC13XXX_IRQSTAT0;
+       mc13xxx->irq_chip.init_ack_masked = true;
+       mc13xxx->irq_chip.use_ack = true;
+       mc13xxx->irq_chip.num_regs = MC13XXX_IRQ_REG_CNT;
+       mc13xxx->irq_chip.irqs = mc13xxx->irqs;
+       mc13xxx->irq_chip.num_irqs = ARRAY_SIZE(mc13xxx->irqs);
+
+       ret = regmap_add_irq_chip(mc13xxx->regmap, mc13xxx->irq, IRQF_ONESHOT,
+                                 0, &mc13xxx->irq_chip, &mc13xxx->irq_data);
        if (ret)
                return ret;
 
        mutex_init(&mc13xxx->lock);
 
-       ret = request_threaded_irq(mc13xxx->irq, NULL, mc13xxx_irq_thread,
-                       IRQF_ONESHOT | IRQF_TRIGGER_HIGH, "mc13xxx", mc13xxx);
-       if (ret)
-               return ret;
-
        if (mc13xxx_probe_flags_dt(mc13xxx) < 0 && pdata)
                mc13xxx->flags = pdata->flags;
 
-       if (mc13xxx->flags & MC13XXX_USE_ADC)
-               mc13xxx_add_subdevice(mc13xxx, "%s-adc");
-
-       if (mc13xxx->flags & MC13XXX_USE_RTC)
-               mc13xxx_add_subdevice(mc13xxx, "%s-rtc");
-
        if (pdata) {
                mc13xxx_add_subdevice_pdata(mc13xxx, "%s-regulator",
                        &pdata->regulators, sizeof(pdata->regulators));
@@ -699,6 +465,12 @@ int mc13xxx_common_init(struct device *dev)
                        mc13xxx_add_subdevice(mc13xxx, "%s-ts");
        }
 
+       if (mc13xxx->flags & MC13XXX_USE_ADC)
+               mc13xxx_add_subdevice(mc13xxx, "%s-adc");
+
+       if (mc13xxx->flags & MC13XXX_USE_RTC)
+               mc13xxx_add_subdevice(mc13xxx, "%s-rtc");
+
        return 0;
 }
 EXPORT_SYMBOL_GPL(mc13xxx_common_init);
@@ -707,8 +479,8 @@ int mc13xxx_common_exit(struct device *dev)
 {
        struct mc13xxx *mc13xxx = dev_get_drvdata(dev);
 
-       free_irq(mc13xxx->irq, mc13xxx);
        mfd_remove_devices(dev);
+       regmap_del_irq_chip(mc13xxx->irq, mc13xxx->irq_data);
        mutex_destroy(&mc13xxx->lock);
 
        return 0;
index ae7f1659f5d1efedd82bd68af21faab44b4c0fa0..33677d1dcf66857d8f104291794737c882960ff7 100644 (file)
@@ -13,7 +13,9 @@
 #include <linux/regmap.h>
 #include <linux/mfd/mc13xxx.h>
 
-#define MC13XXX_NUMREGS 0x3f
+#define MC13XXX_NUMREGS                0x3f
+#define MC13XXX_IRQ_REG_CNT    2
+#define MC13XXX_IRQ_PER_REG    24
 
 struct mc13xxx;
 
@@ -33,13 +35,14 @@ struct mc13xxx {
        struct device *dev;
        const struct mc13xxx_variant *variant;
 
+       struct regmap_irq irqs[MC13XXX_IRQ_PER_REG * MC13XXX_IRQ_REG_CNT];
+       struct regmap_irq_chip irq_chip;
+       struct regmap_irq_chip_data *irq_data;
+
        struct mutex lock;
        int irq;
        int flags;
 
-       irq_handler_t irqhandler[MC13XXX_NUM_IRQ];
-       void *irqdata[MC13XXX_NUM_IRQ];
-
        int adcflags;
 };
 
index 62e5e3617eb0e34b2bc0bb8985b31da5f39aa2d7..7f5066e397527e27cf94df0baec9107f22e84246 100644 (file)
@@ -137,6 +137,7 @@ EXPORT_SYMBOL(mcp_reg_read);
 void mcp_enable(struct mcp *mcp)
 {
        unsigned long flags;
+
        spin_lock_irqsave(&mcp->lock, flags);
        if (mcp->use_count++ == 0)
                mcp->ops->enable(mcp);
index b48d80c367f902e557ff3ce3d8a04f3954bd4e34..33a9234b701c51b7c30c899c026fc92f6d4a0771 100644 (file)
@@ -445,7 +445,7 @@ static unsigned omap_usbhs_rev1_hostconfig(struct usbhs_hcd_omap *omap,
 
                for (i = 0; i < omap->nports; i++) {
                        if (is_ehci_phy_mode(pdata->port_mode[i])) {
-                               reg &= OMAP_UHH_HOSTCONFIG_ULPI_BYPASS;
+                               reg &= ~OMAP_UHH_HOSTCONFIG_ULPI_BYPASS;
                                break;
                        }
                }
index 41ab5e34d2acb0a150f5ae9af8aab3774cfd01a3..c87f7a0a53f878948daf89f625958d3da5647fa6 100644 (file)
@@ -244,20 +244,20 @@ static int pcf50633_probe(struct i2c_client *client,
 
        for (i = 0; i < PCF50633_NUM_REGULATORS; i++) {
                struct platform_device *pdev;
+               int j;
 
                pdev = platform_device_alloc("pcf50633-regulator", i);
-               if (!pdev) {
-                       dev_err(pcf->dev, "Cannot create regulator %d\n", i);
-                       continue;
-               }
+               if (!pdev)
+                       return -ENOMEM;
 
                pdev->dev.parent = pcf->dev;
-               if (platform_device_add_data(pdev, &pdata->reg_init_data[i],
-                                       sizeof(pdata->reg_init_data[i])) < 0) {
+               ret = platform_device_add_data(pdev, &pdata->reg_init_data[i],
+                                              sizeof(pdata->reg_init_data[i]));
+               if (ret) {
                        platform_device_put(pdev);
-                       dev_err(pcf->dev, "Out of memory for regulator parameters %d\n",
-                                                                       i);
-                       continue;
+                       for (j = 0; j < i; j++)
+                               platform_device_put(pcf->regulator_pdev[j]);
+                       return ret;
                }
                pcf->regulator_pdev[i] = pdev;
 
index 959513803542ee6e3e0bfc6afd383144e356cbe1..39904f77c0496fbd7763cf12fee7cddf3d860fb0 100644 (file)
@@ -186,11 +186,9 @@ static void pm8xxx_irq_mask_ack(struct irq_data *d)
 {
        struct pm_irq_chip *chip = irq_data_get_irq_chip_data(d);
        unsigned int pmirq = irqd_to_hwirq(d);
-       int     irq_bit;
        u8      block, config;
 
        block = pmirq / 8;
-       irq_bit = pmirq % 8;
 
        config = chip->config[pmirq] | PM_IRQF_MASK_ALL | PM_IRQF_CLR;
        pm8xxx_config_irq(chip, block, config);
@@ -200,11 +198,9 @@ static void pm8xxx_irq_unmask(struct irq_data *d)
 {
        struct pm_irq_chip *chip = irq_data_get_irq_chip_data(d);
        unsigned int pmirq = irqd_to_hwirq(d);
-       int     irq_bit;
        u8      block, config;
 
        block = pmirq / 8;
-       irq_bit = pmirq % 8;
 
        config = chip->config[pmirq];
        pm8xxx_config_irq(chip, block, config);
index 1d15735f9ef930ed18e384b1c63b7deb1fd42981..d01b8c24923104287ed84927038cb51576a4f7d6 100644 (file)
@@ -337,40 +337,64 @@ static void rtsx_pci_add_sg_tbl(struct rtsx_pcr *pcr,
 int rtsx_pci_transfer_data(struct rtsx_pcr *pcr, struct scatterlist *sglist,
                int num_sg, bool read, int timeout)
 {
-       struct completion trans_done;
-       u8 dir;
-       int err = 0, i, count;
-       long timeleft;
-       unsigned long flags;
-       struct scatterlist *sg;
-       enum dma_data_direction dma_dir;
-       u32 val;
-       dma_addr_t addr;
-       unsigned int len;
+       int err = 0, count;
 
        dev_dbg(&(pcr->pci->dev), "--> %s: num_sg = %d\n", __func__, num_sg);
+       count = rtsx_pci_dma_map_sg(pcr, sglist, num_sg, read);
+       if (count < 1)
+               return -EINVAL;
+       dev_dbg(&(pcr->pci->dev), "DMA mapping count: %d\n", count);
+
+       err = rtsx_pci_dma_transfer(pcr, sglist, count, read, timeout);
+
+       rtsx_pci_dma_unmap_sg(pcr, sglist, num_sg, read);
+
+       return err;
+}
+EXPORT_SYMBOL_GPL(rtsx_pci_transfer_data);
+
+int rtsx_pci_dma_map_sg(struct rtsx_pcr *pcr, struct scatterlist *sglist,
+               int num_sg, bool read)
+{
+       enum dma_data_direction dir = read ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
 
-       /* don't transfer data during abort processing */
        if (pcr->remove_pci)
                return -EINVAL;
 
        if ((sglist == NULL) || (num_sg <= 0))
                return -EINVAL;
 
-       if (read) {
-               dir = DEVICE_TO_HOST;
-               dma_dir = DMA_FROM_DEVICE;
-       } else {
-               dir = HOST_TO_DEVICE;
-               dma_dir = DMA_TO_DEVICE;
-       }
+       return dma_map_sg(&(pcr->pci->dev), sglist, num_sg, dir);
+}
+EXPORT_SYMBOL_GPL(rtsx_pci_dma_map_sg);
 
-       count = dma_map_sg(&(pcr->pci->dev), sglist, num_sg, dma_dir);
-       if (count < 1) {
-               dev_err(&(pcr->pci->dev), "scatterlist map failed\n");
+void rtsx_pci_dma_unmap_sg(struct rtsx_pcr *pcr, struct scatterlist *sglist,
+               int num_sg, bool read)
+{
+       enum dma_data_direction dir = read ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
+
+       dma_unmap_sg(&(pcr->pci->dev), sglist, num_sg, dir);
+}
+EXPORT_SYMBOL_GPL(rtsx_pci_dma_unmap_sg);
+
+int rtsx_pci_dma_transfer(struct rtsx_pcr *pcr, struct scatterlist *sglist,
+               int count, bool read, int timeout)
+{
+       struct completion trans_done;
+       struct scatterlist *sg;
+       dma_addr_t addr;
+       long timeleft;
+       unsigned long flags;
+       unsigned int len;
+       int i, err = 0;
+       u32 val;
+       u8 dir = read ? DEVICE_TO_HOST : HOST_TO_DEVICE;
+
+       if (pcr->remove_pci)
+               return -ENODEV;
+
+       if ((sglist == NULL) || (count < 1))
                return -EINVAL;
-       }
-       dev_dbg(&(pcr->pci->dev), "DMA mapping count: %d\n", count);
 
        val = ((u32)(dir & 0x01) << 29) | TRIG_DMA | ADMA_MODE;
        pcr->sgi = 0;
@@ -400,12 +424,10 @@ int rtsx_pci_transfer_data(struct rtsx_pcr *pcr, struct scatterlist *sglist,
        }
 
        spin_lock_irqsave(&pcr->lock, flags);
-
        if (pcr->trans_result == TRANS_RESULT_FAIL)
                err = -EINVAL;
        else if (pcr->trans_result == TRANS_NO_DEVICE)
                err = -ENODEV;
-
        spin_unlock_irqrestore(&pcr->lock, flags);
 
 out:
@@ -413,8 +435,6 @@ out:
        pcr->done = NULL;
        spin_unlock_irqrestore(&pcr->lock, flags);
 
-       dma_unmap_sg(&(pcr->pci->dev), sglist, num_sg, dma_dir);
-
        if ((err < 0) && (err != -ENODEV))
                rtsx_pci_stop_cmd(pcr);
 
@@ -423,7 +443,7 @@ out:
 
        return err;
 }
-EXPORT_SYMBOL_GPL(rtsx_pci_transfer_data);
+EXPORT_SYMBOL_GPL(rtsx_pci_dma_transfer);
 
 int rtsx_pci_read_ppbuf(struct rtsx_pcr *pcr, u8 *buf, int buf_len)
 {
index be06d0abbf19f8b171c7554a5474afa861fb889e..dba7e2b6f8e9d949c7c3de18299625448ecd86d8 100644 (file)
 #include <linux/mfd/samsung/s2mpa01.h>
 #include <linux/mfd/samsung/s2mps11.h>
 #include <linux/mfd/samsung/s2mps14.h>
+#include <linux/mfd/samsung/s2mpu02.h>
 #include <linux/mfd/samsung/s5m8763.h>
 #include <linux/mfd/samsung/s5m8767.h>
+#include <linux/regulator/machine.h>
 #include <linux/regmap.h>
 
 static const struct mfd_cell s5m8751_devs[] = {
@@ -89,6 +91,15 @@ static const struct mfd_cell s2mpa01_devs[] = {
        },
 };
 
+static const struct mfd_cell s2mpu02_devs[] = {
+       { .name = "s2mpu02-pmic", },
+       { .name = "s2mpu02-rtc", },
+       {
+               .name = "s2mpu02-clk",
+               .of_compatible = "samsung,s2mpu02-clk",
+       }
+};
+
 #ifdef CONFIG_OF
 static const struct of_device_id sec_dt_match[] = {
        {       .compatible = "samsung,s5m8767-pmic",
@@ -102,6 +113,9 @@ static const struct of_device_id sec_dt_match[] = {
        }, {
                .compatible = "samsung,s2mpa01-pmic",
                .data = (void *)S2MPA01,
+       }, {
+               .compatible = "samsung,s2mpu02-pmic",
+               .data = (void *)S2MPU02,
        }, {
                /* Sentinel */
        },
@@ -132,6 +146,18 @@ static bool s2mps11_volatile(struct device *dev, unsigned int reg)
        }
 }
 
+static bool s2mpu02_volatile(struct device *dev, unsigned int reg)
+{
+       switch (reg) {
+       case S2MPU02_REG_INT1M:
+       case S2MPU02_REG_INT2M:
+       case S2MPU02_REG_INT3M:
+               return false;
+       default:
+               return true;
+       }
+}
+
 static bool s5m8763_volatile(struct device *dev, unsigned int reg)
 {
        switch (reg) {
@@ -177,6 +203,15 @@ static const struct regmap_config s2mps14_regmap_config = {
        .cache_type = REGCACHE_FLAT,
 };
 
+static const struct regmap_config s2mpu02_regmap_config = {
+       .reg_bits = 8,
+       .val_bits = 8,
+
+       .max_register = S2MPU02_REG_DVSDATA,
+       .volatile_reg = s2mpu02_volatile,
+       .cache_type = REGCACHE_FLAT,
+};
+
 static const struct regmap_config s5m8763_regmap_config = {
        .reg_bits = 8,
        .val_bits = 8,
@@ -238,6 +273,7 @@ static inline unsigned long sec_i2c_get_driver_data(struct i2c_client *i2c,
 #ifdef CONFIG_OF
        if (i2c->dev.of_node) {
                const struct of_device_id *match;
+
                match = of_match_node(sec_dt_match, i2c->dev.of_node);
                return (unsigned long)match->data;
        }
@@ -250,9 +286,10 @@ static int sec_pmic_probe(struct i2c_client *i2c,
 {
        struct sec_platform_data *pdata = dev_get_platdata(&i2c->dev);
        const struct regmap_config *regmap;
+       const struct mfd_cell *sec_devs;
        struct sec_pmic_dev *sec_pmic;
        unsigned long device_type;
-       int ret;
+       int ret, num_sec_devs;
 
        sec_pmic = devm_kzalloc(&i2c->dev, sizeof(struct sec_pmic_dev),
                                GFP_KERNEL);
@@ -297,6 +334,9 @@ static int sec_pmic_probe(struct i2c_client *i2c,
        case S5M8767X:
                regmap = &s5m8767_regmap_config;
                break;
+       case S2MPU02:
+               regmap = &s2mpu02_regmap_config;
+               break;
        default:
                regmap = &sec_regmap_config;
                break;
@@ -319,34 +359,39 @@ static int sec_pmic_probe(struct i2c_client *i2c,
 
        switch (sec_pmic->device_type) {
        case S5M8751X:
-               ret = mfd_add_devices(sec_pmic->dev, -1, s5m8751_devs,
-                                     ARRAY_SIZE(s5m8751_devs), NULL, 0, NULL);
+               sec_devs = s5m8751_devs;
+               num_sec_devs = ARRAY_SIZE(s5m8751_devs);
                break;
        case S5M8763X:
-               ret = mfd_add_devices(sec_pmic->dev, -1, s5m8763_devs,
-                                     ARRAY_SIZE(s5m8763_devs), NULL, 0, NULL);
+               sec_devs = s5m8763_devs;
+               num_sec_devs = ARRAY_SIZE(s5m8763_devs);
                break;
        case S5M8767X:
-               ret = mfd_add_devices(sec_pmic->dev, -1, s5m8767_devs,
-                                     ARRAY_SIZE(s5m8767_devs), NULL, 0, NULL);
+               sec_devs = s5m8767_devs;
+               num_sec_devs = ARRAY_SIZE(s5m8767_devs);
                break;
        case S2MPA01:
-               ret = mfd_add_devices(sec_pmic->dev, -1, s2mpa01_devs,
-                                     ARRAY_SIZE(s2mpa01_devs), NULL, 0, NULL);
+               sec_devs = s2mpa01_devs;
+               num_sec_devs = ARRAY_SIZE(s2mpa01_devs);
                break;
        case S2MPS11X:
-               ret = mfd_add_devices(sec_pmic->dev, -1, s2mps11_devs,
-                                     ARRAY_SIZE(s2mps11_devs), NULL, 0, NULL);
+               sec_devs = s2mps11_devs;
+               num_sec_devs = ARRAY_SIZE(s2mps11_devs);
                break;
        case S2MPS14X:
-               ret = mfd_add_devices(sec_pmic->dev, -1, s2mps14_devs,
-                                     ARRAY_SIZE(s2mps14_devs), NULL, 0, NULL);
+               sec_devs = s2mps14_devs;
+               num_sec_devs = ARRAY_SIZE(s2mps14_devs);
+               break;
+       case S2MPU02:
+               sec_devs = s2mpu02_devs;
+               num_sec_devs = ARRAY_SIZE(s2mpu02_devs);
                break;
        default:
                /* If this happens the probe function is problem */
                BUG();
        }
-
+       ret = mfd_add_devices(sec_pmic->dev, -1, sec_devs, num_sec_devs, NULL,
+                             0, NULL);
        if (ret)
                goto err_mfd;
 
@@ -387,6 +432,15 @@ static int sec_pmic_suspend(struct device *dev)
         */
        disable_irq(sec_pmic->irq);
 
+       switch (sec_pmic->device_type) {
+       case S2MPS14X:
+       case S2MPU02:
+               regulator_suspend_prepare(PM_SUSPEND_MEM);
+               break;
+       default:
+               break;
+       }
+
        return 0;
 }
 
index 654e2c1dbf7a61cc9884ed78f3006d2bf332f1be..f9a57869e3ece6f842ce7f99fd176d1cfea796b7 100644 (file)
@@ -20,6 +20,7 @@
 #include <linux/mfd/samsung/irq.h>
 #include <linux/mfd/samsung/s2mps11.h>
 #include <linux/mfd/samsung/s2mps14.h>
+#include <linux/mfd/samsung/s2mpu02.h>
 #include <linux/mfd/samsung/s5m8763.h>
 #include <linux/mfd/samsung/s5m8767.h>
 
@@ -161,6 +162,77 @@ static const struct regmap_irq s2mps14_irqs[] = {
        },
 };
 
+static const struct regmap_irq s2mpu02_irqs[] = {
+       [S2MPU02_IRQ_PWRONF] = {
+               .reg_offset = 0,
+               .mask = S2MPS11_IRQ_PWRONF_MASK,
+       },
+       [S2MPU02_IRQ_PWRONR] = {
+               .reg_offset = 0,
+               .mask = S2MPS11_IRQ_PWRONR_MASK,
+       },
+       [S2MPU02_IRQ_JIGONBF] = {
+               .reg_offset = 0,
+               .mask = S2MPS11_IRQ_JIGONBF_MASK,
+       },
+       [S2MPU02_IRQ_JIGONBR] = {
+               .reg_offset = 0,
+               .mask = S2MPS11_IRQ_JIGONBR_MASK,
+       },
+       [S2MPU02_IRQ_ACOKBF] = {
+               .reg_offset = 0,
+               .mask = S2MPS11_IRQ_ACOKBF_MASK,
+       },
+       [S2MPU02_IRQ_ACOKBR] = {
+               .reg_offset = 0,
+               .mask = S2MPS11_IRQ_ACOKBR_MASK,
+       },
+       [S2MPU02_IRQ_PWRON1S] = {
+               .reg_offset = 0,
+               .mask = S2MPS11_IRQ_PWRON1S_MASK,
+       },
+       [S2MPU02_IRQ_MRB] = {
+               .reg_offset = 0,
+               .mask = S2MPS11_IRQ_MRB_MASK,
+       },
+       [S2MPU02_IRQ_RTC60S] = {
+               .reg_offset = 1,
+               .mask = S2MPS11_IRQ_RTC60S_MASK,
+       },
+       [S2MPU02_IRQ_RTCA1] = {
+               .reg_offset = 1,
+               .mask = S2MPS11_IRQ_RTCA1_MASK,
+       },
+       [S2MPU02_IRQ_RTCA0] = {
+               .reg_offset = 1,
+               .mask = S2MPS11_IRQ_RTCA0_MASK,
+       },
+       [S2MPU02_IRQ_SMPL] = {
+               .reg_offset = 1,
+               .mask = S2MPS11_IRQ_SMPL_MASK,
+       },
+       [S2MPU02_IRQ_RTC1S] = {
+               .reg_offset = 1,
+               .mask = S2MPS11_IRQ_RTC1S_MASK,
+       },
+       [S2MPU02_IRQ_WTSR] = {
+               .reg_offset = 1,
+               .mask = S2MPS11_IRQ_WTSR_MASK,
+       },
+       [S2MPU02_IRQ_INT120C] = {
+               .reg_offset = 2,
+               .mask = S2MPS11_IRQ_INT120C_MASK,
+       },
+       [S2MPU02_IRQ_INT140C] = {
+               .reg_offset = 2,
+               .mask = S2MPS11_IRQ_INT140C_MASK,
+       },
+       [S2MPU02_IRQ_TSD] = {
+               .reg_offset = 2,
+               .mask = S2MPS14_IRQ_TSD_MASK,
+       },
+};
+
 static const struct regmap_irq s5m8767_irqs[] = {
        [S5M8767_IRQ_PWRR] = {
                .reg_offset = 0,
@@ -327,6 +399,16 @@ static const struct regmap_irq_chip s2mps14_irq_chip = {
        .ack_base = S2MPS14_REG_INT1,
 };
 
+static const struct regmap_irq_chip s2mpu02_irq_chip = {
+       .name = "s2mpu02",
+       .irqs = s2mpu02_irqs,
+       .num_irqs = ARRAY_SIZE(s2mpu02_irqs),
+       .num_regs = 3,
+       .status_base = S2MPU02_REG_INT1,
+       .mask_base = S2MPU02_REG_INT1M,
+       .ack_base = S2MPU02_REG_INT1,
+};
+
 static const struct regmap_irq_chip s5m8767_irq_chip = {
        .name = "s5m8767",
        .irqs = s5m8767_irqs,
@@ -351,6 +433,7 @@ int sec_irq_init(struct sec_pmic_dev *sec_pmic)
 {
        int ret = 0;
        int type = sec_pmic->device_type;
+       const struct regmap_irq_chip *sec_irq_chip;
 
        if (!sec_pmic->irq) {
                dev_warn(sec_pmic->dev,
@@ -361,28 +444,19 @@ int sec_irq_init(struct sec_pmic_dev *sec_pmic)
 
        switch (type) {
        case S5M8763X:
-               ret = regmap_add_irq_chip(sec_pmic->regmap_pmic, sec_pmic->irq,
-                                 IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
-                                 sec_pmic->irq_base, &s5m8763_irq_chip,
-                                 &sec_pmic->irq_data);
+               sec_irq_chip = &s5m8763_irq_chip;
                break;
        case S5M8767X:
-               ret = regmap_add_irq_chip(sec_pmic->regmap_pmic, sec_pmic->irq,
-                                 IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
-                                 sec_pmic->irq_base, &s5m8767_irq_chip,
-                                 &sec_pmic->irq_data);
+               sec_irq_chip = &s5m8767_irq_chip;
                break;
        case S2MPS11X:
-               ret = regmap_add_irq_chip(sec_pmic->regmap_pmic, sec_pmic->irq,
-                                 IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
-                                 sec_pmic->irq_base, &s2mps11_irq_chip,
-                                 &sec_pmic->irq_data);
+               sec_irq_chip = &s2mps11_irq_chip;
                break;
        case S2MPS14X:
-               ret = regmap_add_irq_chip(sec_pmic->regmap_pmic, sec_pmic->irq,
-                                 IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
-                                 sec_pmic->irq_base, &s2mps14_irq_chip,
-                                 &sec_pmic->irq_data);
+               sec_irq_chip = &s2mps14_irq_chip;
+               break;
+       case S2MPU02:
+               sec_irq_chip = &s2mpu02_irq_chip;
                break;
        default:
                dev_err(sec_pmic->dev, "Unknown device type %lu\n",
@@ -390,6 +464,10 @@ int sec_irq_init(struct sec_pmic_dev *sec_pmic)
                return -EINVAL;
        }
 
+       ret = regmap_add_irq_chip(sec_pmic->regmap_pmic, sec_pmic->irq,
+                         IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
+                         sec_pmic->irq_base, sec_irq_chip,
+                         &sec_pmic->irq_data);
        if (ret != 0) {
                dev_err(sec_pmic->dev, "Failed to register IRQ chip: %d\n", ret);
                return ret;
index 6f1ef63086c9df98c56c00369c7b91b60c5320c5..2086b46652885bb86c653f99c0d5dc85843badce 100644 (file)
@@ -1228,8 +1228,8 @@ static int si476x_core_cmd_fm_rsq_status_a10(struct si476x_core *core,
 }
 
 static int si476x_core_cmd_fm_rsq_status_a20(struct si476x_core *core,
-                                            struct si476x_rsq_status_args *rsqargs,
-                                            struct si476x_rsq_status_report *report)
+                                    struct si476x_rsq_status_args *rsqargs,
+                                    struct si476x_rsq_status_report *report)
 {
        int err;
        u8       resp[CMD_FM_RSQ_STATUS_A10_NRESP];
@@ -1434,10 +1434,10 @@ typedef int (*tune_freq_func_t) (struct si476x_core *core,
                                 struct si476x_tune_freq_args *tuneargs);
 
 static struct {
-       int (*power_up) (struct si476x_core *,
-                        struct si476x_power_up_args *);
-       int (*power_down) (struct si476x_core *,
-                          struct si476x_power_down_args *);
+       int (*power_up)(struct si476x_core *,
+                       struct si476x_power_up_args *);
+       int (*power_down)(struct si476x_core *,
+                         struct si476x_power_down_args *);
 
        tune_freq_func_t fm_tune_freq;
        tune_freq_func_t am_tune_freq;
index a45f9c0a330a8e61e3046a55399adab011ceafd4..5c054031c3f86a80a1aee942f395e56efc8f6b36 100644 (file)
@@ -68,7 +68,7 @@ MODULE_DEVICE_TABLE(of, stmpe_of_match);
 static int
 stmpe_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id)
 {
-       int partnum;
+       enum stmpe_partnum partnum;
        const struct of_device_id *of_id;
 
        i2c_ci.data = (void *)id;
@@ -85,7 +85,7 @@ stmpe_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id)
                dev_info(&i2c->dev, "matching on node name, compatible is preferred\n");
                partnum = id->driver_data;
        } else
-               partnum = (int)of_id->data;
+               partnum = (enum stmpe_partnum)of_id->data;
 
        return stmpe_probe(&i2c_ci, partnum);
 }
index 3b6bfa7184ad7167716bbea2c04f7b4f3375847b..02a17c388e87deff018fc8fc67af89bf4213182a 100644 (file)
@@ -1147,7 +1147,7 @@ static void stmpe_of_probe(struct stmpe_platform_data *pdata,
 }
 
 /* Called from client specific probe routines */
-int stmpe_probe(struct stmpe_client_info *ci, int partnum)
+int stmpe_probe(struct stmpe_client_info *ci, enum stmpe_partnum partnum)
 {
        struct stmpe_platform_data *pdata = dev_get_platdata(ci->dev);
        struct device_node *np = ci->dev->of_node;
index 9e4d21d37a1155378352be5807d2a18a2d7a807f..2d045f26f193eb0e96ecf32ee1cc1f07b39ca99c 100644 (file)
@@ -97,7 +97,7 @@ struct stmpe_client_info {
        void (*init)(struct stmpe *stmpe);
 };
 
-int stmpe_probe(struct stmpe_client_info *ci, int partnum);
+int stmpe_probe(struct stmpe_client_info *ci, enum stmpe_partnum partnum);
 int stmpe_remove(struct stmpe *stmpe);
 
 #define STMPE_ICR_LSB_HIGH     (1 << 2)
index 718fc4d2adc03f86d52932ab311d361fae3bec25..283ab8d197e4dbe54e435d47253dc6934f5ad6ed 100644 (file)
@@ -76,16 +76,46 @@ static const struct mfd_cell sun6i_a31_prcm_subdevs[] = {
        },
 };
 
+static const struct mfd_cell sun8i_a23_prcm_subdevs[] = {
+       {
+               .name = "sun8i-a23-apb0-clk",
+               .of_compatible = "allwinner,sun8i-a23-apb0-clk",
+               .num_resources = ARRAY_SIZE(sun6i_a31_apb0_clk_res),
+               .resources = sun6i_a31_apb0_clk_res,
+       },
+       {
+               .name = "sun6i-a31-apb0-gates-clk",
+               .of_compatible = "allwinner,sun8i-a23-apb0-gates-clk",
+               .num_resources = ARRAY_SIZE(sun6i_a31_apb0_gates_clk_res),
+               .resources = sun6i_a31_apb0_gates_clk_res,
+       },
+       {
+               .name = "sun6i-a31-apb0-clock-reset",
+               .of_compatible = "allwinner,sun6i-a31-clock-reset",
+               .num_resources = ARRAY_SIZE(sun6i_a31_apb0_rstc_res),
+               .resources = sun6i_a31_apb0_rstc_res,
+       },
+};
+
 static const struct prcm_data sun6i_a31_prcm_data = {
        .nsubdevs = ARRAY_SIZE(sun6i_a31_prcm_subdevs),
        .subdevs = sun6i_a31_prcm_subdevs,
 };
 
+static const struct prcm_data sun8i_a23_prcm_data = {
+       .nsubdevs = ARRAY_SIZE(sun8i_a23_prcm_subdevs),
+       .subdevs = sun8i_a23_prcm_subdevs,
+};
+
 static const struct of_device_id sun6i_prcm_dt_ids[] = {
        {
                .compatible = "allwinner,sun6i-a31-prcm",
                .data = &sun6i_a31_prcm_data,
        },
+       {
+               .compatible = "allwinner,sun8i-a23-prcm",
+               .data = &sun8i_a23_prcm_data,
+       },
        { /* sentinel */ },
 };
 
index bd83accc0f6dd4d14dd5cafa73da8d41a1086365..0072e668c208abc22608b245395323f7122f3283 100644 (file)
@@ -236,7 +236,7 @@ static void tc3589x_irq_unmap(struct irq_domain *d, unsigned int virq)
 static struct irq_domain_ops tc3589x_irq_ops = {
        .map    = tc3589x_irq_map,
        .unmap  = tc3589x_irq_unmap,
-       .xlate  = irq_domain_xlate_twocell,
+       .xlate  = irq_domain_xlate_onecell,
 };
 
 static int tc3589x_irq_init(struct tc3589x *tc3589x, struct device_node *np)
index 591a331d8d83b147fbc10fa23351d61a05aeaf9e..e71f88000ae5f65fd39d1fddec86ff58e9fb5047 100644 (file)
@@ -147,11 +147,10 @@ static int tc6387xb_probe(struct platform_device *dev)
        int irq, ret;
 
        iomem = platform_get_resource(dev, IORESOURCE_MEM, 0);
-       if (!iomem) {
+       if (!iomem)
                return -EINVAL;
-       }
 
-       tc6387xb = kzalloc(sizeof *tc6387xb, GFP_KERNEL);
+       tc6387xb = kzalloc(sizeof(*tc6387xb), GFP_KERNEL);
        if (!tc6387xb)
                return -ENOMEM;
 
@@ -189,7 +188,7 @@ static int tc6387xb_probe(struct platform_device *dev)
        if (pdata && pdata->enable)
                pdata->enable(dev);
 
-       printk(KERN_INFO "Toshiba tc6387xb initialised\n");
+       dev_info(&dev->dev, "Toshiba tc6387xb initialised\n");
 
        ret = mfd_add_devices(&dev->dev, dev->id, tc6387xb_cells,
                              ARRAY_SIZE(tc6387xb_cells), iomem, irq, NULL);
index b5dfa6e4e692968f80bc31f85be7757db4c80e69..5de95c265c1ab1d6b735393a9b01b2e8a652a36e 100644 (file)
@@ -141,7 +141,7 @@ static int tps6105x_probe(struct i2c_client *client,
        int ret;
        int i;
 
-       tps6105x = kmalloc(sizeof(*tps6105x), GFP_KERNEL);
+       tps6105x = devm_kmalloc(&client->dev, sizeof(*tps6105x), GFP_KERNEL);
        if (!tps6105x)
                return -ENOMEM;
 
@@ -154,7 +154,7 @@ static int tps6105x_probe(struct i2c_client *client,
        ret = tps6105x_startup(tps6105x);
        if (ret) {
                dev_err(&client->dev, "chip initialization failed\n");
-               goto fail;
+               return ret;
        }
 
        /* Remove warning texts when you implement new cell drivers */
@@ -187,16 +187,8 @@ static int tps6105x_probe(struct i2c_client *client,
                tps6105x_cells[i].pdata_size = sizeof(*tps6105x);
        }
 
-       ret = mfd_add_devices(&client->dev, 0, tps6105x_cells,
-                             ARRAY_SIZE(tps6105x_cells), NULL, 0, NULL);
-       if (ret)
-               goto fail;
-
-       return 0;
-
-fail:
-       kfree(tps6105x);
-       return ret;
+       return mfd_add_devices(&client->dev, 0, tps6105x_cells,
+                              ARRAY_SIZE(tps6105x_cells), NULL, 0, NULL);
 }
 
 static int tps6105x_remove(struct i2c_client *client)
@@ -210,7 +202,6 @@ static int tps6105x_remove(struct i2c_client *client)
                TPS6105X_REG0_MODE_MASK,
                TPS6105X_MODE_SHUTDOWN << TPS6105X_REG0_MODE_SHIFT);
 
-       kfree(tps6105x);
        return 0;
 }
 
index f9e42ea1cb1a852784738773fff3e4f436d4d621..f243e75d28f31198a19ad7442aa4159595088622 100644 (file)
@@ -387,7 +387,7 @@ static const struct of_device_id tps65910_of_match[] = {
 MODULE_DEVICE_TABLE(of, tps65910_of_match);
 
 static struct tps65910_board *tps65910_parse_dt(struct i2c_client *client,
-                                               int *chip_id)
+                                               unsigned long *chip_id)
 {
        struct device_node *np = client->dev.of_node;
        struct tps65910_board *board_info;
@@ -401,7 +401,7 @@ static struct tps65910_board *tps65910_parse_dt(struct i2c_client *client,
                return NULL;
        }
 
-       *chip_id  = (int)match->data;
+       *chip_id  = (unsigned long)match->data;
 
        board_info = devm_kzalloc(&client->dev, sizeof(*board_info),
                        GFP_KERNEL);
@@ -431,7 +431,7 @@ static struct tps65910_board *tps65910_parse_dt(struct i2c_client *client,
 #else
 static inline
 struct tps65910_board *tps65910_parse_dt(struct i2c_client *client,
-                                        int *chip_id)
+                                        unsigned long *chip_id)
 {
        return NULL;
 }
@@ -453,14 +453,14 @@ static void tps65910_power_off(void)
 }
 
 static int tps65910_i2c_probe(struct i2c_client *i2c,
-                                       const struct i2c_device_id *id)
+                             const struct i2c_device_id *id)
 {
        struct tps65910 *tps65910;
        struct tps65910_board *pmic_plat_data;
        struct tps65910_board *of_pmic_plat_data = NULL;
        struct tps65910_platform_data *init_data;
+       unsigned long chip_id = id->driver_data;
        int ret = 0;
-       int chip_id = id->driver_data;
 
        pmic_plat_data = dev_get_platdata(&i2c->dev);
 
index 69a5178bf152a01aca63059778749715f65ed12f..de60ad98bd9f009ebb87dbc7685867f6be8f5852 100644 (file)
@@ -32,10 +32,9 @@ static int tps65912_spi_write(struct tps65912 *tps65912, u8 addr,
        unsigned long spi_data = 1 << 23 | addr << 15 | *data;
        struct spi_transfer xfer;
        struct spi_message msg;
-       u32 tx_buf, rx_buf;
+       u32 tx_buf;
 
        tx_buf = spi_data;
-       rx_buf = 0;
 
        xfer.tx_buf     = &tx_buf;
        xfer.rx_buf     = NULL;
index 596b1f657e21d5d780cb1286bece2e366a4d1813..b1dabba763cf55f5009f62cd63be7663d6fd7271 100644 (file)
@@ -297,7 +297,7 @@ static irqreturn_t handle_twl4030_pih(int irq, void *devid)
        ret = twl_i2c_read_u8(TWL_MODULE_PIH, &pih_isr,
                              REG_PIH_ISR_P1);
        if (ret) {
-               pr_warning("twl4030: I2C error %d reading PIH ISR\n", ret);
+               pr_warn("twl4030: I2C error %d reading PIH ISR\n", ret);
                return IRQ_NONE;
        }
 
@@ -338,7 +338,7 @@ static int twl4030_init_sih_modules(unsigned line)
        irq_line = line;
 
        /* disable all interrupts on our line */
-       memset(buf, 0xff, sizeof buf);
+       memset(buf, 0xff, sizeof(buf));
        sih = sih_modules;
        for (i = 0; i < nr_sih_modules; i++, sih++) {
                /* skip USB -- it's funky */
@@ -646,7 +646,7 @@ int twl4030_sih_setup(struct device *dev, int module, int irq_base)
        if (status < 0)
                return status;
 
-       agent = kzalloc(sizeof *agent, GFP_KERNEL);
+       agent = kzalloc(sizeof(*agent), GFP_KERNEL);
        if (!agent)
                return -ENOMEM;
 
index a6bb17d908b8a4fa14267b7ecaf4bca75b704fdc..2807e1a956632d1c0e7102aa1678707c04aba10d 100644 (file)
@@ -70,7 +70,7 @@ static int twl6030_interrupt_mapping[24] = {
        BATDETECT_INTR_OFFSET,  /* Bit 9        BAT                     */
        SIMDETECT_INTR_OFFSET,  /* Bit 10       SIM                     */
        MMCDETECT_INTR_OFFSET,  /* Bit 11       MMC                     */
-       RSV_INTR_OFFSET,        /* Bit 12       Reserved                */
+       RSV_INTR_OFFSET,        /* Bit 12       Reserved                */
        MADC_INTR_OFFSET,       /* Bit 13       GPADC_RT_EOC            */
        MADC_INTR_OFFSET,       /* Bit 14       GPADC_SW_EOC            */
        GASGAUGE_INTR_OFFSET,   /* Bit 15       CC_AUTOCAL              */
@@ -245,6 +245,7 @@ int twl6030_interrupt_unmask(u8 bit_mask, u8 offset)
 {
        int ret;
        u8 unmask_value;
+
        ret = twl_i2c_read_u8(TWL_MODULE_PIH, &unmask_value,
                        REG_INT_STS_A + offset);
        unmask_value &= (~(bit_mask));
@@ -258,6 +259,7 @@ int twl6030_interrupt_mask(u8 bit_mask, u8 offset)
 {
        int ret;
        u8 mask_value;
+
        ret = twl_i2c_read_u8(TWL_MODULE_PIH, &mask_value,
                        REG_INT_STS_A + offset);
        mask_value |= (bit_mask);
index ae26d84b3a595088e9261fb31be8efae6db6f0d9..f9c06c542a41ca96544885dff8c4b99630edd434 100644 (file)
@@ -700,7 +700,7 @@ static int twl6040_probe(struct i2c_client *client,
        }
 
        ret = regmap_add_irq_chip(twl6040->regmap, twl6040->irq, IRQF_ONESHOT,
-                                 0, &twl6040_irq_chip,&twl6040->irq_data);
+                                 0, &twl6040_irq_chip, &twl6040->irq_data);
        if (ret < 0)
                goto gpio_err;
 
index c8a993bd17ae75fe2d634a93dfc3ea1acebec588..fb4d4bb0f47d5385bb90f22c814ce8f122b8a2bf 100644 (file)
@@ -138,11 +138,11 @@ static const struct regmap_irq wm5102_irqs[ARIZONA_NUM_IRQ] = {
                .reg_offset = 1, .mask = ARIZONA_DSP_IRQ1_EINT1
        },
 
-       [ARIZONA_IRQ_SPK_SHUTDOWN_WARN] = {
-               .reg_offset = 2, .mask = ARIZONA_SPK_SHUTDOWN_WARN_EINT1
+       [ARIZONA_IRQ_SPK_OVERHEAT_WARN] = {
+               .reg_offset = 2, .mask = ARIZONA_SPK_OVERHEAT_WARN_EINT1
        },
-       [ARIZONA_IRQ_SPK_SHUTDOWN] = {
-               .reg_offset = 2, .mask = ARIZONA_SPK_SHUTDOWN_EINT1
+       [ARIZONA_IRQ_SPK_OVERHEAT] = {
+               .reg_offset = 2, .mask = ARIZONA_SPK_OVERHEAT_EINT1
        },
        [ARIZONA_IRQ_HPDET] = {
                .reg_offset = 2, .mask = ARIZONA_HPDET_EINT1
index 41a7f6fb7802778fab41aeab37ff6147d400fb2c..9b98ee559188780057896a59078c4c98cb798b63 100644 (file)
@@ -340,11 +340,11 @@ static const struct regmap_irq wm5110_irqs[ARIZONA_NUM_IRQ] = {
                .reg_offset = 1, .mask = ARIZONA_DSP_IRQ1_EINT1
        },
 
-       [ARIZONA_IRQ_SPK_SHUTDOWN_WARN] = {
-               .reg_offset = 2, .mask = ARIZONA_SPK_SHUTDOWN_WARN_EINT1
+       [ARIZONA_IRQ_SPK_OVERHEAT_WARN] = {
+               .reg_offset = 2, .mask = ARIZONA_SPK_OVERHEAT_WARN_EINT1
        },
-       [ARIZONA_IRQ_SPK_SHUTDOWN] = {
-               .reg_offset = 2, .mask = ARIZONA_SPK_SHUTDOWN_EINT1
+       [ARIZONA_IRQ_SPK_OVERHEAT] = {
+               .reg_offset = 2, .mask = ARIZONA_SPK_OVERHEAT_EINT1
        },
        [ARIZONA_IRQ_HPDET] = {
                .reg_offset = 2, .mask = ARIZONA_HPDET_EINT1
@@ -416,16 +416,28 @@ static const struct regmap_irq wm5110_irqs[ARIZONA_NUM_IRQ] = {
        [ARIZONA_IRQ_ISRC2_CFG_ERR] = {
                .reg_offset = 3, .mask = ARIZONA_ISRC2_CFG_ERR_EINT1
        },
+       [ARIZONA_IRQ_HP3R_DONE] = {
+               .reg_offset = 3, .mask = ARIZONA_HP3R_DONE_EINT1
+       },
+       [ARIZONA_IRQ_HP3L_DONE] = {
+               .reg_offset = 3, .mask = ARIZONA_HP3L_DONE_EINT1
+       },
+       [ARIZONA_IRQ_HP2R_DONE] = {
+               .reg_offset = 3, .mask = ARIZONA_HP2R_DONE_EINT1
+       },
+       [ARIZONA_IRQ_HP2L_DONE] = {
+               .reg_offset = 3, .mask = ARIZONA_HP2L_DONE_EINT1
+       },
+       [ARIZONA_IRQ_HP1R_DONE] = {
+               .reg_offset = 3, .mask = ARIZONA_HP1R_DONE_EINT1
+       },
+       [ARIZONA_IRQ_HP1L_DONE] = {
+               .reg_offset = 3, .mask = ARIZONA_HP1L_DONE_EINT1
+       },
 
        [ARIZONA_IRQ_BOOT_DONE] = {
                .reg_offset = 4, .mask = ARIZONA_BOOT_DONE_EINT1
        },
-       [ARIZONA_IRQ_DCS_DAC_DONE] = {
-               .reg_offset = 4, .mask = ARIZONA_DCS_DAC_DONE_EINT1
-       },
-       [ARIZONA_IRQ_DCS_HP_DONE] = {
-               .reg_offset = 4, .mask = ARIZONA_DCS_HP_DONE_EINT1
-       },
        [ARIZONA_IRQ_FLL2_CLOCK_OK] = {
                .reg_offset = 4, .mask = ARIZONA_FLL2_CLOCK_OK_EINT1
        },
@@ -445,6 +457,209 @@ const struct regmap_irq_chip wm5110_irq = {
 };
 EXPORT_SYMBOL_GPL(wm5110_irq);
 
+static const struct regmap_irq wm5110_revd_irqs[ARIZONA_NUM_IRQ] = {
+       [ARIZONA_IRQ_GP4] = { .reg_offset = 0, .mask = ARIZONA_GP4_EINT1 },
+       [ARIZONA_IRQ_GP3] = { .reg_offset = 0, .mask = ARIZONA_GP3_EINT1 },
+       [ARIZONA_IRQ_GP2] = { .reg_offset = 0, .mask = ARIZONA_GP2_EINT1 },
+       [ARIZONA_IRQ_GP1] = { .reg_offset = 0, .mask = ARIZONA_GP1_EINT1 },
+
+       [ARIZONA_IRQ_DSP4_RAM_RDY] = {
+               .reg_offset = 1, .mask = ARIZONA_DSP4_RAM_RDY_EINT1
+       },
+       [ARIZONA_IRQ_DSP3_RAM_RDY] = {
+               .reg_offset = 1, .mask = ARIZONA_DSP3_RAM_RDY_EINT1
+       },
+       [ARIZONA_IRQ_DSP2_RAM_RDY] = {
+               .reg_offset = 1, .mask = ARIZONA_DSP2_RAM_RDY_EINT1
+       },
+       [ARIZONA_IRQ_DSP1_RAM_RDY] = {
+               .reg_offset = 1, .mask = ARIZONA_DSP1_RAM_RDY_EINT1
+       },
+       [ARIZONA_IRQ_DSP_IRQ8] = {
+               .reg_offset = 1, .mask = ARIZONA_DSP_IRQ8_EINT1
+       },
+       [ARIZONA_IRQ_DSP_IRQ7] = {
+               .reg_offset = 1, .mask = ARIZONA_DSP_IRQ7_EINT1
+       },
+       [ARIZONA_IRQ_DSP_IRQ6] = {
+               .reg_offset = 1, .mask = ARIZONA_DSP_IRQ6_EINT1
+       },
+       [ARIZONA_IRQ_DSP_IRQ5] = {
+               .reg_offset = 1, .mask = ARIZONA_DSP_IRQ5_EINT1
+       },
+       [ARIZONA_IRQ_DSP_IRQ4] = {
+               .reg_offset = 1, .mask = ARIZONA_DSP_IRQ4_EINT1
+       },
+       [ARIZONA_IRQ_DSP_IRQ3] = {
+               .reg_offset = 1, .mask = ARIZONA_DSP_IRQ3_EINT1
+       },
+       [ARIZONA_IRQ_DSP_IRQ2] = {
+               .reg_offset = 1, .mask = ARIZONA_DSP_IRQ2_EINT1
+       },
+       [ARIZONA_IRQ_DSP_IRQ1] = {
+               .reg_offset = 1, .mask = ARIZONA_DSP_IRQ1_EINT1
+       },
+
+       [ARIZONA_IRQ_SPK_OVERHEAT_WARN] = {
+               .reg_offset = 2, .mask = ARIZONA_SPK_OVERHEAT_WARN_EINT1
+       },
+       [ARIZONA_IRQ_SPK_OVERHEAT] = {
+               .reg_offset = 2, .mask = ARIZONA_SPK_OVERHEAT_EINT1
+       },
+       [ARIZONA_IRQ_HPDET] = {
+               .reg_offset = 2, .mask = ARIZONA_HPDET_EINT1
+       },
+       [ARIZONA_IRQ_MICDET] = {
+               .reg_offset = 2, .mask = ARIZONA_MICDET_EINT1
+       },
+       [ARIZONA_IRQ_WSEQ_DONE] = {
+               .reg_offset = 2, .mask = ARIZONA_WSEQ_DONE_EINT1
+       },
+       [ARIZONA_IRQ_DRC2_SIG_DET] = {
+               .reg_offset = 2, .mask = ARIZONA_DRC2_SIG_DET_EINT1
+       },
+       [ARIZONA_IRQ_DRC1_SIG_DET] = {
+               .reg_offset = 2, .mask = ARIZONA_DRC1_SIG_DET_EINT1
+       },
+       [ARIZONA_IRQ_ASRC2_LOCK] = {
+               .reg_offset = 2, .mask = ARIZONA_ASRC2_LOCK_EINT1
+       },
+       [ARIZONA_IRQ_ASRC1_LOCK] = {
+               .reg_offset = 2, .mask = ARIZONA_ASRC1_LOCK_EINT1
+       },
+       [ARIZONA_IRQ_UNDERCLOCKED] = {
+               .reg_offset = 2, .mask = ARIZONA_UNDERCLOCKED_EINT1
+       },
+       [ARIZONA_IRQ_OVERCLOCKED] = {
+               .reg_offset = 2, .mask = ARIZONA_OVERCLOCKED_EINT1
+       },
+       [ARIZONA_IRQ_FLL2_LOCK] = {
+               .reg_offset = 2, .mask = ARIZONA_FLL2_LOCK_EINT1
+       },
+       [ARIZONA_IRQ_FLL1_LOCK] = {
+               .reg_offset = 2, .mask = ARIZONA_FLL1_LOCK_EINT1
+       },
+       [ARIZONA_IRQ_CLKGEN_ERR] = {
+               .reg_offset = 2, .mask = ARIZONA_CLKGEN_ERR_EINT1
+       },
+       [ARIZONA_IRQ_CLKGEN_ERR_ASYNC] = {
+               .reg_offset = 2, .mask = ARIZONA_CLKGEN_ERR_ASYNC_EINT1
+       },
+
+       [ARIZONA_IRQ_CTRLIF_ERR] = {
+               .reg_offset = 3, .mask = ARIZONA_V2_CTRLIF_ERR_EINT1
+       },
+       [ARIZONA_IRQ_MIXER_DROPPED_SAMPLES] = {
+               .reg_offset = 3, .mask = ARIZONA_V2_MIXER_DROPPED_SAMPLE_EINT1
+       },
+       [ARIZONA_IRQ_ASYNC_CLK_ENA_LOW] = {
+               .reg_offset = 3, .mask = ARIZONA_V2_ASYNC_CLK_ENA_LOW_EINT1
+       },
+       [ARIZONA_IRQ_SYSCLK_ENA_LOW] = {
+               .reg_offset = 3, .mask = ARIZONA_V2_SYSCLK_ENA_LOW_EINT1
+       },
+       [ARIZONA_IRQ_ISRC1_CFG_ERR] = {
+               .reg_offset = 3, .mask = ARIZONA_V2_ISRC1_CFG_ERR_EINT1
+       },
+       [ARIZONA_IRQ_ISRC2_CFG_ERR] = {
+               .reg_offset = 3, .mask = ARIZONA_V2_ISRC2_CFG_ERR_EINT1
+       },
+       [ARIZONA_IRQ_ISRC3_CFG_ERR] = {
+               .reg_offset = 3, .mask = ARIZONA_V2_ISRC3_CFG_ERR_EINT1
+       },
+       [ARIZONA_IRQ_HP3R_DONE] = {
+               .reg_offset = 3, .mask = ARIZONA_HP3R_DONE_EINT1
+       },
+       [ARIZONA_IRQ_HP3L_DONE] = {
+               .reg_offset = 3, .mask = ARIZONA_HP3L_DONE_EINT1
+       },
+       [ARIZONA_IRQ_HP2R_DONE] = {
+               .reg_offset = 3, .mask = ARIZONA_HP2R_DONE_EINT1
+       },
+       [ARIZONA_IRQ_HP2L_DONE] = {
+               .reg_offset = 3, .mask = ARIZONA_HP2L_DONE_EINT1
+       },
+       [ARIZONA_IRQ_HP1R_DONE] = {
+               .reg_offset = 3, .mask = ARIZONA_HP1R_DONE_EINT1
+       },
+       [ARIZONA_IRQ_HP1L_DONE] = {
+               .reg_offset = 3, .mask = ARIZONA_HP1L_DONE_EINT1
+       },
+
+       [ARIZONA_IRQ_BOOT_DONE] = {
+               .reg_offset = 4, .mask = ARIZONA_BOOT_DONE_EINT1
+       },
+       [ARIZONA_IRQ_ASRC_CFG_ERR] = {
+               .reg_offset = 4, .mask = ARIZONA_V2_ASRC_CFG_ERR_EINT1
+       },
+       [ARIZONA_IRQ_FLL2_CLOCK_OK] = {
+               .reg_offset = 4, .mask = ARIZONA_FLL2_CLOCK_OK_EINT1
+       },
+       [ARIZONA_IRQ_FLL1_CLOCK_OK] = {
+               .reg_offset = 4, .mask = ARIZONA_FLL1_CLOCK_OK_EINT1
+       },
+
+       [ARIZONA_IRQ_DSP_SHARED_WR_COLL] = {
+               .reg_offset = 5, .mask = ARIZONA_DSP_SHARED_WR_COLL_EINT1
+       },
+       [ARIZONA_IRQ_SPK_SHUTDOWN] = {
+               .reg_offset = 5, .mask = ARIZONA_SPK_SHUTDOWN_EINT1
+       },
+       [ARIZONA_IRQ_SPK1R_SHORT] = {
+               .reg_offset = 5, .mask = ARIZONA_SPK1R_SHORT_EINT1
+       },
+       [ARIZONA_IRQ_SPK1L_SHORT] = {
+               .reg_offset = 5, .mask = ARIZONA_SPK1L_SHORT_EINT1
+       },
+       [ARIZONA_IRQ_HP3R_SC_NEG] = {
+               .reg_offset = 5, .mask = ARIZONA_HP3R_SC_NEG_EINT1
+       },
+       [ARIZONA_IRQ_HP3R_SC_POS] = {
+               .reg_offset = 5, .mask = ARIZONA_HP3R_SC_POS_EINT1
+       },
+       [ARIZONA_IRQ_HP3L_SC_NEG] = {
+               .reg_offset = 5, .mask = ARIZONA_HP3L_SC_NEG_EINT1
+       },
+       [ARIZONA_IRQ_HP3L_SC_POS] = {
+               .reg_offset = 5, .mask = ARIZONA_HP3L_SC_POS_EINT1
+       },
+       [ARIZONA_IRQ_HP2R_SC_NEG] = {
+               .reg_offset = 5, .mask = ARIZONA_HP2R_SC_NEG_EINT1
+       },
+       [ARIZONA_IRQ_HP2R_SC_POS] = {
+               .reg_offset = 5, .mask = ARIZONA_HP2R_SC_POS_EINT1
+       },
+       [ARIZONA_IRQ_HP2L_SC_NEG] = {
+               .reg_offset = 5, .mask = ARIZONA_HP2L_SC_NEG_EINT1
+       },
+       [ARIZONA_IRQ_HP2L_SC_POS] = {
+               .reg_offset = 5, .mask = ARIZONA_HP2L_SC_POS_EINT1
+       },
+       [ARIZONA_IRQ_HP1R_SC_NEG] = {
+               .reg_offset = 5, .mask = ARIZONA_HP1R_SC_NEG_EINT1
+       },
+       [ARIZONA_IRQ_HP1R_SC_POS] = {
+               .reg_offset = 5, .mask = ARIZONA_HP1R_SC_POS_EINT1
+       },
+       [ARIZONA_IRQ_HP1L_SC_NEG] = {
+               .reg_offset = 5, .mask = ARIZONA_HP1L_SC_NEG_EINT1
+       },
+       [ARIZONA_IRQ_HP1L_SC_POS] = {
+               .reg_offset = 5, .mask = ARIZONA_HP1L_SC_POS_EINT1
+       },
+};
+
+const struct regmap_irq_chip wm5110_revd_irq = {
+       .name = "wm5110 IRQ",
+       .status_base = ARIZONA_INTERRUPT_STATUS_1,
+       .mask_base = ARIZONA_INTERRUPT_STATUS_1_MASK,
+       .ack_base = ARIZONA_INTERRUPT_STATUS_1,
+       .num_regs = 6,
+       .irqs = wm5110_revd_irqs,
+       .num_irqs = ARRAY_SIZE(wm5110_revd_irqs),
+};
+EXPORT_SYMBOL_GPL(wm5110_revd_irq);
+
 static const struct reg_default wm5110_reg_default[] = {
        { 0x00000008, 0x0019 },    /* R8     - Ctrl IF SPI CFG 1 */
        { 0x00000009, 0x0001 },    /* R9     - Ctrl IF I2C1 CFG 1 */
@@ -1274,12 +1489,14 @@ static const struct reg_default wm5110_reg_default[] = {
        { 0x00000D0A, 0xFFFF },    /* R3338  - Interrupt Status 3 Mask */
        { 0x00000D0B, 0xFFFF },    /* R3339  - Interrupt Status 4 Mask */
        { 0x00000D0C, 0xFEFF },    /* R3340  - Interrupt Status 5 Mask */
+       { 0x00000D0D, 0xFFFF },    /* R3341  - Interrupt Status 6 Mask */
        { 0x00000D0F, 0x0000 },    /* R3343  - Interrupt Control */
        { 0x00000D18, 0xFFFF },    /* R3352  - IRQ2 Status 1 Mask */
        { 0x00000D19, 0xFFFF },    /* R3353  - IRQ2 Status 2 Mask */
        { 0x00000D1A, 0xFFFF },    /* R3354  - IRQ2 Status 3 Mask */
        { 0x00000D1B, 0xFFFF },    /* R3355  - IRQ2 Status 4 Mask */
        { 0x00000D1C, 0xFFFF },    /* R3356  - IRQ2 Status 5 Mask */
+       { 0x00000D1D, 0xFFFF },    /* R3357  - IRQ2 Status 6 Mask */
        { 0x00000D1F, 0x0000 },    /* R3359  - IRQ2 Control */
        { 0x00000D53, 0xFFFF },    /* R3411  - AOD IRQ Mask IRQ1 */
        { 0x00000D54, 0xFFFF },    /* R3412  - AOD IRQ Mask IRQ2 */
@@ -2311,22 +2528,26 @@ static bool wm5110_readable_register(struct device *dev, unsigned int reg)
        case ARIZONA_INTERRUPT_STATUS_3:
        case ARIZONA_INTERRUPT_STATUS_4:
        case ARIZONA_INTERRUPT_STATUS_5:
+       case ARIZONA_INTERRUPT_STATUS_6:
        case ARIZONA_INTERRUPT_STATUS_1_MASK:
        case ARIZONA_INTERRUPT_STATUS_2_MASK:
        case ARIZONA_INTERRUPT_STATUS_3_MASK:
        case ARIZONA_INTERRUPT_STATUS_4_MASK:
        case ARIZONA_INTERRUPT_STATUS_5_MASK:
+       case ARIZONA_INTERRUPT_STATUS_6_MASK:
        case ARIZONA_INTERRUPT_CONTROL:
        case ARIZONA_IRQ2_STATUS_1:
        case ARIZONA_IRQ2_STATUS_2:
        case ARIZONA_IRQ2_STATUS_3:
        case ARIZONA_IRQ2_STATUS_4:
        case ARIZONA_IRQ2_STATUS_5:
+       case ARIZONA_IRQ2_STATUS_6:
        case ARIZONA_IRQ2_STATUS_1_MASK:
        case ARIZONA_IRQ2_STATUS_2_MASK:
        case ARIZONA_IRQ2_STATUS_3_MASK:
        case ARIZONA_IRQ2_STATUS_4_MASK:
        case ARIZONA_IRQ2_STATUS_5_MASK:
+       case ARIZONA_IRQ2_STATUS_6_MASK:
        case ARIZONA_IRQ2_CONTROL:
        case ARIZONA_INTERRUPT_RAW_STATUS_2:
        case ARIZONA_INTERRUPT_RAW_STATUS_3:
@@ -2335,6 +2556,7 @@ static bool wm5110_readable_register(struct device *dev, unsigned int reg)
        case ARIZONA_INTERRUPT_RAW_STATUS_6:
        case ARIZONA_INTERRUPT_RAW_STATUS_7:
        case ARIZONA_INTERRUPT_RAW_STATUS_8:
+       case ARIZONA_INTERRUPT_RAW_STATUS_9:
        case ARIZONA_IRQ_PIN_STATUS:
        case ARIZONA_AOD_WKUP_AND_TRIG:
        case ARIZONA_AOD_IRQ1:
@@ -2610,11 +2832,13 @@ static bool wm5110_volatile_register(struct device *dev, unsigned int reg)
        case ARIZONA_INTERRUPT_STATUS_3:
        case ARIZONA_INTERRUPT_STATUS_4:
        case ARIZONA_INTERRUPT_STATUS_5:
+       case ARIZONA_INTERRUPT_STATUS_6:
        case ARIZONA_IRQ2_STATUS_1:
        case ARIZONA_IRQ2_STATUS_2:
        case ARIZONA_IRQ2_STATUS_3:
        case ARIZONA_IRQ2_STATUS_4:
        case ARIZONA_IRQ2_STATUS_5:
+       case ARIZONA_IRQ2_STATUS_6:
        case ARIZONA_INTERRUPT_RAW_STATUS_2:
        case ARIZONA_INTERRUPT_RAW_STATUS_3:
        case ARIZONA_INTERRUPT_RAW_STATUS_4:
@@ -2622,6 +2846,7 @@ static bool wm5110_volatile_register(struct device *dev, unsigned int reg)
        case ARIZONA_INTERRUPT_RAW_STATUS_6:
        case ARIZONA_INTERRUPT_RAW_STATUS_7:
        case ARIZONA_INTERRUPT_RAW_STATUS_8:
+       case ARIZONA_INTERRUPT_RAW_STATUS_9:
        case ARIZONA_IRQ_PIN_STATUS:
        case ARIZONA_AOD_WKUP_AND_TRIG:
        case ARIZONA_AOD_IRQ1:
index f919def05e24778e53678385075b6fef440e1cf7..6a16a8a6f9fae8a3defb81fcd2792d0b05506878 100644 (file)
@@ -58,10 +58,10 @@ static int wm8350_i2c_remove(struct i2c_client *i2c)
 }
 
 static const struct i2c_device_id wm8350_i2c_id[] = {
-       { "wm8350", 0 },
-       { "wm8351", 0 },
-       { "wm8352", 0 },
-       { }
+       { "wm8350", 0 },
+       { "wm8351", 0 },
+       { "wm8352", 0 },
+       { }
 };
 MODULE_DEVICE_TABLE(i2c, wm8350_i2c_id);
 
index cd01f7962dfdf996e8a4a695ffbd37db64a69da6..813ff50f95b699a3ee7784f3f12374f24efbca6c 100644 (file)
@@ -497,7 +497,8 @@ int wm8350_irq_init(struct wm8350 *wm8350, int irq,
        if (pdata && pdata->irq_base > 0)
                irq_base = pdata->irq_base;
 
-       wm8350->irq_base = irq_alloc_descs(irq_base, 0, ARRAY_SIZE(wm8350_irqs), 0);
+       wm8350->irq_base =
+               irq_alloc_descs(irq_base, 0, ARRAY_SIZE(wm8350_irqs), 0);
        if (wm8350->irq_base < 0) {
                dev_warn(wm8350->dev, "Allocating irqs failed with %d\n",
                        wm8350->irq_base);
index 2fbce9c5950b5fb9657c3589f77e3b5fe5cf5726..770a25696468a5b80ffa11fe8a4a689df295e13d 100644 (file)
@@ -123,14 +123,23 @@ static struct reg_default wm1811_defaults[] = {
        { 0x0402, 0x00C0 },    /* R1026 - AIF1 DAC1 Left Volume */
        { 0x0403, 0x00C0 },    /* R1027 - AIF1 DAC1 Right Volume */
        { 0x0410, 0x0000 },    /* R1040 - AIF1 ADC1 Filters */
+       { 0x0411, 0x0000 },    /* R1041 - AIF1 ADC2 Filters */
        { 0x0420, 0x0200 },    /* R1056 - AIF1 DAC1 Filters (1) */
        { 0x0421, 0x0010 },    /* R1057 - AIF1 DAC1 Filters (2) */
+       { 0x0422, 0x0200 },    /* R1058 - AIF1 DAC2 Filters (1) */
+       { 0x0423, 0x0010 },    /* R1059 - AIF1 DAC2 Filters (2) */
        { 0x0430, 0x0068 },    /* R1072 - AIF1 DAC1 Noise Gate */
+       { 0x0431, 0x0068 },    /* R1073 - AIF1 DAC2 Noise Gate */
        { 0x0440, 0x0098 },    /* R1088 - AIF1 DRC1 (1) */
        { 0x0441, 0x0845 },    /* R1089 - AIF1 DRC1 (2) */
        { 0x0442, 0x0000 },    /* R1090 - AIF1 DRC1 (3) */
        { 0x0443, 0x0000 },    /* R1091 - AIF1 DRC1 (4) */
        { 0x0444, 0x0000 },    /* R1092 - AIF1 DRC1 (5) */
+       { 0x0450, 0x0098 },    /* R1104 - AIF1 DRC2 (1) */
+       { 0x0451, 0x0845 },    /* R1105 - AIF1 DRC2 (2) */
+       { 0x0452, 0x0000 },    /* R1106 - AIF1 DRC2 (3) */
+       { 0x0453, 0x0000 },    /* R1107 - AIF1 DRC2 (4) */
+       { 0x0454, 0x0000 },    /* R1108 - AIF1 DRC2 (5) */
        { 0x0480, 0x6318 },    /* R1152 - AIF1 DAC1 EQ Gains (1) */
        { 0x0481, 0x6300 },    /* R1153 - AIF1 DAC1 EQ Gains (2) */
        { 0x0482, 0x0FCA },    /* R1154 - AIF1 DAC1 EQ Band 1 A */
@@ -152,6 +161,27 @@ static struct reg_default wm1811_defaults[] = {
        { 0x0492, 0x0559 },    /* R1170 - AIF1 DAC1 EQ Band 5 B */
        { 0x0493, 0x4000 },    /* R1171 - AIF1 DAC1 EQ Band 5 PG */
        { 0x0494, 0x0000 },    /* R1172 - AIF1 DAC1 EQ Band 1 C */
+       { 0x04A0, 0x6318 },    /* R1184 - AIF1 DAC2 EQ Gains (1) */
+       { 0x04A1, 0x6300 },    /* R1185 - AIF1 DAC2 EQ Gains (2) */
+       { 0x04A2, 0x0FCA },    /* R1186 - AIF1 DAC2 EQ Band 1 A */
+       { 0x04A3, 0x0400 },    /* R1187 - AIF1 DAC2 EQ Band 1 B */
+       { 0x04A4, 0x00D8 },    /* R1188 - AIF1 DAC2 EQ Band 1 PG */
+       { 0x04A5, 0x1EB5 },    /* R1189 - AIF1 DAC2 EQ Band 2 A */
+       { 0x04A6, 0xF145 },    /* R1190 - AIF1 DAC2 EQ Band 2 B */
+       { 0x04A7, 0x0B75 },    /* R1191 - AIF1 DAC2 EQ Band 2 C */
+       { 0x04A8, 0x01C5 },    /* R1192 - AIF1 DAC2 EQ Band 2 PG */
+       { 0x04A9, 0x1C58 },    /* R1193 - AIF1 DAC2 EQ Band 3 A */
+       { 0x04AA, 0xF373 },    /* R1194 - AIF1 DAC2 EQ Band 3 B */
+       { 0x04AB, 0x0A54 },    /* R1195 - AIF1 DAC2 EQ Band 3 C */
+       { 0x04AC, 0x0558 },    /* R1196 - AIF1 DAC2 EQ Band 3 PG */
+       { 0x04AD, 0x168E },    /* R1197 - AIF1 DAC2 EQ Band 4 A */
+       { 0x04AE, 0xF829 },    /* R1198 - AIF1 DAC2 EQ Band 4 B */
+       { 0x04AF, 0x07AD },    /* R1199 - AIF1 DAC2 EQ Band 4 C */
+       { 0x04B0, 0x1103 },    /* R1200 - AIF1 DAC2 EQ Band 4 PG */
+       { 0x04B1, 0x0564 },    /* R1201 - AIF1 DAC2 EQ Band 5 A */
+       { 0x04B2, 0x0559 },    /* R1202 - AIF1 DAC2 EQ Band 5 B */
+       { 0x04B3, 0x4000 },    /* R1203 - AIF1 DAC2 EQ Band 5 PG */
+       { 0x04B4, 0x0000 },    /* R1204 - AIF1 DAC2 EQ Band 1 C */
        { 0x0500, 0x00C0 },    /* R1280 - AIF2 ADC Left Volume */
        { 0x0501, 0x00C0 },    /* R1281 - AIF2 ADC Right Volume */
        { 0x0502, 0x00C0 },    /* R1282 - AIF2 DAC Left Volume */
@@ -194,6 +224,8 @@ static struct reg_default wm1811_defaults[] = {
        { 0x0605, 0x0000 },    /* R1541 - AIF2ADC Right Mixer Routing */
        { 0x0606, 0x0000 },    /* R1542 - AIF1 ADC1 Left Mixer Routing */
        { 0x0607, 0x0000 },    /* R1543 - AIF1 ADC1 Right Mixer Routing */
+       { 0x0608, 0x0000 },    /* R1544 - AIF1 ADC2 Left Mixer Routing */
+       { 0x0609, 0x0000 },    /* R1545 - AIF1 ADC2 Right Mixer Routing */
        { 0x0610, 0x02C0 },    /* R1552 - DAC1 Left Volume */
        { 0x0611, 0x02C0 },    /* R1553 - DAC1 Right Volume */
        { 0x0612, 0x02C0 },    /* R1554 - AIF2TX Left Volume */
@@ -846,14 +878,23 @@ static bool wm1811_readable_register(struct device *dev, unsigned int reg)
        case WM8994_AIF1_DAC1_LEFT_VOLUME:
        case WM8994_AIF1_DAC1_RIGHT_VOLUME:
        case WM8994_AIF1_ADC1_FILTERS:
+       case WM8994_AIF1_ADC2_FILTERS:
        case WM8994_AIF1_DAC1_FILTERS_1:
        case WM8994_AIF1_DAC1_FILTERS_2:
+       case WM8994_AIF1_DAC2_FILTERS_1:
+       case WM8994_AIF1_DAC2_FILTERS_2:
        case WM8958_AIF1_DAC1_NOISE_GATE:
+       case WM8958_AIF1_DAC2_NOISE_GATE:
        case WM8994_AIF1_DRC1_1:
        case WM8994_AIF1_DRC1_2:
        case WM8994_AIF1_DRC1_3:
        case WM8994_AIF1_DRC1_4:
        case WM8994_AIF1_DRC1_5:
+       case WM8994_AIF1_DRC2_1:
+       case WM8994_AIF1_DRC2_2:
+       case WM8994_AIF1_DRC2_3:
+       case WM8994_AIF1_DRC2_4:
+       case WM8994_AIF1_DRC2_5:
        case WM8994_AIF1_DAC1_EQ_GAINS_1:
        case WM8994_AIF1_DAC1_EQ_GAINS_2:
        case WM8994_AIF1_DAC1_EQ_BAND_1_A:
@@ -875,6 +916,27 @@ static bool wm1811_readable_register(struct device *dev, unsigned int reg)
        case WM8994_AIF1_DAC1_EQ_BAND_5_B:
        case WM8994_AIF1_DAC1_EQ_BAND_5_PG:
        case WM8994_AIF1_DAC1_EQ_BAND_1_C:
+       case WM8994_AIF1_DAC2_EQ_GAINS_1:
+       case WM8994_AIF1_DAC2_EQ_GAINS_2:
+       case WM8994_AIF1_DAC2_EQ_BAND_1_A:
+       case WM8994_AIF1_DAC2_EQ_BAND_1_B:
+       case WM8994_AIF1_DAC2_EQ_BAND_1_PG:
+       case WM8994_AIF1_DAC2_EQ_BAND_2_A:
+       case WM8994_AIF1_DAC2_EQ_BAND_2_B:
+       case WM8994_AIF1_DAC2_EQ_BAND_2_C:
+       case WM8994_AIF1_DAC2_EQ_BAND_2_PG:
+       case WM8994_AIF1_DAC2_EQ_BAND_3_A:
+       case WM8994_AIF1_DAC2_EQ_BAND_3_B:
+       case WM8994_AIF1_DAC2_EQ_BAND_3_C:
+       case WM8994_AIF1_DAC2_EQ_BAND_3_PG:
+       case WM8994_AIF1_DAC2_EQ_BAND_4_A:
+       case WM8994_AIF1_DAC2_EQ_BAND_4_B:
+       case WM8994_AIF1_DAC2_EQ_BAND_4_C:
+       case WM8994_AIF1_DAC2_EQ_BAND_4_PG:
+       case WM8994_AIF1_DAC2_EQ_BAND_5_A:
+       case WM8994_AIF1_DAC2_EQ_BAND_5_B:
+       case WM8994_AIF1_DAC2_EQ_BAND_5_PG:
+       case WM8994_AIF1_DAC2_EQ_BAND_1_C:
        case WM8994_AIF2_ADC_LEFT_VOLUME:
        case WM8994_AIF2_ADC_RIGHT_VOLUME:
        case WM8994_AIF2_DAC_LEFT_VOLUME:
@@ -917,6 +979,8 @@ static bool wm1811_readable_register(struct device *dev, unsigned int reg)
        case WM8994_DAC2_RIGHT_MIXER_ROUTING:
        case WM8994_AIF1_ADC1_LEFT_MIXER_ROUTING:
        case WM8994_AIF1_ADC1_RIGHT_MIXER_ROUTING:
+       case WM8994_AIF1_ADC2_LEFT_MIXER_ROUTING:
+       case WM8994_AIF1_ADC2_RIGHT_MIXER_ROUTING:
        case WM8994_DAC1_LEFT_VOLUME:
        case WM8994_DAC1_RIGHT_VOLUME:
        case WM8994_DAC2_LEFT_VOLUME:
index c7a81da64ee1d57f441d40f7fa84a52dceb154e9..510da3b5232417bb4f216b2ef6555b99cdc564f0 100644 (file)
@@ -65,11 +65,11 @@ static const struct regmap_irq wm8997_irqs[ARIZONA_NUM_IRQ] = {
        [ARIZONA_IRQ_GP2] = { .reg_offset = 0, .mask = ARIZONA_GP2_EINT1 },
        [ARIZONA_IRQ_GP1] = { .reg_offset = 0, .mask = ARIZONA_GP1_EINT1 },
 
-       [ARIZONA_IRQ_SPK_SHUTDOWN_WARN] = {
-               .reg_offset = 2, .mask = ARIZONA_SPK_SHUTDOWN_WARN_EINT1
+       [ARIZONA_IRQ_SPK_OVERHEAT_WARN] = {
+               .reg_offset = 2, .mask = ARIZONA_SPK_OVERHEAT_WARN_EINT1
        },
-       [ARIZONA_IRQ_SPK_SHUTDOWN] = {
-               .reg_offset = 2, .mask = ARIZONA_SPK_SHUTDOWN_EINT1
+       [ARIZONA_IRQ_SPK_OVERHEAT] = {
+               .reg_offset = 2, .mask = ARIZONA_SPK_OVERHEAT_EINT1
        },
        [ARIZONA_IRQ_HPDET] = {
                .reg_offset = 2, .mask = ARIZONA_HPDET_EINT1
@@ -174,10 +174,10 @@ static const struct reg_default wm8997_reg_default[] = {
        { 0x00000062, 0x01FF },    /* R98    - Sample Rate Sequence Select 2 */
        { 0x00000063, 0x01FF },    /* R99    - Sample Rate Sequence Select 3 */
        { 0x00000064, 0x01FF },    /* R100   - Sample Rate Sequence Select 4 */
-       { 0x00000068, 0x01FF },    /* R104   - Always On Triggers Sequence Select 3 */
-       { 0x00000069, 0x01FF },    /* R105   - Always On Triggers Sequence Select 4 */
-       { 0x0000006A, 0x01FF },    /* R106   - Always On Triggers Sequence Select 5 */
-       { 0x0000006B, 0x01FF },    /* R107   - Always On Triggers Sequence Select 6 */
+       { 0x00000068, 0x01FF },    /* R104   - AlwaysOn Triggers Seq Select 3 */
+       { 0x00000069, 0x01FF },    /* R105   - AlwaysOn Triggers Seq Select 4 */
+       { 0x0000006A, 0x01FF },    /* R106   - AlwaysOn Triggers Seq Select 5 */
+       { 0x0000006B, 0x01FF },    /* R107   - AlwaysOn Triggers Seq Select 6 */
        { 0x00000070, 0x0000 },    /* R112   - Comfort Noise Generator */
        { 0x00000090, 0x0000 },    /* R144   - Haptics Control 1 */
        { 0x00000091, 0x7FFF },    /* R145   - Haptics Control 2 */
index ee9402324a23a13cff9b0e22b74171eaab4e9017..b841180c7c742f57f63f1345453720b4bb9725a3 100644 (file)
@@ -51,16 +51,6 @@ config AD525X_DPOT_SPI
          To compile this driver as a module, choose M here: the
          module will be called ad525x_dpot-spi.
 
-config ATMEL_PWM
-       tristate "Atmel AT32/AT91 PWM support"
-       depends on HAVE_CLK
-       depends on AVR32 || ARCH_AT91SAM9263 || ARCH_AT91SAM9RL || ARCH_AT91SAM9G45
-       help
-         This option enables device driver support for the PWM channels
-         on certain Atmel processors.  Pulse Width Modulation is used for
-         purposes including software controlled power-efficient backlights
-         on LCD displays, motor control, and waveform generation.
-
 config ATMEL_TCLIB
        bool "Atmel AT32/AT91 Timer/Counter Library"
        depends on (AVR32 || ARCH_AT91)
index d59ce1261b38435a1bd3a3de3f9ead8f5a568ef7..5497d026e651f47ffdaaf8bcac9a67cd30c4b2a9 100644 (file)
@@ -7,7 +7,6 @@ obj-$(CONFIG_AD525X_DPOT)       += ad525x_dpot.o
 obj-$(CONFIG_AD525X_DPOT_I2C)  += ad525x_dpot-i2c.o
 obj-$(CONFIG_AD525X_DPOT_SPI)  += ad525x_dpot-spi.o
 obj-$(CONFIG_INTEL_MID_PTI)    += pti.o
-obj-$(CONFIG_ATMEL_PWM)                += atmel_pwm.o
 obj-$(CONFIG_ATMEL_SSC)                += atmel-ssc.o
 obj-$(CONFIG_ATMEL_TCLIB)      += atmel_tclib.o
 obj-$(CONFIG_BMP085)           += bmp085.o
diff --git a/drivers/misc/atmel_pwm.c b/drivers/misc/atmel_pwm.c
deleted file mode 100644 (file)
index a6dc56e..0000000
+++ /dev/null
@@ -1,402 +0,0 @@
-#include <linux/module.h>
-#include <linux/clk.h>
-#include <linux/err.h>
-#include <linux/slab.h>
-#include <linux/io.h>
-#include <linux/interrupt.h>
-#include <linux/platform_device.h>
-#include <linux/atmel_pwm.h>
-
-
-/*
- * This is a simple driver for the PWM controller found in various newer
- * Atmel SOCs, including the AVR32 series and the AT91sam9263.
- *
- * Chips with current Linux ports have only 4 PWM channels, out of max 32.
- * AT32UC3A and AT32UC3B chips have 7 channels (but currently no Linux).
- * Docs are inconsistent about the width of the channel counter registers;
- * it's at least 16 bits, but several places say 20 bits.
- */
-#define        PWM_NCHAN       4               /* max 32 */
-
-struct pwm {
-       spinlock_t              lock;
-       struct platform_device  *pdev;
-       u32                     mask;
-       int                     irq;
-       void __iomem            *base;
-       struct clk              *clk;
-       struct pwm_channel      *channel[PWM_NCHAN];
-       void                    (*handler[PWM_NCHAN])(struct pwm_channel *);
-};
-
-
-/* global PWM controller registers */
-#define PWM_MR         0x00
-#define PWM_ENA                0x04
-#define PWM_DIS                0x08
-#define PWM_SR         0x0c
-#define PWM_IER                0x10
-#define PWM_IDR                0x14
-#define PWM_IMR                0x18
-#define PWM_ISR                0x1c
-
-static inline void pwm_writel(const struct pwm *p, unsigned offset, u32 val)
-{
-       __raw_writel(val, p->base + offset);
-}
-
-static inline u32 pwm_readl(const struct pwm *p, unsigned offset)
-{
-       return __raw_readl(p->base + offset);
-}
-
-static inline void __iomem *pwmc_regs(const struct pwm *p, int index)
-{
-       return p->base + 0x200 + index * 0x20;
-}
-
-static struct pwm *pwm;
-
-static void pwm_dumpregs(struct pwm_channel *ch, char *tag)
-{
-       struct device   *dev = &pwm->pdev->dev;
-
-       dev_dbg(dev, "%s: mr %08x, sr %08x, imr %08x\n",
-               tag,
-               pwm_readl(pwm, PWM_MR),
-               pwm_readl(pwm, PWM_SR),
-               pwm_readl(pwm, PWM_IMR));
-       dev_dbg(dev,
-               "pwm ch%d - mr %08x, dty %u, prd %u, cnt %u\n",
-               ch->index,
-               pwm_channel_readl(ch, PWM_CMR),
-               pwm_channel_readl(ch, PWM_CDTY),
-               pwm_channel_readl(ch, PWM_CPRD),
-               pwm_channel_readl(ch, PWM_CCNT));
-}
-
-
-/**
- * pwm_channel_alloc - allocate an unused PWM channel
- * @index: identifies the channel
- * @ch: structure to be initialized
- *
- * Drivers allocate PWM channels according to the board's wiring, and
- * matching board-specific setup code.  Returns zero or negative errno.
- */
-int pwm_channel_alloc(int index, struct pwm_channel *ch)
-{
-       unsigned long   flags;
-       int             status = 0;
-
-       if (!pwm)
-               return -EPROBE_DEFER;
-
-       if (!(pwm->mask & 1 << index))
-               return -ENODEV;
-
-       if (index < 0 || index >= PWM_NCHAN || !ch)
-               return -EINVAL;
-       memset(ch, 0, sizeof *ch);
-
-       spin_lock_irqsave(&pwm->lock, flags);
-       if (pwm->channel[index])
-               status = -EBUSY;
-       else {
-               clk_enable(pwm->clk);
-
-               ch->regs = pwmc_regs(pwm, index);
-               ch->index = index;
-
-               /* REVISIT: ap7000 seems to go 2x as fast as we expect!! */
-               ch->mck = clk_get_rate(pwm->clk);
-
-               pwm->channel[index] = ch;
-               pwm->handler[index] = NULL;
-
-               /* channel and irq are always disabled when we return */
-               pwm_writel(pwm, PWM_DIS, 1 << index);
-               pwm_writel(pwm, PWM_IDR, 1 << index);
-       }
-       spin_unlock_irqrestore(&pwm->lock, flags);
-       return status;
-}
-EXPORT_SYMBOL(pwm_channel_alloc);
-
-static int pwmcheck(struct pwm_channel *ch)
-{
-       int             index;
-
-       if (!pwm)
-               return -ENODEV;
-       if (!ch)
-               return -EINVAL;
-       index = ch->index;
-       if (index < 0 || index >= PWM_NCHAN || pwm->channel[index] != ch)
-               return -EINVAL;
-
-       return index;
-}
-
-/**
- * pwm_channel_free - release a previously allocated channel
- * @ch: the channel being released
- *
- * The channel is completely shut down (counter and IRQ disabled),
- * and made available for re-use.  Returns zero, or negative errno.
- */
-int pwm_channel_free(struct pwm_channel *ch)
-{
-       unsigned long   flags;
-       int             t;
-
-       spin_lock_irqsave(&pwm->lock, flags);
-       t = pwmcheck(ch);
-       if (t >= 0) {
-               pwm->channel[t] = NULL;
-               pwm->handler[t] = NULL;
-
-               /* channel and irq are always disabled when we return */
-               pwm_writel(pwm, PWM_DIS, 1 << t);
-               pwm_writel(pwm, PWM_IDR, 1 << t);
-
-               clk_disable(pwm->clk);
-               t = 0;
-       }
-       spin_unlock_irqrestore(&pwm->lock, flags);
-       return t;
-}
-EXPORT_SYMBOL(pwm_channel_free);
-
-int __pwm_channel_onoff(struct pwm_channel *ch, int enabled)
-{
-       unsigned long   flags;
-       int             t;
-
-       /* OMITTED FUNCTIONALITY:  starting several channels in synch */
-
-       spin_lock_irqsave(&pwm->lock, flags);
-       t = pwmcheck(ch);
-       if (t >= 0) {
-               pwm_writel(pwm, enabled ? PWM_ENA : PWM_DIS, 1 << t);
-               t = 0;
-               pwm_dumpregs(ch, enabled ? "enable" : "disable");
-       }
-       spin_unlock_irqrestore(&pwm->lock, flags);
-
-       return t;
-}
-EXPORT_SYMBOL(__pwm_channel_onoff);
-
-/**
- * pwm_clk_alloc - allocate and configure CLKA or CLKB
- * @prescale: from 0..10, the power of two used to divide MCK
- * @div: from 1..255, the linear divisor to use
- *
- * Returns PWM_CPR_CLKA, PWM_CPR_CLKB, or negative errno.  The allocated
- * clock will run with a period of (2^prescale * div) / MCK, or twice as
- * long if center aligned PWM output is used.  The clock must later be
- * deconfigured using pwm_clk_free().
- */
-int pwm_clk_alloc(unsigned prescale, unsigned div)
-{
-       unsigned long   flags;
-       u32             mr;
-       u32             val = (prescale << 8) | div;
-       int             ret = -EBUSY;
-
-       if (prescale >= 10 || div == 0 || div > 255)
-               return -EINVAL;
-
-       spin_lock_irqsave(&pwm->lock, flags);
-       mr = pwm_readl(pwm, PWM_MR);
-       if ((mr & 0xffff) == 0) {
-               mr |= val;
-               ret = PWM_CPR_CLKA;
-       } else if ((mr & (0xffff << 16)) == 0) {
-               mr |= val << 16;
-               ret = PWM_CPR_CLKB;
-       }
-       if (ret > 0)
-               pwm_writel(pwm, PWM_MR, mr);
-       spin_unlock_irqrestore(&pwm->lock, flags);
-       return ret;
-}
-EXPORT_SYMBOL(pwm_clk_alloc);
-
-/**
- * pwm_clk_free - deconfigure and release CLKA or CLKB
- *
- * Reverses the effect of pwm_clk_alloc().
- */
-void pwm_clk_free(unsigned clk)
-{
-       unsigned long   flags;
-       u32             mr;
-
-       spin_lock_irqsave(&pwm->lock, flags);
-       mr = pwm_readl(pwm, PWM_MR);
-       if (clk == PWM_CPR_CLKA)
-               pwm_writel(pwm, PWM_MR, mr & ~(0xffff << 0));
-       if (clk == PWM_CPR_CLKB)
-               pwm_writel(pwm, PWM_MR, mr & ~(0xffff << 16));
-       spin_unlock_irqrestore(&pwm->lock, flags);
-}
-EXPORT_SYMBOL(pwm_clk_free);
-
-/**
- * pwm_channel_handler - manage channel's IRQ handler
- * @ch: the channel
- * @handler: the handler to use, possibly NULL
- *
- * If the handler is non-null, the handler will be called after every
- * period of this PWM channel.  If the handler is null, this channel
- * won't generate an IRQ.
- */
-int pwm_channel_handler(struct pwm_channel *ch,
-               void (*handler)(struct pwm_channel *ch))
-{
-       unsigned long   flags;
-       int             t;
-
-       spin_lock_irqsave(&pwm->lock, flags);
-       t = pwmcheck(ch);
-       if (t >= 0) {
-               pwm->handler[t] = handler;
-               pwm_writel(pwm, handler ? PWM_IER : PWM_IDR, 1 << t);
-               t = 0;
-       }
-       spin_unlock_irqrestore(&pwm->lock, flags);
-
-       return t;
-}
-EXPORT_SYMBOL(pwm_channel_handler);
-
-static irqreturn_t pwm_irq(int id, void *_pwm)
-{
-       struct pwm      *p = _pwm;
-       irqreturn_t     handled = IRQ_NONE;
-       u32             irqstat;
-       int             index;
-
-       spin_lock(&p->lock);
-
-       /* ack irqs, then handle them */
-       irqstat = pwm_readl(pwm, PWM_ISR);
-
-       while (irqstat) {
-               struct pwm_channel *ch;
-               void (*handler)(struct pwm_channel *ch);
-
-               index = ffs(irqstat) - 1;
-               irqstat &= ~(1 << index);
-               ch = pwm->channel[index];
-               handler = pwm->handler[index];
-               if (handler && ch) {
-                       spin_unlock(&p->lock);
-                       handler(ch);
-                       spin_lock(&p->lock);
-                       handled = IRQ_HANDLED;
-               }
-       }
-
-       spin_unlock(&p->lock);
-       return handled;
-}
-
-static int __init pwm_probe(struct platform_device *pdev)
-{
-       struct resource *r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       int irq = platform_get_irq(pdev, 0);
-       u32 *mp = pdev->dev.platform_data;
-       struct pwm *p;
-       int status = -EIO;
-
-       if (pwm)
-               return -EBUSY;
-       if (!r || irq < 0 || !mp || !*mp)
-               return -ENODEV;
-       if (*mp & ~((1<<PWM_NCHAN)-1)) {
-               dev_warn(&pdev->dev, "mask 0x%x ... more than %d channels\n",
-                       *mp, PWM_NCHAN);
-               return -EINVAL;
-       }
-
-       p = kzalloc(sizeof(*p), GFP_KERNEL);
-       if (!p)
-               return -ENOMEM;
-
-       spin_lock_init(&p->lock);
-       p->pdev = pdev;
-       p->mask = *mp;
-       p->irq = irq;
-       p->base = ioremap(r->start, resource_size(r));
-       if (!p->base)
-               goto fail;
-       p->clk = clk_get(&pdev->dev, "pwm_clk");
-       if (IS_ERR(p->clk)) {
-               status = PTR_ERR(p->clk);
-               p->clk = NULL;
-               goto fail;
-       }
-
-       status = request_irq(irq, pwm_irq, 0, pdev->name, p);
-       if (status < 0)
-               goto fail;
-
-       pwm = p;
-       platform_set_drvdata(pdev, p);
-
-       return 0;
-
-fail:
-       if (p->clk)
-               clk_put(p->clk);
-       if (p->base)
-               iounmap(p->base);
-
-       kfree(p);
-       return status;
-}
-
-static int __exit pwm_remove(struct platform_device *pdev)
-{
-       struct pwm *p = platform_get_drvdata(pdev);
-
-       if (p != pwm)
-               return -EINVAL;
-
-       clk_enable(pwm->clk);
-       pwm_writel(pwm, PWM_DIS, (1 << PWM_NCHAN) - 1);
-       pwm_writel(pwm, PWM_IDR, (1 << PWM_NCHAN) - 1);
-       clk_disable(pwm->clk);
-
-       pwm = NULL;
-
-       free_irq(p->irq, p);
-       clk_put(p->clk);
-       iounmap(p->base);
-       kfree(p);
-
-       return 0;
-}
-
-static struct platform_driver atmel_pwm_driver = {
-       .driver = {
-               .name = "atmel_pwm",
-               .owner = THIS_MODULE,
-       },
-       .remove = __exit_p(pwm_remove),
-
-       /* NOTE: PWM can keep running in AVR32 "idle" and "frozen" states;
-        * and all AT91sam9263 states, albeit at reduced clock rate if
-        * MCK becomes the slow clock (i.e. what Linux labels STR).
-        */
-};
-
-module_platform_driver_probe(atmel_pwm_driver, pwm_probe);
-
-MODULE_DESCRIPTION("Driver for AT32/AT91 PWM module");
-MODULE_LICENSE("GPL");
-MODULE_ALIAS("platform:atmel_pwm");
diff --git a/drivers/misc/fuse/Makefile b/drivers/misc/fuse/Makefile
new file mode 100644 (file)
index 0000000..0679c4f
--- /dev/null
@@ -0,0 +1 @@
+obj-$(CONFIG_ARCH_TEGRA)       += tegra/
index 0d519649b5758a943512f16b853bbfff095ee442..dfde4a21023864ae26aa68336001772d51e41209 100644 (file)
@@ -24,6 +24,7 @@
 #include <linux/highmem.h>
 #include <linux/delay.h>
 #include <linux/platform_device.h>
+#include <linux/workqueue.h>
 #include <linux/mmc/host.h>
 #include <linux/mmc/mmc.h>
 #include <linux/mmc/sd.h>
@@ -36,7 +37,10 @@ struct realtek_pci_sdmmc {
        struct rtsx_pcr         *pcr;
        struct mmc_host         *mmc;
        struct mmc_request      *mrq;
+       struct workqueue_struct *workq;
+#define SDMMC_WORKQ_NAME       "rtsx_pci_sdmmc_workq"
 
+       struct work_struct      work;
        struct mutex            host_mutex;
 
        u8                      ssc_depth;
@@ -48,6 +52,11 @@ struct realtek_pci_sdmmc {
        int                     power_state;
 #define SDMMC_POWER_ON         1
 #define SDMMC_POWER_OFF                0
+
+       unsigned int            sg_count;
+       s32                     cookie;
+       unsigned int            cookie_sg_count;
+       bool                    using_cookie;
 };
 
 static inline struct device *sdmmc_dev(struct realtek_pci_sdmmc *host)
@@ -86,6 +95,77 @@ static void sd_print_debug_regs(struct realtek_pci_sdmmc *host)
 #define sd_print_debug_regs(host)
 #endif /* DEBUG */
 
+/*
+ * sd_pre_dma_transfer - do dma_map_sg() or using cookie
+ *
+ * @pre: if called in pre_req()
+ * return:
+ *     0 - do dma_map_sg()
+ *     1 - using cookie
+ */
+static int sd_pre_dma_transfer(struct realtek_pci_sdmmc *host,
+               struct mmc_data *data, bool pre)
+{
+       struct rtsx_pcr *pcr = host->pcr;
+       int read = data->flags & MMC_DATA_READ;
+       int count = 0;
+       int using_cookie = 0;
+
+       if (!pre && data->host_cookie && data->host_cookie != host->cookie) {
+               dev_err(sdmmc_dev(host),
+                       "error: data->host_cookie = %d, host->cookie = %d\n",
+                       data->host_cookie, host->cookie);
+               data->host_cookie = 0;
+       }
+
+       if (pre || data->host_cookie != host->cookie) {
+               count = rtsx_pci_dma_map_sg(pcr, data->sg, data->sg_len, read);
+       } else {
+               count = host->cookie_sg_count;
+               using_cookie = 1;
+       }
+
+       if (pre) {
+               host->cookie_sg_count = count;
+               if (++host->cookie < 0)
+                       host->cookie = 1;
+               data->host_cookie = host->cookie;
+       } else {
+               host->sg_count = count;
+       }
+
+       return using_cookie;
+}
+
+static void sdmmc_pre_req(struct mmc_host *mmc, struct mmc_request *mrq,
+               bool is_first_req)
+{
+       struct realtek_pci_sdmmc *host = mmc_priv(mmc);
+       struct mmc_data *data = mrq->data;
+
+       if (data->host_cookie) {
+               dev_err(sdmmc_dev(host),
+                       "error: reset data->host_cookie = %d\n",
+                       data->host_cookie);
+               data->host_cookie = 0;
+       }
+
+       sd_pre_dma_transfer(host, data, true);
+       dev_dbg(sdmmc_dev(host), "pre dma sg: %d\n", host->cookie_sg_count);
+}
+
+static void sdmmc_post_req(struct mmc_host *mmc, struct mmc_request *mrq,
+               int err)
+{
+       struct realtek_pci_sdmmc *host = mmc_priv(mmc);
+       struct rtsx_pcr *pcr = host->pcr;
+       struct mmc_data *data = mrq->data;
+       int read = data->flags & MMC_DATA_READ;
+
+       rtsx_pci_dma_unmap_sg(pcr, data->sg, data->sg_len, read);
+       data->host_cookie = 0;
+}
+
 static int sd_read_data(struct realtek_pci_sdmmc *host, u8 *cmd, u16 byte_cnt,
                u8 *buf, int buf_len, int timeout)
 {
@@ -415,7 +495,7 @@ static int sd_rw_multi(struct realtek_pci_sdmmc *host, struct mmc_request *mrq)
 
        rtsx_pci_send_cmd_no_wait(pcr);
 
-       err = rtsx_pci_transfer_data(pcr, data->sg, data->sg_len, read, 10000);
+       err = rtsx_pci_dma_transfer(pcr, data->sg, host->sg_count, read, 10000);
        if (err < 0) {
                sd_clear_error(host);
                return err;
@@ -640,12 +720,24 @@ static int sd_tuning_rx(struct realtek_pci_sdmmc *host, u8 opcode)
        return 0;
 }
 
-static void sdmmc_request(struct mmc_host *mmc, struct mmc_request *mrq)
+static inline int sd_rw_cmd(struct mmc_command *cmd)
 {
-       struct realtek_pci_sdmmc *host = mmc_priv(mmc);
+       return mmc_op_multi(cmd->opcode) ||
+               (cmd->opcode == MMC_READ_SINGLE_BLOCK) ||
+               (cmd->opcode == MMC_WRITE_BLOCK);
+}
+
+static void sd_request(struct work_struct *work)
+{
+       struct realtek_pci_sdmmc *host = container_of(work,
+                       struct realtek_pci_sdmmc, work);
        struct rtsx_pcr *pcr = host->pcr;
+
+       struct mmc_host *mmc = host->mmc;
+       struct mmc_request *mrq = host->mrq;
        struct mmc_command *cmd = mrq->cmd;
        struct mmc_data *data = mrq->data;
+
        unsigned int data_size = 0;
        int err;
 
@@ -677,13 +769,13 @@ static void sdmmc_request(struct mmc_host *mmc, struct mmc_request *mrq)
        if (mrq->data)
                data_size = data->blocks * data->blksz;
 
-       if (!data_size || mmc_op_multi(cmd->opcode) ||
-                       (cmd->opcode == MMC_READ_SINGLE_BLOCK) ||
-                       (cmd->opcode == MMC_WRITE_BLOCK)) {
+       if (!data_size || sd_rw_cmd(cmd)) {
                sd_send_cmd_get_rsp(host, cmd);
 
                if (!cmd->error && data_size) {
                        sd_rw_multi(host, mrq);
+                       if (!host->using_cookie)
+                               sdmmc_post_req(host->mmc, host->mrq, 0);
 
                        if (mmc_op_multi(cmd->opcode) && mrq->stop)
                                sd_send_cmd_get_rsp(host, mrq->stop);
@@ -712,6 +804,21 @@ finish:
        mmc_request_done(mmc, mrq);
 }
 
+static void sdmmc_request(struct mmc_host *mmc, struct mmc_request *mrq)
+{
+       struct realtek_pci_sdmmc *host = mmc_priv(mmc);
+       struct mmc_data *data = mrq->data;
+
+       mutex_lock(&host->host_mutex);
+       host->mrq = mrq;
+       mutex_unlock(&host->host_mutex);
+
+       if (sd_rw_cmd(mrq->cmd))
+               host->using_cookie = sd_pre_dma_transfer(host, data, false);
+
+       queue_work(host->workq, &host->work);
+}
+
 static int sd_set_bus_width(struct realtek_pci_sdmmc *host,
                unsigned char bus_width)
 {
@@ -1146,6 +1253,8 @@ out:
 }
 
 static const struct mmc_host_ops realtek_pci_sdmmc_ops = {
+       .pre_req = sdmmc_pre_req,
+       .post_req = sdmmc_post_req,
        .request = sdmmc_request,
        .set_ios = sdmmc_set_ios,
        .get_ro = sdmmc_get_ro,
@@ -1224,10 +1333,16 @@ static int rtsx_pci_sdmmc_drv_probe(struct platform_device *pdev)
                return -ENOMEM;
 
        host = mmc_priv(mmc);
+       host->workq = create_singlethread_workqueue(SDMMC_WORKQ_NAME);
+       if (!host->workq) {
+               mmc_free_host(mmc);
+               return -ENOMEM;
+       }
        host->pcr = pcr;
        host->mmc = mmc;
        host->pdev = pdev;
        host->power_state = SDMMC_POWER_OFF;
+       INIT_WORK(&host->work, sd_request);
        platform_set_drvdata(pdev, host);
        pcr->slots[RTSX_SD_CARD].p_dev = pdev;
        pcr->slots[RTSX_SD_CARD].card_event = rtsx_pci_sdmmc_card_event;
@@ -1255,6 +1370,8 @@ static int rtsx_pci_sdmmc_drv_remove(struct platform_device *pdev)
        pcr->slots[RTSX_SD_CARD].card_event = NULL;
        mmc = host->mmc;
 
+       cancel_work_sync(&host->work);
+
        mutex_lock(&host->host_mutex);
        if (host->mrq) {
                dev_dbg(&(pdev->dev),
@@ -1273,6 +1390,10 @@ static int rtsx_pci_sdmmc_drv_remove(struct platform_device *pdev)
        mmc_remove_host(mmc);
        host->eject = true;
 
+       flush_workqueue(host->workq);
+       destroy_workqueue(host->workq);
+       host->workq = NULL;
+
        mmc_free_host(mmc);
 
        dev_dbg(&(pdev->dev),
index ab2607273e809e32f62fde7654e794a5a5b252bb..dcae2f6a2b1192c7462e90a5ff80bb23ca1217fc 100644 (file)
@@ -32,10 +32,10 @@ config MTD_ONENAND_OMAP2
 
 config MTD_ONENAND_SAMSUNG
         tristate "OneNAND on Samsung SOC controller support"
-        depends on ARCH_S3C64XX || ARCH_S5PC100 || ARCH_S5PV210 || ARCH_EXYNOS4
+        depends on ARCH_S3C64XX || ARCH_S5PV210 || ARCH_EXYNOS4
         help
           Support for a OneNAND flash device connected to an Samsung SOC.
-          S3C64XX/S5PC100 use command mapping method.
+          S3C64XX uses command mapping method.
           S5PC110/S5PC210 use generic OneNAND method.
 
 config MTD_ONENAND_OTP
index efb819c3df2f36215199fa62b601ec4831363810..19cfb97adbc0447deae8611f03ffc565973b6076 100644 (file)
@@ -10,7 +10,7 @@
  * published by the Free Software Foundation.
  *
  * Implementation:
- *     S3C64XX and S5PC100: emulate the pseudo BufferRAM
+ *     S3C64XX: emulate the pseudo BufferRAM
  *     S5PC110: use DMA
  */
 
@@ -32,7 +32,6 @@
 enum soc_type {
        TYPE_S3C6400,
        TYPE_S3C6410,
-       TYPE_S5PC100,
        TYPE_S5PC110,
 };
 
@@ -59,7 +58,6 @@ enum soc_type {
 #define MAP_11                         (0x3)
 
 #define S3C64XX_CMD_MAP_SHIFT          24
-#define S5PC100_CMD_MAP_SHIFT          26
 
 #define S3C6400_FBA_SHIFT              10
 #define S3C6400_FPA_SHIFT              4
@@ -69,10 +67,6 @@ enum soc_type {
 #define S3C6410_FPA_SHIFT              6
 #define S3C6410_FSA_SHIFT              4
 
-#define S5PC100_FBA_SHIFT              13
-#define S5PC100_FPA_SHIFT              7
-#define S5PC100_FSA_SHIFT              5
-
 /* S5PC110 specific definitions */
 #define S5PC110_DMA_SRC_ADDR           0x400
 #define S5PC110_DMA_SRC_CFG            0x404
@@ -195,11 +189,6 @@ static unsigned int s3c64xx_cmd_map(unsigned type, unsigned val)
        return (type << S3C64XX_CMD_MAP_SHIFT) | val;
 }
 
-static unsigned int s5pc1xx_cmd_map(unsigned type, unsigned val)
-{
-       return (type << S5PC100_CMD_MAP_SHIFT) | val;
-}
-
 static unsigned int s3c6400_mem_addr(int fba, int fpa, int fsa)
 {
        return (fba << S3C6400_FBA_SHIFT) | (fpa << S3C6400_FPA_SHIFT) |
@@ -212,12 +201,6 @@ static unsigned int s3c6410_mem_addr(int fba, int fpa, int fsa)
                (fsa << S3C6410_FSA_SHIFT);
 }
 
-static unsigned int s5pc100_mem_addr(int fba, int fpa, int fsa)
-{
-       return (fba << S5PC100_FBA_SHIFT) | (fpa << S5PC100_FPA_SHIFT) |
-               (fsa << S5PC100_FSA_SHIFT);
-}
-
 static void s3c_onenand_reset(void)
 {
        unsigned long timeout = 0x10000;
@@ -835,9 +818,6 @@ static void s3c_onenand_setup(struct mtd_info *mtd)
        } else if (onenand->type == TYPE_S3C6410) {
                onenand->mem_addr = s3c6410_mem_addr;
                onenand->cmd_map = s3c64xx_cmd_map;
-       } else if (onenand->type == TYPE_S5PC100) {
-               onenand->mem_addr = s5pc100_mem_addr;
-               onenand->cmd_map = s5pc1xx_cmd_map;
        } else if (onenand->type == TYPE_S5PC110) {
                /* Use generic onenand functions */
                this->read_bufferram = s5pc110_read_bufferram;
@@ -1110,9 +1090,6 @@ static struct platform_device_id s3c_onenand_driver_ids[] = {
        }, {
                .name           = "s3c6410-onenand",
                .driver_data    = TYPE_S3C6410,
-       }, {
-               .name           = "s5pc100-onenand",
-               .driver_data    = TYPE_S5PC100,
        }, {
                .name           = "s5pc110-onenand",
                .driver_data    = TYPE_S5PC110,
index 21df477be0c8ad7468c3e985467173567488c902..2d8a4d05d78fc02513fe5a2587e545bc36914f08 100644 (file)
@@ -46,4 +46,12 @@ config PCI_HOST_GENERIC
          Say Y here if you want to support a simple generic PCI host
          controller, such as the one emulated by kvmtool.
 
+config PCIE_SPEAR13XX
+       tristate "STMicroelectronics SPEAr PCIe controller"
+       depends on ARCH_SPEAR13XX
+       select PCIEPORTBUS
+       select PCIE_DW
+       help
+         Say Y here if you want PCIe support on SPEAr13XX SoCs.
+
 endmenu
index 611ba4b48c9491f1ab46d2c7f4818d76405facfb..0daec7941aba44f30fb17e37857872f2e523fce1 100644 (file)
@@ -6,3 +6,4 @@ obj-$(CONFIG_PCI_TEGRA) += pci-tegra.o
 obj-$(CONFIG_PCI_RCAR_GEN2) += pci-rcar-gen2.o
 obj-$(CONFIG_PCI_RCAR_GEN2_PCIE) += pcie-rcar.o
 obj-$(CONFIG_PCI_HOST_GENERIC) += pci-host-generic.o
+obj-$(CONFIG_PCIE_SPEAR13XX) += pcie-spear13xx.o
index c284e841e3ea0dc2a25e19012ef40f10d2994165..abd65784618dca13f56960acc051b716ec1bbfd7 100644 (file)
 #include <linux/reset.h>
 #include <linux/sizes.h>
 #include <linux/slab.h>
-#include <linux/tegra-cpuidle.h>
-#include <linux/tegra-powergate.h>
 #include <linux/vmalloc.h>
 #include <linux/regulator/consumer.h>
 
+#include <soc/tegra/cpuidle.h>
+#include <soc/tegra/pmc.h>
+
 #include <asm/mach/irq.h>
 #include <asm/mach/map.h>
 #include <asm/mach/pci.h>
@@ -233,7 +234,6 @@ struct tegra_pcie_soc_data {
        bool has_pex_clkreq_en;
        bool has_pex_bias_ctrl;
        bool has_intr_prsnt_sense;
-       bool has_avdd_supply;
        bool has_cml_clk;
 };
 
@@ -272,9 +272,8 @@ struct tegra_pcie {
        unsigned int num_ports;
        u32 xbar_config;
 
-       struct regulator *pex_clk_supply;
-       struct regulator *vdd_supply;
-       struct regulator *avdd_supply;
+       struct regulator_bulk_data *supplies;
+       unsigned int num_supplies;
 
        const struct tegra_pcie_soc_data *soc_data;
 };
@@ -894,7 +893,6 @@ static int tegra_pcie_enable_controller(struct tegra_pcie *pcie)
 
 static void tegra_pcie_power_off(struct tegra_pcie *pcie)
 {
-       const struct tegra_pcie_soc_data *soc = pcie->soc_data;
        int err;
 
        /* TODO: disable and unprepare clocks? */
@@ -905,23 +903,9 @@ static void tegra_pcie_power_off(struct tegra_pcie *pcie)
 
        tegra_powergate_power_off(TEGRA_POWERGATE_PCIE);
 
-       if (soc->has_avdd_supply) {
-               err = regulator_disable(pcie->avdd_supply);
-               if (err < 0)
-                       dev_warn(pcie->dev,
-                                "failed to disable AVDD regulator: %d\n",
-                                err);
-       }
-
-       err = regulator_disable(pcie->pex_clk_supply);
-       if (err < 0)
-               dev_warn(pcie->dev, "failed to disable pex-clk regulator: %d\n",
-                        err);
-
-       err = regulator_disable(pcie->vdd_supply);
+       err = regulator_bulk_disable(pcie->num_supplies, pcie->supplies);
        if (err < 0)
-               dev_warn(pcie->dev, "failed to disable VDD regulator: %d\n",
-                        err);
+               dev_warn(pcie->dev, "failed to disable regulators: %d\n", err);
 }
 
 static int tegra_pcie_power_on(struct tegra_pcie *pcie)
@@ -936,28 +920,9 @@ static int tegra_pcie_power_on(struct tegra_pcie *pcie)
        tegra_powergate_power_off(TEGRA_POWERGATE_PCIE);
 
        /* enable regulators */
-       err = regulator_enable(pcie->vdd_supply);
-       if (err < 0) {
-               dev_err(pcie->dev, "failed to enable VDD regulator: %d\n", err);
-               return err;
-       }
-
-       err = regulator_enable(pcie->pex_clk_supply);
-       if (err < 0) {
-               dev_err(pcie->dev, "failed to enable pex-clk regulator: %d\n",
-                       err);
-               return err;
-       }
-
-       if (soc->has_avdd_supply) {
-               err = regulator_enable(pcie->avdd_supply);
-               if (err < 0) {
-                       dev_err(pcie->dev,
-                               "failed to enable AVDD regulator: %d\n",
-                               err);
-                       return err;
-               }
-       }
+       err = regulator_bulk_enable(pcie->num_supplies, pcie->supplies);
+       if (err < 0)
+               dev_err(pcie->dev, "failed to enable regulators: %d\n", err);
 
        err = tegra_powergate_sequence_power_up(TEGRA_POWERGATE_PCIE,
                                                pcie->pex_clk,
@@ -1394,14 +1359,157 @@ static int tegra_pcie_get_xbar_config(struct tegra_pcie *pcie, u32 lanes,
        return -EINVAL;
 }
 
+/*
+ * Check whether a given set of supplies is available in a device tree node.
+ * This is used to check whether the new or the legacy device tree bindings
+ * should be used.
+ */
+static bool of_regulator_bulk_available(struct device_node *np,
+                                       struct regulator_bulk_data *supplies,
+                                       unsigned int num_supplies)
+{
+       char property[32];
+       unsigned int i;
+
+       for (i = 0; i < num_supplies; i++) {
+               snprintf(property, 32, "%s-supply", supplies[i].supply);
+
+               if (of_find_property(np, property, NULL) == NULL)
+                       return false;
+       }
+
+       return true;
+}
+
+/*
+ * Old versions of the device tree binding for this device used a set of power
+ * supplies that didn't match the hardware inputs. This happened to work for a
+ * number of cases but is not future proof. However to preserve backwards-
+ * compatibility with old device trees, this function will try to use the old
+ * set of supplies.
+ */
+static int tegra_pcie_get_legacy_regulators(struct tegra_pcie *pcie)
+{
+       struct device_node *np = pcie->dev->of_node;
+
+       if (of_device_is_compatible(np, "nvidia,tegra30-pcie"))
+               pcie->num_supplies = 3;
+       else if (of_device_is_compatible(np, "nvidia,tegra20-pcie"))
+               pcie->num_supplies = 2;
+
+       if (pcie->num_supplies == 0) {
+               dev_err(pcie->dev, "device %s not supported in legacy mode\n",
+                       np->full_name);
+               return -ENODEV;
+       }
+
+       pcie->supplies = devm_kcalloc(pcie->dev, pcie->num_supplies,
+                                     sizeof(*pcie->supplies),
+                                     GFP_KERNEL);
+       if (!pcie->supplies)
+               return -ENOMEM;
+
+       pcie->supplies[0].supply = "pex-clk";
+       pcie->supplies[1].supply = "vdd";
+
+       if (pcie->num_supplies > 2)
+               pcie->supplies[2].supply = "avdd";
+
+       return devm_regulator_bulk_get(pcie->dev, pcie->num_supplies,
+                                      pcie->supplies);
+}
+
+/*
+ * Obtains the list of regulators required for a particular generation of the
+ * IP block.
+ *
+ * This would've been nice to do simply by providing static tables for use
+ * with the regulator_bulk_*() API, but unfortunately Tegra30 is a bit quirky
+ * in that it has two pairs or AVDD_PEX and VDD_PEX supplies (PEXA and PEXB)
+ * and either seems to be optional depending on which ports are being used.
+ */
+static int tegra_pcie_get_regulators(struct tegra_pcie *pcie, u32 lane_mask)
+{
+       struct device_node *np = pcie->dev->of_node;
+       unsigned int i = 0;
+
+       if (of_device_is_compatible(np, "nvidia,tegra30-pcie")) {
+               bool need_pexa = false, need_pexb = false;
+
+               /* VDD_PEXA and AVDD_PEXA supply lanes 0 to 3 */
+               if (lane_mask & 0x0f)
+                       need_pexa = true;
+
+               /* VDD_PEXB and AVDD_PEXB supply lanes 4 to 5 */
+               if (lane_mask & 0x30)
+                       need_pexb = true;
+
+               pcie->num_supplies = 4 + (need_pexa ? 2 : 0) +
+                                        (need_pexb ? 2 : 0);
+
+               pcie->supplies = devm_kcalloc(pcie->dev, pcie->num_supplies,
+                                             sizeof(*pcie->supplies),
+                                             GFP_KERNEL);
+               if (!pcie->supplies)
+                       return -ENOMEM;
+
+               pcie->supplies[i++].supply = "avdd-pex-pll";
+               pcie->supplies[i++].supply = "hvdd-pex";
+               pcie->supplies[i++].supply = "vddio-pex-ctl";
+               pcie->supplies[i++].supply = "avdd-plle";
+
+               if (need_pexa) {
+                       pcie->supplies[i++].supply = "avdd-pexa";
+                       pcie->supplies[i++].supply = "vdd-pexa";
+               }
+
+               if (need_pexb) {
+                       pcie->supplies[i++].supply = "avdd-pexb";
+                       pcie->supplies[i++].supply = "vdd-pexb";
+               }
+       } else if (of_device_is_compatible(np, "nvidia,tegra20-pcie")) {
+               pcie->num_supplies = 5;
+
+               pcie->supplies = devm_kcalloc(pcie->dev, pcie->num_supplies,
+                                             sizeof(*pcie->supplies),
+                                             GFP_KERNEL);
+               if (!pcie->supplies)
+                       return -ENOMEM;
+
+               pcie->supplies[0].supply = "avdd-pex";
+               pcie->supplies[1].supply = "vdd-pex";
+               pcie->supplies[2].supply = "avdd-pex-pll";
+               pcie->supplies[3].supply = "avdd-plle";
+               pcie->supplies[4].supply = "vddio-pex-clk";
+       }
+
+       if (of_regulator_bulk_available(pcie->dev->of_node, pcie->supplies,
+                                       pcie->num_supplies))
+               return devm_regulator_bulk_get(pcie->dev, pcie->num_supplies,
+                                              pcie->supplies);
+
+       /*
+        * If not all regulators are available for this new scheme, assume
+        * that the device tree complies with an older version of the device
+        * tree binding.
+        */
+       dev_info(pcie->dev, "using legacy DT binding for power supplies\n");
+
+       devm_kfree(pcie->dev, pcie->supplies);
+       pcie->num_supplies = 0;
+
+       return tegra_pcie_get_legacy_regulators(pcie);
+}
+
 static int tegra_pcie_parse_dt(struct tegra_pcie *pcie)
 {
        const struct tegra_pcie_soc_data *soc = pcie->soc_data;
        struct device_node *np = pcie->dev->of_node, *port;
        struct of_pci_range_parser parser;
        struct of_pci_range range;
+       u32 lanes = 0, mask = 0;
+       unsigned int lane = 0;
        struct resource res;
-       u32 lanes = 0;
        int err;
 
        if (of_pci_range_parser_init(&parser, np)) {
@@ -1409,20 +1517,6 @@ static int tegra_pcie_parse_dt(struct tegra_pcie *pcie)
                return -EINVAL;
        }
 
-       pcie->vdd_supply = devm_regulator_get(pcie->dev, "vdd");
-       if (IS_ERR(pcie->vdd_supply))
-               return PTR_ERR(pcie->vdd_supply);
-
-       pcie->pex_clk_supply = devm_regulator_get(pcie->dev, "pex-clk");
-       if (IS_ERR(pcie->pex_clk_supply))
-               return PTR_ERR(pcie->pex_clk_supply);
-
-       if (soc->has_avdd_supply) {
-               pcie->avdd_supply = devm_regulator_get(pcie->dev, "avdd");
-               if (IS_ERR(pcie->avdd_supply))
-                       return PTR_ERR(pcie->avdd_supply);
-       }
-
        for_each_of_pci_range(&parser, &range) {
                of_pci_range_to_resource(&range, np, &res);
 
@@ -1490,8 +1584,13 @@ static int tegra_pcie_parse_dt(struct tegra_pcie *pcie)
 
                lanes |= value << (index << 3);
 
-               if (!of_device_is_available(port))
+               if (!of_device_is_available(port)) {
+                       lane += value;
                        continue;
+               }
+
+               mask |= ((1 << value) - 1) << lane;
+               lane += value;
 
                rp = devm_kzalloc(pcie->dev, sizeof(*rp), GFP_KERNEL);
                if (!rp)
@@ -1522,6 +1621,10 @@ static int tegra_pcie_parse_dt(struct tegra_pcie *pcie)
                return err;
        }
 
+       err = tegra_pcie_get_regulators(pcie, mask);
+       if (err < 0)
+               return err;
+
        return 0;
 }
 
@@ -1615,7 +1718,6 @@ static const struct tegra_pcie_soc_data tegra20_pcie_data = {
        .has_pex_clkreq_en = false,
        .has_pex_bias_ctrl = false,
        .has_intr_prsnt_sense = false,
-       .has_avdd_supply = false,
        .has_cml_clk = false,
 };
 
@@ -1627,7 +1729,6 @@ static const struct tegra_pcie_soc_data tegra30_pcie_data = {
        .has_pex_clkreq_en = true,
        .has_pex_bias_ctrl = true,
        .has_intr_prsnt_sense = true,
-       .has_avdd_supply = true,
        .has_cml_clk = true,
 };
 
diff --git a/drivers/pci/host/pcie-spear13xx.c b/drivers/pci/host/pcie-spear13xx.c
new file mode 100644 (file)
index 0000000..6dea9e4
--- /dev/null
@@ -0,0 +1,393 @@
+/*
+ * PCIe host controller driver for ST Microelectronics SPEAr13xx SoCs
+ *
+ * SPEAr13xx PCIe Glue Layer Source Code
+ *
+ * Copyright (C) 2010-2014 ST Microelectronics
+ * Pratyush Anand <pratyush.anand@st.com>
+ * Mohit Kumar <mohit.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <linux/clk.h>
+#include <linux/delay.h>
+#include <linux/interrupt.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/pci.h>
+#include <linux/phy/phy.h>
+#include <linux/platform_device.h>
+#include <linux/resource.h>
+
+#include "pcie-designware.h"
+
+struct spear13xx_pcie {
+       void __iomem            *app_base;
+       struct phy              *phy;
+       struct clk              *clk;
+       struct pcie_port        pp;
+       bool                    is_gen1;
+};
+
+struct pcie_app_reg {
+       u32     app_ctrl_0;             /* cr0 */
+       u32     app_ctrl_1;             /* cr1 */
+       u32     app_status_0;           /* cr2 */
+       u32     app_status_1;           /* cr3 */
+       u32     msg_status;             /* cr4 */
+       u32     msg_payload;            /* cr5 */
+       u32     int_sts;                /* cr6 */
+       u32     int_clr;                /* cr7 */
+       u32     int_mask;               /* cr8 */
+       u32     mst_bmisc;              /* cr9 */
+       u32     phy_ctrl;               /* cr10 */
+       u32     phy_status;             /* cr11 */
+       u32     cxpl_debug_info_0;      /* cr12 */
+       u32     cxpl_debug_info_1;      /* cr13 */
+       u32     ven_msg_ctrl_0;         /* cr14 */
+       u32     ven_msg_ctrl_1;         /* cr15 */
+       u32     ven_msg_data_0;         /* cr16 */
+       u32     ven_msg_data_1;         /* cr17 */
+       u32     ven_msi_0;              /* cr18 */
+       u32     ven_msi_1;              /* cr19 */
+       u32     mst_rmisc;              /* cr20 */
+};
+
+/* CR0 ID */
+#define RX_LANE_FLIP_EN_ID                     0
+#define TX_LANE_FLIP_EN_ID                     1
+#define SYS_AUX_PWR_DET_ID                     2
+#define APP_LTSSM_ENABLE_ID                    3
+#define SYS_ATTEN_BUTTON_PRESSED_ID            4
+#define SYS_MRL_SENSOR_STATE_ID                        5
+#define SYS_PWR_FAULT_DET_ID                   6
+#define SYS_MRL_SENSOR_CHGED_ID                        7
+#define SYS_PRE_DET_CHGED_ID                   8
+#define SYS_CMD_CPLED_INT_ID                   9
+#define APP_INIT_RST_0_ID                      11
+#define APP_REQ_ENTR_L1_ID                     12
+#define APP_READY_ENTR_L23_ID                  13
+#define APP_REQ_EXIT_L1_ID                     14
+#define DEVICE_TYPE_EP                         (0 << 25)
+#define DEVICE_TYPE_LEP                                (1 << 25)
+#define DEVICE_TYPE_RC                         (4 << 25)
+#define SYS_INT_ID                             29
+#define MISCTRL_EN_ID                          30
+#define REG_TRANSLATION_ENABLE                 31
+
+/* CR1 ID */
+#define APPS_PM_XMT_TURNOFF_ID                 2
+#define APPS_PM_XMT_PME_ID                     5
+
+/* CR3 ID */
+#define XMLH_LTSSM_STATE_DETECT_QUIET          0x00
+#define XMLH_LTSSM_STATE_DETECT_ACT            0x01
+#define XMLH_LTSSM_STATE_POLL_ACTIVE           0x02
+#define XMLH_LTSSM_STATE_POLL_COMPLIANCE       0x03
+#define XMLH_LTSSM_STATE_POLL_CONFIG           0x04
+#define XMLH_LTSSM_STATE_PRE_DETECT_QUIET      0x05
+#define XMLH_LTSSM_STATE_DETECT_WAIT           0x06
+#define XMLH_LTSSM_STATE_CFG_LINKWD_START      0x07
+#define XMLH_LTSSM_STATE_CFG_LINKWD_ACEPT      0x08
+#define XMLH_LTSSM_STATE_CFG_LANENUM_WAIT      0x09
+#define XMLH_LTSSM_STATE_CFG_LANENUM_ACEPT     0x0A
+#define XMLH_LTSSM_STATE_CFG_COMPLETE          0x0B
+#define XMLH_LTSSM_STATE_CFG_IDLE              0x0C
+#define XMLH_LTSSM_STATE_RCVRY_LOCK            0x0D
+#define XMLH_LTSSM_STATE_RCVRY_SPEED           0x0E
+#define XMLH_LTSSM_STATE_RCVRY_RCVRCFG         0x0F
+#define XMLH_LTSSM_STATE_RCVRY_IDLE            0x10
+#define XMLH_LTSSM_STATE_L0                    0x11
+#define XMLH_LTSSM_STATE_L0S                   0x12
+#define XMLH_LTSSM_STATE_L123_SEND_EIDLE       0x13
+#define XMLH_LTSSM_STATE_L1_IDLE               0x14
+#define XMLH_LTSSM_STATE_L2_IDLE               0x15
+#define XMLH_LTSSM_STATE_L2_WAKE               0x16
+#define XMLH_LTSSM_STATE_DISABLED_ENTRY                0x17
+#define XMLH_LTSSM_STATE_DISABLED_IDLE         0x18
+#define XMLH_LTSSM_STATE_DISABLED              0x19
+#define XMLH_LTSSM_STATE_LPBK_ENTRY            0x1A
+#define XMLH_LTSSM_STATE_LPBK_ACTIVE           0x1B
+#define XMLH_LTSSM_STATE_LPBK_EXIT             0x1C
+#define XMLH_LTSSM_STATE_LPBK_EXIT_TIMEOUT     0x1D
+#define XMLH_LTSSM_STATE_HOT_RESET_ENTRY       0x1E
+#define XMLH_LTSSM_STATE_HOT_RESET             0x1F
+#define XMLH_LTSSM_STATE_MASK                  0x3F
+#define XMLH_LINK_UP                           (1 << 6)
+
+/* CR4 ID */
+#define CFG_MSI_EN_ID                          18
+
+/* CR6 */
+#define INTA_CTRL_INT                          (1 << 7)
+#define INTB_CTRL_INT                          (1 << 8)
+#define INTC_CTRL_INT                          (1 << 9)
+#define INTD_CTRL_INT                          (1 << 10)
+#define MSI_CTRL_INT                           (1 << 26)
+
+/* CR19 ID */
+#define VEN_MSI_REQ_ID                         11
+#define VEN_MSI_FUN_NUM_ID                     8
+#define VEN_MSI_TC_ID                          5
+#define VEN_MSI_VECTOR_ID                      0
+#define VEN_MSI_REQ_EN         ((u32)0x1 << VEN_MSI_REQ_ID)
+#define VEN_MSI_FUN_NUM_MASK   ((u32)0x7 << VEN_MSI_FUN_NUM_ID)
+#define VEN_MSI_TC_MASK                ((u32)0x7 << VEN_MSI_TC_ID)
+#define VEN_MSI_VECTOR_MASK    ((u32)0x1F << VEN_MSI_VECTOR_ID)
+
+#define EXP_CAP_ID_OFFSET                      0x70
+
+#define to_spear13xx_pcie(x)   container_of(x, struct spear13xx_pcie, pp)
+
+static int spear13xx_pcie_establish_link(struct pcie_port *pp)
+{
+       u32 val;
+       int count = 0;
+       struct spear13xx_pcie *spear13xx_pcie = to_spear13xx_pcie(pp);
+       struct pcie_app_reg *app_reg = spear13xx_pcie->app_base;
+       u32 exp_cap_off = EXP_CAP_ID_OFFSET;
+
+       if (dw_pcie_link_up(pp)) {
+               dev_err(pp->dev, "link already up\n");
+               return 0;
+       }
+
+       dw_pcie_setup_rc(pp);
+
+       /*
+        * this controller support only 128 bytes read size, however its
+        * default value in capability register is 512 bytes. So force
+        * it to 128 here.
+        */
+       dw_pcie_cfg_read(pp->dbi_base, exp_cap_off + PCI_EXP_DEVCTL, 4, &val);
+       val &= ~PCI_EXP_DEVCTL_READRQ;
+       dw_pcie_cfg_write(pp->dbi_base, exp_cap_off + PCI_EXP_DEVCTL, 4, val);
+
+       dw_pcie_cfg_write(pp->dbi_base, PCI_VENDOR_ID, 2, 0x104A);
+       dw_pcie_cfg_write(pp->dbi_base, PCI_DEVICE_ID, 2, 0xCD80);
+
+       /*
+        * if is_gen1 is set then handle it, so that some buggy card
+        * also works
+        */
+       if (spear13xx_pcie->is_gen1) {
+               dw_pcie_cfg_read(pp->dbi_base, exp_cap_off + PCI_EXP_LNKCAP, 4,
+                                &val);
+               if ((val & PCI_EXP_LNKCAP_SLS) != PCI_EXP_LNKCAP_SLS_2_5GB) {
+                       val &= ~((u32)PCI_EXP_LNKCAP_SLS);
+                       val |= PCI_EXP_LNKCAP_SLS_2_5GB;
+                       dw_pcie_cfg_write(pp->dbi_base, exp_cap_off +
+                                         PCI_EXP_LNKCAP, 4, val);
+               }
+
+               dw_pcie_cfg_read(pp->dbi_base, exp_cap_off + PCI_EXP_LNKCTL2, 4,
+                                &val);
+               if ((val & PCI_EXP_LNKCAP_SLS) != PCI_EXP_LNKCAP_SLS_2_5GB) {
+                       val &= ~((u32)PCI_EXP_LNKCAP_SLS);
+                       val |= PCI_EXP_LNKCAP_SLS_2_5GB;
+                       dw_pcie_cfg_write(pp->dbi_base, exp_cap_off +
+                                         PCI_EXP_LNKCTL2, 4, val);
+               }
+       }
+
+       /* enable ltssm */
+       writel(DEVICE_TYPE_RC | (1 << MISCTRL_EN_ID)
+                       | (1 << APP_LTSSM_ENABLE_ID)
+                       | ((u32)1 << REG_TRANSLATION_ENABLE),
+                       &app_reg->app_ctrl_0);
+
+       /* check if the link is up or not */
+       while (!dw_pcie_link_up(pp)) {
+               mdelay(100);
+               count++;
+               if (count == 10) {
+                       dev_err(pp->dev, "link Fail\n");
+                       return -EINVAL;
+               }
+       }
+       dev_info(pp->dev, "link up\n");
+
+       return 0;
+}
+
+static irqreturn_t spear13xx_pcie_irq_handler(int irq, void *arg)
+{
+       struct pcie_port *pp = arg;
+       struct spear13xx_pcie *spear13xx_pcie = to_spear13xx_pcie(pp);
+       struct pcie_app_reg *app_reg = spear13xx_pcie->app_base;
+       unsigned int status;
+
+       status = readl(&app_reg->int_sts);
+
+       if (status & MSI_CTRL_INT) {
+               if (!IS_ENABLED(CONFIG_PCI_MSI))
+                       BUG();
+               dw_handle_msi_irq(pp);
+       }
+
+       writel(status, &app_reg->int_clr);
+
+       return IRQ_HANDLED;
+}
+
+static void spear13xx_pcie_enable_interrupts(struct pcie_port *pp)
+{
+       struct spear13xx_pcie *spear13xx_pcie = to_spear13xx_pcie(pp);
+       struct pcie_app_reg *app_reg = spear13xx_pcie->app_base;
+
+       /* Enable MSI interrupt */
+       if (IS_ENABLED(CONFIG_PCI_MSI)) {
+               dw_pcie_msi_init(pp);
+               writel(readl(&app_reg->int_mask) |
+                               MSI_CTRL_INT, &app_reg->int_mask);
+       }
+}
+
+static int spear13xx_pcie_link_up(struct pcie_port *pp)
+{
+       struct spear13xx_pcie *spear13xx_pcie = to_spear13xx_pcie(pp);
+       struct pcie_app_reg *app_reg = spear13xx_pcie->app_base;
+
+       if (readl(&app_reg->app_status_1) & XMLH_LINK_UP)
+               return 1;
+
+       return 0;
+}
+
+static void spear13xx_pcie_host_init(struct pcie_port *pp)
+{
+       spear13xx_pcie_establish_link(pp);
+       spear13xx_pcie_enable_interrupts(pp);
+}
+
+static struct pcie_host_ops spear13xx_pcie_host_ops = {
+       .link_up = spear13xx_pcie_link_up,
+       .host_init = spear13xx_pcie_host_init,
+};
+
+static int add_pcie_port(struct pcie_port *pp, struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       int ret;
+
+       pp->irq = platform_get_irq(pdev, 0);
+       if (!pp->irq) {
+               dev_err(dev, "failed to get irq\n");
+               return -ENODEV;
+       }
+       ret = devm_request_irq(dev, pp->irq, spear13xx_pcie_irq_handler,
+                              IRQF_SHARED, "spear1340-pcie", pp);
+       if (ret) {
+               dev_err(dev, "failed to request irq %d\n", pp->irq);
+               return ret;
+       }
+
+       pp->root_bus_nr = -1;
+       pp->ops = &spear13xx_pcie_host_ops;
+
+       ret = dw_pcie_host_init(pp);
+       if (ret) {
+               dev_err(dev, "failed to initialize host\n");
+               return ret;
+       }
+
+       return 0;
+}
+
+static int __init spear13xx_pcie_probe(struct platform_device *pdev)
+{
+       struct spear13xx_pcie *spear13xx_pcie;
+       struct pcie_port *pp;
+       struct device *dev = &pdev->dev;
+       struct device_node *np = pdev->dev.of_node;
+       struct resource *dbi_base;
+       int ret;
+
+       spear13xx_pcie = devm_kzalloc(dev, sizeof(*spear13xx_pcie), GFP_KERNEL);
+       if (!spear13xx_pcie) {
+               dev_err(dev, "no memory for SPEAr13xx pcie\n");
+               return -ENOMEM;
+       }
+
+       spear13xx_pcie->phy = devm_phy_get(dev, "pcie-phy");
+       if (IS_ERR(spear13xx_pcie->phy)) {
+               ret = PTR_ERR(spear13xx_pcie->phy);
+               if (ret == -EPROBE_DEFER)
+                       dev_info(dev, "probe deferred\n");
+               else
+                       dev_err(dev, "couldn't get pcie-phy\n");
+               return ret;
+       }
+
+       phy_init(spear13xx_pcie->phy);
+
+       spear13xx_pcie->clk = devm_clk_get(dev, NULL);
+       if (IS_ERR(spear13xx_pcie->clk)) {
+               dev_err(dev, "couldn't get clk for pcie\n");
+               return PTR_ERR(spear13xx_pcie->clk);
+       }
+       ret = clk_prepare_enable(spear13xx_pcie->clk);
+       if (ret) {
+               dev_err(dev, "couldn't enable clk for pcie\n");
+               return ret;
+       }
+
+       pp = &spear13xx_pcie->pp;
+
+       pp->dev = dev;
+
+       dbi_base = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       pp->dbi_base = devm_ioremap_resource(dev, dbi_base);
+       if (IS_ERR(pp->dbi_base)) {
+               dev_err(dev, "couldn't remap dbi base %p\n", dbi_base);
+               ret = PTR_ERR(pp->dbi_base);
+               goto fail_clk;
+       }
+       spear13xx_pcie->app_base = pp->dbi_base + 0x2000;
+
+       if (of_property_read_bool(np, "st,pcie-is-gen1"))
+               spear13xx_pcie->is_gen1 = true;
+
+       ret = add_pcie_port(pp, pdev);
+       if (ret < 0)
+               goto fail_clk;
+
+       platform_set_drvdata(pdev, spear13xx_pcie);
+       return 0;
+
+fail_clk:
+       clk_disable_unprepare(spear13xx_pcie->clk);
+
+       return ret;
+}
+
+static const struct of_device_id spear13xx_pcie_of_match[] = {
+       { .compatible = "st,spear1340-pcie", },
+       {},
+};
+MODULE_DEVICE_TABLE(of, spear13xx_pcie_of_match);
+
+static struct platform_driver spear13xx_pcie_driver __initdata = {
+       .probe          = spear13xx_pcie_probe,
+       .driver = {
+               .name   = "spear-pcie",
+               .owner  = THIS_MODULE,
+               .of_match_table = of_match_ptr(spear13xx_pcie_of_match),
+       },
+};
+
+/* SPEAr13xx PCIe driver does not allow module unload */
+
+static int __init pcie_init(void)
+{
+       return platform_driver_register(&spear13xx_pcie_driver);
+}
+module_init(pcie_init);
+
+MODULE_DESCRIPTION("ST Microelectronics SPEAr13xx PCIe host controller driver");
+MODULE_AUTHOR("Pratyush Anand <pratyush.anand@st.com>");
+MODULE_LICENSE("GPL v2");
index cc97c897945a8b2d033703251d769ac2f2f7673e..0dd742719154a9d7172dcd9c4f9f9dc3e26e6030 100644 (file)
@@ -159,6 +159,16 @@ config PHY_SAMSUNG_USB2
          for particular PHYs will be enabled based on the SoC type in addition
          to this driver.
 
+config PHY_S5PV210_USB2
+       bool "Support for S5PV210"
+       depends on PHY_SAMSUNG_USB2
+       depends on ARCH_S5PV210
+       help
+         Enable USB PHY support for S5PV210. This option requires that Samsung
+         USB 2.0 PHY driver is enabled and means that support for this
+         particular SoC is compiled in the driver. In case of S5PV210 two phys
+         are available - device and host.
+
 config PHY_EXYNOS4210_USB2
        bool
        depends on PHY_SAMSUNG_USB2
@@ -187,13 +197,6 @@ config PHY_EXYNOS5_USBDRD
          This driver provides PHY interface for USB 3.0 DRD controller
          present on Exynos5 SoC series.
 
-config PHY_XGENE
-       tristate "APM X-Gene 15Gbps PHY support"
-       depends on HAS_IOMEM && OF && (ARM64 || COMPILE_TEST)
-       select GENERIC_PHY
-       help
-         This option enables support for APM X-Gene SoC multi-purpose PHY.
-
 config PHY_QCOM_APQ8064_SATA
        tristate "Qualcomm APQ8064 SATA SerDes/PHY driver"
        depends on ARCH_QCOM
@@ -208,4 +211,23 @@ config PHY_QCOM_IPQ806X_SATA
        depends on OF
        select GENERIC_PHY
 
+config PHY_ST_SPEAR1310_MIPHY
+       tristate "ST SPEAR1310-MIPHY driver"
+       select GENERIC_PHY
+       help
+         Support for ST SPEAr1310 MIPHY which can be used for PCIe and SATA.
+
+config PHY_ST_SPEAR1340_MIPHY
+       tristate "ST SPEAR1340-MIPHY driver"
+       select GENERIC_PHY
+       help
+         Support for ST SPEAr1340 MIPHY which can be used for PCIe and SATA.
+
+config PHY_XGENE
+       tristate "APM X-Gene 15Gbps PHY support"
+       depends on HAS_IOMEM && OF && (ARM64 || COMPILE_TEST)
+       select GENERIC_PHY
+       help
+         This option enables support for APM X-Gene SoC multi-purpose PHY.
+
 endmenu
index 971ad0aac388b23beb7bb944e142025774e719a1..95c69ed5ed4511e7f68f63fccd2d11417f4248a8 100644 (file)
@@ -21,7 +21,10 @@ phy-exynos-usb2-y                    += phy-samsung-usb2.o
 phy-exynos-usb2-$(CONFIG_PHY_EXYNOS4210_USB2)  += phy-exynos4210-usb2.o
 phy-exynos-usb2-$(CONFIG_PHY_EXYNOS4X12_USB2)  += phy-exynos4x12-usb2.o
 phy-exynos-usb2-$(CONFIG_PHY_EXYNOS5250_USB2)  += phy-exynos5250-usb2.o
+phy-exynos-usb2-$(CONFIG_PHY_S5PV210_USB2)     += phy-s5pv210-usb2.o
 obj-$(CONFIG_PHY_EXYNOS5_USBDRD)       += phy-exynos5-usbdrd.o
-obj-$(CONFIG_PHY_XGENE)                        += phy-xgene.o
 obj-$(CONFIG_PHY_QCOM_APQ8064_SATA)    += phy-qcom-apq8064-sata.o
 obj-$(CONFIG_PHY_QCOM_IPQ806X_SATA)    += phy-qcom-ipq806x-sata.o
+obj-$(CONFIG_PHY_ST_SPEAR1310_MIPHY)   += phy-spear1310-miphy.o
+obj-$(CONFIG_PHY_ST_SPEAR1340_MIPHY)   += phy-spear1340-miphy.o
+obj-$(CONFIG_PHY_XGENE)                        += phy-xgene.o
diff --git a/drivers/phy/phy-s5pv210-usb2.c b/drivers/phy/phy-s5pv210-usb2.c
new file mode 100644 (file)
index 0000000..004d320
--- /dev/null
@@ -0,0 +1,187 @@
+/*
+ * Samsung SoC USB 1.1/2.0 PHY driver - S5PV210 support
+ *
+ * Copyright (C) 2013 Samsung Electronics Co., Ltd.
+ * Authors: Kamil Debski <k.debski@samsung.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/delay.h>
+#include <linux/io.h>
+#include <linux/phy/phy.h>
+#include "phy-samsung-usb2.h"
+
+/* Exynos USB PHY registers */
+
+/* PHY power control */
+#define S5PV210_UPHYPWR                        0x0
+
+#define S5PV210_UPHYPWR_PHY0_SUSPEND   BIT(0)
+#define S5PV210_UPHYPWR_PHY0_PWR       BIT(3)
+#define S5PV210_UPHYPWR_PHY0_OTG_PWR   BIT(4)
+#define S5PV210_UPHYPWR_PHY0   ( \
+       S5PV210_UPHYPWR_PHY0_SUSPEND | \
+       S5PV210_UPHYPWR_PHY0_PWR | \
+       S5PV210_UPHYPWR_PHY0_OTG_PWR)
+
+#define S5PV210_UPHYPWR_PHY1_SUSPEND   BIT(6)
+#define S5PV210_UPHYPWR_PHY1_PWR       BIT(7)
+#define S5PV210_UPHYPWR_PHY1 ( \
+       S5PV210_UPHYPWR_PHY1_SUSPEND | \
+       S5PV210_UPHYPWR_PHY1_PWR)
+
+/* PHY clock control */
+#define S5PV210_UPHYCLK                        0x4
+
+#define S5PV210_UPHYCLK_PHYFSEL_MASK   (0x3 << 0)
+#define S5PV210_UPHYCLK_PHYFSEL_48MHZ  (0x0 << 0)
+#define S5PV210_UPHYCLK_PHYFSEL_24MHZ  (0x3 << 0)
+#define S5PV210_UPHYCLK_PHYFSEL_12MHZ  (0x2 << 0)
+
+#define S5PV210_UPHYCLK_PHY0_ID_PULLUP BIT(2)
+#define S5PV210_UPHYCLK_PHY0_COMMON_ON BIT(4)
+#define S5PV210_UPHYCLK_PHY1_COMMON_ON BIT(7)
+
+/* PHY reset control */
+#define S5PV210_UPHYRST                        0x8
+
+#define S5PV210_URSTCON_PHY0           BIT(0)
+#define S5PV210_URSTCON_OTG_HLINK      BIT(1)
+#define S5PV210_URSTCON_OTG_PHYLINK    BIT(2)
+#define S5PV210_URSTCON_PHY1_ALL       BIT(3)
+#define S5PV210_URSTCON_HOST_LINK_ALL  BIT(4)
+
+/* Isolation, configured in the power management unit */
+#define S5PV210_USB_ISOL_OFFSET                0x680c
+#define S5PV210_USB_ISOL_DEVICE                BIT(0)
+#define S5PV210_USB_ISOL_HOST          BIT(1)
+
+
+enum s5pv210_phy_id {
+       S5PV210_DEVICE,
+       S5PV210_HOST,
+       S5PV210_NUM_PHYS,
+};
+
+/*
+ * s5pv210_rate_to_clk() converts the supplied clock rate to the value that
+ * can be written to the phy register.
+ */
+static int s5pv210_rate_to_clk(unsigned long rate, u32 *reg)
+{
+       switch (rate) {
+       case 12 * MHZ:
+               *reg = S5PV210_UPHYCLK_PHYFSEL_12MHZ;
+               break;
+       case 24 * MHZ:
+               *reg = S5PV210_UPHYCLK_PHYFSEL_24MHZ;
+               break;
+       case 48 * MHZ:
+               *reg = S5PV210_UPHYCLK_PHYFSEL_48MHZ;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+static void s5pv210_isol(struct samsung_usb2_phy_instance *inst, bool on)
+{
+       struct samsung_usb2_phy_driver *drv = inst->drv;
+       u32 mask;
+
+       switch (inst->cfg->id) {
+       case S5PV210_DEVICE:
+               mask = S5PV210_USB_ISOL_DEVICE;
+               break;
+       case S5PV210_HOST:
+               mask = S5PV210_USB_ISOL_HOST;
+               break;
+       default:
+               return;
+       };
+
+       regmap_update_bits(drv->reg_pmu, S5PV210_USB_ISOL_OFFSET,
+                                                       mask, on ? 0 : mask);
+}
+
+static void s5pv210_phy_pwr(struct samsung_usb2_phy_instance *inst, bool on)
+{
+       struct samsung_usb2_phy_driver *drv = inst->drv;
+       u32 rstbits = 0;
+       u32 phypwr = 0;
+       u32 rst;
+       u32 pwr;
+
+       switch (inst->cfg->id) {
+       case S5PV210_DEVICE:
+               phypwr =        S5PV210_UPHYPWR_PHY0;
+               rstbits =       S5PV210_URSTCON_PHY0;
+               break;
+       case S5PV210_HOST:
+               phypwr =        S5PV210_UPHYPWR_PHY1;
+               rstbits =       S5PV210_URSTCON_PHY1_ALL |
+                               S5PV210_URSTCON_HOST_LINK_ALL;
+               break;
+       };
+
+       if (on) {
+               writel(drv->ref_reg_val, drv->reg_phy + S5PV210_UPHYCLK);
+
+               pwr = readl(drv->reg_phy + S5PV210_UPHYPWR);
+               pwr &= ~phypwr;
+               writel(pwr, drv->reg_phy + S5PV210_UPHYPWR);
+
+               rst = readl(drv->reg_phy + S5PV210_UPHYRST);
+               rst |= rstbits;
+               writel(rst, drv->reg_phy + S5PV210_UPHYRST);
+               udelay(10);
+               rst &= ~rstbits;
+               writel(rst, drv->reg_phy + S5PV210_UPHYRST);
+       } else {
+               pwr = readl(drv->reg_phy + S5PV210_UPHYPWR);
+               pwr |= phypwr;
+               writel(pwr, drv->reg_phy + S5PV210_UPHYPWR);
+       }
+}
+
+static int s5pv210_power_on(struct samsung_usb2_phy_instance *inst)
+{
+       s5pv210_isol(inst, 0);
+       s5pv210_phy_pwr(inst, 1);
+
+       return 0;
+}
+
+static int s5pv210_power_off(struct samsung_usb2_phy_instance *inst)
+{
+       s5pv210_phy_pwr(inst, 0);
+       s5pv210_isol(inst, 1);
+
+       return 0;
+}
+
+static const struct samsung_usb2_common_phy s5pv210_phys[S5PV210_NUM_PHYS] = {
+       [S5PV210_DEVICE] = {
+               .label          = "device",
+               .id             = S5PV210_DEVICE,
+               .power_on       = s5pv210_power_on,
+               .power_off      = s5pv210_power_off,
+       },
+       [S5PV210_HOST] = {
+               .label          = "host",
+               .id             = S5PV210_HOST,
+               .power_on       = s5pv210_power_on,
+               .power_off      = s5pv210_power_off,
+       },
+};
+
+const struct samsung_usb2_phy_config s5pv210_usb2_phy_config = {
+       .num_phys       = ARRAY_SIZE(s5pv210_phys),
+       .phys           = s5pv210_phys,
+       .rate_to_clk    = s5pv210_rate_to_clk,
+};
index ae30640a411d60091b08138a9dbe4726667c2b1d..3732ca25e09fbf9f0b5eb20abfc2983f8bfe4556 100644 (file)
@@ -110,6 +110,12 @@ static const struct of_device_id samsung_usb2_phy_of_match[] = {
                .compatible = "samsung,exynos5250-usb2-phy",
                .data = &exynos5250_usb2_phy_config,
        },
+#endif
+#ifdef CONFIG_PHY_S5PV210_USB2
+       {
+               .compatible = "samsung,s5pv210-usb2-phy",
+               .data = &s5pv210_usb2_phy_config,
+       },
 #endif
        { },
 };
index b03da0ef39ac233a1ec605e0103fd48e82e4cac2..44bead9b8f34bb426440431217fa989a0f839734 100644 (file)
@@ -67,4 +67,5 @@ extern const struct samsung_usb2_phy_config exynos3250_usb2_phy_config;
 extern const struct samsung_usb2_phy_config exynos4210_usb2_phy_config;
 extern const struct samsung_usb2_phy_config exynos4x12_usb2_phy_config;
 extern const struct samsung_usb2_phy_config exynos5250_usb2_phy_config;
+extern const struct samsung_usb2_phy_config s5pv210_usb2_phy_config;
 #endif
diff --git a/drivers/phy/phy-spear1310-miphy.c b/drivers/phy/phy-spear1310-miphy.c
new file mode 100644 (file)
index 0000000..6dcbfcd
--- /dev/null
@@ -0,0 +1,274 @@
+/*
+ * ST SPEAr1310-miphy driver
+ *
+ * Copyright (C) 2014 ST Microelectronics
+ * Pratyush Anand <pratyush.anand@st.com>
+ * Mohit Kumar <mohit.kumar@st.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include <linux/bitops.h>
+#include <linux/delay.h>
+#include <linux/dma-mapping.h>
+#include <linux/kernel.h>
+#include <linux/mfd/syscon.h>
+#include <linux/module.h>
+#include <linux/of_device.h>
+#include <linux/phy/phy.h>
+#include <linux/regmap.h>
+
+/* SPEAr1310 Registers */
+#define SPEAR1310_PCIE_SATA_CFG                        0x3A4
+       #define SPEAR1310_PCIE_SATA2_SEL_PCIE           (0 << 31)
+       #define SPEAR1310_PCIE_SATA1_SEL_PCIE           (0 << 30)
+       #define SPEAR1310_PCIE_SATA0_SEL_PCIE           (0 << 29)
+       #define SPEAR1310_PCIE_SATA2_SEL_SATA           BIT(31)
+       #define SPEAR1310_PCIE_SATA1_SEL_SATA           BIT(30)
+       #define SPEAR1310_PCIE_SATA0_SEL_SATA           BIT(29)
+       #define SPEAR1310_SATA2_CFG_TX_CLK_EN           BIT(27)
+       #define SPEAR1310_SATA2_CFG_RX_CLK_EN           BIT(26)
+       #define SPEAR1310_SATA2_CFG_POWERUP_RESET       BIT(25)
+       #define SPEAR1310_SATA2_CFG_PM_CLK_EN           BIT(24)
+       #define SPEAR1310_SATA1_CFG_TX_CLK_EN           BIT(23)
+       #define SPEAR1310_SATA1_CFG_RX_CLK_EN           BIT(22)
+       #define SPEAR1310_SATA1_CFG_POWERUP_RESET       BIT(21)
+       #define SPEAR1310_SATA1_CFG_PM_CLK_EN           BIT(20)
+       #define SPEAR1310_SATA0_CFG_TX_CLK_EN           BIT(19)
+       #define SPEAR1310_SATA0_CFG_RX_CLK_EN           BIT(18)
+       #define SPEAR1310_SATA0_CFG_POWERUP_RESET       BIT(17)
+       #define SPEAR1310_SATA0_CFG_PM_CLK_EN           BIT(16)
+       #define SPEAR1310_PCIE2_CFG_DEVICE_PRESENT      BIT(11)
+       #define SPEAR1310_PCIE2_CFG_POWERUP_RESET       BIT(10)
+       #define SPEAR1310_PCIE2_CFG_CORE_CLK_EN         BIT(9)
+       #define SPEAR1310_PCIE2_CFG_AUX_CLK_EN          BIT(8)
+       #define SPEAR1310_PCIE1_CFG_DEVICE_PRESENT      BIT(7)
+       #define SPEAR1310_PCIE1_CFG_POWERUP_RESET       BIT(6)
+       #define SPEAR1310_PCIE1_CFG_CORE_CLK_EN         BIT(5)
+       #define SPEAR1310_PCIE1_CFG_AUX_CLK_EN          BIT(4)
+       #define SPEAR1310_PCIE0_CFG_DEVICE_PRESENT      BIT(3)
+       #define SPEAR1310_PCIE0_CFG_POWERUP_RESET       BIT(2)
+       #define SPEAR1310_PCIE0_CFG_CORE_CLK_EN         BIT(1)
+       #define SPEAR1310_PCIE0_CFG_AUX_CLK_EN          BIT(0)
+
+       #define SPEAR1310_PCIE_CFG_MASK(x) ((0xF << (x * 4)) | BIT((x + 29)))
+       #define SPEAR1310_SATA_CFG_MASK(x) ((0xF << (x * 4 + 16)) | \
+                       BIT((x + 29)))
+       #define SPEAR1310_PCIE_CFG_VAL(x) \
+                       (SPEAR1310_PCIE_SATA##x##_SEL_PCIE | \
+                       SPEAR1310_PCIE##x##_CFG_AUX_CLK_EN | \
+                       SPEAR1310_PCIE##x##_CFG_CORE_CLK_EN | \
+                       SPEAR1310_PCIE##x##_CFG_POWERUP_RESET | \
+                       SPEAR1310_PCIE##x##_CFG_DEVICE_PRESENT)
+       #define SPEAR1310_SATA_CFG_VAL(x) \
+                       (SPEAR1310_PCIE_SATA##x##_SEL_SATA | \
+                       SPEAR1310_SATA##x##_CFG_PM_CLK_EN | \
+                       SPEAR1310_SATA##x##_CFG_POWERUP_RESET | \
+                       SPEAR1310_SATA##x##_CFG_RX_CLK_EN | \
+                       SPEAR1310_SATA##x##_CFG_TX_CLK_EN)
+
+#define SPEAR1310_PCIE_MIPHY_CFG_1             0x3A8
+       #define SPEAR1310_MIPHY_DUAL_OSC_BYPASS_EXT     BIT(31)
+       #define SPEAR1310_MIPHY_DUAL_CLK_REF_DIV2       BIT(28)
+       #define SPEAR1310_MIPHY_DUAL_PLL_RATIO_TOP(x)   (x << 16)
+       #define SPEAR1310_MIPHY_SINGLE_OSC_BYPASS_EXT   BIT(15)
+       #define SPEAR1310_MIPHY_SINGLE_CLK_REF_DIV2     BIT(12)
+       #define SPEAR1310_MIPHY_SINGLE_PLL_RATIO_TOP(x) (x << 0)
+       #define SPEAR1310_PCIE_SATA_MIPHY_CFG_SATA_MASK (0xFFFF)
+       #define SPEAR1310_PCIE_SATA_MIPHY_CFG_PCIE_MASK (0xFFFF << 16)
+       #define SPEAR1310_PCIE_SATA_MIPHY_CFG_SATA \
+                       (SPEAR1310_MIPHY_DUAL_OSC_BYPASS_EXT | \
+                       SPEAR1310_MIPHY_DUAL_CLK_REF_DIV2 | \
+                       SPEAR1310_MIPHY_DUAL_PLL_RATIO_TOP(60) | \
+                       SPEAR1310_MIPHY_SINGLE_OSC_BYPASS_EXT | \
+                       SPEAR1310_MIPHY_SINGLE_CLK_REF_DIV2 | \
+                       SPEAR1310_MIPHY_SINGLE_PLL_RATIO_TOP(60))
+       #define SPEAR1310_PCIE_SATA_MIPHY_CFG_SATA_25M_CRYSTAL_CLK \
+                       (SPEAR1310_MIPHY_SINGLE_PLL_RATIO_TOP(120))
+       #define SPEAR1310_PCIE_SATA_MIPHY_CFG_PCIE \
+                       (SPEAR1310_MIPHY_DUAL_OSC_BYPASS_EXT | \
+                       SPEAR1310_MIPHY_DUAL_PLL_RATIO_TOP(25) | \
+                       SPEAR1310_MIPHY_SINGLE_OSC_BYPASS_EXT | \
+                       SPEAR1310_MIPHY_SINGLE_PLL_RATIO_TOP(25))
+
+#define SPEAR1310_PCIE_MIPHY_CFG_2             0x3AC
+
+enum spear1310_miphy_mode {
+       SATA,
+       PCIE,
+};
+
+struct spear1310_miphy_priv {
+       /* instance id of this phy */
+       u32                             id;
+       /* phy mode: 0 for SATA 1 for PCIe */
+       enum spear1310_miphy_mode       mode;
+       /* regmap for any soc specific misc registers */
+       struct regmap                   *misc;
+       /* phy struct pointer */
+       struct phy                      *phy;
+};
+
+static int spear1310_miphy_pcie_init(struct spear1310_miphy_priv *priv)
+{
+       u32 val;
+
+       regmap_update_bits(priv->misc, SPEAR1310_PCIE_MIPHY_CFG_1,
+                          SPEAR1310_PCIE_SATA_MIPHY_CFG_PCIE_MASK,
+                          SPEAR1310_PCIE_SATA_MIPHY_CFG_PCIE);
+
+       switch (priv->id) {
+       case 0:
+               val = SPEAR1310_PCIE_CFG_VAL(0);
+               break;
+       case 1:
+               val = SPEAR1310_PCIE_CFG_VAL(1);
+               break;
+       case 2:
+               val = SPEAR1310_PCIE_CFG_VAL(2);
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       regmap_update_bits(priv->misc, SPEAR1310_PCIE_SATA_CFG,
+                          SPEAR1310_PCIE_CFG_MASK(priv->id), val);
+
+       return 0;
+}
+
+static int spear1310_miphy_pcie_exit(struct spear1310_miphy_priv *priv)
+{
+       regmap_update_bits(priv->misc, SPEAR1310_PCIE_SATA_CFG,
+                          SPEAR1310_PCIE_CFG_MASK(priv->id), 0);
+
+       regmap_update_bits(priv->misc, SPEAR1310_PCIE_MIPHY_CFG_1,
+                          SPEAR1310_PCIE_SATA_MIPHY_CFG_PCIE_MASK, 0);
+
+       return 0;
+}
+
+static int spear1310_miphy_init(struct phy *phy)
+{
+       struct spear1310_miphy_priv *priv = phy_get_drvdata(phy);
+       int ret = 0;
+
+       if (priv->mode == PCIE)
+               ret = spear1310_miphy_pcie_init(priv);
+
+       return ret;
+}
+
+static int spear1310_miphy_exit(struct phy *phy)
+{
+       struct spear1310_miphy_priv *priv = phy_get_drvdata(phy);
+       int ret = 0;
+
+       if (priv->mode == PCIE)
+               ret = spear1310_miphy_pcie_exit(priv);
+
+       return ret;
+}
+
+static const struct of_device_id spear1310_miphy_of_match[] = {
+       { .compatible = "st,spear1310-miphy" },
+       { },
+};
+MODULE_DEVICE_TABLE(of, spear1310_miphy_of_match);
+
+static struct phy_ops spear1310_miphy_ops = {
+       .init = spear1310_miphy_init,
+       .exit = spear1310_miphy_exit,
+       .owner = THIS_MODULE,
+};
+
+static struct phy *spear1310_miphy_xlate(struct device *dev,
+                                        struct of_phandle_args *args)
+{
+       struct spear1310_miphy_priv *priv = dev_get_drvdata(dev);
+
+       if (args->args_count < 1) {
+               dev_err(dev, "DT did not pass correct no of args\n");
+               return NULL;
+       }
+
+       priv->mode = args->args[0];
+
+       if (priv->mode != SATA && priv->mode != PCIE) {
+               dev_err(dev, "DT did not pass correct phy mode\n");
+               return NULL;
+       }
+
+       return priv->phy;
+}
+
+static int spear1310_miphy_probe(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct spear1310_miphy_priv *priv;
+       struct phy_provider *phy_provider;
+
+       priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
+       if (!priv) {
+               dev_err(dev, "can't alloc spear1310_miphy private date memory\n");
+               return -ENOMEM;
+       }
+
+       priv->misc =
+               syscon_regmap_lookup_by_phandle(dev->of_node, "misc");
+       if (IS_ERR(priv->misc)) {
+               dev_err(dev, "failed to find misc regmap\n");
+               return PTR_ERR(priv->misc);
+       }
+
+       if (of_property_read_u32(dev->of_node, "phy-id", &priv->id)) {
+               dev_err(dev, "failed to find phy id\n");
+               return -EINVAL;
+       }
+
+       priv->phy = devm_phy_create(dev, NULL, &spear1310_miphy_ops, NULL);
+       if (IS_ERR(priv->phy)) {
+               dev_err(dev, "failed to create SATA PCIe PHY\n");
+               return PTR_ERR(priv->phy);
+       }
+
+       dev_set_drvdata(dev, priv);
+       phy_set_drvdata(priv->phy, priv);
+
+       phy_provider =
+               devm_of_phy_provider_register(dev, spear1310_miphy_xlate);
+       if (IS_ERR(phy_provider)) {
+               dev_err(dev, "failed to register phy provider\n");
+               return PTR_ERR(phy_provider);
+       }
+
+       return 0;
+}
+
+static struct platform_driver spear1310_miphy_driver = {
+       .probe          = spear1310_miphy_probe,
+       .driver = {
+               .name = "spear1310-miphy",
+               .owner = THIS_MODULE,
+               .of_match_table = of_match_ptr(spear1310_miphy_of_match),
+       },
+};
+
+static int __init spear1310_miphy_phy_init(void)
+{
+       return platform_driver_register(&spear1310_miphy_driver);
+}
+module_init(spear1310_miphy_phy_init);
+
+static void __exit spear1310_miphy_phy_exit(void)
+{
+       platform_driver_unregister(&spear1310_miphy_driver);
+}
+module_exit(spear1310_miphy_phy_exit);
+
+MODULE_DESCRIPTION("ST SPEAR1310-MIPHY driver");
+MODULE_AUTHOR("Pratyush Anand <pratyush.anand@st.com>");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/phy/phy-spear1340-miphy.c b/drivers/phy/phy-spear1340-miphy.c
new file mode 100644 (file)
index 0000000..7135ba2
--- /dev/null
@@ -0,0 +1,307 @@
+/*
+ * ST spear1340-miphy driver
+ *
+ * Copyright (C) 2014 ST Microelectronics
+ * Pratyush Anand <pratyush.anand@st.com>
+ * Mohit Kumar <mohit.kumar@st.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include <linux/bitops.h>
+#include <linux/delay.h>
+#include <linux/dma-mapping.h>
+#include <linux/kernel.h>
+#include <linux/mfd/syscon.h>
+#include <linux/module.h>
+#include <linux/of_device.h>
+#include <linux/phy/phy.h>
+#include <linux/regmap.h>
+
+/* SPEAr1340 Registers */
+/* Power Management Registers */
+#define SPEAR1340_PCM_CFG                      0x100
+       #define SPEAR1340_PCM_CFG_SATA_POWER_EN         BIT(11)
+#define SPEAR1340_PCM_WKUP_CFG                 0x104
+#define SPEAR1340_SWITCH_CTR                   0x108
+
+#define SPEAR1340_PERIP1_SW_RST                        0x318
+       #define SPEAR1340_PERIP1_SW_RSATA               BIT(12)
+#define SPEAR1340_PERIP2_SW_RST                        0x31C
+#define SPEAR1340_PERIP3_SW_RST                        0x320
+
+/* PCIE - SATA configuration registers */
+#define SPEAR1340_PCIE_SATA_CFG                        0x424
+       /* PCIE CFG MASks */
+       #define SPEAR1340_PCIE_CFG_DEVICE_PRESENT       BIT(11)
+       #define SPEAR1340_PCIE_CFG_POWERUP_RESET        BIT(10)
+       #define SPEAR1340_PCIE_CFG_CORE_CLK_EN          BIT(9)
+       #define SPEAR1340_PCIE_CFG_AUX_CLK_EN           BIT(8)
+       #define SPEAR1340_SATA_CFG_TX_CLK_EN            BIT(4)
+       #define SPEAR1340_SATA_CFG_RX_CLK_EN            BIT(3)
+       #define SPEAR1340_SATA_CFG_POWERUP_RESET        BIT(2)
+       #define SPEAR1340_SATA_CFG_PM_CLK_EN            BIT(1)
+       #define SPEAR1340_PCIE_SATA_SEL_PCIE            (0)
+       #define SPEAR1340_PCIE_SATA_SEL_SATA            (1)
+       #define SPEAR1340_PCIE_SATA_CFG_MASK            0xF1F
+       #define SPEAR1340_PCIE_CFG_VAL  (SPEAR1340_PCIE_SATA_SEL_PCIE | \
+                       SPEAR1340_PCIE_CFG_AUX_CLK_EN | \
+                       SPEAR1340_PCIE_CFG_CORE_CLK_EN | \
+                       SPEAR1340_PCIE_CFG_POWERUP_RESET | \
+                       SPEAR1340_PCIE_CFG_DEVICE_PRESENT)
+       #define SPEAR1340_SATA_CFG_VAL  (SPEAR1340_PCIE_SATA_SEL_SATA | \
+                       SPEAR1340_SATA_CFG_PM_CLK_EN | \
+                       SPEAR1340_SATA_CFG_POWERUP_RESET | \
+                       SPEAR1340_SATA_CFG_RX_CLK_EN | \
+                       SPEAR1340_SATA_CFG_TX_CLK_EN)
+
+#define SPEAR1340_PCIE_MIPHY_CFG               0x428
+       #define SPEAR1340_MIPHY_OSC_BYPASS_EXT          BIT(31)
+       #define SPEAR1340_MIPHY_CLK_REF_DIV2            BIT(27)
+       #define SPEAR1340_MIPHY_CLK_REF_DIV4            (2 << 27)
+       #define SPEAR1340_MIPHY_CLK_REF_DIV8            (3 << 27)
+       #define SPEAR1340_MIPHY_PLL_RATIO_TOP(x)        (x << 0)
+       #define SPEAR1340_PCIE_MIPHY_CFG_MASK           0xF80000FF
+       #define SPEAR1340_PCIE_SATA_MIPHY_CFG_SATA \
+                       (SPEAR1340_MIPHY_OSC_BYPASS_EXT | \
+                       SPEAR1340_MIPHY_CLK_REF_DIV2 | \
+                       SPEAR1340_MIPHY_PLL_RATIO_TOP(60))
+       #define SPEAR1340_PCIE_SATA_MIPHY_CFG_SATA_25M_CRYSTAL_CLK \
+                       (SPEAR1340_MIPHY_PLL_RATIO_TOP(120))
+       #define SPEAR1340_PCIE_SATA_MIPHY_CFG_PCIE \
+                       (SPEAR1340_MIPHY_OSC_BYPASS_EXT | \
+                       SPEAR1340_MIPHY_PLL_RATIO_TOP(25))
+
+enum spear1340_miphy_mode {
+       SATA,
+       PCIE,
+};
+
+struct spear1340_miphy_priv {
+       /* phy mode: 0 for SATA 1 for PCIe */
+       enum spear1340_miphy_mode       mode;
+       /* regmap for any soc specific misc registers */
+       struct regmap                   *misc;
+       /* phy struct pointer */
+       struct phy                      *phy;
+};
+
+static int spear1340_miphy_sata_init(struct spear1340_miphy_priv *priv)
+{
+       regmap_update_bits(priv->misc, SPEAR1340_PCIE_SATA_CFG,
+                          SPEAR1340_PCIE_SATA_CFG_MASK,
+                          SPEAR1340_SATA_CFG_VAL);
+       regmap_update_bits(priv->misc, SPEAR1340_PCIE_MIPHY_CFG,
+                          SPEAR1340_PCIE_MIPHY_CFG_MASK,
+                          SPEAR1340_PCIE_SATA_MIPHY_CFG_SATA_25M_CRYSTAL_CLK);
+       /* Switch on sata power domain */
+       regmap_update_bits(priv->misc, SPEAR1340_PCM_CFG,
+                          SPEAR1340_PCM_CFG_SATA_POWER_EN,
+                          SPEAR1340_PCM_CFG_SATA_POWER_EN);
+       /* Wait for SATA power domain on */
+       msleep(20);
+
+       /* Disable PCIE SATA Controller reset */
+       regmap_update_bits(priv->misc, SPEAR1340_PERIP1_SW_RST,
+                          SPEAR1340_PERIP1_SW_RSATA, 0);
+       /* Wait for SATA reset de-assert completion */
+       msleep(20);
+
+       return 0;
+}
+
+static int spear1340_miphy_sata_exit(struct spear1340_miphy_priv *priv)
+{
+       regmap_update_bits(priv->misc, SPEAR1340_PCIE_SATA_CFG,
+                          SPEAR1340_PCIE_SATA_CFG_MASK, 0);
+       regmap_update_bits(priv->misc, SPEAR1340_PCIE_MIPHY_CFG,
+                          SPEAR1340_PCIE_MIPHY_CFG_MASK, 0);
+
+       /* Enable PCIE SATA Controller reset */
+       regmap_update_bits(priv->misc, SPEAR1340_PERIP1_SW_RST,
+                          SPEAR1340_PERIP1_SW_RSATA,
+                          SPEAR1340_PERIP1_SW_RSATA);
+       /* Wait for SATA power domain off */
+       msleep(20);
+       /* Switch off sata power domain */
+       regmap_update_bits(priv->misc, SPEAR1340_PCM_CFG,
+                          SPEAR1340_PCM_CFG_SATA_POWER_EN, 0);
+       /* Wait for SATA reset assert completion */
+       msleep(20);
+
+       return 0;
+}
+
+static int spear1340_miphy_pcie_init(struct spear1340_miphy_priv *priv)
+{
+       regmap_update_bits(priv->misc, SPEAR1340_PCIE_MIPHY_CFG,
+                          SPEAR1340_PCIE_MIPHY_CFG_MASK,
+                          SPEAR1340_PCIE_SATA_MIPHY_CFG_PCIE);
+       regmap_update_bits(priv->misc, SPEAR1340_PCIE_SATA_CFG,
+                          SPEAR1340_PCIE_SATA_CFG_MASK,
+                          SPEAR1340_PCIE_CFG_VAL);
+
+       return 0;
+}
+
+static int spear1340_miphy_pcie_exit(struct spear1340_miphy_priv *priv)
+{
+       regmap_update_bits(priv->misc, SPEAR1340_PCIE_MIPHY_CFG,
+                          SPEAR1340_PCIE_MIPHY_CFG_MASK, 0);
+       regmap_update_bits(priv->misc, SPEAR1340_PCIE_SATA_CFG,
+                          SPEAR1340_PCIE_SATA_CFG_MASK, 0);
+
+       return 0;
+}
+
+static int spear1340_miphy_init(struct phy *phy)
+{
+       struct spear1340_miphy_priv *priv = phy_get_drvdata(phy);
+       int ret = 0;
+
+       if (priv->mode == SATA)
+               ret = spear1340_miphy_sata_init(priv);
+       else if (priv->mode == PCIE)
+               ret = spear1340_miphy_pcie_init(priv);
+
+       return ret;
+}
+
+static int spear1340_miphy_exit(struct phy *phy)
+{
+       struct spear1340_miphy_priv *priv = phy_get_drvdata(phy);
+       int ret = 0;
+
+       if (priv->mode == SATA)
+               ret = spear1340_miphy_sata_exit(priv);
+       else if (priv->mode == PCIE)
+               ret = spear1340_miphy_pcie_exit(priv);
+
+       return ret;
+}
+
+static const struct of_device_id spear1340_miphy_of_match[] = {
+       { .compatible = "st,spear1340-miphy" },
+       { },
+};
+MODULE_DEVICE_TABLE(of, spear1340_miphy_of_match);
+
+static struct phy_ops spear1340_miphy_ops = {
+       .init = spear1340_miphy_init,
+       .exit = spear1340_miphy_exit,
+       .owner = THIS_MODULE,
+};
+
+#ifdef CONFIG_PM_SLEEP
+static int spear1340_miphy_suspend(struct device *dev)
+{
+       struct spear1340_miphy_priv *priv = dev_get_drvdata(dev);
+       int ret = 0;
+
+       if (priv->mode == SATA)
+               ret = spear1340_miphy_sata_exit(priv);
+
+       return ret;
+}
+
+static int spear1340_miphy_resume(struct device *dev)
+{
+       struct spear1340_miphy_priv *priv = dev_get_drvdata(dev);
+       int ret = 0;
+
+       if (priv->mode == SATA)
+               ret = spear1340_miphy_sata_init(priv);
+
+       return ret;
+}
+#endif
+
+static SIMPLE_DEV_PM_OPS(spear1340_miphy_pm_ops, spear1340_miphy_suspend,
+                        spear1340_miphy_resume);
+
+static struct phy *spear1340_miphy_xlate(struct device *dev,
+                                        struct of_phandle_args *args)
+{
+       struct spear1340_miphy_priv *priv = dev_get_drvdata(dev);
+
+       if (args->args_count < 1) {
+               dev_err(dev, "DT did not pass correct no of args\n");
+               return NULL;
+       }
+
+       priv->mode = args->args[0];
+
+       if (priv->mode != SATA && priv->mode != PCIE) {
+               dev_err(dev, "DT did not pass correct phy mode\n");
+               return NULL;
+       }
+
+       return priv->phy;
+}
+
+static int spear1340_miphy_probe(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct spear1340_miphy_priv *priv;
+       struct phy_provider *phy_provider;
+
+       priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
+       if (!priv) {
+               dev_err(dev, "can't alloc spear1340_miphy private date memory\n");
+               return -ENOMEM;
+       }
+
+       priv->misc =
+               syscon_regmap_lookup_by_phandle(dev->of_node, "misc");
+       if (IS_ERR(priv->misc)) {
+               dev_err(dev, "failed to find misc regmap\n");
+               return PTR_ERR(priv->misc);
+       }
+
+       priv->phy = devm_phy_create(dev, NULL, &spear1340_miphy_ops, NULL);
+       if (IS_ERR(priv->phy)) {
+               dev_err(dev, "failed to create SATA PCIe PHY\n");
+               return PTR_ERR(priv->phy);
+       }
+
+       dev_set_drvdata(dev, priv);
+       phy_set_drvdata(priv->phy, priv);
+
+       phy_provider =
+               devm_of_phy_provider_register(dev, spear1340_miphy_xlate);
+       if (IS_ERR(phy_provider)) {
+               dev_err(dev, "failed to register phy provider\n");
+               return PTR_ERR(phy_provider);
+       }
+
+       return 0;
+}
+
+static struct platform_driver spear1340_miphy_driver = {
+       .probe          = spear1340_miphy_probe,
+       .driver = {
+               .name = "spear1340-miphy",
+               .owner = THIS_MODULE,
+               .pm = &spear1340_miphy_pm_ops,
+               .of_match_table = of_match_ptr(spear1340_miphy_of_match),
+       },
+};
+
+static int __init spear1340_miphy_phy_init(void)
+{
+       return platform_driver_register(&spear1340_miphy_driver);
+}
+module_init(spear1340_miphy_phy_init);
+
+static void __exit spear1340_miphy_phy_exit(void)
+{
+       platform_driver_unregister(&spear1340_miphy_driver);
+}
+module_exit(spear1340_miphy_phy_exit);
+
+MODULE_DESCRIPTION("ST SPEAR1340-MIPHY driver");
+MODULE_AUTHOR("Pratyush Anand <pratyush.anand@st.com>");
+MODULE_LICENSE("GPL v2");
index 0042ccb46b9a1277fa2824845e2affb9844505a4..bfd2c2e9f6cd79b03c42dab60fc0e2dd81b4b22f 100644 (file)
@@ -11,10 +11,10 @@ menu "Pin controllers"
        depends on PINCTRL
 
 config PINMUX
-       bool "Support pin multiplexing controllers"
+       bool "Support pin multiplexing controllers" if COMPILE_TEST
 
 config PINCONF
-       bool "Support pin configuration controllers"
+       bool "Support pin configuration controllers" if COMPILE_TEST
 
 config GENERIC_PINCONF
        bool
@@ -26,29 +26,6 @@ config DEBUG_PINCTRL
        help
          Say Y here to add some extra checks and diagnostics to PINCTRL calls.
 
-config PINCTRL_ABX500
-       bool "ST-Ericsson ABx500 family Mixed Signal Circuit gpio functions"
-       depends on AB8500_CORE
-       select GENERIC_PINCONF
-       help
-         Select this to enable the ABx500 family IC GPIO driver
-
-config PINCTRL_AB8500
-       bool "AB8500 pin controller driver"
-       depends on PINCTRL_ABX500 && ARCH_U8500
-
-config PINCTRL_AB8540
-       bool "AB8540 pin controller driver"
-       depends on PINCTRL_ABX500 && ARCH_U8500
-
-config PINCTRL_AB9540
-       bool "AB9540 pin controller driver"
-       depends on PINCTRL_ABX500 && ARCH_U8500
-
-config PINCTRL_AB8505
-       bool "AB8505 pin controller driver"
-       depends on PINCTRL_ABX500 && ARCH_U8500
-
 config PINCTRL_ADI2
        bool "ADI pin controller driver"
        depends on BLACKFIN
@@ -93,7 +70,7 @@ config PINCTRL_AT91
 config PINCTRL_BAYTRAIL
        bool "Intel Baytrail GPIO pin control"
        depends on GPIOLIB && ACPI && X86
-       select IRQ_DOMAIN
+       select GPIOLIB_IRQCHIP
        help
          driver for memory mapped GPIO functionality on Intel Baytrail
          platforms. Supports 3 banks with 102, 28 and 44 gpios.
@@ -130,6 +107,13 @@ config PINCTRL_IMX1_CORE
        select PINMUX
        select PINCONF
 
+config PINCTRL_IMX1
+       bool "IMX1 pinctrl driver"
+       depends on SOC_IMX1
+       select PINCTRL_IMX1_CORE
+       help
+         Say Y here to enable the imx1 pinctrl driver
+
 config PINCTRL_IMX27
        bool "IMX27 pinctrl driver"
        depends on SOC_IMX27
@@ -226,58 +210,6 @@ config PINCTRL_IMX28
        bool
        select PINCTRL_MXS
 
-config PINCTRL_MSM
-       bool
-       select PINMUX
-       select PINCONF
-       select GENERIC_PINCONF
-       select GPIOLIB_IRQCHIP
-
-config PINCTRL_APQ8064
-       tristate "Qualcomm APQ8064 pin controller driver"
-       depends on GPIOLIB && OF
-       select PINCTRL_MSM
-       help
-         This is the pinctrl, pinmux, pinconf and gpiolib driver for the
-         Qualcomm TLMM block found in the Qualcomm APQ8064 platform.
-
-config PINCTRL_IPQ8064
-       tristate "Qualcomm IPQ8064 pin controller driver"
-       depends on GPIOLIB && OF
-       select PINCTRL_MSM
-       help
-         This is the pinctrl, pinmux, pinconf and gpiolib driver for the
-         Qualcomm TLMM block found in the Qualcomm IPQ8064 platform.
-
-config PINCTRL_MSM8X74
-       tristate "Qualcomm 8x74 pin controller driver"
-       depends on GPIOLIB && OF && (ARCH_QCOM || COMPILE_TEST)
-       select PINCTRL_MSM
-       help
-         This is the pinctrl, pinmux, pinconf and gpiolib driver for the
-         Qualcomm TLMM block found in the Qualcomm 8974 platform.
-
-config PINCTRL_NOMADIK
-       bool "Nomadik pin controller driver"
-       depends on ARCH_U8500 || ARCH_NOMADIK
-       select PINMUX
-       select PINCONF
-       select GPIOLIB
-       select OF_GPIO
-       select GPIOLIB_IRQCHIP
-
-config PINCTRL_STN8815
-       bool "STN8815 pin controller driver"
-       depends on PINCTRL_NOMADIK && ARCH_NOMADIK
-
-config PINCTRL_DB8500
-       bool "DB8500 pin controller driver"
-       depends on PINCTRL_NOMADIK && ARCH_U8500
-
-config PINCTRL_DB8540
-       bool "DB8540 pin controller driver"
-       depends on PINCTRL_NOMADIK && ARCH_U8500
-
 config PINCTRL_ROCKCHIP
        bool
        select PINMUX
@@ -328,6 +260,12 @@ config PINCTRL_TEGRA124
        bool
        select PINCTRL_TEGRA
 
+config PINCTRL_TEGRA_XUSB
+       def_bool y if ARCH_TEGRA
+       select GENERIC_PHY
+       select PINCONF
+       select PINMUX
+
 config PINCTRL_TZ1090
        bool "Toumaz Xenif TZ1090 pin control driver"
        depends on SOC_TZ1090
@@ -356,22 +294,6 @@ config PINCTRL_COH901
          COH 901 335 and COH 901 571/3. They contain 3, 5 or 7
          ports of 8 GPIO pins each.
 
-config PINCTRL_SAMSUNG
-       bool
-       select PINMUX
-       select PINCONF
-
-config PINCTRL_EXYNOS
-       bool "Pinctrl driver data for Samsung EXYNOS SoCs other than 5440"
-       depends on OF && GPIOLIB && (ARCH_EXYNOS || ARCH_S5PV210)
-       select PINCTRL_SAMSUNG
-
-config PINCTRL_EXYNOS5440
-       bool "Samsung EXYNOS5440 SoC pinctrl driver"
-       depends on SOC_EXYNOS5440
-       select PINMUX
-       select PINCONF
-
 config PINCTRL_PALMAS
        bool "Pinctrl driver for the PALMAS Series MFD devices"
        depends on OF && MFD_PALMAS
@@ -383,18 +305,11 @@ config PINCTRL_PALMAS
          open drain configuration for the Palmas series devices like
          TPS65913, TPS80036 etc.
 
-config PINCTRL_S3C24XX
-       bool "Samsung S3C24XX SoC pinctrl driver"
-       depends on ARCH_S3C24XX
-       select PINCTRL_SAMSUNG
-
-config PINCTRL_S3C64XX
-       bool "Samsung S3C64XX SoC pinctrl driver"
-       depends on ARCH_S3C64XX
-       select PINCTRL_SAMSUNG
-
 source "drivers/pinctrl/berlin/Kconfig"
 source "drivers/pinctrl/mvebu/Kconfig"
+source "drivers/pinctrl/nomadik/Kconfig"
+source "drivers/pinctrl/qcom/Kconfig"
+source "drivers/pinctrl/samsung/Kconfig"
 source "drivers/pinctrl/sh-pfc/Kconfig"
 source "drivers/pinctrl/spear/Kconfig"
 source "drivers/pinctrl/sunxi/Kconfig"
index c4b5d405b8f58d55628d4a80e544bb762efdf430..05d227508c9574cb72b0d11cbe65ff5c0c77f10e 100644 (file)
@@ -9,11 +9,6 @@ ifeq ($(CONFIG_OF),y)
 obj-$(CONFIG_PINCTRL)          += devicetree.o
 endif
 obj-$(CONFIG_GENERIC_PINCONF)  += pinconf-generic.o
-obj-$(CONFIG_PINCTRL_ABX500)   += pinctrl-abx500.o
-obj-$(CONFIG_PINCTRL_AB8500)   += pinctrl-ab8500.o
-obj-$(CONFIG_PINCTRL_AB8540)   += pinctrl-ab8540.o
-obj-$(CONFIG_PINCTRL_AB9540)   += pinctrl-ab9540.o
-obj-$(CONFIG_PINCTRL_AB8505)   += pinctrl-ab8505.o
 obj-$(CONFIG_PINCTRL_ADI2)     += pinctrl-adi2.o
 obj-$(CONFIG_PINCTRL_AS3722)   += pinctrl-as3722.o
 obj-$(CONFIG_PINCTRL_BF54x)    += pinctrl-adi2-bf54x.o
@@ -24,6 +19,7 @@ obj-$(CONFIG_PINCTRL_BAYTRAIL)        += pinctrl-baytrail.o
 obj-$(CONFIG_PINCTRL_BCM281XX) += pinctrl-bcm281xx.o
 obj-$(CONFIG_PINCTRL_IMX)      += pinctrl-imx.o
 obj-$(CONFIG_PINCTRL_IMX1_CORE)        += pinctrl-imx1-core.o
+obj-$(CONFIG_PINCTRL_IMX1)     += pinctrl-imx1.o
 obj-$(CONFIG_PINCTRL_IMX27)    += pinctrl-imx27.o
 obj-$(CONFIG_PINCTRL_IMX35)    += pinctrl-imx35.o
 obj-$(CONFIG_PINCTRL_IMX50)    += pinctrl-imx50.o
@@ -38,14 +34,6 @@ obj-$(CONFIG_PINCTRL_MXS)    += pinctrl-mxs.o
 obj-$(CONFIG_PINCTRL_IMX23)    += pinctrl-imx23.o
 obj-$(CONFIG_PINCTRL_IMX25)    += pinctrl-imx25.o
 obj-$(CONFIG_PINCTRL_IMX28)    += pinctrl-imx28.o
-obj-$(CONFIG_PINCTRL_MSM)      += pinctrl-msm.o
-obj-$(CONFIG_PINCTRL_APQ8064)  += pinctrl-apq8064.o
-obj-$(CONFIG_PINCTRL_IPQ8064)  += pinctrl-ipq8064.o
-obj-$(CONFIG_PINCTRL_MSM8X74)  += pinctrl-msm8x74.o
-obj-$(CONFIG_PINCTRL_NOMADIK)  += pinctrl-nomadik.o
-obj-$(CONFIG_PINCTRL_STN8815)  += pinctrl-nomadik-stn8815.o
-obj-$(CONFIG_PINCTRL_DB8500)   += pinctrl-nomadik-db8500.o
-obj-$(CONFIG_PINCTRL_DB8540)   += pinctrl-nomadik-db8540.o
 obj-$(CONFIG_PINCTRL_PALMAS)   += pinctrl-palmas.o
 obj-$(CONFIG_PINCTRL_ROCKCHIP) += pinctrl-rockchip.o
 obj-$(CONFIG_PINCTRL_SINGLE)   += pinctrl-single.o
@@ -55,15 +43,11 @@ obj-$(CONFIG_PINCTRL_TEGRA20)       += pinctrl-tegra20.o
 obj-$(CONFIG_PINCTRL_TEGRA30)  += pinctrl-tegra30.o
 obj-$(CONFIG_PINCTRL_TEGRA114) += pinctrl-tegra114.o
 obj-$(CONFIG_PINCTRL_TEGRA124) += pinctrl-tegra124.o
+obj-$(CONFIG_PINCTRL_TEGRA_XUSB)       += pinctrl-tegra-xusb.o
 obj-$(CONFIG_PINCTRL_TZ1090)   += pinctrl-tz1090.o
 obj-$(CONFIG_PINCTRL_TZ1090_PDC)       += pinctrl-tz1090-pdc.o
 obj-$(CONFIG_PINCTRL_U300)     += pinctrl-u300.o
 obj-$(CONFIG_PINCTRL_COH901)   += pinctrl-coh901.o
-obj-$(CONFIG_PINCTRL_SAMSUNG)  += pinctrl-samsung.o
-obj-$(CONFIG_PINCTRL_EXYNOS)   += pinctrl-exynos.o
-obj-$(CONFIG_PINCTRL_EXYNOS5440)       += pinctrl-exynos5440.o
-obj-$(CONFIG_PINCTRL_S3C24XX)  += pinctrl-s3c24xx.o
-obj-$(CONFIG_PINCTRL_S3C64XX)  += pinctrl-s3c64xx.o
 obj-$(CONFIG_PINCTRL_XWAY)     += pinctrl-xway.o
 obj-$(CONFIG_PINCTRL_LANTIQ)   += pinctrl-lantiq.o
 obj-$(CONFIG_PINCTRL_TB10X)    += pinctrl-tb10x.o
@@ -72,8 +56,11 @@ obj-$(CONFIG_PINCTRL_VF610)  += pinctrl-vf610.o
 
 obj-$(CONFIG_ARCH_BERLIN)      += berlin/
 obj-$(CONFIG_PLAT_ORION)        += mvebu/
+obj-y                          += nomadik/
+obj-$(CONFIG_ARCH_QCOM)                += qcom/
+obj-$(CONFIG_PLAT_SAMSUNG)     += samsung/
 obj-$(CONFIG_ARCH_SHMOBILE)    += sh-pfc/
 obj-$(CONFIG_SUPERH)           += sh-pfc/
 obj-$(CONFIG_PLAT_SPEAR)       += spear/
-obj-$(CONFIG_ARCH_VT8500)      += vt8500/
 obj-$(CONFIG_ARCH_SUNXI)       += sunxi/
+obj-$(CONFIG_ARCH_VT8500)      += vt8500/
index e09474ecde2346bd900d8f9d05ba3c26c63f9aa9..e4f65510c87e8928666e195b6b76e52cae9252b5 100644 (file)
@@ -992,29 +992,15 @@ int pinctrl_select_state(struct pinctrl *p, struct pinctrl_state *state)
 
        if (p->state) {
                /*
-                * The set of groups with a mux configuration in the old state
-                * may not be identical to the set of groups with a mux setting
-                * in the new state. While this might be unusual, it's entirely
-                * possible for the "user"-supplied mapping table to be written
-                * that way. For each group that was configured in the old state
-                * but not in the new state, this code puts that group into a
-                * safe/disabled state.
+                * For each pinmux setting in the old state, forget SW's record
+                * of mux owner for that pingroup. Any pingroups which are
+                * still owned by the new state will be re-acquired by the call
+                * to pinmux_enable_setting() in the loop below.
                 */
                list_for_each_entry(setting, &p->state->settings, node) {
-                       bool found = false;
                        if (setting->type != PIN_MAP_TYPE_MUX_GROUP)
                                continue;
-                       list_for_each_entry(setting2, &state->settings, node) {
-                               if (setting2->type != PIN_MAP_TYPE_MUX_GROUP)
-                                       continue;
-                               if (setting2->data.mux.group ==
-                                               setting->data.mux.group) {
-                                       found = true;
-                                       break;
-                               }
-                       }
-                       if (!found)
-                               pinmux_disable_setting(setting);
+                       pinmux_disable_setting(setting);
                }
        }
 
diff --git a/drivers/pinctrl/nomadik/Kconfig b/drivers/pinctrl/nomadik/Kconfig
new file mode 100644 (file)
index 0000000..d48a5aa
--- /dev/null
@@ -0,0 +1,51 @@
+if ARCH_U8500
+
+config PINCTRL_ABX500
+       bool "ST-Ericsson ABx500 family Mixed Signal Circuit gpio functions"
+       depends on AB8500_CORE
+       select GENERIC_PINCONF
+       help
+         Select this to enable the ABx500 family IC GPIO driver
+
+config PINCTRL_AB8500
+       bool "AB8500 pin controller driver"
+       depends on PINCTRL_ABX500 && ARCH_U8500
+
+config PINCTRL_AB8540
+       bool "AB8540 pin controller driver"
+       depends on PINCTRL_ABX500 && ARCH_U8500
+
+config PINCTRL_AB9540
+       bool "AB9540 pin controller driver"
+       depends on PINCTRL_ABX500 && ARCH_U8500
+
+config PINCTRL_AB8505
+       bool "AB8505 pin controller driver"
+       depends on PINCTRL_ABX500 && ARCH_U8500
+
+endif
+
+if (ARCH_U8500 || ARCH_NOMADIK)
+
+config PINCTRL_NOMADIK
+       bool "Nomadik pin controller driver"
+       depends on ARCH_U8500 || ARCH_NOMADIK
+       select PINMUX
+       select PINCONF
+       select GPIOLIB
+       select OF_GPIO
+       select GPIOLIB_IRQCHIP
+
+config PINCTRL_STN8815
+       bool "STN8815 pin controller driver"
+       depends on PINCTRL_NOMADIK && ARCH_NOMADIK
+
+config PINCTRL_DB8500
+       bool "DB8500 pin controller driver"
+       depends on PINCTRL_NOMADIK && ARCH_U8500
+
+config PINCTRL_DB8540
+       bool "DB8540 pin controller driver"
+       depends on PINCTRL_NOMADIK && ARCH_U8500
+
+endif
diff --git a/drivers/pinctrl/nomadik/Makefile b/drivers/pinctrl/nomadik/Makefile
new file mode 100644 (file)
index 0000000..30b27f1
--- /dev/null
@@ -0,0 +1,10 @@
+# Nomadik family pin control drivers
+obj-$(CONFIG_PINCTRL_ABX500)   += pinctrl-abx500.o
+obj-$(CONFIG_PINCTRL_AB8500)   += pinctrl-ab8500.o
+obj-$(CONFIG_PINCTRL_AB8540)   += pinctrl-ab8540.o
+obj-$(CONFIG_PINCTRL_AB9540)   += pinctrl-ab9540.o
+obj-$(CONFIG_PINCTRL_AB8505)   += pinctrl-ab8505.o
+obj-$(CONFIG_PINCTRL_NOMADIK)  += pinctrl-nomadik.o
+obj-$(CONFIG_PINCTRL_STN8815)  += pinctrl-nomadik-stn8815.o
+obj-$(CONFIG_PINCTRL_DB8500)   += pinctrl-nomadik-db8500.o
+obj-$(CONFIG_PINCTRL_DB8540)   += pinctrl-nomadik-db8540.o
diff --git a/drivers/pinctrl/nomadik/pinctrl-ab8500.c b/drivers/pinctrl/nomadik/pinctrl-ab8500.c
new file mode 100644 (file)
index 0000000..2ac2d0a
--- /dev/null
@@ -0,0 +1,485 @@
+/*
+ * Copyright (C) ST-Ericsson SA 2012
+ *
+ * Author: Patrice Chotard <patrice.chotard@stericsson.com> for ST-Ericsson.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/kernel.h>
+#include <linux/gpio.h>
+#include <linux/pinctrl/pinctrl.h>
+#include <linux/mfd/abx500/ab8500.h>
+#include "pinctrl-abx500.h"
+
+/* All the pins that can be used for GPIO and some other functions */
+#define ABX500_GPIO(offset)            (offset)
+
+#define AB8500_PIN_T10         ABX500_GPIO(1)
+#define AB8500_PIN_T9          ABX500_GPIO(2)
+#define AB8500_PIN_U9          ABX500_GPIO(3)
+#define AB8500_PIN_W2          ABX500_GPIO(4)
+/* hole */
+#define AB8500_PIN_Y18         ABX500_GPIO(6)
+#define AB8500_PIN_AA20                ABX500_GPIO(7)
+#define AB8500_PIN_W18         ABX500_GPIO(8)
+#define AB8500_PIN_AA19                ABX500_GPIO(9)
+#define AB8500_PIN_U17         ABX500_GPIO(10)
+#define AB8500_PIN_AA18                ABX500_GPIO(11)
+#define AB8500_PIN_U16         ABX500_GPIO(12)
+#define AB8500_PIN_W17         ABX500_GPIO(13)
+#define AB8500_PIN_F14         ABX500_GPIO(14)
+#define AB8500_PIN_B17         ABX500_GPIO(15)
+#define AB8500_PIN_F15         ABX500_GPIO(16)
+#define AB8500_PIN_P5          ABX500_GPIO(17)
+#define AB8500_PIN_R5          ABX500_GPIO(18)
+#define AB8500_PIN_U5          ABX500_GPIO(19)
+#define AB8500_PIN_T5          ABX500_GPIO(20)
+#define AB8500_PIN_H19         ABX500_GPIO(21)
+#define AB8500_PIN_G20         ABX500_GPIO(22)
+#define AB8500_PIN_G19         ABX500_GPIO(23)
+#define AB8500_PIN_T14         ABX500_GPIO(24)
+#define AB8500_PIN_R16         ABX500_GPIO(25)
+#define AB8500_PIN_M16         ABX500_GPIO(26)
+#define AB8500_PIN_J6          ABX500_GPIO(27)
+#define AB8500_PIN_K6          ABX500_GPIO(28)
+#define AB8500_PIN_G6          ABX500_GPIO(29)
+#define AB8500_PIN_H6          ABX500_GPIO(30)
+#define AB8500_PIN_F5          ABX500_GPIO(31)
+#define AB8500_PIN_G5          ABX500_GPIO(32)
+/* hole */
+#define AB8500_PIN_R17         ABX500_GPIO(34)
+#define AB8500_PIN_W15         ABX500_GPIO(35)
+#define AB8500_PIN_A17         ABX500_GPIO(36)
+#define AB8500_PIN_E15         ABX500_GPIO(37)
+#define AB8500_PIN_C17         ABX500_GPIO(38)
+#define AB8500_PIN_E16         ABX500_GPIO(39)
+#define AB8500_PIN_T19         ABX500_GPIO(40)
+#define AB8500_PIN_U19         ABX500_GPIO(41)
+#define AB8500_PIN_U2          ABX500_GPIO(42)
+
+/* indicates the highest GPIO number */
+#define AB8500_GPIO_MAX_NUMBER 42
+
+/*
+ * The names of the pins are denoted by GPIO number and ball name, even
+ * though they can be used for other things than GPIO, this is the first
+ * column in the table of the data sheet and often used on schematics and
+ * such.
+ */
+static const struct pinctrl_pin_desc ab8500_pins[] = {
+       PINCTRL_PIN(AB8500_PIN_T10, "GPIO1_T10"),
+       PINCTRL_PIN(AB8500_PIN_T9, "GPIO2_T9"),
+       PINCTRL_PIN(AB8500_PIN_U9, "GPIO3_U9"),
+       PINCTRL_PIN(AB8500_PIN_W2, "GPIO4_W2"),
+       /* hole */
+       PINCTRL_PIN(AB8500_PIN_Y18, "GPIO6_Y18"),
+       PINCTRL_PIN(AB8500_PIN_AA20, "GPIO7_AA20"),
+       PINCTRL_PIN(AB8500_PIN_W18, "GPIO8_W18"),
+       PINCTRL_PIN(AB8500_PIN_AA19, "GPIO9_AA19"),
+       PINCTRL_PIN(AB8500_PIN_U17, "GPIO10_U17"),
+       PINCTRL_PIN(AB8500_PIN_AA18, "GPIO11_AA18"),
+       PINCTRL_PIN(AB8500_PIN_U16, "GPIO12_U16"),
+       PINCTRL_PIN(AB8500_PIN_W17, "GPIO13_W17"),
+       PINCTRL_PIN(AB8500_PIN_F14, "GPIO14_F14"),
+       PINCTRL_PIN(AB8500_PIN_B17, "GPIO15_B17"),
+       PINCTRL_PIN(AB8500_PIN_F15, "GPIO16_F15"),
+       PINCTRL_PIN(AB8500_PIN_P5, "GPIO17_P5"),
+       PINCTRL_PIN(AB8500_PIN_R5, "GPIO18_R5"),
+       PINCTRL_PIN(AB8500_PIN_U5, "GPIO19_U5"),
+       PINCTRL_PIN(AB8500_PIN_T5, "GPIO20_T5"),
+       PINCTRL_PIN(AB8500_PIN_H19, "GPIO21_H19"),
+       PINCTRL_PIN(AB8500_PIN_G20, "GPIO22_G20"),
+       PINCTRL_PIN(AB8500_PIN_G19, "GPIO23_G19"),
+       PINCTRL_PIN(AB8500_PIN_T14, "GPIO24_T14"),
+       PINCTRL_PIN(AB8500_PIN_R16, "GPIO25_R16"),
+       PINCTRL_PIN(AB8500_PIN_M16, "GPIO26_M16"),
+       PINCTRL_PIN(AB8500_PIN_J6, "GPIO27_J6"),
+       PINCTRL_PIN(AB8500_PIN_K6, "GPIO28_K6"),
+       PINCTRL_PIN(AB8500_PIN_G6, "GPIO29_G6"),
+       PINCTRL_PIN(AB8500_PIN_H6, "GPIO30_H6"),
+       PINCTRL_PIN(AB8500_PIN_F5, "GPIO31_F5"),
+       PINCTRL_PIN(AB8500_PIN_G5, "GPIO32_G5"),
+       /* hole */
+       PINCTRL_PIN(AB8500_PIN_R17, "GPIO34_R17"),
+       PINCTRL_PIN(AB8500_PIN_W15, "GPIO35_W15"),
+       PINCTRL_PIN(AB8500_PIN_A17, "GPIO36_A17"),
+       PINCTRL_PIN(AB8500_PIN_E15, "GPIO37_E15"),
+       PINCTRL_PIN(AB8500_PIN_C17, "GPIO38_C17"),
+       PINCTRL_PIN(AB8500_PIN_E16, "GPIO39_E16"),
+       PINCTRL_PIN(AB8500_PIN_T19, "GPIO40_T19"),
+       PINCTRL_PIN(AB8500_PIN_U19, "GPIO41_U19"),
+       PINCTRL_PIN(AB8500_PIN_U2, "GPIO42_U2"),
+};
+
+/*
+ * Maps local GPIO offsets to local pin numbers
+ */
+static const struct abx500_pinrange ab8500_pinranges[] = {
+       ABX500_PINRANGE(1, 4, ABX500_ALT_A),
+       ABX500_PINRANGE(6, 4, ABX500_ALT_A),
+       ABX500_PINRANGE(10, 4, ABX500_DEFAULT),
+       ABX500_PINRANGE(14, 12, ABX500_ALT_A),
+       ABX500_PINRANGE(26, 1, ABX500_DEFAULT),
+       ABX500_PINRANGE(27, 6, ABX500_ALT_A),
+       ABX500_PINRANGE(34, 1, ABX500_ALT_A),
+       ABX500_PINRANGE(35, 1, ABX500_DEFAULT),
+       ABX500_PINRANGE(36, 7, ABX500_ALT_A),
+};
+
+/*
+ * Read the pin group names like this:
+ * sysclkreq2_d_1 = first groups of pins for sysclkreq2 on default function
+ *
+ * The groups are arranged as sets per altfunction column, so we can
+ * mux in one group at a time by selecting the same altfunction for them
+ * all. When functions require pins on different altfunctions, you need
+ * to combine several groups.
+ */
+
+/* default column */
+static const unsigned sysclkreq2_d_1_pins[] = { AB8500_PIN_T10 };
+static const unsigned sysclkreq3_d_1_pins[] = { AB8500_PIN_T9 };
+static const unsigned sysclkreq4_d_1_pins[] = { AB8500_PIN_U9 };
+static const unsigned sysclkreq6_d_1_pins[] = { AB8500_PIN_W2 };
+static const unsigned ycbcr0123_d_1_pins[] = { AB8500_PIN_Y18, AB8500_PIN_AA20,
+                                       AB8500_PIN_W18, AB8500_PIN_AA19};
+static const unsigned gpio10_d_1_pins[] = { AB8500_PIN_U17 };
+static const unsigned gpio11_d_1_pins[] = { AB8500_PIN_AA18 };
+static const unsigned gpio12_d_1_pins[] = { AB8500_PIN_U16 };
+static const unsigned gpio13_d_1_pins[] = { AB8500_PIN_W17 };
+static const unsigned pwmout1_d_1_pins[] = { AB8500_PIN_F14 };
+static const unsigned pwmout2_d_1_pins[] = { AB8500_PIN_B17 };
+static const unsigned pwmout3_d_1_pins[] = { AB8500_PIN_F15 };
+
+/* audio data interface 1*/
+static const unsigned adi1_d_1_pins[] = { AB8500_PIN_P5, AB8500_PIN_R5,
+                                       AB8500_PIN_U5, AB8500_PIN_T5 };
+/* USBUICC */
+static const unsigned usbuicc_d_1_pins[] = { AB8500_PIN_H19, AB8500_PIN_G20,
+                                       AB8500_PIN_G19 };
+static const unsigned sysclkreq7_d_1_pins[] = { AB8500_PIN_T14 };
+static const unsigned sysclkreq8_d_1_pins[] = { AB8500_PIN_R16 };
+static const unsigned gpio26_d_1_pins[] = { AB8500_PIN_M16 };
+/* Digital microphone 1 and 2 */
+static const unsigned dmic12_d_1_pins[] = { AB8500_PIN_J6, AB8500_PIN_K6 };
+/* Digital microphone 3 and 4 */
+static const unsigned dmic34_d_1_pins[] = { AB8500_PIN_G6, AB8500_PIN_H6 };
+/* Digital microphone 5 and 6 */
+static const unsigned dmic56_d_1_pins[] = { AB8500_PIN_F5, AB8500_PIN_G5 };
+static const unsigned extcpena_d_1_pins[] = { AB8500_PIN_R17 };
+static const unsigned gpio35_d_1_pins[] = { AB8500_PIN_W15 };
+/* APE SPI */
+static const unsigned apespi_d_1_pins[] = { AB8500_PIN_A17, AB8500_PIN_E15,
+                                       AB8500_PIN_C17, AB8500_PIN_E16};
+/* modem SDA/SCL */
+static const unsigned modsclsda_d_1_pins[] = { AB8500_PIN_T19, AB8500_PIN_U19 };
+static const unsigned sysclkreq5_d_1_pins[] = { AB8500_PIN_U2 };
+
+/* Altfunction A column */
+static const unsigned gpio1_a_1_pins[] = { AB8500_PIN_T10 };
+static const unsigned gpio2_a_1_pins[] = { AB8500_PIN_T9 };
+static const unsigned gpio3_a_1_pins[] = { AB8500_PIN_U9 };
+static const unsigned gpio4_a_1_pins[] = { AB8500_PIN_W2 };
+static const unsigned gpio6_a_1_pins[] = { AB8500_PIN_Y18 };
+static const unsigned gpio7_a_1_pins[] = { AB8500_PIN_AA20 };
+static const unsigned gpio8_a_1_pins[] = { AB8500_PIN_W18 };
+static const unsigned gpio9_a_1_pins[] = { AB8500_PIN_AA19 };
+/* YCbCr4 YCbCr5 YCbCr6 YCbCr7*/
+static const unsigned ycbcr4567_a_1_pins[] = { AB8500_PIN_U17, AB8500_PIN_AA18,
+                                       AB8500_PIN_U16, AB8500_PIN_W17};
+static const unsigned gpio14_a_1_pins[] = { AB8500_PIN_F14 };
+static const unsigned gpio15_a_1_pins[] = { AB8500_PIN_B17 };
+static const unsigned gpio16_a_1_pins[] = { AB8500_PIN_F15 };
+static const unsigned gpio17_a_1_pins[] = { AB8500_PIN_P5 };
+static const unsigned gpio18_a_1_pins[] = { AB8500_PIN_R5 };
+static const unsigned gpio19_a_1_pins[] = { AB8500_PIN_U5 };
+static const unsigned gpio20_a_1_pins[] = { AB8500_PIN_T5 };
+static const unsigned gpio21_a_1_pins[] = { AB8500_PIN_H19 };
+static const unsigned gpio22_a_1_pins[] = { AB8500_PIN_G20 };
+static const unsigned gpio23_a_1_pins[] = { AB8500_PIN_G19 };
+static const unsigned gpio24_a_1_pins[] = { AB8500_PIN_T14 };
+static const unsigned gpio25_a_1_pins[] = { AB8500_PIN_R16 };
+static const unsigned gpio27_a_1_pins[] = { AB8500_PIN_J6 };
+static const unsigned gpio28_a_1_pins[] = { AB8500_PIN_K6 };
+static const unsigned gpio29_a_1_pins[] = { AB8500_PIN_G6 };
+static const unsigned gpio30_a_1_pins[] = { AB8500_PIN_H6 };
+static const unsigned gpio31_a_1_pins[] = { AB8500_PIN_F5 };
+static const unsigned gpio32_a_1_pins[] = { AB8500_PIN_G5 };
+static const unsigned gpio34_a_1_pins[] = { AB8500_PIN_R17 };
+static const unsigned gpio36_a_1_pins[] = { AB8500_PIN_A17 };
+static const unsigned gpio37_a_1_pins[] = { AB8500_PIN_E15 };
+static const unsigned gpio38_a_1_pins[] = { AB8500_PIN_C17 };
+static const unsigned gpio39_a_1_pins[] = { AB8500_PIN_E16 };
+static const unsigned gpio40_a_1_pins[] = { AB8500_PIN_T19 };
+static const unsigned gpio41_a_1_pins[] = { AB8500_PIN_U19 };
+static const unsigned gpio42_a_1_pins[] = { AB8500_PIN_U2 };
+
+/* Altfunction B colum */
+static const unsigned hiqclkena_b_1_pins[] = { AB8500_PIN_U17 };
+static const unsigned usbuiccpd_b_1_pins[] = { AB8500_PIN_AA18 };
+static const unsigned i2ctrig1_b_1_pins[] = { AB8500_PIN_U16 };
+static const unsigned i2ctrig2_b_1_pins[] = { AB8500_PIN_W17 };
+
+/* Altfunction C column */
+static const unsigned usbvdat_c_1_pins[] = { AB8500_PIN_W17 };
+
+
+#define AB8500_PIN_GROUP(a, b) { .name = #a, .pins = a##_pins,         \
+                       .npins = ARRAY_SIZE(a##_pins), .altsetting = b }
+
+static const struct abx500_pingroup ab8500_groups[] = {
+       /* default column */
+       AB8500_PIN_GROUP(sysclkreq2_d_1, ABX500_DEFAULT),
+       AB8500_PIN_GROUP(sysclkreq3_d_1, ABX500_DEFAULT),
+       AB8500_PIN_GROUP(sysclkreq4_d_1, ABX500_DEFAULT),
+       AB8500_PIN_GROUP(sysclkreq6_d_1, ABX500_DEFAULT),
+       AB8500_PIN_GROUP(ycbcr0123_d_1, ABX500_DEFAULT),
+       AB8500_PIN_GROUP(gpio10_d_1, ABX500_DEFAULT),
+       AB8500_PIN_GROUP(gpio11_d_1, ABX500_DEFAULT),
+       AB8500_PIN_GROUP(gpio12_d_1, ABX500_DEFAULT),
+       AB8500_PIN_GROUP(gpio13_d_1, ABX500_DEFAULT),
+       AB8500_PIN_GROUP(pwmout1_d_1, ABX500_DEFAULT),
+       AB8500_PIN_GROUP(pwmout2_d_1, ABX500_DEFAULT),
+       AB8500_PIN_GROUP(pwmout3_d_1, ABX500_DEFAULT),
+       AB8500_PIN_GROUP(adi1_d_1, ABX500_DEFAULT),
+       AB8500_PIN_GROUP(usbuicc_d_1, ABX500_DEFAULT),
+       AB8500_PIN_GROUP(sysclkreq7_d_1, ABX500_DEFAULT),
+       AB8500_PIN_GROUP(sysclkreq8_d_1, ABX500_DEFAULT),
+       AB8500_PIN_GROUP(gpio26_d_1, ABX500_DEFAULT),
+       AB8500_PIN_GROUP(dmic12_d_1, ABX500_DEFAULT),
+       AB8500_PIN_GROUP(dmic34_d_1, ABX500_DEFAULT),
+       AB8500_PIN_GROUP(dmic56_d_1, ABX500_DEFAULT),
+       AB8500_PIN_GROUP(extcpena_d_1, ABX500_DEFAULT),
+       AB8500_PIN_GROUP(gpio35_d_1, ABX500_DEFAULT),
+       AB8500_PIN_GROUP(apespi_d_1, ABX500_DEFAULT),
+       AB8500_PIN_GROUP(modsclsda_d_1, ABX500_DEFAULT),
+       AB8500_PIN_GROUP(sysclkreq5_d_1, ABX500_DEFAULT),
+       /* Altfunction A column */
+       AB8500_PIN_GROUP(gpio1_a_1, ABX500_ALT_A),
+       AB8500_PIN_GROUP(gpio2_a_1, ABX500_ALT_A),
+       AB8500_PIN_GROUP(gpio3_a_1, ABX500_ALT_A),
+       AB8500_PIN_GROUP(gpio4_a_1, ABX500_ALT_A),
+       AB8500_PIN_GROUP(gpio6_a_1, ABX500_ALT_A),
+       AB8500_PIN_GROUP(gpio7_a_1, ABX500_ALT_A),
+       AB8500_PIN_GROUP(gpio8_a_1, ABX500_ALT_A),
+       AB8500_PIN_GROUP(gpio9_a_1, ABX500_ALT_A),
+       AB8500_PIN_GROUP(ycbcr4567_a_1, ABX500_ALT_A),
+       AB8500_PIN_GROUP(gpio14_a_1, ABX500_ALT_A),
+       AB8500_PIN_GROUP(gpio15_a_1, ABX500_ALT_A),
+       AB8500_PIN_GROUP(gpio16_a_1, ABX500_ALT_A),
+       AB8500_PIN_GROUP(gpio17_a_1, ABX500_ALT_A),
+       AB8500_PIN_GROUP(gpio18_a_1, ABX500_ALT_A),
+       AB8500_PIN_GROUP(gpio19_a_1, ABX500_ALT_A),
+       AB8500_PIN_GROUP(gpio20_a_1, ABX500_ALT_A),
+       AB8500_PIN_GROUP(gpio21_a_1, ABX500_ALT_A),
+       AB8500_PIN_GROUP(gpio22_a_1, ABX500_ALT_A),
+       AB8500_PIN_GROUP(gpio23_a_1, ABX500_ALT_A),
+       AB8500_PIN_GROUP(gpio24_a_1, ABX500_ALT_A),
+       AB8500_PIN_GROUP(gpio25_a_1, ABX500_ALT_A),
+       AB8500_PIN_GROUP(gpio27_a_1, ABX500_ALT_A),
+       AB8500_PIN_GROUP(gpio28_a_1, ABX500_ALT_A),
+       AB8500_PIN_GROUP(gpio29_a_1, ABX500_ALT_A),
+       AB8500_PIN_GROUP(gpio30_a_1, ABX500_ALT_A),
+       AB8500_PIN_GROUP(gpio31_a_1, ABX500_ALT_A),
+       AB8500_PIN_GROUP(gpio32_a_1, ABX500_ALT_A),
+       AB8500_PIN_GROUP(gpio34_a_1, ABX500_ALT_A),
+       AB8500_PIN_GROUP(gpio36_a_1, ABX500_ALT_A),
+       AB8500_PIN_GROUP(gpio37_a_1, ABX500_ALT_A),
+       AB8500_PIN_GROUP(gpio38_a_1, ABX500_ALT_A),
+       AB8500_PIN_GROUP(gpio39_a_1, ABX500_ALT_A),
+       AB8500_PIN_GROUP(gpio40_a_1, ABX500_ALT_A),
+       AB8500_PIN_GROUP(gpio41_a_1, ABX500_ALT_A),
+       AB8500_PIN_GROUP(gpio42_a_1, ABX500_ALT_A),
+       /* Altfunction B column */
+       AB8500_PIN_GROUP(hiqclkena_b_1, ABX500_ALT_B),
+       AB8500_PIN_GROUP(usbuiccpd_b_1, ABX500_ALT_B),
+       AB8500_PIN_GROUP(i2ctrig1_b_1, ABX500_ALT_B),
+       AB8500_PIN_GROUP(i2ctrig2_b_1, ABX500_ALT_B),
+       /* Altfunction C column */
+       AB8500_PIN_GROUP(usbvdat_c_1, ABX500_ALT_C),
+};
+
+/* We use this macro to define the groups applicable to a function */
+#define AB8500_FUNC_GROUPS(a, b...)       \
+static const char * const a##_groups[] = { b };
+
+AB8500_FUNC_GROUPS(sysclkreq, "sysclkreq2_d_1", "sysclkreq3_d_1",
+               "sysclkreq4_d_1", "sysclkreq5_d_1", "sysclkreq6_d_1",
+               "sysclkreq7_d_1", "sysclkreq8_d_1");
+AB8500_FUNC_GROUPS(ycbcr, "ycbcr0123_d_1", "ycbcr4567_a_1");
+AB8500_FUNC_GROUPS(gpio, "gpio1_a_1", "gpio2_a_1", "gpio3_a_1", "gpio4_a_1",
+               "gpio6_a_1", "gpio7_a_1", "gpio8_a_1", "gpio9_a_1",
+               "gpio10_d_1", "gpio11_d_1", "gpio12_d_1", "gpio13_d_1",
+               "gpio14_a_1", "gpio15_a_1", "gpio16_a_1", "gpio17_a_1",
+               "gpio18_a_1", "gpio19_a_1", "gpio20_a_1", "gpio21_a_1",
+               "gpio22_a_1", "gpio23_a_1", "gpio24_a_1", "gpio25_a_1",
+               "gpio26_d_1", "gpio27_a_1", "gpio28_a_1", "gpio29_a_1",
+               "gpio30_a_1", "gpio31_a_1", "gpio32_a_1", "gpio34_a_1",
+               "gpio35_d_1", "gpio36_a_1", "gpio37_a_1", "gpio38_a_1",
+               "gpio39_a_1", "gpio40_a_1", "gpio41_a_1", "gpio42_a_1");
+AB8500_FUNC_GROUPS(pwmout, "pwmout1_d_1", "pwmout2_d_1", "pwmout3_d_1");
+AB8500_FUNC_GROUPS(adi1, "adi1_d_1");
+AB8500_FUNC_GROUPS(usbuicc, "usbuicc_d_1", "usbuiccpd_b_1");
+AB8500_FUNC_GROUPS(dmic, "dmic12_d_1", "dmic34_d_1", "dmic56_d_1");
+AB8500_FUNC_GROUPS(extcpena, "extcpena_d_1");
+AB8500_FUNC_GROUPS(apespi, "apespi_d_1");
+AB8500_FUNC_GROUPS(modsclsda, "modsclsda_d_1");
+AB8500_FUNC_GROUPS(hiqclkena, "hiqclkena_b_1");
+AB8500_FUNC_GROUPS(i2ctrig, "i2ctrig1_b_1", "i2ctrig2_b_1");
+AB8500_FUNC_GROUPS(usbvdat, "usbvdat_c_1");
+
+#define FUNCTION(fname)                                        \
+       {                                               \
+               .name = #fname,                         \
+               .groups = fname##_groups,               \
+               .ngroups = ARRAY_SIZE(fname##_groups),  \
+       }
+
+static const struct abx500_function ab8500_functions[] = {
+       FUNCTION(sysclkreq),
+       FUNCTION(ycbcr),
+       FUNCTION(gpio),
+       FUNCTION(pwmout),
+       FUNCTION(adi1),
+       FUNCTION(usbuicc),
+       FUNCTION(dmic),
+       FUNCTION(extcpena),
+       FUNCTION(apespi),
+       FUNCTION(modsclsda),
+       FUNCTION(hiqclkena),
+       FUNCTION(i2ctrig),
+       FUNCTION(usbvdat),
+};
+
+/*
+ * this table translates what's is in the AB8500 specification regarding the
+ * balls alternate functions (as for DB, default, ALT_A, ALT_B and ALT_C).
+ * ALTERNATE_FUNCTIONS(GPIO_NUMBER, GPIOSEL bit, ALTERNATFUNC bit1,
+ * ALTERNATEFUNC bit2, ALTA val, ALTB val, ALTC val),
+ *
+ * example :
+ *
+ *     ALTERNATE_FUNCTIONS(13,     4,      3,      4, 0, 1 ,2),
+ *     means that pin AB8500_PIN_W17 (pin 13) supports 4 mux (default/ALT_A,
+ *     ALT_B and ALT_C), so GPIOSEL and ALTERNATFUNC registers are used to
+ *     select the mux.  ALTA, ALTB and ALTC val indicates values to write in
+ *     ALTERNATFUNC register. We need to specifies these values as SOC
+ *     designers didn't apply the same logic on how to select mux in the
+ *     ABx500 family.
+ *
+ *     As this pins supports at least ALT_B mux, default mux is
+ *     selected by writing 1 in GPIOSEL bit :
+ *
+ *             | GPIOSEL bit=4 | alternatfunc bit2=4 | alternatfunc bit1=3
+ *     default |       1       |          0          |          0
+ *     alt_A   |       0       |          0          |          0
+ *     alt_B   |       0       |          0          |          1
+ *     alt_C   |       0       |          1          |          0
+ *
+ *     ALTERNATE_FUNCTIONS(8,      7, UNUSED, UNUSED),
+ *     means that pin AB8500_PIN_W18 (pin 8) supports 2 mux, so only GPIOSEL
+ *     register is used to select the mux. As this pins doesn't support at
+ *     least ALT_B mux, default mux is by writing 0 in GPIOSEL bit :
+ *
+ *             | GPIOSEL bit=7 | alternatfunc bit2=  | alternatfunc bit1=
+ *     default |       0       |          0          |          0
+ *     alt_A   |       1       |          0          |          0
+ */
+
+static struct
+alternate_functions ab8500_alternate_functions[AB8500_GPIO_MAX_NUMBER + 1] = {
+       ALTERNATE_FUNCTIONS(0, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO0 */
+       ALTERNATE_FUNCTIONS(1,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO1, altA controlled by bit 0 */
+       ALTERNATE_FUNCTIONS(2,      1, UNUSED, UNUSED, 0, 0, 0), /* GPIO2, altA controlled by bit 1 */
+       ALTERNATE_FUNCTIONS(3,      2, UNUSED, UNUSED, 0, 0, 0), /* GPIO3, altA controlled by bit 2*/
+       ALTERNATE_FUNCTIONS(4,      3, UNUSED, UNUSED, 0, 0, 0), /* GPIO4, altA controlled by bit 3*/
+       /* bit 4 reserved */
+       ALTERNATE_FUNCTIONS(5, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO5 */
+       ALTERNATE_FUNCTIONS(6,      5, UNUSED, UNUSED, 0, 0, 0), /* GPIO6, altA controlled by bit 5*/
+       ALTERNATE_FUNCTIONS(7,      6, UNUSED, UNUSED, 0, 0, 0), /* GPIO7, altA controlled by bit 6*/
+       ALTERNATE_FUNCTIONS(8,      7, UNUSED, UNUSED, 0, 0, 0), /* GPIO8, altA controlled by bit 7*/
+
+       ALTERNATE_FUNCTIONS(9,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO9, altA controlled by bit 0*/
+       ALTERNATE_FUNCTIONS(10,     1,      0, UNUSED, 0, 1, 0), /* GPIO10, altA and altB controlled by bit 0 */
+       ALTERNATE_FUNCTIONS(11,     2,      1, UNUSED, 0, 1, 0), /* GPIO11, altA and altB controlled by bit 1 */
+       ALTERNATE_FUNCTIONS(12,     3,      2, UNUSED, 0, 1, 0), /* GPIO12, altA and altB controlled by bit 2 */
+       ALTERNATE_FUNCTIONS(13,     4,      3,      4, 0, 1, 2), /* GPIO13, altA altB and altC controlled by bit 3 and 4 */
+       ALTERNATE_FUNCTIONS(14,     5, UNUSED, UNUSED, 0, 0, 0), /* GPIO14, altA controlled by bit 5 */
+       ALTERNATE_FUNCTIONS(15,     6, UNUSED, UNUSED, 0, 0, 0), /* GPIO15, altA controlled by bit 6 */
+       ALTERNATE_FUNCTIONS(16,     7, UNUSED, UNUSED, 0, 0, 0), /* GPIO16, altA controlled by bit 7 */
+       /*
+        * pins 17 to 20 are special case, only bit 0 is used to select
+        * alternate function for these 4 pins.
+        * bits 1 to 3 are reserved
+        */
+       ALTERNATE_FUNCTIONS(17,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO17, altA controlled by bit 0 */
+       ALTERNATE_FUNCTIONS(18,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO18, altA controlled by bit 0 */
+       ALTERNATE_FUNCTIONS(19,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO19, altA controlled by bit 0 */
+       ALTERNATE_FUNCTIONS(20,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO20, altA controlled by bit 0 */
+       ALTERNATE_FUNCTIONS(21,      4, UNUSED, UNUSED, 0, 0, 0), /* GPIO21, altA controlled by bit 4 */
+       ALTERNATE_FUNCTIONS(22,      5, UNUSED, UNUSED, 0, 0, 0), /* GPIO22, altA controlled by bit 5 */
+       ALTERNATE_FUNCTIONS(23,      6, UNUSED, UNUSED, 0, 0, 0), /* GPIO23, altA controlled by bit 6 */
+       ALTERNATE_FUNCTIONS(24,      7, UNUSED, UNUSED, 0, 0, 0), /* GPIO24, altA controlled by bit 7 */
+
+       ALTERNATE_FUNCTIONS(25,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO25, altA controlled by bit 0 */
+       /* pin 26 special case, no alternate function, bit 1 reserved */
+       ALTERNATE_FUNCTIONS(26, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* GPIO26 */
+       ALTERNATE_FUNCTIONS(27,      2, UNUSED, UNUSED, 0, 0, 0), /* GPIO27, altA controlled by bit 2 */
+       ALTERNATE_FUNCTIONS(28,      3, UNUSED, UNUSED, 0, 0, 0), /* GPIO28, altA controlled by bit 3 */
+       ALTERNATE_FUNCTIONS(29,      4, UNUSED, UNUSED, 0, 0, 0), /* GPIO29, altA controlled by bit 4 */
+       ALTERNATE_FUNCTIONS(30,      5, UNUSED, UNUSED, 0, 0, 0), /* GPIO30, altA controlled by bit 5 */
+       ALTERNATE_FUNCTIONS(31,      6, UNUSED, UNUSED, 0, 0, 0), /* GPIO31, altA controlled by bit 6 */
+       ALTERNATE_FUNCTIONS(32,      7, UNUSED, UNUSED, 0, 0, 0), /* GPIO32, altA controlled by bit 7 */
+
+       ALTERNATE_FUNCTIONS(33, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO33 */
+       ALTERNATE_FUNCTIONS(34,      1, UNUSED, UNUSED, 0, 0, 0), /* GPIO34, altA controlled by bit 1 */
+       /* pin 35 special case, no alternate function, bit 2 reserved */
+       ALTERNATE_FUNCTIONS(35, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* GPIO35 */
+       ALTERNATE_FUNCTIONS(36,      3, UNUSED, UNUSED, 0, 0, 0), /* GPIO36, altA controlled by bit 3 */
+       ALTERNATE_FUNCTIONS(37,      4, UNUSED, UNUSED, 0, 0, 0), /* GPIO37, altA controlled by bit 4 */
+       ALTERNATE_FUNCTIONS(38,      5, UNUSED, UNUSED, 0, 0, 0), /* GPIO38, altA controlled by bit 5 */
+       ALTERNATE_FUNCTIONS(39,      6, UNUSED, UNUSED, 0, 0, 0), /* GPIO39, altA controlled by bit 6 */
+       ALTERNATE_FUNCTIONS(40,      7, UNUSED, UNUSED, 0, 0, 0), /* GPIO40, altA controlled by bit 7 */
+
+       ALTERNATE_FUNCTIONS(41,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO41, altA controlled by bit 0 */
+       ALTERNATE_FUNCTIONS(42,      1, UNUSED, UNUSED, 0, 0, 0), /* GPIO42, altA controlled by bit 1 */
+};
+
+/*
+ * Only some GPIOs are interrupt capable, and they are
+ * organized in discontiguous clusters:
+ *
+ *     GPIO6 to GPIO13
+ *     GPIO24 and GPIO25
+ *     GPIO36 to GPIO41
+ */
+static struct abx500_gpio_irq_cluster ab8500_gpio_irq_cluster[] = {
+       GPIO_IRQ_CLUSTER(6,  13, AB8500_INT_GPIO6R),
+       GPIO_IRQ_CLUSTER(24, 25, AB8500_INT_GPIO24R),
+       GPIO_IRQ_CLUSTER(36, 41, AB8500_INT_GPIO36R),
+};
+
+static struct abx500_pinctrl_soc_data ab8500_soc = {
+       .gpio_ranges = ab8500_pinranges,
+       .gpio_num_ranges = ARRAY_SIZE(ab8500_pinranges),
+       .pins = ab8500_pins,
+       .npins = ARRAY_SIZE(ab8500_pins),
+       .functions = ab8500_functions,
+       .nfunctions = ARRAY_SIZE(ab8500_functions),
+       .groups = ab8500_groups,
+       .ngroups = ARRAY_SIZE(ab8500_groups),
+       .alternate_functions = ab8500_alternate_functions,
+       .gpio_irq_cluster = ab8500_gpio_irq_cluster,
+       .ngpio_irq_cluster = ARRAY_SIZE(ab8500_gpio_irq_cluster),
+       .irq_gpio_rising_offset = AB8500_INT_GPIO6R,
+       .irq_gpio_falling_offset = AB8500_INT_GPIO6F,
+       .irq_gpio_factor = 1,
+};
+
+void abx500_pinctrl_ab8500_init(struct abx500_pinctrl_soc_data **soc)
+{
+       *soc = &ab8500_soc;
+}
diff --git a/drivers/pinctrl/nomadik/pinctrl-ab8505.c b/drivers/pinctrl/nomadik/pinctrl-ab8505.c
new file mode 100644 (file)
index 0000000..bf0ef4a
--- /dev/null
@@ -0,0 +1,381 @@
+/*
+ * Copyright (C) ST-Ericsson SA 2012
+ *
+ * Author: Patrice Chotard <patrice.chotard@stericsson.com> for ST-Ericsson.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/kernel.h>
+#include <linux/gpio.h>
+#include <linux/pinctrl/pinctrl.h>
+#include <linux/mfd/abx500/ab8500.h>
+#include "pinctrl-abx500.h"
+
+/* All the pins that can be used for GPIO and some other functions */
+#define ABX500_GPIO(offset)    (offset)
+
+#define AB8505_PIN_N4          ABX500_GPIO(1)
+#define AB8505_PIN_R5          ABX500_GPIO(2)
+#define AB8505_PIN_P5          ABX500_GPIO(3)
+/* hole */
+#define AB8505_PIN_B16         ABX500_GPIO(10)
+#define AB8505_PIN_B17         ABX500_GPIO(11)
+/* hole */
+#define AB8505_PIN_D17         ABX500_GPIO(13)
+#define AB8505_PIN_C16         ABX500_GPIO(14)
+/* hole */
+#define AB8505_PIN_P2          ABX500_GPIO(17)
+#define AB8505_PIN_N3          ABX500_GPIO(18)
+#define AB8505_PIN_T1          ABX500_GPIO(19)
+#define AB8505_PIN_P3          ABX500_GPIO(20)
+/* hole */
+#define AB8505_PIN_H14         ABX500_GPIO(34)
+/* hole */
+#define AB8505_PIN_J15         ABX500_GPIO(40)
+#define AB8505_PIN_J14         ABX500_GPIO(41)
+/* hole */
+#define AB8505_PIN_L4          ABX500_GPIO(50)
+/* hole */
+#define AB8505_PIN_D16         ABX500_GPIO(52)
+#define AB8505_PIN_D15         ABX500_GPIO(53)
+
+/* indicates the higher GPIO number */
+#define AB8505_GPIO_MAX_NUMBER 53
+
+/*
+ * The names of the pins are denoted by GPIO number and ball name, even
+ * though they can be used for other things than GPIO, this is the first
+ * column in the table of the data sheet and often used on schematics and
+ * such.
+ */
+static const struct pinctrl_pin_desc ab8505_pins[] = {
+       PINCTRL_PIN(AB8505_PIN_N4, "GPIO1_N4"),
+       PINCTRL_PIN(AB8505_PIN_R5, "GPIO2_R5"),
+       PINCTRL_PIN(AB8505_PIN_P5, "GPIO3_P5"),
+/* hole */
+       PINCTRL_PIN(AB8505_PIN_B16, "GPIO10_B16"),
+       PINCTRL_PIN(AB8505_PIN_B17, "GPIO11_B17"),
+/* hole */
+       PINCTRL_PIN(AB8505_PIN_D17, "GPIO13_D17"),
+       PINCTRL_PIN(AB8505_PIN_C16, "GPIO14_C16"),
+/* hole */
+       PINCTRL_PIN(AB8505_PIN_P2, "GPIO17_P2"),
+       PINCTRL_PIN(AB8505_PIN_N3, "GPIO18_N3"),
+       PINCTRL_PIN(AB8505_PIN_T1, "GPIO19_T1"),
+       PINCTRL_PIN(AB8505_PIN_P3, "GPIO20_P3"),
+/* hole */
+       PINCTRL_PIN(AB8505_PIN_H14, "GPIO34_H14"),
+/* hole */
+       PINCTRL_PIN(AB8505_PIN_J15, "GPIO40_J15"),
+       PINCTRL_PIN(AB8505_PIN_J14, "GPIO41_J14"),
+/* hole */
+       PINCTRL_PIN(AB8505_PIN_L4, "GPIO50_L4"),
+/* hole */
+       PINCTRL_PIN(AB8505_PIN_D16, "GPIO52_D16"),
+       PINCTRL_PIN(AB8505_PIN_D15, "GPIO53_D15"),
+};
+
+/*
+ * Maps local GPIO offsets to local pin numbers
+ */
+static const struct abx500_pinrange ab8505_pinranges[] = {
+       ABX500_PINRANGE(1, 3, ABX500_ALT_A),
+       ABX500_PINRANGE(10, 2, ABX500_DEFAULT),
+       ABX500_PINRANGE(13, 1, ABX500_DEFAULT),
+       ABX500_PINRANGE(14, 1, ABX500_ALT_A),
+       ABX500_PINRANGE(17, 4, ABX500_ALT_A),
+       ABX500_PINRANGE(34, 1, ABX500_ALT_A),
+       ABX500_PINRANGE(40, 2, ABX500_ALT_A),
+       ABX500_PINRANGE(50, 1, ABX500_DEFAULT),
+       ABX500_PINRANGE(52, 2, ABX500_ALT_A),
+};
+
+/*
+ * Read the pin group names like this:
+ * sysclkreq2_d_1 = first groups of pins for sysclkreq2 on default function
+ *
+ * The groups are arranged as sets per altfunction column, so we can
+ * mux in one group at a time by selecting the same altfunction for them
+ * all. When functions require pins on different altfunctions, you need
+ * to combine several groups.
+ */
+
+/* default column */
+static const unsigned sysclkreq2_d_1_pins[] = { AB8505_PIN_N4 };
+static const unsigned sysclkreq3_d_1_pins[] = { AB8505_PIN_R5 };
+static const unsigned sysclkreq4_d_1_pins[] = { AB8505_PIN_P5 };
+static const unsigned gpio10_d_1_pins[] = { AB8505_PIN_B16 };
+static const unsigned gpio11_d_1_pins[] = { AB8505_PIN_B17 };
+static const unsigned gpio13_d_1_pins[] = { AB8505_PIN_D17 };
+static const unsigned pwmout1_d_1_pins[] = { AB8505_PIN_C16 };
+/* audio data interface 2*/
+static const unsigned adi2_d_1_pins[] = { AB8505_PIN_P2, AB8505_PIN_N3,
+                                       AB8505_PIN_T1, AB8505_PIN_P3 };
+static const unsigned extcpena_d_1_pins[] = { AB8505_PIN_H14 };
+/* modem SDA/SCL */
+static const unsigned modsclsda_d_1_pins[] = { AB8505_PIN_J15, AB8505_PIN_J14 };
+static const unsigned gpio50_d_1_pins[] = { AB8505_PIN_L4 };
+static const unsigned resethw_d_1_pins[] = { AB8505_PIN_D16 };
+static const unsigned service_d_1_pins[] = { AB8505_PIN_D15 };
+
+/* Altfunction A column */
+static const unsigned gpio1_a_1_pins[] = { AB8505_PIN_N4 };
+static const unsigned gpio2_a_1_pins[] = { AB8505_PIN_R5 };
+static const unsigned gpio3_a_1_pins[] = { AB8505_PIN_P5 };
+static const unsigned hiqclkena_a_1_pins[] = { AB8505_PIN_B16 };
+static const unsigned pdmclk_a_1_pins[] = { AB8505_PIN_B17 };
+static const unsigned uarttxdata_a_1_pins[] = { AB8505_PIN_D17 };
+static const unsigned gpio14_a_1_pins[] = { AB8505_PIN_C16 };
+static const unsigned gpio17_a_1_pins[] = { AB8505_PIN_P2 };
+static const unsigned gpio18_a_1_pins[] = { AB8505_PIN_N3 };
+static const unsigned gpio19_a_1_pins[] = { AB8505_PIN_T1 };
+static const unsigned gpio20_a_1_pins[] = { AB8505_PIN_P3 };
+static const unsigned gpio34_a_1_pins[] = { AB8505_PIN_H14 };
+static const unsigned gpio40_a_1_pins[] = { AB8505_PIN_J15 };
+static const unsigned gpio41_a_1_pins[] = { AB8505_PIN_J14 };
+static const unsigned uartrxdata_a_1_pins[] = { AB8505_PIN_J14 };
+static const unsigned gpio50_a_1_pins[] = { AB8505_PIN_L4 };
+static const unsigned gpio52_a_1_pins[] = { AB8505_PIN_D16 };
+static const unsigned gpio53_a_1_pins[] = { AB8505_PIN_D15 };
+
+/* Altfunction B colum */
+static const unsigned pdmdata_b_1_pins[] = { AB8505_PIN_B16 };
+static const unsigned extvibrapwm1_b_1_pins[] = { AB8505_PIN_D17 };
+static const unsigned extvibrapwm2_b_1_pins[] = { AB8505_PIN_L4 };
+
+/* Altfunction C column */
+static const unsigned usbvdat_c_1_pins[] = { AB8505_PIN_D17 };
+
+#define AB8505_PIN_GROUP(a, b) { .name = #a, .pins = a##_pins,         \
+                       .npins = ARRAY_SIZE(a##_pins), .altsetting = b }
+
+static const struct abx500_pingroup ab8505_groups[] = {
+       AB8505_PIN_GROUP(sysclkreq2_d_1, ABX500_DEFAULT),
+       AB8505_PIN_GROUP(sysclkreq3_d_1, ABX500_DEFAULT),
+       AB8505_PIN_GROUP(sysclkreq4_d_1, ABX500_DEFAULT),
+       AB8505_PIN_GROUP(gpio10_d_1, ABX500_DEFAULT),
+       AB8505_PIN_GROUP(gpio11_d_1, ABX500_DEFAULT),
+       AB8505_PIN_GROUP(gpio13_d_1, ABX500_DEFAULT),
+       AB8505_PIN_GROUP(pwmout1_d_1, ABX500_DEFAULT),
+       AB8505_PIN_GROUP(adi2_d_1, ABX500_DEFAULT),
+       AB8505_PIN_GROUP(extcpena_d_1, ABX500_DEFAULT),
+       AB8505_PIN_GROUP(modsclsda_d_1, ABX500_DEFAULT),
+       AB8505_PIN_GROUP(gpio50_d_1, ABX500_DEFAULT),
+       AB8505_PIN_GROUP(resethw_d_1, ABX500_DEFAULT),
+       AB8505_PIN_GROUP(service_d_1, ABX500_DEFAULT),
+       AB8505_PIN_GROUP(gpio1_a_1, ABX500_ALT_A),
+       AB8505_PIN_GROUP(gpio2_a_1, ABX500_ALT_A),
+       AB8505_PIN_GROUP(gpio3_a_1, ABX500_ALT_A),
+       AB8505_PIN_GROUP(hiqclkena_a_1, ABX500_ALT_A),
+       AB8505_PIN_GROUP(pdmclk_a_1, ABX500_ALT_A),
+       AB8505_PIN_GROUP(uarttxdata_a_1, ABX500_ALT_A),
+       AB8505_PIN_GROUP(gpio14_a_1, ABX500_ALT_A),
+       AB8505_PIN_GROUP(gpio17_a_1, ABX500_ALT_A),
+       AB8505_PIN_GROUP(gpio18_a_1, ABX500_ALT_A),
+       AB8505_PIN_GROUP(gpio19_a_1, ABX500_ALT_A),
+       AB8505_PIN_GROUP(gpio20_a_1, ABX500_ALT_A),
+       AB8505_PIN_GROUP(gpio34_a_1, ABX500_ALT_A),
+       AB8505_PIN_GROUP(gpio40_a_1, ABX500_ALT_A),
+       AB8505_PIN_GROUP(gpio41_a_1, ABX500_ALT_A),
+       AB8505_PIN_GROUP(uartrxdata_a_1, ABX500_ALT_A),
+       AB8505_PIN_GROUP(gpio52_a_1, ABX500_ALT_A),
+       AB8505_PIN_GROUP(gpio53_a_1, ABX500_ALT_A),
+       AB8505_PIN_GROUP(pdmdata_b_1, ABX500_ALT_B),
+       AB8505_PIN_GROUP(extvibrapwm1_b_1, ABX500_ALT_B),
+       AB8505_PIN_GROUP(extvibrapwm2_b_1, ABX500_ALT_B),
+       AB8505_PIN_GROUP(usbvdat_c_1, ABX500_ALT_C),
+};
+
+/* We use this macro to define the groups applicable to a function */
+#define AB8505_FUNC_GROUPS(a, b...)       \
+static const char * const a##_groups[] = { b };
+
+AB8505_FUNC_GROUPS(sysclkreq, "sysclkreq2_d_1", "sysclkreq3_d_1",
+               "sysclkreq4_d_1");
+AB8505_FUNC_GROUPS(gpio, "gpio1_a_1", "gpio2_a_1", "gpio3_a_1",
+               "gpio10_d_1", "gpio11_d_1", "gpio13_d_1", "gpio14_a_1",
+               "gpio17_a_1", "gpio18_a_1", "gpio19_a_1", "gpio20_a_1",
+               "gpio34_a_1", "gpio40_a_1", "gpio41_a_1", "gpio50_d_1",
+               "gpio52_a_1", "gpio53_a_1");
+AB8505_FUNC_GROUPS(pwmout, "pwmout1_d_1");
+AB8505_FUNC_GROUPS(adi2, "adi2_d_1");
+AB8505_FUNC_GROUPS(extcpena, "extcpena_d_1");
+AB8505_FUNC_GROUPS(modsclsda, "modsclsda_d_1");
+AB8505_FUNC_GROUPS(resethw, "resethw_d_1");
+AB8505_FUNC_GROUPS(service, "service_d_1");
+AB8505_FUNC_GROUPS(hiqclkena, "hiqclkena_a_1");
+AB8505_FUNC_GROUPS(pdm, "pdmclk_a_1", "pdmdata_b_1");
+AB8505_FUNC_GROUPS(uartdata, "uarttxdata_a_1", "uartrxdata_a_1");
+AB8505_FUNC_GROUPS(extvibra, "extvibrapwm1_b_1", "extvibrapwm2_b_1");
+AB8505_FUNC_GROUPS(usbvdat, "usbvdat_c_1");
+
+#define FUNCTION(fname)                                        \
+       {                                               \
+               .name = #fname,                         \
+               .groups = fname##_groups,               \
+               .ngroups = ARRAY_SIZE(fname##_groups),  \
+       }
+
+static const struct abx500_function ab8505_functions[] = {
+       FUNCTION(sysclkreq),
+       FUNCTION(gpio),
+       FUNCTION(pwmout),
+       FUNCTION(adi2),
+       FUNCTION(extcpena),
+       FUNCTION(modsclsda),
+       FUNCTION(resethw),
+       FUNCTION(service),
+       FUNCTION(hiqclkena),
+       FUNCTION(pdm),
+       FUNCTION(uartdata),
+       FUNCTION(extvibra),
+       FUNCTION(extvibra),
+       FUNCTION(usbvdat),
+};
+
+/*
+ * this table translates what's is in the AB8505 specification regarding the
+ * balls alternate functions (as for DB, default, ALT_A, ALT_B and ALT_C).
+ * ALTERNATE_FUNCTIONS(GPIO_NUMBER, GPIOSEL bit, ALTERNATFUNC bit1,
+ * ALTERNATEFUNC bit2, ALTA val, ALTB val, ALTC val),
+ *
+ * example :
+ *
+ *     ALTERNATE_FUNCTIONS(13,     4,      3,      4, 1, 0, 2),
+ *     means that pin AB8505_PIN_D18 (pin 13) supports 4 mux (default/ALT_A,
+ *     ALT_B and ALT_C), so GPIOSEL and ALTERNATFUNC registers are used to
+ *     select the mux. ALTA, ALTB and ALTC val indicates values to write in
+ *     ALTERNATFUNC register. We need to specifies these values as SOC
+ *     designers didn't apply the same logic on how to select mux in the
+ *     ABx500 family.
+ *
+ *     As this pins supports at least ALT_B mux, default mux is
+ *     selected by writing 1 in GPIOSEL bit :
+ *
+ *             | GPIOSEL bit=4 | alternatfunc bit2=4 | alternatfunc bit1=3
+ *     default |       1       |          0          |          0
+ *     alt_A   |       0       |          0          |          1
+ *     alt_B   |       0       |          0          |          0
+ *     alt_C   |       0       |          1          |          0
+ *
+ *     ALTERNATE_FUNCTIONS(1,      0, UNUSED, UNUSED),
+ *     means that pin AB9540_PIN_R4 (pin 1) supports 2 mux, so only GPIOSEL
+ *     register is used to select the mux. As this pins doesn't support at
+ *     least ALT_B mux, default mux is by writing 0 in GPIOSEL bit :
+ *
+ *             | GPIOSEL bit=0 | alternatfunc bit2=  | alternatfunc bit1=
+ *     default |       0       |          0          |          0
+ *     alt_A   |       1       |          0          |          0
+ */
+
+static struct
+alternate_functions ab8505_alternate_functions[AB8505_GPIO_MAX_NUMBER + 1] = {
+       ALTERNATE_FUNCTIONS(0, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO0 */
+       ALTERNATE_FUNCTIONS(1,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO1, altA controlled by bit 0 */
+       ALTERNATE_FUNCTIONS(2,      1, UNUSED, UNUSED, 0, 0, 0), /* GPIO2, altA controlled by bit 1 */
+       ALTERNATE_FUNCTIONS(3,      2, UNUSED, UNUSED, 0, 0, 0), /* GPIO3, altA controlled by bit 2*/
+       ALTERNATE_FUNCTIONS(4, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO4, bit 3 reserved */
+       ALTERNATE_FUNCTIONS(5, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO5, bit 4 reserved */
+       ALTERNATE_FUNCTIONS(6, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO6, bit 5 reserved */
+       ALTERNATE_FUNCTIONS(7, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO7, bit 6 reserved */
+       ALTERNATE_FUNCTIONS(8, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO8, bit 7 reserved */
+
+       ALTERNATE_FUNCTIONS(9, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO9, bit 0 reserved */
+       ALTERNATE_FUNCTIONS(10,      1,      0, UNUSED, 1, 0, 0), /* GPIO10, altA and altB controlled by bit 0 */
+       ALTERNATE_FUNCTIONS(11,      2,      1, UNUSED, 0, 0, 0), /* GPIO11, altA controlled by bit 2 */
+       ALTERNATE_FUNCTIONS(12, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO12, bit3 reseved */
+       ALTERNATE_FUNCTIONS(13,      4,      3,      4, 1, 0, 2), /* GPIO13, altA altB and altC controlled by bit 3 and 4 */
+       ALTERNATE_FUNCTIONS(14,      5, UNUSED, UNUSED, 0, 0, 0), /* GPIO14, altA controlled by bit 5 */
+       ALTERNATE_FUNCTIONS(15, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO15, bit 6 reserved */
+       ALTERNATE_FUNCTIONS(16, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO15, bit 7 reserved  */
+       /*
+        * pins 17 to 20 are special case, only bit 0 is used to select
+        * alternate function for these 4 pins.
+        * bits 1 to 3 are reserved
+        */
+       ALTERNATE_FUNCTIONS(17,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO17, altA controlled by bit 0 */
+       ALTERNATE_FUNCTIONS(18,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO18, altA controlled by bit 0 */
+       ALTERNATE_FUNCTIONS(19,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO19, altA controlled by bit 0 */
+       ALTERNATE_FUNCTIONS(20,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO20, altA controlled by bit 0 */
+       ALTERNATE_FUNCTIONS(21, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO21, bit 4 reserved */
+       ALTERNATE_FUNCTIONS(22, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO22, bit 5 reserved */
+       ALTERNATE_FUNCTIONS(23, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO23, bit 6 reserved */
+       ALTERNATE_FUNCTIONS(24, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO24, bit 7 reserved */
+
+       ALTERNATE_FUNCTIONS(25, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO25, bit 0 reserved */
+       ALTERNATE_FUNCTIONS(26, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO26, bit 1 reserved */
+       ALTERNATE_FUNCTIONS(27, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO27, bit 2 reserved */
+       ALTERNATE_FUNCTIONS(28, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO28, bit 3 reserved */
+       ALTERNATE_FUNCTIONS(29, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO29, bit 4 reserved */
+       ALTERNATE_FUNCTIONS(30, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO30, bit 5 reserved */
+       ALTERNATE_FUNCTIONS(31, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO31, bit 6 reserved */
+       ALTERNATE_FUNCTIONS(32, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO32, bit 7 reserved */
+
+       ALTERNATE_FUNCTIONS(33, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO33, bit 0 reserved */
+       ALTERNATE_FUNCTIONS(34,      1, UNUSED, UNUSED, 0, 0, 0), /* GPIO34, altA controlled by bit 1 */
+       ALTERNATE_FUNCTIONS(35, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO35, bit 2 reserved */
+       ALTERNATE_FUNCTIONS(36, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO36, bit 2 reserved */
+       ALTERNATE_FUNCTIONS(37, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO37, bit 2 reserved */
+       ALTERNATE_FUNCTIONS(38, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO38, bit 2 reserved */
+       ALTERNATE_FUNCTIONS(39, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO39, bit 2 reserved */
+       ALTERNATE_FUNCTIONS(40,      7, UNUSED, UNUSED, 0, 0, 0), /* GPIO40, altA controlled by bit 7*/
+
+       ALTERNATE_FUNCTIONS(41,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO41, altA controlled by bit 0 */
+       ALTERNATE_FUNCTIONS(42, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO42, bit 1 reserved */
+       ALTERNATE_FUNCTIONS(43, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO43, bit 2 reserved */
+       ALTERNATE_FUNCTIONS(44, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO44, bit 3 reserved */
+       ALTERNATE_FUNCTIONS(45, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO45, bit 4 reserved */
+       ALTERNATE_FUNCTIONS(46, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO46, bit 5 reserved */
+       ALTERNATE_FUNCTIONS(47, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO47, bit 6 reserved */
+       ALTERNATE_FUNCTIONS(48, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO48, bit 7 reserved */
+
+       ALTERNATE_FUNCTIONS(49, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO49, bit 0 reserved */
+       ALTERNATE_FUNCTIONS(50,      1,      2, UNUSED, 1, 0, 0), /* GPIO50, altA controlled by bit 1 */
+       ALTERNATE_FUNCTIONS(51, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO49, bit 0 reserved */
+       ALTERNATE_FUNCTIONS(52,      3, UNUSED, UNUSED, 0, 0, 0), /* GPIO52, altA controlled by bit 3 */
+       ALTERNATE_FUNCTIONS(53,      4, UNUSED, UNUSED, 0, 0, 0), /* GPIO53, altA controlled by bit 4 */
+};
+
+/*
+ * For AB8505 Only some GPIOs are interrupt capable, and they are
+ * organized in discontiguous clusters:
+ *
+ *     GPIO10 to GPIO11
+ *     GPIO13
+ *     GPIO40 and GPIO41
+ *     GPIO50
+ *     GPIO52 to GPIO53
+ */
+static struct abx500_gpio_irq_cluster ab8505_gpio_irq_cluster[] = {
+       GPIO_IRQ_CLUSTER(10, 11, AB8500_INT_GPIO10R),
+       GPIO_IRQ_CLUSTER(13, 13, AB8500_INT_GPIO13R),
+       GPIO_IRQ_CLUSTER(40, 41, AB8500_INT_GPIO40R),
+       GPIO_IRQ_CLUSTER(50, 50, AB9540_INT_GPIO50R),
+       GPIO_IRQ_CLUSTER(52, 53, AB9540_INT_GPIO52R),
+};
+
+static struct abx500_pinctrl_soc_data ab8505_soc = {
+       .gpio_ranges = ab8505_pinranges,
+       .gpio_num_ranges = ARRAY_SIZE(ab8505_pinranges),
+       .pins = ab8505_pins,
+       .npins = ARRAY_SIZE(ab8505_pins),
+       .functions = ab8505_functions,
+       .nfunctions = ARRAY_SIZE(ab8505_functions),
+       .groups = ab8505_groups,
+       .ngroups = ARRAY_SIZE(ab8505_groups),
+       .alternate_functions = ab8505_alternate_functions,
+       .gpio_irq_cluster = ab8505_gpio_irq_cluster,
+       .ngpio_irq_cluster = ARRAY_SIZE(ab8505_gpio_irq_cluster),
+       .irq_gpio_rising_offset = AB8500_INT_GPIO6R,
+       .irq_gpio_falling_offset = AB8500_INT_GPIO6F,
+       .irq_gpio_factor = 1,
+};
+
+void
+abx500_pinctrl_ab8505_init(struct abx500_pinctrl_soc_data **soc)
+{
+       *soc = &ab8505_soc;
+}
diff --git a/drivers/pinctrl/nomadik/pinctrl-ab8540.c b/drivers/pinctrl/nomadik/pinctrl-ab8540.c
new file mode 100644 (file)
index 0000000..9867535
--- /dev/null
@@ -0,0 +1,408 @@
+/*
+ * Copyright (C) ST-Ericsson SA 2012
+ *
+ * Author: Patrice Chotard <patrice.chotard@stericsson.com> for ST-Ericsson.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/kernel.h>
+#include <linux/gpio.h>
+#include <linux/pinctrl/pinctrl.h>
+#include <linux/mfd/abx500/ab8500.h>
+#include "pinctrl-abx500.h"
+
+/* All the pins that can be used for GPIO and some other functions */
+#define ABX500_GPIO(offset)            (offset)
+
+#define AB8540_PIN_J16         ABX500_GPIO(1)
+#define AB8540_PIN_D17         ABX500_GPIO(2)
+#define AB8540_PIN_C12         ABX500_GPIO(3)
+#define AB8540_PIN_G12         ABX500_GPIO(4)
+/* hole */
+#define AB8540_PIN_D16         ABX500_GPIO(14)
+#define AB8540_PIN_F15         ABX500_GPIO(15)
+#define AB8540_PIN_J8          ABX500_GPIO(16)
+#define AB8540_PIN_K16         ABX500_GPIO(17)
+#define AB8540_PIN_G15         ABX500_GPIO(18)
+#define AB8540_PIN_F17         ABX500_GPIO(19)
+#define AB8540_PIN_E17         ABX500_GPIO(20)
+/* hole */
+#define AB8540_PIN_AA16                ABX500_GPIO(27)
+#define AB8540_PIN_W18         ABX500_GPIO(28)
+#define AB8540_PIN_Y15         ABX500_GPIO(29)
+#define AB8540_PIN_W16         ABX500_GPIO(30)
+#define AB8540_PIN_V15         ABX500_GPIO(31)
+#define AB8540_PIN_W17         ABX500_GPIO(32)
+/* hole */
+#define AB8540_PIN_D12         ABX500_GPIO(42)
+#define AB8540_PIN_P4          ABX500_GPIO(43)
+#define AB8540_PIN_AB1         ABX500_GPIO(44)
+#define AB8540_PIN_K7          ABX500_GPIO(45)
+#define AB8540_PIN_L7          ABX500_GPIO(46)
+#define AB8540_PIN_G10         ABX500_GPIO(47)
+#define AB8540_PIN_K12         ABX500_GPIO(48)
+/* hole */
+#define AB8540_PIN_N8          ABX500_GPIO(51)
+#define AB8540_PIN_P12         ABX500_GPIO(52)
+#define AB8540_PIN_K8          ABX500_GPIO(53)
+#define AB8540_PIN_J11         ABX500_GPIO(54)
+#define AB8540_PIN_AC2         ABX500_GPIO(55)
+#define AB8540_PIN_AB2         ABX500_GPIO(56)
+
+/* indicates the highest GPIO number */
+#define AB8540_GPIO_MAX_NUMBER 56
+
+/*
+ * The names of the pins are denoted by GPIO number and ball name, even
+ * though they can be used for other things than GPIO, this is the first
+ * column in the table of the data sheet and often used on schematics and
+ * such.
+ */
+static const struct pinctrl_pin_desc ab8540_pins[] = {
+       PINCTRL_PIN(AB8540_PIN_J16, "GPIO1_J16"),
+       PINCTRL_PIN(AB8540_PIN_D17, "GPIO2_D17"),
+       PINCTRL_PIN(AB8540_PIN_C12, "GPIO3_C12"),
+       PINCTRL_PIN(AB8540_PIN_G12, "GPIO4_G12"),
+       /* hole */
+       PINCTRL_PIN(AB8540_PIN_D16, "GPIO14_D16"),
+       PINCTRL_PIN(AB8540_PIN_F15, "GPIO15_F15"),
+       PINCTRL_PIN(AB8540_PIN_J8, "GPIO16_J8"),
+       PINCTRL_PIN(AB8540_PIN_K16, "GPIO17_K16"),
+       PINCTRL_PIN(AB8540_PIN_G15, "GPIO18_G15"),
+       PINCTRL_PIN(AB8540_PIN_F17, "GPIO19_F17"),
+       PINCTRL_PIN(AB8540_PIN_E17, "GPIO20_E17"),
+       /* hole */
+       PINCTRL_PIN(AB8540_PIN_AA16, "GPIO27_AA16"),
+       PINCTRL_PIN(AB8540_PIN_W18, "GPIO28_W18"),
+       PINCTRL_PIN(AB8540_PIN_Y15, "GPIO29_Y15"),
+       PINCTRL_PIN(AB8540_PIN_W16, "GPIO30_W16"),
+       PINCTRL_PIN(AB8540_PIN_V15, "GPIO31_V15"),
+       PINCTRL_PIN(AB8540_PIN_W17, "GPIO32_W17"),
+       /* hole */
+       PINCTRL_PIN(AB8540_PIN_D12, "GPIO42_D12"),
+       PINCTRL_PIN(AB8540_PIN_P4, "GPIO43_P4"),
+       PINCTRL_PIN(AB8540_PIN_AB1, "GPIO44_AB1"),
+       PINCTRL_PIN(AB8540_PIN_K7, "GPIO45_K7"),
+       PINCTRL_PIN(AB8540_PIN_L7, "GPIO46_L7"),
+       PINCTRL_PIN(AB8540_PIN_G10, "GPIO47_G10"),
+       PINCTRL_PIN(AB8540_PIN_K12, "GPIO48_K12"),
+       /* hole */
+       PINCTRL_PIN(AB8540_PIN_N8, "GPIO51_N8"),
+       PINCTRL_PIN(AB8540_PIN_P12, "GPIO52_P12"),
+       PINCTRL_PIN(AB8540_PIN_K8, "GPIO53_K8"),
+       PINCTRL_PIN(AB8540_PIN_J11, "GPIO54_J11"),
+       PINCTRL_PIN(AB8540_PIN_AC2, "GPIO55_AC2"),
+       PINCTRL_PIN(AB8540_PIN_AB2, "GPIO56_AB2"),
+};
+
+/*
+ * Maps local GPIO offsets to local pin numbers
+ */
+static const struct abx500_pinrange ab8540_pinranges[] = {
+       ABX500_PINRANGE(1, 4, ABX500_ALT_A),
+       ABX500_PINRANGE(14, 7, ABX500_ALT_A),
+       ABX500_PINRANGE(27, 6, ABX500_ALT_A),
+       ABX500_PINRANGE(42, 7, ABX500_ALT_A),
+       ABX500_PINRANGE(51, 6, ABX500_ALT_A),
+};
+
+/*
+ * Read the pin group names like this:
+ * sysclkreq2_d_1 = first groups of pins for sysclkreq2 on default function
+ *
+ * The groups are arranged as sets per altfunction column, so we can
+ * mux in one group at a time by selecting the same altfunction for them
+ * all. When functions require pins on different altfunctions, you need
+ * to combine several groups.
+ */
+
+/* default column */
+static const unsigned sysclkreq2_d_1_pins[] = { AB8540_PIN_J16 };
+static const unsigned sysclkreq3_d_1_pins[] = { AB8540_PIN_D17 };
+static const unsigned sysclkreq4_d_1_pins[] = { AB8540_PIN_C12 };
+static const unsigned sysclkreq6_d_1_pins[] = { AB8540_PIN_G12 };
+static const unsigned pwmout1_d_1_pins[] = { AB8540_PIN_D16 };
+static const unsigned pwmout2_d_1_pins[] = { AB8540_PIN_F15 };
+static const unsigned pwmout3_d_1_pins[] = { AB8540_PIN_J8 };
+
+/* audio data interface 1*/
+static const unsigned adi1_d_1_pins[] = { AB8540_PIN_K16, AB8540_PIN_G15,
+                                       AB8540_PIN_F17, AB8540_PIN_E17 };
+/* Digital microphone 1 and 2 */
+static const unsigned dmic12_d_1_pins[] = { AB8540_PIN_AA16, AB8540_PIN_W18 };
+/* Digital microphone 3 and 4 */
+static const unsigned dmic34_d_1_pins[] = { AB8540_PIN_Y15, AB8540_PIN_W16 };
+/* Digital microphone 5 and 6 */
+static const unsigned dmic56_d_1_pins[] = { AB8540_PIN_V15, AB8540_PIN_W17 };
+static const unsigned sysclkreq5_d_1_pins[] = { AB8540_PIN_D12 };
+static const unsigned batremn_d_1_pins[] = { AB8540_PIN_P4 };
+static const unsigned service_d_1_pins[] = { AB8540_PIN_AB1 };
+static const unsigned pwrctrl0_d_1_pins[] = { AB8540_PIN_K7 };
+static const unsigned pwrctrl1_d_1_pins[] = { AB8540_PIN_L7 };
+static const unsigned pwmextvibra1_d_1_pins[] = { AB8540_PIN_G10 };
+static const unsigned pwmextvibra2_d_1_pins[] = { AB8540_PIN_K12 };
+static const unsigned gpio1_vbat_d_1_pins[] = { AB8540_PIN_N8 };
+static const unsigned gpio2_vbat_d_1_pins[] = { AB8540_PIN_P12 };
+static const unsigned gpio3_vbat_d_1_pins[] = { AB8540_PIN_K8 };
+static const unsigned gpio4_vbat_d_1_pins[] = { AB8540_PIN_J11 };
+static const unsigned pdmclkdat_d_1_pins[] = { AB8540_PIN_AC2, AB8540_PIN_AB2 };
+
+/* Altfunction A column */
+static const unsigned gpio1_a_1_pins[] = { AB8540_PIN_J16 };
+static const unsigned gpio2_a_1_pins[] = { AB8540_PIN_D17 };
+static const unsigned gpio3_a_1_pins[] = { AB8540_PIN_C12 };
+static const unsigned gpio4_a_1_pins[] = { AB8540_PIN_G12 };
+static const unsigned gpio14_a_1_pins[] = { AB8540_PIN_D16 };
+static const unsigned gpio15_a_1_pins[] = { AB8540_PIN_F15 };
+static const unsigned gpio16_a_1_pins[] = { AB8540_PIN_J8 };
+static const unsigned gpio17_a_1_pins[] = { AB8540_PIN_K16 };
+static const unsigned gpio18_a_1_pins[] = { AB8540_PIN_G15 };
+static const unsigned gpio19_a_1_pins[] = { AB8540_PIN_F17 };
+static const unsigned gpio20_a_1_pins[] = { AB8540_PIN_E17 };
+static const unsigned gpio27_a_1_pins[] = { AB8540_PIN_AA16 };
+static const unsigned gpio28_a_1_pins[] = { AB8540_PIN_W18 };
+static const unsigned gpio29_a_1_pins[] = { AB8540_PIN_Y15 };
+static const unsigned gpio30_a_1_pins[] = { AB8540_PIN_W16 };
+static const unsigned gpio31_a_1_pins[] = { AB8540_PIN_V15 };
+static const unsigned gpio32_a_1_pins[] = { AB8540_PIN_W17 };
+static const unsigned gpio42_a_1_pins[] = { AB8540_PIN_D12 };
+static const unsigned gpio43_a_1_pins[] = { AB8540_PIN_P4 };
+static const unsigned gpio44_a_1_pins[] = { AB8540_PIN_AB1 };
+static const unsigned gpio45_a_1_pins[] = { AB8540_PIN_K7 };
+static const unsigned gpio46_a_1_pins[] = { AB8540_PIN_L7 };
+static const unsigned gpio47_a_1_pins[] = { AB8540_PIN_G10 };
+static const unsigned gpio48_a_1_pins[] = { AB8540_PIN_K12 };
+static const unsigned gpio51_a_1_pins[] = { AB8540_PIN_N8 };
+static const unsigned gpio52_a_1_pins[] = { AB8540_PIN_P12 };
+static const unsigned gpio53_a_1_pins[] = { AB8540_PIN_K8 };
+static const unsigned gpio54_a_1_pins[] = { AB8540_PIN_J11 };
+static const unsigned gpio55_a_1_pins[] = { AB8540_PIN_AC2 };
+static const unsigned gpio56_a_1_pins[] = { AB8540_PIN_AB2 };
+
+#define AB8540_PIN_GROUP(a, b) { .name = #a, .pins = a##_pins,         \
+                       .npins = ARRAY_SIZE(a##_pins), .altsetting = b }
+
+static const struct abx500_pingroup ab8540_groups[] = {
+       /* default column */
+       AB8540_PIN_GROUP(sysclkreq2_d_1, ABX500_DEFAULT),
+       AB8540_PIN_GROUP(sysclkreq3_d_1, ABX500_DEFAULT),
+       AB8540_PIN_GROUP(sysclkreq4_d_1, ABX500_DEFAULT),
+       AB8540_PIN_GROUP(sysclkreq6_d_1, ABX500_DEFAULT),
+       AB8540_PIN_GROUP(pwmout1_d_1, ABX500_DEFAULT),
+       AB8540_PIN_GROUP(pwmout2_d_1, ABX500_DEFAULT),
+       AB8540_PIN_GROUP(pwmout3_d_1, ABX500_DEFAULT),
+       AB8540_PIN_GROUP(adi1_d_1, ABX500_DEFAULT),
+       AB8540_PIN_GROUP(dmic12_d_1, ABX500_DEFAULT),
+       AB8540_PIN_GROUP(dmic34_d_1, ABX500_DEFAULT),
+       AB8540_PIN_GROUP(dmic56_d_1, ABX500_DEFAULT),
+       AB8540_PIN_GROUP(sysclkreq5_d_1, ABX500_DEFAULT),
+       AB8540_PIN_GROUP(batremn_d_1, ABX500_DEFAULT),
+       AB8540_PIN_GROUP(service_d_1, ABX500_DEFAULT),
+       AB8540_PIN_GROUP(pwrctrl0_d_1, ABX500_DEFAULT),
+       AB8540_PIN_GROUP(pwrctrl1_d_1, ABX500_DEFAULT),
+       AB8540_PIN_GROUP(pwmextvibra1_d_1, ABX500_DEFAULT),
+       AB8540_PIN_GROUP(pwmextvibra2_d_1, ABX500_DEFAULT),
+       AB8540_PIN_GROUP(gpio1_vbat_d_1, ABX500_DEFAULT),
+       AB8540_PIN_GROUP(gpio2_vbat_d_1, ABX500_DEFAULT),
+       AB8540_PIN_GROUP(gpio3_vbat_d_1, ABX500_DEFAULT),
+       AB8540_PIN_GROUP(gpio4_vbat_d_1, ABX500_DEFAULT),
+       AB8540_PIN_GROUP(pdmclkdat_d_1, ABX500_DEFAULT),
+       /* Altfunction A column */
+       AB8540_PIN_GROUP(gpio1_a_1, ABX500_ALT_A),
+       AB8540_PIN_GROUP(gpio2_a_1, ABX500_ALT_A),
+       AB8540_PIN_GROUP(gpio3_a_1, ABX500_ALT_A),
+       AB8540_PIN_GROUP(gpio4_a_1, ABX500_ALT_A),
+       AB8540_PIN_GROUP(gpio14_a_1, ABX500_ALT_A),
+       AB8540_PIN_GROUP(gpio15_a_1, ABX500_ALT_A),
+       AB8540_PIN_GROUP(gpio16_a_1, ABX500_ALT_A),
+       AB8540_PIN_GROUP(gpio17_a_1, ABX500_ALT_A),
+       AB8540_PIN_GROUP(gpio18_a_1, ABX500_ALT_A),
+       AB8540_PIN_GROUP(gpio19_a_1, ABX500_ALT_A),
+       AB8540_PIN_GROUP(gpio20_a_1, ABX500_ALT_A),
+       AB8540_PIN_GROUP(gpio27_a_1, ABX500_ALT_A),
+       AB8540_PIN_GROUP(gpio28_a_1, ABX500_ALT_A),
+       AB8540_PIN_GROUP(gpio29_a_1, ABX500_ALT_A),
+       AB8540_PIN_GROUP(gpio30_a_1, ABX500_ALT_A),
+       AB8540_PIN_GROUP(gpio31_a_1, ABX500_ALT_A),
+       AB8540_PIN_GROUP(gpio32_a_1, ABX500_ALT_A),
+       AB8540_PIN_GROUP(gpio42_a_1, ABX500_ALT_A),
+       AB8540_PIN_GROUP(gpio43_a_1, ABX500_ALT_A),
+       AB8540_PIN_GROUP(gpio44_a_1, ABX500_ALT_A),
+       AB8540_PIN_GROUP(gpio45_a_1, ABX500_ALT_A),
+       AB8540_PIN_GROUP(gpio46_a_1, ABX500_ALT_A),
+       AB8540_PIN_GROUP(gpio47_a_1, ABX500_ALT_A),
+       AB8540_PIN_GROUP(gpio48_a_1, ABX500_ALT_A),
+       AB8540_PIN_GROUP(gpio51_a_1, ABX500_ALT_A),
+       AB8540_PIN_GROUP(gpio52_a_1, ABX500_ALT_A),
+       AB8540_PIN_GROUP(gpio53_a_1, ABX500_ALT_A),
+       AB8540_PIN_GROUP(gpio54_a_1, ABX500_ALT_A),
+       AB8540_PIN_GROUP(gpio55_a_1, ABX500_ALT_A),
+       AB8540_PIN_GROUP(gpio56_a_1, ABX500_ALT_A),
+};
+
+/* We use this macro to define the groups applicable to a function */
+#define AB8540_FUNC_GROUPS(a, b...)       \
+static const char * const a##_groups[] = { b };
+
+AB8540_FUNC_GROUPS(sysclkreq, "sysclkreq2_d_1", "sysclkreq3_d_1",
+               "sysclkreq4_d_1", "sysclkreq5_d_1", "sysclkreq6_d_1");
+AB8540_FUNC_GROUPS(gpio, "gpio1_a_1", "gpio2_a_1", "gpio3_a_1", "gpio4_a_1",
+               "gpio14_a_1", "gpio15_a_1", "gpio16_a_1", "gpio17_a_1",
+               "gpio18_a_1", "gpio19_a_1", "gpio20_a_1", "gpio27_a_1",
+               "gpio28_a_1", "gpio29_a_1", "gpio30_a_1", "gpio31_a_1",
+               "gpio32_a_1", "gpio42_a_1", "gpio43_a_1", "gpio44_a_1",
+               "gpio45_a_1", "gpio46_a_1", "gpio47_a_1", "gpio48_a_1",
+               "gpio51_a_1", "gpio52_a_1", "gpio53_a_1", "gpio54_a_1",
+               "gpio55_a_1", "gpio56_a_1");
+AB8540_FUNC_GROUPS(pwmout, "pwmout1_d_1", "pwmout2_d_1", "pwmout3_d_1");
+AB8540_FUNC_GROUPS(adi1, "adi1_d_1");
+AB8540_FUNC_GROUPS(dmic, "dmic12_d_1", "dmic34_d_1", "dmic56_d_1");
+AB8540_FUNC_GROUPS(batremn, "batremn_d_1");
+AB8540_FUNC_GROUPS(service, "service_d_1");
+AB8540_FUNC_GROUPS(pwrctrl, "pwrctrl0_d_1", "pwrctrl1_d_1");
+AB8540_FUNC_GROUPS(pwmextvibra, "pwmextvibra1_d_1", "pwmextvibra2_d_1");
+AB8540_FUNC_GROUPS(gpio_vbat, "gpio1_vbat_d_1", "gpio2_vbat_d_1",
+               "gpio3_vbat_d_1", "gpio4_vbat_d_1");
+AB8540_FUNC_GROUPS(pdm, "pdmclkdat_d_1");
+
+#define FUNCTION(fname)                                        \
+       {                                               \
+               .name = #fname,                         \
+               .groups = fname##_groups,               \
+               .ngroups = ARRAY_SIZE(fname##_groups),  \
+       }
+
+static const struct abx500_function ab8540_functions[] = {
+       FUNCTION(sysclkreq),
+       FUNCTION(gpio),
+       FUNCTION(pwmout),
+       FUNCTION(adi1),
+       FUNCTION(dmic),
+       FUNCTION(batremn),
+       FUNCTION(service),
+       FUNCTION(pwrctrl),
+       FUNCTION(pwmextvibra),
+       FUNCTION(gpio_vbat),
+       FUNCTION(pdm),
+};
+
+/*
+ * this table translates what's is in the AB8540 specification regarding the
+ * balls alternate functions (as for DB, default, ALT_A, ALT_B and ALT_C).
+ * ALTERNATE_FUNCTIONS(GPIO_NUMBER, GPIOSEL bit, ALTERNATFUNC bit1,
+ * ALTERNATEFUNC bit2, ALTA val, ALTB val, ALTC val),
+ * AB8540 only supports DEFAULT and ALTA functions, so ALTERNATFUNC
+ * registers is not used
+ *
+ */
+
+static struct
+alternate_functions ab8540_alternate_functions[AB8540_GPIO_MAX_NUMBER + 1] = {
+       /* GPIOSEL1 - bit 4-7 reserved */
+       ALTERNATE_FUNCTIONS(0, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO0 */
+       ALTERNATE_FUNCTIONS(1,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO1, altA controlled by bit 0 */
+       ALTERNATE_FUNCTIONS(2,      1, UNUSED, UNUSED, 0, 0, 0), /* GPIO2, altA controlled by bit 1 */
+       ALTERNATE_FUNCTIONS(3,      2, UNUSED, UNUSED, 0, 0, 0), /* GPIO3, altA controlled by bit 2*/
+       ALTERNATE_FUNCTIONS(4,      3, UNUSED, UNUSED, 0, 0, 0), /* GPIO4, altA controlled by bit 3*/
+       ALTERNATE_FUNCTIONS(5, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO5 */
+       ALTERNATE_FUNCTIONS(6, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO6 */
+       ALTERNATE_FUNCTIONS(7, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO7 */
+       ALTERNATE_FUNCTIONS(8, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO8 */
+       /* GPIOSEL2 - bit 0-4 reserved */
+       ALTERNATE_FUNCTIONS(9,  UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO9 */
+       ALTERNATE_FUNCTIONS(10, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO10 */
+       ALTERNATE_FUNCTIONS(11, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO11 */
+       ALTERNATE_FUNCTIONS(12, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO12 */
+       ALTERNATE_FUNCTIONS(13, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO13 */
+       ALTERNATE_FUNCTIONS(14,      5, UNUSED, UNUSED, 0, 0, 0), /* GPIO14, altA controlled by bit 5 */
+       ALTERNATE_FUNCTIONS(15,      6, UNUSED, UNUSED, 0, 0, 0), /* GPIO15, altA controlled by bit 6 */
+       ALTERNATE_FUNCTIONS(16,      7, UNUSED, UNUSED, 0, 0, 0), /* GPIO16, altA controlled by bit 7 */
+       /* GPIOSEL3 - bit 4-7 reserved */
+       ALTERNATE_FUNCTIONS(17,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO17, altA controlled by bit 0 */
+       ALTERNATE_FUNCTIONS(18,      1, UNUSED, UNUSED, 0, 0, 0), /* GPIO18, altA controlled by bit 1 */
+       ALTERNATE_FUNCTIONS(19,      2, UNUSED, UNUSED, 0, 0, 0), /* GPIO19, altA controlled by bit 2 */
+       ALTERNATE_FUNCTIONS(20,      3, UNUSED, UNUSED, 0, 0, 0), /* GPIO20, altA controlled by bit 3 */
+       ALTERNATE_FUNCTIONS(21, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO21 */
+       ALTERNATE_FUNCTIONS(22, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO22 */
+       ALTERNATE_FUNCTIONS(23, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO23 */
+       ALTERNATE_FUNCTIONS(24, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO24 */
+       /* GPIOSEL4 - bit 0-1 reserved */
+       ALTERNATE_FUNCTIONS(25, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO25 */
+       ALTERNATE_FUNCTIONS(26, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO26 */
+       ALTERNATE_FUNCTIONS(27,      2, UNUSED, UNUSED, 0, 0, 0), /* GPIO27, altA controlled by bit 2 */
+       ALTERNATE_FUNCTIONS(28,      3, UNUSED, UNUSED, 0, 0, 0), /* GPIO28, altA controlled by bit 3 */
+       ALTERNATE_FUNCTIONS(29,      4, UNUSED, UNUSED, 0, 0, 0), /* GPIO29, altA controlled by bit 4 */
+       ALTERNATE_FUNCTIONS(30,      5, UNUSED, UNUSED, 0, 0, 0), /* GPIO30, altA controlled by bit 5 */
+       ALTERNATE_FUNCTIONS(31,      6, UNUSED, UNUSED, 0, 0, 0), /* GPIO31, altA controlled by bit 6 */
+       ALTERNATE_FUNCTIONS(32,      7, UNUSED, UNUSED, 0, 0, 0), /* GPIO32, altA controlled by bit 7 */
+       /* GPIOSEL5 - bit 0-7 reserved */
+       ALTERNATE_FUNCTIONS(33, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO33 */
+       ALTERNATE_FUNCTIONS(34, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO34 */
+       ALTERNATE_FUNCTIONS(35, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO35 */
+       ALTERNATE_FUNCTIONS(36, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO36 */
+       ALTERNATE_FUNCTIONS(37, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO37 */
+       ALTERNATE_FUNCTIONS(38, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO38 */
+       ALTERNATE_FUNCTIONS(39, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO39 */
+       ALTERNATE_FUNCTIONS(40, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO40 */
+       /* GPIOSEL6 - bit 0 reserved */
+       ALTERNATE_FUNCTIONS(41, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO41 */
+       ALTERNATE_FUNCTIONS(42,      1, UNUSED, UNUSED, 0, 0, 0), /* GPIO42, altA controlled by bit 1 */
+       ALTERNATE_FUNCTIONS(43,      2, UNUSED, UNUSED, 0, 0, 0), /* GPIO43, altA controlled by bit 2 */
+       ALTERNATE_FUNCTIONS(44,      3, UNUSED, UNUSED, 0, 0, 0), /* GPIO44, altA controlled by bit 3 */
+       ALTERNATE_FUNCTIONS(45,      4, UNUSED, UNUSED, 0, 0, 0), /* GPIO45, altA controlled by bit 4 */
+       ALTERNATE_FUNCTIONS(46,      5, UNUSED, UNUSED, 0, 0, 0), /* GPIO46, altA controlled by bit 5 */
+       ALTERNATE_FUNCTIONS(47,      6, UNUSED, UNUSED, 0, 0, 0), /* GPIO47, altA controlled by bit 6 */
+       ALTERNATE_FUNCTIONS(48,      7, UNUSED, UNUSED, 0, 0, 0), /* GPIO48, altA controlled by bit 7 */
+       /* GPIOSEL7 - bit 0-1 reserved */
+       ALTERNATE_FUNCTIONS(49, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO49 */
+       ALTERNATE_FUNCTIONS(50, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO50 */
+       ALTERNATE_FUNCTIONS(51,      2, UNUSED, UNUSED, 0, 0, 0), /* GPIO51, altA controlled by bit 2 */
+       ALTERNATE_FUNCTIONS(52,      3, UNUSED, UNUSED, 0, 0, 0), /* GPIO52, altA controlled by bit 3 */
+       ALTERNATE_FUNCTIONS(53,      4, UNUSED, UNUSED, 0, 0, 0), /* GPIO53, altA controlled by bit 4 */
+       ALTERNATE_FUNCTIONS(54,      5, UNUSED, UNUSED, 0, 0, 0), /* GPIO54, altA controlled by bit 5 */
+       ALTERNATE_FUNCTIONS(55,      6, UNUSED, UNUSED, 0, 0, 0), /* GPIO55, altA controlled by bit 6 */
+       ALTERNATE_FUNCTIONS(56,      7, UNUSED, UNUSED, 0, 0, 0), /* GPIO56, altA controlled by bit 7 */
+};
+
+static struct pullud ab8540_pullud = {
+       .first_pin = 51,        /* GPIO1_VBAT */
+       .last_pin = 54,         /* GPIO4_VBAT */
+};
+
+/*
+ * For AB8540 Only some GPIOs are interrupt capable:
+ *     GPIO43 to GPIO44
+ *     GPIO51 to GPIO54
+ */
+static struct abx500_gpio_irq_cluster ab8540_gpio_irq_cluster[] = {
+       GPIO_IRQ_CLUSTER(43, 43, AB8540_INT_GPIO43F),
+       GPIO_IRQ_CLUSTER(44, 44, AB8540_INT_GPIO44F),
+       GPIO_IRQ_CLUSTER(51, 54, AB9540_INT_GPIO51R),
+};
+
+static struct abx500_pinctrl_soc_data ab8540_soc = {
+       .gpio_ranges = ab8540_pinranges,
+       .gpio_num_ranges = ARRAY_SIZE(ab8540_pinranges),
+       .pins = ab8540_pins,
+       .npins = ARRAY_SIZE(ab8540_pins),
+       .functions = ab8540_functions,
+       .nfunctions = ARRAY_SIZE(ab8540_functions),
+       .groups = ab8540_groups,
+       .ngroups = ARRAY_SIZE(ab8540_groups),
+       .alternate_functions = ab8540_alternate_functions,
+       .pullud = &ab8540_pullud,
+       .gpio_irq_cluster = ab8540_gpio_irq_cluster,
+       .ngpio_irq_cluster = ARRAY_SIZE(ab8540_gpio_irq_cluster),
+       .irq_gpio_rising_offset = AB8540_INT_GPIO43R,
+       .irq_gpio_falling_offset = AB8540_INT_GPIO43F,
+       .irq_gpio_factor = 2,
+};
+
+void
+abx500_pinctrl_ab8540_init(struct abx500_pinctrl_soc_data **soc)
+{
+       *soc = &ab8540_soc;
+}
diff --git a/drivers/pinctrl/nomadik/pinctrl-ab9540.c b/drivers/pinctrl/nomadik/pinctrl-ab9540.c
new file mode 100644 (file)
index 0000000..1a281ca
--- /dev/null
@@ -0,0 +1,486 @@
+/*
+ * Copyright (C) ST-Ericsson SA 2012
+ *
+ * Author: Patrice Chotard <patrice.chotard@stericsson.com> for ST-Ericsson.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/kernel.h>
+#include <linux/gpio.h>
+#include <linux/pinctrl/pinctrl.h>
+#include <linux/mfd/abx500/ab8500.h>
+#include "pinctrl-abx500.h"
+
+/* All the pins that can be used for GPIO and some other functions */
+#define ABX500_GPIO(offset)            (offset)
+
+#define AB9540_PIN_R4          ABX500_GPIO(1)
+#define AB9540_PIN_V3          ABX500_GPIO(2)
+#define AB9540_PIN_T4          ABX500_GPIO(3)
+#define AB9540_PIN_T5          ABX500_GPIO(4)
+/* hole */
+#define AB9540_PIN_B18         ABX500_GPIO(10)
+#define AB9540_PIN_C18         ABX500_GPIO(11)
+/* hole */
+#define AB9540_PIN_D18         ABX500_GPIO(13)
+#define AB9540_PIN_B19         ABX500_GPIO(14)
+#define AB9540_PIN_C19         ABX500_GPIO(15)
+#define AB9540_PIN_D19         ABX500_GPIO(16)
+#define AB9540_PIN_R3          ABX500_GPIO(17)
+#define AB9540_PIN_T2          ABX500_GPIO(18)
+#define AB9540_PIN_U2          ABX500_GPIO(19)
+#define AB9540_PIN_V2          ABX500_GPIO(20)
+#define AB9540_PIN_N17         ABX500_GPIO(21)
+#define AB9540_PIN_N16         ABX500_GPIO(22)
+#define AB9540_PIN_M19         ABX500_GPIO(23)
+#define AB9540_PIN_T3          ABX500_GPIO(24)
+#define AB9540_PIN_W2          ABX500_GPIO(25)
+/* hole */
+#define AB9540_PIN_H4          ABX500_GPIO(27)
+#define AB9540_PIN_F1          ABX500_GPIO(28)
+#define AB9540_PIN_F4          ABX500_GPIO(29)
+#define AB9540_PIN_F2          ABX500_GPIO(30)
+#define AB9540_PIN_E4          ABX500_GPIO(31)
+#define AB9540_PIN_F3          ABX500_GPIO(32)
+/* hole */
+#define AB9540_PIN_J13         ABX500_GPIO(34)
+/* hole */
+#define AB9540_PIN_L17         ABX500_GPIO(40)
+#define AB9540_PIN_L16         ABX500_GPIO(41)
+#define AB9540_PIN_W3          ABX500_GPIO(42)
+#define AB9540_PIN_N4          ABX500_GPIO(50)
+#define AB9540_PIN_G12         ABX500_GPIO(51)
+#define AB9540_PIN_E17         ABX500_GPIO(52)
+#define AB9540_PIN_D11         ABX500_GPIO(53)
+#define AB9540_PIN_M18         ABX500_GPIO(54)
+
+/* indicates the highest GPIO number */
+#define AB9540_GPIO_MAX_NUMBER 54
+
+/*
+ * The names of the pins are denoted by GPIO number and ball name, even
+ * though they can be used for other things than GPIO, this is the first
+ * column in the table of the data sheet and often used on schematics and
+ * such.
+ */
+static const struct pinctrl_pin_desc ab9540_pins[] = {
+       PINCTRL_PIN(AB9540_PIN_R4, "GPIO1_R4"),
+       PINCTRL_PIN(AB9540_PIN_V3, "GPIO2_V3"),
+       PINCTRL_PIN(AB9540_PIN_T4, "GPIO3_T4"),
+       PINCTRL_PIN(AB9540_PIN_T5, "GPIO4_T5"),
+       /* hole */
+       PINCTRL_PIN(AB9540_PIN_B18, "GPIO10_B18"),
+       PINCTRL_PIN(AB9540_PIN_C18, "GPIO11_C18"),
+       /* hole */
+       PINCTRL_PIN(AB9540_PIN_D18, "GPIO13_D18"),
+       PINCTRL_PIN(AB9540_PIN_B19, "GPIO14_B19"),
+       PINCTRL_PIN(AB9540_PIN_C19, "GPIO15_C19"),
+       PINCTRL_PIN(AB9540_PIN_D19, "GPIO16_D19"),
+       PINCTRL_PIN(AB9540_PIN_R3, "GPIO17_R3"),
+       PINCTRL_PIN(AB9540_PIN_T2, "GPIO18_T2"),
+       PINCTRL_PIN(AB9540_PIN_U2, "GPIO19_U2"),
+       PINCTRL_PIN(AB9540_PIN_V2, "GPIO20_V2"),
+       PINCTRL_PIN(AB9540_PIN_N17, "GPIO21_N17"),
+       PINCTRL_PIN(AB9540_PIN_N16, "GPIO22_N16"),
+       PINCTRL_PIN(AB9540_PIN_M19, "GPIO23_M19"),
+       PINCTRL_PIN(AB9540_PIN_T3, "GPIO24_T3"),
+       PINCTRL_PIN(AB9540_PIN_W2, "GPIO25_W2"),
+       /* hole */
+       PINCTRL_PIN(AB9540_PIN_H4, "GPIO27_H4"),
+       PINCTRL_PIN(AB9540_PIN_F1, "GPIO28_F1"),
+       PINCTRL_PIN(AB9540_PIN_F4, "GPIO29_F4"),
+       PINCTRL_PIN(AB9540_PIN_F2, "GPIO30_F2"),
+       PINCTRL_PIN(AB9540_PIN_E4, "GPIO31_E4"),
+       PINCTRL_PIN(AB9540_PIN_F3, "GPIO32_F3"),
+       /* hole */
+       PINCTRL_PIN(AB9540_PIN_J13, "GPIO34_J13"),
+       /* hole */
+       PINCTRL_PIN(AB9540_PIN_L17, "GPIO40_L17"),
+       PINCTRL_PIN(AB9540_PIN_L16, "GPIO41_L16"),
+       PINCTRL_PIN(AB9540_PIN_W3, "GPIO42_W3"),
+       PINCTRL_PIN(AB9540_PIN_N4, "GPIO50_N4"),
+       PINCTRL_PIN(AB9540_PIN_G12, "GPIO51_G12"),
+       PINCTRL_PIN(AB9540_PIN_E17, "GPIO52_E17"),
+       PINCTRL_PIN(AB9540_PIN_D11, "GPIO53_D11"),
+       PINCTRL_PIN(AB9540_PIN_M18, "GPIO60_M18"),
+};
+
+/*
+ * Maps local GPIO offsets to local pin numbers
+ */
+static const struct abx500_pinrange ab9540_pinranges[] = {
+       ABX500_PINRANGE(1, 4, ABX500_ALT_A),
+       ABX500_PINRANGE(10, 2, ABX500_DEFAULT),
+       ABX500_PINRANGE(13, 1, ABX500_DEFAULT),
+       ABX500_PINRANGE(14, 12, ABX500_ALT_A),
+       ABX500_PINRANGE(27, 6, ABX500_ALT_A),
+       ABX500_PINRANGE(34, 1, ABX500_ALT_A),
+       ABX500_PINRANGE(40, 3, ABX500_ALT_A),
+       ABX500_PINRANGE(50, 1, ABX500_DEFAULT),
+       ABX500_PINRANGE(51, 3, ABX500_ALT_A),
+       ABX500_PINRANGE(54, 1, ABX500_DEFAULT),
+};
+
+/*
+ * Read the pin group names like this:
+ * sysclkreq2_d_1 = first groups of pins for sysclkreq2 on default function
+ *
+ * The groups are arranged as sets per altfunction column, so we can
+ * mux in one group at a time by selecting the same altfunction for them
+ * all. When functions require pins on different altfunctions, you need
+ * to combine several groups.
+ */
+
+/* default column */
+static const unsigned sysclkreq2_d_1_pins[] = { AB9540_PIN_R4 };
+static const unsigned sysclkreq3_d_1_pins[] = { AB9540_PIN_V3 };
+static const unsigned sysclkreq4_d_1_pins[] = { AB9540_PIN_T4 };
+static const unsigned sysclkreq6_d_1_pins[] = { AB9540_PIN_T5 };
+static const unsigned gpio10_d_1_pins[] = { AB9540_PIN_B18 };
+static const unsigned gpio11_d_1_pins[] = { AB9540_PIN_C18 };
+static const unsigned gpio13_d_1_pins[] = { AB9540_PIN_D18 };
+static const unsigned pwmout1_d_1_pins[] = { AB9540_PIN_B19 };
+static const unsigned pwmout2_d_1_pins[] = { AB9540_PIN_C19 };
+static const unsigned pwmout3_d_1_pins[] = { AB9540_PIN_D19 };
+/* audio data interface 1*/
+static const unsigned adi1_d_1_pins[] = { AB9540_PIN_R3, AB9540_PIN_T2,
+                                       AB9540_PIN_U2, AB9540_PIN_V2 };
+/* USBUICC */
+static const unsigned usbuicc_d_1_pins[] = { AB9540_PIN_N17, AB9540_PIN_N16,
+                                       AB9540_PIN_M19 };
+static const unsigned sysclkreq7_d_1_pins[] = { AB9540_PIN_T3 };
+static const unsigned sysclkreq8_d_1_pins[] = { AB9540_PIN_W2 };
+/* Digital microphone 1 and 2 */
+static const unsigned dmic12_d_1_pins[] = { AB9540_PIN_H4, AB9540_PIN_F1 };
+/* Digital microphone 3 and 4 */
+static const unsigned dmic34_d_1_pins[] = { AB9540_PIN_F4, AB9540_PIN_F2 };
+/* Digital microphone 5 and 6 */
+static const unsigned dmic56_d_1_pins[] = { AB9540_PIN_E4, AB9540_PIN_F3 };
+static const unsigned extcpena_d_1_pins[] = { AB9540_PIN_J13 };
+/* modem SDA/SCL */
+static const unsigned modsclsda_d_1_pins[] = { AB9540_PIN_L17, AB9540_PIN_L16 };
+static const unsigned sysclkreq5_d_1_pins[] = { AB9540_PIN_W3 };
+static const unsigned gpio50_d_1_pins[] = { AB9540_PIN_N4 };
+static const unsigned batremn_d_1_pins[] = { AB9540_PIN_G12 };
+static const unsigned resethw_d_1_pins[] = { AB9540_PIN_E17 };
+static const unsigned service_d_1_pins[] = { AB9540_PIN_D11 };
+static const unsigned gpio60_d_1_pins[] = { AB9540_PIN_M18 };
+
+/* Altfunction A column */
+static const unsigned gpio1_a_1_pins[] = { AB9540_PIN_R4 };
+static const unsigned gpio2_a_1_pins[] = { AB9540_PIN_V3 };
+static const unsigned gpio3_a_1_pins[] = { AB9540_PIN_T4 };
+static const unsigned gpio4_a_1_pins[] = { AB9540_PIN_T5 };
+static const unsigned hiqclkena_a_1_pins[] = { AB9540_PIN_B18 };
+static const unsigned pdmclk_a_1_pins[] = { AB9540_PIN_C18 };
+static const unsigned uartdata_a_1_pins[] = { AB9540_PIN_D18, AB9540_PIN_N4 };
+static const unsigned gpio14_a_1_pins[] = { AB9540_PIN_B19 };
+static const unsigned gpio15_a_1_pins[] = { AB9540_PIN_C19 };
+static const unsigned gpio16_a_1_pins[] = { AB9540_PIN_D19 };
+static const unsigned gpio17_a_1_pins[] = { AB9540_PIN_R3 };
+static const unsigned gpio18_a_1_pins[] = { AB9540_PIN_T2 };
+static const unsigned gpio19_a_1_pins[] = { AB9540_PIN_U2 };
+static const unsigned gpio20_a_1_pins[] = { AB9540_PIN_V2 };
+static const unsigned gpio21_a_1_pins[] = { AB9540_PIN_N17 };
+static const unsigned gpio22_a_1_pins[] = { AB9540_PIN_N16 };
+static const unsigned gpio23_a_1_pins[] = { AB9540_PIN_M19 };
+static const unsigned gpio24_a_1_pins[] = { AB9540_PIN_T3 };
+static const unsigned gpio25_a_1_pins[] = { AB9540_PIN_W2 };
+static const unsigned gpio27_a_1_pins[] = { AB9540_PIN_H4 };
+static const unsigned gpio28_a_1_pins[] = { AB9540_PIN_F1 };
+static const unsigned gpio29_a_1_pins[] = { AB9540_PIN_F4 };
+static const unsigned gpio30_a_1_pins[] = { AB9540_PIN_F2 };
+static const unsigned gpio31_a_1_pins[] = { AB9540_PIN_E4 };
+static const unsigned gpio32_a_1_pins[] = { AB9540_PIN_F3 };
+static const unsigned gpio34_a_1_pins[] = { AB9540_PIN_J13 };
+static const unsigned gpio40_a_1_pins[] = { AB9540_PIN_L17 };
+static const unsigned gpio41_a_1_pins[] = { AB9540_PIN_L16 };
+static const unsigned gpio42_a_1_pins[] = { AB9540_PIN_W3 };
+static const unsigned gpio51_a_1_pins[] = { AB9540_PIN_G12 };
+static const unsigned gpio52_a_1_pins[] = { AB9540_PIN_E17 };
+static const unsigned gpio53_a_1_pins[] = { AB9540_PIN_D11 };
+static const unsigned usbuiccpd_a_1_pins[] = { AB9540_PIN_M18 };
+
+/* Altfunction B colum */
+static const unsigned pdmdata_b_1_pins[] = { AB9540_PIN_B18 };
+static const unsigned pwmextvibra1_b_1_pins[] = { AB9540_PIN_D18 };
+static const unsigned pwmextvibra2_b_1_pins[] = { AB9540_PIN_N4 };
+
+/* Altfunction C column */
+static const unsigned usbvdat_c_1_pins[] = { AB9540_PIN_D18 };
+
+#define AB9540_PIN_GROUP(a, b) { .name = #a, .pins = a##_pins,         \
+                       .npins = ARRAY_SIZE(a##_pins), .altsetting = b }
+
+static const struct abx500_pingroup ab9540_groups[] = {
+       /* default column */
+       AB9540_PIN_GROUP(sysclkreq2_d_1, ABX500_DEFAULT),
+       AB9540_PIN_GROUP(sysclkreq3_d_1, ABX500_DEFAULT),
+       AB9540_PIN_GROUP(sysclkreq4_d_1, ABX500_DEFAULT),
+       AB9540_PIN_GROUP(sysclkreq6_d_1, ABX500_DEFAULT),
+       AB9540_PIN_GROUP(gpio10_d_1, ABX500_DEFAULT),
+       AB9540_PIN_GROUP(gpio11_d_1, ABX500_DEFAULT),
+       AB9540_PIN_GROUP(gpio13_d_1, ABX500_DEFAULT),
+       AB9540_PIN_GROUP(pwmout1_d_1, ABX500_DEFAULT),
+       AB9540_PIN_GROUP(pwmout2_d_1, ABX500_DEFAULT),
+       AB9540_PIN_GROUP(pwmout3_d_1, ABX500_DEFAULT),
+       AB9540_PIN_GROUP(adi1_d_1, ABX500_DEFAULT),
+       AB9540_PIN_GROUP(usbuicc_d_1, ABX500_DEFAULT),
+       AB9540_PIN_GROUP(sysclkreq7_d_1, ABX500_DEFAULT),
+       AB9540_PIN_GROUP(sysclkreq8_d_1, ABX500_DEFAULT),
+       AB9540_PIN_GROUP(dmic12_d_1, ABX500_DEFAULT),
+       AB9540_PIN_GROUP(dmic34_d_1, ABX500_DEFAULT),
+       AB9540_PIN_GROUP(dmic56_d_1, ABX500_DEFAULT),
+       AB9540_PIN_GROUP(extcpena_d_1, ABX500_DEFAULT),
+       AB9540_PIN_GROUP(modsclsda_d_1, ABX500_DEFAULT),
+       AB9540_PIN_GROUP(sysclkreq5_d_1, ABX500_DEFAULT),
+       AB9540_PIN_GROUP(gpio50_d_1, ABX500_DEFAULT),
+       AB9540_PIN_GROUP(batremn_d_1, ABX500_DEFAULT),
+       AB9540_PIN_GROUP(resethw_d_1, ABX500_DEFAULT),
+       AB9540_PIN_GROUP(service_d_1, ABX500_DEFAULT),
+       AB9540_PIN_GROUP(gpio60_d_1, ABX500_DEFAULT),
+
+       /* Altfunction A column */
+       AB9540_PIN_GROUP(gpio1_a_1, ABX500_ALT_A),
+       AB9540_PIN_GROUP(gpio2_a_1, ABX500_ALT_A),
+       AB9540_PIN_GROUP(gpio3_a_1, ABX500_ALT_A),
+       AB9540_PIN_GROUP(gpio4_a_1, ABX500_ALT_A),
+       AB9540_PIN_GROUP(hiqclkena_a_1, ABX500_ALT_A),
+       AB9540_PIN_GROUP(pdmclk_a_1, ABX500_ALT_A),
+       AB9540_PIN_GROUP(uartdata_a_1, ABX500_ALT_A),
+       AB9540_PIN_GROUP(gpio14_a_1, ABX500_ALT_A),
+       AB9540_PIN_GROUP(gpio15_a_1, ABX500_ALT_A),
+       AB9540_PIN_GROUP(gpio16_a_1, ABX500_ALT_A),
+       AB9540_PIN_GROUP(gpio17_a_1, ABX500_ALT_A),
+       AB9540_PIN_GROUP(gpio18_a_1, ABX500_ALT_A),
+       AB9540_PIN_GROUP(gpio19_a_1, ABX500_ALT_A),
+       AB9540_PIN_GROUP(gpio20_a_1, ABX500_ALT_A),
+       AB9540_PIN_GROUP(gpio21_a_1, ABX500_ALT_A),
+       AB9540_PIN_GROUP(gpio22_a_1, ABX500_ALT_A),
+       AB9540_PIN_GROUP(gpio23_a_1, ABX500_ALT_A),
+       AB9540_PIN_GROUP(gpio24_a_1, ABX500_ALT_A),
+       AB9540_PIN_GROUP(gpio25_a_1, ABX500_ALT_A),
+       AB9540_PIN_GROUP(gpio27_a_1, ABX500_ALT_A),
+       AB9540_PIN_GROUP(gpio28_a_1, ABX500_ALT_A),
+       AB9540_PIN_GROUP(gpio29_a_1, ABX500_ALT_A),
+       AB9540_PIN_GROUP(gpio30_a_1, ABX500_ALT_A),
+       AB9540_PIN_GROUP(gpio31_a_1, ABX500_ALT_A),
+       AB9540_PIN_GROUP(gpio32_a_1, ABX500_ALT_A),
+       AB9540_PIN_GROUP(gpio34_a_1, ABX500_ALT_A),
+       AB9540_PIN_GROUP(gpio40_a_1, ABX500_ALT_A),
+       AB9540_PIN_GROUP(gpio41_a_1, ABX500_ALT_A),
+       AB9540_PIN_GROUP(gpio42_a_1, ABX500_ALT_A),
+       AB9540_PIN_GROUP(gpio51_a_1, ABX500_ALT_A),
+       AB9540_PIN_GROUP(gpio52_a_1, ABX500_ALT_A),
+       AB9540_PIN_GROUP(gpio53_a_1, ABX500_ALT_A),
+       AB9540_PIN_GROUP(usbuiccpd_a_1, ABX500_ALT_A),
+
+       /* Altfunction B column */
+       AB9540_PIN_GROUP(pdmdata_b_1, ABX500_ALT_B),
+       AB9540_PIN_GROUP(pwmextvibra1_b_1, ABX500_ALT_B),
+       AB9540_PIN_GROUP(pwmextvibra2_b_1, ABX500_ALT_B),
+
+       /* Altfunction C column */
+       AB9540_PIN_GROUP(usbvdat_c_1, ABX500_ALT_C),
+};
+
+/* We use this macro to define the groups applicable to a function */
+#define AB9540_FUNC_GROUPS(a, b...)       \
+static const char * const a##_groups[] = { b };
+
+AB9540_FUNC_GROUPS(sysclkreq, "sysclkreq2_d_1", "sysclkreq3_d_1",
+               "sysclkreq4_d_1", "sysclkreq5_d_1", "sysclkreq6_d_1",
+               "sysclkreq7_d_1", "sysclkreq8_d_1");
+AB9540_FUNC_GROUPS(gpio, "gpio1_a_1", "gpio2_a_1", "gpio3_a_1", "gpio4_a_1",
+               "gpio10_d_1", "gpio11_d_1", "gpio13_d_1", "gpio14_a_1",
+               "gpio15_a_1", "gpio16_a_1", "gpio17_a_1", "gpio18_a_1",
+               "gpio19_a_1", "gpio20_a_1", "gpio21_a_1", "gpio22_a_1",
+               "gpio23_a_1", "gpio24_a_1", "gpio25_a_1", "gpio27_a_1",
+               "gpio28_a_1", "gpio29_a_1", "gpio30_a_1", "gpio31_a_1",
+               "gpio32_a_1", "gpio34_a_1", "gpio40_a_1", "gpio41_a_1",
+               "gpio42_a_1", "gpio50_d_1", "gpio51_a_1", "gpio52_a_1",
+               "gpio53_a_1", "gpio60_d_1");
+AB9540_FUNC_GROUPS(pwmout, "pwmout1_d_1", "pwmout2_d_1", "pwmout3_d_1");
+AB9540_FUNC_GROUPS(adi1, "adi1_d_1");
+AB9540_FUNC_GROUPS(usbuicc, "usbuicc_d_1", "usbuiccpd_a_1");
+AB9540_FUNC_GROUPS(dmic, "dmic12_d_1", "dmic34_d_1", "dmic56_d_1");
+AB9540_FUNC_GROUPS(extcpena, "extcpena_d_1");
+AB9540_FUNC_GROUPS(modsclsda, "modsclsda_d_1");
+AB9540_FUNC_GROUPS(batremn, "batremn_d_1");
+AB9540_FUNC_GROUPS(resethw, "resethw_d_1");
+AB9540_FUNC_GROUPS(service, "service_d_1");
+AB9540_FUNC_GROUPS(hiqclkena, "hiqclkena_a_1");
+AB9540_FUNC_GROUPS(pdm, "pdmdata_b_1", "pdmclk_a_1");
+AB9540_FUNC_GROUPS(uartdata, "uartdata_a_1");
+AB9540_FUNC_GROUPS(pwmextvibra, "pwmextvibra1_b_1", "pwmextvibra2_b_1");
+AB9540_FUNC_GROUPS(usbvdat, "usbvdat_c_1");
+
+#define FUNCTION(fname)                                        \
+       {                                               \
+               .name = #fname,                         \
+               .groups = fname##_groups,               \
+               .ngroups = ARRAY_SIZE(fname##_groups),  \
+       }
+
+static const struct abx500_function ab9540_functions[] = {
+       FUNCTION(sysclkreq),
+       FUNCTION(gpio),
+       FUNCTION(pwmout),
+       FUNCTION(adi1),
+       FUNCTION(usbuicc),
+       FUNCTION(dmic),
+       FUNCTION(extcpena),
+       FUNCTION(modsclsda),
+       FUNCTION(batremn),
+       FUNCTION(resethw),
+       FUNCTION(service),
+       FUNCTION(hiqclkena),
+       FUNCTION(pdm),
+       FUNCTION(uartdata),
+       FUNCTION(pwmextvibra),
+       FUNCTION(usbvdat),
+};
+
+/*
+ * this table translates what's is in the AB9540 specification regarding the
+ * balls alternate functions (as for DB, default, ALT_A, ALT_B and ALT_C).
+ * ALTERNATE_FUNCTIONS(GPIO_NUMBER, GPIOSEL bit, ALTERNATFUNC bit1,
+ * ALTERNATEFUNC bit2, ALTA val, ALTB val, ALTC val),
+ *
+ * example :
+ *
+ *     ALTERNATE_FUNCTIONS(13,     4,      3,      4, 1, 0, 2),
+ *     means that pin AB9540_PIN_D18 (pin 13) supports 4 mux (default/ALT_A,
+ *     ALT_B and ALT_C), so GPIOSEL and ALTERNATFUNC registers are used to
+ *     select the mux. ALTA, ALTB and ALTC val indicates values to write in
+ *     ALTERNATFUNC register. We need to specifies these values as SOC
+ *     designers didn't apply the same logic on how to select mux in the
+ *     ABx500 family.
+ *
+ *     As this pins supports at least ALT_B mux, default mux is
+ *     selected by writing 1 in GPIOSEL bit :
+ *
+ *             | GPIOSEL bit=4 | alternatfunc bit2=4 | alternatfunc bit1=3
+ *     default |       1       |          0          |          0
+ *     alt_A   |       0       |          0          |          1
+ *     alt_B   |       0       |          0          |          0
+ *     alt_C   |       0       |          1          |          0
+ *
+ *     ALTERNATE_FUNCTIONS(1,      0, UNUSED, UNUSED),
+ *     means that pin AB9540_PIN_R4 (pin 1) supports 2 mux, so only GPIOSEL
+ *     register is used to select the mux. As this pins doesn't support at
+ *     least ALT_B mux, default mux is by writing 0 in GPIOSEL bit :
+ *
+ *             | GPIOSEL bit=0 | alternatfunc bit2=  | alternatfunc bit1=
+ *     default |       0       |          0          |          0
+ *     alt_A   |       1       |          0          |          0
+ */
+
+static struct
+alternate_functions ab9540alternate_functions[AB9540_GPIO_MAX_NUMBER + 1] = {
+       /* GPIOSEL1 - bits 4-7 are reserved */
+       ALTERNATE_FUNCTIONS(0, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO0 */
+       ALTERNATE_FUNCTIONS(1,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO1, altA controlled by bit 0 */
+       ALTERNATE_FUNCTIONS(2,      1, UNUSED, UNUSED, 0, 0, 0), /* GPIO2, altA controlled by bit 1 */
+       ALTERNATE_FUNCTIONS(3,      2, UNUSED, UNUSED, 0, 0, 0), /* GPIO3, altA controlled by bit 2*/
+       ALTERNATE_FUNCTIONS(4,      3, UNUSED, UNUSED, 0, 0, 0), /* GPIO4, altA controlled by bit 3*/
+       ALTERNATE_FUNCTIONS(5, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO5 */
+       ALTERNATE_FUNCTIONS(6, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO6 */
+       ALTERNATE_FUNCTIONS(7, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO7 */
+       ALTERNATE_FUNCTIONS(8, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO8 */
+       /* GPIOSEL2 - bits 0 and 3 are reserved */
+       ALTERNATE_FUNCTIONS(9, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO9 */
+       ALTERNATE_FUNCTIONS(10,      1,      0, UNUSED, 1, 0, 0), /* GPIO10, altA and altB controlled by bit 0 */
+       ALTERNATE_FUNCTIONS(11,      2,      1, UNUSED, 0, 0, 0), /* GPIO11, altA controlled by bit 1 */
+       ALTERNATE_FUNCTIONS(12, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO12 */
+       ALTERNATE_FUNCTIONS(13,      4,      3,      4, 1, 0, 2), /* GPIO13, altA altB and altC controlled by bit 3 and 4 */
+       ALTERNATE_FUNCTIONS(14,      5, UNUSED, UNUSED, 0, 0, 0), /* GPIO14, altA controlled by bit 5 */
+       ALTERNATE_FUNCTIONS(15,      6, UNUSED, UNUSED, 0, 0, 0), /* GPIO15, altA controlled by bit 6 */
+       ALTERNATE_FUNCTIONS(16,      7, UNUSED, UNUSED, 0, 0, 0), /* GPIO16, altA controlled by bit 7 */
+       /* GPIOSEL3 - bit 1-3 reserved
+        * pins 17 to 20 are special case, only bit 0 is used to select
+        * alternate function for these 4 pins.
+        * bits 1 to 3 are reserved
+        */
+       ALTERNATE_FUNCTIONS(17,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO17, altA controlled by bit 0 */
+       ALTERNATE_FUNCTIONS(18,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO18, altA controlled by bit 0 */
+       ALTERNATE_FUNCTIONS(19,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO19, altA controlled by bit 0 */
+       ALTERNATE_FUNCTIONS(20,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO20, altA controlled by bit 0 */
+       ALTERNATE_FUNCTIONS(21,      4, UNUSED, UNUSED, 0, 0, 0), /* GPIO21, altA controlled by bit 4 */
+       ALTERNATE_FUNCTIONS(22,      5, UNUSED, UNUSED, 0, 0, 0), /* GPIO22, altA controlled by bit 5 */
+       ALTERNATE_FUNCTIONS(23,      6, UNUSED, UNUSED, 0, 0, 0), /* GPIO23, altA controlled by bit 6 */
+       ALTERNATE_FUNCTIONS(24,      7, UNUSED, UNUSED, 0, 0, 0), /* GPIO24, altA controlled by bit 7 */
+       /* GPIOSEL4 - bit 1 reserved */
+       ALTERNATE_FUNCTIONS(25,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO25, altA controlled by bit 0 */
+       ALTERNATE_FUNCTIONS(26, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO26 */
+       ALTERNATE_FUNCTIONS(27,      2, UNUSED, UNUSED, 0, 0, 0), /* GPIO27, altA controlled by bit 2 */
+       ALTERNATE_FUNCTIONS(28,      3, UNUSED, UNUSED, 0, 0, 0), /* GPIO28, altA controlled by bit 3 */
+       ALTERNATE_FUNCTIONS(29,      4, UNUSED, UNUSED, 0, 0, 0), /* GPIO29, altA controlled by bit 4 */
+       ALTERNATE_FUNCTIONS(30,      5, UNUSED, UNUSED, 0, 0, 0), /* GPIO30, altA controlled by bit 5 */
+       ALTERNATE_FUNCTIONS(31,      6, UNUSED, UNUSED, 0, 0, 0), /* GPIO31, altA controlled by bit 6 */
+       ALTERNATE_FUNCTIONS(32,      7, UNUSED, UNUSED, 0, 0, 0), /* GPIO32, altA controlled by bit 7 */
+       /* GPIOSEL5 - bit 0, 2-6 are reserved */
+       ALTERNATE_FUNCTIONS(33, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO33 */
+       ALTERNATE_FUNCTIONS(34,      1, UNUSED, UNUSED, 0, 0, 0), /* GPIO34, altA controlled by bit 1 */
+       ALTERNATE_FUNCTIONS(35, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO35 */
+       ALTERNATE_FUNCTIONS(36, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO36 */
+       ALTERNATE_FUNCTIONS(37, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO37 */
+       ALTERNATE_FUNCTIONS(38, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO38 */
+       ALTERNATE_FUNCTIONS(39, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO39 */
+       ALTERNATE_FUNCTIONS(40,      7, UNUSED, UNUSED, 0, 0, 0), /* GPIO40, altA controlled by bit 7 */
+       /* GPIOSEL6 - bit 2-7 are reserved */
+       ALTERNATE_FUNCTIONS(41,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO41, altA controlled by bit 0 */
+       ALTERNATE_FUNCTIONS(42,      1, UNUSED, UNUSED, 0, 0, 0), /* GPIO42, altA controlled by bit 1 */
+       ALTERNATE_FUNCTIONS(43, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO43 */
+       ALTERNATE_FUNCTIONS(44, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO44 */
+       ALTERNATE_FUNCTIONS(45, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO45 */
+       ALTERNATE_FUNCTIONS(46, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO46 */
+       ALTERNATE_FUNCTIONS(47, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO47 */
+       ALTERNATE_FUNCTIONS(48, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO48 */
+       /*
+        * GPIOSEL7 - bit 0 and 6-7 are reserved
+        * special case with GPIO60, wich is located at offset 5 of gpiosel7
+        * don't know why it has been called GPIO60 in AB9540 datasheet,
+        * GPIO54 would be logical..., so at SOC point of view we consider
+        * GPIO60 = GPIO54
+        */
+       ALTERNATE_FUNCTIONS(49,      0, UNUSED, UNUSED, 0, 0, 0), /* no GPIO49 */
+       ALTERNATE_FUNCTIONS(50,      1,      2, UNUSED, 1, 0, 0), /* GPIO50, altA and altB controlled by bit 1 */
+       ALTERNATE_FUNCTIONS(51,      2, UNUSED, UNUSED, 0, 0, 0), /* GPIO51, altA controlled by bit 2 */
+       ALTERNATE_FUNCTIONS(52,      3, UNUSED, UNUSED, 0, 0, 0), /* GPIO52, altA controlled by bit 3 */
+       ALTERNATE_FUNCTIONS(53,      4, UNUSED, UNUSED, 0, 0, 0), /* GPIO53, altA controlled by bit 4 */
+       ALTERNATE_FUNCTIONS(54,      5, UNUSED, UNUSED, 0, 0, 0), /* GPIO54 = GPIO60, altA controlled by bit 5 */
+};
+
+static struct abx500_gpio_irq_cluster ab9540_gpio_irq_cluster[] = {
+       GPIO_IRQ_CLUSTER(10, 13, AB8500_INT_GPIO10R),
+       GPIO_IRQ_CLUSTER(24, 25, AB8500_INT_GPIO24R),
+       GPIO_IRQ_CLUSTER(40, 41, AB8500_INT_GPIO40R),
+       GPIO_IRQ_CLUSTER(50, 54, AB9540_INT_GPIO50R),
+};
+
+static struct abx500_pinctrl_soc_data ab9540_soc = {
+       .gpio_ranges = ab9540_pinranges,
+       .gpio_num_ranges = ARRAY_SIZE(ab9540_pinranges),
+       .pins = ab9540_pins,
+       .npins = ARRAY_SIZE(ab9540_pins),
+       .functions = ab9540_functions,
+       .nfunctions = ARRAY_SIZE(ab9540_functions),
+       .groups = ab9540_groups,
+       .ngroups = ARRAY_SIZE(ab9540_groups),
+       .alternate_functions = ab9540alternate_functions,
+       .gpio_irq_cluster = ab9540_gpio_irq_cluster,
+       .ngpio_irq_cluster = ARRAY_SIZE(ab9540_gpio_irq_cluster),
+       .irq_gpio_rising_offset = AB8500_INT_GPIO6R,
+       .irq_gpio_falling_offset = AB8500_INT_GPIO6F,
+       .irq_gpio_factor = 1,
+};
+
+void
+abx500_pinctrl_ab9540_init(struct abx500_pinctrl_soc_data **soc)
+{
+       *soc = &ab9540_soc;
+}
diff --git a/drivers/pinctrl/nomadik/pinctrl-abx500.c b/drivers/pinctrl/nomadik/pinctrl-abx500.c
new file mode 100644 (file)
index 0000000..a53a689
--- /dev/null
@@ -0,0 +1,1346 @@
+/*
+ * Copyright (C) ST-Ericsson SA 2013
+ *
+ * Author: Patrice Chotard <patrice.chotard@st.com>
+ * License terms: GNU General Public License (GPL) version 2
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <linux/slab.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/err.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+#include <linux/gpio.h>
+#include <linux/irq.h>
+#include <linux/irqdomain.h>
+#include <linux/interrupt.h>
+#include <linux/bitops.h>
+#include <linux/mfd/abx500.h>
+#include <linux/mfd/abx500/ab8500.h>
+#include <linux/pinctrl/pinctrl.h>
+#include <linux/pinctrl/consumer.h>
+#include <linux/pinctrl/pinmux.h>
+#include <linux/pinctrl/pinconf.h>
+#include <linux/pinctrl/pinconf-generic.h>
+#include <linux/pinctrl/machine.h>
+
+#include "pinctrl-abx500.h"
+#include "../core.h"
+#include "../pinconf.h"
+
+/*
+ * The AB9540 and AB8540 GPIO support are extended versions
+ * of the AB8500 GPIO support.
+ * The AB9540 supports an additional (7th) register so that
+ * more GPIO may be configured and used.
+ * The AB8540 supports 4 new gpios (GPIOx_VBAT) that have
+ * internal pull-up and pull-down capabilities.
+ */
+
+/*
+ * GPIO registers offset
+ * Bank: 0x10
+ */
+#define AB8500_GPIO_SEL1_REG   0x00
+#define AB8500_GPIO_SEL2_REG   0x01
+#define AB8500_GPIO_SEL3_REG   0x02
+#define AB8500_GPIO_SEL4_REG   0x03
+#define AB8500_GPIO_SEL5_REG   0x04
+#define AB8500_GPIO_SEL6_REG   0x05
+#define AB9540_GPIO_SEL7_REG   0x06
+
+#define AB8500_GPIO_DIR1_REG   0x10
+#define AB8500_GPIO_DIR2_REG   0x11
+#define AB8500_GPIO_DIR3_REG   0x12
+#define AB8500_GPIO_DIR4_REG   0x13
+#define AB8500_GPIO_DIR5_REG   0x14
+#define AB8500_GPIO_DIR6_REG   0x15
+#define AB9540_GPIO_DIR7_REG   0x16
+
+#define AB8500_GPIO_OUT1_REG   0x20
+#define AB8500_GPIO_OUT2_REG   0x21
+#define AB8500_GPIO_OUT3_REG   0x22
+#define AB8500_GPIO_OUT4_REG   0x23
+#define AB8500_GPIO_OUT5_REG   0x24
+#define AB8500_GPIO_OUT6_REG   0x25
+#define AB9540_GPIO_OUT7_REG   0x26
+
+#define AB8500_GPIO_PUD1_REG   0x30
+#define AB8500_GPIO_PUD2_REG   0x31
+#define AB8500_GPIO_PUD3_REG   0x32
+#define AB8500_GPIO_PUD4_REG   0x33
+#define AB8500_GPIO_PUD5_REG   0x34
+#define AB8500_GPIO_PUD6_REG   0x35
+#define AB9540_GPIO_PUD7_REG   0x36
+
+#define AB8500_GPIO_IN1_REG    0x40
+#define AB8500_GPIO_IN2_REG    0x41
+#define AB8500_GPIO_IN3_REG    0x42
+#define AB8500_GPIO_IN4_REG    0x43
+#define AB8500_GPIO_IN5_REG    0x44
+#define AB8500_GPIO_IN6_REG    0x45
+#define AB9540_GPIO_IN7_REG    0x46
+#define AB8540_GPIO_VINSEL_REG 0x47
+#define AB8540_GPIO_PULL_UPDOWN_REG    0x48
+#define AB8500_GPIO_ALTFUN_REG 0x50
+#define AB8540_GPIO_PULL_UPDOWN_MASK   0x03
+#define AB8540_GPIO_VINSEL_MASK        0x03
+#define AB8540_GPIOX_VBAT_START        51
+#define AB8540_GPIOX_VBAT_END  54
+
+#define ABX500_GPIO_INPUT      0
+#define ABX500_GPIO_OUTPUT     1
+
+struct abx500_pinctrl {
+       struct device *dev;
+       struct pinctrl_dev *pctldev;
+       struct abx500_pinctrl_soc_data *soc;
+       struct gpio_chip chip;
+       struct ab8500 *parent;
+       struct abx500_gpio_irq_cluster *irq_cluster;
+       int irq_cluster_size;
+};
+
+/**
+ * to_abx500_pinctrl() - get the pointer to abx500_pinctrl
+ * @chip:      Member of the structure abx500_pinctrl
+ */
+static inline struct abx500_pinctrl *to_abx500_pinctrl(struct gpio_chip *chip)
+{
+       return container_of(chip, struct abx500_pinctrl, chip);
+}
+
+static int abx500_gpio_get_bit(struct gpio_chip *chip, u8 reg,
+                              unsigned offset, bool *bit)
+{
+       struct abx500_pinctrl *pct = to_abx500_pinctrl(chip);
+       u8 pos = offset % 8;
+       u8 val;
+       int ret;
+
+       reg += offset / 8;
+       ret = abx500_get_register_interruptible(pct->dev,
+                                               AB8500_MISC, reg, &val);
+
+       *bit = !!(val & BIT(pos));
+
+       if (ret < 0)
+               dev_err(pct->dev,
+                       "%s read reg =%x, offset=%x failed (%d)\n",
+                       __func__, reg, offset, ret);
+
+       return ret;
+}
+
+static int abx500_gpio_set_bits(struct gpio_chip *chip, u8 reg,
+                               unsigned offset, int val)
+{
+       struct abx500_pinctrl *pct = to_abx500_pinctrl(chip);
+       u8 pos = offset % 8;
+       int ret;
+
+       reg += offset / 8;
+       ret = abx500_mask_and_set_register_interruptible(pct->dev,
+                               AB8500_MISC, reg, BIT(pos), val << pos);
+       if (ret < 0)
+               dev_err(pct->dev, "%s write reg, %x offset %x failed (%d)\n",
+                               __func__, reg, offset, ret);
+
+       return ret;
+}
+
+/**
+ * abx500_gpio_get() - Get the particular GPIO value
+ * @chip:      Gpio device
+ * @offset:    GPIO number to read
+ */
+static int abx500_gpio_get(struct gpio_chip *chip, unsigned offset)
+{
+       struct abx500_pinctrl *pct = to_abx500_pinctrl(chip);
+       bool bit;
+       bool is_out;
+       u8 gpio_offset = offset - 1;
+       int ret;
+
+       ret = abx500_gpio_get_bit(chip, AB8500_GPIO_DIR1_REG,
+                       gpio_offset, &is_out);
+       if (ret < 0)
+               goto out;
+
+       if (is_out)
+               ret = abx500_gpio_get_bit(chip, AB8500_GPIO_OUT1_REG,
+                               gpio_offset, &bit);
+       else
+               ret = abx500_gpio_get_bit(chip, AB8500_GPIO_IN1_REG,
+                               gpio_offset, &bit);
+out:
+       if (ret < 0) {
+               dev_err(pct->dev, "%s failed (%d)\n", __func__, ret);
+               return ret;
+       }
+
+       return bit;
+}
+
+static void abx500_gpio_set(struct gpio_chip *chip, unsigned offset, int val)
+{
+       struct abx500_pinctrl *pct = to_abx500_pinctrl(chip);
+       int ret;
+
+       ret = abx500_gpio_set_bits(chip, AB8500_GPIO_OUT1_REG, offset, val);
+       if (ret < 0)
+               dev_err(pct->dev, "%s write failed (%d)\n", __func__, ret);
+}
+
+static int abx500_get_pull_updown(struct abx500_pinctrl *pct, int offset,
+                                 enum abx500_gpio_pull_updown *pull_updown)
+{
+       u8 pos;
+       u8 val;
+       int ret;
+       struct pullud *pullud;
+
+       if (!pct->soc->pullud) {
+               dev_err(pct->dev, "%s AB chip doesn't support pull up/down feature",
+                               __func__);
+               ret = -EPERM;
+               goto out;
+       }
+
+       pullud = pct->soc->pullud;
+
+       if ((offset < pullud->first_pin)
+               || (offset > pullud->last_pin)) {
+               ret = -EINVAL;
+               goto out;
+       }
+
+       ret = abx500_get_register_interruptible(pct->dev,
+                       AB8500_MISC, AB8540_GPIO_PULL_UPDOWN_REG, &val);
+
+       pos = (offset - pullud->first_pin) << 1;
+       *pull_updown = (val >> pos) & AB8540_GPIO_PULL_UPDOWN_MASK;
+
+out:
+       if (ret < 0)
+               dev_err(pct->dev, "%s failed (%d)\n", __func__, ret);
+
+       return ret;
+}
+
+static int abx500_set_pull_updown(struct abx500_pinctrl *pct,
+                                 int offset, enum abx500_gpio_pull_updown val)
+{
+       u8 pos;
+       int ret;
+       struct pullud *pullud;
+
+       if (!pct->soc->pullud) {
+               dev_err(pct->dev, "%s AB chip doesn't support pull up/down feature",
+                               __func__);
+               ret = -EPERM;
+               goto out;
+       }
+
+       pullud = pct->soc->pullud;
+
+       if ((offset < pullud->first_pin)
+               || (offset > pullud->last_pin)) {
+               ret = -EINVAL;
+               goto out;
+       }
+       pos = (offset - pullud->first_pin) << 1;
+
+       ret = abx500_mask_and_set_register_interruptible(pct->dev,
+                       AB8500_MISC, AB8540_GPIO_PULL_UPDOWN_REG,
+                       AB8540_GPIO_PULL_UPDOWN_MASK << pos, val << pos);
+
+out:
+       if (ret < 0)
+               dev_err(pct->dev, "%s failed (%d)\n", __func__, ret);
+
+       return ret;
+}
+
+static bool abx500_pullud_supported(struct gpio_chip *chip, unsigned gpio)
+{
+       struct abx500_pinctrl *pct = to_abx500_pinctrl(chip);
+       struct pullud *pullud = pct->soc->pullud;
+
+       return (pullud &&
+               gpio >= pullud->first_pin &&
+               gpio <= pullud->last_pin);
+}
+
+static int abx500_gpio_direction_output(struct gpio_chip *chip,
+                                       unsigned offset,
+                                       int val)
+{
+       struct abx500_pinctrl *pct = to_abx500_pinctrl(chip);
+       unsigned gpio;
+       int ret;
+
+       /* set direction as output */
+       ret = abx500_gpio_set_bits(chip,
+                               AB8500_GPIO_DIR1_REG,
+                               offset,
+                               ABX500_GPIO_OUTPUT);
+       if (ret < 0)
+               goto out;
+
+       /* disable pull down */
+       ret = abx500_gpio_set_bits(chip,
+                               AB8500_GPIO_PUD1_REG,
+                               offset,
+                               ABX500_GPIO_PULL_NONE);
+       if (ret < 0)
+               goto out;
+
+       /* if supported, disable both pull down and pull up */
+       gpio = offset + 1;
+       if (abx500_pullud_supported(chip, gpio)) {
+               ret = abx500_set_pull_updown(pct,
+                               gpio,
+                               ABX500_GPIO_PULL_NONE);
+       }
+out:
+       if (ret < 0) {
+               dev_err(pct->dev, "%s failed (%d)\n", __func__, ret);
+               return ret;
+       }
+
+       /* set the output as 1 or 0 */
+       return abx500_gpio_set_bits(chip, AB8500_GPIO_OUT1_REG, offset, val);
+}
+
+static int abx500_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
+{
+       /* set the register as input */
+       return abx500_gpio_set_bits(chip,
+                               AB8500_GPIO_DIR1_REG,
+                               offset,
+                               ABX500_GPIO_INPUT);
+}
+
+static int abx500_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
+{
+       struct abx500_pinctrl *pct = to_abx500_pinctrl(chip);
+       /* The AB8500 GPIO numbers are off by one */
+       int gpio = offset + 1;
+       int hwirq;
+       int i;
+
+       for (i = 0; i < pct->irq_cluster_size; i++) {
+               struct abx500_gpio_irq_cluster *cluster =
+                       &pct->irq_cluster[i];
+
+               if (gpio >= cluster->start && gpio <= cluster->end) {
+                       /*
+                        * The ABx500 GPIO's associated IRQs are clustered together
+                        * throughout the interrupt numbers at irregular intervals.
+                        * To solve this quandry, we have placed the read-in values
+                        * into the cluster information table.
+                        */
+                       hwirq = gpio - cluster->start + cluster->to_irq;
+                       return irq_create_mapping(pct->parent->domain, hwirq);
+               }
+       }
+
+       return -EINVAL;
+}
+
+static int abx500_set_mode(struct pinctrl_dev *pctldev, struct gpio_chip *chip,
+                          unsigned gpio, int alt_setting)
+{
+       struct abx500_pinctrl *pct = pinctrl_dev_get_drvdata(pctldev);
+       struct alternate_functions af = pct->soc->alternate_functions[gpio];
+       int ret;
+       int val;
+       unsigned offset;
+
+       const char *modes[] = {
+               [ABX500_DEFAULT]        = "default",
+               [ABX500_ALT_A]          = "altA",
+               [ABX500_ALT_B]          = "altB",
+               [ABX500_ALT_C]          = "altC",
+       };
+
+       /* sanity check */
+       if (((alt_setting == ABX500_ALT_A) && (af.gpiosel_bit == UNUSED)) ||
+           ((alt_setting == ABX500_ALT_B) && (af.alt_bit1 == UNUSED)) ||
+           ((alt_setting == ABX500_ALT_C) && (af.alt_bit2 == UNUSED))) {
+               dev_dbg(pct->dev, "pin %d doesn't support %s mode\n", gpio,
+                               modes[alt_setting]);
+               return -EINVAL;
+       }
+
+       /* on ABx5xx, there is no GPIO0, so adjust the offset */
+       offset = gpio - 1;
+
+       switch (alt_setting) {
+       case ABX500_DEFAULT:
+               /*
+                * for ABx5xx family, default mode is always selected by
+                * writing 0 to GPIOSELx register, except for pins which
+                * support at least ALT_B mode, default mode is selected
+                * by writing 1 to GPIOSELx register
+                */
+               val = 0;
+               if (af.alt_bit1 != UNUSED)
+                       val++;
+
+               ret = abx500_gpio_set_bits(chip, AB8500_GPIO_SEL1_REG,
+                                          offset, val);
+               break;
+
+       case ABX500_ALT_A:
+               /*
+                * for ABx5xx family, alt_a mode is always selected by
+                * writing 1 to GPIOSELx register, except for pins which
+                * support at least ALT_B mode, alt_a mode is selected
+                * by writing 0 to GPIOSELx register and 0 in ALTFUNC
+                * register
+                */
+               if (af.alt_bit1 != UNUSED) {
+                       ret = abx500_gpio_set_bits(chip, AB8500_GPIO_SEL1_REG,
+                                       offset, 0);
+                       if (ret < 0)
+                               goto out;
+
+                       ret = abx500_gpio_set_bits(chip,
+                                       AB8500_GPIO_ALTFUN_REG,
+                                       af.alt_bit1,
+                                       !!(af.alta_val & BIT(0)));
+                       if (ret < 0)
+                               goto out;
+
+                       if (af.alt_bit2 != UNUSED)
+                               ret = abx500_gpio_set_bits(chip,
+                                       AB8500_GPIO_ALTFUN_REG,
+                                       af.alt_bit2,
+                                       !!(af.alta_val & BIT(1)));
+               } else
+                       ret = abx500_gpio_set_bits(chip, AB8500_GPIO_SEL1_REG,
+                                       offset, 1);
+               break;
+
+       case ABX500_ALT_B:
+               ret = abx500_gpio_set_bits(chip, AB8500_GPIO_SEL1_REG,
+                               offset, 0);
+               if (ret < 0)
+                       goto out;
+
+               ret = abx500_gpio_set_bits(chip, AB8500_GPIO_ALTFUN_REG,
+                               af.alt_bit1, !!(af.altb_val & BIT(0)));
+               if (ret < 0)
+                       goto out;
+
+               if (af.alt_bit2 != UNUSED)
+                       ret = abx500_gpio_set_bits(chip,
+                                       AB8500_GPIO_ALTFUN_REG,
+                                       af.alt_bit2,
+                                       !!(af.altb_val & BIT(1)));
+               break;
+
+       case ABX500_ALT_C:
+               ret = abx500_gpio_set_bits(chip, AB8500_GPIO_SEL1_REG,
+                               offset, 0);
+               if (ret < 0)
+                       goto out;
+
+               ret = abx500_gpio_set_bits(chip, AB8500_GPIO_ALTFUN_REG,
+                               af.alt_bit2, !!(af.altc_val & BIT(0)));
+               if (ret < 0)
+                       goto out;
+
+               ret = abx500_gpio_set_bits(chip, AB8500_GPIO_ALTFUN_REG,
+                               af.alt_bit2, !!(af.altc_val & BIT(1)));
+               break;
+
+       default:
+               dev_dbg(pct->dev, "unknow alt_setting %d\n", alt_setting);
+
+               return -EINVAL;
+       }
+out:
+       if (ret < 0)
+               dev_err(pct->dev, "%s failed (%d)\n", __func__, ret);
+
+       return ret;
+}
+
+static int abx500_get_mode(struct pinctrl_dev *pctldev, struct gpio_chip *chip,
+                         unsigned gpio)
+{
+       u8 mode;
+       bool bit_mode;
+       bool alt_bit1;
+       bool alt_bit2;
+       struct abx500_pinctrl *pct = pinctrl_dev_get_drvdata(pctldev);
+       struct alternate_functions af = pct->soc->alternate_functions[gpio];
+       /* on ABx5xx, there is no GPIO0, so adjust the offset */
+       unsigned offset = gpio - 1;
+       int ret;
+
+       /*
+        * if gpiosel_bit is set to unused,
+        * it means no GPIO or special case
+        */
+       if (af.gpiosel_bit == UNUSED)
+               return ABX500_DEFAULT;
+
+       /* read GpioSelx register */
+       ret = abx500_gpio_get_bit(chip, AB8500_GPIO_SEL1_REG + (offset / 8),
+                       af.gpiosel_bit, &bit_mode);
+       if (ret < 0)
+               goto out;
+
+       mode = bit_mode;
+
+       /* sanity check */
+       if ((af.alt_bit1 < UNUSED) || (af.alt_bit1 > 7) ||
+           (af.alt_bit2 < UNUSED) || (af.alt_bit2 > 7)) {
+               dev_err(pct->dev,
+                       "alt_bitX value not in correct range (-1 to 7)\n");
+               return -EINVAL;
+       }
+
+       /* if alt_bit2 is used, alt_bit1 must be used too */
+       if ((af.alt_bit2 != UNUSED) && (af.alt_bit1 == UNUSED)) {
+               dev_err(pct->dev,
+                       "if alt_bit2 is used, alt_bit1 can't be unused\n");
+               return -EINVAL;
+       }
+
+       /* check if pin use AlternateFunction register */
+       if ((af.alt_bit1 == UNUSED) && (af.alt_bit2 == UNUSED))
+               return mode;
+       /*
+        * if pin GPIOSEL bit is set and pin supports alternate function,
+        * it means DEFAULT mode
+        */
+       if (mode)
+               return ABX500_DEFAULT;
+
+       /*
+        * pin use the AlternatFunction register
+        * read alt_bit1 value
+        */
+       ret = abx500_gpio_get_bit(chip, AB8500_GPIO_ALTFUN_REG,
+                           af.alt_bit1, &alt_bit1);
+       if (ret < 0)
+               goto out;
+
+       if (af.alt_bit2 != UNUSED) {
+               /* read alt_bit2 value */
+               ret = abx500_gpio_get_bit(chip, AB8500_GPIO_ALTFUN_REG,
+                               af.alt_bit2,
+                               &alt_bit2);
+               if (ret < 0)
+                       goto out;
+       } else
+               alt_bit2 = 0;
+
+       mode = (alt_bit2 << 1) + alt_bit1;
+       if (mode == af.alta_val)
+               return ABX500_ALT_A;
+       else if (mode == af.altb_val)
+               return ABX500_ALT_B;
+       else
+               return ABX500_ALT_C;
+
+out:
+       dev_err(pct->dev, "%s failed (%d)\n", __func__, ret);
+       return ret;
+}
+
+#ifdef CONFIG_DEBUG_FS
+
+#include <linux/seq_file.h>
+
+static void abx500_gpio_dbg_show_one(struct seq_file *s,
+                                    struct pinctrl_dev *pctldev,
+                                    struct gpio_chip *chip,
+                                    unsigned offset, unsigned gpio)
+{
+       struct abx500_pinctrl *pct = pinctrl_dev_get_drvdata(pctldev);
+       const char *label = gpiochip_is_requested(chip, offset - 1);
+       u8 gpio_offset = offset - 1;
+       int mode = -1;
+       bool is_out;
+       bool pd;
+       enum abx500_gpio_pull_updown pud = 0;
+       int ret;
+
+       const char *modes[] = {
+               [ABX500_DEFAULT]        = "default",
+               [ABX500_ALT_A]          = "altA",
+               [ABX500_ALT_B]          = "altB",
+               [ABX500_ALT_C]          = "altC",
+       };
+
+       const char *pull_up_down[] = {
+               [ABX500_GPIO_PULL_DOWN]         = "pull down",
+               [ABX500_GPIO_PULL_NONE]         = "pull none",
+               [ABX500_GPIO_PULL_NONE + 1]     = "pull none",
+               [ABX500_GPIO_PULL_UP]           = "pull up",
+       };
+
+       ret = abx500_gpio_get_bit(chip, AB8500_GPIO_DIR1_REG,
+                       gpio_offset, &is_out);
+       if (ret < 0)
+               goto out;
+
+       seq_printf(s, " gpio-%-3d (%-20.20s) %-3s",
+                  gpio, label ?: "(none)",
+                  is_out ? "out" : "in ");
+
+       if (!is_out) {
+               if (abx500_pullud_supported(chip, offset)) {
+                       ret = abx500_get_pull_updown(pct, offset, &pud);
+                       if (ret < 0)
+                               goto out;
+
+                       seq_printf(s, " %-9s", pull_up_down[pud]);
+               } else {
+                       ret = abx500_gpio_get_bit(chip, AB8500_GPIO_PUD1_REG,
+                                       gpio_offset, &pd);
+                       if (ret < 0)
+                               goto out;
+
+                       seq_printf(s, " %-9s", pull_up_down[pd]);
+               }
+       } else
+               seq_printf(s, " %-9s", chip->get(chip, offset) ? "hi" : "lo");
+
+       if (pctldev)
+               mode = abx500_get_mode(pctldev, chip, offset);
+
+       seq_printf(s, " %s", (mode < 0) ? "unknown" : modes[mode]);
+
+out:
+       if (ret < 0)
+               dev_err(pct->dev, "%s failed (%d)\n", __func__, ret);
+}
+
+static void abx500_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
+{
+       unsigned i;
+       unsigned gpio = chip->base;
+       struct abx500_pinctrl *pct = to_abx500_pinctrl(chip);
+       struct pinctrl_dev *pctldev = pct->pctldev;
+
+       for (i = 0; i < chip->ngpio; i++, gpio++) {
+               /* On AB8500, there is no GPIO0, the first is the GPIO 1 */
+               abx500_gpio_dbg_show_one(s, pctldev, chip, i + 1, gpio);
+               seq_printf(s, "\n");
+       }
+}
+
+#else
+static inline void abx500_gpio_dbg_show_one(struct seq_file *s,
+                                           struct pinctrl_dev *pctldev,
+                                           struct gpio_chip *chip,
+                                           unsigned offset, unsigned gpio)
+{
+}
+#define abx500_gpio_dbg_show   NULL
+#endif
+
+static int abx500_gpio_request(struct gpio_chip *chip, unsigned offset)
+{
+       int gpio = chip->base + offset;
+
+       return pinctrl_request_gpio(gpio);
+}
+
+static void abx500_gpio_free(struct gpio_chip *chip, unsigned offset)
+{
+       int gpio = chip->base + offset;
+
+       pinctrl_free_gpio(gpio);
+}
+
+static struct gpio_chip abx500gpio_chip = {
+       .label                  = "abx500-gpio",
+       .owner                  = THIS_MODULE,
+       .request                = abx500_gpio_request,
+       .free                   = abx500_gpio_free,
+       .direction_input        = abx500_gpio_direction_input,
+       .get                    = abx500_gpio_get,
+       .direction_output       = abx500_gpio_direction_output,
+       .set                    = abx500_gpio_set,
+       .to_irq                 = abx500_gpio_to_irq,
+       .dbg_show               = abx500_gpio_dbg_show,
+};
+
+static int abx500_pmx_get_funcs_cnt(struct pinctrl_dev *pctldev)
+{
+       struct abx500_pinctrl *pct = pinctrl_dev_get_drvdata(pctldev);
+
+       return pct->soc->nfunctions;
+}
+
+static const char *abx500_pmx_get_func_name(struct pinctrl_dev *pctldev,
+                                        unsigned function)
+{
+       struct abx500_pinctrl *pct = pinctrl_dev_get_drvdata(pctldev);
+
+       return pct->soc->functions[function].name;
+}
+
+static int abx500_pmx_get_func_groups(struct pinctrl_dev *pctldev,
+                                     unsigned function,
+                                     const char * const **groups,
+                                     unsigned * const num_groups)
+{
+       struct abx500_pinctrl *pct = pinctrl_dev_get_drvdata(pctldev);
+
+       *groups = pct->soc->functions[function].groups;
+       *num_groups = pct->soc->functions[function].ngroups;
+
+       return 0;
+}
+
+static int abx500_pmx_enable(struct pinctrl_dev *pctldev, unsigned function,
+                            unsigned group)
+{
+       struct abx500_pinctrl *pct = pinctrl_dev_get_drvdata(pctldev);
+       struct gpio_chip *chip = &pct->chip;
+       const struct abx500_pingroup *g;
+       int i;
+       int ret = 0;
+
+       g = &pct->soc->groups[group];
+       if (g->altsetting < 0)
+               return -EINVAL;
+
+       dev_dbg(pct->dev, "enable group %s, %u pins\n", g->name, g->npins);
+
+       for (i = 0; i < g->npins; i++) {
+               dev_dbg(pct->dev, "setting pin %d to altsetting %d\n",
+                       g->pins[i], g->altsetting);
+
+               ret = abx500_set_mode(pctldev, chip, g->pins[i], g->altsetting);
+       }
+
+       if (ret < 0)
+               dev_err(pct->dev, "%s failed (%d)\n", __func__, ret);
+
+       return ret;
+}
+
+static int abx500_gpio_request_enable(struct pinctrl_dev *pctldev,
+                              struct pinctrl_gpio_range *range,
+                              unsigned offset)
+{
+       struct abx500_pinctrl *pct = pinctrl_dev_get_drvdata(pctldev);
+       const struct abx500_pinrange *p;
+       int ret;
+       int i;
+
+       /*
+        * Different ranges have different ways to enable GPIO function on a
+        * pin, so refer back to our local range type, where we handily define
+        * what altfunc enables GPIO for a certain pin.
+        */
+       for (i = 0; i < pct->soc->gpio_num_ranges; i++) {
+               p = &pct->soc->gpio_ranges[i];
+               if ((offset >= p->offset) &&
+                   (offset < (p->offset + p->npins)))
+                 break;
+       }
+
+       if (i == pct->soc->gpio_num_ranges) {
+               dev_err(pct->dev, "%s failed to locate range\n", __func__);
+               return -ENODEV;
+       }
+
+       dev_dbg(pct->dev, "enable GPIO by altfunc %d at gpio %d\n",
+               p->altfunc, offset);
+
+       ret = abx500_set_mode(pct->pctldev, &pct->chip,
+                             offset, p->altfunc);
+       if (ret < 0)
+               dev_err(pct->dev, "%s setting altfunc failed\n", __func__);
+
+       return ret;
+}
+
+static void abx500_gpio_disable_free(struct pinctrl_dev *pctldev,
+                                    struct pinctrl_gpio_range *range,
+                                    unsigned offset)
+{
+}
+
+static const struct pinmux_ops abx500_pinmux_ops = {
+       .get_functions_count = abx500_pmx_get_funcs_cnt,
+       .get_function_name = abx500_pmx_get_func_name,
+       .get_function_groups = abx500_pmx_get_func_groups,
+       .enable = abx500_pmx_enable,
+       .gpio_request_enable = abx500_gpio_request_enable,
+       .gpio_disable_free = abx500_gpio_disable_free,
+};
+
+static int abx500_get_groups_cnt(struct pinctrl_dev *pctldev)
+{
+       struct abx500_pinctrl *pct = pinctrl_dev_get_drvdata(pctldev);
+
+       return pct->soc->ngroups;
+}
+
+static const char *abx500_get_group_name(struct pinctrl_dev *pctldev,
+                                        unsigned selector)
+{
+       struct abx500_pinctrl *pct = pinctrl_dev_get_drvdata(pctldev);
+
+       return pct->soc->groups[selector].name;
+}
+
+static int abx500_get_group_pins(struct pinctrl_dev *pctldev,
+                                unsigned selector,
+                                const unsigned **pins,
+                                unsigned *num_pins)
+{
+       struct abx500_pinctrl *pct = pinctrl_dev_get_drvdata(pctldev);
+
+       *pins = pct->soc->groups[selector].pins;
+       *num_pins = pct->soc->groups[selector].npins;
+
+       return 0;
+}
+
+static void abx500_pin_dbg_show(struct pinctrl_dev *pctldev,
+                               struct seq_file *s, unsigned offset)
+{
+       struct abx500_pinctrl *pct = pinctrl_dev_get_drvdata(pctldev);
+       struct gpio_chip *chip = &pct->chip;
+
+       abx500_gpio_dbg_show_one(s, pctldev, chip, offset,
+                                chip->base + offset - 1);
+}
+
+static void abx500_dt_free_map(struct pinctrl_dev *pctldev,
+               struct pinctrl_map *map, unsigned num_maps)
+{
+       int i;
+
+       for (i = 0; i < num_maps; i++)
+               if (map[i].type == PIN_MAP_TYPE_CONFIGS_PIN)
+                       kfree(map[i].data.configs.configs);
+       kfree(map);
+}
+
+static int abx500_dt_reserve_map(struct pinctrl_map **map,
+               unsigned *reserved_maps,
+               unsigned *num_maps,
+               unsigned reserve)
+{
+       unsigned old_num = *reserved_maps;
+       unsigned new_num = *num_maps + reserve;
+       struct pinctrl_map *new_map;
+
+       if (old_num >= new_num)
+               return 0;
+
+       new_map = krealloc(*map, sizeof(*new_map) * new_num, GFP_KERNEL);
+       if (!new_map)
+               return -ENOMEM;
+
+       memset(new_map + old_num, 0, (new_num - old_num) * sizeof(*new_map));
+
+       *map = new_map;
+       *reserved_maps = new_num;
+
+       return 0;
+}
+
+static int abx500_dt_add_map_mux(struct pinctrl_map **map,
+               unsigned *reserved_maps,
+               unsigned *num_maps, const char *group,
+               const char *function)
+{
+       if (*num_maps == *reserved_maps)
+               return -ENOSPC;
+
+       (*map)[*num_maps].type = PIN_MAP_TYPE_MUX_GROUP;
+       (*map)[*num_maps].data.mux.group = group;
+       (*map)[*num_maps].data.mux.function = function;
+       (*num_maps)++;
+
+       return 0;
+}
+
+static int abx500_dt_add_map_configs(struct pinctrl_map **map,
+               unsigned *reserved_maps,
+               unsigned *num_maps, const char *group,
+               unsigned long *configs, unsigned num_configs)
+{
+       unsigned long *dup_configs;
+
+       if (*num_maps == *reserved_maps)
+               return -ENOSPC;
+
+       dup_configs = kmemdup(configs, num_configs * sizeof(*dup_configs),
+                             GFP_KERNEL);
+       if (!dup_configs)
+               return -ENOMEM;
+
+       (*map)[*num_maps].type = PIN_MAP_TYPE_CONFIGS_PIN;
+
+       (*map)[*num_maps].data.configs.group_or_pin = group;
+       (*map)[*num_maps].data.configs.configs = dup_configs;
+       (*map)[*num_maps].data.configs.num_configs = num_configs;
+       (*num_maps)++;
+
+       return 0;
+}
+
+static const char *abx500_find_pin_name(struct pinctrl_dev *pctldev,
+                                       const char *pin_name)
+{
+       int i, pin_number;
+       struct abx500_pinctrl *npct = pinctrl_dev_get_drvdata(pctldev);
+
+       if (sscanf((char *)pin_name, "GPIO%d", &pin_number) == 1)
+               for (i = 0; i < npct->soc->npins; i++)
+                       if (npct->soc->pins[i].number == pin_number)
+                               return npct->soc->pins[i].name;
+       return NULL;
+}
+
+static int abx500_dt_subnode_to_map(struct pinctrl_dev *pctldev,
+               struct device_node *np,
+               struct pinctrl_map **map,
+               unsigned *reserved_maps,
+               unsigned *num_maps)
+{
+       int ret;
+       const char *function = NULL;
+       unsigned long *configs;
+       unsigned int nconfigs = 0;
+       bool has_config = 0;
+       unsigned reserve = 0;
+       struct property *prop;
+       const char *group, *gpio_name;
+       struct device_node *np_config;
+
+       ret = of_property_read_string(np, "ste,function", &function);
+       if (ret >= 0)
+               reserve = 1;
+
+       ret = pinconf_generic_parse_dt_config(np, &configs, &nconfigs);
+       if (nconfigs)
+               has_config = 1;
+
+       np_config = of_parse_phandle(np, "ste,config", 0);
+       if (np_config) {
+               ret = pinconf_generic_parse_dt_config(np_config, &configs,
+                               &nconfigs);
+               if (ret)
+                       goto exit;
+               has_config |= nconfigs;
+       }
+
+       ret = of_property_count_strings(np, "ste,pins");
+       if (ret < 0)
+               goto exit;
+
+       if (has_config)
+               reserve++;
+
+       reserve *= ret;
+
+       ret = abx500_dt_reserve_map(map, reserved_maps, num_maps, reserve);
+       if (ret < 0)
+               goto exit;
+
+       of_property_for_each_string(np, "ste,pins", prop, group) {
+               if (function) {
+                       ret = abx500_dt_add_map_mux(map, reserved_maps,
+                                       num_maps, group, function);
+                       if (ret < 0)
+                               goto exit;
+               }
+               if (has_config) {
+                       gpio_name = abx500_find_pin_name(pctldev, group);
+
+                       ret = abx500_dt_add_map_configs(map, reserved_maps,
+                                       num_maps, gpio_name, configs, 1);
+                       if (ret < 0)
+                               goto exit;
+               }
+
+       }
+exit:
+       return ret;
+}
+
+static int abx500_dt_node_to_map(struct pinctrl_dev *pctldev,
+                                struct device_node *np_config,
+                                struct pinctrl_map **map, unsigned *num_maps)
+{
+       unsigned reserved_maps;
+       struct device_node *np;
+       int ret;
+
+       reserved_maps = 0;
+       *map = NULL;
+       *num_maps = 0;
+
+       for_each_child_of_node(np_config, np) {
+               ret = abx500_dt_subnode_to_map(pctldev, np, map,
+                               &reserved_maps, num_maps);
+               if (ret < 0) {
+                       abx500_dt_free_map(pctldev, *map, *num_maps);
+                       return ret;
+               }
+       }
+
+       return 0;
+}
+
+static const struct pinctrl_ops abx500_pinctrl_ops = {
+       .get_groups_count = abx500_get_groups_cnt,
+       .get_group_name = abx500_get_group_name,
+       .get_group_pins = abx500_get_group_pins,
+       .pin_dbg_show = abx500_pin_dbg_show,
+       .dt_node_to_map = abx500_dt_node_to_map,
+       .dt_free_map = abx500_dt_free_map,
+};
+
+static int abx500_pin_config_get(struct pinctrl_dev *pctldev,
+                         unsigned pin,
+                         unsigned long *config)
+{
+       return -ENOSYS;
+}
+
+static int abx500_pin_config_set(struct pinctrl_dev *pctldev,
+                         unsigned pin,
+                         unsigned long *configs,
+                         unsigned num_configs)
+{
+       struct abx500_pinctrl *pct = pinctrl_dev_get_drvdata(pctldev);
+       struct gpio_chip *chip = &pct->chip;
+       unsigned offset;
+       int ret = -EINVAL;
+       int i;
+       enum pin_config_param param;
+       enum pin_config_param argument;
+
+       for (i = 0; i < num_configs; i++) {
+               param = pinconf_to_config_param(configs[i]);
+               argument = pinconf_to_config_argument(configs[i]);
+
+               dev_dbg(chip->dev, "pin %d [%#lx]: %s %s\n",
+                       pin, configs[i],
+                       (param == PIN_CONFIG_OUTPUT) ? "output " : "input",
+                       (param == PIN_CONFIG_OUTPUT) ?
+                       (argument ? "high" : "low") :
+                       (argument ? "pull up" : "pull down"));
+
+               /* on ABx500, there is no GPIO0, so adjust the offset */
+               offset = pin - 1;
+
+               switch (param) {
+               case PIN_CONFIG_BIAS_DISABLE:
+                       ret = abx500_gpio_direction_input(chip, offset);
+                       if (ret < 0)
+                               goto out;
+                       /*
+                        * Some chips only support pull down, while some
+                        * actually support both pull up and pull down. Such
+                        * chips have a "pullud" range specified for the pins
+                        * that support both features. If the pin is not
+                        * within that range, we fall back to the old bit set
+                        * that only support pull down.
+                        */
+                       if (abx500_pullud_supported(chip, pin))
+                               ret = abx500_set_pull_updown(pct,
+                                       pin,
+                                       ABX500_GPIO_PULL_NONE);
+                       else
+                               /* Chip only supports pull down */
+                               ret = abx500_gpio_set_bits(chip,
+                                       AB8500_GPIO_PUD1_REG, offset,
+                                       ABX500_GPIO_PULL_NONE);
+                       break;
+
+               case PIN_CONFIG_BIAS_PULL_DOWN:
+                       ret = abx500_gpio_direction_input(chip, offset);
+                       if (ret < 0)
+                               goto out;
+                       /*
+                        * if argument = 1 set the pull down
+                        * else clear the pull down
+                        * Some chips only support pull down, while some
+                        * actually support both pull up and pull down. Such
+                        * chips have a "pullud" range specified for the pins
+                        * that support both features. If the pin is not
+                        * within that range, we fall back to the old bit set
+                        * that only support pull down.
+                        */
+                       if (abx500_pullud_supported(chip, pin))
+                               ret = abx500_set_pull_updown(pct,
+                                       pin,
+                                       argument ? ABX500_GPIO_PULL_DOWN :
+                                       ABX500_GPIO_PULL_NONE);
+                       else
+                               /* Chip only supports pull down */
+                               ret = abx500_gpio_set_bits(chip,
+                               AB8500_GPIO_PUD1_REG,
+                                       offset,
+                                       argument ? ABX500_GPIO_PULL_DOWN :
+                                       ABX500_GPIO_PULL_NONE);
+                       break;
+
+               case PIN_CONFIG_BIAS_PULL_UP:
+                       ret = abx500_gpio_direction_input(chip, offset);
+                       if (ret < 0)
+                               goto out;
+                       /*
+                        * if argument = 1 set the pull up
+                        * else clear the pull up
+                        */
+                       ret = abx500_gpio_direction_input(chip, offset);
+                       /*
+                        * Some chips only support pull down, while some
+                        * actually support both pull up and pull down. Such
+                        * chips have a "pullud" range specified for the pins
+                        * that support both features. If the pin is not
+                        * within that range, do nothing
+                        */
+                       if (abx500_pullud_supported(chip, pin))
+                               ret = abx500_set_pull_updown(pct,
+                                       pin,
+                                       argument ? ABX500_GPIO_PULL_UP :
+                                       ABX500_GPIO_PULL_NONE);
+                       break;
+
+               case PIN_CONFIG_OUTPUT:
+                       ret = abx500_gpio_direction_output(chip, offset,
+                               argument);
+                       break;
+
+               default:
+                       dev_err(chip->dev, "illegal configuration requested\n");
+               }
+       } /* for each config */
+out:
+       if (ret < 0)
+               dev_err(pct->dev, "%s failed (%d)\n", __func__, ret);
+
+       return ret;
+}
+
+static const struct pinconf_ops abx500_pinconf_ops = {
+       .pin_config_get = abx500_pin_config_get,
+       .pin_config_set = abx500_pin_config_set,
+};
+
+static struct pinctrl_desc abx500_pinctrl_desc = {
+       .name = "pinctrl-abx500",
+       .pctlops = &abx500_pinctrl_ops,
+       .pmxops = &abx500_pinmux_ops,
+       .confops = &abx500_pinconf_ops,
+       .owner = THIS_MODULE,
+};
+
+static int abx500_get_gpio_num(struct abx500_pinctrl_soc_data *soc)
+{
+       unsigned int lowest = 0;
+       unsigned int highest = 0;
+       unsigned int npins = 0;
+       int i;
+
+       /*
+        * Compute number of GPIOs from the last SoC gpio range descriptors
+        * These ranges may include "holes" but the GPIO number space shall
+        * still be homogeneous, so we need to detect and account for any
+        * such holes so that these are included in the number of GPIO pins.
+        */
+       for (i = 0; i < soc->gpio_num_ranges; i++) {
+               unsigned gstart;
+               unsigned gend;
+               const struct abx500_pinrange *p;
+
+               p = &soc->gpio_ranges[i];
+               gstart = p->offset;
+               gend = p->offset + p->npins - 1;
+
+               if (i == 0) {
+                       /* First iteration, set start values */
+                       lowest = gstart;
+                       highest = gend;
+               } else {
+                       if (gstart < lowest)
+                               lowest = gstart;
+                       if (gend > highest)
+                               highest = gend;
+               }
+       }
+       /* this gives the absolute number of pins */
+       npins = highest - lowest + 1;
+       return npins;
+}
+
+static const struct of_device_id abx500_gpio_match[] = {
+       { .compatible = "stericsson,ab8500-gpio", .data = (void *)PINCTRL_AB8500, },
+       { .compatible = "stericsson,ab8505-gpio", .data = (void *)PINCTRL_AB8505, },
+       { .compatible = "stericsson,ab8540-gpio", .data = (void *)PINCTRL_AB8540, },
+       { .compatible = "stericsson,ab9540-gpio", .data = (void *)PINCTRL_AB9540, },
+       { }
+};
+
+static int abx500_gpio_probe(struct platform_device *pdev)
+{
+       struct device_node *np = pdev->dev.of_node;
+       const struct of_device_id *match;
+       struct abx500_pinctrl *pct;
+       unsigned int id = -1;
+       int ret, err;
+       int i;
+
+       if (!np) {
+               dev_err(&pdev->dev, "gpio dt node missing\n");
+               return -ENODEV;
+       }
+
+       pct = devm_kzalloc(&pdev->dev, sizeof(struct abx500_pinctrl),
+                                  GFP_KERNEL);
+       if (pct == NULL) {
+               dev_err(&pdev->dev,
+                       "failed to allocate memory for pct\n");
+               return -ENOMEM;
+       }
+
+       pct->dev = &pdev->dev;
+       pct->parent = dev_get_drvdata(pdev->dev.parent);
+       pct->chip = abx500gpio_chip;
+       pct->chip.dev = &pdev->dev;
+       pct->chip.base = -1; /* Dynamic allocation */
+
+       match = of_match_device(abx500_gpio_match, &pdev->dev);
+       if (!match) {
+               dev_err(&pdev->dev, "gpio dt not matching\n");
+               return -ENODEV;
+       }
+       id = (unsigned long)match->data;
+
+       /* Poke in other ASIC variants here */
+       switch (id) {
+       case PINCTRL_AB8500:
+               abx500_pinctrl_ab8500_init(&pct->soc);
+               break;
+       case PINCTRL_AB8540:
+               abx500_pinctrl_ab8540_init(&pct->soc);
+               break;
+       case PINCTRL_AB9540:
+               abx500_pinctrl_ab9540_init(&pct->soc);
+               break;
+       case PINCTRL_AB8505:
+               abx500_pinctrl_ab8505_init(&pct->soc);
+               break;
+       default:
+               dev_err(&pdev->dev, "Unsupported pinctrl sub driver (%d)\n", id);
+               return -EINVAL;
+       }
+
+       if (!pct->soc) {
+               dev_err(&pdev->dev, "Invalid SOC data\n");
+               return -EINVAL;
+       }
+
+       pct->chip.ngpio = abx500_get_gpio_num(pct->soc);
+       pct->irq_cluster = pct->soc->gpio_irq_cluster;
+       pct->irq_cluster_size = pct->soc->ngpio_irq_cluster;
+
+       ret = gpiochip_add(&pct->chip);
+       if (ret) {
+               dev_err(&pdev->dev, "unable to add gpiochip: %d\n", ret);
+               return ret;
+       }
+       dev_info(&pdev->dev, "added gpiochip\n");
+
+       abx500_pinctrl_desc.pins = pct->soc->pins;
+       abx500_pinctrl_desc.npins = pct->soc->npins;
+       pct->pctldev = pinctrl_register(&abx500_pinctrl_desc, &pdev->dev, pct);
+       if (!pct->pctldev) {
+               dev_err(&pdev->dev,
+                       "could not register abx500 pinctrl driver\n");
+               ret = -EINVAL;
+               goto out_rem_chip;
+       }
+       dev_info(&pdev->dev, "registered pin controller\n");
+
+       /* We will handle a range of GPIO pins */
+       for (i = 0; i < pct->soc->gpio_num_ranges; i++) {
+               const struct abx500_pinrange *p = &pct->soc->gpio_ranges[i];
+
+               ret = gpiochip_add_pin_range(&pct->chip,
+                                       dev_name(&pdev->dev),
+                                       p->offset - 1, p->offset, p->npins);
+               if (ret < 0)
+                       goto out_rem_chip;
+       }
+
+       platform_set_drvdata(pdev, pct);
+       dev_info(&pdev->dev, "initialized abx500 pinctrl driver\n");
+
+       return 0;
+
+out_rem_chip:
+       err = gpiochip_remove(&pct->chip);
+       if (err)
+               dev_info(&pdev->dev, "failed to remove gpiochip\n");
+
+       return ret;
+}
+
+/**
+ * abx500_gpio_remove() - remove Ab8500-gpio driver
+ * @pdev:      Platform device registered
+ */
+static int abx500_gpio_remove(struct platform_device *pdev)
+{
+       struct abx500_pinctrl *pct = platform_get_drvdata(pdev);
+       int ret;
+
+       ret = gpiochip_remove(&pct->chip);
+       if (ret < 0) {
+               dev_err(pct->dev, "unable to remove gpiochip: %d\n",
+                       ret);
+               return ret;
+       }
+
+       return 0;
+}
+
+static struct platform_driver abx500_gpio_driver = {
+       .driver = {
+               .name = "abx500-gpio",
+               .owner = THIS_MODULE,
+               .of_match_table = abx500_gpio_match,
+       },
+       .probe = abx500_gpio_probe,
+       .remove = abx500_gpio_remove,
+};
+
+static int __init abx500_gpio_init(void)
+{
+       return platform_driver_register(&abx500_gpio_driver);
+}
+core_initcall(abx500_gpio_init);
+
+MODULE_AUTHOR("Patrice Chotard <patrice.chotard@st.com>");
+MODULE_DESCRIPTION("Driver allows to use AxB5xx unused pins to be used as GPIO");
+MODULE_ALIAS("platform:abx500-gpio");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/pinctrl/nomadik/pinctrl-abx500.h b/drivers/pinctrl/nomadik/pinctrl-abx500.h
new file mode 100644 (file)
index 0000000..2beef3b
--- /dev/null
@@ -0,0 +1,246 @@
+#ifndef PINCTRL_PINCTRL_ABx500_H
+#define PINCTRL_PINCTRL_ABx500_H
+
+/* Package definitions */
+#define PINCTRL_AB8500 0
+#define PINCTRL_AB8540 1
+#define PINCTRL_AB9540 2
+#define PINCTRL_AB8505 3
+
+/* pins alternate function */
+enum abx500_pin_func {
+       ABX500_DEFAULT,
+       ABX500_ALT_A,
+       ABX500_ALT_B,
+       ABX500_ALT_C,
+};
+
+enum abx500_gpio_pull_updown {
+       ABX500_GPIO_PULL_DOWN = 0x0,
+       ABX500_GPIO_PULL_NONE = 0x1,
+       ABX500_GPIO_PULL_UP = 0x3,
+};
+
+enum abx500_gpio_vinsel {
+       ABX500_GPIO_VINSEL_VBAT = 0x0,
+       ABX500_GPIO_VINSEL_VIN_1V8 = 0x1,
+       ABX500_GPIO_VINSEL_VDD_BIF = 0x2,
+};
+
+/**
+ * struct abx500_function - ABx500 pinctrl mux function
+ * @name: The name of the function, exported to pinctrl core.
+ * @groups: An array of pin groups that may select this function.
+ * @ngroups: The number of entries in @groups.
+ */
+struct abx500_function {
+       const char *name;
+       const char * const *groups;
+       unsigned ngroups;
+};
+
+/**
+ * struct abx500_pingroup - describes a ABx500 pin group
+ * @name: the name of this specific pin group
+ * @pins: an array of discrete physical pins used in this group, taken
+ *     from the driver-local pin enumeration space
+ * @num_pins: the number of pins in this group array, i.e. the number of
+ *     elements in .pins so we can iterate over that array
+ * @altsetting: the altsetting to apply to all pins in this group to
+ *     configure them to be used by a function
+ */
+struct abx500_pingroup {
+       const char *name;
+       const unsigned int *pins;
+       const unsigned npins;
+       int altsetting;
+};
+
+#define ALTERNATE_FUNCTIONS(pin, sel_bit, alt1, alt2, alta, altb, altc)        \
+{                                                                      \
+       .pin_number = pin,                                              \
+       .gpiosel_bit = sel_bit,                                         \
+       .alt_bit1 = alt1,                                               \
+       .alt_bit2 = alt2,                                               \
+       .alta_val = alta,                                               \
+       .altb_val = altb,                                               \
+       .altc_val = altc,                                               \
+}
+
+#define UNUSED -1
+/**
+ * struct alternate_functions
+ * @pin_number:                The pin number
+ * @gpiosel_bit:       Control bit in GPIOSEL register,
+ * @alt_bit1:          First AlternateFunction bit used to select the
+ *                     alternate function
+ * @alt_bit2:          Second AlternateFunction bit used to select the
+ *                     alternate function
+ *
+ *                     these 3 following fields are necessary due to none
+ *                     coherency on how to select the altA, altB and altC
+ *                     function between the ABx500 SOC family when using
+ *                     alternatfunc register.
+ * @alta_val:          value to write in alternatfunc to select altA function
+ * @altb_val:          value to write in alternatfunc to select altB function
+ * @altc_val:          value to write in alternatfunc to select altC function
+ */
+struct alternate_functions {
+       unsigned pin_number;
+       s8 gpiosel_bit;
+       s8 alt_bit1;
+       s8 alt_bit2;
+       u8 alta_val;
+       u8 altb_val;
+       u8 altc_val;
+};
+
+/**
+ * struct pullud - specific pull up/down feature
+ * @first_pin:         The pin number of the first pins which support
+ *                     specific pull up/down
+ * @last_pin:          The pin number of the last pins
+ */
+struct pullud {
+       unsigned first_pin;
+       unsigned last_pin;
+};
+
+#define GPIO_IRQ_CLUSTER(a, b, c)      \
+{                                      \
+       .start = a,                     \
+       .end = b,                       \
+       .to_irq = c,                    \
+}
+
+/**
+ * struct abx500_gpio_irq_cluster - indicates GPIOs which are interrupt
+ *                     capable
+ * @start:             The pin number of the first pin interrupt capable
+ * @end:               The pin number of the last pin interrupt capable
+ * @to_irq:            The ABx500 GPIO's associated IRQs are clustered
+ *                      together throughout the interrupt numbers at irregular
+ *                      intervals. To solve this quandary, we will place the
+ *                      read-in values into the cluster information table
+ */
+
+struct abx500_gpio_irq_cluster {
+       int start;
+       int end;
+       int to_irq;
+};
+
+/**
+ * struct abx500_pinrange - map pin numbers to GPIO offsets
+ * @offset:            offset into the GPIO local numberspace, incidentally
+ *                     identical to the offset into the local pin numberspace
+ * @npins:             number of pins to map from both offsets
+ * @altfunc:           altfunc setting to be used to enable GPIO on a pin in
+ *                     this range (may vary)
+ */
+struct abx500_pinrange {
+       unsigned int offset;
+       unsigned int npins;
+       int altfunc;
+};
+
+#define ABX500_PINRANGE(a, b, c) { .offset = a, .npins = b, .altfunc = c }
+
+/**
+ * struct abx500_pinctrl_soc_data - ABx500 pin controller per-SoC configuration
+ * @gpio_ranges:       An array of GPIO ranges for this SoC
+ * @gpio_num_ranges:   The number of GPIO ranges for this SoC
+ * @pins:              An array describing all pins the pin controller affects.
+ *                     All pins which are also GPIOs must be listed first within the
+ *                     array, and be numbered identically to the GPIO controller's
+ *                     numbering.
+ * @npins:             The number of entries in @pins.
+ * @functions:         The functions supported on this SoC.
+ * @nfunction:         The number of entries in @functions.
+ * @groups:            An array describing all pin groups the pin SoC supports.
+ * @ngroups:           The number of entries in @groups.
+ * @alternate_functions: array describing pins which supports alternate and
+ *                     how to set it.
+ * @pullud:            array describing pins which supports pull up/down
+ *                     specific registers.
+ * @gpio_irq_cluster:  An array of GPIO interrupt capable for this SoC
+ * @ngpio_irq_cluster: The number of GPIO inetrrupt capable for this SoC
+ * @irq_gpio_rising_offset: Interrupt offset used as base to compute specific
+ *                     setting strategy of the rising interrupt line
+ * @irq_gpio_falling_offset: Interrupt offset used as base to compute specific
+ *                     setting strategy of the falling interrupt line
+ * @irq_gpio_factor:   Factor used to compute specific setting strategy of
+ *                     the interrupt line
+ */
+
+struct abx500_pinctrl_soc_data {
+       const struct abx500_pinrange *gpio_ranges;
+       unsigned gpio_num_ranges;
+       const struct pinctrl_pin_desc *pins;
+       unsigned npins;
+       const struct abx500_function *functions;
+       unsigned nfunctions;
+       const struct abx500_pingroup *groups;
+       unsigned ngroups;
+       struct alternate_functions *alternate_functions;
+       struct pullud *pullud;
+       struct abx500_gpio_irq_cluster *gpio_irq_cluster;
+       unsigned ngpio_irq_cluster;
+       int irq_gpio_rising_offset;
+       int irq_gpio_falling_offset;
+       int irq_gpio_factor;
+};
+
+#ifdef CONFIG_PINCTRL_AB8500
+
+void abx500_pinctrl_ab8500_init(struct abx500_pinctrl_soc_data **soc);
+
+#else
+
+static inline void
+abx500_pinctrl_ab8500_init(struct abx500_pinctrl_soc_data **soc)
+{
+}
+
+#endif
+
+#ifdef CONFIG_PINCTRL_AB8540
+
+void abx500_pinctrl_ab8540_init(struct abx500_pinctrl_soc_data **soc);
+
+#else
+
+static inline void
+abx500_pinctrl_ab8540_init(struct abx500_pinctrl_soc_data **soc)
+{
+}
+
+#endif
+
+#ifdef CONFIG_PINCTRL_AB9540
+
+void abx500_pinctrl_ab9540_init(struct abx500_pinctrl_soc_data **soc);
+
+#else
+
+static inline void
+abx500_pinctrl_ab9540_init(struct abx500_pinctrl_soc_data **soc)
+{
+}
+
+#endif
+
+#ifdef CONFIG_PINCTRL_AB8505
+
+void abx500_pinctrl_ab8505_init(struct abx500_pinctrl_soc_data **soc);
+
+#else
+
+static inline void
+abx500_pinctrl_ab8505_init(struct abx500_pinctrl_soc_data **soc)
+{
+}
+
+#endif
+
+#endif /* PINCTRL_PINCTRL_ABx500_H */
diff --git a/drivers/pinctrl/nomadik/pinctrl-nomadik-db8500.c b/drivers/pinctrl/nomadik/pinctrl-nomadik-db8500.c
new file mode 100644 (file)
index 0000000..c748407
--- /dev/null
@@ -0,0 +1,1257 @@
+#include <linux/kernel.h>
+#include <linux/pinctrl/pinctrl.h>
+#include "pinctrl-nomadik.h"
+
+/* All the pins that can be used for GPIO and some other functions */
+#define _GPIO(offset)          (offset)
+
+#define DB8500_PIN_AJ5         _GPIO(0)
+#define DB8500_PIN_AJ3         _GPIO(1)
+#define DB8500_PIN_AH4         _GPIO(2)
+#define DB8500_PIN_AH3         _GPIO(3)
+#define DB8500_PIN_AH6         _GPIO(4)
+#define DB8500_PIN_AG6         _GPIO(5)
+#define DB8500_PIN_AF6         _GPIO(6)
+#define DB8500_PIN_AG5         _GPIO(7)
+#define DB8500_PIN_AD5         _GPIO(8)
+#define DB8500_PIN_AE4         _GPIO(9)
+#define DB8500_PIN_AF5         _GPIO(10)
+#define DB8500_PIN_AG4         _GPIO(11)
+#define DB8500_PIN_AC4         _GPIO(12)
+#define DB8500_PIN_AF3         _GPIO(13)
+#define DB8500_PIN_AE3         _GPIO(14)
+#define DB8500_PIN_AC3         _GPIO(15)
+#define DB8500_PIN_AD3         _GPIO(16)
+#define DB8500_PIN_AD4         _GPIO(17)
+#define DB8500_PIN_AC2         _GPIO(18)
+#define DB8500_PIN_AC1         _GPIO(19)
+#define DB8500_PIN_AB4         _GPIO(20)
+#define DB8500_PIN_AB3         _GPIO(21)
+#define DB8500_PIN_AA3         _GPIO(22)
+#define DB8500_PIN_AA4         _GPIO(23)
+#define DB8500_PIN_AB2         _GPIO(24)
+#define DB8500_PIN_Y4          _GPIO(25)
+#define DB8500_PIN_Y2          _GPIO(26)
+#define DB8500_PIN_AA2         _GPIO(27)
+#define DB8500_PIN_AA1         _GPIO(28)
+#define DB8500_PIN_W2          _GPIO(29)
+#define DB8500_PIN_W3          _GPIO(30)
+#define DB8500_PIN_V3          _GPIO(31)
+#define DB8500_PIN_V2          _GPIO(32)
+#define DB8500_PIN_AF2         _GPIO(33)
+#define DB8500_PIN_AE1         _GPIO(34)
+#define DB8500_PIN_AE2         _GPIO(35)
+#define DB8500_PIN_AG2         _GPIO(36)
+/* Hole */
+#define DB8500_PIN_F3          _GPIO(64)
+#define DB8500_PIN_F1          _GPIO(65)
+#define DB8500_PIN_G3          _GPIO(66)
+#define DB8500_PIN_G2          _GPIO(67)
+#define DB8500_PIN_E1          _GPIO(68)
+#define DB8500_PIN_E2          _GPIO(69)
+#define DB8500_PIN_G5          _GPIO(70)
+#define DB8500_PIN_G4          _GPIO(71)
+#define DB8500_PIN_H4          _GPIO(72)
+#define DB8500_PIN_H3          _GPIO(73)
+#define DB8500_PIN_J3          _GPIO(74)
+#define DB8500_PIN_H2          _GPIO(75)
+#define DB8500_PIN_J2          _GPIO(76)
+#define DB8500_PIN_H1          _GPIO(77)
+#define DB8500_PIN_F4          _GPIO(78)
+#define DB8500_PIN_E3          _GPIO(79)
+#define DB8500_PIN_E4          _GPIO(80)
+#define DB8500_PIN_D2          _GPIO(81)
+#define DB8500_PIN_C1          _GPIO(82)
+#define DB8500_PIN_D3          _GPIO(83)
+#define DB8500_PIN_C2          _GPIO(84)
+#define DB8500_PIN_D5          _GPIO(85)
+#define DB8500_PIN_C6          _GPIO(86)
+#define DB8500_PIN_B3          _GPIO(87)
+#define DB8500_PIN_C4          _GPIO(88)
+#define DB8500_PIN_E6          _GPIO(89)
+#define DB8500_PIN_A3          _GPIO(90)
+#define DB8500_PIN_B6          _GPIO(91)
+#define DB8500_PIN_D6          _GPIO(92)
+#define DB8500_PIN_B7          _GPIO(93)
+#define DB8500_PIN_D7          _GPIO(94)
+#define DB8500_PIN_E8          _GPIO(95)
+#define DB8500_PIN_D8          _GPIO(96)
+#define DB8500_PIN_D9          _GPIO(97)
+/* Hole */
+#define DB8500_PIN_A5          _GPIO(128)
+#define DB8500_PIN_B4          _GPIO(129)
+#define DB8500_PIN_C8          _GPIO(130)
+#define DB8500_PIN_A12         _GPIO(131)
+#define DB8500_PIN_C10         _GPIO(132)
+#define DB8500_PIN_B10         _GPIO(133)
+#define DB8500_PIN_B9          _GPIO(134)
+#define DB8500_PIN_A9          _GPIO(135)
+#define DB8500_PIN_C7          _GPIO(136)
+#define DB8500_PIN_A7          _GPIO(137)
+#define DB8500_PIN_C5          _GPIO(138)
+#define DB8500_PIN_C9          _GPIO(139)
+#define DB8500_PIN_B11         _GPIO(140)
+#define DB8500_PIN_C12         _GPIO(141)
+#define DB8500_PIN_C11         _GPIO(142)
+#define DB8500_PIN_D12         _GPIO(143)
+#define DB8500_PIN_B13         _GPIO(144)
+#define DB8500_PIN_C13         _GPIO(145)
+#define DB8500_PIN_D13         _GPIO(146)
+#define DB8500_PIN_C15         _GPIO(147)
+#define DB8500_PIN_B16         _GPIO(148)
+#define DB8500_PIN_B14         _GPIO(149)
+#define DB8500_PIN_C14         _GPIO(150)
+#define DB8500_PIN_D17         _GPIO(151)
+#define DB8500_PIN_D16         _GPIO(152)
+#define DB8500_PIN_B17         _GPIO(153)
+#define DB8500_PIN_C16         _GPIO(154)
+#define DB8500_PIN_C19         _GPIO(155)
+#define DB8500_PIN_C17         _GPIO(156)
+#define DB8500_PIN_A18         _GPIO(157)
+#define DB8500_PIN_C18         _GPIO(158)
+#define DB8500_PIN_B19         _GPIO(159)
+#define DB8500_PIN_B20         _GPIO(160)
+#define DB8500_PIN_D21         _GPIO(161)
+#define DB8500_PIN_D20         _GPIO(162)
+#define DB8500_PIN_C20         _GPIO(163)
+#define DB8500_PIN_B21         _GPIO(164)
+#define DB8500_PIN_C21         _GPIO(165)
+#define DB8500_PIN_A22         _GPIO(166)
+#define DB8500_PIN_B24         _GPIO(167)
+#define DB8500_PIN_C22         _GPIO(168)
+#define DB8500_PIN_D22         _GPIO(169)
+#define DB8500_PIN_C23         _GPIO(170)
+#define DB8500_PIN_D23         _GPIO(171)
+/* Hole */
+#define DB8500_PIN_AJ27                _GPIO(192)
+#define DB8500_PIN_AH27                _GPIO(193)
+#define DB8500_PIN_AF27                _GPIO(194)
+#define DB8500_PIN_AG28                _GPIO(195)
+#define DB8500_PIN_AG26                _GPIO(196)
+#define DB8500_PIN_AH24                _GPIO(197)
+#define DB8500_PIN_AG25                _GPIO(198)
+#define DB8500_PIN_AH23                _GPIO(199)
+#define DB8500_PIN_AH26                _GPIO(200)
+#define DB8500_PIN_AF24                _GPIO(201)
+#define DB8500_PIN_AF25                _GPIO(202)
+#define DB8500_PIN_AE23                _GPIO(203)
+#define DB8500_PIN_AF23                _GPIO(204)
+#define DB8500_PIN_AG23                _GPIO(205)
+#define DB8500_PIN_AG24                _GPIO(206)
+#define DB8500_PIN_AJ23                _GPIO(207)
+#define DB8500_PIN_AH16                _GPIO(208)
+#define DB8500_PIN_AG15                _GPIO(209)
+#define DB8500_PIN_AJ15                _GPIO(210)
+#define DB8500_PIN_AG14                _GPIO(211)
+#define DB8500_PIN_AF13                _GPIO(212)
+#define DB8500_PIN_AG13                _GPIO(213)
+#define DB8500_PIN_AH15                _GPIO(214)
+#define DB8500_PIN_AH13                _GPIO(215)
+#define DB8500_PIN_AG12                _GPIO(216)
+#define DB8500_PIN_AH12                _GPIO(217)
+#define DB8500_PIN_AH11                _GPIO(218)
+#define DB8500_PIN_AG10                _GPIO(219)
+#define DB8500_PIN_AH10                _GPIO(220)
+#define DB8500_PIN_AJ11                _GPIO(221)
+#define DB8500_PIN_AJ9         _GPIO(222)
+#define DB8500_PIN_AH9         _GPIO(223)
+#define DB8500_PIN_AG9         _GPIO(224)
+#define DB8500_PIN_AG8         _GPIO(225)
+#define DB8500_PIN_AF8         _GPIO(226)
+#define DB8500_PIN_AH7         _GPIO(227)
+#define DB8500_PIN_AJ6         _GPIO(228)
+#define DB8500_PIN_AG7         _GPIO(229)
+#define DB8500_PIN_AF7         _GPIO(230)
+/* Hole */
+#define DB8500_PIN_AF28                _GPIO(256)
+#define DB8500_PIN_AE29                _GPIO(257)
+#define DB8500_PIN_AD29                _GPIO(258)
+#define DB8500_PIN_AC29                _GPIO(259)
+#define DB8500_PIN_AD28                _GPIO(260)
+#define DB8500_PIN_AD26                _GPIO(261)
+#define DB8500_PIN_AE26                _GPIO(262)
+#define DB8500_PIN_AG29                _GPIO(263)
+#define DB8500_PIN_AE27                _GPIO(264)
+#define DB8500_PIN_AD27                _GPIO(265)
+#define DB8500_PIN_AC28                _GPIO(266)
+#define DB8500_PIN_AC27                _GPIO(267)
+
+/*
+ * The names of the pins are denoted by GPIO number and ball name, even
+ * though they can be used for other things than GPIO, this is the first
+ * column in the table of the data sheet and often used on schematics and
+ * such.
+ */
+static const struct pinctrl_pin_desc nmk_db8500_pins[] = {
+       PINCTRL_PIN(DB8500_PIN_AJ5, "GPIO0_AJ5"),
+       PINCTRL_PIN(DB8500_PIN_AJ3, "GPIO1_AJ3"),
+       PINCTRL_PIN(DB8500_PIN_AH4, "GPIO2_AH4"),
+       PINCTRL_PIN(DB8500_PIN_AH3, "GPIO3_AH3"),
+       PINCTRL_PIN(DB8500_PIN_AH6, "GPIO4_AH6"),
+       PINCTRL_PIN(DB8500_PIN_AG6, "GPIO5_AG6"),
+       PINCTRL_PIN(DB8500_PIN_AF6, "GPIO6_AF6"),
+       PINCTRL_PIN(DB8500_PIN_AG5, "GPIO7_AG5"),
+       PINCTRL_PIN(DB8500_PIN_AD5, "GPIO8_AD5"),
+       PINCTRL_PIN(DB8500_PIN_AE4, "GPIO9_AE4"),
+       PINCTRL_PIN(DB8500_PIN_AF5, "GPIO10_AF5"),
+       PINCTRL_PIN(DB8500_PIN_AG4, "GPIO11_AG4"),
+       PINCTRL_PIN(DB8500_PIN_AC4, "GPIO12_AC4"),
+       PINCTRL_PIN(DB8500_PIN_AF3, "GPIO13_AF3"),
+       PINCTRL_PIN(DB8500_PIN_AE3, "GPIO14_AE3"),
+       PINCTRL_PIN(DB8500_PIN_AC3, "GPIO15_AC3"),
+       PINCTRL_PIN(DB8500_PIN_AD3, "GPIO16_AD3"),
+       PINCTRL_PIN(DB8500_PIN_AD4, "GPIO17_AD4"),
+       PINCTRL_PIN(DB8500_PIN_AC2, "GPIO18_AC2"),
+       PINCTRL_PIN(DB8500_PIN_AC1, "GPIO19_AC1"),
+       PINCTRL_PIN(DB8500_PIN_AB4, "GPIO20_AB4"),
+       PINCTRL_PIN(DB8500_PIN_AB3, "GPIO21_AB3"),
+       PINCTRL_PIN(DB8500_PIN_AA3, "GPIO22_AA3"),
+       PINCTRL_PIN(DB8500_PIN_AA4, "GPIO23_AA4"),
+       PINCTRL_PIN(DB8500_PIN_AB2, "GPIO24_AB2"),
+       PINCTRL_PIN(DB8500_PIN_Y4, "GPIO25_Y4"),
+       PINCTRL_PIN(DB8500_PIN_Y2, "GPIO26_Y2"),
+       PINCTRL_PIN(DB8500_PIN_AA2, "GPIO27_AA2"),
+       PINCTRL_PIN(DB8500_PIN_AA1, "GPIO28_AA1"),
+       PINCTRL_PIN(DB8500_PIN_W2, "GPIO29_W2"),
+       PINCTRL_PIN(DB8500_PIN_W3, "GPIO30_W3"),
+       PINCTRL_PIN(DB8500_PIN_V3, "GPIO31_V3"),
+       PINCTRL_PIN(DB8500_PIN_V2, "GPIO32_V2"),
+       PINCTRL_PIN(DB8500_PIN_AF2, "GPIO33_AF2"),
+       PINCTRL_PIN(DB8500_PIN_AE1, "GPIO34_AE1"),
+       PINCTRL_PIN(DB8500_PIN_AE2, "GPIO35_AE2"),
+       PINCTRL_PIN(DB8500_PIN_AG2, "GPIO36_AG2"),
+       /* Hole */
+       PINCTRL_PIN(DB8500_PIN_F3, "GPIO64_F3"),
+       PINCTRL_PIN(DB8500_PIN_F1, "GPIO65_F1"),
+       PINCTRL_PIN(DB8500_PIN_G3, "GPIO66_G3"),
+       PINCTRL_PIN(DB8500_PIN_G2, "GPIO67_G2"),
+       PINCTRL_PIN(DB8500_PIN_E1, "GPIO68_E1"),
+       PINCTRL_PIN(DB8500_PIN_E2, "GPIO69_E2"),
+       PINCTRL_PIN(DB8500_PIN_G5, "GPIO70_G5"),
+       PINCTRL_PIN(DB8500_PIN_G4, "GPIO71_G4"),
+       PINCTRL_PIN(DB8500_PIN_H4, "GPIO72_H4"),
+       PINCTRL_PIN(DB8500_PIN_H3, "GPIO73_H3"),
+       PINCTRL_PIN(DB8500_PIN_J3, "GPIO74_J3"),
+       PINCTRL_PIN(DB8500_PIN_H2, "GPIO75_H2"),
+       PINCTRL_PIN(DB8500_PIN_J2, "GPIO76_J2"),
+       PINCTRL_PIN(DB8500_PIN_H1, "GPIO77_H1"),
+       PINCTRL_PIN(DB8500_PIN_F4, "GPIO78_F4"),
+       PINCTRL_PIN(DB8500_PIN_E3, "GPIO79_E3"),
+       PINCTRL_PIN(DB8500_PIN_E4, "GPIO80_E4"),
+       PINCTRL_PIN(DB8500_PIN_D2, "GPIO81_D2"),
+       PINCTRL_PIN(DB8500_PIN_C1, "GPIO82_C1"),
+       PINCTRL_PIN(DB8500_PIN_D3, "GPIO83_D3"),
+       PINCTRL_PIN(DB8500_PIN_C2, "GPIO84_C2"),
+       PINCTRL_PIN(DB8500_PIN_D5, "GPIO85_D5"),
+       PINCTRL_PIN(DB8500_PIN_C6, "GPIO86_C6"),
+       PINCTRL_PIN(DB8500_PIN_B3, "GPIO87_B3"),
+       PINCTRL_PIN(DB8500_PIN_C4, "GPIO88_C4"),
+       PINCTRL_PIN(DB8500_PIN_E6, "GPIO89_E6"),
+       PINCTRL_PIN(DB8500_PIN_A3, "GPIO90_A3"),
+       PINCTRL_PIN(DB8500_PIN_B6, "GPIO91_B6"),
+       PINCTRL_PIN(DB8500_PIN_D6, "GPIO92_D6"),
+       PINCTRL_PIN(DB8500_PIN_B7, "GPIO93_B7"),
+       PINCTRL_PIN(DB8500_PIN_D7, "GPIO94_D7"),
+       PINCTRL_PIN(DB8500_PIN_E8, "GPIO95_E8"),
+       PINCTRL_PIN(DB8500_PIN_D8, "GPIO96_D8"),
+       PINCTRL_PIN(DB8500_PIN_D9, "GPIO97_D9"),
+       /* Hole */
+       PINCTRL_PIN(DB8500_PIN_A5, "GPIO128_A5"),
+       PINCTRL_PIN(DB8500_PIN_B4, "GPIO129_B4"),
+       PINCTRL_PIN(DB8500_PIN_C8, "GPIO130_C8"),
+       PINCTRL_PIN(DB8500_PIN_A12, "GPIO131_A12"),
+       PINCTRL_PIN(DB8500_PIN_C10, "GPIO132_C10"),
+       PINCTRL_PIN(DB8500_PIN_B10, "GPIO133_B10"),
+       PINCTRL_PIN(DB8500_PIN_B9, "GPIO134_B9"),
+       PINCTRL_PIN(DB8500_PIN_A9, "GPIO135_A9"),
+       PINCTRL_PIN(DB8500_PIN_C7, "GPIO136_C7"),
+       PINCTRL_PIN(DB8500_PIN_A7, "GPIO137_A7"),
+       PINCTRL_PIN(DB8500_PIN_C5, "GPIO138_C5"),
+       PINCTRL_PIN(DB8500_PIN_C9, "GPIO139_C9"),
+       PINCTRL_PIN(DB8500_PIN_B11, "GPIO140_B11"),
+       PINCTRL_PIN(DB8500_PIN_C12, "GPIO141_C12"),
+       PINCTRL_PIN(DB8500_PIN_C11, "GPIO142_C11"),
+       PINCTRL_PIN(DB8500_PIN_D12, "GPIO143_D12"),
+       PINCTRL_PIN(DB8500_PIN_B13, "GPIO144_B13"),
+       PINCTRL_PIN(DB8500_PIN_C13, "GPIO145_C13"),
+       PINCTRL_PIN(DB8500_PIN_D13, "GPIO146_D13"),
+       PINCTRL_PIN(DB8500_PIN_C15, "GPIO147_C15"),
+       PINCTRL_PIN(DB8500_PIN_B16, "GPIO148_B16"),
+       PINCTRL_PIN(DB8500_PIN_B14, "GPIO149_B14"),
+       PINCTRL_PIN(DB8500_PIN_C14, "GPIO150_C14"),
+       PINCTRL_PIN(DB8500_PIN_D17, "GPIO151_D17"),
+       PINCTRL_PIN(DB8500_PIN_D16, "GPIO152_D16"),
+       PINCTRL_PIN(DB8500_PIN_B17, "GPIO153_B17"),
+       PINCTRL_PIN(DB8500_PIN_C16, "GPIO154_C16"),
+       PINCTRL_PIN(DB8500_PIN_C19, "GPIO155_C19"),
+       PINCTRL_PIN(DB8500_PIN_C17, "GPIO156_C17"),
+       PINCTRL_PIN(DB8500_PIN_A18, "GPIO157_A18"),
+       PINCTRL_PIN(DB8500_PIN_C18, "GPIO158_C18"),
+       PINCTRL_PIN(DB8500_PIN_B19, "GPIO159_B19"),
+       PINCTRL_PIN(DB8500_PIN_B20, "GPIO160_B20"),
+       PINCTRL_PIN(DB8500_PIN_D21, "GPIO161_D21"),
+       PINCTRL_PIN(DB8500_PIN_D20, "GPIO162_D20"),
+       PINCTRL_PIN(DB8500_PIN_C20, "GPIO163_C20"),
+       PINCTRL_PIN(DB8500_PIN_B21, "GPIO164_B21"),
+       PINCTRL_PIN(DB8500_PIN_C21, "GPIO165_C21"),
+       PINCTRL_PIN(DB8500_PIN_A22, "GPIO166_A22"),
+       PINCTRL_PIN(DB8500_PIN_B24, "GPIO167_B24"),
+       PINCTRL_PIN(DB8500_PIN_C22, "GPIO168_C22"),
+       PINCTRL_PIN(DB8500_PIN_D22, "GPIO169_D22"),
+       PINCTRL_PIN(DB8500_PIN_C23, "GPIO170_C23"),
+       PINCTRL_PIN(DB8500_PIN_D23, "GPIO171_D23"),
+       /* Hole */
+       PINCTRL_PIN(DB8500_PIN_AJ27, "GPIO192_AJ27"),
+       PINCTRL_PIN(DB8500_PIN_AH27, "GPIO193_AH27"),
+       PINCTRL_PIN(DB8500_PIN_AF27, "GPIO194_AF27"),
+       PINCTRL_PIN(DB8500_PIN_AG28, "GPIO195_AG28"),
+       PINCTRL_PIN(DB8500_PIN_AG26, "GPIO196_AG26"),
+       PINCTRL_PIN(DB8500_PIN_AH24, "GPIO197_AH24"),
+       PINCTRL_PIN(DB8500_PIN_AG25, "GPIO198_AG25"),
+       PINCTRL_PIN(DB8500_PIN_AH23, "GPIO199_AH23"),
+       PINCTRL_PIN(DB8500_PIN_AH26, "GPIO200_AH26"),
+       PINCTRL_PIN(DB8500_PIN_AF24, "GPIO201_AF24"),
+       PINCTRL_PIN(DB8500_PIN_AF25, "GPIO202_AF25"),
+       PINCTRL_PIN(DB8500_PIN_AE23, "GPIO203_AE23"),
+       PINCTRL_PIN(DB8500_PIN_AF23, "GPIO204_AF23"),
+       PINCTRL_PIN(DB8500_PIN_AG23, "GPIO205_AG23"),
+       PINCTRL_PIN(DB8500_PIN_AG24, "GPIO206_AG24"),
+       PINCTRL_PIN(DB8500_PIN_AJ23, "GPIO207_AJ23"),
+       PINCTRL_PIN(DB8500_PIN_AH16, "GPIO208_AH16"),
+       PINCTRL_PIN(DB8500_PIN_AG15, "GPIO209_AG15"),
+       PINCTRL_PIN(DB8500_PIN_AJ15, "GPIO210_AJ15"),
+       PINCTRL_PIN(DB8500_PIN_AG14, "GPIO211_AG14"),
+       PINCTRL_PIN(DB8500_PIN_AF13, "GPIO212_AF13"),
+       PINCTRL_PIN(DB8500_PIN_AG13, "GPIO213_AG13"),
+       PINCTRL_PIN(DB8500_PIN_AH15, "GPIO214_AH15"),
+       PINCTRL_PIN(DB8500_PIN_AH13, "GPIO215_AH13"),
+       PINCTRL_PIN(DB8500_PIN_AG12, "GPIO216_AG12"),
+       PINCTRL_PIN(DB8500_PIN_AH12, "GPIO217_AH12"),
+       PINCTRL_PIN(DB8500_PIN_AH11, "GPIO218_AH11"),
+       PINCTRL_PIN(DB8500_PIN_AG10, "GPIO219_AG10"),
+       PINCTRL_PIN(DB8500_PIN_AH10, "GPIO220_AH10"),
+       PINCTRL_PIN(DB8500_PIN_AJ11, "GPIO221_AJ11"),
+       PINCTRL_PIN(DB8500_PIN_AJ9, "GPIO222_AJ9"),
+       PINCTRL_PIN(DB8500_PIN_AH9, "GPIO223_AH9"),
+       PINCTRL_PIN(DB8500_PIN_AG9, "GPIO224_AG9"),
+       PINCTRL_PIN(DB8500_PIN_AG8, "GPIO225_AG8"),
+       PINCTRL_PIN(DB8500_PIN_AF8, "GPIO226_AF8"),
+       PINCTRL_PIN(DB8500_PIN_AH7, "GPIO227_AH7"),
+       PINCTRL_PIN(DB8500_PIN_AJ6, "GPIO228_AJ6"),
+       PINCTRL_PIN(DB8500_PIN_AG7, "GPIO229_AG7"),
+       PINCTRL_PIN(DB8500_PIN_AF7, "GPIO230_AF7"),
+       /* Hole */
+       PINCTRL_PIN(DB8500_PIN_AF28, "GPIO256_AF28"),
+       PINCTRL_PIN(DB8500_PIN_AE29, "GPIO257_AE29"),
+       PINCTRL_PIN(DB8500_PIN_AD29, "GPIO258_AD29"),
+       PINCTRL_PIN(DB8500_PIN_AC29, "GPIO259_AC29"),
+       PINCTRL_PIN(DB8500_PIN_AD28, "GPIO260_AD28"),
+       PINCTRL_PIN(DB8500_PIN_AD26, "GPIO261_AD26"),
+       PINCTRL_PIN(DB8500_PIN_AE26, "GPIO262_AE26"),
+       PINCTRL_PIN(DB8500_PIN_AG29, "GPIO263_AG29"),
+       PINCTRL_PIN(DB8500_PIN_AE27, "GPIO264_AE27"),
+       PINCTRL_PIN(DB8500_PIN_AD27, "GPIO265_AD27"),
+       PINCTRL_PIN(DB8500_PIN_AC28, "GPIO266_AC28"),
+       PINCTRL_PIN(DB8500_PIN_AC27, "GPIO267_AC27"),
+};
+
+#define DB8500_GPIO_RANGE(a, b, c) { .name = "DB8500", .id = a, .base = b, \
+                       .pin_base = b, .npins = c }
+
+/*
+ * This matches the 32-pin gpio chips registered by the GPIO portion. This
+ * cannot be const since we assign the struct gpio_chip * pointer at runtime.
+ */
+static struct pinctrl_gpio_range nmk_db8500_ranges[] = {
+       DB8500_GPIO_RANGE(0, 0, 32),
+       DB8500_GPIO_RANGE(1, 32, 5),
+       DB8500_GPIO_RANGE(2, 64, 32),
+       DB8500_GPIO_RANGE(3, 96, 2),
+       DB8500_GPIO_RANGE(4, 128, 32),
+       DB8500_GPIO_RANGE(5, 160, 12),
+       DB8500_GPIO_RANGE(6, 192, 32),
+       DB8500_GPIO_RANGE(7, 224, 7),
+       DB8500_GPIO_RANGE(8, 256, 12),
+};
+
+/*
+ * Read the pin group names like this:
+ * u0_a_1    = first groups of pins for uart0 on alt function a
+ * i2c2_b_2  = second group of pins for i2c2 on alt function b
+ *
+ * The groups are arranged as sets per altfunction column, so we can
+ * mux in one group at a time by selecting the same altfunction for them
+ * all. When functions require pins on different altfunctions, you need
+ * to combine several groups.
+ */
+
+/* Altfunction A column */
+static const unsigned u0_a_1_pins[] = { DB8500_PIN_AJ5, DB8500_PIN_AJ3,
+                                       DB8500_PIN_AH4, DB8500_PIN_AH3 };
+static const unsigned u1rxtx_a_1_pins[] = { DB8500_PIN_AH6, DB8500_PIN_AG6 };
+static const unsigned u1ctsrts_a_1_pins[] = { DB8500_PIN_AF6, DB8500_PIN_AG5 };
+/* Image processor I2C line, this is driven by image processor firmware */
+static const unsigned ipi2c_a_1_pins[] = { DB8500_PIN_AD5, DB8500_PIN_AE4 };
+static const unsigned ipi2c_a_2_pins[] = { DB8500_PIN_AF5, DB8500_PIN_AG4 };
+/* MSP0 can only be on these pins, but TXD and RXD can be flipped */
+static const unsigned msp0txrx_a_1_pins[] = { DB8500_PIN_AC4, DB8500_PIN_AC3 };
+static const unsigned msp0tfstck_a_1_pins[] = { DB8500_PIN_AF3, DB8500_PIN_AE3 };
+static const unsigned msp0rfsrck_a_1_pins[] = { DB8500_PIN_AD3, DB8500_PIN_AD4 };
+/* Basic pins of the MMC/SD card 0 interface */
+static const unsigned mc0_a_1_pins[] = { DB8500_PIN_AC2, DB8500_PIN_AC1,
+       DB8500_PIN_AB4, DB8500_PIN_AA3, DB8500_PIN_AA4, DB8500_PIN_AB2,
+       DB8500_PIN_Y4, DB8500_PIN_Y2, DB8500_PIN_AA2, DB8500_PIN_AA1 };
+/* Often only 4 bits are used, then these are not needed (only used for MMC) */
+static const unsigned mc0_dat47_a_1_pins[] = { DB8500_PIN_W2, DB8500_PIN_W3,
+       DB8500_PIN_V3, DB8500_PIN_V2};
+static const unsigned mc0dat31dir_a_1_pins[] = { DB8500_PIN_AB3 };
+/* MSP1 can only be on these pins, but TXD and RXD can be flipped */
+static const unsigned msp1txrx_a_1_pins[] = { DB8500_PIN_AF2, DB8500_PIN_AG2 };
+static const unsigned msp1_a_1_pins[] = { DB8500_PIN_AE1, DB8500_PIN_AE2 };
+/* LCD interface */
+static const unsigned lcdb_a_1_pins[] = { DB8500_PIN_F3, DB8500_PIN_F1,
+                                         DB8500_PIN_G3, DB8500_PIN_G2 };
+static const unsigned lcdvsi0_a_1_pins[] = { DB8500_PIN_E1 };
+static const unsigned lcdvsi1_a_1_pins[] = { DB8500_PIN_E2 };
+static const unsigned lcd_d0_d7_a_1_pins[] = {
+       DB8500_PIN_G5, DB8500_PIN_G4, DB8500_PIN_H4, DB8500_PIN_H3,
+       DB8500_PIN_J3, DB8500_PIN_H2, DB8500_PIN_J2, DB8500_PIN_H1 };
+/* D8 thru D11 often used as TVOUT lines */
+static const unsigned lcd_d8_d11_a_1_pins[] = { DB8500_PIN_F4,
+       DB8500_PIN_E3, DB8500_PIN_E4, DB8500_PIN_D2 };
+static const unsigned lcd_d12_d23_a_1_pins[] = {
+       DB8500_PIN_C1, DB8500_PIN_D3, DB8500_PIN_C2, DB8500_PIN_D5,
+       DB8500_PIN_C6, DB8500_PIN_B3, DB8500_PIN_C4, DB8500_PIN_E6,
+       DB8500_PIN_A3, DB8500_PIN_B6, DB8500_PIN_D6, DB8500_PIN_B7 };
+static const unsigned kp_a_1_pins[] = { DB8500_PIN_D7, DB8500_PIN_E8,
+       DB8500_PIN_D8, DB8500_PIN_D9 };
+static const unsigned kpskaskb_a_1_pins[] = { DB8500_PIN_D17, DB8500_PIN_D16 };
+static const unsigned kp_a_2_pins[] = {
+       DB8500_PIN_B17, DB8500_PIN_C16, DB8500_PIN_C19, DB8500_PIN_C17,
+       DB8500_PIN_A18, DB8500_PIN_C18, DB8500_PIN_B19, DB8500_PIN_B20,
+       DB8500_PIN_D21, DB8500_PIN_D20, DB8500_PIN_C20, DB8500_PIN_B21,
+       DB8500_PIN_C21, DB8500_PIN_A22, DB8500_PIN_B24, DB8500_PIN_C22 };
+/* MC2 has 8 data lines and no direction control, so only for (e)MMC */
+static const unsigned mc2_a_1_pins[] = { DB8500_PIN_A5, DB8500_PIN_B4,
+       DB8500_PIN_C8, DB8500_PIN_A12, DB8500_PIN_C10, DB8500_PIN_B10,
+       DB8500_PIN_B9, DB8500_PIN_A9, DB8500_PIN_C7, DB8500_PIN_A7,
+       DB8500_PIN_C5 };
+static const unsigned ssp1_a_1_pins[] = { DB8500_PIN_C9, DB8500_PIN_B11,
+                                         DB8500_PIN_C12, DB8500_PIN_C11 };
+static const unsigned ssp0_a_1_pins[] = { DB8500_PIN_D12, DB8500_PIN_B13,
+                                         DB8500_PIN_C13, DB8500_PIN_D13 };
+static const unsigned i2c0_a_1_pins[] = { DB8500_PIN_C15, DB8500_PIN_B16 };
+/*
+ * Image processor GPIO pins are named "ipgpio" and have their own
+ * numberspace
+ */
+static const unsigned ipgpio0_a_1_pins[] = { DB8500_PIN_B14 };
+static const unsigned ipgpio1_a_1_pins[] = { DB8500_PIN_C14 };
+/* Three modem pins named RF_PURn, MODEM_STATE and MODEM_PWREN */
+static const unsigned modem_a_1_pins[] = { DB8500_PIN_D22, DB8500_PIN_C23,
+                                          DB8500_PIN_D23 };
+/*
+ * This MSP cannot switch RX and TX, SCK in a separate group since this
+ * seems to be optional.
+ */
+static const unsigned msp2sck_a_1_pins[] = { DB8500_PIN_AJ27 };
+static const unsigned msp2_a_1_pins[] = { DB8500_PIN_AH27, DB8500_PIN_AF27,
+                                         DB8500_PIN_AG28, DB8500_PIN_AG26 };
+static const unsigned mc4_a_1_pins[] = { DB8500_PIN_AH24, DB8500_PIN_AG25,
+       DB8500_PIN_AH23, DB8500_PIN_AH26, DB8500_PIN_AF24, DB8500_PIN_AF25,
+       DB8500_PIN_AE23, DB8500_PIN_AF23, DB8500_PIN_AG23, DB8500_PIN_AG24,
+       DB8500_PIN_AJ23 };
+/* MC1 has only 4 data pins, designed for SD or SDIO exclusively */
+static const unsigned mc1_a_1_pins[] = { DB8500_PIN_AH16, DB8500_PIN_AG15,
+       DB8500_PIN_AJ15, DB8500_PIN_AG14, DB8500_PIN_AF13, DB8500_PIN_AG13,
+       DB8500_PIN_AH15 };
+static const unsigned mc1_a_2_pins[] = { DB8500_PIN_AH16, DB8500_PIN_AJ15,
+       DB8500_PIN_AG14, DB8500_PIN_AF13, DB8500_PIN_AG13, DB8500_PIN_AH15 };
+static const unsigned mc1dir_a_1_pins[] = { DB8500_PIN_AH13, DB8500_PIN_AG12,
+       DB8500_PIN_AH12, DB8500_PIN_AH11 };
+static const unsigned hsir_a_1_pins[] = { DB8500_PIN_AG10, DB8500_PIN_AH10,
+       DB8500_PIN_AJ11 };
+static const unsigned hsit_a_1_pins[] = { DB8500_PIN_AJ9, DB8500_PIN_AH9,
+       DB8500_PIN_AG9, DB8500_PIN_AG8, DB8500_PIN_AF8 };
+static const unsigned hsit_a_2_pins[] = { DB8500_PIN_AJ9, DB8500_PIN_AH9,
+       DB8500_PIN_AG9, DB8500_PIN_AG8 };
+static const unsigned clkout1_a_1_pins[] = { DB8500_PIN_AH7 };
+static const unsigned clkout1_a_2_pins[] = { DB8500_PIN_AG7 };
+static const unsigned clkout2_a_1_pins[] = { DB8500_PIN_AJ6 };
+static const unsigned clkout2_a_2_pins[] = { DB8500_PIN_AF7 };
+static const unsigned usb_a_1_pins[] = { DB8500_PIN_AF28, DB8500_PIN_AE29,
+       DB8500_PIN_AD29, DB8500_PIN_AC29, DB8500_PIN_AD28, DB8500_PIN_AD26,
+       DB8500_PIN_AE26, DB8500_PIN_AG29, DB8500_PIN_AE27, DB8500_PIN_AD27,
+       DB8500_PIN_AC28, DB8500_PIN_AC27 };
+
+/* Altfunction B column */
+static const unsigned trig_b_1_pins[] = { DB8500_PIN_AJ5, DB8500_PIN_AJ3 };
+static const unsigned i2c4_b_1_pins[] = { DB8500_PIN_AH6, DB8500_PIN_AG6 };
+static const unsigned i2c1_b_1_pins[] = { DB8500_PIN_AF6, DB8500_PIN_AG5 };
+static const unsigned i2c2_b_1_pins[] = { DB8500_PIN_AD5, DB8500_PIN_AE4 };
+static const unsigned i2c2_b_2_pins[] = { DB8500_PIN_AF5, DB8500_PIN_AG4 };
+static const unsigned msp0txrx_b_1_pins[] = { DB8500_PIN_AC4, DB8500_PIN_AC3 };
+static const unsigned i2c1_b_2_pins[] = { DB8500_PIN_AD3, DB8500_PIN_AD4 };
+/* Just RX and TX for UART2 */
+static const unsigned u2rxtx_b_1_pins[] = { DB8500_PIN_AC2, DB8500_PIN_AC1 };
+static const unsigned uartmodtx_b_1_pins[] = { DB8500_PIN_AB4 };
+static const unsigned msp0sck_b_1_pins[] = { DB8500_PIN_AB3 };
+static const unsigned uartmodrx_b_1_pins[] = { DB8500_PIN_AA3 };
+static const unsigned stmmod_b_1_pins[] = { DB8500_PIN_AA4, DB8500_PIN_Y4,
+       DB8500_PIN_Y2, DB8500_PIN_AA2, DB8500_PIN_AA1 };
+static const unsigned uartmodrx_b_2_pins[] = { DB8500_PIN_AB2 };
+static const unsigned spi3_b_1_pins[] = { DB8500_PIN_W2, DB8500_PIN_W3,
+                                         DB8500_PIN_V3, DB8500_PIN_V2 };
+static const unsigned msp1txrx_b_1_pins[] = { DB8500_PIN_AF2, DB8500_PIN_AG2 };
+static const unsigned kp_b_1_pins[] = { DB8500_PIN_F3, DB8500_PIN_F1,
+       DB8500_PIN_G3, DB8500_PIN_G2, DB8500_PIN_E1, DB8500_PIN_E2,
+       DB8500_PIN_G5, DB8500_PIN_G4, DB8500_PIN_H4, DB8500_PIN_H3,
+       DB8500_PIN_J3, DB8500_PIN_H2, DB8500_PIN_J2, DB8500_PIN_H1,
+       DB8500_PIN_F4, DB8500_PIN_E3, DB8500_PIN_E4, DB8500_PIN_D2,
+       DB8500_PIN_C1, DB8500_PIN_D3, DB8500_PIN_C2, DB8500_PIN_D5 };
+static const unsigned kp_b_2_pins[] = { DB8500_PIN_F3, DB8500_PIN_F1,
+       DB8500_PIN_G3, DB8500_PIN_G2, DB8500_PIN_F4, DB8500_PIN_E3};
+static const unsigned sm_b_1_pins[] = { DB8500_PIN_C6, DB8500_PIN_B3,
+       DB8500_PIN_C4, DB8500_PIN_E6, DB8500_PIN_A3, DB8500_PIN_B6,
+       DB8500_PIN_D6, DB8500_PIN_B7, DB8500_PIN_D7, DB8500_PIN_D8,
+       DB8500_PIN_D9, DB8500_PIN_A5, DB8500_PIN_B4, DB8500_PIN_C8,
+       DB8500_PIN_A12, DB8500_PIN_C10, DB8500_PIN_B10, DB8500_PIN_B9,
+       DB8500_PIN_A9, DB8500_PIN_C7, DB8500_PIN_A7, DB8500_PIN_C5,
+       DB8500_PIN_C9 };
+/* This chip select pin can be "ps0" in alt C so have it separately */
+static const unsigned smcs0_b_1_pins[] = { DB8500_PIN_E8 };
+/* This chip select pin can be "ps1" in alt C so have it separately */
+static const unsigned smcs1_b_1_pins[] = { DB8500_PIN_B14 };
+static const unsigned ipgpio7_b_1_pins[] = { DB8500_PIN_B11 };
+static const unsigned ipgpio2_b_1_pins[] = { DB8500_PIN_C12 };
+static const unsigned ipgpio3_b_1_pins[] = { DB8500_PIN_C11 };
+static const unsigned lcdaclk_b_1_pins[] = { DB8500_PIN_C14 };
+static const unsigned lcda_b_1_pins[] = { DB8500_PIN_D22,
+       DB8500_PIN_C23, DB8500_PIN_D23 };
+static const unsigned lcd_b_1_pins[] = { DB8500_PIN_D17, DB8500_PIN_D16,
+       DB8500_PIN_B17, DB8500_PIN_C16, DB8500_PIN_C19, DB8500_PIN_C17,
+       DB8500_PIN_A18, DB8500_PIN_C18, DB8500_PIN_B19, DB8500_PIN_B20,
+       DB8500_PIN_D21, DB8500_PIN_D20, DB8500_PIN_C20, DB8500_PIN_B21,
+       DB8500_PIN_C21, DB8500_PIN_A22, DB8500_PIN_B24, DB8500_PIN_C22 };
+static const unsigned ddrtrig_b_1_pins[] = { DB8500_PIN_AJ27 };
+static const unsigned pwl_b_1_pins[] = { DB8500_PIN_AF25 };
+static const unsigned spi1_b_1_pins[] = { DB8500_PIN_AG15, DB8500_PIN_AF13,
+                                         DB8500_PIN_AG13, DB8500_PIN_AH15 };
+static const unsigned mc3_b_1_pins[] = { DB8500_PIN_AH13, DB8500_PIN_AG12,
+       DB8500_PIN_AH12, DB8500_PIN_AH11, DB8500_PIN_AG10, DB8500_PIN_AH10,
+       DB8500_PIN_AJ11, DB8500_PIN_AJ9, DB8500_PIN_AH9, DB8500_PIN_AG9,
+       DB8500_PIN_AG8 };
+static const unsigned pwl_b_2_pins[] = { DB8500_PIN_AF8 };
+static const unsigned pwl_b_3_pins[] = { DB8500_PIN_AG7 };
+static const unsigned pwl_b_4_pins[] = { DB8500_PIN_AF7 };
+
+/* Altfunction C column */
+static const unsigned ipjtag_c_1_pins[] = { DB8500_PIN_AJ5, DB8500_PIN_AJ3,
+       DB8500_PIN_AH4, DB8500_PIN_AH3, DB8500_PIN_AH6 };
+static const unsigned ipgpio6_c_1_pins[] = { DB8500_PIN_AG6 };
+static const unsigned ipgpio0_c_1_pins[] = { DB8500_PIN_AF6 };
+static const unsigned ipgpio1_c_1_pins[] = { DB8500_PIN_AG5 };
+static const unsigned ipgpio3_c_1_pins[] = { DB8500_PIN_AF5 };
+static const unsigned ipgpio2_c_1_pins[] = { DB8500_PIN_AG4 };
+static const unsigned slim0_c_1_pins[] = { DB8500_PIN_AD3, DB8500_PIN_AD4 };
+/* Optional 4-bit Memory Stick interface */
+static const unsigned ms_c_1_pins[] = { DB8500_PIN_AC2, DB8500_PIN_AC1,
+       DB8500_PIN_AB3, DB8500_PIN_AA3, DB8500_PIN_AA4, DB8500_PIN_AB2,
+       DB8500_PIN_Y4, DB8500_PIN_Y2, DB8500_PIN_AA2, DB8500_PIN_AA1 };
+static const unsigned iptrigout_c_1_pins[] = { DB8500_PIN_AB4 };
+static const unsigned u2rxtx_c_1_pins[] = { DB8500_PIN_W2, DB8500_PIN_W3 };
+static const unsigned u2ctsrts_c_1_pins[] = { DB8500_PIN_V3, DB8500_PIN_V2 };
+static const unsigned u0_c_1_pins[] = { DB8500_PIN_AF2, DB8500_PIN_AE1,
+                                       DB8500_PIN_AE2, DB8500_PIN_AG2 };
+static const unsigned ipgpio4_c_1_pins[] = { DB8500_PIN_F3 };
+static const unsigned ipgpio5_c_1_pins[] = { DB8500_PIN_F1 };
+static const unsigned ipgpio6_c_2_pins[] = { DB8500_PIN_G3 };
+static const unsigned ipgpio7_c_1_pins[] = { DB8500_PIN_G2 };
+static const unsigned smcleale_c_1_pins[] = { DB8500_PIN_E1, DB8500_PIN_E2 };
+static const unsigned stmape_c_1_pins[] = { DB8500_PIN_G5, DB8500_PIN_G4,
+       DB8500_PIN_H4, DB8500_PIN_H3, DB8500_PIN_J3 };
+static const unsigned u2rxtx_c_2_pins[] = { DB8500_PIN_H2, DB8500_PIN_J2 };
+static const unsigned ipgpio2_c_2_pins[] = { DB8500_PIN_F4 };
+static const unsigned ipgpio3_c_2_pins[] = { DB8500_PIN_E3 };
+static const unsigned ipgpio4_c_2_pins[] = { DB8500_PIN_E4 };
+static const unsigned ipgpio5_c_2_pins[] = { DB8500_PIN_D2 };
+static const unsigned mc5_c_1_pins[] = { DB8500_PIN_C6, DB8500_PIN_B3,
+       DB8500_PIN_C4, DB8500_PIN_E6, DB8500_PIN_A3, DB8500_PIN_B6,
+       DB8500_PIN_D6, DB8500_PIN_B7, DB8500_PIN_D7, DB8500_PIN_D8,
+       DB8500_PIN_D9 };
+static const unsigned mc2rstn_c_1_pins[] = { DB8500_PIN_C8 };
+static const unsigned kp_c_1_pins[] = { DB8500_PIN_C9, DB8500_PIN_B11,
+       DB8500_PIN_C12, DB8500_PIN_C11, DB8500_PIN_D17, DB8500_PIN_D16,
+       DB8500_PIN_C23, DB8500_PIN_D23 };
+static const unsigned smps0_c_1_pins[] = { DB8500_PIN_E8 };
+static const unsigned smps1_c_1_pins[] = { DB8500_PIN_B14 };
+static const unsigned u2rxtx_c_3_pins[] = { DB8500_PIN_B17, DB8500_PIN_C16 };
+static const unsigned stmape_c_2_pins[] = { DB8500_PIN_C19, DB8500_PIN_C17,
+       DB8500_PIN_A18, DB8500_PIN_C18, DB8500_PIN_B19 };
+static const unsigned uartmodrx_c_1_pins[] = { DB8500_PIN_D21 };
+static const unsigned uartmodtx_c_1_pins[] = { DB8500_PIN_D20 };
+static const unsigned stmmod_c_1_pins[] = { DB8500_PIN_C20, DB8500_PIN_B21,
+       DB8500_PIN_C21, DB8500_PIN_A22, DB8500_PIN_B24 };
+static const unsigned usbsim_c_1_pins[] = { DB8500_PIN_D22 };
+static const unsigned mc4rstn_c_1_pins[] = { DB8500_PIN_AF25 };
+static const unsigned clkout1_c_1_pins[] = { DB8500_PIN_AH13 };
+static const unsigned clkout2_c_1_pins[] = { DB8500_PIN_AH12 };
+static const unsigned i2c3_c_1_pins[] = { DB8500_PIN_AG12, DB8500_PIN_AH11 };
+static const unsigned spi0_c_1_pins[] = { DB8500_PIN_AH10, DB8500_PIN_AH9,
+                                         DB8500_PIN_AG9, DB8500_PIN_AG8 };
+static const unsigned usbsim_c_2_pins[] = { DB8500_PIN_AF8 };
+static const unsigned i2c3_c_2_pins[] = { DB8500_PIN_AG7, DB8500_PIN_AF7 };
+
+/* Other C1 column */
+static const unsigned u2rx_oc1_1_pins[] = { DB8500_PIN_AB2 };
+static const unsigned stmape_oc1_1_pins[] = { DB8500_PIN_AA4, DB8500_PIN_Y4,
+       DB8500_PIN_Y2, DB8500_PIN_AA2, DB8500_PIN_AA1 };
+static const unsigned remap0_oc1_1_pins[] = { DB8500_PIN_E1 };
+static const unsigned remap1_oc1_1_pins[] = { DB8500_PIN_E2 };
+static const unsigned ptma9_oc1_1_pins[] = { DB8500_PIN_G5, DB8500_PIN_G4,
+       DB8500_PIN_H4, DB8500_PIN_H3, DB8500_PIN_J3, DB8500_PIN_H2,
+       DB8500_PIN_J2, DB8500_PIN_H1 };
+static const unsigned kp_oc1_1_pins[] = { DB8500_PIN_C6, DB8500_PIN_B3,
+       DB8500_PIN_C4, DB8500_PIN_E6, DB8500_PIN_A3, DB8500_PIN_B6,
+       DB8500_PIN_D6, DB8500_PIN_B7 };
+static const unsigned rf_oc1_1_pins[] = { DB8500_PIN_D8, DB8500_PIN_D9 };
+static const unsigned hxclk_oc1_1_pins[] = { DB8500_PIN_D16 };
+static const unsigned uartmodrx_oc1_1_pins[] = { DB8500_PIN_B17 };
+static const unsigned uartmodtx_oc1_1_pins[] = { DB8500_PIN_C16 };
+static const unsigned stmmod_oc1_1_pins[] = { DB8500_PIN_C19, DB8500_PIN_C17,
+       DB8500_PIN_A18, DB8500_PIN_C18, DB8500_PIN_B19 };
+static const unsigned hxgpio_oc1_1_pins[] = { DB8500_PIN_D21, DB8500_PIN_D20,
+       DB8500_PIN_C20, DB8500_PIN_B21, DB8500_PIN_C21, DB8500_PIN_A22,
+       DB8500_PIN_B24, DB8500_PIN_C22 };
+static const unsigned rf_oc1_2_pins[] = { DB8500_PIN_C23, DB8500_PIN_D23 };
+static const unsigned spi2_oc1_1_pins[] = { DB8500_PIN_AH13, DB8500_PIN_AG12,
+       DB8500_PIN_AH12, DB8500_PIN_AH11 };
+static const unsigned spi2_oc1_2_pins[] = { DB8500_PIN_AH13, DB8500_PIN_AH12,
+       DB8500_PIN_AH11 };
+
+/* Other C2 column */
+static const unsigned sbag_oc2_1_pins[] = { DB8500_PIN_AA4, DB8500_PIN_AB2,
+       DB8500_PIN_Y4, DB8500_PIN_Y2, DB8500_PIN_AA2, DB8500_PIN_AA1 };
+static const unsigned etmr4_oc2_1_pins[] = { DB8500_PIN_G5, DB8500_PIN_G4,
+       DB8500_PIN_H4, DB8500_PIN_H3, DB8500_PIN_J3, DB8500_PIN_H2,
+       DB8500_PIN_J2, DB8500_PIN_H1 };
+static const unsigned ptma9_oc2_1_pins[] = { DB8500_PIN_D17, DB8500_PIN_D16,
+       DB8500_PIN_B17, DB8500_PIN_C16, DB8500_PIN_C19, DB8500_PIN_C17,
+       DB8500_PIN_A18, DB8500_PIN_C18, DB8500_PIN_B19, DB8500_PIN_B20,
+       DB8500_PIN_D21, DB8500_PIN_D20, DB8500_PIN_C20, DB8500_PIN_B21,
+       DB8500_PIN_C21, DB8500_PIN_A22, DB8500_PIN_B24, DB8500_PIN_C22 };
+
+/* Other C3 column */
+static const unsigned stmmod_oc3_1_pins[] = { DB8500_PIN_AB2, DB8500_PIN_W2,
+       DB8500_PIN_W3, DB8500_PIN_V3, DB8500_PIN_V2 };
+static const unsigned stmmod_oc3_2_pins[] = { DB8500_PIN_G5, DB8500_PIN_G4,
+       DB8500_PIN_H4, DB8500_PIN_H3, DB8500_PIN_J3 };
+static const unsigned uartmodrx_oc3_1_pins[] = { DB8500_PIN_H2 };
+static const unsigned uartmodtx_oc3_1_pins[] = { DB8500_PIN_J2 };
+static const unsigned etmr4_oc3_1_pins[] = { DB8500_PIN_D17, DB8500_PIN_D16,
+       DB8500_PIN_B17, DB8500_PIN_C16, DB8500_PIN_C19, DB8500_PIN_C17,
+       DB8500_PIN_A18, DB8500_PIN_C18, DB8500_PIN_B19, DB8500_PIN_B20,
+       DB8500_PIN_D21, DB8500_PIN_D20, DB8500_PIN_C20, DB8500_PIN_B21,
+       DB8500_PIN_C21, DB8500_PIN_A22, DB8500_PIN_B24, DB8500_PIN_C22 };
+
+/* Other C4 column */
+static const unsigned sbag_oc4_1_pins[] = { DB8500_PIN_G5, DB8500_PIN_G4,
+       DB8500_PIN_H4, DB8500_PIN_H3, DB8500_PIN_J3, DB8500_PIN_H1 };
+static const unsigned hwobs_oc4_1_pins[] = { DB8500_PIN_D17, DB8500_PIN_D16,
+       DB8500_PIN_B17, DB8500_PIN_C16, DB8500_PIN_C19, DB8500_PIN_C17,
+       DB8500_PIN_A18, DB8500_PIN_C18, DB8500_PIN_B19, DB8500_PIN_B20,
+       DB8500_PIN_D21, DB8500_PIN_D20, DB8500_PIN_C20, DB8500_PIN_B21,
+       DB8500_PIN_C21, DB8500_PIN_A22, DB8500_PIN_B24, DB8500_PIN_C22 };
+
+#define DB8500_PIN_GROUP(a, b) { .name = #a, .pins = a##_pins,         \
+                       .npins = ARRAY_SIZE(a##_pins), .altsetting = b }
+
+static const struct nmk_pingroup nmk_db8500_groups[] = {
+       /* Altfunction A column */
+       DB8500_PIN_GROUP(u0_a_1, NMK_GPIO_ALT_A),
+       DB8500_PIN_GROUP(u1rxtx_a_1, NMK_GPIO_ALT_A),
+       DB8500_PIN_GROUP(u1ctsrts_a_1, NMK_GPIO_ALT_A),
+       DB8500_PIN_GROUP(ipi2c_a_1, NMK_GPIO_ALT_A),
+       DB8500_PIN_GROUP(ipi2c_a_2, NMK_GPIO_ALT_A),
+       DB8500_PIN_GROUP(msp0txrx_a_1, NMK_GPIO_ALT_A),
+       DB8500_PIN_GROUP(msp0tfstck_a_1, NMK_GPIO_ALT_A),
+       DB8500_PIN_GROUP(msp0rfsrck_a_1, NMK_GPIO_ALT_A),
+       DB8500_PIN_GROUP(mc0_a_1, NMK_GPIO_ALT_A),
+       DB8500_PIN_GROUP(mc0_dat47_a_1, NMK_GPIO_ALT_A),
+       DB8500_PIN_GROUP(mc0dat31dir_a_1, NMK_GPIO_ALT_A),
+       DB8500_PIN_GROUP(msp1txrx_a_1, NMK_GPIO_ALT_A),
+       DB8500_PIN_GROUP(msp1_a_1, NMK_GPIO_ALT_A),
+       DB8500_PIN_GROUP(lcdb_a_1, NMK_GPIO_ALT_A),
+       DB8500_PIN_GROUP(lcdvsi0_a_1, NMK_GPIO_ALT_A),
+       DB8500_PIN_GROUP(lcdvsi1_a_1, NMK_GPIO_ALT_A),
+       DB8500_PIN_GROUP(lcd_d0_d7_a_1, NMK_GPIO_ALT_A),
+       DB8500_PIN_GROUP(lcd_d8_d11_a_1, NMK_GPIO_ALT_A),
+       DB8500_PIN_GROUP(lcd_d12_d23_a_1, NMK_GPIO_ALT_A),
+       DB8500_PIN_GROUP(kp_a_1, NMK_GPIO_ALT_A),
+       DB8500_PIN_GROUP(mc2_a_1, NMK_GPIO_ALT_A),
+       DB8500_PIN_GROUP(ssp1_a_1, NMK_GPIO_ALT_A),
+       DB8500_PIN_GROUP(ssp0_a_1, NMK_GPIO_ALT_A),
+       DB8500_PIN_GROUP(i2c0_a_1, NMK_GPIO_ALT_A),
+       DB8500_PIN_GROUP(ipgpio0_a_1, NMK_GPIO_ALT_A),
+       DB8500_PIN_GROUP(ipgpio1_a_1, NMK_GPIO_ALT_A),
+       DB8500_PIN_GROUP(kp_a_2, NMK_GPIO_ALT_A),
+       DB8500_PIN_GROUP(msp2sck_a_1, NMK_GPIO_ALT_A),
+       DB8500_PIN_GROUP(msp2_a_1, NMK_GPIO_ALT_A),
+       DB8500_PIN_GROUP(mc4_a_1, NMK_GPIO_ALT_A),
+       DB8500_PIN_GROUP(mc1_a_1, NMK_GPIO_ALT_A),
+       DB8500_PIN_GROUP(mc1_a_2, NMK_GPIO_ALT_A),
+       DB8500_PIN_GROUP(hsir_a_1, NMK_GPIO_ALT_A),
+       DB8500_PIN_GROUP(hsit_a_1, NMK_GPIO_ALT_A),
+       DB8500_PIN_GROUP(hsit_a_2, NMK_GPIO_ALT_A),
+       DB8500_PIN_GROUP(clkout1_a_1, NMK_GPIO_ALT_A),
+       DB8500_PIN_GROUP(clkout1_a_2, NMK_GPIO_ALT_A),
+       DB8500_PIN_GROUP(clkout2_a_1, NMK_GPIO_ALT_A),
+       DB8500_PIN_GROUP(clkout2_a_2, NMK_GPIO_ALT_A),
+       DB8500_PIN_GROUP(usb_a_1, NMK_GPIO_ALT_A),
+       /* Altfunction B column */
+       DB8500_PIN_GROUP(trig_b_1, NMK_GPIO_ALT_B),
+       DB8500_PIN_GROUP(i2c4_b_1, NMK_GPIO_ALT_B),
+       DB8500_PIN_GROUP(i2c1_b_1, NMK_GPIO_ALT_B),
+       DB8500_PIN_GROUP(i2c2_b_1, NMK_GPIO_ALT_B),
+       DB8500_PIN_GROUP(i2c2_b_2, NMK_GPIO_ALT_B),
+       DB8500_PIN_GROUP(msp0txrx_b_1, NMK_GPIO_ALT_B),
+       DB8500_PIN_GROUP(i2c1_b_2, NMK_GPIO_ALT_B),
+       DB8500_PIN_GROUP(u2rxtx_b_1, NMK_GPIO_ALT_B),
+       DB8500_PIN_GROUP(uartmodtx_b_1, NMK_GPIO_ALT_B),
+       DB8500_PIN_GROUP(msp0sck_b_1, NMK_GPIO_ALT_B),
+       DB8500_PIN_GROUP(uartmodrx_b_1, NMK_GPIO_ALT_B),
+       DB8500_PIN_GROUP(stmmod_b_1, NMK_GPIO_ALT_B),
+       DB8500_PIN_GROUP(uartmodrx_b_2, NMK_GPIO_ALT_B),
+       DB8500_PIN_GROUP(spi3_b_1, NMK_GPIO_ALT_B),
+       DB8500_PIN_GROUP(msp1txrx_b_1, NMK_GPIO_ALT_B),
+       DB8500_PIN_GROUP(kp_b_1, NMK_GPIO_ALT_B),
+       DB8500_PIN_GROUP(kp_b_2, NMK_GPIO_ALT_B),
+       DB8500_PIN_GROUP(sm_b_1, NMK_GPIO_ALT_B),
+       DB8500_PIN_GROUP(smcs0_b_1, NMK_GPIO_ALT_B),
+       DB8500_PIN_GROUP(smcs1_b_1, NMK_GPIO_ALT_B),
+       DB8500_PIN_GROUP(ipgpio7_b_1, NMK_GPIO_ALT_B),
+       DB8500_PIN_GROUP(ipgpio2_b_1, NMK_GPIO_ALT_B),
+       DB8500_PIN_GROUP(ipgpio3_b_1, NMK_GPIO_ALT_B),
+       DB8500_PIN_GROUP(lcdaclk_b_1, NMK_GPIO_ALT_B),
+       DB8500_PIN_GROUP(lcda_b_1, NMK_GPIO_ALT_B),
+       DB8500_PIN_GROUP(lcd_b_1, NMK_GPIO_ALT_B),
+       DB8500_PIN_GROUP(ddrtrig_b_1, NMK_GPIO_ALT_B),
+       DB8500_PIN_GROUP(pwl_b_1, NMK_GPIO_ALT_B),
+       DB8500_PIN_GROUP(spi1_b_1, NMK_GPIO_ALT_B),
+       DB8500_PIN_GROUP(mc3_b_1, NMK_GPIO_ALT_B),
+       DB8500_PIN_GROUP(pwl_b_2, NMK_GPIO_ALT_B),
+       DB8500_PIN_GROUP(pwl_b_3, NMK_GPIO_ALT_B),
+       DB8500_PIN_GROUP(pwl_b_4, NMK_GPIO_ALT_B),
+       /* Altfunction C column */
+       DB8500_PIN_GROUP(ipjtag_c_1, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(ipgpio6_c_1, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(ipgpio0_c_1, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(ipgpio1_c_1, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(ipgpio3_c_1, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(ipgpio2_c_1, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(slim0_c_1, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(ms_c_1, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(iptrigout_c_1, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(u2rxtx_c_1, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(u2ctsrts_c_1, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(u0_c_1, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(ipgpio4_c_1, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(ipgpio5_c_1, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(ipgpio6_c_1, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(ipgpio7_c_1, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(smcleale_c_1, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(stmape_c_1, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(u2rxtx_c_2, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(ipgpio2_c_2, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(ipgpio3_c_2, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(ipgpio4_c_2, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(ipgpio5_c_2, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(mc5_c_1, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(mc2rstn_c_1, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(kp_c_1, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(smps0_c_1, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(smps1_c_1, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(u2rxtx_c_3, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(stmape_c_2, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(uartmodrx_c_1, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(uartmodtx_c_1, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(stmmod_c_1, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(usbsim_c_1, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(mc4rstn_c_1, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(clkout1_c_1, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(clkout2_c_1, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(i2c3_c_1, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(spi0_c_1, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(usbsim_c_2, NMK_GPIO_ALT_C),
+       DB8500_PIN_GROUP(i2c3_c_2, NMK_GPIO_ALT_C),
+       /* Other alt C1 column */
+       DB8500_PIN_GROUP(u2rx_oc1_1, NMK_GPIO_ALT_C1),
+       DB8500_PIN_GROUP(stmape_oc1_1, NMK_GPIO_ALT_C1),
+       DB8500_PIN_GROUP(remap0_oc1_1, NMK_GPIO_ALT_C1),
+       DB8500_PIN_GROUP(remap1_oc1_1, NMK_GPIO_ALT_C1),
+       DB8500_PIN_GROUP(ptma9_oc1_1, NMK_GPIO_ALT_C1),
+       DB8500_PIN_GROUP(kp_oc1_1, NMK_GPIO_ALT_C1),
+       DB8500_PIN_GROUP(rf_oc1_1, NMK_GPIO_ALT_C1),
+       DB8500_PIN_GROUP(hxclk_oc1_1, NMK_GPIO_ALT_C1),
+       DB8500_PIN_GROUP(uartmodrx_oc1_1, NMK_GPIO_ALT_C1),
+       DB8500_PIN_GROUP(uartmodtx_oc1_1, NMK_GPIO_ALT_C1),
+       DB8500_PIN_GROUP(stmmod_oc1_1, NMK_GPIO_ALT_C1),
+       DB8500_PIN_GROUP(hxgpio_oc1_1, NMK_GPIO_ALT_C1),
+       DB8500_PIN_GROUP(rf_oc1_2, NMK_GPIO_ALT_C1),
+       DB8500_PIN_GROUP(spi2_oc1_1, NMK_GPIO_ALT_C1),
+       DB8500_PIN_GROUP(spi2_oc1_2, NMK_GPIO_ALT_C1),
+       /* Other alt C2 column */
+       DB8500_PIN_GROUP(sbag_oc2_1, NMK_GPIO_ALT_C2),
+       DB8500_PIN_GROUP(etmr4_oc2_1, NMK_GPIO_ALT_C2),
+       DB8500_PIN_GROUP(ptma9_oc2_1, NMK_GPIO_ALT_C2),
+       /* Other alt C3 column */
+       DB8500_PIN_GROUP(stmmod_oc3_1, NMK_GPIO_ALT_C3),
+       DB8500_PIN_GROUP(stmmod_oc3_2, NMK_GPIO_ALT_C3),
+       DB8500_PIN_GROUP(uartmodrx_oc3_1, NMK_GPIO_ALT_C3),
+       DB8500_PIN_GROUP(uartmodtx_oc3_1, NMK_GPIO_ALT_C3),
+       DB8500_PIN_GROUP(etmr4_oc3_1, NMK_GPIO_ALT_C3),
+       /* Other alt C4 column */
+       DB8500_PIN_GROUP(sbag_oc4_1, NMK_GPIO_ALT_C4),
+       DB8500_PIN_GROUP(hwobs_oc4_1, NMK_GPIO_ALT_C4),
+};
+
+/* We use this macro to define the groups applicable to a function */
+#define DB8500_FUNC_GROUPS(a, b...)       \
+static const char * const a##_groups[] = { b };
+
+DB8500_FUNC_GROUPS(u0, "u0_a_1", "u0_c_1");
+DB8500_FUNC_GROUPS(u1, "u1rxtx_a_1", "u1ctsrts_a_1");
+/*
+ * UART2 can be muxed out with just RX/TX in four places, CTS+RTS is however
+ * only available on two pins in alternative function C
+ */
+DB8500_FUNC_GROUPS(u2, "u2rxtx_b_1", "u2rxtx_c_1", "u2ctsrts_c_1",
+                  "u2rxtx_c_2", "u2rxtx_c_3", "u2rx_oc1_1");
+DB8500_FUNC_GROUPS(ipi2c, "ipi2c_a_1", "ipi2c_a_2");
+/*
+ * MSP0 can only be on a certain set of pins, but the TX/RX pins can be
+ * switched around by selecting the altfunction A or B. The SCK pin is
+ * only available on the altfunction B.
+ */
+DB8500_FUNC_GROUPS(msp0, "msp0txrx_a_1", "msp0tfstck_a_1", "msp0rfstck_a_1",
+                  "msp0txrx_b_1", "msp0sck_b_1");
+DB8500_FUNC_GROUPS(mc0, "mc0_a_1", "mc0_dat47_a_1", "mc0dat31dir_a_1");
+/* MSP0 can swap RX/TX like MSP0 but has no SCK pin available */
+DB8500_FUNC_GROUPS(msp1, "msp1txrx_a_1", "msp1_a_1", "msp1txrx_b_1");
+DB8500_FUNC_GROUPS(lcdb, "lcdb_a_1");
+DB8500_FUNC_GROUPS(lcd, "lcdvsi0_a_1", "lcdvsi1_a_1", "lcd_d0_d7_a_1",
+       "lcd_d8_d11_a_1", "lcd_d12_d23_a_1", "lcd_b_1");
+DB8500_FUNC_GROUPS(kp, "kp_a_1", "kp_a_2", "kp_b_1", "kp_b_2", "kp_c_1", "kp_oc1_1");
+DB8500_FUNC_GROUPS(mc2, "mc2_a_1", "mc2rstn_c_1");
+DB8500_FUNC_GROUPS(ssp1, "ssp1_a_1");
+DB8500_FUNC_GROUPS(ssp0, "ssp0_a_1");
+DB8500_FUNC_GROUPS(i2c0, "i2c0_a_1");
+/* The image processor has 8 GPIO pins that can be muxed out */
+DB8500_FUNC_GROUPS(ipgpio, "ipgpio0_a_1", "ipgpio1_a_1", "ipgpio7_b_1",
+       "ipgpio2_b_1", "ipgpio3_b_1", "ipgpio6_c_1", "ipgpio0_c_1",
+       "ipgpio1_c_1", "ipgpio3_c_1", "ipgpio2_c_1", "ipgpio4_c_1",
+       "ipgpio5_c_1", "ipgpio6_c_2", "ipgpio7_c_1", "ipgpio2_c_2",
+       "ipgpio3_c_2", "ipgpio4_c_2", "ipgpio5_c_2");
+/* MSP2 can not invert the RX/TX pins but has the optional SCK pin */
+DB8500_FUNC_GROUPS(msp2, "msp2sck_a_1", "msp2_a_1");
+DB8500_FUNC_GROUPS(mc4, "mc4_a_1", "mc4rstn_c_1");
+DB8500_FUNC_GROUPS(mc1, "mc1_a_1", "mc1_a_2", "mc1dir_a_1");
+DB8500_FUNC_GROUPS(hsi, "hsir_a_1", "hsit_a_1", "hsit_a_2");
+DB8500_FUNC_GROUPS(clkout, "clkout1_a_1", "clkout1_a_2", "clkout1_c_1",
+               "clkout2_a_1", "clkout2_a_2", "clkout2_c_1");
+DB8500_FUNC_GROUPS(usb, "usb_a_1");
+DB8500_FUNC_GROUPS(trig, "trig_b_1");
+DB8500_FUNC_GROUPS(i2c4, "i2c4_b_1");
+DB8500_FUNC_GROUPS(i2c1, "i2c1_b_1", "i2c1_b_2");
+DB8500_FUNC_GROUPS(i2c2, "i2c2_b_1", "i2c2_b_2");
+/*
+ * The modem UART can output its RX and TX pins in some different places,
+ * so select one of each.
+ */
+DB8500_FUNC_GROUPS(uartmod, "uartmodtx_b_1", "uartmodrx_b_1", "uartmodrx_b_2",
+               "uartmodrx_c_1", "uartmod_tx_c_1", "uartmodrx_oc1_1",
+               "uartmodtx_oc1_1", "uartmodrx_oc3_1", "uartmodtx_oc3_1");
+DB8500_FUNC_GROUPS(stmmod, "stmmod_b_1", "stmmod_c_1", "stmmod_oc1_1",
+               "stmmod_oc3_1", "stmmod_oc3_2");
+DB8500_FUNC_GROUPS(spi3, "spi3_b_1");
+/* Select between CS0 on alt B or PS1 on alt C */
+DB8500_FUNC_GROUPS(sm, "sm_b_1", "smcs0_b_1", "smcs1_b_1", "smcleale_c_1",
+                  "smps0_c_1", "smps1_c_1");
+DB8500_FUNC_GROUPS(lcda, "lcdaclk_b_1", "lcda_b_1");
+DB8500_FUNC_GROUPS(ddrtrig, "ddrtrig_b_1");
+DB8500_FUNC_GROUPS(pwl, "pwl_b_1", "pwl_b_2", "pwl_b_3", "pwl_b_4");
+DB8500_FUNC_GROUPS(spi1, "spi1_b_1");
+DB8500_FUNC_GROUPS(mc3, "mc3_b_1");
+DB8500_FUNC_GROUPS(ipjtag, "ipjtag_c_1");
+DB8500_FUNC_GROUPS(slim0, "slim0_c_1");
+DB8500_FUNC_GROUPS(ms, "ms_c_1");
+DB8500_FUNC_GROUPS(iptrigout, "iptrigout_c_1");
+DB8500_FUNC_GROUPS(stmape, "stmape_c_1", "stmape_c_2", "stmape_oc1_1");
+DB8500_FUNC_GROUPS(mc5, "mc5_c_1");
+DB8500_FUNC_GROUPS(usbsim, "usbsim_c_1", "usbsim_c_2");
+DB8500_FUNC_GROUPS(i2c3, "i2c3_c_1", "i2c3_c_2");
+DB8500_FUNC_GROUPS(spi0, "spi0_c_1");
+DB8500_FUNC_GROUPS(spi2, "spi2_oc1_1", "spi2_oc1_2");
+DB8500_FUNC_GROUPS(remap, "remap0_oc1_1", "remap1_oc1_1");
+DB8500_FUNC_GROUPS(sbag, "sbag_oc2_1", "sbag_oc4_1");
+DB8500_FUNC_GROUPS(ptm, "ptma9_oc1_1", "ptma9_oc2_1");
+DB8500_FUNC_GROUPS(rf, "rf_oc1_1", "rf_oc1_2");
+DB8500_FUNC_GROUPS(hx, "hxclk_oc1_1", "hxgpio_oc1_1");
+DB8500_FUNC_GROUPS(etm, "etmr4_oc2_1", "etmr4_oc3_1");
+DB8500_FUNC_GROUPS(hwobs, "hwobs_oc4_1");
+#define FUNCTION(fname)                                        \
+       {                                               \
+               .name = #fname,                         \
+               .groups = fname##_groups,               \
+               .ngroups = ARRAY_SIZE(fname##_groups),  \
+       }
+
+static const struct nmk_function nmk_db8500_functions[] = {
+       FUNCTION(u0),
+       FUNCTION(u1),
+       FUNCTION(u2),
+       FUNCTION(ipi2c),
+       FUNCTION(msp0),
+       FUNCTION(mc0),
+       FUNCTION(msp1),
+       FUNCTION(lcdb),
+       FUNCTION(lcd),
+       FUNCTION(kp),
+       FUNCTION(mc2),
+       FUNCTION(ssp1),
+       FUNCTION(ssp0),
+       FUNCTION(i2c0),
+       FUNCTION(ipgpio),
+       FUNCTION(msp2),
+       FUNCTION(mc4),
+       FUNCTION(mc1),
+       FUNCTION(hsi),
+       FUNCTION(clkout),
+       FUNCTION(usb),
+       FUNCTION(trig),
+       FUNCTION(i2c4),
+       FUNCTION(i2c1),
+       FUNCTION(i2c2),
+       FUNCTION(uartmod),
+       FUNCTION(stmmod),
+       FUNCTION(spi3),
+       FUNCTION(sm),
+       FUNCTION(lcda),
+       FUNCTION(ddrtrig),
+       FUNCTION(pwl),
+       FUNCTION(spi1),
+       FUNCTION(mc3),
+       FUNCTION(ipjtag),
+       FUNCTION(slim0),
+       FUNCTION(ms),
+       FUNCTION(iptrigout),
+       FUNCTION(stmape),
+       FUNCTION(mc5),
+       FUNCTION(usbsim),
+       FUNCTION(i2c3),
+       FUNCTION(spi0),
+       FUNCTION(spi2),
+       FUNCTION(remap),
+       FUNCTION(ptm),
+       FUNCTION(rf),
+       FUNCTION(hx),
+       FUNCTION(etm),
+       FUNCTION(hwobs),
+};
+
+static const struct prcm_gpiocr_altcx_pin_desc db8500_altcx_pins[] = {
+       PRCM_GPIOCR_ALTCX(23,   true, PRCM_IDX_GPIOCR1, 9,      /* STMAPE_CLK_a */
+                               true, PRCM_IDX_GPIOCR1, 7,      /* SBAG_CLK_a */
+                               false, 0, 0,
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(24,   true, PRCM_IDX_GPIOCR1, 9,      /* STMAPE or U2_RXD ??? */
+                               true, PRCM_IDX_GPIOCR1, 7,      /* SBAG_VAL_a */
+                               true, PRCM_IDX_GPIOCR1, 10,     /* STM_MOD_CMD0 */
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(25,   true, PRCM_IDX_GPIOCR1, 9,      /* STMAPE_DAT_a[0] */
+                               true, PRCM_IDX_GPIOCR1, 7,      /* SBAG_D_a[0] */
+                               false, 0, 0,
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(26,   true, PRCM_IDX_GPIOCR1, 9,      /* STMAPE_DAT_a[1] */
+                               true, PRCM_IDX_GPIOCR1, 7,      /* SBAG_D_a[1] */
+                               false, 0, 0,
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(27,   true, PRCM_IDX_GPIOCR1, 9,      /* STMAPE_DAT_a[2] */
+                               true, PRCM_IDX_GPIOCR1, 7,      /* SBAG_D_a[2] */
+                               false, 0, 0,
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(28,   true, PRCM_IDX_GPIOCR1, 9,      /* STMAPE_DAT_a[3] */
+                               true, PRCM_IDX_GPIOCR1, 7,      /* SBAG_D_a[3] */
+                               false, 0, 0,
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(29,   false, 0, 0,
+                               false, 0, 0,
+                               true, PRCM_IDX_GPIOCR1, 10,     /* STM_MOD_CMD0 */
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(30,   false, 0, 0,
+                               false, 0, 0,
+                               true, PRCM_IDX_GPIOCR1, 10,     /* STM_MOD_CMD0 */
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(31,   false, 0, 0,
+                               false, 0, 0,
+                               true, PRCM_IDX_GPIOCR1, 10,     /* STM_MOD_CMD0 */
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(32,   false, 0, 0,
+                               false, 0, 0,
+                               true, PRCM_IDX_GPIOCR1, 10,     /* STM_MOD_CMD0 */
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(68,   true, PRCM_IDX_GPIOCR1, 18,     /* REMAP_SELECT_ON */
+                               false, 0, 0,
+                               false, 0, 0,
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(69,   true, PRCM_IDX_GPIOCR1, 18,     /* REMAP_SELECT_ON */
+                               false, 0, 0,
+                               false, 0, 0,
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(70,   true, PRCM_IDX_GPIOCR1, 5,      /* PTM_A9_D23 */
+                               true, PRCM_IDX_GPIOCR2, 2,      /* DBG_ETM_R4_CMD0 */
+                               true, PRCM_IDX_GPIOCR1, 11,     /* STM_MOD_CMD1 */
+                               true, PRCM_IDX_GPIOCR1, 8       /* SBAG_CLK */
+       ),
+       PRCM_GPIOCR_ALTCX(71,   true, PRCM_IDX_GPIOCR1, 5,      /* PTM_A9_D22 */
+                               true, PRCM_IDX_GPIOCR2, 2,      /* DBG_ETM_R4_CMD0 */
+                               true, PRCM_IDX_GPIOCR1, 11,     /* STM_MOD_CMD1 */
+                               true, PRCM_IDX_GPIOCR1, 8       /* SBAG_D3 */
+       ),
+       PRCM_GPIOCR_ALTCX(72,   true, PRCM_IDX_GPIOCR1, 5,      /* PTM_A9_D21 */
+                               true, PRCM_IDX_GPIOCR2, 2,      /* DBG_ETM_R4_CMD0 */
+                               true, PRCM_IDX_GPIOCR1, 11,     /* STM_MOD_CMD1 */
+                               true, PRCM_IDX_GPIOCR1, 8       /* SBAG_D2 */
+       ),
+       PRCM_GPIOCR_ALTCX(73,   true, PRCM_IDX_GPIOCR1, 5,      /* PTM_A9_D20 */
+                               true, PRCM_IDX_GPIOCR2, 2,      /* DBG_ETM_R4_CMD0 */
+                               true, PRCM_IDX_GPIOCR1, 11,     /* STM_MOD_CMD1 */
+                               true, PRCM_IDX_GPIOCR1, 8       /* SBAG_D1 */
+       ),
+       PRCM_GPIOCR_ALTCX(74,   true, PRCM_IDX_GPIOCR1, 5,      /* PTM_A9_D19 */
+                               true, PRCM_IDX_GPIOCR2, 2,      /* DBG_ETM_R4_CMD0 */
+                               true, PRCM_IDX_GPIOCR1, 11,     /* STM_MOD_CMD1 */
+                               true, PRCM_IDX_GPIOCR1, 8       /* SBAG_D0 */
+       ),
+       PRCM_GPIOCR_ALTCX(75,   true, PRCM_IDX_GPIOCR1, 5,      /* PTM_A9_D18 */
+                               true, PRCM_IDX_GPIOCR2, 2,      /* DBG_ETM_R4_CMD0 */
+                               true, PRCM_IDX_GPIOCR1, 0,      /* DBG_UARTMOD_CMD0 */
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(76,   true, PRCM_IDX_GPIOCR1, 5,      /* PTM_A9_D17 */
+                               true, PRCM_IDX_GPIOCR2, 2,      /* DBG_ETM_R4_CMD0 */
+                               true, PRCM_IDX_GPIOCR1, 0,      /* DBG_UARTMOD_CMD0 */
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(77,   true, PRCM_IDX_GPIOCR1, 5,      /* PTM_A9_D16 */
+                               true, PRCM_IDX_GPIOCR2, 2,      /* DBG_ETM_R4_CMD0 */
+                               false, 0, 0,
+                               true, PRCM_IDX_GPIOCR1, 8       /* SBAG_VAL */
+       ),
+       PRCM_GPIOCR_ALTCX(86,   true, PRCM_IDX_GPIOCR1, 12,     /* KP_O3 */
+                               false, 0, 0,
+                               false, 0, 0,
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(87,   true, PRCM_IDX_GPIOCR1, 12,     /* KP_O2 */
+                               false, 0, 0,
+                               false, 0, 0,
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(88,   true, PRCM_IDX_GPIOCR1, 12,     /* KP_I3 */
+                               false, 0, 0,
+                               false, 0, 0,
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(89,   true, PRCM_IDX_GPIOCR1, 12,     /* KP_I2 */
+                               false, 0, 0,
+                               false, 0, 0,
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(90,   true, PRCM_IDX_GPIOCR1, 12,     /* KP_O1 */
+                               false, 0, 0,
+                               false, 0, 0,
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(91,   true, PRCM_IDX_GPIOCR1, 12,     /* KP_O0 */
+                               false, 0, 0,
+                               false, 0, 0,
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(92,   true, PRCM_IDX_GPIOCR1, 12,     /* KP_I1 */
+                               false, 0, 0,
+                               false, 0, 0,
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(93,   true, PRCM_IDX_GPIOCR1, 12,     /* KP_I0 */
+                               false, 0, 0,
+                               false, 0, 0,
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(96,   true, PRCM_IDX_GPIOCR2, 3,      /* RF_INT */
+                               false, 0, 0,
+                               false, 0, 0,
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(97,   true, PRCM_IDX_GPIOCR2, 1,      /* RF_CTRL */
+                               false, 0, 0,
+                               false, 0, 0,
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(151,  false, 0, 0,
+                               true, PRCM_IDX_GPIOCR1, 6,      /* PTM_A9_CTL */
+                               true, PRCM_IDX_GPIOCR1, 15,     /* DBG_ETM_R4_CMD1*/
+                               true, PRCM_IDX_GPIOCR1, 25      /* HW_OBS17 */
+       ),
+       PRCM_GPIOCR_ALTCX(152,  true, PRCM_IDX_GPIOCR1, 4,      /* Hx_CLK */
+                               true, PRCM_IDX_GPIOCR1, 6,      /* PTM_A9_CLK */
+                               true, PRCM_IDX_GPIOCR1, 15,     /* DBG_ETM_R4_CMD1*/
+                               true, PRCM_IDX_GPIOCR1, 25      /* HW_OBS16 */
+       ),
+       PRCM_GPIOCR_ALTCX(153,  true, PRCM_IDX_GPIOCR1, 1,      /* UARTMOD_CMD1 */
+                               true, PRCM_IDX_GPIOCR1, 14,     /* PTM_A9_D15 */
+                               true, PRCM_IDX_GPIOCR1, 19,     /* DBG_ETM_R4_CMD2 */
+                               true, PRCM_IDX_GPIOCR1, 25      /* HW_OBS15 */
+       ),
+       PRCM_GPIOCR_ALTCX(154,  true, PRCM_IDX_GPIOCR1, 1,      /* UARTMOD_CMD1 */
+                               true, PRCM_IDX_GPIOCR1, 14,     /* PTM_A9_D14 */
+                               true, PRCM_IDX_GPIOCR1, 19,     /* DBG_ETM_R4_CMD2 */
+                               true, PRCM_IDX_GPIOCR1, 25      /* HW_OBS14 */
+       ),
+       PRCM_GPIOCR_ALTCX(155,  true, PRCM_IDX_GPIOCR1, 13,     /* STM_MOD_CMD2 */
+                               true, PRCM_IDX_GPIOCR1, 14,     /* PTM_A9_D13 */
+                               true, PRCM_IDX_GPIOCR1, 19,     /* DBG_ETM_R4_CMD2 */
+                               true, PRCM_IDX_GPIOCR1, 25      /* HW_OBS13 */
+       ),
+       PRCM_GPIOCR_ALTCX(156,  true, PRCM_IDX_GPIOCR1, 13,     /* STM_MOD_CMD2 */
+                               true, PRCM_IDX_GPIOCR1, 14,     /* PTM_A9_D12 */
+                               true, PRCM_IDX_GPIOCR1, 19,     /* DBG_ETM_R4_CMD2 */
+                               true, PRCM_IDX_GPIOCR1, 25      /* HW_OBS12 */
+       ),
+       PRCM_GPIOCR_ALTCX(157,  true, PRCM_IDX_GPIOCR1, 13,     /* STM_MOD_CMD2 */
+                               true, PRCM_IDX_GPIOCR1, 14,     /* PTM_A9_D11 */
+                               true, PRCM_IDX_GPIOCR1, 19,     /* DBG_ETM_R4_CMD2 */
+                               true, PRCM_IDX_GPIOCR1, 25      /* HW_OBS11 */
+       ),
+       PRCM_GPIOCR_ALTCX(158,  true, PRCM_IDX_GPIOCR1, 13,     /* STM_MOD_CMD2 */
+                               true, PRCM_IDX_GPIOCR1, 14,     /* PTM_A9_D10 */
+                               true, PRCM_IDX_GPIOCR1, 19,     /* DBG_ETM_R4_CMD2 */
+                               true, PRCM_IDX_GPIOCR1, 25      /* HW_OBS10 */
+       ),
+       PRCM_GPIOCR_ALTCX(159,  true, PRCM_IDX_GPIOCR1, 13,     /* STM_MOD_CMD2 */
+                               true, PRCM_IDX_GPIOCR1, 14,     /* PTM_A9_D9 */
+                               true, PRCM_IDX_GPIOCR1, 19,     /* DBG_ETM_R4_CMD2 */
+                               true, PRCM_IDX_GPIOCR1, 25      /* HW_OBS9 */
+       ),
+       PRCM_GPIOCR_ALTCX(160,  false, 0, 0,
+                               true, PRCM_IDX_GPIOCR1, 14,     /* PTM_A9_D8 */
+                               true, PRCM_IDX_GPIOCR1, 19,     /* DBG_ETM_R4_CMD2 */
+                               true, PRCM_IDX_GPIOCR1, 25      /* HW_OBS8 */
+       ),
+       PRCM_GPIOCR_ALTCX(161,  true, PRCM_IDX_GPIOCR1, 4,      /* Hx_GPIO7 */
+                               true, PRCM_IDX_GPIOCR1, 6,      /* PTM_A9_D7 */
+                               true, PRCM_IDX_GPIOCR1, 15,     /* DBG_ETM_R4_CMD1*/
+                               true, PRCM_IDX_GPIOCR1, 24      /* HW_OBS7 */
+       ),
+       PRCM_GPIOCR_ALTCX(162,  true, PRCM_IDX_GPIOCR1, 4,      /* Hx_GPIO6 */
+                               true, PRCM_IDX_GPIOCR1, 6,      /* PTM_A9_D6 */
+                               true, PRCM_IDX_GPIOCR1, 15,     /* DBG_ETM_R4_CMD1*/
+                               true, PRCM_IDX_GPIOCR1, 24      /* HW_OBS6 */
+       ),
+       PRCM_GPIOCR_ALTCX(163,  true, PRCM_IDX_GPIOCR1, 4,      /* Hx_GPIO5 */
+                               true, PRCM_IDX_GPIOCR1, 6,      /* PTM_A9_D5 */
+                               true, PRCM_IDX_GPIOCR1, 15,     /* DBG_ETM_R4_CMD1*/
+                               true, PRCM_IDX_GPIOCR1, 24      /* HW_OBS5 */
+       ),
+       PRCM_GPIOCR_ALTCX(164,  true, PRCM_IDX_GPIOCR1, 4,      /* Hx_GPIO4 */
+                               true, PRCM_IDX_GPIOCR1, 6,      /* PTM_A9_D4 */
+                               true, PRCM_IDX_GPIOCR1, 15,     /* DBG_ETM_R4_CMD1*/
+                               true, PRCM_IDX_GPIOCR1, 24      /* HW_OBS4 */
+       ),
+       PRCM_GPIOCR_ALTCX(165,  true, PRCM_IDX_GPIOCR1, 4,      /* Hx_GPIO3 */
+                               true, PRCM_IDX_GPIOCR1, 6,      /* PTM_A9_D3 */
+                               true, PRCM_IDX_GPIOCR1, 15,     /* DBG_ETM_R4_CMD1*/
+                               true, PRCM_IDX_GPIOCR1, 24      /* HW_OBS3 */
+       ),
+       PRCM_GPIOCR_ALTCX(166,  true, PRCM_IDX_GPIOCR1, 4,      /* Hx_GPIO2 */
+                               true, PRCM_IDX_GPIOCR1, 6,      /* PTM_A9_D2 */
+                               true, PRCM_IDX_GPIOCR1, 15,     /* DBG_ETM_R4_CMD1*/
+                               true, PRCM_IDX_GPIOCR1, 24      /* HW_OBS2 */
+       ),
+       PRCM_GPIOCR_ALTCX(167,  true, PRCM_IDX_GPIOCR1, 4,      /* Hx_GPIO1 */
+                               true, PRCM_IDX_GPIOCR1, 6,      /* PTM_A9_D1 */
+                               true, PRCM_IDX_GPIOCR1, 15,     /* DBG_ETM_R4_CMD1*/
+                               true, PRCM_IDX_GPIOCR1, 24      /* HW_OBS1 */
+       ),
+       PRCM_GPIOCR_ALTCX(168,  true, PRCM_IDX_GPIOCR1, 4,      /* Hx_GPIO0 */
+                               true, PRCM_IDX_GPIOCR1, 6,      /* PTM_A9_D0 */
+                               true, PRCM_IDX_GPIOCR1, 15,     /* DBG_ETM_R4_CMD1*/
+                               true, PRCM_IDX_GPIOCR1, 24      /* HW_OBS0 */
+       ),
+       PRCM_GPIOCR_ALTCX(170,  true, PRCM_IDX_GPIOCR2, 2,      /* RF_INT */
+                               false, 0, 0,
+                               false, 0, 0,
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(171,  true, PRCM_IDX_GPIOCR2, 0,      /* RF_CTRL */
+                               false, 0, 0,
+                               false, 0, 0,
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(215,  true, PRCM_IDX_GPIOCR1, 23,     /* SPI2_TXD */
+                               false, 0, 0,
+                               false, 0, 0,
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(216,  true, PRCM_IDX_GPIOCR1, 23,     /* SPI2_FRM */
+                               false, 0, 0,
+                               false, 0, 0,
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(217,  true, PRCM_IDX_GPIOCR1, 23,     /* SPI2_CLK */
+                               false, 0, 0,
+                               false, 0, 0,
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(218,  true, PRCM_IDX_GPIOCR1, 23,     /* SPI2_RXD */
+                               false, 0, 0,
+                               false, 0, 0,
+                               false, 0, 0
+       ),
+};
+
+static const u16 db8500_prcm_gpiocr_regs[] = {
+       [PRCM_IDX_GPIOCR1] = 0x138,
+       [PRCM_IDX_GPIOCR2] = 0x574,
+};
+
+static const struct nmk_pinctrl_soc_data nmk_db8500_soc = {
+       .gpio_ranges = nmk_db8500_ranges,
+       .gpio_num_ranges = ARRAY_SIZE(nmk_db8500_ranges),
+       .pins = nmk_db8500_pins,
+       .npins = ARRAY_SIZE(nmk_db8500_pins),
+       .functions = nmk_db8500_functions,
+       .nfunctions = ARRAY_SIZE(nmk_db8500_functions),
+       .groups = nmk_db8500_groups,
+       .ngroups = ARRAY_SIZE(nmk_db8500_groups),
+       .altcx_pins = db8500_altcx_pins,
+       .npins_altcx = ARRAY_SIZE(db8500_altcx_pins),
+       .prcm_gpiocr_registers = db8500_prcm_gpiocr_regs,
+};
+
+void nmk_pinctrl_db8500_init(const struct nmk_pinctrl_soc_data **soc)
+{
+       *soc = &nmk_db8500_soc;
+}
diff --git a/drivers/pinctrl/nomadik/pinctrl-nomadik-db8540.c b/drivers/pinctrl/nomadik/pinctrl-nomadik-db8540.c
new file mode 100644 (file)
index 0000000..d7ba544
--- /dev/null
@@ -0,0 +1,1266 @@
+#include <linux/kernel.h>
+#include <linux/pinctrl/pinctrl.h>
+#include "pinctrl-nomadik.h"
+
+/* All the pins that can be used for GPIO and some other functions */
+#define _GPIO(offset)          (offset)
+
+#define DB8540_PIN_AH6         _GPIO(0)
+#define DB8540_PIN_AG7         _GPIO(1)
+#define DB8540_PIN_AF2         _GPIO(2)
+#define DB8540_PIN_AD3         _GPIO(3)
+#define DB8540_PIN_AF6         _GPIO(4)
+#define DB8540_PIN_AG6         _GPIO(5)
+#define DB8540_PIN_AD5         _GPIO(6)
+#define DB8540_PIN_AF7         _GPIO(7)
+#define DB8540_PIN_AG5         _GPIO(8)
+#define DB8540_PIN_AH5         _GPIO(9)
+#define DB8540_PIN_AE4         _GPIO(10)
+#define DB8540_PIN_AD1         _GPIO(11)
+#define DB8540_PIN_AD2         _GPIO(12)
+#define DB8540_PIN_AC2         _GPIO(13)
+#define DB8540_PIN_AC4         _GPIO(14)
+#define DB8540_PIN_AC3         _GPIO(15)
+#define DB8540_PIN_AH7         _GPIO(16)
+#define DB8540_PIN_AE7         _GPIO(17)
+/* Hole */
+#define DB8540_PIN_AF8         _GPIO(22)
+#define DB8540_PIN_AH11                _GPIO(23)
+#define DB8540_PIN_AG11                _GPIO(24)
+#define DB8540_PIN_AF11                _GPIO(25)
+#define DB8540_PIN_AH10                _GPIO(26)
+#define DB8540_PIN_AG10                _GPIO(27)
+#define DB8540_PIN_AF10                _GPIO(28)
+/* Hole */
+#define DB8540_PIN_AD4         _GPIO(33)
+#define DB8540_PIN_AF3         _GPIO(34)
+#define DB8540_PIN_AF5         _GPIO(35)
+#define DB8540_PIN_AG4         _GPIO(36)
+#define DB8540_PIN_AF9         _GPIO(37)
+#define DB8540_PIN_AE8         _GPIO(38)
+/* Hole */
+#define DB8540_PIN_M26         _GPIO(64)
+#define DB8540_PIN_M25         _GPIO(65)
+#define DB8540_PIN_M27         _GPIO(66)
+#define DB8540_PIN_N25         _GPIO(67)
+/* Hole */
+#define DB8540_PIN_M28         _GPIO(70)
+#define DB8540_PIN_N26         _GPIO(71)
+#define DB8540_PIN_M22         _GPIO(72)
+#define DB8540_PIN_N22         _GPIO(73)
+#define DB8540_PIN_N27         _GPIO(74)
+#define DB8540_PIN_N28         _GPIO(75)
+#define DB8540_PIN_P22         _GPIO(76)
+#define DB8540_PIN_P28         _GPIO(77)
+#define DB8540_PIN_P26         _GPIO(78)
+#define DB8540_PIN_T22         _GPIO(79)
+#define DB8540_PIN_R27         _GPIO(80)
+#define DB8540_PIN_P27         _GPIO(81)
+#define DB8540_PIN_R26         _GPIO(82)
+#define DB8540_PIN_R25         _GPIO(83)
+#define DB8540_PIN_U22         _GPIO(84)
+#define DB8540_PIN_T27         _GPIO(85)
+#define DB8540_PIN_T25         _GPIO(86)
+#define DB8540_PIN_T26         _GPIO(87)
+/* Hole */
+#define DB8540_PIN_AF20                _GPIO(116)
+#define DB8540_PIN_AG21                _GPIO(117)
+#define DB8540_PIN_AH19                _GPIO(118)
+#define DB8540_PIN_AE19                _GPIO(119)
+#define DB8540_PIN_AG18                _GPIO(120)
+#define DB8540_PIN_AH17                _GPIO(121)
+#define DB8540_PIN_AF19                _GPIO(122)
+#define DB8540_PIN_AF18                _GPIO(123)
+#define DB8540_PIN_AE18                _GPIO(124)
+#define DB8540_PIN_AG17                _GPIO(125)
+#define DB8540_PIN_AF17                _GPIO(126)
+#define DB8540_PIN_AE17                _GPIO(127)
+#define DB8540_PIN_AC27                _GPIO(128)
+#define DB8540_PIN_AD27                _GPIO(129)
+#define DB8540_PIN_AE28                _GPIO(130)
+#define DB8540_PIN_AG26                _GPIO(131)
+#define DB8540_PIN_AF25                _GPIO(132)
+#define DB8540_PIN_AE27                _GPIO(133)
+#define DB8540_PIN_AF27                _GPIO(134)
+#define DB8540_PIN_AG28                _GPIO(135)
+#define DB8540_PIN_AF28                _GPIO(136)
+#define DB8540_PIN_AG25                _GPIO(137)
+#define DB8540_PIN_AG24                _GPIO(138)
+#define DB8540_PIN_AD25                _GPIO(139)
+#define DB8540_PIN_AH25                _GPIO(140)
+#define DB8540_PIN_AF26                _GPIO(141)
+#define DB8540_PIN_AF23                _GPIO(142)
+#define DB8540_PIN_AG23                _GPIO(143)
+#define DB8540_PIN_AE25                _GPIO(144)
+#define DB8540_PIN_AH24                _GPIO(145)
+#define DB8540_PIN_AJ25                _GPIO(146)
+#define DB8540_PIN_AG27                _GPIO(147)
+#define DB8540_PIN_AH23                _GPIO(148)
+#define DB8540_PIN_AE26                _GPIO(149)
+#define DB8540_PIN_AE24                _GPIO(150)
+#define DB8540_PIN_AJ24                _GPIO(151)
+#define DB8540_PIN_AE21                _GPIO(152)
+#define DB8540_PIN_AG22                _GPIO(153)
+#define DB8540_PIN_AF21                _GPIO(154)
+#define DB8540_PIN_AF24                _GPIO(155)
+#define DB8540_PIN_AH22                _GPIO(156)
+#define DB8540_PIN_AJ23                _GPIO(157)
+#define DB8540_PIN_AH21                _GPIO(158)
+#define DB8540_PIN_AG20                _GPIO(159)
+#define DB8540_PIN_AE23                _GPIO(160)
+#define DB8540_PIN_AH20                _GPIO(161)
+#define DB8540_PIN_AG19                _GPIO(162)
+#define DB8540_PIN_AF22                _GPIO(163)
+#define DB8540_PIN_AJ21                _GPIO(164)
+#define DB8540_PIN_AD26                _GPIO(165)
+#define DB8540_PIN_AD28                _GPIO(166)
+#define DB8540_PIN_AC28                _GPIO(167)
+#define DB8540_PIN_AC26                _GPIO(168)
+/* Hole */
+#define DB8540_PIN_J3          _GPIO(192)
+#define DB8540_PIN_H1          _GPIO(193)
+#define DB8540_PIN_J2          _GPIO(194)
+#define DB8540_PIN_H2          _GPIO(195)
+#define DB8540_PIN_H3          _GPIO(196)
+#define DB8540_PIN_H4          _GPIO(197)
+#define DB8540_PIN_G2          _GPIO(198)
+#define DB8540_PIN_G3          _GPIO(199)
+#define DB8540_PIN_G4          _GPIO(200)
+#define DB8540_PIN_F2          _GPIO(201)
+#define DB8540_PIN_C6          _GPIO(202)
+#define DB8540_PIN_B6          _GPIO(203)
+#define DB8540_PIN_B7          _GPIO(204)
+#define DB8540_PIN_A7          _GPIO(205)
+#define DB8540_PIN_D7          _GPIO(206)
+#define DB8540_PIN_D8          _GPIO(207)
+#define DB8540_PIN_F3          _GPIO(208)
+#define DB8540_PIN_E2          _GPIO(209)
+#define DB8540_PIN_C7          _GPIO(210)
+#define DB8540_PIN_B8          _GPIO(211)
+#define DB8540_PIN_C10         _GPIO(212)
+#define DB8540_PIN_C8          _GPIO(213)
+#define DB8540_PIN_C9          _GPIO(214)
+/* Hole */
+#define DB8540_PIN_B9          _GPIO(219)
+#define DB8540_PIN_A10         _GPIO(220)
+#define DB8540_PIN_D9          _GPIO(221)
+#define DB8540_PIN_B11         _GPIO(222)
+#define DB8540_PIN_B10         _GPIO(223)
+#define DB8540_PIN_E10         _GPIO(224)
+#define DB8540_PIN_B12         _GPIO(225)
+#define DB8540_PIN_D10         _GPIO(226)
+#define DB8540_PIN_D11         _GPIO(227)
+#define DB8540_PIN_AJ6         _GPIO(228)
+#define DB8540_PIN_B13         _GPIO(229)
+#define DB8540_PIN_C12         _GPIO(230)
+#define DB8540_PIN_B14         _GPIO(231)
+#define DB8540_PIN_E11         _GPIO(232)
+/* Hole */
+#define DB8540_PIN_D12         _GPIO(256)
+#define DB8540_PIN_D15         _GPIO(257)
+#define DB8540_PIN_C13         _GPIO(258)
+#define DB8540_PIN_C14         _GPIO(259)
+#define DB8540_PIN_C18         _GPIO(260)
+#define DB8540_PIN_C16         _GPIO(261)
+#define DB8540_PIN_B16         _GPIO(262)
+#define DB8540_PIN_D18         _GPIO(263)
+#define DB8540_PIN_C15         _GPIO(264)
+#define DB8540_PIN_C17         _GPIO(265)
+#define DB8540_PIN_B17         _GPIO(266)
+#define DB8540_PIN_D17         _GPIO(267)
+
+/*
+ * The names of the pins are denoted by GPIO number and ball name, even
+ * though they can be used for other things than GPIO, this is the first
+ * column in the table of the data sheet and often used on schematics and
+ * such.
+ */
+static const struct pinctrl_pin_desc nmk_db8540_pins[] = {
+       PINCTRL_PIN(DB8540_PIN_AH6, "GPIO0_AH6"),
+       PINCTRL_PIN(DB8540_PIN_AG7, "GPIO1_AG7"),
+       PINCTRL_PIN(DB8540_PIN_AF2, "GPIO2_AF2"),
+       PINCTRL_PIN(DB8540_PIN_AD3, "GPIO3_AD3"),
+       PINCTRL_PIN(DB8540_PIN_AF6, "GPIO4_AF6"),
+       PINCTRL_PIN(DB8540_PIN_AG6, "GPIO5_AG6"),
+       PINCTRL_PIN(DB8540_PIN_AD5, "GPIO6_AD5"),
+       PINCTRL_PIN(DB8540_PIN_AF7, "GPIO7_AF7"),
+       PINCTRL_PIN(DB8540_PIN_AG5, "GPIO8_AG5"),
+       PINCTRL_PIN(DB8540_PIN_AH5, "GPIO9_AH5"),
+       PINCTRL_PIN(DB8540_PIN_AE4, "GPIO10_AE4"),
+       PINCTRL_PIN(DB8540_PIN_AD1, "GPIO11_AD1"),
+       PINCTRL_PIN(DB8540_PIN_AD2, "GPIO12_AD2"),
+       PINCTRL_PIN(DB8540_PIN_AC2, "GPIO13_AC2"),
+       PINCTRL_PIN(DB8540_PIN_AC4, "GPIO14_AC4"),
+       PINCTRL_PIN(DB8540_PIN_AC3, "GPIO15_AC3"),
+       PINCTRL_PIN(DB8540_PIN_AH7, "GPIO16_AH7"),
+       PINCTRL_PIN(DB8540_PIN_AE7, "GPIO17_AE7"),
+       /* Hole */
+       PINCTRL_PIN(DB8540_PIN_AF8, "GPIO22_AF8"),
+       PINCTRL_PIN(DB8540_PIN_AH11, "GPIO23_AH11"),
+       PINCTRL_PIN(DB8540_PIN_AG11, "GPIO24_AG11"),
+       PINCTRL_PIN(DB8540_PIN_AF11, "GPIO25_AF11"),
+       PINCTRL_PIN(DB8540_PIN_AH10, "GPIO26_AH10"),
+       PINCTRL_PIN(DB8540_PIN_AG10, "GPIO27_AG10"),
+       PINCTRL_PIN(DB8540_PIN_AF10, "GPIO28_AF10"),
+       /* Hole */
+       PINCTRL_PIN(DB8540_PIN_AD4, "GPIO33_AD4"),
+       PINCTRL_PIN(DB8540_PIN_AF3, "GPIO34_AF3"),
+       PINCTRL_PIN(DB8540_PIN_AF5, "GPIO35_AF5"),
+       PINCTRL_PIN(DB8540_PIN_AG4, "GPIO36_AG4"),
+       PINCTRL_PIN(DB8540_PIN_AF9, "GPIO37_AF9"),
+       PINCTRL_PIN(DB8540_PIN_AE8, "GPIO38_AE8"),
+       /* Hole */
+       PINCTRL_PIN(DB8540_PIN_M26, "GPIO64_M26"),
+       PINCTRL_PIN(DB8540_PIN_M25, "GPIO65_M25"),
+       PINCTRL_PIN(DB8540_PIN_M27, "GPIO66_M27"),
+       PINCTRL_PIN(DB8540_PIN_N25, "GPIO67_N25"),
+       /* Hole */
+       PINCTRL_PIN(DB8540_PIN_M28, "GPIO70_M28"),
+       PINCTRL_PIN(DB8540_PIN_N26, "GPIO71_N26"),
+       PINCTRL_PIN(DB8540_PIN_M22, "GPIO72_M22"),
+       PINCTRL_PIN(DB8540_PIN_N22, "GPIO73_N22"),
+       PINCTRL_PIN(DB8540_PIN_N27, "GPIO74_N27"),
+       PINCTRL_PIN(DB8540_PIN_N28, "GPIO75_N28"),
+       PINCTRL_PIN(DB8540_PIN_P22, "GPIO76_P22"),
+       PINCTRL_PIN(DB8540_PIN_P28, "GPIO77_P28"),
+       PINCTRL_PIN(DB8540_PIN_P26, "GPIO78_P26"),
+       PINCTRL_PIN(DB8540_PIN_T22, "GPIO79_T22"),
+       PINCTRL_PIN(DB8540_PIN_R27, "GPIO80_R27"),
+       PINCTRL_PIN(DB8540_PIN_P27, "GPIO81_P27"),
+       PINCTRL_PIN(DB8540_PIN_R26, "GPIO82_R26"),
+       PINCTRL_PIN(DB8540_PIN_R25, "GPIO83_R25"),
+       PINCTRL_PIN(DB8540_PIN_U22, "GPIO84_U22"),
+       PINCTRL_PIN(DB8540_PIN_T27, "GPIO85_T27"),
+       PINCTRL_PIN(DB8540_PIN_T25, "GPIO86_T25"),
+       PINCTRL_PIN(DB8540_PIN_T26, "GPIO87_T26"),
+       /* Hole */
+       PINCTRL_PIN(DB8540_PIN_AF20, "GPIO116_AF20"),
+       PINCTRL_PIN(DB8540_PIN_AG21, "GPIO117_AG21"),
+       PINCTRL_PIN(DB8540_PIN_AH19, "GPIO118_AH19"),
+       PINCTRL_PIN(DB8540_PIN_AE19, "GPIO119_AE19"),
+       PINCTRL_PIN(DB8540_PIN_AG18, "GPIO120_AG18"),
+       PINCTRL_PIN(DB8540_PIN_AH17, "GPIO121_AH17"),
+       PINCTRL_PIN(DB8540_PIN_AF19, "GPIO122_AF19"),
+       PINCTRL_PIN(DB8540_PIN_AF18, "GPIO123_AF18"),
+       PINCTRL_PIN(DB8540_PIN_AE18, "GPIO124_AE18"),
+       PINCTRL_PIN(DB8540_PIN_AG17, "GPIO125_AG17"),
+       PINCTRL_PIN(DB8540_PIN_AF17, "GPIO126_AF17"),
+       PINCTRL_PIN(DB8540_PIN_AE17, "GPIO127_AE17"),
+       PINCTRL_PIN(DB8540_PIN_AC27, "GPIO128_AC27"),
+       PINCTRL_PIN(DB8540_PIN_AD27, "GPIO129_AD27"),
+       PINCTRL_PIN(DB8540_PIN_AE28, "GPIO130_AE28"),
+       PINCTRL_PIN(DB8540_PIN_AG26, "GPIO131_AG26"),
+       PINCTRL_PIN(DB8540_PIN_AF25, "GPIO132_AF25"),
+       PINCTRL_PIN(DB8540_PIN_AE27, "GPIO133_AE27"),
+       PINCTRL_PIN(DB8540_PIN_AF27, "GPIO134_AF27"),
+       PINCTRL_PIN(DB8540_PIN_AG28, "GPIO135_AG28"),
+       PINCTRL_PIN(DB8540_PIN_AF28, "GPIO136_AF28"),
+       PINCTRL_PIN(DB8540_PIN_AG25, "GPIO137_AG25"),
+       PINCTRL_PIN(DB8540_PIN_AG24, "GPIO138_AG24"),
+       PINCTRL_PIN(DB8540_PIN_AD25, "GPIO139_AD25"),
+       PINCTRL_PIN(DB8540_PIN_AH25, "GPIO140_AH25"),
+       PINCTRL_PIN(DB8540_PIN_AF26, "GPIO141_AF26"),
+       PINCTRL_PIN(DB8540_PIN_AF23, "GPIO142_AF23"),
+       PINCTRL_PIN(DB8540_PIN_AG23, "GPIO143_AG23"),
+       PINCTRL_PIN(DB8540_PIN_AE25, "GPIO144_AE25"),
+       PINCTRL_PIN(DB8540_PIN_AH24, "GPIO145_AH24"),
+       PINCTRL_PIN(DB8540_PIN_AJ25, "GPIO146_AJ25"),
+       PINCTRL_PIN(DB8540_PIN_AG27, "GPIO147_AG27"),
+       PINCTRL_PIN(DB8540_PIN_AH23, "GPIO148_AH23"),
+       PINCTRL_PIN(DB8540_PIN_AE26, "GPIO149_AE26"),
+       PINCTRL_PIN(DB8540_PIN_AE24, "GPIO150_AE24"),
+       PINCTRL_PIN(DB8540_PIN_AJ24, "GPIO151_AJ24"),
+       PINCTRL_PIN(DB8540_PIN_AE21, "GPIO152_AE21"),
+       PINCTRL_PIN(DB8540_PIN_AG22, "GPIO153_AG22"),
+       PINCTRL_PIN(DB8540_PIN_AF21, "GPIO154_AF21"),
+       PINCTRL_PIN(DB8540_PIN_AF24, "GPIO155_AF24"),
+       PINCTRL_PIN(DB8540_PIN_AH22, "GPIO156_AH22"),
+       PINCTRL_PIN(DB8540_PIN_AJ23, "GPIO157_AJ23"),
+       PINCTRL_PIN(DB8540_PIN_AH21, "GPIO158_AH21"),
+       PINCTRL_PIN(DB8540_PIN_AG20, "GPIO159_AG20"),
+       PINCTRL_PIN(DB8540_PIN_AE23, "GPIO160_AE23"),
+       PINCTRL_PIN(DB8540_PIN_AH20, "GPIO161_AH20"),
+       PINCTRL_PIN(DB8540_PIN_AG19, "GPIO162_AG19"),
+       PINCTRL_PIN(DB8540_PIN_AF22, "GPIO163_AF22"),
+       PINCTRL_PIN(DB8540_PIN_AJ21, "GPIO164_AJ21"),
+       PINCTRL_PIN(DB8540_PIN_AD26, "GPIO165_AD26"),
+       PINCTRL_PIN(DB8540_PIN_AD28, "GPIO166_AD28"),
+       PINCTRL_PIN(DB8540_PIN_AC28, "GPIO167_AC28"),
+       PINCTRL_PIN(DB8540_PIN_AC26, "GPIO168_AC26"),
+       /* Hole */
+       PINCTRL_PIN(DB8540_PIN_J3, "GPIO192_J3"),
+       PINCTRL_PIN(DB8540_PIN_H1, "GPIO193_H1"),
+       PINCTRL_PIN(DB8540_PIN_J2, "GPIO194_J2"),
+       PINCTRL_PIN(DB8540_PIN_H2, "GPIO195_H2"),
+       PINCTRL_PIN(DB8540_PIN_H3, "GPIO196_H3"),
+       PINCTRL_PIN(DB8540_PIN_H4, "GPIO197_H4"),
+       PINCTRL_PIN(DB8540_PIN_G2, "GPIO198_G2"),
+       PINCTRL_PIN(DB8540_PIN_G3, "GPIO199_G3"),
+       PINCTRL_PIN(DB8540_PIN_G4, "GPIO200_G4"),
+       PINCTRL_PIN(DB8540_PIN_F2, "GPIO201_F2"),
+       PINCTRL_PIN(DB8540_PIN_C6, "GPIO202_C6"),
+       PINCTRL_PIN(DB8540_PIN_B6, "GPIO203_B6"),
+       PINCTRL_PIN(DB8540_PIN_B7, "GPIO204_B7"),
+       PINCTRL_PIN(DB8540_PIN_A7, "GPIO205_A7"),
+       PINCTRL_PIN(DB8540_PIN_D7, "GPIO206_D7"),
+       PINCTRL_PIN(DB8540_PIN_D8, "GPIO207_D8"),
+       PINCTRL_PIN(DB8540_PIN_F3, "GPIO208_F3"),
+       PINCTRL_PIN(DB8540_PIN_E2, "GPIO209_E2"),
+       PINCTRL_PIN(DB8540_PIN_C7, "GPIO210_C7"),
+       PINCTRL_PIN(DB8540_PIN_B8, "GPIO211_B8"),
+       PINCTRL_PIN(DB8540_PIN_C10, "GPIO212_C10"),
+       PINCTRL_PIN(DB8540_PIN_C8, "GPIO213_C8"),
+       PINCTRL_PIN(DB8540_PIN_C9, "GPIO214_C9"),
+       /* Hole */
+       PINCTRL_PIN(DB8540_PIN_B9, "GPIO219_B9"),
+       PINCTRL_PIN(DB8540_PIN_A10, "GPIO220_A10"),
+       PINCTRL_PIN(DB8540_PIN_D9, "GPIO221_D9"),
+       PINCTRL_PIN(DB8540_PIN_B11, "GPIO222_B11"),
+       PINCTRL_PIN(DB8540_PIN_B10, "GPIO223_B10"),
+       PINCTRL_PIN(DB8540_PIN_E10, "GPIO224_E10"),
+       PINCTRL_PIN(DB8540_PIN_B12, "GPIO225_B12"),
+       PINCTRL_PIN(DB8540_PIN_D10, "GPIO226_D10"),
+       PINCTRL_PIN(DB8540_PIN_D11, "GPIO227_D11"),
+       PINCTRL_PIN(DB8540_PIN_AJ6, "GPIO228_AJ6"),
+       PINCTRL_PIN(DB8540_PIN_B13, "GPIO229_B13"),
+       PINCTRL_PIN(DB8540_PIN_C12, "GPIO230_C12"),
+       PINCTRL_PIN(DB8540_PIN_B14, "GPIO231_B14"),
+       PINCTRL_PIN(DB8540_PIN_E11, "GPIO232_E11"),
+       /* Hole */
+       PINCTRL_PIN(DB8540_PIN_D12, "GPIO256_D12"),
+       PINCTRL_PIN(DB8540_PIN_D15, "GPIO257_D15"),
+       PINCTRL_PIN(DB8540_PIN_C13, "GPIO258_C13"),
+       PINCTRL_PIN(DB8540_PIN_C14, "GPIO259_C14"),
+       PINCTRL_PIN(DB8540_PIN_C18, "GPIO260_C18"),
+       PINCTRL_PIN(DB8540_PIN_C16, "GPIO261_C16"),
+       PINCTRL_PIN(DB8540_PIN_B16, "GPIO262_B16"),
+       PINCTRL_PIN(DB8540_PIN_D18, "GPIO263_D18"),
+       PINCTRL_PIN(DB8540_PIN_C15, "GPIO264_C15"),
+       PINCTRL_PIN(DB8540_PIN_C17, "GPIO265_C17"),
+       PINCTRL_PIN(DB8540_PIN_B17, "GPIO266_B17"),
+       PINCTRL_PIN(DB8540_PIN_D17, "GPIO267_D17"),
+};
+
+#define DB8540_GPIO_RANGE(a, b, c) { .name = "db8540", .id = a, .base = b, \
+                       .pin_base = b, .npins = c }
+
+/*
+ * This matches the 32-pin gpio chips registered by the GPIO portion. This
+ * cannot be const since we assign the struct gpio_chip * pointer at runtime.
+ */
+static struct pinctrl_gpio_range nmk_db8540_ranges[] = {
+       DB8540_GPIO_RANGE(0, 0, 18),
+       DB8540_GPIO_RANGE(0, 22, 7),
+       DB8540_GPIO_RANGE(1, 33, 6),
+       DB8540_GPIO_RANGE(2, 64, 4),
+       DB8540_GPIO_RANGE(2, 70, 18),
+       DB8540_GPIO_RANGE(3, 116, 12),
+       DB8540_GPIO_RANGE(4, 128, 32),
+       DB8540_GPIO_RANGE(5, 160, 9),
+       DB8540_GPIO_RANGE(6, 192, 23),
+       DB8540_GPIO_RANGE(6, 219, 5),
+       DB8540_GPIO_RANGE(7, 224, 9),
+       DB8540_GPIO_RANGE(8, 256, 12),
+};
+
+/*
+ * Read the pin group names like this:
+ * u0_a_1    = first groups of pins for uart0 on alt function a
+ * i2c2_b_2  = second group of pins for i2c2 on alt function b
+ *
+ * The groups are arranged as sets per altfunction column, so we can
+ * mux in one group at a time by selecting the same altfunction for them
+ * all. When functions require pins on different altfunctions, you need
+ * to combine several groups.
+ */
+
+/* Altfunction A column */
+static const unsigned u0_a_1_pins[] = { DB8540_PIN_AH6, DB8540_PIN_AG7,
+                                       DB8540_PIN_AF2, DB8540_PIN_AD3 };
+static const unsigned u1rxtx_a_1_pins[] = { DB8540_PIN_AF6, DB8540_PIN_AG6 };
+static const unsigned u1ctsrts_a_1_pins[] = { DB8540_PIN_AD5, DB8540_PIN_AF7 };
+/* Image processor I2C line, this is driven by image processor firmware */
+static const unsigned ipi2c_a_1_pins[] = { DB8540_PIN_AG5, DB8540_PIN_AH5 };
+static const unsigned ipi2c_a_2_pins[] = { DB8540_PIN_AE4, DB8540_PIN_AD1 };
+/* MSP0 can only be on these pins, but TXD and RXD can be flipped */
+static const unsigned msp0txrx_a_1_pins[] = { DB8540_PIN_AD2, DB8540_PIN_AC3 };
+static const unsigned msp0tfstck_a_1_pins[] = { DB8540_PIN_AC2,
+       DB8540_PIN_AC4 };
+static const unsigned msp0rfsrck_a_1_pins[] = { DB8540_PIN_AH7,
+       DB8540_PIN_AE7 };
+/* Basic pins of the MMC/SD card 0 interface */
+static const unsigned mc0_a_1_pins[] = { DB8540_PIN_AH11, DB8540_PIN_AG11,
+       DB8540_PIN_AF11, DB8540_PIN_AH10, DB8540_PIN_AG10, DB8540_PIN_AF10};
+/* MSP1 can only be on these pins, but TXD and RXD can be flipped */
+static const unsigned msp1txrx_a_1_pins[] = { DB8540_PIN_AD4, DB8540_PIN_AG4 };
+static const unsigned msp1_a_1_pins[] = { DB8540_PIN_AF3, DB8540_PIN_AF5 };
+
+static const unsigned modobsclk_a_1_pins[] = { DB8540_PIN_AF9 };
+static const unsigned clkoutreq_a_1_pins[] = { DB8540_PIN_AE8 };
+/* LCD interface */
+static const unsigned lcdb_a_1_pins[] = { DB8540_PIN_M26, DB8540_PIN_M25,
+       DB8540_PIN_M27, DB8540_PIN_N25 };
+static const unsigned lcdvsi0_a_1_pins[] = { DB8540_PIN_AJ24 };
+static const unsigned lcdvsi1_a_1_pins[] = { DB8540_PIN_AE21 };
+static const unsigned lcd_d0_d7_a_1_pins[] = { DB8540_PIN_M28, DB8540_PIN_N26,
+       DB8540_PIN_M22, DB8540_PIN_N22, DB8540_PIN_N27, DB8540_PIN_N28,
+       DB8540_PIN_P22, DB8540_PIN_P28 };
+/* D8 thru D11 often used as TVOUT lines */
+static const unsigned lcd_d8_d11_a_1_pins[] = { DB8540_PIN_P26, DB8540_PIN_T22,
+       DB8540_PIN_R27, DB8540_PIN_P27 };
+static const unsigned lcd_d12_d23_a_1_pins[] = { DB8540_PIN_R26, DB8540_PIN_R25,
+       DB8540_PIN_U22, DB8540_PIN_T27, DB8540_PIN_AG22, DB8540_PIN_AF21,
+       DB8540_PIN_AF24, DB8540_PIN_AH22, DB8540_PIN_AJ23, DB8540_PIN_AH21,
+       DB8540_PIN_AG20, DB8540_PIN_AE23 };
+static const unsigned kp_a_1_pins[] = { DB8540_PIN_AH20, DB8540_PIN_AG19,
+       DB8540_PIN_AF22, DB8540_PIN_AJ21, DB8540_PIN_T25, DB8540_PIN_T26 };
+/* MC2 has 8 data lines and no direction control, so only for (e)MMC */
+static const unsigned mc2_a_1_pins[] = { DB8540_PIN_AC27, DB8540_PIN_AD27,
+       DB8540_PIN_AE28, DB8540_PIN_AG26, DB8540_PIN_AF25, DB8540_PIN_AE27,
+       DB8540_PIN_AF27, DB8540_PIN_AG28, DB8540_PIN_AF28, DB8540_PIN_AG25,
+       DB8540_PIN_AG24 };
+static const unsigned ssp1_a_1_pins[] = {  DB8540_PIN_AD25, DB8540_PIN_AH25,
+       DB8540_PIN_AF26, DB8540_PIN_AF23 };
+static const unsigned ssp0_a_1_pins[] = { DB8540_PIN_AG23, DB8540_PIN_AE25,
+       DB8540_PIN_AH24, DB8540_PIN_AJ25 };
+static const unsigned i2c0_a_1_pins[] = { DB8540_PIN_AG27, DB8540_PIN_AH23 };
+/*
+ * Image processor GPIO pins are named "ipgpio" and have their own
+ * numberspace
+ */
+static const unsigned ipgpio0_a_1_pins[] = { DB8540_PIN_AE26 };
+static const unsigned ipgpio1_a_1_pins[] = { DB8540_PIN_AE24 };
+/* modem i2s interface */
+static const unsigned modi2s_a_1_pins[] = { DB8540_PIN_AD26, DB8540_PIN_AD28,
+       DB8540_PIN_AC28, DB8540_PIN_AC26 };
+static const unsigned spi2_a_1_pins[] = { DB8540_PIN_AF20, DB8540_PIN_AG21,
+       DB8540_PIN_AH19, DB8540_PIN_AE19 };
+static const unsigned u2txrx_a_1_pins[] = { DB8540_PIN_AG18, DB8540_PIN_AH17 };
+static const unsigned u2ctsrts_a_1_pins[] = { DB8540_PIN_AF19,
+       DB8540_PIN_AF18 };
+static const unsigned modsmb_a_1_pins[] = { DB8540_PIN_AF17, DB8540_PIN_AE17 };
+static const unsigned msp2sck_a_1_pins[] = { DB8540_PIN_J3 };
+static const unsigned msp2txdtcktfs_a_1_pins[] = { DB8540_PIN_H1, DB8540_PIN_J2,
+       DB8540_PIN_H2 };
+static const unsigned msp2rxd_a_1_pins[] = { DB8540_PIN_H3 };
+static const unsigned mc4_a_1_pins[] = { DB8540_PIN_H4, DB8540_PIN_G2,
+       DB8540_PIN_G3, DB8540_PIN_G4, DB8540_PIN_F2, DB8540_PIN_C6,
+       DB8540_PIN_B6, DB8540_PIN_B7, DB8540_PIN_A7, DB8540_PIN_D7,
+       DB8540_PIN_D8 };
+static const unsigned mc1_a_1_pins[] = { DB8540_PIN_F3, DB8540_PIN_E2,
+       DB8540_PIN_C7, DB8540_PIN_B8, DB8540_PIN_C10, DB8540_PIN_C8,
+       DB8540_PIN_C9 };
+/* mc1_a_2_pins exclude MC1_FBCLK */
+static const unsigned mc1_a_2_pins[] = { DB8540_PIN_F3,        DB8540_PIN_C7,
+       DB8540_PIN_B8, DB8540_PIN_C10, DB8540_PIN_C8,
+       DB8540_PIN_C9 };
+static const unsigned hsir_a_1_pins[] = { DB8540_PIN_B9, DB8540_PIN_A10,
+       DB8540_PIN_D9 };
+static const unsigned hsit_a_1_pins[] = { DB8540_PIN_B11, DB8540_PIN_B10,
+       DB8540_PIN_E10, DB8540_PIN_B12, DB8540_PIN_D10 };
+static const unsigned hsit_a_2_pins[] = { DB8540_PIN_B11, DB8540_PIN_B10,
+       DB8540_PIN_E10, DB8540_PIN_B12 };
+static const unsigned clkout1_a_1_pins[] = { DB8540_PIN_D11 };
+static const unsigned clkout1_a_2_pins[] = { DB8540_PIN_B13 };
+static const unsigned clkout2_a_1_pins[] = { DB8540_PIN_AJ6 };
+static const unsigned clkout2_a_2_pins[] = { DB8540_PIN_C12 };
+static const unsigned msp4_a_1_pins[] = { DB8540_PIN_B14, DB8540_PIN_E11 };
+static const unsigned usb_a_1_pins[] = { DB8540_PIN_D12, DB8540_PIN_D15,
+       DB8540_PIN_C13, DB8540_PIN_C14, DB8540_PIN_C18, DB8540_PIN_C16,
+       DB8540_PIN_B16, DB8540_PIN_D18, DB8540_PIN_C15, DB8540_PIN_C17,
+       DB8540_PIN_B17, DB8540_PIN_D17 };
+/* Altfunction B colum */
+static const unsigned apetrig_b_1_pins[] = { DB8540_PIN_AH6, DB8540_PIN_AG7 };
+static const unsigned modtrig_b_1_pins[] = { DB8540_PIN_AF2, DB8540_PIN_AD3 };
+static const unsigned i2c4_b_1_pins[] = { DB8540_PIN_AF6, DB8540_PIN_AG6 };
+static const unsigned i2c1_b_1_pins[] = { DB8540_PIN_AD5, DB8540_PIN_AF7 };
+static const unsigned i2c2_b_1_pins[] = { DB8540_PIN_AG5, DB8540_PIN_AH5 };
+static const unsigned i2c2_b_2_pins[] = { DB8540_PIN_AE4, DB8540_PIN_AD1 };
+static const unsigned msp0txrx_b_1_pins[] = { DB8540_PIN_AD2, DB8540_PIN_AC3 };
+static const unsigned i2c1_b_2_pins[] = { DB8540_PIN_AH7, DB8540_PIN_AE7 };
+static const unsigned stmmod_b_1_pins[] = { DB8540_PIN_AH11, DB8540_PIN_AF11,
+       DB8540_PIN_AH10, DB8540_PIN_AG10, DB8540_PIN_AF10 };
+static const unsigned moduartstmmux_b_1_pins[] = { DB8540_PIN_AG11 };
+static const unsigned msp1txrx_b_1_pins[] = { DB8540_PIN_AD4, DB8540_PIN_AG4 };
+static const unsigned kp_b_1_pins[] = { DB8540_PIN_AJ24, DB8540_PIN_AE21,
+       DB8540_PIN_M26, DB8540_PIN_M25, DB8540_PIN_M27, DB8540_PIN_N25,
+       DB8540_PIN_M28, DB8540_PIN_N26, DB8540_PIN_M22, DB8540_PIN_N22,
+       DB8540_PIN_N27, DB8540_PIN_N28, DB8540_PIN_P22, DB8540_PIN_P28,
+       DB8540_PIN_P26, DB8540_PIN_T22, DB8540_PIN_R27, DB8540_PIN_P27,
+       DB8540_PIN_R26, DB8540_PIN_R25 };
+static const unsigned u2txrx_b_1_pins[] = { DB8540_PIN_U22, DB8540_PIN_T27 };
+static const unsigned sm_b_1_pins[] = { DB8540_PIN_AG22, DB8540_PIN_AF21,
+       DB8540_PIN_AF24, DB8540_PIN_AH22, DB8540_PIN_AJ23, DB8540_PIN_AH21,
+       DB8540_PIN_AG20, DB8540_PIN_AE23, DB8540_PIN_AH20, DB8540_PIN_AF22,
+       DB8540_PIN_AJ21, DB8540_PIN_AC27, DB8540_PIN_AD27, DB8540_PIN_AE28,
+       DB8540_PIN_AG26, DB8540_PIN_AF25, DB8540_PIN_AE27, DB8540_PIN_AF27,
+       DB8540_PIN_AG28, DB8540_PIN_AF28, DB8540_PIN_AG25, DB8540_PIN_AG24,
+       DB8540_PIN_AD25 };
+static const unsigned smcs0_b_1_pins[] = { DB8540_PIN_AG19 };
+static const unsigned smcs1_b_1_pins[] = { DB8540_PIN_AE26 };
+static const unsigned ipgpio7_b_1_pins[] = { DB8540_PIN_AH25 };
+static const unsigned ipgpio2_b_1_pins[] = { DB8540_PIN_AF26 };
+static const unsigned ipgpio3_b_1_pins[] = { DB8540_PIN_AF23 };
+static const unsigned i2c6_b_1_pins[] = { DB8540_PIN_AG23, DB8540_PIN_AE25 };
+static const unsigned i2c5_b_1_pins[] = { DB8540_PIN_AH24, DB8540_PIN_AJ25 };
+static const unsigned u3txrx_b_1_pins[] = { DB8540_PIN_AF20, DB8540_PIN_AG21 };
+static const unsigned u3ctsrts_b_1_pins[] = { DB8540_PIN_AH19,
+       DB8540_PIN_AE19 };
+static const unsigned i2c5_b_2_pins[] = { DB8540_PIN_AG18, DB8540_PIN_AH17 };
+static const unsigned i2c4_b_2_pins[] = { DB8540_PIN_AF19, DB8540_PIN_AF18 };
+static const unsigned u4txrx_b_1_pins[] = { DB8540_PIN_AE18, DB8540_PIN_AG17 };
+static const unsigned u4ctsrts_b_1_pins[] = { DB8540_PIN_AF17,
+       DB8540_PIN_AE17 };
+static const unsigned ddrtrig_b_1_pins[] = { DB8540_PIN_J3 };
+static const unsigned msp4_b_1_pins[] = { DB8540_PIN_H3 };
+static const unsigned pwl_b_1_pins[] = { DB8540_PIN_C6 };
+static const unsigned spi1_b_1_pins[] = { DB8540_PIN_E2, DB8540_PIN_C10,
+       DB8540_PIN_C8, DB8540_PIN_C9 };
+static const unsigned mc3_b_1_pins[] = { DB8540_PIN_B9, DB8540_PIN_A10,
+       DB8540_PIN_D9, DB8540_PIN_B11, DB8540_PIN_B10, DB8540_PIN_E10,
+       DB8540_PIN_B12 };
+static const unsigned pwl_b_2_pins[] = { DB8540_PIN_D10 };
+static const unsigned pwl_b_3_pins[] = { DB8540_PIN_B13 };
+static const unsigned pwl_b_4_pins[] = { DB8540_PIN_C12 };
+static const unsigned u2txrx_b_2_pins[] = { DB8540_PIN_B17, DB8540_PIN_D17 };
+
+/* Altfunction C column */
+static const unsigned ipgpio6_c_1_pins[] = { DB8540_PIN_AG6 };
+static const unsigned ipgpio0_c_1_pins[] = { DB8540_PIN_AD5 };
+static const unsigned ipgpio1_c_1_pins[] = { DB8540_PIN_AF7 };
+static const unsigned ipgpio3_c_1_pins[] = { DB8540_PIN_AE4 };
+static const unsigned ipgpio2_c_1_pins[] = { DB8540_PIN_AD1 };
+static const unsigned u0_c_1_pins[] = { DB8540_PIN_AD4, DB8540_PIN_AF3,
+       DB8540_PIN_AF5, DB8540_PIN_AG4 };
+static const unsigned smcleale_c_1_pins[] = { DB8540_PIN_AJ24,
+       DB8540_PIN_AE21 };
+static const unsigned ipgpio4_c_1_pins[] = { DB8540_PIN_M26 };
+static const unsigned ipgpio5_c_1_pins[] = { DB8540_PIN_M25 };
+static const unsigned ipgpio6_c_2_pins[] = { DB8540_PIN_M27 };
+static const unsigned ipgpio7_c_1_pins[] = { DB8540_PIN_N25 };
+static const unsigned stmape_c_1_pins[] = { DB8540_PIN_M28, DB8540_PIN_N26,
+       DB8540_PIN_M22, DB8540_PIN_N22, DB8540_PIN_N27 };
+static const unsigned u2rxtx_c_1_pins[] = { DB8540_PIN_N28, DB8540_PIN_P22 };
+static const unsigned modobsresout_c_1_pins[] = { DB8540_PIN_P28 };
+static const unsigned ipgpio2_c_2_pins[] = { DB8540_PIN_P26 };
+static const unsigned ipgpio3_c_2_pins[] = { DB8540_PIN_T22 };
+static const unsigned ipgpio4_c_2_pins[] = { DB8540_PIN_R27 };
+static const unsigned ipgpio5_c_2_pins[] = { DB8540_PIN_P27 };
+static const unsigned modaccgpo_c_1_pins[] = { DB8540_PIN_R26, DB8540_PIN_R25,
+       DB8540_PIN_U22 };
+static const unsigned modobspwrrst_c_1_pins[] = { DB8540_PIN_T27 };
+static const unsigned mc5_c_1_pins[] = { DB8540_PIN_AG22, DB8540_PIN_AF21,
+       DB8540_PIN_AF24, DB8540_PIN_AH22, DB8540_PIN_AJ23, DB8540_PIN_AH21,
+       DB8540_PIN_AG20, DB8540_PIN_AE23, DB8540_PIN_AH20, DB8540_PIN_AF22,
+       DB8540_PIN_AJ21};
+static const unsigned smps0_c_1_pins[] = { DB8540_PIN_AG19 };
+static const unsigned moduart1_c_1_pins[] = { DB8540_PIN_T25, DB8540_PIN_T26 };
+static const unsigned mc2rstn_c_1_pins[] = { DB8540_PIN_AE28 };
+static const unsigned i2c5_c_1_pins[] = { DB8540_PIN_AG28, DB8540_PIN_AF28 };
+static const unsigned ipgpio0_c_2_pins[] = { DB8540_PIN_AG25 };
+static const unsigned ipgpio1_c_2_pins[] = { DB8540_PIN_AG24 };
+static const unsigned kp_c_1_pins[] = { DB8540_PIN_AD25, DB8540_PIN_AH25,
+       DB8540_PIN_AF26, DB8540_PIN_AF23 };
+static const unsigned modrf_c_1_pins[] = { DB8540_PIN_AG23, DB8540_PIN_AE25,
+       DB8540_PIN_AH24 };
+static const unsigned smps1_c_1_pins[] = { DB8540_PIN_AE26 };
+static const unsigned i2c5_c_2_pins[] = { DB8540_PIN_AH19, DB8540_PIN_AE19 };
+static const unsigned u4ctsrts_c_1_pins[] = { DB8540_PIN_AG18,
+       DB8540_PIN_AH17 };
+static const unsigned u3rxtx_c_1_pins[] = { DB8540_PIN_AF19, DB8540_PIN_AF18 };
+static const unsigned msp4_c_1_pins[] = { DB8540_PIN_J3 };
+static const unsigned mc4rstn_c_1_pins[] = { DB8540_PIN_C6 };
+static const unsigned spi0_c_1_pins[] = { DB8540_PIN_A10, DB8540_PIN_B10,
+       DB8540_PIN_E10, DB8540_PIN_B12 };
+static const unsigned i2c3_c_1_pins[] = { DB8540_PIN_B13, DB8540_PIN_C12 };
+
+/* Other alt C1 column */
+static const unsigned spi3_oc1_1_pins[] = { DB8540_PIN_AG5, DB8540_PIN_AH5,
+       DB8540_PIN_AE4, DB8540_PIN_AD1 };
+static const unsigned stmape_oc1_1_pins[] = { DB8540_PIN_AH11, DB8540_PIN_AF11,
+       DB8540_PIN_AH10, DB8540_PIN_AG10, DB8540_PIN_AF10 };
+static const unsigned u2_oc1_1_pins[] = { DB8540_PIN_AG11 };
+static const unsigned remap0_oc1_1_pins[] = { DB8540_PIN_AJ24 };
+static const unsigned remap1_oc1_1_pins[] = { DB8540_PIN_AE21 };
+static const unsigned modobsrefclk_oc1_1_pins[] = { DB8540_PIN_M26 };
+static const unsigned modobspwrctrl_oc1_1_pins[] = { DB8540_PIN_M25 };
+static const unsigned modobsclkout_oc1_1_pins[] = { DB8540_PIN_M27 };
+static const unsigned moduart1_oc1_1_pins[] = { DB8540_PIN_N25 };
+static const unsigned modprcmudbg_oc1_1_pins[] = { DB8540_PIN_M28,
+       DB8540_PIN_N26, DB8540_PIN_M22, DB8540_PIN_N22, DB8540_PIN_N27,
+       DB8540_PIN_P22, DB8540_PIN_P28, DB8540_PIN_P26, DB8540_PIN_T22,
+       DB8540_PIN_R26, DB8540_PIN_R25, DB8540_PIN_U22, DB8540_PIN_T27,
+       DB8540_PIN_AH20, DB8540_PIN_AG19, DB8540_PIN_AF22, DB8540_PIN_AJ21,
+       DB8540_PIN_T25};
+static const unsigned modobsresout_oc1_1_pins[] = { DB8540_PIN_N28 };
+static const unsigned modaccgpo_oc1_1_pins[] = { DB8540_PIN_R27, DB8540_PIN_P27,
+       DB8540_PIN_T26 };
+static const unsigned kp_oc1_1_pins[] = { DB8540_PIN_AG22, DB8540_PIN_AF21,
+       DB8540_PIN_AF24, DB8540_PIN_AH22, DB8540_PIN_AJ23, DB8540_PIN_AH21,
+       DB8540_PIN_AG20, DB8540_PIN_AE23 };
+static const unsigned modxmip_oc1_1_pins[] = { DB8540_PIN_AD25, DB8540_PIN_AH25,
+       DB8540_PIN_AG23, DB8540_PIN_AE25 };
+static const unsigned i2c6_oc1_1_pins[] = { DB8540_PIN_AE26, DB8540_PIN_AE24 };
+static const unsigned u2txrx_oc1_1_pins[] = { DB8540_PIN_B7, DB8540_PIN_A7 };
+static const unsigned u2ctsrts_oc1_1_pins[] = { DB8540_PIN_D7, DB8540_PIN_D8 };
+
+/* Other alt C2 column */
+static const unsigned sbag_oc2_1_pins[] = { DB8540_PIN_AH11, DB8540_PIN_AG11,
+       DB8540_PIN_AF11, DB8540_PIN_AH10, DB8540_PIN_AG10, DB8540_PIN_AF10 };
+static const unsigned hxclk_oc2_1_pins[] = { DB8540_PIN_M25 };
+static const unsigned modaccuart_oc2_1_pins[] = { DB8540_PIN_N25 };
+static const unsigned stmmod_oc2_1_pins[] = { DB8540_PIN_M28, DB8540_PIN_N26,
+       DB8540_PIN_M22, DB8540_PIN_N22, DB8540_PIN_N27 };
+static const unsigned moduartstmmux_oc2_1_pins[] = { DB8540_PIN_N28 };
+static const unsigned hxgpio_oc2_1_pins[] = { DB8540_PIN_P22, DB8540_PIN_P28,
+       DB8540_PIN_P26, DB8540_PIN_T22, DB8540_PIN_R27, DB8540_PIN_P27,
+       DB8540_PIN_R26, DB8540_PIN_R25 };
+static const unsigned sbag_oc2_2_pins[] = { DB8540_PIN_U22, DB8540_PIN_T27,
+       DB8540_PIN_AG22, DB8540_PIN_AF21, DB8540_PIN_AF24, DB8540_PIN_AH22 };
+static const unsigned modobsservice_oc2_1_pins[] = { DB8540_PIN_AJ23 };
+static const unsigned moduart0_oc2_1_pins[] = { DB8540_PIN_AG20,
+       DB8540_PIN_AE23 };
+static const unsigned stmape_oc2_1_pins[] = { DB8540_PIN_AH20, DB8540_PIN_AG19,
+       DB8540_PIN_AF22, DB8540_PIN_AJ21, DB8540_PIN_T25 };
+static const unsigned u2_oc2_1_pins[] = { DB8540_PIN_T26, DB8540_PIN_AH21 };
+static const unsigned modxmip_oc2_1_pins[] = { DB8540_PIN_AE26,
+       DB8540_PIN_AE24 };
+
+/* Other alt C3 column */
+static const unsigned modaccgpo_oc3_1_pins[] = { DB8540_PIN_AG11 };
+static const unsigned tpui_oc3_1_pins[] = { DB8540_PIN_M26, DB8540_PIN_M25,
+       DB8540_PIN_M27, DB8540_PIN_N25, DB8540_PIN_M28, DB8540_PIN_N26,
+       DB8540_PIN_M22, DB8540_PIN_N22, DB8540_PIN_N27, DB8540_PIN_N28,
+       DB8540_PIN_P22, DB8540_PIN_P28, DB8540_PIN_P26, DB8540_PIN_T22,
+       DB8540_PIN_R27, DB8540_PIN_P27, DB8540_PIN_R26, DB8540_PIN_R25,
+       DB8540_PIN_U22, DB8540_PIN_T27, DB8540_PIN_AG22, DB8540_PIN_AF21,
+       DB8540_PIN_AF24, DB8540_PIN_AH22, DB8540_PIN_AJ23, DB8540_PIN_AH21,
+       DB8540_PIN_AG20, DB8540_PIN_AE23, DB8540_PIN_AH20, DB8540_PIN_AG19,
+       DB8540_PIN_AF22, DB8540_PIN_AJ21, DB8540_PIN_T25, DB8540_PIN_T26 };
+
+/* Other alt C4 column */
+static const unsigned hwobs_oc4_1_pins[] = { DB8540_PIN_M26, DB8540_PIN_M25,
+       DB8540_PIN_M27, DB8540_PIN_N25, DB8540_PIN_M28, DB8540_PIN_N26,
+       DB8540_PIN_M22, DB8540_PIN_N22, DB8540_PIN_N27, DB8540_PIN_N28,
+       DB8540_PIN_P22, DB8540_PIN_P28, DB8540_PIN_P26, DB8540_PIN_T22,
+       DB8540_PIN_R27, DB8540_PIN_P27, DB8540_PIN_R26, DB8540_PIN_R25 };
+static const unsigned moduart1txrx_oc4_1_pins[] = { DB8540_PIN_U22,
+       DB8540_PIN_T27 };
+static const unsigned moduart1rtscts_oc4_1_pins[] = { DB8540_PIN_AG22,
+       DB8540_PIN_AF21 };
+static const unsigned modaccuarttxrx_oc4_1_pins[] = { DB8540_PIN_AF24,
+       DB8540_PIN_AH22 };
+static const unsigned modaccuartrtscts_oc4_1_pins[] = { DB8540_PIN_AJ23,
+       DB8540_PIN_AH21 };
+static const unsigned stmmod_oc4_1_pins[] = { DB8540_PIN_AH20, DB8540_PIN_AG19,
+       DB8540_PIN_AF22, DB8540_PIN_AJ21, DB8540_PIN_T25 };
+static const unsigned moduartstmmux_oc4_1_pins[] = { DB8540_PIN_T26 };
+
+#define DB8540_PIN_GROUP(a, b) { .name = #a, .pins = a##_pins,         \
+                       .npins = ARRAY_SIZE(a##_pins), .altsetting = b }
+
+static const struct nmk_pingroup nmk_db8540_groups[] = {
+       /* Altfunction A column */
+       DB8540_PIN_GROUP(u0_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(u1rxtx_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(u1ctsrts_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(ipi2c_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(ipi2c_a_2, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(msp0txrx_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(msp0tfstck_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(msp0rfsrck_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(mc0_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(msp1txrx_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(msp1_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(modobsclk_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(clkoutreq_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(lcdb_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(lcdvsi0_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(lcdvsi1_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(lcd_d0_d7_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(lcd_d8_d11_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(lcd_d12_d23_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(kp_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(mc2_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(ssp1_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(ssp0_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(i2c0_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(ipgpio0_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(ipgpio1_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(modi2s_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(spi2_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(u2txrx_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(u2ctsrts_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(modsmb_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(msp2sck_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(msp2txdtcktfs_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(msp2rxd_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(mc4_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(mc1_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(hsir_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(hsit_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(hsit_a_2, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(clkout1_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(clkout1_a_2, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(clkout2_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(clkout2_a_2, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(msp4_a_1, NMK_GPIO_ALT_A),
+       DB8540_PIN_GROUP(usb_a_1, NMK_GPIO_ALT_A),
+       /* Altfunction B column */
+       DB8540_PIN_GROUP(apetrig_b_1, NMK_GPIO_ALT_B),
+       DB8540_PIN_GROUP(modtrig_b_1, NMK_GPIO_ALT_B),
+       DB8540_PIN_GROUP(i2c4_b_1, NMK_GPIO_ALT_B),
+       DB8540_PIN_GROUP(i2c1_b_1, NMK_GPIO_ALT_B),
+       DB8540_PIN_GROUP(i2c2_b_1, NMK_GPIO_ALT_B),
+       DB8540_PIN_GROUP(i2c2_b_2, NMK_GPIO_ALT_B),
+       DB8540_PIN_GROUP(msp0txrx_b_1, NMK_GPIO_ALT_B),
+       DB8540_PIN_GROUP(i2c1_b_2, NMK_GPIO_ALT_B),
+       DB8540_PIN_GROUP(stmmod_b_1, NMK_GPIO_ALT_B),
+       DB8540_PIN_GROUP(moduartstmmux_b_1, NMK_GPIO_ALT_B),
+       DB8540_PIN_GROUP(msp1txrx_b_1, NMK_GPIO_ALT_B),
+       DB8540_PIN_GROUP(kp_b_1, NMK_GPIO_ALT_B),
+       DB8540_PIN_GROUP(u2txrx_b_1, NMK_GPIO_ALT_B),
+       DB8540_PIN_GROUP(sm_b_1, NMK_GPIO_ALT_B),
+       DB8540_PIN_GROUP(smcs0_b_1, NMK_GPIO_ALT_B),
+       DB8540_PIN_GROUP(smcs1_b_1, NMK_GPIO_ALT_B),
+       DB8540_PIN_GROUP(ipgpio7_b_1, NMK_GPIO_ALT_B),
+       DB8540_PIN_GROUP(ipgpio2_b_1, NMK_GPIO_ALT_B),
+       DB8540_PIN_GROUP(ipgpio3_b_1, NMK_GPIO_ALT_B),
+       DB8540_PIN_GROUP(i2c6_b_1, NMK_GPIO_ALT_B),
+       DB8540_PIN_GROUP(i2c5_b_1, NMK_GPIO_ALT_B),
+       DB8540_PIN_GROUP(u3txrx_b_1, NMK_GPIO_ALT_B),
+       DB8540_PIN_GROUP(u3ctsrts_b_1, NMK_GPIO_ALT_B),
+       DB8540_PIN_GROUP(i2c5_b_2, NMK_GPIO_ALT_B),
+       DB8540_PIN_GROUP(i2c4_b_2, NMK_GPIO_ALT_B),
+       DB8540_PIN_GROUP(u4txrx_b_1, NMK_GPIO_ALT_B),
+       DB8540_PIN_GROUP(u4ctsrts_b_1, NMK_GPIO_ALT_B),
+       DB8540_PIN_GROUP(ddrtrig_b_1, NMK_GPIO_ALT_B),
+       DB8540_PIN_GROUP(msp4_b_1, NMK_GPIO_ALT_B),
+       DB8540_PIN_GROUP(pwl_b_1, NMK_GPIO_ALT_B),
+       DB8540_PIN_GROUP(spi1_b_1, NMK_GPIO_ALT_B),
+       DB8540_PIN_GROUP(mc3_b_1, NMK_GPIO_ALT_B),
+       DB8540_PIN_GROUP(pwl_b_2, NMK_GPIO_ALT_B),
+       DB8540_PIN_GROUP(pwl_b_3, NMK_GPIO_ALT_B),
+       DB8540_PIN_GROUP(pwl_b_4, NMK_GPIO_ALT_B),
+       DB8540_PIN_GROUP(u2txrx_b_2, NMK_GPIO_ALT_B),
+       /* Altfunction C column */
+       DB8540_PIN_GROUP(ipgpio6_c_1, NMK_GPIO_ALT_C),
+       DB8540_PIN_GROUP(ipgpio0_c_1, NMK_GPIO_ALT_C),
+       DB8540_PIN_GROUP(ipgpio1_c_1, NMK_GPIO_ALT_C),
+       DB8540_PIN_GROUP(ipgpio3_c_1, NMK_GPIO_ALT_C),
+       DB8540_PIN_GROUP(ipgpio2_c_1, NMK_GPIO_ALT_C),
+       DB8540_PIN_GROUP(u0_c_1, NMK_GPIO_ALT_C),
+       DB8540_PIN_GROUP(smcleale_c_1, NMK_GPIO_ALT_C),
+       DB8540_PIN_GROUP(ipgpio4_c_1, NMK_GPIO_ALT_C),
+       DB8540_PIN_GROUP(ipgpio5_c_1, NMK_GPIO_ALT_C),
+       DB8540_PIN_GROUP(ipgpio6_c_2, NMK_GPIO_ALT_C),
+       DB8540_PIN_GROUP(ipgpio7_c_1, NMK_GPIO_ALT_C),
+       DB8540_PIN_GROUP(stmape_c_1, NMK_GPIO_ALT_C),
+       DB8540_PIN_GROUP(u2rxtx_c_1, NMK_GPIO_ALT_C),
+       DB8540_PIN_GROUP(modobsresout_c_1, NMK_GPIO_ALT_C),
+       DB8540_PIN_GROUP(ipgpio2_c_2, NMK_GPIO_ALT_C),
+       DB8540_PIN_GROUP(ipgpio3_c_2, NMK_GPIO_ALT_C),
+       DB8540_PIN_GROUP(ipgpio4_c_2, NMK_GPIO_ALT_C),
+       DB8540_PIN_GROUP(ipgpio5_c_2, NMK_GPIO_ALT_C),
+       DB8540_PIN_GROUP(modaccgpo_c_1, NMK_GPIO_ALT_C),
+       DB8540_PIN_GROUP(modobspwrrst_c_1, NMK_GPIO_ALT_C),
+       DB8540_PIN_GROUP(mc5_c_1, NMK_GPIO_ALT_C),
+       DB8540_PIN_GROUP(smps0_c_1, NMK_GPIO_ALT_C),
+       DB8540_PIN_GROUP(moduart1_c_1, NMK_GPIO_ALT_C),
+       DB8540_PIN_GROUP(mc2rstn_c_1, NMK_GPIO_ALT_C),
+       DB8540_PIN_GROUP(i2c5_c_1, NMK_GPIO_ALT_C),
+       DB8540_PIN_GROUP(ipgpio0_c_2, NMK_GPIO_ALT_C),
+       DB8540_PIN_GROUP(ipgpio1_c_2, NMK_GPIO_ALT_C),
+       DB8540_PIN_GROUP(kp_c_1, NMK_GPIO_ALT_C),
+       DB8540_PIN_GROUP(modrf_c_1, NMK_GPIO_ALT_C),
+       DB8540_PIN_GROUP(smps1_c_1, NMK_GPIO_ALT_C),
+       DB8540_PIN_GROUP(i2c5_c_2, NMK_GPIO_ALT_C),
+       DB8540_PIN_GROUP(u4ctsrts_c_1, NMK_GPIO_ALT_C),
+       DB8540_PIN_GROUP(u3rxtx_c_1, NMK_GPIO_ALT_C),
+       DB8540_PIN_GROUP(msp4_c_1, NMK_GPIO_ALT_C),
+       DB8540_PIN_GROUP(mc4rstn_c_1, NMK_GPIO_ALT_C),
+       DB8540_PIN_GROUP(spi0_c_1, NMK_GPIO_ALT_C),
+       DB8540_PIN_GROUP(i2c3_c_1, NMK_GPIO_ALT_C),
+
+       /* Other alt C1 column */
+       DB8540_PIN_GROUP(spi3_oc1_1, NMK_GPIO_ALT_C1),
+       DB8540_PIN_GROUP(stmape_oc1_1, NMK_GPIO_ALT_C1),
+       DB8540_PIN_GROUP(u2_oc1_1, NMK_GPIO_ALT_C1),
+       DB8540_PIN_GROUP(remap0_oc1_1, NMK_GPIO_ALT_C1),
+       DB8540_PIN_GROUP(remap1_oc1_1, NMK_GPIO_ALT_C1),
+       DB8540_PIN_GROUP(modobsrefclk_oc1_1, NMK_GPIO_ALT_C1),
+       DB8540_PIN_GROUP(modobspwrctrl_oc1_1, NMK_GPIO_ALT_C1),
+       DB8540_PIN_GROUP(modobsclkout_oc1_1, NMK_GPIO_ALT_C1),
+       DB8540_PIN_GROUP(moduart1_oc1_1, NMK_GPIO_ALT_C1),
+       DB8540_PIN_GROUP(modprcmudbg_oc1_1, NMK_GPIO_ALT_C1),
+       DB8540_PIN_GROUP(modobsresout_oc1_1, NMK_GPIO_ALT_C1),
+       DB8540_PIN_GROUP(modaccgpo_oc1_1, NMK_GPIO_ALT_C1),
+       DB8540_PIN_GROUP(kp_oc1_1, NMK_GPIO_ALT_C1),
+       DB8540_PIN_GROUP(modxmip_oc1_1, NMK_GPIO_ALT_C1),
+       DB8540_PIN_GROUP(i2c6_oc1_1, NMK_GPIO_ALT_C1),
+       DB8540_PIN_GROUP(u2txrx_oc1_1, NMK_GPIO_ALT_C1),
+       DB8540_PIN_GROUP(u2ctsrts_oc1_1, NMK_GPIO_ALT_C1),
+
+       /* Other alt C2 column */
+       DB8540_PIN_GROUP(sbag_oc2_1, NMK_GPIO_ALT_C2),
+       DB8540_PIN_GROUP(hxclk_oc2_1, NMK_GPIO_ALT_C2),
+       DB8540_PIN_GROUP(modaccuart_oc2_1, NMK_GPIO_ALT_C2),
+       DB8540_PIN_GROUP(stmmod_oc2_1, NMK_GPIO_ALT_C2),
+       DB8540_PIN_GROUP(moduartstmmux_oc2_1, NMK_GPIO_ALT_C2),
+       DB8540_PIN_GROUP(hxgpio_oc2_1, NMK_GPIO_ALT_C2),
+       DB8540_PIN_GROUP(sbag_oc2_2, NMK_GPIO_ALT_C2),
+       DB8540_PIN_GROUP(modobsservice_oc2_1, NMK_GPIO_ALT_C2),
+       DB8540_PIN_GROUP(moduart0_oc2_1, NMK_GPIO_ALT_C2),
+       DB8540_PIN_GROUP(stmape_oc2_1, NMK_GPIO_ALT_C2),
+       DB8540_PIN_GROUP(u2_oc2_1, NMK_GPIO_ALT_C2),
+       DB8540_PIN_GROUP(modxmip_oc2_1, NMK_GPIO_ALT_C2),
+
+       /* Other alt C3 column */
+       DB8540_PIN_GROUP(modaccgpo_oc3_1, NMK_GPIO_ALT_C3),
+       DB8540_PIN_GROUP(tpui_oc3_1, NMK_GPIO_ALT_C3),
+
+       /* Other alt C4 column */
+       DB8540_PIN_GROUP(hwobs_oc4_1, NMK_GPIO_ALT_C4),
+       DB8540_PIN_GROUP(moduart1txrx_oc4_1, NMK_GPIO_ALT_C4),
+       DB8540_PIN_GROUP(moduart1rtscts_oc4_1, NMK_GPIO_ALT_C4),
+       DB8540_PIN_GROUP(modaccuarttxrx_oc4_1, NMK_GPIO_ALT_C4),
+       DB8540_PIN_GROUP(modaccuartrtscts_oc4_1, NMK_GPIO_ALT_C4),
+       DB8540_PIN_GROUP(stmmod_oc4_1, NMK_GPIO_ALT_C4),
+       DB8540_PIN_GROUP(moduartstmmux_oc4_1, NMK_GPIO_ALT_C4),
+
+};
+
+/* We use this macro to define the groups applicable to a function */
+#define DB8540_FUNC_GROUPS(a, b...)       \
+static const char * const a##_groups[] = { b };
+
+DB8540_FUNC_GROUPS(apetrig, "apetrig_b_1");
+DB8540_FUNC_GROUPS(clkout, "clkoutreq_a_1", "clkout1_a_1", "clkout1_a_2",
+               "clkout2_a_1", "clkout2_a_2");
+DB8540_FUNC_GROUPS(ddrtrig, "ddrtrig_b_1");
+DB8540_FUNC_GROUPS(hsi, "hsir_a_1", "hsit_a_1", "hsit_a_2");
+DB8540_FUNC_GROUPS(hwobs, "hwobs_oc4_1");
+DB8540_FUNC_GROUPS(hx, "hxclk_oc2_1", "hxgpio_oc2_1");
+DB8540_FUNC_GROUPS(i2c0, "i2c0_a_1");
+DB8540_FUNC_GROUPS(i2c1, "i2c1_b_1", "i2c1_b_2");
+DB8540_FUNC_GROUPS(i2c2, "i2c2_b_1", "i2c2_b_2");
+DB8540_FUNC_GROUPS(i2c3, "i2c3_c_1", "i2c4_b_1");
+DB8540_FUNC_GROUPS(i2c4, "i2c4_b_2");
+DB8540_FUNC_GROUPS(i2c5, "i2c5_b_1", "i2c5_b_2", "i2c5_c_1", "i2c5_c_2");
+DB8540_FUNC_GROUPS(i2c6, "i2c6_b_1", "i2c6_oc1_1");
+/* The image processor has 8 GPIO pins that can be muxed out */
+DB8540_FUNC_GROUPS(ipgpio, "ipgpio0_a_1", "ipgpio0_c_1", "ipgpio0_c_2",
+               "ipgpio1_a_1", "ipgpio1_c_1", "ipgpio1_c_2",
+               "ipgpio2_b_1", "ipgpio2_c_1", "ipgpio2_c_2",
+               "ipgpio3_b_1", "ipgpio3_c_1", "ipgpio3_c_2",
+               "ipgpio4_c_1", "ipgpio4_c_2",
+               "ipgpio5_c_1", "ipgpio5_c_2",
+               "ipgpio6_c_1", "ipgpio6_c_2",
+               "ipgpio7_b_1", "ipgpio7_c_1");
+DB8540_FUNC_GROUPS(ipi2c, "ipi2c_a_1", "ipi2c_a_2");
+DB8540_FUNC_GROUPS(kp, "kp_a_1", "kp_b_1", "kp_c_1", "kp_oc1_1");
+DB8540_FUNC_GROUPS(lcd, "lcd_d0_d7_a_1", "lcd_d12_d23_a_1", "lcd_d8_d11_a_1",
+               "lcdvsi0_a_1", "lcdvsi1_a_1");
+DB8540_FUNC_GROUPS(lcdb, "lcdb_a_1");
+DB8540_FUNC_GROUPS(mc0, "mc0_a_1");
+DB8540_FUNC_GROUPS(mc1, "mc1_a_1", "mc1_a_2");
+DB8540_FUNC_GROUPS(mc2, "mc2_a_1", "mc2rstn_c_1");
+DB8540_FUNC_GROUPS(mc3, "mc3_b_1");
+DB8540_FUNC_GROUPS(mc4, "mc4_a_1", "mc4rstn_c_1");
+DB8540_FUNC_GROUPS(mc5, "mc5_c_1");
+DB8540_FUNC_GROUPS(modaccgpo, "modaccgpo_c_1", "modaccgpo_oc1_1",
+               "modaccgpo_oc3_1");
+DB8540_FUNC_GROUPS(modaccuart, "modaccuart_oc2_1", "modaccuarttxrx_oc4_1",
+               "modaccuartrtccts_oc4_1");
+DB8540_FUNC_GROUPS(modi2s, "modi2s_a_1");
+DB8540_FUNC_GROUPS(modobs, "modobsclk_a_1", "modobsclkout_oc1_1",
+               "modobspwrctrl_oc1_1", "modobspwrrst_c_1",
+               "modobsrefclk_oc1_1", "modobsresout_c_1",
+               "modobsresout_oc1_1", "modobsservice_oc2_1");
+DB8540_FUNC_GROUPS(modprcmudbg, "modprcmudbg_oc1_1");
+DB8540_FUNC_GROUPS(modrf, "modrf_c_1");
+DB8540_FUNC_GROUPS(modsmb, "modsmb_a_1");
+DB8540_FUNC_GROUPS(modtrig, "modtrig_b_1");
+DB8540_FUNC_GROUPS(moduart, "moduart1_c_1", "moduart1_oc1_1",
+               "moduart1txrx_oc4_1", "moduart1rtscts_oc4_1", "moduart0_oc2_1");
+DB8540_FUNC_GROUPS(moduartstmmux, "moduartstmmux_b_1", "moduartstmmux_oc2_1",
+               "moduartstmmux_oc4_1");
+DB8540_FUNC_GROUPS(modxmip, "modxmip_oc1_1", "modxmip_oc2_1");
+/*
+ * MSP0 can only be on a certain set of pins, but the TX/RX pins can be
+ * switched around by selecting the altfunction A or B.
+ */
+DB8540_FUNC_GROUPS(msp0, "msp0rfsrck_a_1", "msp0tfstck_a_1", "msp0txrx_a_1",
+               "msp0txrx_b_1");
+DB8540_FUNC_GROUPS(msp1, "msp1_a_1", "msp1txrx_a_1", "msp1txrx_b_1");
+DB8540_FUNC_GROUPS(msp2, "msp2sck_a_1", "msp2txdtcktfs_a_1", "msp2rxd_a_1");
+DB8540_FUNC_GROUPS(msp4, "msp4_a_1", "msp4_b_1", "msp4_c_1");
+DB8540_FUNC_GROUPS(pwl, "pwl_b_1", "pwl_b_2", "pwl_b_3", "pwl_b_4");
+DB8540_FUNC_GROUPS(remap, "remap0_oc1_1", "remap1_oc1_1");
+DB8540_FUNC_GROUPS(sbag, "sbag_oc2_1", "sbag_oc2_2");
+/* Select between CS0 on alt B or PS1 on alt C */
+DB8540_FUNC_GROUPS(sm, "sm_b_1", "smcleale_c_1", "smcs0_b_1", "smcs1_b_1",
+               "smps0_c_1", "smps1_c_1");
+DB8540_FUNC_GROUPS(spi0, "spi0_c_1");
+DB8540_FUNC_GROUPS(spi1, "spi1_b_1");
+DB8540_FUNC_GROUPS(spi2, "spi2_a_1");
+DB8540_FUNC_GROUPS(spi3, "spi3_oc1_1");
+DB8540_FUNC_GROUPS(ssp0, "ssp0_a_1");
+DB8540_FUNC_GROUPS(ssp1, "ssp1_a_1");
+DB8540_FUNC_GROUPS(stmape, "stmape_c_1", "stmape_oc1_1", "stmape_oc2_1");
+DB8540_FUNC_GROUPS(stmmod, "stmmod_b_1", "stmmod_oc2_1", "stmmod_oc4_1");
+DB8540_FUNC_GROUPS(tpui, "tpui_oc3_1");
+DB8540_FUNC_GROUPS(u0, "u0_a_1", "u0_c_1");
+DB8540_FUNC_GROUPS(u1, "u1ctsrts_a_1", "u1rxtx_a_1");
+DB8540_FUNC_GROUPS(u2, "u2_oc1_1", "u2_oc2_1", "u2ctsrts_a_1", "u2ctsrts_oc1_1",
+               "u2rxtx_c_1", "u2txrx_a_1", "u2txrx_b_1", "u2txrx_b_2",
+               "u2txrx_oc1_1");
+DB8540_FUNC_GROUPS(u3, "u3ctsrts_b_1", "u3rxtx_c_1", "u3txrxa_b_1");
+DB8540_FUNC_GROUPS(u4, "u4ctsrts_b_1", "u4ctsrts_c_1", "u4txrx_b_1");
+DB8540_FUNC_GROUPS(usb, "usb_a_1");
+
+
+#define FUNCTION(fname)                                        \
+       {                                               \
+               .name = #fname,                         \
+               .groups = fname##_groups,               \
+               .ngroups = ARRAY_SIZE(fname##_groups),  \
+       }
+
+static const struct nmk_function nmk_db8540_functions[] = {
+       FUNCTION(apetrig),
+       FUNCTION(clkout),
+       FUNCTION(ddrtrig),
+       FUNCTION(hsi),
+       FUNCTION(hwobs),
+       FUNCTION(hx),
+       FUNCTION(i2c0),
+       FUNCTION(i2c1),
+       FUNCTION(i2c2),
+       FUNCTION(i2c3),
+       FUNCTION(i2c4),
+       FUNCTION(i2c5),
+       FUNCTION(i2c6),
+       FUNCTION(ipgpio),
+       FUNCTION(ipi2c),
+       FUNCTION(kp),
+       FUNCTION(lcd),
+       FUNCTION(lcdb),
+       FUNCTION(mc0),
+       FUNCTION(mc1),
+       FUNCTION(mc2),
+       FUNCTION(mc3),
+       FUNCTION(mc4),
+       FUNCTION(mc5),
+       FUNCTION(modaccgpo),
+       FUNCTION(modaccuart),
+       FUNCTION(modi2s),
+       FUNCTION(modobs),
+       FUNCTION(modprcmudbg),
+       FUNCTION(modrf),
+       FUNCTION(modsmb),
+       FUNCTION(modtrig),
+       FUNCTION(moduart),
+       FUNCTION(modxmip),
+       FUNCTION(msp0),
+       FUNCTION(msp1),
+       FUNCTION(msp2),
+       FUNCTION(msp4),
+       FUNCTION(pwl),
+       FUNCTION(remap),
+       FUNCTION(sbag),
+       FUNCTION(sm),
+       FUNCTION(spi0),
+       FUNCTION(spi1),
+       FUNCTION(spi2),
+       FUNCTION(spi3),
+       FUNCTION(ssp0),
+       FUNCTION(ssp1),
+       FUNCTION(stmape),
+       FUNCTION(stmmod),
+       FUNCTION(tpui),
+       FUNCTION(u0),
+       FUNCTION(u1),
+       FUNCTION(u2),
+       FUNCTION(u3),
+       FUNCTION(u4),
+       FUNCTION(usb)
+};
+
+static const struct prcm_gpiocr_altcx_pin_desc db8540_altcx_pins[] = {
+       PRCM_GPIOCR_ALTCX(8,    true, PRCM_IDX_GPIOCR1, 20,     /* SPI3_CLK */
+                               false, 0, 0,
+                               false, 0, 0,
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(9,    true, PRCM_IDX_GPIOCR1, 20,     /* SPI3_RXD */
+                               false, 0, 0,
+                               false, 0, 0,
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(10,   true, PRCM_IDX_GPIOCR1, 20,     /* SPI3_FRM */
+                               false, 0, 0,
+                               false, 0, 0,
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(11,   true, PRCM_IDX_GPIOCR1, 20,     /* SPI3_TXD */
+                               false, 0, 0,
+                               false, 0, 0,
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(23,   true, PRCM_IDX_GPIOCR1, 9,      /* STMAPE_CLK_a */
+                               true, PRCM_IDX_GPIOCR2, 10,     /* SBAG_CLK_a */
+                               false, 0, 0,
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(24,   true, PRCM_IDX_GPIOCR3, 30,     /* U2_RXD_g */
+                               true, PRCM_IDX_GPIOCR2, 10,     /* SBAG_VAL_a */
+                               false, 0, 0,
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(25,   true, PRCM_IDX_GPIOCR1, 9,      /* STMAPE_DAT_a[0] */
+                               true, PRCM_IDX_GPIOCR2, 10,     /* SBAG_D_a[0] */
+                               false, 0, 0,
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(26,   true, PRCM_IDX_GPIOCR1, 9,      /* STMAPE_DAT_a[1] */
+                               true, PRCM_IDX_GPIOCR2, 10,     /* SBAG_D_a[1] */
+                               false, 0, 0,
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(27,   true, PRCM_IDX_GPIOCR1, 9,      /* STMAPE_DAT_a[2] */
+                               true, PRCM_IDX_GPIOCR2, 10,     /* SBAG_D_a[2] */
+                               false, 0, 0,
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(28,   true, PRCM_IDX_GPIOCR1, 9,      /* STMAPE_DAT_a[3] */
+                               true, PRCM_IDX_GPIOCR2, 10,     /* SBAG_D_a[3] */
+                               false, 0, 0,
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(64,   true, PRCM_IDX_GPIOCR1, 15,     /* MODOBS_REFCLK_REQ */
+                               false, 0, 0,
+                               true, PRCM_IDX_GPIOCR1, 2,      /* TPIU_CTL */
+                               true, PRCM_IDX_GPIOCR2, 23      /* HW_OBS_APE_PRCMU[17] */
+       ),
+       PRCM_GPIOCR_ALTCX(65,   true, PRCM_IDX_GPIOCR1, 19,     /* MODOBS_PWRCTRL0 */
+                               true, PRCM_IDX_GPIOCR1, 24,     /* Hx_CLK */
+                               true, PRCM_IDX_GPIOCR1, 2,      /* TPIU_CLK */
+                               true, PRCM_IDX_GPIOCR2, 24      /* HW_OBS_APE_PRCMU[16] */
+       ),
+       PRCM_GPIOCR_ALTCX(66,   true, PRCM_IDX_GPIOCR1, 15,     /* MODOBS_CLKOUT1 */
+                               false, 0, 0,
+                               true, PRCM_IDX_GPIOCR1, 2,      /* TPIU_D[15] */
+                               true, PRCM_IDX_GPIOCR2, 25      /* HW_OBS_APE_PRCMU[15] */
+       ),
+       PRCM_GPIOCR_ALTCX(67,   true, PRCM_IDX_GPIOCR1, 1,      /* MODUART1_TXD_a */
+                               true, PRCM_IDX_GPIOCR1, 6,      /* MODACCUART_TXD_a */
+                               true, PRCM_IDX_GPIOCR1, 2,      /* TPIU_D[14] */
+                               true, PRCM_IDX_GPIOCR2, 26      /* HW_OBS_APE_PRCMU[14] */
+       ),
+       PRCM_GPIOCR_ALTCX(70,   true, PRCM_IDX_GPIOCR3, 6,      /* MOD_PRCMU_DEBUG[17] */
+                               true, PRCM_IDX_GPIOCR1, 10,     /* STMMOD_CLK_b */
+                               true, PRCM_IDX_GPIOCR1, 2,      /* TPIU_D[13] */
+                               true, PRCM_IDX_GPIOCR2, 27      /* HW_OBS_APE_PRCMU[13] */
+       ),
+       PRCM_GPIOCR_ALTCX(71,   true, PRCM_IDX_GPIOCR3, 6,      /* MOD_PRCMU_DEBUG[16] */
+                               true, PRCM_IDX_GPIOCR1, 10,     /* STMMOD_DAT_b[3] */
+                               true, PRCM_IDX_GPIOCR1, 2,      /* TPIU_D[12] */
+                               true, PRCM_IDX_GPIOCR2, 27      /* HW_OBS_APE_PRCMU[12] */
+       ),
+       PRCM_GPIOCR_ALTCX(72,   true, PRCM_IDX_GPIOCR3, 6,      /* MOD_PRCMU_DEBUG[15] */
+                               true, PRCM_IDX_GPIOCR1, 10,     /* STMMOD_DAT_b[2] */
+                               true, PRCM_IDX_GPIOCR1, 2,      /* TPIU_D[11] */
+                               true, PRCM_IDX_GPIOCR2, 27      /* HW_OBS_APE_PRCMU[11] */
+       ),
+       PRCM_GPIOCR_ALTCX(73,   true, PRCM_IDX_GPIOCR3, 6,      /* MOD_PRCMU_DEBUG[14] */
+                               true, PRCM_IDX_GPIOCR1, 10,     /* STMMOD_DAT_b[1] */
+                               true, PRCM_IDX_GPIOCR1, 2,      /* TPIU_D[10] */
+                               true, PRCM_IDX_GPIOCR2, 27      /* HW_OBS_APE_PRCMU[10] */
+       ),
+       PRCM_GPIOCR_ALTCX(74,   true, PRCM_IDX_GPIOCR3, 6,      /* MOD_PRCMU_DEBUG[13] */
+                               true, PRCM_IDX_GPIOCR1, 10,     /* STMMOD_DAT_b[0] */
+                               true, PRCM_IDX_GPIOCR1, 2,      /* TPIU_D[9] */
+                               true, PRCM_IDX_GPIOCR2, 27      /* HW_OBS_APE_PRCMU[9] */
+       ),
+       PRCM_GPIOCR_ALTCX(75,   true, PRCM_IDX_GPIOCR1, 12,     /* MODOBS_RESOUT0_N */
+                               true, PRCM_IDX_GPIOCR2, 1,      /* MODUART_STMMUX_RXD_b */
+                               true, PRCM_IDX_GPIOCR1, 2,      /* TPIU_D[8] */
+                               true, PRCM_IDX_GPIOCR2, 28      /* HW_OBS_APE_PRCMU[8] */
+       ),
+       PRCM_GPIOCR_ALTCX(76,   true, PRCM_IDX_GPIOCR3, 7,      /* MOD_PRCMU_DEBUG[12] */
+                               true, PRCM_IDX_GPIOCR1, 25,     /* Hx_GPIO[7] */
+                               true, PRCM_IDX_GPIOCR1, 2,      /* TPIU_D[7] */
+                               true, PRCM_IDX_GPIOCR2, 29      /* HW_OBS_APE_PRCMU[7] */
+       ),
+       PRCM_GPIOCR_ALTCX(77,   true, PRCM_IDX_GPIOCR3, 7,      /* MOD_PRCMU_DEBUG[11] */
+                               true, PRCM_IDX_GPIOCR1, 25,     /* Hx_GPIO[6] */
+                               true, PRCM_IDX_GPIOCR1, 2,      /* TPIU_D[6] */
+                               true, PRCM_IDX_GPIOCR2, 29      /* HW_OBS_APE_PRCMU[6] */
+       ),
+       PRCM_GPIOCR_ALTCX(78,   true, PRCM_IDX_GPIOCR3, 7,      /* MOD_PRCMU_DEBUG[10] */
+                               true, PRCM_IDX_GPIOCR1, 25,     /* Hx_GPIO[5] */
+                               true, PRCM_IDX_GPIOCR1, 2,      /* TPIU_D[5] */
+                               true, PRCM_IDX_GPIOCR2, 29      /* HW_OBS_APE_PRCMU[5] */
+       ),
+       PRCM_GPIOCR_ALTCX(79,   true, PRCM_IDX_GPIOCR3, 7,      /* MOD_PRCMU_DEBUG[9] */
+                               true, PRCM_IDX_GPIOCR1, 25,     /* Hx_GPIO[4] */
+                               true, PRCM_IDX_GPIOCR1, 2,      /* TPIU_D[4] */
+                               true, PRCM_IDX_GPIOCR2, 29      /* HW_OBS_APE_PRCMU[4] */
+       ),
+       PRCM_GPIOCR_ALTCX(80,   true, PRCM_IDX_GPIOCR1, 26,     /* MODACC_GPO[0] */
+                               true, PRCM_IDX_GPIOCR1, 25,     /* Hx_GPIO[3] */
+                               true, PRCM_IDX_GPIOCR1, 2,      /* TPIU_D[3] */
+                               true, PRCM_IDX_GPIOCR2, 30      /* HW_OBS_APE_PRCMU[3] */
+       ),
+       PRCM_GPIOCR_ALTCX(81,   true, PRCM_IDX_GPIOCR2, 17,     /* MODACC_GPO[1] */
+                               true, PRCM_IDX_GPIOCR1, 25,     /* Hx_GPIO[2] */
+                               true, PRCM_IDX_GPIOCR1, 2,      /* TPIU_D[2] */
+                               true, PRCM_IDX_GPIOCR2, 30      /* HW_OBS_APE_PRCMU[2] */
+       ),
+       PRCM_GPIOCR_ALTCX(82,   true, PRCM_IDX_GPIOCR3, 8,      /* MOD_PRCMU_DEBUG[8] */
+                               true, PRCM_IDX_GPIOCR1, 25,     /* Hx_GPIO[1] */
+                               true, PRCM_IDX_GPIOCR1, 2,      /* TPIU_D[1] */
+                               true, PRCM_IDX_GPIOCR2, 31      /* HW_OBS_APE_PRCMU[1] */
+       ),
+       PRCM_GPIOCR_ALTCX(83,   true, PRCM_IDX_GPIOCR3, 8,      /* MOD_PRCMU_DEBUG[7] */
+                               true, PRCM_IDX_GPIOCR1, 25,     /* Hx_GPIO[0] */
+                               true, PRCM_IDX_GPIOCR1, 2,      /* TPIU_D[0] */
+                               true, PRCM_IDX_GPIOCR2, 31      /* HW_OBS_APE_PRCMU[0] */
+       ),
+       PRCM_GPIOCR_ALTCX(84,   true, PRCM_IDX_GPIOCR3, 9,      /* MOD_PRCMU_DEBUG[6] */
+                               true, PRCM_IDX_GPIOCR1, 8,      /* SBAG_CLK_b */
+                               true, PRCM_IDX_GPIOCR1, 3,      /* TPIU_D[23] */
+                               true, PRCM_IDX_GPIOCR1, 16      /* MODUART1_RXD_b */
+       ),
+       PRCM_GPIOCR_ALTCX(85,   true, PRCM_IDX_GPIOCR3, 9,      /* MOD_PRCMU_DEBUG[5] */
+                               true, PRCM_IDX_GPIOCR1, 8,      /* SBAG_D_b[3] */
+                               true, PRCM_IDX_GPIOCR1, 3,      /* TPIU_D[22] */
+                               true, PRCM_IDX_GPIOCR1, 16      /* MODUART1_TXD_b */
+       ),
+       PRCM_GPIOCR_ALTCX(86,   true, PRCM_IDX_GPIOCR3, 9,      /* MOD_PRCMU_DEBUG[0] */
+                               true, PRCM_IDX_GPIOCR2, 18,     /* STMAPE_DAT_b[0] */
+                               true, PRCM_IDX_GPIOCR1, 14,     /* TPIU_D[25] */
+                               true, PRCM_IDX_GPIOCR1, 11      /* STMMOD_DAT_c[0] */
+       ),
+       PRCM_GPIOCR_ALTCX(87,   true, PRCM_IDX_GPIOCR3, 0,      /* MODACC_GPO_a[5] */
+                               true, PRCM_IDX_GPIOCR2, 3,      /* U2_RXD_c */
+                               true, PRCM_IDX_GPIOCR1, 4,      /* TPIU_D[24] */
+                               true, PRCM_IDX_GPIOCR1, 21      /* MODUART_STMMUX_RXD_c */
+       ),
+       PRCM_GPIOCR_ALTCX(151,  true, PRCM_IDX_GPIOCR1, 18,     /* REMAP0 */
+                               false, 0, 0,
+                               false, 0, 0,
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(152,  true, PRCM_IDX_GPIOCR1, 18,     /* REMAP1 */
+                               false, 0, 0,
+                               false, 0, 0,
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(153,  true, PRCM_IDX_GPIOCR3, 2,      /* KP_O_b[6] */
+                               true, PRCM_IDX_GPIOCR1, 8,      /* SBAG_D_b[2] */
+                               true, PRCM_IDX_GPIOCR1, 3,      /* TPIU_D[21] */
+                               true, PRCM_IDX_GPIOCR1, 0       /* MODUART1_RTS */
+       ),
+       PRCM_GPIOCR_ALTCX(154,  true, PRCM_IDX_GPIOCR3, 2,      /* KP_I_b[6] */
+                               true, PRCM_IDX_GPIOCR1, 8,      /* SBAG_D_b[1] */
+                               true, PRCM_IDX_GPIOCR1, 3,      /* TPIU_D[20] */
+                               true, PRCM_IDX_GPIOCR1, 0       /* MODUART1_CTS */
+       ),
+       PRCM_GPIOCR_ALTCX(155,  true, PRCM_IDX_GPIOCR3, 3,      /* KP_O_b[5] */
+                               true, PRCM_IDX_GPIOCR1, 8,      /* SBAG_D_b[0] */
+                               true, PRCM_IDX_GPIOCR1, 3,      /* TPIU_D[19] */
+                               true, PRCM_IDX_GPIOCR1, 5       /* MODACCUART_RXD_c */
+       ),
+       PRCM_GPIOCR_ALTCX(156,  true, PRCM_IDX_GPIOCR3, 3,      /* KP_O_b[4] */
+                               true, PRCM_IDX_GPIOCR1, 8,      /* SBAG_VAL_b */
+                               true, PRCM_IDX_GPIOCR1, 3,      /* TPIU_D[18] */
+                               true, PRCM_IDX_GPIOCR1, 5       /* MODACCUART_TXD_b */
+       ),
+       PRCM_GPIOCR_ALTCX(157,  true, PRCM_IDX_GPIOCR3, 4,      /* KP_I_b[5] */
+                               true, PRCM_IDX_GPIOCR1, 23,     /* MODOBS_SERVICE_N */
+                               true, PRCM_IDX_GPIOCR1, 3,      /* TPIU_D[17] */
+                               true, PRCM_IDX_GPIOCR1, 14      /* MODACCUART_RTS */
+       ),
+       PRCM_GPIOCR_ALTCX(158,  true, PRCM_IDX_GPIOCR3, 4,      /* KP_I_b[4] */
+                               true, PRCM_IDX_GPIOCR2, 0,      /* U2_TXD_c */
+                               true, PRCM_IDX_GPIOCR1, 3,      /* TPIU_D[16] */
+                               true, PRCM_IDX_GPIOCR1, 14      /* MODACCUART_CTS */
+       ),
+       PRCM_GPIOCR_ALTCX(159,  true, PRCM_IDX_GPIOCR3, 5,      /* KP_O_b[3] */
+                               true, PRCM_IDX_GPIOCR3, 10,     /* MODUART0_RXD */
+                               true, PRCM_IDX_GPIOCR1, 4,      /* TPIU_D[31] */
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(160,  true, PRCM_IDX_GPIOCR3, 5,      /* KP_I_b[3] */
+                               true, PRCM_IDX_GPIOCR3, 10,     /* MODUART0_TXD */
+                               true, PRCM_IDX_GPIOCR1, 4,      /* TPIU_D[30] */
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(161,  true, PRCM_IDX_GPIOCR3, 9,      /* MOD_PRCMU_DEBUG[4] */
+                               true, PRCM_IDX_GPIOCR2, 18,     /* STMAPE_CLK_b */
+                               true, PRCM_IDX_GPIOCR1, 4,      /* TPIU_D[29] */
+                               true, PRCM_IDX_GPIOCR1, 11      /* STMMOD_CLK_c */
+       ),
+       PRCM_GPIOCR_ALTCX(162,  true, PRCM_IDX_GPIOCR3, 9,      /* MOD_PRCMU_DEBUG[3] */
+                               true, PRCM_IDX_GPIOCR2, 18,     /* STMAPE_DAT_b[3] */
+                               true, PRCM_IDX_GPIOCR1, 4,      /* TPIU_D[28] */
+                               true, PRCM_IDX_GPIOCR1, 11      /* STMMOD_DAT_c[3] */
+       ),
+       PRCM_GPIOCR_ALTCX(163,  true, PRCM_IDX_GPIOCR3, 9,      /* MOD_PRCMU_DEBUG[2] */
+                               true, PRCM_IDX_GPIOCR2, 18,     /* STMAPE_DAT_b[2] */
+                               true, PRCM_IDX_GPIOCR1, 4,      /* TPIU_D[27] */
+                               true, PRCM_IDX_GPIOCR1, 11      /* STMMOD_DAT_c[2] */
+       ),
+       PRCM_GPIOCR_ALTCX(164,  true, PRCM_IDX_GPIOCR3, 9,      /* MOD_PRCMU_DEBUG[1] */
+                               true, PRCM_IDX_GPIOCR2, 18,     /* STMAPE_DAT_b[1] */
+                               true, PRCM_IDX_GPIOCR1, 4,      /* TPIU_D[26] */
+                               true, PRCM_IDX_GPIOCR1, 11      /* STMMOD_DAT_c[1] */
+       ),
+       PRCM_GPIOCR_ALTCX(204,  true, PRCM_IDX_GPIOCR2, 2,      /* U2_RXD_f */
+                               false, 0, 0,
+                               false, 0, 0,
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(205,  true, PRCM_IDX_GPIOCR2, 2,      /* U2_TXD_f */
+                               false, 0, 0,
+                               false, 0, 0,
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(206,  true, PRCM_IDX_GPIOCR2, 2,      /* U2_CTSn_b */
+                               false, 0, 0,
+                               false, 0, 0,
+                               false, 0, 0
+       ),
+       PRCM_GPIOCR_ALTCX(207,  true, PRCM_IDX_GPIOCR2, 2,      /* U2_RTSn_b */
+                               false, 0, 0,
+                               false, 0, 0,
+                               false, 0, 0
+       ),
+};
+
+static const u16 db8540_prcm_gpiocr_regs[] = {
+       [PRCM_IDX_GPIOCR1] = 0x138,
+       [PRCM_IDX_GPIOCR2] = 0x574,
+       [PRCM_IDX_GPIOCR3] = 0x2bc,
+};
+
+static const struct nmk_pinctrl_soc_data nmk_db8540_soc = {
+       .gpio_ranges = nmk_db8540_ranges,
+       .gpio_num_ranges = ARRAY_SIZE(nmk_db8540_ranges),
+       .pins = nmk_db8540_pins,
+       .npins = ARRAY_SIZE(nmk_db8540_pins),
+       .functions = nmk_db8540_functions,
+       .nfunctions = ARRAY_SIZE(nmk_db8540_functions),
+       .groups = nmk_db8540_groups,
+       .ngroups = ARRAY_SIZE(nmk_db8540_groups),
+       .altcx_pins = db8540_altcx_pins,
+       .npins_altcx = ARRAY_SIZE(db8540_altcx_pins),
+       .prcm_gpiocr_registers = db8540_prcm_gpiocr_regs,
+};
+
+void nmk_pinctrl_db8540_init(const struct nmk_pinctrl_soc_data **soc)
+{
+       *soc = &nmk_db8540_soc;
+}
diff --git a/drivers/pinctrl/nomadik/pinctrl-nomadik-stn8815.c b/drivers/pinctrl/nomadik/pinctrl-nomadik-stn8815.c
new file mode 100644 (file)
index 0000000..ed39dca
--- /dev/null
@@ -0,0 +1,356 @@
+#include <linux/kernel.h>
+#include <linux/pinctrl/pinctrl.h>
+#include "pinctrl-nomadik.h"
+
+/* All the pins that can be used for GPIO and some other functions */
+#define _GPIO(offset)          (offset)
+
+#define STN8815_PIN_B4         _GPIO(0)
+#define STN8815_PIN_D5         _GPIO(1)
+#define STN8815_PIN_C5         _GPIO(2)
+#define STN8815_PIN_A4         _GPIO(3)
+#define STN8815_PIN_B5         _GPIO(4)
+#define STN8815_PIN_D6         _GPIO(5)
+#define STN8815_PIN_C6         _GPIO(6)
+#define STN8815_PIN_B6         _GPIO(7)
+#define STN8815_PIN_B10                _GPIO(8)
+#define STN8815_PIN_A10                _GPIO(9)
+#define STN8815_PIN_C11                _GPIO(10)
+#define STN8815_PIN_B11                _GPIO(11)
+#define STN8815_PIN_A11                _GPIO(12)
+#define STN8815_PIN_C12                _GPIO(13)
+#define STN8815_PIN_B12                _GPIO(14)
+#define STN8815_PIN_A12                _GPIO(15)
+#define STN8815_PIN_C13                _GPIO(16)
+#define STN8815_PIN_B13                _GPIO(17)
+#define STN8815_PIN_A13                _GPIO(18)
+#define STN8815_PIN_D13                _GPIO(19)
+#define STN8815_PIN_C14                _GPIO(20)
+#define STN8815_PIN_B14                _GPIO(21)
+#define STN8815_PIN_A14                _GPIO(22)
+#define STN8815_PIN_D15                _GPIO(23)
+#define STN8815_PIN_C15                _GPIO(24)
+#define STN8815_PIN_B15                _GPIO(25)
+#define STN8815_PIN_A15                _GPIO(26)
+#define STN8815_PIN_C16                _GPIO(27)
+#define STN8815_PIN_B16                _GPIO(28)
+#define STN8815_PIN_A16                _GPIO(29)
+#define STN8815_PIN_D17                _GPIO(30)
+#define STN8815_PIN_C17                _GPIO(31)
+#define STN8815_PIN_AB6                _GPIO(32)
+#define STN8815_PIN_AA6                _GPIO(33)
+#define STN8815_PIN_Y6         _GPIO(34)
+#define STN8815_PIN_Y5         _GPIO(35)
+#define STN8815_PIN_AA5                _GPIO(36)
+#define STN8815_PIN_AB5                _GPIO(37)
+#define STN8815_PIN_AB4                _GPIO(38)
+#define STN8815_PIN_Y4         _GPIO(39)
+#define STN8815_PIN_R1         _GPIO(40)
+#define STN8815_PIN_R2         _GPIO(41)
+#define STN8815_PIN_R3         _GPIO(42)
+#define STN8815_PIN_P1         _GPIO(43)
+#define STN8815_PIN_P2         _GPIO(44)
+#define STN8815_PIN_P3         _GPIO(45)
+#define STN8815_PIN_N1         _GPIO(46)
+#define STN8815_PIN_N2         _GPIO(47)
+#define STN8815_PIN_N3         _GPIO(48)
+#define STN8815_PIN_M1         _GPIO(49)
+#define STN8815_PIN_M3         _GPIO(50)
+#define STN8815_PIN_M2         _GPIO(51)
+#define STN8815_PIN_L1         _GPIO(52)
+#define STN8815_PIN_L4         _GPIO(53)
+#define STN8815_PIN_L3         _GPIO(54)
+#define STN8815_PIN_L2         _GPIO(55)
+#define STN8815_PIN_F3         _GPIO(56)
+#define STN8815_PIN_F2         _GPIO(57)
+#define STN8815_PIN_E1         _GPIO(58)
+#define STN8815_PIN_E3         _GPIO(59)
+#define STN8815_PIN_E2         _GPIO(60)
+#define STN8815_PIN_E4         _GPIO(61)
+#define STN8815_PIN_D3         _GPIO(62)
+#define STN8815_PIN_D2         _GPIO(63)
+#define STN8815_PIN_F21                _GPIO(64)
+#define STN8815_PIN_F20                _GPIO(65)
+#define STN8815_PIN_E22                _GPIO(66)
+#define STN8815_PIN_D22                _GPIO(67)
+#define STN8815_PIN_E21                _GPIO(68)
+#define STN8815_PIN_E20                _GPIO(69)
+#define STN8815_PIN_C22                _GPIO(70)
+#define STN8815_PIN_D21                _GPIO(71)
+#define STN8815_PIN_D20                _GPIO(72)
+#define STN8815_PIN_C21                _GPIO(73)
+#define STN8815_PIN_C20                _GPIO(74)
+#define STN8815_PIN_C19                _GPIO(75)
+#define STN8815_PIN_B20                _GPIO(76)
+#define STN8815_PIN_B8         _GPIO(77)
+#define STN8815_PIN_A8         _GPIO(78)
+#define STN8815_PIN_C9         _GPIO(79)
+#define STN8815_PIN_B9         _GPIO(80)
+#define STN8815_PIN_A9         _GPIO(81)
+#define STN8815_PIN_C10                _GPIO(82)
+#define STN8815_PIN_K1         _GPIO(83)
+#define STN8815_PIN_K3         _GPIO(84)
+#define STN8815_PIN_K2         _GPIO(85)
+#define STN8815_PIN_J1         _GPIO(86)
+#define STN8815_PIN_J3         _GPIO(87)
+#define STN8815_PIN_J2         _GPIO(88)
+#define STN8815_PIN_H1         _GPIO(89)
+#define STN8815_PIN_H3         _GPIO(90)
+#define STN8815_PIN_H2         _GPIO(91)
+#define STN8815_PIN_G1         _GPIO(92)
+#define STN8815_PIN_G3         _GPIO(93)
+#define STN8815_PIN_G2         _GPIO(94)
+#define STN8815_PIN_F1         _GPIO(95)
+#define STN8815_PIN_T20                _GPIO(96)
+#define STN8815_PIN_R21                _GPIO(97)
+#define STN8815_PIN_R20                _GPIO(98)
+#define STN8815_PIN_U22                _GPIO(99)
+#define STN8815_PIN_N21                _GPIO(100)
+#define STN8815_PIN_N20                _GPIO(101)
+#define STN8815_PIN_P22                _GPIO(102)
+#define STN8815_PIN_N22                _GPIO(103)
+#define STN8815_PIN_V22                _GPIO(104)
+#define STN8815_PIN_V21                _GPIO(105)
+#define STN8815_PIN_K22                _GPIO(106)
+#define STN8815_PIN_K21                _GPIO(107)
+#define STN8815_PIN_H20                _GPIO(108)
+#define STN8815_PIN_G20                _GPIO(109)
+#define STN8815_PIN_L21                _GPIO(110)
+#define STN8815_PIN_H21                _GPIO(111)
+#define STN8815_PIN_J21                _GPIO(112)
+#define STN8815_PIN_H22                _GPIO(113)
+#define STN8815_PIN_K20                _GPIO(114)
+#define STN8815_PIN_L22                _GPIO(115)
+#define STN8815_PIN_G21                _GPIO(116)
+#define STN8815_PIN_J20                _GPIO(117)
+#define STN8815_PIN_G22                _GPIO(118)
+#define STN8815_PIN_U19                _GPIO(119)
+#define STN8815_PIN_G19                _GPIO(120)
+#define STN8815_PIN_M22                _GPIO(121)
+#define STN8815_PIN_M19                _GPIO(122)
+#define STN8815_PIN_J22                _GPIO(123)
+/* GPIOs 124-127 not routed to pins */
+
+/*
+ * The names of the pins are denoted by GPIO number and ball name, even
+ * though they can be used for other things than GPIO, this is the first
+ * column in the table of the data sheet and often used on schematics and
+ * such.
+ */
+static const struct pinctrl_pin_desc nmk_stn8815_pins[] = {
+       PINCTRL_PIN(STN8815_PIN_B4, "GPIO0_B4"),
+       PINCTRL_PIN(STN8815_PIN_D5, "GPIO1_D5"),
+       PINCTRL_PIN(STN8815_PIN_C5, "GPIO2_C5"),
+       PINCTRL_PIN(STN8815_PIN_A4, "GPIO3_A4"),
+       PINCTRL_PIN(STN8815_PIN_B5, "GPIO4_B5"),
+       PINCTRL_PIN(STN8815_PIN_D6, "GPIO5_D6"),
+       PINCTRL_PIN(STN8815_PIN_C6, "GPIO6_C6"),
+       PINCTRL_PIN(STN8815_PIN_B6, "GPIO7_B6"),
+       PINCTRL_PIN(STN8815_PIN_B10, "GPIO8_B10"),
+       PINCTRL_PIN(STN8815_PIN_A10, "GPIO9_A10"),
+       PINCTRL_PIN(STN8815_PIN_C11, "GPIO10_C11"),
+       PINCTRL_PIN(STN8815_PIN_B11, "GPIO11_B11"),
+       PINCTRL_PIN(STN8815_PIN_A11, "GPIO12_A11"),
+       PINCTRL_PIN(STN8815_PIN_C12, "GPIO13_C12"),
+       PINCTRL_PIN(STN8815_PIN_B12, "GPIO14_B12"),
+       PINCTRL_PIN(STN8815_PIN_A12, "GPIO15_A12"),
+       PINCTRL_PIN(STN8815_PIN_C13, "GPIO16_C13"),
+       PINCTRL_PIN(STN8815_PIN_B13, "GPIO17_B13"),
+       PINCTRL_PIN(STN8815_PIN_A13, "GPIO18_A13"),
+       PINCTRL_PIN(STN8815_PIN_D13, "GPIO19_D13"),
+       PINCTRL_PIN(STN8815_PIN_C14, "GPIO20_C14"),
+       PINCTRL_PIN(STN8815_PIN_B14, "GPIO21_B14"),
+       PINCTRL_PIN(STN8815_PIN_A14, "GPIO22_A14"),
+       PINCTRL_PIN(STN8815_PIN_D15, "GPIO23_D15"),
+       PINCTRL_PIN(STN8815_PIN_C15, "GPIO24_C15"),
+       PINCTRL_PIN(STN8815_PIN_B15, "GPIO25_B15"),
+       PINCTRL_PIN(STN8815_PIN_A15, "GPIO26_A15"),
+       PINCTRL_PIN(STN8815_PIN_C16, "GPIO27_C16"),
+       PINCTRL_PIN(STN8815_PIN_B16, "GPIO28_B16"),
+       PINCTRL_PIN(STN8815_PIN_A16, "GPIO29_A16"),
+       PINCTRL_PIN(STN8815_PIN_D17, "GPIO30_D17"),
+       PINCTRL_PIN(STN8815_PIN_C17, "GPIO31_C17"),
+       PINCTRL_PIN(STN8815_PIN_AB6, "GPIO32_AB6"),
+       PINCTRL_PIN(STN8815_PIN_AA6, "GPIO33_AA6"),
+       PINCTRL_PIN(STN8815_PIN_Y6, "GPIO34_Y6"),
+       PINCTRL_PIN(STN8815_PIN_Y5, "GPIO35_Y5"),
+       PINCTRL_PIN(STN8815_PIN_AA5, "GPIO36_AA5"),
+       PINCTRL_PIN(STN8815_PIN_AB5, "GPIO37_AB5"),
+       PINCTRL_PIN(STN8815_PIN_AB4, "GPIO38_AB4"),
+       PINCTRL_PIN(STN8815_PIN_Y4, "GPIO39_Y4"),
+       PINCTRL_PIN(STN8815_PIN_R1, "GPIO40_R1"),
+       PINCTRL_PIN(STN8815_PIN_R2, "GPIO41_R2"),
+       PINCTRL_PIN(STN8815_PIN_R3, "GPIO42_R3"),
+       PINCTRL_PIN(STN8815_PIN_P1, "GPIO43_P1"),
+       PINCTRL_PIN(STN8815_PIN_P2, "GPIO44_P2"),
+       PINCTRL_PIN(STN8815_PIN_P3, "GPIO45_P3"),
+       PINCTRL_PIN(STN8815_PIN_N1, "GPIO46_N1"),
+       PINCTRL_PIN(STN8815_PIN_N2, "GPIO47_N2"),
+       PINCTRL_PIN(STN8815_PIN_N3, "GPIO48_N3"),
+       PINCTRL_PIN(STN8815_PIN_M1, "GPIO49_M1"),
+       PINCTRL_PIN(STN8815_PIN_M3, "GPIO50_M3"),
+       PINCTRL_PIN(STN8815_PIN_M2, "GPIO51_M2"),
+       PINCTRL_PIN(STN8815_PIN_L1, "GPIO52_L1"),
+       PINCTRL_PIN(STN8815_PIN_L4, "GPIO53_L4"),
+       PINCTRL_PIN(STN8815_PIN_L3, "GPIO54_L3"),
+       PINCTRL_PIN(STN8815_PIN_L2, "GPIO55_L2"),
+       PINCTRL_PIN(STN8815_PIN_F3, "GPIO56_F3"),
+       PINCTRL_PIN(STN8815_PIN_F2, "GPIO57_F2"),
+       PINCTRL_PIN(STN8815_PIN_E1, "GPIO58_E1"),
+       PINCTRL_PIN(STN8815_PIN_E3, "GPIO59_E3"),
+       PINCTRL_PIN(STN8815_PIN_E2, "GPIO60_E2"),
+       PINCTRL_PIN(STN8815_PIN_E4, "GPIO61_E4"),
+       PINCTRL_PIN(STN8815_PIN_D3, "GPIO62_D3"),
+       PINCTRL_PIN(STN8815_PIN_D2, "GPIO63_D2"),
+       PINCTRL_PIN(STN8815_PIN_F21, "GPIO64_F21"),
+       PINCTRL_PIN(STN8815_PIN_F20, "GPIO65_F20"),
+       PINCTRL_PIN(STN8815_PIN_E22, "GPIO66_E22"),
+       PINCTRL_PIN(STN8815_PIN_D22, "GPIO67_D22"),
+       PINCTRL_PIN(STN8815_PIN_E21, "GPIO68_E21"),
+       PINCTRL_PIN(STN8815_PIN_E20, "GPIO69_E20"),
+       PINCTRL_PIN(STN8815_PIN_C22, "GPIO70_C22"),
+       PINCTRL_PIN(STN8815_PIN_D21, "GPIO71_D21"),
+       PINCTRL_PIN(STN8815_PIN_D20, "GPIO72_D20"),
+       PINCTRL_PIN(STN8815_PIN_C21, "GPIO73_C21"),
+       PINCTRL_PIN(STN8815_PIN_C20, "GPIO74_C20"),
+       PINCTRL_PIN(STN8815_PIN_C19, "GPIO75_C19"),
+       PINCTRL_PIN(STN8815_PIN_B20, "GPIO76_B20"),
+       PINCTRL_PIN(STN8815_PIN_B8, "GPIO77_B8"),
+       PINCTRL_PIN(STN8815_PIN_A8, "GPIO78_A8"),
+       PINCTRL_PIN(STN8815_PIN_C9, "GPIO79_C9"),
+       PINCTRL_PIN(STN8815_PIN_B9, "GPIO80_B9"),
+       PINCTRL_PIN(STN8815_PIN_A9, "GPIO81_A9"),
+       PINCTRL_PIN(STN8815_PIN_C10, "GPIO82_C10"),
+       PINCTRL_PIN(STN8815_PIN_K1, "GPIO83_K1"),
+       PINCTRL_PIN(STN8815_PIN_K3, "GPIO84_K3"),
+       PINCTRL_PIN(STN8815_PIN_K2, "GPIO85_K2"),
+       PINCTRL_PIN(STN8815_PIN_J1, "GPIO86_J1"),
+       PINCTRL_PIN(STN8815_PIN_J3, "GPIO87_J3"),
+       PINCTRL_PIN(STN8815_PIN_J2, "GPIO88_J2"),
+       PINCTRL_PIN(STN8815_PIN_H1, "GPIO89_H1"),
+       PINCTRL_PIN(STN8815_PIN_H3, "GPIO90_H3"),
+       PINCTRL_PIN(STN8815_PIN_H2, "GPIO91_H2"),
+       PINCTRL_PIN(STN8815_PIN_G1, "GPIO92_G1"),
+       PINCTRL_PIN(STN8815_PIN_G3, "GPIO93_G3"),
+       PINCTRL_PIN(STN8815_PIN_G2, "GPIO94_G2"),
+       PINCTRL_PIN(STN8815_PIN_F1, "GPIO95_F1"),
+       PINCTRL_PIN(STN8815_PIN_T20, "GPIO96_T20"),
+       PINCTRL_PIN(STN8815_PIN_R21, "GPIO97_R21"),
+       PINCTRL_PIN(STN8815_PIN_R20, "GPIO98_R20"),
+       PINCTRL_PIN(STN8815_PIN_U22, "GPIO99_U22"),
+       PINCTRL_PIN(STN8815_PIN_N21, "GPIO100_N21"),
+       PINCTRL_PIN(STN8815_PIN_N20, "GPIO101_N20"),
+       PINCTRL_PIN(STN8815_PIN_P22, "GPIO102_P22"),
+       PINCTRL_PIN(STN8815_PIN_N22, "GPIO103_N22"),
+       PINCTRL_PIN(STN8815_PIN_V22, "GPIO104_V22"),
+       PINCTRL_PIN(STN8815_PIN_V21, "GPIO105_V21"),
+       PINCTRL_PIN(STN8815_PIN_K22, "GPIO106_K22"),
+       PINCTRL_PIN(STN8815_PIN_K21, "GPIO107_K21"),
+       PINCTRL_PIN(STN8815_PIN_H20, "GPIO108_H20"),
+       PINCTRL_PIN(STN8815_PIN_G20, "GPIO109_G20"),
+       PINCTRL_PIN(STN8815_PIN_L21, "GPIO110_L21"),
+       PINCTRL_PIN(STN8815_PIN_H21, "GPIO111_H21"),
+       PINCTRL_PIN(STN8815_PIN_J21, "GPIO112_J21"),
+       PINCTRL_PIN(STN8815_PIN_H22, "GPIO113_H22"),
+       PINCTRL_PIN(STN8815_PIN_K20, "GPIO114_K20"),
+       PINCTRL_PIN(STN8815_PIN_L22, "GPIO115_L22"),
+       PINCTRL_PIN(STN8815_PIN_G21, "GPIO116_G21"),
+       PINCTRL_PIN(STN8815_PIN_J20, "GPIO117_J20"),
+       PINCTRL_PIN(STN8815_PIN_G22, "GPIO118_G22"),
+       PINCTRL_PIN(STN8815_PIN_U19, "GPIO119_U19"),
+       PINCTRL_PIN(STN8815_PIN_G19, "GPIO120_G19"),
+       PINCTRL_PIN(STN8815_PIN_M22, "GPIO121_M22"),
+       PINCTRL_PIN(STN8815_PIN_M19, "GPIO122_M19"),
+       PINCTRL_PIN(STN8815_PIN_J22, "GPIO123_J22"),
+};
+
+#define STN8815_GPIO_RANGE(a, b, c) { .name = "STN8815", .id = a, .base = b, \
+                       .pin_base = b, .npins = c }
+
+/*
+ * This matches the 32-pin gpio chips registered by the GPIO portion. This
+ * cannot be const since we assign the struct gpio_chip * pointer at runtime.
+ */
+static struct pinctrl_gpio_range nmk_stn8815_ranges[] = {
+       STN8815_GPIO_RANGE(0, 0, 32),
+       STN8815_GPIO_RANGE(1, 32, 32),
+       STN8815_GPIO_RANGE(2, 64, 32),
+       STN8815_GPIO_RANGE(3, 96, 28),
+};
+
+/*
+ * Read the pin group names like this:
+ * u0_a_1    = first groups of pins for uart0 on alt function a
+ * i2c2_b_2  = second group of pins for i2c2 on alt function b
+ */
+
+/* Altfunction A */
+static const unsigned u0_a_1_pins[] = { STN8815_PIN_B4, STN8815_PIN_D5,
+       STN8815_PIN_C5, STN8815_PIN_A4, STN8815_PIN_B5, STN8815_PIN_D6,
+       STN8815_PIN_C6, STN8815_PIN_B6 };
+static const unsigned mmcsd_a_1_pins[] = { STN8815_PIN_B10, STN8815_PIN_A10,
+       STN8815_PIN_C11, STN8815_PIN_B11, STN8815_PIN_A11, STN8815_PIN_C12,
+       STN8815_PIN_B12, STN8815_PIN_A12, STN8815_PIN_C13, STN8815_PIN_C15 };
+static const unsigned u1_a_1_pins[] = { STN8815_PIN_M2, STN8815_PIN_L1,
+                                       STN8815_PIN_F3, STN8815_PIN_F2 };
+static const unsigned i2c1_a_1_pins[] = { STN8815_PIN_L4, STN8815_PIN_L3 };
+static const unsigned i2c0_a_1_pins[] = { STN8815_PIN_D3, STN8815_PIN_D2 };
+/* Altfunction B */
+static const unsigned u1_b_1_pins[] = { STN8815_PIN_B16, STN8815_PIN_A16 };
+static const unsigned i2cusb_b_1_pins[] = { STN8815_PIN_C21, STN8815_PIN_C20 };
+
+#define STN8815_PIN_GROUP(a, b) { .name = #a, .pins = a##_pins,                \
+                       .npins = ARRAY_SIZE(a##_pins), .altsetting = b }
+
+static const struct nmk_pingroup nmk_stn8815_groups[] = {
+       STN8815_PIN_GROUP(u0_a_1, NMK_GPIO_ALT_A),
+       STN8815_PIN_GROUP(mmcsd_a_1, NMK_GPIO_ALT_A),
+       STN8815_PIN_GROUP(u1_a_1, NMK_GPIO_ALT_A),
+       STN8815_PIN_GROUP(i2c1_a_1, NMK_GPIO_ALT_A),
+       STN8815_PIN_GROUP(i2c0_a_1, NMK_GPIO_ALT_A),
+       STN8815_PIN_GROUP(u1_b_1, NMK_GPIO_ALT_B),
+       STN8815_PIN_GROUP(i2cusb_b_1, NMK_GPIO_ALT_B),
+};
+
+/* We use this macro to define the groups applicable to a function */
+#define STN8815_FUNC_GROUPS(a, b...)      \
+static const char * const a##_groups[] = { b };
+
+STN8815_FUNC_GROUPS(u0, "u0_a_1");
+STN8815_FUNC_GROUPS(mmcsd, "mmcsd_a_1");
+STN8815_FUNC_GROUPS(u1, "u1_a_1", "u1_b_1");
+STN8815_FUNC_GROUPS(i2c1, "i2c1_a_1");
+STN8815_FUNC_GROUPS(i2c0, "i2c0_a_1");
+STN8815_FUNC_GROUPS(i2cusb, "i2cusb_b_1");
+
+#define FUNCTION(fname)                                        \
+       {                                               \
+               .name = #fname,                         \
+               .groups = fname##_groups,               \
+               .ngroups = ARRAY_SIZE(fname##_groups),  \
+       }
+
+static const struct nmk_function nmk_stn8815_functions[] = {
+       FUNCTION(u0),
+       FUNCTION(mmcsd),
+       FUNCTION(u1),
+       FUNCTION(i2c1),
+       FUNCTION(i2c0),
+       FUNCTION(i2cusb),
+};
+
+static const struct nmk_pinctrl_soc_data nmk_stn8815_soc = {
+       .gpio_ranges = nmk_stn8815_ranges,
+       .gpio_num_ranges = ARRAY_SIZE(nmk_stn8815_ranges),
+       .pins = nmk_stn8815_pins,
+       .npins = ARRAY_SIZE(nmk_stn8815_pins),
+       .functions = nmk_stn8815_functions,
+       .nfunctions = ARRAY_SIZE(nmk_stn8815_functions),
+       .groups = nmk_stn8815_groups,
+       .ngroups = ARRAY_SIZE(nmk_stn8815_groups),
+};
+
+void nmk_pinctrl_stn8815_init(const struct nmk_pinctrl_soc_data **soc)
+{
+       *soc = &nmk_stn8815_soc;
+}
diff --git a/drivers/pinctrl/nomadik/pinctrl-nomadik.c b/drivers/pinctrl/nomadik/pinctrl-nomadik.c
new file mode 100644 (file)
index 0000000..e7cab07
--- /dev/null
@@ -0,0 +1,2099 @@
+/*
+ * Generic GPIO driver for logic cells found in the Nomadik SoC
+ *
+ * Copyright (C) 2008,2009 STMicroelectronics
+ * Copyright (C) 2009 Alessandro Rubini <rubini@unipv.it>
+ *   Rewritten based on work by Prafulla WADASKAR <prafulla.wadaskar@st.com>
+ * Copyright (C) 2011-2013 Linus Walleij <linus.walleij@linaro.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/device.h>
+#include <linux/platform_device.h>
+#include <linux/io.h>
+#include <linux/clk.h>
+#include <linux/err.h>
+#include <linux/gpio.h>
+#include <linux/spinlock.h>
+#include <linux/interrupt.h>
+#include <linux/slab.h>
+#include <linux/of_device.h>
+#include <linux/of_address.h>
+#include <linux/pinctrl/machine.h>
+#include <linux/pinctrl/pinctrl.h>
+#include <linux/pinctrl/pinmux.h>
+#include <linux/pinctrl/pinconf.h>
+/* Since we request GPIOs from ourself */
+#include <linux/pinctrl/consumer.h>
+#include "pinctrl-nomadik.h"
+#include "../core.h"
+
+/*
+ * The GPIO module in the Nomadik family of Systems-on-Chip is an
+ * AMBA device, managing 32 pins and alternate functions.  The logic block
+ * is currently used in the Nomadik and ux500.
+ *
+ * Symbols in this file are called "nmk_gpio" for "nomadik gpio"
+ */
+
+/*
+ * pin configurations are represented by 32-bit integers:
+ *
+ *     bit  0.. 8 - Pin Number (512 Pins Maximum)
+ *     bit  9..10 - Alternate Function Selection
+ *     bit 11..12 - Pull up/down state
+ *     bit     13 - Sleep mode behaviour
+ *     bit     14 - Direction
+ *     bit     15 - Value (if output)
+ *     bit 16..18 - SLPM pull up/down state
+ *     bit 19..20 - SLPM direction
+ *     bit 21..22 - SLPM Value (if output)
+ *     bit 23..25 - PDIS value (if input)
+ *     bit     26 - Gpio mode
+ *     bit     27 - Sleep mode
+ *
+ * to facilitate the definition, the following macros are provided
+ *
+ * PIN_CFG_DEFAULT - default config (0):
+ *                  pull up/down = disabled
+ *                  sleep mode = input/wakeup
+ *                  direction = input
+ *                  value = low
+ *                  SLPM direction = same as normal
+ *                  SLPM pull = same as normal
+ *                  SLPM value = same as normal
+ *
+ * PIN_CFG        - default config with alternate function
+ */
+
+typedef unsigned long pin_cfg_t;
+
+#define PIN_NUM_MASK           0x1ff
+#define PIN_NUM(x)             ((x) & PIN_NUM_MASK)
+
+#define PIN_ALT_SHIFT          9
+#define PIN_ALT_MASK           (0x3 << PIN_ALT_SHIFT)
+#define PIN_ALT(x)             (((x) & PIN_ALT_MASK) >> PIN_ALT_SHIFT)
+#define PIN_GPIO               (NMK_GPIO_ALT_GPIO << PIN_ALT_SHIFT)
+#define PIN_ALT_A              (NMK_GPIO_ALT_A << PIN_ALT_SHIFT)
+#define PIN_ALT_B              (NMK_GPIO_ALT_B << PIN_ALT_SHIFT)
+#define PIN_ALT_C              (NMK_GPIO_ALT_C << PIN_ALT_SHIFT)
+
+#define PIN_PULL_SHIFT         11
+#define PIN_PULL_MASK          (0x3 << PIN_PULL_SHIFT)
+#define PIN_PULL(x)            (((x) & PIN_PULL_MASK) >> PIN_PULL_SHIFT)
+#define PIN_PULL_NONE          (NMK_GPIO_PULL_NONE << PIN_PULL_SHIFT)
+#define PIN_PULL_UP            (NMK_GPIO_PULL_UP << PIN_PULL_SHIFT)
+#define PIN_PULL_DOWN          (NMK_GPIO_PULL_DOWN << PIN_PULL_SHIFT)
+
+#define PIN_SLPM_SHIFT         13
+#define PIN_SLPM_MASK          (0x1 << PIN_SLPM_SHIFT)
+#define PIN_SLPM(x)            (((x) & PIN_SLPM_MASK) >> PIN_SLPM_SHIFT)
+#define PIN_SLPM_MAKE_INPUT    (NMK_GPIO_SLPM_INPUT << PIN_SLPM_SHIFT)
+#define PIN_SLPM_NOCHANGE      (NMK_GPIO_SLPM_NOCHANGE << PIN_SLPM_SHIFT)
+/* These two replace the above in DB8500v2+ */
+#define PIN_SLPM_WAKEUP_ENABLE (NMK_GPIO_SLPM_WAKEUP_ENABLE << PIN_SLPM_SHIFT)
+#define PIN_SLPM_WAKEUP_DISABLE        (NMK_GPIO_SLPM_WAKEUP_DISABLE << PIN_SLPM_SHIFT)
+#define PIN_SLPM_USE_MUX_SETTINGS_IN_SLEEP PIN_SLPM_WAKEUP_DISABLE
+
+#define PIN_SLPM_GPIO  PIN_SLPM_WAKEUP_ENABLE /* In SLPM, pin is a gpio */
+#define PIN_SLPM_ALTFUNC PIN_SLPM_WAKEUP_DISABLE /* In SLPM, pin is altfunc */
+
+#define PIN_DIR_SHIFT          14
+#define PIN_DIR_MASK           (0x1 << PIN_DIR_SHIFT)
+#define PIN_DIR(x)             (((x) & PIN_DIR_MASK) >> PIN_DIR_SHIFT)
+#define PIN_DIR_INPUT          (0 << PIN_DIR_SHIFT)
+#define PIN_DIR_OUTPUT         (1 << PIN_DIR_SHIFT)
+
+#define PIN_VAL_SHIFT          15
+#define PIN_VAL_MASK           (0x1 << PIN_VAL_SHIFT)
+#define PIN_VAL(x)             (((x) & PIN_VAL_MASK) >> PIN_VAL_SHIFT)
+#define PIN_VAL_LOW            (0 << PIN_VAL_SHIFT)
+#define PIN_VAL_HIGH           (1 << PIN_VAL_SHIFT)
+
+#define PIN_SLPM_PULL_SHIFT    16
+#define PIN_SLPM_PULL_MASK     (0x7 << PIN_SLPM_PULL_SHIFT)
+#define PIN_SLPM_PULL(x)       \
+       (((x) & PIN_SLPM_PULL_MASK) >> PIN_SLPM_PULL_SHIFT)
+#define PIN_SLPM_PULL_NONE     \
+       ((1 + NMK_GPIO_PULL_NONE) << PIN_SLPM_PULL_SHIFT)
+#define PIN_SLPM_PULL_UP       \
+       ((1 + NMK_GPIO_PULL_UP) << PIN_SLPM_PULL_SHIFT)
+#define PIN_SLPM_PULL_DOWN     \
+       ((1 + NMK_GPIO_PULL_DOWN) << PIN_SLPM_PULL_SHIFT)
+
+#define PIN_SLPM_DIR_SHIFT     19
+#define PIN_SLPM_DIR_MASK      (0x3 << PIN_SLPM_DIR_SHIFT)
+#define PIN_SLPM_DIR(x)                \
+       (((x) & PIN_SLPM_DIR_MASK) >> PIN_SLPM_DIR_SHIFT)
+#define PIN_SLPM_DIR_INPUT     ((1 + 0) << PIN_SLPM_DIR_SHIFT)
+#define PIN_SLPM_DIR_OUTPUT    ((1 + 1) << PIN_SLPM_DIR_SHIFT)
+
+#define PIN_SLPM_VAL_SHIFT     21
+#define PIN_SLPM_VAL_MASK      (0x3 << PIN_SLPM_VAL_SHIFT)
+#define PIN_SLPM_VAL(x)                \
+       (((x) & PIN_SLPM_VAL_MASK) >> PIN_SLPM_VAL_SHIFT)
+#define PIN_SLPM_VAL_LOW       ((1 + 0) << PIN_SLPM_VAL_SHIFT)
+#define PIN_SLPM_VAL_HIGH      ((1 + 1) << PIN_SLPM_VAL_SHIFT)
+
+#define PIN_SLPM_PDIS_SHIFT            23
+#define PIN_SLPM_PDIS_MASK             (0x3 << PIN_SLPM_PDIS_SHIFT)
+#define PIN_SLPM_PDIS(x)       \
+       (((x) & PIN_SLPM_PDIS_MASK) >> PIN_SLPM_PDIS_SHIFT)
+#define PIN_SLPM_PDIS_NO_CHANGE                (0 << PIN_SLPM_PDIS_SHIFT)
+#define PIN_SLPM_PDIS_DISABLED         (1 << PIN_SLPM_PDIS_SHIFT)
+#define PIN_SLPM_PDIS_ENABLED          (2 << PIN_SLPM_PDIS_SHIFT)
+
+#define PIN_LOWEMI_SHIFT       25
+#define PIN_LOWEMI_MASK                (0x1 << PIN_LOWEMI_SHIFT)
+#define PIN_LOWEMI(x)          (((x) & PIN_LOWEMI_MASK) >> PIN_LOWEMI_SHIFT)
+#define PIN_LOWEMI_DISABLED    (0 << PIN_LOWEMI_SHIFT)
+#define PIN_LOWEMI_ENABLED     (1 << PIN_LOWEMI_SHIFT)
+
+#define PIN_GPIOMODE_SHIFT     26
+#define PIN_GPIOMODE_MASK      (0x1 << PIN_GPIOMODE_SHIFT)
+#define PIN_GPIOMODE(x)                (((x) & PIN_GPIOMODE_MASK) >> PIN_GPIOMODE_SHIFT)
+#define PIN_GPIOMODE_DISABLED  (0 << PIN_GPIOMODE_SHIFT)
+#define PIN_GPIOMODE_ENABLED   (1 << PIN_GPIOMODE_SHIFT)
+
+#define PIN_SLEEPMODE_SHIFT    27
+#define PIN_SLEEPMODE_MASK     (0x1 << PIN_SLEEPMODE_SHIFT)
+#define PIN_SLEEPMODE(x)       (((x) & PIN_SLEEPMODE_MASK) >> PIN_SLEEPMODE_SHIFT)
+#define PIN_SLEEPMODE_DISABLED (0 << PIN_SLEEPMODE_SHIFT)
+#define PIN_SLEEPMODE_ENABLED  (1 << PIN_SLEEPMODE_SHIFT)
+
+
+/* Shortcuts.  Use these instead of separate DIR, PULL, and VAL.  */
+#define PIN_INPUT_PULLDOWN     (PIN_DIR_INPUT | PIN_PULL_DOWN)
+#define PIN_INPUT_PULLUP       (PIN_DIR_INPUT | PIN_PULL_UP)
+#define PIN_INPUT_NOPULL       (PIN_DIR_INPUT | PIN_PULL_NONE)
+#define PIN_OUTPUT_LOW         (PIN_DIR_OUTPUT | PIN_VAL_LOW)
+#define PIN_OUTPUT_HIGH                (PIN_DIR_OUTPUT | PIN_VAL_HIGH)
+
+#define PIN_SLPM_INPUT_PULLDOWN        (PIN_SLPM_DIR_INPUT | PIN_SLPM_PULL_DOWN)
+#define PIN_SLPM_INPUT_PULLUP  (PIN_SLPM_DIR_INPUT | PIN_SLPM_PULL_UP)
+#define PIN_SLPM_INPUT_NOPULL  (PIN_SLPM_DIR_INPUT | PIN_SLPM_PULL_NONE)
+#define PIN_SLPM_OUTPUT_LOW    (PIN_SLPM_DIR_OUTPUT | PIN_SLPM_VAL_LOW)
+#define PIN_SLPM_OUTPUT_HIGH   (PIN_SLPM_DIR_OUTPUT | PIN_SLPM_VAL_HIGH)
+
+#define PIN_CFG_DEFAULT                (0)
+
+#define PIN_CFG(num, alt)              \
+       (PIN_CFG_DEFAULT |\
+        (PIN_NUM(num) | PIN_##alt))
+
+#define PIN_CFG_INPUT(num, alt, pull)          \
+       (PIN_CFG_DEFAULT |\
+        (PIN_NUM(num) | PIN_##alt | PIN_INPUT_##pull))
+
+#define PIN_CFG_OUTPUT(num, alt, val)          \
+       (PIN_CFG_DEFAULT |\
+        (PIN_NUM(num) | PIN_##alt | PIN_OUTPUT_##val))
+
+/*
+ * "nmk_gpio" and "NMK_GPIO" stand for "Nomadik GPIO", leaving
+ * the "gpio" namespace for generic and cross-machine functions
+ */
+
+#define GPIO_BLOCK_SHIFT 5
+#define NMK_GPIO_PER_CHIP (1 << GPIO_BLOCK_SHIFT)
+
+/* Register in the logic block */
+#define NMK_GPIO_DAT   0x00
+#define NMK_GPIO_DATS  0x04
+#define NMK_GPIO_DATC  0x08
+#define NMK_GPIO_PDIS  0x0c
+#define NMK_GPIO_DIR   0x10
+#define NMK_GPIO_DIRS  0x14
+#define NMK_GPIO_DIRC  0x18
+#define NMK_GPIO_SLPC  0x1c
+#define NMK_GPIO_AFSLA 0x20
+#define NMK_GPIO_AFSLB 0x24
+#define NMK_GPIO_LOWEMI        0x28
+
+#define NMK_GPIO_RIMSC 0x40
+#define NMK_GPIO_FIMSC 0x44
+#define NMK_GPIO_IS    0x48
+#define NMK_GPIO_IC    0x4c
+#define NMK_GPIO_RWIMSC        0x50
+#define NMK_GPIO_FWIMSC        0x54
+#define NMK_GPIO_WKS   0x58
+/* These appear in DB8540 and later ASICs */
+#define NMK_GPIO_EDGELEVEL 0x5C
+#define NMK_GPIO_LEVEL 0x60
+
+
+/* Pull up/down values */
+enum nmk_gpio_pull {
+       NMK_GPIO_PULL_NONE,
+       NMK_GPIO_PULL_UP,
+       NMK_GPIO_PULL_DOWN,
+};
+
+/* Sleep mode */
+enum nmk_gpio_slpm {
+       NMK_GPIO_SLPM_INPUT,
+       NMK_GPIO_SLPM_WAKEUP_ENABLE = NMK_GPIO_SLPM_INPUT,
+       NMK_GPIO_SLPM_NOCHANGE,
+       NMK_GPIO_SLPM_WAKEUP_DISABLE = NMK_GPIO_SLPM_NOCHANGE,
+};
+
+struct nmk_gpio_chip {
+       struct gpio_chip chip;
+       void __iomem *addr;
+       struct clk *clk;
+       unsigned int bank;
+       unsigned int parent_irq;
+       int latent_parent_irq;
+       u32 (*get_latent_status)(unsigned int bank);
+       void (*set_ioforce)(bool enable);
+       spinlock_t lock;
+       bool sleepmode;
+       /* Keep track of configured edges */
+       u32 edge_rising;
+       u32 edge_falling;
+       u32 real_wake;
+       u32 rwimsc;
+       u32 fwimsc;
+       u32 rimsc;
+       u32 fimsc;
+       u32 pull_up;
+       u32 lowemi;
+};
+
+/**
+ * struct nmk_pinctrl - state container for the Nomadik pin controller
+ * @dev: containing device pointer
+ * @pctl: corresponding pin controller device
+ * @soc: SoC data for this specific chip
+ * @prcm_base: PRCM register range virtual base
+ */
+struct nmk_pinctrl {
+       struct device *dev;
+       struct pinctrl_dev *pctl;
+       const struct nmk_pinctrl_soc_data *soc;
+       void __iomem *prcm_base;
+};
+
+static struct nmk_gpio_chip *
+nmk_gpio_chips[DIV_ROUND_UP(ARCH_NR_GPIOS, NMK_GPIO_PER_CHIP)];
+
+static DEFINE_SPINLOCK(nmk_gpio_slpm_lock);
+
+#define NUM_BANKS ARRAY_SIZE(nmk_gpio_chips)
+
+static void __nmk_gpio_set_mode(struct nmk_gpio_chip *nmk_chip,
+                               unsigned offset, int gpio_mode)
+{
+       u32 bit = 1 << offset;
+       u32 afunc, bfunc;
+
+       afunc = readl(nmk_chip->addr + NMK_GPIO_AFSLA) & ~bit;
+       bfunc = readl(nmk_chip->addr + NMK_GPIO_AFSLB) & ~bit;
+       if (gpio_mode & NMK_GPIO_ALT_A)
+               afunc |= bit;
+       if (gpio_mode & NMK_GPIO_ALT_B)
+               bfunc |= bit;
+       writel(afunc, nmk_chip->addr + NMK_GPIO_AFSLA);
+       writel(bfunc, nmk_chip->addr + NMK_GPIO_AFSLB);
+}
+
+static void __nmk_gpio_set_slpm(struct nmk_gpio_chip *nmk_chip,
+                               unsigned offset, enum nmk_gpio_slpm mode)
+{
+       u32 bit = 1 << offset;
+       u32 slpm;
+
+       slpm = readl(nmk_chip->addr + NMK_GPIO_SLPC);
+       if (mode == NMK_GPIO_SLPM_NOCHANGE)
+               slpm |= bit;
+       else
+               slpm &= ~bit;
+       writel(slpm, nmk_chip->addr + NMK_GPIO_SLPC);
+}
+
+static void __nmk_gpio_set_pull(struct nmk_gpio_chip *nmk_chip,
+                               unsigned offset, enum nmk_gpio_pull pull)
+{
+       u32 bit = 1 << offset;
+       u32 pdis;
+
+       pdis = readl(nmk_chip->addr + NMK_GPIO_PDIS);
+       if (pull == NMK_GPIO_PULL_NONE) {
+               pdis |= bit;
+               nmk_chip->pull_up &= ~bit;
+       } else {
+               pdis &= ~bit;
+       }
+
+       writel(pdis, nmk_chip->addr + NMK_GPIO_PDIS);
+
+       if (pull == NMK_GPIO_PULL_UP) {
+               nmk_chip->pull_up |= bit;
+               writel(bit, nmk_chip->addr + NMK_GPIO_DATS);
+       } else if (pull == NMK_GPIO_PULL_DOWN) {
+               nmk_chip->pull_up &= ~bit;
+               writel(bit, nmk_chip->addr + NMK_GPIO_DATC);
+       }
+}
+
+static void __nmk_gpio_set_lowemi(struct nmk_gpio_chip *nmk_chip,
+                                 unsigned offset, bool lowemi)
+{
+       u32 bit = BIT(offset);
+       bool enabled = nmk_chip->lowemi & bit;
+
+       if (lowemi == enabled)
+               return;
+
+       if (lowemi)
+               nmk_chip->lowemi |= bit;
+       else
+               nmk_chip->lowemi &= ~bit;
+
+       writel_relaxed(nmk_chip->lowemi,
+                      nmk_chip->addr + NMK_GPIO_LOWEMI);
+}
+
+static void __nmk_gpio_make_input(struct nmk_gpio_chip *nmk_chip,
+                                 unsigned offset)
+{
+       writel(1 << offset, nmk_chip->addr + NMK_GPIO_DIRC);
+}
+
+static void __nmk_gpio_set_output(struct nmk_gpio_chip *nmk_chip,
+                                 unsigned offset, int val)
+{
+       if (val)
+               writel(1 << offset, nmk_chip->addr + NMK_GPIO_DATS);
+       else
+               writel(1 << offset, nmk_chip->addr + NMK_GPIO_DATC);
+}
+
+static void __nmk_gpio_make_output(struct nmk_gpio_chip *nmk_chip,
+                                 unsigned offset, int val)
+{
+       writel(1 << offset, nmk_chip->addr + NMK_GPIO_DIRS);
+       __nmk_gpio_set_output(nmk_chip, offset, val);
+}
+
+static void __nmk_gpio_set_mode_safe(struct nmk_gpio_chip *nmk_chip,
+                                    unsigned offset, int gpio_mode,
+                                    bool glitch)
+{
+       u32 rwimsc = nmk_chip->rwimsc;
+       u32 fwimsc = nmk_chip->fwimsc;
+
+       if (glitch && nmk_chip->set_ioforce) {
+               u32 bit = BIT(offset);
+
+               /* Prevent spurious wakeups */
+               writel(rwimsc & ~bit, nmk_chip->addr + NMK_GPIO_RWIMSC);
+               writel(fwimsc & ~bit, nmk_chip->addr + NMK_GPIO_FWIMSC);
+
+               nmk_chip->set_ioforce(true);
+       }
+
+       __nmk_gpio_set_mode(nmk_chip, offset, gpio_mode);
+
+       if (glitch && nmk_chip->set_ioforce) {
+               nmk_chip->set_ioforce(false);
+
+               writel(rwimsc, nmk_chip->addr + NMK_GPIO_RWIMSC);
+               writel(fwimsc, nmk_chip->addr + NMK_GPIO_FWIMSC);
+       }
+}
+
+static void
+nmk_gpio_disable_lazy_irq(struct nmk_gpio_chip *nmk_chip, unsigned offset)
+{
+       u32 falling = nmk_chip->fimsc & BIT(offset);
+       u32 rising = nmk_chip->rimsc & BIT(offset);
+       int gpio = nmk_chip->chip.base + offset;
+       int irq = irq_find_mapping(nmk_chip->chip.irqdomain, offset);
+       struct irq_data *d = irq_get_irq_data(irq);
+
+       if (!rising && !falling)
+               return;
+
+       if (!d || !irqd_irq_disabled(d))
+               return;
+
+       if (rising) {
+               nmk_chip->rimsc &= ~BIT(offset);
+               writel_relaxed(nmk_chip->rimsc,
+                              nmk_chip->addr + NMK_GPIO_RIMSC);
+       }
+
+       if (falling) {
+               nmk_chip->fimsc &= ~BIT(offset);
+               writel_relaxed(nmk_chip->fimsc,
+                              nmk_chip->addr + NMK_GPIO_FIMSC);
+       }
+
+       dev_dbg(nmk_chip->chip.dev, "%d: clearing interrupt mask\n", gpio);
+}
+
+static void nmk_write_masked(void __iomem *reg, u32 mask, u32 value)
+{
+       u32 val;
+
+       val = readl(reg);
+       val = ((val & ~mask) | (value & mask));
+       writel(val, reg);
+}
+
+static void nmk_prcm_altcx_set_mode(struct nmk_pinctrl *npct,
+       unsigned offset, unsigned alt_num)
+{
+       int i;
+       u16 reg;
+       u8 bit;
+       u8 alt_index;
+       const struct prcm_gpiocr_altcx_pin_desc *pin_desc;
+       const u16 *gpiocr_regs;
+
+       if (!npct->prcm_base)
+               return;
+
+       if (alt_num > PRCM_IDX_GPIOCR_ALTC_MAX) {
+               dev_err(npct->dev, "PRCM GPIOCR: alternate-C%i is invalid\n",
+                       alt_num);
+               return;
+       }
+
+       for (i = 0 ; i < npct->soc->npins_altcx ; i++) {
+               if (npct->soc->altcx_pins[i].pin == offset)
+                       break;
+       }
+       if (i == npct->soc->npins_altcx) {
+               dev_dbg(npct->dev, "PRCM GPIOCR: pin %i is not found\n",
+                       offset);
+               return;
+       }
+
+       pin_desc = npct->soc->altcx_pins + i;
+       gpiocr_regs = npct->soc->prcm_gpiocr_registers;
+
+       /*
+        * If alt_num is NULL, just clear current ALTCx selection
+        * to make sure we come back to a pure ALTC selection
+        */
+       if (!alt_num) {
+               for (i = 0 ; i < PRCM_IDX_GPIOCR_ALTC_MAX ; i++) {
+                       if (pin_desc->altcx[i].used == true) {
+                               reg = gpiocr_regs[pin_desc->altcx[i].reg_index];
+                               bit = pin_desc->altcx[i].control_bit;
+                               if (readl(npct->prcm_base + reg) & BIT(bit)) {
+                                       nmk_write_masked(npct->prcm_base + reg, BIT(bit), 0);
+                                       dev_dbg(npct->dev,
+                                               "PRCM GPIOCR: pin %i: alternate-C%i has been disabled\n",
+                                               offset, i+1);
+                               }
+                       }
+               }
+               return;
+       }
+
+       alt_index = alt_num - 1;
+       if (pin_desc->altcx[alt_index].used == false) {
+               dev_warn(npct->dev,
+                       "PRCM GPIOCR: pin %i: alternate-C%i does not exist\n",
+                       offset, alt_num);
+               return;
+       }
+
+       /*
+        * Check if any other ALTCx functions are activated on this pin
+        * and disable it first.
+        */
+       for (i = 0 ; i < PRCM_IDX_GPIOCR_ALTC_MAX ; i++) {
+               if (i == alt_index)
+                       continue;
+               if (pin_desc->altcx[i].used == true) {
+                       reg = gpiocr_regs[pin_desc->altcx[i].reg_index];
+                       bit = pin_desc->altcx[i].control_bit;
+                       if (readl(npct->prcm_base + reg) & BIT(bit)) {
+                               nmk_write_masked(npct->prcm_base + reg, BIT(bit), 0);
+                               dev_dbg(npct->dev,
+                                       "PRCM GPIOCR: pin %i: alternate-C%i has been disabled\n",
+                                       offset, i+1);
+                       }
+               }
+       }
+
+       reg = gpiocr_regs[pin_desc->altcx[alt_index].reg_index];
+       bit = pin_desc->altcx[alt_index].control_bit;
+       dev_dbg(npct->dev, "PRCM GPIOCR: pin %i: alternate-C%i has been selected\n",
+               offset, alt_index+1);
+       nmk_write_masked(npct->prcm_base + reg, BIT(bit), BIT(bit));
+}
+
+/*
+ * Safe sequence used to switch IOs between GPIO and Alternate-C mode:
+ *  - Save SLPM registers
+ *  - Set SLPM=0 for the IOs you want to switch and others to 1
+ *  - Configure the GPIO registers for the IOs that are being switched
+ *  - Set IOFORCE=1
+ *  - Modify the AFLSA/B registers for the IOs that are being switched
+ *  - Set IOFORCE=0
+ *  - Restore SLPM registers
+ *  - Any spurious wake up event during switch sequence to be ignored and
+ *    cleared
+ */
+static void nmk_gpio_glitch_slpm_init(unsigned int *slpm)
+{
+       int i;
+
+       for (i = 0; i < NUM_BANKS; i++) {
+               struct nmk_gpio_chip *chip = nmk_gpio_chips[i];
+               unsigned int temp = slpm[i];
+
+               if (!chip)
+                       break;
+
+               clk_enable(chip->clk);
+
+               slpm[i] = readl(chip->addr + NMK_GPIO_SLPC);
+               writel(temp, chip->addr + NMK_GPIO_SLPC);
+       }
+}
+
+static void nmk_gpio_glitch_slpm_restore(unsigned int *slpm)
+{
+       int i;
+
+       for (i = 0; i < NUM_BANKS; i++) {
+               struct nmk_gpio_chip *chip = nmk_gpio_chips[i];
+
+               if (!chip)
+                       break;
+
+               writel(slpm[i], chip->addr + NMK_GPIO_SLPC);
+
+               clk_disable(chip->clk);
+       }
+}
+
+static int __maybe_unused nmk_prcm_gpiocr_get_mode(struct pinctrl_dev *pctldev, int gpio)
+{
+       int i;
+       u16 reg;
+       u8 bit;
+       struct nmk_pinctrl *npct = pinctrl_dev_get_drvdata(pctldev);
+       const struct prcm_gpiocr_altcx_pin_desc *pin_desc;
+       const u16 *gpiocr_regs;
+
+       if (!npct->prcm_base)
+               return NMK_GPIO_ALT_C;
+
+       for (i = 0; i < npct->soc->npins_altcx; i++) {
+               if (npct->soc->altcx_pins[i].pin == gpio)
+                       break;
+       }
+       if (i == npct->soc->npins_altcx)
+               return NMK_GPIO_ALT_C;
+
+       pin_desc = npct->soc->altcx_pins + i;
+       gpiocr_regs = npct->soc->prcm_gpiocr_registers;
+       for (i = 0; i < PRCM_IDX_GPIOCR_ALTC_MAX; i++) {
+               if (pin_desc->altcx[i].used == true) {
+                       reg = gpiocr_regs[pin_desc->altcx[i].reg_index];
+                       bit = pin_desc->altcx[i].control_bit;
+                       if (readl(npct->prcm_base + reg) & BIT(bit))
+                               return NMK_GPIO_ALT_C+i+1;
+               }
+       }
+       return NMK_GPIO_ALT_C;
+}
+
+int nmk_gpio_get_mode(int gpio)
+{
+       struct nmk_gpio_chip *nmk_chip;
+       u32 afunc, bfunc, bit;
+
+       nmk_chip = nmk_gpio_chips[gpio / NMK_GPIO_PER_CHIP];
+       if (!nmk_chip)
+               return -EINVAL;
+
+       bit = 1 << (gpio % NMK_GPIO_PER_CHIP);
+
+       clk_enable(nmk_chip->clk);
+
+       afunc = readl(nmk_chip->addr + NMK_GPIO_AFSLA) & bit;
+       bfunc = readl(nmk_chip->addr + NMK_GPIO_AFSLB) & bit;
+
+       clk_disable(nmk_chip->clk);
+
+       return (afunc ? NMK_GPIO_ALT_A : 0) | (bfunc ? NMK_GPIO_ALT_B : 0);
+}
+EXPORT_SYMBOL(nmk_gpio_get_mode);
+
+
+/* IRQ functions */
+static inline int nmk_gpio_get_bitmask(int gpio)
+{
+       return 1 << (gpio % NMK_GPIO_PER_CHIP);
+}
+
+static void nmk_gpio_irq_ack(struct irq_data *d)
+{
+       struct gpio_chip *chip = irq_data_get_irq_chip_data(d);
+       struct nmk_gpio_chip *nmk_chip = container_of(chip, struct nmk_gpio_chip, chip);
+
+       clk_enable(nmk_chip->clk);
+       writel(nmk_gpio_get_bitmask(d->hwirq), nmk_chip->addr + NMK_GPIO_IC);
+       clk_disable(nmk_chip->clk);
+}
+
+enum nmk_gpio_irq_type {
+       NORMAL,
+       WAKE,
+};
+
+static void __nmk_gpio_irq_modify(struct nmk_gpio_chip *nmk_chip,
+                                 int gpio, enum nmk_gpio_irq_type which,
+                                 bool enable)
+{
+       u32 bitmask = nmk_gpio_get_bitmask(gpio);
+       u32 *rimscval;
+       u32 *fimscval;
+       u32 rimscreg;
+       u32 fimscreg;
+
+       if (which == NORMAL) {
+               rimscreg = NMK_GPIO_RIMSC;
+               fimscreg = NMK_GPIO_FIMSC;
+               rimscval = &nmk_chip->rimsc;
+               fimscval = &nmk_chip->fimsc;
+       } else  {
+               rimscreg = NMK_GPIO_RWIMSC;
+               fimscreg = NMK_GPIO_FWIMSC;
+               rimscval = &nmk_chip->rwimsc;
+               fimscval = &nmk_chip->fwimsc;
+       }
+
+       /* we must individually set/clear the two edges */
+       if (nmk_chip->edge_rising & bitmask) {
+               if (enable)
+                       *rimscval |= bitmask;
+               else
+                       *rimscval &= ~bitmask;
+               writel(*rimscval, nmk_chip->addr + rimscreg);
+       }
+       if (nmk_chip->edge_falling & bitmask) {
+               if (enable)
+                       *fimscval |= bitmask;
+               else
+                       *fimscval &= ~bitmask;
+               writel(*fimscval, nmk_chip->addr + fimscreg);
+       }
+}
+
+static void __nmk_gpio_set_wake(struct nmk_gpio_chip *nmk_chip,
+                               int gpio, bool on)
+{
+       /*
+        * Ensure WAKEUP_ENABLE is on.  No need to disable it if wakeup is
+        * disabled, since setting SLPM to 1 increases power consumption, and
+        * wakeup is anyhow controlled by the RIMSC and FIMSC registers.
+        */
+       if (nmk_chip->sleepmode && on) {
+               __nmk_gpio_set_slpm(nmk_chip, gpio % NMK_GPIO_PER_CHIP,
+                                   NMK_GPIO_SLPM_WAKEUP_ENABLE);
+       }
+
+       __nmk_gpio_irq_modify(nmk_chip, gpio, WAKE, on);
+}
+
+static int nmk_gpio_irq_maskunmask(struct irq_data *d, bool enable)
+{
+       struct nmk_gpio_chip *nmk_chip;
+       unsigned long flags;
+       u32 bitmask;
+
+       nmk_chip = irq_data_get_irq_chip_data(d);
+       bitmask = nmk_gpio_get_bitmask(d->hwirq);
+       if (!nmk_chip)
+               return -EINVAL;
+
+       clk_enable(nmk_chip->clk);
+       spin_lock_irqsave(&nmk_gpio_slpm_lock, flags);
+       spin_lock(&nmk_chip->lock);
+
+       __nmk_gpio_irq_modify(nmk_chip, d->hwirq, NORMAL, enable);
+
+       if (!(nmk_chip->real_wake & bitmask))
+               __nmk_gpio_set_wake(nmk_chip, d->hwirq, enable);
+
+       spin_unlock(&nmk_chip->lock);
+       spin_unlock_irqrestore(&nmk_gpio_slpm_lock, flags);
+       clk_disable(nmk_chip->clk);
+
+       return 0;
+}
+
+static void nmk_gpio_irq_mask(struct irq_data *d)
+{
+       nmk_gpio_irq_maskunmask(d, false);
+}
+
+static void nmk_gpio_irq_unmask(struct irq_data *d)
+{
+       nmk_gpio_irq_maskunmask(d, true);
+}
+
+static int nmk_gpio_irq_set_wake(struct irq_data *d, unsigned int on)
+{
+       struct nmk_gpio_chip *nmk_chip;
+       unsigned long flags;
+       u32 bitmask;
+
+       nmk_chip = irq_data_get_irq_chip_data(d);
+       if (!nmk_chip)
+               return -EINVAL;
+       bitmask = nmk_gpio_get_bitmask(d->hwirq);
+
+       clk_enable(nmk_chip->clk);
+       spin_lock_irqsave(&nmk_gpio_slpm_lock, flags);
+       spin_lock(&nmk_chip->lock);
+
+       if (irqd_irq_disabled(d))
+               __nmk_gpio_set_wake(nmk_chip, d->hwirq, on);
+
+       if (on)
+               nmk_chip->real_wake |= bitmask;
+       else
+               nmk_chip->real_wake &= ~bitmask;
+
+       spin_unlock(&nmk_chip->lock);
+       spin_unlock_irqrestore(&nmk_gpio_slpm_lock, flags);
+       clk_disable(nmk_chip->clk);
+
+       return 0;
+}
+
+static int nmk_gpio_irq_set_type(struct irq_data *d, unsigned int type)
+{
+       bool enabled = !irqd_irq_disabled(d);
+       bool wake = irqd_is_wakeup_set(d);
+       struct nmk_gpio_chip *nmk_chip;
+       unsigned long flags;
+       u32 bitmask;
+
+       nmk_chip = irq_data_get_irq_chip_data(d);
+       bitmask = nmk_gpio_get_bitmask(d->hwirq);
+       if (!nmk_chip)
+               return -EINVAL;
+       if (type & IRQ_TYPE_LEVEL_HIGH)
+               return -EINVAL;
+       if (type & IRQ_TYPE_LEVEL_LOW)
+               return -EINVAL;
+
+       clk_enable(nmk_chip->clk);
+       spin_lock_irqsave(&nmk_chip->lock, flags);
+
+       if (enabled)
+               __nmk_gpio_irq_modify(nmk_chip, d->hwirq, NORMAL, false);
+
+       if (enabled || wake)
+               __nmk_gpio_irq_modify(nmk_chip, d->hwirq, WAKE, false);
+
+       nmk_chip->edge_rising &= ~bitmask;
+       if (type & IRQ_TYPE_EDGE_RISING)
+               nmk_chip->edge_rising |= bitmask;
+
+       nmk_chip->edge_falling &= ~bitmask;
+       if (type & IRQ_TYPE_EDGE_FALLING)
+               nmk_chip->edge_falling |= bitmask;
+
+       if (enabled)
+               __nmk_gpio_irq_modify(nmk_chip, d->hwirq, NORMAL, true);
+
+       if (enabled || wake)
+               __nmk_gpio_irq_modify(nmk_chip, d->hwirq, WAKE, true);
+
+       spin_unlock_irqrestore(&nmk_chip->lock, flags);
+       clk_disable(nmk_chip->clk);
+
+       return 0;
+}
+
+static unsigned int nmk_gpio_irq_startup(struct irq_data *d)
+{
+       struct nmk_gpio_chip *nmk_chip = irq_data_get_irq_chip_data(d);
+
+       clk_enable(nmk_chip->clk);
+       nmk_gpio_irq_unmask(d);
+       return 0;
+}
+
+static void nmk_gpio_irq_shutdown(struct irq_data *d)
+{
+       struct nmk_gpio_chip *nmk_chip = irq_data_get_irq_chip_data(d);
+
+       nmk_gpio_irq_mask(d);
+       clk_disable(nmk_chip->clk);
+}
+
+static struct irq_chip nmk_gpio_irq_chip = {
+       .name           = "Nomadik-GPIO",
+       .irq_ack        = nmk_gpio_irq_ack,
+       .irq_mask       = nmk_gpio_irq_mask,
+       .irq_unmask     = nmk_gpio_irq_unmask,
+       .irq_set_type   = nmk_gpio_irq_set_type,
+       .irq_set_wake   = nmk_gpio_irq_set_wake,
+       .irq_startup    = nmk_gpio_irq_startup,
+       .irq_shutdown   = nmk_gpio_irq_shutdown,
+       .flags          = IRQCHIP_MASK_ON_SUSPEND,
+};
+
+static void __nmk_gpio_irq_handler(unsigned int irq, struct irq_desc *desc,
+                                  u32 status)
+{
+       struct irq_chip *host_chip = irq_get_chip(irq);
+       struct gpio_chip *chip = irq_desc_get_handler_data(desc);
+
+       chained_irq_enter(host_chip, desc);
+
+       while (status) {
+               int bit = __ffs(status);
+
+               generic_handle_irq(irq_find_mapping(chip->irqdomain, bit));
+               status &= ~BIT(bit);
+       }
+
+       chained_irq_exit(host_chip, desc);
+}
+
+static void nmk_gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
+{
+       struct gpio_chip *chip = irq_desc_get_handler_data(desc);
+       struct nmk_gpio_chip *nmk_chip = container_of(chip, struct nmk_gpio_chip, chip);
+       u32 status;
+
+       clk_enable(nmk_chip->clk);
+       status = readl(nmk_chip->addr + NMK_GPIO_IS);
+       clk_disable(nmk_chip->clk);
+
+       __nmk_gpio_irq_handler(irq, desc, status);
+}
+
+static void nmk_gpio_latent_irq_handler(unsigned int irq,
+                                          struct irq_desc *desc)
+{
+       struct gpio_chip *chip = irq_desc_get_handler_data(desc);
+       struct nmk_gpio_chip *nmk_chip = container_of(chip, struct nmk_gpio_chip, chip);
+       u32 status = nmk_chip->get_latent_status(nmk_chip->bank);
+
+       __nmk_gpio_irq_handler(irq, desc, status);
+}
+
+/* I/O Functions */
+
+static int nmk_gpio_request(struct gpio_chip *chip, unsigned offset)
+{
+       /*
+        * Map back to global GPIO space and request muxing, the direction
+        * parameter does not matter for this controller.
+        */
+       int gpio = chip->base + offset;
+
+       return pinctrl_request_gpio(gpio);
+}
+
+static void nmk_gpio_free(struct gpio_chip *chip, unsigned offset)
+{
+       int gpio = chip->base + offset;
+
+       pinctrl_free_gpio(gpio);
+}
+
+static int nmk_gpio_make_input(struct gpio_chip *chip, unsigned offset)
+{
+       struct nmk_gpio_chip *nmk_chip =
+               container_of(chip, struct nmk_gpio_chip, chip);
+
+       clk_enable(nmk_chip->clk);
+
+       writel(1 << offset, nmk_chip->addr + NMK_GPIO_DIRC);
+
+       clk_disable(nmk_chip->clk);
+
+       return 0;
+}
+
+static int nmk_gpio_get_input(struct gpio_chip *chip, unsigned offset)
+{
+       struct nmk_gpio_chip *nmk_chip =
+               container_of(chip, struct nmk_gpio_chip, chip);
+       u32 bit = 1 << offset;
+       int value;
+
+       clk_enable(nmk_chip->clk);
+
+       value = (readl(nmk_chip->addr + NMK_GPIO_DAT) & bit) != 0;
+
+       clk_disable(nmk_chip->clk);
+
+       return value;
+}
+
+static void nmk_gpio_set_output(struct gpio_chip *chip, unsigned offset,
+                               int val)
+{
+       struct nmk_gpio_chip *nmk_chip =
+               container_of(chip, struct nmk_gpio_chip, chip);
+
+       clk_enable(nmk_chip->clk);
+
+       __nmk_gpio_set_output(nmk_chip, offset, val);
+
+       clk_disable(nmk_chip->clk);
+}
+
+static int nmk_gpio_make_output(struct gpio_chip *chip, unsigned offset,
+                               int val)
+{
+       struct nmk_gpio_chip *nmk_chip =
+               container_of(chip, struct nmk_gpio_chip, chip);
+
+       clk_enable(nmk_chip->clk);
+
+       __nmk_gpio_make_output(nmk_chip, offset, val);
+
+       clk_disable(nmk_chip->clk);
+
+       return 0;
+}
+
+#ifdef CONFIG_DEBUG_FS
+
+#include <linux/seq_file.h>
+
+static void nmk_gpio_dbg_show_one(struct seq_file *s,
+       struct pinctrl_dev *pctldev, struct gpio_chip *chip,
+       unsigned offset, unsigned gpio)
+{
+       const char *label = gpiochip_is_requested(chip, offset);
+       struct nmk_gpio_chip *nmk_chip =
+               container_of(chip, struct nmk_gpio_chip, chip);
+       int mode;
+       bool is_out;
+       bool pull;
+       u32 bit = 1 << offset;
+       const char *modes[] = {
+               [NMK_GPIO_ALT_GPIO]     = "gpio",
+               [NMK_GPIO_ALT_A]        = "altA",
+               [NMK_GPIO_ALT_B]        = "altB",
+               [NMK_GPIO_ALT_C]        = "altC",
+               [NMK_GPIO_ALT_C+1]      = "altC1",
+               [NMK_GPIO_ALT_C+2]      = "altC2",
+               [NMK_GPIO_ALT_C+3]      = "altC3",
+               [NMK_GPIO_ALT_C+4]      = "altC4",
+       };
+
+       clk_enable(nmk_chip->clk);
+       is_out = !!(readl(nmk_chip->addr + NMK_GPIO_DIR) & bit);
+       pull = !(readl(nmk_chip->addr + NMK_GPIO_PDIS) & bit);
+       mode = nmk_gpio_get_mode(gpio);
+       if ((mode == NMK_GPIO_ALT_C) && pctldev)
+               mode = nmk_prcm_gpiocr_get_mode(pctldev, gpio);
+
+       seq_printf(s, " gpio-%-3d (%-20.20s) %s %s %s %s",
+                  gpio, label ?: "(none)",
+                  is_out ? "out" : "in ",
+                  chip->get
+                  ? (chip->get(chip, offset) ? "hi" : "lo")
+                  : "?  ",
+                  (mode < 0) ? "unknown" : modes[mode],
+                  pull ? "pull" : "none");
+
+       if (!is_out) {
+               int irq = gpio_to_irq(gpio);
+               struct irq_desc *desc = irq_to_desc(irq);
+
+               /* This races with request_irq(), set_irq_type(),
+                * and set_irq_wake() ... but those are "rare".
+                */
+               if (irq > 0 && desc && desc->action) {
+                       char *trigger;
+                       u32 bitmask = nmk_gpio_get_bitmask(gpio);
+
+                       if (nmk_chip->edge_rising & bitmask)
+                               trigger = "edge-rising";
+                       else if (nmk_chip->edge_falling & bitmask)
+                               trigger = "edge-falling";
+                       else
+                               trigger = "edge-undefined";
+
+                       seq_printf(s, " irq-%d %s%s",
+                                  irq, trigger,
+                                  irqd_is_wakeup_set(&desc->irq_data)
+                                  ? " wakeup" : "");
+               }
+       }
+       clk_disable(nmk_chip->clk);
+}
+
+static void nmk_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
+{
+       unsigned                i;
+       unsigned                gpio = chip->base;
+
+       for (i = 0; i < chip->ngpio; i++, gpio++) {
+               nmk_gpio_dbg_show_one(s, NULL, chip, i, gpio);
+               seq_printf(s, "\n");
+       }
+}
+
+#else
+static inline void nmk_gpio_dbg_show_one(struct seq_file *s,
+                                        struct pinctrl_dev *pctldev,
+                                        struct gpio_chip *chip,
+                                        unsigned offset, unsigned gpio)
+{
+}
+#define nmk_gpio_dbg_show      NULL
+#endif
+
+/* This structure is replicated for each GPIO block allocated at probe time */
+static struct gpio_chip nmk_gpio_template = {
+       .request                = nmk_gpio_request,
+       .free                   = nmk_gpio_free,
+       .direction_input        = nmk_gpio_make_input,
+       .get                    = nmk_gpio_get_input,
+       .direction_output       = nmk_gpio_make_output,
+       .set                    = nmk_gpio_set_output,
+       .dbg_show               = nmk_gpio_dbg_show,
+       .can_sleep              = false,
+};
+
+void nmk_gpio_clocks_enable(void)
+{
+       int i;
+
+       for (i = 0; i < NUM_BANKS; i++) {
+               struct nmk_gpio_chip *chip = nmk_gpio_chips[i];
+
+               if (!chip)
+                       continue;
+
+               clk_enable(chip->clk);
+       }
+}
+
+void nmk_gpio_clocks_disable(void)
+{
+       int i;
+
+       for (i = 0; i < NUM_BANKS; i++) {
+               struct nmk_gpio_chip *chip = nmk_gpio_chips[i];
+
+               if (!chip)
+                       continue;
+
+               clk_disable(chip->clk);
+       }
+}
+
+/*
+ * Called from the suspend/resume path to only keep the real wakeup interrupts
+ * (those that have had set_irq_wake() called on them) as wakeup interrupts,
+ * and not the rest of the interrupts which we needed to have as wakeups for
+ * cpuidle.
+ *
+ * PM ops are not used since this needs to be done at the end, after all the
+ * other drivers are done with their suspend callbacks.
+ */
+void nmk_gpio_wakeups_suspend(void)
+{
+       int i;
+
+       for (i = 0; i < NUM_BANKS; i++) {
+               struct nmk_gpio_chip *chip = nmk_gpio_chips[i];
+
+               if (!chip)
+                       break;
+
+               clk_enable(chip->clk);
+
+               writel(chip->rwimsc & chip->real_wake,
+                      chip->addr + NMK_GPIO_RWIMSC);
+               writel(chip->fwimsc & chip->real_wake,
+                      chip->addr + NMK_GPIO_FWIMSC);
+
+               clk_disable(chip->clk);
+       }
+}
+
+void nmk_gpio_wakeups_resume(void)
+{
+       int i;
+
+       for (i = 0; i < NUM_BANKS; i++) {
+               struct nmk_gpio_chip *chip = nmk_gpio_chips[i];
+
+               if (!chip)
+                       break;
+
+               clk_enable(chip->clk);
+
+               writel(chip->rwimsc, chip->addr + NMK_GPIO_RWIMSC);
+               writel(chip->fwimsc, chip->addr + NMK_GPIO_FWIMSC);
+
+               clk_disable(chip->clk);
+       }
+}
+
+/*
+ * Read the pull up/pull down status.
+ * A bit set in 'pull_up' means that pull up
+ * is selected if pull is enabled in PDIS register.
+ * Note: only pull up/down set via this driver can
+ * be detected due to HW limitations.
+ */
+void nmk_gpio_read_pull(int gpio_bank, u32 *pull_up)
+{
+       if (gpio_bank < NUM_BANKS) {
+               struct nmk_gpio_chip *chip = nmk_gpio_chips[gpio_bank];
+
+               if (!chip)
+                       return;
+
+               *pull_up = chip->pull_up;
+       }
+}
+
+static int nmk_gpio_probe(struct platform_device *dev)
+{
+       struct device_node *np = dev->dev.of_node;
+       struct nmk_gpio_chip *nmk_chip;
+       struct gpio_chip *chip;
+       struct resource *res;
+       struct clk *clk;
+       int latent_irq;
+       bool supports_sleepmode;
+       void __iomem *base;
+       int irq;
+       int ret;
+
+       if (of_get_property(np, "st,supports-sleepmode", NULL))
+               supports_sleepmode = true;
+       else
+               supports_sleepmode = false;
+
+       if (of_property_read_u32(np, "gpio-bank", &dev->id)) {
+               dev_err(&dev->dev, "gpio-bank property not found\n");
+               return -EINVAL;
+       }
+
+       irq = platform_get_irq(dev, 0);
+       if (irq < 0)
+               return irq;
+
+       /* It's OK for this IRQ not to be present */
+       latent_irq = platform_get_irq(dev, 1);
+
+       res = platform_get_resource(dev, IORESOURCE_MEM, 0);
+       base = devm_ioremap_resource(&dev->dev, res);
+       if (IS_ERR(base))
+               return PTR_ERR(base);
+
+       clk = devm_clk_get(&dev->dev, NULL);
+       if (IS_ERR(clk))
+               return PTR_ERR(clk);
+       clk_prepare(clk);
+
+       nmk_chip = devm_kzalloc(&dev->dev, sizeof(*nmk_chip), GFP_KERNEL);
+       if (!nmk_chip)
+               return -ENOMEM;
+
+       /*
+        * The virt address in nmk_chip->addr is in the nomadik register space,
+        * so we can simply convert the resource address, without remapping
+        */
+       nmk_chip->bank = dev->id;
+       nmk_chip->clk = clk;
+       nmk_chip->addr = base;
+       nmk_chip->chip = nmk_gpio_template;
+       nmk_chip->parent_irq = irq;
+       nmk_chip->latent_parent_irq = latent_irq;
+       nmk_chip->sleepmode = supports_sleepmode;
+       spin_lock_init(&nmk_chip->lock);
+
+       chip = &nmk_chip->chip;
+       chip->base = dev->id * NMK_GPIO_PER_CHIP;
+       chip->ngpio = NMK_GPIO_PER_CHIP;
+       chip->label = dev_name(&dev->dev);
+       chip->dev = &dev->dev;
+       chip->owner = THIS_MODULE;
+
+       clk_enable(nmk_chip->clk);
+       nmk_chip->lowemi = readl_relaxed(nmk_chip->addr + NMK_GPIO_LOWEMI);
+       clk_disable(nmk_chip->clk);
+       chip->of_node = np;
+
+       ret = gpiochip_add(&nmk_chip->chip);
+       if (ret)
+               return ret;
+
+       BUG_ON(nmk_chip->bank >= ARRAY_SIZE(nmk_gpio_chips));
+
+       nmk_gpio_chips[nmk_chip->bank] = nmk_chip;
+
+       platform_set_drvdata(dev, nmk_chip);
+
+       /*
+        * Let the generic code handle this edge IRQ, the the chained
+        * handler will perform the actual work of handling the parent
+        * interrupt.
+        */
+       ret = gpiochip_irqchip_add(&nmk_chip->chip,
+                                  &nmk_gpio_irq_chip,
+                                  0,
+                                  handle_edge_irq,
+                                  IRQ_TYPE_EDGE_FALLING);
+       if (ret) {
+               dev_err(&dev->dev, "could not add irqchip\n");
+               ret = gpiochip_remove(&nmk_chip->chip);
+               return -ENODEV;
+       }
+       /* Then register the chain on the parent IRQ */
+       gpiochip_set_chained_irqchip(&nmk_chip->chip,
+                                    &nmk_gpio_irq_chip,
+                                    nmk_chip->parent_irq,
+                                    nmk_gpio_irq_handler);
+       if (nmk_chip->latent_parent_irq > 0)
+               gpiochip_set_chained_irqchip(&nmk_chip->chip,
+                                            &nmk_gpio_irq_chip,
+                                            nmk_chip->latent_parent_irq,
+                                            nmk_gpio_latent_irq_handler);
+
+       dev_info(&dev->dev, "at address %p\n", nmk_chip->addr);
+
+       return 0;
+}
+
+static int nmk_get_groups_cnt(struct pinctrl_dev *pctldev)
+{
+       struct nmk_pinctrl *npct = pinctrl_dev_get_drvdata(pctldev);
+
+       return npct->soc->ngroups;
+}
+
+static const char *nmk_get_group_name(struct pinctrl_dev *pctldev,
+                                      unsigned selector)
+{
+       struct nmk_pinctrl *npct = pinctrl_dev_get_drvdata(pctldev);
+
+       return npct->soc->groups[selector].name;
+}
+
+static int nmk_get_group_pins(struct pinctrl_dev *pctldev, unsigned selector,
+                             const unsigned **pins,
+                             unsigned *num_pins)
+{
+       struct nmk_pinctrl *npct = pinctrl_dev_get_drvdata(pctldev);
+
+       *pins = npct->soc->groups[selector].pins;
+       *num_pins = npct->soc->groups[selector].npins;
+       return 0;
+}
+
+static struct pinctrl_gpio_range *
+nmk_match_gpio_range(struct pinctrl_dev *pctldev, unsigned offset)
+{
+       struct nmk_pinctrl *npct = pinctrl_dev_get_drvdata(pctldev);
+       int i;
+
+       for (i = 0; i < npct->soc->gpio_num_ranges; i++) {
+               struct pinctrl_gpio_range *range;
+
+               range = &npct->soc->gpio_ranges[i];
+               if (offset >= range->pin_base &&
+                   offset <= (range->pin_base + range->npins - 1))
+                       return range;
+       }
+       return NULL;
+}
+
+static void nmk_pin_dbg_show(struct pinctrl_dev *pctldev, struct seq_file *s,
+                  unsigned offset)
+{
+       struct pinctrl_gpio_range *range;
+       struct gpio_chip *chip;
+
+       range = nmk_match_gpio_range(pctldev, offset);
+       if (!range || !range->gc) {
+               seq_printf(s, "invalid pin offset");
+               return;
+       }
+       chip = range->gc;
+       nmk_gpio_dbg_show_one(s, pctldev, chip, offset - chip->base, offset);
+}
+
+static void nmk_pinctrl_dt_free_map(struct pinctrl_dev *pctldev,
+               struct pinctrl_map *map, unsigned num_maps)
+{
+       int i;
+
+       for (i = 0; i < num_maps; i++)
+               if (map[i].type == PIN_MAP_TYPE_CONFIGS_PIN)
+                       kfree(map[i].data.configs.configs);
+       kfree(map);
+}
+
+static int nmk_dt_reserve_map(struct pinctrl_map **map, unsigned *reserved_maps,
+               unsigned *num_maps, unsigned reserve)
+{
+       unsigned old_num = *reserved_maps;
+       unsigned new_num = *num_maps + reserve;
+       struct pinctrl_map *new_map;
+
+       if (old_num >= new_num)
+               return 0;
+
+       new_map = krealloc(*map, sizeof(*new_map) * new_num, GFP_KERNEL);
+       if (!new_map)
+               return -ENOMEM;
+
+       memset(new_map + old_num, 0, (new_num - old_num) * sizeof(*new_map));
+
+       *map = new_map;
+       *reserved_maps = new_num;
+
+       return 0;
+}
+
+static int nmk_dt_add_map_mux(struct pinctrl_map **map, unsigned *reserved_maps,
+               unsigned *num_maps, const char *group,
+               const char *function)
+{
+       if (*num_maps == *reserved_maps)
+               return -ENOSPC;
+
+       (*map)[*num_maps].type = PIN_MAP_TYPE_MUX_GROUP;
+       (*map)[*num_maps].data.mux.group = group;
+       (*map)[*num_maps].data.mux.function = function;
+       (*num_maps)++;
+
+       return 0;
+}
+
+static int nmk_dt_add_map_configs(struct pinctrl_map **map,
+               unsigned *reserved_maps,
+               unsigned *num_maps, const char *group,
+               unsigned long *configs, unsigned num_configs)
+{
+       unsigned long *dup_configs;
+
+       if (*num_maps == *reserved_maps)
+               return -ENOSPC;
+
+       dup_configs = kmemdup(configs, num_configs * sizeof(*dup_configs),
+                             GFP_KERNEL);
+       if (!dup_configs)
+               return -ENOMEM;
+
+       (*map)[*num_maps].type = PIN_MAP_TYPE_CONFIGS_PIN;
+
+       (*map)[*num_maps].data.configs.group_or_pin = group;
+       (*map)[*num_maps].data.configs.configs = dup_configs;
+       (*map)[*num_maps].data.configs.num_configs = num_configs;
+       (*num_maps)++;
+
+       return 0;
+}
+
+#define NMK_CONFIG_PIN(x, y) { .property = x, .config = y, }
+#define NMK_CONFIG_PIN_ARRAY(x, y) { .property = x, .choice = y, \
+       .size = ARRAY_SIZE(y), }
+
+static const unsigned long nmk_pin_input_modes[] = {
+       PIN_INPUT_NOPULL,
+       PIN_INPUT_PULLUP,
+       PIN_INPUT_PULLDOWN,
+};
+
+static const unsigned long nmk_pin_output_modes[] = {
+       PIN_OUTPUT_LOW,
+       PIN_OUTPUT_HIGH,
+       PIN_DIR_OUTPUT,
+};
+
+static const unsigned long nmk_pin_sleep_modes[] = {
+       PIN_SLEEPMODE_DISABLED,
+       PIN_SLEEPMODE_ENABLED,
+};
+
+static const unsigned long nmk_pin_sleep_input_modes[] = {
+       PIN_SLPM_INPUT_NOPULL,
+       PIN_SLPM_INPUT_PULLUP,
+       PIN_SLPM_INPUT_PULLDOWN,
+       PIN_SLPM_DIR_INPUT,
+};
+
+static const unsigned long nmk_pin_sleep_output_modes[] = {
+       PIN_SLPM_OUTPUT_LOW,
+       PIN_SLPM_OUTPUT_HIGH,
+       PIN_SLPM_DIR_OUTPUT,
+};
+
+static const unsigned long nmk_pin_sleep_wakeup_modes[] = {
+       PIN_SLPM_WAKEUP_DISABLE,
+       PIN_SLPM_WAKEUP_ENABLE,
+};
+
+static const unsigned long nmk_pin_gpio_modes[] = {
+       PIN_GPIOMODE_DISABLED,
+       PIN_GPIOMODE_ENABLED,
+};
+
+static const unsigned long nmk_pin_sleep_pdis_modes[] = {
+       PIN_SLPM_PDIS_DISABLED,
+       PIN_SLPM_PDIS_ENABLED,
+};
+
+struct nmk_cfg_param {
+       const char *property;
+       unsigned long config;
+       const unsigned long *choice;
+       int size;
+};
+
+static const struct nmk_cfg_param nmk_cfg_params[] = {
+       NMK_CONFIG_PIN_ARRAY("ste,input",               nmk_pin_input_modes),
+       NMK_CONFIG_PIN_ARRAY("ste,output",              nmk_pin_output_modes),
+       NMK_CONFIG_PIN_ARRAY("ste,sleep",               nmk_pin_sleep_modes),
+       NMK_CONFIG_PIN_ARRAY("ste,sleep-input",         nmk_pin_sleep_input_modes),
+       NMK_CONFIG_PIN_ARRAY("ste,sleep-output",        nmk_pin_sleep_output_modes),
+       NMK_CONFIG_PIN_ARRAY("ste,sleep-wakeup",        nmk_pin_sleep_wakeup_modes),
+       NMK_CONFIG_PIN_ARRAY("ste,gpio",                nmk_pin_gpio_modes),
+       NMK_CONFIG_PIN_ARRAY("ste,sleep-pull-disable",  nmk_pin_sleep_pdis_modes),
+};
+
+static int nmk_dt_pin_config(int index, int val, unsigned long *config)
+{
+       int ret = 0;
+
+       if (nmk_cfg_params[index].choice == NULL)
+               *config = nmk_cfg_params[index].config;
+       else {
+               /* test if out of range */
+               if  (val < nmk_cfg_params[index].size) {
+                       *config = nmk_cfg_params[index].config |
+                               nmk_cfg_params[index].choice[val];
+               }
+       }
+       return ret;
+}
+
+static const char *nmk_find_pin_name(struct pinctrl_dev *pctldev, const char *pin_name)
+{
+       int i, pin_number;
+       struct nmk_pinctrl *npct = pinctrl_dev_get_drvdata(pctldev);
+
+       if (sscanf((char *)pin_name, "GPIO%d", &pin_number) == 1)
+               for (i = 0; i < npct->soc->npins; i++)
+                       if (npct->soc->pins[i].number == pin_number)
+                               return npct->soc->pins[i].name;
+       return NULL;
+}
+
+static bool nmk_pinctrl_dt_get_config(struct device_node *np,
+               unsigned long *configs)
+{
+       bool has_config = 0;
+       unsigned long cfg = 0;
+       int i, val, ret;
+
+       for (i = 0; i < ARRAY_SIZE(nmk_cfg_params); i++) {
+               ret = of_property_read_u32(np,
+                               nmk_cfg_params[i].property, &val);
+               if (ret != -EINVAL) {
+                       if (nmk_dt_pin_config(i, val, &cfg) == 0) {
+                               *configs |= cfg;
+                               has_config = 1;
+                       }
+               }
+       }
+
+       return has_config;
+}
+
+static int nmk_pinctrl_dt_subnode_to_map(struct pinctrl_dev *pctldev,
+               struct device_node *np,
+               struct pinctrl_map **map,
+               unsigned *reserved_maps,
+               unsigned *num_maps)
+{
+       int ret;
+       const char *function = NULL;
+       unsigned long configs = 0;
+       bool has_config = 0;
+       unsigned reserve = 0;
+       struct property *prop;
+       const char *group, *gpio_name;
+       struct device_node *np_config;
+
+       ret = of_property_read_string(np, "ste,function", &function);
+       if (ret >= 0)
+               reserve = 1;
+
+       has_config = nmk_pinctrl_dt_get_config(np, &configs);
+
+       np_config = of_parse_phandle(np, "ste,config", 0);
+       if (np_config)
+               has_config |= nmk_pinctrl_dt_get_config(np_config, &configs);
+
+       ret = of_property_count_strings(np, "ste,pins");
+       if (ret < 0)
+               goto exit;
+
+       if (has_config)
+               reserve++;
+
+       reserve *= ret;
+
+       ret = nmk_dt_reserve_map(map, reserved_maps, num_maps, reserve);
+       if (ret < 0)
+               goto exit;
+
+       of_property_for_each_string(np, "ste,pins", prop, group) {
+               if (function) {
+                       ret = nmk_dt_add_map_mux(map, reserved_maps, num_maps,
+                                         group, function);
+                       if (ret < 0)
+                               goto exit;
+               }
+               if (has_config) {
+                       gpio_name = nmk_find_pin_name(pctldev, group);
+
+                       ret = nmk_dt_add_map_configs(map, reserved_maps, num_maps,
+                                             gpio_name, &configs, 1);
+                       if (ret < 0)
+                               goto exit;
+               }
+
+       }
+exit:
+       return ret;
+}
+
+static int nmk_pinctrl_dt_node_to_map(struct pinctrl_dev *pctldev,
+                                struct device_node *np_config,
+                                struct pinctrl_map **map, unsigned *num_maps)
+{
+       unsigned reserved_maps;
+       struct device_node *np;
+       int ret;
+
+       reserved_maps = 0;
+       *map = NULL;
+       *num_maps = 0;
+
+       for_each_child_of_node(np_config, np) {
+               ret = nmk_pinctrl_dt_subnode_to_map(pctldev, np, map,
+                               &reserved_maps, num_maps);
+               if (ret < 0) {
+                       nmk_pinctrl_dt_free_map(pctldev, *map, *num_maps);
+                       return ret;
+               }
+       }
+
+       return 0;
+}
+
+static const struct pinctrl_ops nmk_pinctrl_ops = {
+       .get_groups_count = nmk_get_groups_cnt,
+       .get_group_name = nmk_get_group_name,
+       .get_group_pins = nmk_get_group_pins,
+       .pin_dbg_show = nmk_pin_dbg_show,
+       .dt_node_to_map = nmk_pinctrl_dt_node_to_map,
+       .dt_free_map = nmk_pinctrl_dt_free_map,
+};
+
+static int nmk_pmx_get_funcs_cnt(struct pinctrl_dev *pctldev)
+{
+       struct nmk_pinctrl *npct = pinctrl_dev_get_drvdata(pctldev);
+
+       return npct->soc->nfunctions;
+}
+
+static const char *nmk_pmx_get_func_name(struct pinctrl_dev *pctldev,
+                                        unsigned function)
+{
+       struct nmk_pinctrl *npct = pinctrl_dev_get_drvdata(pctldev);
+
+       return npct->soc->functions[function].name;
+}
+
+static int nmk_pmx_get_func_groups(struct pinctrl_dev *pctldev,
+                                  unsigned function,
+                                  const char * const **groups,
+                                  unsigned * const num_groups)
+{
+       struct nmk_pinctrl *npct = pinctrl_dev_get_drvdata(pctldev);
+
+       *groups = npct->soc->functions[function].groups;
+       *num_groups = npct->soc->functions[function].ngroups;
+
+       return 0;
+}
+
+static int nmk_pmx_enable(struct pinctrl_dev *pctldev, unsigned function,
+                         unsigned group)
+{
+       struct nmk_pinctrl *npct = pinctrl_dev_get_drvdata(pctldev);
+       const struct nmk_pingroup *g;
+       static unsigned int slpm[NUM_BANKS];
+       unsigned long flags = 0;
+       bool glitch;
+       int ret = -EINVAL;
+       int i;
+
+       g = &npct->soc->groups[group];
+
+       if (g->altsetting < 0)
+               return -EINVAL;
+
+       dev_dbg(npct->dev, "enable group %s, %u pins\n", g->name, g->npins);
+
+       /*
+        * If we're setting altfunc C by setting both AFSLA and AFSLB to 1,
+        * we may pass through an undesired state. In this case we take
+        * some extra care.
+        *
+        * Safe sequence used to switch IOs between GPIO and Alternate-C mode:
+        *  - Save SLPM registers (since we have a shadow register in the
+        *    nmk_chip we're using that as backup)
+        *  - Set SLPM=0 for the IOs you want to switch and others to 1
+        *  - Configure the GPIO registers for the IOs that are being switched
+        *  - Set IOFORCE=1
+        *  - Modify the AFLSA/B registers for the IOs that are being switched
+        *  - Set IOFORCE=0
+        *  - Restore SLPM registers
+        *  - Any spurious wake up event during switch sequence to be ignored
+        *    and cleared
+        *
+        * We REALLY need to save ALL slpm registers, because the external
+        * IOFORCE will switch *all* ports to their sleepmode setting to as
+        * to avoid glitches. (Not just one port!)
+        */
+       glitch = ((g->altsetting & NMK_GPIO_ALT_C) == NMK_GPIO_ALT_C);
+
+       if (glitch) {
+               spin_lock_irqsave(&nmk_gpio_slpm_lock, flags);
+
+               /* Initially don't put any pins to sleep when switching */
+               memset(slpm, 0xff, sizeof(slpm));
+
+               /*
+                * Then mask the pins that need to be sleeping now when we're
+                * switching to the ALT C function.
+                */
+               for (i = 0; i < g->npins; i++)
+                       slpm[g->pins[i] / NMK_GPIO_PER_CHIP] &= ~BIT(g->pins[i]);
+               nmk_gpio_glitch_slpm_init(slpm);
+       }
+
+       for (i = 0; i < g->npins; i++) {
+               struct pinctrl_gpio_range *range;
+               struct nmk_gpio_chip *nmk_chip;
+               struct gpio_chip *chip;
+               unsigned bit;
+
+               range = nmk_match_gpio_range(pctldev, g->pins[i]);
+               if (!range) {
+                       dev_err(npct->dev,
+                               "invalid pin offset %d in group %s at index %d\n",
+                               g->pins[i], g->name, i);
+                       goto out_glitch;
+               }
+               if (!range->gc) {
+                       dev_err(npct->dev, "GPIO chip missing in range for pin offset %d in group %s at index %d\n",
+                               g->pins[i], g->name, i);
+                       goto out_glitch;
+               }
+               chip = range->gc;
+               nmk_chip = container_of(chip, struct nmk_gpio_chip, chip);
+               dev_dbg(npct->dev, "setting pin %d to altsetting %d\n", g->pins[i], g->altsetting);
+
+               clk_enable(nmk_chip->clk);
+               bit = g->pins[i] % NMK_GPIO_PER_CHIP;
+               /*
+                * If the pin is switching to altfunc, and there was an
+                * interrupt installed on it which has been lazy disabled,
+                * actually mask the interrupt to prevent spurious interrupts
+                * that would occur while the pin is under control of the
+                * peripheral. Only SKE does this.
+                */
+               nmk_gpio_disable_lazy_irq(nmk_chip, bit);
+
+               __nmk_gpio_set_mode_safe(nmk_chip, bit,
+                       (g->altsetting & NMK_GPIO_ALT_C), glitch);
+               clk_disable(nmk_chip->clk);
+
+               /*
+                * Call PRCM GPIOCR config function in case ALTC
+                * has been selected:
+                * - If selection is a ALTCx, some bits in PRCM GPIOCR registers
+                *   must be set.
+                * - If selection is pure ALTC and previous selection was ALTCx,
+                *   then some bits in PRCM GPIOCR registers must be cleared.
+                */
+               if ((g->altsetting & NMK_GPIO_ALT_C) == NMK_GPIO_ALT_C)
+                       nmk_prcm_altcx_set_mode(npct, g->pins[i],
+                               g->altsetting >> NMK_GPIO_ALT_CX_SHIFT);
+       }
+
+       /* When all pins are successfully reconfigured we get here */
+       ret = 0;
+
+out_glitch:
+       if (glitch) {
+               nmk_gpio_glitch_slpm_restore(slpm);
+               spin_unlock_irqrestore(&nmk_gpio_slpm_lock, flags);
+       }
+
+       return ret;
+}
+
+static int nmk_gpio_request_enable(struct pinctrl_dev *pctldev,
+                                  struct pinctrl_gpio_range *range,
+                                  unsigned offset)
+{
+       struct nmk_pinctrl *npct = pinctrl_dev_get_drvdata(pctldev);
+       struct nmk_gpio_chip *nmk_chip;
+       struct gpio_chip *chip;
+       unsigned bit;
+
+       if (!range) {
+               dev_err(npct->dev, "invalid range\n");
+               return -EINVAL;
+       }
+       if (!range->gc) {
+               dev_err(npct->dev, "missing GPIO chip in range\n");
+               return -EINVAL;
+       }
+       chip = range->gc;
+       nmk_chip = container_of(chip, struct nmk_gpio_chip, chip);
+
+       dev_dbg(npct->dev, "enable pin %u as GPIO\n", offset);
+
+       clk_enable(nmk_chip->clk);
+       bit = offset % NMK_GPIO_PER_CHIP;
+       /* There is no glitch when converting any pin to GPIO */
+       __nmk_gpio_set_mode(nmk_chip, bit, NMK_GPIO_ALT_GPIO);
+       clk_disable(nmk_chip->clk);
+
+       return 0;
+}
+
+static void nmk_gpio_disable_free(struct pinctrl_dev *pctldev,
+                                 struct pinctrl_gpio_range *range,
+                                 unsigned offset)
+{
+       struct nmk_pinctrl *npct = pinctrl_dev_get_drvdata(pctldev);
+
+       dev_dbg(npct->dev, "disable pin %u as GPIO\n", offset);
+       /* Set the pin to some default state, GPIO is usually default */
+}
+
+static const struct pinmux_ops nmk_pinmux_ops = {
+       .get_functions_count = nmk_pmx_get_funcs_cnt,
+       .get_function_name = nmk_pmx_get_func_name,
+       .get_function_groups = nmk_pmx_get_func_groups,
+       .enable = nmk_pmx_enable,
+       .gpio_request_enable = nmk_gpio_request_enable,
+       .gpio_disable_free = nmk_gpio_disable_free,
+};
+
+static int nmk_pin_config_get(struct pinctrl_dev *pctldev, unsigned pin,
+                             unsigned long *config)
+{
+       /* Not implemented */
+       return -EINVAL;
+}
+
+static int nmk_pin_config_set(struct pinctrl_dev *pctldev, unsigned pin,
+                             unsigned long *configs, unsigned num_configs)
+{
+       static const char *pullnames[] = {
+               [NMK_GPIO_PULL_NONE]    = "none",
+               [NMK_GPIO_PULL_UP]      = "up",
+               [NMK_GPIO_PULL_DOWN]    = "down",
+               [3] /* illegal */       = "??"
+       };
+       static const char *slpmnames[] = {
+               [NMK_GPIO_SLPM_INPUT]           = "input/wakeup",
+               [NMK_GPIO_SLPM_NOCHANGE]        = "no-change/no-wakeup",
+       };
+       struct nmk_pinctrl *npct = pinctrl_dev_get_drvdata(pctldev);
+       struct nmk_gpio_chip *nmk_chip;
+       struct pinctrl_gpio_range *range;
+       struct gpio_chip *chip;
+       unsigned bit;
+       pin_cfg_t cfg;
+       int pull, slpm, output, val, i;
+       bool lowemi, gpiomode, sleep;
+
+       range = nmk_match_gpio_range(pctldev, pin);
+       if (!range) {
+               dev_err(npct->dev, "invalid pin offset %d\n", pin);
+               return -EINVAL;
+       }
+       if (!range->gc) {
+               dev_err(npct->dev, "GPIO chip missing in range for pin %d\n",
+                       pin);
+               return -EINVAL;
+       }
+       chip = range->gc;
+       nmk_chip = container_of(chip, struct nmk_gpio_chip, chip);
+
+       for (i = 0; i < num_configs; i++) {
+               /*
+                * The pin config contains pin number and altfunction fields,
+                * here we just ignore that part. It's being handled by the
+                * framework and pinmux callback respectively.
+                */
+               cfg = (pin_cfg_t) configs[i];
+               pull = PIN_PULL(cfg);
+               slpm = PIN_SLPM(cfg);
+               output = PIN_DIR(cfg);
+               val = PIN_VAL(cfg);
+               lowemi = PIN_LOWEMI(cfg);
+               gpiomode = PIN_GPIOMODE(cfg);
+               sleep = PIN_SLEEPMODE(cfg);
+
+               if (sleep) {
+                       int slpm_pull = PIN_SLPM_PULL(cfg);
+                       int slpm_output = PIN_SLPM_DIR(cfg);
+                       int slpm_val = PIN_SLPM_VAL(cfg);
+
+                       /* All pins go into GPIO mode at sleep */
+                       gpiomode = true;
+
+                       /*
+                        * The SLPM_* values are normal values + 1 to allow zero
+                        * to mean "same as normal".
+                        */
+                       if (slpm_pull)
+                               pull = slpm_pull - 1;
+                       if (slpm_output)
+                               output = slpm_output - 1;
+                       if (slpm_val)
+                               val = slpm_val - 1;
+
+                       dev_dbg(nmk_chip->chip.dev,
+                               "pin %d: sleep pull %s, dir %s, val %s\n",
+                               pin,
+                               slpm_pull ? pullnames[pull] : "same",
+                               slpm_output ? (output ? "output" : "input")
+                               : "same",
+                               slpm_val ? (val ? "high" : "low") : "same");
+               }
+
+               dev_dbg(nmk_chip->chip.dev,
+                       "pin %d [%#lx]: pull %s, slpm %s (%s%s), lowemi %s\n",
+                       pin, cfg, pullnames[pull], slpmnames[slpm],
+                       output ? "output " : "input",
+                       output ? (val ? "high" : "low") : "",
+                       lowemi ? "on" : "off");
+
+               clk_enable(nmk_chip->clk);
+               bit = pin % NMK_GPIO_PER_CHIP;
+               if (gpiomode)
+                       /* No glitch when going to GPIO mode */
+                       __nmk_gpio_set_mode(nmk_chip, bit, NMK_GPIO_ALT_GPIO);
+               if (output)
+                       __nmk_gpio_make_output(nmk_chip, bit, val);
+               else {
+                       __nmk_gpio_make_input(nmk_chip, bit);
+                       __nmk_gpio_set_pull(nmk_chip, bit, pull);
+               }
+               /* TODO: isn't this only applicable on output pins? */
+               __nmk_gpio_set_lowemi(nmk_chip, bit, lowemi);
+
+               __nmk_gpio_set_slpm(nmk_chip, bit, slpm);
+               clk_disable(nmk_chip->clk);
+       } /* for each config */
+
+       return 0;
+}
+
+static const struct pinconf_ops nmk_pinconf_ops = {
+       .pin_config_get = nmk_pin_config_get,
+       .pin_config_set = nmk_pin_config_set,
+};
+
+static struct pinctrl_desc nmk_pinctrl_desc = {
+       .name = "pinctrl-nomadik",
+       .pctlops = &nmk_pinctrl_ops,
+       .pmxops = &nmk_pinmux_ops,
+       .confops = &nmk_pinconf_ops,
+       .owner = THIS_MODULE,
+};
+
+static const struct of_device_id nmk_pinctrl_match[] = {
+       {
+               .compatible = "stericsson,stn8815-pinctrl",
+               .data = (void *)PINCTRL_NMK_STN8815,
+       },
+       {
+               .compatible = "stericsson,db8500-pinctrl",
+               .data = (void *)PINCTRL_NMK_DB8500,
+       },
+       {
+               .compatible = "stericsson,db8540-pinctrl",
+               .data = (void *)PINCTRL_NMK_DB8540,
+       },
+       {},
+};
+
+#ifdef CONFIG_PM_SLEEP
+static int nmk_pinctrl_suspend(struct device *dev)
+{
+       struct nmk_pinctrl *npct;
+
+       npct = dev_get_drvdata(dev);
+       if (!npct)
+               return -EINVAL;
+
+       return pinctrl_force_sleep(npct->pctl);
+}
+
+static int nmk_pinctrl_resume(struct device *dev)
+{
+       struct nmk_pinctrl *npct;
+
+       npct = dev_get_drvdata(dev);
+       if (!npct)
+               return -EINVAL;
+
+       return pinctrl_force_default(npct->pctl);
+}
+#endif
+
+static int nmk_pinctrl_probe(struct platform_device *pdev)
+{
+       const struct of_device_id *match;
+       struct device_node *np = pdev->dev.of_node;
+       struct device_node *prcm_np;
+       struct nmk_pinctrl *npct;
+       unsigned int version = 0;
+       int i;
+
+       npct = devm_kzalloc(&pdev->dev, sizeof(*npct), GFP_KERNEL);
+       if (!npct)
+               return -ENOMEM;
+
+       match = of_match_device(nmk_pinctrl_match, &pdev->dev);
+       if (!match)
+               return -ENODEV;
+       version = (unsigned int) match->data;
+
+       /* Poke in other ASIC variants here */
+       if (version == PINCTRL_NMK_STN8815)
+               nmk_pinctrl_stn8815_init(&npct->soc);
+       if (version == PINCTRL_NMK_DB8500)
+               nmk_pinctrl_db8500_init(&npct->soc);
+       if (version == PINCTRL_NMK_DB8540)
+               nmk_pinctrl_db8540_init(&npct->soc);
+
+       prcm_np = of_parse_phandle(np, "prcm", 0);
+       if (prcm_np)
+               npct->prcm_base = of_iomap(prcm_np, 0);
+       if (!npct->prcm_base) {
+               if (version == PINCTRL_NMK_STN8815) {
+                       dev_info(&pdev->dev,
+                                "No PRCM base, "
+                                "assuming no ALT-Cx control is available\n");
+               } else {
+                       dev_err(&pdev->dev, "missing PRCM base address\n");
+                       return -EINVAL;
+               }
+       }
+
+       /*
+        * We need all the GPIO drivers to probe FIRST, or we will not be able
+        * to obtain references to the struct gpio_chip * for them, and we
+        * need this to proceed.
+        */
+       for (i = 0; i < npct->soc->gpio_num_ranges; i++) {
+               if (!nmk_gpio_chips[npct->soc->gpio_ranges[i].id]) {
+                       dev_warn(&pdev->dev, "GPIO chip %d not registered yet\n", i);
+                       return -EPROBE_DEFER;
+               }
+               npct->soc->gpio_ranges[i].gc = &nmk_gpio_chips[npct->soc->gpio_ranges[i].id]->chip;
+       }
+
+       nmk_pinctrl_desc.pins = npct->soc->pins;
+       nmk_pinctrl_desc.npins = npct->soc->npins;
+       npct->dev = &pdev->dev;
+
+       npct->pctl = pinctrl_register(&nmk_pinctrl_desc, &pdev->dev, npct);
+       if (!npct->pctl) {
+               dev_err(&pdev->dev, "could not register Nomadik pinctrl driver\n");
+               return -EINVAL;
+       }
+
+       /* We will handle a range of GPIO pins */
+       for (i = 0; i < npct->soc->gpio_num_ranges; i++)
+               pinctrl_add_gpio_range(npct->pctl, &npct->soc->gpio_ranges[i]);
+
+       platform_set_drvdata(pdev, npct);
+       dev_info(&pdev->dev, "initialized Nomadik pin control driver\n");
+
+       return 0;
+}
+
+static const struct of_device_id nmk_gpio_match[] = {
+       { .compatible = "st,nomadik-gpio", },
+       {}
+};
+
+static struct platform_driver nmk_gpio_driver = {
+       .driver = {
+               .owner = THIS_MODULE,
+               .name = "gpio",
+               .of_match_table = nmk_gpio_match,
+       },
+       .probe = nmk_gpio_probe,
+};
+
+static SIMPLE_DEV_PM_OPS(nmk_pinctrl_pm_ops,
+                       nmk_pinctrl_suspend,
+                       nmk_pinctrl_resume);
+
+static struct platform_driver nmk_pinctrl_driver = {
+       .driver = {
+               .owner = THIS_MODULE,
+               .name = "pinctrl-nomadik",
+               .of_match_table = nmk_pinctrl_match,
+               .pm = &nmk_pinctrl_pm_ops,
+       },
+       .probe = nmk_pinctrl_probe,
+};
+
+static int __init nmk_gpio_init(void)
+{
+       int ret;
+
+       ret = platform_driver_register(&nmk_gpio_driver);
+       if (ret)
+               return ret;
+       return platform_driver_register(&nmk_pinctrl_driver);
+}
+
+core_initcall(nmk_gpio_init);
+
+MODULE_AUTHOR("Prafulla WADASKAR and Alessandro Rubini");
+MODULE_DESCRIPTION("Nomadik GPIO Driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/pinctrl/nomadik/pinctrl-nomadik.h b/drivers/pinctrl/nomadik/pinctrl-nomadik.h
new file mode 100644 (file)
index 0000000..d8215f1
--- /dev/null
@@ -0,0 +1,192 @@
+#ifndef PINCTRL_PINCTRL_NOMADIK_H
+#define PINCTRL_PINCTRL_NOMADIK_H
+
+/* Package definitions */
+#define PINCTRL_NMK_STN8815    0
+#define PINCTRL_NMK_DB8500     1
+#define PINCTRL_NMK_DB8540     2
+
+/* Alternate functions: function C is set in hw by setting both A and B */
+#define NMK_GPIO_ALT_GPIO      0
+#define NMK_GPIO_ALT_A 1
+#define NMK_GPIO_ALT_B 2
+#define NMK_GPIO_ALT_C (NMK_GPIO_ALT_A | NMK_GPIO_ALT_B)
+
+#define NMK_GPIO_ALT_CX_SHIFT 2
+#define NMK_GPIO_ALT_C1        ((1<<NMK_GPIO_ALT_CX_SHIFT) | NMK_GPIO_ALT_C)
+#define NMK_GPIO_ALT_C2        ((2<<NMK_GPIO_ALT_CX_SHIFT) | NMK_GPIO_ALT_C)
+#define NMK_GPIO_ALT_C3        ((3<<NMK_GPIO_ALT_CX_SHIFT) | NMK_GPIO_ALT_C)
+#define NMK_GPIO_ALT_C4        ((4<<NMK_GPIO_ALT_CX_SHIFT) | NMK_GPIO_ALT_C)
+
+#define PRCM_GPIOCR_ALTCX(pin_num,\
+       altc1_used, altc1_ri, altc1_cb,\
+       altc2_used, altc2_ri, altc2_cb,\
+       altc3_used, altc3_ri, altc3_cb,\
+       altc4_used, altc4_ri, altc4_cb)\
+{\
+       .pin = pin_num,\
+       .altcx[PRCM_IDX_GPIOCR_ALTC1] = {\
+               .used = altc1_used,\
+               .reg_index = altc1_ri,\
+               .control_bit = altc1_cb\
+       },\
+       .altcx[PRCM_IDX_GPIOCR_ALTC2] = {\
+               .used = altc2_used,\
+               .reg_index = altc2_ri,\
+               .control_bit = altc2_cb\
+       },\
+       .altcx[PRCM_IDX_GPIOCR_ALTC3] = {\
+               .used = altc3_used,\
+               .reg_index = altc3_ri,\
+               .control_bit = altc3_cb\
+       },\
+       .altcx[PRCM_IDX_GPIOCR_ALTC4] = {\
+               .used = altc4_used,\
+               .reg_index = altc4_ri,\
+               .control_bit = altc4_cb\
+       },\
+}
+
+/**
+ * enum prcm_gpiocr_reg_index
+ * Used to reference an PRCM GPIOCR register address.
+ */
+enum prcm_gpiocr_reg_index {
+       PRCM_IDX_GPIOCR1,
+       PRCM_IDX_GPIOCR2,
+       PRCM_IDX_GPIOCR3
+};
+/**
+ * enum prcm_gpiocr_altcx_index
+ * Used to reference an Other alternate-C function.
+ */
+enum prcm_gpiocr_altcx_index {
+       PRCM_IDX_GPIOCR_ALTC1,
+       PRCM_IDX_GPIOCR_ALTC2,
+       PRCM_IDX_GPIOCR_ALTC3,
+       PRCM_IDX_GPIOCR_ALTC4,
+       PRCM_IDX_GPIOCR_ALTC_MAX,
+};
+
+/**
+ * struct prcm_gpio_altcx - Other alternate-C function
+ * @used: other alternate-C function availability
+ * @reg_index: PRCM GPIOCR register index used to control the function
+ * @control_bit: PRCM GPIOCR bit used to control the function
+ */
+struct prcm_gpiocr_altcx {
+       bool used:1;
+       u8 reg_index:2;
+       u8 control_bit:5;
+} __packed;
+
+/**
+ * struct prcm_gpio_altcx_pin_desc - Other alternate-C pin
+ * @pin: The pin number
+ * @altcx: array of other alternate-C[1-4] functions
+ */
+struct prcm_gpiocr_altcx_pin_desc {
+       unsigned short pin;
+       struct prcm_gpiocr_altcx altcx[PRCM_IDX_GPIOCR_ALTC_MAX];
+};
+
+/**
+ * struct nmk_function - Nomadik pinctrl mux function
+ * @name: The name of the function, exported to pinctrl core.
+ * @groups: An array of pin groups that may select this function.
+ * @ngroups: The number of entries in @groups.
+ */
+struct nmk_function {
+       const char *name;
+       const char * const *groups;
+       unsigned ngroups;
+};
+
+/**
+ * struct nmk_pingroup - describes a Nomadik pin group
+ * @name: the name of this specific pin group
+ * @pins: an array of discrete physical pins used in this group, taken
+ *     from the driver-local pin enumeration space
+ * @num_pins: the number of pins in this group array, i.e. the number of
+ *     elements in .pins so we can iterate over that array
+ * @altsetting: the altsetting to apply to all pins in this group to
+ *     configure them to be used by a function
+ */
+struct nmk_pingroup {
+       const char *name;
+       const unsigned int *pins;
+       const unsigned npins;
+       int altsetting;
+};
+
+/**
+ * struct nmk_pinctrl_soc_data - Nomadik pin controller per-SoC configuration
+ * @gpio_ranges: An array of GPIO ranges for this SoC
+ * @gpio_num_ranges: The number of GPIO ranges for this SoC
+ * @pins:      An array describing all pins the pin controller affects.
+ *             All pins which are also GPIOs must be listed first within the
+ *             array, and be numbered identically to the GPIO controller's
+ *             numbering.
+ * @npins:     The number of entries in @pins.
+ * @functions: The functions supported on this SoC.
+ * @nfunction: The number of entries in @functions.
+ * @groups:    An array describing all pin groups the pin SoC supports.
+ * @ngroups:   The number of entries in @groups.
+ * @altcx_pins:        The pins that support Other alternate-C function on this SoC
+ * @npins_altcx: The number of Other alternate-C pins
+ * @prcm_gpiocr_registers: The array of PRCM GPIOCR registers on this SoC
+ */
+struct nmk_pinctrl_soc_data {
+       struct pinctrl_gpio_range *gpio_ranges;
+       unsigned gpio_num_ranges;
+       const struct pinctrl_pin_desc *pins;
+       unsigned npins;
+       const struct nmk_function *functions;
+       unsigned nfunctions;
+       const struct nmk_pingroup *groups;
+       unsigned ngroups;
+       const struct prcm_gpiocr_altcx_pin_desc *altcx_pins;
+       unsigned npins_altcx;
+       const u16 *prcm_gpiocr_registers;
+};
+
+#ifdef CONFIG_PINCTRL_STN8815
+
+void nmk_pinctrl_stn8815_init(const struct nmk_pinctrl_soc_data **soc);
+
+#else
+
+static inline void
+nmk_pinctrl_stn8815_init(const struct nmk_pinctrl_soc_data **soc)
+{
+}
+
+#endif
+
+#ifdef CONFIG_PINCTRL_DB8500
+
+void nmk_pinctrl_db8500_init(const struct nmk_pinctrl_soc_data **soc);
+
+#else
+
+static inline void
+nmk_pinctrl_db8500_init(const struct nmk_pinctrl_soc_data **soc)
+{
+}
+
+#endif
+
+#ifdef CONFIG_PINCTRL_DB8540
+
+void nmk_pinctrl_db8540_init(const struct nmk_pinctrl_soc_data **soc);
+
+#else
+
+static inline void
+nmk_pinctrl_db8540_init(const struct nmk_pinctrl_soc_data **soc)
+{
+}
+
+#endif
+
+#endif /* PINCTRL_PINCTRL_NOMADIK_H */
diff --git a/drivers/pinctrl/pinctrl-ab8500.c b/drivers/pinctrl/pinctrl-ab8500.c
deleted file mode 100644 (file)
index 2ac2d0a..0000000
+++ /dev/null
@@ -1,485 +0,0 @@
-/*
- * Copyright (C) ST-Ericsson SA 2012
- *
- * Author: Patrice Chotard <patrice.chotard@stericsson.com> for ST-Ericsson.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#include <linux/kernel.h>
-#include <linux/gpio.h>
-#include <linux/pinctrl/pinctrl.h>
-#include <linux/mfd/abx500/ab8500.h>
-#include "pinctrl-abx500.h"
-
-/* All the pins that can be used for GPIO and some other functions */
-#define ABX500_GPIO(offset)            (offset)
-
-#define AB8500_PIN_T10         ABX500_GPIO(1)
-#define AB8500_PIN_T9          ABX500_GPIO(2)
-#define AB8500_PIN_U9          ABX500_GPIO(3)
-#define AB8500_PIN_W2          ABX500_GPIO(4)
-/* hole */
-#define AB8500_PIN_Y18         ABX500_GPIO(6)
-#define AB8500_PIN_AA20                ABX500_GPIO(7)
-#define AB8500_PIN_W18         ABX500_GPIO(8)
-#define AB8500_PIN_AA19                ABX500_GPIO(9)
-#define AB8500_PIN_U17         ABX500_GPIO(10)
-#define AB8500_PIN_AA18                ABX500_GPIO(11)
-#define AB8500_PIN_U16         ABX500_GPIO(12)
-#define AB8500_PIN_W17         ABX500_GPIO(13)
-#define AB8500_PIN_F14         ABX500_GPIO(14)
-#define AB8500_PIN_B17         ABX500_GPIO(15)
-#define AB8500_PIN_F15         ABX500_GPIO(16)
-#define AB8500_PIN_P5          ABX500_GPIO(17)
-#define AB8500_PIN_R5          ABX500_GPIO(18)
-#define AB8500_PIN_U5          ABX500_GPIO(19)
-#define AB8500_PIN_T5          ABX500_GPIO(20)
-#define AB8500_PIN_H19         ABX500_GPIO(21)
-#define AB8500_PIN_G20         ABX500_GPIO(22)
-#define AB8500_PIN_G19         ABX500_GPIO(23)
-#define AB8500_PIN_T14         ABX500_GPIO(24)
-#define AB8500_PIN_R16         ABX500_GPIO(25)
-#define AB8500_PIN_M16         ABX500_GPIO(26)
-#define AB8500_PIN_J6          ABX500_GPIO(27)
-#define AB8500_PIN_K6          ABX500_GPIO(28)
-#define AB8500_PIN_G6          ABX500_GPIO(29)
-#define AB8500_PIN_H6          ABX500_GPIO(30)
-#define AB8500_PIN_F5          ABX500_GPIO(31)
-#define AB8500_PIN_G5          ABX500_GPIO(32)
-/* hole */
-#define AB8500_PIN_R17         ABX500_GPIO(34)
-#define AB8500_PIN_W15         ABX500_GPIO(35)
-#define AB8500_PIN_A17         ABX500_GPIO(36)
-#define AB8500_PIN_E15         ABX500_GPIO(37)
-#define AB8500_PIN_C17         ABX500_GPIO(38)
-#define AB8500_PIN_E16         ABX500_GPIO(39)
-#define AB8500_PIN_T19         ABX500_GPIO(40)
-#define AB8500_PIN_U19         ABX500_GPIO(41)
-#define AB8500_PIN_U2          ABX500_GPIO(42)
-
-/* indicates the highest GPIO number */
-#define AB8500_GPIO_MAX_NUMBER 42
-
-/*
- * The names of the pins are denoted by GPIO number and ball name, even
- * though they can be used for other things than GPIO, this is the first
- * column in the table of the data sheet and often used on schematics and
- * such.
- */
-static const struct pinctrl_pin_desc ab8500_pins[] = {
-       PINCTRL_PIN(AB8500_PIN_T10, "GPIO1_T10"),
-       PINCTRL_PIN(AB8500_PIN_T9, "GPIO2_T9"),
-       PINCTRL_PIN(AB8500_PIN_U9, "GPIO3_U9"),
-       PINCTRL_PIN(AB8500_PIN_W2, "GPIO4_W2"),
-       /* hole */
-       PINCTRL_PIN(AB8500_PIN_Y18, "GPIO6_Y18"),
-       PINCTRL_PIN(AB8500_PIN_AA20, "GPIO7_AA20"),
-       PINCTRL_PIN(AB8500_PIN_W18, "GPIO8_W18"),
-       PINCTRL_PIN(AB8500_PIN_AA19, "GPIO9_AA19"),
-       PINCTRL_PIN(AB8500_PIN_U17, "GPIO10_U17"),
-       PINCTRL_PIN(AB8500_PIN_AA18, "GPIO11_AA18"),
-       PINCTRL_PIN(AB8500_PIN_U16, "GPIO12_U16"),
-       PINCTRL_PIN(AB8500_PIN_W17, "GPIO13_W17"),
-       PINCTRL_PIN(AB8500_PIN_F14, "GPIO14_F14"),
-       PINCTRL_PIN(AB8500_PIN_B17, "GPIO15_B17"),
-       PINCTRL_PIN(AB8500_PIN_F15, "GPIO16_F15"),
-       PINCTRL_PIN(AB8500_PIN_P5, "GPIO17_P5"),
-       PINCTRL_PIN(AB8500_PIN_R5, "GPIO18_R5"),
-       PINCTRL_PIN(AB8500_PIN_U5, "GPIO19_U5"),
-       PINCTRL_PIN(AB8500_PIN_T5, "GPIO20_T5"),
-       PINCTRL_PIN(AB8500_PIN_H19, "GPIO21_H19"),
-       PINCTRL_PIN(AB8500_PIN_G20, "GPIO22_G20"),
-       PINCTRL_PIN(AB8500_PIN_G19, "GPIO23_G19"),
-       PINCTRL_PIN(AB8500_PIN_T14, "GPIO24_T14"),
-       PINCTRL_PIN(AB8500_PIN_R16, "GPIO25_R16"),
-       PINCTRL_PIN(AB8500_PIN_M16, "GPIO26_M16"),
-       PINCTRL_PIN(AB8500_PIN_J6, "GPIO27_J6"),
-       PINCTRL_PIN(AB8500_PIN_K6, "GPIO28_K6"),
-       PINCTRL_PIN(AB8500_PIN_G6, "GPIO29_G6"),
-       PINCTRL_PIN(AB8500_PIN_H6, "GPIO30_H6"),
-       PINCTRL_PIN(AB8500_PIN_F5, "GPIO31_F5"),
-       PINCTRL_PIN(AB8500_PIN_G5, "GPIO32_G5"),
-       /* hole */
-       PINCTRL_PIN(AB8500_PIN_R17, "GPIO34_R17"),
-       PINCTRL_PIN(AB8500_PIN_W15, "GPIO35_W15"),
-       PINCTRL_PIN(AB8500_PIN_A17, "GPIO36_A17"),
-       PINCTRL_PIN(AB8500_PIN_E15, "GPIO37_E15"),
-       PINCTRL_PIN(AB8500_PIN_C17, "GPIO38_C17"),
-       PINCTRL_PIN(AB8500_PIN_E16, "GPIO39_E16"),
-       PINCTRL_PIN(AB8500_PIN_T19, "GPIO40_T19"),
-       PINCTRL_PIN(AB8500_PIN_U19, "GPIO41_U19"),
-       PINCTRL_PIN(AB8500_PIN_U2, "GPIO42_U2"),
-};
-
-/*
- * Maps local GPIO offsets to local pin numbers
- */
-static const struct abx500_pinrange ab8500_pinranges[] = {
-       ABX500_PINRANGE(1, 4, ABX500_ALT_A),
-       ABX500_PINRANGE(6, 4, ABX500_ALT_A),
-       ABX500_PINRANGE(10, 4, ABX500_DEFAULT),
-       ABX500_PINRANGE(14, 12, ABX500_ALT_A),
-       ABX500_PINRANGE(26, 1, ABX500_DEFAULT),
-       ABX500_PINRANGE(27, 6, ABX500_ALT_A),
-       ABX500_PINRANGE(34, 1, ABX500_ALT_A),
-       ABX500_PINRANGE(35, 1, ABX500_DEFAULT),
-       ABX500_PINRANGE(36, 7, ABX500_ALT_A),
-};
-
-/*
- * Read the pin group names like this:
- * sysclkreq2_d_1 = first groups of pins for sysclkreq2 on default function
- *
- * The groups are arranged as sets per altfunction column, so we can
- * mux in one group at a time by selecting the same altfunction for them
- * all. When functions require pins on different altfunctions, you need
- * to combine several groups.
- */
-
-/* default column */
-static const unsigned sysclkreq2_d_1_pins[] = { AB8500_PIN_T10 };
-static const unsigned sysclkreq3_d_1_pins[] = { AB8500_PIN_T9 };
-static const unsigned sysclkreq4_d_1_pins[] = { AB8500_PIN_U9 };
-static const unsigned sysclkreq6_d_1_pins[] = { AB8500_PIN_W2 };
-static const unsigned ycbcr0123_d_1_pins[] = { AB8500_PIN_Y18, AB8500_PIN_AA20,
-                                       AB8500_PIN_W18, AB8500_PIN_AA19};
-static const unsigned gpio10_d_1_pins[] = { AB8500_PIN_U17 };
-static const unsigned gpio11_d_1_pins[] = { AB8500_PIN_AA18 };
-static const unsigned gpio12_d_1_pins[] = { AB8500_PIN_U16 };
-static const unsigned gpio13_d_1_pins[] = { AB8500_PIN_W17 };
-static const unsigned pwmout1_d_1_pins[] = { AB8500_PIN_F14 };
-static const unsigned pwmout2_d_1_pins[] = { AB8500_PIN_B17 };
-static const unsigned pwmout3_d_1_pins[] = { AB8500_PIN_F15 };
-
-/* audio data interface 1*/
-static const unsigned adi1_d_1_pins[] = { AB8500_PIN_P5, AB8500_PIN_R5,
-                                       AB8500_PIN_U5, AB8500_PIN_T5 };
-/* USBUICC */
-static const unsigned usbuicc_d_1_pins[] = { AB8500_PIN_H19, AB8500_PIN_G20,
-                                       AB8500_PIN_G19 };
-static const unsigned sysclkreq7_d_1_pins[] = { AB8500_PIN_T14 };
-static const unsigned sysclkreq8_d_1_pins[] = { AB8500_PIN_R16 };
-static const unsigned gpio26_d_1_pins[] = { AB8500_PIN_M16 };
-/* Digital microphone 1 and 2 */
-static const unsigned dmic12_d_1_pins[] = { AB8500_PIN_J6, AB8500_PIN_K6 };
-/* Digital microphone 3 and 4 */
-static const unsigned dmic34_d_1_pins[] = { AB8500_PIN_G6, AB8500_PIN_H6 };
-/* Digital microphone 5 and 6 */
-static const unsigned dmic56_d_1_pins[] = { AB8500_PIN_F5, AB8500_PIN_G5 };
-static const unsigned extcpena_d_1_pins[] = { AB8500_PIN_R17 };
-static const unsigned gpio35_d_1_pins[] = { AB8500_PIN_W15 };
-/* APE SPI */
-static const unsigned apespi_d_1_pins[] = { AB8500_PIN_A17, AB8500_PIN_E15,
-                                       AB8500_PIN_C17, AB8500_PIN_E16};
-/* modem SDA/SCL */
-static const unsigned modsclsda_d_1_pins[] = { AB8500_PIN_T19, AB8500_PIN_U19 };
-static const unsigned sysclkreq5_d_1_pins[] = { AB8500_PIN_U2 };
-
-/* Altfunction A column */
-static const unsigned gpio1_a_1_pins[] = { AB8500_PIN_T10 };
-static const unsigned gpio2_a_1_pins[] = { AB8500_PIN_T9 };
-static const unsigned gpio3_a_1_pins[] = { AB8500_PIN_U9 };
-static const unsigned gpio4_a_1_pins[] = { AB8500_PIN_W2 };
-static const unsigned gpio6_a_1_pins[] = { AB8500_PIN_Y18 };
-static const unsigned gpio7_a_1_pins[] = { AB8500_PIN_AA20 };
-static const unsigned gpio8_a_1_pins[] = { AB8500_PIN_W18 };
-static const unsigned gpio9_a_1_pins[] = { AB8500_PIN_AA19 };
-/* YCbCr4 YCbCr5 YCbCr6 YCbCr7*/
-static const unsigned ycbcr4567_a_1_pins[] = { AB8500_PIN_U17, AB8500_PIN_AA18,
-                                       AB8500_PIN_U16, AB8500_PIN_W17};
-static const unsigned gpio14_a_1_pins[] = { AB8500_PIN_F14 };
-static const unsigned gpio15_a_1_pins[] = { AB8500_PIN_B17 };
-static const unsigned gpio16_a_1_pins[] = { AB8500_PIN_F15 };
-static const unsigned gpio17_a_1_pins[] = { AB8500_PIN_P5 };
-static const unsigned gpio18_a_1_pins[] = { AB8500_PIN_R5 };
-static const unsigned gpio19_a_1_pins[] = { AB8500_PIN_U5 };
-static const unsigned gpio20_a_1_pins[] = { AB8500_PIN_T5 };
-static const unsigned gpio21_a_1_pins[] = { AB8500_PIN_H19 };
-static const unsigned gpio22_a_1_pins[] = { AB8500_PIN_G20 };
-static const unsigned gpio23_a_1_pins[] = { AB8500_PIN_G19 };
-static const unsigned gpio24_a_1_pins[] = { AB8500_PIN_T14 };
-static const unsigned gpio25_a_1_pins[] = { AB8500_PIN_R16 };
-static const unsigned gpio27_a_1_pins[] = { AB8500_PIN_J6 };
-static const unsigned gpio28_a_1_pins[] = { AB8500_PIN_K6 };
-static const unsigned gpio29_a_1_pins[] = { AB8500_PIN_G6 };
-static const unsigned gpio30_a_1_pins[] = { AB8500_PIN_H6 };
-static const unsigned gpio31_a_1_pins[] = { AB8500_PIN_F5 };
-static const unsigned gpio32_a_1_pins[] = { AB8500_PIN_G5 };
-static const unsigned gpio34_a_1_pins[] = { AB8500_PIN_R17 };
-static const unsigned gpio36_a_1_pins[] = { AB8500_PIN_A17 };
-static const unsigned gpio37_a_1_pins[] = { AB8500_PIN_E15 };
-static const unsigned gpio38_a_1_pins[] = { AB8500_PIN_C17 };
-static const unsigned gpio39_a_1_pins[] = { AB8500_PIN_E16 };
-static const unsigned gpio40_a_1_pins[] = { AB8500_PIN_T19 };
-static const unsigned gpio41_a_1_pins[] = { AB8500_PIN_U19 };
-static const unsigned gpio42_a_1_pins[] = { AB8500_PIN_U2 };
-
-/* Altfunction B colum */
-static const unsigned hiqclkena_b_1_pins[] = { AB8500_PIN_U17 };
-static const unsigned usbuiccpd_b_1_pins[] = { AB8500_PIN_AA18 };
-static const unsigned i2ctrig1_b_1_pins[] = { AB8500_PIN_U16 };
-static const unsigned i2ctrig2_b_1_pins[] = { AB8500_PIN_W17 };
-
-/* Altfunction C column */
-static const unsigned usbvdat_c_1_pins[] = { AB8500_PIN_W17 };
-
-
-#define AB8500_PIN_GROUP(a, b) { .name = #a, .pins = a##_pins,         \
-                       .npins = ARRAY_SIZE(a##_pins), .altsetting = b }
-
-static const struct abx500_pingroup ab8500_groups[] = {
-       /* default column */
-       AB8500_PIN_GROUP(sysclkreq2_d_1, ABX500_DEFAULT),
-       AB8500_PIN_GROUP(sysclkreq3_d_1, ABX500_DEFAULT),
-       AB8500_PIN_GROUP(sysclkreq4_d_1, ABX500_DEFAULT),
-       AB8500_PIN_GROUP(sysclkreq6_d_1, ABX500_DEFAULT),
-       AB8500_PIN_GROUP(ycbcr0123_d_1, ABX500_DEFAULT),
-       AB8500_PIN_GROUP(gpio10_d_1, ABX500_DEFAULT),
-       AB8500_PIN_GROUP(gpio11_d_1, ABX500_DEFAULT),
-       AB8500_PIN_GROUP(gpio12_d_1, ABX500_DEFAULT),
-       AB8500_PIN_GROUP(gpio13_d_1, ABX500_DEFAULT),
-       AB8500_PIN_GROUP(pwmout1_d_1, ABX500_DEFAULT),
-       AB8500_PIN_GROUP(pwmout2_d_1, ABX500_DEFAULT),
-       AB8500_PIN_GROUP(pwmout3_d_1, ABX500_DEFAULT),
-       AB8500_PIN_GROUP(adi1_d_1, ABX500_DEFAULT),
-       AB8500_PIN_GROUP(usbuicc_d_1, ABX500_DEFAULT),
-       AB8500_PIN_GROUP(sysclkreq7_d_1, ABX500_DEFAULT),
-       AB8500_PIN_GROUP(sysclkreq8_d_1, ABX500_DEFAULT),
-       AB8500_PIN_GROUP(gpio26_d_1, ABX500_DEFAULT),
-       AB8500_PIN_GROUP(dmic12_d_1, ABX500_DEFAULT),
-       AB8500_PIN_GROUP(dmic34_d_1, ABX500_DEFAULT),
-       AB8500_PIN_GROUP(dmic56_d_1, ABX500_DEFAULT),
-       AB8500_PIN_GROUP(extcpena_d_1, ABX500_DEFAULT),
-       AB8500_PIN_GROUP(gpio35_d_1, ABX500_DEFAULT),
-       AB8500_PIN_GROUP(apespi_d_1, ABX500_DEFAULT),
-       AB8500_PIN_GROUP(modsclsda_d_1, ABX500_DEFAULT),
-       AB8500_PIN_GROUP(sysclkreq5_d_1, ABX500_DEFAULT),
-       /* Altfunction A column */
-       AB8500_PIN_GROUP(gpio1_a_1, ABX500_ALT_A),
-       AB8500_PIN_GROUP(gpio2_a_1, ABX500_ALT_A),
-       AB8500_PIN_GROUP(gpio3_a_1, ABX500_ALT_A),
-       AB8500_PIN_GROUP(gpio4_a_1, ABX500_ALT_A),
-       AB8500_PIN_GROUP(gpio6_a_1, ABX500_ALT_A),
-       AB8500_PIN_GROUP(gpio7_a_1, ABX500_ALT_A),
-       AB8500_PIN_GROUP(gpio8_a_1, ABX500_ALT_A),
-       AB8500_PIN_GROUP(gpio9_a_1, ABX500_ALT_A),
-       AB8500_PIN_GROUP(ycbcr4567_a_1, ABX500_ALT_A),
-       AB8500_PIN_GROUP(gpio14_a_1, ABX500_ALT_A),
-       AB8500_PIN_GROUP(gpio15_a_1, ABX500_ALT_A),
-       AB8500_PIN_GROUP(gpio16_a_1, ABX500_ALT_A),
-       AB8500_PIN_GROUP(gpio17_a_1, ABX500_ALT_A),
-       AB8500_PIN_GROUP(gpio18_a_1, ABX500_ALT_A),
-       AB8500_PIN_GROUP(gpio19_a_1, ABX500_ALT_A),
-       AB8500_PIN_GROUP(gpio20_a_1, ABX500_ALT_A),
-       AB8500_PIN_GROUP(gpio21_a_1, ABX500_ALT_A),
-       AB8500_PIN_GROUP(gpio22_a_1, ABX500_ALT_A),
-       AB8500_PIN_GROUP(gpio23_a_1, ABX500_ALT_A),
-       AB8500_PIN_GROUP(gpio24_a_1, ABX500_ALT_A),
-       AB8500_PIN_GROUP(gpio25_a_1, ABX500_ALT_A),
-       AB8500_PIN_GROUP(gpio27_a_1, ABX500_ALT_A),
-       AB8500_PIN_GROUP(gpio28_a_1, ABX500_ALT_A),
-       AB8500_PIN_GROUP(gpio29_a_1, ABX500_ALT_A),
-       AB8500_PIN_GROUP(gpio30_a_1, ABX500_ALT_A),
-       AB8500_PIN_GROUP(gpio31_a_1, ABX500_ALT_A),
-       AB8500_PIN_GROUP(gpio32_a_1, ABX500_ALT_A),
-       AB8500_PIN_GROUP(gpio34_a_1, ABX500_ALT_A),
-       AB8500_PIN_GROUP(gpio36_a_1, ABX500_ALT_A),
-       AB8500_PIN_GROUP(gpio37_a_1, ABX500_ALT_A),
-       AB8500_PIN_GROUP(gpio38_a_1, ABX500_ALT_A),
-       AB8500_PIN_GROUP(gpio39_a_1, ABX500_ALT_A),
-       AB8500_PIN_GROUP(gpio40_a_1, ABX500_ALT_A),
-       AB8500_PIN_GROUP(gpio41_a_1, ABX500_ALT_A),
-       AB8500_PIN_GROUP(gpio42_a_1, ABX500_ALT_A),
-       /* Altfunction B column */
-       AB8500_PIN_GROUP(hiqclkena_b_1, ABX500_ALT_B),
-       AB8500_PIN_GROUP(usbuiccpd_b_1, ABX500_ALT_B),
-       AB8500_PIN_GROUP(i2ctrig1_b_1, ABX500_ALT_B),
-       AB8500_PIN_GROUP(i2ctrig2_b_1, ABX500_ALT_B),
-       /* Altfunction C column */
-       AB8500_PIN_GROUP(usbvdat_c_1, ABX500_ALT_C),
-};
-
-/* We use this macro to define the groups applicable to a function */
-#define AB8500_FUNC_GROUPS(a, b...)       \
-static const char * const a##_groups[] = { b };
-
-AB8500_FUNC_GROUPS(sysclkreq, "sysclkreq2_d_1", "sysclkreq3_d_1",
-               "sysclkreq4_d_1", "sysclkreq5_d_1", "sysclkreq6_d_1",
-               "sysclkreq7_d_1", "sysclkreq8_d_1");
-AB8500_FUNC_GROUPS(ycbcr, "ycbcr0123_d_1", "ycbcr4567_a_1");
-AB8500_FUNC_GROUPS(gpio, "gpio1_a_1", "gpio2_a_1", "gpio3_a_1", "gpio4_a_1",
-               "gpio6_a_1", "gpio7_a_1", "gpio8_a_1", "gpio9_a_1",
-               "gpio10_d_1", "gpio11_d_1", "gpio12_d_1", "gpio13_d_1",
-               "gpio14_a_1", "gpio15_a_1", "gpio16_a_1", "gpio17_a_1",
-               "gpio18_a_1", "gpio19_a_1", "gpio20_a_1", "gpio21_a_1",
-               "gpio22_a_1", "gpio23_a_1", "gpio24_a_1", "gpio25_a_1",
-               "gpio26_d_1", "gpio27_a_1", "gpio28_a_1", "gpio29_a_1",
-               "gpio30_a_1", "gpio31_a_1", "gpio32_a_1", "gpio34_a_1",
-               "gpio35_d_1", "gpio36_a_1", "gpio37_a_1", "gpio38_a_1",
-               "gpio39_a_1", "gpio40_a_1", "gpio41_a_1", "gpio42_a_1");
-AB8500_FUNC_GROUPS(pwmout, "pwmout1_d_1", "pwmout2_d_1", "pwmout3_d_1");
-AB8500_FUNC_GROUPS(adi1, "adi1_d_1");
-AB8500_FUNC_GROUPS(usbuicc, "usbuicc_d_1", "usbuiccpd_b_1");
-AB8500_FUNC_GROUPS(dmic, "dmic12_d_1", "dmic34_d_1", "dmic56_d_1");
-AB8500_FUNC_GROUPS(extcpena, "extcpena_d_1");
-AB8500_FUNC_GROUPS(apespi, "apespi_d_1");
-AB8500_FUNC_GROUPS(modsclsda, "modsclsda_d_1");
-AB8500_FUNC_GROUPS(hiqclkena, "hiqclkena_b_1");
-AB8500_FUNC_GROUPS(i2ctrig, "i2ctrig1_b_1", "i2ctrig2_b_1");
-AB8500_FUNC_GROUPS(usbvdat, "usbvdat_c_1");
-
-#define FUNCTION(fname)                                        \
-       {                                               \
-               .name = #fname,                         \
-               .groups = fname##_groups,               \
-               .ngroups = ARRAY_SIZE(fname##_groups),  \
-       }
-
-static const struct abx500_function ab8500_functions[] = {
-       FUNCTION(sysclkreq),
-       FUNCTION(ycbcr),
-       FUNCTION(gpio),
-       FUNCTION(pwmout),
-       FUNCTION(adi1),
-       FUNCTION(usbuicc),
-       FUNCTION(dmic),
-       FUNCTION(extcpena),
-       FUNCTION(apespi),
-       FUNCTION(modsclsda),
-       FUNCTION(hiqclkena),
-       FUNCTION(i2ctrig),
-       FUNCTION(usbvdat),
-};
-
-/*
- * this table translates what's is in the AB8500 specification regarding the
- * balls alternate functions (as for DB, default, ALT_A, ALT_B and ALT_C).
- * ALTERNATE_FUNCTIONS(GPIO_NUMBER, GPIOSEL bit, ALTERNATFUNC bit1,
- * ALTERNATEFUNC bit2, ALTA val, ALTB val, ALTC val),
- *
- * example :
- *
- *     ALTERNATE_FUNCTIONS(13,     4,      3,      4, 0, 1 ,2),
- *     means that pin AB8500_PIN_W17 (pin 13) supports 4 mux (default/ALT_A,
- *     ALT_B and ALT_C), so GPIOSEL and ALTERNATFUNC registers are used to
- *     select the mux.  ALTA, ALTB and ALTC val indicates values to write in
- *     ALTERNATFUNC register. We need to specifies these values as SOC
- *     designers didn't apply the same logic on how to select mux in the
- *     ABx500 family.
- *
- *     As this pins supports at least ALT_B mux, default mux is
- *     selected by writing 1 in GPIOSEL bit :
- *
- *             | GPIOSEL bit=4 | alternatfunc bit2=4 | alternatfunc bit1=3
- *     default |       1       |          0          |          0
- *     alt_A   |       0       |          0          |          0
- *     alt_B   |       0       |          0          |          1
- *     alt_C   |       0       |          1          |          0
- *
- *     ALTERNATE_FUNCTIONS(8,      7, UNUSED, UNUSED),
- *     means that pin AB8500_PIN_W18 (pin 8) supports 2 mux, so only GPIOSEL
- *     register is used to select the mux. As this pins doesn't support at
- *     least ALT_B mux, default mux is by writing 0 in GPIOSEL bit :
- *
- *             | GPIOSEL bit=7 | alternatfunc bit2=  | alternatfunc bit1=
- *     default |       0       |          0          |          0
- *     alt_A   |       1       |          0          |          0
- */
-
-static struct
-alternate_functions ab8500_alternate_functions[AB8500_GPIO_MAX_NUMBER + 1] = {
-       ALTERNATE_FUNCTIONS(0, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO0 */
-       ALTERNATE_FUNCTIONS(1,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO1, altA controlled by bit 0 */
-       ALTERNATE_FUNCTIONS(2,      1, UNUSED, UNUSED, 0, 0, 0), /* GPIO2, altA controlled by bit 1 */
-       ALTERNATE_FUNCTIONS(3,      2, UNUSED, UNUSED, 0, 0, 0), /* GPIO3, altA controlled by bit 2*/
-       ALTERNATE_FUNCTIONS(4,      3, UNUSED, UNUSED, 0, 0, 0), /* GPIO4, altA controlled by bit 3*/
-       /* bit 4 reserved */
-       ALTERNATE_FUNCTIONS(5, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO5 */
-       ALTERNATE_FUNCTIONS(6,      5, UNUSED, UNUSED, 0, 0, 0), /* GPIO6, altA controlled by bit 5*/
-       ALTERNATE_FUNCTIONS(7,      6, UNUSED, UNUSED, 0, 0, 0), /* GPIO7, altA controlled by bit 6*/
-       ALTERNATE_FUNCTIONS(8,      7, UNUSED, UNUSED, 0, 0, 0), /* GPIO8, altA controlled by bit 7*/
-
-       ALTERNATE_FUNCTIONS(9,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO9, altA controlled by bit 0*/
-       ALTERNATE_FUNCTIONS(10,     1,      0, UNUSED, 0, 1, 0), /* GPIO10, altA and altB controlled by bit 0 */
-       ALTERNATE_FUNCTIONS(11,     2,      1, UNUSED, 0, 1, 0), /* GPIO11, altA and altB controlled by bit 1 */
-       ALTERNATE_FUNCTIONS(12,     3,      2, UNUSED, 0, 1, 0), /* GPIO12, altA and altB controlled by bit 2 */
-       ALTERNATE_FUNCTIONS(13,     4,      3,      4, 0, 1, 2), /* GPIO13, altA altB and altC controlled by bit 3 and 4 */
-       ALTERNATE_FUNCTIONS(14,     5, UNUSED, UNUSED, 0, 0, 0), /* GPIO14, altA controlled by bit 5 */
-       ALTERNATE_FUNCTIONS(15,     6, UNUSED, UNUSED, 0, 0, 0), /* GPIO15, altA controlled by bit 6 */
-       ALTERNATE_FUNCTIONS(16,     7, UNUSED, UNUSED, 0, 0, 0), /* GPIO16, altA controlled by bit 7 */
-       /*
-        * pins 17 to 20 are special case, only bit 0 is used to select
-        * alternate function for these 4 pins.
-        * bits 1 to 3 are reserved
-        */
-       ALTERNATE_FUNCTIONS(17,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO17, altA controlled by bit 0 */
-       ALTERNATE_FUNCTIONS(18,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO18, altA controlled by bit 0 */
-       ALTERNATE_FUNCTIONS(19,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO19, altA controlled by bit 0 */
-       ALTERNATE_FUNCTIONS(20,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO20, altA controlled by bit 0 */
-       ALTERNATE_FUNCTIONS(21,      4, UNUSED, UNUSED, 0, 0, 0), /* GPIO21, altA controlled by bit 4 */
-       ALTERNATE_FUNCTIONS(22,      5, UNUSED, UNUSED, 0, 0, 0), /* GPIO22, altA controlled by bit 5 */
-       ALTERNATE_FUNCTIONS(23,      6, UNUSED, UNUSED, 0, 0, 0), /* GPIO23, altA controlled by bit 6 */
-       ALTERNATE_FUNCTIONS(24,      7, UNUSED, UNUSED, 0, 0, 0), /* GPIO24, altA controlled by bit 7 */
-
-       ALTERNATE_FUNCTIONS(25,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO25, altA controlled by bit 0 */
-       /* pin 26 special case, no alternate function, bit 1 reserved */
-       ALTERNATE_FUNCTIONS(26, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* GPIO26 */
-       ALTERNATE_FUNCTIONS(27,      2, UNUSED, UNUSED, 0, 0, 0), /* GPIO27, altA controlled by bit 2 */
-       ALTERNATE_FUNCTIONS(28,      3, UNUSED, UNUSED, 0, 0, 0), /* GPIO28, altA controlled by bit 3 */
-       ALTERNATE_FUNCTIONS(29,      4, UNUSED, UNUSED, 0, 0, 0), /* GPIO29, altA controlled by bit 4 */
-       ALTERNATE_FUNCTIONS(30,      5, UNUSED, UNUSED, 0, 0, 0), /* GPIO30, altA controlled by bit 5 */
-       ALTERNATE_FUNCTIONS(31,      6, UNUSED, UNUSED, 0, 0, 0), /* GPIO31, altA controlled by bit 6 */
-       ALTERNATE_FUNCTIONS(32,      7, UNUSED, UNUSED, 0, 0, 0), /* GPIO32, altA controlled by bit 7 */
-
-       ALTERNATE_FUNCTIONS(33, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO33 */
-       ALTERNATE_FUNCTIONS(34,      1, UNUSED, UNUSED, 0, 0, 0), /* GPIO34, altA controlled by bit 1 */
-       /* pin 35 special case, no alternate function, bit 2 reserved */
-       ALTERNATE_FUNCTIONS(35, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* GPIO35 */
-       ALTERNATE_FUNCTIONS(36,      3, UNUSED, UNUSED, 0, 0, 0), /* GPIO36, altA controlled by bit 3 */
-       ALTERNATE_FUNCTIONS(37,      4, UNUSED, UNUSED, 0, 0, 0), /* GPIO37, altA controlled by bit 4 */
-       ALTERNATE_FUNCTIONS(38,      5, UNUSED, UNUSED, 0, 0, 0), /* GPIO38, altA controlled by bit 5 */
-       ALTERNATE_FUNCTIONS(39,      6, UNUSED, UNUSED, 0, 0, 0), /* GPIO39, altA controlled by bit 6 */
-       ALTERNATE_FUNCTIONS(40,      7, UNUSED, UNUSED, 0, 0, 0), /* GPIO40, altA controlled by bit 7 */
-
-       ALTERNATE_FUNCTIONS(41,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO41, altA controlled by bit 0 */
-       ALTERNATE_FUNCTIONS(42,      1, UNUSED, UNUSED, 0, 0, 0), /* GPIO42, altA controlled by bit 1 */
-};
-
-/*
- * Only some GPIOs are interrupt capable, and they are
- * organized in discontiguous clusters:
- *
- *     GPIO6 to GPIO13
- *     GPIO24 and GPIO25
- *     GPIO36 to GPIO41
- */
-static struct abx500_gpio_irq_cluster ab8500_gpio_irq_cluster[] = {
-       GPIO_IRQ_CLUSTER(6,  13, AB8500_INT_GPIO6R),
-       GPIO_IRQ_CLUSTER(24, 25, AB8500_INT_GPIO24R),
-       GPIO_IRQ_CLUSTER(36, 41, AB8500_INT_GPIO36R),
-};
-
-static struct abx500_pinctrl_soc_data ab8500_soc = {
-       .gpio_ranges = ab8500_pinranges,
-       .gpio_num_ranges = ARRAY_SIZE(ab8500_pinranges),
-       .pins = ab8500_pins,
-       .npins = ARRAY_SIZE(ab8500_pins),
-       .functions = ab8500_functions,
-       .nfunctions = ARRAY_SIZE(ab8500_functions),
-       .groups = ab8500_groups,
-       .ngroups = ARRAY_SIZE(ab8500_groups),
-       .alternate_functions = ab8500_alternate_functions,
-       .gpio_irq_cluster = ab8500_gpio_irq_cluster,
-       .ngpio_irq_cluster = ARRAY_SIZE(ab8500_gpio_irq_cluster),
-       .irq_gpio_rising_offset = AB8500_INT_GPIO6R,
-       .irq_gpio_falling_offset = AB8500_INT_GPIO6F,
-       .irq_gpio_factor = 1,
-};
-
-void abx500_pinctrl_ab8500_init(struct abx500_pinctrl_soc_data **soc)
-{
-       *soc = &ab8500_soc;
-}
diff --git a/drivers/pinctrl/pinctrl-ab8505.c b/drivers/pinctrl/pinctrl-ab8505.c
deleted file mode 100644 (file)
index bf0ef4a..0000000
+++ /dev/null
@@ -1,381 +0,0 @@
-/*
- * Copyright (C) ST-Ericsson SA 2012
- *
- * Author: Patrice Chotard <patrice.chotard@stericsson.com> for ST-Ericsson.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#include <linux/kernel.h>
-#include <linux/gpio.h>
-#include <linux/pinctrl/pinctrl.h>
-#include <linux/mfd/abx500/ab8500.h>
-#include "pinctrl-abx500.h"
-
-/* All the pins that can be used for GPIO and some other functions */
-#define ABX500_GPIO(offset)    (offset)
-
-#define AB8505_PIN_N4          ABX500_GPIO(1)
-#define AB8505_PIN_R5          ABX500_GPIO(2)
-#define AB8505_PIN_P5          ABX500_GPIO(3)
-/* hole */
-#define AB8505_PIN_B16         ABX500_GPIO(10)
-#define AB8505_PIN_B17         ABX500_GPIO(11)
-/* hole */
-#define AB8505_PIN_D17         ABX500_GPIO(13)
-#define AB8505_PIN_C16         ABX500_GPIO(14)
-/* hole */
-#define AB8505_PIN_P2          ABX500_GPIO(17)
-#define AB8505_PIN_N3          ABX500_GPIO(18)
-#define AB8505_PIN_T1          ABX500_GPIO(19)
-#define AB8505_PIN_P3          ABX500_GPIO(20)
-/* hole */
-#define AB8505_PIN_H14         ABX500_GPIO(34)
-/* hole */
-#define AB8505_PIN_J15         ABX500_GPIO(40)
-#define AB8505_PIN_J14         ABX500_GPIO(41)
-/* hole */
-#define AB8505_PIN_L4          ABX500_GPIO(50)
-/* hole */
-#define AB8505_PIN_D16         ABX500_GPIO(52)
-#define AB8505_PIN_D15         ABX500_GPIO(53)
-
-/* indicates the higher GPIO number */
-#define AB8505_GPIO_MAX_NUMBER 53
-
-/*
- * The names of the pins are denoted by GPIO number and ball name, even
- * though they can be used for other things than GPIO, this is the first
- * column in the table of the data sheet and often used on schematics and
- * such.
- */
-static const struct pinctrl_pin_desc ab8505_pins[] = {
-       PINCTRL_PIN(AB8505_PIN_N4, "GPIO1_N4"),
-       PINCTRL_PIN(AB8505_PIN_R5, "GPIO2_R5"),
-       PINCTRL_PIN(AB8505_PIN_P5, "GPIO3_P5"),
-/* hole */
-       PINCTRL_PIN(AB8505_PIN_B16, "GPIO10_B16"),
-       PINCTRL_PIN(AB8505_PIN_B17, "GPIO11_B17"),
-/* hole */
-       PINCTRL_PIN(AB8505_PIN_D17, "GPIO13_D17"),
-       PINCTRL_PIN(AB8505_PIN_C16, "GPIO14_C16"),
-/* hole */
-       PINCTRL_PIN(AB8505_PIN_P2, "GPIO17_P2"),
-       PINCTRL_PIN(AB8505_PIN_N3, "GPIO18_N3"),
-       PINCTRL_PIN(AB8505_PIN_T1, "GPIO19_T1"),
-       PINCTRL_PIN(AB8505_PIN_P3, "GPIO20_P3"),
-/* hole */
-       PINCTRL_PIN(AB8505_PIN_H14, "GPIO34_H14"),
-/* hole */
-       PINCTRL_PIN(AB8505_PIN_J15, "GPIO40_J15"),
-       PINCTRL_PIN(AB8505_PIN_J14, "GPIO41_J14"),
-/* hole */
-       PINCTRL_PIN(AB8505_PIN_L4, "GPIO50_L4"),
-/* hole */
-       PINCTRL_PIN(AB8505_PIN_D16, "GPIO52_D16"),
-       PINCTRL_PIN(AB8505_PIN_D15, "GPIO53_D15"),
-};
-
-/*
- * Maps local GPIO offsets to local pin numbers
- */
-static const struct abx500_pinrange ab8505_pinranges[] = {
-       ABX500_PINRANGE(1, 3, ABX500_ALT_A),
-       ABX500_PINRANGE(10, 2, ABX500_DEFAULT),
-       ABX500_PINRANGE(13, 1, ABX500_DEFAULT),
-       ABX500_PINRANGE(14, 1, ABX500_ALT_A),
-       ABX500_PINRANGE(17, 4, ABX500_ALT_A),
-       ABX500_PINRANGE(34, 1, ABX500_ALT_A),
-       ABX500_PINRANGE(40, 2, ABX500_ALT_A),
-       ABX500_PINRANGE(50, 1, ABX500_DEFAULT),
-       ABX500_PINRANGE(52, 2, ABX500_ALT_A),
-};
-
-/*
- * Read the pin group names like this:
- * sysclkreq2_d_1 = first groups of pins for sysclkreq2 on default function
- *
- * The groups are arranged as sets per altfunction column, so we can
- * mux in one group at a time by selecting the same altfunction for them
- * all. When functions require pins on different altfunctions, you need
- * to combine several groups.
- */
-
-/* default column */
-static const unsigned sysclkreq2_d_1_pins[] = { AB8505_PIN_N4 };
-static const unsigned sysclkreq3_d_1_pins[] = { AB8505_PIN_R5 };
-static const unsigned sysclkreq4_d_1_pins[] = { AB8505_PIN_P5 };
-static const unsigned gpio10_d_1_pins[] = { AB8505_PIN_B16 };
-static const unsigned gpio11_d_1_pins[] = { AB8505_PIN_B17 };
-static const unsigned gpio13_d_1_pins[] = { AB8505_PIN_D17 };
-static const unsigned pwmout1_d_1_pins[] = { AB8505_PIN_C16 };
-/* audio data interface 2*/
-static const unsigned adi2_d_1_pins[] = { AB8505_PIN_P2, AB8505_PIN_N3,
-                                       AB8505_PIN_T1, AB8505_PIN_P3 };
-static const unsigned extcpena_d_1_pins[] = { AB8505_PIN_H14 };
-/* modem SDA/SCL */
-static const unsigned modsclsda_d_1_pins[] = { AB8505_PIN_J15, AB8505_PIN_J14 };
-static const unsigned gpio50_d_1_pins[] = { AB8505_PIN_L4 };
-static const unsigned resethw_d_1_pins[] = { AB8505_PIN_D16 };
-static const unsigned service_d_1_pins[] = { AB8505_PIN_D15 };
-
-/* Altfunction A column */
-static const unsigned gpio1_a_1_pins[] = { AB8505_PIN_N4 };
-static const unsigned gpio2_a_1_pins[] = { AB8505_PIN_R5 };
-static const unsigned gpio3_a_1_pins[] = { AB8505_PIN_P5 };
-static const unsigned hiqclkena_a_1_pins[] = { AB8505_PIN_B16 };
-static const unsigned pdmclk_a_1_pins[] = { AB8505_PIN_B17 };
-static const unsigned uarttxdata_a_1_pins[] = { AB8505_PIN_D17 };
-static const unsigned gpio14_a_1_pins[] = { AB8505_PIN_C16 };
-static const unsigned gpio17_a_1_pins[] = { AB8505_PIN_P2 };
-static const unsigned gpio18_a_1_pins[] = { AB8505_PIN_N3 };
-static const unsigned gpio19_a_1_pins[] = { AB8505_PIN_T1 };
-static const unsigned gpio20_a_1_pins[] = { AB8505_PIN_P3 };
-static const unsigned gpio34_a_1_pins[] = { AB8505_PIN_H14 };
-static const unsigned gpio40_a_1_pins[] = { AB8505_PIN_J15 };
-static const unsigned gpio41_a_1_pins[] = { AB8505_PIN_J14 };
-static const unsigned uartrxdata_a_1_pins[] = { AB8505_PIN_J14 };
-static const unsigned gpio50_a_1_pins[] = { AB8505_PIN_L4 };
-static const unsigned gpio52_a_1_pins[] = { AB8505_PIN_D16 };
-static const unsigned gpio53_a_1_pins[] = { AB8505_PIN_D15 };
-
-/* Altfunction B colum */
-static const unsigned pdmdata_b_1_pins[] = { AB8505_PIN_B16 };
-static const unsigned extvibrapwm1_b_1_pins[] = { AB8505_PIN_D17 };
-static const unsigned extvibrapwm2_b_1_pins[] = { AB8505_PIN_L4 };
-
-/* Altfunction C column */
-static const unsigned usbvdat_c_1_pins[] = { AB8505_PIN_D17 };
-
-#define AB8505_PIN_GROUP(a, b) { .name = #a, .pins = a##_pins,         \
-                       .npins = ARRAY_SIZE(a##_pins), .altsetting = b }
-
-static const struct abx500_pingroup ab8505_groups[] = {
-       AB8505_PIN_GROUP(sysclkreq2_d_1, ABX500_DEFAULT),
-       AB8505_PIN_GROUP(sysclkreq3_d_1, ABX500_DEFAULT),
-       AB8505_PIN_GROUP(sysclkreq4_d_1, ABX500_DEFAULT),
-       AB8505_PIN_GROUP(gpio10_d_1, ABX500_DEFAULT),
-       AB8505_PIN_GROUP(gpio11_d_1, ABX500_DEFAULT),
-       AB8505_PIN_GROUP(gpio13_d_1, ABX500_DEFAULT),
-       AB8505_PIN_GROUP(pwmout1_d_1, ABX500_DEFAULT),
-       AB8505_PIN_GROUP(adi2_d_1, ABX500_DEFAULT),
-       AB8505_PIN_GROUP(extcpena_d_1, ABX500_DEFAULT),
-       AB8505_PIN_GROUP(modsclsda_d_1, ABX500_DEFAULT),
-       AB8505_PIN_GROUP(gpio50_d_1, ABX500_DEFAULT),
-       AB8505_PIN_GROUP(resethw_d_1, ABX500_DEFAULT),
-       AB8505_PIN_GROUP(service_d_1, ABX500_DEFAULT),
-       AB8505_PIN_GROUP(gpio1_a_1, ABX500_ALT_A),
-       AB8505_PIN_GROUP(gpio2_a_1, ABX500_ALT_A),
-       AB8505_PIN_GROUP(gpio3_a_1, ABX500_ALT_A),
-       AB8505_PIN_GROUP(hiqclkena_a_1, ABX500_ALT_A),
-       AB8505_PIN_GROUP(pdmclk_a_1, ABX500_ALT_A),
-       AB8505_PIN_GROUP(uarttxdata_a_1, ABX500_ALT_A),
-       AB8505_PIN_GROUP(gpio14_a_1, ABX500_ALT_A),
-       AB8505_PIN_GROUP(gpio17_a_1, ABX500_ALT_A),
-       AB8505_PIN_GROUP(gpio18_a_1, ABX500_ALT_A),
-       AB8505_PIN_GROUP(gpio19_a_1, ABX500_ALT_A),
-       AB8505_PIN_GROUP(gpio20_a_1, ABX500_ALT_A),
-       AB8505_PIN_GROUP(gpio34_a_1, ABX500_ALT_A),
-       AB8505_PIN_GROUP(gpio40_a_1, ABX500_ALT_A),
-       AB8505_PIN_GROUP(gpio41_a_1, ABX500_ALT_A),
-       AB8505_PIN_GROUP(uartrxdata_a_1, ABX500_ALT_A),
-       AB8505_PIN_GROUP(gpio52_a_1, ABX500_ALT_A),
-       AB8505_PIN_GROUP(gpio53_a_1, ABX500_ALT_A),
-       AB8505_PIN_GROUP(pdmdata_b_1, ABX500_ALT_B),
-       AB8505_PIN_GROUP(extvibrapwm1_b_1, ABX500_ALT_B),
-       AB8505_PIN_GROUP(extvibrapwm2_b_1, ABX500_ALT_B),
-       AB8505_PIN_GROUP(usbvdat_c_1, ABX500_ALT_C),
-};
-
-/* We use this macro to define the groups applicable to a function */
-#define AB8505_FUNC_GROUPS(a, b...)       \
-static const char * const a##_groups[] = { b };
-
-AB8505_FUNC_GROUPS(sysclkreq, "sysclkreq2_d_1", "sysclkreq3_d_1",
-               "sysclkreq4_d_1");
-AB8505_FUNC_GROUPS(gpio, "gpio1_a_1", "gpio2_a_1", "gpio3_a_1",
-               "gpio10_d_1", "gpio11_d_1", "gpio13_d_1", "gpio14_a_1",
-               "gpio17_a_1", "gpio18_a_1", "gpio19_a_1", "gpio20_a_1",
-               "gpio34_a_1", "gpio40_a_1", "gpio41_a_1", "gpio50_d_1",
-               "gpio52_a_1", "gpio53_a_1");
-AB8505_FUNC_GROUPS(pwmout, "pwmout1_d_1");
-AB8505_FUNC_GROUPS(adi2, "adi2_d_1");
-AB8505_FUNC_GROUPS(extcpena, "extcpena_d_1");
-AB8505_FUNC_GROUPS(modsclsda, "modsclsda_d_1");
-AB8505_FUNC_GROUPS(resethw, "resethw_d_1");
-AB8505_FUNC_GROUPS(service, "service_d_1");
-AB8505_FUNC_GROUPS(hiqclkena, "hiqclkena_a_1");
-AB8505_FUNC_GROUPS(pdm, "pdmclk_a_1", "pdmdata_b_1");
-AB8505_FUNC_GROUPS(uartdata, "uarttxdata_a_1", "uartrxdata_a_1");
-AB8505_FUNC_GROUPS(extvibra, "extvibrapwm1_b_1", "extvibrapwm2_b_1");
-AB8505_FUNC_GROUPS(usbvdat, "usbvdat_c_1");
-
-#define FUNCTION(fname)                                        \
-       {                                               \
-               .name = #fname,                         \
-               .groups = fname##_groups,               \
-               .ngroups = ARRAY_SIZE(fname##_groups),  \
-       }
-
-static const struct abx500_function ab8505_functions[] = {
-       FUNCTION(sysclkreq),
-       FUNCTION(gpio),
-       FUNCTION(pwmout),
-       FUNCTION(adi2),
-       FUNCTION(extcpena),
-       FUNCTION(modsclsda),
-       FUNCTION(resethw),
-       FUNCTION(service),
-       FUNCTION(hiqclkena),
-       FUNCTION(pdm),
-       FUNCTION(uartdata),
-       FUNCTION(extvibra),
-       FUNCTION(extvibra),
-       FUNCTION(usbvdat),
-};
-
-/*
- * this table translates what's is in the AB8505 specification regarding the
- * balls alternate functions (as for DB, default, ALT_A, ALT_B and ALT_C).
- * ALTERNATE_FUNCTIONS(GPIO_NUMBER, GPIOSEL bit, ALTERNATFUNC bit1,
- * ALTERNATEFUNC bit2, ALTA val, ALTB val, ALTC val),
- *
- * example :
- *
- *     ALTERNATE_FUNCTIONS(13,     4,      3,      4, 1, 0, 2),
- *     means that pin AB8505_PIN_D18 (pin 13) supports 4 mux (default/ALT_A,
- *     ALT_B and ALT_C), so GPIOSEL and ALTERNATFUNC registers are used to
- *     select the mux. ALTA, ALTB and ALTC val indicates values to write in
- *     ALTERNATFUNC register. We need to specifies these values as SOC
- *     designers didn't apply the same logic on how to select mux in the
- *     ABx500 family.
- *
- *     As this pins supports at least ALT_B mux, default mux is
- *     selected by writing 1 in GPIOSEL bit :
- *
- *             | GPIOSEL bit=4 | alternatfunc bit2=4 | alternatfunc bit1=3
- *     default |       1       |          0          |          0
- *     alt_A   |       0       |          0          |          1
- *     alt_B   |       0       |          0          |          0
- *     alt_C   |       0       |          1          |          0
- *
- *     ALTERNATE_FUNCTIONS(1,      0, UNUSED, UNUSED),
- *     means that pin AB9540_PIN_R4 (pin 1) supports 2 mux, so only GPIOSEL
- *     register is used to select the mux. As this pins doesn't support at
- *     least ALT_B mux, default mux is by writing 0 in GPIOSEL bit :
- *
- *             | GPIOSEL bit=0 | alternatfunc bit2=  | alternatfunc bit1=
- *     default |       0       |          0          |          0
- *     alt_A   |       1       |          0          |          0
- */
-
-static struct
-alternate_functions ab8505_alternate_functions[AB8505_GPIO_MAX_NUMBER + 1] = {
-       ALTERNATE_FUNCTIONS(0, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO0 */
-       ALTERNATE_FUNCTIONS(1,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO1, altA controlled by bit 0 */
-       ALTERNATE_FUNCTIONS(2,      1, UNUSED, UNUSED, 0, 0, 0), /* GPIO2, altA controlled by bit 1 */
-       ALTERNATE_FUNCTIONS(3,      2, UNUSED, UNUSED, 0, 0, 0), /* GPIO3, altA controlled by bit 2*/
-       ALTERNATE_FUNCTIONS(4, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO4, bit 3 reserved */
-       ALTERNATE_FUNCTIONS(5, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO5, bit 4 reserved */
-       ALTERNATE_FUNCTIONS(6, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO6, bit 5 reserved */
-       ALTERNATE_FUNCTIONS(7, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO7, bit 6 reserved */
-       ALTERNATE_FUNCTIONS(8, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO8, bit 7 reserved */
-
-       ALTERNATE_FUNCTIONS(9, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO9, bit 0 reserved */
-       ALTERNATE_FUNCTIONS(10,      1,      0, UNUSED, 1, 0, 0), /* GPIO10, altA and altB controlled by bit 0 */
-       ALTERNATE_FUNCTIONS(11,      2,      1, UNUSED, 0, 0, 0), /* GPIO11, altA controlled by bit 2 */
-       ALTERNATE_FUNCTIONS(12, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO12, bit3 reseved */
-       ALTERNATE_FUNCTIONS(13,      4,      3,      4, 1, 0, 2), /* GPIO13, altA altB and altC controlled by bit 3 and 4 */
-       ALTERNATE_FUNCTIONS(14,      5, UNUSED, UNUSED, 0, 0, 0), /* GPIO14, altA controlled by bit 5 */
-       ALTERNATE_FUNCTIONS(15, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO15, bit 6 reserved */
-       ALTERNATE_FUNCTIONS(16, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO15, bit 7 reserved  */
-       /*
-        * pins 17 to 20 are special case, only bit 0 is used to select
-        * alternate function for these 4 pins.
-        * bits 1 to 3 are reserved
-        */
-       ALTERNATE_FUNCTIONS(17,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO17, altA controlled by bit 0 */
-       ALTERNATE_FUNCTIONS(18,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO18, altA controlled by bit 0 */
-       ALTERNATE_FUNCTIONS(19,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO19, altA controlled by bit 0 */
-       ALTERNATE_FUNCTIONS(20,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO20, altA controlled by bit 0 */
-       ALTERNATE_FUNCTIONS(21, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO21, bit 4 reserved */
-       ALTERNATE_FUNCTIONS(22, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO22, bit 5 reserved */
-       ALTERNATE_FUNCTIONS(23, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO23, bit 6 reserved */
-       ALTERNATE_FUNCTIONS(24, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO24, bit 7 reserved */
-
-       ALTERNATE_FUNCTIONS(25, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO25, bit 0 reserved */
-       ALTERNATE_FUNCTIONS(26, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO26, bit 1 reserved */
-       ALTERNATE_FUNCTIONS(27, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO27, bit 2 reserved */
-       ALTERNATE_FUNCTIONS(28, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO28, bit 3 reserved */
-       ALTERNATE_FUNCTIONS(29, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO29, bit 4 reserved */
-       ALTERNATE_FUNCTIONS(30, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO30, bit 5 reserved */
-       ALTERNATE_FUNCTIONS(31, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO31, bit 6 reserved */
-       ALTERNATE_FUNCTIONS(32, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO32, bit 7 reserved */
-
-       ALTERNATE_FUNCTIONS(33, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO33, bit 0 reserved */
-       ALTERNATE_FUNCTIONS(34,      1, UNUSED, UNUSED, 0, 0, 0), /* GPIO34, altA controlled by bit 1 */
-       ALTERNATE_FUNCTIONS(35, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO35, bit 2 reserved */
-       ALTERNATE_FUNCTIONS(36, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO36, bit 2 reserved */
-       ALTERNATE_FUNCTIONS(37, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO37, bit 2 reserved */
-       ALTERNATE_FUNCTIONS(38, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO38, bit 2 reserved */
-       ALTERNATE_FUNCTIONS(39, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO39, bit 2 reserved */
-       ALTERNATE_FUNCTIONS(40,      7, UNUSED, UNUSED, 0, 0, 0), /* GPIO40, altA controlled by bit 7*/
-
-       ALTERNATE_FUNCTIONS(41,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO41, altA controlled by bit 0 */
-       ALTERNATE_FUNCTIONS(42, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO42, bit 1 reserved */
-       ALTERNATE_FUNCTIONS(43, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO43, bit 2 reserved */
-       ALTERNATE_FUNCTIONS(44, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO44, bit 3 reserved */
-       ALTERNATE_FUNCTIONS(45, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO45, bit 4 reserved */
-       ALTERNATE_FUNCTIONS(46, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO46, bit 5 reserved */
-       ALTERNATE_FUNCTIONS(47, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO47, bit 6 reserved */
-       ALTERNATE_FUNCTIONS(48, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO48, bit 7 reserved */
-
-       ALTERNATE_FUNCTIONS(49, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO49, bit 0 reserved */
-       ALTERNATE_FUNCTIONS(50,      1,      2, UNUSED, 1, 0, 0), /* GPIO50, altA controlled by bit 1 */
-       ALTERNATE_FUNCTIONS(51, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO49, bit 0 reserved */
-       ALTERNATE_FUNCTIONS(52,      3, UNUSED, UNUSED, 0, 0, 0), /* GPIO52, altA controlled by bit 3 */
-       ALTERNATE_FUNCTIONS(53,      4, UNUSED, UNUSED, 0, 0, 0), /* GPIO53, altA controlled by bit 4 */
-};
-
-/*
- * For AB8505 Only some GPIOs are interrupt capable, and they are
- * organized in discontiguous clusters:
- *
- *     GPIO10 to GPIO11
- *     GPIO13
- *     GPIO40 and GPIO41
- *     GPIO50
- *     GPIO52 to GPIO53
- */
-static struct abx500_gpio_irq_cluster ab8505_gpio_irq_cluster[] = {
-       GPIO_IRQ_CLUSTER(10, 11, AB8500_INT_GPIO10R),
-       GPIO_IRQ_CLUSTER(13, 13, AB8500_INT_GPIO13R),
-       GPIO_IRQ_CLUSTER(40, 41, AB8500_INT_GPIO40R),
-       GPIO_IRQ_CLUSTER(50, 50, AB9540_INT_GPIO50R),
-       GPIO_IRQ_CLUSTER(52, 53, AB9540_INT_GPIO52R),
-};
-
-static struct abx500_pinctrl_soc_data ab8505_soc = {
-       .gpio_ranges = ab8505_pinranges,
-       .gpio_num_ranges = ARRAY_SIZE(ab8505_pinranges),
-       .pins = ab8505_pins,
-       .npins = ARRAY_SIZE(ab8505_pins),
-       .functions = ab8505_functions,
-       .nfunctions = ARRAY_SIZE(ab8505_functions),
-       .groups = ab8505_groups,
-       .ngroups = ARRAY_SIZE(ab8505_groups),
-       .alternate_functions = ab8505_alternate_functions,
-       .gpio_irq_cluster = ab8505_gpio_irq_cluster,
-       .ngpio_irq_cluster = ARRAY_SIZE(ab8505_gpio_irq_cluster),
-       .irq_gpio_rising_offset = AB8500_INT_GPIO6R,
-       .irq_gpio_falling_offset = AB8500_INT_GPIO6F,
-       .irq_gpio_factor = 1,
-};
-
-void
-abx500_pinctrl_ab8505_init(struct abx500_pinctrl_soc_data **soc)
-{
-       *soc = &ab8505_soc;
-}
diff --git a/drivers/pinctrl/pinctrl-ab8540.c b/drivers/pinctrl/pinctrl-ab8540.c
deleted file mode 100644 (file)
index 9867535..0000000
+++ /dev/null
@@ -1,408 +0,0 @@
-/*
- * Copyright (C) ST-Ericsson SA 2012
- *
- * Author: Patrice Chotard <patrice.chotard@stericsson.com> for ST-Ericsson.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#include <linux/kernel.h>
-#include <linux/gpio.h>
-#include <linux/pinctrl/pinctrl.h>
-#include <linux/mfd/abx500/ab8500.h>
-#include "pinctrl-abx500.h"
-
-/* All the pins that can be used for GPIO and some other functions */
-#define ABX500_GPIO(offset)            (offset)
-
-#define AB8540_PIN_J16         ABX500_GPIO(1)
-#define AB8540_PIN_D17         ABX500_GPIO(2)
-#define AB8540_PIN_C12         ABX500_GPIO(3)
-#define AB8540_PIN_G12         ABX500_GPIO(4)
-/* hole */
-#define AB8540_PIN_D16         ABX500_GPIO(14)
-#define AB8540_PIN_F15         ABX500_GPIO(15)
-#define AB8540_PIN_J8          ABX500_GPIO(16)
-#define AB8540_PIN_K16         ABX500_GPIO(17)
-#define AB8540_PIN_G15         ABX500_GPIO(18)
-#define AB8540_PIN_F17         ABX500_GPIO(19)
-#define AB8540_PIN_E17         ABX500_GPIO(20)
-/* hole */
-#define AB8540_PIN_AA16                ABX500_GPIO(27)
-#define AB8540_PIN_W18         ABX500_GPIO(28)
-#define AB8540_PIN_Y15         ABX500_GPIO(29)
-#define AB8540_PIN_W16         ABX500_GPIO(30)
-#define AB8540_PIN_V15         ABX500_GPIO(31)
-#define AB8540_PIN_W17         ABX500_GPIO(32)
-/* hole */
-#define AB8540_PIN_D12         ABX500_GPIO(42)
-#define AB8540_PIN_P4          ABX500_GPIO(43)
-#define AB8540_PIN_AB1         ABX500_GPIO(44)
-#define AB8540_PIN_K7          ABX500_GPIO(45)
-#define AB8540_PIN_L7          ABX500_GPIO(46)
-#define AB8540_PIN_G10         ABX500_GPIO(47)
-#define AB8540_PIN_K12         ABX500_GPIO(48)
-/* hole */
-#define AB8540_PIN_N8          ABX500_GPIO(51)
-#define AB8540_PIN_P12         ABX500_GPIO(52)
-#define AB8540_PIN_K8          ABX500_GPIO(53)
-#define AB8540_PIN_J11         ABX500_GPIO(54)
-#define AB8540_PIN_AC2         ABX500_GPIO(55)
-#define AB8540_PIN_AB2         ABX500_GPIO(56)
-
-/* indicates the highest GPIO number */
-#define AB8540_GPIO_MAX_NUMBER 56
-
-/*
- * The names of the pins are denoted by GPIO number and ball name, even
- * though they can be used for other things than GPIO, this is the first
- * column in the table of the data sheet and often used on schematics and
- * such.
- */
-static const struct pinctrl_pin_desc ab8540_pins[] = {
-       PINCTRL_PIN(AB8540_PIN_J16, "GPIO1_J16"),
-       PINCTRL_PIN(AB8540_PIN_D17, "GPIO2_D17"),
-       PINCTRL_PIN(AB8540_PIN_C12, "GPIO3_C12"),
-       PINCTRL_PIN(AB8540_PIN_G12, "GPIO4_G12"),
-       /* hole */
-       PINCTRL_PIN(AB8540_PIN_D16, "GPIO14_D16"),
-       PINCTRL_PIN(AB8540_PIN_F15, "GPIO15_F15"),
-       PINCTRL_PIN(AB8540_PIN_J8, "GPIO16_J8"),
-       PINCTRL_PIN(AB8540_PIN_K16, "GPIO17_K16"),
-       PINCTRL_PIN(AB8540_PIN_G15, "GPIO18_G15"),
-       PINCTRL_PIN(AB8540_PIN_F17, "GPIO19_F17"),
-       PINCTRL_PIN(AB8540_PIN_E17, "GPIO20_E17"),
-       /* hole */
-       PINCTRL_PIN(AB8540_PIN_AA16, "GPIO27_AA16"),
-       PINCTRL_PIN(AB8540_PIN_W18, "GPIO28_W18"),
-       PINCTRL_PIN(AB8540_PIN_Y15, "GPIO29_Y15"),
-       PINCTRL_PIN(AB8540_PIN_W16, "GPIO30_W16"),
-       PINCTRL_PIN(AB8540_PIN_V15, "GPIO31_V15"),
-       PINCTRL_PIN(AB8540_PIN_W17, "GPIO32_W17"),
-       /* hole */
-       PINCTRL_PIN(AB8540_PIN_D12, "GPIO42_D12"),
-       PINCTRL_PIN(AB8540_PIN_P4, "GPIO43_P4"),
-       PINCTRL_PIN(AB8540_PIN_AB1, "GPIO44_AB1"),
-       PINCTRL_PIN(AB8540_PIN_K7, "GPIO45_K7"),
-       PINCTRL_PIN(AB8540_PIN_L7, "GPIO46_L7"),
-       PINCTRL_PIN(AB8540_PIN_G10, "GPIO47_G10"),
-       PINCTRL_PIN(AB8540_PIN_K12, "GPIO48_K12"),
-       /* hole */
-       PINCTRL_PIN(AB8540_PIN_N8, "GPIO51_N8"),
-       PINCTRL_PIN(AB8540_PIN_P12, "GPIO52_P12"),
-       PINCTRL_PIN(AB8540_PIN_K8, "GPIO53_K8"),
-       PINCTRL_PIN(AB8540_PIN_J11, "GPIO54_J11"),
-       PINCTRL_PIN(AB8540_PIN_AC2, "GPIO55_AC2"),
-       PINCTRL_PIN(AB8540_PIN_AB2, "GPIO56_AB2"),
-};
-
-/*
- * Maps local GPIO offsets to local pin numbers
- */
-static const struct abx500_pinrange ab8540_pinranges[] = {
-       ABX500_PINRANGE(1, 4, ABX500_ALT_A),
-       ABX500_PINRANGE(14, 7, ABX500_ALT_A),
-       ABX500_PINRANGE(27, 6, ABX500_ALT_A),
-       ABX500_PINRANGE(42, 7, ABX500_ALT_A),
-       ABX500_PINRANGE(51, 6, ABX500_ALT_A),
-};
-
-/*
- * Read the pin group names like this:
- * sysclkreq2_d_1 = first groups of pins for sysclkreq2 on default function
- *
- * The groups are arranged as sets per altfunction column, so we can
- * mux in one group at a time by selecting the same altfunction for them
- * all. When functions require pins on different altfunctions, you need
- * to combine several groups.
- */
-
-/* default column */
-static const unsigned sysclkreq2_d_1_pins[] = { AB8540_PIN_J16 };
-static const unsigned sysclkreq3_d_1_pins[] = { AB8540_PIN_D17 };
-static const unsigned sysclkreq4_d_1_pins[] = { AB8540_PIN_C12 };
-static const unsigned sysclkreq6_d_1_pins[] = { AB8540_PIN_G12 };
-static const unsigned pwmout1_d_1_pins[] = { AB8540_PIN_D16 };
-static const unsigned pwmout2_d_1_pins[] = { AB8540_PIN_F15 };
-static const unsigned pwmout3_d_1_pins[] = { AB8540_PIN_J8 };
-
-/* audio data interface 1*/
-static const unsigned adi1_d_1_pins[] = { AB8540_PIN_K16, AB8540_PIN_G15,
-                                       AB8540_PIN_F17, AB8540_PIN_E17 };
-/* Digital microphone 1 and 2 */
-static const unsigned dmic12_d_1_pins[] = { AB8540_PIN_AA16, AB8540_PIN_W18 };
-/* Digital microphone 3 and 4 */
-static const unsigned dmic34_d_1_pins[] = { AB8540_PIN_Y15, AB8540_PIN_W16 };
-/* Digital microphone 5 and 6 */
-static const unsigned dmic56_d_1_pins[] = { AB8540_PIN_V15, AB8540_PIN_W17 };
-static const unsigned sysclkreq5_d_1_pins[] = { AB8540_PIN_D12 };
-static const unsigned batremn_d_1_pins[] = { AB8540_PIN_P4 };
-static const unsigned service_d_1_pins[] = { AB8540_PIN_AB1 };
-static const unsigned pwrctrl0_d_1_pins[] = { AB8540_PIN_K7 };
-static const unsigned pwrctrl1_d_1_pins[] = { AB8540_PIN_L7 };
-static const unsigned pwmextvibra1_d_1_pins[] = { AB8540_PIN_G10 };
-static const unsigned pwmextvibra2_d_1_pins[] = { AB8540_PIN_K12 };
-static const unsigned gpio1_vbat_d_1_pins[] = { AB8540_PIN_N8 };
-static const unsigned gpio2_vbat_d_1_pins[] = { AB8540_PIN_P12 };
-static const unsigned gpio3_vbat_d_1_pins[] = { AB8540_PIN_K8 };
-static const unsigned gpio4_vbat_d_1_pins[] = { AB8540_PIN_J11 };
-static const unsigned pdmclkdat_d_1_pins[] = { AB8540_PIN_AC2, AB8540_PIN_AB2 };
-
-/* Altfunction A column */
-static const unsigned gpio1_a_1_pins[] = { AB8540_PIN_J16 };
-static const unsigned gpio2_a_1_pins[] = { AB8540_PIN_D17 };
-static const unsigned gpio3_a_1_pins[] = { AB8540_PIN_C12 };
-static const unsigned gpio4_a_1_pins[] = { AB8540_PIN_G12 };
-static const unsigned gpio14_a_1_pins[] = { AB8540_PIN_D16 };
-static const unsigned gpio15_a_1_pins[] = { AB8540_PIN_F15 };
-static const unsigned gpio16_a_1_pins[] = { AB8540_PIN_J8 };
-static const unsigned gpio17_a_1_pins[] = { AB8540_PIN_K16 };
-static const unsigned gpio18_a_1_pins[] = { AB8540_PIN_G15 };
-static const unsigned gpio19_a_1_pins[] = { AB8540_PIN_F17 };
-static const unsigned gpio20_a_1_pins[] = { AB8540_PIN_E17 };
-static const unsigned gpio27_a_1_pins[] = { AB8540_PIN_AA16 };
-static const unsigned gpio28_a_1_pins[] = { AB8540_PIN_W18 };
-static const unsigned gpio29_a_1_pins[] = { AB8540_PIN_Y15 };
-static const unsigned gpio30_a_1_pins[] = { AB8540_PIN_W16 };
-static const unsigned gpio31_a_1_pins[] = { AB8540_PIN_V15 };
-static const unsigned gpio32_a_1_pins[] = { AB8540_PIN_W17 };
-static const unsigned gpio42_a_1_pins[] = { AB8540_PIN_D12 };
-static const unsigned gpio43_a_1_pins[] = { AB8540_PIN_P4 };
-static const unsigned gpio44_a_1_pins[] = { AB8540_PIN_AB1 };
-static const unsigned gpio45_a_1_pins[] = { AB8540_PIN_K7 };
-static const unsigned gpio46_a_1_pins[] = { AB8540_PIN_L7 };
-static const unsigned gpio47_a_1_pins[] = { AB8540_PIN_G10 };
-static const unsigned gpio48_a_1_pins[] = { AB8540_PIN_K12 };
-static const unsigned gpio51_a_1_pins[] = { AB8540_PIN_N8 };
-static const unsigned gpio52_a_1_pins[] = { AB8540_PIN_P12 };
-static const unsigned gpio53_a_1_pins[] = { AB8540_PIN_K8 };
-static const unsigned gpio54_a_1_pins[] = { AB8540_PIN_J11 };
-static const unsigned gpio55_a_1_pins[] = { AB8540_PIN_AC2 };
-static const unsigned gpio56_a_1_pins[] = { AB8540_PIN_AB2 };
-
-#define AB8540_PIN_GROUP(a, b) { .name = #a, .pins = a##_pins,         \
-                       .npins = ARRAY_SIZE(a##_pins), .altsetting = b }
-
-static const struct abx500_pingroup ab8540_groups[] = {
-       /* default column */
-       AB8540_PIN_GROUP(sysclkreq2_d_1, ABX500_DEFAULT),
-       AB8540_PIN_GROUP(sysclkreq3_d_1, ABX500_DEFAULT),
-       AB8540_PIN_GROUP(sysclkreq4_d_1, ABX500_DEFAULT),
-       AB8540_PIN_GROUP(sysclkreq6_d_1, ABX500_DEFAULT),
-       AB8540_PIN_GROUP(pwmout1_d_1, ABX500_DEFAULT),
-       AB8540_PIN_GROUP(pwmout2_d_1, ABX500_DEFAULT),
-       AB8540_PIN_GROUP(pwmout3_d_1, ABX500_DEFAULT),
-       AB8540_PIN_GROUP(adi1_d_1, ABX500_DEFAULT),
-       AB8540_PIN_GROUP(dmic12_d_1, ABX500_DEFAULT),
-       AB8540_PIN_GROUP(dmic34_d_1, ABX500_DEFAULT),
-       AB8540_PIN_GROUP(dmic56_d_1, ABX500_DEFAULT),
-       AB8540_PIN_GROUP(sysclkreq5_d_1, ABX500_DEFAULT),
-       AB8540_PIN_GROUP(batremn_d_1, ABX500_DEFAULT),
-       AB8540_PIN_GROUP(service_d_1, ABX500_DEFAULT),
-       AB8540_PIN_GROUP(pwrctrl0_d_1, ABX500_DEFAULT),
-       AB8540_PIN_GROUP(pwrctrl1_d_1, ABX500_DEFAULT),
-       AB8540_PIN_GROUP(pwmextvibra1_d_1, ABX500_DEFAULT),
-       AB8540_PIN_GROUP(pwmextvibra2_d_1, ABX500_DEFAULT),
-       AB8540_PIN_GROUP(gpio1_vbat_d_1, ABX500_DEFAULT),
-       AB8540_PIN_GROUP(gpio2_vbat_d_1, ABX500_DEFAULT),
-       AB8540_PIN_GROUP(gpio3_vbat_d_1, ABX500_DEFAULT),
-       AB8540_PIN_GROUP(gpio4_vbat_d_1, ABX500_DEFAULT),
-       AB8540_PIN_GROUP(pdmclkdat_d_1, ABX500_DEFAULT),
-       /* Altfunction A column */
-       AB8540_PIN_GROUP(gpio1_a_1, ABX500_ALT_A),
-       AB8540_PIN_GROUP(gpio2_a_1, ABX500_ALT_A),
-       AB8540_PIN_GROUP(gpio3_a_1, ABX500_ALT_A),
-       AB8540_PIN_GROUP(gpio4_a_1, ABX500_ALT_A),
-       AB8540_PIN_GROUP(gpio14_a_1, ABX500_ALT_A),
-       AB8540_PIN_GROUP(gpio15_a_1, ABX500_ALT_A),
-       AB8540_PIN_GROUP(gpio16_a_1, ABX500_ALT_A),
-       AB8540_PIN_GROUP(gpio17_a_1, ABX500_ALT_A),
-       AB8540_PIN_GROUP(gpio18_a_1, ABX500_ALT_A),
-       AB8540_PIN_GROUP(gpio19_a_1, ABX500_ALT_A),
-       AB8540_PIN_GROUP(gpio20_a_1, ABX500_ALT_A),
-       AB8540_PIN_GROUP(gpio27_a_1, ABX500_ALT_A),
-       AB8540_PIN_GROUP(gpio28_a_1, ABX500_ALT_A),
-       AB8540_PIN_GROUP(gpio29_a_1, ABX500_ALT_A),
-       AB8540_PIN_GROUP(gpio30_a_1, ABX500_ALT_A),
-       AB8540_PIN_GROUP(gpio31_a_1, ABX500_ALT_A),
-       AB8540_PIN_GROUP(gpio32_a_1, ABX500_ALT_A),
-       AB8540_PIN_GROUP(gpio42_a_1, ABX500_ALT_A),
-       AB8540_PIN_GROUP(gpio43_a_1, ABX500_ALT_A),
-       AB8540_PIN_GROUP(gpio44_a_1, ABX500_ALT_A),
-       AB8540_PIN_GROUP(gpio45_a_1, ABX500_ALT_A),
-       AB8540_PIN_GROUP(gpio46_a_1, ABX500_ALT_A),
-       AB8540_PIN_GROUP(gpio47_a_1, ABX500_ALT_A),
-       AB8540_PIN_GROUP(gpio48_a_1, ABX500_ALT_A),
-       AB8540_PIN_GROUP(gpio51_a_1, ABX500_ALT_A),
-       AB8540_PIN_GROUP(gpio52_a_1, ABX500_ALT_A),
-       AB8540_PIN_GROUP(gpio53_a_1, ABX500_ALT_A),
-       AB8540_PIN_GROUP(gpio54_a_1, ABX500_ALT_A),
-       AB8540_PIN_GROUP(gpio55_a_1, ABX500_ALT_A),
-       AB8540_PIN_GROUP(gpio56_a_1, ABX500_ALT_A),
-};
-
-/* We use this macro to define the groups applicable to a function */
-#define AB8540_FUNC_GROUPS(a, b...)       \
-static const char * const a##_groups[] = { b };
-
-AB8540_FUNC_GROUPS(sysclkreq, "sysclkreq2_d_1", "sysclkreq3_d_1",
-               "sysclkreq4_d_1", "sysclkreq5_d_1", "sysclkreq6_d_1");
-AB8540_FUNC_GROUPS(gpio, "gpio1_a_1", "gpio2_a_1", "gpio3_a_1", "gpio4_a_1",
-               "gpio14_a_1", "gpio15_a_1", "gpio16_a_1", "gpio17_a_1",
-               "gpio18_a_1", "gpio19_a_1", "gpio20_a_1", "gpio27_a_1",
-               "gpio28_a_1", "gpio29_a_1", "gpio30_a_1", "gpio31_a_1",
-               "gpio32_a_1", "gpio42_a_1", "gpio43_a_1", "gpio44_a_1",
-               "gpio45_a_1", "gpio46_a_1", "gpio47_a_1", "gpio48_a_1",
-               "gpio51_a_1", "gpio52_a_1", "gpio53_a_1", "gpio54_a_1",
-               "gpio55_a_1", "gpio56_a_1");
-AB8540_FUNC_GROUPS(pwmout, "pwmout1_d_1", "pwmout2_d_1", "pwmout3_d_1");
-AB8540_FUNC_GROUPS(adi1, "adi1_d_1");
-AB8540_FUNC_GROUPS(dmic, "dmic12_d_1", "dmic34_d_1", "dmic56_d_1");
-AB8540_FUNC_GROUPS(batremn, "batremn_d_1");
-AB8540_FUNC_GROUPS(service, "service_d_1");
-AB8540_FUNC_GROUPS(pwrctrl, "pwrctrl0_d_1", "pwrctrl1_d_1");
-AB8540_FUNC_GROUPS(pwmextvibra, "pwmextvibra1_d_1", "pwmextvibra2_d_1");
-AB8540_FUNC_GROUPS(gpio_vbat, "gpio1_vbat_d_1", "gpio2_vbat_d_1",
-               "gpio3_vbat_d_1", "gpio4_vbat_d_1");
-AB8540_FUNC_GROUPS(pdm, "pdmclkdat_d_1");
-
-#define FUNCTION(fname)                                        \
-       {                                               \
-               .name = #fname,                         \
-               .groups = fname##_groups,               \
-               .ngroups = ARRAY_SIZE(fname##_groups),  \
-       }
-
-static const struct abx500_function ab8540_functions[] = {
-       FUNCTION(sysclkreq),
-       FUNCTION(gpio),
-       FUNCTION(pwmout),
-       FUNCTION(adi1),
-       FUNCTION(dmic),
-       FUNCTION(batremn),
-       FUNCTION(service),
-       FUNCTION(pwrctrl),
-       FUNCTION(pwmextvibra),
-       FUNCTION(gpio_vbat),
-       FUNCTION(pdm),
-};
-
-/*
- * this table translates what's is in the AB8540 specification regarding the
- * balls alternate functions (as for DB, default, ALT_A, ALT_B and ALT_C).
- * ALTERNATE_FUNCTIONS(GPIO_NUMBER, GPIOSEL bit, ALTERNATFUNC bit1,
- * ALTERNATEFUNC bit2, ALTA val, ALTB val, ALTC val),
- * AB8540 only supports DEFAULT and ALTA functions, so ALTERNATFUNC
- * registers is not used
- *
- */
-
-static struct
-alternate_functions ab8540_alternate_functions[AB8540_GPIO_MAX_NUMBER + 1] = {
-       /* GPIOSEL1 - bit 4-7 reserved */
-       ALTERNATE_FUNCTIONS(0, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO0 */
-       ALTERNATE_FUNCTIONS(1,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO1, altA controlled by bit 0 */
-       ALTERNATE_FUNCTIONS(2,      1, UNUSED, UNUSED, 0, 0, 0), /* GPIO2, altA controlled by bit 1 */
-       ALTERNATE_FUNCTIONS(3,      2, UNUSED, UNUSED, 0, 0, 0), /* GPIO3, altA controlled by bit 2*/
-       ALTERNATE_FUNCTIONS(4,      3, UNUSED, UNUSED, 0, 0, 0), /* GPIO4, altA controlled by bit 3*/
-       ALTERNATE_FUNCTIONS(5, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO5 */
-       ALTERNATE_FUNCTIONS(6, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO6 */
-       ALTERNATE_FUNCTIONS(7, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO7 */
-       ALTERNATE_FUNCTIONS(8, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO8 */
-       /* GPIOSEL2 - bit 0-4 reserved */
-       ALTERNATE_FUNCTIONS(9,  UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO9 */
-       ALTERNATE_FUNCTIONS(10, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO10 */
-       ALTERNATE_FUNCTIONS(11, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO11 */
-       ALTERNATE_FUNCTIONS(12, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO12 */
-       ALTERNATE_FUNCTIONS(13, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO13 */
-       ALTERNATE_FUNCTIONS(14,      5, UNUSED, UNUSED, 0, 0, 0), /* GPIO14, altA controlled by bit 5 */
-       ALTERNATE_FUNCTIONS(15,      6, UNUSED, UNUSED, 0, 0, 0), /* GPIO15, altA controlled by bit 6 */
-       ALTERNATE_FUNCTIONS(16,      7, UNUSED, UNUSED, 0, 0, 0), /* GPIO16, altA controlled by bit 7 */
-       /* GPIOSEL3 - bit 4-7 reserved */
-       ALTERNATE_FUNCTIONS(17,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO17, altA controlled by bit 0 */
-       ALTERNATE_FUNCTIONS(18,      1, UNUSED, UNUSED, 0, 0, 0), /* GPIO18, altA controlled by bit 1 */
-       ALTERNATE_FUNCTIONS(19,      2, UNUSED, UNUSED, 0, 0, 0), /* GPIO19, altA controlled by bit 2 */
-       ALTERNATE_FUNCTIONS(20,      3, UNUSED, UNUSED, 0, 0, 0), /* GPIO20, altA controlled by bit 3 */
-       ALTERNATE_FUNCTIONS(21, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO21 */
-       ALTERNATE_FUNCTIONS(22, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO22 */
-       ALTERNATE_FUNCTIONS(23, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO23 */
-       ALTERNATE_FUNCTIONS(24, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO24 */
-       /* GPIOSEL4 - bit 0-1 reserved */
-       ALTERNATE_FUNCTIONS(25, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO25 */
-       ALTERNATE_FUNCTIONS(26, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO26 */
-       ALTERNATE_FUNCTIONS(27,      2, UNUSED, UNUSED, 0, 0, 0), /* GPIO27, altA controlled by bit 2 */
-       ALTERNATE_FUNCTIONS(28,      3, UNUSED, UNUSED, 0, 0, 0), /* GPIO28, altA controlled by bit 3 */
-       ALTERNATE_FUNCTIONS(29,      4, UNUSED, UNUSED, 0, 0, 0), /* GPIO29, altA controlled by bit 4 */
-       ALTERNATE_FUNCTIONS(30,      5, UNUSED, UNUSED, 0, 0, 0), /* GPIO30, altA controlled by bit 5 */
-       ALTERNATE_FUNCTIONS(31,      6, UNUSED, UNUSED, 0, 0, 0), /* GPIO31, altA controlled by bit 6 */
-       ALTERNATE_FUNCTIONS(32,      7, UNUSED, UNUSED, 0, 0, 0), /* GPIO32, altA controlled by bit 7 */
-       /* GPIOSEL5 - bit 0-7 reserved */
-       ALTERNATE_FUNCTIONS(33, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO33 */
-       ALTERNATE_FUNCTIONS(34, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO34 */
-       ALTERNATE_FUNCTIONS(35, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO35 */
-       ALTERNATE_FUNCTIONS(36, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO36 */
-       ALTERNATE_FUNCTIONS(37, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO37 */
-       ALTERNATE_FUNCTIONS(38, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO38 */
-       ALTERNATE_FUNCTIONS(39, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO39 */
-       ALTERNATE_FUNCTIONS(40, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO40 */
-       /* GPIOSEL6 - bit 0 reserved */
-       ALTERNATE_FUNCTIONS(41, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO41 */
-       ALTERNATE_FUNCTIONS(42,      1, UNUSED, UNUSED, 0, 0, 0), /* GPIO42, altA controlled by bit 1 */
-       ALTERNATE_FUNCTIONS(43,      2, UNUSED, UNUSED, 0, 0, 0), /* GPIO43, altA controlled by bit 2 */
-       ALTERNATE_FUNCTIONS(44,      3, UNUSED, UNUSED, 0, 0, 0), /* GPIO44, altA controlled by bit 3 */
-       ALTERNATE_FUNCTIONS(45,      4, UNUSED, UNUSED, 0, 0, 0), /* GPIO45, altA controlled by bit 4 */
-       ALTERNATE_FUNCTIONS(46,      5, UNUSED, UNUSED, 0, 0, 0), /* GPIO46, altA controlled by bit 5 */
-       ALTERNATE_FUNCTIONS(47,      6, UNUSED, UNUSED, 0, 0, 0), /* GPIO47, altA controlled by bit 6 */
-       ALTERNATE_FUNCTIONS(48,      7, UNUSED, UNUSED, 0, 0, 0), /* GPIO48, altA controlled by bit 7 */
-       /* GPIOSEL7 - bit 0-1 reserved */
-       ALTERNATE_FUNCTIONS(49, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO49 */
-       ALTERNATE_FUNCTIONS(50, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO50 */
-       ALTERNATE_FUNCTIONS(51,      2, UNUSED, UNUSED, 0, 0, 0), /* GPIO51, altA controlled by bit 2 */
-       ALTERNATE_FUNCTIONS(52,      3, UNUSED, UNUSED, 0, 0, 0), /* GPIO52, altA controlled by bit 3 */
-       ALTERNATE_FUNCTIONS(53,      4, UNUSED, UNUSED, 0, 0, 0), /* GPIO53, altA controlled by bit 4 */
-       ALTERNATE_FUNCTIONS(54,      5, UNUSED, UNUSED, 0, 0, 0), /* GPIO54, altA controlled by bit 5 */
-       ALTERNATE_FUNCTIONS(55,      6, UNUSED, UNUSED, 0, 0, 0), /* GPIO55, altA controlled by bit 6 */
-       ALTERNATE_FUNCTIONS(56,      7, UNUSED, UNUSED, 0, 0, 0), /* GPIO56, altA controlled by bit 7 */
-};
-
-static struct pullud ab8540_pullud = {
-       .first_pin = 51,        /* GPIO1_VBAT */
-       .last_pin = 54,         /* GPIO4_VBAT */
-};
-
-/*
- * For AB8540 Only some GPIOs are interrupt capable:
- *     GPIO43 to GPIO44
- *     GPIO51 to GPIO54
- */
-static struct abx500_gpio_irq_cluster ab8540_gpio_irq_cluster[] = {
-       GPIO_IRQ_CLUSTER(43, 43, AB8540_INT_GPIO43F),
-       GPIO_IRQ_CLUSTER(44, 44, AB8540_INT_GPIO44F),
-       GPIO_IRQ_CLUSTER(51, 54, AB9540_INT_GPIO51R),
-};
-
-static struct abx500_pinctrl_soc_data ab8540_soc = {
-       .gpio_ranges = ab8540_pinranges,
-       .gpio_num_ranges = ARRAY_SIZE(ab8540_pinranges),
-       .pins = ab8540_pins,
-       .npins = ARRAY_SIZE(ab8540_pins),
-       .functions = ab8540_functions,
-       .nfunctions = ARRAY_SIZE(ab8540_functions),
-       .groups = ab8540_groups,
-       .ngroups = ARRAY_SIZE(ab8540_groups),
-       .alternate_functions = ab8540_alternate_functions,
-       .pullud = &ab8540_pullud,
-       .gpio_irq_cluster = ab8540_gpio_irq_cluster,
-       .ngpio_irq_cluster = ARRAY_SIZE(ab8540_gpio_irq_cluster),
-       .irq_gpio_rising_offset = AB8540_INT_GPIO43R,
-       .irq_gpio_falling_offset = AB8540_INT_GPIO43F,
-       .irq_gpio_factor = 2,
-};
-
-void
-abx500_pinctrl_ab8540_init(struct abx500_pinctrl_soc_data **soc)
-{
-       *soc = &ab8540_soc;
-}
diff --git a/drivers/pinctrl/pinctrl-ab9540.c b/drivers/pinctrl/pinctrl-ab9540.c
deleted file mode 100644 (file)
index 1a281ca..0000000
+++ /dev/null
@@ -1,486 +0,0 @@
-/*
- * Copyright (C) ST-Ericsson SA 2012
- *
- * Author: Patrice Chotard <patrice.chotard@stericsson.com> for ST-Ericsson.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#include <linux/kernel.h>
-#include <linux/gpio.h>
-#include <linux/pinctrl/pinctrl.h>
-#include <linux/mfd/abx500/ab8500.h>
-#include "pinctrl-abx500.h"
-
-/* All the pins that can be used for GPIO and some other functions */
-#define ABX500_GPIO(offset)            (offset)
-
-#define AB9540_PIN_R4          ABX500_GPIO(1)
-#define AB9540_PIN_V3          ABX500_GPIO(2)
-#define AB9540_PIN_T4          ABX500_GPIO(3)
-#define AB9540_PIN_T5          ABX500_GPIO(4)
-/* hole */
-#define AB9540_PIN_B18         ABX500_GPIO(10)
-#define AB9540_PIN_C18         ABX500_GPIO(11)
-/* hole */
-#define AB9540_PIN_D18         ABX500_GPIO(13)
-#define AB9540_PIN_B19         ABX500_GPIO(14)
-#define AB9540_PIN_C19         ABX500_GPIO(15)
-#define AB9540_PIN_D19         ABX500_GPIO(16)
-#define AB9540_PIN_R3          ABX500_GPIO(17)
-#define AB9540_PIN_T2          ABX500_GPIO(18)
-#define AB9540_PIN_U2          ABX500_GPIO(19)
-#define AB9540_PIN_V2          ABX500_GPIO(20)
-#define AB9540_PIN_N17         ABX500_GPIO(21)
-#define AB9540_PIN_N16         ABX500_GPIO(22)
-#define AB9540_PIN_M19         ABX500_GPIO(23)
-#define AB9540_PIN_T3          ABX500_GPIO(24)
-#define AB9540_PIN_W2          ABX500_GPIO(25)
-/* hole */
-#define AB9540_PIN_H4          ABX500_GPIO(27)
-#define AB9540_PIN_F1          ABX500_GPIO(28)
-#define AB9540_PIN_F4          ABX500_GPIO(29)
-#define AB9540_PIN_F2          ABX500_GPIO(30)
-#define AB9540_PIN_E4          ABX500_GPIO(31)
-#define AB9540_PIN_F3          ABX500_GPIO(32)
-/* hole */
-#define AB9540_PIN_J13         ABX500_GPIO(34)
-/* hole */
-#define AB9540_PIN_L17         ABX500_GPIO(40)
-#define AB9540_PIN_L16         ABX500_GPIO(41)
-#define AB9540_PIN_W3          ABX500_GPIO(42)
-#define AB9540_PIN_N4          ABX500_GPIO(50)
-#define AB9540_PIN_G12         ABX500_GPIO(51)
-#define AB9540_PIN_E17         ABX500_GPIO(52)
-#define AB9540_PIN_D11         ABX500_GPIO(53)
-#define AB9540_PIN_M18         ABX500_GPIO(54)
-
-/* indicates the highest GPIO number */
-#define AB9540_GPIO_MAX_NUMBER 54
-
-/*
- * The names of the pins are denoted by GPIO number and ball name, even
- * though they can be used for other things than GPIO, this is the first
- * column in the table of the data sheet and often used on schematics and
- * such.
- */
-static const struct pinctrl_pin_desc ab9540_pins[] = {
-       PINCTRL_PIN(AB9540_PIN_R4, "GPIO1_R4"),
-       PINCTRL_PIN(AB9540_PIN_V3, "GPIO2_V3"),
-       PINCTRL_PIN(AB9540_PIN_T4, "GPIO3_T4"),
-       PINCTRL_PIN(AB9540_PIN_T5, "GPIO4_T5"),
-       /* hole */
-       PINCTRL_PIN(AB9540_PIN_B18, "GPIO10_B18"),
-       PINCTRL_PIN(AB9540_PIN_C18, "GPIO11_C18"),
-       /* hole */
-       PINCTRL_PIN(AB9540_PIN_D18, "GPIO13_D18"),
-       PINCTRL_PIN(AB9540_PIN_B19, "GPIO14_B19"),
-       PINCTRL_PIN(AB9540_PIN_C19, "GPIO15_C19"),
-       PINCTRL_PIN(AB9540_PIN_D19, "GPIO16_D19"),
-       PINCTRL_PIN(AB9540_PIN_R3, "GPIO17_R3"),
-       PINCTRL_PIN(AB9540_PIN_T2, "GPIO18_T2"),
-       PINCTRL_PIN(AB9540_PIN_U2, "GPIO19_U2"),
-       PINCTRL_PIN(AB9540_PIN_V2, "GPIO20_V2"),
-       PINCTRL_PIN(AB9540_PIN_N17, "GPIO21_N17"),
-       PINCTRL_PIN(AB9540_PIN_N16, "GPIO22_N16"),
-       PINCTRL_PIN(AB9540_PIN_M19, "GPIO23_M19"),
-       PINCTRL_PIN(AB9540_PIN_T3, "GPIO24_T3"),
-       PINCTRL_PIN(AB9540_PIN_W2, "GPIO25_W2"),
-       /* hole */
-       PINCTRL_PIN(AB9540_PIN_H4, "GPIO27_H4"),
-       PINCTRL_PIN(AB9540_PIN_F1, "GPIO28_F1"),
-       PINCTRL_PIN(AB9540_PIN_F4, "GPIO29_F4"),
-       PINCTRL_PIN(AB9540_PIN_F2, "GPIO30_F2"),
-       PINCTRL_PIN(AB9540_PIN_E4, "GPIO31_E4"),
-       PINCTRL_PIN(AB9540_PIN_F3, "GPIO32_F3"),
-       /* hole */
-       PINCTRL_PIN(AB9540_PIN_J13, "GPIO34_J13"),
-       /* hole */
-       PINCTRL_PIN(AB9540_PIN_L17, "GPIO40_L17"),
-       PINCTRL_PIN(AB9540_PIN_L16, "GPIO41_L16"),
-       PINCTRL_PIN(AB9540_PIN_W3, "GPIO42_W3"),
-       PINCTRL_PIN(AB9540_PIN_N4, "GPIO50_N4"),
-       PINCTRL_PIN(AB9540_PIN_G12, "GPIO51_G12"),
-       PINCTRL_PIN(AB9540_PIN_E17, "GPIO52_E17"),
-       PINCTRL_PIN(AB9540_PIN_D11, "GPIO53_D11"),
-       PINCTRL_PIN(AB9540_PIN_M18, "GPIO60_M18"),
-};
-
-/*
- * Maps local GPIO offsets to local pin numbers
- */
-static const struct abx500_pinrange ab9540_pinranges[] = {
-       ABX500_PINRANGE(1, 4, ABX500_ALT_A),
-       ABX500_PINRANGE(10, 2, ABX500_DEFAULT),
-       ABX500_PINRANGE(13, 1, ABX500_DEFAULT),
-       ABX500_PINRANGE(14, 12, ABX500_ALT_A),
-       ABX500_PINRANGE(27, 6, ABX500_ALT_A),
-       ABX500_PINRANGE(34, 1, ABX500_ALT_A),
-       ABX500_PINRANGE(40, 3, ABX500_ALT_A),
-       ABX500_PINRANGE(50, 1, ABX500_DEFAULT),
-       ABX500_PINRANGE(51, 3, ABX500_ALT_A),
-       ABX500_PINRANGE(54, 1, ABX500_DEFAULT),
-};
-
-/*
- * Read the pin group names like this:
- * sysclkreq2_d_1 = first groups of pins for sysclkreq2 on default function
- *
- * The groups are arranged as sets per altfunction column, so we can
- * mux in one group at a time by selecting the same altfunction for them
- * all. When functions require pins on different altfunctions, you need
- * to combine several groups.
- */
-
-/* default column */
-static const unsigned sysclkreq2_d_1_pins[] = { AB9540_PIN_R4 };
-static const unsigned sysclkreq3_d_1_pins[] = { AB9540_PIN_V3 };
-static const unsigned sysclkreq4_d_1_pins[] = { AB9540_PIN_T4 };
-static const unsigned sysclkreq6_d_1_pins[] = { AB9540_PIN_T5 };
-static const unsigned gpio10_d_1_pins[] = { AB9540_PIN_B18 };
-static const unsigned gpio11_d_1_pins[] = { AB9540_PIN_C18 };
-static const unsigned gpio13_d_1_pins[] = { AB9540_PIN_D18 };
-static const unsigned pwmout1_d_1_pins[] = { AB9540_PIN_B19 };
-static const unsigned pwmout2_d_1_pins[] = { AB9540_PIN_C19 };
-static const unsigned pwmout3_d_1_pins[] = { AB9540_PIN_D19 };
-/* audio data interface 1*/
-static const unsigned adi1_d_1_pins[] = { AB9540_PIN_R3, AB9540_PIN_T2,
-                                       AB9540_PIN_U2, AB9540_PIN_V2 };
-/* USBUICC */
-static const unsigned usbuicc_d_1_pins[] = { AB9540_PIN_N17, AB9540_PIN_N16,
-                                       AB9540_PIN_M19 };
-static const unsigned sysclkreq7_d_1_pins[] = { AB9540_PIN_T3 };
-static const unsigned sysclkreq8_d_1_pins[] = { AB9540_PIN_W2 };
-/* Digital microphone 1 and 2 */
-static const unsigned dmic12_d_1_pins[] = { AB9540_PIN_H4, AB9540_PIN_F1 };
-/* Digital microphone 3 and 4 */
-static const unsigned dmic34_d_1_pins[] = { AB9540_PIN_F4, AB9540_PIN_F2 };
-/* Digital microphone 5 and 6 */
-static const unsigned dmic56_d_1_pins[] = { AB9540_PIN_E4, AB9540_PIN_F3 };
-static const unsigned extcpena_d_1_pins[] = { AB9540_PIN_J13 };
-/* modem SDA/SCL */
-static const unsigned modsclsda_d_1_pins[] = { AB9540_PIN_L17, AB9540_PIN_L16 };
-static const unsigned sysclkreq5_d_1_pins[] = { AB9540_PIN_W3 };
-static const unsigned gpio50_d_1_pins[] = { AB9540_PIN_N4 };
-static const unsigned batremn_d_1_pins[] = { AB9540_PIN_G12 };
-static const unsigned resethw_d_1_pins[] = { AB9540_PIN_E17 };
-static const unsigned service_d_1_pins[] = { AB9540_PIN_D11 };
-static const unsigned gpio60_d_1_pins[] = { AB9540_PIN_M18 };
-
-/* Altfunction A column */
-static const unsigned gpio1_a_1_pins[] = { AB9540_PIN_R4 };
-static const unsigned gpio2_a_1_pins[] = { AB9540_PIN_V3 };
-static const unsigned gpio3_a_1_pins[] = { AB9540_PIN_T4 };
-static const unsigned gpio4_a_1_pins[] = { AB9540_PIN_T5 };
-static const unsigned hiqclkena_a_1_pins[] = { AB9540_PIN_B18 };
-static const unsigned pdmclk_a_1_pins[] = { AB9540_PIN_C18 };
-static const unsigned uartdata_a_1_pins[] = { AB9540_PIN_D18, AB9540_PIN_N4 };
-static const unsigned gpio14_a_1_pins[] = { AB9540_PIN_B19 };
-static const unsigned gpio15_a_1_pins[] = { AB9540_PIN_C19 };
-static const unsigned gpio16_a_1_pins[] = { AB9540_PIN_D19 };
-static const unsigned gpio17_a_1_pins[] = { AB9540_PIN_R3 };
-static const unsigned gpio18_a_1_pins[] = { AB9540_PIN_T2 };
-static const unsigned gpio19_a_1_pins[] = { AB9540_PIN_U2 };
-static const unsigned gpio20_a_1_pins[] = { AB9540_PIN_V2 };
-static const unsigned gpio21_a_1_pins[] = { AB9540_PIN_N17 };
-static const unsigned gpio22_a_1_pins[] = { AB9540_PIN_N16 };
-static const unsigned gpio23_a_1_pins[] = { AB9540_PIN_M19 };
-static const unsigned gpio24_a_1_pins[] = { AB9540_PIN_T3 };
-static const unsigned gpio25_a_1_pins[] = { AB9540_PIN_W2 };
-static const unsigned gpio27_a_1_pins[] = { AB9540_PIN_H4 };
-static const unsigned gpio28_a_1_pins[] = { AB9540_PIN_F1 };
-static const unsigned gpio29_a_1_pins[] = { AB9540_PIN_F4 };
-static const unsigned gpio30_a_1_pins[] = { AB9540_PIN_F2 };
-static const unsigned gpio31_a_1_pins[] = { AB9540_PIN_E4 };
-static const unsigned gpio32_a_1_pins[] = { AB9540_PIN_F3 };
-static const unsigned gpio34_a_1_pins[] = { AB9540_PIN_J13 };
-static const unsigned gpio40_a_1_pins[] = { AB9540_PIN_L17 };
-static const unsigned gpio41_a_1_pins[] = { AB9540_PIN_L16 };
-static const unsigned gpio42_a_1_pins[] = { AB9540_PIN_W3 };
-static const unsigned gpio51_a_1_pins[] = { AB9540_PIN_G12 };
-static const unsigned gpio52_a_1_pins[] = { AB9540_PIN_E17 };
-static const unsigned gpio53_a_1_pins[] = { AB9540_PIN_D11 };
-static const unsigned usbuiccpd_a_1_pins[] = { AB9540_PIN_M18 };
-
-/* Altfunction B colum */
-static const unsigned pdmdata_b_1_pins[] = { AB9540_PIN_B18 };
-static const unsigned pwmextvibra1_b_1_pins[] = { AB9540_PIN_D18 };
-static const unsigned pwmextvibra2_b_1_pins[] = { AB9540_PIN_N4 };
-
-/* Altfunction C column */
-static const unsigned usbvdat_c_1_pins[] = { AB9540_PIN_D18 };
-
-#define AB9540_PIN_GROUP(a, b) { .name = #a, .pins = a##_pins,         \
-                       .npins = ARRAY_SIZE(a##_pins), .altsetting = b }
-
-static const struct abx500_pingroup ab9540_groups[] = {
-       /* default column */
-       AB9540_PIN_GROUP(sysclkreq2_d_1, ABX500_DEFAULT),
-       AB9540_PIN_GROUP(sysclkreq3_d_1, ABX500_DEFAULT),
-       AB9540_PIN_GROUP(sysclkreq4_d_1, ABX500_DEFAULT),
-       AB9540_PIN_GROUP(sysclkreq6_d_1, ABX500_DEFAULT),
-       AB9540_PIN_GROUP(gpio10_d_1, ABX500_DEFAULT),
-       AB9540_PIN_GROUP(gpio11_d_1, ABX500_DEFAULT),
-       AB9540_PIN_GROUP(gpio13_d_1, ABX500_DEFAULT),
-       AB9540_PIN_GROUP(pwmout1_d_1, ABX500_DEFAULT),
-       AB9540_PIN_GROUP(pwmout2_d_1, ABX500_DEFAULT),
-       AB9540_PIN_GROUP(pwmout3_d_1, ABX500_DEFAULT),
-       AB9540_PIN_GROUP(adi1_d_1, ABX500_DEFAULT),
-       AB9540_PIN_GROUP(usbuicc_d_1, ABX500_DEFAULT),
-       AB9540_PIN_GROUP(sysclkreq7_d_1, ABX500_DEFAULT),
-       AB9540_PIN_GROUP(sysclkreq8_d_1, ABX500_DEFAULT),
-       AB9540_PIN_GROUP(dmic12_d_1, ABX500_DEFAULT),
-       AB9540_PIN_GROUP(dmic34_d_1, ABX500_DEFAULT),
-       AB9540_PIN_GROUP(dmic56_d_1, ABX500_DEFAULT),
-       AB9540_PIN_GROUP(extcpena_d_1, ABX500_DEFAULT),
-       AB9540_PIN_GROUP(modsclsda_d_1, ABX500_DEFAULT),
-       AB9540_PIN_GROUP(sysclkreq5_d_1, ABX500_DEFAULT),
-       AB9540_PIN_GROUP(gpio50_d_1, ABX500_DEFAULT),
-       AB9540_PIN_GROUP(batremn_d_1, ABX500_DEFAULT),
-       AB9540_PIN_GROUP(resethw_d_1, ABX500_DEFAULT),
-       AB9540_PIN_GROUP(service_d_1, ABX500_DEFAULT),
-       AB9540_PIN_GROUP(gpio60_d_1, ABX500_DEFAULT),
-
-       /* Altfunction A column */
-       AB9540_PIN_GROUP(gpio1_a_1, ABX500_ALT_A),
-       AB9540_PIN_GROUP(gpio2_a_1, ABX500_ALT_A),
-       AB9540_PIN_GROUP(gpio3_a_1, ABX500_ALT_A),
-       AB9540_PIN_GROUP(gpio4_a_1, ABX500_ALT_A),
-       AB9540_PIN_GROUP(hiqclkena_a_1, ABX500_ALT_A),
-       AB9540_PIN_GROUP(pdmclk_a_1, ABX500_ALT_A),
-       AB9540_PIN_GROUP(uartdata_a_1, ABX500_ALT_A),
-       AB9540_PIN_GROUP(gpio14_a_1, ABX500_ALT_A),
-       AB9540_PIN_GROUP(gpio15_a_1, ABX500_ALT_A),
-       AB9540_PIN_GROUP(gpio16_a_1, ABX500_ALT_A),
-       AB9540_PIN_GROUP(gpio17_a_1, ABX500_ALT_A),
-       AB9540_PIN_GROUP(gpio18_a_1, ABX500_ALT_A),
-       AB9540_PIN_GROUP(gpio19_a_1, ABX500_ALT_A),
-       AB9540_PIN_GROUP(gpio20_a_1, ABX500_ALT_A),
-       AB9540_PIN_GROUP(gpio21_a_1, ABX500_ALT_A),
-       AB9540_PIN_GROUP(gpio22_a_1, ABX500_ALT_A),
-       AB9540_PIN_GROUP(gpio23_a_1, ABX500_ALT_A),
-       AB9540_PIN_GROUP(gpio24_a_1, ABX500_ALT_A),
-       AB9540_PIN_GROUP(gpio25_a_1, ABX500_ALT_A),
-       AB9540_PIN_GROUP(gpio27_a_1, ABX500_ALT_A),
-       AB9540_PIN_GROUP(gpio28_a_1, ABX500_ALT_A),
-       AB9540_PIN_GROUP(gpio29_a_1, ABX500_ALT_A),
-       AB9540_PIN_GROUP(gpio30_a_1, ABX500_ALT_A),
-       AB9540_PIN_GROUP(gpio31_a_1, ABX500_ALT_A),
-       AB9540_PIN_GROUP(gpio32_a_1, ABX500_ALT_A),
-       AB9540_PIN_GROUP(gpio34_a_1, ABX500_ALT_A),
-       AB9540_PIN_GROUP(gpio40_a_1, ABX500_ALT_A),
-       AB9540_PIN_GROUP(gpio41_a_1, ABX500_ALT_A),
-       AB9540_PIN_GROUP(gpio42_a_1, ABX500_ALT_A),
-       AB9540_PIN_GROUP(gpio51_a_1, ABX500_ALT_A),
-       AB9540_PIN_GROUP(gpio52_a_1, ABX500_ALT_A),
-       AB9540_PIN_GROUP(gpio53_a_1, ABX500_ALT_A),
-       AB9540_PIN_GROUP(usbuiccpd_a_1, ABX500_ALT_A),
-
-       /* Altfunction B column */
-       AB9540_PIN_GROUP(pdmdata_b_1, ABX500_ALT_B),
-       AB9540_PIN_GROUP(pwmextvibra1_b_1, ABX500_ALT_B),
-       AB9540_PIN_GROUP(pwmextvibra2_b_1, ABX500_ALT_B),
-
-       /* Altfunction C column */
-       AB9540_PIN_GROUP(usbvdat_c_1, ABX500_ALT_C),
-};
-
-/* We use this macro to define the groups applicable to a function */
-#define AB9540_FUNC_GROUPS(a, b...)       \
-static const char * const a##_groups[] = { b };
-
-AB9540_FUNC_GROUPS(sysclkreq, "sysclkreq2_d_1", "sysclkreq3_d_1",
-               "sysclkreq4_d_1", "sysclkreq5_d_1", "sysclkreq6_d_1",
-               "sysclkreq7_d_1", "sysclkreq8_d_1");
-AB9540_FUNC_GROUPS(gpio, "gpio1_a_1", "gpio2_a_1", "gpio3_a_1", "gpio4_a_1",
-               "gpio10_d_1", "gpio11_d_1", "gpio13_d_1", "gpio14_a_1",
-               "gpio15_a_1", "gpio16_a_1", "gpio17_a_1", "gpio18_a_1",
-               "gpio19_a_1", "gpio20_a_1", "gpio21_a_1", "gpio22_a_1",
-               "gpio23_a_1", "gpio24_a_1", "gpio25_a_1", "gpio27_a_1",
-               "gpio28_a_1", "gpio29_a_1", "gpio30_a_1", "gpio31_a_1",
-               "gpio32_a_1", "gpio34_a_1", "gpio40_a_1", "gpio41_a_1",
-               "gpio42_a_1", "gpio50_d_1", "gpio51_a_1", "gpio52_a_1",
-               "gpio53_a_1", "gpio60_d_1");
-AB9540_FUNC_GROUPS(pwmout, "pwmout1_d_1", "pwmout2_d_1", "pwmout3_d_1");
-AB9540_FUNC_GROUPS(adi1, "adi1_d_1");
-AB9540_FUNC_GROUPS(usbuicc, "usbuicc_d_1", "usbuiccpd_a_1");
-AB9540_FUNC_GROUPS(dmic, "dmic12_d_1", "dmic34_d_1", "dmic56_d_1");
-AB9540_FUNC_GROUPS(extcpena, "extcpena_d_1");
-AB9540_FUNC_GROUPS(modsclsda, "modsclsda_d_1");
-AB9540_FUNC_GROUPS(batremn, "batremn_d_1");
-AB9540_FUNC_GROUPS(resethw, "resethw_d_1");
-AB9540_FUNC_GROUPS(service, "service_d_1");
-AB9540_FUNC_GROUPS(hiqclkena, "hiqclkena_a_1");
-AB9540_FUNC_GROUPS(pdm, "pdmdata_b_1", "pdmclk_a_1");
-AB9540_FUNC_GROUPS(uartdata, "uartdata_a_1");
-AB9540_FUNC_GROUPS(pwmextvibra, "pwmextvibra1_b_1", "pwmextvibra2_b_1");
-AB9540_FUNC_GROUPS(usbvdat, "usbvdat_c_1");
-
-#define FUNCTION(fname)                                        \
-       {                                               \
-               .name = #fname,                         \
-               .groups = fname##_groups,               \
-               .ngroups = ARRAY_SIZE(fname##_groups),  \
-       }
-
-static const struct abx500_function ab9540_functions[] = {
-       FUNCTION(sysclkreq),
-       FUNCTION(gpio),
-       FUNCTION(pwmout),
-       FUNCTION(adi1),
-       FUNCTION(usbuicc),
-       FUNCTION(dmic),
-       FUNCTION(extcpena),
-       FUNCTION(modsclsda),
-       FUNCTION(batremn),
-       FUNCTION(resethw),
-       FUNCTION(service),
-       FUNCTION(hiqclkena),
-       FUNCTION(pdm),
-       FUNCTION(uartdata),
-       FUNCTION(pwmextvibra),
-       FUNCTION(usbvdat),
-};
-
-/*
- * this table translates what's is in the AB9540 specification regarding the
- * balls alternate functions (as for DB, default, ALT_A, ALT_B and ALT_C).
- * ALTERNATE_FUNCTIONS(GPIO_NUMBER, GPIOSEL bit, ALTERNATFUNC bit1,
- * ALTERNATEFUNC bit2, ALTA val, ALTB val, ALTC val),
- *
- * example :
- *
- *     ALTERNATE_FUNCTIONS(13,     4,      3,      4, 1, 0, 2),
- *     means that pin AB9540_PIN_D18 (pin 13) supports 4 mux (default/ALT_A,
- *     ALT_B and ALT_C), so GPIOSEL and ALTERNATFUNC registers are used to
- *     select the mux. ALTA, ALTB and ALTC val indicates values to write in
- *     ALTERNATFUNC register. We need to specifies these values as SOC
- *     designers didn't apply the same logic on how to select mux in the
- *     ABx500 family.
- *
- *     As this pins supports at least ALT_B mux, default mux is
- *     selected by writing 1 in GPIOSEL bit :
- *
- *             | GPIOSEL bit=4 | alternatfunc bit2=4 | alternatfunc bit1=3
- *     default |       1       |          0          |          0
- *     alt_A   |       0       |          0          |          1
- *     alt_B   |       0       |          0          |          0
- *     alt_C   |       0       |          1          |          0
- *
- *     ALTERNATE_FUNCTIONS(1,      0, UNUSED, UNUSED),
- *     means that pin AB9540_PIN_R4 (pin 1) supports 2 mux, so only GPIOSEL
- *     register is used to select the mux. As this pins doesn't support at
- *     least ALT_B mux, default mux is by writing 0 in GPIOSEL bit :
- *
- *             | GPIOSEL bit=0 | alternatfunc bit2=  | alternatfunc bit1=
- *     default |       0       |          0          |          0
- *     alt_A   |       1       |          0          |          0
- */
-
-static struct
-alternate_functions ab9540alternate_functions[AB9540_GPIO_MAX_NUMBER + 1] = {
-       /* GPIOSEL1 - bits 4-7 are reserved */
-       ALTERNATE_FUNCTIONS(0, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO0 */
-       ALTERNATE_FUNCTIONS(1,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO1, altA controlled by bit 0 */
-       ALTERNATE_FUNCTIONS(2,      1, UNUSED, UNUSED, 0, 0, 0), /* GPIO2, altA controlled by bit 1 */
-       ALTERNATE_FUNCTIONS(3,      2, UNUSED, UNUSED, 0, 0, 0), /* GPIO3, altA controlled by bit 2*/
-       ALTERNATE_FUNCTIONS(4,      3, UNUSED, UNUSED, 0, 0, 0), /* GPIO4, altA controlled by bit 3*/
-       ALTERNATE_FUNCTIONS(5, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO5 */
-       ALTERNATE_FUNCTIONS(6, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO6 */
-       ALTERNATE_FUNCTIONS(7, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO7 */
-       ALTERNATE_FUNCTIONS(8, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO8 */
-       /* GPIOSEL2 - bits 0 and 3 are reserved */
-       ALTERNATE_FUNCTIONS(9, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO9 */
-       ALTERNATE_FUNCTIONS(10,      1,      0, UNUSED, 1, 0, 0), /* GPIO10, altA and altB controlled by bit 0 */
-       ALTERNATE_FUNCTIONS(11,      2,      1, UNUSED, 0, 0, 0), /* GPIO11, altA controlled by bit 1 */
-       ALTERNATE_FUNCTIONS(12, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO12 */
-       ALTERNATE_FUNCTIONS(13,      4,      3,      4, 1, 0, 2), /* GPIO13, altA altB and altC controlled by bit 3 and 4 */
-       ALTERNATE_FUNCTIONS(14,      5, UNUSED, UNUSED, 0, 0, 0), /* GPIO14, altA controlled by bit 5 */
-       ALTERNATE_FUNCTIONS(15,      6, UNUSED, UNUSED, 0, 0, 0), /* GPIO15, altA controlled by bit 6 */
-       ALTERNATE_FUNCTIONS(16,      7, UNUSED, UNUSED, 0, 0, 0), /* GPIO16, altA controlled by bit 7 */
-       /* GPIOSEL3 - bit 1-3 reserved
-        * pins 17 to 20 are special case, only bit 0 is used to select
-        * alternate function for these 4 pins.
-        * bits 1 to 3 are reserved
-        */
-       ALTERNATE_FUNCTIONS(17,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO17, altA controlled by bit 0 */
-       ALTERNATE_FUNCTIONS(18,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO18, altA controlled by bit 0 */
-       ALTERNATE_FUNCTIONS(19,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO19, altA controlled by bit 0 */
-       ALTERNATE_FUNCTIONS(20,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO20, altA controlled by bit 0 */
-       ALTERNATE_FUNCTIONS(21,      4, UNUSED, UNUSED, 0, 0, 0), /* GPIO21, altA controlled by bit 4 */
-       ALTERNATE_FUNCTIONS(22,      5, UNUSED, UNUSED, 0, 0, 0), /* GPIO22, altA controlled by bit 5 */
-       ALTERNATE_FUNCTIONS(23,      6, UNUSED, UNUSED, 0, 0, 0), /* GPIO23, altA controlled by bit 6 */
-       ALTERNATE_FUNCTIONS(24,      7, UNUSED, UNUSED, 0, 0, 0), /* GPIO24, altA controlled by bit 7 */
-       /* GPIOSEL4 - bit 1 reserved */
-       ALTERNATE_FUNCTIONS(25,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO25, altA controlled by bit 0 */
-       ALTERNATE_FUNCTIONS(26, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO26 */
-       ALTERNATE_FUNCTIONS(27,      2, UNUSED, UNUSED, 0, 0, 0), /* GPIO27, altA controlled by bit 2 */
-       ALTERNATE_FUNCTIONS(28,      3, UNUSED, UNUSED, 0, 0, 0), /* GPIO28, altA controlled by bit 3 */
-       ALTERNATE_FUNCTIONS(29,      4, UNUSED, UNUSED, 0, 0, 0), /* GPIO29, altA controlled by bit 4 */
-       ALTERNATE_FUNCTIONS(30,      5, UNUSED, UNUSED, 0, 0, 0), /* GPIO30, altA controlled by bit 5 */
-       ALTERNATE_FUNCTIONS(31,      6, UNUSED, UNUSED, 0, 0, 0), /* GPIO31, altA controlled by bit 6 */
-       ALTERNATE_FUNCTIONS(32,      7, UNUSED, UNUSED, 0, 0, 0), /* GPIO32, altA controlled by bit 7 */
-       /* GPIOSEL5 - bit 0, 2-6 are reserved */
-       ALTERNATE_FUNCTIONS(33, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO33 */
-       ALTERNATE_FUNCTIONS(34,      1, UNUSED, UNUSED, 0, 0, 0), /* GPIO34, altA controlled by bit 1 */
-       ALTERNATE_FUNCTIONS(35, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO35 */
-       ALTERNATE_FUNCTIONS(36, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO36 */
-       ALTERNATE_FUNCTIONS(37, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO37 */
-       ALTERNATE_FUNCTIONS(38, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO38 */
-       ALTERNATE_FUNCTIONS(39, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO39 */
-       ALTERNATE_FUNCTIONS(40,      7, UNUSED, UNUSED, 0, 0, 0), /* GPIO40, altA controlled by bit 7 */
-       /* GPIOSEL6 - bit 2-7 are reserved */
-       ALTERNATE_FUNCTIONS(41,      0, UNUSED, UNUSED, 0, 0, 0), /* GPIO41, altA controlled by bit 0 */
-       ALTERNATE_FUNCTIONS(42,      1, UNUSED, UNUSED, 0, 0, 0), /* GPIO42, altA controlled by bit 1 */
-       ALTERNATE_FUNCTIONS(43, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO43 */
-       ALTERNATE_FUNCTIONS(44, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO44 */
-       ALTERNATE_FUNCTIONS(45, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO45 */
-       ALTERNATE_FUNCTIONS(46, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO46 */
-       ALTERNATE_FUNCTIONS(47, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO47 */
-       ALTERNATE_FUNCTIONS(48, UNUSED, UNUSED, UNUSED, 0, 0, 0), /* no GPIO48 */
-       /*
-        * GPIOSEL7 - bit 0 and 6-7 are reserved
-        * special case with GPIO60, wich is located at offset 5 of gpiosel7
-        * don't know why it has been called GPIO60 in AB9540 datasheet,
-        * GPIO54 would be logical..., so at SOC point of view we consider
-        * GPIO60 = GPIO54
-        */
-       ALTERNATE_FUNCTIONS(49,      0, UNUSED, UNUSED, 0, 0, 0), /* no GPIO49 */
-       ALTERNATE_FUNCTIONS(50,      1,      2, UNUSED, 1, 0, 0), /* GPIO50, altA and altB controlled by bit 1 */
-       ALTERNATE_FUNCTIONS(51,      2, UNUSED, UNUSED, 0, 0, 0), /* GPIO51, altA controlled by bit 2 */
-       ALTERNATE_FUNCTIONS(52,      3, UNUSED, UNUSED, 0, 0, 0), /* GPIO52, altA controlled by bit 3 */
-       ALTERNATE_FUNCTIONS(53,      4, UNUSED, UNUSED, 0, 0, 0), /* GPIO53, altA controlled by bit 4 */
-       ALTERNATE_FUNCTIONS(54,      5, UNUSED, UNUSED, 0, 0, 0), /* GPIO54 = GPIO60, altA controlled by bit 5 */
-};
-
-static struct abx500_gpio_irq_cluster ab9540_gpio_irq_cluster[] = {
-       GPIO_IRQ_CLUSTER(10, 13, AB8500_INT_GPIO10R),
-       GPIO_IRQ_CLUSTER(24, 25, AB8500_INT_GPIO24R),
-       GPIO_IRQ_CLUSTER(40, 41, AB8500_INT_GPIO40R),
-       GPIO_IRQ_CLUSTER(50, 54, AB9540_INT_GPIO50R),
-};
-
-static struct abx500_pinctrl_soc_data ab9540_soc = {
-       .gpio_ranges = ab9540_pinranges,
-       .gpio_num_ranges = ARRAY_SIZE(ab9540_pinranges),
-       .pins = ab9540_pins,
-       .npins = ARRAY_SIZE(ab9540_pins),
-       .functions = ab9540_functions,
-       .nfunctions = ARRAY_SIZE(ab9540_functions),
-       .groups = ab9540_groups,
-       .ngroups = ARRAY_SIZE(ab9540_groups),
-       .alternate_functions = ab9540alternate_functions,
-       .gpio_irq_cluster = ab9540_gpio_irq_cluster,
-       .ngpio_irq_cluster = ARRAY_SIZE(ab9540_gpio_irq_cluster),
-       .irq_gpio_rising_offset = AB8500_INT_GPIO6R,
-       .irq_gpio_falling_offset = AB8500_INT_GPIO6F,
-       .irq_gpio_factor = 1,
-};
-
-void
-abx500_pinctrl_ab9540_init(struct abx500_pinctrl_soc_data **soc)
-{
-       *soc = &ab9540_soc;
-}
diff --git a/drivers/pinctrl/pinctrl-abx500.c b/drivers/pinctrl/pinctrl-abx500.c
deleted file mode 100644 (file)
index 163da9c..0000000
+++ /dev/null
@@ -1,1361 +0,0 @@
-/*
- * Copyright (C) ST-Ericsson SA 2013
- *
- * Author: Patrice Chotard <patrice.chotard@st.com>
- * License terms: GNU General Public License (GPL) version 2
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/slab.h>
-#include <linux/init.h>
-#include <linux/module.h>
-#include <linux/err.h>
-#include <linux/of.h>
-#include <linux/of_device.h>
-#include <linux/platform_device.h>
-#include <linux/gpio.h>
-#include <linux/irq.h>
-#include <linux/irqdomain.h>
-#include <linux/interrupt.h>
-#include <linux/bitops.h>
-#include <linux/mfd/abx500.h>
-#include <linux/mfd/abx500/ab8500.h>
-#include <linux/pinctrl/pinctrl.h>
-#include <linux/pinctrl/consumer.h>
-#include <linux/pinctrl/pinmux.h>
-#include <linux/pinctrl/pinconf.h>
-#include <linux/pinctrl/pinconf-generic.h>
-#include <linux/pinctrl/machine.h>
-
-#include "pinctrl-abx500.h"
-#include "core.h"
-#include "pinconf.h"
-
-/*
- * The AB9540 and AB8540 GPIO support are extended versions
- * of the AB8500 GPIO support.
- * The AB9540 supports an additional (7th) register so that
- * more GPIO may be configured and used.
- * The AB8540 supports 4 new gpios (GPIOx_VBAT) that have
- * internal pull-up and pull-down capabilities.
- */
-
-/*
- * GPIO registers offset
- * Bank: 0x10
- */
-#define AB8500_GPIO_SEL1_REG   0x00
-#define AB8500_GPIO_SEL2_REG   0x01
-#define AB8500_GPIO_SEL3_REG   0x02
-#define AB8500_GPIO_SEL4_REG   0x03
-#define AB8500_GPIO_SEL5_REG   0x04
-#define AB8500_GPIO_SEL6_REG   0x05
-#define AB9540_GPIO_SEL7_REG   0x06
-
-#define AB8500_GPIO_DIR1_REG   0x10
-#define AB8500_GPIO_DIR2_REG   0x11
-#define AB8500_GPIO_DIR3_REG   0x12
-#define AB8500_GPIO_DIR4_REG   0x13
-#define AB8500_GPIO_DIR5_REG   0x14
-#define AB8500_GPIO_DIR6_REG   0x15
-#define AB9540_GPIO_DIR7_REG   0x16
-
-#define AB8500_GPIO_OUT1_REG   0x20
-#define AB8500_GPIO_OUT2_REG   0x21
-#define AB8500_GPIO_OUT3_REG   0x22
-#define AB8500_GPIO_OUT4_REG   0x23
-#define AB8500_GPIO_OUT5_REG   0x24
-#define AB8500_GPIO_OUT6_REG   0x25
-#define AB9540_GPIO_OUT7_REG   0x26
-
-#define AB8500_GPIO_PUD1_REG   0x30
-#define AB8500_GPIO_PUD2_REG   0x31
-#define AB8500_GPIO_PUD3_REG   0x32
-#define AB8500_GPIO_PUD4_REG   0x33
-#define AB8500_GPIO_PUD5_REG   0x34
-#define AB8500_GPIO_PUD6_REG   0x35
-#define AB9540_GPIO_PUD7_REG   0x36
-
-#define AB8500_GPIO_IN1_REG    0x40
-#define AB8500_GPIO_IN2_REG    0x41
-#define AB8500_GPIO_IN3_REG    0x42
-#define AB8500_GPIO_IN4_REG    0x43
-#define AB8500_GPIO_IN5_REG    0x44
-#define AB8500_GPIO_IN6_REG    0x45
-#define AB9540_GPIO_IN7_REG    0x46
-#define AB8540_GPIO_VINSEL_REG 0x47
-#define AB8540_GPIO_PULL_UPDOWN_REG    0x48
-#define AB8500_GPIO_ALTFUN_REG 0x50
-#define AB8540_GPIO_PULL_UPDOWN_MASK   0x03
-#define AB8540_GPIO_VINSEL_MASK        0x03
-#define AB8540_GPIOX_VBAT_START        51
-#define AB8540_GPIOX_VBAT_END  54
-
-#define ABX500_GPIO_INPUT      0
-#define ABX500_GPIO_OUTPUT     1
-
-struct abx500_pinctrl {
-       struct device *dev;
-       struct pinctrl_dev *pctldev;
-       struct abx500_pinctrl_soc_data *soc;
-       struct gpio_chip chip;
-       struct ab8500 *parent;
-       struct abx500_gpio_irq_cluster *irq_cluster;
-       int irq_cluster_size;
-};
-
-/**
- * to_abx500_pinctrl() - get the pointer to abx500_pinctrl
- * @chip:      Member of the structure abx500_pinctrl
- */
-static inline struct abx500_pinctrl *to_abx500_pinctrl(struct gpio_chip *chip)
-{
-       return container_of(chip, struct abx500_pinctrl, chip);
-}
-
-static int abx500_gpio_get_bit(struct gpio_chip *chip, u8 reg,
-                              unsigned offset, bool *bit)
-{
-       struct abx500_pinctrl *pct = to_abx500_pinctrl(chip);
-       u8 pos = offset % 8;
-       u8 val;
-       int ret;
-
-       reg += offset / 8;
-       ret = abx500_get_register_interruptible(pct->dev,
-                                               AB8500_MISC, reg, &val);
-
-       *bit = !!(val & BIT(pos));
-
-       if (ret < 0)
-               dev_err(pct->dev,
-                       "%s read reg =%x, offset=%x failed (%d)\n",
-                       __func__, reg, offset, ret);
-
-       return ret;
-}
-
-static int abx500_gpio_set_bits(struct gpio_chip *chip, u8 reg,
-                               unsigned offset, int val)
-{
-       struct abx500_pinctrl *pct = to_abx500_pinctrl(chip);
-       u8 pos = offset % 8;
-       int ret;
-
-       reg += offset / 8;
-       ret = abx500_mask_and_set_register_interruptible(pct->dev,
-                               AB8500_MISC, reg, BIT(pos), val << pos);
-       if (ret < 0)
-               dev_err(pct->dev, "%s write reg, %x offset %x failed (%d)\n",
-                               __func__, reg, offset, ret);
-
-       return ret;
-}
-
-/**
- * abx500_gpio_get() - Get the particular GPIO value
- * @chip:      Gpio device
- * @offset:    GPIO number to read
- */
-static int abx500_gpio_get(struct gpio_chip *chip, unsigned offset)
-{
-       struct abx500_pinctrl *pct = to_abx500_pinctrl(chip);
-       bool bit;
-       bool is_out;
-       u8 gpio_offset = offset - 1;
-       int ret;
-
-       ret = abx500_gpio_get_bit(chip, AB8500_GPIO_DIR1_REG,
-                       gpio_offset, &is_out);
-       if (ret < 0)
-               goto out;
-
-       if (is_out)
-               ret = abx500_gpio_get_bit(chip, AB8500_GPIO_OUT1_REG,
-                               gpio_offset, &bit);
-       else
-               ret = abx500_gpio_get_bit(chip, AB8500_GPIO_IN1_REG,
-                               gpio_offset, &bit);
-out:
-       if (ret < 0) {
-               dev_err(pct->dev, "%s failed (%d)\n", __func__, ret);
-               return ret;
-       }
-
-       return bit;
-}
-
-static void abx500_gpio_set(struct gpio_chip *chip, unsigned offset, int val)
-{
-       struct abx500_pinctrl *pct = to_abx500_pinctrl(chip);
-       int ret;
-
-       ret = abx500_gpio_set_bits(chip, AB8500_GPIO_OUT1_REG, offset, val);
-       if (ret < 0)
-               dev_err(pct->dev, "%s write failed (%d)\n", __func__, ret);
-}
-
-static int abx500_get_pull_updown(struct abx500_pinctrl *pct, int offset,
-                                 enum abx500_gpio_pull_updown *pull_updown)
-{
-       u8 pos;
-       u8 val;
-       int ret;
-       struct pullud *pullud;
-
-       if (!pct->soc->pullud) {
-               dev_err(pct->dev, "%s AB chip doesn't support pull up/down feature",
-                               __func__);
-               ret = -EPERM;
-               goto out;
-       }
-
-       pullud = pct->soc->pullud;
-
-       if ((offset < pullud->first_pin)
-               || (offset > pullud->last_pin)) {
-               ret = -EINVAL;
-               goto out;
-       }
-
-       ret = abx500_get_register_interruptible(pct->dev,
-                       AB8500_MISC, AB8540_GPIO_PULL_UPDOWN_REG, &val);
-
-       pos = (offset - pullud->first_pin) << 1;
-       *pull_updown = (val >> pos) & AB8540_GPIO_PULL_UPDOWN_MASK;
-
-out:
-       if (ret < 0)
-               dev_err(pct->dev, "%s failed (%d)\n", __func__, ret);
-
-       return ret;
-}
-
-static int abx500_set_pull_updown(struct abx500_pinctrl *pct,
-                                 int offset, enum abx500_gpio_pull_updown val)
-{
-       u8 pos;
-       int ret;
-       struct pullud *pullud;
-
-       if (!pct->soc->pullud) {
-               dev_err(pct->dev, "%s AB chip doesn't support pull up/down feature",
-                               __func__);
-               ret = -EPERM;
-               goto out;
-       }
-
-       pullud = pct->soc->pullud;
-
-       if ((offset < pullud->first_pin)
-               || (offset > pullud->last_pin)) {
-               ret = -EINVAL;
-               goto out;
-       }
-       pos = (offset - pullud->first_pin) << 1;
-
-       ret = abx500_mask_and_set_register_interruptible(pct->dev,
-                       AB8500_MISC, AB8540_GPIO_PULL_UPDOWN_REG,
-                       AB8540_GPIO_PULL_UPDOWN_MASK << pos, val << pos);
-
-out:
-       if (ret < 0)
-               dev_err(pct->dev, "%s failed (%d)\n", __func__, ret);
-
-       return ret;
-}
-
-static bool abx500_pullud_supported(struct gpio_chip *chip, unsigned gpio)
-{
-       struct abx500_pinctrl *pct = to_abx500_pinctrl(chip);
-       struct pullud *pullud = pct->soc->pullud;
-
-       return (pullud &&
-               gpio >= pullud->first_pin &&
-               gpio <= pullud->last_pin);
-}
-
-static int abx500_gpio_direction_output(struct gpio_chip *chip,
-                                       unsigned offset,
-                                       int val)
-{
-       struct abx500_pinctrl *pct = to_abx500_pinctrl(chip);
-       unsigned gpio;
-       int ret;
-
-       /* set direction as output */
-       ret = abx500_gpio_set_bits(chip,
-                               AB8500_GPIO_DIR1_REG,
-                               offset,
-                               ABX500_GPIO_OUTPUT);
-       if (ret < 0)
-               goto out;
-
-       /* disable pull down */
-       ret = abx500_gpio_set_bits(chip,
-                               AB8500_GPIO_PUD1_REG,
-                               offset,
-                               ABX500_GPIO_PULL_NONE);
-       if (ret < 0)
-               goto out;
-
-       /* if supported, disable both pull down and pull up */
-       gpio = offset + 1;
-       if (abx500_pullud_supported(chip, gpio)) {
-               ret = abx500_set_pull_updown(pct,
-                               gpio,
-                               ABX500_GPIO_PULL_NONE);
-       }
-out:
-       if (ret < 0) {
-               dev_err(pct->dev, "%s failed (%d)\n", __func__, ret);
-               return ret;
-       }
-
-       /* set the output as 1 or 0 */
-       return abx500_gpio_set_bits(chip, AB8500_GPIO_OUT1_REG, offset, val);
-}
-
-static int abx500_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
-{
-       /* set the register as input */
-       return abx500_gpio_set_bits(chip,
-                               AB8500_GPIO_DIR1_REG,
-                               offset,
-                               ABX500_GPIO_INPUT);
-}
-
-static int abx500_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
-{
-       struct abx500_pinctrl *pct = to_abx500_pinctrl(chip);
-       /* The AB8500 GPIO numbers are off by one */
-       int gpio = offset + 1;
-       int hwirq;
-       int i;
-
-       for (i = 0; i < pct->irq_cluster_size; i++) {
-               struct abx500_gpio_irq_cluster *cluster =
-                       &pct->irq_cluster[i];
-
-               if (gpio >= cluster->start && gpio <= cluster->end) {
-                       /*
-                        * The ABx500 GPIO's associated IRQs are clustered together
-                        * throughout the interrupt numbers at irregular intervals.
-                        * To solve this quandry, we have placed the read-in values
-                        * into the cluster information table.
-                        */
-                       hwirq = gpio - cluster->start + cluster->to_irq;
-                       return irq_create_mapping(pct->parent->domain, hwirq);
-               }
-       }
-
-       return -EINVAL;
-}
-
-static int abx500_set_mode(struct pinctrl_dev *pctldev, struct gpio_chip *chip,
-                          unsigned gpio, int alt_setting)
-{
-       struct abx500_pinctrl *pct = pinctrl_dev_get_drvdata(pctldev);
-       struct alternate_functions af = pct->soc->alternate_functions[gpio];
-       int ret;
-       int val;
-       unsigned offset;
-
-       const char *modes[] = {
-               [ABX500_DEFAULT]        = "default",
-               [ABX500_ALT_A]          = "altA",
-               [ABX500_ALT_B]          = "altB",
-               [ABX500_ALT_C]          = "altC",
-       };
-
-       /* sanity check */
-       if (((alt_setting == ABX500_ALT_A) && (af.gpiosel_bit == UNUSED)) ||
-           ((alt_setting == ABX500_ALT_B) && (af.alt_bit1 == UNUSED)) ||
-           ((alt_setting == ABX500_ALT_C) && (af.alt_bit2 == UNUSED))) {
-               dev_dbg(pct->dev, "pin %d doesn't support %s mode\n", gpio,
-                               modes[alt_setting]);
-               return -EINVAL;
-       }
-
-       /* on ABx5xx, there is no GPIO0, so adjust the offset */
-       offset = gpio - 1;
-
-       switch (alt_setting) {
-       case ABX500_DEFAULT:
-               /*
-                * for ABx5xx family, default mode is always selected by
-                * writing 0 to GPIOSELx register, except for pins which
-                * support at least ALT_B mode, default mode is selected
-                * by writing 1 to GPIOSELx register
-                */
-               val = 0;
-               if (af.alt_bit1 != UNUSED)
-                       val++;
-
-               ret = abx500_gpio_set_bits(chip, AB8500_GPIO_SEL1_REG,
-                                          offset, val);
-               break;
-
-       case ABX500_ALT_A:
-               /*
-                * for ABx5xx family, alt_a mode is always selected by
-                * writing 1 to GPIOSELx register, except for pins which
-                * support at least ALT_B mode, alt_a mode is selected
-                * by writing 0 to GPIOSELx register and 0 in ALTFUNC
-                * register
-                */
-               if (af.alt_bit1 != UNUSED) {
-                       ret = abx500_gpio_set_bits(chip, AB8500_GPIO_SEL1_REG,
-                                       offset, 0);
-                       if (ret < 0)
-                               goto out;
-
-                       ret = abx500_gpio_set_bits(chip,
-                                       AB8500_GPIO_ALTFUN_REG,
-                                       af.alt_bit1,
-                                       !!(af.alta_val & BIT(0)));
-                       if (ret < 0)
-                               goto out;
-
-                       if (af.alt_bit2 != UNUSED)
-                               ret = abx500_gpio_set_bits(chip,
-                                       AB8500_GPIO_ALTFUN_REG,
-                                       af.alt_bit2,
-                                       !!(af.alta_val & BIT(1)));
-               } else
-                       ret = abx500_gpio_set_bits(chip, AB8500_GPIO_SEL1_REG,
-                                       offset, 1);
-               break;
-
-       case ABX500_ALT_B:
-               ret = abx500_gpio_set_bits(chip, AB8500_GPIO_SEL1_REG,
-                               offset, 0);
-               if (ret < 0)
-                       goto out;
-
-               ret = abx500_gpio_set_bits(chip, AB8500_GPIO_ALTFUN_REG,
-                               af.alt_bit1, !!(af.altb_val & BIT(0)));
-               if (ret < 0)
-                       goto out;
-
-               if (af.alt_bit2 != UNUSED)
-                       ret = abx500_gpio_set_bits(chip,
-                                       AB8500_GPIO_ALTFUN_REG,
-                                       af.alt_bit2,
-                                       !!(af.altb_val & BIT(1)));
-               break;
-
-       case ABX500_ALT_C:
-               ret = abx500_gpio_set_bits(chip, AB8500_GPIO_SEL1_REG,
-                               offset, 0);
-               if (ret < 0)
-                       goto out;
-
-               ret = abx500_gpio_set_bits(chip, AB8500_GPIO_ALTFUN_REG,
-                               af.alt_bit2, !!(af.altc_val & BIT(0)));
-               if (ret < 0)
-                       goto out;
-
-               ret = abx500_gpio_set_bits(chip, AB8500_GPIO_ALTFUN_REG,
-                               af.alt_bit2, !!(af.altc_val & BIT(1)));
-               break;
-
-       default:
-               dev_dbg(pct->dev, "unknow alt_setting %d\n", alt_setting);
-
-               return -EINVAL;
-       }
-out:
-       if (ret < 0)
-               dev_err(pct->dev, "%s failed (%d)\n", __func__, ret);
-
-       return ret;
-}
-
-static int abx500_get_mode(struct pinctrl_dev *pctldev, struct gpio_chip *chip,
-                         unsigned gpio)
-{
-       u8 mode;
-       bool bit_mode;
-       bool alt_bit1;
-       bool alt_bit2;
-       struct abx500_pinctrl *pct = pinctrl_dev_get_drvdata(pctldev);
-       struct alternate_functions af = pct->soc->alternate_functions[gpio];
-       /* on ABx5xx, there is no GPIO0, so adjust the offset */
-       unsigned offset = gpio - 1;
-       int ret;
-
-       /*
-        * if gpiosel_bit is set to unused,
-        * it means no GPIO or special case
-        */
-       if (af.gpiosel_bit == UNUSED)
-               return ABX500_DEFAULT;
-
-       /* read GpioSelx register */
-       ret = abx500_gpio_get_bit(chip, AB8500_GPIO_SEL1_REG + (offset / 8),
-                       af.gpiosel_bit, &bit_mode);
-       if (ret < 0)
-               goto out;
-
-       mode = bit_mode;
-
-       /* sanity check */
-       if ((af.alt_bit1 < UNUSED) || (af.alt_bit1 > 7) ||
-           (af.alt_bit2 < UNUSED) || (af.alt_bit2 > 7)) {
-               dev_err(pct->dev,
-                       "alt_bitX value not in correct range (-1 to 7)\n");
-               return -EINVAL;
-       }
-
-       /* if alt_bit2 is used, alt_bit1 must be used too */
-       if ((af.alt_bit2 != UNUSED) && (af.alt_bit1 == UNUSED)) {
-               dev_err(pct->dev,
-                       "if alt_bit2 is used, alt_bit1 can't be unused\n");
-               return -EINVAL;
-       }
-
-       /* check if pin use AlternateFunction register */
-       if ((af.alt_bit1 == UNUSED) && (af.alt_bit2 == UNUSED))
-               return mode;
-       /*
-        * if pin GPIOSEL bit is set and pin supports alternate function,
-        * it means DEFAULT mode
-        */
-       if (mode)
-               return ABX500_DEFAULT;
-
-       /*
-        * pin use the AlternatFunction register
-        * read alt_bit1 value
-        */
-       ret = abx500_gpio_get_bit(chip, AB8500_GPIO_ALTFUN_REG,
-                           af.alt_bit1, &alt_bit1);
-       if (ret < 0)
-               goto out;
-
-       if (af.alt_bit2 != UNUSED) {
-               /* read alt_bit2 value */
-               ret = abx500_gpio_get_bit(chip, AB8500_GPIO_ALTFUN_REG,
-                               af.alt_bit2,
-                               &alt_bit2);
-               if (ret < 0)
-                       goto out;
-       } else
-               alt_bit2 = 0;
-
-       mode = (alt_bit2 << 1) + alt_bit1;
-       if (mode == af.alta_val)
-               return ABX500_ALT_A;
-       else if (mode == af.altb_val)
-               return ABX500_ALT_B;
-       else
-               return ABX500_ALT_C;
-
-out:
-       dev_err(pct->dev, "%s failed (%d)\n", __func__, ret);
-       return ret;
-}
-
-#ifdef CONFIG_DEBUG_FS
-
-#include <linux/seq_file.h>
-
-static void abx500_gpio_dbg_show_one(struct seq_file *s,
-                                    struct pinctrl_dev *pctldev,
-                                    struct gpio_chip *chip,
-                                    unsigned offset, unsigned gpio)
-{
-       struct abx500_pinctrl *pct = pinctrl_dev_get_drvdata(pctldev);
-       const char *label = gpiochip_is_requested(chip, offset - 1);
-       u8 gpio_offset = offset - 1;
-       int mode = -1;
-       bool is_out;
-       bool pd;
-       enum abx500_gpio_pull_updown pud = 0;
-       int ret;
-
-       const char *modes[] = {
-               [ABX500_DEFAULT]        = "default",
-               [ABX500_ALT_A]          = "altA",
-               [ABX500_ALT_B]          = "altB",
-               [ABX500_ALT_C]          = "altC",
-       };
-
-       const char *pull_up_down[] = {
-               [ABX500_GPIO_PULL_DOWN]         = "pull down",
-               [ABX500_GPIO_PULL_NONE]         = "pull none",
-               [ABX500_GPIO_PULL_NONE + 1]     = "pull none",
-               [ABX500_GPIO_PULL_UP]           = "pull up",
-       };
-
-       ret = abx500_gpio_get_bit(chip, AB8500_GPIO_DIR1_REG,
-                       gpio_offset, &is_out);
-       if (ret < 0)
-               goto out;
-
-       seq_printf(s, " gpio-%-3d (%-20.20s) %-3s",
-                  gpio, label ?: "(none)",
-                  is_out ? "out" : "in ");
-
-       if (!is_out) {
-               if (abx500_pullud_supported(chip, offset)) {
-                       ret = abx500_get_pull_updown(pct, offset, &pud);
-                       if (ret < 0)
-                               goto out;
-
-                       seq_printf(s, " %-9s", pull_up_down[pud]);
-               } else {
-                       ret = abx500_gpio_get_bit(chip, AB8500_GPIO_PUD1_REG,
-                                       gpio_offset, &pd);
-                       if (ret < 0)
-                               goto out;
-
-                       seq_printf(s, " %-9s", pull_up_down[pd]);
-               }
-       } else
-               seq_printf(s, " %-9s", chip->get(chip, offset) ? "hi" : "lo");
-
-       if (pctldev)
-               mode = abx500_get_mode(pctldev, chip, offset);
-
-       seq_printf(s, " %s", (mode < 0) ? "unknown" : modes[mode]);
-
-out:
-       if (ret < 0)
-               dev_err(pct->dev, "%s failed (%d)\n", __func__, ret);
-}
-
-static void abx500_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
-{
-       unsigned i;
-       unsigned gpio = chip->base;
-       struct abx500_pinctrl *pct = to_abx500_pinctrl(chip);
-       struct pinctrl_dev *pctldev = pct->pctldev;
-
-       for (i = 0; i < chip->ngpio; i++, gpio++) {
-               /* On AB8500, there is no GPIO0, the first is the GPIO 1 */
-               abx500_gpio_dbg_show_one(s, pctldev, chip, i + 1, gpio);
-               seq_printf(s, "\n");
-       }
-}
-
-#else
-static inline void abx500_gpio_dbg_show_one(struct seq_file *s,
-                                           struct pinctrl_dev *pctldev,
-                                           struct gpio_chip *chip,
-                                           unsigned offset, unsigned gpio)
-{
-}
-#define abx500_gpio_dbg_show   NULL
-#endif
-
-static int abx500_gpio_request(struct gpio_chip *chip, unsigned offset)
-{
-       int gpio = chip->base + offset;
-
-       return pinctrl_request_gpio(gpio);
-}
-
-static void abx500_gpio_free(struct gpio_chip *chip, unsigned offset)
-{
-       int gpio = chip->base + offset;
-
-       pinctrl_free_gpio(gpio);
-}
-
-static struct gpio_chip abx500gpio_chip = {
-       .label                  = "abx500-gpio",
-       .owner                  = THIS_MODULE,
-       .request                = abx500_gpio_request,
-       .free                   = abx500_gpio_free,
-       .direction_input        = abx500_gpio_direction_input,
-       .get                    = abx500_gpio_get,
-       .direction_output       = abx500_gpio_direction_output,
-       .set                    = abx500_gpio_set,
-       .to_irq                 = abx500_gpio_to_irq,
-       .dbg_show               = abx500_gpio_dbg_show,
-};
-
-static int abx500_pmx_get_funcs_cnt(struct pinctrl_dev *pctldev)
-{
-       struct abx500_pinctrl *pct = pinctrl_dev_get_drvdata(pctldev);
-
-       return pct->soc->nfunctions;
-}
-
-static const char *abx500_pmx_get_func_name(struct pinctrl_dev *pctldev,
-                                        unsigned function)
-{
-       struct abx500_pinctrl *pct = pinctrl_dev_get_drvdata(pctldev);
-
-       return pct->soc->functions[function].name;
-}
-
-static int abx500_pmx_get_func_groups(struct pinctrl_dev *pctldev,
-                                     unsigned function,
-                                     const char * const **groups,
-                                     unsigned * const num_groups)
-{
-       struct abx500_pinctrl *pct = pinctrl_dev_get_drvdata(pctldev);
-
-       *groups = pct->soc->functions[function].groups;
-       *num_groups = pct->soc->functions[function].ngroups;
-
-       return 0;
-}
-
-static int abx500_pmx_enable(struct pinctrl_dev *pctldev, unsigned function,
-                            unsigned group)
-{
-       struct abx500_pinctrl *pct = pinctrl_dev_get_drvdata(pctldev);
-       struct gpio_chip *chip = &pct->chip;
-       const struct abx500_pingroup *g;
-       int i;
-       int ret = 0;
-
-       g = &pct->soc->groups[group];
-       if (g->altsetting < 0)
-               return -EINVAL;
-
-       dev_dbg(pct->dev, "enable group %s, %u pins\n", g->name, g->npins);
-
-       for (i = 0; i < g->npins; i++) {
-               dev_dbg(pct->dev, "setting pin %d to altsetting %d\n",
-                       g->pins[i], g->altsetting);
-
-               ret = abx500_set_mode(pctldev, chip, g->pins[i], g->altsetting);
-       }
-
-       if (ret < 0)
-               dev_err(pct->dev, "%s failed (%d)\n", __func__, ret);
-
-       return ret;
-}
-
-static void abx500_pmx_disable(struct pinctrl_dev *pctldev,
-                              unsigned function, unsigned group)
-{
-       struct abx500_pinctrl *pct = pinctrl_dev_get_drvdata(pctldev);
-       const struct abx500_pingroup *g;
-
-       g = &pct->soc->groups[group];
-       if (g->altsetting < 0)
-               return;
-
-       /* FIXME: poke out the mux, set the pin to some default state? */
-       dev_dbg(pct->dev, "disable group %s, %u pins\n", g->name, g->npins);
-}
-
-static int abx500_gpio_request_enable(struct pinctrl_dev *pctldev,
-                              struct pinctrl_gpio_range *range,
-                              unsigned offset)
-{
-       struct abx500_pinctrl *pct = pinctrl_dev_get_drvdata(pctldev);
-       const struct abx500_pinrange *p;
-       int ret;
-       int i;
-
-       /*
-        * Different ranges have different ways to enable GPIO function on a
-        * pin, so refer back to our local range type, where we handily define
-        * what altfunc enables GPIO for a certain pin.
-        */
-       for (i = 0; i < pct->soc->gpio_num_ranges; i++) {
-               p = &pct->soc->gpio_ranges[i];
-               if ((offset >= p->offset) &&
-                   (offset < (p->offset + p->npins)))
-                 break;
-       }
-
-       if (i == pct->soc->gpio_num_ranges) {
-               dev_err(pct->dev, "%s failed to locate range\n", __func__);
-               return -ENODEV;
-       }
-
-       dev_dbg(pct->dev, "enable GPIO by altfunc %d at gpio %d\n",
-               p->altfunc, offset);
-
-       ret = abx500_set_mode(pct->pctldev, &pct->chip,
-                             offset, p->altfunc);
-       if (ret < 0)
-               dev_err(pct->dev, "%s setting altfunc failed\n", __func__);
-
-       return ret;
-}
-
-static void abx500_gpio_disable_free(struct pinctrl_dev *pctldev,
-                                    struct pinctrl_gpio_range *range,
-                                    unsigned offset)
-{
-}
-
-static const struct pinmux_ops abx500_pinmux_ops = {
-       .get_functions_count = abx500_pmx_get_funcs_cnt,
-       .get_function_name = abx500_pmx_get_func_name,
-       .get_function_groups = abx500_pmx_get_func_groups,
-       .enable = abx500_pmx_enable,
-       .disable = abx500_pmx_disable,
-       .gpio_request_enable = abx500_gpio_request_enable,
-       .gpio_disable_free = abx500_gpio_disable_free,
-};
-
-static int abx500_get_groups_cnt(struct pinctrl_dev *pctldev)
-{
-       struct abx500_pinctrl *pct = pinctrl_dev_get_drvdata(pctldev);
-
-       return pct->soc->ngroups;
-}
-
-static const char *abx500_get_group_name(struct pinctrl_dev *pctldev,
-                                        unsigned selector)
-{
-       struct abx500_pinctrl *pct = pinctrl_dev_get_drvdata(pctldev);
-
-       return pct->soc->groups[selector].name;
-}
-
-static int abx500_get_group_pins(struct pinctrl_dev *pctldev,
-                                unsigned selector,
-                                const unsigned **pins,
-                                unsigned *num_pins)
-{
-       struct abx500_pinctrl *pct = pinctrl_dev_get_drvdata(pctldev);
-
-       *pins = pct->soc->groups[selector].pins;
-       *num_pins = pct->soc->groups[selector].npins;
-
-       return 0;
-}
-
-static void abx500_pin_dbg_show(struct pinctrl_dev *pctldev,
-                               struct seq_file *s, unsigned offset)
-{
-       struct abx500_pinctrl *pct = pinctrl_dev_get_drvdata(pctldev);
-       struct gpio_chip *chip = &pct->chip;
-
-       abx500_gpio_dbg_show_one(s, pctldev, chip, offset,
-                                chip->base + offset - 1);
-}
-
-static void abx500_dt_free_map(struct pinctrl_dev *pctldev,
-               struct pinctrl_map *map, unsigned num_maps)
-{
-       int i;
-
-       for (i = 0; i < num_maps; i++)
-               if (map[i].type == PIN_MAP_TYPE_CONFIGS_PIN)
-                       kfree(map[i].data.configs.configs);
-       kfree(map);
-}
-
-static int abx500_dt_reserve_map(struct pinctrl_map **map,
-               unsigned *reserved_maps,
-               unsigned *num_maps,
-               unsigned reserve)
-{
-       unsigned old_num = *reserved_maps;
-       unsigned new_num = *num_maps + reserve;
-       struct pinctrl_map *new_map;
-
-       if (old_num >= new_num)
-               return 0;
-
-       new_map = krealloc(*map, sizeof(*new_map) * new_num, GFP_KERNEL);
-       if (!new_map)
-               return -ENOMEM;
-
-       memset(new_map + old_num, 0, (new_num - old_num) * sizeof(*new_map));
-
-       *map = new_map;
-       *reserved_maps = new_num;
-
-       return 0;
-}
-
-static int abx500_dt_add_map_mux(struct pinctrl_map **map,
-               unsigned *reserved_maps,
-               unsigned *num_maps, const char *group,
-               const char *function)
-{
-       if (*num_maps == *reserved_maps)
-               return -ENOSPC;
-
-       (*map)[*num_maps].type = PIN_MAP_TYPE_MUX_GROUP;
-       (*map)[*num_maps].data.mux.group = group;
-       (*map)[*num_maps].data.mux.function = function;
-       (*num_maps)++;
-
-       return 0;
-}
-
-static int abx500_dt_add_map_configs(struct pinctrl_map **map,
-               unsigned *reserved_maps,
-               unsigned *num_maps, const char *group,
-               unsigned long *configs, unsigned num_configs)
-{
-       unsigned long *dup_configs;
-
-       if (*num_maps == *reserved_maps)
-               return -ENOSPC;
-
-       dup_configs = kmemdup(configs, num_configs * sizeof(*dup_configs),
-                             GFP_KERNEL);
-       if (!dup_configs)
-               return -ENOMEM;
-
-       (*map)[*num_maps].type = PIN_MAP_TYPE_CONFIGS_PIN;
-
-       (*map)[*num_maps].data.configs.group_or_pin = group;
-       (*map)[*num_maps].data.configs.configs = dup_configs;
-       (*map)[*num_maps].data.configs.num_configs = num_configs;
-       (*num_maps)++;
-
-       return 0;
-}
-
-static const char *abx500_find_pin_name(struct pinctrl_dev *pctldev,
-                                       const char *pin_name)
-{
-       int i, pin_number;
-       struct abx500_pinctrl *npct = pinctrl_dev_get_drvdata(pctldev);
-
-       if (sscanf((char *)pin_name, "GPIO%d", &pin_number) == 1)
-               for (i = 0; i < npct->soc->npins; i++)
-                       if (npct->soc->pins[i].number == pin_number)
-                               return npct->soc->pins[i].name;
-       return NULL;
-}
-
-static int abx500_dt_subnode_to_map(struct pinctrl_dev *pctldev,
-               struct device_node *np,
-               struct pinctrl_map **map,
-               unsigned *reserved_maps,
-               unsigned *num_maps)
-{
-       int ret;
-       const char *function = NULL;
-       unsigned long *configs;
-       unsigned int nconfigs = 0;
-       bool has_config = 0;
-       unsigned reserve = 0;
-       struct property *prop;
-       const char *group, *gpio_name;
-       struct device_node *np_config;
-
-       ret = of_property_read_string(np, "ste,function", &function);
-       if (ret >= 0)
-               reserve = 1;
-
-       ret = pinconf_generic_parse_dt_config(np, &configs, &nconfigs);
-       if (nconfigs)
-               has_config = 1;
-
-       np_config = of_parse_phandle(np, "ste,config", 0);
-       if (np_config) {
-               ret = pinconf_generic_parse_dt_config(np_config, &configs,
-                               &nconfigs);
-               if (ret)
-                       goto exit;
-               has_config |= nconfigs;
-       }
-
-       ret = of_property_count_strings(np, "ste,pins");
-       if (ret < 0)
-               goto exit;
-
-       if (has_config)
-               reserve++;
-
-       reserve *= ret;
-
-       ret = abx500_dt_reserve_map(map, reserved_maps, num_maps, reserve);
-       if (ret < 0)
-               goto exit;
-
-       of_property_for_each_string(np, "ste,pins", prop, group) {
-               if (function) {
-                       ret = abx500_dt_add_map_mux(map, reserved_maps,
-                                       num_maps, group, function);
-                       if (ret < 0)
-                               goto exit;
-               }
-               if (has_config) {
-                       gpio_name = abx500_find_pin_name(pctldev, group);
-
-                       ret = abx500_dt_add_map_configs(map, reserved_maps,
-                                       num_maps, gpio_name, configs, 1);
-                       if (ret < 0)
-                               goto exit;
-               }
-
-       }
-exit:
-       return ret;
-}
-
-static int abx500_dt_node_to_map(struct pinctrl_dev *pctldev,
-                                struct device_node *np_config,
-                                struct pinctrl_map **map, unsigned *num_maps)
-{
-       unsigned reserved_maps;
-       struct device_node *np;
-       int ret;
-
-       reserved_maps = 0;
-       *map = NULL;
-       *num_maps = 0;
-
-       for_each_child_of_node(np_config, np) {
-               ret = abx500_dt_subnode_to_map(pctldev, np, map,
-                               &reserved_maps, num_maps);
-               if (ret < 0) {
-                       abx500_dt_free_map(pctldev, *map, *num_maps);
-                       return ret;
-               }
-       }
-
-       return 0;
-}
-
-static const struct pinctrl_ops abx500_pinctrl_ops = {
-       .get_groups_count = abx500_get_groups_cnt,
-       .get_group_name = abx500_get_group_name,
-       .get_group_pins = abx500_get_group_pins,
-       .pin_dbg_show = abx500_pin_dbg_show,
-       .dt_node_to_map = abx500_dt_node_to_map,
-       .dt_free_map = abx500_dt_free_map,
-};
-
-static int abx500_pin_config_get(struct pinctrl_dev *pctldev,
-                         unsigned pin,
-                         unsigned long *config)
-{
-       return -ENOSYS;
-}
-
-static int abx500_pin_config_set(struct pinctrl_dev *pctldev,
-                         unsigned pin,
-                         unsigned long *configs,
-                         unsigned num_configs)
-{
-       struct abx500_pinctrl *pct = pinctrl_dev_get_drvdata(pctldev);
-       struct gpio_chip *chip = &pct->chip;
-       unsigned offset;
-       int ret = -EINVAL;
-       int i;
-       enum pin_config_param param;
-       enum pin_config_param argument;
-
-       for (i = 0; i < num_configs; i++) {
-               param = pinconf_to_config_param(configs[i]);
-               argument = pinconf_to_config_argument(configs[i]);
-
-               dev_dbg(chip->dev, "pin %d [%#lx]: %s %s\n",
-                       pin, configs[i],
-                       (param == PIN_CONFIG_OUTPUT) ? "output " : "input",
-                       (param == PIN_CONFIG_OUTPUT) ?
-                       (argument ? "high" : "low") :
-                       (argument ? "pull up" : "pull down"));
-
-               /* on ABx500, there is no GPIO0, so adjust the offset */
-               offset = pin - 1;
-
-               switch (param) {
-               case PIN_CONFIG_BIAS_DISABLE:
-                       ret = abx500_gpio_direction_input(chip, offset);
-                       if (ret < 0)
-                               goto out;
-                       /*
-                        * Some chips only support pull down, while some
-                        * actually support both pull up and pull down. Such
-                        * chips have a "pullud" range specified for the pins
-                        * that support both features. If the pin is not
-                        * within that range, we fall back to the old bit set
-                        * that only support pull down.
-                        */
-                       if (abx500_pullud_supported(chip, pin))
-                               ret = abx500_set_pull_updown(pct,
-                                       pin,
-                                       ABX500_GPIO_PULL_NONE);
-                       else
-                               /* Chip only supports pull down */
-                               ret = abx500_gpio_set_bits(chip,
-                                       AB8500_GPIO_PUD1_REG, offset,
-                                       ABX500_GPIO_PULL_NONE);
-                       break;
-
-               case PIN_CONFIG_BIAS_PULL_DOWN:
-                       ret = abx500_gpio_direction_input(chip, offset);
-                       if (ret < 0)
-                               goto out;
-                       /*
-                        * if argument = 1 set the pull down
-                        * else clear the pull down
-                        * Some chips only support pull down, while some
-                        * actually support both pull up and pull down. Such
-                        * chips have a "pullud" range specified for the pins
-                        * that support both features. If the pin is not
-                        * within that range, we fall back to the old bit set
-                        * that only support pull down.
-                        */
-                       if (abx500_pullud_supported(chip, pin))
-                               ret = abx500_set_pull_updown(pct,
-                                       pin,
-                                       argument ? ABX500_GPIO_PULL_DOWN :
-                                       ABX500_GPIO_PULL_NONE);
-                       else
-                               /* Chip only supports pull down */
-                               ret = abx500_gpio_set_bits(chip,
-                               AB8500_GPIO_PUD1_REG,
-                                       offset,
-                                       argument ? ABX500_GPIO_PULL_DOWN :
-                                       ABX500_GPIO_PULL_NONE);
-                       break;
-
-               case PIN_CONFIG_BIAS_PULL_UP:
-                       ret = abx500_gpio_direction_input(chip, offset);
-                       if (ret < 0)
-                               goto out;
-                       /*
-                        * if argument = 1 set the pull up
-                        * else clear the pull up
-                        */
-                       ret = abx500_gpio_direction_input(chip, offset);
-                       /*
-                        * Some chips only support pull down, while some
-                        * actually support both pull up and pull down. Such
-                        * chips have a "pullud" range specified for the pins
-                        * that support both features. If the pin is not
-                        * within that range, do nothing
-                        */
-                       if (abx500_pullud_supported(chip, pin))
-                               ret = abx500_set_pull_updown(pct,
-                                       pin,
-                                       argument ? ABX500_GPIO_PULL_UP :
-                                       ABX500_GPIO_PULL_NONE);
-                       break;
-
-               case PIN_CONFIG_OUTPUT:
-                       ret = abx500_gpio_direction_output(chip, offset,
-                               argument);
-                       break;
-
-               default:
-                       dev_err(chip->dev, "illegal configuration requested\n");
-               }
-       } /* for each config */
-out:
-       if (ret < 0)
-               dev_err(pct->dev, "%s failed (%d)\n", __func__, ret);
-
-       return ret;
-}
-
-static const struct pinconf_ops abx500_pinconf_ops = {
-       .pin_config_get = abx500_pin_config_get,
-       .pin_config_set = abx500_pin_config_set,
-};
-
-static struct pinctrl_desc abx500_pinctrl_desc = {
-       .name = "pinctrl-abx500",
-       .pctlops = &abx500_pinctrl_ops,
-       .pmxops = &abx500_pinmux_ops,
-       .confops = &abx500_pinconf_ops,
-       .owner = THIS_MODULE,
-};
-
-static int abx500_get_gpio_num(struct abx500_pinctrl_soc_data *soc)
-{
-       unsigned int lowest = 0;
-       unsigned int highest = 0;
-       unsigned int npins = 0;
-       int i;
-
-       /*
-        * Compute number of GPIOs from the last SoC gpio range descriptors
-        * These ranges may include "holes" but the GPIO number space shall
-        * still be homogeneous, so we need to detect and account for any
-        * such holes so that these are included in the number of GPIO pins.
-        */
-       for (i = 0; i < soc->gpio_num_ranges; i++) {
-               unsigned gstart;
-               unsigned gend;
-               const struct abx500_pinrange *p;
-
-               p = &soc->gpio_ranges[i];
-               gstart = p->offset;
-               gend = p->offset + p->npins - 1;
-
-               if (i == 0) {
-                       /* First iteration, set start values */
-                       lowest = gstart;
-                       highest = gend;
-               } else {
-                       if (gstart < lowest)
-                               lowest = gstart;
-                       if (gend > highest)
-                               highest = gend;
-               }
-       }
-       /* this gives the absolute number of pins */
-       npins = highest - lowest + 1;
-       return npins;
-}
-
-static const struct of_device_id abx500_gpio_match[] = {
-       { .compatible = "stericsson,ab8500-gpio", .data = (void *)PINCTRL_AB8500, },
-       { .compatible = "stericsson,ab8505-gpio", .data = (void *)PINCTRL_AB8505, },
-       { .compatible = "stericsson,ab8540-gpio", .data = (void *)PINCTRL_AB8540, },
-       { .compatible = "stericsson,ab9540-gpio", .data = (void *)PINCTRL_AB9540, },
-       { }
-};
-
-static int abx500_gpio_probe(struct platform_device *pdev)
-{
-       struct device_node *np = pdev->dev.of_node;
-       const struct of_device_id *match;
-       struct abx500_pinctrl *pct;
-       unsigned int id = -1;
-       int ret, err;
-       int i;
-
-       if (!np) {
-               dev_err(&pdev->dev, "gpio dt node missing\n");
-               return -ENODEV;
-       }
-
-       pct = devm_kzalloc(&pdev->dev, sizeof(struct abx500_pinctrl),
-                                  GFP_KERNEL);
-       if (pct == NULL) {
-               dev_err(&pdev->dev,
-                       "failed to allocate memory for pct\n");
-               return -ENOMEM;
-       }
-
-       pct->dev = &pdev->dev;
-       pct->parent = dev_get_drvdata(pdev->dev.parent);
-       pct->chip = abx500gpio_chip;
-       pct->chip.dev = &pdev->dev;
-       pct->chip.base = -1; /* Dynamic allocation */
-
-       match = of_match_device(abx500_gpio_match, &pdev->dev);
-       if (!match) {
-               dev_err(&pdev->dev, "gpio dt not matching\n");
-               return -ENODEV;
-       }
-       id = (unsigned long)match->data;
-
-       /* Poke in other ASIC variants here */
-       switch (id) {
-       case PINCTRL_AB8500:
-               abx500_pinctrl_ab8500_init(&pct->soc);
-               break;
-       case PINCTRL_AB8540:
-               abx500_pinctrl_ab8540_init(&pct->soc);
-               break;
-       case PINCTRL_AB9540:
-               abx500_pinctrl_ab9540_init(&pct->soc);
-               break;
-       case PINCTRL_AB8505:
-               abx500_pinctrl_ab8505_init(&pct->soc);
-               break;
-       default:
-               dev_err(&pdev->dev, "Unsupported pinctrl sub driver (%d)\n", id);
-               return -EINVAL;
-       }
-
-       if (!pct->soc) {
-               dev_err(&pdev->dev, "Invalid SOC data\n");
-               return -EINVAL;
-       }
-
-       pct->chip.ngpio = abx500_get_gpio_num(pct->soc);
-       pct->irq_cluster = pct->soc->gpio_irq_cluster;
-       pct->irq_cluster_size = pct->soc->ngpio_irq_cluster;
-
-       ret = gpiochip_add(&pct->chip);
-       if (ret) {
-               dev_err(&pdev->dev, "unable to add gpiochip: %d\n", ret);
-               return ret;
-       }
-       dev_info(&pdev->dev, "added gpiochip\n");
-
-       abx500_pinctrl_desc.pins = pct->soc->pins;
-       abx500_pinctrl_desc.npins = pct->soc->npins;
-       pct->pctldev = pinctrl_register(&abx500_pinctrl_desc, &pdev->dev, pct);
-       if (!pct->pctldev) {
-               dev_err(&pdev->dev,
-                       "could not register abx500 pinctrl driver\n");
-               ret = -EINVAL;
-               goto out_rem_chip;
-       }
-       dev_info(&pdev->dev, "registered pin controller\n");
-
-       /* We will handle a range of GPIO pins */
-       for (i = 0; i < pct->soc->gpio_num_ranges; i++) {
-               const struct abx500_pinrange *p = &pct->soc->gpio_ranges[i];
-
-               ret = gpiochip_add_pin_range(&pct->chip,
-                                       dev_name(&pdev->dev),
-                                       p->offset - 1, p->offset, p->npins);
-               if (ret < 0)
-                       goto out_rem_chip;
-       }
-
-       platform_set_drvdata(pdev, pct);
-       dev_info(&pdev->dev, "initialized abx500 pinctrl driver\n");
-
-       return 0;
-
-out_rem_chip:
-       err = gpiochip_remove(&pct->chip);
-       if (err)
-               dev_info(&pdev->dev, "failed to remove gpiochip\n");
-
-       return ret;
-}
-
-/**
- * abx500_gpio_remove() - remove Ab8500-gpio driver
- * @pdev:      Platform device registered
- */
-static int abx500_gpio_remove(struct platform_device *pdev)
-{
-       struct abx500_pinctrl *pct = platform_get_drvdata(pdev);
-       int ret;
-
-       ret = gpiochip_remove(&pct->chip);
-       if (ret < 0) {
-               dev_err(pct->dev, "unable to remove gpiochip: %d\n",
-                       ret);
-               return ret;
-       }
-
-       return 0;
-}
-
-static struct platform_driver abx500_gpio_driver = {
-       .driver = {
-               .name = "abx500-gpio",
-               .owner = THIS_MODULE,
-               .of_match_table = abx500_gpio_match,
-       },
-       .probe = abx500_gpio_probe,
-       .remove = abx500_gpio_remove,
-};
-
-static int __init abx500_gpio_init(void)
-{
-       return platform_driver_register(&abx500_gpio_driver);
-}
-core_initcall(abx500_gpio_init);
-
-MODULE_AUTHOR("Patrice Chotard <patrice.chotard@st.com>");
-MODULE_DESCRIPTION("Driver allows to use AxB5xx unused pins to be used as GPIO");
-MODULE_ALIAS("platform:abx500-gpio");
-MODULE_LICENSE("GPL v2");
diff --git a/drivers/pinctrl/pinctrl-abx500.h b/drivers/pinctrl/pinctrl-abx500.h
deleted file mode 100644 (file)
index 2beef3b..0000000
+++ /dev/null
@@ -1,246 +0,0 @@
-#ifndef PINCTRL_PINCTRL_ABx500_H
-#define PINCTRL_PINCTRL_ABx500_H
-
-/* Package definitions */
-#define PINCTRL_AB8500 0
-#define PINCTRL_AB8540 1
-#define PINCTRL_AB9540 2
-#define PINCTRL_AB8505 3
-
-/* pins alternate function */
-enum abx500_pin_func {
-       ABX500_DEFAULT,
-       ABX500_ALT_A,
-       ABX500_ALT_B,
-       ABX500_ALT_C,
-};
-
-enum abx500_gpio_pull_updown {
-       ABX500_GPIO_PULL_DOWN = 0x0,
-       ABX500_GPIO_PULL_NONE = 0x1,
-       ABX500_GPIO_PULL_UP = 0x3,
-};
-
-enum abx500_gpio_vinsel {
-       ABX500_GPIO_VINSEL_VBAT = 0x0,
-       ABX500_GPIO_VINSEL_VIN_1V8 = 0x1,
-       ABX500_GPIO_VINSEL_VDD_BIF = 0x2,
-};
-
-/**
- * struct abx500_function - ABx500 pinctrl mux function
- * @name: The name of the function, exported to pinctrl core.
- * @groups: An array of pin groups that may select this function.
- * @ngroups: The number of entries in @groups.
- */
-struct abx500_function {
-       const char *name;
-       const char * const *groups;
-       unsigned ngroups;
-};
-
-/**
- * struct abx500_pingroup - describes a ABx500 pin group
- * @name: the name of this specific pin group
- * @pins: an array of discrete physical pins used in this group, taken
- *     from the driver-local pin enumeration space
- * @num_pins: the number of pins in this group array, i.e. the number of
- *     elements in .pins so we can iterate over that array
- * @altsetting: the altsetting to apply to all pins in this group to
- *     configure them to be used by a function
- */
-struct abx500_pingroup {
-       const char *name;
-       const unsigned int *pins;
-       const unsigned npins;
-       int altsetting;
-};
-
-#define ALTERNATE_FUNCTIONS(pin, sel_bit, alt1, alt2, alta, altb, altc)        \
-{                                                                      \
-       .pin_number = pin,                                              \
-       .gpiosel_bit = sel_bit,                                         \
-       .alt_bit1 = alt1,                                               \
-       .alt_bit2 = alt2,                                               \
-       .alta_val = alta,                                               \
-       .altb_val = altb,                                               \
-       .altc_val = altc,                                               \
-}
-
-#define UNUSED -1
-/**
- * struct alternate_functions
- * @pin_number:                The pin number
- * @gpiosel_bit:       Control bit in GPIOSEL register,
- * @alt_bit1:          First AlternateFunction bit used to select the
- *                     alternate function
- * @alt_bit2:          Second AlternateFunction bit used to select the
- *                     alternate function
- *
- *                     these 3 following fields are necessary due to none
- *                     coherency on how to select the altA, altB and altC
- *                     function between the ABx500 SOC family when using
- *                     alternatfunc register.
- * @alta_val:          value to write in alternatfunc to select altA function
- * @altb_val:          value to write in alternatfunc to select altB function
- * @altc_val:          value to write in alternatfunc to select altC function
- */
-struct alternate_functions {
-       unsigned pin_number;
-       s8 gpiosel_bit;
-       s8 alt_bit1;
-       s8 alt_bit2;
-       u8 alta_val;
-       u8 altb_val;
-       u8 altc_val;
-};
-
-/**
- * struct pullud - specific pull up/down feature
- * @first_pin:         The pin number of the first pins which support
- *                     specific pull up/down
- * @last_pin:          The pin number of the last pins
- */
-struct pullud {
-       unsigned first_pin;
-       unsigned last_pin;
-};
-
-#define GPIO_IRQ_CLUSTER(a, b, c)      \
-{                                      \
-       .start = a,                     \
-       .end = b,                       \
-       .to_irq = c,                    \
-}
-
-/**
- * struct abx500_gpio_irq_cluster - indicates GPIOs which are interrupt
- *                     capable
- * @start:             The pin number of the first pin interrupt capable
- * @end:               The pin number of the last pin interrupt capable
- * @to_irq:            The ABx500 GPIO's associated IRQs are clustered
- *                      together throughout the interrupt numbers at irregular
- *                      intervals. To solve this quandary, we will place the
- *                      read-in values into the cluster information table
- */
-
-struct abx500_gpio_irq_cluster {
-       int start;
-       int end;
-       int to_irq;
-};
-
-/**
- * struct abx500_pinrange - map pin numbers to GPIO offsets
- * @offset:            offset into the GPIO local numberspace, incidentally
- *                     identical to the offset into the local pin numberspace
- * @npins:             number of pins to map from both offsets
- * @altfunc:           altfunc setting to be used to enable GPIO on a pin in
- *                     this range (may vary)
- */
-struct abx500_pinrange {
-       unsigned int offset;
-       unsigned int npins;
-       int altfunc;
-};
-
-#define ABX500_PINRANGE(a, b, c) { .offset = a, .npins = b, .altfunc = c }
-
-/**
- * struct abx500_pinctrl_soc_data - ABx500 pin controller per-SoC configuration
- * @gpio_ranges:       An array of GPIO ranges for this SoC
- * @gpio_num_ranges:   The number of GPIO ranges for this SoC
- * @pins:              An array describing all pins the pin controller affects.
- *                     All pins which are also GPIOs must be listed first within the
- *                     array, and be numbered identically to the GPIO controller's
- *                     numbering.
- * @npins:             The number of entries in @pins.
- * @functions:         The functions supported on this SoC.
- * @nfunction:         The number of entries in @functions.
- * @groups:            An array describing all pin groups the pin SoC supports.
- * @ngroups:           The number of entries in @groups.
- * @alternate_functions: array describing pins which supports alternate and
- *                     how to set it.
- * @pullud:            array describing pins which supports pull up/down
- *                     specific registers.
- * @gpio_irq_cluster:  An array of GPIO interrupt capable for this SoC
- * @ngpio_irq_cluster: The number of GPIO inetrrupt capable for this SoC
- * @irq_gpio_rising_offset: Interrupt offset used as base to compute specific
- *                     setting strategy of the rising interrupt line
- * @irq_gpio_falling_offset: Interrupt offset used as base to compute specific
- *                     setting strategy of the falling interrupt line
- * @irq_gpio_factor:   Factor used to compute specific setting strategy of
- *                     the interrupt line
- */
-
-struct abx500_pinctrl_soc_data {
-       const struct abx500_pinrange *gpio_ranges;
-       unsigned gpio_num_ranges;
-       const struct pinctrl_pin_desc *pins;
-       unsigned npins;
-       const struct abx500_function *functions;
-       unsigned nfunctions;
-       const struct abx500_pingroup *groups;
-       unsigned ngroups;
-       struct alternate_functions *alternate_functions;
-       struct pullud *pullud;
-       struct abx500_gpio_irq_cluster *gpio_irq_cluster;
-       unsigned ngpio_irq_cluster;
-       int irq_gpio_rising_offset;
-       int irq_gpio_falling_offset;
-       int irq_gpio_factor;
-};
-
-#ifdef CONFIG_PINCTRL_AB8500
-
-void abx500_pinctrl_ab8500_init(struct abx500_pinctrl_soc_data **soc);
-
-#else
-
-static inline void
-abx500_pinctrl_ab8500_init(struct abx500_pinctrl_soc_data **soc)
-{
-}
-
-#endif
-
-#ifdef CONFIG_PINCTRL_AB8540
-
-void abx500_pinctrl_ab8540_init(struct abx500_pinctrl_soc_data **soc);
-
-#else
-
-static inline void
-abx500_pinctrl_ab8540_init(struct abx500_pinctrl_soc_data **soc)
-{
-}
-
-#endif
-
-#ifdef CONFIG_PINCTRL_AB9540
-
-void abx500_pinctrl_ab9540_init(struct abx500_pinctrl_soc_data **soc);
-
-#else
-
-static inline void
-abx500_pinctrl_ab9540_init(struct abx500_pinctrl_soc_data **soc)
-{
-}
-
-#endif
-
-#ifdef CONFIG_PINCTRL_AB8505
-
-void abx500_pinctrl_ab8505_init(struct abx500_pinctrl_soc_data **soc);
-
-#else
-
-static inline void
-abx500_pinctrl_ab8505_init(struct abx500_pinctrl_soc_data **soc)
-{
-}
-
-#endif
-
-#endif /* PINCTRL_PINCTRL_ABx500_H */
index 5c44feb54ebb4771566dcce454bd7f81a9bc34fe..b092b93c67a1dcbbd1d364609fe47a7c22ee24d6 100644 (file)
@@ -401,7 +401,7 @@ static int adi_gpio_irq_type(struct irq_data *d, unsigned int type)
 
        if (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING |
                    IRQ_TYPE_LEVEL_HIGH | IRQ_TYPE_LEVEL_LOW)) {
-               snprintf(buf, 16, "gpio-irq%d", irq);
+               snprintf(buf, 16, "gpio-irq%u", irq);
                port_setup(port, d->hwirq, true);
        } else
                goto out;
@@ -652,35 +652,6 @@ static int adi_pinmux_enable(struct pinctrl_dev *pctldev, unsigned func_id,
        return 0;
 }
 
-static void adi_pinmux_disable(struct pinctrl_dev *pctldev, unsigned func_id,
-       unsigned group_id)
-{
-       struct adi_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctldev);
-       struct gpio_port *port;
-       struct pinctrl_gpio_range *range;
-       unsigned long flags;
-       unsigned short *mux, pin;
-
-       mux = (unsigned short *)pinctrl->soc->groups[group_id].mux;
-
-       while (*mux) {
-               pin = P_IDENT(*mux);
-
-               range = pinctrl_find_gpio_range_from_pin(pctldev, pin);
-               if (range == NULL) /* should not happen */
-                       return;
-
-               port = container_of(range->gc, struct gpio_port, chip);
-
-               spin_lock_irqsave(&port->lock, flags);
-
-               port_setup(port, pin_to_offset(range, pin), true);
-               mux++;
-
-               spin_unlock_irqrestore(&port->lock, flags);
-       }
-}
-
 static int adi_pinmux_get_funcs_count(struct pinctrl_dev *pctldev)
 {
        struct adi_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctldev);
@@ -728,7 +699,6 @@ static int adi_pinmux_request_gpio(struct pinctrl_dev *pctldev,
 
 static struct pinmux_ops adi_pinmux_ops = {
        .enable = adi_pinmux_enable,
-       .disable = adi_pinmux_disable,
        .get_functions_count = adi_pinmux_get_funcs_count,
        .get_function_name = adi_pinmux_get_func_name,
        .get_function_groups = adi_pinmux_get_groups,
@@ -979,7 +949,7 @@ static int adi_gpio_probe(struct platform_device *pdev)
        struct gpio_port *port;
        char pinctrl_devname[DEVNAME_SIZE];
        static int gpio;
-       int ret = 0, ret1;
+       int ret = 0;
 
        pdata = dev->platform_data;
        if (!pdata)
@@ -1057,7 +1027,7 @@ static int adi_gpio_probe(struct platform_device *pdev)
        return 0;
 
 out_remove_gpiochip:
-       ret1 = gpiochip_remove(&port->chip);
+       gpiochip_remove(&port->chip);
 out_remove_domain:
        if (port->pint)
                irq_domain_remove(port->domain);
@@ -1068,12 +1038,11 @@ out_remove_domain:
 static int adi_gpio_remove(struct platform_device *pdev)
 {
        struct gpio_port *port = platform_get_drvdata(pdev);
-       int ret;
        u8 offset;
 
        list_del(&port->node);
        gpiochip_remove_pin_ranges(&port->chip);
-       ret = gpiochip_remove(&port->chip);
+       gpiochip_remove(&port->chip);
        if (port->pint) {
                for (offset = 0; offset < port->width; offset++)
                        irq_dispose_mapping(irq_find_mapping(port->domain,
@@ -1081,7 +1050,7 @@ static int adi_gpio_remove(struct platform_device *pdev)
                irq_domain_remove(port->domain);
        }
 
-       return ret;
+       return 0;
 }
 
 static int adi_pinctrl_probe(struct platform_device *pdev)
diff --git a/drivers/pinctrl/pinctrl-apq8064.c b/drivers/pinctrl/pinctrl-apq8064.c
deleted file mode 100644 (file)
index 519f788..0000000
+++ /dev/null
@@ -1,613 +0,0 @@
-/*
- * Copyright (c) 2014, Sony Mobile Communications AB.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 and
- * only version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- */
-
-#include <linux/module.h>
-#include <linux/of.h>
-#include <linux/platform_device.h>
-#include <linux/pinctrl/pinctrl.h>
-
-#include "pinctrl-msm.h"
-
-static const struct pinctrl_pin_desc apq8064_pins[] = {
-       PINCTRL_PIN(0, "GPIO_0"),
-       PINCTRL_PIN(1, "GPIO_1"),
-       PINCTRL_PIN(2, "GPIO_2"),
-       PINCTRL_PIN(3, "GPIO_3"),
-       PINCTRL_PIN(4, "GPIO_4"),
-       PINCTRL_PIN(5, "GPIO_5"),
-       PINCTRL_PIN(6, "GPIO_6"),
-       PINCTRL_PIN(7, "GPIO_7"),
-       PINCTRL_PIN(8, "GPIO_8"),
-       PINCTRL_PIN(9, "GPIO_9"),
-       PINCTRL_PIN(10, "GPIO_10"),
-       PINCTRL_PIN(11, "GPIO_11"),
-       PINCTRL_PIN(12, "GPIO_12"),
-       PINCTRL_PIN(13, "GPIO_13"),
-       PINCTRL_PIN(14, "GPIO_14"),
-       PINCTRL_PIN(15, "GPIO_15"),
-       PINCTRL_PIN(16, "GPIO_16"),
-       PINCTRL_PIN(17, "GPIO_17"),
-       PINCTRL_PIN(18, "GPIO_18"),
-       PINCTRL_PIN(19, "GPIO_19"),
-       PINCTRL_PIN(20, "GPIO_20"),
-       PINCTRL_PIN(21, "GPIO_21"),
-       PINCTRL_PIN(22, "GPIO_22"),
-       PINCTRL_PIN(23, "GPIO_23"),
-       PINCTRL_PIN(24, "GPIO_24"),
-       PINCTRL_PIN(25, "GPIO_25"),
-       PINCTRL_PIN(26, "GPIO_26"),
-       PINCTRL_PIN(27, "GPIO_27"),
-       PINCTRL_PIN(28, "GPIO_28"),
-       PINCTRL_PIN(29, "GPIO_29"),
-       PINCTRL_PIN(30, "GPIO_30"),
-       PINCTRL_PIN(31, "GPIO_31"),
-       PINCTRL_PIN(32, "GPIO_32"),
-       PINCTRL_PIN(33, "GPIO_33"),
-       PINCTRL_PIN(34, "GPIO_34"),
-       PINCTRL_PIN(35, "GPIO_35"),
-       PINCTRL_PIN(36, "GPIO_36"),
-       PINCTRL_PIN(37, "GPIO_37"),
-       PINCTRL_PIN(38, "GPIO_38"),
-       PINCTRL_PIN(39, "GPIO_39"),
-       PINCTRL_PIN(40, "GPIO_40"),
-       PINCTRL_PIN(41, "GPIO_41"),
-       PINCTRL_PIN(42, "GPIO_42"),
-       PINCTRL_PIN(43, "GPIO_43"),
-       PINCTRL_PIN(44, "GPIO_44"),
-       PINCTRL_PIN(45, "GPIO_45"),
-       PINCTRL_PIN(46, "GPIO_46"),
-       PINCTRL_PIN(47, "GPIO_47"),
-       PINCTRL_PIN(48, "GPIO_48"),
-       PINCTRL_PIN(49, "GPIO_49"),
-       PINCTRL_PIN(50, "GPIO_50"),
-       PINCTRL_PIN(51, "GPIO_51"),
-       PINCTRL_PIN(52, "GPIO_52"),
-       PINCTRL_PIN(53, "GPIO_53"),
-       PINCTRL_PIN(54, "GPIO_54"),
-       PINCTRL_PIN(55, "GPIO_55"),
-       PINCTRL_PIN(56, "GPIO_56"),
-       PINCTRL_PIN(57, "GPIO_57"),
-       PINCTRL_PIN(58, "GPIO_58"),
-       PINCTRL_PIN(59, "GPIO_59"),
-       PINCTRL_PIN(60, "GPIO_60"),
-       PINCTRL_PIN(61, "GPIO_61"),
-       PINCTRL_PIN(62, "GPIO_62"),
-       PINCTRL_PIN(63, "GPIO_63"),
-       PINCTRL_PIN(64, "GPIO_64"),
-       PINCTRL_PIN(65, "GPIO_65"),
-       PINCTRL_PIN(66, "GPIO_66"),
-       PINCTRL_PIN(67, "GPIO_67"),
-       PINCTRL_PIN(68, "GPIO_68"),
-       PINCTRL_PIN(69, "GPIO_69"),
-       PINCTRL_PIN(70, "GPIO_70"),
-       PINCTRL_PIN(71, "GPIO_71"),
-       PINCTRL_PIN(72, "GPIO_72"),
-       PINCTRL_PIN(73, "GPIO_73"),
-       PINCTRL_PIN(74, "GPIO_74"),
-       PINCTRL_PIN(75, "GPIO_75"),
-       PINCTRL_PIN(76, "GPIO_76"),
-       PINCTRL_PIN(77, "GPIO_77"),
-       PINCTRL_PIN(78, "GPIO_78"),
-       PINCTRL_PIN(79, "GPIO_79"),
-       PINCTRL_PIN(80, "GPIO_80"),
-       PINCTRL_PIN(81, "GPIO_81"),
-       PINCTRL_PIN(82, "GPIO_82"),
-       PINCTRL_PIN(83, "GPIO_83"),
-       PINCTRL_PIN(84, "GPIO_84"),
-       PINCTRL_PIN(85, "GPIO_85"),
-       PINCTRL_PIN(86, "GPIO_86"),
-       PINCTRL_PIN(87, "GPIO_87"),
-       PINCTRL_PIN(88, "GPIO_88"),
-       PINCTRL_PIN(89, "GPIO_89"),
-
-       PINCTRL_PIN(90, "SDC1_CLK"),
-       PINCTRL_PIN(91, "SDC1_CMD"),
-       PINCTRL_PIN(92, "SDC1_DATA"),
-       PINCTRL_PIN(93, "SDC3_CLK"),
-       PINCTRL_PIN(94, "SDC3_CMD"),
-       PINCTRL_PIN(95, "SDC3_DATA"),
-};
-
-#define DECLARE_APQ_GPIO_PINS(pin) static const unsigned int gpio##pin##_pins[] = { pin }
-DECLARE_APQ_GPIO_PINS(0);
-DECLARE_APQ_GPIO_PINS(1);
-DECLARE_APQ_GPIO_PINS(2);
-DECLARE_APQ_GPIO_PINS(3);
-DECLARE_APQ_GPIO_PINS(4);
-DECLARE_APQ_GPIO_PINS(5);
-DECLARE_APQ_GPIO_PINS(6);
-DECLARE_APQ_GPIO_PINS(7);
-DECLARE_APQ_GPIO_PINS(8);
-DECLARE_APQ_GPIO_PINS(9);
-DECLARE_APQ_GPIO_PINS(10);
-DECLARE_APQ_GPIO_PINS(11);
-DECLARE_APQ_GPIO_PINS(12);
-DECLARE_APQ_GPIO_PINS(13);
-DECLARE_APQ_GPIO_PINS(14);
-DECLARE_APQ_GPIO_PINS(15);
-DECLARE_APQ_GPIO_PINS(16);
-DECLARE_APQ_GPIO_PINS(17);
-DECLARE_APQ_GPIO_PINS(18);
-DECLARE_APQ_GPIO_PINS(19);
-DECLARE_APQ_GPIO_PINS(20);
-DECLARE_APQ_GPIO_PINS(21);
-DECLARE_APQ_GPIO_PINS(22);
-DECLARE_APQ_GPIO_PINS(23);
-DECLARE_APQ_GPIO_PINS(24);
-DECLARE_APQ_GPIO_PINS(25);
-DECLARE_APQ_GPIO_PINS(26);
-DECLARE_APQ_GPIO_PINS(27);
-DECLARE_APQ_GPIO_PINS(28);
-DECLARE_APQ_GPIO_PINS(29);
-DECLARE_APQ_GPIO_PINS(30);
-DECLARE_APQ_GPIO_PINS(31);
-DECLARE_APQ_GPIO_PINS(32);
-DECLARE_APQ_GPIO_PINS(33);
-DECLARE_APQ_GPIO_PINS(34);
-DECLARE_APQ_GPIO_PINS(35);
-DECLARE_APQ_GPIO_PINS(36);
-DECLARE_APQ_GPIO_PINS(37);
-DECLARE_APQ_GPIO_PINS(38);
-DECLARE_APQ_GPIO_PINS(39);
-DECLARE_APQ_GPIO_PINS(40);
-DECLARE_APQ_GPIO_PINS(41);
-DECLARE_APQ_GPIO_PINS(42);
-DECLARE_APQ_GPIO_PINS(43);
-DECLARE_APQ_GPIO_PINS(44);
-DECLARE_APQ_GPIO_PINS(45);
-DECLARE_APQ_GPIO_PINS(46);
-DECLARE_APQ_GPIO_PINS(47);
-DECLARE_APQ_GPIO_PINS(48);
-DECLARE_APQ_GPIO_PINS(49);
-DECLARE_APQ_GPIO_PINS(50);
-DECLARE_APQ_GPIO_PINS(51);
-DECLARE_APQ_GPIO_PINS(52);
-DECLARE_APQ_GPIO_PINS(53);
-DECLARE_APQ_GPIO_PINS(54);
-DECLARE_APQ_GPIO_PINS(55);
-DECLARE_APQ_GPIO_PINS(56);
-DECLARE_APQ_GPIO_PINS(57);
-DECLARE_APQ_GPIO_PINS(58);
-DECLARE_APQ_GPIO_PINS(59);
-DECLARE_APQ_GPIO_PINS(60);
-DECLARE_APQ_GPIO_PINS(61);
-DECLARE_APQ_GPIO_PINS(62);
-DECLARE_APQ_GPIO_PINS(63);
-DECLARE_APQ_GPIO_PINS(64);
-DECLARE_APQ_GPIO_PINS(65);
-DECLARE_APQ_GPIO_PINS(66);
-DECLARE_APQ_GPIO_PINS(67);
-DECLARE_APQ_GPIO_PINS(68);
-DECLARE_APQ_GPIO_PINS(69);
-DECLARE_APQ_GPIO_PINS(70);
-DECLARE_APQ_GPIO_PINS(71);
-DECLARE_APQ_GPIO_PINS(72);
-DECLARE_APQ_GPIO_PINS(73);
-DECLARE_APQ_GPIO_PINS(74);
-DECLARE_APQ_GPIO_PINS(75);
-DECLARE_APQ_GPIO_PINS(76);
-DECLARE_APQ_GPIO_PINS(77);
-DECLARE_APQ_GPIO_PINS(78);
-DECLARE_APQ_GPIO_PINS(79);
-DECLARE_APQ_GPIO_PINS(80);
-DECLARE_APQ_GPIO_PINS(81);
-DECLARE_APQ_GPIO_PINS(82);
-DECLARE_APQ_GPIO_PINS(83);
-DECLARE_APQ_GPIO_PINS(84);
-DECLARE_APQ_GPIO_PINS(85);
-DECLARE_APQ_GPIO_PINS(86);
-DECLARE_APQ_GPIO_PINS(87);
-DECLARE_APQ_GPIO_PINS(88);
-DECLARE_APQ_GPIO_PINS(89);
-
-static const unsigned int sdc1_clk_pins[] = { 90 };
-static const unsigned int sdc1_cmd_pins[] = { 91 };
-static const unsigned int sdc1_data_pins[] = { 92 };
-static const unsigned int sdc3_clk_pins[] = { 93 };
-static const unsigned int sdc3_cmd_pins[] = { 94 };
-static const unsigned int sdc3_data_pins[] = { 95 };
-
-#define FUNCTION(fname)                                        \
-       [APQ_MUX_##fname] = {                           \
-               .name = #fname,                         \
-               .groups = fname##_groups,               \
-               .ngroups = ARRAY_SIZE(fname##_groups),  \
-       }
-
-#define PINGROUP(id, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10) \
-       {                                               \
-               .name = "gpio" #id,                     \
-               .pins = gpio##id##_pins,                \
-               .npins = ARRAY_SIZE(gpio##id##_pins),   \
-               .funcs = (int[]){                       \
-                       APQ_MUX_NA, /* gpio mode */     \
-                       APQ_MUX_##f1,                   \
-                       APQ_MUX_##f2,                   \
-                       APQ_MUX_##f3,                   \
-                       APQ_MUX_##f4,                   \
-                       APQ_MUX_##f5,                   \
-                       APQ_MUX_##f6,                   \
-                       APQ_MUX_##f7,                   \
-                       APQ_MUX_##f8,                   \
-                       APQ_MUX_##f9,                   \
-                       APQ_MUX_##f10,                  \
-               },                                      \
-               .nfuncs = 11,                           \
-               .ctl_reg = 0x1000 + 0x10 * id,          \
-               .io_reg = 0x1004 + 0x10 * id,           \
-               .intr_cfg_reg = 0x1008 + 0x10 * id,     \
-               .intr_status_reg = 0x100c + 0x10 * id,  \
-               .intr_target_reg = 0x400 + 0x4 * id,    \
-               .mux_bit = 2,                           \
-               .pull_bit = 0,                          \
-               .drv_bit = 6,                           \
-               .oe_bit = 9,                            \
-               .in_bit = 0,                            \
-               .out_bit = 1,                           \
-               .intr_enable_bit = 0,                   \
-               .intr_status_bit = 0,                   \
-               .intr_ack_high = 1,                     \
-               .intr_target_bit = 0,                   \
-               .intr_raw_status_bit = 3,               \
-               .intr_polarity_bit = 1,                 \
-               .intr_detection_bit = 2,                \
-               .intr_detection_width = 1,              \
-       }
-
-#define SDC_PINGROUP(pg_name, ctl, pull, drv)          \
-       {                                               \
-               .name = #pg_name,                       \
-               .pins = pg_name##_pins,                 \
-               .npins = ARRAY_SIZE(pg_name##_pins),    \
-               .ctl_reg = ctl,                         \
-               .io_reg = 0,                            \
-               .intr_cfg_reg = 0,                      \
-               .intr_status_reg = 0,                   \
-               .intr_target_reg = 0,                   \
-               .mux_bit = -1,                          \
-               .pull_bit = pull,                       \
-               .drv_bit = drv,                         \
-               .oe_bit = -1,                           \
-               .in_bit = -1,                           \
-               .out_bit = -1,                          \
-               .intr_enable_bit = -1,                  \
-               .intr_status_bit = -1,                  \
-               .intr_target_bit = -1,                  \
-               .intr_raw_status_bit = -1,              \
-               .intr_polarity_bit = -1,                \
-               .intr_detection_bit = -1,               \
-               .intr_detection_width = -1,             \
-       }
-
-enum apq8064_functions {
-       APQ_MUX_cam_mclk,
-       APQ_MUX_codec_mic_i2s,
-       APQ_MUX_codec_spkr_i2s,
-       APQ_MUX_gsbi1,
-       APQ_MUX_gsbi2,
-       APQ_MUX_gsbi3,
-       APQ_MUX_gsbi4,
-       APQ_MUX_gsbi4_cam_i2c,
-       APQ_MUX_gsbi5,
-       APQ_MUX_gsbi5_spi_cs1,
-       APQ_MUX_gsbi5_spi_cs2,
-       APQ_MUX_gsbi5_spi_cs3,
-       APQ_MUX_gsbi6,
-       APQ_MUX_gsbi6_spi_cs1,
-       APQ_MUX_gsbi6_spi_cs2,
-       APQ_MUX_gsbi6_spi_cs3,
-       APQ_MUX_gsbi7,
-       APQ_MUX_gsbi7_spi_cs1,
-       APQ_MUX_gsbi7_spi_cs2,
-       APQ_MUX_gsbi7_spi_cs3,
-       APQ_MUX_gsbi_cam_i2c,
-       APQ_MUX_hdmi,
-       APQ_MUX_mi2s,
-       APQ_MUX_riva_bt,
-       APQ_MUX_riva_fm,
-       APQ_MUX_riva_wlan,
-       APQ_MUX_sdc2,
-       APQ_MUX_sdc4,
-       APQ_MUX_slimbus,
-       APQ_MUX_spkr_i2s,
-       APQ_MUX_tsif1,
-       APQ_MUX_tsif2,
-       APQ_MUX_usb2_hsic,
-       APQ_MUX_NA,
-};
-
-static const char * const cam_mclk_groups[] = {
-       "gpio4" "gpio5"
-};
-static const char * const codec_mic_i2s_groups[] = {
-       "gpio34", "gpio35", "gpio36", "gpio37", "gpio38"
-};
-static const char * const codec_spkr_i2s_groups[] = {
-       "gpio39", "gpio40", "gpio41", "gpio42"
-};
-static const char * const gsbi1_groups[] = {
-       "gpio18", "gpio19", "gpio20", "gpio21"
-};
-static const char * const gsbi2_groups[] = {
-       "gpio22", "gpio23", "gpio24", "gpio25"
-};
-static const char * const gsbi3_groups[] = {
-       "gpio6", "gpio7", "gpio8", "gpio9"
-};
-static const char * const gsbi4_groups[] = {
-       "gpio10", "gpio11", "gpio12", "gpio13"
-};
-static const char * const gsbi4_cam_i2c_groups[] = {
-       "gpio10", "gpio11", "gpio12", "gpio13"
-};
-static const char * const gsbi5_groups[] = {
-       "gpio51", "gpio52", "gpio53", "gpio54"
-};
-static const char * const gsbi5_spi_cs1_groups[] = {
-       "gpio47"
-};
-static const char * const gsbi5_spi_cs2_groups[] = {
-       "gpio31"
-};
-static const char * const gsbi5_spi_cs3_groups[] = {
-       "gpio32"
-};
-static const char * const gsbi6_groups[] = {
-       "gpio14", "gpio15", "gpio16", "gpio17"
-};
-static const char * const gsbi6_spi_cs1_groups[] = {
-       "gpio47"
-};
-static const char * const gsbi6_spi_cs2_groups[] = {
-       "gpio31"
-};
-static const char * const gsbi6_spi_cs3_groups[] = {
-       "gpio32"
-};
-static const char * const gsbi7_groups[] = {
-       "gpio82", "gpio83", "gpio84", "gpio85"
-};
-static const char * const gsbi7_spi_cs1_groups[] = {
-       "gpio47"
-};
-static const char * const gsbi7_spi_cs2_groups[] = {
-       "gpio31"
-};
-static const char * const gsbi7_spi_cs3_groups[] = {
-       "gpio32"
-};
-static const char * const gsbi_cam_i2c_groups[] = {
-       "gpio10", "gpio11", "gpio12", "gpio13"
-};
-static const char * const hdmi_groups[] = {
-       "gpio69", "gpio70", "gpio71", "gpio72"
-};
-static const char * const mi2s_groups[] = {
-       "gpio27", "gpio28", "gpio29", "gpio30", "gpio31", "gpio32", "gpio33"
-};
-static const char * const riva_bt_groups[] = {
-       "gpio16", "gpio17"
-};
-static const char * const riva_fm_groups[] = {
-       "gpio14", "gpio15"
-};
-static const char * const riva_wlan_groups[] = {
-       "gpio64", "gpio65", "gpio66", "gpio67", "gpio68"
-};
-static const char * const sdc2_groups[] = {
-       "gpio57", "gpio58", "gpio59", "gpio60", "gpio61", "gpio62"
-};
-static const char * const sdc4_groups[] = {
-       "gpio63", "gpio64", "gpio65", "gpio66", "gpio67", "gpio68"
-};
-static const char * const slimbus_groups[] = {
-       "gpio40", "gpio41"
-};
-static const char * const spkr_i2s_groups[] = {
-       "gpio47", "gpio48", "gpio49", "gpio50"
-};
-static const char * const tsif1_groups[] = {
-       "gpio55", "gpio56", "gpio57"
-};
-static const char * const tsif2_groups[] = {
-       "gpio58", "gpio59", "gpio60"
-};
-static const char * const usb2_hsic_groups[] = {
-       "gpio88", "gpio89"
-};
-
-static const struct msm_function apq8064_functions[] = {
-       FUNCTION(cam_mclk),
-       FUNCTION(codec_mic_i2s),
-       FUNCTION(codec_spkr_i2s),
-       FUNCTION(gsbi1),
-       FUNCTION(gsbi2),
-       FUNCTION(gsbi3),
-       FUNCTION(gsbi4),
-       FUNCTION(gsbi4_cam_i2c),
-       FUNCTION(gsbi5),
-       FUNCTION(gsbi5_spi_cs1),
-       FUNCTION(gsbi5_spi_cs2),
-       FUNCTION(gsbi5_spi_cs3),
-       FUNCTION(gsbi6),
-       FUNCTION(gsbi6_spi_cs1),
-       FUNCTION(gsbi6_spi_cs2),
-       FUNCTION(gsbi6_spi_cs3),
-       FUNCTION(gsbi7),
-       FUNCTION(gsbi7_spi_cs1),
-       FUNCTION(gsbi7_spi_cs2),
-       FUNCTION(gsbi7_spi_cs3),
-       FUNCTION(gsbi_cam_i2c),
-       FUNCTION(hdmi),
-       FUNCTION(mi2s),
-       FUNCTION(riva_bt),
-       FUNCTION(riva_fm),
-       FUNCTION(riva_wlan),
-       FUNCTION(sdc2),
-       FUNCTION(sdc4),
-       FUNCTION(slimbus),
-       FUNCTION(spkr_i2s),
-       FUNCTION(tsif1),
-       FUNCTION(tsif2),
-       FUNCTION(usb2_hsic),
-};
-
-static const struct msm_pingroup apq8064_groups[] = {
-       PINGROUP(0, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(2, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(3, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(4, NA, NA, cam_mclk, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(5, NA, cam_mclk, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(6, gsbi3, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(7, gsbi3, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(8, gsbi3, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(9, gsbi3, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(10, gsbi4, NA, NA, NA, NA, NA, NA, NA, gsbi4_cam_i2c, NA),
-       PINGROUP(11, gsbi4, NA, NA, NA, NA, NA, NA, NA, NA, gsbi4_cam_i2c),
-       PINGROUP(12, gsbi4, NA, NA, NA, NA, gsbi4_cam_i2c, NA, NA, NA, NA),
-       PINGROUP(13, gsbi4, NA, NA, NA, NA, gsbi4_cam_i2c, NA, NA, NA, NA),
-       PINGROUP(14, riva_fm, gsbi6, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(15, riva_fm, gsbi6, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(16, riva_bt, gsbi6, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(17, riva_bt, gsbi6, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(18, gsbi1, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(19, gsbi1, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(20, gsbi1, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(21, gsbi1, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(22, gsbi2, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(23, gsbi2, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(24, gsbi2, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(25, gsbi2, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(26, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(27, mi2s, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(28, mi2s, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(29, mi2s, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(30, mi2s, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(31, mi2s, NA, gsbi5_spi_cs2, gsbi6_spi_cs2, gsbi7_spi_cs2, NA, NA, NA, NA, NA),
-       PINGROUP(32, mi2s, NA, NA, NA, NA, gsbi5_spi_cs3, gsbi6_spi_cs3, gsbi7_spi_cs3, NA, NA),
-       PINGROUP(33, mi2s, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(34, codec_mic_i2s, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(35, codec_mic_i2s, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(36, codec_mic_i2s, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(37, codec_mic_i2s, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(38, codec_mic_i2s, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(39, codec_spkr_i2s, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(40, slimbus, codec_spkr_i2s, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(41, slimbus, codec_spkr_i2s, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(42, codec_spkr_i2s, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(43, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(44, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(45, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(46, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(47, spkr_i2s, gsbi5_spi_cs1, gsbi6_spi_cs1, gsbi7_spi_cs1, NA, NA, NA, NA, NA, NA),
-       PINGROUP(48, spkr_i2s, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(49, spkr_i2s, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(50, spkr_i2s, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(51, NA, gsbi5, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(52, NA, gsbi5, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(53, NA, gsbi5, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(54, NA, gsbi5, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(55, tsif1, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(56, tsif1, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(57, tsif1, sdc2, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(58, tsif2, sdc2, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(59, tsif2, sdc2, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(60, tsif2, sdc2, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(61, NA, sdc2, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(62, NA, sdc2, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(63, NA, sdc4, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(64, riva_wlan, sdc4, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(65, riva_wlan, sdc4, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(66, riva_wlan, sdc4, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(67, riva_wlan, sdc4, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(68, riva_wlan, sdc4, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(69, hdmi, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(70, hdmi, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(71, hdmi, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(72, hdmi, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(73, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(74, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(75, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(76, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(77, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(78, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(79, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(80, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(81, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(82, NA, gsbi7, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(83, gsbi7, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(84, NA, gsbi7, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(85, NA, NA, gsbi7, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(86, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(87, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(88, usb2_hsic, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(89, usb2_hsic, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-
-       SDC_PINGROUP(sdc1_clk, 0x20a0, 13, 6),
-       SDC_PINGROUP(sdc1_cmd, 0x20a0, 11, 3),
-       SDC_PINGROUP(sdc1_data, 0x20a0, 9, 0),
-
-       SDC_PINGROUP(sdc3_clk, 0x20a4, 14, 6),
-       SDC_PINGROUP(sdc3_cmd, 0x20a4, 11, 3),
-       SDC_PINGROUP(sdc3_data, 0x20a4, 9, 0),
-};
-
-#define NUM_GPIO_PINGROUPS 90
-
-static const struct msm_pinctrl_soc_data apq8064_pinctrl = {
-       .pins = apq8064_pins,
-       .npins = ARRAY_SIZE(apq8064_pins),
-       .functions = apq8064_functions,
-       .nfunctions = ARRAY_SIZE(apq8064_functions),
-       .groups = apq8064_groups,
-       .ngroups = ARRAY_SIZE(apq8064_groups),
-       .ngpios = NUM_GPIO_PINGROUPS,
-};
-
-static int apq8064_pinctrl_probe(struct platform_device *pdev)
-{
-       return msm_pinctrl_probe(pdev, &apq8064_pinctrl);
-}
-
-static const struct of_device_id apq8064_pinctrl_of_match[] = {
-       { .compatible = "qcom,apq8064-pinctrl", },
-       { },
-};
-
-static struct platform_driver apq8064_pinctrl_driver = {
-       .driver = {
-               .name = "apq8064-pinctrl",
-               .owner = THIS_MODULE,
-               .of_match_table = apq8064_pinctrl_of_match,
-       },
-       .probe = apq8064_pinctrl_probe,
-       .remove = msm_pinctrl_remove,
-};
-
-static int __init apq8064_pinctrl_init(void)
-{
-       return platform_driver_register(&apq8064_pinctrl_driver);
-}
-arch_initcall(apq8064_pinctrl_init);
-
-static void __exit apq8064_pinctrl_exit(void)
-{
-       platform_driver_unregister(&apq8064_pinctrl_driver);
-}
-module_exit(apq8064_pinctrl_exit);
-
-MODULE_AUTHOR("Bjorn Andersson <bjorn.andersson@sonymobile.com>");
-MODULE_DESCRIPTION("Qualcomm APQ8064 pinctrl driver");
-MODULE_LICENSE("GPL v2");
-MODULE_DEVICE_TABLE(of, apq8064_pinctrl_of_match);
index c862f9c0e9ce4cb356222b496c40ca1ac26b0699..0e4ec91f4d491693cd23e10186a59412f8a9edff 100644 (file)
@@ -565,7 +565,6 @@ static int as3722_pinctrl_probe(struct platform_device *pdev)
 {
        struct as3722_pctrl_info *as_pci;
        int ret;
-       int tret;
 
        as_pci = devm_kzalloc(&pdev->dev, sizeof(*as_pci), GFP_KERNEL);
        if (!as_pci)
@@ -611,10 +610,7 @@ static int as3722_pinctrl_probe(struct platform_device *pdev)
        return 0;
 
 fail_range_add:
-       tret = gpiochip_remove(&as_pci->gpio_chip);
-       if (tret < 0)
-               dev_warn(&pdev->dev, "Couldn't remove gpio chip, %d\n", tret);
-
+       gpiochip_remove(&as_pci->gpio_chip);
 fail_chip_add:
        pinctrl_unregister(as_pci->pctl);
        return ret;
@@ -623,11 +619,8 @@ fail_chip_add:
 static int as3722_pinctrl_remove(struct platform_device *pdev)
 {
        struct as3722_pctrl_info *as_pci = platform_get_drvdata(pdev);
-       int ret;
 
-       ret = gpiochip_remove(&as_pci->gpio_chip);
-       if (ret < 0)
-               return ret;
+       gpiochip_remove(&as_pci->gpio_chip);
        pinctrl_unregister(as_pci->pctl);
        return 0;
 }
index 421493cb490c52a9f434df0ffd041c91c31536b9..af1ba4fc150dd4e10509b8e53ccab89458d7d09a 100644 (file)
@@ -611,26 +611,6 @@ static int at91_pmx_enable(struct pinctrl_dev *pctldev, unsigned selector,
        return 0;
 }
 
-static void at91_pmx_disable(struct pinctrl_dev *pctldev, unsigned selector,
-                          unsigned group)
-{
-       struct at91_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
-       const struct at91_pmx_pin *pins_conf = info->groups[group].pins_conf;
-       const struct at91_pmx_pin *pin;
-       uint32_t npins = info->groups[group].npins;
-       int i;
-       unsigned mask;
-       void __iomem *pio;
-
-       for (i = 0; i < npins; i++) {
-               pin = &pins_conf[i];
-               at91_pin_dbg(info->dev, pin);
-               pio = pin_to_controller(info, pin->bank);
-               mask = pin_to_mask(pin->pin);
-               at91_mux_gpio_enable(pio, mask, 1);
-       }
-}
-
 static int at91_pmx_get_funcs_count(struct pinctrl_dev *pctldev)
 {
        struct at91_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
@@ -705,7 +685,6 @@ static const struct pinmux_ops at91_pmx_ops = {
        .get_function_name      = at91_pmx_get_func_name,
        .get_function_groups    = at91_pmx_get_groups,
        .enable                 = at91_pmx_enable,
-       .disable                = at91_pmx_disable,
        .gpio_request_enable    = at91_gpio_request_enable,
        .gpio_disable_free      = at91_gpio_disable_free,
 };
@@ -793,9 +772,9 @@ static void at91_pinconf_dbg_show(struct pinctrl_dev *pctldev,
                                   struct seq_file *s, unsigned pin_id)
 {
        unsigned long config;
-       int ret, val, num_conf = 0;
+       int val, num_conf = 0;
 
-       ret = at91_pinconf_get(pctldev, pin_id, &config);
+       at91_pinconf_get(pctldev, pin_id, &config);
 
        DBG_SHOW_FLAG(MULTI_DRIVE);
        DBG_SHOW_FLAG(PULL_UP);
@@ -945,7 +924,7 @@ static int at91_pinctrl_parse_functions(struct device_node *np,
        /* Initialise function */
        func->name = np->name;
        func->ngroups = of_get_child_count(np);
-       if (func->ngroups <= 0) {
+       if (func->ngroups == 0) {
                dev_err(info->dev, "no groups defined\n");
                return -EINVAL;
        }
index 975572e2f260442a4ecd7baf54728664ca81e0f0..9ca59a01874316585a190093b0265401e17975a3 100644 (file)
@@ -25,9 +25,7 @@
 #include <linux/types.h>
 #include <linux/bitops.h>
 #include <linux/interrupt.h>
-#include <linux/irq.h>
 #include <linux/gpio.h>
-#include <linux/irqdomain.h>
 #include <linux/acpi.h>
 #include <linux/platform_device.h>
 #include <linux/seq_file.h>
@@ -44,6 +42,7 @@
 
 /* BYT_CONF0_REG register bits */
 #define BYT_IODEN              BIT(31)
+#define BYT_DIRECT_IRQ_EN      BIT(27)
 #define BYT_TRIG_NEG           BIT(26)
 #define BYT_TRIG_POS           BIT(25)
 #define BYT_TRIG_LVL           BIT(24)
@@ -137,7 +136,6 @@ static struct pinctrl_gpio_range byt_ranges[] = {
 
 struct byt_gpio {
        struct gpio_chip                chip;
-       struct irq_domain               *domain;
        struct platform_device          *pdev;
        spinlock_t                      lock;
        void __iomem                    *reg_base;
@@ -217,7 +215,7 @@ static void byt_gpio_free(struct gpio_chip *chip, unsigned offset)
 
 static int byt_irq_type(struct irq_data *d, unsigned type)
 {
-       struct byt_gpio *vg = irq_data_get_irq_chip_data(d);
+       struct byt_gpio *vg = to_byt_gpio(irq_data_get_irq_chip_data(d));
        u32 offset = irqd_to_hwirq(d);
        u32 value;
        unsigned long flags;
@@ -303,12 +301,22 @@ static int byt_gpio_direction_output(struct gpio_chip *chip,
                                     unsigned gpio, int value)
 {
        struct byt_gpio *vg = to_byt_gpio(chip);
+       void __iomem *conf_reg = byt_gpio_reg(chip, gpio, BYT_CONF0_REG);
        void __iomem *reg = byt_gpio_reg(chip, gpio, BYT_VAL_REG);
        unsigned long flags;
        u32 reg_val;
 
        spin_lock_irqsave(&vg->lock, flags);
 
+       /*
+        * Before making any direction modifications, do a check if gpio
+        * is set for direct IRQ.  On baytrail, setting GPIO to output does
+        * not make sense, so let's at least warn the caller before they shoot
+        * themselves in the foot.
+        */
+       WARN(readl(conf_reg) & BYT_DIRECT_IRQ_EN,
+               "Potential Error: Setting GPIO with direct_irq_en to output");
+
        reg_val = readl(reg) | BYT_DIR_MASK;
        reg_val &= ~BYT_OUTPUT_EN;
 
@@ -393,16 +401,10 @@ static void byt_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
        spin_unlock_irqrestore(&vg->lock, flags);
 }
 
-static int byt_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
-{
-       struct byt_gpio *vg = to_byt_gpio(chip);
-       return irq_create_mapping(vg->domain, offset);
-}
-
 static void byt_gpio_irq_handler(unsigned irq, struct irq_desc *desc)
 {
        struct irq_data *data = irq_desc_get_irq_data(desc);
-       struct byt_gpio *vg = irq_data_get_irq_handler_data(data);
+       struct byt_gpio *vg = to_byt_gpio(irq_desc_get_handler_data(desc));
        struct irq_chip *chip = irq_data_get_irq_chip(data);
        u32 base, pin, mask;
        void __iomem *reg;
@@ -421,7 +423,7 @@ static void byt_gpio_irq_handler(unsigned irq, struct irq_desc *desc)
                        /* Clear before handling so we can't lose an edge */
                        writel(mask, reg);
 
-                       virq = irq_find_mapping(vg->domain, base + pin);
+                       virq = irq_find_mapping(vg->chip.irqdomain, base + pin);
                        generic_handle_irq(virq);
 
                        /* In case bios or user sets triggering incorretly a pin
@@ -454,33 +456,11 @@ static void byt_irq_mask(struct irq_data *d)
 {
 }
 
-static int byt_irq_reqres(struct irq_data *d)
-{
-       struct byt_gpio *vg = irq_data_get_irq_chip_data(d);
-
-       if (gpio_lock_as_irq(&vg->chip, irqd_to_hwirq(d))) {
-               dev_err(vg->chip.dev,
-                       "unable to lock HW IRQ %lu for IRQ\n",
-                       irqd_to_hwirq(d));
-               return -EINVAL;
-       }
-       return 0;
-}
-
-static void byt_irq_relres(struct irq_data *d)
-{
-       struct byt_gpio *vg = irq_data_get_irq_chip_data(d);
-
-       gpio_unlock_as_irq(&vg->chip, irqd_to_hwirq(d));
-}
-
 static struct irq_chip byt_irqchip = {
        .name = "BYT-GPIO",
        .irq_mask = byt_irq_mask,
        .irq_unmask = byt_irq_unmask,
        .irq_set_type = byt_irq_type,
-       .irq_request_resources = byt_irq_reqres,
-       .irq_release_resources = byt_irq_relres,
 };
 
 static void byt_gpio_irq_init_hw(struct byt_gpio *vg)
@@ -501,23 +481,6 @@ static void byt_gpio_irq_init_hw(struct byt_gpio *vg)
        }
 }
 
-static int byt_gpio_irq_map(struct irq_domain *d, unsigned int virq,
-                           irq_hw_number_t hw)
-{
-       struct byt_gpio *vg = d->host_data;
-
-       irq_set_chip_and_handler_name(virq, &byt_irqchip, handle_simple_irq,
-                                     "demux");
-       irq_set_chip_data(virq, vg);
-       irq_set_irq_type(virq, IRQ_TYPE_NONE);
-
-       return 0;
-}
-
-static const struct irq_domain_ops byt_gpio_irq_ops = {
-       .map = byt_gpio_irq_map,
-};
-
 static int byt_gpio_probe(struct platform_device *pdev)
 {
        struct byt_gpio *vg;
@@ -527,7 +490,6 @@ static int byt_gpio_probe(struct platform_device *pdev)
        struct acpi_device *acpi_dev;
        struct pinctrl_gpio_range *range;
        acpi_handle handle = ACPI_HANDLE(dev);
-       unsigned hwirq;
        int ret;
 
        if (acpi_bus_get_device(handle, &acpi_dev))
@@ -574,27 +536,27 @@ static int byt_gpio_probe(struct platform_device *pdev)
        gc->can_sleep = false;
        gc->dev = dev;
 
+       ret = gpiochip_add(gc);
+       if (ret) {
+               dev_err(&pdev->dev, "failed adding byt-gpio chip\n");
+               return ret;
+       }
+
        /* set up interrupts  */
        irq_rc = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
        if (irq_rc && irq_rc->start) {
-               hwirq = irq_rc->start;
-               gc->to_irq = byt_gpio_to_irq;
-
-               vg->domain = irq_domain_add_linear(NULL, gc->ngpio,
-                                                  &byt_gpio_irq_ops, vg);
-               if (!vg->domain)
-                       return -ENXIO;
-
                byt_gpio_irq_init_hw(vg);
+               ret = gpiochip_irqchip_add(gc, &byt_irqchip, 0,
+                                          handle_simple_irq, IRQ_TYPE_NONE);
+               if (ret) {
+                       dev_err(dev, "failed to add irqchip\n");
+                       gpiochip_remove(gc);
+                       return ret;
+               }
 
-               irq_set_handler_data(hwirq, vg);
-               irq_set_chained_handler(hwirq, byt_gpio_irq_handler);
-       }
-
-       ret = gpiochip_add(gc);
-       if (ret) {
-               dev_err(&pdev->dev, "failed adding byt-gpio chip\n");
-               return ret;
+               gpiochip_set_chained_irqchip(gc, &byt_irqchip,
+                                            (unsigned)irq_rc->start,
+                                            byt_gpio_irq_handler);
        }
 
        pm_runtime_enable(dev);
@@ -627,12 +589,9 @@ MODULE_DEVICE_TABLE(acpi, byt_gpio_acpi_match);
 static int byt_gpio_remove(struct platform_device *pdev)
 {
        struct byt_gpio *vg = platform_get_drvdata(pdev);
-       int err;
 
        pm_runtime_disable(&pdev->dev);
-       err = gpiochip_remove(&vg->chip);
-       if (err)
-               dev_warn(&pdev->dev, "failed to remove gpio_chip.\n");
+       gpiochip_remove(&vg->chip);
 
        return 0;
 }
index 3bed792b2c03b03da1ca0721548f19a04fb16619..c5ca9e633fffbb76aeb1dd176859bcacccd32725 100644 (file)
@@ -1396,7 +1396,7 @@ static struct pinctrl_desc bcm281xx_pinctrl_desc = {
        .owner = THIS_MODULE,
 };
 
-int __init bcm281xx_pinctrl_probe(struct platform_device *pdev)
+static int __init bcm281xx_pinctrl_probe(struct platform_device *pdev)
 {
        struct bcm281xx_pinctrl_data *pdata = &bcm281xx_pinctrl;
        struct resource *res;
index 3d907de9bc91501cc7a83ccd7cfab487bbcab265..5bcfd7ace0cd207eeddfa310663df8c5494ff6a2 100644 (file)
@@ -841,16 +841,6 @@ static int bcm2835_pmx_enable(struct pinctrl_dev *pctldev,
        return 0;
 }
 
-static void bcm2835_pmx_disable(struct pinctrl_dev *pctldev,
-               unsigned func_selector,
-               unsigned group_selector)
-{
-       struct bcm2835_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev);
-
-       /* disable by setting to GPIO_IN */
-       bcm2835_pinctrl_fsel_set(pc, group_selector, BCM2835_FSEL_GPIO_IN);
-}
-
 static void bcm2835_pmx_gpio_disable_free(struct pinctrl_dev *pctldev,
                struct pinctrl_gpio_range *range,
                unsigned offset)
@@ -880,7 +870,6 @@ static const struct pinmux_ops bcm2835_pmx_ops = {
        .get_function_name = bcm2835_pmx_get_function_name,
        .get_function_groups = bcm2835_pmx_get_function_groups,
        .enable = bcm2835_pmx_enable,
-       .disable = bcm2835_pmx_disable,
        .gpio_disable_free = bcm2835_pmx_gpio_disable_free,
        .gpio_set_direction = bcm2835_pmx_gpio_set_direction,
 };
index d182fdd2e7158c17003b4f3dd187aa65f7a59027..29cbbab8c3a673cecb6225e45c7bb8343700c2a6 100644 (file)
@@ -756,8 +756,7 @@ static int __init u300_gpio_probe(struct platform_device *pdev)
 
 err_no_range:
 err_no_irqchip:
-       if (gpiochip_remove(&gpio->chip))
-               dev_err(&pdev->dev, "failed to remove gpio chip\n");
+       gpiochip_remove(&gpio->chip);
 err_no_chip:
        clk_disable_unprepare(gpio->clk);
        dev_err(&pdev->dev, "module ERROR:%d\n", err);
@@ -767,16 +766,11 @@ err_no_chip:
 static int __exit u300_gpio_remove(struct platform_device *pdev)
 {
        struct u300_gpio *gpio = platform_get_drvdata(pdev);
-       int err;
 
        /* Turn off the GPIO block */
        writel(0x00000000U, gpio->base + U300_GPIO_CR);
 
-       err = gpiochip_remove(&gpio->chip);
-       if (err < 0) {
-               dev_err(gpio->dev, "unable to remove gpiochip: %d\n", err);
-               return err;
-       }
+       gpiochip_remove(&gpio->chip);
        clk_disable_unprepare(gpio->clk);
        return 0;
 }
diff --git a/drivers/pinctrl/pinctrl-exynos.c b/drivers/pinctrl/pinctrl-exynos.c
deleted file mode 100644 (file)
index 9609c23..0000000
+++ /dev/null
@@ -1,1310 +0,0 @@
-/*
- * Exynos specific support for Samsung pinctrl/gpiolib driver with eint support.
- *
- * Copyright (c) 2012 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- * Copyright (c) 2012 Linaro Ltd
- *             http://www.linaro.org
- *
- * Author: Thomas Abraham <thomas.ab@samsung.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This file contains the Samsung Exynos specific information required by the
- * the Samsung pinctrl/gpiolib driver. It also includes the implementation of
- * external gpio and wakeup interrupt support.
- */
-
-#include <linux/module.h>
-#include <linux/device.h>
-#include <linux/interrupt.h>
-#include <linux/irqdomain.h>
-#include <linux/irq.h>
-#include <linux/irqchip/chained_irq.h>
-#include <linux/of_irq.h>
-#include <linux/io.h>
-#include <linux/slab.h>
-#include <linux/spinlock.h>
-#include <linux/err.h>
-
-#include "pinctrl-samsung.h"
-#include "pinctrl-exynos.h"
-
-
-static struct samsung_pin_bank_type bank_type_off = {
-       .fld_width = { 4, 1, 2, 2, 2, 2, },
-       .reg_offset = { 0x00, 0x04, 0x08, 0x0c, 0x10, 0x14, },
-};
-
-static struct samsung_pin_bank_type bank_type_alive = {
-       .fld_width = { 4, 1, 2, 2, },
-       .reg_offset = { 0x00, 0x04, 0x08, 0x0c, },
-};
-
-/* list of external wakeup controllers supported */
-static const struct of_device_id exynos_wkup_irq_ids[] = {
-       { .compatible = "samsung,exynos4210-wakeup-eint", },
-       { }
-};
-
-static void exynos_gpio_irq_mask(struct irq_data *irqd)
-{
-       struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
-       struct samsung_pinctrl_drv_data *d = bank->drvdata;
-       unsigned long reg_mask = d->ctrl->geint_mask + bank->eint_offset;
-       unsigned long mask;
-       unsigned long flags;
-
-       spin_lock_irqsave(&bank->slock, flags);
-
-       mask = readl(d->virt_base + reg_mask);
-       mask |= 1 << irqd->hwirq;
-       writel(mask, d->virt_base + reg_mask);
-
-       spin_unlock_irqrestore(&bank->slock, flags);
-}
-
-static void exynos_gpio_irq_ack(struct irq_data *irqd)
-{
-       struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
-       struct samsung_pinctrl_drv_data *d = bank->drvdata;
-       unsigned long reg_pend = d->ctrl->geint_pend + bank->eint_offset;
-
-       writel(1 << irqd->hwirq, d->virt_base + reg_pend);
-}
-
-static void exynos_gpio_irq_unmask(struct irq_data *irqd)
-{
-       struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
-       struct samsung_pinctrl_drv_data *d = bank->drvdata;
-       unsigned long reg_mask = d->ctrl->geint_mask + bank->eint_offset;
-       unsigned long mask;
-       unsigned long flags;
-
-       /*
-        * Ack level interrupts right before unmask
-        *
-        * If we don't do this we'll get a double-interrupt.  Level triggered
-        * interrupts must not fire an interrupt if the level is not
-        * _currently_ active, even if it was active while the interrupt was
-        * masked.
-        */
-       if (irqd_get_trigger_type(irqd) & IRQ_TYPE_LEVEL_MASK)
-               exynos_gpio_irq_ack(irqd);
-
-       spin_lock_irqsave(&bank->slock, flags);
-
-       mask = readl(d->virt_base + reg_mask);
-       mask &= ~(1 << irqd->hwirq);
-       writel(mask, d->virt_base + reg_mask);
-
-       spin_unlock_irqrestore(&bank->slock, flags);
-}
-
-static int exynos_gpio_irq_set_type(struct irq_data *irqd, unsigned int type)
-{
-       struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
-       struct samsung_pin_bank_type *bank_type = bank->type;
-       struct samsung_pinctrl_drv_data *d = bank->drvdata;
-       struct samsung_pin_ctrl *ctrl = d->ctrl;
-       unsigned int pin = irqd->hwirq;
-       unsigned int shift = EXYNOS_EINT_CON_LEN * pin;
-       unsigned int con, trig_type;
-       unsigned long reg_con = ctrl->geint_con + bank->eint_offset;
-       unsigned long flags;
-       unsigned int mask;
-
-       switch (type) {
-       case IRQ_TYPE_EDGE_RISING:
-               trig_type = EXYNOS_EINT_EDGE_RISING;
-               break;
-       case IRQ_TYPE_EDGE_FALLING:
-               trig_type = EXYNOS_EINT_EDGE_FALLING;
-               break;
-       case IRQ_TYPE_EDGE_BOTH:
-               trig_type = EXYNOS_EINT_EDGE_BOTH;
-               break;
-       case IRQ_TYPE_LEVEL_HIGH:
-               trig_type = EXYNOS_EINT_LEVEL_HIGH;
-               break;
-       case IRQ_TYPE_LEVEL_LOW:
-               trig_type = EXYNOS_EINT_LEVEL_LOW;
-               break;
-       default:
-               pr_err("unsupported external interrupt type\n");
-               return -EINVAL;
-       }
-
-       if (type & IRQ_TYPE_EDGE_BOTH)
-               __irq_set_handler_locked(irqd->irq, handle_edge_irq);
-       else
-               __irq_set_handler_locked(irqd->irq, handle_level_irq);
-
-       con = readl(d->virt_base + reg_con);
-       con &= ~(EXYNOS_EINT_CON_MASK << shift);
-       con |= trig_type << shift;
-       writel(con, d->virt_base + reg_con);
-
-       reg_con = bank->pctl_offset + bank_type->reg_offset[PINCFG_TYPE_FUNC];
-       shift = pin * bank_type->fld_width[PINCFG_TYPE_FUNC];
-       mask = (1 << bank_type->fld_width[PINCFG_TYPE_FUNC]) - 1;
-
-       spin_lock_irqsave(&bank->slock, flags);
-
-       con = readl(d->virt_base + reg_con);
-       con &= ~(mask << shift);
-       con |= EXYNOS_EINT_FUNC << shift;
-       writel(con, d->virt_base + reg_con);
-
-       spin_unlock_irqrestore(&bank->slock, flags);
-
-       return 0;
-}
-
-/*
- * irq_chip for gpio interrupts.
- */
-static struct irq_chip exynos_gpio_irq_chip = {
-       .name           = "exynos_gpio_irq_chip",
-       .irq_unmask     = exynos_gpio_irq_unmask,
-       .irq_mask       = exynos_gpio_irq_mask,
-       .irq_ack                = exynos_gpio_irq_ack,
-       .irq_set_type   = exynos_gpio_irq_set_type,
-};
-
-static int exynos_gpio_irq_map(struct irq_domain *h, unsigned int virq,
-                                       irq_hw_number_t hw)
-{
-       struct samsung_pin_bank *b = h->host_data;
-
-       irq_set_chip_data(virq, b);
-       irq_set_chip_and_handler(virq, &exynos_gpio_irq_chip,
-                                       handle_level_irq);
-       set_irq_flags(virq, IRQF_VALID);
-       return 0;
-}
-
-/*
- * irq domain callbacks for external gpio interrupt controller.
- */
-static const struct irq_domain_ops exynos_gpio_irqd_ops = {
-       .map    = exynos_gpio_irq_map,
-       .xlate  = irq_domain_xlate_twocell,
-};
-
-static irqreturn_t exynos_eint_gpio_irq(int irq, void *data)
-{
-       struct samsung_pinctrl_drv_data *d = data;
-       struct samsung_pin_ctrl *ctrl = d->ctrl;
-       struct samsung_pin_bank *bank = ctrl->pin_banks;
-       unsigned int svc, group, pin, virq;
-
-       svc = readl(d->virt_base + ctrl->svc);
-       group = EXYNOS_SVC_GROUP(svc);
-       pin = svc & EXYNOS_SVC_NUM_MASK;
-
-       if (!group)
-               return IRQ_HANDLED;
-       bank += (group - 1);
-
-       virq = irq_linear_revmap(bank->irq_domain, pin);
-       if (!virq)
-               return IRQ_NONE;
-       generic_handle_irq(virq);
-       return IRQ_HANDLED;
-}
-
-struct exynos_eint_gpio_save {
-       u32 eint_con;
-       u32 eint_fltcon0;
-       u32 eint_fltcon1;
-};
-
-/*
- * exynos_eint_gpio_init() - setup handling of external gpio interrupts.
- * @d: driver data of samsung pinctrl driver.
- */
-static int exynos_eint_gpio_init(struct samsung_pinctrl_drv_data *d)
-{
-       struct samsung_pin_bank *bank;
-       struct device *dev = d->dev;
-       int ret;
-       int i;
-
-       if (!d->irq) {
-               dev_err(dev, "irq number not available\n");
-               return -EINVAL;
-       }
-
-       ret = devm_request_irq(dev, d->irq, exynos_eint_gpio_irq,
-                                       0, dev_name(dev), d);
-       if (ret) {
-               dev_err(dev, "irq request failed\n");
-               return -ENXIO;
-       }
-
-       bank = d->ctrl->pin_banks;
-       for (i = 0; i < d->ctrl->nr_banks; ++i, ++bank) {
-               if (bank->eint_type != EINT_TYPE_GPIO)
-                       continue;
-               bank->irq_domain = irq_domain_add_linear(bank->of_node,
-                               bank->nr_pins, &exynos_gpio_irqd_ops, bank);
-               if (!bank->irq_domain) {
-                       dev_err(dev, "gpio irq domain add failed\n");
-                       ret = -ENXIO;
-                       goto err_domains;
-               }
-
-               bank->soc_priv = devm_kzalloc(d->dev,
-                       sizeof(struct exynos_eint_gpio_save), GFP_KERNEL);
-               if (!bank->soc_priv) {
-                       irq_domain_remove(bank->irq_domain);
-                       ret = -ENOMEM;
-                       goto err_domains;
-               }
-       }
-
-       return 0;
-
-err_domains:
-       for (--i, --bank; i >= 0; --i, --bank) {
-               if (bank->eint_type != EINT_TYPE_GPIO)
-                       continue;
-               irq_domain_remove(bank->irq_domain);
-       }
-
-       return ret;
-}
-
-static void exynos_wkup_irq_mask(struct irq_data *irqd)
-{
-       struct samsung_pin_bank *b = irq_data_get_irq_chip_data(irqd);
-       struct samsung_pinctrl_drv_data *d = b->drvdata;
-       unsigned long reg_mask = d->ctrl->weint_mask + b->eint_offset;
-       unsigned long mask;
-       unsigned long flags;
-
-       spin_lock_irqsave(&b->slock, flags);
-
-       mask = readl(d->virt_base + reg_mask);
-       mask |= 1 << irqd->hwirq;
-       writel(mask, d->virt_base + reg_mask);
-
-       spin_unlock_irqrestore(&b->slock, flags);
-}
-
-static void exynos_wkup_irq_ack(struct irq_data *irqd)
-{
-       struct samsung_pin_bank *b = irq_data_get_irq_chip_data(irqd);
-       struct samsung_pinctrl_drv_data *d = b->drvdata;
-       unsigned long pend = d->ctrl->weint_pend + b->eint_offset;
-
-       writel(1 << irqd->hwirq, d->virt_base + pend);
-}
-
-static void exynos_wkup_irq_unmask(struct irq_data *irqd)
-{
-       struct samsung_pin_bank *b = irq_data_get_irq_chip_data(irqd);
-       struct samsung_pinctrl_drv_data *d = b->drvdata;
-       unsigned long reg_mask = d->ctrl->weint_mask + b->eint_offset;
-       unsigned long mask;
-       unsigned long flags;
-
-       /*
-        * Ack level interrupts right before unmask
-        *
-        * If we don't do this we'll get a double-interrupt.  Level triggered
-        * interrupts must not fire an interrupt if the level is not
-        * _currently_ active, even if it was active while the interrupt was
-        * masked.
-        */
-       if (irqd_get_trigger_type(irqd) & IRQ_TYPE_LEVEL_MASK)
-               exynos_wkup_irq_ack(irqd);
-
-       spin_lock_irqsave(&b->slock, flags);
-
-       mask = readl(d->virt_base + reg_mask);
-       mask &= ~(1 << irqd->hwirq);
-       writel(mask, d->virt_base + reg_mask);
-
-       spin_unlock_irqrestore(&b->slock, flags);
-}
-
-static int exynos_wkup_irq_set_type(struct irq_data *irqd, unsigned int type)
-{
-       struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
-       struct samsung_pin_bank_type *bank_type = bank->type;
-       struct samsung_pinctrl_drv_data *d = bank->drvdata;
-       unsigned int pin = irqd->hwirq;
-       unsigned long reg_con = d->ctrl->weint_con + bank->eint_offset;
-       unsigned long shift = EXYNOS_EINT_CON_LEN * pin;
-       unsigned long con, trig_type;
-       unsigned long flags;
-       unsigned int mask;
-
-       switch (type) {
-       case IRQ_TYPE_EDGE_RISING:
-               trig_type = EXYNOS_EINT_EDGE_RISING;
-               break;
-       case IRQ_TYPE_EDGE_FALLING:
-               trig_type = EXYNOS_EINT_EDGE_FALLING;
-               break;
-       case IRQ_TYPE_EDGE_BOTH:
-               trig_type = EXYNOS_EINT_EDGE_BOTH;
-               break;
-       case IRQ_TYPE_LEVEL_HIGH:
-               trig_type = EXYNOS_EINT_LEVEL_HIGH;
-               break;
-       case IRQ_TYPE_LEVEL_LOW:
-               trig_type = EXYNOS_EINT_LEVEL_LOW;
-               break;
-       default:
-               pr_err("unsupported external interrupt type\n");
-               return -EINVAL;
-       }
-
-       if (type & IRQ_TYPE_EDGE_BOTH)
-               __irq_set_handler_locked(irqd->irq, handle_edge_irq);
-       else
-               __irq_set_handler_locked(irqd->irq, handle_level_irq);
-
-       con = readl(d->virt_base + reg_con);
-       con &= ~(EXYNOS_EINT_CON_MASK << shift);
-       con |= trig_type << shift;
-       writel(con, d->virt_base + reg_con);
-
-       reg_con = bank->pctl_offset + bank_type->reg_offset[PINCFG_TYPE_FUNC];
-       shift = pin * bank_type->fld_width[PINCFG_TYPE_FUNC];
-       mask = (1 << bank_type->fld_width[PINCFG_TYPE_FUNC]) - 1;
-
-       spin_lock_irqsave(&bank->slock, flags);
-
-       con = readl(d->virt_base + reg_con);
-       con &= ~(mask << shift);
-       con |= EXYNOS_EINT_FUNC << shift;
-       writel(con, d->virt_base + reg_con);
-
-       spin_unlock_irqrestore(&bank->slock, flags);
-
-       return 0;
-}
-
-static u32 exynos_eint_wake_mask = 0xffffffff;
-
-u32 exynos_get_eint_wake_mask(void)
-{
-       return exynos_eint_wake_mask;
-}
-
-static int exynos_wkup_irq_set_wake(struct irq_data *irqd, unsigned int on)
-{
-       struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
-       unsigned long bit = 1UL << (2 * bank->eint_offset + irqd->hwirq);
-
-       pr_info("wake %s for irq %d\n", on ? "enabled" : "disabled", irqd->irq);
-
-       if (!on)
-               exynos_eint_wake_mask |= bit;
-       else
-               exynos_eint_wake_mask &= ~bit;
-
-       return 0;
-}
-
-/*
- * irq_chip for wakeup interrupts
- */
-static struct irq_chip exynos_wkup_irq_chip = {
-       .name   = "exynos_wkup_irq_chip",
-       .irq_unmask     = exynos_wkup_irq_unmask,
-       .irq_mask       = exynos_wkup_irq_mask,
-       .irq_ack        = exynos_wkup_irq_ack,
-       .irq_set_type   = exynos_wkup_irq_set_type,
-       .irq_set_wake   = exynos_wkup_irq_set_wake,
-};
-
-/* interrupt handler for wakeup interrupts 0..15 */
-static void exynos_irq_eint0_15(unsigned int irq, struct irq_desc *desc)
-{
-       struct exynos_weint_data *eintd = irq_get_handler_data(irq);
-       struct samsung_pin_bank *bank = eintd->bank;
-       struct irq_chip *chip = irq_get_chip(irq);
-       int eint_irq;
-
-       chained_irq_enter(chip, desc);
-       chip->irq_mask(&desc->irq_data);
-
-       if (chip->irq_ack)
-               chip->irq_ack(&desc->irq_data);
-
-       eint_irq = irq_linear_revmap(bank->irq_domain, eintd->irq);
-       generic_handle_irq(eint_irq);
-       chip->irq_unmask(&desc->irq_data);
-       chained_irq_exit(chip, desc);
-}
-
-static inline void exynos_irq_demux_eint(unsigned long pend,
-                                               struct irq_domain *domain)
-{
-       unsigned int irq;
-
-       while (pend) {
-               irq = fls(pend) - 1;
-               generic_handle_irq(irq_find_mapping(domain, irq));
-               pend &= ~(1 << irq);
-       }
-}
-
-/* interrupt handler for wakeup interrupt 16 */
-static void exynos_irq_demux_eint16_31(unsigned int irq, struct irq_desc *desc)
-{
-       struct irq_chip *chip = irq_get_chip(irq);
-       struct exynos_muxed_weint_data *eintd = irq_get_handler_data(irq);
-       struct samsung_pinctrl_drv_data *d = eintd->banks[0]->drvdata;
-       struct samsung_pin_ctrl *ctrl = d->ctrl;
-       unsigned long pend;
-       unsigned long mask;
-       int i;
-
-       chained_irq_enter(chip, desc);
-
-       for (i = 0; i < eintd->nr_banks; ++i) {
-               struct samsung_pin_bank *b = eintd->banks[i];
-               pend = readl(d->virt_base + ctrl->weint_pend + b->eint_offset);
-               mask = readl(d->virt_base + ctrl->weint_mask + b->eint_offset);
-               exynos_irq_demux_eint(pend & ~mask, b->irq_domain);
-       }
-
-       chained_irq_exit(chip, desc);
-}
-
-static int exynos_wkup_irq_map(struct irq_domain *h, unsigned int virq,
-                                       irq_hw_number_t hw)
-{
-       irq_set_chip_and_handler(virq, &exynos_wkup_irq_chip, handle_level_irq);
-       irq_set_chip_data(virq, h->host_data);
-       set_irq_flags(virq, IRQF_VALID);
-       return 0;
-}
-
-/*
- * irq domain callbacks for external wakeup interrupt controller.
- */
-static const struct irq_domain_ops exynos_wkup_irqd_ops = {
-       .map    = exynos_wkup_irq_map,
-       .xlate  = irq_domain_xlate_twocell,
-};
-
-/*
- * exynos_eint_wkup_init() - setup handling of external wakeup interrupts.
- * @d: driver data of samsung pinctrl driver.
- */
-static int exynos_eint_wkup_init(struct samsung_pinctrl_drv_data *d)
-{
-       struct device *dev = d->dev;
-       struct device_node *wkup_np = NULL;
-       struct device_node *np;
-       struct samsung_pin_bank *bank;
-       struct exynos_weint_data *weint_data;
-       struct exynos_muxed_weint_data *muxed_data;
-       unsigned int muxed_banks = 0;
-       unsigned int i;
-       int idx, irq;
-
-       for_each_child_of_node(dev->of_node, np) {
-               if (of_match_node(exynos_wkup_irq_ids, np)) {
-                       wkup_np = np;
-                       break;
-               }
-       }
-       if (!wkup_np)
-               return -ENODEV;
-
-       bank = d->ctrl->pin_banks;
-       for (i = 0; i < d->ctrl->nr_banks; ++i, ++bank) {
-               if (bank->eint_type != EINT_TYPE_WKUP)
-                       continue;
-
-               bank->irq_domain = irq_domain_add_linear(bank->of_node,
-                               bank->nr_pins, &exynos_wkup_irqd_ops, bank);
-               if (!bank->irq_domain) {
-                       dev_err(dev, "wkup irq domain add failed\n");
-                       return -ENXIO;
-               }
-
-               if (!of_find_property(bank->of_node, "interrupts", NULL)) {
-                       bank->eint_type = EINT_TYPE_WKUP_MUX;
-                       ++muxed_banks;
-                       continue;
-               }
-
-               weint_data = devm_kzalloc(dev, bank->nr_pins
-                                       * sizeof(*weint_data), GFP_KERNEL);
-               if (!weint_data) {
-                       dev_err(dev, "could not allocate memory for weint_data\n");
-                       return -ENOMEM;
-               }
-
-               for (idx = 0; idx < bank->nr_pins; ++idx) {
-                       irq = irq_of_parse_and_map(bank->of_node, idx);
-                       if (!irq) {
-                               dev_err(dev, "irq number for eint-%s-%d not found\n",
-                                                       bank->name, idx);
-                               continue;
-                       }
-                       weint_data[idx].irq = idx;
-                       weint_data[idx].bank = bank;
-                       irq_set_handler_data(irq, &weint_data[idx]);
-                       irq_set_chained_handler(irq, exynos_irq_eint0_15);
-               }
-       }
-
-       if (!muxed_banks)
-               return 0;
-
-       irq = irq_of_parse_and_map(wkup_np, 0);
-       if (!irq) {
-               dev_err(dev, "irq number for muxed EINTs not found\n");
-               return 0;
-       }
-
-       muxed_data = devm_kzalloc(dev, sizeof(*muxed_data)
-               + muxed_banks*sizeof(struct samsung_pin_bank *), GFP_KERNEL);
-       if (!muxed_data) {
-               dev_err(dev, "could not allocate memory for muxed_data\n");
-               return -ENOMEM;
-       }
-
-       irq_set_chained_handler(irq, exynos_irq_demux_eint16_31);
-       irq_set_handler_data(irq, muxed_data);
-
-       bank = d->ctrl->pin_banks;
-       idx = 0;
-       for (i = 0; i < d->ctrl->nr_banks; ++i, ++bank) {
-               if (bank->eint_type != EINT_TYPE_WKUP_MUX)
-                       continue;
-
-               muxed_data->banks[idx++] = bank;
-       }
-       muxed_data->nr_banks = muxed_banks;
-
-       return 0;
-}
-
-static void exynos_pinctrl_suspend_bank(
-                               struct samsung_pinctrl_drv_data *drvdata,
-                               struct samsung_pin_bank *bank)
-{
-       struct exynos_eint_gpio_save *save = bank->soc_priv;
-       void __iomem *regs = drvdata->virt_base;
-
-       save->eint_con = readl(regs + EXYNOS_GPIO_ECON_OFFSET
-                                               + bank->eint_offset);
-       save->eint_fltcon0 = readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET
-                                               + 2 * bank->eint_offset);
-       save->eint_fltcon1 = readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET
-                                               + 2 * bank->eint_offset + 4);
-
-       pr_debug("%s: save     con %#010x\n", bank->name, save->eint_con);
-       pr_debug("%s: save fltcon0 %#010x\n", bank->name, save->eint_fltcon0);
-       pr_debug("%s: save fltcon1 %#010x\n", bank->name, save->eint_fltcon1);
-}
-
-static void exynos_pinctrl_suspend(struct samsung_pinctrl_drv_data *drvdata)
-{
-       struct samsung_pin_ctrl *ctrl = drvdata->ctrl;
-       struct samsung_pin_bank *bank = ctrl->pin_banks;
-       int i;
-
-       for (i = 0; i < ctrl->nr_banks; ++i, ++bank)
-               if (bank->eint_type == EINT_TYPE_GPIO)
-                       exynos_pinctrl_suspend_bank(drvdata, bank);
-}
-
-static void exynos_pinctrl_resume_bank(
-                               struct samsung_pinctrl_drv_data *drvdata,
-                               struct samsung_pin_bank *bank)
-{
-       struct exynos_eint_gpio_save *save = bank->soc_priv;
-       void __iomem *regs = drvdata->virt_base;
-
-       pr_debug("%s:     con %#010x => %#010x\n", bank->name,
-                       readl(regs + EXYNOS_GPIO_ECON_OFFSET
-                       + bank->eint_offset), save->eint_con);
-       pr_debug("%s: fltcon0 %#010x => %#010x\n", bank->name,
-                       readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET
-                       + 2 * bank->eint_offset), save->eint_fltcon0);
-       pr_debug("%s: fltcon1 %#010x => %#010x\n", bank->name,
-                       readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET
-                       + 2 * bank->eint_offset + 4), save->eint_fltcon1);
-
-       writel(save->eint_con, regs + EXYNOS_GPIO_ECON_OFFSET
-                                               + bank->eint_offset);
-       writel(save->eint_fltcon0, regs + EXYNOS_GPIO_EFLTCON_OFFSET
-                                               + 2 * bank->eint_offset);
-       writel(save->eint_fltcon1, regs + EXYNOS_GPIO_EFLTCON_OFFSET
-                                               + 2 * bank->eint_offset + 4);
-}
-
-static void exynos_pinctrl_resume(struct samsung_pinctrl_drv_data *drvdata)
-{
-       struct samsung_pin_ctrl *ctrl = drvdata->ctrl;
-       struct samsung_pin_bank *bank = ctrl->pin_banks;
-       int i;
-
-       for (i = 0; i < ctrl->nr_banks; ++i, ++bank)
-               if (bank->eint_type == EINT_TYPE_GPIO)
-                       exynos_pinctrl_resume_bank(drvdata, bank);
-}
-
-/* pin banks of s5pv210 pin-controller */
-static struct samsung_pin_bank s5pv210_pin_bank[] = {
-       EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
-       EXYNOS_PIN_BANK_EINTG(4, 0x020, "gpa1", 0x04),
-       EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpb", 0x08),
-       EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpc0", 0x0c),
-       EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpc1", 0x10),
-       EXYNOS_PIN_BANK_EINTG(4, 0x0a0, "gpd0", 0x14),
-       EXYNOS_PIN_BANK_EINTG(6, 0x0c0, "gpd1", 0x18),
-       EXYNOS_PIN_BANK_EINTG(8, 0x0e0, "gpe0", 0x1c),
-       EXYNOS_PIN_BANK_EINTG(5, 0x100, "gpe1", 0x20),
-       EXYNOS_PIN_BANK_EINTG(8, 0x120, "gpf0", 0x24),
-       EXYNOS_PIN_BANK_EINTG(8, 0x140, "gpf1", 0x28),
-       EXYNOS_PIN_BANK_EINTG(8, 0x160, "gpf2", 0x2c),
-       EXYNOS_PIN_BANK_EINTG(6, 0x180, "gpf3", 0x30),
-       EXYNOS_PIN_BANK_EINTG(7, 0x1a0, "gpg0", 0x34),
-       EXYNOS_PIN_BANK_EINTG(7, 0x1c0, "gpg1", 0x38),
-       EXYNOS_PIN_BANK_EINTG(7, 0x1e0, "gpg2", 0x3c),
-       EXYNOS_PIN_BANK_EINTG(7, 0x200, "gpg3", 0x40),
-       EXYNOS_PIN_BANK_EINTN(7, 0x220, "gpi"),
-       EXYNOS_PIN_BANK_EINTG(8, 0x240, "gpj0", 0x44),
-       EXYNOS_PIN_BANK_EINTG(6, 0x260, "gpj1", 0x48),
-       EXYNOS_PIN_BANK_EINTG(8, 0x280, "gpj2", 0x4c),
-       EXYNOS_PIN_BANK_EINTG(8, 0x2a0, "gpj3", 0x50),
-       EXYNOS_PIN_BANK_EINTG(5, 0x2c0, "gpj4", 0x54),
-       EXYNOS_PIN_BANK_EINTN(8, 0x2e0, "mp01"),
-       EXYNOS_PIN_BANK_EINTN(4, 0x300, "mp02"),
-       EXYNOS_PIN_BANK_EINTN(8, 0x320, "mp03"),
-       EXYNOS_PIN_BANK_EINTN(8, 0x340, "mp04"),
-       EXYNOS_PIN_BANK_EINTN(8, 0x360, "mp05"),
-       EXYNOS_PIN_BANK_EINTN(8, 0x380, "mp06"),
-       EXYNOS_PIN_BANK_EINTN(8, 0x3a0, "mp07"),
-       EXYNOS_PIN_BANK_EINTW(8, 0xc00, "gph0", 0x00),
-       EXYNOS_PIN_BANK_EINTW(8, 0xc20, "gph1", 0x04),
-       EXYNOS_PIN_BANK_EINTW(8, 0xc40, "gph2", 0x08),
-       EXYNOS_PIN_BANK_EINTW(8, 0xc60, "gph3", 0x0c),
-};
-
-struct samsung_pin_ctrl s5pv210_pin_ctrl[] = {
-       {
-               /* pin-controller instance 0 data */
-               .pin_banks      = s5pv210_pin_bank,
-               .nr_banks       = ARRAY_SIZE(s5pv210_pin_bank),
-               .geint_con      = EXYNOS_GPIO_ECON_OFFSET,
-               .geint_mask     = EXYNOS_GPIO_EMASK_OFFSET,
-               .geint_pend     = EXYNOS_GPIO_EPEND_OFFSET,
-               .weint_con      = EXYNOS_WKUP_ECON_OFFSET,
-               .weint_mask     = EXYNOS_WKUP_EMASK_OFFSET,
-               .weint_pend     = EXYNOS_WKUP_EPEND_OFFSET,
-               .svc            = EXYNOS_SVC_OFFSET,
-               .eint_gpio_init = exynos_eint_gpio_init,
-               .eint_wkup_init = exynos_eint_wkup_init,
-               .suspend        = exynos_pinctrl_suspend,
-               .resume         = exynos_pinctrl_resume,
-               .label          = "s5pv210-gpio-ctrl0",
-       },
-};
-
-/* pin banks of exynos3250 pin-controller 0 */
-static struct samsung_pin_bank exynos3250_pin_banks0[] = {
-       EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
-       EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
-       EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpb",  0x08),
-       EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpc0", 0x0c),
-       EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpc1", 0x10),
-       EXYNOS_PIN_BANK_EINTG(4, 0x0a0, "gpd0", 0x14),
-       EXYNOS_PIN_BANK_EINTG(4, 0x0c0, "gpd1", 0x18),
-};
-
-/* pin banks of exynos3250 pin-controller 1 */
-static struct samsung_pin_bank exynos3250_pin_banks1[] = {
-       EXYNOS_PIN_BANK_EINTN(8, 0x120, "gpe0"),
-       EXYNOS_PIN_BANK_EINTN(8, 0x140, "gpe1"),
-       EXYNOS_PIN_BANK_EINTN(3, 0x180, "gpe2"),
-       EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpk0", 0x08),
-       EXYNOS_PIN_BANK_EINTG(7, 0x060, "gpk1", 0x0c),
-       EXYNOS_PIN_BANK_EINTG(7, 0x080, "gpk2", 0x10),
-       EXYNOS_PIN_BANK_EINTG(4, 0x0c0, "gpl0", 0x18),
-       EXYNOS_PIN_BANK_EINTG(8, 0x260, "gpm0", 0x24),
-       EXYNOS_PIN_BANK_EINTG(7, 0x280, "gpm1", 0x28),
-       EXYNOS_PIN_BANK_EINTG(5, 0x2a0, "gpm2", 0x2c),
-       EXYNOS_PIN_BANK_EINTG(8, 0x2c0, "gpm3", 0x30),
-       EXYNOS_PIN_BANK_EINTG(8, 0x2e0, "gpm4", 0x34),
-       EXYNOS_PIN_BANK_EINTW(8, 0xc00, "gpx0", 0x00),
-       EXYNOS_PIN_BANK_EINTW(8, 0xc20, "gpx1", 0x04),
-       EXYNOS_PIN_BANK_EINTW(8, 0xc40, "gpx2", 0x08),
-       EXYNOS_PIN_BANK_EINTW(8, 0xc60, "gpx3", 0x0c),
-};
-
-/*
- * Samsung pinctrl driver data for Exynos3250 SoC. Exynos3250 SoC includes
- * two gpio/pin-mux/pinconfig controllers.
- */
-struct samsung_pin_ctrl exynos3250_pin_ctrl[] = {
-       {
-               /* pin-controller instance 0 data */
-               .pin_banks      = exynos3250_pin_banks0,
-               .nr_banks       = ARRAY_SIZE(exynos3250_pin_banks0),
-               .geint_con      = EXYNOS_GPIO_ECON_OFFSET,
-               .geint_mask     = EXYNOS_GPIO_EMASK_OFFSET,
-               .geint_pend     = EXYNOS_GPIO_EPEND_OFFSET,
-               .svc            = EXYNOS_SVC_OFFSET,
-               .eint_gpio_init = exynos_eint_gpio_init,
-               .suspend        = exynos_pinctrl_suspend,
-               .resume         = exynos_pinctrl_resume,
-               .label          = "exynos3250-gpio-ctrl0",
-       }, {
-               /* pin-controller instance 1 data */
-               .pin_banks      = exynos3250_pin_banks1,
-               .nr_banks       = ARRAY_SIZE(exynos3250_pin_banks1),
-               .geint_con      = EXYNOS_GPIO_ECON_OFFSET,
-               .geint_mask     = EXYNOS_GPIO_EMASK_OFFSET,
-               .geint_pend     = EXYNOS_GPIO_EPEND_OFFSET,
-               .weint_con      = EXYNOS_WKUP_ECON_OFFSET,
-               .weint_mask     = EXYNOS_WKUP_EMASK_OFFSET,
-               .weint_pend     = EXYNOS_WKUP_EPEND_OFFSET,
-               .svc            = EXYNOS_SVC_OFFSET,
-               .eint_gpio_init = exynos_eint_gpio_init,
-               .eint_wkup_init = exynos_eint_wkup_init,
-               .suspend        = exynos_pinctrl_suspend,
-               .resume         = exynos_pinctrl_resume,
-               .label          = "exynos3250-gpio-ctrl1",
-       },
-};
-
-/* pin banks of exynos4210 pin-controller 0 */
-static struct samsung_pin_bank exynos4210_pin_banks0[] = {
-       EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
-       EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
-       EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpb", 0x08),
-       EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpc0", 0x0c),
-       EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpc1", 0x10),
-       EXYNOS_PIN_BANK_EINTG(4, 0x0A0, "gpd0", 0x14),
-       EXYNOS_PIN_BANK_EINTG(4, 0x0C0, "gpd1", 0x18),
-       EXYNOS_PIN_BANK_EINTG(5, 0x0E0, "gpe0", 0x1c),
-       EXYNOS_PIN_BANK_EINTG(8, 0x100, "gpe1", 0x20),
-       EXYNOS_PIN_BANK_EINTG(6, 0x120, "gpe2", 0x24),
-       EXYNOS_PIN_BANK_EINTG(8, 0x140, "gpe3", 0x28),
-       EXYNOS_PIN_BANK_EINTG(8, 0x160, "gpe4", 0x2c),
-       EXYNOS_PIN_BANK_EINTG(8, 0x180, "gpf0", 0x30),
-       EXYNOS_PIN_BANK_EINTG(8, 0x1A0, "gpf1", 0x34),
-       EXYNOS_PIN_BANK_EINTG(8, 0x1C0, "gpf2", 0x38),
-       EXYNOS_PIN_BANK_EINTG(6, 0x1E0, "gpf3", 0x3c),
-};
-
-/* pin banks of exynos4210 pin-controller 1 */
-static struct samsung_pin_bank exynos4210_pin_banks1[] = {
-       EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpj0", 0x00),
-       EXYNOS_PIN_BANK_EINTG(5, 0x020, "gpj1", 0x04),
-       EXYNOS_PIN_BANK_EINTG(7, 0x040, "gpk0", 0x08),
-       EXYNOS_PIN_BANK_EINTG(7, 0x060, "gpk1", 0x0c),
-       EXYNOS_PIN_BANK_EINTG(7, 0x080, "gpk2", 0x10),
-       EXYNOS_PIN_BANK_EINTG(7, 0x0A0, "gpk3", 0x14),
-       EXYNOS_PIN_BANK_EINTG(8, 0x0C0, "gpl0", 0x18),
-       EXYNOS_PIN_BANK_EINTG(3, 0x0E0, "gpl1", 0x1c),
-       EXYNOS_PIN_BANK_EINTG(8, 0x100, "gpl2", 0x20),
-       EXYNOS_PIN_BANK_EINTN(6, 0x120, "gpy0"),
-       EXYNOS_PIN_BANK_EINTN(4, 0x140, "gpy1"),
-       EXYNOS_PIN_BANK_EINTN(6, 0x160, "gpy2"),
-       EXYNOS_PIN_BANK_EINTN(8, 0x180, "gpy3"),
-       EXYNOS_PIN_BANK_EINTN(8, 0x1A0, "gpy4"),
-       EXYNOS_PIN_BANK_EINTN(8, 0x1C0, "gpy5"),
-       EXYNOS_PIN_BANK_EINTN(8, 0x1E0, "gpy6"),
-       EXYNOS_PIN_BANK_EINTW(8, 0xC00, "gpx0", 0x00),
-       EXYNOS_PIN_BANK_EINTW(8, 0xC20, "gpx1", 0x04),
-       EXYNOS_PIN_BANK_EINTW(8, 0xC40, "gpx2", 0x08),
-       EXYNOS_PIN_BANK_EINTW(8, 0xC60, "gpx3", 0x0c),
-};
-
-/* pin banks of exynos4210 pin-controller 2 */
-static struct samsung_pin_bank exynos4210_pin_banks2[] = {
-       EXYNOS_PIN_BANK_EINTN(7, 0x000, "gpz"),
-};
-
-/*
- * Samsung pinctrl driver data for Exynos4210 SoC. Exynos4210 SoC includes
- * three gpio/pin-mux/pinconfig controllers.
- */
-struct samsung_pin_ctrl exynos4210_pin_ctrl[] = {
-       {
-               /* pin-controller instance 0 data */
-               .pin_banks      = exynos4210_pin_banks0,
-               .nr_banks       = ARRAY_SIZE(exynos4210_pin_banks0),
-               .geint_con      = EXYNOS_GPIO_ECON_OFFSET,
-               .geint_mask     = EXYNOS_GPIO_EMASK_OFFSET,
-               .geint_pend     = EXYNOS_GPIO_EPEND_OFFSET,
-               .svc            = EXYNOS_SVC_OFFSET,
-               .eint_gpio_init = exynos_eint_gpio_init,
-               .suspend        = exynos_pinctrl_suspend,
-               .resume         = exynos_pinctrl_resume,
-               .label          = "exynos4210-gpio-ctrl0",
-       }, {
-               /* pin-controller instance 1 data */
-               .pin_banks      = exynos4210_pin_banks1,
-               .nr_banks       = ARRAY_SIZE(exynos4210_pin_banks1),
-               .geint_con      = EXYNOS_GPIO_ECON_OFFSET,
-               .geint_mask     = EXYNOS_GPIO_EMASK_OFFSET,
-               .geint_pend     = EXYNOS_GPIO_EPEND_OFFSET,
-               .weint_con      = EXYNOS_WKUP_ECON_OFFSET,
-               .weint_mask     = EXYNOS_WKUP_EMASK_OFFSET,
-               .weint_pend     = EXYNOS_WKUP_EPEND_OFFSET,
-               .svc            = EXYNOS_SVC_OFFSET,
-               .eint_gpio_init = exynos_eint_gpio_init,
-               .eint_wkup_init = exynos_eint_wkup_init,
-               .suspend        = exynos_pinctrl_suspend,
-               .resume         = exynos_pinctrl_resume,
-               .label          = "exynos4210-gpio-ctrl1",
-       }, {
-               /* pin-controller instance 2 data */
-               .pin_banks      = exynos4210_pin_banks2,
-               .nr_banks       = ARRAY_SIZE(exynos4210_pin_banks2),
-               .label          = "exynos4210-gpio-ctrl2",
-       },
-};
-
-/* pin banks of exynos4x12 pin-controller 0 */
-static struct samsung_pin_bank exynos4x12_pin_banks0[] = {
-       EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
-       EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
-       EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpb", 0x08),
-       EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpc0", 0x0c),
-       EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpc1", 0x10),
-       EXYNOS_PIN_BANK_EINTG(4, 0x0A0, "gpd0", 0x14),
-       EXYNOS_PIN_BANK_EINTG(4, 0x0C0, "gpd1", 0x18),
-       EXYNOS_PIN_BANK_EINTG(8, 0x180, "gpf0", 0x30),
-       EXYNOS_PIN_BANK_EINTG(8, 0x1A0, "gpf1", 0x34),
-       EXYNOS_PIN_BANK_EINTG(8, 0x1C0, "gpf2", 0x38),
-       EXYNOS_PIN_BANK_EINTG(6, 0x1E0, "gpf3", 0x3c),
-       EXYNOS_PIN_BANK_EINTG(8, 0x240, "gpj0", 0x40),
-       EXYNOS_PIN_BANK_EINTG(5, 0x260, "gpj1", 0x44),
-};
-
-/* pin banks of exynos4x12 pin-controller 1 */
-static struct samsung_pin_bank exynos4x12_pin_banks1[] = {
-       EXYNOS_PIN_BANK_EINTG(7, 0x040, "gpk0", 0x08),
-       EXYNOS_PIN_BANK_EINTG(7, 0x060, "gpk1", 0x0c),
-       EXYNOS_PIN_BANK_EINTG(7, 0x080, "gpk2", 0x10),
-       EXYNOS_PIN_BANK_EINTG(7, 0x0A0, "gpk3", 0x14),
-       EXYNOS_PIN_BANK_EINTG(7, 0x0C0, "gpl0", 0x18),
-       EXYNOS_PIN_BANK_EINTG(2, 0x0E0, "gpl1", 0x1c),
-       EXYNOS_PIN_BANK_EINTG(8, 0x100, "gpl2", 0x20),
-       EXYNOS_PIN_BANK_EINTG(8, 0x260, "gpm0", 0x24),
-       EXYNOS_PIN_BANK_EINTG(7, 0x280, "gpm1", 0x28),
-       EXYNOS_PIN_BANK_EINTG(5, 0x2A0, "gpm2", 0x2c),
-       EXYNOS_PIN_BANK_EINTG(8, 0x2C0, "gpm3", 0x30),
-       EXYNOS_PIN_BANK_EINTG(8, 0x2E0, "gpm4", 0x34),
-       EXYNOS_PIN_BANK_EINTN(6, 0x120, "gpy0"),
-       EXYNOS_PIN_BANK_EINTN(4, 0x140, "gpy1"),
-       EXYNOS_PIN_BANK_EINTN(6, 0x160, "gpy2"),
-       EXYNOS_PIN_BANK_EINTN(8, 0x180, "gpy3"),
-       EXYNOS_PIN_BANK_EINTN(8, 0x1A0, "gpy4"),
-       EXYNOS_PIN_BANK_EINTN(8, 0x1C0, "gpy5"),
-       EXYNOS_PIN_BANK_EINTN(8, 0x1E0, "gpy6"),
-       EXYNOS_PIN_BANK_EINTW(8, 0xC00, "gpx0", 0x00),
-       EXYNOS_PIN_BANK_EINTW(8, 0xC20, "gpx1", 0x04),
-       EXYNOS_PIN_BANK_EINTW(8, 0xC40, "gpx2", 0x08),
-       EXYNOS_PIN_BANK_EINTW(8, 0xC60, "gpx3", 0x0c),
-};
-
-/* pin banks of exynos4x12 pin-controller 2 */
-static struct samsung_pin_bank exynos4x12_pin_banks2[] = {
-       EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpz", 0x00),
-};
-
-/* pin banks of exynos4x12 pin-controller 3 */
-static struct samsung_pin_bank exynos4x12_pin_banks3[] = {
-       EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpv0", 0x00),
-       EXYNOS_PIN_BANK_EINTG(8, 0x020, "gpv1", 0x04),
-       EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpv2", 0x08),
-       EXYNOS_PIN_BANK_EINTG(8, 0x060, "gpv3", 0x0c),
-       EXYNOS_PIN_BANK_EINTG(2, 0x080, "gpv4", 0x10),
-};
-
-/*
- * Samsung pinctrl driver data for Exynos4x12 SoC. Exynos4x12 SoC includes
- * four gpio/pin-mux/pinconfig controllers.
- */
-struct samsung_pin_ctrl exynos4x12_pin_ctrl[] = {
-       {
-               /* pin-controller instance 0 data */
-               .pin_banks      = exynos4x12_pin_banks0,
-               .nr_banks       = ARRAY_SIZE(exynos4x12_pin_banks0),
-               .geint_con      = EXYNOS_GPIO_ECON_OFFSET,
-               .geint_mask     = EXYNOS_GPIO_EMASK_OFFSET,
-               .geint_pend     = EXYNOS_GPIO_EPEND_OFFSET,
-               .svc            = EXYNOS_SVC_OFFSET,
-               .eint_gpio_init = exynos_eint_gpio_init,
-               .suspend        = exynos_pinctrl_suspend,
-               .resume         = exynos_pinctrl_resume,
-               .label          = "exynos4x12-gpio-ctrl0",
-       }, {
-               /* pin-controller instance 1 data */
-               .pin_banks      = exynos4x12_pin_banks1,
-               .nr_banks       = ARRAY_SIZE(exynos4x12_pin_banks1),
-               .geint_con      = EXYNOS_GPIO_ECON_OFFSET,
-               .geint_mask     = EXYNOS_GPIO_EMASK_OFFSET,
-               .geint_pend     = EXYNOS_GPIO_EPEND_OFFSET,
-               .weint_con      = EXYNOS_WKUP_ECON_OFFSET,
-               .weint_mask     = EXYNOS_WKUP_EMASK_OFFSET,
-               .weint_pend     = EXYNOS_WKUP_EPEND_OFFSET,
-               .svc            = EXYNOS_SVC_OFFSET,
-               .eint_gpio_init = exynos_eint_gpio_init,
-               .eint_wkup_init = exynos_eint_wkup_init,
-               .suspend        = exynos_pinctrl_suspend,
-               .resume         = exynos_pinctrl_resume,
-               .label          = "exynos4x12-gpio-ctrl1",
-       }, {
-               /* pin-controller instance 2 data */
-               .pin_banks      = exynos4x12_pin_banks2,
-               .nr_banks       = ARRAY_SIZE(exynos4x12_pin_banks2),
-               .geint_con      = EXYNOS_GPIO_ECON_OFFSET,
-               .geint_mask     = EXYNOS_GPIO_EMASK_OFFSET,
-               .geint_pend     = EXYNOS_GPIO_EPEND_OFFSET,
-               .svc            = EXYNOS_SVC_OFFSET,
-               .eint_gpio_init = exynos_eint_gpio_init,
-               .suspend        = exynos_pinctrl_suspend,
-               .resume         = exynos_pinctrl_resume,
-               .label          = "exynos4x12-gpio-ctrl2",
-       }, {
-               /* pin-controller instance 3 data */
-               .pin_banks      = exynos4x12_pin_banks3,
-               .nr_banks       = ARRAY_SIZE(exynos4x12_pin_banks3),
-               .geint_con      = EXYNOS_GPIO_ECON_OFFSET,
-               .geint_mask     = EXYNOS_GPIO_EMASK_OFFSET,
-               .geint_pend     = EXYNOS_GPIO_EPEND_OFFSET,
-               .svc            = EXYNOS_SVC_OFFSET,
-               .eint_gpio_init = exynos_eint_gpio_init,
-               .suspend        = exynos_pinctrl_suspend,
-               .resume         = exynos_pinctrl_resume,
-               .label          = "exynos4x12-gpio-ctrl3",
-       },
-};
-
-/* pin banks of exynos5250 pin-controller 0 */
-static struct samsung_pin_bank exynos5250_pin_banks0[] = {
-       EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
-       EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
-       EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpa2", 0x08),
-       EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpb0", 0x0c),
-       EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpb1", 0x10),
-       EXYNOS_PIN_BANK_EINTG(4, 0x0A0, "gpb2", 0x14),
-       EXYNOS_PIN_BANK_EINTG(4, 0x0C0, "gpb3", 0x18),
-       EXYNOS_PIN_BANK_EINTG(7, 0x0E0, "gpc0", 0x1c),
-       EXYNOS_PIN_BANK_EINTG(4, 0x100, "gpc1", 0x20),
-       EXYNOS_PIN_BANK_EINTG(7, 0x120, "gpc2", 0x24),
-       EXYNOS_PIN_BANK_EINTG(7, 0x140, "gpc3", 0x28),
-       EXYNOS_PIN_BANK_EINTG(4, 0x160, "gpd0", 0x2c),
-       EXYNOS_PIN_BANK_EINTG(8, 0x180, "gpd1", 0x30),
-       EXYNOS_PIN_BANK_EINTG(7, 0x2E0, "gpc4", 0x34),
-       EXYNOS_PIN_BANK_EINTN(6, 0x1A0, "gpy0"),
-       EXYNOS_PIN_BANK_EINTN(4, 0x1C0, "gpy1"),
-       EXYNOS_PIN_BANK_EINTN(6, 0x1E0, "gpy2"),
-       EXYNOS_PIN_BANK_EINTN(8, 0x200, "gpy3"),
-       EXYNOS_PIN_BANK_EINTN(8, 0x220, "gpy4"),
-       EXYNOS_PIN_BANK_EINTN(8, 0x240, "gpy5"),
-       EXYNOS_PIN_BANK_EINTN(8, 0x260, "gpy6"),
-       EXYNOS_PIN_BANK_EINTW(8, 0xC00, "gpx0", 0x00),
-       EXYNOS_PIN_BANK_EINTW(8, 0xC20, "gpx1", 0x04),
-       EXYNOS_PIN_BANK_EINTW(8, 0xC40, "gpx2", 0x08),
-       EXYNOS_PIN_BANK_EINTW(8, 0xC60, "gpx3", 0x0c),
-};
-
-/* pin banks of exynos5250 pin-controller 1 */
-static struct samsung_pin_bank exynos5250_pin_banks1[] = {
-       EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpe0", 0x00),
-       EXYNOS_PIN_BANK_EINTG(2, 0x020, "gpe1", 0x04),
-       EXYNOS_PIN_BANK_EINTG(4, 0x040, "gpf0", 0x08),
-       EXYNOS_PIN_BANK_EINTG(4, 0x060, "gpf1", 0x0c),
-       EXYNOS_PIN_BANK_EINTG(8, 0x080, "gpg0", 0x10),
-       EXYNOS_PIN_BANK_EINTG(8, 0x0A0, "gpg1", 0x14),
-       EXYNOS_PIN_BANK_EINTG(2, 0x0C0, "gpg2", 0x18),
-       EXYNOS_PIN_BANK_EINTG(4, 0x0E0, "gph0", 0x1c),
-       EXYNOS_PIN_BANK_EINTG(8, 0x100, "gph1", 0x20),
-};
-
-/* pin banks of exynos5250 pin-controller 2 */
-static struct samsung_pin_bank exynos5250_pin_banks2[] = {
-       EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpv0", 0x00),
-       EXYNOS_PIN_BANK_EINTG(8, 0x020, "gpv1", 0x04),
-       EXYNOS_PIN_BANK_EINTG(8, 0x060, "gpv2", 0x08),
-       EXYNOS_PIN_BANK_EINTG(8, 0x080, "gpv3", 0x0c),
-       EXYNOS_PIN_BANK_EINTG(2, 0x0C0, "gpv4", 0x10),
-};
-
-/* pin banks of exynos5250 pin-controller 3 */
-static struct samsung_pin_bank exynos5250_pin_banks3[] = {
-       EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpz", 0x00),
-};
-
-/*
- * Samsung pinctrl driver data for Exynos5250 SoC. Exynos5250 SoC includes
- * four gpio/pin-mux/pinconfig controllers.
- */
-struct samsung_pin_ctrl exynos5250_pin_ctrl[] = {
-       {
-               /* pin-controller instance 0 data */
-               .pin_banks      = exynos5250_pin_banks0,
-               .nr_banks       = ARRAY_SIZE(exynos5250_pin_banks0),
-               .geint_con      = EXYNOS_GPIO_ECON_OFFSET,
-               .geint_mask     = EXYNOS_GPIO_EMASK_OFFSET,
-               .geint_pend     = EXYNOS_GPIO_EPEND_OFFSET,
-               .weint_con      = EXYNOS_WKUP_ECON_OFFSET,
-               .weint_mask     = EXYNOS_WKUP_EMASK_OFFSET,
-               .weint_pend     = EXYNOS_WKUP_EPEND_OFFSET,
-               .svc            = EXYNOS_SVC_OFFSET,
-               .eint_gpio_init = exynos_eint_gpio_init,
-               .eint_wkup_init = exynos_eint_wkup_init,
-               .suspend        = exynos_pinctrl_suspend,
-               .resume         = exynos_pinctrl_resume,
-               .label          = "exynos5250-gpio-ctrl0",
-       }, {
-               /* pin-controller instance 1 data */
-               .pin_banks      = exynos5250_pin_banks1,
-               .nr_banks       = ARRAY_SIZE(exynos5250_pin_banks1),
-               .geint_con      = EXYNOS_GPIO_ECON_OFFSET,
-               .geint_mask     = EXYNOS_GPIO_EMASK_OFFSET,
-               .geint_pend     = EXYNOS_GPIO_EPEND_OFFSET,
-               .svc            = EXYNOS_SVC_OFFSET,
-               .eint_gpio_init = exynos_eint_gpio_init,
-               .suspend        = exynos_pinctrl_suspend,
-               .resume         = exynos_pinctrl_resume,
-               .label          = "exynos5250-gpio-ctrl1",
-       }, {
-               /* pin-controller instance 2 data */
-               .pin_banks      = exynos5250_pin_banks2,
-               .nr_banks       = ARRAY_SIZE(exynos5250_pin_banks2),
-               .geint_con      = EXYNOS_GPIO_ECON_OFFSET,
-               .geint_mask     = EXYNOS_GPIO_EMASK_OFFSET,
-               .geint_pend     = EXYNOS_GPIO_EPEND_OFFSET,
-               .svc            = EXYNOS_SVC_OFFSET,
-               .eint_gpio_init = exynos_eint_gpio_init,
-               .suspend        = exynos_pinctrl_suspend,
-               .resume         = exynos_pinctrl_resume,
-               .label          = "exynos5250-gpio-ctrl2",
-       }, {
-               /* pin-controller instance 3 data */
-               .pin_banks      = exynos5250_pin_banks3,
-               .nr_banks       = ARRAY_SIZE(exynos5250_pin_banks3),
-               .geint_con      = EXYNOS_GPIO_ECON_OFFSET,
-               .geint_mask     = EXYNOS_GPIO_EMASK_OFFSET,
-               .geint_pend     = EXYNOS_GPIO_EPEND_OFFSET,
-               .svc            = EXYNOS_SVC_OFFSET,
-               .eint_gpio_init = exynos_eint_gpio_init,
-               .suspend        = exynos_pinctrl_suspend,
-               .resume         = exynos_pinctrl_resume,
-               .label          = "exynos5250-gpio-ctrl3",
-       },
-};
-
-/* pin banks of exynos5260 pin-controller 0 */
-static struct samsung_pin_bank exynos5260_pin_banks0[] = {
-       EXYNOS_PIN_BANK_EINTG(4, 0x000, "gpa0", 0x00),
-       EXYNOS_PIN_BANK_EINTG(7, 0x020, "gpa1", 0x04),
-       EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpa2", 0x08),
-       EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpb0", 0x0c),
-       EXYNOS_PIN_BANK_EINTG(4, 0x080, "gpb1", 0x10),
-       EXYNOS_PIN_BANK_EINTG(5, 0x0a0, "gpb2", 0x14),
-       EXYNOS_PIN_BANK_EINTG(8, 0x0c0, "gpb3", 0x18),
-       EXYNOS_PIN_BANK_EINTG(8, 0x0e0, "gpb4", 0x1c),
-       EXYNOS_PIN_BANK_EINTG(8, 0x100, "gpb5", 0x20),
-       EXYNOS_PIN_BANK_EINTG(8, 0x120, "gpd0", 0x24),
-       EXYNOS_PIN_BANK_EINTG(7, 0x140, "gpd1", 0x28),
-       EXYNOS_PIN_BANK_EINTG(5, 0x160, "gpd2", 0x2c),
-       EXYNOS_PIN_BANK_EINTG(8, 0x180, "gpe0", 0x30),
-       EXYNOS_PIN_BANK_EINTG(5, 0x1a0, "gpe1", 0x34),
-       EXYNOS_PIN_BANK_EINTG(4, 0x1c0, "gpf0", 0x38),
-       EXYNOS_PIN_BANK_EINTG(8, 0x1e0, "gpf1", 0x3c),
-       EXYNOS_PIN_BANK_EINTG(2, 0x200, "gpk0", 0x40),
-       EXYNOS_PIN_BANK_EINTW(8, 0xc00, "gpx0", 0x00),
-       EXYNOS_PIN_BANK_EINTW(8, 0xc20, "gpx1", 0x04),
-       EXYNOS_PIN_BANK_EINTW(8, 0xc40, "gpx2", 0x08),
-       EXYNOS_PIN_BANK_EINTW(8, 0xc60, "gpx3", 0x0c),
-};
-
-/* pin banks of exynos5260 pin-controller 1 */
-static struct samsung_pin_bank exynos5260_pin_banks1[] = {
-       EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpc0", 0x00),
-       EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpc1", 0x04),
-       EXYNOS_PIN_BANK_EINTG(7, 0x040, "gpc2", 0x08),
-       EXYNOS_PIN_BANK_EINTG(4, 0x060, "gpc3", 0x0c),
-       EXYNOS_PIN_BANK_EINTG(4, 0x080, "gpc4", 0x10),
-};
-
-/* pin banks of exynos5260 pin-controller 2 */
-static struct samsung_pin_bank exynos5260_pin_banks2[] = {
-       EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpz0", 0x00),
-       EXYNOS_PIN_BANK_EINTG(4, 0x020, "gpz1", 0x04),
-};
-
-/*
- * Samsung pinctrl driver data for Exynos5260 SoC. Exynos5260 SoC includes
- * three gpio/pin-mux/pinconfig controllers.
- */
-struct samsung_pin_ctrl exynos5260_pin_ctrl[] = {
-       {
-               /* pin-controller instance 0 data */
-               .pin_banks      = exynos5260_pin_banks0,
-               .nr_banks       = ARRAY_SIZE(exynos5260_pin_banks0),
-               .geint_con      = EXYNOS_GPIO_ECON_OFFSET,
-               .geint_mask     = EXYNOS_GPIO_EMASK_OFFSET,
-               .geint_pend     = EXYNOS_GPIO_EPEND_OFFSET,
-               .weint_con      = EXYNOS_WKUP_ECON_OFFSET,
-               .weint_mask     = EXYNOS_WKUP_EMASK_OFFSET,
-               .weint_pend     = EXYNOS_WKUP_EPEND_OFFSET,
-               .svc            = EXYNOS_SVC_OFFSET,
-               .eint_gpio_init = exynos_eint_gpio_init,
-               .eint_wkup_init = exynos_eint_wkup_init,
-               .label          = "exynos5260-gpio-ctrl0",
-       }, {
-               /* pin-controller instance 1 data */
-               .pin_banks      = exynos5260_pin_banks1,
-               .nr_banks       = ARRAY_SIZE(exynos5260_pin_banks1),
-               .geint_con      = EXYNOS_GPIO_ECON_OFFSET,
-               .geint_mask     = EXYNOS_GPIO_EMASK_OFFSET,
-               .geint_pend     = EXYNOS_GPIO_EPEND_OFFSET,
-               .svc            = EXYNOS_SVC_OFFSET,
-               .eint_gpio_init = exynos_eint_gpio_init,
-               .label          = "exynos5260-gpio-ctrl1",
-       }, {
-               /* pin-controller instance 2 data */
-               .pin_banks      = exynos5260_pin_banks2,
-               .nr_banks       = ARRAY_SIZE(exynos5260_pin_banks2),
-               .geint_con      = EXYNOS_GPIO_ECON_OFFSET,
-               .geint_mask     = EXYNOS_GPIO_EMASK_OFFSET,
-               .geint_pend     = EXYNOS_GPIO_EPEND_OFFSET,
-               .svc            = EXYNOS_SVC_OFFSET,
-               .eint_gpio_init = exynos_eint_gpio_init,
-               .label          = "exynos5260-gpio-ctrl2",
-       },
-};
-
-/* pin banks of exynos5420 pin-controller 0 */
-static struct samsung_pin_bank exynos5420_pin_banks0[] = {
-       EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpy7", 0x00),
-       EXYNOS_PIN_BANK_EINTW(8, 0xC00, "gpx0", 0x00),
-       EXYNOS_PIN_BANK_EINTW(8, 0xC20, "gpx1", 0x04),
-       EXYNOS_PIN_BANK_EINTW(8, 0xC40, "gpx2", 0x08),
-       EXYNOS_PIN_BANK_EINTW(8, 0xC60, "gpx3", 0x0c),
-};
-
-/* pin banks of exynos5420 pin-controller 1 */
-static struct samsung_pin_bank exynos5420_pin_banks1[] = {
-       EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpc0", 0x00),
-       EXYNOS_PIN_BANK_EINTG(8, 0x020, "gpc1", 0x04),
-       EXYNOS_PIN_BANK_EINTG(7, 0x040, "gpc2", 0x08),
-       EXYNOS_PIN_BANK_EINTG(4, 0x060, "gpc3", 0x0c),
-       EXYNOS_PIN_BANK_EINTG(2, 0x080, "gpc4", 0x10),
-       EXYNOS_PIN_BANK_EINTG(8, 0x0A0, "gpd1", 0x14),
-       EXYNOS_PIN_BANK_EINTN(6, 0x0C0, "gpy0"),
-       EXYNOS_PIN_BANK_EINTN(4, 0x0E0, "gpy1"),
-       EXYNOS_PIN_BANK_EINTN(6, 0x100, "gpy2"),
-       EXYNOS_PIN_BANK_EINTN(8, 0x120, "gpy3"),
-       EXYNOS_PIN_BANK_EINTN(8, 0x140, "gpy4"),
-       EXYNOS_PIN_BANK_EINTN(8, 0x160, "gpy5"),
-       EXYNOS_PIN_BANK_EINTN(8, 0x180, "gpy6"),
-};
-
-/* pin banks of exynos5420 pin-controller 2 */
-static struct samsung_pin_bank exynos5420_pin_banks2[] = {
-       EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpe0", 0x00),
-       EXYNOS_PIN_BANK_EINTG(2, 0x020, "gpe1", 0x04),
-       EXYNOS_PIN_BANK_EINTG(6, 0x040, "gpf0", 0x08),
-       EXYNOS_PIN_BANK_EINTG(8, 0x060, "gpf1", 0x0c),
-       EXYNOS_PIN_BANK_EINTG(8, 0x080, "gpg0", 0x10),
-       EXYNOS_PIN_BANK_EINTG(8, 0x0A0, "gpg1", 0x14),
-       EXYNOS_PIN_BANK_EINTG(2, 0x0C0, "gpg2", 0x18),
-       EXYNOS_PIN_BANK_EINTG(4, 0x0E0, "gpj4", 0x1c),
-};
-
-/* pin banks of exynos5420 pin-controller 3 */
-static struct samsung_pin_bank exynos5420_pin_banks3[] = {
-       EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
-       EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
-       EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpa2", 0x08),
-       EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpb0", 0x0c),
-       EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpb1", 0x10),
-       EXYNOS_PIN_BANK_EINTG(4, 0x0A0, "gpb2", 0x14),
-       EXYNOS_PIN_BANK_EINTG(8, 0x0C0, "gpb3", 0x18),
-       EXYNOS_PIN_BANK_EINTG(2, 0x0E0, "gpb4", 0x1c),
-       EXYNOS_PIN_BANK_EINTG(8, 0x100, "gph0", 0x20),
-};
-
-/* pin banks of exynos5420 pin-controller 4 */
-static struct samsung_pin_bank exynos5420_pin_banks4[] = {
-       EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpz", 0x00),
-};
-
-/*
- * Samsung pinctrl driver data for Exynos5420 SoC. Exynos5420 SoC includes
- * four gpio/pin-mux/pinconfig controllers.
- */
-struct samsung_pin_ctrl exynos5420_pin_ctrl[] = {
-       {
-               /* pin-controller instance 0 data */
-               .pin_banks      = exynos5420_pin_banks0,
-               .nr_banks       = ARRAY_SIZE(exynos5420_pin_banks0),
-               .geint_con      = EXYNOS_GPIO_ECON_OFFSET,
-               .geint_mask     = EXYNOS_GPIO_EMASK_OFFSET,
-               .geint_pend     = EXYNOS_GPIO_EPEND_OFFSET,
-               .weint_con      = EXYNOS_WKUP_ECON_OFFSET,
-               .weint_mask     = EXYNOS_WKUP_EMASK_OFFSET,
-               .weint_pend     = EXYNOS_WKUP_EPEND_OFFSET,
-               .svc            = EXYNOS_SVC_OFFSET,
-               .eint_gpio_init = exynos_eint_gpio_init,
-               .eint_wkup_init = exynos_eint_wkup_init,
-               .label          = "exynos5420-gpio-ctrl0",
-       }, {
-               /* pin-controller instance 1 data */
-               .pin_banks      = exynos5420_pin_banks1,
-               .nr_banks       = ARRAY_SIZE(exynos5420_pin_banks1),
-               .geint_con      = EXYNOS_GPIO_ECON_OFFSET,
-               .geint_mask     = EXYNOS_GPIO_EMASK_OFFSET,
-               .geint_pend     = EXYNOS_GPIO_EPEND_OFFSET,
-               .svc            = EXYNOS_SVC_OFFSET,
-               .eint_gpio_init = exynos_eint_gpio_init,
-               .label          = "exynos5420-gpio-ctrl1",
-       }, {
-               /* pin-controller instance 2 data */
-               .pin_banks      = exynos5420_pin_banks2,
-               .nr_banks       = ARRAY_SIZE(exynos5420_pin_banks2),
-               .geint_con      = EXYNOS_GPIO_ECON_OFFSET,
-               .geint_mask     = EXYNOS_GPIO_EMASK_OFFSET,
-               .geint_pend     = EXYNOS_GPIO_EPEND_OFFSET,
-               .svc            = EXYNOS_SVC_OFFSET,
-               .eint_gpio_init = exynos_eint_gpio_init,
-               .label          = "exynos5420-gpio-ctrl2",
-       }, {
-               /* pin-controller instance 3 data */
-               .pin_banks      = exynos5420_pin_banks3,
-               .nr_banks       = ARRAY_SIZE(exynos5420_pin_banks3),
-               .geint_con      = EXYNOS_GPIO_ECON_OFFSET,
-               .geint_mask     = EXYNOS_GPIO_EMASK_OFFSET,
-               .geint_pend     = EXYNOS_GPIO_EPEND_OFFSET,
-               .svc            = EXYNOS_SVC_OFFSET,
-               .eint_gpio_init = exynos_eint_gpio_init,
-               .label          = "exynos5420-gpio-ctrl3",
-       }, {
-               /* pin-controller instance 4 data */
-               .pin_banks      = exynos5420_pin_banks4,
-               .nr_banks       = ARRAY_SIZE(exynos5420_pin_banks4),
-               .geint_con      = EXYNOS_GPIO_ECON_OFFSET,
-               .geint_mask     = EXYNOS_GPIO_EMASK_OFFSET,
-               .geint_pend     = EXYNOS_GPIO_EPEND_OFFSET,
-               .svc            = EXYNOS_SVC_OFFSET,
-               .eint_gpio_init = exynos_eint_gpio_init,
-               .label          = "exynos5420-gpio-ctrl4",
-       },
-};
diff --git a/drivers/pinctrl/pinctrl-exynos.h b/drivers/pinctrl/pinctrl-exynos.h
deleted file mode 100644 (file)
index 3c91c35..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Exynos specific definitions for Samsung pinctrl and gpiolib driver.
- *
- * Copyright (c) 2012 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- * Copyright (c) 2012 Linaro Ltd
- *             http://www.linaro.org
- *
- * This file contains the Exynos specific definitions for the Samsung
- * pinctrl/gpiolib interface drivers.
- *
- * Author: Thomas Abraham <thomas.ab@samsung.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- */
-
-/* External GPIO and wakeup interrupt related definitions */
-#define EXYNOS_GPIO_ECON_OFFSET                0x700
-#define EXYNOS_GPIO_EFLTCON_OFFSET     0x800
-#define EXYNOS_GPIO_EMASK_OFFSET       0x900
-#define EXYNOS_GPIO_EPEND_OFFSET       0xA00
-#define EXYNOS_WKUP_ECON_OFFSET                0xE00
-#define EXYNOS_WKUP_EMASK_OFFSET       0xF00
-#define EXYNOS_WKUP_EPEND_OFFSET       0xF40
-#define EXYNOS_SVC_OFFSET              0xB08
-#define EXYNOS_EINT_FUNC               0xF
-
-/* helpers to access interrupt service register */
-#define EXYNOS_SVC_GROUP_SHIFT         3
-#define EXYNOS_SVC_GROUP_MASK          0x1f
-#define EXYNOS_SVC_NUM_MASK            7
-#define EXYNOS_SVC_GROUP(x)            ((x >> EXYNOS_SVC_GROUP_SHIFT) & \
-                                               EXYNOS_SVC_GROUP_MASK)
-
-/* Exynos specific external interrupt trigger types */
-#define EXYNOS_EINT_LEVEL_LOW          0
-#define EXYNOS_EINT_LEVEL_HIGH         1
-#define EXYNOS_EINT_EDGE_FALLING       2
-#define EXYNOS_EINT_EDGE_RISING                3
-#define EXYNOS_EINT_EDGE_BOTH          4
-#define EXYNOS_EINT_CON_MASK           0xF
-#define EXYNOS_EINT_CON_LEN            4
-
-#define EXYNOS_EINT_MAX_PER_BANK       8
-#define EXYNOS_EINT_NR_WKUP_EINT
-
-#define EXYNOS_PIN_BANK_EINTN(pins, reg, id)           \
-       {                                               \
-               .type           = &bank_type_off,       \
-               .pctl_offset    = reg,                  \
-               .nr_pins        = pins,                 \
-               .eint_type      = EINT_TYPE_NONE,       \
-               .name           = id                    \
-       }
-
-#define EXYNOS_PIN_BANK_EINTG(pins, reg, id, offs)     \
-       {                                               \
-               .type           = &bank_type_off,       \
-               .pctl_offset    = reg,                  \
-               .nr_pins        = pins,                 \
-               .eint_type      = EINT_TYPE_GPIO,       \
-               .eint_offset    = offs,                 \
-               .name           = id                    \
-       }
-
-#define EXYNOS_PIN_BANK_EINTW(pins, reg, id, offs)     \
-       {                                               \
-               .type           = &bank_type_alive,     \
-               .pctl_offset    = reg,                  \
-               .nr_pins        = pins,                 \
-               .eint_type      = EINT_TYPE_WKUP,       \
-               .eint_offset    = offs,                 \
-               .name           = id                    \
-       }
-
-/**
- * struct exynos_weint_data: irq specific data for all the wakeup interrupts
- * generated by the external wakeup interrupt controller.
- * @irq: interrupt number within the domain.
- * @bank: bank responsible for this interrupt
- */
-struct exynos_weint_data {
-       unsigned int irq;
-       struct samsung_pin_bank *bank;
-};
-
-/**
- * struct exynos_muxed_weint_data: irq specific data for muxed wakeup interrupts
- * generated by the external wakeup interrupt controller.
- * @nr_banks: count of banks being part of the mux
- * @banks: array of banks being part of the mux
- */
-struct exynos_muxed_weint_data {
-       unsigned int nr_banks;
-       struct samsung_pin_bank *banks[];
-};
diff --git a/drivers/pinctrl/pinctrl-exynos5440.c b/drivers/pinctrl/pinctrl-exynos5440.c
deleted file mode 100644 (file)
index 8fe2ab0..0000000
+++ /dev/null
@@ -1,1069 +0,0 @@
-/*
- * pin-controller/pin-mux/pin-config/gpio-driver for Samsung's EXYNOS5440 SoC.
- *
- * Copyright (c) 2012 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- */
-
-#include <linux/module.h>
-#include <linux/platform_device.h>
-#include <linux/io.h>
-#include <linux/slab.h>
-#include <linux/err.h>
-#include <linux/gpio.h>
-#include <linux/device.h>
-#include <linux/pinctrl/pinctrl.h>
-#include <linux/pinctrl/pinmux.h>
-#include <linux/pinctrl/pinconf.h>
-#include <linux/interrupt.h>
-#include <linux/irqdomain.h>
-#include <linux/of_irq.h>
-#include "core.h"
-
-/* EXYNOS5440 GPIO and Pinctrl register offsets */
-#define GPIO_MUX               0x00
-#define GPIO_IE                        0x04
-#define GPIO_INT               0x08
-#define GPIO_TYPE              0x0C
-#define GPIO_VAL               0x10
-#define GPIO_OE                        0x14
-#define GPIO_IN                        0x18
-#define GPIO_PE                        0x1C
-#define GPIO_PS                        0x20
-#define GPIO_SR                        0x24
-#define GPIO_DS0               0x28
-#define GPIO_DS1               0x2C
-
-#define EXYNOS5440_MAX_PINS            23
-#define EXYNOS5440_MAX_GPIO_INT        8
-#define PIN_NAME_LENGTH                10
-
-#define GROUP_SUFFIX           "-grp"
-#define GSUFFIX_LEN            sizeof(GROUP_SUFFIX)
-#define FUNCTION_SUFFIX                "-mux"
-#define FSUFFIX_LEN            sizeof(FUNCTION_SUFFIX)
-
-/*
- * pin configuration type and its value are packed together into a 16-bits.
- * The upper 8-bits represent the configuration type and the lower 8-bits
- * hold the value of the configuration type.
- */
-#define PINCFG_TYPE_MASK               0xFF
-#define PINCFG_VALUE_SHIFT             8
-#define PINCFG_VALUE_MASK              (0xFF << PINCFG_VALUE_SHIFT)
-#define PINCFG_PACK(type, value)       (((value) << PINCFG_VALUE_SHIFT) | type)
-#define PINCFG_UNPACK_TYPE(cfg)                ((cfg) & PINCFG_TYPE_MASK)
-#define PINCFG_UNPACK_VALUE(cfg)       (((cfg) & PINCFG_VALUE_MASK) >> \
-                                               PINCFG_VALUE_SHIFT)
-
-/**
- * enum pincfg_type - possible pin configuration types supported.
- * @PINCFG_TYPE_PUD: Pull up/down configuration.
- * @PINCFG_TYPE_DRV: Drive strength configuration.
- * @PINCFG_TYPE_SKEW_RATE: Skew rate configuration.
- * @PINCFG_TYPE_INPUT_TYPE: Pin input type configuration.
- */
-enum pincfg_type {
-       PINCFG_TYPE_PUD,
-       PINCFG_TYPE_DRV,
-       PINCFG_TYPE_SKEW_RATE,
-       PINCFG_TYPE_INPUT_TYPE
-};
-
-/**
- * struct exynos5440_pin_group: represent group of pins for pincfg setting.
- * @name: name of the pin group, used to lookup the group.
- * @pins: the pins included in this group.
- * @num_pins: number of pins included in this group.
- */
-struct exynos5440_pin_group {
-       const char              *name;
-       const unsigned int      *pins;
-       u8                      num_pins;
-};
-
-/**
- * struct exynos5440_pmx_func: represent a pin function.
- * @name: name of the pin function, used to lookup the function.
- * @groups: one or more names of pin groups that provide this function.
- * @num_groups: number of groups included in @groups.
- * @function: the function number to be programmed when selected.
- */
-struct exynos5440_pmx_func {
-       const char              *name;
-       const char              **groups;
-       u8                      num_groups;
-       unsigned long           function;
-};
-
-/**
- * struct exynos5440_pinctrl_priv_data: driver's private runtime data.
- * @reg_base: ioremapped based address of the register space.
- * @gc: gpio chip registered with gpiolib.
- * @pin_groups: list of pin groups parsed from device tree.
- * @nr_groups: number of pin groups available.
- * @pmx_functions: list of pin functions parsed from device tree.
- * @nr_functions: number of pin functions available.
- */
-struct exynos5440_pinctrl_priv_data {
-       void __iomem                    *reg_base;
-       struct gpio_chip                *gc;
-       struct irq_domain               *irq_domain;
-
-       const struct exynos5440_pin_group       *pin_groups;
-       unsigned int                    nr_groups;
-       const struct exynos5440_pmx_func        *pmx_functions;
-       unsigned int                    nr_functions;
-};
-
-/**
- * struct exynos5440_gpio_intr_data: private data for gpio interrupts.
- * @priv: driver's private runtime data.
- * @gpio_int: gpio interrupt number.
- */
-struct exynos5440_gpio_intr_data {
-       struct exynos5440_pinctrl_priv_data     *priv;
-       unsigned int                            gpio_int;
-};
-
-/* list of all possible config options supported */
-static struct pin_config {
-       char            *prop_cfg;
-       unsigned int    cfg_type;
-} pcfgs[] = {
-       { "samsung,exynos5440-pin-pud", PINCFG_TYPE_PUD },
-       { "samsung,exynos5440-pin-drv", PINCFG_TYPE_DRV },
-       { "samsung,exynos5440-pin-skew-rate", PINCFG_TYPE_SKEW_RATE },
-       { "samsung,exynos5440-pin-input-type", PINCFG_TYPE_INPUT_TYPE },
-};
-
-/* check if the selector is a valid pin group selector */
-static int exynos5440_get_group_count(struct pinctrl_dev *pctldev)
-{
-       struct exynos5440_pinctrl_priv_data *priv;
-
-       priv = pinctrl_dev_get_drvdata(pctldev);
-       return priv->nr_groups;
-}
-
-/* return the name of the group selected by the group selector */
-static const char *exynos5440_get_group_name(struct pinctrl_dev *pctldev,
-                                               unsigned selector)
-{
-       struct exynos5440_pinctrl_priv_data *priv;
-
-       priv = pinctrl_dev_get_drvdata(pctldev);
-       return priv->pin_groups[selector].name;
-}
-
-/* return the pin numbers associated with the specified group */
-static int exynos5440_get_group_pins(struct pinctrl_dev *pctldev,
-               unsigned selector, const unsigned **pins, unsigned *num_pins)
-{
-       struct exynos5440_pinctrl_priv_data *priv;
-
-       priv = pinctrl_dev_get_drvdata(pctldev);
-       *pins = priv->pin_groups[selector].pins;
-       *num_pins = priv->pin_groups[selector].num_pins;
-       return 0;
-}
-
-/* create pinctrl_map entries by parsing device tree nodes */
-static int exynos5440_dt_node_to_map(struct pinctrl_dev *pctldev,
-                       struct device_node *np, struct pinctrl_map **maps,
-                       unsigned *nmaps)
-{
-       struct device *dev = pctldev->dev;
-       struct pinctrl_map *map;
-       unsigned long *cfg = NULL;
-       char *gname, *fname;
-       int cfg_cnt = 0, map_cnt = 0, idx = 0;
-
-       /* count the number of config options specfied in the node */
-       for (idx = 0; idx < ARRAY_SIZE(pcfgs); idx++)
-               if (of_find_property(np, pcfgs[idx].prop_cfg, NULL))
-                       cfg_cnt++;
-
-       /*
-        * Find out the number of map entries to create. All the config options
-        * can be accomadated into a single config map entry.
-        */
-       if (cfg_cnt)
-               map_cnt = 1;
-       if (of_find_property(np, "samsung,exynos5440-pin-function", NULL))
-               map_cnt++;
-       if (!map_cnt) {
-               dev_err(dev, "node %s does not have either config or function "
-                               "configurations\n", np->name);
-               return -EINVAL;
-       }
-
-       /* Allocate memory for pin-map entries */
-       map = kzalloc(sizeof(*map) * map_cnt, GFP_KERNEL);
-       if (!map) {
-               dev_err(dev, "could not alloc memory for pin-maps\n");
-               return -ENOMEM;
-       }
-       *nmaps = 0;
-
-       /*
-        * Allocate memory for pin group name. The pin group name is derived
-        * from the node name from which these map entries are be created.
-        */
-       gname = kzalloc(strlen(np->name) + GSUFFIX_LEN, GFP_KERNEL);
-       if (!gname) {
-               dev_err(dev, "failed to alloc memory for group name\n");
-               goto free_map;
-       }
-       snprintf(gname, strlen(np->name) + 4, "%s%s", np->name, GROUP_SUFFIX);
-
-       /*
-        * don't have config options? then skip over to creating function
-        * map entries.
-        */
-       if (!cfg_cnt)
-               goto skip_cfgs;
-
-       /* Allocate memory for config entries */
-       cfg = kzalloc(sizeof(*cfg) * cfg_cnt, GFP_KERNEL);
-       if (!cfg) {
-               dev_err(dev, "failed to alloc memory for configs\n");
-               goto free_gname;
-       }
-
-       /* Prepare a list of config settings */
-       for (idx = 0, cfg_cnt = 0; idx < ARRAY_SIZE(pcfgs); idx++) {
-               u32 value;
-               if (!of_property_read_u32(np, pcfgs[idx].prop_cfg, &value))
-                       cfg[cfg_cnt++] =
-                               PINCFG_PACK(pcfgs[idx].cfg_type, value);
-       }
-
-       /* create the config map entry */
-       map[*nmaps].data.configs.group_or_pin = gname;
-       map[*nmaps].data.configs.configs = cfg;
-       map[*nmaps].data.configs.num_configs = cfg_cnt;
-       map[*nmaps].type = PIN_MAP_TYPE_CONFIGS_GROUP;
-       *nmaps += 1;
-
-skip_cfgs:
-       /* create the function map entry */
-       if (of_find_property(np, "samsung,exynos5440-pin-function", NULL)) {
-               fname = kzalloc(strlen(np->name) + FSUFFIX_LEN, GFP_KERNEL);
-               if (!fname) {
-                       dev_err(dev, "failed to alloc memory for func name\n");
-                       goto free_cfg;
-               }
-               snprintf(fname, strlen(np->name) + 4, "%s%s", np->name,
-                        FUNCTION_SUFFIX);
-
-               map[*nmaps].data.mux.group = gname;
-               map[*nmaps].data.mux.function = fname;
-               map[*nmaps].type = PIN_MAP_TYPE_MUX_GROUP;
-               *nmaps += 1;
-       }
-
-       *maps = map;
-       return 0;
-
-free_cfg:
-       kfree(cfg);
-free_gname:
-       kfree(gname);
-free_map:
-       kfree(map);
-       return -ENOMEM;
-}
-
-/* free the memory allocated to hold the pin-map table */
-static void exynos5440_dt_free_map(struct pinctrl_dev *pctldev,
-                            struct pinctrl_map *map, unsigned num_maps)
-{
-       int idx;
-
-       for (idx = 0; idx < num_maps; idx++) {
-               if (map[idx].type == PIN_MAP_TYPE_MUX_GROUP) {
-                       kfree(map[idx].data.mux.function);
-                       if (!idx)
-                               kfree(map[idx].data.mux.group);
-               } else if (map->type == PIN_MAP_TYPE_CONFIGS_GROUP) {
-                       kfree(map[idx].data.configs.configs);
-                       if (!idx)
-                               kfree(map[idx].data.configs.group_or_pin);
-               }
-       };
-
-       kfree(map);
-}
-
-/* list of pinctrl callbacks for the pinctrl core */
-static const struct pinctrl_ops exynos5440_pctrl_ops = {
-       .get_groups_count       = exynos5440_get_group_count,
-       .get_group_name         = exynos5440_get_group_name,
-       .get_group_pins         = exynos5440_get_group_pins,
-       .dt_node_to_map         = exynos5440_dt_node_to_map,
-       .dt_free_map            = exynos5440_dt_free_map,
-};
-
-/* check if the selector is a valid pin function selector */
-static int exynos5440_get_functions_count(struct pinctrl_dev *pctldev)
-{
-       struct exynos5440_pinctrl_priv_data *priv;
-
-       priv = pinctrl_dev_get_drvdata(pctldev);
-       return priv->nr_functions;
-}
-
-/* return the name of the pin function specified */
-static const char *exynos5440_pinmux_get_fname(struct pinctrl_dev *pctldev,
-                                               unsigned selector)
-{
-       struct exynos5440_pinctrl_priv_data *priv;
-
-       priv = pinctrl_dev_get_drvdata(pctldev);
-       return priv->pmx_functions[selector].name;
-}
-
-/* return the groups associated for the specified function selector */
-static int exynos5440_pinmux_get_groups(struct pinctrl_dev *pctldev,
-               unsigned selector, const char * const **groups,
-               unsigned * const num_groups)
-{
-       struct exynos5440_pinctrl_priv_data *priv;
-
-       priv = pinctrl_dev_get_drvdata(pctldev);
-       *groups = priv->pmx_functions[selector].groups;
-       *num_groups = priv->pmx_functions[selector].num_groups;
-       return 0;
-}
-
-/* enable or disable a pinmux function */
-static void exynos5440_pinmux_setup(struct pinctrl_dev *pctldev, unsigned selector,
-                                       unsigned group, bool enable)
-{
-       struct exynos5440_pinctrl_priv_data *priv;
-       void __iomem *base;
-       u32 function;
-       u32 data;
-
-       priv = pinctrl_dev_get_drvdata(pctldev);
-       base = priv->reg_base;
-       function = priv->pmx_functions[selector].function;
-
-       data = readl(base + GPIO_MUX);
-       if (enable)
-               data |= (1 << function);
-       else
-               data &= ~(1 << function);
-       writel(data, base + GPIO_MUX);
-}
-
-/* enable a specified pinmux by writing to registers */
-static int exynos5440_pinmux_enable(struct pinctrl_dev *pctldev, unsigned selector,
-                                       unsigned group)
-{
-       exynos5440_pinmux_setup(pctldev, selector, group, true);
-       return 0;
-}
-
-/* disable a specified pinmux by writing to registers */
-static void exynos5440_pinmux_disable(struct pinctrl_dev *pctldev,
-                                       unsigned selector, unsigned group)
-{
-       exynos5440_pinmux_setup(pctldev, selector, group, false);
-}
-
-/*
- * The calls to gpio_direction_output() and gpio_direction_input()
- * leads to this function call (via the pinctrl_gpio_direction_{input|output}()
- * function called from the gpiolib interface).
- */
-static int exynos5440_pinmux_gpio_set_direction(struct pinctrl_dev *pctldev,
-               struct pinctrl_gpio_range *range, unsigned offset, bool input)
-{
-       return 0;
-}
-
-/* list of pinmux callbacks for the pinmux vertical in pinctrl core */
-static const struct pinmux_ops exynos5440_pinmux_ops = {
-       .get_functions_count    = exynos5440_get_functions_count,
-       .get_function_name      = exynos5440_pinmux_get_fname,
-       .get_function_groups    = exynos5440_pinmux_get_groups,
-       .enable                 = exynos5440_pinmux_enable,
-       .disable                = exynos5440_pinmux_disable,
-       .gpio_set_direction     = exynos5440_pinmux_gpio_set_direction,
-};
-
-/* set the pin config settings for a specified pin */
-static int exynos5440_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
-                               unsigned long *configs,
-                               unsigned num_configs)
-{
-       struct exynos5440_pinctrl_priv_data *priv;
-       void __iomem *base;
-       enum pincfg_type cfg_type;
-       u32 cfg_value;
-       u32 data;
-       int i;
-
-       priv = pinctrl_dev_get_drvdata(pctldev);
-       base = priv->reg_base;
-
-       for (i = 0; i < num_configs; i++) {
-               cfg_type = PINCFG_UNPACK_TYPE(configs[i]);
-               cfg_value = PINCFG_UNPACK_VALUE(configs[i]);
-
-               switch (cfg_type) {
-               case PINCFG_TYPE_PUD:
-                       /* first set pull enable/disable bit */
-                       data = readl(base + GPIO_PE);
-                       data &= ~(1 << pin);
-                       if (cfg_value)
-                               data |= (1 << pin);
-                       writel(data, base + GPIO_PE);
-
-                       /* then set pull up/down bit */
-                       data = readl(base + GPIO_PS);
-                       data &= ~(1 << pin);
-                       if (cfg_value == 2)
-                               data |= (1 << pin);
-                       writel(data, base + GPIO_PS);
-                       break;
-
-               case PINCFG_TYPE_DRV:
-                       /* set the first bit of the drive strength */
-                       data = readl(base + GPIO_DS0);
-                       data &= ~(1 << pin);
-                       data |= ((cfg_value & 1) << pin);
-                       writel(data, base + GPIO_DS0);
-                       cfg_value >>= 1;
-
-                       /* set the second bit of the driver strength */
-                       data = readl(base + GPIO_DS1);
-                       data &= ~(1 << pin);
-                       data |= ((cfg_value & 1) << pin);
-                       writel(data, base + GPIO_DS1);
-                       break;
-               case PINCFG_TYPE_SKEW_RATE:
-                       data = readl(base + GPIO_SR);
-                       data &= ~(1 << pin);
-                       data |= ((cfg_value & 1) << pin);
-                       writel(data, base + GPIO_SR);
-                       break;
-               case PINCFG_TYPE_INPUT_TYPE:
-                       data = readl(base + GPIO_TYPE);
-                       data &= ~(1 << pin);
-                       data |= ((cfg_value & 1) << pin);
-                       writel(data, base + GPIO_TYPE);
-                       break;
-               default:
-                       WARN_ON(1);
-                       return -EINVAL;
-               }
-       } /* for each config */
-
-       return 0;
-}
-
-/* get the pin config settings for a specified pin */
-static int exynos5440_pinconf_get(struct pinctrl_dev *pctldev, unsigned int pin,
-                                       unsigned long *config)
-{
-       struct exynos5440_pinctrl_priv_data *priv;
-       void __iomem *base;
-       enum pincfg_type cfg_type = PINCFG_UNPACK_TYPE(*config);
-       u32 data;
-
-       priv = pinctrl_dev_get_drvdata(pctldev);
-       base = priv->reg_base;
-
-       switch (cfg_type) {
-       case PINCFG_TYPE_PUD:
-               data = readl(base + GPIO_PE);
-               data = (data >> pin) & 1;
-               if (!data)
-                       *config = 0;
-               else
-                       *config = ((readl(base + GPIO_PS) >> pin) & 1) + 1;
-               break;
-       case PINCFG_TYPE_DRV:
-               data = readl(base + GPIO_DS0);
-               data = (data >> pin) & 1;
-               *config = data;
-               data = readl(base + GPIO_DS1);
-               data = (data >> pin) & 1;
-               *config |= (data << 1);
-               break;
-       case PINCFG_TYPE_SKEW_RATE:
-               data = readl(base + GPIO_SR);
-               *config = (data >> pin) & 1;
-               break;
-       case PINCFG_TYPE_INPUT_TYPE:
-               data = readl(base + GPIO_TYPE);
-               *config = (data >> pin) & 1;
-               break;
-       default:
-               WARN_ON(1);
-               return -EINVAL;
-       }
-
-       return 0;
-}
-
-/* set the pin config settings for a specified pin group */
-static int exynos5440_pinconf_group_set(struct pinctrl_dev *pctldev,
-                       unsigned group, unsigned long *configs,
-                       unsigned num_configs)
-{
-       struct exynos5440_pinctrl_priv_data *priv;
-       const unsigned int *pins;
-       unsigned int cnt;
-
-       priv = pinctrl_dev_get_drvdata(pctldev);
-       pins = priv->pin_groups[group].pins;
-
-       for (cnt = 0; cnt < priv->pin_groups[group].num_pins; cnt++)
-               exynos5440_pinconf_set(pctldev, pins[cnt], configs,
-                                      num_configs);
-
-       return 0;
-}
-
-/* get the pin config settings for a specified pin group */
-static int exynos5440_pinconf_group_get(struct pinctrl_dev *pctldev,
-                               unsigned int group, unsigned long *config)
-{
-       struct exynos5440_pinctrl_priv_data *priv;
-       const unsigned int *pins;
-
-       priv = pinctrl_dev_get_drvdata(pctldev);
-       pins = priv->pin_groups[group].pins;
-       exynos5440_pinconf_get(pctldev, pins[0], config);
-       return 0;
-}
-
-/* list of pinconfig callbacks for pinconfig vertical in the pinctrl code */
-static const struct pinconf_ops exynos5440_pinconf_ops = {
-       .pin_config_get         = exynos5440_pinconf_get,
-       .pin_config_set         = exynos5440_pinconf_set,
-       .pin_config_group_get   = exynos5440_pinconf_group_get,
-       .pin_config_group_set   = exynos5440_pinconf_group_set,
-};
-
-/* gpiolib gpio_set callback function */
-static void exynos5440_gpio_set(struct gpio_chip *gc, unsigned offset, int value)
-{
-       struct exynos5440_pinctrl_priv_data *priv = dev_get_drvdata(gc->dev);
-       void __iomem *base = priv->reg_base;
-       u32 data;
-
-       data = readl(base + GPIO_VAL);
-       data &= ~(1 << offset);
-       if (value)
-               data |= 1 << offset;
-       writel(data, base + GPIO_VAL);
-}
-
-/* gpiolib gpio_get callback function */
-static int exynos5440_gpio_get(struct gpio_chip *gc, unsigned offset)
-{
-       struct exynos5440_pinctrl_priv_data *priv = dev_get_drvdata(gc->dev);
-       void __iomem *base = priv->reg_base;
-       u32 data;
-
-       data = readl(base + GPIO_IN);
-       data >>= offset;
-       data &= 1;
-       return data;
-}
-
-/* gpiolib gpio_direction_input callback function */
-static int exynos5440_gpio_direction_input(struct gpio_chip *gc, unsigned offset)
-{
-       struct exynos5440_pinctrl_priv_data *priv = dev_get_drvdata(gc->dev);
-       void __iomem *base = priv->reg_base;
-       u32 data;
-
-       /* first disable the data output enable on this pin */
-       data = readl(base + GPIO_OE);
-       data &= ~(1 << offset);
-       writel(data, base + GPIO_OE);
-
-       /* now enable input on this pin */
-       data =  readl(base + GPIO_IE);
-       data |= 1 << offset;
-       writel(data, base + GPIO_IE);
-       return 0;
-}
-
-/* gpiolib gpio_direction_output callback function */
-static int exynos5440_gpio_direction_output(struct gpio_chip *gc, unsigned offset,
-                                                       int value)
-{
-       struct exynos5440_pinctrl_priv_data *priv = dev_get_drvdata(gc->dev);
-       void __iomem *base = priv->reg_base;
-       u32 data;
-
-       exynos5440_gpio_set(gc, offset, value);
-
-       /* first disable the data input enable on this pin */
-       data = readl(base + GPIO_IE);
-       data &= ~(1 << offset);
-       writel(data, base + GPIO_IE);
-
-       /* now enable output on this pin */
-       data =  readl(base + GPIO_OE);
-       data |= 1 << offset;
-       writel(data, base + GPIO_OE);
-       return 0;
-}
-
-/* gpiolib gpio_to_irq callback function */
-static int exynos5440_gpio_to_irq(struct gpio_chip *gc, unsigned offset)
-{
-       struct exynos5440_pinctrl_priv_data *priv = dev_get_drvdata(gc->dev);
-       unsigned int virq;
-
-       if (offset < 16 || offset > 23)
-               return -ENXIO;
-
-       if (!priv->irq_domain)
-               return -ENXIO;
-
-       virq = irq_create_mapping(priv->irq_domain, offset - 16);
-       return virq ? : -ENXIO;
-}
-
-/* parse the pin numbers listed in the 'samsung,exynos5440-pins' property */
-static int exynos5440_pinctrl_parse_dt_pins(struct platform_device *pdev,
-                       struct device_node *cfg_np, unsigned int **pin_list,
-                       unsigned int *npins)
-{
-       struct device *dev = &pdev->dev;
-       struct property *prop;
-
-       prop = of_find_property(cfg_np, "samsung,exynos5440-pins", NULL);
-       if (!prop)
-               return -ENOENT;
-
-       *npins = prop->length / sizeof(unsigned long);
-       if (!*npins) {
-               dev_err(dev, "invalid pin list in %s node", cfg_np->name);
-               return -EINVAL;
-       }
-
-       *pin_list = devm_kzalloc(dev, *npins * sizeof(**pin_list), GFP_KERNEL);
-       if (!*pin_list) {
-               dev_err(dev, "failed to allocate memory for pin list\n");
-               return -ENOMEM;
-       }
-
-       return of_property_read_u32_array(cfg_np, "samsung,exynos5440-pins",
-                       *pin_list, *npins);
-}
-
-/*
- * Parse the information about all the available pin groups and pin functions
- * from device node of the pin-controller.
- */
-static int exynos5440_pinctrl_parse_dt(struct platform_device *pdev,
-                               struct exynos5440_pinctrl_priv_data *priv)
-{
-       struct device *dev = &pdev->dev;
-       struct device_node *dev_np = dev->of_node;
-       struct device_node *cfg_np;
-       struct exynos5440_pin_group *groups, *grp;
-       struct exynos5440_pmx_func *functions, *func;
-       unsigned *pin_list;
-       unsigned int npins, grp_cnt, func_idx = 0;
-       char *gname, *fname;
-       int ret;
-
-       grp_cnt = of_get_child_count(dev_np);
-       if (!grp_cnt)
-               return -EINVAL;
-
-       groups = devm_kzalloc(dev, grp_cnt * sizeof(*groups), GFP_KERNEL);
-       if (!groups) {
-               dev_err(dev, "failed allocate memory for ping group list\n");
-               return -EINVAL;
-       }
-       grp = groups;
-
-       functions = devm_kzalloc(dev, grp_cnt * sizeof(*functions), GFP_KERNEL);
-       if (!functions) {
-               dev_err(dev, "failed to allocate memory for function list\n");
-               return -EINVAL;
-       }
-       func = functions;
-
-       /*
-        * Iterate over all the child nodes of the pin controller node
-        * and create pin groups and pin function lists.
-        */
-       for_each_child_of_node(dev_np, cfg_np) {
-               u32 function;
-
-               ret = exynos5440_pinctrl_parse_dt_pins(pdev, cfg_np,
-                                       &pin_list, &npins);
-               if (ret) {
-                       gname = NULL;
-                       goto skip_to_pin_function;
-               }
-
-               /* derive pin group name from the node name */
-               gname = devm_kzalloc(dev, strlen(cfg_np->name) + GSUFFIX_LEN,
-                                       GFP_KERNEL);
-               if (!gname) {
-                       dev_err(dev, "failed to alloc memory for group name\n");
-                       return -ENOMEM;
-               }
-               snprintf(gname, strlen(cfg_np->name) + 4, "%s%s", cfg_np->name,
-                        GROUP_SUFFIX);
-
-               grp->name = gname;
-               grp->pins = pin_list;
-               grp->num_pins = npins;
-               grp++;
-
-skip_to_pin_function:
-               ret = of_property_read_u32(cfg_np, "samsung,exynos5440-pin-function",
-                                               &function);
-               if (ret)
-                       continue;
-
-               /* derive function name from the node name */
-               fname = devm_kzalloc(dev, strlen(cfg_np->name) + FSUFFIX_LEN,
-                                       GFP_KERNEL);
-               if (!fname) {
-                       dev_err(dev, "failed to alloc memory for func name\n");
-                       return -ENOMEM;
-               }
-               snprintf(fname, strlen(cfg_np->name) + 4, "%s%s", cfg_np->name,
-                        FUNCTION_SUFFIX);
-
-               func->name = fname;
-               func->groups = devm_kzalloc(dev, sizeof(char *), GFP_KERNEL);
-               if (!func->groups) {
-                       dev_err(dev, "failed to alloc memory for group list "
-                                       "in pin function");
-                       return -ENOMEM;
-               }
-               func->groups[0] = gname;
-               func->num_groups = gname ? 1 : 0;
-               func->function = function;
-               func++;
-               func_idx++;
-       }
-
-       priv->pin_groups = groups;
-       priv->nr_groups = grp_cnt;
-       priv->pmx_functions = functions;
-       priv->nr_functions = func_idx;
-       return 0;
-}
-
-/* register the pinctrl interface with the pinctrl subsystem */
-static int exynos5440_pinctrl_register(struct platform_device *pdev,
-                               struct exynos5440_pinctrl_priv_data *priv)
-{
-       struct device *dev = &pdev->dev;
-       struct pinctrl_desc *ctrldesc;
-       struct pinctrl_dev *pctl_dev;
-       struct pinctrl_pin_desc *pindesc, *pdesc;
-       struct pinctrl_gpio_range grange;
-       char *pin_names;
-       int pin, ret;
-
-       ctrldesc = devm_kzalloc(dev, sizeof(*ctrldesc), GFP_KERNEL);
-       if (!ctrldesc) {
-               dev_err(dev, "could not allocate memory for pinctrl desc\n");
-               return -ENOMEM;
-       }
-
-       ctrldesc->name = "exynos5440-pinctrl";
-       ctrldesc->owner = THIS_MODULE;
-       ctrldesc->pctlops = &exynos5440_pctrl_ops;
-       ctrldesc->pmxops = &exynos5440_pinmux_ops;
-       ctrldesc->confops = &exynos5440_pinconf_ops;
-
-       pindesc = devm_kzalloc(&pdev->dev, sizeof(*pindesc) *
-                               EXYNOS5440_MAX_PINS, GFP_KERNEL);
-       if (!pindesc) {
-               dev_err(&pdev->dev, "mem alloc for pin descriptors failed\n");
-               return -ENOMEM;
-       }
-       ctrldesc->pins = pindesc;
-       ctrldesc->npins = EXYNOS5440_MAX_PINS;
-
-       /* dynamically populate the pin number and pin name for pindesc */
-       for (pin = 0, pdesc = pindesc; pin < ctrldesc->npins; pin++, pdesc++)
-               pdesc->number = pin;
-
-       /*
-        * allocate space for storing the dynamically generated names for all
-        * the pins which belong to this pin-controller.
-        */
-       pin_names = devm_kzalloc(&pdev->dev, sizeof(char) * PIN_NAME_LENGTH *
-                                       ctrldesc->npins, GFP_KERNEL);
-       if (!pin_names) {
-               dev_err(&pdev->dev, "mem alloc for pin names failed\n");
-               return -ENOMEM;
-       }
-
-       /* for each pin, set the name of the pin */
-       for (pin = 0; pin < ctrldesc->npins; pin++) {
-               snprintf(pin_names, 6, "gpio%02d", pin);
-               pdesc = pindesc + pin;
-               pdesc->name = pin_names;
-               pin_names += PIN_NAME_LENGTH;
-       }
-
-       ret = exynos5440_pinctrl_parse_dt(pdev, priv);
-       if (ret)
-               return ret;
-
-       pctl_dev = pinctrl_register(ctrldesc, &pdev->dev, priv);
-       if (!pctl_dev) {
-               dev_err(&pdev->dev, "could not register pinctrl driver\n");
-               return -EINVAL;
-       }
-
-       grange.name = "exynos5440-pctrl-gpio-range";
-       grange.id = 0;
-       grange.base = 0;
-       grange.npins = EXYNOS5440_MAX_PINS;
-       grange.gc = priv->gc;
-       pinctrl_add_gpio_range(pctl_dev, &grange);
-       return 0;
-}
-
-/* register the gpiolib interface with the gpiolib subsystem */
-static int exynos5440_gpiolib_register(struct platform_device *pdev,
-                               struct exynos5440_pinctrl_priv_data *priv)
-{
-       struct gpio_chip *gc;
-       int ret;
-
-       gc = devm_kzalloc(&pdev->dev, sizeof(*gc), GFP_KERNEL);
-       if (!gc) {
-               dev_err(&pdev->dev, "mem alloc for gpio_chip failed\n");
-               return -ENOMEM;
-       }
-
-       priv->gc = gc;
-       gc->base = 0;
-       gc->ngpio = EXYNOS5440_MAX_PINS;
-       gc->dev = &pdev->dev;
-       gc->set = exynos5440_gpio_set;
-       gc->get = exynos5440_gpio_get;
-       gc->direction_input = exynos5440_gpio_direction_input;
-       gc->direction_output = exynos5440_gpio_direction_output;
-       gc->to_irq = exynos5440_gpio_to_irq;
-       gc->label = "gpiolib-exynos5440";
-       gc->owner = THIS_MODULE;
-       ret = gpiochip_add(gc);
-       if (ret) {
-               dev_err(&pdev->dev, "failed to register gpio_chip %s, error "
-                                       "code: %d\n", gc->label, ret);
-               return ret;
-       }
-
-       return 0;
-}
-
-/* unregister the gpiolib interface with the gpiolib subsystem */
-static int exynos5440_gpiolib_unregister(struct platform_device *pdev,
-                               struct exynos5440_pinctrl_priv_data *priv)
-{
-       int ret = gpiochip_remove(priv->gc);
-       if (ret) {
-               dev_err(&pdev->dev, "gpio chip remove failed\n");
-               return ret;
-       }
-       return 0;
-}
-
-static void exynos5440_gpio_irq_unmask(struct irq_data *irqd)
-{
-       struct exynos5440_pinctrl_priv_data *d;
-       unsigned long gpio_int;
-
-       d = irq_data_get_irq_chip_data(irqd);
-       gpio_int = readl(d->reg_base + GPIO_INT);
-       gpio_int |= 1 << irqd->hwirq;
-       writel(gpio_int, d->reg_base + GPIO_INT);
-}
-
-static void exynos5440_gpio_irq_mask(struct irq_data *irqd)
-{
-       struct exynos5440_pinctrl_priv_data *d;
-       unsigned long gpio_int;
-
-       d = irq_data_get_irq_chip_data(irqd);
-       gpio_int = readl(d->reg_base + GPIO_INT);
-       gpio_int &= ~(1 << irqd->hwirq);
-       writel(gpio_int, d->reg_base + GPIO_INT);
-}
-
-/* irq_chip for gpio interrupts */
-static struct irq_chip exynos5440_gpio_irq_chip = {
-       .name           = "exynos5440_gpio_irq_chip",
-       .irq_unmask     = exynos5440_gpio_irq_unmask,
-       .irq_mask       = exynos5440_gpio_irq_mask,
-};
-
-/* interrupt handler for GPIO interrupts 0..7 */
-static irqreturn_t exynos5440_gpio_irq(int irq, void *data)
-{
-       struct exynos5440_gpio_intr_data *intd = data;
-       struct exynos5440_pinctrl_priv_data *d = intd->priv;
-       int virq;
-
-       virq = irq_linear_revmap(d->irq_domain, intd->gpio_int);
-       if (!virq)
-               return IRQ_NONE;
-       generic_handle_irq(virq);
-       return IRQ_HANDLED;
-}
-
-static int exynos5440_gpio_irq_map(struct irq_domain *h, unsigned int virq,
-                                       irq_hw_number_t hw)
-{
-       struct exynos5440_pinctrl_priv_data *d = h->host_data;
-
-       irq_set_chip_data(virq, d);
-       irq_set_chip_and_handler(virq, &exynos5440_gpio_irq_chip,
-                                       handle_level_irq);
-       set_irq_flags(virq, IRQF_VALID);
-       return 0;
-}
-
-/* irq domain callbacks for gpio interrupt controller */
-static const struct irq_domain_ops exynos5440_gpio_irqd_ops = {
-       .map    = exynos5440_gpio_irq_map,
-       .xlate  = irq_domain_xlate_twocell,
-};
-
-/* setup handling of gpio interrupts */
-static int exynos5440_gpio_irq_init(struct platform_device *pdev,
-                               struct exynos5440_pinctrl_priv_data *priv)
-{
-       struct device *dev = &pdev->dev;
-       struct exynos5440_gpio_intr_data *intd;
-       int i, irq, ret;
-
-       intd = devm_kzalloc(dev, sizeof(*intd) * EXYNOS5440_MAX_GPIO_INT,
-                                       GFP_KERNEL);
-       if (!intd) {
-               dev_err(dev, "failed to allocate memory for gpio intr data\n");
-               return -ENOMEM;
-       }
-
-       for (i = 0; i < EXYNOS5440_MAX_GPIO_INT; i++) {
-               irq = irq_of_parse_and_map(dev->of_node, i);
-               if (irq <= 0) {
-                       dev_err(dev, "irq parsing failed\n");
-                       return -EINVAL;
-               }
-
-               intd->gpio_int = i;
-               intd->priv = priv;
-               ret = devm_request_irq(dev, irq, exynos5440_gpio_irq,
-                                       0, dev_name(dev), intd++);
-               if (ret) {
-                       dev_err(dev, "irq request failed\n");
-                       return -ENXIO;
-               }
-       }
-
-       priv->irq_domain = irq_domain_add_linear(dev->of_node,
-                               EXYNOS5440_MAX_GPIO_INT,
-                               &exynos5440_gpio_irqd_ops, priv);
-       if (!priv->irq_domain) {
-               dev_err(dev, "failed to create irq domain\n");
-               return -ENXIO;
-       }
-
-       return 0;
-}
-
-static int exynos5440_pinctrl_probe(struct platform_device *pdev)
-{
-       struct device *dev = &pdev->dev;
-       struct exynos5440_pinctrl_priv_data *priv;
-       struct resource *res;
-       int ret;
-
-       if (!dev->of_node) {
-               dev_err(dev, "device tree node not found\n");
-               return -ENODEV;
-       }
-
-       priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
-       if (!priv) {
-               dev_err(dev, "could not allocate memory for private data\n");
-               return -ENOMEM;
-       }
-
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       priv->reg_base = devm_ioremap_resource(&pdev->dev, res);
-       if (IS_ERR(priv->reg_base))
-               return PTR_ERR(priv->reg_base);
-
-       ret = exynos5440_gpiolib_register(pdev, priv);
-       if (ret)
-               return ret;
-
-       ret = exynos5440_pinctrl_register(pdev, priv);
-       if (ret) {
-               exynos5440_gpiolib_unregister(pdev, priv);
-               return ret;
-       }
-
-       ret = exynos5440_gpio_irq_init(pdev, priv);
-       if (ret) {
-               dev_err(dev, "failed to setup gpio interrupts\n");
-               return ret;
-       }
-
-       platform_set_drvdata(pdev, priv);
-       dev_info(dev, "EXYNOS5440 pinctrl driver registered\n");
-       return 0;
-}
-
-static const struct of_device_id exynos5440_pinctrl_dt_match[] = {
-       { .compatible = "samsung,exynos5440-pinctrl" },
-       {},
-};
-MODULE_DEVICE_TABLE(of, exynos5440_pinctrl_dt_match);
-
-static struct platform_driver exynos5440_pinctrl_driver = {
-       .probe          = exynos5440_pinctrl_probe,
-       .driver = {
-               .name   = "exynos5440-pinctrl",
-               .owner  = THIS_MODULE,
-               .of_match_table = exynos5440_pinctrl_dt_match,
-       },
-};
-
-static int __init exynos5440_pinctrl_drv_register(void)
-{
-       return platform_driver_register(&exynos5440_pinctrl_driver);
-}
-postcore_initcall(exynos5440_pinctrl_drv_register);
-
-static void __exit exynos5440_pinctrl_drv_unregister(void)
-{
-       platform_driver_unregister(&exynos5440_pinctrl_driver);
-}
-module_exit(exynos5440_pinctrl_drv_unregister);
-
-MODULE_AUTHOR("Thomas Abraham <thomas.ab@samsung.com>");
-MODULE_DESCRIPTION("Samsung EXYNOS5440 SoC pinctrl driver");
-MODULE_LICENSE("GPL v2");
index a24448e5d3996ee81a490710545626be8c83f0a2..946d594a64dddc929884d7306055afcdd63e8efc 100644 (file)
@@ -515,7 +515,7 @@ static int imx_pinctrl_parse_functions(struct device_node *np,
        /* Initialise function */
        func->name = np->name;
        func->num_groups = of_get_child_count(np);
-       if (func->num_groups <= 0) {
+       if (func->num_groups == 0) {
                dev_err(info->dev, "no groups defined in %s\n", np->full_name);
                return -EINVAL;
        }
index 815384b377b5fc192a4cdab6eba6c413e62c53fd..483420757c9fa811049cb3fd4669448b688e1805 100644 (file)
@@ -526,7 +526,7 @@ static int imx1_pinctrl_parse_functions(struct device_node *np,
        /* Initialise function */
        func->name = np->name;
        func->num_groups = of_get_child_count(np);
-       if (func->num_groups <= 0)
+       if (func->num_groups == 0)
                return -EINVAL;
 
        func->groups = devm_kzalloc(info->dev,
diff --git a/drivers/pinctrl/pinctrl-imx1.c b/drivers/pinctrl/pinctrl-imx1.c
new file mode 100644 (file)
index 0000000..533a6e5
--- /dev/null
@@ -0,0 +1,279 @@
+/*
+ * i.MX1 pinctrl driver based on imx pinmux core
+ *
+ * Copyright (C) 2014 Alexander Shiyan <shc_work@mail.ru>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/pinctrl/pinctrl.h>
+
+#include "pinctrl-imx1.h"
+
+#define PAD_ID(port, pin)      ((port) * 32 + (pin))
+#define PA     0
+#define PB     1
+#define PC     2
+#define PD     3
+
+enum imx1_pads {
+       MX1_PAD_A24             = PAD_ID(PA, 0),
+       MX1_PAD_TIN             = PAD_ID(PA, 1),
+       MX1_PAD_PWMO            = PAD_ID(PA, 2),
+       MX1_PAD_CSI_MCLK        = PAD_ID(PA, 3),
+       MX1_PAD_CSI_D0          = PAD_ID(PA, 4),
+       MX1_PAD_CSI_D1          = PAD_ID(PA, 5),
+       MX1_PAD_CSI_D2          = PAD_ID(PA, 6),
+       MX1_PAD_CSI_D3          = PAD_ID(PA, 7),
+       MX1_PAD_CSI_D4          = PAD_ID(PA, 8),
+       MX1_PAD_CSI_D5          = PAD_ID(PA, 9),
+       MX1_PAD_CSI_D6          = PAD_ID(PA, 10),
+       MX1_PAD_CSI_D7          = PAD_ID(PA, 11),
+       MX1_PAD_CSI_VSYNC       = PAD_ID(PA, 12),
+       MX1_PAD_CSI_HSYNC       = PAD_ID(PA, 13),
+       MX1_PAD_CSI_PIXCLK      = PAD_ID(PA, 14),
+       MX1_PAD_I2C_SDA         = PAD_ID(PA, 15),
+       MX1_PAD_I2C_SCL         = PAD_ID(PA, 16),
+       MX1_PAD_DTACK           = PAD_ID(PA, 17),
+       MX1_PAD_BCLK            = PAD_ID(PA, 18),
+       MX1_PAD_LBA             = PAD_ID(PA, 19),
+       MX1_PAD_ECB             = PAD_ID(PA, 20),
+       MX1_PAD_A0              = PAD_ID(PA, 21),
+       MX1_PAD_CS4             = PAD_ID(PA, 22),
+       MX1_PAD_CS5             = PAD_ID(PA, 23),
+       MX1_PAD_A16             = PAD_ID(PA, 24),
+       MX1_PAD_A17             = PAD_ID(PA, 25),
+       MX1_PAD_A18             = PAD_ID(PA, 26),
+       MX1_PAD_A19             = PAD_ID(PA, 27),
+       MX1_PAD_A20             = PAD_ID(PA, 28),
+       MX1_PAD_A21             = PAD_ID(PA, 29),
+       MX1_PAD_A22             = PAD_ID(PA, 30),
+       MX1_PAD_A23             = PAD_ID(PA, 31),
+       MX1_PAD_SD_DAT0         = PAD_ID(PB, 8),
+       MX1_PAD_SD_DAT1         = PAD_ID(PB, 9),
+       MX1_PAD_SD_DAT2         = PAD_ID(PB, 10),
+       MX1_PAD_SD_DAT3         = PAD_ID(PB, 11),
+       MX1_PAD_SD_SCLK         = PAD_ID(PB, 12),
+       MX1_PAD_SD_CMD          = PAD_ID(PB, 13),
+       MX1_PAD_SIM_SVEN        = PAD_ID(PB, 14),
+       MX1_PAD_SIM_PD          = PAD_ID(PB, 15),
+       MX1_PAD_SIM_TX          = PAD_ID(PB, 16),
+       MX1_PAD_SIM_RX          = PAD_ID(PB, 17),
+       MX1_PAD_SIM_RST         = PAD_ID(PB, 18),
+       MX1_PAD_SIM_CLK         = PAD_ID(PB, 19),
+       MX1_PAD_USBD_AFE        = PAD_ID(PB, 20),
+       MX1_PAD_USBD_OE         = PAD_ID(PB, 21),
+       MX1_PAD_USBD_RCV        = PAD_ID(PB, 22),
+       MX1_PAD_USBD_SUSPND     = PAD_ID(PB, 23),
+       MX1_PAD_USBD_VP         = PAD_ID(PB, 24),
+       MX1_PAD_USBD_VM         = PAD_ID(PB, 25),
+       MX1_PAD_USBD_VPO        = PAD_ID(PB, 26),
+       MX1_PAD_USBD_VMO        = PAD_ID(PB, 27),
+       MX1_PAD_UART2_CTS       = PAD_ID(PB, 28),
+       MX1_PAD_UART2_RTS       = PAD_ID(PB, 29),
+       MX1_PAD_UART2_TXD       = PAD_ID(PB, 30),
+       MX1_PAD_UART2_RXD       = PAD_ID(PB, 31),
+       MX1_PAD_SSI_RXFS        = PAD_ID(PC, 3),
+       MX1_PAD_SSI_RXCLK       = PAD_ID(PC, 4),
+       MX1_PAD_SSI_RXDAT       = PAD_ID(PC, 5),
+       MX1_PAD_SSI_TXDAT       = PAD_ID(PC, 6),
+       MX1_PAD_SSI_TXFS        = PAD_ID(PC, 7),
+       MX1_PAD_SSI_TXCLK       = PAD_ID(PC, 8),
+       MX1_PAD_UART1_CTS       = PAD_ID(PC, 9),
+       MX1_PAD_UART1_RTS       = PAD_ID(PC, 10),
+       MX1_PAD_UART1_TXD       = PAD_ID(PC, 11),
+       MX1_PAD_UART1_RXD       = PAD_ID(PC, 12),
+       MX1_PAD_SPI1_RDY        = PAD_ID(PC, 13),
+       MX1_PAD_SPI1_SCLK       = PAD_ID(PC, 14),
+       MX1_PAD_SPI1_SS         = PAD_ID(PC, 15),
+       MX1_PAD_SPI1_MISO       = PAD_ID(PC, 16),
+       MX1_PAD_SPI1_MOSI       = PAD_ID(PC, 17),
+       MX1_PAD_BT13            = PAD_ID(PC, 19),
+       MX1_PAD_BT12            = PAD_ID(PC, 20),
+       MX1_PAD_BT11            = PAD_ID(PC, 21),
+       MX1_PAD_BT10            = PAD_ID(PC, 22),
+       MX1_PAD_BT9             = PAD_ID(PC, 23),
+       MX1_PAD_BT8             = PAD_ID(PC, 24),
+       MX1_PAD_BT7             = PAD_ID(PC, 25),
+       MX1_PAD_BT6             = PAD_ID(PC, 26),
+       MX1_PAD_BT5             = PAD_ID(PC, 27),
+       MX1_PAD_BT4             = PAD_ID(PC, 28),
+       MX1_PAD_BT3             = PAD_ID(PC, 29),
+       MX1_PAD_BT2             = PAD_ID(PC, 30),
+       MX1_PAD_BT1             = PAD_ID(PC, 31),
+       MX1_PAD_LSCLK           = PAD_ID(PD, 6),
+       MX1_PAD_REV             = PAD_ID(PD, 7),
+       MX1_PAD_CLS             = PAD_ID(PD, 8),
+       MX1_PAD_PS              = PAD_ID(PD, 9),
+       MX1_PAD_SPL_SPR         = PAD_ID(PD, 10),
+       MX1_PAD_CONTRAST        = PAD_ID(PD, 11),
+       MX1_PAD_ACD_OE          = PAD_ID(PD, 12),
+       MX1_PAD_LP_HSYNC        = PAD_ID(PD, 13),
+       MX1_PAD_FLM_VSYNC       = PAD_ID(PD, 14),
+       MX1_PAD_LD0             = PAD_ID(PD, 15),
+       MX1_PAD_LD1             = PAD_ID(PD, 16),
+       MX1_PAD_LD2             = PAD_ID(PD, 17),
+       MX1_PAD_LD3             = PAD_ID(PD, 18),
+       MX1_PAD_LD4             = PAD_ID(PD, 19),
+       MX1_PAD_LD5             = PAD_ID(PD, 20),
+       MX1_PAD_LD6             = PAD_ID(PD, 21),
+       MX1_PAD_LD7             = PAD_ID(PD, 22),
+       MX1_PAD_LD8             = PAD_ID(PD, 23),
+       MX1_PAD_LD9             = PAD_ID(PD, 24),
+       MX1_PAD_LD10            = PAD_ID(PD, 25),
+       MX1_PAD_LD11            = PAD_ID(PD, 26),
+       MX1_PAD_LD12            = PAD_ID(PD, 27),
+       MX1_PAD_LD13            = PAD_ID(PD, 28),
+       MX1_PAD_LD14            = PAD_ID(PD, 29),
+       MX1_PAD_LD15            = PAD_ID(PD, 30),
+       MX1_PAD_TMR2OUT         = PAD_ID(PD, 31),
+};
+
+/* Pad names for the pinmux subsystem */
+static const struct pinctrl_pin_desc imx1_pinctrl_pads[] = {
+       IMX_PINCTRL_PIN(MX1_PAD_A24),
+       IMX_PINCTRL_PIN(MX1_PAD_TIN),
+       IMX_PINCTRL_PIN(MX1_PAD_PWMO),
+       IMX_PINCTRL_PIN(MX1_PAD_CSI_MCLK),
+       IMX_PINCTRL_PIN(MX1_PAD_CSI_D0),
+       IMX_PINCTRL_PIN(MX1_PAD_CSI_D1),
+       IMX_PINCTRL_PIN(MX1_PAD_CSI_D2),
+       IMX_PINCTRL_PIN(MX1_PAD_CSI_D3),
+       IMX_PINCTRL_PIN(MX1_PAD_CSI_D4),
+       IMX_PINCTRL_PIN(MX1_PAD_CSI_D5),
+       IMX_PINCTRL_PIN(MX1_PAD_CSI_D6),
+       IMX_PINCTRL_PIN(MX1_PAD_CSI_D7),
+       IMX_PINCTRL_PIN(MX1_PAD_CSI_VSYNC),
+       IMX_PINCTRL_PIN(MX1_PAD_CSI_HSYNC),
+       IMX_PINCTRL_PIN(MX1_PAD_CSI_PIXCLK),
+       IMX_PINCTRL_PIN(MX1_PAD_I2C_SDA),
+       IMX_PINCTRL_PIN(MX1_PAD_I2C_SCL),
+       IMX_PINCTRL_PIN(MX1_PAD_DTACK),
+       IMX_PINCTRL_PIN(MX1_PAD_BCLK),
+       IMX_PINCTRL_PIN(MX1_PAD_LBA),
+       IMX_PINCTRL_PIN(MX1_PAD_ECB),
+       IMX_PINCTRL_PIN(MX1_PAD_A0),
+       IMX_PINCTRL_PIN(MX1_PAD_CS4),
+       IMX_PINCTRL_PIN(MX1_PAD_CS5),
+       IMX_PINCTRL_PIN(MX1_PAD_A16),
+       IMX_PINCTRL_PIN(MX1_PAD_A17),
+       IMX_PINCTRL_PIN(MX1_PAD_A18),
+       IMX_PINCTRL_PIN(MX1_PAD_A19),
+       IMX_PINCTRL_PIN(MX1_PAD_A20),
+       IMX_PINCTRL_PIN(MX1_PAD_A21),
+       IMX_PINCTRL_PIN(MX1_PAD_A22),
+       IMX_PINCTRL_PIN(MX1_PAD_A23),
+       IMX_PINCTRL_PIN(MX1_PAD_SD_DAT0),
+       IMX_PINCTRL_PIN(MX1_PAD_SD_DAT1),
+       IMX_PINCTRL_PIN(MX1_PAD_SD_DAT2),
+       IMX_PINCTRL_PIN(MX1_PAD_SD_DAT3),
+       IMX_PINCTRL_PIN(MX1_PAD_SD_SCLK),
+       IMX_PINCTRL_PIN(MX1_PAD_SD_CMD),
+       IMX_PINCTRL_PIN(MX1_PAD_SIM_SVEN),
+       IMX_PINCTRL_PIN(MX1_PAD_SIM_PD),
+       IMX_PINCTRL_PIN(MX1_PAD_SIM_TX),
+       IMX_PINCTRL_PIN(MX1_PAD_SIM_RX),
+       IMX_PINCTRL_PIN(MX1_PAD_SIM_CLK),
+       IMX_PINCTRL_PIN(MX1_PAD_USBD_AFE),
+       IMX_PINCTRL_PIN(MX1_PAD_USBD_OE),
+       IMX_PINCTRL_PIN(MX1_PAD_USBD_RCV),
+       IMX_PINCTRL_PIN(MX1_PAD_USBD_SUSPND),
+       IMX_PINCTRL_PIN(MX1_PAD_USBD_VP),
+       IMX_PINCTRL_PIN(MX1_PAD_USBD_VM),
+       IMX_PINCTRL_PIN(MX1_PAD_USBD_VPO),
+       IMX_PINCTRL_PIN(MX1_PAD_USBD_VMO),
+       IMX_PINCTRL_PIN(MX1_PAD_UART2_CTS),
+       IMX_PINCTRL_PIN(MX1_PAD_UART2_RTS),
+       IMX_PINCTRL_PIN(MX1_PAD_UART2_TXD),
+       IMX_PINCTRL_PIN(MX1_PAD_UART2_RXD),
+       IMX_PINCTRL_PIN(MX1_PAD_SSI_RXFS),
+       IMX_PINCTRL_PIN(MX1_PAD_SSI_RXCLK),
+       IMX_PINCTRL_PIN(MX1_PAD_SSI_RXDAT),
+       IMX_PINCTRL_PIN(MX1_PAD_SSI_TXDAT),
+       IMX_PINCTRL_PIN(MX1_PAD_SSI_TXFS),
+       IMX_PINCTRL_PIN(MX1_PAD_SSI_TXCLK),
+       IMX_PINCTRL_PIN(MX1_PAD_UART1_CTS),
+       IMX_PINCTRL_PIN(MX1_PAD_UART1_RTS),
+       IMX_PINCTRL_PIN(MX1_PAD_UART1_TXD),
+       IMX_PINCTRL_PIN(MX1_PAD_UART1_RXD),
+       IMX_PINCTRL_PIN(MX1_PAD_SPI1_RDY),
+       IMX_PINCTRL_PIN(MX1_PAD_SPI1_SCLK),
+       IMX_PINCTRL_PIN(MX1_PAD_SPI1_SS),
+       IMX_PINCTRL_PIN(MX1_PAD_SPI1_MISO),
+       IMX_PINCTRL_PIN(MX1_PAD_SPI1_MOSI),
+       IMX_PINCTRL_PIN(MX1_PAD_BT13),
+       IMX_PINCTRL_PIN(MX1_PAD_BT12),
+       IMX_PINCTRL_PIN(MX1_PAD_BT11),
+       IMX_PINCTRL_PIN(MX1_PAD_BT10),
+       IMX_PINCTRL_PIN(MX1_PAD_BT9),
+       IMX_PINCTRL_PIN(MX1_PAD_BT8),
+       IMX_PINCTRL_PIN(MX1_PAD_BT7),
+       IMX_PINCTRL_PIN(MX1_PAD_BT6),
+       IMX_PINCTRL_PIN(MX1_PAD_BT5),
+       IMX_PINCTRL_PIN(MX1_PAD_BT4),
+       IMX_PINCTRL_PIN(MX1_PAD_BT3),
+       IMX_PINCTRL_PIN(MX1_PAD_BT2),
+       IMX_PINCTRL_PIN(MX1_PAD_BT1),
+       IMX_PINCTRL_PIN(MX1_PAD_LSCLK),
+       IMX_PINCTRL_PIN(MX1_PAD_REV),
+       IMX_PINCTRL_PIN(MX1_PAD_CLS),
+       IMX_PINCTRL_PIN(MX1_PAD_PS),
+       IMX_PINCTRL_PIN(MX1_PAD_SPL_SPR),
+       IMX_PINCTRL_PIN(MX1_PAD_CONTRAST),
+       IMX_PINCTRL_PIN(MX1_PAD_ACD_OE),
+       IMX_PINCTRL_PIN(MX1_PAD_LP_HSYNC),
+       IMX_PINCTRL_PIN(MX1_PAD_FLM_VSYNC),
+       IMX_PINCTRL_PIN(MX1_PAD_LD0),
+       IMX_PINCTRL_PIN(MX1_PAD_LD1),
+       IMX_PINCTRL_PIN(MX1_PAD_LD2),
+       IMX_PINCTRL_PIN(MX1_PAD_LD3),
+       IMX_PINCTRL_PIN(MX1_PAD_LD4),
+       IMX_PINCTRL_PIN(MX1_PAD_LD5),
+       IMX_PINCTRL_PIN(MX1_PAD_LD6),
+       IMX_PINCTRL_PIN(MX1_PAD_LD7),
+       IMX_PINCTRL_PIN(MX1_PAD_LD8),
+       IMX_PINCTRL_PIN(MX1_PAD_LD9),
+       IMX_PINCTRL_PIN(MX1_PAD_LD10),
+       IMX_PINCTRL_PIN(MX1_PAD_LD11),
+       IMX_PINCTRL_PIN(MX1_PAD_LD12),
+       IMX_PINCTRL_PIN(MX1_PAD_LD13),
+       IMX_PINCTRL_PIN(MX1_PAD_LD14),
+       IMX_PINCTRL_PIN(MX1_PAD_LD15),
+       IMX_PINCTRL_PIN(MX1_PAD_TMR2OUT),
+};
+
+static struct imx1_pinctrl_soc_info imx1_pinctrl_info = {
+       .pins   = imx1_pinctrl_pads,
+       .npins  = ARRAY_SIZE(imx1_pinctrl_pads),
+};
+
+static int __init imx1_pinctrl_probe(struct platform_device *pdev)
+{
+       return imx1_pinctrl_core_probe(pdev, &imx1_pinctrl_info);
+}
+
+static const struct of_device_id imx1_pinctrl_of_match[] = {
+       { .compatible = "fsl,imx1-iomuxc", },
+       { }
+};
+MODULE_DEVICE_TABLE(of, imx1_pinctrl_of_match);
+
+static struct platform_driver imx1_pinctrl_driver = {
+       .driver = {
+               .name           = "imx1-pinctrl",
+               .owner          = THIS_MODULE,
+               .of_match_table = imx1_pinctrl_of_match,
+       },
+       .remove = imx1_pinctrl_core_remove,
+};
+module_platform_driver_probe(imx1_pinctrl_driver, imx1_pinctrl_probe);
+
+MODULE_AUTHOR("Alexander Shiyan <shc_work@mail.ru>");
+MODULE_DESCRIPTION("Freescale i.MX1 pinctrl driver");
+MODULE_LICENSE("GPL");
index 417c99205bc25acc2388009b154011df74824a04..f8dfefb6996818bfc82635bfd18130c650c4d498 100644 (file)
@@ -63,10 +63,6 @@ enum imx27_pads {
        MX27_PAD_CONTRAST = PAD_ID(PA, 30),
        MX27_PAD_OE_ACD = PAD_ID(PA, 31),
 
-       MX27_PAD_UNUSED0 = PAD_ID(PB, 0),
-       MX27_PAD_UNUSED1 = PAD_ID(PB, 1),
-       MX27_PAD_UNUSED2 = PAD_ID(PB, 2),
-       MX27_PAD_UNUSED3 = PAD_ID(PB, 3),
        MX27_PAD_SD2_D0 = PAD_ID(PB, 4),
        MX27_PAD_SD2_D1 = PAD_ID(PB, 5),
        MX27_PAD_SD2_D2 = PAD_ID(PB, 6),
@@ -96,11 +92,6 @@ enum imx27_pads {
        MX27_PAD_USBH1_RXDM = PAD_ID(PB, 30),
        MX27_PAD_USBH1_RXDP = PAD_ID(PB, 31),
 
-       MX27_PAD_UNUSED4 = PAD_ID(PC, 0),
-       MX27_PAD_UNUSED5 = PAD_ID(PC, 1),
-       MX27_PAD_UNUSED6 = PAD_ID(PC, 2),
-       MX27_PAD_UNUSED7 = PAD_ID(PC, 3),
-       MX27_PAD_UNUSED8 = PAD_ID(PC, 4),
        MX27_PAD_I2C2_SDA = PAD_ID(PC, 5),
        MX27_PAD_I2C2_SCL = PAD_ID(PC, 6),
        MX27_PAD_USBOTG_DATA5 = PAD_ID(PC, 7),
@@ -188,12 +179,6 @@ enum imx27_pads {
        MX27_PAD_SD1_CLK = PAD_ID(PE, 23),
        MX27_PAD_USBOTG_CLK = PAD_ID(PE, 24),
        MX27_PAD_USBOTG_DATA7 = PAD_ID(PE, 25),
-       MX27_PAD_UNUSED9 = PAD_ID(PE, 26),
-       MX27_PAD_UNUSED10 = PAD_ID(PE, 27),
-       MX27_PAD_UNUSED11 = PAD_ID(PE, 28),
-       MX27_PAD_UNUSED12 = PAD_ID(PE, 29),
-       MX27_PAD_UNUSED13 = PAD_ID(PE, 30),
-       MX27_PAD_UNUSED14 = PAD_ID(PE, 31),
 
        MX27_PAD_NFRB = PAD_ID(PF, 0),
        MX27_PAD_NFCLE = PAD_ID(PF, 1),
@@ -219,14 +204,6 @@ enum imx27_pads {
        MX27_PAD_CS4_B = PAD_ID(PF, 21),
        MX27_PAD_CS5_B = PAD_ID(PF, 22),
        MX27_PAD_ATA_DATA15 = PAD_ID(PF, 23),
-       MX27_PAD_UNUSED15 = PAD_ID(PF, 24),
-       MX27_PAD_UNUSED16 = PAD_ID(PF, 25),
-       MX27_PAD_UNUSED17 = PAD_ID(PF, 26),
-       MX27_PAD_UNUSED18 = PAD_ID(PF, 27),
-       MX27_PAD_UNUSED19 = PAD_ID(PF, 28),
-       MX27_PAD_UNUSED20 = PAD_ID(PF, 29),
-       MX27_PAD_UNUSED21 = PAD_ID(PF, 30),
-       MX27_PAD_UNUSED22 = PAD_ID(PF, 31),
 };
 
 /* Pad names for the pinmux subsystem */
@@ -264,10 +241,6 @@ static const struct pinctrl_pin_desc imx27_pinctrl_pads[] = {
        IMX_PINCTRL_PIN(MX27_PAD_CONTRAST),
        IMX_PINCTRL_PIN(MX27_PAD_OE_ACD),
 
-       IMX_PINCTRL_PIN(MX27_PAD_UNUSED0),
-       IMX_PINCTRL_PIN(MX27_PAD_UNUSED1),
-       IMX_PINCTRL_PIN(MX27_PAD_UNUSED2),
-       IMX_PINCTRL_PIN(MX27_PAD_UNUSED3),
        IMX_PINCTRL_PIN(MX27_PAD_SD2_D0),
        IMX_PINCTRL_PIN(MX27_PAD_SD2_D1),
        IMX_PINCTRL_PIN(MX27_PAD_SD2_D2),
@@ -297,11 +270,6 @@ static const struct pinctrl_pin_desc imx27_pinctrl_pads[] = {
        IMX_PINCTRL_PIN(MX27_PAD_USBH1_RXDM),
        IMX_PINCTRL_PIN(MX27_PAD_USBH1_RXDP),
 
-       IMX_PINCTRL_PIN(MX27_PAD_UNUSED4),
-       IMX_PINCTRL_PIN(MX27_PAD_UNUSED5),
-       IMX_PINCTRL_PIN(MX27_PAD_UNUSED6),
-       IMX_PINCTRL_PIN(MX27_PAD_UNUSED7),
-       IMX_PINCTRL_PIN(MX27_PAD_UNUSED8),
        IMX_PINCTRL_PIN(MX27_PAD_I2C2_SDA),
        IMX_PINCTRL_PIN(MX27_PAD_I2C2_SCL),
        IMX_PINCTRL_PIN(MX27_PAD_USBOTG_DATA5),
@@ -389,12 +357,6 @@ static const struct pinctrl_pin_desc imx27_pinctrl_pads[] = {
        IMX_PINCTRL_PIN(MX27_PAD_SD1_CLK),
        IMX_PINCTRL_PIN(MX27_PAD_USBOTG_CLK),
        IMX_PINCTRL_PIN(MX27_PAD_USBOTG_DATA7),
-       IMX_PINCTRL_PIN(MX27_PAD_UNUSED9),
-       IMX_PINCTRL_PIN(MX27_PAD_UNUSED10),
-       IMX_PINCTRL_PIN(MX27_PAD_UNUSED11),
-       IMX_PINCTRL_PIN(MX27_PAD_UNUSED12),
-       IMX_PINCTRL_PIN(MX27_PAD_UNUSED13),
-       IMX_PINCTRL_PIN(MX27_PAD_UNUSED14),
 
        IMX_PINCTRL_PIN(MX27_PAD_NFRB),
        IMX_PINCTRL_PIN(MX27_PAD_NFCLE),
@@ -420,14 +382,6 @@ static const struct pinctrl_pin_desc imx27_pinctrl_pads[] = {
        IMX_PINCTRL_PIN(MX27_PAD_CS4_B),
        IMX_PINCTRL_PIN(MX27_PAD_CS5_B),
        IMX_PINCTRL_PIN(MX27_PAD_ATA_DATA15),
-       IMX_PINCTRL_PIN(MX27_PAD_UNUSED15),
-       IMX_PINCTRL_PIN(MX27_PAD_UNUSED16),
-       IMX_PINCTRL_PIN(MX27_PAD_UNUSED17),
-       IMX_PINCTRL_PIN(MX27_PAD_UNUSED18),
-       IMX_PINCTRL_PIN(MX27_PAD_UNUSED19),
-       IMX_PINCTRL_PIN(MX27_PAD_UNUSED20),
-       IMX_PINCTRL_PIN(MX27_PAD_UNUSED21),
-       IMX_PINCTRL_PIN(MX27_PAD_UNUSED22),
 };
 
 static struct imx1_pinctrl_soc_info imx27_pinctrl_info = {
@@ -440,12 +394,6 @@ static struct of_device_id imx27_pinctrl_of_match[] = {
        { /* sentinel */ }
 };
 
-struct imx27_pinctrl_private {
-       int num_gpio_childs;
-       struct platform_device **gpio_dev;
-       struct mxc_gpio_platform_data *gpio_pdata;
-};
-
 static int imx27_pinctrl_probe(struct platform_device *pdev)
 {
        return imx1_pinctrl_core_probe(pdev, &imx27_pinctrl_info);
diff --git a/drivers/pinctrl/pinctrl-ipq8064.c b/drivers/pinctrl/pinctrl-ipq8064.c
deleted file mode 100644 (file)
index acafea4..0000000
+++ /dev/null
@@ -1,653 +0,0 @@
-/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 and
- * only version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- */
-
-#include <linux/module.h>
-#include <linux/of.h>
-#include <linux/platform_device.h>
-#include <linux/pinctrl/pinctrl.h>
-
-#include "pinctrl-msm.h"
-
-static const struct pinctrl_pin_desc ipq8064_pins[] = {
-       PINCTRL_PIN(0, "GPIO_0"),
-       PINCTRL_PIN(1, "GPIO_1"),
-       PINCTRL_PIN(2, "GPIO_2"),
-       PINCTRL_PIN(3, "GPIO_3"),
-       PINCTRL_PIN(4, "GPIO_4"),
-       PINCTRL_PIN(5, "GPIO_5"),
-       PINCTRL_PIN(6, "GPIO_6"),
-       PINCTRL_PIN(7, "GPIO_7"),
-       PINCTRL_PIN(8, "GPIO_8"),
-       PINCTRL_PIN(9, "GPIO_9"),
-       PINCTRL_PIN(10, "GPIO_10"),
-       PINCTRL_PIN(11, "GPIO_11"),
-       PINCTRL_PIN(12, "GPIO_12"),
-       PINCTRL_PIN(13, "GPIO_13"),
-       PINCTRL_PIN(14, "GPIO_14"),
-       PINCTRL_PIN(15, "GPIO_15"),
-       PINCTRL_PIN(16, "GPIO_16"),
-       PINCTRL_PIN(17, "GPIO_17"),
-       PINCTRL_PIN(18, "GPIO_18"),
-       PINCTRL_PIN(19, "GPIO_19"),
-       PINCTRL_PIN(20, "GPIO_20"),
-       PINCTRL_PIN(21, "GPIO_21"),
-       PINCTRL_PIN(22, "GPIO_22"),
-       PINCTRL_PIN(23, "GPIO_23"),
-       PINCTRL_PIN(24, "GPIO_24"),
-       PINCTRL_PIN(25, "GPIO_25"),
-       PINCTRL_PIN(26, "GPIO_26"),
-       PINCTRL_PIN(27, "GPIO_27"),
-       PINCTRL_PIN(28, "GPIO_28"),
-       PINCTRL_PIN(29, "GPIO_29"),
-       PINCTRL_PIN(30, "GPIO_30"),
-       PINCTRL_PIN(31, "GPIO_31"),
-       PINCTRL_PIN(32, "GPIO_32"),
-       PINCTRL_PIN(33, "GPIO_33"),
-       PINCTRL_PIN(34, "GPIO_34"),
-       PINCTRL_PIN(35, "GPIO_35"),
-       PINCTRL_PIN(36, "GPIO_36"),
-       PINCTRL_PIN(37, "GPIO_37"),
-       PINCTRL_PIN(38, "GPIO_38"),
-       PINCTRL_PIN(39, "GPIO_39"),
-       PINCTRL_PIN(40, "GPIO_40"),
-       PINCTRL_PIN(41, "GPIO_41"),
-       PINCTRL_PIN(42, "GPIO_42"),
-       PINCTRL_PIN(43, "GPIO_43"),
-       PINCTRL_PIN(44, "GPIO_44"),
-       PINCTRL_PIN(45, "GPIO_45"),
-       PINCTRL_PIN(46, "GPIO_46"),
-       PINCTRL_PIN(47, "GPIO_47"),
-       PINCTRL_PIN(48, "GPIO_48"),
-       PINCTRL_PIN(49, "GPIO_49"),
-       PINCTRL_PIN(50, "GPIO_50"),
-       PINCTRL_PIN(51, "GPIO_51"),
-       PINCTRL_PIN(52, "GPIO_52"),
-       PINCTRL_PIN(53, "GPIO_53"),
-       PINCTRL_PIN(54, "GPIO_54"),
-       PINCTRL_PIN(55, "GPIO_55"),
-       PINCTRL_PIN(56, "GPIO_56"),
-       PINCTRL_PIN(57, "GPIO_57"),
-       PINCTRL_PIN(58, "GPIO_58"),
-       PINCTRL_PIN(59, "GPIO_59"),
-       PINCTRL_PIN(60, "GPIO_60"),
-       PINCTRL_PIN(61, "GPIO_61"),
-       PINCTRL_PIN(62, "GPIO_62"),
-       PINCTRL_PIN(63, "GPIO_63"),
-       PINCTRL_PIN(64, "GPIO_64"),
-       PINCTRL_PIN(65, "GPIO_65"),
-       PINCTRL_PIN(66, "GPIO_66"),
-       PINCTRL_PIN(67, "GPIO_67"),
-       PINCTRL_PIN(68, "GPIO_68"),
-
-       PINCTRL_PIN(69, "SDC3_CLK"),
-       PINCTRL_PIN(70, "SDC3_CMD"),
-       PINCTRL_PIN(71, "SDC3_DATA"),
-};
-
-#define DECLARE_IPQ_GPIO_PINS(pin) static const unsigned int gpio##pin##_pins[] = { pin }
-DECLARE_IPQ_GPIO_PINS(0);
-DECLARE_IPQ_GPIO_PINS(1);
-DECLARE_IPQ_GPIO_PINS(2);
-DECLARE_IPQ_GPIO_PINS(3);
-DECLARE_IPQ_GPIO_PINS(4);
-DECLARE_IPQ_GPIO_PINS(5);
-DECLARE_IPQ_GPIO_PINS(6);
-DECLARE_IPQ_GPIO_PINS(7);
-DECLARE_IPQ_GPIO_PINS(8);
-DECLARE_IPQ_GPIO_PINS(9);
-DECLARE_IPQ_GPIO_PINS(10);
-DECLARE_IPQ_GPIO_PINS(11);
-DECLARE_IPQ_GPIO_PINS(12);
-DECLARE_IPQ_GPIO_PINS(13);
-DECLARE_IPQ_GPIO_PINS(14);
-DECLARE_IPQ_GPIO_PINS(15);
-DECLARE_IPQ_GPIO_PINS(16);
-DECLARE_IPQ_GPIO_PINS(17);
-DECLARE_IPQ_GPIO_PINS(18);
-DECLARE_IPQ_GPIO_PINS(19);
-DECLARE_IPQ_GPIO_PINS(20);
-DECLARE_IPQ_GPIO_PINS(21);
-DECLARE_IPQ_GPIO_PINS(22);
-DECLARE_IPQ_GPIO_PINS(23);
-DECLARE_IPQ_GPIO_PINS(24);
-DECLARE_IPQ_GPIO_PINS(25);
-DECLARE_IPQ_GPIO_PINS(26);
-DECLARE_IPQ_GPIO_PINS(27);
-DECLARE_IPQ_GPIO_PINS(28);
-DECLARE_IPQ_GPIO_PINS(29);
-DECLARE_IPQ_GPIO_PINS(30);
-DECLARE_IPQ_GPIO_PINS(31);
-DECLARE_IPQ_GPIO_PINS(32);
-DECLARE_IPQ_GPIO_PINS(33);
-DECLARE_IPQ_GPIO_PINS(34);
-DECLARE_IPQ_GPIO_PINS(35);
-DECLARE_IPQ_GPIO_PINS(36);
-DECLARE_IPQ_GPIO_PINS(37);
-DECLARE_IPQ_GPIO_PINS(38);
-DECLARE_IPQ_GPIO_PINS(39);
-DECLARE_IPQ_GPIO_PINS(40);
-DECLARE_IPQ_GPIO_PINS(41);
-DECLARE_IPQ_GPIO_PINS(42);
-DECLARE_IPQ_GPIO_PINS(43);
-DECLARE_IPQ_GPIO_PINS(44);
-DECLARE_IPQ_GPIO_PINS(45);
-DECLARE_IPQ_GPIO_PINS(46);
-DECLARE_IPQ_GPIO_PINS(47);
-DECLARE_IPQ_GPIO_PINS(48);
-DECLARE_IPQ_GPIO_PINS(49);
-DECLARE_IPQ_GPIO_PINS(50);
-DECLARE_IPQ_GPIO_PINS(51);
-DECLARE_IPQ_GPIO_PINS(52);
-DECLARE_IPQ_GPIO_PINS(53);
-DECLARE_IPQ_GPIO_PINS(54);
-DECLARE_IPQ_GPIO_PINS(55);
-DECLARE_IPQ_GPIO_PINS(56);
-DECLARE_IPQ_GPIO_PINS(57);
-DECLARE_IPQ_GPIO_PINS(58);
-DECLARE_IPQ_GPIO_PINS(59);
-DECLARE_IPQ_GPIO_PINS(60);
-DECLARE_IPQ_GPIO_PINS(61);
-DECLARE_IPQ_GPIO_PINS(62);
-DECLARE_IPQ_GPIO_PINS(63);
-DECLARE_IPQ_GPIO_PINS(64);
-DECLARE_IPQ_GPIO_PINS(65);
-DECLARE_IPQ_GPIO_PINS(66);
-DECLARE_IPQ_GPIO_PINS(67);
-DECLARE_IPQ_GPIO_PINS(68);
-
-static const unsigned int sdc3_clk_pins[] = { 69 };
-static const unsigned int sdc3_cmd_pins[] = { 70 };
-static const unsigned int sdc3_data_pins[] = { 71 };
-
-#define FUNCTION(fname)                                        \
-       [IPQ_MUX_##fname] = {                           \
-               .name = #fname,                         \
-               .groups = fname##_groups,               \
-               .ngroups = ARRAY_SIZE(fname##_groups),  \
-       }
-
-#define PINGROUP(id, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10) \
-       {                                               \
-               .name = "gpio" #id,                     \
-               .pins = gpio##id##_pins,                \
-               .npins = ARRAY_SIZE(gpio##id##_pins),   \
-               .funcs = (int[]){                       \
-                       IPQ_MUX_NA, /* gpio mode */     \
-                       IPQ_MUX_##f1,                   \
-                       IPQ_MUX_##f2,                   \
-                       IPQ_MUX_##f3,                   \
-                       IPQ_MUX_##f4,                   \
-                       IPQ_MUX_##f5,                   \
-                       IPQ_MUX_##f6,                   \
-                       IPQ_MUX_##f7,                   \
-                       IPQ_MUX_##f8,                   \
-                       IPQ_MUX_##f9,                   \
-                       IPQ_MUX_##f10,                  \
-               },                                      \
-               .nfuncs = 11,                           \
-               .ctl_reg = 0x1000 + 0x10 * id,          \
-               .io_reg = 0x1004 + 0x10 * id,           \
-               .intr_cfg_reg = 0x1008 + 0x10 * id,     \
-               .intr_status_reg = 0x100c + 0x10 * id,  \
-               .intr_target_reg = 0x400 + 0x4 * id,    \
-               .mux_bit = 2,                           \
-               .pull_bit = 0,                          \
-               .drv_bit = 6,                           \
-               .oe_bit = 9,                            \
-               .in_bit = 0,                            \
-               .out_bit = 1,                           \
-               .intr_enable_bit = 0,                   \
-               .intr_status_bit = 0,                   \
-               .intr_ack_high = 1,                     \
-               .intr_target_bit = 0,                   \
-               .intr_raw_status_bit = 3,               \
-               .intr_polarity_bit = 1,                 \
-               .intr_detection_bit = 2,                \
-               .intr_detection_width = 1,              \
-       }
-
-#define SDC_PINGROUP(pg_name, ctl, pull, drv)          \
-       {                                               \
-               .name = #pg_name,                       \
-               .pins = pg_name##_pins,                 \
-               .npins = ARRAY_SIZE(pg_name##_pins),    \
-               .ctl_reg = ctl,                         \
-               .io_reg = 0,                            \
-               .intr_cfg_reg = 0,                      \
-               .intr_status_reg = 0,                   \
-               .intr_target_reg = 0,                   \
-               .mux_bit = -1,                          \
-               .pull_bit = pull,                       \
-               .drv_bit = drv,                         \
-               .oe_bit = -1,                           \
-               .in_bit = -1,                           \
-               .out_bit = -1,                          \
-               .intr_enable_bit = -1,                  \
-               .intr_status_bit = -1,                  \
-               .intr_target_bit = -1,                  \
-               .intr_raw_status_bit = -1,              \
-               .intr_polarity_bit = -1,                \
-               .intr_detection_bit = -1,               \
-               .intr_detection_width = -1,             \
-       }
-
-enum ipq8064_functions {
-       IPQ_MUX_mdio,
-       IPQ_MUX_mi2s,
-       IPQ_MUX_pdm,
-       IPQ_MUX_ssbi,
-       IPQ_MUX_spmi,
-       IPQ_MUX_audio_pcm,
-       IPQ_MUX_gsbi1,
-       IPQ_MUX_gsbi2,
-       IPQ_MUX_gsbi4,
-       IPQ_MUX_gsbi5,
-       IPQ_MUX_gsbi5_spi_cs1,
-       IPQ_MUX_gsbi5_spi_cs2,
-       IPQ_MUX_gsbi5_spi_cs3,
-       IPQ_MUX_gsbi6,
-       IPQ_MUX_gsbi7,
-       IPQ_MUX_nss_spi,
-       IPQ_MUX_sdc1,
-       IPQ_MUX_spdif,
-       IPQ_MUX_nand,
-       IPQ_MUX_tsif1,
-       IPQ_MUX_tsif2,
-       IPQ_MUX_usb_fs_n,
-       IPQ_MUX_usb_fs,
-       IPQ_MUX_usb2_hsic,
-       IPQ_MUX_rgmii2,
-       IPQ_MUX_sata,
-       IPQ_MUX_pcie1_rst,
-       IPQ_MUX_pcie1_prsnt,
-       IPQ_MUX_pcie1_pwrflt,
-       IPQ_MUX_pcie1_pwren_n,
-       IPQ_MUX_pcie1_pwren,
-       IPQ_MUX_pcie1_clk_req,
-       IPQ_MUX_pcie2_rst,
-       IPQ_MUX_pcie2_prsnt,
-       IPQ_MUX_pcie2_pwrflt,
-       IPQ_MUX_pcie2_pwren_n,
-       IPQ_MUX_pcie2_pwren,
-       IPQ_MUX_pcie2_clk_req,
-       IPQ_MUX_pcie3_rst,
-       IPQ_MUX_pcie3_prsnt,
-       IPQ_MUX_pcie3_pwrflt,
-       IPQ_MUX_pcie3_pwren_n,
-       IPQ_MUX_pcie3_pwren,
-       IPQ_MUX_pcie3_clk_req,
-       IPQ_MUX_ps_hold,
-       IPQ_MUX_NA,
-};
-
-static const char * const mdio_groups[] = {
-       "gpio0", "gpio1", "gpio10", "gpio11",
-};
-
-static const char * const mi2s_groups[] = {
-       "gpio27", "gpio28", "gpio29", "gpio30", "gpio31", "gpio32",
-       "gpio33", "gpio55", "gpio56", "gpio57", "gpio58",
-};
-
-static const char * const pdm_groups[] = {
-       "gpio3", "gpio16", "gpio17", "gpio22", "gpio30", "gpio31",
-       "gpio34", "gpio35", "gpio52", "gpio55", "gpio56", "gpio58",
-       "gpio59",
-};
-
-static const char * const ssbi_groups[] = {
-       "gpio10", "gpio11",
-};
-
-static const char * const spmi_groups[] = {
-       "gpio10", "gpio11",
-};
-
-static const char * const audio_pcm_groups[] = {
-       "gpio14", "gpio15", "gpio16", "gpio17",
-};
-
-static const char * const gsbi1_groups[] = {
-       "gpio51", "gpio52", "gpio53", "gpio54",
-};
-
-static const char * const gsbi2_groups[] = {
-       "gpio22", "gpio23", "gpio24", "gpio25",
-};
-
-static const char * const gsbi4_groups[] = {
-       "gpio10", "gpio11", "gpio12", "gpio13",
-};
-
-static const char * const gsbi5_groups[] = {
-       "gpio18", "gpio19", "gpio20", "gpio21",
-};
-
-static const char * const gsbi5_spi_cs1_groups[] = {
-       "gpio6", "gpio61",
-};
-
-static const char * const gsbi5_spi_cs2_groups[] = {
-       "gpio7", "gpio62",
-};
-
-static const char * const gsbi5_spi_cs3_groups[] = {
-       "gpio2",
-};
-
-static const char * const gsbi6_groups[] = {
-       "gpio27", "gpio28", "gpio29", "gpio30", "gpio55", "gpio56",
-       "gpio57", "gpio58",
-};
-
-static const char * const gsbi7_groups[] = {
-       "gpio6", "gpio7", "gpio8", "gpio9",
-};
-
-static const char * const nss_spi_groups[] = {
-       "gpio14", "gpio15", "gpio16", "gpio17", "gpio55", "gpio56",
-       "gpio57", "gpio58",
-};
-
-static const char * const sdc1_groups[] = {
-       "gpio38", "gpio39", "gpio40", "gpio41", "gpio42", "gpio43",
-       "gpio44", "gpio45", "gpio46", "gpio47",
-};
-
-static const char * const spdif_groups[] = {
-       "gpio10", "gpio48",
-};
-
-static const char * const nand_groups[] = {
-       "gpio34", "gpio35", "gpio36", "gpio37", "gpio38", "gpio39",
-       "gpio40", "gpio41", "gpio42", "gpio43", "gpio44", "gpio45",
-       "gpio46", "gpio47",
-};
-
-static const char * const tsif1_groups[] = {
-       "gpio55", "gpio56", "gpio57", "gpio58",
-};
-
-static const char * const tsif2_groups[] = {
-       "gpio59", "gpio60", "gpio61", "gpio62",
-};
-
-static const char * const usb_fs_n_groups[] = {
-       "gpio6",
-};
-
-static const char * const usb_fs_groups[] = {
-       "gpio6", "gpio7", "gpio8",
-};
-
-static const char * const usb2_hsic_groups[] = {
-       "gpio67", "gpio68",
-};
-
-static const char * const rgmii2_groups[] = {
-       "gpio27", "gpio28", "gpio29", "gpio30", "gpio31", "gpio32",
-       "gpio51", "gpio52", "gpio59", "gpio60", "gpio61", "gpio62",
-};
-
-static const char * const sata_groups[] = {
-       "gpio10",
-};
-
-static const char * const pcie1_rst_groups[] = {
-       "gpio3",
-};
-
-static const char * const pcie1_prsnt_groups[] = {
-       "gpio3", "gpio11",
-};
-
-static const char * const pcie1_pwren_n_groups[] = {
-       "gpio4", "gpio12",
-};
-
-static const char * const pcie1_pwren_groups[] = {
-       "gpio4", "gpio12",
-};
-
-static const char * const pcie1_pwrflt_groups[] = {
-       "gpio5", "gpio13",
-};
-
-static const char * const pcie1_clk_req_groups[] = {
-       "gpio5",
-};
-
-static const char * const pcie2_rst_groups[] = {
-       "gpio48",
-};
-
-static const char * const pcie2_prsnt_groups[] = {
-       "gpio11", "gpio48",
-};
-
-static const char * const pcie2_pwren_n_groups[] = {
-       "gpio12", "gpio49",
-};
-
-static const char * const pcie2_pwren_groups[] = {
-       "gpio12", "gpio49",
-};
-
-static const char * const pcie2_pwrflt_groups[] = {
-       "gpio13", "gpio50",
-};
-
-static const char * const pcie2_clk_req_groups[] = {
-       "gpio50",
-};
-
-static const char * const pcie3_rst_groups[] = {
-       "gpio63",
-};
-
-static const char * const pcie3_prsnt_groups[] = {
-       "gpio11",
-};
-
-static const char * const pcie3_pwren_n_groups[] = {
-       "gpio12",
-};
-
-static const char * const pcie3_pwren_groups[] = {
-       "gpio12",
-};
-
-static const char * const pcie3_pwrflt_groups[] = {
-       "gpio13",
-};
-
-static const char * const pcie3_clk_req_groups[] = {
-       "gpio65",
-};
-
-static const char * const ps_hold_groups[] = {
-       "gpio26",
-};
-
-static const struct msm_function ipq8064_functions[] = {
-       FUNCTION(mdio),
-       FUNCTION(ssbi),
-       FUNCTION(spmi),
-       FUNCTION(mi2s),
-       FUNCTION(pdm),
-       FUNCTION(audio_pcm),
-       FUNCTION(gsbi1),
-       FUNCTION(gsbi2),
-       FUNCTION(gsbi4),
-       FUNCTION(gsbi5),
-       FUNCTION(gsbi5_spi_cs1),
-       FUNCTION(gsbi5_spi_cs2),
-       FUNCTION(gsbi5_spi_cs3),
-       FUNCTION(gsbi6),
-       FUNCTION(gsbi7),
-       FUNCTION(nss_spi),
-       FUNCTION(sdc1),
-       FUNCTION(spdif),
-       FUNCTION(nand),
-       FUNCTION(tsif1),
-       FUNCTION(tsif2),
-       FUNCTION(usb_fs_n),
-       FUNCTION(usb_fs),
-       FUNCTION(usb2_hsic),
-       FUNCTION(rgmii2),
-       FUNCTION(sata),
-       FUNCTION(pcie1_rst),
-       FUNCTION(pcie1_prsnt),
-       FUNCTION(pcie1_pwren_n),
-       FUNCTION(pcie1_pwren),
-       FUNCTION(pcie1_pwrflt),
-       FUNCTION(pcie1_clk_req),
-       FUNCTION(pcie2_rst),
-       FUNCTION(pcie2_prsnt),
-       FUNCTION(pcie2_pwren_n),
-       FUNCTION(pcie2_pwren),
-       FUNCTION(pcie2_pwrflt),
-       FUNCTION(pcie2_clk_req),
-       FUNCTION(pcie3_rst),
-       FUNCTION(pcie3_prsnt),
-       FUNCTION(pcie3_pwren_n),
-       FUNCTION(pcie3_pwren),
-       FUNCTION(pcie3_pwrflt),
-       FUNCTION(pcie3_clk_req),
-       FUNCTION(ps_hold),
-};
-
-static const struct msm_pingroup ipq8064_groups[] = {
-       PINGROUP(0, mdio, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(1, mdio, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(2, gsbi5_spi_cs3, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(3, pcie1_rst, pcie1_prsnt, pdm, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(4, pcie1_pwren_n, pcie1_pwren, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(5, pcie1_clk_req, pcie1_pwrflt, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(6, gsbi7, usb_fs, gsbi5_spi_cs1, usb_fs_n, NA, NA, NA, NA, NA, NA),
-       PINGROUP(7, gsbi7, usb_fs, gsbi5_spi_cs2, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(8, gsbi7, usb_fs, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(9, gsbi7, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(10, gsbi4, spdif, sata, ssbi, mdio, spmi, NA, NA, NA, NA),
-       PINGROUP(11, gsbi4, pcie2_prsnt, pcie1_prsnt, pcie3_prsnt, ssbi, mdio, spmi, NA, NA, NA),
-       PINGROUP(12, gsbi4, pcie2_pwren_n, pcie1_pwren_n, pcie3_pwren_n, pcie2_pwren, pcie1_pwren, pcie3_pwren, NA, NA, NA),
-       PINGROUP(13, gsbi4, pcie2_pwrflt, pcie1_pwrflt, pcie3_pwrflt, NA, NA, NA, NA, NA, NA),
-       PINGROUP(14, audio_pcm, nss_spi, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(15, audio_pcm, nss_spi, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(16, audio_pcm, nss_spi, pdm, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(17, audio_pcm, nss_spi, pdm, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(18, gsbi5, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(19, gsbi5, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(20, gsbi5, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(21, gsbi5, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(22, gsbi2, pdm, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(23, gsbi2, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(24, gsbi2, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(25, gsbi2, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(26, ps_hold, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(27, mi2s, rgmii2, gsbi6, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(28, mi2s, rgmii2, gsbi6, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(29, mi2s, rgmii2, gsbi6, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(30, mi2s, rgmii2, gsbi6, pdm, NA, NA, NA, NA, NA, NA),
-       PINGROUP(31, mi2s, rgmii2, pdm, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(32, mi2s, rgmii2, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(33, mi2s, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(34, nand, pdm, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(35, nand, pdm, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(36, nand, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(37, nand, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(38, nand, sdc1, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(39, nand, sdc1, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(40, nand, sdc1, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(41, nand, sdc1, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(42, nand, sdc1, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(43, nand, sdc1, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(44, nand, sdc1, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(45, nand, sdc1, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(46, nand, sdc1, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(47, nand, sdc1, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(48, pcie2_rst, spdif, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(49, pcie2_pwren_n, pcie2_pwren, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(50, pcie2_clk_req, pcie2_pwrflt, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(51, gsbi1, rgmii2, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(52, gsbi1, rgmii2, pdm, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(53, gsbi1, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(54, gsbi1, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(55, tsif1, mi2s, gsbi6, pdm, nss_spi, NA, NA, NA, NA, NA),
-       PINGROUP(56, tsif1, mi2s, gsbi6, pdm, nss_spi, NA, NA, NA, NA, NA),
-       PINGROUP(57, tsif1, mi2s, gsbi6, nss_spi, NA, NA, NA, NA, NA, NA),
-       PINGROUP(58, tsif1, mi2s, gsbi6, pdm, nss_spi, NA, NA, NA, NA, NA),
-       PINGROUP(59, tsif2, rgmii2, pdm, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(60, tsif2, rgmii2, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(61, tsif2, rgmii2, gsbi5_spi_cs1, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(62, tsif2, rgmii2, gsbi5_spi_cs2, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(63, pcie3_rst, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(64, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(65, pcie3_clk_req, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(66, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(67, usb2_hsic, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(68, usb2_hsic, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       SDC_PINGROUP(sdc3_clk, 0x204a, 14, 6),
-       SDC_PINGROUP(sdc3_cmd, 0x204a, 11, 3),
-       SDC_PINGROUP(sdc3_data, 0x204a, 9, 0),
-};
-
-#define NUM_GPIO_PINGROUPS 69
-
-static const struct msm_pinctrl_soc_data ipq8064_pinctrl = {
-       .pins = ipq8064_pins,
-       .npins = ARRAY_SIZE(ipq8064_pins),
-       .functions = ipq8064_functions,
-       .nfunctions = ARRAY_SIZE(ipq8064_functions),
-       .groups = ipq8064_groups,
-       .ngroups = ARRAY_SIZE(ipq8064_groups),
-       .ngpios = NUM_GPIO_PINGROUPS,
-};
-
-static int ipq8064_pinctrl_probe(struct platform_device *pdev)
-{
-       return msm_pinctrl_probe(pdev, &ipq8064_pinctrl);
-}
-
-static const struct of_device_id ipq8064_pinctrl_of_match[] = {
-       { .compatible = "qcom,ipq8064-pinctrl", },
-       { },
-};
-
-static struct platform_driver ipq8064_pinctrl_driver = {
-       .driver = {
-               .name = "ipq8064-pinctrl",
-               .owner = THIS_MODULE,
-               .of_match_table = ipq8064_pinctrl_of_match,
-       },
-       .probe = ipq8064_pinctrl_probe,
-       .remove = msm_pinctrl_remove,
-};
-
-static int __init ipq8064_pinctrl_init(void)
-{
-       return platform_driver_register(&ipq8064_pinctrl_driver);
-}
-arch_initcall(ipq8064_pinctrl_init);
-
-static void __exit ipq8064_pinctrl_exit(void)
-{
-       platform_driver_unregister(&ipq8064_pinctrl_driver);
-}
-module_exit(ipq8064_pinctrl_exit);
-
-MODULE_AUTHOR("Andy Gross <agross@codeaurora.org>");
-MODULE_DESCRIPTION("Qualcomm IPQ8064 pinctrl driver");
-MODULE_LICENSE("GPL v2");
-MODULE_DEVICE_TABLE(of, ipq8064_pinctrl_of_match);
diff --git a/drivers/pinctrl/pinctrl-msm.c b/drivers/pinctrl/pinctrl-msm.c
deleted file mode 100644 (file)
index df6dda4..0000000
+++ /dev/null
@@ -1,939 +0,0 @@
-/*
- * Copyright (c) 2013, Sony Mobile Communications AB.
- * Copyright (c) 2013, The Linux Foundation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 and
- * only version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- */
-
-#include <linux/err.h>
-#include <linux/io.h>
-#include <linux/module.h>
-#include <linux/of.h>
-#include <linux/platform_device.h>
-#include <linux/pinctrl/machine.h>
-#include <linux/pinctrl/pinctrl.h>
-#include <linux/pinctrl/pinmux.h>
-#include <linux/pinctrl/pinconf.h>
-#include <linux/pinctrl/pinconf-generic.h>
-#include <linux/slab.h>
-#include <linux/gpio.h>
-#include <linux/interrupt.h>
-#include <linux/spinlock.h>
-
-#include "core.h"
-#include "pinconf.h"
-#include "pinctrl-msm.h"
-#include "pinctrl-utils.h"
-
-#define MAX_NR_GPIO 300
-
-/**
- * struct msm_pinctrl - state for a pinctrl-msm device
- * @dev:            device handle.
- * @pctrl:          pinctrl handle.
- * @chip:           gpiochip handle.
- * @irq:            parent irq for the TLMM irq_chip.
- * @lock:           Spinlock to protect register resources as well
- *                  as msm_pinctrl data structures.
- * @enabled_irqs:   Bitmap of currently enabled irqs.
- * @dual_edge_irqs: Bitmap of irqs that need sw emulated dual edge
- *                  detection.
- * @soc;            Reference to soc_data of platform specific data.
- * @regs:           Base address for the TLMM register map.
- */
-struct msm_pinctrl {
-       struct device *dev;
-       struct pinctrl_dev *pctrl;
-       struct gpio_chip chip;
-       int irq;
-
-       spinlock_t lock;
-
-       DECLARE_BITMAP(dual_edge_irqs, MAX_NR_GPIO);
-       DECLARE_BITMAP(enabled_irqs, MAX_NR_GPIO);
-
-       const struct msm_pinctrl_soc_data *soc;
-       void __iomem *regs;
-};
-
-static inline struct msm_pinctrl *to_msm_pinctrl(struct gpio_chip *gc)
-{
-       return container_of(gc, struct msm_pinctrl, chip);
-}
-
-static int msm_get_groups_count(struct pinctrl_dev *pctldev)
-{
-       struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
-
-       return pctrl->soc->ngroups;
-}
-
-static const char *msm_get_group_name(struct pinctrl_dev *pctldev,
-                                     unsigned group)
-{
-       struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
-
-       return pctrl->soc->groups[group].name;
-}
-
-static int msm_get_group_pins(struct pinctrl_dev *pctldev,
-                             unsigned group,
-                             const unsigned **pins,
-                             unsigned *num_pins)
-{
-       struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
-
-       *pins = pctrl->soc->groups[group].pins;
-       *num_pins = pctrl->soc->groups[group].npins;
-       return 0;
-}
-
-static const struct pinctrl_ops msm_pinctrl_ops = {
-       .get_groups_count       = msm_get_groups_count,
-       .get_group_name         = msm_get_group_name,
-       .get_group_pins         = msm_get_group_pins,
-       .dt_node_to_map         = pinconf_generic_dt_node_to_map_group,
-       .dt_free_map            = pinctrl_utils_dt_free_map,
-};
-
-static int msm_get_functions_count(struct pinctrl_dev *pctldev)
-{
-       struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
-
-       return pctrl->soc->nfunctions;
-}
-
-static const char *msm_get_function_name(struct pinctrl_dev *pctldev,
-                                        unsigned function)
-{
-       struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
-
-       return pctrl->soc->functions[function].name;
-}
-
-static int msm_get_function_groups(struct pinctrl_dev *pctldev,
-                                  unsigned function,
-                                  const char * const **groups,
-                                  unsigned * const num_groups)
-{
-       struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
-
-       *groups = pctrl->soc->functions[function].groups;
-       *num_groups = pctrl->soc->functions[function].ngroups;
-       return 0;
-}
-
-static int msm_pinmux_enable(struct pinctrl_dev *pctldev,
-                            unsigned function,
-                            unsigned group)
-{
-       struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
-       const struct msm_pingroup *g;
-       unsigned long flags;
-       u32 val;
-       int i;
-
-       g = &pctrl->soc->groups[group];
-
-       if (WARN_ON(g->mux_bit < 0))
-               return -EINVAL;
-
-       for (i = 0; i < g->nfuncs; i++) {
-               if (g->funcs[i] == function)
-                       break;
-       }
-
-       if (WARN_ON(i == g->nfuncs))
-               return -EINVAL;
-
-       spin_lock_irqsave(&pctrl->lock, flags);
-
-       val = readl(pctrl->regs + g->ctl_reg);
-       val &= ~(0x7 << g->mux_bit);
-       val |= i << g->mux_bit;
-       writel(val, pctrl->regs + g->ctl_reg);
-
-       spin_unlock_irqrestore(&pctrl->lock, flags);
-
-       return 0;
-}
-
-static void msm_pinmux_disable(struct pinctrl_dev *pctldev,
-                              unsigned function,
-                              unsigned group)
-{
-       struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
-       const struct msm_pingroup *g;
-       unsigned long flags;
-       u32 val;
-
-       g = &pctrl->soc->groups[group];
-
-       if (WARN_ON(g->mux_bit < 0))
-               return;
-
-       spin_lock_irqsave(&pctrl->lock, flags);
-
-       /* Clear the mux bits to select gpio mode */
-       val = readl(pctrl->regs + g->ctl_reg);
-       val &= ~(0x7 << g->mux_bit);
-       writel(val, pctrl->regs + g->ctl_reg);
-
-       spin_unlock_irqrestore(&pctrl->lock, flags);
-}
-
-static const struct pinmux_ops msm_pinmux_ops = {
-       .get_functions_count    = msm_get_functions_count,
-       .get_function_name      = msm_get_function_name,
-       .get_function_groups    = msm_get_function_groups,
-       .enable                 = msm_pinmux_enable,
-       .disable                = msm_pinmux_disable,
-};
-
-static int msm_config_reg(struct msm_pinctrl *pctrl,
-                         const struct msm_pingroup *g,
-                         unsigned param,
-                         unsigned *mask,
-                         unsigned *bit)
-{
-       switch (param) {
-       case PIN_CONFIG_BIAS_DISABLE:
-       case PIN_CONFIG_BIAS_PULL_DOWN:
-       case PIN_CONFIG_BIAS_PULL_UP:
-               *bit = g->pull_bit;
-               *mask = 3;
-               break;
-       case PIN_CONFIG_DRIVE_STRENGTH:
-               *bit = g->drv_bit;
-               *mask = 7;
-               break;
-       case PIN_CONFIG_OUTPUT:
-               *bit = g->oe_bit;
-               *mask = 1;
-               break;
-       default:
-               dev_err(pctrl->dev, "Invalid config param %04x\n", param);
-               return -ENOTSUPP;
-       }
-
-       return 0;
-}
-
-static int msm_config_get(struct pinctrl_dev *pctldev,
-                         unsigned int pin,
-                         unsigned long *config)
-{
-       dev_err(pctldev->dev, "pin_config_set op not supported\n");
-       return -ENOTSUPP;
-}
-
-static int msm_config_set(struct pinctrl_dev *pctldev, unsigned int pin,
-                               unsigned long *configs, unsigned num_configs)
-{
-       dev_err(pctldev->dev, "pin_config_set op not supported\n");
-       return -ENOTSUPP;
-}
-
-#define MSM_NO_PULL    0
-#define MSM_PULL_DOWN  1
-#define MSM_PULL_UP    3
-
-static unsigned msm_regval_to_drive(u32 val)
-{
-       return (val + 1) * 2;
-}
-
-static int msm_config_group_get(struct pinctrl_dev *pctldev,
-                               unsigned int group,
-                               unsigned long *config)
-{
-       const struct msm_pingroup *g;
-       struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
-       unsigned param = pinconf_to_config_param(*config);
-       unsigned mask;
-       unsigned arg;
-       unsigned bit;
-       int ret;
-       u32 val;
-
-       g = &pctrl->soc->groups[group];
-
-       ret = msm_config_reg(pctrl, g, param, &mask, &bit);
-       if (ret < 0)
-               return ret;
-
-       val = readl(pctrl->regs + g->ctl_reg);
-       arg = (val >> bit) & mask;
-
-       /* Convert register value to pinconf value */
-       switch (param) {
-       case PIN_CONFIG_BIAS_DISABLE:
-               arg = arg == MSM_NO_PULL;
-               break;
-       case PIN_CONFIG_BIAS_PULL_DOWN:
-               arg = arg == MSM_PULL_DOWN;
-               break;
-       case PIN_CONFIG_BIAS_PULL_UP:
-               arg = arg == MSM_PULL_UP;
-               break;
-       case PIN_CONFIG_DRIVE_STRENGTH:
-               arg = msm_regval_to_drive(arg);
-               break;
-       case PIN_CONFIG_OUTPUT:
-               /* Pin is not output */
-               if (!arg)
-                       return -EINVAL;
-
-               val = readl(pctrl->regs + g->io_reg);
-               arg = !!(val & BIT(g->in_bit));
-               break;
-       default:
-               dev_err(pctrl->dev, "Unsupported config parameter: %x\n",
-                       param);
-               return -EINVAL;
-       }
-
-       *config = pinconf_to_config_packed(param, arg);
-
-       return 0;
-}
-
-static int msm_config_group_set(struct pinctrl_dev *pctldev,
-                               unsigned group,
-                               unsigned long *configs,
-                               unsigned num_configs)
-{
-       const struct msm_pingroup *g;
-       struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
-       unsigned long flags;
-       unsigned param;
-       unsigned mask;
-       unsigned arg;
-       unsigned bit;
-       int ret;
-       u32 val;
-       int i;
-
-       g = &pctrl->soc->groups[group];
-
-       for (i = 0; i < num_configs; i++) {
-               param = pinconf_to_config_param(configs[i]);
-               arg = pinconf_to_config_argument(configs[i]);
-
-               ret = msm_config_reg(pctrl, g, param, &mask, &bit);
-               if (ret < 0)
-                       return ret;
-
-               /* Convert pinconf values to register values */
-               switch (param) {
-               case PIN_CONFIG_BIAS_DISABLE:
-                       arg = MSM_NO_PULL;
-                       break;
-               case PIN_CONFIG_BIAS_PULL_DOWN:
-                       arg = MSM_PULL_DOWN;
-                       break;
-               case PIN_CONFIG_BIAS_PULL_UP:
-                       arg = MSM_PULL_UP;
-                       break;
-               case PIN_CONFIG_DRIVE_STRENGTH:
-                       /* Check for invalid values */
-                       if (arg > 16 || arg < 2 || (arg % 2) != 0)
-                               arg = -1;
-                       else
-                               arg = (arg / 2) - 1;
-                       break;
-               case PIN_CONFIG_OUTPUT:
-                       /* set output value */
-                       spin_lock_irqsave(&pctrl->lock, flags);
-                       val = readl(pctrl->regs + g->io_reg);
-                       if (arg)
-                               val |= BIT(g->out_bit);
-                       else
-                               val &= ~BIT(g->out_bit);
-                       writel(val, pctrl->regs + g->io_reg);
-                       spin_unlock_irqrestore(&pctrl->lock, flags);
-
-                       /* enable output */
-                       arg = 1;
-                       break;
-               default:
-                       dev_err(pctrl->dev, "Unsupported config parameter: %x\n",
-                               param);
-                       return -EINVAL;
-               }
-
-               /* Range-check user-supplied value */
-               if (arg & ~mask) {
-                       dev_err(pctrl->dev, "config %x: %x is invalid\n", param, arg);
-                       return -EINVAL;
-               }
-
-               spin_lock_irqsave(&pctrl->lock, flags);
-               val = readl(pctrl->regs + g->ctl_reg);
-               val &= ~(mask << bit);
-               val |= arg << bit;
-               writel(val, pctrl->regs + g->ctl_reg);
-               spin_unlock_irqrestore(&pctrl->lock, flags);
-       }
-
-       return 0;
-}
-
-static const struct pinconf_ops msm_pinconf_ops = {
-       .pin_config_get         = msm_config_get,
-       .pin_config_set         = msm_config_set,
-       .pin_config_group_get   = msm_config_group_get,
-       .pin_config_group_set   = msm_config_group_set,
-};
-
-static struct pinctrl_desc msm_pinctrl_desc = {
-       .pctlops = &msm_pinctrl_ops,
-       .pmxops = &msm_pinmux_ops,
-       .confops = &msm_pinconf_ops,
-       .owner = THIS_MODULE,
-};
-
-static int msm_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
-{
-       const struct msm_pingroup *g;
-       struct msm_pinctrl *pctrl = container_of(chip, struct msm_pinctrl, chip);
-       unsigned long flags;
-       u32 val;
-
-       g = &pctrl->soc->groups[offset];
-
-       spin_lock_irqsave(&pctrl->lock, flags);
-
-       val = readl(pctrl->regs + g->ctl_reg);
-       val &= ~BIT(g->oe_bit);
-       writel(val, pctrl->regs + g->ctl_reg);
-
-       spin_unlock_irqrestore(&pctrl->lock, flags);
-
-       return 0;
-}
-
-static int msm_gpio_direction_output(struct gpio_chip *chip, unsigned offset, int value)
-{
-       const struct msm_pingroup *g;
-       struct msm_pinctrl *pctrl = container_of(chip, struct msm_pinctrl, chip);
-       unsigned long flags;
-       u32 val;
-
-       g = &pctrl->soc->groups[offset];
-
-       spin_lock_irqsave(&pctrl->lock, flags);
-
-       val = readl(pctrl->regs + g->io_reg);
-       if (value)
-               val |= BIT(g->out_bit);
-       else
-               val &= ~BIT(g->out_bit);
-       writel(val, pctrl->regs + g->io_reg);
-
-       val = readl(pctrl->regs + g->ctl_reg);
-       val |= BIT(g->oe_bit);
-       writel(val, pctrl->regs + g->ctl_reg);
-
-       spin_unlock_irqrestore(&pctrl->lock, flags);
-
-       return 0;
-}
-
-static int msm_gpio_get(struct gpio_chip *chip, unsigned offset)
-{
-       const struct msm_pingroup *g;
-       struct msm_pinctrl *pctrl = container_of(chip, struct msm_pinctrl, chip);
-       u32 val;
-
-       g = &pctrl->soc->groups[offset];
-
-       val = readl(pctrl->regs + g->io_reg);
-       return !!(val & BIT(g->in_bit));
-}
-
-static void msm_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
-{
-       const struct msm_pingroup *g;
-       struct msm_pinctrl *pctrl = container_of(chip, struct msm_pinctrl, chip);
-       unsigned long flags;
-       u32 val;
-
-       g = &pctrl->soc->groups[offset];
-
-       spin_lock_irqsave(&pctrl->lock, flags);
-
-       val = readl(pctrl->regs + g->io_reg);
-       if (value)
-               val |= BIT(g->out_bit);
-       else
-               val &= ~BIT(g->out_bit);
-       writel(val, pctrl->regs + g->io_reg);
-
-       spin_unlock_irqrestore(&pctrl->lock, flags);
-}
-
-static int msm_gpio_request(struct gpio_chip *chip, unsigned offset)
-{
-       int gpio = chip->base + offset;
-       return pinctrl_request_gpio(gpio);
-}
-
-static void msm_gpio_free(struct gpio_chip *chip, unsigned offset)
-{
-       int gpio = chip->base + offset;
-       return pinctrl_free_gpio(gpio);
-}
-
-#ifdef CONFIG_DEBUG_FS
-#include <linux/seq_file.h>
-
-static void msm_gpio_dbg_show_one(struct seq_file *s,
-                                 struct pinctrl_dev *pctldev,
-                                 struct gpio_chip *chip,
-                                 unsigned offset,
-                                 unsigned gpio)
-{
-       const struct msm_pingroup *g;
-       struct msm_pinctrl *pctrl = container_of(chip, struct msm_pinctrl, chip);
-       unsigned func;
-       int is_out;
-       int drive;
-       int pull;
-       u32 ctl_reg;
-
-       static const char * const pulls[] = {
-               "no pull",
-               "pull down",
-               "keeper",
-               "pull up"
-       };
-
-       g = &pctrl->soc->groups[offset];
-       ctl_reg = readl(pctrl->regs + g->ctl_reg);
-
-       is_out = !!(ctl_reg & BIT(g->oe_bit));
-       func = (ctl_reg >> g->mux_bit) & 7;
-       drive = (ctl_reg >> g->drv_bit) & 7;
-       pull = (ctl_reg >> g->pull_bit) & 3;
-
-       seq_printf(s, " %-8s: %-3s %d", g->name, is_out ? "out" : "in", func);
-       seq_printf(s, " %dmA", msm_regval_to_drive(drive));
-       seq_printf(s, " %s", pulls[pull]);
-}
-
-static void msm_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
-{
-       unsigned gpio = chip->base;
-       unsigned i;
-
-       for (i = 0; i < chip->ngpio; i++, gpio++) {
-               msm_gpio_dbg_show_one(s, NULL, chip, i, gpio);
-               seq_puts(s, "\n");
-       }
-}
-
-#else
-#define msm_gpio_dbg_show NULL
-#endif
-
-static struct gpio_chip msm_gpio_template = {
-       .direction_input  = msm_gpio_direction_input,
-       .direction_output = msm_gpio_direction_output,
-       .get              = msm_gpio_get,
-       .set              = msm_gpio_set,
-       .request          = msm_gpio_request,
-       .free             = msm_gpio_free,
-       .dbg_show         = msm_gpio_dbg_show,
-};
-
-/* For dual-edge interrupts in software, since some hardware has no
- * such support:
- *
- * At appropriate moments, this function may be called to flip the polarity
- * settings of both-edge irq lines to try and catch the next edge.
- *
- * The attempt is considered successful if:
- * - the status bit goes high, indicating that an edge was caught, or
- * - the input value of the gpio doesn't change during the attempt.
- * If the value changes twice during the process, that would cause the first
- * test to fail but would force the second, as two opposite
- * transitions would cause a detection no matter the polarity setting.
- *
- * The do-loop tries to sledge-hammer closed the timing hole between
- * the initial value-read and the polarity-write - if the line value changes
- * during that window, an interrupt is lost, the new polarity setting is
- * incorrect, and the first success test will fail, causing a retry.
- *
- * Algorithm comes from Google's msmgpio driver.
- */
-static void msm_gpio_update_dual_edge_pos(struct msm_pinctrl *pctrl,
-                                         const struct msm_pingroup *g,
-                                         struct irq_data *d)
-{
-       int loop_limit = 100;
-       unsigned val, val2, intstat;
-       unsigned pol;
-
-       do {
-               val = readl(pctrl->regs + g->io_reg) & BIT(g->in_bit);
-
-               pol = readl(pctrl->regs + g->intr_cfg_reg);
-               pol ^= BIT(g->intr_polarity_bit);
-               writel(pol, pctrl->regs + g->intr_cfg_reg);
-
-               val2 = readl(pctrl->regs + g->io_reg) & BIT(g->in_bit);
-               intstat = readl(pctrl->regs + g->intr_status_reg);
-               if (intstat || (val == val2))
-                       return;
-       } while (loop_limit-- > 0);
-       dev_err(pctrl->dev, "dual-edge irq failed to stabilize, %#08x != %#08x\n",
-               val, val2);
-}
-
-static void msm_gpio_irq_mask(struct irq_data *d)
-{
-       struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
-       struct msm_pinctrl *pctrl = to_msm_pinctrl(gc);
-       const struct msm_pingroup *g;
-       unsigned long flags;
-       u32 val;
-
-       g = &pctrl->soc->groups[d->hwirq];
-
-       spin_lock_irqsave(&pctrl->lock, flags);
-
-       val = readl(pctrl->regs + g->intr_cfg_reg);
-       val &= ~BIT(g->intr_enable_bit);
-       writel(val, pctrl->regs + g->intr_cfg_reg);
-
-       clear_bit(d->hwirq, pctrl->enabled_irqs);
-
-       spin_unlock_irqrestore(&pctrl->lock, flags);
-}
-
-static void msm_gpio_irq_unmask(struct irq_data *d)
-{
-       struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
-       struct msm_pinctrl *pctrl = to_msm_pinctrl(gc);
-       const struct msm_pingroup *g;
-       unsigned long flags;
-       u32 val;
-
-       g = &pctrl->soc->groups[d->hwirq];
-
-       spin_lock_irqsave(&pctrl->lock, flags);
-
-       val = readl(pctrl->regs + g->intr_status_reg);
-       val &= ~BIT(g->intr_status_bit);
-       writel(val, pctrl->regs + g->intr_status_reg);
-
-       val = readl(pctrl->regs + g->intr_cfg_reg);
-       val |= BIT(g->intr_enable_bit);
-       writel(val, pctrl->regs + g->intr_cfg_reg);
-
-       set_bit(d->hwirq, pctrl->enabled_irqs);
-
-       spin_unlock_irqrestore(&pctrl->lock, flags);
-}
-
-static void msm_gpio_irq_ack(struct irq_data *d)
-{
-       struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
-       struct msm_pinctrl *pctrl = to_msm_pinctrl(gc);
-       const struct msm_pingroup *g;
-       unsigned long flags;
-       u32 val;
-
-       g = &pctrl->soc->groups[d->hwirq];
-
-       spin_lock_irqsave(&pctrl->lock, flags);
-
-       val = readl(pctrl->regs + g->intr_status_reg);
-       if (g->intr_ack_high)
-               val |= BIT(g->intr_status_bit);
-       else
-               val &= ~BIT(g->intr_status_bit);
-       writel(val, pctrl->regs + g->intr_status_reg);
-
-       if (test_bit(d->hwirq, pctrl->dual_edge_irqs))
-               msm_gpio_update_dual_edge_pos(pctrl, g, d);
-
-       spin_unlock_irqrestore(&pctrl->lock, flags);
-}
-
-#define INTR_TARGET_PROC_APPS    4
-
-static int msm_gpio_irq_set_type(struct irq_data *d, unsigned int type)
-{
-       struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
-       struct msm_pinctrl *pctrl = to_msm_pinctrl(gc);
-       const struct msm_pingroup *g;
-       unsigned long flags;
-       u32 val;
-
-       g = &pctrl->soc->groups[d->hwirq];
-
-       spin_lock_irqsave(&pctrl->lock, flags);
-
-       /*
-        * For hw without possibility of detecting both edges
-        */
-       if (g->intr_detection_width == 1 && type == IRQ_TYPE_EDGE_BOTH)
-               set_bit(d->hwirq, pctrl->dual_edge_irqs);
-       else
-               clear_bit(d->hwirq, pctrl->dual_edge_irqs);
-
-       /* Route interrupts to application cpu */
-       val = readl(pctrl->regs + g->intr_target_reg);
-       val &= ~(7 << g->intr_target_bit);
-       val |= INTR_TARGET_PROC_APPS << g->intr_target_bit;
-       writel(val, pctrl->regs + g->intr_target_reg);
-
-       /* Update configuration for gpio.
-        * RAW_STATUS_EN is left on for all gpio irqs. Due to the
-        * internal circuitry of TLMM, toggling the RAW_STATUS
-        * could cause the INTR_STATUS to be set for EDGE interrupts.
-        */
-       val = readl(pctrl->regs + g->intr_cfg_reg);
-       val |= BIT(g->intr_raw_status_bit);
-       if (g->intr_detection_width == 2) {
-               val &= ~(3 << g->intr_detection_bit);
-               val &= ~(1 << g->intr_polarity_bit);
-               switch (type) {
-               case IRQ_TYPE_EDGE_RISING:
-                       val |= 1 << g->intr_detection_bit;
-                       val |= BIT(g->intr_polarity_bit);
-                       break;
-               case IRQ_TYPE_EDGE_FALLING:
-                       val |= 2 << g->intr_detection_bit;
-                       val |= BIT(g->intr_polarity_bit);
-                       break;
-               case IRQ_TYPE_EDGE_BOTH:
-                       val |= 3 << g->intr_detection_bit;
-                       val |= BIT(g->intr_polarity_bit);
-                       break;
-               case IRQ_TYPE_LEVEL_LOW:
-                       break;
-               case IRQ_TYPE_LEVEL_HIGH:
-                       val |= BIT(g->intr_polarity_bit);
-                       break;
-               }
-       } else if (g->intr_detection_width == 1) {
-               val &= ~(1 << g->intr_detection_bit);
-               val &= ~(1 << g->intr_polarity_bit);
-               switch (type) {
-               case IRQ_TYPE_EDGE_RISING:
-                       val |= BIT(g->intr_detection_bit);
-                       val |= BIT(g->intr_polarity_bit);
-                       break;
-               case IRQ_TYPE_EDGE_FALLING:
-                       val |= BIT(g->intr_detection_bit);
-                       break;
-               case IRQ_TYPE_EDGE_BOTH:
-                       val |= BIT(g->intr_detection_bit);
-                       val |= BIT(g->intr_polarity_bit);
-                       break;
-               case IRQ_TYPE_LEVEL_LOW:
-                       break;
-               case IRQ_TYPE_LEVEL_HIGH:
-                       val |= BIT(g->intr_polarity_bit);
-                       break;
-               }
-       } else {
-               BUG();
-       }
-       writel(val, pctrl->regs + g->intr_cfg_reg);
-
-       if (test_bit(d->hwirq, pctrl->dual_edge_irqs))
-               msm_gpio_update_dual_edge_pos(pctrl, g, d);
-
-       spin_unlock_irqrestore(&pctrl->lock, flags);
-
-       if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH))
-               __irq_set_handler_locked(d->irq, handle_level_irq);
-       else if (type & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING))
-               __irq_set_handler_locked(d->irq, handle_edge_irq);
-
-       return 0;
-}
-
-static int msm_gpio_irq_set_wake(struct irq_data *d, unsigned int on)
-{
-       struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
-       struct msm_pinctrl *pctrl = to_msm_pinctrl(gc);
-       unsigned long flags;
-
-       spin_lock_irqsave(&pctrl->lock, flags);
-
-       irq_set_irq_wake(pctrl->irq, on);
-
-       spin_unlock_irqrestore(&pctrl->lock, flags);
-
-       return 0;
-}
-
-static struct irq_chip msm_gpio_irq_chip = {
-       .name           = "msmgpio",
-       .irq_mask       = msm_gpio_irq_mask,
-       .irq_unmask     = msm_gpio_irq_unmask,
-       .irq_ack        = msm_gpio_irq_ack,
-       .irq_set_type   = msm_gpio_irq_set_type,
-       .irq_set_wake   = msm_gpio_irq_set_wake,
-};
-
-static void msm_gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
-{
-       struct gpio_chip *gc = irq_desc_get_handler_data(desc);
-       const struct msm_pingroup *g;
-       struct msm_pinctrl *pctrl = to_msm_pinctrl(gc);
-       struct irq_chip *chip = irq_get_chip(irq);
-       int irq_pin;
-       int handled = 0;
-       u32 val;
-       int i;
-
-       chained_irq_enter(chip, desc);
-
-       /*
-        * Each pin has it's own IRQ status register, so use
-        * enabled_irq bitmap to limit the number of reads.
-        */
-       for_each_set_bit(i, pctrl->enabled_irqs, pctrl->chip.ngpio) {
-               g = &pctrl->soc->groups[i];
-               val = readl(pctrl->regs + g->intr_status_reg);
-               if (val & BIT(g->intr_status_bit)) {
-                       irq_pin = irq_find_mapping(gc->irqdomain, i);
-                       generic_handle_irq(irq_pin);
-                       handled++;
-               }
-       }
-
-       /* No interrupts were flagged */
-       if (handled == 0)
-               handle_bad_irq(irq, desc);
-
-       chained_irq_exit(chip, desc);
-}
-
-static int msm_gpio_init(struct msm_pinctrl *pctrl)
-{
-       struct gpio_chip *chip;
-       int ret;
-       unsigned ngpio = pctrl->soc->ngpios;
-
-       if (WARN_ON(ngpio > MAX_NR_GPIO))
-               return -EINVAL;
-
-       chip = &pctrl->chip;
-       chip->base = 0;
-       chip->ngpio = ngpio;
-       chip->label = dev_name(pctrl->dev);
-       chip->dev = pctrl->dev;
-       chip->owner = THIS_MODULE;
-       chip->of_node = pctrl->dev->of_node;
-
-       ret = gpiochip_add(&pctrl->chip);
-       if (ret) {
-               dev_err(pctrl->dev, "Failed register gpiochip\n");
-               return ret;
-       }
-
-       ret = gpiochip_add_pin_range(&pctrl->chip, dev_name(pctrl->dev), 0, 0, chip->ngpio);
-       if (ret) {
-               dev_err(pctrl->dev, "Failed to add pin range\n");
-               return ret;
-       }
-
-       ret = gpiochip_irqchip_add(chip,
-                                  &msm_gpio_irq_chip,
-                                  0,
-                                  handle_edge_irq,
-                                  IRQ_TYPE_NONE);
-       if (ret) {
-               dev_err(pctrl->dev, "Failed to add irqchip to gpiochip\n");
-               return -ENOSYS;
-       }
-
-       gpiochip_set_chained_irqchip(chip, &msm_gpio_irq_chip, pctrl->irq,
-                                    msm_gpio_irq_handler);
-
-       return 0;
-}
-
-int msm_pinctrl_probe(struct platform_device *pdev,
-                     const struct msm_pinctrl_soc_data *soc_data)
-{
-       struct msm_pinctrl *pctrl;
-       struct resource *res;
-       int ret;
-
-       pctrl = devm_kzalloc(&pdev->dev, sizeof(*pctrl), GFP_KERNEL);
-       if (!pctrl) {
-               dev_err(&pdev->dev, "Can't allocate msm_pinctrl\n");
-               return -ENOMEM;
-       }
-       pctrl->dev = &pdev->dev;
-       pctrl->soc = soc_data;
-       pctrl->chip = msm_gpio_template;
-
-       spin_lock_init(&pctrl->lock);
-
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       pctrl->regs = devm_ioremap_resource(&pdev->dev, res);
-       if (IS_ERR(pctrl->regs))
-               return PTR_ERR(pctrl->regs);
-
-       pctrl->irq = platform_get_irq(pdev, 0);
-       if (pctrl->irq < 0) {
-               dev_err(&pdev->dev, "No interrupt defined for msmgpio\n");
-               return pctrl->irq;
-       }
-
-       msm_pinctrl_desc.name = dev_name(&pdev->dev);
-       msm_pinctrl_desc.pins = pctrl->soc->pins;
-       msm_pinctrl_desc.npins = pctrl->soc->npins;
-       pctrl->pctrl = pinctrl_register(&msm_pinctrl_desc, &pdev->dev, pctrl);
-       if (!pctrl->pctrl) {
-               dev_err(&pdev->dev, "Couldn't register pinctrl driver\n");
-               return -ENODEV;
-       }
-
-       ret = msm_gpio_init(pctrl);
-       if (ret) {
-               pinctrl_unregister(pctrl->pctrl);
-               return ret;
-       }
-
-       platform_set_drvdata(pdev, pctrl);
-
-       dev_dbg(&pdev->dev, "Probed Qualcomm pinctrl driver\n");
-
-       return 0;
-}
-EXPORT_SYMBOL(msm_pinctrl_probe);
-
-int msm_pinctrl_remove(struct platform_device *pdev)
-{
-       struct msm_pinctrl *pctrl = platform_get_drvdata(pdev);
-       int ret;
-
-       ret = gpiochip_remove(&pctrl->chip);
-       if (ret) {
-               dev_err(&pdev->dev, "Failed to remove gpiochip\n");
-               return ret;
-       }
-
-       pinctrl_unregister(pctrl->pctrl);
-
-       return 0;
-}
-EXPORT_SYMBOL(msm_pinctrl_remove);
-
diff --git a/drivers/pinctrl/pinctrl-msm.h b/drivers/pinctrl/pinctrl-msm.h
deleted file mode 100644 (file)
index 7b2a227..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (c) 2013, Sony Mobile Communications AB.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 and
- * only version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- */
-#ifndef __PINCTRL_MSM_H__
-#define __PINCTRL_MSM_H__
-
-struct pinctrl_pin_desc;
-
-/**
- * struct msm_function - a pinmux function
- * @name:    Name of the pinmux function.
- * @groups:  List of pingroups for this function.
- * @ngroups: Number of entries in @groups.
- */
-struct msm_function {
-       const char *name;
-       const char * const *groups;
-       unsigned ngroups;
-};
-
-/**
- * struct msm_pingroup - Qualcomm pingroup definition
- * @name:                 Name of the pingroup.
- * @pins:                A list of pins assigned to this pingroup.
- * @npins:               Number of entries in @pins.
- * @funcs:                A list of pinmux functions that can be selected for
- *                        this group. The index of the selected function is used
- *                        for programming the function selector.
- *                        Entries should be indices into the groups list of the
- *                        struct msm_pinctrl_soc_data.
- * @ctl_reg:              Offset of the register holding control bits for this group.
- * @io_reg:               Offset of the register holding input/output bits for this group.
- * @intr_cfg_reg:         Offset of the register holding interrupt configuration bits.
- * @intr_status_reg:      Offset of the register holding the status bits for this group.
- * @intr_target_reg:      Offset of the register specifying routing of the interrupts
- *                        from this group.
- * @mux_bit:              Offset in @ctl_reg for the pinmux function selection.
- * @pull_bit:             Offset in @ctl_reg for the bias configuration.
- * @drv_bit:              Offset in @ctl_reg for the drive strength configuration.
- * @oe_bit:               Offset in @ctl_reg for controlling output enable.
- * @in_bit:               Offset in @io_reg for the input bit value.
- * @out_bit:              Offset in @io_reg for the output bit value.
- * @intr_enable_bit:      Offset in @intr_cfg_reg for enabling the interrupt for this group.
- * @intr_status_bit:      Offset in @intr_status_reg for reading and acking the interrupt
- *                        status.
- * @intr_target_bit:      Offset in @intr_target_reg for configuring the interrupt routing.
- * @intr_raw_status_bit:  Offset in @intr_cfg_reg for the raw status bit.
- * @intr_polarity_bit:    Offset in @intr_cfg_reg for specifying polarity of the interrupt.
- * @intr_detection_bit:   Offset in @intr_cfg_reg for specifying interrupt type.
- * @intr_detection_width: Number of bits used for specifying interrupt type,
- *                        Should be 2 for SoCs that can detect both edges in hardware,
- *                        otherwise 1.
- */
-struct msm_pingroup {
-       const char *name;
-       const unsigned *pins;
-       unsigned npins;
-
-       unsigned *funcs;
-       unsigned nfuncs;
-
-       s16 ctl_reg;
-       s16 io_reg;
-       s16 intr_cfg_reg;
-       s16 intr_status_reg;
-       s16 intr_target_reg;
-
-       unsigned mux_bit:5;
-
-       unsigned pull_bit:5;
-       unsigned drv_bit:5;
-
-       unsigned oe_bit:5;
-       unsigned in_bit:5;
-       unsigned out_bit:5;
-
-       unsigned intr_enable_bit:5;
-       unsigned intr_status_bit:5;
-       unsigned intr_ack_high:1;
-
-       unsigned intr_target_bit:5;
-       unsigned intr_raw_status_bit:5;
-       unsigned intr_polarity_bit:5;
-       unsigned intr_detection_bit:5;
-       unsigned intr_detection_width:5;
-};
-
-/**
- * struct msm_pinctrl_soc_data - Qualcomm pin controller driver configuration
- * @pins:       An array describing all pins the pin controller affects.
- * @npins:      The number of entries in @pins.
- * @functions:  An array describing all mux functions the SoC supports.
- * @nfunctions: The number of entries in @functions.
- * @groups:     An array describing all pin groups the pin SoC supports.
- * @ngroups:    The numbmer of entries in @groups.
- * @ngpio:      The number of pingroups the driver should expose as GPIOs.
- */
-struct msm_pinctrl_soc_data {
-       const struct pinctrl_pin_desc *pins;
-       unsigned npins;
-       const struct msm_function *functions;
-       unsigned nfunctions;
-       const struct msm_pingroup *groups;
-       unsigned ngroups;
-       unsigned ngpios;
-};
-
-int msm_pinctrl_probe(struct platform_device *pdev,
-                     const struct msm_pinctrl_soc_data *soc_data);
-int msm_pinctrl_remove(struct platform_device *pdev);
-
-#endif
diff --git a/drivers/pinctrl/pinctrl-msm8x74.c b/drivers/pinctrl/pinctrl-msm8x74.c
deleted file mode 100644 (file)
index 4183069..0000000
+++ /dev/null
@@ -1,1040 +0,0 @@
-/*
- * Copyright (c) 2013, Sony Mobile Communications AB.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 and
- * only version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- */
-
-#include <linux/module.h>
-#include <linux/of.h>
-#include <linux/platform_device.h>
-#include <linux/pinctrl/pinctrl.h>
-
-#include "pinctrl-msm.h"
-
-static const struct pinctrl_pin_desc msm8x74_pins[] = {
-       PINCTRL_PIN(0, "GPIO_0"),
-       PINCTRL_PIN(1, "GPIO_1"),
-       PINCTRL_PIN(2, "GPIO_2"),
-       PINCTRL_PIN(3, "GPIO_3"),
-       PINCTRL_PIN(4, "GPIO_4"),
-       PINCTRL_PIN(5, "GPIO_5"),
-       PINCTRL_PIN(6, "GPIO_6"),
-       PINCTRL_PIN(7, "GPIO_7"),
-       PINCTRL_PIN(8, "GPIO_8"),
-       PINCTRL_PIN(9, "GPIO_9"),
-       PINCTRL_PIN(10, "GPIO_10"),
-       PINCTRL_PIN(11, "GPIO_11"),
-       PINCTRL_PIN(12, "GPIO_12"),
-       PINCTRL_PIN(13, "GPIO_13"),
-       PINCTRL_PIN(14, "GPIO_14"),
-       PINCTRL_PIN(15, "GPIO_15"),
-       PINCTRL_PIN(16, "GPIO_16"),
-       PINCTRL_PIN(17, "GPIO_17"),
-       PINCTRL_PIN(18, "GPIO_18"),
-       PINCTRL_PIN(19, "GPIO_19"),
-       PINCTRL_PIN(20, "GPIO_20"),
-       PINCTRL_PIN(21, "GPIO_21"),
-       PINCTRL_PIN(22, "GPIO_22"),
-       PINCTRL_PIN(23, "GPIO_23"),
-       PINCTRL_PIN(24, "GPIO_24"),
-       PINCTRL_PIN(25, "GPIO_25"),
-       PINCTRL_PIN(26, "GPIO_26"),
-       PINCTRL_PIN(27, "GPIO_27"),
-       PINCTRL_PIN(28, "GPIO_28"),
-       PINCTRL_PIN(29, "GPIO_29"),
-       PINCTRL_PIN(30, "GPIO_30"),
-       PINCTRL_PIN(31, "GPIO_31"),
-       PINCTRL_PIN(32, "GPIO_32"),
-       PINCTRL_PIN(33, "GPIO_33"),
-       PINCTRL_PIN(34, "GPIO_34"),
-       PINCTRL_PIN(35, "GPIO_35"),
-       PINCTRL_PIN(36, "GPIO_36"),
-       PINCTRL_PIN(37, "GPIO_37"),
-       PINCTRL_PIN(38, "GPIO_38"),
-       PINCTRL_PIN(39, "GPIO_39"),
-       PINCTRL_PIN(40, "GPIO_40"),
-       PINCTRL_PIN(41, "GPIO_41"),
-       PINCTRL_PIN(42, "GPIO_42"),
-       PINCTRL_PIN(43, "GPIO_43"),
-       PINCTRL_PIN(44, "GPIO_44"),
-       PINCTRL_PIN(45, "GPIO_45"),
-       PINCTRL_PIN(46, "GPIO_46"),
-       PINCTRL_PIN(47, "GPIO_47"),
-       PINCTRL_PIN(48, "GPIO_48"),
-       PINCTRL_PIN(49, "GPIO_49"),
-       PINCTRL_PIN(50, "GPIO_50"),
-       PINCTRL_PIN(51, "GPIO_51"),
-       PINCTRL_PIN(52, "GPIO_52"),
-       PINCTRL_PIN(53, "GPIO_53"),
-       PINCTRL_PIN(54, "GPIO_54"),
-       PINCTRL_PIN(55, "GPIO_55"),
-       PINCTRL_PIN(56, "GPIO_56"),
-       PINCTRL_PIN(57, "GPIO_57"),
-       PINCTRL_PIN(58, "GPIO_58"),
-       PINCTRL_PIN(59, "GPIO_59"),
-       PINCTRL_PIN(60, "GPIO_60"),
-       PINCTRL_PIN(61, "GPIO_61"),
-       PINCTRL_PIN(62, "GPIO_62"),
-       PINCTRL_PIN(63, "GPIO_63"),
-       PINCTRL_PIN(64, "GPIO_64"),
-       PINCTRL_PIN(65, "GPIO_65"),
-       PINCTRL_PIN(66, "GPIO_66"),
-       PINCTRL_PIN(67, "GPIO_67"),
-       PINCTRL_PIN(68, "GPIO_68"),
-       PINCTRL_PIN(69, "GPIO_69"),
-       PINCTRL_PIN(70, "GPIO_70"),
-       PINCTRL_PIN(71, "GPIO_71"),
-       PINCTRL_PIN(72, "GPIO_72"),
-       PINCTRL_PIN(73, "GPIO_73"),
-       PINCTRL_PIN(74, "GPIO_74"),
-       PINCTRL_PIN(75, "GPIO_75"),
-       PINCTRL_PIN(76, "GPIO_76"),
-       PINCTRL_PIN(77, "GPIO_77"),
-       PINCTRL_PIN(78, "GPIO_78"),
-       PINCTRL_PIN(79, "GPIO_79"),
-       PINCTRL_PIN(80, "GPIO_80"),
-       PINCTRL_PIN(81, "GPIO_81"),
-       PINCTRL_PIN(82, "GPIO_82"),
-       PINCTRL_PIN(83, "GPIO_83"),
-       PINCTRL_PIN(84, "GPIO_84"),
-       PINCTRL_PIN(85, "GPIO_85"),
-       PINCTRL_PIN(86, "GPIO_86"),
-       PINCTRL_PIN(87, "GPIO_87"),
-       PINCTRL_PIN(88, "GPIO_88"),
-       PINCTRL_PIN(89, "GPIO_89"),
-       PINCTRL_PIN(90, "GPIO_90"),
-       PINCTRL_PIN(91, "GPIO_91"),
-       PINCTRL_PIN(92, "GPIO_92"),
-       PINCTRL_PIN(93, "GPIO_93"),
-       PINCTRL_PIN(94, "GPIO_94"),
-       PINCTRL_PIN(95, "GPIO_95"),
-       PINCTRL_PIN(96, "GPIO_96"),
-       PINCTRL_PIN(97, "GPIO_97"),
-       PINCTRL_PIN(98, "GPIO_98"),
-       PINCTRL_PIN(99, "GPIO_99"),
-       PINCTRL_PIN(100, "GPIO_100"),
-       PINCTRL_PIN(101, "GPIO_101"),
-       PINCTRL_PIN(102, "GPIO_102"),
-       PINCTRL_PIN(103, "GPIO_103"),
-       PINCTRL_PIN(104, "GPIO_104"),
-       PINCTRL_PIN(105, "GPIO_105"),
-       PINCTRL_PIN(106, "GPIO_106"),
-       PINCTRL_PIN(107, "GPIO_107"),
-       PINCTRL_PIN(108, "GPIO_108"),
-       PINCTRL_PIN(109, "GPIO_109"),
-       PINCTRL_PIN(110, "GPIO_110"),
-       PINCTRL_PIN(111, "GPIO_111"),
-       PINCTRL_PIN(112, "GPIO_112"),
-       PINCTRL_PIN(113, "GPIO_113"),
-       PINCTRL_PIN(114, "GPIO_114"),
-       PINCTRL_PIN(115, "GPIO_115"),
-       PINCTRL_PIN(116, "GPIO_116"),
-       PINCTRL_PIN(117, "GPIO_117"),
-       PINCTRL_PIN(118, "GPIO_118"),
-       PINCTRL_PIN(119, "GPIO_119"),
-       PINCTRL_PIN(120, "GPIO_120"),
-       PINCTRL_PIN(121, "GPIO_121"),
-       PINCTRL_PIN(122, "GPIO_122"),
-       PINCTRL_PIN(123, "GPIO_123"),
-       PINCTRL_PIN(124, "GPIO_124"),
-       PINCTRL_PIN(125, "GPIO_125"),
-       PINCTRL_PIN(126, "GPIO_126"),
-       PINCTRL_PIN(127, "GPIO_127"),
-       PINCTRL_PIN(128, "GPIO_128"),
-       PINCTRL_PIN(129, "GPIO_129"),
-       PINCTRL_PIN(130, "GPIO_130"),
-       PINCTRL_PIN(131, "GPIO_131"),
-       PINCTRL_PIN(132, "GPIO_132"),
-       PINCTRL_PIN(133, "GPIO_133"),
-       PINCTRL_PIN(134, "GPIO_134"),
-       PINCTRL_PIN(135, "GPIO_135"),
-       PINCTRL_PIN(136, "GPIO_136"),
-       PINCTRL_PIN(137, "GPIO_137"),
-       PINCTRL_PIN(138, "GPIO_138"),
-       PINCTRL_PIN(139, "GPIO_139"),
-       PINCTRL_PIN(140, "GPIO_140"),
-       PINCTRL_PIN(141, "GPIO_141"),
-       PINCTRL_PIN(142, "GPIO_142"),
-       PINCTRL_PIN(143, "GPIO_143"),
-       PINCTRL_PIN(144, "GPIO_144"),
-       PINCTRL_PIN(145, "GPIO_145"),
-
-       PINCTRL_PIN(146, "SDC1_CLK"),
-       PINCTRL_PIN(147, "SDC1_CMD"),
-       PINCTRL_PIN(148, "SDC1_DATA"),
-       PINCTRL_PIN(149, "SDC2_CLK"),
-       PINCTRL_PIN(150, "SDC2_CMD"),
-       PINCTRL_PIN(151, "SDC2_DATA"),
-};
-
-#define DECLARE_MSM_GPIO_PINS(pin) static const unsigned int gpio##pin##_pins[] = { pin }
-DECLARE_MSM_GPIO_PINS(0);
-DECLARE_MSM_GPIO_PINS(1);
-DECLARE_MSM_GPIO_PINS(2);
-DECLARE_MSM_GPIO_PINS(3);
-DECLARE_MSM_GPIO_PINS(4);
-DECLARE_MSM_GPIO_PINS(5);
-DECLARE_MSM_GPIO_PINS(6);
-DECLARE_MSM_GPIO_PINS(7);
-DECLARE_MSM_GPIO_PINS(8);
-DECLARE_MSM_GPIO_PINS(9);
-DECLARE_MSM_GPIO_PINS(10);
-DECLARE_MSM_GPIO_PINS(11);
-DECLARE_MSM_GPIO_PINS(12);
-DECLARE_MSM_GPIO_PINS(13);
-DECLARE_MSM_GPIO_PINS(14);
-DECLARE_MSM_GPIO_PINS(15);
-DECLARE_MSM_GPIO_PINS(16);
-DECLARE_MSM_GPIO_PINS(17);
-DECLARE_MSM_GPIO_PINS(18);
-DECLARE_MSM_GPIO_PINS(19);
-DECLARE_MSM_GPIO_PINS(20);
-DECLARE_MSM_GPIO_PINS(21);
-DECLARE_MSM_GPIO_PINS(22);
-DECLARE_MSM_GPIO_PINS(23);
-DECLARE_MSM_GPIO_PINS(24);
-DECLARE_MSM_GPIO_PINS(25);
-DECLARE_MSM_GPIO_PINS(26);
-DECLARE_MSM_GPIO_PINS(27);
-DECLARE_MSM_GPIO_PINS(28);
-DECLARE_MSM_GPIO_PINS(29);
-DECLARE_MSM_GPIO_PINS(30);
-DECLARE_MSM_GPIO_PINS(31);
-DECLARE_MSM_GPIO_PINS(32);
-DECLARE_MSM_GPIO_PINS(33);
-DECLARE_MSM_GPIO_PINS(34);
-DECLARE_MSM_GPIO_PINS(35);
-DECLARE_MSM_GPIO_PINS(36);
-DECLARE_MSM_GPIO_PINS(37);
-DECLARE_MSM_GPIO_PINS(38);
-DECLARE_MSM_GPIO_PINS(39);
-DECLARE_MSM_GPIO_PINS(40);
-DECLARE_MSM_GPIO_PINS(41);
-DECLARE_MSM_GPIO_PINS(42);
-DECLARE_MSM_GPIO_PINS(43);
-DECLARE_MSM_GPIO_PINS(44);
-DECLARE_MSM_GPIO_PINS(45);
-DECLARE_MSM_GPIO_PINS(46);
-DECLARE_MSM_GPIO_PINS(47);
-DECLARE_MSM_GPIO_PINS(48);
-DECLARE_MSM_GPIO_PINS(49);
-DECLARE_MSM_GPIO_PINS(50);
-DECLARE_MSM_GPIO_PINS(51);
-DECLARE_MSM_GPIO_PINS(52);
-DECLARE_MSM_GPIO_PINS(53);
-DECLARE_MSM_GPIO_PINS(54);
-DECLARE_MSM_GPIO_PINS(55);
-DECLARE_MSM_GPIO_PINS(56);
-DECLARE_MSM_GPIO_PINS(57);
-DECLARE_MSM_GPIO_PINS(58);
-DECLARE_MSM_GPIO_PINS(59);
-DECLARE_MSM_GPIO_PINS(60);
-DECLARE_MSM_GPIO_PINS(61);
-DECLARE_MSM_GPIO_PINS(62);
-DECLARE_MSM_GPIO_PINS(63);
-DECLARE_MSM_GPIO_PINS(64);
-DECLARE_MSM_GPIO_PINS(65);
-DECLARE_MSM_GPIO_PINS(66);
-DECLARE_MSM_GPIO_PINS(67);
-DECLARE_MSM_GPIO_PINS(68);
-DECLARE_MSM_GPIO_PINS(69);
-DECLARE_MSM_GPIO_PINS(70);
-DECLARE_MSM_GPIO_PINS(71);
-DECLARE_MSM_GPIO_PINS(72);
-DECLARE_MSM_GPIO_PINS(73);
-DECLARE_MSM_GPIO_PINS(74);
-DECLARE_MSM_GPIO_PINS(75);
-DECLARE_MSM_GPIO_PINS(76);
-DECLARE_MSM_GPIO_PINS(77);
-DECLARE_MSM_GPIO_PINS(78);
-DECLARE_MSM_GPIO_PINS(79);
-DECLARE_MSM_GPIO_PINS(80);
-DECLARE_MSM_GPIO_PINS(81);
-DECLARE_MSM_GPIO_PINS(82);
-DECLARE_MSM_GPIO_PINS(83);
-DECLARE_MSM_GPIO_PINS(84);
-DECLARE_MSM_GPIO_PINS(85);
-DECLARE_MSM_GPIO_PINS(86);
-DECLARE_MSM_GPIO_PINS(87);
-DECLARE_MSM_GPIO_PINS(88);
-DECLARE_MSM_GPIO_PINS(89);
-DECLARE_MSM_GPIO_PINS(90);
-DECLARE_MSM_GPIO_PINS(91);
-DECLARE_MSM_GPIO_PINS(92);
-DECLARE_MSM_GPIO_PINS(93);
-DECLARE_MSM_GPIO_PINS(94);
-DECLARE_MSM_GPIO_PINS(95);
-DECLARE_MSM_GPIO_PINS(96);
-DECLARE_MSM_GPIO_PINS(97);
-DECLARE_MSM_GPIO_PINS(98);
-DECLARE_MSM_GPIO_PINS(99);
-DECLARE_MSM_GPIO_PINS(100);
-DECLARE_MSM_GPIO_PINS(101);
-DECLARE_MSM_GPIO_PINS(102);
-DECLARE_MSM_GPIO_PINS(103);
-DECLARE_MSM_GPIO_PINS(104);
-DECLARE_MSM_GPIO_PINS(105);
-DECLARE_MSM_GPIO_PINS(106);
-DECLARE_MSM_GPIO_PINS(107);
-DECLARE_MSM_GPIO_PINS(108);
-DECLARE_MSM_GPIO_PINS(109);
-DECLARE_MSM_GPIO_PINS(110);
-DECLARE_MSM_GPIO_PINS(111);
-DECLARE_MSM_GPIO_PINS(112);
-DECLARE_MSM_GPIO_PINS(113);
-DECLARE_MSM_GPIO_PINS(114);
-DECLARE_MSM_GPIO_PINS(115);
-DECLARE_MSM_GPIO_PINS(116);
-DECLARE_MSM_GPIO_PINS(117);
-DECLARE_MSM_GPIO_PINS(118);
-DECLARE_MSM_GPIO_PINS(119);
-DECLARE_MSM_GPIO_PINS(120);
-DECLARE_MSM_GPIO_PINS(121);
-DECLARE_MSM_GPIO_PINS(122);
-DECLARE_MSM_GPIO_PINS(123);
-DECLARE_MSM_GPIO_PINS(124);
-DECLARE_MSM_GPIO_PINS(125);
-DECLARE_MSM_GPIO_PINS(126);
-DECLARE_MSM_GPIO_PINS(127);
-DECLARE_MSM_GPIO_PINS(128);
-DECLARE_MSM_GPIO_PINS(129);
-DECLARE_MSM_GPIO_PINS(130);
-DECLARE_MSM_GPIO_PINS(131);
-DECLARE_MSM_GPIO_PINS(132);
-DECLARE_MSM_GPIO_PINS(133);
-DECLARE_MSM_GPIO_PINS(134);
-DECLARE_MSM_GPIO_PINS(135);
-DECLARE_MSM_GPIO_PINS(136);
-DECLARE_MSM_GPIO_PINS(137);
-DECLARE_MSM_GPIO_PINS(138);
-DECLARE_MSM_GPIO_PINS(139);
-DECLARE_MSM_GPIO_PINS(140);
-DECLARE_MSM_GPIO_PINS(141);
-DECLARE_MSM_GPIO_PINS(142);
-DECLARE_MSM_GPIO_PINS(143);
-DECLARE_MSM_GPIO_PINS(144);
-DECLARE_MSM_GPIO_PINS(145);
-
-static const unsigned int sdc1_clk_pins[] = { 146 };
-static const unsigned int sdc1_cmd_pins[] = { 147 };
-static const unsigned int sdc1_data_pins[] = { 148 };
-static const unsigned int sdc2_clk_pins[] = { 149 };
-static const unsigned int sdc2_cmd_pins[] = { 150 };
-static const unsigned int sdc2_data_pins[] = { 151 };
-
-#define FUNCTION(fname)                                        \
-       [MSM_MUX_##fname] = {                           \
-               .name = #fname,                         \
-               .groups = fname##_groups,               \
-               .ngroups = ARRAY_SIZE(fname##_groups),  \
-       }
-
-#define PINGROUP(id, f1, f2, f3, f4, f5, f6, f7)       \
-       {                                               \
-               .name = "gpio" #id,                     \
-               .pins = gpio##id##_pins,                \
-               .npins = ARRAY_SIZE(gpio##id##_pins),   \
-               .funcs = (int[]){                       \
-                       MSM_MUX_NA, /* gpio mode */     \
-                       MSM_MUX_##f1,                   \
-                       MSM_MUX_##f2,                   \
-                       MSM_MUX_##f3,                   \
-                       MSM_MUX_##f4,                   \
-                       MSM_MUX_##f5,                   \
-                       MSM_MUX_##f6,                   \
-                       MSM_MUX_##f7                    \
-               },                                      \
-               .nfuncs = 8,                            \
-               .ctl_reg = 0x1000 + 0x10 * id,          \
-               .io_reg = 0x1004 + 0x10 * id,           \
-               .intr_cfg_reg = 0x1008 + 0x10 * id,     \
-               .intr_status_reg = 0x100c + 0x10 * id,  \
-               .intr_target_reg = 0x1008 + 0x10 * id,  \
-               .mux_bit = 2,                           \
-               .pull_bit = 0,                          \
-               .drv_bit = 6,                           \
-               .oe_bit = 9,                            \
-               .in_bit = 0,                            \
-               .out_bit = 1,                           \
-               .intr_enable_bit = 0,                   \
-               .intr_status_bit = 0,                   \
-               .intr_target_bit = 5,                   \
-               .intr_raw_status_bit = 4,               \
-               .intr_polarity_bit = 1,                 \
-               .intr_detection_bit = 2,                \
-               .intr_detection_width = 2,              \
-       }
-
-#define SDC_PINGROUP(pg_name, ctl, pull, drv)          \
-       {                                               \
-               .name = #pg_name,                       \
-               .pins = pg_name##_pins,                 \
-               .npins = ARRAY_SIZE(pg_name##_pins),    \
-               .ctl_reg = ctl,                         \
-               .io_reg = 0,                            \
-               .intr_cfg_reg = 0,                      \
-               .intr_status_reg = 0,                   \
-               .intr_target_reg = 0,                   \
-               .mux_bit = -1,                          \
-               .pull_bit = pull,                       \
-               .drv_bit = drv,                         \
-               .oe_bit = -1,                           \
-               .in_bit = -1,                           \
-               .out_bit = -1,                          \
-               .intr_enable_bit = -1,                  \
-               .intr_status_bit = -1,                  \
-               .intr_target_bit = -1,                  \
-               .intr_raw_status_bit = -1,              \
-               .intr_polarity_bit = -1,                \
-               .intr_detection_bit = -1,               \
-               .intr_detection_width = -1,             \
-       }
-
-/*
- * TODO: Add the rest of the possible functions and fill out
- * the pingroup table below.
- */
-enum msm8x74_functions {
-       MSM_MUX_cci_i2c0,
-       MSM_MUX_cci_i2c1,
-       MSM_MUX_blsp_i2c1,
-       MSM_MUX_blsp_i2c2,
-       MSM_MUX_blsp_i2c3,
-       MSM_MUX_blsp_i2c4,
-       MSM_MUX_blsp_i2c5,
-       MSM_MUX_blsp_i2c6,
-       MSM_MUX_blsp_i2c7,
-       MSM_MUX_blsp_i2c8,
-       MSM_MUX_blsp_i2c9,
-       MSM_MUX_blsp_i2c10,
-       MSM_MUX_blsp_i2c11,
-       MSM_MUX_blsp_i2c12,
-       MSM_MUX_blsp_spi1,
-       MSM_MUX_blsp_spi1_cs1,
-       MSM_MUX_blsp_spi1_cs2,
-       MSM_MUX_blsp_spi1_cs3,
-       MSM_MUX_blsp_spi2,
-       MSM_MUX_blsp_spi2_cs1,
-       MSM_MUX_blsp_spi2_cs2,
-       MSM_MUX_blsp_spi2_cs3,
-       MSM_MUX_blsp_spi3,
-       MSM_MUX_blsp_spi4,
-       MSM_MUX_blsp_spi5,
-       MSM_MUX_blsp_spi6,
-       MSM_MUX_blsp_spi7,
-       MSM_MUX_blsp_spi8,
-       MSM_MUX_blsp_spi9,
-       MSM_MUX_blsp_spi10,
-       MSM_MUX_blsp_spi10_cs1,
-       MSM_MUX_blsp_spi10_cs2,
-       MSM_MUX_blsp_spi10_cs3,
-       MSM_MUX_blsp_spi11,
-       MSM_MUX_blsp_spi12,
-       MSM_MUX_blsp_uart1,
-       MSM_MUX_blsp_uart2,
-       MSM_MUX_blsp_uart3,
-       MSM_MUX_blsp_uart4,
-       MSM_MUX_blsp_uart5,
-       MSM_MUX_blsp_uart6,
-       MSM_MUX_blsp_uart7,
-       MSM_MUX_blsp_uart8,
-       MSM_MUX_blsp_uart9,
-       MSM_MUX_blsp_uart10,
-       MSM_MUX_blsp_uart11,
-       MSM_MUX_blsp_uart12,
-       MSM_MUX_blsp_uim1,
-       MSM_MUX_blsp_uim2,
-       MSM_MUX_blsp_uim3,
-       MSM_MUX_blsp_uim4,
-       MSM_MUX_blsp_uim5,
-       MSM_MUX_blsp_uim6,
-       MSM_MUX_blsp_uim7,
-       MSM_MUX_blsp_uim8,
-       MSM_MUX_blsp_uim9,
-       MSM_MUX_blsp_uim10,
-       MSM_MUX_blsp_uim11,
-       MSM_MUX_blsp_uim12,
-       MSM_MUX_uim1,
-       MSM_MUX_uim2,
-       MSM_MUX_uim_batt_alarm,
-       MSM_MUX_sdc3,
-       MSM_MUX_sdc4,
-       MSM_MUX_gcc_gp_clk1,
-       MSM_MUX_gcc_gp_clk2,
-       MSM_MUX_gcc_gp_clk3,
-       MSM_MUX_qua_mi2s,
-       MSM_MUX_pri_mi2s,
-       MSM_MUX_spkr_mi2s,
-       MSM_MUX_ter_mi2s,
-       MSM_MUX_sec_mi2s,
-       MSM_MUX_hdmi_cec,
-       MSM_MUX_hdmi_ddc,
-       MSM_MUX_hdmi_hpd,
-       MSM_MUX_edp_hpd,
-       MSM_MUX_mdp_vsync,
-       MSM_MUX_cam_mclk0,
-       MSM_MUX_cam_mclk1,
-       MSM_MUX_cam_mclk2,
-       MSM_MUX_cam_mclk3,
-       MSM_MUX_cci_timer0,
-       MSM_MUX_cci_timer1,
-       MSM_MUX_cci_timer2,
-       MSM_MUX_cci_timer3,
-       MSM_MUX_cci_timer4,
-       MSM_MUX_cci_async_in0,
-       MSM_MUX_cci_async_in1,
-       MSM_MUX_cci_async_in2,
-       MSM_MUX_gp_pdm0,
-       MSM_MUX_gp_pdm1,
-       MSM_MUX_gp_pdm2,
-       MSM_MUX_gp0_clk,
-       MSM_MUX_gp1_clk,
-       MSM_MUX_gp_mn,
-       MSM_MUX_tsif1,
-       MSM_MUX_tsif2,
-       MSM_MUX_hsic,
-       MSM_MUX_grfc,
-       MSM_MUX_audio_ref_clk,
-       MSM_MUX_bt,
-       MSM_MUX_fm,
-       MSM_MUX_wlan,
-       MSM_MUX_slimbus,
-       MSM_MUX_NA,
-};
-
-static const char * const blsp_uart1_groups[] = {
-       "gpio0", "gpio1", "gpio2", "gpio3"
-};
-static const char * const blsp_uim1_groups[] = { "gpio0", "gpio1" };
-static const char * const blsp_i2c1_groups[] = { "gpio2", "gpio3" };
-static const char * const blsp_spi1_groups[] = {
-       "gpio0", "gpio1", "gpio2", "gpio3"
-};
-static const char * const blsp_spi1_cs1_groups[] = { "gpio8" };
-static const char * const blsp_spi1_cs2_groups[] = { "gpio9", "gpio11" };
-static const char * const blsp_spi1_cs3_groups[] = { "gpio10" };
-
-static const char * const blsp_uart2_groups[] = {
-       "gpio4", "gpio5", "gpio6", "gpio7"
-};
-static const char * const blsp_uim2_groups[] = { "gpio4", "gpio5" };
-static const char * const blsp_i2c2_groups[] = { "gpio6", "gpio7" };
-static const char * const blsp_spi2_groups[] = {
-       "gpio4", "gpio5", "gpio6", "gpio7"
-};
-static const char * const blsp_spi2_cs1_groups[] = { "gpio53", "gpio62" };
-static const char * const blsp_spi2_cs2_groups[] = { "gpio54", "gpio63" };
-static const char * const blsp_spi2_cs3_groups[] = { "gpio66" };
-
-static const char * const blsp_uart3_groups[] = {
-       "gpio8", "gpio9", "gpio10", "gpio11"
-};
-static const char * const blsp_uim3_groups[] = { "gpio8", "gpio9" };
-static const char * const blsp_i2c3_groups[] = { "gpio10", "gpio11" };
-static const char * const blsp_spi3_groups[] = {
-       "gpio8", "gpio9", "gpio10", "gpio11"
-};
-
-static const char * const cci_i2c0_groups[] = { "gpio19", "gpio20" };
-static const char * const cci_i2c1_groups[] = { "gpio21", "gpio22" };
-
-static const char * const blsp_uart4_groups[] = {
-       "gpio19", "gpio20", "gpio21", "gpio22"
-};
-static const char * const blsp_uim4_groups[] = { "gpio19", "gpio20" };
-static const char * const blsp_i2c4_groups[] = { "gpio21", "gpio22" };
-static const char * const blsp_spi4_groups[] = {
-       "gpio19", "gpio20", "gpio21", "gpio22"
-};
-
-static const char * const blsp_uart5_groups[] = {
-       "gpio23", "gpio24", "gpio25", "gpio26"
-};
-static const char * const blsp_uim5_groups[] = { "gpio23", "gpio24" };
-static const char * const blsp_i2c5_groups[] = { "gpio25", "gpio26" };
-static const char * const blsp_spi5_groups[] = {
-       "gpio23", "gpio24", "gpio25", "gpio26"
-};
-
-static const char * const blsp_uart6_groups[] = {
-       "gpio27", "gpio28", "gpio29", "gpio30"
-};
-static const char * const blsp_uim6_groups[] = { "gpio27", "gpio28" };
-static const char * const blsp_i2c6_groups[] = { "gpio29", "gpio30" };
-static const char * const blsp_spi6_groups[] = {
-       "gpio27", "gpio28", "gpio29", "gpio30"
-};
-
-static const char * const blsp_uart7_groups[] = {
-       "gpio41", "gpio42", "gpio43", "gpio44"
-};
-static const char * const blsp_uim7_groups[] = { "gpio41", "gpio42" };
-static const char * const blsp_i2c7_groups[] = { "gpio43", "gpio44" };
-static const char * const blsp_spi7_groups[] = {
-       "gpio41", "gpio42", "gpio43", "gpio44"
-};
-
-static const char * const blsp_uart8_groups[] = {
-       "gpio45", "gpio46", "gpio47", "gpio48"
-};
-static const char * const blsp_uim8_groups[] = { "gpio45", "gpio46" };
-static const char * const blsp_i2c8_groups[] = { "gpio47", "gpio48" };
-static const char * const blsp_spi8_groups[] = {
-       "gpio45", "gpio46", "gpio47", "gpio48"
-};
-
-static const char * const blsp_uart9_groups[] = {
-       "gpio49", "gpio50", "gpio51", "gpio52"
-};
-static const char * const blsp_uim9_groups[] = { "gpio49", "gpio50" };
-static const char * const blsp_i2c9_groups[] = { "gpio51", "gpio52" };
-static const char * const blsp_spi9_groups[] = {
-       "gpio49", "gpio50", "gpio51", "gpio52"
-};
-
-static const char * const blsp_uart10_groups[] = {
-       "gpio53", "gpio54", "gpio55", "gpio56"
-};
-static const char * const blsp_uim10_groups[] = { "gpio53", "gpio54" };
-static const char * const blsp_i2c10_groups[] = { "gpio55", "gpio56" };
-static const char * const blsp_spi10_groups[] = {
-       "gpio53", "gpio54", "gpio55", "gpio56"
-};
-static const char * const blsp_spi10_cs1_groups[] = { "gpio47", "gpio67" };
-static const char * const blsp_spi10_cs2_groups[] = { "gpio48", "gpio68" };
-static const char * const blsp_spi10_cs3_groups[] = { "gpio90" };
-
-static const char * const blsp_uart11_groups[] = {
-       "gpio81", "gpio82", "gpio83", "gpio84"
-};
-static const char * const blsp_uim11_groups[] = { "gpio81", "gpio82" };
-static const char * const blsp_i2c11_groups[] = { "gpio83", "gpio84" };
-static const char * const blsp_spi11_groups[] = {
-       "gpio81", "gpio82", "gpio83", "gpio84"
-};
-
-static const char * const blsp_uart12_groups[] = {
-       "gpio85", "gpio86", "gpio87", "gpio88"
-};
-static const char * const blsp_uim12_groups[] = { "gpio85", "gpio86" };
-static const char * const blsp_i2c12_groups[] = { "gpio87", "gpio88" };
-static const char * const blsp_spi12_groups[] = {
-       "gpio85", "gpio86", "gpio87", "gpio88"
-};
-
-static const char * const uim1_groups[] = {
-       "gpio97", "gpio98", "gpio99", "gpio100"
-};
-
-static const char * const uim2_groups[] = {
-       "gpio49", "gpio50", "gpio51", "gpio52"
-};
-
-static const char * const uim_batt_alarm_groups[] = { "gpio101" };
-
-static const char * const sdc3_groups[] = {
-       "gpio35", "gpio36", "gpio37", "gpio38", "gpio39", "gpio40"
-};
-
-static const char * const sdc4_groups[] = {
-       "gpio91", "gpio92", "gpio93", "gpio94", "gpio95", "gpio96"
-};
-
-static const char * const gp0_clk_groups[] = { "gpio26" };
-static const char * const gp1_clk_groups[] = { "gpio27", "gpio57", "gpio78" };
-static const char * const gp_mn_groups[] = { "gpio29" };
-static const char * const gcc_gp_clk1_groups[] = { "gpio57", "gpio78" };
-static const char * const gcc_gp_clk2_groups[] = { "gpio58", "gpio81" };
-static const char * const gcc_gp_clk3_groups[] = { "gpio59", "gpio82" };
-
-static const char * const qua_mi2s_groups[] = {
-       "gpio57", "gpio58", "gpio59", "gpio60", "gpio61", "gpio62", "gpio63",
-};
-
-static const char * const pri_mi2s_groups[] = {
-       "gpio64", "gpio65", "gpio66", "gpio67", "gpio68"
-};
-
-static const char * const spkr_mi2s_groups[] = {
-       "gpio69", "gpio70", "gpio71", "gpio72"
-};
-
-static const char * const ter_mi2s_groups[] = {
-       "gpio73", "gpio74", "gpio75", "gpio76", "gpio77"
-};
-
-static const char * const sec_mi2s_groups[] = {
-       "gpio78", "gpio79", "gpio80", "gpio81", "gpio82"
-};
-
-static const char * const hdmi_cec_groups[] = { "gpio31" };
-static const char * const hdmi_ddc_groups[] = { "gpio32", "gpio33" };
-static const char * const hdmi_hpd_groups[] = { "gpio34" };
-static const char * const edp_hpd_groups[] = { "gpio102" };
-
-static const char * const mdp_vsync_groups[] = { "gpio12", "gpio13", "gpio14" };
-static const char * const cam_mclk0_groups[] = { "gpio15" };
-static const char * const cam_mclk1_groups[] = { "gpio16" };
-static const char * const cam_mclk2_groups[] = { "gpio17" };
-static const char * const cam_mclk3_groups[] = { "gpio18" };
-
-static const char * const cci_timer0_groups[] = { "gpio23" };
-static const char * const cci_timer1_groups[] = { "gpio24" };
-static const char * const cci_timer2_groups[] = { "gpio25" };
-static const char * const cci_timer3_groups[] = { "gpio26" };
-static const char * const cci_timer4_groups[] = { "gpio27" };
-static const char * const cci_async_in0_groups[] = { "gpio28" };
-static const char * const cci_async_in1_groups[] = { "gpio26" };
-static const char * const cci_async_in2_groups[] = { "gpio27" };
-
-static const char * const gp_pdm0_groups[] = { "gpio54", "gpio68" };
-static const char * const gp_pdm1_groups[] = { "gpio74", "gpio86" };
-static const char * const gp_pdm2_groups[] = { "gpio63", "gpio79" };
-
-static const char * const tsif1_groups[] = {
-       "gpio89", "gpio90", "gpio91", "gpio92"
-};
-
-static const char * const tsif2_groups[] = {
-       "gpio93", "gpio94", "gpio95", "gpio96"
-};
-
-static const char * const hsic_groups[] = { "gpio144", "gpio145" };
-static const char * const grfc_groups[] = {
-       "gpio104", "gpio105", "gpio106", "gpio107", "gpio108", "gpio109",
-       "gpio110", "gpio111", "gpio112", "gpio113", "gpio114", "gpio115",
-       "gpio116", "gpio117", "gpio118", "gpio119", "gpio120", "gpio121",
-       "gpio122", "gpio123", "gpio124", "gpio125", "gpio126", "gpio127",
-       "gpio128", "gpio136", "gpio137", "gpio141", "gpio143"
-};
-
-static const char * const audio_ref_clk_groups[] = { "gpio69" };
-
-static const char * const bt_groups[] = { "gpio35", "gpio43", "gpio44" };
-
-static const char * const fm_groups[] = { "gpio41", "gpio42" };
-
-static const char * const wlan_groups[] = {
-       "gpio36", "gpio37", "gpio38", "gpio39", "gpio40"
-};
-
-static const char * const slimbus_groups[] = { "gpio70", "gpio71" };
-
-static const struct msm_function msm8x74_functions[] = {
-       FUNCTION(cci_i2c0),
-       FUNCTION(cci_i2c1),
-       FUNCTION(uim1),
-       FUNCTION(uim2),
-       FUNCTION(uim_batt_alarm),
-       FUNCTION(blsp_uim1),
-       FUNCTION(blsp_uim2),
-       FUNCTION(blsp_uim3),
-       FUNCTION(blsp_uim4),
-       FUNCTION(blsp_uim5),
-       FUNCTION(blsp_uim6),
-       FUNCTION(blsp_uim7),
-       FUNCTION(blsp_uim8),
-       FUNCTION(blsp_uim9),
-       FUNCTION(blsp_uim10),
-       FUNCTION(blsp_uim11),
-       FUNCTION(blsp_uim12),
-       FUNCTION(blsp_i2c1),
-       FUNCTION(blsp_i2c2),
-       FUNCTION(blsp_i2c3),
-       FUNCTION(blsp_i2c4),
-       FUNCTION(blsp_i2c5),
-       FUNCTION(blsp_i2c6),
-       FUNCTION(blsp_i2c7),
-       FUNCTION(blsp_i2c8),
-       FUNCTION(blsp_i2c9),
-       FUNCTION(blsp_i2c10),
-       FUNCTION(blsp_i2c11),
-       FUNCTION(blsp_i2c12),
-       FUNCTION(blsp_spi1),
-       FUNCTION(blsp_spi1_cs1),
-       FUNCTION(blsp_spi1_cs2),
-       FUNCTION(blsp_spi1_cs3),
-       FUNCTION(blsp_spi2),
-       FUNCTION(blsp_spi2_cs1),
-       FUNCTION(blsp_spi2_cs2),
-       FUNCTION(blsp_spi2_cs3),
-       FUNCTION(blsp_spi3),
-       FUNCTION(blsp_spi4),
-       FUNCTION(blsp_spi5),
-       FUNCTION(blsp_spi6),
-       FUNCTION(blsp_spi7),
-       FUNCTION(blsp_spi8),
-       FUNCTION(blsp_spi9),
-       FUNCTION(blsp_spi10),
-       FUNCTION(blsp_spi10_cs1),
-       FUNCTION(blsp_spi10_cs2),
-       FUNCTION(blsp_spi10_cs3),
-       FUNCTION(blsp_spi11),
-       FUNCTION(blsp_spi12),
-       FUNCTION(blsp_uart1),
-       FUNCTION(blsp_uart2),
-       FUNCTION(blsp_uart3),
-       FUNCTION(blsp_uart4),
-       FUNCTION(blsp_uart5),
-       FUNCTION(blsp_uart6),
-       FUNCTION(blsp_uart7),
-       FUNCTION(blsp_uart8),
-       FUNCTION(blsp_uart9),
-       FUNCTION(blsp_uart10),
-       FUNCTION(blsp_uart11),
-       FUNCTION(blsp_uart12),
-       FUNCTION(sdc3),
-       FUNCTION(sdc4),
-       FUNCTION(gcc_gp_clk1),
-       FUNCTION(gcc_gp_clk2),
-       FUNCTION(gcc_gp_clk3),
-       FUNCTION(qua_mi2s),
-       FUNCTION(pri_mi2s),
-       FUNCTION(spkr_mi2s),
-       FUNCTION(ter_mi2s),
-       FUNCTION(sec_mi2s),
-       FUNCTION(mdp_vsync),
-       FUNCTION(cam_mclk0),
-       FUNCTION(cam_mclk1),
-       FUNCTION(cam_mclk2),
-       FUNCTION(cam_mclk3),
-       FUNCTION(cci_timer0),
-       FUNCTION(cci_timer1),
-       FUNCTION(cci_timer2),
-       FUNCTION(cci_timer3),
-       FUNCTION(cci_timer4),
-       FUNCTION(cci_async_in0),
-       FUNCTION(cci_async_in1),
-       FUNCTION(cci_async_in2),
-       FUNCTION(hdmi_cec),
-       FUNCTION(hdmi_ddc),
-       FUNCTION(hdmi_hpd),
-       FUNCTION(edp_hpd),
-       FUNCTION(gp_pdm0),
-       FUNCTION(gp_pdm1),
-       FUNCTION(gp_pdm2),
-       FUNCTION(gp0_clk),
-       FUNCTION(gp1_clk),
-       FUNCTION(gp_mn),
-       FUNCTION(tsif1),
-       FUNCTION(tsif2),
-       FUNCTION(hsic),
-       FUNCTION(grfc),
-       FUNCTION(audio_ref_clk),
-       FUNCTION(bt),
-       FUNCTION(fm),
-       FUNCTION(wlan),
-       FUNCTION(slimbus),
-};
-
-static const struct msm_pingroup msm8x74_groups[] = {
-       PINGROUP(0,   blsp_spi1, blsp_uart1, blsp_uim1, NA, NA, NA, NA),
-       PINGROUP(1,   blsp_spi1, blsp_uart1, blsp_uim1, NA, NA, NA, NA),
-       PINGROUP(2,   blsp_spi1, blsp_uart1, blsp_i2c1, NA, NA, NA, NA),
-       PINGROUP(3,   blsp_spi1, blsp_uart1, blsp_i2c1, NA, NA, NA, NA),
-       PINGROUP(4,   blsp_spi2, blsp_uart2, blsp_uim2, NA, NA, NA, NA),
-       PINGROUP(5,   blsp_spi2, blsp_uart2, blsp_uim2, NA, NA, NA, NA),
-       PINGROUP(6,   blsp_spi2, blsp_uart2, blsp_i2c2, NA, NA, NA, NA),
-       PINGROUP(7,   blsp_spi2, blsp_uart2, blsp_i2c2, NA, NA, NA, NA),
-       PINGROUP(8,   blsp_spi3, blsp_uart3, blsp_uim3, blsp_spi1_cs1, NA, NA, NA),
-       PINGROUP(9,   blsp_spi3, blsp_uart3, blsp_uim3, blsp_spi1_cs2, NA, NA, NA),
-       PINGROUP(10,  blsp_spi3, blsp_uart3, blsp_i2c3, blsp_spi1_cs3, NA, NA, NA),
-       PINGROUP(11,  blsp_spi3, blsp_uart3, blsp_i2c3, blsp_spi1_cs2, NA, NA, NA),
-       PINGROUP(12,  mdp_vsync, NA, NA, NA, NA, NA, NA),
-       PINGROUP(13,  mdp_vsync, NA, NA, NA, NA, NA, NA),
-       PINGROUP(14,  mdp_vsync, NA, NA, NA, NA, NA, NA),
-       PINGROUP(15,  cam_mclk0, NA, NA, NA, NA, NA, NA),
-       PINGROUP(16,  cam_mclk1, NA, NA, NA, NA, NA, NA),
-       PINGROUP(17,  cam_mclk2, NA, NA, NA, NA, NA, NA),
-       PINGROUP(18,  cam_mclk3, NA, NA, NA, NA, NA, NA),
-       PINGROUP(19,  cci_i2c0, blsp_spi4, blsp_uart4, blsp_uim4, NA, NA, NA),
-       PINGROUP(20,  cci_i2c0, blsp_spi4, blsp_uart4, blsp_uim4, NA, NA, NA),
-       PINGROUP(21,  cci_i2c1, blsp_spi4, blsp_uart4, blsp_i2c4, NA, NA, NA),
-       PINGROUP(22,  cci_i2c1, blsp_spi4, blsp_uart4, blsp_i2c4, NA, NA, NA),
-       PINGROUP(23,  cci_timer0, blsp_spi5, blsp_uart5, blsp_uim5, NA, NA, NA),
-       PINGROUP(24,  cci_timer1, blsp_spi5, blsp_uart5, blsp_uim5, NA, NA, NA),
-       PINGROUP(25,  cci_timer2, blsp_spi5, blsp_uart5, blsp_i2c5, NA, NA, NA),
-       PINGROUP(26,  cci_timer3, cci_async_in1, blsp_spi5, blsp_uart5, blsp_i2c5, gp0_clk, NA),
-       PINGROUP(27,  cci_timer4, cci_async_in2, blsp_spi6, blsp_uart6, blsp_i2c6, gp1_clk, NA),
-       PINGROUP(28,  cci_async_in0, blsp_spi6, blsp_uart6, blsp_uim6, NA, NA, NA),
-       PINGROUP(29,  blsp_spi6, blsp_uart6, blsp_i2c6, gp_mn, NA, NA, NA),
-       PINGROUP(30,  blsp_spi6, blsp_uart6, blsp_i2c6, NA, NA, NA, NA),
-       PINGROUP(31,  hdmi_cec, NA, NA, NA, NA, NA, NA),
-       PINGROUP(32,  hdmi_ddc, NA, NA, NA, NA, NA, NA),
-       PINGROUP(33,  hdmi_ddc, NA, NA, NA, NA, NA, NA),
-       PINGROUP(34,  hdmi_hpd, NA, NA, NA, NA, NA, NA),
-       PINGROUP(35,  bt, sdc3, NA, NA, NA, NA, NA),
-       PINGROUP(36,  wlan, sdc3, NA, NA, NA, NA, NA),
-       PINGROUP(37,  wlan, sdc3, NA, NA, NA, NA, NA),
-       PINGROUP(38,  wlan, sdc3, NA, NA, NA, NA, NA),
-       PINGROUP(39,  wlan, sdc3, NA, NA, NA, NA, NA),
-       PINGROUP(40,  wlan, sdc3, NA, NA, NA, NA, NA),
-       PINGROUP(41,  fm, blsp_spi7, blsp_uart7, blsp_uim7, NA, NA, NA),
-       PINGROUP(42,  fm, blsp_spi7, blsp_uart7, blsp_uim7, NA, NA, NA),
-       PINGROUP(43,  bt, blsp_spi7, blsp_uart7, blsp_i2c7, NA, NA, NA),
-       PINGROUP(44,  bt, blsp_spi7, blsp_uart7, blsp_i2c7, NA, NA, NA),
-       PINGROUP(45,  blsp_spi8, blsp_uart8, blsp_uim8, NA, NA, NA, NA),
-       PINGROUP(46,  blsp_spi8, blsp_uart8, blsp_uim8, NA, NA, NA, NA),
-       PINGROUP(47,  blsp_spi8, blsp_uart8, blsp_i2c8, blsp_spi10_cs1, NA, NA, NA),
-       PINGROUP(48,  blsp_spi8, blsp_uart8, blsp_i2c8, blsp_spi10_cs2, NA, NA, NA),
-       PINGROUP(49,  uim2, blsp_spi9, blsp_uart9, blsp_uim9, NA, NA, NA),
-       PINGROUP(50,  uim2, blsp_spi9, blsp_uart9, blsp_uim9, NA, NA, NA),
-       PINGROUP(51,  uim2, blsp_spi9, blsp_uart9, blsp_i2c9, NA, NA, NA),
-       PINGROUP(52,  uim2, blsp_spi9, blsp_uart9, blsp_i2c9, NA, NA, NA),
-       PINGROUP(53,  blsp_spi10, blsp_uart10, blsp_uim10, blsp_spi2_cs1, NA, NA, NA),
-       PINGROUP(54,  blsp_spi10, blsp_uart10, blsp_uim10, blsp_spi2_cs2, gp_pdm0, NA, NA),
-       PINGROUP(55,  blsp_spi10, blsp_uart10, blsp_i2c10, NA, NA, NA, NA),
-       PINGROUP(56,  blsp_spi10, blsp_uart10, blsp_i2c10, NA, NA, NA, NA),
-       PINGROUP(57,  qua_mi2s, gcc_gp_clk1, NA, NA, NA, NA, NA),
-       PINGROUP(58,  qua_mi2s, gcc_gp_clk2, NA, NA, NA, NA, NA),
-       PINGROUP(59,  qua_mi2s, gcc_gp_clk3, NA, NA, NA, NA, NA),
-       PINGROUP(60,  qua_mi2s, NA, NA, NA, NA, NA, NA),
-       PINGROUP(61,  qua_mi2s, NA, NA, NA, NA, NA, NA),
-       PINGROUP(62,  qua_mi2s, blsp_spi2_cs1, NA, NA, NA, NA, NA),
-       PINGROUP(63,  qua_mi2s, blsp_spi2_cs2, gp_pdm2, NA, NA, NA, NA),
-       PINGROUP(64,  pri_mi2s, NA, NA, NA, NA, NA, NA),
-       PINGROUP(65,  pri_mi2s, NA, NA, NA, NA, NA, NA),
-       PINGROUP(66,  pri_mi2s, blsp_spi2_cs3, NA, NA, NA, NA, NA),
-       PINGROUP(67,  pri_mi2s, blsp_spi10_cs1, NA, NA, NA, NA, NA),
-       PINGROUP(68,  pri_mi2s, blsp_spi10_cs2, gp_pdm0, NA, NA, NA, NA),
-       PINGROUP(69,  spkr_mi2s, audio_ref_clk, NA, NA, NA, NA, NA),
-       PINGROUP(70,  slimbus, spkr_mi2s, NA, NA, NA, NA, NA),
-       PINGROUP(71,  slimbus, spkr_mi2s, NA, NA, NA, NA, NA),
-       PINGROUP(72,  spkr_mi2s, NA, NA, NA, NA, NA, NA),
-       PINGROUP(73,  ter_mi2s, NA, NA, NA, NA, NA, NA),
-       PINGROUP(74,  ter_mi2s, gp_pdm1, NA, NA, NA, NA, NA),
-       PINGROUP(75,  ter_mi2s, NA, NA, NA, NA, NA, NA),
-       PINGROUP(76,  ter_mi2s, NA, NA, NA, NA, NA, NA),
-       PINGROUP(77,  ter_mi2s, NA, NA, NA, NA, NA, NA),
-       PINGROUP(78,  sec_mi2s, gcc_gp_clk1, NA, NA, NA, NA, NA),
-       PINGROUP(79,  sec_mi2s, gp_pdm2, NA, NA, NA, NA, NA),
-       PINGROUP(80,  sec_mi2s, NA, NA, NA, NA, NA, NA),
-       PINGROUP(81,  sec_mi2s, blsp_spi11, blsp_uart11, blsp_uim11, gcc_gp_clk2, NA, NA),
-       PINGROUP(82,  sec_mi2s, blsp_spi11, blsp_uart11, blsp_uim11, gcc_gp_clk3, NA, NA),
-       PINGROUP(83,  blsp_spi11, blsp_uart11, blsp_i2c11, NA, NA, NA, NA),
-       PINGROUP(84,  blsp_spi11, blsp_uart11, blsp_i2c11, NA, NA, NA, NA),
-       PINGROUP(85,  blsp_spi12, blsp_uart12, blsp_uim12, NA, NA, NA, NA),
-       PINGROUP(86,  blsp_spi12, blsp_uart12, blsp_uim12, gp_pdm1, NA, NA, NA),
-       PINGROUP(87,  blsp_spi12, blsp_uart12, blsp_i2c12, NA, NA, NA, NA),
-       PINGROUP(88,  blsp_spi12, blsp_uart12, blsp_i2c12, NA, NA, NA, NA),
-       PINGROUP(89,  tsif1, NA, NA, NA, NA, NA, NA),
-       PINGROUP(90,  tsif1, blsp_spi10_cs3, NA, NA, NA, NA, NA),
-       PINGROUP(91,  tsif1, sdc4, NA, NA, NA, NA, NA),
-       PINGROUP(92,  tsif1, sdc4, NA, NA, NA, NA, NA),
-       PINGROUP(93,  tsif2, sdc4, NA, NA, NA, NA, NA),
-       PINGROUP(94,  tsif2, sdc4, NA, NA, NA, NA, NA),
-       PINGROUP(95,  tsif2, sdc4, NA, NA, NA, NA, NA),
-       PINGROUP(96,  tsif2, sdc4, NA, NA, NA, NA, NA),
-       PINGROUP(97,  uim1, NA, NA, NA, NA, NA, NA),
-       PINGROUP(98,  uim1, NA, NA, NA, NA, NA, NA),
-       PINGROUP(99,  uim1, NA, NA, NA, NA, NA, NA),
-       PINGROUP(100, uim1, NA, NA, NA, NA, NA, NA),
-       PINGROUP(101, uim_batt_alarm, NA, NA, NA, NA, NA, NA),
-       PINGROUP(102, edp_hpd, NA, NA, NA, NA, NA, NA),
-       PINGROUP(103, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(104, grfc, NA, NA, NA, NA, NA, NA),
-       PINGROUP(105, grfc, NA, NA, NA, NA, NA, NA),
-       PINGROUP(106, grfc, NA, NA, NA, NA, NA, NA),
-       PINGROUP(107, grfc, NA, NA, NA, NA, NA, NA),
-       PINGROUP(108, grfc, NA, NA, NA, NA, NA, NA),
-       PINGROUP(109, grfc, NA, NA, NA, NA, NA, NA),
-       PINGROUP(110, grfc, NA, NA, NA, NA, NA, NA),
-       PINGROUP(111, grfc, NA, NA, NA, NA, NA, NA),
-       PINGROUP(112, grfc, NA, NA, NA, NA, NA, NA),
-       PINGROUP(113, grfc, NA, NA, NA, NA, NA, NA),
-       PINGROUP(114, grfc, NA, NA, NA, NA, NA, NA),
-       PINGROUP(115, grfc, NA, NA, NA, NA, NA, NA),
-       PINGROUP(116, grfc, NA, NA, NA, NA, NA, NA),
-       PINGROUP(117, grfc, NA, NA, NA, NA, NA, NA),
-       PINGROUP(118, grfc, NA, NA, NA, NA, NA, NA),
-       PINGROUP(119, grfc, NA, NA, NA, NA, NA, NA),
-       PINGROUP(120, grfc, NA, NA, NA, NA, NA, NA),
-       PINGROUP(121, grfc, NA, NA, NA, NA, NA, NA),
-       PINGROUP(122, grfc, NA, NA, NA, NA, NA, NA),
-       PINGROUP(123, grfc, NA, NA, NA, NA, NA, NA),
-       PINGROUP(124, grfc, NA, NA, NA, NA, NA, NA),
-       PINGROUP(125, grfc, NA, NA, NA, NA, NA, NA),
-       PINGROUP(126, grfc, NA, NA, NA, NA, NA, NA),
-       PINGROUP(127, grfc, NA, NA, NA, NA, NA, NA),
-       PINGROUP(128, NA, grfc, NA, NA, NA, NA, NA),
-       PINGROUP(129, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(130, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(131, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(132, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(133, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(134, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(135, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(136, NA, grfc, NA, NA, NA, NA, NA),
-       PINGROUP(137, NA, grfc, NA, NA, NA, NA, NA),
-       PINGROUP(138, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(139, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(140, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(141, NA, grfc, NA, NA, NA, NA, NA),
-       PINGROUP(142, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(143, NA, grfc, NA, NA, NA, NA, NA),
-       PINGROUP(144, hsic, NA, NA, NA, NA, NA, NA),
-       PINGROUP(145, hsic, NA, NA, NA, NA, NA, NA),
-       SDC_PINGROUP(sdc1_clk, 0x2044, 13, 6),
-       SDC_PINGROUP(sdc1_cmd, 0x2044, 11, 3),
-       SDC_PINGROUP(sdc1_data, 0x2044, 9, 0),
-       SDC_PINGROUP(sdc2_clk, 0x2048, 14, 6),
-       SDC_PINGROUP(sdc2_cmd, 0x2048, 11, 3),
-       SDC_PINGROUP(sdc2_data, 0x2048, 9, 0),
-};
-
-#define NUM_GPIO_PINGROUPS 146
-
-static const struct msm_pinctrl_soc_data msm8x74_pinctrl = {
-       .pins = msm8x74_pins,
-       .npins = ARRAY_SIZE(msm8x74_pins),
-       .functions = msm8x74_functions,
-       .nfunctions = ARRAY_SIZE(msm8x74_functions),
-       .groups = msm8x74_groups,
-       .ngroups = ARRAY_SIZE(msm8x74_groups),
-       .ngpios = NUM_GPIO_PINGROUPS,
-};
-
-static int msm8x74_pinctrl_probe(struct platform_device *pdev)
-{
-       return msm_pinctrl_probe(pdev, &msm8x74_pinctrl);
-}
-
-static const struct of_device_id msm8x74_pinctrl_of_match[] = {
-       { .compatible = "qcom,msm8974-pinctrl", },
-       { },
-};
-
-static struct platform_driver msm8x74_pinctrl_driver = {
-       .driver = {
-               .name = "msm8x74-pinctrl",
-               .owner = THIS_MODULE,
-               .of_match_table = msm8x74_pinctrl_of_match,
-       },
-       .probe = msm8x74_pinctrl_probe,
-       .remove = msm_pinctrl_remove,
-};
-
-static int __init msm8x74_pinctrl_init(void)
-{
-       return platform_driver_register(&msm8x74_pinctrl_driver);
-}
-arch_initcall(msm8x74_pinctrl_init);
-
-static void __exit msm8x74_pinctrl_exit(void)
-{
-       platform_driver_unregister(&msm8x74_pinctrl_driver);
-}
-module_exit(msm8x74_pinctrl_exit);
-
-MODULE_AUTHOR("Bjorn Andersson <bjorn.andersson@sonymobile.com>");
-MODULE_DESCRIPTION("Qualcomm MSM8x74 pinctrl driver");
-MODULE_LICENSE("GPL v2");
-MODULE_DEVICE_TABLE(of, msm8x74_pinctrl_of_match);
-
diff --git a/drivers/pinctrl/pinctrl-nomadik-db8500.c b/drivers/pinctrl/pinctrl-nomadik-db8500.c
deleted file mode 100644 (file)
index c748407..0000000
+++ /dev/null
@@ -1,1257 +0,0 @@
-#include <linux/kernel.h>
-#include <linux/pinctrl/pinctrl.h>
-#include "pinctrl-nomadik.h"
-
-/* All the pins that can be used for GPIO and some other functions */
-#define _GPIO(offset)          (offset)
-
-#define DB8500_PIN_AJ5         _GPIO(0)
-#define DB8500_PIN_AJ3         _GPIO(1)
-#define DB8500_PIN_AH4         _GPIO(2)
-#define DB8500_PIN_AH3         _GPIO(3)
-#define DB8500_PIN_AH6         _GPIO(4)
-#define DB8500_PIN_AG6         _GPIO(5)
-#define DB8500_PIN_AF6         _GPIO(6)
-#define DB8500_PIN_AG5         _GPIO(7)
-#define DB8500_PIN_AD5         _GPIO(8)
-#define DB8500_PIN_AE4         _GPIO(9)
-#define DB8500_PIN_AF5         _GPIO(10)
-#define DB8500_PIN_AG4         _GPIO(11)
-#define DB8500_PIN_AC4         _GPIO(12)
-#define DB8500_PIN_AF3         _GPIO(13)
-#define DB8500_PIN_AE3         _GPIO(14)
-#define DB8500_PIN_AC3         _GPIO(15)
-#define DB8500_PIN_AD3         _GPIO(16)
-#define DB8500_PIN_AD4         _GPIO(17)
-#define DB8500_PIN_AC2         _GPIO(18)
-#define DB8500_PIN_AC1         _GPIO(19)
-#define DB8500_PIN_AB4         _GPIO(20)
-#define DB8500_PIN_AB3         _GPIO(21)
-#define DB8500_PIN_AA3         _GPIO(22)
-#define DB8500_PIN_AA4         _GPIO(23)
-#define DB8500_PIN_AB2         _GPIO(24)
-#define DB8500_PIN_Y4          _GPIO(25)
-#define DB8500_PIN_Y2          _GPIO(26)
-#define DB8500_PIN_AA2         _GPIO(27)
-#define DB8500_PIN_AA1         _GPIO(28)
-#define DB8500_PIN_W2          _GPIO(29)
-#define DB8500_PIN_W3          _GPIO(30)
-#define DB8500_PIN_V3          _GPIO(31)
-#define DB8500_PIN_V2          _GPIO(32)
-#define DB8500_PIN_AF2         _GPIO(33)
-#define DB8500_PIN_AE1         _GPIO(34)
-#define DB8500_PIN_AE2         _GPIO(35)
-#define DB8500_PIN_AG2         _GPIO(36)
-/* Hole */
-#define DB8500_PIN_F3          _GPIO(64)
-#define DB8500_PIN_F1          _GPIO(65)
-#define DB8500_PIN_G3          _GPIO(66)
-#define DB8500_PIN_G2          _GPIO(67)
-#define DB8500_PIN_E1          _GPIO(68)
-#define DB8500_PIN_E2          _GPIO(69)
-#define DB8500_PIN_G5          _GPIO(70)
-#define DB8500_PIN_G4          _GPIO(71)
-#define DB8500_PIN_H4          _GPIO(72)
-#define DB8500_PIN_H3          _GPIO(73)
-#define DB8500_PIN_J3          _GPIO(74)
-#define DB8500_PIN_H2          _GPIO(75)
-#define DB8500_PIN_J2          _GPIO(76)
-#define DB8500_PIN_H1          _GPIO(77)
-#define DB8500_PIN_F4          _GPIO(78)
-#define DB8500_PIN_E3          _GPIO(79)
-#define DB8500_PIN_E4          _GPIO(80)
-#define DB8500_PIN_D2          _GPIO(81)
-#define DB8500_PIN_C1          _GPIO(82)
-#define DB8500_PIN_D3          _GPIO(83)
-#define DB8500_PIN_C2          _GPIO(84)
-#define DB8500_PIN_D5          _GPIO(85)
-#define DB8500_PIN_C6          _GPIO(86)
-#define DB8500_PIN_B3          _GPIO(87)
-#define DB8500_PIN_C4          _GPIO(88)
-#define DB8500_PIN_E6          _GPIO(89)
-#define DB8500_PIN_A3          _GPIO(90)
-#define DB8500_PIN_B6          _GPIO(91)
-#define DB8500_PIN_D6          _GPIO(92)
-#define DB8500_PIN_B7          _GPIO(93)
-#define DB8500_PIN_D7          _GPIO(94)
-#define DB8500_PIN_E8          _GPIO(95)
-#define DB8500_PIN_D8          _GPIO(96)
-#define DB8500_PIN_D9          _GPIO(97)
-/* Hole */
-#define DB8500_PIN_A5          _GPIO(128)
-#define DB8500_PIN_B4          _GPIO(129)
-#define DB8500_PIN_C8          _GPIO(130)
-#define DB8500_PIN_A12         _GPIO(131)
-#define DB8500_PIN_C10         _GPIO(132)
-#define DB8500_PIN_B10         _GPIO(133)
-#define DB8500_PIN_B9          _GPIO(134)
-#define DB8500_PIN_A9          _GPIO(135)
-#define DB8500_PIN_C7          _GPIO(136)
-#define DB8500_PIN_A7          _GPIO(137)
-#define DB8500_PIN_C5          _GPIO(138)
-#define DB8500_PIN_C9          _GPIO(139)
-#define DB8500_PIN_B11         _GPIO(140)
-#define DB8500_PIN_C12         _GPIO(141)
-#define DB8500_PIN_C11         _GPIO(142)
-#define DB8500_PIN_D12         _GPIO(143)
-#define DB8500_PIN_B13         _GPIO(144)
-#define DB8500_PIN_C13         _GPIO(145)
-#define DB8500_PIN_D13         _GPIO(146)
-#define DB8500_PIN_C15         _GPIO(147)
-#define DB8500_PIN_B16         _GPIO(148)
-#define DB8500_PIN_B14         _GPIO(149)
-#define DB8500_PIN_C14         _GPIO(150)
-#define DB8500_PIN_D17         _GPIO(151)
-#define DB8500_PIN_D16         _GPIO(152)
-#define DB8500_PIN_B17         _GPIO(153)
-#define DB8500_PIN_C16         _GPIO(154)
-#define DB8500_PIN_C19         _GPIO(155)
-#define DB8500_PIN_C17         _GPIO(156)
-#define DB8500_PIN_A18         _GPIO(157)
-#define DB8500_PIN_C18         _GPIO(158)
-#define DB8500_PIN_B19         _GPIO(159)
-#define DB8500_PIN_B20         _GPIO(160)
-#define DB8500_PIN_D21         _GPIO(161)
-#define DB8500_PIN_D20         _GPIO(162)
-#define DB8500_PIN_C20         _GPIO(163)
-#define DB8500_PIN_B21         _GPIO(164)
-#define DB8500_PIN_C21         _GPIO(165)
-#define DB8500_PIN_A22         _GPIO(166)
-#define DB8500_PIN_B24         _GPIO(167)
-#define DB8500_PIN_C22         _GPIO(168)
-#define DB8500_PIN_D22         _GPIO(169)
-#define DB8500_PIN_C23         _GPIO(170)
-#define DB8500_PIN_D23         _GPIO(171)
-/* Hole */
-#define DB8500_PIN_AJ27                _GPIO(192)
-#define DB8500_PIN_AH27                _GPIO(193)
-#define DB8500_PIN_AF27                _GPIO(194)
-#define DB8500_PIN_AG28                _GPIO(195)
-#define DB8500_PIN_AG26                _GPIO(196)
-#define DB8500_PIN_AH24                _GPIO(197)
-#define DB8500_PIN_AG25                _GPIO(198)
-#define DB8500_PIN_AH23                _GPIO(199)
-#define DB8500_PIN_AH26                _GPIO(200)
-#define DB8500_PIN_AF24                _GPIO(201)
-#define DB8500_PIN_AF25                _GPIO(202)
-#define DB8500_PIN_AE23                _GPIO(203)
-#define DB8500_PIN_AF23                _GPIO(204)
-#define DB8500_PIN_AG23                _GPIO(205)
-#define DB8500_PIN_AG24                _GPIO(206)
-#define DB8500_PIN_AJ23                _GPIO(207)
-#define DB8500_PIN_AH16                _GPIO(208)
-#define DB8500_PIN_AG15                _GPIO(209)
-#define DB8500_PIN_AJ15                _GPIO(210)
-#define DB8500_PIN_AG14                _GPIO(211)
-#define DB8500_PIN_AF13                _GPIO(212)
-#define DB8500_PIN_AG13                _GPIO(213)
-#define DB8500_PIN_AH15                _GPIO(214)
-#define DB8500_PIN_AH13                _GPIO(215)
-#define DB8500_PIN_AG12                _GPIO(216)
-#define DB8500_PIN_AH12                _GPIO(217)
-#define DB8500_PIN_AH11                _GPIO(218)
-#define DB8500_PIN_AG10                _GPIO(219)
-#define DB8500_PIN_AH10                _GPIO(220)
-#define DB8500_PIN_AJ11                _GPIO(221)
-#define DB8500_PIN_AJ9         _GPIO(222)
-#define DB8500_PIN_AH9         _GPIO(223)
-#define DB8500_PIN_AG9         _GPIO(224)
-#define DB8500_PIN_AG8         _GPIO(225)
-#define DB8500_PIN_AF8         _GPIO(226)
-#define DB8500_PIN_AH7         _GPIO(227)
-#define DB8500_PIN_AJ6         _GPIO(228)
-#define DB8500_PIN_AG7         _GPIO(229)
-#define DB8500_PIN_AF7         _GPIO(230)
-/* Hole */
-#define DB8500_PIN_AF28                _GPIO(256)
-#define DB8500_PIN_AE29                _GPIO(257)
-#define DB8500_PIN_AD29                _GPIO(258)
-#define DB8500_PIN_AC29                _GPIO(259)
-#define DB8500_PIN_AD28                _GPIO(260)
-#define DB8500_PIN_AD26                _GPIO(261)
-#define DB8500_PIN_AE26                _GPIO(262)
-#define DB8500_PIN_AG29                _GPIO(263)
-#define DB8500_PIN_AE27                _GPIO(264)
-#define DB8500_PIN_AD27                _GPIO(265)
-#define DB8500_PIN_AC28                _GPIO(266)
-#define DB8500_PIN_AC27                _GPIO(267)
-
-/*
- * The names of the pins are denoted by GPIO number and ball name, even
- * though they can be used for other things than GPIO, this is the first
- * column in the table of the data sheet and often used on schematics and
- * such.
- */
-static const struct pinctrl_pin_desc nmk_db8500_pins[] = {
-       PINCTRL_PIN(DB8500_PIN_AJ5, "GPIO0_AJ5"),
-       PINCTRL_PIN(DB8500_PIN_AJ3, "GPIO1_AJ3"),
-       PINCTRL_PIN(DB8500_PIN_AH4, "GPIO2_AH4"),
-       PINCTRL_PIN(DB8500_PIN_AH3, "GPIO3_AH3"),
-       PINCTRL_PIN(DB8500_PIN_AH6, "GPIO4_AH6"),
-       PINCTRL_PIN(DB8500_PIN_AG6, "GPIO5_AG6"),
-       PINCTRL_PIN(DB8500_PIN_AF6, "GPIO6_AF6"),
-       PINCTRL_PIN(DB8500_PIN_AG5, "GPIO7_AG5"),
-       PINCTRL_PIN(DB8500_PIN_AD5, "GPIO8_AD5"),
-       PINCTRL_PIN(DB8500_PIN_AE4, "GPIO9_AE4"),
-       PINCTRL_PIN(DB8500_PIN_AF5, "GPIO10_AF5"),
-       PINCTRL_PIN(DB8500_PIN_AG4, "GPIO11_AG4"),
-       PINCTRL_PIN(DB8500_PIN_AC4, "GPIO12_AC4"),
-       PINCTRL_PIN(DB8500_PIN_AF3, "GPIO13_AF3"),
-       PINCTRL_PIN(DB8500_PIN_AE3, "GPIO14_AE3"),
-       PINCTRL_PIN(DB8500_PIN_AC3, "GPIO15_AC3"),
-       PINCTRL_PIN(DB8500_PIN_AD3, "GPIO16_AD3"),
-       PINCTRL_PIN(DB8500_PIN_AD4, "GPIO17_AD4"),
-       PINCTRL_PIN(DB8500_PIN_AC2, "GPIO18_AC2"),
-       PINCTRL_PIN(DB8500_PIN_AC1, "GPIO19_AC1"),
-       PINCTRL_PIN(DB8500_PIN_AB4, "GPIO20_AB4"),
-       PINCTRL_PIN(DB8500_PIN_AB3, "GPIO21_AB3"),
-       PINCTRL_PIN(DB8500_PIN_AA3, "GPIO22_AA3"),
-       PINCTRL_PIN(DB8500_PIN_AA4, "GPIO23_AA4"),
-       PINCTRL_PIN(DB8500_PIN_AB2, "GPIO24_AB2"),
-       PINCTRL_PIN(DB8500_PIN_Y4, "GPIO25_Y4"),
-       PINCTRL_PIN(DB8500_PIN_Y2, "GPIO26_Y2"),
-       PINCTRL_PIN(DB8500_PIN_AA2, "GPIO27_AA2"),
-       PINCTRL_PIN(DB8500_PIN_AA1, "GPIO28_AA1"),
-       PINCTRL_PIN(DB8500_PIN_W2, "GPIO29_W2"),
-       PINCTRL_PIN(DB8500_PIN_W3, "GPIO30_W3"),
-       PINCTRL_PIN(DB8500_PIN_V3, "GPIO31_V3"),
-       PINCTRL_PIN(DB8500_PIN_V2, "GPIO32_V2"),
-       PINCTRL_PIN(DB8500_PIN_AF2, "GPIO33_AF2"),
-       PINCTRL_PIN(DB8500_PIN_AE1, "GPIO34_AE1"),
-       PINCTRL_PIN(DB8500_PIN_AE2, "GPIO35_AE2"),
-       PINCTRL_PIN(DB8500_PIN_AG2, "GPIO36_AG2"),
-       /* Hole */
-       PINCTRL_PIN(DB8500_PIN_F3, "GPIO64_F3"),
-       PINCTRL_PIN(DB8500_PIN_F1, "GPIO65_F1"),
-       PINCTRL_PIN(DB8500_PIN_G3, "GPIO66_G3"),
-       PINCTRL_PIN(DB8500_PIN_G2, "GPIO67_G2"),
-       PINCTRL_PIN(DB8500_PIN_E1, "GPIO68_E1"),
-       PINCTRL_PIN(DB8500_PIN_E2, "GPIO69_E2"),
-       PINCTRL_PIN(DB8500_PIN_G5, "GPIO70_G5"),
-       PINCTRL_PIN(DB8500_PIN_G4, "GPIO71_G4"),
-       PINCTRL_PIN(DB8500_PIN_H4, "GPIO72_H4"),
-       PINCTRL_PIN(DB8500_PIN_H3, "GPIO73_H3"),
-       PINCTRL_PIN(DB8500_PIN_J3, "GPIO74_J3"),
-       PINCTRL_PIN(DB8500_PIN_H2, "GPIO75_H2"),
-       PINCTRL_PIN(DB8500_PIN_J2, "GPIO76_J2"),
-       PINCTRL_PIN(DB8500_PIN_H1, "GPIO77_H1"),
-       PINCTRL_PIN(DB8500_PIN_F4, "GPIO78_F4"),
-       PINCTRL_PIN(DB8500_PIN_E3, "GPIO79_E3"),
-       PINCTRL_PIN(DB8500_PIN_E4, "GPIO80_E4"),
-       PINCTRL_PIN(DB8500_PIN_D2, "GPIO81_D2"),
-       PINCTRL_PIN(DB8500_PIN_C1, "GPIO82_C1"),
-       PINCTRL_PIN(DB8500_PIN_D3, "GPIO83_D3"),
-       PINCTRL_PIN(DB8500_PIN_C2, "GPIO84_C2"),
-       PINCTRL_PIN(DB8500_PIN_D5, "GPIO85_D5"),
-       PINCTRL_PIN(DB8500_PIN_C6, "GPIO86_C6"),
-       PINCTRL_PIN(DB8500_PIN_B3, "GPIO87_B3"),
-       PINCTRL_PIN(DB8500_PIN_C4, "GPIO88_C4"),
-       PINCTRL_PIN(DB8500_PIN_E6, "GPIO89_E6"),
-       PINCTRL_PIN(DB8500_PIN_A3, "GPIO90_A3"),
-       PINCTRL_PIN(DB8500_PIN_B6, "GPIO91_B6"),
-       PINCTRL_PIN(DB8500_PIN_D6, "GPIO92_D6"),
-       PINCTRL_PIN(DB8500_PIN_B7, "GPIO93_B7"),
-       PINCTRL_PIN(DB8500_PIN_D7, "GPIO94_D7"),
-       PINCTRL_PIN(DB8500_PIN_E8, "GPIO95_E8"),
-       PINCTRL_PIN(DB8500_PIN_D8, "GPIO96_D8"),
-       PINCTRL_PIN(DB8500_PIN_D9, "GPIO97_D9"),
-       /* Hole */
-       PINCTRL_PIN(DB8500_PIN_A5, "GPIO128_A5"),
-       PINCTRL_PIN(DB8500_PIN_B4, "GPIO129_B4"),
-       PINCTRL_PIN(DB8500_PIN_C8, "GPIO130_C8"),
-       PINCTRL_PIN(DB8500_PIN_A12, "GPIO131_A12"),
-       PINCTRL_PIN(DB8500_PIN_C10, "GPIO132_C10"),
-       PINCTRL_PIN(DB8500_PIN_B10, "GPIO133_B10"),
-       PINCTRL_PIN(DB8500_PIN_B9, "GPIO134_B9"),
-       PINCTRL_PIN(DB8500_PIN_A9, "GPIO135_A9"),
-       PINCTRL_PIN(DB8500_PIN_C7, "GPIO136_C7"),
-       PINCTRL_PIN(DB8500_PIN_A7, "GPIO137_A7"),
-       PINCTRL_PIN(DB8500_PIN_C5, "GPIO138_C5"),
-       PINCTRL_PIN(DB8500_PIN_C9, "GPIO139_C9"),
-       PINCTRL_PIN(DB8500_PIN_B11, "GPIO140_B11"),
-       PINCTRL_PIN(DB8500_PIN_C12, "GPIO141_C12"),
-       PINCTRL_PIN(DB8500_PIN_C11, "GPIO142_C11"),
-       PINCTRL_PIN(DB8500_PIN_D12, "GPIO143_D12"),
-       PINCTRL_PIN(DB8500_PIN_B13, "GPIO144_B13"),
-       PINCTRL_PIN(DB8500_PIN_C13, "GPIO145_C13"),
-       PINCTRL_PIN(DB8500_PIN_D13, "GPIO146_D13"),
-       PINCTRL_PIN(DB8500_PIN_C15, "GPIO147_C15"),
-       PINCTRL_PIN(DB8500_PIN_B16, "GPIO148_B16"),
-       PINCTRL_PIN(DB8500_PIN_B14, "GPIO149_B14"),
-       PINCTRL_PIN(DB8500_PIN_C14, "GPIO150_C14"),
-       PINCTRL_PIN(DB8500_PIN_D17, "GPIO151_D17"),
-       PINCTRL_PIN(DB8500_PIN_D16, "GPIO152_D16"),
-       PINCTRL_PIN(DB8500_PIN_B17, "GPIO153_B17"),
-       PINCTRL_PIN(DB8500_PIN_C16, "GPIO154_C16"),
-       PINCTRL_PIN(DB8500_PIN_C19, "GPIO155_C19"),
-       PINCTRL_PIN(DB8500_PIN_C17, "GPIO156_C17"),
-       PINCTRL_PIN(DB8500_PIN_A18, "GPIO157_A18"),
-       PINCTRL_PIN(DB8500_PIN_C18, "GPIO158_C18"),
-       PINCTRL_PIN(DB8500_PIN_B19, "GPIO159_B19"),
-       PINCTRL_PIN(DB8500_PIN_B20, "GPIO160_B20"),
-       PINCTRL_PIN(DB8500_PIN_D21, "GPIO161_D21"),
-       PINCTRL_PIN(DB8500_PIN_D20, "GPIO162_D20"),
-       PINCTRL_PIN(DB8500_PIN_C20, "GPIO163_C20"),
-       PINCTRL_PIN(DB8500_PIN_B21, "GPIO164_B21"),
-       PINCTRL_PIN(DB8500_PIN_C21, "GPIO165_C21"),
-       PINCTRL_PIN(DB8500_PIN_A22, "GPIO166_A22"),
-       PINCTRL_PIN(DB8500_PIN_B24, "GPIO167_B24"),
-       PINCTRL_PIN(DB8500_PIN_C22, "GPIO168_C22"),
-       PINCTRL_PIN(DB8500_PIN_D22, "GPIO169_D22"),
-       PINCTRL_PIN(DB8500_PIN_C23, "GPIO170_C23"),
-       PINCTRL_PIN(DB8500_PIN_D23, "GPIO171_D23"),
-       /* Hole */
-       PINCTRL_PIN(DB8500_PIN_AJ27, "GPIO192_AJ27"),
-       PINCTRL_PIN(DB8500_PIN_AH27, "GPIO193_AH27"),
-       PINCTRL_PIN(DB8500_PIN_AF27, "GPIO194_AF27"),
-       PINCTRL_PIN(DB8500_PIN_AG28, "GPIO195_AG28"),
-       PINCTRL_PIN(DB8500_PIN_AG26, "GPIO196_AG26"),
-       PINCTRL_PIN(DB8500_PIN_AH24, "GPIO197_AH24"),
-       PINCTRL_PIN(DB8500_PIN_AG25, "GPIO198_AG25"),
-       PINCTRL_PIN(DB8500_PIN_AH23, "GPIO199_AH23"),
-       PINCTRL_PIN(DB8500_PIN_AH26, "GPIO200_AH26"),
-       PINCTRL_PIN(DB8500_PIN_AF24, "GPIO201_AF24"),
-       PINCTRL_PIN(DB8500_PIN_AF25, "GPIO202_AF25"),
-       PINCTRL_PIN(DB8500_PIN_AE23, "GPIO203_AE23"),
-       PINCTRL_PIN(DB8500_PIN_AF23, "GPIO204_AF23"),
-       PINCTRL_PIN(DB8500_PIN_AG23, "GPIO205_AG23"),
-       PINCTRL_PIN(DB8500_PIN_AG24, "GPIO206_AG24"),
-       PINCTRL_PIN(DB8500_PIN_AJ23, "GPIO207_AJ23"),
-       PINCTRL_PIN(DB8500_PIN_AH16, "GPIO208_AH16"),
-       PINCTRL_PIN(DB8500_PIN_AG15, "GPIO209_AG15"),
-       PINCTRL_PIN(DB8500_PIN_AJ15, "GPIO210_AJ15"),
-       PINCTRL_PIN(DB8500_PIN_AG14, "GPIO211_AG14"),
-       PINCTRL_PIN(DB8500_PIN_AF13, "GPIO212_AF13"),
-       PINCTRL_PIN(DB8500_PIN_AG13, "GPIO213_AG13"),
-       PINCTRL_PIN(DB8500_PIN_AH15, "GPIO214_AH15"),
-       PINCTRL_PIN(DB8500_PIN_AH13, "GPIO215_AH13"),
-       PINCTRL_PIN(DB8500_PIN_AG12, "GPIO216_AG12"),
-       PINCTRL_PIN(DB8500_PIN_AH12, "GPIO217_AH12"),
-       PINCTRL_PIN(DB8500_PIN_AH11, "GPIO218_AH11"),
-       PINCTRL_PIN(DB8500_PIN_AG10, "GPIO219_AG10"),
-       PINCTRL_PIN(DB8500_PIN_AH10, "GPIO220_AH10"),
-       PINCTRL_PIN(DB8500_PIN_AJ11, "GPIO221_AJ11"),
-       PINCTRL_PIN(DB8500_PIN_AJ9, "GPIO222_AJ9"),
-       PINCTRL_PIN(DB8500_PIN_AH9, "GPIO223_AH9"),
-       PINCTRL_PIN(DB8500_PIN_AG9, "GPIO224_AG9"),
-       PINCTRL_PIN(DB8500_PIN_AG8, "GPIO225_AG8"),
-       PINCTRL_PIN(DB8500_PIN_AF8, "GPIO226_AF8"),
-       PINCTRL_PIN(DB8500_PIN_AH7, "GPIO227_AH7"),
-       PINCTRL_PIN(DB8500_PIN_AJ6, "GPIO228_AJ6"),
-       PINCTRL_PIN(DB8500_PIN_AG7, "GPIO229_AG7"),
-       PINCTRL_PIN(DB8500_PIN_AF7, "GPIO230_AF7"),
-       /* Hole */
-       PINCTRL_PIN(DB8500_PIN_AF28, "GPIO256_AF28"),
-       PINCTRL_PIN(DB8500_PIN_AE29, "GPIO257_AE29"),
-       PINCTRL_PIN(DB8500_PIN_AD29, "GPIO258_AD29"),
-       PINCTRL_PIN(DB8500_PIN_AC29, "GPIO259_AC29"),
-       PINCTRL_PIN(DB8500_PIN_AD28, "GPIO260_AD28"),
-       PINCTRL_PIN(DB8500_PIN_AD26, "GPIO261_AD26"),
-       PINCTRL_PIN(DB8500_PIN_AE26, "GPIO262_AE26"),
-       PINCTRL_PIN(DB8500_PIN_AG29, "GPIO263_AG29"),
-       PINCTRL_PIN(DB8500_PIN_AE27, "GPIO264_AE27"),
-       PINCTRL_PIN(DB8500_PIN_AD27, "GPIO265_AD27"),
-       PINCTRL_PIN(DB8500_PIN_AC28, "GPIO266_AC28"),
-       PINCTRL_PIN(DB8500_PIN_AC27, "GPIO267_AC27"),
-};
-
-#define DB8500_GPIO_RANGE(a, b, c) { .name = "DB8500", .id = a, .base = b, \
-                       .pin_base = b, .npins = c }
-
-/*
- * This matches the 32-pin gpio chips registered by the GPIO portion. This
- * cannot be const since we assign the struct gpio_chip * pointer at runtime.
- */
-static struct pinctrl_gpio_range nmk_db8500_ranges[] = {
-       DB8500_GPIO_RANGE(0, 0, 32),
-       DB8500_GPIO_RANGE(1, 32, 5),
-       DB8500_GPIO_RANGE(2, 64, 32),
-       DB8500_GPIO_RANGE(3, 96, 2),
-       DB8500_GPIO_RANGE(4, 128, 32),
-       DB8500_GPIO_RANGE(5, 160, 12),
-       DB8500_GPIO_RANGE(6, 192, 32),
-       DB8500_GPIO_RANGE(7, 224, 7),
-       DB8500_GPIO_RANGE(8, 256, 12),
-};
-
-/*
- * Read the pin group names like this:
- * u0_a_1    = first groups of pins for uart0 on alt function a
- * i2c2_b_2  = second group of pins for i2c2 on alt function b
- *
- * The groups are arranged as sets per altfunction column, so we can
- * mux in one group at a time by selecting the same altfunction for them
- * all. When functions require pins on different altfunctions, you need
- * to combine several groups.
- */
-
-/* Altfunction A column */
-static const unsigned u0_a_1_pins[] = { DB8500_PIN_AJ5, DB8500_PIN_AJ3,
-                                       DB8500_PIN_AH4, DB8500_PIN_AH3 };
-static const unsigned u1rxtx_a_1_pins[] = { DB8500_PIN_AH6, DB8500_PIN_AG6 };
-static const unsigned u1ctsrts_a_1_pins[] = { DB8500_PIN_AF6, DB8500_PIN_AG5 };
-/* Image processor I2C line, this is driven by image processor firmware */
-static const unsigned ipi2c_a_1_pins[] = { DB8500_PIN_AD5, DB8500_PIN_AE4 };
-static const unsigned ipi2c_a_2_pins[] = { DB8500_PIN_AF5, DB8500_PIN_AG4 };
-/* MSP0 can only be on these pins, but TXD and RXD can be flipped */
-static const unsigned msp0txrx_a_1_pins[] = { DB8500_PIN_AC4, DB8500_PIN_AC3 };
-static const unsigned msp0tfstck_a_1_pins[] = { DB8500_PIN_AF3, DB8500_PIN_AE3 };
-static const unsigned msp0rfsrck_a_1_pins[] = { DB8500_PIN_AD3, DB8500_PIN_AD4 };
-/* Basic pins of the MMC/SD card 0 interface */
-static const unsigned mc0_a_1_pins[] = { DB8500_PIN_AC2, DB8500_PIN_AC1,
-       DB8500_PIN_AB4, DB8500_PIN_AA3, DB8500_PIN_AA4, DB8500_PIN_AB2,
-       DB8500_PIN_Y4, DB8500_PIN_Y2, DB8500_PIN_AA2, DB8500_PIN_AA1 };
-/* Often only 4 bits are used, then these are not needed (only used for MMC) */
-static const unsigned mc0_dat47_a_1_pins[] = { DB8500_PIN_W2, DB8500_PIN_W3,
-       DB8500_PIN_V3, DB8500_PIN_V2};
-static const unsigned mc0dat31dir_a_1_pins[] = { DB8500_PIN_AB3 };
-/* MSP1 can only be on these pins, but TXD and RXD can be flipped */
-static const unsigned msp1txrx_a_1_pins[] = { DB8500_PIN_AF2, DB8500_PIN_AG2 };
-static const unsigned msp1_a_1_pins[] = { DB8500_PIN_AE1, DB8500_PIN_AE2 };
-/* LCD interface */
-static const unsigned lcdb_a_1_pins[] = { DB8500_PIN_F3, DB8500_PIN_F1,
-                                         DB8500_PIN_G3, DB8500_PIN_G2 };
-static const unsigned lcdvsi0_a_1_pins[] = { DB8500_PIN_E1 };
-static const unsigned lcdvsi1_a_1_pins[] = { DB8500_PIN_E2 };
-static const unsigned lcd_d0_d7_a_1_pins[] = {
-       DB8500_PIN_G5, DB8500_PIN_G4, DB8500_PIN_H4, DB8500_PIN_H3,
-       DB8500_PIN_J3, DB8500_PIN_H2, DB8500_PIN_J2, DB8500_PIN_H1 };
-/* D8 thru D11 often used as TVOUT lines */
-static const unsigned lcd_d8_d11_a_1_pins[] = { DB8500_PIN_F4,
-       DB8500_PIN_E3, DB8500_PIN_E4, DB8500_PIN_D2 };
-static const unsigned lcd_d12_d23_a_1_pins[] = {
-       DB8500_PIN_C1, DB8500_PIN_D3, DB8500_PIN_C2, DB8500_PIN_D5,
-       DB8500_PIN_C6, DB8500_PIN_B3, DB8500_PIN_C4, DB8500_PIN_E6,
-       DB8500_PIN_A3, DB8500_PIN_B6, DB8500_PIN_D6, DB8500_PIN_B7 };
-static const unsigned kp_a_1_pins[] = { DB8500_PIN_D7, DB8500_PIN_E8,
-       DB8500_PIN_D8, DB8500_PIN_D9 };
-static const unsigned kpskaskb_a_1_pins[] = { DB8500_PIN_D17, DB8500_PIN_D16 };
-static const unsigned kp_a_2_pins[] = {
-       DB8500_PIN_B17, DB8500_PIN_C16, DB8500_PIN_C19, DB8500_PIN_C17,
-       DB8500_PIN_A18, DB8500_PIN_C18, DB8500_PIN_B19, DB8500_PIN_B20,
-       DB8500_PIN_D21, DB8500_PIN_D20, DB8500_PIN_C20, DB8500_PIN_B21,
-       DB8500_PIN_C21, DB8500_PIN_A22, DB8500_PIN_B24, DB8500_PIN_C22 };
-/* MC2 has 8 data lines and no direction control, so only for (e)MMC */
-static const unsigned mc2_a_1_pins[] = { DB8500_PIN_A5, DB8500_PIN_B4,
-       DB8500_PIN_C8, DB8500_PIN_A12, DB8500_PIN_C10, DB8500_PIN_B10,
-       DB8500_PIN_B9, DB8500_PIN_A9, DB8500_PIN_C7, DB8500_PIN_A7,
-       DB8500_PIN_C5 };
-static const unsigned ssp1_a_1_pins[] = { DB8500_PIN_C9, DB8500_PIN_B11,
-                                         DB8500_PIN_C12, DB8500_PIN_C11 };
-static const unsigned ssp0_a_1_pins[] = { DB8500_PIN_D12, DB8500_PIN_B13,
-                                         DB8500_PIN_C13, DB8500_PIN_D13 };
-static const unsigned i2c0_a_1_pins[] = { DB8500_PIN_C15, DB8500_PIN_B16 };
-/*
- * Image processor GPIO pins are named "ipgpio" and have their own
- * numberspace
- */
-static const unsigned ipgpio0_a_1_pins[] = { DB8500_PIN_B14 };
-static const unsigned ipgpio1_a_1_pins[] = { DB8500_PIN_C14 };
-/* Three modem pins named RF_PURn, MODEM_STATE and MODEM_PWREN */
-static const unsigned modem_a_1_pins[] = { DB8500_PIN_D22, DB8500_PIN_C23,
-                                          DB8500_PIN_D23 };
-/*
- * This MSP cannot switch RX and TX, SCK in a separate group since this
- * seems to be optional.
- */
-static const unsigned msp2sck_a_1_pins[] = { DB8500_PIN_AJ27 };
-static const unsigned msp2_a_1_pins[] = { DB8500_PIN_AH27, DB8500_PIN_AF27,
-                                         DB8500_PIN_AG28, DB8500_PIN_AG26 };
-static const unsigned mc4_a_1_pins[] = { DB8500_PIN_AH24, DB8500_PIN_AG25,
-       DB8500_PIN_AH23, DB8500_PIN_AH26, DB8500_PIN_AF24, DB8500_PIN_AF25,
-       DB8500_PIN_AE23, DB8500_PIN_AF23, DB8500_PIN_AG23, DB8500_PIN_AG24,
-       DB8500_PIN_AJ23 };
-/* MC1 has only 4 data pins, designed for SD or SDIO exclusively */
-static const unsigned mc1_a_1_pins[] = { DB8500_PIN_AH16, DB8500_PIN_AG15,
-       DB8500_PIN_AJ15, DB8500_PIN_AG14, DB8500_PIN_AF13, DB8500_PIN_AG13,
-       DB8500_PIN_AH15 };
-static const unsigned mc1_a_2_pins[] = { DB8500_PIN_AH16, DB8500_PIN_AJ15,
-       DB8500_PIN_AG14, DB8500_PIN_AF13, DB8500_PIN_AG13, DB8500_PIN_AH15 };
-static const unsigned mc1dir_a_1_pins[] = { DB8500_PIN_AH13, DB8500_PIN_AG12,
-       DB8500_PIN_AH12, DB8500_PIN_AH11 };
-static const unsigned hsir_a_1_pins[] = { DB8500_PIN_AG10, DB8500_PIN_AH10,
-       DB8500_PIN_AJ11 };
-static const unsigned hsit_a_1_pins[] = { DB8500_PIN_AJ9, DB8500_PIN_AH9,
-       DB8500_PIN_AG9, DB8500_PIN_AG8, DB8500_PIN_AF8 };
-static const unsigned hsit_a_2_pins[] = { DB8500_PIN_AJ9, DB8500_PIN_AH9,
-       DB8500_PIN_AG9, DB8500_PIN_AG8 };
-static const unsigned clkout1_a_1_pins[] = { DB8500_PIN_AH7 };
-static const unsigned clkout1_a_2_pins[] = { DB8500_PIN_AG7 };
-static const unsigned clkout2_a_1_pins[] = { DB8500_PIN_AJ6 };
-static const unsigned clkout2_a_2_pins[] = { DB8500_PIN_AF7 };
-static const unsigned usb_a_1_pins[] = { DB8500_PIN_AF28, DB8500_PIN_AE29,
-       DB8500_PIN_AD29, DB8500_PIN_AC29, DB8500_PIN_AD28, DB8500_PIN_AD26,
-       DB8500_PIN_AE26, DB8500_PIN_AG29, DB8500_PIN_AE27, DB8500_PIN_AD27,
-       DB8500_PIN_AC28, DB8500_PIN_AC27 };
-
-/* Altfunction B column */
-static const unsigned trig_b_1_pins[] = { DB8500_PIN_AJ5, DB8500_PIN_AJ3 };
-static const unsigned i2c4_b_1_pins[] = { DB8500_PIN_AH6, DB8500_PIN_AG6 };
-static const unsigned i2c1_b_1_pins[] = { DB8500_PIN_AF6, DB8500_PIN_AG5 };
-static const unsigned i2c2_b_1_pins[] = { DB8500_PIN_AD5, DB8500_PIN_AE4 };
-static const unsigned i2c2_b_2_pins[] = { DB8500_PIN_AF5, DB8500_PIN_AG4 };
-static const unsigned msp0txrx_b_1_pins[] = { DB8500_PIN_AC4, DB8500_PIN_AC3 };
-static const unsigned i2c1_b_2_pins[] = { DB8500_PIN_AD3, DB8500_PIN_AD4 };
-/* Just RX and TX for UART2 */
-static const unsigned u2rxtx_b_1_pins[] = { DB8500_PIN_AC2, DB8500_PIN_AC1 };
-static const unsigned uartmodtx_b_1_pins[] = { DB8500_PIN_AB4 };
-static const unsigned msp0sck_b_1_pins[] = { DB8500_PIN_AB3 };
-static const unsigned uartmodrx_b_1_pins[] = { DB8500_PIN_AA3 };
-static const unsigned stmmod_b_1_pins[] = { DB8500_PIN_AA4, DB8500_PIN_Y4,
-       DB8500_PIN_Y2, DB8500_PIN_AA2, DB8500_PIN_AA1 };
-static const unsigned uartmodrx_b_2_pins[] = { DB8500_PIN_AB2 };
-static const unsigned spi3_b_1_pins[] = { DB8500_PIN_W2, DB8500_PIN_W3,
-                                         DB8500_PIN_V3, DB8500_PIN_V2 };
-static const unsigned msp1txrx_b_1_pins[] = { DB8500_PIN_AF2, DB8500_PIN_AG2 };
-static const unsigned kp_b_1_pins[] = { DB8500_PIN_F3, DB8500_PIN_F1,
-       DB8500_PIN_G3, DB8500_PIN_G2, DB8500_PIN_E1, DB8500_PIN_E2,
-       DB8500_PIN_G5, DB8500_PIN_G4, DB8500_PIN_H4, DB8500_PIN_H3,
-       DB8500_PIN_J3, DB8500_PIN_H2, DB8500_PIN_J2, DB8500_PIN_H1,
-       DB8500_PIN_F4, DB8500_PIN_E3, DB8500_PIN_E4, DB8500_PIN_D2,
-       DB8500_PIN_C1, DB8500_PIN_D3, DB8500_PIN_C2, DB8500_PIN_D5 };
-static const unsigned kp_b_2_pins[] = { DB8500_PIN_F3, DB8500_PIN_F1,
-       DB8500_PIN_G3, DB8500_PIN_G2, DB8500_PIN_F4, DB8500_PIN_E3};
-static const unsigned sm_b_1_pins[] = { DB8500_PIN_C6, DB8500_PIN_B3,
-       DB8500_PIN_C4, DB8500_PIN_E6, DB8500_PIN_A3, DB8500_PIN_B6,
-       DB8500_PIN_D6, DB8500_PIN_B7, DB8500_PIN_D7, DB8500_PIN_D8,
-       DB8500_PIN_D9, DB8500_PIN_A5, DB8500_PIN_B4, DB8500_PIN_C8,
-       DB8500_PIN_A12, DB8500_PIN_C10, DB8500_PIN_B10, DB8500_PIN_B9,
-       DB8500_PIN_A9, DB8500_PIN_C7, DB8500_PIN_A7, DB8500_PIN_C5,
-       DB8500_PIN_C9 };
-/* This chip select pin can be "ps0" in alt C so have it separately */
-static const unsigned smcs0_b_1_pins[] = { DB8500_PIN_E8 };
-/* This chip select pin can be "ps1" in alt C so have it separately */
-static const unsigned smcs1_b_1_pins[] = { DB8500_PIN_B14 };
-static const unsigned ipgpio7_b_1_pins[] = { DB8500_PIN_B11 };
-static const unsigned ipgpio2_b_1_pins[] = { DB8500_PIN_C12 };
-static const unsigned ipgpio3_b_1_pins[] = { DB8500_PIN_C11 };
-static const unsigned lcdaclk_b_1_pins[] = { DB8500_PIN_C14 };
-static const unsigned lcda_b_1_pins[] = { DB8500_PIN_D22,
-       DB8500_PIN_C23, DB8500_PIN_D23 };
-static const unsigned lcd_b_1_pins[] = { DB8500_PIN_D17, DB8500_PIN_D16,
-       DB8500_PIN_B17, DB8500_PIN_C16, DB8500_PIN_C19, DB8500_PIN_C17,
-       DB8500_PIN_A18, DB8500_PIN_C18, DB8500_PIN_B19, DB8500_PIN_B20,
-       DB8500_PIN_D21, DB8500_PIN_D20, DB8500_PIN_C20, DB8500_PIN_B21,
-       DB8500_PIN_C21, DB8500_PIN_A22, DB8500_PIN_B24, DB8500_PIN_C22 };
-static const unsigned ddrtrig_b_1_pins[] = { DB8500_PIN_AJ27 };
-static const unsigned pwl_b_1_pins[] = { DB8500_PIN_AF25 };
-static const unsigned spi1_b_1_pins[] = { DB8500_PIN_AG15, DB8500_PIN_AF13,
-                                         DB8500_PIN_AG13, DB8500_PIN_AH15 };
-static const unsigned mc3_b_1_pins[] = { DB8500_PIN_AH13, DB8500_PIN_AG12,
-       DB8500_PIN_AH12, DB8500_PIN_AH11, DB8500_PIN_AG10, DB8500_PIN_AH10,
-       DB8500_PIN_AJ11, DB8500_PIN_AJ9, DB8500_PIN_AH9, DB8500_PIN_AG9,
-       DB8500_PIN_AG8 };
-static const unsigned pwl_b_2_pins[] = { DB8500_PIN_AF8 };
-static const unsigned pwl_b_3_pins[] = { DB8500_PIN_AG7 };
-static const unsigned pwl_b_4_pins[] = { DB8500_PIN_AF7 };
-
-/* Altfunction C column */
-static const unsigned ipjtag_c_1_pins[] = { DB8500_PIN_AJ5, DB8500_PIN_AJ3,
-       DB8500_PIN_AH4, DB8500_PIN_AH3, DB8500_PIN_AH6 };
-static const unsigned ipgpio6_c_1_pins[] = { DB8500_PIN_AG6 };
-static const unsigned ipgpio0_c_1_pins[] = { DB8500_PIN_AF6 };
-static const unsigned ipgpio1_c_1_pins[] = { DB8500_PIN_AG5 };
-static const unsigned ipgpio3_c_1_pins[] = { DB8500_PIN_AF5 };
-static const unsigned ipgpio2_c_1_pins[] = { DB8500_PIN_AG4 };
-static const unsigned slim0_c_1_pins[] = { DB8500_PIN_AD3, DB8500_PIN_AD4 };
-/* Optional 4-bit Memory Stick interface */
-static const unsigned ms_c_1_pins[] = { DB8500_PIN_AC2, DB8500_PIN_AC1,
-       DB8500_PIN_AB3, DB8500_PIN_AA3, DB8500_PIN_AA4, DB8500_PIN_AB2,
-       DB8500_PIN_Y4, DB8500_PIN_Y2, DB8500_PIN_AA2, DB8500_PIN_AA1 };
-static const unsigned iptrigout_c_1_pins[] = { DB8500_PIN_AB4 };
-static const unsigned u2rxtx_c_1_pins[] = { DB8500_PIN_W2, DB8500_PIN_W3 };
-static const unsigned u2ctsrts_c_1_pins[] = { DB8500_PIN_V3, DB8500_PIN_V2 };
-static const unsigned u0_c_1_pins[] = { DB8500_PIN_AF2, DB8500_PIN_AE1,
-                                       DB8500_PIN_AE2, DB8500_PIN_AG2 };
-static const unsigned ipgpio4_c_1_pins[] = { DB8500_PIN_F3 };
-static const unsigned ipgpio5_c_1_pins[] = { DB8500_PIN_F1 };
-static const unsigned ipgpio6_c_2_pins[] = { DB8500_PIN_G3 };
-static const unsigned ipgpio7_c_1_pins[] = { DB8500_PIN_G2 };
-static const unsigned smcleale_c_1_pins[] = { DB8500_PIN_E1, DB8500_PIN_E2 };
-static const unsigned stmape_c_1_pins[] = { DB8500_PIN_G5, DB8500_PIN_G4,
-       DB8500_PIN_H4, DB8500_PIN_H3, DB8500_PIN_J3 };
-static const unsigned u2rxtx_c_2_pins[] = { DB8500_PIN_H2, DB8500_PIN_J2 };
-static const unsigned ipgpio2_c_2_pins[] = { DB8500_PIN_F4 };
-static const unsigned ipgpio3_c_2_pins[] = { DB8500_PIN_E3 };
-static const unsigned ipgpio4_c_2_pins[] = { DB8500_PIN_E4 };
-static const unsigned ipgpio5_c_2_pins[] = { DB8500_PIN_D2 };
-static const unsigned mc5_c_1_pins[] = { DB8500_PIN_C6, DB8500_PIN_B3,
-       DB8500_PIN_C4, DB8500_PIN_E6, DB8500_PIN_A3, DB8500_PIN_B6,
-       DB8500_PIN_D6, DB8500_PIN_B7, DB8500_PIN_D7, DB8500_PIN_D8,
-       DB8500_PIN_D9 };
-static const unsigned mc2rstn_c_1_pins[] = { DB8500_PIN_C8 };
-static const unsigned kp_c_1_pins[] = { DB8500_PIN_C9, DB8500_PIN_B11,
-       DB8500_PIN_C12, DB8500_PIN_C11, DB8500_PIN_D17, DB8500_PIN_D16,
-       DB8500_PIN_C23, DB8500_PIN_D23 };
-static const unsigned smps0_c_1_pins[] = { DB8500_PIN_E8 };
-static const unsigned smps1_c_1_pins[] = { DB8500_PIN_B14 };
-static const unsigned u2rxtx_c_3_pins[] = { DB8500_PIN_B17, DB8500_PIN_C16 };
-static const unsigned stmape_c_2_pins[] = { DB8500_PIN_C19, DB8500_PIN_C17,
-       DB8500_PIN_A18, DB8500_PIN_C18, DB8500_PIN_B19 };
-static const unsigned uartmodrx_c_1_pins[] = { DB8500_PIN_D21 };
-static const unsigned uartmodtx_c_1_pins[] = { DB8500_PIN_D20 };
-static const unsigned stmmod_c_1_pins[] = { DB8500_PIN_C20, DB8500_PIN_B21,
-       DB8500_PIN_C21, DB8500_PIN_A22, DB8500_PIN_B24 };
-static const unsigned usbsim_c_1_pins[] = { DB8500_PIN_D22 };
-static const unsigned mc4rstn_c_1_pins[] = { DB8500_PIN_AF25 };
-static const unsigned clkout1_c_1_pins[] = { DB8500_PIN_AH13 };
-static const unsigned clkout2_c_1_pins[] = { DB8500_PIN_AH12 };
-static const unsigned i2c3_c_1_pins[] = { DB8500_PIN_AG12, DB8500_PIN_AH11 };
-static const unsigned spi0_c_1_pins[] = { DB8500_PIN_AH10, DB8500_PIN_AH9,
-                                         DB8500_PIN_AG9, DB8500_PIN_AG8 };
-static const unsigned usbsim_c_2_pins[] = { DB8500_PIN_AF8 };
-static const unsigned i2c3_c_2_pins[] = { DB8500_PIN_AG7, DB8500_PIN_AF7 };
-
-/* Other C1 column */
-static const unsigned u2rx_oc1_1_pins[] = { DB8500_PIN_AB2 };
-static const unsigned stmape_oc1_1_pins[] = { DB8500_PIN_AA4, DB8500_PIN_Y4,
-       DB8500_PIN_Y2, DB8500_PIN_AA2, DB8500_PIN_AA1 };
-static const unsigned remap0_oc1_1_pins[] = { DB8500_PIN_E1 };
-static const unsigned remap1_oc1_1_pins[] = { DB8500_PIN_E2 };
-static const unsigned ptma9_oc1_1_pins[] = { DB8500_PIN_G5, DB8500_PIN_G4,
-       DB8500_PIN_H4, DB8500_PIN_H3, DB8500_PIN_J3, DB8500_PIN_H2,
-       DB8500_PIN_J2, DB8500_PIN_H1 };
-static const unsigned kp_oc1_1_pins[] = { DB8500_PIN_C6, DB8500_PIN_B3,
-       DB8500_PIN_C4, DB8500_PIN_E6, DB8500_PIN_A3, DB8500_PIN_B6,
-       DB8500_PIN_D6, DB8500_PIN_B7 };
-static const unsigned rf_oc1_1_pins[] = { DB8500_PIN_D8, DB8500_PIN_D9 };
-static const unsigned hxclk_oc1_1_pins[] = { DB8500_PIN_D16 };
-static const unsigned uartmodrx_oc1_1_pins[] = { DB8500_PIN_B17 };
-static const unsigned uartmodtx_oc1_1_pins[] = { DB8500_PIN_C16 };
-static const unsigned stmmod_oc1_1_pins[] = { DB8500_PIN_C19, DB8500_PIN_C17,
-       DB8500_PIN_A18, DB8500_PIN_C18, DB8500_PIN_B19 };
-static const unsigned hxgpio_oc1_1_pins[] = { DB8500_PIN_D21, DB8500_PIN_D20,
-       DB8500_PIN_C20, DB8500_PIN_B21, DB8500_PIN_C21, DB8500_PIN_A22,
-       DB8500_PIN_B24, DB8500_PIN_C22 };
-static const unsigned rf_oc1_2_pins[] = { DB8500_PIN_C23, DB8500_PIN_D23 };
-static const unsigned spi2_oc1_1_pins[] = { DB8500_PIN_AH13, DB8500_PIN_AG12,
-       DB8500_PIN_AH12, DB8500_PIN_AH11 };
-static const unsigned spi2_oc1_2_pins[] = { DB8500_PIN_AH13, DB8500_PIN_AH12,
-       DB8500_PIN_AH11 };
-
-/* Other C2 column */
-static const unsigned sbag_oc2_1_pins[] = { DB8500_PIN_AA4, DB8500_PIN_AB2,
-       DB8500_PIN_Y4, DB8500_PIN_Y2, DB8500_PIN_AA2, DB8500_PIN_AA1 };
-static const unsigned etmr4_oc2_1_pins[] = { DB8500_PIN_G5, DB8500_PIN_G4,
-       DB8500_PIN_H4, DB8500_PIN_H3, DB8500_PIN_J3, DB8500_PIN_H2,
-       DB8500_PIN_J2, DB8500_PIN_H1 };
-static const unsigned ptma9_oc2_1_pins[] = { DB8500_PIN_D17, DB8500_PIN_D16,
-       DB8500_PIN_B17, DB8500_PIN_C16, DB8500_PIN_C19, DB8500_PIN_C17,
-       DB8500_PIN_A18, DB8500_PIN_C18, DB8500_PIN_B19, DB8500_PIN_B20,
-       DB8500_PIN_D21, DB8500_PIN_D20, DB8500_PIN_C20, DB8500_PIN_B21,
-       DB8500_PIN_C21, DB8500_PIN_A22, DB8500_PIN_B24, DB8500_PIN_C22 };
-
-/* Other C3 column */
-static const unsigned stmmod_oc3_1_pins[] = { DB8500_PIN_AB2, DB8500_PIN_W2,
-       DB8500_PIN_W3, DB8500_PIN_V3, DB8500_PIN_V2 };
-static const unsigned stmmod_oc3_2_pins[] = { DB8500_PIN_G5, DB8500_PIN_G4,
-       DB8500_PIN_H4, DB8500_PIN_H3, DB8500_PIN_J3 };
-static const unsigned uartmodrx_oc3_1_pins[] = { DB8500_PIN_H2 };
-static const unsigned uartmodtx_oc3_1_pins[] = { DB8500_PIN_J2 };
-static const unsigned etmr4_oc3_1_pins[] = { DB8500_PIN_D17, DB8500_PIN_D16,
-       DB8500_PIN_B17, DB8500_PIN_C16, DB8500_PIN_C19, DB8500_PIN_C17,
-       DB8500_PIN_A18, DB8500_PIN_C18, DB8500_PIN_B19, DB8500_PIN_B20,
-       DB8500_PIN_D21, DB8500_PIN_D20, DB8500_PIN_C20, DB8500_PIN_B21,
-       DB8500_PIN_C21, DB8500_PIN_A22, DB8500_PIN_B24, DB8500_PIN_C22 };
-
-/* Other C4 column */
-static const unsigned sbag_oc4_1_pins[] = { DB8500_PIN_G5, DB8500_PIN_G4,
-       DB8500_PIN_H4, DB8500_PIN_H3, DB8500_PIN_J3, DB8500_PIN_H1 };
-static const unsigned hwobs_oc4_1_pins[] = { DB8500_PIN_D17, DB8500_PIN_D16,
-       DB8500_PIN_B17, DB8500_PIN_C16, DB8500_PIN_C19, DB8500_PIN_C17,
-       DB8500_PIN_A18, DB8500_PIN_C18, DB8500_PIN_B19, DB8500_PIN_B20,
-       DB8500_PIN_D21, DB8500_PIN_D20, DB8500_PIN_C20, DB8500_PIN_B21,
-       DB8500_PIN_C21, DB8500_PIN_A22, DB8500_PIN_B24, DB8500_PIN_C22 };
-
-#define DB8500_PIN_GROUP(a, b) { .name = #a, .pins = a##_pins,         \
-                       .npins = ARRAY_SIZE(a##_pins), .altsetting = b }
-
-static const struct nmk_pingroup nmk_db8500_groups[] = {
-       /* Altfunction A column */
-       DB8500_PIN_GROUP(u0_a_1, NMK_GPIO_ALT_A),
-       DB8500_PIN_GROUP(u1rxtx_a_1, NMK_GPIO_ALT_A),
-       DB8500_PIN_GROUP(u1ctsrts_a_1, NMK_GPIO_ALT_A),
-       DB8500_PIN_GROUP(ipi2c_a_1, NMK_GPIO_ALT_A),
-       DB8500_PIN_GROUP(ipi2c_a_2, NMK_GPIO_ALT_A),
-       DB8500_PIN_GROUP(msp0txrx_a_1, NMK_GPIO_ALT_A),
-       DB8500_PIN_GROUP(msp0tfstck_a_1, NMK_GPIO_ALT_A),
-       DB8500_PIN_GROUP(msp0rfsrck_a_1, NMK_GPIO_ALT_A),
-       DB8500_PIN_GROUP(mc0_a_1, NMK_GPIO_ALT_A),
-       DB8500_PIN_GROUP(mc0_dat47_a_1, NMK_GPIO_ALT_A),
-       DB8500_PIN_GROUP(mc0dat31dir_a_1, NMK_GPIO_ALT_A),
-       DB8500_PIN_GROUP(msp1txrx_a_1, NMK_GPIO_ALT_A),
-       DB8500_PIN_GROUP(msp1_a_1, NMK_GPIO_ALT_A),
-       DB8500_PIN_GROUP(lcdb_a_1, NMK_GPIO_ALT_A),
-       DB8500_PIN_GROUP(lcdvsi0_a_1, NMK_GPIO_ALT_A),
-       DB8500_PIN_GROUP(lcdvsi1_a_1, NMK_GPIO_ALT_A),
-       DB8500_PIN_GROUP(lcd_d0_d7_a_1, NMK_GPIO_ALT_A),
-       DB8500_PIN_GROUP(lcd_d8_d11_a_1, NMK_GPIO_ALT_A),
-       DB8500_PIN_GROUP(lcd_d12_d23_a_1, NMK_GPIO_ALT_A),
-       DB8500_PIN_GROUP(kp_a_1, NMK_GPIO_ALT_A),
-       DB8500_PIN_GROUP(mc2_a_1, NMK_GPIO_ALT_A),
-       DB8500_PIN_GROUP(ssp1_a_1, NMK_GPIO_ALT_A),
-       DB8500_PIN_GROUP(ssp0_a_1, NMK_GPIO_ALT_A),
-       DB8500_PIN_GROUP(i2c0_a_1, NMK_GPIO_ALT_A),
-       DB8500_PIN_GROUP(ipgpio0_a_1, NMK_GPIO_ALT_A),
-       DB8500_PIN_GROUP(ipgpio1_a_1, NMK_GPIO_ALT_A),
-       DB8500_PIN_GROUP(kp_a_2, NMK_GPIO_ALT_A),
-       DB8500_PIN_GROUP(msp2sck_a_1, NMK_GPIO_ALT_A),
-       DB8500_PIN_GROUP(msp2_a_1, NMK_GPIO_ALT_A),
-       DB8500_PIN_GROUP(mc4_a_1, NMK_GPIO_ALT_A),
-       DB8500_PIN_GROUP(mc1_a_1, NMK_GPIO_ALT_A),
-       DB8500_PIN_GROUP(mc1_a_2, NMK_GPIO_ALT_A),
-       DB8500_PIN_GROUP(hsir_a_1, NMK_GPIO_ALT_A),
-       DB8500_PIN_GROUP(hsit_a_1, NMK_GPIO_ALT_A),
-       DB8500_PIN_GROUP(hsit_a_2, NMK_GPIO_ALT_A),
-       DB8500_PIN_GROUP(clkout1_a_1, NMK_GPIO_ALT_A),
-       DB8500_PIN_GROUP(clkout1_a_2, NMK_GPIO_ALT_A),
-       DB8500_PIN_GROUP(clkout2_a_1, NMK_GPIO_ALT_A),
-       DB8500_PIN_GROUP(clkout2_a_2, NMK_GPIO_ALT_A),
-       DB8500_PIN_GROUP(usb_a_1, NMK_GPIO_ALT_A),
-       /* Altfunction B column */
-       DB8500_PIN_GROUP(trig_b_1, NMK_GPIO_ALT_B),
-       DB8500_PIN_GROUP(i2c4_b_1, NMK_GPIO_ALT_B),
-       DB8500_PIN_GROUP(i2c1_b_1, NMK_GPIO_ALT_B),
-       DB8500_PIN_GROUP(i2c2_b_1, NMK_GPIO_ALT_B),
-       DB8500_PIN_GROUP(i2c2_b_2, NMK_GPIO_ALT_B),
-       DB8500_PIN_GROUP(msp0txrx_b_1, NMK_GPIO_ALT_B),
-       DB8500_PIN_GROUP(i2c1_b_2, NMK_GPIO_ALT_B),
-       DB8500_PIN_GROUP(u2rxtx_b_1, NMK_GPIO_ALT_B),
-       DB8500_PIN_GROUP(uartmodtx_b_1, NMK_GPIO_ALT_B),
-       DB8500_PIN_GROUP(msp0sck_b_1, NMK_GPIO_ALT_B),
-       DB8500_PIN_GROUP(uartmodrx_b_1, NMK_GPIO_ALT_B),
-       DB8500_PIN_GROUP(stmmod_b_1, NMK_GPIO_ALT_B),
-       DB8500_PIN_GROUP(uartmodrx_b_2, NMK_GPIO_ALT_B),
-       DB8500_PIN_GROUP(spi3_b_1, NMK_GPIO_ALT_B),
-       DB8500_PIN_GROUP(msp1txrx_b_1, NMK_GPIO_ALT_B),
-       DB8500_PIN_GROUP(kp_b_1, NMK_GPIO_ALT_B),
-       DB8500_PIN_GROUP(kp_b_2, NMK_GPIO_ALT_B),
-       DB8500_PIN_GROUP(sm_b_1, NMK_GPIO_ALT_B),
-       DB8500_PIN_GROUP(smcs0_b_1, NMK_GPIO_ALT_B),
-       DB8500_PIN_GROUP(smcs1_b_1, NMK_GPIO_ALT_B),
-       DB8500_PIN_GROUP(ipgpio7_b_1, NMK_GPIO_ALT_B),
-       DB8500_PIN_GROUP(ipgpio2_b_1, NMK_GPIO_ALT_B),
-       DB8500_PIN_GROUP(ipgpio3_b_1, NMK_GPIO_ALT_B),
-       DB8500_PIN_GROUP(lcdaclk_b_1, NMK_GPIO_ALT_B),
-       DB8500_PIN_GROUP(lcda_b_1, NMK_GPIO_ALT_B),
-       DB8500_PIN_GROUP(lcd_b_1, NMK_GPIO_ALT_B),
-       DB8500_PIN_GROUP(ddrtrig_b_1, NMK_GPIO_ALT_B),
-       DB8500_PIN_GROUP(pwl_b_1, NMK_GPIO_ALT_B),
-       DB8500_PIN_GROUP(spi1_b_1, NMK_GPIO_ALT_B),
-       DB8500_PIN_GROUP(mc3_b_1, NMK_GPIO_ALT_B),
-       DB8500_PIN_GROUP(pwl_b_2, NMK_GPIO_ALT_B),
-       DB8500_PIN_GROUP(pwl_b_3, NMK_GPIO_ALT_B),
-       DB8500_PIN_GROUP(pwl_b_4, NMK_GPIO_ALT_B),
-       /* Altfunction C column */
-       DB8500_PIN_GROUP(ipjtag_c_1, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(ipgpio6_c_1, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(ipgpio0_c_1, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(ipgpio1_c_1, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(ipgpio3_c_1, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(ipgpio2_c_1, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(slim0_c_1, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(ms_c_1, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(iptrigout_c_1, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(u2rxtx_c_1, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(u2ctsrts_c_1, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(u0_c_1, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(ipgpio4_c_1, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(ipgpio5_c_1, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(ipgpio6_c_1, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(ipgpio7_c_1, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(smcleale_c_1, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(stmape_c_1, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(u2rxtx_c_2, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(ipgpio2_c_2, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(ipgpio3_c_2, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(ipgpio4_c_2, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(ipgpio5_c_2, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(mc5_c_1, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(mc2rstn_c_1, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(kp_c_1, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(smps0_c_1, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(smps1_c_1, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(u2rxtx_c_3, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(stmape_c_2, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(uartmodrx_c_1, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(uartmodtx_c_1, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(stmmod_c_1, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(usbsim_c_1, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(mc4rstn_c_1, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(clkout1_c_1, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(clkout2_c_1, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(i2c3_c_1, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(spi0_c_1, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(usbsim_c_2, NMK_GPIO_ALT_C),
-       DB8500_PIN_GROUP(i2c3_c_2, NMK_GPIO_ALT_C),
-       /* Other alt C1 column */
-       DB8500_PIN_GROUP(u2rx_oc1_1, NMK_GPIO_ALT_C1),
-       DB8500_PIN_GROUP(stmape_oc1_1, NMK_GPIO_ALT_C1),
-       DB8500_PIN_GROUP(remap0_oc1_1, NMK_GPIO_ALT_C1),
-       DB8500_PIN_GROUP(remap1_oc1_1, NMK_GPIO_ALT_C1),
-       DB8500_PIN_GROUP(ptma9_oc1_1, NMK_GPIO_ALT_C1),
-       DB8500_PIN_GROUP(kp_oc1_1, NMK_GPIO_ALT_C1),
-       DB8500_PIN_GROUP(rf_oc1_1, NMK_GPIO_ALT_C1),
-       DB8500_PIN_GROUP(hxclk_oc1_1, NMK_GPIO_ALT_C1),
-       DB8500_PIN_GROUP(uartmodrx_oc1_1, NMK_GPIO_ALT_C1),
-       DB8500_PIN_GROUP(uartmodtx_oc1_1, NMK_GPIO_ALT_C1),
-       DB8500_PIN_GROUP(stmmod_oc1_1, NMK_GPIO_ALT_C1),
-       DB8500_PIN_GROUP(hxgpio_oc1_1, NMK_GPIO_ALT_C1),
-       DB8500_PIN_GROUP(rf_oc1_2, NMK_GPIO_ALT_C1),
-       DB8500_PIN_GROUP(spi2_oc1_1, NMK_GPIO_ALT_C1),
-       DB8500_PIN_GROUP(spi2_oc1_2, NMK_GPIO_ALT_C1),
-       /* Other alt C2 column */
-       DB8500_PIN_GROUP(sbag_oc2_1, NMK_GPIO_ALT_C2),
-       DB8500_PIN_GROUP(etmr4_oc2_1, NMK_GPIO_ALT_C2),
-       DB8500_PIN_GROUP(ptma9_oc2_1, NMK_GPIO_ALT_C2),
-       /* Other alt C3 column */
-       DB8500_PIN_GROUP(stmmod_oc3_1, NMK_GPIO_ALT_C3),
-       DB8500_PIN_GROUP(stmmod_oc3_2, NMK_GPIO_ALT_C3),
-       DB8500_PIN_GROUP(uartmodrx_oc3_1, NMK_GPIO_ALT_C3),
-       DB8500_PIN_GROUP(uartmodtx_oc3_1, NMK_GPIO_ALT_C3),
-       DB8500_PIN_GROUP(etmr4_oc3_1, NMK_GPIO_ALT_C3),
-       /* Other alt C4 column */
-       DB8500_PIN_GROUP(sbag_oc4_1, NMK_GPIO_ALT_C4),
-       DB8500_PIN_GROUP(hwobs_oc4_1, NMK_GPIO_ALT_C4),
-};
-
-/* We use this macro to define the groups applicable to a function */
-#define DB8500_FUNC_GROUPS(a, b...)       \
-static const char * const a##_groups[] = { b };
-
-DB8500_FUNC_GROUPS(u0, "u0_a_1", "u0_c_1");
-DB8500_FUNC_GROUPS(u1, "u1rxtx_a_1", "u1ctsrts_a_1");
-/*
- * UART2 can be muxed out with just RX/TX in four places, CTS+RTS is however
- * only available on two pins in alternative function C
- */
-DB8500_FUNC_GROUPS(u2, "u2rxtx_b_1", "u2rxtx_c_1", "u2ctsrts_c_1",
-                  "u2rxtx_c_2", "u2rxtx_c_3", "u2rx_oc1_1");
-DB8500_FUNC_GROUPS(ipi2c, "ipi2c_a_1", "ipi2c_a_2");
-/*
- * MSP0 can only be on a certain set of pins, but the TX/RX pins can be
- * switched around by selecting the altfunction A or B. The SCK pin is
- * only available on the altfunction B.
- */
-DB8500_FUNC_GROUPS(msp0, "msp0txrx_a_1", "msp0tfstck_a_1", "msp0rfstck_a_1",
-                  "msp0txrx_b_1", "msp0sck_b_1");
-DB8500_FUNC_GROUPS(mc0, "mc0_a_1", "mc0_dat47_a_1", "mc0dat31dir_a_1");
-/* MSP0 can swap RX/TX like MSP0 but has no SCK pin available */
-DB8500_FUNC_GROUPS(msp1, "msp1txrx_a_1", "msp1_a_1", "msp1txrx_b_1");
-DB8500_FUNC_GROUPS(lcdb, "lcdb_a_1");
-DB8500_FUNC_GROUPS(lcd, "lcdvsi0_a_1", "lcdvsi1_a_1", "lcd_d0_d7_a_1",
-       "lcd_d8_d11_a_1", "lcd_d12_d23_a_1", "lcd_b_1");
-DB8500_FUNC_GROUPS(kp, "kp_a_1", "kp_a_2", "kp_b_1", "kp_b_2", "kp_c_1", "kp_oc1_1");
-DB8500_FUNC_GROUPS(mc2, "mc2_a_1", "mc2rstn_c_1");
-DB8500_FUNC_GROUPS(ssp1, "ssp1_a_1");
-DB8500_FUNC_GROUPS(ssp0, "ssp0_a_1");
-DB8500_FUNC_GROUPS(i2c0, "i2c0_a_1");
-/* The image processor has 8 GPIO pins that can be muxed out */
-DB8500_FUNC_GROUPS(ipgpio, "ipgpio0_a_1", "ipgpio1_a_1", "ipgpio7_b_1",
-       "ipgpio2_b_1", "ipgpio3_b_1", "ipgpio6_c_1", "ipgpio0_c_1",
-       "ipgpio1_c_1", "ipgpio3_c_1", "ipgpio2_c_1", "ipgpio4_c_1",
-       "ipgpio5_c_1", "ipgpio6_c_2", "ipgpio7_c_1", "ipgpio2_c_2",
-       "ipgpio3_c_2", "ipgpio4_c_2", "ipgpio5_c_2");
-/* MSP2 can not invert the RX/TX pins but has the optional SCK pin */
-DB8500_FUNC_GROUPS(msp2, "msp2sck_a_1", "msp2_a_1");
-DB8500_FUNC_GROUPS(mc4, "mc4_a_1", "mc4rstn_c_1");
-DB8500_FUNC_GROUPS(mc1, "mc1_a_1", "mc1_a_2", "mc1dir_a_1");
-DB8500_FUNC_GROUPS(hsi, "hsir_a_1", "hsit_a_1", "hsit_a_2");
-DB8500_FUNC_GROUPS(clkout, "clkout1_a_1", "clkout1_a_2", "clkout1_c_1",
-               "clkout2_a_1", "clkout2_a_2", "clkout2_c_1");
-DB8500_FUNC_GROUPS(usb, "usb_a_1");
-DB8500_FUNC_GROUPS(trig, "trig_b_1");
-DB8500_FUNC_GROUPS(i2c4, "i2c4_b_1");
-DB8500_FUNC_GROUPS(i2c1, "i2c1_b_1", "i2c1_b_2");
-DB8500_FUNC_GROUPS(i2c2, "i2c2_b_1", "i2c2_b_2");
-/*
- * The modem UART can output its RX and TX pins in some different places,
- * so select one of each.
- */
-DB8500_FUNC_GROUPS(uartmod, "uartmodtx_b_1", "uartmodrx_b_1", "uartmodrx_b_2",
-               "uartmodrx_c_1", "uartmod_tx_c_1", "uartmodrx_oc1_1",
-               "uartmodtx_oc1_1", "uartmodrx_oc3_1", "uartmodtx_oc3_1");
-DB8500_FUNC_GROUPS(stmmod, "stmmod_b_1", "stmmod_c_1", "stmmod_oc1_1",
-               "stmmod_oc3_1", "stmmod_oc3_2");
-DB8500_FUNC_GROUPS(spi3, "spi3_b_1");
-/* Select between CS0 on alt B or PS1 on alt C */
-DB8500_FUNC_GROUPS(sm, "sm_b_1", "smcs0_b_1", "smcs1_b_1", "smcleale_c_1",
-                  "smps0_c_1", "smps1_c_1");
-DB8500_FUNC_GROUPS(lcda, "lcdaclk_b_1", "lcda_b_1");
-DB8500_FUNC_GROUPS(ddrtrig, "ddrtrig_b_1");
-DB8500_FUNC_GROUPS(pwl, "pwl_b_1", "pwl_b_2", "pwl_b_3", "pwl_b_4");
-DB8500_FUNC_GROUPS(spi1, "spi1_b_1");
-DB8500_FUNC_GROUPS(mc3, "mc3_b_1");
-DB8500_FUNC_GROUPS(ipjtag, "ipjtag_c_1");
-DB8500_FUNC_GROUPS(slim0, "slim0_c_1");
-DB8500_FUNC_GROUPS(ms, "ms_c_1");
-DB8500_FUNC_GROUPS(iptrigout, "iptrigout_c_1");
-DB8500_FUNC_GROUPS(stmape, "stmape_c_1", "stmape_c_2", "stmape_oc1_1");
-DB8500_FUNC_GROUPS(mc5, "mc5_c_1");
-DB8500_FUNC_GROUPS(usbsim, "usbsim_c_1", "usbsim_c_2");
-DB8500_FUNC_GROUPS(i2c3, "i2c3_c_1", "i2c3_c_2");
-DB8500_FUNC_GROUPS(spi0, "spi0_c_1");
-DB8500_FUNC_GROUPS(spi2, "spi2_oc1_1", "spi2_oc1_2");
-DB8500_FUNC_GROUPS(remap, "remap0_oc1_1", "remap1_oc1_1");
-DB8500_FUNC_GROUPS(sbag, "sbag_oc2_1", "sbag_oc4_1");
-DB8500_FUNC_GROUPS(ptm, "ptma9_oc1_1", "ptma9_oc2_1");
-DB8500_FUNC_GROUPS(rf, "rf_oc1_1", "rf_oc1_2");
-DB8500_FUNC_GROUPS(hx, "hxclk_oc1_1", "hxgpio_oc1_1");
-DB8500_FUNC_GROUPS(etm, "etmr4_oc2_1", "etmr4_oc3_1");
-DB8500_FUNC_GROUPS(hwobs, "hwobs_oc4_1");
-#define FUNCTION(fname)                                        \
-       {                                               \
-               .name = #fname,                         \
-               .groups = fname##_groups,               \
-               .ngroups = ARRAY_SIZE(fname##_groups),  \
-       }
-
-static const struct nmk_function nmk_db8500_functions[] = {
-       FUNCTION(u0),
-       FUNCTION(u1),
-       FUNCTION(u2),
-       FUNCTION(ipi2c),
-       FUNCTION(msp0),
-       FUNCTION(mc0),
-       FUNCTION(msp1),
-       FUNCTION(lcdb),
-       FUNCTION(lcd),
-       FUNCTION(kp),
-       FUNCTION(mc2),
-       FUNCTION(ssp1),
-       FUNCTION(ssp0),
-       FUNCTION(i2c0),
-       FUNCTION(ipgpio),
-       FUNCTION(msp2),
-       FUNCTION(mc4),
-       FUNCTION(mc1),
-       FUNCTION(hsi),
-       FUNCTION(clkout),
-       FUNCTION(usb),
-       FUNCTION(trig),
-       FUNCTION(i2c4),
-       FUNCTION(i2c1),
-       FUNCTION(i2c2),
-       FUNCTION(uartmod),
-       FUNCTION(stmmod),
-       FUNCTION(spi3),
-       FUNCTION(sm),
-       FUNCTION(lcda),
-       FUNCTION(ddrtrig),
-       FUNCTION(pwl),
-       FUNCTION(spi1),
-       FUNCTION(mc3),
-       FUNCTION(ipjtag),
-       FUNCTION(slim0),
-       FUNCTION(ms),
-       FUNCTION(iptrigout),
-       FUNCTION(stmape),
-       FUNCTION(mc5),
-       FUNCTION(usbsim),
-       FUNCTION(i2c3),
-       FUNCTION(spi0),
-       FUNCTION(spi2),
-       FUNCTION(remap),
-       FUNCTION(ptm),
-       FUNCTION(rf),
-       FUNCTION(hx),
-       FUNCTION(etm),
-       FUNCTION(hwobs),
-};
-
-static const struct prcm_gpiocr_altcx_pin_desc db8500_altcx_pins[] = {
-       PRCM_GPIOCR_ALTCX(23,   true, PRCM_IDX_GPIOCR1, 9,      /* STMAPE_CLK_a */
-                               true, PRCM_IDX_GPIOCR1, 7,      /* SBAG_CLK_a */
-                               false, 0, 0,
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(24,   true, PRCM_IDX_GPIOCR1, 9,      /* STMAPE or U2_RXD ??? */
-                               true, PRCM_IDX_GPIOCR1, 7,      /* SBAG_VAL_a */
-                               true, PRCM_IDX_GPIOCR1, 10,     /* STM_MOD_CMD0 */
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(25,   true, PRCM_IDX_GPIOCR1, 9,      /* STMAPE_DAT_a[0] */
-                               true, PRCM_IDX_GPIOCR1, 7,      /* SBAG_D_a[0] */
-                               false, 0, 0,
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(26,   true, PRCM_IDX_GPIOCR1, 9,      /* STMAPE_DAT_a[1] */
-                               true, PRCM_IDX_GPIOCR1, 7,      /* SBAG_D_a[1] */
-                               false, 0, 0,
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(27,   true, PRCM_IDX_GPIOCR1, 9,      /* STMAPE_DAT_a[2] */
-                               true, PRCM_IDX_GPIOCR1, 7,      /* SBAG_D_a[2] */
-                               false, 0, 0,
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(28,   true, PRCM_IDX_GPIOCR1, 9,      /* STMAPE_DAT_a[3] */
-                               true, PRCM_IDX_GPIOCR1, 7,      /* SBAG_D_a[3] */
-                               false, 0, 0,
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(29,   false, 0, 0,
-                               false, 0, 0,
-                               true, PRCM_IDX_GPIOCR1, 10,     /* STM_MOD_CMD0 */
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(30,   false, 0, 0,
-                               false, 0, 0,
-                               true, PRCM_IDX_GPIOCR1, 10,     /* STM_MOD_CMD0 */
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(31,   false, 0, 0,
-                               false, 0, 0,
-                               true, PRCM_IDX_GPIOCR1, 10,     /* STM_MOD_CMD0 */
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(32,   false, 0, 0,
-                               false, 0, 0,
-                               true, PRCM_IDX_GPIOCR1, 10,     /* STM_MOD_CMD0 */
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(68,   true, PRCM_IDX_GPIOCR1, 18,     /* REMAP_SELECT_ON */
-                               false, 0, 0,
-                               false, 0, 0,
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(69,   true, PRCM_IDX_GPIOCR1, 18,     /* REMAP_SELECT_ON */
-                               false, 0, 0,
-                               false, 0, 0,
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(70,   true, PRCM_IDX_GPIOCR1, 5,      /* PTM_A9_D23 */
-                               true, PRCM_IDX_GPIOCR2, 2,      /* DBG_ETM_R4_CMD0 */
-                               true, PRCM_IDX_GPIOCR1, 11,     /* STM_MOD_CMD1 */
-                               true, PRCM_IDX_GPIOCR1, 8       /* SBAG_CLK */
-       ),
-       PRCM_GPIOCR_ALTCX(71,   true, PRCM_IDX_GPIOCR1, 5,      /* PTM_A9_D22 */
-                               true, PRCM_IDX_GPIOCR2, 2,      /* DBG_ETM_R4_CMD0 */
-                               true, PRCM_IDX_GPIOCR1, 11,     /* STM_MOD_CMD1 */
-                               true, PRCM_IDX_GPIOCR1, 8       /* SBAG_D3 */
-       ),
-       PRCM_GPIOCR_ALTCX(72,   true, PRCM_IDX_GPIOCR1, 5,      /* PTM_A9_D21 */
-                               true, PRCM_IDX_GPIOCR2, 2,      /* DBG_ETM_R4_CMD0 */
-                               true, PRCM_IDX_GPIOCR1, 11,     /* STM_MOD_CMD1 */
-                               true, PRCM_IDX_GPIOCR1, 8       /* SBAG_D2 */
-       ),
-       PRCM_GPIOCR_ALTCX(73,   true, PRCM_IDX_GPIOCR1, 5,      /* PTM_A9_D20 */
-                               true, PRCM_IDX_GPIOCR2, 2,      /* DBG_ETM_R4_CMD0 */
-                               true, PRCM_IDX_GPIOCR1, 11,     /* STM_MOD_CMD1 */
-                               true, PRCM_IDX_GPIOCR1, 8       /* SBAG_D1 */
-       ),
-       PRCM_GPIOCR_ALTCX(74,   true, PRCM_IDX_GPIOCR1, 5,      /* PTM_A9_D19 */
-                               true, PRCM_IDX_GPIOCR2, 2,      /* DBG_ETM_R4_CMD0 */
-                               true, PRCM_IDX_GPIOCR1, 11,     /* STM_MOD_CMD1 */
-                               true, PRCM_IDX_GPIOCR1, 8       /* SBAG_D0 */
-       ),
-       PRCM_GPIOCR_ALTCX(75,   true, PRCM_IDX_GPIOCR1, 5,      /* PTM_A9_D18 */
-                               true, PRCM_IDX_GPIOCR2, 2,      /* DBG_ETM_R4_CMD0 */
-                               true, PRCM_IDX_GPIOCR1, 0,      /* DBG_UARTMOD_CMD0 */
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(76,   true, PRCM_IDX_GPIOCR1, 5,      /* PTM_A9_D17 */
-                               true, PRCM_IDX_GPIOCR2, 2,      /* DBG_ETM_R4_CMD0 */
-                               true, PRCM_IDX_GPIOCR1, 0,      /* DBG_UARTMOD_CMD0 */
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(77,   true, PRCM_IDX_GPIOCR1, 5,      /* PTM_A9_D16 */
-                               true, PRCM_IDX_GPIOCR2, 2,      /* DBG_ETM_R4_CMD0 */
-                               false, 0, 0,
-                               true, PRCM_IDX_GPIOCR1, 8       /* SBAG_VAL */
-       ),
-       PRCM_GPIOCR_ALTCX(86,   true, PRCM_IDX_GPIOCR1, 12,     /* KP_O3 */
-                               false, 0, 0,
-                               false, 0, 0,
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(87,   true, PRCM_IDX_GPIOCR1, 12,     /* KP_O2 */
-                               false, 0, 0,
-                               false, 0, 0,
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(88,   true, PRCM_IDX_GPIOCR1, 12,     /* KP_I3 */
-                               false, 0, 0,
-                               false, 0, 0,
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(89,   true, PRCM_IDX_GPIOCR1, 12,     /* KP_I2 */
-                               false, 0, 0,
-                               false, 0, 0,
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(90,   true, PRCM_IDX_GPIOCR1, 12,     /* KP_O1 */
-                               false, 0, 0,
-                               false, 0, 0,
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(91,   true, PRCM_IDX_GPIOCR1, 12,     /* KP_O0 */
-                               false, 0, 0,
-                               false, 0, 0,
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(92,   true, PRCM_IDX_GPIOCR1, 12,     /* KP_I1 */
-                               false, 0, 0,
-                               false, 0, 0,
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(93,   true, PRCM_IDX_GPIOCR1, 12,     /* KP_I0 */
-                               false, 0, 0,
-                               false, 0, 0,
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(96,   true, PRCM_IDX_GPIOCR2, 3,      /* RF_INT */
-                               false, 0, 0,
-                               false, 0, 0,
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(97,   true, PRCM_IDX_GPIOCR2, 1,      /* RF_CTRL */
-                               false, 0, 0,
-                               false, 0, 0,
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(151,  false, 0, 0,
-                               true, PRCM_IDX_GPIOCR1, 6,      /* PTM_A9_CTL */
-                               true, PRCM_IDX_GPIOCR1, 15,     /* DBG_ETM_R4_CMD1*/
-                               true, PRCM_IDX_GPIOCR1, 25      /* HW_OBS17 */
-       ),
-       PRCM_GPIOCR_ALTCX(152,  true, PRCM_IDX_GPIOCR1, 4,      /* Hx_CLK */
-                               true, PRCM_IDX_GPIOCR1, 6,      /* PTM_A9_CLK */
-                               true, PRCM_IDX_GPIOCR1, 15,     /* DBG_ETM_R4_CMD1*/
-                               true, PRCM_IDX_GPIOCR1, 25      /* HW_OBS16 */
-       ),
-       PRCM_GPIOCR_ALTCX(153,  true, PRCM_IDX_GPIOCR1, 1,      /* UARTMOD_CMD1 */
-                               true, PRCM_IDX_GPIOCR1, 14,     /* PTM_A9_D15 */
-                               true, PRCM_IDX_GPIOCR1, 19,     /* DBG_ETM_R4_CMD2 */
-                               true, PRCM_IDX_GPIOCR1, 25      /* HW_OBS15 */
-       ),
-       PRCM_GPIOCR_ALTCX(154,  true, PRCM_IDX_GPIOCR1, 1,      /* UARTMOD_CMD1 */
-                               true, PRCM_IDX_GPIOCR1, 14,     /* PTM_A9_D14 */
-                               true, PRCM_IDX_GPIOCR1, 19,     /* DBG_ETM_R4_CMD2 */
-                               true, PRCM_IDX_GPIOCR1, 25      /* HW_OBS14 */
-       ),
-       PRCM_GPIOCR_ALTCX(155,  true, PRCM_IDX_GPIOCR1, 13,     /* STM_MOD_CMD2 */
-                               true, PRCM_IDX_GPIOCR1, 14,     /* PTM_A9_D13 */
-                               true, PRCM_IDX_GPIOCR1, 19,     /* DBG_ETM_R4_CMD2 */
-                               true, PRCM_IDX_GPIOCR1, 25      /* HW_OBS13 */
-       ),
-       PRCM_GPIOCR_ALTCX(156,  true, PRCM_IDX_GPIOCR1, 13,     /* STM_MOD_CMD2 */
-                               true, PRCM_IDX_GPIOCR1, 14,     /* PTM_A9_D12 */
-                               true, PRCM_IDX_GPIOCR1, 19,     /* DBG_ETM_R4_CMD2 */
-                               true, PRCM_IDX_GPIOCR1, 25      /* HW_OBS12 */
-       ),
-       PRCM_GPIOCR_ALTCX(157,  true, PRCM_IDX_GPIOCR1, 13,     /* STM_MOD_CMD2 */
-                               true, PRCM_IDX_GPIOCR1, 14,     /* PTM_A9_D11 */
-                               true, PRCM_IDX_GPIOCR1, 19,     /* DBG_ETM_R4_CMD2 */
-                               true, PRCM_IDX_GPIOCR1, 25      /* HW_OBS11 */
-       ),
-       PRCM_GPIOCR_ALTCX(158,  true, PRCM_IDX_GPIOCR1, 13,     /* STM_MOD_CMD2 */
-                               true, PRCM_IDX_GPIOCR1, 14,     /* PTM_A9_D10 */
-                               true, PRCM_IDX_GPIOCR1, 19,     /* DBG_ETM_R4_CMD2 */
-                               true, PRCM_IDX_GPIOCR1, 25      /* HW_OBS10 */
-       ),
-       PRCM_GPIOCR_ALTCX(159,  true, PRCM_IDX_GPIOCR1, 13,     /* STM_MOD_CMD2 */
-                               true, PRCM_IDX_GPIOCR1, 14,     /* PTM_A9_D9 */
-                               true, PRCM_IDX_GPIOCR1, 19,     /* DBG_ETM_R4_CMD2 */
-                               true, PRCM_IDX_GPIOCR1, 25      /* HW_OBS9 */
-       ),
-       PRCM_GPIOCR_ALTCX(160,  false, 0, 0,
-                               true, PRCM_IDX_GPIOCR1, 14,     /* PTM_A9_D8 */
-                               true, PRCM_IDX_GPIOCR1, 19,     /* DBG_ETM_R4_CMD2 */
-                               true, PRCM_IDX_GPIOCR1, 25      /* HW_OBS8 */
-       ),
-       PRCM_GPIOCR_ALTCX(161,  true, PRCM_IDX_GPIOCR1, 4,      /* Hx_GPIO7 */
-                               true, PRCM_IDX_GPIOCR1, 6,      /* PTM_A9_D7 */
-                               true, PRCM_IDX_GPIOCR1, 15,     /* DBG_ETM_R4_CMD1*/
-                               true, PRCM_IDX_GPIOCR1, 24      /* HW_OBS7 */
-       ),
-       PRCM_GPIOCR_ALTCX(162,  true, PRCM_IDX_GPIOCR1, 4,      /* Hx_GPIO6 */
-                               true, PRCM_IDX_GPIOCR1, 6,      /* PTM_A9_D6 */
-                               true, PRCM_IDX_GPIOCR1, 15,     /* DBG_ETM_R4_CMD1*/
-                               true, PRCM_IDX_GPIOCR1, 24      /* HW_OBS6 */
-       ),
-       PRCM_GPIOCR_ALTCX(163,  true, PRCM_IDX_GPIOCR1, 4,      /* Hx_GPIO5 */
-                               true, PRCM_IDX_GPIOCR1, 6,      /* PTM_A9_D5 */
-                               true, PRCM_IDX_GPIOCR1, 15,     /* DBG_ETM_R4_CMD1*/
-                               true, PRCM_IDX_GPIOCR1, 24      /* HW_OBS5 */
-       ),
-       PRCM_GPIOCR_ALTCX(164,  true, PRCM_IDX_GPIOCR1, 4,      /* Hx_GPIO4 */
-                               true, PRCM_IDX_GPIOCR1, 6,      /* PTM_A9_D4 */
-                               true, PRCM_IDX_GPIOCR1, 15,     /* DBG_ETM_R4_CMD1*/
-                               true, PRCM_IDX_GPIOCR1, 24      /* HW_OBS4 */
-       ),
-       PRCM_GPIOCR_ALTCX(165,  true, PRCM_IDX_GPIOCR1, 4,      /* Hx_GPIO3 */
-                               true, PRCM_IDX_GPIOCR1, 6,      /* PTM_A9_D3 */
-                               true, PRCM_IDX_GPIOCR1, 15,     /* DBG_ETM_R4_CMD1*/
-                               true, PRCM_IDX_GPIOCR1, 24      /* HW_OBS3 */
-       ),
-       PRCM_GPIOCR_ALTCX(166,  true, PRCM_IDX_GPIOCR1, 4,      /* Hx_GPIO2 */
-                               true, PRCM_IDX_GPIOCR1, 6,      /* PTM_A9_D2 */
-                               true, PRCM_IDX_GPIOCR1, 15,     /* DBG_ETM_R4_CMD1*/
-                               true, PRCM_IDX_GPIOCR1, 24      /* HW_OBS2 */
-       ),
-       PRCM_GPIOCR_ALTCX(167,  true, PRCM_IDX_GPIOCR1, 4,      /* Hx_GPIO1 */
-                               true, PRCM_IDX_GPIOCR1, 6,      /* PTM_A9_D1 */
-                               true, PRCM_IDX_GPIOCR1, 15,     /* DBG_ETM_R4_CMD1*/
-                               true, PRCM_IDX_GPIOCR1, 24      /* HW_OBS1 */
-       ),
-       PRCM_GPIOCR_ALTCX(168,  true, PRCM_IDX_GPIOCR1, 4,      /* Hx_GPIO0 */
-                               true, PRCM_IDX_GPIOCR1, 6,      /* PTM_A9_D0 */
-                               true, PRCM_IDX_GPIOCR1, 15,     /* DBG_ETM_R4_CMD1*/
-                               true, PRCM_IDX_GPIOCR1, 24      /* HW_OBS0 */
-       ),
-       PRCM_GPIOCR_ALTCX(170,  true, PRCM_IDX_GPIOCR2, 2,      /* RF_INT */
-                               false, 0, 0,
-                               false, 0, 0,
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(171,  true, PRCM_IDX_GPIOCR2, 0,      /* RF_CTRL */
-                               false, 0, 0,
-                               false, 0, 0,
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(215,  true, PRCM_IDX_GPIOCR1, 23,     /* SPI2_TXD */
-                               false, 0, 0,
-                               false, 0, 0,
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(216,  true, PRCM_IDX_GPIOCR1, 23,     /* SPI2_FRM */
-                               false, 0, 0,
-                               false, 0, 0,
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(217,  true, PRCM_IDX_GPIOCR1, 23,     /* SPI2_CLK */
-                               false, 0, 0,
-                               false, 0, 0,
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(218,  true, PRCM_IDX_GPIOCR1, 23,     /* SPI2_RXD */
-                               false, 0, 0,
-                               false, 0, 0,
-                               false, 0, 0
-       ),
-};
-
-static const u16 db8500_prcm_gpiocr_regs[] = {
-       [PRCM_IDX_GPIOCR1] = 0x138,
-       [PRCM_IDX_GPIOCR2] = 0x574,
-};
-
-static const struct nmk_pinctrl_soc_data nmk_db8500_soc = {
-       .gpio_ranges = nmk_db8500_ranges,
-       .gpio_num_ranges = ARRAY_SIZE(nmk_db8500_ranges),
-       .pins = nmk_db8500_pins,
-       .npins = ARRAY_SIZE(nmk_db8500_pins),
-       .functions = nmk_db8500_functions,
-       .nfunctions = ARRAY_SIZE(nmk_db8500_functions),
-       .groups = nmk_db8500_groups,
-       .ngroups = ARRAY_SIZE(nmk_db8500_groups),
-       .altcx_pins = db8500_altcx_pins,
-       .npins_altcx = ARRAY_SIZE(db8500_altcx_pins),
-       .prcm_gpiocr_registers = db8500_prcm_gpiocr_regs,
-};
-
-void nmk_pinctrl_db8500_init(const struct nmk_pinctrl_soc_data **soc)
-{
-       *soc = &nmk_db8500_soc;
-}
diff --git a/drivers/pinctrl/pinctrl-nomadik-db8540.c b/drivers/pinctrl/pinctrl-nomadik-db8540.c
deleted file mode 100644 (file)
index d7ba544..0000000
+++ /dev/null
@@ -1,1266 +0,0 @@
-#include <linux/kernel.h>
-#include <linux/pinctrl/pinctrl.h>
-#include "pinctrl-nomadik.h"
-
-/* All the pins that can be used for GPIO and some other functions */
-#define _GPIO(offset)          (offset)
-
-#define DB8540_PIN_AH6         _GPIO(0)
-#define DB8540_PIN_AG7         _GPIO(1)
-#define DB8540_PIN_AF2         _GPIO(2)
-#define DB8540_PIN_AD3         _GPIO(3)
-#define DB8540_PIN_AF6         _GPIO(4)
-#define DB8540_PIN_AG6         _GPIO(5)
-#define DB8540_PIN_AD5         _GPIO(6)
-#define DB8540_PIN_AF7         _GPIO(7)
-#define DB8540_PIN_AG5         _GPIO(8)
-#define DB8540_PIN_AH5         _GPIO(9)
-#define DB8540_PIN_AE4         _GPIO(10)
-#define DB8540_PIN_AD1         _GPIO(11)
-#define DB8540_PIN_AD2         _GPIO(12)
-#define DB8540_PIN_AC2         _GPIO(13)
-#define DB8540_PIN_AC4         _GPIO(14)
-#define DB8540_PIN_AC3         _GPIO(15)
-#define DB8540_PIN_AH7         _GPIO(16)
-#define DB8540_PIN_AE7         _GPIO(17)
-/* Hole */
-#define DB8540_PIN_AF8         _GPIO(22)
-#define DB8540_PIN_AH11                _GPIO(23)
-#define DB8540_PIN_AG11                _GPIO(24)
-#define DB8540_PIN_AF11                _GPIO(25)
-#define DB8540_PIN_AH10                _GPIO(26)
-#define DB8540_PIN_AG10                _GPIO(27)
-#define DB8540_PIN_AF10                _GPIO(28)
-/* Hole */
-#define DB8540_PIN_AD4         _GPIO(33)
-#define DB8540_PIN_AF3         _GPIO(34)
-#define DB8540_PIN_AF5         _GPIO(35)
-#define DB8540_PIN_AG4         _GPIO(36)
-#define DB8540_PIN_AF9         _GPIO(37)
-#define DB8540_PIN_AE8         _GPIO(38)
-/* Hole */
-#define DB8540_PIN_M26         _GPIO(64)
-#define DB8540_PIN_M25         _GPIO(65)
-#define DB8540_PIN_M27         _GPIO(66)
-#define DB8540_PIN_N25         _GPIO(67)
-/* Hole */
-#define DB8540_PIN_M28         _GPIO(70)
-#define DB8540_PIN_N26         _GPIO(71)
-#define DB8540_PIN_M22         _GPIO(72)
-#define DB8540_PIN_N22         _GPIO(73)
-#define DB8540_PIN_N27         _GPIO(74)
-#define DB8540_PIN_N28         _GPIO(75)
-#define DB8540_PIN_P22         _GPIO(76)
-#define DB8540_PIN_P28         _GPIO(77)
-#define DB8540_PIN_P26         _GPIO(78)
-#define DB8540_PIN_T22         _GPIO(79)
-#define DB8540_PIN_R27         _GPIO(80)
-#define DB8540_PIN_P27         _GPIO(81)
-#define DB8540_PIN_R26         _GPIO(82)
-#define DB8540_PIN_R25         _GPIO(83)
-#define DB8540_PIN_U22         _GPIO(84)
-#define DB8540_PIN_T27         _GPIO(85)
-#define DB8540_PIN_T25         _GPIO(86)
-#define DB8540_PIN_T26         _GPIO(87)
-/* Hole */
-#define DB8540_PIN_AF20                _GPIO(116)
-#define DB8540_PIN_AG21                _GPIO(117)
-#define DB8540_PIN_AH19                _GPIO(118)
-#define DB8540_PIN_AE19                _GPIO(119)
-#define DB8540_PIN_AG18                _GPIO(120)
-#define DB8540_PIN_AH17                _GPIO(121)
-#define DB8540_PIN_AF19                _GPIO(122)
-#define DB8540_PIN_AF18                _GPIO(123)
-#define DB8540_PIN_AE18                _GPIO(124)
-#define DB8540_PIN_AG17                _GPIO(125)
-#define DB8540_PIN_AF17                _GPIO(126)
-#define DB8540_PIN_AE17                _GPIO(127)
-#define DB8540_PIN_AC27                _GPIO(128)
-#define DB8540_PIN_AD27                _GPIO(129)
-#define DB8540_PIN_AE28                _GPIO(130)
-#define DB8540_PIN_AG26                _GPIO(131)
-#define DB8540_PIN_AF25                _GPIO(132)
-#define DB8540_PIN_AE27                _GPIO(133)
-#define DB8540_PIN_AF27                _GPIO(134)
-#define DB8540_PIN_AG28                _GPIO(135)
-#define DB8540_PIN_AF28                _GPIO(136)
-#define DB8540_PIN_AG25                _GPIO(137)
-#define DB8540_PIN_AG24                _GPIO(138)
-#define DB8540_PIN_AD25                _GPIO(139)
-#define DB8540_PIN_AH25                _GPIO(140)
-#define DB8540_PIN_AF26                _GPIO(141)
-#define DB8540_PIN_AF23                _GPIO(142)
-#define DB8540_PIN_AG23                _GPIO(143)
-#define DB8540_PIN_AE25                _GPIO(144)
-#define DB8540_PIN_AH24                _GPIO(145)
-#define DB8540_PIN_AJ25                _GPIO(146)
-#define DB8540_PIN_AG27                _GPIO(147)
-#define DB8540_PIN_AH23                _GPIO(148)
-#define DB8540_PIN_AE26                _GPIO(149)
-#define DB8540_PIN_AE24                _GPIO(150)
-#define DB8540_PIN_AJ24                _GPIO(151)
-#define DB8540_PIN_AE21                _GPIO(152)
-#define DB8540_PIN_AG22                _GPIO(153)
-#define DB8540_PIN_AF21                _GPIO(154)
-#define DB8540_PIN_AF24                _GPIO(155)
-#define DB8540_PIN_AH22                _GPIO(156)
-#define DB8540_PIN_AJ23                _GPIO(157)
-#define DB8540_PIN_AH21                _GPIO(158)
-#define DB8540_PIN_AG20                _GPIO(159)
-#define DB8540_PIN_AE23                _GPIO(160)
-#define DB8540_PIN_AH20                _GPIO(161)
-#define DB8540_PIN_AG19                _GPIO(162)
-#define DB8540_PIN_AF22                _GPIO(163)
-#define DB8540_PIN_AJ21                _GPIO(164)
-#define DB8540_PIN_AD26                _GPIO(165)
-#define DB8540_PIN_AD28                _GPIO(166)
-#define DB8540_PIN_AC28                _GPIO(167)
-#define DB8540_PIN_AC26                _GPIO(168)
-/* Hole */
-#define DB8540_PIN_J3          _GPIO(192)
-#define DB8540_PIN_H1          _GPIO(193)
-#define DB8540_PIN_J2          _GPIO(194)
-#define DB8540_PIN_H2          _GPIO(195)
-#define DB8540_PIN_H3          _GPIO(196)
-#define DB8540_PIN_H4          _GPIO(197)
-#define DB8540_PIN_G2          _GPIO(198)
-#define DB8540_PIN_G3          _GPIO(199)
-#define DB8540_PIN_G4          _GPIO(200)
-#define DB8540_PIN_F2          _GPIO(201)
-#define DB8540_PIN_C6          _GPIO(202)
-#define DB8540_PIN_B6          _GPIO(203)
-#define DB8540_PIN_B7          _GPIO(204)
-#define DB8540_PIN_A7          _GPIO(205)
-#define DB8540_PIN_D7          _GPIO(206)
-#define DB8540_PIN_D8          _GPIO(207)
-#define DB8540_PIN_F3          _GPIO(208)
-#define DB8540_PIN_E2          _GPIO(209)
-#define DB8540_PIN_C7          _GPIO(210)
-#define DB8540_PIN_B8          _GPIO(211)
-#define DB8540_PIN_C10         _GPIO(212)
-#define DB8540_PIN_C8          _GPIO(213)
-#define DB8540_PIN_C9          _GPIO(214)
-/* Hole */
-#define DB8540_PIN_B9          _GPIO(219)
-#define DB8540_PIN_A10         _GPIO(220)
-#define DB8540_PIN_D9          _GPIO(221)
-#define DB8540_PIN_B11         _GPIO(222)
-#define DB8540_PIN_B10         _GPIO(223)
-#define DB8540_PIN_E10         _GPIO(224)
-#define DB8540_PIN_B12         _GPIO(225)
-#define DB8540_PIN_D10         _GPIO(226)
-#define DB8540_PIN_D11         _GPIO(227)
-#define DB8540_PIN_AJ6         _GPIO(228)
-#define DB8540_PIN_B13         _GPIO(229)
-#define DB8540_PIN_C12         _GPIO(230)
-#define DB8540_PIN_B14         _GPIO(231)
-#define DB8540_PIN_E11         _GPIO(232)
-/* Hole */
-#define DB8540_PIN_D12         _GPIO(256)
-#define DB8540_PIN_D15         _GPIO(257)
-#define DB8540_PIN_C13         _GPIO(258)
-#define DB8540_PIN_C14         _GPIO(259)
-#define DB8540_PIN_C18         _GPIO(260)
-#define DB8540_PIN_C16         _GPIO(261)
-#define DB8540_PIN_B16         _GPIO(262)
-#define DB8540_PIN_D18         _GPIO(263)
-#define DB8540_PIN_C15         _GPIO(264)
-#define DB8540_PIN_C17         _GPIO(265)
-#define DB8540_PIN_B17         _GPIO(266)
-#define DB8540_PIN_D17         _GPIO(267)
-
-/*
- * The names of the pins are denoted by GPIO number and ball name, even
- * though they can be used for other things than GPIO, this is the first
- * column in the table of the data sheet and often used on schematics and
- * such.
- */
-static const struct pinctrl_pin_desc nmk_db8540_pins[] = {
-       PINCTRL_PIN(DB8540_PIN_AH6, "GPIO0_AH6"),
-       PINCTRL_PIN(DB8540_PIN_AG7, "GPIO1_AG7"),
-       PINCTRL_PIN(DB8540_PIN_AF2, "GPIO2_AF2"),
-       PINCTRL_PIN(DB8540_PIN_AD3, "GPIO3_AD3"),
-       PINCTRL_PIN(DB8540_PIN_AF6, "GPIO4_AF6"),
-       PINCTRL_PIN(DB8540_PIN_AG6, "GPIO5_AG6"),
-       PINCTRL_PIN(DB8540_PIN_AD5, "GPIO6_AD5"),
-       PINCTRL_PIN(DB8540_PIN_AF7, "GPIO7_AF7"),
-       PINCTRL_PIN(DB8540_PIN_AG5, "GPIO8_AG5"),
-       PINCTRL_PIN(DB8540_PIN_AH5, "GPIO9_AH5"),
-       PINCTRL_PIN(DB8540_PIN_AE4, "GPIO10_AE4"),
-       PINCTRL_PIN(DB8540_PIN_AD1, "GPIO11_AD1"),
-       PINCTRL_PIN(DB8540_PIN_AD2, "GPIO12_AD2"),
-       PINCTRL_PIN(DB8540_PIN_AC2, "GPIO13_AC2"),
-       PINCTRL_PIN(DB8540_PIN_AC4, "GPIO14_AC4"),
-       PINCTRL_PIN(DB8540_PIN_AC3, "GPIO15_AC3"),
-       PINCTRL_PIN(DB8540_PIN_AH7, "GPIO16_AH7"),
-       PINCTRL_PIN(DB8540_PIN_AE7, "GPIO17_AE7"),
-       /* Hole */
-       PINCTRL_PIN(DB8540_PIN_AF8, "GPIO22_AF8"),
-       PINCTRL_PIN(DB8540_PIN_AH11, "GPIO23_AH11"),
-       PINCTRL_PIN(DB8540_PIN_AG11, "GPIO24_AG11"),
-       PINCTRL_PIN(DB8540_PIN_AF11, "GPIO25_AF11"),
-       PINCTRL_PIN(DB8540_PIN_AH10, "GPIO26_AH10"),
-       PINCTRL_PIN(DB8540_PIN_AG10, "GPIO27_AG10"),
-       PINCTRL_PIN(DB8540_PIN_AF10, "GPIO28_AF10"),
-       /* Hole */
-       PINCTRL_PIN(DB8540_PIN_AD4, "GPIO33_AD4"),
-       PINCTRL_PIN(DB8540_PIN_AF3, "GPIO34_AF3"),
-       PINCTRL_PIN(DB8540_PIN_AF5, "GPIO35_AF5"),
-       PINCTRL_PIN(DB8540_PIN_AG4, "GPIO36_AG4"),
-       PINCTRL_PIN(DB8540_PIN_AF9, "GPIO37_AF9"),
-       PINCTRL_PIN(DB8540_PIN_AE8, "GPIO38_AE8"),
-       /* Hole */
-       PINCTRL_PIN(DB8540_PIN_M26, "GPIO64_M26"),
-       PINCTRL_PIN(DB8540_PIN_M25, "GPIO65_M25"),
-       PINCTRL_PIN(DB8540_PIN_M27, "GPIO66_M27"),
-       PINCTRL_PIN(DB8540_PIN_N25, "GPIO67_N25"),
-       /* Hole */
-       PINCTRL_PIN(DB8540_PIN_M28, "GPIO70_M28"),
-       PINCTRL_PIN(DB8540_PIN_N26, "GPIO71_N26"),
-       PINCTRL_PIN(DB8540_PIN_M22, "GPIO72_M22"),
-       PINCTRL_PIN(DB8540_PIN_N22, "GPIO73_N22"),
-       PINCTRL_PIN(DB8540_PIN_N27, "GPIO74_N27"),
-       PINCTRL_PIN(DB8540_PIN_N28, "GPIO75_N28"),
-       PINCTRL_PIN(DB8540_PIN_P22, "GPIO76_P22"),
-       PINCTRL_PIN(DB8540_PIN_P28, "GPIO77_P28"),
-       PINCTRL_PIN(DB8540_PIN_P26, "GPIO78_P26"),
-       PINCTRL_PIN(DB8540_PIN_T22, "GPIO79_T22"),
-       PINCTRL_PIN(DB8540_PIN_R27, "GPIO80_R27"),
-       PINCTRL_PIN(DB8540_PIN_P27, "GPIO81_P27"),
-       PINCTRL_PIN(DB8540_PIN_R26, "GPIO82_R26"),
-       PINCTRL_PIN(DB8540_PIN_R25, "GPIO83_R25"),
-       PINCTRL_PIN(DB8540_PIN_U22, "GPIO84_U22"),
-       PINCTRL_PIN(DB8540_PIN_T27, "GPIO85_T27"),
-       PINCTRL_PIN(DB8540_PIN_T25, "GPIO86_T25"),
-       PINCTRL_PIN(DB8540_PIN_T26, "GPIO87_T26"),
-       /* Hole */
-       PINCTRL_PIN(DB8540_PIN_AF20, "GPIO116_AF20"),
-       PINCTRL_PIN(DB8540_PIN_AG21, "GPIO117_AG21"),
-       PINCTRL_PIN(DB8540_PIN_AH19, "GPIO118_AH19"),
-       PINCTRL_PIN(DB8540_PIN_AE19, "GPIO119_AE19"),
-       PINCTRL_PIN(DB8540_PIN_AG18, "GPIO120_AG18"),
-       PINCTRL_PIN(DB8540_PIN_AH17, "GPIO121_AH17"),
-       PINCTRL_PIN(DB8540_PIN_AF19, "GPIO122_AF19"),
-       PINCTRL_PIN(DB8540_PIN_AF18, "GPIO123_AF18"),
-       PINCTRL_PIN(DB8540_PIN_AE18, "GPIO124_AE18"),
-       PINCTRL_PIN(DB8540_PIN_AG17, "GPIO125_AG17"),
-       PINCTRL_PIN(DB8540_PIN_AF17, "GPIO126_AF17"),
-       PINCTRL_PIN(DB8540_PIN_AE17, "GPIO127_AE17"),
-       PINCTRL_PIN(DB8540_PIN_AC27, "GPIO128_AC27"),
-       PINCTRL_PIN(DB8540_PIN_AD27, "GPIO129_AD27"),
-       PINCTRL_PIN(DB8540_PIN_AE28, "GPIO130_AE28"),
-       PINCTRL_PIN(DB8540_PIN_AG26, "GPIO131_AG26"),
-       PINCTRL_PIN(DB8540_PIN_AF25, "GPIO132_AF25"),
-       PINCTRL_PIN(DB8540_PIN_AE27, "GPIO133_AE27"),
-       PINCTRL_PIN(DB8540_PIN_AF27, "GPIO134_AF27"),
-       PINCTRL_PIN(DB8540_PIN_AG28, "GPIO135_AG28"),
-       PINCTRL_PIN(DB8540_PIN_AF28, "GPIO136_AF28"),
-       PINCTRL_PIN(DB8540_PIN_AG25, "GPIO137_AG25"),
-       PINCTRL_PIN(DB8540_PIN_AG24, "GPIO138_AG24"),
-       PINCTRL_PIN(DB8540_PIN_AD25, "GPIO139_AD25"),
-       PINCTRL_PIN(DB8540_PIN_AH25, "GPIO140_AH25"),
-       PINCTRL_PIN(DB8540_PIN_AF26, "GPIO141_AF26"),
-       PINCTRL_PIN(DB8540_PIN_AF23, "GPIO142_AF23"),
-       PINCTRL_PIN(DB8540_PIN_AG23, "GPIO143_AG23"),
-       PINCTRL_PIN(DB8540_PIN_AE25, "GPIO144_AE25"),
-       PINCTRL_PIN(DB8540_PIN_AH24, "GPIO145_AH24"),
-       PINCTRL_PIN(DB8540_PIN_AJ25, "GPIO146_AJ25"),
-       PINCTRL_PIN(DB8540_PIN_AG27, "GPIO147_AG27"),
-       PINCTRL_PIN(DB8540_PIN_AH23, "GPIO148_AH23"),
-       PINCTRL_PIN(DB8540_PIN_AE26, "GPIO149_AE26"),
-       PINCTRL_PIN(DB8540_PIN_AE24, "GPIO150_AE24"),
-       PINCTRL_PIN(DB8540_PIN_AJ24, "GPIO151_AJ24"),
-       PINCTRL_PIN(DB8540_PIN_AE21, "GPIO152_AE21"),
-       PINCTRL_PIN(DB8540_PIN_AG22, "GPIO153_AG22"),
-       PINCTRL_PIN(DB8540_PIN_AF21, "GPIO154_AF21"),
-       PINCTRL_PIN(DB8540_PIN_AF24, "GPIO155_AF24"),
-       PINCTRL_PIN(DB8540_PIN_AH22, "GPIO156_AH22"),
-       PINCTRL_PIN(DB8540_PIN_AJ23, "GPIO157_AJ23"),
-       PINCTRL_PIN(DB8540_PIN_AH21, "GPIO158_AH21"),
-       PINCTRL_PIN(DB8540_PIN_AG20, "GPIO159_AG20"),
-       PINCTRL_PIN(DB8540_PIN_AE23, "GPIO160_AE23"),
-       PINCTRL_PIN(DB8540_PIN_AH20, "GPIO161_AH20"),
-       PINCTRL_PIN(DB8540_PIN_AG19, "GPIO162_AG19"),
-       PINCTRL_PIN(DB8540_PIN_AF22, "GPIO163_AF22"),
-       PINCTRL_PIN(DB8540_PIN_AJ21, "GPIO164_AJ21"),
-       PINCTRL_PIN(DB8540_PIN_AD26, "GPIO165_AD26"),
-       PINCTRL_PIN(DB8540_PIN_AD28, "GPIO166_AD28"),
-       PINCTRL_PIN(DB8540_PIN_AC28, "GPIO167_AC28"),
-       PINCTRL_PIN(DB8540_PIN_AC26, "GPIO168_AC26"),
-       /* Hole */
-       PINCTRL_PIN(DB8540_PIN_J3, "GPIO192_J3"),
-       PINCTRL_PIN(DB8540_PIN_H1, "GPIO193_H1"),
-       PINCTRL_PIN(DB8540_PIN_J2, "GPIO194_J2"),
-       PINCTRL_PIN(DB8540_PIN_H2, "GPIO195_H2"),
-       PINCTRL_PIN(DB8540_PIN_H3, "GPIO196_H3"),
-       PINCTRL_PIN(DB8540_PIN_H4, "GPIO197_H4"),
-       PINCTRL_PIN(DB8540_PIN_G2, "GPIO198_G2"),
-       PINCTRL_PIN(DB8540_PIN_G3, "GPIO199_G3"),
-       PINCTRL_PIN(DB8540_PIN_G4, "GPIO200_G4"),
-       PINCTRL_PIN(DB8540_PIN_F2, "GPIO201_F2"),
-       PINCTRL_PIN(DB8540_PIN_C6, "GPIO202_C6"),
-       PINCTRL_PIN(DB8540_PIN_B6, "GPIO203_B6"),
-       PINCTRL_PIN(DB8540_PIN_B7, "GPIO204_B7"),
-       PINCTRL_PIN(DB8540_PIN_A7, "GPIO205_A7"),
-       PINCTRL_PIN(DB8540_PIN_D7, "GPIO206_D7"),
-       PINCTRL_PIN(DB8540_PIN_D8, "GPIO207_D8"),
-       PINCTRL_PIN(DB8540_PIN_F3, "GPIO208_F3"),
-       PINCTRL_PIN(DB8540_PIN_E2, "GPIO209_E2"),
-       PINCTRL_PIN(DB8540_PIN_C7, "GPIO210_C7"),
-       PINCTRL_PIN(DB8540_PIN_B8, "GPIO211_B8"),
-       PINCTRL_PIN(DB8540_PIN_C10, "GPIO212_C10"),
-       PINCTRL_PIN(DB8540_PIN_C8, "GPIO213_C8"),
-       PINCTRL_PIN(DB8540_PIN_C9, "GPIO214_C9"),
-       /* Hole */
-       PINCTRL_PIN(DB8540_PIN_B9, "GPIO219_B9"),
-       PINCTRL_PIN(DB8540_PIN_A10, "GPIO220_A10"),
-       PINCTRL_PIN(DB8540_PIN_D9, "GPIO221_D9"),
-       PINCTRL_PIN(DB8540_PIN_B11, "GPIO222_B11"),
-       PINCTRL_PIN(DB8540_PIN_B10, "GPIO223_B10"),
-       PINCTRL_PIN(DB8540_PIN_E10, "GPIO224_E10"),
-       PINCTRL_PIN(DB8540_PIN_B12, "GPIO225_B12"),
-       PINCTRL_PIN(DB8540_PIN_D10, "GPIO226_D10"),
-       PINCTRL_PIN(DB8540_PIN_D11, "GPIO227_D11"),
-       PINCTRL_PIN(DB8540_PIN_AJ6, "GPIO228_AJ6"),
-       PINCTRL_PIN(DB8540_PIN_B13, "GPIO229_B13"),
-       PINCTRL_PIN(DB8540_PIN_C12, "GPIO230_C12"),
-       PINCTRL_PIN(DB8540_PIN_B14, "GPIO231_B14"),
-       PINCTRL_PIN(DB8540_PIN_E11, "GPIO232_E11"),
-       /* Hole */
-       PINCTRL_PIN(DB8540_PIN_D12, "GPIO256_D12"),
-       PINCTRL_PIN(DB8540_PIN_D15, "GPIO257_D15"),
-       PINCTRL_PIN(DB8540_PIN_C13, "GPIO258_C13"),
-       PINCTRL_PIN(DB8540_PIN_C14, "GPIO259_C14"),
-       PINCTRL_PIN(DB8540_PIN_C18, "GPIO260_C18"),
-       PINCTRL_PIN(DB8540_PIN_C16, "GPIO261_C16"),
-       PINCTRL_PIN(DB8540_PIN_B16, "GPIO262_B16"),
-       PINCTRL_PIN(DB8540_PIN_D18, "GPIO263_D18"),
-       PINCTRL_PIN(DB8540_PIN_C15, "GPIO264_C15"),
-       PINCTRL_PIN(DB8540_PIN_C17, "GPIO265_C17"),
-       PINCTRL_PIN(DB8540_PIN_B17, "GPIO266_B17"),
-       PINCTRL_PIN(DB8540_PIN_D17, "GPIO267_D17"),
-};
-
-#define DB8540_GPIO_RANGE(a, b, c) { .name = "db8540", .id = a, .base = b, \
-                       .pin_base = b, .npins = c }
-
-/*
- * This matches the 32-pin gpio chips registered by the GPIO portion. This
- * cannot be const since we assign the struct gpio_chip * pointer at runtime.
- */
-static struct pinctrl_gpio_range nmk_db8540_ranges[] = {
-       DB8540_GPIO_RANGE(0, 0, 18),
-       DB8540_GPIO_RANGE(0, 22, 7),
-       DB8540_GPIO_RANGE(1, 33, 6),
-       DB8540_GPIO_RANGE(2, 64, 4),
-       DB8540_GPIO_RANGE(2, 70, 18),
-       DB8540_GPIO_RANGE(3, 116, 12),
-       DB8540_GPIO_RANGE(4, 128, 32),
-       DB8540_GPIO_RANGE(5, 160, 9),
-       DB8540_GPIO_RANGE(6, 192, 23),
-       DB8540_GPIO_RANGE(6, 219, 5),
-       DB8540_GPIO_RANGE(7, 224, 9),
-       DB8540_GPIO_RANGE(8, 256, 12),
-};
-
-/*
- * Read the pin group names like this:
- * u0_a_1    = first groups of pins for uart0 on alt function a
- * i2c2_b_2  = second group of pins for i2c2 on alt function b
- *
- * The groups are arranged as sets per altfunction column, so we can
- * mux in one group at a time by selecting the same altfunction for them
- * all. When functions require pins on different altfunctions, you need
- * to combine several groups.
- */
-
-/* Altfunction A column */
-static const unsigned u0_a_1_pins[] = { DB8540_PIN_AH6, DB8540_PIN_AG7,
-                                       DB8540_PIN_AF2, DB8540_PIN_AD3 };
-static const unsigned u1rxtx_a_1_pins[] = { DB8540_PIN_AF6, DB8540_PIN_AG6 };
-static const unsigned u1ctsrts_a_1_pins[] = { DB8540_PIN_AD5, DB8540_PIN_AF7 };
-/* Image processor I2C line, this is driven by image processor firmware */
-static const unsigned ipi2c_a_1_pins[] = { DB8540_PIN_AG5, DB8540_PIN_AH5 };
-static const unsigned ipi2c_a_2_pins[] = { DB8540_PIN_AE4, DB8540_PIN_AD1 };
-/* MSP0 can only be on these pins, but TXD and RXD can be flipped */
-static const unsigned msp0txrx_a_1_pins[] = { DB8540_PIN_AD2, DB8540_PIN_AC3 };
-static const unsigned msp0tfstck_a_1_pins[] = { DB8540_PIN_AC2,
-       DB8540_PIN_AC4 };
-static const unsigned msp0rfsrck_a_1_pins[] = { DB8540_PIN_AH7,
-       DB8540_PIN_AE7 };
-/* Basic pins of the MMC/SD card 0 interface */
-static const unsigned mc0_a_1_pins[] = { DB8540_PIN_AH11, DB8540_PIN_AG11,
-       DB8540_PIN_AF11, DB8540_PIN_AH10, DB8540_PIN_AG10, DB8540_PIN_AF10};
-/* MSP1 can only be on these pins, but TXD and RXD can be flipped */
-static const unsigned msp1txrx_a_1_pins[] = { DB8540_PIN_AD4, DB8540_PIN_AG4 };
-static const unsigned msp1_a_1_pins[] = { DB8540_PIN_AF3, DB8540_PIN_AF5 };
-
-static const unsigned modobsclk_a_1_pins[] = { DB8540_PIN_AF9 };
-static const unsigned clkoutreq_a_1_pins[] = { DB8540_PIN_AE8 };
-/* LCD interface */
-static const unsigned lcdb_a_1_pins[] = { DB8540_PIN_M26, DB8540_PIN_M25,
-       DB8540_PIN_M27, DB8540_PIN_N25 };
-static const unsigned lcdvsi0_a_1_pins[] = { DB8540_PIN_AJ24 };
-static const unsigned lcdvsi1_a_1_pins[] = { DB8540_PIN_AE21 };
-static const unsigned lcd_d0_d7_a_1_pins[] = { DB8540_PIN_M28, DB8540_PIN_N26,
-       DB8540_PIN_M22, DB8540_PIN_N22, DB8540_PIN_N27, DB8540_PIN_N28,
-       DB8540_PIN_P22, DB8540_PIN_P28 };
-/* D8 thru D11 often used as TVOUT lines */
-static const unsigned lcd_d8_d11_a_1_pins[] = { DB8540_PIN_P26, DB8540_PIN_T22,
-       DB8540_PIN_R27, DB8540_PIN_P27 };
-static const unsigned lcd_d12_d23_a_1_pins[] = { DB8540_PIN_R26, DB8540_PIN_R25,
-       DB8540_PIN_U22, DB8540_PIN_T27, DB8540_PIN_AG22, DB8540_PIN_AF21,
-       DB8540_PIN_AF24, DB8540_PIN_AH22, DB8540_PIN_AJ23, DB8540_PIN_AH21,
-       DB8540_PIN_AG20, DB8540_PIN_AE23 };
-static const unsigned kp_a_1_pins[] = { DB8540_PIN_AH20, DB8540_PIN_AG19,
-       DB8540_PIN_AF22, DB8540_PIN_AJ21, DB8540_PIN_T25, DB8540_PIN_T26 };
-/* MC2 has 8 data lines and no direction control, so only for (e)MMC */
-static const unsigned mc2_a_1_pins[] = { DB8540_PIN_AC27, DB8540_PIN_AD27,
-       DB8540_PIN_AE28, DB8540_PIN_AG26, DB8540_PIN_AF25, DB8540_PIN_AE27,
-       DB8540_PIN_AF27, DB8540_PIN_AG28, DB8540_PIN_AF28, DB8540_PIN_AG25,
-       DB8540_PIN_AG24 };
-static const unsigned ssp1_a_1_pins[] = {  DB8540_PIN_AD25, DB8540_PIN_AH25,
-       DB8540_PIN_AF26, DB8540_PIN_AF23 };
-static const unsigned ssp0_a_1_pins[] = { DB8540_PIN_AG23, DB8540_PIN_AE25,
-       DB8540_PIN_AH24, DB8540_PIN_AJ25 };
-static const unsigned i2c0_a_1_pins[] = { DB8540_PIN_AG27, DB8540_PIN_AH23 };
-/*
- * Image processor GPIO pins are named "ipgpio" and have their own
- * numberspace
- */
-static const unsigned ipgpio0_a_1_pins[] = { DB8540_PIN_AE26 };
-static const unsigned ipgpio1_a_1_pins[] = { DB8540_PIN_AE24 };
-/* modem i2s interface */
-static const unsigned modi2s_a_1_pins[] = { DB8540_PIN_AD26, DB8540_PIN_AD28,
-       DB8540_PIN_AC28, DB8540_PIN_AC26 };
-static const unsigned spi2_a_1_pins[] = { DB8540_PIN_AF20, DB8540_PIN_AG21,
-       DB8540_PIN_AH19, DB8540_PIN_AE19 };
-static const unsigned u2txrx_a_1_pins[] = { DB8540_PIN_AG18, DB8540_PIN_AH17 };
-static const unsigned u2ctsrts_a_1_pins[] = { DB8540_PIN_AF19,
-       DB8540_PIN_AF18 };
-static const unsigned modsmb_a_1_pins[] = { DB8540_PIN_AF17, DB8540_PIN_AE17 };
-static const unsigned msp2sck_a_1_pins[] = { DB8540_PIN_J3 };
-static const unsigned msp2txdtcktfs_a_1_pins[] = { DB8540_PIN_H1, DB8540_PIN_J2,
-       DB8540_PIN_H2 };
-static const unsigned msp2rxd_a_1_pins[] = { DB8540_PIN_H3 };
-static const unsigned mc4_a_1_pins[] = { DB8540_PIN_H4, DB8540_PIN_G2,
-       DB8540_PIN_G3, DB8540_PIN_G4, DB8540_PIN_F2, DB8540_PIN_C6,
-       DB8540_PIN_B6, DB8540_PIN_B7, DB8540_PIN_A7, DB8540_PIN_D7,
-       DB8540_PIN_D8 };
-static const unsigned mc1_a_1_pins[] = { DB8540_PIN_F3, DB8540_PIN_E2,
-       DB8540_PIN_C7, DB8540_PIN_B8, DB8540_PIN_C10, DB8540_PIN_C8,
-       DB8540_PIN_C9 };
-/* mc1_a_2_pins exclude MC1_FBCLK */
-static const unsigned mc1_a_2_pins[] = { DB8540_PIN_F3,        DB8540_PIN_C7,
-       DB8540_PIN_B8, DB8540_PIN_C10, DB8540_PIN_C8,
-       DB8540_PIN_C9 };
-static const unsigned hsir_a_1_pins[] = { DB8540_PIN_B9, DB8540_PIN_A10,
-       DB8540_PIN_D9 };
-static const unsigned hsit_a_1_pins[] = { DB8540_PIN_B11, DB8540_PIN_B10,
-       DB8540_PIN_E10, DB8540_PIN_B12, DB8540_PIN_D10 };
-static const unsigned hsit_a_2_pins[] = { DB8540_PIN_B11, DB8540_PIN_B10,
-       DB8540_PIN_E10, DB8540_PIN_B12 };
-static const unsigned clkout1_a_1_pins[] = { DB8540_PIN_D11 };
-static const unsigned clkout1_a_2_pins[] = { DB8540_PIN_B13 };
-static const unsigned clkout2_a_1_pins[] = { DB8540_PIN_AJ6 };
-static const unsigned clkout2_a_2_pins[] = { DB8540_PIN_C12 };
-static const unsigned msp4_a_1_pins[] = { DB8540_PIN_B14, DB8540_PIN_E11 };
-static const unsigned usb_a_1_pins[] = { DB8540_PIN_D12, DB8540_PIN_D15,
-       DB8540_PIN_C13, DB8540_PIN_C14, DB8540_PIN_C18, DB8540_PIN_C16,
-       DB8540_PIN_B16, DB8540_PIN_D18, DB8540_PIN_C15, DB8540_PIN_C17,
-       DB8540_PIN_B17, DB8540_PIN_D17 };
-/* Altfunction B colum */
-static const unsigned apetrig_b_1_pins[] = { DB8540_PIN_AH6, DB8540_PIN_AG7 };
-static const unsigned modtrig_b_1_pins[] = { DB8540_PIN_AF2, DB8540_PIN_AD3 };
-static const unsigned i2c4_b_1_pins[] = { DB8540_PIN_AF6, DB8540_PIN_AG6 };
-static const unsigned i2c1_b_1_pins[] = { DB8540_PIN_AD5, DB8540_PIN_AF7 };
-static const unsigned i2c2_b_1_pins[] = { DB8540_PIN_AG5, DB8540_PIN_AH5 };
-static const unsigned i2c2_b_2_pins[] = { DB8540_PIN_AE4, DB8540_PIN_AD1 };
-static const unsigned msp0txrx_b_1_pins[] = { DB8540_PIN_AD2, DB8540_PIN_AC3 };
-static const unsigned i2c1_b_2_pins[] = { DB8540_PIN_AH7, DB8540_PIN_AE7 };
-static const unsigned stmmod_b_1_pins[] = { DB8540_PIN_AH11, DB8540_PIN_AF11,
-       DB8540_PIN_AH10, DB8540_PIN_AG10, DB8540_PIN_AF10 };
-static const unsigned moduartstmmux_b_1_pins[] = { DB8540_PIN_AG11 };
-static const unsigned msp1txrx_b_1_pins[] = { DB8540_PIN_AD4, DB8540_PIN_AG4 };
-static const unsigned kp_b_1_pins[] = { DB8540_PIN_AJ24, DB8540_PIN_AE21,
-       DB8540_PIN_M26, DB8540_PIN_M25, DB8540_PIN_M27, DB8540_PIN_N25,
-       DB8540_PIN_M28, DB8540_PIN_N26, DB8540_PIN_M22, DB8540_PIN_N22,
-       DB8540_PIN_N27, DB8540_PIN_N28, DB8540_PIN_P22, DB8540_PIN_P28,
-       DB8540_PIN_P26, DB8540_PIN_T22, DB8540_PIN_R27, DB8540_PIN_P27,
-       DB8540_PIN_R26, DB8540_PIN_R25 };
-static const unsigned u2txrx_b_1_pins[] = { DB8540_PIN_U22, DB8540_PIN_T27 };
-static const unsigned sm_b_1_pins[] = { DB8540_PIN_AG22, DB8540_PIN_AF21,
-       DB8540_PIN_AF24, DB8540_PIN_AH22, DB8540_PIN_AJ23, DB8540_PIN_AH21,
-       DB8540_PIN_AG20, DB8540_PIN_AE23, DB8540_PIN_AH20, DB8540_PIN_AF22,
-       DB8540_PIN_AJ21, DB8540_PIN_AC27, DB8540_PIN_AD27, DB8540_PIN_AE28,
-       DB8540_PIN_AG26, DB8540_PIN_AF25, DB8540_PIN_AE27, DB8540_PIN_AF27,
-       DB8540_PIN_AG28, DB8540_PIN_AF28, DB8540_PIN_AG25, DB8540_PIN_AG24,
-       DB8540_PIN_AD25 };
-static const unsigned smcs0_b_1_pins[] = { DB8540_PIN_AG19 };
-static const unsigned smcs1_b_1_pins[] = { DB8540_PIN_AE26 };
-static const unsigned ipgpio7_b_1_pins[] = { DB8540_PIN_AH25 };
-static const unsigned ipgpio2_b_1_pins[] = { DB8540_PIN_AF26 };
-static const unsigned ipgpio3_b_1_pins[] = { DB8540_PIN_AF23 };
-static const unsigned i2c6_b_1_pins[] = { DB8540_PIN_AG23, DB8540_PIN_AE25 };
-static const unsigned i2c5_b_1_pins[] = { DB8540_PIN_AH24, DB8540_PIN_AJ25 };
-static const unsigned u3txrx_b_1_pins[] = { DB8540_PIN_AF20, DB8540_PIN_AG21 };
-static const unsigned u3ctsrts_b_1_pins[] = { DB8540_PIN_AH19,
-       DB8540_PIN_AE19 };
-static const unsigned i2c5_b_2_pins[] = { DB8540_PIN_AG18, DB8540_PIN_AH17 };
-static const unsigned i2c4_b_2_pins[] = { DB8540_PIN_AF19, DB8540_PIN_AF18 };
-static const unsigned u4txrx_b_1_pins[] = { DB8540_PIN_AE18, DB8540_PIN_AG17 };
-static const unsigned u4ctsrts_b_1_pins[] = { DB8540_PIN_AF17,
-       DB8540_PIN_AE17 };
-static const unsigned ddrtrig_b_1_pins[] = { DB8540_PIN_J3 };
-static const unsigned msp4_b_1_pins[] = { DB8540_PIN_H3 };
-static const unsigned pwl_b_1_pins[] = { DB8540_PIN_C6 };
-static const unsigned spi1_b_1_pins[] = { DB8540_PIN_E2, DB8540_PIN_C10,
-       DB8540_PIN_C8, DB8540_PIN_C9 };
-static const unsigned mc3_b_1_pins[] = { DB8540_PIN_B9, DB8540_PIN_A10,
-       DB8540_PIN_D9, DB8540_PIN_B11, DB8540_PIN_B10, DB8540_PIN_E10,
-       DB8540_PIN_B12 };
-static const unsigned pwl_b_2_pins[] = { DB8540_PIN_D10 };
-static const unsigned pwl_b_3_pins[] = { DB8540_PIN_B13 };
-static const unsigned pwl_b_4_pins[] = { DB8540_PIN_C12 };
-static const unsigned u2txrx_b_2_pins[] = { DB8540_PIN_B17, DB8540_PIN_D17 };
-
-/* Altfunction C column */
-static const unsigned ipgpio6_c_1_pins[] = { DB8540_PIN_AG6 };
-static const unsigned ipgpio0_c_1_pins[] = { DB8540_PIN_AD5 };
-static const unsigned ipgpio1_c_1_pins[] = { DB8540_PIN_AF7 };
-static const unsigned ipgpio3_c_1_pins[] = { DB8540_PIN_AE4 };
-static const unsigned ipgpio2_c_1_pins[] = { DB8540_PIN_AD1 };
-static const unsigned u0_c_1_pins[] = { DB8540_PIN_AD4, DB8540_PIN_AF3,
-       DB8540_PIN_AF5, DB8540_PIN_AG4 };
-static const unsigned smcleale_c_1_pins[] = { DB8540_PIN_AJ24,
-       DB8540_PIN_AE21 };
-static const unsigned ipgpio4_c_1_pins[] = { DB8540_PIN_M26 };
-static const unsigned ipgpio5_c_1_pins[] = { DB8540_PIN_M25 };
-static const unsigned ipgpio6_c_2_pins[] = { DB8540_PIN_M27 };
-static const unsigned ipgpio7_c_1_pins[] = { DB8540_PIN_N25 };
-static const unsigned stmape_c_1_pins[] = { DB8540_PIN_M28, DB8540_PIN_N26,
-       DB8540_PIN_M22, DB8540_PIN_N22, DB8540_PIN_N27 };
-static const unsigned u2rxtx_c_1_pins[] = { DB8540_PIN_N28, DB8540_PIN_P22 };
-static const unsigned modobsresout_c_1_pins[] = { DB8540_PIN_P28 };
-static const unsigned ipgpio2_c_2_pins[] = { DB8540_PIN_P26 };
-static const unsigned ipgpio3_c_2_pins[] = { DB8540_PIN_T22 };
-static const unsigned ipgpio4_c_2_pins[] = { DB8540_PIN_R27 };
-static const unsigned ipgpio5_c_2_pins[] = { DB8540_PIN_P27 };
-static const unsigned modaccgpo_c_1_pins[] = { DB8540_PIN_R26, DB8540_PIN_R25,
-       DB8540_PIN_U22 };
-static const unsigned modobspwrrst_c_1_pins[] = { DB8540_PIN_T27 };
-static const unsigned mc5_c_1_pins[] = { DB8540_PIN_AG22, DB8540_PIN_AF21,
-       DB8540_PIN_AF24, DB8540_PIN_AH22, DB8540_PIN_AJ23, DB8540_PIN_AH21,
-       DB8540_PIN_AG20, DB8540_PIN_AE23, DB8540_PIN_AH20, DB8540_PIN_AF22,
-       DB8540_PIN_AJ21};
-static const unsigned smps0_c_1_pins[] = { DB8540_PIN_AG19 };
-static const unsigned moduart1_c_1_pins[] = { DB8540_PIN_T25, DB8540_PIN_T26 };
-static const unsigned mc2rstn_c_1_pins[] = { DB8540_PIN_AE28 };
-static const unsigned i2c5_c_1_pins[] = { DB8540_PIN_AG28, DB8540_PIN_AF28 };
-static const unsigned ipgpio0_c_2_pins[] = { DB8540_PIN_AG25 };
-static const unsigned ipgpio1_c_2_pins[] = { DB8540_PIN_AG24 };
-static const unsigned kp_c_1_pins[] = { DB8540_PIN_AD25, DB8540_PIN_AH25,
-       DB8540_PIN_AF26, DB8540_PIN_AF23 };
-static const unsigned modrf_c_1_pins[] = { DB8540_PIN_AG23, DB8540_PIN_AE25,
-       DB8540_PIN_AH24 };
-static const unsigned smps1_c_1_pins[] = { DB8540_PIN_AE26 };
-static const unsigned i2c5_c_2_pins[] = { DB8540_PIN_AH19, DB8540_PIN_AE19 };
-static const unsigned u4ctsrts_c_1_pins[] = { DB8540_PIN_AG18,
-       DB8540_PIN_AH17 };
-static const unsigned u3rxtx_c_1_pins[] = { DB8540_PIN_AF19, DB8540_PIN_AF18 };
-static const unsigned msp4_c_1_pins[] = { DB8540_PIN_J3 };
-static const unsigned mc4rstn_c_1_pins[] = { DB8540_PIN_C6 };
-static const unsigned spi0_c_1_pins[] = { DB8540_PIN_A10, DB8540_PIN_B10,
-       DB8540_PIN_E10, DB8540_PIN_B12 };
-static const unsigned i2c3_c_1_pins[] = { DB8540_PIN_B13, DB8540_PIN_C12 };
-
-/* Other alt C1 column */
-static const unsigned spi3_oc1_1_pins[] = { DB8540_PIN_AG5, DB8540_PIN_AH5,
-       DB8540_PIN_AE4, DB8540_PIN_AD1 };
-static const unsigned stmape_oc1_1_pins[] = { DB8540_PIN_AH11, DB8540_PIN_AF11,
-       DB8540_PIN_AH10, DB8540_PIN_AG10, DB8540_PIN_AF10 };
-static const unsigned u2_oc1_1_pins[] = { DB8540_PIN_AG11 };
-static const unsigned remap0_oc1_1_pins[] = { DB8540_PIN_AJ24 };
-static const unsigned remap1_oc1_1_pins[] = { DB8540_PIN_AE21 };
-static const unsigned modobsrefclk_oc1_1_pins[] = { DB8540_PIN_M26 };
-static const unsigned modobspwrctrl_oc1_1_pins[] = { DB8540_PIN_M25 };
-static const unsigned modobsclkout_oc1_1_pins[] = { DB8540_PIN_M27 };
-static const unsigned moduart1_oc1_1_pins[] = { DB8540_PIN_N25 };
-static const unsigned modprcmudbg_oc1_1_pins[] = { DB8540_PIN_M28,
-       DB8540_PIN_N26, DB8540_PIN_M22, DB8540_PIN_N22, DB8540_PIN_N27,
-       DB8540_PIN_P22, DB8540_PIN_P28, DB8540_PIN_P26, DB8540_PIN_T22,
-       DB8540_PIN_R26, DB8540_PIN_R25, DB8540_PIN_U22, DB8540_PIN_T27,
-       DB8540_PIN_AH20, DB8540_PIN_AG19, DB8540_PIN_AF22, DB8540_PIN_AJ21,
-       DB8540_PIN_T25};
-static const unsigned modobsresout_oc1_1_pins[] = { DB8540_PIN_N28 };
-static const unsigned modaccgpo_oc1_1_pins[] = { DB8540_PIN_R27, DB8540_PIN_P27,
-       DB8540_PIN_T26 };
-static const unsigned kp_oc1_1_pins[] = { DB8540_PIN_AG22, DB8540_PIN_AF21,
-       DB8540_PIN_AF24, DB8540_PIN_AH22, DB8540_PIN_AJ23, DB8540_PIN_AH21,
-       DB8540_PIN_AG20, DB8540_PIN_AE23 };
-static const unsigned modxmip_oc1_1_pins[] = { DB8540_PIN_AD25, DB8540_PIN_AH25,
-       DB8540_PIN_AG23, DB8540_PIN_AE25 };
-static const unsigned i2c6_oc1_1_pins[] = { DB8540_PIN_AE26, DB8540_PIN_AE24 };
-static const unsigned u2txrx_oc1_1_pins[] = { DB8540_PIN_B7, DB8540_PIN_A7 };
-static const unsigned u2ctsrts_oc1_1_pins[] = { DB8540_PIN_D7, DB8540_PIN_D8 };
-
-/* Other alt C2 column */
-static const unsigned sbag_oc2_1_pins[] = { DB8540_PIN_AH11, DB8540_PIN_AG11,
-       DB8540_PIN_AF11, DB8540_PIN_AH10, DB8540_PIN_AG10, DB8540_PIN_AF10 };
-static const unsigned hxclk_oc2_1_pins[] = { DB8540_PIN_M25 };
-static const unsigned modaccuart_oc2_1_pins[] = { DB8540_PIN_N25 };
-static const unsigned stmmod_oc2_1_pins[] = { DB8540_PIN_M28, DB8540_PIN_N26,
-       DB8540_PIN_M22, DB8540_PIN_N22, DB8540_PIN_N27 };
-static const unsigned moduartstmmux_oc2_1_pins[] = { DB8540_PIN_N28 };
-static const unsigned hxgpio_oc2_1_pins[] = { DB8540_PIN_P22, DB8540_PIN_P28,
-       DB8540_PIN_P26, DB8540_PIN_T22, DB8540_PIN_R27, DB8540_PIN_P27,
-       DB8540_PIN_R26, DB8540_PIN_R25 };
-static const unsigned sbag_oc2_2_pins[] = { DB8540_PIN_U22, DB8540_PIN_T27,
-       DB8540_PIN_AG22, DB8540_PIN_AF21, DB8540_PIN_AF24, DB8540_PIN_AH22 };
-static const unsigned modobsservice_oc2_1_pins[] = { DB8540_PIN_AJ23 };
-static const unsigned moduart0_oc2_1_pins[] = { DB8540_PIN_AG20,
-       DB8540_PIN_AE23 };
-static const unsigned stmape_oc2_1_pins[] = { DB8540_PIN_AH20, DB8540_PIN_AG19,
-       DB8540_PIN_AF22, DB8540_PIN_AJ21, DB8540_PIN_T25 };
-static const unsigned u2_oc2_1_pins[] = { DB8540_PIN_T26, DB8540_PIN_AH21 };
-static const unsigned modxmip_oc2_1_pins[] = { DB8540_PIN_AE26,
-       DB8540_PIN_AE24 };
-
-/* Other alt C3 column */
-static const unsigned modaccgpo_oc3_1_pins[] = { DB8540_PIN_AG11 };
-static const unsigned tpui_oc3_1_pins[] = { DB8540_PIN_M26, DB8540_PIN_M25,
-       DB8540_PIN_M27, DB8540_PIN_N25, DB8540_PIN_M28, DB8540_PIN_N26,
-       DB8540_PIN_M22, DB8540_PIN_N22, DB8540_PIN_N27, DB8540_PIN_N28,
-       DB8540_PIN_P22, DB8540_PIN_P28, DB8540_PIN_P26, DB8540_PIN_T22,
-       DB8540_PIN_R27, DB8540_PIN_P27, DB8540_PIN_R26, DB8540_PIN_R25,
-       DB8540_PIN_U22, DB8540_PIN_T27, DB8540_PIN_AG22, DB8540_PIN_AF21,
-       DB8540_PIN_AF24, DB8540_PIN_AH22, DB8540_PIN_AJ23, DB8540_PIN_AH21,
-       DB8540_PIN_AG20, DB8540_PIN_AE23, DB8540_PIN_AH20, DB8540_PIN_AG19,
-       DB8540_PIN_AF22, DB8540_PIN_AJ21, DB8540_PIN_T25, DB8540_PIN_T26 };
-
-/* Other alt C4 column */
-static const unsigned hwobs_oc4_1_pins[] = { DB8540_PIN_M26, DB8540_PIN_M25,
-       DB8540_PIN_M27, DB8540_PIN_N25, DB8540_PIN_M28, DB8540_PIN_N26,
-       DB8540_PIN_M22, DB8540_PIN_N22, DB8540_PIN_N27, DB8540_PIN_N28,
-       DB8540_PIN_P22, DB8540_PIN_P28, DB8540_PIN_P26, DB8540_PIN_T22,
-       DB8540_PIN_R27, DB8540_PIN_P27, DB8540_PIN_R26, DB8540_PIN_R25 };
-static const unsigned moduart1txrx_oc4_1_pins[] = { DB8540_PIN_U22,
-       DB8540_PIN_T27 };
-static const unsigned moduart1rtscts_oc4_1_pins[] = { DB8540_PIN_AG22,
-       DB8540_PIN_AF21 };
-static const unsigned modaccuarttxrx_oc4_1_pins[] = { DB8540_PIN_AF24,
-       DB8540_PIN_AH22 };
-static const unsigned modaccuartrtscts_oc4_1_pins[] = { DB8540_PIN_AJ23,
-       DB8540_PIN_AH21 };
-static const unsigned stmmod_oc4_1_pins[] = { DB8540_PIN_AH20, DB8540_PIN_AG19,
-       DB8540_PIN_AF22, DB8540_PIN_AJ21, DB8540_PIN_T25 };
-static const unsigned moduartstmmux_oc4_1_pins[] = { DB8540_PIN_T26 };
-
-#define DB8540_PIN_GROUP(a, b) { .name = #a, .pins = a##_pins,         \
-                       .npins = ARRAY_SIZE(a##_pins), .altsetting = b }
-
-static const struct nmk_pingroup nmk_db8540_groups[] = {
-       /* Altfunction A column */
-       DB8540_PIN_GROUP(u0_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(u1rxtx_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(u1ctsrts_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(ipi2c_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(ipi2c_a_2, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(msp0txrx_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(msp0tfstck_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(msp0rfsrck_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(mc0_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(msp1txrx_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(msp1_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(modobsclk_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(clkoutreq_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(lcdb_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(lcdvsi0_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(lcdvsi1_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(lcd_d0_d7_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(lcd_d8_d11_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(lcd_d12_d23_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(kp_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(mc2_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(ssp1_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(ssp0_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(i2c0_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(ipgpio0_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(ipgpio1_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(modi2s_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(spi2_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(u2txrx_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(u2ctsrts_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(modsmb_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(msp2sck_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(msp2txdtcktfs_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(msp2rxd_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(mc4_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(mc1_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(hsir_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(hsit_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(hsit_a_2, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(clkout1_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(clkout1_a_2, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(clkout2_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(clkout2_a_2, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(msp4_a_1, NMK_GPIO_ALT_A),
-       DB8540_PIN_GROUP(usb_a_1, NMK_GPIO_ALT_A),
-       /* Altfunction B column */
-       DB8540_PIN_GROUP(apetrig_b_1, NMK_GPIO_ALT_B),
-       DB8540_PIN_GROUP(modtrig_b_1, NMK_GPIO_ALT_B),
-       DB8540_PIN_GROUP(i2c4_b_1, NMK_GPIO_ALT_B),
-       DB8540_PIN_GROUP(i2c1_b_1, NMK_GPIO_ALT_B),
-       DB8540_PIN_GROUP(i2c2_b_1, NMK_GPIO_ALT_B),
-       DB8540_PIN_GROUP(i2c2_b_2, NMK_GPIO_ALT_B),
-       DB8540_PIN_GROUP(msp0txrx_b_1, NMK_GPIO_ALT_B),
-       DB8540_PIN_GROUP(i2c1_b_2, NMK_GPIO_ALT_B),
-       DB8540_PIN_GROUP(stmmod_b_1, NMK_GPIO_ALT_B),
-       DB8540_PIN_GROUP(moduartstmmux_b_1, NMK_GPIO_ALT_B),
-       DB8540_PIN_GROUP(msp1txrx_b_1, NMK_GPIO_ALT_B),
-       DB8540_PIN_GROUP(kp_b_1, NMK_GPIO_ALT_B),
-       DB8540_PIN_GROUP(u2txrx_b_1, NMK_GPIO_ALT_B),
-       DB8540_PIN_GROUP(sm_b_1, NMK_GPIO_ALT_B),
-       DB8540_PIN_GROUP(smcs0_b_1, NMK_GPIO_ALT_B),
-       DB8540_PIN_GROUP(smcs1_b_1, NMK_GPIO_ALT_B),
-       DB8540_PIN_GROUP(ipgpio7_b_1, NMK_GPIO_ALT_B),
-       DB8540_PIN_GROUP(ipgpio2_b_1, NMK_GPIO_ALT_B),
-       DB8540_PIN_GROUP(ipgpio3_b_1, NMK_GPIO_ALT_B),
-       DB8540_PIN_GROUP(i2c6_b_1, NMK_GPIO_ALT_B),
-       DB8540_PIN_GROUP(i2c5_b_1, NMK_GPIO_ALT_B),
-       DB8540_PIN_GROUP(u3txrx_b_1, NMK_GPIO_ALT_B),
-       DB8540_PIN_GROUP(u3ctsrts_b_1, NMK_GPIO_ALT_B),
-       DB8540_PIN_GROUP(i2c5_b_2, NMK_GPIO_ALT_B),
-       DB8540_PIN_GROUP(i2c4_b_2, NMK_GPIO_ALT_B),
-       DB8540_PIN_GROUP(u4txrx_b_1, NMK_GPIO_ALT_B),
-       DB8540_PIN_GROUP(u4ctsrts_b_1, NMK_GPIO_ALT_B),
-       DB8540_PIN_GROUP(ddrtrig_b_1, NMK_GPIO_ALT_B),
-       DB8540_PIN_GROUP(msp4_b_1, NMK_GPIO_ALT_B),
-       DB8540_PIN_GROUP(pwl_b_1, NMK_GPIO_ALT_B),
-       DB8540_PIN_GROUP(spi1_b_1, NMK_GPIO_ALT_B),
-       DB8540_PIN_GROUP(mc3_b_1, NMK_GPIO_ALT_B),
-       DB8540_PIN_GROUP(pwl_b_2, NMK_GPIO_ALT_B),
-       DB8540_PIN_GROUP(pwl_b_3, NMK_GPIO_ALT_B),
-       DB8540_PIN_GROUP(pwl_b_4, NMK_GPIO_ALT_B),
-       DB8540_PIN_GROUP(u2txrx_b_2, NMK_GPIO_ALT_B),
-       /* Altfunction C column */
-       DB8540_PIN_GROUP(ipgpio6_c_1, NMK_GPIO_ALT_C),
-       DB8540_PIN_GROUP(ipgpio0_c_1, NMK_GPIO_ALT_C),
-       DB8540_PIN_GROUP(ipgpio1_c_1, NMK_GPIO_ALT_C),
-       DB8540_PIN_GROUP(ipgpio3_c_1, NMK_GPIO_ALT_C),
-       DB8540_PIN_GROUP(ipgpio2_c_1, NMK_GPIO_ALT_C),
-       DB8540_PIN_GROUP(u0_c_1, NMK_GPIO_ALT_C),
-       DB8540_PIN_GROUP(smcleale_c_1, NMK_GPIO_ALT_C),
-       DB8540_PIN_GROUP(ipgpio4_c_1, NMK_GPIO_ALT_C),
-       DB8540_PIN_GROUP(ipgpio5_c_1, NMK_GPIO_ALT_C),
-       DB8540_PIN_GROUP(ipgpio6_c_2, NMK_GPIO_ALT_C),
-       DB8540_PIN_GROUP(ipgpio7_c_1, NMK_GPIO_ALT_C),
-       DB8540_PIN_GROUP(stmape_c_1, NMK_GPIO_ALT_C),
-       DB8540_PIN_GROUP(u2rxtx_c_1, NMK_GPIO_ALT_C),
-       DB8540_PIN_GROUP(modobsresout_c_1, NMK_GPIO_ALT_C),
-       DB8540_PIN_GROUP(ipgpio2_c_2, NMK_GPIO_ALT_C),
-       DB8540_PIN_GROUP(ipgpio3_c_2, NMK_GPIO_ALT_C),
-       DB8540_PIN_GROUP(ipgpio4_c_2, NMK_GPIO_ALT_C),
-       DB8540_PIN_GROUP(ipgpio5_c_2, NMK_GPIO_ALT_C),
-       DB8540_PIN_GROUP(modaccgpo_c_1, NMK_GPIO_ALT_C),
-       DB8540_PIN_GROUP(modobspwrrst_c_1, NMK_GPIO_ALT_C),
-       DB8540_PIN_GROUP(mc5_c_1, NMK_GPIO_ALT_C),
-       DB8540_PIN_GROUP(smps0_c_1, NMK_GPIO_ALT_C),
-       DB8540_PIN_GROUP(moduart1_c_1, NMK_GPIO_ALT_C),
-       DB8540_PIN_GROUP(mc2rstn_c_1, NMK_GPIO_ALT_C),
-       DB8540_PIN_GROUP(i2c5_c_1, NMK_GPIO_ALT_C),
-       DB8540_PIN_GROUP(ipgpio0_c_2, NMK_GPIO_ALT_C),
-       DB8540_PIN_GROUP(ipgpio1_c_2, NMK_GPIO_ALT_C),
-       DB8540_PIN_GROUP(kp_c_1, NMK_GPIO_ALT_C),
-       DB8540_PIN_GROUP(modrf_c_1, NMK_GPIO_ALT_C),
-       DB8540_PIN_GROUP(smps1_c_1, NMK_GPIO_ALT_C),
-       DB8540_PIN_GROUP(i2c5_c_2, NMK_GPIO_ALT_C),
-       DB8540_PIN_GROUP(u4ctsrts_c_1, NMK_GPIO_ALT_C),
-       DB8540_PIN_GROUP(u3rxtx_c_1, NMK_GPIO_ALT_C),
-       DB8540_PIN_GROUP(msp4_c_1, NMK_GPIO_ALT_C),
-       DB8540_PIN_GROUP(mc4rstn_c_1, NMK_GPIO_ALT_C),
-       DB8540_PIN_GROUP(spi0_c_1, NMK_GPIO_ALT_C),
-       DB8540_PIN_GROUP(i2c3_c_1, NMK_GPIO_ALT_C),
-
-       /* Other alt C1 column */
-       DB8540_PIN_GROUP(spi3_oc1_1, NMK_GPIO_ALT_C1),
-       DB8540_PIN_GROUP(stmape_oc1_1, NMK_GPIO_ALT_C1),
-       DB8540_PIN_GROUP(u2_oc1_1, NMK_GPIO_ALT_C1),
-       DB8540_PIN_GROUP(remap0_oc1_1, NMK_GPIO_ALT_C1),
-       DB8540_PIN_GROUP(remap1_oc1_1, NMK_GPIO_ALT_C1),
-       DB8540_PIN_GROUP(modobsrefclk_oc1_1, NMK_GPIO_ALT_C1),
-       DB8540_PIN_GROUP(modobspwrctrl_oc1_1, NMK_GPIO_ALT_C1),
-       DB8540_PIN_GROUP(modobsclkout_oc1_1, NMK_GPIO_ALT_C1),
-       DB8540_PIN_GROUP(moduart1_oc1_1, NMK_GPIO_ALT_C1),
-       DB8540_PIN_GROUP(modprcmudbg_oc1_1, NMK_GPIO_ALT_C1),
-       DB8540_PIN_GROUP(modobsresout_oc1_1, NMK_GPIO_ALT_C1),
-       DB8540_PIN_GROUP(modaccgpo_oc1_1, NMK_GPIO_ALT_C1),
-       DB8540_PIN_GROUP(kp_oc1_1, NMK_GPIO_ALT_C1),
-       DB8540_PIN_GROUP(modxmip_oc1_1, NMK_GPIO_ALT_C1),
-       DB8540_PIN_GROUP(i2c6_oc1_1, NMK_GPIO_ALT_C1),
-       DB8540_PIN_GROUP(u2txrx_oc1_1, NMK_GPIO_ALT_C1),
-       DB8540_PIN_GROUP(u2ctsrts_oc1_1, NMK_GPIO_ALT_C1),
-
-       /* Other alt C2 column */
-       DB8540_PIN_GROUP(sbag_oc2_1, NMK_GPIO_ALT_C2),
-       DB8540_PIN_GROUP(hxclk_oc2_1, NMK_GPIO_ALT_C2),
-       DB8540_PIN_GROUP(modaccuart_oc2_1, NMK_GPIO_ALT_C2),
-       DB8540_PIN_GROUP(stmmod_oc2_1, NMK_GPIO_ALT_C2),
-       DB8540_PIN_GROUP(moduartstmmux_oc2_1, NMK_GPIO_ALT_C2),
-       DB8540_PIN_GROUP(hxgpio_oc2_1, NMK_GPIO_ALT_C2),
-       DB8540_PIN_GROUP(sbag_oc2_2, NMK_GPIO_ALT_C2),
-       DB8540_PIN_GROUP(modobsservice_oc2_1, NMK_GPIO_ALT_C2),
-       DB8540_PIN_GROUP(moduart0_oc2_1, NMK_GPIO_ALT_C2),
-       DB8540_PIN_GROUP(stmape_oc2_1, NMK_GPIO_ALT_C2),
-       DB8540_PIN_GROUP(u2_oc2_1, NMK_GPIO_ALT_C2),
-       DB8540_PIN_GROUP(modxmip_oc2_1, NMK_GPIO_ALT_C2),
-
-       /* Other alt C3 column */
-       DB8540_PIN_GROUP(modaccgpo_oc3_1, NMK_GPIO_ALT_C3),
-       DB8540_PIN_GROUP(tpui_oc3_1, NMK_GPIO_ALT_C3),
-
-       /* Other alt C4 column */
-       DB8540_PIN_GROUP(hwobs_oc4_1, NMK_GPIO_ALT_C4),
-       DB8540_PIN_GROUP(moduart1txrx_oc4_1, NMK_GPIO_ALT_C4),
-       DB8540_PIN_GROUP(moduart1rtscts_oc4_1, NMK_GPIO_ALT_C4),
-       DB8540_PIN_GROUP(modaccuarttxrx_oc4_1, NMK_GPIO_ALT_C4),
-       DB8540_PIN_GROUP(modaccuartrtscts_oc4_1, NMK_GPIO_ALT_C4),
-       DB8540_PIN_GROUP(stmmod_oc4_1, NMK_GPIO_ALT_C4),
-       DB8540_PIN_GROUP(moduartstmmux_oc4_1, NMK_GPIO_ALT_C4),
-
-};
-
-/* We use this macro to define the groups applicable to a function */
-#define DB8540_FUNC_GROUPS(a, b...)       \
-static const char * const a##_groups[] = { b };
-
-DB8540_FUNC_GROUPS(apetrig, "apetrig_b_1");
-DB8540_FUNC_GROUPS(clkout, "clkoutreq_a_1", "clkout1_a_1", "clkout1_a_2",
-               "clkout2_a_1", "clkout2_a_2");
-DB8540_FUNC_GROUPS(ddrtrig, "ddrtrig_b_1");
-DB8540_FUNC_GROUPS(hsi, "hsir_a_1", "hsit_a_1", "hsit_a_2");
-DB8540_FUNC_GROUPS(hwobs, "hwobs_oc4_1");
-DB8540_FUNC_GROUPS(hx, "hxclk_oc2_1", "hxgpio_oc2_1");
-DB8540_FUNC_GROUPS(i2c0, "i2c0_a_1");
-DB8540_FUNC_GROUPS(i2c1, "i2c1_b_1", "i2c1_b_2");
-DB8540_FUNC_GROUPS(i2c2, "i2c2_b_1", "i2c2_b_2");
-DB8540_FUNC_GROUPS(i2c3, "i2c3_c_1", "i2c4_b_1");
-DB8540_FUNC_GROUPS(i2c4, "i2c4_b_2");
-DB8540_FUNC_GROUPS(i2c5, "i2c5_b_1", "i2c5_b_2", "i2c5_c_1", "i2c5_c_2");
-DB8540_FUNC_GROUPS(i2c6, "i2c6_b_1", "i2c6_oc1_1");
-/* The image processor has 8 GPIO pins that can be muxed out */
-DB8540_FUNC_GROUPS(ipgpio, "ipgpio0_a_1", "ipgpio0_c_1", "ipgpio0_c_2",
-               "ipgpio1_a_1", "ipgpio1_c_1", "ipgpio1_c_2",
-               "ipgpio2_b_1", "ipgpio2_c_1", "ipgpio2_c_2",
-               "ipgpio3_b_1", "ipgpio3_c_1", "ipgpio3_c_2",
-               "ipgpio4_c_1", "ipgpio4_c_2",
-               "ipgpio5_c_1", "ipgpio5_c_2",
-               "ipgpio6_c_1", "ipgpio6_c_2",
-               "ipgpio7_b_1", "ipgpio7_c_1");
-DB8540_FUNC_GROUPS(ipi2c, "ipi2c_a_1", "ipi2c_a_2");
-DB8540_FUNC_GROUPS(kp, "kp_a_1", "kp_b_1", "kp_c_1", "kp_oc1_1");
-DB8540_FUNC_GROUPS(lcd, "lcd_d0_d7_a_1", "lcd_d12_d23_a_1", "lcd_d8_d11_a_1",
-               "lcdvsi0_a_1", "lcdvsi1_a_1");
-DB8540_FUNC_GROUPS(lcdb, "lcdb_a_1");
-DB8540_FUNC_GROUPS(mc0, "mc0_a_1");
-DB8540_FUNC_GROUPS(mc1, "mc1_a_1", "mc1_a_2");
-DB8540_FUNC_GROUPS(mc2, "mc2_a_1", "mc2rstn_c_1");
-DB8540_FUNC_GROUPS(mc3, "mc3_b_1");
-DB8540_FUNC_GROUPS(mc4, "mc4_a_1", "mc4rstn_c_1");
-DB8540_FUNC_GROUPS(mc5, "mc5_c_1");
-DB8540_FUNC_GROUPS(modaccgpo, "modaccgpo_c_1", "modaccgpo_oc1_1",
-               "modaccgpo_oc3_1");
-DB8540_FUNC_GROUPS(modaccuart, "modaccuart_oc2_1", "modaccuarttxrx_oc4_1",
-               "modaccuartrtccts_oc4_1");
-DB8540_FUNC_GROUPS(modi2s, "modi2s_a_1");
-DB8540_FUNC_GROUPS(modobs, "modobsclk_a_1", "modobsclkout_oc1_1",
-               "modobspwrctrl_oc1_1", "modobspwrrst_c_1",
-               "modobsrefclk_oc1_1", "modobsresout_c_1",
-               "modobsresout_oc1_1", "modobsservice_oc2_1");
-DB8540_FUNC_GROUPS(modprcmudbg, "modprcmudbg_oc1_1");
-DB8540_FUNC_GROUPS(modrf, "modrf_c_1");
-DB8540_FUNC_GROUPS(modsmb, "modsmb_a_1");
-DB8540_FUNC_GROUPS(modtrig, "modtrig_b_1");
-DB8540_FUNC_GROUPS(moduart, "moduart1_c_1", "moduart1_oc1_1",
-               "moduart1txrx_oc4_1", "moduart1rtscts_oc4_1", "moduart0_oc2_1");
-DB8540_FUNC_GROUPS(moduartstmmux, "moduartstmmux_b_1", "moduartstmmux_oc2_1",
-               "moduartstmmux_oc4_1");
-DB8540_FUNC_GROUPS(modxmip, "modxmip_oc1_1", "modxmip_oc2_1");
-/*
- * MSP0 can only be on a certain set of pins, but the TX/RX pins can be
- * switched around by selecting the altfunction A or B.
- */
-DB8540_FUNC_GROUPS(msp0, "msp0rfsrck_a_1", "msp0tfstck_a_1", "msp0txrx_a_1",
-               "msp0txrx_b_1");
-DB8540_FUNC_GROUPS(msp1, "msp1_a_1", "msp1txrx_a_1", "msp1txrx_b_1");
-DB8540_FUNC_GROUPS(msp2, "msp2sck_a_1", "msp2txdtcktfs_a_1", "msp2rxd_a_1");
-DB8540_FUNC_GROUPS(msp4, "msp4_a_1", "msp4_b_1", "msp4_c_1");
-DB8540_FUNC_GROUPS(pwl, "pwl_b_1", "pwl_b_2", "pwl_b_3", "pwl_b_4");
-DB8540_FUNC_GROUPS(remap, "remap0_oc1_1", "remap1_oc1_1");
-DB8540_FUNC_GROUPS(sbag, "sbag_oc2_1", "sbag_oc2_2");
-/* Select between CS0 on alt B or PS1 on alt C */
-DB8540_FUNC_GROUPS(sm, "sm_b_1", "smcleale_c_1", "smcs0_b_1", "smcs1_b_1",
-               "smps0_c_1", "smps1_c_1");
-DB8540_FUNC_GROUPS(spi0, "spi0_c_1");
-DB8540_FUNC_GROUPS(spi1, "spi1_b_1");
-DB8540_FUNC_GROUPS(spi2, "spi2_a_1");
-DB8540_FUNC_GROUPS(spi3, "spi3_oc1_1");
-DB8540_FUNC_GROUPS(ssp0, "ssp0_a_1");
-DB8540_FUNC_GROUPS(ssp1, "ssp1_a_1");
-DB8540_FUNC_GROUPS(stmape, "stmape_c_1", "stmape_oc1_1", "stmape_oc2_1");
-DB8540_FUNC_GROUPS(stmmod, "stmmod_b_1", "stmmod_oc2_1", "stmmod_oc4_1");
-DB8540_FUNC_GROUPS(tpui, "tpui_oc3_1");
-DB8540_FUNC_GROUPS(u0, "u0_a_1", "u0_c_1");
-DB8540_FUNC_GROUPS(u1, "u1ctsrts_a_1", "u1rxtx_a_1");
-DB8540_FUNC_GROUPS(u2, "u2_oc1_1", "u2_oc2_1", "u2ctsrts_a_1", "u2ctsrts_oc1_1",
-               "u2rxtx_c_1", "u2txrx_a_1", "u2txrx_b_1", "u2txrx_b_2",
-               "u2txrx_oc1_1");
-DB8540_FUNC_GROUPS(u3, "u3ctsrts_b_1", "u3rxtx_c_1", "u3txrxa_b_1");
-DB8540_FUNC_GROUPS(u4, "u4ctsrts_b_1", "u4ctsrts_c_1", "u4txrx_b_1");
-DB8540_FUNC_GROUPS(usb, "usb_a_1");
-
-
-#define FUNCTION(fname)                                        \
-       {                                               \
-               .name = #fname,                         \
-               .groups = fname##_groups,               \
-               .ngroups = ARRAY_SIZE(fname##_groups),  \
-       }
-
-static const struct nmk_function nmk_db8540_functions[] = {
-       FUNCTION(apetrig),
-       FUNCTION(clkout),
-       FUNCTION(ddrtrig),
-       FUNCTION(hsi),
-       FUNCTION(hwobs),
-       FUNCTION(hx),
-       FUNCTION(i2c0),
-       FUNCTION(i2c1),
-       FUNCTION(i2c2),
-       FUNCTION(i2c3),
-       FUNCTION(i2c4),
-       FUNCTION(i2c5),
-       FUNCTION(i2c6),
-       FUNCTION(ipgpio),
-       FUNCTION(ipi2c),
-       FUNCTION(kp),
-       FUNCTION(lcd),
-       FUNCTION(lcdb),
-       FUNCTION(mc0),
-       FUNCTION(mc1),
-       FUNCTION(mc2),
-       FUNCTION(mc3),
-       FUNCTION(mc4),
-       FUNCTION(mc5),
-       FUNCTION(modaccgpo),
-       FUNCTION(modaccuart),
-       FUNCTION(modi2s),
-       FUNCTION(modobs),
-       FUNCTION(modprcmudbg),
-       FUNCTION(modrf),
-       FUNCTION(modsmb),
-       FUNCTION(modtrig),
-       FUNCTION(moduart),
-       FUNCTION(modxmip),
-       FUNCTION(msp0),
-       FUNCTION(msp1),
-       FUNCTION(msp2),
-       FUNCTION(msp4),
-       FUNCTION(pwl),
-       FUNCTION(remap),
-       FUNCTION(sbag),
-       FUNCTION(sm),
-       FUNCTION(spi0),
-       FUNCTION(spi1),
-       FUNCTION(spi2),
-       FUNCTION(spi3),
-       FUNCTION(ssp0),
-       FUNCTION(ssp1),
-       FUNCTION(stmape),
-       FUNCTION(stmmod),
-       FUNCTION(tpui),
-       FUNCTION(u0),
-       FUNCTION(u1),
-       FUNCTION(u2),
-       FUNCTION(u3),
-       FUNCTION(u4),
-       FUNCTION(usb)
-};
-
-static const struct prcm_gpiocr_altcx_pin_desc db8540_altcx_pins[] = {
-       PRCM_GPIOCR_ALTCX(8,    true, PRCM_IDX_GPIOCR1, 20,     /* SPI3_CLK */
-                               false, 0, 0,
-                               false, 0, 0,
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(9,    true, PRCM_IDX_GPIOCR1, 20,     /* SPI3_RXD */
-                               false, 0, 0,
-                               false, 0, 0,
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(10,   true, PRCM_IDX_GPIOCR1, 20,     /* SPI3_FRM */
-                               false, 0, 0,
-                               false, 0, 0,
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(11,   true, PRCM_IDX_GPIOCR1, 20,     /* SPI3_TXD */
-                               false, 0, 0,
-                               false, 0, 0,
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(23,   true, PRCM_IDX_GPIOCR1, 9,      /* STMAPE_CLK_a */
-                               true, PRCM_IDX_GPIOCR2, 10,     /* SBAG_CLK_a */
-                               false, 0, 0,
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(24,   true, PRCM_IDX_GPIOCR3, 30,     /* U2_RXD_g */
-                               true, PRCM_IDX_GPIOCR2, 10,     /* SBAG_VAL_a */
-                               false, 0, 0,
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(25,   true, PRCM_IDX_GPIOCR1, 9,      /* STMAPE_DAT_a[0] */
-                               true, PRCM_IDX_GPIOCR2, 10,     /* SBAG_D_a[0] */
-                               false, 0, 0,
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(26,   true, PRCM_IDX_GPIOCR1, 9,      /* STMAPE_DAT_a[1] */
-                               true, PRCM_IDX_GPIOCR2, 10,     /* SBAG_D_a[1] */
-                               false, 0, 0,
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(27,   true, PRCM_IDX_GPIOCR1, 9,      /* STMAPE_DAT_a[2] */
-                               true, PRCM_IDX_GPIOCR2, 10,     /* SBAG_D_a[2] */
-                               false, 0, 0,
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(28,   true, PRCM_IDX_GPIOCR1, 9,      /* STMAPE_DAT_a[3] */
-                               true, PRCM_IDX_GPIOCR2, 10,     /* SBAG_D_a[3] */
-                               false, 0, 0,
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(64,   true, PRCM_IDX_GPIOCR1, 15,     /* MODOBS_REFCLK_REQ */
-                               false, 0, 0,
-                               true, PRCM_IDX_GPIOCR1, 2,      /* TPIU_CTL */
-                               true, PRCM_IDX_GPIOCR2, 23      /* HW_OBS_APE_PRCMU[17] */
-       ),
-       PRCM_GPIOCR_ALTCX(65,   true, PRCM_IDX_GPIOCR1, 19,     /* MODOBS_PWRCTRL0 */
-                               true, PRCM_IDX_GPIOCR1, 24,     /* Hx_CLK */
-                               true, PRCM_IDX_GPIOCR1, 2,      /* TPIU_CLK */
-                               true, PRCM_IDX_GPIOCR2, 24      /* HW_OBS_APE_PRCMU[16] */
-       ),
-       PRCM_GPIOCR_ALTCX(66,   true, PRCM_IDX_GPIOCR1, 15,     /* MODOBS_CLKOUT1 */
-                               false, 0, 0,
-                               true, PRCM_IDX_GPIOCR1, 2,      /* TPIU_D[15] */
-                               true, PRCM_IDX_GPIOCR2, 25      /* HW_OBS_APE_PRCMU[15] */
-       ),
-       PRCM_GPIOCR_ALTCX(67,   true, PRCM_IDX_GPIOCR1, 1,      /* MODUART1_TXD_a */
-                               true, PRCM_IDX_GPIOCR1, 6,      /* MODACCUART_TXD_a */
-                               true, PRCM_IDX_GPIOCR1, 2,      /* TPIU_D[14] */
-                               true, PRCM_IDX_GPIOCR2, 26      /* HW_OBS_APE_PRCMU[14] */
-       ),
-       PRCM_GPIOCR_ALTCX(70,   true, PRCM_IDX_GPIOCR3, 6,      /* MOD_PRCMU_DEBUG[17] */
-                               true, PRCM_IDX_GPIOCR1, 10,     /* STMMOD_CLK_b */
-                               true, PRCM_IDX_GPIOCR1, 2,      /* TPIU_D[13] */
-                               true, PRCM_IDX_GPIOCR2, 27      /* HW_OBS_APE_PRCMU[13] */
-       ),
-       PRCM_GPIOCR_ALTCX(71,   true, PRCM_IDX_GPIOCR3, 6,      /* MOD_PRCMU_DEBUG[16] */
-                               true, PRCM_IDX_GPIOCR1, 10,     /* STMMOD_DAT_b[3] */
-                               true, PRCM_IDX_GPIOCR1, 2,      /* TPIU_D[12] */
-                               true, PRCM_IDX_GPIOCR2, 27      /* HW_OBS_APE_PRCMU[12] */
-       ),
-       PRCM_GPIOCR_ALTCX(72,   true, PRCM_IDX_GPIOCR3, 6,      /* MOD_PRCMU_DEBUG[15] */
-                               true, PRCM_IDX_GPIOCR1, 10,     /* STMMOD_DAT_b[2] */
-                               true, PRCM_IDX_GPIOCR1, 2,      /* TPIU_D[11] */
-                               true, PRCM_IDX_GPIOCR2, 27      /* HW_OBS_APE_PRCMU[11] */
-       ),
-       PRCM_GPIOCR_ALTCX(73,   true, PRCM_IDX_GPIOCR3, 6,      /* MOD_PRCMU_DEBUG[14] */
-                               true, PRCM_IDX_GPIOCR1, 10,     /* STMMOD_DAT_b[1] */
-                               true, PRCM_IDX_GPIOCR1, 2,      /* TPIU_D[10] */
-                               true, PRCM_IDX_GPIOCR2, 27      /* HW_OBS_APE_PRCMU[10] */
-       ),
-       PRCM_GPIOCR_ALTCX(74,   true, PRCM_IDX_GPIOCR3, 6,      /* MOD_PRCMU_DEBUG[13] */
-                               true, PRCM_IDX_GPIOCR1, 10,     /* STMMOD_DAT_b[0] */
-                               true, PRCM_IDX_GPIOCR1, 2,      /* TPIU_D[9] */
-                               true, PRCM_IDX_GPIOCR2, 27      /* HW_OBS_APE_PRCMU[9] */
-       ),
-       PRCM_GPIOCR_ALTCX(75,   true, PRCM_IDX_GPIOCR1, 12,     /* MODOBS_RESOUT0_N */
-                               true, PRCM_IDX_GPIOCR2, 1,      /* MODUART_STMMUX_RXD_b */
-                               true, PRCM_IDX_GPIOCR1, 2,      /* TPIU_D[8] */
-                               true, PRCM_IDX_GPIOCR2, 28      /* HW_OBS_APE_PRCMU[8] */
-       ),
-       PRCM_GPIOCR_ALTCX(76,   true, PRCM_IDX_GPIOCR3, 7,      /* MOD_PRCMU_DEBUG[12] */
-                               true, PRCM_IDX_GPIOCR1, 25,     /* Hx_GPIO[7] */
-                               true, PRCM_IDX_GPIOCR1, 2,      /* TPIU_D[7] */
-                               true, PRCM_IDX_GPIOCR2, 29      /* HW_OBS_APE_PRCMU[7] */
-       ),
-       PRCM_GPIOCR_ALTCX(77,   true, PRCM_IDX_GPIOCR3, 7,      /* MOD_PRCMU_DEBUG[11] */
-                               true, PRCM_IDX_GPIOCR1, 25,     /* Hx_GPIO[6] */
-                               true, PRCM_IDX_GPIOCR1, 2,      /* TPIU_D[6] */
-                               true, PRCM_IDX_GPIOCR2, 29      /* HW_OBS_APE_PRCMU[6] */
-       ),
-       PRCM_GPIOCR_ALTCX(78,   true, PRCM_IDX_GPIOCR3, 7,      /* MOD_PRCMU_DEBUG[10] */
-                               true, PRCM_IDX_GPIOCR1, 25,     /* Hx_GPIO[5] */
-                               true, PRCM_IDX_GPIOCR1, 2,      /* TPIU_D[5] */
-                               true, PRCM_IDX_GPIOCR2, 29      /* HW_OBS_APE_PRCMU[5] */
-       ),
-       PRCM_GPIOCR_ALTCX(79,   true, PRCM_IDX_GPIOCR3, 7,      /* MOD_PRCMU_DEBUG[9] */
-                               true, PRCM_IDX_GPIOCR1, 25,     /* Hx_GPIO[4] */
-                               true, PRCM_IDX_GPIOCR1, 2,      /* TPIU_D[4] */
-                               true, PRCM_IDX_GPIOCR2, 29      /* HW_OBS_APE_PRCMU[4] */
-       ),
-       PRCM_GPIOCR_ALTCX(80,   true, PRCM_IDX_GPIOCR1, 26,     /* MODACC_GPO[0] */
-                               true, PRCM_IDX_GPIOCR1, 25,     /* Hx_GPIO[3] */
-                               true, PRCM_IDX_GPIOCR1, 2,      /* TPIU_D[3] */
-                               true, PRCM_IDX_GPIOCR2, 30      /* HW_OBS_APE_PRCMU[3] */
-       ),
-       PRCM_GPIOCR_ALTCX(81,   true, PRCM_IDX_GPIOCR2, 17,     /* MODACC_GPO[1] */
-                               true, PRCM_IDX_GPIOCR1, 25,     /* Hx_GPIO[2] */
-                               true, PRCM_IDX_GPIOCR1, 2,      /* TPIU_D[2] */
-                               true, PRCM_IDX_GPIOCR2, 30      /* HW_OBS_APE_PRCMU[2] */
-       ),
-       PRCM_GPIOCR_ALTCX(82,   true, PRCM_IDX_GPIOCR3, 8,      /* MOD_PRCMU_DEBUG[8] */
-                               true, PRCM_IDX_GPIOCR1, 25,     /* Hx_GPIO[1] */
-                               true, PRCM_IDX_GPIOCR1, 2,      /* TPIU_D[1] */
-                               true, PRCM_IDX_GPIOCR2, 31      /* HW_OBS_APE_PRCMU[1] */
-       ),
-       PRCM_GPIOCR_ALTCX(83,   true, PRCM_IDX_GPIOCR3, 8,      /* MOD_PRCMU_DEBUG[7] */
-                               true, PRCM_IDX_GPIOCR1, 25,     /* Hx_GPIO[0] */
-                               true, PRCM_IDX_GPIOCR1, 2,      /* TPIU_D[0] */
-                               true, PRCM_IDX_GPIOCR2, 31      /* HW_OBS_APE_PRCMU[0] */
-       ),
-       PRCM_GPIOCR_ALTCX(84,   true, PRCM_IDX_GPIOCR3, 9,      /* MOD_PRCMU_DEBUG[6] */
-                               true, PRCM_IDX_GPIOCR1, 8,      /* SBAG_CLK_b */
-                               true, PRCM_IDX_GPIOCR1, 3,      /* TPIU_D[23] */
-                               true, PRCM_IDX_GPIOCR1, 16      /* MODUART1_RXD_b */
-       ),
-       PRCM_GPIOCR_ALTCX(85,   true, PRCM_IDX_GPIOCR3, 9,      /* MOD_PRCMU_DEBUG[5] */
-                               true, PRCM_IDX_GPIOCR1, 8,      /* SBAG_D_b[3] */
-                               true, PRCM_IDX_GPIOCR1, 3,      /* TPIU_D[22] */
-                               true, PRCM_IDX_GPIOCR1, 16      /* MODUART1_TXD_b */
-       ),
-       PRCM_GPIOCR_ALTCX(86,   true, PRCM_IDX_GPIOCR3, 9,      /* MOD_PRCMU_DEBUG[0] */
-                               true, PRCM_IDX_GPIOCR2, 18,     /* STMAPE_DAT_b[0] */
-                               true, PRCM_IDX_GPIOCR1, 14,     /* TPIU_D[25] */
-                               true, PRCM_IDX_GPIOCR1, 11      /* STMMOD_DAT_c[0] */
-       ),
-       PRCM_GPIOCR_ALTCX(87,   true, PRCM_IDX_GPIOCR3, 0,      /* MODACC_GPO_a[5] */
-                               true, PRCM_IDX_GPIOCR2, 3,      /* U2_RXD_c */
-                               true, PRCM_IDX_GPIOCR1, 4,      /* TPIU_D[24] */
-                               true, PRCM_IDX_GPIOCR1, 21      /* MODUART_STMMUX_RXD_c */
-       ),
-       PRCM_GPIOCR_ALTCX(151,  true, PRCM_IDX_GPIOCR1, 18,     /* REMAP0 */
-                               false, 0, 0,
-                               false, 0, 0,
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(152,  true, PRCM_IDX_GPIOCR1, 18,     /* REMAP1 */
-                               false, 0, 0,
-                               false, 0, 0,
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(153,  true, PRCM_IDX_GPIOCR3, 2,      /* KP_O_b[6] */
-                               true, PRCM_IDX_GPIOCR1, 8,      /* SBAG_D_b[2] */
-                               true, PRCM_IDX_GPIOCR1, 3,      /* TPIU_D[21] */
-                               true, PRCM_IDX_GPIOCR1, 0       /* MODUART1_RTS */
-       ),
-       PRCM_GPIOCR_ALTCX(154,  true, PRCM_IDX_GPIOCR3, 2,      /* KP_I_b[6] */
-                               true, PRCM_IDX_GPIOCR1, 8,      /* SBAG_D_b[1] */
-                               true, PRCM_IDX_GPIOCR1, 3,      /* TPIU_D[20] */
-                               true, PRCM_IDX_GPIOCR1, 0       /* MODUART1_CTS */
-       ),
-       PRCM_GPIOCR_ALTCX(155,  true, PRCM_IDX_GPIOCR3, 3,      /* KP_O_b[5] */
-                               true, PRCM_IDX_GPIOCR1, 8,      /* SBAG_D_b[0] */
-                               true, PRCM_IDX_GPIOCR1, 3,      /* TPIU_D[19] */
-                               true, PRCM_IDX_GPIOCR1, 5       /* MODACCUART_RXD_c */
-       ),
-       PRCM_GPIOCR_ALTCX(156,  true, PRCM_IDX_GPIOCR3, 3,      /* KP_O_b[4] */
-                               true, PRCM_IDX_GPIOCR1, 8,      /* SBAG_VAL_b */
-                               true, PRCM_IDX_GPIOCR1, 3,      /* TPIU_D[18] */
-                               true, PRCM_IDX_GPIOCR1, 5       /* MODACCUART_TXD_b */
-       ),
-       PRCM_GPIOCR_ALTCX(157,  true, PRCM_IDX_GPIOCR3, 4,      /* KP_I_b[5] */
-                               true, PRCM_IDX_GPIOCR1, 23,     /* MODOBS_SERVICE_N */
-                               true, PRCM_IDX_GPIOCR1, 3,      /* TPIU_D[17] */
-                               true, PRCM_IDX_GPIOCR1, 14      /* MODACCUART_RTS */
-       ),
-       PRCM_GPIOCR_ALTCX(158,  true, PRCM_IDX_GPIOCR3, 4,      /* KP_I_b[4] */
-                               true, PRCM_IDX_GPIOCR2, 0,      /* U2_TXD_c */
-                               true, PRCM_IDX_GPIOCR1, 3,      /* TPIU_D[16] */
-                               true, PRCM_IDX_GPIOCR1, 14      /* MODACCUART_CTS */
-       ),
-       PRCM_GPIOCR_ALTCX(159,  true, PRCM_IDX_GPIOCR3, 5,      /* KP_O_b[3] */
-                               true, PRCM_IDX_GPIOCR3, 10,     /* MODUART0_RXD */
-                               true, PRCM_IDX_GPIOCR1, 4,      /* TPIU_D[31] */
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(160,  true, PRCM_IDX_GPIOCR3, 5,      /* KP_I_b[3] */
-                               true, PRCM_IDX_GPIOCR3, 10,     /* MODUART0_TXD */
-                               true, PRCM_IDX_GPIOCR1, 4,      /* TPIU_D[30] */
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(161,  true, PRCM_IDX_GPIOCR3, 9,      /* MOD_PRCMU_DEBUG[4] */
-                               true, PRCM_IDX_GPIOCR2, 18,     /* STMAPE_CLK_b */
-                               true, PRCM_IDX_GPIOCR1, 4,      /* TPIU_D[29] */
-                               true, PRCM_IDX_GPIOCR1, 11      /* STMMOD_CLK_c */
-       ),
-       PRCM_GPIOCR_ALTCX(162,  true, PRCM_IDX_GPIOCR3, 9,      /* MOD_PRCMU_DEBUG[3] */
-                               true, PRCM_IDX_GPIOCR2, 18,     /* STMAPE_DAT_b[3] */
-                               true, PRCM_IDX_GPIOCR1, 4,      /* TPIU_D[28] */
-                               true, PRCM_IDX_GPIOCR1, 11      /* STMMOD_DAT_c[3] */
-       ),
-       PRCM_GPIOCR_ALTCX(163,  true, PRCM_IDX_GPIOCR3, 9,      /* MOD_PRCMU_DEBUG[2] */
-                               true, PRCM_IDX_GPIOCR2, 18,     /* STMAPE_DAT_b[2] */
-                               true, PRCM_IDX_GPIOCR1, 4,      /* TPIU_D[27] */
-                               true, PRCM_IDX_GPIOCR1, 11      /* STMMOD_DAT_c[2] */
-       ),
-       PRCM_GPIOCR_ALTCX(164,  true, PRCM_IDX_GPIOCR3, 9,      /* MOD_PRCMU_DEBUG[1] */
-                               true, PRCM_IDX_GPIOCR2, 18,     /* STMAPE_DAT_b[1] */
-                               true, PRCM_IDX_GPIOCR1, 4,      /* TPIU_D[26] */
-                               true, PRCM_IDX_GPIOCR1, 11      /* STMMOD_DAT_c[1] */
-       ),
-       PRCM_GPIOCR_ALTCX(204,  true, PRCM_IDX_GPIOCR2, 2,      /* U2_RXD_f */
-                               false, 0, 0,
-                               false, 0, 0,
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(205,  true, PRCM_IDX_GPIOCR2, 2,      /* U2_TXD_f */
-                               false, 0, 0,
-                               false, 0, 0,
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(206,  true, PRCM_IDX_GPIOCR2, 2,      /* U2_CTSn_b */
-                               false, 0, 0,
-                               false, 0, 0,
-                               false, 0, 0
-       ),
-       PRCM_GPIOCR_ALTCX(207,  true, PRCM_IDX_GPIOCR2, 2,      /* U2_RTSn_b */
-                               false, 0, 0,
-                               false, 0, 0,
-                               false, 0, 0
-       ),
-};
-
-static const u16 db8540_prcm_gpiocr_regs[] = {
-       [PRCM_IDX_GPIOCR1] = 0x138,
-       [PRCM_IDX_GPIOCR2] = 0x574,
-       [PRCM_IDX_GPIOCR3] = 0x2bc,
-};
-
-static const struct nmk_pinctrl_soc_data nmk_db8540_soc = {
-       .gpio_ranges = nmk_db8540_ranges,
-       .gpio_num_ranges = ARRAY_SIZE(nmk_db8540_ranges),
-       .pins = nmk_db8540_pins,
-       .npins = ARRAY_SIZE(nmk_db8540_pins),
-       .functions = nmk_db8540_functions,
-       .nfunctions = ARRAY_SIZE(nmk_db8540_functions),
-       .groups = nmk_db8540_groups,
-       .ngroups = ARRAY_SIZE(nmk_db8540_groups),
-       .altcx_pins = db8540_altcx_pins,
-       .npins_altcx = ARRAY_SIZE(db8540_altcx_pins),
-       .prcm_gpiocr_registers = db8540_prcm_gpiocr_regs,
-};
-
-void nmk_pinctrl_db8540_init(const struct nmk_pinctrl_soc_data **soc)
-{
-       *soc = &nmk_db8540_soc;
-}
diff --git a/drivers/pinctrl/pinctrl-nomadik-stn8815.c b/drivers/pinctrl/pinctrl-nomadik-stn8815.c
deleted file mode 100644 (file)
index ed39dca..0000000
+++ /dev/null
@@ -1,356 +0,0 @@
-#include <linux/kernel.h>
-#include <linux/pinctrl/pinctrl.h>
-#include "pinctrl-nomadik.h"
-
-/* All the pins that can be used for GPIO and some other functions */
-#define _GPIO(offset)          (offset)
-
-#define STN8815_PIN_B4         _GPIO(0)
-#define STN8815_PIN_D5         _GPIO(1)
-#define STN8815_PIN_C5         _GPIO(2)
-#define STN8815_PIN_A4         _GPIO(3)
-#define STN8815_PIN_B5         _GPIO(4)
-#define STN8815_PIN_D6         _GPIO(5)
-#define STN8815_PIN_C6         _GPIO(6)
-#define STN8815_PIN_B6         _GPIO(7)
-#define STN8815_PIN_B10                _GPIO(8)
-#define STN8815_PIN_A10                _GPIO(9)
-#define STN8815_PIN_C11                _GPIO(10)
-#define STN8815_PIN_B11                _GPIO(11)
-#define STN8815_PIN_A11                _GPIO(12)
-#define STN8815_PIN_C12                _GPIO(13)
-#define STN8815_PIN_B12                _GPIO(14)
-#define STN8815_PIN_A12                _GPIO(15)
-#define STN8815_PIN_C13                _GPIO(16)
-#define STN8815_PIN_B13                _GPIO(17)
-#define STN8815_PIN_A13                _GPIO(18)
-#define STN8815_PIN_D13                _GPIO(19)
-#define STN8815_PIN_C14                _GPIO(20)
-#define STN8815_PIN_B14                _GPIO(21)
-#define STN8815_PIN_A14                _GPIO(22)
-#define STN8815_PIN_D15                _GPIO(23)
-#define STN8815_PIN_C15                _GPIO(24)
-#define STN8815_PIN_B15                _GPIO(25)
-#define STN8815_PIN_A15                _GPIO(26)
-#define STN8815_PIN_C16                _GPIO(27)
-#define STN8815_PIN_B16                _GPIO(28)
-#define STN8815_PIN_A16                _GPIO(29)
-#define STN8815_PIN_D17                _GPIO(30)
-#define STN8815_PIN_C17                _GPIO(31)
-#define STN8815_PIN_AB6                _GPIO(32)
-#define STN8815_PIN_AA6                _GPIO(33)
-#define STN8815_PIN_Y6         _GPIO(34)
-#define STN8815_PIN_Y5         _GPIO(35)
-#define STN8815_PIN_AA5                _GPIO(36)
-#define STN8815_PIN_AB5                _GPIO(37)
-#define STN8815_PIN_AB4                _GPIO(38)
-#define STN8815_PIN_Y4         _GPIO(39)
-#define STN8815_PIN_R1         _GPIO(40)
-#define STN8815_PIN_R2         _GPIO(41)
-#define STN8815_PIN_R3         _GPIO(42)
-#define STN8815_PIN_P1         _GPIO(43)
-#define STN8815_PIN_P2         _GPIO(44)
-#define STN8815_PIN_P3         _GPIO(45)
-#define STN8815_PIN_N1         _GPIO(46)
-#define STN8815_PIN_N2         _GPIO(47)
-#define STN8815_PIN_N3         _GPIO(48)
-#define STN8815_PIN_M1         _GPIO(49)
-#define STN8815_PIN_M3         _GPIO(50)
-#define STN8815_PIN_M2         _GPIO(51)
-#define STN8815_PIN_L1         _GPIO(52)
-#define STN8815_PIN_L4         _GPIO(53)
-#define STN8815_PIN_L3         _GPIO(54)
-#define STN8815_PIN_L2         _GPIO(55)
-#define STN8815_PIN_F3         _GPIO(56)
-#define STN8815_PIN_F2         _GPIO(57)
-#define STN8815_PIN_E1         _GPIO(58)
-#define STN8815_PIN_E3         _GPIO(59)
-#define STN8815_PIN_E2         _GPIO(60)
-#define STN8815_PIN_E4         _GPIO(61)
-#define STN8815_PIN_D3         _GPIO(62)
-#define STN8815_PIN_D2         _GPIO(63)
-#define STN8815_PIN_F21                _GPIO(64)
-#define STN8815_PIN_F20                _GPIO(65)
-#define STN8815_PIN_E22                _GPIO(66)
-#define STN8815_PIN_D22                _GPIO(67)
-#define STN8815_PIN_E21                _GPIO(68)
-#define STN8815_PIN_E20                _GPIO(69)
-#define STN8815_PIN_C22                _GPIO(70)
-#define STN8815_PIN_D21                _GPIO(71)
-#define STN8815_PIN_D20                _GPIO(72)
-#define STN8815_PIN_C21                _GPIO(73)
-#define STN8815_PIN_C20                _GPIO(74)
-#define STN8815_PIN_C19                _GPIO(75)
-#define STN8815_PIN_B20                _GPIO(76)
-#define STN8815_PIN_B8         _GPIO(77)
-#define STN8815_PIN_A8         _GPIO(78)
-#define STN8815_PIN_C9         _GPIO(79)
-#define STN8815_PIN_B9         _GPIO(80)
-#define STN8815_PIN_A9         _GPIO(81)
-#define STN8815_PIN_C10                _GPIO(82)
-#define STN8815_PIN_K1         _GPIO(83)
-#define STN8815_PIN_K3         _GPIO(84)
-#define STN8815_PIN_K2         _GPIO(85)
-#define STN8815_PIN_J1         _GPIO(86)
-#define STN8815_PIN_J3         _GPIO(87)
-#define STN8815_PIN_J2         _GPIO(88)
-#define STN8815_PIN_H1         _GPIO(89)
-#define STN8815_PIN_H3         _GPIO(90)
-#define STN8815_PIN_H2         _GPIO(91)
-#define STN8815_PIN_G1         _GPIO(92)
-#define STN8815_PIN_G3         _GPIO(93)
-#define STN8815_PIN_G2         _GPIO(94)
-#define STN8815_PIN_F1         _GPIO(95)
-#define STN8815_PIN_T20                _GPIO(96)
-#define STN8815_PIN_R21                _GPIO(97)
-#define STN8815_PIN_R20                _GPIO(98)
-#define STN8815_PIN_U22                _GPIO(99)
-#define STN8815_PIN_N21                _GPIO(100)
-#define STN8815_PIN_N20                _GPIO(101)
-#define STN8815_PIN_P22                _GPIO(102)
-#define STN8815_PIN_N22                _GPIO(103)
-#define STN8815_PIN_V22                _GPIO(104)
-#define STN8815_PIN_V21                _GPIO(105)
-#define STN8815_PIN_K22                _GPIO(106)
-#define STN8815_PIN_K21                _GPIO(107)
-#define STN8815_PIN_H20                _GPIO(108)
-#define STN8815_PIN_G20                _GPIO(109)
-#define STN8815_PIN_L21                _GPIO(110)
-#define STN8815_PIN_H21                _GPIO(111)
-#define STN8815_PIN_J21                _GPIO(112)
-#define STN8815_PIN_H22                _GPIO(113)
-#define STN8815_PIN_K20                _GPIO(114)
-#define STN8815_PIN_L22                _GPIO(115)
-#define STN8815_PIN_G21                _GPIO(116)
-#define STN8815_PIN_J20                _GPIO(117)
-#define STN8815_PIN_G22                _GPIO(118)
-#define STN8815_PIN_U19                _GPIO(119)
-#define STN8815_PIN_G19                _GPIO(120)
-#define STN8815_PIN_M22                _GPIO(121)
-#define STN8815_PIN_M19                _GPIO(122)
-#define STN8815_PIN_J22                _GPIO(123)
-/* GPIOs 124-127 not routed to pins */
-
-/*
- * The names of the pins are denoted by GPIO number and ball name, even
- * though they can be used for other things than GPIO, this is the first
- * column in the table of the data sheet and often used on schematics and
- * such.
- */
-static const struct pinctrl_pin_desc nmk_stn8815_pins[] = {
-       PINCTRL_PIN(STN8815_PIN_B4, "GPIO0_B4"),
-       PINCTRL_PIN(STN8815_PIN_D5, "GPIO1_D5"),
-       PINCTRL_PIN(STN8815_PIN_C5, "GPIO2_C5"),
-       PINCTRL_PIN(STN8815_PIN_A4, "GPIO3_A4"),
-       PINCTRL_PIN(STN8815_PIN_B5, "GPIO4_B5"),
-       PINCTRL_PIN(STN8815_PIN_D6, "GPIO5_D6"),
-       PINCTRL_PIN(STN8815_PIN_C6, "GPIO6_C6"),
-       PINCTRL_PIN(STN8815_PIN_B6, "GPIO7_B6"),
-       PINCTRL_PIN(STN8815_PIN_B10, "GPIO8_B10"),
-       PINCTRL_PIN(STN8815_PIN_A10, "GPIO9_A10"),
-       PINCTRL_PIN(STN8815_PIN_C11, "GPIO10_C11"),
-       PINCTRL_PIN(STN8815_PIN_B11, "GPIO11_B11"),
-       PINCTRL_PIN(STN8815_PIN_A11, "GPIO12_A11"),
-       PINCTRL_PIN(STN8815_PIN_C12, "GPIO13_C12"),
-       PINCTRL_PIN(STN8815_PIN_B12, "GPIO14_B12"),
-       PINCTRL_PIN(STN8815_PIN_A12, "GPIO15_A12"),
-       PINCTRL_PIN(STN8815_PIN_C13, "GPIO16_C13"),
-       PINCTRL_PIN(STN8815_PIN_B13, "GPIO17_B13"),
-       PINCTRL_PIN(STN8815_PIN_A13, "GPIO18_A13"),
-       PINCTRL_PIN(STN8815_PIN_D13, "GPIO19_D13"),
-       PINCTRL_PIN(STN8815_PIN_C14, "GPIO20_C14"),
-       PINCTRL_PIN(STN8815_PIN_B14, "GPIO21_B14"),
-       PINCTRL_PIN(STN8815_PIN_A14, "GPIO22_A14"),
-       PINCTRL_PIN(STN8815_PIN_D15, "GPIO23_D15"),
-       PINCTRL_PIN(STN8815_PIN_C15, "GPIO24_C15"),
-       PINCTRL_PIN(STN8815_PIN_B15, "GPIO25_B15"),
-       PINCTRL_PIN(STN8815_PIN_A15, "GPIO26_A15"),
-       PINCTRL_PIN(STN8815_PIN_C16, "GPIO27_C16"),
-       PINCTRL_PIN(STN8815_PIN_B16, "GPIO28_B16"),
-       PINCTRL_PIN(STN8815_PIN_A16, "GPIO29_A16"),
-       PINCTRL_PIN(STN8815_PIN_D17, "GPIO30_D17"),
-       PINCTRL_PIN(STN8815_PIN_C17, "GPIO31_C17"),
-       PINCTRL_PIN(STN8815_PIN_AB6, "GPIO32_AB6"),
-       PINCTRL_PIN(STN8815_PIN_AA6, "GPIO33_AA6"),
-       PINCTRL_PIN(STN8815_PIN_Y6, "GPIO34_Y6"),
-       PINCTRL_PIN(STN8815_PIN_Y5, "GPIO35_Y5"),
-       PINCTRL_PIN(STN8815_PIN_AA5, "GPIO36_AA5"),
-       PINCTRL_PIN(STN8815_PIN_AB5, "GPIO37_AB5"),
-       PINCTRL_PIN(STN8815_PIN_AB4, "GPIO38_AB4"),
-       PINCTRL_PIN(STN8815_PIN_Y4, "GPIO39_Y4"),
-       PINCTRL_PIN(STN8815_PIN_R1, "GPIO40_R1"),
-       PINCTRL_PIN(STN8815_PIN_R2, "GPIO41_R2"),
-       PINCTRL_PIN(STN8815_PIN_R3, "GPIO42_R3"),
-       PINCTRL_PIN(STN8815_PIN_P1, "GPIO43_P1"),
-       PINCTRL_PIN(STN8815_PIN_P2, "GPIO44_P2"),
-       PINCTRL_PIN(STN8815_PIN_P3, "GPIO45_P3"),
-       PINCTRL_PIN(STN8815_PIN_N1, "GPIO46_N1"),
-       PINCTRL_PIN(STN8815_PIN_N2, "GPIO47_N2"),
-       PINCTRL_PIN(STN8815_PIN_N3, "GPIO48_N3"),
-       PINCTRL_PIN(STN8815_PIN_M1, "GPIO49_M1"),
-       PINCTRL_PIN(STN8815_PIN_M3, "GPIO50_M3"),
-       PINCTRL_PIN(STN8815_PIN_M2, "GPIO51_M2"),
-       PINCTRL_PIN(STN8815_PIN_L1, "GPIO52_L1"),
-       PINCTRL_PIN(STN8815_PIN_L4, "GPIO53_L4"),
-       PINCTRL_PIN(STN8815_PIN_L3, "GPIO54_L3"),
-       PINCTRL_PIN(STN8815_PIN_L2, "GPIO55_L2"),
-       PINCTRL_PIN(STN8815_PIN_F3, "GPIO56_F3"),
-       PINCTRL_PIN(STN8815_PIN_F2, "GPIO57_F2"),
-       PINCTRL_PIN(STN8815_PIN_E1, "GPIO58_E1"),
-       PINCTRL_PIN(STN8815_PIN_E3, "GPIO59_E3"),
-       PINCTRL_PIN(STN8815_PIN_E2, "GPIO60_E2"),
-       PINCTRL_PIN(STN8815_PIN_E4, "GPIO61_E4"),
-       PINCTRL_PIN(STN8815_PIN_D3, "GPIO62_D3"),
-       PINCTRL_PIN(STN8815_PIN_D2, "GPIO63_D2"),
-       PINCTRL_PIN(STN8815_PIN_F21, "GPIO64_F21"),
-       PINCTRL_PIN(STN8815_PIN_F20, "GPIO65_F20"),
-       PINCTRL_PIN(STN8815_PIN_E22, "GPIO66_E22"),
-       PINCTRL_PIN(STN8815_PIN_D22, "GPIO67_D22"),
-       PINCTRL_PIN(STN8815_PIN_E21, "GPIO68_E21"),
-       PINCTRL_PIN(STN8815_PIN_E20, "GPIO69_E20"),
-       PINCTRL_PIN(STN8815_PIN_C22, "GPIO70_C22"),
-       PINCTRL_PIN(STN8815_PIN_D21, "GPIO71_D21"),
-       PINCTRL_PIN(STN8815_PIN_D20, "GPIO72_D20"),
-       PINCTRL_PIN(STN8815_PIN_C21, "GPIO73_C21"),
-       PINCTRL_PIN(STN8815_PIN_C20, "GPIO74_C20"),
-       PINCTRL_PIN(STN8815_PIN_C19, "GPIO75_C19"),
-       PINCTRL_PIN(STN8815_PIN_B20, "GPIO76_B20"),
-       PINCTRL_PIN(STN8815_PIN_B8, "GPIO77_B8"),
-       PINCTRL_PIN(STN8815_PIN_A8, "GPIO78_A8"),
-       PINCTRL_PIN(STN8815_PIN_C9, "GPIO79_C9"),
-       PINCTRL_PIN(STN8815_PIN_B9, "GPIO80_B9"),
-       PINCTRL_PIN(STN8815_PIN_A9, "GPIO81_A9"),
-       PINCTRL_PIN(STN8815_PIN_C10, "GPIO82_C10"),
-       PINCTRL_PIN(STN8815_PIN_K1, "GPIO83_K1"),
-       PINCTRL_PIN(STN8815_PIN_K3, "GPIO84_K3"),
-       PINCTRL_PIN(STN8815_PIN_K2, "GPIO85_K2"),
-       PINCTRL_PIN(STN8815_PIN_J1, "GPIO86_J1"),
-       PINCTRL_PIN(STN8815_PIN_J3, "GPIO87_J3"),
-       PINCTRL_PIN(STN8815_PIN_J2, "GPIO88_J2"),
-       PINCTRL_PIN(STN8815_PIN_H1, "GPIO89_H1"),
-       PINCTRL_PIN(STN8815_PIN_H3, "GPIO90_H3"),
-       PINCTRL_PIN(STN8815_PIN_H2, "GPIO91_H2"),
-       PINCTRL_PIN(STN8815_PIN_G1, "GPIO92_G1"),
-       PINCTRL_PIN(STN8815_PIN_G3, "GPIO93_G3"),
-       PINCTRL_PIN(STN8815_PIN_G2, "GPIO94_G2"),
-       PINCTRL_PIN(STN8815_PIN_F1, "GPIO95_F1"),
-       PINCTRL_PIN(STN8815_PIN_T20, "GPIO96_T20"),
-       PINCTRL_PIN(STN8815_PIN_R21, "GPIO97_R21"),
-       PINCTRL_PIN(STN8815_PIN_R20, "GPIO98_R20"),
-       PINCTRL_PIN(STN8815_PIN_U22, "GPIO99_U22"),
-       PINCTRL_PIN(STN8815_PIN_N21, "GPIO100_N21"),
-       PINCTRL_PIN(STN8815_PIN_N20, "GPIO101_N20"),
-       PINCTRL_PIN(STN8815_PIN_P22, "GPIO102_P22"),
-       PINCTRL_PIN(STN8815_PIN_N22, "GPIO103_N22"),
-       PINCTRL_PIN(STN8815_PIN_V22, "GPIO104_V22"),
-       PINCTRL_PIN(STN8815_PIN_V21, "GPIO105_V21"),
-       PINCTRL_PIN(STN8815_PIN_K22, "GPIO106_K22"),
-       PINCTRL_PIN(STN8815_PIN_K21, "GPIO107_K21"),
-       PINCTRL_PIN(STN8815_PIN_H20, "GPIO108_H20"),
-       PINCTRL_PIN(STN8815_PIN_G20, "GPIO109_G20"),
-       PINCTRL_PIN(STN8815_PIN_L21, "GPIO110_L21"),
-       PINCTRL_PIN(STN8815_PIN_H21, "GPIO111_H21"),
-       PINCTRL_PIN(STN8815_PIN_J21, "GPIO112_J21"),
-       PINCTRL_PIN(STN8815_PIN_H22, "GPIO113_H22"),
-       PINCTRL_PIN(STN8815_PIN_K20, "GPIO114_K20"),
-       PINCTRL_PIN(STN8815_PIN_L22, "GPIO115_L22"),
-       PINCTRL_PIN(STN8815_PIN_G21, "GPIO116_G21"),
-       PINCTRL_PIN(STN8815_PIN_J20, "GPIO117_J20"),
-       PINCTRL_PIN(STN8815_PIN_G22, "GPIO118_G22"),
-       PINCTRL_PIN(STN8815_PIN_U19, "GPIO119_U19"),
-       PINCTRL_PIN(STN8815_PIN_G19, "GPIO120_G19"),
-       PINCTRL_PIN(STN8815_PIN_M22, "GPIO121_M22"),
-       PINCTRL_PIN(STN8815_PIN_M19, "GPIO122_M19"),
-       PINCTRL_PIN(STN8815_PIN_J22, "GPIO123_J22"),
-};
-
-#define STN8815_GPIO_RANGE(a, b, c) { .name = "STN8815", .id = a, .base = b, \
-                       .pin_base = b, .npins = c }
-
-/*
- * This matches the 32-pin gpio chips registered by the GPIO portion. This
- * cannot be const since we assign the struct gpio_chip * pointer at runtime.
- */
-static struct pinctrl_gpio_range nmk_stn8815_ranges[] = {
-       STN8815_GPIO_RANGE(0, 0, 32),
-       STN8815_GPIO_RANGE(1, 32, 32),
-       STN8815_GPIO_RANGE(2, 64, 32),
-       STN8815_GPIO_RANGE(3, 96, 28),
-};
-
-/*
- * Read the pin group names like this:
- * u0_a_1    = first groups of pins for uart0 on alt function a
- * i2c2_b_2  = second group of pins for i2c2 on alt function b
- */
-
-/* Altfunction A */
-static const unsigned u0_a_1_pins[] = { STN8815_PIN_B4, STN8815_PIN_D5,
-       STN8815_PIN_C5, STN8815_PIN_A4, STN8815_PIN_B5, STN8815_PIN_D6,
-       STN8815_PIN_C6, STN8815_PIN_B6 };
-static const unsigned mmcsd_a_1_pins[] = { STN8815_PIN_B10, STN8815_PIN_A10,
-       STN8815_PIN_C11, STN8815_PIN_B11, STN8815_PIN_A11, STN8815_PIN_C12,
-       STN8815_PIN_B12, STN8815_PIN_A12, STN8815_PIN_C13, STN8815_PIN_C15 };
-static const unsigned u1_a_1_pins[] = { STN8815_PIN_M2, STN8815_PIN_L1,
-                                       STN8815_PIN_F3, STN8815_PIN_F2 };
-static const unsigned i2c1_a_1_pins[] = { STN8815_PIN_L4, STN8815_PIN_L3 };
-static const unsigned i2c0_a_1_pins[] = { STN8815_PIN_D3, STN8815_PIN_D2 };
-/* Altfunction B */
-static const unsigned u1_b_1_pins[] = { STN8815_PIN_B16, STN8815_PIN_A16 };
-static const unsigned i2cusb_b_1_pins[] = { STN8815_PIN_C21, STN8815_PIN_C20 };
-
-#define STN8815_PIN_GROUP(a, b) { .name = #a, .pins = a##_pins,                \
-                       .npins = ARRAY_SIZE(a##_pins), .altsetting = b }
-
-static const struct nmk_pingroup nmk_stn8815_groups[] = {
-       STN8815_PIN_GROUP(u0_a_1, NMK_GPIO_ALT_A),
-       STN8815_PIN_GROUP(mmcsd_a_1, NMK_GPIO_ALT_A),
-       STN8815_PIN_GROUP(u1_a_1, NMK_GPIO_ALT_A),
-       STN8815_PIN_GROUP(i2c1_a_1, NMK_GPIO_ALT_A),
-       STN8815_PIN_GROUP(i2c0_a_1, NMK_GPIO_ALT_A),
-       STN8815_PIN_GROUP(u1_b_1, NMK_GPIO_ALT_B),
-       STN8815_PIN_GROUP(i2cusb_b_1, NMK_GPIO_ALT_B),
-};
-
-/* We use this macro to define the groups applicable to a function */
-#define STN8815_FUNC_GROUPS(a, b...)      \
-static const char * const a##_groups[] = { b };
-
-STN8815_FUNC_GROUPS(u0, "u0_a_1");
-STN8815_FUNC_GROUPS(mmcsd, "mmcsd_a_1");
-STN8815_FUNC_GROUPS(u1, "u1_a_1", "u1_b_1");
-STN8815_FUNC_GROUPS(i2c1, "i2c1_a_1");
-STN8815_FUNC_GROUPS(i2c0, "i2c0_a_1");
-STN8815_FUNC_GROUPS(i2cusb, "i2cusb_b_1");
-
-#define FUNCTION(fname)                                        \
-       {                                               \
-               .name = #fname,                         \
-               .groups = fname##_groups,               \
-               .ngroups = ARRAY_SIZE(fname##_groups),  \
-       }
-
-static const struct nmk_function nmk_stn8815_functions[] = {
-       FUNCTION(u0),
-       FUNCTION(mmcsd),
-       FUNCTION(u1),
-       FUNCTION(i2c1),
-       FUNCTION(i2c0),
-       FUNCTION(i2cusb),
-};
-
-static const struct nmk_pinctrl_soc_data nmk_stn8815_soc = {
-       .gpio_ranges = nmk_stn8815_ranges,
-       .gpio_num_ranges = ARRAY_SIZE(nmk_stn8815_ranges),
-       .pins = nmk_stn8815_pins,
-       .npins = ARRAY_SIZE(nmk_stn8815_pins),
-       .functions = nmk_stn8815_functions,
-       .nfunctions = ARRAY_SIZE(nmk_stn8815_functions),
-       .groups = nmk_stn8815_groups,
-       .ngroups = ARRAY_SIZE(nmk_stn8815_groups),
-};
-
-void nmk_pinctrl_stn8815_init(const struct nmk_pinctrl_soc_data **soc)
-{
-       *soc = &nmk_stn8815_soc;
-}
diff --git a/drivers/pinctrl/pinctrl-nomadik.c b/drivers/pinctrl/pinctrl-nomadik.c
deleted file mode 100644 (file)
index 8f6f16e..0000000
+++ /dev/null
@@ -1,2115 +0,0 @@
-/*
- * Generic GPIO driver for logic cells found in the Nomadik SoC
- *
- * Copyright (C) 2008,2009 STMicroelectronics
- * Copyright (C) 2009 Alessandro Rubini <rubini@unipv.it>
- *   Rewritten based on work by Prafulla WADASKAR <prafulla.wadaskar@st.com>
- * Copyright (C) 2011-2013 Linus Walleij <linus.walleij@linaro.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/device.h>
-#include <linux/platform_device.h>
-#include <linux/io.h>
-#include <linux/clk.h>
-#include <linux/err.h>
-#include <linux/gpio.h>
-#include <linux/spinlock.h>
-#include <linux/interrupt.h>
-#include <linux/slab.h>
-#include <linux/of_device.h>
-#include <linux/of_address.h>
-#include <linux/pinctrl/machine.h>
-#include <linux/pinctrl/pinctrl.h>
-#include <linux/pinctrl/pinmux.h>
-#include <linux/pinctrl/pinconf.h>
-/* Since we request GPIOs from ourself */
-#include <linux/pinctrl/consumer.h>
-#include "pinctrl-nomadik.h"
-#include "core.h"
-
-/*
- * The GPIO module in the Nomadik family of Systems-on-Chip is an
- * AMBA device, managing 32 pins and alternate functions.  The logic block
- * is currently used in the Nomadik and ux500.
- *
- * Symbols in this file are called "nmk_gpio" for "nomadik gpio"
- */
-
-/*
- * pin configurations are represented by 32-bit integers:
- *
- *     bit  0.. 8 - Pin Number (512 Pins Maximum)
- *     bit  9..10 - Alternate Function Selection
- *     bit 11..12 - Pull up/down state
- *     bit     13 - Sleep mode behaviour
- *     bit     14 - Direction
- *     bit     15 - Value (if output)
- *     bit 16..18 - SLPM pull up/down state
- *     bit 19..20 - SLPM direction
- *     bit 21..22 - SLPM Value (if output)
- *     bit 23..25 - PDIS value (if input)
- *     bit     26 - Gpio mode
- *     bit     27 - Sleep mode
- *
- * to facilitate the definition, the following macros are provided
- *
- * PIN_CFG_DEFAULT - default config (0):
- *                  pull up/down = disabled
- *                  sleep mode = input/wakeup
- *                  direction = input
- *                  value = low
- *                  SLPM direction = same as normal
- *                  SLPM pull = same as normal
- *                  SLPM value = same as normal
- *
- * PIN_CFG        - default config with alternate function
- */
-
-typedef unsigned long pin_cfg_t;
-
-#define PIN_NUM_MASK           0x1ff
-#define PIN_NUM(x)             ((x) & PIN_NUM_MASK)
-
-#define PIN_ALT_SHIFT          9
-#define PIN_ALT_MASK           (0x3 << PIN_ALT_SHIFT)
-#define PIN_ALT(x)             (((x) & PIN_ALT_MASK) >> PIN_ALT_SHIFT)
-#define PIN_GPIO               (NMK_GPIO_ALT_GPIO << PIN_ALT_SHIFT)
-#define PIN_ALT_A              (NMK_GPIO_ALT_A << PIN_ALT_SHIFT)
-#define PIN_ALT_B              (NMK_GPIO_ALT_B << PIN_ALT_SHIFT)
-#define PIN_ALT_C              (NMK_GPIO_ALT_C << PIN_ALT_SHIFT)
-
-#define PIN_PULL_SHIFT         11
-#define PIN_PULL_MASK          (0x3 << PIN_PULL_SHIFT)
-#define PIN_PULL(x)            (((x) & PIN_PULL_MASK) >> PIN_PULL_SHIFT)
-#define PIN_PULL_NONE          (NMK_GPIO_PULL_NONE << PIN_PULL_SHIFT)
-#define PIN_PULL_UP            (NMK_GPIO_PULL_UP << PIN_PULL_SHIFT)
-#define PIN_PULL_DOWN          (NMK_GPIO_PULL_DOWN << PIN_PULL_SHIFT)
-
-#define PIN_SLPM_SHIFT         13
-#define PIN_SLPM_MASK          (0x1 << PIN_SLPM_SHIFT)
-#define PIN_SLPM(x)            (((x) & PIN_SLPM_MASK) >> PIN_SLPM_SHIFT)
-#define PIN_SLPM_MAKE_INPUT    (NMK_GPIO_SLPM_INPUT << PIN_SLPM_SHIFT)
-#define PIN_SLPM_NOCHANGE      (NMK_GPIO_SLPM_NOCHANGE << PIN_SLPM_SHIFT)
-/* These two replace the above in DB8500v2+ */
-#define PIN_SLPM_WAKEUP_ENABLE (NMK_GPIO_SLPM_WAKEUP_ENABLE << PIN_SLPM_SHIFT)
-#define PIN_SLPM_WAKEUP_DISABLE        (NMK_GPIO_SLPM_WAKEUP_DISABLE << PIN_SLPM_SHIFT)
-#define PIN_SLPM_USE_MUX_SETTINGS_IN_SLEEP PIN_SLPM_WAKEUP_DISABLE
-
-#define PIN_SLPM_GPIO  PIN_SLPM_WAKEUP_ENABLE /* In SLPM, pin is a gpio */
-#define PIN_SLPM_ALTFUNC PIN_SLPM_WAKEUP_DISABLE /* In SLPM, pin is altfunc */
-
-#define PIN_DIR_SHIFT          14
-#define PIN_DIR_MASK           (0x1 << PIN_DIR_SHIFT)
-#define PIN_DIR(x)             (((x) & PIN_DIR_MASK) >> PIN_DIR_SHIFT)
-#define PIN_DIR_INPUT          (0 << PIN_DIR_SHIFT)
-#define PIN_DIR_OUTPUT         (1 << PIN_DIR_SHIFT)
-
-#define PIN_VAL_SHIFT          15
-#define PIN_VAL_MASK           (0x1 << PIN_VAL_SHIFT)
-#define PIN_VAL(x)             (((x) & PIN_VAL_MASK) >> PIN_VAL_SHIFT)
-#define PIN_VAL_LOW            (0 << PIN_VAL_SHIFT)
-#define PIN_VAL_HIGH           (1 << PIN_VAL_SHIFT)
-
-#define PIN_SLPM_PULL_SHIFT    16
-#define PIN_SLPM_PULL_MASK     (0x7 << PIN_SLPM_PULL_SHIFT)
-#define PIN_SLPM_PULL(x)       \
-       (((x) & PIN_SLPM_PULL_MASK) >> PIN_SLPM_PULL_SHIFT)
-#define PIN_SLPM_PULL_NONE     \
-       ((1 + NMK_GPIO_PULL_NONE) << PIN_SLPM_PULL_SHIFT)
-#define PIN_SLPM_PULL_UP       \
-       ((1 + NMK_GPIO_PULL_UP) << PIN_SLPM_PULL_SHIFT)
-#define PIN_SLPM_PULL_DOWN     \
-       ((1 + NMK_GPIO_PULL_DOWN) << PIN_SLPM_PULL_SHIFT)
-
-#define PIN_SLPM_DIR_SHIFT     19
-#define PIN_SLPM_DIR_MASK      (0x3 << PIN_SLPM_DIR_SHIFT)
-#define PIN_SLPM_DIR(x)                \
-       (((x) & PIN_SLPM_DIR_MASK) >> PIN_SLPM_DIR_SHIFT)
-#define PIN_SLPM_DIR_INPUT     ((1 + 0) << PIN_SLPM_DIR_SHIFT)
-#define PIN_SLPM_DIR_OUTPUT    ((1 + 1) << PIN_SLPM_DIR_SHIFT)
-
-#define PIN_SLPM_VAL_SHIFT     21
-#define PIN_SLPM_VAL_MASK      (0x3 << PIN_SLPM_VAL_SHIFT)
-#define PIN_SLPM_VAL(x)                \
-       (((x) & PIN_SLPM_VAL_MASK) >> PIN_SLPM_VAL_SHIFT)
-#define PIN_SLPM_VAL_LOW       ((1 + 0) << PIN_SLPM_VAL_SHIFT)
-#define PIN_SLPM_VAL_HIGH      ((1 + 1) << PIN_SLPM_VAL_SHIFT)
-
-#define PIN_SLPM_PDIS_SHIFT            23
-#define PIN_SLPM_PDIS_MASK             (0x3 << PIN_SLPM_PDIS_SHIFT)
-#define PIN_SLPM_PDIS(x)       \
-       (((x) & PIN_SLPM_PDIS_MASK) >> PIN_SLPM_PDIS_SHIFT)
-#define PIN_SLPM_PDIS_NO_CHANGE                (0 << PIN_SLPM_PDIS_SHIFT)
-#define PIN_SLPM_PDIS_DISABLED         (1 << PIN_SLPM_PDIS_SHIFT)
-#define PIN_SLPM_PDIS_ENABLED          (2 << PIN_SLPM_PDIS_SHIFT)
-
-#define PIN_LOWEMI_SHIFT       25
-#define PIN_LOWEMI_MASK                (0x1 << PIN_LOWEMI_SHIFT)
-#define PIN_LOWEMI(x)          (((x) & PIN_LOWEMI_MASK) >> PIN_LOWEMI_SHIFT)
-#define PIN_LOWEMI_DISABLED    (0 << PIN_LOWEMI_SHIFT)
-#define PIN_LOWEMI_ENABLED     (1 << PIN_LOWEMI_SHIFT)
-
-#define PIN_GPIOMODE_SHIFT     26
-#define PIN_GPIOMODE_MASK      (0x1 << PIN_GPIOMODE_SHIFT)
-#define PIN_GPIOMODE(x)                (((x) & PIN_GPIOMODE_MASK) >> PIN_GPIOMODE_SHIFT)
-#define PIN_GPIOMODE_DISABLED  (0 << PIN_GPIOMODE_SHIFT)
-#define PIN_GPIOMODE_ENABLED   (1 << PIN_GPIOMODE_SHIFT)
-
-#define PIN_SLEEPMODE_SHIFT    27
-#define PIN_SLEEPMODE_MASK     (0x1 << PIN_SLEEPMODE_SHIFT)
-#define PIN_SLEEPMODE(x)       (((x) & PIN_SLEEPMODE_MASK) >> PIN_SLEEPMODE_SHIFT)
-#define PIN_SLEEPMODE_DISABLED (0 << PIN_SLEEPMODE_SHIFT)
-#define PIN_SLEEPMODE_ENABLED  (1 << PIN_SLEEPMODE_SHIFT)
-
-
-/* Shortcuts.  Use these instead of separate DIR, PULL, and VAL.  */
-#define PIN_INPUT_PULLDOWN     (PIN_DIR_INPUT | PIN_PULL_DOWN)
-#define PIN_INPUT_PULLUP       (PIN_DIR_INPUT | PIN_PULL_UP)
-#define PIN_INPUT_NOPULL       (PIN_DIR_INPUT | PIN_PULL_NONE)
-#define PIN_OUTPUT_LOW         (PIN_DIR_OUTPUT | PIN_VAL_LOW)
-#define PIN_OUTPUT_HIGH                (PIN_DIR_OUTPUT | PIN_VAL_HIGH)
-
-#define PIN_SLPM_INPUT_PULLDOWN        (PIN_SLPM_DIR_INPUT | PIN_SLPM_PULL_DOWN)
-#define PIN_SLPM_INPUT_PULLUP  (PIN_SLPM_DIR_INPUT | PIN_SLPM_PULL_UP)
-#define PIN_SLPM_INPUT_NOPULL  (PIN_SLPM_DIR_INPUT | PIN_SLPM_PULL_NONE)
-#define PIN_SLPM_OUTPUT_LOW    (PIN_SLPM_DIR_OUTPUT | PIN_SLPM_VAL_LOW)
-#define PIN_SLPM_OUTPUT_HIGH   (PIN_SLPM_DIR_OUTPUT | PIN_SLPM_VAL_HIGH)
-
-#define PIN_CFG_DEFAULT                (0)
-
-#define PIN_CFG(num, alt)              \
-       (PIN_CFG_DEFAULT |\
-        (PIN_NUM(num) | PIN_##alt))
-
-#define PIN_CFG_INPUT(num, alt, pull)          \
-       (PIN_CFG_DEFAULT |\
-        (PIN_NUM(num) | PIN_##alt | PIN_INPUT_##pull))
-
-#define PIN_CFG_OUTPUT(num, alt, val)          \
-       (PIN_CFG_DEFAULT |\
-        (PIN_NUM(num) | PIN_##alt | PIN_OUTPUT_##val))
-
-/*
- * "nmk_gpio" and "NMK_GPIO" stand for "Nomadik GPIO", leaving
- * the "gpio" namespace for generic and cross-machine functions
- */
-
-#define GPIO_BLOCK_SHIFT 5
-#define NMK_GPIO_PER_CHIP (1 << GPIO_BLOCK_SHIFT)
-
-/* Register in the logic block */
-#define NMK_GPIO_DAT   0x00
-#define NMK_GPIO_DATS  0x04
-#define NMK_GPIO_DATC  0x08
-#define NMK_GPIO_PDIS  0x0c
-#define NMK_GPIO_DIR   0x10
-#define NMK_GPIO_DIRS  0x14
-#define NMK_GPIO_DIRC  0x18
-#define NMK_GPIO_SLPC  0x1c
-#define NMK_GPIO_AFSLA 0x20
-#define NMK_GPIO_AFSLB 0x24
-#define NMK_GPIO_LOWEMI        0x28
-
-#define NMK_GPIO_RIMSC 0x40
-#define NMK_GPIO_FIMSC 0x44
-#define NMK_GPIO_IS    0x48
-#define NMK_GPIO_IC    0x4c
-#define NMK_GPIO_RWIMSC        0x50
-#define NMK_GPIO_FWIMSC        0x54
-#define NMK_GPIO_WKS   0x58
-/* These appear in DB8540 and later ASICs */
-#define NMK_GPIO_EDGELEVEL 0x5C
-#define NMK_GPIO_LEVEL 0x60
-
-
-/* Pull up/down values */
-enum nmk_gpio_pull {
-       NMK_GPIO_PULL_NONE,
-       NMK_GPIO_PULL_UP,
-       NMK_GPIO_PULL_DOWN,
-};
-
-/* Sleep mode */
-enum nmk_gpio_slpm {
-       NMK_GPIO_SLPM_INPUT,
-       NMK_GPIO_SLPM_WAKEUP_ENABLE = NMK_GPIO_SLPM_INPUT,
-       NMK_GPIO_SLPM_NOCHANGE,
-       NMK_GPIO_SLPM_WAKEUP_DISABLE = NMK_GPIO_SLPM_NOCHANGE,
-};
-
-struct nmk_gpio_chip {
-       struct gpio_chip chip;
-       void __iomem *addr;
-       struct clk *clk;
-       unsigned int bank;
-       unsigned int parent_irq;
-       int latent_parent_irq;
-       u32 (*get_latent_status)(unsigned int bank);
-       void (*set_ioforce)(bool enable);
-       spinlock_t lock;
-       bool sleepmode;
-       /* Keep track of configured edges */
-       u32 edge_rising;
-       u32 edge_falling;
-       u32 real_wake;
-       u32 rwimsc;
-       u32 fwimsc;
-       u32 rimsc;
-       u32 fimsc;
-       u32 pull_up;
-       u32 lowemi;
-};
-
-/**
- * struct nmk_pinctrl - state container for the Nomadik pin controller
- * @dev: containing device pointer
- * @pctl: corresponding pin controller device
- * @soc: SoC data for this specific chip
- * @prcm_base: PRCM register range virtual base
- */
-struct nmk_pinctrl {
-       struct device *dev;
-       struct pinctrl_dev *pctl;
-       const struct nmk_pinctrl_soc_data *soc;
-       void __iomem *prcm_base;
-};
-
-static struct nmk_gpio_chip *
-nmk_gpio_chips[DIV_ROUND_UP(ARCH_NR_GPIOS, NMK_GPIO_PER_CHIP)];
-
-static DEFINE_SPINLOCK(nmk_gpio_slpm_lock);
-
-#define NUM_BANKS ARRAY_SIZE(nmk_gpio_chips)
-
-static void __nmk_gpio_set_mode(struct nmk_gpio_chip *nmk_chip,
-                               unsigned offset, int gpio_mode)
-{
-       u32 bit = 1 << offset;
-       u32 afunc, bfunc;
-
-       afunc = readl(nmk_chip->addr + NMK_GPIO_AFSLA) & ~bit;
-       bfunc = readl(nmk_chip->addr + NMK_GPIO_AFSLB) & ~bit;
-       if (gpio_mode & NMK_GPIO_ALT_A)
-               afunc |= bit;
-       if (gpio_mode & NMK_GPIO_ALT_B)
-               bfunc |= bit;
-       writel(afunc, nmk_chip->addr + NMK_GPIO_AFSLA);
-       writel(bfunc, nmk_chip->addr + NMK_GPIO_AFSLB);
-}
-
-static void __nmk_gpio_set_slpm(struct nmk_gpio_chip *nmk_chip,
-                               unsigned offset, enum nmk_gpio_slpm mode)
-{
-       u32 bit = 1 << offset;
-       u32 slpm;
-
-       slpm = readl(nmk_chip->addr + NMK_GPIO_SLPC);
-       if (mode == NMK_GPIO_SLPM_NOCHANGE)
-               slpm |= bit;
-       else
-               slpm &= ~bit;
-       writel(slpm, nmk_chip->addr + NMK_GPIO_SLPC);
-}
-
-static void __nmk_gpio_set_pull(struct nmk_gpio_chip *nmk_chip,
-                               unsigned offset, enum nmk_gpio_pull pull)
-{
-       u32 bit = 1 << offset;
-       u32 pdis;
-
-       pdis = readl(nmk_chip->addr + NMK_GPIO_PDIS);
-       if (pull == NMK_GPIO_PULL_NONE) {
-               pdis |= bit;
-               nmk_chip->pull_up &= ~bit;
-       } else {
-               pdis &= ~bit;
-       }
-
-       writel(pdis, nmk_chip->addr + NMK_GPIO_PDIS);
-
-       if (pull == NMK_GPIO_PULL_UP) {
-               nmk_chip->pull_up |= bit;
-               writel(bit, nmk_chip->addr + NMK_GPIO_DATS);
-       } else if (pull == NMK_GPIO_PULL_DOWN) {
-               nmk_chip->pull_up &= ~bit;
-               writel(bit, nmk_chip->addr + NMK_GPIO_DATC);
-       }
-}
-
-static void __nmk_gpio_set_lowemi(struct nmk_gpio_chip *nmk_chip,
-                                 unsigned offset, bool lowemi)
-{
-       u32 bit = BIT(offset);
-       bool enabled = nmk_chip->lowemi & bit;
-
-       if (lowemi == enabled)
-               return;
-
-       if (lowemi)
-               nmk_chip->lowemi |= bit;
-       else
-               nmk_chip->lowemi &= ~bit;
-
-       writel_relaxed(nmk_chip->lowemi,
-                      nmk_chip->addr + NMK_GPIO_LOWEMI);
-}
-
-static void __nmk_gpio_make_input(struct nmk_gpio_chip *nmk_chip,
-                                 unsigned offset)
-{
-       writel(1 << offset, nmk_chip->addr + NMK_GPIO_DIRC);
-}
-
-static void __nmk_gpio_set_output(struct nmk_gpio_chip *nmk_chip,
-                                 unsigned offset, int val)
-{
-       if (val)
-               writel(1 << offset, nmk_chip->addr + NMK_GPIO_DATS);
-       else
-               writel(1 << offset, nmk_chip->addr + NMK_GPIO_DATC);
-}
-
-static void __nmk_gpio_make_output(struct nmk_gpio_chip *nmk_chip,
-                                 unsigned offset, int val)
-{
-       writel(1 << offset, nmk_chip->addr + NMK_GPIO_DIRS);
-       __nmk_gpio_set_output(nmk_chip, offset, val);
-}
-
-static void __nmk_gpio_set_mode_safe(struct nmk_gpio_chip *nmk_chip,
-                                    unsigned offset, int gpio_mode,
-                                    bool glitch)
-{
-       u32 rwimsc = nmk_chip->rwimsc;
-       u32 fwimsc = nmk_chip->fwimsc;
-
-       if (glitch && nmk_chip->set_ioforce) {
-               u32 bit = BIT(offset);
-
-               /* Prevent spurious wakeups */
-               writel(rwimsc & ~bit, nmk_chip->addr + NMK_GPIO_RWIMSC);
-               writel(fwimsc & ~bit, nmk_chip->addr + NMK_GPIO_FWIMSC);
-
-               nmk_chip->set_ioforce(true);
-       }
-
-       __nmk_gpio_set_mode(nmk_chip, offset, gpio_mode);
-
-       if (glitch && nmk_chip->set_ioforce) {
-               nmk_chip->set_ioforce(false);
-
-               writel(rwimsc, nmk_chip->addr + NMK_GPIO_RWIMSC);
-               writel(fwimsc, nmk_chip->addr + NMK_GPIO_FWIMSC);
-       }
-}
-
-static void
-nmk_gpio_disable_lazy_irq(struct nmk_gpio_chip *nmk_chip, unsigned offset)
-{
-       u32 falling = nmk_chip->fimsc & BIT(offset);
-       u32 rising = nmk_chip->rimsc & BIT(offset);
-       int gpio = nmk_chip->chip.base + offset;
-       int irq = irq_find_mapping(nmk_chip->chip.irqdomain, offset);
-       struct irq_data *d = irq_get_irq_data(irq);
-
-       if (!rising && !falling)
-               return;
-
-       if (!d || !irqd_irq_disabled(d))
-               return;
-
-       if (rising) {
-               nmk_chip->rimsc &= ~BIT(offset);
-               writel_relaxed(nmk_chip->rimsc,
-                              nmk_chip->addr + NMK_GPIO_RIMSC);
-       }
-
-       if (falling) {
-               nmk_chip->fimsc &= ~BIT(offset);
-               writel_relaxed(nmk_chip->fimsc,
-                              nmk_chip->addr + NMK_GPIO_FIMSC);
-       }
-
-       dev_dbg(nmk_chip->chip.dev, "%d: clearing interrupt mask\n", gpio);
-}
-
-static void nmk_write_masked(void __iomem *reg, u32 mask, u32 value)
-{
-       u32 val;
-
-       val = readl(reg);
-       val = ((val & ~mask) | (value & mask));
-       writel(val, reg);
-}
-
-static void nmk_prcm_altcx_set_mode(struct nmk_pinctrl *npct,
-       unsigned offset, unsigned alt_num)
-{
-       int i;
-       u16 reg;
-       u8 bit;
-       u8 alt_index;
-       const struct prcm_gpiocr_altcx_pin_desc *pin_desc;
-       const u16 *gpiocr_regs;
-
-       if (!npct->prcm_base)
-               return;
-
-       if (alt_num > PRCM_IDX_GPIOCR_ALTC_MAX) {
-               dev_err(npct->dev, "PRCM GPIOCR: alternate-C%i is invalid\n",
-                       alt_num);
-               return;
-       }
-
-       for (i = 0 ; i < npct->soc->npins_altcx ; i++) {
-               if (npct->soc->altcx_pins[i].pin == offset)
-                       break;
-       }
-       if (i == npct->soc->npins_altcx) {
-               dev_dbg(npct->dev, "PRCM GPIOCR: pin %i is not found\n",
-                       offset);
-               return;
-       }
-
-       pin_desc = npct->soc->altcx_pins + i;
-       gpiocr_regs = npct->soc->prcm_gpiocr_registers;
-
-       /*
-        * If alt_num is NULL, just clear current ALTCx selection
-        * to make sure we come back to a pure ALTC selection
-        */
-       if (!alt_num) {
-               for (i = 0 ; i < PRCM_IDX_GPIOCR_ALTC_MAX ; i++) {
-                       if (pin_desc->altcx[i].used == true) {
-                               reg = gpiocr_regs[pin_desc->altcx[i].reg_index];
-                               bit = pin_desc->altcx[i].control_bit;
-                               if (readl(npct->prcm_base + reg) & BIT(bit)) {
-                                       nmk_write_masked(npct->prcm_base + reg, BIT(bit), 0);
-                                       dev_dbg(npct->dev,
-                                               "PRCM GPIOCR: pin %i: alternate-C%i has been disabled\n",
-                                               offset, i+1);
-                               }
-                       }
-               }
-               return;
-       }
-
-       alt_index = alt_num - 1;
-       if (pin_desc->altcx[alt_index].used == false) {
-               dev_warn(npct->dev,
-                       "PRCM GPIOCR: pin %i: alternate-C%i does not exist\n",
-                       offset, alt_num);
-               return;
-       }
-
-       /*
-        * Check if any other ALTCx functions are activated on this pin
-        * and disable it first.
-        */
-       for (i = 0 ; i < PRCM_IDX_GPIOCR_ALTC_MAX ; i++) {
-               if (i == alt_index)
-                       continue;
-               if (pin_desc->altcx[i].used == true) {
-                       reg = gpiocr_regs[pin_desc->altcx[i].reg_index];
-                       bit = pin_desc->altcx[i].control_bit;
-                       if (readl(npct->prcm_base + reg) & BIT(bit)) {
-                               nmk_write_masked(npct->prcm_base + reg, BIT(bit), 0);
-                               dev_dbg(npct->dev,
-                                       "PRCM GPIOCR: pin %i: alternate-C%i has been disabled\n",
-                                       offset, i+1);
-                       }
-               }
-       }
-
-       reg = gpiocr_regs[pin_desc->altcx[alt_index].reg_index];
-       bit = pin_desc->altcx[alt_index].control_bit;
-       dev_dbg(npct->dev, "PRCM GPIOCR: pin %i: alternate-C%i has been selected\n",
-               offset, alt_index+1);
-       nmk_write_masked(npct->prcm_base + reg, BIT(bit), BIT(bit));
-}
-
-/*
- * Safe sequence used to switch IOs between GPIO and Alternate-C mode:
- *  - Save SLPM registers
- *  - Set SLPM=0 for the IOs you want to switch and others to 1
- *  - Configure the GPIO registers for the IOs that are being switched
- *  - Set IOFORCE=1
- *  - Modify the AFLSA/B registers for the IOs that are being switched
- *  - Set IOFORCE=0
- *  - Restore SLPM registers
- *  - Any spurious wake up event during switch sequence to be ignored and
- *    cleared
- */
-static void nmk_gpio_glitch_slpm_init(unsigned int *slpm)
-{
-       int i;
-
-       for (i = 0; i < NUM_BANKS; i++) {
-               struct nmk_gpio_chip *chip = nmk_gpio_chips[i];
-               unsigned int temp = slpm[i];
-
-               if (!chip)
-                       break;
-
-               clk_enable(chip->clk);
-
-               slpm[i] = readl(chip->addr + NMK_GPIO_SLPC);
-               writel(temp, chip->addr + NMK_GPIO_SLPC);
-       }
-}
-
-static void nmk_gpio_glitch_slpm_restore(unsigned int *slpm)
-{
-       int i;
-
-       for (i = 0; i < NUM_BANKS; i++) {
-               struct nmk_gpio_chip *chip = nmk_gpio_chips[i];
-
-               if (!chip)
-                       break;
-
-               writel(slpm[i], chip->addr + NMK_GPIO_SLPC);
-
-               clk_disable(chip->clk);
-       }
-}
-
-static int __maybe_unused nmk_prcm_gpiocr_get_mode(struct pinctrl_dev *pctldev, int gpio)
-{
-       int i;
-       u16 reg;
-       u8 bit;
-       struct nmk_pinctrl *npct = pinctrl_dev_get_drvdata(pctldev);
-       const struct prcm_gpiocr_altcx_pin_desc *pin_desc;
-       const u16 *gpiocr_regs;
-
-       if (!npct->prcm_base)
-               return NMK_GPIO_ALT_C;
-
-       for (i = 0; i < npct->soc->npins_altcx; i++) {
-               if (npct->soc->altcx_pins[i].pin == gpio)
-                       break;
-       }
-       if (i == npct->soc->npins_altcx)
-               return NMK_GPIO_ALT_C;
-
-       pin_desc = npct->soc->altcx_pins + i;
-       gpiocr_regs = npct->soc->prcm_gpiocr_registers;
-       for (i = 0; i < PRCM_IDX_GPIOCR_ALTC_MAX; i++) {
-               if (pin_desc->altcx[i].used == true) {
-                       reg = gpiocr_regs[pin_desc->altcx[i].reg_index];
-                       bit = pin_desc->altcx[i].control_bit;
-                       if (readl(npct->prcm_base + reg) & BIT(bit))
-                               return NMK_GPIO_ALT_C+i+1;
-               }
-       }
-       return NMK_GPIO_ALT_C;
-}
-
-int nmk_gpio_get_mode(int gpio)
-{
-       struct nmk_gpio_chip *nmk_chip;
-       u32 afunc, bfunc, bit;
-
-       nmk_chip = nmk_gpio_chips[gpio / NMK_GPIO_PER_CHIP];
-       if (!nmk_chip)
-               return -EINVAL;
-
-       bit = 1 << (gpio % NMK_GPIO_PER_CHIP);
-
-       clk_enable(nmk_chip->clk);
-
-       afunc = readl(nmk_chip->addr + NMK_GPIO_AFSLA) & bit;
-       bfunc = readl(nmk_chip->addr + NMK_GPIO_AFSLB) & bit;
-
-       clk_disable(nmk_chip->clk);
-
-       return (afunc ? NMK_GPIO_ALT_A : 0) | (bfunc ? NMK_GPIO_ALT_B : 0);
-}
-EXPORT_SYMBOL(nmk_gpio_get_mode);
-
-
-/* IRQ functions */
-static inline int nmk_gpio_get_bitmask(int gpio)
-{
-       return 1 << (gpio % NMK_GPIO_PER_CHIP);
-}
-
-static void nmk_gpio_irq_ack(struct irq_data *d)
-{
-       struct gpio_chip *chip = irq_data_get_irq_chip_data(d);
-       struct nmk_gpio_chip *nmk_chip = container_of(chip, struct nmk_gpio_chip, chip);
-
-       clk_enable(nmk_chip->clk);
-       writel(nmk_gpio_get_bitmask(d->hwirq), nmk_chip->addr + NMK_GPIO_IC);
-       clk_disable(nmk_chip->clk);
-}
-
-enum nmk_gpio_irq_type {
-       NORMAL,
-       WAKE,
-};
-
-static void __nmk_gpio_irq_modify(struct nmk_gpio_chip *nmk_chip,
-                                 int gpio, enum nmk_gpio_irq_type which,
-                                 bool enable)
-{
-       u32 bitmask = nmk_gpio_get_bitmask(gpio);
-       u32 *rimscval;
-       u32 *fimscval;
-       u32 rimscreg;
-       u32 fimscreg;
-
-       if (which == NORMAL) {
-               rimscreg = NMK_GPIO_RIMSC;
-               fimscreg = NMK_GPIO_FIMSC;
-               rimscval = &nmk_chip->rimsc;
-               fimscval = &nmk_chip->fimsc;
-       } else  {
-               rimscreg = NMK_GPIO_RWIMSC;
-               fimscreg = NMK_GPIO_FWIMSC;
-               rimscval = &nmk_chip->rwimsc;
-               fimscval = &nmk_chip->fwimsc;
-       }
-
-       /* we must individually set/clear the two edges */
-       if (nmk_chip->edge_rising & bitmask) {
-               if (enable)
-                       *rimscval |= bitmask;
-               else
-                       *rimscval &= ~bitmask;
-               writel(*rimscval, nmk_chip->addr + rimscreg);
-       }
-       if (nmk_chip->edge_falling & bitmask) {
-               if (enable)
-                       *fimscval |= bitmask;
-               else
-                       *fimscval &= ~bitmask;
-               writel(*fimscval, nmk_chip->addr + fimscreg);
-       }
-}
-
-static void __nmk_gpio_set_wake(struct nmk_gpio_chip *nmk_chip,
-                               int gpio, bool on)
-{
-       /*
-        * Ensure WAKEUP_ENABLE is on.  No need to disable it if wakeup is
-        * disabled, since setting SLPM to 1 increases power consumption, and
-        * wakeup is anyhow controlled by the RIMSC and FIMSC registers.
-        */
-       if (nmk_chip->sleepmode && on) {
-               __nmk_gpio_set_slpm(nmk_chip, gpio % NMK_GPIO_PER_CHIP,
-                                   NMK_GPIO_SLPM_WAKEUP_ENABLE);
-       }
-
-       __nmk_gpio_irq_modify(nmk_chip, gpio, WAKE, on);
-}
-
-static int nmk_gpio_irq_maskunmask(struct irq_data *d, bool enable)
-{
-       struct nmk_gpio_chip *nmk_chip;
-       unsigned long flags;
-       u32 bitmask;
-
-       nmk_chip = irq_data_get_irq_chip_data(d);
-       bitmask = nmk_gpio_get_bitmask(d->hwirq);
-       if (!nmk_chip)
-               return -EINVAL;
-
-       clk_enable(nmk_chip->clk);
-       spin_lock_irqsave(&nmk_gpio_slpm_lock, flags);
-       spin_lock(&nmk_chip->lock);
-
-       __nmk_gpio_irq_modify(nmk_chip, d->hwirq, NORMAL, enable);
-
-       if (!(nmk_chip->real_wake & bitmask))
-               __nmk_gpio_set_wake(nmk_chip, d->hwirq, enable);
-
-       spin_unlock(&nmk_chip->lock);
-       spin_unlock_irqrestore(&nmk_gpio_slpm_lock, flags);
-       clk_disable(nmk_chip->clk);
-
-       return 0;
-}
-
-static void nmk_gpio_irq_mask(struct irq_data *d)
-{
-       nmk_gpio_irq_maskunmask(d, false);
-}
-
-static void nmk_gpio_irq_unmask(struct irq_data *d)
-{
-       nmk_gpio_irq_maskunmask(d, true);
-}
-
-static int nmk_gpio_irq_set_wake(struct irq_data *d, unsigned int on)
-{
-       struct nmk_gpio_chip *nmk_chip;
-       unsigned long flags;
-       u32 bitmask;
-
-       nmk_chip = irq_data_get_irq_chip_data(d);
-       if (!nmk_chip)
-               return -EINVAL;
-       bitmask = nmk_gpio_get_bitmask(d->hwirq);
-
-       clk_enable(nmk_chip->clk);
-       spin_lock_irqsave(&nmk_gpio_slpm_lock, flags);
-       spin_lock(&nmk_chip->lock);
-
-       if (irqd_irq_disabled(d))
-               __nmk_gpio_set_wake(nmk_chip, d->hwirq, on);
-
-       if (on)
-               nmk_chip->real_wake |= bitmask;
-       else
-               nmk_chip->real_wake &= ~bitmask;
-
-       spin_unlock(&nmk_chip->lock);
-       spin_unlock_irqrestore(&nmk_gpio_slpm_lock, flags);
-       clk_disable(nmk_chip->clk);
-
-       return 0;
-}
-
-static int nmk_gpio_irq_set_type(struct irq_data *d, unsigned int type)
-{
-       bool enabled = !irqd_irq_disabled(d);
-       bool wake = irqd_is_wakeup_set(d);
-       struct nmk_gpio_chip *nmk_chip;
-       unsigned long flags;
-       u32 bitmask;
-
-       nmk_chip = irq_data_get_irq_chip_data(d);
-       bitmask = nmk_gpio_get_bitmask(d->hwirq);
-       if (!nmk_chip)
-               return -EINVAL;
-       if (type & IRQ_TYPE_LEVEL_HIGH)
-               return -EINVAL;
-       if (type & IRQ_TYPE_LEVEL_LOW)
-               return -EINVAL;
-
-       clk_enable(nmk_chip->clk);
-       spin_lock_irqsave(&nmk_chip->lock, flags);
-
-       if (enabled)
-               __nmk_gpio_irq_modify(nmk_chip, d->hwirq, NORMAL, false);
-
-       if (enabled || wake)
-               __nmk_gpio_irq_modify(nmk_chip, d->hwirq, WAKE, false);
-
-       nmk_chip->edge_rising &= ~bitmask;
-       if (type & IRQ_TYPE_EDGE_RISING)
-               nmk_chip->edge_rising |= bitmask;
-
-       nmk_chip->edge_falling &= ~bitmask;
-       if (type & IRQ_TYPE_EDGE_FALLING)
-               nmk_chip->edge_falling |= bitmask;
-
-       if (enabled)
-               __nmk_gpio_irq_modify(nmk_chip, d->hwirq, NORMAL, true);
-
-       if (enabled || wake)
-               __nmk_gpio_irq_modify(nmk_chip, d->hwirq, WAKE, true);
-
-       spin_unlock_irqrestore(&nmk_chip->lock, flags);
-       clk_disable(nmk_chip->clk);
-
-       return 0;
-}
-
-static unsigned int nmk_gpio_irq_startup(struct irq_data *d)
-{
-       struct nmk_gpio_chip *nmk_chip = irq_data_get_irq_chip_data(d);
-
-       clk_enable(nmk_chip->clk);
-       nmk_gpio_irq_unmask(d);
-       return 0;
-}
-
-static void nmk_gpio_irq_shutdown(struct irq_data *d)
-{
-       struct nmk_gpio_chip *nmk_chip = irq_data_get_irq_chip_data(d);
-
-       nmk_gpio_irq_mask(d);
-       clk_disable(nmk_chip->clk);
-}
-
-static struct irq_chip nmk_gpio_irq_chip = {
-       .name           = "Nomadik-GPIO",
-       .irq_ack        = nmk_gpio_irq_ack,
-       .irq_mask       = nmk_gpio_irq_mask,
-       .irq_unmask     = nmk_gpio_irq_unmask,
-       .irq_set_type   = nmk_gpio_irq_set_type,
-       .irq_set_wake   = nmk_gpio_irq_set_wake,
-       .irq_startup    = nmk_gpio_irq_startup,
-       .irq_shutdown   = nmk_gpio_irq_shutdown,
-       .flags          = IRQCHIP_MASK_ON_SUSPEND,
-};
-
-static void __nmk_gpio_irq_handler(unsigned int irq, struct irq_desc *desc,
-                                  u32 status)
-{
-       struct irq_chip *host_chip = irq_get_chip(irq);
-       struct gpio_chip *chip = irq_desc_get_handler_data(desc);
-
-       chained_irq_enter(host_chip, desc);
-
-       while (status) {
-               int bit = __ffs(status);
-
-               generic_handle_irq(irq_find_mapping(chip->irqdomain, bit));
-               status &= ~BIT(bit);
-       }
-
-       chained_irq_exit(host_chip, desc);
-}
-
-static void nmk_gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
-{
-       struct gpio_chip *chip = irq_desc_get_handler_data(desc);
-       struct nmk_gpio_chip *nmk_chip = container_of(chip, struct nmk_gpio_chip, chip);
-       u32 status;
-
-       clk_enable(nmk_chip->clk);
-       status = readl(nmk_chip->addr + NMK_GPIO_IS);
-       clk_disable(nmk_chip->clk);
-
-       __nmk_gpio_irq_handler(irq, desc, status);
-}
-
-static void nmk_gpio_latent_irq_handler(unsigned int irq,
-                                          struct irq_desc *desc)
-{
-       struct gpio_chip *chip = irq_desc_get_handler_data(desc);
-       struct nmk_gpio_chip *nmk_chip = container_of(chip, struct nmk_gpio_chip, chip);
-       u32 status = nmk_chip->get_latent_status(nmk_chip->bank);
-
-       __nmk_gpio_irq_handler(irq, desc, status);
-}
-
-/* I/O Functions */
-
-static int nmk_gpio_request(struct gpio_chip *chip, unsigned offset)
-{
-       /*
-        * Map back to global GPIO space and request muxing, the direction
-        * parameter does not matter for this controller.
-        */
-       int gpio = chip->base + offset;
-
-       return pinctrl_request_gpio(gpio);
-}
-
-static void nmk_gpio_free(struct gpio_chip *chip, unsigned offset)
-{
-       int gpio = chip->base + offset;
-
-       pinctrl_free_gpio(gpio);
-}
-
-static int nmk_gpio_make_input(struct gpio_chip *chip, unsigned offset)
-{
-       struct nmk_gpio_chip *nmk_chip =
-               container_of(chip, struct nmk_gpio_chip, chip);
-
-       clk_enable(nmk_chip->clk);
-
-       writel(1 << offset, nmk_chip->addr + NMK_GPIO_DIRC);
-
-       clk_disable(nmk_chip->clk);
-
-       return 0;
-}
-
-static int nmk_gpio_get_input(struct gpio_chip *chip, unsigned offset)
-{
-       struct nmk_gpio_chip *nmk_chip =
-               container_of(chip, struct nmk_gpio_chip, chip);
-       u32 bit = 1 << offset;
-       int value;
-
-       clk_enable(nmk_chip->clk);
-
-       value = (readl(nmk_chip->addr + NMK_GPIO_DAT) & bit) != 0;
-
-       clk_disable(nmk_chip->clk);
-
-       return value;
-}
-
-static void nmk_gpio_set_output(struct gpio_chip *chip, unsigned offset,
-                               int val)
-{
-       struct nmk_gpio_chip *nmk_chip =
-               container_of(chip, struct nmk_gpio_chip, chip);
-
-       clk_enable(nmk_chip->clk);
-
-       __nmk_gpio_set_output(nmk_chip, offset, val);
-
-       clk_disable(nmk_chip->clk);
-}
-
-static int nmk_gpio_make_output(struct gpio_chip *chip, unsigned offset,
-                               int val)
-{
-       struct nmk_gpio_chip *nmk_chip =
-               container_of(chip, struct nmk_gpio_chip, chip);
-
-       clk_enable(nmk_chip->clk);
-
-       __nmk_gpio_make_output(nmk_chip, offset, val);
-
-       clk_disable(nmk_chip->clk);
-
-       return 0;
-}
-
-#ifdef CONFIG_DEBUG_FS
-
-#include <linux/seq_file.h>
-
-static void nmk_gpio_dbg_show_one(struct seq_file *s,
-       struct pinctrl_dev *pctldev, struct gpio_chip *chip,
-       unsigned offset, unsigned gpio)
-{
-       const char *label = gpiochip_is_requested(chip, offset);
-       struct nmk_gpio_chip *nmk_chip =
-               container_of(chip, struct nmk_gpio_chip, chip);
-       int mode;
-       bool is_out;
-       bool pull;
-       u32 bit = 1 << offset;
-       const char *modes[] = {
-               [NMK_GPIO_ALT_GPIO]     = "gpio",
-               [NMK_GPIO_ALT_A]        = "altA",
-               [NMK_GPIO_ALT_B]        = "altB",
-               [NMK_GPIO_ALT_C]        = "altC",
-               [NMK_GPIO_ALT_C+1]      = "altC1",
-               [NMK_GPIO_ALT_C+2]      = "altC2",
-               [NMK_GPIO_ALT_C+3]      = "altC3",
-               [NMK_GPIO_ALT_C+4]      = "altC4",
-       };
-
-       clk_enable(nmk_chip->clk);
-       is_out = !!(readl(nmk_chip->addr + NMK_GPIO_DIR) & bit);
-       pull = !(readl(nmk_chip->addr + NMK_GPIO_PDIS) & bit);
-       mode = nmk_gpio_get_mode(gpio);
-       if ((mode == NMK_GPIO_ALT_C) && pctldev)
-               mode = nmk_prcm_gpiocr_get_mode(pctldev, gpio);
-
-       seq_printf(s, " gpio-%-3d (%-20.20s) %s %s %s %s",
-                  gpio, label ?: "(none)",
-                  is_out ? "out" : "in ",
-                  chip->get
-                  ? (chip->get(chip, offset) ? "hi" : "lo")
-                  : "?  ",
-                  (mode < 0) ? "unknown" : modes[mode],
-                  pull ? "pull" : "none");
-
-       if (!is_out) {
-               int irq = gpio_to_irq(gpio);
-               struct irq_desc *desc = irq_to_desc(irq);
-
-               /* This races with request_irq(), set_irq_type(),
-                * and set_irq_wake() ... but those are "rare".
-                */
-               if (irq > 0 && desc && desc->action) {
-                       char *trigger;
-                       u32 bitmask = nmk_gpio_get_bitmask(gpio);
-
-                       if (nmk_chip->edge_rising & bitmask)
-                               trigger = "edge-rising";
-                       else if (nmk_chip->edge_falling & bitmask)
-                               trigger = "edge-falling";
-                       else
-                               trigger = "edge-undefined";
-
-                       seq_printf(s, " irq-%d %s%s",
-                                  irq, trigger,
-                                  irqd_is_wakeup_set(&desc->irq_data)
-                                  ? " wakeup" : "");
-               }
-       }
-       clk_disable(nmk_chip->clk);
-}
-
-static void nmk_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
-{
-       unsigned                i;
-       unsigned                gpio = chip->base;
-
-       for (i = 0; i < chip->ngpio; i++, gpio++) {
-               nmk_gpio_dbg_show_one(s, NULL, chip, i, gpio);
-               seq_printf(s, "\n");
-       }
-}
-
-#else
-static inline void nmk_gpio_dbg_show_one(struct seq_file *s,
-                                        struct pinctrl_dev *pctldev,
-                                        struct gpio_chip *chip,
-                                        unsigned offset, unsigned gpio)
-{
-}
-#define nmk_gpio_dbg_show      NULL
-#endif
-
-/* This structure is replicated for each GPIO block allocated at probe time */
-static struct gpio_chip nmk_gpio_template = {
-       .request                = nmk_gpio_request,
-       .free                   = nmk_gpio_free,
-       .direction_input        = nmk_gpio_make_input,
-       .get                    = nmk_gpio_get_input,
-       .direction_output       = nmk_gpio_make_output,
-       .set                    = nmk_gpio_set_output,
-       .dbg_show               = nmk_gpio_dbg_show,
-       .can_sleep              = false,
-};
-
-void nmk_gpio_clocks_enable(void)
-{
-       int i;
-
-       for (i = 0; i < NUM_BANKS; i++) {
-               struct nmk_gpio_chip *chip = nmk_gpio_chips[i];
-
-               if (!chip)
-                       continue;
-
-               clk_enable(chip->clk);
-       }
-}
-
-void nmk_gpio_clocks_disable(void)
-{
-       int i;
-
-       for (i = 0; i < NUM_BANKS; i++) {
-               struct nmk_gpio_chip *chip = nmk_gpio_chips[i];
-
-               if (!chip)
-                       continue;
-
-               clk_disable(chip->clk);
-       }
-}
-
-/*
- * Called from the suspend/resume path to only keep the real wakeup interrupts
- * (those that have had set_irq_wake() called on them) as wakeup interrupts,
- * and not the rest of the interrupts which we needed to have as wakeups for
- * cpuidle.
- *
- * PM ops are not used since this needs to be done at the end, after all the
- * other drivers are done with their suspend callbacks.
- */
-void nmk_gpio_wakeups_suspend(void)
-{
-       int i;
-
-       for (i = 0; i < NUM_BANKS; i++) {
-               struct nmk_gpio_chip *chip = nmk_gpio_chips[i];
-
-               if (!chip)
-                       break;
-
-               clk_enable(chip->clk);
-
-               writel(chip->rwimsc & chip->real_wake,
-                      chip->addr + NMK_GPIO_RWIMSC);
-               writel(chip->fwimsc & chip->real_wake,
-                      chip->addr + NMK_GPIO_FWIMSC);
-
-               clk_disable(chip->clk);
-       }
-}
-
-void nmk_gpio_wakeups_resume(void)
-{
-       int i;
-
-       for (i = 0; i < NUM_BANKS; i++) {
-               struct nmk_gpio_chip *chip = nmk_gpio_chips[i];
-
-               if (!chip)
-                       break;
-
-               clk_enable(chip->clk);
-
-               writel(chip->rwimsc, chip->addr + NMK_GPIO_RWIMSC);
-               writel(chip->fwimsc, chip->addr + NMK_GPIO_FWIMSC);
-
-               clk_disable(chip->clk);
-       }
-}
-
-/*
- * Read the pull up/pull down status.
- * A bit set in 'pull_up' means that pull up
- * is selected if pull is enabled in PDIS register.
- * Note: only pull up/down set via this driver can
- * be detected due to HW limitations.
- */
-void nmk_gpio_read_pull(int gpio_bank, u32 *pull_up)
-{
-       if (gpio_bank < NUM_BANKS) {
-               struct nmk_gpio_chip *chip = nmk_gpio_chips[gpio_bank];
-
-               if (!chip)
-                       return;
-
-               *pull_up = chip->pull_up;
-       }
-}
-
-static int nmk_gpio_probe(struct platform_device *dev)
-{
-       struct device_node *np = dev->dev.of_node;
-       struct nmk_gpio_chip *nmk_chip;
-       struct gpio_chip *chip;
-       struct resource *res;
-       struct clk *clk;
-       int latent_irq;
-       bool supports_sleepmode;
-       void __iomem *base;
-       int irq;
-       int ret;
-
-       if (of_get_property(np, "st,supports-sleepmode", NULL))
-               supports_sleepmode = true;
-       else
-               supports_sleepmode = false;
-
-       if (of_property_read_u32(np, "gpio-bank", &dev->id)) {
-               dev_err(&dev->dev, "gpio-bank property not found\n");
-               return -EINVAL;
-       }
-
-       irq = platform_get_irq(dev, 0);
-       if (irq < 0)
-               return irq;
-
-       /* It's OK for this IRQ not to be present */
-       latent_irq = platform_get_irq(dev, 1);
-
-       res = platform_get_resource(dev, IORESOURCE_MEM, 0);
-       base = devm_ioremap_resource(&dev->dev, res);
-       if (IS_ERR(base))
-               return PTR_ERR(base);
-
-       clk = devm_clk_get(&dev->dev, NULL);
-       if (IS_ERR(clk))
-               return PTR_ERR(clk);
-       clk_prepare(clk);
-
-       nmk_chip = devm_kzalloc(&dev->dev, sizeof(*nmk_chip), GFP_KERNEL);
-       if (!nmk_chip)
-               return -ENOMEM;
-
-       /*
-        * The virt address in nmk_chip->addr is in the nomadik register space,
-        * so we can simply convert the resource address, without remapping
-        */
-       nmk_chip->bank = dev->id;
-       nmk_chip->clk = clk;
-       nmk_chip->addr = base;
-       nmk_chip->chip = nmk_gpio_template;
-       nmk_chip->parent_irq = irq;
-       nmk_chip->latent_parent_irq = latent_irq;
-       nmk_chip->sleepmode = supports_sleepmode;
-       spin_lock_init(&nmk_chip->lock);
-
-       chip = &nmk_chip->chip;
-       chip->base = dev->id * NMK_GPIO_PER_CHIP;
-       chip->ngpio = NMK_GPIO_PER_CHIP;
-       chip->label = dev_name(&dev->dev);
-       chip->dev = &dev->dev;
-       chip->owner = THIS_MODULE;
-
-       clk_enable(nmk_chip->clk);
-       nmk_chip->lowemi = readl_relaxed(nmk_chip->addr + NMK_GPIO_LOWEMI);
-       clk_disable(nmk_chip->clk);
-       chip->of_node = np;
-
-       ret = gpiochip_add(&nmk_chip->chip);
-       if (ret)
-               return ret;
-
-       BUG_ON(nmk_chip->bank >= ARRAY_SIZE(nmk_gpio_chips));
-
-       nmk_gpio_chips[nmk_chip->bank] = nmk_chip;
-
-       platform_set_drvdata(dev, nmk_chip);
-
-       /*
-        * Let the generic code handle this edge IRQ, the the chained
-        * handler will perform the actual work of handling the parent
-        * interrupt.
-        */
-       ret = gpiochip_irqchip_add(&nmk_chip->chip,
-                                  &nmk_gpio_irq_chip,
-                                  0,
-                                  handle_edge_irq,
-                                  IRQ_TYPE_EDGE_FALLING);
-       if (ret) {
-               dev_err(&dev->dev, "could not add irqchip\n");
-               ret = gpiochip_remove(&nmk_chip->chip);
-               return -ENODEV;
-       }
-       /* Then register the chain on the parent IRQ */
-       gpiochip_set_chained_irqchip(&nmk_chip->chip,
-                                    &nmk_gpio_irq_chip,
-                                    nmk_chip->parent_irq,
-                                    nmk_gpio_irq_handler);
-       if (nmk_chip->latent_parent_irq > 0)
-               gpiochip_set_chained_irqchip(&nmk_chip->chip,
-                                            &nmk_gpio_irq_chip,
-                                            nmk_chip->latent_parent_irq,
-                                            nmk_gpio_latent_irq_handler);
-
-       dev_info(&dev->dev, "at address %p\n", nmk_chip->addr);
-
-       return 0;
-}
-
-static int nmk_get_groups_cnt(struct pinctrl_dev *pctldev)
-{
-       struct nmk_pinctrl *npct = pinctrl_dev_get_drvdata(pctldev);
-
-       return npct->soc->ngroups;
-}
-
-static const char *nmk_get_group_name(struct pinctrl_dev *pctldev,
-                                      unsigned selector)
-{
-       struct nmk_pinctrl *npct = pinctrl_dev_get_drvdata(pctldev);
-
-       return npct->soc->groups[selector].name;
-}
-
-static int nmk_get_group_pins(struct pinctrl_dev *pctldev, unsigned selector,
-                             const unsigned **pins,
-                             unsigned *num_pins)
-{
-       struct nmk_pinctrl *npct = pinctrl_dev_get_drvdata(pctldev);
-
-       *pins = npct->soc->groups[selector].pins;
-       *num_pins = npct->soc->groups[selector].npins;
-       return 0;
-}
-
-static struct pinctrl_gpio_range *
-nmk_match_gpio_range(struct pinctrl_dev *pctldev, unsigned offset)
-{
-       struct nmk_pinctrl *npct = pinctrl_dev_get_drvdata(pctldev);
-       int i;
-
-       for (i = 0; i < npct->soc->gpio_num_ranges; i++) {
-               struct pinctrl_gpio_range *range;
-
-               range = &npct->soc->gpio_ranges[i];
-               if (offset >= range->pin_base &&
-                   offset <= (range->pin_base + range->npins - 1))
-                       return range;
-       }
-       return NULL;
-}
-
-static void nmk_pin_dbg_show(struct pinctrl_dev *pctldev, struct seq_file *s,
-                  unsigned offset)
-{
-       struct pinctrl_gpio_range *range;
-       struct gpio_chip *chip;
-
-       range = nmk_match_gpio_range(pctldev, offset);
-       if (!range || !range->gc) {
-               seq_printf(s, "invalid pin offset");
-               return;
-       }
-       chip = range->gc;
-       nmk_gpio_dbg_show_one(s, pctldev, chip, offset - chip->base, offset);
-}
-
-static void nmk_pinctrl_dt_free_map(struct pinctrl_dev *pctldev,
-               struct pinctrl_map *map, unsigned num_maps)
-{
-       int i;
-
-       for (i = 0; i < num_maps; i++)
-               if (map[i].type == PIN_MAP_TYPE_CONFIGS_PIN)
-                       kfree(map[i].data.configs.configs);
-       kfree(map);
-}
-
-static int nmk_dt_reserve_map(struct pinctrl_map **map, unsigned *reserved_maps,
-               unsigned *num_maps, unsigned reserve)
-{
-       unsigned old_num = *reserved_maps;
-       unsigned new_num = *num_maps + reserve;
-       struct pinctrl_map *new_map;
-
-       if (old_num >= new_num)
-               return 0;
-
-       new_map = krealloc(*map, sizeof(*new_map) * new_num, GFP_KERNEL);
-       if (!new_map)
-               return -ENOMEM;
-
-       memset(new_map + old_num, 0, (new_num - old_num) * sizeof(*new_map));
-
-       *map = new_map;
-       *reserved_maps = new_num;
-
-       return 0;
-}
-
-static int nmk_dt_add_map_mux(struct pinctrl_map **map, unsigned *reserved_maps,
-               unsigned *num_maps, const char *group,
-               const char *function)
-{
-       if (*num_maps == *reserved_maps)
-               return -ENOSPC;
-
-       (*map)[*num_maps].type = PIN_MAP_TYPE_MUX_GROUP;
-       (*map)[*num_maps].data.mux.group = group;
-       (*map)[*num_maps].data.mux.function = function;
-       (*num_maps)++;
-
-       return 0;
-}
-
-static int nmk_dt_add_map_configs(struct pinctrl_map **map,
-               unsigned *reserved_maps,
-               unsigned *num_maps, const char *group,
-               unsigned long *configs, unsigned num_configs)
-{
-       unsigned long *dup_configs;
-
-       if (*num_maps == *reserved_maps)
-               return -ENOSPC;
-
-       dup_configs = kmemdup(configs, num_configs * sizeof(*dup_configs),
-                             GFP_KERNEL);
-       if (!dup_configs)
-               return -ENOMEM;
-
-       (*map)[*num_maps].type = PIN_MAP_TYPE_CONFIGS_PIN;
-
-       (*map)[*num_maps].data.configs.group_or_pin = group;
-       (*map)[*num_maps].data.configs.configs = dup_configs;
-       (*map)[*num_maps].data.configs.num_configs = num_configs;
-       (*num_maps)++;
-
-       return 0;
-}
-
-#define NMK_CONFIG_PIN(x, y) { .property = x, .config = y, }
-#define NMK_CONFIG_PIN_ARRAY(x, y) { .property = x, .choice = y, \
-       .size = ARRAY_SIZE(y), }
-
-static const unsigned long nmk_pin_input_modes[] = {
-       PIN_INPUT_NOPULL,
-       PIN_INPUT_PULLUP,
-       PIN_INPUT_PULLDOWN,
-};
-
-static const unsigned long nmk_pin_output_modes[] = {
-       PIN_OUTPUT_LOW,
-       PIN_OUTPUT_HIGH,
-       PIN_DIR_OUTPUT,
-};
-
-static const unsigned long nmk_pin_sleep_modes[] = {
-       PIN_SLEEPMODE_DISABLED,
-       PIN_SLEEPMODE_ENABLED,
-};
-
-static const unsigned long nmk_pin_sleep_input_modes[] = {
-       PIN_SLPM_INPUT_NOPULL,
-       PIN_SLPM_INPUT_PULLUP,
-       PIN_SLPM_INPUT_PULLDOWN,
-       PIN_SLPM_DIR_INPUT,
-};
-
-static const unsigned long nmk_pin_sleep_output_modes[] = {
-       PIN_SLPM_OUTPUT_LOW,
-       PIN_SLPM_OUTPUT_HIGH,
-       PIN_SLPM_DIR_OUTPUT,
-};
-
-static const unsigned long nmk_pin_sleep_wakeup_modes[] = {
-       PIN_SLPM_WAKEUP_DISABLE,
-       PIN_SLPM_WAKEUP_ENABLE,
-};
-
-static const unsigned long nmk_pin_gpio_modes[] = {
-       PIN_GPIOMODE_DISABLED,
-       PIN_GPIOMODE_ENABLED,
-};
-
-static const unsigned long nmk_pin_sleep_pdis_modes[] = {
-       PIN_SLPM_PDIS_DISABLED,
-       PIN_SLPM_PDIS_ENABLED,
-};
-
-struct nmk_cfg_param {
-       const char *property;
-       unsigned long config;
-       const unsigned long *choice;
-       int size;
-};
-
-static const struct nmk_cfg_param nmk_cfg_params[] = {
-       NMK_CONFIG_PIN_ARRAY("ste,input",               nmk_pin_input_modes),
-       NMK_CONFIG_PIN_ARRAY("ste,output",              nmk_pin_output_modes),
-       NMK_CONFIG_PIN_ARRAY("ste,sleep",               nmk_pin_sleep_modes),
-       NMK_CONFIG_PIN_ARRAY("ste,sleep-input",         nmk_pin_sleep_input_modes),
-       NMK_CONFIG_PIN_ARRAY("ste,sleep-output",        nmk_pin_sleep_output_modes),
-       NMK_CONFIG_PIN_ARRAY("ste,sleep-wakeup",        nmk_pin_sleep_wakeup_modes),
-       NMK_CONFIG_PIN_ARRAY("ste,gpio",                nmk_pin_gpio_modes),
-       NMK_CONFIG_PIN_ARRAY("ste,sleep-pull-disable",  nmk_pin_sleep_pdis_modes),
-};
-
-static int nmk_dt_pin_config(int index, int val, unsigned long *config)
-{
-       int ret = 0;
-
-       if (nmk_cfg_params[index].choice == NULL)
-               *config = nmk_cfg_params[index].config;
-       else {
-               /* test if out of range */
-               if  (val < nmk_cfg_params[index].size) {
-                       *config = nmk_cfg_params[index].config |
-                               nmk_cfg_params[index].choice[val];
-               }
-       }
-       return ret;
-}
-
-static const char *nmk_find_pin_name(struct pinctrl_dev *pctldev, const char *pin_name)
-{
-       int i, pin_number;
-       struct nmk_pinctrl *npct = pinctrl_dev_get_drvdata(pctldev);
-
-       if (sscanf((char *)pin_name, "GPIO%d", &pin_number) == 1)
-               for (i = 0; i < npct->soc->npins; i++)
-                       if (npct->soc->pins[i].number == pin_number)
-                               return npct->soc->pins[i].name;
-       return NULL;
-}
-
-static bool nmk_pinctrl_dt_get_config(struct device_node *np,
-               unsigned long *configs)
-{
-       bool has_config = 0;
-       unsigned long cfg = 0;
-       int i, val, ret;
-
-       for (i = 0; i < ARRAY_SIZE(nmk_cfg_params); i++) {
-               ret = of_property_read_u32(np,
-                               nmk_cfg_params[i].property, &val);
-               if (ret != -EINVAL) {
-                       if (nmk_dt_pin_config(i, val, &cfg) == 0) {
-                               *configs |= cfg;
-                               has_config = 1;
-                       }
-               }
-       }
-
-       return has_config;
-}
-
-static int nmk_pinctrl_dt_subnode_to_map(struct pinctrl_dev *pctldev,
-               struct device_node *np,
-               struct pinctrl_map **map,
-               unsigned *reserved_maps,
-               unsigned *num_maps)
-{
-       int ret;
-       const char *function = NULL;
-       unsigned long configs = 0;
-       bool has_config = 0;
-       unsigned reserve = 0;
-       struct property *prop;
-       const char *group, *gpio_name;
-       struct device_node *np_config;
-
-       ret = of_property_read_string(np, "ste,function", &function);
-       if (ret >= 0)
-               reserve = 1;
-
-       has_config = nmk_pinctrl_dt_get_config(np, &configs);
-
-       np_config = of_parse_phandle(np, "ste,config", 0);
-       if (np_config)
-               has_config |= nmk_pinctrl_dt_get_config(np_config, &configs);
-
-       ret = of_property_count_strings(np, "ste,pins");
-       if (ret < 0)
-               goto exit;
-
-       if (has_config)
-               reserve++;
-
-       reserve *= ret;
-
-       ret = nmk_dt_reserve_map(map, reserved_maps, num_maps, reserve);
-       if (ret < 0)
-               goto exit;
-
-       of_property_for_each_string(np, "ste,pins", prop, group) {
-               if (function) {
-                       ret = nmk_dt_add_map_mux(map, reserved_maps, num_maps,
-                                         group, function);
-                       if (ret < 0)
-                               goto exit;
-               }
-               if (has_config) {
-                       gpio_name = nmk_find_pin_name(pctldev, group);
-
-                       ret = nmk_dt_add_map_configs(map, reserved_maps, num_maps,
-                                             gpio_name, &configs, 1);
-                       if (ret < 0)
-                               goto exit;
-               }
-
-       }
-exit:
-       return ret;
-}
-
-static int nmk_pinctrl_dt_node_to_map(struct pinctrl_dev *pctldev,
-                                struct device_node *np_config,
-                                struct pinctrl_map **map, unsigned *num_maps)
-{
-       unsigned reserved_maps;
-       struct device_node *np;
-       int ret;
-
-       reserved_maps = 0;
-       *map = NULL;
-       *num_maps = 0;
-
-       for_each_child_of_node(np_config, np) {
-               ret = nmk_pinctrl_dt_subnode_to_map(pctldev, np, map,
-                               &reserved_maps, num_maps);
-               if (ret < 0) {
-                       nmk_pinctrl_dt_free_map(pctldev, *map, *num_maps);
-                       return ret;
-               }
-       }
-
-       return 0;
-}
-
-static const struct pinctrl_ops nmk_pinctrl_ops = {
-       .get_groups_count = nmk_get_groups_cnt,
-       .get_group_name = nmk_get_group_name,
-       .get_group_pins = nmk_get_group_pins,
-       .pin_dbg_show = nmk_pin_dbg_show,
-       .dt_node_to_map = nmk_pinctrl_dt_node_to_map,
-       .dt_free_map = nmk_pinctrl_dt_free_map,
-};
-
-static int nmk_pmx_get_funcs_cnt(struct pinctrl_dev *pctldev)
-{
-       struct nmk_pinctrl *npct = pinctrl_dev_get_drvdata(pctldev);
-
-       return npct->soc->nfunctions;
-}
-
-static const char *nmk_pmx_get_func_name(struct pinctrl_dev *pctldev,
-                                        unsigned function)
-{
-       struct nmk_pinctrl *npct = pinctrl_dev_get_drvdata(pctldev);
-
-       return npct->soc->functions[function].name;
-}
-
-static int nmk_pmx_get_func_groups(struct pinctrl_dev *pctldev,
-                                  unsigned function,
-                                  const char * const **groups,
-                                  unsigned * const num_groups)
-{
-       struct nmk_pinctrl *npct = pinctrl_dev_get_drvdata(pctldev);
-
-       *groups = npct->soc->functions[function].groups;
-       *num_groups = npct->soc->functions[function].ngroups;
-
-       return 0;
-}
-
-static int nmk_pmx_enable(struct pinctrl_dev *pctldev, unsigned function,
-                         unsigned group)
-{
-       struct nmk_pinctrl *npct = pinctrl_dev_get_drvdata(pctldev);
-       const struct nmk_pingroup *g;
-       static unsigned int slpm[NUM_BANKS];
-       unsigned long flags = 0;
-       bool glitch;
-       int ret = -EINVAL;
-       int i;
-
-       g = &npct->soc->groups[group];
-
-       if (g->altsetting < 0)
-               return -EINVAL;
-
-       dev_dbg(npct->dev, "enable group %s, %u pins\n", g->name, g->npins);
-
-       /*
-        * If we're setting altfunc C by setting both AFSLA and AFSLB to 1,
-        * we may pass through an undesired state. In this case we take
-        * some extra care.
-        *
-        * Safe sequence used to switch IOs between GPIO and Alternate-C mode:
-        *  - Save SLPM registers (since we have a shadow register in the
-        *    nmk_chip we're using that as backup)
-        *  - Set SLPM=0 for the IOs you want to switch and others to 1
-        *  - Configure the GPIO registers for the IOs that are being switched
-        *  - Set IOFORCE=1
-        *  - Modify the AFLSA/B registers for the IOs that are being switched
-        *  - Set IOFORCE=0
-        *  - Restore SLPM registers
-        *  - Any spurious wake up event during switch sequence to be ignored
-        *    and cleared
-        *
-        * We REALLY need to save ALL slpm registers, because the external
-        * IOFORCE will switch *all* ports to their sleepmode setting to as
-        * to avoid glitches. (Not just one port!)
-        */
-       glitch = ((g->altsetting & NMK_GPIO_ALT_C) == NMK_GPIO_ALT_C);
-
-       if (glitch) {
-               spin_lock_irqsave(&nmk_gpio_slpm_lock, flags);
-
-               /* Initially don't put any pins to sleep when switching */
-               memset(slpm, 0xff, sizeof(slpm));
-
-               /*
-                * Then mask the pins that need to be sleeping now when we're
-                * switching to the ALT C function.
-                */
-               for (i = 0; i < g->npins; i++)
-                       slpm[g->pins[i] / NMK_GPIO_PER_CHIP] &= ~BIT(g->pins[i]);
-               nmk_gpio_glitch_slpm_init(slpm);
-       }
-
-       for (i = 0; i < g->npins; i++) {
-               struct pinctrl_gpio_range *range;
-               struct nmk_gpio_chip *nmk_chip;
-               struct gpio_chip *chip;
-               unsigned bit;
-
-               range = nmk_match_gpio_range(pctldev, g->pins[i]);
-               if (!range) {
-                       dev_err(npct->dev,
-                               "invalid pin offset %d in group %s at index %d\n",
-                               g->pins[i], g->name, i);
-                       goto out_glitch;
-               }
-               if (!range->gc) {
-                       dev_err(npct->dev, "GPIO chip missing in range for pin offset %d in group %s at index %d\n",
-                               g->pins[i], g->name, i);
-                       goto out_glitch;
-               }
-               chip = range->gc;
-               nmk_chip = container_of(chip, struct nmk_gpio_chip, chip);
-               dev_dbg(npct->dev, "setting pin %d to altsetting %d\n", g->pins[i], g->altsetting);
-
-               clk_enable(nmk_chip->clk);
-               bit = g->pins[i] % NMK_GPIO_PER_CHIP;
-               /*
-                * If the pin is switching to altfunc, and there was an
-                * interrupt installed on it which has been lazy disabled,
-                * actually mask the interrupt to prevent spurious interrupts
-                * that would occur while the pin is under control of the
-                * peripheral. Only SKE does this.
-                */
-               nmk_gpio_disable_lazy_irq(nmk_chip, bit);
-
-               __nmk_gpio_set_mode_safe(nmk_chip, bit,
-                       (g->altsetting & NMK_GPIO_ALT_C), glitch);
-               clk_disable(nmk_chip->clk);
-
-               /*
-                * Call PRCM GPIOCR config function in case ALTC
-                * has been selected:
-                * - If selection is a ALTCx, some bits in PRCM GPIOCR registers
-                *   must be set.
-                * - If selection is pure ALTC and previous selection was ALTCx,
-                *   then some bits in PRCM GPIOCR registers must be cleared.
-                */
-               if ((g->altsetting & NMK_GPIO_ALT_C) == NMK_GPIO_ALT_C)
-                       nmk_prcm_altcx_set_mode(npct, g->pins[i],
-                               g->altsetting >> NMK_GPIO_ALT_CX_SHIFT);
-       }
-
-       /* When all pins are successfully reconfigured we get here */
-       ret = 0;
-
-out_glitch:
-       if (glitch) {
-               nmk_gpio_glitch_slpm_restore(slpm);
-               spin_unlock_irqrestore(&nmk_gpio_slpm_lock, flags);
-       }
-
-       return ret;
-}
-
-static void nmk_pmx_disable(struct pinctrl_dev *pctldev,
-                           unsigned function, unsigned group)
-{
-       struct nmk_pinctrl *npct = pinctrl_dev_get_drvdata(pctldev);
-       const struct nmk_pingroup *g;
-
-       g = &npct->soc->groups[group];
-
-       if (g->altsetting < 0)
-               return;
-
-       /* Poke out the mux, set the pin to some default state? */
-       dev_dbg(npct->dev, "disable group %s, %u pins\n", g->name, g->npins);
-}
-
-static int nmk_gpio_request_enable(struct pinctrl_dev *pctldev,
-                                  struct pinctrl_gpio_range *range,
-                                  unsigned offset)
-{
-       struct nmk_pinctrl *npct = pinctrl_dev_get_drvdata(pctldev);
-       struct nmk_gpio_chip *nmk_chip;
-       struct gpio_chip *chip;
-       unsigned bit;
-
-       if (!range) {
-               dev_err(npct->dev, "invalid range\n");
-               return -EINVAL;
-       }
-       if (!range->gc) {
-               dev_err(npct->dev, "missing GPIO chip in range\n");
-               return -EINVAL;
-       }
-       chip = range->gc;
-       nmk_chip = container_of(chip, struct nmk_gpio_chip, chip);
-
-       dev_dbg(npct->dev, "enable pin %u as GPIO\n", offset);
-
-       clk_enable(nmk_chip->clk);
-       bit = offset % NMK_GPIO_PER_CHIP;
-       /* There is no glitch when converting any pin to GPIO */
-       __nmk_gpio_set_mode(nmk_chip, bit, NMK_GPIO_ALT_GPIO);
-       clk_disable(nmk_chip->clk);
-
-       return 0;
-}
-
-static void nmk_gpio_disable_free(struct pinctrl_dev *pctldev,
-                                 struct pinctrl_gpio_range *range,
-                                 unsigned offset)
-{
-       struct nmk_pinctrl *npct = pinctrl_dev_get_drvdata(pctldev);
-
-       dev_dbg(npct->dev, "disable pin %u as GPIO\n", offset);
-       /* Set the pin to some default state, GPIO is usually default */
-}
-
-static const struct pinmux_ops nmk_pinmux_ops = {
-       .get_functions_count = nmk_pmx_get_funcs_cnt,
-       .get_function_name = nmk_pmx_get_func_name,
-       .get_function_groups = nmk_pmx_get_func_groups,
-       .enable = nmk_pmx_enable,
-       .disable = nmk_pmx_disable,
-       .gpio_request_enable = nmk_gpio_request_enable,
-       .gpio_disable_free = nmk_gpio_disable_free,
-};
-
-static int nmk_pin_config_get(struct pinctrl_dev *pctldev, unsigned pin,
-                             unsigned long *config)
-{
-       /* Not implemented */
-       return -EINVAL;
-}
-
-static int nmk_pin_config_set(struct pinctrl_dev *pctldev, unsigned pin,
-                             unsigned long *configs, unsigned num_configs)
-{
-       static const char *pullnames[] = {
-               [NMK_GPIO_PULL_NONE]    = "none",
-               [NMK_GPIO_PULL_UP]      = "up",
-               [NMK_GPIO_PULL_DOWN]    = "down",
-               [3] /* illegal */       = "??"
-       };
-       static const char *slpmnames[] = {
-               [NMK_GPIO_SLPM_INPUT]           = "input/wakeup",
-               [NMK_GPIO_SLPM_NOCHANGE]        = "no-change/no-wakeup",
-       };
-       struct nmk_pinctrl *npct = pinctrl_dev_get_drvdata(pctldev);
-       struct nmk_gpio_chip *nmk_chip;
-       struct pinctrl_gpio_range *range;
-       struct gpio_chip *chip;
-       unsigned bit;
-       pin_cfg_t cfg;
-       int pull, slpm, output, val, i;
-       bool lowemi, gpiomode, sleep;
-
-       range = nmk_match_gpio_range(pctldev, pin);
-       if (!range) {
-               dev_err(npct->dev, "invalid pin offset %d\n", pin);
-               return -EINVAL;
-       }
-       if (!range->gc) {
-               dev_err(npct->dev, "GPIO chip missing in range for pin %d\n",
-                       pin);
-               return -EINVAL;
-       }
-       chip = range->gc;
-       nmk_chip = container_of(chip, struct nmk_gpio_chip, chip);
-
-       for (i = 0; i < num_configs; i++) {
-               /*
-                * The pin config contains pin number and altfunction fields,
-                * here we just ignore that part. It's being handled by the
-                * framework and pinmux callback respectively.
-                */
-               cfg = (pin_cfg_t) configs[i];
-               pull = PIN_PULL(cfg);
-               slpm = PIN_SLPM(cfg);
-               output = PIN_DIR(cfg);
-               val = PIN_VAL(cfg);
-               lowemi = PIN_LOWEMI(cfg);
-               gpiomode = PIN_GPIOMODE(cfg);
-               sleep = PIN_SLEEPMODE(cfg);
-
-               if (sleep) {
-                       int slpm_pull = PIN_SLPM_PULL(cfg);
-                       int slpm_output = PIN_SLPM_DIR(cfg);
-                       int slpm_val = PIN_SLPM_VAL(cfg);
-
-                       /* All pins go into GPIO mode at sleep */
-                       gpiomode = true;
-
-                       /*
-                        * The SLPM_* values are normal values + 1 to allow zero
-                        * to mean "same as normal".
-                        */
-                       if (slpm_pull)
-                               pull = slpm_pull - 1;
-                       if (slpm_output)
-                               output = slpm_output - 1;
-                       if (slpm_val)
-                               val = slpm_val - 1;
-
-                       dev_dbg(nmk_chip->chip.dev,
-                               "pin %d: sleep pull %s, dir %s, val %s\n",
-                               pin,
-                               slpm_pull ? pullnames[pull] : "same",
-                               slpm_output ? (output ? "output" : "input")
-                               : "same",
-                               slpm_val ? (val ? "high" : "low") : "same");
-               }
-
-               dev_dbg(nmk_chip->chip.dev,
-                       "pin %d [%#lx]: pull %s, slpm %s (%s%s), lowemi %s\n",
-                       pin, cfg, pullnames[pull], slpmnames[slpm],
-                       output ? "output " : "input",
-                       output ? (val ? "high" : "low") : "",
-                       lowemi ? "on" : "off");
-
-               clk_enable(nmk_chip->clk);
-               bit = pin % NMK_GPIO_PER_CHIP;
-               if (gpiomode)
-                       /* No glitch when going to GPIO mode */
-                       __nmk_gpio_set_mode(nmk_chip, bit, NMK_GPIO_ALT_GPIO);
-               if (output)
-                       __nmk_gpio_make_output(nmk_chip, bit, val);
-               else {
-                       __nmk_gpio_make_input(nmk_chip, bit);
-                       __nmk_gpio_set_pull(nmk_chip, bit, pull);
-               }
-               /* TODO: isn't this only applicable on output pins? */
-               __nmk_gpio_set_lowemi(nmk_chip, bit, lowemi);
-
-               __nmk_gpio_set_slpm(nmk_chip, bit, slpm);
-               clk_disable(nmk_chip->clk);
-       } /* for each config */
-
-       return 0;
-}
-
-static const struct pinconf_ops nmk_pinconf_ops = {
-       .pin_config_get = nmk_pin_config_get,
-       .pin_config_set = nmk_pin_config_set,
-};
-
-static struct pinctrl_desc nmk_pinctrl_desc = {
-       .name = "pinctrl-nomadik",
-       .pctlops = &nmk_pinctrl_ops,
-       .pmxops = &nmk_pinmux_ops,
-       .confops = &nmk_pinconf_ops,
-       .owner = THIS_MODULE,
-};
-
-static const struct of_device_id nmk_pinctrl_match[] = {
-       {
-               .compatible = "stericsson,stn8815-pinctrl",
-               .data = (void *)PINCTRL_NMK_STN8815,
-       },
-       {
-               .compatible = "stericsson,db8500-pinctrl",
-               .data = (void *)PINCTRL_NMK_DB8500,
-       },
-       {
-               .compatible = "stericsson,db8540-pinctrl",
-               .data = (void *)PINCTRL_NMK_DB8540,
-       },
-       {},
-};
-
-#ifdef CONFIG_PM_SLEEP
-static int nmk_pinctrl_suspend(struct device *dev)
-{
-       struct nmk_pinctrl *npct;
-
-       npct = dev_get_drvdata(dev);
-       if (!npct)
-               return -EINVAL;
-
-       return pinctrl_force_sleep(npct->pctl);
-}
-
-static int nmk_pinctrl_resume(struct device *dev)
-{
-       struct nmk_pinctrl *npct;
-
-       npct = dev_get_drvdata(dev);
-       if (!npct)
-               return -EINVAL;
-
-       return pinctrl_force_default(npct->pctl);
-}
-#endif
-
-static int nmk_pinctrl_probe(struct platform_device *pdev)
-{
-       const struct of_device_id *match;
-       struct device_node *np = pdev->dev.of_node;
-       struct device_node *prcm_np;
-       struct nmk_pinctrl *npct;
-       unsigned int version = 0;
-       int i;
-
-       npct = devm_kzalloc(&pdev->dev, sizeof(*npct), GFP_KERNEL);
-       if (!npct)
-               return -ENOMEM;
-
-       match = of_match_device(nmk_pinctrl_match, &pdev->dev);
-       if (!match)
-               return -ENODEV;
-       version = (unsigned int) match->data;
-
-       /* Poke in other ASIC variants here */
-       if (version == PINCTRL_NMK_STN8815)
-               nmk_pinctrl_stn8815_init(&npct->soc);
-       if (version == PINCTRL_NMK_DB8500)
-               nmk_pinctrl_db8500_init(&npct->soc);
-       if (version == PINCTRL_NMK_DB8540)
-               nmk_pinctrl_db8540_init(&npct->soc);
-
-       prcm_np = of_parse_phandle(np, "prcm", 0);
-       if (prcm_np)
-               npct->prcm_base = of_iomap(prcm_np, 0);
-       if (!npct->prcm_base) {
-               if (version == PINCTRL_NMK_STN8815) {
-                       dev_info(&pdev->dev,
-                                "No PRCM base, "
-                                "assuming no ALT-Cx control is available\n");
-               } else {
-                       dev_err(&pdev->dev, "missing PRCM base address\n");
-                       return -EINVAL;
-               }
-       }
-
-       /*
-        * We need all the GPIO drivers to probe FIRST, or we will not be able
-        * to obtain references to the struct gpio_chip * for them, and we
-        * need this to proceed.
-        */
-       for (i = 0; i < npct->soc->gpio_num_ranges; i++) {
-               if (!nmk_gpio_chips[npct->soc->gpio_ranges[i].id]) {
-                       dev_warn(&pdev->dev, "GPIO chip %d not registered yet\n", i);
-                       return -EPROBE_DEFER;
-               }
-               npct->soc->gpio_ranges[i].gc = &nmk_gpio_chips[npct->soc->gpio_ranges[i].id]->chip;
-       }
-
-       nmk_pinctrl_desc.pins = npct->soc->pins;
-       nmk_pinctrl_desc.npins = npct->soc->npins;
-       npct->dev = &pdev->dev;
-
-       npct->pctl = pinctrl_register(&nmk_pinctrl_desc, &pdev->dev, npct);
-       if (!npct->pctl) {
-               dev_err(&pdev->dev, "could not register Nomadik pinctrl driver\n");
-               return -EINVAL;
-       }
-
-       /* We will handle a range of GPIO pins */
-       for (i = 0; i < npct->soc->gpio_num_ranges; i++)
-               pinctrl_add_gpio_range(npct->pctl, &npct->soc->gpio_ranges[i]);
-
-       platform_set_drvdata(pdev, npct);
-       dev_info(&pdev->dev, "initialized Nomadik pin control driver\n");
-
-       return 0;
-}
-
-static const struct of_device_id nmk_gpio_match[] = {
-       { .compatible = "st,nomadik-gpio", },
-       {}
-};
-
-static struct platform_driver nmk_gpio_driver = {
-       .driver = {
-               .owner = THIS_MODULE,
-               .name = "gpio",
-               .of_match_table = nmk_gpio_match,
-       },
-       .probe = nmk_gpio_probe,
-};
-
-static SIMPLE_DEV_PM_OPS(nmk_pinctrl_pm_ops,
-                       nmk_pinctrl_suspend,
-                       nmk_pinctrl_resume);
-
-static struct platform_driver nmk_pinctrl_driver = {
-       .driver = {
-               .owner = THIS_MODULE,
-               .name = "pinctrl-nomadik",
-               .of_match_table = nmk_pinctrl_match,
-               .pm = &nmk_pinctrl_pm_ops,
-       },
-       .probe = nmk_pinctrl_probe,
-};
-
-static int __init nmk_gpio_init(void)
-{
-       int ret;
-
-       ret = platform_driver_register(&nmk_gpio_driver);
-       if (ret)
-               return ret;
-       return platform_driver_register(&nmk_pinctrl_driver);
-}
-
-core_initcall(nmk_gpio_init);
-
-MODULE_AUTHOR("Prafulla WADASKAR and Alessandro Rubini");
-MODULE_DESCRIPTION("Nomadik GPIO Driver");
-MODULE_LICENSE("GPL");
diff --git a/drivers/pinctrl/pinctrl-nomadik.h b/drivers/pinctrl/pinctrl-nomadik.h
deleted file mode 100644 (file)
index d8215f1..0000000
+++ /dev/null
@@ -1,192 +0,0 @@
-#ifndef PINCTRL_PINCTRL_NOMADIK_H
-#define PINCTRL_PINCTRL_NOMADIK_H
-
-/* Package definitions */
-#define PINCTRL_NMK_STN8815    0
-#define PINCTRL_NMK_DB8500     1
-#define PINCTRL_NMK_DB8540     2
-
-/* Alternate functions: function C is set in hw by setting both A and B */
-#define NMK_GPIO_ALT_GPIO      0
-#define NMK_GPIO_ALT_A 1
-#define NMK_GPIO_ALT_B 2
-#define NMK_GPIO_ALT_C (NMK_GPIO_ALT_A | NMK_GPIO_ALT_B)
-
-#define NMK_GPIO_ALT_CX_SHIFT 2
-#define NMK_GPIO_ALT_C1        ((1<<NMK_GPIO_ALT_CX_SHIFT) | NMK_GPIO_ALT_C)
-#define NMK_GPIO_ALT_C2        ((2<<NMK_GPIO_ALT_CX_SHIFT) | NMK_GPIO_ALT_C)
-#define NMK_GPIO_ALT_C3        ((3<<NMK_GPIO_ALT_CX_SHIFT) | NMK_GPIO_ALT_C)
-#define NMK_GPIO_ALT_C4        ((4<<NMK_GPIO_ALT_CX_SHIFT) | NMK_GPIO_ALT_C)
-
-#define PRCM_GPIOCR_ALTCX(pin_num,\
-       altc1_used, altc1_ri, altc1_cb,\
-       altc2_used, altc2_ri, altc2_cb,\
-       altc3_used, altc3_ri, altc3_cb,\
-       altc4_used, altc4_ri, altc4_cb)\
-{\
-       .pin = pin_num,\
-       .altcx[PRCM_IDX_GPIOCR_ALTC1] = {\
-               .used = altc1_used,\
-               .reg_index = altc1_ri,\
-               .control_bit = altc1_cb\
-       },\
-       .altcx[PRCM_IDX_GPIOCR_ALTC2] = {\
-               .used = altc2_used,\
-               .reg_index = altc2_ri,\
-               .control_bit = altc2_cb\
-       },\
-       .altcx[PRCM_IDX_GPIOCR_ALTC3] = {\
-               .used = altc3_used,\
-               .reg_index = altc3_ri,\
-               .control_bit = altc3_cb\
-       },\
-       .altcx[PRCM_IDX_GPIOCR_ALTC4] = {\
-               .used = altc4_used,\
-               .reg_index = altc4_ri,\
-               .control_bit = altc4_cb\
-       },\
-}
-
-/**
- * enum prcm_gpiocr_reg_index
- * Used to reference an PRCM GPIOCR register address.
- */
-enum prcm_gpiocr_reg_index {
-       PRCM_IDX_GPIOCR1,
-       PRCM_IDX_GPIOCR2,
-       PRCM_IDX_GPIOCR3
-};
-/**
- * enum prcm_gpiocr_altcx_index
- * Used to reference an Other alternate-C function.
- */
-enum prcm_gpiocr_altcx_index {
-       PRCM_IDX_GPIOCR_ALTC1,
-       PRCM_IDX_GPIOCR_ALTC2,
-       PRCM_IDX_GPIOCR_ALTC3,
-       PRCM_IDX_GPIOCR_ALTC4,
-       PRCM_IDX_GPIOCR_ALTC_MAX,
-};
-
-/**
- * struct prcm_gpio_altcx - Other alternate-C function
- * @used: other alternate-C function availability
- * @reg_index: PRCM GPIOCR register index used to control the function
- * @control_bit: PRCM GPIOCR bit used to control the function
- */
-struct prcm_gpiocr_altcx {
-       bool used:1;
-       u8 reg_index:2;
-       u8 control_bit:5;
-} __packed;
-
-/**
- * struct prcm_gpio_altcx_pin_desc - Other alternate-C pin
- * @pin: The pin number
- * @altcx: array of other alternate-C[1-4] functions
- */
-struct prcm_gpiocr_altcx_pin_desc {
-       unsigned short pin;
-       struct prcm_gpiocr_altcx altcx[PRCM_IDX_GPIOCR_ALTC_MAX];
-};
-
-/**
- * struct nmk_function - Nomadik pinctrl mux function
- * @name: The name of the function, exported to pinctrl core.
- * @groups: An array of pin groups that may select this function.
- * @ngroups: The number of entries in @groups.
- */
-struct nmk_function {
-       const char *name;
-       const char * const *groups;
-       unsigned ngroups;
-};
-
-/**
- * struct nmk_pingroup - describes a Nomadik pin group
- * @name: the name of this specific pin group
- * @pins: an array of discrete physical pins used in this group, taken
- *     from the driver-local pin enumeration space
- * @num_pins: the number of pins in this group array, i.e. the number of
- *     elements in .pins so we can iterate over that array
- * @altsetting: the altsetting to apply to all pins in this group to
- *     configure them to be used by a function
- */
-struct nmk_pingroup {
-       const char *name;
-       const unsigned int *pins;
-       const unsigned npins;
-       int altsetting;
-};
-
-/**
- * struct nmk_pinctrl_soc_data - Nomadik pin controller per-SoC configuration
- * @gpio_ranges: An array of GPIO ranges for this SoC
- * @gpio_num_ranges: The number of GPIO ranges for this SoC
- * @pins:      An array describing all pins the pin controller affects.
- *             All pins which are also GPIOs must be listed first within the
- *             array, and be numbered identically to the GPIO controller's
- *             numbering.
- * @npins:     The number of entries in @pins.
- * @functions: The functions supported on this SoC.
- * @nfunction: The number of entries in @functions.
- * @groups:    An array describing all pin groups the pin SoC supports.
- * @ngroups:   The number of entries in @groups.
- * @altcx_pins:        The pins that support Other alternate-C function on this SoC
- * @npins_altcx: The number of Other alternate-C pins
- * @prcm_gpiocr_registers: The array of PRCM GPIOCR registers on this SoC
- */
-struct nmk_pinctrl_soc_data {
-       struct pinctrl_gpio_range *gpio_ranges;
-       unsigned gpio_num_ranges;
-       const struct pinctrl_pin_desc *pins;
-       unsigned npins;
-       const struct nmk_function *functions;
-       unsigned nfunctions;
-       const struct nmk_pingroup *groups;
-       unsigned ngroups;
-       const struct prcm_gpiocr_altcx_pin_desc *altcx_pins;
-       unsigned npins_altcx;
-       const u16 *prcm_gpiocr_registers;
-};
-
-#ifdef CONFIG_PINCTRL_STN8815
-
-void nmk_pinctrl_stn8815_init(const struct nmk_pinctrl_soc_data **soc);
-
-#else
-
-static inline void
-nmk_pinctrl_stn8815_init(const struct nmk_pinctrl_soc_data **soc)
-{
-}
-
-#endif
-
-#ifdef CONFIG_PINCTRL_DB8500
-
-void nmk_pinctrl_db8500_init(const struct nmk_pinctrl_soc_data **soc);
-
-#else
-
-static inline void
-nmk_pinctrl_db8500_init(const struct nmk_pinctrl_soc_data **soc)
-{
-}
-
-#endif
-
-#ifdef CONFIG_PINCTRL_DB8540
-
-void nmk_pinctrl_db8540_init(const struct nmk_pinctrl_soc_data **soc);
-
-#else
-
-static inline void
-nmk_pinctrl_db8540_init(const struct nmk_pinctrl_soc_data **soc)
-{
-}
-
-#endif
-
-#endif /* PINCTRL_PINCTRL_NOMADIK_H */
index bb805d5e9ff066a37275fb3e758d7dbae8ab87c9..5e8b2e04cd7a322e6aefa85adbd3996ad04cc19e 100644 (file)
@@ -62,11 +62,26 @@ enum rockchip_pinctrl_type {
        RK2928,
        RK3066B,
        RK3188,
+       RK3288,
 };
 
-enum rockchip_pin_bank_type {
-       COMMON_BANK,
-       RK3188_BANK0,
+/**
+ * Encode variants of iomux registers into a type variable
+ */
+#define IOMUX_GPIO_ONLY                BIT(0)
+#define IOMUX_WIDTH_4BIT       BIT(1)
+#define IOMUX_SOURCE_PMU       BIT(2)
+#define IOMUX_UNROUTED         BIT(3)
+
+/**
+ * @type: iomux variant using IOMUX_* constants
+ * @offset: if initialized to -1 it will be autocalculated, by specifying
+ *         an initial offset value the relevant source offset can be reset
+ *         to a new value for autocalculating the following iomux registers.
+ */
+struct rockchip_iomux {
+       int                             type;
+       int                             offset;
 };
 
 /**
@@ -78,6 +93,7 @@ enum rockchip_pin_bank_type {
  * @nr_pins: number of pins in this bank
  * @name: name of the bank
  * @bank_num: number of the bank, to account for holes
+ * @iomux: array describing the 4 iomux sources of the bank
  * @valid: are all necessary informations present
  * @of_node: dt node of this bank
  * @drvdata: common pinctrl basedata
@@ -95,7 +111,7 @@ struct rockchip_pin_bank {
        u8                              nr_pins;
        char                            *name;
        u8                              bank_num;
-       enum rockchip_pin_bank_type     bank_type;
+       struct rockchip_iomux           iomux[4];
        bool                            valid;
        struct device_node              *of_node;
        struct rockchip_pinctrl         *drvdata;
@@ -111,6 +127,25 @@ struct rockchip_pin_bank {
                .bank_num       = id,                   \
                .nr_pins        = pins,                 \
                .name           = label,                \
+               .iomux          = {                     \
+                       { .offset = -1 },               \
+                       { .offset = -1 },               \
+                       { .offset = -1 },               \
+                       { .offset = -1 },               \
+               },                                      \
+       }
+
+#define PIN_BANK_IOMUX_FLAGS(id, pins, label, iom0, iom1, iom2, iom3)  \
+       {                                                               \
+               .bank_num       = id,                                   \
+               .nr_pins        = pins,                                 \
+               .name           = label,                                \
+               .iomux          = {                                     \
+                       { .type = iom0, .offset = -1 },                 \
+                       { .type = iom1, .offset = -1 },                 \
+                       { .type = iom2, .offset = -1 },                 \
+                       { .type = iom3, .offset = -1 },                 \
+               },                                                      \
        }
 
 /**
@@ -121,7 +156,8 @@ struct rockchip_pin_ctrl {
        u32                             nr_pins;
        char                            *label;
        enum rockchip_pinctrl_type      type;
-       int                             mux_offset;
+       int                             grf_mux_offset;
+       int                             pmu_mux_offset;
        void    (*pull_calc_reg)(struct rockchip_pin_bank *bank,
                                    int pin_num, struct regmap **regmap,
                                    int *reg, u8 *bit);
@@ -343,24 +379,42 @@ static const struct pinctrl_ops rockchip_pctrl_ops = {
 static int rockchip_get_mux(struct rockchip_pin_bank *bank, int pin)
 {
        struct rockchip_pinctrl *info = bank->drvdata;
+       int iomux_num = (pin / 8);
+       struct regmap *regmap;
        unsigned int val;
-       int reg, ret;
+       int reg, ret, mask;
        u8 bit;
 
-       if (bank->bank_type == RK3188_BANK0 && pin < 16)
+       if (iomux_num > 3)
+               return -EINVAL;
+
+       if (bank->iomux[iomux_num].type & IOMUX_UNROUTED) {
+               dev_err(info->dev, "pin %d is unrouted\n", pin);
+               return -EINVAL;
+       }
+
+       if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY)
                return RK_FUNC_GPIO;
 
+       regmap = (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU)
+                               ? info->regmap_pmu : info->regmap_base;
+
        /* get basic quadrupel of mux registers and the correct reg inside */
-       reg = info->ctrl->mux_offset;
-       reg += bank->bank_num * 0x10;
-       reg += (pin / 8) * 4;
-       bit = (pin % 8) * 2;
+       mask = (bank->iomux[iomux_num].type & IOMUX_WIDTH_4BIT) ? 0xf : 0x3;
+       reg = bank->iomux[iomux_num].offset;
+       if (bank->iomux[iomux_num].type & IOMUX_WIDTH_4BIT) {
+               if ((pin % 8) >= 4)
+                       reg += 0x4;
+               bit = (pin % 4) * 4;
+       } else {
+               bit = (pin % 8) * 2;
+       }
 
-       ret = regmap_read(info->regmap_base, reg, &val);
+       ret = regmap_read(regmap, reg, &val);
        if (ret)
                return ret;
 
-       return ((val >> bit) & 3);
+       return ((val >> bit) & mask);
 }
 
 /*
@@ -379,16 +433,22 @@ static int rockchip_get_mux(struct rockchip_pin_bank *bank, int pin)
 static int rockchip_set_mux(struct rockchip_pin_bank *bank, int pin, int mux)
 {
        struct rockchip_pinctrl *info = bank->drvdata;
-       int reg, ret;
+       int iomux_num = (pin / 8);
+       struct regmap *regmap;
+       int reg, ret, mask;
        unsigned long flags;
        u8 bit;
        u32 data;
 
-       /*
-        * The first 16 pins of rk3188_bank0 are always gpios and do not have
-        * a mux register at all.
-        */
-       if (bank->bank_type == RK3188_BANK0 && pin < 16) {
+       if (iomux_num > 3)
+               return -EINVAL;
+
+       if (bank->iomux[iomux_num].type & IOMUX_UNROUTED) {
+               dev_err(info->dev, "pin %d is unrouted\n", pin);
+               return -EINVAL;
+       }
+
+       if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY) {
                if (mux != RK_FUNC_GPIO) {
                        dev_err(info->dev,
                                "pin %d only supports a gpio mux\n", pin);
@@ -401,17 +461,25 @@ static int rockchip_set_mux(struct rockchip_pin_bank *bank, int pin, int mux)
        dev_dbg(info->dev, "setting mux of GPIO%d-%d to %d\n",
                                                bank->bank_num, pin, mux);
 
+       regmap = (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU)
+                               ? info->regmap_pmu : info->regmap_base;
+
        /* get basic quadrupel of mux registers and the correct reg inside */
-       reg = info->ctrl->mux_offset;
-       reg += bank->bank_num * 0x10;
-       reg += (pin / 8) * 4;
-       bit = (pin % 8) * 2;
+       mask = (bank->iomux[iomux_num].type & IOMUX_WIDTH_4BIT) ? 0xf : 0x3;
+       reg = bank->iomux[iomux_num].offset;
+       if (bank->iomux[iomux_num].type & IOMUX_WIDTH_4BIT) {
+               if ((pin % 8) >= 4)
+                       reg += 0x4;
+               bit = (pin % 4) * 4;
+       } else {
+               bit = (pin % 8) * 2;
+       }
 
        spin_lock_irqsave(&bank->slock, flags);
 
-       data = (3 << (bit + 16));
-       data |= (mux & 3) << bit;
-       ret = regmap_write(info->regmap_base, reg, data);
+       data = (mask << (bit + 16));
+       data |= (mux & mask) << bit;
+       ret = regmap_write(regmap, reg, data);
 
        spin_unlock_irqrestore(&bank->slock, flags);
 
@@ -449,7 +517,7 @@ static void rk3188_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
        struct rockchip_pinctrl *info = bank->drvdata;
 
        /* The first 12 pins of the first bank are located elsewhere */
-       if (bank->bank_type == RK3188_BANK0 && pin_num < 12) {
+       if (bank->bank_num == 0 && pin_num < 12) {
                *regmap = info->regmap_pmu ? info->regmap_pmu
                                           : bank->regmap_pull;
                *reg = info->regmap_pmu ? RK3188_PULL_PMU_OFFSET : 0;
@@ -476,6 +544,127 @@ static void rk3188_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
        }
 }
 
+#define RK3288_PULL_OFFSET             0x140
+static void rk3288_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
+                                   int pin_num, struct regmap **regmap,
+                                   int *reg, u8 *bit)
+{
+       struct rockchip_pinctrl *info = bank->drvdata;
+
+       /* The first 24 pins of the first bank are located in PMU */
+       if (bank->bank_num == 0) {
+               *regmap = info->regmap_pmu;
+               *reg = RK3188_PULL_PMU_OFFSET;
+
+               *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
+               *bit = pin_num % RK3188_PULL_PINS_PER_REG;
+               *bit *= RK3188_PULL_BITS_PER_PIN;
+       } else {
+               *regmap = info->regmap_base;
+               *reg = RK3288_PULL_OFFSET;
+
+               /* correct the offset, as we're starting with the 2nd bank */
+               *reg -= 0x10;
+               *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
+               *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
+
+               *bit = (pin_num % RK3188_PULL_PINS_PER_REG);
+               *bit *= RK3188_PULL_BITS_PER_PIN;
+       }
+}
+
+#define RK3288_DRV_PMU_OFFSET          0x70
+#define RK3288_DRV_GRF_OFFSET          0x1c0
+#define RK3288_DRV_BITS_PER_PIN                2
+#define RK3288_DRV_PINS_PER_REG                8
+#define RK3288_DRV_BANK_STRIDE         16
+static int rk3288_drv_list[] = { 2, 4, 8, 12 };
+
+static void rk3288_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
+                                   int pin_num, struct regmap **regmap,
+                                   int *reg, u8 *bit)
+{
+       struct rockchip_pinctrl *info = bank->drvdata;
+
+       /* The first 24 pins of the first bank are located in PMU */
+       if (bank->bank_num == 0) {
+               *regmap = info->regmap_pmu;
+               *reg = RK3288_DRV_PMU_OFFSET;
+
+               *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
+               *bit = pin_num % RK3288_DRV_PINS_PER_REG;
+               *bit *= RK3288_DRV_BITS_PER_PIN;
+       } else {
+               *regmap = info->regmap_base;
+               *reg = RK3288_DRV_GRF_OFFSET;
+
+               /* correct the offset, as we're starting with the 2nd bank */
+               *reg -= 0x10;
+               *reg += bank->bank_num * RK3288_DRV_BANK_STRIDE;
+               *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
+
+               *bit = (pin_num % RK3288_DRV_PINS_PER_REG);
+               *bit *= RK3288_DRV_BITS_PER_PIN;
+       }
+}
+
+static int rk3288_get_drive(struct rockchip_pin_bank *bank, int pin_num)
+{
+       struct regmap *regmap;
+       int reg, ret;
+       u32 data;
+       u8 bit;
+
+       rk3288_calc_drv_reg_and_bit(bank, pin_num, &regmap, &reg, &bit);
+
+       ret = regmap_read(regmap, reg, &data);
+       if (ret)
+               return ret;
+
+       data >>= bit;
+       data &= (1 << RK3288_DRV_BITS_PER_PIN) - 1;
+
+       return rk3288_drv_list[data];
+}
+
+static int rk3288_set_drive(struct rockchip_pin_bank *bank, int pin_num,
+                           int strength)
+{
+       struct rockchip_pinctrl *info = bank->drvdata;
+       struct regmap *regmap;
+       unsigned long flags;
+       int reg, ret, i;
+       u32 data;
+       u8 bit;
+
+       rk3288_calc_drv_reg_and_bit(bank, pin_num, &regmap, &reg, &bit);
+
+       ret = -EINVAL;
+       for (i = 0; i < ARRAY_SIZE(rk3288_drv_list); i++) {
+               if (rk3288_drv_list[i] == strength) {
+                       ret = i;
+                       break;
+               }
+       }
+
+       if (ret < 0) {
+               dev_err(info->dev, "unsupported driver strength %d\n",
+                       strength);
+               return ret;
+       }
+
+       spin_lock_irqsave(&bank->slock, flags);
+
+       /* enable the write to the equivalent lower bits */
+       data = ((1 << RK3288_DRV_BITS_PER_PIN) - 1) << (bit + 16);
+       data |= (ret << bit);
+
+       ret = regmap_write(regmap, reg, data);
+       spin_unlock_irqrestore(&bank->slock, flags);
+
+       return ret;
+}
+
 static int rockchip_get_pull(struct rockchip_pin_bank *bank, int pin_num)
 {
        struct rockchip_pinctrl *info = bank->drvdata;
@@ -501,6 +690,7 @@ static int rockchip_get_pull(struct rockchip_pin_bank *bank, int pin_num)
                                ? PIN_CONFIG_BIAS_PULL_PIN_DEFAULT
                                : PIN_CONFIG_BIAS_DISABLE;
        case RK3188:
+       case RK3288:
                data >>= bit;
                data &= (1 << RK3188_PULL_BITS_PER_PIN) - 1;
 
@@ -555,6 +745,7 @@ static int rockchip_set_pull(struct rockchip_pin_bank *bank,
                spin_unlock_irqrestore(&bank->slock, flags);
                break;
        case RK3188:
+       case RK3288:
                spin_lock_irqsave(&bank->slock, flags);
 
                /* enable the write to the equivalent lower bits */
@@ -657,23 +848,6 @@ static int rockchip_pmx_enable(struct pinctrl_dev *pctldev, unsigned selector,
        return 0;
 }
 
-static void rockchip_pmx_disable(struct pinctrl_dev *pctldev,
-                                       unsigned selector, unsigned group)
-{
-       struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
-       const unsigned int *pins = info->groups[group].pins;
-       struct rockchip_pin_bank *bank;
-       int cnt;
-
-       dev_dbg(info->dev, "disable function %s group %s\n",
-               info->functions[selector].name, info->groups[group].name);
-
-       for (cnt = 0; cnt < info->groups[group].npins; cnt++) {
-               bank = pin_to_bank(info, pins[cnt]);
-               rockchip_set_mux(bank, pins[cnt] - bank->pin_base, 0);
-       }
-}
-
 /*
  * The calls to gpio_direction_output() and gpio_direction_input()
  * leads to this function call (via the pinctrl_gpio_direction_{input|output}()
@@ -716,7 +890,6 @@ static const struct pinmux_ops rockchip_pmx_ops = {
        .get_function_name      = rockchip_pmx_get_func_name,
        .get_function_groups    = rockchip_pmx_get_groups,
        .enable                 = rockchip_pmx_enable,
-       .disable                = rockchip_pmx_disable,
        .gpio_set_direction     = rockchip_pmx_gpio_set_direction,
 };
 
@@ -734,6 +907,7 @@ static bool rockchip_pinconf_pull_valid(struct rockchip_pin_ctrl *ctrl,
        case RK3066B:
                return pull ? false : true;
        case RK3188:
+       case RK3288:
                return (pull != PIN_CONFIG_BIAS_PULL_PIN_DEFAULT);
        }
 
@@ -788,6 +962,15 @@ static int rockchip_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
                        if (rc)
                                return rc;
                        break;
+               case PIN_CONFIG_DRIVE_STRENGTH:
+                       /* rk3288 is the first with per-pin drive-strength */
+                       if (info->ctrl->type != RK3288)
+                               return -ENOTSUPP;
+
+                       rc = rk3288_set_drive(bank, pin - bank->pin_base, arg);
+                       if (rc < 0)
+                               return rc;
+                       break;
                default:
                        return -ENOTSUPP;
                        break;
@@ -837,6 +1020,17 @@ static int rockchip_pinconf_get(struct pinctrl_dev *pctldev, unsigned int pin,
 
                arg = rc ? 1 : 0;
                break;
+       case PIN_CONFIG_DRIVE_STRENGTH:
+               /* rk3288 is the first with per-pin drive-strength */
+               if (info->ctrl->type != RK3288)
+                       return -ENOTSUPP;
+
+               rc = rk3288_get_drive(bank, pin - bank->pin_base);
+               if (rc < 0)
+                       return rc;
+
+               arg = rc;
+               break;
        default:
                return -ENOTSUPP;
                break;
@@ -850,6 +1044,7 @@ static int rockchip_pinconf_get(struct pinctrl_dev *pctldev, unsigned int pin,
 static const struct pinconf_ops rockchip_pinconf_ops = {
        .pin_config_get                 = rockchip_pinconf_get,
        .pin_config_set                 = rockchip_pinconf_set,
+       .is_generic                     = true,
 };
 
 static const struct of_device_id rockchip_bank_match[] = {
@@ -1414,10 +1609,7 @@ fail:
        for (--i, --bank; i >= 0; --i, --bank) {
                if (!bank->valid)
                        continue;
-
-               if (gpiochip_remove(&bank->gpio_chip))
-                       dev_err(&pdev->dev, "gpio chip %s remove failed\n",
-                                                       bank->gpio_chip.label);
+               gpiochip_remove(&bank->gpio_chip);
        }
        return ret;
 }
@@ -1427,20 +1619,15 @@ static int rockchip_gpiolib_unregister(struct platform_device *pdev,
 {
        struct rockchip_pin_ctrl *ctrl = info->ctrl;
        struct rockchip_pin_bank *bank = ctrl->pin_banks;
-       int ret = 0;
        int i;
 
-       for (i = 0; !ret && i < ctrl->nr_banks; ++i, ++bank) {
+       for (i = 0; i < ctrl->nr_banks; ++i, ++bank) {
                if (!bank->valid)
                        continue;
-
-               ret = gpiochip_remove(&bank->gpio_chip);
+               gpiochip_remove(&bank->gpio_chip);
        }
 
-       if (ret)
-               dev_err(&pdev->dev, "gpio chip remove failed\n");
-
-       return ret;
+       return 0;
 }
 
 static int rockchip_get_bank_data(struct rockchip_pin_bank *bank,
@@ -1466,8 +1653,6 @@ static int rockchip_get_bank_data(struct rockchip_pin_bank *bank,
                                    "rockchip,rk3188-gpio-bank0")) {
                struct device_node *node;
 
-               bank->bank_type = RK3188_BANK0;
-
                node = of_parse_phandle(bank->of_node->parent,
                                        "rockchip,pmu", 0);
                if (!node) {
@@ -1487,9 +1672,6 @@ static int rockchip_get_bank_data(struct rockchip_pin_bank *bank,
                                                    base,
                                                    &rockchip_regmap_config);
                }
-
-       } else {
-               bank->bank_type = COMMON_BANK;
        }
 
        bank->irq = irq_of_parse_and_map(bank->of_node, 0);
@@ -1513,7 +1695,7 @@ static struct rockchip_pin_ctrl *rockchip_pinctrl_get_soc_data(
        struct device_node *np;
        struct rockchip_pin_ctrl *ctrl;
        struct rockchip_pin_bank *bank;
-       int i;
+       int grf_offs, pmu_offs, i, j;
 
        match = of_match_node(rockchip_pinctrl_dt_match, node);
        ctrl = (struct rockchip_pin_ctrl *)match->data;
@@ -1535,12 +1717,51 @@ static struct rockchip_pin_ctrl *rockchip_pinctrl_get_soc_data(
                }
        }
 
+       grf_offs = ctrl->grf_mux_offset;
+       pmu_offs = ctrl->pmu_mux_offset;
        bank = ctrl->pin_banks;
        for (i = 0; i < ctrl->nr_banks; ++i, ++bank) {
+               int bank_pins = 0;
+
                spin_lock_init(&bank->slock);
                bank->drvdata = d;
                bank->pin_base = ctrl->nr_pins;
                ctrl->nr_pins += bank->nr_pins;
+
+               /* calculate iomux offsets */
+               for (j = 0; j < 4; j++) {
+                       struct rockchip_iomux *iom = &bank->iomux[j];
+                       int inc;
+
+                       if (bank_pins >= bank->nr_pins)
+                               break;
+
+                       /* preset offset value, set new start value */
+                       if (iom->offset >= 0) {
+                               if (iom->type & IOMUX_SOURCE_PMU)
+                                       pmu_offs = iom->offset;
+                               else
+                                       grf_offs = iom->offset;
+                       } else { /* set current offset */
+                               iom->offset = (iom->type & IOMUX_SOURCE_PMU) ?
+                                                       pmu_offs : grf_offs;
+                       }
+
+                       dev_dbg(d->dev, "bank %d, iomux %d has offset 0x%x\n",
+                                i, j, iom->offset);
+
+                       /*
+                        * Increase offset according to iomux width.
+                        * 4bit iomux'es are spread over two registers.
+                        */
+                       inc = (iom->type & IOMUX_WIDTH_4BIT) ? 8 : 4;
+                       if (iom->type & IOMUX_SOURCE_PMU)
+                               pmu_offs += inc;
+                       else
+                               grf_offs += inc;
+
+                       bank_pins += 8;
+               }
        }
 
        return ctrl;
@@ -1644,7 +1865,7 @@ static struct rockchip_pin_ctrl rk2928_pin_ctrl = {
                .nr_banks               = ARRAY_SIZE(rk2928_pin_banks),
                .label                  = "RK2928-GPIO",
                .type                   = RK2928,
-               .mux_offset             = 0xa8,
+               .grf_mux_offset         = 0xa8,
                .pull_calc_reg          = rk2928_calc_pull_reg_and_bit,
 };
 
@@ -1662,7 +1883,7 @@ static struct rockchip_pin_ctrl rk3066a_pin_ctrl = {
                .nr_banks               = ARRAY_SIZE(rk3066a_pin_banks),
                .label                  = "RK3066a-GPIO",
                .type                   = RK2928,
-               .mux_offset             = 0xa8,
+               .grf_mux_offset         = 0xa8,
                .pull_calc_reg          = rk2928_calc_pull_reg_and_bit,
 };
 
@@ -1678,11 +1899,11 @@ static struct rockchip_pin_ctrl rk3066b_pin_ctrl = {
                .nr_banks       = ARRAY_SIZE(rk3066b_pin_banks),
                .label          = "RK3066b-GPIO",
                .type           = RK3066B,
-               .mux_offset     = 0x60,
+               .grf_mux_offset = 0x60,
 };
 
 static struct rockchip_pin_bank rk3188_pin_banks[] = {
-       PIN_BANK(0, 32, "gpio0"),
+       PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_GPIO_ONLY, 0, 0, 0),
        PIN_BANK(1, 32, "gpio1"),
        PIN_BANK(2, 32, "gpio2"),
        PIN_BANK(3, 32, "gpio3"),
@@ -1693,10 +1914,52 @@ static struct rockchip_pin_ctrl rk3188_pin_ctrl = {
                .nr_banks               = ARRAY_SIZE(rk3188_pin_banks),
                .label                  = "RK3188-GPIO",
                .type                   = RK3188,
-               .mux_offset             = 0x60,
+               .grf_mux_offset         = 0x60,
                .pull_calc_reg          = rk3188_calc_pull_reg_and_bit,
 };
 
+static struct rockchip_pin_bank rk3288_pin_banks[] = {
+       PIN_BANK_IOMUX_FLAGS(0, 24, "gpio0", IOMUX_SOURCE_PMU,
+                                            IOMUX_SOURCE_PMU,
+                                            IOMUX_SOURCE_PMU,
+                                            IOMUX_UNROUTED
+                           ),
+       PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_UNROUTED,
+                                            IOMUX_UNROUTED,
+                                            IOMUX_UNROUTED,
+                                            0
+                           ),
+       PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0, 0, 0, IOMUX_UNROUTED),
+       PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 0, 0, 0, IOMUX_WIDTH_4BIT),
+       PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", IOMUX_WIDTH_4BIT,
+                                            IOMUX_WIDTH_4BIT,
+                                            0,
+                                            0
+                           ),
+       PIN_BANK_IOMUX_FLAGS(5, 32, "gpio5", IOMUX_UNROUTED,
+                                            0,
+                                            0,
+                                            IOMUX_UNROUTED
+                           ),
+       PIN_BANK_IOMUX_FLAGS(6, 32, "gpio6", 0, 0, 0, IOMUX_UNROUTED),
+       PIN_BANK_IOMUX_FLAGS(7, 32, "gpio7", 0,
+                                            0,
+                                            IOMUX_WIDTH_4BIT,
+                                            IOMUX_UNROUTED
+                           ),
+       PIN_BANK(8, 16, "gpio8"),
+};
+
+static struct rockchip_pin_ctrl rk3288_pin_ctrl = {
+               .pin_banks              = rk3288_pin_banks,
+               .nr_banks               = ARRAY_SIZE(rk3288_pin_banks),
+               .label                  = "RK3288-GPIO",
+               .type                   = RK3288,
+               .grf_mux_offset         = 0x0,
+               .pmu_mux_offset         = 0x84,
+               .pull_calc_reg          = rk3288_calc_pull_reg_and_bit,
+};
+
 static const struct of_device_id rockchip_pinctrl_dt_match[] = {
        { .compatible = "rockchip,rk2928-pinctrl",
                .data = (void *)&rk2928_pin_ctrl },
@@ -1706,6 +1969,8 @@ static const struct of_device_id rockchip_pinctrl_dt_match[] = {
                .data = (void *)&rk3066b_pin_ctrl },
        { .compatible = "rockchip,rk3188-pinctrl",
                .data = (void *)&rk3188_pin_ctrl },
+       { .compatible = "rockchip,rk3288-pinctrl",
+               .data = (void *)&rk3288_pin_ctrl },
        {},
 };
 MODULE_DEVICE_TABLE(of, rockchip_pinctrl_dt_match);
diff --git a/drivers/pinctrl/pinctrl-s3c24xx.c b/drivers/pinctrl/pinctrl-s3c24xx.c
deleted file mode 100644 (file)
index ad3eaad..0000000
+++ /dev/null
@@ -1,651 +0,0 @@
-/*
- * S3C24XX specific support for Samsung pinctrl/gpiolib driver.
- *
- * Copyright (c) 2013 Heiko Stuebner <heiko@sntech.de>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This file contains the SamsungS3C24XX specific information required by the
- * Samsung pinctrl/gpiolib driver. It also includes the implementation of
- * external gpio and wakeup interrupt support.
- */
-
-#include <linux/module.h>
-#include <linux/device.h>
-#include <linux/interrupt.h>
-#include <linux/irqdomain.h>
-#include <linux/irq.h>
-#include <linux/of_irq.h>
-#include <linux/irqchip/chained_irq.h>
-#include <linux/io.h>
-#include <linux/slab.h>
-#include <linux/err.h>
-
-#include "pinctrl-samsung.h"
-
-#define NUM_EINT       24
-#define NUM_EINT_IRQ   6
-#define EINT_MAX_PER_GROUP     8
-
-#define EINTPEND_REG   0xa8
-#define EINTMASK_REG   0xa4
-
-#define EINT_GROUP(i)          ((int)((i) / EINT_MAX_PER_GROUP))
-#define EINT_REG(i)            ((EINT_GROUP(i) * 4) + 0x88)
-#define EINT_OFFS(i)           ((i) % EINT_MAX_PER_GROUP * 4)
-
-#define EINT_LEVEL_LOW         0
-#define EINT_LEVEL_HIGH                1
-#define EINT_EDGE_FALLING      2
-#define EINT_EDGE_RISING       4
-#define EINT_EDGE_BOTH         6
-#define EINT_MASK              0xf
-
-static struct samsung_pin_bank_type bank_type_1bit = {
-       .fld_width = { 1, 1, },
-       .reg_offset = { 0x00, 0x04, },
-};
-
-static struct samsung_pin_bank_type bank_type_2bit = {
-       .fld_width = { 2, 1, 2, },
-       .reg_offset = { 0x00, 0x04, 0x08, },
-};
-
-#define PIN_BANK_A(pins, reg, id)              \
-       {                                               \
-               .type           = &bank_type_1bit,      \
-               .pctl_offset    = reg,                  \
-               .nr_pins        = pins,                 \
-               .eint_type      = EINT_TYPE_NONE,       \
-               .name           = id                    \
-       }
-
-#define PIN_BANK_2BIT(pins, reg, id)           \
-       {                                               \
-               .type           = &bank_type_2bit,      \
-               .pctl_offset    = reg,                  \
-               .nr_pins        = pins,                 \
-               .eint_type      = EINT_TYPE_NONE,       \
-               .name           = id                    \
-       }
-
-#define PIN_BANK_2BIT_EINTW(pins, reg, id, eoffs, emask)\
-       {                                               \
-               .type           = &bank_type_2bit,      \
-               .pctl_offset    = reg,                  \
-               .nr_pins        = pins,                 \
-               .eint_type      = EINT_TYPE_WKUP,       \
-               .eint_func      = 2,                    \
-               .eint_mask      = emask,                \
-               .eint_offset    = eoffs,                \
-               .name           = id                    \
-       }
-
-/**
- * struct s3c24xx_eint_data: EINT common data
- * @drvdata: pin controller driver data
- * @domains: IRQ domains of particular EINT interrupts
- * @parents: mapped parent irqs in the main interrupt controller
- */
-struct s3c24xx_eint_data {
-       struct samsung_pinctrl_drv_data *drvdata;
-       struct irq_domain *domains[NUM_EINT];
-       int parents[NUM_EINT_IRQ];
-};
-
-/**
- * struct s3c24xx_eint_domain_data: per irq-domain data
- * @bank: pin bank related to the domain
- * @eint_data: common data
- * eint0_3_parent_only: live eints 0-3 only in the main intc
- */
-struct s3c24xx_eint_domain_data {
-       struct samsung_pin_bank *bank;
-       struct s3c24xx_eint_data *eint_data;
-       bool eint0_3_parent_only;
-};
-
-static int s3c24xx_eint_get_trigger(unsigned int type)
-{
-       switch (type) {
-       case IRQ_TYPE_EDGE_RISING:
-               return EINT_EDGE_RISING;
-               break;
-       case IRQ_TYPE_EDGE_FALLING:
-               return EINT_EDGE_FALLING;
-               break;
-       case IRQ_TYPE_EDGE_BOTH:
-               return EINT_EDGE_BOTH;
-               break;
-       case IRQ_TYPE_LEVEL_HIGH:
-               return EINT_LEVEL_HIGH;
-               break;
-       case IRQ_TYPE_LEVEL_LOW:
-               return EINT_LEVEL_LOW;
-               break;
-       default:
-               return -EINVAL;
-       }
-}
-
-static void s3c24xx_eint_set_handler(unsigned int irq, unsigned int type)
-{
-       /* Edge- and level-triggered interrupts need different handlers */
-       if (type & IRQ_TYPE_EDGE_BOTH)
-               __irq_set_handler_locked(irq, handle_edge_irq);
-       else
-               __irq_set_handler_locked(irq, handle_level_irq);
-}
-
-static void s3c24xx_eint_set_function(struct samsung_pinctrl_drv_data *d,
-                                       struct samsung_pin_bank *bank, int pin)
-{
-       struct samsung_pin_bank_type *bank_type = bank->type;
-       unsigned long flags;
-       void __iomem *reg;
-       u8 shift;
-       u32 mask;
-       u32 val;
-
-       /* Make sure that pin is configured as interrupt */
-       reg = d->virt_base + bank->pctl_offset;
-       shift = pin * bank_type->fld_width[PINCFG_TYPE_FUNC];
-       mask = (1 << bank_type->fld_width[PINCFG_TYPE_FUNC]) - 1;
-
-       spin_lock_irqsave(&bank->slock, flags);
-
-       val = readl(reg);
-       val &= ~(mask << shift);
-       val |= bank->eint_func << shift;
-       writel(val, reg);
-
-       spin_unlock_irqrestore(&bank->slock, flags);
-}
-
-static int s3c24xx_eint_type(struct irq_data *data, unsigned int type)
-{
-       struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(data);
-       struct samsung_pinctrl_drv_data *d = bank->drvdata;
-       int index = bank->eint_offset + data->hwirq;
-       void __iomem *reg;
-       int trigger;
-       u8 shift;
-       u32 val;
-
-       trigger = s3c24xx_eint_get_trigger(type);
-       if (trigger < 0) {
-               dev_err(d->dev, "unsupported external interrupt type\n");
-               return -EINVAL;
-       }
-
-       s3c24xx_eint_set_handler(data->irq, type);
-
-       /* Set up interrupt trigger */
-       reg = d->virt_base + EINT_REG(index);
-       shift = EINT_OFFS(index);
-
-       val = readl(reg);
-       val &= ~(EINT_MASK << shift);
-       val |= trigger << shift;
-       writel(val, reg);
-
-       s3c24xx_eint_set_function(d, bank, data->hwirq);
-
-       return 0;
-}
-
-/* Handling of EINTs 0-3 on all except S3C2412 and S3C2413 */
-
-static void s3c2410_eint0_3_ack(struct irq_data *data)
-{
-       struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(data);
-       struct s3c24xx_eint_domain_data *ddata = bank->irq_domain->host_data;
-       struct s3c24xx_eint_data *eint_data = ddata->eint_data;
-       int parent_irq = eint_data->parents[data->hwirq];
-       struct irq_chip *parent_chip = irq_get_chip(parent_irq);
-
-       parent_chip->irq_ack(irq_get_irq_data(parent_irq));
-}
-
-static void s3c2410_eint0_3_mask(struct irq_data *data)
-{
-       struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(data);
-       struct s3c24xx_eint_domain_data *ddata = bank->irq_domain->host_data;
-       struct s3c24xx_eint_data *eint_data = ddata->eint_data;
-       int parent_irq = eint_data->parents[data->hwirq];
-       struct irq_chip *parent_chip = irq_get_chip(parent_irq);
-
-       parent_chip->irq_mask(irq_get_irq_data(parent_irq));
-}
-
-static void s3c2410_eint0_3_unmask(struct irq_data *data)
-{
-       struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(data);
-       struct s3c24xx_eint_domain_data *ddata = bank->irq_domain->host_data;
-       struct s3c24xx_eint_data *eint_data = ddata->eint_data;
-       int parent_irq = eint_data->parents[data->hwirq];
-       struct irq_chip *parent_chip = irq_get_chip(parent_irq);
-
-       parent_chip->irq_unmask(irq_get_irq_data(parent_irq));
-}
-
-static struct irq_chip s3c2410_eint0_3_chip = {
-       .name           = "s3c2410-eint0_3",
-       .irq_ack        = s3c2410_eint0_3_ack,
-       .irq_mask       = s3c2410_eint0_3_mask,
-       .irq_unmask     = s3c2410_eint0_3_unmask,
-       .irq_set_type   = s3c24xx_eint_type,
-};
-
-static void s3c2410_demux_eint0_3(unsigned int irq, struct irq_desc *desc)
-{
-       struct irq_data *data = irq_desc_get_irq_data(desc);
-       struct s3c24xx_eint_data *eint_data = irq_get_handler_data(irq);
-       unsigned int virq;
-
-       /* the first 4 eints have a simple 1 to 1 mapping */
-       virq = irq_linear_revmap(eint_data->domains[data->hwirq], data->hwirq);
-       /* Something must be really wrong if an unmapped EINT is unmasked */
-       BUG_ON(!virq);
-
-       generic_handle_irq(virq);
-}
-
-/* Handling of EINTs 0-3 on S3C2412 and S3C2413 */
-
-static void s3c2412_eint0_3_ack(struct irq_data *data)
-{
-       struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(data);
-       struct samsung_pinctrl_drv_data *d = bank->drvdata;
-
-       unsigned long bitval = 1UL << data->hwirq;
-       writel(bitval, d->virt_base + EINTPEND_REG);
-}
-
-static void s3c2412_eint0_3_mask(struct irq_data *data)
-{
-       struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(data);
-       struct samsung_pinctrl_drv_data *d = bank->drvdata;
-       unsigned long mask;
-
-       mask = readl(d->virt_base + EINTMASK_REG);
-       mask |= (1UL << data->hwirq);
-       writel(mask, d->virt_base + EINTMASK_REG);
-}
-
-static void s3c2412_eint0_3_unmask(struct irq_data *data)
-{
-       struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(data);
-       struct samsung_pinctrl_drv_data *d = bank->drvdata;
-       unsigned long mask;
-
-       mask = readl(d->virt_base + EINTMASK_REG);
-       mask &= ~(1UL << data->hwirq);
-       writel(mask, d->virt_base + EINTMASK_REG);
-}
-
-static struct irq_chip s3c2412_eint0_3_chip = {
-       .name           = "s3c2412-eint0_3",
-       .irq_ack        = s3c2412_eint0_3_ack,
-       .irq_mask       = s3c2412_eint0_3_mask,
-       .irq_unmask     = s3c2412_eint0_3_unmask,
-       .irq_set_type   = s3c24xx_eint_type,
-};
-
-static void s3c2412_demux_eint0_3(unsigned int irq, struct irq_desc *desc)
-{
-       struct irq_chip *chip = irq_get_chip(irq);
-       struct irq_data *data = irq_desc_get_irq_data(desc);
-       struct s3c24xx_eint_data *eint_data = irq_get_handler_data(irq);
-       unsigned int virq;
-
-       chained_irq_enter(chip, desc);
-
-       /* the first 4 eints have a simple 1 to 1 mapping */
-       virq = irq_linear_revmap(eint_data->domains[data->hwirq], data->hwirq);
-       /* Something must be really wrong if an unmapped EINT is unmasked */
-       BUG_ON(!virq);
-
-       generic_handle_irq(virq);
-
-       chained_irq_exit(chip, desc);
-}
-
-/* Handling of all other eints */
-
-static void s3c24xx_eint_ack(struct irq_data *data)
-{
-       struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(data);
-       struct samsung_pinctrl_drv_data *d = bank->drvdata;
-       unsigned char index = bank->eint_offset + data->hwirq;
-
-       writel(1UL << index, d->virt_base + EINTPEND_REG);
-}
-
-static void s3c24xx_eint_mask(struct irq_data *data)
-{
-       struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(data);
-       struct samsung_pinctrl_drv_data *d = bank->drvdata;
-       unsigned char index = bank->eint_offset + data->hwirq;
-       unsigned long mask;
-
-       mask = readl(d->virt_base + EINTMASK_REG);
-       mask |= (1UL << index);
-       writel(mask, d->virt_base + EINTMASK_REG);
-}
-
-static void s3c24xx_eint_unmask(struct irq_data *data)
-{
-       struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(data);
-       struct samsung_pinctrl_drv_data *d = bank->drvdata;
-       unsigned char index = bank->eint_offset + data->hwirq;
-       unsigned long mask;
-
-       mask = readl(d->virt_base + EINTMASK_REG);
-       mask &= ~(1UL << index);
-       writel(mask, d->virt_base + EINTMASK_REG);
-}
-
-static struct irq_chip s3c24xx_eint_chip = {
-       .name           = "s3c-eint",
-       .irq_ack        = s3c24xx_eint_ack,
-       .irq_mask       = s3c24xx_eint_mask,
-       .irq_unmask     = s3c24xx_eint_unmask,
-       .irq_set_type   = s3c24xx_eint_type,
-};
-
-static inline void s3c24xx_demux_eint(unsigned int irq, struct irq_desc *desc,
-                                     u32 offset, u32 range)
-{
-       struct irq_chip *chip = irq_get_chip(irq);
-       struct s3c24xx_eint_data *data = irq_get_handler_data(irq);
-       struct samsung_pinctrl_drv_data *d = data->drvdata;
-       unsigned int pend, mask;
-
-       chained_irq_enter(chip, desc);
-
-       pend = readl(d->virt_base + EINTPEND_REG);
-       mask = readl(d->virt_base + EINTMASK_REG);
-
-       pend &= ~mask;
-       pend &= range;
-
-       while (pend) {
-               unsigned int virq;
-
-               irq = __ffs(pend);
-               pend &= ~(1 << irq);
-               virq = irq_linear_revmap(data->domains[irq], irq - offset);
-               /* Something is really wrong if an unmapped EINT is unmasked */
-               BUG_ON(!virq);
-
-               generic_handle_irq(virq);
-       }
-
-       chained_irq_exit(chip, desc);
-}
-
-static void s3c24xx_demux_eint4_7(unsigned int irq, struct irq_desc *desc)
-{
-       s3c24xx_demux_eint(irq, desc, 0, 0xf0);
-}
-
-static void s3c24xx_demux_eint8_23(unsigned int irq, struct irq_desc *desc)
-{
-       s3c24xx_demux_eint(irq, desc, 8, 0xffff00);
-}
-
-static irq_flow_handler_t s3c2410_eint_handlers[NUM_EINT_IRQ] = {
-       s3c2410_demux_eint0_3,
-       s3c2410_demux_eint0_3,
-       s3c2410_demux_eint0_3,
-       s3c2410_demux_eint0_3,
-       s3c24xx_demux_eint4_7,
-       s3c24xx_demux_eint8_23,
-};
-
-static irq_flow_handler_t s3c2412_eint_handlers[NUM_EINT_IRQ] = {
-       s3c2412_demux_eint0_3,
-       s3c2412_demux_eint0_3,
-       s3c2412_demux_eint0_3,
-       s3c2412_demux_eint0_3,
-       s3c24xx_demux_eint4_7,
-       s3c24xx_demux_eint8_23,
-};
-
-static int s3c24xx_gpf_irq_map(struct irq_domain *h, unsigned int virq,
-                                       irq_hw_number_t hw)
-{
-       struct s3c24xx_eint_domain_data *ddata = h->host_data;
-       struct samsung_pin_bank *bank = ddata->bank;
-
-       if (!(bank->eint_mask & (1 << (bank->eint_offset + hw))))
-               return -EINVAL;
-
-       if (hw <= 3) {
-               if (ddata->eint0_3_parent_only)
-                       irq_set_chip_and_handler(virq, &s3c2410_eint0_3_chip,
-                                                handle_edge_irq);
-               else
-                       irq_set_chip_and_handler(virq, &s3c2412_eint0_3_chip,
-                                                handle_edge_irq);
-       } else {
-               irq_set_chip_and_handler(virq, &s3c24xx_eint_chip,
-                                        handle_edge_irq);
-       }
-       irq_set_chip_data(virq, bank);
-       set_irq_flags(virq, IRQF_VALID);
-       return 0;
-}
-
-static const struct irq_domain_ops s3c24xx_gpf_irq_ops = {
-       .map    = s3c24xx_gpf_irq_map,
-       .xlate  = irq_domain_xlate_twocell,
-};
-
-static int s3c24xx_gpg_irq_map(struct irq_domain *h, unsigned int virq,
-                                       irq_hw_number_t hw)
-{
-       struct s3c24xx_eint_domain_data *ddata = h->host_data;
-       struct samsung_pin_bank *bank = ddata->bank;
-
-       if (!(bank->eint_mask & (1 << (bank->eint_offset + hw))))
-               return -EINVAL;
-
-       irq_set_chip_and_handler(virq, &s3c24xx_eint_chip, handle_edge_irq);
-       irq_set_chip_data(virq, bank);
-       set_irq_flags(virq, IRQF_VALID);
-       return 0;
-}
-
-static const struct irq_domain_ops s3c24xx_gpg_irq_ops = {
-       .map    = s3c24xx_gpg_irq_map,
-       .xlate  = irq_domain_xlate_twocell,
-};
-
-static const struct of_device_id s3c24xx_eint_irq_ids[] = {
-       { .compatible = "samsung,s3c2410-wakeup-eint", .data = (void *)1 },
-       { .compatible = "samsung,s3c2412-wakeup-eint", .data = (void *)0 },
-       { }
-};
-
-static int s3c24xx_eint_init(struct samsung_pinctrl_drv_data *d)
-{
-       struct device *dev = d->dev;
-       const struct of_device_id *match;
-       struct device_node *eint_np = NULL;
-       struct device_node *np;
-       struct samsung_pin_bank *bank;
-       struct s3c24xx_eint_data *eint_data;
-       const struct irq_domain_ops *ops;
-       unsigned int i;
-       bool eint0_3_parent_only;
-       irq_flow_handler_t *handlers;
-
-       for_each_child_of_node(dev->of_node, np) {
-               match = of_match_node(s3c24xx_eint_irq_ids, np);
-               if (match) {
-                       eint_np = np;
-                       eint0_3_parent_only = (bool)match->data;
-                       break;
-               }
-       }
-       if (!eint_np)
-               return -ENODEV;
-
-       eint_data = devm_kzalloc(dev, sizeof(*eint_data), GFP_KERNEL);
-       if (!eint_data)
-               return -ENOMEM;
-
-       eint_data->drvdata = d;
-
-       handlers = eint0_3_parent_only ? s3c2410_eint_handlers
-                                      : s3c2412_eint_handlers;
-       for (i = 0; i < NUM_EINT_IRQ; ++i) {
-               unsigned int irq;
-
-               irq = irq_of_parse_and_map(eint_np, i);
-               if (!irq) {
-                       dev_err(dev, "failed to get wakeup EINT IRQ %d\n", i);
-                       return -ENXIO;
-               }
-
-               eint_data->parents[i] = irq;
-               irq_set_chained_handler(irq, handlers[i]);
-               irq_set_handler_data(irq, eint_data);
-       }
-
-       bank = d->ctrl->pin_banks;
-       for (i = 0; i < d->ctrl->nr_banks; ++i, ++bank) {
-               struct s3c24xx_eint_domain_data *ddata;
-               unsigned int mask;
-               unsigned int irq;
-               unsigned int pin;
-
-               if (bank->eint_type != EINT_TYPE_WKUP)
-                       continue;
-
-               ddata = devm_kzalloc(dev, sizeof(*ddata), GFP_KERNEL);
-               if (!ddata)
-                       return -ENOMEM;
-
-               ddata->bank = bank;
-               ddata->eint_data = eint_data;
-               ddata->eint0_3_parent_only = eint0_3_parent_only;
-
-               ops = (bank->eint_offset == 0) ? &s3c24xx_gpf_irq_ops
-                                              : &s3c24xx_gpg_irq_ops;
-
-               bank->irq_domain = irq_domain_add_linear(bank->of_node,
-                               bank->nr_pins, ops, ddata);
-               if (!bank->irq_domain) {
-                       dev_err(dev, "wkup irq domain add failed\n");
-                       return -ENXIO;
-               }
-
-               irq = bank->eint_offset;
-               mask = bank->eint_mask;
-               for (pin = 0; mask; ++pin, mask >>= 1) {
-                       if (irq >= NUM_EINT)
-                               break;
-                       if (!(mask & 1))
-                               continue;
-                       eint_data->domains[irq] = bank->irq_domain;
-                       ++irq;
-               }
-       }
-
-       return 0;
-}
-
-static struct samsung_pin_bank s3c2412_pin_banks[] = {
-       PIN_BANK_A(23, 0x000, "gpa"),
-       PIN_BANK_2BIT(11, 0x010, "gpb"),
-       PIN_BANK_2BIT(16, 0x020, "gpc"),
-       PIN_BANK_2BIT(16, 0x030, "gpd"),
-       PIN_BANK_2BIT(16, 0x040, "gpe"),
-       PIN_BANK_2BIT_EINTW(8, 0x050, "gpf", 0, 0xff),
-       PIN_BANK_2BIT_EINTW(16, 0x060, "gpg", 8, 0xffff00),
-       PIN_BANK_2BIT(11, 0x070, "gph"),
-       PIN_BANK_2BIT(13, 0x080, "gpj"),
-};
-
-struct samsung_pin_ctrl s3c2412_pin_ctrl[] = {
-       {
-               .pin_banks      = s3c2412_pin_banks,
-               .nr_banks       = ARRAY_SIZE(s3c2412_pin_banks),
-               .eint_wkup_init = s3c24xx_eint_init,
-               .label          = "S3C2412-GPIO",
-       },
-};
-
-static struct samsung_pin_bank s3c2416_pin_banks[] = {
-       PIN_BANK_A(27, 0x000, "gpa"),
-       PIN_BANK_2BIT(11, 0x010, "gpb"),
-       PIN_BANK_2BIT(16, 0x020, "gpc"),
-       PIN_BANK_2BIT(16, 0x030, "gpd"),
-       PIN_BANK_2BIT(16, 0x040, "gpe"),
-       PIN_BANK_2BIT_EINTW(8, 0x050, "gpf", 0, 0xff),
-       PIN_BANK_2BIT_EINTW(8, 0x060, "gpg", 8, 0xff00),
-       PIN_BANK_2BIT(15, 0x070, "gph"),
-       PIN_BANK_2BIT(16, 0x0e0, "gpk"),
-       PIN_BANK_2BIT(14, 0x0f0, "gpl"),
-       PIN_BANK_2BIT(2, 0x100, "gpm"),
-};
-
-struct samsung_pin_ctrl s3c2416_pin_ctrl[] = {
-       {
-               .pin_banks      = s3c2416_pin_banks,
-               .nr_banks       = ARRAY_SIZE(s3c2416_pin_banks),
-               .eint_wkup_init = s3c24xx_eint_init,
-               .label          = "S3C2416-GPIO",
-       },
-};
-
-static struct samsung_pin_bank s3c2440_pin_banks[] = {
-       PIN_BANK_A(25, 0x000, "gpa"),
-       PIN_BANK_2BIT(11, 0x010, "gpb"),
-       PIN_BANK_2BIT(16, 0x020, "gpc"),
-       PIN_BANK_2BIT(16, 0x030, "gpd"),
-       PIN_BANK_2BIT(16, 0x040, "gpe"),
-       PIN_BANK_2BIT_EINTW(8, 0x050, "gpf", 0, 0xff),
-       PIN_BANK_2BIT_EINTW(16, 0x060, "gpg", 8, 0xffff00),
-       PIN_BANK_2BIT(11, 0x070, "gph"),
-       PIN_BANK_2BIT(13, 0x0d0, "gpj"),
-};
-
-struct samsung_pin_ctrl s3c2440_pin_ctrl[] = {
-       {
-               .pin_banks      = s3c2440_pin_banks,
-               .nr_banks       = ARRAY_SIZE(s3c2440_pin_banks),
-               .eint_wkup_init = s3c24xx_eint_init,
-               .label          = "S3C2440-GPIO",
-       },
-};
-
-static struct samsung_pin_bank s3c2450_pin_banks[] = {
-       PIN_BANK_A(28, 0x000, "gpa"),
-       PIN_BANK_2BIT(11, 0x010, "gpb"),
-       PIN_BANK_2BIT(16, 0x020, "gpc"),
-       PIN_BANK_2BIT(16, 0x030, "gpd"),
-       PIN_BANK_2BIT(16, 0x040, "gpe"),
-       PIN_BANK_2BIT_EINTW(8, 0x050, "gpf", 0, 0xff),
-       PIN_BANK_2BIT_EINTW(16, 0x060, "gpg", 8, 0xffff00),
-       PIN_BANK_2BIT(15, 0x070, "gph"),
-       PIN_BANK_2BIT(16, 0x0d0, "gpj"),
-       PIN_BANK_2BIT(16, 0x0e0, "gpk"),
-       PIN_BANK_2BIT(15, 0x0f0, "gpl"),
-       PIN_BANK_2BIT(2, 0x100, "gpm"),
-};
-
-struct samsung_pin_ctrl s3c2450_pin_ctrl[] = {
-       {
-               .pin_banks      = s3c2450_pin_banks,
-               .nr_banks       = ARRAY_SIZE(s3c2450_pin_banks),
-               .eint_wkup_init = s3c24xx_eint_init,
-               .label          = "S3C2450-GPIO",
-       },
-};
diff --git a/drivers/pinctrl/pinctrl-s3c64xx.c b/drivers/pinctrl/pinctrl-s3c64xx.c
deleted file mode 100644 (file)
index 89143c9..0000000
+++ /dev/null
@@ -1,816 +0,0 @@
-/*
- * S3C64xx specific support for pinctrl-samsung driver.
- *
- * Copyright (c) 2013 Tomasz Figa <tomasz.figa@gmail.com>
- *
- * Based on pinctrl-exynos.c, please see the file for original copyrights.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This file contains the Samsung S3C64xx specific information required by the
- * the Samsung pinctrl/gpiolib driver. It also includes the implementation of
- * external gpio and wakeup interrupt support.
- */
-
-#include <linux/module.h>
-#include <linux/device.h>
-#include <linux/interrupt.h>
-#include <linux/irqdomain.h>
-#include <linux/irq.h>
-#include <linux/of_irq.h>
-#include <linux/io.h>
-#include <linux/irqchip/chained_irq.h>
-#include <linux/slab.h>
-#include <linux/err.h>
-
-#include "pinctrl-samsung.h"
-
-#define NUM_EINT0              28
-#define NUM_EINT0_IRQ          4
-#define EINT_MAX_PER_REG       16
-#define EINT_MAX_PER_GROUP     16
-
-/* External GPIO and wakeup interrupt related definitions */
-#define SVC_GROUP_SHIFT                4
-#define SVC_GROUP_MASK         0xf
-#define SVC_NUM_MASK           0xf
-#define SVC_GROUP(x)           ((x >> SVC_GROUP_SHIFT) & \
-                                               SVC_GROUP_MASK)
-
-#define EINT12CON_REG          0x200
-#define EINT12MASK_REG         0x240
-#define EINT12PEND_REG         0x260
-
-#define EINT_OFFS(i)           ((i) % (2 * EINT_MAX_PER_GROUP))
-#define EINT_GROUP(i)          ((i) / EINT_MAX_PER_GROUP)
-#define EINT_REG(g)            (4 * ((g) / 2))
-
-#define EINTCON_REG(i)         (EINT12CON_REG + EINT_REG(EINT_GROUP(i)))
-#define EINTMASK_REG(i)                (EINT12MASK_REG + EINT_REG(EINT_GROUP(i)))
-#define EINTPEND_REG(i)                (EINT12PEND_REG + EINT_REG(EINT_GROUP(i)))
-
-#define SERVICE_REG            0x284
-#define SERVICEPEND_REG                0x288
-
-#define EINT0CON0_REG          0x900
-#define EINT0MASK_REG          0x920
-#define EINT0PEND_REG          0x924
-
-/* S3C64xx specific external interrupt trigger types */
-#define EINT_LEVEL_LOW         0
-#define EINT_LEVEL_HIGH                1
-#define EINT_EDGE_FALLING      2
-#define EINT_EDGE_RISING       4
-#define EINT_EDGE_BOTH         6
-#define EINT_CON_MASK          0xF
-#define EINT_CON_LEN           4
-
-static struct samsung_pin_bank_type bank_type_4bit_off = {
-       .fld_width = { 4, 1, 2, 0, 2, 2, },
-       .reg_offset = { 0x00, 0x04, 0x08, 0, 0x0c, 0x10, },
-};
-
-static struct samsung_pin_bank_type bank_type_4bit_alive = {
-       .fld_width = { 4, 1, 2, },
-       .reg_offset = { 0x00, 0x04, 0x08, },
-};
-
-static struct samsung_pin_bank_type bank_type_4bit2_off = {
-       .fld_width = { 4, 1, 2, 0, 2, 2, },
-       .reg_offset = { 0x00, 0x08, 0x0c, 0, 0x10, 0x14, },
-};
-
-static struct samsung_pin_bank_type bank_type_4bit2_alive = {
-       .fld_width = { 4, 1, 2, },
-       .reg_offset = { 0x00, 0x08, 0x0c, },
-};
-
-static struct samsung_pin_bank_type bank_type_2bit_off = {
-       .fld_width = { 2, 1, 2, 0, 2, 2, },
-       .reg_offset = { 0x00, 0x04, 0x08, 0, 0x0c, 0x10, },
-};
-
-static struct samsung_pin_bank_type bank_type_2bit_alive = {
-       .fld_width = { 2, 1, 2, },
-       .reg_offset = { 0x00, 0x04, 0x08, },
-};
-
-#define PIN_BANK_4BIT(pins, reg, id)                   \
-       {                                               \
-               .type           = &bank_type_4bit_off,  \
-               .pctl_offset    = reg,                  \
-               .nr_pins        = pins,                 \
-               .eint_type      = EINT_TYPE_NONE,       \
-               .name           = id                    \
-       }
-
-#define PIN_BANK_4BIT_EINTG(pins, reg, id, eoffs)      \
-       {                                               \
-               .type           = &bank_type_4bit_off,  \
-               .pctl_offset    = reg,                  \
-               .nr_pins        = pins,                 \
-               .eint_type      = EINT_TYPE_GPIO,       \
-               .eint_func      = 7,                    \
-               .eint_mask      = (1 << (pins)) - 1,    \
-               .eint_offset    = eoffs,                \
-               .name           = id                    \
-       }
-
-#define PIN_BANK_4BIT_EINTW(pins, reg, id, eoffs, emask) \
-       {                                               \
-               .type           = &bank_type_4bit_alive,\
-               .pctl_offset    = reg,                  \
-               .nr_pins        = pins,                 \
-               .eint_type      = EINT_TYPE_WKUP,       \
-               .eint_func      = 3,                    \
-               .eint_mask      = emask,                \
-               .eint_offset    = eoffs,                \
-               .name           = id                    \
-       }
-
-#define PIN_BANK_4BIT2_EINTG(pins, reg, id, eoffs)     \
-       {                                               \
-               .type           = &bank_type_4bit2_off, \
-               .pctl_offset    = reg,                  \
-               .nr_pins        = pins,                 \
-               .eint_type      = EINT_TYPE_GPIO,       \
-               .eint_func      = 7,                    \
-               .eint_mask      = (1 << (pins)) - 1,    \
-               .eint_offset    = eoffs,                \
-               .name           = id                    \
-       }
-
-#define PIN_BANK_4BIT2_EINTW(pins, reg, id, eoffs, emask) \
-       {                                               \
-               .type           = &bank_type_4bit2_alive,\
-               .pctl_offset    = reg,                  \
-               .nr_pins        = pins,                 \
-               .eint_type      = EINT_TYPE_WKUP,       \
-               .eint_func      = 3,                    \
-               .eint_mask      = emask,                \
-               .eint_offset    = eoffs,                \
-               .name           = id                    \
-       }
-
-#define PIN_BANK_4BIT2_ALIVE(pins, reg, id)            \
-       {                                               \
-               .type           = &bank_type_4bit2_alive,\
-               .pctl_offset    = reg,                  \
-               .nr_pins        = pins,                 \
-               .eint_type      = EINT_TYPE_NONE,       \
-               .name           = id                    \
-       }
-
-#define PIN_BANK_2BIT(pins, reg, id)                   \
-       {                                               \
-               .type           = &bank_type_2bit_off,  \
-               .pctl_offset    = reg,                  \
-               .nr_pins        = pins,                 \
-               .eint_type      = EINT_TYPE_NONE,       \
-               .name           = id                    \
-       }
-
-#define PIN_BANK_2BIT_EINTG(pins, reg, id, eoffs, emask) \
-       {                                               \
-               .type           = &bank_type_2bit_off,  \
-               .pctl_offset    = reg,                  \
-               .nr_pins        = pins,                 \
-               .eint_type      = EINT_TYPE_GPIO,       \
-               .eint_func      = 3,                    \
-               .eint_mask      = emask,                \
-               .eint_offset    = eoffs,                \
-               .name           = id                    \
-       }
-
-#define PIN_BANK_2BIT_EINTW(pins, reg, id, eoffs)      \
-       {                                               \
-               .type           = &bank_type_2bit_alive,\
-               .pctl_offset    = reg,                  \
-               .nr_pins        = pins,                 \
-               .eint_type      = EINT_TYPE_WKUP,       \
-               .eint_func      = 2,                    \
-               .eint_mask      = (1 << (pins)) - 1,    \
-               .eint_offset    = eoffs,                \
-               .name           = id                    \
-       }
-
-/**
- * struct s3c64xx_eint0_data: EINT0 common data
- * @drvdata: pin controller driver data
- * @domains: IRQ domains of particular EINT0 interrupts
- * @pins: pin offsets inside of banks of particular EINT0 interrupts
- */
-struct s3c64xx_eint0_data {
-       struct samsung_pinctrl_drv_data *drvdata;
-       struct irq_domain *domains[NUM_EINT0];
-       u8 pins[NUM_EINT0];
-};
-
-/**
- * struct s3c64xx_eint0_domain_data: EINT0 per-domain data
- * @bank: pin bank related to the domain
- * @eints: EINT0 interrupts related to the domain
- */
-struct s3c64xx_eint0_domain_data {
-       struct samsung_pin_bank *bank;
-       u8 eints[];
-};
-
-/**
- * struct s3c64xx_eint_gpio_data: GPIO EINT data
- * @drvdata: pin controller driver data
- * @domains: array of domains related to EINT interrupt groups
- */
-struct s3c64xx_eint_gpio_data {
-       struct samsung_pinctrl_drv_data *drvdata;
-       struct irq_domain *domains[];
-};
-
-/*
- * Common functions for S3C64xx EINT configuration
- */
-
-static int s3c64xx_irq_get_trigger(unsigned int type)
-{
-       int trigger;
-
-       switch (type) {
-       case IRQ_TYPE_EDGE_RISING:
-               trigger = EINT_EDGE_RISING;
-               break;
-       case IRQ_TYPE_EDGE_FALLING:
-               trigger = EINT_EDGE_FALLING;
-               break;
-       case IRQ_TYPE_EDGE_BOTH:
-               trigger = EINT_EDGE_BOTH;
-               break;
-       case IRQ_TYPE_LEVEL_HIGH:
-               trigger = EINT_LEVEL_HIGH;
-               break;
-       case IRQ_TYPE_LEVEL_LOW:
-               trigger = EINT_LEVEL_LOW;
-               break;
-       default:
-               return -EINVAL;
-       }
-
-       return trigger;
-}
-
-static void s3c64xx_irq_set_handler(unsigned int irq, unsigned int type)
-{
-       /* Edge- and level-triggered interrupts need different handlers */
-       if (type & IRQ_TYPE_EDGE_BOTH)
-               __irq_set_handler_locked(irq, handle_edge_irq);
-       else
-               __irq_set_handler_locked(irq, handle_level_irq);
-}
-
-static void s3c64xx_irq_set_function(struct samsung_pinctrl_drv_data *d,
-                                       struct samsung_pin_bank *bank, int pin)
-{
-       struct samsung_pin_bank_type *bank_type = bank->type;
-       unsigned long flags;
-       void __iomem *reg;
-       u8 shift;
-       u32 mask;
-       u32 val;
-
-       /* Make sure that pin is configured as interrupt */
-       reg = d->virt_base + bank->pctl_offset;
-       shift = pin;
-       if (bank_type->fld_width[PINCFG_TYPE_FUNC] * shift >= 32) {
-               /* 4-bit bank type with 2 con regs */
-               reg += 4;
-               shift -= 8;
-       }
-
-       shift = shift * bank_type->fld_width[PINCFG_TYPE_FUNC];
-       mask = (1 << bank_type->fld_width[PINCFG_TYPE_FUNC]) - 1;
-
-       spin_lock_irqsave(&bank->slock, flags);
-
-       val = readl(reg);
-       val &= ~(mask << shift);
-       val |= bank->eint_func << shift;
-       writel(val, reg);
-
-       spin_unlock_irqrestore(&bank->slock, flags);
-}
-
-/*
- * Functions for EINT GPIO configuration (EINT groups 1-9)
- */
-
-static inline void s3c64xx_gpio_irq_set_mask(struct irq_data *irqd, bool mask)
-{
-       struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
-       struct samsung_pinctrl_drv_data *d = bank->drvdata;
-       unsigned char index = EINT_OFFS(bank->eint_offset) + irqd->hwirq;
-       void __iomem *reg = d->virt_base + EINTMASK_REG(bank->eint_offset);
-       u32 val;
-
-       val = readl(reg);
-       if (mask)
-               val |= 1 << index;
-       else
-               val &= ~(1 << index);
-       writel(val, reg);
-}
-
-static void s3c64xx_gpio_irq_unmask(struct irq_data *irqd)
-{
-       s3c64xx_gpio_irq_set_mask(irqd, false);
-}
-
-static void s3c64xx_gpio_irq_mask(struct irq_data *irqd)
-{
-       s3c64xx_gpio_irq_set_mask(irqd, true);
-}
-
-static void s3c64xx_gpio_irq_ack(struct irq_data *irqd)
-{
-       struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
-       struct samsung_pinctrl_drv_data *d = bank->drvdata;
-       unsigned char index = EINT_OFFS(bank->eint_offset) + irqd->hwirq;
-       void __iomem *reg = d->virt_base + EINTPEND_REG(bank->eint_offset);
-
-       writel(1 << index, reg);
-}
-
-static int s3c64xx_gpio_irq_set_type(struct irq_data *irqd, unsigned int type)
-{
-       struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
-       struct samsung_pinctrl_drv_data *d = bank->drvdata;
-       void __iomem *reg;
-       int trigger;
-       u8 shift;
-       u32 val;
-
-       trigger = s3c64xx_irq_get_trigger(type);
-       if (trigger < 0) {
-               pr_err("unsupported external interrupt type\n");
-               return -EINVAL;
-       }
-
-       s3c64xx_irq_set_handler(irqd->irq, type);
-
-       /* Set up interrupt trigger */
-       reg = d->virt_base + EINTCON_REG(bank->eint_offset);
-       shift = EINT_OFFS(bank->eint_offset) + irqd->hwirq;
-       shift = 4 * (shift / 4); /* 4 EINTs per trigger selector */
-
-       val = readl(reg);
-       val &= ~(EINT_CON_MASK << shift);
-       val |= trigger << shift;
-       writel(val, reg);
-
-       s3c64xx_irq_set_function(d, bank, irqd->hwirq);
-
-       return 0;
-}
-
-/*
- * irq_chip for gpio interrupts.
- */
-static struct irq_chip s3c64xx_gpio_irq_chip = {
-       .name           = "GPIO",
-       .irq_unmask     = s3c64xx_gpio_irq_unmask,
-       .irq_mask       = s3c64xx_gpio_irq_mask,
-       .irq_ack        = s3c64xx_gpio_irq_ack,
-       .irq_set_type   = s3c64xx_gpio_irq_set_type,
-};
-
-static int s3c64xx_gpio_irq_map(struct irq_domain *h, unsigned int virq,
-                                       irq_hw_number_t hw)
-{
-       struct samsung_pin_bank *bank = h->host_data;
-
-       if (!(bank->eint_mask & (1 << hw)))
-               return -EINVAL;
-
-       irq_set_chip_and_handler(virq,
-                               &s3c64xx_gpio_irq_chip, handle_level_irq);
-       irq_set_chip_data(virq, bank);
-       set_irq_flags(virq, IRQF_VALID);
-
-       return 0;
-}
-
-/*
- * irq domain callbacks for external gpio interrupt controller.
- */
-static const struct irq_domain_ops s3c64xx_gpio_irqd_ops = {
-       .map    = s3c64xx_gpio_irq_map,
-       .xlate  = irq_domain_xlate_twocell,
-};
-
-static void s3c64xx_eint_gpio_irq(unsigned int irq, struct irq_desc *desc)
-{
-       struct irq_chip *chip = irq_get_chip(irq);
-       struct s3c64xx_eint_gpio_data *data = irq_get_handler_data(irq);
-       struct samsung_pinctrl_drv_data *drvdata = data->drvdata;
-
-       chained_irq_enter(chip, desc);
-
-       do {
-               unsigned int svc;
-               unsigned int group;
-               unsigned int pin;
-               unsigned int virq;
-
-               svc = readl(drvdata->virt_base + SERVICE_REG);
-               group = SVC_GROUP(svc);
-               pin = svc & SVC_NUM_MASK;
-
-               if (!group)
-                       break;
-
-               /* Group 1 is used for two pin banks */
-               if (group == 1) {
-                       if (pin < 8)
-                               group = 0;
-                       else
-                               pin -= 8;
-               }
-
-               virq = irq_linear_revmap(data->domains[group], pin);
-               /*
-                * Something must be really wrong if an unmapped EINT
-                * was unmasked...
-                */
-               BUG_ON(!virq);
-
-               generic_handle_irq(virq);
-       } while (1);
-
-       chained_irq_exit(chip, desc);
-}
-
-/**
- * s3c64xx_eint_gpio_init() - setup handling of external gpio interrupts.
- * @d: driver data of samsung pinctrl driver.
- */
-static int s3c64xx_eint_gpio_init(struct samsung_pinctrl_drv_data *d)
-{
-       struct s3c64xx_eint_gpio_data *data;
-       struct samsung_pin_bank *bank;
-       struct device *dev = d->dev;
-       unsigned int nr_domains;
-       unsigned int i;
-
-       if (!d->irq) {
-               dev_err(dev, "irq number not available\n");
-               return -EINVAL;
-       }
-
-       nr_domains = 0;
-       bank = d->ctrl->pin_banks;
-       for (i = 0; i < d->ctrl->nr_banks; ++i, ++bank) {
-               unsigned int nr_eints;
-               unsigned int mask;
-
-               if (bank->eint_type != EINT_TYPE_GPIO)
-                       continue;
-
-               mask = bank->eint_mask;
-               nr_eints = fls(mask);
-
-               bank->irq_domain = irq_domain_add_linear(bank->of_node,
-                                       nr_eints, &s3c64xx_gpio_irqd_ops, bank);
-               if (!bank->irq_domain) {
-                       dev_err(dev, "gpio irq domain add failed\n");
-                       return -ENXIO;
-               }
-
-               ++nr_domains;
-       }
-
-       data = devm_kzalloc(dev, sizeof(*data)
-                       + nr_domains * sizeof(*data->domains), GFP_KERNEL);
-       if (!data) {
-               dev_err(dev, "failed to allocate handler data\n");
-               return -ENOMEM;
-       }
-       data->drvdata = d;
-
-       bank = d->ctrl->pin_banks;
-       nr_domains = 0;
-       for (i = 0; i < d->ctrl->nr_banks; ++i, ++bank) {
-               if (bank->eint_type != EINT_TYPE_GPIO)
-                       continue;
-
-               data->domains[nr_domains++] = bank->irq_domain;
-       }
-
-       irq_set_chained_handler(d->irq, s3c64xx_eint_gpio_irq);
-       irq_set_handler_data(d->irq, data);
-
-       return 0;
-}
-
-/*
- * Functions for configuration of EINT0 wake-up interrupts
- */
-
-static inline void s3c64xx_eint0_irq_set_mask(struct irq_data *irqd, bool mask)
-{
-       struct s3c64xx_eint0_domain_data *ddata =
-                                       irq_data_get_irq_chip_data(irqd);
-       struct samsung_pinctrl_drv_data *d = ddata->bank->drvdata;
-       u32 val;
-
-       val = readl(d->virt_base + EINT0MASK_REG);
-       if (mask)
-               val |= 1 << ddata->eints[irqd->hwirq];
-       else
-               val &= ~(1 << ddata->eints[irqd->hwirq]);
-       writel(val, d->virt_base + EINT0MASK_REG);
-}
-
-static void s3c64xx_eint0_irq_unmask(struct irq_data *irqd)
-{
-       s3c64xx_eint0_irq_set_mask(irqd, false);
-}
-
-static void s3c64xx_eint0_irq_mask(struct irq_data *irqd)
-{
-       s3c64xx_eint0_irq_set_mask(irqd, true);
-}
-
-static void s3c64xx_eint0_irq_ack(struct irq_data *irqd)
-{
-       struct s3c64xx_eint0_domain_data *ddata =
-                                       irq_data_get_irq_chip_data(irqd);
-       struct samsung_pinctrl_drv_data *d = ddata->bank->drvdata;
-
-       writel(1 << ddata->eints[irqd->hwirq],
-                                       d->virt_base + EINT0PEND_REG);
-}
-
-static int s3c64xx_eint0_irq_set_type(struct irq_data *irqd, unsigned int type)
-{
-       struct s3c64xx_eint0_domain_data *ddata =
-                                       irq_data_get_irq_chip_data(irqd);
-       struct samsung_pin_bank *bank = ddata->bank;
-       struct samsung_pinctrl_drv_data *d = bank->drvdata;
-       void __iomem *reg;
-       int trigger;
-       u8 shift;
-       u32 val;
-
-       trigger = s3c64xx_irq_get_trigger(type);
-       if (trigger < 0) {
-               pr_err("unsupported external interrupt type\n");
-               return -EINVAL;
-       }
-
-       s3c64xx_irq_set_handler(irqd->irq, type);
-
-       /* Set up interrupt trigger */
-       reg = d->virt_base + EINT0CON0_REG;
-       shift = ddata->eints[irqd->hwirq];
-       if (shift >= EINT_MAX_PER_REG) {
-               reg += 4;
-               shift -= EINT_MAX_PER_REG;
-       }
-       shift = EINT_CON_LEN * (shift / 2);
-
-       val = readl(reg);
-       val &= ~(EINT_CON_MASK << shift);
-       val |= trigger << shift;
-       writel(val, reg);
-
-       s3c64xx_irq_set_function(d, bank, irqd->hwirq);
-
-       return 0;
-}
-
-/*
- * irq_chip for wakeup interrupts
- */
-static struct irq_chip s3c64xx_eint0_irq_chip = {
-       .name           = "EINT0",
-       .irq_unmask     = s3c64xx_eint0_irq_unmask,
-       .irq_mask       = s3c64xx_eint0_irq_mask,
-       .irq_ack        = s3c64xx_eint0_irq_ack,
-       .irq_set_type   = s3c64xx_eint0_irq_set_type,
-};
-
-static inline void s3c64xx_irq_demux_eint(unsigned int irq,
-                                       struct irq_desc *desc, u32 range)
-{
-       struct irq_chip *chip = irq_get_chip(irq);
-       struct s3c64xx_eint0_data *data = irq_get_handler_data(irq);
-       struct samsung_pinctrl_drv_data *drvdata = data->drvdata;
-       unsigned int pend, mask;
-
-       chained_irq_enter(chip, desc);
-
-       pend = readl(drvdata->virt_base + EINT0PEND_REG);
-       mask = readl(drvdata->virt_base + EINT0MASK_REG);
-
-       pend = pend & range & ~mask;
-       pend &= range;
-
-       while (pend) {
-               unsigned int virq;
-
-               irq = fls(pend) - 1;
-               pend &= ~(1 << irq);
-
-               virq = irq_linear_revmap(data->domains[irq], data->pins[irq]);
-               /*
-                * Something must be really wrong if an unmapped EINT
-                * was unmasked...
-                */
-               BUG_ON(!virq);
-
-               generic_handle_irq(virq);
-       }
-
-       chained_irq_exit(chip, desc);
-}
-
-static void s3c64xx_demux_eint0_3(unsigned int irq, struct irq_desc *desc)
-{
-       s3c64xx_irq_demux_eint(irq, desc, 0xf);
-}
-
-static void s3c64xx_demux_eint4_11(unsigned int irq, struct irq_desc *desc)
-{
-       s3c64xx_irq_demux_eint(irq, desc, 0xff0);
-}
-
-static void s3c64xx_demux_eint12_19(unsigned int irq, struct irq_desc *desc)
-{
-       s3c64xx_irq_demux_eint(irq, desc, 0xff000);
-}
-
-static void s3c64xx_demux_eint20_27(unsigned int irq, struct irq_desc *desc)
-{
-       s3c64xx_irq_demux_eint(irq, desc, 0xff00000);
-}
-
-static irq_flow_handler_t s3c64xx_eint0_handlers[NUM_EINT0_IRQ] = {
-       s3c64xx_demux_eint0_3,
-       s3c64xx_demux_eint4_11,
-       s3c64xx_demux_eint12_19,
-       s3c64xx_demux_eint20_27,
-};
-
-static int s3c64xx_eint0_irq_map(struct irq_domain *h, unsigned int virq,
-                                       irq_hw_number_t hw)
-{
-       struct s3c64xx_eint0_domain_data *ddata = h->host_data;
-       struct samsung_pin_bank *bank = ddata->bank;
-
-       if (!(bank->eint_mask & (1 << hw)))
-               return -EINVAL;
-
-       irq_set_chip_and_handler(virq,
-                               &s3c64xx_eint0_irq_chip, handle_level_irq);
-       irq_set_chip_data(virq, ddata);
-       set_irq_flags(virq, IRQF_VALID);
-
-       return 0;
-}
-
-/*
- * irq domain callbacks for external wakeup interrupt controller.
- */
-static const struct irq_domain_ops s3c64xx_eint0_irqd_ops = {
-       .map    = s3c64xx_eint0_irq_map,
-       .xlate  = irq_domain_xlate_twocell,
-};
-
-/* list of external wakeup controllers supported */
-static const struct of_device_id s3c64xx_eint0_irq_ids[] = {
-       { .compatible = "samsung,s3c64xx-wakeup-eint", },
-       { }
-};
-
-/**
- * s3c64xx_eint_eint0_init() - setup handling of external wakeup interrupts.
- * @d: driver data of samsung pinctrl driver.
- */
-static int s3c64xx_eint_eint0_init(struct samsung_pinctrl_drv_data *d)
-{
-       struct device *dev = d->dev;
-       struct device_node *eint0_np = NULL;
-       struct device_node *np;
-       struct samsung_pin_bank *bank;
-       struct s3c64xx_eint0_data *data;
-       unsigned int i;
-
-       for_each_child_of_node(dev->of_node, np) {
-               if (of_match_node(s3c64xx_eint0_irq_ids, np)) {
-                       eint0_np = np;
-                       break;
-               }
-       }
-       if (!eint0_np)
-               return -ENODEV;
-
-       data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
-       if (!data) {
-               dev_err(dev, "could not allocate memory for wkup eint data\n");
-               return -ENOMEM;
-       }
-       data->drvdata = d;
-
-       for (i = 0; i < NUM_EINT0_IRQ; ++i) {
-               unsigned int irq;
-
-               irq = irq_of_parse_and_map(eint0_np, i);
-               if (!irq) {
-                       dev_err(dev, "failed to get wakeup EINT IRQ %d\n", i);
-                       return -ENXIO;
-               }
-
-               irq_set_chained_handler(irq, s3c64xx_eint0_handlers[i]);
-               irq_set_handler_data(irq, data);
-       }
-
-       bank = d->ctrl->pin_banks;
-       for (i = 0; i < d->ctrl->nr_banks; ++i, ++bank) {
-               struct s3c64xx_eint0_domain_data *ddata;
-               unsigned int nr_eints;
-               unsigned int mask;
-               unsigned int irq;
-               unsigned int pin;
-
-               if (bank->eint_type != EINT_TYPE_WKUP)
-                       continue;
-
-               mask = bank->eint_mask;
-               nr_eints = fls(mask);
-
-               ddata = devm_kzalloc(dev,
-                               sizeof(*ddata) + nr_eints, GFP_KERNEL);
-               if (!ddata) {
-                       dev_err(dev, "failed to allocate domain data\n");
-                       return -ENOMEM;
-               }
-               ddata->bank = bank;
-
-               bank->irq_domain = irq_domain_add_linear(bank->of_node,
-                               nr_eints, &s3c64xx_eint0_irqd_ops, ddata);
-               if (!bank->irq_domain) {
-                       dev_err(dev, "wkup irq domain add failed\n");
-                       return -ENXIO;
-               }
-
-               irq = bank->eint_offset;
-               mask = bank->eint_mask;
-               for (pin = 0; mask; ++pin, mask >>= 1) {
-                       if (!(mask & 1))
-                               continue;
-                       data->domains[irq] = bank->irq_domain;
-                       data->pins[irq] = pin;
-                       ddata->eints[pin] = irq;
-                       ++irq;
-               }
-       }
-
-       return 0;
-}
-
-/* pin banks of s3c64xx pin-controller 0 */
-static struct samsung_pin_bank s3c64xx_pin_banks0[] = {
-       PIN_BANK_4BIT_EINTG(8, 0x000, "gpa", 0),
-       PIN_BANK_4BIT_EINTG(7, 0x020, "gpb", 8),
-       PIN_BANK_4BIT_EINTG(8, 0x040, "gpc", 16),
-       PIN_BANK_4BIT_EINTG(5, 0x060, "gpd", 32),
-       PIN_BANK_4BIT(5, 0x080, "gpe"),
-       PIN_BANK_2BIT_EINTG(16, 0x0a0, "gpf", 48, 0x3fff),
-       PIN_BANK_4BIT_EINTG(7, 0x0c0, "gpg", 64),
-       PIN_BANK_4BIT2_EINTG(10, 0x0e0, "gph", 80),
-       PIN_BANK_2BIT(16, 0x100, "gpi"),
-       PIN_BANK_2BIT(12, 0x120, "gpj"),
-       PIN_BANK_4BIT2_ALIVE(16, 0x800, "gpk"),
-       PIN_BANK_4BIT2_EINTW(15, 0x810, "gpl", 16, 0x7f00),
-       PIN_BANK_4BIT_EINTW(6, 0x820, "gpm", 23, 0x1f),
-       PIN_BANK_2BIT_EINTW(16, 0x830, "gpn", 0),
-       PIN_BANK_2BIT_EINTG(16, 0x140, "gpo", 96, 0xffff),
-       PIN_BANK_2BIT_EINTG(15, 0x160, "gpp", 112, 0x7fff),
-       PIN_BANK_2BIT_EINTG(9, 0x180, "gpq", 128, 0x1ff),
-};
-
-/*
- * Samsung pinctrl driver data for S3C64xx SoC. S3C64xx SoC includes
- * one gpio/pin-mux/pinconfig controller.
- */
-struct samsung_pin_ctrl s3c64xx_pin_ctrl[] = {
-       {
-               /* pin-controller instance 1 data */
-               .pin_banks      = s3c64xx_pin_banks0,
-               .nr_banks       = ARRAY_SIZE(s3c64xx_pin_banks0),
-               .eint_gpio_init = s3c64xx_eint_gpio_init,
-               .eint_wkup_init = s3c64xx_eint_eint0_init,
-               .label          = "S3C64xx-GPIO",
-       },
-};
diff --git a/drivers/pinctrl/pinctrl-samsung.c b/drivers/pinctrl/pinctrl-samsung.c
deleted file mode 100644 (file)
index 3e61d0f..0000000
+++ /dev/null
@@ -1,1181 +0,0 @@
-/*
- * pin-controller/pin-mux/pin-config/gpio-driver for Samsung's SoC's.
- *
- * Copyright (c) 2012 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- * Copyright (c) 2012 Linaro Ltd
- *             http://www.linaro.org
- *
- * Author: Thomas Abraham <thomas.ab@samsung.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This driver implements the Samsung pinctrl driver. It supports setting up of
- * pinmux and pinconf configurations. The gpiolib interface is also included.
- * External interrupt (gpio and wakeup) support are not included in this driver
- * but provides extensions to which platform specific implementation of the gpio
- * and wakeup interrupts can be hooked to.
- */
-
-#include <linux/module.h>
-#include <linux/platform_device.h>
-#include <linux/io.h>
-#include <linux/slab.h>
-#include <linux/err.h>
-#include <linux/gpio.h>
-#include <linux/irqdomain.h>
-#include <linux/spinlock.h>
-#include <linux/syscore_ops.h>
-
-#include "core.h"
-#include "pinctrl-samsung.h"
-
-#define GROUP_SUFFIX           "-grp"
-#define GSUFFIX_LEN            sizeof(GROUP_SUFFIX)
-#define FUNCTION_SUFFIX                "-mux"
-#define FSUFFIX_LEN            sizeof(FUNCTION_SUFFIX)
-
-/* list of all possible config options supported */
-static struct pin_config {
-       char            *prop_cfg;
-       unsigned int    cfg_type;
-} pcfgs[] = {
-       { "samsung,pin-pud", PINCFG_TYPE_PUD },
-       { "samsung,pin-drv", PINCFG_TYPE_DRV },
-       { "samsung,pin-con-pdn", PINCFG_TYPE_CON_PDN },
-       { "samsung,pin-pud-pdn", PINCFG_TYPE_PUD_PDN },
-};
-
-/* Global list of devices (struct samsung_pinctrl_drv_data) */
-static LIST_HEAD(drvdata_list);
-
-static unsigned int pin_base;
-
-static inline struct samsung_pin_bank *gc_to_pin_bank(struct gpio_chip *gc)
-{
-       return container_of(gc, struct samsung_pin_bank, gpio_chip);
-}
-
-/* check if the selector is a valid pin group selector */
-static int samsung_get_group_count(struct pinctrl_dev *pctldev)
-{
-       struct samsung_pinctrl_drv_data *drvdata;
-
-       drvdata = pinctrl_dev_get_drvdata(pctldev);
-       return drvdata->nr_groups;
-}
-
-/* return the name of the group selected by the group selector */
-static const char *samsung_get_group_name(struct pinctrl_dev *pctldev,
-                                               unsigned selector)
-{
-       struct samsung_pinctrl_drv_data *drvdata;
-
-       drvdata = pinctrl_dev_get_drvdata(pctldev);
-       return drvdata->pin_groups[selector].name;
-}
-
-/* return the pin numbers associated with the specified group */
-static int samsung_get_group_pins(struct pinctrl_dev *pctldev,
-               unsigned selector, const unsigned **pins, unsigned *num_pins)
-{
-       struct samsung_pinctrl_drv_data *drvdata;
-
-       drvdata = pinctrl_dev_get_drvdata(pctldev);
-       *pins = drvdata->pin_groups[selector].pins;
-       *num_pins = drvdata->pin_groups[selector].num_pins;
-       return 0;
-}
-
-/* create pinctrl_map entries by parsing device tree nodes */
-static int samsung_dt_node_to_map(struct pinctrl_dev *pctldev,
-                       struct device_node *np, struct pinctrl_map **maps,
-                       unsigned *nmaps)
-{
-       struct device *dev = pctldev->dev;
-       struct pinctrl_map *map;
-       unsigned long *cfg = NULL;
-       char *gname, *fname;
-       int cfg_cnt = 0, map_cnt = 0, idx = 0;
-
-       /* count the number of config options specfied in the node */
-       for (idx = 0; idx < ARRAY_SIZE(pcfgs); idx++) {
-               if (of_find_property(np, pcfgs[idx].prop_cfg, NULL))
-                       cfg_cnt++;
-       }
-
-       /*
-        * Find out the number of map entries to create. All the config options
-        * can be accomadated into a single config map entry.
-        */
-       if (cfg_cnt)
-               map_cnt = 1;
-       if (of_find_property(np, "samsung,pin-function", NULL))
-               map_cnt++;
-       if (!map_cnt) {
-               dev_err(dev, "node %s does not have either config or function "
-                               "configurations\n", np->name);
-               return -EINVAL;
-       }
-
-       /* Allocate memory for pin-map entries */
-       map = kzalloc(sizeof(*map) * map_cnt, GFP_KERNEL);
-       if (!map) {
-               dev_err(dev, "could not alloc memory for pin-maps\n");
-               return -ENOMEM;
-       }
-       *nmaps = 0;
-
-       /*
-        * Allocate memory for pin group name. The pin group name is derived
-        * from the node name from which these map entries are be created.
-        */
-       gname = kzalloc(strlen(np->name) + GSUFFIX_LEN, GFP_KERNEL);
-       if (!gname) {
-               dev_err(dev, "failed to alloc memory for group name\n");
-               goto free_map;
-       }
-       sprintf(gname, "%s%s", np->name, GROUP_SUFFIX);
-
-       /*
-        * don't have config options? then skip over to creating function
-        * map entries.
-        */
-       if (!cfg_cnt)
-               goto skip_cfgs;
-
-       /* Allocate memory for config entries */
-       cfg = kzalloc(sizeof(*cfg) * cfg_cnt, GFP_KERNEL);
-       if (!cfg) {
-               dev_err(dev, "failed to alloc memory for configs\n");
-               goto free_gname;
-       }
-
-       /* Prepare a list of config settings */
-       for (idx = 0, cfg_cnt = 0; idx < ARRAY_SIZE(pcfgs); idx++) {
-               u32 value;
-               if (!of_property_read_u32(np, pcfgs[idx].prop_cfg, &value))
-                       cfg[cfg_cnt++] =
-                               PINCFG_PACK(pcfgs[idx].cfg_type, value);
-       }
-
-       /* create the config map entry */
-       map[*nmaps].data.configs.group_or_pin = gname;
-       map[*nmaps].data.configs.configs = cfg;
-       map[*nmaps].data.configs.num_configs = cfg_cnt;
-       map[*nmaps].type = PIN_MAP_TYPE_CONFIGS_GROUP;
-       *nmaps += 1;
-
-skip_cfgs:
-       /* create the function map entry */
-       if (of_find_property(np, "samsung,pin-function", NULL)) {
-               fname = kzalloc(strlen(np->name) + FSUFFIX_LEN, GFP_KERNEL);
-               if (!fname) {
-                       dev_err(dev, "failed to alloc memory for func name\n");
-                       goto free_cfg;
-               }
-               sprintf(fname, "%s%s", np->name, FUNCTION_SUFFIX);
-
-               map[*nmaps].data.mux.group = gname;
-               map[*nmaps].data.mux.function = fname;
-               map[*nmaps].type = PIN_MAP_TYPE_MUX_GROUP;
-               *nmaps += 1;
-       }
-
-       *maps = map;
-       return 0;
-
-free_cfg:
-       kfree(cfg);
-free_gname:
-       kfree(gname);
-free_map:
-       kfree(map);
-       return -ENOMEM;
-}
-
-/* free the memory allocated to hold the pin-map table */
-static void samsung_dt_free_map(struct pinctrl_dev *pctldev,
-                            struct pinctrl_map *map, unsigned num_maps)
-{
-       int idx;
-
-       for (idx = 0; idx < num_maps; idx++) {
-               if (map[idx].type == PIN_MAP_TYPE_MUX_GROUP) {
-                       kfree(map[idx].data.mux.function);
-                       if (!idx)
-                               kfree(map[idx].data.mux.group);
-               } else if (map->type == PIN_MAP_TYPE_CONFIGS_GROUP) {
-                       kfree(map[idx].data.configs.configs);
-                       if (!idx)
-                               kfree(map[idx].data.configs.group_or_pin);
-               }
-       };
-
-       kfree(map);
-}
-
-/* list of pinctrl callbacks for the pinctrl core */
-static const struct pinctrl_ops samsung_pctrl_ops = {
-       .get_groups_count       = samsung_get_group_count,
-       .get_group_name         = samsung_get_group_name,
-       .get_group_pins         = samsung_get_group_pins,
-       .dt_node_to_map         = samsung_dt_node_to_map,
-       .dt_free_map            = samsung_dt_free_map,
-};
-
-/* check if the selector is a valid pin function selector */
-static int samsung_get_functions_count(struct pinctrl_dev *pctldev)
-{
-       struct samsung_pinctrl_drv_data *drvdata;
-
-       drvdata = pinctrl_dev_get_drvdata(pctldev);
-       return drvdata->nr_functions;
-}
-
-/* return the name of the pin function specified */
-static const char *samsung_pinmux_get_fname(struct pinctrl_dev *pctldev,
-                                               unsigned selector)
-{
-       struct samsung_pinctrl_drv_data *drvdata;
-
-       drvdata = pinctrl_dev_get_drvdata(pctldev);
-       return drvdata->pmx_functions[selector].name;
-}
-
-/* return the groups associated for the specified function selector */
-static int samsung_pinmux_get_groups(struct pinctrl_dev *pctldev,
-               unsigned selector, const char * const **groups,
-               unsigned * const num_groups)
-{
-       struct samsung_pinctrl_drv_data *drvdata;
-
-       drvdata = pinctrl_dev_get_drvdata(pctldev);
-       *groups = drvdata->pmx_functions[selector].groups;
-       *num_groups = drvdata->pmx_functions[selector].num_groups;
-       return 0;
-}
-
-/*
- * given a pin number that is local to a pin controller, find out the pin bank
- * and the register base of the pin bank.
- */
-static void pin_to_reg_bank(struct samsung_pinctrl_drv_data *drvdata,
-                       unsigned pin, void __iomem **reg, u32 *offset,
-                       struct samsung_pin_bank **bank)
-{
-       struct samsung_pin_bank *b;
-
-       b = drvdata->ctrl->pin_banks;
-
-       while ((pin >= b->pin_base) &&
-                       ((b->pin_base + b->nr_pins - 1) < pin))
-               b++;
-
-       *reg = drvdata->virt_base + b->pctl_offset;
-       *offset = pin - b->pin_base;
-       if (bank)
-               *bank = b;
-}
-
-/* enable or disable a pinmux function */
-static void samsung_pinmux_setup(struct pinctrl_dev *pctldev, unsigned selector,
-                                       unsigned group, bool enable)
-{
-       struct samsung_pinctrl_drv_data *drvdata;
-       const unsigned int *pins;
-       struct samsung_pin_bank *bank;
-       void __iomem *reg;
-       u32 mask, shift, data, pin_offset, cnt;
-       unsigned long flags;
-
-       drvdata = pinctrl_dev_get_drvdata(pctldev);
-       pins = drvdata->pin_groups[group].pins;
-
-       /*
-        * for each pin in the pin group selected, program the correspoding pin
-        * pin function number in the config register.
-        */
-       for (cnt = 0; cnt < drvdata->pin_groups[group].num_pins; cnt++) {
-               struct samsung_pin_bank_type *type;
-
-               pin_to_reg_bank(drvdata, pins[cnt] - drvdata->ctrl->base,
-                               &reg, &pin_offset, &bank);
-               type = bank->type;
-               mask = (1 << type->fld_width[PINCFG_TYPE_FUNC]) - 1;
-               shift = pin_offset * type->fld_width[PINCFG_TYPE_FUNC];
-               if (shift >= 32) {
-                       /* Some banks have two config registers */
-                       shift -= 32;
-                       reg += 4;
-               }
-
-               spin_lock_irqsave(&bank->slock, flags);
-
-               data = readl(reg + type->reg_offset[PINCFG_TYPE_FUNC]);
-               data &= ~(mask << shift);
-               if (enable)
-                       data |= drvdata->pin_groups[group].func << shift;
-               writel(data, reg + type->reg_offset[PINCFG_TYPE_FUNC]);
-
-               spin_unlock_irqrestore(&bank->slock, flags);
-       }
-}
-
-/* enable a specified pinmux by writing to registers */
-static int samsung_pinmux_enable(struct pinctrl_dev *pctldev, unsigned selector,
-                                       unsigned group)
-{
-       samsung_pinmux_setup(pctldev, selector, group, true);
-       return 0;
-}
-
-/* disable a specified pinmux by writing to registers */
-static void samsung_pinmux_disable(struct pinctrl_dev *pctldev,
-                                       unsigned selector, unsigned group)
-{
-       samsung_pinmux_setup(pctldev, selector, group, false);
-}
-
-/*
- * The calls to gpio_direction_output() and gpio_direction_input()
- * leads to this function call (via the pinctrl_gpio_direction_{input|output}()
- * function called from the gpiolib interface).
- */
-static int samsung_pinmux_gpio_set_direction(struct pinctrl_dev *pctldev,
-               struct pinctrl_gpio_range *range, unsigned offset, bool input)
-{
-       struct samsung_pin_bank_type *type;
-       struct samsung_pin_bank *bank;
-       struct samsung_pinctrl_drv_data *drvdata;
-       void __iomem *reg;
-       u32 data, pin_offset, mask, shift;
-       unsigned long flags;
-
-       bank = gc_to_pin_bank(range->gc);
-       type = bank->type;
-       drvdata = pinctrl_dev_get_drvdata(pctldev);
-
-       pin_offset = offset - bank->pin_base;
-       reg = drvdata->virt_base + bank->pctl_offset +
-                                       type->reg_offset[PINCFG_TYPE_FUNC];
-
-       mask = (1 << type->fld_width[PINCFG_TYPE_FUNC]) - 1;
-       shift = pin_offset * type->fld_width[PINCFG_TYPE_FUNC];
-       if (shift >= 32) {
-               /* Some banks have two config registers */
-               shift -= 32;
-               reg += 4;
-       }
-
-       spin_lock_irqsave(&bank->slock, flags);
-
-       data = readl(reg);
-       data &= ~(mask << shift);
-       if (!input)
-               data |= FUNC_OUTPUT << shift;
-       writel(data, reg);
-
-       spin_unlock_irqrestore(&bank->slock, flags);
-
-       return 0;
-}
-
-/* list of pinmux callbacks for the pinmux vertical in pinctrl core */
-static const struct pinmux_ops samsung_pinmux_ops = {
-       .get_functions_count    = samsung_get_functions_count,
-       .get_function_name      = samsung_pinmux_get_fname,
-       .get_function_groups    = samsung_pinmux_get_groups,
-       .enable                 = samsung_pinmux_enable,
-       .disable                = samsung_pinmux_disable,
-       .gpio_set_direction     = samsung_pinmux_gpio_set_direction,
-};
-
-/* set or get the pin config settings for a specified pin */
-static int samsung_pinconf_rw(struct pinctrl_dev *pctldev, unsigned int pin,
-                               unsigned long *config, bool set)
-{
-       struct samsung_pinctrl_drv_data *drvdata;
-       struct samsung_pin_bank_type *type;
-       struct samsung_pin_bank *bank;
-       void __iomem *reg_base;
-       enum pincfg_type cfg_type = PINCFG_UNPACK_TYPE(*config);
-       u32 data, width, pin_offset, mask, shift;
-       u32 cfg_value, cfg_reg;
-       unsigned long flags;
-
-       drvdata = pinctrl_dev_get_drvdata(pctldev);
-       pin_to_reg_bank(drvdata, pin - drvdata->ctrl->base, &reg_base,
-                                       &pin_offset, &bank);
-       type = bank->type;
-
-       if (cfg_type >= PINCFG_TYPE_NUM || !type->fld_width[cfg_type])
-               return -EINVAL;
-
-       width = type->fld_width[cfg_type];
-       cfg_reg = type->reg_offset[cfg_type];
-
-       spin_lock_irqsave(&bank->slock, flags);
-
-       mask = (1 << width) - 1;
-       shift = pin_offset * width;
-       data = readl(reg_base + cfg_reg);
-
-       if (set) {
-               cfg_value = PINCFG_UNPACK_VALUE(*config);
-               data &= ~(mask << shift);
-               data |= (cfg_value << shift);
-               writel(data, reg_base + cfg_reg);
-       } else {
-               data >>= shift;
-               data &= mask;
-               *config = PINCFG_PACK(cfg_type, data);
-       }
-
-       spin_unlock_irqrestore(&bank->slock, flags);
-
-       return 0;
-}
-
-/* set the pin config settings for a specified pin */
-static int samsung_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
-                               unsigned long *configs, unsigned num_configs)
-{
-       int i, ret;
-
-       for (i = 0; i < num_configs; i++) {
-               ret = samsung_pinconf_rw(pctldev, pin, &configs[i], true);
-               if (ret < 0)
-                       return ret;
-       } /* for each config */
-
-       return 0;
-}
-
-/* get the pin config settings for a specified pin */
-static int samsung_pinconf_get(struct pinctrl_dev *pctldev, unsigned int pin,
-                                       unsigned long *config)
-{
-       return samsung_pinconf_rw(pctldev, pin, config, false);
-}
-
-/* set the pin config settings for a specified pin group */
-static int samsung_pinconf_group_set(struct pinctrl_dev *pctldev,
-                       unsigned group, unsigned long *configs,
-                       unsigned num_configs)
-{
-       struct samsung_pinctrl_drv_data *drvdata;
-       const unsigned int *pins;
-       unsigned int cnt;
-
-       drvdata = pinctrl_dev_get_drvdata(pctldev);
-       pins = drvdata->pin_groups[group].pins;
-
-       for (cnt = 0; cnt < drvdata->pin_groups[group].num_pins; cnt++)
-               samsung_pinconf_set(pctldev, pins[cnt], configs, num_configs);
-
-       return 0;
-}
-
-/* get the pin config settings for a specified pin group */
-static int samsung_pinconf_group_get(struct pinctrl_dev *pctldev,
-                               unsigned int group, unsigned long *config)
-{
-       struct samsung_pinctrl_drv_data *drvdata;
-       const unsigned int *pins;
-
-       drvdata = pinctrl_dev_get_drvdata(pctldev);
-       pins = drvdata->pin_groups[group].pins;
-       samsung_pinconf_get(pctldev, pins[0], config);
-       return 0;
-}
-
-/* list of pinconfig callbacks for pinconfig vertical in the pinctrl code */
-static const struct pinconf_ops samsung_pinconf_ops = {
-       .pin_config_get         = samsung_pinconf_get,
-       .pin_config_set         = samsung_pinconf_set,
-       .pin_config_group_get   = samsung_pinconf_group_get,
-       .pin_config_group_set   = samsung_pinconf_group_set,
-};
-
-/* gpiolib gpio_set callback function */
-static void samsung_gpio_set(struct gpio_chip *gc, unsigned offset, int value)
-{
-       struct samsung_pin_bank *bank = gc_to_pin_bank(gc);
-       struct samsung_pin_bank_type *type = bank->type;
-       unsigned long flags;
-       void __iomem *reg;
-       u32 data;
-
-       reg = bank->drvdata->virt_base + bank->pctl_offset;
-
-       spin_lock_irqsave(&bank->slock, flags);
-
-       data = readl(reg + type->reg_offset[PINCFG_TYPE_DAT]);
-       data &= ~(1 << offset);
-       if (value)
-               data |= 1 << offset;
-       writel(data, reg + type->reg_offset[PINCFG_TYPE_DAT]);
-
-       spin_unlock_irqrestore(&bank->slock, flags);
-}
-
-/* gpiolib gpio_get callback function */
-static int samsung_gpio_get(struct gpio_chip *gc, unsigned offset)
-{
-       void __iomem *reg;
-       u32 data;
-       struct samsung_pin_bank *bank = gc_to_pin_bank(gc);
-       struct samsung_pin_bank_type *type = bank->type;
-
-       reg = bank->drvdata->virt_base + bank->pctl_offset;
-
-       data = readl(reg + type->reg_offset[PINCFG_TYPE_DAT]);
-       data >>= offset;
-       data &= 1;
-       return data;
-}
-
-/*
- * gpiolib gpio_direction_input callback function. The setting of the pin
- * mux function as 'gpio input' will be handled by the pinctrl susbsystem
- * interface.
- */
-static int samsung_gpio_direction_input(struct gpio_chip *gc, unsigned offset)
-{
-       return pinctrl_gpio_direction_input(gc->base + offset);
-}
-
-/*
- * gpiolib gpio_direction_output callback function. The setting of the pin
- * mux function as 'gpio output' will be handled by the pinctrl susbsystem
- * interface.
- */
-static int samsung_gpio_direction_output(struct gpio_chip *gc, unsigned offset,
-                                                       int value)
-{
-       samsung_gpio_set(gc, offset, value);
-       return pinctrl_gpio_direction_output(gc->base + offset);
-}
-
-/*
- * gpiolib gpio_to_irq callback function. Creates a mapping between a GPIO pin
- * and a virtual IRQ, if not already present.
- */
-static int samsung_gpio_to_irq(struct gpio_chip *gc, unsigned offset)
-{
-       struct samsung_pin_bank *bank = gc_to_pin_bank(gc);
-       unsigned int virq;
-
-       if (!bank->irq_domain)
-               return -ENXIO;
-
-       virq = irq_create_mapping(bank->irq_domain, offset);
-
-       return (virq) ? : -ENXIO;
-}
-
-/*
- * Parse the pin names listed in the 'samsung,pins' property and convert it
- * into a list of gpio numbers are create a pin group from it.
- */
-static int samsung_pinctrl_parse_dt_pins(struct platform_device *pdev,
-                                        struct device_node *cfg_np,
-                                        struct pinctrl_desc *pctl,
-                                        unsigned int **pin_list,
-                                        unsigned int *npins)
-{
-       struct device *dev = &pdev->dev;
-       struct property *prop;
-       struct pinctrl_pin_desc const *pdesc = pctl->pins;
-       unsigned int idx = 0, cnt;
-       const char *pin_name;
-
-       *npins = of_property_count_strings(cfg_np, "samsung,pins");
-       if (IS_ERR_VALUE(*npins)) {
-               dev_err(dev, "invalid pin list in %s node", cfg_np->name);
-               return -EINVAL;
-       }
-
-       *pin_list = devm_kzalloc(dev, *npins * sizeof(**pin_list), GFP_KERNEL);
-       if (!*pin_list) {
-               dev_err(dev, "failed to allocate memory for pin list\n");
-               return -ENOMEM;
-       }
-
-       of_property_for_each_string(cfg_np, "samsung,pins", prop, pin_name) {
-               for (cnt = 0; cnt < pctl->npins; cnt++) {
-                       if (pdesc[cnt].name) {
-                               if (!strcmp(pin_name, pdesc[cnt].name)) {
-                                       (*pin_list)[idx++] = pdesc[cnt].number;
-                                       break;
-                               }
-                       }
-               }
-               if (cnt == pctl->npins) {
-                       dev_err(dev, "pin %s not valid in %s node\n",
-                                       pin_name, cfg_np->name);
-                       devm_kfree(dev, *pin_list);
-                       return -EINVAL;
-               }
-       }
-
-       return 0;
-}
-
-/*
- * Parse the information about all the available pin groups and pin functions
- * from device node of the pin-controller. A pin group is formed with all
- * the pins listed in the "samsung,pins" property.
- */
-static int samsung_pinctrl_parse_dt(struct platform_device *pdev,
-                                   struct samsung_pinctrl_drv_data *drvdata)
-{
-       struct device *dev = &pdev->dev;
-       struct device_node *dev_np = dev->of_node;
-       struct device_node *cfg_np;
-       struct samsung_pin_group *groups, *grp;
-       struct samsung_pmx_func *functions, *func;
-       unsigned *pin_list;
-       unsigned int npins, grp_cnt, func_idx = 0;
-       char *gname, *fname;
-       int ret;
-
-       grp_cnt = of_get_child_count(dev_np);
-       if (!grp_cnt)
-               return -EINVAL;
-
-       groups = devm_kzalloc(dev, grp_cnt * sizeof(*groups), GFP_KERNEL);
-       if (!groups) {
-               dev_err(dev, "failed allocate memory for ping group list\n");
-               return -EINVAL;
-       }
-       grp = groups;
-
-       functions = devm_kzalloc(dev, grp_cnt * sizeof(*functions), GFP_KERNEL);
-       if (!functions) {
-               dev_err(dev, "failed to allocate memory for function list\n");
-               return -EINVAL;
-       }
-       func = functions;
-
-       /*
-        * Iterate over all the child nodes of the pin controller node
-        * and create pin groups and pin function lists.
-        */
-       for_each_child_of_node(dev_np, cfg_np) {
-               u32 function;
-               if (!of_find_property(cfg_np, "samsung,pins", NULL))
-                       continue;
-
-               ret = samsung_pinctrl_parse_dt_pins(pdev, cfg_np,
-                                       &drvdata->pctl, &pin_list, &npins);
-               if (ret)
-                       return ret;
-
-               /* derive pin group name from the node name */
-               gname = devm_kzalloc(dev, strlen(cfg_np->name) + GSUFFIX_LEN,
-                                       GFP_KERNEL);
-               if (!gname) {
-                       dev_err(dev, "failed to alloc memory for group name\n");
-                       return -ENOMEM;
-               }
-               sprintf(gname, "%s%s", cfg_np->name, GROUP_SUFFIX);
-
-               grp->name = gname;
-               grp->pins = pin_list;
-               grp->num_pins = npins;
-               of_property_read_u32(cfg_np, "samsung,pin-function", &function);
-               grp->func = function;
-               grp++;
-
-               if (!of_find_property(cfg_np, "samsung,pin-function", NULL))
-                       continue;
-
-               /* derive function name from the node name */
-               fname = devm_kzalloc(dev, strlen(cfg_np->name) + FSUFFIX_LEN,
-                                       GFP_KERNEL);
-               if (!fname) {
-                       dev_err(dev, "failed to alloc memory for func name\n");
-                       return -ENOMEM;
-               }
-               sprintf(fname, "%s%s", cfg_np->name, FUNCTION_SUFFIX);
-
-               func->name = fname;
-               func->groups = devm_kzalloc(dev, sizeof(char *), GFP_KERNEL);
-               if (!func->groups) {
-                       dev_err(dev, "failed to alloc memory for group list "
-                                       "in pin function");
-                       return -ENOMEM;
-               }
-               func->groups[0] = gname;
-               func->num_groups = 1;
-               func++;
-               func_idx++;
-       }
-
-       drvdata->pin_groups = groups;
-       drvdata->nr_groups = grp_cnt;
-       drvdata->pmx_functions = functions;
-       drvdata->nr_functions = func_idx;
-
-       return 0;
-}
-
-/* register the pinctrl interface with the pinctrl subsystem */
-static int samsung_pinctrl_register(struct platform_device *pdev,
-                                   struct samsung_pinctrl_drv_data *drvdata)
-{
-       struct pinctrl_desc *ctrldesc = &drvdata->pctl;
-       struct pinctrl_pin_desc *pindesc, *pdesc;
-       struct samsung_pin_bank *pin_bank;
-       char *pin_names;
-       int pin, bank, ret;
-
-       ctrldesc->name = "samsung-pinctrl";
-       ctrldesc->owner = THIS_MODULE;
-       ctrldesc->pctlops = &samsung_pctrl_ops;
-       ctrldesc->pmxops = &samsung_pinmux_ops;
-       ctrldesc->confops = &samsung_pinconf_ops;
-
-       pindesc = devm_kzalloc(&pdev->dev, sizeof(*pindesc) *
-                       drvdata->ctrl->nr_pins, GFP_KERNEL);
-       if (!pindesc) {
-               dev_err(&pdev->dev, "mem alloc for pin descriptors failed\n");
-               return -ENOMEM;
-       }
-       ctrldesc->pins = pindesc;
-       ctrldesc->npins = drvdata->ctrl->nr_pins;
-
-       /* dynamically populate the pin number and pin name for pindesc */
-       for (pin = 0, pdesc = pindesc; pin < ctrldesc->npins; pin++, pdesc++)
-               pdesc->number = pin + drvdata->ctrl->base;
-
-       /*
-        * allocate space for storing the dynamically generated names for all
-        * the pins which belong to this pin-controller.
-        */
-       pin_names = devm_kzalloc(&pdev->dev, sizeof(char) * PIN_NAME_LENGTH *
-                                       drvdata->ctrl->nr_pins, GFP_KERNEL);
-       if (!pin_names) {
-               dev_err(&pdev->dev, "mem alloc for pin names failed\n");
-               return -ENOMEM;
-       }
-
-       /* for each pin, the name of the pin is pin-bank name + pin number */
-       for (bank = 0; bank < drvdata->ctrl->nr_banks; bank++) {
-               pin_bank = &drvdata->ctrl->pin_banks[bank];
-               for (pin = 0; pin < pin_bank->nr_pins; pin++) {
-                       sprintf(pin_names, "%s-%d", pin_bank->name, pin);
-                       pdesc = pindesc + pin_bank->pin_base + pin;
-                       pdesc->name = pin_names;
-                       pin_names += PIN_NAME_LENGTH;
-               }
-       }
-
-       ret = samsung_pinctrl_parse_dt(pdev, drvdata);
-       if (ret)
-               return ret;
-
-       drvdata->pctl_dev = pinctrl_register(ctrldesc, &pdev->dev, drvdata);
-       if (!drvdata->pctl_dev) {
-               dev_err(&pdev->dev, "could not register pinctrl driver\n");
-               return -EINVAL;
-       }
-
-       for (bank = 0; bank < drvdata->ctrl->nr_banks; ++bank) {
-               pin_bank = &drvdata->ctrl->pin_banks[bank];
-               pin_bank->grange.name = pin_bank->name;
-               pin_bank->grange.id = bank;
-               pin_bank->grange.pin_base = pin_bank->pin_base;
-               pin_bank->grange.base = pin_bank->gpio_chip.base;
-               pin_bank->grange.npins = pin_bank->gpio_chip.ngpio;
-               pin_bank->grange.gc = &pin_bank->gpio_chip;
-               pinctrl_add_gpio_range(drvdata->pctl_dev, &pin_bank->grange);
-       }
-
-       return 0;
-}
-
-static const struct gpio_chip samsung_gpiolib_chip = {
-       .set = samsung_gpio_set,
-       .get = samsung_gpio_get,
-       .direction_input = samsung_gpio_direction_input,
-       .direction_output = samsung_gpio_direction_output,
-       .to_irq = samsung_gpio_to_irq,
-       .owner = THIS_MODULE,
-};
-
-/* register the gpiolib interface with the gpiolib subsystem */
-static int samsung_gpiolib_register(struct platform_device *pdev,
-                                   struct samsung_pinctrl_drv_data *drvdata)
-{
-       struct samsung_pin_ctrl *ctrl = drvdata->ctrl;
-       struct samsung_pin_bank *bank = ctrl->pin_banks;
-       struct gpio_chip *gc;
-       int ret;
-       int i;
-
-       for (i = 0; i < ctrl->nr_banks; ++i, ++bank) {
-               bank->gpio_chip = samsung_gpiolib_chip;
-
-               gc = &bank->gpio_chip;
-               gc->base = ctrl->base + bank->pin_base;
-               gc->ngpio = bank->nr_pins;
-               gc->dev = &pdev->dev;
-               gc->of_node = bank->of_node;
-               gc->label = bank->name;
-
-               ret = gpiochip_add(gc);
-               if (ret) {
-                       dev_err(&pdev->dev, "failed to register gpio_chip %s, error code: %d\n",
-                                                       gc->label, ret);
-                       goto fail;
-               }
-       }
-
-       return 0;
-
-fail:
-       for (--i, --bank; i >= 0; --i, --bank)
-               if (gpiochip_remove(&bank->gpio_chip))
-                       dev_err(&pdev->dev, "gpio chip %s remove failed\n",
-                                                       bank->gpio_chip.label);
-       return ret;
-}
-
-/* unregister the gpiolib interface with the gpiolib subsystem */
-static int samsung_gpiolib_unregister(struct platform_device *pdev,
-                                     struct samsung_pinctrl_drv_data *drvdata)
-{
-       struct samsung_pin_ctrl *ctrl = drvdata->ctrl;
-       struct samsung_pin_bank *bank = ctrl->pin_banks;
-       int ret = 0;
-       int i;
-
-       for (i = 0; !ret && i < ctrl->nr_banks; ++i, ++bank)
-               ret = gpiochip_remove(&bank->gpio_chip);
-
-       if (ret)
-               dev_err(&pdev->dev, "gpio chip remove failed\n");
-
-       return ret;
-}
-
-static const struct of_device_id samsung_pinctrl_dt_match[];
-
-/* retrieve the soc specific data */
-static struct samsung_pin_ctrl *samsung_pinctrl_get_soc_data(
-                               struct samsung_pinctrl_drv_data *d,
-                               struct platform_device *pdev)
-{
-       int id;
-       const struct of_device_id *match;
-       struct device_node *node = pdev->dev.of_node;
-       struct device_node *np;
-       struct samsung_pin_ctrl *ctrl;
-       struct samsung_pin_bank *bank;
-       int i;
-
-       id = of_alias_get_id(node, "pinctrl");
-       if (id < 0) {
-               dev_err(&pdev->dev, "failed to get alias id\n");
-               return NULL;
-       }
-       match = of_match_node(samsung_pinctrl_dt_match, node);
-       ctrl = (struct samsung_pin_ctrl *)match->data + id;
-
-       bank = ctrl->pin_banks;
-       for (i = 0; i < ctrl->nr_banks; ++i, ++bank) {
-               spin_lock_init(&bank->slock);
-               bank->drvdata = d;
-               bank->pin_base = ctrl->nr_pins;
-               ctrl->nr_pins += bank->nr_pins;
-       }
-
-       for_each_child_of_node(node, np) {
-               if (!of_find_property(np, "gpio-controller", NULL))
-                       continue;
-               bank = ctrl->pin_banks;
-               for (i = 0; i < ctrl->nr_banks; ++i, ++bank) {
-                       if (!strcmp(bank->name, np->name)) {
-                               bank->of_node = np;
-                               break;
-                       }
-               }
-       }
-
-       ctrl->base = pin_base;
-       pin_base += ctrl->nr_pins;
-
-       return ctrl;
-}
-
-static int samsung_pinctrl_probe(struct platform_device *pdev)
-{
-       struct samsung_pinctrl_drv_data *drvdata;
-       struct device *dev = &pdev->dev;
-       struct samsung_pin_ctrl *ctrl;
-       struct resource *res;
-       int ret;
-
-       if (!dev->of_node) {
-               dev_err(dev, "device tree node not found\n");
-               return -ENODEV;
-       }
-
-       drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL);
-       if (!drvdata) {
-               dev_err(dev, "failed to allocate memory for driver's "
-                               "private data\n");
-               return -ENOMEM;
-       }
-
-       ctrl = samsung_pinctrl_get_soc_data(drvdata, pdev);
-       if (!ctrl) {
-               dev_err(&pdev->dev, "driver data not available\n");
-               return -EINVAL;
-       }
-       drvdata->ctrl = ctrl;
-       drvdata->dev = dev;
-
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       drvdata->virt_base = devm_ioremap_resource(&pdev->dev, res);
-       if (IS_ERR(drvdata->virt_base))
-               return PTR_ERR(drvdata->virt_base);
-
-       res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
-       if (res)
-               drvdata->irq = res->start;
-
-       ret = samsung_gpiolib_register(pdev, drvdata);
-       if (ret)
-               return ret;
-
-       ret = samsung_pinctrl_register(pdev, drvdata);
-       if (ret) {
-               samsung_gpiolib_unregister(pdev, drvdata);
-               return ret;
-       }
-
-       if (ctrl->eint_gpio_init)
-               ctrl->eint_gpio_init(drvdata);
-       if (ctrl->eint_wkup_init)
-               ctrl->eint_wkup_init(drvdata);
-
-       platform_set_drvdata(pdev, drvdata);
-
-       /* Add to the global list */
-       list_add_tail(&drvdata->node, &drvdata_list);
-
-       return 0;
-}
-
-#ifdef CONFIG_PM
-
-/**
- * samsung_pinctrl_suspend_dev - save pinctrl state for suspend for a device
- *
- * Save data for all banks handled by this device.
- */
-static void samsung_pinctrl_suspend_dev(
-       struct samsung_pinctrl_drv_data *drvdata)
-{
-       struct samsung_pin_ctrl *ctrl = drvdata->ctrl;
-       void __iomem *virt_base = drvdata->virt_base;
-       int i;
-
-       for (i = 0; i < ctrl->nr_banks; i++) {
-               struct samsung_pin_bank *bank = &ctrl->pin_banks[i];
-               void __iomem *reg = virt_base + bank->pctl_offset;
-
-               u8 *offs = bank->type->reg_offset;
-               u8 *widths = bank->type->fld_width;
-               enum pincfg_type type;
-
-               /* Registers without a powerdown config aren't lost */
-               if (!widths[PINCFG_TYPE_CON_PDN])
-                       continue;
-
-               for (type = 0; type < PINCFG_TYPE_NUM; type++)
-                       if (widths[type])
-                               bank->pm_save[type] = readl(reg + offs[type]);
-
-               if (widths[PINCFG_TYPE_FUNC] * bank->nr_pins > 32) {
-                       /* Some banks have two config registers */
-                       bank->pm_save[PINCFG_TYPE_NUM] =
-                               readl(reg + offs[PINCFG_TYPE_FUNC] + 4);
-                       pr_debug("Save %s @ %p (con %#010x %08x)\n",
-                                bank->name, reg,
-                                bank->pm_save[PINCFG_TYPE_FUNC],
-                                bank->pm_save[PINCFG_TYPE_NUM]);
-               } else {
-                       pr_debug("Save %s @ %p (con %#010x)\n", bank->name,
-                                reg, bank->pm_save[PINCFG_TYPE_FUNC]);
-               }
-       }
-
-       if (ctrl->suspend)
-               ctrl->suspend(drvdata);
-}
-
-/**
- * samsung_pinctrl_resume_dev - restore pinctrl state from suspend for a device
- *
- * Restore one of the banks that was saved during suspend.
- *
- * We don't bother doing anything complicated to avoid glitching lines since
- * we're called before pad retention is turned off.
- */
-static void samsung_pinctrl_resume_dev(struct samsung_pinctrl_drv_data *drvdata)
-{
-       struct samsung_pin_ctrl *ctrl = drvdata->ctrl;
-       void __iomem *virt_base = drvdata->virt_base;
-       int i;
-
-       if (ctrl->resume)
-               ctrl->resume(drvdata);
-
-       for (i = 0; i < ctrl->nr_banks; i++) {
-               struct samsung_pin_bank *bank = &ctrl->pin_banks[i];
-               void __iomem *reg = virt_base + bank->pctl_offset;
-
-               u8 *offs = bank->type->reg_offset;
-               u8 *widths = bank->type->fld_width;
-               enum pincfg_type type;
-
-               /* Registers without a powerdown config aren't lost */
-               if (!widths[PINCFG_TYPE_CON_PDN])
-                       continue;
-
-               if (widths[PINCFG_TYPE_FUNC] * bank->nr_pins > 32) {
-                       /* Some banks have two config registers */
-                       pr_debug("%s @ %p (con %#010x %08x => %#010x %08x)\n",
-                                bank->name, reg,
-                                readl(reg + offs[PINCFG_TYPE_FUNC]),
-                                readl(reg + offs[PINCFG_TYPE_FUNC] + 4),
-                                bank->pm_save[PINCFG_TYPE_FUNC],
-                                bank->pm_save[PINCFG_TYPE_NUM]);
-                       writel(bank->pm_save[PINCFG_TYPE_NUM],
-                              reg + offs[PINCFG_TYPE_FUNC] + 4);
-               } else {
-                       pr_debug("%s @ %p (con %#010x => %#010x)\n", bank->name,
-                                reg, readl(reg + offs[PINCFG_TYPE_FUNC]),
-                                bank->pm_save[PINCFG_TYPE_FUNC]);
-               }
-               for (type = 0; type < PINCFG_TYPE_NUM; type++)
-                       if (widths[type])
-                               writel(bank->pm_save[type], reg + offs[type]);
-       }
-}
-
-/**
- * samsung_pinctrl_suspend - save pinctrl state for suspend
- *
- * Save data for all banks across all devices.
- */
-static int samsung_pinctrl_suspend(void)
-{
-       struct samsung_pinctrl_drv_data *drvdata;
-
-       list_for_each_entry(drvdata, &drvdata_list, node) {
-               samsung_pinctrl_suspend_dev(drvdata);
-       }
-
-       return 0;
-}
-
-/**
- * samsung_pinctrl_resume - restore pinctrl state for suspend
- *
- * Restore data for all banks across all devices.
- */
-static void samsung_pinctrl_resume(void)
-{
-       struct samsung_pinctrl_drv_data *drvdata;
-
-       list_for_each_entry_reverse(drvdata, &drvdata_list, node) {
-               samsung_pinctrl_resume_dev(drvdata);
-       }
-}
-
-#else
-#define samsung_pinctrl_suspend                NULL
-#define samsung_pinctrl_resume         NULL
-#endif
-
-static struct syscore_ops samsung_pinctrl_syscore_ops = {
-       .suspend        = samsung_pinctrl_suspend,
-       .resume         = samsung_pinctrl_resume,
-};
-
-static const struct of_device_id samsung_pinctrl_dt_match[] = {
-#ifdef CONFIG_PINCTRL_EXYNOS
-       { .compatible = "samsung,exynos3250-pinctrl",
-               .data = (void *)exynos3250_pin_ctrl },
-       { .compatible = "samsung,exynos4210-pinctrl",
-               .data = (void *)exynos4210_pin_ctrl },
-       { .compatible = "samsung,exynos4x12-pinctrl",
-               .data = (void *)exynos4x12_pin_ctrl },
-       { .compatible = "samsung,exynos5250-pinctrl",
-               .data = (void *)exynos5250_pin_ctrl },
-       { .compatible = "samsung,exynos5260-pinctrl",
-               .data = (void *)exynos5260_pin_ctrl },
-       { .compatible = "samsung,exynos5420-pinctrl",
-               .data = (void *)exynos5420_pin_ctrl },
-       { .compatible = "samsung,s5pv210-pinctrl",
-               .data = (void *)s5pv210_pin_ctrl },
-#endif
-#ifdef CONFIG_PINCTRL_S3C64XX
-       { .compatible = "samsung,s3c64xx-pinctrl",
-               .data = s3c64xx_pin_ctrl },
-#endif
-#ifdef CONFIG_PINCTRL_S3C24XX
-       { .compatible = "samsung,s3c2412-pinctrl",
-               .data = s3c2412_pin_ctrl },
-       { .compatible = "samsung,s3c2416-pinctrl",
-               .data = s3c2416_pin_ctrl },
-       { .compatible = "samsung,s3c2440-pinctrl",
-               .data = s3c2440_pin_ctrl },
-       { .compatible = "samsung,s3c2450-pinctrl",
-               .data = s3c2450_pin_ctrl },
-#endif
-       {},
-};
-MODULE_DEVICE_TABLE(of, samsung_pinctrl_dt_match);
-
-static struct platform_driver samsung_pinctrl_driver = {
-       .probe          = samsung_pinctrl_probe,
-       .driver = {
-               .name   = "samsung-pinctrl",
-               .owner  = THIS_MODULE,
-               .of_match_table = samsung_pinctrl_dt_match,
-       },
-};
-
-static int __init samsung_pinctrl_drv_register(void)
-{
-       /*
-        * Register syscore ops for save/restore of registers across suspend.
-        * It's important to ensure that this driver is running at an earlier
-        * initcall level than any arch-specific init calls that install syscore
-        * ops that turn off pad retention (like exynos_pm_resume).
-        */
-       register_syscore_ops(&samsung_pinctrl_syscore_ops);
-
-       return platform_driver_register(&samsung_pinctrl_driver);
-}
-postcore_initcall(samsung_pinctrl_drv_register);
-
-static void __exit samsung_pinctrl_drv_unregister(void)
-{
-       platform_driver_unregister(&samsung_pinctrl_driver);
-}
-module_exit(samsung_pinctrl_drv_unregister);
-
-MODULE_AUTHOR("Thomas Abraham <thomas.ab@samsung.com>");
-MODULE_DESCRIPTION("Samsung pinctrl driver");
-MODULE_LICENSE("GPL v2");
diff --git a/drivers/pinctrl/pinctrl-samsung.h b/drivers/pinctrl/pinctrl-samsung.h
deleted file mode 100644 (file)
index b3e41fa..0000000
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
- * pin-controller/pin-mux/pin-config/gpio-driver for Samsung's SoC's.
- *
- * Copyright (c) 2012 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- * Copyright (c) 2012 Linaro Ltd
- *             http://www.linaro.org
- *
- * Author: Thomas Abraham <thomas.ab@samsung.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- */
-
-#ifndef __PINCTRL_SAMSUNG_H
-#define __PINCTRL_SAMSUNG_H
-
-#include <linux/pinctrl/pinctrl.h>
-#include <linux/pinctrl/pinmux.h>
-#include <linux/pinctrl/pinconf.h>
-#include <linux/pinctrl/consumer.h>
-#include <linux/pinctrl/machine.h>
-
-#include <linux/gpio.h>
-
-/* pinmux function number for pin as gpio output line */
-#define FUNC_OUTPUT    0x1
-
-/**
- * enum pincfg_type - possible pin configuration types supported.
- * @PINCFG_TYPE_FUNC: Function configuration.
- * @PINCFG_TYPE_DAT: Pin value configuration.
- * @PINCFG_TYPE_PUD: Pull up/down configuration.
- * @PINCFG_TYPE_DRV: Drive strength configuration.
- * @PINCFG_TYPE_CON_PDN: Pin function in power down mode.
- * @PINCFG_TYPE_PUD_PDN: Pull up/down configuration in power down mode.
- */
-enum pincfg_type {
-       PINCFG_TYPE_FUNC,
-       PINCFG_TYPE_DAT,
-       PINCFG_TYPE_PUD,
-       PINCFG_TYPE_DRV,
-       PINCFG_TYPE_CON_PDN,
-       PINCFG_TYPE_PUD_PDN,
-
-       PINCFG_TYPE_NUM
-};
-
-/*
- * pin configuration (pull up/down and drive strength) type and its value are
- * packed together into a 16-bits. The upper 8-bits represent the configuration
- * type and the lower 8-bits hold the value of the configuration type.
- */
-#define PINCFG_TYPE_MASK               0xFF
-#define PINCFG_VALUE_SHIFT             8
-#define PINCFG_VALUE_MASK              (0xFF << PINCFG_VALUE_SHIFT)
-#define PINCFG_PACK(type, value)       (((value) << PINCFG_VALUE_SHIFT) | type)
-#define PINCFG_UNPACK_TYPE(cfg)                ((cfg) & PINCFG_TYPE_MASK)
-#define PINCFG_UNPACK_VALUE(cfg)       (((cfg) & PINCFG_VALUE_MASK) >> \
-                                               PINCFG_VALUE_SHIFT)
-/**
- * enum eint_type - possible external interrupt types.
- * @EINT_TYPE_NONE: bank does not support external interrupts
- * @EINT_TYPE_GPIO: bank supportes external gpio interrupts
- * @EINT_TYPE_WKUP: bank supportes external wakeup interrupts
- * @EINT_TYPE_WKUP_MUX: bank supports multiplexed external wakeup interrupts
- *
- * Samsung GPIO controller groups all the available pins into banks. The pins
- * in a pin bank can support external gpio interrupts or external wakeup
- * interrupts or no interrupts at all. From a software perspective, the only
- * difference between external gpio and external wakeup interrupts is that
- * the wakeup interrupts can additionally wakeup the system if it is in
- * suspended state.
- */
-enum eint_type {
-       EINT_TYPE_NONE,
-       EINT_TYPE_GPIO,
-       EINT_TYPE_WKUP,
-       EINT_TYPE_WKUP_MUX,
-};
-
-/* maximum length of a pin in pin descriptor (example: "gpa0-0") */
-#define PIN_NAME_LENGTH        10
-
-#define PIN_GROUP(n, p, f)                             \
-       {                                               \
-               .name           = n,                    \
-               .pins           = p,                    \
-               .num_pins       = ARRAY_SIZE(p),        \
-               .func           = f                     \
-       }
-
-#define PMX_FUNC(n, g)                                 \
-       {                                               \
-               .name           = n,                    \
-               .groups         = g,                    \
-               .num_groups     = ARRAY_SIZE(g),        \
-       }
-
-struct samsung_pinctrl_drv_data;
-
-/**
- * struct samsung_pin_bank_type: pin bank type description
- * @fld_width: widths of configuration bitfields (0 if unavailable)
- * @reg_offset: offsets of configuration registers (don't care of width is 0)
- */
-struct samsung_pin_bank_type {
-       u8 fld_width[PINCFG_TYPE_NUM];
-       u8 reg_offset[PINCFG_TYPE_NUM];
-};
-
-/**
- * struct samsung_pin_bank: represent a controller pin-bank.
- * @type: type of the bank (register offsets and bitfield widths)
- * @pctl_offset: starting offset of the pin-bank registers.
- * @pin_base: starting pin number of the bank.
- * @nr_pins: number of pins included in this bank.
- * @eint_func: function to set in CON register to configure pin as EINT.
- * @eint_type: type of the external interrupt supported by the bank.
- * @eint_mask: bit mask of pins which support EINT function.
- * @name: name to be prefixed for each pin in this pin bank.
- * @of_node: OF node of the bank.
- * @drvdata: link to controller driver data
- * @irq_domain: IRQ domain of the bank.
- * @gpio_chip: GPIO chip of the bank.
- * @grange: linux gpio pin range supported by this bank.
- * @slock: spinlock protecting bank registers
- * @pm_save: saved register values during suspend
- */
-struct samsung_pin_bank {
-       struct samsung_pin_bank_type *type;
-       u32             pctl_offset;
-       u32             pin_base;
-       u8              nr_pins;
-       u8              eint_func;
-       enum eint_type  eint_type;
-       u32             eint_mask;
-       u32             eint_offset;
-       char            *name;
-       void            *soc_priv;
-       struct device_node *of_node;
-       struct samsung_pinctrl_drv_data *drvdata;
-       struct irq_domain *irq_domain;
-       struct gpio_chip gpio_chip;
-       struct pinctrl_gpio_range grange;
-       spinlock_t slock;
-
-       u32 pm_save[PINCFG_TYPE_NUM + 1]; /* +1 to handle double CON registers*/
-};
-
-/**
- * struct samsung_pin_ctrl: represent a pin controller.
- * @pin_banks: list of pin banks included in this controller.
- * @nr_banks: number of pin banks.
- * @base: starting system wide pin number.
- * @nr_pins: number of pins supported by the controller.
- * @geint_con: offset of the ext-gpio controller registers.
- * @geint_mask: offset of the ext-gpio interrupt mask registers.
- * @geint_pend: offset of the ext-gpio interrupt pending registers.
- * @weint_con: offset of the ext-wakeup controller registers.
- * @weint_mask: offset of the ext-wakeup interrupt mask registers.
- * @weint_pend: offset of the ext-wakeup interrupt pending registers.
- * @svc: offset of the interrupt service register.
- * @eint_gpio_init: platform specific callback to setup the external gpio
- *     interrupts for the controller.
- * @eint_wkup_init: platform specific callback to setup the external wakeup
- *     interrupts for the controller.
- * @label: for debug information.
- */
-struct samsung_pin_ctrl {
-       struct samsung_pin_bank *pin_banks;
-       u32             nr_banks;
-
-       u32             base;
-       u32             nr_pins;
-
-       u32             geint_con;
-       u32             geint_mask;
-       u32             geint_pend;
-
-       u32             weint_con;
-       u32             weint_mask;
-       u32             weint_pend;
-
-       u32             svc;
-
-       int             (*eint_gpio_init)(struct samsung_pinctrl_drv_data *);
-       int             (*eint_wkup_init)(struct samsung_pinctrl_drv_data *);
-       void            (*suspend)(struct samsung_pinctrl_drv_data *);
-       void            (*resume)(struct samsung_pinctrl_drv_data *);
-
-       char            *label;
-};
-
-/**
- * struct samsung_pinctrl_drv_data: wrapper for holding driver data together.
- * @node: global list node
- * @virt_base: register base address of the controller.
- * @dev: device instance representing the controller.
- * @irq: interrpt number used by the controller to notify gpio interrupts.
- * @ctrl: pin controller instance managed by the driver.
- * @pctl: pin controller descriptor registered with the pinctrl subsystem.
- * @pctl_dev: cookie representing pinctrl device instance.
- * @pin_groups: list of pin groups available to the driver.
- * @nr_groups: number of such pin groups.
- * @pmx_functions: list of pin functions available to the driver.
- * @nr_function: number of such pin functions.
- */
-struct samsung_pinctrl_drv_data {
-       struct list_head                node;
-       void __iomem                    *virt_base;
-       struct device                   *dev;
-       int                             irq;
-
-       struct samsung_pin_ctrl         *ctrl;
-       struct pinctrl_desc             pctl;
-       struct pinctrl_dev              *pctl_dev;
-
-       const struct samsung_pin_group  *pin_groups;
-       unsigned int                    nr_groups;
-       const struct samsung_pmx_func   *pmx_functions;
-       unsigned int                    nr_functions;
-};
-
-/**
- * struct samsung_pin_group: represent group of pins of a pinmux function.
- * @name: name of the pin group, used to lookup the group.
- * @pins: the pins included in this group.
- * @num_pins: number of pins included in this group.
- * @func: the function number to be programmed when selected.
- */
-struct samsung_pin_group {
-       const char              *name;
-       const unsigned int      *pins;
-       u8                      num_pins;
-       u8                      func;
-};
-
-/**
- * struct samsung_pmx_func: represent a pin function.
- * @name: name of the pin function, used to lookup the function.
- * @groups: one or more names of pin groups that provide this function.
- * @num_groups: number of groups included in @groups.
- */
-struct samsung_pmx_func {
-       const char              *name;
-       const char              **groups;
-       u8                      num_groups;
-};
-
-/* list of all exported SoC specific data */
-extern struct samsung_pin_ctrl exynos3250_pin_ctrl[];
-extern struct samsung_pin_ctrl exynos4210_pin_ctrl[];
-extern struct samsung_pin_ctrl exynos4x12_pin_ctrl[];
-extern struct samsung_pin_ctrl exynos5250_pin_ctrl[];
-extern struct samsung_pin_ctrl exynos5260_pin_ctrl[];
-extern struct samsung_pin_ctrl exynos5420_pin_ctrl[];
-extern struct samsung_pin_ctrl s3c64xx_pin_ctrl[];
-extern struct samsung_pin_ctrl s3c2412_pin_ctrl[];
-extern struct samsung_pin_ctrl s3c2416_pin_ctrl[];
-extern struct samsung_pin_ctrl s3c2440_pin_ctrl[];
-extern struct samsung_pin_ctrl s3c2450_pin_ctrl[];
-extern struct samsung_pin_ctrl s5pv210_pin_ctrl[];
-
-#endif /* __PINCTRL_SAMSUNG_H */
index 2960557bfed95c6d79f316c020ec98c426f38f83..95dd9cf55cb36ab2d5af88b21a437b89adba8656 100644 (file)
@@ -488,61 +488,6 @@ static int pcs_enable(struct pinctrl_dev *pctldev, unsigned fselector,
        return 0;
 }
 
-static void pcs_disable(struct pinctrl_dev *pctldev, unsigned fselector,
-                                       unsigned group)
-{
-       struct pcs_device *pcs;
-       struct pcs_function *func;
-       int i;
-
-       pcs = pinctrl_dev_get_drvdata(pctldev);
-       /* If function mask is null, needn't disable it. */
-       if (!pcs->fmask)
-               return;
-
-       func = radix_tree_lookup(&pcs->ftree, fselector);
-       if (!func) {
-               dev_err(pcs->dev, "%s could not find function%i\n",
-                       __func__, fselector);
-               return;
-       }
-
-       /*
-        * Ignore disable if function-off is not specified. Some hardware
-        * does not have clearly defined disable function. For pin specific
-        * off modes, you can use alternate named states as described in
-        * pinctrl-bindings.txt.
-        */
-       if (pcs->foff == PCS_OFF_DISABLED) {
-               dev_dbg(pcs->dev, "ignoring disable for %s function%i\n",
-                       func->name, fselector);
-               return;
-       }
-
-       dev_dbg(pcs->dev, "disabling function%i %s\n",
-               fselector, func->name);
-
-       for (i = 0; i < func->nvals; i++) {
-               struct pcs_func_vals *vals;
-               unsigned long flags;
-               unsigned val, mask;
-
-               vals = &func->vals[i];
-               raw_spin_lock_irqsave(&pcs->lock, flags);
-               val = pcs->read(vals->reg);
-
-               if (pcs->bits_per_mux)
-                       mask = vals->mask;
-               else
-                       mask = pcs->fmask;
-
-               val &= ~mask;
-               val |= pcs->foff << pcs->fshift;
-               pcs->write(val, vals->reg);
-               raw_spin_unlock_irqrestore(&pcs->lock, flags);
-       }
-}
-
 static int pcs_request_gpio(struct pinctrl_dev *pctldev,
                            struct pinctrl_gpio_range *range, unsigned pin)
 {
@@ -575,7 +520,6 @@ static const struct pinmux_ops pcs_pinmux_ops = {
        .get_function_name = pcs_get_function_name,
        .get_function_groups = pcs_get_function_groups,
        .enable = pcs_enable,
-       .disable = pcs_disable,
        .gpio_request_enable = pcs_request_gpio,
 };
 
@@ -836,7 +780,7 @@ static int pcs_add_pin(struct pcs_device *pcs, unsigned offset,
 
        pin = &pcs->pins.pa[i];
        pn = &pcs->names[i];
-       sprintf(pn->name, "%lx.%d",
+       sprintf(pn->name, "%lx.%u",
                (unsigned long)pcs->res->start + offset, pin_pos);
        pin->name = pn->name;
        pin->number = i;
@@ -1739,11 +1683,10 @@ static void pcs_irq_chain_handler(unsigned int irq, struct irq_desc *desc)
 {
        struct pcs_soc_data *pcs_soc = irq_desc_get_handler_data(desc);
        struct irq_chip *chip;
-       int res;
 
        chip = irq_get_chip(irq);
        chained_irq_enter(chip, desc);
-       res = pcs_irq_handle(pcs_soc);
+       pcs_irq_handle(pcs_soc);
        /* REVISIT: export and add handle_bad_irq(irq, desc)? */
        chained_irq_exit(chip, desc);
 
index 9f43916637ca251372fb57efc32bdd82dde4eef1..5475374d803fd69bf43c44ad2f8087ad858d92e8 100644 (file)
@@ -930,11 +930,6 @@ static int st_pmx_enable(struct pinctrl_dev *pctldev, unsigned fselector,
        return 0;
 }
 
-static void st_pmx_disable(struct pinctrl_dev *pctldev, unsigned selector,
-               unsigned group)
-{
-}
-
 static int st_pmx_set_gpio_direction(struct pinctrl_dev *pctldev,
                        struct pinctrl_gpio_range *range, unsigned gpio,
                        bool input)
@@ -957,7 +952,6 @@ static struct pinmux_ops st_pmxops = {
        .get_function_name      = st_pmx_get_fname,
        .get_function_groups    = st_pmx_get_groups,
        .enable                 = st_pmx_enable,
-       .disable                = st_pmx_disable,
        .gpio_set_direction     = st_pmx_set_gpio_direction,
 };
 
@@ -1178,9 +1172,7 @@ static int st_pctl_dt_parse_groups(struct device_node *np,
        const __be32 *list;
        struct property *pp;
        struct st_pinconf *conf;
-       phandle phandle;
        struct device_node *pins;
-       u32 pin;
        int i = 0, npins = 0, nr_props;
 
        pins = of_get_child_by_name(np, "st,pins");
@@ -1218,8 +1210,8 @@ static int st_pctl_dt_parse_groups(struct device_node *np,
                conf = &grp->pin_conf[i];
 
                /* bank & offset */
-               phandle = be32_to_cpup(list++);
-               pin = be32_to_cpup(list++);
+               be32_to_cpup(list++);
+               be32_to_cpup(list++);
                conf->pin = of_get_named_gpio(pins, pp->name, 0);
                conf->name = pp->name;
                grp->pins[i] = conf->pin;
@@ -1256,7 +1248,7 @@ static int st_pctl_parse_functions(struct device_node *np,
        func = &info->functions[index];
        func->name = np->name;
        func->ngroups = of_get_child_count(np);
-       if (func->ngroups <= 0) {
+       if (func->ngroups == 0) {
                dev_err(info->dev, "No groups defined\n");
                return -EINVAL;
        }
@@ -1454,6 +1446,7 @@ static struct irq_chip st_gpio_irqchip = {
        .irq_mask       = st_gpio_irq_mask,
        .irq_unmask     = st_gpio_irq_unmask,
        .irq_set_type   = st_gpio_irq_set_type,
+       .flags          = IRQCHIP_SKIP_SET_WAKE,
 };
 
 static int st_gpiolib_register_bank(struct st_pinctrl *info,
index 26ca6855f478d3018f79ab8aab87550e1eb52610..71c5d4f0c538ebbb192f963e3c6085b8bd4129cb 100644 (file)
@@ -738,22 +738,6 @@ static int tb10x_pctl_enable(struct pinctrl_dev *pctl,
        return 0;
 }
 
-static void tb10x_pctl_disable(struct pinctrl_dev *pctl,
-                       unsigned func_selector, unsigned group_selector)
-{
-       struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl);
-       const struct tb10x_pinfuncgrp *grp = &state->pingroups[group_selector];
-
-       if (grp->port < 0)
-               return;
-
-       mutex_lock(&state->mutex);
-
-       state->ports[grp->port].count--;
-
-       mutex_unlock(&state->mutex);
-}
-
 static struct pinmux_ops tb10x_pinmux_ops = {
        .get_functions_count = tb10x_get_functions_count,
        .get_function_name = tb10x_get_function_name,
@@ -761,7 +745,6 @@ static struct pinmux_ops tb10x_pinmux_ops = {
        .gpio_request_enable = tb10x_gpio_request_enable,
        .gpio_disable_free = tb10x_gpio_disable_free,
        .enable = tb10x_pctl_enable,
-       .disable = tb10x_pctl_disable,
 };
 
 static struct pinctrl_desc tb10x_pindesc = {
diff --git a/drivers/pinctrl/pinctrl-tegra-xusb.c b/drivers/pinctrl/pinctrl-tegra-xusb.c
new file mode 100644 (file)
index 0000000..a066204
--- /dev/null
@@ -0,0 +1,973 @@
+/*
+ * Copyright (c) 2014, NVIDIA CORPORATION.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ */
+
+#include <linux/delay.h>
+#include <linux/io.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/phy/phy.h>
+#include <linux/pinctrl/pinctrl.h>
+#include <linux/pinctrl/pinmux.h>
+#include <linux/platform_device.h>
+#include <linux/reset.h>
+
+#include <dt-bindings/pinctrl/pinctrl-tegra-xusb.h>
+
+#include "core.h"
+#include "pinctrl-utils.h"
+
+#define XUSB_PADCTL_ELPG_PROGRAM 0x01c
+#define XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_VCORE_DOWN (1 << 26)
+#define XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN_EARLY (1 << 25)
+#define XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN (1 << 24)
+
+#define XUSB_PADCTL_IOPHY_PLL_P0_CTL1 0x040
+#define XUSB_PADCTL_IOPHY_PLL_P0_CTL1_PLL0_LOCKDET (1 << 19)
+#define XUSB_PADCTL_IOPHY_PLL_P0_CTL1_REFCLK_SEL_MASK (0xf << 12)
+#define XUSB_PADCTL_IOPHY_PLL_P0_CTL1_PLL_RST (1 << 1)
+
+#define XUSB_PADCTL_IOPHY_PLL_P0_CTL2 0x044
+#define XUSB_PADCTL_IOPHY_PLL_P0_CTL2_REFCLKBUF_EN (1 << 6)
+#define XUSB_PADCTL_IOPHY_PLL_P0_CTL2_TXCLKREF_EN (1 << 5)
+#define XUSB_PADCTL_IOPHY_PLL_P0_CTL2_TXCLKREF_SEL (1 << 4)
+
+#define XUSB_PADCTL_IOPHY_PLL_S0_CTL1 0x138
+#define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL1_LOCKDET (1 << 27)
+#define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL1_MODE (1 << 24)
+#define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_PWR_OVRD (1 << 3)
+#define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_RST (1 << 1)
+#define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_IDDQ (1 << 0)
+
+#define XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1 0x148
+#define XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ_OVRD (1 << 1)
+#define XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ (1 << 0)
+
+struct tegra_xusb_padctl_function {
+       const char *name;
+       const char * const *groups;
+       unsigned int num_groups;
+};
+
+struct tegra_xusb_padctl_group {
+       const unsigned int *funcs;
+       unsigned int num_funcs;
+};
+
+struct tegra_xusb_padctl_soc {
+       const struct pinctrl_pin_desc *pins;
+       unsigned int num_pins;
+
+       const struct tegra_xusb_padctl_function *functions;
+       unsigned int num_functions;
+
+       const struct tegra_xusb_padctl_lane *lanes;
+       unsigned int num_lanes;
+};
+
+struct tegra_xusb_padctl_lane {
+       const char *name;
+
+       unsigned int offset;
+       unsigned int shift;
+       unsigned int mask;
+       unsigned int iddq;
+
+       const unsigned int *funcs;
+       unsigned int num_funcs;
+};
+
+struct tegra_xusb_padctl {
+       struct device *dev;
+       void __iomem *regs;
+       struct mutex lock;
+       struct reset_control *rst;
+
+       const struct tegra_xusb_padctl_soc *soc;
+       struct pinctrl_dev *pinctrl;
+       struct pinctrl_desc desc;
+
+       struct phy_provider *provider;
+       struct phy *phys[2];
+
+       unsigned int enable;
+};
+
+static inline void padctl_writel(struct tegra_xusb_padctl *padctl, u32 value,
+                                unsigned long offset)
+{
+       writel(value, padctl->regs + offset);
+}
+
+static inline u32 padctl_readl(struct tegra_xusb_padctl *padctl,
+                              unsigned long offset)
+{
+       return readl(padctl->regs + offset);
+}
+
+static int tegra_xusb_padctl_get_groups_count(struct pinctrl_dev *pinctrl)
+{
+       struct tegra_xusb_padctl *padctl = pinctrl_dev_get_drvdata(pinctrl);
+
+       return padctl->soc->num_pins;
+}
+
+static const char *tegra_xusb_padctl_get_group_name(struct pinctrl_dev *pinctrl,
+                                                   unsigned int group)
+{
+       struct tegra_xusb_padctl *padctl = pinctrl_dev_get_drvdata(pinctrl);
+
+       return padctl->soc->pins[group].name;
+}
+
+enum tegra_xusb_padctl_param {
+       TEGRA_XUSB_PADCTL_IDDQ,
+};
+
+static const struct tegra_xusb_padctl_property {
+       const char *name;
+       enum tegra_xusb_padctl_param param;
+} properties[] = {
+       { "nvidia,iddq", TEGRA_XUSB_PADCTL_IDDQ },
+};
+
+#define TEGRA_XUSB_PADCTL_PACK(param, value) ((param) << 16 | (value))
+#define TEGRA_XUSB_PADCTL_UNPACK_PARAM(config) ((config) >> 16)
+#define TEGRA_XUSB_PADCTL_UNPACK_VALUE(config) ((config) & 0xffff)
+
+static int tegra_xusb_padctl_parse_subnode(struct tegra_xusb_padctl *padctl,
+                                          struct device_node *np,
+                                          struct pinctrl_map **maps,
+                                          unsigned int *reserved_maps,
+                                          unsigned int *num_maps)
+{
+       unsigned int i, reserve = 0, num_configs = 0;
+       unsigned long config, *configs = NULL;
+       const char *function, *group;
+       struct property *prop;
+       int err = 0;
+       u32 value;
+
+       err = of_property_read_string(np, "nvidia,function", &function);
+       if (err < 0) {
+               if (err != -EINVAL)
+                       return err;
+
+               function = NULL;
+       }
+
+       for (i = 0; i < ARRAY_SIZE(properties); i++) {
+               err = of_property_read_u32(np, properties[i].name, &value);
+               if (err < 0) {
+                       if (err == -EINVAL)
+                               continue;
+
+                       return err;
+               }
+
+               config = TEGRA_XUSB_PADCTL_PACK(properties[i].param, value);
+
+               err = pinctrl_utils_add_config(padctl->pinctrl, &configs,
+                                              &num_configs, config);
+               if (err < 0)
+                       return err;
+       }
+
+       if (function)
+               reserve++;
+
+       if (num_configs)
+               reserve++;
+
+       err = of_property_count_strings(np, "nvidia,lanes");
+       if (err < 0)
+               return err;
+
+       reserve *= err;
+
+       err = pinctrl_utils_reserve_map(padctl->pinctrl, maps, reserved_maps,
+                                       num_maps, reserve);
+       if (err < 0)
+               return err;
+
+       of_property_for_each_string(np, "nvidia,lanes", prop, group) {
+               if (function) {
+                       err = pinctrl_utils_add_map_mux(padctl->pinctrl, maps,
+                                       reserved_maps, num_maps, group,
+                                       function);
+                       if (err < 0)
+                               return err;
+               }
+
+               if (num_configs) {
+                       err = pinctrl_utils_add_map_configs(padctl->pinctrl,
+                                       maps, reserved_maps, num_maps, group,
+                                       configs, num_configs,
+                                       PIN_MAP_TYPE_CONFIGS_GROUP);
+                       if (err < 0)
+                               return err;
+               }
+       }
+
+       return 0;
+}
+
+static int tegra_xusb_padctl_dt_node_to_map(struct pinctrl_dev *pinctrl,
+                                           struct device_node *parent,
+                                           struct pinctrl_map **maps,
+                                           unsigned int *num_maps)
+{
+       struct tegra_xusb_padctl *padctl = pinctrl_dev_get_drvdata(pinctrl);
+       unsigned int reserved_maps = 0;
+       struct device_node *np;
+       int err;
+
+       *num_maps = 0;
+       *maps = NULL;
+
+       for_each_child_of_node(parent, np) {
+               err = tegra_xusb_padctl_parse_subnode(padctl, np, maps,
+                                                     &reserved_maps,
+                                                     num_maps);
+               if (err < 0)
+                       return err;
+       }
+
+       return 0;
+}
+
+static const struct pinctrl_ops tegra_xusb_padctl_pinctrl_ops = {
+       .get_groups_count = tegra_xusb_padctl_get_groups_count,
+       .get_group_name = tegra_xusb_padctl_get_group_name,
+       .dt_node_to_map = tegra_xusb_padctl_dt_node_to_map,
+       .dt_free_map = pinctrl_utils_dt_free_map,
+};
+
+static int tegra_xusb_padctl_get_functions_count(struct pinctrl_dev *pinctrl)
+{
+       struct tegra_xusb_padctl *padctl = pinctrl_dev_get_drvdata(pinctrl);
+
+       return padctl->soc->num_functions;
+}
+
+static const char *
+tegra_xusb_padctl_get_function_name(struct pinctrl_dev *pinctrl,
+                                   unsigned int function)
+{
+       struct tegra_xusb_padctl *padctl = pinctrl_dev_get_drvdata(pinctrl);
+
+       return padctl->soc->functions[function].name;
+}
+
+static int tegra_xusb_padctl_get_function_groups(struct pinctrl_dev *pinctrl,
+                                                unsigned int function,
+                                                const char * const **groups,
+                                                unsigned * const num_groups)
+{
+       struct tegra_xusb_padctl *padctl = pinctrl_dev_get_drvdata(pinctrl);
+
+       *num_groups = padctl->soc->functions[function].num_groups;
+       *groups = padctl->soc->functions[function].groups;
+
+       return 0;
+}
+
+static int tegra_xusb_padctl_pinmux_enable(struct pinctrl_dev *pinctrl,
+                                          unsigned int function,
+                                          unsigned int group)
+{
+       struct tegra_xusb_padctl *padctl = pinctrl_dev_get_drvdata(pinctrl);
+       const struct tegra_xusb_padctl_lane *lane;
+       unsigned int i;
+       u32 value;
+
+       lane = &padctl->soc->lanes[group];
+
+       for (i = 0; i < lane->num_funcs; i++)
+               if (lane->funcs[i] == function)
+                       break;
+
+       if (i >= lane->num_funcs)
+               return -EINVAL;
+
+       value = padctl_readl(padctl, lane->offset);
+       value &= ~(lane->mask << lane->shift);
+       value |= i << lane->shift;
+       padctl_writel(padctl, value, lane->offset);
+
+       return 0;
+}
+
+static const struct pinmux_ops tegra_xusb_padctl_pinmux_ops = {
+       .get_functions_count = tegra_xusb_padctl_get_functions_count,
+       .get_function_name = tegra_xusb_padctl_get_function_name,
+       .get_function_groups = tegra_xusb_padctl_get_function_groups,
+       .enable = tegra_xusb_padctl_pinmux_enable,
+};
+
+static int tegra_xusb_padctl_pinconf_group_get(struct pinctrl_dev *pinctrl,
+                                              unsigned int group,
+                                              unsigned long *config)
+{
+       struct tegra_xusb_padctl *padctl = pinctrl_dev_get_drvdata(pinctrl);
+       const struct tegra_xusb_padctl_lane *lane;
+       enum tegra_xusb_padctl_param param;
+       u32 value;
+
+       param = TEGRA_XUSB_PADCTL_UNPACK_PARAM(*config);
+       lane = &padctl->soc->lanes[group];
+
+       switch (param) {
+       case TEGRA_XUSB_PADCTL_IDDQ:
+               /* lanes with iddq == 0 don't support this parameter */
+               if (lane->iddq == 0)
+                       return -EINVAL;
+
+               value = padctl_readl(padctl, lane->offset);
+
+               if (value & BIT(lane->iddq))
+                       value = 0;
+               else
+                       value = 1;
+
+               *config = TEGRA_XUSB_PADCTL_PACK(param, value);
+               break;
+
+       default:
+               dev_err(padctl->dev, "invalid configuration parameter: %04x\n",
+                       param);
+               return -ENOTSUPP;
+       }
+
+       return 0;
+}
+
+static int tegra_xusb_padctl_pinconf_group_set(struct pinctrl_dev *pinctrl,
+                                              unsigned int group,
+                                              unsigned long *configs,
+                                              unsigned int num_configs)
+{
+       struct tegra_xusb_padctl *padctl = pinctrl_dev_get_drvdata(pinctrl);
+       const struct tegra_xusb_padctl_lane *lane;
+       enum tegra_xusb_padctl_param param;
+       unsigned long value;
+       unsigned int i;
+       u32 regval;
+
+       lane = &padctl->soc->lanes[group];
+
+       for (i = 0; i < num_configs; i++) {
+               param = TEGRA_XUSB_PADCTL_UNPACK_PARAM(configs[i]);
+               value = TEGRA_XUSB_PADCTL_UNPACK_VALUE(configs[i]);
+
+               switch (param) {
+               case TEGRA_XUSB_PADCTL_IDDQ:
+                       /* lanes with iddq == 0 don't support this parameter */
+                       if (lane->iddq == 0)
+                               return -EINVAL;
+
+                       regval = padctl_readl(padctl, lane->offset);
+
+                       if (value)
+                               regval &= ~BIT(lane->iddq);
+                       else
+                               regval |= BIT(lane->iddq);
+
+                       padctl_writel(padctl, regval, lane->offset);
+                       break;
+
+               default:
+                       dev_err(padctl->dev,
+                               "invalid configuration parameter: %04x\n",
+                               param);
+                       return -ENOTSUPP;
+               }
+       }
+
+       return 0;
+}
+
+#ifdef CONFIG_DEBUG_FS
+static const char *strip_prefix(const char *s)
+{
+       const char *comma = strchr(s, ',');
+       if (!comma)
+               return s;
+
+       return comma + 1;
+}
+
+static void
+tegra_xusb_padctl_pinconf_group_dbg_show(struct pinctrl_dev *pinctrl,
+                                        struct seq_file *s,
+                                        unsigned int group)
+{
+       unsigned int i;
+
+       for (i = 0; i < ARRAY_SIZE(properties); i++) {
+               unsigned long config, value;
+               int err;
+
+               config = TEGRA_XUSB_PADCTL_PACK(properties[i].param, 0);
+
+               err = tegra_xusb_padctl_pinconf_group_get(pinctrl, group,
+                                                         &config);
+               if (err < 0)
+                       continue;
+
+               value = TEGRA_XUSB_PADCTL_UNPACK_VALUE(config);
+
+               seq_printf(s, "\n\t%s=%lu\n", strip_prefix(properties[i].name),
+                          value);
+       }
+}
+
+static void
+tegra_xusb_padctl_pinconf_config_dbg_show(struct pinctrl_dev *pinctrl,
+                                         struct seq_file *s,
+                                         unsigned long config)
+{
+       enum tegra_xusb_padctl_param param;
+       const char *name = "unknown";
+       unsigned long value;
+       unsigned int i;
+
+       param = TEGRA_XUSB_PADCTL_UNPACK_PARAM(config);
+       value = TEGRA_XUSB_PADCTL_UNPACK_VALUE(config);
+
+       for (i = 0; i < ARRAY_SIZE(properties); i++) {
+               if (properties[i].param == param) {
+                       name = properties[i].name;
+                       break;
+               }
+       }
+
+       seq_printf(s, "%s=%lu", strip_prefix(name), value);
+}
+#endif
+
+static const struct pinconf_ops tegra_xusb_padctl_pinconf_ops = {
+       .pin_config_group_get = tegra_xusb_padctl_pinconf_group_get,
+       .pin_config_group_set = tegra_xusb_padctl_pinconf_group_set,
+#ifdef CONFIG_DEBUG_FS
+       .pin_config_group_dbg_show = tegra_xusb_padctl_pinconf_group_dbg_show,
+       .pin_config_config_dbg_show = tegra_xusb_padctl_pinconf_config_dbg_show,
+#endif
+};
+
+static int tegra_xusb_padctl_enable(struct tegra_xusb_padctl *padctl)
+{
+       u32 value;
+
+       mutex_lock(&padctl->lock);
+
+       if (padctl->enable++ > 0)
+               goto out;
+
+       value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
+       value &= ~XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN;
+       padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
+
+       usleep_range(100, 200);
+
+       value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
+       value &= ~XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN_EARLY;
+       padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
+
+       usleep_range(100, 200);
+
+       value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
+       value &= ~XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_VCORE_DOWN;
+       padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
+
+out:
+       mutex_unlock(&padctl->lock);
+       return 0;
+}
+
+static int tegra_xusb_padctl_disable(struct tegra_xusb_padctl *padctl)
+{
+       u32 value;
+
+       mutex_lock(&padctl->lock);
+
+       if (WARN_ON(padctl->enable == 0))
+               goto out;
+
+       if (--padctl->enable > 0)
+               goto out;
+
+       value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
+       value |= XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_VCORE_DOWN;
+       padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
+
+       usleep_range(100, 200);
+
+       value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
+       value |= XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN_EARLY;
+       padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
+
+       usleep_range(100, 200);
+
+       value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
+       value |= XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN;
+       padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
+
+out:
+       mutex_unlock(&padctl->lock);
+       return 0;
+}
+
+static int tegra_xusb_phy_init(struct phy *phy)
+{
+       struct tegra_xusb_padctl *padctl = phy_get_drvdata(phy);
+
+       return tegra_xusb_padctl_enable(padctl);
+}
+
+static int tegra_xusb_phy_exit(struct phy *phy)
+{
+       struct tegra_xusb_padctl *padctl = phy_get_drvdata(phy);
+
+       return tegra_xusb_padctl_disable(padctl);
+}
+
+static int pcie_phy_power_on(struct phy *phy)
+{
+       struct tegra_xusb_padctl *padctl = phy_get_drvdata(phy);
+       unsigned long timeout;
+       int err = -ETIMEDOUT;
+       u32 value;
+
+       value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_P0_CTL1);
+       value &= ~XUSB_PADCTL_IOPHY_PLL_P0_CTL1_REFCLK_SEL_MASK;
+       padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_P0_CTL1);
+
+       value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_P0_CTL2);
+       value |= XUSB_PADCTL_IOPHY_PLL_P0_CTL2_REFCLKBUF_EN |
+                XUSB_PADCTL_IOPHY_PLL_P0_CTL2_TXCLKREF_EN |
+                XUSB_PADCTL_IOPHY_PLL_P0_CTL2_TXCLKREF_SEL;
+       padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_P0_CTL2);
+
+       value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_P0_CTL1);
+       value |= XUSB_PADCTL_IOPHY_PLL_P0_CTL1_PLL_RST;
+       padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_P0_CTL1);
+
+       timeout = jiffies + msecs_to_jiffies(50);
+
+       while (time_before(jiffies, timeout)) {
+               value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_P0_CTL1);
+               if (value & XUSB_PADCTL_IOPHY_PLL_P0_CTL1_PLL0_LOCKDET) {
+                       err = 0;
+                       break;
+               }
+
+               usleep_range(100, 200);
+       }
+
+       return err;
+}
+
+static int pcie_phy_power_off(struct phy *phy)
+{
+       struct tegra_xusb_padctl *padctl = phy_get_drvdata(phy);
+       u32 value;
+
+       value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_P0_CTL1);
+       value &= ~XUSB_PADCTL_IOPHY_PLL_P0_CTL1_PLL_RST;
+       padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_P0_CTL1);
+
+       return 0;
+}
+
+static const struct phy_ops pcie_phy_ops = {
+       .init = tegra_xusb_phy_init,
+       .exit = tegra_xusb_phy_exit,
+       .power_on = pcie_phy_power_on,
+       .power_off = pcie_phy_power_off,
+       .owner = THIS_MODULE,
+};
+
+static int sata_phy_power_on(struct phy *phy)
+{
+       struct tegra_xusb_padctl *padctl = phy_get_drvdata(phy);
+       unsigned long timeout;
+       int err = -ETIMEDOUT;
+       u32 value;
+
+       value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1);
+       value &= ~XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ_OVRD;
+       value &= ~XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ;
+       padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1);
+
+       value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
+       value &= ~XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_PWR_OVRD;
+       value &= ~XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_IDDQ;
+       padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
+
+       value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
+       value |= XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL1_MODE;
+       padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
+
+       value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
+       value |= XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_RST;
+       padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
+
+       timeout = jiffies + msecs_to_jiffies(50);
+
+       while (time_before(jiffies, timeout)) {
+               value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
+               if (value & XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL1_LOCKDET) {
+                       err = 0;
+                       break;
+               }
+
+               usleep_range(100, 200);
+       }
+
+       return err;
+}
+
+static int sata_phy_power_off(struct phy *phy)
+{
+       struct tegra_xusb_padctl *padctl = phy_get_drvdata(phy);
+       u32 value;
+
+       value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
+       value &= ~XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_RST;
+       padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
+
+       value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
+       value &= ~XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL1_MODE;
+       padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
+
+       value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
+       value |= XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_PWR_OVRD;
+       value |= XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_IDDQ;
+       padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
+
+       value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1);
+       value |= ~XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ_OVRD;
+       value |= ~XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ;
+       padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1);
+
+       return 0;
+}
+
+static const struct phy_ops sata_phy_ops = {
+       .init = tegra_xusb_phy_init,
+       .exit = tegra_xusb_phy_exit,
+       .power_on = sata_phy_power_on,
+       .power_off = sata_phy_power_off,
+       .owner = THIS_MODULE,
+};
+
+static struct phy *tegra_xusb_padctl_xlate(struct device *dev,
+                                          struct of_phandle_args *args)
+{
+       struct tegra_xusb_padctl *padctl = dev_get_drvdata(dev);
+       unsigned int index = args->args[0];
+
+       if (args->args_count <= 0)
+               return ERR_PTR(-EINVAL);
+
+       if (index > ARRAY_SIZE(padctl->phys))
+               return ERR_PTR(-EINVAL);
+
+       return padctl->phys[index];
+}
+
+#define PIN_OTG_0   0
+#define PIN_OTG_1   1
+#define PIN_OTG_2   2
+#define PIN_ULPI_0  3
+#define PIN_HSIC_0  4
+#define PIN_HSIC_1  5
+#define PIN_PCIE_0  6
+#define PIN_PCIE_1  7
+#define PIN_PCIE_2  8
+#define PIN_PCIE_3  9
+#define PIN_PCIE_4 10
+#define PIN_SATA_0 11
+
+static const struct pinctrl_pin_desc tegra124_pins[] = {
+       PINCTRL_PIN(PIN_OTG_0,  "otg-0"),
+       PINCTRL_PIN(PIN_OTG_1,  "otg-1"),
+       PINCTRL_PIN(PIN_OTG_2,  "otg-2"),
+       PINCTRL_PIN(PIN_ULPI_0, "ulpi-0"),
+       PINCTRL_PIN(PIN_HSIC_0, "hsic-0"),
+       PINCTRL_PIN(PIN_HSIC_1, "hsic-1"),
+       PINCTRL_PIN(PIN_PCIE_0, "pcie-0"),
+       PINCTRL_PIN(PIN_PCIE_1, "pcie-1"),
+       PINCTRL_PIN(PIN_PCIE_2, "pcie-2"),
+       PINCTRL_PIN(PIN_PCIE_3, "pcie-3"),
+       PINCTRL_PIN(PIN_PCIE_4, "pcie-4"),
+       PINCTRL_PIN(PIN_SATA_0, "sata-0"),
+};
+
+static const char * const tegra124_snps_groups[] = {
+       "otg-0",
+       "otg-1",
+       "otg-2",
+       "ulpi-0",
+       "hsic-0",
+       "hsic-1",
+};
+
+static const char * const tegra124_xusb_groups[] = {
+       "otg-0",
+       "otg-1",
+       "otg-2",
+       "ulpi-0",
+       "hsic-0",
+       "hsic-1",
+};
+
+static const char * const tegra124_uart_groups[] = {
+       "otg-0",
+       "otg-1",
+       "otg-2",
+};
+
+static const char * const tegra124_pcie_groups[] = {
+       "pcie-0",
+       "pcie-1",
+       "pcie-2",
+       "pcie-3",
+       "pcie-4",
+       "sata-0",
+};
+
+static const char * const tegra124_usb3_groups[] = {
+       "pcie-0",
+       "pcie-1",
+       "pcie-2",
+       "pcie-3",
+       "pcie-4",
+       "sata-0",
+};
+
+static const char * const tegra124_sata_groups[] = {
+       "pcie-0",
+       "pcie-1",
+       "pcie-2",
+       "pcie-3",
+       "pcie-4",
+       "sata-0",
+};
+
+static const char * const tegra124_rsvd_groups[] = {
+       "otg-0",
+       "otg-1",
+       "otg-2",
+       "pcie-0",
+       "pcie-1",
+       "pcie-2",
+       "pcie-3",
+       "pcie-4",
+       "sata-0",
+};
+
+#define TEGRA124_FUNCTION(_name)                                       \
+       {                                                               \
+               .name = #_name,                                         \
+               .num_groups = ARRAY_SIZE(tegra124_##_name##_groups),    \
+               .groups = tegra124_##_name##_groups,                    \
+       }
+
+static struct tegra_xusb_padctl_function tegra124_functions[] = {
+       TEGRA124_FUNCTION(snps),
+       TEGRA124_FUNCTION(xusb),
+       TEGRA124_FUNCTION(uart),
+       TEGRA124_FUNCTION(pcie),
+       TEGRA124_FUNCTION(usb3),
+       TEGRA124_FUNCTION(sata),
+       TEGRA124_FUNCTION(rsvd),
+};
+
+enum tegra124_function {
+       TEGRA124_FUNC_SNPS,
+       TEGRA124_FUNC_XUSB,
+       TEGRA124_FUNC_UART,
+       TEGRA124_FUNC_PCIE,
+       TEGRA124_FUNC_USB3,
+       TEGRA124_FUNC_SATA,
+       TEGRA124_FUNC_RSVD,
+};
+
+static const unsigned int tegra124_otg_functions[] = {
+       TEGRA124_FUNC_SNPS,
+       TEGRA124_FUNC_XUSB,
+       TEGRA124_FUNC_UART,
+       TEGRA124_FUNC_RSVD,
+};
+
+static const unsigned int tegra124_usb_functions[] = {
+       TEGRA124_FUNC_SNPS,
+       TEGRA124_FUNC_XUSB,
+};
+
+static const unsigned int tegra124_pci_functions[] = {
+       TEGRA124_FUNC_PCIE,
+       TEGRA124_FUNC_USB3,
+       TEGRA124_FUNC_SATA,
+       TEGRA124_FUNC_RSVD,
+};
+
+#define TEGRA124_LANE(_name, _offset, _shift, _mask, _iddq, _funcs)    \
+       {                                                               \
+               .name = _name,                                          \
+               .offset = _offset,                                      \
+               .shift = _shift,                                        \
+               .mask = _mask,                                          \
+               .iddq = _iddq,                                          \
+               .num_funcs = ARRAY_SIZE(tegra124_##_funcs##_functions), \
+               .funcs = tegra124_##_funcs##_functions,                 \
+       }
+
+static const struct tegra_xusb_padctl_lane tegra124_lanes[] = {
+       TEGRA124_LANE("otg-0",  0x004,  0, 0x3, 0, otg),
+       TEGRA124_LANE("otg-1",  0x004,  2, 0x3, 0, otg),
+       TEGRA124_LANE("otg-2",  0x004,  4, 0x3, 0, otg),
+       TEGRA124_LANE("ulpi-0", 0x004, 12, 0x1, 0, usb),
+       TEGRA124_LANE("hsic-0", 0x004, 14, 0x1, 0, usb),
+       TEGRA124_LANE("hsic-1", 0x004, 15, 0x1, 0, usb),
+       TEGRA124_LANE("pcie-0", 0x134, 16, 0x3, 1, pci),
+       TEGRA124_LANE("pcie-1", 0x134, 18, 0x3, 2, pci),
+       TEGRA124_LANE("pcie-2", 0x134, 20, 0x3, 3, pci),
+       TEGRA124_LANE("pcie-3", 0x134, 22, 0x3, 4, pci),
+       TEGRA124_LANE("pcie-4", 0x134, 24, 0x3, 5, pci),
+       TEGRA124_LANE("sata-0", 0x134, 26, 0x3, 6, pci),
+};
+
+static const struct tegra_xusb_padctl_soc tegra124_soc = {
+       .num_pins = ARRAY_SIZE(tegra124_pins),
+       .pins = tegra124_pins,
+       .num_functions = ARRAY_SIZE(tegra124_functions),
+       .functions = tegra124_functions,
+       .num_lanes = ARRAY_SIZE(tegra124_lanes),
+       .lanes = tegra124_lanes,
+};
+
+static const struct of_device_id tegra_xusb_padctl_of_match[] = {
+       { .compatible = "nvidia,tegra124-xusb-padctl", .data = &tegra124_soc },
+       { }
+};
+MODULE_DEVICE_TABLE(of, tegra_xusb_padctl_of_match);
+
+static int tegra_xusb_padctl_probe(struct platform_device *pdev)
+{
+       struct tegra_xusb_padctl *padctl;
+       const struct of_device_id *match;
+       struct resource *res;
+       struct phy *phy;
+       int err;
+
+       padctl = devm_kzalloc(&pdev->dev, sizeof(*padctl), GFP_KERNEL);
+       if (!padctl)
+               return -ENOMEM;
+
+       platform_set_drvdata(pdev, padctl);
+       mutex_init(&padctl->lock);
+       padctl->dev = &pdev->dev;
+
+       match = of_match_node(tegra_xusb_padctl_of_match, pdev->dev.of_node);
+       padctl->soc = match->data;
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       padctl->regs = devm_ioremap_resource(&pdev->dev, res);
+       if (IS_ERR(padctl->regs))
+               return PTR_ERR(padctl->regs);
+
+       padctl->rst = devm_reset_control_get(&pdev->dev, NULL);
+       if (IS_ERR(padctl->rst))
+               return PTR_ERR(padctl->rst);
+
+       err = reset_control_deassert(padctl->rst);
+       if (err < 0)
+               return err;
+
+       memset(&padctl->desc, 0, sizeof(padctl->desc));
+       padctl->desc.name = dev_name(padctl->dev);
+       padctl->desc.pctlops = &tegra_xusb_padctl_pinctrl_ops;
+       padctl->desc.pmxops = &tegra_xusb_padctl_pinmux_ops;
+       padctl->desc.confops = &tegra_xusb_padctl_pinconf_ops;
+       padctl->desc.owner = THIS_MODULE;
+
+       padctl->pinctrl = pinctrl_register(&padctl->desc, &pdev->dev, padctl);
+       if (!padctl->pinctrl) {
+               dev_err(&pdev->dev, "failed to register pincontrol\n");
+               err = -ENODEV;
+               goto reset;
+       }
+
+       phy = devm_phy_create(&pdev->dev, NULL, &pcie_phy_ops, NULL);
+       if (IS_ERR(phy)) {
+               err = PTR_ERR(phy);
+               goto unregister;
+       }
+
+       padctl->phys[TEGRA_XUSB_PADCTL_PCIE] = phy;
+       phy_set_drvdata(phy, padctl);
+
+       phy = devm_phy_create(&pdev->dev, NULL, &sata_phy_ops, NULL);
+       if (IS_ERR(phy)) {
+               err = PTR_ERR(phy);
+               goto unregister;
+       }
+
+       padctl->phys[TEGRA_XUSB_PADCTL_SATA] = phy;
+       phy_set_drvdata(phy, padctl);
+
+       padctl->provider = devm_of_phy_provider_register(&pdev->dev,
+                                                        tegra_xusb_padctl_xlate);
+       if (err < 0) {
+               dev_err(&pdev->dev, "failed to register PHYs: %d\n", err);
+               goto unregister;
+       }
+
+       return 0;
+
+unregister:
+       pinctrl_unregister(padctl->pinctrl);
+reset:
+       reset_control_assert(padctl->rst);
+       return err;
+}
+
+static int tegra_xusb_padctl_remove(struct platform_device *pdev)
+{
+       struct tegra_xusb_padctl *padctl = platform_get_drvdata(pdev);
+       int err;
+
+       pinctrl_unregister(padctl->pinctrl);
+
+       err = reset_control_assert(padctl->rst);
+       if (err < 0)
+               dev_err(&pdev->dev, "failed to assert reset: %d\n", err);
+
+       return err;
+}
+
+static struct platform_driver tegra_xusb_padctl_driver = {
+       .driver = {
+               .name = "tegra-xusb-padctl",
+               .of_match_table = tegra_xusb_padctl_of_match,
+       },
+       .probe = tegra_xusb_padctl_probe,
+       .remove = tegra_xusb_padctl_remove,
+};
+module_platform_driver(tegra_xusb_padctl_driver);
+
+MODULE_AUTHOR("Thierry Reding <treding@nvidia.com>");
+MODULE_DESCRIPTION("Tegra 124 XUSB Pad Control driver");
+MODULE_LICENSE("GPL v2");
index 2d43bff74f59bd98d33cb61f4d456849b6718f1c..150af5503c093015dd4d425ca81d64780fc3358a 100644 (file)
@@ -290,24 +290,11 @@ static int tegra_pinctrl_enable(struct pinctrl_dev *pctldev, unsigned function,
        return 0;
 }
 
-static void tegra_pinctrl_disable(struct pinctrl_dev *pctldev,
-                                 unsigned function, unsigned group)
-{
-       struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
-       const struct tegra_pingroup *g;
-
-       g = &pmx->soc->groups[group];
-
-       if (WARN_ON(g->mux_reg < 0))
-               return;
-}
-
 static const struct pinmux_ops tegra_pinmux_ops = {
        .get_functions_count = tegra_pinctrl_get_funcs_count,
        .get_function_name = tegra_pinctrl_get_func_name,
        .get_function_groups = tegra_pinctrl_get_func_groups,
        .enable = tegra_pinctrl_enable,
-       .disable = tegra_pinctrl_disable,
 };
 
 static int tegra_pinconf_reg(struct tegra_pmx *pmx,
index 5bf01c28925ea4e8d0725a43c06a480e0ed0e946..41e81a35cabb07b43a8372210f0bfe6f29be2aa5 100644 (file)
@@ -574,33 +574,6 @@ static int tz1090_pdc_pinctrl_enable(struct pinctrl_dev *pctldev,
        return 0;
 }
 
-static void tz1090_pdc_pinctrl_disable(struct pinctrl_dev *pctldev,
-                                      unsigned int function,
-                                      unsigned int group)
-{
-       struct tz1090_pdc_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
-       const struct tz1090_pdc_pingroup *grp = &tz1090_pdc_groups[group];
-
-       dev_dbg(pctldev->dev, "%s(func=%u (%s), group=%u (%s))\n",
-               __func__,
-               function, tz1090_pdc_functions[function].name,
-               group, tz1090_pdc_groups[group].name);
-
-       /* is it even a mux? */
-       if (grp->drv)
-               return;
-
-       /* does this group even control the function? */
-       if (function != grp->func)
-               return;
-
-       /* record the pin being unmuxed and update mux bit */
-       spin_lock(&pmx->lock);
-       pmx->mux_en &= ~BIT(grp->pins[0]);
-       tz1090_pdc_pinctrl_mux(pmx, grp);
-       spin_unlock(&pmx->lock);
-}
-
 static const struct tz1090_pdc_pingroup *find_mux_group(
                                                struct tz1090_pdc_pmx *pmx,
                                                unsigned int pin)
@@ -662,7 +635,6 @@ static struct pinmux_ops tz1090_pdc_pinmux_ops = {
        .get_function_name      = tz1090_pdc_pinctrl_get_func_name,
        .get_function_groups    = tz1090_pdc_pinctrl_get_func_groups,
        .enable                 = tz1090_pdc_pinctrl_enable,
-       .disable                = tz1090_pdc_pinctrl_disable,
        .gpio_request_enable    = tz1090_pdc_pinctrl_gpio_request_enable,
        .gpio_disable_free      = tz1090_pdc_pinctrl_gpio_disable_free,
 };
index bc9cd7a7602ea30d930d099519b8dfbb3590742a..24082216842e5e69379dd575a7e0350ecbeab9d0 100644 (file)
@@ -1478,63 +1478,6 @@ mux_pins:
        return 0;
 }
 
-/**
- * tz1090_pinctrl_disable() - Disable a function on a pin group.
- * @pctldev:           Pin control data
- * @function:          Function index to disable
- * @group:             Group index to disable
- *
- * Disable a particular function on a group of pins. The per GPIO pin pseudo pin
- * groups can be used (in which case the pin will be taken out of peripheral
- * mode. Some convenience pin groups can also be used in which case the effect
- * is the same as enabling the function on each individual pin in the group.
- */
-static void tz1090_pinctrl_disable(struct pinctrl_dev *pctldev,
-                                  unsigned int function, unsigned int group)
-{
-       struct tz1090_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
-       struct tz1090_pingroup *grp;
-       unsigned int pin_num, mux_group, i, npins;
-       const unsigned int *pins;
-
-       /* group of pins? */
-       if (group < ARRAY_SIZE(tz1090_groups)) {
-               grp = &tz1090_groups[group];
-               npins = grp->npins;
-               pins = grp->pins;
-               /*
-                * All pins in the group must belong to the same mux group,
-                * which allows us to just use the mux group of the first pin.
-                * By explicitly listing permitted pingroups for each function
-                * the pinmux core should ensure this is always the case.
-                */
-       } else {
-               pin_num = group - ARRAY_SIZE(tz1090_groups);
-               npins = 1;
-               pins = &pin_num;
-       }
-       mux_group = tz1090_mux_pins[*pins];
-
-       /* no mux group, but can still be individually muxed to peripheral */
-       if (mux_group >= TZ1090_MUX_GROUP_MAX) {
-               if (function == TZ1090_MUX_PERIP)
-                       goto unmux_pins;
-               return;
-       }
-
-       /* mux group already set to a different function? */
-       grp = &tz1090_mux_groups[mux_group];
-       dev_dbg(pctldev->dev, "%s: unmuxing %u pin(s) in '%s' from '%s'\n",
-               __func__, npins, grp->name, tz1090_functions[function].name);
-
-       /* subtract pins from ref count and unmux individually */
-       WARN_ON(grp->func_count < npins);
-       grp->func_count -= npins;
-unmux_pins:
-       for (i = 0; i < npins; ++i)
-               tz1090_pinctrl_perip_select(pmx, pins[i], false);
-}
-
 /**
  * tz1090_pinctrl_gpio_request_enable() - Put pin in GPIO mode.
  * @pctldev:           Pin control data
@@ -1575,7 +1518,6 @@ static struct pinmux_ops tz1090_pinmux_ops = {
        .get_function_name      = tz1090_pinctrl_get_func_name,
        .get_function_groups    = tz1090_pinctrl_get_func_groups,
        .enable                 = tz1090_pinctrl_enable,
-       .disable                = tz1090_pinctrl_disable,
        .gpio_request_enable    = tz1090_pinctrl_gpio_request_enable,
        .gpio_disable_free      = tz1090_pinctrl_gpio_disable_free,
 };
index 209a01b8bd3b84d9cbe2071a8007ef1caf7b3f0f..0959bb36450f79c09b7446e474aeedfac8014536 100644 (file)
@@ -970,19 +970,6 @@ static int u300_pmx_enable(struct pinctrl_dev *pctldev, unsigned selector,
        return 0;
 }
 
-static void u300_pmx_disable(struct pinctrl_dev *pctldev, unsigned selector,
-                            unsigned group)
-{
-       struct u300_pmx *upmx;
-
-       /* There is nothing to do with the power pins */
-       if (selector == 0)
-               return;
-
-       upmx = pinctrl_dev_get_drvdata(pctldev);
-       u300_pmx_endisable(upmx, selector, false);
-}
-
 static int u300_pmx_get_funcs_count(struct pinctrl_dev *pctldev)
 {
        return ARRAY_SIZE(u300_pmx_functions);
@@ -1008,7 +995,6 @@ static const struct pinmux_ops u300_pmx_ops = {
        .get_function_name = u300_pmx_get_func_name,
        .get_function_groups = u300_pmx_get_groups,
        .enable = u300_pmx_enable,
-       .disable = u300_pmx_disable,
 };
 
 static int u300_pin_config_get(struct pinctrl_dev *pctldev, unsigned pin,
index 051e8592990e9c9824563f8af789af05b1a5fdbf..c055daf9a80f0507e3e1004d648aa0e5131da8d4 100644 (file)
@@ -471,7 +471,6 @@ void pinmux_disable_setting(struct pinctrl_setting const *setting)
 {
        struct pinctrl_dev *pctldev = setting->pctldev;
        const struct pinctrl_ops *pctlops = pctldev->desc->pctlops;
-       const struct pinmux_ops *ops = pctldev->desc->pmxops;
        int ret = 0;
        const unsigned *pins = NULL;
        unsigned num_pins = 0;
@@ -518,9 +517,6 @@ void pinmux_disable_setting(struct pinctrl_setting const *setting)
                                 pins[i], desc->name, gname);
                }
        }
-
-       if (ops->disable)
-               ops->disable(pctldev, setting->data.mux.func, setting->data.mux.group);
 }
 
 #ifdef CONFIG_DEBUG_FS
diff --git a/drivers/pinctrl/qcom/Kconfig b/drivers/pinctrl/qcom/Kconfig
new file mode 100644 (file)
index 0000000..d160a71
--- /dev/null
@@ -0,0 +1,42 @@
+if (ARCH_QCOM || COMPILE_TEST)
+
+config PINCTRL_MSM
+       bool
+       select PINMUX
+       select PINCONF
+       select GENERIC_PINCONF
+       select GPIOLIB_IRQCHIP
+
+config PINCTRL_APQ8064
+       tristate "Qualcomm APQ8064 pin controller driver"
+       depends on GPIOLIB && OF
+       select PINCTRL_MSM
+       help
+         This is the pinctrl, pinmux, pinconf and gpiolib driver for the
+         Qualcomm TLMM block found in the Qualcomm APQ8064 platform.
+
+config PINCTRL_IPQ8064
+       tristate "Qualcomm IPQ8064 pin controller driver"
+       depends on GPIOLIB && OF
+       select PINCTRL_MSM
+       help
+         This is the pinctrl, pinmux, pinconf and gpiolib driver for the
+         Qualcomm TLMM block found in the Qualcomm IPQ8064 platform.
+
+config PINCTRL_MSM8960
+       tristate "Qualcomm 8960 pin controller driver"
+       depends on GPIOLIB && OF
+       select PINCTRL_MSM
+       help
+         This is the pinctrl, pinmux, pinconf and gpiolib driver for the
+         Qualcomm TLMM block found in the Qualcomm 8960 platform.
+
+config PINCTRL_MSM8X74
+       tristate "Qualcomm 8x74 pin controller driver"
+       depends on GPIOLIB && OF
+       select PINCTRL_MSM
+       help
+         This is the pinctrl, pinmux, pinconf and gpiolib driver for the
+         Qualcomm TLMM block found in the Qualcomm 8974 platform.
+
+endif
diff --git a/drivers/pinctrl/qcom/Makefile b/drivers/pinctrl/qcom/Makefile
new file mode 100644 (file)
index 0000000..2a02602
--- /dev/null
@@ -0,0 +1,6 @@
+# Qualcomm pin control drivers
+obj-$(CONFIG_PINCTRL_MSM)      += pinctrl-msm.o
+obj-$(CONFIG_PINCTRL_APQ8064)  += pinctrl-apq8064.o
+obj-$(CONFIG_PINCTRL_IPQ8064)  += pinctrl-ipq8064.o
+obj-$(CONFIG_PINCTRL_MSM8960)  += pinctrl-msm8960.o
+obj-$(CONFIG_PINCTRL_MSM8X74)  += pinctrl-msm8x74.o
diff --git a/drivers/pinctrl/qcom/pinctrl-apq8064.c b/drivers/pinctrl/qcom/pinctrl-apq8064.c
new file mode 100644 (file)
index 0000000..feb6f15
--- /dev/null
@@ -0,0 +1,630 @@
+/*
+ * Copyright (c) 2014, Sony Mobile Communications AB.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/pinctrl/pinctrl.h>
+
+#include "pinctrl-msm.h"
+
+static const struct pinctrl_pin_desc apq8064_pins[] = {
+       PINCTRL_PIN(0, "GPIO_0"),
+       PINCTRL_PIN(1, "GPIO_1"),
+       PINCTRL_PIN(2, "GPIO_2"),
+       PINCTRL_PIN(3, "GPIO_3"),
+       PINCTRL_PIN(4, "GPIO_4"),
+       PINCTRL_PIN(5, "GPIO_5"),
+       PINCTRL_PIN(6, "GPIO_6"),
+       PINCTRL_PIN(7, "GPIO_7"),
+       PINCTRL_PIN(8, "GPIO_8"),
+       PINCTRL_PIN(9, "GPIO_9"),
+       PINCTRL_PIN(10, "GPIO_10"),
+       PINCTRL_PIN(11, "GPIO_11"),
+       PINCTRL_PIN(12, "GPIO_12"),
+       PINCTRL_PIN(13, "GPIO_13"),
+       PINCTRL_PIN(14, "GPIO_14"),
+       PINCTRL_PIN(15, "GPIO_15"),
+       PINCTRL_PIN(16, "GPIO_16"),
+       PINCTRL_PIN(17, "GPIO_17"),
+       PINCTRL_PIN(18, "GPIO_18"),
+       PINCTRL_PIN(19, "GPIO_19"),
+       PINCTRL_PIN(20, "GPIO_20"),
+       PINCTRL_PIN(21, "GPIO_21"),
+       PINCTRL_PIN(22, "GPIO_22"),
+       PINCTRL_PIN(23, "GPIO_23"),
+       PINCTRL_PIN(24, "GPIO_24"),
+       PINCTRL_PIN(25, "GPIO_25"),
+       PINCTRL_PIN(26, "GPIO_26"),
+       PINCTRL_PIN(27, "GPIO_27"),
+       PINCTRL_PIN(28, "GPIO_28"),
+       PINCTRL_PIN(29, "GPIO_29"),
+       PINCTRL_PIN(30, "GPIO_30"),
+       PINCTRL_PIN(31, "GPIO_31"),
+       PINCTRL_PIN(32, "GPIO_32"),
+       PINCTRL_PIN(33, "GPIO_33"),
+       PINCTRL_PIN(34, "GPIO_34"),
+       PINCTRL_PIN(35, "GPIO_35"),
+       PINCTRL_PIN(36, "GPIO_36"),
+       PINCTRL_PIN(37, "GPIO_37"),
+       PINCTRL_PIN(38, "GPIO_38"),
+       PINCTRL_PIN(39, "GPIO_39"),
+       PINCTRL_PIN(40, "GPIO_40"),
+       PINCTRL_PIN(41, "GPIO_41"),
+       PINCTRL_PIN(42, "GPIO_42"),
+       PINCTRL_PIN(43, "GPIO_43"),
+       PINCTRL_PIN(44, "GPIO_44"),
+       PINCTRL_PIN(45, "GPIO_45"),
+       PINCTRL_PIN(46, "GPIO_46"),
+       PINCTRL_PIN(47, "GPIO_47"),
+       PINCTRL_PIN(48, "GPIO_48"),
+       PINCTRL_PIN(49, "GPIO_49"),
+       PINCTRL_PIN(50, "GPIO_50"),
+       PINCTRL_PIN(51, "GPIO_51"),
+       PINCTRL_PIN(52, "GPIO_52"),
+       PINCTRL_PIN(53, "GPIO_53"),
+       PINCTRL_PIN(54, "GPIO_54"),
+       PINCTRL_PIN(55, "GPIO_55"),
+       PINCTRL_PIN(56, "GPIO_56"),
+       PINCTRL_PIN(57, "GPIO_57"),
+       PINCTRL_PIN(58, "GPIO_58"),
+       PINCTRL_PIN(59, "GPIO_59"),
+       PINCTRL_PIN(60, "GPIO_60"),
+       PINCTRL_PIN(61, "GPIO_61"),
+       PINCTRL_PIN(62, "GPIO_62"),
+       PINCTRL_PIN(63, "GPIO_63"),
+       PINCTRL_PIN(64, "GPIO_64"),
+       PINCTRL_PIN(65, "GPIO_65"),
+       PINCTRL_PIN(66, "GPIO_66"),
+       PINCTRL_PIN(67, "GPIO_67"),
+       PINCTRL_PIN(68, "GPIO_68"),
+       PINCTRL_PIN(69, "GPIO_69"),
+       PINCTRL_PIN(70, "GPIO_70"),
+       PINCTRL_PIN(71, "GPIO_71"),
+       PINCTRL_PIN(72, "GPIO_72"),
+       PINCTRL_PIN(73, "GPIO_73"),
+       PINCTRL_PIN(74, "GPIO_74"),
+       PINCTRL_PIN(75, "GPIO_75"),
+       PINCTRL_PIN(76, "GPIO_76"),
+       PINCTRL_PIN(77, "GPIO_77"),
+       PINCTRL_PIN(78, "GPIO_78"),
+       PINCTRL_PIN(79, "GPIO_79"),
+       PINCTRL_PIN(80, "GPIO_80"),
+       PINCTRL_PIN(81, "GPIO_81"),
+       PINCTRL_PIN(82, "GPIO_82"),
+       PINCTRL_PIN(83, "GPIO_83"),
+       PINCTRL_PIN(84, "GPIO_84"),
+       PINCTRL_PIN(85, "GPIO_85"),
+       PINCTRL_PIN(86, "GPIO_86"),
+       PINCTRL_PIN(87, "GPIO_87"),
+       PINCTRL_PIN(88, "GPIO_88"),
+       PINCTRL_PIN(89, "GPIO_89"),
+
+       PINCTRL_PIN(90, "SDC1_CLK"),
+       PINCTRL_PIN(91, "SDC1_CMD"),
+       PINCTRL_PIN(92, "SDC1_DATA"),
+       PINCTRL_PIN(93, "SDC3_CLK"),
+       PINCTRL_PIN(94, "SDC3_CMD"),
+       PINCTRL_PIN(95, "SDC3_DATA"),
+};
+
+#define DECLARE_APQ_GPIO_PINS(pin) static const unsigned int gpio##pin##_pins[] = { pin }
+DECLARE_APQ_GPIO_PINS(0);
+DECLARE_APQ_GPIO_PINS(1);
+DECLARE_APQ_GPIO_PINS(2);
+DECLARE_APQ_GPIO_PINS(3);
+DECLARE_APQ_GPIO_PINS(4);
+DECLARE_APQ_GPIO_PINS(5);
+DECLARE_APQ_GPIO_PINS(6);
+DECLARE_APQ_GPIO_PINS(7);
+DECLARE_APQ_GPIO_PINS(8);
+DECLARE_APQ_GPIO_PINS(9);
+DECLARE_APQ_GPIO_PINS(10);
+DECLARE_APQ_GPIO_PINS(11);
+DECLARE_APQ_GPIO_PINS(12);
+DECLARE_APQ_GPIO_PINS(13);
+DECLARE_APQ_GPIO_PINS(14);
+DECLARE_APQ_GPIO_PINS(15);
+DECLARE_APQ_GPIO_PINS(16);
+DECLARE_APQ_GPIO_PINS(17);
+DECLARE_APQ_GPIO_PINS(18);
+DECLARE_APQ_GPIO_PINS(19);
+DECLARE_APQ_GPIO_PINS(20);
+DECLARE_APQ_GPIO_PINS(21);
+DECLARE_APQ_GPIO_PINS(22);
+DECLARE_APQ_GPIO_PINS(23);
+DECLARE_APQ_GPIO_PINS(24);
+DECLARE_APQ_GPIO_PINS(25);
+DECLARE_APQ_GPIO_PINS(26);
+DECLARE_APQ_GPIO_PINS(27);
+DECLARE_APQ_GPIO_PINS(28);
+DECLARE_APQ_GPIO_PINS(29);
+DECLARE_APQ_GPIO_PINS(30);
+DECLARE_APQ_GPIO_PINS(31);
+DECLARE_APQ_GPIO_PINS(32);
+DECLARE_APQ_GPIO_PINS(33);
+DECLARE_APQ_GPIO_PINS(34);
+DECLARE_APQ_GPIO_PINS(35);
+DECLARE_APQ_GPIO_PINS(36);
+DECLARE_APQ_GPIO_PINS(37);
+DECLARE_APQ_GPIO_PINS(38);
+DECLARE_APQ_GPIO_PINS(39);
+DECLARE_APQ_GPIO_PINS(40);
+DECLARE_APQ_GPIO_PINS(41);
+DECLARE_APQ_GPIO_PINS(42);
+DECLARE_APQ_GPIO_PINS(43);
+DECLARE_APQ_GPIO_PINS(44);
+DECLARE_APQ_GPIO_PINS(45);
+DECLARE_APQ_GPIO_PINS(46);
+DECLARE_APQ_GPIO_PINS(47);
+DECLARE_APQ_GPIO_PINS(48);
+DECLARE_APQ_GPIO_PINS(49);
+DECLARE_APQ_GPIO_PINS(50);
+DECLARE_APQ_GPIO_PINS(51);
+DECLARE_APQ_GPIO_PINS(52);
+DECLARE_APQ_GPIO_PINS(53);
+DECLARE_APQ_GPIO_PINS(54);
+DECLARE_APQ_GPIO_PINS(55);
+DECLARE_APQ_GPIO_PINS(56);
+DECLARE_APQ_GPIO_PINS(57);
+DECLARE_APQ_GPIO_PINS(58);
+DECLARE_APQ_GPIO_PINS(59);
+DECLARE_APQ_GPIO_PINS(60);
+DECLARE_APQ_GPIO_PINS(61);
+DECLARE_APQ_GPIO_PINS(62);
+DECLARE_APQ_GPIO_PINS(63);
+DECLARE_APQ_GPIO_PINS(64);
+DECLARE_APQ_GPIO_PINS(65);
+DECLARE_APQ_GPIO_PINS(66);
+DECLARE_APQ_GPIO_PINS(67);
+DECLARE_APQ_GPIO_PINS(68);
+DECLARE_APQ_GPIO_PINS(69);
+DECLARE_APQ_GPIO_PINS(70);
+DECLARE_APQ_GPIO_PINS(71);
+DECLARE_APQ_GPIO_PINS(72);
+DECLARE_APQ_GPIO_PINS(73);
+DECLARE_APQ_GPIO_PINS(74);
+DECLARE_APQ_GPIO_PINS(75);
+DECLARE_APQ_GPIO_PINS(76);
+DECLARE_APQ_GPIO_PINS(77);
+DECLARE_APQ_GPIO_PINS(78);
+DECLARE_APQ_GPIO_PINS(79);
+DECLARE_APQ_GPIO_PINS(80);
+DECLARE_APQ_GPIO_PINS(81);
+DECLARE_APQ_GPIO_PINS(82);
+DECLARE_APQ_GPIO_PINS(83);
+DECLARE_APQ_GPIO_PINS(84);
+DECLARE_APQ_GPIO_PINS(85);
+DECLARE_APQ_GPIO_PINS(86);
+DECLARE_APQ_GPIO_PINS(87);
+DECLARE_APQ_GPIO_PINS(88);
+DECLARE_APQ_GPIO_PINS(89);
+
+static const unsigned int sdc1_clk_pins[] = { 90 };
+static const unsigned int sdc1_cmd_pins[] = { 91 };
+static const unsigned int sdc1_data_pins[] = { 92 };
+static const unsigned int sdc3_clk_pins[] = { 93 };
+static const unsigned int sdc3_cmd_pins[] = { 94 };
+static const unsigned int sdc3_data_pins[] = { 95 };
+
+#define FUNCTION(fname)                                        \
+       [APQ_MUX_##fname] = {                           \
+               .name = #fname,                         \
+               .groups = fname##_groups,               \
+               .ngroups = ARRAY_SIZE(fname##_groups),  \
+       }
+
+#define PINGROUP(id, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10) \
+       {                                               \
+               .name = "gpio" #id,                     \
+               .pins = gpio##id##_pins,                \
+               .npins = ARRAY_SIZE(gpio##id##_pins),   \
+               .funcs = (int[]){                       \
+                       APQ_MUX_gpio,                   \
+                       APQ_MUX_##f1,                   \
+                       APQ_MUX_##f2,                   \
+                       APQ_MUX_##f3,                   \
+                       APQ_MUX_##f4,                   \
+                       APQ_MUX_##f5,                   \
+                       APQ_MUX_##f6,                   \
+                       APQ_MUX_##f7,                   \
+                       APQ_MUX_##f8,                   \
+                       APQ_MUX_##f9,                   \
+                       APQ_MUX_##f10,                  \
+               },                                      \
+               .nfuncs = 11,                           \
+               .ctl_reg = 0x1000 + 0x10 * id,          \
+               .io_reg = 0x1004 + 0x10 * id,           \
+               .intr_cfg_reg = 0x1008 + 0x10 * id,     \
+               .intr_status_reg = 0x100c + 0x10 * id,  \
+               .intr_target_reg = 0x400 + 0x4 * id,    \
+               .mux_bit = 2,                           \
+               .pull_bit = 0,                          \
+               .drv_bit = 6,                           \
+               .oe_bit = 9,                            \
+               .in_bit = 0,                            \
+               .out_bit = 1,                           \
+               .intr_enable_bit = 0,                   \
+               .intr_status_bit = 0,                   \
+               .intr_ack_high = 1,                     \
+               .intr_target_bit = 0,                   \
+               .intr_raw_status_bit = 3,               \
+               .intr_polarity_bit = 1,                 \
+               .intr_detection_bit = 2,                \
+               .intr_detection_width = 1,              \
+       }
+
+#define SDC_PINGROUP(pg_name, ctl, pull, drv)          \
+       {                                               \
+               .name = #pg_name,                       \
+               .pins = pg_name##_pins,                 \
+               .npins = ARRAY_SIZE(pg_name##_pins),    \
+               .ctl_reg = ctl,                         \
+               .io_reg = 0,                            \
+               .intr_cfg_reg = 0,                      \
+               .intr_status_reg = 0,                   \
+               .intr_target_reg = 0,                   \
+               .mux_bit = -1,                          \
+               .pull_bit = pull,                       \
+               .drv_bit = drv,                         \
+               .oe_bit = -1,                           \
+               .in_bit = -1,                           \
+               .out_bit = -1,                          \
+               .intr_enable_bit = -1,                  \
+               .intr_status_bit = -1,                  \
+               .intr_target_bit = -1,                  \
+               .intr_raw_status_bit = -1,              \
+               .intr_polarity_bit = -1,                \
+               .intr_detection_bit = -1,               \
+               .intr_detection_width = -1,             \
+       }
+
+enum apq8064_functions {
+       APQ_MUX_cam_mclk,
+       APQ_MUX_codec_mic_i2s,
+       APQ_MUX_codec_spkr_i2s,
+       APQ_MUX_gpio,
+       APQ_MUX_gsbi1,
+       APQ_MUX_gsbi2,
+       APQ_MUX_gsbi3,
+       APQ_MUX_gsbi4,
+       APQ_MUX_gsbi4_cam_i2c,
+       APQ_MUX_gsbi5,
+       APQ_MUX_gsbi5_spi_cs1,
+       APQ_MUX_gsbi5_spi_cs2,
+       APQ_MUX_gsbi5_spi_cs3,
+       APQ_MUX_gsbi6,
+       APQ_MUX_gsbi6_spi_cs1,
+       APQ_MUX_gsbi6_spi_cs2,
+       APQ_MUX_gsbi6_spi_cs3,
+       APQ_MUX_gsbi7,
+       APQ_MUX_gsbi7_spi_cs1,
+       APQ_MUX_gsbi7_spi_cs2,
+       APQ_MUX_gsbi7_spi_cs3,
+       APQ_MUX_gsbi_cam_i2c,
+       APQ_MUX_hdmi,
+       APQ_MUX_mi2s,
+       APQ_MUX_riva_bt,
+       APQ_MUX_riva_fm,
+       APQ_MUX_riva_wlan,
+       APQ_MUX_sdc2,
+       APQ_MUX_sdc4,
+       APQ_MUX_slimbus,
+       APQ_MUX_spkr_i2s,
+       APQ_MUX_tsif1,
+       APQ_MUX_tsif2,
+       APQ_MUX_usb2_hsic,
+       APQ_MUX_NA,
+};
+
+static const char * const cam_mclk_groups[] = {
+       "gpio4" "gpio5"
+};
+static const char * const codec_mic_i2s_groups[] = {
+       "gpio34", "gpio35", "gpio36", "gpio37", "gpio38"
+};
+static const char * const codec_spkr_i2s_groups[] = {
+       "gpio39", "gpio40", "gpio41", "gpio42"
+};
+static const char * const gpio_groups[] = {
+       "gpio0", "gpio1", "gpio2", "gpio3", "gpio4", "gpio5", "gpio6", "gpio7",
+       "gpio8", "gpio9", "gpio10", "gpio11", "gpio12", "gpio13", "gpio14",
+       "gpio15", "gpio16", "gpio17", "gpio18", "gpio19", "gpio20", "gpio21",
+       "gpio22", "gpio23", "gpio24", "gpio25", "gpio26", "gpio27", "gpio28",
+       "gpio29", "gpio30", "gpio31", "gpio32", "gpio33", "gpio34", "gpio35",
+       "gpio36", "gpio37", "gpio38", "gpio39", "gpio40", "gpio41", "gpio42",
+       "gpio43", "gpio44", "gpio45", "gpio46", "gpio47", "gpio48", "gpio49",
+       "gpio50", "gpio51", "gpio52", "gpio53", "gpio54", "gpio55", "gpio56",
+       "gpio57", "gpio58", "gpio59", "gpio60", "gpio61", "gpio62", "gpio63",
+       "gpio64", "gpio65", "gpio66", "gpio67", "gpio68", "gpio69", "gpio70",
+       "gpio71", "gpio72", "gpio73", "gpio74", "gpio75", "gpio76", "gpio77",
+       "gpio78", "gpio79", "gpio80", "gpio81", "gpio82", "gpio83", "gpio84",
+       "gpio85", "gpio86", "gpio87", "gpio88", "gpio89"
+};
+static const char * const gsbi1_groups[] = {
+       "gpio18", "gpio19", "gpio20", "gpio21"
+};
+static const char * const gsbi2_groups[] = {
+       "gpio22", "gpio23", "gpio24", "gpio25"
+};
+static const char * const gsbi3_groups[] = {
+       "gpio6", "gpio7", "gpio8", "gpio9"
+};
+static const char * const gsbi4_groups[] = {
+       "gpio10", "gpio11", "gpio12", "gpio13"
+};
+static const char * const gsbi4_cam_i2c_groups[] = {
+       "gpio10", "gpio11", "gpio12", "gpio13"
+};
+static const char * const gsbi5_groups[] = {
+       "gpio51", "gpio52", "gpio53", "gpio54"
+};
+static const char * const gsbi5_spi_cs1_groups[] = {
+       "gpio47"
+};
+static const char * const gsbi5_spi_cs2_groups[] = {
+       "gpio31"
+};
+static const char * const gsbi5_spi_cs3_groups[] = {
+       "gpio32"
+};
+static const char * const gsbi6_groups[] = {
+       "gpio14", "gpio15", "gpio16", "gpio17"
+};
+static const char * const gsbi6_spi_cs1_groups[] = {
+       "gpio47"
+};
+static const char * const gsbi6_spi_cs2_groups[] = {
+       "gpio31"
+};
+static const char * const gsbi6_spi_cs3_groups[] = {
+       "gpio32"
+};
+static const char * const gsbi7_groups[] = {
+       "gpio82", "gpio83", "gpio84", "gpio85"
+};
+static const char * const gsbi7_spi_cs1_groups[] = {
+       "gpio47"
+};
+static const char * const gsbi7_spi_cs2_groups[] = {
+       "gpio31"
+};
+static const char * const gsbi7_spi_cs3_groups[] = {
+       "gpio32"
+};
+static const char * const gsbi_cam_i2c_groups[] = {
+       "gpio10", "gpio11", "gpio12", "gpio13"
+};
+static const char * const hdmi_groups[] = {
+       "gpio69", "gpio70", "gpio71", "gpio72"
+};
+static const char * const mi2s_groups[] = {
+       "gpio27", "gpio28", "gpio29", "gpio30", "gpio31", "gpio32", "gpio33"
+};
+static const char * const riva_bt_groups[] = {
+       "gpio16", "gpio17"
+};
+static const char * const riva_fm_groups[] = {
+       "gpio14", "gpio15"
+};
+static const char * const riva_wlan_groups[] = {
+       "gpio64", "gpio65", "gpio66", "gpio67", "gpio68"
+};
+static const char * const sdc2_groups[] = {
+       "gpio57", "gpio58", "gpio59", "gpio60", "gpio61", "gpio62"
+};
+static const char * const sdc4_groups[] = {
+       "gpio63", "gpio64", "gpio65", "gpio66", "gpio67", "gpio68"
+};
+static const char * const slimbus_groups[] = {
+       "gpio40", "gpio41"
+};
+static const char * const spkr_i2s_groups[] = {
+       "gpio47", "gpio48", "gpio49", "gpio50"
+};
+static const char * const tsif1_groups[] = {
+       "gpio55", "gpio56", "gpio57"
+};
+static const char * const tsif2_groups[] = {
+       "gpio58", "gpio59", "gpio60"
+};
+static const char * const usb2_hsic_groups[] = {
+       "gpio88", "gpio89"
+};
+
+static const struct msm_function apq8064_functions[] = {
+       FUNCTION(cam_mclk),
+       FUNCTION(codec_mic_i2s),
+       FUNCTION(codec_spkr_i2s),
+       FUNCTION(gpio),
+       FUNCTION(gsbi1),
+       FUNCTION(gsbi2),
+       FUNCTION(gsbi3),
+       FUNCTION(gsbi4),
+       FUNCTION(gsbi4_cam_i2c),
+       FUNCTION(gsbi5),
+       FUNCTION(gsbi5_spi_cs1),
+       FUNCTION(gsbi5_spi_cs2),
+       FUNCTION(gsbi5_spi_cs3),
+       FUNCTION(gsbi6),
+       FUNCTION(gsbi6_spi_cs1),
+       FUNCTION(gsbi6_spi_cs2),
+       FUNCTION(gsbi6_spi_cs3),
+       FUNCTION(gsbi7),
+       FUNCTION(gsbi7_spi_cs1),
+       FUNCTION(gsbi7_spi_cs2),
+       FUNCTION(gsbi7_spi_cs3),
+       FUNCTION(gsbi_cam_i2c),
+       FUNCTION(hdmi),
+       FUNCTION(mi2s),
+       FUNCTION(riva_bt),
+       FUNCTION(riva_fm),
+       FUNCTION(riva_wlan),
+       FUNCTION(sdc2),
+       FUNCTION(sdc4),
+       FUNCTION(slimbus),
+       FUNCTION(spkr_i2s),
+       FUNCTION(tsif1),
+       FUNCTION(tsif2),
+       FUNCTION(usb2_hsic),
+};
+
+static const struct msm_pingroup apq8064_groups[] = {
+       PINGROUP(0, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(2, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(3, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(4, NA, NA, cam_mclk, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(5, NA, cam_mclk, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(6, gsbi3, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(7, gsbi3, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(8, gsbi3, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(9, gsbi3, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(10, gsbi4, NA, NA, NA, NA, NA, NA, NA, gsbi4_cam_i2c, NA),
+       PINGROUP(11, gsbi4, NA, NA, NA, NA, NA, NA, NA, NA, gsbi4_cam_i2c),
+       PINGROUP(12, gsbi4, NA, NA, NA, NA, gsbi4_cam_i2c, NA, NA, NA, NA),
+       PINGROUP(13, gsbi4, NA, NA, NA, NA, gsbi4_cam_i2c, NA, NA, NA, NA),
+       PINGROUP(14, riva_fm, gsbi6, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(15, riva_fm, gsbi6, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(16, riva_bt, gsbi6, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(17, riva_bt, gsbi6, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(18, gsbi1, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(19, gsbi1, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(20, gsbi1, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(21, gsbi1, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(22, gsbi2, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(23, gsbi2, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(24, gsbi2, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(25, gsbi2, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(26, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(27, mi2s, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(28, mi2s, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(29, mi2s, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(30, mi2s, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(31, mi2s, NA, gsbi5_spi_cs2, gsbi6_spi_cs2, gsbi7_spi_cs2, NA, NA, NA, NA, NA),
+       PINGROUP(32, mi2s, NA, NA, NA, NA, gsbi5_spi_cs3, gsbi6_spi_cs3, gsbi7_spi_cs3, NA, NA),
+       PINGROUP(33, mi2s, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(34, codec_mic_i2s, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(35, codec_mic_i2s, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(36, codec_mic_i2s, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(37, codec_mic_i2s, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(38, codec_mic_i2s, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(39, codec_spkr_i2s, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(40, slimbus, codec_spkr_i2s, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(41, slimbus, codec_spkr_i2s, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(42, codec_spkr_i2s, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(43, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(44, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(45, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(46, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(47, spkr_i2s, gsbi5_spi_cs1, gsbi6_spi_cs1, gsbi7_spi_cs1, NA, NA, NA, NA, NA, NA),
+       PINGROUP(48, spkr_i2s, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(49, spkr_i2s, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(50, spkr_i2s, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(51, NA, gsbi5, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(52, NA, gsbi5, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(53, NA, gsbi5, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(54, NA, gsbi5, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(55, tsif1, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(56, tsif1, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(57, tsif1, sdc2, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(58, tsif2, sdc2, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(59, tsif2, sdc2, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(60, tsif2, sdc2, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(61, NA, sdc2, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(62, NA, sdc2, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(63, NA, sdc4, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(64, riva_wlan, sdc4, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(65, riva_wlan, sdc4, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(66, riva_wlan, sdc4, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(67, riva_wlan, sdc4, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(68, riva_wlan, sdc4, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(69, hdmi, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(70, hdmi, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(71, hdmi, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(72, hdmi, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(73, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(74, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(75, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(76, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(77, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(78, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(79, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(80, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(81, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(82, NA, gsbi7, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(83, gsbi7, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(84, NA, gsbi7, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(85, NA, NA, gsbi7, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(86, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(87, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(88, usb2_hsic, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(89, usb2_hsic, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+
+       SDC_PINGROUP(sdc1_clk, 0x20a0, 13, 6),
+       SDC_PINGROUP(sdc1_cmd, 0x20a0, 11, 3),
+       SDC_PINGROUP(sdc1_data, 0x20a0, 9, 0),
+
+       SDC_PINGROUP(sdc3_clk, 0x20a4, 14, 6),
+       SDC_PINGROUP(sdc3_cmd, 0x20a4, 11, 3),
+       SDC_PINGROUP(sdc3_data, 0x20a4, 9, 0),
+};
+
+#define NUM_GPIO_PINGROUPS 90
+
+static const struct msm_pinctrl_soc_data apq8064_pinctrl = {
+       .pins = apq8064_pins,
+       .npins = ARRAY_SIZE(apq8064_pins),
+       .functions = apq8064_functions,
+       .nfunctions = ARRAY_SIZE(apq8064_functions),
+       .groups = apq8064_groups,
+       .ngroups = ARRAY_SIZE(apq8064_groups),
+       .ngpios = NUM_GPIO_PINGROUPS,
+};
+
+static int apq8064_pinctrl_probe(struct platform_device *pdev)
+{
+       return msm_pinctrl_probe(pdev, &apq8064_pinctrl);
+}
+
+static const struct of_device_id apq8064_pinctrl_of_match[] = {
+       { .compatible = "qcom,apq8064-pinctrl", },
+       { },
+};
+
+static struct platform_driver apq8064_pinctrl_driver = {
+       .driver = {
+               .name = "apq8064-pinctrl",
+               .owner = THIS_MODULE,
+               .of_match_table = apq8064_pinctrl_of_match,
+       },
+       .probe = apq8064_pinctrl_probe,
+       .remove = msm_pinctrl_remove,
+};
+
+static int __init apq8064_pinctrl_init(void)
+{
+       return platform_driver_register(&apq8064_pinctrl_driver);
+}
+arch_initcall(apq8064_pinctrl_init);
+
+static void __exit apq8064_pinctrl_exit(void)
+{
+       platform_driver_unregister(&apq8064_pinctrl_driver);
+}
+module_exit(apq8064_pinctrl_exit);
+
+MODULE_AUTHOR("Bjorn Andersson <bjorn.andersson@sonymobile.com>");
+MODULE_DESCRIPTION("Qualcomm APQ8064 pinctrl driver");
+MODULE_LICENSE("GPL v2");
+MODULE_DEVICE_TABLE(of, apq8064_pinctrl_of_match);
diff --git a/drivers/pinctrl/qcom/pinctrl-ipq8064.c b/drivers/pinctrl/qcom/pinctrl-ipq8064.c
new file mode 100644 (file)
index 0000000..767cf11
--- /dev/null
@@ -0,0 +1,668 @@
+/*
+ * Copyright (c) 2014, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/pinctrl/pinctrl.h>
+
+#include "pinctrl-msm.h"
+
+static const struct pinctrl_pin_desc ipq8064_pins[] = {
+       PINCTRL_PIN(0, "GPIO_0"),
+       PINCTRL_PIN(1, "GPIO_1"),
+       PINCTRL_PIN(2, "GPIO_2"),
+       PINCTRL_PIN(3, "GPIO_3"),
+       PINCTRL_PIN(4, "GPIO_4"),
+       PINCTRL_PIN(5, "GPIO_5"),
+       PINCTRL_PIN(6, "GPIO_6"),
+       PINCTRL_PIN(7, "GPIO_7"),
+       PINCTRL_PIN(8, "GPIO_8"),
+       PINCTRL_PIN(9, "GPIO_9"),
+       PINCTRL_PIN(10, "GPIO_10"),
+       PINCTRL_PIN(11, "GPIO_11"),
+       PINCTRL_PIN(12, "GPIO_12"),
+       PINCTRL_PIN(13, "GPIO_13"),
+       PINCTRL_PIN(14, "GPIO_14"),
+       PINCTRL_PIN(15, "GPIO_15"),
+       PINCTRL_PIN(16, "GPIO_16"),
+       PINCTRL_PIN(17, "GPIO_17"),
+       PINCTRL_PIN(18, "GPIO_18"),
+       PINCTRL_PIN(19, "GPIO_19"),
+       PINCTRL_PIN(20, "GPIO_20"),
+       PINCTRL_PIN(21, "GPIO_21"),
+       PINCTRL_PIN(22, "GPIO_22"),
+       PINCTRL_PIN(23, "GPIO_23"),
+       PINCTRL_PIN(24, "GPIO_24"),
+       PINCTRL_PIN(25, "GPIO_25"),
+       PINCTRL_PIN(26, "GPIO_26"),
+       PINCTRL_PIN(27, "GPIO_27"),
+       PINCTRL_PIN(28, "GPIO_28"),
+       PINCTRL_PIN(29, "GPIO_29"),
+       PINCTRL_PIN(30, "GPIO_30"),
+       PINCTRL_PIN(31, "GPIO_31"),
+       PINCTRL_PIN(32, "GPIO_32"),
+       PINCTRL_PIN(33, "GPIO_33"),
+       PINCTRL_PIN(34, "GPIO_34"),
+       PINCTRL_PIN(35, "GPIO_35"),
+       PINCTRL_PIN(36, "GPIO_36"),
+       PINCTRL_PIN(37, "GPIO_37"),
+       PINCTRL_PIN(38, "GPIO_38"),
+       PINCTRL_PIN(39, "GPIO_39"),
+       PINCTRL_PIN(40, "GPIO_40"),
+       PINCTRL_PIN(41, "GPIO_41"),
+       PINCTRL_PIN(42, "GPIO_42"),
+       PINCTRL_PIN(43, "GPIO_43"),
+       PINCTRL_PIN(44, "GPIO_44"),
+       PINCTRL_PIN(45, "GPIO_45"),
+       PINCTRL_PIN(46, "GPIO_46"),
+       PINCTRL_PIN(47, "GPIO_47"),
+       PINCTRL_PIN(48, "GPIO_48"),
+       PINCTRL_PIN(49, "GPIO_49"),
+       PINCTRL_PIN(50, "GPIO_50"),
+       PINCTRL_PIN(51, "GPIO_51"),
+       PINCTRL_PIN(52, "GPIO_52"),
+       PINCTRL_PIN(53, "GPIO_53"),
+       PINCTRL_PIN(54, "GPIO_54"),
+       PINCTRL_PIN(55, "GPIO_55"),
+       PINCTRL_PIN(56, "GPIO_56"),
+       PINCTRL_PIN(57, "GPIO_57"),
+       PINCTRL_PIN(58, "GPIO_58"),
+       PINCTRL_PIN(59, "GPIO_59"),
+       PINCTRL_PIN(60, "GPIO_60"),
+       PINCTRL_PIN(61, "GPIO_61"),
+       PINCTRL_PIN(62, "GPIO_62"),
+       PINCTRL_PIN(63, "GPIO_63"),
+       PINCTRL_PIN(64, "GPIO_64"),
+       PINCTRL_PIN(65, "GPIO_65"),
+       PINCTRL_PIN(66, "GPIO_66"),
+       PINCTRL_PIN(67, "GPIO_67"),
+       PINCTRL_PIN(68, "GPIO_68"),
+
+       PINCTRL_PIN(69, "SDC3_CLK"),
+       PINCTRL_PIN(70, "SDC3_CMD"),
+       PINCTRL_PIN(71, "SDC3_DATA"),
+};
+
+#define DECLARE_IPQ_GPIO_PINS(pin) static const unsigned int gpio##pin##_pins[] = { pin }
+DECLARE_IPQ_GPIO_PINS(0);
+DECLARE_IPQ_GPIO_PINS(1);
+DECLARE_IPQ_GPIO_PINS(2);
+DECLARE_IPQ_GPIO_PINS(3);
+DECLARE_IPQ_GPIO_PINS(4);
+DECLARE_IPQ_GPIO_PINS(5);
+DECLARE_IPQ_GPIO_PINS(6);
+DECLARE_IPQ_GPIO_PINS(7);
+DECLARE_IPQ_GPIO_PINS(8);
+DECLARE_IPQ_GPIO_PINS(9);
+DECLARE_IPQ_GPIO_PINS(10);
+DECLARE_IPQ_GPIO_PINS(11);
+DECLARE_IPQ_GPIO_PINS(12);
+DECLARE_IPQ_GPIO_PINS(13);
+DECLARE_IPQ_GPIO_PINS(14);
+DECLARE_IPQ_GPIO_PINS(15);
+DECLARE_IPQ_GPIO_PINS(16);
+DECLARE_IPQ_GPIO_PINS(17);
+DECLARE_IPQ_GPIO_PINS(18);
+DECLARE_IPQ_GPIO_PINS(19);
+DECLARE_IPQ_GPIO_PINS(20);
+DECLARE_IPQ_GPIO_PINS(21);
+DECLARE_IPQ_GPIO_PINS(22);
+DECLARE_IPQ_GPIO_PINS(23);
+DECLARE_IPQ_GPIO_PINS(24);
+DECLARE_IPQ_GPIO_PINS(25);
+DECLARE_IPQ_GPIO_PINS(26);
+DECLARE_IPQ_GPIO_PINS(27);
+DECLARE_IPQ_GPIO_PINS(28);
+DECLARE_IPQ_GPIO_PINS(29);
+DECLARE_IPQ_GPIO_PINS(30);
+DECLARE_IPQ_GPIO_PINS(31);
+DECLARE_IPQ_GPIO_PINS(32);
+DECLARE_IPQ_GPIO_PINS(33);
+DECLARE_IPQ_GPIO_PINS(34);
+DECLARE_IPQ_GPIO_PINS(35);
+DECLARE_IPQ_GPIO_PINS(36);
+DECLARE_IPQ_GPIO_PINS(37);
+DECLARE_IPQ_GPIO_PINS(38);
+DECLARE_IPQ_GPIO_PINS(39);
+DECLARE_IPQ_GPIO_PINS(40);
+DECLARE_IPQ_GPIO_PINS(41);
+DECLARE_IPQ_GPIO_PINS(42);
+DECLARE_IPQ_GPIO_PINS(43);
+DECLARE_IPQ_GPIO_PINS(44);
+DECLARE_IPQ_GPIO_PINS(45);
+DECLARE_IPQ_GPIO_PINS(46);
+DECLARE_IPQ_GPIO_PINS(47);
+DECLARE_IPQ_GPIO_PINS(48);
+DECLARE_IPQ_GPIO_PINS(49);
+DECLARE_IPQ_GPIO_PINS(50);
+DECLARE_IPQ_GPIO_PINS(51);
+DECLARE_IPQ_GPIO_PINS(52);
+DECLARE_IPQ_GPIO_PINS(53);
+DECLARE_IPQ_GPIO_PINS(54);
+DECLARE_IPQ_GPIO_PINS(55);
+DECLARE_IPQ_GPIO_PINS(56);
+DECLARE_IPQ_GPIO_PINS(57);
+DECLARE_IPQ_GPIO_PINS(58);
+DECLARE_IPQ_GPIO_PINS(59);
+DECLARE_IPQ_GPIO_PINS(60);
+DECLARE_IPQ_GPIO_PINS(61);
+DECLARE_IPQ_GPIO_PINS(62);
+DECLARE_IPQ_GPIO_PINS(63);
+DECLARE_IPQ_GPIO_PINS(64);
+DECLARE_IPQ_GPIO_PINS(65);
+DECLARE_IPQ_GPIO_PINS(66);
+DECLARE_IPQ_GPIO_PINS(67);
+DECLARE_IPQ_GPIO_PINS(68);
+
+static const unsigned int sdc3_clk_pins[] = { 69 };
+static const unsigned int sdc3_cmd_pins[] = { 70 };
+static const unsigned int sdc3_data_pins[] = { 71 };
+
+#define FUNCTION(fname)                                        \
+       [IPQ_MUX_##fname] = {                           \
+               .name = #fname,                         \
+               .groups = fname##_groups,               \
+               .ngroups = ARRAY_SIZE(fname##_groups),  \
+       }
+
+#define PINGROUP(id, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10) \
+       {                                               \
+               .name = "gpio" #id,                     \
+               .pins = gpio##id##_pins,                \
+               .npins = ARRAY_SIZE(gpio##id##_pins),   \
+               .funcs = (int[]){                       \
+                       IPQ_MUX_gpio,                   \
+                       IPQ_MUX_##f1,                   \
+                       IPQ_MUX_##f2,                   \
+                       IPQ_MUX_##f3,                   \
+                       IPQ_MUX_##f4,                   \
+                       IPQ_MUX_##f5,                   \
+                       IPQ_MUX_##f6,                   \
+                       IPQ_MUX_##f7,                   \
+                       IPQ_MUX_##f8,                   \
+                       IPQ_MUX_##f9,                   \
+                       IPQ_MUX_##f10,                  \
+               },                                      \
+               .nfuncs = 11,                           \
+               .ctl_reg = 0x1000 + 0x10 * id,          \
+               .io_reg = 0x1004 + 0x10 * id,           \
+               .intr_cfg_reg = 0x1008 + 0x10 * id,     \
+               .intr_status_reg = 0x100c + 0x10 * id,  \
+               .intr_target_reg = 0x400 + 0x4 * id,    \
+               .mux_bit = 2,                           \
+               .pull_bit = 0,                          \
+               .drv_bit = 6,                           \
+               .oe_bit = 9,                            \
+               .in_bit = 0,                            \
+               .out_bit = 1,                           \
+               .intr_enable_bit = 0,                   \
+               .intr_status_bit = 0,                   \
+               .intr_ack_high = 1,                     \
+               .intr_target_bit = 0,                   \
+               .intr_raw_status_bit = 3,               \
+               .intr_polarity_bit = 1,                 \
+               .intr_detection_bit = 2,                \
+               .intr_detection_width = 1,              \
+       }
+
+#define SDC_PINGROUP(pg_name, ctl, pull, drv)          \
+       {                                               \
+               .name = #pg_name,                       \
+               .pins = pg_name##_pins,                 \
+               .npins = ARRAY_SIZE(pg_name##_pins),    \
+               .ctl_reg = ctl,                         \
+               .io_reg = 0,                            \
+               .intr_cfg_reg = 0,                      \
+               .intr_status_reg = 0,                   \
+               .intr_target_reg = 0,                   \
+               .mux_bit = -1,                          \
+               .pull_bit = pull,                       \
+               .drv_bit = drv,                         \
+               .oe_bit = -1,                           \
+               .in_bit = -1,                           \
+               .out_bit = -1,                          \
+               .intr_enable_bit = -1,                  \
+               .intr_status_bit = -1,                  \
+               .intr_target_bit = -1,                  \
+               .intr_raw_status_bit = -1,              \
+               .intr_polarity_bit = -1,                \
+               .intr_detection_bit = -1,               \
+               .intr_detection_width = -1,             \
+       }
+
+enum ipq8064_functions {
+       IPQ_MUX_gpio,
+       IPQ_MUX_mdio,
+       IPQ_MUX_mi2s,
+       IPQ_MUX_pdm,
+       IPQ_MUX_ssbi,
+       IPQ_MUX_spmi,
+       IPQ_MUX_audio_pcm,
+       IPQ_MUX_gsbi1,
+       IPQ_MUX_gsbi2,
+       IPQ_MUX_gsbi4,
+       IPQ_MUX_gsbi5,
+       IPQ_MUX_gsbi5_spi_cs1,
+       IPQ_MUX_gsbi5_spi_cs2,
+       IPQ_MUX_gsbi5_spi_cs3,
+       IPQ_MUX_gsbi6,
+       IPQ_MUX_gsbi7,
+       IPQ_MUX_nss_spi,
+       IPQ_MUX_sdc1,
+       IPQ_MUX_spdif,
+       IPQ_MUX_nand,
+       IPQ_MUX_tsif1,
+       IPQ_MUX_tsif2,
+       IPQ_MUX_usb_fs_n,
+       IPQ_MUX_usb_fs,
+       IPQ_MUX_usb2_hsic,
+       IPQ_MUX_rgmii2,
+       IPQ_MUX_sata,
+       IPQ_MUX_pcie1_rst,
+       IPQ_MUX_pcie1_prsnt,
+       IPQ_MUX_pcie1_pwrflt,
+       IPQ_MUX_pcie1_pwren_n,
+       IPQ_MUX_pcie1_pwren,
+       IPQ_MUX_pcie1_clk_req,
+       IPQ_MUX_pcie2_rst,
+       IPQ_MUX_pcie2_prsnt,
+       IPQ_MUX_pcie2_pwrflt,
+       IPQ_MUX_pcie2_pwren_n,
+       IPQ_MUX_pcie2_pwren,
+       IPQ_MUX_pcie2_clk_req,
+       IPQ_MUX_pcie3_rst,
+       IPQ_MUX_pcie3_prsnt,
+       IPQ_MUX_pcie3_pwrflt,
+       IPQ_MUX_pcie3_pwren_n,
+       IPQ_MUX_pcie3_pwren,
+       IPQ_MUX_pcie3_clk_req,
+       IPQ_MUX_ps_hold,
+       IPQ_MUX_NA,
+};
+
+static const char * const gpio_groups[] = {
+       "gpio0", "gpio1", "gpio2", "gpio3", "gpio4", "gpio5", "gpio6", "gpio7",
+       "gpio8", "gpio9", "gpio10", "gpio11", "gpio12", "gpio13", "gpio14",
+       "gpio15", "gpio16", "gpio17", "gpio18", "gpio19", "gpio20", "gpio21",
+       "gpio22", "gpio23", "gpio24", "gpio25", "gpio26", "gpio27", "gpio28",
+       "gpio29", "gpio30", "gpio31", "gpio32", "gpio33", "gpio34", "gpio35",
+       "gpio36", "gpio37", "gpio38", "gpio39", "gpio40", "gpio41", "gpio42",
+       "gpio43", "gpio44", "gpio45", "gpio46", "gpio47", "gpio48", "gpio49",
+       "gpio50", "gpio51", "gpio52", "gpio53", "gpio54", "gpio55", "gpio56",
+       "gpio57", "gpio58", "gpio59", "gpio60", "gpio61", "gpio62", "gpio63",
+       "gpio64", "gpio65", "gpio66", "gpio67", "gpio68"
+};
+
+static const char * const mdio_groups[] = {
+       "gpio0", "gpio1", "gpio10", "gpio11",
+};
+
+static const char * const mi2s_groups[] = {
+       "gpio27", "gpio28", "gpio29", "gpio30", "gpio31", "gpio32",
+       "gpio33", "gpio55", "gpio56", "gpio57", "gpio58",
+};
+
+static const char * const pdm_groups[] = {
+       "gpio3", "gpio16", "gpio17", "gpio22", "gpio30", "gpio31",
+       "gpio34", "gpio35", "gpio52", "gpio55", "gpio56", "gpio58",
+       "gpio59",
+};
+
+static const char * const ssbi_groups[] = {
+       "gpio10", "gpio11",
+};
+
+static const char * const spmi_groups[] = {
+       "gpio10", "gpio11",
+};
+
+static const char * const audio_pcm_groups[] = {
+       "gpio14", "gpio15", "gpio16", "gpio17",
+};
+
+static const char * const gsbi1_groups[] = {
+       "gpio51", "gpio52", "gpio53", "gpio54",
+};
+
+static const char * const gsbi2_groups[] = {
+       "gpio22", "gpio23", "gpio24", "gpio25",
+};
+
+static const char * const gsbi4_groups[] = {
+       "gpio10", "gpio11", "gpio12", "gpio13",
+};
+
+static const char * const gsbi5_groups[] = {
+       "gpio18", "gpio19", "gpio20", "gpio21",
+};
+
+static const char * const gsbi5_spi_cs1_groups[] = {
+       "gpio6", "gpio61",
+};
+
+static const char * const gsbi5_spi_cs2_groups[] = {
+       "gpio7", "gpio62",
+};
+
+static const char * const gsbi5_spi_cs3_groups[] = {
+       "gpio2",
+};
+
+static const char * const gsbi6_groups[] = {
+       "gpio27", "gpio28", "gpio29", "gpio30", "gpio55", "gpio56",
+       "gpio57", "gpio58",
+};
+
+static const char * const gsbi7_groups[] = {
+       "gpio6", "gpio7", "gpio8", "gpio9",
+};
+
+static const char * const nss_spi_groups[] = {
+       "gpio14", "gpio15", "gpio16", "gpio17", "gpio55", "gpio56",
+       "gpio57", "gpio58",
+};
+
+static const char * const sdc1_groups[] = {
+       "gpio38", "gpio39", "gpio40", "gpio41", "gpio42", "gpio43",
+       "gpio44", "gpio45", "gpio46", "gpio47",
+};
+
+static const char * const spdif_groups[] = {
+       "gpio10", "gpio48",
+};
+
+static const char * const nand_groups[] = {
+       "gpio34", "gpio35", "gpio36", "gpio37", "gpio38", "gpio39",
+       "gpio40", "gpio41", "gpio42", "gpio43", "gpio44", "gpio45",
+       "gpio46", "gpio47",
+};
+
+static const char * const tsif1_groups[] = {
+       "gpio55", "gpio56", "gpio57", "gpio58",
+};
+
+static const char * const tsif2_groups[] = {
+       "gpio59", "gpio60", "gpio61", "gpio62",
+};
+
+static const char * const usb_fs_n_groups[] = {
+       "gpio6",
+};
+
+static const char * const usb_fs_groups[] = {
+       "gpio6", "gpio7", "gpio8",
+};
+
+static const char * const usb2_hsic_groups[] = {
+       "gpio67", "gpio68",
+};
+
+static const char * const rgmii2_groups[] = {
+       "gpio27", "gpio28", "gpio29", "gpio30", "gpio31", "gpio32",
+       "gpio51", "gpio52", "gpio59", "gpio60", "gpio61", "gpio62",
+};
+
+static const char * const sata_groups[] = {
+       "gpio10",
+};
+
+static const char * const pcie1_rst_groups[] = {
+       "gpio3",
+};
+
+static const char * const pcie1_prsnt_groups[] = {
+       "gpio3", "gpio11",
+};
+
+static const char * const pcie1_pwren_n_groups[] = {
+       "gpio4", "gpio12",
+};
+
+static const char * const pcie1_pwren_groups[] = {
+       "gpio4", "gpio12",
+};
+
+static const char * const pcie1_pwrflt_groups[] = {
+       "gpio5", "gpio13",
+};
+
+static const char * const pcie1_clk_req_groups[] = {
+       "gpio5",
+};
+
+static const char * const pcie2_rst_groups[] = {
+       "gpio48",
+};
+
+static const char * const pcie2_prsnt_groups[] = {
+       "gpio11", "gpio48",
+};
+
+static const char * const pcie2_pwren_n_groups[] = {
+       "gpio12", "gpio49",
+};
+
+static const char * const pcie2_pwren_groups[] = {
+       "gpio12", "gpio49",
+};
+
+static const char * const pcie2_pwrflt_groups[] = {
+       "gpio13", "gpio50",
+};
+
+static const char * const pcie2_clk_req_groups[] = {
+       "gpio50",
+};
+
+static const char * const pcie3_rst_groups[] = {
+       "gpio63",
+};
+
+static const char * const pcie3_prsnt_groups[] = {
+       "gpio11",
+};
+
+static const char * const pcie3_pwren_n_groups[] = {
+       "gpio12",
+};
+
+static const char * const pcie3_pwren_groups[] = {
+       "gpio12",
+};
+
+static const char * const pcie3_pwrflt_groups[] = {
+       "gpio13",
+};
+
+static const char * const pcie3_clk_req_groups[] = {
+       "gpio65",
+};
+
+static const char * const ps_hold_groups[] = {
+       "gpio26",
+};
+
+static const struct msm_function ipq8064_functions[] = {
+       FUNCTION(gpio),
+       FUNCTION(mdio),
+       FUNCTION(ssbi),
+       FUNCTION(spmi),
+       FUNCTION(mi2s),
+       FUNCTION(pdm),
+       FUNCTION(audio_pcm),
+       FUNCTION(gsbi1),
+       FUNCTION(gsbi2),
+       FUNCTION(gsbi4),
+       FUNCTION(gsbi5),
+       FUNCTION(gsbi5_spi_cs1),
+       FUNCTION(gsbi5_spi_cs2),
+       FUNCTION(gsbi5_spi_cs3),
+       FUNCTION(gsbi6),
+       FUNCTION(gsbi7),
+       FUNCTION(nss_spi),
+       FUNCTION(sdc1),
+       FUNCTION(spdif),
+       FUNCTION(nand),
+       FUNCTION(tsif1),
+       FUNCTION(tsif2),
+       FUNCTION(usb_fs_n),
+       FUNCTION(usb_fs),
+       FUNCTION(usb2_hsic),
+       FUNCTION(rgmii2),
+       FUNCTION(sata),
+       FUNCTION(pcie1_rst),
+       FUNCTION(pcie1_prsnt),
+       FUNCTION(pcie1_pwren_n),
+       FUNCTION(pcie1_pwren),
+       FUNCTION(pcie1_pwrflt),
+       FUNCTION(pcie1_clk_req),
+       FUNCTION(pcie2_rst),
+       FUNCTION(pcie2_prsnt),
+       FUNCTION(pcie2_pwren_n),
+       FUNCTION(pcie2_pwren),
+       FUNCTION(pcie2_pwrflt),
+       FUNCTION(pcie2_clk_req),
+       FUNCTION(pcie3_rst),
+       FUNCTION(pcie3_prsnt),
+       FUNCTION(pcie3_pwren_n),
+       FUNCTION(pcie3_pwren),
+       FUNCTION(pcie3_pwrflt),
+       FUNCTION(pcie3_clk_req),
+       FUNCTION(ps_hold),
+};
+
+static const struct msm_pingroup ipq8064_groups[] = {
+       PINGROUP(0, mdio, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(1, mdio, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(2, gsbi5_spi_cs3, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(3, pcie1_rst, pcie1_prsnt, pdm, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(4, pcie1_pwren_n, pcie1_pwren, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(5, pcie1_clk_req, pcie1_pwrflt, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(6, gsbi7, usb_fs, gsbi5_spi_cs1, usb_fs_n, NA, NA, NA, NA, NA, NA),
+       PINGROUP(7, gsbi7, usb_fs, gsbi5_spi_cs2, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(8, gsbi7, usb_fs, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(9, gsbi7, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(10, gsbi4, spdif, sata, ssbi, mdio, spmi, NA, NA, NA, NA),
+       PINGROUP(11, gsbi4, pcie2_prsnt, pcie1_prsnt, pcie3_prsnt, ssbi, mdio, spmi, NA, NA, NA),
+       PINGROUP(12, gsbi4, pcie2_pwren_n, pcie1_pwren_n, pcie3_pwren_n, pcie2_pwren, pcie1_pwren, pcie3_pwren, NA, NA, NA),
+       PINGROUP(13, gsbi4, pcie2_pwrflt, pcie1_pwrflt, pcie3_pwrflt, NA, NA, NA, NA, NA, NA),
+       PINGROUP(14, audio_pcm, nss_spi, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(15, audio_pcm, nss_spi, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(16, audio_pcm, nss_spi, pdm, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(17, audio_pcm, nss_spi, pdm, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(18, gsbi5, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(19, gsbi5, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(20, gsbi5, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(21, gsbi5, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(22, gsbi2, pdm, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(23, gsbi2, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(24, gsbi2, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(25, gsbi2, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(26, ps_hold, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(27, mi2s, rgmii2, gsbi6, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(28, mi2s, rgmii2, gsbi6, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(29, mi2s, rgmii2, gsbi6, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(30, mi2s, rgmii2, gsbi6, pdm, NA, NA, NA, NA, NA, NA),
+       PINGROUP(31, mi2s, rgmii2, pdm, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(32, mi2s, rgmii2, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(33, mi2s, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(34, nand, pdm, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(35, nand, pdm, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(36, nand, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(37, nand, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(38, nand, sdc1, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(39, nand, sdc1, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(40, nand, sdc1, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(41, nand, sdc1, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(42, nand, sdc1, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(43, nand, sdc1, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(44, nand, sdc1, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(45, nand, sdc1, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(46, nand, sdc1, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(47, nand, sdc1, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(48, pcie2_rst, spdif, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(49, pcie2_pwren_n, pcie2_pwren, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(50, pcie2_clk_req, pcie2_pwrflt, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(51, gsbi1, rgmii2, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(52, gsbi1, rgmii2, pdm, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(53, gsbi1, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(54, gsbi1, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(55, tsif1, mi2s, gsbi6, pdm, nss_spi, NA, NA, NA, NA, NA),
+       PINGROUP(56, tsif1, mi2s, gsbi6, pdm, nss_spi, NA, NA, NA, NA, NA),
+       PINGROUP(57, tsif1, mi2s, gsbi6, nss_spi, NA, NA, NA, NA, NA, NA),
+       PINGROUP(58, tsif1, mi2s, gsbi6, pdm, nss_spi, NA, NA, NA, NA, NA),
+       PINGROUP(59, tsif2, rgmii2, pdm, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(60, tsif2, rgmii2, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(61, tsif2, rgmii2, gsbi5_spi_cs1, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(62, tsif2, rgmii2, gsbi5_spi_cs2, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(63, pcie3_rst, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(64, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(65, pcie3_clk_req, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(66, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(67, usb2_hsic, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(68, usb2_hsic, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       SDC_PINGROUP(sdc3_clk, 0x204a, 14, 6),
+       SDC_PINGROUP(sdc3_cmd, 0x204a, 11, 3),
+       SDC_PINGROUP(sdc3_data, 0x204a, 9, 0),
+};
+
+#define NUM_GPIO_PINGROUPS 69
+
+static const struct msm_pinctrl_soc_data ipq8064_pinctrl = {
+       .pins = ipq8064_pins,
+       .npins = ARRAY_SIZE(ipq8064_pins),
+       .functions = ipq8064_functions,
+       .nfunctions = ARRAY_SIZE(ipq8064_functions),
+       .groups = ipq8064_groups,
+       .ngroups = ARRAY_SIZE(ipq8064_groups),
+       .ngpios = NUM_GPIO_PINGROUPS,
+};
+
+static int ipq8064_pinctrl_probe(struct platform_device *pdev)
+{
+       return msm_pinctrl_probe(pdev, &ipq8064_pinctrl);
+}
+
+static const struct of_device_id ipq8064_pinctrl_of_match[] = {
+       { .compatible = "qcom,ipq8064-pinctrl", },
+       { },
+};
+
+static struct platform_driver ipq8064_pinctrl_driver = {
+       .driver = {
+               .name = "ipq8064-pinctrl",
+               .owner = THIS_MODULE,
+               .of_match_table = ipq8064_pinctrl_of_match,
+       },
+       .probe = ipq8064_pinctrl_probe,
+       .remove = msm_pinctrl_remove,
+};
+
+static int __init ipq8064_pinctrl_init(void)
+{
+       return platform_driver_register(&ipq8064_pinctrl_driver);
+}
+arch_initcall(ipq8064_pinctrl_init);
+
+static void __exit ipq8064_pinctrl_exit(void)
+{
+       platform_driver_unregister(&ipq8064_pinctrl_driver);
+}
+module_exit(ipq8064_pinctrl_exit);
+
+MODULE_AUTHOR("Andy Gross <agross@codeaurora.org>");
+MODULE_DESCRIPTION("Qualcomm IPQ8064 pinctrl driver");
+MODULE_LICENSE("GPL v2");
+MODULE_DEVICE_TABLE(of, ipq8064_pinctrl_of_match);
diff --git a/drivers/pinctrl/qcom/pinctrl-msm.c b/drivers/pinctrl/qcom/pinctrl-msm.c
new file mode 100644 (file)
index 0000000..2738108
--- /dev/null
@@ -0,0 +1,919 @@
+/*
+ * Copyright (c) 2013, Sony Mobile Communications AB.
+ * Copyright (c) 2013, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/pinctrl/machine.h>
+#include <linux/pinctrl/pinctrl.h>
+#include <linux/pinctrl/pinmux.h>
+#include <linux/pinctrl/pinconf.h>
+#include <linux/pinctrl/pinconf-generic.h>
+#include <linux/slab.h>
+#include <linux/gpio.h>
+#include <linux/interrupt.h>
+#include <linux/spinlock.h>
+
+#include "../core.h"
+#include "../pinconf.h"
+#include "pinctrl-msm.h"
+#include "../pinctrl-utils.h"
+
+#define MAX_NR_GPIO 300
+
+/**
+ * struct msm_pinctrl - state for a pinctrl-msm device
+ * @dev:            device handle.
+ * @pctrl:          pinctrl handle.
+ * @chip:           gpiochip handle.
+ * @irq:            parent irq for the TLMM irq_chip.
+ * @lock:           Spinlock to protect register resources as well
+ *                  as msm_pinctrl data structures.
+ * @enabled_irqs:   Bitmap of currently enabled irqs.
+ * @dual_edge_irqs: Bitmap of irqs that need sw emulated dual edge
+ *                  detection.
+ * @soc;            Reference to soc_data of platform specific data.
+ * @regs:           Base address for the TLMM register map.
+ */
+struct msm_pinctrl {
+       struct device *dev;
+       struct pinctrl_dev *pctrl;
+       struct gpio_chip chip;
+       int irq;
+
+       spinlock_t lock;
+
+       DECLARE_BITMAP(dual_edge_irqs, MAX_NR_GPIO);
+       DECLARE_BITMAP(enabled_irqs, MAX_NR_GPIO);
+
+       const struct msm_pinctrl_soc_data *soc;
+       void __iomem *regs;
+};
+
+static inline struct msm_pinctrl *to_msm_pinctrl(struct gpio_chip *gc)
+{
+       return container_of(gc, struct msm_pinctrl, chip);
+}
+
+static int msm_get_groups_count(struct pinctrl_dev *pctldev)
+{
+       struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
+
+       return pctrl->soc->ngroups;
+}
+
+static const char *msm_get_group_name(struct pinctrl_dev *pctldev,
+                                     unsigned group)
+{
+       struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
+
+       return pctrl->soc->groups[group].name;
+}
+
+static int msm_get_group_pins(struct pinctrl_dev *pctldev,
+                             unsigned group,
+                             const unsigned **pins,
+                             unsigned *num_pins)
+{
+       struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
+
+       *pins = pctrl->soc->groups[group].pins;
+       *num_pins = pctrl->soc->groups[group].npins;
+       return 0;
+}
+
+static const struct pinctrl_ops msm_pinctrl_ops = {
+       .get_groups_count       = msm_get_groups_count,
+       .get_group_name         = msm_get_group_name,
+       .get_group_pins         = msm_get_group_pins,
+       .dt_node_to_map         = pinconf_generic_dt_node_to_map_group,
+       .dt_free_map            = pinctrl_utils_dt_free_map,
+};
+
+static int msm_get_functions_count(struct pinctrl_dev *pctldev)
+{
+       struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
+
+       return pctrl->soc->nfunctions;
+}
+
+static const char *msm_get_function_name(struct pinctrl_dev *pctldev,
+                                        unsigned function)
+{
+       struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
+
+       return pctrl->soc->functions[function].name;
+}
+
+static int msm_get_function_groups(struct pinctrl_dev *pctldev,
+                                  unsigned function,
+                                  const char * const **groups,
+                                  unsigned * const num_groups)
+{
+       struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
+
+       *groups = pctrl->soc->functions[function].groups;
+       *num_groups = pctrl->soc->functions[function].ngroups;
+       return 0;
+}
+
+static int msm_pinmux_enable(struct pinctrl_dev *pctldev,
+                            unsigned function,
+                            unsigned group)
+{
+       struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
+       const struct msm_pingroup *g;
+       unsigned long flags;
+       u32 val;
+       int i;
+
+       g = &pctrl->soc->groups[group];
+
+       for (i = 0; i < g->nfuncs; i++) {
+               if (g->funcs[i] == function)
+                       break;
+       }
+
+       if (WARN_ON(i == g->nfuncs))
+               return -EINVAL;
+
+       spin_lock_irqsave(&pctrl->lock, flags);
+
+       val = readl(pctrl->regs + g->ctl_reg);
+       val &= ~(0x7 << g->mux_bit);
+       val |= i << g->mux_bit;
+       writel(val, pctrl->regs + g->ctl_reg);
+
+       spin_unlock_irqrestore(&pctrl->lock, flags);
+
+       return 0;
+}
+
+static const struct pinmux_ops msm_pinmux_ops = {
+       .get_functions_count    = msm_get_functions_count,
+       .get_function_name      = msm_get_function_name,
+       .get_function_groups    = msm_get_function_groups,
+       .enable                 = msm_pinmux_enable,
+};
+
+static int msm_config_reg(struct msm_pinctrl *pctrl,
+                         const struct msm_pingroup *g,
+                         unsigned param,
+                         unsigned *mask,
+                         unsigned *bit)
+{
+       switch (param) {
+       case PIN_CONFIG_BIAS_DISABLE:
+       case PIN_CONFIG_BIAS_PULL_DOWN:
+       case PIN_CONFIG_BIAS_BUS_HOLD:
+       case PIN_CONFIG_BIAS_PULL_UP:
+               *bit = g->pull_bit;
+               *mask = 3;
+               break;
+       case PIN_CONFIG_DRIVE_STRENGTH:
+               *bit = g->drv_bit;
+               *mask = 7;
+               break;
+       case PIN_CONFIG_OUTPUT:
+               *bit = g->oe_bit;
+               *mask = 1;
+               break;
+       default:
+               dev_err(pctrl->dev, "Invalid config param %04x\n", param);
+               return -ENOTSUPP;
+       }
+
+       return 0;
+}
+
+static int msm_config_get(struct pinctrl_dev *pctldev,
+                         unsigned int pin,
+                         unsigned long *config)
+{
+       dev_err(pctldev->dev, "pin_config_set op not supported\n");
+       return -ENOTSUPP;
+}
+
+static int msm_config_set(struct pinctrl_dev *pctldev, unsigned int pin,
+                               unsigned long *configs, unsigned num_configs)
+{
+       dev_err(pctldev->dev, "pin_config_set op not supported\n");
+       return -ENOTSUPP;
+}
+
+#define MSM_NO_PULL    0
+#define MSM_PULL_DOWN  1
+#define MSM_KEEPER     2
+#define MSM_PULL_UP    3
+
+static unsigned msm_regval_to_drive(u32 val)
+{
+       return (val + 1) * 2;
+}
+
+static int msm_config_group_get(struct pinctrl_dev *pctldev,
+                               unsigned int group,
+                               unsigned long *config)
+{
+       const struct msm_pingroup *g;
+       struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
+       unsigned param = pinconf_to_config_param(*config);
+       unsigned mask;
+       unsigned arg;
+       unsigned bit;
+       int ret;
+       u32 val;
+
+       g = &pctrl->soc->groups[group];
+
+       ret = msm_config_reg(pctrl, g, param, &mask, &bit);
+       if (ret < 0)
+               return ret;
+
+       val = readl(pctrl->regs + g->ctl_reg);
+       arg = (val >> bit) & mask;
+
+       /* Convert register value to pinconf value */
+       switch (param) {
+       case PIN_CONFIG_BIAS_DISABLE:
+               arg = arg == MSM_NO_PULL;
+               break;
+       case PIN_CONFIG_BIAS_PULL_DOWN:
+               arg = arg == MSM_PULL_DOWN;
+               break;
+       case PIN_CONFIG_BIAS_BUS_HOLD:
+               arg = arg == MSM_KEEPER;
+               break;
+       case PIN_CONFIG_BIAS_PULL_UP:
+               arg = arg == MSM_PULL_UP;
+               break;
+       case PIN_CONFIG_DRIVE_STRENGTH:
+               arg = msm_regval_to_drive(arg);
+               break;
+       case PIN_CONFIG_OUTPUT:
+               /* Pin is not output */
+               if (!arg)
+                       return -EINVAL;
+
+               val = readl(pctrl->regs + g->io_reg);
+               arg = !!(val & BIT(g->in_bit));
+               break;
+       default:
+               dev_err(pctrl->dev, "Unsupported config parameter: %x\n",
+                       param);
+               return -EINVAL;
+       }
+
+       *config = pinconf_to_config_packed(param, arg);
+
+       return 0;
+}
+
+static int msm_config_group_set(struct pinctrl_dev *pctldev,
+                               unsigned group,
+                               unsigned long *configs,
+                               unsigned num_configs)
+{
+       const struct msm_pingroup *g;
+       struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
+       unsigned long flags;
+       unsigned param;
+       unsigned mask;
+       unsigned arg;
+       unsigned bit;
+       int ret;
+       u32 val;
+       int i;
+
+       g = &pctrl->soc->groups[group];
+
+       for (i = 0; i < num_configs; i++) {
+               param = pinconf_to_config_param(configs[i]);
+               arg = pinconf_to_config_argument(configs[i]);
+
+               ret = msm_config_reg(pctrl, g, param, &mask, &bit);
+               if (ret < 0)
+                       return ret;
+
+               /* Convert pinconf values to register values */
+               switch (param) {
+               case PIN_CONFIG_BIAS_DISABLE:
+                       arg = MSM_NO_PULL;
+                       break;
+               case PIN_CONFIG_BIAS_PULL_DOWN:
+                       arg = MSM_PULL_DOWN;
+                       break;
+               case PIN_CONFIG_BIAS_BUS_HOLD:
+                       arg = MSM_KEEPER;
+                       break;
+               case PIN_CONFIG_BIAS_PULL_UP:
+                       arg = MSM_PULL_UP;
+                       break;
+               case PIN_CONFIG_DRIVE_STRENGTH:
+                       /* Check for invalid values */
+                       if (arg > 16 || arg < 2 || (arg % 2) != 0)
+                               arg = -1;
+                       else
+                               arg = (arg / 2) - 1;
+                       break;
+               case PIN_CONFIG_OUTPUT:
+                       /* set output value */
+                       spin_lock_irqsave(&pctrl->lock, flags);
+                       val = readl(pctrl->regs + g->io_reg);
+                       if (arg)
+                               val |= BIT(g->out_bit);
+                       else
+                               val &= ~BIT(g->out_bit);
+                       writel(val, pctrl->regs + g->io_reg);
+                       spin_unlock_irqrestore(&pctrl->lock, flags);
+
+                       /* enable output */
+                       arg = 1;
+                       break;
+               default:
+                       dev_err(pctrl->dev, "Unsupported config parameter: %x\n",
+                               param);
+                       return -EINVAL;
+               }
+
+               /* Range-check user-supplied value */
+               if (arg & ~mask) {
+                       dev_err(pctrl->dev, "config %x: %x is invalid\n", param, arg);
+                       return -EINVAL;
+               }
+
+               spin_lock_irqsave(&pctrl->lock, flags);
+               val = readl(pctrl->regs + g->ctl_reg);
+               val &= ~(mask << bit);
+               val |= arg << bit;
+               writel(val, pctrl->regs + g->ctl_reg);
+               spin_unlock_irqrestore(&pctrl->lock, flags);
+       }
+
+       return 0;
+}
+
+static const struct pinconf_ops msm_pinconf_ops = {
+       .pin_config_get         = msm_config_get,
+       .pin_config_set         = msm_config_set,
+       .pin_config_group_get   = msm_config_group_get,
+       .pin_config_group_set   = msm_config_group_set,
+};
+
+static struct pinctrl_desc msm_pinctrl_desc = {
+       .pctlops = &msm_pinctrl_ops,
+       .pmxops = &msm_pinmux_ops,
+       .confops = &msm_pinconf_ops,
+       .owner = THIS_MODULE,
+};
+
+static int msm_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
+{
+       const struct msm_pingroup *g;
+       struct msm_pinctrl *pctrl = container_of(chip, struct msm_pinctrl, chip);
+       unsigned long flags;
+       u32 val;
+
+       g = &pctrl->soc->groups[offset];
+
+       spin_lock_irqsave(&pctrl->lock, flags);
+
+       val = readl(pctrl->regs + g->ctl_reg);
+       val &= ~BIT(g->oe_bit);
+       writel(val, pctrl->regs + g->ctl_reg);
+
+       spin_unlock_irqrestore(&pctrl->lock, flags);
+
+       return 0;
+}
+
+static int msm_gpio_direction_output(struct gpio_chip *chip, unsigned offset, int value)
+{
+       const struct msm_pingroup *g;
+       struct msm_pinctrl *pctrl = container_of(chip, struct msm_pinctrl, chip);
+       unsigned long flags;
+       u32 val;
+
+       g = &pctrl->soc->groups[offset];
+
+       spin_lock_irqsave(&pctrl->lock, flags);
+
+       val = readl(pctrl->regs + g->io_reg);
+       if (value)
+               val |= BIT(g->out_bit);
+       else
+               val &= ~BIT(g->out_bit);
+       writel(val, pctrl->regs + g->io_reg);
+
+       val = readl(pctrl->regs + g->ctl_reg);
+       val |= BIT(g->oe_bit);
+       writel(val, pctrl->regs + g->ctl_reg);
+
+       spin_unlock_irqrestore(&pctrl->lock, flags);
+
+       return 0;
+}
+
+static int msm_gpio_get(struct gpio_chip *chip, unsigned offset)
+{
+       const struct msm_pingroup *g;
+       struct msm_pinctrl *pctrl = container_of(chip, struct msm_pinctrl, chip);
+       u32 val;
+
+       g = &pctrl->soc->groups[offset];
+
+       val = readl(pctrl->regs + g->io_reg);
+       return !!(val & BIT(g->in_bit));
+}
+
+static void msm_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
+{
+       const struct msm_pingroup *g;
+       struct msm_pinctrl *pctrl = container_of(chip, struct msm_pinctrl, chip);
+       unsigned long flags;
+       u32 val;
+
+       g = &pctrl->soc->groups[offset];
+
+       spin_lock_irqsave(&pctrl->lock, flags);
+
+       val = readl(pctrl->regs + g->io_reg);
+       if (value)
+               val |= BIT(g->out_bit);
+       else
+               val &= ~BIT(g->out_bit);
+       writel(val, pctrl->regs + g->io_reg);
+
+       spin_unlock_irqrestore(&pctrl->lock, flags);
+}
+
+static int msm_gpio_request(struct gpio_chip *chip, unsigned offset)
+{
+       int gpio = chip->base + offset;
+       return pinctrl_request_gpio(gpio);
+}
+
+static void msm_gpio_free(struct gpio_chip *chip, unsigned offset)
+{
+       int gpio = chip->base + offset;
+       return pinctrl_free_gpio(gpio);
+}
+
+#ifdef CONFIG_DEBUG_FS
+#include <linux/seq_file.h>
+
+static void msm_gpio_dbg_show_one(struct seq_file *s,
+                                 struct pinctrl_dev *pctldev,
+                                 struct gpio_chip *chip,
+                                 unsigned offset,
+                                 unsigned gpio)
+{
+       const struct msm_pingroup *g;
+       struct msm_pinctrl *pctrl = container_of(chip, struct msm_pinctrl, chip);
+       unsigned func;
+       int is_out;
+       int drive;
+       int pull;
+       u32 ctl_reg;
+
+       static const char * const pulls[] = {
+               "no pull",
+               "pull down",
+               "keeper",
+               "pull up"
+       };
+
+       g = &pctrl->soc->groups[offset];
+       ctl_reg = readl(pctrl->regs + g->ctl_reg);
+
+       is_out = !!(ctl_reg & BIT(g->oe_bit));
+       func = (ctl_reg >> g->mux_bit) & 7;
+       drive = (ctl_reg >> g->drv_bit) & 7;
+       pull = (ctl_reg >> g->pull_bit) & 3;
+
+       seq_printf(s, " %-8s: %-3s %d", g->name, is_out ? "out" : "in", func);
+       seq_printf(s, " %dmA", msm_regval_to_drive(drive));
+       seq_printf(s, " %s", pulls[pull]);
+}
+
+static void msm_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
+{
+       unsigned gpio = chip->base;
+       unsigned i;
+
+       for (i = 0; i < chip->ngpio; i++, gpio++) {
+               msm_gpio_dbg_show_one(s, NULL, chip, i, gpio);
+               seq_puts(s, "\n");
+       }
+}
+
+#else
+#define msm_gpio_dbg_show NULL
+#endif
+
+static struct gpio_chip msm_gpio_template = {
+       .direction_input  = msm_gpio_direction_input,
+       .direction_output = msm_gpio_direction_output,
+       .get              = msm_gpio_get,
+       .set              = msm_gpio_set,
+       .request          = msm_gpio_request,
+       .free             = msm_gpio_free,
+       .dbg_show         = msm_gpio_dbg_show,
+};
+
+/* For dual-edge interrupts in software, since some hardware has no
+ * such support:
+ *
+ * At appropriate moments, this function may be called to flip the polarity
+ * settings of both-edge irq lines to try and catch the next edge.
+ *
+ * The attempt is considered successful if:
+ * - the status bit goes high, indicating that an edge was caught, or
+ * - the input value of the gpio doesn't change during the attempt.
+ * If the value changes twice during the process, that would cause the first
+ * test to fail but would force the second, as two opposite
+ * transitions would cause a detection no matter the polarity setting.
+ *
+ * The do-loop tries to sledge-hammer closed the timing hole between
+ * the initial value-read and the polarity-write - if the line value changes
+ * during that window, an interrupt is lost, the new polarity setting is
+ * incorrect, and the first success test will fail, causing a retry.
+ *
+ * Algorithm comes from Google's msmgpio driver.
+ */
+static void msm_gpio_update_dual_edge_pos(struct msm_pinctrl *pctrl,
+                                         const struct msm_pingroup *g,
+                                         struct irq_data *d)
+{
+       int loop_limit = 100;
+       unsigned val, val2, intstat;
+       unsigned pol;
+
+       do {
+               val = readl(pctrl->regs + g->io_reg) & BIT(g->in_bit);
+
+               pol = readl(pctrl->regs + g->intr_cfg_reg);
+               pol ^= BIT(g->intr_polarity_bit);
+               writel(pol, pctrl->regs + g->intr_cfg_reg);
+
+               val2 = readl(pctrl->regs + g->io_reg) & BIT(g->in_bit);
+               intstat = readl(pctrl->regs + g->intr_status_reg);
+               if (intstat || (val == val2))
+                       return;
+       } while (loop_limit-- > 0);
+       dev_err(pctrl->dev, "dual-edge irq failed to stabilize, %#08x != %#08x\n",
+               val, val2);
+}
+
+static void msm_gpio_irq_mask(struct irq_data *d)
+{
+       struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
+       struct msm_pinctrl *pctrl = to_msm_pinctrl(gc);
+       const struct msm_pingroup *g;
+       unsigned long flags;
+       u32 val;
+
+       g = &pctrl->soc->groups[d->hwirq];
+
+       spin_lock_irqsave(&pctrl->lock, flags);
+
+       val = readl(pctrl->regs + g->intr_cfg_reg);
+       val &= ~BIT(g->intr_enable_bit);
+       writel(val, pctrl->regs + g->intr_cfg_reg);
+
+       clear_bit(d->hwirq, pctrl->enabled_irqs);
+
+       spin_unlock_irqrestore(&pctrl->lock, flags);
+}
+
+static void msm_gpio_irq_unmask(struct irq_data *d)
+{
+       struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
+       struct msm_pinctrl *pctrl = to_msm_pinctrl(gc);
+       const struct msm_pingroup *g;
+       unsigned long flags;
+       u32 val;
+
+       g = &pctrl->soc->groups[d->hwirq];
+
+       spin_lock_irqsave(&pctrl->lock, flags);
+
+       val = readl(pctrl->regs + g->intr_status_reg);
+       val &= ~BIT(g->intr_status_bit);
+       writel(val, pctrl->regs + g->intr_status_reg);
+
+       val = readl(pctrl->regs + g->intr_cfg_reg);
+       val |= BIT(g->intr_enable_bit);
+       writel(val, pctrl->regs + g->intr_cfg_reg);
+
+       set_bit(d->hwirq, pctrl->enabled_irqs);
+
+       spin_unlock_irqrestore(&pctrl->lock, flags);
+}
+
+static void msm_gpio_irq_ack(struct irq_data *d)
+{
+       struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
+       struct msm_pinctrl *pctrl = to_msm_pinctrl(gc);
+       const struct msm_pingroup *g;
+       unsigned long flags;
+       u32 val;
+
+       g = &pctrl->soc->groups[d->hwirq];
+
+       spin_lock_irqsave(&pctrl->lock, flags);
+
+       val = readl(pctrl->regs + g->intr_status_reg);
+       if (g->intr_ack_high)
+               val |= BIT(g->intr_status_bit);
+       else
+               val &= ~BIT(g->intr_status_bit);
+       writel(val, pctrl->regs + g->intr_status_reg);
+
+       if (test_bit(d->hwirq, pctrl->dual_edge_irqs))
+               msm_gpio_update_dual_edge_pos(pctrl, g, d);
+
+       spin_unlock_irqrestore(&pctrl->lock, flags);
+}
+
+#define INTR_TARGET_PROC_APPS    4
+
+static int msm_gpio_irq_set_type(struct irq_data *d, unsigned int type)
+{
+       struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
+       struct msm_pinctrl *pctrl = to_msm_pinctrl(gc);
+       const struct msm_pingroup *g;
+       unsigned long flags;
+       u32 val;
+
+       g = &pctrl->soc->groups[d->hwirq];
+
+       spin_lock_irqsave(&pctrl->lock, flags);
+
+       /*
+        * For hw without possibility of detecting both edges
+        */
+       if (g->intr_detection_width == 1 && type == IRQ_TYPE_EDGE_BOTH)
+               set_bit(d->hwirq, pctrl->dual_edge_irqs);
+       else
+               clear_bit(d->hwirq, pctrl->dual_edge_irqs);
+
+       /* Route interrupts to application cpu */
+       val = readl(pctrl->regs + g->intr_target_reg);
+       val &= ~(7 << g->intr_target_bit);
+       val |= INTR_TARGET_PROC_APPS << g->intr_target_bit;
+       writel(val, pctrl->regs + g->intr_target_reg);
+
+       /* Update configuration for gpio.
+        * RAW_STATUS_EN is left on for all gpio irqs. Due to the
+        * internal circuitry of TLMM, toggling the RAW_STATUS
+        * could cause the INTR_STATUS to be set for EDGE interrupts.
+        */
+       val = readl(pctrl->regs + g->intr_cfg_reg);
+       val |= BIT(g->intr_raw_status_bit);
+       if (g->intr_detection_width == 2) {
+               val &= ~(3 << g->intr_detection_bit);
+               val &= ~(1 << g->intr_polarity_bit);
+               switch (type) {
+               case IRQ_TYPE_EDGE_RISING:
+                       val |= 1 << g->intr_detection_bit;
+                       val |= BIT(g->intr_polarity_bit);
+                       break;
+               case IRQ_TYPE_EDGE_FALLING:
+                       val |= 2 << g->intr_detection_bit;
+                       val |= BIT(g->intr_polarity_bit);
+                       break;
+               case IRQ_TYPE_EDGE_BOTH:
+                       val |= 3 << g->intr_detection_bit;
+                       val |= BIT(g->intr_polarity_bit);
+                       break;
+               case IRQ_TYPE_LEVEL_LOW:
+                       break;
+               case IRQ_TYPE_LEVEL_HIGH:
+                       val |= BIT(g->intr_polarity_bit);
+                       break;
+               }
+       } else if (g->intr_detection_width == 1) {
+               val &= ~(1 << g->intr_detection_bit);
+               val &= ~(1 << g->intr_polarity_bit);
+               switch (type) {
+               case IRQ_TYPE_EDGE_RISING:
+                       val |= BIT(g->intr_detection_bit);
+                       val |= BIT(g->intr_polarity_bit);
+                       break;
+               case IRQ_TYPE_EDGE_FALLING:
+                       val |= BIT(g->intr_detection_bit);
+                       break;
+               case IRQ_TYPE_EDGE_BOTH:
+                       val |= BIT(g->intr_detection_bit);
+                       val |= BIT(g->intr_polarity_bit);
+                       break;
+               case IRQ_TYPE_LEVEL_LOW:
+                       break;
+               case IRQ_TYPE_LEVEL_HIGH:
+                       val |= BIT(g->intr_polarity_bit);
+                       break;
+               }
+       } else {
+               BUG();
+       }
+       writel(val, pctrl->regs + g->intr_cfg_reg);
+
+       if (test_bit(d->hwirq, pctrl->dual_edge_irqs))
+               msm_gpio_update_dual_edge_pos(pctrl, g, d);
+
+       spin_unlock_irqrestore(&pctrl->lock, flags);
+
+       if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH))
+               __irq_set_handler_locked(d->irq, handle_level_irq);
+       else if (type & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING))
+               __irq_set_handler_locked(d->irq, handle_edge_irq);
+
+       return 0;
+}
+
+static int msm_gpio_irq_set_wake(struct irq_data *d, unsigned int on)
+{
+       struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
+       struct msm_pinctrl *pctrl = to_msm_pinctrl(gc);
+       unsigned long flags;
+
+       spin_lock_irqsave(&pctrl->lock, flags);
+
+       irq_set_irq_wake(pctrl->irq, on);
+
+       spin_unlock_irqrestore(&pctrl->lock, flags);
+
+       return 0;
+}
+
+static struct irq_chip msm_gpio_irq_chip = {
+       .name           = "msmgpio",
+       .irq_mask       = msm_gpio_irq_mask,
+       .irq_unmask     = msm_gpio_irq_unmask,
+       .irq_ack        = msm_gpio_irq_ack,
+       .irq_set_type   = msm_gpio_irq_set_type,
+       .irq_set_wake   = msm_gpio_irq_set_wake,
+};
+
+static void msm_gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
+{
+       struct gpio_chip *gc = irq_desc_get_handler_data(desc);
+       const struct msm_pingroup *g;
+       struct msm_pinctrl *pctrl = to_msm_pinctrl(gc);
+       struct irq_chip *chip = irq_get_chip(irq);
+       int irq_pin;
+       int handled = 0;
+       u32 val;
+       int i;
+
+       chained_irq_enter(chip, desc);
+
+       /*
+        * Each pin has it's own IRQ status register, so use
+        * enabled_irq bitmap to limit the number of reads.
+        */
+       for_each_set_bit(i, pctrl->enabled_irqs, pctrl->chip.ngpio) {
+               g = &pctrl->soc->groups[i];
+               val = readl(pctrl->regs + g->intr_status_reg);
+               if (val & BIT(g->intr_status_bit)) {
+                       irq_pin = irq_find_mapping(gc->irqdomain, i);
+                       generic_handle_irq(irq_pin);
+                       handled++;
+               }
+       }
+
+       /* No interrupts were flagged */
+       if (handled == 0)
+               handle_bad_irq(irq, desc);
+
+       chained_irq_exit(chip, desc);
+}
+
+static int msm_gpio_init(struct msm_pinctrl *pctrl)
+{
+       struct gpio_chip *chip;
+       int ret;
+       unsigned ngpio = pctrl->soc->ngpios;
+
+       if (WARN_ON(ngpio > MAX_NR_GPIO))
+               return -EINVAL;
+
+       chip = &pctrl->chip;
+       chip->base = 0;
+       chip->ngpio = ngpio;
+       chip->label = dev_name(pctrl->dev);
+       chip->dev = pctrl->dev;
+       chip->owner = THIS_MODULE;
+       chip->of_node = pctrl->dev->of_node;
+
+       ret = gpiochip_add(&pctrl->chip);
+       if (ret) {
+               dev_err(pctrl->dev, "Failed register gpiochip\n");
+               return ret;
+       }
+
+       ret = gpiochip_add_pin_range(&pctrl->chip, dev_name(pctrl->dev), 0, 0, chip->ngpio);
+       if (ret) {
+               dev_err(pctrl->dev, "Failed to add pin range\n");
+               return ret;
+       }
+
+       ret = gpiochip_irqchip_add(chip,
+                                  &msm_gpio_irq_chip,
+                                  0,
+                                  handle_edge_irq,
+                                  IRQ_TYPE_NONE);
+       if (ret) {
+               dev_err(pctrl->dev, "Failed to add irqchip to gpiochip\n");
+               return -ENOSYS;
+       }
+
+       gpiochip_set_chained_irqchip(chip, &msm_gpio_irq_chip, pctrl->irq,
+                                    msm_gpio_irq_handler);
+
+       return 0;
+}
+
+int msm_pinctrl_probe(struct platform_device *pdev,
+                     const struct msm_pinctrl_soc_data *soc_data)
+{
+       struct msm_pinctrl *pctrl;
+       struct resource *res;
+       int ret;
+
+       pctrl = devm_kzalloc(&pdev->dev, sizeof(*pctrl), GFP_KERNEL);
+       if (!pctrl) {
+               dev_err(&pdev->dev, "Can't allocate msm_pinctrl\n");
+               return -ENOMEM;
+       }
+       pctrl->dev = &pdev->dev;
+       pctrl->soc = soc_data;
+       pctrl->chip = msm_gpio_template;
+
+       spin_lock_init(&pctrl->lock);
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       pctrl->regs = devm_ioremap_resource(&pdev->dev, res);
+       if (IS_ERR(pctrl->regs))
+               return PTR_ERR(pctrl->regs);
+
+       pctrl->irq = platform_get_irq(pdev, 0);
+       if (pctrl->irq < 0) {
+               dev_err(&pdev->dev, "No interrupt defined for msmgpio\n");
+               return pctrl->irq;
+       }
+
+       msm_pinctrl_desc.name = dev_name(&pdev->dev);
+       msm_pinctrl_desc.pins = pctrl->soc->pins;
+       msm_pinctrl_desc.npins = pctrl->soc->npins;
+       pctrl->pctrl = pinctrl_register(&msm_pinctrl_desc, &pdev->dev, pctrl);
+       if (!pctrl->pctrl) {
+               dev_err(&pdev->dev, "Couldn't register pinctrl driver\n");
+               return -ENODEV;
+       }
+
+       ret = msm_gpio_init(pctrl);
+       if (ret) {
+               pinctrl_unregister(pctrl->pctrl);
+               return ret;
+       }
+
+       platform_set_drvdata(pdev, pctrl);
+
+       dev_dbg(&pdev->dev, "Probed Qualcomm pinctrl driver\n");
+
+       return 0;
+}
+EXPORT_SYMBOL(msm_pinctrl_probe);
+
+int msm_pinctrl_remove(struct platform_device *pdev)
+{
+       struct msm_pinctrl *pctrl = platform_get_drvdata(pdev);
+       int ret;
+
+       ret = gpiochip_remove(&pctrl->chip);
+       if (ret) {
+               dev_err(&pdev->dev, "Failed to remove gpiochip\n");
+               return ret;
+       }
+
+       pinctrl_unregister(pctrl->pctrl);
+
+       return 0;
+}
+EXPORT_SYMBOL(msm_pinctrl_remove);
+
diff --git a/drivers/pinctrl/qcom/pinctrl-msm.h b/drivers/pinctrl/qcom/pinctrl-msm.h
new file mode 100644 (file)
index 0000000..7b2a227
--- /dev/null
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 2013, Sony Mobile Communications AB.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+#ifndef __PINCTRL_MSM_H__
+#define __PINCTRL_MSM_H__
+
+struct pinctrl_pin_desc;
+
+/**
+ * struct msm_function - a pinmux function
+ * @name:    Name of the pinmux function.
+ * @groups:  List of pingroups for this function.
+ * @ngroups: Number of entries in @groups.
+ */
+struct msm_function {
+       const char *name;
+       const char * const *groups;
+       unsigned ngroups;
+};
+
+/**
+ * struct msm_pingroup - Qualcomm pingroup definition
+ * @name:                 Name of the pingroup.
+ * @pins:                A list of pins assigned to this pingroup.
+ * @npins:               Number of entries in @pins.
+ * @funcs:                A list of pinmux functions that can be selected for
+ *                        this group. The index of the selected function is used
+ *                        for programming the function selector.
+ *                        Entries should be indices into the groups list of the
+ *                        struct msm_pinctrl_soc_data.
+ * @ctl_reg:              Offset of the register holding control bits for this group.
+ * @io_reg:               Offset of the register holding input/output bits for this group.
+ * @intr_cfg_reg:         Offset of the register holding interrupt configuration bits.
+ * @intr_status_reg:      Offset of the register holding the status bits for this group.
+ * @intr_target_reg:      Offset of the register specifying routing of the interrupts
+ *                        from this group.
+ * @mux_bit:              Offset in @ctl_reg for the pinmux function selection.
+ * @pull_bit:             Offset in @ctl_reg for the bias configuration.
+ * @drv_bit:              Offset in @ctl_reg for the drive strength configuration.
+ * @oe_bit:               Offset in @ctl_reg for controlling output enable.
+ * @in_bit:               Offset in @io_reg for the input bit value.
+ * @out_bit:              Offset in @io_reg for the output bit value.
+ * @intr_enable_bit:      Offset in @intr_cfg_reg for enabling the interrupt for this group.
+ * @intr_status_bit:      Offset in @intr_status_reg for reading and acking the interrupt
+ *                        status.
+ * @intr_target_bit:      Offset in @intr_target_reg for configuring the interrupt routing.
+ * @intr_raw_status_bit:  Offset in @intr_cfg_reg for the raw status bit.
+ * @intr_polarity_bit:    Offset in @intr_cfg_reg for specifying polarity of the interrupt.
+ * @intr_detection_bit:   Offset in @intr_cfg_reg for specifying interrupt type.
+ * @intr_detection_width: Number of bits used for specifying interrupt type,
+ *                        Should be 2 for SoCs that can detect both edges in hardware,
+ *                        otherwise 1.
+ */
+struct msm_pingroup {
+       const char *name;
+       const unsigned *pins;
+       unsigned npins;
+
+       unsigned *funcs;
+       unsigned nfuncs;
+
+       s16 ctl_reg;
+       s16 io_reg;
+       s16 intr_cfg_reg;
+       s16 intr_status_reg;
+       s16 intr_target_reg;
+
+       unsigned mux_bit:5;
+
+       unsigned pull_bit:5;
+       unsigned drv_bit:5;
+
+       unsigned oe_bit:5;
+       unsigned in_bit:5;
+       unsigned out_bit:5;
+
+       unsigned intr_enable_bit:5;
+       unsigned intr_status_bit:5;
+       unsigned intr_ack_high:1;
+
+       unsigned intr_target_bit:5;
+       unsigned intr_raw_status_bit:5;
+       unsigned intr_polarity_bit:5;
+       unsigned intr_detection_bit:5;
+       unsigned intr_detection_width:5;
+};
+
+/**
+ * struct msm_pinctrl_soc_data - Qualcomm pin controller driver configuration
+ * @pins:       An array describing all pins the pin controller affects.
+ * @npins:      The number of entries in @pins.
+ * @functions:  An array describing all mux functions the SoC supports.
+ * @nfunctions: The number of entries in @functions.
+ * @groups:     An array describing all pin groups the pin SoC supports.
+ * @ngroups:    The numbmer of entries in @groups.
+ * @ngpio:      The number of pingroups the driver should expose as GPIOs.
+ */
+struct msm_pinctrl_soc_data {
+       const struct pinctrl_pin_desc *pins;
+       unsigned npins;
+       const struct msm_function *functions;
+       unsigned nfunctions;
+       const struct msm_pingroup *groups;
+       unsigned ngroups;
+       unsigned ngpios;
+};
+
+int msm_pinctrl_probe(struct platform_device *pdev,
+                     const struct msm_pinctrl_soc_data *soc_data);
+int msm_pinctrl_remove(struct platform_device *pdev);
+
+#endif
diff --git a/drivers/pinctrl/qcom/pinctrl-msm8960.c b/drivers/pinctrl/qcom/pinctrl-msm8960.c
new file mode 100644 (file)
index 0000000..3504703
--- /dev/null
@@ -0,0 +1,1282 @@
+/*
+ * Copyright (c) 2014, Sony Mobile Communications AB.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/pinctrl/pinctrl.h>
+#include <linux/pinctrl/pinmux.h>
+
+#include "pinctrl-msm.h"
+
+static const struct pinctrl_pin_desc msm8960_pins[] = {
+       PINCTRL_PIN(0, "GPIO_0"),
+       PINCTRL_PIN(1, "GPIO_1"),
+       PINCTRL_PIN(2, "GPIO_2"),
+       PINCTRL_PIN(3, "GPIO_3"),
+       PINCTRL_PIN(4, "GPIO_4"),
+       PINCTRL_PIN(5, "GPIO_5"),
+       PINCTRL_PIN(6, "GPIO_6"),
+       PINCTRL_PIN(7, "GPIO_7"),
+       PINCTRL_PIN(8, "GPIO_8"),
+       PINCTRL_PIN(9, "GPIO_9"),
+       PINCTRL_PIN(10, "GPIO_10"),
+       PINCTRL_PIN(11, "GPIO_11"),
+       PINCTRL_PIN(12, "GPIO_12"),
+       PINCTRL_PIN(13, "GPIO_13"),
+       PINCTRL_PIN(14, "GPIO_14"),
+       PINCTRL_PIN(15, "GPIO_15"),
+       PINCTRL_PIN(16, "GPIO_16"),
+       PINCTRL_PIN(17, "GPIO_17"),
+       PINCTRL_PIN(18, "GPIO_18"),
+       PINCTRL_PIN(19, "GPIO_19"),
+       PINCTRL_PIN(20, "GPIO_20"),
+       PINCTRL_PIN(21, "GPIO_21"),
+       PINCTRL_PIN(22, "GPIO_22"),
+       PINCTRL_PIN(23, "GPIO_23"),
+       PINCTRL_PIN(24, "GPIO_24"),
+       PINCTRL_PIN(25, "GPIO_25"),
+       PINCTRL_PIN(26, "GPIO_26"),
+       PINCTRL_PIN(27, "GPIO_27"),
+       PINCTRL_PIN(28, "GPIO_28"),
+       PINCTRL_PIN(29, "GPIO_29"),
+       PINCTRL_PIN(30, "GPIO_30"),
+       PINCTRL_PIN(31, "GPIO_31"),
+       PINCTRL_PIN(32, "GPIO_32"),
+       PINCTRL_PIN(33, "GPIO_33"),
+       PINCTRL_PIN(34, "GPIO_34"),
+       PINCTRL_PIN(35, "GPIO_35"),
+       PINCTRL_PIN(36, "GPIO_36"),
+       PINCTRL_PIN(37, "GPIO_37"),
+       PINCTRL_PIN(38, "GPIO_38"),
+       PINCTRL_PIN(39, "GPIO_39"),
+       PINCTRL_PIN(40, "GPIO_40"),
+       PINCTRL_PIN(41, "GPIO_41"),
+       PINCTRL_PIN(42, "GPIO_42"),
+       PINCTRL_PIN(43, "GPIO_43"),
+       PINCTRL_PIN(44, "GPIO_44"),
+       PINCTRL_PIN(45, "GPIO_45"),
+       PINCTRL_PIN(46, "GPIO_46"),
+       PINCTRL_PIN(47, "GPIO_47"),
+       PINCTRL_PIN(48, "GPIO_48"),
+       PINCTRL_PIN(49, "GPIO_49"),
+       PINCTRL_PIN(50, "GPIO_50"),
+       PINCTRL_PIN(51, "GPIO_51"),
+       PINCTRL_PIN(52, "GPIO_52"),
+       PINCTRL_PIN(53, "GPIO_53"),
+       PINCTRL_PIN(54, "GPIO_54"),
+       PINCTRL_PIN(55, "GPIO_55"),
+       PINCTRL_PIN(56, "GPIO_56"),
+       PINCTRL_PIN(57, "GPIO_57"),
+       PINCTRL_PIN(58, "GPIO_58"),
+       PINCTRL_PIN(59, "GPIO_59"),
+       PINCTRL_PIN(60, "GPIO_60"),
+       PINCTRL_PIN(61, "GPIO_61"),
+       PINCTRL_PIN(62, "GPIO_62"),
+       PINCTRL_PIN(63, "GPIO_63"),
+       PINCTRL_PIN(64, "GPIO_64"),
+       PINCTRL_PIN(65, "GPIO_65"),
+       PINCTRL_PIN(66, "GPIO_66"),
+       PINCTRL_PIN(67, "GPIO_67"),
+       PINCTRL_PIN(68, "GPIO_68"),
+       PINCTRL_PIN(69, "GPIO_69"),
+       PINCTRL_PIN(70, "GPIO_70"),
+       PINCTRL_PIN(71, "GPIO_71"),
+       PINCTRL_PIN(72, "GPIO_72"),
+       PINCTRL_PIN(73, "GPIO_73"),
+       PINCTRL_PIN(74, "GPIO_74"),
+       PINCTRL_PIN(75, "GPIO_75"),
+       PINCTRL_PIN(76, "GPIO_76"),
+       PINCTRL_PIN(77, "GPIO_77"),
+       PINCTRL_PIN(78, "GPIO_78"),
+       PINCTRL_PIN(79, "GPIO_79"),
+       PINCTRL_PIN(80, "GPIO_80"),
+       PINCTRL_PIN(81, "GPIO_81"),
+       PINCTRL_PIN(82, "GPIO_82"),
+       PINCTRL_PIN(83, "GPIO_83"),
+       PINCTRL_PIN(84, "GPIO_84"),
+       PINCTRL_PIN(85, "GPIO_85"),
+       PINCTRL_PIN(86, "GPIO_86"),
+       PINCTRL_PIN(87, "GPIO_87"),
+       PINCTRL_PIN(88, "GPIO_88"),
+       PINCTRL_PIN(89, "GPIO_89"),
+       PINCTRL_PIN(90, "GPIO_90"),
+       PINCTRL_PIN(91, "GPIO_91"),
+       PINCTRL_PIN(92, "GPIO_92"),
+       PINCTRL_PIN(93, "GPIO_93"),
+       PINCTRL_PIN(94, "GPIO_94"),
+       PINCTRL_PIN(95, "GPIO_95"),
+       PINCTRL_PIN(96, "GPIO_96"),
+       PINCTRL_PIN(97, "GPIO_97"),
+       PINCTRL_PIN(98, "GPIO_98"),
+       PINCTRL_PIN(99, "GPIO_99"),
+       PINCTRL_PIN(100, "GPIO_100"),
+       PINCTRL_PIN(101, "GPIO_101"),
+       PINCTRL_PIN(102, "GPIO_102"),
+       PINCTRL_PIN(103, "GPIO_103"),
+       PINCTRL_PIN(104, "GPIO_104"),
+       PINCTRL_PIN(105, "GPIO_105"),
+       PINCTRL_PIN(106, "GPIO_106"),
+       PINCTRL_PIN(107, "GPIO_107"),
+       PINCTRL_PIN(108, "GPIO_108"),
+       PINCTRL_PIN(109, "GPIO_109"),
+       PINCTRL_PIN(110, "GPIO_110"),
+       PINCTRL_PIN(111, "GPIO_111"),
+       PINCTRL_PIN(112, "GPIO_112"),
+       PINCTRL_PIN(113, "GPIO_113"),
+       PINCTRL_PIN(114, "GPIO_114"),
+       PINCTRL_PIN(115, "GPIO_115"),
+       PINCTRL_PIN(116, "GPIO_116"),
+       PINCTRL_PIN(117, "GPIO_117"),
+       PINCTRL_PIN(118, "GPIO_118"),
+       PINCTRL_PIN(119, "GPIO_119"),
+       PINCTRL_PIN(120, "GPIO_120"),
+       PINCTRL_PIN(121, "GPIO_121"),
+       PINCTRL_PIN(122, "GPIO_122"),
+       PINCTRL_PIN(123, "GPIO_123"),
+       PINCTRL_PIN(124, "GPIO_124"),
+       PINCTRL_PIN(125, "GPIO_125"),
+       PINCTRL_PIN(126, "GPIO_126"),
+       PINCTRL_PIN(127, "GPIO_127"),
+       PINCTRL_PIN(128, "GPIO_128"),
+       PINCTRL_PIN(129, "GPIO_129"),
+       PINCTRL_PIN(130, "GPIO_130"),
+       PINCTRL_PIN(131, "GPIO_131"),
+       PINCTRL_PIN(132, "GPIO_132"),
+       PINCTRL_PIN(133, "GPIO_133"),
+       PINCTRL_PIN(134, "GPIO_134"),
+       PINCTRL_PIN(135, "GPIO_135"),
+       PINCTRL_PIN(136, "GPIO_136"),
+       PINCTRL_PIN(137, "GPIO_137"),
+       PINCTRL_PIN(138, "GPIO_138"),
+       PINCTRL_PIN(139, "GPIO_139"),
+       PINCTRL_PIN(140, "GPIO_140"),
+       PINCTRL_PIN(141, "GPIO_141"),
+       PINCTRL_PIN(142, "GPIO_142"),
+       PINCTRL_PIN(143, "GPIO_143"),
+       PINCTRL_PIN(144, "GPIO_144"),
+       PINCTRL_PIN(145, "GPIO_145"),
+       PINCTRL_PIN(146, "GPIO_146"),
+       PINCTRL_PIN(147, "GPIO_147"),
+       PINCTRL_PIN(148, "GPIO_148"),
+       PINCTRL_PIN(149, "GPIO_149"),
+       PINCTRL_PIN(150, "GPIO_150"),
+       PINCTRL_PIN(151, "GPIO_151"),
+
+       PINCTRL_PIN(152, "SDC1_CLK"),
+       PINCTRL_PIN(153, "SDC1_CMD"),
+       PINCTRL_PIN(154, "SDC1_DATA"),
+       PINCTRL_PIN(155, "SDC3_CLK"),
+       PINCTRL_PIN(156, "SDC3_CMD"),
+       PINCTRL_PIN(157, "SDC3_DATA"),
+};
+
+#define DECLARE_MSM_GPIO_PINS(pin) static const unsigned int gpio##pin##_pins[] = { pin }
+DECLARE_MSM_GPIO_PINS(0);
+DECLARE_MSM_GPIO_PINS(1);
+DECLARE_MSM_GPIO_PINS(2);
+DECLARE_MSM_GPIO_PINS(3);
+DECLARE_MSM_GPIO_PINS(4);
+DECLARE_MSM_GPIO_PINS(5);
+DECLARE_MSM_GPIO_PINS(6);
+DECLARE_MSM_GPIO_PINS(7);
+DECLARE_MSM_GPIO_PINS(8);
+DECLARE_MSM_GPIO_PINS(9);
+DECLARE_MSM_GPIO_PINS(10);
+DECLARE_MSM_GPIO_PINS(11);
+DECLARE_MSM_GPIO_PINS(12);
+DECLARE_MSM_GPIO_PINS(13);
+DECLARE_MSM_GPIO_PINS(14);
+DECLARE_MSM_GPIO_PINS(15);
+DECLARE_MSM_GPIO_PINS(16);
+DECLARE_MSM_GPIO_PINS(17);
+DECLARE_MSM_GPIO_PINS(18);
+DECLARE_MSM_GPIO_PINS(19);
+DECLARE_MSM_GPIO_PINS(20);
+DECLARE_MSM_GPIO_PINS(21);
+DECLARE_MSM_GPIO_PINS(22);
+DECLARE_MSM_GPIO_PINS(23);
+DECLARE_MSM_GPIO_PINS(24);
+DECLARE_MSM_GPIO_PINS(25);
+DECLARE_MSM_GPIO_PINS(26);
+DECLARE_MSM_GPIO_PINS(27);
+DECLARE_MSM_GPIO_PINS(28);
+DECLARE_MSM_GPIO_PINS(29);
+DECLARE_MSM_GPIO_PINS(30);
+DECLARE_MSM_GPIO_PINS(31);
+DECLARE_MSM_GPIO_PINS(32);
+DECLARE_MSM_GPIO_PINS(33);
+DECLARE_MSM_GPIO_PINS(34);
+DECLARE_MSM_GPIO_PINS(35);
+DECLARE_MSM_GPIO_PINS(36);
+DECLARE_MSM_GPIO_PINS(37);
+DECLARE_MSM_GPIO_PINS(38);
+DECLARE_MSM_GPIO_PINS(39);
+DECLARE_MSM_GPIO_PINS(40);
+DECLARE_MSM_GPIO_PINS(41);
+DECLARE_MSM_GPIO_PINS(42);
+DECLARE_MSM_GPIO_PINS(43);
+DECLARE_MSM_GPIO_PINS(44);
+DECLARE_MSM_GPIO_PINS(45);
+DECLARE_MSM_GPIO_PINS(46);
+DECLARE_MSM_GPIO_PINS(47);
+DECLARE_MSM_GPIO_PINS(48);
+DECLARE_MSM_GPIO_PINS(49);
+DECLARE_MSM_GPIO_PINS(50);
+DECLARE_MSM_GPIO_PINS(51);
+DECLARE_MSM_GPIO_PINS(52);
+DECLARE_MSM_GPIO_PINS(53);
+DECLARE_MSM_GPIO_PINS(54);
+DECLARE_MSM_GPIO_PINS(55);
+DECLARE_MSM_GPIO_PINS(56);
+DECLARE_MSM_GPIO_PINS(57);
+DECLARE_MSM_GPIO_PINS(58);
+DECLARE_MSM_GPIO_PINS(59);
+DECLARE_MSM_GPIO_PINS(60);
+DECLARE_MSM_GPIO_PINS(61);
+DECLARE_MSM_GPIO_PINS(62);
+DECLARE_MSM_GPIO_PINS(63);
+DECLARE_MSM_GPIO_PINS(64);
+DECLARE_MSM_GPIO_PINS(65);
+DECLARE_MSM_GPIO_PINS(66);
+DECLARE_MSM_GPIO_PINS(67);
+DECLARE_MSM_GPIO_PINS(68);
+DECLARE_MSM_GPIO_PINS(69);
+DECLARE_MSM_GPIO_PINS(70);
+DECLARE_MSM_GPIO_PINS(71);
+DECLARE_MSM_GPIO_PINS(72);
+DECLARE_MSM_GPIO_PINS(73);
+DECLARE_MSM_GPIO_PINS(74);
+DECLARE_MSM_GPIO_PINS(75);
+DECLARE_MSM_GPIO_PINS(76);
+DECLARE_MSM_GPIO_PINS(77);
+DECLARE_MSM_GPIO_PINS(78);
+DECLARE_MSM_GPIO_PINS(79);
+DECLARE_MSM_GPIO_PINS(80);
+DECLARE_MSM_GPIO_PINS(81);
+DECLARE_MSM_GPIO_PINS(82);
+DECLARE_MSM_GPIO_PINS(83);
+DECLARE_MSM_GPIO_PINS(84);
+DECLARE_MSM_GPIO_PINS(85);
+DECLARE_MSM_GPIO_PINS(86);
+DECLARE_MSM_GPIO_PINS(87);
+DECLARE_MSM_GPIO_PINS(88);
+DECLARE_MSM_GPIO_PINS(89);
+DECLARE_MSM_GPIO_PINS(90);
+DECLARE_MSM_GPIO_PINS(91);
+DECLARE_MSM_GPIO_PINS(92);
+DECLARE_MSM_GPIO_PINS(93);
+DECLARE_MSM_GPIO_PINS(94);
+DECLARE_MSM_GPIO_PINS(95);
+DECLARE_MSM_GPIO_PINS(96);
+DECLARE_MSM_GPIO_PINS(97);
+DECLARE_MSM_GPIO_PINS(98);
+DECLARE_MSM_GPIO_PINS(99);
+DECLARE_MSM_GPIO_PINS(100);
+DECLARE_MSM_GPIO_PINS(101);
+DECLARE_MSM_GPIO_PINS(102);
+DECLARE_MSM_GPIO_PINS(103);
+DECLARE_MSM_GPIO_PINS(104);
+DECLARE_MSM_GPIO_PINS(105);
+DECLARE_MSM_GPIO_PINS(106);
+DECLARE_MSM_GPIO_PINS(107);
+DECLARE_MSM_GPIO_PINS(108);
+DECLARE_MSM_GPIO_PINS(109);
+DECLARE_MSM_GPIO_PINS(110);
+DECLARE_MSM_GPIO_PINS(111);
+DECLARE_MSM_GPIO_PINS(112);
+DECLARE_MSM_GPIO_PINS(113);
+DECLARE_MSM_GPIO_PINS(114);
+DECLARE_MSM_GPIO_PINS(115);
+DECLARE_MSM_GPIO_PINS(116);
+DECLARE_MSM_GPIO_PINS(117);
+DECLARE_MSM_GPIO_PINS(118);
+DECLARE_MSM_GPIO_PINS(119);
+DECLARE_MSM_GPIO_PINS(120);
+DECLARE_MSM_GPIO_PINS(121);
+DECLARE_MSM_GPIO_PINS(122);
+DECLARE_MSM_GPIO_PINS(123);
+DECLARE_MSM_GPIO_PINS(124);
+DECLARE_MSM_GPIO_PINS(125);
+DECLARE_MSM_GPIO_PINS(126);
+DECLARE_MSM_GPIO_PINS(127);
+DECLARE_MSM_GPIO_PINS(128);
+DECLARE_MSM_GPIO_PINS(129);
+DECLARE_MSM_GPIO_PINS(130);
+DECLARE_MSM_GPIO_PINS(131);
+DECLARE_MSM_GPIO_PINS(132);
+DECLARE_MSM_GPIO_PINS(133);
+DECLARE_MSM_GPIO_PINS(134);
+DECLARE_MSM_GPIO_PINS(135);
+DECLARE_MSM_GPIO_PINS(136);
+DECLARE_MSM_GPIO_PINS(137);
+DECLARE_MSM_GPIO_PINS(138);
+DECLARE_MSM_GPIO_PINS(139);
+DECLARE_MSM_GPIO_PINS(140);
+DECLARE_MSM_GPIO_PINS(141);
+DECLARE_MSM_GPIO_PINS(142);
+DECLARE_MSM_GPIO_PINS(143);
+DECLARE_MSM_GPIO_PINS(144);
+DECLARE_MSM_GPIO_PINS(145);
+DECLARE_MSM_GPIO_PINS(146);
+DECLARE_MSM_GPIO_PINS(147);
+DECLARE_MSM_GPIO_PINS(148);
+DECLARE_MSM_GPIO_PINS(149);
+DECLARE_MSM_GPIO_PINS(150);
+DECLARE_MSM_GPIO_PINS(151);
+
+static const unsigned int sdc1_clk_pins[] = { 152 };
+static const unsigned int sdc1_cmd_pins[] = { 153 };
+static const unsigned int sdc1_data_pins[] = { 154 };
+static const unsigned int sdc3_clk_pins[] = { 155 };
+static const unsigned int sdc3_cmd_pins[] = { 156 };
+static const unsigned int sdc3_data_pins[] = { 157 };
+
+#define FUNCTION(fname)                                        \
+       [MSM_MUX_##fname] = {                           \
+               .name = #fname,                         \
+               .groups = fname##_groups,               \
+               .ngroups = ARRAY_SIZE(fname##_groups),  \
+       }
+
+#define PINGROUP(id, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11) \
+       {                                               \
+               .name = "gpio" #id,                     \
+               .pins = gpio##id##_pins,                \
+               .npins = ARRAY_SIZE(gpio##id##_pins),   \
+               .funcs = (int[]){                       \
+                       MSM_MUX_gpio,                   \
+                       MSM_MUX_##f1,                   \
+                       MSM_MUX_##f2,                   \
+                       MSM_MUX_##f3,                   \
+                       MSM_MUX_##f4,                   \
+                       MSM_MUX_##f5,                   \
+                       MSM_MUX_##f6,                   \
+                       MSM_MUX_##f7,                   \
+                       MSM_MUX_##f8,                   \
+                       MSM_MUX_##f9,                   \
+                       MSM_MUX_##f10,                  \
+                       MSM_MUX_##f11                   \
+               },                                      \
+               .nfuncs = 12,                           \
+               .ctl_reg = 0x1000 + 0x10 * id,          \
+               .io_reg = 0x1004 + 0x10 * id,           \
+               .intr_cfg_reg = 0x1008 + 0x10 * id,     \
+               .intr_status_reg = 0x100c + 0x10 * id,  \
+               .intr_target_reg = 0x400 + 0x4 * id,    \
+               .mux_bit = 2,                           \
+               .pull_bit = 0,                          \
+               .drv_bit = 6,                           \
+               .oe_bit = 9,                            \
+               .in_bit = 0,                            \
+               .out_bit = 1,                           \
+               .intr_enable_bit = 0,                   \
+               .intr_status_bit = 0,                   \
+               .intr_ack_high = 1,                     \
+               .intr_target_bit = 0,                   \
+               .intr_raw_status_bit = 3,               \
+               .intr_polarity_bit = 1,                 \
+               .intr_detection_bit = 2,                \
+               .intr_detection_width = 1,              \
+       }
+
+#define SDC_PINGROUP(pg_name, ctl, pull, drv)          \
+       {                                               \
+               .name = #pg_name,                       \
+               .pins = pg_name##_pins,                 \
+               .npins = ARRAY_SIZE(pg_name##_pins),    \
+               .ctl_reg = ctl,                         \
+               .io_reg = 0,                            \
+               .intr_cfg_reg = 0,                      \
+               .intr_status_reg = 0,                   \
+               .intr_target_reg = 0,                   \
+               .mux_bit = -1,                          \
+               .pull_bit = pull,                       \
+               .drv_bit = drv,                         \
+               .oe_bit = -1,                           \
+               .in_bit = -1,                           \
+               .out_bit = -1,                          \
+               .intr_enable_bit = -1,                  \
+               .intr_status_bit = -1,                  \
+               .intr_target_bit = -1,                  \
+               .intr_raw_status_bit = -1,              \
+               .intr_polarity_bit = -1,                \
+               .intr_detection_bit = -1,               \
+               .intr_detection_width = -1,             \
+       }
+
+enum msm8960_functions {
+       MSM_MUX_audio_pcm,
+       MSM_MUX_bt,
+       MSM_MUX_cam_mclk0,
+       MSM_MUX_cam_mclk1,
+       MSM_MUX_cam_mclk2,
+       MSM_MUX_codec_mic_i2s,
+       MSM_MUX_codec_spkr_i2s,
+       MSM_MUX_ext_gps,
+       MSM_MUX_fm,
+       MSM_MUX_gps_blanking,
+       MSM_MUX_gps_pps_in,
+       MSM_MUX_gps_pps_out,
+       MSM_MUX_gp_clk_0a,
+       MSM_MUX_gp_clk_0b,
+       MSM_MUX_gp_clk_1a,
+       MSM_MUX_gp_clk_1b,
+       MSM_MUX_gp_clk_2a,
+       MSM_MUX_gp_clk_2b,
+       MSM_MUX_gp_mn,
+       MSM_MUX_gp_pdm_0a,
+       MSM_MUX_gp_pdm_0b,
+       MSM_MUX_gp_pdm_1a,
+       MSM_MUX_gp_pdm_1b,
+       MSM_MUX_gp_pdm_2a,
+       MSM_MUX_gp_pdm_2b,
+       MSM_MUX_gpio,
+       MSM_MUX_gsbi1,
+       MSM_MUX_gsbi1_spi_cs1_n,
+       MSM_MUX_gsbi1_spi_cs2a_n,
+       MSM_MUX_gsbi1_spi_cs2b_n,
+       MSM_MUX_gsbi1_spi_cs3_n,
+       MSM_MUX_gsbi2,
+       MSM_MUX_gsbi2_spi_cs1_n,
+       MSM_MUX_gsbi2_spi_cs2_n,
+       MSM_MUX_gsbi2_spi_cs3_n,
+       MSM_MUX_gsbi3,
+       MSM_MUX_gsbi4,
+       MSM_MUX_gsbi4_3d_cam_i2c_l,
+       MSM_MUX_gsbi4_3d_cam_i2c_r,
+       MSM_MUX_gsbi5,
+       MSM_MUX_gsbi5_3d_cam_i2c_l,
+       MSM_MUX_gsbi5_3d_cam_i2c_r,
+       MSM_MUX_gsbi6,
+       MSM_MUX_gsbi7,
+       MSM_MUX_gsbi8,
+       MSM_MUX_gsbi9,
+       MSM_MUX_gsbi10,
+       MSM_MUX_gsbi11,
+       MSM_MUX_gsbi11_spi_cs1a_n,
+       MSM_MUX_gsbi11_spi_cs1b_n,
+       MSM_MUX_gsbi11_spi_cs2a_n,
+       MSM_MUX_gsbi11_spi_cs2b_n,
+       MSM_MUX_gsbi11_spi_cs3_n,
+       MSM_MUX_gsbi12,
+       MSM_MUX_hdmi_cec,
+       MSM_MUX_hdmi_ddc_clock,
+       MSM_MUX_hdmi_ddc_data,
+       MSM_MUX_hdmi_hot_plug_detect,
+       MSM_MUX_hsic,
+       MSM_MUX_mdp_vsync,
+       MSM_MUX_mi2s,
+       MSM_MUX_mic_i2s,
+       MSM_MUX_pmb_clk,
+       MSM_MUX_pmb_ext_ctrl,
+       MSM_MUX_ps_hold,
+       MSM_MUX_rpm_wdog,
+       MSM_MUX_sdc2,
+       MSM_MUX_sdc4,
+       MSM_MUX_sdc5,
+       MSM_MUX_slimbus1,
+       MSM_MUX_slimbus2,
+       MSM_MUX_spkr_i2s,
+       MSM_MUX_ssbi1,
+       MSM_MUX_ssbi2,
+       MSM_MUX_ssbi_ext_gps,
+       MSM_MUX_ssbi_pmic2,
+       MSM_MUX_ssbi_qpa1,
+       MSM_MUX_ssbi_ts,
+       MSM_MUX_tsif1,
+       MSM_MUX_tsif2,
+       MSM_MUX_ts_eoc,
+       MSM_MUX_usb_fs1,
+       MSM_MUX_usb_fs1_oe,
+       MSM_MUX_usb_fs1_oe_n,
+       MSM_MUX_usb_fs2,
+       MSM_MUX_usb_fs2_oe,
+       MSM_MUX_usb_fs2_oe_n,
+       MSM_MUX_vfe_camif_timer1_a,
+       MSM_MUX_vfe_camif_timer1_b,
+       MSM_MUX_vfe_camif_timer2,
+       MSM_MUX_vfe_camif_timer3_a,
+       MSM_MUX_vfe_camif_timer3_b,
+       MSM_MUX_vfe_camif_timer4_a,
+       MSM_MUX_vfe_camif_timer4_b,
+       MSM_MUX_vfe_camif_timer4_c,
+       MSM_MUX_vfe_camif_timer5_a,
+       MSM_MUX_vfe_camif_timer5_b,
+       MSM_MUX_vfe_camif_timer6_a,
+       MSM_MUX_vfe_camif_timer6_b,
+       MSM_MUX_vfe_camif_timer6_c,
+       MSM_MUX_vfe_camif_timer7_a,
+       MSM_MUX_vfe_camif_timer7_b,
+       MSM_MUX_vfe_camif_timer7_c,
+       MSM_MUX_wlan,
+       MSM_MUX_NA,
+};
+
+static const char * const audio_pcm_groups[] = {
+       "gpio63", "gpio64", "gpio65", "gpio66"
+};
+
+static const char * const bt_groups[] = {
+       "gpio28", "gpio29", "gpio83"
+};
+
+static const char * const cam_mclk0_groups[] = {
+       "gpio5"
+};
+
+static const char * const cam_mclk1_groups[] = {
+       "gpio4"
+};
+
+static const char * const cam_mclk2_groups[] = {
+       "gpio2"
+};
+
+static const char * const codec_mic_i2s_groups[] = {
+       "gpio54", "gpio55", "gpio56", "gpio57", "gpio58"
+};
+
+static const char * const codec_spkr_i2s_groups[] = {
+       "gpio59", "gpio60", "gpio61", "gpio62"
+};
+
+static const char * const ext_gps_groups[] = {
+       "gpio22", "gpio23", "gpio24", "gpio25"
+};
+
+static const char * const fm_groups[] = {
+       "gpio26", "gpio27"
+};
+
+static const char * const gps_blanking_groups[] = {
+       "gpio137"
+};
+
+static const char * const gps_pps_in_groups[] = {
+       "gpio37"
+};
+
+static const char * const gps_pps_out_groups[] = {
+       "gpio37"
+};
+
+static const char * const gp_clk_0a_groups[] = {
+       "gpio3"
+};
+
+static const char * const gp_clk_0b_groups[] = {
+       "gpio54"
+};
+
+static const char * const gp_clk_1a_groups[] = {
+       "gpio4"
+};
+
+static const char * const gp_clk_1b_groups[] = {
+       "gpio70"
+};
+
+static const char * const gp_clk_2a_groups[] = {
+       "gpio52"
+};
+
+static const char * const gp_clk_2b_groups[] = {
+       "gpio37"
+};
+
+static const char * const gp_mn_groups[] = {
+       "gpio2"
+};
+
+static const char * const gp_pdm_0a_groups[] = {
+       "gpio58"
+};
+
+static const char * const gp_pdm_0b_groups[] = {
+       "gpio39"
+};
+
+static const char * const gp_pdm_1a_groups[] = {
+       "gpio94"
+};
+
+static const char * const gp_pdm_1b_groups[] = {
+       "gpio64"
+};
+
+static const char * const gp_pdm_2a_groups[] = {
+       "gpio69"
+};
+
+static const char * const gp_pdm_2b_groups[] = {
+       "gpio53"
+};
+
+static const char * const gpio_groups[] = {
+       "gpio0", "gpio1", "gpio2", "gpio3", "gpio4", "gpio5", "gpio6", "gpio7",
+       "gpio8", "gpio9", "gpio10", "gpio11", "gpio12", "gpio13", "gpio14",
+       "gpio15", "gpio16", "gpio17", "gpio18", "gpio19", "gpio20", "gpio21",
+       "gpio22", "gpio23", "gpio24", "gpio25", "gpio26", "gpio27", "gpio28",
+       "gpio29", "gpio30", "gpio31", "gpio32", "gpio33", "gpio34", "gpio35",
+       "gpio36", "gpio37", "gpio38", "gpio39", "gpio40", "gpio41", "gpio42",
+       "gpio43", "gpio44", "gpio45", "gpio46", "gpio47", "gpio48", "gpio49",
+       "gpio50", "gpio51", "gpio52", "gpio53", "gpio54", "gpio55", "gpio56",
+       "gpio57", "gpio58", "gpio59", "gpio60", "gpio61", "gpio62", "gpio63",
+       "gpio64", "gpio65", "gpio66", "gpio67", "gpio68", "gpio69", "gpio70",
+       "gpio71", "gpio72", "gpio73", "gpio74", "gpio75", "gpio76", "gpio77",
+       "gpio78", "gpio79", "gpio80", "gpio81", "gpio82", "gpio83", "gpio84",
+       "gpio85", "gpio86", "gpio87", "gpio88", "gpio89", "gpio90", "gpio91",
+       "gpio92", "gpio93", "gpio94", "gpio95", "gpio96", "gpio97", "gpio98",
+       "gpio99", "gpio100", "gpio101", "gpio102", "gpio103", "gpio104",
+       "gpio105", "gpio106", "gpio107", "gpio108", "gpio109", "gpio110",
+       "gpio111", "gpio112", "gpio113", "gpio114", "gpio115", "gpio116",
+       "gpio117", "gpio118", "gpio119", "gpio120", "gpio121", "gpio122",
+       "gpio123", "gpio124", "gpio125", "gpio126", "gpio127", "gpio128",
+       "gpio129", "gpio130", "gpio131", "gpio132", "gpio133", "gpio134",
+       "gpio135", "gpio136", "gpio137", "gpio138", "gpio139", "gpio140",
+       "gpio141", "gpio142", "gpio143", "gpio144", "gpio145", "gpio146",
+       "gpio147", "gpio148", "gpio149", "gpio150", "gpio151"
+};
+
+static const char * const gsbi1_groups[] = {
+       "gpio6", "gpio7", "gpio8", "gpio9"
+};
+
+static const char * const gsbi1_spi_cs1_n_groups[] = {
+       "gpio14"
+};
+
+static const char * const gsbi1_spi_cs2a_n_groups[] = {
+       "gpio15"
+};
+
+static const char * const gsbi1_spi_cs2b_n_groups[] = {
+       "gpio17"
+};
+
+static const char * const gsbi1_spi_cs3_n_groups[] = {
+       "gpio16"
+};
+
+static const char * const gsbi2_groups[] = {
+       "gpio10", "gpio11", "gpio12", "gpio13"
+};
+
+static const char * const gsbi2_spi_cs1_n_groups[] = {
+       "gpio52"
+};
+
+static const char * const gsbi2_spi_cs2_n_groups[] = {
+       "gpio68"
+};
+
+static const char * const gsbi2_spi_cs3_n_groups[] = {
+       "gpio56"
+};
+
+static const char * const gsbi3_groups[] = {
+       "gpio14", "gpio15", "gpio16", "gpio17"
+};
+
+static const char * const gsbi4_groups[] = {
+       "gpio18", "gpio19", "gpio20", "gpio21"
+};
+
+static const char * const gsbi4_3d_cam_i2c_l_groups[] = {
+       "gpio18", "gpio19"
+};
+
+static const char * const gsbi4_3d_cam_i2c_r_groups[] = {
+       "gpio20", "gpio21"
+};
+
+static const char * const gsbi5_groups[] = {
+       "gpio22", "gpio23", "gpio24", "gpio25"
+};
+
+static const char * const gsbi5_3d_cam_i2c_l_groups[] = {
+       "gpio22", "gpio23"
+};
+
+static const char * const gsbi5_3d_cam_i2c_r_groups[] = {
+       "gpio24", "gpio25"
+};
+
+static const char * const gsbi6_groups[] = {
+       "gpio26", "gpio27", "gpio28", "gpio29"
+};
+
+static const char * const gsbi7_groups[] = {
+       "gpio30", "gpio31", "gpio32", "gpio33"
+};
+
+static const char * const gsbi8_groups[] = {
+       "gpio34", "gpio35", "gpio36", "gpio37"
+};
+
+static const char * const gsbi9_groups[] = {
+       "gpio93", "gpio94", "gpio95", "gpio96"
+};
+
+static const char * const gsbi10_groups[] = {
+       "gpio71", "gpio72", "gpio73", "gpio74"
+};
+
+static const char * const gsbi11_groups[] = {
+       "gpio38", "gpio39", "gpio40", "gpio41"
+};
+
+static const char * const gsbi11_spi_cs1a_n_groups[] = {
+       "gpio36"
+};
+
+static const char * const gsbi11_spi_cs1b_n_groups[] = {
+       "gpio18"
+};
+
+static const char * const gsbi11_spi_cs2a_n_groups[] = {
+       "gpio37"
+};
+
+static const char * const gsbi11_spi_cs2b_n_groups[] = {
+       "gpio19"
+};
+
+static const char * const gsbi11_spi_cs3_n_groups[] = {
+       "gpio76"
+};
+
+static const char * const gsbi12_groups[] = {
+       "gpio42", "gpio43", "gpio44", "gpio45"
+};
+
+static const char * const hdmi_cec_groups[] = {
+       "gpio99"
+};
+
+static const char * const hdmi_ddc_clock_groups[] = {
+       "gpio100"
+};
+
+static const char * const hdmi_ddc_data_groups[] = {
+       "gpio101"
+};
+
+static const char * const hdmi_hot_plug_detect_groups[] = {
+       "gpio102"
+};
+
+static const char * const hsic_groups[] = {
+       "gpio150", "gpio151"
+};
+
+static const char * const mdp_vsync_groups[] = {
+       "gpio0", "gpio1", "gpio19"
+};
+
+static const char * const mi2s_groups[] = {
+       "gpio47", "gpio48", "gpio49", "gpio50", "gpio51", "gpio52", "gpio53"
+};
+
+static const char * const mic_i2s_groups[] = {
+       "gpio71", "gpio72", "gpio73", "gpio74"
+};
+
+static const char * const pmb_clk_groups[] = {
+       "gpio21", "gpio86", "gpio112"
+};
+
+static const char * const pmb_ext_ctrl_groups[] = {
+       "gpio4", "gpio5"
+};
+
+static const char * const ps_hold_groups[] = {
+       "gpio108"
+};
+
+static const char * const rpm_wdog_groups[] = {
+       "gpio12"
+};
+
+static const char * const sdc2_groups[] = {
+       "gpio89", "gpio90", "gpio91", "gpio92", "gpio93", "gpio94", "gpio95",
+       "gpio96", "gpio97", "gpio98"
+};
+
+static const char * const sdc4_groups[] = {
+       "gpio83", "gpio84", "gpio85", "gpio86", "gpio87", "gpio88"
+};
+
+static const char * const sdc5_groups[] = {
+       "gpio77", "gpio78", "gpio79", "gpio80", "gpio81", "gpio82"
+};
+
+static const char * const slimbus1_groups[] = {
+       "gpio50", "gpio51", "gpio60", "gpio61"
+};
+
+static const char * const slimbus2_groups[] = {
+       "gpio42", "gpio43"
+};
+
+static const char * const spkr_i2s_groups[] = {
+       "gpio67", "gpio68", "gpio69", "gpio70"
+};
+
+static const char * const ssbi1_groups[] = {
+       "gpio141", "gpio143"
+};
+
+static const char * const ssbi2_groups[] = {
+       "gpio140", "gpio142"
+};
+
+static const char * const ssbi_ext_gps_groups[] = {
+       "gpio23"
+};
+
+static const char * const ssbi_pmic2_groups[] = {
+       "gpio149"
+};
+
+static const char * const ssbi_qpa1_groups[] = {
+       "gpio131"
+};
+
+static const char * const ssbi_ts_groups[] = {
+       "gpio10"
+};
+
+static const char * const tsif1_groups[] = {
+       "gpio75", "gpio76", "gpio77", "gpio82"
+};
+
+static const char * const tsif2_groups[] = {
+       "gpio78", "gpio79", "gpio80", "gpio81"
+};
+
+static const char * const ts_eoc_groups[] = {
+       "gpio11"
+};
+
+static const char * const usb_fs1_groups[] = {
+       "gpio32", "gpio33"
+};
+
+static const char * const usb_fs1_oe_groups[] = {
+       "gpio31"
+};
+
+static const char * const usb_fs1_oe_n_groups[] = {
+       "gpio31"
+};
+
+static const char * const usb_fs2_groups[] = {
+       "gpio34", "gpio35"
+};
+
+static const char * const usb_fs2_oe_groups[] = {
+       "gpio36"
+};
+
+static const char * const usb_fs2_oe_n_groups[] = {
+       "gpio36"
+};
+
+static const char * const vfe_camif_timer1_a_groups[] = {
+       "gpio2"
+};
+
+static const char * const vfe_camif_timer1_b_groups[] = {
+       "gpio38"
+};
+
+static const char * const vfe_camif_timer2_groups[] = {
+       "gpio3"
+};
+
+static const char * const vfe_camif_timer3_a_groups[] = {
+       "gpio4"
+};
+
+static const char * const vfe_camif_timer3_b_groups[] = {
+       "gpio151"
+};
+
+static const char * const vfe_camif_timer4_a_groups[] = {
+       "gpio65"
+};
+
+static const char * const vfe_camif_timer4_b_groups[] = {
+       "gpio150"
+};
+
+static const char * const vfe_camif_timer4_c_groups[] = {
+       "gpio10"
+};
+
+static const char * const vfe_camif_timer5_a_groups[] = {
+       "gpio66"
+};
+
+static const char * const vfe_camif_timer5_b_groups[] = {
+       "gpio39"
+};
+
+static const char * const vfe_camif_timer6_a_groups[] = {
+       "gpio71"
+};
+
+static const char * const vfe_camif_timer6_b_groups[] = {
+       "gpio0"
+};
+
+static const char * const vfe_camif_timer6_c_groups[] = {
+       "gpio18"
+};
+
+static const char * const vfe_camif_timer7_a_groups[] = {
+       "gpio67"
+};
+
+static const char * const vfe_camif_timer7_b_groups[] = {
+       "gpio1"
+};
+
+static const char * const vfe_camif_timer7_c_groups[] = {
+       "gpio19"
+};
+
+static const char * const wlan_groups[] = {
+       "gpio84", "gpio85", "gpio86", "gpio87", "gpio88"
+};
+
+static const struct msm_function msm8960_functions[] = {
+       FUNCTION(audio_pcm),
+       FUNCTION(bt),
+       FUNCTION(cam_mclk0),
+       FUNCTION(cam_mclk1),
+       FUNCTION(cam_mclk2),
+       FUNCTION(codec_mic_i2s),
+       FUNCTION(codec_spkr_i2s),
+       FUNCTION(ext_gps),
+       FUNCTION(fm),
+       FUNCTION(gps_blanking),
+       FUNCTION(gps_pps_in),
+       FUNCTION(gps_pps_out),
+       FUNCTION(gp_clk_0a),
+       FUNCTION(gp_clk_0b),
+       FUNCTION(gp_clk_1a),
+       FUNCTION(gp_clk_1b),
+       FUNCTION(gp_clk_2a),
+       FUNCTION(gp_clk_2b),
+       FUNCTION(gp_mn),
+       FUNCTION(gp_pdm_0a),
+       FUNCTION(gp_pdm_0b),
+       FUNCTION(gp_pdm_1a),
+       FUNCTION(gp_pdm_1b),
+       FUNCTION(gp_pdm_2a),
+       FUNCTION(gp_pdm_2b),
+       FUNCTION(gpio),
+       FUNCTION(gsbi1),
+       FUNCTION(gsbi1_spi_cs1_n),
+       FUNCTION(gsbi1_spi_cs2a_n),
+       FUNCTION(gsbi1_spi_cs2b_n),
+       FUNCTION(gsbi1_spi_cs3_n),
+       FUNCTION(gsbi2),
+       FUNCTION(gsbi2_spi_cs1_n),
+       FUNCTION(gsbi2_spi_cs2_n),
+       FUNCTION(gsbi2_spi_cs3_n),
+       FUNCTION(gsbi3),
+       FUNCTION(gsbi4),
+       FUNCTION(gsbi4_3d_cam_i2c_l),
+       FUNCTION(gsbi4_3d_cam_i2c_r),
+       FUNCTION(gsbi5),
+       FUNCTION(gsbi5_3d_cam_i2c_l),
+       FUNCTION(gsbi5_3d_cam_i2c_r),
+       FUNCTION(gsbi6),
+       FUNCTION(gsbi7),
+       FUNCTION(gsbi8),
+       FUNCTION(gsbi9),
+       FUNCTION(gsbi10),
+       FUNCTION(gsbi11),
+       FUNCTION(gsbi11_spi_cs1a_n),
+       FUNCTION(gsbi11_spi_cs1b_n),
+       FUNCTION(gsbi11_spi_cs2a_n),
+       FUNCTION(gsbi11_spi_cs2b_n),
+       FUNCTION(gsbi11_spi_cs3_n),
+       FUNCTION(gsbi12),
+       FUNCTION(hdmi_cec),
+       FUNCTION(hdmi_ddc_clock),
+       FUNCTION(hdmi_ddc_data),
+       FUNCTION(hdmi_hot_plug_detect),
+       FUNCTION(hsic),
+       FUNCTION(mdp_vsync),
+       FUNCTION(mi2s),
+       FUNCTION(mic_i2s),
+       FUNCTION(pmb_clk),
+       FUNCTION(pmb_ext_ctrl),
+       FUNCTION(ps_hold),
+       FUNCTION(rpm_wdog),
+       FUNCTION(sdc2),
+       FUNCTION(sdc4),
+       FUNCTION(sdc5),
+       FUNCTION(slimbus1),
+       FUNCTION(slimbus2),
+       FUNCTION(spkr_i2s),
+       FUNCTION(ssbi1),
+       FUNCTION(ssbi2),
+       FUNCTION(ssbi_ext_gps),
+       FUNCTION(ssbi_pmic2),
+       FUNCTION(ssbi_qpa1),
+       FUNCTION(ssbi_ts),
+       FUNCTION(tsif1),
+       FUNCTION(tsif2),
+       FUNCTION(ts_eoc),
+       FUNCTION(usb_fs1),
+       FUNCTION(usb_fs1_oe),
+       FUNCTION(usb_fs1_oe_n),
+       FUNCTION(usb_fs2),
+       FUNCTION(usb_fs2_oe),
+       FUNCTION(usb_fs2_oe_n),
+       FUNCTION(vfe_camif_timer1_a),
+       FUNCTION(vfe_camif_timer1_b),
+       FUNCTION(vfe_camif_timer2),
+       FUNCTION(vfe_camif_timer3_a),
+       FUNCTION(vfe_camif_timer3_b),
+       FUNCTION(vfe_camif_timer4_a),
+       FUNCTION(vfe_camif_timer4_b),
+       FUNCTION(vfe_camif_timer4_c),
+       FUNCTION(vfe_camif_timer5_a),
+       FUNCTION(vfe_camif_timer5_b),
+       FUNCTION(vfe_camif_timer6_a),
+       FUNCTION(vfe_camif_timer6_b),
+       FUNCTION(vfe_camif_timer6_c),
+       FUNCTION(vfe_camif_timer7_a),
+       FUNCTION(vfe_camif_timer7_b),
+       FUNCTION(vfe_camif_timer7_c),
+       FUNCTION(wlan),
+};
+
+static const struct msm_pingroup msm8960_groups[] = {
+       PINGROUP(0, mdp_vsync, vfe_camif_timer6_b, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(1, mdp_vsync, vfe_camif_timer7_b, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(2, vfe_camif_timer1_a, gp_mn, NA, cam_mclk2, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(3, vfe_camif_timer2, gp_clk_0a, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(4, vfe_camif_timer3_a, cam_mclk1, gp_clk_1a, pmb_ext_ctrl, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(5, cam_mclk0, pmb_ext_ctrl, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(6, gsbi1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(7, gsbi1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(8, gsbi1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(9, gsbi1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(10, gsbi2, ssbi_ts, NA, vfe_camif_timer4_c, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(11, gsbi2, ts_eoc, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(12, gsbi2, rpm_wdog, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(13, gsbi2, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(14, gsbi3, gsbi1_spi_cs1_n, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(15, gsbi3, gsbi1_spi_cs2a_n, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(16, gsbi3, gsbi1_spi_cs3_n, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(17, gsbi3, gsbi1_spi_cs2b_n, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(18, gsbi4, gsbi11_spi_cs1b_n, NA, NA, gsbi4_3d_cam_i2c_l, vfe_camif_timer6_c, NA, NA, NA, NA, NA),
+       PINGROUP(19, gsbi4, gsbi11_spi_cs2b_n, NA, mdp_vsync, NA, gsbi4_3d_cam_i2c_l, vfe_camif_timer7_c, NA, NA, NA, NA),
+       PINGROUP(20, gsbi4, gsbi4_3d_cam_i2c_r, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(21, gsbi4, pmb_clk, gsbi4_3d_cam_i2c_r, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(22, gsbi5, ext_gps, NA, NA, NA, NA, NA, NA, NA, gsbi5_3d_cam_i2c_l, NA),
+       PINGROUP(23, gsbi5, ssbi_ext_gps, NA, NA, NA, NA, NA, NA, NA, gsbi5_3d_cam_i2c_l, NA),
+       PINGROUP(24, gsbi5, ext_gps, NA, NA, NA, NA, NA, NA, NA, gsbi5_3d_cam_i2c_r, NA),
+       PINGROUP(25, gsbi5, ext_gps, NA, NA, NA, NA, NA, NA, NA, gsbi5_3d_cam_i2c_r, NA),
+       PINGROUP(26, fm, gsbi6, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(27, fm, gsbi6, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(28, bt, gsbi6, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(29, bt, gsbi6, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(30, gsbi7, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(31, gsbi7, usb_fs1_oe, usb_fs1_oe_n, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(32, gsbi7, usb_fs1, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(33, gsbi7, usb_fs1, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(34, gsbi8, usb_fs2, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(35, gsbi8, usb_fs2, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(36, gsbi8, usb_fs2_oe, usb_fs2_oe_n, gsbi11_spi_cs1a_n, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(37, gsbi8, gps_pps_out, gps_pps_in, gsbi11_spi_cs2a_n, gp_clk_2b, NA, NA, NA, NA, NA, NA),
+       PINGROUP(38, gsbi11, NA, NA, NA, NA, NA, NA, NA, NA, vfe_camif_timer1_b, NA),
+       PINGROUP(39, gsbi11, gp_pdm_0b, NA, NA, NA, NA, NA, NA, NA, NA, vfe_camif_timer5_b),
+       PINGROUP(40, gsbi11, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(41, gsbi11, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(42, gsbi12, slimbus2, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(43, gsbi12, slimbus2, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(44, gsbi12, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(45, gsbi12, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(46, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(47, mi2s, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(48, mi2s, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(49, mi2s, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(50, mi2s, slimbus1, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(51, mi2s, slimbus1, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(52, mi2s, gp_clk_2a, gsbi2_spi_cs1_n, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(53, mi2s, gp_pdm_2b, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(54, codec_mic_i2s, gp_clk_0b, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(55, codec_mic_i2s, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(56, codec_mic_i2s, gsbi2_spi_cs3_n, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(57, codec_mic_i2s, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(58, codec_mic_i2s, gp_pdm_0a, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(59, codec_spkr_i2s, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(60, slimbus1, codec_spkr_i2s, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(61, slimbus1, codec_spkr_i2s, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(62, codec_spkr_i2s, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(63, audio_pcm, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(64, audio_pcm, gp_pdm_1b, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(65, audio_pcm, vfe_camif_timer4_a, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(66, audio_pcm, vfe_camif_timer5_a, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(67, spkr_i2s, vfe_camif_timer7_a, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(68, spkr_i2s, gsbi2_spi_cs2_n, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(69, spkr_i2s, gp_pdm_2a, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(70, spkr_i2s, gp_clk_1b, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(71, mic_i2s, gsbi10, vfe_camif_timer6_a, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(72, mic_i2s, gsbi10, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(73, mic_i2s, gsbi10, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(74, mic_i2s, gsbi10, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(75, tsif1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(76, tsif1, gsbi11_spi_cs3_n, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(77, tsif1, sdc5, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(78, tsif2, sdc5, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(79, tsif2, sdc5, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(80, tsif2, sdc5, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(81, tsif2, sdc5, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(82, tsif1, sdc5, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(83, bt, sdc4, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(84, wlan, sdc4, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(85, wlan, sdc4, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(86, wlan, sdc4, pmb_clk, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(87, wlan, sdc4, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(88, wlan, sdc4, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(89, sdc2, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(90, sdc2, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(91, sdc2, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(92, sdc2, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(93, sdc2, gsbi9, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(94, sdc2, gsbi9, gp_pdm_1a, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(95, sdc2, gsbi9, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(96, sdc2, gsbi9, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(97, sdc2, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(98, sdc2, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(99, hdmi_cec, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(100, hdmi_ddc_clock, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(101, hdmi_ddc_data, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(102, hdmi_hot_plug_detect, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(103, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(104, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(105, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(106, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(107, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(108, ps_hold, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(109, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(110, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(111, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(112, NA, pmb_clk, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(113, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(114, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(115, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(116, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(117, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(118, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(119, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(120, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(121, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(122, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(123, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(124, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(125, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(126, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(127, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(128, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(129, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(130, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(131, NA, ssbi_qpa1, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(132, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(133, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(134, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(135, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(136, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(137, gps_blanking, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(138, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(139, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(140, ssbi2, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(141, ssbi1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(142, ssbi2, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(143, ssbi1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(144, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(145, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(146, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(147, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(148, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(149, ssbi_pmic2, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(150, hsic, NA, vfe_camif_timer4_b, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(151, hsic, NA, vfe_camif_timer3_b, NA, NA, NA, NA, NA, NA, NA, NA),
+
+       SDC_PINGROUP(sdc1_clk, 0x20a0, 13, 6),
+       SDC_PINGROUP(sdc1_cmd, 0x20a0, 11, 3),
+       SDC_PINGROUP(sdc1_data, 0x20a0, 9, 0),
+
+       SDC_PINGROUP(sdc3_clk, 0x20a4, 14, 6),
+       SDC_PINGROUP(sdc3_cmd, 0x20a4, 11, 3),
+       SDC_PINGROUP(sdc3_data, 0x20a4, 9, 0),
+};
+
+#define NUM_GPIO_PINGROUPS 152
+
+static const struct msm_pinctrl_soc_data msm8960_pinctrl = {
+       .pins = msm8960_pins,
+       .npins = ARRAY_SIZE(msm8960_pins),
+       .functions = msm8960_functions,
+       .nfunctions = ARRAY_SIZE(msm8960_functions),
+       .groups = msm8960_groups,
+       .ngroups = ARRAY_SIZE(msm8960_groups),
+       .ngpios = NUM_GPIO_PINGROUPS,
+};
+
+static int msm8960_pinctrl_probe(struct platform_device *pdev)
+{
+       return msm_pinctrl_probe(pdev, &msm8960_pinctrl);
+}
+
+static const struct of_device_id msm8960_pinctrl_of_match[] = {
+       { .compatible = "qcom,msm8960-pinctrl", },
+       { },
+};
+
+static struct platform_driver msm8960_pinctrl_driver = {
+       .driver = {
+               .name = "msm8960-pinctrl",
+               .owner = THIS_MODULE,
+               .of_match_table = msm8960_pinctrl_of_match,
+       },
+       .probe = msm8960_pinctrl_probe,
+       .remove = msm_pinctrl_remove,
+};
+
+static int __init msm8960_pinctrl_init(void)
+{
+       return platform_driver_register(&msm8960_pinctrl_driver);
+}
+arch_initcall(msm8960_pinctrl_init);
+
+static void __exit msm8960_pinctrl_exit(void)
+{
+       platform_driver_unregister(&msm8960_pinctrl_driver);
+}
+module_exit(msm8960_pinctrl_exit);
+
+MODULE_AUTHOR("Bjorn Andersson <bjorn.andersson@sonymobile.com>");
+MODULE_DESCRIPTION("Qualcomm MSM8960 pinctrl driver");
+MODULE_LICENSE("GPL v2");
+MODULE_DEVICE_TABLE(of, msm8960_pinctrl_of_match);
diff --git a/drivers/pinctrl/qcom/pinctrl-msm8x74.c b/drivers/pinctrl/qcom/pinctrl-msm8x74.c
new file mode 100644 (file)
index 0000000..8c97201
--- /dev/null
@@ -0,0 +1,1067 @@
+/*
+ * Copyright (c) 2013, Sony Mobile Communications AB.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/pinctrl/pinctrl.h>
+
+#include "pinctrl-msm.h"
+
+static const struct pinctrl_pin_desc msm8x74_pins[] = {
+       PINCTRL_PIN(0, "GPIO_0"),
+       PINCTRL_PIN(1, "GPIO_1"),
+       PINCTRL_PIN(2, "GPIO_2"),
+       PINCTRL_PIN(3, "GPIO_3"),
+       PINCTRL_PIN(4, "GPIO_4"),
+       PINCTRL_PIN(5, "GPIO_5"),
+       PINCTRL_PIN(6, "GPIO_6"),
+       PINCTRL_PIN(7, "GPIO_7"),
+       PINCTRL_PIN(8, "GPIO_8"),
+       PINCTRL_PIN(9, "GPIO_9"),
+       PINCTRL_PIN(10, "GPIO_10"),
+       PINCTRL_PIN(11, "GPIO_11"),
+       PINCTRL_PIN(12, "GPIO_12"),
+       PINCTRL_PIN(13, "GPIO_13"),
+       PINCTRL_PIN(14, "GPIO_14"),
+       PINCTRL_PIN(15, "GPIO_15"),
+       PINCTRL_PIN(16, "GPIO_16"),
+       PINCTRL_PIN(17, "GPIO_17"),
+       PINCTRL_PIN(18, "GPIO_18"),
+       PINCTRL_PIN(19, "GPIO_19"),
+       PINCTRL_PIN(20, "GPIO_20"),
+       PINCTRL_PIN(21, "GPIO_21"),
+       PINCTRL_PIN(22, "GPIO_22"),
+       PINCTRL_PIN(23, "GPIO_23"),
+       PINCTRL_PIN(24, "GPIO_24"),
+       PINCTRL_PIN(25, "GPIO_25"),
+       PINCTRL_PIN(26, "GPIO_26"),
+       PINCTRL_PIN(27, "GPIO_27"),
+       PINCTRL_PIN(28, "GPIO_28"),
+       PINCTRL_PIN(29, "GPIO_29"),
+       PINCTRL_PIN(30, "GPIO_30"),
+       PINCTRL_PIN(31, "GPIO_31"),
+       PINCTRL_PIN(32, "GPIO_32"),
+       PINCTRL_PIN(33, "GPIO_33"),
+       PINCTRL_PIN(34, "GPIO_34"),
+       PINCTRL_PIN(35, "GPIO_35"),
+       PINCTRL_PIN(36, "GPIO_36"),
+       PINCTRL_PIN(37, "GPIO_37"),
+       PINCTRL_PIN(38, "GPIO_38"),
+       PINCTRL_PIN(39, "GPIO_39"),
+       PINCTRL_PIN(40, "GPIO_40"),
+       PINCTRL_PIN(41, "GPIO_41"),
+       PINCTRL_PIN(42, "GPIO_42"),
+       PINCTRL_PIN(43, "GPIO_43"),
+       PINCTRL_PIN(44, "GPIO_44"),
+       PINCTRL_PIN(45, "GPIO_45"),
+       PINCTRL_PIN(46, "GPIO_46"),
+       PINCTRL_PIN(47, "GPIO_47"),
+       PINCTRL_PIN(48, "GPIO_48"),
+       PINCTRL_PIN(49, "GPIO_49"),
+       PINCTRL_PIN(50, "GPIO_50"),
+       PINCTRL_PIN(51, "GPIO_51"),
+       PINCTRL_PIN(52, "GPIO_52"),
+       PINCTRL_PIN(53, "GPIO_53"),
+       PINCTRL_PIN(54, "GPIO_54"),
+       PINCTRL_PIN(55, "GPIO_55"),
+       PINCTRL_PIN(56, "GPIO_56"),
+       PINCTRL_PIN(57, "GPIO_57"),
+       PINCTRL_PIN(58, "GPIO_58"),
+       PINCTRL_PIN(59, "GPIO_59"),
+       PINCTRL_PIN(60, "GPIO_60"),
+       PINCTRL_PIN(61, "GPIO_61"),
+       PINCTRL_PIN(62, "GPIO_62"),
+       PINCTRL_PIN(63, "GPIO_63"),
+       PINCTRL_PIN(64, "GPIO_64"),
+       PINCTRL_PIN(65, "GPIO_65"),
+       PINCTRL_PIN(66, "GPIO_66"),
+       PINCTRL_PIN(67, "GPIO_67"),
+       PINCTRL_PIN(68, "GPIO_68"),
+       PINCTRL_PIN(69, "GPIO_69"),
+       PINCTRL_PIN(70, "GPIO_70"),
+       PINCTRL_PIN(71, "GPIO_71"),
+       PINCTRL_PIN(72, "GPIO_72"),
+       PINCTRL_PIN(73, "GPIO_73"),
+       PINCTRL_PIN(74, "GPIO_74"),
+       PINCTRL_PIN(75, "GPIO_75"),
+       PINCTRL_PIN(76, "GPIO_76"),
+       PINCTRL_PIN(77, "GPIO_77"),
+       PINCTRL_PIN(78, "GPIO_78"),
+       PINCTRL_PIN(79, "GPIO_79"),
+       PINCTRL_PIN(80, "GPIO_80"),
+       PINCTRL_PIN(81, "GPIO_81"),
+       PINCTRL_PIN(82, "GPIO_82"),
+       PINCTRL_PIN(83, "GPIO_83"),
+       PINCTRL_PIN(84, "GPIO_84"),
+       PINCTRL_PIN(85, "GPIO_85"),
+       PINCTRL_PIN(86, "GPIO_86"),
+       PINCTRL_PIN(87, "GPIO_87"),
+       PINCTRL_PIN(88, "GPIO_88"),
+       PINCTRL_PIN(89, "GPIO_89"),
+       PINCTRL_PIN(90, "GPIO_90"),
+       PINCTRL_PIN(91, "GPIO_91"),
+       PINCTRL_PIN(92, "GPIO_92"),
+       PINCTRL_PIN(93, "GPIO_93"),
+       PINCTRL_PIN(94, "GPIO_94"),
+       PINCTRL_PIN(95, "GPIO_95"),
+       PINCTRL_PIN(96, "GPIO_96"),
+       PINCTRL_PIN(97, "GPIO_97"),
+       PINCTRL_PIN(98, "GPIO_98"),
+       PINCTRL_PIN(99, "GPIO_99"),
+       PINCTRL_PIN(100, "GPIO_100"),
+       PINCTRL_PIN(101, "GPIO_101"),
+       PINCTRL_PIN(102, "GPIO_102"),
+       PINCTRL_PIN(103, "GPIO_103"),
+       PINCTRL_PIN(104, "GPIO_104"),
+       PINCTRL_PIN(105, "GPIO_105"),
+       PINCTRL_PIN(106, "GPIO_106"),
+       PINCTRL_PIN(107, "GPIO_107"),
+       PINCTRL_PIN(108, "GPIO_108"),
+       PINCTRL_PIN(109, "GPIO_109"),
+       PINCTRL_PIN(110, "GPIO_110"),
+       PINCTRL_PIN(111, "GPIO_111"),
+       PINCTRL_PIN(112, "GPIO_112"),
+       PINCTRL_PIN(113, "GPIO_113"),
+       PINCTRL_PIN(114, "GPIO_114"),
+       PINCTRL_PIN(115, "GPIO_115"),
+       PINCTRL_PIN(116, "GPIO_116"),
+       PINCTRL_PIN(117, "GPIO_117"),
+       PINCTRL_PIN(118, "GPIO_118"),
+       PINCTRL_PIN(119, "GPIO_119"),
+       PINCTRL_PIN(120, "GPIO_120"),
+       PINCTRL_PIN(121, "GPIO_121"),
+       PINCTRL_PIN(122, "GPIO_122"),
+       PINCTRL_PIN(123, "GPIO_123"),
+       PINCTRL_PIN(124, "GPIO_124"),
+       PINCTRL_PIN(125, "GPIO_125"),
+       PINCTRL_PIN(126, "GPIO_126"),
+       PINCTRL_PIN(127, "GPIO_127"),
+       PINCTRL_PIN(128, "GPIO_128"),
+       PINCTRL_PIN(129, "GPIO_129"),
+       PINCTRL_PIN(130, "GPIO_130"),
+       PINCTRL_PIN(131, "GPIO_131"),
+       PINCTRL_PIN(132, "GPIO_132"),
+       PINCTRL_PIN(133, "GPIO_133"),
+       PINCTRL_PIN(134, "GPIO_134"),
+       PINCTRL_PIN(135, "GPIO_135"),
+       PINCTRL_PIN(136, "GPIO_136"),
+       PINCTRL_PIN(137, "GPIO_137"),
+       PINCTRL_PIN(138, "GPIO_138"),
+       PINCTRL_PIN(139, "GPIO_139"),
+       PINCTRL_PIN(140, "GPIO_140"),
+       PINCTRL_PIN(141, "GPIO_141"),
+       PINCTRL_PIN(142, "GPIO_142"),
+       PINCTRL_PIN(143, "GPIO_143"),
+       PINCTRL_PIN(144, "GPIO_144"),
+       PINCTRL_PIN(145, "GPIO_145"),
+
+       PINCTRL_PIN(146, "SDC1_CLK"),
+       PINCTRL_PIN(147, "SDC1_CMD"),
+       PINCTRL_PIN(148, "SDC1_DATA"),
+       PINCTRL_PIN(149, "SDC2_CLK"),
+       PINCTRL_PIN(150, "SDC2_CMD"),
+       PINCTRL_PIN(151, "SDC2_DATA"),
+};
+
+#define DECLARE_MSM_GPIO_PINS(pin) static const unsigned int gpio##pin##_pins[] = { pin }
+DECLARE_MSM_GPIO_PINS(0);
+DECLARE_MSM_GPIO_PINS(1);
+DECLARE_MSM_GPIO_PINS(2);
+DECLARE_MSM_GPIO_PINS(3);
+DECLARE_MSM_GPIO_PINS(4);
+DECLARE_MSM_GPIO_PINS(5);
+DECLARE_MSM_GPIO_PINS(6);
+DECLARE_MSM_GPIO_PINS(7);
+DECLARE_MSM_GPIO_PINS(8);
+DECLARE_MSM_GPIO_PINS(9);
+DECLARE_MSM_GPIO_PINS(10);
+DECLARE_MSM_GPIO_PINS(11);
+DECLARE_MSM_GPIO_PINS(12);
+DECLARE_MSM_GPIO_PINS(13);
+DECLARE_MSM_GPIO_PINS(14);
+DECLARE_MSM_GPIO_PINS(15);
+DECLARE_MSM_GPIO_PINS(16);
+DECLARE_MSM_GPIO_PINS(17);
+DECLARE_MSM_GPIO_PINS(18);
+DECLARE_MSM_GPIO_PINS(19);
+DECLARE_MSM_GPIO_PINS(20);
+DECLARE_MSM_GPIO_PINS(21);
+DECLARE_MSM_GPIO_PINS(22);
+DECLARE_MSM_GPIO_PINS(23);
+DECLARE_MSM_GPIO_PINS(24);
+DECLARE_MSM_GPIO_PINS(25);
+DECLARE_MSM_GPIO_PINS(26);
+DECLARE_MSM_GPIO_PINS(27);
+DECLARE_MSM_GPIO_PINS(28);
+DECLARE_MSM_GPIO_PINS(29);
+DECLARE_MSM_GPIO_PINS(30);
+DECLARE_MSM_GPIO_PINS(31);
+DECLARE_MSM_GPIO_PINS(32);
+DECLARE_MSM_GPIO_PINS(33);
+DECLARE_MSM_GPIO_PINS(34);
+DECLARE_MSM_GPIO_PINS(35);
+DECLARE_MSM_GPIO_PINS(36);
+DECLARE_MSM_GPIO_PINS(37);
+DECLARE_MSM_GPIO_PINS(38);
+DECLARE_MSM_GPIO_PINS(39);
+DECLARE_MSM_GPIO_PINS(40);
+DECLARE_MSM_GPIO_PINS(41);
+DECLARE_MSM_GPIO_PINS(42);
+DECLARE_MSM_GPIO_PINS(43);
+DECLARE_MSM_GPIO_PINS(44);
+DECLARE_MSM_GPIO_PINS(45);
+DECLARE_MSM_GPIO_PINS(46);
+DECLARE_MSM_GPIO_PINS(47);
+DECLARE_MSM_GPIO_PINS(48);
+DECLARE_MSM_GPIO_PINS(49);
+DECLARE_MSM_GPIO_PINS(50);
+DECLARE_MSM_GPIO_PINS(51);
+DECLARE_MSM_GPIO_PINS(52);
+DECLARE_MSM_GPIO_PINS(53);
+DECLARE_MSM_GPIO_PINS(54);
+DECLARE_MSM_GPIO_PINS(55);
+DECLARE_MSM_GPIO_PINS(56);
+DECLARE_MSM_GPIO_PINS(57);
+DECLARE_MSM_GPIO_PINS(58);
+DECLARE_MSM_GPIO_PINS(59);
+DECLARE_MSM_GPIO_PINS(60);
+DECLARE_MSM_GPIO_PINS(61);
+DECLARE_MSM_GPIO_PINS(62);
+DECLARE_MSM_GPIO_PINS(63);
+DECLARE_MSM_GPIO_PINS(64);
+DECLARE_MSM_GPIO_PINS(65);
+DECLARE_MSM_GPIO_PINS(66);
+DECLARE_MSM_GPIO_PINS(67);
+DECLARE_MSM_GPIO_PINS(68);
+DECLARE_MSM_GPIO_PINS(69);
+DECLARE_MSM_GPIO_PINS(70);
+DECLARE_MSM_GPIO_PINS(71);
+DECLARE_MSM_GPIO_PINS(72);
+DECLARE_MSM_GPIO_PINS(73);
+DECLARE_MSM_GPIO_PINS(74);
+DECLARE_MSM_GPIO_PINS(75);
+DECLARE_MSM_GPIO_PINS(76);
+DECLARE_MSM_GPIO_PINS(77);
+DECLARE_MSM_GPIO_PINS(78);
+DECLARE_MSM_GPIO_PINS(79);
+DECLARE_MSM_GPIO_PINS(80);
+DECLARE_MSM_GPIO_PINS(81);
+DECLARE_MSM_GPIO_PINS(82);
+DECLARE_MSM_GPIO_PINS(83);
+DECLARE_MSM_GPIO_PINS(84);
+DECLARE_MSM_GPIO_PINS(85);
+DECLARE_MSM_GPIO_PINS(86);
+DECLARE_MSM_GPIO_PINS(87);
+DECLARE_MSM_GPIO_PINS(88);
+DECLARE_MSM_GPIO_PINS(89);
+DECLARE_MSM_GPIO_PINS(90);
+DECLARE_MSM_GPIO_PINS(91);
+DECLARE_MSM_GPIO_PINS(92);
+DECLARE_MSM_GPIO_PINS(93);
+DECLARE_MSM_GPIO_PINS(94);
+DECLARE_MSM_GPIO_PINS(95);
+DECLARE_MSM_GPIO_PINS(96);
+DECLARE_MSM_GPIO_PINS(97);
+DECLARE_MSM_GPIO_PINS(98);
+DECLARE_MSM_GPIO_PINS(99);
+DECLARE_MSM_GPIO_PINS(100);
+DECLARE_MSM_GPIO_PINS(101);
+DECLARE_MSM_GPIO_PINS(102);
+DECLARE_MSM_GPIO_PINS(103);
+DECLARE_MSM_GPIO_PINS(104);
+DECLARE_MSM_GPIO_PINS(105);
+DECLARE_MSM_GPIO_PINS(106);
+DECLARE_MSM_GPIO_PINS(107);
+DECLARE_MSM_GPIO_PINS(108);
+DECLARE_MSM_GPIO_PINS(109);
+DECLARE_MSM_GPIO_PINS(110);
+DECLARE_MSM_GPIO_PINS(111);
+DECLARE_MSM_GPIO_PINS(112);
+DECLARE_MSM_GPIO_PINS(113);
+DECLARE_MSM_GPIO_PINS(114);
+DECLARE_MSM_GPIO_PINS(115);
+DECLARE_MSM_GPIO_PINS(116);
+DECLARE_MSM_GPIO_PINS(117);
+DECLARE_MSM_GPIO_PINS(118);
+DECLARE_MSM_GPIO_PINS(119);
+DECLARE_MSM_GPIO_PINS(120);
+DECLARE_MSM_GPIO_PINS(121);
+DECLARE_MSM_GPIO_PINS(122);
+DECLARE_MSM_GPIO_PINS(123);
+DECLARE_MSM_GPIO_PINS(124);
+DECLARE_MSM_GPIO_PINS(125);
+DECLARE_MSM_GPIO_PINS(126);
+DECLARE_MSM_GPIO_PINS(127);
+DECLARE_MSM_GPIO_PINS(128);
+DECLARE_MSM_GPIO_PINS(129);
+DECLARE_MSM_GPIO_PINS(130);
+DECLARE_MSM_GPIO_PINS(131);
+DECLARE_MSM_GPIO_PINS(132);
+DECLARE_MSM_GPIO_PINS(133);
+DECLARE_MSM_GPIO_PINS(134);
+DECLARE_MSM_GPIO_PINS(135);
+DECLARE_MSM_GPIO_PINS(136);
+DECLARE_MSM_GPIO_PINS(137);
+DECLARE_MSM_GPIO_PINS(138);
+DECLARE_MSM_GPIO_PINS(139);
+DECLARE_MSM_GPIO_PINS(140);
+DECLARE_MSM_GPIO_PINS(141);
+DECLARE_MSM_GPIO_PINS(142);
+DECLARE_MSM_GPIO_PINS(143);
+DECLARE_MSM_GPIO_PINS(144);
+DECLARE_MSM_GPIO_PINS(145);
+
+static const unsigned int sdc1_clk_pins[] = { 146 };
+static const unsigned int sdc1_cmd_pins[] = { 147 };
+static const unsigned int sdc1_data_pins[] = { 148 };
+static const unsigned int sdc2_clk_pins[] = { 149 };
+static const unsigned int sdc2_cmd_pins[] = { 150 };
+static const unsigned int sdc2_data_pins[] = { 151 };
+
+#define FUNCTION(fname)                                        \
+       [MSM_MUX_##fname] = {                           \
+               .name = #fname,                         \
+               .groups = fname##_groups,               \
+               .ngroups = ARRAY_SIZE(fname##_groups),  \
+       }
+
+#define PINGROUP(id, f1, f2, f3, f4, f5, f6, f7)       \
+       {                                               \
+               .name = "gpio" #id,                     \
+               .pins = gpio##id##_pins,                \
+               .npins = ARRAY_SIZE(gpio##id##_pins),   \
+               .funcs = (int[]){                       \
+                       MSM_MUX_gpio,                   \
+                       MSM_MUX_##f1,                   \
+                       MSM_MUX_##f2,                   \
+                       MSM_MUX_##f3,                   \
+                       MSM_MUX_##f4,                   \
+                       MSM_MUX_##f5,                   \
+                       MSM_MUX_##f6,                   \
+                       MSM_MUX_##f7                    \
+               },                                      \
+               .nfuncs = 8,                            \
+               .ctl_reg = 0x1000 + 0x10 * id,          \
+               .io_reg = 0x1004 + 0x10 * id,           \
+               .intr_cfg_reg = 0x1008 + 0x10 * id,     \
+               .intr_status_reg = 0x100c + 0x10 * id,  \
+               .intr_target_reg = 0x1008 + 0x10 * id,  \
+               .mux_bit = 2,                           \
+               .pull_bit = 0,                          \
+               .drv_bit = 6,                           \
+               .oe_bit = 9,                            \
+               .in_bit = 0,                            \
+               .out_bit = 1,                           \
+               .intr_enable_bit = 0,                   \
+               .intr_status_bit = 0,                   \
+               .intr_target_bit = 5,                   \
+               .intr_raw_status_bit = 4,               \
+               .intr_polarity_bit = 1,                 \
+               .intr_detection_bit = 2,                \
+               .intr_detection_width = 2,              \
+       }
+
+#define SDC_PINGROUP(pg_name, ctl, pull, drv)          \
+       {                                               \
+               .name = #pg_name,                       \
+               .pins = pg_name##_pins,                 \
+               .npins = ARRAY_SIZE(pg_name##_pins),    \
+               .ctl_reg = ctl,                         \
+               .io_reg = 0,                            \
+               .intr_cfg_reg = 0,                      \
+               .intr_status_reg = 0,                   \
+               .intr_target_reg = 0,                   \
+               .mux_bit = -1,                          \
+               .pull_bit = pull,                       \
+               .drv_bit = drv,                         \
+               .oe_bit = -1,                           \
+               .in_bit = -1,                           \
+               .out_bit = -1,                          \
+               .intr_enable_bit = -1,                  \
+               .intr_status_bit = -1,                  \
+               .intr_target_bit = -1,                  \
+               .intr_raw_status_bit = -1,              \
+               .intr_polarity_bit = -1,                \
+               .intr_detection_bit = -1,               \
+               .intr_detection_width = -1,             \
+       }
+
+/*
+ * TODO: Add the rest of the possible functions and fill out
+ * the pingroup table below.
+ */
+enum msm8x74_functions {
+       MSM_MUX_gpio,
+       MSM_MUX_cci_i2c0,
+       MSM_MUX_cci_i2c1,
+       MSM_MUX_blsp_i2c1,
+       MSM_MUX_blsp_i2c2,
+       MSM_MUX_blsp_i2c3,
+       MSM_MUX_blsp_i2c4,
+       MSM_MUX_blsp_i2c5,
+       MSM_MUX_blsp_i2c6,
+       MSM_MUX_blsp_i2c7,
+       MSM_MUX_blsp_i2c8,
+       MSM_MUX_blsp_i2c9,
+       MSM_MUX_blsp_i2c10,
+       MSM_MUX_blsp_i2c11,
+       MSM_MUX_blsp_i2c12,
+       MSM_MUX_blsp_spi1,
+       MSM_MUX_blsp_spi1_cs1,
+       MSM_MUX_blsp_spi1_cs2,
+       MSM_MUX_blsp_spi1_cs3,
+       MSM_MUX_blsp_spi2,
+       MSM_MUX_blsp_spi2_cs1,
+       MSM_MUX_blsp_spi2_cs2,
+       MSM_MUX_blsp_spi2_cs3,
+       MSM_MUX_blsp_spi3,
+       MSM_MUX_blsp_spi4,
+       MSM_MUX_blsp_spi5,
+       MSM_MUX_blsp_spi6,
+       MSM_MUX_blsp_spi7,
+       MSM_MUX_blsp_spi8,
+       MSM_MUX_blsp_spi9,
+       MSM_MUX_blsp_spi10,
+       MSM_MUX_blsp_spi10_cs1,
+       MSM_MUX_blsp_spi10_cs2,
+       MSM_MUX_blsp_spi10_cs3,
+       MSM_MUX_blsp_spi11,
+       MSM_MUX_blsp_spi12,
+       MSM_MUX_blsp_uart1,
+       MSM_MUX_blsp_uart2,
+       MSM_MUX_blsp_uart3,
+       MSM_MUX_blsp_uart4,
+       MSM_MUX_blsp_uart5,
+       MSM_MUX_blsp_uart6,
+       MSM_MUX_blsp_uart7,
+       MSM_MUX_blsp_uart8,
+       MSM_MUX_blsp_uart9,
+       MSM_MUX_blsp_uart10,
+       MSM_MUX_blsp_uart11,
+       MSM_MUX_blsp_uart12,
+       MSM_MUX_blsp_uim1,
+       MSM_MUX_blsp_uim2,
+       MSM_MUX_blsp_uim3,
+       MSM_MUX_blsp_uim4,
+       MSM_MUX_blsp_uim5,
+       MSM_MUX_blsp_uim6,
+       MSM_MUX_blsp_uim7,
+       MSM_MUX_blsp_uim8,
+       MSM_MUX_blsp_uim9,
+       MSM_MUX_blsp_uim10,
+       MSM_MUX_blsp_uim11,
+       MSM_MUX_blsp_uim12,
+       MSM_MUX_uim1,
+       MSM_MUX_uim2,
+       MSM_MUX_uim_batt_alarm,
+       MSM_MUX_sdc3,
+       MSM_MUX_sdc4,
+       MSM_MUX_gcc_gp_clk1,
+       MSM_MUX_gcc_gp_clk2,
+       MSM_MUX_gcc_gp_clk3,
+       MSM_MUX_qua_mi2s,
+       MSM_MUX_pri_mi2s,
+       MSM_MUX_spkr_mi2s,
+       MSM_MUX_ter_mi2s,
+       MSM_MUX_sec_mi2s,
+       MSM_MUX_hdmi_cec,
+       MSM_MUX_hdmi_ddc,
+       MSM_MUX_hdmi_hpd,
+       MSM_MUX_edp_hpd,
+       MSM_MUX_mdp_vsync,
+       MSM_MUX_cam_mclk0,
+       MSM_MUX_cam_mclk1,
+       MSM_MUX_cam_mclk2,
+       MSM_MUX_cam_mclk3,
+       MSM_MUX_cci_timer0,
+       MSM_MUX_cci_timer1,
+       MSM_MUX_cci_timer2,
+       MSM_MUX_cci_timer3,
+       MSM_MUX_cci_timer4,
+       MSM_MUX_cci_async_in0,
+       MSM_MUX_cci_async_in1,
+       MSM_MUX_cci_async_in2,
+       MSM_MUX_gp_pdm0,
+       MSM_MUX_gp_pdm1,
+       MSM_MUX_gp_pdm2,
+       MSM_MUX_gp0_clk,
+       MSM_MUX_gp1_clk,
+       MSM_MUX_gp_mn,
+       MSM_MUX_tsif1,
+       MSM_MUX_tsif2,
+       MSM_MUX_hsic,
+       MSM_MUX_grfc,
+       MSM_MUX_audio_ref_clk,
+       MSM_MUX_bt,
+       MSM_MUX_fm,
+       MSM_MUX_wlan,
+       MSM_MUX_slimbus,
+       MSM_MUX_NA,
+};
+
+static const char * const gpio_groups[] = {
+       "gpio0", "gpio1", "gpio2", "gpio3", "gpio4", "gpio5", "gpio6", "gpio7",
+       "gpio8", "gpio9", "gpio10", "gpio11", "gpio12", "gpio13", "gpio14",
+       "gpio15", "gpio16", "gpio17", "gpio18", "gpio19", "gpio20", "gpio21",
+       "gpio22", "gpio23", "gpio24", "gpio25", "gpio26", "gpio27", "gpio28",
+       "gpio29", "gpio30", "gpio31", "gpio32", "gpio33", "gpio34", "gpio35",
+       "gpio36", "gpio37", "gpio38", "gpio39", "gpio40", "gpio41", "gpio42",
+       "gpio43", "gpio44", "gpio45", "gpio46", "gpio47", "gpio48", "gpio49",
+       "gpio50", "gpio51", "gpio52", "gpio53", "gpio54", "gpio55", "gpio56",
+       "gpio57", "gpio58", "gpio59", "gpio60", "gpio61", "gpio62", "gpio63",
+       "gpio64", "gpio65", "gpio66", "gpio67", "gpio68", "gpio69", "gpio70",
+       "gpio71", "gpio72", "gpio73", "gpio74", "gpio75", "gpio76", "gpio77",
+       "gpio78", "gpio79", "gpio80", "gpio81", "gpio82", "gpio83", "gpio84",
+       "gpio85", "gpio86", "gpio87", "gpio88", "gpio89", "gpio90", "gpio91",
+       "gpio92", "gpio93", "gpio94", "gpio95", "gpio96", "gpio97", "gpio98",
+       "gpio99", "gpio100", "gpio101", "gpio102", "gpio103", "gpio104",
+       "gpio105", "gpio106", "gpio107", "gpio108", "gpio109", "gpio110",
+       "gpio111", "gpio112", "gpio113", "gpio114", "gpio115", "gpio116",
+       "gpio117", "gpio118", "gpio119", "gpio120", "gpio121", "gpio122",
+       "gpio123", "gpio124", "gpio125", "gpio126", "gpio127", "gpio128",
+       "gpio129", "gpio130", "gpio131", "gpio132", "gpio133", "gpio134",
+       "gpio135", "gpio136", "gpio137", "gpio138", "gpio139", "gpio140",
+       "gpio141", "gpio142", "gpio143", "gpio144", "gpio145"
+};
+
+static const char * const blsp_uart1_groups[] = {
+       "gpio0", "gpio1", "gpio2", "gpio3"
+};
+static const char * const blsp_uim1_groups[] = { "gpio0", "gpio1" };
+static const char * const blsp_i2c1_groups[] = { "gpio2", "gpio3" };
+static const char * const blsp_spi1_groups[] = {
+       "gpio0", "gpio1", "gpio2", "gpio3"
+};
+static const char * const blsp_spi1_cs1_groups[] = { "gpio8" };
+static const char * const blsp_spi1_cs2_groups[] = { "gpio9", "gpio11" };
+static const char * const blsp_spi1_cs3_groups[] = { "gpio10" };
+
+static const char * const blsp_uart2_groups[] = {
+       "gpio4", "gpio5", "gpio6", "gpio7"
+};
+static const char * const blsp_uim2_groups[] = { "gpio4", "gpio5" };
+static const char * const blsp_i2c2_groups[] = { "gpio6", "gpio7" };
+static const char * const blsp_spi2_groups[] = {
+       "gpio4", "gpio5", "gpio6", "gpio7"
+};
+static const char * const blsp_spi2_cs1_groups[] = { "gpio53", "gpio62" };
+static const char * const blsp_spi2_cs2_groups[] = { "gpio54", "gpio63" };
+static const char * const blsp_spi2_cs3_groups[] = { "gpio66" };
+
+static const char * const blsp_uart3_groups[] = {
+       "gpio8", "gpio9", "gpio10", "gpio11"
+};
+static const char * const blsp_uim3_groups[] = { "gpio8", "gpio9" };
+static const char * const blsp_i2c3_groups[] = { "gpio10", "gpio11" };
+static const char * const blsp_spi3_groups[] = {
+       "gpio8", "gpio9", "gpio10", "gpio11"
+};
+
+static const char * const cci_i2c0_groups[] = { "gpio19", "gpio20" };
+static const char * const cci_i2c1_groups[] = { "gpio21", "gpio22" };
+
+static const char * const blsp_uart4_groups[] = {
+       "gpio19", "gpio20", "gpio21", "gpio22"
+};
+static const char * const blsp_uim4_groups[] = { "gpio19", "gpio20" };
+static const char * const blsp_i2c4_groups[] = { "gpio21", "gpio22" };
+static const char * const blsp_spi4_groups[] = {
+       "gpio19", "gpio20", "gpio21", "gpio22"
+};
+
+static const char * const blsp_uart5_groups[] = {
+       "gpio23", "gpio24", "gpio25", "gpio26"
+};
+static const char * const blsp_uim5_groups[] = { "gpio23", "gpio24" };
+static const char * const blsp_i2c5_groups[] = { "gpio25", "gpio26" };
+static const char * const blsp_spi5_groups[] = {
+       "gpio23", "gpio24", "gpio25", "gpio26"
+};
+
+static const char * const blsp_uart6_groups[] = {
+       "gpio27", "gpio28", "gpio29", "gpio30"
+};
+static const char * const blsp_uim6_groups[] = { "gpio27", "gpio28" };
+static const char * const blsp_i2c6_groups[] = { "gpio29", "gpio30" };
+static const char * const blsp_spi6_groups[] = {
+       "gpio27", "gpio28", "gpio29", "gpio30"
+};
+
+static const char * const blsp_uart7_groups[] = {
+       "gpio41", "gpio42", "gpio43", "gpio44"
+};
+static const char * const blsp_uim7_groups[] = { "gpio41", "gpio42" };
+static const char * const blsp_i2c7_groups[] = { "gpio43", "gpio44" };
+static const char * const blsp_spi7_groups[] = {
+       "gpio41", "gpio42", "gpio43", "gpio44"
+};
+
+static const char * const blsp_uart8_groups[] = {
+       "gpio45", "gpio46", "gpio47", "gpio48"
+};
+static const char * const blsp_uim8_groups[] = { "gpio45", "gpio46" };
+static const char * const blsp_i2c8_groups[] = { "gpio47", "gpio48" };
+static const char * const blsp_spi8_groups[] = {
+       "gpio45", "gpio46", "gpio47", "gpio48"
+};
+
+static const char * const blsp_uart9_groups[] = {
+       "gpio49", "gpio50", "gpio51", "gpio52"
+};
+static const char * const blsp_uim9_groups[] = { "gpio49", "gpio50" };
+static const char * const blsp_i2c9_groups[] = { "gpio51", "gpio52" };
+static const char * const blsp_spi9_groups[] = {
+       "gpio49", "gpio50", "gpio51", "gpio52"
+};
+
+static const char * const blsp_uart10_groups[] = {
+       "gpio53", "gpio54", "gpio55", "gpio56"
+};
+static const char * const blsp_uim10_groups[] = { "gpio53", "gpio54" };
+static const char * const blsp_i2c10_groups[] = { "gpio55", "gpio56" };
+static const char * const blsp_spi10_groups[] = {
+       "gpio53", "gpio54", "gpio55", "gpio56"
+};
+static const char * const blsp_spi10_cs1_groups[] = { "gpio47", "gpio67" };
+static const char * const blsp_spi10_cs2_groups[] = { "gpio48", "gpio68" };
+static const char * const blsp_spi10_cs3_groups[] = { "gpio90" };
+
+static const char * const blsp_uart11_groups[] = {
+       "gpio81", "gpio82", "gpio83", "gpio84"
+};
+static const char * const blsp_uim11_groups[] = { "gpio81", "gpio82" };
+static const char * const blsp_i2c11_groups[] = { "gpio83", "gpio84" };
+static const char * const blsp_spi11_groups[] = {
+       "gpio81", "gpio82", "gpio83", "gpio84"
+};
+
+static const char * const blsp_uart12_groups[] = {
+       "gpio85", "gpio86", "gpio87", "gpio88"
+};
+static const char * const blsp_uim12_groups[] = { "gpio85", "gpio86" };
+static const char * const blsp_i2c12_groups[] = { "gpio87", "gpio88" };
+static const char * const blsp_spi12_groups[] = {
+       "gpio85", "gpio86", "gpio87", "gpio88"
+};
+
+static const char * const uim1_groups[] = {
+       "gpio97", "gpio98", "gpio99", "gpio100"
+};
+
+static const char * const uim2_groups[] = {
+       "gpio49", "gpio50", "gpio51", "gpio52"
+};
+
+static const char * const uim_batt_alarm_groups[] = { "gpio101" };
+
+static const char * const sdc3_groups[] = {
+       "gpio35", "gpio36", "gpio37", "gpio38", "gpio39", "gpio40"
+};
+
+static const char * const sdc4_groups[] = {
+       "gpio91", "gpio92", "gpio93", "gpio94", "gpio95", "gpio96"
+};
+
+static const char * const gp0_clk_groups[] = { "gpio26" };
+static const char * const gp1_clk_groups[] = { "gpio27", "gpio57", "gpio78" };
+static const char * const gp_mn_groups[] = { "gpio29" };
+static const char * const gcc_gp_clk1_groups[] = { "gpio57", "gpio78" };
+static const char * const gcc_gp_clk2_groups[] = { "gpio58", "gpio81" };
+static const char * const gcc_gp_clk3_groups[] = { "gpio59", "gpio82" };
+
+static const char * const qua_mi2s_groups[] = {
+       "gpio57", "gpio58", "gpio59", "gpio60", "gpio61", "gpio62", "gpio63",
+};
+
+static const char * const pri_mi2s_groups[] = {
+       "gpio64", "gpio65", "gpio66", "gpio67", "gpio68"
+};
+
+static const char * const spkr_mi2s_groups[] = {
+       "gpio69", "gpio70", "gpio71", "gpio72"
+};
+
+static const char * const ter_mi2s_groups[] = {
+       "gpio73", "gpio74", "gpio75", "gpio76", "gpio77"
+};
+
+static const char * const sec_mi2s_groups[] = {
+       "gpio78", "gpio79", "gpio80", "gpio81", "gpio82"
+};
+
+static const char * const hdmi_cec_groups[] = { "gpio31" };
+static const char * const hdmi_ddc_groups[] = { "gpio32", "gpio33" };
+static const char * const hdmi_hpd_groups[] = { "gpio34" };
+static const char * const edp_hpd_groups[] = { "gpio102" };
+
+static const char * const mdp_vsync_groups[] = { "gpio12", "gpio13", "gpio14" };
+static const char * const cam_mclk0_groups[] = { "gpio15" };
+static const char * const cam_mclk1_groups[] = { "gpio16" };
+static const char * const cam_mclk2_groups[] = { "gpio17" };
+static const char * const cam_mclk3_groups[] = { "gpio18" };
+
+static const char * const cci_timer0_groups[] = { "gpio23" };
+static const char * const cci_timer1_groups[] = { "gpio24" };
+static const char * const cci_timer2_groups[] = { "gpio25" };
+static const char * const cci_timer3_groups[] = { "gpio26" };
+static const char * const cci_timer4_groups[] = { "gpio27" };
+static const char * const cci_async_in0_groups[] = { "gpio28" };
+static const char * const cci_async_in1_groups[] = { "gpio26" };
+static const char * const cci_async_in2_groups[] = { "gpio27" };
+
+static const char * const gp_pdm0_groups[] = { "gpio54", "gpio68" };
+static const char * const gp_pdm1_groups[] = { "gpio74", "gpio86" };
+static const char * const gp_pdm2_groups[] = { "gpio63", "gpio79" };
+
+static const char * const tsif1_groups[] = {
+       "gpio89", "gpio90", "gpio91", "gpio92"
+};
+
+static const char * const tsif2_groups[] = {
+       "gpio93", "gpio94", "gpio95", "gpio96"
+};
+
+static const char * const hsic_groups[] = { "gpio144", "gpio145" };
+static const char * const grfc_groups[] = {
+       "gpio104", "gpio105", "gpio106", "gpio107", "gpio108", "gpio109",
+       "gpio110", "gpio111", "gpio112", "gpio113", "gpio114", "gpio115",
+       "gpio116", "gpio117", "gpio118", "gpio119", "gpio120", "gpio121",
+       "gpio122", "gpio123", "gpio124", "gpio125", "gpio126", "gpio127",
+       "gpio128", "gpio136", "gpio137", "gpio141", "gpio143"
+};
+
+static const char * const audio_ref_clk_groups[] = { "gpio69" };
+
+static const char * const bt_groups[] = { "gpio35", "gpio43", "gpio44" };
+
+static const char * const fm_groups[] = { "gpio41", "gpio42" };
+
+static const char * const wlan_groups[] = {
+       "gpio36", "gpio37", "gpio38", "gpio39", "gpio40"
+};
+
+static const char * const slimbus_groups[] = { "gpio70", "gpio71" };
+
+static const struct msm_function msm8x74_functions[] = {
+       FUNCTION(gpio),
+       FUNCTION(cci_i2c0),
+       FUNCTION(cci_i2c1),
+       FUNCTION(uim1),
+       FUNCTION(uim2),
+       FUNCTION(uim_batt_alarm),
+       FUNCTION(blsp_uim1),
+       FUNCTION(blsp_uim2),
+       FUNCTION(blsp_uim3),
+       FUNCTION(blsp_uim4),
+       FUNCTION(blsp_uim5),
+       FUNCTION(blsp_uim6),
+       FUNCTION(blsp_uim7),
+       FUNCTION(blsp_uim8),
+       FUNCTION(blsp_uim9),
+       FUNCTION(blsp_uim10),
+       FUNCTION(blsp_uim11),
+       FUNCTION(blsp_uim12),
+       FUNCTION(blsp_i2c1),
+       FUNCTION(blsp_i2c2),
+       FUNCTION(blsp_i2c3),
+       FUNCTION(blsp_i2c4),
+       FUNCTION(blsp_i2c5),
+       FUNCTION(blsp_i2c6),
+       FUNCTION(blsp_i2c7),
+       FUNCTION(blsp_i2c8),
+       FUNCTION(blsp_i2c9),
+       FUNCTION(blsp_i2c10),
+       FUNCTION(blsp_i2c11),
+       FUNCTION(blsp_i2c12),
+       FUNCTION(blsp_spi1),
+       FUNCTION(blsp_spi1_cs1),
+       FUNCTION(blsp_spi1_cs2),
+       FUNCTION(blsp_spi1_cs3),
+       FUNCTION(blsp_spi2),
+       FUNCTION(blsp_spi2_cs1),
+       FUNCTION(blsp_spi2_cs2),
+       FUNCTION(blsp_spi2_cs3),
+       FUNCTION(blsp_spi3),
+       FUNCTION(blsp_spi4),
+       FUNCTION(blsp_spi5),
+       FUNCTION(blsp_spi6),
+       FUNCTION(blsp_spi7),
+       FUNCTION(blsp_spi8),
+       FUNCTION(blsp_spi9),
+       FUNCTION(blsp_spi10),
+       FUNCTION(blsp_spi10_cs1),
+       FUNCTION(blsp_spi10_cs2),
+       FUNCTION(blsp_spi10_cs3),
+       FUNCTION(blsp_spi11),
+       FUNCTION(blsp_spi12),
+       FUNCTION(blsp_uart1),
+       FUNCTION(blsp_uart2),
+       FUNCTION(blsp_uart3),
+       FUNCTION(blsp_uart4),
+       FUNCTION(blsp_uart5),
+       FUNCTION(blsp_uart6),
+       FUNCTION(blsp_uart7),
+       FUNCTION(blsp_uart8),
+       FUNCTION(blsp_uart9),
+       FUNCTION(blsp_uart10),
+       FUNCTION(blsp_uart11),
+       FUNCTION(blsp_uart12),
+       FUNCTION(sdc3),
+       FUNCTION(sdc4),
+       FUNCTION(gcc_gp_clk1),
+       FUNCTION(gcc_gp_clk2),
+       FUNCTION(gcc_gp_clk3),
+       FUNCTION(qua_mi2s),
+       FUNCTION(pri_mi2s),
+       FUNCTION(spkr_mi2s),
+       FUNCTION(ter_mi2s),
+       FUNCTION(sec_mi2s),
+       FUNCTION(mdp_vsync),
+       FUNCTION(cam_mclk0),
+       FUNCTION(cam_mclk1),
+       FUNCTION(cam_mclk2),
+       FUNCTION(cam_mclk3),
+       FUNCTION(cci_timer0),
+       FUNCTION(cci_timer1),
+       FUNCTION(cci_timer2),
+       FUNCTION(cci_timer3),
+       FUNCTION(cci_timer4),
+       FUNCTION(cci_async_in0),
+       FUNCTION(cci_async_in1),
+       FUNCTION(cci_async_in2),
+       FUNCTION(hdmi_cec),
+       FUNCTION(hdmi_ddc),
+       FUNCTION(hdmi_hpd),
+       FUNCTION(edp_hpd),
+       FUNCTION(gp_pdm0),
+       FUNCTION(gp_pdm1),
+       FUNCTION(gp_pdm2),
+       FUNCTION(gp0_clk),
+       FUNCTION(gp1_clk),
+       FUNCTION(gp_mn),
+       FUNCTION(tsif1),
+       FUNCTION(tsif2),
+       FUNCTION(hsic),
+       FUNCTION(grfc),
+       FUNCTION(audio_ref_clk),
+       FUNCTION(bt),
+       FUNCTION(fm),
+       FUNCTION(wlan),
+       FUNCTION(slimbus),
+};
+
+static const struct msm_pingroup msm8x74_groups[] = {
+       PINGROUP(0,   blsp_spi1, blsp_uart1, blsp_uim1, NA, NA, NA, NA),
+       PINGROUP(1,   blsp_spi1, blsp_uart1, blsp_uim1, NA, NA, NA, NA),
+       PINGROUP(2,   blsp_spi1, blsp_uart1, blsp_i2c1, NA, NA, NA, NA),
+       PINGROUP(3,   blsp_spi1, blsp_uart1, blsp_i2c1, NA, NA, NA, NA),
+       PINGROUP(4,   blsp_spi2, blsp_uart2, blsp_uim2, NA, NA, NA, NA),
+       PINGROUP(5,   blsp_spi2, blsp_uart2, blsp_uim2, NA, NA, NA, NA),
+       PINGROUP(6,   blsp_spi2, blsp_uart2, blsp_i2c2, NA, NA, NA, NA),
+       PINGROUP(7,   blsp_spi2, blsp_uart2, blsp_i2c2, NA, NA, NA, NA),
+       PINGROUP(8,   blsp_spi3, blsp_uart3, blsp_uim3, blsp_spi1_cs1, NA, NA, NA),
+       PINGROUP(9,   blsp_spi3, blsp_uart3, blsp_uim3, blsp_spi1_cs2, NA, NA, NA),
+       PINGROUP(10,  blsp_spi3, blsp_uart3, blsp_i2c3, blsp_spi1_cs3, NA, NA, NA),
+       PINGROUP(11,  blsp_spi3, blsp_uart3, blsp_i2c3, blsp_spi1_cs2, NA, NA, NA),
+       PINGROUP(12,  mdp_vsync, NA, NA, NA, NA, NA, NA),
+       PINGROUP(13,  mdp_vsync, NA, NA, NA, NA, NA, NA),
+       PINGROUP(14,  mdp_vsync, NA, NA, NA, NA, NA, NA),
+       PINGROUP(15,  cam_mclk0, NA, NA, NA, NA, NA, NA),
+       PINGROUP(16,  cam_mclk1, NA, NA, NA, NA, NA, NA),
+       PINGROUP(17,  cam_mclk2, NA, NA, NA, NA, NA, NA),
+       PINGROUP(18,  cam_mclk3, NA, NA, NA, NA, NA, NA),
+       PINGROUP(19,  cci_i2c0, blsp_spi4, blsp_uart4, blsp_uim4, NA, NA, NA),
+       PINGROUP(20,  cci_i2c0, blsp_spi4, blsp_uart4, blsp_uim4, NA, NA, NA),
+       PINGROUP(21,  cci_i2c1, blsp_spi4, blsp_uart4, blsp_i2c4, NA, NA, NA),
+       PINGROUP(22,  cci_i2c1, blsp_spi4, blsp_uart4, blsp_i2c4, NA, NA, NA),
+       PINGROUP(23,  cci_timer0, blsp_spi5, blsp_uart5, blsp_uim5, NA, NA, NA),
+       PINGROUP(24,  cci_timer1, blsp_spi5, blsp_uart5, blsp_uim5, NA, NA, NA),
+       PINGROUP(25,  cci_timer2, blsp_spi5, blsp_uart5, blsp_i2c5, NA, NA, NA),
+       PINGROUP(26,  cci_timer3, cci_async_in1, blsp_spi5, blsp_uart5, blsp_i2c5, gp0_clk, NA),
+       PINGROUP(27,  cci_timer4, cci_async_in2, blsp_spi6, blsp_uart6, blsp_i2c6, gp1_clk, NA),
+       PINGROUP(28,  cci_async_in0, blsp_spi6, blsp_uart6, blsp_uim6, NA, NA, NA),
+       PINGROUP(29,  blsp_spi6, blsp_uart6, blsp_i2c6, gp_mn, NA, NA, NA),
+       PINGROUP(30,  blsp_spi6, blsp_uart6, blsp_i2c6, NA, NA, NA, NA),
+       PINGROUP(31,  hdmi_cec, NA, NA, NA, NA, NA, NA),
+       PINGROUP(32,  hdmi_ddc, NA, NA, NA, NA, NA, NA),
+       PINGROUP(33,  hdmi_ddc, NA, NA, NA, NA, NA, NA),
+       PINGROUP(34,  hdmi_hpd, NA, NA, NA, NA, NA, NA),
+       PINGROUP(35,  bt, sdc3, NA, NA, NA, NA, NA),
+       PINGROUP(36,  wlan, sdc3, NA, NA, NA, NA, NA),
+       PINGROUP(37,  wlan, sdc3, NA, NA, NA, NA, NA),
+       PINGROUP(38,  wlan, sdc3, NA, NA, NA, NA, NA),
+       PINGROUP(39,  wlan, sdc3, NA, NA, NA, NA, NA),
+       PINGROUP(40,  wlan, sdc3, NA, NA, NA, NA, NA),
+       PINGROUP(41,  fm, blsp_spi7, blsp_uart7, blsp_uim7, NA, NA, NA),
+       PINGROUP(42,  fm, blsp_spi7, blsp_uart7, blsp_uim7, NA, NA, NA),
+       PINGROUP(43,  bt, blsp_spi7, blsp_uart7, blsp_i2c7, NA, NA, NA),
+       PINGROUP(44,  bt, blsp_spi7, blsp_uart7, blsp_i2c7, NA, NA, NA),
+       PINGROUP(45,  blsp_spi8, blsp_uart8, blsp_uim8, NA, NA, NA, NA),
+       PINGROUP(46,  blsp_spi8, blsp_uart8, blsp_uim8, NA, NA, NA, NA),
+       PINGROUP(47,  blsp_spi8, blsp_uart8, blsp_i2c8, blsp_spi10_cs1, NA, NA, NA),
+       PINGROUP(48,  blsp_spi8, blsp_uart8, blsp_i2c8, blsp_spi10_cs2, NA, NA, NA),
+       PINGROUP(49,  uim2, blsp_spi9, blsp_uart9, blsp_uim9, NA, NA, NA),
+       PINGROUP(50,  uim2, blsp_spi9, blsp_uart9, blsp_uim9, NA, NA, NA),
+       PINGROUP(51,  uim2, blsp_spi9, blsp_uart9, blsp_i2c9, NA, NA, NA),
+       PINGROUP(52,  uim2, blsp_spi9, blsp_uart9, blsp_i2c9, NA, NA, NA),
+       PINGROUP(53,  blsp_spi10, blsp_uart10, blsp_uim10, blsp_spi2_cs1, NA, NA, NA),
+       PINGROUP(54,  blsp_spi10, blsp_uart10, blsp_uim10, blsp_spi2_cs2, gp_pdm0, NA, NA),
+       PINGROUP(55,  blsp_spi10, blsp_uart10, blsp_i2c10, NA, NA, NA, NA),
+       PINGROUP(56,  blsp_spi10, blsp_uart10, blsp_i2c10, NA, NA, NA, NA),
+       PINGROUP(57,  qua_mi2s, gcc_gp_clk1, NA, NA, NA, NA, NA),
+       PINGROUP(58,  qua_mi2s, gcc_gp_clk2, NA, NA, NA, NA, NA),
+       PINGROUP(59,  qua_mi2s, gcc_gp_clk3, NA, NA, NA, NA, NA),
+       PINGROUP(60,  qua_mi2s, NA, NA, NA, NA, NA, NA),
+       PINGROUP(61,  qua_mi2s, NA, NA, NA, NA, NA, NA),
+       PINGROUP(62,  qua_mi2s, blsp_spi2_cs1, NA, NA, NA, NA, NA),
+       PINGROUP(63,  qua_mi2s, blsp_spi2_cs2, gp_pdm2, NA, NA, NA, NA),
+       PINGROUP(64,  pri_mi2s, NA, NA, NA, NA, NA, NA),
+       PINGROUP(65,  pri_mi2s, NA, NA, NA, NA, NA, NA),
+       PINGROUP(66,  pri_mi2s, blsp_spi2_cs3, NA, NA, NA, NA, NA),
+       PINGROUP(67,  pri_mi2s, blsp_spi10_cs1, NA, NA, NA, NA, NA),
+       PINGROUP(68,  pri_mi2s, blsp_spi10_cs2, gp_pdm0, NA, NA, NA, NA),
+       PINGROUP(69,  spkr_mi2s, audio_ref_clk, NA, NA, NA, NA, NA),
+       PINGROUP(70,  slimbus, spkr_mi2s, NA, NA, NA, NA, NA),
+       PINGROUP(71,  slimbus, spkr_mi2s, NA, NA, NA, NA, NA),
+       PINGROUP(72,  spkr_mi2s, NA, NA, NA, NA, NA, NA),
+       PINGROUP(73,  ter_mi2s, NA, NA, NA, NA, NA, NA),
+       PINGROUP(74,  ter_mi2s, gp_pdm1, NA, NA, NA, NA, NA),
+       PINGROUP(75,  ter_mi2s, NA, NA, NA, NA, NA, NA),
+       PINGROUP(76,  ter_mi2s, NA, NA, NA, NA, NA, NA),
+       PINGROUP(77,  ter_mi2s, NA, NA, NA, NA, NA, NA),
+       PINGROUP(78,  sec_mi2s, gcc_gp_clk1, NA, NA, NA, NA, NA),
+       PINGROUP(79,  sec_mi2s, gp_pdm2, NA, NA, NA, NA, NA),
+       PINGROUP(80,  sec_mi2s, NA, NA, NA, NA, NA, NA),
+       PINGROUP(81,  sec_mi2s, blsp_spi11, blsp_uart11, blsp_uim11, gcc_gp_clk2, NA, NA),
+       PINGROUP(82,  sec_mi2s, blsp_spi11, blsp_uart11, blsp_uim11, gcc_gp_clk3, NA, NA),
+       PINGROUP(83,  blsp_spi11, blsp_uart11, blsp_i2c11, NA, NA, NA, NA),
+       PINGROUP(84,  blsp_spi11, blsp_uart11, blsp_i2c11, NA, NA, NA, NA),
+       PINGROUP(85,  blsp_spi12, blsp_uart12, blsp_uim12, NA, NA, NA, NA),
+       PINGROUP(86,  blsp_spi12, blsp_uart12, blsp_uim12, gp_pdm1, NA, NA, NA),
+       PINGROUP(87,  blsp_spi12, blsp_uart12, blsp_i2c12, NA, NA, NA, NA),
+       PINGROUP(88,  blsp_spi12, blsp_uart12, blsp_i2c12, NA, NA, NA, NA),
+       PINGROUP(89,  tsif1, NA, NA, NA, NA, NA, NA),
+       PINGROUP(90,  tsif1, blsp_spi10_cs3, NA, NA, NA, NA, NA),
+       PINGROUP(91,  tsif1, sdc4, NA, NA, NA, NA, NA),
+       PINGROUP(92,  tsif1, sdc4, NA, NA, NA, NA, NA),
+       PINGROUP(93,  tsif2, sdc4, NA, NA, NA, NA, NA),
+       PINGROUP(94,  tsif2, sdc4, NA, NA, NA, NA, NA),
+       PINGROUP(95,  tsif2, sdc4, NA, NA, NA, NA, NA),
+       PINGROUP(96,  tsif2, sdc4, NA, NA, NA, NA, NA),
+       PINGROUP(97,  uim1, NA, NA, NA, NA, NA, NA),
+       PINGROUP(98,  uim1, NA, NA, NA, NA, NA, NA),
+       PINGROUP(99,  uim1, NA, NA, NA, NA, NA, NA),
+       PINGROUP(100, uim1, NA, NA, NA, NA, NA, NA),
+       PINGROUP(101, uim_batt_alarm, NA, NA, NA, NA, NA, NA),
+       PINGROUP(102, edp_hpd, NA, NA, NA, NA, NA, NA),
+       PINGROUP(103, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(104, grfc, NA, NA, NA, NA, NA, NA),
+       PINGROUP(105, grfc, NA, NA, NA, NA, NA, NA),
+       PINGROUP(106, grfc, NA, NA, NA, NA, NA, NA),
+       PINGROUP(107, grfc, NA, NA, NA, NA, NA, NA),
+       PINGROUP(108, grfc, NA, NA, NA, NA, NA, NA),
+       PINGROUP(109, grfc, NA, NA, NA, NA, NA, NA),
+       PINGROUP(110, grfc, NA, NA, NA, NA, NA, NA),
+       PINGROUP(111, grfc, NA, NA, NA, NA, NA, NA),
+       PINGROUP(112, grfc, NA, NA, NA, NA, NA, NA),
+       PINGROUP(113, grfc, NA, NA, NA, NA, NA, NA),
+       PINGROUP(114, grfc, NA, NA, NA, NA, NA, NA),
+       PINGROUP(115, grfc, NA, NA, NA, NA, NA, NA),
+       PINGROUP(116, grfc, NA, NA, NA, NA, NA, NA),
+       PINGROUP(117, grfc, NA, NA, NA, NA, NA, NA),
+       PINGROUP(118, grfc, NA, NA, NA, NA, NA, NA),
+       PINGROUP(119, grfc, NA, NA, NA, NA, NA, NA),
+       PINGROUP(120, grfc, NA, NA, NA, NA, NA, NA),
+       PINGROUP(121, grfc, NA, NA, NA, NA, NA, NA),
+       PINGROUP(122, grfc, NA, NA, NA, NA, NA, NA),
+       PINGROUP(123, grfc, NA, NA, NA, NA, NA, NA),
+       PINGROUP(124, grfc, NA, NA, NA, NA, NA, NA),
+       PINGROUP(125, grfc, NA, NA, NA, NA, NA, NA),
+       PINGROUP(126, grfc, NA, NA, NA, NA, NA, NA),
+       PINGROUP(127, grfc, NA, NA, NA, NA, NA, NA),
+       PINGROUP(128, NA, grfc, NA, NA, NA, NA, NA),
+       PINGROUP(129, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(130, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(131, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(132, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(133, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(134, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(135, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(136, NA, grfc, NA, NA, NA, NA, NA),
+       PINGROUP(137, NA, grfc, NA, NA, NA, NA, NA),
+       PINGROUP(138, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(139, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(140, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(141, NA, grfc, NA, NA, NA, NA, NA),
+       PINGROUP(142, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(143, NA, grfc, NA, NA, NA, NA, NA),
+       PINGROUP(144, hsic, NA, NA, NA, NA, NA, NA),
+       PINGROUP(145, hsic, NA, NA, NA, NA, NA, NA),
+       SDC_PINGROUP(sdc1_clk, 0x2044, 13, 6),
+       SDC_PINGROUP(sdc1_cmd, 0x2044, 11, 3),
+       SDC_PINGROUP(sdc1_data, 0x2044, 9, 0),
+       SDC_PINGROUP(sdc2_clk, 0x2048, 14, 6),
+       SDC_PINGROUP(sdc2_cmd, 0x2048, 11, 3),
+       SDC_PINGROUP(sdc2_data, 0x2048, 9, 0),
+};
+
+#define NUM_GPIO_PINGROUPS 146
+
+static const struct msm_pinctrl_soc_data msm8x74_pinctrl = {
+       .pins = msm8x74_pins,
+       .npins = ARRAY_SIZE(msm8x74_pins),
+       .functions = msm8x74_functions,
+       .nfunctions = ARRAY_SIZE(msm8x74_functions),
+       .groups = msm8x74_groups,
+       .ngroups = ARRAY_SIZE(msm8x74_groups),
+       .ngpios = NUM_GPIO_PINGROUPS,
+};
+
+static int msm8x74_pinctrl_probe(struct platform_device *pdev)
+{
+       return msm_pinctrl_probe(pdev, &msm8x74_pinctrl);
+}
+
+static const struct of_device_id msm8x74_pinctrl_of_match[] = {
+       { .compatible = "qcom,msm8974-pinctrl", },
+       { },
+};
+
+static struct platform_driver msm8x74_pinctrl_driver = {
+       .driver = {
+               .name = "msm8x74-pinctrl",
+               .owner = THIS_MODULE,
+               .of_match_table = msm8x74_pinctrl_of_match,
+       },
+       .probe = msm8x74_pinctrl_probe,
+       .remove = msm_pinctrl_remove,
+};
+
+static int __init msm8x74_pinctrl_init(void)
+{
+       return platform_driver_register(&msm8x74_pinctrl_driver);
+}
+arch_initcall(msm8x74_pinctrl_init);
+
+static void __exit msm8x74_pinctrl_exit(void)
+{
+       platform_driver_unregister(&msm8x74_pinctrl_driver);
+}
+module_exit(msm8x74_pinctrl_exit);
+
+MODULE_AUTHOR("Bjorn Andersson <bjorn.andersson@sonymobile.com>");
+MODULE_DESCRIPTION("Qualcomm MSM8x74 pinctrl driver");
+MODULE_LICENSE("GPL v2");
+MODULE_DEVICE_TABLE(of, msm8x74_pinctrl_of_match);
+
diff --git a/drivers/pinctrl/samsung/Kconfig b/drivers/pinctrl/samsung/Kconfig
new file mode 100644 (file)
index 0000000..d0461cd
--- /dev/null
@@ -0,0 +1,28 @@
+#
+# Samsung Pin control drivers
+#
+config PINCTRL_SAMSUNG
+       bool
+       select PINMUX
+       select PINCONF
+
+config PINCTRL_EXYNOS
+       bool "Pinctrl driver data for Samsung EXYNOS SoCs other than 5440"
+       depends on OF && GPIOLIB && (ARCH_EXYNOS || ARCH_S5PV210)
+       select PINCTRL_SAMSUNG
+
+config PINCTRL_EXYNOS5440
+       bool "Samsung EXYNOS5440 SoC pinctrl driver"
+       depends on SOC_EXYNOS5440
+       select PINMUX
+       select PINCONF
+
+config PINCTRL_S3C24XX
+       bool "Samsung S3C24XX SoC pinctrl driver"
+       depends on ARCH_S3C24XX
+       select PINCTRL_SAMSUNG
+
+config PINCTRL_S3C64XX
+       bool "Samsung S3C64XX SoC pinctrl driver"
+       depends on ARCH_S3C64XX
+       select PINCTRL_SAMSUNG
diff --git a/drivers/pinctrl/samsung/Makefile b/drivers/pinctrl/samsung/Makefile
new file mode 100644 (file)
index 0000000..70160c0
--- /dev/null
@@ -0,0 +1,7 @@
+# Samsung pin control drivers
+
+obj-$(CONFIG_PINCTRL_SAMSUNG)  += pinctrl-samsung.o
+obj-$(CONFIG_PINCTRL_EXYNOS)   += pinctrl-exynos.o
+obj-$(CONFIG_PINCTRL_EXYNOS5440)       += pinctrl-exynos5440.o
+obj-$(CONFIG_PINCTRL_S3C24XX)  += pinctrl-s3c24xx.o
+obj-$(CONFIG_PINCTRL_S3C64XX)  += pinctrl-s3c64xx.o
diff --git a/drivers/pinctrl/samsung/pinctrl-exynos.c b/drivers/pinctrl/samsung/pinctrl-exynos.c
new file mode 100644 (file)
index 0000000..003bfd8
--- /dev/null
@@ -0,0 +1,1123 @@
+/*
+ * Exynos specific support for Samsung pinctrl/gpiolib driver with eint support.
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd.
+ *             http://www.samsung.com
+ * Copyright (c) 2012 Linaro Ltd
+ *             http://www.linaro.org
+ *
+ * Author: Thomas Abraham <thomas.ab@samsung.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This file contains the Samsung Exynos specific information required by the
+ * the Samsung pinctrl/gpiolib driver. It also includes the implementation of
+ * external gpio and wakeup interrupt support.
+ */
+
+#include <linux/module.h>
+#include <linux/device.h>
+#include <linux/interrupt.h>
+#include <linux/irqdomain.h>
+#include <linux/irq.h>
+#include <linux/irqchip/chained_irq.h>
+#include <linux/of_irq.h>
+#include <linux/io.h>
+#include <linux/slab.h>
+#include <linux/spinlock.h>
+#include <linux/err.h>
+
+#include "pinctrl-samsung.h"
+#include "pinctrl-exynos.h"
+
+struct exynos_irq_chip {
+       struct irq_chip chip;
+
+       u32 eint_con;
+       u32 eint_mask;
+       u32 eint_pend;
+};
+
+static inline struct exynos_irq_chip *to_exynos_irq_chip(struct irq_chip *chip)
+{
+       return container_of(chip, struct exynos_irq_chip, chip);
+}
+
+static struct samsung_pin_bank_type bank_type_off = {
+       .fld_width = { 4, 1, 2, 2, 2, 2, },
+       .reg_offset = { 0x00, 0x04, 0x08, 0x0c, 0x10, 0x14, },
+};
+
+static struct samsung_pin_bank_type bank_type_alive = {
+       .fld_width = { 4, 1, 2, 2, },
+       .reg_offset = { 0x00, 0x04, 0x08, 0x0c, },
+};
+
+/* list of external wakeup controllers supported */
+static const struct of_device_id exynos_wkup_irq_ids[] = {
+       { .compatible = "samsung,exynos4210-wakeup-eint", },
+       { }
+};
+
+static void exynos_irq_mask(struct irq_data *irqd)
+{
+       struct irq_chip *chip = irq_data_get_irq_chip(irqd);
+       struct exynos_irq_chip *our_chip = to_exynos_irq_chip(chip);
+       struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
+       struct samsung_pinctrl_drv_data *d = bank->drvdata;
+       unsigned long reg_mask = our_chip->eint_mask + bank->eint_offset;
+       unsigned long mask;
+       unsigned long flags;
+
+       spin_lock_irqsave(&bank->slock, flags);
+
+       mask = readl(d->virt_base + reg_mask);
+       mask |= 1 << irqd->hwirq;
+       writel(mask, d->virt_base + reg_mask);
+
+       spin_unlock_irqrestore(&bank->slock, flags);
+}
+
+static void exynos_irq_ack(struct irq_data *irqd)
+{
+       struct irq_chip *chip = irq_data_get_irq_chip(irqd);
+       struct exynos_irq_chip *our_chip = to_exynos_irq_chip(chip);
+       struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
+       struct samsung_pinctrl_drv_data *d = bank->drvdata;
+       unsigned long reg_pend = our_chip->eint_pend + bank->eint_offset;
+
+       writel(1 << irqd->hwirq, d->virt_base + reg_pend);
+}
+
+static void exynos_irq_unmask(struct irq_data *irqd)
+{
+       struct irq_chip *chip = irq_data_get_irq_chip(irqd);
+       struct exynos_irq_chip *our_chip = to_exynos_irq_chip(chip);
+       struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
+       struct samsung_pinctrl_drv_data *d = bank->drvdata;
+       unsigned long reg_mask = our_chip->eint_mask + bank->eint_offset;
+       unsigned long mask;
+       unsigned long flags;
+
+       /*
+        * Ack level interrupts right before unmask
+        *
+        * If we don't do this we'll get a double-interrupt.  Level triggered
+        * interrupts must not fire an interrupt if the level is not
+        * _currently_ active, even if it was active while the interrupt was
+        * masked.
+        */
+       if (irqd_get_trigger_type(irqd) & IRQ_TYPE_LEVEL_MASK)
+               exynos_irq_ack(irqd);
+
+       spin_lock_irqsave(&bank->slock, flags);
+
+       mask = readl(d->virt_base + reg_mask);
+       mask &= ~(1 << irqd->hwirq);
+       writel(mask, d->virt_base + reg_mask);
+
+       spin_unlock_irqrestore(&bank->slock, flags);
+}
+
+static int exynos_irq_set_type(struct irq_data *irqd, unsigned int type)
+{
+       struct irq_chip *chip = irq_data_get_irq_chip(irqd);
+       struct exynos_irq_chip *our_chip = to_exynos_irq_chip(chip);
+       struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
+       struct samsung_pin_bank_type *bank_type = bank->type;
+       struct samsung_pinctrl_drv_data *d = bank->drvdata;
+       unsigned int pin = irqd->hwirq;
+       unsigned int shift = EXYNOS_EINT_CON_LEN * pin;
+       unsigned int con, trig_type;
+       unsigned long reg_con = our_chip->eint_con + bank->eint_offset;
+       unsigned long flags;
+       unsigned int mask;
+
+       switch (type) {
+       case IRQ_TYPE_EDGE_RISING:
+               trig_type = EXYNOS_EINT_EDGE_RISING;
+               break;
+       case IRQ_TYPE_EDGE_FALLING:
+               trig_type = EXYNOS_EINT_EDGE_FALLING;
+               break;
+       case IRQ_TYPE_EDGE_BOTH:
+               trig_type = EXYNOS_EINT_EDGE_BOTH;
+               break;
+       case IRQ_TYPE_LEVEL_HIGH:
+               trig_type = EXYNOS_EINT_LEVEL_HIGH;
+               break;
+       case IRQ_TYPE_LEVEL_LOW:
+               trig_type = EXYNOS_EINT_LEVEL_LOW;
+               break;
+       default:
+               pr_err("unsupported external interrupt type\n");
+               return -EINVAL;
+       }
+
+       if (type & IRQ_TYPE_EDGE_BOTH)
+               __irq_set_handler_locked(irqd->irq, handle_edge_irq);
+       else
+               __irq_set_handler_locked(irqd->irq, handle_level_irq);
+
+       con = readl(d->virt_base + reg_con);
+       con &= ~(EXYNOS_EINT_CON_MASK << shift);
+       con |= trig_type << shift;
+       writel(con, d->virt_base + reg_con);
+
+       reg_con = bank->pctl_offset + bank_type->reg_offset[PINCFG_TYPE_FUNC];
+       shift = pin * bank_type->fld_width[PINCFG_TYPE_FUNC];
+       mask = (1 << bank_type->fld_width[PINCFG_TYPE_FUNC]) - 1;
+
+       spin_lock_irqsave(&bank->slock, flags);
+
+       con = readl(d->virt_base + reg_con);
+       con &= ~(mask << shift);
+       con |= EXYNOS_EINT_FUNC << shift;
+       writel(con, d->virt_base + reg_con);
+
+       spin_unlock_irqrestore(&bank->slock, flags);
+
+       return 0;
+}
+
+/*
+ * irq_chip for gpio interrupts.
+ */
+static struct exynos_irq_chip exynos_gpio_irq_chip = {
+       .chip = {
+               .name = "exynos_gpio_irq_chip",
+               .irq_unmask = exynos_irq_unmask,
+               .irq_mask = exynos_irq_mask,
+               .irq_ack = exynos_irq_ack,
+               .irq_set_type = exynos_irq_set_type,
+       },
+       .eint_con = EXYNOS_GPIO_ECON_OFFSET,
+       .eint_mask = EXYNOS_GPIO_EMASK_OFFSET,
+       .eint_pend = EXYNOS_GPIO_EPEND_OFFSET,
+};
+
+static int exynos_gpio_irq_map(struct irq_domain *h, unsigned int virq,
+                                       irq_hw_number_t hw)
+{
+       struct samsung_pin_bank *b = h->host_data;
+
+       irq_set_chip_data(virq, b);
+       irq_set_chip_and_handler(virq, &exynos_gpio_irq_chip.chip,
+                                       handle_level_irq);
+       set_irq_flags(virq, IRQF_VALID);
+       return 0;
+}
+
+/*
+ * irq domain callbacks for external gpio interrupt controller.
+ */
+static const struct irq_domain_ops exynos_gpio_irqd_ops = {
+       .map    = exynos_gpio_irq_map,
+       .xlate  = irq_domain_xlate_twocell,
+};
+
+static irqreturn_t exynos_eint_gpio_irq(int irq, void *data)
+{
+       struct samsung_pinctrl_drv_data *d = data;
+       struct samsung_pin_ctrl *ctrl = d->ctrl;
+       struct samsung_pin_bank *bank = ctrl->pin_banks;
+       unsigned int svc, group, pin, virq;
+
+       svc = readl(d->virt_base + EXYNOS_SVC_OFFSET);
+       group = EXYNOS_SVC_GROUP(svc);
+       pin = svc & EXYNOS_SVC_NUM_MASK;
+
+       if (!group)
+               return IRQ_HANDLED;
+       bank += (group - 1);
+
+       virq = irq_linear_revmap(bank->irq_domain, pin);
+       if (!virq)
+               return IRQ_NONE;
+       generic_handle_irq(virq);
+       return IRQ_HANDLED;
+}
+
+struct exynos_eint_gpio_save {
+       u32 eint_con;
+       u32 eint_fltcon0;
+       u32 eint_fltcon1;
+};
+
+/*
+ * exynos_eint_gpio_init() - setup handling of external gpio interrupts.
+ * @d: driver data of samsung pinctrl driver.
+ */
+static int exynos_eint_gpio_init(struct samsung_pinctrl_drv_data *d)
+{
+       struct samsung_pin_bank *bank;
+       struct device *dev = d->dev;
+       int ret;
+       int i;
+
+       if (!d->irq) {
+               dev_err(dev, "irq number not available\n");
+               return -EINVAL;
+       }
+
+       ret = devm_request_irq(dev, d->irq, exynos_eint_gpio_irq,
+                                       0, dev_name(dev), d);
+       if (ret) {
+               dev_err(dev, "irq request failed\n");
+               return -ENXIO;
+       }
+
+       bank = d->ctrl->pin_banks;
+       for (i = 0; i < d->ctrl->nr_banks; ++i, ++bank) {
+               if (bank->eint_type != EINT_TYPE_GPIO)
+                       continue;
+               bank->irq_domain = irq_domain_add_linear(bank->of_node,
+                               bank->nr_pins, &exynos_gpio_irqd_ops, bank);
+               if (!bank->irq_domain) {
+                       dev_err(dev, "gpio irq domain add failed\n");
+                       ret = -ENXIO;
+                       goto err_domains;
+               }
+
+               bank->soc_priv = devm_kzalloc(d->dev,
+                       sizeof(struct exynos_eint_gpio_save), GFP_KERNEL);
+               if (!bank->soc_priv) {
+                       irq_domain_remove(bank->irq_domain);
+                       ret = -ENOMEM;
+                       goto err_domains;
+               }
+       }
+
+       return 0;
+
+err_domains:
+       for (--i, --bank; i >= 0; --i, --bank) {
+               if (bank->eint_type != EINT_TYPE_GPIO)
+                       continue;
+               irq_domain_remove(bank->irq_domain);
+       }
+
+       return ret;
+}
+
+static u32 exynos_eint_wake_mask = 0xffffffff;
+
+u32 exynos_get_eint_wake_mask(void)
+{
+       return exynos_eint_wake_mask;
+}
+
+static int exynos_wkup_irq_set_wake(struct irq_data *irqd, unsigned int on)
+{
+       struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
+       unsigned long bit = 1UL << (2 * bank->eint_offset + irqd->hwirq);
+
+       pr_info("wake %s for irq %d\n", on ? "enabled" : "disabled", irqd->irq);
+
+       if (!on)
+               exynos_eint_wake_mask |= bit;
+       else
+               exynos_eint_wake_mask &= ~bit;
+
+       return 0;
+}
+
+/*
+ * irq_chip for wakeup interrupts
+ */
+static struct exynos_irq_chip exynos_wkup_irq_chip = {
+       .chip = {
+               .name = "exynos_wkup_irq_chip",
+               .irq_unmask = exynos_irq_unmask,
+               .irq_mask = exynos_irq_mask,
+               .irq_ack = exynos_irq_ack,
+               .irq_set_type = exynos_irq_set_type,
+               .irq_set_wake = exynos_wkup_irq_set_wake,
+       },
+       .eint_con = EXYNOS_WKUP_ECON_OFFSET,
+       .eint_mask = EXYNOS_WKUP_EMASK_OFFSET,
+       .eint_pend = EXYNOS_WKUP_EPEND_OFFSET,
+};
+
+/* interrupt handler for wakeup interrupts 0..15 */
+static void exynos_irq_eint0_15(unsigned int irq, struct irq_desc *desc)
+{
+       struct exynos_weint_data *eintd = irq_get_handler_data(irq);
+       struct samsung_pin_bank *bank = eintd->bank;
+       struct irq_chip *chip = irq_get_chip(irq);
+       int eint_irq;
+
+       chained_irq_enter(chip, desc);
+       chip->irq_mask(&desc->irq_data);
+
+       if (chip->irq_ack)
+               chip->irq_ack(&desc->irq_data);
+
+       eint_irq = irq_linear_revmap(bank->irq_domain, eintd->irq);
+       generic_handle_irq(eint_irq);
+       chip->irq_unmask(&desc->irq_data);
+       chained_irq_exit(chip, desc);
+}
+
+static inline void exynos_irq_demux_eint(unsigned long pend,
+                                               struct irq_domain *domain)
+{
+       unsigned int irq;
+
+       while (pend) {
+               irq = fls(pend) - 1;
+               generic_handle_irq(irq_find_mapping(domain, irq));
+               pend &= ~(1 << irq);
+       }
+}
+
+/* interrupt handler for wakeup interrupt 16 */
+static void exynos_irq_demux_eint16_31(unsigned int irq, struct irq_desc *desc)
+{
+       struct irq_chip *chip = irq_get_chip(irq);
+       struct exynos_muxed_weint_data *eintd = irq_get_handler_data(irq);
+       struct samsung_pinctrl_drv_data *d = eintd->banks[0]->drvdata;
+       unsigned long pend;
+       unsigned long mask;
+       int i;
+
+       chained_irq_enter(chip, desc);
+
+       for (i = 0; i < eintd->nr_banks; ++i) {
+               struct samsung_pin_bank *b = eintd->banks[i];
+               pend = readl(d->virt_base + EXYNOS_WKUP_EPEND_OFFSET
+                               + b->eint_offset);
+               mask = readl(d->virt_base + EXYNOS_WKUP_EMASK_OFFSET
+                               + b->eint_offset);
+               exynos_irq_demux_eint(pend & ~mask, b->irq_domain);
+       }
+
+       chained_irq_exit(chip, desc);
+}
+
+static int exynos_wkup_irq_map(struct irq_domain *h, unsigned int virq,
+                                       irq_hw_number_t hw)
+{
+       irq_set_chip_and_handler(virq, &exynos_wkup_irq_chip.chip,
+                                       handle_level_irq);
+       irq_set_chip_data(virq, h->host_data);
+       set_irq_flags(virq, IRQF_VALID);
+       return 0;
+}
+
+/*
+ * irq domain callbacks for external wakeup interrupt controller.
+ */
+static const struct irq_domain_ops exynos_wkup_irqd_ops = {
+       .map    = exynos_wkup_irq_map,
+       .xlate  = irq_domain_xlate_twocell,
+};
+
+/*
+ * exynos_eint_wkup_init() - setup handling of external wakeup interrupts.
+ * @d: driver data of samsung pinctrl driver.
+ */
+static int exynos_eint_wkup_init(struct samsung_pinctrl_drv_data *d)
+{
+       struct device *dev = d->dev;
+       struct device_node *wkup_np = NULL;
+       struct device_node *np;
+       struct samsung_pin_bank *bank;
+       struct exynos_weint_data *weint_data;
+       struct exynos_muxed_weint_data *muxed_data;
+       unsigned int muxed_banks = 0;
+       unsigned int i;
+       int idx, irq;
+
+       for_each_child_of_node(dev->of_node, np) {
+               if (of_match_node(exynos_wkup_irq_ids, np)) {
+                       wkup_np = np;
+                       break;
+               }
+       }
+       if (!wkup_np)
+               return -ENODEV;
+
+       bank = d->ctrl->pin_banks;
+       for (i = 0; i < d->ctrl->nr_banks; ++i, ++bank) {
+               if (bank->eint_type != EINT_TYPE_WKUP)
+                       continue;
+
+               bank->irq_domain = irq_domain_add_linear(bank->of_node,
+                               bank->nr_pins, &exynos_wkup_irqd_ops, bank);
+               if (!bank->irq_domain) {
+                       dev_err(dev, "wkup irq domain add failed\n");
+                       return -ENXIO;
+               }
+
+               if (!of_find_property(bank->of_node, "interrupts", NULL)) {
+                       bank->eint_type = EINT_TYPE_WKUP_MUX;
+                       ++muxed_banks;
+                       continue;
+               }
+
+               weint_data = devm_kzalloc(dev, bank->nr_pins
+                                       * sizeof(*weint_data), GFP_KERNEL);
+               if (!weint_data) {
+                       dev_err(dev, "could not allocate memory for weint_data\n");
+                       return -ENOMEM;
+               }
+
+               for (idx = 0; idx < bank->nr_pins; ++idx) {
+                       irq = irq_of_parse_and_map(bank->of_node, idx);
+                       if (!irq) {
+                               dev_err(dev, "irq number for eint-%s-%d not found\n",
+                                                       bank->name, idx);
+                               continue;
+                       }
+                       weint_data[idx].irq = idx;
+                       weint_data[idx].bank = bank;
+                       irq_set_handler_data(irq, &weint_data[idx]);
+                       irq_set_chained_handler(irq, exynos_irq_eint0_15);
+               }
+       }
+
+       if (!muxed_banks)
+               return 0;
+
+       irq = irq_of_parse_and_map(wkup_np, 0);
+       if (!irq) {
+               dev_err(dev, "irq number for muxed EINTs not found\n");
+               return 0;
+       }
+
+       muxed_data = devm_kzalloc(dev, sizeof(*muxed_data)
+               + muxed_banks*sizeof(struct samsung_pin_bank *), GFP_KERNEL);
+       if (!muxed_data) {
+               dev_err(dev, "could not allocate memory for muxed_data\n");
+               return -ENOMEM;
+       }
+
+       irq_set_chained_handler(irq, exynos_irq_demux_eint16_31);
+       irq_set_handler_data(irq, muxed_data);
+
+       bank = d->ctrl->pin_banks;
+       idx = 0;
+       for (i = 0; i < d->ctrl->nr_banks; ++i, ++bank) {
+               if (bank->eint_type != EINT_TYPE_WKUP_MUX)
+                       continue;
+
+               muxed_data->banks[idx++] = bank;
+       }
+       muxed_data->nr_banks = muxed_banks;
+
+       return 0;
+}
+
+static void exynos_pinctrl_suspend_bank(
+                               struct samsung_pinctrl_drv_data *drvdata,
+                               struct samsung_pin_bank *bank)
+{
+       struct exynos_eint_gpio_save *save = bank->soc_priv;
+       void __iomem *regs = drvdata->virt_base;
+
+       save->eint_con = readl(regs + EXYNOS_GPIO_ECON_OFFSET
+                                               + bank->eint_offset);
+       save->eint_fltcon0 = readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET
+                                               + 2 * bank->eint_offset);
+       save->eint_fltcon1 = readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET
+                                               + 2 * bank->eint_offset + 4);
+
+       pr_debug("%s: save     con %#010x\n", bank->name, save->eint_con);
+       pr_debug("%s: save fltcon0 %#010x\n", bank->name, save->eint_fltcon0);
+       pr_debug("%s: save fltcon1 %#010x\n", bank->name, save->eint_fltcon1);
+}
+
+static void exynos_pinctrl_suspend(struct samsung_pinctrl_drv_data *drvdata)
+{
+       struct samsung_pin_ctrl *ctrl = drvdata->ctrl;
+       struct samsung_pin_bank *bank = ctrl->pin_banks;
+       int i;
+
+       for (i = 0; i < ctrl->nr_banks; ++i, ++bank)
+               if (bank->eint_type == EINT_TYPE_GPIO)
+                       exynos_pinctrl_suspend_bank(drvdata, bank);
+}
+
+static void exynos_pinctrl_resume_bank(
+                               struct samsung_pinctrl_drv_data *drvdata,
+                               struct samsung_pin_bank *bank)
+{
+       struct exynos_eint_gpio_save *save = bank->soc_priv;
+       void __iomem *regs = drvdata->virt_base;
+
+       pr_debug("%s:     con %#010x => %#010x\n", bank->name,
+                       readl(regs + EXYNOS_GPIO_ECON_OFFSET
+                       + bank->eint_offset), save->eint_con);
+       pr_debug("%s: fltcon0 %#010x => %#010x\n", bank->name,
+                       readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET
+                       + 2 * bank->eint_offset), save->eint_fltcon0);
+       pr_debug("%s: fltcon1 %#010x => %#010x\n", bank->name,
+                       readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET
+                       + 2 * bank->eint_offset + 4), save->eint_fltcon1);
+
+       writel(save->eint_con, regs + EXYNOS_GPIO_ECON_OFFSET
+                                               + bank->eint_offset);
+       writel(save->eint_fltcon0, regs + EXYNOS_GPIO_EFLTCON_OFFSET
+                                               + 2 * bank->eint_offset);
+       writel(save->eint_fltcon1, regs + EXYNOS_GPIO_EFLTCON_OFFSET
+                                               + 2 * bank->eint_offset + 4);
+}
+
+static void exynos_pinctrl_resume(struct samsung_pinctrl_drv_data *drvdata)
+{
+       struct samsung_pin_ctrl *ctrl = drvdata->ctrl;
+       struct samsung_pin_bank *bank = ctrl->pin_banks;
+       int i;
+
+       for (i = 0; i < ctrl->nr_banks; ++i, ++bank)
+               if (bank->eint_type == EINT_TYPE_GPIO)
+                       exynos_pinctrl_resume_bank(drvdata, bank);
+}
+
+/* pin banks of s5pv210 pin-controller */
+static struct samsung_pin_bank s5pv210_pin_bank[] = {
+       EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
+       EXYNOS_PIN_BANK_EINTG(4, 0x020, "gpa1", 0x04),
+       EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpb", 0x08),
+       EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpc0", 0x0c),
+       EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpc1", 0x10),
+       EXYNOS_PIN_BANK_EINTG(4, 0x0a0, "gpd0", 0x14),
+       EXYNOS_PIN_BANK_EINTG(6, 0x0c0, "gpd1", 0x18),
+       EXYNOS_PIN_BANK_EINTG(8, 0x0e0, "gpe0", 0x1c),
+       EXYNOS_PIN_BANK_EINTG(5, 0x100, "gpe1", 0x20),
+       EXYNOS_PIN_BANK_EINTG(8, 0x120, "gpf0", 0x24),
+       EXYNOS_PIN_BANK_EINTG(8, 0x140, "gpf1", 0x28),
+       EXYNOS_PIN_BANK_EINTG(8, 0x160, "gpf2", 0x2c),
+       EXYNOS_PIN_BANK_EINTG(6, 0x180, "gpf3", 0x30),
+       EXYNOS_PIN_BANK_EINTG(7, 0x1a0, "gpg0", 0x34),
+       EXYNOS_PIN_BANK_EINTG(7, 0x1c0, "gpg1", 0x38),
+       EXYNOS_PIN_BANK_EINTG(7, 0x1e0, "gpg2", 0x3c),
+       EXYNOS_PIN_BANK_EINTG(7, 0x200, "gpg3", 0x40),
+       EXYNOS_PIN_BANK_EINTN(7, 0x220, "gpi"),
+       EXYNOS_PIN_BANK_EINTG(8, 0x240, "gpj0", 0x44),
+       EXYNOS_PIN_BANK_EINTG(6, 0x260, "gpj1", 0x48),
+       EXYNOS_PIN_BANK_EINTG(8, 0x280, "gpj2", 0x4c),
+       EXYNOS_PIN_BANK_EINTG(8, 0x2a0, "gpj3", 0x50),
+       EXYNOS_PIN_BANK_EINTG(5, 0x2c0, "gpj4", 0x54),
+       EXYNOS_PIN_BANK_EINTN(8, 0x2e0, "mp01"),
+       EXYNOS_PIN_BANK_EINTN(4, 0x300, "mp02"),
+       EXYNOS_PIN_BANK_EINTN(8, 0x320, "mp03"),
+       EXYNOS_PIN_BANK_EINTN(8, 0x340, "mp04"),
+       EXYNOS_PIN_BANK_EINTN(8, 0x360, "mp05"),
+       EXYNOS_PIN_BANK_EINTN(8, 0x380, "mp06"),
+       EXYNOS_PIN_BANK_EINTN(8, 0x3a0, "mp07"),
+       EXYNOS_PIN_BANK_EINTW(8, 0xc00, "gph0", 0x00),
+       EXYNOS_PIN_BANK_EINTW(8, 0xc20, "gph1", 0x04),
+       EXYNOS_PIN_BANK_EINTW(8, 0xc40, "gph2", 0x08),
+       EXYNOS_PIN_BANK_EINTW(8, 0xc60, "gph3", 0x0c),
+};
+
+struct samsung_pin_ctrl s5pv210_pin_ctrl[] = {
+       {
+               /* pin-controller instance 0 data */
+               .pin_banks      = s5pv210_pin_bank,
+               .nr_banks       = ARRAY_SIZE(s5pv210_pin_bank),
+               .eint_gpio_init = exynos_eint_gpio_init,
+               .eint_wkup_init = exynos_eint_wkup_init,
+               .suspend        = exynos_pinctrl_suspend,
+               .resume         = exynos_pinctrl_resume,
+               .label          = "s5pv210-gpio-ctrl0",
+       },
+};
+
+/* pin banks of exynos3250 pin-controller 0 */
+static struct samsung_pin_bank exynos3250_pin_banks0[] = {
+       EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
+       EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
+       EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpb",  0x08),
+       EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpc0", 0x0c),
+       EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpc1", 0x10),
+       EXYNOS_PIN_BANK_EINTG(4, 0x0a0, "gpd0", 0x14),
+       EXYNOS_PIN_BANK_EINTG(4, 0x0c0, "gpd1", 0x18),
+};
+
+/* pin banks of exynos3250 pin-controller 1 */
+static struct samsung_pin_bank exynos3250_pin_banks1[] = {
+       EXYNOS_PIN_BANK_EINTN(8, 0x120, "gpe0"),
+       EXYNOS_PIN_BANK_EINTN(8, 0x140, "gpe1"),
+       EXYNOS_PIN_BANK_EINTN(3, 0x180, "gpe2"),
+       EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpk0", 0x08),
+       EXYNOS_PIN_BANK_EINTG(7, 0x060, "gpk1", 0x0c),
+       EXYNOS_PIN_BANK_EINTG(7, 0x080, "gpk2", 0x10),
+       EXYNOS_PIN_BANK_EINTG(4, 0x0c0, "gpl0", 0x18),
+       EXYNOS_PIN_BANK_EINTG(8, 0x260, "gpm0", 0x24),
+       EXYNOS_PIN_BANK_EINTG(7, 0x280, "gpm1", 0x28),
+       EXYNOS_PIN_BANK_EINTG(5, 0x2a0, "gpm2", 0x2c),
+       EXYNOS_PIN_BANK_EINTG(8, 0x2c0, "gpm3", 0x30),
+       EXYNOS_PIN_BANK_EINTG(8, 0x2e0, "gpm4", 0x34),
+       EXYNOS_PIN_BANK_EINTW(8, 0xc00, "gpx0", 0x00),
+       EXYNOS_PIN_BANK_EINTW(8, 0xc20, "gpx1", 0x04),
+       EXYNOS_PIN_BANK_EINTW(8, 0xc40, "gpx2", 0x08),
+       EXYNOS_PIN_BANK_EINTW(8, 0xc60, "gpx3", 0x0c),
+};
+
+/*
+ * Samsung pinctrl driver data for Exynos3250 SoC. Exynos3250 SoC includes
+ * two gpio/pin-mux/pinconfig controllers.
+ */
+struct samsung_pin_ctrl exynos3250_pin_ctrl[] = {
+       {
+               /* pin-controller instance 0 data */
+               .pin_banks      = exynos3250_pin_banks0,
+               .nr_banks       = ARRAY_SIZE(exynos3250_pin_banks0),
+               .eint_gpio_init = exynos_eint_gpio_init,
+               .suspend        = exynos_pinctrl_suspend,
+               .resume         = exynos_pinctrl_resume,
+               .label          = "exynos3250-gpio-ctrl0",
+       }, {
+               /* pin-controller instance 1 data */
+               .pin_banks      = exynos3250_pin_banks1,
+               .nr_banks       = ARRAY_SIZE(exynos3250_pin_banks1),
+               .eint_gpio_init = exynos_eint_gpio_init,
+               .eint_wkup_init = exynos_eint_wkup_init,
+               .suspend        = exynos_pinctrl_suspend,
+               .resume         = exynos_pinctrl_resume,
+               .label          = "exynos3250-gpio-ctrl1",
+       },
+};
+
+/* pin banks of exynos4210 pin-controller 0 */
+static struct samsung_pin_bank exynos4210_pin_banks0[] = {
+       EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
+       EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
+       EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpb", 0x08),
+       EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpc0", 0x0c),
+       EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpc1", 0x10),
+       EXYNOS_PIN_BANK_EINTG(4, 0x0A0, "gpd0", 0x14),
+       EXYNOS_PIN_BANK_EINTG(4, 0x0C0, "gpd1", 0x18),
+       EXYNOS_PIN_BANK_EINTG(5, 0x0E0, "gpe0", 0x1c),
+       EXYNOS_PIN_BANK_EINTG(8, 0x100, "gpe1", 0x20),
+       EXYNOS_PIN_BANK_EINTG(6, 0x120, "gpe2", 0x24),
+       EXYNOS_PIN_BANK_EINTG(8, 0x140, "gpe3", 0x28),
+       EXYNOS_PIN_BANK_EINTG(8, 0x160, "gpe4", 0x2c),
+       EXYNOS_PIN_BANK_EINTG(8, 0x180, "gpf0", 0x30),
+       EXYNOS_PIN_BANK_EINTG(8, 0x1A0, "gpf1", 0x34),
+       EXYNOS_PIN_BANK_EINTG(8, 0x1C0, "gpf2", 0x38),
+       EXYNOS_PIN_BANK_EINTG(6, 0x1E0, "gpf3", 0x3c),
+};
+
+/* pin banks of exynos4210 pin-controller 1 */
+static struct samsung_pin_bank exynos4210_pin_banks1[] = {
+       EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpj0", 0x00),
+       EXYNOS_PIN_BANK_EINTG(5, 0x020, "gpj1", 0x04),
+       EXYNOS_PIN_BANK_EINTG(7, 0x040, "gpk0", 0x08),
+       EXYNOS_PIN_BANK_EINTG(7, 0x060, "gpk1", 0x0c),
+       EXYNOS_PIN_BANK_EINTG(7, 0x080, "gpk2", 0x10),
+       EXYNOS_PIN_BANK_EINTG(7, 0x0A0, "gpk3", 0x14),
+       EXYNOS_PIN_BANK_EINTG(8, 0x0C0, "gpl0", 0x18),
+       EXYNOS_PIN_BANK_EINTG(3, 0x0E0, "gpl1", 0x1c),
+       EXYNOS_PIN_BANK_EINTG(8, 0x100, "gpl2", 0x20),
+       EXYNOS_PIN_BANK_EINTN(6, 0x120, "gpy0"),
+       EXYNOS_PIN_BANK_EINTN(4, 0x140, "gpy1"),
+       EXYNOS_PIN_BANK_EINTN(6, 0x160, "gpy2"),
+       EXYNOS_PIN_BANK_EINTN(8, 0x180, "gpy3"),
+       EXYNOS_PIN_BANK_EINTN(8, 0x1A0, "gpy4"),
+       EXYNOS_PIN_BANK_EINTN(8, 0x1C0, "gpy5"),
+       EXYNOS_PIN_BANK_EINTN(8, 0x1E0, "gpy6"),
+       EXYNOS_PIN_BANK_EINTW(8, 0xC00, "gpx0", 0x00),
+       EXYNOS_PIN_BANK_EINTW(8, 0xC20, "gpx1", 0x04),
+       EXYNOS_PIN_BANK_EINTW(8, 0xC40, "gpx2", 0x08),
+       EXYNOS_PIN_BANK_EINTW(8, 0xC60, "gpx3", 0x0c),
+};
+
+/* pin banks of exynos4210 pin-controller 2 */
+static struct samsung_pin_bank exynos4210_pin_banks2[] = {
+       EXYNOS_PIN_BANK_EINTN(7, 0x000, "gpz"),
+};
+
+/*
+ * Samsung pinctrl driver data for Exynos4210 SoC. Exynos4210 SoC includes
+ * three gpio/pin-mux/pinconfig controllers.
+ */
+struct samsung_pin_ctrl exynos4210_pin_ctrl[] = {
+       {
+               /* pin-controller instance 0 data */
+               .pin_banks      = exynos4210_pin_banks0,
+               .nr_banks       = ARRAY_SIZE(exynos4210_pin_banks0),
+               .eint_gpio_init = exynos_eint_gpio_init,
+               .suspend        = exynos_pinctrl_suspend,
+               .resume         = exynos_pinctrl_resume,
+               .label          = "exynos4210-gpio-ctrl0",
+       }, {
+               /* pin-controller instance 1 data */
+               .pin_banks      = exynos4210_pin_banks1,
+               .nr_banks       = ARRAY_SIZE(exynos4210_pin_banks1),
+               .eint_gpio_init = exynos_eint_gpio_init,
+               .eint_wkup_init = exynos_eint_wkup_init,
+               .suspend        = exynos_pinctrl_suspend,
+               .resume         = exynos_pinctrl_resume,
+               .label          = "exynos4210-gpio-ctrl1",
+       }, {
+               /* pin-controller instance 2 data */
+               .pin_banks      = exynos4210_pin_banks2,
+               .nr_banks       = ARRAY_SIZE(exynos4210_pin_banks2),
+               .label          = "exynos4210-gpio-ctrl2",
+       },
+};
+
+/* pin banks of exynos4x12 pin-controller 0 */
+static struct samsung_pin_bank exynos4x12_pin_banks0[] = {
+       EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
+       EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
+       EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpb", 0x08),
+       EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpc0", 0x0c),
+       EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpc1", 0x10),
+       EXYNOS_PIN_BANK_EINTG(4, 0x0A0, "gpd0", 0x14),
+       EXYNOS_PIN_BANK_EINTG(4, 0x0C0, "gpd1", 0x18),
+       EXYNOS_PIN_BANK_EINTG(8, 0x180, "gpf0", 0x30),
+       EXYNOS_PIN_BANK_EINTG(8, 0x1A0, "gpf1", 0x34),
+       EXYNOS_PIN_BANK_EINTG(8, 0x1C0, "gpf2", 0x38),
+       EXYNOS_PIN_BANK_EINTG(6, 0x1E0, "gpf3", 0x3c),
+       EXYNOS_PIN_BANK_EINTG(8, 0x240, "gpj0", 0x40),
+       EXYNOS_PIN_BANK_EINTG(5, 0x260, "gpj1", 0x44),
+};
+
+/* pin banks of exynos4x12 pin-controller 1 */
+static struct samsung_pin_bank exynos4x12_pin_banks1[] = {
+       EXYNOS_PIN_BANK_EINTG(7, 0x040, "gpk0", 0x08),
+       EXYNOS_PIN_BANK_EINTG(7, 0x060, "gpk1", 0x0c),
+       EXYNOS_PIN_BANK_EINTG(7, 0x080, "gpk2", 0x10),
+       EXYNOS_PIN_BANK_EINTG(7, 0x0A0, "gpk3", 0x14),
+       EXYNOS_PIN_BANK_EINTG(7, 0x0C0, "gpl0", 0x18),
+       EXYNOS_PIN_BANK_EINTG(2, 0x0E0, "gpl1", 0x1c),
+       EXYNOS_PIN_BANK_EINTG(8, 0x100, "gpl2", 0x20),
+       EXYNOS_PIN_BANK_EINTG(8, 0x260, "gpm0", 0x24),
+       EXYNOS_PIN_BANK_EINTG(7, 0x280, "gpm1", 0x28),
+       EXYNOS_PIN_BANK_EINTG(5, 0x2A0, "gpm2", 0x2c),
+       EXYNOS_PIN_BANK_EINTG(8, 0x2C0, "gpm3", 0x30),
+       EXYNOS_PIN_BANK_EINTG(8, 0x2E0, "gpm4", 0x34),
+       EXYNOS_PIN_BANK_EINTN(6, 0x120, "gpy0"),
+       EXYNOS_PIN_BANK_EINTN(4, 0x140, "gpy1"),
+       EXYNOS_PIN_BANK_EINTN(6, 0x160, "gpy2"),
+       EXYNOS_PIN_BANK_EINTN(8, 0x180, "gpy3"),
+       EXYNOS_PIN_BANK_EINTN(8, 0x1A0, "gpy4"),
+       EXYNOS_PIN_BANK_EINTN(8, 0x1C0, "gpy5"),
+       EXYNOS_PIN_BANK_EINTN(8, 0x1E0, "gpy6"),
+       EXYNOS_PIN_BANK_EINTW(8, 0xC00, "gpx0", 0x00),
+       EXYNOS_PIN_BANK_EINTW(8, 0xC20, "gpx1", 0x04),
+       EXYNOS_PIN_BANK_EINTW(8, 0xC40, "gpx2", 0x08),
+       EXYNOS_PIN_BANK_EINTW(8, 0xC60, "gpx3", 0x0c),
+};
+
+/* pin banks of exynos4x12 pin-controller 2 */
+static struct samsung_pin_bank exynos4x12_pin_banks2[] = {
+       EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpz", 0x00),
+};
+
+/* pin banks of exynos4x12 pin-controller 3 */
+static struct samsung_pin_bank exynos4x12_pin_banks3[] = {
+       EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpv0", 0x00),
+       EXYNOS_PIN_BANK_EINTG(8, 0x020, "gpv1", 0x04),
+       EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpv2", 0x08),
+       EXYNOS_PIN_BANK_EINTG(8, 0x060, "gpv3", 0x0c),
+       EXYNOS_PIN_BANK_EINTG(2, 0x080, "gpv4", 0x10),
+};
+
+/*
+ * Samsung pinctrl driver data for Exynos4x12 SoC. Exynos4x12 SoC includes
+ * four gpio/pin-mux/pinconfig controllers.
+ */
+struct samsung_pin_ctrl exynos4x12_pin_ctrl[] = {
+       {
+               /* pin-controller instance 0 data */
+               .pin_banks      = exynos4x12_pin_banks0,
+               .nr_banks       = ARRAY_SIZE(exynos4x12_pin_banks0),
+               .eint_gpio_init = exynos_eint_gpio_init,
+               .suspend        = exynos_pinctrl_suspend,
+               .resume         = exynos_pinctrl_resume,
+               .label          = "exynos4x12-gpio-ctrl0",
+       }, {
+               /* pin-controller instance 1 data */
+               .pin_banks      = exynos4x12_pin_banks1,
+               .nr_banks       = ARRAY_SIZE(exynos4x12_pin_banks1),
+               .eint_gpio_init = exynos_eint_gpio_init,
+               .eint_wkup_init = exynos_eint_wkup_init,
+               .suspend        = exynos_pinctrl_suspend,
+               .resume         = exynos_pinctrl_resume,
+               .label          = "exynos4x12-gpio-ctrl1",
+       }, {
+               /* pin-controller instance 2 data */
+               .pin_banks      = exynos4x12_pin_banks2,
+               .nr_banks       = ARRAY_SIZE(exynos4x12_pin_banks2),
+               .eint_gpio_init = exynos_eint_gpio_init,
+               .suspend        = exynos_pinctrl_suspend,
+               .resume         = exynos_pinctrl_resume,
+               .label          = "exynos4x12-gpio-ctrl2",
+       }, {
+               /* pin-controller instance 3 data */
+               .pin_banks      = exynos4x12_pin_banks3,
+               .nr_banks       = ARRAY_SIZE(exynos4x12_pin_banks3),
+               .eint_gpio_init = exynos_eint_gpio_init,
+               .suspend        = exynos_pinctrl_suspend,
+               .resume         = exynos_pinctrl_resume,
+               .label          = "exynos4x12-gpio-ctrl3",
+       },
+};
+
+/* pin banks of exynos5250 pin-controller 0 */
+static struct samsung_pin_bank exynos5250_pin_banks0[] = {
+       EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
+       EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
+       EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpa2", 0x08),
+       EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpb0", 0x0c),
+       EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpb1", 0x10),
+       EXYNOS_PIN_BANK_EINTG(4, 0x0A0, "gpb2", 0x14),
+       EXYNOS_PIN_BANK_EINTG(4, 0x0C0, "gpb3", 0x18),
+       EXYNOS_PIN_BANK_EINTG(7, 0x0E0, "gpc0", 0x1c),
+       EXYNOS_PIN_BANK_EINTG(4, 0x100, "gpc1", 0x20),
+       EXYNOS_PIN_BANK_EINTG(7, 0x120, "gpc2", 0x24),
+       EXYNOS_PIN_BANK_EINTG(7, 0x140, "gpc3", 0x28),
+       EXYNOS_PIN_BANK_EINTG(4, 0x160, "gpd0", 0x2c),
+       EXYNOS_PIN_BANK_EINTG(8, 0x180, "gpd1", 0x30),
+       EXYNOS_PIN_BANK_EINTG(7, 0x2E0, "gpc4", 0x34),
+       EXYNOS_PIN_BANK_EINTN(6, 0x1A0, "gpy0"),
+       EXYNOS_PIN_BANK_EINTN(4, 0x1C0, "gpy1"),
+       EXYNOS_PIN_BANK_EINTN(6, 0x1E0, "gpy2"),
+       EXYNOS_PIN_BANK_EINTN(8, 0x200, "gpy3"),
+       EXYNOS_PIN_BANK_EINTN(8, 0x220, "gpy4"),
+       EXYNOS_PIN_BANK_EINTN(8, 0x240, "gpy5"),
+       EXYNOS_PIN_BANK_EINTN(8, 0x260, "gpy6"),
+       EXYNOS_PIN_BANK_EINTW(8, 0xC00, "gpx0", 0x00),
+       EXYNOS_PIN_BANK_EINTW(8, 0xC20, "gpx1", 0x04),
+       EXYNOS_PIN_BANK_EINTW(8, 0xC40, "gpx2", 0x08),
+       EXYNOS_PIN_BANK_EINTW(8, 0xC60, "gpx3", 0x0c),
+};
+
+/* pin banks of exynos5250 pin-controller 1 */
+static struct samsung_pin_bank exynos5250_pin_banks1[] = {
+       EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpe0", 0x00),
+       EXYNOS_PIN_BANK_EINTG(2, 0x020, "gpe1", 0x04),
+       EXYNOS_PIN_BANK_EINTG(4, 0x040, "gpf0", 0x08),
+       EXYNOS_PIN_BANK_EINTG(4, 0x060, "gpf1", 0x0c),
+       EXYNOS_PIN_BANK_EINTG(8, 0x080, "gpg0", 0x10),
+       EXYNOS_PIN_BANK_EINTG(8, 0x0A0, "gpg1", 0x14),
+       EXYNOS_PIN_BANK_EINTG(2, 0x0C0, "gpg2", 0x18),
+       EXYNOS_PIN_BANK_EINTG(4, 0x0E0, "gph0", 0x1c),
+       EXYNOS_PIN_BANK_EINTG(8, 0x100, "gph1", 0x20),
+};
+
+/* pin banks of exynos5250 pin-controller 2 */
+static struct samsung_pin_bank exynos5250_pin_banks2[] = {
+       EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpv0", 0x00),
+       EXYNOS_PIN_BANK_EINTG(8, 0x020, "gpv1", 0x04),
+       EXYNOS_PIN_BANK_EINTG(8, 0x060, "gpv2", 0x08),
+       EXYNOS_PIN_BANK_EINTG(8, 0x080, "gpv3", 0x0c),
+       EXYNOS_PIN_BANK_EINTG(2, 0x0C0, "gpv4", 0x10),
+};
+
+/* pin banks of exynos5250 pin-controller 3 */
+static struct samsung_pin_bank exynos5250_pin_banks3[] = {
+       EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpz", 0x00),
+};
+
+/*
+ * Samsung pinctrl driver data for Exynos5250 SoC. Exynos5250 SoC includes
+ * four gpio/pin-mux/pinconfig controllers.
+ */
+struct samsung_pin_ctrl exynos5250_pin_ctrl[] = {
+       {
+               /* pin-controller instance 0 data */
+               .pin_banks      = exynos5250_pin_banks0,
+               .nr_banks       = ARRAY_SIZE(exynos5250_pin_banks0),
+               .eint_gpio_init = exynos_eint_gpio_init,
+               .eint_wkup_init = exynos_eint_wkup_init,
+               .suspend        = exynos_pinctrl_suspend,
+               .resume         = exynos_pinctrl_resume,
+               .label          = "exynos5250-gpio-ctrl0",
+       }, {
+               /* pin-controller instance 1 data */
+               .pin_banks      = exynos5250_pin_banks1,
+               .nr_banks       = ARRAY_SIZE(exynos5250_pin_banks1),
+               .eint_gpio_init = exynos_eint_gpio_init,
+               .suspend        = exynos_pinctrl_suspend,
+               .resume         = exynos_pinctrl_resume,
+               .label          = "exynos5250-gpio-ctrl1",
+       }, {
+               /* pin-controller instance 2 data */
+               .pin_banks      = exynos5250_pin_banks2,
+               .nr_banks       = ARRAY_SIZE(exynos5250_pin_banks2),
+               .eint_gpio_init = exynos_eint_gpio_init,
+               .suspend        = exynos_pinctrl_suspend,
+               .resume         = exynos_pinctrl_resume,
+               .label          = "exynos5250-gpio-ctrl2",
+       }, {
+               /* pin-controller instance 3 data */
+               .pin_banks      = exynos5250_pin_banks3,
+               .nr_banks       = ARRAY_SIZE(exynos5250_pin_banks3),
+               .eint_gpio_init = exynos_eint_gpio_init,
+               .suspend        = exynos_pinctrl_suspend,
+               .resume         = exynos_pinctrl_resume,
+               .label          = "exynos5250-gpio-ctrl3",
+       },
+};
+
+/* pin banks of exynos5260 pin-controller 0 */
+static struct samsung_pin_bank exynos5260_pin_banks0[] = {
+       EXYNOS_PIN_BANK_EINTG(4, 0x000, "gpa0", 0x00),
+       EXYNOS_PIN_BANK_EINTG(7, 0x020, "gpa1", 0x04),
+       EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpa2", 0x08),
+       EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpb0", 0x0c),
+       EXYNOS_PIN_BANK_EINTG(4, 0x080, "gpb1", 0x10),
+       EXYNOS_PIN_BANK_EINTG(5, 0x0a0, "gpb2", 0x14),
+       EXYNOS_PIN_BANK_EINTG(8, 0x0c0, "gpb3", 0x18),
+       EXYNOS_PIN_BANK_EINTG(8, 0x0e0, "gpb4", 0x1c),
+       EXYNOS_PIN_BANK_EINTG(8, 0x100, "gpb5", 0x20),
+       EXYNOS_PIN_BANK_EINTG(8, 0x120, "gpd0", 0x24),
+       EXYNOS_PIN_BANK_EINTG(7, 0x140, "gpd1", 0x28),
+       EXYNOS_PIN_BANK_EINTG(5, 0x160, "gpd2", 0x2c),
+       EXYNOS_PIN_BANK_EINTG(8, 0x180, "gpe0", 0x30),
+       EXYNOS_PIN_BANK_EINTG(5, 0x1a0, "gpe1", 0x34),
+       EXYNOS_PIN_BANK_EINTG(4, 0x1c0, "gpf0", 0x38),
+       EXYNOS_PIN_BANK_EINTG(8, 0x1e0, "gpf1", 0x3c),
+       EXYNOS_PIN_BANK_EINTG(2, 0x200, "gpk0", 0x40),
+       EXYNOS_PIN_BANK_EINTW(8, 0xc00, "gpx0", 0x00),
+       EXYNOS_PIN_BANK_EINTW(8, 0xc20, "gpx1", 0x04),
+       EXYNOS_PIN_BANK_EINTW(8, 0xc40, "gpx2", 0x08),
+       EXYNOS_PIN_BANK_EINTW(8, 0xc60, "gpx3", 0x0c),
+};
+
+/* pin banks of exynos5260 pin-controller 1 */
+static struct samsung_pin_bank exynos5260_pin_banks1[] = {
+       EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpc0", 0x00),
+       EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpc1", 0x04),
+       EXYNOS_PIN_BANK_EINTG(7, 0x040, "gpc2", 0x08),
+       EXYNOS_PIN_BANK_EINTG(4, 0x060, "gpc3", 0x0c),
+       EXYNOS_PIN_BANK_EINTG(4, 0x080, "gpc4", 0x10),
+};
+
+/* pin banks of exynos5260 pin-controller 2 */
+static struct samsung_pin_bank exynos5260_pin_banks2[] = {
+       EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpz0", 0x00),
+       EXYNOS_PIN_BANK_EINTG(4, 0x020, "gpz1", 0x04),
+};
+
+/*
+ * Samsung pinctrl driver data for Exynos5260 SoC. Exynos5260 SoC includes
+ * three gpio/pin-mux/pinconfig controllers.
+ */
+struct samsung_pin_ctrl exynos5260_pin_ctrl[] = {
+       {
+               /* pin-controller instance 0 data */
+               .pin_banks      = exynos5260_pin_banks0,
+               .nr_banks       = ARRAY_SIZE(exynos5260_pin_banks0),
+               .eint_gpio_init = exynos_eint_gpio_init,
+               .eint_wkup_init = exynos_eint_wkup_init,
+               .label          = "exynos5260-gpio-ctrl0",
+       }, {
+               /* pin-controller instance 1 data */
+               .pin_banks      = exynos5260_pin_banks1,
+               .nr_banks       = ARRAY_SIZE(exynos5260_pin_banks1),
+               .eint_gpio_init = exynos_eint_gpio_init,
+               .label          = "exynos5260-gpio-ctrl1",
+       }, {
+               /* pin-controller instance 2 data */
+               .pin_banks      = exynos5260_pin_banks2,
+               .nr_banks       = ARRAY_SIZE(exynos5260_pin_banks2),
+               .eint_gpio_init = exynos_eint_gpio_init,
+               .label          = "exynos5260-gpio-ctrl2",
+       },
+};
+
+/* pin banks of exynos5420 pin-controller 0 */
+static struct samsung_pin_bank exynos5420_pin_banks0[] = {
+       EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpy7", 0x00),
+       EXYNOS_PIN_BANK_EINTW(8, 0xC00, "gpx0", 0x00),
+       EXYNOS_PIN_BANK_EINTW(8, 0xC20, "gpx1", 0x04),
+       EXYNOS_PIN_BANK_EINTW(8, 0xC40, "gpx2", 0x08),
+       EXYNOS_PIN_BANK_EINTW(8, 0xC60, "gpx3", 0x0c),
+};
+
+/* pin banks of exynos5420 pin-controller 1 */
+static struct samsung_pin_bank exynos5420_pin_banks1[] = {
+       EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpc0", 0x00),
+       EXYNOS_PIN_BANK_EINTG(8, 0x020, "gpc1", 0x04),
+       EXYNOS_PIN_BANK_EINTG(7, 0x040, "gpc2", 0x08),
+       EXYNOS_PIN_BANK_EINTG(4, 0x060, "gpc3", 0x0c),
+       EXYNOS_PIN_BANK_EINTG(2, 0x080, "gpc4", 0x10),
+       EXYNOS_PIN_BANK_EINTG(8, 0x0A0, "gpd1", 0x14),
+       EXYNOS_PIN_BANK_EINTN(6, 0x0C0, "gpy0"),
+       EXYNOS_PIN_BANK_EINTN(4, 0x0E0, "gpy1"),
+       EXYNOS_PIN_BANK_EINTN(6, 0x100, "gpy2"),
+       EXYNOS_PIN_BANK_EINTN(8, 0x120, "gpy3"),
+       EXYNOS_PIN_BANK_EINTN(8, 0x140, "gpy4"),
+       EXYNOS_PIN_BANK_EINTN(8, 0x160, "gpy5"),
+       EXYNOS_PIN_BANK_EINTN(8, 0x180, "gpy6"),
+};
+
+/* pin banks of exynos5420 pin-controller 2 */
+static struct samsung_pin_bank exynos5420_pin_banks2[] = {
+       EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpe0", 0x00),
+       EXYNOS_PIN_BANK_EINTG(2, 0x020, "gpe1", 0x04),
+       EXYNOS_PIN_BANK_EINTG(6, 0x040, "gpf0", 0x08),
+       EXYNOS_PIN_BANK_EINTG(8, 0x060, "gpf1", 0x0c),
+       EXYNOS_PIN_BANK_EINTG(8, 0x080, "gpg0", 0x10),
+       EXYNOS_PIN_BANK_EINTG(8, 0x0A0, "gpg1", 0x14),
+       EXYNOS_PIN_BANK_EINTG(2, 0x0C0, "gpg2", 0x18),
+       EXYNOS_PIN_BANK_EINTG(4, 0x0E0, "gpj4", 0x1c),
+};
+
+/* pin banks of exynos5420 pin-controller 3 */
+static struct samsung_pin_bank exynos5420_pin_banks3[] = {
+       EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
+       EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
+       EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpa2", 0x08),
+       EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpb0", 0x0c),
+       EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpb1", 0x10),
+       EXYNOS_PIN_BANK_EINTG(4, 0x0A0, "gpb2", 0x14),
+       EXYNOS_PIN_BANK_EINTG(8, 0x0C0, "gpb3", 0x18),
+       EXYNOS_PIN_BANK_EINTG(2, 0x0E0, "gpb4", 0x1c),
+       EXYNOS_PIN_BANK_EINTG(8, 0x100, "gph0", 0x20),
+};
+
+/* pin banks of exynos5420 pin-controller 4 */
+static struct samsung_pin_bank exynos5420_pin_banks4[] = {
+       EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpz", 0x00),
+};
+
+/*
+ * Samsung pinctrl driver data for Exynos5420 SoC. Exynos5420 SoC includes
+ * four gpio/pin-mux/pinconfig controllers.
+ */
+struct samsung_pin_ctrl exynos5420_pin_ctrl[] = {
+       {
+               /* pin-controller instance 0 data */
+               .pin_banks      = exynos5420_pin_banks0,
+               .nr_banks       = ARRAY_SIZE(exynos5420_pin_banks0),
+               .eint_gpio_init = exynos_eint_gpio_init,
+               .eint_wkup_init = exynos_eint_wkup_init,
+               .label          = "exynos5420-gpio-ctrl0",
+       }, {
+               /* pin-controller instance 1 data */
+               .pin_banks      = exynos5420_pin_banks1,
+               .nr_banks       = ARRAY_SIZE(exynos5420_pin_banks1),
+               .eint_gpio_init = exynos_eint_gpio_init,
+               .label          = "exynos5420-gpio-ctrl1",
+       }, {
+               /* pin-controller instance 2 data */
+               .pin_banks      = exynos5420_pin_banks2,
+               .nr_banks       = ARRAY_SIZE(exynos5420_pin_banks2),
+               .eint_gpio_init = exynos_eint_gpio_init,
+               .label          = "exynos5420-gpio-ctrl2",
+       }, {
+               /* pin-controller instance 3 data */
+               .pin_banks      = exynos5420_pin_banks3,
+               .nr_banks       = ARRAY_SIZE(exynos5420_pin_banks3),
+               .eint_gpio_init = exynos_eint_gpio_init,
+               .label          = "exynos5420-gpio-ctrl3",
+       }, {
+               /* pin-controller instance 4 data */
+               .pin_banks      = exynos5420_pin_banks4,
+               .nr_banks       = ARRAY_SIZE(exynos5420_pin_banks4),
+               .eint_gpio_init = exynos_eint_gpio_init,
+               .label          = "exynos5420-gpio-ctrl4",
+       },
+};
diff --git a/drivers/pinctrl/samsung/pinctrl-exynos.h b/drivers/pinctrl/samsung/pinctrl-exynos.h
new file mode 100644 (file)
index 0000000..3c91c35
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * Exynos specific definitions for Samsung pinctrl and gpiolib driver.
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd.
+ *             http://www.samsung.com
+ * Copyright (c) 2012 Linaro Ltd
+ *             http://www.linaro.org
+ *
+ * This file contains the Exynos specific definitions for the Samsung
+ * pinctrl/gpiolib interface drivers.
+ *
+ * Author: Thomas Abraham <thomas.ab@samsung.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+/* External GPIO and wakeup interrupt related definitions */
+#define EXYNOS_GPIO_ECON_OFFSET                0x700
+#define EXYNOS_GPIO_EFLTCON_OFFSET     0x800
+#define EXYNOS_GPIO_EMASK_OFFSET       0x900
+#define EXYNOS_GPIO_EPEND_OFFSET       0xA00
+#define EXYNOS_WKUP_ECON_OFFSET                0xE00
+#define EXYNOS_WKUP_EMASK_OFFSET       0xF00
+#define EXYNOS_WKUP_EPEND_OFFSET       0xF40
+#define EXYNOS_SVC_OFFSET              0xB08
+#define EXYNOS_EINT_FUNC               0xF
+
+/* helpers to access interrupt service register */
+#define EXYNOS_SVC_GROUP_SHIFT         3
+#define EXYNOS_SVC_GROUP_MASK          0x1f
+#define EXYNOS_SVC_NUM_MASK            7
+#define EXYNOS_SVC_GROUP(x)            ((x >> EXYNOS_SVC_GROUP_SHIFT) & \
+                                               EXYNOS_SVC_GROUP_MASK)
+
+/* Exynos specific external interrupt trigger types */
+#define EXYNOS_EINT_LEVEL_LOW          0
+#define EXYNOS_EINT_LEVEL_HIGH         1
+#define EXYNOS_EINT_EDGE_FALLING       2
+#define EXYNOS_EINT_EDGE_RISING                3
+#define EXYNOS_EINT_EDGE_BOTH          4
+#define EXYNOS_EINT_CON_MASK           0xF
+#define EXYNOS_EINT_CON_LEN            4
+
+#define EXYNOS_EINT_MAX_PER_BANK       8
+#define EXYNOS_EINT_NR_WKUP_EINT
+
+#define EXYNOS_PIN_BANK_EINTN(pins, reg, id)           \
+       {                                               \
+               .type           = &bank_type_off,       \
+               .pctl_offset    = reg,                  \
+               .nr_pins        = pins,                 \
+               .eint_type      = EINT_TYPE_NONE,       \
+               .name           = id                    \
+       }
+
+#define EXYNOS_PIN_BANK_EINTG(pins, reg, id, offs)     \
+       {                                               \
+               .type           = &bank_type_off,       \
+               .pctl_offset    = reg,                  \
+               .nr_pins        = pins,                 \
+               .eint_type      = EINT_TYPE_GPIO,       \
+               .eint_offset    = offs,                 \
+               .name           = id                    \
+       }
+
+#define EXYNOS_PIN_BANK_EINTW(pins, reg, id, offs)     \
+       {                                               \
+               .type           = &bank_type_alive,     \
+               .pctl_offset    = reg,                  \
+               .nr_pins        = pins,                 \
+               .eint_type      = EINT_TYPE_WKUP,       \
+               .eint_offset    = offs,                 \
+               .name           = id                    \
+       }
+
+/**
+ * struct exynos_weint_data: irq specific data for all the wakeup interrupts
+ * generated by the external wakeup interrupt controller.
+ * @irq: interrupt number within the domain.
+ * @bank: bank responsible for this interrupt
+ */
+struct exynos_weint_data {
+       unsigned int irq;
+       struct samsung_pin_bank *bank;
+};
+
+/**
+ * struct exynos_muxed_weint_data: irq specific data for muxed wakeup interrupts
+ * generated by the external wakeup interrupt controller.
+ * @nr_banks: count of banks being part of the mux
+ * @banks: array of banks being part of the mux
+ */
+struct exynos_muxed_weint_data {
+       unsigned int nr_banks;
+       struct samsung_pin_bank *banks[];
+};
diff --git a/drivers/pinctrl/samsung/pinctrl-exynos5440.c b/drivers/pinctrl/samsung/pinctrl-exynos5440.c
new file mode 100644 (file)
index 0000000..603da2f
--- /dev/null
@@ -0,0 +1,1061 @@
+/*
+ * pin-controller/pin-mux/pin-config/gpio-driver for Samsung's EXYNOS5440 SoC.
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd.
+ *             http://www.samsung.com
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/io.h>
+#include <linux/slab.h>
+#include <linux/err.h>
+#include <linux/gpio.h>
+#include <linux/device.h>
+#include <linux/pinctrl/pinctrl.h>
+#include <linux/pinctrl/pinmux.h>
+#include <linux/pinctrl/pinconf.h>
+#include <linux/interrupt.h>
+#include <linux/irqdomain.h>
+#include <linux/of_irq.h>
+#include "../core.h"
+
+/* EXYNOS5440 GPIO and Pinctrl register offsets */
+#define GPIO_MUX               0x00
+#define GPIO_IE                        0x04
+#define GPIO_INT               0x08
+#define GPIO_TYPE              0x0C
+#define GPIO_VAL               0x10
+#define GPIO_OE                        0x14
+#define GPIO_IN                        0x18
+#define GPIO_PE                        0x1C
+#define GPIO_PS                        0x20
+#define GPIO_SR                        0x24
+#define GPIO_DS0               0x28
+#define GPIO_DS1               0x2C
+
+#define EXYNOS5440_MAX_PINS            23
+#define EXYNOS5440_MAX_GPIO_INT        8
+#define PIN_NAME_LENGTH                10
+
+#define GROUP_SUFFIX           "-grp"
+#define GSUFFIX_LEN            sizeof(GROUP_SUFFIX)
+#define FUNCTION_SUFFIX                "-mux"
+#define FSUFFIX_LEN            sizeof(FUNCTION_SUFFIX)
+
+/*
+ * pin configuration type and its value are packed together into a 16-bits.
+ * The upper 8-bits represent the configuration type and the lower 8-bits
+ * hold the value of the configuration type.
+ */
+#define PINCFG_TYPE_MASK               0xFF
+#define PINCFG_VALUE_SHIFT             8
+#define PINCFG_VALUE_MASK              (0xFF << PINCFG_VALUE_SHIFT)
+#define PINCFG_PACK(type, value)       (((value) << PINCFG_VALUE_SHIFT) | type)
+#define PINCFG_UNPACK_TYPE(cfg)                ((cfg) & PINCFG_TYPE_MASK)
+#define PINCFG_UNPACK_VALUE(cfg)       (((cfg) & PINCFG_VALUE_MASK) >> \
+                                               PINCFG_VALUE_SHIFT)
+
+/**
+ * enum pincfg_type - possible pin configuration types supported.
+ * @PINCFG_TYPE_PUD: Pull up/down configuration.
+ * @PINCFG_TYPE_DRV: Drive strength configuration.
+ * @PINCFG_TYPE_SKEW_RATE: Skew rate configuration.
+ * @PINCFG_TYPE_INPUT_TYPE: Pin input type configuration.
+ */
+enum pincfg_type {
+       PINCFG_TYPE_PUD,
+       PINCFG_TYPE_DRV,
+       PINCFG_TYPE_SKEW_RATE,
+       PINCFG_TYPE_INPUT_TYPE
+};
+
+/**
+ * struct exynos5440_pin_group: represent group of pins for pincfg setting.
+ * @name: name of the pin group, used to lookup the group.
+ * @pins: the pins included in this group.
+ * @num_pins: number of pins included in this group.
+ */
+struct exynos5440_pin_group {
+       const char              *name;
+       const unsigned int      *pins;
+       u8                      num_pins;
+};
+
+/**
+ * struct exynos5440_pmx_func: represent a pin function.
+ * @name: name of the pin function, used to lookup the function.
+ * @groups: one or more names of pin groups that provide this function.
+ * @num_groups: number of groups included in @groups.
+ * @function: the function number to be programmed when selected.
+ */
+struct exynos5440_pmx_func {
+       const char              *name;
+       const char              **groups;
+       u8                      num_groups;
+       unsigned long           function;
+};
+
+/**
+ * struct exynos5440_pinctrl_priv_data: driver's private runtime data.
+ * @reg_base: ioremapped based address of the register space.
+ * @gc: gpio chip registered with gpiolib.
+ * @pin_groups: list of pin groups parsed from device tree.
+ * @nr_groups: number of pin groups available.
+ * @pmx_functions: list of pin functions parsed from device tree.
+ * @nr_functions: number of pin functions available.
+ */
+struct exynos5440_pinctrl_priv_data {
+       void __iomem                    *reg_base;
+       struct gpio_chip                *gc;
+       struct irq_domain               *irq_domain;
+
+       const struct exynos5440_pin_group       *pin_groups;
+       unsigned int                    nr_groups;
+       const struct exynos5440_pmx_func        *pmx_functions;
+       unsigned int                    nr_functions;
+};
+
+/**
+ * struct exynos5440_gpio_intr_data: private data for gpio interrupts.
+ * @priv: driver's private runtime data.
+ * @gpio_int: gpio interrupt number.
+ */
+struct exynos5440_gpio_intr_data {
+       struct exynos5440_pinctrl_priv_data     *priv;
+       unsigned int                            gpio_int;
+};
+
+/* list of all possible config options supported */
+static struct pin_config {
+       char            *prop_cfg;
+       unsigned int    cfg_type;
+} pcfgs[] = {
+       { "samsung,exynos5440-pin-pud", PINCFG_TYPE_PUD },
+       { "samsung,exynos5440-pin-drv", PINCFG_TYPE_DRV },
+       { "samsung,exynos5440-pin-skew-rate", PINCFG_TYPE_SKEW_RATE },
+       { "samsung,exynos5440-pin-input-type", PINCFG_TYPE_INPUT_TYPE },
+};
+
+/* check if the selector is a valid pin group selector */
+static int exynos5440_get_group_count(struct pinctrl_dev *pctldev)
+{
+       struct exynos5440_pinctrl_priv_data *priv;
+
+       priv = pinctrl_dev_get_drvdata(pctldev);
+       return priv->nr_groups;
+}
+
+/* return the name of the group selected by the group selector */
+static const char *exynos5440_get_group_name(struct pinctrl_dev *pctldev,
+                                               unsigned selector)
+{
+       struct exynos5440_pinctrl_priv_data *priv;
+
+       priv = pinctrl_dev_get_drvdata(pctldev);
+       return priv->pin_groups[selector].name;
+}
+
+/* return the pin numbers associated with the specified group */
+static int exynos5440_get_group_pins(struct pinctrl_dev *pctldev,
+               unsigned selector, const unsigned **pins, unsigned *num_pins)
+{
+       struct exynos5440_pinctrl_priv_data *priv;
+
+       priv = pinctrl_dev_get_drvdata(pctldev);
+       *pins = priv->pin_groups[selector].pins;
+       *num_pins = priv->pin_groups[selector].num_pins;
+       return 0;
+}
+
+/* create pinctrl_map entries by parsing device tree nodes */
+static int exynos5440_dt_node_to_map(struct pinctrl_dev *pctldev,
+                       struct device_node *np, struct pinctrl_map **maps,
+                       unsigned *nmaps)
+{
+       struct device *dev = pctldev->dev;
+       struct pinctrl_map *map;
+       unsigned long *cfg = NULL;
+       char *gname, *fname;
+       int cfg_cnt = 0, map_cnt = 0, idx = 0;
+
+       /* count the number of config options specfied in the node */
+       for (idx = 0; idx < ARRAY_SIZE(pcfgs); idx++)
+               if (of_find_property(np, pcfgs[idx].prop_cfg, NULL))
+                       cfg_cnt++;
+
+       /*
+        * Find out the number of map entries to create. All the config options
+        * can be accomadated into a single config map entry.
+        */
+       if (cfg_cnt)
+               map_cnt = 1;
+       if (of_find_property(np, "samsung,exynos5440-pin-function", NULL))
+               map_cnt++;
+       if (!map_cnt) {
+               dev_err(dev, "node %s does not have either config or function "
+                               "configurations\n", np->name);
+               return -EINVAL;
+       }
+
+       /* Allocate memory for pin-map entries */
+       map = kzalloc(sizeof(*map) * map_cnt, GFP_KERNEL);
+       if (!map) {
+               dev_err(dev, "could not alloc memory for pin-maps\n");
+               return -ENOMEM;
+       }
+       *nmaps = 0;
+
+       /*
+        * Allocate memory for pin group name. The pin group name is derived
+        * from the node name from which these map entries are be created.
+        */
+       gname = kzalloc(strlen(np->name) + GSUFFIX_LEN, GFP_KERNEL);
+       if (!gname) {
+               dev_err(dev, "failed to alloc memory for group name\n");
+               goto free_map;
+       }
+       snprintf(gname, strlen(np->name) + 4, "%s%s", np->name, GROUP_SUFFIX);
+
+       /*
+        * don't have config options? then skip over to creating function
+        * map entries.
+        */
+       if (!cfg_cnt)
+               goto skip_cfgs;
+
+       /* Allocate memory for config entries */
+       cfg = kzalloc(sizeof(*cfg) * cfg_cnt, GFP_KERNEL);
+       if (!cfg) {
+               dev_err(dev, "failed to alloc memory for configs\n");
+               goto free_gname;
+       }
+
+       /* Prepare a list of config settings */
+       for (idx = 0, cfg_cnt = 0; idx < ARRAY_SIZE(pcfgs); idx++) {
+               u32 value;
+               if (!of_property_read_u32(np, pcfgs[idx].prop_cfg, &value))
+                       cfg[cfg_cnt++] =
+                               PINCFG_PACK(pcfgs[idx].cfg_type, value);
+       }
+
+       /* create the config map entry */
+       map[*nmaps].data.configs.group_or_pin = gname;
+       map[*nmaps].data.configs.configs = cfg;
+       map[*nmaps].data.configs.num_configs = cfg_cnt;
+       map[*nmaps].type = PIN_MAP_TYPE_CONFIGS_GROUP;
+       *nmaps += 1;
+
+skip_cfgs:
+       /* create the function map entry */
+       if (of_find_property(np, "samsung,exynos5440-pin-function", NULL)) {
+               fname = kzalloc(strlen(np->name) + FSUFFIX_LEN, GFP_KERNEL);
+               if (!fname) {
+                       dev_err(dev, "failed to alloc memory for func name\n");
+                       goto free_cfg;
+               }
+               snprintf(fname, strlen(np->name) + 4, "%s%s", np->name,
+                        FUNCTION_SUFFIX);
+
+               map[*nmaps].data.mux.group = gname;
+               map[*nmaps].data.mux.function = fname;
+               map[*nmaps].type = PIN_MAP_TYPE_MUX_GROUP;
+               *nmaps += 1;
+       }
+
+       *maps = map;
+       return 0;
+
+free_cfg:
+       kfree(cfg);
+free_gname:
+       kfree(gname);
+free_map:
+       kfree(map);
+       return -ENOMEM;
+}
+
+/* free the memory allocated to hold the pin-map table */
+static void exynos5440_dt_free_map(struct pinctrl_dev *pctldev,
+                            struct pinctrl_map *map, unsigned num_maps)
+{
+       int idx;
+
+       for (idx = 0; idx < num_maps; idx++) {
+               if (map[idx].type == PIN_MAP_TYPE_MUX_GROUP) {
+                       kfree(map[idx].data.mux.function);
+                       if (!idx)
+                               kfree(map[idx].data.mux.group);
+               } else if (map->type == PIN_MAP_TYPE_CONFIGS_GROUP) {
+                       kfree(map[idx].data.configs.configs);
+                       if (!idx)
+                               kfree(map[idx].data.configs.group_or_pin);
+               }
+       };
+
+       kfree(map);
+}
+
+/* list of pinctrl callbacks for the pinctrl core */
+static const struct pinctrl_ops exynos5440_pctrl_ops = {
+       .get_groups_count       = exynos5440_get_group_count,
+       .get_group_name         = exynos5440_get_group_name,
+       .get_group_pins         = exynos5440_get_group_pins,
+       .dt_node_to_map         = exynos5440_dt_node_to_map,
+       .dt_free_map            = exynos5440_dt_free_map,
+};
+
+/* check if the selector is a valid pin function selector */
+static int exynos5440_get_functions_count(struct pinctrl_dev *pctldev)
+{
+       struct exynos5440_pinctrl_priv_data *priv;
+
+       priv = pinctrl_dev_get_drvdata(pctldev);
+       return priv->nr_functions;
+}
+
+/* return the name of the pin function specified */
+static const char *exynos5440_pinmux_get_fname(struct pinctrl_dev *pctldev,
+                                               unsigned selector)
+{
+       struct exynos5440_pinctrl_priv_data *priv;
+
+       priv = pinctrl_dev_get_drvdata(pctldev);
+       return priv->pmx_functions[selector].name;
+}
+
+/* return the groups associated for the specified function selector */
+static int exynos5440_pinmux_get_groups(struct pinctrl_dev *pctldev,
+               unsigned selector, const char * const **groups,
+               unsigned * const num_groups)
+{
+       struct exynos5440_pinctrl_priv_data *priv;
+
+       priv = pinctrl_dev_get_drvdata(pctldev);
+       *groups = priv->pmx_functions[selector].groups;
+       *num_groups = priv->pmx_functions[selector].num_groups;
+       return 0;
+}
+
+/* enable or disable a pinmux function */
+static void exynos5440_pinmux_setup(struct pinctrl_dev *pctldev, unsigned selector,
+                                       unsigned group, bool enable)
+{
+       struct exynos5440_pinctrl_priv_data *priv;
+       void __iomem *base;
+       u32 function;
+       u32 data;
+
+       priv = pinctrl_dev_get_drvdata(pctldev);
+       base = priv->reg_base;
+       function = priv->pmx_functions[selector].function;
+
+       data = readl(base + GPIO_MUX);
+       if (enable)
+               data |= (1 << function);
+       else
+               data &= ~(1 << function);
+       writel(data, base + GPIO_MUX);
+}
+
+/* enable a specified pinmux by writing to registers */
+static int exynos5440_pinmux_enable(struct pinctrl_dev *pctldev, unsigned selector,
+                                       unsigned group)
+{
+       exynos5440_pinmux_setup(pctldev, selector, group, true);
+       return 0;
+}
+
+/*
+ * The calls to gpio_direction_output() and gpio_direction_input()
+ * leads to this function call (via the pinctrl_gpio_direction_{input|output}()
+ * function called from the gpiolib interface).
+ */
+static int exynos5440_pinmux_gpio_set_direction(struct pinctrl_dev *pctldev,
+               struct pinctrl_gpio_range *range, unsigned offset, bool input)
+{
+       return 0;
+}
+
+/* list of pinmux callbacks for the pinmux vertical in pinctrl core */
+static const struct pinmux_ops exynos5440_pinmux_ops = {
+       .get_functions_count    = exynos5440_get_functions_count,
+       .get_function_name      = exynos5440_pinmux_get_fname,
+       .get_function_groups    = exynos5440_pinmux_get_groups,
+       .enable                 = exynos5440_pinmux_enable,
+       .gpio_set_direction     = exynos5440_pinmux_gpio_set_direction,
+};
+
+/* set the pin config settings for a specified pin */
+static int exynos5440_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
+                               unsigned long *configs,
+                               unsigned num_configs)
+{
+       struct exynos5440_pinctrl_priv_data *priv;
+       void __iomem *base;
+       enum pincfg_type cfg_type;
+       u32 cfg_value;
+       u32 data;
+       int i;
+
+       priv = pinctrl_dev_get_drvdata(pctldev);
+       base = priv->reg_base;
+
+       for (i = 0; i < num_configs; i++) {
+               cfg_type = PINCFG_UNPACK_TYPE(configs[i]);
+               cfg_value = PINCFG_UNPACK_VALUE(configs[i]);
+
+               switch (cfg_type) {
+               case PINCFG_TYPE_PUD:
+                       /* first set pull enable/disable bit */
+                       data = readl(base + GPIO_PE);
+                       data &= ~(1 << pin);
+                       if (cfg_value)
+                               data |= (1 << pin);
+                       writel(data, base + GPIO_PE);
+
+                       /* then set pull up/down bit */
+                       data = readl(base + GPIO_PS);
+                       data &= ~(1 << pin);
+                       if (cfg_value == 2)
+                               data |= (1 << pin);
+                       writel(data, base + GPIO_PS);
+                       break;
+
+               case PINCFG_TYPE_DRV:
+                       /* set the first bit of the drive strength */
+                       data = readl(base + GPIO_DS0);
+                       data &= ~(1 << pin);
+                       data |= ((cfg_value & 1) << pin);
+                       writel(data, base + GPIO_DS0);
+                       cfg_value >>= 1;
+
+                       /* set the second bit of the driver strength */
+                       data = readl(base + GPIO_DS1);
+                       data &= ~(1 << pin);
+                       data |= ((cfg_value & 1) << pin);
+                       writel(data, base + GPIO_DS1);
+                       break;
+               case PINCFG_TYPE_SKEW_RATE:
+                       data = readl(base + GPIO_SR);
+                       data &= ~(1 << pin);
+                       data |= ((cfg_value & 1) << pin);
+                       writel(data, base + GPIO_SR);
+                       break;
+               case PINCFG_TYPE_INPUT_TYPE:
+                       data = readl(base + GPIO_TYPE);
+                       data &= ~(1 << pin);
+                       data |= ((cfg_value & 1) << pin);
+                       writel(data, base + GPIO_TYPE);
+                       break;
+               default:
+                       WARN_ON(1);
+                       return -EINVAL;
+               }
+       } /* for each config */
+
+       return 0;
+}
+
+/* get the pin config settings for a specified pin */
+static int exynos5440_pinconf_get(struct pinctrl_dev *pctldev, unsigned int pin,
+                                       unsigned long *config)
+{
+       struct exynos5440_pinctrl_priv_data *priv;
+       void __iomem *base;
+       enum pincfg_type cfg_type = PINCFG_UNPACK_TYPE(*config);
+       u32 data;
+
+       priv = pinctrl_dev_get_drvdata(pctldev);
+       base = priv->reg_base;
+
+       switch (cfg_type) {
+       case PINCFG_TYPE_PUD:
+               data = readl(base + GPIO_PE);
+               data = (data >> pin) & 1;
+               if (!data)
+                       *config = 0;
+               else
+                       *config = ((readl(base + GPIO_PS) >> pin) & 1) + 1;
+               break;
+       case PINCFG_TYPE_DRV:
+               data = readl(base + GPIO_DS0);
+               data = (data >> pin) & 1;
+               *config = data;
+               data = readl(base + GPIO_DS1);
+               data = (data >> pin) & 1;
+               *config |= (data << 1);
+               break;
+       case PINCFG_TYPE_SKEW_RATE:
+               data = readl(base + GPIO_SR);
+               *config = (data >> pin) & 1;
+               break;
+       case PINCFG_TYPE_INPUT_TYPE:
+               data = readl(base + GPIO_TYPE);
+               *config = (data >> pin) & 1;
+               break;
+       default:
+               WARN_ON(1);
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+/* set the pin config settings for a specified pin group */
+static int exynos5440_pinconf_group_set(struct pinctrl_dev *pctldev,
+                       unsigned group, unsigned long *configs,
+                       unsigned num_configs)
+{
+       struct exynos5440_pinctrl_priv_data *priv;
+       const unsigned int *pins;
+       unsigned int cnt;
+
+       priv = pinctrl_dev_get_drvdata(pctldev);
+       pins = priv->pin_groups[group].pins;
+
+       for (cnt = 0; cnt < priv->pin_groups[group].num_pins; cnt++)
+               exynos5440_pinconf_set(pctldev, pins[cnt], configs,
+                                      num_configs);
+
+       return 0;
+}
+
+/* get the pin config settings for a specified pin group */
+static int exynos5440_pinconf_group_get(struct pinctrl_dev *pctldev,
+                               unsigned int group, unsigned long *config)
+{
+       struct exynos5440_pinctrl_priv_data *priv;
+       const unsigned int *pins;
+
+       priv = pinctrl_dev_get_drvdata(pctldev);
+       pins = priv->pin_groups[group].pins;
+       exynos5440_pinconf_get(pctldev, pins[0], config);
+       return 0;
+}
+
+/* list of pinconfig callbacks for pinconfig vertical in the pinctrl code */
+static const struct pinconf_ops exynos5440_pinconf_ops = {
+       .pin_config_get         = exynos5440_pinconf_get,
+       .pin_config_set         = exynos5440_pinconf_set,
+       .pin_config_group_get   = exynos5440_pinconf_group_get,
+       .pin_config_group_set   = exynos5440_pinconf_group_set,
+};
+
+/* gpiolib gpio_set callback function */
+static void exynos5440_gpio_set(struct gpio_chip *gc, unsigned offset, int value)
+{
+       struct exynos5440_pinctrl_priv_data *priv = dev_get_drvdata(gc->dev);
+       void __iomem *base = priv->reg_base;
+       u32 data;
+
+       data = readl(base + GPIO_VAL);
+       data &= ~(1 << offset);
+       if (value)
+               data |= 1 << offset;
+       writel(data, base + GPIO_VAL);
+}
+
+/* gpiolib gpio_get callback function */
+static int exynos5440_gpio_get(struct gpio_chip *gc, unsigned offset)
+{
+       struct exynos5440_pinctrl_priv_data *priv = dev_get_drvdata(gc->dev);
+       void __iomem *base = priv->reg_base;
+       u32 data;
+
+       data = readl(base + GPIO_IN);
+       data >>= offset;
+       data &= 1;
+       return data;
+}
+
+/* gpiolib gpio_direction_input callback function */
+static int exynos5440_gpio_direction_input(struct gpio_chip *gc, unsigned offset)
+{
+       struct exynos5440_pinctrl_priv_data *priv = dev_get_drvdata(gc->dev);
+       void __iomem *base = priv->reg_base;
+       u32 data;
+
+       /* first disable the data output enable on this pin */
+       data = readl(base + GPIO_OE);
+       data &= ~(1 << offset);
+       writel(data, base + GPIO_OE);
+
+       /* now enable input on this pin */
+       data =  readl(base + GPIO_IE);
+       data |= 1 << offset;
+       writel(data, base + GPIO_IE);
+       return 0;
+}
+
+/* gpiolib gpio_direction_output callback function */
+static int exynos5440_gpio_direction_output(struct gpio_chip *gc, unsigned offset,
+                                                       int value)
+{
+       struct exynos5440_pinctrl_priv_data *priv = dev_get_drvdata(gc->dev);
+       void __iomem *base = priv->reg_base;
+       u32 data;
+
+       exynos5440_gpio_set(gc, offset, value);
+
+       /* first disable the data input enable on this pin */
+       data = readl(base + GPIO_IE);
+       data &= ~(1 << offset);
+       writel(data, base + GPIO_IE);
+
+       /* now enable output on this pin */
+       data =  readl(base + GPIO_OE);
+       data |= 1 << offset;
+       writel(data, base + GPIO_OE);
+       return 0;
+}
+
+/* gpiolib gpio_to_irq callback function */
+static int exynos5440_gpio_to_irq(struct gpio_chip *gc, unsigned offset)
+{
+       struct exynos5440_pinctrl_priv_data *priv = dev_get_drvdata(gc->dev);
+       unsigned int virq;
+
+       if (offset < 16 || offset > 23)
+               return -ENXIO;
+
+       if (!priv->irq_domain)
+               return -ENXIO;
+
+       virq = irq_create_mapping(priv->irq_domain, offset - 16);
+       return virq ? : -ENXIO;
+}
+
+/* parse the pin numbers listed in the 'samsung,exynos5440-pins' property */
+static int exynos5440_pinctrl_parse_dt_pins(struct platform_device *pdev,
+                       struct device_node *cfg_np, unsigned int **pin_list,
+                       unsigned int *npins)
+{
+       struct device *dev = &pdev->dev;
+       struct property *prop;
+
+       prop = of_find_property(cfg_np, "samsung,exynos5440-pins", NULL);
+       if (!prop)
+               return -ENOENT;
+
+       *npins = prop->length / sizeof(unsigned long);
+       if (!*npins) {
+               dev_err(dev, "invalid pin list in %s node", cfg_np->name);
+               return -EINVAL;
+       }
+
+       *pin_list = devm_kzalloc(dev, *npins * sizeof(**pin_list), GFP_KERNEL);
+       if (!*pin_list) {
+               dev_err(dev, "failed to allocate memory for pin list\n");
+               return -ENOMEM;
+       }
+
+       return of_property_read_u32_array(cfg_np, "samsung,exynos5440-pins",
+                       *pin_list, *npins);
+}
+
+/*
+ * Parse the information about all the available pin groups and pin functions
+ * from device node of the pin-controller.
+ */
+static int exynos5440_pinctrl_parse_dt(struct platform_device *pdev,
+                               struct exynos5440_pinctrl_priv_data *priv)
+{
+       struct device *dev = &pdev->dev;
+       struct device_node *dev_np = dev->of_node;
+       struct device_node *cfg_np;
+       struct exynos5440_pin_group *groups, *grp;
+       struct exynos5440_pmx_func *functions, *func;
+       unsigned *pin_list;
+       unsigned int npins, grp_cnt, func_idx = 0;
+       char *gname, *fname;
+       int ret;
+
+       grp_cnt = of_get_child_count(dev_np);
+       if (!grp_cnt)
+               return -EINVAL;
+
+       groups = devm_kzalloc(dev, grp_cnt * sizeof(*groups), GFP_KERNEL);
+       if (!groups) {
+               dev_err(dev, "failed allocate memory for ping group list\n");
+               return -EINVAL;
+       }
+       grp = groups;
+
+       functions = devm_kzalloc(dev, grp_cnt * sizeof(*functions), GFP_KERNEL);
+       if (!functions) {
+               dev_err(dev, "failed to allocate memory for function list\n");
+               return -EINVAL;
+       }
+       func = functions;
+
+       /*
+        * Iterate over all the child nodes of the pin controller node
+        * and create pin groups and pin function lists.
+        */
+       for_each_child_of_node(dev_np, cfg_np) {
+               u32 function;
+
+               ret = exynos5440_pinctrl_parse_dt_pins(pdev, cfg_np,
+                                       &pin_list, &npins);
+               if (ret) {
+                       gname = NULL;
+                       goto skip_to_pin_function;
+               }
+
+               /* derive pin group name from the node name */
+               gname = devm_kzalloc(dev, strlen(cfg_np->name) + GSUFFIX_LEN,
+                                       GFP_KERNEL);
+               if (!gname) {
+                       dev_err(dev, "failed to alloc memory for group name\n");
+                       return -ENOMEM;
+               }
+               snprintf(gname, strlen(cfg_np->name) + 4, "%s%s", cfg_np->name,
+                        GROUP_SUFFIX);
+
+               grp->name = gname;
+               grp->pins = pin_list;
+               grp->num_pins = npins;
+               grp++;
+
+skip_to_pin_function:
+               ret = of_property_read_u32(cfg_np, "samsung,exynos5440-pin-function",
+                                               &function);
+               if (ret)
+                       continue;
+
+               /* derive function name from the node name */
+               fname = devm_kzalloc(dev, strlen(cfg_np->name) + FSUFFIX_LEN,
+                                       GFP_KERNEL);
+               if (!fname) {
+                       dev_err(dev, "failed to alloc memory for func name\n");
+                       return -ENOMEM;
+               }
+               snprintf(fname, strlen(cfg_np->name) + 4, "%s%s", cfg_np->name,
+                        FUNCTION_SUFFIX);
+
+               func->name = fname;
+               func->groups = devm_kzalloc(dev, sizeof(char *), GFP_KERNEL);
+               if (!func->groups) {
+                       dev_err(dev, "failed to alloc memory for group list "
+                                       "in pin function");
+                       return -ENOMEM;
+               }
+               func->groups[0] = gname;
+               func->num_groups = gname ? 1 : 0;
+               func->function = function;
+               func++;
+               func_idx++;
+       }
+
+       priv->pin_groups = groups;
+       priv->nr_groups = grp_cnt;
+       priv->pmx_functions = functions;
+       priv->nr_functions = func_idx;
+       return 0;
+}
+
+/* register the pinctrl interface with the pinctrl subsystem */
+static int exynos5440_pinctrl_register(struct platform_device *pdev,
+                               struct exynos5440_pinctrl_priv_data *priv)
+{
+       struct device *dev = &pdev->dev;
+       struct pinctrl_desc *ctrldesc;
+       struct pinctrl_dev *pctl_dev;
+       struct pinctrl_pin_desc *pindesc, *pdesc;
+       struct pinctrl_gpio_range grange;
+       char *pin_names;
+       int pin, ret;
+
+       ctrldesc = devm_kzalloc(dev, sizeof(*ctrldesc), GFP_KERNEL);
+       if (!ctrldesc) {
+               dev_err(dev, "could not allocate memory for pinctrl desc\n");
+               return -ENOMEM;
+       }
+
+       ctrldesc->name = "exynos5440-pinctrl";
+       ctrldesc->owner = THIS_MODULE;
+       ctrldesc->pctlops = &exynos5440_pctrl_ops;
+       ctrldesc->pmxops = &exynos5440_pinmux_ops;
+       ctrldesc->confops = &exynos5440_pinconf_ops;
+
+       pindesc = devm_kzalloc(&pdev->dev, sizeof(*pindesc) *
+                               EXYNOS5440_MAX_PINS, GFP_KERNEL);
+       if (!pindesc) {
+               dev_err(&pdev->dev, "mem alloc for pin descriptors failed\n");
+               return -ENOMEM;
+       }
+       ctrldesc->pins = pindesc;
+       ctrldesc->npins = EXYNOS5440_MAX_PINS;
+
+       /* dynamically populate the pin number and pin name for pindesc */
+       for (pin = 0, pdesc = pindesc; pin < ctrldesc->npins; pin++, pdesc++)
+               pdesc->number = pin;
+
+       /*
+        * allocate space for storing the dynamically generated names for all
+        * the pins which belong to this pin-controller.
+        */
+       pin_names = devm_kzalloc(&pdev->dev, sizeof(char) * PIN_NAME_LENGTH *
+                                       ctrldesc->npins, GFP_KERNEL);
+       if (!pin_names) {
+               dev_err(&pdev->dev, "mem alloc for pin names failed\n");
+               return -ENOMEM;
+       }
+
+       /* for each pin, set the name of the pin */
+       for (pin = 0; pin < ctrldesc->npins; pin++) {
+               snprintf(pin_names, 6, "gpio%02d", pin);
+               pdesc = pindesc + pin;
+               pdesc->name = pin_names;
+               pin_names += PIN_NAME_LENGTH;
+       }
+
+       ret = exynos5440_pinctrl_parse_dt(pdev, priv);
+       if (ret)
+               return ret;
+
+       pctl_dev = pinctrl_register(ctrldesc, &pdev->dev, priv);
+       if (!pctl_dev) {
+               dev_err(&pdev->dev, "could not register pinctrl driver\n");
+               return -EINVAL;
+       }
+
+       grange.name = "exynos5440-pctrl-gpio-range";
+       grange.id = 0;
+       grange.base = 0;
+       grange.npins = EXYNOS5440_MAX_PINS;
+       grange.gc = priv->gc;
+       pinctrl_add_gpio_range(pctl_dev, &grange);
+       return 0;
+}
+
+/* register the gpiolib interface with the gpiolib subsystem */
+static int exynos5440_gpiolib_register(struct platform_device *pdev,
+                               struct exynos5440_pinctrl_priv_data *priv)
+{
+       struct gpio_chip *gc;
+       int ret;
+
+       gc = devm_kzalloc(&pdev->dev, sizeof(*gc), GFP_KERNEL);
+       if (!gc) {
+               dev_err(&pdev->dev, "mem alloc for gpio_chip failed\n");
+               return -ENOMEM;
+       }
+
+       priv->gc = gc;
+       gc->base = 0;
+       gc->ngpio = EXYNOS5440_MAX_PINS;
+       gc->dev = &pdev->dev;
+       gc->set = exynos5440_gpio_set;
+       gc->get = exynos5440_gpio_get;
+       gc->direction_input = exynos5440_gpio_direction_input;
+       gc->direction_output = exynos5440_gpio_direction_output;
+       gc->to_irq = exynos5440_gpio_to_irq;
+       gc->label = "gpiolib-exynos5440";
+       gc->owner = THIS_MODULE;
+       ret = gpiochip_add(gc);
+       if (ret) {
+               dev_err(&pdev->dev, "failed to register gpio_chip %s, error "
+                                       "code: %d\n", gc->label, ret);
+               return ret;
+       }
+
+       return 0;
+}
+
+/* unregister the gpiolib interface with the gpiolib subsystem */
+static int exynos5440_gpiolib_unregister(struct platform_device *pdev,
+                               struct exynos5440_pinctrl_priv_data *priv)
+{
+       int ret = gpiochip_remove(priv->gc);
+       if (ret) {
+               dev_err(&pdev->dev, "gpio chip remove failed\n");
+               return ret;
+       }
+       return 0;
+}
+
+static void exynos5440_gpio_irq_unmask(struct irq_data *irqd)
+{
+       struct exynos5440_pinctrl_priv_data *d;
+       unsigned long gpio_int;
+
+       d = irq_data_get_irq_chip_data(irqd);
+       gpio_int = readl(d->reg_base + GPIO_INT);
+       gpio_int |= 1 << irqd->hwirq;
+       writel(gpio_int, d->reg_base + GPIO_INT);
+}
+
+static void exynos5440_gpio_irq_mask(struct irq_data *irqd)
+{
+       struct exynos5440_pinctrl_priv_data *d;
+       unsigned long gpio_int;
+
+       d = irq_data_get_irq_chip_data(irqd);
+       gpio_int = readl(d->reg_base + GPIO_INT);
+       gpio_int &= ~(1 << irqd->hwirq);
+       writel(gpio_int, d->reg_base + GPIO_INT);
+}
+
+/* irq_chip for gpio interrupts */
+static struct irq_chip exynos5440_gpio_irq_chip = {
+       .name           = "exynos5440_gpio_irq_chip",
+       .irq_unmask     = exynos5440_gpio_irq_unmask,
+       .irq_mask       = exynos5440_gpio_irq_mask,
+};
+
+/* interrupt handler for GPIO interrupts 0..7 */
+static irqreturn_t exynos5440_gpio_irq(int irq, void *data)
+{
+       struct exynos5440_gpio_intr_data *intd = data;
+       struct exynos5440_pinctrl_priv_data *d = intd->priv;
+       int virq;
+
+       virq = irq_linear_revmap(d->irq_domain, intd->gpio_int);
+       if (!virq)
+               return IRQ_NONE;
+       generic_handle_irq(virq);
+       return IRQ_HANDLED;
+}
+
+static int exynos5440_gpio_irq_map(struct irq_domain *h, unsigned int virq,
+                                       irq_hw_number_t hw)
+{
+       struct exynos5440_pinctrl_priv_data *d = h->host_data;
+
+       irq_set_chip_data(virq, d);
+       irq_set_chip_and_handler(virq, &exynos5440_gpio_irq_chip,
+                                       handle_level_irq);
+       set_irq_flags(virq, IRQF_VALID);
+       return 0;
+}
+
+/* irq domain callbacks for gpio interrupt controller */
+static const struct irq_domain_ops exynos5440_gpio_irqd_ops = {
+       .map    = exynos5440_gpio_irq_map,
+       .xlate  = irq_domain_xlate_twocell,
+};
+
+/* setup handling of gpio interrupts */
+static int exynos5440_gpio_irq_init(struct platform_device *pdev,
+                               struct exynos5440_pinctrl_priv_data *priv)
+{
+       struct device *dev = &pdev->dev;
+       struct exynos5440_gpio_intr_data *intd;
+       int i, irq, ret;
+
+       intd = devm_kzalloc(dev, sizeof(*intd) * EXYNOS5440_MAX_GPIO_INT,
+                                       GFP_KERNEL);
+       if (!intd) {
+               dev_err(dev, "failed to allocate memory for gpio intr data\n");
+               return -ENOMEM;
+       }
+
+       for (i = 0; i < EXYNOS5440_MAX_GPIO_INT; i++) {
+               irq = irq_of_parse_and_map(dev->of_node, i);
+               if (irq <= 0) {
+                       dev_err(dev, "irq parsing failed\n");
+                       return -EINVAL;
+               }
+
+               intd->gpio_int = i;
+               intd->priv = priv;
+               ret = devm_request_irq(dev, irq, exynos5440_gpio_irq,
+                                       0, dev_name(dev), intd++);
+               if (ret) {
+                       dev_err(dev, "irq request failed\n");
+                       return -ENXIO;
+               }
+       }
+
+       priv->irq_domain = irq_domain_add_linear(dev->of_node,
+                               EXYNOS5440_MAX_GPIO_INT,
+                               &exynos5440_gpio_irqd_ops, priv);
+       if (!priv->irq_domain) {
+               dev_err(dev, "failed to create irq domain\n");
+               return -ENXIO;
+       }
+
+       return 0;
+}
+
+static int exynos5440_pinctrl_probe(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct exynos5440_pinctrl_priv_data *priv;
+       struct resource *res;
+       int ret;
+
+       if (!dev->of_node) {
+               dev_err(dev, "device tree node not found\n");
+               return -ENODEV;
+       }
+
+       priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
+       if (!priv) {
+               dev_err(dev, "could not allocate memory for private data\n");
+               return -ENOMEM;
+       }
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       priv->reg_base = devm_ioremap_resource(&pdev->dev, res);
+       if (IS_ERR(priv->reg_base))
+               return PTR_ERR(priv->reg_base);
+
+       ret = exynos5440_gpiolib_register(pdev, priv);
+       if (ret)
+               return ret;
+
+       ret = exynos5440_pinctrl_register(pdev, priv);
+       if (ret) {
+               exynos5440_gpiolib_unregister(pdev, priv);
+               return ret;
+       }
+
+       ret = exynos5440_gpio_irq_init(pdev, priv);
+       if (ret) {
+               dev_err(dev, "failed to setup gpio interrupts\n");
+               return ret;
+       }
+
+       platform_set_drvdata(pdev, priv);
+       dev_info(dev, "EXYNOS5440 pinctrl driver registered\n");
+       return 0;
+}
+
+static const struct of_device_id exynos5440_pinctrl_dt_match[] = {
+       { .compatible = "samsung,exynos5440-pinctrl" },
+       {},
+};
+MODULE_DEVICE_TABLE(of, exynos5440_pinctrl_dt_match);
+
+static struct platform_driver exynos5440_pinctrl_driver = {
+       .probe          = exynos5440_pinctrl_probe,
+       .driver = {
+               .name   = "exynos5440-pinctrl",
+               .owner  = THIS_MODULE,
+               .of_match_table = exynos5440_pinctrl_dt_match,
+       },
+};
+
+static int __init exynos5440_pinctrl_drv_register(void)
+{
+       return platform_driver_register(&exynos5440_pinctrl_driver);
+}
+postcore_initcall(exynos5440_pinctrl_drv_register);
+
+static void __exit exynos5440_pinctrl_drv_unregister(void)
+{
+       platform_driver_unregister(&exynos5440_pinctrl_driver);
+}
+module_exit(exynos5440_pinctrl_drv_unregister);
+
+MODULE_AUTHOR("Thomas Abraham <thomas.ab@samsung.com>");
+MODULE_DESCRIPTION("Samsung EXYNOS5440 SoC pinctrl driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/pinctrl/samsung/pinctrl-s3c24xx.c b/drivers/pinctrl/samsung/pinctrl-s3c24xx.c
new file mode 100644 (file)
index 0000000..ad3eaad
--- /dev/null
@@ -0,0 +1,651 @@
+/*
+ * S3C24XX specific support for Samsung pinctrl/gpiolib driver.
+ *
+ * Copyright (c) 2013 Heiko Stuebner <heiko@sntech.de>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This file contains the SamsungS3C24XX specific information required by the
+ * Samsung pinctrl/gpiolib driver. It also includes the implementation of
+ * external gpio and wakeup interrupt support.
+ */
+
+#include <linux/module.h>
+#include <linux/device.h>
+#include <linux/interrupt.h>
+#include <linux/irqdomain.h>
+#include <linux/irq.h>
+#include <linux/of_irq.h>
+#include <linux/irqchip/chained_irq.h>
+#include <linux/io.h>
+#include <linux/slab.h>
+#include <linux/err.h>
+
+#include "pinctrl-samsung.h"
+
+#define NUM_EINT       24
+#define NUM_EINT_IRQ   6
+#define EINT_MAX_PER_GROUP     8
+
+#define EINTPEND_REG   0xa8
+#define EINTMASK_REG   0xa4
+
+#define EINT_GROUP(i)          ((int)((i) / EINT_MAX_PER_GROUP))
+#define EINT_REG(i)            ((EINT_GROUP(i) * 4) + 0x88)
+#define EINT_OFFS(i)           ((i) % EINT_MAX_PER_GROUP * 4)
+
+#define EINT_LEVEL_LOW         0
+#define EINT_LEVEL_HIGH                1
+#define EINT_EDGE_FALLING      2
+#define EINT_EDGE_RISING       4
+#define EINT_EDGE_BOTH         6
+#define EINT_MASK              0xf
+
+static struct samsung_pin_bank_type bank_type_1bit = {
+       .fld_width = { 1, 1, },
+       .reg_offset = { 0x00, 0x04, },
+};
+
+static struct samsung_pin_bank_type bank_type_2bit = {
+       .fld_width = { 2, 1, 2, },
+       .reg_offset = { 0x00, 0x04, 0x08, },
+};
+
+#define PIN_BANK_A(pins, reg, id)              \
+       {                                               \
+               .type           = &bank_type_1bit,      \
+               .pctl_offset    = reg,                  \
+               .nr_pins        = pins,                 \
+               .eint_type      = EINT_TYPE_NONE,       \
+               .name           = id                    \
+       }
+
+#define PIN_BANK_2BIT(pins, reg, id)           \
+       {                                               \
+               .type           = &bank_type_2bit,      \
+               .pctl_offset    = reg,                  \
+               .nr_pins        = pins,                 \
+               .eint_type      = EINT_TYPE_NONE,       \
+               .name           = id                    \
+       }
+
+#define PIN_BANK_2BIT_EINTW(pins, reg, id, eoffs, emask)\
+       {                                               \
+               .type           = &bank_type_2bit,      \
+               .pctl_offset    = reg,                  \
+               .nr_pins        = pins,                 \
+               .eint_type      = EINT_TYPE_WKUP,       \
+               .eint_func      = 2,                    \
+               .eint_mask      = emask,                \
+               .eint_offset    = eoffs,                \
+               .name           = id                    \
+       }
+
+/**
+ * struct s3c24xx_eint_data: EINT common data
+ * @drvdata: pin controller driver data
+ * @domains: IRQ domains of particular EINT interrupts
+ * @parents: mapped parent irqs in the main interrupt controller
+ */
+struct s3c24xx_eint_data {
+       struct samsung_pinctrl_drv_data *drvdata;
+       struct irq_domain *domains[NUM_EINT];
+       int parents[NUM_EINT_IRQ];
+};
+
+/**
+ * struct s3c24xx_eint_domain_data: per irq-domain data
+ * @bank: pin bank related to the domain
+ * @eint_data: common data
+ * eint0_3_parent_only: live eints 0-3 only in the main intc
+ */
+struct s3c24xx_eint_domain_data {
+       struct samsung_pin_bank *bank;
+       struct s3c24xx_eint_data *eint_data;
+       bool eint0_3_parent_only;
+};
+
+static int s3c24xx_eint_get_trigger(unsigned int type)
+{
+       switch (type) {
+       case IRQ_TYPE_EDGE_RISING:
+               return EINT_EDGE_RISING;
+               break;
+       case IRQ_TYPE_EDGE_FALLING:
+               return EINT_EDGE_FALLING;
+               break;
+       case IRQ_TYPE_EDGE_BOTH:
+               return EINT_EDGE_BOTH;
+               break;
+       case IRQ_TYPE_LEVEL_HIGH:
+               return EINT_LEVEL_HIGH;
+               break;
+       case IRQ_TYPE_LEVEL_LOW:
+               return EINT_LEVEL_LOW;
+               break;
+       default:
+               return -EINVAL;
+       }
+}
+
+static void s3c24xx_eint_set_handler(unsigned int irq, unsigned int type)
+{
+       /* Edge- and level-triggered interrupts need different handlers */
+       if (type & IRQ_TYPE_EDGE_BOTH)
+               __irq_set_handler_locked(irq, handle_edge_irq);
+       else
+               __irq_set_handler_locked(irq, handle_level_irq);
+}
+
+static void s3c24xx_eint_set_function(struct samsung_pinctrl_drv_data *d,
+                                       struct samsung_pin_bank *bank, int pin)
+{
+       struct samsung_pin_bank_type *bank_type = bank->type;
+       unsigned long flags;
+       void __iomem *reg;
+       u8 shift;
+       u32 mask;
+       u32 val;
+
+       /* Make sure that pin is configured as interrupt */
+       reg = d->virt_base + bank->pctl_offset;
+       shift = pin * bank_type->fld_width[PINCFG_TYPE_FUNC];
+       mask = (1 << bank_type->fld_width[PINCFG_TYPE_FUNC]) - 1;
+
+       spin_lock_irqsave(&bank->slock, flags);
+
+       val = readl(reg);
+       val &= ~(mask << shift);
+       val |= bank->eint_func << shift;
+       writel(val, reg);
+
+       spin_unlock_irqrestore(&bank->slock, flags);
+}
+
+static int s3c24xx_eint_type(struct irq_data *data, unsigned int type)
+{
+       struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(data);
+       struct samsung_pinctrl_drv_data *d = bank->drvdata;
+       int index = bank->eint_offset + data->hwirq;
+       void __iomem *reg;
+       int trigger;
+       u8 shift;
+       u32 val;
+
+       trigger = s3c24xx_eint_get_trigger(type);
+       if (trigger < 0) {
+               dev_err(d->dev, "unsupported external interrupt type\n");
+               return -EINVAL;
+       }
+
+       s3c24xx_eint_set_handler(data->irq, type);
+
+       /* Set up interrupt trigger */
+       reg = d->virt_base + EINT_REG(index);
+       shift = EINT_OFFS(index);
+
+       val = readl(reg);
+       val &= ~(EINT_MASK << shift);
+       val |= trigger << shift;
+       writel(val, reg);
+
+       s3c24xx_eint_set_function(d, bank, data->hwirq);
+
+       return 0;
+}
+
+/* Handling of EINTs 0-3 on all except S3C2412 and S3C2413 */
+
+static void s3c2410_eint0_3_ack(struct irq_data *data)
+{
+       struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(data);
+       struct s3c24xx_eint_domain_data *ddata = bank->irq_domain->host_data;
+       struct s3c24xx_eint_data *eint_data = ddata->eint_data;
+       int parent_irq = eint_data->parents[data->hwirq];
+       struct irq_chip *parent_chip = irq_get_chip(parent_irq);
+
+       parent_chip->irq_ack(irq_get_irq_data(parent_irq));
+}
+
+static void s3c2410_eint0_3_mask(struct irq_data *data)
+{
+       struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(data);
+       struct s3c24xx_eint_domain_data *ddata = bank->irq_domain->host_data;
+       struct s3c24xx_eint_data *eint_data = ddata->eint_data;
+       int parent_irq = eint_data->parents[data->hwirq];
+       struct irq_chip *parent_chip = irq_get_chip(parent_irq);
+
+       parent_chip->irq_mask(irq_get_irq_data(parent_irq));
+}
+
+static void s3c2410_eint0_3_unmask(struct irq_data *data)
+{
+       struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(data);
+       struct s3c24xx_eint_domain_data *ddata = bank->irq_domain->host_data;
+       struct s3c24xx_eint_data *eint_data = ddata->eint_data;
+       int parent_irq = eint_data->parents[data->hwirq];
+       struct irq_chip *parent_chip = irq_get_chip(parent_irq);
+
+       parent_chip->irq_unmask(irq_get_irq_data(parent_irq));
+}
+
+static struct irq_chip s3c2410_eint0_3_chip = {
+       .name           = "s3c2410-eint0_3",
+       .irq_ack        = s3c2410_eint0_3_ack,
+       .irq_mask       = s3c2410_eint0_3_mask,
+       .irq_unmask     = s3c2410_eint0_3_unmask,
+       .irq_set_type   = s3c24xx_eint_type,
+};
+
+static void s3c2410_demux_eint0_3(unsigned int irq, struct irq_desc *desc)
+{
+       struct irq_data *data = irq_desc_get_irq_data(desc);
+       struct s3c24xx_eint_data *eint_data = irq_get_handler_data(irq);
+       unsigned int virq;
+
+       /* the first 4 eints have a simple 1 to 1 mapping */
+       virq = irq_linear_revmap(eint_data->domains[data->hwirq], data->hwirq);
+       /* Something must be really wrong if an unmapped EINT is unmasked */
+       BUG_ON(!virq);
+
+       generic_handle_irq(virq);
+}
+
+/* Handling of EINTs 0-3 on S3C2412 and S3C2413 */
+
+static void s3c2412_eint0_3_ack(struct irq_data *data)
+{
+       struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(data);
+       struct samsung_pinctrl_drv_data *d = bank->drvdata;
+
+       unsigned long bitval = 1UL << data->hwirq;
+       writel(bitval, d->virt_base + EINTPEND_REG);
+}
+
+static void s3c2412_eint0_3_mask(struct irq_data *data)
+{
+       struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(data);
+       struct samsung_pinctrl_drv_data *d = bank->drvdata;
+       unsigned long mask;
+
+       mask = readl(d->virt_base + EINTMASK_REG);
+       mask |= (1UL << data->hwirq);
+       writel(mask, d->virt_base + EINTMASK_REG);
+}
+
+static void s3c2412_eint0_3_unmask(struct irq_data *data)
+{
+       struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(data);
+       struct samsung_pinctrl_drv_data *d = bank->drvdata;
+       unsigned long mask;
+
+       mask = readl(d->virt_base + EINTMASK_REG);
+       mask &= ~(1UL << data->hwirq);
+       writel(mask, d->virt_base + EINTMASK_REG);
+}
+
+static struct irq_chip s3c2412_eint0_3_chip = {
+       .name           = "s3c2412-eint0_3",
+       .irq_ack        = s3c2412_eint0_3_ack,
+       .irq_mask       = s3c2412_eint0_3_mask,
+       .irq_unmask     = s3c2412_eint0_3_unmask,
+       .irq_set_type   = s3c24xx_eint_type,
+};
+
+static void s3c2412_demux_eint0_3(unsigned int irq, struct irq_desc *desc)
+{
+       struct irq_chip *chip = irq_get_chip(irq);
+       struct irq_data *data = irq_desc_get_irq_data(desc);
+       struct s3c24xx_eint_data *eint_data = irq_get_handler_data(irq);
+       unsigned int virq;
+
+       chained_irq_enter(chip, desc);
+
+       /* the first 4 eints have a simple 1 to 1 mapping */
+       virq = irq_linear_revmap(eint_data->domains[data->hwirq], data->hwirq);
+       /* Something must be really wrong if an unmapped EINT is unmasked */
+       BUG_ON(!virq);
+
+       generic_handle_irq(virq);
+
+       chained_irq_exit(chip, desc);
+}
+
+/* Handling of all other eints */
+
+static void s3c24xx_eint_ack(struct irq_data *data)
+{
+       struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(data);
+       struct samsung_pinctrl_drv_data *d = bank->drvdata;
+       unsigned char index = bank->eint_offset + data->hwirq;
+
+       writel(1UL << index, d->virt_base + EINTPEND_REG);
+}
+
+static void s3c24xx_eint_mask(struct irq_data *data)
+{
+       struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(data);
+       struct samsung_pinctrl_drv_data *d = bank->drvdata;
+       unsigned char index = bank->eint_offset + data->hwirq;
+       unsigned long mask;
+
+       mask = readl(d->virt_base + EINTMASK_REG);
+       mask |= (1UL << index);
+       writel(mask, d->virt_base + EINTMASK_REG);
+}
+
+static void s3c24xx_eint_unmask(struct irq_data *data)
+{
+       struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(data);
+       struct samsung_pinctrl_drv_data *d = bank->drvdata;
+       unsigned char index = bank->eint_offset + data->hwirq;
+       unsigned long mask;
+
+       mask = readl(d->virt_base + EINTMASK_REG);
+       mask &= ~(1UL << index);
+       writel(mask, d->virt_base + EINTMASK_REG);
+}
+
+static struct irq_chip s3c24xx_eint_chip = {
+       .name           = "s3c-eint",
+       .irq_ack        = s3c24xx_eint_ack,
+       .irq_mask       = s3c24xx_eint_mask,
+       .irq_unmask     = s3c24xx_eint_unmask,
+       .irq_set_type   = s3c24xx_eint_type,
+};
+
+static inline void s3c24xx_demux_eint(unsigned int irq, struct irq_desc *desc,
+                                     u32 offset, u32 range)
+{
+       struct irq_chip *chip = irq_get_chip(irq);
+       struct s3c24xx_eint_data *data = irq_get_handler_data(irq);
+       struct samsung_pinctrl_drv_data *d = data->drvdata;
+       unsigned int pend, mask;
+
+       chained_irq_enter(chip, desc);
+
+       pend = readl(d->virt_base + EINTPEND_REG);
+       mask = readl(d->virt_base + EINTMASK_REG);
+
+       pend &= ~mask;
+       pend &= range;
+
+       while (pend) {
+               unsigned int virq;
+
+               irq = __ffs(pend);
+               pend &= ~(1 << irq);
+               virq = irq_linear_revmap(data->domains[irq], irq - offset);
+               /* Something is really wrong if an unmapped EINT is unmasked */
+               BUG_ON(!virq);
+
+               generic_handle_irq(virq);
+       }
+
+       chained_irq_exit(chip, desc);
+}
+
+static void s3c24xx_demux_eint4_7(unsigned int irq, struct irq_desc *desc)
+{
+       s3c24xx_demux_eint(irq, desc, 0, 0xf0);
+}
+
+static void s3c24xx_demux_eint8_23(unsigned int irq, struct irq_desc *desc)
+{
+       s3c24xx_demux_eint(irq, desc, 8, 0xffff00);
+}
+
+static irq_flow_handler_t s3c2410_eint_handlers[NUM_EINT_IRQ] = {
+       s3c2410_demux_eint0_3,
+       s3c2410_demux_eint0_3,
+       s3c2410_demux_eint0_3,
+       s3c2410_demux_eint0_3,
+       s3c24xx_demux_eint4_7,
+       s3c24xx_demux_eint8_23,
+};
+
+static irq_flow_handler_t s3c2412_eint_handlers[NUM_EINT_IRQ] = {
+       s3c2412_demux_eint0_3,
+       s3c2412_demux_eint0_3,
+       s3c2412_demux_eint0_3,
+       s3c2412_demux_eint0_3,
+       s3c24xx_demux_eint4_7,
+       s3c24xx_demux_eint8_23,
+};
+
+static int s3c24xx_gpf_irq_map(struct irq_domain *h, unsigned int virq,
+                                       irq_hw_number_t hw)
+{
+       struct s3c24xx_eint_domain_data *ddata = h->host_data;
+       struct samsung_pin_bank *bank = ddata->bank;
+
+       if (!(bank->eint_mask & (1 << (bank->eint_offset + hw))))
+               return -EINVAL;
+
+       if (hw <= 3) {
+               if (ddata->eint0_3_parent_only)
+                       irq_set_chip_and_handler(virq, &s3c2410_eint0_3_chip,
+                                                handle_edge_irq);
+               else
+                       irq_set_chip_and_handler(virq, &s3c2412_eint0_3_chip,
+                                                handle_edge_irq);
+       } else {
+               irq_set_chip_and_handler(virq, &s3c24xx_eint_chip,
+                                        handle_edge_irq);
+       }
+       irq_set_chip_data(virq, bank);
+       set_irq_flags(virq, IRQF_VALID);
+       return 0;
+}
+
+static const struct irq_domain_ops s3c24xx_gpf_irq_ops = {
+       .map    = s3c24xx_gpf_irq_map,
+       .xlate  = irq_domain_xlate_twocell,
+};
+
+static int s3c24xx_gpg_irq_map(struct irq_domain *h, unsigned int virq,
+                                       irq_hw_number_t hw)
+{
+       struct s3c24xx_eint_domain_data *ddata = h->host_data;
+       struct samsung_pin_bank *bank = ddata->bank;
+
+       if (!(bank->eint_mask & (1 << (bank->eint_offset + hw))))
+               return -EINVAL;
+
+       irq_set_chip_and_handler(virq, &s3c24xx_eint_chip, handle_edge_irq);
+       irq_set_chip_data(virq, bank);
+       set_irq_flags(virq, IRQF_VALID);
+       return 0;
+}
+
+static const struct irq_domain_ops s3c24xx_gpg_irq_ops = {
+       .map    = s3c24xx_gpg_irq_map,
+       .xlate  = irq_domain_xlate_twocell,
+};
+
+static const struct of_device_id s3c24xx_eint_irq_ids[] = {
+       { .compatible = "samsung,s3c2410-wakeup-eint", .data = (void *)1 },
+       { .compatible = "samsung,s3c2412-wakeup-eint", .data = (void *)0 },
+       { }
+};
+
+static int s3c24xx_eint_init(struct samsung_pinctrl_drv_data *d)
+{
+       struct device *dev = d->dev;
+       const struct of_device_id *match;
+       struct device_node *eint_np = NULL;
+       struct device_node *np;
+       struct samsung_pin_bank *bank;
+       struct s3c24xx_eint_data *eint_data;
+       const struct irq_domain_ops *ops;
+       unsigned int i;
+       bool eint0_3_parent_only;
+       irq_flow_handler_t *handlers;
+
+       for_each_child_of_node(dev->of_node, np) {
+               match = of_match_node(s3c24xx_eint_irq_ids, np);
+               if (match) {
+                       eint_np = np;
+                       eint0_3_parent_only = (bool)match->data;
+                       break;
+               }
+       }
+       if (!eint_np)
+               return -ENODEV;
+
+       eint_data = devm_kzalloc(dev, sizeof(*eint_data), GFP_KERNEL);
+       if (!eint_data)
+               return -ENOMEM;
+
+       eint_data->drvdata = d;
+
+       handlers = eint0_3_parent_only ? s3c2410_eint_handlers
+                                      : s3c2412_eint_handlers;
+       for (i = 0; i < NUM_EINT_IRQ; ++i) {
+               unsigned int irq;
+
+               irq = irq_of_parse_and_map(eint_np, i);
+               if (!irq) {
+                       dev_err(dev, "failed to get wakeup EINT IRQ %d\n", i);
+                       return -ENXIO;
+               }
+
+               eint_data->parents[i] = irq;
+               irq_set_chained_handler(irq, handlers[i]);
+               irq_set_handler_data(irq, eint_data);
+       }
+
+       bank = d->ctrl->pin_banks;
+       for (i = 0; i < d->ctrl->nr_banks; ++i, ++bank) {
+               struct s3c24xx_eint_domain_data *ddata;
+               unsigned int mask;
+               unsigned int irq;
+               unsigned int pin;
+
+               if (bank->eint_type != EINT_TYPE_WKUP)
+                       continue;
+
+               ddata = devm_kzalloc(dev, sizeof(*ddata), GFP_KERNEL);
+               if (!ddata)
+                       return -ENOMEM;
+
+               ddata->bank = bank;
+               ddata->eint_data = eint_data;
+               ddata->eint0_3_parent_only = eint0_3_parent_only;
+
+               ops = (bank->eint_offset == 0) ? &s3c24xx_gpf_irq_ops
+                                              : &s3c24xx_gpg_irq_ops;
+
+               bank->irq_domain = irq_domain_add_linear(bank->of_node,
+                               bank->nr_pins, ops, ddata);
+               if (!bank->irq_domain) {
+                       dev_err(dev, "wkup irq domain add failed\n");
+                       return -ENXIO;
+               }
+
+               irq = bank->eint_offset;
+               mask = bank->eint_mask;
+               for (pin = 0; mask; ++pin, mask >>= 1) {
+                       if (irq >= NUM_EINT)
+                               break;
+                       if (!(mask & 1))
+                               continue;
+                       eint_data->domains[irq] = bank->irq_domain;
+                       ++irq;
+               }
+       }
+
+       return 0;
+}
+
+static struct samsung_pin_bank s3c2412_pin_banks[] = {
+       PIN_BANK_A(23, 0x000, "gpa"),
+       PIN_BANK_2BIT(11, 0x010, "gpb"),
+       PIN_BANK_2BIT(16, 0x020, "gpc"),
+       PIN_BANK_2BIT(16, 0x030, "gpd"),
+       PIN_BANK_2BIT(16, 0x040, "gpe"),
+       PIN_BANK_2BIT_EINTW(8, 0x050, "gpf", 0, 0xff),
+       PIN_BANK_2BIT_EINTW(16, 0x060, "gpg", 8, 0xffff00),
+       PIN_BANK_2BIT(11, 0x070, "gph"),
+       PIN_BANK_2BIT(13, 0x080, "gpj"),
+};
+
+struct samsung_pin_ctrl s3c2412_pin_ctrl[] = {
+       {
+               .pin_banks      = s3c2412_pin_banks,
+               .nr_banks       = ARRAY_SIZE(s3c2412_pin_banks),
+               .eint_wkup_init = s3c24xx_eint_init,
+               .label          = "S3C2412-GPIO",
+       },
+};
+
+static struct samsung_pin_bank s3c2416_pin_banks[] = {
+       PIN_BANK_A(27, 0x000, "gpa"),
+       PIN_BANK_2BIT(11, 0x010, "gpb"),
+       PIN_BANK_2BIT(16, 0x020, "gpc"),
+       PIN_BANK_2BIT(16, 0x030, "gpd"),
+       PIN_BANK_2BIT(16, 0x040, "gpe"),
+       PIN_BANK_2BIT_EINTW(8, 0x050, "gpf", 0, 0xff),
+       PIN_BANK_2BIT_EINTW(8, 0x060, "gpg", 8, 0xff00),
+       PIN_BANK_2BIT(15, 0x070, "gph"),
+       PIN_BANK_2BIT(16, 0x0e0, "gpk"),
+       PIN_BANK_2BIT(14, 0x0f0, "gpl"),
+       PIN_BANK_2BIT(2, 0x100, "gpm"),
+};
+
+struct samsung_pin_ctrl s3c2416_pin_ctrl[] = {
+       {
+               .pin_banks      = s3c2416_pin_banks,
+               .nr_banks       = ARRAY_SIZE(s3c2416_pin_banks),
+               .eint_wkup_init = s3c24xx_eint_init,
+               .label          = "S3C2416-GPIO",
+       },
+};
+
+static struct samsung_pin_bank s3c2440_pin_banks[] = {
+       PIN_BANK_A(25, 0x000, "gpa"),
+       PIN_BANK_2BIT(11, 0x010, "gpb"),
+       PIN_BANK_2BIT(16, 0x020, "gpc"),
+       PIN_BANK_2BIT(16, 0x030, "gpd"),
+       PIN_BANK_2BIT(16, 0x040, "gpe"),
+       PIN_BANK_2BIT_EINTW(8, 0x050, "gpf", 0, 0xff),
+       PIN_BANK_2BIT_EINTW(16, 0x060, "gpg", 8, 0xffff00),
+       PIN_BANK_2BIT(11, 0x070, "gph"),
+       PIN_BANK_2BIT(13, 0x0d0, "gpj"),
+};
+
+struct samsung_pin_ctrl s3c2440_pin_ctrl[] = {
+       {
+               .pin_banks      = s3c2440_pin_banks,
+               .nr_banks       = ARRAY_SIZE(s3c2440_pin_banks),
+               .eint_wkup_init = s3c24xx_eint_init,
+               .label          = "S3C2440-GPIO",
+       },
+};
+
+static struct samsung_pin_bank s3c2450_pin_banks[] = {
+       PIN_BANK_A(28, 0x000, "gpa"),
+       PIN_BANK_2BIT(11, 0x010, "gpb"),
+       PIN_BANK_2BIT(16, 0x020, "gpc"),
+       PIN_BANK_2BIT(16, 0x030, "gpd"),
+       PIN_BANK_2BIT(16, 0x040, "gpe"),
+       PIN_BANK_2BIT_EINTW(8, 0x050, "gpf", 0, 0xff),
+       PIN_BANK_2BIT_EINTW(16, 0x060, "gpg", 8, 0xffff00),
+       PIN_BANK_2BIT(15, 0x070, "gph"),
+       PIN_BANK_2BIT(16, 0x0d0, "gpj"),
+       PIN_BANK_2BIT(16, 0x0e0, "gpk"),
+       PIN_BANK_2BIT(15, 0x0f0, "gpl"),
+       PIN_BANK_2BIT(2, 0x100, "gpm"),
+};
+
+struct samsung_pin_ctrl s3c2450_pin_ctrl[] = {
+       {
+               .pin_banks      = s3c2450_pin_banks,
+               .nr_banks       = ARRAY_SIZE(s3c2450_pin_banks),
+               .eint_wkup_init = s3c24xx_eint_init,
+               .label          = "S3C2450-GPIO",
+       },
+};
diff --git a/drivers/pinctrl/samsung/pinctrl-s3c64xx.c b/drivers/pinctrl/samsung/pinctrl-s3c64xx.c
new file mode 100644 (file)
index 0000000..89143c9
--- /dev/null
@@ -0,0 +1,816 @@
+/*
+ * S3C64xx specific support for pinctrl-samsung driver.
+ *
+ * Copyright (c) 2013 Tomasz Figa <tomasz.figa@gmail.com>
+ *
+ * Based on pinctrl-exynos.c, please see the file for original copyrights.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This file contains the Samsung S3C64xx specific information required by the
+ * the Samsung pinctrl/gpiolib driver. It also includes the implementation of
+ * external gpio and wakeup interrupt support.
+ */
+
+#include <linux/module.h>
+#include <linux/device.h>
+#include <linux/interrupt.h>
+#include <linux/irqdomain.h>
+#include <linux/irq.h>
+#include <linux/of_irq.h>
+#include <linux/io.h>
+#include <linux/irqchip/chained_irq.h>
+#include <linux/slab.h>
+#include <linux/err.h>
+
+#include "pinctrl-samsung.h"
+
+#define NUM_EINT0              28
+#define NUM_EINT0_IRQ          4
+#define EINT_MAX_PER_REG       16
+#define EINT_MAX_PER_GROUP     16
+
+/* External GPIO and wakeup interrupt related definitions */
+#define SVC_GROUP_SHIFT                4
+#define SVC_GROUP_MASK         0xf
+#define SVC_NUM_MASK           0xf
+#define SVC_GROUP(x)           ((x >> SVC_GROUP_SHIFT) & \
+                                               SVC_GROUP_MASK)
+
+#define EINT12CON_REG          0x200
+#define EINT12MASK_REG         0x240
+#define EINT12PEND_REG         0x260
+
+#define EINT_OFFS(i)           ((i) % (2 * EINT_MAX_PER_GROUP))
+#define EINT_GROUP(i)          ((i) / EINT_MAX_PER_GROUP)
+#define EINT_REG(g)            (4 * ((g) / 2))
+
+#define EINTCON_REG(i)         (EINT12CON_REG + EINT_REG(EINT_GROUP(i)))
+#define EINTMASK_REG(i)                (EINT12MASK_REG + EINT_REG(EINT_GROUP(i)))
+#define EINTPEND_REG(i)                (EINT12PEND_REG + EINT_REG(EINT_GROUP(i)))
+
+#define SERVICE_REG            0x284
+#define SERVICEPEND_REG                0x288
+
+#define EINT0CON0_REG          0x900
+#define EINT0MASK_REG          0x920
+#define EINT0PEND_REG          0x924
+
+/* S3C64xx specific external interrupt trigger types */
+#define EINT_LEVEL_LOW         0
+#define EINT_LEVEL_HIGH                1
+#define EINT_EDGE_FALLING      2
+#define EINT_EDGE_RISING       4
+#define EINT_EDGE_BOTH         6
+#define EINT_CON_MASK          0xF
+#define EINT_CON_LEN           4
+
+static struct samsung_pin_bank_type bank_type_4bit_off = {
+       .fld_width = { 4, 1, 2, 0, 2, 2, },
+       .reg_offset = { 0x00, 0x04, 0x08, 0, 0x0c, 0x10, },
+};
+
+static struct samsung_pin_bank_type bank_type_4bit_alive = {
+       .fld_width = { 4, 1, 2, },
+       .reg_offset = { 0x00, 0x04, 0x08, },
+};
+
+static struct samsung_pin_bank_type bank_type_4bit2_off = {
+       .fld_width = { 4, 1, 2, 0, 2, 2, },
+       .reg_offset = { 0x00, 0x08, 0x0c, 0, 0x10, 0x14, },
+};
+
+static struct samsung_pin_bank_type bank_type_4bit2_alive = {
+       .fld_width = { 4, 1, 2, },
+       .reg_offset = { 0x00, 0x08, 0x0c, },
+};
+
+static struct samsung_pin_bank_type bank_type_2bit_off = {
+       .fld_width = { 2, 1, 2, 0, 2, 2, },
+       .reg_offset = { 0x00, 0x04, 0x08, 0, 0x0c, 0x10, },
+};
+
+static struct samsung_pin_bank_type bank_type_2bit_alive = {
+       .fld_width = { 2, 1, 2, },
+       .reg_offset = { 0x00, 0x04, 0x08, },
+};
+
+#define PIN_BANK_4BIT(pins, reg, id)                   \
+       {                                               \
+               .type           = &bank_type_4bit_off,  \
+               .pctl_offset    = reg,                  \
+               .nr_pins        = pins,                 \
+               .eint_type      = EINT_TYPE_NONE,       \
+               .name           = id                    \
+       }
+
+#define PIN_BANK_4BIT_EINTG(pins, reg, id, eoffs)      \
+       {                                               \
+               .type           = &bank_type_4bit_off,  \
+               .pctl_offset    = reg,                  \
+               .nr_pins        = pins,                 \
+               .eint_type      = EINT_TYPE_GPIO,       \
+               .eint_func      = 7,                    \
+               .eint_mask      = (1 << (pins)) - 1,    \
+               .eint_offset    = eoffs,                \
+               .name           = id                    \
+       }
+
+#define PIN_BANK_4BIT_EINTW(pins, reg, id, eoffs, emask) \
+       {                                               \
+               .type           = &bank_type_4bit_alive,\
+               .pctl_offset    = reg,                  \
+               .nr_pins        = pins,                 \
+               .eint_type      = EINT_TYPE_WKUP,       \
+               .eint_func      = 3,                    \
+               .eint_mask      = emask,                \
+               .eint_offset    = eoffs,                \
+               .name           = id                    \
+       }
+
+#define PIN_BANK_4BIT2_EINTG(pins, reg, id, eoffs)     \
+       {                                               \
+               .type           = &bank_type_4bit2_off, \
+               .pctl_offset    = reg,                  \
+               .nr_pins        = pins,                 \
+               .eint_type      = EINT_TYPE_GPIO,       \
+               .eint_func      = 7,                    \
+               .eint_mask      = (1 << (pins)) - 1,    \
+               .eint_offset    = eoffs,                \
+               .name           = id                    \
+       }
+
+#define PIN_BANK_4BIT2_EINTW(pins, reg, id, eoffs, emask) \
+       {                                               \
+               .type           = &bank_type_4bit2_alive,\
+               .pctl_offset    = reg,                  \
+               .nr_pins        = pins,                 \
+               .eint_type      = EINT_TYPE_WKUP,       \
+               .eint_func      = 3,                    \
+               .eint_mask      = emask,                \
+               .eint_offset    = eoffs,                \
+               .name           = id                    \
+       }
+
+#define PIN_BANK_4BIT2_ALIVE(pins, reg, id)            \
+       {                                               \
+               .type           = &bank_type_4bit2_alive,\
+               .pctl_offset    = reg,                  \
+               .nr_pins        = pins,                 \
+               .eint_type      = EINT_TYPE_NONE,       \
+               .name           = id                    \
+       }
+
+#define PIN_BANK_2BIT(pins, reg, id)                   \
+       {                                               \
+               .type           = &bank_type_2bit_off,  \
+               .pctl_offset    = reg,                  \
+               .nr_pins        = pins,                 \
+               .eint_type      = EINT_TYPE_NONE,       \
+               .name           = id                    \
+       }
+
+#define PIN_BANK_2BIT_EINTG(pins, reg, id, eoffs, emask) \
+       {                                               \
+               .type           = &bank_type_2bit_off,  \
+               .pctl_offset    = reg,                  \
+               .nr_pins        = pins,                 \
+               .eint_type      = EINT_TYPE_GPIO,       \
+               .eint_func      = 3,                    \
+               .eint_mask      = emask,                \
+               .eint_offset    = eoffs,                \
+               .name           = id                    \
+       }
+
+#define PIN_BANK_2BIT_EINTW(pins, reg, id, eoffs)      \
+       {                                               \
+               .type           = &bank_type_2bit_alive,\
+               .pctl_offset    = reg,                  \
+               .nr_pins        = pins,                 \
+               .eint_type      = EINT_TYPE_WKUP,       \
+               .eint_func      = 2,                    \
+               .eint_mask      = (1 << (pins)) - 1,    \
+               .eint_offset    = eoffs,                \
+               .name           = id                    \
+       }
+
+/**
+ * struct s3c64xx_eint0_data: EINT0 common data
+ * @drvdata: pin controller driver data
+ * @domains: IRQ domains of particular EINT0 interrupts
+ * @pins: pin offsets inside of banks of particular EINT0 interrupts
+ */
+struct s3c64xx_eint0_data {
+       struct samsung_pinctrl_drv_data *drvdata;
+       struct irq_domain *domains[NUM_EINT0];
+       u8 pins[NUM_EINT0];
+};
+
+/**
+ * struct s3c64xx_eint0_domain_data: EINT0 per-domain data
+ * @bank: pin bank related to the domain
+ * @eints: EINT0 interrupts related to the domain
+ */
+struct s3c64xx_eint0_domain_data {
+       struct samsung_pin_bank *bank;
+       u8 eints[];
+};
+
+/**
+ * struct s3c64xx_eint_gpio_data: GPIO EINT data
+ * @drvdata: pin controller driver data
+ * @domains: array of domains related to EINT interrupt groups
+ */
+struct s3c64xx_eint_gpio_data {
+       struct samsung_pinctrl_drv_data *drvdata;
+       struct irq_domain *domains[];
+};
+
+/*
+ * Common functions for S3C64xx EINT configuration
+ */
+
+static int s3c64xx_irq_get_trigger(unsigned int type)
+{
+       int trigger;
+
+       switch (type) {
+       case IRQ_TYPE_EDGE_RISING:
+               trigger = EINT_EDGE_RISING;
+               break;
+       case IRQ_TYPE_EDGE_FALLING:
+               trigger = EINT_EDGE_FALLING;
+               break;
+       case IRQ_TYPE_EDGE_BOTH:
+               trigger = EINT_EDGE_BOTH;
+               break;
+       case IRQ_TYPE_LEVEL_HIGH:
+               trigger = EINT_LEVEL_HIGH;
+               break;
+       case IRQ_TYPE_LEVEL_LOW:
+               trigger = EINT_LEVEL_LOW;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       return trigger;
+}
+
+static void s3c64xx_irq_set_handler(unsigned int irq, unsigned int type)
+{
+       /* Edge- and level-triggered interrupts need different handlers */
+       if (type & IRQ_TYPE_EDGE_BOTH)
+               __irq_set_handler_locked(irq, handle_edge_irq);
+       else
+               __irq_set_handler_locked(irq, handle_level_irq);
+}
+
+static void s3c64xx_irq_set_function(struct samsung_pinctrl_drv_data *d,
+                                       struct samsung_pin_bank *bank, int pin)
+{
+       struct samsung_pin_bank_type *bank_type = bank->type;
+       unsigned long flags;
+       void __iomem *reg;
+       u8 shift;
+       u32 mask;
+       u32 val;
+
+       /* Make sure that pin is configured as interrupt */
+       reg = d->virt_base + bank->pctl_offset;
+       shift = pin;
+       if (bank_type->fld_width[PINCFG_TYPE_FUNC] * shift >= 32) {
+               /* 4-bit bank type with 2 con regs */
+               reg += 4;
+               shift -= 8;
+       }
+
+       shift = shift * bank_type->fld_width[PINCFG_TYPE_FUNC];
+       mask = (1 << bank_type->fld_width[PINCFG_TYPE_FUNC]) - 1;
+
+       spin_lock_irqsave(&bank->slock, flags);
+
+       val = readl(reg);
+       val &= ~(mask << shift);
+       val |= bank->eint_func << shift;
+       writel(val, reg);
+
+       spin_unlock_irqrestore(&bank->slock, flags);
+}
+
+/*
+ * Functions for EINT GPIO configuration (EINT groups 1-9)
+ */
+
+static inline void s3c64xx_gpio_irq_set_mask(struct irq_data *irqd, bool mask)
+{
+       struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
+       struct samsung_pinctrl_drv_data *d = bank->drvdata;
+       unsigned char index = EINT_OFFS(bank->eint_offset) + irqd->hwirq;
+       void __iomem *reg = d->virt_base + EINTMASK_REG(bank->eint_offset);
+       u32 val;
+
+       val = readl(reg);
+       if (mask)
+               val |= 1 << index;
+       else
+               val &= ~(1 << index);
+       writel(val, reg);
+}
+
+static void s3c64xx_gpio_irq_unmask(struct irq_data *irqd)
+{
+       s3c64xx_gpio_irq_set_mask(irqd, false);
+}
+
+static void s3c64xx_gpio_irq_mask(struct irq_data *irqd)
+{
+       s3c64xx_gpio_irq_set_mask(irqd, true);
+}
+
+static void s3c64xx_gpio_irq_ack(struct irq_data *irqd)
+{
+       struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
+       struct samsung_pinctrl_drv_data *d = bank->drvdata;
+       unsigned char index = EINT_OFFS(bank->eint_offset) + irqd->hwirq;
+       void __iomem *reg = d->virt_base + EINTPEND_REG(bank->eint_offset);
+
+       writel(1 << index, reg);
+}
+
+static int s3c64xx_gpio_irq_set_type(struct irq_data *irqd, unsigned int type)
+{
+       struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
+       struct samsung_pinctrl_drv_data *d = bank->drvdata;
+       void __iomem *reg;
+       int trigger;
+       u8 shift;
+       u32 val;
+
+       trigger = s3c64xx_irq_get_trigger(type);
+       if (trigger < 0) {
+               pr_err("unsupported external interrupt type\n");
+               return -EINVAL;
+       }
+
+       s3c64xx_irq_set_handler(irqd->irq, type);
+
+       /* Set up interrupt trigger */
+       reg = d->virt_base + EINTCON_REG(bank->eint_offset);
+       shift = EINT_OFFS(bank->eint_offset) + irqd->hwirq;
+       shift = 4 * (shift / 4); /* 4 EINTs per trigger selector */
+
+       val = readl(reg);
+       val &= ~(EINT_CON_MASK << shift);
+       val |= trigger << shift;
+       writel(val, reg);
+
+       s3c64xx_irq_set_function(d, bank, irqd->hwirq);
+
+       return 0;
+}
+
+/*
+ * irq_chip for gpio interrupts.
+ */
+static struct irq_chip s3c64xx_gpio_irq_chip = {
+       .name           = "GPIO",
+       .irq_unmask     = s3c64xx_gpio_irq_unmask,
+       .irq_mask       = s3c64xx_gpio_irq_mask,
+       .irq_ack        = s3c64xx_gpio_irq_ack,
+       .irq_set_type   = s3c64xx_gpio_irq_set_type,
+};
+
+static int s3c64xx_gpio_irq_map(struct irq_domain *h, unsigned int virq,
+                                       irq_hw_number_t hw)
+{
+       struct samsung_pin_bank *bank = h->host_data;
+
+       if (!(bank->eint_mask & (1 << hw)))
+               return -EINVAL;
+
+       irq_set_chip_and_handler(virq,
+                               &s3c64xx_gpio_irq_chip, handle_level_irq);
+       irq_set_chip_data(virq, bank);
+       set_irq_flags(virq, IRQF_VALID);
+
+       return 0;
+}
+
+/*
+ * irq domain callbacks for external gpio interrupt controller.
+ */
+static const struct irq_domain_ops s3c64xx_gpio_irqd_ops = {
+       .map    = s3c64xx_gpio_irq_map,
+       .xlate  = irq_domain_xlate_twocell,
+};
+
+static void s3c64xx_eint_gpio_irq(unsigned int irq, struct irq_desc *desc)
+{
+       struct irq_chip *chip = irq_get_chip(irq);
+       struct s3c64xx_eint_gpio_data *data = irq_get_handler_data(irq);
+       struct samsung_pinctrl_drv_data *drvdata = data->drvdata;
+
+       chained_irq_enter(chip, desc);
+
+       do {
+               unsigned int svc;
+               unsigned int group;
+               unsigned int pin;
+               unsigned int virq;
+
+               svc = readl(drvdata->virt_base + SERVICE_REG);
+               group = SVC_GROUP(svc);
+               pin = svc & SVC_NUM_MASK;
+
+               if (!group)
+                       break;
+
+               /* Group 1 is used for two pin banks */
+               if (group == 1) {
+                       if (pin < 8)
+                               group = 0;
+                       else
+                               pin -= 8;
+               }
+
+               virq = irq_linear_revmap(data->domains[group], pin);
+               /*
+                * Something must be really wrong if an unmapped EINT
+                * was unmasked...
+                */
+               BUG_ON(!virq);
+
+               generic_handle_irq(virq);
+       } while (1);
+
+       chained_irq_exit(chip, desc);
+}
+
+/**
+ * s3c64xx_eint_gpio_init() - setup handling of external gpio interrupts.
+ * @d: driver data of samsung pinctrl driver.
+ */
+static int s3c64xx_eint_gpio_init(struct samsung_pinctrl_drv_data *d)
+{
+       struct s3c64xx_eint_gpio_data *data;
+       struct samsung_pin_bank *bank;
+       struct device *dev = d->dev;
+       unsigned int nr_domains;
+       unsigned int i;
+
+       if (!d->irq) {
+               dev_err(dev, "irq number not available\n");
+               return -EINVAL;
+       }
+
+       nr_domains = 0;
+       bank = d->ctrl->pin_banks;
+       for (i = 0; i < d->ctrl->nr_banks; ++i, ++bank) {
+               unsigned int nr_eints;
+               unsigned int mask;
+
+               if (bank->eint_type != EINT_TYPE_GPIO)
+                       continue;
+
+               mask = bank->eint_mask;
+               nr_eints = fls(mask);
+
+               bank->irq_domain = irq_domain_add_linear(bank->of_node,
+                                       nr_eints, &s3c64xx_gpio_irqd_ops, bank);
+               if (!bank->irq_domain) {
+                       dev_err(dev, "gpio irq domain add failed\n");
+                       return -ENXIO;
+               }
+
+               ++nr_domains;
+       }
+
+       data = devm_kzalloc(dev, sizeof(*data)
+                       + nr_domains * sizeof(*data->domains), GFP_KERNEL);
+       if (!data) {
+               dev_err(dev, "failed to allocate handler data\n");
+               return -ENOMEM;
+       }
+       data->drvdata = d;
+
+       bank = d->ctrl->pin_banks;
+       nr_domains = 0;
+       for (i = 0; i < d->ctrl->nr_banks; ++i, ++bank) {
+               if (bank->eint_type != EINT_TYPE_GPIO)
+                       continue;
+
+               data->domains[nr_domains++] = bank->irq_domain;
+       }
+
+       irq_set_chained_handler(d->irq, s3c64xx_eint_gpio_irq);
+       irq_set_handler_data(d->irq, data);
+
+       return 0;
+}
+
+/*
+ * Functions for configuration of EINT0 wake-up interrupts
+ */
+
+static inline void s3c64xx_eint0_irq_set_mask(struct irq_data *irqd, bool mask)
+{
+       struct s3c64xx_eint0_domain_data *ddata =
+                                       irq_data_get_irq_chip_data(irqd);
+       struct samsung_pinctrl_drv_data *d = ddata->bank->drvdata;
+       u32 val;
+
+       val = readl(d->virt_base + EINT0MASK_REG);
+       if (mask)
+               val |= 1 << ddata->eints[irqd->hwirq];
+       else
+               val &= ~(1 << ddata->eints[irqd->hwirq]);
+       writel(val, d->virt_base + EINT0MASK_REG);
+}
+
+static void s3c64xx_eint0_irq_unmask(struct irq_data *irqd)
+{
+       s3c64xx_eint0_irq_set_mask(irqd, false);
+}
+
+static void s3c64xx_eint0_irq_mask(struct irq_data *irqd)
+{
+       s3c64xx_eint0_irq_set_mask(irqd, true);
+}
+
+static void s3c64xx_eint0_irq_ack(struct irq_data *irqd)
+{
+       struct s3c64xx_eint0_domain_data *ddata =
+                                       irq_data_get_irq_chip_data(irqd);
+       struct samsung_pinctrl_drv_data *d = ddata->bank->drvdata;
+
+       writel(1 << ddata->eints[irqd->hwirq],
+                                       d->virt_base + EINT0PEND_REG);
+}
+
+static int s3c64xx_eint0_irq_set_type(struct irq_data *irqd, unsigned int type)
+{
+       struct s3c64xx_eint0_domain_data *ddata =
+                                       irq_data_get_irq_chip_data(irqd);
+       struct samsung_pin_bank *bank = ddata->bank;
+       struct samsung_pinctrl_drv_data *d = bank->drvdata;
+       void __iomem *reg;
+       int trigger;
+       u8 shift;
+       u32 val;
+
+       trigger = s3c64xx_irq_get_trigger(type);
+       if (trigger < 0) {
+               pr_err("unsupported external interrupt type\n");
+               return -EINVAL;
+       }
+
+       s3c64xx_irq_set_handler(irqd->irq, type);
+
+       /* Set up interrupt trigger */
+       reg = d->virt_base + EINT0CON0_REG;
+       shift = ddata->eints[irqd->hwirq];
+       if (shift >= EINT_MAX_PER_REG) {
+               reg += 4;
+               shift -= EINT_MAX_PER_REG;
+       }
+       shift = EINT_CON_LEN * (shift / 2);
+
+       val = readl(reg);
+       val &= ~(EINT_CON_MASK << shift);
+       val |= trigger << shift;
+       writel(val, reg);
+
+       s3c64xx_irq_set_function(d, bank, irqd->hwirq);
+
+       return 0;
+}
+
+/*
+ * irq_chip for wakeup interrupts
+ */
+static struct irq_chip s3c64xx_eint0_irq_chip = {
+       .name           = "EINT0",
+       .irq_unmask     = s3c64xx_eint0_irq_unmask,
+       .irq_mask       = s3c64xx_eint0_irq_mask,
+       .irq_ack        = s3c64xx_eint0_irq_ack,
+       .irq_set_type   = s3c64xx_eint0_irq_set_type,
+};
+
+static inline void s3c64xx_irq_demux_eint(unsigned int irq,
+                                       struct irq_desc *desc, u32 range)
+{
+       struct irq_chip *chip = irq_get_chip(irq);
+       struct s3c64xx_eint0_data *data = irq_get_handler_data(irq);
+       struct samsung_pinctrl_drv_data *drvdata = data->drvdata;
+       unsigned int pend, mask;
+
+       chained_irq_enter(chip, desc);
+
+       pend = readl(drvdata->virt_base + EINT0PEND_REG);
+       mask = readl(drvdata->virt_base + EINT0MASK_REG);
+
+       pend = pend & range & ~mask;
+       pend &= range;
+
+       while (pend) {
+               unsigned int virq;
+
+               irq = fls(pend) - 1;
+               pend &= ~(1 << irq);
+
+               virq = irq_linear_revmap(data->domains[irq], data->pins[irq]);
+               /*
+                * Something must be really wrong if an unmapped EINT
+                * was unmasked...
+                */
+               BUG_ON(!virq);
+
+               generic_handle_irq(virq);
+       }
+
+       chained_irq_exit(chip, desc);
+}
+
+static void s3c64xx_demux_eint0_3(unsigned int irq, struct irq_desc *desc)
+{
+       s3c64xx_irq_demux_eint(irq, desc, 0xf);
+}
+
+static void s3c64xx_demux_eint4_11(unsigned int irq, struct irq_desc *desc)
+{
+       s3c64xx_irq_demux_eint(irq, desc, 0xff0);
+}
+
+static void s3c64xx_demux_eint12_19(unsigned int irq, struct irq_desc *desc)
+{
+       s3c64xx_irq_demux_eint(irq, desc, 0xff000);
+}
+
+static void s3c64xx_demux_eint20_27(unsigned int irq, struct irq_desc *desc)
+{
+       s3c64xx_irq_demux_eint(irq, desc, 0xff00000);
+}
+
+static irq_flow_handler_t s3c64xx_eint0_handlers[NUM_EINT0_IRQ] = {
+       s3c64xx_demux_eint0_3,
+       s3c64xx_demux_eint4_11,
+       s3c64xx_demux_eint12_19,
+       s3c64xx_demux_eint20_27,
+};
+
+static int s3c64xx_eint0_irq_map(struct irq_domain *h, unsigned int virq,
+                                       irq_hw_number_t hw)
+{
+       struct s3c64xx_eint0_domain_data *ddata = h->host_data;
+       struct samsung_pin_bank *bank = ddata->bank;
+
+       if (!(bank->eint_mask & (1 << hw)))
+               return -EINVAL;
+
+       irq_set_chip_and_handler(virq,
+                               &s3c64xx_eint0_irq_chip, handle_level_irq);
+       irq_set_chip_data(virq, ddata);
+       set_irq_flags(virq, IRQF_VALID);
+
+       return 0;
+}
+
+/*
+ * irq domain callbacks for external wakeup interrupt controller.
+ */
+static const struct irq_domain_ops s3c64xx_eint0_irqd_ops = {
+       .map    = s3c64xx_eint0_irq_map,
+       .xlate  = irq_domain_xlate_twocell,
+};
+
+/* list of external wakeup controllers supported */
+static const struct of_device_id s3c64xx_eint0_irq_ids[] = {
+       { .compatible = "samsung,s3c64xx-wakeup-eint", },
+       { }
+};
+
+/**
+ * s3c64xx_eint_eint0_init() - setup handling of external wakeup interrupts.
+ * @d: driver data of samsung pinctrl driver.
+ */
+static int s3c64xx_eint_eint0_init(struct samsung_pinctrl_drv_data *d)
+{
+       struct device *dev = d->dev;
+       struct device_node *eint0_np = NULL;
+       struct device_node *np;
+       struct samsung_pin_bank *bank;
+       struct s3c64xx_eint0_data *data;
+       unsigned int i;
+
+       for_each_child_of_node(dev->of_node, np) {
+               if (of_match_node(s3c64xx_eint0_irq_ids, np)) {
+                       eint0_np = np;
+                       break;
+               }
+       }
+       if (!eint0_np)
+               return -ENODEV;
+
+       data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
+       if (!data) {
+               dev_err(dev, "could not allocate memory for wkup eint data\n");
+               return -ENOMEM;
+       }
+       data->drvdata = d;
+
+       for (i = 0; i < NUM_EINT0_IRQ; ++i) {
+               unsigned int irq;
+
+               irq = irq_of_parse_and_map(eint0_np, i);
+               if (!irq) {
+                       dev_err(dev, "failed to get wakeup EINT IRQ %d\n", i);
+                       return -ENXIO;
+               }
+
+               irq_set_chained_handler(irq, s3c64xx_eint0_handlers[i]);
+               irq_set_handler_data(irq, data);
+       }
+
+       bank = d->ctrl->pin_banks;
+       for (i = 0; i < d->ctrl->nr_banks; ++i, ++bank) {
+               struct s3c64xx_eint0_domain_data *ddata;
+               unsigned int nr_eints;
+               unsigned int mask;
+               unsigned int irq;
+               unsigned int pin;
+
+               if (bank->eint_type != EINT_TYPE_WKUP)
+                       continue;
+
+               mask = bank->eint_mask;
+               nr_eints = fls(mask);
+
+               ddata = devm_kzalloc(dev,
+                               sizeof(*ddata) + nr_eints, GFP_KERNEL);
+               if (!ddata) {
+                       dev_err(dev, "failed to allocate domain data\n");
+                       return -ENOMEM;
+               }
+               ddata->bank = bank;
+
+               bank->irq_domain = irq_domain_add_linear(bank->of_node,
+                               nr_eints, &s3c64xx_eint0_irqd_ops, ddata);
+               if (!bank->irq_domain) {
+                       dev_err(dev, "wkup irq domain add failed\n");
+                       return -ENXIO;
+               }
+
+               irq = bank->eint_offset;
+               mask = bank->eint_mask;
+               for (pin = 0; mask; ++pin, mask >>= 1) {
+                       if (!(mask & 1))
+                               continue;
+                       data->domains[irq] = bank->irq_domain;
+                       data->pins[irq] = pin;
+                       ddata->eints[pin] = irq;
+                       ++irq;
+               }
+       }
+
+       return 0;
+}
+
+/* pin banks of s3c64xx pin-controller 0 */
+static struct samsung_pin_bank s3c64xx_pin_banks0[] = {
+       PIN_BANK_4BIT_EINTG(8, 0x000, "gpa", 0),
+       PIN_BANK_4BIT_EINTG(7, 0x020, "gpb", 8),
+       PIN_BANK_4BIT_EINTG(8, 0x040, "gpc", 16),
+       PIN_BANK_4BIT_EINTG(5, 0x060, "gpd", 32),
+       PIN_BANK_4BIT(5, 0x080, "gpe"),
+       PIN_BANK_2BIT_EINTG(16, 0x0a0, "gpf", 48, 0x3fff),
+       PIN_BANK_4BIT_EINTG(7, 0x0c0, "gpg", 64),
+       PIN_BANK_4BIT2_EINTG(10, 0x0e0, "gph", 80),
+       PIN_BANK_2BIT(16, 0x100, "gpi"),
+       PIN_BANK_2BIT(12, 0x120, "gpj"),
+       PIN_BANK_4BIT2_ALIVE(16, 0x800, "gpk"),
+       PIN_BANK_4BIT2_EINTW(15, 0x810, "gpl", 16, 0x7f00),
+       PIN_BANK_4BIT_EINTW(6, 0x820, "gpm", 23, 0x1f),
+       PIN_BANK_2BIT_EINTW(16, 0x830, "gpn", 0),
+       PIN_BANK_2BIT_EINTG(16, 0x140, "gpo", 96, 0xffff),
+       PIN_BANK_2BIT_EINTG(15, 0x160, "gpp", 112, 0x7fff),
+       PIN_BANK_2BIT_EINTG(9, 0x180, "gpq", 128, 0x1ff),
+};
+
+/*
+ * Samsung pinctrl driver data for S3C64xx SoC. S3C64xx SoC includes
+ * one gpio/pin-mux/pinconfig controller.
+ */
+struct samsung_pin_ctrl s3c64xx_pin_ctrl[] = {
+       {
+               /* pin-controller instance 1 data */
+               .pin_banks      = s3c64xx_pin_banks0,
+               .nr_banks       = ARRAY_SIZE(s3c64xx_pin_banks0),
+               .eint_gpio_init = s3c64xx_eint_gpio_init,
+               .eint_wkup_init = s3c64xx_eint_eint0_init,
+               .label          = "S3C64xx-GPIO",
+       },
+};
diff --git a/drivers/pinctrl/samsung/pinctrl-samsung.c b/drivers/pinctrl/samsung/pinctrl-samsung.c
new file mode 100644 (file)
index 0000000..b07406d
--- /dev/null
@@ -0,0 +1,1285 @@
+/*
+ * pin-controller/pin-mux/pin-config/gpio-driver for Samsung's SoC's.
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd.
+ *             http://www.samsung.com
+ * Copyright (c) 2012 Linaro Ltd
+ *             http://www.linaro.org
+ *
+ * Author: Thomas Abraham <thomas.ab@samsung.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This driver implements the Samsung pinctrl driver. It supports setting up of
+ * pinmux and pinconf configurations. The gpiolib interface is also included.
+ * External interrupt (gpio and wakeup) support are not included in this driver
+ * but provides extensions to which platform specific implementation of the gpio
+ * and wakeup interrupts can be hooked to.
+ */
+
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/io.h>
+#include <linux/slab.h>
+#include <linux/err.h>
+#include <linux/gpio.h>
+#include <linux/irqdomain.h>
+#include <linux/spinlock.h>
+#include <linux/syscore_ops.h>
+
+#include "../core.h"
+#include "pinctrl-samsung.h"
+
+#define GROUP_SUFFIX           "-grp"
+#define GSUFFIX_LEN            sizeof(GROUP_SUFFIX)
+#define FUNCTION_SUFFIX                "-mux"
+#define FSUFFIX_LEN            sizeof(FUNCTION_SUFFIX)
+
+/* list of all possible config options supported */
+static struct pin_config {
+       const char *property;
+       enum pincfg_type param;
+} cfg_params[] = {
+       { "samsung,pin-pud", PINCFG_TYPE_PUD },
+       { "samsung,pin-drv", PINCFG_TYPE_DRV },
+       { "samsung,pin-con-pdn", PINCFG_TYPE_CON_PDN },
+       { "samsung,pin-pud-pdn", PINCFG_TYPE_PUD_PDN },
+       { "samsung,pin-val", PINCFG_TYPE_DAT },
+};
+
+/* Global list of devices (struct samsung_pinctrl_drv_data) */
+static LIST_HEAD(drvdata_list);
+
+static unsigned int pin_base;
+
+static inline struct samsung_pin_bank *gc_to_pin_bank(struct gpio_chip *gc)
+{
+       return container_of(gc, struct samsung_pin_bank, gpio_chip);
+}
+
+static int samsung_get_group_count(struct pinctrl_dev *pctldev)
+{
+       struct samsung_pinctrl_drv_data *pmx = pinctrl_dev_get_drvdata(pctldev);
+
+       return pmx->nr_groups;
+}
+
+static const char *samsung_get_group_name(struct pinctrl_dev *pctldev,
+                                               unsigned group)
+{
+       struct samsung_pinctrl_drv_data *pmx = pinctrl_dev_get_drvdata(pctldev);
+
+       return pmx->pin_groups[group].name;
+}
+
+static int samsung_get_group_pins(struct pinctrl_dev *pctldev,
+                                       unsigned group,
+                                       const unsigned **pins,
+                                       unsigned *num_pins)
+{
+       struct samsung_pinctrl_drv_data *pmx = pinctrl_dev_get_drvdata(pctldev);
+
+       *pins = pmx->pin_groups[group].pins;
+       *num_pins = pmx->pin_groups[group].num_pins;
+
+       return 0;
+}
+
+static int reserve_map(struct device *dev, struct pinctrl_map **map,
+                      unsigned *reserved_maps, unsigned *num_maps,
+                      unsigned reserve)
+{
+       unsigned old_num = *reserved_maps;
+       unsigned new_num = *num_maps + reserve;
+       struct pinctrl_map *new_map;
+
+       if (old_num >= new_num)
+               return 0;
+
+       new_map = krealloc(*map, sizeof(*new_map) * new_num, GFP_KERNEL);
+       if (!new_map) {
+               dev_err(dev, "krealloc(map) failed\n");
+               return -ENOMEM;
+       }
+
+       memset(new_map + old_num, 0, (new_num - old_num) * sizeof(*new_map));
+
+       *map = new_map;
+       *reserved_maps = new_num;
+
+       return 0;
+}
+
+static int add_map_mux(struct pinctrl_map **map, unsigned *reserved_maps,
+                      unsigned *num_maps, const char *group,
+                      const char *function)
+{
+       if (WARN_ON(*num_maps == *reserved_maps))
+               return -ENOSPC;
+
+       (*map)[*num_maps].type = PIN_MAP_TYPE_MUX_GROUP;
+       (*map)[*num_maps].data.mux.group = group;
+       (*map)[*num_maps].data.mux.function = function;
+       (*num_maps)++;
+
+       return 0;
+}
+
+static int add_map_configs(struct device *dev, struct pinctrl_map **map,
+                          unsigned *reserved_maps, unsigned *num_maps,
+                          const char *group, unsigned long *configs,
+                          unsigned num_configs)
+{
+       unsigned long *dup_configs;
+
+       if (WARN_ON(*num_maps == *reserved_maps))
+               return -ENOSPC;
+
+       dup_configs = kmemdup(configs, num_configs * sizeof(*dup_configs),
+                             GFP_KERNEL);
+       if (!dup_configs) {
+               dev_err(dev, "kmemdup(configs) failed\n");
+               return -ENOMEM;
+       }
+
+       (*map)[*num_maps].type = PIN_MAP_TYPE_CONFIGS_GROUP;
+       (*map)[*num_maps].data.configs.group_or_pin = group;
+       (*map)[*num_maps].data.configs.configs = dup_configs;
+       (*map)[*num_maps].data.configs.num_configs = num_configs;
+       (*num_maps)++;
+
+       return 0;
+}
+
+static int add_config(struct device *dev, unsigned long **configs,
+                     unsigned *num_configs, unsigned long config)
+{
+       unsigned old_num = *num_configs;
+       unsigned new_num = old_num + 1;
+       unsigned long *new_configs;
+
+       new_configs = krealloc(*configs, sizeof(*new_configs) * new_num,
+                              GFP_KERNEL);
+       if (!new_configs) {
+               dev_err(dev, "krealloc(configs) failed\n");
+               return -ENOMEM;
+       }
+
+       new_configs[old_num] = config;
+
+       *configs = new_configs;
+       *num_configs = new_num;
+
+       return 0;
+}
+
+static void samsung_dt_free_map(struct pinctrl_dev *pctldev,
+                                     struct pinctrl_map *map,
+                                     unsigned num_maps)
+{
+       int i;
+
+       for (i = 0; i < num_maps; i++)
+               if (map[i].type == PIN_MAP_TYPE_CONFIGS_GROUP)
+                       kfree(map[i].data.configs.configs);
+
+       kfree(map);
+}
+
+static int samsung_dt_subnode_to_map(struct samsung_pinctrl_drv_data *drvdata,
+                                    struct device *dev,
+                                    struct device_node *np,
+                                    struct pinctrl_map **map,
+                                    unsigned *reserved_maps,
+                                    unsigned *num_maps)
+{
+       int ret, i;
+       u32 val;
+       unsigned long config;
+       unsigned long *configs = NULL;
+       unsigned num_configs = 0;
+       unsigned reserve;
+       struct property *prop;
+       const char *group;
+       bool has_func = false;
+
+       ret = of_property_read_u32(np, "samsung,pin-function", &val);
+       if (!ret)
+               has_func = true;
+
+       for (i = 0; i < ARRAY_SIZE(cfg_params); i++) {
+               ret = of_property_read_u32(np, cfg_params[i].property, &val);
+               if (!ret) {
+                       config = PINCFG_PACK(cfg_params[i].param, val);
+                       ret = add_config(dev, &configs, &num_configs, config);
+                       if (ret < 0)
+                               goto exit;
+               /* EINVAL=missing, which is fine since it's optional */
+               } else if (ret != -EINVAL) {
+                       dev_err(dev, "could not parse property %s\n",
+                               cfg_params[i].property);
+               }
+       }
+
+       reserve = 0;
+       if (has_func)
+               reserve++;
+       if (num_configs)
+               reserve++;
+       ret = of_property_count_strings(np, "samsung,pins");
+       if (ret < 0) {
+               dev_err(dev, "could not parse property samsung,pins\n");
+               goto exit;
+       }
+       reserve *= ret;
+
+       ret = reserve_map(dev, map, reserved_maps, num_maps, reserve);
+       if (ret < 0)
+               goto exit;
+
+       of_property_for_each_string(np, "samsung,pins", prop, group) {
+               if (has_func) {
+                       ret = add_map_mux(map, reserved_maps,
+                                               num_maps, group, np->full_name);
+                       if (ret < 0)
+                               goto exit;
+               }
+
+               if (num_configs) {
+                       ret = add_map_configs(dev, map, reserved_maps,
+                                             num_maps, group, configs,
+                                             num_configs);
+                       if (ret < 0)
+                               goto exit;
+               }
+       }
+
+       ret = 0;
+
+exit:
+       kfree(configs);
+       return ret;
+}
+
+static int samsung_dt_node_to_map(struct pinctrl_dev *pctldev,
+                                       struct device_node *np_config,
+                                       struct pinctrl_map **map,
+                                       unsigned *num_maps)
+{
+       struct samsung_pinctrl_drv_data *drvdata;
+       unsigned reserved_maps;
+       struct device_node *np;
+       int ret;
+
+       drvdata = pinctrl_dev_get_drvdata(pctldev);
+
+       reserved_maps = 0;
+       *map = NULL;
+       *num_maps = 0;
+
+       if (!of_get_child_count(np_config))
+               return samsung_dt_subnode_to_map(drvdata, pctldev->dev,
+                                                       np_config, map,
+                                                       &reserved_maps,
+                                                       num_maps);
+
+       for_each_child_of_node(np_config, np) {
+               ret = samsung_dt_subnode_to_map(drvdata, pctldev->dev, np, map,
+                                               &reserved_maps, num_maps);
+               if (ret < 0) {
+                       samsung_dt_free_map(pctldev, *map, *num_maps);
+                       return ret;
+               }
+       }
+
+       return 0;
+}
+
+/* list of pinctrl callbacks for the pinctrl core */
+static const struct pinctrl_ops samsung_pctrl_ops = {
+       .get_groups_count       = samsung_get_group_count,
+       .get_group_name         = samsung_get_group_name,
+       .get_group_pins         = samsung_get_group_pins,
+       .dt_node_to_map         = samsung_dt_node_to_map,
+       .dt_free_map            = samsung_dt_free_map,
+};
+
+/* check if the selector is a valid pin function selector */
+static int samsung_get_functions_count(struct pinctrl_dev *pctldev)
+{
+       struct samsung_pinctrl_drv_data *drvdata;
+
+       drvdata = pinctrl_dev_get_drvdata(pctldev);
+       return drvdata->nr_functions;
+}
+
+/* return the name of the pin function specified */
+static const char *samsung_pinmux_get_fname(struct pinctrl_dev *pctldev,
+                                               unsigned selector)
+{
+       struct samsung_pinctrl_drv_data *drvdata;
+
+       drvdata = pinctrl_dev_get_drvdata(pctldev);
+       return drvdata->pmx_functions[selector].name;
+}
+
+/* return the groups associated for the specified function selector */
+static int samsung_pinmux_get_groups(struct pinctrl_dev *pctldev,
+               unsigned selector, const char * const **groups,
+               unsigned * const num_groups)
+{
+       struct samsung_pinctrl_drv_data *drvdata;
+
+       drvdata = pinctrl_dev_get_drvdata(pctldev);
+       *groups = drvdata->pmx_functions[selector].groups;
+       *num_groups = drvdata->pmx_functions[selector].num_groups;
+       return 0;
+}
+
+/*
+ * given a pin number that is local to a pin controller, find out the pin bank
+ * and the register base of the pin bank.
+ */
+static void pin_to_reg_bank(struct samsung_pinctrl_drv_data *drvdata,
+                       unsigned pin, void __iomem **reg, u32 *offset,
+                       struct samsung_pin_bank **bank)
+{
+       struct samsung_pin_bank *b;
+
+       b = drvdata->ctrl->pin_banks;
+
+       while ((pin >= b->pin_base) &&
+                       ((b->pin_base + b->nr_pins - 1) < pin))
+               b++;
+
+       *reg = drvdata->virt_base + b->pctl_offset;
+       *offset = pin - b->pin_base;
+       if (bank)
+               *bank = b;
+}
+
+/* enable or disable a pinmux function */
+static void samsung_pinmux_setup(struct pinctrl_dev *pctldev, unsigned selector,
+                                       unsigned group, bool enable)
+{
+       struct samsung_pinctrl_drv_data *drvdata;
+       struct samsung_pin_bank_type *type;
+       struct samsung_pin_bank *bank;
+       void __iomem *reg;
+       u32 mask, shift, data, pin_offset;
+       unsigned long flags;
+       const struct samsung_pmx_func *func;
+       const struct samsung_pin_group *grp;
+
+       drvdata = pinctrl_dev_get_drvdata(pctldev);
+       func = &drvdata->pmx_functions[selector];
+       grp = &drvdata->pin_groups[group];
+
+       pin_to_reg_bank(drvdata, grp->pins[0] - drvdata->ctrl->base,
+                       &reg, &pin_offset, &bank);
+       type = bank->type;
+       mask = (1 << type->fld_width[PINCFG_TYPE_FUNC]) - 1;
+       shift = pin_offset * type->fld_width[PINCFG_TYPE_FUNC];
+       if (shift >= 32) {
+               /* Some banks have two config registers */
+               shift -= 32;
+               reg += 4;
+       }
+
+       spin_lock_irqsave(&bank->slock, flags);
+
+       data = readl(reg + type->reg_offset[PINCFG_TYPE_FUNC]);
+       data &= ~(mask << shift);
+       if (enable)
+               data |= func->val << shift;
+       writel(data, reg + type->reg_offset[PINCFG_TYPE_FUNC]);
+
+       spin_unlock_irqrestore(&bank->slock, flags);
+}
+
+/* enable a specified pinmux by writing to registers */
+static int samsung_pinmux_enable(struct pinctrl_dev *pctldev, unsigned selector,
+                                       unsigned group)
+{
+       samsung_pinmux_setup(pctldev, selector, group, true);
+       return 0;
+}
+
+/* list of pinmux callbacks for the pinmux vertical in pinctrl core */
+static const struct pinmux_ops samsung_pinmux_ops = {
+       .get_functions_count    = samsung_get_functions_count,
+       .get_function_name      = samsung_pinmux_get_fname,
+       .get_function_groups    = samsung_pinmux_get_groups,
+       .enable                 = samsung_pinmux_enable,
+};
+
+/* set or get the pin config settings for a specified pin */
+static int samsung_pinconf_rw(struct pinctrl_dev *pctldev, unsigned int pin,
+                               unsigned long *config, bool set)
+{
+       struct samsung_pinctrl_drv_data *drvdata;
+       struct samsung_pin_bank_type *type;
+       struct samsung_pin_bank *bank;
+       void __iomem *reg_base;
+       enum pincfg_type cfg_type = PINCFG_UNPACK_TYPE(*config);
+       u32 data, width, pin_offset, mask, shift;
+       u32 cfg_value, cfg_reg;
+       unsigned long flags;
+
+       drvdata = pinctrl_dev_get_drvdata(pctldev);
+       pin_to_reg_bank(drvdata, pin - drvdata->ctrl->base, &reg_base,
+                                       &pin_offset, &bank);
+       type = bank->type;
+
+       if (cfg_type >= PINCFG_TYPE_NUM || !type->fld_width[cfg_type])
+               return -EINVAL;
+
+       width = type->fld_width[cfg_type];
+       cfg_reg = type->reg_offset[cfg_type];
+
+       spin_lock_irqsave(&bank->slock, flags);
+
+       mask = (1 << width) - 1;
+       shift = pin_offset * width;
+       data = readl(reg_base + cfg_reg);
+
+       if (set) {
+               cfg_value = PINCFG_UNPACK_VALUE(*config);
+               data &= ~(mask << shift);
+               data |= (cfg_value << shift);
+               writel(data, reg_base + cfg_reg);
+       } else {
+               data >>= shift;
+               data &= mask;
+               *config = PINCFG_PACK(cfg_type, data);
+       }
+
+       spin_unlock_irqrestore(&bank->slock, flags);
+
+       return 0;
+}
+
+/* set the pin config settings for a specified pin */
+static int samsung_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
+                               unsigned long *configs, unsigned num_configs)
+{
+       int i, ret;
+
+       for (i = 0; i < num_configs; i++) {
+               ret = samsung_pinconf_rw(pctldev, pin, &configs[i], true);
+               if (ret < 0)
+                       return ret;
+       } /* for each config */
+
+       return 0;
+}
+
+/* get the pin config settings for a specified pin */
+static int samsung_pinconf_get(struct pinctrl_dev *pctldev, unsigned int pin,
+                                       unsigned long *config)
+{
+       return samsung_pinconf_rw(pctldev, pin, config, false);
+}
+
+/* set the pin config settings for a specified pin group */
+static int samsung_pinconf_group_set(struct pinctrl_dev *pctldev,
+                       unsigned group, unsigned long *configs,
+                       unsigned num_configs)
+{
+       struct samsung_pinctrl_drv_data *drvdata;
+       const unsigned int *pins;
+       unsigned int cnt;
+
+       drvdata = pinctrl_dev_get_drvdata(pctldev);
+       pins = drvdata->pin_groups[group].pins;
+
+       for (cnt = 0; cnt < drvdata->pin_groups[group].num_pins; cnt++)
+               samsung_pinconf_set(pctldev, pins[cnt], configs, num_configs);
+
+       return 0;
+}
+
+/* get the pin config settings for a specified pin group */
+static int samsung_pinconf_group_get(struct pinctrl_dev *pctldev,
+                               unsigned int group, unsigned long *config)
+{
+       struct samsung_pinctrl_drv_data *drvdata;
+       const unsigned int *pins;
+
+       drvdata = pinctrl_dev_get_drvdata(pctldev);
+       pins = drvdata->pin_groups[group].pins;
+       samsung_pinconf_get(pctldev, pins[0], config);
+       return 0;
+}
+
+/* list of pinconfig callbacks for pinconfig vertical in the pinctrl code */
+static const struct pinconf_ops samsung_pinconf_ops = {
+       .pin_config_get         = samsung_pinconf_get,
+       .pin_config_set         = samsung_pinconf_set,
+       .pin_config_group_get   = samsung_pinconf_group_get,
+       .pin_config_group_set   = samsung_pinconf_group_set,
+};
+
+/* gpiolib gpio_set callback function */
+static void samsung_gpio_set(struct gpio_chip *gc, unsigned offset, int value)
+{
+       struct samsung_pin_bank *bank = gc_to_pin_bank(gc);
+       struct samsung_pin_bank_type *type = bank->type;
+       unsigned long flags;
+       void __iomem *reg;
+       u32 data;
+
+       reg = bank->drvdata->virt_base + bank->pctl_offset;
+
+       spin_lock_irqsave(&bank->slock, flags);
+
+       data = readl(reg + type->reg_offset[PINCFG_TYPE_DAT]);
+       data &= ~(1 << offset);
+       if (value)
+               data |= 1 << offset;
+       writel(data, reg + type->reg_offset[PINCFG_TYPE_DAT]);
+
+       spin_unlock_irqrestore(&bank->slock, flags);
+}
+
+/* gpiolib gpio_get callback function */
+static int samsung_gpio_get(struct gpio_chip *gc, unsigned offset)
+{
+       void __iomem *reg;
+       u32 data;
+       struct samsung_pin_bank *bank = gc_to_pin_bank(gc);
+       struct samsung_pin_bank_type *type = bank->type;
+
+       reg = bank->drvdata->virt_base + bank->pctl_offset;
+
+       data = readl(reg + type->reg_offset[PINCFG_TYPE_DAT]);
+       data >>= offset;
+       data &= 1;
+       return data;
+}
+
+/*
+ * The calls to gpio_direction_output() and gpio_direction_input()
+ * leads to this function call.
+ */
+static int samsung_gpio_set_direction(struct gpio_chip *gc,
+                                            unsigned offset, bool input)
+{
+       struct samsung_pin_bank_type *type;
+       struct samsung_pin_bank *bank;
+       struct samsung_pinctrl_drv_data *drvdata;
+       void __iomem *reg;
+       u32 data, mask, shift;
+       unsigned long flags;
+
+       bank = gc_to_pin_bank(gc);
+       type = bank->type;
+       drvdata = bank->drvdata;
+
+       reg = drvdata->virt_base + bank->pctl_offset +
+                                       type->reg_offset[PINCFG_TYPE_FUNC];
+
+       mask = (1 << type->fld_width[PINCFG_TYPE_FUNC]) - 1;
+       shift = offset * type->fld_width[PINCFG_TYPE_FUNC];
+       if (shift >= 32) {
+               /* Some banks have two config registers */
+               shift -= 32;
+               reg += 4;
+       }
+
+       spin_lock_irqsave(&bank->slock, flags);
+
+       data = readl(reg);
+       data &= ~(mask << shift);
+       if (!input)
+               data |= FUNC_OUTPUT << shift;
+       writel(data, reg);
+
+       spin_unlock_irqrestore(&bank->slock, flags);
+
+       return 0;
+}
+
+/* gpiolib gpio_direction_input callback function. */
+static int samsung_gpio_direction_input(struct gpio_chip *gc, unsigned offset)
+{
+       return samsung_gpio_set_direction(gc, offset, true);
+}
+
+/* gpiolib gpio_direction_output callback function. */
+static int samsung_gpio_direction_output(struct gpio_chip *gc, unsigned offset,
+                                                       int value)
+{
+       samsung_gpio_set(gc, offset, value);
+       return samsung_gpio_set_direction(gc, offset, false);
+}
+
+/*
+ * gpiolib gpio_to_irq callback function. Creates a mapping between a GPIO pin
+ * and a virtual IRQ, if not already present.
+ */
+static int samsung_gpio_to_irq(struct gpio_chip *gc, unsigned offset)
+{
+       struct samsung_pin_bank *bank = gc_to_pin_bank(gc);
+       unsigned int virq;
+
+       if (!bank->irq_domain)
+               return -ENXIO;
+
+       virq = irq_create_mapping(bank->irq_domain, offset);
+
+       return (virq) ? : -ENXIO;
+}
+
+static struct samsung_pin_group *samsung_pinctrl_create_groups(
+                               struct device *dev,
+                               struct samsung_pinctrl_drv_data *drvdata,
+                               unsigned int *cnt)
+{
+       struct pinctrl_desc *ctrldesc = &drvdata->pctl;
+       struct samsung_pin_group *groups, *grp;
+       const struct pinctrl_pin_desc *pdesc;
+       int i;
+
+       groups = devm_kzalloc(dev, ctrldesc->npins * sizeof(*groups),
+                               GFP_KERNEL);
+       if (!groups)
+               return ERR_PTR(-EINVAL);
+       grp = groups;
+
+       pdesc = ctrldesc->pins;
+       for (i = 0; i < ctrldesc->npins; ++i, ++pdesc, ++grp) {
+               grp->name = pdesc->name;
+               grp->pins = &pdesc->number;
+               grp->num_pins = 1;
+       }
+
+       *cnt = ctrldesc->npins;
+       return groups;
+}
+
+static int samsung_pinctrl_create_function(struct device *dev,
+                               struct samsung_pinctrl_drv_data *drvdata,
+                               struct device_node *func_np,
+                               struct samsung_pmx_func *func)
+{
+       int npins;
+       int ret;
+       int i;
+
+       if (of_property_read_u32(func_np, "samsung,pin-function", &func->val))
+               return 0;
+
+       npins = of_property_count_strings(func_np, "samsung,pins");
+       if (npins < 1) {
+               dev_err(dev, "invalid pin list in %s node", func_np->name);
+               return -EINVAL;
+       }
+
+       func->name = func_np->full_name;
+
+       func->groups = devm_kzalloc(dev, npins * sizeof(char *), GFP_KERNEL);
+       if (!func->groups)
+               return -ENOMEM;
+
+       for (i = 0; i < npins; ++i) {
+               const char *gname;
+
+               ret = of_property_read_string_index(func_np, "samsung,pins",
+                                                       i, &gname);
+               if (ret) {
+                       dev_err(dev,
+                               "failed to read pin name %d from %s node\n",
+                               i, func_np->name);
+                       return ret;
+               }
+
+               func->groups[i] = gname;
+       }
+
+       func->num_groups = npins;
+       return 1;
+}
+
+static struct samsung_pmx_func *samsung_pinctrl_create_functions(
+                               struct device *dev,
+                               struct samsung_pinctrl_drv_data *drvdata,
+                               unsigned int *cnt)
+{
+       struct samsung_pmx_func *functions, *func;
+       struct device_node *dev_np = dev->of_node;
+       struct device_node *cfg_np;
+       unsigned int func_cnt = 0;
+       int ret;
+
+       /*
+        * Iterate over all the child nodes of the pin controller node
+        * and create pin groups and pin function lists.
+        */
+       for_each_child_of_node(dev_np, cfg_np) {
+               struct device_node *func_np;
+
+               if (!of_get_child_count(cfg_np)) {
+                       if (!of_find_property(cfg_np,
+                           "samsung,pin-function", NULL))
+                               continue;
+                       ++func_cnt;
+                       continue;
+               }
+
+               for_each_child_of_node(cfg_np, func_np) {
+                       if (!of_find_property(func_np,
+                           "samsung,pin-function", NULL))
+                               continue;
+                       ++func_cnt;
+               }
+       }
+
+       functions = devm_kzalloc(dev, func_cnt * sizeof(*functions),
+                                       GFP_KERNEL);
+       if (!functions) {
+               dev_err(dev, "failed to allocate memory for function list\n");
+               return ERR_PTR(-EINVAL);
+       }
+       func = functions;
+
+       /*
+        * Iterate over all the child nodes of the pin controller node
+        * and create pin groups and pin function lists.
+        */
+       func_cnt = 0;
+       for_each_child_of_node(dev_np, cfg_np) {
+               struct device_node *func_np;
+
+               if (!of_get_child_count(cfg_np)) {
+                       ret = samsung_pinctrl_create_function(dev, drvdata,
+                                                       cfg_np, func);
+                       if (ret < 0)
+                               return ERR_PTR(ret);
+                       if (ret > 0) {
+                               ++func;
+                               ++func_cnt;
+                       }
+                       continue;
+               }
+
+               for_each_child_of_node(cfg_np, func_np) {
+                       ret = samsung_pinctrl_create_function(dev, drvdata,
+                                               func_np, func);
+                       if (ret < 0)
+                               return ERR_PTR(ret);
+                       if (ret > 0) {
+                               ++func;
+                               ++func_cnt;
+                       }
+               }
+       }
+
+       *cnt = func_cnt;
+       return functions;
+}
+
+/*
+ * Parse the information about all the available pin groups and pin functions
+ * from device node of the pin-controller. A pin group is formed with all
+ * the pins listed in the "samsung,pins" property.
+ */
+
+static int samsung_pinctrl_parse_dt(struct platform_device *pdev,
+                                   struct samsung_pinctrl_drv_data *drvdata)
+{
+       struct device *dev = &pdev->dev;
+       struct samsung_pin_group *groups;
+       struct samsung_pmx_func *functions;
+       unsigned int grp_cnt = 0, func_cnt = 0;
+
+       groups = samsung_pinctrl_create_groups(dev, drvdata, &grp_cnt);
+       if (IS_ERR(groups)) {
+               dev_err(dev, "failed to parse pin groups\n");
+               return PTR_ERR(groups);
+       }
+
+       functions = samsung_pinctrl_create_functions(dev, drvdata, &func_cnt);
+       if (IS_ERR(functions)) {
+               dev_err(dev, "failed to parse pin functions\n");
+               return PTR_ERR(groups);
+       }
+
+       drvdata->pin_groups = groups;
+       drvdata->nr_groups = grp_cnt;
+       drvdata->pmx_functions = functions;
+       drvdata->nr_functions = func_cnt;
+
+       return 0;
+}
+
+/* register the pinctrl interface with the pinctrl subsystem */
+static int samsung_pinctrl_register(struct platform_device *pdev,
+                                   struct samsung_pinctrl_drv_data *drvdata)
+{
+       struct pinctrl_desc *ctrldesc = &drvdata->pctl;
+       struct pinctrl_pin_desc *pindesc, *pdesc;
+       struct samsung_pin_bank *pin_bank;
+       char *pin_names;
+       int pin, bank, ret;
+
+       ctrldesc->name = "samsung-pinctrl";
+       ctrldesc->owner = THIS_MODULE;
+       ctrldesc->pctlops = &samsung_pctrl_ops;
+       ctrldesc->pmxops = &samsung_pinmux_ops;
+       ctrldesc->confops = &samsung_pinconf_ops;
+
+       pindesc = devm_kzalloc(&pdev->dev, sizeof(*pindesc) *
+                       drvdata->ctrl->nr_pins, GFP_KERNEL);
+       if (!pindesc) {
+               dev_err(&pdev->dev, "mem alloc for pin descriptors failed\n");
+               return -ENOMEM;
+       }
+       ctrldesc->pins = pindesc;
+       ctrldesc->npins = drvdata->ctrl->nr_pins;
+
+       /* dynamically populate the pin number and pin name for pindesc */
+       for (pin = 0, pdesc = pindesc; pin < ctrldesc->npins; pin++, pdesc++)
+               pdesc->number = pin + drvdata->ctrl->base;
+
+       /*
+        * allocate space for storing the dynamically generated names for all
+        * the pins which belong to this pin-controller.
+        */
+       pin_names = devm_kzalloc(&pdev->dev, sizeof(char) * PIN_NAME_LENGTH *
+                                       drvdata->ctrl->nr_pins, GFP_KERNEL);
+       if (!pin_names) {
+               dev_err(&pdev->dev, "mem alloc for pin names failed\n");
+               return -ENOMEM;
+       }
+
+       /* for each pin, the name of the pin is pin-bank name + pin number */
+       for (bank = 0; bank < drvdata->ctrl->nr_banks; bank++) {
+               pin_bank = &drvdata->ctrl->pin_banks[bank];
+               for (pin = 0; pin < pin_bank->nr_pins; pin++) {
+                       sprintf(pin_names, "%s-%d", pin_bank->name, pin);
+                       pdesc = pindesc + pin_bank->pin_base + pin;
+                       pdesc->name = pin_names;
+                       pin_names += PIN_NAME_LENGTH;
+               }
+       }
+
+       ret = samsung_pinctrl_parse_dt(pdev, drvdata);
+       if (ret)
+               return ret;
+
+       drvdata->pctl_dev = pinctrl_register(ctrldesc, &pdev->dev, drvdata);
+       if (!drvdata->pctl_dev) {
+               dev_err(&pdev->dev, "could not register pinctrl driver\n");
+               return -EINVAL;
+       }
+
+       for (bank = 0; bank < drvdata->ctrl->nr_banks; ++bank) {
+               pin_bank = &drvdata->ctrl->pin_banks[bank];
+               pin_bank->grange.name = pin_bank->name;
+               pin_bank->grange.id = bank;
+               pin_bank->grange.pin_base = drvdata->ctrl->base
+                                               + pin_bank->pin_base;
+               pin_bank->grange.base = pin_bank->gpio_chip.base;
+               pin_bank->grange.npins = pin_bank->gpio_chip.ngpio;
+               pin_bank->grange.gc = &pin_bank->gpio_chip;
+               pinctrl_add_gpio_range(drvdata->pctl_dev, &pin_bank->grange);
+       }
+
+       return 0;
+}
+
+static int samsung_gpio_request(struct gpio_chip *chip, unsigned offset)
+{
+       return pinctrl_request_gpio(chip->base + offset);
+}
+
+static void samsung_gpio_free(struct gpio_chip *chip, unsigned offset)
+{
+       pinctrl_free_gpio(chip->base + offset);
+}
+
+static const struct gpio_chip samsung_gpiolib_chip = {
+       .request = samsung_gpio_request,
+       .free = samsung_gpio_free,
+       .set = samsung_gpio_set,
+       .get = samsung_gpio_get,
+       .direction_input = samsung_gpio_direction_input,
+       .direction_output = samsung_gpio_direction_output,
+       .to_irq = samsung_gpio_to_irq,
+       .owner = THIS_MODULE,
+};
+
+/* register the gpiolib interface with the gpiolib subsystem */
+static int samsung_gpiolib_register(struct platform_device *pdev,
+                                   struct samsung_pinctrl_drv_data *drvdata)
+{
+       struct samsung_pin_ctrl *ctrl = drvdata->ctrl;
+       struct samsung_pin_bank *bank = ctrl->pin_banks;
+       struct gpio_chip *gc;
+       int ret;
+       int i;
+
+       for (i = 0; i < ctrl->nr_banks; ++i, ++bank) {
+               bank->gpio_chip = samsung_gpiolib_chip;
+
+               gc = &bank->gpio_chip;
+               gc->base = ctrl->base + bank->pin_base;
+               gc->ngpio = bank->nr_pins;
+               gc->dev = &pdev->dev;
+               gc->of_node = bank->of_node;
+               gc->label = bank->name;
+
+               ret = gpiochip_add(gc);
+               if (ret) {
+                       dev_err(&pdev->dev, "failed to register gpio_chip %s, error code: %d\n",
+                                                       gc->label, ret);
+                       goto fail;
+               }
+       }
+
+       return 0;
+
+fail:
+       for (--i, --bank; i >= 0; --i, --bank)
+               if (gpiochip_remove(&bank->gpio_chip))
+                       dev_err(&pdev->dev, "gpio chip %s remove failed\n",
+                                                       bank->gpio_chip.label);
+       return ret;
+}
+
+/* unregister the gpiolib interface with the gpiolib subsystem */
+static int samsung_gpiolib_unregister(struct platform_device *pdev,
+                                     struct samsung_pinctrl_drv_data *drvdata)
+{
+       struct samsung_pin_ctrl *ctrl = drvdata->ctrl;
+       struct samsung_pin_bank *bank = ctrl->pin_banks;
+       int ret = 0;
+       int i;
+
+       for (i = 0; !ret && i < ctrl->nr_banks; ++i, ++bank)
+               ret = gpiochip_remove(&bank->gpio_chip);
+
+       if (ret)
+               dev_err(&pdev->dev, "gpio chip remove failed\n");
+
+       return ret;
+}
+
+static const struct of_device_id samsung_pinctrl_dt_match[];
+
+/* retrieve the soc specific data */
+static struct samsung_pin_ctrl *samsung_pinctrl_get_soc_data(
+                               struct samsung_pinctrl_drv_data *d,
+                               struct platform_device *pdev)
+{
+       int id;
+       const struct of_device_id *match;
+       struct device_node *node = pdev->dev.of_node;
+       struct device_node *np;
+       struct samsung_pin_ctrl *ctrl;
+       struct samsung_pin_bank *bank;
+       int i;
+
+       id = of_alias_get_id(node, "pinctrl");
+       if (id < 0) {
+               dev_err(&pdev->dev, "failed to get alias id\n");
+               return NULL;
+       }
+       match = of_match_node(samsung_pinctrl_dt_match, node);
+       ctrl = (struct samsung_pin_ctrl *)match->data + id;
+
+       bank = ctrl->pin_banks;
+       for (i = 0; i < ctrl->nr_banks; ++i, ++bank) {
+               spin_lock_init(&bank->slock);
+               bank->drvdata = d;
+               bank->pin_base = ctrl->nr_pins;
+               ctrl->nr_pins += bank->nr_pins;
+       }
+
+       for_each_child_of_node(node, np) {
+               if (!of_find_property(np, "gpio-controller", NULL))
+                       continue;
+               bank = ctrl->pin_banks;
+               for (i = 0; i < ctrl->nr_banks; ++i, ++bank) {
+                       if (!strcmp(bank->name, np->name)) {
+                               bank->of_node = np;
+                               break;
+                       }
+               }
+       }
+
+       ctrl->base = pin_base;
+       pin_base += ctrl->nr_pins;
+
+       return ctrl;
+}
+
+static int samsung_pinctrl_probe(struct platform_device *pdev)
+{
+       struct samsung_pinctrl_drv_data *drvdata;
+       struct device *dev = &pdev->dev;
+       struct samsung_pin_ctrl *ctrl;
+       struct resource *res;
+       int ret;
+
+       if (!dev->of_node) {
+               dev_err(dev, "device tree node not found\n");
+               return -ENODEV;
+       }
+
+       drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL);
+       if (!drvdata) {
+               dev_err(dev, "failed to allocate memory for driver's "
+                               "private data\n");
+               return -ENOMEM;
+       }
+
+       ctrl = samsung_pinctrl_get_soc_data(drvdata, pdev);
+       if (!ctrl) {
+               dev_err(&pdev->dev, "driver data not available\n");
+               return -EINVAL;
+       }
+       drvdata->ctrl = ctrl;
+       drvdata->dev = dev;
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       drvdata->virt_base = devm_ioremap_resource(&pdev->dev, res);
+       if (IS_ERR(drvdata->virt_base))
+               return PTR_ERR(drvdata->virt_base);
+
+       res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
+       if (res)
+               drvdata->irq = res->start;
+
+       ret = samsung_gpiolib_register(pdev, drvdata);
+       if (ret)
+               return ret;
+
+       ret = samsung_pinctrl_register(pdev, drvdata);
+       if (ret) {
+               samsung_gpiolib_unregister(pdev, drvdata);
+               return ret;
+       }
+
+       if (ctrl->eint_gpio_init)
+               ctrl->eint_gpio_init(drvdata);
+       if (ctrl->eint_wkup_init)
+               ctrl->eint_wkup_init(drvdata);
+
+       platform_set_drvdata(pdev, drvdata);
+
+       /* Add to the global list */
+       list_add_tail(&drvdata->node, &drvdata_list);
+
+       return 0;
+}
+
+#ifdef CONFIG_PM
+
+/**
+ * samsung_pinctrl_suspend_dev - save pinctrl state for suspend for a device
+ *
+ * Save data for all banks handled by this device.
+ */
+static void samsung_pinctrl_suspend_dev(
+       struct samsung_pinctrl_drv_data *drvdata)
+{
+       struct samsung_pin_ctrl *ctrl = drvdata->ctrl;
+       void __iomem *virt_base = drvdata->virt_base;
+       int i;
+
+       for (i = 0; i < ctrl->nr_banks; i++) {
+               struct samsung_pin_bank *bank = &ctrl->pin_banks[i];
+               void __iomem *reg = virt_base + bank->pctl_offset;
+
+               u8 *offs = bank->type->reg_offset;
+               u8 *widths = bank->type->fld_width;
+               enum pincfg_type type;
+
+               /* Registers without a powerdown config aren't lost */
+               if (!widths[PINCFG_TYPE_CON_PDN])
+                       continue;
+
+               for (type = 0; type < PINCFG_TYPE_NUM; type++)
+                       if (widths[type])
+                               bank->pm_save[type] = readl(reg + offs[type]);
+
+               if (widths[PINCFG_TYPE_FUNC] * bank->nr_pins > 32) {
+                       /* Some banks have two config registers */
+                       bank->pm_save[PINCFG_TYPE_NUM] =
+                               readl(reg + offs[PINCFG_TYPE_FUNC] + 4);
+                       pr_debug("Save %s @ %p (con %#010x %08x)\n",
+                                bank->name, reg,
+                                bank->pm_save[PINCFG_TYPE_FUNC],
+                                bank->pm_save[PINCFG_TYPE_NUM]);
+               } else {
+                       pr_debug("Save %s @ %p (con %#010x)\n", bank->name,
+                                reg, bank->pm_save[PINCFG_TYPE_FUNC]);
+               }
+       }
+
+       if (ctrl->suspend)
+               ctrl->suspend(drvdata);
+}
+
+/**
+ * samsung_pinctrl_resume_dev - restore pinctrl state from suspend for a device
+ *
+ * Restore one of the banks that was saved during suspend.
+ *
+ * We don't bother doing anything complicated to avoid glitching lines since
+ * we're called before pad retention is turned off.
+ */
+static void samsung_pinctrl_resume_dev(struct samsung_pinctrl_drv_data *drvdata)
+{
+       struct samsung_pin_ctrl *ctrl = drvdata->ctrl;
+       void __iomem *virt_base = drvdata->virt_base;
+       int i;
+
+       if (ctrl->resume)
+               ctrl->resume(drvdata);
+
+       for (i = 0; i < ctrl->nr_banks; i++) {
+               struct samsung_pin_bank *bank = &ctrl->pin_banks[i];
+               void __iomem *reg = virt_base + bank->pctl_offset;
+
+               u8 *offs = bank->type->reg_offset;
+               u8 *widths = bank->type->fld_width;
+               enum pincfg_type type;
+
+               /* Registers without a powerdown config aren't lost */
+               if (!widths[PINCFG_TYPE_CON_PDN])
+                       continue;
+
+               if (widths[PINCFG_TYPE_FUNC] * bank->nr_pins > 32) {
+                       /* Some banks have two config registers */
+                       pr_debug("%s @ %p (con %#010x %08x => %#010x %08x)\n",
+                                bank->name, reg,
+                                readl(reg + offs[PINCFG_TYPE_FUNC]),
+                                readl(reg + offs[PINCFG_TYPE_FUNC] + 4),
+                                bank->pm_save[PINCFG_TYPE_FUNC],
+                                bank->pm_save[PINCFG_TYPE_NUM]);
+                       writel(bank->pm_save[PINCFG_TYPE_NUM],
+                              reg + offs[PINCFG_TYPE_FUNC] + 4);
+               } else {
+                       pr_debug("%s @ %p (con %#010x => %#010x)\n", bank->name,
+                                reg, readl(reg + offs[PINCFG_TYPE_FUNC]),
+                                bank->pm_save[PINCFG_TYPE_FUNC]);
+               }
+               for (type = 0; type < PINCFG_TYPE_NUM; type++)
+                       if (widths[type])
+                               writel(bank->pm_save[type], reg + offs[type]);
+       }
+}
+
+/**
+ * samsung_pinctrl_suspend - save pinctrl state for suspend
+ *
+ * Save data for all banks across all devices.
+ */
+static int samsung_pinctrl_suspend(void)
+{
+       struct samsung_pinctrl_drv_data *drvdata;
+
+       list_for_each_entry(drvdata, &drvdata_list, node) {
+               samsung_pinctrl_suspend_dev(drvdata);
+       }
+
+       return 0;
+}
+
+/**
+ * samsung_pinctrl_resume - restore pinctrl state for suspend
+ *
+ * Restore data for all banks across all devices.
+ */
+static void samsung_pinctrl_resume(void)
+{
+       struct samsung_pinctrl_drv_data *drvdata;
+
+       list_for_each_entry_reverse(drvdata, &drvdata_list, node) {
+               samsung_pinctrl_resume_dev(drvdata);
+       }
+}
+
+#else
+#define samsung_pinctrl_suspend                NULL
+#define samsung_pinctrl_resume         NULL
+#endif
+
+static struct syscore_ops samsung_pinctrl_syscore_ops = {
+       .suspend        = samsung_pinctrl_suspend,
+       .resume         = samsung_pinctrl_resume,
+};
+
+static const struct of_device_id samsung_pinctrl_dt_match[] = {
+#ifdef CONFIG_PINCTRL_EXYNOS
+       { .compatible = "samsung,exynos3250-pinctrl",
+               .data = (void *)exynos3250_pin_ctrl },
+       { .compatible = "samsung,exynos4210-pinctrl",
+               .data = (void *)exynos4210_pin_ctrl },
+       { .compatible = "samsung,exynos4x12-pinctrl",
+               .data = (void *)exynos4x12_pin_ctrl },
+       { .compatible = "samsung,exynos5250-pinctrl",
+               .data = (void *)exynos5250_pin_ctrl },
+       { .compatible = "samsung,exynos5260-pinctrl",
+               .data = (void *)exynos5260_pin_ctrl },
+       { .compatible = "samsung,exynos5420-pinctrl",
+               .data = (void *)exynos5420_pin_ctrl },
+       { .compatible = "samsung,s5pv210-pinctrl",
+               .data = (void *)s5pv210_pin_ctrl },
+#endif
+#ifdef CONFIG_PINCTRL_S3C64XX
+       { .compatible = "samsung,s3c64xx-pinctrl",
+               .data = s3c64xx_pin_ctrl },
+#endif
+#ifdef CONFIG_PINCTRL_S3C24XX
+       { .compatible = "samsung,s3c2412-pinctrl",
+               .data = s3c2412_pin_ctrl },
+       { .compatible = "samsung,s3c2416-pinctrl",
+               .data = s3c2416_pin_ctrl },
+       { .compatible = "samsung,s3c2440-pinctrl",
+               .data = s3c2440_pin_ctrl },
+       { .compatible = "samsung,s3c2450-pinctrl",
+               .data = s3c2450_pin_ctrl },
+#endif
+       {},
+};
+MODULE_DEVICE_TABLE(of, samsung_pinctrl_dt_match);
+
+static struct platform_driver samsung_pinctrl_driver = {
+       .probe          = samsung_pinctrl_probe,
+       .driver = {
+               .name   = "samsung-pinctrl",
+               .owner  = THIS_MODULE,
+               .of_match_table = samsung_pinctrl_dt_match,
+       },
+};
+
+static int __init samsung_pinctrl_drv_register(void)
+{
+       /*
+        * Register syscore ops for save/restore of registers across suspend.
+        * It's important to ensure that this driver is running at an earlier
+        * initcall level than any arch-specific init calls that install syscore
+        * ops that turn off pad retention (like exynos_pm_resume).
+        */
+       register_syscore_ops(&samsung_pinctrl_syscore_ops);
+
+       return platform_driver_register(&samsung_pinctrl_driver);
+}
+postcore_initcall(samsung_pinctrl_drv_register);
+
+static void __exit samsung_pinctrl_drv_unregister(void)
+{
+       platform_driver_unregister(&samsung_pinctrl_driver);
+}
+module_exit(samsung_pinctrl_drv_unregister);
+
+MODULE_AUTHOR("Thomas Abraham <thomas.ab@samsung.com>");
+MODULE_DESCRIPTION("Samsung pinctrl driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/pinctrl/samsung/pinctrl-samsung.h b/drivers/pinctrl/samsung/pinctrl-samsung.h
new file mode 100644 (file)
index 0000000..2b88232
--- /dev/null
@@ -0,0 +1,251 @@
+/*
+ * pin-controller/pin-mux/pin-config/gpio-driver for Samsung's SoC's.
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd.
+ *             http://www.samsung.com
+ * Copyright (c) 2012 Linaro Ltd
+ *             http://www.linaro.org
+ *
+ * Author: Thomas Abraham <thomas.ab@samsung.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#ifndef __PINCTRL_SAMSUNG_H
+#define __PINCTRL_SAMSUNG_H
+
+#include <linux/pinctrl/pinctrl.h>
+#include <linux/pinctrl/pinmux.h>
+#include <linux/pinctrl/pinconf.h>
+#include <linux/pinctrl/consumer.h>
+#include <linux/pinctrl/machine.h>
+
+#include <linux/gpio.h>
+
+/* pinmux function number for pin as gpio output line */
+#define FUNC_OUTPUT    0x1
+
+/**
+ * enum pincfg_type - possible pin configuration types supported.
+ * @PINCFG_TYPE_FUNC: Function configuration.
+ * @PINCFG_TYPE_DAT: Pin value configuration.
+ * @PINCFG_TYPE_PUD: Pull up/down configuration.
+ * @PINCFG_TYPE_DRV: Drive strength configuration.
+ * @PINCFG_TYPE_CON_PDN: Pin function in power down mode.
+ * @PINCFG_TYPE_PUD_PDN: Pull up/down configuration in power down mode.
+ */
+enum pincfg_type {
+       PINCFG_TYPE_FUNC,
+       PINCFG_TYPE_DAT,
+       PINCFG_TYPE_PUD,
+       PINCFG_TYPE_DRV,
+       PINCFG_TYPE_CON_PDN,
+       PINCFG_TYPE_PUD_PDN,
+
+       PINCFG_TYPE_NUM
+};
+
+/*
+ * pin configuration (pull up/down and drive strength) type and its value are
+ * packed together into a 16-bits. The upper 8-bits represent the configuration
+ * type and the lower 8-bits hold the value of the configuration type.
+ */
+#define PINCFG_TYPE_MASK               0xFF
+#define PINCFG_VALUE_SHIFT             8
+#define PINCFG_VALUE_MASK              (0xFF << PINCFG_VALUE_SHIFT)
+#define PINCFG_PACK(type, value)       (((value) << PINCFG_VALUE_SHIFT) | type)
+#define PINCFG_UNPACK_TYPE(cfg)                ((cfg) & PINCFG_TYPE_MASK)
+#define PINCFG_UNPACK_VALUE(cfg)       (((cfg) & PINCFG_VALUE_MASK) >> \
+                                               PINCFG_VALUE_SHIFT)
+/**
+ * enum eint_type - possible external interrupt types.
+ * @EINT_TYPE_NONE: bank does not support external interrupts
+ * @EINT_TYPE_GPIO: bank supportes external gpio interrupts
+ * @EINT_TYPE_WKUP: bank supportes external wakeup interrupts
+ * @EINT_TYPE_WKUP_MUX: bank supports multiplexed external wakeup interrupts
+ *
+ * Samsung GPIO controller groups all the available pins into banks. The pins
+ * in a pin bank can support external gpio interrupts or external wakeup
+ * interrupts or no interrupts at all. From a software perspective, the only
+ * difference between external gpio and external wakeup interrupts is that
+ * the wakeup interrupts can additionally wakeup the system if it is in
+ * suspended state.
+ */
+enum eint_type {
+       EINT_TYPE_NONE,
+       EINT_TYPE_GPIO,
+       EINT_TYPE_WKUP,
+       EINT_TYPE_WKUP_MUX,
+};
+
+/* maximum length of a pin in pin descriptor (example: "gpa0-0") */
+#define PIN_NAME_LENGTH        10
+
+#define PIN_GROUP(n, p, f)                             \
+       {                                               \
+               .name           = n,                    \
+               .pins           = p,                    \
+               .num_pins       = ARRAY_SIZE(p),        \
+               .func           = f                     \
+       }
+
+#define PMX_FUNC(n, g)                                 \
+       {                                               \
+               .name           = n,                    \
+               .groups         = g,                    \
+               .num_groups     = ARRAY_SIZE(g),        \
+       }
+
+struct samsung_pinctrl_drv_data;
+
+/**
+ * struct samsung_pin_bank_type: pin bank type description
+ * @fld_width: widths of configuration bitfields (0 if unavailable)
+ * @reg_offset: offsets of configuration registers (don't care of width is 0)
+ */
+struct samsung_pin_bank_type {
+       u8 fld_width[PINCFG_TYPE_NUM];
+       u8 reg_offset[PINCFG_TYPE_NUM];
+};
+
+/**
+ * struct samsung_pin_bank: represent a controller pin-bank.
+ * @type: type of the bank (register offsets and bitfield widths)
+ * @pctl_offset: starting offset of the pin-bank registers.
+ * @pin_base: starting pin number of the bank.
+ * @nr_pins: number of pins included in this bank.
+ * @eint_func: function to set in CON register to configure pin as EINT.
+ * @eint_type: type of the external interrupt supported by the bank.
+ * @eint_mask: bit mask of pins which support EINT function.
+ * @name: name to be prefixed for each pin in this pin bank.
+ * @of_node: OF node of the bank.
+ * @drvdata: link to controller driver data
+ * @irq_domain: IRQ domain of the bank.
+ * @gpio_chip: GPIO chip of the bank.
+ * @grange: linux gpio pin range supported by this bank.
+ * @slock: spinlock protecting bank registers
+ * @pm_save: saved register values during suspend
+ */
+struct samsung_pin_bank {
+       struct samsung_pin_bank_type *type;
+       u32             pctl_offset;
+       u32             pin_base;
+       u8              nr_pins;
+       u8              eint_func;
+       enum eint_type  eint_type;
+       u32             eint_mask;
+       u32             eint_offset;
+       char            *name;
+       void            *soc_priv;
+       struct device_node *of_node;
+       struct samsung_pinctrl_drv_data *drvdata;
+       struct irq_domain *irq_domain;
+       struct gpio_chip gpio_chip;
+       struct pinctrl_gpio_range grange;
+       spinlock_t slock;
+
+       u32 pm_save[PINCFG_TYPE_NUM + 1]; /* +1 to handle double CON registers*/
+};
+
+/**
+ * struct samsung_pin_ctrl: represent a pin controller.
+ * @pin_banks: list of pin banks included in this controller.
+ * @nr_banks: number of pin banks.
+ * @base: starting system wide pin number.
+ * @nr_pins: number of pins supported by the controller.
+ * @eint_gpio_init: platform specific callback to setup the external gpio
+ *     interrupts for the controller.
+ * @eint_wkup_init: platform specific callback to setup the external wakeup
+ *     interrupts for the controller.
+ * @label: for debug information.
+ */
+struct samsung_pin_ctrl {
+       struct samsung_pin_bank *pin_banks;
+       u32             nr_banks;
+
+       u32             base;
+       u32             nr_pins;
+
+       int             (*eint_gpio_init)(struct samsung_pinctrl_drv_data *);
+       int             (*eint_wkup_init)(struct samsung_pinctrl_drv_data *);
+       void            (*suspend)(struct samsung_pinctrl_drv_data *);
+       void            (*resume)(struct samsung_pinctrl_drv_data *);
+
+       char            *label;
+};
+
+/**
+ * struct samsung_pinctrl_drv_data: wrapper for holding driver data together.
+ * @node: global list node
+ * @virt_base: register base address of the controller.
+ * @dev: device instance representing the controller.
+ * @irq: interrpt number used by the controller to notify gpio interrupts.
+ * @ctrl: pin controller instance managed by the driver.
+ * @pctl: pin controller descriptor registered with the pinctrl subsystem.
+ * @pctl_dev: cookie representing pinctrl device instance.
+ * @pin_groups: list of pin groups available to the driver.
+ * @nr_groups: number of such pin groups.
+ * @pmx_functions: list of pin functions available to the driver.
+ * @nr_function: number of such pin functions.
+ */
+struct samsung_pinctrl_drv_data {
+       struct list_head                node;
+       void __iomem                    *virt_base;
+       struct device                   *dev;
+       int                             irq;
+
+       struct samsung_pin_ctrl         *ctrl;
+       struct pinctrl_desc             pctl;
+       struct pinctrl_dev              *pctl_dev;
+
+       const struct samsung_pin_group  *pin_groups;
+       unsigned int                    nr_groups;
+       const struct samsung_pmx_func   *pmx_functions;
+       unsigned int                    nr_functions;
+};
+
+/**
+ * struct samsung_pin_group: represent group of pins of a pinmux function.
+ * @name: name of the pin group, used to lookup the group.
+ * @pins: the pins included in this group.
+ * @num_pins: number of pins included in this group.
+ * @func: the function number to be programmed when selected.
+ */
+struct samsung_pin_group {
+       const char              *name;
+       const unsigned int      *pins;
+       u8                      num_pins;
+       u8                      func;
+};
+
+/**
+ * struct samsung_pmx_func: represent a pin function.
+ * @name: name of the pin function, used to lookup the function.
+ * @groups: one or more names of pin groups that provide this function.
+ * @num_groups: number of groups included in @groups.
+ */
+struct samsung_pmx_func {
+       const char              *name;
+       const char              **groups;
+       u8                      num_groups;
+       u32                     val;
+};
+
+/* list of all exported SoC specific data */
+extern struct samsung_pin_ctrl exynos3250_pin_ctrl[];
+extern struct samsung_pin_ctrl exynos4210_pin_ctrl[];
+extern struct samsung_pin_ctrl exynos4x12_pin_ctrl[];
+extern struct samsung_pin_ctrl exynos5250_pin_ctrl[];
+extern struct samsung_pin_ctrl exynos5260_pin_ctrl[];
+extern struct samsung_pin_ctrl exynos5420_pin_ctrl[];
+extern struct samsung_pin_ctrl s3c64xx_pin_ctrl[];
+extern struct samsung_pin_ctrl s3c2412_pin_ctrl[];
+extern struct samsung_pin_ctrl s3c2416_pin_ctrl[];
+extern struct samsung_pin_ctrl s3c2440_pin_ctrl[];
+extern struct samsung_pin_ctrl s3c2450_pin_ctrl[];
+extern struct samsung_pin_ctrl s5pv210_pin_ctrl[];
+
+#endif /* __PINCTRL_SAMSUNG_H */
index a9288ab01f7ba50e2ee7a144fb7ad2c3038a1397..80f641ee4dea31468d60de86127b979947078c22 100644 (file)
@@ -409,11 +409,8 @@ int sh_pfc_register_gpiochip(struct sh_pfc *pfc)
 
 int sh_pfc_unregister_gpiochip(struct sh_pfc *pfc)
 {
-       int err;
-       int ret;
-
-       ret = gpiochip_remove(&pfc->gpio->gpio_chip);
-       err = gpiochip_remove(&pfc->func->gpio_chip);
+       gpiochip_remove(&pfc->gpio->gpio_chip);
+       gpiochip_remove(&pfc->func->gpio_chip);
 
-       return ret < 0 ? ret : err;
+       return 0;
 }
index 2e688dc4a3c8393a69928ba16a75828549ba7b96..576d41b459e97fd4f3675e2a8f1cf981a3a2b410 100644 (file)
@@ -1726,6 +1726,133 @@ static const unsigned int audio_clkout_mux[] = {
        AUDIO_CLKOUT_MARK,
 };
 
+/* - CAN -------------------------------------------------------------------- */
+
+static const unsigned int can0_data_pins[] = {
+       /* TX, RX */
+       RCAR_GP_PIN(3, 26), RCAR_GP_PIN(3, 29),
+};
+
+static const unsigned int can0_data_mux[] = {
+       CAN0_TX_MARK, CAN0_RX_MARK,
+};
+
+static const unsigned int can0_data_b_pins[] = {
+       /* TX, RX */
+       RCAR_GP_PIN(7, 4), RCAR_GP_PIN(7, 3),
+};
+
+static const unsigned int can0_data_b_mux[] = {
+       CAN0_TX_B_MARK, CAN0_RX_B_MARK,
+};
+
+static const unsigned int can0_data_c_pins[] = {
+       /* TX, RX */
+       RCAR_GP_PIN(5, 17), RCAR_GP_PIN(5, 18),
+};
+
+static const unsigned int can0_data_c_mux[] = {
+       CAN0_TX_C_MARK, CAN0_RX_C_MARK,
+};
+
+static const unsigned int can0_data_d_pins[] = {
+       /* TX, RX */
+       RCAR_GP_PIN(2, 26), RCAR_GP_PIN(2, 27),
+};
+
+static const unsigned int can0_data_d_mux[] = {
+       CAN0_TX_D_MARK, CAN0_RX_D_MARK,
+};
+
+static const unsigned int can0_data_e_pins[] = {
+       /* TX, RX */
+       RCAR_GP_PIN(4, 18), RCAR_GP_PIN(4, 28),
+};
+
+static const unsigned int can0_data_e_mux[] = {
+       CAN0_TX_E_MARK, CAN0_RX_E_MARK,
+};
+
+static const unsigned int can0_data_f_pins[] = {
+       /* TX, RX */
+       RCAR_GP_PIN(6, 7), RCAR_GP_PIN(6, 6),
+};
+
+static const unsigned int can0_data_f_mux[] = {
+       CAN0_TX_F_MARK, CAN0_RX_F_MARK,
+};
+
+static const unsigned int can1_data_pins[] = {
+       /* TX, RX */
+        RCAR_GP_PIN(3, 21), RCAR_GP_PIN(3, 20),
+};
+
+static const unsigned int can1_data_mux[] = {
+       CAN1_TX_MARK, CAN1_RX_MARK,
+};
+
+static const unsigned int can1_data_b_pins[] = {
+       /* TX, RX */
+       RCAR_GP_PIN(7, 8), RCAR_GP_PIN(7, 9),
+};
+
+static const unsigned int can1_data_b_mux[] = {
+       CAN1_TX_B_MARK, CAN1_RX_B_MARK,
+};
+
+static const unsigned int can1_data_c_pins[] = {
+       /* TX, RX */
+       RCAR_GP_PIN(5, 20), RCAR_GP_PIN(5, 19),
+};
+
+static const unsigned int can1_data_c_mux[] = {
+       CAN1_TX_C_MARK, CAN1_RX_C_MARK,
+};
+
+static const unsigned int can1_data_d_pins[] = {
+       /* TX, RX */
+        RCAR_GP_PIN(4, 29), RCAR_GP_PIN(4, 31),
+};
+
+static const unsigned int can1_data_d_mux[] = {
+       CAN1_TX_D_MARK, CAN1_RX_D_MARK,
+};
+
+static const unsigned int can_clk_pins[] = {
+       /* CLK */
+       RCAR_GP_PIN(7, 2),
+};
+
+static const unsigned int can_clk_mux[] = {
+       CAN_CLK_MARK,
+};
+
+static const unsigned int can_clk_b_pins[] = {
+       /* CLK */
+       RCAR_GP_PIN(5, 21),
+};
+
+static const unsigned int can_clk_b_mux[] = {
+       CAN_CLK_B_MARK,
+};
+
+static const unsigned int can_clk_c_pins[] = {
+       /* CLK */
+       RCAR_GP_PIN(4, 30),
+};
+
+static const unsigned int can_clk_c_mux[] = {
+       CAN_CLK_C_MARK,
+};
+
+static const unsigned int can_clk_d_pins[] = {
+       /* CLK */
+       RCAR_GP_PIN(7, 19),
+};
+
+static const unsigned int can_clk_d_mux[] = {
+       CAN_CLK_D_MARK,
+};
 
 /* - DU --------------------------------------------------------------------- */
 static const unsigned int du_rgb666_pins[] = {
@@ -1867,6 +1994,192 @@ static const unsigned int eth_rmii_mux[] = {
        ETH_RXD0_MARK, ETH_RXD1_MARK, ETH_RX_ER_MARK, ETH_CRS_DV_MARK,
        ETH_TXD0_MARK, ETH_TXD1_MARK, ETH_TX_EN_MARK, ETH_REFCLK_MARK,
 };
+
+/* - HSCIF0 ----------------------------------------------------------------- */
+static const unsigned int hscif0_data_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(7, 3), RCAR_GP_PIN(7, 4),
+};
+static const unsigned int hscif0_data_mux[] = {
+       HRX0_MARK, HTX0_MARK,
+};
+static const unsigned int hscif0_clk_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(7, 2),
+};
+static const unsigned int hscif0_clk_mux[] = {
+       HSCK0_MARK,
+};
+static const unsigned int hscif0_ctrl_pins[] = {
+       /* RTS, CTS */
+       RCAR_GP_PIN(7, 1), RCAR_GP_PIN(7, 0),
+};
+static const unsigned int hscif0_ctrl_mux[] = {
+       HRTS0_N_MARK, HCTS0_N_MARK,
+};
+static const unsigned int hscif0_data_b_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(3, 12), RCAR_GP_PIN(3, 15),
+};
+static const unsigned int hscif0_data_b_mux[] = {
+       HRX0_B_MARK, HTX0_B_MARK,
+};
+static const unsigned int hscif0_ctrl_b_pins[] = {
+       /* RTS, CTS */
+       RCAR_GP_PIN(3, 14), RCAR_GP_PIN(3, 13),
+};
+static const unsigned int hscif0_ctrl_b_mux[] = {
+       HRTS0_N_B_MARK, HCTS0_N_B_MARK,
+};
+static const unsigned int hscif0_data_c_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(2, 0), RCAR_GP_PIN(2, 1),
+};
+static const unsigned int hscif0_data_c_mux[] = {
+       HRX0_C_MARK, HTX0_C_MARK,
+};
+static const unsigned int hscif0_clk_c_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(5, 31),
+};
+static const unsigned int hscif0_clk_c_mux[] = {
+       HSCK0_C_MARK,
+};
+/* - HSCIF1 ----------------------------------------------------------------- */
+static const unsigned int hscif1_data_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(7, 5), RCAR_GP_PIN(7, 6),
+};
+static const unsigned int hscif1_data_mux[] = {
+       HRX1_MARK, HTX1_MARK,
+};
+static const unsigned int hscif1_clk_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(7, 7),
+};
+static const unsigned int hscif1_clk_mux[] = {
+       HSCK1_MARK,
+};
+static const unsigned int hscif1_ctrl_pins[] = {
+       /* RTS, CTS */
+       RCAR_GP_PIN(7, 9), RCAR_GP_PIN(7, 8),
+};
+static const unsigned int hscif1_ctrl_mux[] = {
+       HRTS1_N_MARK, HCTS1_N_MARK,
+};
+static const unsigned int hscif1_data_b_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(1, 17), RCAR_GP_PIN(1, 18),
+};
+static const unsigned int hscif1_data_b_mux[] = {
+       HRX1_B_MARK, HTX1_B_MARK,
+};
+static const unsigned int hscif1_data_c_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(7, 14), RCAR_GP_PIN(7, 15),
+};
+static const unsigned int hscif1_data_c_mux[] = {
+       HRX1_C_MARK, HTX1_C_MARK,
+};
+static const unsigned int hscif1_clk_c_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(7, 16),
+};
+static const unsigned int hscif1_clk_c_mux[] = {
+       HSCK1_C_MARK,
+};
+static const unsigned int hscif1_ctrl_c_pins[] = {
+       /* RTS, CTS */
+       RCAR_GP_PIN(7, 18), RCAR_GP_PIN(7, 17),
+};
+static const unsigned int hscif1_ctrl_c_mux[] = {
+       HRTS1_N_C_MARK, HCTS1_N_C_MARK,
+};
+static const unsigned int hscif1_data_d_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(4, 28), RCAR_GP_PIN(4, 18),
+};
+static const unsigned int hscif1_data_d_mux[] = {
+       HRX1_D_MARK, HTX1_D_MARK,
+};
+static const unsigned int hscif1_data_e_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(7, 14), RCAR_GP_PIN(7, 15),
+};
+static const unsigned int hscif1_data_e_mux[] = {
+       HRX1_C_MARK, HTX1_C_MARK,
+};
+static const unsigned int hscif1_clk_e_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(2, 6),
+};
+static const unsigned int hscif1_clk_e_mux[] = {
+       HSCK1_E_MARK,
+};
+static const unsigned int hscif1_ctrl_e_pins[] = {
+       /* RTS, CTS */
+       RCAR_GP_PIN(2, 8), RCAR_GP_PIN(2, 7),
+};
+static const unsigned int hscif1_ctrl_e_mux[] = {
+       HRTS1_N_E_MARK, HCTS1_N_E_MARK,
+};
+/* - HSCIF2 ----------------------------------------------------------------- */
+static const unsigned int hscif2_data_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(4, 16), RCAR_GP_PIN(4, 17),
+};
+static const unsigned int hscif2_data_mux[] = {
+       HRX2_MARK, HTX2_MARK,
+};
+static const unsigned int hscif2_clk_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(4, 15),
+};
+static const unsigned int hscif2_clk_mux[] = {
+       HSCK2_MARK,
+};
+static const unsigned int hscif2_ctrl_pins[] = {
+       /* RTS, CTS */
+       RCAR_GP_PIN(4, 14), RCAR_GP_PIN(4, 13),
+};
+static const unsigned int hscif2_ctrl_mux[] = {
+       HRTS2_N_MARK, HCTS2_N_MARK,
+};
+static const unsigned int hscif2_data_b_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(1, 20), RCAR_GP_PIN(1, 22),
+};
+static const unsigned int hscif2_data_b_mux[] = {
+       HRX2_B_MARK, HTX2_B_MARK,
+};
+static const unsigned int hscif2_ctrl_b_pins[] = {
+       /* RTS, CTS */
+       RCAR_GP_PIN(1, 23), RCAR_GP_PIN(1, 21),
+};
+static const unsigned int hscif2_ctrl_b_mux[] = {
+       HRTS2_N_B_MARK, HCTS2_N_B_MARK,
+};
+static const unsigned int hscif2_data_c_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(2, 0), RCAR_GP_PIN(2, 1),
+};
+static const unsigned int hscif2_data_c_mux[] = {
+       HRX2_C_MARK, HTX2_C_MARK,
+};
+static const unsigned int hscif2_clk_c_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(5, 31),
+};
+static const unsigned int hscif2_clk_c_mux[] = {
+       HSCK2_C_MARK,
+};
+static const unsigned int hscif2_data_d_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(1, 20), RCAR_GP_PIN(5, 31),
+};
+static const unsigned int hscif2_data_d_mux[] = {
+       HRX2_B_MARK, HTX2_D_MARK,
+};
 /* - I2C0 ------------------------------------------------------------------- */
 static const unsigned int i2c0_pins[] = {
        /* SCL, SDA */
@@ -3869,6 +4182,20 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {
        SH_PFC_PIN_GROUP(audio_clk_b_b),
        SH_PFC_PIN_GROUP(audio_clk_c),
        SH_PFC_PIN_GROUP(audio_clkout),
+       SH_PFC_PIN_GROUP(can0_data),
+       SH_PFC_PIN_GROUP(can0_data_b),
+       SH_PFC_PIN_GROUP(can0_data_c),
+       SH_PFC_PIN_GROUP(can0_data_d),
+       SH_PFC_PIN_GROUP(can0_data_e),
+       SH_PFC_PIN_GROUP(can0_data_f),
+       SH_PFC_PIN_GROUP(can1_data),
+       SH_PFC_PIN_GROUP(can1_data_b),
+       SH_PFC_PIN_GROUP(can1_data_c),
+       SH_PFC_PIN_GROUP(can1_data_d),
+       SH_PFC_PIN_GROUP(can_clk),
+       SH_PFC_PIN_GROUP(can_clk_b),
+       SH_PFC_PIN_GROUP(can_clk_c),
+       SH_PFC_PIN_GROUP(can_clk_d),
        SH_PFC_PIN_GROUP(du_rgb666),
        SH_PFC_PIN_GROUP(du_rgb888),
        SH_PFC_PIN_GROUP(du_clk_out_0),
@@ -3885,6 +4212,32 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {
        SH_PFC_PIN_GROUP(eth_magic),
        SH_PFC_PIN_GROUP(eth_mdio),
        SH_PFC_PIN_GROUP(eth_rmii),
+       SH_PFC_PIN_GROUP(hscif0_data),
+       SH_PFC_PIN_GROUP(hscif0_clk),
+       SH_PFC_PIN_GROUP(hscif0_ctrl),
+       SH_PFC_PIN_GROUP(hscif0_data_b),
+       SH_PFC_PIN_GROUP(hscif0_ctrl_b),
+       SH_PFC_PIN_GROUP(hscif0_data_c),
+       SH_PFC_PIN_GROUP(hscif0_clk_c),
+       SH_PFC_PIN_GROUP(hscif1_data),
+       SH_PFC_PIN_GROUP(hscif1_clk),
+       SH_PFC_PIN_GROUP(hscif1_ctrl),
+       SH_PFC_PIN_GROUP(hscif1_data_b),
+       SH_PFC_PIN_GROUP(hscif1_data_c),
+       SH_PFC_PIN_GROUP(hscif1_clk_c),
+       SH_PFC_PIN_GROUP(hscif1_ctrl_c),
+       SH_PFC_PIN_GROUP(hscif1_data_d),
+       SH_PFC_PIN_GROUP(hscif1_data_e),
+       SH_PFC_PIN_GROUP(hscif1_clk_e),
+       SH_PFC_PIN_GROUP(hscif1_ctrl_e),
+       SH_PFC_PIN_GROUP(hscif2_data),
+       SH_PFC_PIN_GROUP(hscif2_clk),
+       SH_PFC_PIN_GROUP(hscif2_ctrl),
+       SH_PFC_PIN_GROUP(hscif2_data_b),
+       SH_PFC_PIN_GROUP(hscif2_ctrl_b),
+       SH_PFC_PIN_GROUP(hscif2_data_c),
+       SH_PFC_PIN_GROUP(hscif2_clk_c),
+       SH_PFC_PIN_GROUP(hscif2_data_d),
        SH_PFC_PIN_GROUP(i2c0),
        SH_PFC_PIN_GROUP(i2c0_b),
        SH_PFC_PIN_GROUP(i2c0_c),
@@ -4155,6 +4508,30 @@ static const char * const audio_clk_groups[] = {
        "audio_clkout",
 };
 
+static const char * const can0_groups[] = {
+       "can0_data_a",
+       "can0_data_b",
+       "can0_data_c",
+       "can0_data_d",
+       "can0_data_e",
+       "can0_data_f",
+       "can_clk_a",
+       "can_clk_b",
+       "can_clk_c",
+       "can_clk_d",
+};
+
+static const char * const can1_groups[] = {
+       "can1_data_a",
+       "can1_data_b",
+       "can1_data_c",
+       "can1_data_d",
+       "can_clk_a",
+       "can_clk_b",
+       "can_clk_c",
+       "can_clk_d",
+};
+
 static const char * const du_groups[] = {
        "du_rgb666",
        "du_rgb888",
@@ -4183,6 +4560,41 @@ static const char * const eth_groups[] = {
        "eth_rmii",
 };
 
+static const char * const hscif0_groups[] = {
+       "hscif0_data",
+       "hscif0_clk",
+       "hscif0_ctrl",
+       "hscif0_data_b",
+       "hscif0_ctrl_b",
+       "hscif0_data_c",
+       "hscif0_clk_c",
+};
+
+static const char * const hscif1_groups[] = {
+       "hscif1_data",
+       "hscif1_clk",
+       "hscif1_ctrl",
+       "hscif1_data_b",
+       "hscif1_data_c",
+       "hscif1_clk_c",
+       "hscif1_ctrl_c",
+       "hscif1_data_d",
+       "hscif1_data_e",
+       "hscif1_clk_e",
+       "hscif1_ctrl_e",
+};
+
+static const char * const hscif2_groups[] = {
+       "hscif2_data",
+       "hscif2_clk",
+       "hscif2_ctrl",
+       "hscif2_data_b",
+       "hscif2_ctrl_b",
+       "hscif2_data_c",
+       "hscif2_clk_c",
+       "hscif2_data_d",
+};
+
 static const char * const i2c0_groups[] = {
        "i2c0",
        "i2c0_b",
@@ -4543,10 +4955,15 @@ static const char * const vin2_groups[] = {
 
 static const struct sh_pfc_function pinmux_functions[] = {
        SH_PFC_FUNCTION(audio_clk),
+       SH_PFC_FUNCTION(can0),
+       SH_PFC_FUNCTION(can1),
        SH_PFC_FUNCTION(du),
        SH_PFC_FUNCTION(du0),
        SH_PFC_FUNCTION(du1),
        SH_PFC_FUNCTION(eth),
+       SH_PFC_FUNCTION(hscif0),
+       SH_PFC_FUNCTION(hscif1),
+       SH_PFC_FUNCTION(hscif2),
        SH_PFC_FUNCTION(i2c0),
        SH_PFC_FUNCTION(i2c1),
        SH_PFC_FUNCTION(i2c2),
index ee370de4609aa17bfec30f8ef0518a45be0462c7..0bd8f4401b428301e040652246001776a63e5bf8 100644 (file)
@@ -3842,7 +3842,8 @@ static int sh73a0_pinmux_soc_init(struct sh_pfc *pfc)
        cfg.init_data = &sh73a0_vccq_mc0_init_data;
        cfg.driver_data = pfc;
 
-       data->vccq_mc0 = regulator_register(&sh73a0_vccq_mc0_desc, &cfg);
+       data->vccq_mc0 = devm_regulator_register(pfc->dev,
+                                                &sh73a0_vccq_mc0_desc, &cfg);
        if (IS_ERR(data->vccq_mc0)) {
                ret = PTR_ERR(data->vccq_mc0);
                dev_err(pfc->dev, "Failed to register VCCQ MC0 regulator: %d\n",
@@ -3855,16 +3856,8 @@ static int sh73a0_pinmux_soc_init(struct sh_pfc *pfc)
        return 0;
 }
 
-static void sh73a0_pinmux_soc_exit(struct sh_pfc *pfc)
-{
-       struct sh73a0_pinmux_data *data = pfc->soc_data;
-
-       regulator_unregister(data->vccq_mc0);
-}
-
 static const struct sh_pfc_soc_operations sh73a0_pinmux_ops = {
        .init = sh73a0_pinmux_soc_init,
-       .exit = sh73a0_pinmux_soc_exit,
        .get_bias = sh73a0_pinmux_get_bias,
        .set_bias = sh73a0_pinmux_set_bias,
 };
index e758af95c209324f91d547877bc2b6a9bc2aab1f..11db3ee39d40eaf824c351b0a354d88c8b21b6c6 100644 (file)
@@ -345,27 +345,6 @@ done:
        return ret;
 }
 
-static void sh_pfc_func_disable(struct pinctrl_dev *pctldev, unsigned selector,
-                               unsigned group)
-{
-       struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
-       struct sh_pfc *pfc = pmx->pfc;
-       const struct sh_pfc_pin_group *grp = &pfc->info->groups[group];
-       unsigned long flags;
-       unsigned int i;
-
-       spin_lock_irqsave(&pfc->lock, flags);
-
-       for (i = 0; i < grp->nr_pins; ++i) {
-               int idx = sh_pfc_get_pin_index(pfc, grp->pins[i]);
-               struct sh_pfc_pin_config *cfg = &pmx->configs[idx];
-
-               cfg->type = PINMUX_TYPE_NONE;
-       }
-
-       spin_unlock_irqrestore(&pfc->lock, flags);
-}
-
 static int sh_pfc_gpio_request_enable(struct pinctrl_dev *pctldev,
                                      struct pinctrl_gpio_range *range,
                                      unsigned offset)
@@ -464,7 +443,6 @@ static const struct pinmux_ops sh_pfc_pinmux_ops = {
        .get_function_name      = sh_pfc_get_function_name,
        .get_function_groups    = sh_pfc_get_function_groups,
        .enable                 = sh_pfc_func_enable,
-       .disable                = sh_pfc_func_disable,
        .gpio_request_enable    = sh_pfc_gpio_request_enable,
        .gpio_disable_free      = sh_pfc_gpio_disable_free,
        .gpio_set_direction     = sh_pfc_gpio_set_direction,
index 014f5b1fee551f9ba586fe68908049236c97e0c6..4c1d7c68666d0fca2f2691757a2479eeefc50ab1 100644 (file)
@@ -186,15 +186,6 @@ static int sirfsoc_pinmux_enable(struct pinctrl_dev *pmxdev, unsigned selector,
        return 0;
 }
 
-static void sirfsoc_pinmux_disable(struct pinctrl_dev *pmxdev, unsigned selector,
-       unsigned group)
-{
-       struct sirfsoc_pmx *spmx;
-
-       spmx = pinctrl_dev_get_drvdata(pmxdev);
-       sirfsoc_pinmux_endisable(spmx, selector, false);
-}
-
 static int sirfsoc_pinmux_get_funcs_count(struct pinctrl_dev *pmxdev)
 {
        return sirfsoc_pmxfunc_cnt;
@@ -240,7 +231,6 @@ static int sirfsoc_pinmux_request_gpio(struct pinctrl_dev *pmxdev,
 
 static struct pinmux_ops sirfsoc_pinmux_ops = {
        .enable = sirfsoc_pinmux_enable,
-       .disable = sirfsoc_pinmux_disable,
        .get_functions_count = sirfsoc_pinmux_get_funcs_count,
        .get_function_name = sirfsoc_pinmux_get_func_name,
        .get_function_groups = sirfsoc_pinmux_get_groups,
index 04d93e602674c6f2489bba44c4febd4cc5628cf9..9ef18eb958e15c924eaa0eaedd0ae3ddefb16e29 100644 (file)
@@ -48,6 +48,7 @@ config PINCTRL_SPEAR1340
 config PINCTRL_SPEAR_PLGPIO
        bool "SPEAr SoC PLGPIO Controller"
        depends on GPIOLIB && PINCTRL_SPEAR
+       select GPIOLIB_IRQCHIP
        help
          Say yes here to support PLGPIO controller on ST Microelectronics SPEAr
          SoCs.
index ff2940e9f2a7455cd0c93ac24dff0ce4f70849ad..bddb79105d67fa31118033f985412c70fca15cea 100644 (file)
 
 #include <linux/clk.h>
 #include <linux/err.h>
-#include <linux/gpio.h>
+#include <linux/gpio/driver.h>
 #include <linux/io.h>
-#include <linux/irq.h>
-#include <linux/irqdomain.h>
-#include <linux/irqchip/chained_irq.h>
 #include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_platform.h>
 #include <linux/pinctrl/consumer.h>
 #include <linux/platform_device.h>
 #include <linux/pm.h>
@@ -54,7 +53,6 @@ struct plgpio_regs {
  *
  * lock: lock for guarding gpio registers
  * base: base address of plgpio block
- * irq_base: irq number of plgpio0
  * chip: gpio framework specific chip information structure
  * p2o: function ptr for pin to offset conversion. This is required only for
  *     machines where mapping b/w pin and offset is not 1-to-1.
@@ -68,8 +66,6 @@ struct plgpio {
        spinlock_t              lock;
        void __iomem            *base;
        struct clk              *clk;
-       unsigned                irq_base;
-       struct irq_domain       *irq_domain;
        struct gpio_chip        chip;
        int                     (*p2o)(int pin);        /* pin_to_offset */
        int                     (*o2p)(int offset);     /* offset_to_pin */
@@ -280,21 +276,12 @@ disable_clk:
        pinctrl_free_gpio(gpio);
 }
 
-static int plgpio_to_irq(struct gpio_chip *chip, unsigned offset)
-{
-       struct plgpio *plgpio = container_of(chip, struct plgpio, chip);
-
-       if (IS_ERR_VALUE(plgpio->irq_base))
-               return -EINVAL;
-
-       return irq_find_mapping(plgpio->irq_domain, offset);
-}
-
 /* PLGPIO IRQ */
 static void plgpio_irq_disable(struct irq_data *d)
 {
-       struct plgpio *plgpio = irq_data_get_irq_chip_data(d);
-       int offset = d->irq - plgpio->irq_base;
+       struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
+       struct plgpio *plgpio = container_of(gc, struct plgpio, chip);
+       int offset = d->hwirq;
        unsigned long flags;
 
        /* get correct offset for "offset" pin */
@@ -311,8 +298,9 @@ static void plgpio_irq_disable(struct irq_data *d)
 
 static void plgpio_irq_enable(struct irq_data *d)
 {
-       struct plgpio *plgpio = irq_data_get_irq_chip_data(d);
-       int offset = d->irq - plgpio->irq_base;
+       struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
+       struct plgpio *plgpio = container_of(gc, struct plgpio, chip);
+       int offset = d->hwirq;
        unsigned long flags;
 
        /* get correct offset for "offset" pin */
@@ -329,8 +317,9 @@ static void plgpio_irq_enable(struct irq_data *d)
 
 static int plgpio_irq_set_type(struct irq_data *d, unsigned trigger)
 {
-       struct plgpio *plgpio = irq_data_get_irq_chip_data(d);
-       int offset = d->irq - plgpio->irq_base;
+       struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
+       struct plgpio *plgpio = container_of(gc, struct plgpio, chip);
+       int offset = d->hwirq;
        void __iomem *reg_off;
        unsigned int supported_type = 0, val;
 
@@ -369,7 +358,8 @@ static struct irq_chip plgpio_irqchip = {
 
 static void plgpio_irq_handler(unsigned irq, struct irq_desc *desc)
 {
-       struct plgpio *plgpio = irq_get_handler_data(irq);
+       struct gpio_chip *gc = irq_desc_get_handler_data(desc);
+       struct plgpio *plgpio = container_of(gc, struct plgpio, chip);
        struct irq_chip *irqchip = irq_desc_get_chip(desc);
        int regs_count, count, pin, offset, i = 0;
        unsigned long pending;
@@ -410,7 +400,8 @@ static void plgpio_irq_handler(unsigned irq, struct irq_desc *desc)
 
                        /* get correct irq line number */
                        pin = i * MAX_GPIO_PER_REG + pin;
-                       generic_handle_irq(plgpio_to_irq(&plgpio->chip, pin));
+                       generic_handle_irq(
+                               irq_find_mapping(gc->irqdomain, pin));
                }
        }
        chained_irq_exit(irqchip, desc);
@@ -523,10 +514,9 @@ end:
 }
 static int plgpio_probe(struct platform_device *pdev)
 {
-       struct device_node *np = pdev->dev.of_node;
        struct plgpio *plgpio;
        struct resource *res;
-       int ret, irq, i;
+       int ret, irq;
 
        plgpio = devm_kzalloc(&pdev->dev, sizeof(*plgpio), GFP_KERNEL);
        if (!plgpio) {
@@ -563,7 +553,6 @@ static int plgpio_probe(struct platform_device *pdev)
        platform_set_drvdata(pdev, plgpio);
        spin_lock_init(&plgpio->lock);
 
-       plgpio->irq_base = -1;
        plgpio->chip.base = -1;
        plgpio->chip.request = plgpio_request;
        plgpio->chip.free = plgpio_free;
@@ -571,10 +560,10 @@ static int plgpio_probe(struct platform_device *pdev)
        plgpio->chip.direction_output = plgpio_direction_output;
        plgpio->chip.get = plgpio_get_value;
        plgpio->chip.set = plgpio_set_value;
-       plgpio->chip.to_irq = plgpio_to_irq;
        plgpio->chip.label = dev_name(&pdev->dev);
        plgpio->chip.dev = &pdev->dev;
        plgpio->chip.owner = THIS_MODULE;
+       plgpio->chip.of_node = pdev->dev.of_node;
 
        if (!IS_ERR(plgpio->clk)) {
                ret = clk_prepare(plgpio->clk);
@@ -592,43 +581,32 @@ static int plgpio_probe(struct platform_device *pdev)
 
        irq = platform_get_irq(pdev, 0);
        if (irq < 0) {
-               dev_info(&pdev->dev, "irqs not supported\n");
-               return 0;
-       }
-
-       plgpio->irq_base = irq_alloc_descs(-1, 0, plgpio->chip.ngpio, 0);
-       if (IS_ERR_VALUE(plgpio->irq_base)) {
-               /* we would not support irq for gpio */
-               dev_warn(&pdev->dev, "couldn't allocate irq base\n");
+               dev_info(&pdev->dev, "PLGPIO registered without IRQs\n");
                return 0;
        }
 
-       plgpio->irq_domain = irq_domain_add_legacy(np, plgpio->chip.ngpio,
-                       plgpio->irq_base, 0, &irq_domain_simple_ops, NULL);
-       if (WARN_ON(!plgpio->irq_domain)) {
-               dev_err(&pdev->dev, "irq domain init failed\n");
-               irq_free_descs(plgpio->irq_base, plgpio->chip.ngpio);
-               ret = -ENXIO;
+       ret = gpiochip_irqchip_add(&plgpio->chip,
+                                  &plgpio_irqchip,
+                                  0,
+                                  handle_simple_irq,
+                                  IRQ_TYPE_NONE);
+       if (ret) {
+               dev_err(&pdev->dev, "failed to add irqchip to gpiochip\n");
                goto remove_gpiochip;
        }
 
-       irq_set_chained_handler(irq, plgpio_irq_handler);
-       for (i = 0; i < plgpio->chip.ngpio; i++) {
-               irq_set_chip_and_handler(i + plgpio->irq_base, &plgpio_irqchip,
-                               handle_simple_irq);
-               set_irq_flags(i + plgpio->irq_base, IRQF_VALID);
-               irq_set_chip_data(i + plgpio->irq_base, plgpio);
-       }
+       gpiochip_set_chained_irqchip(&plgpio->chip,
+                                    &plgpio_irqchip,
+                                    irq,
+                                    plgpio_irq_handler);
 
-       irq_set_handler_data(irq, plgpio);
        dev_info(&pdev->dev, "PLGPIO registered with IRQs\n");
 
        return 0;
 
 remove_gpiochip:
        dev_info(&pdev->dev, "Remove gpiochip\n");
-       if (gpiochip_remove(&plgpio->chip))
-               dev_err(&pdev->dev, "unable to remove gpiochip\n");
+       gpiochip_remove(&plgpio->chip);
 unprepare_clk:
        if (!IS_ERR(plgpio->clk))
                clk_unprepare(plgpio->clk);
index 58bf6867aa17b69992aa0038111898526c81d11a..f72cc4e192bd34bb5c6c95defe6f1aff88258530 100644 (file)
@@ -274,12 +274,6 @@ static int spear_pinctrl_enable(struct pinctrl_dev *pctldev, unsigned function,
        return spear_pinctrl_endisable(pctldev, function, group, true);
 }
 
-static void spear_pinctrl_disable(struct pinctrl_dev *pctldev,
-               unsigned function, unsigned group)
-{
-       spear_pinctrl_endisable(pctldev, function, group, false);
-}
-
 /* gpio with pinmux */
 static struct spear_gpio_pingroup *get_gpio_pingroup(struct spear_pmx *pmx,
                unsigned pin)
@@ -345,7 +339,6 @@ static const struct pinmux_ops spear_pinmux_ops = {
        .get_function_name = spear_pinctrl_get_func_name,
        .get_function_groups = spear_pinctrl_get_func_groups,
        .enable = spear_pinctrl_enable,
-       .disable = spear_pinctrl_disable,
        .gpio_request_enable = gpio_request_enable,
        .gpio_disable_free = gpio_disable_free,
 };
index 73e0a305ea13f5ce4251c9ec024b18a6b7784056..a5e10f777ed2f6270db8669e8cda86816af33699 100644 (file)
@@ -1,36 +1,42 @@
 if ARCH_SUNXI
 
-config PINCTRL_SUNXI
-       bool
-
 config PINCTRL_SUNXI_COMMON
        bool
        select PINMUX
        select GENERIC_PINCONF
 
 config PINCTRL_SUN4I_A10
-       def_bool PINCTRL_SUNXI || MACH_SUN4I
+       def_bool MACH_SUN4I
        select PINCTRL_SUNXI_COMMON
 
 config PINCTRL_SUN5I_A10S
-       def_bool PINCTRL_SUNXI || MACH_SUN5I
+       def_bool MACH_SUN5I
        select PINCTRL_SUNXI_COMMON
 
 config PINCTRL_SUN5I_A13
-       def_bool PINCTRL_SUNXI || MACH_SUN5I
+       def_bool MACH_SUN5I
        select PINCTRL_SUNXI_COMMON
 
 config PINCTRL_SUN6I_A31
-       def_bool PINCTRL_SUNXI || MACH_SUN6I
+       def_bool MACH_SUN6I
        select PINCTRL_SUNXI_COMMON
 
 config PINCTRL_SUN6I_A31_R
-       def_bool PINCTRL_SUNXI || MACH_SUN6I
+       def_bool MACH_SUN6I
        depends on RESET_CONTROLLER
        select PINCTRL_SUNXI_COMMON
 
 config PINCTRL_SUN7I_A20
-       def_bool PINCTRL_SUNXI || MACH_SUN7I
+       def_bool MACH_SUN7I
+       select PINCTRL_SUNXI_COMMON
+
+config PINCTRL_SUN8I_A23
+       def_bool MACH_SUN8I
+       select PINCTRL_SUNXI_COMMON
+
+config PINCTRL_SUN8I_A23_R
+       def_bool MACH_SUN8I
+       depends on RESET_CONTROLLER
        select PINCTRL_SUNXI_COMMON
 
 endif
index 0f4461cbe11d66ca85e0f6b423bdb6a22d36f957..e797efb02901f10fca70407051be36c13a78426e 100644 (file)
@@ -8,3 +8,5 @@ obj-$(CONFIG_PINCTRL_SUN5I_A13)         += pinctrl-sun5i-a13.o
 obj-$(CONFIG_PINCTRL_SUN6I_A31)                += pinctrl-sun6i-a31.o
 obj-$(CONFIG_PINCTRL_SUN6I_A31_R)      += pinctrl-sun6i-a31-r.o
 obj-$(CONFIG_PINCTRL_SUN7I_A20)                += pinctrl-sun7i-a20.o
+obj-$(CONFIG_PINCTRL_SUN8I_A23)                += pinctrl-sun8i-a23.o
+obj-$(CONFIG_PINCTRL_SUN8I_A23_R)      += pinctrl-sun8i-a23-r.o
index fa1ff7c7e35714085e00ebbd7f173d3fd3c57979..86b608bedca6ab6d2a6b998fb9ca49a333a4311a 100644 (file)
@@ -1010,6 +1010,7 @@ static const struct sunxi_desc_pin sun4i_a10_pins[] = {
 static const struct sunxi_pinctrl_desc sun4i_a10_pinctrl_data = {
        .pins = sun4i_a10_pins,
        .npins = ARRAY_SIZE(sun4i_a10_pins),
+       .irq_banks = 1,
 };
 
 static int sun4i_a10_pinctrl_probe(struct platform_device *pdev)
index 164d743f526ce72ea1f661ef290dea94b3f0c57f..2fa7430cabafd23043f8bb384ec22231fecbedda 100644 (file)
@@ -661,6 +661,7 @@ static const struct sunxi_desc_pin sun5i_a10s_pins[] = {
 static const struct sunxi_pinctrl_desc sun5i_a10s_pinctrl_data = {
        .pins = sun5i_a10s_pins,
        .npins = ARRAY_SIZE(sun5i_a10s_pins),
+       .irq_banks = 1,
 };
 
 static int sun5i_a10s_pinctrl_probe(struct platform_device *pdev)
index 1188a2b7b9881b5613b06fac3d38b5e17b381c84..e47c33dbae3ab539062b28c762dad7ced64a57ab 100644 (file)
@@ -330,15 +330,12 @@ static const struct sunxi_desc_pin sun5i_a13_pins[] = {
        /* Hole */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 0),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
-                 SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION_IRQ(0x6, 0)),          /* EINT0 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 1),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
-                 SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION_IRQ(0x6, 1)),          /* EINT1 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 2),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
-                 SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION_IRQ(0x6, 2)),          /* EINT2 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 3),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
@@ -382,6 +379,7 @@ static const struct sunxi_desc_pin sun5i_a13_pins[] = {
 static const struct sunxi_pinctrl_desc sun5i_a13_pinctrl_data = {
        .pins = sun5i_a13_pins,
        .npins = ARRAY_SIZE(sun5i_a13_pins),
+       .irq_banks = 1,
 };
 
 static int sun5i_a13_pinctrl_probe(struct platform_device *pdev)
index 8fcba48e0a424b05ed805b4288013689838bca51..9a2517b6511342d6759c80ebdb9eea45c7c39712 100644 (file)
@@ -93,6 +93,7 @@ static const struct sunxi_pinctrl_desc sun6i_a31_r_pinctrl_data = {
        .pins = sun6i_a31_r_pins,
        .npins = ARRAY_SIZE(sun6i_a31_r_pins),
        .pin_base = PL_BASE,
+       .irq_banks = 2,
 };
 
 static int sun6i_a31_r_pinctrl_probe(struct platform_device *pdev)
index 8dea5856458bf1edd2ecb1b938d7720a8fea9947..a2b4b85c5ad551722a72b3ecc735368d7f65d011 100644 (file)
@@ -24,208 +24,244 @@ static const struct sunxi_desc_pin sun6i_a31_pins[] = {
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "gmac"),          /* TXD0 */
                  SUNXI_FUNCTION(0x3, "lcd1"),          /* D0 */
-                 SUNXI_FUNCTION(0x4, "uart1")),        /* DTR */
+                 SUNXI_FUNCTION(0x4, "uart1"),         /* DTR */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 0)),  /* PA_EINT0 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 1),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "gmac"),          /* TXD1 */
                  SUNXI_FUNCTION(0x3, "lcd1"),          /* D1 */
-                 SUNXI_FUNCTION(0x4, "uart1")),        /* DSR */
+                 SUNXI_FUNCTION(0x4, "uart1"),         /* DSR */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 1)),  /* PA_EINT1 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 2),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "gmac"),          /* TXD2 */
                  SUNXI_FUNCTION(0x3, "lcd1"),          /* D2 */
-                 SUNXI_FUNCTION(0x4, "uart1")),        /* DCD */
+                 SUNXI_FUNCTION(0x4, "uart1"),         /* DCD */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 2)),  /* PA_EINT2 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 3),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "gmac"),          /* TXD3 */
                  SUNXI_FUNCTION(0x3, "lcd1"),          /* D3 */
-                 SUNXI_FUNCTION(0x4, "uart1")),        /* RING */
+                 SUNXI_FUNCTION(0x4, "uart1"),         /* RING */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 3)),  /* PA_EINT3 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 4),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "gmac"),          /* TXD4 */
                  SUNXI_FUNCTION(0x3, "lcd1"),          /* D4 */
-                 SUNXI_FUNCTION(0x4, "uart1")),        /* TX */
+                 SUNXI_FUNCTION(0x4, "uart1"),         /* TX */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 4)),  /* PA_EINT4 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 5),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "gmac"),          /* TXD5 */
                  SUNXI_FUNCTION(0x3, "lcd1"),          /* D5 */
-                 SUNXI_FUNCTION(0x4, "uart1")),        /* RX */
+                 SUNXI_FUNCTION(0x4, "uart1"),         /* RX */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 5)),  /* PA_EINT5 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 6),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "gmac"),          /* TXD6 */
                  SUNXI_FUNCTION(0x3, "lcd1"),          /* D6 */
-                 SUNXI_FUNCTION(0x4, "uart1")),        /* RTS */
+                 SUNXI_FUNCTION(0x4, "uart1"),         /* RTS */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 6)),  /* PA_EINT6 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 7),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "gmac"),          /* TXD7 */
                  SUNXI_FUNCTION(0x3, "lcd1"),          /* D7 */
-                 SUNXI_FUNCTION(0x4, "uart1")),        /* CTS */
+                 SUNXI_FUNCTION(0x4, "uart1"),         /* CTS */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 7)),  /* PA_EINT7 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 8),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "gmac"),          /* TXCLK */
-                 SUNXI_FUNCTION(0x3, "lcd1")),         /* D8 */
+                 SUNXI_FUNCTION(0x3, "lcd1"),          /* D8 */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 8)),  /* PA_EINT8 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 9),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "gmac"),          /* TXEN */
                  SUNXI_FUNCTION(0x3, "lcd1"),          /* D9 */
                  SUNXI_FUNCTION(0x4, "mmc3"),          /* CMD */
-                 SUNXI_FUNCTION(0x5, "mmc2")),         /* CMD */
+                 SUNXI_FUNCTION(0x5, "mmc2"),          /* CMD */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 9)),  /* PA_EINT9 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 10),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "gmac"),          /* GTXCLK */
                  SUNXI_FUNCTION(0x3, "lcd1"),          /* D10 */
                  SUNXI_FUNCTION(0x4, "mmc3"),          /* CLK */
-                 SUNXI_FUNCTION(0x5, "mmc2")),         /* CLK */
+                 SUNXI_FUNCTION(0x5, "mmc2"),          /* CLK */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 10)), /* PA_EINT10 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 11),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "gmac"),          /* RXD0 */
                  SUNXI_FUNCTION(0x3, "lcd1"),          /* D11 */
                  SUNXI_FUNCTION(0x4, "mmc3"),          /* D0 */
-                 SUNXI_FUNCTION(0x5, "mmc2")),         /* D0 */
+                 SUNXI_FUNCTION(0x5, "mmc2"),          /* D0 */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 11)), /* PA_EINT11 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 12),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "gmac"),          /* RXD1 */
                  SUNXI_FUNCTION(0x3, "lcd1"),          /* D12 */
                  SUNXI_FUNCTION(0x4, "mmc3"),          /* D1 */
-                 SUNXI_FUNCTION(0x5, "mmc2")),         /* D1 */
+                 SUNXI_FUNCTION(0x5, "mmc2"),          /* D1 */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 12)), /* PA_EINT12 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 13),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "gmac"),          /* RXD2 */
                  SUNXI_FUNCTION(0x3, "lcd1"),          /* D13 */
                  SUNXI_FUNCTION(0x4, "mmc3"),          /* D2 */
-                 SUNXI_FUNCTION(0x5, "mmc2")),         /* D2 */
+                 SUNXI_FUNCTION(0x5, "mmc2"),          /* D2 */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 13)), /* PA_EINT13 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 14),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "gmac"),          /* RXD3 */
                  SUNXI_FUNCTION(0x3, "lcd1"),          /* D14 */
                  SUNXI_FUNCTION(0x4, "mmc3"),          /* D3 */
-                 SUNXI_FUNCTION(0x5, "mmc2")),         /* D3 */
+                 SUNXI_FUNCTION(0x5, "mmc2"),          /* D3 */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 14)), /* PA_EINT14 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 15),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "gmac"),          /* RXD4 */
-                 SUNXI_FUNCTION(0x3, "lcd1")),         /* D15 */
+                 SUNXI_FUNCTION(0x3, "lcd1"),          /* D15 */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 15)), /* PA_EINT15 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 16),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "gmac"),          /* RXD5 */
-                 SUNXI_FUNCTION(0x3, "lcd1")),         /* D16 */
+                 SUNXI_FUNCTION(0x3, "lcd1"),          /* D16 */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 16)), /* PA_EINT16 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 17),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "gmac"),          /* RXD6 */
-                 SUNXI_FUNCTION(0x3, "lcd1")),         /* D17 */
+                 SUNXI_FUNCTION(0x3, "lcd1"),          /* D17 */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 17)), /* PA_EINT17 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 18),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "gmac"),          /* RXD7 */
-                 SUNXI_FUNCTION(0x3, "lcd1")),         /* D18 */
+                 SUNXI_FUNCTION(0x3, "lcd1"),          /* D18 */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 18)), /* PA_EINT18 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 19),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "gmac"),          /* RXDV */
                  SUNXI_FUNCTION(0x3, "lcd1"),          /* D19 */
-                 SUNXI_FUNCTION(0x4, "pwm3")),         /* Positive */
+                 SUNXI_FUNCTION(0x4, "pwm3"),          /* Positive */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 19)), /* PA_EINT19 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 20),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "gmac"),          /* RXCLK */
                  SUNXI_FUNCTION(0x3, "lcd1"),          /* D20 */
-                 SUNXI_FUNCTION(0x4, "pwm3")),         /* Negative */
+                 SUNXI_FUNCTION(0x4, "pwm3"),          /* Negative */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 20)), /* PA_EINT20 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 21),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "gmac"),          /* TXERR */
                  SUNXI_FUNCTION(0x3, "lcd1"),          /* D21 */
-                 SUNXI_FUNCTION(0x4, "spi3")),         /* CS0 */
+                 SUNXI_FUNCTION(0x4, "spi3"),          /* CS0 */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 21)), /* PA_EINT21 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 22),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "gmac"),          /* RXERR */
                  SUNXI_FUNCTION(0x3, "lcd1"),          /* D22 */
-                 SUNXI_FUNCTION(0x4, "spi3")),         /* CLK */
+                 SUNXI_FUNCTION(0x4, "spi3"),          /* CLK */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 22)), /* PA_EINT22 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 23),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "gmac"),          /* COL */
                  SUNXI_FUNCTION(0x3, "lcd1"),          /* D23 */
-                 SUNXI_FUNCTION(0x4, "spi3")),         /* MOSI */
+                 SUNXI_FUNCTION(0x4, "spi3"),          /* MOSI */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 23)), /* PA_EINT23 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 24),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "gmac"),          /* CRS */
                  SUNXI_FUNCTION(0x3, "lcd1"),          /* CLK */
-                 SUNXI_FUNCTION(0x4, "spi3")),         /* MISO */
+                 SUNXI_FUNCTION(0x4, "spi3"),          /* MISO */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 24)), /* PA_EINT24 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 25),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "gmac"),          /* CLKIN */
                  SUNXI_FUNCTION(0x3, "lcd1"),          /* DE */
-                 SUNXI_FUNCTION(0x4, "spi3")),         /* CS1 */
+                 SUNXI_FUNCTION(0x4, "spi3"),          /* CS1 */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 25)), /* PA_EINT25 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 26),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "gmac"),          /* MDC */
-                 SUNXI_FUNCTION(0x3, "lcd1")),         /* HSYNC */
+                 SUNXI_FUNCTION(0x3, "lcd1"),          /* HSYNC */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 26)), /* PA_EINT26 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 27),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "gmac"),          /* MDIO */
-                 SUNXI_FUNCTION(0x3, "lcd1")),         /* VSYNC */
+                 SUNXI_FUNCTION(0x3, "lcd1"),          /* VSYNC */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 27)), /* PA_EINT27 */
        /* Hole */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 0),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "i2s0"),          /* MCLK */
                  SUNXI_FUNCTION(0x3, "uart3"),         /* CTS */
-                 SUNXI_FUNCTION(0x4, "csi")),          /* MCLK1 */
+                 SUNXI_FUNCTION(0x4, "csi"),           /* MCLK1 */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 0)),  /* PB_EINT0 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 1),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
-                 SUNXI_FUNCTION(0x2, "i2s0")),         /* BCLK */
+                 SUNXI_FUNCTION(0x2, "i2s0"),          /* BCLK */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 1)),  /* PB_EINT1 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 2),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
-                 SUNXI_FUNCTION(0x2, "i2s0")),         /* LRCK */
+                 SUNXI_FUNCTION(0x2, "i2s0"),          /* LRCK */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 2)),  /* PB_EINT2 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 3),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
-                 SUNXI_FUNCTION(0x2, "i2s0")),         /* DO0 */
+                 SUNXI_FUNCTION(0x2, "i2s0"),          /* DO0 */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 3)),  /* PB_EINT3 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 4),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "i2s0"),          /* DO1 */
-                 SUNXI_FUNCTION(0x3, "uart3")),        /* RTS */
+                 SUNXI_FUNCTION(0x3, "uart3"),         /* RTS */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 4)),  /* PB_EINT4 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 5),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "i2s0"),          /* DO2 */
                  SUNXI_FUNCTION(0x3, "uart3"),         /* TX */
-                 SUNXI_FUNCTION(0x4, "i2c3")),         /* SCK */
+                 SUNXI_FUNCTION(0x4, "i2c3"),          /* SCK */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 5)),  /* PB_EINT5 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 6),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "i2s0"),          /* DO3 */
                  SUNXI_FUNCTION(0x3, "uart3"),         /* RX */
-                 SUNXI_FUNCTION(0x4, "i2c3")),         /* SDA */
+                 SUNXI_FUNCTION(0x4, "i2c3"),          /* SDA */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 6)),  /* PB_EINT6 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 7),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
-                 SUNXI_FUNCTION(0x3, "i2s0")),         /* DI */
+                 SUNXI_FUNCTION(0x3, "i2s0"),          /* DI */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 7)),  /* PB_EINT7 */
        /* Hole */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 0),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
@@ -510,86 +546,103 @@ static const struct sunxi_desc_pin sun6i_a31_pins[] = {
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "csi"),           /* PCLK */
-                 SUNXI_FUNCTION(0x3, "ts")),           /* CLK */
+                 SUNXI_FUNCTION(0x3, "ts"),            /* CLK */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 0)),  /* PE_EINT0 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 1),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "csi"),           /* MCLK */
-                 SUNXI_FUNCTION(0x3, "ts")),           /* ERR */
+                 SUNXI_FUNCTION(0x3, "ts"),            /* ERR */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 1)),  /* PE_EINT1 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 2),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "csi"),           /* HSYNC */
-                 SUNXI_FUNCTION(0x3, "ts")),           /* SYNC */
+                 SUNXI_FUNCTION(0x3, "ts"),            /* SYNC */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 2)),  /* PE_EINT2 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 3),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "csi"),           /* VSYNC */
-                 SUNXI_FUNCTION(0x3, "ts")),           /* DVLD */
+                 SUNXI_FUNCTION(0x3, "ts"),            /* DVLD */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 3)),  /* PE_EINT3 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 4),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "csi"),           /* D0 */
-                 SUNXI_FUNCTION(0x3, "uart5")),        /* TX */
+                 SUNXI_FUNCTION(0x3, "uart5"),         /* TX */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 4)),  /* PE_EINT4 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 5),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "csi"),           /* D1 */
-                 SUNXI_FUNCTION(0x3, "uart5")),        /* RX */
+                 SUNXI_FUNCTION(0x3, "uart5"),         /* RX */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 5)),  /* PE_EINT5 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 6),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "csi"),           /* D2 */
-                 SUNXI_FUNCTION(0x3, "uart5")),        /* RTS */
+                 SUNXI_FUNCTION(0x3, "uart5"),         /* RTS */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 6)),  /* PE_EINT6 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 7),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "csi"),           /* D3 */
-                 SUNXI_FUNCTION(0x3, "uart5")),        /* CTS */
+                 SUNXI_FUNCTION(0x3, "uart5"),         /* CTS */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 7)),  /* PE_EINT7 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 8),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "csi"),           /* D4 */
-                 SUNXI_FUNCTION(0x3, "ts")),           /* D0 */
+                 SUNXI_FUNCTION(0x3, "ts"),            /* D0 */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 8)),  /* PE_EINT8 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 9),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "csi"),           /* D5 */
-                 SUNXI_FUNCTION(0x3, "ts")),           /* D1 */
+                 SUNXI_FUNCTION(0x3, "ts"),            /* D1 */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 9)),  /* PE_EINT9 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 10),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "csi"),           /* D6 */
-                 SUNXI_FUNCTION(0x3, "ts")),           /* D2 */
+                 SUNXI_FUNCTION(0x3, "ts"),            /* D2 */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 10)), /* PE_EINT10 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 11),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "csi"),           /* D7 */
-                 SUNXI_FUNCTION(0x3, "ts")),           /* D3 */
+                 SUNXI_FUNCTION(0x3, "ts"),            /* D3 */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 11)), /* PE_EINT11 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 12),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "csi"),           /* D8 */
-                 SUNXI_FUNCTION(0x3, "ts")),           /* D4 */
+                 SUNXI_FUNCTION(0x3, "ts"),            /* D4 */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 12)), /* PE_EINT12 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 13),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "csi"),           /* D9 */
-                 SUNXI_FUNCTION(0x3, "ts")),           /* D5 */
+                 SUNXI_FUNCTION(0x3, "ts"),            /* D5 */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 13)), /* PE_EINT13 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 14),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "csi"),           /* D10 */
-                 SUNXI_FUNCTION(0x3, "ts")),           /* D6 */
+                 SUNXI_FUNCTION(0x3, "ts"),            /* D6 */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 14)), /* PE_EINT14 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 15),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "csi"),           /* D11 */
-                 SUNXI_FUNCTION(0x3, "ts")),           /* D7 */
+                 SUNXI_FUNCTION(0x3, "ts"),            /* D7 */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 15)), /* PE_EINT15 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 16),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
-                 SUNXI_FUNCTION(0x2, "csi")),          /* MIPI CSI MCLK */
+                 SUNXI_FUNCTION(0x2, "csi"),           /* MIPI CSI MCLK */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 16)), /* PE_EINT16 */
        /* Hole */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 0),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
@@ -625,86 +678,105 @@ static const struct sunxi_desc_pin sun6i_a31_pins[] = {
        SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 0),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
-                 SUNXI_FUNCTION(0x2, "mmc1")),         /* CLK */
+                 SUNXI_FUNCTION(0x2, "mmc1"),          /* CLK */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 3, 0)),  /* PG_EINT0 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 1),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
-                 SUNXI_FUNCTION(0x2, "mmc1")),         /* CMD */
+                 SUNXI_FUNCTION(0x2, "mmc1"),          /* CMD */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 3, 1)),  /* PG_EINT1 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 2),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
-                 SUNXI_FUNCTION(0x2, "mmc1")),         /* D0 */
+                 SUNXI_FUNCTION(0x2, "mmc1"),          /* D0 */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 3, 2)),  /* PG_EINT2 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 3),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
-                 SUNXI_FUNCTION(0x2, "mmc1")),         /* D1 */
+                 SUNXI_FUNCTION(0x2, "mmc1"),          /* D1 */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 3, 3)),  /* PG_EINT3 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 4),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
-                 SUNXI_FUNCTION(0x2, "mmc1")),         /* D2 */
+                 SUNXI_FUNCTION(0x2, "mmc1"),          /* D2 */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 3, 4)),  /* PG_EINT4 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 5),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
-                 SUNXI_FUNCTION(0x2, "mmc1")),         /* D3 */
+                 SUNXI_FUNCTION(0x2, "mmc1"),          /* D3 */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 3, 5)),  /* PG_EINT5 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 6),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
-                 SUNXI_FUNCTION(0x2, "uart2")),        /* TX */
+                 SUNXI_FUNCTION(0x2, "uart2"),         /* TX */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 3, 6)),  /* PG_EINT6 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 7),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
-                 SUNXI_FUNCTION(0x2, "uart2")),        /* RX */
+                 SUNXI_FUNCTION(0x2, "uart2"),         /* RX */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 3, 7)),  /* PG_EINT7 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 8),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
-                 SUNXI_FUNCTION(0x2, "uart2")),        /* RTS */
+                 SUNXI_FUNCTION(0x2, "uart2"),         /* RTS */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 3, 8)),  /* PG_EINT8 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 9),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
-                 SUNXI_FUNCTION(0x2, "uart2")),        /* CTS */
+                 SUNXI_FUNCTION(0x2, "uart2"),         /* CTS */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 3, 9)),  /* PG_EINT9 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 10),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "i2c3"),          /* SCK */
-                 SUNXI_FUNCTION(0x3, "usb")),          /* DP3 */
+                 SUNXI_FUNCTION(0x3, "usb"),           /* DP3 */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 3, 10)), /* PG_EINT10 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 11),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "i2c3"),          /* SDA */
-                 SUNXI_FUNCTION(0x3, "usb")),          /* DM3 */
+                 SUNXI_FUNCTION(0x3, "usb"),           /* DM3 */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 3, 11)), /* PG_EINT11 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 12),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "spi1"),          /* CS1 */
-                 SUNXI_FUNCTION(0x3, "i2s1")),         /* MCLK */
+                 SUNXI_FUNCTION(0x3, "i2s1"),          /* MCLK */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 3, 12)), /* PG_EINT12 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 13),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "spi1"),          /* CS0 */
-                 SUNXI_FUNCTION(0x3, "i2s1")),         /* BCLK */
+                 SUNXI_FUNCTION(0x3, "i2s1"),          /* BCLK */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 3, 13)), /* PG_EINT13 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 14),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "spi1"),          /* CLK */
-                 SUNXI_FUNCTION(0x3, "i2s1")),         /* LRCK */
+                 SUNXI_FUNCTION(0x3, "i2s1"),          /* LRCK */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 3, 14)), /* PG_EINT14 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 15),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "spi1"),          /* MOSI */
-                 SUNXI_FUNCTION(0x3, "i2s1")),         /* DIN */
+                 SUNXI_FUNCTION(0x3, "i2s1"),          /* DIN */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 3, 15)), /* PG_EINT15 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 16),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
                  SUNXI_FUNCTION(0x2, "spi1"),          /* MISO */
-                 SUNXI_FUNCTION(0x3, "i2s1")),         /* DOUT */
+                 SUNXI_FUNCTION(0x3, "i2s1"),          /* DOUT */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 3, 16)), /* PG_EINT16 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 17),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
-                 SUNXI_FUNCTION(0x2, "uart4")),        /* TX */
+                 SUNXI_FUNCTION(0x2, "uart4"),         /* TX */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 3, 17)), /* PG_EINT17 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 18),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
                  SUNXI_FUNCTION(0x1, "gpio_out"),
-                 SUNXI_FUNCTION(0x2, "uart4")),        /* RX */
+                 SUNXI_FUNCTION(0x2, "uart4"),         /* RX */
+                 SUNXI_FUNCTION_IRQ_BANK(0x6, 3, 18)), /* PG_EINT18 */
        /* Hole */
        SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 0),
                  SUNXI_FUNCTION(0x0, "gpio_in"),
@@ -836,6 +908,7 @@ static const struct sunxi_desc_pin sun6i_a31_pins[] = {
 static const struct sunxi_pinctrl_desc sun6i_a31_pinctrl_data = {
        .pins = sun6i_a31_pins,
        .npins = ARRAY_SIZE(sun6i_a31_pins),
+       .irq_banks = 4,
 };
 
 static int sun6i_a31_pinctrl_probe(struct platform_device *pdev)
index d8577ce5f1a405dc49c61e0ddee01b7079bf5563..dac99e02bfdb9bd1bbe9138c98a228fb7797bfd1 100644 (file)
@@ -1036,6 +1036,7 @@ static const struct sunxi_desc_pin sun7i_a20_pins[] = {
 static const struct sunxi_pinctrl_desc sun7i_a20_pinctrl_data = {
        .pins = sun7i_a20_pins,
        .npins = ARRAY_SIZE(sun7i_a20_pins),
+       .irq_banks = 1,
 };
 
 static int sun7i_a20_pinctrl_probe(struct platform_device *pdev)
diff --git a/drivers/pinctrl/sunxi/pinctrl-sun8i-a23-r.c b/drivers/pinctrl/sunxi/pinctrl-sun8i-a23-r.c
new file mode 100644 (file)
index 0000000..90f3b3a
--- /dev/null
@@ -0,0 +1,142 @@
+/*
+ * Allwinner A23 SoCs special pins pinctrl driver.
+ *
+ * Copyright (C) 2014 Chen-Yu Tsai
+ * Chen-Yu Tsai <wens@csie.org>
+ *
+ * Copyright (C) 2014 Boris Brezillon
+ * Boris Brezillon <boris.brezillon@free-electrons.com>
+ *
+ * Copyright (C) 2014 Maxime Ripard
+ * Maxime Ripard <maxime.ripard@free-electrons.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2.  This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/pinctrl/pinctrl.h>
+#include <linux/reset.h>
+
+#include "pinctrl-sunxi.h"
+
+static const struct sunxi_desc_pin sun8i_a23_r_pins[] = {
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 0),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "s_rsb"),         /* SCK */
+                 SUNXI_FUNCTION(0x3, "s_twi"),         /* SCK */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 0, 0)),  /* PL_EINT0 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 1),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "s_rsb"),         /* SDA */
+                 SUNXI_FUNCTION(0x3, "s_twi"),         /* SDA */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 0, 1)),  /* PL_EINT1 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 2),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "s_uart"),        /* TX */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 0, 2)),  /* PL_EINT2 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 3),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "s_uart"),        /* RX */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 0, 3)),  /* PL_EINT3 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 4),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x3, "s_jtag"),        /* MS */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 0, 4)),  /* PL_EINT4 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 5),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x3, "s_jtag"),        /* CK */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 0, 5)),  /* PL_EINT5 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 6),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x3, "s_jtag"),        /* DO */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 0, 6)),  /* PL_EINT6 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 7),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x3, "s_jtag"),        /* DI */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 0, 7)),  /* PL_EINT7 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 8),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "s_twi"),         /* SCK */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 0, 8)),  /* PL_EINT8 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 9),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "s_twi"),         /* SDA */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 0, 9)),  /* PL_EINT9 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 10),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "s_pwm"),
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 0, 10)), /* PL_EINT10 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(L, 11),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 0, 11)), /* PL_EINT11 */
+};
+
+static const struct sunxi_pinctrl_desc sun8i_a23_r_pinctrl_data = {
+       .pins = sun8i_a23_r_pins,
+       .npins = ARRAY_SIZE(sun8i_a23_r_pins),
+       .pin_base = PL_BASE,
+       .irq_banks = 1,
+};
+
+static int sun8i_a23_r_pinctrl_probe(struct platform_device *pdev)
+{
+       struct reset_control *rstc;
+       int ret;
+
+       rstc = devm_reset_control_get(&pdev->dev, NULL);
+       if (IS_ERR(rstc)) {
+               dev_err(&pdev->dev, "Reset controller missing\n");
+               return PTR_ERR(rstc);
+       }
+
+       ret = reset_control_deassert(rstc);
+       if (ret)
+               return ret;
+
+       ret = sunxi_pinctrl_init(pdev,
+                                &sun8i_a23_r_pinctrl_data);
+
+       if (ret)
+               reset_control_assert(rstc);
+
+       return ret;
+}
+
+static struct of_device_id sun8i_a23_r_pinctrl_match[] = {
+       { .compatible = "allwinner,sun8i-a23-r-pinctrl", },
+       {}
+};
+MODULE_DEVICE_TABLE(of, sun8i_a23_r_pinctrl_match);
+
+static struct platform_driver sun8i_a23_r_pinctrl_driver = {
+       .probe  = sun8i_a23_r_pinctrl_probe,
+       .driver = {
+               .name           = "sun8i-a23-r-pinctrl",
+               .owner          = THIS_MODULE,
+               .of_match_table = sun8i_a23_r_pinctrl_match,
+       },
+};
+module_platform_driver(sun8i_a23_r_pinctrl_driver);
+
+MODULE_AUTHOR("Chen-Yu Tsai <wens@csie.org>");
+MODULE_AUTHOR("Boris Brezillon <boris.brezillon@free-electrons.com");
+MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com");
+MODULE_DESCRIPTION("Allwinner A23 R_PIO pinctrl driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/pinctrl/sunxi/pinctrl-sun8i-a23.c b/drivers/pinctrl/sunxi/pinctrl-sun8i-a23.c
new file mode 100644 (file)
index 0000000..ac71e8c
--- /dev/null
@@ -0,0 +1,593 @@
+/*
+ * Allwinner A23 SoCs pinctrl driver.
+ *
+ * Copyright (C) 2014 Chen-Yu Tsai
+ *
+ * Chen-Yu Tsai <wens@csie.org>
+ *
+ * Copyright (C) 2014 Maxime Ripard
+ *
+ * Maxime Ripard <maxime.ripard@free-electrons.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2.  This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/pinctrl/pinctrl.h>
+
+#include "pinctrl-sunxi.h"
+
+static const struct sunxi_desc_pin sun8i_a23_pins[] = {
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 0),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "spi1"),          /* CS */
+                 SUNXI_FUNCTION(0x3, "jtag"),          /* MS0 */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 0, 0)),  /* PA_EINT0 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 1),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "spi1"),          /* CLK */
+                 SUNXI_FUNCTION(0x3, "jtag"),          /* CKO */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 0, 1)),  /* PA_EINT1 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 2),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "spi1"),          /* MOSI */
+                 SUNXI_FUNCTION(0x3, "jtag"),          /* DOO */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 0, 2)),  /* PA_EINT2 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 3),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "spi1"),          /* MISO */
+                 SUNXI_FUNCTION(0x3, "jtag"),          /* DIO */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 0, 3)),  /* PA_EINT3 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 4),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "uart4"),         /* TX */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 0, 4)),  /* PA_EINT4 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 5),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "uart4"),         /* RX */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 0, 5)),  /* PA_EINT5 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 6),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "uart4"),         /* RTS */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 0, 6)),  /* PA_EINT6 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 7),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "uart4"),         /* CTS */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 0, 7)),  /* PA_EINT7 */
+       /* Hole */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 0),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "uart2"),         /* TX */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 1, 0)),  /* PB_EINT0 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 1),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "uart2"),         /* RX */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 1, 1)),  /* PB_EINT1 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 2),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "uart2"),         /* RTS */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 1, 2)),  /* PB_EINT2 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 3),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "uart2"),         /* CTS */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 1, 3)),  /* PB_EINT3 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 4),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "i2s0"),          /* SYNC */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 1, 4)),  /* PB_EINT4 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 5),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "i2s0"),          /* DOUT */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 1, 5)),  /* PB_EINT5 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 6),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "i2s0"),          /* DIN */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 1, 6)),  /* PB_EINT6 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 7),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x3, "i2s0"),          /* DI */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 1, 7)),  /* PB_EINT7 */
+       /* Hole */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 0),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "nand0"),         /* WE */
+                 SUNXI_FUNCTION(0x3, "spi0")),         /* MOSI */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 1),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "nand0"),         /* ALE */
+                 SUNXI_FUNCTION(0x3, "spi0")),         /* MISO */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 2),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "nand0"),         /* CLE */
+                 SUNXI_FUNCTION(0x3, "spi0")),         /* CLK */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 3),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "nand0"),         /* CE1 */
+                 SUNXI_FUNCTION(0x3, "spi0")),         /* CS */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 4),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "nand0")),        /* CE0 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 5),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "nand0"),         /* RE */
+                 SUNXI_FUNCTION(0x3, "mmc2")),         /* CLK */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 6),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "nand0"),         /* RB0 */
+                 SUNXI_FUNCTION(0x3, "mmc2")),         /* CMD */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 7),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "nand0")),        /* RB1 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 8),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "nand0"),         /* DQ0 */
+                 SUNXI_FUNCTION(0x3, "mmc2")),         /* D0 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 9),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "nand0"),         /* DQ1 */
+                 SUNXI_FUNCTION(0x3, "mmc2")),         /* D1 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 10),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "nand0"),         /* DQ2 */
+                 SUNXI_FUNCTION(0x3, "mmc2")),         /* D2 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 11),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "nand0"),         /* DQ3 */
+                 SUNXI_FUNCTION(0x3, "mmc2")),         /* D3 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 12),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "nand0"),         /* DQ4 */
+                 SUNXI_FUNCTION(0x3, "mmc2")),         /* D4 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 13),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "nand0"),         /* DQ5 */
+                 SUNXI_FUNCTION(0x3, "mmc2")),         /* D5 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 14),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "nand"),          /* DQ6 */
+                 SUNXI_FUNCTION(0x3, "mmc2")),         /* D6 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 15),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "nand"),          /* DQ7 */
+                 SUNXI_FUNCTION(0x3, "mmc2")),         /* D7 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 16),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "nand"),          /* DQS */
+                 SUNXI_FUNCTION(0x3, "mmc2")),         /* RST */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 17),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "nand0")),        /* CE2 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 18),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "nand0")),        /* CE3 */
+       /* Hole */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 0),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "lcd0")),         /* D0 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 1),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "lcd0")),         /* D1 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 2),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "lcd0"),          /* D2 */
+                 SUNXI_FUNCTION(0x3, "mmc1")),         /* CLK */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 3),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "lcd0"),          /* D3 */
+                 SUNXI_FUNCTION(0x3, "mmc1")),         /* CMD */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 4),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "lcd0"),          /* D4 */
+                 SUNXI_FUNCTION(0x3, "mmc1")),         /* D0 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 5),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "lcd0"),          /* D5 */
+                 SUNXI_FUNCTION(0x3, "mmc1")),         /* D1 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 6),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "lcd0"),          /* D6 */
+                 SUNXI_FUNCTION(0x3, "mmc1")),         /* D2 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 7),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "lcd0"),          /* D7 */
+                 SUNXI_FUNCTION(0x3, "mmc1")),         /* D3 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 8),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "lcd0"),          /* D8 */
+                 SUNXI_FUNCTION(0x3, "uart3")),        /* TX */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 9),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "lcd0"),          /* D9 */
+                 SUNXI_FUNCTION(0x3, "uart3")),        /* RX */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 10),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "lcd0"),          /* D10 */
+                 SUNXI_FUNCTION(0x3, "uart1")),        /* TX */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 11),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "lcd0"),          /* D11 */
+                 SUNXI_FUNCTION(0x3, "uart1")),        /* RX */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 12),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "lcd0"),          /* D12 */
+                 SUNXI_FUNCTION(0x3, "uart1")),        /* RTS */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 13),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "lcd0"),          /* D13 */
+                 SUNXI_FUNCTION(0x3, "uart1")),        /* CTS */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 14),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "lcd0"),          /* D14 */
+                 SUNXI_FUNCTION(0x3, "i2s1")),         /* SYNC */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 15),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "lcd0"),          /* D15 */
+                 SUNXI_FUNCTION(0x3, "i2s1")),         /* CLK */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 16),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "lcd0"),          /* D16 */
+                 SUNXI_FUNCTION(0x3, "i2s1")),         /* DOUT */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 17),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "lcd0"),          /* D17 */
+                 SUNXI_FUNCTION(0x3, "i2s1")),         /* DIN */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 18),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "lcd0"),          /* D18 */
+                 SUNXI_FUNCTION(0x3, "lvds0")),        /* VN0 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 19),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "lcd0"),          /* D19 */
+                 SUNXI_FUNCTION(0x3, "lvds0")),        /* VP0 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 20),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "lcd0"),          /* D20 */
+                 SUNXI_FUNCTION(0x3, "lvds0")),        /* VP1 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 21),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "lcd0"),          /* D21 */
+                 SUNXI_FUNCTION(0x3, "lvds0")),        /* VN1 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 22),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "lcd0"),          /* D22 */
+                 SUNXI_FUNCTION(0x3, "lvds0")),        /* VP2 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 23),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "lcd0"),          /* D23 */
+                 SUNXI_FUNCTION(0x3, "lvds0")),        /* VN2 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 24),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "lcd0"),          /* CLK */
+                 SUNXI_FUNCTION(0x3, "lvds0")),        /* VPC */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 25),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "lcd0"),          /* DE */
+                 SUNXI_FUNCTION(0x3, "lvds0")),        /* VNC */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 26),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "lcd0"),          /* HSYNC */
+                 SUNXI_FUNCTION(0x3, "lvds0")),        /* VP3 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 27),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "lcd0"),          /* VSYNC */
+                 SUNXI_FUNCTION(0x3, "lvds0")),        /* VN3 */
+       /* Hole */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 0),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "csi")),          /* PCLK */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 1),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "csi")),          /* MCLK */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 2),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "csi")),          /* HSYNC */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 3),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "csi")),          /* VSYNC */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 4),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "csi")),          /* D0 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 5),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "csi")),          /* D1 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 6),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "csi")),          /* D2 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 7),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "csi")),          /* D3 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 8),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "csi")),          /* D4 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 9),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "csi")),          /* D5 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 10),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "csi")),          /* D6 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 11),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "csi")),          /* D7 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 12),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "csi"),           /* SCK */
+                 SUNXI_FUNCTION(0x3, "i2c2")),         /* SCK */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 13),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "csi"),           /* SDA */
+                 SUNXI_FUNCTION(0x3, "i2c2")),         /* SDA */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 14),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out")),
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 15),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out")),
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 16),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out")),
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 17),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out")),
+       /* Hole */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 0),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "mmc0"),          /* D1 */
+                 SUNXI_FUNCTION(0x3, "jtag")),         /* MS1 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 1),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "mmc0"),          /* D0 */
+                 SUNXI_FUNCTION(0x3, "jtag")),         /* DI1 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 2),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "mmc0"),          /* CLK */
+                 SUNXI_FUNCTION(0x3, "uart0")),        /* TX */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 3),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "mmc0"),          /* CMD */
+                 SUNXI_FUNCTION(0x3, "jtag")),         /* DO1 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 4),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "mmc0"),          /* D3 */
+                 SUNXI_FUNCTION(0x3, "uart0")),        /* RX */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 5),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "mmc0"),          /* D2 */
+                 SUNXI_FUNCTION(0x3, "jtag")),         /* CK1 */
+       /* Hole */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 0),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "mmc1"),          /* CLK */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 2, 0)),  /* PG_EINT0 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 1),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "mmc1"),          /* CMD */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 2, 1)),  /* PG_EINT1 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 2),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "mmc1"),          /* D0 */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 2, 2)),  /* PG_EINT2 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 3),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "mmc1"),          /* D1 */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 2, 3)),  /* PG_EINT3 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 4),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "mmc1"),          /* D2 */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 2, 4)),  /* PG_EINT4 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 5),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "mmc1"),          /* D3 */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 2, 5)),  /* PG_EINT5 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 6),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "uart1"),         /* TX */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 2, 6)),  /* PG_EINT6 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 7),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "uart1"),         /* RX */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 2, 7)),  /* PG_EINT7 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 8),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "uart2"),         /* RTS */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 2, 8)),  /* PG_EINT8 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 9),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "uart2"),         /* CTS */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 2, 9)),  /* PG_EINT9 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 10),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "i2s1"),          /* SYNC */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 2, 10)), /* PG_EINT10 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 11),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "i2s1"),          /* CLK */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 2, 11)), /* PG_EINT11 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 12),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "i2s1"),          /* DOUT */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 2, 12)), /* PG_EINT12 */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 13),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "i2s1"),          /* DIN */
+                 SUNXI_FUNCTION_IRQ_BANK(0x4, 2, 13)), /* PG_EINT13 */
+       /* Hole */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 0),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "pwm0")),
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 1),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "pwm1")),
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 2),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "i2c0")),         /* SCK */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 3),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "i2c0")),         /* SDA */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 4),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "i2c1")),         /* SCK */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 5),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "i2c1")),         /* SDA */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 6),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "spi0"),          /* CS */
+                 SUNXI_FUNCTION(0x3, "uart3")),        /* TX */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 7),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "spi0"),          /* CLK */
+                 SUNXI_FUNCTION(0x3, "uart3")),        /* RX */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 8),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "spi0"),          /* DOUT */
+                 SUNXI_FUNCTION(0x3, "uart3")),        /* RTS */
+       SUNXI_PIN(SUNXI_PINCTRL_PIN(H, 9),
+                 SUNXI_FUNCTION(0x0, "gpio_in"),
+                 SUNXI_FUNCTION(0x1, "gpio_out"),
+                 SUNXI_FUNCTION(0x2, "spi0"),          /* DIN */
+                 SUNXI_FUNCTION(0x3, "uart3")),        /* CTS */
+};
+
+static const struct sunxi_pinctrl_desc sun8i_a23_pinctrl_data = {
+       .pins = sun8i_a23_pins,
+       .npins = ARRAY_SIZE(sun8i_a23_pins),
+       .irq_banks = 3,
+};
+
+static int sun8i_a23_pinctrl_probe(struct platform_device *pdev)
+{
+       return sunxi_pinctrl_init(pdev,
+                                 &sun8i_a23_pinctrl_data);
+}
+
+static struct of_device_id sun8i_a23_pinctrl_match[] = {
+       { .compatible = "allwinner,sun8i-a23-pinctrl", },
+       {}
+};
+MODULE_DEVICE_TABLE(of, sun8i_a23_pinctrl_match);
+
+static struct platform_driver sun8i_a23_pinctrl_driver = {
+       .probe  = sun8i_a23_pinctrl_probe,
+       .driver = {
+               .name           = "sun8i-a23-pinctrl",
+               .owner          = THIS_MODULE,
+               .of_match_table = sun8i_a23_pinctrl_match,
+       },
+};
+module_platform_driver(sun8i_a23_pinctrl_driver);
+
+MODULE_AUTHOR("Chen-Yu Tsai <wens@csie.org>");
+MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com");
+MODULE_DESCRIPTION("Allwinner A23 pinctrl driver");
+MODULE_LICENSE("GPL");
index 5f38c7f67834d1cf8bd8bcc2f8d80cd03a76c04a..3df66e366c8775b25768e079d4febb91c8461b4a 100644 (file)
@@ -31,6 +31,9 @@
 #include "../core.h"
 #include "pinctrl-sunxi.h"
 
+static struct irq_chip sunxi_pinctrl_edge_irq_chip;
+static struct irq_chip sunxi_pinctrl_level_irq_chip;
+
 static struct sunxi_pinctrl_group *
 sunxi_pinctrl_find_group_by_name(struct sunxi_pinctrl *pctl, const char *group)
 {
@@ -508,7 +511,7 @@ static int sunxi_pinctrl_gpio_of_xlate(struct gpio_chip *gc,
        base = PINS_PER_BANK * gpiospec->args[0];
        pin = base + gpiospec->args[1];
 
-       if (pin > (gc->base + gc->ngpio))
+       if (pin > gc->ngpio)
                return -EINVAL;
 
        if (flags)
@@ -521,25 +524,61 @@ static int sunxi_pinctrl_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
 {
        struct sunxi_pinctrl *pctl = dev_get_drvdata(chip->dev);
        struct sunxi_desc_function *desc;
+       unsigned pinnum = pctl->desc->pin_base + offset;
+       unsigned irqnum;
 
        if (offset >= chip->ngpio)
                return -ENXIO;
 
-       desc = sunxi_pinctrl_desc_find_function_by_pin(pctl, offset, "irq");
+       desc = sunxi_pinctrl_desc_find_function_by_pin(pctl, pinnum, "irq");
        if (!desc)
                return -EINVAL;
 
+       irqnum = desc->irqbank * IRQ_PER_BANK + desc->irqnum;
+
        dev_dbg(chip->dev, "%s: request IRQ for GPIO %d, return %d\n",
-               chip->label, offset + chip->base, desc->irqnum);
+               chip->label, offset + chip->base, irqnum);
 
-       return irq_find_mapping(pctl->domain, desc->irqnum);
+       return irq_find_mapping(pctl->domain, irqnum);
 }
 
+static int sunxi_pinctrl_irq_request_resources(struct irq_data *d)
+{
+       struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d);
+       struct sunxi_desc_function *func;
+       int ret;
+
+       func = sunxi_pinctrl_desc_find_function_by_pin(pctl,
+                                       pctl->irq_array[d->hwirq], "irq");
+       if (!func)
+               return -EINVAL;
+
+       ret = gpio_lock_as_irq(pctl->chip,
+                       pctl->irq_array[d->hwirq] - pctl->desc->pin_base);
+       if (ret) {
+               dev_err(pctl->dev, "unable to lock HW IRQ %lu for IRQ\n",
+                       irqd_to_hwirq(d));
+               return ret;
+       }
+
+       /* Change muxing to INT mode */
+       sunxi_pmx_set(pctl->pctl_dev, pctl->irq_array[d->hwirq], func->muxval);
 
-static int sunxi_pinctrl_irq_set_type(struct irq_data *d,
-                                     unsigned int type)
+       return 0;
+}
+
+static void sunxi_pinctrl_irq_release_resources(struct irq_data *d)
+{
+       struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d);
+
+       gpio_unlock_as_irq(pctl->chip,
+                          pctl->irq_array[d->hwirq] - pctl->desc->pin_base);
+}
+
+static int sunxi_pinctrl_irq_set_type(struct irq_data *d, unsigned int type)
 {
        struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d);
+       struct irq_desc *desc = container_of(d, struct irq_desc, irq_data);
        u32 reg = sunxi_irq_cfg_reg(d->hwirq);
        u8 index = sunxi_irq_cfg_offset(d->hwirq);
        unsigned long flags;
@@ -566,6 +605,14 @@ static int sunxi_pinctrl_irq_set_type(struct irq_data *d,
                return -EINVAL;
        }
 
+       if (type & IRQ_TYPE_LEVEL_MASK) {
+               d->chip = &sunxi_pinctrl_level_irq_chip;
+               desc->handle_irq = handle_fasteoi_irq;
+       } else {
+               d->chip = &sunxi_pinctrl_edge_irq_chip;
+               desc->handle_irq = handle_edge_irq;
+       }
+
        spin_lock_irqsave(&pctl->lock, flags);
 
        regval = readl(pctl->membase + reg);
@@ -577,26 +624,14 @@ static int sunxi_pinctrl_irq_set_type(struct irq_data *d,
        return 0;
 }
 
-static void sunxi_pinctrl_irq_mask_ack(struct irq_data *d)
+static void sunxi_pinctrl_irq_ack(struct irq_data *d)
 {
        struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d);
-       u32 ctrl_reg = sunxi_irq_ctrl_reg(d->hwirq);
-       u8 ctrl_idx = sunxi_irq_ctrl_offset(d->hwirq);
        u32 status_reg = sunxi_irq_status_reg(d->hwirq);
        u8 status_idx = sunxi_irq_status_offset(d->hwirq);
-       unsigned long flags;
-       u32 val;
-
-       spin_lock_irqsave(&pctl->lock, flags);
-
-       /* Mask the IRQ */
-       val = readl(pctl->membase + ctrl_reg);
-       writel(val & ~(1 << ctrl_idx), pctl->membase + ctrl_reg);
 
        /* Clear the IRQ */
        writel(1 << status_idx, pctl->membase + status_reg);
-
-       spin_unlock_irqrestore(&pctl->lock, flags);
 }
 
 static void sunxi_pinctrl_irq_mask(struct irq_data *d)
@@ -619,19 +654,11 @@ static void sunxi_pinctrl_irq_mask(struct irq_data *d)
 static void sunxi_pinctrl_irq_unmask(struct irq_data *d)
 {
        struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d);
-       struct sunxi_desc_function *func;
        u32 reg = sunxi_irq_ctrl_reg(d->hwirq);
        u8 idx = sunxi_irq_ctrl_offset(d->hwirq);
        unsigned long flags;
        u32 val;
 
-       func = sunxi_pinctrl_desc_find_function_by_pin(pctl,
-                                                      pctl->irq_array[d->hwirq],
-                                                      "irq");
-
-       /* Change muxing to INT mode */
-       sunxi_pmx_set(pctl->pctl_dev, pctl->irq_array[d->hwirq], func->muxval);
-
        spin_lock_irqsave(&pctl->lock, flags);
 
        /* Unmask the IRQ */
@@ -641,28 +668,60 @@ static void sunxi_pinctrl_irq_unmask(struct irq_data *d)
        spin_unlock_irqrestore(&pctl->lock, flags);
 }
 
-static struct irq_chip sunxi_pinctrl_irq_chip = {
+static void sunxi_pinctrl_irq_ack_unmask(struct irq_data *d)
+{
+       sunxi_pinctrl_irq_ack(d);
+       sunxi_pinctrl_irq_unmask(d);
+}
+
+static struct irq_chip sunxi_pinctrl_edge_irq_chip = {
+       .irq_ack        = sunxi_pinctrl_irq_ack,
+       .irq_mask       = sunxi_pinctrl_irq_mask,
+       .irq_unmask     = sunxi_pinctrl_irq_unmask,
+       .irq_request_resources = sunxi_pinctrl_irq_request_resources,
+       .irq_release_resources = sunxi_pinctrl_irq_release_resources,
+       .irq_set_type   = sunxi_pinctrl_irq_set_type,
+       .flags          = IRQCHIP_SKIP_SET_WAKE,
+};
+
+static struct irq_chip sunxi_pinctrl_level_irq_chip = {
+       .irq_eoi        = sunxi_pinctrl_irq_ack,
        .irq_mask       = sunxi_pinctrl_irq_mask,
-       .irq_mask_ack   = sunxi_pinctrl_irq_mask_ack,
        .irq_unmask     = sunxi_pinctrl_irq_unmask,
+       /* Define irq_enable / disable to avoid spurious irqs for drivers
+        * using these to suppress irqs while they clear the irq source */
+       .irq_enable     = sunxi_pinctrl_irq_ack_unmask,
+       .irq_disable    = sunxi_pinctrl_irq_mask,
+       .irq_request_resources = sunxi_pinctrl_irq_request_resources,
+       .irq_release_resources = sunxi_pinctrl_irq_release_resources,
        .irq_set_type   = sunxi_pinctrl_irq_set_type,
+       .flags          = IRQCHIP_SKIP_SET_WAKE | IRQCHIP_EOI_THREADED |
+                         IRQCHIP_EOI_IF_HANDLED,
 };
 
 static void sunxi_pinctrl_irq_handler(unsigned irq, struct irq_desc *desc)
 {
        struct irq_chip *chip = irq_get_chip(irq);
        struct sunxi_pinctrl *pctl = irq_get_handler_data(irq);
-       const unsigned long reg = readl(pctl->membase + IRQ_STATUS_REG);
+       unsigned long bank, reg, val;
+
+       for (bank = 0; bank < pctl->desc->irq_banks; bank++)
+               if (irq == pctl->irq[bank])
+                       break;
+
+       if (bank == pctl->desc->irq_banks)
+               return;
 
-       /* Clear all interrupts */
-       writel(reg, pctl->membase + IRQ_STATUS_REG);
+       reg = sunxi_irq_status_reg_from_bank(bank);
+       val = readl(pctl->membase + reg);
 
-       if (reg) {
+       if (val) {
                int irqoffset;
 
                chained_irq_enter(chip, desc);
-               for_each_set_bit(irqoffset, &reg, SUNXI_IRQ_NUMBER) {
-                       int pin_irq = irq_find_mapping(pctl->domain, irqoffset);
+               for_each_set_bit(irqoffset, &val, IRQ_PER_BANK) {
+                       int pin_irq = irq_find_mapping(pctl->domain,
+                                                      bank * IRQ_PER_BANK + irqoffset);
                        generic_handle_irq(pin_irq);
                }
                chained_irq_exit(chip, desc);
@@ -730,8 +789,11 @@ static int sunxi_pinctrl_build_state(struct platform_device *pdev)
 
                while (func->name) {
                        /* Create interrupt mapping while we're at it */
-                       if (!strcmp(func->name, "irq"))
-                               pctl->irq_array[func->irqnum] = pin->pin.number;
+                       if (!strcmp(func->name, "irq")) {
+                               int irqnum = func->irqnum + func->irqbank * IRQ_PER_BANK;
+                               pctl->irq_array[irqnum] = pin->pin.number;
+                       }
+
                        sunxi_pinctrl_add_function(pctl, func->name);
                        func++;
                }
@@ -801,6 +863,13 @@ int sunxi_pinctrl_init(struct platform_device *pdev,
        pctl->dev = &pdev->dev;
        pctl->desc = desc;
 
+       pctl->irq_array = devm_kcalloc(&pdev->dev,
+                                      IRQ_PER_BANK * pctl->desc->irq_banks,
+                                      sizeof(*pctl->irq_array),
+                                      GFP_KERNEL);
+       if (!pctl->irq_array)
+               return -ENOMEM;
+
        ret = sunxi_pinctrl_build_state(pdev);
        if (ret) {
                dev_err(&pdev->dev, "dt probe failed: %d\n", ret);
@@ -869,7 +938,7 @@ int sunxi_pinctrl_init(struct platform_device *pdev,
                const struct sunxi_desc_pin *pin = pctl->desc->pins + i;
 
                ret = gpiochip_add_pin_range(pctl->chip, dev_name(&pdev->dev),
-                                            pin->pin.number,
+                                            pin->pin.number - pctl->desc->pin_base,
                                             pin->pin.number, 1);
                if (ret)
                        goto gpiochip_error;
@@ -885,30 +954,51 @@ int sunxi_pinctrl_init(struct platform_device *pdev,
        if (ret)
                goto gpiochip_error;
 
-       pctl->irq = irq_of_parse_and_map(node, 0);
+       pctl->irq = devm_kcalloc(&pdev->dev,
+                                pctl->desc->irq_banks,
+                                sizeof(*pctl->irq),
+                                GFP_KERNEL);
        if (!pctl->irq) {
-               ret = -EINVAL;
+               ret = -ENOMEM;
                goto clk_error;
        }
 
-       pctl->domain = irq_domain_add_linear(node, SUNXI_IRQ_NUMBER,
-                                            &irq_domain_simple_ops, NULL);
+       for (i = 0; i < pctl->desc->irq_banks; i++) {
+               pctl->irq[i] = platform_get_irq(pdev, i);
+               if (pctl->irq[i] < 0) {
+                       ret = pctl->irq[i];
+                       goto clk_error;
+               }
+       }
+
+       pctl->domain = irq_domain_add_linear(node,
+                                            pctl->desc->irq_banks * IRQ_PER_BANK,
+                                            &irq_domain_simple_ops,
+                                            NULL);
        if (!pctl->domain) {
                dev_err(&pdev->dev, "Couldn't register IRQ domain\n");
                ret = -ENOMEM;
                goto clk_error;
        }
 
-       for (i = 0; i < SUNXI_IRQ_NUMBER; i++) {
+       for (i = 0; i < (pctl->desc->irq_banks * IRQ_PER_BANK); i++) {
                int irqno = irq_create_mapping(pctl->domain, i);
 
-               irq_set_chip_and_handler(irqno, &sunxi_pinctrl_irq_chip,
-                                        handle_simple_irq);
+               irq_set_chip_and_handler(irqno, &sunxi_pinctrl_edge_irq_chip,
+                                        handle_edge_irq);
                irq_set_chip_data(irqno, pctl);
        };
 
-       irq_set_chained_handler(pctl->irq, sunxi_pinctrl_irq_handler);
-       irq_set_handler_data(pctl->irq, pctl);
+       for (i = 0; i < pctl->desc->irq_banks; i++) {
+               /* Mask and clear all IRQs before registering a handler */
+               writel(0, pctl->membase + sunxi_irq_ctrl_reg_from_bank(i));
+               writel(0xffffffff,
+                       pctl->membase + sunxi_irq_status_reg_from_bank(i));
+
+               irq_set_chained_handler(pctl->irq[i],
+                                       sunxi_pinctrl_irq_handler);
+               irq_set_handler_data(pctl->irq[i], pctl);
+       }
 
        dev_info(&pdev->dev, "initialized sunXi PIO driver\n");
 
@@ -917,8 +1007,7 @@ int sunxi_pinctrl_init(struct platform_device *pdev,
 clk_error:
        clk_disable_unprepare(clk);
 gpiochip_error:
-       if (gpiochip_remove(pctl->chip))
-               dev_err(&pdev->dev, "failed to remove gpio chip\n");
+       gpiochip_remove(pctl->chip);
 pinctrl_error:
        pinctrl_unregister(pctl->pctl_dev);
        return ret;
index 8169ba5988767f51b7f40ce07d66ec89ab9285ad..4245b96c799649b91241cbedd13ad2b5b201ee4b 100644 (file)
@@ -53,7 +53,7 @@
 #define PULL_PINS_BITS         2
 #define PULL_PINS_MASK         0x03
 
-#define SUNXI_IRQ_NUMBER       32
+#define IRQ_PER_BANK           32
 
 #define IRQ_CFG_REG            0x200
 #define IRQ_CFG_IRQ_PER_REG            8
@@ -68,6 +68,8 @@
 #define IRQ_STATUS_IRQ_BITS            1
 #define IRQ_STATUS_IRQ_MASK            ((1 << IRQ_STATUS_IRQ_BITS) - 1)
 
+#define IRQ_MEM_SIZE           0x20
+
 #define IRQ_EDGE_RISING                0x00
 #define IRQ_EDGE_FALLING       0x01
 #define IRQ_LEVEL_HIGH         0x02
@@ -77,6 +79,7 @@
 struct sunxi_desc_function {
        const char      *name;
        u8              muxval;
+       u8              irqbank;
        u8              irqnum;
 };
 
@@ -89,6 +92,7 @@ struct sunxi_pinctrl_desc {
        const struct sunxi_desc_pin     *pins;
        int                             npins;
        unsigned                        pin_base;
+       unsigned                        irq_banks;
 };
 
 struct sunxi_pinctrl_function {
@@ -113,8 +117,8 @@ struct sunxi_pinctrl {
        unsigned                        nfunctions;
        struct sunxi_pinctrl_group      *groups;
        unsigned                        ngroups;
-       int                             irq;
-       int                             irq_array[SUNXI_IRQ_NUMBER];
+       int                             *irq;
+       unsigned                        *irq_array;
        spinlock_t                      lock;
        struct pinctrl_dev              *pctl_dev;
 };
@@ -139,6 +143,14 @@ struct sunxi_pinctrl {
                .irqnum = _irq,                                 \
        }
 
+#define SUNXI_FUNCTION_IRQ_BANK(_val, _bank, _irq)             \
+       {                                                       \
+               .name = "irq",                                  \
+               .muxval = _val,                                 \
+               .irqbank = _bank,                               \
+               .irqnum = _irq,                                 \
+       }
+
 /*
  * The sunXi PIO registers are organized as is:
  * 0x00 - 0x0c Muxing values.
@@ -218,8 +230,10 @@ static inline u32 sunxi_pull_offset(u16 pin)
 
 static inline u32 sunxi_irq_cfg_reg(u16 irq)
 {
-       u8 reg = irq / IRQ_CFG_IRQ_PER_REG * 0x04;
-       return reg + IRQ_CFG_REG;
+       u8 bank = irq / IRQ_PER_BANK;
+       u8 reg = (irq % IRQ_PER_BANK) / IRQ_CFG_IRQ_PER_REG * 0x04;
+
+       return IRQ_CFG_REG + bank * IRQ_MEM_SIZE + reg;
 }
 
 static inline u32 sunxi_irq_cfg_offset(u16 irq)
@@ -228,10 +242,16 @@ static inline u32 sunxi_irq_cfg_offset(u16 irq)
        return irq_num * IRQ_CFG_IRQ_BITS;
 }
 
+static inline u32 sunxi_irq_ctrl_reg_from_bank(u8 bank)
+{
+       return IRQ_CTRL_REG + bank * IRQ_MEM_SIZE;
+}
+
 static inline u32 sunxi_irq_ctrl_reg(u16 irq)
 {
-       u8 reg = irq / IRQ_CTRL_IRQ_PER_REG * 0x04;
-       return reg + IRQ_CTRL_REG;
+       u8 bank = irq / IRQ_PER_BANK;
+
+       return sunxi_irq_ctrl_reg_from_bank(bank);
 }
 
 static inline u32 sunxi_irq_ctrl_offset(u16 irq)
@@ -240,10 +260,16 @@ static inline u32 sunxi_irq_ctrl_offset(u16 irq)
        return irq_num * IRQ_CTRL_IRQ_BITS;
 }
 
+static inline u32 sunxi_irq_status_reg_from_bank(u8 bank)
+{
+       return IRQ_STATUS_REG + bank * IRQ_MEM_SIZE;
+}
+
 static inline u32 sunxi_irq_status_reg(u16 irq)
 {
-       u8 reg = irq / IRQ_STATUS_IRQ_PER_REG * 0x04;
-       return reg + IRQ_STATUS_REG;
+       u8 bank = irq / IRQ_PER_BANK;
+
+       return sunxi_irq_status_reg_from_bank(bank);
 }
 
 static inline u32 sunxi_irq_status_offset(u16 irq)
index 2c61281bebd7666f6b12e87a7618c47a3a3aae18..8cea355f9a810ebd6babf1c49c0da00257029752 100644 (file)
@@ -141,17 +141,6 @@ static int wmt_pmx_enable(struct pinctrl_dev *pctldev,
        return wmt_set_pinmux(data, func_selector, pinnum);
 }
 
-static void wmt_pmx_disable(struct pinctrl_dev *pctldev,
-                           unsigned func_selector,
-                           unsigned group_selector)
-{
-       struct wmt_pinctrl_data *data = pinctrl_dev_get_drvdata(pctldev);
-       u32 pinnum = data->pins[group_selector].number;
-
-       /* disable by setting GPIO_IN */
-       wmt_set_pinmux(data, WMT_FSEL_GPIO_IN, pinnum);
-}
-
 static void wmt_pmx_gpio_disable_free(struct pinctrl_dev *pctldev,
                                      struct pinctrl_gpio_range *range,
                                      unsigned offset)
@@ -180,7 +169,6 @@ static struct pinmux_ops wmt_pinmux_ops = {
        .get_function_name = wmt_pmx_get_function_name,
        .get_function_groups = wmt_pmx_get_function_groups,
        .enable = wmt_pmx_enable,
-       .disable = wmt_pmx_disable,
        .gpio_disable_free = wmt_pmx_gpio_disable_free,
        .gpio_set_direction = wmt_pmx_gpio_set_direction,
 };
@@ -627,8 +615,7 @@ int wmt_pinctrl_probe(struct platform_device *pdev,
        return 0;
 
 fail_range:
-       if (gpiochip_remove(&data->gpio_chip))
-               dev_err(&pdev->dev, "failed to remove gpio chip\n");
+       gpiochip_remove(&data->gpio_chip);
 fail_gpio:
        pinctrl_unregister(data->pctl_dev);
        return err;
@@ -637,12 +624,8 @@ fail_gpio:
 int wmt_pinctrl_remove(struct platform_device *pdev)
 {
        struct wmt_pinctrl_data *data = platform_get_drvdata(pdev);
-       int err;
-
-       err = gpiochip_remove(&data->gpio_chip);
-       if (err)
-               dev_err(&pdev->dev, "failed to remove gpio chip\n");
 
+       gpiochip_remove(&data->gpio_chip);
        pinctrl_unregister(data->pctl_dev);
 
        return 0;
index 5413f62d2e6136b62327abdd0d32c8f000b3c531..28d12bda3ac1a2900b6bff5c20af04d9ecbd153e 100644 (file)
@@ -46,13 +46,7 @@ static int samsungq10_bl_set_intensity(struct backlight_device *bd)
        return 0;
 }
 
-static int samsungq10_bl_get_intensity(struct backlight_device *bd)
-{
-       return bd->props.brightness;
-}
-
 static const struct backlight_ops samsungq10_bl_ops = {
-       .get_brightness = samsungq10_bl_get_intensity,
        .update_status  = samsungq10_bl_set_intensity,
 };
 
index f2ac54df496f1e3b0ea597315a41a1e24f09af76..ca41523bbebf767ad1af56594cd1ba57d297b06e 100644 (file)
@@ -39,6 +39,12 @@ config POWER_RESET_GPIO
          If your board needs a GPIO high/low to power down, say Y and
          create a binding in your devicetree.
 
+config POWER_RESET_HISI
+       bool "Hisilicon power-off driver"
+       depends on POWER_RESET && ARCH_HISI
+       help
+         Reboot support for Hisilicon boards.
+
 config POWER_RESET_MSM
        bool "Qualcomm MSM power-off driver"
        depends on POWER_RESET && ARCH_QCOM
index 7379818ca69d097f47ba7a3f8d4790755b67f8ff..a42e70edd0376912b88b4f4a4a3f3fc01ef17496 100644 (file)
@@ -2,6 +2,7 @@ obj-$(CONFIG_POWER_RESET_AS3722) += as3722-poweroff.o
 obj-$(CONFIG_POWER_RESET_AXXIA) += axxia-reset.o
 obj-$(CONFIG_POWER_RESET_BRCMSTB) += brcmstb-reboot.o
 obj-$(CONFIG_POWER_RESET_GPIO) += gpio-poweroff.o
+obj-$(CONFIG_POWER_RESET_HISI) += hisi-reboot.o
 obj-$(CONFIG_POWER_RESET_MSM) += msm-poweroff.o
 obj-$(CONFIG_POWER_RESET_QNAP) += qnap-poweroff.o
 obj-$(CONFIG_POWER_RESET_RESTART) += restart-poweroff.o
diff --git a/drivers/power/reset/hisi-reboot.c b/drivers/power/reset/hisi-reboot.c
new file mode 100644 (file)
index 0000000..0c91d02
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * Hisilicon SoC reset code
+ *
+ * Copyright (c) 2014 Hisilicon Ltd.
+ * Copyright (c) 2014 Linaro Ltd.
+ *
+ * Author: Haojian Zhuang <haojian.zhuang@linaro.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/delay.h>
+#include <linux/io.h>
+#include <linux/module.h>
+#include <linux/of_address.h>
+#include <linux/platform_device.h>
+#include <linux/reboot.h>
+
+#include <asm/proc-fns.h>
+#include <asm/system_misc.h>
+
+static void __iomem *base;
+static u32 reboot_offset;
+
+static void hisi_restart(enum reboot_mode mode, const char *cmd)
+{
+       writel_relaxed(0xdeadbeef, base + reboot_offset);
+
+       while (1)
+               cpu_do_idle();
+}
+
+static int hisi_reboot_probe(struct platform_device *pdev)
+{
+       struct device_node *np = pdev->dev.of_node;
+
+       base = of_iomap(np, 0);
+       if (!base) {
+               WARN(1, "failed to map base address");
+               return -ENODEV;
+       }
+
+       if (of_property_read_u32(np, "reboot-offset", &reboot_offset) < 0) {
+               pr_err("failed to find reboot-offset property\n");
+               return -EINVAL;
+       }
+
+       arm_pm_restart = hisi_restart;
+
+       return 0;
+}
+
+static struct of_device_id hisi_reboot_of_match[] = {
+       { .compatible = "hisilicon,sysctrl" },
+       {}
+};
+
+static struct platform_driver hisi_reboot_driver = {
+       .probe = hisi_reboot_probe,
+       .driver = {
+               .name = "hisi-reboot",
+               .of_match_table = hisi_reboot_of_match,
+       },
+};
+module_platform_driver(hisi_reboot_driver);
index 4ad7b89a4cb44c4ee200b79036750fcce267e674..331dfca415c75fc19dcb79d63f2df861a22cb159 100644 (file)
@@ -43,7 +43,7 @@ config PWM_AB8500
 
 config PWM_ATMEL
        tristate "Atmel PWM support"
-       depends on ARCH_AT91
+       depends on ARCH_AT91 || AVR32
        help
          Generic PWM framework driver for Atmel SoC.
 
index 2b7e9e22049775da7aea382e9b4b7815e881cff4..b16c53a8272f84e4920fd46883f4ae6eb148405a 100644 (file)
@@ -31,6 +31,7 @@
 #include <linux/mfd/samsung/core.h>
 #include <linux/mfd/samsung/s2mps11.h>
 #include <linux/mfd/samsung/s2mps14.h>
+#include <linux/mfd/samsung/s2mpu02.h>
 
 struct s2mps11_info {
        unsigned int rdev_num;
@@ -40,11 +41,15 @@ struct s2mps11_info {
        int ramp_delay16;
        int ramp_delay7810;
        int ramp_delay9;
+
+       enum sec_device_type dev_type;
+
        /*
-        * One bit for each S2MPS14 regulator whether the suspend mode
+        * One bit for each S2MPS14/S2MPU02 regulator whether the suspend mode
         * was enabled.
         */
-       unsigned int s2mps14_suspend_state:30;
+       unsigned long long s2mps14_suspend_state:35;
+
        /* Array of size rdev_num with GPIO-s for external sleep control */
        int *ext_control_gpio;
 };
@@ -415,12 +420,24 @@ static int s2mps14_regulator_enable(struct regulator_dev *rdev)
        struct s2mps11_info *s2mps11 = rdev_get_drvdata(rdev);
        unsigned int val;
 
-       if (s2mps11->s2mps14_suspend_state & (1 << rdev_get_id(rdev)))
-               val = S2MPS14_ENABLE_SUSPEND;
-       else if (gpio_is_valid(s2mps11->ext_control_gpio[rdev_get_id(rdev)]))
-               val = S2MPS14_ENABLE_EXT_CONTROL;
-       else
-               val = rdev->desc->enable_mask;
+       switch (s2mps11->dev_type) {
+       case S2MPS14X:
+               if (s2mps11->s2mps14_suspend_state & (1 << rdev_get_id(rdev)))
+                       val = S2MPS14_ENABLE_SUSPEND;
+               else if (gpio_is_valid(s2mps11->ext_control_gpio[rdev_get_id(rdev)]))
+                       val = S2MPS14_ENABLE_EXT_CONTROL;
+               else
+                       val = rdev->desc->enable_mask;
+               break;
+       case S2MPU02:
+               if (s2mps11->s2mps14_suspend_state & (1 << rdev_get_id(rdev)))
+                       val = S2MPU02_ENABLE_SUSPEND;
+               else
+                       val = rdev->desc->enable_mask;
+               break;
+       default:
+               return -EINVAL;
+       };
 
        return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
                        rdev->desc->enable_mask, val);
@@ -429,12 +446,38 @@ static int s2mps14_regulator_enable(struct regulator_dev *rdev)
 static int s2mps14_regulator_set_suspend_disable(struct regulator_dev *rdev)
 {
        int ret;
-       unsigned int val;
+       unsigned int val, state;
        struct s2mps11_info *s2mps11 = rdev_get_drvdata(rdev);
+       int rdev_id = rdev_get_id(rdev);
 
-       /* LDO3 should be always on and does not support suspend mode */
-       if (rdev_get_id(rdev) == S2MPS14_LDO3)
-               return 0;
+       /* Below LDO should be always on or does not support suspend mode. */
+       switch (s2mps11->dev_type) {
+       case S2MPS14X:
+               switch (rdev_id) {
+               case S2MPS14_LDO3:
+                       return 0;
+               default:
+                       state = S2MPS14_ENABLE_SUSPEND;
+                       break;
+               };
+               break;
+       case S2MPU02:
+               switch (rdev_id) {
+               case S2MPU02_LDO13:
+               case S2MPU02_LDO14:
+               case S2MPU02_LDO15:
+               case S2MPU02_LDO17:
+               case S2MPU02_BUCK7:
+                       state = S2MPU02_DISABLE_SUSPEND;
+                       break;
+               default:
+                       state = S2MPU02_ENABLE_SUSPEND;
+                       break;
+               };
+               break;
+       default:
+               return -EINVAL;
+       };
 
        ret = regmap_read(rdev->regmap, rdev->desc->enable_reg, &val);
        if (ret < 0)
@@ -452,7 +495,7 @@ static int s2mps14_regulator_set_suspend_disable(struct regulator_dev *rdev)
                return 0;
 
        return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
-                       rdev->desc->enable_mask, S2MPS14_ENABLE_SUSPEND);
+                       rdev->desc->enable_mask, state);
 }
 
 static struct regulator_ops s2mps14_reg_ops = {
@@ -605,8 +648,7 @@ static void s2mps14_pmic_dt_parse_ext_control_gpio(struct platform_device *pdev,
 }
 
 static int s2mps11_pmic_dt_parse(struct platform_device *pdev,
-               struct of_regulator_match *rdata, struct s2mps11_info *s2mps11,
-               enum sec_device_type dev_type)
+               struct of_regulator_match *rdata, struct s2mps11_info *s2mps11)
 {
        struct device_node *reg_np;
 
@@ -617,7 +659,7 @@ static int s2mps11_pmic_dt_parse(struct platform_device *pdev,
        }
 
        of_regulator_match(&pdev->dev, reg_np, rdata, s2mps11->rdev_num);
-       if (dev_type == S2MPS14X)
+       if (s2mps11->dev_type == S2MPS14X)
                s2mps14_pmic_dt_parse_ext_control_gpio(pdev, rdata, s2mps11);
 
        of_node_put(reg_np);
@@ -625,6 +667,238 @@ static int s2mps11_pmic_dt_parse(struct platform_device *pdev,
        return 0;
 }
 
+static int s2mpu02_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)
+{
+       unsigned int ramp_val, ramp_shift, ramp_reg;
+
+       switch (rdev_get_id(rdev)) {
+       case S2MPU02_BUCK1:
+               ramp_shift = S2MPU02_BUCK1_RAMP_SHIFT;
+               break;
+       case S2MPU02_BUCK2:
+               ramp_shift = S2MPU02_BUCK2_RAMP_SHIFT;
+               break;
+       case S2MPU02_BUCK3:
+               ramp_shift = S2MPU02_BUCK3_RAMP_SHIFT;
+               break;
+       case S2MPU02_BUCK4:
+               ramp_shift = S2MPU02_BUCK4_RAMP_SHIFT;
+               break;
+       default:
+               return 0;
+       }
+       ramp_reg = S2MPU02_REG_RAMP1;
+       ramp_val = get_ramp_delay(ramp_delay);
+
+       return regmap_update_bits(rdev->regmap, ramp_reg,
+                                 S2MPU02_BUCK1234_RAMP_MASK << ramp_shift,
+                                 ramp_val << ramp_shift);
+}
+
+static struct regulator_ops s2mpu02_ldo_ops = {
+       .list_voltage           = regulator_list_voltage_linear,
+       .map_voltage            = regulator_map_voltage_linear,
+       .is_enabled             = regulator_is_enabled_regmap,
+       .enable                 = s2mps14_regulator_enable,
+       .disable                = regulator_disable_regmap,
+       .get_voltage_sel        = regulator_get_voltage_sel_regmap,
+       .set_voltage_sel        = regulator_set_voltage_sel_regmap,
+       .set_voltage_time_sel   = regulator_set_voltage_time_sel,
+       .set_suspend_disable    = s2mps14_regulator_set_suspend_disable,
+};
+
+static struct regulator_ops s2mpu02_buck_ops = {
+       .list_voltage           = regulator_list_voltage_linear,
+       .map_voltage            = regulator_map_voltage_linear,
+       .is_enabled             = regulator_is_enabled_regmap,
+       .enable                 = s2mps14_regulator_enable,
+       .disable                = regulator_disable_regmap,
+       .get_voltage_sel        = regulator_get_voltage_sel_regmap,
+       .set_voltage_sel        = regulator_set_voltage_sel_regmap,
+       .set_voltage_time_sel   = regulator_set_voltage_time_sel,
+       .set_suspend_disable    = s2mps14_regulator_set_suspend_disable,
+       .set_ramp_delay         = s2mpu02_set_ramp_delay,
+};
+
+#define regulator_desc_s2mpu02_ldo1(num) {             \
+       .name           = "LDO"#num,                    \
+       .id             = S2MPU02_LDO##num,             \
+       .ops            = &s2mpu02_ldo_ops,             \
+       .type           = REGULATOR_VOLTAGE,            \
+       .owner          = THIS_MODULE,                  \
+       .min_uV         = S2MPU02_LDO_MIN_900MV,        \
+       .uV_step        = S2MPU02_LDO_STEP_12_5MV,      \
+       .linear_min_sel = S2MPU02_LDO_GROUP1_START_SEL, \
+       .n_voltages     = S2MPU02_LDO_N_VOLTAGES,       \
+       .vsel_reg       = S2MPU02_REG_L1CTRL,           \
+       .vsel_mask      = S2MPU02_LDO_VSEL_MASK,        \
+       .enable_reg     = S2MPU02_REG_L1CTRL,           \
+       .enable_mask    = S2MPU02_ENABLE_MASK           \
+}
+#define regulator_desc_s2mpu02_ldo2(num) {             \
+       .name           = "LDO"#num,                    \
+       .id             = S2MPU02_LDO##num,             \
+       .ops            = &s2mpu02_ldo_ops,             \
+       .type           = REGULATOR_VOLTAGE,            \
+       .owner          = THIS_MODULE,                  \
+       .min_uV         = S2MPU02_LDO_MIN_1050MV,       \
+       .uV_step        = S2MPU02_LDO_STEP_25MV,        \
+       .linear_min_sel = S2MPU02_LDO_GROUP2_START_SEL, \
+       .n_voltages     = S2MPU02_LDO_N_VOLTAGES,       \
+       .vsel_reg       = S2MPU02_REG_L2CTRL1,          \
+       .vsel_mask      = S2MPU02_LDO_VSEL_MASK,        \
+       .enable_reg     = S2MPU02_REG_L2CTRL1,          \
+       .enable_mask    = S2MPU02_ENABLE_MASK           \
+}
+#define regulator_desc_s2mpu02_ldo3(num) {             \
+       .name           = "LDO"#num,                    \
+       .id             = S2MPU02_LDO##num,             \
+       .ops            = &s2mpu02_ldo_ops,             \
+       .type           = REGULATOR_VOLTAGE,            \
+       .owner          = THIS_MODULE,                  \
+       .min_uV         = S2MPU02_LDO_MIN_900MV,        \
+       .uV_step        = S2MPU02_LDO_STEP_12_5MV,      \
+       .linear_min_sel = S2MPU02_LDO_GROUP1_START_SEL, \
+       .n_voltages     = S2MPU02_LDO_N_VOLTAGES,       \
+       .vsel_reg       = S2MPU02_REG_L3CTRL + num - 3, \
+       .vsel_mask      = S2MPU02_LDO_VSEL_MASK,        \
+       .enable_reg     = S2MPU02_REG_L3CTRL + num - 3, \
+       .enable_mask    = S2MPU02_ENABLE_MASK           \
+}
+#define regulator_desc_s2mpu02_ldo4(num) {             \
+       .name           = "LDO"#num,                    \
+       .id             = S2MPU02_LDO##num,             \
+       .ops            = &s2mpu02_ldo_ops,             \
+       .type           = REGULATOR_VOLTAGE,            \
+       .owner          = THIS_MODULE,                  \
+       .min_uV         = S2MPU02_LDO_MIN_1050MV,       \
+       .uV_step        = S2MPU02_LDO_STEP_25MV,        \
+       .linear_min_sel = S2MPU02_LDO_GROUP2_START_SEL, \
+       .n_voltages     = S2MPU02_LDO_N_VOLTAGES,       \
+       .vsel_reg       = S2MPU02_REG_L3CTRL + num - 3, \
+       .vsel_mask      = S2MPU02_LDO_VSEL_MASK,        \
+       .enable_reg     = S2MPU02_REG_L3CTRL + num - 3, \
+       .enable_mask    = S2MPU02_ENABLE_MASK           \
+}
+#define regulator_desc_s2mpu02_ldo5(num) {             \
+       .name           = "LDO"#num,                    \
+       .id             = S2MPU02_LDO##num,             \
+       .ops            = &s2mpu02_ldo_ops,             \
+       .type           = REGULATOR_VOLTAGE,            \
+       .owner          = THIS_MODULE,                  \
+       .min_uV         = S2MPU02_LDO_MIN_1600MV,       \
+       .uV_step        = S2MPU02_LDO_STEP_50MV,        \
+       .linear_min_sel = S2MPU02_LDO_GROUP3_START_SEL, \
+       .n_voltages     = S2MPU02_LDO_N_VOLTAGES,       \
+       .vsel_reg       = S2MPU02_REG_L3CTRL + num - 3, \
+       .vsel_mask      = S2MPU02_LDO_VSEL_MASK,        \
+       .enable_reg     = S2MPU02_REG_L3CTRL + num - 3, \
+       .enable_mask    = S2MPU02_ENABLE_MASK           \
+}
+
+#define regulator_desc_s2mpu02_buck1234(num) {                 \
+       .name           = "BUCK"#num,                           \
+       .id             = S2MPU02_BUCK##num,                    \
+       .ops            = &s2mpu02_buck_ops,                    \
+       .type           = REGULATOR_VOLTAGE,                    \
+       .owner          = THIS_MODULE,                          \
+       .min_uV         = S2MPU02_BUCK1234_MIN_600MV,           \
+       .uV_step        = S2MPU02_BUCK1234_STEP_6_25MV,         \
+       .n_voltages     = S2MPU02_BUCK_N_VOLTAGES,              \
+       .linear_min_sel = S2MPU02_BUCK1234_START_SEL,           \
+       .ramp_delay     = S2MPU02_BUCK_RAMP_DELAY,              \
+       .vsel_reg       = S2MPU02_REG_B1CTRL2 + (num - 1) * 2,  \
+       .vsel_mask      = S2MPU02_BUCK_VSEL_MASK,               \
+       .enable_reg     = S2MPU02_REG_B1CTRL1 + (num - 1) * 2,  \
+       .enable_mask    = S2MPU02_ENABLE_MASK                   \
+}
+#define regulator_desc_s2mpu02_buck5(num) {                    \
+       .name           = "BUCK"#num,                           \
+       .id             = S2MPU02_BUCK##num,                    \
+       .ops            = &s2mpu02_ldo_ops,                     \
+       .type           = REGULATOR_VOLTAGE,                    \
+       .owner          = THIS_MODULE,                          \
+       .min_uV         = S2MPU02_BUCK5_MIN_1081_25MV,          \
+       .uV_step        = S2MPU02_BUCK5_STEP_6_25MV,            \
+       .n_voltages     = S2MPU02_BUCK_N_VOLTAGES,              \
+       .linear_min_sel = S2MPU02_BUCK5_START_SEL,              \
+       .ramp_delay     = S2MPU02_BUCK_RAMP_DELAY,              \
+       .vsel_reg       = S2MPU02_REG_B5CTRL2,                  \
+       .vsel_mask      = S2MPU02_BUCK_VSEL_MASK,               \
+       .enable_reg     = S2MPU02_REG_B5CTRL1,                  \
+       .enable_mask    = S2MPU02_ENABLE_MASK                   \
+}
+#define regulator_desc_s2mpu02_buck6(num) {                    \
+       .name           = "BUCK"#num,                           \
+       .id             = S2MPU02_BUCK##num,                    \
+       .ops            = &s2mpu02_ldo_ops,                     \
+       .type           = REGULATOR_VOLTAGE,                    \
+       .owner          = THIS_MODULE,                          \
+       .min_uV         = S2MPU02_BUCK6_MIN_1700MV,             \
+       .uV_step        = S2MPU02_BUCK6_STEP_2_50MV,            \
+       .n_voltages     = S2MPU02_BUCK_N_VOLTAGES,              \
+       .linear_min_sel = S2MPU02_BUCK6_START_SEL,              \
+       .ramp_delay     = S2MPU02_BUCK_RAMP_DELAY,              \
+       .vsel_reg       = S2MPU02_REG_B6CTRL2,                  \
+       .vsel_mask      = S2MPU02_BUCK_VSEL_MASK,               \
+       .enable_reg     = S2MPU02_REG_B6CTRL1,                  \
+       .enable_mask    = S2MPU02_ENABLE_MASK                   \
+}
+#define regulator_desc_s2mpu02_buck7(num) {                    \
+       .name           = "BUCK"#num,                           \
+       .id             = S2MPU02_BUCK##num,                    \
+       .ops            = &s2mpu02_ldo_ops,                     \
+       .type           = REGULATOR_VOLTAGE,                    \
+       .owner          = THIS_MODULE,                          \
+       .min_uV         = S2MPU02_BUCK7_MIN_900MV,              \
+       .uV_step        = S2MPU02_BUCK7_STEP_6_25MV,            \
+       .n_voltages     = S2MPU02_BUCK_N_VOLTAGES,              \
+       .linear_min_sel = S2MPU02_BUCK7_START_SEL,              \
+       .ramp_delay     = S2MPU02_BUCK_RAMP_DELAY,              \
+       .vsel_reg       = S2MPU02_REG_B7CTRL2,                  \
+       .vsel_mask      = S2MPU02_BUCK_VSEL_MASK,               \
+       .enable_reg     = S2MPU02_REG_B7CTRL1,                  \
+       .enable_mask    = S2MPU02_ENABLE_MASK                   \
+}
+
+static const struct regulator_desc s2mpu02_regulators[] = {
+       regulator_desc_s2mpu02_ldo1(1),
+       regulator_desc_s2mpu02_ldo2(2),
+       regulator_desc_s2mpu02_ldo4(3),
+       regulator_desc_s2mpu02_ldo5(4),
+       regulator_desc_s2mpu02_ldo4(5),
+       regulator_desc_s2mpu02_ldo3(6),
+       regulator_desc_s2mpu02_ldo3(7),
+       regulator_desc_s2mpu02_ldo4(8),
+       regulator_desc_s2mpu02_ldo5(9),
+       regulator_desc_s2mpu02_ldo3(10),
+       regulator_desc_s2mpu02_ldo4(11),
+       regulator_desc_s2mpu02_ldo5(12),
+       regulator_desc_s2mpu02_ldo5(13),
+       regulator_desc_s2mpu02_ldo5(14),
+       regulator_desc_s2mpu02_ldo5(15),
+       regulator_desc_s2mpu02_ldo5(16),
+       regulator_desc_s2mpu02_ldo4(17),
+       regulator_desc_s2mpu02_ldo5(18),
+       regulator_desc_s2mpu02_ldo3(19),
+       regulator_desc_s2mpu02_ldo4(20),
+       regulator_desc_s2mpu02_ldo5(21),
+       regulator_desc_s2mpu02_ldo5(22),
+       regulator_desc_s2mpu02_ldo5(23),
+       regulator_desc_s2mpu02_ldo4(24),
+       regulator_desc_s2mpu02_ldo5(25),
+       regulator_desc_s2mpu02_ldo4(26),
+       regulator_desc_s2mpu02_ldo5(27),
+       regulator_desc_s2mpu02_ldo5(28),
+       regulator_desc_s2mpu02_buck1234(1),
+       regulator_desc_s2mpu02_buck1234(2),
+       regulator_desc_s2mpu02_buck1234(3),
+       regulator_desc_s2mpu02_buck1234(4),
+       regulator_desc_s2mpu02_buck5(5),
+       regulator_desc_s2mpu02_buck6(6),
+       regulator_desc_s2mpu02_buck7(7),
+};
+
 static int s2mps11_pmic_probe(struct platform_device *pdev)
 {
        struct sec_pmic_dev *iodev = dev_get_drvdata(pdev->dev.parent);
@@ -634,15 +908,14 @@ static int s2mps11_pmic_probe(struct platform_device *pdev)
        struct s2mps11_info *s2mps11;
        int i, ret = 0;
        const struct regulator_desc *regulators;
-       enum sec_device_type dev_type;
 
        s2mps11 = devm_kzalloc(&pdev->dev, sizeof(struct s2mps11_info),
                                GFP_KERNEL);
        if (!s2mps11)
                return -ENOMEM;
 
-       dev_type = platform_get_device_id(pdev)->driver_data;
-       switch (dev_type) {
+       s2mps11->dev_type = platform_get_device_id(pdev)->driver_data;
+       switch (s2mps11->dev_type) {
        case S2MPS11X:
                s2mps11->rdev_num = ARRAY_SIZE(s2mps11_regulators);
                regulators = s2mps11_regulators;
@@ -651,8 +924,13 @@ static int s2mps11_pmic_probe(struct platform_device *pdev)
                s2mps11->rdev_num = ARRAY_SIZE(s2mps14_regulators);
                regulators = s2mps14_regulators;
                break;
+       case S2MPU02:
+               s2mps11->rdev_num = ARRAY_SIZE(s2mpu02_regulators);
+               regulators = s2mpu02_regulators;
+               break;
        default:
-               dev_err(&pdev->dev, "Invalid device type: %u\n", dev_type);
+               dev_err(&pdev->dev, "Invalid device type: %u\n",
+                                   s2mps11->dev_type);
                return -EINVAL;
        };
 
@@ -686,7 +964,7 @@ static int s2mps11_pmic_probe(struct platform_device *pdev)
        for (i = 0; i < s2mps11->rdev_num; i++)
                rdata[i].name = regulators[i].name;
 
-       ret = s2mps11_pmic_dt_parse(pdev, rdata, s2mps11, dev_type);
+       ret = s2mps11_pmic_dt_parse(pdev, rdata, s2mps11);
        if (ret)
                goto out;
 
@@ -739,6 +1017,7 @@ out:
 static const struct platform_device_id s2mps11_pmic_id[] = {
        { "s2mps11-pmic", S2MPS11X},
        { "s2mps14-pmic", S2MPS14X},
+       { "s2mpu02-pmic", S2MPU02},
        { },
 };
 MODULE_DEVICE_TABLE(platform, s2mps11_pmic_id);
index 595393098b09cf7b3924c7a38a5c91c0ec2a9b4e..731ed1a97f593bd20966cbf45a646a4d5f2aca51 100644 (file)
@@ -29,6 +29,8 @@
 #define YEARS_FROM_DA9063(year)                ((year) + 100)
 #define MONTHS_FROM_DA9063(month)      ((month) - 1)
 
+#define RTC_ALARM_DATA_LEN (DA9063_AD_REG_ALARM_Y - DA9063_AD_REG_ALARM_MI + 1)
+
 #define RTC_DATA_LEN   (DA9063_REG_COUNT_Y - DA9063_REG_COUNT_S + 1)
 #define RTC_SEC                0
 #define RTC_MIN                1
@@ -42,6 +44,10 @@ struct da9063_rtc {
        struct da9063           *hw;
        struct rtc_time         alarm_time;
        bool                    rtc_sync;
+       int                     alarm_year;
+       int                     alarm_start;
+       int                     alarm_len;
+       int                     data_start;
 };
 
 static void da9063_data_to_tm(u8 *data, struct rtc_time *tm)
@@ -83,7 +89,7 @@ static int da9063_rtc_stop_alarm(struct device *dev)
 {
        struct da9063_rtc *rtc = dev_get_drvdata(dev);
 
-       return regmap_update_bits(rtc->hw->regmap, DA9063_REG_ALARM_Y,
+       return regmap_update_bits(rtc->hw->regmap, rtc->alarm_year,
                                  DA9063_ALARM_ON, 0);
 }
 
@@ -91,7 +97,7 @@ static int da9063_rtc_start_alarm(struct device *dev)
 {
        struct da9063_rtc *rtc = dev_get_drvdata(dev);
 
-       return regmap_update_bits(rtc->hw->regmap, DA9063_REG_ALARM_Y,
+       return regmap_update_bits(rtc->hw->regmap, rtc->alarm_year,
                                  DA9063_ALARM_ON, DA9063_ALARM_ON);
 }
 
@@ -151,8 +157,9 @@ static int da9063_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
        int ret;
        unsigned int val;
 
-       ret = regmap_bulk_read(rtc->hw->regmap, DA9063_REG_ALARM_S,
-                              &data[RTC_SEC], RTC_DATA_LEN);
+       data[RTC_SEC] = 0;
+       ret = regmap_bulk_read(rtc->hw->regmap, rtc->alarm_start,
+                              &data[rtc->data_start], rtc->alarm_len);
        if (ret < 0)
                return ret;
 
@@ -186,14 +193,14 @@ static int da9063_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
                return ret;
        }
 
-       ret = regmap_bulk_write(rtc->hw->regmap, DA9063_REG_ALARM_S,
-                               data, RTC_DATA_LEN);
+       ret = regmap_bulk_write(rtc->hw->regmap, rtc->alarm_start,
+                              &data[rtc->data_start], rtc->alarm_len);
        if (ret < 0) {
                dev_err(dev, "Failed to write alarm: %d\n", ret);
                return ret;
        }
 
-       rtc->alarm_time = alrm->time;
+       da9063_data_to_tm(data, &rtc->alarm_time);
 
        if (alrm->enabled) {
                ret = da9063_rtc_start_alarm(dev);
@@ -218,7 +225,7 @@ static irqreturn_t da9063_alarm_event(int irq, void *data)
 {
        struct da9063_rtc *rtc = data;
 
-       regmap_update_bits(rtc->hw->regmap, DA9063_REG_ALARM_Y,
+       regmap_update_bits(rtc->hw->regmap, rtc->alarm_year,
                           DA9063_ALARM_ON, 0);
 
        rtc->rtc_sync = true;
@@ -257,7 +264,23 @@ static int da9063_rtc_probe(struct platform_device *pdev)
                goto err;
        }
 
-       ret = regmap_update_bits(da9063->regmap, DA9063_REG_ALARM_S,
+       rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL);
+       if (!rtc)
+               return -ENOMEM;
+
+       if (da9063->variant_code == PMIC_DA9063_AD) {
+               rtc->alarm_year = DA9063_AD_REG_ALARM_Y;
+               rtc->alarm_start = DA9063_AD_REG_ALARM_MI;
+               rtc->alarm_len = RTC_ALARM_DATA_LEN;
+               rtc->data_start = RTC_MIN;
+       } else {
+               rtc->alarm_year = DA9063_BB_REG_ALARM_Y;
+               rtc->alarm_start = DA9063_BB_REG_ALARM_S;
+               rtc->alarm_len = RTC_DATA_LEN;
+               rtc->data_start = RTC_SEC;
+       }
+
+       ret = regmap_update_bits(da9063->regmap, rtc->alarm_start,
                        DA9063_ALARM_STATUS_TICK | DA9063_ALARM_STATUS_ALARM,
                        0);
        if (ret < 0) {
@@ -265,7 +288,7 @@ static int da9063_rtc_probe(struct platform_device *pdev)
                goto err;
        }
 
-       ret = regmap_update_bits(da9063->regmap, DA9063_REG_ALARM_S,
+       ret = regmap_update_bits(da9063->regmap, rtc->alarm_start,
                                 DA9063_ALARM_STATUS_ALARM,
                                 DA9063_ALARM_STATUS_ALARM);
        if (ret < 0) {
@@ -273,25 +296,22 @@ static int da9063_rtc_probe(struct platform_device *pdev)
                goto err;
        }
 
-       ret = regmap_update_bits(da9063->regmap, DA9063_REG_ALARM_Y,
+       ret = regmap_update_bits(da9063->regmap, rtc->alarm_year,
                                 DA9063_TICK_ON, 0);
        if (ret < 0) {
                dev_err(&pdev->dev, "Failed to disable TICKs\n");
                goto err;
        }
 
-       ret = regmap_bulk_read(da9063->regmap, DA9063_REG_ALARM_S,
-                              data, RTC_DATA_LEN);
+       data[RTC_SEC] = 0;
+       ret = regmap_bulk_read(da9063->regmap, rtc->alarm_start,
+                              &data[rtc->data_start], rtc->alarm_len);
        if (ret < 0) {
                dev_err(&pdev->dev, "Failed to read initial alarm data: %d\n",
                        ret);
                goto err;
        }
 
-       rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL);
-       if (!rtc)
-               return -ENOMEM;
-
        platform_set_drvdata(pdev, rtc);
 
        irq_alarm = platform_get_irq_byname(pdev, "ALARM");
index 9efe118a28bae7bf42a7c6564640fe8967ecf411..d20a7f0786ebd9540625caa57c7609412569354f 100644 (file)
@@ -492,16 +492,11 @@ static int max77686_rtc_init_reg(struct max77686_rtc_info *info)
        return ret;
 }
 
-static struct regmap_config max77686_rtc_regmap_config = {
-       .reg_bits = 8,
-       .val_bits = 8,
-};
-
 static int max77686_rtc_probe(struct platform_device *pdev)
 {
        struct max77686_dev *max77686 = dev_get_drvdata(pdev->dev.parent);
        struct max77686_rtc_info *info;
-       int ret, virq;
+       int ret;
 
        dev_info(&pdev->dev, "%s\n", __func__);
 
@@ -514,14 +509,7 @@ static int max77686_rtc_probe(struct platform_device *pdev)
        info->dev = &pdev->dev;
        info->max77686 = max77686;
        info->rtc = max77686->rtc;
-       info->max77686->rtc_regmap = devm_regmap_init_i2c(info->max77686->rtc,
-                                        &max77686_rtc_regmap_config);
-       if (IS_ERR(info->max77686->rtc_regmap)) {
-               ret = PTR_ERR(info->max77686->rtc_regmap);
-               dev_err(info->max77686->dev, "Failed to allocate register map: %d\n",
-                               ret);
-               return ret;
-       }
+
        platform_set_drvdata(pdev, info);
 
        ret = max77686_rtc_init_reg(info);
@@ -550,15 +538,16 @@ static int max77686_rtc_probe(struct platform_device *pdev)
                        ret = -EINVAL;
                goto err_rtc;
        }
-       virq = irq_create_mapping(max77686->irq_domain, MAX77686_RTCIRQ_RTCA1);
-       if (!virq) {
+
+       info->virq = regmap_irq_get_virq(max77686->rtc_irq_data,
+                                        MAX77686_RTCIRQ_RTCA1);
+       if (!info->virq) {
                ret = -ENXIO;
                goto err_rtc;
        }
-       info->virq = virq;
 
-       ret = devm_request_threaded_irq(&pdev->dev, virq, NULL,
-                               max77686_rtc_alarm_irq, 0, "rtc-alarm0", info);
+       ret = devm_request_threaded_irq(&pdev->dev, info->virq, NULL,
+                               max77686_rtc_alarm_irq, 0, "rtc-alarm1", info);
        if (ret < 0)
                dev_err(&pdev->dev, "Failed to request alarm IRQ: %d: %d\n",
                        info->virq, ret);
index 0f7c44793b29453b6b36881e74d6bc72fe8f09b7..3b1b95d932d194e0533944ed4f0d021d405c24a3 100644 (file)
@@ -3,3 +3,4 @@
 #
 
 obj-$(CONFIG_ARCH_QCOM)                += qcom/
+obj-$(CONFIG_ARCH_TEGRA)       += tegra/
diff --git a/drivers/soc/tegra/Makefile b/drivers/soc/tegra/Makefile
new file mode 100644 (file)
index 0000000..cdaad9d
--- /dev/null
@@ -0,0 +1,4 @@
+obj-$(CONFIG_ARCH_TEGRA) += fuse/
+
+obj-$(CONFIG_ARCH_TEGRA) += common.o
+obj-$(CONFIG_ARCH_TEGRA) += pmc.o
diff --git a/drivers/soc/tegra/common.c b/drivers/soc/tegra/common.c
new file mode 100644 (file)
index 0000000..a71cb74
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2014 NVIDIA CORPORATION.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/of.h>
+
+#include <soc/tegra/common.h>
+
+static const struct of_device_id tegra_machine_match[] = {
+       { .compatible = "nvidia,tegra20", },
+       { .compatible = "nvidia,tegra30", },
+       { .compatible = "nvidia,tegra114", },
+       { .compatible = "nvidia,tegra124", },
+       { }
+};
+
+bool soc_is_tegra(void)
+{
+       struct device_node *root;
+
+       root = of_find_node_by_path("/");
+       if (!root)
+               return false;
+
+       return of_match_node(tegra_machine_match, root) != NULL;
+}
diff --git a/drivers/soc/tegra/fuse/Makefile b/drivers/soc/tegra/fuse/Makefile
new file mode 100644 (file)
index 0000000..3af357d
--- /dev/null
@@ -0,0 +1,8 @@
+obj-y                                  += fuse-tegra.o
+obj-y                                  += fuse-tegra30.o
+obj-y                                  += tegra-apbmisc.o
+obj-$(CONFIG_ARCH_TEGRA_2x_SOC)                += fuse-tegra20.o
+obj-$(CONFIG_ARCH_TEGRA_2x_SOC)                += speedo-tegra20.o
+obj-$(CONFIG_ARCH_TEGRA_3x_SOC)                += speedo-tegra30.o
+obj-$(CONFIG_ARCH_TEGRA_114_SOC)       += speedo-tegra114.o
+obj-$(CONFIG_ARCH_TEGRA_124_SOC)       += speedo-tegra124.o
diff --git a/drivers/soc/tegra/fuse/fuse-tegra.c b/drivers/soc/tegra/fuse/fuse-tegra.c
new file mode 100644 (file)
index 0000000..11a5043
--- /dev/null
@@ -0,0 +1,163 @@
+/*
+ * Copyright (c) 2013-2014, NVIDIA CORPORATION.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <linux/device.h>
+#include <linux/kobject.h>
+#include <linux/kernel.h>
+#include <linux/platform_device.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/io.h>
+
+#include <soc/tegra/common.h>
+#include <soc/tegra/fuse.h>
+
+#include "fuse.h"
+
+static u32 (*fuse_readl)(const unsigned int offset);
+static int fuse_size;
+struct tegra_sku_info tegra_sku_info;
+
+static const char *tegra_revision_name[TEGRA_REVISION_MAX] = {
+       [TEGRA_REVISION_UNKNOWN] = "unknown",
+       [TEGRA_REVISION_A01]     = "A01",
+       [TEGRA_REVISION_A02]     = "A02",
+       [TEGRA_REVISION_A03]     = "A03",
+       [TEGRA_REVISION_A03p]    = "A03 prime",
+       [TEGRA_REVISION_A04]     = "A04",
+};
+
+static u8 fuse_readb(const unsigned int offset)
+{
+       u32 val;
+
+       val = fuse_readl(round_down(offset, 4));
+       val >>= (offset % 4) * 8;
+       val &= 0xff;
+
+       return val;
+}
+
+static ssize_t fuse_read(struct file *fd, struct kobject *kobj,
+                       struct bin_attribute *attr, char *buf,
+                       loff_t pos, size_t size)
+{
+       int i;
+
+       if (pos < 0 || pos >= fuse_size)
+               return 0;
+
+       if (size > fuse_size - pos)
+               size = fuse_size - pos;
+
+       for (i = 0; i < size; i++)
+               buf[i] = fuse_readb(pos + i);
+
+       return i;
+}
+
+static struct bin_attribute fuse_bin_attr = {
+       .attr = { .name = "fuse", .mode = S_IRUGO, },
+       .read = fuse_read,
+};
+
+static const struct of_device_id car_match[] __initconst = {
+       { .compatible = "nvidia,tegra20-car", },
+       { .compatible = "nvidia,tegra30-car", },
+       { .compatible = "nvidia,tegra114-car", },
+       { .compatible = "nvidia,tegra124-car", },
+       {},
+};
+
+static void tegra_enable_fuse_clk(void __iomem *base)
+{
+       u32 reg;
+
+       reg = readl_relaxed(base + 0x48);
+       reg |= 1 << 28;
+       writel(reg, base + 0x48);
+
+       /*
+        * Enable FUSE clock. This needs to be hardcoded because the clock
+        * subsystem is not active during early boot.
+        */
+       reg = readl(base + 0x14);
+       reg |= 1 << 7;
+       writel(reg, base + 0x14);
+}
+
+int tegra_fuse_readl(unsigned long offset, u32 *value)
+{
+       if (!fuse_readl)
+               return -EPROBE_DEFER;
+
+       *value = fuse_readl(offset);
+
+       return 0;
+}
+EXPORT_SYMBOL(tegra_fuse_readl);
+
+int tegra_fuse_create_sysfs(struct device *dev, int size,
+                    u32 (*readl)(const unsigned int offset))
+{
+       if (fuse_size)
+               return -ENODEV;
+
+       fuse_bin_attr.size = size;
+       fuse_bin_attr.read = fuse_read;
+
+       fuse_size = size;
+       fuse_readl = readl;
+
+       return device_create_bin_file(dev, &fuse_bin_attr);
+}
+
+static int __init tegra_init_fuse(void)
+{
+       struct device_node *np;
+       void __iomem *car_base;
+
+       if (!soc_is_tegra())
+               return 0;
+
+       tegra_init_apbmisc();
+
+       np = of_find_matching_node(NULL, car_match);
+       car_base = of_iomap(np, 0);
+       if (car_base) {
+               tegra_enable_fuse_clk(car_base);
+               iounmap(car_base);
+       } else {
+               pr_err("Could not enable fuse clk. ioremap tegra car failed.\n");
+               return -ENXIO;
+       }
+
+       if (tegra_get_chip_id() == TEGRA20)
+               tegra20_init_fuse_early();
+       else
+               tegra30_init_fuse_early();
+
+       pr_info("Tegra Revision: %s SKU: %d CPU Process: %d Core Process: %d\n",
+               tegra_revision_name[tegra_sku_info.revision],
+               tegra_sku_info.sku_id, tegra_sku_info.cpu_process_id,
+               tegra_sku_info.core_process_id);
+       pr_debug("Tegra CPU Speedo ID %d, Soc Speedo ID %d\n",
+               tegra_sku_info.cpu_speedo_id, tegra_sku_info.soc_speedo_id);
+
+       return 0;
+}
+early_initcall(tegra_init_fuse);
diff --git a/drivers/soc/tegra/fuse/fuse-tegra20.c b/drivers/soc/tegra/fuse/fuse-tegra20.c
new file mode 100644 (file)
index 0000000..7cb63ab
--- /dev/null
@@ -0,0 +1,215 @@
+/*
+ * Copyright (c) 2013-2014, NVIDIA CORPORATION.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Based on drivers/misc/eeprom/sunxi_sid.c
+ */
+
+#include <linux/device.h>
+#include <linux/clk.h>
+#include <linux/completion.h>
+#include <linux/dmaengine.h>
+#include <linux/dma-mapping.h>
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/kernel.h>
+#include <linux/kobject.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+#include <linux/random.h>
+
+#include <soc/tegra/fuse.h>
+
+#include "fuse.h"
+
+#define FUSE_BEGIN     0x100
+#define FUSE_SIZE      0x1f8
+#define FUSE_UID_LOW   0x08
+#define FUSE_UID_HIGH  0x0c
+
+static phys_addr_t fuse_phys;
+static struct clk *fuse_clk;
+static void __iomem __initdata *fuse_base;
+
+static DEFINE_MUTEX(apb_dma_lock);
+static DECLARE_COMPLETION(apb_dma_wait);
+static struct dma_chan *apb_dma_chan;
+static struct dma_slave_config dma_sconfig;
+static u32 *apb_buffer;
+static dma_addr_t apb_buffer_phys;
+
+static void apb_dma_complete(void *args)
+{
+       complete(&apb_dma_wait);
+}
+
+static u32 tegra20_fuse_readl(const unsigned int offset)
+{
+       int ret;
+       u32 val = 0;
+       struct dma_async_tx_descriptor *dma_desc;
+
+       mutex_lock(&apb_dma_lock);
+
+       dma_sconfig.src_addr = fuse_phys + FUSE_BEGIN + offset;
+       ret = dmaengine_slave_config(apb_dma_chan, &dma_sconfig);
+       if (ret)
+               goto out;
+
+       dma_desc = dmaengine_prep_slave_single(apb_dma_chan, apb_buffer_phys,
+                       sizeof(u32), DMA_DEV_TO_MEM,
+                       DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
+       if (!dma_desc)
+               goto out;
+
+       dma_desc->callback = apb_dma_complete;
+       dma_desc->callback_param = NULL;
+
+       reinit_completion(&apb_dma_wait);
+
+       clk_prepare_enable(fuse_clk);
+
+       dmaengine_submit(dma_desc);
+       dma_async_issue_pending(apb_dma_chan);
+       ret = wait_for_completion_timeout(&apb_dma_wait, msecs_to_jiffies(50));
+
+       if (WARN(ret == 0, "apb read dma timed out"))
+               dmaengine_terminate_all(apb_dma_chan);
+       else
+               val = *apb_buffer;
+
+       clk_disable_unprepare(fuse_clk);
+out:
+       mutex_unlock(&apb_dma_lock);
+
+       return val;
+}
+
+static const struct of_device_id tegra20_fuse_of_match[] = {
+       { .compatible = "nvidia,tegra20-efuse" },
+       {},
+};
+
+static int apb_dma_init(void)
+{
+       dma_cap_mask_t mask;
+
+       dma_cap_zero(mask);
+       dma_cap_set(DMA_SLAVE, mask);
+       apb_dma_chan = dma_request_channel(mask, NULL, NULL);
+       if (!apb_dma_chan)
+               return -EPROBE_DEFER;
+
+       apb_buffer = dma_alloc_coherent(NULL, sizeof(u32), &apb_buffer_phys,
+                                       GFP_KERNEL);
+       if (!apb_buffer) {
+               dma_release_channel(apb_dma_chan);
+               return -ENOMEM;
+       }
+
+       dma_sconfig.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
+       dma_sconfig.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
+       dma_sconfig.src_maxburst = 1;
+       dma_sconfig.dst_maxburst = 1;
+
+       return 0;
+}
+
+static int tegra20_fuse_probe(struct platform_device *pdev)
+{
+       struct resource *res;
+       int err;
+
+       fuse_clk = devm_clk_get(&pdev->dev, NULL);
+       if (IS_ERR(fuse_clk)) {
+               dev_err(&pdev->dev, "missing clock");
+               return PTR_ERR(fuse_clk);
+       }
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!res)
+               return -EINVAL;
+       fuse_phys = res->start;
+
+       err = apb_dma_init();
+       if (err)
+               return err;
+
+       if (tegra_fuse_create_sysfs(&pdev->dev, FUSE_SIZE, tegra20_fuse_readl))
+               return -ENODEV;
+
+       dev_dbg(&pdev->dev, "loaded\n");
+
+       return 0;
+}
+
+static struct platform_driver tegra20_fuse_driver = {
+       .probe = tegra20_fuse_probe,
+       .driver = {
+               .name = "tegra20_fuse",
+               .owner = THIS_MODULE,
+               .of_match_table = tegra20_fuse_of_match,
+       }
+};
+
+static int __init tegra20_fuse_init(void)
+{
+       return platform_driver_register(&tegra20_fuse_driver);
+}
+postcore_initcall(tegra20_fuse_init);
+
+/* Early boot code. This code is called before the devices are created */
+
+u32 __init tegra20_fuse_early(const unsigned int offset)
+{
+       return readl_relaxed(fuse_base + FUSE_BEGIN + offset);
+}
+
+bool __init tegra20_spare_fuse_early(int spare_bit)
+{
+       u32 offset = spare_bit * 4;
+       bool value;
+
+       value = tegra20_fuse_early(offset + 0x100);
+
+       return value;
+}
+
+static void __init tegra20_fuse_add_randomness(void)
+{
+       u32 randomness[7];
+
+       randomness[0] = tegra_sku_info.sku_id;
+       randomness[1] = tegra_read_straps();
+       randomness[2] = tegra_read_chipid();
+       randomness[3] = tegra_sku_info.cpu_process_id << 16;
+       randomness[3] |= tegra_sku_info.core_process_id;
+       randomness[4] = tegra_sku_info.cpu_speedo_id << 16;
+       randomness[4] |= tegra_sku_info.soc_speedo_id;
+       randomness[5] = tegra20_fuse_early(FUSE_UID_LOW);
+       randomness[6] = tegra20_fuse_early(FUSE_UID_HIGH);
+
+       add_device_randomness(randomness, sizeof(randomness));
+}
+
+void __init tegra20_init_fuse_early(void)
+{
+       fuse_base = ioremap(TEGRA_FUSE_BASE, TEGRA_FUSE_SIZE);
+
+       tegra_init_revision();
+       tegra20_init_speedo_data(&tegra_sku_info);
+       tegra20_fuse_add_randomness();
+
+       iounmap(fuse_base);
+}
diff --git a/drivers/soc/tegra/fuse/fuse-tegra30.c b/drivers/soc/tegra/fuse/fuse-tegra30.c
new file mode 100644 (file)
index 0000000..5999cf3
--- /dev/null
@@ -0,0 +1,224 @@
+/*
+ * Copyright (c) 2013-2014, NVIDIA CORPORATION.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <linux/device.h>
+#include <linux/clk.h>
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/kernel.h>
+#include <linux/of_device.h>
+#include <linux/of_address.h>
+#include <linux/platform_device.h>
+#include <linux/random.h>
+
+#include <soc/tegra/fuse.h>
+
+#include "fuse.h"
+
+#define FUSE_BEGIN     0x100
+
+/* Tegra30 and later */
+#define FUSE_VENDOR_CODE       0x100
+#define FUSE_FAB_CODE          0x104
+#define FUSE_LOT_CODE_0                0x108
+#define FUSE_LOT_CODE_1                0x10c
+#define FUSE_WAFER_ID          0x110
+#define FUSE_X_COORDINATE      0x114
+#define FUSE_Y_COORDINATE      0x118
+
+#define FUSE_HAS_REVISION_INFO BIT(0)
+
+enum speedo_idx {
+       SPEEDO_TEGRA30 = 0,
+       SPEEDO_TEGRA114,
+       SPEEDO_TEGRA124,
+};
+
+struct tegra_fuse_info {
+       int             size;
+       int             spare_bit;
+       enum speedo_idx speedo_idx;
+};
+
+static void __iomem *fuse_base;
+static struct clk *fuse_clk;
+static struct tegra_fuse_info *fuse_info;
+
+u32 tegra30_fuse_readl(const unsigned int offset)
+{
+       u32 val;
+
+       /*
+        * early in the boot, the fuse clock will be enabled by
+        * tegra_init_fuse()
+        */
+
+       if (fuse_clk)
+               clk_prepare_enable(fuse_clk);
+
+       val = readl_relaxed(fuse_base + FUSE_BEGIN + offset);
+
+       if (fuse_clk)
+               clk_disable_unprepare(fuse_clk);
+
+       return val;
+}
+
+static struct tegra_fuse_info tegra30_info = {
+       .size                   = 0x2a4,
+       .spare_bit              = 0x144,
+       .speedo_idx             = SPEEDO_TEGRA30,
+};
+
+static struct tegra_fuse_info tegra114_info = {
+       .size                   = 0x2a0,
+       .speedo_idx             = SPEEDO_TEGRA114,
+};
+
+static struct tegra_fuse_info tegra124_info = {
+       .size                   = 0x300,
+       .speedo_idx             = SPEEDO_TEGRA124,
+};
+
+static const struct of_device_id tegra30_fuse_of_match[] = {
+       { .compatible = "nvidia,tegra30-efuse", .data = &tegra30_info },
+       { .compatible = "nvidia,tegra114-efuse", .data = &tegra114_info },
+       { .compatible = "nvidia,tegra124-efuse", .data = &tegra124_info },
+       {},
+};
+
+static int tegra30_fuse_probe(struct platform_device *pdev)
+{
+       const struct of_device_id *of_dev_id;
+
+       of_dev_id = of_match_device(tegra30_fuse_of_match, &pdev->dev);
+       if (!of_dev_id)
+               return -ENODEV;
+
+       fuse_clk = devm_clk_get(&pdev->dev, NULL);
+       if (IS_ERR(fuse_clk)) {
+               dev_err(&pdev->dev, "missing clock");
+               return PTR_ERR(fuse_clk);
+       }
+
+       platform_set_drvdata(pdev, NULL);
+
+       if (tegra_fuse_create_sysfs(&pdev->dev, fuse_info->size,
+                                   tegra30_fuse_readl))
+               return -ENODEV;
+
+       dev_dbg(&pdev->dev, "loaded\n");
+
+       return 0;
+}
+
+static struct platform_driver tegra30_fuse_driver = {
+       .probe = tegra30_fuse_probe,
+       .driver = {
+               .name = "tegra_fuse",
+               .owner = THIS_MODULE,
+               .of_match_table = tegra30_fuse_of_match,
+       }
+};
+
+static int __init tegra30_fuse_init(void)
+{
+       return platform_driver_register(&tegra30_fuse_driver);
+}
+postcore_initcall(tegra30_fuse_init);
+
+/* Early boot code. This code is called before the devices are created */
+
+typedef void (*speedo_f)(struct tegra_sku_info *sku_info);
+
+static speedo_f __initdata speedo_tbl[] = {
+       [SPEEDO_TEGRA30]        = tegra30_init_speedo_data,
+       [SPEEDO_TEGRA114]       = tegra114_init_speedo_data,
+       [SPEEDO_TEGRA124]       = tegra124_init_speedo_data,
+};
+
+static void __init tegra30_fuse_add_randomness(void)
+{
+       u32 randomness[12];
+
+       randomness[0] = tegra_sku_info.sku_id;
+       randomness[1] = tegra_read_straps();
+       randomness[2] = tegra_read_chipid();
+       randomness[3] = tegra_sku_info.cpu_process_id << 16;
+       randomness[3] |= tegra_sku_info.core_process_id;
+       randomness[4] = tegra_sku_info.cpu_speedo_id << 16;
+       randomness[4] |= tegra_sku_info.soc_speedo_id;
+       randomness[5] = tegra30_fuse_readl(FUSE_VENDOR_CODE);
+       randomness[6] = tegra30_fuse_readl(FUSE_FAB_CODE);
+       randomness[7] = tegra30_fuse_readl(FUSE_LOT_CODE_0);
+       randomness[8] = tegra30_fuse_readl(FUSE_LOT_CODE_1);
+       randomness[9] = tegra30_fuse_readl(FUSE_WAFER_ID);
+       randomness[10] = tegra30_fuse_readl(FUSE_X_COORDINATE);
+       randomness[11] = tegra30_fuse_readl(FUSE_Y_COORDINATE);
+
+       add_device_randomness(randomness, sizeof(randomness));
+}
+
+static void __init legacy_fuse_init(void)
+{
+       switch (tegra_get_chip_id()) {
+       case TEGRA30:
+               fuse_info = &tegra30_info;
+               break;
+       case TEGRA114:
+               fuse_info = &tegra114_info;
+               break;
+       case TEGRA124:
+               fuse_info = &tegra124_info;
+               break;
+       default:
+               return;
+       }
+
+       fuse_base = ioremap(TEGRA_FUSE_BASE, TEGRA_FUSE_SIZE);
+}
+
+bool __init tegra30_spare_fuse(int spare_bit)
+{
+       u32 offset = fuse_info->spare_bit + spare_bit * 4;
+
+       return tegra30_fuse_readl(offset) & 1;
+}
+
+void __init tegra30_init_fuse_early(void)
+{
+       struct device_node *np;
+       const struct of_device_id *of_match;
+
+       np = of_find_matching_node_and_match(NULL, tegra30_fuse_of_match,
+                                               &of_match);
+       if (np) {
+               fuse_base = of_iomap(np, 0);
+               fuse_info = (struct tegra_fuse_info *)of_match->data;
+       } else
+               legacy_fuse_init();
+
+       if (!fuse_base) {
+               pr_warn("fuse DT node missing and unknown chip id: 0x%02x\n",
+                       tegra_get_chip_id());
+               return;
+       }
+
+       tegra_init_revision();
+       speedo_tbl[fuse_info->speedo_idx](&tegra_sku_info);
+       tegra30_fuse_add_randomness();
+}
diff --git a/drivers/soc/tegra/fuse/fuse.h b/drivers/soc/tegra/fuse/fuse.h
new file mode 100644 (file)
index 0000000..3a398bf
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2010 Google, Inc.
+ * Copyright (c) 2013, NVIDIA CORPORATION.  All rights reserved.
+ *
+ * Author:
+ *     Colin Cross <ccross@android.com>
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#ifndef __DRIVERS_MISC_TEGRA_FUSE_H
+#define __DRIVERS_MISC_TEGRA_FUSE_H
+
+#define TEGRA_FUSE_BASE        0x7000f800
+#define TEGRA_FUSE_SIZE        0x400
+
+int tegra_fuse_create_sysfs(struct device *dev, int size,
+                    u32 (*readl)(const unsigned int offset));
+
+bool tegra30_spare_fuse(int bit);
+u32 tegra30_fuse_readl(const unsigned int offset);
+void tegra30_init_fuse_early(void);
+void tegra_init_revision(void);
+void tegra_init_apbmisc(void);
+
+#ifdef CONFIG_ARCH_TEGRA_2x_SOC
+void tegra20_init_speedo_data(struct tegra_sku_info *sku_info);
+bool tegra20_spare_fuse_early(int spare_bit);
+void tegra20_init_fuse_early(void);
+u32 tegra20_fuse_early(const unsigned int offset);
+#else
+static inline void tegra20_init_speedo_data(struct tegra_sku_info *sku_info) {}
+static inline bool tegra20_spare_fuse_early(int spare_bit)
+{
+       return false;
+}
+static inline void tegra20_init_fuse_early(void) {}
+static inline u32 tegra20_fuse_early(const unsigned int offset)
+{
+       return 0;
+}
+#endif
+
+
+#ifdef CONFIG_ARCH_TEGRA_3x_SOC
+void tegra30_init_speedo_data(struct tegra_sku_info *sku_info);
+#else
+static inline void tegra30_init_speedo_data(struct tegra_sku_info *sku_info) {}
+#endif
+
+#ifdef CONFIG_ARCH_TEGRA_114_SOC
+void tegra114_init_speedo_data(struct tegra_sku_info *sku_info);
+#else
+static inline void tegra114_init_speedo_data(struct tegra_sku_info *sku_info) {}
+#endif
+
+#ifdef CONFIG_ARCH_TEGRA_124_SOC
+void tegra124_init_speedo_data(struct tegra_sku_info *sku_info);
+#else
+static inline void tegra124_init_speedo_data(struct tegra_sku_info *sku_info) {}
+#endif
+
+#endif
diff --git a/drivers/soc/tegra/fuse/speedo-tegra114.c b/drivers/soc/tegra/fuse/speedo-tegra114.c
new file mode 100644 (file)
index 0000000..2a6ca03
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+ * Copyright (c) 2013-2014, NVIDIA CORPORATION.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <linux/bug.h>
+#include <linux/device.h>
+#include <linux/kernel.h>
+
+#include <soc/tegra/fuse.h>
+
+#include "fuse.h"
+
+#define CORE_PROCESS_CORNERS   2
+#define CPU_PROCESS_CORNERS    2
+
+enum {
+       THRESHOLD_INDEX_0,
+       THRESHOLD_INDEX_1,
+       THRESHOLD_INDEX_COUNT,
+};
+
+static const u32 __initconst core_process_speedos[][CORE_PROCESS_CORNERS] = {
+       {1123,     UINT_MAX},
+       {0,        UINT_MAX},
+};
+
+static const u32 __initconst cpu_process_speedos[][CPU_PROCESS_CORNERS] = {
+       {1695,     UINT_MAX},
+       {0,        UINT_MAX},
+};
+
+static void __init rev_sku_to_speedo_ids(struct tegra_sku_info *sku_info,
+                                        int *threshold)
+{
+       u32 tmp;
+       u32 sku = sku_info->sku_id;
+       enum tegra_revision rev = sku_info->revision;
+
+       switch (sku) {
+       case 0x00:
+       case 0x10:
+       case 0x05:
+       case 0x06:
+               sku_info->cpu_speedo_id = 1;
+               sku_info->soc_speedo_id = 0;
+               *threshold = THRESHOLD_INDEX_0;
+               break;
+
+       case 0x03:
+       case 0x04:
+               sku_info->cpu_speedo_id = 2;
+               sku_info->soc_speedo_id = 1;
+               *threshold = THRESHOLD_INDEX_1;
+               break;
+
+       default:
+               pr_err("Tegra Unknown SKU %d\n", sku);
+               sku_info->cpu_speedo_id = 0;
+               sku_info->soc_speedo_id = 0;
+               *threshold = THRESHOLD_INDEX_0;
+               break;
+       }
+
+       if (rev == TEGRA_REVISION_A01) {
+               tmp = tegra30_fuse_readl(0x270) << 1;
+               tmp |= tegra30_fuse_readl(0x26c);
+               if (!tmp)
+                       sku_info->cpu_speedo_id = 0;
+       }
+}
+
+void __init tegra114_init_speedo_data(struct tegra_sku_info *sku_info)
+{
+       u32 cpu_speedo_val;
+       u32 core_speedo_val;
+       int threshold;
+       int i;
+
+       BUILD_BUG_ON(ARRAY_SIZE(cpu_process_speedos) !=
+                       THRESHOLD_INDEX_COUNT);
+       BUILD_BUG_ON(ARRAY_SIZE(core_process_speedos) !=
+                       THRESHOLD_INDEX_COUNT);
+
+       rev_sku_to_speedo_ids(sku_info, &threshold);
+
+       cpu_speedo_val = tegra30_fuse_readl(0x12c) + 1024;
+       core_speedo_val = tegra30_fuse_readl(0x134);
+
+       for (i = 0; i < CPU_PROCESS_CORNERS; i++)
+               if (cpu_speedo_val < cpu_process_speedos[threshold][i])
+                       break;
+       sku_info->cpu_process_id = i;
+
+       for (i = 0; i < CORE_PROCESS_CORNERS; i++)
+               if (core_speedo_val < core_process_speedos[threshold][i])
+                       break;
+       sku_info->core_process_id = i;
+}
diff --git a/drivers/soc/tegra/fuse/speedo-tegra124.c b/drivers/soc/tegra/fuse/speedo-tegra124.c
new file mode 100644 (file)
index 0000000..4636238
--- /dev/null
@@ -0,0 +1,168 @@
+/*
+ * Copyright (c) 2013-2014, NVIDIA CORPORATION.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <linux/device.h>
+#include <linux/kernel.h>
+#include <linux/bug.h>
+
+#include <soc/tegra/fuse.h>
+
+#include "fuse.h"
+
+#define CPU_PROCESS_CORNERS    2
+#define GPU_PROCESS_CORNERS    2
+#define CORE_PROCESS_CORNERS   2
+
+#define FUSE_CPU_SPEEDO_0      0x14
+#define FUSE_CPU_SPEEDO_1      0x2c
+#define FUSE_CPU_SPEEDO_2      0x30
+#define FUSE_SOC_SPEEDO_0      0x34
+#define FUSE_SOC_SPEEDO_1      0x38
+#define FUSE_SOC_SPEEDO_2      0x3c
+#define FUSE_CPU_IDDQ          0x18
+#define FUSE_SOC_IDDQ          0x40
+#define FUSE_GPU_IDDQ          0x128
+#define FUSE_FT_REV            0x28
+
+enum {
+       THRESHOLD_INDEX_0,
+       THRESHOLD_INDEX_1,
+       THRESHOLD_INDEX_COUNT,
+};
+
+static const u32 __initconst cpu_process_speedos[][CPU_PROCESS_CORNERS] = {
+       {2190,  UINT_MAX},
+       {0,     UINT_MAX},
+};
+
+static const u32 __initconst gpu_process_speedos[][GPU_PROCESS_CORNERS] = {
+       {1965,  UINT_MAX},
+       {0,     UINT_MAX},
+};
+
+static const u32 __initconst core_process_speedos[][CORE_PROCESS_CORNERS] = {
+       {2101,  UINT_MAX},
+       {0,     UINT_MAX},
+};
+
+static void __init rev_sku_to_speedo_ids(struct tegra_sku_info *sku_info,
+                                        int *threshold)
+{
+       int sku = sku_info->sku_id;
+
+       /* Assign to default */
+       sku_info->cpu_speedo_id = 0;
+       sku_info->soc_speedo_id = 0;
+       sku_info->gpu_speedo_id = 0;
+       *threshold = THRESHOLD_INDEX_0;
+
+       switch (sku) {
+       case 0x00: /* Eng sku */
+       case 0x0F:
+       case 0x23:
+               /* Using the default */
+               break;
+       case 0x83:
+               sku_info->cpu_speedo_id = 2;
+               break;
+
+       case 0x1F:
+       case 0x87:
+       case 0x27:
+               sku_info->cpu_speedo_id = 2;
+               sku_info->soc_speedo_id = 0;
+               sku_info->gpu_speedo_id = 1;
+               *threshold = THRESHOLD_INDEX_0;
+               break;
+       case 0x81:
+       case 0x21:
+       case 0x07:
+               sku_info->cpu_speedo_id = 1;
+               sku_info->soc_speedo_id = 1;
+               sku_info->gpu_speedo_id = 1;
+               *threshold = THRESHOLD_INDEX_1;
+               break;
+       case 0x49:
+       case 0x4A:
+       case 0x48:
+               sku_info->cpu_speedo_id = 4;
+               sku_info->soc_speedo_id = 2;
+               sku_info->gpu_speedo_id = 3;
+               *threshold = THRESHOLD_INDEX_1;
+               break;
+       default:
+               pr_err("Tegra Unknown SKU %d\n", sku);
+               /* Using the default for the error case */
+               break;
+       }
+}
+
+void __init tegra124_init_speedo_data(struct tegra_sku_info *sku_info)
+{
+       int i, threshold, cpu_speedo_0_value, soc_speedo_0_value;
+       int cpu_iddq_value, gpu_iddq_value, soc_iddq_value;
+
+       BUILD_BUG_ON(ARRAY_SIZE(cpu_process_speedos) !=
+                       THRESHOLD_INDEX_COUNT);
+       BUILD_BUG_ON(ARRAY_SIZE(gpu_process_speedos) !=
+                       THRESHOLD_INDEX_COUNT);
+       BUILD_BUG_ON(ARRAY_SIZE(core_process_speedos) !=
+                       THRESHOLD_INDEX_COUNT);
+
+       cpu_speedo_0_value = tegra30_fuse_readl(FUSE_CPU_SPEEDO_0);
+
+       /* GPU Speedo is stored in CPU_SPEEDO_2 */
+       sku_info->gpu_speedo_value = tegra30_fuse_readl(FUSE_CPU_SPEEDO_2);
+
+       soc_speedo_0_value = tegra30_fuse_readl(FUSE_SOC_SPEEDO_0);
+
+       cpu_iddq_value = tegra30_fuse_readl(FUSE_CPU_IDDQ);
+       soc_iddq_value = tegra30_fuse_readl(FUSE_SOC_IDDQ);
+       gpu_iddq_value = tegra30_fuse_readl(FUSE_GPU_IDDQ);
+
+       sku_info->cpu_speedo_value = cpu_speedo_0_value;
+
+       if (sku_info->cpu_speedo_value == 0) {
+               pr_warn("Tegra Warning: Speedo value not fused.\n");
+               WARN_ON(1);
+               return;
+       }
+
+       rev_sku_to_speedo_ids(sku_info, &threshold);
+
+       sku_info->cpu_iddq_value = tegra30_fuse_readl(FUSE_CPU_IDDQ);
+
+       for (i = 0; i < GPU_PROCESS_CORNERS; i++)
+               if (sku_info->gpu_speedo_value <
+                       gpu_process_speedos[threshold][i])
+                       break;
+       sku_info->gpu_process_id = i;
+
+       for (i = 0; i < CPU_PROCESS_CORNERS; i++)
+               if (sku_info->cpu_speedo_value <
+                       cpu_process_speedos[threshold][i])
+                               break;
+       sku_info->cpu_process_id = i;
+
+       for (i = 0; i < CORE_PROCESS_CORNERS; i++)
+               if (soc_speedo_0_value <
+                       core_process_speedos[threshold][i])
+                       break;
+       sku_info->core_process_id = i;
+
+       pr_debug("Tegra GPU Speedo ID=%d, Speedo Value=%d\n",
+                sku_info->gpu_speedo_id, sku_info->gpu_speedo_value);
+}
diff --git a/drivers/soc/tegra/fuse/speedo-tegra20.c b/drivers/soc/tegra/fuse/speedo-tegra20.c
new file mode 100644 (file)
index 0000000..eff1b63
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+ * Copyright (c) 2012-2014, NVIDIA CORPORATION.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <linux/bug.h>
+#include <linux/device.h>
+#include <linux/kernel.h>
+
+#include <soc/tegra/fuse.h>
+
+#include "fuse.h"
+
+#define CPU_SPEEDO_LSBIT               20
+#define CPU_SPEEDO_MSBIT               29
+#define CPU_SPEEDO_REDUND_LSBIT                30
+#define CPU_SPEEDO_REDUND_MSBIT                39
+#define CPU_SPEEDO_REDUND_OFFS (CPU_SPEEDO_REDUND_MSBIT - CPU_SPEEDO_MSBIT)
+
+#define CORE_SPEEDO_LSBIT              40
+#define CORE_SPEEDO_MSBIT              47
+#define CORE_SPEEDO_REDUND_LSBIT       48
+#define CORE_SPEEDO_REDUND_MSBIT       55
+#define CORE_SPEEDO_REDUND_OFFS        (CORE_SPEEDO_REDUND_MSBIT - CORE_SPEEDO_MSBIT)
+
+#define SPEEDO_MULT                    4
+
+#define PROCESS_CORNERS_NUM            4
+
+#define SPEEDO_ID_SELECT_0(rev)                ((rev) <= 2)
+#define SPEEDO_ID_SELECT_1(sku)                \
+       (((sku) != 20) && ((sku) != 23) && ((sku) != 24) && \
+        ((sku) != 27) && ((sku) != 28))
+
+enum {
+       SPEEDO_ID_0,
+       SPEEDO_ID_1,
+       SPEEDO_ID_2,
+       SPEEDO_ID_COUNT,
+};
+
+static const u32 __initconst cpu_process_speedos[][PROCESS_CORNERS_NUM] = {
+       {315, 366, 420, UINT_MAX},
+       {303, 368, 419, UINT_MAX},
+       {316, 331, 383, UINT_MAX},
+};
+
+static const u32 __initconst core_process_speedos[][PROCESS_CORNERS_NUM] = {
+       {165, 195, 224, UINT_MAX},
+       {165, 195, 224, UINT_MAX},
+       {165, 195, 224, UINT_MAX},
+};
+
+void __init tegra20_init_speedo_data(struct tegra_sku_info *sku_info)
+{
+       u32 reg;
+       u32 val;
+       int i;
+
+       BUILD_BUG_ON(ARRAY_SIZE(cpu_process_speedos) != SPEEDO_ID_COUNT);
+       BUILD_BUG_ON(ARRAY_SIZE(core_process_speedos) != SPEEDO_ID_COUNT);
+
+       if (SPEEDO_ID_SELECT_0(sku_info->revision))
+               sku_info->soc_speedo_id = SPEEDO_ID_0;
+       else if (SPEEDO_ID_SELECT_1(sku_info->sku_id))
+               sku_info->soc_speedo_id = SPEEDO_ID_1;
+       else
+               sku_info->soc_speedo_id = SPEEDO_ID_2;
+
+       val = 0;
+       for (i = CPU_SPEEDO_MSBIT; i >= CPU_SPEEDO_LSBIT; i--) {
+               reg = tegra20_spare_fuse_early(i) |
+                       tegra20_spare_fuse_early(i + CPU_SPEEDO_REDUND_OFFS);
+               val = (val << 1) | (reg & 0x1);
+       }
+       val = val * SPEEDO_MULT;
+       pr_debug("Tegra CPU speedo value %u\n", val);
+
+       for (i = 0; i < (PROCESS_CORNERS_NUM - 1); i++) {
+               if (val <= cpu_process_speedos[sku_info->soc_speedo_id][i])
+                       break;
+       }
+       sku_info->cpu_process_id = i;
+
+       val = 0;
+       for (i = CORE_SPEEDO_MSBIT; i >= CORE_SPEEDO_LSBIT; i--) {
+               reg = tegra20_spare_fuse_early(i) |
+                       tegra20_spare_fuse_early(i + CORE_SPEEDO_REDUND_OFFS);
+               val = (val << 1) | (reg & 0x1);
+       }
+       val = val * SPEEDO_MULT;
+       pr_debug("Core speedo value %u\n", val);
+
+       for (i = 0; i < (PROCESS_CORNERS_NUM - 1); i++) {
+               if (val <= core_process_speedos[sku_info->soc_speedo_id][i])
+                       break;
+       }
+       sku_info->core_process_id = i;
+}
diff --git a/drivers/soc/tegra/fuse/speedo-tegra30.c b/drivers/soc/tegra/fuse/speedo-tegra30.c
new file mode 100644 (file)
index 0000000..b17f0dc
--- /dev/null
@@ -0,0 +1,288 @@
+/*
+ * Copyright (c) 2012-2014, NVIDIA CORPORATION.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <linux/bug.h>
+#include <linux/device.h>
+#include <linux/kernel.h>
+
+#include <soc/tegra/fuse.h>
+
+#include "fuse.h"
+
+#define CORE_PROCESS_CORNERS   1
+#define CPU_PROCESS_CORNERS    6
+
+#define FUSE_SPEEDO_CALIB_0    0x14
+#define FUSE_PACKAGE_INFO      0XFC
+#define FUSE_TEST_PROG_VER     0X28
+
+#define G_SPEEDO_BIT_MINUS1    58
+#define G_SPEEDO_BIT_MINUS1_R  59
+#define G_SPEEDO_BIT_MINUS2    60
+#define G_SPEEDO_BIT_MINUS2_R  61
+#define LP_SPEEDO_BIT_MINUS1   62
+#define LP_SPEEDO_BIT_MINUS1_R 63
+#define LP_SPEEDO_BIT_MINUS2   64
+#define LP_SPEEDO_BIT_MINUS2_R 65
+
+enum {
+       THRESHOLD_INDEX_0,
+       THRESHOLD_INDEX_1,
+       THRESHOLD_INDEX_2,
+       THRESHOLD_INDEX_3,
+       THRESHOLD_INDEX_4,
+       THRESHOLD_INDEX_5,
+       THRESHOLD_INDEX_6,
+       THRESHOLD_INDEX_7,
+       THRESHOLD_INDEX_8,
+       THRESHOLD_INDEX_9,
+       THRESHOLD_INDEX_10,
+       THRESHOLD_INDEX_11,
+       THRESHOLD_INDEX_COUNT,
+};
+
+static const u32 __initconst core_process_speedos[][CORE_PROCESS_CORNERS] = {
+       {180},
+       {170},
+       {195},
+       {180},
+       {168},
+       {192},
+       {180},
+       {170},
+       {195},
+       {180},
+       {180},
+       {180},
+};
+
+static const u32 __initconst cpu_process_speedos[][CPU_PROCESS_CORNERS] = {
+       {306, 338, 360, 376, UINT_MAX},
+       {295, 336, 358, 375, UINT_MAX},
+       {325, 325, 358, 375, UINT_MAX},
+       {325, 325, 358, 375, UINT_MAX},
+       {292, 324, 348, 364, UINT_MAX},
+       {324, 324, 348, 364, UINT_MAX},
+       {324, 324, 348, 364, UINT_MAX},
+       {295, 336, 358, 375, UINT_MAX},
+       {358, 358, 358, 358, 397, UINT_MAX},
+       {364, 364, 364, 364, 397, UINT_MAX},
+       {295, 336, 358, 375, 391, UINT_MAX},
+       {295, 336, 358, 375, 391, UINT_MAX},
+};
+
+static int threshold_index __initdata;
+
+static void __init fuse_speedo_calib(u32 *speedo_g, u32 *speedo_lp)
+{
+       u32 reg;
+       int ate_ver;
+       int bit_minus1;
+       int bit_minus2;
+
+       reg = tegra30_fuse_readl(FUSE_SPEEDO_CALIB_0);
+
+       *speedo_lp = (reg & 0xFFFF) * 4;
+       *speedo_g = ((reg >> 16) & 0xFFFF) * 4;
+
+       ate_ver = tegra30_fuse_readl(FUSE_TEST_PROG_VER);
+       pr_debug("Tegra ATE prog ver %d.%d\n", ate_ver/10, ate_ver%10);
+
+       if (ate_ver >= 26) {
+               bit_minus1 = tegra30_spare_fuse(LP_SPEEDO_BIT_MINUS1);
+               bit_minus1 |= tegra30_spare_fuse(LP_SPEEDO_BIT_MINUS1_R);
+               bit_minus2 = tegra30_spare_fuse(LP_SPEEDO_BIT_MINUS2);
+               bit_minus2 |= tegra30_spare_fuse(LP_SPEEDO_BIT_MINUS2_R);
+               *speedo_lp |= (bit_minus1 << 1) | bit_minus2;
+
+               bit_minus1 = tegra30_spare_fuse(G_SPEEDO_BIT_MINUS1);
+               bit_minus1 |= tegra30_spare_fuse(G_SPEEDO_BIT_MINUS1_R);
+               bit_minus2 = tegra30_spare_fuse(G_SPEEDO_BIT_MINUS2);
+               bit_minus2 |= tegra30_spare_fuse(G_SPEEDO_BIT_MINUS2_R);
+               *speedo_g |= (bit_minus1 << 1) | bit_minus2;
+       } else {
+               *speedo_lp |= 0x3;
+               *speedo_g |= 0x3;
+       }
+}
+
+static void __init rev_sku_to_speedo_ids(struct tegra_sku_info *sku_info)
+{
+       int package_id = tegra30_fuse_readl(FUSE_PACKAGE_INFO) & 0x0F;
+
+       switch (sku_info->revision) {
+       case TEGRA_REVISION_A01:
+               sku_info->cpu_speedo_id = 0;
+               sku_info->soc_speedo_id = 0;
+               threshold_index = THRESHOLD_INDEX_0;
+               break;
+       case TEGRA_REVISION_A02:
+       case TEGRA_REVISION_A03:
+               switch (sku_info->sku_id) {
+               case 0x87:
+               case 0x82:
+                       sku_info->cpu_speedo_id = 1;
+                       sku_info->soc_speedo_id = 1;
+                       threshold_index = THRESHOLD_INDEX_1;
+                       break;
+               case 0x81:
+                       switch (package_id) {
+                       case 1:
+                               sku_info->cpu_speedo_id = 2;
+                               sku_info->soc_speedo_id = 2;
+                               threshold_index = THRESHOLD_INDEX_2;
+                               break;
+                       case 2:
+                               sku_info->cpu_speedo_id = 4;
+                               sku_info->soc_speedo_id = 1;
+                               threshold_index = THRESHOLD_INDEX_7;
+                               break;
+                       default:
+                               pr_err("Tegra Unknown pkg %d\n", package_id);
+                               break;
+                       }
+                       break;
+               case 0x80:
+                       switch (package_id) {
+                       case 1:
+                               sku_info->cpu_speedo_id = 5;
+                               sku_info->soc_speedo_id = 2;
+                               threshold_index = THRESHOLD_INDEX_8;
+                               break;
+                       case 2:
+                               sku_info->cpu_speedo_id = 6;
+                               sku_info->soc_speedo_id = 2;
+                               threshold_index = THRESHOLD_INDEX_9;
+                               break;
+                       default:
+                               pr_err("Tegra Unknown pkg %d\n", package_id);
+                               break;
+                       }
+                       break;
+               case 0x83:
+                       switch (package_id) {
+                       case 1:
+                               sku_info->cpu_speedo_id = 7;
+                               sku_info->soc_speedo_id = 1;
+                               threshold_index = THRESHOLD_INDEX_10;
+                               break;
+                       case 2:
+                               sku_info->cpu_speedo_id = 3;
+                               sku_info->soc_speedo_id = 2;
+                               threshold_index = THRESHOLD_INDEX_3;
+                               break;
+                       default:
+                               pr_err("Tegra Unknown pkg %d\n", package_id);
+                               break;
+                       }
+                       break;
+               case 0x8F:
+                       sku_info->cpu_speedo_id = 8;
+                       sku_info->soc_speedo_id = 1;
+                       threshold_index = THRESHOLD_INDEX_11;
+                       break;
+               case 0x08:
+                       sku_info->cpu_speedo_id = 1;
+                       sku_info->soc_speedo_id = 1;
+                       threshold_index = THRESHOLD_INDEX_4;
+                       break;
+               case 0x02:
+                       sku_info->cpu_speedo_id = 2;
+                       sku_info->soc_speedo_id = 2;
+                       threshold_index = THRESHOLD_INDEX_5;
+                       break;
+               case 0x04:
+                       sku_info->cpu_speedo_id = 3;
+                       sku_info->soc_speedo_id = 2;
+                       threshold_index = THRESHOLD_INDEX_6;
+                       break;
+               case 0:
+                       switch (package_id) {
+                       case 1:
+                               sku_info->cpu_speedo_id = 2;
+                               sku_info->soc_speedo_id = 2;
+                               threshold_index = THRESHOLD_INDEX_2;
+                               break;
+                       case 2:
+                               sku_info->cpu_speedo_id = 3;
+                               sku_info->soc_speedo_id = 2;
+                               threshold_index = THRESHOLD_INDEX_3;
+                               break;
+                       default:
+                               pr_err("Tegra Unknown pkg %d\n", package_id);
+                               break;
+                       }
+                       break;
+               default:
+                       pr_warn("Tegra Unknown SKU %d\n", sku_info->sku_id);
+                       sku_info->cpu_speedo_id = 0;
+                       sku_info->soc_speedo_id = 0;
+                       threshold_index = THRESHOLD_INDEX_0;
+                       break;
+               }
+               break;
+       default:
+               pr_warn("Tegra Unknown chip rev %d\n", sku_info->revision);
+               sku_info->cpu_speedo_id = 0;
+               sku_info->soc_speedo_id = 0;
+               threshold_index = THRESHOLD_INDEX_0;
+               break;
+       }
+}
+
+void __init tegra30_init_speedo_data(struct tegra_sku_info *sku_info)
+{
+       u32 cpu_speedo_val;
+       u32 core_speedo_val;
+       int i;
+
+       BUILD_BUG_ON(ARRAY_SIZE(cpu_process_speedos) !=
+                       THRESHOLD_INDEX_COUNT);
+       BUILD_BUG_ON(ARRAY_SIZE(core_process_speedos) !=
+                       THRESHOLD_INDEX_COUNT);
+
+
+       rev_sku_to_speedo_ids(sku_info);
+       fuse_speedo_calib(&cpu_speedo_val, &core_speedo_val);
+       pr_debug("Tegra CPU speedo value %u\n", cpu_speedo_val);
+       pr_debug("Tegra Core speedo value %u\n", core_speedo_val);
+
+       for (i = 0; i < CPU_PROCESS_CORNERS; i++) {
+               if (cpu_speedo_val < cpu_process_speedos[threshold_index][i])
+                       break;
+       }
+       sku_info->cpu_process_id = i - 1;
+
+       if (sku_info->cpu_process_id == -1) {
+               pr_warn("Tegra CPU speedo value %3d out of range",
+                        cpu_speedo_val);
+               sku_info->cpu_process_id = 0;
+               sku_info->cpu_speedo_id = 1;
+       }
+
+       for (i = 0; i < CORE_PROCESS_CORNERS; i++) {
+               if (core_speedo_val < core_process_speedos[threshold_index][i])
+                       break;
+       }
+       sku_info->core_process_id = i - 1;
+
+       if (sku_info->core_process_id == -1) {
+               pr_warn("Tegra CORE speedo value %3d out of range",
+                                core_speedo_val);
+               sku_info->core_process_id = 0;
+               sku_info->soc_speedo_id = 1;
+       }
+}
diff --git a/drivers/soc/tegra/fuse/tegra-apbmisc.c b/drivers/soc/tegra/fuse/tegra-apbmisc.c
new file mode 100644 (file)
index 0000000..3bf5aba
--- /dev/null
@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) 2014, NVIDIA CORPORATION.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/io.h>
+
+#include <soc/tegra/fuse.h>
+
+#include "fuse.h"
+
+#define APBMISC_BASE   0x70000800
+#define APBMISC_SIZE   0x64
+#define FUSE_SKU_INFO  0x10
+
+static void __iomem *apbmisc_base;
+static void __iomem *strapping_base;
+
+u32 tegra_read_chipid(void)
+{
+       return readl_relaxed(apbmisc_base + 4);
+}
+
+u8 tegra_get_chip_id(void)
+{
+       if (!apbmisc_base) {
+               WARN(1, "Tegra Chip ID not yet available\n");
+               return 0;
+       }
+
+       return (tegra_read_chipid() >> 8) & 0xff;
+}
+
+u32 tegra_read_straps(void)
+{
+       if (strapping_base)
+               return readl_relaxed(strapping_base);
+       else
+               return 0;
+}
+
+static const struct of_device_id apbmisc_match[] __initconst = {
+       { .compatible = "nvidia,tegra20-apbmisc", },
+       {},
+};
+
+void __init tegra_init_revision(void)
+{
+       u32 id, chip_id, minor_rev;
+       int rev;
+
+       id = tegra_read_chipid();
+       chip_id = (id >> 8) & 0xff;
+       minor_rev = (id >> 16) & 0xf;
+
+       switch (minor_rev) {
+       case 1:
+               rev = TEGRA_REVISION_A01;
+               break;
+       case 2:
+               rev = TEGRA_REVISION_A02;
+               break;
+       case 3:
+               if (chip_id == TEGRA20 && (tegra20_spare_fuse_early(18) ||
+                                          tegra20_spare_fuse_early(19)))
+                       rev = TEGRA_REVISION_A03p;
+               else
+                       rev = TEGRA_REVISION_A03;
+               break;
+       case 4:
+               rev = TEGRA_REVISION_A04;
+               break;
+       default:
+               rev = TEGRA_REVISION_UNKNOWN;
+       }
+
+       tegra_sku_info.revision = rev;
+
+       if (chip_id == TEGRA20)
+               tegra_sku_info.sku_id = tegra20_fuse_early(FUSE_SKU_INFO);
+       else
+               tegra_sku_info.sku_id = tegra30_fuse_readl(FUSE_SKU_INFO);
+}
+
+void __init tegra_init_apbmisc(void)
+{
+       struct device_node *np;
+
+       np = of_find_matching_node(NULL, apbmisc_match);
+       apbmisc_base = of_iomap(np, 0);
+       if (!apbmisc_base) {
+               pr_warn("ioremap tegra apbmisc failed. using %08x instead\n",
+                       APBMISC_BASE);
+               apbmisc_base = ioremap(APBMISC_BASE, APBMISC_SIZE);
+       }
+
+       strapping_base = of_iomap(np, 1);
+       if (!strapping_base)
+               pr_err("ioremap tegra strapping_base failed\n");
+}
diff --git a/drivers/soc/tegra/pmc.c b/drivers/soc/tegra/pmc.c
new file mode 100644 (file)
index 0000000..a2c0ceb
--- /dev/null
@@ -0,0 +1,957 @@
+/*
+ * drivers/soc/tegra/pmc.c
+ *
+ * Copyright (c) 2010 Google, Inc
+ *
+ * Author:
+ *     Colin Cross <ccross@google.com>
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/clk.h>
+#include <linux/clk/tegra.h>
+#include <linux/debugfs.h>
+#include <linux/delay.h>
+#include <linux/err.h>
+#include <linux/export.h>
+#include <linux/init.h>
+#include <linux/io.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/platform_device.h>
+#include <linux/reboot.h>
+#include <linux/reset.h>
+#include <linux/seq_file.h>
+#include <linux/spinlock.h>
+
+#include <soc/tegra/common.h>
+#include <soc/tegra/fuse.h>
+#include <soc/tegra/pmc.h>
+
+#define PMC_CNTRL                      0x0
+#define  PMC_CNTRL_SYSCLK_POLARITY     (1 << 10)  /* sys clk polarity */
+#define  PMC_CNTRL_SYSCLK_OE           (1 << 11)  /* system clock enable */
+#define  PMC_CNTRL_SIDE_EFFECT_LP0     (1 << 14)  /* LP0 when CPU pwr gated */
+#define  PMC_CNTRL_CPU_PWRREQ_POLARITY (1 << 15)  /* CPU pwr req polarity */
+#define  PMC_CNTRL_CPU_PWRREQ_OE       (1 << 16)  /* CPU pwr req enable */
+#define  PMC_CNTRL_INTR_POLARITY       (1 << 17)  /* inverts INTR polarity */
+
+#define DPD_SAMPLE                     0x020
+#define  DPD_SAMPLE_ENABLE             (1 << 0)
+#define  DPD_SAMPLE_DISABLE            (0 << 0)
+
+#define PWRGATE_TOGGLE                 0x30
+#define  PWRGATE_TOGGLE_START          (1 << 8)
+
+#define REMOVE_CLAMPING                        0x34
+
+#define PWRGATE_STATUS                 0x38
+
+#define PMC_SCRATCH0                   0x50
+#define  PMC_SCRATCH0_MODE_RECOVERY    (1 << 31)
+#define  PMC_SCRATCH0_MODE_BOOTLOADER  (1 << 30)
+#define  PMC_SCRATCH0_MODE_RCM         (1 << 1)
+#define  PMC_SCRATCH0_MODE_MASK                (PMC_SCRATCH0_MODE_RECOVERY | \
+                                        PMC_SCRATCH0_MODE_BOOTLOADER | \
+                                        PMC_SCRATCH0_MODE_RCM)
+
+#define PMC_CPUPWRGOOD_TIMER           0xc8
+#define PMC_CPUPWROFF_TIMER            0xcc
+
+#define PMC_SCRATCH41                  0x140
+
+#define IO_DPD_REQ                     0x1b8
+#define  IO_DPD_REQ_CODE_IDLE          (0 << 30)
+#define  IO_DPD_REQ_CODE_OFF           (1 << 30)
+#define  IO_DPD_REQ_CODE_ON            (2 << 30)
+#define  IO_DPD_REQ_CODE_MASK          (3 << 30)
+
+#define IO_DPD_STATUS                  0x1bc
+#define IO_DPD2_REQ                    0x1c0
+#define IO_DPD2_STATUS                 0x1c4
+#define SEL_DPD_TIM                    0x1c8
+
+#define GPU_RG_CNTRL                   0x2d4
+
+struct tegra_pmc_soc {
+       unsigned int num_powergates;
+       const char *const *powergates;
+       unsigned int num_cpu_powergates;
+       const u8 *cpu_powergates;
+};
+
+/**
+ * struct tegra_pmc - NVIDIA Tegra PMC
+ * @base: pointer to I/O remapped register region
+ * @clk: pointer to pclk clock
+ * @rate: currently configured rate of pclk
+ * @suspend_mode: lowest suspend mode available
+ * @cpu_good_time: CPU power good time (in microseconds)
+ * @cpu_off_time: CPU power off time (in microsecends)
+ * @core_osc_time: core power good OSC time (in microseconds)
+ * @core_pmu_time: core power good PMU time (in microseconds)
+ * @core_off_time: core power off time (in microseconds)
+ * @corereq_high: core power request is active-high
+ * @sysclkreq_high: system clock request is active-high
+ * @combined_req: combined power request for CPU & core
+ * @cpu_pwr_good_en: CPU power good signal is enabled
+ * @lp0_vec_phys: physical base address of the LP0 warm boot code
+ * @lp0_vec_size: size of the LP0 warm boot code
+ * @powergates_lock: mutex for power gate register access
+ */
+struct tegra_pmc {
+       void __iomem *base;
+       struct clk *clk;
+
+       const struct tegra_pmc_soc *soc;
+
+       unsigned long rate;
+
+       enum tegra_suspend_mode suspend_mode;
+       u32 cpu_good_time;
+       u32 cpu_off_time;
+       u32 core_osc_time;
+       u32 core_pmu_time;
+       u32 core_off_time;
+       bool corereq_high;
+       bool sysclkreq_high;
+       bool combined_req;
+       bool cpu_pwr_good_en;
+       u32 lp0_vec_phys;
+       u32 lp0_vec_size;
+
+       struct mutex powergates_lock;
+};
+
+static struct tegra_pmc *pmc = &(struct tegra_pmc) {
+       .base = NULL,
+       .suspend_mode = TEGRA_SUSPEND_NONE,
+};
+
+static u32 tegra_pmc_readl(unsigned long offset)
+{
+       return readl(pmc->base + offset);
+}
+
+static void tegra_pmc_writel(u32 value, unsigned long offset)
+{
+       writel(value, pmc->base + offset);
+}
+
+/**
+ * tegra_powergate_set() - set the state of a partition
+ * @id: partition ID
+ * @new_state: new state of the partition
+ */
+static int tegra_powergate_set(int id, bool new_state)
+{
+       bool status;
+
+       mutex_lock(&pmc->powergates_lock);
+
+       status = tegra_pmc_readl(PWRGATE_STATUS) & (1 << id);
+
+       if (status == new_state) {
+               mutex_unlock(&pmc->powergates_lock);
+               return 0;
+       }
+
+       tegra_pmc_writel(PWRGATE_TOGGLE_START | id, PWRGATE_TOGGLE);
+
+       mutex_unlock(&pmc->powergates_lock);
+
+       return 0;
+}
+
+/**
+ * tegra_powergate_power_on() - power on partition
+ * @id: partition ID
+ */
+int tegra_powergate_power_on(int id)
+{
+       if (!pmc->soc || id < 0 || id >= pmc->soc->num_powergates)
+               return -EINVAL;
+
+       return tegra_powergate_set(id, true);
+}
+
+/**
+ * tegra_powergate_power_off() - power off partition
+ * @id: partition ID
+ */
+int tegra_powergate_power_off(int id)
+{
+       if (!pmc->soc || id < 0 || id >= pmc->soc->num_powergates)
+               return -EINVAL;
+
+       return tegra_powergate_set(id, false);
+}
+EXPORT_SYMBOL(tegra_powergate_power_off);
+
+/**
+ * tegra_powergate_is_powered() - check if partition is powered
+ * @id: partition ID
+ */
+int tegra_powergate_is_powered(int id)
+{
+       u32 status;
+
+       if (!pmc->soc || id < 0 || id >= pmc->soc->num_powergates)
+               return -EINVAL;
+
+       status = tegra_pmc_readl(PWRGATE_STATUS) & (1 << id);
+       return !!status;
+}
+
+/**
+ * tegra_powergate_remove_clamping() - remove power clamps for partition
+ * @id: partition ID
+ */
+int tegra_powergate_remove_clamping(int id)
+{
+       u32 mask;
+
+       if (!pmc->soc || id < 0 || id >= pmc->soc->num_powergates)
+               return -EINVAL;
+
+       /*
+        * The Tegra124 GPU has a separate register (with different semantics)
+        * to remove clamps.
+        */
+       if (tegra_get_chip_id() == TEGRA124) {
+               if (id == TEGRA_POWERGATE_3D) {
+                       tegra_pmc_writel(0, GPU_RG_CNTRL);
+                       return 0;
+               }
+       }
+
+       /*
+        * Tegra 2 has a bug where PCIE and VDE clamping masks are
+        * swapped relatively to the partition ids
+        */
+       if (id == TEGRA_POWERGATE_VDEC)
+               mask = (1 << TEGRA_POWERGATE_PCIE);
+       else if (id == TEGRA_POWERGATE_PCIE)
+               mask = (1 << TEGRA_POWERGATE_VDEC);
+       else
+               mask = (1 << id);
+
+       tegra_pmc_writel(mask, REMOVE_CLAMPING);
+
+       return 0;
+}
+EXPORT_SYMBOL(tegra_powergate_remove_clamping);
+
+/**
+ * tegra_powergate_sequence_power_up() - power up partition
+ * @id: partition ID
+ * @clk: clock for partition
+ * @rst: reset for partition
+ *
+ * Must be called with clk disabled, and returns with clk enabled.
+ */
+int tegra_powergate_sequence_power_up(int id, struct clk *clk,
+                                     struct reset_control *rst)
+{
+       int ret;
+
+       reset_control_assert(rst);
+
+       ret = tegra_powergate_power_on(id);
+       if (ret)
+               goto err_power;
+
+       ret = clk_prepare_enable(clk);
+       if (ret)
+               goto err_clk;
+
+       usleep_range(10, 20);
+
+       ret = tegra_powergate_remove_clamping(id);
+       if (ret)
+               goto err_clamp;
+
+       usleep_range(10, 20);
+       reset_control_deassert(rst);
+
+       return 0;
+
+err_clamp:
+       clk_disable_unprepare(clk);
+err_clk:
+       tegra_powergate_power_off(id);
+err_power:
+       return ret;
+}
+EXPORT_SYMBOL(tegra_powergate_sequence_power_up);
+
+#ifdef CONFIG_SMP
+/**
+ * tegra_get_cpu_powergate_id() - convert from CPU ID to partition ID
+ * @cpuid: CPU partition ID
+ *
+ * Returns the partition ID corresponding to the CPU partition ID or a
+ * negative error code on failure.
+ */
+static int tegra_get_cpu_powergate_id(int cpuid)
+{
+       if (pmc->soc && cpuid > 0 && cpuid < pmc->soc->num_cpu_powergates)
+               return pmc->soc->cpu_powergates[cpuid];
+
+       return -EINVAL;
+}
+
+/**
+ * tegra_pmc_cpu_is_powered() - check if CPU partition is powered
+ * @cpuid: CPU partition ID
+ */
+bool tegra_pmc_cpu_is_powered(int cpuid)
+{
+       int id;
+
+       id = tegra_get_cpu_powergate_id(cpuid);
+       if (id < 0)
+               return false;
+
+       return tegra_powergate_is_powered(id);
+}
+
+/**
+ * tegra_pmc_cpu_power_on() - power on CPU partition
+ * @cpuid: CPU partition ID
+ */
+int tegra_pmc_cpu_power_on(int cpuid)
+{
+       int id;
+
+       id = tegra_get_cpu_powergate_id(cpuid);
+       if (id < 0)
+               return id;
+
+       return tegra_powergate_set(id, true);
+}
+
+/**
+ * tegra_pmc_cpu_remove_clamping() - remove power clamps for CPU partition
+ * @cpuid: CPU partition ID
+ */
+int tegra_pmc_cpu_remove_clamping(int cpuid)
+{
+       int id;
+
+       id = tegra_get_cpu_powergate_id(cpuid);
+       if (id < 0)
+               return id;
+
+       return tegra_powergate_remove_clamping(id);
+}
+#endif /* CONFIG_SMP */
+
+/**
+ * tegra_pmc_restart() - reboot the system
+ * @mode: which mode to reboot in
+ * @cmd: reboot command
+ */
+void tegra_pmc_restart(enum reboot_mode mode, const char *cmd)
+{
+       u32 value;
+
+       value = tegra_pmc_readl(PMC_SCRATCH0);
+       value &= ~PMC_SCRATCH0_MODE_MASK;
+
+       if (cmd) {
+               if (strcmp(cmd, "recovery") == 0)
+                       value |= PMC_SCRATCH0_MODE_RECOVERY;
+
+               if (strcmp(cmd, "bootloader") == 0)
+                       value |= PMC_SCRATCH0_MODE_BOOTLOADER;
+
+               if (strcmp(cmd, "forced-recovery") == 0)
+                       value |= PMC_SCRATCH0_MODE_RCM;
+       }
+
+       tegra_pmc_writel(value, PMC_SCRATCH0);
+
+       value = tegra_pmc_readl(0);
+       value |= 0x10;
+       tegra_pmc_writel(value, 0);
+}
+
+static int powergate_show(struct seq_file *s, void *data)
+{
+       unsigned int i;
+
+       seq_printf(s, " powergate powered\n");
+       seq_printf(s, "------------------\n");
+
+       for (i = 0; i < pmc->soc->num_powergates; i++) {
+               if (!pmc->soc->powergates[i])
+                       continue;
+
+               seq_printf(s, " %9s %7s\n", pmc->soc->powergates[i],
+                          tegra_powergate_is_powered(i) ? "yes" : "no");
+       }
+
+       return 0;
+}
+
+static int powergate_open(struct inode *inode, struct file *file)
+{
+       return single_open(file, powergate_show, inode->i_private);
+}
+
+static const struct file_operations powergate_fops = {
+       .open = powergate_open,
+       .read = seq_read,
+       .llseek = seq_lseek,
+       .release = single_release,
+};
+
+static int tegra_powergate_debugfs_init(void)
+{
+       struct dentry *d;
+
+       d = debugfs_create_file("powergate", S_IRUGO, NULL, NULL,
+                               &powergate_fops);
+       if (!d)
+               return -ENOMEM;
+
+       return 0;
+}
+
+static int tegra_io_rail_prepare(int id, unsigned long *request,
+                                unsigned long *status, unsigned int *bit)
+{
+       unsigned long rate, value;
+       struct clk *clk;
+
+       *bit = id % 32;
+
+       /*
+        * There are two sets of 30 bits to select IO rails, but bits 30 and
+        * 31 are control bits rather than IO rail selection bits.
+        */
+       if (id > 63 || *bit == 30 || *bit == 31)
+               return -EINVAL;
+
+       if (id < 32) {
+               *status = IO_DPD_STATUS;
+               *request = IO_DPD_REQ;
+       } else {
+               *status = IO_DPD2_STATUS;
+               *request = IO_DPD2_REQ;
+       }
+
+       clk = clk_get_sys(NULL, "pclk");
+       if (IS_ERR(clk))
+               return PTR_ERR(clk);
+
+       rate = clk_get_rate(clk);
+       clk_put(clk);
+
+       tegra_pmc_writel(DPD_SAMPLE_ENABLE, DPD_SAMPLE);
+
+       /* must be at least 200 ns, in APB (PCLK) clock cycles */
+       value = DIV_ROUND_UP(1000000000, rate);
+       value = DIV_ROUND_UP(200, value);
+       tegra_pmc_writel(value, SEL_DPD_TIM);
+
+       return 0;
+}
+
+static int tegra_io_rail_poll(unsigned long offset, unsigned long mask,
+                             unsigned long val, unsigned long timeout)
+{
+       unsigned long value;
+
+       timeout = jiffies + msecs_to_jiffies(timeout);
+
+       while (time_after(timeout, jiffies)) {
+               value = tegra_pmc_readl(offset);
+               if ((value & mask) == val)
+                       return 0;
+
+               usleep_range(250, 1000);
+       }
+
+       return -ETIMEDOUT;
+}
+
+static void tegra_io_rail_unprepare(void)
+{
+       tegra_pmc_writel(DPD_SAMPLE_DISABLE, DPD_SAMPLE);
+}
+
+int tegra_io_rail_power_on(int id)
+{
+       unsigned long request, status, value;
+       unsigned int bit, mask;
+       int err;
+
+       err = tegra_io_rail_prepare(id, &request, &status, &bit);
+       if (err < 0)
+               return err;
+
+       mask = 1 << bit;
+
+       value = tegra_pmc_readl(request);
+       value |= mask;
+       value &= ~IO_DPD_REQ_CODE_MASK;
+       value |= IO_DPD_REQ_CODE_OFF;
+       tegra_pmc_writel(value, request);
+
+       err = tegra_io_rail_poll(status, mask, 0, 250);
+       if (err < 0)
+               return err;
+
+       tegra_io_rail_unprepare();
+
+       return 0;
+}
+EXPORT_SYMBOL(tegra_io_rail_power_on);
+
+int tegra_io_rail_power_off(int id)
+{
+       unsigned long request, status, value;
+       unsigned int bit, mask;
+       int err;
+
+       err = tegra_io_rail_prepare(id, &request, &status, &bit);
+       if (err < 0)
+               return err;
+
+       mask = 1 << bit;
+
+       value = tegra_pmc_readl(request);
+       value |= mask;
+       value &= ~IO_DPD_REQ_CODE_MASK;
+       value |= IO_DPD_REQ_CODE_ON;
+       tegra_pmc_writel(value, request);
+
+       err = tegra_io_rail_poll(status, mask, mask, 250);
+       if (err < 0)
+               return err;
+
+       tegra_io_rail_unprepare();
+
+       return 0;
+}
+EXPORT_SYMBOL(tegra_io_rail_power_off);
+
+#ifdef CONFIG_PM_SLEEP
+enum tegra_suspend_mode tegra_pmc_get_suspend_mode(void)
+{
+       return pmc->suspend_mode;
+}
+
+void tegra_pmc_set_suspend_mode(enum tegra_suspend_mode mode)
+{
+       if (mode < TEGRA_SUSPEND_NONE || mode >= TEGRA_MAX_SUSPEND_MODE)
+               return;
+
+       pmc->suspend_mode = mode;
+}
+
+void tegra_pmc_enter_suspend_mode(enum tegra_suspend_mode mode)
+{
+       unsigned long long rate = 0;
+       u32 value;
+
+       switch (mode) {
+       case TEGRA_SUSPEND_LP1:
+               rate = 32768;
+               break;
+
+       case TEGRA_SUSPEND_LP2:
+               rate = clk_get_rate(pmc->clk);
+               break;
+
+       default:
+               break;
+       }
+
+       if (WARN_ON_ONCE(rate == 0))
+               rate = 100000000;
+
+       if (rate != pmc->rate) {
+               u64 ticks;
+
+               ticks = pmc->cpu_good_time * rate + USEC_PER_SEC - 1;
+               do_div(ticks, USEC_PER_SEC);
+               tegra_pmc_writel(ticks, PMC_CPUPWRGOOD_TIMER);
+
+               ticks = pmc->cpu_off_time * rate + USEC_PER_SEC - 1;
+               do_div(ticks, USEC_PER_SEC);
+               tegra_pmc_writel(ticks, PMC_CPUPWROFF_TIMER);
+
+               wmb();
+
+               pmc->rate = rate;
+       }
+
+       value = tegra_pmc_readl(PMC_CNTRL);
+       value &= ~PMC_CNTRL_SIDE_EFFECT_LP0;
+       value |= PMC_CNTRL_CPU_PWRREQ_OE;
+       tegra_pmc_writel(value, PMC_CNTRL);
+}
+#endif
+
+static int tegra_pmc_parse_dt(struct tegra_pmc *pmc, struct device_node *np)
+{
+       u32 value, values[2];
+
+       if (of_property_read_u32(np, "nvidia,suspend-mode", &value)) {
+       } else {
+               switch (value) {
+               case 0:
+                       pmc->suspend_mode = TEGRA_SUSPEND_LP0;
+                       break;
+
+               case 1:
+                       pmc->suspend_mode = TEGRA_SUSPEND_LP1;
+                       break;
+
+               case 2:
+                       pmc->suspend_mode = TEGRA_SUSPEND_LP2;
+                       break;
+
+               default:
+                       pmc->suspend_mode = TEGRA_SUSPEND_NONE;
+                       break;
+               }
+       }
+
+       pmc->suspend_mode = tegra_pm_validate_suspend_mode(pmc->suspend_mode);
+
+       if (of_property_read_u32(np, "nvidia,cpu-pwr-good-time", &value))
+               pmc->suspend_mode = TEGRA_SUSPEND_NONE;
+
+       pmc->cpu_good_time = value;
+
+       if (of_property_read_u32(np, "nvidia,cpu-pwr-off-time", &value))
+               pmc->suspend_mode = TEGRA_SUSPEND_NONE;
+
+       pmc->cpu_off_time = value;
+
+       if (of_property_read_u32_array(np, "nvidia,core-pwr-good-time",
+                                      values, ARRAY_SIZE(values)))
+               pmc->suspend_mode = TEGRA_SUSPEND_NONE;
+
+       pmc->core_osc_time = values[0];
+       pmc->core_pmu_time = values[1];
+
+       if (of_property_read_u32(np, "nvidia,core-pwr-off-time", &value))
+               pmc->suspend_mode = TEGRA_SUSPEND_NONE;
+
+       pmc->core_off_time = value;
+
+       pmc->corereq_high = of_property_read_bool(np,
+                               "nvidia,core-power-req-active-high");
+
+       pmc->sysclkreq_high = of_property_read_bool(np,
+                               "nvidia,sys-clock-req-active-high");
+
+       pmc->combined_req = of_property_read_bool(np,
+                               "nvidia,combined-power-req");
+
+       pmc->cpu_pwr_good_en = of_property_read_bool(np,
+                               "nvidia,cpu-pwr-good-en");
+
+       if (of_property_read_u32_array(np, "nvidia,lp0-vec", values,
+                                      ARRAY_SIZE(values)))
+               if (pmc->suspend_mode == TEGRA_SUSPEND_LP0)
+                       pmc->suspend_mode = TEGRA_SUSPEND_LP1;
+
+       pmc->lp0_vec_phys = values[0];
+       pmc->lp0_vec_size = values[1];
+
+       return 0;
+}
+
+static void tegra_pmc_init(struct tegra_pmc *pmc)
+{
+       u32 value;
+
+       /* Always enable CPU power request */
+       value = tegra_pmc_readl(PMC_CNTRL);
+       value |= PMC_CNTRL_CPU_PWRREQ_OE;
+       tegra_pmc_writel(value, PMC_CNTRL);
+
+       value = tegra_pmc_readl(PMC_CNTRL);
+
+       if (pmc->sysclkreq_high)
+               value &= ~PMC_CNTRL_SYSCLK_POLARITY;
+       else
+               value |= PMC_CNTRL_SYSCLK_POLARITY;
+
+       /* configure the output polarity while the request is tristated */
+       tegra_pmc_writel(value, PMC_CNTRL);
+
+       /* now enable the request */
+       value = tegra_pmc_readl(PMC_CNTRL);
+       value |= PMC_CNTRL_SYSCLK_OE;
+       tegra_pmc_writel(value, PMC_CNTRL);
+}
+
+static int tegra_pmc_probe(struct platform_device *pdev)
+{
+       void __iomem *base = pmc->base;
+       struct resource *res;
+       int err;
+
+       err = tegra_pmc_parse_dt(pmc, pdev->dev.of_node);
+       if (err < 0)
+               return err;
+
+       /* take over the memory region from the early initialization */
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       pmc->base = devm_ioremap_resource(&pdev->dev, res);
+       if (IS_ERR(pmc->base))
+               return PTR_ERR(pmc->base);
+
+       iounmap(base);
+
+       pmc->clk = devm_clk_get(&pdev->dev, "pclk");
+       if (IS_ERR(pmc->clk)) {
+               err = PTR_ERR(pmc->clk);
+               dev_err(&pdev->dev, "failed to get pclk: %d\n", err);
+               return err;
+       }
+
+       tegra_pmc_init(pmc);
+
+       if (IS_ENABLED(CONFIG_DEBUG_FS)) {
+               err = tegra_powergate_debugfs_init();
+               if (err < 0)
+                       return err;
+       }
+
+       return 0;
+}
+
+#ifdef CONFIG_PM_SLEEP
+static int tegra_pmc_suspend(struct device *dev)
+{
+       tegra_pmc_writel(virt_to_phys(tegra_resume), PMC_SCRATCH41);
+
+       return 0;
+}
+
+static int tegra_pmc_resume(struct device *dev)
+{
+       tegra_pmc_writel(0x0, PMC_SCRATCH41);
+
+       return 0;
+}
+#endif
+
+static SIMPLE_DEV_PM_OPS(tegra_pmc_pm_ops, tegra_pmc_suspend, tegra_pmc_resume);
+
+static const char * const tegra20_powergates[] = {
+       [TEGRA_POWERGATE_CPU] = "cpu",
+       [TEGRA_POWERGATE_3D] = "3d",
+       [TEGRA_POWERGATE_VENC] = "venc",
+       [TEGRA_POWERGATE_VDEC] = "vdec",
+       [TEGRA_POWERGATE_PCIE] = "pcie",
+       [TEGRA_POWERGATE_L2] = "l2",
+       [TEGRA_POWERGATE_MPE] = "mpe",
+};
+
+static const struct tegra_pmc_soc tegra20_pmc_soc = {
+       .num_powergates = ARRAY_SIZE(tegra20_powergates),
+       .powergates = tegra20_powergates,
+       .num_cpu_powergates = 0,
+       .cpu_powergates = NULL,
+};
+
+static const char * const tegra30_powergates[] = {
+       [TEGRA_POWERGATE_CPU] = "cpu0",
+       [TEGRA_POWERGATE_3D] = "3d0",
+       [TEGRA_POWERGATE_VENC] = "venc",
+       [TEGRA_POWERGATE_VDEC] = "vdec",
+       [TEGRA_POWERGATE_PCIE] = "pcie",
+       [TEGRA_POWERGATE_L2] = "l2",
+       [TEGRA_POWERGATE_MPE] = "mpe",
+       [TEGRA_POWERGATE_HEG] = "heg",
+       [TEGRA_POWERGATE_SATA] = "sata",
+       [TEGRA_POWERGATE_CPU1] = "cpu1",
+       [TEGRA_POWERGATE_CPU2] = "cpu2",
+       [TEGRA_POWERGATE_CPU3] = "cpu3",
+       [TEGRA_POWERGATE_CELP] = "celp",
+       [TEGRA_POWERGATE_3D1] = "3d1",
+};
+
+static const u8 tegra30_cpu_powergates[] = {
+       TEGRA_POWERGATE_CPU,
+       TEGRA_POWERGATE_CPU1,
+       TEGRA_POWERGATE_CPU2,
+       TEGRA_POWERGATE_CPU3,
+};
+
+static const struct tegra_pmc_soc tegra30_pmc_soc = {
+       .num_powergates = ARRAY_SIZE(tegra30_powergates),
+       .powergates = tegra30_powergates,
+       .num_cpu_powergates = ARRAY_SIZE(tegra30_cpu_powergates),
+       .cpu_powergates = tegra30_cpu_powergates,
+};
+
+static const char * const tegra114_powergates[] = {
+       [TEGRA_POWERGATE_CPU] = "crail",
+       [TEGRA_POWERGATE_3D] = "3d",
+       [TEGRA_POWERGATE_VENC] = "venc",
+       [TEGRA_POWERGATE_VDEC] = "vdec",
+       [TEGRA_POWERGATE_MPE] = "mpe",
+       [TEGRA_POWERGATE_HEG] = "heg",
+       [TEGRA_POWERGATE_CPU1] = "cpu1",
+       [TEGRA_POWERGATE_CPU2] = "cpu2",
+       [TEGRA_POWERGATE_CPU3] = "cpu3",
+       [TEGRA_POWERGATE_CELP] = "celp",
+       [TEGRA_POWERGATE_CPU0] = "cpu0",
+       [TEGRA_POWERGATE_C0NC] = "c0nc",
+       [TEGRA_POWERGATE_C1NC] = "c1nc",
+       [TEGRA_POWERGATE_DIS] = "dis",
+       [TEGRA_POWERGATE_DISB] = "disb",
+       [TEGRA_POWERGATE_XUSBA] = "xusba",
+       [TEGRA_POWERGATE_XUSBB] = "xusbb",
+       [TEGRA_POWERGATE_XUSBC] = "xusbc",
+};
+
+static const u8 tegra114_cpu_powergates[] = {
+       TEGRA_POWERGATE_CPU0,
+       TEGRA_POWERGATE_CPU1,
+       TEGRA_POWERGATE_CPU2,
+       TEGRA_POWERGATE_CPU3,
+};
+
+static const struct tegra_pmc_soc tegra114_pmc_soc = {
+       .num_powergates = ARRAY_SIZE(tegra114_powergates),
+       .powergates = tegra114_powergates,
+       .num_cpu_powergates = ARRAY_SIZE(tegra114_cpu_powergates),
+       .cpu_powergates = tegra114_cpu_powergates,
+};
+
+static const char * const tegra124_powergates[] = {
+       [TEGRA_POWERGATE_CPU] = "crail",
+       [TEGRA_POWERGATE_3D] = "3d",
+       [TEGRA_POWERGATE_VENC] = "venc",
+       [TEGRA_POWERGATE_PCIE] = "pcie",
+       [TEGRA_POWERGATE_VDEC] = "vdec",
+       [TEGRA_POWERGATE_L2] = "l2",
+       [TEGRA_POWERGATE_MPE] = "mpe",
+       [TEGRA_POWERGATE_HEG] = "heg",
+       [TEGRA_POWERGATE_SATA] = "sata",
+       [TEGRA_POWERGATE_CPU1] = "cpu1",
+       [TEGRA_POWERGATE_CPU2] = "cpu2",
+       [TEGRA_POWERGATE_CPU3] = "cpu3",
+       [TEGRA_POWERGATE_CELP] = "celp",
+       [TEGRA_POWERGATE_CPU0] = "cpu0",
+       [TEGRA_POWERGATE_C0NC] = "c0nc",
+       [TEGRA_POWERGATE_C1NC] = "c1nc",
+       [TEGRA_POWERGATE_SOR] = "sor",
+       [TEGRA_POWERGATE_DIS] = "dis",
+       [TEGRA_POWERGATE_DISB] = "disb",
+       [TEGRA_POWERGATE_XUSBA] = "xusba",
+       [TEGRA_POWERGATE_XUSBB] = "xusbb",
+       [TEGRA_POWERGATE_XUSBC] = "xusbc",
+       [TEGRA_POWERGATE_VIC] = "vic",
+       [TEGRA_POWERGATE_IRAM] = "iram",
+};
+
+static const u8 tegra124_cpu_powergates[] = {
+       TEGRA_POWERGATE_CPU0,
+       TEGRA_POWERGATE_CPU1,
+       TEGRA_POWERGATE_CPU2,
+       TEGRA_POWERGATE_CPU3,
+};
+
+static const struct tegra_pmc_soc tegra124_pmc_soc = {
+       .num_powergates = ARRAY_SIZE(tegra124_powergates),
+       .powergates = tegra124_powergates,
+       .num_cpu_powergates = ARRAY_SIZE(tegra124_cpu_powergates),
+       .cpu_powergates = tegra124_cpu_powergates,
+};
+
+static const struct of_device_id tegra_pmc_match[] = {
+       { .compatible = "nvidia,tegra124-pmc", .data = &tegra124_pmc_soc },
+       { .compatible = "nvidia,tegra114-pmc", .data = &tegra114_pmc_soc },
+       { .compatible = "nvidia,tegra30-pmc", .data = &tegra30_pmc_soc },
+       { .compatible = "nvidia,tegra20-pmc", .data = &tegra20_pmc_soc },
+       { }
+};
+
+static struct platform_driver tegra_pmc_driver = {
+       .driver = {
+               .name = "tegra-pmc",
+               .suppress_bind_attrs = true,
+               .of_match_table = tegra_pmc_match,
+               .pm = &tegra_pmc_pm_ops,
+       },
+       .probe = tegra_pmc_probe,
+};
+module_platform_driver(tegra_pmc_driver);
+
+/*
+ * Early initialization to allow access to registers in the very early boot
+ * process.
+ */
+static int __init tegra_pmc_early_init(void)
+{
+       const struct of_device_id *match;
+       struct device_node *np;
+       struct resource regs;
+       bool invert;
+       u32 value;
+
+       if (!soc_is_tegra())
+               return 0;
+
+       np = of_find_matching_node_and_match(NULL, tegra_pmc_match, &match);
+       if (!np) {
+               pr_warn("PMC device node not found, disabling powergating\n");
+
+               regs.start = 0x7000e400;
+               regs.end = 0x7000e7ff;
+               regs.flags = IORESOURCE_MEM;
+
+               pr_warn("Using memory region %pR\n", &regs);
+       } else {
+               pmc->soc = match->data;
+       }
+
+       if (of_address_to_resource(np, 0, &regs) < 0) {
+               pr_err("failed to get PMC registers\n");
+               return -ENXIO;
+       }
+
+       pmc->base = ioremap_nocache(regs.start, resource_size(&regs));
+       if (!pmc->base) {
+               pr_err("failed to map PMC registers\n");
+               return -ENXIO;
+       }
+
+       mutex_init(&pmc->powergates_lock);
+
+       invert = of_property_read_bool(np, "nvidia,invert-interrupt");
+
+       value = tegra_pmc_readl(PMC_CNTRL);
+
+       if (invert)
+               value |= PMC_CNTRL_INTR_POLARITY;
+       else
+               value &= ~PMC_CNTRL_INTR_POLARITY;
+
+       tegra_pmc_writel(value, PMC_CNTRL);
+
+       return 0;
+}
+early_initcall(tegra_pmc_early_init);
index 1c36311935d7cb271ce0287166f224dc84c046e9..480133ee1eb39bac36132f84e70311f5769892ec 100644 (file)
@@ -1317,19 +1317,6 @@ static struct s3c64xx_spi_port_config s3c6410_spi_port_config = {
        .tx_st_done     = 21,
 };
 
-static struct s3c64xx_spi_port_config s5p64x0_spi_port_config = {
-       .fifo_lvl_mask  = { 0x1ff, 0x7F },
-       .rx_lvl_offset  = 15,
-       .tx_st_done     = 25,
-};
-
-static struct s3c64xx_spi_port_config s5pc100_spi_port_config = {
-       .fifo_lvl_mask  = { 0x7f, 0x7F },
-       .rx_lvl_offset  = 13,
-       .tx_st_done     = 21,
-       .high_speed     = true,
-};
-
 static struct s3c64xx_spi_port_config s5pv210_spi_port_config = {
        .fifo_lvl_mask  = { 0x1ff, 0x7F },
        .rx_lvl_offset  = 15,
@@ -1361,12 +1348,6 @@ static struct platform_device_id s3c64xx_spi_driver_ids[] = {
        }, {
                .name           = "s3c6410-spi",
                .driver_data    = (kernel_ulong_t)&s3c6410_spi_port_config,
-       }, {
-               .name           = "s5p64x0-spi",
-               .driver_data    = (kernel_ulong_t)&s5p64x0_spi_port_config,
-       }, {
-               .name           = "s5pc100-spi",
-               .driver_data    = (kernel_ulong_t)&s5pc100_spi_port_config,
        }, {
                .name           = "s5pv210-spi",
                .driver_data    = (kernel_ulong_t)&s5pv210_spi_port_config,
@@ -1384,9 +1365,6 @@ static const struct of_device_id s3c64xx_spi_dt_match[] = {
        { .compatible = "samsung,s3c6410-spi",
                        .data = (void *)&s3c6410_spi_port_config,
        },
-       { .compatible = "samsung,s5pc100-spi",
-                       .data = (void *)&s5pc100_spi_port_config,
-       },
        { .compatible = "samsung,s5pv210-spi",
                        .data = (void *)&s5pv210_spi_port_config,
        },
index 47ee6c79857a4b59009025df6b4750b890349f0f..6b22106534d8d62451e18f5fe453bd3c2bc2078f 100644 (file)
@@ -202,7 +202,7 @@ static const struct file_operations imx_drm_driver_fops = {
 
 void imx_drm_connector_destroy(struct drm_connector *connector)
 {
-       drm_sysfs_connector_remove(connector);
+       drm_connector_unregister(connector);
        drm_connector_cleanup(connector);
 }
 EXPORT_SYMBOL_GPL(imx_drm_connector_destroy);
@@ -293,10 +293,10 @@ static int imx_drm_driver_load(struct drm_device *drm, unsigned long flags)
         * userspace will expect to be able to access DRM at this point.
         */
        list_for_each_entry(connector, &drm->mode_config.connector_list, head) {
-               ret = drm_sysfs_connector_add(connector);
+               ret = drm_connector_register(connector);
                if (ret) {
                        dev_err(drm->dev,
-                               "[CONNECTOR:%d:%s] drm_sysfs_connector_add failed: %d\n",
+                               "[CONNECTOR:%d:%s] drm_connector_register failed: %d\n",
                                connector->base.id,
                                connector->name, ret);
                        goto err_unbind;
index 4aff02d6712ee7448ac11e10379e405475d04a0a..c78f43a481ceab19cbe6fd4099cf1b14e65b8aaf 100644 (file)
 
 #include <asm/irq.h>
 
-#ifdef CONFIG_SAMSUNG_CLOCK
-#include <plat/clock.h>
-#endif
-
 #include "samsung.h"
 
 #if    defined(CONFIG_SERIAL_SAMSUNG_DEBUG) && \
index 5d449059a55637daa07bc5908e52e6a7bbf69f8d..8d03924749b847fa43577860101b7f42569e39ef 100644 (file)
@@ -178,17 +178,6 @@ config BACKLIGHT_ATMEL_LCDC
          If in doubt, it's safe to enable this option; it doesn't kick
          in unless the board's description says it's wired that way.
 
-config BACKLIGHT_ATMEL_PWM
-       tristate "Atmel PWM backlight control"
-       depends on ATMEL_PWM
-       help
-         Say Y here if you want to use the PWM peripheral in Atmel AT91 and
-         AVR32 devices. This driver will need additional platform data to know
-         which PWM instance to use and how to configure it.
-
-         To compile this driver as a module, choose M here: the module will be
-         called atmel-pwm-bl.
-
 config BACKLIGHT_EP93XX
        tristate "Cirrus EP93xx Backlight Driver"
        depends on FB_EP93XX
@@ -207,6 +196,15 @@ config BACKLIGHT_GENERIC
          known as the Corgi backlight driver. If you have a Sharp Zaurus
          SL-C7xx, SL-Cxx00 or SL-6000x say y.
 
+config BACKLIGHT_IPAQ_MICRO
+       tristate "iPAQ microcontroller backlight driver"
+       depends on MFD_IPAQ_MICRO
+       default y
+       help
+         Say y to enable the backlight driver for Compaq iPAQ handheld
+         computers. Say yes if you have one of the h3100/h3600/h3700
+         machines.
+
 config BACKLIGHT_LM3533
        tristate "Backlight Driver for LM3533"
        depends on BACKLIGHT_CLASS_DEVICE
index bb820024f346df519cc8984078a1bf8fd8a7bf70..fcd50b73216516e2cca50e186eeb5e61999c97f8 100644 (file)
@@ -25,7 +25,6 @@ obj-$(CONFIG_BACKLIGHT_ADP8860)               += adp8860_bl.o
 obj-$(CONFIG_BACKLIGHT_ADP8870)                += adp8870_bl.o
 obj-$(CONFIG_BACKLIGHT_APPLE)          += apple_bl.o
 obj-$(CONFIG_BACKLIGHT_AS3711)         += as3711_bl.o
-obj-$(CONFIG_BACKLIGHT_ATMEL_PWM)      += atmel-pwm-bl.o
 obj-$(CONFIG_BACKLIGHT_BD6107)         += bd6107.o
 obj-$(CONFIG_BACKLIGHT_CARILLO_RANCH)  += cr_bllcd.o
 obj-$(CONFIG_BACKLIGHT_CLASS_DEVICE)   += backlight.o
@@ -36,6 +35,7 @@ obj-$(CONFIG_BACKLIGHT_GENERIC)               += generic_bl.o
 obj-$(CONFIG_BACKLIGHT_GPIO)           += gpio_backlight.o
 obj-$(CONFIG_BACKLIGHT_HP680)          += hp680_bl.o
 obj-$(CONFIG_BACKLIGHT_HP700)          += jornada720_bl.o
+obj-$(CONFIG_BACKLIGHT_IPAQ_MICRO)     += ipaq_micro_bl.o
 obj-$(CONFIG_BACKLIGHT_LM3533)         += lm3533_bl.o
 obj-$(CONFIG_BACKLIGHT_LM3630A)                += lm3630a_bl.o
 obj-$(CONFIG_BACKLIGHT_LM3639)         += lm3639_bl.o
index ec5350f2c28a5ad135ec9721d6a770135514b15c..86234c31d79c0a1afb3ae05660f3472342ed1d50 100644 (file)
@@ -67,11 +67,6 @@ static inline int aat2870_bl_disable(struct aat2870_bl_driver_data *aat2870_bl)
        return aat2870->write(aat2870, AAT2870_BL_CH_EN, 0x0);
 }
 
-static int aat2870_bl_get_brightness(struct backlight_device *bd)
-{
-       return bd->props.brightness;
-}
-
 static int aat2870_bl_update_status(struct backlight_device *bd)
 {
        struct aat2870_bl_driver_data *aat2870_bl = bl_get_data(bd);
@@ -120,7 +115,6 @@ static int aat2870_bl_check_fb(struct backlight_device *bd, struct fb_info *fi)
 
 static const struct backlight_ops aat2870_bl_ops = {
        .options = BL_CORE_SUSPENDRESUME,
-       .get_brightness = aat2870_bl_get_brightness,
        .update_status = aat2870_bl_update_status,
        .check_fb = aat2870_bl_check_fb,
 };
index d8952c4aa689cebdb8520240fb1ebe329d44823c..4726c8be626f3dc794dfb137da1353a0d69ed887 100644 (file)
@@ -410,11 +410,6 @@ static int ams369fg06_set_power(struct lcd_device *ld, int power)
        return ams369fg06_power(lcd, power);
 }
 
-static int ams369fg06_get_brightness(struct backlight_device *bd)
-{
-       return bd->props.brightness;
-}
-
 static int ams369fg06_set_brightness(struct backlight_device *bd)
 {
        int ret = 0;
@@ -443,7 +438,6 @@ static struct lcd_ops ams369fg06_lcd_ops = {
 };
 
 static const struct backlight_ops ams369fg06_backlight_ops = {
-       .get_brightness = ams369fg06_get_brightness,
        .update_status = ams369fg06_set_brightness,
 };
 
diff --git a/drivers/video/backlight/atmel-pwm-bl.c b/drivers/video/backlight/atmel-pwm-bl.c
deleted file mode 100644 (file)
index 261b1a4..0000000
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- * Copyright (C) 2008 Atmel Corporation
- *
- * Backlight driver using Atmel PWM peripheral.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 as published by
- * the Free Software Foundation.
- */
-#include <linux/init.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/platform_device.h>
-#include <linux/fb.h>
-#include <linux/gpio.h>
-#include <linux/backlight.h>
-#include <linux/atmel_pwm.h>
-#include <linux/atmel-pwm-bl.h>
-#include <linux/slab.h>
-
-struct atmel_pwm_bl {
-       const struct atmel_pwm_bl_platform_data *pdata;
-       struct backlight_device                 *bldev;
-       struct platform_device                  *pdev;
-       struct pwm_channel                      pwmc;
-       int                                     gpio_on;
-};
-
-static void atmel_pwm_bl_set_gpio_on(struct atmel_pwm_bl *pwmbl, int on)
-{
-       if (!gpio_is_valid(pwmbl->gpio_on))
-               return;
-
-       gpio_set_value(pwmbl->gpio_on, on ^ pwmbl->pdata->on_active_low);
-}
-
-static int atmel_pwm_bl_set_intensity(struct backlight_device *bd)
-{
-       struct atmel_pwm_bl *pwmbl = bl_get_data(bd);
-       int intensity = bd->props.brightness;
-       int pwm_duty;
-
-       if (bd->props.power != FB_BLANK_UNBLANK)
-               intensity = 0;
-       if (bd->props.fb_blank != FB_BLANK_UNBLANK)
-               intensity = 0;
-
-       if (pwmbl->pdata->pwm_active_low)
-               pwm_duty = pwmbl->pdata->pwm_duty_min + intensity;
-       else
-               pwm_duty = pwmbl->pdata->pwm_duty_max - intensity;
-
-       if (pwm_duty > pwmbl->pdata->pwm_duty_max)
-               pwm_duty = pwmbl->pdata->pwm_duty_max;
-       if (pwm_duty < pwmbl->pdata->pwm_duty_min)
-               pwm_duty = pwmbl->pdata->pwm_duty_min;
-
-       if (!intensity) {
-               atmel_pwm_bl_set_gpio_on(pwmbl, 0);
-               pwm_channel_writel(&pwmbl->pwmc, PWM_CUPD, pwm_duty);
-               pwm_channel_disable(&pwmbl->pwmc);
-       } else {
-               pwm_channel_enable(&pwmbl->pwmc);
-               pwm_channel_writel(&pwmbl->pwmc, PWM_CUPD, pwm_duty);
-               atmel_pwm_bl_set_gpio_on(pwmbl, 1);
-       }
-
-       return 0;
-}
-
-static int atmel_pwm_bl_get_intensity(struct backlight_device *bd)
-{
-       struct atmel_pwm_bl *pwmbl = bl_get_data(bd);
-       u32 cdty;
-       u32 intensity;
-
-       cdty = pwm_channel_readl(&pwmbl->pwmc, PWM_CDTY);
-       if (pwmbl->pdata->pwm_active_low)
-               intensity = cdty - pwmbl->pdata->pwm_duty_min;
-       else
-               intensity = pwmbl->pdata->pwm_duty_max - cdty;
-
-       return intensity & 0xffff;
-}
-
-static int atmel_pwm_bl_init_pwm(struct atmel_pwm_bl *pwmbl)
-{
-       unsigned long pwm_rate = pwmbl->pwmc.mck;
-       unsigned long prescale = DIV_ROUND_UP(pwm_rate,
-                       (pwmbl->pdata->pwm_frequency *
-                        pwmbl->pdata->pwm_compare_max)) - 1;
-
-       /*
-        * Prescale must be power of two and maximum 0xf in size because of
-        * hardware limit. PWM speed will be:
-        *      PWM module clock speed / (2 ^ prescale).
-        */
-       prescale = fls(prescale);
-       if (prescale > 0xf)
-               prescale = 0xf;
-
-       pwm_channel_writel(&pwmbl->pwmc, PWM_CMR, prescale);
-       pwm_channel_writel(&pwmbl->pwmc, PWM_CDTY,
-                       pwmbl->pdata->pwm_duty_min +
-                       pwmbl->bldev->props.brightness);
-       pwm_channel_writel(&pwmbl->pwmc, PWM_CPRD,
-                       pwmbl->pdata->pwm_compare_max);
-
-       dev_info(&pwmbl->pdev->dev, "Atmel PWM backlight driver (%lu Hz)\n",
-               pwmbl->pwmc.mck / pwmbl->pdata->pwm_compare_max /
-               (1 << prescale));
-
-       return pwm_channel_enable(&pwmbl->pwmc);
-}
-
-static const struct backlight_ops atmel_pwm_bl_ops = {
-       .get_brightness = atmel_pwm_bl_get_intensity,
-       .update_status  = atmel_pwm_bl_set_intensity,
-};
-
-static int atmel_pwm_bl_probe(struct platform_device *pdev)
-{
-       struct backlight_properties props;
-       const struct atmel_pwm_bl_platform_data *pdata;
-       struct backlight_device *bldev;
-       struct atmel_pwm_bl *pwmbl;
-       unsigned long flags;
-       int retval;
-
-       pdata = dev_get_platdata(&pdev->dev);
-       if (!pdata)
-               return -ENODEV;
-
-       if (pdata->pwm_compare_max < pdata->pwm_duty_max ||
-                       pdata->pwm_duty_min > pdata->pwm_duty_max ||
-                       pdata->pwm_frequency == 0)
-               return -EINVAL;
-
-       pwmbl = devm_kzalloc(&pdev->dev, sizeof(struct atmel_pwm_bl),
-                               GFP_KERNEL);
-       if (!pwmbl)
-               return -ENOMEM;
-
-       pwmbl->pdev = pdev;
-       pwmbl->pdata = pdata;
-       pwmbl->gpio_on = pdata->gpio_on;
-
-       retval = pwm_channel_alloc(pdata->pwm_channel, &pwmbl->pwmc);
-       if (retval)
-               return retval;
-
-       if (gpio_is_valid(pwmbl->gpio_on)) {
-               /* Turn display off by default. */
-               if (pdata->on_active_low)
-                       flags = GPIOF_OUT_INIT_HIGH;
-               else
-                       flags = GPIOF_OUT_INIT_LOW;
-
-               retval = devm_gpio_request_one(&pdev->dev, pwmbl->gpio_on,
-                                               flags, "gpio_atmel_pwm_bl");
-               if (retval)
-                       goto err_free_pwm;
-       }
-
-       memset(&props, 0, sizeof(struct backlight_properties));
-       props.type = BACKLIGHT_RAW;
-       props.max_brightness = pdata->pwm_duty_max - pdata->pwm_duty_min;
-       bldev = devm_backlight_device_register(&pdev->dev, "atmel-pwm-bl",
-                                       &pdev->dev, pwmbl, &atmel_pwm_bl_ops,
-                                       &props);
-       if (IS_ERR(bldev)) {
-               retval = PTR_ERR(bldev);
-               goto err_free_pwm;
-       }
-
-       pwmbl->bldev = bldev;
-
-       platform_set_drvdata(pdev, pwmbl);
-
-       /* Power up the backlight by default at middle intesity. */
-       bldev->props.power = FB_BLANK_UNBLANK;
-       bldev->props.brightness = bldev->props.max_brightness / 2;
-
-       retval = atmel_pwm_bl_init_pwm(pwmbl);
-       if (retval)
-               goto err_free_pwm;
-
-       atmel_pwm_bl_set_intensity(bldev);
-
-       return 0;
-
-err_free_pwm:
-       pwm_channel_free(&pwmbl->pwmc);
-
-       return retval;
-}
-
-static int atmel_pwm_bl_remove(struct platform_device *pdev)
-{
-       struct atmel_pwm_bl *pwmbl = platform_get_drvdata(pdev);
-
-       atmel_pwm_bl_set_gpio_on(pwmbl, 0);
-       pwm_channel_disable(&pwmbl->pwmc);
-       pwm_channel_free(&pwmbl->pwmc);
-
-       return 0;
-}
-
-static struct platform_driver atmel_pwm_bl_driver = {
-       .driver = {
-               .name = "atmel-pwm-bl",
-       },
-       /* REVISIT add suspend() and resume() */
-       .probe = atmel_pwm_bl_probe,
-       .remove = atmel_pwm_bl_remove,
-};
-
-module_platform_driver(atmel_pwm_bl_driver);
-
-MODULE_AUTHOR("Hans-Christian egtvedt <hans-christian.egtvedt@atmel.com>");
-MODULE_DESCRIPTION("Atmel PWM backlight driver");
-MODULE_LICENSE("GPL");
-MODULE_ALIAS("platform:atmel-pwm-bl");
index 428089009cd5ea96d67b765d6a62cdd1c1bb25a6..bddc8b17a4d8a688f978aa82c58ff8c7514b21f0 100644 (file)
@@ -223,6 +223,8 @@ static ssize_t actual_brightness_show(struct device *dev,
        mutex_lock(&bd->ops_lock);
        if (bd->ops && bd->ops->get_brightness)
                rc = sprintf(buf, "%d\n", bd->ops->get_brightness(bd));
+       else
+               rc = sprintf(buf, "%d\n", bd->props.brightness);
        mutex_unlock(&bd->ops_lock);
 
        return rc;
index 16dd9bc625bdf22951b47f886391469e2647f99b..fdb2f7e2c6b5d45586bdfe0d620d142b75eb0ea5 100644 (file)
@@ -105,11 +105,6 @@ static int bd6107_backlight_update_status(struct backlight_device *backlight)
        return 0;
 }
 
-static int bd6107_backlight_get_brightness(struct backlight_device *backlight)
-{
-       return backlight->props.brightness;
-}
-
 static int bd6107_backlight_check_fb(struct backlight_device *backlight,
                                       struct fb_info *info)
 {
@@ -121,7 +116,6 @@ static int bd6107_backlight_check_fb(struct backlight_device *backlight,
 static const struct backlight_ops bd6107_backlight_ops = {
        .options        = BL_CORE_SUSPENDRESUME,
        .update_status  = bd6107_backlight_update_status,
-       .get_brightness = bd6107_backlight_get_brightness,
        .check_fb       = bd6107_backlight_check_fb,
 };
 
index 1cea68848f1ad9da9426dfd47e5e5fc4df4039ca..aaead04a2d541c838e02d7611f42d0c29a1a1084 100644 (file)
@@ -44,11 +44,6 @@ static int gpio_backlight_update_status(struct backlight_device *bl)
        return 0;
 }
 
-static int gpio_backlight_get_brightness(struct backlight_device *bl)
-{
-       return bl->props.brightness;
-}
-
 static int gpio_backlight_check_fb(struct backlight_device *bl,
                                   struct fb_info *info)
 {
@@ -60,7 +55,6 @@ static int gpio_backlight_check_fb(struct backlight_device *bl,
 static const struct backlight_ops gpio_backlight_ops = {
        .options        = BL_CORE_SUSPENDRESUME,
        .update_status  = gpio_backlight_update_status,
-       .get_brightness = gpio_backlight_get_brightness,
        .check_fb       = gpio_backlight_check_fb,
 };
 
diff --git a/drivers/video/backlight/ipaq_micro_bl.c b/drivers/video/backlight/ipaq_micro_bl.c
new file mode 100644 (file)
index 0000000..347dc11
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * iPAQ microcontroller backlight support
+ * Author : Linus Walleij <linus.walleij@linaro.org>
+ */
+
+#include <linux/backlight.h>
+#include <linux/err.h>
+#include <linux/fb.h>
+#include <linux/init.h>
+#include <linux/mfd/ipaq-micro.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+
+static int micro_bl_update_status(struct backlight_device *bd)
+{
+       struct ipaq_micro *micro = dev_get_drvdata(&bd->dev);
+       int intensity = bd->props.brightness;
+       struct ipaq_micro_msg msg = {
+               .id = MSG_BACKLIGHT,
+               .tx_len = 3,
+       };
+
+       if (bd->props.power != FB_BLANK_UNBLANK)
+               intensity = 0;
+       if (bd->props.state & (BL_CORE_FBBLANK | BL_CORE_SUSPENDED))
+               intensity = 0;
+
+       /*
+        * Message format:
+        * Byte 0: backlight instance (usually 1)
+        * Byte 1: on/off
+        * Byte 2: intensity, 0-255
+        */
+       msg.tx_data[0] = 0x01;
+       msg.tx_data[1] = intensity > 0 ? 1 : 0;
+       msg.tx_data[2] = intensity;
+       return ipaq_micro_tx_msg_sync(micro, &msg);
+}
+
+static const struct backlight_ops micro_bl_ops = {
+       .options = BL_CORE_SUSPENDRESUME,
+       .update_status  = micro_bl_update_status,
+};
+
+static struct backlight_properties micro_bl_props = {
+       .type = BACKLIGHT_RAW,
+       .max_brightness = 255,
+       .power = FB_BLANK_UNBLANK,
+       .brightness = 64,
+};
+
+static int micro_backlight_probe(struct platform_device *pdev)
+{
+       struct backlight_device *bd;
+       struct ipaq_micro *micro = dev_get_drvdata(pdev->dev.parent);
+
+       bd = devm_backlight_device_register(&pdev->dev, "ipaq-micro-backlight",
+                                           &pdev->dev, micro, &micro_bl_ops,
+                                           &micro_bl_props);
+       if (IS_ERR(bd))
+               return PTR_ERR(bd);
+
+       platform_set_drvdata(pdev, bd);
+       backlight_update_status(bd);
+
+       return 0;
+}
+
+static struct platform_driver micro_backlight_device_driver = {
+       .driver = {
+               .name    = "ipaq-micro-backlight",
+       },
+       .probe   = micro_backlight_probe,
+};
+module_platform_driver(micro_backlight_device_driver);
+
+MODULE_LICENSE("GPL v2");
+MODULE_DESCRIPTION("driver for iPAQ Atmel micro backlight");
+MODULE_ALIAS("platform:ipaq-micro-backlight");
index da3876c9b3ae70465b887838958687c7fd2a9675..228bc319de1922251d3c4cffb5adf190c375393b 100644 (file)
@@ -43,37 +43,38 @@ static int jornada_lcd_get_contrast(struct lcd_device *ld)
 
        jornada_ssp_start();
 
-       if (jornada_ssp_byte(GETCONTRAST) != TXDUMMY) {
-               dev_err(&ld->dev, "get contrast failed\n");
-               jornada_ssp_end();
-               return -ETIMEDOUT;
-       } else {
+       if (jornada_ssp_byte(GETCONTRAST) == TXDUMMY) {
                ret = jornada_ssp_byte(TXDUMMY);
-               jornada_ssp_end();
-               return ret;
+               goto success;
        }
+
+       dev_err(&ld->dev, "failed to set contrast\n");
+       ret = -ETIMEDOUT;
+
+success:
+       jornada_ssp_end();
+       return ret;
 }
 
 static int jornada_lcd_set_contrast(struct lcd_device *ld, int value)
 {
-       int ret;
+       int ret = 0;
 
        jornada_ssp_start();
 
        /* start by sending our set contrast cmd to mcu */
-       ret = jornada_ssp_byte(SETCONTRAST);
-
-       /* push the new value */
-       if (jornada_ssp_byte(value) != TXDUMMY) {
-               dev_err(&ld->dev, "set contrast failed\n");
-               jornada_ssp_end();
-               return -ETIMEDOUT;
+       if (jornada_ssp_byte(SETCONTRAST) == TXDUMMY) {
+               /* if successful push the new value */
+               if (jornada_ssp_byte(value) == TXDUMMY)
+                       goto success;
        }
 
-       /* if we get here we can assume everything went well */
-       jornada_ssp_end();
+       dev_err(&ld->dev, "failed to set contrast\n");
+       ret = -ETIMEDOUT;
 
-       return 0;
+success:
+       jornada_ssp_end();
+       return ret;
 }
 
 static int jornada_lcd_set_power(struct lcd_device *ld, int power)
index 506a6c236039c48daaafbaee938938812129df84..ccb44e8e492721e981bc09dd98e58338020f6c48 100644 (file)
@@ -642,11 +642,6 @@ static int ld9040_get_power(struct lcd_device *ld)
        return lcd->power;
 }
 
-static int ld9040_get_brightness(struct backlight_device *bd)
-{
-       return bd->props.brightness;
-}
-
 static int ld9040_set_brightness(struct backlight_device *bd)
 {
        int ret = 0, brightness = bd->props.brightness;
@@ -674,7 +669,6 @@ static struct lcd_ops ld9040_lcd_ops = {
 };
 
 static const struct backlight_ops ld9040_backlight_ops  = {
-       .get_brightness = ld9040_get_brightness,
        .update_status = ld9040_set_brightness,
 };
 
index 2ca3a040007bb6298c3c571b7d788900d8aa3759..dcdd5443efcf42237b0821963933c9b87a65c900 100644 (file)
@@ -274,15 +274,9 @@ static int lp855x_bl_update_status(struct backlight_device *bl)
        return 0;
 }
 
-static int lp855x_bl_get_brightness(struct backlight_device *bl)
-{
-       return bl->props.brightness;
-}
-
 static const struct backlight_ops lp855x_bl_ops = {
        .options = BL_CORE_SUSPENDRESUME,
        .update_status = lp855x_bl_update_status,
-       .get_brightness = lp855x_bl_get_brightness,
 };
 
 static int lp855x_backlight_register(struct lp855x *lp)
index daba34dc46d49556738737fc0f4e21623b9d1f85..d6c4f6a2d43e2a1c2ec872b061ddd408217a3537 100644 (file)
@@ -176,15 +176,9 @@ static int lp8788_bl_update_status(struct backlight_device *bl_dev)
        return 0;
 }
 
-static int lp8788_bl_get_brightness(struct backlight_device *bl_dev)
-{
-       return bl_dev->props.brightness;
-}
-
 static const struct backlight_ops lp8788_bl_ops = {
        .options = BL_CORE_SUSPENDRESUME,
        .update_status = lp8788_bl_update_status,
-       .get_brightness = lp8788_bl_get_brightness,
 };
 
 static int lp8788_backlight_register(struct lp8788_bl *bl)
index 1802b2d1357d6cbff959d0deab949fc0d9e08746..8ab7297b118ae2fced4620a43519db2bec4d89f6 100644 (file)
@@ -70,11 +70,6 @@ static int lv5207lp_backlight_update_status(struct backlight_device *backlight)
        return 0;
 }
 
-static int lv5207lp_backlight_get_brightness(struct backlight_device *backlight)
-{
-       return backlight->props.brightness;
-}
-
 static int lv5207lp_backlight_check_fb(struct backlight_device *backlight,
                                       struct fb_info *info)
 {
@@ -86,7 +81,6 @@ static int lv5207lp_backlight_check_fb(struct backlight_device *backlight,
 static const struct backlight_ops lv5207lp_backlight_ops = {
        .options        = BL_CORE_SUSPENDRESUME,
        .update_status  = lv5207lp_backlight_update_status,
-       .get_brightness = lv5207lp_backlight_get_brightness,
        .check_fb       = lv5207lp_backlight_check_fb,
 };
 
index 2098c5d6efb9de7dc03c62026877b80578fdfd89..2e3f82063c03b7243eed9b077c14e0b081297724 100644 (file)
@@ -100,15 +100,9 @@ done:
        return 0;
 }
 
-static int pandora_backlight_get_brightness(struct backlight_device *bl)
-{
-       return bl->props.brightness;
-}
-
 static const struct backlight_ops pandora_backlight_ops = {
        .options        = BL_CORE_SUSPENDRESUME,
        .update_status  = pandora_backlight_update_status,
-       .get_brightness = pandora_backlight_get_brightness,
 };
 
 static int pandora_backlight_probe(struct platform_device *pdev)
index 38ca88bc5c3ed0c199e73b8a533ac43448506bfb..d7a3d13e72ec3900232c34ab35d121eadfff2683 100644 (file)
@@ -115,11 +115,6 @@ static int pwm_backlight_update_status(struct backlight_device *bl)
        return 0;
 }
 
-static int pwm_backlight_get_brightness(struct backlight_device *bl)
-{
-       return bl->props.brightness;
-}
-
 static int pwm_backlight_check_fb(struct backlight_device *bl,
                                  struct fb_info *info)
 {
@@ -130,7 +125,6 @@ static int pwm_backlight_check_fb(struct backlight_device *bl,
 
 static const struct backlight_ops pwm_backlight_ops = {
        .update_status  = pwm_backlight_update_status,
-       .get_brightness = pwm_backlight_get_brightness,
        .check_fb       = pwm_backlight_check_fb,
 };
 
@@ -245,13 +239,10 @@ static int pwm_backlight_probe(struct platform_device *pdev)
        pb->dev = &pdev->dev;
        pb->enabled = false;
 
-       pb->enable_gpio = devm_gpiod_get(&pdev->dev, "enable");
+       pb->enable_gpio = devm_gpiod_get_optional(&pdev->dev, "enable");
        if (IS_ERR(pb->enable_gpio)) {
                ret = PTR_ERR(pb->enable_gpio);
-               if (ret == -ENOENT)
-                       pb->enable_gpio = NULL;
-               else
-                       goto err_alloc;
+               goto err_alloc;
        }
 
        /*
index 2d6d48196c6d09f385a54c80a0ff1692a99351c5..f3a65c8940ed9dae8c03fb115b23f09d3df87e39 100644 (file)
@@ -597,11 +597,6 @@ static int s6e63m0_get_power(struct lcd_device *ld)
        return lcd->power;
 }
 
-static int s6e63m0_get_brightness(struct backlight_device *bd)
-{
-       return bd->props.brightness;
-}
-
 static int s6e63m0_set_brightness(struct backlight_device *bd)
 {
        int ret = 0, brightness = bd->props.brightness;
@@ -629,7 +624,6 @@ static struct lcd_ops s6e63m0_lcd_ops = {
 };
 
 static const struct backlight_ops s6e63m0_backlight_ops  = {
-       .get_brightness = s6e63m0_get_brightness,
        .update_status = s6e63m0_set_brightness,
 };
 
index 595dcf561020756d74c5912b3114410c6c53703c..2e04d93aa0efe0a8e687279d81e58c1f2d257d7a 100644 (file)
@@ -109,15 +109,9 @@ static int tps65217_bl_update_status(struct backlight_device *bl)
        return rc;
 }
 
-static int tps65217_bl_get_brightness(struct backlight_device *bl)
-{
-       return bl->props.brightness;
-}
-
 static const struct backlight_ops tps65217_bl_ops = {
        .options        = BL_CORE_SUSPENDRESUME,
        .update_status  = tps65217_bl_update_status,
-       .get_brightness = tps65217_bl_get_brightness
 };
 
 static int tps65217_bl_hw_init(struct tps65217_bl *tps65217_bl,
index 59c98bfd5a8a68299aa87cc356b054af7a47558e..e05a58d759bee709fb13d68089abeb7e0f1add38 100644 (file)
@@ -290,6 +290,12 @@ config FB_ARMCLCD
          here and read <file:Documentation/kbuild/modules.txt>.  The module
          will be called amba-clcd.
 
+# Helper logic selected only by the ARM Versatile platform family.
+config PLAT_VERSATILE_CLCD
+       def_bool ARCH_VERSATILE || ARCH_REALVIEW || ARCH_VEXPRESS
+       depends on ARM
+       depends on FB_ARMCLCD && FB=y
+
 config FB_ACORN
        bool "Acorn VIDC support"
        depends on (FB = y) && ARM && ARCH_ACORN
@@ -2018,8 +2024,8 @@ config FB_TMIO_ACCELL
 
 config FB_S3C
        tristate "Samsung S3C framebuffer support"
-       depends on FB && (CPU_S3C2416 || ARCH_S3C64XX || ARCH_S5P64X0 || \
-               ARCH_S5PC100 || ARCH_S5PV210 || ARCH_EXYNOS)
+       depends on FB && (CPU_S3C2416 || ARCH_S3C64XX || \
+               ARCH_S5PV210 || ARCH_EXYNOS)
        select FB_CFB_FILLRECT
        select FB_CFB_COPYAREA
        select FB_CFB_IMAGEBLIT
index 0284f2a12538c30d906de8084a59903016bda9e4..0b2090d2e52e70d011b04563bfcaa149dc304dc8 100644 (file)
@@ -78,6 +78,7 @@ obj-$(CONFIG_FB_ATMEL)                  += atmel_lcdfb.o
 obj-$(CONFIG_FB_PVR2)             += pvr2fb.o
 obj-$(CONFIG_FB_VOODOO1)          += sstfb.o
 obj-$(CONFIG_FB_ARMCLCD)         += amba-clcd.o
+obj-$(CONFIG_PLAT_VERSATILE_CLCD) += amba-clcd-versatile.o
 obj-$(CONFIG_FB_GOLDFISH)         += goldfishfb.o
 obj-$(CONFIG_FB_68328)            += 68328fb.o
 obj-$(CONFIG_FB_GBE)              += gbefb.o
diff --git a/drivers/video/fbdev/amba-clcd-versatile.c b/drivers/video/fbdev/amba-clcd-versatile.c
new file mode 100644 (file)
index 0000000..7a8afcd
--- /dev/null
@@ -0,0 +1,182 @@
+#include <linux/device.h>
+#include <linux/dma-mapping.h>
+#include <linux/amba/bus.h>
+#include <linux/amba/clcd.h>
+#include <linux/platform_data/video-clcd-versatile.h>
+
+static struct clcd_panel vga = {
+       .mode           = {
+               .name           = "VGA",
+               .refresh        = 60,
+               .xres           = 640,
+               .yres           = 480,
+               .pixclock       = 39721,
+               .left_margin    = 40,
+               .right_margin   = 24,
+               .upper_margin   = 32,
+               .lower_margin   = 11,
+               .hsync_len      = 96,
+               .vsync_len      = 2,
+               .sync           = 0,
+               .vmode          = FB_VMODE_NONINTERLACED,
+       },
+       .width          = -1,
+       .height         = -1,
+       .tim2           = TIM2_BCD | TIM2_IPC,
+       .cntl           = CNTL_LCDTFT | CNTL_BGR | CNTL_LCDVCOMP(1),
+       .caps           = CLCD_CAP_5551 | CLCD_CAP_565 | CLCD_CAP_888,
+       .bpp            = 16,
+};
+
+static struct clcd_panel xvga = {
+       .mode           = {
+               .name           = "XVGA",
+               .refresh        = 60,
+               .xres           = 1024,
+               .yres           = 768,
+               .pixclock       = 15748,
+               .left_margin    = 152,
+               .right_margin   = 48,
+               .upper_margin   = 23,
+               .lower_margin   = 3,
+               .hsync_len      = 104,
+               .vsync_len      = 4,
+               .sync           = 0,
+               .vmode          = FB_VMODE_NONINTERLACED,
+       },
+       .width          = -1,
+       .height         = -1,
+       .tim2           = TIM2_BCD | TIM2_IPC,
+       .cntl           = CNTL_LCDTFT | CNTL_BGR | CNTL_LCDVCOMP(1),
+       .caps           = CLCD_CAP_5551 | CLCD_CAP_565 | CLCD_CAP_888,
+       .bpp            = 16,
+};
+
+/* Sanyo TM38QV67A02A - 3.8 inch QVGA (320x240) Color TFT */
+static struct clcd_panel sanyo_tm38qv67a02a = {
+       .mode           = {
+               .name           = "Sanyo TM38QV67A02A",
+               .refresh        = 116,
+               .xres           = 320,
+               .yres           = 240,
+               .pixclock       = 100000,
+               .left_margin    = 6,
+               .right_margin   = 6,
+               .upper_margin   = 5,
+               .lower_margin   = 5,
+               .hsync_len      = 6,
+               .vsync_len      = 6,
+               .sync           = 0,
+               .vmode          = FB_VMODE_NONINTERLACED,
+       },
+       .width          = -1,
+       .height         = -1,
+       .tim2           = TIM2_BCD,
+       .cntl           = CNTL_LCDTFT | CNTL_BGR | CNTL_LCDVCOMP(1),
+       .caps           = CLCD_CAP_5551,
+       .bpp            = 16,
+};
+
+static struct clcd_panel sanyo_2_5_in = {
+       .mode           = {
+               .name           = "Sanyo QVGA Portrait",
+               .refresh        = 116,
+               .xres           = 240,
+               .yres           = 320,
+               .pixclock       = 100000,
+               .left_margin    = 20,
+               .right_margin   = 10,
+               .upper_margin   = 2,
+               .lower_margin   = 2,
+               .hsync_len      = 10,
+               .vsync_len      = 2,
+               .sync           = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+               .vmode          = FB_VMODE_NONINTERLACED,
+       },
+       .width          = -1,
+       .height         = -1,
+       .tim2           = TIM2_IVS | TIM2_IHS | TIM2_IPC,
+       .cntl           = CNTL_LCDTFT | CNTL_BGR | CNTL_LCDVCOMP(1),
+       .caps           = CLCD_CAP_5551,
+       .bpp            = 16,
+};
+
+/* Epson L2F50113T00 - 2.2 inch 176x220 Color TFT */
+static struct clcd_panel epson_l2f50113t00 = {
+       .mode           = {
+               .name           = "Epson L2F50113T00",
+               .refresh        = 390,
+               .xres           = 176,
+               .yres           = 220,
+               .pixclock       = 62500,
+               .left_margin    = 3,
+               .right_margin   = 2,
+               .upper_margin   = 1,
+               .lower_margin   = 0,
+               .hsync_len      = 3,
+               .vsync_len      = 2,
+               .sync           = 0,
+               .vmode          = FB_VMODE_NONINTERLACED,
+       },
+       .width          = -1,
+       .height         = -1,
+       .tim2           = TIM2_BCD | TIM2_IPC,
+       .cntl           = CNTL_LCDTFT | CNTL_BGR | CNTL_LCDVCOMP(1),
+       .caps           = CLCD_CAP_5551,
+       .bpp            = 16,
+};
+
+static struct clcd_panel *panels[] = {
+       &vga,
+       &xvga,
+       &sanyo_tm38qv67a02a,
+       &sanyo_2_5_in,
+       &epson_l2f50113t00,
+};
+
+struct clcd_panel *versatile_clcd_get_panel(const char *name)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(panels); i++)
+               if (strcmp(panels[i]->mode.name, name) == 0)
+                       break;
+
+       if (i < ARRAY_SIZE(panels))
+               return panels[i];
+
+       pr_err("CLCD: couldn't get parameters for panel %s\n", name);
+
+       return NULL;
+}
+
+int versatile_clcd_setup_dma(struct clcd_fb *fb, unsigned long framesize)
+{
+       dma_addr_t dma;
+
+       fb->fb.screen_base = dma_alloc_writecombine(&fb->dev->dev, framesize,
+                                                   &dma, GFP_KERNEL);
+       if (!fb->fb.screen_base) {
+               pr_err("CLCD: unable to map framebuffer\n");
+               return -ENOMEM;
+       }
+
+       fb->fb.fix.smem_start   = dma;
+       fb->fb.fix.smem_len     = framesize;
+
+       return 0;
+}
+
+int versatile_clcd_mmap_dma(struct clcd_fb *fb, struct vm_area_struct *vma)
+{
+       return dma_mmap_writecombine(&fb->dev->dev, vma,
+                                    fb->fb.screen_base,
+                                    fb->fb.fix.smem_start,
+                                    fb->fb.fix.smem_len);
+}
+
+void versatile_clcd_remove_dma(struct clcd_fb *fb)
+{
+       dma_free_writecombine(&fb->dev->dev, fb->fb.fix.smem_len,
+                             fb->fb.screen_base, fb->fb.fix.smem_start);
+}
index 52108be69e7748031b4392a5a4145168bd7358d0..ff6070170d018721349b2b604113bf019653ee7f 100644 (file)
@@ -1802,13 +1802,7 @@ static int aty128_bl_update_status(struct backlight_device *bd)
        return 0;
 }
 
-static int aty128_bl_get_brightness(struct backlight_device *bd)
-{
-       return bd->props.brightness;
-}
-
 static const struct backlight_ops aty128_bl_data = {
-       .get_brightness = aty128_bl_get_brightness,
        .update_status  = aty128_bl_update_status,
 };
 
index c3d0074a32db750c01d4d0ed4e72153499c86c69..37ec09b3fffd2b4204a717953b3d67b2009a3bdd 100644 (file)
@@ -2211,13 +2211,7 @@ static int aty_bl_update_status(struct backlight_device *bd)
        return 0;
 }
 
-static int aty_bl_get_brightness(struct backlight_device *bd)
-{
-       return bd->props.brightness;
-}
-
 static const struct backlight_ops aty_bl_data = {
-       .get_brightness = aty_bl_get_brightness,
        .update_status  = aty_bl_update_status,
 };
 
index db572df7e1ef0fddd4d267523bf29daef6584f03..301d6d6aeead617b6a45e648d72c62c067020cfa 100644 (file)
@@ -123,13 +123,7 @@ static int radeon_bl_update_status(struct backlight_device *bd)
        return 0;
 }
 
-static int radeon_bl_get_brightness(struct backlight_device *bd)
-{
-       return bd->props.brightness;
-}
-
 static const struct backlight_ops radeon_bl_data = {
-       .get_brightness = radeon_bl_get_brightness,
        .update_status  = radeon_bl_update_status,
 };
 
index 29e70ed3f154eaded6287982e1fa1a99d6f6e443..95873f26e39cf6d58fe78b0dce1fdbabcf9c1390 100644 (file)
@@ -704,11 +704,6 @@ static int s6e8ax0_get_power(struct lcd_device *ld)
        return lcd->power;
 }
 
-static int s6e8ax0_get_brightness(struct backlight_device *bd)
-{
-       return bd->props.brightness;
-}
-
 static int s6e8ax0_set_brightness(struct backlight_device *bd)
 {
        int ret = 0, brightness = bd->props.brightness;
@@ -736,7 +731,6 @@ static struct lcd_ops s6e8ax0_lcd_ops = {
 };
 
 static const struct backlight_ops s6e8ax0_backlight_ops = {
-       .get_brightness = s6e8ax0_get_brightness,
        .update_status = s6e8ax0_set_brightness,
 };
 
index 8471008aa6ff6b97c60425d09238174f3a4644e8..5c151b2ea6835675fdda9539f2acc5ab670808c1 100644 (file)
@@ -82,13 +82,7 @@ static int nvidia_bl_update_status(struct backlight_device *bd)
        return 0;
 }
 
-static int nvidia_bl_get_brightness(struct backlight_device *bd)
-{
-       return bd->props.brightness;
-}
-
 static const struct backlight_ops nvidia_bl_ops = {
-       .get_brightness = nvidia_bl_get_brightness,
        .update_status  = nvidia_bl_update_status,
 };
 
index 8a8d7f060784399b29b29124e7544cf2c3127a89..be73727c7227013fe4d626b4051286fb4e3b7aaf 100644 (file)
@@ -326,13 +326,7 @@ static int riva_bl_update_status(struct backlight_device *bd)
        return 0;
 }
 
-static int riva_bl_get_brightness(struct backlight_device *bd)
-{
-       return bd->props.brightness;
-}
-
 static const struct backlight_ops riva_bl_ops = {
-       .get_brightness = riva_bl_get_brightness,
        .update_status  = riva_bl_update_status,
 };
 
index 62acae2694a9968ccbcd3f2773f3be468580a2c6..b33abb0a433d38147ffbb4d83aa1c3ca6e084894 100644 (file)
@@ -1805,38 +1805,6 @@ static struct s3c_fb_driverdata s3c_fb_data_64xx = {
        .win[4] = &s3c_fb_data_64xx_wins[4],
 };
 
-static struct s3c_fb_driverdata s3c_fb_data_s5pc100 = {
-       .variant = {
-               .nr_windows     = 5,
-               .vidtcon        = VIDTCON0,
-               .wincon         = WINCON(0),
-               .winmap         = WINxMAP(0),
-               .keycon         = WKEYCON,
-               .osd            = VIDOSD_BASE,
-               .osd_stride     = 16,
-               .buf_start      = VIDW_BUF_START(0),
-               .buf_size       = VIDW_BUF_SIZE(0),
-               .buf_end        = VIDW_BUF_END(0),
-
-               .palette = {
-                       [0] = 0x2400,
-                       [1] = 0x2800,
-                       [2] = 0x2c00,
-                       [3] = 0x3000,
-                       [4] = 0x3400,
-               },
-
-               .has_prtcon     = 1,
-               .has_blendcon   = 1,
-               .has_clksel     = 1,
-       },
-       .win[0] = &s3c_fb_data_s5p_wins[0],
-       .win[1] = &s3c_fb_data_s5p_wins[1],
-       .win[2] = &s3c_fb_data_s5p_wins[2],
-       .win[3] = &s3c_fb_data_s5p_wins[3],
-       .win[4] = &s3c_fb_data_s5p_wins[4],
-};
-
 static struct s3c_fb_driverdata s3c_fb_data_s5pv210 = {
        .variant = {
                .nr_windows     = 5,
@@ -1970,40 +1938,10 @@ static struct s3c_fb_driverdata s3c_fb_data_s3c2443 = {
        },
 };
 
-static struct s3c_fb_driverdata s3c_fb_data_s5p64x0 = {
-       .variant = {
-               .nr_windows     = 3,
-               .vidtcon        = VIDTCON0,
-               .wincon         = WINCON(0),
-               .winmap         = WINxMAP(0),
-               .keycon         = WKEYCON,
-               .osd            = VIDOSD_BASE,
-               .osd_stride     = 16,
-               .buf_start      = VIDW_BUF_START(0),
-               .buf_size       = VIDW_BUF_SIZE(0),
-               .buf_end        = VIDW_BUF_END(0),
-
-               .palette = {
-                       [0] = 0x2400,
-                       [1] = 0x2800,
-                       [2] = 0x2c00,
-               },
-
-               .has_blendcon   = 1,
-               .has_fixvclk    = 1,
-       },
-       .win[0] = &s3c_fb_data_s5p_wins[0],
-       .win[1] = &s3c_fb_data_s5p_wins[1],
-       .win[2] = &s3c_fb_data_s5p_wins[2],
-};
-
 static struct platform_device_id s3c_fb_driver_ids[] = {
        {
                .name           = "s3c-fb",
                .driver_data    = (unsigned long)&s3c_fb_data_64xx,
-       }, {
-               .name           = "s5pc100-fb",
-               .driver_data    = (unsigned long)&s3c_fb_data_s5pc100,
        }, {
                .name           = "s5pv210-fb",
                .driver_data    = (unsigned long)&s3c_fb_data_s5pv210,
@@ -2016,9 +1954,6 @@ static struct platform_device_id s3c_fb_driver_ids[] = {
        }, {
                .name           = "s3c2443-fb",
                .driver_data    = (unsigned long)&s3c_fb_data_s3c2443,
-       }, {
-               .name           = "s5p64x0-fb",
-               .driver_data    = (unsigned long)&s3c_fb_data_s5p64x0,
        },
        {},
 };
index c919d3d5c8458742aabb2963624f541004e8df18..5b5c5ff273fdb7b09def11dcee21e4043640ce77 100644 (file)
@@ -246,7 +246,7 @@ static void xen_irq_info_cleanup(struct irq_info *info)
  */
 unsigned int evtchn_from_irq(unsigned irq)
 {
-       if (unlikely(WARN(irq < 0 || irq >= nr_irqs, "Invalid irq %d!\n", irq)))
+       if (unlikely(WARN(irq >= nr_irqs, "Invalid irq %d!\n", irq)))
                return 0;
 
        return info_for_irq(irq)->evtchn;
index 84b4bfb843443ef934d2d80abc12131bb8616a5a..417415d738d0f454da2d28d2815bb221d160613f 100644 (file)
@@ -67,10 +67,9 @@ static event_word_t *event_array[MAX_EVENT_ARRAY_PAGES] __read_mostly;
 static unsigned event_array_pages __read_mostly;
 
 /*
- * sync_set_bit() and friends must be unsigned long aligned on non-x86
- * platforms.
+ * sync_set_bit() and friends must be unsigned long aligned.
  */
-#if !defined(CONFIG_X86) && BITS_PER_LONG > 32
+#if BITS_PER_LONG > 32
 
 #define BM(w) (unsigned long *)((unsigned long)w & ~0x7UL)
 #define EVTCHN_FIFO_BIT(b, w) \
@@ -100,6 +99,25 @@ static unsigned evtchn_fifo_nr_channels(void)
        return event_array_pages * EVENT_WORDS_PER_PAGE;
 }
 
+static int init_control_block(int cpu,
+                              struct evtchn_fifo_control_block *control_block)
+{
+       struct evtchn_fifo_queue *q = &per_cpu(cpu_queue, cpu);
+       struct evtchn_init_control init_control;
+       unsigned int i;
+
+       /* Reset the control block and the local HEADs. */
+       clear_page(control_block);
+       for (i = 0; i < EVTCHN_FIFO_MAX_QUEUES; i++)
+               q->head[i] = 0;
+
+       init_control.control_gfn = virt_to_mfn(control_block);
+       init_control.offset      = 0;
+       init_control.vcpu        = cpu;
+
+       return HYPERVISOR_event_channel_op(EVTCHNOP_init_control, &init_control);
+}
+
 static void free_unused_array_pages(void)
 {
        unsigned i;
@@ -312,7 +330,7 @@ static void evtchn_fifo_handle_events(unsigned cpu)
        ready = xchg(&control_block->ready, 0);
 
        while (ready) {
-               q = find_first_bit(BM(&ready), EVTCHN_FIFO_MAX_QUEUES);
+               q = find_first_bit(&ready, EVTCHN_FIFO_MAX_QUEUES);
                consume_one_event(cpu, control_block, q, &ready);
                ready |= xchg(&control_block->ready, 0);
        }
@@ -324,7 +342,6 @@ static void evtchn_fifo_resume(void)
 
        for_each_possible_cpu(cpu) {
                void *control_block = per_cpu(cpu_control_block, cpu);
-               struct evtchn_init_control init_control;
                int ret;
 
                if (!control_block)
@@ -341,12 +358,7 @@ static void evtchn_fifo_resume(void)
                        continue;
                }
 
-               init_control.control_gfn = virt_to_mfn(control_block);
-               init_control.offset = 0;
-               init_control.vcpu = cpu;
-
-               ret = HYPERVISOR_event_channel_op(EVTCHNOP_init_control,
-                                                 &init_control);
+               ret = init_control_block(cpu, control_block);
                if (ret < 0)
                        BUG();
        }
@@ -374,30 +386,25 @@ static const struct evtchn_ops evtchn_ops_fifo = {
        .resume            = evtchn_fifo_resume,
 };
 
-static int evtchn_fifo_init_control_block(unsigned cpu)
+static int evtchn_fifo_alloc_control_block(unsigned cpu)
 {
-       struct page *control_block = NULL;
-       struct evtchn_init_control init_control;
+       void *control_block = NULL;
        int ret = -ENOMEM;
 
-       control_block = alloc_page(GFP_KERNEL|__GFP_ZERO);
+       control_block = (void *)__get_free_page(GFP_KERNEL);
        if (control_block == NULL)
                goto error;
 
-       init_control.control_gfn = virt_to_mfn(page_address(control_block));
-       init_control.offset      = 0;
-       init_control.vcpu        = cpu;
-
-       ret = HYPERVISOR_event_channel_op(EVTCHNOP_init_control, &init_control);
+       ret = init_control_block(cpu, control_block);
        if (ret < 0)
                goto error;
 
-       per_cpu(cpu_control_block, cpu) = page_address(control_block);
+       per_cpu(cpu_control_block, cpu) = control_block;
 
        return 0;
 
   error:
-       __free_page(control_block);
+       free_page((unsigned long)control_block);
        return ret;
 }
 
@@ -411,7 +418,7 @@ static int evtchn_fifo_cpu_notification(struct notifier_block *self,
        switch (action) {
        case CPU_UP_PREPARE:
                if (!per_cpu(cpu_control_block, cpu))
-                       ret = evtchn_fifo_init_control_block(cpu);
+                       ret = evtchn_fifo_alloc_control_block(cpu);
                break;
        default:
                break;
@@ -428,7 +435,7 @@ int __init xen_evtchn_fifo_init(void)
        int cpu = get_cpu();
        int ret;
 
-       ret = evtchn_fifo_init_control_block(cpu);
+       ret = evtchn_fifo_alloc_control_block(cpu);
        if (ret < 0)
                goto out;
 
index eeba7544f0cd4a7dc54119b9a2df2f7c13a975db..c254ae036f18fe5f7ceaee5589de7f3501d80f7e 100644 (file)
@@ -69,7 +69,6 @@ struct grant_frames xen_auto_xlat_grant_frames;
 
 static union {
        struct grant_entry_v1 *v1;
-       union grant_entry_v2 *v2;
        void *addr;
 } gnttab_shared;
 
@@ -120,36 +119,10 @@ struct gnttab_ops {
         * by bit operations.
         */
        int (*query_foreign_access)(grant_ref_t ref);
-       /*
-        * Grant a domain to access a range of bytes within the page referred by
-        * an available grant entry. Ref parameter is reference of a grant entry
-        * which will be sub-page accessed, domid is id of grantee domain, frame
-        * is frame address of subpage grant, flags is grant type and flag
-        * information, page_off is offset of the range of bytes, and length is
-        * length of bytes to be accessed.
-        */
-       void (*update_subpage_entry)(grant_ref_t ref, domid_t domid,
-                                    unsigned long frame, int flags,
-                                    unsigned page_off, unsigned length);
-       /*
-        * Redirect an available grant entry on domain A to another grant
-        * reference of domain B, then allow domain C to use grant reference
-        * of domain B transitively. Ref parameter is an available grant entry
-        * reference on domain A, domid is id of domain C which accesses grant
-        * entry transitively, flags is grant type and flag information,
-        * trans_domid is id of domain B whose grant entry is finally accessed
-        * transitively, trans_gref is grant entry transitive reference of
-        * domain B.
-        */
-       void (*update_trans_entry)(grant_ref_t ref, domid_t domid, int flags,
-                                  domid_t trans_domid, grant_ref_t trans_gref);
 };
 
 static struct gnttab_ops *gnttab_interface;
 
-/*This reflects status of grant entries, so act as a global value*/
-static grant_status_t *grstatus;
-
 static int grant_table_version;
 static int grefs_per_grant_frame;
 
@@ -231,7 +204,7 @@ static void put_free_entry(grant_ref_t ref)
 }
 
 /*
- * Following applies to gnttab_update_entry_v1 and gnttab_update_entry_v2.
+ * Following applies to gnttab_update_entry_v1.
  * Introducing a valid entry into the grant table:
  *  1. Write ent->domid.
  *  2. Write ent->frame:
@@ -250,15 +223,6 @@ static void gnttab_update_entry_v1(grant_ref_t ref, domid_t domid,
        gnttab_shared.v1[ref].flags = flags;
 }
 
-static void gnttab_update_entry_v2(grant_ref_t ref, domid_t domid,
-                                  unsigned long frame, unsigned flags)
-{
-       gnttab_shared.v2[ref].hdr.domid = domid;
-       gnttab_shared.v2[ref].full_page.frame = frame;
-       wmb();
-       gnttab_shared.v2[ref].hdr.flags = GTF_permit_access | flags;
-}
-
 /*
  * Public grant-issuing interface functions
  */
@@ -285,132 +249,11 @@ int gnttab_grant_foreign_access(domid_t domid, unsigned long frame,
 }
 EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access);
 
-static void gnttab_update_subpage_entry_v2(grant_ref_t ref, domid_t domid,
-                                          unsigned long frame, int flags,
-                                          unsigned page_off, unsigned length)
-{
-       gnttab_shared.v2[ref].sub_page.frame = frame;
-       gnttab_shared.v2[ref].sub_page.page_off = page_off;
-       gnttab_shared.v2[ref].sub_page.length = length;
-       gnttab_shared.v2[ref].hdr.domid = domid;
-       wmb();
-       gnttab_shared.v2[ref].hdr.flags =
-                               GTF_permit_access | GTF_sub_page | flags;
-}
-
-int gnttab_grant_foreign_access_subpage_ref(grant_ref_t ref, domid_t domid,
-                                           unsigned long frame, int flags,
-                                           unsigned page_off,
-                                           unsigned length)
-{
-       if (flags & (GTF_accept_transfer | GTF_reading |
-                    GTF_writing | GTF_transitive))
-               return -EPERM;
-
-       if (gnttab_interface->update_subpage_entry == NULL)
-               return -ENOSYS;
-
-       gnttab_interface->update_subpage_entry(ref, domid, frame, flags,
-                                              page_off, length);
-
-       return 0;
-}
-EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access_subpage_ref);
-
-int gnttab_grant_foreign_access_subpage(domid_t domid, unsigned long frame,
-                                       int flags, unsigned page_off,
-                                       unsigned length)
-{
-       int ref, rc;
-
-       ref = get_free_entries(1);
-       if (unlikely(ref < 0))
-               return -ENOSPC;
-
-       rc = gnttab_grant_foreign_access_subpage_ref(ref, domid, frame, flags,
-                                                    page_off, length);
-       if (rc < 0) {
-               put_free_entry(ref);
-               return rc;
-       }
-
-       return ref;
-}
-EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access_subpage);
-
-bool gnttab_subpage_grants_available(void)
-{
-       return gnttab_interface->update_subpage_entry != NULL;
-}
-EXPORT_SYMBOL_GPL(gnttab_subpage_grants_available);
-
-static void gnttab_update_trans_entry_v2(grant_ref_t ref, domid_t domid,
-                                        int flags, domid_t trans_domid,
-                                        grant_ref_t trans_gref)
-{
-       gnttab_shared.v2[ref].transitive.trans_domid = trans_domid;
-       gnttab_shared.v2[ref].transitive.gref = trans_gref;
-       gnttab_shared.v2[ref].hdr.domid = domid;
-       wmb();
-       gnttab_shared.v2[ref].hdr.flags =
-                               GTF_permit_access | GTF_transitive | flags;
-}
-
-int gnttab_grant_foreign_access_trans_ref(grant_ref_t ref, domid_t domid,
-                                         int flags, domid_t trans_domid,
-                                         grant_ref_t trans_gref)
-{
-       if (flags & (GTF_accept_transfer | GTF_reading |
-                    GTF_writing | GTF_sub_page))
-               return -EPERM;
-
-       if (gnttab_interface->update_trans_entry == NULL)
-               return -ENOSYS;
-
-       gnttab_interface->update_trans_entry(ref, domid, flags, trans_domid,
-                                            trans_gref);
-
-       return 0;
-}
-EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access_trans_ref);
-
-int gnttab_grant_foreign_access_trans(domid_t domid, int flags,
-                                     domid_t trans_domid,
-                                     grant_ref_t trans_gref)
-{
-       int ref, rc;
-
-       ref = get_free_entries(1);
-       if (unlikely(ref < 0))
-               return -ENOSPC;
-
-       rc = gnttab_grant_foreign_access_trans_ref(ref, domid, flags,
-                                                  trans_domid, trans_gref);
-       if (rc < 0) {
-               put_free_entry(ref);
-               return rc;
-       }
-
-       return ref;
-}
-EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access_trans);
-
-bool gnttab_trans_grants_available(void)
-{
-       return gnttab_interface->update_trans_entry != NULL;
-}
-EXPORT_SYMBOL_GPL(gnttab_trans_grants_available);
-
 static int gnttab_query_foreign_access_v1(grant_ref_t ref)
 {
        return gnttab_shared.v1[ref].flags & (GTF_reading|GTF_writing);
 }
 
-static int gnttab_query_foreign_access_v2(grant_ref_t ref)
-{
-       return grstatus[ref] & (GTF_reading|GTF_writing);
-}
-
 int gnttab_query_foreign_access(grant_ref_t ref)
 {
        return gnttab_interface->query_foreign_access(ref);
@@ -433,29 +276,6 @@ static int gnttab_end_foreign_access_ref_v1(grant_ref_t ref, int readonly)
        return 1;
 }
 
-static int gnttab_end_foreign_access_ref_v2(grant_ref_t ref, int readonly)
-{
-       gnttab_shared.v2[ref].hdr.flags = 0;
-       mb();
-       if (grstatus[ref] & (GTF_reading|GTF_writing)) {
-               return 0;
-       } else {
-               /* The read of grstatus needs to have acquire
-               semantics.  On x86, reads already have
-               that, and we just need to protect against
-               compiler reorderings.  On other
-               architectures we may need a full
-               barrier. */
-#ifdef CONFIG_X86
-               barrier();
-#else
-               mb();
-#endif
-       }
-
-       return 1;
-}
-
 static inline int _gnttab_end_foreign_access_ref(grant_ref_t ref, int readonly)
 {
        return gnttab_interface->end_foreign_access_ref(ref, readonly);
@@ -616,37 +436,6 @@ static unsigned long gnttab_end_foreign_transfer_ref_v1(grant_ref_t ref)
        return frame;
 }
 
-static unsigned long gnttab_end_foreign_transfer_ref_v2(grant_ref_t ref)
-{
-       unsigned long frame;
-       u16           flags;
-       u16          *pflags;
-
-       pflags = &gnttab_shared.v2[ref].hdr.flags;
-
-       /*
-        * If a transfer is not even yet started, try to reclaim the grant
-        * reference and return failure (== 0).
-        */
-       while (!((flags = *pflags) & GTF_transfer_committed)) {
-               if (sync_cmpxchg(pflags, flags, 0) == flags)
-                       return 0;
-               cpu_relax();
-       }
-
-       /* If a transfer is in progress then wait until it is completed. */
-       while (!(flags & GTF_transfer_completed)) {
-               flags = *pflags;
-               cpu_relax();
-       }
-
-       rmb();  /* Read the frame number /after/ reading completion status. */
-       frame = gnttab_shared.v2[ref].full_page.frame;
-       BUG_ON(frame == 0);
-
-       return frame;
-}
-
 unsigned long gnttab_end_foreign_transfer_ref(grant_ref_t ref)
 {
        return gnttab_interface->end_foreign_transfer_ref(ref);
@@ -962,12 +751,6 @@ int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops,
 }
 EXPORT_SYMBOL_GPL(gnttab_unmap_refs);
 
-static unsigned nr_status_frames(unsigned nr_grant_frames)
-{
-       BUG_ON(grefs_per_grant_frame == 0);
-       return (nr_grant_frames * grefs_per_grant_frame + SPP - 1) / SPP;
-}
-
 static int gnttab_map_frames_v1(xen_pfn_t *frames, unsigned int nr_gframes)
 {
        int rc;
@@ -985,55 +768,6 @@ static void gnttab_unmap_frames_v1(void)
        arch_gnttab_unmap(gnttab_shared.addr, nr_grant_frames);
 }
 
-static int gnttab_map_frames_v2(xen_pfn_t *frames, unsigned int nr_gframes)
-{
-       uint64_t *sframes;
-       unsigned int nr_sframes;
-       struct gnttab_get_status_frames getframes;
-       int rc;
-
-       nr_sframes = nr_status_frames(nr_gframes);
-
-       /* No need for kzalloc as it is initialized in following hypercall
-        * GNTTABOP_get_status_frames.
-        */
-       sframes = kmalloc(nr_sframes  * sizeof(uint64_t), GFP_ATOMIC);
-       if (!sframes)
-               return -ENOMEM;
-
-       getframes.dom        = DOMID_SELF;
-       getframes.nr_frames  = nr_sframes;
-       set_xen_guest_handle(getframes.frame_list, sframes);
-
-       rc = HYPERVISOR_grant_table_op(GNTTABOP_get_status_frames,
-                                      &getframes, 1);
-       if (rc == -ENOSYS) {
-               kfree(sframes);
-               return -ENOSYS;
-       }
-
-       BUG_ON(rc || getframes.status);
-
-       rc = arch_gnttab_map_status(sframes, nr_sframes,
-                                   nr_status_frames(gnttab_max_grant_frames()),
-                                   &grstatus);
-       BUG_ON(rc);
-       kfree(sframes);
-
-       rc = arch_gnttab_map_shared(frames, nr_gframes,
-                                   gnttab_max_grant_frames(),
-                                   &gnttab_shared.addr);
-       BUG_ON(rc);
-
-       return 0;
-}
-
-static void gnttab_unmap_frames_v2(void)
-{
-       arch_gnttab_unmap(gnttab_shared.addr, nr_grant_frames);
-       arch_gnttab_unmap(grstatus, nr_status_frames(nr_grant_frames));
-}
-
 static int gnttab_map(unsigned int start_idx, unsigned int end_idx)
 {
        struct gnttab_setup_table setup;
@@ -1101,43 +835,13 @@ static struct gnttab_ops gnttab_v1_ops = {
        .query_foreign_access           = gnttab_query_foreign_access_v1,
 };
 
-static struct gnttab_ops gnttab_v2_ops = {
-       .map_frames                     = gnttab_map_frames_v2,
-       .unmap_frames                   = gnttab_unmap_frames_v2,
-       .update_entry                   = gnttab_update_entry_v2,
-       .end_foreign_access_ref         = gnttab_end_foreign_access_ref_v2,
-       .end_foreign_transfer_ref       = gnttab_end_foreign_transfer_ref_v2,
-       .query_foreign_access           = gnttab_query_foreign_access_v2,
-       .update_subpage_entry           = gnttab_update_subpage_entry_v2,
-       .update_trans_entry             = gnttab_update_trans_entry_v2,
-};
-
 static void gnttab_request_version(void)
 {
-       int rc;
-       struct gnttab_set_version gsv;
+       /* Only version 1 is used, which will always be available. */
+       grant_table_version = 1;
+       grefs_per_grant_frame = PAGE_SIZE / sizeof(struct grant_entry_v1);
+       gnttab_interface = &gnttab_v1_ops;
 
-       gsv.version = 1;
-
-       rc = HYPERVISOR_grant_table_op(GNTTABOP_set_version, &gsv, 1);
-       if (rc == 0 && gsv.version == 2) {
-               grant_table_version = 2;
-               grefs_per_grant_frame = PAGE_SIZE / sizeof(union grant_entry_v2);
-               gnttab_interface = &gnttab_v2_ops;
-       } else if (grant_table_version == 2) {
-               /*
-                * If we've already used version 2 features,
-                * but then suddenly discover that they're not
-                * available (e.g. migrating to an older
-                * version of Xen), almost unbounded badness
-                * can happen.
-                */
-               panic("we need grant tables version 2, but only version 1 is available");
-       } else {
-               grant_table_version = 1;
-               grefs_per_grant_frame = PAGE_SIZE / sizeof(struct grant_entry_v1);
-               gnttab_interface = &gnttab_v1_ops;
-       }
        pr_info("Grant tables using version %d layout\n", grant_table_version);
 }
 
@@ -1225,8 +929,7 @@ int gnttab_init(void)
                }
        }
 
-       ret = arch_gnttab_init(max_nr_grant_frames,
-                              nr_status_frames(max_nr_grant_frames));
+       ret = arch_gnttab_init(max_nr_grant_frames);
        if (ret < 0)
                goto ini_nomem;
 
index 4a7e6e0a5f4c602ad280ffe5b258bd5fc44ed5f9..c214daab482910b203b436520d876a618ffcca9b 100644 (file)
@@ -174,6 +174,7 @@ static int xen_pcibk_attach(struct xen_pcibk_device *pdev)
                                 "version mismatch (%s/%s) with pcifront - "
                                 "halting " DRV_NAME,
                                 magic, XEN_PCI_MAGIC);
+               err = -EFAULT;
                goto out;
        }
 
index e41f17ea1f139c1616a27dfe02e32f72cf71bde0..196890735367daf53a796099ca21b153d55b560c 100644 (file)
@@ -152,8 +152,6 @@ int drm_err(const char *func, const char *format, ...);
                                     also include looping detection. */
 
 #define DRM_MAGIC_HASH_ORDER  4  /**< Size of key hash table. Must be power of 2. */
-#define DRM_KERNEL_CONTEXT    0         /**< Change drm_resctx if changed */
-#define DRM_RESERVED_CONTEXTS 1         /**< Change drm_resctx if changed */
 
 #define DRM_MAP_HASH_OFFSET 0x10000000
 
@@ -347,18 +345,6 @@ struct drm_waitlist {
        spinlock_t write_lock;
 };
 
-struct drm_freelist {
-       int initialized;               /**< Freelist in use */
-       atomic_t count;                /**< Number of free buffers */
-       struct drm_buf *next;          /**< End pointer */
-
-       wait_queue_head_t waiting;     /**< Processes waiting on free bufs */
-       int low_mark;                  /**< Low water mark */
-       int high_mark;                 /**< High water mark */
-       atomic_t wfh;                  /**< If waiting for high mark */
-       spinlock_t lock;
-};
-
 typedef struct drm_dma_handle {
        dma_addr_t busaddr;
        void *vaddr;
@@ -376,7 +362,8 @@ struct drm_buf_entry {
        int page_order;
        struct drm_dma_handle **seglist;
 
-       struct drm_freelist freelist;
+       int low_mark;                   /**< Low water mark */
+       int high_mark;                  /**< High water mark */
 };
 
 /* Event queued up for userspace to read */
@@ -397,7 +384,6 @@ struct drm_prime_file_private {
 
 /** File private data */
 struct drm_file {
-       unsigned always_authenticated :1;
        unsigned authenticated :1;
        /* Whether we're master for a minor. Protected by master_mutex */
        unsigned is_master :1;
@@ -442,23 +428,6 @@ struct drm_file {
        struct drm_prime_file_private prime;
 };
 
-/** Wait queue */
-struct drm_queue {
-       atomic_t use_count;             /**< Outstanding uses (+1) */
-       atomic_t finalization;          /**< Finalization in progress */
-       atomic_t block_count;           /**< Count of processes waiting */
-       atomic_t block_read;            /**< Queue blocked for reads */
-       wait_queue_head_t read_queue;   /**< Processes waiting on block_read */
-       atomic_t block_write;           /**< Queue blocked for writes */
-       wait_queue_head_t write_queue;  /**< Processes waiting on block_write */
-       atomic_t total_queued;          /**< Total queued statistic */
-       atomic_t total_flushed;         /**< Total flushes statistic */
-       atomic_t total_locks;           /**< Total locks statistics */
-       enum drm_ctx_flags flags;       /**< Context preserving and 2D-only */
-       struct drm_waitlist waitlist;   /**< Pending buffers */
-       wait_queue_head_t flush_queue;  /**< Processes waiting until flush */
-};
-
 /**
  * Lock data.
  */
@@ -567,15 +536,6 @@ struct drm_map_list {
        struct drm_master *master;
 };
 
-/**
- * Context handle list
- */
-struct drm_ctx_list {
-       struct list_head head;          /**< list head */
-       drm_context_t handle;           /**< context handle */
-       struct drm_file *tag;           /**< associated fd private data */
-};
-
 /* location of GART table */
 #define DRM_ATI_GART_MAIN 1
 #define DRM_ATI_GART_FB   2
@@ -1218,7 +1178,6 @@ extern bool drm_ioctl_flags(unsigned int nr, unsigned int *flags);
                                /* Device support (drm_fops.h) */
 extern struct mutex drm_global_mutex;
 extern int drm_open(struct inode *inode, struct file *filp);
-extern int drm_stub_open(struct inode *inode, struct file *filp);
 extern ssize_t drm_read(struct file *filp, char __user *buffer,
                        size_t count, loff_t *offset);
 extern int drm_release(struct inode *inode, struct file *filp);
@@ -1256,29 +1215,6 @@ extern int drm_setversion(struct drm_device *dev, void *data,
 extern int drm_noop(struct drm_device *dev, void *data,
                    struct drm_file *file_priv);
 
-                               /* Context IOCTL support (drm_context.h) */
-extern int drm_resctx(struct drm_device *dev, void *data,
-                     struct drm_file *file_priv);
-extern int drm_addctx(struct drm_device *dev, void *data,
-                     struct drm_file *file_priv);
-extern int drm_getctx(struct drm_device *dev, void *data,
-                     struct drm_file *file_priv);
-extern int drm_switchctx(struct drm_device *dev, void *data,
-                        struct drm_file *file_priv);
-extern int drm_newctx(struct drm_device *dev, void *data,
-                     struct drm_file *file_priv);
-extern int drm_rmctx(struct drm_device *dev, void *data,
-                    struct drm_file *file_priv);
-
-extern int drm_ctxbitmap_init(struct drm_device *dev);
-extern void drm_ctxbitmap_cleanup(struct drm_device *dev);
-extern void drm_ctxbitmap_free(struct drm_device *dev, int ctx_handle);
-
-extern int drm_setsareactx(struct drm_device *dev, void *data,
-                          struct drm_file *file_priv);
-extern int drm_getsareactx(struct drm_device *dev, void *data,
-                          struct drm_file *file_priv);
-
                                /* Authentication IOCTL support (drm_auth.h) */
 extern int drm_getmagic(struct drm_device *dev, void *data,
                        struct drm_file *file_priv);
@@ -1398,17 +1334,12 @@ extern void drm_master_put(struct drm_master **master);
 extern void drm_put_dev(struct drm_device *dev);
 extern void drm_unplug_dev(struct drm_device *dev);
 extern unsigned int drm_debug;
-extern unsigned int drm_rnodes;
-extern unsigned int drm_universal_planes;
 
 extern unsigned int drm_vblank_offdelay;
 extern unsigned int drm_timestamp_precision;
 extern unsigned int drm_timestamp_monotonic;
 
 extern struct class *drm_class;
-extern struct dentry *drm_debugfs_root;
-
-extern struct idr drm_minors_idr;
 
 extern struct drm_local_map *drm_getsarea(struct drm_device *dev);
 
@@ -1422,6 +1353,8 @@ extern int drm_debugfs_create_files(const struct drm_info_list *files,
 extern int drm_debugfs_remove_files(const struct drm_info_list *files,
                                    int count, struct drm_minor *minor);
 extern int drm_debugfs_cleanup(struct drm_minor *minor);
+extern int drm_debugfs_connector_add(struct drm_connector *connector);
+extern void drm_debugfs_connector_remove(struct drm_connector *connector);
 #else
 static inline int drm_debugfs_init(struct drm_minor *minor, int minor_id,
                                   struct dentry *root)
@@ -1446,6 +1379,15 @@ static inline int drm_debugfs_cleanup(struct drm_minor *minor)
 {
        return 0;
 }
+
+static inline int drm_debugfs_connector_add(struct drm_connector *connector)
+{
+       return 0;
+}
+static inline void drm_debugfs_connector_remove(struct drm_connector *connector)
+{
+}
+
 #endif
 
                                /* Info file support */
@@ -1515,9 +1457,8 @@ extern int drm_pci_set_unique(struct drm_device *dev,
 struct drm_sysfs_class;
 extern struct class *drm_sysfs_create(struct module *owner, char *name);
 extern void drm_sysfs_destroy(void);
-extern int drm_sysfs_device_add(struct drm_minor *minor);
+extern struct device *drm_sysfs_minor_alloc(struct drm_minor *minor);
 extern void drm_sysfs_hotplug_event(struct drm_device *dev);
-extern void drm_sysfs_device_remove(struct drm_minor *minor);
 extern int drm_sysfs_connector_add(struct drm_connector *connector);
 extern void drm_sysfs_connector_remove(struct drm_connector *connector);
 
@@ -1577,7 +1518,7 @@ void drm_gem_free_mmap_offset(struct drm_gem_object *obj);
 int drm_gem_create_mmap_offset(struct drm_gem_object *obj);
 int drm_gem_create_mmap_offset_size(struct drm_gem_object *obj, size_t size);
 
-struct page **drm_gem_get_pages(struct drm_gem_object *obj, gfp_t gfpmask);
+struct page **drm_gem_get_pages(struct drm_gem_object *obj);
 void drm_gem_put_pages(struct drm_gem_object *obj, struct page **pages,
                bool dirty, bool accessed);
 
index 251b75e6bf7a173243a9623d8a013e8606c6ae62..f1105d0da0598c391a6486531a67188da878c111 100644 (file)
@@ -41,6 +41,7 @@ struct drm_framebuffer;
 struct drm_object_properties;
 struct drm_file;
 struct drm_clip_rect;
+struct device_node;
 
 #define DRM_MODE_OBJECT_CRTC 0xcccccccc
 #define DRM_MODE_OBJECT_CONNECTOR 0xc0c0c0c0
@@ -75,6 +76,14 @@ static inline uint64_t I642U64(int64_t val)
        return (uint64_t)*((uint64_t *)&val);
 }
 
+/* rotation property bits */
+#define DRM_ROTATE_0   0
+#define DRM_ROTATE_90  1
+#define DRM_ROTATE_180 2
+#define DRM_ROTATE_270 3
+#define DRM_REFLECT_X  4
+#define DRM_REFLECT_Y  5
+
 enum drm_connector_force {
        DRM_FORCE_UNSPECIFIED,
        DRM_FORCE_OFF,
@@ -314,6 +323,7 @@ struct drm_crtc_funcs {
  */
 struct drm_crtc {
        struct drm_device *dev;
+       struct device_node *port;
        struct list_head head;
 
        /**
@@ -331,6 +341,10 @@ struct drm_crtc {
        struct drm_plane *primary;
        struct drm_plane *cursor;
 
+       /* position of cursor plane on crtc */
+       int cursor_x;
+       int cursor_y;
+
        /* Temporary tracking of the old fb while a modeset is ongoing. Used
         * by drm_mode_set_config_internal to implement correct refcounting. */
        struct drm_framebuffer *old_fb;
@@ -524,6 +538,8 @@ struct drm_connector {
        struct drm_property_blob *edid_blob_ptr;
        struct drm_object_properties properties;
 
+       struct drm_property_blob *path_blob_ptr;
+
        uint8_t polled; /* DRM_CONNECTOR_POLL_* */
 
        /* requested DPMS state */
@@ -533,6 +549,7 @@ struct drm_connector {
 
        /* forced on connector */
        enum drm_connector_force force;
+       bool override_edid;
        uint32_t encoder_ids[DRM_CONNECTOR_MAX_ENCODER];
        struct drm_encoder *encoder; /* currently active encoder */
 
@@ -545,6 +562,8 @@ struct drm_connector {
        int audio_latency[2];
        int null_edid_counter; /* needed to workaround some HW bugs where we get all 0s */
        unsigned bad_edid_counter;
+
+       struct dentry *debugfs_entry;
 };
 
 /**
@@ -800,6 +819,7 @@ struct drm_mode_config {
        struct list_head property_blob_list;
        struct drm_property *edid_property;
        struct drm_property *dpms_property;
+       struct drm_property *path_property;
        struct drm_property *plane_type_property;
 
        /* DVI-I properties */
@@ -823,6 +843,7 @@ struct drm_mode_config {
 
        /* Optional properties */
        struct drm_property *scaling_mode_property;
+       struct drm_property *aspect_ratio_property;
        struct drm_property *dirty_info_property;
 
        /* dumb ioctl parameters */
@@ -852,7 +873,7 @@ struct drm_prop_enum_list {
 extern int drm_crtc_init_with_planes(struct drm_device *dev,
                                     struct drm_crtc *crtc,
                                     struct drm_plane *primary,
-                                    void *cursor,
+                                    struct drm_plane *cursor,
                                     const struct drm_crtc_funcs *funcs);
 extern int drm_crtc_init(struct drm_device *dev,
                         struct drm_crtc *crtc,
@@ -878,6 +899,8 @@ extern int drm_connector_init(struct drm_device *dev,
                              struct drm_connector *connector,
                              const struct drm_connector_funcs *funcs,
                              int connector_type);
+int drm_connector_register(struct drm_connector *connector);
+void drm_connector_unregister(struct drm_connector *connector);
 
 extern void drm_connector_cleanup(struct drm_connector *connector);
 /* helper to unplug all connectors from sysfs for device */
@@ -937,6 +960,7 @@ extern const char *drm_get_tv_select_name(int val);
 extern void drm_fb_release(struct drm_file *file_priv);
 extern int drm_mode_group_init_legacy_group(struct drm_device *dev, struct drm_mode_group *group);
 extern void drm_mode_group_destroy(struct drm_mode_group *group);
+extern void drm_reinit_primary_mode_group(struct drm_device *dev);
 extern bool drm_probe_ddc(struct i2c_adapter *adapter);
 extern struct edid *drm_get_edid(struct drm_connector *connector,
                                 struct i2c_adapter *adapter);
@@ -946,6 +970,8 @@ extern void drm_mode_config_init(struct drm_device *dev);
 extern void drm_mode_config_reset(struct drm_device *dev);
 extern void drm_mode_config_cleanup(struct drm_device *dev);
 
+extern int drm_mode_connector_set_path_property(struct drm_connector *connector,
+                                               char *path);
 extern int drm_mode_connector_update_edid_property(struct drm_connector *connector,
                                                struct edid *edid);
 
@@ -994,7 +1020,8 @@ extern struct drm_property *drm_property_create_enum(struct drm_device *dev, int
 struct drm_property *drm_property_create_bitmask(struct drm_device *dev,
                                         int flags, const char *name,
                                         const struct drm_prop_enum_list *props,
-                                        int num_values);
+                                        int num_props,
+                                        uint64_t supported_bits);
 struct drm_property *drm_property_create_range(struct drm_device *dev, int flags,
                                         const char *name,
                                         uint64_t min, uint64_t max);
@@ -1010,6 +1037,7 @@ extern int drm_mode_create_dvi_i_properties(struct drm_device *dev);
 extern int drm_mode_create_tv_properties(struct drm_device *dev, int num_formats,
                                     char *formats[]);
 extern int drm_mode_create_scaling_mode_property(struct drm_device *dev);
+extern int drm_mode_create_aspect_ratio_property(struct drm_device *dev);
 extern int drm_mode_create_dirty_info_property(struct drm_device *dev);
 
 extern int drm_mode_connector_attach_encoder(struct drm_connector *connector,
@@ -1100,6 +1128,10 @@ extern int drm_format_plane_cpp(uint32_t format, int plane);
 extern int drm_format_horz_chroma_subsampling(uint32_t format);
 extern int drm_format_vert_chroma_subsampling(uint32_t format);
 extern const char *drm_get_format_name(uint32_t format);
+extern struct drm_property *drm_mode_create_rotation_property(struct drm_device *dev,
+                                                             unsigned int supported_rotations);
+extern unsigned int drm_rotation_simplify(unsigned int rotation,
+                                         unsigned int supported_rotations);
 
 /* Helpers */
 
diff --git a/include/drm/drm_dp_mst_helper.h b/include/drm/drm_dp_mst_helper.h
new file mode 100644 (file)
index 0000000..9b446ad
--- /dev/null
@@ -0,0 +1,509 @@
+/*
+ * Copyright © 2014 Red Hat.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  The copyright holders make no representations
+ * about the suitability of this software for any purpose.  It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+#ifndef _DRM_DP_MST_HELPER_H_
+#define _DRM_DP_MST_HELPER_H_
+
+#include <linux/types.h>
+#include <drm/drm_dp_helper.h>
+
+struct drm_dp_mst_branch;
+
+/**
+ * struct drm_dp_vcpi - Virtual Channel Payload Identifer
+ * @vcpi: Virtual channel ID.
+ * @pbn: Payload Bandwidth Number for this channel
+ * @aligned_pbn: PBN aligned with slot size
+ * @num_slots: number of slots for this PBN
+ */
+struct drm_dp_vcpi {
+       int vcpi;
+       int pbn;
+       int aligned_pbn;
+       int num_slots;
+};
+
+/**
+ * struct drm_dp_mst_port - MST port
+ * @kref: reference count for this port.
+ * @guid_valid: for DP 1.2 devices if we have validated the GUID.
+ * @guid: guid for DP 1.2 device on this port.
+ * @port_num: port number
+ * @input: if this port is an input port.
+ * @mcs: message capability status - DP 1.2 spec.
+ * @ddps: DisplayPort Device Plug Status - DP 1.2
+ * @pdt: Peer Device Type
+ * @ldps: Legacy Device Plug Status
+ * @dpcd_rev: DPCD revision of device on this port
+ * @num_sdp_streams: Number of simultaneous streams
+ * @num_sdp_stream_sinks: Number of stream sinks
+ * @available_pbn: Available bandwidth for this port.
+ * @next: link to next port on this branch device
+ * @mstb: branch device attach below this port
+ * @aux: i2c aux transport to talk to device connected to this port.
+ * @parent: branch device parent of this port
+ * @vcpi: Virtual Channel Payload info for this port.
+ * @connector: DRM connector this port is connected to.
+ * @mgr: topology manager this port lives under.
+ *
+ * This structure represents an MST port endpoint on a device somewhere
+ * in the MST topology.
+ */
+struct drm_dp_mst_port {
+       struct kref kref;
+
+       /* if dpcd 1.2 device is on this port - its GUID info */
+       bool guid_valid;
+       u8 guid[16];
+
+       u8 port_num;
+       bool input;
+       bool mcs;
+       bool ddps;
+       u8 pdt;
+       bool ldps;
+       u8 dpcd_rev;
+       u8 num_sdp_streams;
+       u8 num_sdp_stream_sinks;
+       uint16_t available_pbn;
+       struct list_head next;
+       struct drm_dp_mst_branch *mstb; /* pointer to an mstb if this port has one */
+       struct drm_dp_aux aux; /* i2c bus for this port? */
+       struct drm_dp_mst_branch *parent;
+
+       struct drm_dp_vcpi vcpi;
+       struct drm_connector *connector;
+       struct drm_dp_mst_topology_mgr *mgr;
+};
+
+/**
+ * struct drm_dp_mst_branch - MST branch device.
+ * @kref: reference count for this port.
+ * @rad: Relative Address to talk to this branch device.
+ * @lct: Link count total to talk to this branch device.
+ * @num_ports: number of ports on the branch.
+ * @msg_slots: one bit per transmitted msg slot.
+ * @ports: linked list of ports on this branch.
+ * @port_parent: pointer to the port parent, NULL if toplevel.
+ * @mgr: topology manager for this branch device.
+ * @tx_slots: transmission slots for this device.
+ * @last_seqno: last sequence number used to talk to this.
+ * @link_address_sent: if a link address message has been sent to this device yet.
+ *
+ * This structure represents an MST branch device, there is one
+ * primary branch device at the root, along with any others connected
+ * to downstream ports
+ */
+struct drm_dp_mst_branch {
+       struct kref kref;
+       u8 rad[8];
+       u8 lct;
+       int num_ports;
+
+       int msg_slots;
+       struct list_head ports;
+
+       /* list of tx ops queue for this port */
+       struct drm_dp_mst_port *port_parent;
+       struct drm_dp_mst_topology_mgr *mgr;
+
+       /* slots are protected by mstb->mgr->qlock */
+       struct drm_dp_sideband_msg_tx *tx_slots[2];
+       int last_seqno;
+       bool link_address_sent;
+};
+
+
+/* sideband msg header - not bit struct */
+struct drm_dp_sideband_msg_hdr {
+       u8 lct;
+       u8 lcr;
+       u8 rad[8];
+       bool broadcast;
+       bool path_msg;
+       u8 msg_len;
+       bool somt;
+       bool eomt;
+       bool seqno;
+};
+
+struct drm_dp_nak_reply {
+       u8 guid[16];
+       u8 reason;
+       u8 nak_data;
+};
+
+struct drm_dp_link_address_ack_reply {
+       u8 guid[16];
+       u8 nports;
+       struct drm_dp_link_addr_reply_port {
+               bool input_port;
+               u8 peer_device_type;
+               u8 port_number;
+               bool mcs;
+               bool ddps;
+               bool legacy_device_plug_status;
+               u8 dpcd_revision;
+               u8 peer_guid[16];
+               u8 num_sdp_streams;
+               u8 num_sdp_stream_sinks;
+       } ports[16];
+};
+
+struct drm_dp_remote_dpcd_read_ack_reply {
+       u8 port_number;
+       u8 num_bytes;
+       u8 bytes[255];
+};
+
+struct drm_dp_remote_dpcd_write_ack_reply {
+       u8 port_number;
+};
+
+struct drm_dp_remote_dpcd_write_nak_reply {
+       u8 port_number;
+       u8 reason;
+       u8 bytes_written_before_failure;
+};
+
+struct drm_dp_remote_i2c_read_ack_reply {
+       u8 port_number;
+       u8 num_bytes;
+       u8 bytes[255];
+};
+
+struct drm_dp_remote_i2c_read_nak_reply {
+       u8 port_number;
+       u8 nak_reason;
+       u8 i2c_nak_transaction;
+};
+
+struct drm_dp_remote_i2c_write_ack_reply {
+       u8 port_number;
+};
+
+
+struct drm_dp_sideband_msg_rx {
+       u8 chunk[48];
+       u8 msg[256];
+       u8 curchunk_len;
+       u8 curchunk_idx; /* chunk we are parsing now */
+       u8 curchunk_hdrlen;
+       u8 curlen; /* total length of the msg */
+       bool have_somt;
+       bool have_eomt;
+       struct drm_dp_sideband_msg_hdr initial_hdr;
+};
+
+
+struct drm_dp_allocate_payload {
+       u8 port_number;
+       u8 number_sdp_streams;
+       u8 vcpi;
+       u16 pbn;
+       u8 sdp_stream_sink[8];
+};
+
+struct drm_dp_allocate_payload_ack_reply {
+       u8 port_number;
+       u8 vcpi;
+       u16 allocated_pbn;
+};
+
+struct drm_dp_connection_status_notify {
+       u8 guid[16];
+       u8 port_number;
+       bool legacy_device_plug_status;
+       bool displayport_device_plug_status;
+       bool message_capability_status;
+       bool input_port;
+       u8 peer_device_type;
+};
+
+struct drm_dp_remote_dpcd_read {
+       u8 port_number;
+       u32 dpcd_address;
+       u8 num_bytes;
+};
+
+struct drm_dp_remote_dpcd_write {
+       u8 port_number;
+       u32 dpcd_address;
+       u8 num_bytes;
+       u8 *bytes;
+};
+
+struct drm_dp_remote_i2c_read {
+       u8 num_transactions;
+       u8 port_number;
+       struct {
+               u8 i2c_dev_id;
+               u8 num_bytes;
+               u8 *bytes;
+               u8 no_stop_bit;
+               u8 i2c_transaction_delay;
+       } transactions[4];
+       u8 read_i2c_device_id;
+       u8 num_bytes_read;
+};
+
+struct drm_dp_remote_i2c_write {
+       u8 port_number;
+       u8 write_i2c_device_id;
+       u8 num_bytes;
+       u8 *bytes;
+};
+
+/* this covers ENUM_RESOURCES, POWER_DOWN_PHY, POWER_UP_PHY */
+struct drm_dp_port_number_req {
+       u8 port_number;
+};
+
+struct drm_dp_enum_path_resources_ack_reply {
+       u8 port_number;
+       u16 full_payload_bw_number;
+       u16 avail_payload_bw_number;
+};
+
+/* covers POWER_DOWN_PHY, POWER_UP_PHY */
+struct drm_dp_port_number_rep {
+       u8 port_number;
+};
+
+struct drm_dp_query_payload {
+       u8 port_number;
+       u8 vcpi;
+};
+
+struct drm_dp_resource_status_notify {
+       u8 port_number;
+       u8 guid[16];
+       u16 available_pbn;
+};
+
+struct drm_dp_query_payload_ack_reply {
+       u8 port_number;
+       u8 allocated_pbn;
+};
+
+struct drm_dp_sideband_msg_req_body {
+       u8 req_type;
+       union ack_req {
+               struct drm_dp_connection_status_notify conn_stat;
+               struct drm_dp_port_number_req port_num;
+               struct drm_dp_resource_status_notify resource_stat;
+
+               struct drm_dp_query_payload query_payload;
+               struct drm_dp_allocate_payload allocate_payload;
+
+               struct drm_dp_remote_dpcd_read dpcd_read;
+               struct drm_dp_remote_dpcd_write dpcd_write;
+
+               struct drm_dp_remote_i2c_read i2c_read;
+               struct drm_dp_remote_i2c_write i2c_write;
+       } u;
+};
+
+struct drm_dp_sideband_msg_reply_body {
+       u8 reply_type;
+       u8 req_type;
+       union ack_replies {
+               struct drm_dp_nak_reply nak;
+               struct drm_dp_link_address_ack_reply link_addr;
+               struct drm_dp_port_number_rep port_number;
+
+               struct drm_dp_enum_path_resources_ack_reply path_resources;
+               struct drm_dp_allocate_payload_ack_reply allocate_payload;
+               struct drm_dp_query_payload_ack_reply query_payload;
+
+               struct drm_dp_remote_dpcd_read_ack_reply remote_dpcd_read_ack;
+               struct drm_dp_remote_dpcd_write_ack_reply remote_dpcd_write_ack;
+               struct drm_dp_remote_dpcd_write_nak_reply remote_dpcd_write_nack;
+
+               struct drm_dp_remote_i2c_read_ack_reply remote_i2c_read_ack;
+               struct drm_dp_remote_i2c_read_nak_reply remote_i2c_read_nack;
+               struct drm_dp_remote_i2c_write_ack_reply remote_i2c_write_ack;
+       } u;
+};
+
+/* msg is queued to be put into a slot */
+#define DRM_DP_SIDEBAND_TX_QUEUED 0
+/* msg has started transmitting on a slot - still on msgq */
+#define DRM_DP_SIDEBAND_TX_START_SEND 1
+/* msg has finished transmitting on a slot - removed from msgq only in slot */
+#define DRM_DP_SIDEBAND_TX_SENT 2
+/* msg has received a response - removed from slot */
+#define DRM_DP_SIDEBAND_TX_RX 3
+#define DRM_DP_SIDEBAND_TX_TIMEOUT 4
+
+struct drm_dp_sideband_msg_tx {
+       u8 msg[256];
+       u8 chunk[48];
+       u8 cur_offset;
+       u8 cur_len;
+       struct drm_dp_mst_branch *dst;
+       struct list_head next;
+       int seqno;
+       int state;
+       bool path_msg;
+       struct drm_dp_sideband_msg_reply_body reply;
+};
+
+/* sideband msg handler */
+struct drm_dp_mst_topology_mgr;
+struct drm_dp_mst_topology_cbs {
+       /* create a connector for a port */
+       struct drm_connector *(*add_connector)(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port, char *path);
+       void (*destroy_connector)(struct drm_dp_mst_topology_mgr *mgr,
+                                 struct drm_connector *connector);
+       void (*hotplug)(struct drm_dp_mst_topology_mgr *mgr);
+
+};
+
+#define DP_MAX_PAYLOAD (sizeof(unsigned long) * 8)
+
+#define DP_PAYLOAD_LOCAL 1
+#define DP_PAYLOAD_REMOTE 2
+#define DP_PAYLOAD_DELETE_LOCAL 3
+
+struct drm_dp_payload {
+       int payload_state;
+       int start_slot;
+       int num_slots;
+};
+
+/**
+ * struct drm_dp_mst_topology_mgr - DisplayPort MST manager
+ * @dev: device pointer for adding i2c devices etc.
+ * @cbs: callbacks for connector addition and destruction.
+ * @max_dpcd_transaction_bytes - maximum number of bytes to read/write in one go.
+ * @aux: aux channel for the DP connector.
+ * @max_payloads: maximum number of payloads the GPU can generate.
+ * @conn_base_id: DRM connector ID this mgr is connected to.
+ * @down_rep_recv: msg receiver state for down replies.
+ * @up_req_recv: msg receiver state for up requests.
+ * @lock: protects mst state, primary, guid, dpcd.
+ * @mst_state: if this manager is enabled for an MST capable port.
+ * @mst_primary: pointer to the primary branch device.
+ * @guid_valid: GUID valid for the primary branch device.
+ * @guid: GUID for primary port.
+ * @dpcd: cache of DPCD for primary port.
+ * @pbn_div: PBN to slots divisor.
+ *
+ * This struct represents the toplevel displayport MST topology manager.
+ * There should be one instance of this for every MST capable DP connector
+ * on the GPU.
+ */
+struct drm_dp_mst_topology_mgr {
+
+       struct device *dev;
+       struct drm_dp_mst_topology_cbs *cbs;
+       int max_dpcd_transaction_bytes;
+       struct drm_dp_aux *aux; /* auxch for this topology mgr to use */
+       int max_payloads;
+       int conn_base_id;
+
+       /* only ever accessed from the workqueue - which should be serialised */
+       struct drm_dp_sideband_msg_rx down_rep_recv;
+       struct drm_dp_sideband_msg_rx up_req_recv;
+
+       /* pointer to info about the initial MST device */
+       struct mutex lock; /* protects mst_state + primary + guid + dpcd */
+
+       bool mst_state;
+       struct drm_dp_mst_branch *mst_primary;
+       /* primary MST device GUID */
+       bool guid_valid;
+       u8 guid[16];
+       u8 dpcd[DP_RECEIVER_CAP_SIZE];
+       u8 sink_count;
+       int pbn_div;
+       int total_slots;
+       int avail_slots;
+       int total_pbn;
+
+       /* messages to be transmitted */
+       /* qlock protects the upq/downq and in_progress,
+          the mstb tx_slots and txmsg->state once they are queued */
+       struct mutex qlock;
+       struct list_head tx_msg_downq;
+       struct list_head tx_msg_upq;
+       bool tx_down_in_progress;
+       bool tx_up_in_progress;
+
+       /* payload info + lock for it */
+       struct mutex payload_lock;
+       struct drm_dp_vcpi **proposed_vcpis;
+       struct drm_dp_payload *payloads;
+       unsigned long payload_mask;
+
+       wait_queue_head_t tx_waitq;
+       struct work_struct work;
+
+       struct work_struct tx_work;
+};
+
+int drm_dp_mst_topology_mgr_init(struct drm_dp_mst_topology_mgr *mgr, struct device *dev, struct drm_dp_aux *aux, int max_dpcd_transaction_bytes, int max_payloads, int conn_base_id);
+
+void drm_dp_mst_topology_mgr_destroy(struct drm_dp_mst_topology_mgr *mgr);
+
+
+int drm_dp_mst_topology_mgr_set_mst(struct drm_dp_mst_topology_mgr *mgr, bool mst_state);
+
+
+int drm_dp_mst_hpd_irq(struct drm_dp_mst_topology_mgr *mgr, u8 *esi, bool *handled);
+
+
+enum drm_connector_status drm_dp_mst_detect_port(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port);
+
+struct edid *drm_dp_mst_get_edid(struct drm_connector *connector, struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port);
+
+
+int drm_dp_calc_pbn_mode(int clock, int bpp);
+
+
+bool drm_dp_mst_allocate_vcpi(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port, int pbn, int *slots);
+
+
+void drm_dp_mst_reset_vcpi_slots(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port);
+
+
+void drm_dp_mst_deallocate_vcpi(struct drm_dp_mst_topology_mgr *mgr,
+                               struct drm_dp_mst_port *port);
+
+
+int drm_dp_find_vcpi_slots(struct drm_dp_mst_topology_mgr *mgr,
+                          int pbn);
+
+
+int drm_dp_update_payload_part1(struct drm_dp_mst_topology_mgr *mgr);
+
+
+int drm_dp_update_payload_part2(struct drm_dp_mst_topology_mgr *mgr);
+
+int drm_dp_check_act_status(struct drm_dp_mst_topology_mgr *mgr);
+
+void drm_dp_mst_dump_topology(struct seq_file *m,
+                             struct drm_dp_mst_topology_mgr *mgr);
+
+void drm_dp_mst_topology_mgr_suspend(struct drm_dp_mst_topology_mgr *mgr);
+int drm_dp_mst_topology_mgr_resume(struct drm_dp_mst_topology_mgr *mgr);
+#endif
index 7997246d4039fdfc9cf0dd183484187f04624c15..bfd329d613c4541fe1bb311e5e435dbac5c3da1a 100644 (file)
@@ -86,8 +86,9 @@ struct drm_fb_helper {
        int crtc_count;
        struct drm_fb_helper_crtc *crtc_info;
        int connector_count;
+       int connector_info_alloc_count;
        struct drm_fb_helper_connector **connector_info;
-       struct drm_fb_helper_funcs *funcs;
+       const struct drm_fb_helper_funcs *funcs;
        struct fb_info *fbdev;
        u32 pseudo_palette[17];
        struct list_head kernel_fb_list;
@@ -97,6 +98,8 @@ struct drm_fb_helper {
        bool delayed_hotplug;
 };
 
+void drm_fb_helper_prepare(struct drm_device *dev, struct drm_fb_helper *helper,
+                          const struct drm_fb_helper_funcs *funcs);
 int drm_fb_helper_init(struct drm_device *dev,
                       struct drm_fb_helper *helper, int crtc_count,
                       int max_conn);
@@ -128,4 +131,7 @@ struct drm_display_mode *
 drm_pick_cmdline_mode(struct drm_fb_helper_connector *fb_helper_conn,
                      int width, int height);
 
+int drm_fb_helper_add_one_connector(struct drm_fb_helper *fb_helper, struct drm_connector *connector);
+int drm_fb_helper_remove_one_connector(struct drm_fb_helper *fb_helper,
+                                      struct drm_connector *connector);
 #endif
index 944f33f8ba38d2072b2762306a9de0ae49c74ef2..2bb55b8b90318c65eef80e2d511495e5731ae4e4 100644 (file)
@@ -94,6 +94,8 @@ void mipi_dsi_host_unregister(struct mipi_dsi_host *host);
 #define MIPI_DSI_MODE_VSYNC_FLUSH      BIT(8)
 /* disable EoT packets in HS mode */
 #define MIPI_DSI_MODE_EOT_PACKET       BIT(9)
+/* device supports non-continuous clock behavior (DSI spec 5.6.1) */
+#define MIPI_DSI_CLOCK_NON_CONTINUOUS  BIT(10)
 
 enum mipi_dsi_pixel_format {
        MIPI_DSI_FMT_RGB888,
@@ -121,14 +123,17 @@ struct mipi_dsi_device {
        unsigned long mode_flags;
 };
 
-#define to_mipi_dsi_device(d) container_of(d, struct mipi_dsi_device, dev)
+static inline struct mipi_dsi_device *to_mipi_dsi_device(struct device *dev)
+{
+       return container_of(dev, struct mipi_dsi_device, dev);
+}
 
 int mipi_dsi_attach(struct mipi_dsi_device *dsi);
 int mipi_dsi_detach(struct mipi_dsi_device *dsi);
-int mipi_dsi_dcs_write(struct mipi_dsi_device *dsi, unsigned int channel,
-                      const void *data, size_t len);
-ssize_t mipi_dsi_dcs_read(struct mipi_dsi_device *dsi, unsigned int channel,
-                         u8 cmd, void *data, size_t len);
+ssize_t mipi_dsi_dcs_write(struct mipi_dsi_device *dsi, const void *data,
+                           size_t len);
+ssize_t mipi_dsi_dcs_read(struct mipi_dsi_device *dsi, u8 cmd, void *data,
+                         size_t len);
 
 /**
  * struct mipi_dsi_driver - DSI driver
@@ -144,7 +149,11 @@ struct mipi_dsi_driver {
        void (*shutdown)(struct mipi_dsi_device *dsi);
 };
 
-#define to_mipi_dsi_driver(d) container_of(d, struct mipi_dsi_driver, driver)
+static inline struct mipi_dsi_driver *
+to_mipi_dsi_driver(struct device_driver *driver)
+{
+       return container_of(driver, struct mipi_dsi_driver, driver);
+}
 
 static inline void *mipi_dsi_get_drvdata(const struct mipi_dsi_device *dsi)
 {
diff --git a/include/drm/drm_of.h b/include/drm/drm_of.h
new file mode 100644 (file)
index 0000000..2441f71
--- /dev/null
@@ -0,0 +1,18 @@
+#ifndef __DRM_OF_H__
+#define __DRM_OF_H__
+
+struct drm_device;
+struct device_node;
+
+#ifdef CONFIG_OF
+extern uint32_t drm_of_find_possible_crtcs(struct drm_device *dev,
+                                          struct device_node *port);
+#else
+static inline uint32_t drm_of_find_possible_crtcs(struct drm_device *dev,
+                                                 struct device_node *port)
+{
+       return 0;
+}
+#endif
+
+#endif /* __DRM_OF_H__ */
index c2ab77add67cd6dfdc7e5d54256225b213342bb8..1fbcc96063a7ff7ed72f3be91a3cb47f0d6142dd 100644 (file)
@@ -30,8 +30,42 @@ struct drm_connector;
 struct drm_device;
 struct drm_panel;
 
+/**
+ * struct drm_panel_funcs - perform operations on a given panel
+ * @disable: disable panel (turn off back light, etc.)
+ * @unprepare: turn off panel
+ * @prepare: turn on panel and perform set up
+ * @enable: enable panel (turn on back light, etc.)
+ * @get_modes: add modes to the connector that the panel is attached to and
+ * return the number of modes added
+ *
+ * The .prepare() function is typically called before the display controller
+ * starts to transmit video data. Panel drivers can use this to turn the panel
+ * on and wait for it to become ready. If additional configuration is required
+ * (via a control bus such as I2C, SPI or DSI for example) this is a good time
+ * to do that.
+ *
+ * After the display controller has started transmitting video data, it's safe
+ * to call the .enable() function. This will typically enable the backlight to
+ * make the image on screen visible. Some panels require a certain amount of
+ * time or frames before the image is displayed. This function is responsible
+ * for taking this into account before enabling the backlight to avoid visual
+ * glitches.
+ *
+ * Before stopping video transmission from the display controller it can be
+ * necessary to turn off the panel to avoid visual glitches. This is done in
+ * the .disable() function. Analogously to .enable() this typically involves
+ * turning off the backlight and waiting for some time to make sure no image
+ * is visible on the panel. It is then safe for the display controller to
+ * cease transmission of video data.
+ *
+ * To save power when no video data is transmitted, a driver can power down
+ * the panel. This is the job of the .unprepare() function.
+ */
 struct drm_panel_funcs {
        int (*disable)(struct drm_panel *panel);
+       int (*unprepare)(struct drm_panel *panel);
+       int (*prepare)(struct drm_panel *panel);
        int (*enable)(struct drm_panel *panel);
        int (*get_modes)(struct drm_panel *panel);
 };
@@ -46,6 +80,14 @@ struct drm_panel {
        struct list_head list;
 };
 
+static inline int drm_panel_unprepare(struct drm_panel *panel)
+{
+       if (panel && panel->funcs && panel->funcs->unprepare)
+               return panel->funcs->unprepare(panel);
+
+       return panel ? -ENOSYS : -EINVAL;
+}
+
 static inline int drm_panel_disable(struct drm_panel *panel)
 {
        if (panel && panel->funcs && panel->funcs->disable)
@@ -54,6 +96,14 @@ static inline int drm_panel_disable(struct drm_panel *panel)
        return panel ? -ENOSYS : -EINVAL;
 }
 
+static inline int drm_panel_prepare(struct drm_panel *panel)
+{
+       if (panel && panel->funcs && panel->funcs->prepare)
+               return panel->funcs->prepare(panel);
+
+       return panel ? -ENOSYS : -EINVAL;
+}
+
 static inline int drm_panel_enable(struct drm_panel *panel)
 {
        if (panel && panel->funcs && panel->funcs->enable)
@@ -62,6 +112,14 @@ static inline int drm_panel_enable(struct drm_panel *panel)
        return panel ? -ENOSYS : -EINVAL;
 }
 
+static inline int drm_panel_get_modes(struct drm_panel *panel)
+{
+       if (panel && panel->funcs && panel->funcs->get_modes)
+               return panel->funcs->get_modes(panel);
+
+       return panel ? -ENOSYS : -EINVAL;
+}
+
 void drm_panel_init(struct drm_panel *panel);
 
 int drm_panel_add(struct drm_panel *panel);
index d1286297567bdbfd50c90a5fc3e98fc8834df059..26bb55e9e8b6d1485e4e3cdb274e1936108a62ef 100644 (file)
@@ -163,5 +163,11 @@ int drm_rect_calc_vscale_relaxed(struct drm_rect *src,
                                 struct drm_rect *dst,
                                 int min_vscale, int max_vscale);
 void drm_rect_debug_print(const struct drm_rect *r, bool fixed_point);
+void drm_rect_rotate(struct drm_rect *r,
+                    int width, int height,
+                    unsigned int rotation);
+void drm_rect_rotate_inv(struct drm_rect *r,
+                        int width, int height,
+                        unsigned int rotation);
 
 #endif
index a5183da3ef924d0219a0571d55e6b14784ab54c9..202f0a7171e85a2c5ea93ef9c9e2768d561e8d6e 100644 (file)
@@ -182,6 +182,7 @@ struct ttm_mem_type_manager_func {
         * @man: Pointer to a memory type manager.
         * @bo: Pointer to the buffer object we're allocating space for.
         * @placement: Placement details.
+        * @flags: Additional placement flags.
         * @mem: Pointer to a struct ttm_mem_reg to be filled in.
         *
         * This function should allocate space in the memory type managed
@@ -206,6 +207,7 @@ struct ttm_mem_type_manager_func {
        int  (*get_node)(struct ttm_mem_type_manager *man,
                         struct ttm_buffer_object *bo,
                         struct ttm_placement *placement,
+                        uint32_t flags,
                         struct ttm_mem_reg *mem);
 
        /**
@@ -652,18 +654,6 @@ extern void ttm_tt_unbind(struct ttm_tt *ttm);
  */
 extern int ttm_tt_swapin(struct ttm_tt *ttm);
 
-/**
- * ttm_tt_cache_flush:
- *
- * @pages: An array of pointers to struct page:s to flush.
- * @num_pages: Number of pages to flush.
- *
- * Flush the data of the indicated pages from the cpu caches.
- * This is used when changing caching attributes of the pages from
- * cache-coherent.
- */
-extern void ttm_tt_cache_flush(struct page *pages[], unsigned long num_pages);
-
 /**
  * ttm_tt_set_placement_caching:
  *
diff --git a/include/dt-bindings/clock/imx1-clock.h b/include/dt-bindings/clock/imx1-clock.h
new file mode 100644 (file)
index 0000000..607bf01
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2014 Alexander Shiyan <shc_work@mail.ru>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#ifndef __DT_BINDINGS_CLOCK_IMX1_H
+#define __DT_BINDINGS_CLOCK_IMX1_H
+
+#define IMX1_CLK_DUMMY         0
+#define IMX1_CLK_CLK32         1
+#define IMX1_CLK_CLK16M_EXT    2
+#define IMX1_CLK_CLK16M                3
+#define IMX1_CLK_CLK32_PREMULT 4
+#define IMX1_CLK_PREM          5
+#define IMX1_CLK_MPLL          6
+#define IMX1_CLK_MPLL_GATE     7
+#define IMX1_CLK_SPLL          8
+#define IMX1_CLK_SPLL_GATE     9
+#define IMX1_CLK_MCU           10
+#define IMX1_CLK_FCLK          11
+#define IMX1_CLK_HCLK          12
+#define IMX1_CLK_CLK48M                13
+#define IMX1_CLK_PER1          14
+#define IMX1_CLK_PER2          15
+#define IMX1_CLK_PER3          16
+#define IMX1_CLK_CLKO          17
+#define IMX1_CLK_UART3_GATE    18
+#define IMX1_CLK_SSI2_GATE     19
+#define IMX1_CLK_BROM_GATE     20
+#define IMX1_CLK_DMA_GATE      21
+#define IMX1_CLK_CSI_GATE      22
+#define IMX1_CLK_MMA_GATE      23
+#define IMX1_CLK_USBD_GATE     24
+#define IMX1_CLK_MAX           25
+
+#endif
diff --git a/include/dt-bindings/clock/imx21-clock.h b/include/dt-bindings/clock/imx21-clock.h
new file mode 100644 (file)
index 0000000..b13596c
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2014 Alexander Shiyan <shc_work@mail.ru>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#ifndef __DT_BINDINGS_CLOCK_IMX21_H
+#define __DT_BINDINGS_CLOCK_IMX21_H
+
+#define IMX21_CLK_DUMMY                        0
+#define IMX21_CLK_CKIL                 1
+#define IMX21_CLK_CKIH                 2
+#define IMX21_CLK_FPM                  3
+#define IMX21_CLK_CKIH_DIV1P5          4
+#define IMX21_CLK_MPLL_GATE            5
+#define IMX21_CLK_SPLL_GATE            6
+#define IMX21_CLK_FPM_GATE             7
+#define IMX21_CLK_CKIH_GATE            8
+#define IMX21_CLK_MPLL_OSC_SEL         9
+#define IMX21_CLK_IPG                  10
+#define IMX21_CLK_HCLK                 11
+#define IMX21_CLK_MPLL_SEL             12
+#define IMX21_CLK_SPLL_SEL             13
+#define IMX21_CLK_SSI1_SEL             14
+#define IMX21_CLK_SSI2_SEL             15
+#define IMX21_CLK_USB_DIV              16
+#define IMX21_CLK_FCLK                 17
+#define IMX21_CLK_MPLL                 18
+#define IMX21_CLK_SPLL                 19
+#define IMX21_CLK_NFC_DIV              20
+#define IMX21_CLK_SSI1_DIV             21
+#define IMX21_CLK_SSI2_DIV             22
+#define IMX21_CLK_PER1                 23
+#define IMX21_CLK_PER2                 24
+#define IMX21_CLK_PER3                 25
+#define IMX21_CLK_PER4                 26
+#define IMX21_CLK_UART1_IPG_GATE       27
+#define IMX21_CLK_UART2_IPG_GATE       28
+#define IMX21_CLK_UART3_IPG_GATE       29
+#define IMX21_CLK_UART4_IPG_GATE       30
+#define IMX21_CLK_CSPI1_IPG_GATE       31
+#define IMX21_CLK_CSPI2_IPG_GATE       32
+#define IMX21_CLK_SSI1_GATE            33
+#define IMX21_CLK_SSI2_GATE            34
+#define IMX21_CLK_SDHC1_IPG_GATE       35
+#define IMX21_CLK_SDHC2_IPG_GATE       36
+#define IMX21_CLK_GPIO_GATE            37
+#define IMX21_CLK_I2C_GATE             38
+#define IMX21_CLK_DMA_GATE             39
+#define IMX21_CLK_USB_GATE             40
+#define IMX21_CLK_EMMA_GATE            41
+#define IMX21_CLK_SSI2_BAUD_GATE       42
+#define IMX21_CLK_SSI1_BAUD_GATE       43
+#define IMX21_CLK_LCDC_IPG_GATE                44
+#define IMX21_CLK_NFC_GATE             45
+#define IMX21_CLK_LCDC_HCLK_GATE       46
+#define IMX21_CLK_PER4_GATE            47
+#define IMX21_CLK_BMI_GATE             48
+#define IMX21_CLK_USB_HCLK_GATE                49
+#define IMX21_CLK_SLCDC_GATE           50
+#define IMX21_CLK_SLCDC_HCLK_GATE      51
+#define IMX21_CLK_EMMA_HCLK_GATE       52
+#define IMX21_CLK_BROM_GATE            53
+#define IMX21_CLK_DMA_HCLK_GATE                54
+#define IMX21_CLK_CSI_HCLK_GATE                55
+#define IMX21_CLK_CSPI3_IPG_GATE       56
+#define IMX21_CLK_WDOG_GATE            57
+#define IMX21_CLK_GPT1_IPG_GATE                58
+#define IMX21_CLK_GPT2_IPG_GATE                59
+#define IMX21_CLK_GPT3_IPG_GATE                60
+#define IMX21_CLK_PWM_IPG_GATE         61
+#define IMX21_CLK_RTC_GATE             62
+#define IMX21_CLK_KPP_GATE             63
+#define IMX21_CLK_OWIRE_GATE           64
+#define IMX21_CLK_MAX                  65
+
+#endif
diff --git a/include/dt-bindings/clock/imx27-clock.h b/include/dt-bindings/clock/imx27-clock.h
new file mode 100644 (file)
index 0000000..148b053
--- /dev/null
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2014 Alexander Shiyan <shc_work@mail.ru>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#ifndef __DT_BINDINGS_CLOCK_IMX27_H
+#define __DT_BINDINGS_CLOCK_IMX27_H
+
+#define IMX27_CLK_DUMMY                        0
+#define IMX27_CLK_CKIH                 1
+#define IMX27_CLK_CKIL                 2
+#define IMX27_CLK_MPLL                 3
+#define IMX27_CLK_SPLL                 4
+#define IMX27_CLK_MPLL_MAIN2           5
+#define IMX27_CLK_AHB                  6
+#define IMX27_CLK_IPG                  7
+#define IMX27_CLK_NFC_DIV              8
+#define IMX27_CLK_PER1_DIV             9
+#define IMX27_CLK_PER2_DIV             10
+#define IMX27_CLK_PER3_DIV             11
+#define IMX27_CLK_PER4_DIV             12
+#define IMX27_CLK_VPU_SEL              13
+#define IMX27_CLK_VPU_DIV              14
+#define IMX27_CLK_USB_DIV              15
+#define IMX27_CLK_CPU_SEL              16
+#define IMX27_CLK_CLKO_SEL             17
+#define IMX27_CLK_CPU_DIV              18
+#define IMX27_CLK_CLKO_DIV             19
+#define IMX27_CLK_SSI1_SEL             20
+#define IMX27_CLK_SSI2_SEL             21
+#define IMX27_CLK_SSI1_DIV             22
+#define IMX27_CLK_SSI2_DIV             23
+#define IMX27_CLK_CLKO_EN              24
+#define IMX27_CLK_SSI2_IPG_GATE                25
+#define IMX27_CLK_SSI1_IPG_GATE                26
+#define IMX27_CLK_SLCDC_IPG_GATE       27
+#define IMX27_CLK_SDHC3_IPG_GATE       28
+#define IMX27_CLK_SDHC2_IPG_GATE       29
+#define IMX27_CLK_SDHC1_IPG_GATE       30
+#define IMX27_CLK_SCC_IPG_GATE         31
+#define IMX27_CLK_SAHARA_IPG_GATE      32
+#define IMX27_CLK_RTC_IPG_GATE         33
+#define IMX27_CLK_PWM_IPG_GATE         34
+#define IMX27_CLK_OWIRE_IPG_GATE       35
+#define IMX27_CLK_LCDC_IPG_GATE                36
+#define IMX27_CLK_KPP_IPG_GATE         37
+#define IMX27_CLK_IIM_IPG_GATE         38
+#define IMX27_CLK_I2C2_IPG_GATE                39
+#define IMX27_CLK_I2C1_IPG_GATE                40
+#define IMX27_CLK_GPT6_IPG_GATE                41
+#define IMX27_CLK_GPT5_IPG_GATE                42
+#define IMX27_CLK_GPT4_IPG_GATE                43
+#define IMX27_CLK_GPT3_IPG_GATE                44
+#define IMX27_CLK_GPT2_IPG_GATE                45
+#define IMX27_CLK_GPT1_IPG_GATE                46
+#define IMX27_CLK_GPIO_IPG_GATE                47
+#define IMX27_CLK_FEC_IPG_GATE         48
+#define IMX27_CLK_EMMA_IPG_GATE                49
+#define IMX27_CLK_DMA_IPG_GATE         50
+#define IMX27_CLK_CSPI3_IPG_GATE       51
+#define IMX27_CLK_CSPI2_IPG_GATE       52
+#define IMX27_CLK_CSPI1_IPG_GATE       53
+#define IMX27_CLK_NFC_BAUD_GATE                54
+#define IMX27_CLK_SSI2_BAUD_GATE       55
+#define IMX27_CLK_SSI1_BAUD_GATE       56
+#define IMX27_CLK_VPU_BAUD_GATE                57
+#define IMX27_CLK_PER4_GATE            58
+#define IMX27_CLK_PER3_GATE            59
+#define IMX27_CLK_PER2_GATE            60
+#define IMX27_CLK_PER1_GATE            61
+#define IMX27_CLK_USB_AHB_GATE         62
+#define IMX27_CLK_SLCDC_AHB_GATE       63
+#define IMX27_CLK_SAHARA_AHB_GATE      64
+#define IMX27_CLK_LCDC_AHB_GATE                65
+#define IMX27_CLK_VPU_AHB_GATE         66
+#define IMX27_CLK_FEC_AHB_GATE         67
+#define IMX27_CLK_EMMA_AHB_GATE                68
+#define IMX27_CLK_EMI_AHB_GATE         69
+#define IMX27_CLK_DMA_AHB_GATE         70
+#define IMX27_CLK_CSI_AHB_GATE         71
+#define IMX27_CLK_BROM_AHB_GATE                72
+#define IMX27_CLK_ATA_AHB_GATE         73
+#define IMX27_CLK_WDOG_IPG_GATE                74
+#define IMX27_CLK_USB_IPG_GATE         75
+#define IMX27_CLK_UART6_IPG_GATE       76
+#define IMX27_CLK_UART5_IPG_GATE       77
+#define IMX27_CLK_UART4_IPG_GATE       78
+#define IMX27_CLK_UART3_IPG_GATE       79
+#define IMX27_CLK_UART2_IPG_GATE       80
+#define IMX27_CLK_UART1_IPG_GATE       81
+#define IMX27_CLK_CKIH_DIV1P5          82
+#define IMX27_CLK_FPM                  83
+#define IMX27_CLK_MPLL_OSC_SEL         84
+#define IMX27_CLK_MPLL_SEL             85
+#define IMX27_CLK_SPLL_GATE            86
+#define IMX27_CLK_MSHC_DIV             87
+#define IMX27_CLK_RTIC_IPG_GATE                88
+#define IMX27_CLK_MSHC_IPG_GATE                89
+#define IMX27_CLK_RTIC_AHB_GATE                90
+#define IMX27_CLK_MSHC_BAUD_GATE       91
+#define IMX27_CLK_CKIH_GATE            92
+#define IMX27_CLK_MAX                  93
+
+#endif
diff --git a/include/dt-bindings/clock/imx6qdl-clock.h b/include/dt-bindings/clock/imx6qdl-clock.h
new file mode 100644 (file)
index 0000000..654151e
--- /dev/null
@@ -0,0 +1,224 @@
+/*
+ * Copyright 2014 Freescale Semiconductor, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef __DT_BINDINGS_CLOCK_IMX6QDL_H
+#define __DT_BINDINGS_CLOCK_IMX6QDL_H
+
+#define IMX6QDL_CLK_DUMMY                      0
+#define IMX6QDL_CLK_CKIL                       1
+#define IMX6QDL_CLK_CKIH                       2
+#define IMX6QDL_CLK_OSC                                3
+#define IMX6QDL_CLK_PLL2_PFD0_352M             4
+#define IMX6QDL_CLK_PLL2_PFD1_594M             5
+#define IMX6QDL_CLK_PLL2_PFD2_396M             6
+#define IMX6QDL_CLK_PLL3_PFD0_720M             7
+#define IMX6QDL_CLK_PLL3_PFD1_540M             8
+#define IMX6QDL_CLK_PLL3_PFD2_508M             9
+#define IMX6QDL_CLK_PLL3_PFD3_454M             10
+#define IMX6QDL_CLK_PLL2_198M                  11
+#define IMX6QDL_CLK_PLL3_120M                  12
+#define IMX6QDL_CLK_PLL3_80M                   13
+#define IMX6QDL_CLK_PLL3_60M                   14
+#define IMX6QDL_CLK_TWD                                15
+#define IMX6QDL_CLK_STEP                       16
+#define IMX6QDL_CLK_PLL1_SW                    17
+#define IMX6QDL_CLK_PERIPH_PRE                 18
+#define IMX6QDL_CLK_PERIPH2_PRE                        19
+#define IMX6QDL_CLK_PERIPH_CLK2_SEL            20
+#define IMX6QDL_CLK_PERIPH2_CLK2_SEL           21
+#define IMX6QDL_CLK_AXI_SEL                    22
+#define IMX6QDL_CLK_ESAI_SEL                   23
+#define IMX6QDL_CLK_ASRC_SEL                   24
+#define IMX6QDL_CLK_SPDIF_SEL                  25
+#define IMX6QDL_CLK_GPU2D_AXI                  26
+#define IMX6QDL_CLK_GPU3D_AXI                  27
+#define IMX6QDL_CLK_GPU2D_CORE_SEL             28
+#define IMX6QDL_CLK_GPU3D_CORE_SEL             29
+#define IMX6QDL_CLK_GPU3D_SHADER_SEL           30
+#define IMX6QDL_CLK_IPU1_SEL                   31
+#define IMX6QDL_CLK_IPU2_SEL                   32
+#define IMX6QDL_CLK_LDB_DI0_SEL                        33
+#define IMX6QDL_CLK_LDB_DI1_SEL                        34
+#define IMX6QDL_CLK_IPU1_DI0_PRE_SEL           35
+#define IMX6QDL_CLK_IPU1_DI1_PRE_SEL           36
+#define IMX6QDL_CLK_IPU2_DI0_PRE_SEL           37
+#define IMX6QDL_CLK_IPU2_DI1_PRE_SEL           38
+#define IMX6QDL_CLK_IPU1_DI0_SEL               39
+#define IMX6QDL_CLK_IPU1_DI1_SEL               40
+#define IMX6QDL_CLK_IPU2_DI0_SEL               41
+#define IMX6QDL_CLK_IPU2_DI1_SEL               42
+#define IMX6QDL_CLK_HSI_TX_SEL                 43
+#define IMX6QDL_CLK_PCIE_AXI_SEL               44
+#define IMX6QDL_CLK_SSI1_SEL                   45
+#define IMX6QDL_CLK_SSI2_SEL                   46
+#define IMX6QDL_CLK_SSI3_SEL                   47
+#define IMX6QDL_CLK_USDHC1_SEL                 48
+#define IMX6QDL_CLK_USDHC2_SEL                 49
+#define IMX6QDL_CLK_USDHC3_SEL                 50
+#define IMX6QDL_CLK_USDHC4_SEL                 51
+#define IMX6QDL_CLK_ENFC_SEL                   52
+#define IMX6QDL_CLK_EMI_SEL                    53
+#define IMX6QDL_CLK_EMI_SLOW_SEL               54
+#define IMX6QDL_CLK_VDO_AXI_SEL                        55
+#define IMX6QDL_CLK_VPU_AXI_SEL                        56
+#define IMX6QDL_CLK_CKO1_SEL                   57
+#define IMX6QDL_CLK_PERIPH                     58
+#define IMX6QDL_CLK_PERIPH2                    59
+#define IMX6QDL_CLK_PERIPH_CLK2                        60
+#define IMX6QDL_CLK_PERIPH2_CLK2               61
+#define IMX6QDL_CLK_IPG                                62
+#define IMX6QDL_CLK_IPG_PER                    63
+#define IMX6QDL_CLK_ESAI_PRED                  64
+#define IMX6QDL_CLK_ESAI_PODF                  65
+#define IMX6QDL_CLK_ASRC_PRED                  66
+#define IMX6QDL_CLK_ASRC_PODF                  67
+#define IMX6QDL_CLK_SPDIF_PRED                 68
+#define IMX6QDL_CLK_SPDIF_PODF                 69
+#define IMX6QDL_CLK_CAN_ROOT                   70
+#define IMX6QDL_CLK_ECSPI_ROOT                 71
+#define IMX6QDL_CLK_GPU2D_CORE_PODF            72
+#define IMX6QDL_CLK_GPU3D_CORE_PODF            73
+#define IMX6QDL_CLK_GPU3D_SHADER               74
+#define IMX6QDL_CLK_IPU1_PODF                  75
+#define IMX6QDL_CLK_IPU2_PODF                  76
+#define IMX6QDL_CLK_LDB_DI0_PODF               77
+#define IMX6QDL_CLK_LDB_DI1_PODF               78
+#define IMX6QDL_CLK_IPU1_DI0_PRE               79
+#define IMX6QDL_CLK_IPU1_DI1_PRE               80
+#define IMX6QDL_CLK_IPU2_DI0_PRE               81
+#define IMX6QDL_CLK_IPU2_DI1_PRE               82
+#define IMX6QDL_CLK_HSI_TX_PODF                        83
+#define IMX6QDL_CLK_SSI1_PRED                  84
+#define IMX6QDL_CLK_SSI1_PODF                  85
+#define IMX6QDL_CLK_SSI2_PRED                  86
+#define IMX6QDL_CLK_SSI2_PODF                  87
+#define IMX6QDL_CLK_SSI3_PRED                  88
+#define IMX6QDL_CLK_SSI3_PODF                  89
+#define IMX6QDL_CLK_UART_SERIAL_PODF           90
+#define IMX6QDL_CLK_USDHC1_PODF                        91
+#define IMX6QDL_CLK_USDHC2_PODF                        92
+#define IMX6QDL_CLK_USDHC3_PODF                        93
+#define IMX6QDL_CLK_USDHC4_PODF                        94
+#define IMX6QDL_CLK_ENFC_PRED                  95
+#define IMX6QDL_CLK_ENFC_PODF                  96
+#define IMX6QDL_CLK_EMI_PODF                   97
+#define IMX6QDL_CLK_EMI_SLOW_PODF              98
+#define IMX6QDL_CLK_VPU_AXI_PODF               99
+#define IMX6QDL_CLK_CKO1_PODF                  100
+#define IMX6QDL_CLK_AXI                                101
+#define IMX6QDL_CLK_MMDC_CH0_AXI_PODF          102
+#define IMX6QDL_CLK_MMDC_CH1_AXI_PODF          103
+#define IMX6QDL_CLK_ARM                                104
+#define IMX6QDL_CLK_AHB                                105
+#define IMX6QDL_CLK_APBH_DMA                   106
+#define IMX6QDL_CLK_ASRC                       107
+#define IMX6QDL_CLK_CAN1_IPG                   108
+#define IMX6QDL_CLK_CAN1_SERIAL                        109
+#define IMX6QDL_CLK_CAN2_IPG                   110
+#define IMX6QDL_CLK_CAN2_SERIAL                        111
+#define IMX6QDL_CLK_ECSPI1                     112
+#define IMX6QDL_CLK_ECSPI2                     113
+#define IMX6QDL_CLK_ECSPI3                     114
+#define IMX6QDL_CLK_ECSPI4                     115
+#define IMX6Q_CLK_ECSPI5                       116
+#define IMX6DL_CLK_I2C4                                116
+#define IMX6QDL_CLK_ENET                       117
+#define IMX6QDL_CLK_ESAI                       118
+#define IMX6QDL_CLK_GPT_IPG                    119
+#define IMX6QDL_CLK_GPT_IPG_PER                        120
+#define IMX6QDL_CLK_GPU2D_CORE                 121
+#define IMX6QDL_CLK_GPU3D_CORE                 122
+#define IMX6QDL_CLK_HDMI_IAHB                  123
+#define IMX6QDL_CLK_HDMI_ISFR                  124
+#define IMX6QDL_CLK_I2C1                       125
+#define IMX6QDL_CLK_I2C2                       126
+#define IMX6QDL_CLK_I2C3                       127
+#define IMX6QDL_CLK_IIM                                128
+#define IMX6QDL_CLK_ENFC                       129
+#define IMX6QDL_CLK_IPU1                       130
+#define IMX6QDL_CLK_IPU1_DI0                   131
+#define IMX6QDL_CLK_IPU1_DI1                   132
+#define IMX6QDL_CLK_IPU2                       133
+#define IMX6QDL_CLK_IPU2_DI0                   134
+#define IMX6QDL_CLK_LDB_DI0                    135
+#define IMX6QDL_CLK_LDB_DI1                    136
+#define IMX6QDL_CLK_IPU2_DI1                   137
+#define IMX6QDL_CLK_HSI_TX                     138
+#define IMX6QDL_CLK_MLB                                139
+#define IMX6QDL_CLK_MMDC_CH0_AXI               140
+#define IMX6QDL_CLK_MMDC_CH1_AXI               141
+#define IMX6QDL_CLK_OCRAM                      142
+#define IMX6QDL_CLK_OPENVG_AXI                 143
+#define IMX6QDL_CLK_PCIE_AXI                   144
+#define IMX6QDL_CLK_PWM1                       145
+#define IMX6QDL_CLK_PWM2                       146
+#define IMX6QDL_CLK_PWM3                       147
+#define IMX6QDL_CLK_PWM4                       148
+#define IMX6QDL_CLK_PER1_BCH                   149
+#define IMX6QDL_CLK_GPMI_BCH_APB               150
+#define IMX6QDL_CLK_GPMI_BCH                   151
+#define IMX6QDL_CLK_GPMI_IO                    152
+#define IMX6QDL_CLK_GPMI_APB                   153
+#define IMX6QDL_CLK_SATA                       154
+#define IMX6QDL_CLK_SDMA                       155
+#define IMX6QDL_CLK_SPBA                       156
+#define IMX6QDL_CLK_SSI1                       157
+#define IMX6QDL_CLK_SSI2                       158
+#define IMX6QDL_CLK_SSI3                       159
+#define IMX6QDL_CLK_UART_IPG                   160
+#define IMX6QDL_CLK_UART_SERIAL                        161
+#define IMX6QDL_CLK_USBOH3                     162
+#define IMX6QDL_CLK_USDHC1                     163
+#define IMX6QDL_CLK_USDHC2                     164
+#define IMX6QDL_CLK_USDHC3                     165
+#define IMX6QDL_CLK_USDHC4                     166
+#define IMX6QDL_CLK_VDO_AXI                    167
+#define IMX6QDL_CLK_VPU_AXI                    168
+#define IMX6QDL_CLK_CKO1                       169
+#define IMX6QDL_CLK_PLL1_SYS                   170
+#define IMX6QDL_CLK_PLL2_BUS                   171
+#define IMX6QDL_CLK_PLL3_USB_OTG               172
+#define IMX6QDL_CLK_PLL4_AUDIO                 173
+#define IMX6QDL_CLK_PLL5_VIDEO                 174
+#define IMX6QDL_CLK_PLL8_MLB                   175
+#define IMX6QDL_CLK_PLL7_USB_HOST              176
+#define IMX6QDL_CLK_PLL6_ENET                  177
+#define IMX6QDL_CLK_SSI1_IPG                   178
+#define IMX6QDL_CLK_SSI2_IPG                   179
+#define IMX6QDL_CLK_SSI3_IPG                   180
+#define IMX6QDL_CLK_ROM                                181
+#define IMX6QDL_CLK_USBPHY1                    182
+#define IMX6QDL_CLK_USBPHY2                    183
+#define IMX6QDL_CLK_LDB_DI0_DIV_3_5            184
+#define IMX6QDL_CLK_LDB_DI1_DIV_3_5            185
+#define IMX6QDL_CLK_SATA_REF                   186
+#define IMX6QDL_CLK_SATA_REF_100M              187
+#define IMX6QDL_CLK_PCIE_REF                   188
+#define IMX6QDL_CLK_PCIE_REF_125M              189
+#define IMX6QDL_CLK_ENET_REF                   190
+#define IMX6QDL_CLK_USBPHY1_GATE               191
+#define IMX6QDL_CLK_USBPHY2_GATE               192
+#define IMX6QDL_CLK_PLL4_POST_DIV              193
+#define IMX6QDL_CLK_PLL5_POST_DIV              194
+#define IMX6QDL_CLK_PLL5_VIDEO_DIV             195
+#define IMX6QDL_CLK_EIM_SLOW                   196
+#define IMX6QDL_CLK_SPDIF                      197
+#define IMX6QDL_CLK_CKO2_SEL                   198
+#define IMX6QDL_CLK_CKO2_PODF                  199
+#define IMX6QDL_CLK_CKO2                       200
+#define IMX6QDL_CLK_CKO                                201
+#define IMX6QDL_CLK_VDOA                       202
+#define IMX6QDL_CLK_PLL4_AUDIO_DIV             203
+#define IMX6QDL_CLK_LVDS1_SEL                  204
+#define IMX6QDL_CLK_LVDS2_SEL                  205
+#define IMX6QDL_CLK_LVDS1_GATE                 206
+#define IMX6QDL_CLK_LVDS2_GATE                 207
+#define IMX6QDL_CLK_ESAI_AHB                   208
+#define IMX6QDL_CLK_END                                209
+
+#endif /* __DT_BINDINGS_CLOCK_IMX6QDL_H */
index 1118f7a4bca611ee6e46d7d4d3f356f65822658a..f929a79e69987fd44a0d8bb8c2f91b40ccb3f4f2 100644 (file)
@@ -59,6 +59,7 @@
 #define R8A7790_CLK_SDHI0              14
 #define R8A7790_CLK_MMCIF0             15
 #define R8A7790_CLK_IIC0               18
+#define R8A7790_CLK_PCIEC              19
 #define R8A7790_CLK_IIC1               23
 #define R8A7790_CLK_SSUSB              28
 #define R8A7790_CLK_CMT1               29
 #define R8A7790_CLK_I2C1               30
 #define R8A7790_CLK_I2C0               31
 
+/* MSTP10 */
+#define R8A7790_CLK_SSI_ALL            5
+#define R8A7790_CLK_SSI9               6
+#define R8A7790_CLK_SSI8               7
+#define R8A7790_CLK_SSI7               8
+#define R8A7790_CLK_SSI6               9
+#define R8A7790_CLK_SSI5               10
+#define R8A7790_CLK_SSI4               11
+#define R8A7790_CLK_SSI3               12
+#define R8A7790_CLK_SSI2               13
+#define R8A7790_CLK_SSI1               14
+#define R8A7790_CLK_SSI0               15
+#define R8A7790_CLK_SCU_ALL            17
+#define R8A7790_CLK_SCU_DVC1           18
+#define R8A7790_CLK_SCU_DVC0           19
+#define R8A7790_CLK_SCU_SRC9           22
+#define R8A7790_CLK_SCU_SRC8           23
+#define R8A7790_CLK_SCU_SRC7           24
+#define R8A7790_CLK_SCU_SRC6           25
+#define R8A7790_CLK_SCU_SRC5           26
+#define R8A7790_CLK_SCU_SRC4           27
+#define R8A7790_CLK_SCU_SRC3           28
+#define R8A7790_CLK_SCU_SRC2           29
+#define R8A7790_CLK_SCU_SRC1           30
+#define R8A7790_CLK_SCU_SRC0           31
+
 #endif /* __DT_BINDINGS_CLOCK_R8A7790_H__ */
index b050d18437cecda81940b805773b5955333cdc0b..f0d4d104916251d794943e60a659c0f30d8ab2eb 100644 (file)
@@ -53,6 +53,7 @@
 #define R8A7791_CLK_SDHI0              14
 #define R8A7791_CLK_MMCIF0             15
 #define R8A7791_CLK_IIC0               18
+#define R8A7791_CLK_PCIEC              19
 #define R8A7791_CLK_IIC1               23
 #define R8A7791_CLK_SSUSB              28
 #define R8A7791_CLK_CMT1               29
 #define R8A7791_CLK_I2C1               30
 #define R8A7791_CLK_I2C0               31
 
+/* MSTP10 */
+#define R8A7791_CLK_SSI_ALL            5
+#define R8A7791_CLK_SSI9               6
+#define R8A7791_CLK_SSI8               7
+#define R8A7791_CLK_SSI7               8
+#define R8A7791_CLK_SSI6               9
+#define R8A7791_CLK_SSI5               10
+#define R8A7791_CLK_SSI4               11
+#define R8A7791_CLK_SSI3               12
+#define R8A7791_CLK_SSI2               13
+#define R8A7791_CLK_SSI1               14
+#define R8A7791_CLK_SSI0               15
+#define R8A7791_CLK_SCU_ALL            17
+#define R8A7791_CLK_SCU_DVC1           18
+#define R8A7791_CLK_SCU_DVC0           19
+#define R8A7791_CLK_SCU_SRC9           22
+#define R8A7791_CLK_SCU_SRC8           23
+#define R8A7791_CLK_SCU_SRC7           24
+#define R8A7791_CLK_SCU_SRC6           25
+#define R8A7791_CLK_SCU_SRC5           26
+#define R8A7791_CLK_SCU_SRC4           27
+#define R8A7791_CLK_SCU_SRC3           28
+#define R8A7791_CLK_SCU_SRC2           29
+#define R8A7791_CLK_SCU_SRC1           30
+#define R8A7791_CLK_SCU_SRC0           31
+
 /* MSTP11 */
 #define R8A7791_CLK_SCIFA3             6
 #define R8A7791_CLK_SCIFA4             7
diff --git a/include/dt-bindings/clock/s5pv210-audss.h b/include/dt-bindings/clock/s5pv210-audss.h
new file mode 100644 (file)
index 0000000..fe57406
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2014 Tomasz Figa <tomasz.figa@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This header provides constants for Samsung audio subsystem
+ * clock controller.
+ *
+ * The constants defined in this header are being used in dts
+ * and s5pv210 audss driver.
+ */
+
+#ifndef _DT_BINDINGS_CLOCK_S5PV210_AUDSS_H
+#define _DT_BINDINGS_CLOCK_S5PV210_AUDSS_H
+
+#define CLK_MOUT_AUDSS         0
+#define CLK_MOUT_I2S_A         1
+
+#define CLK_DOUT_AUD_BUS       2
+#define CLK_DOUT_I2S_A         3
+
+#define CLK_I2S                        4
+#define CLK_HCLK_I2S           5
+#define CLK_HCLK_UART          6
+#define CLK_HCLK_HWA           7
+#define CLK_HCLK_DMA           8
+#define CLK_HCLK_BUF           9
+#define CLK_HCLK_RP            10
+
+#define AUDSS_MAX_CLKS         11
+
+#endif
diff --git a/include/dt-bindings/clock/s5pv210.h b/include/dt-bindings/clock/s5pv210.h
new file mode 100644 (file)
index 0000000..e88986b
--- /dev/null
@@ -0,0 +1,239 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd.
+ * Author: Mateusz Krawczuk <m.krawczuk@partner.samsung.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Device Tree binding constants for Samsung S5PV210 clock controller.
+ */
+
+#ifndef _DT_BINDINGS_CLOCK_S5PV210_H
+#define _DT_BINDINGS_CLOCK_S5PV210_H
+
+/* Core clocks. */
+#define FIN_PLL                        1
+#define FOUT_APLL              2
+#define FOUT_MPLL              3
+#define FOUT_EPLL              4
+#define FOUT_VPLL              5
+
+/* Muxes. */
+#define MOUT_FLASH             6
+#define MOUT_PSYS              7
+#define MOUT_DSYS              8
+#define MOUT_MSYS              9
+#define MOUT_VPLL              10
+#define MOUT_EPLL              11
+#define MOUT_MPLL              12
+#define MOUT_APLL              13
+#define MOUT_VPLLSRC           14
+#define MOUT_CSIS              15
+#define MOUT_FIMD              16
+#define MOUT_CAM1              17
+#define MOUT_CAM0              18
+#define MOUT_DAC               19
+#define MOUT_MIXER             20
+#define MOUT_HDMI              21
+#define MOUT_G2D               22
+#define MOUT_MFC               23
+#define MOUT_G3D               24
+#define MOUT_FIMC2             25
+#define MOUT_FIMC1             26
+#define MOUT_FIMC0             27
+#define MOUT_UART3             28
+#define MOUT_UART2             29
+#define MOUT_UART1             30
+#define MOUT_UART0             31
+#define MOUT_MMC3              32
+#define MOUT_MMC2              33
+#define MOUT_MMC1              34
+#define MOUT_MMC0              35
+#define MOUT_PWM               36
+#define MOUT_SPI0              37
+#define MOUT_SPI1              38
+#define MOUT_DMC0              39
+#define MOUT_PWI               40
+#define MOUT_HPM               41
+#define MOUT_SPDIF             42
+#define MOUT_AUDIO2            43
+#define MOUT_AUDIO1            44
+#define MOUT_AUDIO0            45
+
+/* Dividers. */
+#define DOUT_PCLKP             46
+#define DOUT_HCLKP             47
+#define DOUT_PCLKD             48
+#define DOUT_HCLKD             49
+#define DOUT_PCLKM             50
+#define DOUT_HCLKM             51
+#define DOUT_A2M               52
+#define DOUT_APLL              53
+#define DOUT_CSIS              54
+#define DOUT_FIMD              55
+#define DOUT_CAM1              56
+#define DOUT_CAM0              57
+#define DOUT_TBLK              58
+#define DOUT_G2D               59
+#define DOUT_MFC               60
+#define DOUT_G3D               61
+#define DOUT_FIMC2             62
+#define DOUT_FIMC1             63
+#define DOUT_FIMC0             64
+#define DOUT_UART3             65
+#define DOUT_UART2             66
+#define DOUT_UART1             67
+#define DOUT_UART0             68
+#define DOUT_MMC3              69
+#define DOUT_MMC2              70
+#define DOUT_MMC1              71
+#define DOUT_MMC0              72
+#define DOUT_PWM               73
+#define DOUT_SPI1              74
+#define DOUT_SPI0              75
+#define DOUT_DMC0              76
+#define DOUT_PWI               77
+#define DOUT_HPM               78
+#define DOUT_COPY              79
+#define DOUT_FLASH             80
+#define DOUT_AUDIO2            81
+#define DOUT_AUDIO1            82
+#define DOUT_AUDIO0            83
+#define DOUT_DPM               84
+#define DOUT_DVSEM             85
+
+/* Gates */
+#define SCLK_FIMC              86
+#define CLK_CSIS               87
+#define CLK_ROTATOR            88
+#define CLK_FIMC2              89
+#define CLK_FIMC1              90
+#define CLK_FIMC0              91
+#define CLK_MFC                        92
+#define CLK_G2D                        93
+#define CLK_G3D                        94
+#define CLK_IMEM               95
+#define CLK_PDMA1              96
+#define CLK_PDMA0              97
+#define CLK_MDMA               98
+#define CLK_DMC1               99
+#define CLK_DMC0               100
+#define CLK_NFCON              101
+#define CLK_SROMC              102
+#define CLK_CFCON              103
+#define CLK_NANDXL             104
+#define CLK_USB_HOST           105
+#define CLK_USB_OTG            106
+#define CLK_HDMI               107
+#define CLK_TVENC              108
+#define CLK_MIXER              109
+#define CLK_VP                 110
+#define CLK_DSIM               111
+#define CLK_FIMD               112
+#define CLK_TZIC3              113
+#define CLK_TZIC2              114
+#define CLK_TZIC1              115
+#define CLK_TZIC0              116
+#define CLK_VIC3               117
+#define CLK_VIC2               118
+#define CLK_VIC1               119
+#define CLK_VIC0               120
+#define CLK_TSI                        121
+#define CLK_HSMMC3             122
+#define CLK_HSMMC2             123
+#define CLK_HSMMC1             124
+#define CLK_HSMMC0             125
+#define CLK_JTAG               126
+#define CLK_MODEMIF            127
+#define CLK_CORESIGHT          128
+#define CLK_SDM                        129
+#define CLK_SECSS              130
+#define CLK_PCM2               131
+#define CLK_PCM1               132
+#define CLK_PCM0               133
+#define CLK_SYSCON             134
+#define CLK_GPIO               135
+#define CLK_TSADC              136
+#define CLK_PWM                        137
+#define CLK_WDT                        138
+#define CLK_KEYIF              139
+#define CLK_UART3              140
+#define CLK_UART2              141
+#define CLK_UART1              142
+#define CLK_UART0              143
+#define CLK_SYSTIMER           144
+#define CLK_RTC                        145
+#define CLK_SPI1               146
+#define CLK_SPI0               147
+#define CLK_I2C_HDMI_PHY       148
+#define CLK_I2C1               149
+#define CLK_I2C2               150
+#define CLK_I2C0               151
+#define CLK_I2S1               152
+#define CLK_I2S2               153
+#define CLK_I2S0               154
+#define CLK_AC97               155
+#define CLK_SPDIF              156
+#define CLK_TZPC3              157
+#define CLK_TZPC2              158
+#define CLK_TZPC1              159
+#define CLK_TZPC0              160
+#define CLK_SECKEY             161
+#define CLK_IEM_APC            162
+#define CLK_IEM_IEC            163
+#define CLK_CHIPID             164
+#define CLK_JPEG               163
+
+/* Special clocks*/
+#define SCLK_PWI               164
+#define SCLK_SPDIF             165
+#define SCLK_AUDIO2            166
+#define SCLK_AUDIO1            167
+#define SCLK_AUDIO0            168
+#define SCLK_PWM               169
+#define SCLK_SPI1              170
+#define SCLK_SPI0              171
+#define SCLK_UART3             172
+#define SCLK_UART2             173
+#define SCLK_UART1             174
+#define SCLK_UART0             175
+#define SCLK_MMC3              176
+#define SCLK_MMC2              177
+#define SCLK_MMC1              178
+#define SCLK_MMC0              179
+#define SCLK_FINVPLL           180
+#define SCLK_CSIS              181
+#define SCLK_FIMD              182
+#define SCLK_CAM1              183
+#define SCLK_CAM0              184
+#define SCLK_DAC               185
+#define SCLK_MIXER             186
+#define SCLK_HDMI              187
+#define SCLK_FIMC2             188
+#define SCLK_FIMC1             189
+#define SCLK_FIMC0             190
+#define SCLK_HDMI27M           191
+#define SCLK_HDMIPHY           192
+#define SCLK_USBPHY0           193
+#define SCLK_USBPHY1           194
+
+/* S5P6442-specific clocks */
+#define MOUT_D0SYNC            195
+#define MOUT_D1SYNC            196
+#define DOUT_MIXER             197
+#define CLK_ETB                        198
+#define CLK_ETM                        199
+
+/* CLKOUT */
+#define FOUT_APLL_CLKOUT       200
+#define FOUT_MPLL_CLKOUT       201
+#define DOUT_APLL_CLKOUT       202
+#define MOUT_CLKSEL            203
+#define DOUT_CLKOUT            204
+#define MOUT_CLKOUT            205
+
+/* Total number of clocks. */
+#define NR_CLKS                        206
+
+#endif /* _DT_BINDINGS_CLOCK_S5PV210_H */
index a91602951d3d3c018218c37889b7ae9338191948..00953d9484cb5985f5dd6d2314c90acf8e4b8b7e 100644 (file)
 #define VF610_CLK_DMAMUX1              151
 #define VF610_CLK_DMAMUX2              152
 #define VF610_CLK_DMAMUX3              153
-#define VF610_CLK_END                  154
+#define VF610_CLK_FLEXCAN0_EN          154
+#define VF610_CLK_FLEXCAN1_EN          155
+#define VF610_CLK_END                  156
 
 #endif /* __DT_BINDINGS_CLOCK_VF610_H */
index 0e692562d77b17331b9b1feb76ca2341582223a7..e66c0898c58e7025acd0b6fe7806f9d4d26d2530 100644 (file)
@@ -13,7 +13,7 @@
 /* External control pins */
 #define AS3722_EXT_CONTROL_PIN_ENABLE1 1
 #define AS3722_EXT_CONTROL_PIN_ENABLE2 2
-#define AS3722_EXT_CONTROL_PIN_ENABLE2 3
+#define AS3722_EXT_CONTROL_PIN_ENABLE3 3
 
 /* Interrupt numbers for AS3722 */
 #define AS3722_IRQ_LID                 0
diff --git a/include/dt-bindings/pinctrl/pinctrl-tegra-xusb.h b/include/dt-bindings/pinctrl/pinctrl-tegra-xusb.h
new file mode 100644 (file)
index 0000000..914d56d
--- /dev/null
@@ -0,0 +1,7 @@
+#ifndef _DT_BINDINGS_PINCTRL_TEGRA_XUSB_H
+#define _DT_BINDINGS_PINCTRL_TEGRA_XUSB_H 1
+
+#define TEGRA_XUSB_PADCTL_PCIE 0
+#define TEGRA_XUSB_PADCTL_SATA 1
+
+#endif /* _DT_BINDINGS_PINCTRL_TEGRA_XUSB_H */
index 6d9aeddc09bffe4f9068f8e415551c2855233b40..ad9db6045b2fcc71dffbdd316900fabe771b2804 100644 (file)
@@ -67,6 +67,10 @@ void kvm_timer_vcpu_init(struct kvm_vcpu *vcpu);
 void kvm_timer_flush_hwstate(struct kvm_vcpu *vcpu);
 void kvm_timer_sync_hwstate(struct kvm_vcpu *vcpu);
 void kvm_timer_vcpu_terminate(struct kvm_vcpu *vcpu);
+
+u64 kvm_arm_timer_get_reg(struct kvm_vcpu *, u64 regid);
+int kvm_arm_timer_set_reg(struct kvm_vcpu *, u64 regid, u64 value);
+
 #else
 static inline int kvm_timer_hyp_init(void)
 {
@@ -84,6 +88,16 @@ static inline void kvm_timer_vcpu_init(struct kvm_vcpu *vcpu) {}
 static inline void kvm_timer_flush_hwstate(struct kvm_vcpu *vcpu) {}
 static inline void kvm_timer_sync_hwstate(struct kvm_vcpu *vcpu) {}
 static inline void kvm_timer_vcpu_terminate(struct kvm_vcpu *vcpu) {}
+
+static inline int kvm_arm_timer_set_reg(struct kvm_vcpu *vcpu, u64 regid, u64 value)
+{
+       return 0;
+}
+
+static inline u64 kvm_arm_timer_get_reg(struct kvm_vcpu *vcpu, u64 regid)
+{
+       return 0;
+}
 #endif
 
 #endif
index f27000f55a83d6a27921372f9890520e492a747b..35b0c121bb65b1819cb2455763af0954e9a1b965 100644 (file)
@@ -24,7 +24,6 @@
 #include <linux/irqreturn.h>
 #include <linux/spinlock.h>
 #include <linux/types.h>
-#include <linux/irqchip/arm-gic.h>
 
 #define VGIC_NR_IRQS           256
 #define VGIC_NR_SGIS           16
@@ -32,7 +31,9 @@
 #define VGIC_NR_PRIVATE_IRQS   (VGIC_NR_SGIS + VGIC_NR_PPIS)
 #define VGIC_NR_SHARED_IRQS    (VGIC_NR_IRQS - VGIC_NR_PRIVATE_IRQS)
 #define VGIC_MAX_CPUS          KVM_MAX_VCPUS
-#define VGIC_MAX_LRS           (1 << 6)
+
+#define VGIC_V2_MAX_LRS                (1 << 6)
+#define VGIC_V3_MAX_LRS                16
 
 /* Sanity checks... */
 #if (VGIC_MAX_CPUS > 8)
@@ -68,9 +69,62 @@ struct vgic_bytemap {
        u32 shared[VGIC_NR_SHARED_IRQS  / 4];
 };
 
+struct kvm_vcpu;
+
+enum vgic_type {
+       VGIC_V2,                /* Good ol' GICv2 */
+       VGIC_V3,                /* New fancy GICv3 */
+};
+
+#define LR_STATE_PENDING       (1 << 0)
+#define LR_STATE_ACTIVE                (1 << 1)
+#define LR_STATE_MASK          (3 << 0)
+#define LR_EOI_INT             (1 << 2)
+
+struct vgic_lr {
+       u16     irq;
+       u8      source;
+       u8      state;
+};
+
+struct vgic_vmcr {
+       u32     ctlr;
+       u32     abpr;
+       u32     bpr;
+       u32     pmr;
+};
+
+struct vgic_ops {
+       struct vgic_lr  (*get_lr)(const struct kvm_vcpu *, int);
+       void    (*set_lr)(struct kvm_vcpu *, int, struct vgic_lr);
+       void    (*sync_lr_elrsr)(struct kvm_vcpu *, int, struct vgic_lr);
+       u64     (*get_elrsr)(const struct kvm_vcpu *vcpu);
+       u64     (*get_eisr)(const struct kvm_vcpu *vcpu);
+       u32     (*get_interrupt_status)(const struct kvm_vcpu *vcpu);
+       void    (*enable_underflow)(struct kvm_vcpu *vcpu);
+       void    (*disable_underflow)(struct kvm_vcpu *vcpu);
+       void    (*get_vmcr)(struct kvm_vcpu *vcpu, struct vgic_vmcr *vmcr);
+       void    (*set_vmcr)(struct kvm_vcpu *vcpu, struct vgic_vmcr *vmcr);
+       void    (*enable)(struct kvm_vcpu *vcpu);
+};
+
+struct vgic_params {
+       /* vgic type */
+       enum vgic_type  type;
+       /* Physical address of vgic virtual cpu interface */
+       phys_addr_t     vcpu_base;
+       /* Number of list registers */
+       u32             nr_lr;
+       /* Interrupt number */
+       unsigned int    maint_irq;
+       /* Virtual control interface base address */
+       void __iomem    *vctrl_base;
+};
+
 struct vgic_dist {
 #ifdef CONFIG_KVM_ARM_VGIC
        spinlock_t              lock;
+       bool                    in_kernel;
        bool                    ready;
 
        /* Virtual control interface mapping */
@@ -110,6 +164,29 @@ struct vgic_dist {
 #endif
 };
 
+struct vgic_v2_cpu_if {
+       u32             vgic_hcr;
+       u32             vgic_vmcr;
+       u32             vgic_misr;      /* Saved only */
+       u32             vgic_eisr[2];   /* Saved only */
+       u32             vgic_elrsr[2];  /* Saved only */
+       u32             vgic_apr;
+       u32             vgic_lr[VGIC_V2_MAX_LRS];
+};
+
+struct vgic_v3_cpu_if {
+#ifdef CONFIG_ARM_GIC_V3
+       u32             vgic_hcr;
+       u32             vgic_vmcr;
+       u32             vgic_misr;      /* Saved only */
+       u32             vgic_eisr;      /* Saved only */
+       u32             vgic_elrsr;     /* Saved only */
+       u32             vgic_ap0r[4];
+       u32             vgic_ap1r[4];
+       u64             vgic_lr[VGIC_V3_MAX_LRS];
+#endif
+};
+
 struct vgic_cpu {
 #ifdef CONFIG_KVM_ARM_VGIC
        /* per IRQ to LR mapping */
@@ -120,24 +197,24 @@ struct vgic_cpu {
        DECLARE_BITMAP( pending_shared, VGIC_NR_SHARED_IRQS);
 
        /* Bitmap of used/free list registers */
-       DECLARE_BITMAP( lr_used, VGIC_MAX_LRS);
+       DECLARE_BITMAP( lr_used, VGIC_V2_MAX_LRS);
 
        /* Number of list registers on this CPU */
        int             nr_lr;
 
        /* CPU vif control registers for world switch */
-       u32             vgic_hcr;
-       u32             vgic_vmcr;
-       u32             vgic_misr;      /* Saved only */
-       u32             vgic_eisr[2];   /* Saved only */
-       u32             vgic_elrsr[2];  /* Saved only */
-       u32             vgic_apr;
-       u32             vgic_lr[VGIC_MAX_LRS];
+       union {
+               struct vgic_v2_cpu_if   vgic_v2;
+               struct vgic_v3_cpu_if   vgic_v3;
+       };
 #endif
 };
 
 #define LR_EMPTY       0xff
 
+#define INT_STATUS_EOI         (1 << 0)
+#define INT_STATUS_UNDERFLOW   (1 << 1)
+
 struct kvm;
 struct kvm_vcpu;
 struct kvm_run;
@@ -157,9 +234,25 @@ int kvm_vgic_vcpu_pending_irq(struct kvm_vcpu *vcpu);
 bool vgic_handle_mmio(struct kvm_vcpu *vcpu, struct kvm_run *run,
                      struct kvm_exit_mmio *mmio);
 
-#define irqchip_in_kernel(k)   (!!((k)->arch.vgic.vctrl_base))
+#define irqchip_in_kernel(k)   (!!((k)->arch.vgic.in_kernel))
 #define vgic_initialized(k)    ((k)->arch.vgic.ready)
 
+int vgic_v2_probe(struct device_node *vgic_node,
+                 const struct vgic_ops **ops,
+                 const struct vgic_params **params);
+#ifdef CONFIG_ARM_GIC_V3
+int vgic_v3_probe(struct device_node *vgic_node,
+                 const struct vgic_ops **ops,
+                 const struct vgic_params **params);
+#else
+static inline int vgic_v3_probe(struct device_node *vgic_node,
+                               const struct vgic_ops **ops,
+                               const struct vgic_params **params)
+{
+       return -ENODEV;
+}
+#endif
+
 #else
 static inline int kvm_vgic_hyp_init(void)
 {
diff --git a/include/linux/atmel-pwm-bl.h b/include/linux/atmel-pwm-bl.h
deleted file mode 100644 (file)
index 0153a47..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2007 Atmel Corporation
- *
- * Driver for the AT32AP700X PS/2 controller (PSIF).
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 as published
- * by the Free Software Foundation.
- */
-
-#ifndef __INCLUDE_ATMEL_PWM_BL_H
-#define __INCLUDE_ATMEL_PWM_BL_H
-
-/**
- * struct atmel_pwm_bl_platform_data
- * @pwm_channel: which PWM channel in the PWM module to use.
- * @pwm_frequency: PWM frequency to generate, the driver will try to be as
- *     close as the prescaler allows.
- * @pwm_compare_max: value to use in the PWM channel compare register.
- * @pwm_duty_max: maximum duty cycle value, must be less than or equal to
- *     pwm_compare_max.
- * @pwm_duty_min: minimum duty cycle value, must be less than pwm_duty_max.
- * @pwm_active_low: set to one if the low part of the PWM signal increases the
- *     brightness of the backlight.
- * @gpio_on: GPIO line to control the backlight on/off, set to -1 if not used.
- * @on_active_low: set to one if the on/off signal is on when GPIO is low.
- *
- * This struct must be added to the platform device in the board code. It is
- * used by the atmel-pwm-bl driver to setup the GPIO to control on/off and the
- * PWM device.
- */
-struct atmel_pwm_bl_platform_data {
-       unsigned int pwm_channel;
-       unsigned int pwm_frequency;
-       unsigned int pwm_compare_max;
-       unsigned int pwm_duty_max;
-       unsigned int pwm_duty_min;
-       unsigned int pwm_active_low;
-       int gpio_on;
-       unsigned int on_active_low;
-};
-
-#endif /* __INCLUDE_ATMEL_PWM_BL_H */
diff --git a/include/linux/atmel_pwm.h b/include/linux/atmel_pwm.h
deleted file mode 100644 (file)
index ea04abb..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-#ifndef __LINUX_ATMEL_PWM_H
-#define __LINUX_ATMEL_PWM_H
-
-/**
- * struct pwm_channel - driver handle to a PWM channel
- * @regs: base of this channel's registers
- * @index: number of this channel (0..31)
- * @mck: base clock rate, which can be prescaled and maybe subdivided
- *
- * Drivers initialize a pwm_channel structure using pwm_channel_alloc().
- * Then they configure its clock rate (derived from MCK), alignment,
- * polarity, and duty cycle by writing directly to the channel registers,
- * before enabling the channel by calling pwm_channel_enable().
- *
- * After emitting a PWM signal for the desired length of time, drivers
- * may then pwm_channel_disable() or pwm_channel_free().  Both of these
- * disable the channel, but when it's freed the IRQ is deconfigured and
- * the channel must later be re-allocated and reconfigured.
- *
- * Note that if the period or duty cycle need to be changed while the
- * PWM channel is operating, drivers must use the PWM_CUPD double buffer
- * mechanism, either polling until they change or getting implicitly
- * notified through a once-per-period interrupt handler.
- */
-struct pwm_channel {
-       void __iomem    *regs;
-       unsigned        index;
-       unsigned long   mck;
-};
-
-extern int pwm_channel_alloc(int index, struct pwm_channel *ch);
-extern int pwm_channel_free(struct pwm_channel *ch);
-
-extern int pwm_clk_alloc(unsigned prescale, unsigned div);
-extern void pwm_clk_free(unsigned clk);
-
-extern int __pwm_channel_onoff(struct pwm_channel *ch, int enabled);
-
-#define pwm_channel_enable(ch) __pwm_channel_onoff((ch), 1)
-#define pwm_channel_disable(ch)        __pwm_channel_onoff((ch), 0)
-
-/* periodic interrupts, mostly for CUPD changes to period or cycle */
-extern int pwm_channel_handler(struct pwm_channel *ch,
-               void (*handler)(struct pwm_channel *ch));
-
-/* per-channel registers (banked at pwm_channel->regs) */
-#define PWM_CMR                0x00            /* mode register */
-#define                PWM_CPR_CPD     (1 << 10)       /* set: CUPD modifies period */
-#define                PWM_CPR_CPOL    (1 << 9)        /* set: idle high */
-#define                PWM_CPR_CALG    (1 << 8)        /* set: center align */
-#define                PWM_CPR_CPRE    (0xf << 0)      /* mask: rate is mck/(2^pre) */
-#define                PWM_CPR_CLKA    (0xb << 0)      /* rate CLKA */
-#define                PWM_CPR_CLKB    (0xc << 0)      /* rate CLKB */
-#define PWM_CDTY       0x04            /* duty cycle (max of CPRD) */
-#define PWM_CPRD       0x08            /* period (count up from zero) */
-#define PWM_CCNT       0x0c            /* counter (20 bits?) */
-#define PWM_CUPD       0x10            /* update CPRD (or CDTY) next period */
-
-static inline void
-pwm_channel_writel(struct pwm_channel *pwmc, unsigned offset, u32 val)
-{
-       __raw_writel(val, pwmc->regs + offset);
-}
-
-static inline u32 pwm_channel_readl(struct pwm_channel *pwmc, unsigned offset)
-{
-       return __raw_readl(pwmc->regs + offset);
-}
-
-#endif /* __LINUX_ATMEL_PWM_H */
index d2b52999e7717252a743204817ef726fd94a3567..bb9840fd1e18855305241daca6cc6a68ce18a066 100644 (file)
@@ -164,12 +164,15 @@ int host1x_job_submit(struct host1x_job *job);
  */
 
 struct host1x_reloc {
-       struct host1x_bo *cmdbuf;
-       u32 cmdbuf_offset;
-       struct host1x_bo *target;
-       u32 target_offset;
-       u32 shift;
-       u32 pad;
+       struct {
+               struct host1x_bo *bo;
+               unsigned long offset;
+       } cmdbuf;
+       struct {
+               struct host1x_bo *bo;
+               unsigned long offset;
+       } target;
+       unsigned long shift;
 };
 
 struct host1x_job {
index ec4e3bd83d474e581bb3e4607c3c9c5f4e5319c8..a4c33b34fe3f0c7f3366a320c6df4534001c24b7 100644 (file)
@@ -325,24 +325,7 @@ struct kvm_kernel_irq_routing_entry {
        struct hlist_node link;
 };
 
-#ifdef CONFIG_HAVE_KVM_IRQ_ROUTING
-
-struct kvm_irq_routing_table {
-       int chip[KVM_NR_IRQCHIPS][KVM_IRQCHIP_NUM_PINS];
-       struct kvm_kernel_irq_routing_entry *rt_entries;
-       u32 nr_rt_entries;
-       /*
-        * Array indexed by gsi. Each entry contains list of irq chips
-        * the gsi is connected to.
-        */
-       struct hlist_head map[0];
-};
-
-#else
-
-struct kvm_irq_routing_table {};
-
-#endif
+struct kvm_irq_routing_table;
 
 #ifndef KVM_PRIVATE_MEM_SLOTS
 #define KVM_PRIVATE_MEM_SLOTS 0
@@ -401,11 +384,12 @@ struct kvm {
        struct mutex irq_lock;
 #ifdef CONFIG_HAVE_KVM_IRQCHIP
        /*
-        * Update side is protected by irq_lock and,
-        * if configured, irqfds.lock.
+        * Update side is protected by irq_lock.
         */
        struct kvm_irq_routing_table __rcu *irq_routing;
        struct hlist_head mask_notifier_list;
+#endif
+#ifdef CONFIG_HAVE_KVM_IRQFD
        struct hlist_head irq_ack_notifier_list;
 #endif
 
@@ -455,7 +439,7 @@ void kvm_vcpu_uninit(struct kvm_vcpu *vcpu);
 int __must_check vcpu_load(struct kvm_vcpu *vcpu);
 void vcpu_put(struct kvm_vcpu *vcpu);
 
-#ifdef CONFIG_HAVE_KVM_IRQ_ROUTING
+#ifdef CONFIG_HAVE_KVM_IRQFD
 int kvm_irqfd_init(void);
 void kvm_irqfd_exit(void);
 #else
@@ -602,7 +586,7 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
                         unsigned int ioctl, unsigned long arg);
 int kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf);
 
-int kvm_dev_ioctl_check_extension(long ext);
+int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext);
 
 int kvm_get_dirty_log(struct kvm *kvm,
                        struct kvm_dirty_log *log, int *is_dirty);
@@ -752,6 +736,10 @@ void kvm_unregister_irq_mask_notifier(struct kvm *kvm, int irq,
 void kvm_fire_mask_notifiers(struct kvm *kvm, unsigned irqchip, unsigned pin,
                             bool mask);
 
+int kvm_irq_map_gsi(struct kvm *kvm,
+                   struct kvm_kernel_irq_routing_entry *entries, int gsi);
+int kvm_irq_map_chip_pin(struct kvm *kvm, unsigned irqchip, unsigned pin);
+
 int kvm_set_irq(struct kvm *kvm, int irq_source_id, u32 irq, int level,
                bool line_status);
 int kvm_set_irq_inatomic(struct kvm *kvm, int irq_source_id, u32 irq, int level);
@@ -942,28 +930,27 @@ int kvm_set_irq_routing(struct kvm *kvm,
                        const struct kvm_irq_routing_entry *entries,
                        unsigned nr,
                        unsigned flags);
-int kvm_set_routing_entry(struct kvm_irq_routing_table *rt,
-                         struct kvm_kernel_irq_routing_entry *e,
+int kvm_set_routing_entry(struct kvm_kernel_irq_routing_entry *e,
                          const struct kvm_irq_routing_entry *ue);
 void kvm_free_irq_routing(struct kvm *kvm);
 
-int kvm_send_userspace_msi(struct kvm *kvm, struct kvm_msi *msi);
-
 #else
 
 static inline void kvm_free_irq_routing(struct kvm *kvm) {}
 
 #endif
 
+int kvm_send_userspace_msi(struct kvm *kvm, struct kvm_msi *msi);
+
 #ifdef CONFIG_HAVE_KVM_EVENTFD
 
 void kvm_eventfd_init(struct kvm *kvm);
 int kvm_ioeventfd(struct kvm *kvm, struct kvm_ioeventfd *args);
 
-#ifdef CONFIG_HAVE_KVM_IRQCHIP
+#ifdef CONFIG_HAVE_KVM_IRQFD
 int kvm_irqfd(struct kvm *kvm, struct kvm_irqfd *args);
 void kvm_irqfd_release(struct kvm *kvm);
-void kvm_irq_routing_update(struct kvm *, struct kvm_irq_routing_table *);
+void kvm_irq_routing_update(struct kvm *);
 #else
 static inline int kvm_irqfd(struct kvm *kvm, struct kvm_irqfd *args)
 {
@@ -985,10 +972,8 @@ static inline int kvm_irqfd(struct kvm *kvm, struct kvm_irqfd *args)
 static inline void kvm_irqfd_release(struct kvm *kvm) {}
 
 #ifdef CONFIG_HAVE_KVM_IRQCHIP
-static inline void kvm_irq_routing_update(struct kvm *kvm,
-                                         struct kvm_irq_routing_table *irq_rt)
+static inline void kvm_irq_routing_update(struct kvm *kvm)
 {
-       rcu_assign_pointer(kvm->irq_routing, irq_rt);
 }
 #endif
 
index 0287ab2966899ad1e65daa072629398d66b6e791..6a599dce7f9d4678e4f6f7f082514308f0636942 100644 (file)
@@ -15,7 +15,6 @@
 #include <linux/list.h>
 #include <linux/spinlock.h>
 #include <linux/rwsem.h>
-#include <linux/timer.h>
 #include <linux/workqueue.h>
 
 struct device;
@@ -63,11 +62,13 @@ struct led_classdev {
                                     unsigned long *delay_off);
 
        struct device           *dev;
+       const struct attribute_group    **groups;
+
        struct list_head         node;                  /* LED Device list */
        const char              *default_trigger;       /* Trigger to use */
 
        unsigned long            blink_delay_on, blink_delay_off;
-       struct timer_list        blink_timer;
+       struct delayed_work      blink_work;
        int                      blink_brightness;
 
        struct work_struct      set_brightness_work;
index 4e7fe7417fc96daf9ffc166b26e2d1be34482c56..9475fee2bfc59811b74414599da788409e7e1dd1 100644 (file)
@@ -505,6 +505,7 @@ static inline int is_ab9540_2p0_or_earlier(struct ab8500 *ab)
 void ab8500_override_turn_on_stat(u8 mask, u8 set);
 
 #ifdef CONFIG_AB8500_DEBUG
+extern int prcmu_abb_read(u8 slave, u8 reg, u8 *value, u8 size);
 void ab8500_dump_all_banks(struct device *dev);
 void ab8500_debug_register_interrupt(int line);
 #else
index a614b33d0a3943906c50c608e2046b65a00d7f04..f34723f7663c722c6983dcda572f7d342def4b74 100644 (file)
@@ -18,7 +18,7 @@
 #include <linux/regulator/consumer.h>
 #include <linux/mfd/arizona/pdata.h>
 
-#define ARIZONA_MAX_CORE_SUPPLIES 3
+#define ARIZONA_MAX_CORE_SUPPLIES 2
 
 enum arizona_type {
        WM5102 = 1,
@@ -46,8 +46,8 @@ enum arizona_type {
 #define ARIZONA_IRQ_DSP_IRQ6              17
 #define ARIZONA_IRQ_DSP_IRQ7              18
 #define ARIZONA_IRQ_DSP_IRQ8              19
-#define ARIZONA_IRQ_SPK_SHUTDOWN_WARN     20
-#define ARIZONA_IRQ_SPK_SHUTDOWN          21
+#define ARIZONA_IRQ_SPK_OVERHEAT_WARN     20
+#define ARIZONA_IRQ_SPK_OVERHEAT          21
 #define ARIZONA_IRQ_MICDET                22
 #define ARIZONA_IRQ_HPDET                 23
 #define ARIZONA_IRQ_WSEQ_DONE             24
@@ -78,8 +78,31 @@ enum arizona_type {
 #define ARIZONA_IRQ_FLL1_CLOCK_OK         49
 #define ARIZONA_IRQ_MICD_CLAMP_RISE      50
 #define ARIZONA_IRQ_MICD_CLAMP_FALL      51
-
-#define ARIZONA_NUM_IRQ                   52
+#define ARIZONA_IRQ_HP3R_DONE             52
+#define ARIZONA_IRQ_HP3L_DONE             53
+#define ARIZONA_IRQ_HP2R_DONE             54
+#define ARIZONA_IRQ_HP2L_DONE             55
+#define ARIZONA_IRQ_HP1R_DONE             56
+#define ARIZONA_IRQ_HP1L_DONE             57
+#define ARIZONA_IRQ_ISRC3_CFG_ERR         58
+#define ARIZONA_IRQ_DSP_SHARED_WR_COLL    59
+#define ARIZONA_IRQ_SPK_SHUTDOWN          60
+#define ARIZONA_IRQ_SPK1R_SHORT           61
+#define ARIZONA_IRQ_SPK1L_SHORT           62
+#define ARIZONA_IRQ_HP3R_SC_NEG           63
+#define ARIZONA_IRQ_HP3R_SC_POS           64
+#define ARIZONA_IRQ_HP3L_SC_NEG           65
+#define ARIZONA_IRQ_HP3L_SC_POS           66
+#define ARIZONA_IRQ_HP2R_SC_NEG           67
+#define ARIZONA_IRQ_HP2R_SC_POS           68
+#define ARIZONA_IRQ_HP2L_SC_NEG           69
+#define ARIZONA_IRQ_HP2L_SC_POS           70
+#define ARIZONA_IRQ_HP1R_SC_NEG           71
+#define ARIZONA_IRQ_HP1R_SC_POS           72
+#define ARIZONA_IRQ_HP1L_SC_NEG           73
+#define ARIZONA_IRQ_HP1L_SC_POS           74
+
+#define ARIZONA_NUM_IRQ                   75
 
 struct snd_soc_dapm_context;
 
@@ -109,6 +132,8 @@ struct arizona {
        struct mutex clk_lock;
        int clk32k_ref;
 
+       bool ctrlif_error;
+
        struct snd_soc_dapm_context *dapm;
 
        int tdm_width[ARIZONA_MAX_AIF];
index 7204d8138b246b81ffbd5635facbe0e88a93ad40..dbd23c36de21f8e8bc734d01654e5d83e2cdff66 100644 (file)
 #define ARIZONA_INTERRUPT_STATUS_3               0xD02
 #define ARIZONA_INTERRUPT_STATUS_4               0xD03
 #define ARIZONA_INTERRUPT_STATUS_5               0xD04
+#define ARIZONA_INTERRUPT_STATUS_6               0xD05
 #define ARIZONA_INTERRUPT_STATUS_1_MASK          0xD08
 #define ARIZONA_INTERRUPT_STATUS_2_MASK          0xD09
 #define ARIZONA_INTERRUPT_STATUS_3_MASK          0xD0A
 #define ARIZONA_INTERRUPT_STATUS_4_MASK          0xD0B
 #define ARIZONA_INTERRUPT_STATUS_5_MASK          0xD0C
+#define ARIZONA_INTERRUPT_STATUS_6_MASK          0xD0D
 #define ARIZONA_INTERRUPT_CONTROL                0xD0F
 #define ARIZONA_IRQ2_STATUS_1                    0xD10
 #define ARIZONA_IRQ2_STATUS_2                    0xD11
 #define ARIZONA_IRQ2_STATUS_3                    0xD12
 #define ARIZONA_IRQ2_STATUS_4                    0xD13
 #define ARIZONA_IRQ2_STATUS_5                    0xD14
+#define ARIZONA_IRQ2_STATUS_6                    0xD15
 #define ARIZONA_IRQ2_STATUS_1_MASK               0xD18
 #define ARIZONA_IRQ2_STATUS_2_MASK               0xD19
 #define ARIZONA_IRQ2_STATUS_3_MASK               0xD1A
 #define ARIZONA_IRQ2_STATUS_4_MASK               0xD1B
 #define ARIZONA_IRQ2_STATUS_5_MASK               0xD1C
+#define ARIZONA_IRQ2_STATUS_6_MASK               0xD1D
 #define ARIZONA_IRQ2_CONTROL                     0xD1F
 #define ARIZONA_INTERRUPT_RAW_STATUS_2           0xD20
 #define ARIZONA_INTERRUPT_RAW_STATUS_3           0xD21
 #define ARIZONA_INTERRUPT_RAW_STATUS_6           0xD24
 #define ARIZONA_INTERRUPT_RAW_STATUS_7           0xD25
 #define ARIZONA_INTERRUPT_RAW_STATUS_8           0xD26
+#define ARIZONA_INTERRUPT_RAW_STATUS_9           0xD28
 #define ARIZONA_IRQ_PIN_STATUS                   0xD40
 #define ARIZONA_ADSP2_IRQ0                       0xD41
 #define ARIZONA_AOD_WKUP_AND_TRIG                0xD50
 /*
  * R3330 (0xD02) - Interrupt Status 3
  */
-#define ARIZONA_SPK_SHUTDOWN_WARN_EINT1          0x8000  /* SPK_SHUTDOWN_WARN_EINT1 */
-#define ARIZONA_SPK_SHUTDOWN_WARN_EINT1_MASK     0x8000  /* SPK_SHUTDOWN_WARN_EINT1 */
-#define ARIZONA_SPK_SHUTDOWN_WARN_EINT1_SHIFT        15  /* SPK_SHUTDOWN_WARN_EINT1 */
-#define ARIZONA_SPK_SHUTDOWN_WARN_EINT1_WIDTH         1  /* SPK_SHUTDOWN_WARN_EINT1 */
-#define ARIZONA_SPK_SHUTDOWN_EINT1               0x4000  /* SPK_SHUTDOWN_EINT1 */
-#define ARIZONA_SPK_SHUTDOWN_EINT1_MASK          0x4000  /* SPK_SHUTDOWN_EINT1 */
-#define ARIZONA_SPK_SHUTDOWN_EINT1_SHIFT             14  /* SPK_SHUTDOWN_EINT1 */
-#define ARIZONA_SPK_SHUTDOWN_EINT1_WIDTH              1  /* SPK_SHUTDOWN_EINT1 */
+#define ARIZONA_SPK_OVERHEAT_WARN_EINT1          0x8000  /* SPK_OVERHEAT_WARN_EINT1 */
+#define ARIZONA_SPK_OVERHEAT_WARN_EINT1_MASK     0x8000  /* SPK_OVERHEAD_WARN_EINT1 */
+#define ARIZONA_SPK_OVERHEAT_WARN_EINT1_SHIFT        15  /* SPK_OVERHEAT_WARN_EINT1 */
+#define ARIZONA_SPK_OVERHEAT_WARN_EINT1_WIDTH         1  /* SPK_OVERHEAT_WARN_EINT1 */
+#define ARIZONA_SPK_OVERHEAT_EINT1               0x4000  /* SPK_OVERHEAT_EINT1 */
+#define ARIZONA_SPK_OVERHEAT_EINT1_MASK          0x4000  /* SPK_OVERHEAT_EINT1 */
+#define ARIZONA_SPK_OVERHEAT_EINT1_SHIFT             14  /* SPK_OVERHEAT_EINT1 */
+#define ARIZONA_SPK_OVERHEAT_EINT1_WIDTH              1  /* SPK_OVERHEAT_EINT1 */
 #define ARIZONA_HPDET_EINT1                      0x2000  /* HPDET_EINT1 */
 #define ARIZONA_HPDET_EINT1_MASK                 0x2000  /* HPDET_EINT1 */
 #define ARIZONA_HPDET_EINT1_SHIFT                    13  /* HPDET_EINT1 */
 #define ARIZONA_ISRC2_CFG_ERR_EINT1_MASK         0x0040  /* ISRC2_CFG_ERR_EINT1 */
 #define ARIZONA_ISRC2_CFG_ERR_EINT1_SHIFT             6  /* ISRC2_CFG_ERR_EINT1 */
 #define ARIZONA_ISRC2_CFG_ERR_EINT1_WIDTH             1  /* ISRC2_CFG_ERR_EINT1 */
+#define ARIZONA_HP3R_DONE_EINT1                  0x0020  /* HP3R_DONE_EINT1 */
+#define ARIZONA_HP3R_DONE_EINT1_MASK             0x0020  /* HP3R_DONE_EINT1 */
+#define ARIZONA_HP3R_DONE_EINT1_SHIFT                 5  /* HP3R_DONE_EINT1 */
+#define ARIZONA_HP3R_DONE_EINT1_WIDTH                 1  /* HP3R_DONE_EINT1 */
+#define ARIZONA_HP3L_DONE_EINT1                  0x0010  /* HP3L_DONE_EINT1 */
+#define ARIZONA_HP3L_DONE_EINT1_MASK             0x0010  /* HP3L_DONE_EINT1 */
+#define ARIZONA_HP3L_DONE_EINT1_SHIFT                 4  /* HP3L_DONE_EINT1 */
+#define ARIZONA_HP3L_DONE_EINT1_WIDTH                 1  /* HP3L_DONE_EINT1 */
+#define ARIZONA_HP2R_DONE_EINT1                  0x0008  /* HP2R_DONE_EINT1 */
+#define ARIZONA_HP2R_DONE_EINT1_MASK             0x0008  /* HP2R_DONE_EINT1 */
+#define ARIZONA_HP2R_DONE_EINT1_SHIFT                 3  /* HP2R_DONE_EINT1 */
+#define ARIZONA_HP2R_DONE_EINT1_WIDTH                 1  /* HP2R_DONE_EINT1 */
+#define ARIZONA_HP2L_DONE_EINT1                  0x0004  /* HP2L_DONE_EINT1 */
+#define ARIZONA_HP2L_DONE_EINT1_MASK             0x0004  /* HP2L_DONE_EINT1 */
+#define ARIZONA_HP2L_DONE_EINT1_SHIFT                 2  /* HP2L_DONE_EINT1 */
+#define ARIZONA_HP2L_DONE_EINT1_WIDTH                 1  /* HP2L_DONE_EINT1 */
+#define ARIZONA_HP1R_DONE_EINT1                  0x0002  /* HP1R_DONE_EINT1 */
+#define ARIZONA_HP1R_DONE_EINT1_MASK             0x0002  /* HP1R_DONE_EINT1 */
+#define ARIZONA_HP1R_DONE_EINT1_SHIFT                 1  /* HP1R_DONE_EINT1 */
+#define ARIZONA_HP1R_DONE_EINT1_WIDTH                 1  /* HP1R_DONE_EINT1 */
+#define ARIZONA_HP1L_DONE_EINT1                  0x0001  /* HP1L_DONE_EINT1 */
+#define ARIZONA_HP1L_DONE_EINT1_MASK             0x0001  /* HP1L_DONE_EINT1 */
+#define ARIZONA_HP1L_DONE_EINT1_SHIFT                 0  /* HP1L_DONE_EINT1 */
+#define ARIZONA_HP1L_DONE_EINT1_WIDTH                 1  /* HP1L_DONE_EINT1 */
+
+/*
+ * R3331 (0xD03) - Interrupt Status 4 (Alternate layout)
+ *
+ * Alternate layout used on later devices, note only fields that have moved
+ * are specified
+ */
+#define ARIZONA_V2_AIF3_ERR_EINT1                  0x8000  /* AIF3_ERR_EINT1 */
+#define ARIZONA_V2_AIF3_ERR_EINT1_MASK             0x8000  /* AIF3_ERR_EINT1 */
+#define ARIZONA_V2_AIF3_ERR_EINT1_SHIFT                15  /* AIF3_ERR_EINT1 */
+#define ARIZONA_V2_AIF3_ERR_EINT1_WIDTH                 1  /* AIF3_ERR_EINT1 */
+#define ARIZONA_V2_AIF2_ERR_EINT1                  0x4000  /* AIF2_ERR_EINT1 */
+#define ARIZONA_V2_AIF2_ERR_EINT1_MASK             0x4000  /* AIF2_ERR_EINT1 */
+#define ARIZONA_V2_AIF2_ERR_EINT1_SHIFT                14  /* AIF2_ERR_EINT1 */
+#define ARIZONA_V2_AIF2_ERR_EINT1_WIDTH                 1  /* AIF2_ERR_EINT1 */
+#define ARIZONA_V2_AIF1_ERR_EINT1                  0x2000  /* AIF1_ERR_EINT1 */
+#define ARIZONA_V2_AIF1_ERR_EINT1_MASK             0x2000  /* AIF1_ERR_EINT1 */
+#define ARIZONA_V2_AIF1_ERR_EINT1_SHIFT                13  /* AIF1_ERR_EINT1 */
+#define ARIZONA_V2_AIF1_ERR_EINT1_WIDTH                 1  /* AIF1_ERR_EINT1 */
+#define ARIZONA_V2_CTRLIF_ERR_EINT1                0x1000  /* CTRLIF_ERR_EINT1 */
+#define ARIZONA_V2_CTRLIF_ERR_EINT1_MASK           0x1000  /* CTRLIF_ERR_EINT1 */
+#define ARIZONA_V2_CTRLIF_ERR_EINT1_SHIFT              12  /* CTRLIF_ERR_EINT1 */
+#define ARIZONA_V2_CTRLIF_ERR_EINT1_WIDTH               1  /* CTRLIF_ERR_EINT1 */
+#define ARIZONA_V2_MIXER_DROPPED_SAMPLE_EINT1      0x0800  /* MIXER_DROPPED_SAMPLE_EINT1 */
+#define ARIZONA_V2_MIXER_DROPPED_SAMPLE_EINT1_MASK 0x0800  /* MIXER_DROPPED_SAMPLE_EINT1 */
+#define ARIZONA_V2_MIXER_DROPPED_SAMPLE_EINT1_SHIFT    11  /* MIXER_DROPPED_SAMPLE_EINT1 */
+#define ARIZONA_V2_MIXER_DROPPED_SAMPLE_EINT1_WIDTH     1  /* MIXER_DROPPED_SAMPLE_EINT1 */
+#define ARIZONA_V2_ASYNC_CLK_ENA_LOW_EINT1         0x0400  /* ASYNC_CLK_ENA_LOW_EINT1 */
+#define ARIZONA_V2_ASYNC_CLK_ENA_LOW_EINT1_MASK    0x0400  /* ASYNC_CLK_ENA_LOW_EINT1 */
+#define ARIZONA_V2_ASYNC_CLK_ENA_LOW_EINT1_SHIFT       10  /* ASYNC_CLK_ENA_LOW_EINT1 */
+#define ARIZONA_V2_ASYNC_CLK_ENA_LOW_EINT1_WIDTH        1  /* ASYNC_CLK_ENA_LOW_EINT1 */
+#define ARIZONA_V2_SYSCLK_ENA_LOW_EINT1            0x0200  /* SYSCLK_ENA_LOW_EINT1 */
+#define ARIZONA_V2_SYSCLK_ENA_LOW_EINT1_MASK       0x0200  /* SYSCLK_ENA_LOW_EINT1 */
+#define ARIZONA_V2_SYSCLK_ENA_LOW_EINT1_SHIFT           9  /* SYSCLK_ENA_LOW_EINT1 */
+#define ARIZONA_V2_SYSCLK_ENA_LOW_EINT1_WIDTH           1  /* SYSCLK_ENA_LOW_EINT1 */
+#define ARIZONA_V2_ISRC1_CFG_ERR_EINT1             0x0100  /* ISRC1_CFG_ERR_EINT1 */
+#define ARIZONA_V2_ISRC1_CFG_ERR_EINT1_MASK        0x0100  /* ISRC1_CFG_ERR_EINT1 */
+#define ARIZONA_V2_ISRC1_CFG_ERR_EINT1_SHIFT            8  /* ISRC1_CFG_ERR_EINT1 */
+#define ARIZONA_V2_ISRC1_CFG_ERR_EINT1_WIDTH            1  /* ISRC1_CFG_ERR_EINT1 */
+#define ARIZONA_V2_ISRC2_CFG_ERR_EINT1             0x0080  /* ISRC2_CFG_ERR_EINT1 */
+#define ARIZONA_V2_ISRC2_CFG_ERR_EINT1_MASK        0x0080  /* ISRC2_CFG_ERR_EINT1 */
+#define ARIZONA_V2_ISRC2_CFG_ERR_EINT1_SHIFT            7  /* ISRC2_CFG_ERR_EINT1 */
+#define ARIZONA_V2_ISRC2_CFG_ERR_EINT1_WIDTH            1  /* ISRC2_CFG_ERR_EINT1 */
+#define ARIZONA_V2_ISRC3_CFG_ERR_EINT1             0x0040  /* ISRC3_CFG_ERR_EINT1 */
+#define ARIZONA_V2_ISRC3_CFG_ERR_EINT1_MASK        0x0040  /* ISRC3_CFG_ERR_EINT1 */
+#define ARIZONA_V2_ISRC3_CFG_ERR_EINT1_SHIFT            6  /* ISRC3_CFG_ERR_EINT1 */
+#define ARIZONA_V2_ISRC3_CFG_ERR_EINT1_WIDTH            1  /* ISRC3_CFG_ERR_EINT1 */
 
 /*
  * R3332 (0xD04) - Interrupt Status 5
 #define ARIZONA_FLL1_CLOCK_OK_EINT1_SHIFT             0  /* FLL1_CLOCK_OK_EINT1 */
 #define ARIZONA_FLL1_CLOCK_OK_EINT1_WIDTH             1  /* FLL1_CLOCK_OK_EINT1 */
 
+/*
+ * R3332 (0xD05) - Interrupt Status 5 (Alternate layout)
+ *
+ * Alternate layout used on later devices, note only fields that have moved
+ * are specified
+ */
+#define ARIZONA_V2_ASRC_CFG_ERR_EINT1            0x0008  /* ASRC_CFG_ERR_EINT1 */
+#define ARIZONA_V2_ASRC_CFG_ERR_EINT1_MASK       0x0008  /* ASRC_CFG_ERR_EINT1 */
+#define ARIZONA_V2_ASRC_CFG_ERR_EINT1_SHIFT           3  /* ASRC_CFG_ERR_EINT1 */
+#define ARIZONA_V2_ASRC_CFG_ERR_EINT1_WIDTH           1  /* ASRC_CFG_ERR_EINT1 */
+
+/*
+ * R3333 (0xD05) - Interrupt Status 6
+ */
+#define ARIZONA_DSP_SHARED_WR_COLL_EINT1         0x8000  /* DSP_SHARED_WR_COLL_EINT1 */
+#define ARIZONA_DSP_SHARED_WR_COLL_EINT1_MASK    0x8000  /* DSP_SHARED_WR_COLL_EINT1 */
+#define ARIZONA_DSP_SHARED_WR_COLL_EINT1_SHIFT       15  /* DSP_SHARED_WR_COLL_EINT1 */
+#define ARIZONA_DSP_SHARED_WR_COLL_EINT1_WIDTH        1  /* DSP_SHARED_WR_COLL_EINT1 */
+#define ARIZONA_SPK_SHUTDOWN_EINT1               0x4000  /* SPK_SHUTDOWN_EINT1 */
+#define ARIZONA_SPK_SHUTDOWN_EINT1_MASK          0x4000  /* SPK_SHUTDOWN_EINT1 */
+#define ARIZONA_SPK_SHUTDOWN_EINT1_SHIFT             14  /* SPK_SHUTDOWN_EINT1 */
+#define ARIZONA_SPK_SHUTDOWN_EINT1_WIDTH              1  /* SPK_SHUTDOWN_EINT1 */
+#define ARIZONA_SPK1R_SHORT_EINT1                0x2000  /* SPK1R_SHORT_EINT1 */
+#define ARIZONA_SPK1R_SHORT_EINT1_MASK           0x2000  /* SPK1R_SHORT_EINT1 */
+#define ARIZONA_SPK1R_SHORT_EINT1_SHIFT              13  /* SPK1R_SHORT_EINT1 */
+#define ARIZONA_SPK1R_SHORT_EINT1_WIDTH               1  /* SPK1R_SHORT_EINT1 */
+#define ARIZONA_SPK1L_SHORT_EINT1                0x1000  /* SPK1L_SHORT_EINT1 */
+#define ARIZONA_SPK1L_SHORT_EINT1_MASK           0x1000  /* SPK1L_SHORT_EINT1 */
+#define ARIZONA_SPK1L_SHORT_EINT1_SHIFT              12  /* SPK1L_SHORT_EINT1 */
+#define ARIZONA_SPK1L_SHORT_EINT1_WIDTH               1  /* SPK1L_SHORT_EINT1 */
+#define ARIZONA_HP3R_SC_NEG_EINT1                0x0800  /* HP3R_SC_NEG_EINT1 */
+#define ARIZONA_HP3R_SC_NEG_EINT1_MASK           0x0800  /* HP3R_SC_NEG_EINT1 */
+#define ARIZONA_HP3R_SC_NEG_EINT1_SHIFT              11  /* HP3R_SC_NEG_EINT1 */
+#define ARIZONA_HP3R_SC_NEG_EINT1_WIDTH               1  /* HP3R_SC_NEG_EINT1 */
+#define ARIZONA_HP3R_SC_POS_EINT1                0x0400  /* HP3R_SC_POS_EINT1 */
+#define ARIZONA_HP3R_SC_POS_EINT1_MASK           0x0400  /* HP3R_SC_POS_EINT1 */
+#define ARIZONA_HP3R_SC_POS_EINT1_SHIFT              10  /* HP3R_SC_POS_EINT1 */
+#define ARIZONA_HP3R_SC_POS_EINT1_WIDTH               1  /* HP3R_SC_POS_EINT1 */
+#define ARIZONA_HP3L_SC_NEG_EINT1                0x0200  /* HP3L_SC_NEG_EINT1 */
+#define ARIZONA_HP3L_SC_NEG_EINT1_MASK           0x0200  /* HP3L_SC_NEG_EINT1 */
+#define ARIZONA_HP3L_SC_NEG_EINT1_SHIFT               9  /* HP3L_SC_NEG_EINT1 */
+#define ARIZONA_HP3L_SC_NEG_EINT1_WIDTH               1  /* HP3L_SC_NEG_EINT1 */
+#define ARIZONA_HP3L_SC_POS_EINT1                0x0100  /* HP3L_SC_POS_EINT1 */
+#define ARIZONA_HP3L_SC_POS_EINT1_MASK           0x0100  /* HP3L_SC_POS_EINT1 */
+#define ARIZONA_HP3L_SC_POS_EINT1_SHIFT               8  /* HP3L_SC_POS_EINT1 */
+#define ARIZONA_HP3L_SC_POS_EINT1_WIDTH               1  /* HP3L_SC_POS_EINT1 */
+#define ARIZONA_HP2R_SC_NEG_EINT1                0x0080  /* HP2R_SC_NEG_EINT1 */
+#define ARIZONA_HP2R_SC_NEG_EINT1_MASK           0x0080  /* HP2R_SC_NEG_EINT1 */
+#define ARIZONA_HP2R_SC_NEG_EINT1_SHIFT               7  /* HP2R_SC_NEG_EINT1 */
+#define ARIZONA_HP2R_SC_NEG_EINT1_WIDTH               1  /* HP2R_SC_NEG_EINT1 */
+#define ARIZONA_HP2R_SC_POS_EINT1                0x0040  /* HP2R_SC_POS_EINT1 */
+#define ARIZONA_HP2R_SC_POS_EINT1_MASK           0x0040  /* HP2R_SC_POS_EINT1 */
+#define ARIZONA_HP2R_SC_POS_EINT1_SHIFT               6  /* HP2R_SC_POS_EINT1 */
+#define ARIZONA_HP2R_SC_POS_EINT1_WIDTH               1  /* HP2R_SC_POS_EINT1 */
+#define ARIZONA_HP2L_SC_NEG_EINT1                0x0020  /* HP2L_SC_NEG_EINT1 */
+#define ARIZONA_HP2L_SC_NEG_EINT1_MASK           0x0020  /* HP2L_SC_NEG_EINT1 */
+#define ARIZONA_HP2L_SC_NEG_EINT1_SHIFT               5  /* HP2L_SC_NEG_EINT1 */
+#define ARIZONA_HP2L_SC_NEG_EINT1_WIDTH               1  /* HP2L_SC_NEG_EINT1 */
+#define ARIZONA_HP2L_SC_POS_EINT1                0x0010  /* HP2L_SC_POS_EINT1 */
+#define ARIZONA_HP2L_SC_POS_EINT1_MASK           0x0010  /* HP2L_SC_POS_EINT1 */
+#define ARIZONA_HP2L_SC_POS_EINT1_SHIFT               4  /* HP2L_SC_POS_EINT1 */
+#define ARIZONA_HP2L_SC_POS_EINT1_WIDTH               1  /* HP2L_SC_POS_EINT1 */
+#define ARIZONA_HP1R_SC_NEG_EINT1                0x0008  /* HP1R_SC_NEG_EINT1 */
+#define ARIZONA_HP1R_SC_NEG_EINT1_MASK           0x0008  /* HP1R_SC_NEG_EINT1 */
+#define ARIZONA_HP1R_SC_NEG_EINT1_SHIFT               3  /* HP1R_SC_NEG_EINT1 */
+#define ARIZONA_HP1R_SC_NEG_EINT1_WIDTH               1  /* HP1R_SC_NEG_EINT1 */
+#define ARIZONA_HP1R_SC_POS_EINT1                0x0004  /* HP1R_SC_POS_EINT1 */
+#define ARIZONA_HP1R_SC_POS_EINT1_MASK           0x0004  /* HP1R_SC_POS_EINT1 */
+#define ARIZONA_HP1R_SC_POS_EINT1_SHIFT               2  /* HP1R_SC_POS_EINT1 */
+#define ARIZONA_HP1R_SC_POS_EINT1_WIDTH               1  /* HP1R_SC_POS_EINT1 */
+#define ARIZONA_HP1L_SC_NEG_EINT1                0x0002  /* HP1L_SC_NEG_EINT1 */
+#define ARIZONA_HP1L_SC_NEG_EINT1_MASK           0x0002  /* HP1L_SC_NEG_EINT1 */
+#define ARIZONA_HP1L_SC_NEG_EINT1_SHIFT               1  /* HP1L_SC_NEG_EINT1 */
+#define ARIZONA_HP1L_SC_NEG_EINT1_WIDTH               1  /* HP1L_SC_NEG_EINT1 */
+#define ARIZONA_HP1L_SC_POS_EINT1                0x0001  /* HP1L_SC_POS_EINT1 */
+#define ARIZONA_HP1L_SC_POS_EINT1_MASK           0x0001  /* HP1L_SC_POS_EINT1 */
+#define ARIZONA_HP1L_SC_POS_EINT1_SHIFT               0  /* HP1L_SC_POS_EINT1 */
+#define ARIZONA_HP1L_SC_POS_EINT1_WIDTH               1  /* HP1L_SC_POS_EINT1 */
+
 /*
  * R3336 (0xD08) - Interrupt Status 1 Mask
  */
 /*
  * R3338 (0xD0A) - Interrupt Status 3 Mask
  */
-#define ARIZONA_IM_SPK_SHUTDOWN_WARN_EINT1       0x8000  /* IM_SPK_SHUTDOWN_WARN_EINT1 */
-#define ARIZONA_IM_SPK_SHUTDOWN_WARN_EINT1_MASK  0x8000  /* IM_SPK_SHUTDOWN_WARN_EINT1 */
-#define ARIZONA_IM_SPK_SHUTDOWN_WARN_EINT1_SHIFT     15  /* IM_SPK_SHUTDOWN_WARN_EINT1 */
-#define ARIZONA_IM_SPK_SHUTDOWN_WARN_EINT1_WIDTH      1  /* IM_SPK_SHUTDOWN_WARN_EINT1 */
-#define ARIZONA_IM_SPK_SHUTDOWN_EINT1            0x4000  /* IM_SPK_SHUTDOWN_EINT1 */
-#define ARIZONA_IM_SPK_SHUTDOWN_EINT1_MASK       0x4000  /* IM_SPK_SHUTDOWN_EINT1 */
-#define ARIZONA_IM_SPK_SHUTDOWN_EINT1_SHIFT          14  /* IM_SPK_SHUTDOWN_EINT1 */
-#define ARIZONA_IM_SPK_SHUTDOWN_EINT1_WIDTH           1  /* IM_SPK_SHUTDOWN_EINT1 */
+#define ARIZONA_IM_SPK_OVERHEAT_WARN_EINT1       0x8000  /* IM_SPK_OVERHEAT_WARN_EINT1 */
+#define ARIZONA_IM_SPK_OVERHEAT_WARN_EINT1_MASK  0x8000  /* IM_SPK_OVERHEAT_WARN_EINT1 */
+#define ARIZONA_IM_SPK_OVERHEAT_WARN_EINT1_SHIFT     15  /* IM_SPK_OVERHEAT_WARN_EINT1 */
+#define ARIZONA_IM_SPK_OVERHEAT_WARN_EINT1_WIDTH      1  /* IM_SPK_OVERHEAT_WARN_EINT1 */
+#define ARIZONA_IM_SPK_OVERHEAT_EINT1            0x4000  /* IM_SPK_OVERHEAT_EINT1 */
+#define ARIZONA_IM_SPK_OVERHEAT_EINT1_MASK       0x4000  /* IM_SPK_OVERHEAT_EINT1 */
+#define ARIZONA_IM_SPK_OVERHEAT_EINT1_SHIFT          14  /* IM_SPK_OVERHEAT_EINT1 */
+#define ARIZONA_IM_SPK_OVERHEAT_EINT1_WIDTH           1  /* IM_SPK_OVERHEAT_EINT1 */
 #define ARIZONA_IM_HPDET_EINT1                   0x2000  /* IM_HPDET_EINT1 */
 #define ARIZONA_IM_HPDET_EINT1_MASK              0x2000  /* IM_HPDET_EINT1 */
 #define ARIZONA_IM_HPDET_EINT1_SHIFT                 13  /* IM_HPDET_EINT1 */
 #define ARIZONA_IM_ISRC2_CFG_ERR_EINT1_MASK      0x0040  /* IM_ISRC2_CFG_ERR_EINT1 */
 #define ARIZONA_IM_ISRC2_CFG_ERR_EINT1_SHIFT          6  /* IM_ISRC2_CFG_ERR_EINT1 */
 #define ARIZONA_IM_ISRC2_CFG_ERR_EINT1_WIDTH          1  /* IM_ISRC2_CFG_ERR_EINT1 */
+#define ARIZONA_IM_HP3R_DONE_EINT1               0x0020  /* IM_HP3R_DONE_EINT1 */
+#define ARIZONA_IM_HP3R_DONE_EINT1_MASK          0x0020  /* IM_HP3R_DONE_EINT1 */
+#define ARIZONA_IM_HP3R_DONE_EINT1_SHIFT              5  /* IM_HP3R_DONE_EINT1 */
+#define ARIZONA_IM_HP3R_DONE_EINT1_WIDTH              1  /* IM_HP3R_DONE_EINT1 */
+#define ARIZONA_IM_HP3L_DONE_EINT1               0x0010  /* IM_HP3L_DONE_EINT1 */
+#define ARIZONA_IM_HP3L_DONE_EINT1_MASK          0x0010  /* IM_HP3L_DONE_EINT1 */
+#define ARIZONA_IM_HP3L_DONE_EINT1_SHIFT              4  /* IM_HP3L_DONE_EINT1 */
+#define ARIZONA_IM_HP3L_DONE_EINT1_WIDTH              1  /* IM_HP3L_DONE_EINT1 */
+#define ARIZONA_IM_HP2R_DONE_EINT1               0x0008  /* IM_HP2R_DONE_EINT1 */
+#define ARIZONA_IM_HP2R_DONE_EINT1_MASK          0x0008  /* IM_HP2R_DONE_EINT1 */
+#define ARIZONA_IM_HP2R_DONE_EINT1_SHIFT              3  /* IM_HP2R_DONE_EINT1 */
+#define ARIZONA_IM_HP2R_DONE_EINT1_WIDTH              1  /* IM_HP2R_DONE_EINT1 */
+#define ARIZONA_IM_HP2L_DONE_EINT1               0x0004  /* IM_HP2L_DONE_EINT1 */
+#define ARIZONA_IM_HP2L_DONE_EINT1_MASK          0x0004  /* IM_HP2L_DONE_EINT1 */
+#define ARIZONA_IM_HP2L_DONE_EINT1_SHIFT              2  /* IM_HP2L_DONE_EINT1 */
+#define ARIZONA_IM_HP2L_DONE_EINT1_WIDTH              1  /* IM_HP2L_DONE_EINT1 */
+#define ARIZONA_IM_HP1R_DONE_EINT1               0x0002  /* IM_HP1R_DONE_EINT1 */
+#define ARIZONA_IM_HP1R_DONE_EINT1_MASK          0x0002  /* IM_HP1R_DONE_EINT1 */
+#define ARIZONA_IM_HP1R_DONE_EINT1_SHIFT              1  /* IM_HP1R_DONE_EINT1 */
+#define ARIZONA_IM_HP1R_DONE_EINT1_WIDTH              1  /* IM_HP1R_DONE_EINT1 */
+#define ARIZONA_IM_HP1L_DONE_EINT1               0x0001  /* IM_HP1L_DONE_EINT1 */
+#define ARIZONA_IM_HP1L_DONE_EINT1_MASK          0x0001  /* IM_HP1L_DONE_EINT1 */
+#define ARIZONA_IM_HP1L_DONE_EINT1_SHIFT              0  /* IM_HP1L_DONE_EINT1 */
+#define ARIZONA_IM_HP1L_DONE_EINT1_WIDTH              1  /* IM_HP1L_DONE_EINT1 */
+
+/*
+ * R3339 (0xD0B) - Interrupt Status 4 Mask (Alternate layout)
+ *
+ * Alternate layout used on later devices, note only fields that have moved
+ * are specified
+ */
+#define ARIZONA_V2_IM_AIF3_ERR_EINT1                  0x8000  /* IM_AIF3_ERR_EINT1 */
+#define ARIZONA_V2_IM_AIF3_ERR_EINT1_MASK             0x8000  /* IM_AIF3_ERR_EINT1 */
+#define ARIZONA_V2_IM_AIF3_ERR_EINT1_SHIFT                15  /* IM_AIF3_ERR_EINT1 */
+#define ARIZONA_V2_IM_AIF3_ERR_EINT1_WIDTH                 1  /* IM_AIF3_ERR_EINT1 */
+#define ARIZONA_V2_IM_AIF2_ERR_EINT1                  0x4000  /* IM_AIF2_ERR_EINT1 */
+#define ARIZONA_V2_IM_AIF2_ERR_EINT1_MASK             0x4000  /* IM_AIF2_ERR_EINT1 */
+#define ARIZONA_V2_IM_AIF2_ERR_EINT1_SHIFT                14  /* IM_AIF2_ERR_EINT1 */
+#define ARIZONA_V2_IM_AIF2_ERR_EINT1_WIDTH                 1  /* IM_AIF2_ERR_EINT1 */
+#define ARIZONA_V2_IM_AIF1_ERR_EINT1                  0x2000  /* IM_AIF1_ERR_EINT1 */
+#define ARIZONA_V2_IM_AIF1_ERR_EINT1_MASK             0x2000  /* IM_AIF1_ERR_EINT1 */
+#define ARIZONA_V2_IM_AIF1_ERR_EINT1_SHIFT                13  /* IM_AIF1_ERR_EINT1 */
+#define ARIZONA_V2_IM_AIF1_ERR_EINT1_WIDTH                 1  /* IM_AIF1_ERR_EINT1 */
+#define ARIZONA_V2_IM_CTRLIF_ERR_EINT1                0x1000  /* IM_CTRLIF_ERR_EINT1 */
+#define ARIZONA_V2_IM_CTRLIF_ERR_EINT1_MASK           0x1000  /* IM_CTRLIF_ERR_EINT1 */
+#define ARIZONA_V2_IM_CTRLIF_ERR_EINT1_SHIFT              12  /* IM_CTRLIF_ERR_EINT1 */
+#define ARIZONA_V2_IM_CTRLIF_ERR_EINT1_WIDTH               1  /* IM_CTRLIF_ERR_EINT1 */
+#define ARIZONA_V2_IM_MIXER_DROPPED_SAMPLE_EINT1      0x0800  /* IM_MIXER_DROPPED_SAMPLE_EINT1 */
+#define ARIZONA_V2_IM_MIXER_DROPPED_SAMPLE_EINT1_MASK 0x0800  /* IM_MIXER_DROPPED_SAMPLE_EINT1 */
+#define ARIZONA_V2_IM_MIXER_DROPPED_SAMPLE_EINT1_SHIFT    11  /* IM_MIXER_DROPPED_SAMPLE_EINT1 */
+#define ARIZONA_V2_IM_MIXER_DROPPED_SAMPLE_EINT1_WIDTH     1  /* IM_MIXER_DROPPED_SAMPLE_EINT1 */
+#define ARIZONA_V2_IM_ASYNC_CLK_ENA_LOW_EINT1         0x0400  /* IM_ASYNC_CLK_ENA_LOW_EINT1 */
+#define ARIZONA_V2_IM_ASYNC_CLK_ENA_LOW_EINT1_MASK    0x0400  /* IM_ASYNC_CLK_ENA_LOW_EINT1 */
+#define ARIZONA_V2_IM_ASYNC_CLK_ENA_LOW_EINT1_SHIFT       10  /* IM_ASYNC_CLK_ENA_LOW_EINT1 */
+#define ARIZONA_V2_IM_ASYNC_CLK_ENA_LOW_EINT1_WIDTH        1  /* IM_ASYNC_CLK_ENA_LOW_EINT1 */
+#define ARIZONA_V2_IM_SYSCLK_ENA_LOW_EINT1            0x0200  /* IM_SYSCLK_ENA_LOW_EINT1 */
+#define ARIZONA_V2_IM_SYSCLK_ENA_LOW_EINT1_MASK       0x0200  /* IM_SYSCLK_ENA_LOW_EINT1 */
+#define ARIZONA_V2_IM_SYSCLK_ENA_LOW_EINT1_SHIFT           9  /* IM_SYSCLK_ENA_LOW_EINT1 */
+#define ARIZONA_V2_IM_SYSCLK_ENA_LOW_EINT1_WIDTH           1  /* IM_SYSCLK_ENA_LOW_EINT1 */
+#define ARIZONA_V2_IM_ISRC1_CFG_ERR_EINT1             0x0100  /* IM_ISRC1_CFG_ERR_EINT1 */
+#define ARIZONA_V2_IM_ISRC1_CFG_ERR_EINT1_MASK        0x0100  /* IM_ISRC1_CFG_ERR_EINT1 */
+#define ARIZONA_V2_IM_ISRC1_CFG_ERR_EINT1_SHIFT            8  /* IM_ISRC1_CFG_ERR_EINT1 */
+#define ARIZONA_V2_IM_ISRC1_CFG_ERR_EINT1_WIDTH            1  /* IM_ISRC1_CFG_ERR_EINT1 */
+#define ARIZONA_V2_IM_ISRC2_CFG_ERR_EINT1             0x0080  /* IM_ISRC2_CFG_ERR_EINT1 */
+#define ARIZONA_V2_IM_ISRC2_CFG_ERR_EINT1_MASK        0x0080  /* IM_ISRC2_CFG_ERR_EINT1 */
+#define ARIZONA_V2_IM_ISRC2_CFG_ERR_EINT1_SHIFT            7  /* IM_ISRC2_CFG_ERR_EINT1 */
+#define ARIZONA_V2_IM_ISRC2_CFG_ERR_EINT1_WIDTH            1  /* IM_ISRC2_CFG_ERR_EINT1 */
+#define ARIZONA_V2_IM_ISRC3_CFG_ERR_EINT1             0x0040  /* IM_ISRC3_CFG_ERR_EINT1 */
+#define ARIZONA_V2_IM_ISRC3_CFG_ERR_EINT1_MASK        0x0040  /* IM_ISRC3_CFG_ERR_EINT1 */
+#define ARIZONA_V2_IM_ISRC3_CFG_ERR_EINT1_SHIFT            6  /* IM_ISRC3_CFG_ERR_EINT1 */
+#define ARIZONA_V2_IM_ISRC3_CFG_ERR_EINT1_WIDTH            1  /* IM_ISRC3_CFG_ERR_EINT1 */
 
 /*
  * R3340 (0xD0C) - Interrupt Status 5 Mask
 #define ARIZONA_IM_FLL1_CLOCK_OK_EINT1_SHIFT          0  /* IM_FLL1_CLOCK_OK_EINT1 */
 #define ARIZONA_IM_FLL1_CLOCK_OK_EINT1_WIDTH          1  /* IM_FLL1_CLOCK_OK_EINT1 */
 
+/*
+ * R3340 (0xD0C) - Interrupt Status 5 Mask (Alternate layout)
+ *
+ * Alternate layout used on later devices, note only fields that have moved
+ * are specified
+ */
+#define ARIZONA_V2_IM_ASRC_CFG_ERR_EINT1         0x0008  /* IM_ASRC_CFG_ERR_EINT1 */
+#define ARIZONA_V2_IM_ASRC_CFG_ERR_EINT1_MASK    0x0008  /* IM_ASRC_CFG_ERR_EINT1 */
+#define ARIZONA_V2_IM_ASRC_CFG_ERR_EINT1_SHIFT        3  /* IM_ASRC_CFG_ERR_EINT1 */
+#define ARIZONA_V2_IM_ASRC_CFG_ERR_EINT1_WIDTH        1  /* IM_ASRC_CFG_ERR_EINT1 */
+
+/*
+ * R3341 (0xD0D) - Interrupt Status 6 Mask
+ */
+#define ARIZONA_IM_DSP_SHARED_WR_COLL_EINT1      0x8000  /* IM_DSP_SHARED_WR_COLL_EINT1 */
+#define ARIZONA_IM_DSP_SHARED_WR_COLL_EINT1_MASK 0x8000  /* IM_DSP_SHARED_WR_COLL_EINT1 */
+#define ARIZONA_IM_DSP_SHARED_WR_COLL_EINT1_SHIFT    15  /* IM_DSP_SHARED_WR_COLL_EINT1 */
+#define ARIZONA_IM_DSP_SHARED_WR_COLL_EINT1_WIDTH     1  /* IM_DSP_SHARED_WR_COLL_EINT1 */
+#define ARIZONA_IM_SPK_SHUTDOWN_EINT1            0x4000  /* IM_SPK_SHUTDOWN_EINT1 */
+#define ARIZONA_IM_SPK_SHUTDOWN_EINT1_MASK       0x4000  /* IM_SPK_SHUTDOWN_EINT1 */
+#define ARIZONA_IM_SPK_SHUTDOWN_EINT1_SHIFT          14  /* IM_SPK_SHUTDOWN_EINT1 */
+#define ARIZONA_IM_SPK_SHUTDOWN_EINT1_WIDTH           1  /* IM_SPK_SHUTDOWN_EINT1 */
+#define ARIZONA_IM_SPK1R_SHORT_EINT1             0x2000  /* IM_SPK1R_SHORT_EINT1 */
+#define ARIZONA_IM_SPK1R_SHORT_EINT1_MASK        0x2000  /* IM_SPK1R_SHORT_EINT1 */
+#define ARIZONA_IM_SPK1R_SHORT_EINT1_SHIFT           13  /* IM_SPK1R_SHORT_EINT1 */
+#define ARIZONA_IM_SPK1R_SHORT_EINT1_WIDTH            1  /* IM_SPK1R_SHORT_EINT1 */
+#define ARIZONA_IM_SPK1L_SHORT_EINT1             0x1000  /* IM_SPK1L_SHORT_EINT1 */
+#define ARIZONA_IM_SPK1L_SHORT_EINT1_MASK        0x1000  /* IM_SPK1L_SHORT_EINT1 */
+#define ARIZONA_IM_SPK1L_SHORT_EINT1_SHIFT           12  /* IM_SPK1L_SHORT_EINT1 */
+#define ARIZONA_IM_SPK1L_SHORT_EINT1_WIDTH            1  /* IM_SPK1L_SHORT_EINT1 */
+#define ARIZONA_IM_HP3R_SC_NEG_EINT1             0x0800  /* IM_HP3R_SC_NEG_EINT1 */
+#define ARIZONA_IM_HP3R_SC_NEG_EINT1_MASK        0x0800  /* IM_HP3R_SC_NEG_EINT1 */
+#define ARIZONA_IM_HP3R_SC_NEG_EINT1_SHIFT           11  /* IM_HP3R_SC_NEG_EINT1 */
+#define ARIZONA_IM_HP3R_SC_NEG_EINT1_WIDTH            1  /* IM_HP3R_SC_NEG_EINT1 */
+#define ARIZONA_IM_HP3R_SC_POS_EINT1             0x0400  /* IM_HP3R_SC_POS_EINT1 */
+#define ARIZONA_IM_HP3R_SC_POS_EINT1_MASK        0x0400  /* IM_HP3R_SC_POS_EINT1 */
+#define ARIZONA_IM_HP3R_SC_POS_EINT1_SHIFT           10  /* IM_HP3R_SC_POS_EINT1 */
+#define ARIZONA_IM_HP3R_SC_POS_EINT1_WIDTH            1  /* IM_HP3R_SC_POS_EINT1 */
+#define ARIZONA_IM_HP3L_SC_NEG_EINT1             0x0200  /* IM_HP3L_SC_NEG_EINT1 */
+#define ARIZONA_IM_HP3L_SC_NEG_EINT1_MASK        0x0200  /* IM_HP3L_SC_NEG_EINT1 */
+#define ARIZONA_IM_HP3L_SC_NEG_EINT1_SHIFT            9  /* IM_HP3L_SC_NEG_EINT1 */
+#define ARIZONA_IM_HP3L_SC_NEG_EINT1_WIDTH            1  /* IM_HP3L_SC_NEG_EINT1 */
+#define ARIZONA_IM_HP3L_SC_POS_EINT1             0x0100  /* IM_HP3L_SC_POS_EINT1 */
+#define ARIZONA_IM_HP3L_SC_POS_EINT1_MASK        0x0100  /* IM_HP3L_SC_POS_EINT1 */
+#define ARIZONA_IM_HP3L_SC_POS_EINT1_SHIFT            8  /* IM_HP3L_SC_POS_EINT1 */
+#define ARIZONA_IM_HP3L_SC_POS_EINT1_WIDTH            1  /* IM_HP3L_SC_POS_EINT1 */
+#define ARIZONA_IM_HP2R_SC_NEG_EINT1             0x0080  /* IM_HP2R_SC_NEG_EINT1 */
+#define ARIZONA_IM_HP2R_SC_NEG_EINT1_MASK        0x0080  /* IM_HP2R_SC_NEG_EINT1 */
+#define ARIZONA_IM_HP2R_SC_NEG_EINT1_SHIFT            7  /* IM_HP2R_SC_NEG_EINT1 */
+#define ARIZONA_IM_HP2R_SC_NEG_EINT1_WIDTH            1  /* IM_HP2R_SC_NEG_EINT1 */
+#define ARIZONA_IM_HP2R_SC_POS_EINT1             0x0040  /* IM_HP2R_SC_POS_EINT1 */
+#define ARIZONA_IM_HP2R_SC_POS_EINT1_MASK        0x0040  /* IM_HP2R_SC_POS_EINT1 */
+#define ARIZONA_IM_HP2R_SC_POS_EINT1_SHIFT            6  /* IM_HP2R_SC_POS_EINT1 */
+#define ARIZONA_IM_HP2R_SC_POS_EINT1_WIDTH            1  /* IM_HP2R_SC_POS_EINT1 */
+#define ARIZONA_IM_HP2L_SC_NEG_EINT1             0x0020  /* IM_HP2L_SC_NEG_EINT1 */
+#define ARIZONA_IM_HP2L_SC_NEG_EINT1_MASK        0x0020  /* IM_HP2L_SC_NEG_EINT1 */
+#define ARIZONA_IM_HP2L_SC_NEG_EINT1_SHIFT            5  /* IM_HP2L_SC_NEG_EINT1 */
+#define ARIZONA_IM_HP2L_SC_NEG_EINT1_WIDTH            1  /* IM_HP2L_SC_NEG_EINT1 */
+#define ARIZONA_IM_HP2L_SC_POS_EINT1             0x0010  /* IM_HP2L_SC_POS_EINT1 */
+#define ARIZONA_IM_HP2L_SC_POS_EINT1_MASK        0x0010  /* IM_HP2L_SC_POS_EINT1 */
+#define ARIZONA_IM_HP2L_SC_POS_EINT1_SHIFT            4  /* IM_HP2L_SC_POS_EINT1 */
+#define ARIZONA_IM_HP2L_SC_POS_EINT1_WIDTH            1  /* IM_HP2L_SC_POS_EINT1 */
+#define ARIZONA_IM_HP1R_SC_NEG_EINT1             0x0008  /* IM_HP1R_SC_NEG_EINT1 */
+#define ARIZONA_IM_HP1R_SC_NEG_EINT1_MASK        0x0008  /* IM_HP1R_SC_NEG_EINT1 */
+#define ARIZONA_IM_HP1R_SC_NEG_EINT1_SHIFT            3  /* IM_HP1R_SC_NEG_EINT1 */
+#define ARIZONA_IM_HP1R_SC_NEG_EINT1_WIDTH            1  /* IM_HP1R_SC_NEG_EINT1 */
+#define ARIZONA_IM_HP1R_SC_POS_EINT1             0x0004  /* IM_HP1R_SC_POS_EINT1 */
+#define ARIZONA_IM_HP1R_SC_POS_EINT1_MASK        0x0004  /* IM_HP1R_SC_POS_EINT1 */
+#define ARIZONA_IM_HP1R_SC_POS_EINT1_SHIFT            2  /* IM_HP1R_SC_POS_EINT1 */
+#define ARIZONA_IM_HP1R_SC_POS_EINT1_WIDTH            1  /* IM_HP1R_SC_POS_EINT1 */
+#define ARIZONA_IM_HP1L_SC_NEG_EINT1             0x0002  /* IM_HP1L_SC_NEG_EINT1 */
+#define ARIZONA_IM_HP1L_SC_NEG_EINT1_MASK        0x0002  /* IM_HP1L_SC_NEG_EINT1 */
+#define ARIZONA_IM_HP1L_SC_NEG_EINT1_SHIFT            1  /* IM_HP1L_SC_NEG_EINT1 */
+#define ARIZONA_IM_HP1L_SC_NEG_EINT1_WIDTH            1  /* IM_HP1L_SC_NEG_EINT1 */
+#define ARIZONA_IM_HP1L_SC_POS_EINT1             0x0001  /* IM_HP1L_SC_POS_EINT1 */
+#define ARIZONA_IM_HP1L_SC_POS_EINT1_MASK        0x0001  /* IM_HP1L_SC_POS_EINT1 */
+#define ARIZONA_IM_HP1L_SC_POS_EINT1_SHIFT            0  /* IM_HP1L_SC_POS_EINT1 */
+#define ARIZONA_IM_HP1L_SC_POS_EINT1_WIDTH            1  /* IM_HP1L_SC_POS_EINT1 */
+
 /*
  * R3343 (0xD0F) - Interrupt Control
  */
 /*
  * R3346 (0xD12) - IRQ2 Status 3
  */
-#define ARIZONA_SPK_SHUTDOWN_WARN_EINT2          0x8000  /* SPK_SHUTDOWN_WARN_EINT2 */
-#define ARIZONA_SPK_SHUTDOWN_WARN_EINT2_MASK     0x8000  /* SPK_SHUTDOWN_WARN_EINT2 */
-#define ARIZONA_SPK_SHUTDOWN_WARN_EINT2_SHIFT        15  /* SPK_SHUTDOWN_WARN_EINT2 */
-#define ARIZONA_SPK_SHUTDOWN_WARN_EINT2_WIDTH         1  /* SPK_SHUTDOWN_WARN_EINT2 */
-#define ARIZONA_SPK_SHUTDOWN_EINT2               0x4000  /* SPK_SHUTDOWN_EINT2 */
-#define ARIZONA_SPK_SHUTDOWN_EINT2_MASK          0x4000  /* SPK_SHUTDOWN_EINT2 */
-#define ARIZONA_SPK_SHUTDOWN_EINT2_SHIFT             14  /* SPK_SHUTDOWN_EINT2 */
-#define ARIZONA_SPK_SHUTDOWN_EINT2_WIDTH              1  /* SPK_SHUTDOWN_EINT2 */
+#define ARIZONA_SPK_OVERHEAT_WARN_EINT2          0x8000  /* SPK_OVERHEAT_WARN_EINT2 */
+#define ARIZONA_SPK_OVERHEAT_WARN_EINT2_MASK     0x8000  /* SPK_OVERHEAT_WARN_EINT2 */
+#define ARIZONA_SPK_OVERHEAT_WARN_EINT2_SHIFT        15  /* SPK_OVERHEAT_WARN_EINT2 */
+#define ARIZONA_SPK_OVERHEAT_WARN_EINT2_WIDTH         1  /* SPK_OVERHEAT_WARN_EINT2 */
+#define ARIZONA_SPK_OVERHEAT_EINT2               0x4000  /* SPK_OVERHEAT_EINT2 */
+#define ARIZONA_SPK_OVERHEAT_EINT2_MASK          0x4000  /* SPK_OVERHEAT_EINT2 */
+#define ARIZONA_SPK_OVERHEAT_EINT2_SHIFT             14  /* SPK_OVERHEAT_EINT2 */
+#define ARIZONA_SPK_OVERHEAT_EINT2_WIDTH              1  /* SPK_OVERHEAT_EINT2 */
 #define ARIZONA_HPDET_EINT2                      0x2000  /* HPDET_EINT2 */
 #define ARIZONA_HPDET_EINT2_MASK                 0x2000  /* HPDET_EINT2 */
 #define ARIZONA_HPDET_EINT2_SHIFT                    13  /* HPDET_EINT2 */
 #define ARIZONA_ISRC2_CFG_ERR_EINT2_MASK         0x0040  /* ISRC2_CFG_ERR_EINT2 */
 #define ARIZONA_ISRC2_CFG_ERR_EINT2_SHIFT             6  /* ISRC2_CFG_ERR_EINT2 */
 #define ARIZONA_ISRC2_CFG_ERR_EINT2_WIDTH             1  /* ISRC2_CFG_ERR_EINT2 */
+#define ARIZONA_HP3R_DONE_EINT2                  0x0020  /* HP3R_DONE_EINT2 */
+#define ARIZONA_HP3R_DONE_EINT2_MASK             0x0020  /* HP3R_DONE_EINT2 */
+#define ARIZONA_HP3R_DONE_EINT2_SHIFT                 5  /* HP3R_DONE_EINT2 */
+#define ARIZONA_HP3R_DONE_EINT2_WIDTH                 1  /* HP3R_DONE_EINT2 */
+#define ARIZONA_HP3L_DONE_EINT2                  0x0010  /* HP3L_DONE_EINT2 */
+#define ARIZONA_HP3L_DONE_EINT2_MASK             0x0010  /* HP3L_DONE_EINT2 */
+#define ARIZONA_HP3L_DONE_EINT2_SHIFT                 4  /* HP3L_DONE_EINT2 */
+#define ARIZONA_HP3L_DONE_EINT2_WIDTH                 1  /* HP3L_DONE_EINT2 */
+#define ARIZONA_HP2R_DONE_EINT2                  0x0008  /* HP2R_DONE_EINT2 */
+#define ARIZONA_HP2R_DONE_EINT2_MASK             0x0008  /* HP2R_DONE_EINT2 */
+#define ARIZONA_HP2R_DONE_EINT2_SHIFT                 3  /* HP2R_DONE_EINT2 */
+#define ARIZONA_HP2R_DONE_EINT2_WIDTH                 1  /* HP2R_DONE_EINT2 */
+#define ARIZONA_HP2L_DONE_EINT2                  0x0004  /* HP2L_DONE_EINT2 */
+#define ARIZONA_HP2L_DONE_EINT2_MASK             0x0004  /* HP2L_DONE_EINT2 */
+#define ARIZONA_HP2L_DONE_EINT2_SHIFT                 2  /* HP2L_DONE_EINT2 */
+#define ARIZONA_HP2L_DONE_EINT2_WIDTH                 1  /* HP2L_DONE_EINT2 */
+#define ARIZONA_HP1R_DONE_EINT2                  0x0002  /* HP1R_DONE_EINT2 */
+#define ARIZONA_HP1R_DONE_EINT2_MASK             0x0002  /* HP1R_DONE_EINT2 */
+#define ARIZONA_HP1R_DONE_EINT2_SHIFT                 1  /* HP1R_DONE_EINT2 */
+#define ARIZONA_HP1R_DONE_EINT2_WIDTH                 1  /* HP1R_DONE_EINT2 */
+#define ARIZONA_HP1L_DONE_EINT2                  0x0001  /* HP1L_DONE_EINT2 */
+#define ARIZONA_HP1L_DONE_EINT2_MASK             0x0001  /* HP1L_DONE_EINT2 */
+#define ARIZONA_HP1L_DONE_EINT2_SHIFT                 0  /* HP1L_DONE_EINT2 */
+#define ARIZONA_HP1L_DONE_EINT2_WIDTH                 1  /* HP1L_DONE_EINT2 */
+
+/*
+ * R3347 (0xD13) - IRQ2 Status 4 (Alternate layout)
+ *
+ * Alternate layout used on later devices, note only fields that have moved
+ * are specified
+ */
+#define ARIZONA_V2_AIF3_ERR_EINT2                  0x8000  /* AIF3_ERR_EINT2 */
+#define ARIZONA_V2_AIF3_ERR_EINT2_MASK             0x8000  /* AIF3_ERR_EINT2 */
+#define ARIZONA_V2_AIF3_ERR_EINT2_SHIFT                15  /* AIF3_ERR_EINT2 */
+#define ARIZONA_V2_AIF3_ERR_EINT2_WIDTH                 1  /* AIF3_ERR_EINT2 */
+#define ARIZONA_V2_AIF2_ERR_EINT2                  0x4000  /* AIF2_ERR_EINT2 */
+#define ARIZONA_V2_AIF2_ERR_EINT2_MASK             0x4000  /* AIF2_ERR_EINT2 */
+#define ARIZONA_V2_AIF2_ERR_EINT2_SHIFT                14  /* AIF2_ERR_EINT2 */
+#define ARIZONA_V2_AIF2_ERR_EINT2_WIDTH                 1  /* AIF2_ERR_EINT2 */
+#define ARIZONA_V2_AIF1_ERR_EINT2                  0x2000  /* AIF1_ERR_EINT2 */
+#define ARIZONA_V2_AIF1_ERR_EINT2_MASK             0x2000  /* AIF1_ERR_EINT2 */
+#define ARIZONA_V2_AIF1_ERR_EINT2_SHIFT                13  /* AIF1_ERR_EINT2 */
+#define ARIZONA_V2_AIF1_ERR_EINT2_WIDTH                 1  /* AIF1_ERR_EINT2 */
+#define ARIZONA_V2_CTRLIF_ERR_EINT2                0x1000  /* CTRLIF_ERR_EINT2 */
+#define ARIZONA_V2_CTRLIF_ERR_EINT2_MASK           0x1000  /* CTRLIF_ERR_EINT2 */
+#define ARIZONA_V2_CTRLIF_ERR_EINT2_SHIFT              12  /* CTRLIF_ERR_EINT2 */
+#define ARIZONA_V2_CTRLIF_ERR_EINT2_WIDTH               1  /* CTRLIF_ERR_EINT2 */
+#define ARIZONA_V2_MIXER_DROPPED_SAMPLE_EINT2      0x0800  /* MIXER_DROPPED_SAMPLE_EINT2 */
+#define ARIZONA_V2_MIXER_DROPPED_SAMPLE_EINT2_MASK 0x0800  /* MIXER_DROPPED_SAMPLE_EINT2 */
+#define ARIZONA_V2_MIXER_DROPPED_SAMPLE_EINT2_SHIFT    11  /* MIXER_DROPPED_SAMPLE_EINT2 */
+#define ARIZONA_V2_MIXER_DROPPED_SAMPLE_EINT2_WIDTH     1  /* MIXER_DROPPED_SAMPLE_EINT2 */
+#define ARIZONA_V2_ASYNC_CLK_ENA_LOW_EINT2         0x0400  /* ASYNC_CLK_ENA_LOW_EINT2 */
+#define ARIZONA_V2_ASYNC_CLK_ENA_LOW_EINT2_MASK    0x0400  /* ASYNC_CLK_ENA_LOW_EINT2 */
+#define ARIZONA_V2_ASYNC_CLK_ENA_LOW_EINT2_SHIFT       10  /* ASYNC_CLK_ENA_LOW_EINT2 */
+#define ARIZONA_V2_ASYNC_CLK_ENA_LOW_EINT2_WIDTH        1  /* ASYNC_CLK_ENA_LOW_EINT2 */
+#define ARIZONA_V2_SYSCLK_ENA_LOW_EINT2            0x0200  /* SYSCLK_ENA_LOW_EINT2 */
+#define ARIZONA_V2_SYSCLK_ENA_LOW_EINT2_MASK       0x0200  /* SYSCLK_ENA_LOW_EINT2 */
+#define ARIZONA_V2_SYSCLK_ENA_LOW_EINT2_SHIFT           9  /* SYSCLK_ENA_LOW_EINT2 */
+#define ARIZONA_V2_SYSCLK_ENA_LOW_EINT2_WIDTH           1  /* SYSCLK_ENA_LOW_EINT2 */
+#define ARIZONA_V2_ISRC1_CFG_ERR_EINT2             0x0100  /* ISRC1_CFG_ERR_EINT2 */
+#define ARIZONA_V2_ISRC1_CFG_ERR_EINT2_MASK        0x0100  /* ISRC1_CFG_ERR_EINT2 */
+#define ARIZONA_V2_ISRC1_CFG_ERR_EINT2_SHIFT            8  /* ISRC1_CFG_ERR_EINT2 */
+#define ARIZONA_V2_ISRC1_CFG_ERR_EINT2_WIDTH            1  /* ISRC1_CFG_ERR_EINT2 */
+#define ARIZONA_V2_ISRC2_CFG_ERR_EINT2             0x0080  /* ISRC2_CFG_ERR_EINT2 */
+#define ARIZONA_V2_ISRC2_CFG_ERR_EINT2_MASK        0x0080  /* ISRC2_CFG_ERR_EINT2 */
+#define ARIZONA_V2_ISRC2_CFG_ERR_EINT2_SHIFT            7  /* ISRC2_CFG_ERR_EINT2 */
+#define ARIZONA_V2_ISRC2_CFG_ERR_EINT2_WIDTH            1  /* ISRC2_CFG_ERR_EINT2 */
+#define ARIZONA_V2_ISRC3_CFG_ERR_EINT2             0x0040  /* ISRC3_CFG_ERR_EINT2 */
+#define ARIZONA_V2_ISRC3_CFG_ERR_EINT2_MASK        0x0040  /* ISRC3_CFG_ERR_EINT2 */
+#define ARIZONA_V2_ISRC3_CFG_ERR_EINT2_SHIFT            6  /* ISRC3_CFG_ERR_EINT2 */
+#define ARIZONA_V2_ISRC3_CFG_ERR_EINT2_WIDTH            1  /* ISRC3_CFG_ERR_EINT2 */
 
 /*
  * R3348 (0xD14) - IRQ2 Status 5
 #define ARIZONA_FLL1_CLOCK_OK_EINT2_SHIFT             0  /* FLL1_CLOCK_OK_EINT2 */
 #define ARIZONA_FLL1_CLOCK_OK_EINT2_WIDTH             1  /* FLL1_CLOCK_OK_EINT2 */
 
+/*
+ * R3348 (0xD14) - IRQ2 Status 5 (Alternate layout)
+ *
+ * Alternate layout used on later devices, note only fields that have moved
+ * are specified
+ */
+#define ARIZONA_V2_ASRC_CFG_ERR_EINT2            0x0008  /* ASRC_CFG_ERR_EINT2 */
+#define ARIZONA_V2_ASRC_CFG_ERR_EINT2_MASK       0x0008  /* ASRC_CFG_ERR_EINT2 */
+#define ARIZONA_V2_ASRC_CFG_ERR_EINT2_SHIFT           3  /* ASRC_CFG_ERR_EINT2 */
+#define ARIZONA_V2_ASRC_CFG_ERR_EINT2_WIDTH           1  /* ASRC_CFG_ERR_EINT2 */
+
+/*
+ * R3349 (0xD15) - IRQ2 Status 6
+ */
+#define ARIZONA_DSP_SHARED_WR_COLL_EINT2         0x8000  /* DSP_SHARED_WR_COLL_EINT2 */
+#define ARIZONA_DSP_SHARED_WR_COLL_EINT2_MASK    0x8000  /* DSP_SHARED_WR_COLL_EINT2 */
+#define ARIZONA_DSP_SHARED_WR_COLL_EINT2_SHIFT       15  /* DSP_SHARED_WR_COLL_EINT2 */
+#define ARIZONA_DSP_SHARED_WR_COLL_EINT2_WIDTH        1  /* DSP_SHARED_WR_COLL_EINT2 */
+#define ARIZONA_SPK_SHUTDOWN_EINT2               0x4000  /* SPK_SHUTDOWN_EINT2 */
+#define ARIZONA_SPK_SHUTDOWN_EINT2_MASK          0x4000  /* SPK_SHUTDOWN_EINT2 */
+#define ARIZONA_SPK_SHUTDOWN_EINT2_SHIFT             14  /* SPK_SHUTDOWN_EINT2 */
+#define ARIZONA_SPK_SHUTDOWN_EINT2_WIDTH              1  /* SPK_SHUTDOWN_EINT2 */
+#define ARIZONA_SPK1R_SHORT_EINT2                0x2000  /* SPK1R_SHORT_EINT2 */
+#define ARIZONA_SPK1R_SHORT_EINT2_MASK           0x2000  /* SPK1R_SHORT_EINT2 */
+#define ARIZONA_SPK1R_SHORT_EINT2_SHIFT              13  /* SPK1R_SHORT_EINT2 */
+#define ARIZONA_SPK1R_SHORT_EINT2_WIDTH               1  /* SPK1R_SHORT_EINT2 */
+#define ARIZONA_SPK1L_SHORT_EINT2                0x1000  /* SPK1L_SHORT_EINT2 */
+#define ARIZONA_SPK1L_SHORT_EINT2_MASK           0x1000  /* SPK1L_SHORT_EINT2 */
+#define ARIZONA_SPK1L_SHORT_EINT2_SHIFT              12  /* SPK1L_SHORT_EINT2 */
+#define ARIZONA_SPK1L_SHORT_EINT2_WIDTH               1  /* SPK1L_SHORT_EINT2 */
+#define ARIZONA_HP3R_SC_NEG_EINT2                0x0800  /* HP3R_SC_NEG_EINT2 */
+#define ARIZONA_HP3R_SC_NEG_EINT2_MASK           0x0800  /* HP3R_SC_NEG_EINT2 */
+#define ARIZONA_HP3R_SC_NEG_EINT2_SHIFT              11  /* HP3R_SC_NEG_EINT2 */
+#define ARIZONA_HP3R_SC_NEG_EINT2_WIDTH               1  /* HP3R_SC_NEG_EINT2 */
+#define ARIZONA_HP3R_SC_POS_EINT2                0x0400  /* HP3R_SC_POS_EINT2 */
+#define ARIZONA_HP3R_SC_POS_EINT2_MASK           0x0400  /* HP3R_SC_POS_EINT2 */
+#define ARIZONA_HP3R_SC_POS_EINT2_SHIFT              10  /* HP3R_SC_POS_EINT2 */
+#define ARIZONA_HP3R_SC_POS_EINT2_WIDTH               1  /* HP3R_SC_POS_EINT2 */
+#define ARIZONA_HP3L_SC_NEG_EINT2                0x0200  /* HP3L_SC_NEG_EINT2 */
+#define ARIZONA_HP3L_SC_NEG_EINT2_MASK           0x0200  /* HP3L_SC_NEG_EINT2 */
+#define ARIZONA_HP3L_SC_NEG_EINT2_SHIFT               9  /* HP3L_SC_NEG_EINT2 */
+#define ARIZONA_HP3L_SC_NEG_EINT2_WIDTH               1  /* HP3L_SC_NEG_EINT2 */
+#define ARIZONA_HP3L_SC_POS_EINT2                0x0100  /* HP3L_SC_POS_EINT2 */
+#define ARIZONA_HP3L_SC_POS_EINT2_MASK           0x0100  /* HP3L_SC_POS_EINT2 */
+#define ARIZONA_HP3L_SC_POS_EINT2_SHIFT               8  /* HP3L_SC_POS_EINT2 */
+#define ARIZONA_HP3L_SC_POS_EINT2_WIDTH               1  /* HP3L_SC_POS_EINT2 */
+#define ARIZONA_HP2R_SC_NEG_EINT2                0x0080  /* HP2R_SC_NEG_EINT2 */
+#define ARIZONA_HP2R_SC_NEG_EINT2_MASK           0x0080  /* HP2R_SC_NEG_EINT2 */
+#define ARIZONA_HP2R_SC_NEG_EINT2_SHIFT               7  /* HP2R_SC_NEG_EINT2 */
+#define ARIZONA_HP2R_SC_NEG_EINT2_WIDTH               1  /* HP2R_SC_NEG_EINT2 */
+#define ARIZONA_HP2R_SC_POS_EINT2                0x0040  /* HP2R_SC_POS_EINT2 */
+#define ARIZONA_HP2R_SC_POS_EINT2_MASK           0x0040  /* HP2R_SC_POS_EINT2 */
+#define ARIZONA_HP2R_SC_POS_EINT2_SHIFT               6  /* HP2R_SC_POS_EINT2 */
+#define ARIZONA_HP2R_SC_POS_EINT2_WIDTH               1  /* HP2R_SC_POS_EINT2 */
+#define ARIZONA_HP2L_SC_NEG_EINT2                0x0020  /* HP2L_SC_NEG_EINT2 */
+#define ARIZONA_HP2L_SC_NEG_EINT2_MASK           0x0020  /* HP2L_SC_NEG_EINT2 */
+#define ARIZONA_HP2L_SC_NEG_EINT2_SHIFT               5  /* HP2L_SC_NEG_EINT2 */
+#define ARIZONA_HP2L_SC_NEG_EINT2_WIDTH               1  /* HP2L_SC_NEG_EINT2 */
+#define ARIZONA_HP2L_SC_POS_EINT2                0x0010  /* HP2L_SC_POS_EINT2 */
+#define ARIZONA_HP2L_SC_POS_EINT2_MASK           0x0010  /* HP2L_SC_POS_EINT2 */
+#define ARIZONA_HP2L_SC_POS_EINT2_SHIFT               4  /* HP2L_SC_POS_EINT2 */
+#define ARIZONA_HP2L_SC_POS_EINT2_WIDTH               1  /* HP2L_SC_POS_EINT2 */
+#define ARIZONA_HP1R_SC_NEG_EINT2                0x0008  /* HP1R_SC_NEG_EINT2 */
+#define ARIZONA_HP1R_SC_NEG_EINT2_MASK           0x0008  /* HP1R_SC_NEG_EINT2 */
+#define ARIZONA_HP1R_SC_NEG_EINT2_SHIFT               3  /* HP1R_SC_NEG_EINT2 */
+#define ARIZONA_HP1R_SC_NEG_EINT2_WIDTH               1  /* HP1R_SC_NEG_EINT2 */
+#define ARIZONA_HP1R_SC_POS_EINT2                0x0004  /* HP1R_SC_POS_EINT2 */
+#define ARIZONA_HP1R_SC_POS_EINT2_MASK           0x0004  /* HP1R_SC_POS_EINT2 */
+#define ARIZONA_HP1R_SC_POS_EINT2_SHIFT               2  /* HP1R_SC_POS_EINT2 */
+#define ARIZONA_HP1R_SC_POS_EINT2_WIDTH               1  /* HP1R_SC_POS_EINT2 */
+#define ARIZONA_HP1L_SC_NEG_EINT2                0x0002  /* HP1L_SC_NEG_EINT2 */
+#define ARIZONA_HP1L_SC_NEG_EINT2_MASK           0x0002  /* HP1L_SC_NEG_EINT2 */
+#define ARIZONA_HP1L_SC_NEG_EINT2_SHIFT               1  /* HP1L_SC_NEG_EINT2 */
+#define ARIZONA_HP1L_SC_NEG_EINT2_WIDTH               1  /* HP1L_SC_NEG_EINT2 */
+#define ARIZONA_HP1L_SC_POS_EINT2                0x0001  /* HP1L_SC_POS_EINT2 */
+#define ARIZONA_HP1L_SC_POS_EINT2_MASK           0x0001  /* HP1L_SC_POS_EINT2 */
+#define ARIZONA_HP1L_SC_POS_EINT2_SHIFT               0  /* HP1L_SC_POS_EINT2 */
+#define ARIZONA_HP1L_SC_POS_EINT2_WIDTH               1  /* HP1L_SC_POS_EINT2 */
+
 /*
  * R3352 (0xD18) - IRQ2 Status 1 Mask
  */
 /*
  * R3354 (0xD1A) - IRQ2 Status 3 Mask
  */
-#define ARIZONA_IM_SPK_SHUTDOWN_WARN_EINT2       0x8000  /* IM_SPK_SHUTDOWN_WARN_EINT2 */
-#define ARIZONA_IM_SPK_SHUTDOWN_WARN_EINT2_MASK  0x8000  /* IM_SPK_SHUTDOWN_WARN_EINT2 */
-#define ARIZONA_IM_SPK_SHUTDOWN_WARN_EINT2_SHIFT     15  /* IM_SPK_SHUTDOWN_WARN_EINT2 */
-#define ARIZONA_IM_SPK_SHUTDOWN_WARN_EINT2_WIDTH      1  /* IM_SPK_SHUTDOWN_WARN_EINT2 */
-#define ARIZONA_IM_SPK_SHUTDOWN_EINT2            0x4000  /* IM_SPK_SHUTDOWN_EINT2 */
-#define ARIZONA_IM_SPK_SHUTDOWN_EINT2_MASK       0x4000  /* IM_SPK_SHUTDOWN_EINT2 */
-#define ARIZONA_IM_SPK_SHUTDOWN_EINT2_SHIFT          14  /* IM_SPK_SHUTDOWN_EINT2 */
-#define ARIZONA_IM_SPK_SHUTDOWN_EINT2_WIDTH           1  /* IM_SPK_SHUTDOWN_EINT2 */
+#define ARIZONA_IM_SPK_OVERHEAT_WARN_EINT2       0x8000  /* IM_SPK_OVERHEAT_WARN_EINT2 */
+#define ARIZONA_IM_SPK_OVERHEAT_WARN_EINT2_MASK  0x8000  /* IM_SPK_OVERHEAT_WARN_EINT2 */
+#define ARIZONA_IM_SPK_OVERHEAT_WARN_EINT2_SHIFT     15  /* IM_SPK_OVERHEAT_WARN_EINT2 */
+#define ARIZONA_IM_SPK_OVERHEAT_WARN_EINT2_WIDTH      1  /* IM_SPK_OVERHEAT_WARN_EINT2 */
+#define ARIZONA_IM_SPK_OVERHEAT_EINT2            0x4000  /* IM_SPK_OVERHEAT_EINT2 */
+#define ARIZONA_IM_SPK_OVERHEAT_EINT2_MASK       0x4000  /* IM_SPK_OVERHEAT_EINT2 */
+#define ARIZONA_IM_SPK_OVERHEAT_EINT2_SHIFT          14  /* IM_SPK_OVERHEAT_EINT2 */
+#define ARIZONA_IM_SPK_OVERHEAT_EINT2_WIDTH           1  /* IM_SPK_OVERHEAT_EINT2 */
 #define ARIZONA_IM_HPDET_EINT2                   0x2000  /* IM_HPDET_EINT2 */
 #define ARIZONA_IM_HPDET_EINT2_MASK              0x2000  /* IM_HPDET_EINT2 */
 #define ARIZONA_IM_HPDET_EINT2_SHIFT                 13  /* IM_HPDET_EINT2 */
 #define ARIZONA_IM_ISRC2_CFG_ERR_EINT2_MASK      0x0040  /* IM_ISRC2_CFG_ERR_EINT2 */
 #define ARIZONA_IM_ISRC2_CFG_ERR_EINT2_SHIFT          6  /* IM_ISRC2_CFG_ERR_EINT2 */
 #define ARIZONA_IM_ISRC2_CFG_ERR_EINT2_WIDTH          1  /* IM_ISRC2_CFG_ERR_EINT2 */
+#define ARIZONA_IM_HP3R_DONE_EINT2               0x0020  /* IM_HP3R_DONE_EINT2 */
+#define ARIZONA_IM_HP3R_DONE_EINT2_MASK          0x0020  /* IM_HP3R_DONE_EINT2 */
+#define ARIZONA_IM_HP3R_DONE_EINT2_SHIFT              5  /* IM_HP3R_DONE_EINT2 */
+#define ARIZONA_IM_HP3R_DONE_EINT2_WIDTH              1  /* IM_HP3R_DONE_EINT2 */
+#define ARIZONA_IM_HP3L_DONE_EINT2               0x0010  /* IM_HP3L_DONE_EINT2 */
+#define ARIZONA_IM_HP3L_DONE_EINT2_MASK          0x0010  /* IM_HP3L_DONE_EINT2 */
+#define ARIZONA_IM_HP3L_DONE_EINT2_SHIFT              4  /* IM_HP3L_DONE_EINT2 */
+#define ARIZONA_IM_HP3L_DONE_EINT2_WIDTH              1  /* IM_HP3L_DONE_EINT2 */
+#define ARIZONA_IM_HP2R_DONE_EINT2               0x0008  /* IM_HP2R_DONE_EINT2 */
+#define ARIZONA_IM_HP2R_DONE_EINT2_MASK          0x0008  /* IM_HP2R_DONE_EINT2 */
+#define ARIZONA_IM_HP2R_DONE_EINT2_SHIFT              3  /* IM_HP2R_DONE_EINT2 */
+#define ARIZONA_IM_HP2R_DONE_EINT2_WIDTH              1  /* IM_HP2R_DONE_EINT2 */
+#define ARIZONA_IM_HP2L_DONE_EINT2               0x0004  /* IM_HP2L_DONE_EINT2 */
+#define ARIZONA_IM_HP2L_DONE_EINT2_MASK          0x0004  /* IM_HP2L_DONE_EINT2 */
+#define ARIZONA_IM_HP2L_DONE_EINT2_SHIFT              2  /* IM_HP2L_DONE_EINT2 */
+#define ARIZONA_IM_HP2L_DONE_EINT2_WIDTH              1  /* IM_HP2L_DONE_EINT2 */
+#define ARIZONA_IM_HP1R_DONE_EINT2               0x0002  /* IM_HP1R_DONE_EINT2 */
+#define ARIZONA_IM_HP1R_DONE_EINT2_MASK          0x0002  /* IM_HP1R_DONE_EINT2 */
+#define ARIZONA_IM_HP1R_DONE_EINT2_SHIFT              1  /* IM_HP1R_DONE_EINT2 */
+#define ARIZONA_IM_HP1R_DONE_EINT2_WIDTH              1  /* IM_HP1R_DONE_EINT2 */
+#define ARIZONA_IM_HP1L_DONE_EINT2               0x0001  /* IM_HP1L_DONE_EINT2 */
+#define ARIZONA_IM_HP1L_DONE_EINT2_MASK          0x0001  /* IM_HP1L_DONE_EINT2 */
+#define ARIZONA_IM_HP1L_DONE_EINT2_SHIFT              0  /* IM_HP1L_DONE_EINT2 */
+#define ARIZONA_IM_HP1L_DONE_EINT2_WIDTH              1  /* IM_HP1L_DONE_EINT2 */
+
+/*
+ * R3355 (0xD1B) - IRQ2 Status 4 Mask (Alternate layout)
+ *
+ * Alternate layout used on later devices, note only fields that have moved
+ * are specified
+ */
+#define ARIZONA_V2_IM_AIF3_ERR_EINT2                  0x8000  /* IM_AIF3_ERR_EINT2 */
+#define ARIZONA_V2_IM_AIF3_ERR_EINT2_MASK             0x8000  /* IM_AIF3_ERR_EINT2 */
+#define ARIZONA_V2_IM_AIF3_ERR_EINT2_SHIFT                15  /* IM_AIF3_ERR_EINT2 */
+#define ARIZONA_V2_IM_AIF3_ERR_EINT2_WIDTH                 1  /* IM_AIF3_ERR_EINT2 */
+#define ARIZONA_V2_IM_AIF2_ERR_EINT2                  0x4000  /* IM_AIF2_ERR_EINT2 */
+#define ARIZONA_V2_IM_AIF2_ERR_EINT2_MASK             0x4000  /* IM_AIF2_ERR_EINT2 */
+#define ARIZONA_V2_IM_AIF2_ERR_EINT2_SHIFT                14  /* IM_AIF2_ERR_EINT2 */
+#define ARIZONA_V2_IM_AIF2_ERR_EINT2_WIDTH                 1  /* IM_AIF2_ERR_EINT2 */
+#define ARIZONA_V2_IM_AIF1_ERR_EINT2                  0x2000  /* IM_AIF1_ERR_EINT2 */
+#define ARIZONA_V2_IM_AIF1_ERR_EINT2_MASK             0x2000  /* IM_AIF1_ERR_EINT2 */
+#define ARIZONA_V2_IM_AIF1_ERR_EINT2_SHIFT                13  /* IM_AIF1_ERR_EINT2 */
+#define ARIZONA_V2_IM_AIF1_ERR_EINT2_WIDTH                 1  /* IM_AIF1_ERR_EINT2 */
+#define ARIZONA_V2_IM_CTRLIF_ERR_EINT2                0x1000  /* IM_CTRLIF_ERR_EINT2 */
+#define ARIZONA_V2_IM_CTRLIF_ERR_EINT2_MASK           0x1000  /* IM_CTRLIF_ERR_EINT2 */
+#define ARIZONA_V2_IM_CTRLIF_ERR_EINT2_SHIFT              12  /* IM_CTRLIF_ERR_EINT2 */
+#define ARIZONA_V2_IM_CTRLIF_ERR_EINT2_WIDTH               1  /* IM_CTRLIF_ERR_EINT2 */
+#define ARIZONA_V2_IM_MIXER_DROPPED_SAMPLE_EINT2      0x0800  /* IM_MIXER_DROPPED_SAMPLE_EINT2 */
+#define ARIZONA_V2_IM_MIXER_DROPPED_SAMPLE_EINT2_MASK 0x0800  /* IM_MIXER_DROPPED_SAMPLE_EINT2 */
+#define ARIZONA_V2_IM_MIXER_DROPPED_SAMPLE_EINT2_SHIFT    11  /* IM_MIXER_DROPPED_SAMPLE_EINT2 */
+#define ARIZONA_V2_IM_MIXER_DROPPED_SAMPLE_EINT2_WIDTH     1  /* IM_MIXER_DROPPED_SAMPLE_EINT2 */
+#define ARIZONA_V2_IM_ASYNC_CLK_ENA_LOW_EINT2         0x0400  /* IM_ASYNC_CLK_ENA_LOW_EINT2 */
+#define ARIZONA_V2_IM_ASYNC_CLK_ENA_LOW_EINT2_MASK    0x0400  /* IM_ASYNC_CLK_ENA_LOW_EINT2 */
+#define ARIZONA_V2_IM_ASYNC_CLK_ENA_LOW_EINT2_SHIFT       10  /* IM_ASYNC_CLK_ENA_LOW_EINT2 */
+#define ARIZONA_V2_IM_ASYNC_CLK_ENA_LOW_EINT2_WIDTH        1  /* IM_ASYNC_CLK_ENA_LOW_EINT2 */
+#define ARIZONA_V2_IM_SYSCLK_ENA_LOW_EINT2            0x0200  /* IM_SYSCLK_ENA_LOW_EINT2 */
+#define ARIZONA_V2_IM_SYSCLK_ENA_LOW_EINT2_MASK       0x0200  /* IM_SYSCLK_ENA_LOW_EINT2 */
+#define ARIZONA_V2_IM_SYSCLK_ENA_LOW_EINT2_SHIFT           9  /* IM_SYSCLK_ENA_LOW_EINT2 */
+#define ARIZONA_V2_IM_SYSCLK_ENA_LOW_EINT2_WIDTH           1  /* IM_SYSCLK_ENA_LOW_EINT2 */
+#define ARIZONA_V2_IM_ISRC1_CFG_ERR_EINT2             0x0100  /* IM_ISRC1_CFG_ERR_EINT2 */
+#define ARIZONA_V2_IM_ISRC1_CFG_ERR_EINT2_MASK        0x0100  /* IM_ISRC1_CFG_ERR_EINT2 */
+#define ARIZONA_V2_IM_ISRC1_CFG_ERR_EINT2_SHIFT            8  /* IM_ISRC1_CFG_ERR_EINT2 */
+#define ARIZONA_V2_IM_ISRC1_CFG_ERR_EINT2_WIDTH            1  /* IM_ISRC1_CFG_ERR_EINT2 */
+#define ARIZONA_V2_IM_ISRC2_CFG_ERR_EINT2             0x0080  /* IM_ISRC2_CFG_ERR_EINT2 */
+#define ARIZONA_V2_IM_ISRC2_CFG_ERR_EINT2_MASK        0x0080  /* IM_ISRC2_CFG_ERR_EINT2 */
+#define ARIZONA_V2_IM_ISRC2_CFG_ERR_EINT2_SHIFT            7  /* IM_ISRC2_CFG_ERR_EINT2 */
+#define ARIZONA_V2_IM_ISRC2_CFG_ERR_EINT2_WIDTH            1  /* IM_ISRC2_CFG_ERR_EINT2 */
+#define ARIZONA_V2_IM_ISRC3_CFG_ERR_EINT2             0x0040  /* IM_ISRC3_CFG_ERR_EINT2 */
+#define ARIZONA_V2_IM_ISRC3_CFG_ERR_EINT2_MASK        0x0040  /* IM_ISRC3_CFG_ERR_EINT2 */
+#define ARIZONA_V2_IM_ISRC3_CFG_ERR_EINT2_SHIFT            6  /* IM_ISRC3_CFG_ERR_EINT2 */
+#define ARIZONA_V2_IM_ISRC3_CFG_ERR_EINT2_WIDTH            1  /* IM_ISRC3_CFG_ERR_EINT2 */
 
 /*
  * R3356 (0xD1C) - IRQ2 Status 5 Mask
 #define ARIZONA_IM_FLL1_CLOCK_OK_EINT2_SHIFT          0  /* IM_FLL1_CLOCK_OK_EINT2 */
 #define ARIZONA_IM_FLL1_CLOCK_OK_EINT2_WIDTH          1  /* IM_FLL1_CLOCK_OK_EINT2 */
 
+/*
+ * R3340 (0xD0C) - Interrupt Status 5 Mask (Alternate layout)
+ *
+ * Alternate layout used on later devices, note only fields that have moved
+ * are specified
+ */
+#define ARIZONA_V2_IM_ASRC_CFG_ERR_EINT2         0x0008  /* IM_ASRC_CFG_ERR_EINT2 */
+#define ARIZONA_V2_IM_ASRC_CFG_ERR_EINT2_MASK    0x0008  /* IM_ASRC_CFG_ERR_EINT2 */
+#define ARIZONA_V2_IM_ASRC_CFG_ERR_EINT2_SHIFT        3  /* IM_ASRC_CFG_ERR_EINT2 */
+#define ARIZONA_V2_IM_ASRC_CFG_ERR_EINT2_WIDTH        1  /* IM_ASRC_CFG_ERR_EINT2 */
+
+/*
+ * R3357 (0xD1D) - IRQ2 Status 6 Mask
+ */
+#define ARIZONA_IM_DSP_SHARED_WR_COLL_EINT2      0x8000  /* IM_DSP_SHARED_WR_COLL_EINT2 */
+#define ARIZONA_IM_DSP_SHARED_WR_COLL_EINT2_MASK 0x8000  /* IM_DSP_SHARED_WR_COLL_EINT2 */
+#define ARIZONA_IM_DSP_SHARED_WR_COLL_EINT2_SHIFT    15  /* IM_DSP_SHARED_WR_COLL_EINT2 */
+#define ARIZONA_IM_DSP_SHARED_WR_COLL_EINT2_WIDTH     1  /* IM_DSP_SHARED_WR_COLL_EINT2 */
+#define ARIZONA_IM_SPK_SHUTDOWN_EINT2            0x4000  /* IM_SPK_SHUTDOWN_EINT2 */
+#define ARIZONA_IM_SPK_SHUTDOWN_EINT2_MASK       0x4000  /* IM_SPK_SHUTDOWN_EINT2 */
+#define ARIZONA_IM_SPK_SHUTDOWN_EINT2_SHIFT          14  /* IM_SPK_SHUTDOWN_EINT2 */
+#define ARIZONA_IM_SPK_SHUTDOWN_EINT2_WIDTH           1  /* IM_SPK_SHUTDOWN_EINT2 */
+#define ARIZONA_IM_SPK1R_SHORT_EINT2             0x2000  /* IM_SPK1R_SHORT_EINT2 */
+#define ARIZONA_IM_SPK1R_SHORT_EINT2_MASK        0x2000  /* IM_SPK1R_SHORT_EINT2 */
+#define ARIZONA_IM_SPK1R_SHORT_EINT2_SHIFT           13  /* IM_SPK1R_SHORT_EINT2 */
+#define ARIZONA_IM_SPK1R_SHORT_EINT2_WIDTH            1  /* IM_SPK1R_SHORT_EINT2 */
+#define ARIZONA_IM_SPK1L_SHORT_EINT2             0x1000  /* IM_SPK1L_SHORT_EINT2 */
+#define ARIZONA_IM_SPK1L_SHORT_EINT2_MASK        0x1000  /* IM_SPK1L_SHORT_EINT2 */
+#define ARIZONA_IM_SPK1L_SHORT_EINT2_SHIFT           12  /* IM_SPK1L_SHORT_EINT2 */
+#define ARIZONA_IM_SPK1L_SHORT_EINT2_WIDTH            1  /* IM_SPK1L_SHORT_EINT2 */
+#define ARIZONA_IM_HP3R_SC_NEG_EINT2             0x0800  /* IM_HP3R_SC_NEG_EINT2 */
+#define ARIZONA_IM_HP3R_SC_NEG_EINT2_MASK        0x0800  /* IM_HP3R_SC_NEG_EINT2 */
+#define ARIZONA_IM_HP3R_SC_NEG_EINT2_SHIFT           11  /* IM_HP3R_SC_NEG_EINT2 */
+#define ARIZONA_IM_HP3R_SC_NEG_EINT2_WIDTH            1  /* IM_HP3R_SC_NEG_EINT2 */
+#define ARIZONA_IM_HP3R_SC_POS_EINT2             0x0400  /* IM_HP3R_SC_POS_EINT2 */
+#define ARIZONA_IM_HP3R_SC_POS_EINT2_MASK        0x0400  /* IM_HP3R_SC_POS_EINT2 */
+#define ARIZONA_IM_HP3R_SC_POS_EINT2_SHIFT           10  /* IM_HP3R_SC_POS_EINT2 */
+#define ARIZONA_IM_HP3R_SC_POS_EINT2_WIDTH            1  /* IM_HP3R_SC_POS_EINT2 */
+#define ARIZONA_IM_HP3L_SC_NEG_EINT2             0x0200  /* IM_HP3L_SC_NEG_EINT2 */
+#define ARIZONA_IM_HP3L_SC_NEG_EINT2_MASK        0x0200  /* IM_HP3L_SC_NEG_EINT2 */
+#define ARIZONA_IM_HP3L_SC_NEG_EINT2_SHIFT            9  /* IM_HP3L_SC_NEG_EINT2 */
+#define ARIZONA_IM_HP3L_SC_NEG_EINT2_WIDTH            1  /* IM_HP3L_SC_NEG_EINT2 */
+#define ARIZONA_IM_HP3L_SC_POS_EINT2             0x0100  /* IM_HP3L_SC_POS_EINT2 */
+#define ARIZONA_IM_HP3L_SC_POS_EINT2_MASK        0x0100  /* IM_HP3L_SC_POS_EINT2 */
+#define ARIZONA_IM_HP3L_SC_POS_EINT2_SHIFT            8  /* IM_HP3L_SC_POS_EINT2 */
+#define ARIZONA_IM_HP3L_SC_POS_EINT2_WIDTH            1  /* IM_HP3L_SC_POS_EINT2 */
+#define ARIZONA_IM_HP2R_SC_NEG_EINT2             0x0080  /* IM_HP2R_SC_NEG_EINT2 */
+#define ARIZONA_IM_HP2R_SC_NEG_EINT2_MASK        0x0080  /* IM_HP2R_SC_NEG_EINT2 */
+#define ARIZONA_IM_HP2R_SC_NEG_EINT2_SHIFT            7  /* IM_HP2R_SC_NEG_EINT2 */
+#define ARIZONA_IM_HP2R_SC_NEG_EINT2_WIDTH            1  /* IM_HP2R_SC_NEG_EINT2 */
+#define ARIZONA_IM_HP2R_SC_POS_EINT2             0x0040  /* IM_HP2R_SC_POS_EINT2 */
+#define ARIZONA_IM_HP2R_SC_POS_EINT2_MASK        0x0040  /* IM_HP2R_SC_POS_EINT2 */
+#define ARIZONA_IM_HP2R_SC_POS_EINT2_SHIFT            6  /* IM_HP2R_SC_POS_EINT2 */
+#define ARIZONA_IM_HP2R_SC_POS_EINT2_WIDTH            1  /* IM_HP2R_SC_POS_EINT2 */
+#define ARIZONA_IM_HP2L_SC_NEG_EINT2             0x0020  /* IM_HP2L_SC_NEG_EINT2 */
+#define ARIZONA_IM_HP2L_SC_NEG_EINT2_MASK        0x0020  /* IM_HP2L_SC_NEG_EINT2 */
+#define ARIZONA_IM_HP2L_SC_NEG_EINT2_SHIFT            5  /* IM_HP2L_SC_NEG_EINT2 */
+#define ARIZONA_IM_HP2L_SC_NEG_EINT2_WIDTH            1  /* IM_HP2L_SC_NEG_EINT2 */
+#define ARIZONA_IM_HP2L_SC_POS_EINT2             0x0010  /* IM_HP2L_SC_POS_EINT2 */
+#define ARIZONA_IM_HP2L_SC_POS_EINT2_MASK        0x0010  /* IM_HP2L_SC_POS_EINT2 */
+#define ARIZONA_IM_HP2L_SC_POS_EINT2_SHIFT            4  /* IM_HP2L_SC_POS_EINT2 */
+#define ARIZONA_IM_HP2L_SC_POS_EINT2_WIDTH            1  /* IM_HP2L_SC_POS_EINT2 */
+#define ARIZONA_IM_HP1R_SC_NEG_EINT2             0x0008  /* IM_HP1R_SC_NEG_EINT2 */
+#define ARIZONA_IM_HP1R_SC_NEG_EINT2_MASK        0x0008  /* IM_HP1R_SC_NEG_EINT2 */
+#define ARIZONA_IM_HP1R_SC_NEG_EINT2_SHIFT            3  /* IM_HP1R_SC_NEG_EINT2 */
+#define ARIZONA_IM_HP1R_SC_NEG_EINT2_WIDTH            1  /* IM_HP1R_SC_NEG_EINT2 */
+#define ARIZONA_IM_HP1R_SC_POS_EINT2             0x0004  /* IM_HP1R_SC_POS_EINT2 */
+#define ARIZONA_IM_HP1R_SC_POS_EINT2_MASK        0x0004  /* IM_HP1R_SC_POS_EINT2 */
+#define ARIZONA_IM_HP1R_SC_POS_EINT2_SHIFT            2  /* IM_HP1R_SC_POS_EINT2 */
+#define ARIZONA_IM_HP1R_SC_POS_EINT2_WIDTH            1  /* IM_HP1R_SC_POS_EINT2 */
+#define ARIZONA_IM_HP1L_SC_NEG_EINT2             0x0002  /* IM_HP1L_SC_NEG_EINT2 */
+#define ARIZONA_IM_HP1L_SC_NEG_EINT2_MASK        0x0002  /* IM_HP1L_SC_NEG_EINT2 */
+#define ARIZONA_IM_HP1L_SC_NEG_EINT2_SHIFT            1  /* IM_HP1L_SC_NEG_EINT2 */
+#define ARIZONA_IM_HP1L_SC_NEG_EINT2_WIDTH            1  /* IM_HP1L_SC_NEG_EINT2 */
+#define ARIZONA_IM_HP1L_SC_POS_EINT2             0x0001  /* IM_HP1L_SC_POS_EINT2 */
+#define ARIZONA_IM_HP1L_SC_POS_EINT2_MASK        0x0001  /* IM_HP1L_SC_POS_EINT2 */
+#define ARIZONA_IM_HP1L_SC_POS_EINT2_SHIFT            0  /* IM_HP1L_SC_POS_EINT2 */
+#define ARIZONA_IM_HP1L_SC_POS_EINT2_WIDTH            1  /* IM_HP1L_SC_POS_EINT2 */
+
 /*
  * R3359 (0xD1F) - IRQ2 Control
  */
 /*
  * R3361 (0xD21) - Interrupt Raw Status 3
  */
-#define ARIZONA_SPK_SHUTDOWN_WARN_STS            0x8000  /* SPK_SHUTDOWN_WARN_STS */
-#define ARIZONA_SPK_SHUTDOWN_WARN_STS_MASK       0x8000  /* SPK_SHUTDOWN_WARN_STS */
-#define ARIZONA_SPK_SHUTDOWN_WARN_STS_SHIFT          15  /* SPK_SHUTDOWN_WARN_STS */
-#define ARIZONA_SPK_SHUTDOWN_WARN_STS_WIDTH           1  /* SPK_SHUTDOWN_WARN_STS */
-#define ARIZONA_SPK_SHUTDOWN_STS                 0x4000  /* SPK_SHUTDOWN_STS */
-#define ARIZONA_SPK_SHUTDOWN_STS_MASK            0x4000  /* SPK_SHUTDOWN_STS */
-#define ARIZONA_SPK_SHUTDOWN_STS_SHIFT               14  /* SPK_SHUTDOWN_STS */
-#define ARIZONA_SPK_SHUTDOWN_STS_WIDTH                1  /* SPK_SHUTDOWN_STS */
+#define ARIZONA_SPK_OVERHEAT_WARN_STS            0x8000  /* SPK_OVERHEAT_WARN_STS */
+#define ARIZONA_SPK_OVERHEAT_WARN_STS_MASK       0x8000  /* SPK_OVERHEAT_WARN_STS */
+#define ARIZONA_SPK_OVERHEAT_WARN_STS_SHIFT          15  /* SPK_OVERHEAT_WARN_STS */
+#define ARIZONA_SPK_OVERHEAT_WARN_STS_WIDTH           1  /* SPK_OVERHEAT_WARN_STS */
+#define ARIZONA_SPK_OVERHEAT_STS                 0x4000  /* SPK_OVERHEAT_STS */
+#define ARIZONA_SPK_OVERHEAT_STS_MASK            0x4000  /* SPK_OVERHEAT_STS */
+#define ARIZONA_SPK_OVERHEAT_STS_SHIFT               14  /* SPK_OVERHEAT_STS */
+#define ARIZONA_SPK_OVERHEAT_STS_WIDTH                1  /* SPK_OVERHEAT_STS */
 #define ARIZONA_HPDET_STS                        0x2000  /* HPDET_STS */
 #define ARIZONA_HPDET_STS_MASK                   0x2000  /* HPDET_STS */
 #define ARIZONA_HPDET_STS_SHIFT                      13  /* HPDET_STS */
 #define ARIZONA_ISRC2_CFG_ERR_STS_MASK           0x0040  /* ISRC2_CFG_ERR_STS */
 #define ARIZONA_ISRC2_CFG_ERR_STS_SHIFT               6  /* ISRC2_CFG_ERR_STS */
 #define ARIZONA_ISRC2_CFG_ERR_STS_WIDTH               1  /* ISRC2_CFG_ERR_STS */
+#define ARIZONA_HP3R_DONE_STS                    0x0020  /* HP3R_DONE_STS */
+#define ARIZONA_HP3R_DONE_STS_MASK               0x0020  /* HP3R_DONE_STS */
+#define ARIZONA_HP3R_DONE_STS_SHIFT                   5  /* HP3R_DONE_STS */
+#define ARIZONA_HP3R_DONE_STS_WIDTH                   1  /* HP3R_DONE_STS */
+#define ARIZONA_HP3L_DONE_STS                    0x0010  /* HP3L_DONE_STS */
+#define ARIZONA_HP3L_DONE_STS_MASK               0x0010  /* HP3L_DONE_STS */
+#define ARIZONA_HP3L_DONE_STS_SHIFT                   4  /* HP3L_DONE_STS */
+#define ARIZONA_HP3L_DONE_STS_WIDTH                   1  /* HP3L_DONE_STS */
+#define ARIZONA_HP2R_DONE_STS                    0x0008  /* HP2R_DONE_STS */
+#define ARIZONA_HP2R_DONE_STS_MASK               0x0008  /* HP2R_DONE_STS */
+#define ARIZONA_HP2R_DONE_STS_SHIFT                   3  /* HP2R_DONE_STS */
+#define ARIZONA_HP2R_DONE_STS_WIDTH                   1  /* HP2R_DONE_STS */
+#define ARIZONA_HP2L_DONE_STS                    0x0004  /* HP2L_DONE_STS */
+#define ARIZONA_HP2L_DONE_STS_MASK               0x0004  /* HP2L_DONE_STS */
+#define ARIZONA_HP2L_DONE_STS_SHIFT                   2  /* HP2L_DONE_STS */
+#define ARIZONA_HP2L_DONE_STS_WIDTH                   1  /* HP2L_DONE_STS */
+#define ARIZONA_HP1R_DONE_STS                    0x0002  /* HP1R_DONE_STS */
+#define ARIZONA_HP1R_DONE_STS_MASK               0x0002  /* HP1R_DONE_STS */
+#define ARIZONA_HP1R_DONE_STS_SHIFT                   1  /* HP1R_DONE_STS */
+#define ARIZONA_HP1R_DONE_STS_WIDTH                   1  /* HP1R_DONE_STS */
+#define ARIZONA_HP1L_DONE_STS                    0x0001  /* HP1L_DONE_STS */
+#define ARIZONA_HP1L_DONE_STS_MASK               0x0001  /* HP1L_DONE_STS */
+#define ARIZONA_HP1L_DONE_STS_SHIFT                   0  /* HP1L_DONE_STS */
+#define ARIZONA_HP1L_DONE_STS_WIDTH                   1  /* HP1L_DONE_STS */
 
 /*
  * R3363 (0xD23) - Interrupt Raw Status 5
 #define ARIZONA_ADSP2_1_OVERCLOCKED_STS_MASK     0x0008  /* ADSP2_1_OVERCLOCKED_STS */
 #define ARIZONA_ADSP2_1_OVERCLOCKED_STS_SHIFT         3  /* ADSP2_1_OVERCLOCKED_STS */
 #define ARIZONA_ADSP2_1_OVERCLOCKED_STS_WIDTH         1  /* ADSP2_1_OVERCLOCKED_STS */
+#define ARIZONA_ISRC3_OVERCLOCKED_STS            0x0004  /* ISRC3_OVERCLOCKED_STS */
+#define ARIZONA_ISRC3_OVERCLOCKED_STS_MASK       0x0004  /* ISRC3_OVERCLOCKED_STS */
+#define ARIZONA_ISRC3_OVERCLOCKED_STS_SHIFT           2  /* ISRC3_OVERCLOCKED_STS */
+#define ARIZONA_ISRC3_OVERCLOCKED_STS_WIDTH           1  /* ISRC3_OVERCLOCKED_STS */
 #define ARIZONA_ISRC2_OVERCLOCKED_STS            0x0002  /* ISRC2_OVERCLOCKED_STS */
 #define ARIZONA_ISRC2_OVERCLOCKED_STS_MASK       0x0002  /* ISRC2_OVERCLOCKED_STS */
 #define ARIZONA_ISRC2_OVERCLOCKED_STS_SHIFT           1  /* ISRC2_OVERCLOCKED_STS */
 #define ARIZONA_AIF1_UNDERCLOCKED_STS_MASK       0x0100  /* AIF1_UNDERCLOCKED_STS */
 #define ARIZONA_AIF1_UNDERCLOCKED_STS_SHIFT           8  /* AIF1_UNDERCLOCKED_STS */
 #define ARIZONA_AIF1_UNDERCLOCKED_STS_WIDTH           1  /* AIF1_UNDERCLOCKED_STS */
+#define ARIZONA_ISRC3_UNDERCLOCKED_STS           0x0080  /* ISRC3_UNDERCLOCKED_STS */
+#define ARIZONA_ISRC3_UNDERCLOCKED_STS_MASK      0x0080  /* ISRC3_UNDERCLOCKED_STS */
+#define ARIZONA_ISRC3_UNDERCLOCKED_STS_SHIFT          7  /* ISRC3_UNDERCLOCKED_STS */
+#define ARIZONA_ISRC3_UNDERCLOCKED_STS_WIDTH          1  /* ISRC3_UNDERCLOCKED_STS */
 #define ARIZONA_ISRC2_UNDERCLOCKED_STS           0x0040  /* ISRC2_UNDERCLOCKED_STS */
 #define ARIZONA_ISRC2_UNDERCLOCKED_STS_MASK      0x0040  /* ISRC2_UNDERCLOCKED_STS */
 #define ARIZONA_ISRC2_UNDERCLOCKED_STS_SHIFT          6  /* ISRC2_UNDERCLOCKED_STS */
 #define ARIZONA_MIXER_UNDERCLOCKED_STS_SHIFT          0  /* MIXER_UNDERCLOCKED_STS */
 #define ARIZONA_MIXER_UNDERCLOCKED_STS_WIDTH          1  /* MIXER_UNDERCLOCKED_STS */
 
+/*
+ * R3368 (0xD28) - Interrupt Raw Status 9
+ */
+#define ARIZONA_DSP_SHARED_WR_COLL_STS           0x8000  /* DSP_SHARED_WR_COLL_STS */
+#define ARIZONA_DSP_SHARED_WR_COLL_STS_MASK      0x8000  /* DSP_SHARED_WR_COLL_STS */
+#define ARIZONA_DSP_SHARED_WR_COLL_STS_SHIFT         15  /* DSP_SHARED_WR_COLL_STS */
+#define ARIZONA_DSP_SHARED_WR_COLL_STS_WIDTH          1  /* DSP_SHARED_WR_COLL_STS */
+#define ARIZONA_SPK_SHUTDOWN_STS                 0x4000  /* SPK_SHUTDOWN_STS */
+#define ARIZONA_SPK_SHUTDOWN_STS_MASK            0x4000  /* SPK_SHUTDOWN_STS */
+#define ARIZONA_SPK_SHUTDOWN_STS_SHIFT               14  /* SPK_SHUTDOWN_STS */
+#define ARIZONA_SPK_SHUTDOWN_STS_WIDTH                1  /* SPK_SHUTDOWN_STS */
+#define ARIZONA_SPK1R_SHORT_STS                  0x2000  /* SPK1R_SHORT_STS */
+#define ARIZONA_SPK1R_SHORT_STS_MASK             0x2000  /* SPK1R_SHORT_STS */
+#define ARIZONA_SPK1R_SHORT_STS_SHIFT                13  /* SPK1R_SHORT_STS */
+#define ARIZONA_SPK1R_SHORT_STS_WIDTH                 1  /* SPK1R_SHORT_STS */
+#define ARIZONA_SPK1L_SHORT_STS                  0x1000  /* SPK1L_SHORT_STS */
+#define ARIZONA_SPK1L_SHORT_STS_MASK             0x1000  /* SPK1L_SHORT_STS */
+#define ARIZONA_SPK1L_SHORT_STS_SHIFT                12  /* SPK1L_SHORT_STS */
+#define ARIZONA_SPK1L_SHORT_STS_WIDTH                 1  /* SPK1L_SHORT_STS */
+#define ARIZONA_HP3R_SC_NEG_STS                  0x0800  /* HP3R_SC_NEG_STS */
+#define ARIZONA_HP3R_SC_NEG_STS_MASK             0x0800  /* HP3R_SC_NEG_STS */
+#define ARIZONA_HP3R_SC_NEG_STS_SHIFT                11  /* HP3R_SC_NEG_STS */
+#define ARIZONA_HP3R_SC_NEG_STS_WIDTH                 1  /* HP3R_SC_NEG_STS */
+#define ARIZONA_HP3R_SC_POS_STS                  0x0400  /* HP3R_SC_POS_STS */
+#define ARIZONA_HP3R_SC_POS_STS_MASK             0x0400  /* HP3R_SC_POS_STS */
+#define ARIZONA_HP3R_SC_POS_STS_SHIFT                10  /* HP3R_SC_POS_STS */
+#define ARIZONA_HP3R_SC_POS_STS_WIDTH                 1  /* HP3R_SC_POS_STS */
+#define ARIZONA_HP3L_SC_NEG_STS                  0x0200  /* HP3L_SC_NEG_STS */
+#define ARIZONA_HP3L_SC_NEG_STS_MASK             0x0200  /* HP3L_SC_NEG_STS */
+#define ARIZONA_HP3L_SC_NEG_STS_SHIFT                 9  /* HP3L_SC_NEG_STS */
+#define ARIZONA_HP3L_SC_NEG_STS_WIDTH                 1  /* HP3L_SC_NEG_STS */
+#define ARIZONA_HP3L_SC_POS_STS                  0x0100  /* HP3L_SC_POS_STS */
+#define ARIZONA_HP3L_SC_POS_STS_MASK             0x0100  /* HP3L_SC_POS_STS */
+#define ARIZONA_HP3L_SC_POS_STS_SHIFT                 8  /* HP3L_SC_POS_STS */
+#define ARIZONA_HP3L_SC_POS_STS_WIDTH                 1  /* HP3L_SC_POS_STS */
+#define ARIZONA_HP2R_SC_NEG_STS                  0x0080  /* HP2R_SC_NEG_STS */
+#define ARIZONA_HP2R_SC_NEG_STS_MASK             0x0080  /* HP2R_SC_NEG_STS */
+#define ARIZONA_HP2R_SC_NEG_STS_SHIFT                 7  /* HP2R_SC_NEG_STS */
+#define ARIZONA_HP2R_SC_NEG_STS_WIDTH                 1  /* HP2R_SC_NEG_STS */
+#define ARIZONA_HP2R_SC_POS_STS                  0x0040  /* HP2R_SC_POS_STS */
+#define ARIZONA_HP2R_SC_POS_STS_MASK             0x0040  /* HP2R_SC_POS_STS */
+#define ARIZONA_HP2R_SC_POS_STS_SHIFT                 6  /* HP2R_SC_POS_STS */
+#define ARIZONA_HP2R_SC_POS_STS_WIDTH                 1  /* HP2R_SC_POS_STS */
+#define ARIZONA_HP2L_SC_NEG_STS                  0x0020  /* HP2L_SC_NEG_STS */
+#define ARIZONA_HP2L_SC_NEG_STS_MASK             0x0020  /* HP2L_SC_NEG_STS */
+#define ARIZONA_HP2L_SC_NEG_STS_SHIFT                 5  /* HP2L_SC_NEG_STS */
+#define ARIZONA_HP2L_SC_NEG_STS_WIDTH                 1  /* HP2L_SC_NEG_STS */
+#define ARIZONA_HP2L_SC_POS_STS                  0x0010  /* HP2L_SC_POS_STS */
+#define ARIZONA_HP2L_SC_POS_STS_MASK             0x0010  /* HP2L_SC_POS_STS */
+#define ARIZONA_HP2L_SC_POS_STS_SHIFT                 4  /* HP2L_SC_POS_STS */
+#define ARIZONA_HP2L_SC_POS_STS_WIDTH                 1  /* HP2L_SC_POS_STS */
+#define ARIZONA_HP1R_SC_NEG_STS                  0x0008  /* HP1R_SC_NEG_STS */
+#define ARIZONA_HP1R_SC_NEG_STS_MASK             0x0008  /* HP1R_SC_NEG_STS */
+#define ARIZONA_HP1R_SC_NEG_STS_SHIFT                 3  /* HP1R_SC_NEG_STS */
+#define ARIZONA_HP1R_SC_NEG_STS_WIDTH                 1  /* HP1R_SC_NEG_STS */
+#define ARIZONA_HP1R_SC_POS_STS                  0x0004  /* HP1R_SC_POS_STS */
+#define ARIZONA_HP1R_SC_POS_STS_MASK             0x0004  /* HP1R_SC_POS_STS */
+#define ARIZONA_HP1R_SC_POS_STS_SHIFT                 2  /* HP1R_SC_POS_STS */
+#define ARIZONA_HP1R_SC_POS_STS_WIDTH                 1  /* HP1R_SC_POS_STS */
+#define ARIZONA_HP1L_SC_NEG_STS                  0x0002  /* HP1L_SC_NEG_STS */
+#define ARIZONA_HP1L_SC_NEG_STS_MASK             0x0002  /* HP1L_SC_NEG_STS */
+#define ARIZONA_HP1L_SC_NEG_STS_SHIFT                 1  /* HP1L_SC_NEG_STS */
+#define ARIZONA_HP1L_SC_NEG_STS_WIDTH                 1  /* HP1L_SC_NEG_STS */
+#define ARIZONA_HP1L_SC_POS_STS                  0x0001  /* HP1L_SC_POS_STS */
+#define ARIZONA_HP1L_SC_POS_STS_MASK             0x0001  /* HP1L_SC_POS_STS */
+#define ARIZONA_HP1L_SC_POS_STS_SHIFT                 0  /* HP1L_SC_POS_STS */
+#define ARIZONA_HP1L_SC_POS_STS_WIDTH                 1  /* HP1L_SC_POS_STS */
+
 /*
  * R3392 (0xD40) - IRQ Pin Status
  */
index 887ef4f7bef7225995d4e4e2afda86ab6f5ad1cc..fcbe9d129a9da60e1c47e3682ce18961b460a223 100644 (file)
@@ -16,7 +16,9 @@
 #ifndef __LINUX_MFD_CROS_EC_H
 #define __LINUX_MFD_CROS_EC_H
 
+#include <linux/notifier.h>
 #include <linux/mfd/cros_ec_commands.h>
+#include <linux/mutex.h>
 
 /*
  * Command interface between EC and AP, for LPC, I2C and SPI interfaces.
@@ -33,83 +35,76 @@ enum {
                                        EC_MSG_TX_PROTO_BYTES,
 };
 
-/**
- * struct cros_ec_msg - A message sent to the EC, and its reply
- *
+/*
  * @version: Command version number (often 0)
- * @cmd: Command to send (EC_CMD_...)
- * @out_buf: Outgoing payload (to EC)
- * @outlen: Outgoing length
- * @in_buf: Incoming payload (from EC)
- * @in_len: Incoming length
+ * @command: Command to send (EC_CMD_...)
+ * @outdata: Outgoing data to EC
+ * @outsize: Outgoing length in bytes
+ * @indata: Where to put the incoming data from EC
+ * @insize: Max number of bytes to accept from EC
+ * @result: EC's response to the command (separate from communication failure)
  */
-struct cros_ec_msg {
-       u8 version;
-       u8 cmd;
-       uint8_t *out_buf;
-       int out_len;
-       uint8_t *in_buf;
-       int in_len;
+struct cros_ec_command {
+       uint32_t version;
+       uint32_t command;
+       uint8_t *outdata;
+       uint32_t outsize;
+       uint8_t *indata;
+       uint32_t insize;
+       uint32_t result;
 };
 
 /**
  * struct cros_ec_device - Information about a ChromeOS EC device
  *
- * @name: Name of this EC interface
+ * @ec_name: name of EC device (e.g. 'chromeos-ec')
+ * @phys_name: name of physical comms layer (e.g. 'i2c-4')
+ * @dev: Device pointer
+ * @was_wake_device: true if this device was set to wake the system from
+ * sleep at the last suspend
+ * @cmd_xfer: send command to EC and get response
+ *     Returns the number of bytes received if the communication succeeded, but
+ *     that doesn't mean the EC was happy with the command. The caller
+ *     should check msg.result for the EC's result code.
+ *
  * @priv: Private data
  * @irq: Interrupt to use
- * @din: input buffer (from EC)
- * @dout: output buffer (to EC)
+ * @din: input buffer (for data from EC)
+ * @dout: output buffer (for data to EC)
  * \note
  * These two buffers will always be dword-aligned and include enough
  * space for up to 7 word-alignment bytes also, so we can ensure that
  * the body of the message is always dword-aligned (64-bit).
- *
  * We use this alignment to keep ARM and x86 happy. Probably word
  * alignment would be OK, there might be a small performance advantage
  * to using dword.
- * @din_size: size of din buffer
- * @dout_size: size of dout buffer
- * @command_send: send a command
- * @command_recv: receive a command
- * @ec_name: name of EC device (e.g. 'chromeos-ec')
- * @phys_name: name of physical comms layer (e.g. 'i2c-4')
+ * @din_size: size of din buffer to allocate (zero to use static din)
+ * @dout_size: size of dout buffer to allocate (zero to use static dout)
  * @parent: pointer to parent device (e.g. i2c or spi device)
- * @dev: Device pointer
- * dev_lock: Lock to prevent concurrent access
  * @wake_enabled: true if this device can wake the system from sleep
- * @was_wake_device: true if this device was set to wake the system from
- * sleep at the last suspend
- * @event_notifier: interrupt event notifier for transport devices
+ * @lock: one transaction at a time
  */
 struct cros_ec_device {
-       const char *name;
+
+       /* These are used by other drivers that want to talk to the EC */
+       const char *ec_name;
+       const char *phys_name;
+       struct device *dev;
+       bool was_wake_device;
+       struct class *cros_class;
+       int (*cmd_xfer)(struct cros_ec_device *ec,
+                       struct cros_ec_command *msg);
+
+       /* These are used to implement the platform-specific interface */
        void *priv;
        int irq;
        uint8_t *din;
        uint8_t *dout;
        int din_size;
        int dout_size;
-       int (*command_send)(struct cros_ec_device *ec,
-                       uint16_t cmd, void *out_buf, int out_len);
-       int (*command_recv)(struct cros_ec_device *ec,
-                       uint16_t cmd, void *in_buf, int in_len);
-       int (*command_sendrecv)(struct cros_ec_device *ec,
-                       uint16_t cmd, void *out_buf, int out_len,
-                       void *in_buf, int in_len);
-       int (*command_xfer)(struct cros_ec_device *ec,
-                       struct cros_ec_msg *msg);
-
-       const char *ec_name;
-       const char *phys_name;
        struct device *parent;
-
-       /* These are --private-- fields - do not assign */
-       struct device *dev;
-       struct mutex dev_lock;
        bool wake_enabled;
-       bool was_wake_device;
-       struct blocking_notifier_head event_notifier;
+       struct mutex lock;
 };
 
 /**
@@ -143,13 +138,24 @@ int cros_ec_resume(struct cros_ec_device *ec_dev);
  * @msg: Message to write
  */
 int cros_ec_prepare_tx(struct cros_ec_device *ec_dev,
-                      struct cros_ec_msg *msg);
+                      struct cros_ec_command *msg);
+
+/**
+ * cros_ec_check_result - Check ec_msg->result
+ *
+ * This is used by ChromeOS EC drivers to check the ec_msg->result for
+ * errors and to warn about them.
+ *
+ * @ec_dev: EC device
+ * @msg: Message to check
+ */
+int cros_ec_check_result(struct cros_ec_device *ec_dev,
+                        struct cros_ec_command *msg);
 
 /**
  * cros_ec_remove - Remove a ChromeOS EC
  *
- * Call this to deregister a ChromeOS EC. After this you should call
- * cros_ec_free().
+ * Call this to deregister a ChromeOS EC, then clean up any private data.
  *
  * @ec_dev: Device to register
  * @return 0 if ok, -ve on error
index 00a9aac5d1e87fe5a6fa53a00fc9390392c5b6c9..b92a3262f8f6cd19130cafaaa80f7cf455f39c0c 100644 (file)
@@ -34,7 +34,8 @@ enum da9063_models {
 };
 
 enum da9063_variant_codes {
-       PMIC_DA9063_BB = 0x5
+       PMIC_DA9063_AD = 0x3,
+       PMIC_DA9063_BB = 0x5,
 };
 
 /* Interrupts */
index 09a85c699da1d2f28abc88ecea590077c4c5edad..2e0ba6d5fbc3c4496f70b2204fc13fd895e98580 100644 (file)
 #define        DA9063_REG_COUNT_D              0x43
 #define        DA9063_REG_COUNT_MO             0x44
 #define        DA9063_REG_COUNT_Y              0x45
-#define        DA9063_REG_ALARM_S              0x46
-#define        DA9063_REG_ALARM_MI             0x47
-#define        DA9063_REG_ALARM_H              0x48
-#define        DA9063_REG_ALARM_D              0x49
-#define        DA9063_REG_ALARM_MO             0x4A
-#define        DA9063_REG_ALARM_Y              0x4B
-#define        DA9063_REG_SECOND_A             0x4C
-#define        DA9063_REG_SECOND_B             0x4D
-#define        DA9063_REG_SECOND_C             0x4E
-#define        DA9063_REG_SECOND_D             0x4F
+
+#define        DA9063_AD_REG_ALARM_MI          0x46
+#define        DA9063_AD_REG_ALARM_H           0x47
+#define        DA9063_AD_REG_ALARM_D           0x48
+#define        DA9063_AD_REG_ALARM_MO          0x49
+#define        DA9063_AD_REG_ALARM_Y           0x4A
+#define        DA9063_AD_REG_SECOND_A          0x4B
+#define        DA9063_AD_REG_SECOND_B          0x4C
+#define        DA9063_AD_REG_SECOND_C          0x4D
+#define        DA9063_AD_REG_SECOND_D          0x4E
+
+#define        DA9063_BB_REG_ALARM_S           0x46
+#define        DA9063_BB_REG_ALARM_MI          0x47
+#define        DA9063_BB_REG_ALARM_H           0x48
+#define        DA9063_BB_REG_ALARM_D           0x49
+#define        DA9063_BB_REG_ALARM_MO          0x4A
+#define        DA9063_BB_REG_ALARM_Y           0x4B
+#define        DA9063_BB_REG_SECOND_A          0x4C
+#define        DA9063_BB_REG_SECOND_B          0x4D
+#define        DA9063_BB_REG_SECOND_C          0x4E
+#define        DA9063_BB_REG_SECOND_D          0x4F
 
 /* Sequencer Control Registers */
 #define        DA9063_REG_SEQ                  0x81
 #define        DA9063_REG_CONFIG_J             0x10F
 #define        DA9063_REG_CONFIG_K             0x110
 #define        DA9063_REG_CONFIG_L             0x111
-#define        DA9063_REG_CONFIG_M             0x112
-#define        DA9063_REG_CONFIG_N             0x113
-
-#define        DA9063_REG_MON_REG_1            0x114
-#define        DA9063_REG_MON_REG_2            0x115
-#define        DA9063_REG_MON_REG_3            0x116
-#define        DA9063_REG_MON_REG_4            0x117
-#define        DA9063_REG_MON_REG_5            0x11E
-#define        DA9063_REG_MON_REG_6            0x11F
-#define        DA9063_REG_TRIM_CLDR            0x120
+
+#define        DA9063_AD_REG_MON_REG_1         0x112
+#define        DA9063_AD_REG_MON_REG_2         0x113
+#define        DA9063_AD_REG_MON_REG_3         0x114
+#define        DA9063_AD_REG_MON_REG_4         0x115
+#define        DA9063_AD_REG_MON_REG_5         0x116
+#define        DA9063_AD_REG_MON_REG_6         0x117
+#define        DA9063_AD_REG_TRIM_CLDR         0x118
+
+#define        DA9063_AD_REG_GP_ID_0           0x119
+#define        DA9063_AD_REG_GP_ID_1           0x11A
+#define        DA9063_AD_REG_GP_ID_2           0x11B
+#define        DA9063_AD_REG_GP_ID_3           0x11C
+#define        DA9063_AD_REG_GP_ID_4           0x11D
+#define        DA9063_AD_REG_GP_ID_5           0x11E
+#define        DA9063_AD_REG_GP_ID_6           0x11F
+#define        DA9063_AD_REG_GP_ID_7           0x120
+#define        DA9063_AD_REG_GP_ID_8           0x121
+#define        DA9063_AD_REG_GP_ID_9           0x122
+#define        DA9063_AD_REG_GP_ID_10          0x123
+#define        DA9063_AD_REG_GP_ID_11          0x124
+#define        DA9063_AD_REG_GP_ID_12          0x125
+#define        DA9063_AD_REG_GP_ID_13          0x126
+#define        DA9063_AD_REG_GP_ID_14          0x127
+#define        DA9063_AD_REG_GP_ID_15          0x128
+#define        DA9063_AD_REG_GP_ID_16          0x129
+#define        DA9063_AD_REG_GP_ID_17          0x12A
+#define        DA9063_AD_REG_GP_ID_18          0x12B
+#define        DA9063_AD_REG_GP_ID_19          0x12C
+
+#define        DA9063_BB_REG_CONFIG_M          0x112
+#define        DA9063_BB_REG_CONFIG_N          0x113
+
+#define        DA9063_BB_REG_MON_REG_1         0x114
+#define        DA9063_BB_REG_MON_REG_2         0x115
+#define        DA9063_BB_REG_MON_REG_3         0x116
+#define        DA9063_BB_REG_MON_REG_4         0x117
+#define        DA9063_BB_REG_MON_REG_5         0x11E
+#define        DA9063_BB_REG_MON_REG_6         0x11F
+#define        DA9063_BB_REG_TRIM_CLDR         0x120
 /* General Purpose Registers */
-#define        DA9063_REG_GP_ID_0              0x121
-#define        DA9063_REG_GP_ID_1              0x122
-#define        DA9063_REG_GP_ID_2              0x123
-#define        DA9063_REG_GP_ID_3              0x124
-#define        DA9063_REG_GP_ID_4              0x125
-#define        DA9063_REG_GP_ID_5              0x126
-#define        DA9063_REG_GP_ID_6              0x127
-#define        DA9063_REG_GP_ID_7              0x128
-#define        DA9063_REG_GP_ID_8              0x129
-#define        DA9063_REG_GP_ID_9              0x12A
-#define        DA9063_REG_GP_ID_10             0x12B
-#define        DA9063_REG_GP_ID_11             0x12C
-#define        DA9063_REG_GP_ID_12             0x12D
-#define        DA9063_REG_GP_ID_13             0x12E
-#define        DA9063_REG_GP_ID_14             0x12F
-#define        DA9063_REG_GP_ID_15             0x130
-#define        DA9063_REG_GP_ID_16             0x131
-#define        DA9063_REG_GP_ID_17             0x132
-#define        DA9063_REG_GP_ID_18             0x133
-#define        DA9063_REG_GP_ID_19             0x134
+#define        DA9063_BB_REG_GP_ID_0           0x121
+#define        DA9063_BB_REG_GP_ID_1           0x122
+#define        DA9063_BB_REG_GP_ID_2           0x123
+#define        DA9063_BB_REG_GP_ID_3           0x124
+#define        DA9063_BB_REG_GP_ID_4           0x125
+#define        DA9063_BB_REG_GP_ID_5           0x126
+#define        DA9063_BB_REG_GP_ID_6           0x127
+#define        DA9063_BB_REG_GP_ID_7           0x128
+#define        DA9063_BB_REG_GP_ID_8           0x129
+#define        DA9063_BB_REG_GP_ID_9           0x12A
+#define        DA9063_BB_REG_GP_ID_10          0x12B
+#define        DA9063_BB_REG_GP_ID_11          0x12C
+#define        DA9063_BB_REG_GP_ID_12          0x12D
+#define        DA9063_BB_REG_GP_ID_13          0x12E
+#define        DA9063_BB_REG_GP_ID_14          0x12F
+#define        DA9063_BB_REG_GP_ID_15          0x130
+#define        DA9063_BB_REG_GP_ID_16          0x131
+#define        DA9063_BB_REG_GP_ID_17          0x132
+#define        DA9063_BB_REG_GP_ID_18          0x133
+#define        DA9063_BB_REG_GP_ID_19          0x134
 
 /* Chip ID and variant */
 #define        DA9063_REG_CHIP_ID              0x181
 /* DA9063_REG_CONTROL_B (addr=0x0F) */
 #define        DA9063_CHG_SEL                          0x01
 #define        DA9063_WATCHDOG_PD                      0x02
-#define        DA9063_RESET_BLINKING                   0x04
+#define        DA9063_BB_RESET_BLINKING                0x04
 #define        DA9063_NRES_MODE                        0x08
 #define        DA9063_NONKEY_LOCK                      0x10
-#define        DA9063_BUCK_SLOWSTART                   0x80
+#define        DA9063_BB_BUCK_SLOWSTART                0x80
 
 /* DA9063_REG_CONTROL_C (addr=0x10) */
 #define        DA9063_DEBOUNCING_MASK                  0x07
 #define        DA9063_GPADC_PAUSE                      0x02
 #define        DA9063_PMIF_DIS                         0x04
 #define        DA9063_HS2WIRE_DIS                      0x08
-#define        DA9063_CLDR_PAUSE                       0x10
+#define        DA9063_BB_CLDR_PAUSE                    0x10
 #define        DA9063_BBAT_DIS                         0x20
 #define        DA9063_OUT_32K_PAUSE                    0x40
 #define        DA9063_PMCONT_DIS                       0x80
 #define DA9063_MONITOR                         0x40
 
 /* DA9063_REG_ALARM_S (addr=0x46) */
-#define DA9063_ALARM_S_MASK                    0x3F
+#define DA9063_BB_ALARM_S_MASK                 0x3F
 #define DA9063_ALARM_STATUS_ALARM              0x80
 #define DA9063_ALARM_STATUS_TICK               0x40
 /* DA9063_REG_ALARM_MI (addr=0x47) */
diff --git a/include/linux/mfd/intel_soc_pmic.h b/include/linux/mfd/intel_soc_pmic.h
new file mode 100644 (file)
index 0000000..abcbfcf
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * intel_soc_pmic.h - Intel SoC PMIC Driver
+ *
+ * Copyright (C) 2012-2014 Intel Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version
+ * 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * Author: Yang, Bin <bin.yang@intel.com>
+ * Author: Zhu, Lejun <lejun.zhu@linux.intel.com>
+ */
+
+#ifndef __INTEL_SOC_PMIC_H__
+#define __INTEL_SOC_PMIC_H__
+
+#include <linux/regmap.h>
+
+struct intel_soc_pmic {
+       int irq;
+       struct regmap *regmap;
+       struct regmap_irq_chip_data *irq_chip_data;
+};
+
+#endif /* __INTEL_SOC_PMIC_H__ */
index 8c75a9c8dfab30085d9190c3283a6b56d7fc30b8..960b92ad450d5a642bc8ff168f165134b590566b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * max77686-private.h - Voltage regulator driver for the Maxim 77686
+ * max77686-private.h - Voltage regulator driver for the Maxim 77686/802
  *
  *  Copyright (C) 2012 Samsung Electrnoics
  *  Chiwoong Byun <woong.byun@samsung.com>
@@ -28,6 +28,7 @@
 
 #define MAX77686_REG_INVALID           (0xff)
 
+/* MAX77686 PMIC registers */
 enum max77686_pmic_reg {
        MAX77686_REG_DEVICE_ID          = 0x00,
        MAX77686_REG_INTSRC             = 0x01,
@@ -181,8 +182,209 @@ enum max77686_rtc_reg {
        MAX77686_ALARM2_DATE            = 0x1B,
 };
 
-#define MAX77686_IRQSRC_PMIC   (0)
-#define MAX77686_IRQSRC_RTC            (1 << 0)
+/* MAX77802 PMIC registers */
+enum max77802_pmic_reg {
+       MAX77802_REG_DEVICE_ID          = 0x00,
+       MAX77802_REG_INTSRC             = 0x01,
+       MAX77802_REG_INT1               = 0x02,
+       MAX77802_REG_INT2               = 0x03,
+
+       MAX77802_REG_INT1MSK            = 0x04,
+       MAX77802_REG_INT2MSK            = 0x05,
+
+       MAX77802_REG_STATUS1            = 0x06,
+       MAX77802_REG_STATUS2            = 0x07,
+
+       MAX77802_REG_PWRON              = 0x08,
+       /* Reserved: 0x09 */
+       MAX77802_REG_MRSTB              = 0x0A,
+       MAX77802_REG_EPWRHOLD           = 0x0B,
+       /* Reserved: 0x0C-0x0D */
+       MAX77802_REG_BOOSTCTRL          = 0x0E,
+       MAX77802_REG_BOOSTOUT           = 0x0F,
+
+       MAX77802_REG_BUCK1CTRL          = 0x10,
+       MAX77802_REG_BUCK1DVS1          = 0x11,
+       MAX77802_REG_BUCK1DVS2          = 0x12,
+       MAX77802_REG_BUCK1DVS3          = 0x13,
+       MAX77802_REG_BUCK1DVS4          = 0x14,
+       MAX77802_REG_BUCK1DVS5          = 0x15,
+       MAX77802_REG_BUCK1DVS6          = 0x16,
+       MAX77802_REG_BUCK1DVS7          = 0x17,
+       MAX77802_REG_BUCK1DVS8          = 0x18,
+       /* Reserved: 0x19 */
+       MAX77802_REG_BUCK2CTRL1         = 0x1A,
+       MAX77802_REG_BUCK2CTRL2         = 0x1B,
+       MAX77802_REG_BUCK2PHTRAN        = 0x1C,
+       MAX77802_REG_BUCK2DVS1          = 0x1D,
+       MAX77802_REG_BUCK2DVS2          = 0x1E,
+       MAX77802_REG_BUCK2DVS3          = 0x1F,
+       MAX77802_REG_BUCK2DVS4          = 0x20,
+       MAX77802_REG_BUCK2DVS5          = 0x21,
+       MAX77802_REG_BUCK2DVS6          = 0x22,
+       MAX77802_REG_BUCK2DVS7          = 0x23,
+       MAX77802_REG_BUCK2DVS8          = 0x24,
+       /* Reserved: 0x25-0x26 */
+       MAX77802_REG_BUCK3CTRL1         = 0x27,
+       MAX77802_REG_BUCK3DVS1          = 0x28,
+       MAX77802_REG_BUCK3DVS2          = 0x29,
+       MAX77802_REG_BUCK3DVS3          = 0x2A,
+       MAX77802_REG_BUCK3DVS4          = 0x2B,
+       MAX77802_REG_BUCK3DVS5          = 0x2C,
+       MAX77802_REG_BUCK3DVS6          = 0x2D,
+       MAX77802_REG_BUCK3DVS7          = 0x2E,
+       MAX77802_REG_BUCK3DVS8          = 0x2F,
+       /* Reserved: 0x30-0x36 */
+       MAX77802_REG_BUCK4CTRL1         = 0x37,
+       MAX77802_REG_BUCK4DVS1          = 0x38,
+       MAX77802_REG_BUCK4DVS2          = 0x39,
+       MAX77802_REG_BUCK4DVS3          = 0x3A,
+       MAX77802_REG_BUCK4DVS4          = 0x3B,
+       MAX77802_REG_BUCK4DVS5          = 0x3C,
+       MAX77802_REG_BUCK4DVS6          = 0x3D,
+       MAX77802_REG_BUCK4DVS7          = 0x3E,
+       MAX77802_REG_BUCK4DVS8          = 0x3F,
+       /* Reserved: 0x40 */
+       MAX77802_REG_BUCK5CTRL          = 0x41,
+       MAX77802_REG_BUCK5OUT           = 0x42,
+       /* Reserved: 0x43 */
+       MAX77802_REG_BUCK6CTRL          = 0x44,
+       MAX77802_REG_BUCK6DVS1          = 0x45,
+       MAX77802_REG_BUCK6DVS2          = 0x46,
+       MAX77802_REG_BUCK6DVS3          = 0x47,
+       MAX77802_REG_BUCK6DVS4          = 0x48,
+       MAX77802_REG_BUCK6DVS5          = 0x49,
+       MAX77802_REG_BUCK6DVS6          = 0x4A,
+       MAX77802_REG_BUCK6DVS7          = 0x4B,
+       MAX77802_REG_BUCK6DVS8          = 0x4C,
+       /* Reserved: 0x4D */
+       MAX77802_REG_BUCK7CTRL          = 0x4E,
+       MAX77802_REG_BUCK7OUT           = 0x4F,
+       /* Reserved: 0x50 */
+       MAX77802_REG_BUCK8CTRL          = 0x51,
+       MAX77802_REG_BUCK8OUT           = 0x52,
+       /* Reserved: 0x53 */
+       MAX77802_REG_BUCK9CTRL          = 0x54,
+       MAX77802_REG_BUCK9OUT           = 0x55,
+       /* Reserved: 0x56 */
+       MAX77802_REG_BUCK10CTRL         = 0x57,
+       MAX77802_REG_BUCK10OUT          = 0x58,
+
+       /* Reserved: 0x59-0x5F */
+
+       MAX77802_REG_LDO1CTRL1          = 0x60,
+       MAX77802_REG_LDO2CTRL1          = 0x61,
+       MAX77802_REG_LDO3CTRL1          = 0x62,
+       MAX77802_REG_LDO4CTRL1          = 0x63,
+       MAX77802_REG_LDO5CTRL1          = 0x64,
+       MAX77802_REG_LDO6CTRL1          = 0x65,
+       MAX77802_REG_LDO7CTRL1          = 0x66,
+       MAX77802_REG_LDO8CTRL1          = 0x67,
+       MAX77802_REG_LDO9CTRL1          = 0x68,
+       MAX77802_REG_LDO10CTRL1         = 0x69,
+       MAX77802_REG_LDO11CTRL1         = 0x6A,
+       MAX77802_REG_LDO12CTRL1         = 0x6B,
+       MAX77802_REG_LDO13CTRL1         = 0x6C,
+       MAX77802_REG_LDO14CTRL1         = 0x6D,
+       MAX77802_REG_LDO15CTRL1         = 0x6E,
+       /* Reserved: 0x6F */
+       MAX77802_REG_LDO17CTRL1         = 0x70,
+       MAX77802_REG_LDO18CTRL1         = 0x71,
+       MAX77802_REG_LDO19CTRL1         = 0x72,
+       MAX77802_REG_LDO20CTRL1         = 0x73,
+       MAX77802_REG_LDO21CTRL1         = 0x74,
+       MAX77802_REG_LDO22CTRL1         = 0x75,
+       MAX77802_REG_LDO23CTRL1         = 0x76,
+       MAX77802_REG_LDO24CTRL1         = 0x77,
+       MAX77802_REG_LDO25CTRL1         = 0x78,
+       MAX77802_REG_LDO26CTRL1         = 0x79,
+       MAX77802_REG_LDO27CTRL1         = 0x7A,
+       MAX77802_REG_LDO28CTRL1         = 0x7B,
+       MAX77802_REG_LDO29CTRL1         = 0x7C,
+       MAX77802_REG_LDO30CTRL1         = 0x7D,
+       /* Reserved: 0x7E */
+       MAX77802_REG_LDO32CTRL1         = 0x7F,
+       MAX77802_REG_LDO33CTRL1         = 0x80,
+       MAX77802_REG_LDO34CTRL1         = 0x81,
+       MAX77802_REG_LDO35CTRL1         = 0x82,
+       /* Reserved: 0x83-0x8F */
+       MAX77802_REG_LDO1CTRL2          = 0x90,
+       MAX77802_REG_LDO2CTRL2          = 0x91,
+       MAX77802_REG_LDO3CTRL2          = 0x92,
+       MAX77802_REG_LDO4CTRL2          = 0x93,
+       MAX77802_REG_LDO5CTRL2          = 0x94,
+       MAX77802_REG_LDO6CTRL2          = 0x95,
+       MAX77802_REG_LDO7CTRL2          = 0x96,
+       MAX77802_REG_LDO8CTRL2          = 0x97,
+       MAX77802_REG_LDO9CTRL2          = 0x98,
+       MAX77802_REG_LDO10CTRL2         = 0x99,
+       MAX77802_REG_LDO11CTRL2         = 0x9A,
+       MAX77802_REG_LDO12CTRL2         = 0x9B,
+       MAX77802_REG_LDO13CTRL2         = 0x9C,
+       MAX77802_REG_LDO14CTRL2         = 0x9D,
+       MAX77802_REG_LDO15CTRL2         = 0x9E,
+       /* Reserved: 0x9F */
+       MAX77802_REG_LDO17CTRL2         = 0xA0,
+       MAX77802_REG_LDO18CTRL2         = 0xA1,
+       MAX77802_REG_LDO19CTRL2         = 0xA2,
+       MAX77802_REG_LDO20CTRL2         = 0xA3,
+       MAX77802_REG_LDO21CTRL2         = 0xA4,
+       MAX77802_REG_LDO22CTRL2         = 0xA5,
+       MAX77802_REG_LDO23CTRL2         = 0xA6,
+       MAX77802_REG_LDO24CTRL2         = 0xA7,
+       MAX77802_REG_LDO25CTRL2         = 0xA8,
+       MAX77802_REG_LDO26CTRL2         = 0xA9,
+       MAX77802_REG_LDO27CTRL2         = 0xAA,
+       MAX77802_REG_LDO28CTRL2         = 0xAB,
+       MAX77802_REG_LDO29CTRL2         = 0xAC,
+       MAX77802_REG_LDO30CTRL2         = 0xAD,
+       /* Reserved: 0xAE */
+       MAX77802_REG_LDO32CTRL2         = 0xAF,
+       MAX77802_REG_LDO33CTRL2         = 0xB0,
+       MAX77802_REG_LDO34CTRL2         = 0xB1,
+       MAX77802_REG_LDO35CTRL2         = 0xB2,
+       /* Reserved: 0xB3 */
+
+       MAX77802_REG_BBAT_CHG           = 0xB4,
+       MAX77802_REG_32KHZ              = 0xB5,
+
+       MAX77802_REG_PMIC_END           = 0xB6,
+};
+
+enum max77802_rtc_reg {
+       MAX77802_RTC_INT                = 0xC0,
+       MAX77802_RTC_INTM               = 0xC1,
+       MAX77802_RTC_CONTROLM           = 0xC2,
+       MAX77802_RTC_CONTROL            = 0xC3,
+       MAX77802_RTC_UPDATE0            = 0xC4,
+       MAX77802_RTC_UPDATE1            = 0xC5,
+       MAX77802_WTSR_SMPL_CNTL         = 0xC6,
+       MAX77802_RTC_SEC                = 0xC7,
+       MAX77802_RTC_MIN                = 0xC8,
+       MAX77802_RTC_HOUR               = 0xC9,
+       MAX77802_RTC_WEEKDAY            = 0xCA,
+       MAX77802_RTC_MONTH              = 0xCB,
+       MAX77802_RTC_YEAR               = 0xCC,
+       MAX77802_RTC_DATE               = 0xCD,
+       MAX77802_RTC_AE1                = 0xCE,
+       MAX77802_ALARM1_SEC             = 0xCF,
+       MAX77802_ALARM1_MIN             = 0xD0,
+       MAX77802_ALARM1_HOUR            = 0xD1,
+       MAX77802_ALARM1_WEEKDAY         = 0xD2,
+       MAX77802_ALARM1_MONTH           = 0xD3,
+       MAX77802_ALARM1_YEAR            = 0xD4,
+       MAX77802_ALARM1_DATE            = 0xD5,
+       MAX77802_RTC_AE2                = 0xD6,
+       MAX77802_ALARM2_SEC             = 0xD7,
+       MAX77802_ALARM2_MIN             = 0xD8,
+       MAX77802_ALARM2_HOUR            = 0xD9,
+       MAX77802_ALARM2_WEEKDAY         = 0xDA,
+       MAX77802_ALARM2_MONTH           = 0xDB,
+       MAX77802_ALARM2_YEAR            = 0xDC,
+       MAX77802_ALARM2_DATE            = 0xDD,
+
+       MAX77802_RTC_END                = 0xDF,
+};
 
 enum max77686_irq_source {
        PMIC_INT1 = 0,
@@ -205,30 +407,46 @@ enum max77686_irq {
        MAX77686_PMICIRQ_140C,
        MAX77686_PMICIRQ_120C,
 
-       MAX77686_RTCIRQ_RTC60S,
+       MAX77686_RTCIRQ_RTC60S = 0,
        MAX77686_RTCIRQ_RTCA1,
        MAX77686_RTCIRQ_RTCA2,
        MAX77686_RTCIRQ_SMPL,
        MAX77686_RTCIRQ_RTC1S,
        MAX77686_RTCIRQ_WTSR,
-
-       MAX77686_IRQ_NR,
 };
 
+#define MAX77686_INT1_PWRONF_MSK       BIT(0)
+#define MAX77686_INT1_PWRONR_MSK       BIT(1)
+#define MAX77686_INT1_JIGONBF_MSK      BIT(2)
+#define MAX77686_INT1_JIGONBR_MSK      BIT(3)
+#define MAX77686_INT1_ACOKBF_MSK       BIT(4)
+#define MAX77686_INT1_ACOKBR_MSK       BIT(5)
+#define MAX77686_INT1_ONKEY1S_MSK      BIT(6)
+#define MAX77686_INT1_MRSTB_MSK                BIT(7)
+
+#define MAX77686_INT2_140C_MSK         BIT(0)
+#define MAX77686_INT2_120C_MSK         BIT(1)
+
+#define MAX77686_RTCINT_RTC60S_MSK     BIT(0)
+#define MAX77686_RTCINT_RTCA1_MSK      BIT(1)
+#define MAX77686_RTCINT_RTCA2_MSK      BIT(2)
+#define MAX77686_RTCINT_SMPL_MSK       BIT(3)
+#define MAX77686_RTCINT_RTC1S_MSK      BIT(4)
+#define MAX77686_RTCINT_WTSR_MSK       BIT(5)
+
 struct max77686_dev {
        struct device *dev;
        struct i2c_client *i2c; /* 0xcc / PMIC, Battery Control, and FLASH */
        struct i2c_client *rtc; /* slave addr 0x0c */
 
-       int type;
+       unsigned long type;
 
        struct regmap *regmap;          /* regmap for mfd */
        struct regmap *rtc_regmap;      /* regmap for rtc */
-
-       struct irq_domain *irq_domain;
+       struct regmap_irq_chip_data *irq_data;
+       struct regmap_irq_chip_data *rtc_irq_data;
 
        int irq;
-       int irq_gpio;
        bool wakeup;
        struct mutex irqlock;
        int irq_masks_cur[MAX77686_IRQ_GROUP_NR];
@@ -237,6 +455,7 @@ struct max77686_dev {
 
 enum max77686_types {
        TYPE_MAX77686,
+       TYPE_MAX77802,
 };
 
 extern int max77686_irq_init(struct max77686_dev *max77686);
index 46c0f320ed764ab33b4dfe9d18ad796c1bfa722f..7e6dc4b2b795b99b37865aba5e07eacb93ebe3df 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * max77686.h - Driver for the Maxim 77686
+ * max77686.h - Driver for the Maxim 77686/802
  *
  *  Copyright (C) 2012 Samsung Electrnoics
  *  Chiwoong Byun <woong.byun@samsung.com>
@@ -71,6 +71,54 @@ enum max77686_regulators {
        MAX77686_REG_MAX,
 };
 
+/* MAX77802 regulator IDs */
+enum max77802_regulators {
+       MAX77802_BUCK1 = 0,
+       MAX77802_BUCK2,
+       MAX77802_BUCK3,
+       MAX77802_BUCK4,
+       MAX77802_BUCK5,
+       MAX77802_BUCK6,
+       MAX77802_BUCK7,
+       MAX77802_BUCK8,
+       MAX77802_BUCK9,
+       MAX77802_BUCK10,
+       MAX77802_LDO1,
+       MAX77802_LDO2,
+       MAX77802_LDO3,
+       MAX77802_LDO4,
+       MAX77802_LDO5,
+       MAX77802_LDO6,
+       MAX77802_LDO7,
+       MAX77802_LDO8,
+       MAX77802_LDO9,
+       MAX77802_LDO10,
+       MAX77802_LDO11,
+       MAX77802_LDO12,
+       MAX77802_LDO13,
+       MAX77802_LDO14,
+       MAX77802_LDO15,
+       MAX77802_LDO17,
+       MAX77802_LDO18,
+       MAX77802_LDO19,
+       MAX77802_LDO20,
+       MAX77802_LDO21,
+       MAX77802_LDO23,
+       MAX77802_LDO24,
+       MAX77802_LDO25,
+       MAX77802_LDO26,
+       MAX77802_LDO27,
+       MAX77802_LDO28,
+       MAX77802_LDO29,
+       MAX77802_LDO30,
+       MAX77802_LDO32,
+       MAX77802_LDO33,
+       MAX77802_LDO34,
+       MAX77802_LDO35,
+
+       MAX77802_REG_MAX,
+};
+
 struct max77686_regulator_data {
        int id;
        struct regulator_init_data *initdata;
@@ -83,14 +131,19 @@ enum max77686_opmode {
        MAX77686_OPMODE_STANDBY,
 };
 
+enum max77802_opmode {
+       MAX77802_OPMODE_OFF,
+       MAX77802_OPMODE_STANDBY,
+       MAX77802_OPMODE_LP,
+       MAX77802_OPMODE_NORMAL,
+};
+
 struct max77686_opmode_data {
        int id;
        int mode;
 };
 
 struct max77686_platform_data {
-       /* IRQ */
-       int irq_gpio;
        int ono;
        int wakeup;
 
index a8eeda773a7b1349d4f506b151d8a7d735b795bd..4ff6137d8d67e193c2c67498bad3182abf5b26bd 100644 (file)
@@ -86,6 +86,5 @@
 #define MC13783_IRQ_HSL                43
 #define MC13783_IRQ_ALSPTH     44
 #define MC13783_IRQ_AHSSHORT   45
-#define MC13783_NUM_IRQ                MC13XXX_NUM_IRQ
 
 #endif /* ifndef __LINUX_MFD_MC13783_H */
index d63b1d3091061a6c8f48e8ae9eca76eedc21175a..638222e43e489082dc83e167e1c976ed135fc5db 100644 (file)
@@ -23,15 +23,10 @@ int mc13xxx_reg_rmw(struct mc13xxx *mc13xxx, unsigned int offset,
 
 int mc13xxx_irq_request(struct mc13xxx *mc13xxx, int irq,
                irq_handler_t handler, const char *name, void *dev);
-int mc13xxx_irq_request_nounmask(struct mc13xxx *mc13xxx, int irq,
-               irq_handler_t handler, const char *name, void *dev);
 int mc13xxx_irq_free(struct mc13xxx *mc13xxx, int irq, void *dev);
 
-int mc13xxx_irq_mask(struct mc13xxx *mc13xxx, int irq);
-int mc13xxx_irq_unmask(struct mc13xxx *mc13xxx, int irq);
 int mc13xxx_irq_status(struct mc13xxx *mc13xxx, int irq,
                int *enabled, int *pending);
-int mc13xxx_irq_ack(struct mc13xxx *mc13xxx, int irq);
 
 int mc13xxx_get_flags(struct mc13xxx *mc13xxx);
 
@@ -39,6 +34,22 @@ int mc13xxx_adc_do_conversion(struct mc13xxx *mc13xxx,
                unsigned int mode, unsigned int channel,
                u8 ato, bool atox, unsigned int *sample);
 
+/* Deprecated calls */
+static inline int mc13xxx_irq_ack(struct mc13xxx *mc13xxx, int irq)
+{
+       return 0;
+}
+
+static inline int mc13xxx_irq_request_nounmask(struct mc13xxx *mc13xxx, int irq,
+                                              irq_handler_t handler,
+                                              const char *name, void *dev)
+{
+       return mc13xxx_irq_request(mc13xxx, irq, handler, name, dev);
+}
+
+int mc13xxx_irq_mask(struct mc13xxx *mc13xxx, int irq);
+int mc13xxx_irq_unmask(struct mc13xxx *mc13xxx, int irq);
+
 #define MC13783_AUDIO_RX0      36
 #define MC13783_AUDIO_RX1      37
 #define MC13783_AUDIO_TX       38
@@ -68,8 +79,6 @@ int mc13xxx_adc_do_conversion(struct mc13xxx *mc13xxx,
 #define MC13XXX_IRQ_THWARNH    37
 #define MC13XXX_IRQ_CLK                38
 
-#define MC13XXX_NUM_IRQ                46
-
 struct regulator_init_data;
 
 struct mc13xxx_regulator_init_data {
index a3835976f7c639e8f24e17cf2df6dc495f07fae4..74346d5e789900b360b262f2bc92757996d87825 100644 (file)
@@ -943,6 +943,12 @@ void rtsx_pci_send_cmd_no_wait(struct rtsx_pcr *pcr);
 int rtsx_pci_send_cmd(struct rtsx_pcr *pcr, int timeout);
 int rtsx_pci_transfer_data(struct rtsx_pcr *pcr, struct scatterlist *sglist,
                int num_sg, bool read, int timeout);
+int rtsx_pci_dma_map_sg(struct rtsx_pcr *pcr, struct scatterlist *sglist,
+               int num_sg, bool read);
+void rtsx_pci_dma_unmap_sg(struct rtsx_pcr *pcr, struct scatterlist *sglist,
+               int num_sg, bool read);
+int rtsx_pci_dma_transfer(struct rtsx_pcr *pcr, struct scatterlist *sglist,
+               int count, bool read, int timeout);
 int rtsx_pci_read_ppbuf(struct rtsx_pcr *pcr, u8 *buf, int buf_len);
 int rtsx_pci_write_ppbuf(struct rtsx_pcr *pcr, u8 *buf, int buf_len);
 int rtsx_pci_card_pull_ctl_enable(struct rtsx_pcr *pcr, int card);
index 47d84242940bb7057e15f23ac27666aea41aec71..b5f73de81aad92ce2e3d7470e87f13925de68bd7 100644 (file)
@@ -21,6 +21,7 @@ enum sec_device_type {
        S2MPA01,
        S2MPS11X,
        S2MPS14X,
+       S2MPU02,
 };
 
 /**
index 1224f447356b90a5601fbc1826eb0a67606aeefe..f35af7361b606f630dee92dc7c28e96df7c71c46 100644 (file)
@@ -129,6 +129,30 @@ enum s2mps14_irq {
        S2MPS14_IRQ_NR,
 };
 
+enum s2mpu02_irq {
+       S2MPU02_IRQ_PWRONF,
+       S2MPU02_IRQ_PWRONR,
+       S2MPU02_IRQ_JIGONBF,
+       S2MPU02_IRQ_JIGONBR,
+       S2MPU02_IRQ_ACOKBF,
+       S2MPU02_IRQ_ACOKBR,
+       S2MPU02_IRQ_PWRON1S,
+       S2MPU02_IRQ_MRB,
+
+       S2MPU02_IRQ_RTC60S,
+       S2MPU02_IRQ_RTCA1,
+       S2MPU02_IRQ_RTCA0,
+       S2MPU02_IRQ_SMPL,
+       S2MPU02_IRQ_RTC1S,
+       S2MPU02_IRQ_WTSR,
+
+       S2MPU02_IRQ_INT120C,
+       S2MPU02_IRQ_INT140C,
+       S2MPU02_IRQ_TSD,
+
+       S2MPU02_IRQ_NR,
+};
+
 /* Masks for interrupts are the same as in s2mps11 */
 #define S2MPS14_IRQ_TSD_MASK           (1 << 2)
 
diff --git a/include/linux/mfd/samsung/s2mpu02.h b/include/linux/mfd/samsung/s2mpu02.h
new file mode 100644 (file)
index 0000000..47ae9bc
--- /dev/null
@@ -0,0 +1,201 @@
+/*
+ * s2mpu02.h
+ *
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd
+ *              http://www.samsung.com
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#ifndef __LINUX_MFD_S2MPU02_H
+#define __LINUX_MFD_S2MPU02_H
+
+/* S2MPU02 registers */
+enum S2MPU02_reg {
+       S2MPU02_REG_ID,
+       S2MPU02_REG_INT1,
+       S2MPU02_REG_INT2,
+       S2MPU02_REG_INT3,
+       S2MPU02_REG_INT1M,
+       S2MPU02_REG_INT2M,
+       S2MPU02_REG_INT3M,
+       S2MPU02_REG_ST1,
+       S2MPU02_REG_ST2,
+       S2MPU02_REG_PWRONSRC,
+       S2MPU02_REG_OFFSRC,
+       S2MPU02_REG_BU_CHG,
+       S2MPU02_REG_RTCCTRL,
+       S2MPU02_REG_PMCTRL1,
+       S2MPU02_REG_RSVD1,
+       S2MPU02_REG_RSVD2,
+       S2MPU02_REG_RSVD3,
+       S2MPU02_REG_RSVD4,
+       S2MPU02_REG_RSVD5,
+       S2MPU02_REG_RSVD6,
+       S2MPU02_REG_RSVD7,
+       S2MPU02_REG_WRSTEN,
+       S2MPU02_REG_RSVD8,
+       S2MPU02_REG_RSVD9,
+       S2MPU02_REG_RSVD10,
+       S2MPU02_REG_B1CTRL1,
+       S2MPU02_REG_B1CTRL2,
+       S2MPU02_REG_B2CTRL1,
+       S2MPU02_REG_B2CTRL2,
+       S2MPU02_REG_B3CTRL1,
+       S2MPU02_REG_B3CTRL2,
+       S2MPU02_REG_B4CTRL1,
+       S2MPU02_REG_B4CTRL2,
+       S2MPU02_REG_B5CTRL1,
+       S2MPU02_REG_B5CTRL2,
+       S2MPU02_REG_B5CTRL3,
+       S2MPU02_REG_B5CTRL4,
+       S2MPU02_REG_B5CTRL5,
+       S2MPU02_REG_B6CTRL1,
+       S2MPU02_REG_B6CTRL2,
+       S2MPU02_REG_B7CTRL1,
+       S2MPU02_REG_B7CTRL2,
+       S2MPU02_REG_RAMP1,
+       S2MPU02_REG_RAMP2,
+       S2MPU02_REG_L1CTRL,
+       S2MPU02_REG_L2CTRL1,
+       S2MPU02_REG_L2CTRL2,
+       S2MPU02_REG_L2CTRL3,
+       S2MPU02_REG_L2CTRL4,
+       S2MPU02_REG_L3CTRL,
+       S2MPU02_REG_L4CTRL,
+       S2MPU02_REG_L5CTRL,
+       S2MPU02_REG_L6CTRL,
+       S2MPU02_REG_L7CTRL,
+       S2MPU02_REG_L8CTRL,
+       S2MPU02_REG_L9CTRL,
+       S2MPU02_REG_L10CTRL,
+       S2MPU02_REG_L11CTRL,
+       S2MPU02_REG_L12CTRL,
+       S2MPU02_REG_L13CTRL,
+       S2MPU02_REG_L14CTRL,
+       S2MPU02_REG_L15CTRL,
+       S2MPU02_REG_L16CTRL,
+       S2MPU02_REG_L17CTRL,
+       S2MPU02_REG_L18CTRL,
+       S2MPU02_REG_L19CTRL,
+       S2MPU02_REG_L20CTRL,
+       S2MPU02_REG_L21CTRL,
+       S2MPU02_REG_L22CTRL,
+       S2MPU02_REG_L23CTRL,
+       S2MPU02_REG_L24CTRL,
+       S2MPU02_REG_L25CTRL,
+       S2MPU02_REG_L26CTRL,
+       S2MPU02_REG_L27CTRL,
+       S2MPU02_REG_L28CTRL,
+       S2MPU02_REG_LDODSCH1,
+       S2MPU02_REG_LDODSCH2,
+       S2MPU02_REG_LDODSCH3,
+       S2MPU02_REG_LDODSCH4,
+       S2MPU02_REG_SELMIF,
+       S2MPU02_REG_RSVD11,
+       S2MPU02_REG_RSVD12,
+       S2MPU02_REG_RSVD13,
+       S2MPU02_REG_DVSSEL,
+       S2MPU02_REG_DVSPTR,
+       S2MPU02_REG_DVSDATA,
+};
+
+/* S2MPU02 regulator ids */
+enum S2MPU02_regulators {
+       S2MPU02_LDO1,
+       S2MPU02_LDO2,
+       S2MPU02_LDO3,
+       S2MPU02_LDO4,
+       S2MPU02_LDO5,
+       S2MPU02_LDO6,
+       S2MPU02_LDO7,
+       S2MPU02_LDO8,
+       S2MPU02_LDO9,
+       S2MPU02_LDO10,
+       S2MPU02_LDO11,
+       S2MPU02_LDO12,
+       S2MPU02_LDO13,
+       S2MPU02_LDO14,
+       S2MPU02_LDO15,
+       S2MPU02_LDO16,
+       S2MPU02_LDO17,
+       S2MPU02_LDO18,
+       S2MPU02_LDO19,
+       S2MPU02_LDO20,
+       S2MPU02_LDO21,
+       S2MPU02_LDO22,
+       S2MPU02_LDO23,
+       S2MPU02_LDO24,
+       S2MPU02_LDO25,
+       S2MPU02_LDO26,
+       S2MPU02_LDO27,
+       S2MPU02_LDO28,
+       S2MPU02_BUCK1,
+       S2MPU02_BUCK2,
+       S2MPU02_BUCK3,
+       S2MPU02_BUCK4,
+       S2MPU02_BUCK5,
+       S2MPU02_BUCK6,
+       S2MPU02_BUCK7,
+
+       S2MPU02_REGULATOR_MAX,
+};
+
+/* Regulator constraints for BUCKx */
+#define S2MPU02_BUCK1234_MIN_600MV     600000
+#define S2MPU02_BUCK5_MIN_1081_25MV    1081250
+#define S2MPU02_BUCK6_MIN_1700MV       1700000
+#define S2MPU02_BUCK7_MIN_900MV                900000
+
+#define S2MPU02_BUCK1234_STEP_6_25MV   6250
+#define S2MPU02_BUCK5_STEP_6_25MV      6250
+#define S2MPU02_BUCK6_STEP_2_50MV      2500
+#define S2MPU02_BUCK7_STEP_6_25MV      6250
+
+#define S2MPU02_BUCK1234_START_SEL     0x00
+#define S2MPU02_BUCK5_START_SEL                0x4D
+#define S2MPU02_BUCK6_START_SEL                0x28
+#define S2MPU02_BUCK7_START_SEL                0x30
+
+#define S2MPU02_BUCK_RAMP_DELAY                12500
+
+/* Regulator constraints for different types of LDOx */
+#define S2MPU02_LDO_MIN_900MV          900000
+#define S2MPU02_LDO_MIN_1050MV         1050000
+#define S2MPU02_LDO_MIN_1600MV         1600000
+#define S2MPU02_LDO_STEP_12_5MV                12500
+#define S2MPU02_LDO_STEP_25MV          25000
+#define S2MPU02_LDO_STEP_50MV          50000
+
+#define S2MPU02_LDO_GROUP1_START_SEL   0x8
+#define S2MPU02_LDO_GROUP2_START_SEL   0xA
+#define S2MPU02_LDO_GROUP3_START_SEL   0x10
+
+#define S2MPU02_LDO_VSEL_MASK          0x3F
+#define S2MPU02_BUCK_VSEL_MASK         0xFF
+#define S2MPU02_ENABLE_MASK            (0x03 << S2MPU02_ENABLE_SHIFT)
+#define S2MPU02_ENABLE_SHIFT           6
+
+/* On/Off controlled by PWREN */
+#define S2MPU02_ENABLE_SUSPEND         (0x01 << S2MPU02_ENABLE_SHIFT)
+#define S2MPU02_DISABLE_SUSPEND                (0x11 << S2MPU02_ENABLE_SHIFT)
+#define S2MPU02_LDO_N_VOLTAGES         (S2MPU02_LDO_VSEL_MASK + 1)
+#define S2MPU02_BUCK_N_VOLTAGES                (S2MPU02_BUCK_VSEL_MASK + 1)
+
+/* RAMP delay for BUCK1234*/
+#define S2MPU02_BUCK1_RAMP_SHIFT       6
+#define S2MPU02_BUCK2_RAMP_SHIFT       4
+#define S2MPU02_BUCK3_RAMP_SHIFT       2
+#define S2MPU02_BUCK4_RAMP_SHIFT       0
+#define S2MPU02_BUCK1234_RAMP_MASK     0x3
+
+#endif /*  __LINUX_MFD_S2MPU02_H */
index 16c2335c28564af0ea0f549cc932df0e47f79329..6483a6fdce594a9036cad2cd859dff64c81e87cf 100644 (file)
@@ -892,7 +892,7 @@ struct tps65910 {
        struct device *dev;
        struct i2c_client *i2c_client;
        struct regmap *regmap;
-       unsigned int id;
+       unsigned long id;
 
        /* Client devices */
        struct tps65910_pmic *pmic;
diff --git a/include/linux/mvebu-pmsu.h b/include/linux/mvebu-pmsu.h
new file mode 100644 (file)
index 0000000..b918d07
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+ * Copyright (C) 2012 Marvell
+ *
+ * Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2.  This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __MVEBU_PMSU_H__
+#define __MVEBU_PMSU_H__
+
+#ifdef CONFIG_MACH_MVEBU_V7
+int mvebu_pmsu_dfs_request(int cpu);
+#else
+static inline int mvebu_pmsu_dfs_request(int cpu) { return -ENODEV; }
+#endif
+
+#endif /* __MVEBU_PMSU_H__ */
index 88e6ea4a5d3683543cf6c4cc57be13483ef36476..6f06f8bc612c6628bfc4f12aebfde9f1e552b280 100644 (file)
 #define IS_WORD_16                     BIT(0xd)
 #define ENABLE_16XX_MODE               BIT(0xe)
 #define HS_CHANNELS_RESERVED           BIT(0xf)
+#define DMA_ENGINE_HANDLE_IRQ          BIT(0x10)
 
 /* Defines for DMA Capabilities */
 #define DMA_HAS_TRANSPARENT_CAPS       (0x1 << 18)
index c15395031cb30008d03f514ae5128ff550ce09fa..3097aafbeb24599ba3d9ee64946e60601b23ef13 100644 (file)
@@ -70,8 +70,6 @@ struct pinmux_ops {
                                  unsigned * const num_groups);
        int (*enable) (struct pinctrl_dev *pctldev, unsigned func_selector,
                       unsigned group_selector);
-       void (*disable) (struct pinctrl_dev *pctldev, unsigned func_selector,
-                        unsigned group_selector);
        int (*gpio_request_enable) (struct pinctrl_dev *pctldev,
                                    struct pinctrl_gpio_range *range,
                                    unsigned offset);
diff --git a/include/linux/platform_data/camera-mx1.h b/include/linux/platform_data/camera-mx1.h
deleted file mode 100644 (file)
index 4fd6c70..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * mx1_camera.h - i.MX1/i.MXL camera driver header file
- *
- * Copyright (c) 2008, Paulius Zaleckas <paulius.zaleckas@teltonika.lt>
- * Copyright (C) 2009, Darius Augulis <augulis.darius@gmail.com>
- *
- * Based on PXA camera.h file:
- * Copyright (C) 2003, Intel Corporation
- * Copyright (C) 2008, Guennadi Liakhovetski <kernel@pengutronix.de>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#ifndef __ASM_ARCH_CAMERA_H_
-#define __ASM_ARCH_CAMERA_H_
-
-#define MX1_CAMERA_DATA_HIGH   1
-#define MX1_CAMERA_PCLK_RISING 2
-#define MX1_CAMERA_VSYNC_HIGH  4
-
-extern unsigned char mx1_camera_sof_fiq_start, mx1_camera_sof_fiq_end;
-
-/**
- * struct mx1_camera_pdata - i.MX1/i.MXL camera platform data
- * @mclk_10khz:        master clock frequency in 10kHz units
- * @flags:     MX1 camera platform flags
- */
-struct mx1_camera_pdata {
-       unsigned long mclk_10khz;
-       unsigned long flags;
-};
-
-#endif /* __ASM_ARCH_CAMERA_H_ */
index 7eb9d13296719a81f9d2bf03622acf1a83add3a1..157e71f79f9901bade8330338e3dee408de862fc 100644 (file)
@@ -1,46 +1,6 @@
 #ifndef __INCLUDE_ASM_ARCH_MXC_EHCI_H
 #define __INCLUDE_ASM_ARCH_MXC_EHCI_H
 
-/* values for portsc field */
-#define MXC_EHCI_PHY_LOW_POWER_SUSPEND (1 << 23)
-#define MXC_EHCI_FORCE_FS              (1 << 24)
-#define MXC_EHCI_UTMI_8BIT             (0 << 28)
-#define MXC_EHCI_UTMI_16BIT            (1 << 28)
-#define MXC_EHCI_SERIAL                        (1 << 29)
-#define MXC_EHCI_MODE_UTMI             (0 << 30)
-#define MXC_EHCI_MODE_PHILIPS          (1 << 30)
-#define MXC_EHCI_MODE_ULPI             (2 << 30)
-#define MXC_EHCI_MODE_SERIAL           (3 << 30)
-
-/* values for flags field */
-#define MXC_EHCI_INTERFACE_DIFF_UNI    (0 << 0)
-#define MXC_EHCI_INTERFACE_DIFF_BI     (1 << 0)
-#define MXC_EHCI_INTERFACE_SINGLE_UNI  (2 << 0)
-#define MXC_EHCI_INTERFACE_SINGLE_BI   (3 << 0)
-#define MXC_EHCI_INTERFACE_MASK                (0xf)
-
-#define MXC_EHCI_POWER_PINS_ENABLED    (1 << 5)
-#define MXC_EHCI_PWR_PIN_ACTIVE_HIGH   (1 << 6)
-#define MXC_EHCI_OC_PIN_ACTIVE_LOW     (1 << 7)
-#define MXC_EHCI_TTL_ENABLED           (1 << 8)
-
-#define MXC_EHCI_INTERNAL_PHY          (1 << 9)
-#define MXC_EHCI_IPPUE_DOWN            (1 << 10)
-#define MXC_EHCI_IPPUE_UP              (1 << 11)
-#define MXC_EHCI_WAKEUP_ENABLED                (1 << 12)
-#define MXC_EHCI_ITC_NO_THRESHOLD      (1 << 13)
-
-#define MXC_USBCTRL_OFFSET             0
-#define MXC_USB_PHY_CTR_FUNC_OFFSET    0x8
-#define MXC_USB_PHY_CTR_FUNC2_OFFSET   0xc
-#define MXC_USBH2CTRL_OFFSET           0x14
-
-#define MX5_USBOTHER_REGS_OFFSET       0x800
-
-/* USB_PHY_CTRL_FUNC2*/
-#define MX5_USB_UTMI_PHYCTRL1_PLLDIV_MASK              0x3
-#define MX5_USB_UTMI_PHYCTRL1_PLLDIV_SHIFT             0
-
 struct mxc_usbh_platform_data {
        int (*init)(struct platform_device *pdev);
        int (*exit)(struct platform_device *pdev);
@@ -49,11 +9,5 @@ struct mxc_usbh_platform_data {
        struct usb_phy          *otg;
 };
 
-int mx51_initialize_usb_hw(int port, unsigned int flags);
-int mx25_initialize_usb_hw(int port, unsigned int flags);
-int mx31_initialize_usb_hw(int port, unsigned int flags);
-int mx35_initialize_usb_hw(int port, unsigned int flags);
-int mx27_initialize_usb_hw(int port, unsigned int flags);
-
 #endif /* __INCLUDE_ASM_ARCH_MXC_EHCI_H */
 
diff --git a/include/linux/platform_data/usb-imx_udc.h b/include/linux/platform_data/usb-imx_udc.h
deleted file mode 100644 (file)
index be27337..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- *     Copyright (C) 2008 Darius Augulis <augulis.darius@gmail.com>
- *
- *     This program is free software; you can redistribute it and/or modify
- *     it under the terms of the GNU General Public License as published by
- *     the Free Software Foundation; either version 2 of the License, or
- *     (at your option) any later version.
- *
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- */
-
-#ifndef __ASM_ARCH_MXC_USB
-#define __ASM_ARCH_MXC_USB
-
-struct imxusb_platform_data {
-       int (*init)(struct device *);
-       void (*exit)(struct device *);
-};
-
-#endif /* __ASM_ARCH_MXC_USB */
diff --git a/include/linux/platform_data/video-clcd-versatile.h b/include/linux/platform_data/video-clcd-versatile.h
new file mode 100644 (file)
index 0000000..09ccf18
--- /dev/null
@@ -0,0 +1,27 @@
+#ifndef PLAT_CLCD_H
+#define PLAT_CLCD_H
+
+#ifdef CONFIG_PLAT_VERSATILE_CLCD
+struct clcd_panel *versatile_clcd_get_panel(const char *);
+int versatile_clcd_setup_dma(struct clcd_fb *, unsigned long);
+int versatile_clcd_mmap_dma(struct clcd_fb *, struct vm_area_struct *);
+void versatile_clcd_remove_dma(struct clcd_fb *);
+#else
+static inline struct clcd_panel *versatile_clcd_get_panel(const char *s)
+{
+       return NULL;
+}
+static inline int versatile_clcd_setup_dma(struct clcd_fb *fb, unsigned long framesize)
+{
+       return -ENODEV;
+}
+static inline int versatile_clcd_mmap_dma(struct clcd_fb *fb, struct vm_area_struct *vm)
+{
+       return -ENODEV;
+}
+static inline void versatile_clcd_remove_dma(struct clcd_fb *fb)
+{
+}
+#endif
+
+#endif
diff --git a/include/linux/tegra-ahb.h b/include/linux/tegra-ahb.h
deleted file mode 100644 (file)
index f1cd075..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
- * more details.
- */
-
-#ifndef __LINUX_AHB_H__
-#define __LINUX_AHB_H__
-
-extern int tegra_ahb_enable_smmu(struct device_node *ahb);
-
-#endif /* __LINUX_AHB_H__ */
diff --git a/include/linux/tegra-cpuidle.h b/include/linux/tegra-cpuidle.h
deleted file mode 100644 (file)
index 9c6286b..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (c) 2013, NVIDIA CORPORATION.  All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
- * more details.
- */
-
-#ifndef __LINUX_TEGRA_CPUIDLE_H__
-#define __LINUX_TEGRA_CPUIDLE_H__
-
-#ifdef CONFIG_CPU_IDLE
-void tegra_cpuidle_pcie_irqs_in_use(void);
-#else
-static inline void tegra_cpuidle_pcie_irqs_in_use(void)
-{
-}
-#endif
-
-#endif
diff --git a/include/linux/tegra-powergate.h b/include/linux/tegra-powergate.h
deleted file mode 100644 (file)
index 46f0a07..0000000
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright (c) 2010 Google, Inc
- *
- * Author:
- *     Colin Cross <ccross@google.com>
- *
- * This software is licensed under the terms of the GNU General Public
- * License version 2, as published by the Free Software Foundation, and
- * may be copied, distributed, and modified under those terms.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- */
-
-#ifndef _MACH_TEGRA_POWERGATE_H_
-#define _MACH_TEGRA_POWERGATE_H_
-
-struct clk;
-struct reset_control;
-
-#define TEGRA_POWERGATE_CPU    0
-#define TEGRA_POWERGATE_3D     1
-#define TEGRA_POWERGATE_VENC   2
-#define TEGRA_POWERGATE_PCIE   3
-#define TEGRA_POWERGATE_VDEC   4
-#define TEGRA_POWERGATE_L2     5
-#define TEGRA_POWERGATE_MPE    6
-#define TEGRA_POWERGATE_HEG    7
-#define TEGRA_POWERGATE_SATA   8
-#define TEGRA_POWERGATE_CPU1   9
-#define TEGRA_POWERGATE_CPU2   10
-#define TEGRA_POWERGATE_CPU3   11
-#define TEGRA_POWERGATE_CELP   12
-#define TEGRA_POWERGATE_3D1    13
-#define TEGRA_POWERGATE_CPU0   14
-#define TEGRA_POWERGATE_C0NC   15
-#define TEGRA_POWERGATE_C1NC   16
-#define TEGRA_POWERGATE_SOR    17
-#define TEGRA_POWERGATE_DIS    18
-#define TEGRA_POWERGATE_DISB   19
-#define TEGRA_POWERGATE_XUSBA  20
-#define TEGRA_POWERGATE_XUSBB  21
-#define TEGRA_POWERGATE_XUSBC  22
-#define TEGRA_POWERGATE_VIC    23
-#define TEGRA_POWERGATE_IRAM   24
-
-#define TEGRA_POWERGATE_3D0    TEGRA_POWERGATE_3D
-
-#define TEGRA_IO_RAIL_CSIA     0
-#define TEGRA_IO_RAIL_CSIB     1
-#define TEGRA_IO_RAIL_DSI      2
-#define TEGRA_IO_RAIL_MIPI_BIAS        3
-#define TEGRA_IO_RAIL_PEX_BIAS 4
-#define TEGRA_IO_RAIL_PEX_CLK1 5
-#define TEGRA_IO_RAIL_PEX_CLK2 6
-#define TEGRA_IO_RAIL_USB0     9
-#define TEGRA_IO_RAIL_USB1     10
-#define TEGRA_IO_RAIL_USB2     11
-#define TEGRA_IO_RAIL_USB_BIAS 12
-#define TEGRA_IO_RAIL_NAND     13
-#define TEGRA_IO_RAIL_UART     14
-#define TEGRA_IO_RAIL_BB       15
-#define TEGRA_IO_RAIL_AUDIO    17
-#define TEGRA_IO_RAIL_HSIC     19
-#define TEGRA_IO_RAIL_COMP     22
-#define TEGRA_IO_RAIL_HDMI     28
-#define TEGRA_IO_RAIL_PEX_CNTRL        32
-#define TEGRA_IO_RAIL_SDMMC1   33
-#define TEGRA_IO_RAIL_SDMMC3   34
-#define TEGRA_IO_RAIL_SDMMC4   35
-#define TEGRA_IO_RAIL_CAM      36
-#define TEGRA_IO_RAIL_RES      37
-#define TEGRA_IO_RAIL_HV       38
-#define TEGRA_IO_RAIL_DSIB     39
-#define TEGRA_IO_RAIL_DSIC     40
-#define TEGRA_IO_RAIL_DSID     41
-#define TEGRA_IO_RAIL_CSIE     44
-#define TEGRA_IO_RAIL_LVDS     57
-#define TEGRA_IO_RAIL_SYS_DDC  58
-
-#ifdef CONFIG_ARCH_TEGRA
-int tegra_powergate_is_powered(int id);
-int tegra_powergate_power_on(int id);
-int tegra_powergate_power_off(int id);
-int tegra_powergate_remove_clamping(int id);
-
-/* Must be called with clk disabled, and returns with clk enabled */
-int tegra_powergate_sequence_power_up(int id, struct clk *clk,
-                                     struct reset_control *rst);
-
-int tegra_io_rail_power_on(int id);
-int tegra_io_rail_power_off(int id);
-#else
-static inline int tegra_powergate_is_powered(int id)
-{
-       return -ENOSYS;
-}
-
-static inline int tegra_powergate_power_on(int id)
-{
-       return -ENOSYS;
-}
-
-static inline int tegra_powergate_power_off(int id)
-{
-       return -ENOSYS;
-}
-
-static inline int tegra_powergate_remove_clamping(int id)
-{
-       return -ENOSYS;
-}
-
-static inline int tegra_powergate_sequence_power_up(int id, struct clk *clk,
-                                                   struct reset_control *rst)
-{
-       return -ENOSYS;
-}
-
-static inline int tegra_io_rail_power_on(int id)
-{
-       return -ENOSYS;
-}
-
-static inline int tegra_io_rail_power_off(int id)
-{
-       return -ENOSYS;
-}
-#endif
-
-#endif /* _MACH_TEGRA_POWERGATE_H_ */
diff --git a/include/linux/tegra-soc.h b/include/linux/tegra-soc.h
deleted file mode 100644 (file)
index 95f611d..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef __LINUX_TEGRA_SOC_H_
-#define __LINUX_TEGRA_SOC_H_
-
-u32 tegra_read_chipid(void);
-
-#endif /* __LINUX_TEGRA_SOC_H_ */
diff --git a/include/soc/tegra/ahb.h b/include/soc/tegra/ahb.h
new file mode 100644 (file)
index 0000000..504eb6f
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ */
+
+#ifndef __SOC_TEGRA_AHB_H__
+#define __SOC_TEGRA_AHB_H__
+
+extern int tegra_ahb_enable_smmu(struct device_node *ahb);
+
+#endif /* __SOC_TEGRA_AHB_H__ */
diff --git a/include/soc/tegra/common.h b/include/soc/tegra/common.h
new file mode 100644 (file)
index 0000000..fc13a9a
--- /dev/null
@@ -0,0 +1,14 @@
+/*
+ * Copyright (C) 2014 NVIDIA Corporation
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef __SOC_TEGRA_COMMON_H__
+#define __SOC_TEGRA_COMMON_H__
+
+bool soc_is_tegra(void);
+
+#endif /* __SOC_TEGRA_COMMON_H__ */
diff --git a/include/soc/tegra/cpuidle.h b/include/soc/tegra/cpuidle.h
new file mode 100644 (file)
index 0000000..ea04f42
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2013, NVIDIA CORPORATION.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ */
+
+#ifndef __SOC_TEGRA_CPUIDLE_H__
+#define __SOC_TEGRA_CPUIDLE_H__
+
+#ifdef CONFIG_CPU_IDLE
+void tegra_cpuidle_pcie_irqs_in_use(void);
+#else
+static inline void tegra_cpuidle_pcie_irqs_in_use(void)
+{
+}
+#endif
+
+#endif /* __SOC_TEGRA_CPUIDLE_H__ */
diff --git a/include/soc/tegra/fuse.h b/include/soc/tegra/fuse.h
new file mode 100644 (file)
index 0000000..8e12494
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __SOC_TEGRA_FUSE_H__
+#define __SOC_TEGRA_FUSE_H__
+
+#define TEGRA20                0x20
+#define TEGRA30                0x30
+#define TEGRA114       0x35
+#define TEGRA124       0x40
+
+#define TEGRA_FUSE_SKU_CALIB_0 0xf0
+#define TEGRA30_FUSE_SATA_CALIB        0x124
+
+#ifndef __ASSEMBLY__
+
+u32 tegra_read_chipid(void);
+u8 tegra_get_chip_id(void);
+
+enum tegra_revision {
+       TEGRA_REVISION_UNKNOWN = 0,
+       TEGRA_REVISION_A01,
+       TEGRA_REVISION_A02,
+       TEGRA_REVISION_A03,
+       TEGRA_REVISION_A03p,
+       TEGRA_REVISION_A04,
+       TEGRA_REVISION_MAX,
+};
+
+struct tegra_sku_info {
+       int sku_id;
+       int cpu_process_id;
+       int cpu_speedo_id;
+       int cpu_speedo_value;
+       int cpu_iddq_value;
+       int core_process_id;
+       int soc_speedo_id;
+       int gpu_speedo_id;
+       int gpu_process_id;
+       int gpu_speedo_value;
+       enum tegra_revision revision;
+};
+
+u32 tegra_read_straps(void);
+u32 tegra_read_chipid(void);
+int tegra_fuse_readl(unsigned long offset, u32 *value);
+
+extern struct tegra_sku_info tegra_sku_info;
+
+#endif /* __ASSEMBLY__ */
+
+#endif /* __SOC_TEGRA_FUSE_H__ */
diff --git a/include/soc/tegra/pm.h b/include/soc/tegra/pm.h
new file mode 100644 (file)
index 0000000..30fe207
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2014 NVIDIA Corporation
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef __SOC_TEGRA_PM_H__
+#define __SOC_TEGRA_PM_H__
+
+enum tegra_suspend_mode {
+       TEGRA_SUSPEND_NONE = 0,
+       TEGRA_SUSPEND_LP2, /* CPU voltage off */
+       TEGRA_SUSPEND_LP1, /* CPU voltage off, DRAM self-refresh */
+       TEGRA_SUSPEND_LP0, /* CPU + core voltage off, DRAM self-refresh */
+       TEGRA_MAX_SUSPEND_MODE,
+};
+
+#ifdef CONFIG_PM_SLEEP
+enum tegra_suspend_mode
+tegra_pm_validate_suspend_mode(enum tegra_suspend_mode mode);
+
+/* low-level resume entry point */
+void tegra_resume(void);
+#else
+static inline enum tegra_suspend_mode
+tegra_pm_validate_suspend_mode(enum tegra_suspend_mode mode)
+{
+       return TEGRA_SUSPEND_NONE;
+}
+
+static inline void tegra_resume(void)
+{
+}
+#endif /* CONFIG_PM_SLEEP */
+
+#endif /* __SOC_TEGRA_PM_H__ */
diff --git a/include/soc/tegra/pmc.h b/include/soc/tegra/pmc.h
new file mode 100644 (file)
index 0000000..65a9327
--- /dev/null
@@ -0,0 +1,157 @@
+/*
+ * Copyright (c) 2010 Google, Inc
+ * Copyright (c) 2014 NVIDIA Corporation
+ *
+ * Author:
+ *     Colin Cross <ccross@google.com>
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#ifndef __SOC_TEGRA_PMC_H__
+#define __SOC_TEGRA_PMC_H__
+
+#include <linux/reboot.h>
+
+#include <soc/tegra/pm.h>
+
+struct clk;
+struct reset_control;
+
+void tegra_pmc_restart(enum reboot_mode mode, const char *cmd);
+
+#ifdef CONFIG_PM_SLEEP
+enum tegra_suspend_mode tegra_pmc_get_suspend_mode(void);
+void tegra_pmc_set_suspend_mode(enum tegra_suspend_mode mode);
+void tegra_pmc_enter_suspend_mode(enum tegra_suspend_mode mode);
+#endif /* CONFIG_PM_SLEEP */
+
+#ifdef CONFIG_SMP
+bool tegra_pmc_cpu_is_powered(int cpuid);
+int tegra_pmc_cpu_power_on(int cpuid);
+int tegra_pmc_cpu_remove_clamping(int cpuid);
+#endif /* CONFIG_SMP */
+
+/*
+ * powergate and I/O rail APIs
+ */
+
+#define TEGRA_POWERGATE_CPU    0
+#define TEGRA_POWERGATE_3D     1
+#define TEGRA_POWERGATE_VENC   2
+#define TEGRA_POWERGATE_PCIE   3
+#define TEGRA_POWERGATE_VDEC   4
+#define TEGRA_POWERGATE_L2     5
+#define TEGRA_POWERGATE_MPE    6
+#define TEGRA_POWERGATE_HEG    7
+#define TEGRA_POWERGATE_SATA   8
+#define TEGRA_POWERGATE_CPU1   9
+#define TEGRA_POWERGATE_CPU2   10
+#define TEGRA_POWERGATE_CPU3   11
+#define TEGRA_POWERGATE_CELP   12
+#define TEGRA_POWERGATE_3D1    13
+#define TEGRA_POWERGATE_CPU0   14
+#define TEGRA_POWERGATE_C0NC   15
+#define TEGRA_POWERGATE_C1NC   16
+#define TEGRA_POWERGATE_SOR    17
+#define TEGRA_POWERGATE_DIS    18
+#define TEGRA_POWERGATE_DISB   19
+#define TEGRA_POWERGATE_XUSBA  20
+#define TEGRA_POWERGATE_XUSBB  21
+#define TEGRA_POWERGATE_XUSBC  22
+#define TEGRA_POWERGATE_VIC    23
+#define TEGRA_POWERGATE_IRAM   24
+
+#define TEGRA_POWERGATE_3D0    TEGRA_POWERGATE_3D
+
+#define TEGRA_IO_RAIL_CSIA     0
+#define TEGRA_IO_RAIL_CSIB     1
+#define TEGRA_IO_RAIL_DSI      2
+#define TEGRA_IO_RAIL_MIPI_BIAS        3
+#define TEGRA_IO_RAIL_PEX_BIAS 4
+#define TEGRA_IO_RAIL_PEX_CLK1 5
+#define TEGRA_IO_RAIL_PEX_CLK2 6
+#define TEGRA_IO_RAIL_USB0     9
+#define TEGRA_IO_RAIL_USB1     10
+#define TEGRA_IO_RAIL_USB2     11
+#define TEGRA_IO_RAIL_USB_BIAS 12
+#define TEGRA_IO_RAIL_NAND     13
+#define TEGRA_IO_RAIL_UART     14
+#define TEGRA_IO_RAIL_BB       15
+#define TEGRA_IO_RAIL_AUDIO    17
+#define TEGRA_IO_RAIL_HSIC     19
+#define TEGRA_IO_RAIL_COMP     22
+#define TEGRA_IO_RAIL_HDMI     28
+#define TEGRA_IO_RAIL_PEX_CNTRL        32
+#define TEGRA_IO_RAIL_SDMMC1   33
+#define TEGRA_IO_RAIL_SDMMC3   34
+#define TEGRA_IO_RAIL_SDMMC4   35
+#define TEGRA_IO_RAIL_CAM      36
+#define TEGRA_IO_RAIL_RES      37
+#define TEGRA_IO_RAIL_HV       38
+#define TEGRA_IO_RAIL_DSIB     39
+#define TEGRA_IO_RAIL_DSIC     40
+#define TEGRA_IO_RAIL_DSID     41
+#define TEGRA_IO_RAIL_CSIE     44
+#define TEGRA_IO_RAIL_LVDS     57
+#define TEGRA_IO_RAIL_SYS_DDC  58
+
+#ifdef CONFIG_ARCH_TEGRA
+int tegra_powergate_is_powered(int id);
+int tegra_powergate_power_on(int id);
+int tegra_powergate_power_off(int id);
+int tegra_powergate_remove_clamping(int id);
+
+/* Must be called with clk disabled, and returns with clk enabled */
+int tegra_powergate_sequence_power_up(int id, struct clk *clk,
+                                     struct reset_control *rst);
+
+int tegra_io_rail_power_on(int id);
+int tegra_io_rail_power_off(int id);
+#else
+static inline int tegra_powergate_is_powered(int id)
+{
+       return -ENOSYS;
+}
+
+static inline int tegra_powergate_power_on(int id)
+{
+       return -ENOSYS;
+}
+
+static inline int tegra_powergate_power_off(int id)
+{
+       return -ENOSYS;
+}
+
+static inline int tegra_powergate_remove_clamping(int id)
+{
+       return -ENOSYS;
+}
+
+static inline int tegra_powergate_sequence_power_up(int id, struct clk *clk,
+                                                   struct reset_control *rst)
+{
+       return -ENOSYS;
+}
+
+static inline int tegra_io_rail_power_on(int id)
+{
+       return -ENOSYS;
+}
+
+static inline int tegra_io_rail_power_off(int id)
+{
+       return -ENOSYS;
+}
+#endif /* CONFIG_ARCH_TEGRA */
+
+#endif /* __SOC_TEGRA_PMC_H__ */
index 131a0bda7aecec634b61ac72078d07d31eb1602c..908925ace77661a2e056fa5ddd9ac52df12a0b19 100644 (file)
@@ -37,7 +37,7 @@ TRACE_EVENT(kvm_userspace_exit,
                  __entry->errno < 0 ? -__entry->errno : __entry->reason)
 );
 
-#if defined(CONFIG_HAVE_KVM_IRQCHIP)
+#if defined(CONFIG_HAVE_KVM_IRQFD)
 TRACE_EVENT(kvm_set_irq,
        TP_PROTO(unsigned int gsi, int level, int irq_source_id),
        TP_ARGS(gsi, level, irq_source_id),
@@ -57,7 +57,7 @@ TRACE_EVENT(kvm_set_irq,
        TP_printk("gsi %u level %d source %d",
                  __entry->gsi, __entry->level, __entry->irq_source_id)
 );
-#endif
+#endif /* defined(CONFIG_HAVE_KVM_IRQFD) */
 
 #if defined(__KVM_HAVE_IOAPIC)
 #define kvm_deliver_mode               \
@@ -124,7 +124,7 @@ TRACE_EVENT(kvm_msi_set_irq,
 
 #endif /* defined(__KVM_HAVE_IOAPIC) */
 
-#if defined(CONFIG_HAVE_KVM_IRQCHIP)
+#if defined(CONFIG_HAVE_KVM_IRQFD)
 
 TRACE_EVENT(kvm_ack_irq,
        TP_PROTO(unsigned int irqchip, unsigned int pin),
@@ -149,7 +149,7 @@ TRACE_EVENT(kvm_ack_irq,
 #endif
 );
 
-#endif /* defined(CONFIG_HAVE_KVM_IRQCHIP) */
+#endif /* defined(CONFIG_HAVE_KVM_IRQFD) */
 
 
 
index 9abbeb924cbb74a7e0bfba97d178831e92590d4f..b0b85561364161e7ce5c8196a6a8b03940db4b9d 100644 (file)
@@ -780,7 +780,7 @@ struct drm_prime_handle {
 
 /**
  * Device specific ioctls should only be in their respective headers
- * The device specific ioctl range is from 0x40 to 0x99.
+ * The device specific ioctl range is from 0x40 to 0x9f.
  * Generic IOCTLS restart at 0xA0.
  *
  * \sa drmCommandNone(), drmCommandRead(), drmCommandWrite(), and
index def54f9e07ca26c48afb3af2c3cd63d593be4c02..a0db2d4aa5f0125349adc7ec6516fbfbda63be43 100644 (file)
 #define DRM_MODE_SCALE_CENTER          2 /* Centered, no scaling */
 #define DRM_MODE_SCALE_ASPECT          3 /* Full screen, preserve aspect */
 
+/* Picture aspect ratio options */
+#define DRM_MODE_PICTURE_ASPECT_NONE   0
+#define DRM_MODE_PICTURE_ASPECT_4_3    1
+#define DRM_MODE_PICTURE_ASPECT_16_9   2
+
 /* Dithering mode options */
 #define DRM_MODE_DITHERING_OFF 0
 #define DRM_MODE_DITHERING_ON  1
index 1cc0b610f162928a5a9564bdc091e22fc5ab9a86..509b2d7a41b7ea88e676409a39d483e5a450f029 100644 (file)
@@ -796,7 +796,9 @@ struct drm_radeon_gem_info {
        uint64_t        vram_visible;
 };
 
-#define RADEON_GEM_NO_BACKING_STORE 1
+#define RADEON_GEM_NO_BACKING_STORE    (1 << 0)
+#define RADEON_GEM_GTT_UC              (1 << 1)
+#define RADEON_GEM_GTT_WC              (1 << 2)
 
 struct drm_radeon_gem_create {
        uint64_t        size;
index b75482112428afa8eaab6cd266f3221d8decab28..c15d781ecc0f306ce5fd575192f547b8e756273f 100644 (file)
@@ -129,6 +129,44 @@ struct drm_tegra_submit {
        __u32 reserved[5];      /* future expansion */
 };
 
+#define DRM_TEGRA_GEM_TILING_MODE_PITCH 0
+#define DRM_TEGRA_GEM_TILING_MODE_TILED 1
+#define DRM_TEGRA_GEM_TILING_MODE_BLOCK 2
+
+struct drm_tegra_gem_set_tiling {
+       /* input */
+       __u32 handle;
+       __u32 mode;
+       __u32 value;
+       __u32 pad;
+};
+
+struct drm_tegra_gem_get_tiling {
+       /* input */
+       __u32 handle;
+       /* output */
+       __u32 mode;
+       __u32 value;
+       __u32 pad;
+};
+
+#define DRM_TEGRA_GEM_BOTTOM_UP                (1 << 0)
+#define DRM_TEGRA_GEM_FLAGS            (DRM_TEGRA_GEM_BOTTOM_UP)
+
+struct drm_tegra_gem_set_flags {
+       /* input */
+       __u32 handle;
+       /* output */
+       __u32 flags;
+};
+
+struct drm_tegra_gem_get_flags {
+       /* input */
+       __u32 handle;
+       /* output */
+       __u32 flags;
+};
+
 #define DRM_TEGRA_GEM_CREATE           0x00
 #define DRM_TEGRA_GEM_MMAP             0x01
 #define DRM_TEGRA_SYNCPT_READ          0x02
@@ -139,6 +177,10 @@ struct drm_tegra_submit {
 #define DRM_TEGRA_GET_SYNCPT           0x07
 #define DRM_TEGRA_SUBMIT               0x08
 #define DRM_TEGRA_GET_SYNCPT_BASE      0x09
+#define DRM_TEGRA_GEM_SET_TILING       0x0a
+#define DRM_TEGRA_GEM_GET_TILING       0x0b
+#define DRM_TEGRA_GEM_SET_FLAGS                0x0c
+#define DRM_TEGRA_GEM_GET_FLAGS                0x0d
 
 #define DRM_IOCTL_TEGRA_GEM_CREATE DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_CREATE, struct drm_tegra_gem_create)
 #define DRM_IOCTL_TEGRA_GEM_MMAP DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_MMAP, struct drm_tegra_gem_mmap)
@@ -150,5 +192,9 @@ struct drm_tegra_submit {
 #define DRM_IOCTL_TEGRA_GET_SYNCPT DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GET_SYNCPT, struct drm_tegra_get_syncpt)
 #define DRM_IOCTL_TEGRA_SUBMIT DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_SUBMIT, struct drm_tegra_submit)
 #define DRM_IOCTL_TEGRA_GET_SYNCPT_BASE DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GET_SYNCPT_BASE, struct drm_tegra_get_syncpt_base)
+#define DRM_IOCTL_TEGRA_GEM_SET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_SET_TILING, struct drm_tegra_gem_set_tiling)
+#define DRM_IOCTL_TEGRA_GEM_GET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_GET_TILING, struct drm_tegra_gem_get_tiling)
+#define DRM_IOCTL_TEGRA_GEM_SET_FLAGS DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_SET_FLAGS, struct drm_tegra_gem_set_flags)
+#define DRM_IOCTL_TEGRA_GEM_GET_FLAGS DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_GET_FLAGS, struct drm_tegra_gem_get_flags)
 
 #endif
index 9b744af871d74afb7f3e3b46b325ada5468cc4b5..cf3a2ff440e4ae6840aa2d7a45c1e7590a8ce719 100644 (file)
@@ -162,7 +162,7 @@ struct kvm_pit_config {
 #define KVM_EXIT_TPR_ACCESS       12
 #define KVM_EXIT_S390_SIEIC       13
 #define KVM_EXIT_S390_RESET       14
-#define KVM_EXIT_DCR              15
+#define KVM_EXIT_DCR              15 /* deprecated */
 #define KVM_EXIT_NMI              16
 #define KVM_EXIT_INTERNAL_ERROR   17
 #define KVM_EXIT_OSI              18
@@ -268,7 +268,7 @@ struct kvm_run {
                        __u64 trans_exc_code;
                        __u32 pgm_code;
                } s390_ucontrol;
-               /* KVM_EXIT_DCR */
+               /* KVM_EXIT_DCR (deprecated) */
                struct {
                        __u32 dcrn;
                        __u32 data;
@@ -763,6 +763,8 @@ struct kvm_ppc_smmu_info {
 #define KVM_CAP_VM_ATTRIBUTES 101
 #define KVM_CAP_ARM_PSCI_0_2 102
 #define KVM_CAP_PPC_FIXUP_HCALL 103
+#define KVM_CAP_PPC_ENABLE_HCALL 104
+#define KVM_CAP_CHECK_EXTENSION_VM 105
 
 #ifdef KVM_CAP_IRQ_ROUTING
 
index b0393209679b083e14aa2adeb5077a20975c3321..a20e4a3a8b15cb5deaaa7f6534403ccb751d4284 100644 (file)
@@ -19,6 +19,7 @@
 /* VIDCON0 */
 
 #define VIDCON0                                        0x00
+#define VIDCON0_DSI_EN                         (1 << 30)
 #define VIDCON0_INTERLACE                      (1 << 29)
 #define VIDCON0_VIDOUT_MASK                    (0x7 << 26)
 #define VIDCON0_VIDOUT_SHIFT                   26
 #define VIDCON2_ORGYCbCr                       (1 << 8)
 #define VIDCON2_YUVORDCrCb                     (1 << 7)
 
-/* PRTCON (S3C6410, S5PC100)
+/* PRTCON (S3C6410)
  * Might not be present in the S3C6410 documentation,
  * but tests prove it's there almost for sure; shouldn't hurt in any case.
  */
 #define VIDINTCON0_INT_ENABLE                  (1 << 0)
 
 #define VIDINTCON1                             0x134
-#define VIDINTCON1_INT_I180                    (1 << 2)
+#define VIDINTCON1_INT_I80                     (1 << 2)
 #define VIDINTCON1_INT_FRAME                   (1 << 1)
 #define VIDINTCON1_INT_FIFO                    (1 << 0)
 
index 5c1aba154b64c833c9acb865bcc600057234b59a..3387465b9caa65ebebf0bdbb4a25c2dd74641907 100644 (file)
@@ -64,24 +64,6 @@ int gnttab_resume(void);
 
 int gnttab_grant_foreign_access(domid_t domid, unsigned long frame,
                                int readonly);
-int gnttab_grant_foreign_access_subpage(domid_t domid, unsigned long frame,
-                                       int flags, unsigned page_off,
-                                       unsigned length);
-int gnttab_grant_foreign_access_trans(domid_t domid, int flags,
-                                     domid_t trans_domid,
-                                     grant_ref_t trans_gref);
-
-/*
- * Are sub-page grants available on this version of Xen?  Returns true if they
- * are, and false if they're not.
- */
-bool gnttab_subpage_grants_available(void);
-
-/*
- * Are transitive grants available on this version of Xen?  Returns true if they
- * are, and false if they're not.
- */
-bool gnttab_trans_grants_available(void);
 
 /*
  * End access through the given grant reference, iff the grant entry is no
@@ -128,13 +110,6 @@ void gnttab_cancel_free_callback(struct gnttab_free_callback *callback);
 
 void gnttab_grant_foreign_access_ref(grant_ref_t ref, domid_t domid,
                                     unsigned long frame, int readonly);
-int gnttab_grant_foreign_access_subpage_ref(grant_ref_t ref, domid_t domid,
-                                           unsigned long frame, int flags,
-                                           unsigned page_off,
-                                           unsigned length);
-int gnttab_grant_foreign_access_trans_ref(grant_ref_t ref, domid_t domid,
-                                         int flags, domid_t trans_domid,
-                                         grant_ref_t trans_gref);
 
 void gnttab_grant_foreign_transfer_ref(grant_ref_t, domid_t domid,
                                       unsigned long pfn);
@@ -170,13 +145,10 @@ gnttab_set_unmap_op(struct gnttab_unmap_grant_ref *unmap, phys_addr_t addr,
        unmap->dev_bus_addr = 0;
 }
 
-int arch_gnttab_init(unsigned long nr_shared, unsigned long nr_status);
+int arch_gnttab_init(unsigned long nr_shared);
 int arch_gnttab_map_shared(xen_pfn_t *frames, unsigned long nr_gframes,
                           unsigned long max_nr_gframes,
                           void **__shared);
-int arch_gnttab_map_status(uint64_t *frames, unsigned long nr_gframes,
-                          unsigned long max_nr_gframes,
-                          grant_status_t **__shared);
 void arch_gnttab_unmap(void *shared, unsigned long nr_gframes);
 
 struct grant_frames {
index 520702db9accd25ff2e66579bfee4d231d5fa0e4..ce635dccf3d96921249a2e20084d9f67b5361b33 100644 (file)
@@ -262,6 +262,15 @@ unsigned long __attribute__((weak)) calibrate_delay_is_known(void)
        return 0;
 }
 
+/*
+ * Indicate the cpu delay calibration is done. This can be used by
+ * architectures to stop accepting delay timer registrations after this point.
+ */
+
+void __attribute__((weak)) calibration_delay_done(void)
+{
+}
+
 void calibrate_delay(void)
 {
        unsigned long lpj;
@@ -301,4 +310,6 @@ void calibrate_delay(void)
 
        loops_per_jiffy = lpj;
        printed = true;
+
+       calibration_delay_done();
 }
index 2f2e91ac690f683c6f87347b34d4b9cbe11c8038..bd41ee4da078c6c7808364db38d344eab4151a75 100644 (file)
@@ -107,7 +107,7 @@ static int arizona_spk_ev(struct snd_soc_dapm_widget *w,
                break;
        case SND_SOC_DAPM_POST_PMU:
                val = snd_soc_read(codec, ARIZONA_INTERRUPT_RAW_STATUS_3);
-               if (val & ARIZONA_SPK_SHUTDOWN_STS) {
+               if (val & ARIZONA_SPK_OVERHEAT_STS) {
                        dev_crit(arizona->dev,
                                 "Speaker not enabled due to temperature\n");
                        return -EBUSY;
@@ -159,7 +159,7 @@ static irqreturn_t arizona_thermal_warn(int irq, void *data)
        if (ret != 0) {
                dev_err(arizona->dev, "Failed to read thermal status: %d\n",
                        ret);
-       } else if (val & ARIZONA_SPK_SHUTDOWN_WARN_STS) {
+       } else if (val & ARIZONA_SPK_OVERHEAT_WARN_STS) {
                dev_crit(arizona->dev, "Thermal warning\n");
        }
 
@@ -177,7 +177,7 @@ static irqreturn_t arizona_thermal_shutdown(int irq, void *data)
        if (ret != 0) {
                dev_err(arizona->dev, "Failed to read thermal status: %d\n",
                        ret);
-       } else if (val & ARIZONA_SPK_SHUTDOWN_STS) {
+       } else if (val & ARIZONA_SPK_OVERHEAT_STS) {
                dev_crit(arizona->dev, "Thermal shutdown\n");
                ret = regmap_update_bits(arizona->regmap,
                                         ARIZONA_OUTPUT_ENABLES_1,
@@ -223,7 +223,7 @@ int arizona_init_spk(struct snd_soc_codec *codec)
                break;
        }
 
-       ret = arizona_request_irq(arizona, ARIZONA_IRQ_SPK_SHUTDOWN_WARN,
+       ret = arizona_request_irq(arizona, ARIZONA_IRQ_SPK_OVERHEAT_WARN,
                                  "Thermal warning", arizona_thermal_warn,
                                  arizona);
        if (ret != 0)
@@ -231,7 +231,7 @@ int arizona_init_spk(struct snd_soc_codec *codec)
                        "Failed to get thermal warning IRQ: %d\n",
                        ret);
 
-       ret = arizona_request_irq(arizona, ARIZONA_IRQ_SPK_SHUTDOWN,
+       ret = arizona_request_irq(arizona, ARIZONA_IRQ_SPK_OVERHEAT,
                                  "Thermal shutdown", arizona_thermal_shutdown,
                                  arizona);
        if (ret != 0)
index 9506d7617223aed4bc6a76a2e0fc531099b1b13e..3b527dcfc0aae5446bb8b1f06b3713ec3f2e0f85 100644 (file)
@@ -16,7 +16,7 @@
 #include <sound/jack.h>
 
 #include <asm/mach-types.h>
-#include <mach/gpio.h>
+#include <mach/gpio-samsung.h>
 
 #include "../codecs/wm8994.h"
 
index 13f2d19793e3e65986466c90c483f84249c71cd9..fc0c5e603eb42e7404d6060e81e4c20fa0003f39 100644 (file)
@@ -6,6 +6,9 @@ config HAVE_KVM
 config HAVE_KVM_IRQCHIP
        bool
 
+config HAVE_KVM_IRQFD
+       bool
+
 config HAVE_KVM_IRQ_ROUTING
        bool
 
diff --git a/virt/kvm/arm/vgic-v2.c b/virt/kvm/arm/vgic-v2.c
new file mode 100644 (file)
index 0000000..01124ef
--- /dev/null
@@ -0,0 +1,265 @@
+/*
+ * Copyright (C) 2012,2013 ARM Limited, All Rights Reserved.
+ * Author: Marc Zyngier <marc.zyngier@arm.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <linux/cpu.h>
+#include <linux/kvm.h>
+#include <linux/kvm_host.h>
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/of_irq.h>
+
+#include <linux/irqchip/arm-gic.h>
+
+#include <asm/kvm_emulate.h>
+#include <asm/kvm_arm.h>
+#include <asm/kvm_mmu.h>
+
+static struct vgic_lr vgic_v2_get_lr(const struct kvm_vcpu *vcpu, int lr)
+{
+       struct vgic_lr lr_desc;
+       u32 val = vcpu->arch.vgic_cpu.vgic_v2.vgic_lr[lr];
+
+       lr_desc.irq     = val & GICH_LR_VIRTUALID;
+       if (lr_desc.irq <= 15)
+               lr_desc.source  = (val >> GICH_LR_PHYSID_CPUID_SHIFT) & 0x7;
+       else
+               lr_desc.source = 0;
+       lr_desc.state   = 0;
+
+       if (val & GICH_LR_PENDING_BIT)
+               lr_desc.state |= LR_STATE_PENDING;
+       if (val & GICH_LR_ACTIVE_BIT)
+               lr_desc.state |= LR_STATE_ACTIVE;
+       if (val & GICH_LR_EOI)
+               lr_desc.state |= LR_EOI_INT;
+
+       return lr_desc;
+}
+
+static void vgic_v2_set_lr(struct kvm_vcpu *vcpu, int lr,
+                          struct vgic_lr lr_desc)
+{
+       u32 lr_val = (lr_desc.source << GICH_LR_PHYSID_CPUID_SHIFT) | lr_desc.irq;
+
+       if (lr_desc.state & LR_STATE_PENDING)
+               lr_val |= GICH_LR_PENDING_BIT;
+       if (lr_desc.state & LR_STATE_ACTIVE)
+               lr_val |= GICH_LR_ACTIVE_BIT;
+       if (lr_desc.state & LR_EOI_INT)
+               lr_val |= GICH_LR_EOI;
+
+       vcpu->arch.vgic_cpu.vgic_v2.vgic_lr[lr] = lr_val;
+}
+
+static void vgic_v2_sync_lr_elrsr(struct kvm_vcpu *vcpu, int lr,
+                                 struct vgic_lr lr_desc)
+{
+       if (!(lr_desc.state & LR_STATE_MASK))
+               set_bit(lr, (unsigned long *)vcpu->arch.vgic_cpu.vgic_v2.vgic_elrsr);
+}
+
+static u64 vgic_v2_get_elrsr(const struct kvm_vcpu *vcpu)
+{
+       u64 val;
+
+#if BITS_PER_LONG == 64
+       val  = vcpu->arch.vgic_cpu.vgic_v2.vgic_elrsr[1];
+       val <<= 32;
+       val |= vcpu->arch.vgic_cpu.vgic_v2.vgic_elrsr[0];
+#else
+       val = *(u64 *)vcpu->arch.vgic_cpu.vgic_v2.vgic_elrsr;
+#endif
+       return val;
+}
+
+static u64 vgic_v2_get_eisr(const struct kvm_vcpu *vcpu)
+{
+       u64 val;
+
+#if BITS_PER_LONG == 64
+       val  = vcpu->arch.vgic_cpu.vgic_v2.vgic_eisr[1];
+       val <<= 32;
+       val |= vcpu->arch.vgic_cpu.vgic_v2.vgic_eisr[0];
+#else
+       val = *(u64 *)vcpu->arch.vgic_cpu.vgic_v2.vgic_eisr;
+#endif
+       return val;
+}
+
+static u32 vgic_v2_get_interrupt_status(const struct kvm_vcpu *vcpu)
+{
+       u32 misr = vcpu->arch.vgic_cpu.vgic_v2.vgic_misr;
+       u32 ret = 0;
+
+       if (misr & GICH_MISR_EOI)
+               ret |= INT_STATUS_EOI;
+       if (misr & GICH_MISR_U)
+               ret |= INT_STATUS_UNDERFLOW;
+
+       return ret;
+}
+
+static void vgic_v2_enable_underflow(struct kvm_vcpu *vcpu)
+{
+       vcpu->arch.vgic_cpu.vgic_v2.vgic_hcr |= GICH_HCR_UIE;
+}
+
+static void vgic_v2_disable_underflow(struct kvm_vcpu *vcpu)
+{
+       vcpu->arch.vgic_cpu.vgic_v2.vgic_hcr &= ~GICH_HCR_UIE;
+}
+
+static void vgic_v2_get_vmcr(struct kvm_vcpu *vcpu, struct vgic_vmcr *vmcrp)
+{
+       u32 vmcr = vcpu->arch.vgic_cpu.vgic_v2.vgic_vmcr;
+
+       vmcrp->ctlr = (vmcr & GICH_VMCR_CTRL_MASK) >> GICH_VMCR_CTRL_SHIFT;
+       vmcrp->abpr = (vmcr & GICH_VMCR_ALIAS_BINPOINT_MASK) >> GICH_VMCR_ALIAS_BINPOINT_SHIFT;
+       vmcrp->bpr  = (vmcr & GICH_VMCR_BINPOINT_MASK) >> GICH_VMCR_BINPOINT_SHIFT;
+       vmcrp->pmr  = (vmcr & GICH_VMCR_PRIMASK_MASK) >> GICH_VMCR_PRIMASK_SHIFT;
+}
+
+static void vgic_v2_set_vmcr(struct kvm_vcpu *vcpu, struct vgic_vmcr *vmcrp)
+{
+       u32 vmcr;
+
+       vmcr  = (vmcrp->ctlr << GICH_VMCR_CTRL_SHIFT) & GICH_VMCR_CTRL_MASK;
+       vmcr |= (vmcrp->abpr << GICH_VMCR_ALIAS_BINPOINT_SHIFT) & GICH_VMCR_ALIAS_BINPOINT_MASK;
+       vmcr |= (vmcrp->bpr << GICH_VMCR_BINPOINT_SHIFT) & GICH_VMCR_BINPOINT_MASK;
+       vmcr |= (vmcrp->pmr << GICH_VMCR_PRIMASK_SHIFT) & GICH_VMCR_PRIMASK_MASK;
+
+       vcpu->arch.vgic_cpu.vgic_v2.vgic_vmcr = vmcr;
+}
+
+static void vgic_v2_enable(struct kvm_vcpu *vcpu)
+{
+       /*
+        * By forcing VMCR to zero, the GIC will restore the binary
+        * points to their reset values. Anything else resets to zero
+        * anyway.
+        */
+       vcpu->arch.vgic_cpu.vgic_v2.vgic_vmcr = 0;
+
+       /* Get the show on the road... */
+       vcpu->arch.vgic_cpu.vgic_v2.vgic_hcr = GICH_HCR_EN;
+}
+
+static const struct vgic_ops vgic_v2_ops = {
+       .get_lr                 = vgic_v2_get_lr,
+       .set_lr                 = vgic_v2_set_lr,
+       .sync_lr_elrsr          = vgic_v2_sync_lr_elrsr,
+       .get_elrsr              = vgic_v2_get_elrsr,
+       .get_eisr               = vgic_v2_get_eisr,
+       .get_interrupt_status   = vgic_v2_get_interrupt_status,
+       .enable_underflow       = vgic_v2_enable_underflow,
+       .disable_underflow      = vgic_v2_disable_underflow,
+       .get_vmcr               = vgic_v2_get_vmcr,
+       .set_vmcr               = vgic_v2_set_vmcr,
+       .enable                 = vgic_v2_enable,
+};
+
+static struct vgic_params vgic_v2_params;
+
+/**
+ * vgic_v2_probe - probe for a GICv2 compatible interrupt controller in DT
+ * @node:      pointer to the DT node
+ * @ops:       address of a pointer to the GICv2 operations
+ * @params:    address of a pointer to HW-specific parameters
+ *
+ * Returns 0 if a GICv2 has been found, with the low level operations
+ * in *ops and the HW parameters in *params. Returns an error code
+ * otherwise.
+ */
+int vgic_v2_probe(struct device_node *vgic_node,
+                 const struct vgic_ops **ops,
+                 const struct vgic_params **params)
+{
+       int ret;
+       struct resource vctrl_res;
+       struct resource vcpu_res;
+       struct vgic_params *vgic = &vgic_v2_params;
+
+       vgic->maint_irq = irq_of_parse_and_map(vgic_node, 0);
+       if (!vgic->maint_irq) {
+               kvm_err("error getting vgic maintenance irq from DT\n");
+               ret = -ENXIO;
+               goto out;
+       }
+
+       ret = of_address_to_resource(vgic_node, 2, &vctrl_res);
+       if (ret) {
+               kvm_err("Cannot obtain GICH resource\n");
+               goto out;
+       }
+
+       vgic->vctrl_base = of_iomap(vgic_node, 2);
+       if (!vgic->vctrl_base) {
+               kvm_err("Cannot ioremap GICH\n");
+               ret = -ENOMEM;
+               goto out;
+       }
+
+       vgic->nr_lr = readl_relaxed(vgic->vctrl_base + GICH_VTR);
+       vgic->nr_lr = (vgic->nr_lr & 0x3f) + 1;
+
+       ret = create_hyp_io_mappings(vgic->vctrl_base,
+                                    vgic->vctrl_base + resource_size(&vctrl_res),
+                                    vctrl_res.start);
+       if (ret) {
+               kvm_err("Cannot map VCTRL into hyp\n");
+               goto out_unmap;
+       }
+
+       if (of_address_to_resource(vgic_node, 3, &vcpu_res)) {
+               kvm_err("Cannot obtain GICV resource\n");
+               ret = -ENXIO;
+               goto out_unmap;
+       }
+
+       if (!PAGE_ALIGNED(vcpu_res.start)) {
+               kvm_err("GICV physical address 0x%llx not page aligned\n",
+                       (unsigned long long)vcpu_res.start);
+               ret = -ENXIO;
+               goto out_unmap;
+       }
+
+       if (!PAGE_ALIGNED(resource_size(&vcpu_res))) {
+               kvm_err("GICV size 0x%llx not a multiple of page size 0x%lx\n",
+                       (unsigned long long)resource_size(&vcpu_res),
+                       PAGE_SIZE);
+               ret = -ENXIO;
+               goto out_unmap;
+       }
+
+       vgic->vcpu_base = vcpu_res.start;
+
+       kvm_info("%s@%llx IRQ%d\n", vgic_node->name,
+                vctrl_res.start, vgic->maint_irq);
+
+       vgic->type = VGIC_V2;
+       *ops = &vgic_v2_ops;
+       *params = vgic;
+       goto out;
+
+out_unmap:
+       iounmap(vgic->vctrl_base);
+out:
+       of_node_put(vgic_node);
+       return ret;
+}
diff --git a/virt/kvm/arm/vgic-v3.c b/virt/kvm/arm/vgic-v3.c
new file mode 100644 (file)
index 0000000..1c2c8ee
--- /dev/null
@@ -0,0 +1,247 @@
+/*
+ * Copyright (C) 2013 ARM Limited, All Rights Reserved.
+ * Author: Marc Zyngier <marc.zyngier@arm.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <linux/cpu.h>
+#include <linux/kvm.h>
+#include <linux/kvm_host.h>
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/of_irq.h>
+
+#include <linux/irqchip/arm-gic-v3.h>
+
+#include <asm/kvm_emulate.h>
+#include <asm/kvm_arm.h>
+#include <asm/kvm_mmu.h>
+
+/* These are for GICv2 emulation only */
+#define GICH_LR_VIRTUALID              (0x3ffUL << 0)
+#define GICH_LR_PHYSID_CPUID_SHIFT     (10)
+#define GICH_LR_PHYSID_CPUID           (7UL << GICH_LR_PHYSID_CPUID_SHIFT)
+
+/*
+ * LRs are stored in reverse order in memory. make sure we index them
+ * correctly.
+ */
+#define LR_INDEX(lr)                   (VGIC_V3_MAX_LRS - 1 - lr)
+
+static u32 ich_vtr_el2;
+
+static struct vgic_lr vgic_v3_get_lr(const struct kvm_vcpu *vcpu, int lr)
+{
+       struct vgic_lr lr_desc;
+       u64 val = vcpu->arch.vgic_cpu.vgic_v3.vgic_lr[LR_INDEX(lr)];
+
+       lr_desc.irq     = val & GICH_LR_VIRTUALID;
+       if (lr_desc.irq <= 15)
+               lr_desc.source  = (val >> GICH_LR_PHYSID_CPUID_SHIFT) & 0x7;
+       else
+               lr_desc.source = 0;
+       lr_desc.state   = 0;
+
+       if (val & ICH_LR_PENDING_BIT)
+               lr_desc.state |= LR_STATE_PENDING;
+       if (val & ICH_LR_ACTIVE_BIT)
+               lr_desc.state |= LR_STATE_ACTIVE;
+       if (val & ICH_LR_EOI)
+               lr_desc.state |= LR_EOI_INT;
+
+       return lr_desc;
+}
+
+static void vgic_v3_set_lr(struct kvm_vcpu *vcpu, int lr,
+                          struct vgic_lr lr_desc)
+{
+       u64 lr_val = (((u32)lr_desc.source << GICH_LR_PHYSID_CPUID_SHIFT) |
+                     lr_desc.irq);
+
+       if (lr_desc.state & LR_STATE_PENDING)
+               lr_val |= ICH_LR_PENDING_BIT;
+       if (lr_desc.state & LR_STATE_ACTIVE)
+               lr_val |= ICH_LR_ACTIVE_BIT;
+       if (lr_desc.state & LR_EOI_INT)
+               lr_val |= ICH_LR_EOI;
+
+       vcpu->arch.vgic_cpu.vgic_v3.vgic_lr[LR_INDEX(lr)] = lr_val;
+}
+
+static void vgic_v3_sync_lr_elrsr(struct kvm_vcpu *vcpu, int lr,
+                                 struct vgic_lr lr_desc)
+{
+       if (!(lr_desc.state & LR_STATE_MASK))
+               vcpu->arch.vgic_cpu.vgic_v3.vgic_elrsr |= (1U << lr);
+}
+
+static u64 vgic_v3_get_elrsr(const struct kvm_vcpu *vcpu)
+{
+       return vcpu->arch.vgic_cpu.vgic_v3.vgic_elrsr;
+}
+
+static u64 vgic_v3_get_eisr(const struct kvm_vcpu *vcpu)
+{
+       return vcpu->arch.vgic_cpu.vgic_v3.vgic_eisr;
+}
+
+static u32 vgic_v3_get_interrupt_status(const struct kvm_vcpu *vcpu)
+{
+       u32 misr = vcpu->arch.vgic_cpu.vgic_v3.vgic_misr;
+       u32 ret = 0;
+
+       if (misr & ICH_MISR_EOI)
+               ret |= INT_STATUS_EOI;
+       if (misr & ICH_MISR_U)
+               ret |= INT_STATUS_UNDERFLOW;
+
+       return ret;
+}
+
+static void vgic_v3_get_vmcr(struct kvm_vcpu *vcpu, struct vgic_vmcr *vmcrp)
+{
+       u32 vmcr = vcpu->arch.vgic_cpu.vgic_v3.vgic_vmcr;
+
+       vmcrp->ctlr = (vmcr & ICH_VMCR_CTLR_MASK) >> ICH_VMCR_CTLR_SHIFT;
+       vmcrp->abpr = (vmcr & ICH_VMCR_BPR1_MASK) >> ICH_VMCR_BPR1_SHIFT;
+       vmcrp->bpr  = (vmcr & ICH_VMCR_BPR0_MASK) >> ICH_VMCR_BPR0_SHIFT;
+       vmcrp->pmr  = (vmcr & ICH_VMCR_PMR_MASK) >> ICH_VMCR_PMR_SHIFT;
+}
+
+static void vgic_v3_enable_underflow(struct kvm_vcpu *vcpu)
+{
+       vcpu->arch.vgic_cpu.vgic_v3.vgic_hcr |= ICH_HCR_UIE;
+}
+
+static void vgic_v3_disable_underflow(struct kvm_vcpu *vcpu)
+{
+       vcpu->arch.vgic_cpu.vgic_v3.vgic_hcr &= ~ICH_HCR_UIE;
+}
+
+static void vgic_v3_set_vmcr(struct kvm_vcpu *vcpu, struct vgic_vmcr *vmcrp)
+{
+       u32 vmcr;
+
+       vmcr  = (vmcrp->ctlr << ICH_VMCR_CTLR_SHIFT) & ICH_VMCR_CTLR_MASK;
+       vmcr |= (vmcrp->abpr << ICH_VMCR_BPR1_SHIFT) & ICH_VMCR_BPR1_MASK;
+       vmcr |= (vmcrp->bpr << ICH_VMCR_BPR0_SHIFT) & ICH_VMCR_BPR0_MASK;
+       vmcr |= (vmcrp->pmr << ICH_VMCR_PMR_SHIFT) & ICH_VMCR_PMR_MASK;
+
+       vcpu->arch.vgic_cpu.vgic_v3.vgic_vmcr = vmcr;
+}
+
+static void vgic_v3_enable(struct kvm_vcpu *vcpu)
+{
+       /*
+        * By forcing VMCR to zero, the GIC will restore the binary
+        * points to their reset values. Anything else resets to zero
+        * anyway.
+        */
+       vcpu->arch.vgic_cpu.vgic_v3.vgic_vmcr = 0;
+
+       /* Get the show on the road... */
+       vcpu->arch.vgic_cpu.vgic_v3.vgic_hcr = ICH_HCR_EN;
+}
+
+static const struct vgic_ops vgic_v3_ops = {
+       .get_lr                 = vgic_v3_get_lr,
+       .set_lr                 = vgic_v3_set_lr,
+       .sync_lr_elrsr          = vgic_v3_sync_lr_elrsr,
+       .get_elrsr              = vgic_v3_get_elrsr,
+       .get_eisr               = vgic_v3_get_eisr,
+       .get_interrupt_status   = vgic_v3_get_interrupt_status,
+       .enable_underflow       = vgic_v3_enable_underflow,
+       .disable_underflow      = vgic_v3_disable_underflow,
+       .get_vmcr               = vgic_v3_get_vmcr,
+       .set_vmcr               = vgic_v3_set_vmcr,
+       .enable                 = vgic_v3_enable,
+};
+
+static struct vgic_params vgic_v3_params;
+
+/**
+ * vgic_v3_probe - probe for a GICv3 compatible interrupt controller in DT
+ * @node:      pointer to the DT node
+ * @ops:       address of a pointer to the GICv3 operations
+ * @params:    address of a pointer to HW-specific parameters
+ *
+ * Returns 0 if a GICv3 has been found, with the low level operations
+ * in *ops and the HW parameters in *params. Returns an error code
+ * otherwise.
+ */
+int vgic_v3_probe(struct device_node *vgic_node,
+                 const struct vgic_ops **ops,
+                 const struct vgic_params **params)
+{
+       int ret = 0;
+       u32 gicv_idx;
+       struct resource vcpu_res;
+       struct vgic_params *vgic = &vgic_v3_params;
+
+       vgic->maint_irq = irq_of_parse_and_map(vgic_node, 0);
+       if (!vgic->maint_irq) {
+               kvm_err("error getting vgic maintenance irq from DT\n");
+               ret = -ENXIO;
+               goto out;
+       }
+
+       ich_vtr_el2 = kvm_call_hyp(__vgic_v3_get_ich_vtr_el2);
+
+       /*
+        * The ListRegs field is 5 bits, but there is a architectural
+        * maximum of 16 list registers. Just ignore bit 4...
+        */
+       vgic->nr_lr = (ich_vtr_el2 & 0xf) + 1;
+
+       if (of_property_read_u32(vgic_node, "#redistributor-regions", &gicv_idx))
+               gicv_idx = 1;
+
+       gicv_idx += 3; /* Also skip GICD, GICC, GICH */
+       if (of_address_to_resource(vgic_node, gicv_idx, &vcpu_res)) {
+               kvm_err("Cannot obtain GICV region\n");
+               ret = -ENXIO;
+               goto out;
+       }
+
+       if (!PAGE_ALIGNED(vcpu_res.start)) {
+               kvm_err("GICV physical address 0x%llx not page aligned\n",
+                       (unsigned long long)vcpu_res.start);
+               ret = -ENXIO;
+               goto out;
+       }
+
+       if (!PAGE_ALIGNED(resource_size(&vcpu_res))) {
+               kvm_err("GICV size 0x%llx not a multiple of page size 0x%lx\n",
+                       (unsigned long long)resource_size(&vcpu_res),
+                       PAGE_SIZE);
+               ret = -ENXIO;
+               goto out;
+       }
+
+       vgic->vcpu_base = vcpu_res.start;
+       vgic->vctrl_base = NULL;
+       vgic->type = VGIC_V3;
+
+       kvm_info("%s@%llx IRQ%d\n", vgic_node->name,
+                vcpu_res.start, vgic->maint_irq);
+
+       *ops = &vgic_v3_ops;
+       *params = vgic;
+
+out:
+       of_node_put(vgic_node);
+       return ret;
+}
index 476d3bf540a85e2fa1bb68b19d98fbb77b3da6d0..73eba793b17f5b5f7dfcda31edb9d890b641a070 100644 (file)
 #define IMPLEMENTER_ARM                0x43b
 #define GICC_ARCH_VERSION_V2   0x2
 
-/* Physical address of vgic virtual cpu interface */
-static phys_addr_t vgic_vcpu_base;
-
-/* Virtual control interface base address */
-static void __iomem *vgic_vctrl_base;
-
-static struct device_node *vgic_node;
-
 #define ACCESS_READ_VALUE      (1 << 0)
 #define ACCESS_READ_RAZ                (0 << 0)
 #define ACCESS_READ_MASK(x)    ((x) & (1 << 0))
@@ -94,21 +86,46 @@ static struct device_node *vgic_node;
 #define ACCESS_WRITE_MASK(x)   ((x) & (3 << 1))
 
 static void vgic_retire_disabled_irqs(struct kvm_vcpu *vcpu);
+static void vgic_retire_lr(int lr_nr, int irq, struct kvm_vcpu *vcpu);
 static void vgic_update_state(struct kvm *kvm);
 static void vgic_kick_vcpus(struct kvm *kvm);
 static void vgic_dispatch_sgi(struct kvm_vcpu *vcpu, u32 reg);
-static u32 vgic_nr_lr;
+static struct vgic_lr vgic_get_lr(const struct kvm_vcpu *vcpu, int lr);
+static void vgic_set_lr(struct kvm_vcpu *vcpu, int lr, struct vgic_lr lr_desc);
+static void vgic_get_vmcr(struct kvm_vcpu *vcpu, struct vgic_vmcr *vmcr);
+static void vgic_set_vmcr(struct kvm_vcpu *vcpu, struct vgic_vmcr *vmcr);
 
-static unsigned int vgic_maint_irq;
+static const struct vgic_ops *vgic_ops;
+static const struct vgic_params *vgic;
+
+/*
+ * struct vgic_bitmap contains unions that provide two views of
+ * the same data. In one case it is an array of registers of
+ * u32's, and in the other case it is a bitmap of unsigned
+ * longs.
+ *
+ * This does not work on 64-bit BE systems, because the bitmap access
+ * will store two consecutive 32-bit words with the higher-addressed
+ * register's bits at the lower index and the lower-addressed register's
+ * bits at the higher index.
+ *
+ * Therefore, swizzle the register index when accessing the 32-bit word
+ * registers to access the right register's value.
+ */
+#if defined(CONFIG_CPU_BIG_ENDIAN) && BITS_PER_LONG == 64
+#define REG_OFFSET_SWIZZLE     1
+#else
+#define REG_OFFSET_SWIZZLE     0
+#endif
 
 static u32 *vgic_bitmap_get_reg(struct vgic_bitmap *x,
                                int cpuid, u32 offset)
 {
        offset >>= 2;
        if (!offset)
-               return x->percpu[cpuid].reg;
+               return x->percpu[cpuid].reg + (offset ^ REG_OFFSET_SWIZZLE);
        else
-               return x->shared.reg + offset - 1;
+               return x->shared.reg + ((offset - 1) ^ REG_OFFSET_SWIZZLE);
 }
 
 static int vgic_bitmap_get_irq_val(struct vgic_bitmap *x,
@@ -241,12 +258,12 @@ static void vgic_cpu_irq_clear(struct kvm_vcpu *vcpu, int irq)
 
 static u32 mmio_data_read(struct kvm_exit_mmio *mmio, u32 mask)
 {
-       return *((u32 *)mmio->data) & mask;
+       return le32_to_cpu(*((u32 *)mmio->data)) & mask;
 }
 
 static void mmio_data_write(struct kvm_exit_mmio *mmio, u32 mask, u32 value)
 {
-       *((u32 *)mmio->data) = value & mask;
+       *((u32 *)mmio->data) = cpu_to_le32(value) & mask;
 }
 
 /**
@@ -593,18 +610,6 @@ static bool handle_mmio_sgi_reg(struct kvm_vcpu *vcpu,
        return false;
 }
 
-#define LR_CPUID(lr)   \
-       (((lr) & GICH_LR_PHYSID_CPUID) >> GICH_LR_PHYSID_CPUID_SHIFT)
-#define LR_IRQID(lr)   \
-       ((lr) & GICH_LR_VIRTUALID)
-
-static void vgic_retire_lr(int lr_nr, int irq, struct vgic_cpu *vgic_cpu)
-{
-       clear_bit(lr_nr, vgic_cpu->lr_used);
-       vgic_cpu->vgic_lr[lr_nr] &= ~GICH_LR_STATE;
-       vgic_cpu->vgic_irq_lr_map[irq] = LR_EMPTY;
-}
-
 /**
  * vgic_unqueue_irqs - move pending IRQs from LRs to the distributor
  * @vgic_cpu: Pointer to the vgic_cpu struct holding the LRs
@@ -622,13 +627,10 @@ static void vgic_unqueue_irqs(struct kvm_vcpu *vcpu)
        struct vgic_dist *dist = &vcpu->kvm->arch.vgic;
        struct vgic_cpu *vgic_cpu = &vcpu->arch.vgic_cpu;
        int vcpu_id = vcpu->vcpu_id;
-       int i, irq, source_cpu;
-       u32 *lr;
+       int i;
 
        for_each_set_bit(i, vgic_cpu->lr_used, vgic_cpu->nr_lr) {
-               lr = &vgic_cpu->vgic_lr[i];
-               irq = LR_IRQID(*lr);
-               source_cpu = LR_CPUID(*lr);
+               struct vgic_lr lr = vgic_get_lr(vcpu, i);
 
                /*
                 * There are three options for the state bits:
@@ -640,7 +642,7 @@ static void vgic_unqueue_irqs(struct kvm_vcpu *vcpu)
                 * If the LR holds only an active interrupt (not pending) then
                 * just leave it alone.
                 */
-               if ((*lr & GICH_LR_STATE) == GICH_LR_ACTIVE_BIT)
+               if ((lr.state & LR_STATE_MASK) == LR_STATE_ACTIVE)
                        continue;
 
                /*
@@ -649,18 +651,19 @@ static void vgic_unqueue_irqs(struct kvm_vcpu *vcpu)
                 * is fine, then we are only setting a few bits that were
                 * already set.
                 */
-               vgic_dist_irq_set(vcpu, irq);
-               if (irq < VGIC_NR_SGIS)
-                       dist->irq_sgi_sources[vcpu_id][irq] |= 1 << source_cpu;
-               *lr &= ~GICH_LR_PENDING_BIT;
+               vgic_dist_irq_set(vcpu, lr.irq);
+               if (lr.irq < VGIC_NR_SGIS)
+                       dist->irq_sgi_sources[vcpu_id][lr.irq] |= 1 << lr.source;
+               lr.state &= ~LR_STATE_PENDING;
+               vgic_set_lr(vcpu, i, lr);
 
                /*
                 * If there's no state left on the LR (it could still be
                 * active), then the LR does not hold any useful info and can
                 * be marked as free for other use.
                 */
-               if (!(*lr & GICH_LR_STATE))
-                       vgic_retire_lr(i, irq, vgic_cpu);
+               if (!(lr.state & LR_STATE_MASK))
+                       vgic_retire_lr(i, lr.irq, vcpu);
 
                /* Finally update the VGIC state. */
                vgic_update_state(vcpu->kvm);
@@ -989,8 +992,73 @@ static void vgic_update_state(struct kvm *kvm)
        }
 }
 
-#define MK_LR_PEND(src, irq)   \
-       (GICH_LR_PENDING_BIT | ((src) << GICH_LR_PHYSID_CPUID_SHIFT) | (irq))
+static struct vgic_lr vgic_get_lr(const struct kvm_vcpu *vcpu, int lr)
+{
+       return vgic_ops->get_lr(vcpu, lr);
+}
+
+static void vgic_set_lr(struct kvm_vcpu *vcpu, int lr,
+                              struct vgic_lr vlr)
+{
+       vgic_ops->set_lr(vcpu, lr, vlr);
+}
+
+static void vgic_sync_lr_elrsr(struct kvm_vcpu *vcpu, int lr,
+                              struct vgic_lr vlr)
+{
+       vgic_ops->sync_lr_elrsr(vcpu, lr, vlr);
+}
+
+static inline u64 vgic_get_elrsr(struct kvm_vcpu *vcpu)
+{
+       return vgic_ops->get_elrsr(vcpu);
+}
+
+static inline u64 vgic_get_eisr(struct kvm_vcpu *vcpu)
+{
+       return vgic_ops->get_eisr(vcpu);
+}
+
+static inline u32 vgic_get_interrupt_status(struct kvm_vcpu *vcpu)
+{
+       return vgic_ops->get_interrupt_status(vcpu);
+}
+
+static inline void vgic_enable_underflow(struct kvm_vcpu *vcpu)
+{
+       vgic_ops->enable_underflow(vcpu);
+}
+
+static inline void vgic_disable_underflow(struct kvm_vcpu *vcpu)
+{
+       vgic_ops->disable_underflow(vcpu);
+}
+
+static inline void vgic_get_vmcr(struct kvm_vcpu *vcpu, struct vgic_vmcr *vmcr)
+{
+       vgic_ops->get_vmcr(vcpu, vmcr);
+}
+
+static void vgic_set_vmcr(struct kvm_vcpu *vcpu, struct vgic_vmcr *vmcr)
+{
+       vgic_ops->set_vmcr(vcpu, vmcr);
+}
+
+static inline void vgic_enable(struct kvm_vcpu *vcpu)
+{
+       vgic_ops->enable(vcpu);
+}
+
+static void vgic_retire_lr(int lr_nr, int irq, struct kvm_vcpu *vcpu)
+{
+       struct vgic_cpu *vgic_cpu = &vcpu->arch.vgic_cpu;
+       struct vgic_lr vlr = vgic_get_lr(vcpu, lr_nr);
+
+       vlr.state = 0;
+       vgic_set_lr(vcpu, lr_nr, vlr);
+       clear_bit(lr_nr, vgic_cpu->lr_used);
+       vgic_cpu->vgic_irq_lr_map[irq] = LR_EMPTY;
+}
 
 /*
  * An interrupt may have been disabled after being made pending on the
@@ -1006,13 +1074,13 @@ static void vgic_retire_disabled_irqs(struct kvm_vcpu *vcpu)
        struct vgic_cpu *vgic_cpu = &vcpu->arch.vgic_cpu;
        int lr;
 
-       for_each_set_bit(lr, vgic_cpu->lr_used, vgic_cpu->nr_lr) {
-               int irq = vgic_cpu->vgic_lr[lr] & GICH_LR_VIRTUALID;
+       for_each_set_bit(lr, vgic_cpu->lr_used, vgic->nr_lr) {
+               struct vgic_lr vlr = vgic_get_lr(vcpu, lr);
 
-               if (!vgic_irq_is_enabled(vcpu, irq)) {
-                       vgic_retire_lr(lr, irq, vgic_cpu);
-                       if (vgic_irq_is_active(vcpu, irq))
-                               vgic_irq_clear_active(vcpu, irq);
+               if (!vgic_irq_is_enabled(vcpu, vlr.irq)) {
+                       vgic_retire_lr(lr, vlr.irq, vcpu);
+                       if (vgic_irq_is_active(vcpu, vlr.irq))
+                               vgic_irq_clear_active(vcpu, vlr.irq);
                }
        }
 }
@@ -1024,6 +1092,7 @@ static void vgic_retire_disabled_irqs(struct kvm_vcpu *vcpu)
 static bool vgic_queue_irq(struct kvm_vcpu *vcpu, u8 sgi_source_id, int irq)
 {
        struct vgic_cpu *vgic_cpu = &vcpu->arch.vgic_cpu;
+       struct vgic_lr vlr;
        int lr;
 
        /* Sanitize the input... */
@@ -1036,28 +1105,34 @@ static bool vgic_queue_irq(struct kvm_vcpu *vcpu, u8 sgi_source_id, int irq)
        lr = vgic_cpu->vgic_irq_lr_map[irq];
 
        /* Do we have an active interrupt for the same CPUID? */
-       if (lr != LR_EMPTY &&
-           (LR_CPUID(vgic_cpu->vgic_lr[lr]) == sgi_source_id)) {
-               kvm_debug("LR%d piggyback for IRQ%d %x\n",
-                         lr, irq, vgic_cpu->vgic_lr[lr]);
-               BUG_ON(!test_bit(lr, vgic_cpu->lr_used));
-               vgic_cpu->vgic_lr[lr] |= GICH_LR_PENDING_BIT;
-               return true;
+       if (lr != LR_EMPTY) {
+               vlr = vgic_get_lr(vcpu, lr);
+               if (vlr.source == sgi_source_id) {
+                       kvm_debug("LR%d piggyback for IRQ%d\n", lr, vlr.irq);
+                       BUG_ON(!test_bit(lr, vgic_cpu->lr_used));
+                       vlr.state |= LR_STATE_PENDING;
+                       vgic_set_lr(vcpu, lr, vlr);
+                       return true;
+               }
        }
 
        /* Try to use another LR for this interrupt */
        lr = find_first_zero_bit((unsigned long *)vgic_cpu->lr_used,
-                              vgic_cpu->nr_lr);
-       if (lr >= vgic_cpu->nr_lr)
+                              vgic->nr_lr);
+       if (lr >= vgic->nr_lr)
                return false;
 
        kvm_debug("LR%d allocated for IRQ%d %x\n", lr, irq, sgi_source_id);
-       vgic_cpu->vgic_lr[lr] = MK_LR_PEND(sgi_source_id, irq);
        vgic_cpu->vgic_irq_lr_map[irq] = lr;
        set_bit(lr, vgic_cpu->lr_used);
 
+       vlr.irq = irq;
+       vlr.source = sgi_source_id;
+       vlr.state = LR_STATE_PENDING;
        if (!vgic_irq_is_edge(vcpu, irq))
-               vgic_cpu->vgic_lr[lr] |= GICH_LR_EOI;
+               vlr.state |= LR_EOI_INT;
+
+       vgic_set_lr(vcpu, lr, vlr);
 
        return true;
 }
@@ -1155,9 +1230,9 @@ static void __kvm_vgic_flush_hwstate(struct kvm_vcpu *vcpu)
 
 epilog:
        if (overflow) {
-               vgic_cpu->vgic_hcr |= GICH_HCR_UIE;
+               vgic_enable_underflow(vcpu);
        } else {
-               vgic_cpu->vgic_hcr &= ~GICH_HCR_UIE;
+               vgic_disable_underflow(vcpu);
                /*
                 * We're about to run this VCPU, and we've consumed
                 * everything the distributor had in store for
@@ -1170,44 +1245,46 @@ epilog:
 
 static bool vgic_process_maintenance(struct kvm_vcpu *vcpu)
 {
-       struct vgic_cpu *vgic_cpu = &vcpu->arch.vgic_cpu;
+       u32 status = vgic_get_interrupt_status(vcpu);
        bool level_pending = false;
 
-       kvm_debug("MISR = %08x\n", vgic_cpu->vgic_misr);
+       kvm_debug("STATUS = %08x\n", status);
 
-       if (vgic_cpu->vgic_misr & GICH_MISR_EOI) {
+       if (status & INT_STATUS_EOI) {
                /*
                 * Some level interrupts have been EOIed. Clear their
                 * active bit.
                 */
-               int lr, irq;
+               u64 eisr = vgic_get_eisr(vcpu);
+               unsigned long *eisr_ptr = (unsigned long *)&eisr;
+               int lr;
 
-               for_each_set_bit(lr, (unsigned long *)vgic_cpu->vgic_eisr,
-                                vgic_cpu->nr_lr) {
-                       irq = vgic_cpu->vgic_lr[lr] & GICH_LR_VIRTUALID;
+               for_each_set_bit(lr, eisr_ptr, vgic->nr_lr) {
+                       struct vgic_lr vlr = vgic_get_lr(vcpu, lr);
 
-                       vgic_irq_clear_active(vcpu, irq);
-                       vgic_cpu->vgic_lr[lr] &= ~GICH_LR_EOI;
+                       vgic_irq_clear_active(vcpu, vlr.irq);
+                       WARN_ON(vlr.state & LR_STATE_MASK);
+                       vlr.state = 0;
+                       vgic_set_lr(vcpu, lr, vlr);
 
                        /* Any additional pending interrupt? */
-                       if (vgic_dist_irq_is_pending(vcpu, irq)) {
-                               vgic_cpu_irq_set(vcpu, irq);
+                       if (vgic_dist_irq_is_pending(vcpu, vlr.irq)) {
+                               vgic_cpu_irq_set(vcpu, vlr.irq);
                                level_pending = true;
                        } else {
-                               vgic_cpu_irq_clear(vcpu, irq);
+                               vgic_cpu_irq_clear(vcpu, vlr.irq);
                        }
 
                        /*
                         * Despite being EOIed, the LR may not have
                         * been marked as empty.
                         */
-                       set_bit(lr, (unsigned long *)vgic_cpu->vgic_elrsr);
-                       vgic_cpu->vgic_lr[lr] &= ~GICH_LR_ACTIVE_BIT;
+                       vgic_sync_lr_elrsr(vcpu, lr, vlr);
                }
        }
 
-       if (vgic_cpu->vgic_misr & GICH_MISR_U)
-               vgic_cpu->vgic_hcr &= ~GICH_HCR_UIE;
+       if (status & INT_STATUS_UNDERFLOW)
+               vgic_disable_underflow(vcpu);
 
        return level_pending;
 }
@@ -1220,29 +1297,31 @@ static void __kvm_vgic_sync_hwstate(struct kvm_vcpu *vcpu)
 {
        struct vgic_cpu *vgic_cpu = &vcpu->arch.vgic_cpu;
        struct vgic_dist *dist = &vcpu->kvm->arch.vgic;
+       u64 elrsr;
+       unsigned long *elrsr_ptr;
        int lr, pending;
        bool level_pending;
 
        level_pending = vgic_process_maintenance(vcpu);
+       elrsr = vgic_get_elrsr(vcpu);
+       elrsr_ptr = (unsigned long *)&elrsr;
 
        /* Clear mappings for empty LRs */
-       for_each_set_bit(lr, (unsigned long *)vgic_cpu->vgic_elrsr,
-                        vgic_cpu->nr_lr) {
-               int irq;
+       for_each_set_bit(lr, elrsr_ptr, vgic->nr_lr) {
+               struct vgic_lr vlr;
 
                if (!test_and_clear_bit(lr, vgic_cpu->lr_used))
                        continue;
 
-               irq = vgic_cpu->vgic_lr[lr] & GICH_LR_VIRTUALID;
+               vlr = vgic_get_lr(vcpu, lr);
 
-               BUG_ON(irq >= VGIC_NR_IRQS);
-               vgic_cpu->vgic_irq_lr_map[irq] = LR_EMPTY;
+               BUG_ON(vlr.irq >= VGIC_NR_IRQS);
+               vgic_cpu->vgic_irq_lr_map[vlr.irq] = LR_EMPTY;
        }
 
        /* Check if we still have something up our sleeve... */
-       pending = find_first_zero_bit((unsigned long *)vgic_cpu->vgic_elrsr,
-                                     vgic_cpu->nr_lr);
-       if (level_pending || pending < vgic_cpu->nr_lr)
+       pending = find_first_zero_bit(elrsr_ptr, vgic->nr_lr);
+       if (level_pending || pending < vgic->nr_lr)
                set_bit(vcpu->vcpu_id, &dist->irq_pending_on_cpu);
 }
 
@@ -1432,21 +1511,20 @@ int kvm_vgic_vcpu_init(struct kvm_vcpu *vcpu)
        }
 
        /*
-        * By forcing VMCR to zero, the GIC will restore the binary
-        * points to their reset values. Anything else resets to zero
-        * anyway.
+        * Store the number of LRs per vcpu, so we don't have to go
+        * all the way to the distributor structure to find out. Only
+        * assembly code should use this one.
         */
-       vgic_cpu->vgic_vmcr = 0;
+       vgic_cpu->nr_lr = vgic->nr_lr;
 
-       vgic_cpu->nr_lr = vgic_nr_lr;
-       vgic_cpu->vgic_hcr = GICH_HCR_EN; /* Get the show on the road... */
+       vgic_enable(vcpu);
 
        return 0;
 }
 
 static void vgic_init_maintenance_interrupt(void *info)
 {
-       enable_percpu_irq(vgic_maint_irq, 0);
+       enable_percpu_irq(vgic->maint_irq, 0);
 }
 
 static int vgic_cpu_notify(struct notifier_block *self,
@@ -1459,7 +1537,7 @@ static int vgic_cpu_notify(struct notifier_block *self,
                break;
        case CPU_DYING:
        case CPU_DYING_FROZEN:
-               disable_percpu_irq(vgic_maint_irq);
+               disable_percpu_irq(vgic->maint_irq);
                break;
        }
 
@@ -1470,30 +1548,37 @@ static struct notifier_block vgic_cpu_nb = {
        .notifier_call = vgic_cpu_notify,
 };
 
+static const struct of_device_id vgic_ids[] = {
+       { .compatible = "arm,cortex-a15-gic", .data = vgic_v2_probe, },
+       { .compatible = "arm,gic-v3", .data = vgic_v3_probe, },
+       {},
+};
+
 int kvm_vgic_hyp_init(void)
 {
+       const struct of_device_id *matched_id;
+       int (*vgic_probe)(struct device_node *,const struct vgic_ops **,
+                         const struct vgic_params **);
+       struct device_node *vgic_node;
        int ret;
-       struct resource vctrl_res;
-       struct resource vcpu_res;
 
-       vgic_node = of_find_compatible_node(NULL, NULL, "arm,cortex-a15-gic");
+       vgic_node = of_find_matching_node_and_match(NULL,
+                                                   vgic_ids, &matched_id);
        if (!vgic_node) {
-               kvm_err("error: no compatible vgic node in DT\n");
+               kvm_err("error: no compatible GIC node found\n");
                return -ENODEV;
        }
 
-       vgic_maint_irq = irq_of_parse_and_map(vgic_node, 0);
-       if (!vgic_maint_irq) {
-               kvm_err("error getting vgic maintenance irq from DT\n");
-               ret = -ENXIO;
-               goto out;
-       }
+       vgic_probe = matched_id->data;
+       ret = vgic_probe(vgic_node, &vgic_ops, &vgic);
+       if (ret)
+               return ret;
 
-       ret = request_percpu_irq(vgic_maint_irq, vgic_maintenance_handler,
+       ret = request_percpu_irq(vgic->maint_irq, vgic_maintenance_handler,
                                 "vgic", kvm_get_running_vcpus());
        if (ret) {
-               kvm_err("Cannot register interrupt %d\n", vgic_maint_irq);
-               goto out;
+               kvm_err("Cannot register interrupt %d\n", vgic->maint_irq);
+               return ret;
        }
 
        ret = __register_cpu_notifier(&vgic_cpu_nb);
@@ -1502,65 +1587,15 @@ int kvm_vgic_hyp_init(void)
                goto out_free_irq;
        }
 
-       ret = of_address_to_resource(vgic_node, 2, &vctrl_res);
-       if (ret) {
-               kvm_err("Cannot obtain VCTRL resource\n");
-               goto out_free_irq;
-       }
+       /* Callback into for arch code for setup */
+       vgic_arch_setup(vgic);
 
-       vgic_vctrl_base = of_iomap(vgic_node, 2);
-       if (!vgic_vctrl_base) {
-               kvm_err("Cannot ioremap VCTRL\n");
-               ret = -ENOMEM;
-               goto out_free_irq;
-       }
-
-       vgic_nr_lr = readl_relaxed(vgic_vctrl_base + GICH_VTR);
-       vgic_nr_lr = (vgic_nr_lr & 0x3f) + 1;
-
-       ret = create_hyp_io_mappings(vgic_vctrl_base,
-                                    vgic_vctrl_base + resource_size(&vctrl_res),
-                                    vctrl_res.start);
-       if (ret) {
-               kvm_err("Cannot map VCTRL into hyp\n");
-               goto out_unmap;
-       }
-
-       if (of_address_to_resource(vgic_node, 3, &vcpu_res)) {
-               kvm_err("Cannot obtain VCPU resource\n");
-               ret = -ENXIO;
-               goto out_unmap;
-       }
-
-       if (!PAGE_ALIGNED(vcpu_res.start)) {
-               kvm_err("GICV physical address 0x%llx not page aligned\n",
-                       (unsigned long long)vcpu_res.start);
-               ret = -ENXIO;
-               goto out_unmap;
-       }
-
-       if (!PAGE_ALIGNED(resource_size(&vcpu_res))) {
-               kvm_err("GICV size 0x%llx not a multiple of page size 0x%lx\n",
-                       (unsigned long long)resource_size(&vcpu_res),
-                       PAGE_SIZE);
-               ret = -ENXIO;
-               goto out_unmap;
-       }
-
-       vgic_vcpu_base = vcpu_res.start;
-
-       kvm_info("%s@%llx IRQ%d\n", vgic_node->name,
-                vctrl_res.start, vgic_maint_irq);
        on_each_cpu(vgic_init_maintenance_interrupt, NULL, 1);
 
-       goto out;
+       return 0;
 
-out_unmap:
-       iounmap(vgic_vctrl_base);
 out_free_irq:
-       free_percpu_irq(vgic_maint_irq, kvm_get_running_vcpus());
-out:
-       of_node_put(vgic_node);
+       free_percpu_irq(vgic->maint_irq, kvm_get_running_vcpus());
        return ret;
 }
 
@@ -1593,7 +1628,7 @@ int kvm_vgic_init(struct kvm *kvm)
        }
 
        ret = kvm_phys_addr_ioremap(kvm, kvm->arch.vgic.vgic_cpu_base,
-                                   vgic_vcpu_base, KVM_VGIC_V2_CPU_SIZE);
+                                   vgic->vcpu_base, KVM_VGIC_V2_CPU_SIZE);
        if (ret) {
                kvm_err("Unable to remap VGIC CPU to VCPU\n");
                goto out;
@@ -1639,7 +1674,8 @@ int kvm_vgic_create(struct kvm *kvm)
        }
 
        spin_lock_init(&kvm->arch.vgic.lock);
-       kvm->arch.vgic.vctrl_base = vgic_vctrl_base;
+       kvm->arch.vgic.in_kernel = true;
+       kvm->arch.vgic.vctrl_base = vgic->vctrl_base;
        kvm->arch.vgic.vgic_dist_base = VGIC_ADDR_UNDEF;
        kvm->arch.vgic.vgic_cpu_base = VGIC_ADDR_UNDEF;
 
@@ -1738,39 +1774,40 @@ int kvm_vgic_addr(struct kvm *kvm, unsigned long type, u64 *addr, bool write)
 static bool handle_cpu_mmio_misc(struct kvm_vcpu *vcpu,
                                 struct kvm_exit_mmio *mmio, phys_addr_t offset)
 {
-       struct vgic_cpu *vgic_cpu = &vcpu->arch.vgic_cpu;
-       u32 reg, mask = 0, shift = 0;
        bool updated = false;
+       struct vgic_vmcr vmcr;
+       u32 *vmcr_field;
+       u32 reg;
+
+       vgic_get_vmcr(vcpu, &vmcr);
 
        switch (offset & ~0x3) {
        case GIC_CPU_CTRL:
-               mask = GICH_VMCR_CTRL_MASK;
-               shift = GICH_VMCR_CTRL_SHIFT;
+               vmcr_field = &vmcr.ctlr;
                break;
        case GIC_CPU_PRIMASK:
-               mask = GICH_VMCR_PRIMASK_MASK;
-               shift = GICH_VMCR_PRIMASK_SHIFT;
+               vmcr_field = &vmcr.pmr;
                break;
        case GIC_CPU_BINPOINT:
-               mask = GICH_VMCR_BINPOINT_MASK;
-               shift = GICH_VMCR_BINPOINT_SHIFT;
+               vmcr_field = &vmcr.bpr;
                break;
        case GIC_CPU_ALIAS_BINPOINT:
-               mask = GICH_VMCR_ALIAS_BINPOINT_MASK;
-               shift = GICH_VMCR_ALIAS_BINPOINT_SHIFT;
+               vmcr_field = &vmcr.abpr;
                break;
+       default:
+               BUG();
        }
 
        if (!mmio->is_write) {
-               reg = (vgic_cpu->vgic_vmcr & mask) >> shift;
+               reg = *vmcr_field;
                mmio_data_write(mmio, ~0, reg);
        } else {
                reg = mmio_data_read(mmio, ~0);
-               reg = (reg << shift) & mask;
-               if (reg != (vgic_cpu->vgic_vmcr & mask))
+               if (reg != *vmcr_field) {
+                       *vmcr_field = reg;
+                       vgic_set_vmcr(vcpu, &vmcr);
                        updated = true;
-               vgic_cpu->vgic_vmcr &= ~mask;
-               vgic_cpu->vgic_vmcr |= reg;
+               }
        }
        return updated;
 }
index 20c3af7692c5d32d6de0c7a88a120a98b14d252e..3c5981c87c3f75ff1344296c451d6fcc48babd1c 100644 (file)
 #include <linux/kernel.h>
 #include <linux/srcu.h>
 #include <linux/slab.h>
+#include <linux/seqlock.h>
+#include <trace/events/kvm.h>
 
+#include "irq.h"
 #include "iodev.h"
 
-#ifdef CONFIG_HAVE_KVM_IRQ_ROUTING
+#ifdef CONFIG_HAVE_KVM_IRQFD
 /*
  * --------------------------------------------------------------------
  * irqfd: Allows an fd to be used to inject an interrupt to the guest
@@ -75,7 +78,8 @@ struct _irqfd {
        struct kvm *kvm;
        wait_queue_t wait;
        /* Update side is protected by irqfds.lock */
-       struct kvm_kernel_irq_routing_entry __rcu *irq_entry;
+       struct kvm_kernel_irq_routing_entry irq_entry;
+       seqcount_t irq_entry_sc;
        /* Used for level IRQ fast-path */
        int gsi;
        struct work_struct inject;
@@ -223,16 +227,20 @@ irqfd_wakeup(wait_queue_t *wait, unsigned mode, int sync, void *key)
 {
        struct _irqfd *irqfd = container_of(wait, struct _irqfd, wait);
        unsigned long flags = (unsigned long)key;
-       struct kvm_kernel_irq_routing_entry *irq;
+       struct kvm_kernel_irq_routing_entry irq;
        struct kvm *kvm = irqfd->kvm;
+       unsigned seq;
        int idx;
 
        if (flags & POLLIN) {
                idx = srcu_read_lock(&kvm->irq_srcu);
-               irq = srcu_dereference(irqfd->irq_entry, &kvm->irq_srcu);
+               do {
+                       seq = read_seqcount_begin(&irqfd->irq_entry_sc);
+                       irq = irqfd->irq_entry;
+               } while (read_seqcount_retry(&irqfd->irq_entry_sc, seq));
                /* An event has been signaled, inject an interrupt */
-               if (irq)
-                       kvm_set_msi(irq, kvm, KVM_USERSPACE_IRQ_SOURCE_ID, 1,
+               if (irq.type == KVM_IRQ_ROUTING_MSI)
+                       kvm_set_msi(&irq, kvm, KVM_USERSPACE_IRQ_SOURCE_ID, 1,
                                        false);
                else
                        schedule_work(&irqfd->inject);
@@ -272,34 +280,37 @@ irqfd_ptable_queue_proc(struct file *file, wait_queue_head_t *wqh,
 }
 
 /* Must be called under irqfds.lock */
-static void irqfd_update(struct kvm *kvm, struct _irqfd *irqfd,
-                        struct kvm_irq_routing_table *irq_rt)
+static void irqfd_update(struct kvm *kvm, struct _irqfd *irqfd)
 {
        struct kvm_kernel_irq_routing_entry *e;
+       struct kvm_kernel_irq_routing_entry entries[KVM_NR_IRQCHIPS];
+       int i, n_entries;
 
-       if (irqfd->gsi >= irq_rt->nr_rt_entries) {
-               rcu_assign_pointer(irqfd->irq_entry, NULL);
-               return;
-       }
+       n_entries = kvm_irq_map_gsi(kvm, entries, irqfd->gsi);
+
+       write_seqcount_begin(&irqfd->irq_entry_sc);
+
+       irqfd->irq_entry.type = 0;
 
-       hlist_for_each_entry(e, &irq_rt->map[irqfd->gsi], link) {
+       e = entries;
+       for (i = 0; i < n_entries; ++i, ++e) {
                /* Only fast-path MSI. */
                if (e->type == KVM_IRQ_ROUTING_MSI)
-                       rcu_assign_pointer(irqfd->irq_entry, e);
-               else
-                       rcu_assign_pointer(irqfd->irq_entry, NULL);
+                       irqfd->irq_entry = *e;
        }
+
+       write_seqcount_end(&irqfd->irq_entry_sc);
 }
 
 static int
 kvm_irqfd_assign(struct kvm *kvm, struct kvm_irqfd *args)
 {
-       struct kvm_irq_routing_table *irq_rt;
        struct _irqfd *irqfd, *tmp;
        struct fd f;
        struct eventfd_ctx *eventfd = NULL, *resamplefd = NULL;
        int ret;
        unsigned int events;
+       int idx;
 
        irqfd = kzalloc(sizeof(*irqfd), GFP_KERNEL);
        if (!irqfd)
@@ -310,6 +321,7 @@ kvm_irqfd_assign(struct kvm *kvm, struct kvm_irqfd *args)
        INIT_LIST_HEAD(&irqfd->list);
        INIT_WORK(&irqfd->inject, irqfd_inject);
        INIT_WORK(&irqfd->shutdown, irqfd_shutdown);
+       seqcount_init(&irqfd->irq_entry_sc);
 
        f = fdget(args->fd);
        if (!f.file) {
@@ -392,9 +404,9 @@ kvm_irqfd_assign(struct kvm *kvm, struct kvm_irqfd *args)
                goto fail;
        }
 
-       irq_rt = rcu_dereference_protected(kvm->irq_routing,
-                                          lockdep_is_held(&kvm->irqfds.lock));
-       irqfd_update(kvm, irqfd, irq_rt);
+       idx = srcu_read_lock(&kvm->irq_srcu);
+       irqfd_update(kvm, irqfd);
+       srcu_read_unlock(&kvm->irq_srcu, idx);
 
        list_add_tail(&irqfd->list, &kvm->irqfds.items);
 
@@ -433,12 +445,73 @@ out:
        kfree(irqfd);
        return ret;
 }
+
+bool kvm_irq_has_notifier(struct kvm *kvm, unsigned irqchip, unsigned pin)
+{
+       struct kvm_irq_ack_notifier *kian;
+       int gsi, idx;
+
+       idx = srcu_read_lock(&kvm->irq_srcu);
+       gsi = kvm_irq_map_chip_pin(kvm, irqchip, pin);
+       if (gsi != -1)
+               hlist_for_each_entry_rcu(kian, &kvm->irq_ack_notifier_list,
+                                        link)
+                       if (kian->gsi == gsi) {
+                               srcu_read_unlock(&kvm->irq_srcu, idx);
+                               return true;
+                       }
+
+       srcu_read_unlock(&kvm->irq_srcu, idx);
+
+       return false;
+}
+EXPORT_SYMBOL_GPL(kvm_irq_has_notifier);
+
+void kvm_notify_acked_irq(struct kvm *kvm, unsigned irqchip, unsigned pin)
+{
+       struct kvm_irq_ack_notifier *kian;
+       int gsi, idx;
+
+       trace_kvm_ack_irq(irqchip, pin);
+
+       idx = srcu_read_lock(&kvm->irq_srcu);
+       gsi = kvm_irq_map_chip_pin(kvm, irqchip, pin);
+       if (gsi != -1)
+               hlist_for_each_entry_rcu(kian, &kvm->irq_ack_notifier_list,
+                                        link)
+                       if (kian->gsi == gsi)
+                               kian->irq_acked(kian);
+       srcu_read_unlock(&kvm->irq_srcu, idx);
+}
+
+void kvm_register_irq_ack_notifier(struct kvm *kvm,
+                                  struct kvm_irq_ack_notifier *kian)
+{
+       mutex_lock(&kvm->irq_lock);
+       hlist_add_head_rcu(&kian->link, &kvm->irq_ack_notifier_list);
+       mutex_unlock(&kvm->irq_lock);
+#ifdef __KVM_HAVE_IOAPIC
+       kvm_vcpu_request_scan_ioapic(kvm);
+#endif
+}
+
+void kvm_unregister_irq_ack_notifier(struct kvm *kvm,
+                                   struct kvm_irq_ack_notifier *kian)
+{
+       mutex_lock(&kvm->irq_lock);
+       hlist_del_init_rcu(&kian->link);
+       mutex_unlock(&kvm->irq_lock);
+       synchronize_srcu(&kvm->irq_srcu);
+#ifdef __KVM_HAVE_IOAPIC
+       kvm_vcpu_request_scan_ioapic(kvm);
+#endif
+}
 #endif
 
 void
 kvm_eventfd_init(struct kvm *kvm)
 {
-#ifdef CONFIG_HAVE_KVM_IRQ_ROUTING
+#ifdef CONFIG_HAVE_KVM_IRQFD
        spin_lock_init(&kvm->irqfds.lock);
        INIT_LIST_HEAD(&kvm->irqfds.items);
        INIT_LIST_HEAD(&kvm->irqfds.resampler_list);
@@ -447,7 +520,7 @@ kvm_eventfd_init(struct kvm *kvm)
        INIT_LIST_HEAD(&kvm->ioeventfds);
 }
 
-#ifdef CONFIG_HAVE_KVM_IRQ_ROUTING
+#ifdef CONFIG_HAVE_KVM_IRQFD
 /*
  * shutdown any irqfd's that match fd+gsi
  */
@@ -466,14 +539,14 @@ kvm_irqfd_deassign(struct kvm *kvm, struct kvm_irqfd *args)
        list_for_each_entry_safe(irqfd, tmp, &kvm->irqfds.items, list) {
                if (irqfd->eventfd == eventfd && irqfd->gsi == args->gsi) {
                        /*
-                        * This rcu_assign_pointer is needed for when
+                        * This clearing of irq_entry.type is needed for when
                         * another thread calls kvm_irq_routing_update before
                         * we flush workqueue below (we synchronize with
                         * kvm_irq_routing_update using irqfds.lock).
-                        * It is paired with synchronize_srcu done by caller
-                        * of that function.
                         */
-                       rcu_assign_pointer(irqfd->irq_entry, NULL);
+                       write_seqcount_begin(&irqfd->irq_entry_sc);
+                       irqfd->irq_entry.type = 0;
+                       write_seqcount_end(&irqfd->irq_entry_sc);
                        irqfd_deactivate(irqfd);
                }
        }
@@ -528,20 +601,17 @@ kvm_irqfd_release(struct kvm *kvm)
 }
 
 /*
- * Change irq_routing and irqfd.
+ * Take note of a change in irq routing.
  * Caller must invoke synchronize_srcu(&kvm->irq_srcu) afterwards.
  */
-void kvm_irq_routing_update(struct kvm *kvm,
-                           struct kvm_irq_routing_table *irq_rt)
+void kvm_irq_routing_update(struct kvm *kvm)
 {
        struct _irqfd *irqfd;
 
        spin_lock_irq(&kvm->irqfds.lock);
 
-       rcu_assign_pointer(kvm->irq_routing, irq_rt);
-
        list_for_each_entry(irqfd, &kvm->irqfds.items, list)
-               irqfd_update(kvm, irqfd, irq_rt);
+               irqfd_update(kvm, irqfd);
 
        spin_unlock_irq(&kvm->irqfds.lock);
 }
index a228ee82bad2681bb26f433054bc51c99c90caa5..963b8995a9e8a8035ad4df200afb20ca55d6fa1f 100644 (file)
@@ -160,9 +160,9 @@ static int kvm_set_msi_inatomic(struct kvm_kernel_irq_routing_entry *e,
  */
 int kvm_set_irq_inatomic(struct kvm *kvm, int irq_source_id, u32 irq, int level)
 {
+       struct kvm_kernel_irq_routing_entry entries[KVM_NR_IRQCHIPS];
        struct kvm_kernel_irq_routing_entry *e;
        int ret = -EINVAL;
-       struct kvm_irq_routing_table *irq_rt;
        int idx;
 
        trace_kvm_set_irq(irq, level, irq_source_id);
@@ -176,15 +176,13 @@ int kvm_set_irq_inatomic(struct kvm *kvm, int irq_source_id, u32 irq, int level)
         * which is limited to 1:1 GSI mapping.
         */
        idx = srcu_read_lock(&kvm->irq_srcu);
-       irq_rt = srcu_dereference(kvm->irq_routing, &kvm->irq_srcu);
-       if (irq < irq_rt->nr_rt_entries)
-               hlist_for_each_entry(e, &irq_rt->map[irq], link) {
-                       if (likely(e->type == KVM_IRQ_ROUTING_MSI))
-                               ret = kvm_set_msi_inatomic(e, kvm);
-                       else
-                               ret = -EWOULDBLOCK;
-                       break;
-               }
+       if (kvm_irq_map_gsi(kvm, entries, irq) > 0) {
+               e = &entries[0];
+               if (likely(e->type == KVM_IRQ_ROUTING_MSI))
+                       ret = kvm_set_msi_inatomic(e, kvm);
+               else
+                       ret = -EWOULDBLOCK;
+       }
        srcu_read_unlock(&kvm->irq_srcu, idx);
        return ret;
 }
@@ -264,7 +262,7 @@ void kvm_fire_mask_notifiers(struct kvm *kvm, unsigned irqchip, unsigned pin,
        int idx, gsi;
 
        idx = srcu_read_lock(&kvm->irq_srcu);
-       gsi = srcu_dereference(kvm->irq_routing, &kvm->irq_srcu)->chip[irqchip][pin];
+       gsi = kvm_irq_map_chip_pin(kvm, irqchip, pin);
        if (gsi != -1)
                hlist_for_each_entry_rcu(kimn, &kvm->mask_notifier_list, link)
                        if (kimn->irq == gsi)
@@ -272,8 +270,7 @@ void kvm_fire_mask_notifiers(struct kvm *kvm, unsigned irqchip, unsigned pin,
        srcu_read_unlock(&kvm->irq_srcu, idx);
 }
 
-int kvm_set_routing_entry(struct kvm_irq_routing_table *rt,
-                         struct kvm_kernel_irq_routing_entry *e,
+int kvm_set_routing_entry(struct kvm_kernel_irq_routing_entry *e,
                          const struct kvm_irq_routing_entry *ue)
 {
        int r = -EINVAL;
@@ -304,7 +301,6 @@ int kvm_set_routing_entry(struct kvm_irq_routing_table *rt,
                e->irqchip.pin = ue->u.irqchip.pin + delta;
                if (e->irqchip.pin >= max_pin)
                        goto out;
-               rt->chip[ue->u.irqchip.irqchip][e->irqchip.pin] = ue->gsi;
                break;
        case KVM_IRQ_ROUTING_MSI:
                e->set = kvm_set_msi;
index b43c275775cd5a1d9e5bbc7f842ceaa81f2a0c69..7f256f31df102e36da59a8ebed636f1c9615cb00 100644 (file)
 #include <trace/events/kvm.h>
 #include "irq.h"
 
-bool kvm_irq_has_notifier(struct kvm *kvm, unsigned irqchip, unsigned pin)
-{
-       struct kvm_irq_ack_notifier *kian;
-       int gsi, idx;
-
-       idx = srcu_read_lock(&kvm->irq_srcu);
-       gsi = srcu_dereference(kvm->irq_routing, &kvm->irq_srcu)->chip[irqchip][pin];
-       if (gsi != -1)
-               hlist_for_each_entry_rcu(kian, &kvm->irq_ack_notifier_list,
-                                        link)
-                       if (kian->gsi == gsi) {
-                               srcu_read_unlock(&kvm->irq_srcu, idx);
-                               return true;
-                       }
-
-       srcu_read_unlock(&kvm->irq_srcu, idx);
-
-       return false;
-}
-EXPORT_SYMBOL_GPL(kvm_irq_has_notifier);
+struct kvm_irq_routing_table {
+       int chip[KVM_NR_IRQCHIPS][KVM_IRQCHIP_NUM_PINS];
+       struct kvm_kernel_irq_routing_entry *rt_entries;
+       u32 nr_rt_entries;
+       /*
+        * Array indexed by gsi. Each entry contains list of irq chips
+        * the gsi is connected to.
+        */
+       struct hlist_head map[0];
+};
 
-void kvm_notify_acked_irq(struct kvm *kvm, unsigned irqchip, unsigned pin)
+int kvm_irq_map_gsi(struct kvm *kvm,
+                   struct kvm_kernel_irq_routing_entry *entries, int gsi)
 {
-       struct kvm_irq_ack_notifier *kian;
-       int gsi, idx;
-
-       trace_kvm_ack_irq(irqchip, pin);
+       struct kvm_irq_routing_table *irq_rt;
+       struct kvm_kernel_irq_routing_entry *e;
+       int n = 0;
+
+       irq_rt = srcu_dereference_check(kvm->irq_routing, &kvm->irq_srcu,
+                                       lockdep_is_held(&kvm->irq_lock));
+       if (gsi < irq_rt->nr_rt_entries) {
+               hlist_for_each_entry(e, &irq_rt->map[gsi], link) {
+                       entries[n] = *e;
+                       ++n;
+               }
+       }
 
-       idx = srcu_read_lock(&kvm->irq_srcu);
-       gsi = srcu_dereference(kvm->irq_routing, &kvm->irq_srcu)->chip[irqchip][pin];
-       if (gsi != -1)
-               hlist_for_each_entry_rcu(kian, &kvm->irq_ack_notifier_list,
-                                        link)
-                       if (kian->gsi == gsi)
-                               kian->irq_acked(kian);
-       srcu_read_unlock(&kvm->irq_srcu, idx);
+       return n;
 }
 
-void kvm_register_irq_ack_notifier(struct kvm *kvm,
-                                  struct kvm_irq_ack_notifier *kian)
+int kvm_irq_map_chip_pin(struct kvm *kvm, unsigned irqchip, unsigned pin)
 {
-       mutex_lock(&kvm->irq_lock);
-       hlist_add_head_rcu(&kian->link, &kvm->irq_ack_notifier_list);
-       mutex_unlock(&kvm->irq_lock);
-#ifdef __KVM_HAVE_IOAPIC
-       kvm_vcpu_request_scan_ioapic(kvm);
-#endif
-}
+       struct kvm_irq_routing_table *irq_rt;
 
-void kvm_unregister_irq_ack_notifier(struct kvm *kvm,
-                                   struct kvm_irq_ack_notifier *kian)
-{
-       mutex_lock(&kvm->irq_lock);
-       hlist_del_init_rcu(&kian->link);
-       mutex_unlock(&kvm->irq_lock);
-       synchronize_srcu(&kvm->irq_srcu);
-#ifdef __KVM_HAVE_IOAPIC
-       kvm_vcpu_request_scan_ioapic(kvm);
-#endif
+       irq_rt = srcu_dereference(kvm->irq_routing, &kvm->irq_srcu);
+       return irq_rt->chip[irqchip][pin];
 }
 
 int kvm_send_userspace_msi(struct kvm *kvm, struct kvm_msi *msi)
@@ -115,9 +92,8 @@ int kvm_send_userspace_msi(struct kvm *kvm, struct kvm_msi *msi)
 int kvm_set_irq(struct kvm *kvm, int irq_source_id, u32 irq, int level,
                bool line_status)
 {
-       struct kvm_kernel_irq_routing_entry *e, irq_set[KVM_NR_IRQCHIPS];
-       int ret = -1, i = 0, idx;
-       struct kvm_irq_routing_table *irq_rt;
+       struct kvm_kernel_irq_routing_entry irq_set[KVM_NR_IRQCHIPS];
+       int ret = -1, i, idx;
 
        trace_kvm_set_irq(irq, level, irq_source_id);
 
@@ -126,10 +102,7 @@ int kvm_set_irq(struct kvm *kvm, int irq_source_id, u32 irq, int level,
         * writes to the unused one.
         */
        idx = srcu_read_lock(&kvm->irq_srcu);
-       irq_rt = srcu_dereference(kvm->irq_routing, &kvm->irq_srcu);
-       if (irq < irq_rt->nr_rt_entries)
-               hlist_for_each_entry(e, &irq_rt->map[irq], link)
-                       irq_set[i++] = *e;
+       i = kvm_irq_map_gsi(kvm, irq_set, irq);
        srcu_read_unlock(&kvm->irq_srcu, idx);
 
        while(i--) {
@@ -171,9 +144,11 @@ static int setup_routing_entry(struct kvm_irq_routing_table *rt,
 
        e->gsi = ue->gsi;
        e->type = ue->type;
-       r = kvm_set_routing_entry(rt, e, ue);
+       r = kvm_set_routing_entry(e, ue);
        if (r)
                goto out;
+       if (e->type == KVM_IRQ_ROUTING_IRQCHIP)
+               rt->chip[e->irqchip.irqchip][e->irqchip.pin] = e->gsi;
 
        hlist_add_head(&e->link, &rt->map[e->gsi]);
        r = 0;
@@ -224,7 +199,8 @@ int kvm_set_irq_routing(struct kvm *kvm,
 
        mutex_lock(&kvm->irq_lock);
        old = kvm->irq_routing;
-       kvm_irq_routing_update(kvm, new);
+       rcu_assign_pointer(kvm->irq_routing, new);
+       kvm_irq_routing_update(kvm);
        mutex_unlock(&kvm->irq_lock);
 
        synchronize_srcu_expedited(&kvm->irq_srcu);
index 4b6c01b477f9cf86df4a69504de6940c5f6bebbf..33712fb26eb11caa0f14bbf3b21a9e459c18252a 100644 (file)
@@ -465,6 +465,8 @@ static struct kvm *kvm_create_vm(unsigned long type)
 
 #ifdef CONFIG_HAVE_KVM_IRQCHIP
        INIT_HLIST_HEAD(&kvm->mask_notifier_list);
+#endif
+#ifdef CONFIG_HAVE_KVM_IRQFD
        INIT_HLIST_HEAD(&kvm->irq_ack_notifier_list);
 #endif
 
@@ -2324,6 +2326,34 @@ static int kvm_ioctl_create_device(struct kvm *kvm,
        return 0;
 }
 
+static long kvm_vm_ioctl_check_extension_generic(struct kvm *kvm, long arg)
+{
+       switch (arg) {
+       case KVM_CAP_USER_MEMORY:
+       case KVM_CAP_DESTROY_MEMORY_REGION_WORKS:
+       case KVM_CAP_JOIN_MEMORY_REGIONS_WORKS:
+#ifdef CONFIG_KVM_APIC_ARCHITECTURE
+       case KVM_CAP_SET_BOOT_CPU_ID:
+#endif
+       case KVM_CAP_INTERNAL_ERROR_DATA:
+#ifdef CONFIG_HAVE_KVM_MSI
+       case KVM_CAP_SIGNAL_MSI:
+#endif
+#ifdef CONFIG_HAVE_KVM_IRQFD
+       case KVM_CAP_IRQFD_RESAMPLE:
+#endif
+       case KVM_CAP_CHECK_EXTENSION_VM:
+               return 1;
+#ifdef CONFIG_HAVE_KVM_IRQ_ROUTING
+       case KVM_CAP_IRQ_ROUTING:
+               return KVM_MAX_IRQ_ROUTES;
+#endif
+       default:
+               break;
+       }
+       return kvm_vm_ioctl_check_extension(kvm, arg);
+}
+
 static long kvm_vm_ioctl(struct file *filp,
                           unsigned int ioctl, unsigned long arg)
 {
@@ -2487,6 +2517,9 @@ static long kvm_vm_ioctl(struct file *filp,
                r = 0;
                break;
        }
+       case KVM_CHECK_EXTENSION:
+               r = kvm_vm_ioctl_check_extension_generic(kvm, arg);
+               break;
        default:
                r = kvm_arch_vm_ioctl(filp, ioctl, arg);
                if (r == -ENOTTY)
@@ -2571,33 +2604,6 @@ static int kvm_dev_ioctl_create_vm(unsigned long type)
        return r;
 }
 
-static long kvm_dev_ioctl_check_extension_generic(long arg)
-{
-       switch (arg) {
-       case KVM_CAP_USER_MEMORY:
-       case KVM_CAP_DESTROY_MEMORY_REGION_WORKS:
-       case KVM_CAP_JOIN_MEMORY_REGIONS_WORKS:
-#ifdef CONFIG_KVM_APIC_ARCHITECTURE
-       case KVM_CAP_SET_BOOT_CPU_ID:
-#endif
-       case KVM_CAP_INTERNAL_ERROR_DATA:
-#ifdef CONFIG_HAVE_KVM_MSI
-       case KVM_CAP_SIGNAL_MSI:
-#endif
-#ifdef CONFIG_HAVE_KVM_IRQ_ROUTING
-       case KVM_CAP_IRQFD_RESAMPLE:
-#endif
-               return 1;
-#ifdef CONFIG_HAVE_KVM_IRQ_ROUTING
-       case KVM_CAP_IRQ_ROUTING:
-               return KVM_MAX_IRQ_ROUTES;
-#endif
-       default:
-               break;
-       }
-       return kvm_dev_ioctl_check_extension(arg);
-}
-
 static long kvm_dev_ioctl(struct file *filp,
                          unsigned int ioctl, unsigned long arg)
 {
@@ -2614,7 +2620,7 @@ static long kvm_dev_ioctl(struct file *filp,
                r = kvm_dev_ioctl_create_vm(arg);
                break;
        case KVM_CHECK_EXTENSION:
-               r = kvm_dev_ioctl_check_extension_generic(arg);
+               r = kvm_vm_ioctl_check_extension_generic(NULL, arg);
                break;
        case KVM_GET_VCPU_MMAP_SIZE:
                r = -EINVAL;